Зачем мне нужны разные параметры дампа для разных типов изображений? - PullRequest
0 голосов
/ 20 декабря 2018

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

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

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

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

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

1 Ответ

0 голосов
/ 20 декабря 2018

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

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

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

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

...