2014-01-15 2 views
2

тестовая платформа - 32-разрядная Linux.Почему у разделенного двоичного файла все еще может быть информация о вызове библиотеки в дизассемблированном файле?

компилировать кесареву программу без полосы символьной информации, а также использовать objdump для разборки эльфа исполняемого файла.

Это часть результатов.

804831c: e8 8c fe ff ff  call 8048360 <[email protected]> 

Если я использую:

strip binary 

удалить данные символа и использовать objdump снова разборке эльфа исполняемый файл, я до сих пор можно увидеть результаты, как:

804831c: e8 8c fe ff ff  call 8048360 <[email protected]> 

Так мой вопрос:

Как инструмент разборки, такой как objdump, знает имя определенной функции библиотеки после того как я раздели всю информацию о символе ..?

Спасибо!

+0

printf не является syscall – tristan

+0

Извините, я имею в виду вызов библиотеки ... @tristan – computereasy

ответ

4

ELF-файл содержит 2 таблицы символов: .symtab и .dynsym. Последнее предназначено для динамических символов, необходимых для динамической компоновки (перемещения). В вашем случае printf находится в .dynsym и может также присутствовать в .symtab; по умолчанию полоса удалит .symtab, но не .dynsym, который необходим для перемещения.

Вы можете попробовать

полоса -R .dynsym your_binary

удалить раздел dynsym вручную, и вы увидите, что не может работать из-за сбоя перераспределения.

+0

ОТПРЯМУЙТЕ вас за ответ. Но когда я использую ** readelf -R test **, чтобы проверить таблицу перераспределенного двоичного диска, он ничего не выводит – computereasy

+0

@computereasy updated – tristan

2

Импортированные вызовы всегда будут иметь имя, это необходимо для ссылки во время выполнения. Если вы разделили имя импорта, как ваше приложение узнает, что назвать? Методы из внешних библиотек могут (и обычно) иметь разные адреса каждый раз, когда ваше приложение выполняется.

С другой стороны, в некоторых случаях встроенные или статически связанные методы могут быть идентифицированы и названы даже без символьной информации. Многие дизассемблеры ищут общие шаблоны, связанные с некоторыми стандартными библиотечными функциями. Например, memcpy() часто может быть эвристически идентифицирован и помечен даже без информации о символе.