Зачем мне нужны разные параметры дампа для разных типов образов?

Недавно я использовал dumpbin, чтобы увидеть символы в некоторых статических библиотеках, используя dumpbin foo.lib /symbols. Я хотел посмотреть, как его можно использовать для исполняемых файлов и библиотек DLL.

Мое первое наблюдение состоит в том, что dumpbin foo.{exe|dll} /symbols ничего не возвращает.

Для DLL я заметил, что опция экспорта была необходима для получения данных символа: dumpbin foo.dll /exports. Зачем нужна эта опция в данном случае? Если доступен соответствующий файл *.iobj, я могу использовать dumpbin foo.iobj /symbols для дампа ВСЕХ символов, тогда как /exports в DLL, как я предполагаю, показывает только те символы, которые выставлены DLL.

Для исполняемых файлов dumpbin bar.exe /symbols ничего не производит, тогда как dumpbin bar.exe /exports, кажется, сбрасывает некоторые символы.

Кто-нибудь может объяснить, что здесь происходит под капотом?


person Joe    schedule 20.12.2018    source источник


Ответы (1)


Аргументы, которые вы используете для dumpbin, сообщают ему, какие разделы файла выгружать.

Причина, по которой вам нужно использовать разные аргументы, заключается в том, что вы просматриваете фрагменты данных, которые действительно похожи друг на друга, но (с точки зрения PE-файла) являются совершенно разными фрагментами данных. которые хранятся в разных разделах файла.

Итак, когда вы создаете объектный файл, он определяет некоторые символы, и они попадают в раздел символов PE-файла. Когда вы связываете их для создания файла DLL/exe, любые символы, которые он экспортирует, создают записи в разделе экспорта файла. С нашей точки зрения, они выглядят одинаково (фактически, экспортируемое имя обычно будет именем некоторого символа, который был в разделе символов некоторого объектного файла), но оно все еще хранится в другом разделе.

Когда компилятор делает свое дело, он записывает данные в секцию символов, но (по крайней мере, обычно) вообще не создает секцию импорта или экспорта. Затем компоновщик делает свое дело, в основном читая из секции символов и записывая в секции импорта и экспорта. Затем загрузчик делает свое дело, в основном читая из разделов импорта и экспорта и игнорируя раздел символов.

person Jerry Coffin    schedule 20.12.2018