[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