Библиотеки загружаются с помощью ld.so
(динамический компоновщик или компоновщик времени выполнения aka rtld, ld-linux.so.2
или ld-linux.so.*
в случае Linux; часть glibc).Он объявляется как «интерпретатор» (раздел INTERP; .interp
) всех двоичных файлов ELF с динамической связью.Итак, когда вы запускаете программу, Linux запускает ld.so
(загрузка в память и переход к точке входа), затем ld.so
загружает вашу программу в память, подготавливает ее и затем запускает.Вы также можете запустить динамическую программу с помощью
/lib/ld-linux.so.2 ./your_program your_prog_params
ld.so
, выполняющей фактические open
и mmap
всех необходимых файлов ELF, как файла ELF вашей программы, так и файлов ELF всех необходимых библиотек.Кроме того, он заполняет таблицы GOT и PLT и разрешает перемещения (он записывает адреса функций из библиотек на сайты вызовов, во многих случаях с косвенными вызовами).
Типичный адрес загрузки некоторой библиотеки, которую вы можете получить с помощью ldd
утилита.На самом деле это скрипт bash, который устанавливает переменную среды отладки ld.so (на самом деле LD_TRACE_LOADED_OBJECTS=1
в случае rtld для glibc) и запускает программу.Вы даже можете сделать это самостоятельно без использования скрипта, например, используя bash, легко изменяя переменные окружения для одного запуска:
LD_TRACE_LOADED_OBJECTS=1 /bin/echo
ld.so
увидит эту переменную и разрешит все необходимые библиотеки ивывести загрузочные адреса из них.Но с этим набором переменных ld.so
фактически не запустит программу (не уверен насчет статических конструкторов программы или библиотек).Если функция ASLR отключена, адрес загрузки будет в большинстве случаев одинаковым.В современных Linux-системах часто включается ASLR, поэтому для его отключения используйте echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
.
. Вы можете найти смещение функции system
внутри утилиты libc.so
с nm
из binutils.,Я думаю, вы должны использовать nm -D /lib/libc.so
или objdump -T /lib/libc.so
и вывод grep.