Учитывая динамически связанный двоичный файл ELF, скажем, например, /bin/less
.Linux ELF-файл: как получить общий объект, принадлежащий импортированной функции
Внутри двоичном, есть вызов функции, представленной в общей библиотеке, например strcpy()
Как я могу узнать, из которых разделяемой библиотеки/разделяемый объект получается функция strcp
? Другими словами, я хочу получить пары func_name/shared_obj_name.so.
Ответ this post, Майкл Слэйд пишет:
ELF-файлы не указать, какие символы приходят из которых библиотек; он просто добавляет список разделяемых библиотек для связывания в двоичный файл ELF, и позволяет компоновщику находить символы в библиотеках.
Однако должен быть способ собрать необходимую информацию (используя компоновщик). Выполнение двоичного и ltrace-ing это не вариант в моем случае. То, что я пытался до сих пор:
Я попытался objdump -T /bin/less | grep strcpy
, который дает мне:
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 strcpy
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.3.4 __strcpy_chk
Это не является ни unambigious и не дает мне имя .so
файла.
Запуск ldd /bin/less
, возвращаясь:
linux-vdso.so.1 => (0x00007ffe8b7fa000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f92c23a5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f92c1fe0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f92c25ec000))
позволяет мне думать, что "GLIBC_2.2.5" соответствует libc.so.6
Как программно найти соответствующий общий объект (.so файл) до (импорт) функция?