нм против "readelf -s" - PullRequest
       36

нм против "readelf -s"

34 голосов
/ 01 апреля 2012

Предположим, у нас есть общая библиотека с именем libtest.so, в ней есть одна функция "foo"

используйте полоску для удаления всех символов из libtest.so

$strip libtest.so

Итак, теперь, если мы используем:

$nm libtest.so

распечатает:

нм: libtest.so: без символов

но если мы используем:

$readelf -s libtest.so 

Функция foo все еще видна из ее результата:

...

10: 000005dc 5 FUNC GLOBAL DEFAULT 12 _Z3foov

...

мы также можем использовать строки команд для проверки:

$strings libtest.so

...

_Z3foov

...

вот мой вопрос, почему nm не дает результата для чередующегося libtest.so?

Спасибо

1 Ответ

59 голосов
/ 01 апреля 2012

почему nm не дает результата для чередования libtest.so

В исходной libtest.so есть две таблицы символов: "обычная" (в.symtab и .strtab разделов) и динамический (в разделах .dynsym и .dynstr).

Если бы strip удалил обе таблицы символов, ваша библиотека была бы совершенно бесполезна: динамический загрузчикне удалось разрешить какие-либо символы в нем.Так что strip делает единственное, что имеет смысл: удаляет «обычную» таблицу символов, оставляя динамическую таблицу без изменений.

Вы можете видеть символы в динамической таблице символов с помощью nm -D или readelf -s.

«Обычная» таблица символов полезна только для отладки (например, она содержит записи для статических функций, которые не экспортируются библиотекой и не отображаются в таблице динамических символов).

Но динамический загрузчик никогда не смотрит на «обычную» таблицу символов (которая не в формате, подходящем для быстрого поиска символов);только на динамическом.Таким образом, «правильная» таблица символов не нужна для корректной работы программы, а динамическая -.

...