[RuntimeDyld] Apply padding and alignment bumps to all sections with stubs, and

increase the MachO/x86-64 stub alignment to 8.

Stub alignment should be guaranteed for any section containing RuntimeDyld
stubs/GOT-entries. To do this we should pad and align all sections containing
stubs, not just code sections.

This commit also bumps the MachO/x86-64 stub alignment to 8, so that GOT entries
will be aligned.

llvm-svn: 362139
This commit is contained in:
Lang Hames 2019-05-30 19:59:20 +00:00
parent 9475df5938
commit b37b37b6f7
3 changed files with 9 additions and 9 deletions

View File

@ -799,13 +799,12 @@ RuntimeDyldImpl::emitSection(const ObjectFile &Obj,
pData = data.data();
}
// Code section alignment needs to be at least as high as stub alignment or
// padding calculations may by incorrect when the section is remapped to a
// higher alignment.
if (IsCode) {
// If there are any stubs then the section alignment needs to be at least as
// high as stub alignment or padding calculations may by incorrect when the
// section is remapped.
if (StubBufSize != 0) {
Alignment = std::max(Alignment, getStubAlignment());
if (StubBufSize > 0)
PaddingSize += getStubAlignment() - 1;
PaddingSize += getStubAlignment() - 1;
}
// Some sections, such as debug info, don't need to be loaded for execution.

View File

@ -28,7 +28,7 @@ public:
unsigned getMaxStubSize() const override { return 8; }
unsigned getStubAlignment() override { return 1; }
unsigned getStubAlignment() override { return 8; }
Expected<relocation_iterator>
processRelocationRef(unsigned SectionID, relocation_iterator RelI,

View File

@ -22,8 +22,9 @@ insn2:
movl x(%rip), %eax
# Test PC-rel GOT relocation.
# Verify both the contents of the GOT entry for y, and that the movq instruction
# references the correct GOT entry address:
# Verify the alignment of the GOT entry, the contents of the GOT entry for y,
# and that the movq instruction references the correct GOT entry address:
# rtdyld-check: stub_addr(test_x86-64.o/__text, y)[2:0] = 0
# rtdyld-check: *{8}(stub_addr(test_x86-64.o/__text, y)) = y
# rtdyld-check: decode_operand(insn3, 4) = stub_addr(test_x86-64.o/__text, y) - next_pc(insn3)
insn3: