[PATCH] D149817: [llvm-objdump][X86] Add @plt symbols for .plt.got
Fangrui Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed May 3 22:40:50 PDT 2023
MaskRay created this revision.
MaskRay added reviewers: bd1976llvm, jhenderson.
Herald added subscribers: pengfei, hiraditya.
Herald added a project: All.
MaskRay requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
If a symbol needs both JUMP_SLOT and GLOB_DAT relocations, there is a
minor linker optimization to keep just GLOB_DAT. This optimization
is only implemented by GNU ld's x86 port and mold.
https://maskray.me/blog/2021-08-29-all-about-global-offset-table#combining-.got-and-.got.plt
With the optimizing, the PLT entry is placed in .plt.got and the
associated GOTPLT entry is placed in .got (ld.bfd -z now) or .got.plt (ld.bfd -z lazy).
The relocation is in .rel[a].dyn.
This patch synthesizes `symbol at plt` labels for these .plt.got entries.
For x86-32, with -z now, in the absence of a PLT entry, there will be no
.got.plt entry, and our code cannot synthesize @plt labels. This is
an extreme corner case that can never happen in practice.
To fix it, we can get the `_GLOBAL_OFFSET_TABLE_` symbol value,
but the complexity is not worth it.
Example:
cat > a.s <<e
.globl _start; _start:
mov combined0 at gotpcrel(%rip), %rax; mov combined1 at gotpcrel(%rip), %rax
call combined0 at plt; call combined1 at plt
call foo0 at plt; call foo1 at plt
e
cat > b.s <<e
.globl foo0, foo1, combined0, combined1
foo0: foo1: combined0: combined1:
e
gcc -fuse-ld=bfd -shared b.s -o b.so
gcc -fuse-ld=bfd -pie -nostdlib a.s b.so -o a
Disassembly of section .plt:
0000000000001000 <.plt>:
1000: ff 35 ea 1f 00 00 pushq 0x1fea(%rip) # 0x2ff0 <_GLOBAL_OFFSET_TABLE_+0x8>
1006: ff 25 ec 1f 00 00 jmpq *0x1fec(%rip) # 0x2ff8 <_GLOBAL_OFFSET_TABLE_+0x10>
100c: 0f 1f 40 00 nopl (%rax)
0000000000001010 <foo1 at plt>:
1010: ff 25 ea 1f 00 00 jmpq *0x1fea(%rip) # 0x3000 <_GLOBAL_OFFSET_TABLE_+0x18>
1016: 68 00 00 00 00 pushq $0x0
101b: e9 e0 ff ff ff jmp 0x1000 <.plt>
0000000000001020 <foo0 at plt>:
1020: ff 25 e2 1f 00 00 jmpq *0x1fe2(%rip) # 0x3008 <_GLOBAL_OFFSET_TABLE_+0x20>
1026: 68 01 00 00 00 pushq $0x1
102b: e9 d0 ff ff ff jmp 0x1000 <.plt>
Disassembly of section .plt.got:
0000000000001030 <combined0 at plt>:
1030: ff 25 a2 1f 00 00 jmpq *0x1fa2(%rip) # 0x2fd8 <foo1+0x2fd8>
1036: 66 90 nop
0000000000001038 <combined1 at plt>:
1038: ff 25 a2 1f 00 00 jmpq *0x1fa2(%rip) # 0x2fe0 <foo1+0x2fe0>
103e: 66 90 nop
Close https://github.com/llvm/llvm-project/issues/62537
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D149817
Files:
llvm/include/llvm/Object/ELFObjectFile.h
llvm/lib/Object/ELFObjectFile.cpp
llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp
llvm/test/tools/llvm-objdump/X86/plt-got.test
llvm/tools/llvm-cfi-verify/lib/FileAnalysis.cpp
llvm/tools/llvm-objdump/llvm-objdump.cpp
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D149817.519360.patch
Type: text/x-patch
Size: 17704 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230504/af722380/attachment.bin>
More information about the llvm-commits
mailing list