diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 7ae8a5e39fdc..4b8dc0410040 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -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.", diff --git a/lld/test/ELF/emit-relocs-merge.s b/lld/test/ELF/emit-relocs-merge.s new file mode 100644 index 000000000000..3fecca23b735 --- /dev/null +++ b/lld/test/ELF/emit-relocs-merge.s @@ -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