テスト目的のために、llvmリンカによって生成されたPLTスタブlldを修正しました。関数の開始アドレスと終了アドレスが正しくないobjdump
前スタブされました:この(オリジナル)のスタブとobjdump
でそれを検査してプログラムをリンクする
0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmpq *got(%rip)
0x68, 0x00, 0x00, 0x00, 0x00, // pushq <relocation index>
0xe9, 0x00, 0x00, 0x00, 0x00 // jmpq plt[0]
はこのようなものが得られます。
00000000002012d0 <[email protected]>:
2012d0: ff 25 62 0d 00 00 jmpq *0xd62(%rip) # 202038 <__TMC_END__+0x28>
2012d6: 68 02 00 00 00 pushq $0x2
2012db: e9 c0 ff ff ff jmpq 2012a0 <_fini+0x10>
私は単純に追加することにより、PLTスタブを修正しました最後のNOP:
0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmpq *got(%rip)
0x68, 0x00, 0x00, 0x00, 0x00, // pushq <relocation index>
0xe9, 0x00, 0x00, 0x00, 0x00, // jmpq plt[0]
0x0f, 0x1f, 0x40, 0x00 // nop
私は、 e PltEntrySize
が変更され、サイズの変化が反映されます。この変更でプログラムをリンクして実行するとうまくいくようです。
私はobjdump
にリンクされたプログラムの逆アセンブルを検査しようとすると、しかし、私は奇妙な何かを参照してくださいPLTスタブのアドレスが0x2012d0
であることをobjdump
によって解釈される
00000000002012d0 <[email protected]>:
2012d0: cc int3
2012d1: ff (bad)
2012d2: ff (bad)
2012d3: ff 0f decl (%rdi)
2012d5: 1f (bad)
2012d6: 40 00 ff add %dil,%dil
2012d9: 25 5a 0d 00 00 and $0xd5a,%eax
2012de: 68 02 00 00 00 pushq $0x2
2012e3: e9 b8 ff ff ff jmpq 2012a0 <_fini+0x10>
2012e8: 0f 1f 40 00 nopl 0x0(%rax)
を、本当の[email protected]
アドレスは0x2012d8
です!
Symbol table '.dynsym' contains 7 entries:
Num: Value Size Type Bind Vis Ndx Name
...
6: 00000000002012d8 0 FUNC GLOBAL DEFAULT UND [email protected]_2.2.5 (2)
objdump
からその情報を取得ん:これは、readelf -s
によって確認されましたか?私はリンカの中で何かを修正するのを忘れていた可能性が非常に高いです。
ありがとうございます、それは迷惑です。しかし、私はダイナミックリンカのソースを見て、それはGOTだけに触れるので、PLTの変更によって影響を受けるべきではありません。私はもっとテストします、それが壊れたら、私は戦略を変えます。 Objdumpは明らかにPLTスタブの固定サイズを想定しているため、誤った情報が表示されます。 – Banex