Заставить компилятор MS Visual C++ обрабатывать вызовы импорта Win32 API как (неразрешенные) внешние символы

Можно ли заставить компилятор MS Visual C++ обрабатывать вызовы импорта Win32 API как (неразрешенные) внешние символы?

Другими словами, мне нужно изменить dword ptr вызовы, которые ссылаются на некоторые IAT, например:

FF 15 00 00 00 00  call        dword ptr [__imp__MessageBoxA@16]

на вызовы внешних символов, например:

E8 00 00 00 00     call        _MessageBoxA@16

Это означает, что после компиляции мне не нужны ссылки, потому что, очевидно, это будет невозможно. Так что как продукт я хочу получить (MS) COFF .obj файлы, которые такие необычные вызовы Win32 API.

1 ответ

Решение

Как было указано в комментариях к вопросу, причина, по которой вызовы Win32 API компилируются в call [__imp__xxx] является __declspec(dllimport),

Таким образом, чтобы достичь того, что было задано в вопросе, все функции Win32 API должны быть определены без __declspec(dllimport),

В заголовочных файлах Win32 (таких как WinUser.h) вы можете видеть, что все функции определены с WINxxxAPI макрос, который в свою очередь определяется в apisetcconv.h, В последнем файле WINxxxAPI макросы определяются с DECLSPEC_IMPORTкоторый в свою очередь определяется как __declspec(dllimport),

Таким образом, простой способ выполнить требование - это переопределить DECLSPEC_IMPORT со следующим пустым определением препроцессора ( см. флаг /D):

/DDECLSPEC_IMPORT=

Что эквивалентно

#define DECLSPEC_IMPORT

PS Если есть альтернативные способы, я все равно хотел бы их узнать.

Другие вопросы по тегам