[PATCH] D40839: [ELF] - Show .plt symbols in -Map output.

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 5 09:31:00 PST 2017


LGTM

Thanks!

George Rimar via Phabricator <reviews at reviews.llvm.org> writes:

> grimar created this revision.
> Herald added a subscriber: emaste.
>
> 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.
>
>
> https://reviews.llvm.org/D40839
>
> Files:
>   ELF/MapFile.cpp
>   test/ELF/Inputs/map-file5.s
>   test/ELF/map-file.s
>
> Index: test/ELF/map-file.s
> ===================================================================
> --- test/ELF/map-file.s
> +++ test/ELF/map-file.s
> @@ -17,6 +17,8 @@
>  _start:
>   .quad sharedFoo
>   .quad sharedBar
> + callq sharedFunc1
> + callq sharedFunc2
>          call baz
>  .global _Z1fi
>  _Z1fi:
> @@ -34,49 +36,57 @@
>  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
> Index: test/ELF/Inputs/map-file5.s
> ===================================================================
> --- test/ELF/Inputs/map-file5.s
> +++ test/ELF/Inputs/map-file5.s
> @@ -10,3 +10,14 @@
>  sharedBar:
>  .quad 0
>  .size sharedBar, 8
> +
> +.text
> +.globl sharedFunc1
> +.type sharedFunc1, at function
> +sharedFunc1:
> + nop
> +
> +.globl sharedFunc2
> +.type sharedFunc2, at function
> +sharedFunc2:
> + nop
> Index: ELF/MapFile.cpp
> ===================================================================
> --- ELF/MapFile.cpp
> +++ ELF/MapFile.cpp
> @@ -52,7 +52,7 @@
>    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 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


More information about the llvm-commits mailing list