Commit de934bf6 authored by Hans Wennborg's avatar Hans Wennborg
Browse files

Merging r371013:

------------------------------------------------------------------------
r371013 | ruiu | 2019-09-05 07:30:24 +0200 (Thu, 05 Sep 2019) | 13 lines

Align output segments correctly

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: 371197
parent 501ad1d7
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -2233,7 +2233,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);
  }

lld/test/ELF/nmagic.s

0 → 100644
+23 −0
Original line number Diff line number Diff line
# 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