Найти расположение объявления функции исходного файла из ELF - PullRequest
0 голосов
/ 29 ноября 2018

Учитывая файл ELF, я запускаю readelf -sV bin/my_app | grep \ glob на нем.Это возвращает:

   205: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND glob@GLIBC_2.27 (6)
   326: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND glob@GLIBC_2.17 (2)
   334: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND globfree@GLIBC_2.17 (2)
 21011: 0000000000cd2748     8 OBJECT  LOCAL  DEFAULT   26 global_mask
 21968: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS globals_io.o
 40039: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND glob@@GLIBC_2.27
 46623: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND glob@GLIBC_2.17
 47377: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND globfree@@GLIBC_2.17

Имея информацию в этом выводе, могу ли я найти местоположение в моих исходных файлах, где вызывается этот символ глобуса?Я хотел бы найти место, чтобы понять, почему две разные версии GLIBC связаны для одного и того же символа.

1 Ответ

0 голосов
/ 02 декабря 2018

Имея информацию в этих выходных данных, могу ли я найти местоположение в моих исходных файлах, где вызывается этот символ глобуса?

Нет.

Вы можете сделать:objdump -d bin/my_app, найдите CALL s для двух версий glob и , которые сообщат вам, из каких функций поступают вызовы.

Я бы хотелнайдите место, чтобы понять, почему две разные версии GLIBC связаны для одного и того же символа.

Это не «две разные версии GLIBC», это «два разных glob символа с разными ABI».

Я не думал, что можно ссылаться на разные версии glob в одном и том же двоичном файле ELF, если только вы не создадите какое-нибудь творческое наложение символов с помощью директив asm(".symver ...").Как только вы узнаете, какая функция ссылается на (старый) символ glob@GLIBC_2.17, запустите препроцессор для файла, в котором определена эта функция, и я очень удивлюсь, если в этом файле нет asm(".symversion...").

...