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



Вопрос:

  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 ответов

Другие вопросы по тегам