Заставить компилятор 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 Если есть альтернативные способы, я все равно хотел бы их узнать.