Подтвердить что ты не робот

Nm vs "readelf -s"

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

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

$strip libtest.so

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

$nm libtest.so

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

nm: libtest.so: нет символов

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

$readelf -s libtest.so 
Функция

foo по-прежнему видна из ее результата:

...

10: 000005dc 5 FUNC GLOBAL DEFAULT 12 _Z3foov

...

мы также можем использовать командные строки, чтобы проверить его:

$strings libtest.so

...

_Z3foov

...

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

Спасибо

4b9b3361

Ответ 1

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

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

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

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

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

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