Я ожидал увидеть количество символов в файле libc.so.6, включая printf . Я использовал инструмент nm , чтобы найти их, однако он говорит, что в libc.so.6 нет символа.
Я ожидал увидеть количество символов в файле libc.so.6, включая printf . Я использовал инструмент nm , чтобы найти их, однако он говорит, что в libc.so.6 нет символа.
Скорее всего, у него удалены обычные символы, а остались динамические символы, которые вы можете получить nm -D
.
@PSkocik ответил на это. Я просто хочу добавить больше деталей. В ELF есть два вида разделов символов: .symtab
и .dynsym
(подробности см. В Стандартной базовой спецификации ядра Linux, также известной как LSB_5.0.0 ). .symtab
для шага связывания самой разделяемой библиотеки. Как только связь завершена, .symtab
раздел больше не нужен. В .dynsym
разделе содержатся важные символы, которые должны быть найдены динамическим компоновщиком во время выполнения. nm
по умолчанию только дамп символов в .symtab
разделе.
LSB_5.0.0 Раздел 10.2.2.1, «Типы разделов ELF», говорит, что соответствующая совместно используемая библиотека должна иметь один .symtab
или .dynsym
оба, но не оба. Как часть библиотеки ABI, libc удалена из .symtab
соответствия спецификации.
Выясните, является ли это общим объектом или обычным ASCII-файлом. Если это общий объект, вы должны увидеть «ELF 32-битный LSB общий объект»
file /lib/i386-linux-gnu/libc.so.6
libc.so.6
очевидно, является общим объектом.