Почему какой-то сборочный код, созданный компоновщиком, находится на GOT, а не на PLT?
Некоторая библиотечная функция показана ниже, как показано ниже.
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