Skip to content

Commit

Permalink
[ELF] - Show .plt symbols in -Map output.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
George Rimar committed Dec 6, 2017
1 parent 3275eb7 commit ba7afd7
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 43 deletions.
12 changes: 9 additions & 3 deletions lld/ELF/MapFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 &&
Expand All @@ -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
Expand Down
11 changes: 11 additions & 0 deletions lld/test/ELF/Inputs/map-file5.s
Original file line number Diff line number Diff line change
Expand Up @@ -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
90 changes: 50 additions & 40 deletions lld/test/ELF/map-file.s
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
_start:
.quad sharedFoo
.quad sharedBar
callq sharedFunc1
callq sharedFunc2
call baz
.global _Z1fi
_Z1fi:
Expand All @@ -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
Expand Down

0 comments on commit ba7afd7

Please sign in to comment.