forked from OSchip/llvm-project
Merge reloc sections in -emit-reloc mode.
Without this we would produce two relocation sections pointing to the same section, which gnu tools reject. This fixes pr31986. The implementation of -r/--emit-reloc is getting fairly complicated. But lets get the test passing before trying to refactor it. llvm-svn: 295385
This commit is contained in:
parent
76b5b7493c
commit
ee61d3589f
|
@ -98,6 +98,15 @@ StringRef elf::getOutputSectionName(StringRef Name) {
|
|||
if (Config->Relocatable)
|
||||
return Name;
|
||||
|
||||
if (Config->EmitRelocs) {
|
||||
for (StringRef V : {".rel.", ".rela."}) {
|
||||
if (Name.startswith(V)) {
|
||||
StringRef Inner = getOutputSectionName(Name.substr(V.size() - 1));
|
||||
return Saver.save(Twine(V.drop_back()) + Inner);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (StringRef V :
|
||||
{".text.", ".rodata.", ".data.rel.ro.", ".data.", ".bss.",
|
||||
".init_array.", ".fini_array.", ".ctors.", ".dtors.", ".tbss.",
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
# REQUIRES: x86
|
||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
|
||||
# RUN: ld.lld --emit-relocs %t.o -o %t.so -shared
|
||||
# RUN: llvm-readobj -r %t.so | FileCheck %s
|
||||
|
||||
# CHECK: Relocations [
|
||||
# CHECK-NEXT: Section ({{.*}}) .rela.dyn {
|
||||
# CHECK-NEXT: 0x1000 R_X86_64_64 zed 0x0
|
||||
# CHECK-NEXT: 0x1008 R_X86_64_64 zed 0x0
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Section ({{.*}}) .rela.data {
|
||||
# CHECK-NEXT: 0x1000 R_X86_64_64 zed 0x0
|
||||
# CHECK-NEXT: 0x1008 R_X86_64_64 zed 0x0
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: ]
|
||||
|
||||
.section .data.foo,"aw",%progbits
|
||||
.quad zed
|
||||
.section .data.bar,"aw",%progbits
|
||||
.quad zed
|
Loading…
Reference in New Issue