为什么有些链接器生成的汇编代码位于GOT而不是PLT?

时间:2018-09-25 06:39:15

标签: assembly x86 linker shared-libraries got

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

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

0 个答案:

没有答案