Вопрос

Есть ли способ создать файл заголовка С++ для файла .obj?Или, возможно, есть утилита, которая может просматривать файлы .obj.Я уже нашел objconv, который преобразует форматы, но не могу найти генератор/просмотрщик .h.

Это было полезно?

Решение

Учитывая тег C++, ситуация не так безнадежна, как предполагают некоторые другие ответы.

В частности, по крайней мере, в большинстве компиляторов C++ имя функции будет искажено (Microsoft называет его «украшенным»), чтобы указать параметры, принимаемые этой функцией.Схема искажения варьируется от одного компилятора к другому, но, по сути, любой из них кодирует достаточно информации, чтобы вы могли заново создать объявление функции — тип возвращаемого значения, имя самой функции, имя класса, если это функция-член. , а также точное количество и тип параметров, ожидаемых функцией.

Хотя это не обязательно будет делаться путем искажения имени, у системы C++ нет другого выбора, кроме как включить информацию о параметрах в объектный файл.Когда вы перегружаете функции, компоновщику нужен какой-то способ определить, какую перегрузку связать с конкретным вызовом.

Я должен добавить, что разобраться во всем этом может оказаться довольно трудоемкой задачей — например, если код включает шаблоны, имя символа в объектном файле расширится. все параметры шаблона (включая параметры по умолчанию).Для примера рассмотрим такой тривиальный фрагмент кода:

#include <vector>
#include <string>

std::vector<std::string> x;

Когда я компилирую это с помощью VC++, а затем делаю dumpbin /symbols foo.obj, на выходе около 75 килобайт.Несмотря на то, что мой исходный код, кажется, определяет только один символ, объектный файл содержит определения примерно для 180 символов, многие из которых почти совершенно не связаны ни с чем, что я вообще написал.

Также стоит упомянуть, что если объектный файл был скомпилирован с отладочной информацией, это (обычно) также создаст значительно больше информации о типе (и тому подобное) в объектном файле.

Другие советы

Ваш вопрос отмечен тегом visual-c++ поэтому я предполагаю, что вы используете Windows.

Генерация исходных файлов заголовков из объектных файлов невозможна, поскольку большая часть (возможно, большая часть) информации в файлах заголовков удаляется при компиляции исходного кода в объектные файлы.

Однако вы можете использовать dumpbin утилита для проверки объектных файлов на очень низком уровне.Единственная информация, содержащаяся в объектном файле и которая может вас заинтересовать, — это список имен символов, определенных в данном объектном файле.Однако вы не можете получить какую-либо информацию о типе из объектного файла.Таким образом, вы не можете сказать, какой тип значения принимает или ожидает данная функция.

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

Генератора заголовков быть не может, поскольку файл .obj не содержит всей информации, которая была бы необходима в файле заголовка.Что касается дампа .obj, инструменты для этого будут зависеть от компилятора.Инструмент, связанный с GCC, для этого: объектный дамп.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top