链接后一些库函数如下所示。
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
语法..
问题:
线路具体是做什么
stdin@GOT(%ebx), %eax
的?这是链接器生成的代码吗?如果是,为什么是在
GOT
,而不是PLT
?- 还有..我怎么知道
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