Я использую dumpbin
недавно, чтобы увидеть символы в некоторых статических библиотеках, используя dumpbin foo.lib /symbols
, Я хотел посмотреть, как это можно использовать для исполняемых файлов и библиотек DLL.
Мое первое наблюдение заключается в том, что dumpbin foo.{exe|dll} /symbols
ничего не возвращает.
Для библиотек DLL я заметил, что опция экспорта необходима для получения символьных данных:
dumpbin foo.dll /exports
, Почему этот вариант необходим в этом случае? Если соответствующий файл * .iobj доступен, я могу использовать dumpbin foo.iobj /symbols
выводит ВСЕ символы, тогда как / export в DLL, я полагаю, показывает только символы, предоставляемые DLL.
Для исполняемых файлов dumpbin bar.exe /symbols
ничего не выдает, где как dumpbin bar.exe /exports
кажется, сбросить некоторые символы.
Кто-нибудь может объяснить, что здесь происходит под капотом?
Аргументы, которые вы используете для dumpbin, сообщают ему, какие разделы файла нужно выгрузить.
Причина, по которой вам нужно использовать разные аргументы, заключается в том, что вы просматриваете фрагменты данных, которые похожи друг на друга действительно внимательно, но (с точки зрения PE-файла) это совершенно разные фрагменты данных, которые хранятся в разных разделах файла.
Итак, когда вы создаете объектный файл, он определяет некоторые символы, и они входят в раздел символов PE-файла. Когда вы связываете их для создания DLL / EXE-файла, любые экспортируемые символы создают записи в разделе экспорта файла. С нашей точки зрения, они выглядят похожими (на самом деле экспортируемое имя обычно будет именем некоторого символа, который был в разделе символов некоторого объектного файла), но оно все еще хранится в другом разделе.
Когда компилятор делает свое дело, он записывает данные в раздел символов, но (по крайней мере, обычно) вообще не создает раздел импорта или экспорта. Затем компоновщик делает свое дело, в основном читая из раздела символов и записывая в разделы импорта и экспорта. Затем загрузчик делает свое дело, в основном читая из разделов импорта и экспорта и игнорируя раздел символов.
Других решений пока нет …