[lld] r323625 - Put the header in the first PT_LOAD even if that PT_LOAD has a LMAExpr.
Hans Wennborg via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 30 01:22:40 PST 2018
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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180130/6427701b/attachment.html>
More information about the llvm-commits
mailing list