0

链接后一些库函数如下所示。

0x0804842e <+35>:   call   0x80482e0 <printf@plt>


所以,我了解了@plt反汇编的用法。

然而,昨天,我有些奇怪的代码切片。
以下是 的一部分libstdbuf.s,包含在Coreutils

.L31:
    .loc 1 142 0
    testl   %edi, %edi
    je  .L32
    .loc 1 143 0
    movl    stdin@GOT(%ebx), %eax   # <========= here
    movl    %edi, %edx

如您所见,代码访问stdin@GOT.

嗯...我以前从未见过blabla@GOT语法..



问题:

  1. 线路具体是做什么stdin@GOT(%ebx), %eax的?

  2. 这是链接器生成的代码吗?如果,为什么是在GOT,而不是PLT

  3. 还有..我怎么知道stdin@GOT地址信息?
    (与一般的全局符号不同,地址未显示在符号表上。见下文)

.

jiwon@jiwon$ objdump -t -T ./libstdbuf.so | grep stdin
  00000000       O *UND*    00000000              stdin@@GLIBC_2.0
  00000000      DO *UND*    00000000  GLIBC_2.0   stdin
4

0 回答 0