[lld] r323625 - Put the header in the first PT_LOAD even if that PT_LOAD has a LMAExpr.

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 30 09:19:10 PST 2018


Thanks!

Hans Wennborg <hans at chromium.org> writes:

> Merged to 6.0 along with dependents in r323733 (PR36136).
>
> On Mon, Jan 29, 2018 at 4:44 AM, Rafael Espindola via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: rafael
>> Date: Sun Jan 28 19:44:44 2018
>> New Revision: 323625
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=323625&view=rev
>> Log:
>> Put the header in the first PT_LOAD even if that PT_LOAD has a LMAExpr.
>>
>> This should fix PR36017.
>>
>> The root problem is that we were creating a PT_LOAD just for the
>> header. That was technically valid, but inconvenient: we should not be
>> making the ELF discontinuous.
>>
>> The solution is to allow a section with LMAExpr to be added to a
>> PT_LOAD if that PT_LOAD doesn't already have a LMAExpr.
>>
>> Added:
>>     lld/trunk/test/ELF/linkerscript/merge-header-load.s
>> Modified:
>>     lld/trunk/ELF/Writer.cpp
>>     lld/trunk/ELF/Writer.h
>>
>> Modified: lld/trunk/ELF/Writer.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.
>> cpp?rev=323625&r1=323624&r2=323625&view=diff
>> ============================================================
>> ==================
>> --- lld/trunk/ELF/Writer.cpp (original)
>> +++ lld/trunk/ELF/Writer.cpp Sun Jan 28 19:44:44 2018
>> @@ -822,6 +822,8 @@ void PhdrEntry::add(OutputSection *Sec)
>>    p_align = std::max(p_align, Sec->Alignment);
>>    if (p_type == PT_LOAD)
>>      Sec->PtLoad = this;
>> +  if (Sec->LMAExpr)
>> +    ASectionHasLMA = true;
>>  }
>>
>>  // The beginning and the ending of .rel[a].plt section are marked
>> @@ -1626,8 +1628,9 @@ template <class ELFT> std::vector<PhdrEn
>>      // different flags or is loaded at a discontiguous address using AT
>> linker
>>      // script command.
>>      uint64_t NewFlags = computeFlags(Sec->getPhdrFlags());
>> -    if (Sec->LMAExpr || Sec->MemRegion != Load->FirstSec->MemRegion ||
>> -        Flags != NewFlags) {
>> +    if ((Sec->LMAExpr && Load->ASectionHasLMA) ||
>> +        Sec->MemRegion != Load->FirstSec->MemRegion || Flags != NewFlags)
>> {
>> +
>>        Load = AddHdr(PT_LOAD, NewFlags);
>>        Flags = NewFlags;
>>      }
>>
>> Modified: lld/trunk/ELF/Writer.h
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.
>> h?rev=323625&r1=323624&r2=323625&view=diff
>> ============================================================
>> ==================
>> --- lld/trunk/ELF/Writer.h (original)
>> +++ lld/trunk/ELF/Writer.h Sun Jan 28 19:44:44 2018
>> @@ -44,6 +44,12 @@ struct PhdrEntry {
>>    OutputSection *FirstSec = nullptr;
>>    OutputSection *LastSec = nullptr;
>>    bool HasLMA = false;
>> +
>> +  // True if one of the sections in this program header has a LMA
>> specified via
>> +  // linker script: AT(addr). We never allow 2 or more sections with LMA
>> in the
>> +  // same program header.
>> +  bool ASectionHasLMA = false;
>> +
>>    uint64_t LMAOffset = 0;
>>  };
>>
>>
>> Added: lld/trunk/test/ELF/linkerscript/merge-header-load.s
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/
>> linkerscript/merge-header-load.s?rev=323625&view=auto
>> ============================================================
>> ==================
>> --- lld/trunk/test/ELF/linkerscript/merge-header-load.s (added)
>> +++ lld/trunk/test/ELF/linkerscript/merge-header-load.s Sun Jan 28
>> 19:44:44 2018
>> @@ -0,0 +1,21 @@
>> +# REQUIRES: x86
>> +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
>> +# RUN: echo "SECTIONS {                  \
>> +# RUN:  . = 0xffffffff80000200;          \
>> +# RUN:  .text : AT (0x4200) { *(.text) } \
>> +# RUN: }" > %t.script
>> +# RUN: ld.lld %t.o --script %t.script -o %t
>> +# RUN: llvm-readelf -program-headers %t | FileCheck %s
>> +
>> +# Test that we put the header in the first PT_LOAD. We used to create a
>> PT_LOAD
>> +# just for it and it would have a different virtual to physical address
>> delta.
>> +
>> +# CHECK: Program Headers:
>> +# CHECK:      Type  Offset   VirtAddr           PhysAddr
>> +# CHECK-NEXT: PHDR  0x000040 0xffffffff80000040 0x0000000000004040
>> +# CHECK-NEXT: LOAD  0x000000 0xffffffff80000000 0x0000000000004000
>> +# CHECK-NOT:  LOAD
>> +
>> +.global _start
>> +_start:
>> +nop
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>


More information about the llvm-commits mailing list