[PATCH] D115697: [ELF] -Map: Print symbols which needs canonical PLT entry/copy relocation just once

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 14 10:31:12 PST 2021


This revision was automatically updated to reflect the committed changes.
Closed by commit rG6a44013b0e31: [ELF] -Map: Print symbols which needs canonical PLT entry/copy relocation just… (authored by MaskRay).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D115697/new/

https://reviews.llvm.org/D115697

Files:
  lld/ELF/MapFile.cpp
  lld/test/ELF/map-file-copy.s


Index: lld/test/ELF/map-file-copy.s
===================================================================
--- /dev/null
+++ lld/test/ELF/map-file-copy.s
@@ -0,0 +1,52 @@
+# REQUIRES: x86
+
+# RUN: split-file %s %t
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/1.s -o %t/1.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/2.s -o %t/2.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/3.s -o %t/3.o
+# RUN: ld.lld -shared -soname=3 --version-script=%t/3.ver %t/3.o -o %t/3.so
+# RUN: ld.lld -Map=%t/1.map %t/1.o %t/2.o %t/3.so -o %t/1
+# RUN: FileCheck %s --input-file=%t/1.map
+
+## Both TUs reference func/copy which need a canonical PLT entry/copy relocation.
+## Test we print func/copy just once.
+# CHECK:      {{ }}.plt
+# CHECK-NEXT:         <internal>:(.plt)
+# CHECK-NEXT:                 func at v1{{$}}
+# CHECK-NEXT: .dynamic
+
+# CHECK:      .bss.rel.ro
+# CHECK-NEXT:         <internal>:(.bss.rel.ro)
+## Ideally this is displayed as copy at v2.
+# CHECK-NEXT:                 copy{{$}}
+# CHECK-NEXT: .got.plt
+
+#--- 1.s
+.global _start
+_start:
+.symver func, func@@@v1
+  mov $copy, %eax
+  mov $func - ., %eax
+
+#--- 2.s
+.symver func, func@@@v1
+  mov $copy, %eax
+  mov $func - ., %eax
+
+#--- 3.s
+.globl func
+.symver func, func at v1, remove
+.type func, @function
+func:
+  ret
+
+.section .rodata,"a"
+.globl copy
+.type copy, @object
+copy:
+.byte 1
+.size copy, 1
+
+#--- 3.ver
+v1 { func; };
+v2 { copy; };
Index: lld/ELF/MapFile.cpp
===================================================================
--- lld/ELF/MapFile.cpp
+++ lld/ELF/MapFile.cpp
@@ -72,10 +72,17 @@
   // Sort symbols by address. We want to print out symbols in the
   // order in the output file rather than the order they appeared
   // in the input files.
-  for (auto &it : ret)
+  SmallPtrSet<Defined *, 4> set;
+  for (auto &it : ret) {
+    // Deduplicate symbols which need a canonical PLT entry/copy relocation.
+    set.clear();
+    llvm::erase_if(it.second,
+                   [&](Defined *sym) { return !set.insert(sym).second; });
+
     llvm::stable_sort(it.second, [](Defined *a, Defined *b) {
       return a->getVA() < b->getVA();
     });
+  }
   return ret;
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D115697.394309.patch
Type: text/x-patch
Size: 2176 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211214/3371fabf/attachment.bin>


More information about the llvm-commits mailing list