Index: lld/trunk/ELF/Writer.cpp =================================================================== --- lld/trunk/ELF/Writer.cpp +++ lld/trunk/ELF/Writer.cpp @@ -289,7 +289,14 @@ InX::Bss = make(".bss", 0, 1); Add(InX::Bss); - InX::BssRelRo = make(".bss.rel.ro", 0, 1); + + // If there is a SECTIONS command and a .data.rel.ro section name use name + // .data.rel.ro.bss so that we match in the .data.rel.ro output section. + // This makes sure our relro is contiguous. + bool HasDataRelRo = + Script->HasSectionsCommand && findSection(".data.rel.ro"); + InX::BssRelRo = make( + HasDataRelRo ? ".data.rel.ro.bss" : ".bss.rel.ro", 0, 1); Add(InX::BssRelRo); // Add MIPS-specific sections. Index: lld/trunk/test/ELF/relro-script.s =================================================================== --- lld/trunk/test/ELF/relro-script.s +++ lld/trunk/test/ELF/relro-script.s @@ -0,0 +1,29 @@ +// REQUIRES: x86 +// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/shared.s -o %t.o +// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/copy-in-shared.s -o %t2.o +// RUN: ld.lld -shared %t.o %t2.o -o %t.so + +// ld.bfd and gold use .data.rel.ro rather than .bss.rel.ro. When a linker +// script, such as ld.bfd's internal linker script has a .data.rel.ro +// OutputSection we rename .bss.rel.ro to .data.rel.ro.bss in order to match in +// .data.rel.ro. This keeps the relro sections contiguous. + +// Use the same sections and ordering as the ld.bfd internal linker script. +// RUN: echo "SECTIONS { \ +// RUN: .data.rel.ro : { *(.data.rel.ro .data.rel.ro.*) } \ +// RUN: .dynamic : { *(.dynamic) } \ +// RUN: .got : { *(.got) } \ +// RUN: .got.plt : { *(.got.plt) } \ +// RUN: } " > %t.script +// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t3.o +// RUN: ld.lld %t3.o %t.so -o %t --script=%t.script --print-map | FileCheck %s + +// CHECK: .data.rel.ro +// CHECK-NEXT: :(.bss.rel.ro) + .section .text, "ax", @progbits + .global _start + .global bar + .global foo +_start: + .quad bar + .quad foo