LLD uses .bss.rel.ro for read-only copy relocations whereas the ld.bfd and gold linkers use .data.rel.ro. In some linker scripts including ld.bfd's internal linker script, the relro sections are placed sequentially assuming .data.rel.ro is used. LLD's use of .bss.rel.ro means that the copy relocations get matched into the .bss section causing the relro sections to be non-contiguous. This change checks for a .data.rel.ro OutputSection when a linker script with the SECTIONS command is used. The section will match in the .data.rel.ro output section and will maintain contiguous relro. Differential Revision: https://reviews.llvm.org/D40365 Fixes PR35265 llvm-svn: 318940
30 lines
1.2 KiB
ArmAsm
30 lines
1.2 KiB
ArmAsm
// 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: <internal>:(.bss.rel.ro)
|
|
.section .text, "ax", @progbits
|
|
.global _start
|
|
.global bar
|
|
.global foo
|
|
_start:
|
|
.quad bar
|
|
.quad foo
|