Skip to content

Commit

Permalink
Align output segments correctly
Browse files Browse the repository at this point in the history
Previously, segments were aligned according to their first section's
alignment requirements. That was not correct, but segments are also
aligned to a page boundary, and a page boundary is usually much larger
than a section alignment requirement, so no one noticed this bug before.

Now, lld has --nmagic option which sets maxPageSize to 1 to effectively
disable page alignment, which reveals the issue.

Fixes https://bugs.llvm.org/show_bug.cgi?id=43212

Differential Revision: https://reviews.llvm.org/D67152

llvm-svn: 371013
  • Loading branch information
rui314 committed Sep 5, 2019
1 parent 281f2e2 commit e99dc4b
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 1 deletion.
3 changes: 2 additions & 1 deletion lld/ELF/Writer.cpp
Expand Up @@ -2272,7 +2272,8 @@ static uint64_t computeFileOffset(OutputSection *os, uint64_t off) {
// The first section in a PT_LOAD has to have congruent offset and address
// module the page size.
if (os->ptLoad && os->ptLoad->firstSec == os) {
uint64_t alignment = std::max<uint64_t>(os->alignment, config->maxPageSize);
uint64_t alignment =
std::max<uint64_t>(os->ptLoad->p_align, config->maxPageSize);
return alignTo(off, alignment, os->addr);
}

Expand Down
23 changes: 23 additions & 0 deletions lld/test/ELF/nmagic.s
@@ -0,0 +1,23 @@
# REQUIRES: x86
# Verify that .rodata is aligned to a 8 byte boundary.

# RUN: llvm-mc -filetype=obj -triple=i386 %s -o %t.o
# RUN: ld.lld %t.o -o %t.exe -n -Ttext 0
# RUN: llvm-readelf --section-headers %t.exe | FileCheck %s

# CHECK: [ 0] NULL 00000000 000000 000000 00 0 0 0
# CHECK: [ 1] .text PROGBITS 00000000 0000d4 000001 00 AX 0 0 4
# CHECK: [ 2] .rodata PROGBITS 00000008 0000d8 000008 00 A 0 0 8
# CHECK: [ 3] .comment PROGBITS 00000000 0000e0 000008 01 MS 0 0 1
# CHECK: [ 4] .symtab SYMTAB 00000000 0000e8 000020 10 6 1 4
# CHECK: [ 5] .shstrtab STRTAB 00000000 000108 000032 00 0 0 1
# CHECK: [ 6] .strtab STRTAB 00000000 00013a 000008 00 0 0 1

.globl _start
.text
_start:
ret

.rodata
.align 8
.quad 42

0 comments on commit e99dc4b

Please sign in to comment.