Разрешение имени символа в общей библиотеке (Linux)

Я делаю динамический бинарный анализ в Linux. Учитывая, что программа динамически связана (связывание во время загрузки) и нет рандомизации адресного пространства, я должен разрешить имя функции, если вызывается функция стандартной библиотеки. Я видел в дизассемблированном коде, что вызов стандартных библиотечных процедур сначала переходит на некоторый адрес в разделе .plt, где ПК загружается с адресом памяти, вычисленным там. Кстати, это в ARM Linux, но общая идея, я думаю, будет такой же.

Я новичок в системном программировании. Я не так много знаю о том, как связываются библиотеки и адреса разрешаются во время выполнения. Любая идея от экспертов приветствуется.


person sheikh    schedule 13.09.2012    source источник


Ответы (1)


PLT расшифровывается как Таблица связывания процедур, таблица, которая разрешает функции (и глобальные переменные) в разделяемых библиотеках по адресам в вашей программе.

PLT сильно привязан к GOT, Global Offset Table. Вместе они выполняют ленивую привязку, если вызывается адрес в общей библиотеке: при первом вызове разрешается фактический адрес функции (который может отличаться от каждого выполнения даже без рандомизации адресов, это зависит в порядке загрузки/использования библиотек), в дальнейших вызовах адрес косвенно используется с GOT.

Вы можете использовать такие инструменты, как objdump и readelf, для проверки содержимого файлов elf. Более подробное объяснение здесь:

http://www.technovelty.org/linux/pltgot.html

http://timetobleed.com/dynamic-linking-elf-vs-mach-o/

person Gunther Piez    schedule 13.09.2012
comment
Большое спасибо за ваш ответ. - person sheikh; 14.09.2012