Почему какой-то сборочный код, созданный компоновщиком, находится на GOT, а не на PLT? - PullRequest
0 голосов
/ 25 сентября 2018

Некоторая библиотечная функция показана ниже, как ссылка.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...