Index: lld/ELF/Writer.cpp =================================================================== --- lld/ELF/Writer.cpp +++ lld/ELF/Writer.cpp @@ -668,16 +668,17 @@ // * 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 @@ 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 @@ 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. Index: lld/test/ELF/note-contiguous.s =================================================================== --- lld/test/ELF/note-contiguous.s +++ lld/test/ELF/note-contiguous.s @@ -1,24 +1,40 @@ // REQUIRES: x86 // RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o -// RUN: echo "SECTIONS { \ -// RUN: .note : { *(.note.a) *(.note.b) } \ -// RUN: }" > %t.script -// RUN: ld.lld %t.o --script %t.script -o %t -// RUN: llvm-readobj -program-headers %t | FileCheck %s + +// RUN: ld.lld %t.o -o %t1 +// RUN: llvm-readobj -program-headers %t1 | FileCheck %s // CHECK: Type: PT_NOTE -// CHECK-NEXT: Offset: 0x1000 -// CHECK-NEXT: VirtualAddress: 0x0 -// CHECK-NEXT: PhysicalAddress: 0x0 +// CHECK-NEXT: Offset: 0x160 +// CHECK-NEXT: VirtualAddress: 0x200160 +// CHECK-NEXT: PhysicalAddress: 0x200160 // CHECK-NEXT: FileSize: 16 // CHECK-NEXT: MemSize: 16 -// CHECK-NEXT: Flags [ +// CHECK-NEXT: Flags [ // CHECK-NEXT: PF_R // CHECK-NEXT: ] // CHECK-NEXT: Alignment: 1 +// RUN: echo "SECTIONS { .note : { *(.note.a) *(.note.b) } }" > %t.script +// RUN: ld.lld %t.o --script %t.script -o %t2 +// RUN: llvm-readobj -program-headers %t2 | FileCheck -check-prefix=SCRIPT %s + +// SCRIPT: Type: PT_NOTE +// SCRIPT-NEXT: Offset: 0x1008 +// SCRIPT-NEXT: VirtualAddress: 0x8 +// SCRIPT-NEXT: PhysicalAddress: 0x8 +// SCRIPT-NEXT: FileSize: 16 +// SCRIPT-NEXT: MemSize: 16 +// SCRIPT-NEXT: Flags [ +// SCRIPT-NEXT: PF_R +// SCRIPT-NEXT: ] +// SCRIPT-NEXT: Alignment: 1 + .section .note.a, "a", @note .quad 0 +.section .foo, "a" +.quad 0 + .section .note.b, "a", @note .quad 0