Как проверить, является ли объектный код 16/32 битным? - PullRequest
2 голосов
/ 20 февраля 2020

Есть ли способ определить, что файл .obj и файл .exe имеют размер 16/32 бита?

В основном я хочу создать интеллектуальный компоновщик, который будет автоматически определять, какой компоновщик нужно ли передавать указанные имена файлов.

Предпочитаемый язык: C (при необходимости может быть другим)

Я ищу решение, которое может прочитать байты .exe / код файла .obj и затем определите, является ли он 16/32 битным. Даже алгоритм тоже подойдет.

Примечание: я знаю, что и объектный код, и исполняемый файл - это две разные сущности.

1 Ответ

3 голосов
/ 20 февраля 2020

Вся эта информация кодируется в двоичном объекте согласно соответствующему двоичному интерфейсу приложения (ABI).

Текущий Linux ABI - это исполняемый и связываемый формат (ELF), и вы можете запросить заданный c двоичный файл с использованием такого инструмента, как readelf или objdump.

Текущий Windows ABI - это формат Portable Executable (PE). Я не знаком с набором инструментов здесь, но быстрый поиск в Google показывает, что есть программы, которые работают так же, как readelf:

http://www.pe-explorer.com/peexplorer-tour.htm

Вот спецификация Microsoft формата PE:

https://docs.microsoft.com/en-us/windows/win32/debug/pe-format

Однако ни один из этих форматов больше не поддерживает 16-разрядные двоичные файлы. Более старый формат ABI называется «a.out» для Linux, который можно прочитать и запросить с помощью objdump (я не уверен насчет readelf). Старые форматы Windows / DOS называются MZ и NE. Опять же, я не знаком с инструментальной поддержкой этих старых Windows форматов.

В Википедии имеется довольно полный список всех популярных форматов исполняемых файлов, которые использовались, со ссылками на дополнительную информацию:

https://en.wikipedia.org/wiki/Comparison_of_executable_file_formats

...