Почему objdump не показывает разделы .bss, .shstratab, .symtab и .strtab?

В настоящее время я делаю свою собственную реализацию objdump на C.

Для моей опции -s я должен показать полное содержимое раздела файла ELF.

У меня все хорошо, но я показываю больше разделов, чем "настоящий" objdump.

Фактически, он не выводит разделы .bss, .shstrtab, .symtab и .strtab.

Я просматриваю значение sh_flags в структуре Shdr, но не могу найти никакой логики ...

Почему objdump -s не показывает эти разделы?


person Community    schedule 04.03.2014    source источник
comment
ELF довольно сложен, GNU objdump основан на BFD, библиотеке, которая выполняет тяжелую работу (часть binutils).   -  person vonbrand    schedule 04.03.2014
comment
Да, я знаю о библиотеке BFD. В открытых исходных кодах Apple я вижу (section->flags & SEC_HAS_CONTENTS), показывать или нет раздел. На моем компьютере .bss имеет те же флаги, что и другие показанные разделы.   -  person    schedule 04.03.2014


Ответы (2)


Почему objdump -s не показывает эти разделы?

Objdump основан на libbfd, который абстрагирует многие сложности ELF, и был написан, когда объекты, как правило, имели только три раздела.

Таким образом, objdump весьма несовершенно. Помимо того, что он не показывает вам (некоторые) существующие разделы, он также может «синтезировать» разделы, которых вообще нет, и выполнять другие странные трюки. Это скорее libbfd ошибка - его уровень абстракции просто не сообщает objdump о «недостающих» секциях.

TL; DR: не используйте objdump. Вместо этого используйте readelf.

person Employed Russian    schedule 05.03.2014
comment
Хорошо, так что такое поведение на самом деле не требуется? Для моего objdump я покажу каждый раздел. Спасибо ! Кстати, я также предпочитаю использовать readelf, objdump - это школьный проект. - person ; 05.03.2014
comment
stackoverflow.com/questions/8979664 / - person Ciro Santilli 新疆再教育营六四事件ۍ 26.05.2015

Попробуйте использовать sh_size и sh_type вместо sh_flags.

Цитата из спецификации ELF

sh_size Этот элемент указывает размер раздела в байтах. Если тип раздела не SHT_NOBITS, он занимает в файле байты sh_size. Раздел типа SHT_NOBITS может иметь ненулевой размер, но не занимает места в файле.

person pank4j    schedule 04.03.2014
comment
Похоже, что только .bss и .got относятся к типу SHT_NOBITS. Таким образом, это не объясняет, почему .shstrtab, .symtab и .strtab не отображаются ... - person ; 04.03.2014
comment
Вот мой вывод: раздел отображается, если у него есть хотя бы один флаг (в отличие от .shstrtab, .symtab и .strtab) или если его тип не NOBITS (в отличие от .bss). У кого-нибудь есть другая идея? - person ; 04.03.2014
comment
Итак, я нашел минус: .gnu_debuglink не имеет флага и отображается objdump -s - person ; 04.03.2014