[lld] 6a44013 - [ELF] -Map: Print symbols which needs canonical PLT entry/copy relocation just once

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


Author: Fangrui Song
Date: 2021-12-14T10:31:06-08:00
New Revision: 6a44013b0e319979ce6ea9ead2a740564e434f76

URL: https://github.com/llvm/llvm-project/commit/6a44013b0e319979ce6ea9ead2a740564e434f76
DIFF: https://github.com/llvm/llvm-project/commit/6a44013b0e319979ce6ea9ead2a740564e434f76.diff

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

If a copy related symbol (say `copy`) is referenced in two .o
files, this change removes a duplicated line from the -Map output:

```
          202470           202470        1     1 .bss.rel.ro
          202470           202470        1     1         <internal>:(.bss.rel.ro)
          202470           202470        1     1                 copy
removed   202470           202470        1     1                 copy
```

Differential Revision: https://reviews.llvm.org/D115697

Added: 
    lld/test/ELF/map-file-copy.s

Modified: 
    lld/ELF/MapFile.cpp

Removed: 
    


################################################################################
diff  --git a/lld/ELF/MapFile.cpp b/lld/ELF/MapFile.cpp
index cefe8a235b48a..2759835275388 100644
--- a/lld/ELF/MapFile.cpp
+++ b/lld/ELF/MapFile.cpp
@@ -72,10 +72,17 @@ static SymbolMapTy getSectionSyms(ArrayRef<Defined *> syms) {
   // 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;
 }
 

diff  --git a/lld/test/ELF/map-file-copy.s b/lld/test/ELF/map-file-copy.s
new file mode 100644
index 0000000000000..58c0ce9810480
--- /dev/null
+++ b/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; };


        


More information about the llvm-commits mailing list