diff options
-rw-r--r-- | lld/ELF/Writer.cpp | 28 | ||||
-rw-r--r-- | lld/test/ELF/note-contiguous.s | 6 |
2 files changed, 22 insertions, 12 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index ade8ebaf3c0..309022dbb92 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -668,16 +668,17 @@ static bool isRelroSection(const OutputSection *Sec) { // * It is easy to check if a give branch was taken. // * It is easy two see how similar two ranks are (see getRankProximity). enum RankFlags { - RF_NOT_ADDR_SET = 1 << 16, - RF_NOT_INTERP = 1 << 15, - RF_NOT_ALLOC = 1 << 14, - RF_WRITE = 1 << 13, - RF_EXEC_WRITE = 1 << 12, - RF_EXEC = 1 << 11, - RF_NON_TLS_BSS = 1 << 10, - RF_NON_TLS_BSS_RO = 1 << 9, - RF_NOT_TLS = 1 << 8, - RF_BSS = 1 << 7, + RF_NOT_ADDR_SET = 1 << 18, + RF_NOT_INTERP = 1 << 17, + RF_NOT_ALLOC = 1 << 16, + RF_WRITE = 1 << 15, + RF_EXEC_WRITE = 1 << 13, + RF_EXEC = 1 << 12, + RF_NON_TLS_BSS = 1 << 11, + RF_NON_TLS_BSS_RO = 1 << 10, + RF_NOT_TLS = 1 << 9, + RF_BSS = 1 << 8, + RF_NOTE = 1 << 7, RF_PPC_NOT_TOCBSS = 1 << 6, RF_PPC_OPD = 1 << 5, RF_PPC_TOCL = 1 << 4, @@ -765,6 +766,12 @@ static unsigned getSectionRank(const OutputSection *Sec) { if (IsNoBits) Rank |= RF_BSS; + // We create a NOTE segment for contiguous .note sections, so make + // them contigous if there are more than one .note section with the + // same attributes. + if (Sec->Type == SHT_NOTE) + Rank |= RF_NOTE; + // Some architectures have additional ordering restrictions for sections // within the same PT_LOAD. if (Config->EMachine == EM_PPC64) { @@ -790,6 +797,7 @@ static unsigned getSectionRank(const OutputSection *Sec) { if (Name == ".branch_lt") Rank |= RF_PPC_BRANCH_LT; } + if (Config->EMachine == EM_MIPS) { // All sections with SHF_MIPS_GPREL flag should be grouped together // because data in these sections is addressable with a gp relative address. diff --git a/lld/test/ELF/note-contiguous.s b/lld/test/ELF/note-contiguous.s index 509b4ec848f..7b04e984932 100644 --- a/lld/test/ELF/note-contiguous.s +++ b/lld/test/ELF/note-contiguous.s @@ -8,12 +8,13 @@ // CHECK-NEXT: Offset: // CHECK-NEXT: VirtualAddress: // CHECK-NEXT: PhysicalAddress: -// CHECK-NEXT: FileSize: 8 -// CHECK-NEXT: MemSize: 8 +// CHECK-NEXT: FileSize: 16 +// CHECK-NEXT: MemSize: 16 // CHECK-NEXT: Flags [ // CHECK-NEXT: PF_R // CHECK-NEXT: ] // CHECK-NEXT: Alignment: 1 +// CHECK-NOT: Type: PT_NOTE // RUN: echo "SECTIONS { .note : { *(.note.a) *(.note.b) } }" > %t.script // RUN: ld.lld %t.o --script %t.script -o %t2 @@ -29,6 +30,7 @@ // SCRIPT-NEXT: PF_R // SCRIPT-NEXT: ] // SCRIPT-NEXT: Alignment: 1 +// SCRIPT-NOT: Type: PT_NOTE .section .note.a, "a", @note .quad 0 |