[ELF] - Show .plt symbols in -Map output.
authorGeorge Rimar <grimar@accesssoftek.com>
Wed, 6 Dec 2017 08:36:21 +0000 (08:36 +0000)
committerGeorge Rimar <grimar@accesssoftek.com>
Wed, 6 Dec 2017 08:36:21 +0000 (08:36 +0000)
As mentioned in PR35471, shared functions for which
.plt entry address is used shows up in bfd's map files.
Patch teaches LLD to do the same.

Differential revision: https://reviews.llvm.org/D40839

llvm-svn: 319879

lld/ELF/MapFile.cpp
lld/test/ELF/Inputs/map-file5.s
lld/test/ELF/map-file.s

index c89d2375939c254c4378e4e594376a3903d22c06..8bf672be6fcfb84bcc68b74537f05cdabfa10bd6 100644 (file)
@@ -52,7 +52,7 @@ static std::vector<Symbol *> getSymbols() {
   for (InputFile *File : ObjectFiles) {
     for (Symbol *B : File->getSymbols()) {
       if (auto *SS = dyn_cast<SharedSymbol>(B))
-        if (SS->CopyRelSec)
+        if (SS->CopyRelSec || SS->NeedsPltAddr)
           V.push_back(SS);
       if (auto *DR = dyn_cast<Defined>(B))
         if (DR->File == File && !DR->isSection() && DR->Section &&
@@ -67,10 +67,16 @@ static std::vector<Symbol *> getSymbols() {
 static SymbolMapTy getSectionSyms(ArrayRef<Symbol *> Syms) {
   SymbolMapTy Ret;
   for (Symbol *S : Syms) {
-    if (auto *DR = dyn_cast<Defined>(S))
+    if (auto *DR = dyn_cast<Defined>(S)) {
       Ret[DR->Section].push_back(S);
+      continue;
+    }
+
+    SharedSymbol *SS = cast<SharedSymbol>(S);
+    if (SS->CopyRelSec)
+      Ret[SS->CopyRelSec].push_back(S);
     else
-      Ret[cast<SharedSymbol>(S)->CopyRelSec].push_back(S);
+      Ret[InX::Plt].push_back(S);
   }
 
   // Sort symbols by address. We want to print out symbols in the
index 95bfd6d4210903af333fd4aac9f890998096f78f..2a89b4c7f6f5ab6e9f0b27d81cb679eef3e1964d 100644 (file)
@@ -10,3 +10,14 @@ sharedFoo:
 sharedBar:
 .quad 0
 .size sharedBar, 8
+
+.text
+.globl sharedFunc1
+.type sharedFunc1,@function
+sharedFunc1:
+ nop
+
+.globl sharedFunc2
+.type sharedFunc2,@function
+sharedFunc2:
+ nop
index 2862a09578a51a50c4f8f33e617a12ae33bb36f5..d1acabe28126581002e4cb04631e99fa48270dc8 100644 (file)
@@ -17,6 +17,8 @@
 _start:
  .quad sharedFoo
  .quad sharedBar
+ callq sharedFunc1
+ callq sharedFunc2
         call baz
 .global _Z1fi
 _Z1fi:
@@ -34,49 +36,57 @@ abs = 0xAB5
 labs = 0x1AB5
 
 // CHECK:      Address          Size             Align Out     In      Symbol
-// CHECK-NEXT: 00000000002001c8 0000000000000048     8 .dynsym
-// CHECK-NEXT: 00000000002001c8 0000000000000048     8         <internal>:(.dynsym)
-// CHECK-NEXT: 0000000000200210 0000000000000024     8 .gnu.hash
-// CHECK-NEXT: 0000000000200210 0000000000000024     8         <internal>:(.gnu.hash)
-// CHECK-NEXT: 0000000000200234 0000000000000020     4 .hash
-// CHECK-NEXT: 0000000000200234 0000000000000020     4         <internal>:(.hash)
-// CHECK-NEXT: 0000000000200254 0000000000000019     1 .dynstr
-// CHECK-NEXT: 0000000000200254 0000000000000019     1         <internal>:(.dynstr)
-// CHECK-NEXT: 0000000000200270 0000000000000030     8 .rela.dyn
-// CHECK-NEXT: 0000000000200270 0000000000000030     8         <internal>:(.rela.dyn)
-// CHECK-NEXT: 00000000002002a0 0000000000000030     8 .eh_frame
-// CHECK-NEXT: 00000000002002a0 0000000000000030     8         <internal>:(.eh_frame)
-// CHECK-NEXT: 0000000000201000 0000000000000025     4 .text
-// CHECK-NEXT: 0000000000201000 000000000000001e     4         {{.*}}{{/|\\}}map-file.s.tmp1.o:(.text)
+// CHECK-NEXT: 00000000002001c8 0000000000000078     8 .dynsym
+// CHECK-NEXT: 00000000002001c8 0000000000000078     8         <internal>:(.dynsym)
+// CHECK-NEXT: 0000000000200240 000000000000002c     8 .gnu.hash
+// CHECK-NEXT: 0000000000200240 000000000000002c     8         <internal>:(.gnu.hash)
+// CHECK-NEXT: 000000000020026c 0000000000000030     4 .hash
+// CHECK-NEXT: 000000000020026c 0000000000000030     4         <internal>:(.hash)
+// CHECK-NEXT: 000000000020029c 0000000000000031     1 .dynstr
+// CHECK-NEXT: 000000000020029c 0000000000000031     1         <internal>:(.dynstr)
+// CHECK-NEXT: 00000000002002d0 0000000000000030     8 .rela.dyn
+// CHECK-NEXT: 00000000002002d0 0000000000000030     8         <internal>:(.rela.dyn)
+// CHECK-NEXT: 0000000000200300 0000000000000030     8 .rela.plt
+// CHECK-NEXT: 0000000000200300 0000000000000030     8         <internal>:(.rela.plt)
+// CHECK-NEXT: 0000000000200330 0000000000000030     8 .eh_frame
+// CHECK-NEXT: 0000000000200330 0000000000000030     8         <internal>:(.eh_frame)
+// CHECK-NEXT: 0000000000201000 000000000000002d     4 .text
+// CHECK-NEXT: 0000000000201000 0000000000000028     4         {{.*}}{{/|\\}}map-file.s.tmp1.o:(.text)
 // CHECK-NEXT: 0000000000201000 0000000000000000     0                 _start
-// CHECK-NEXT: 0000000000201015 0000000000000000     0                 f(int)
-// CHECK-NEXT: 000000000020101e 0000000000000000     0                 local
-// CHECK-NEXT: 0000000000201020 0000000000000002     4         {{.*}}{{/|\\}}map-file.s.tmp2.o:(.text)
-// CHECK-NEXT: 0000000000201020 0000000000000000     0                 foo
-// CHECK-NEXT: 0000000000201021 0000000000000000     0                 bar
-// CHECK-NEXT: 0000000000201022 0000000000000000     1         {{.*}}{{/|\\}}map-file.s.tmp2.o:(.text.zed)
-// CHECK-NEXT: 0000000000201022 0000000000000000     0                 zed
-// CHECK-NEXT: 0000000000201024 0000000000000000     4         {{.*}}{{/|\\}}map-file.s.tmp3.o:(.text)
-// CHECK-NEXT: 0000000000201024 0000000000000000     0                 bah
-// CHECK-NEXT: 0000000000201024 0000000000000001     4         {{.*}}{{/|\\}}map-file.s.tmp4.a(map-file.s.tmp4.o):(.text)
-// CHECK-NEXT: 0000000000201024 0000000000000000     0                 baz
-// CHECK-NEXT: 0000000000202000 00000000000000c0     8 .dynamic
-// CHECK-NEXT: 0000000000202000 00000000000000c0     8         <internal>:(.dynamic)
-// CHECK-NEXT: 0000000000203000 0000000000000010    16 .bss
-// CHECK-NEXT: 0000000000203000 0000000000000004    16         {{.*}}{{/|\\}}map-file.s.tmp1.o:(COMMON)
-// CHECK-NEXT: 0000000000203000 0000000000000004     0                 common
-// CHECK-NEXT: 0000000000203004 0000000000000004     1         <internal>:(.bss)
-// CHECK-NEXT: 0000000000203004 0000000000000004     0                 sharedFoo
-// CHECK-NEXT: 0000000000203008 0000000000000008     1         <internal>:(.bss)
-// CHECK-NEXT: 0000000000203008 0000000000000008     0                 sharedBar
+// CHECK-NEXT: 000000000020101f 0000000000000000     0                 f(int)
+// CHECK-NEXT: 0000000000201028 0000000000000000     0                 local
+// CHECK-NEXT: 0000000000201028 0000000000000002     4         {{.*}}{{/|\\}}map-file.s.tmp2.o:(.text)
+// CHECK-NEXT: 0000000000201028 0000000000000000     0                 foo
+// CHECK-NEXT: 0000000000201029 0000000000000000     0                 bar
+// CHECK-NEXT: 000000000020102a 0000000000000000     1         {{.*}}{{/|\\}}map-file.s.tmp2.o:(.text.zed)
+// CHECK-NEXT: 000000000020102a 0000000000000000     0                 zed
+// CHECK-NEXT: 000000000020102c 0000000000000000     4         {{.*}}{{/|\\}}map-file.s.tmp3.o:(.text)
+// CHECK-NEXT: 000000000020102c 0000000000000000     0                 bah
+// CHECK-NEXT: 000000000020102c 0000000000000001     4         {{.*}}{{/|\\}}map-file.s.tmp4.a(map-file.s.tmp4.o):(.text)
+// CHECK-NEXT: 000000000020102c 0000000000000000     0                 baz
+// CHECK-NEXT: 0000000000201030 0000000000000030    16 .plt
+// CHECK-NEXT: 0000000000201030 0000000000000030    16         <internal>:(.plt)
+// CHECK-NEXT: 0000000000201040 0000000000000000     0                 sharedFunc1
+// CHECK-NEXT: 0000000000201050 0000000000000000     0                 sharedFunc2
+// CHECK-NEXT: 0000000000202000 0000000000000028     8 .got.plt
+// CHECK-NEXT: 0000000000202000 0000000000000028     8         <internal>:(.got.plt)
+// CHECK-NEXT: 0000000000203000 0000000000000100     8 .dynamic
+// CHECK-NEXT: 0000000000203000 0000000000000100     8         <internal>:(.dynamic)
+// CHECK-NEXT: 0000000000204000 0000000000000010    16 .bss
+// CHECK-NEXT: 0000000000204000 0000000000000004    16         {{.*}}{{/|\\}}map-file.s.tmp1.o:(COMMON)
+// CHECK-NEXT: 0000000000204000 0000000000000004     0                 common
+// CHECK-NEXT: 0000000000204004 0000000000000004     1         <internal>:(.bss)
+// CHECK-NEXT: 0000000000204004 0000000000000004     0                 sharedFoo
+// CHECK-NEXT: 0000000000204008 0000000000000008     1         <internal>:(.bss)
+// CHECK-NEXT: 0000000000204008 0000000000000008     0                 sharedBar
 // CHECK-NEXT: 0000000000000000 0000000000000008     1 .comment
 // CHECK-NEXT: 0000000000000000 0000000000000008     1         <internal>:(.comment)
-// CHECK-NEXT: 0000000000000000 0000000000000168     8 .symtab
-// CHECK-NEXT: 0000000000000000 0000000000000168     8         <internal>:(.symtab)
-// CHECK-NEXT: 0000000000000000 000000000000006c     1 .shstrtab
-// CHECK-NEXT: 0000000000000000 000000000000006c     1         <internal>:(.shstrtab)
-// CHECK-NEXT: 0000000000000000 0000000000000055     1 .strtab
-// CHECK-NEXT: 0000000000000000 0000000000000055     1         <internal>:(.strtab)
+// CHECK-NEXT: 0000000000000000 0000000000000198     8 .symtab
+// CHECK-NEXT: 0000000000000000 0000000000000198     8         <internal>:(.symtab)
+// CHECK-NEXT: 0000000000000000 0000000000000084     1 .shstrtab
+// CHECK-NEXT: 0000000000000000 0000000000000084     1         <internal>:(.shstrtab)
+// CHECK-NEXT: 0000000000000000 000000000000006d     1 .strtab
+// CHECK-NEXT: 0000000000000000 000000000000006d     1         <internal>:(.strtab)
 
 // RUN: not ld.lld %t1.o %t2.o %t3.o %t4.a -o %t -Map=/ 2>&1 \
 // RUN:  | FileCheck -check-prefix=FAIL %s