使 MS Visual C++ 编译器将 Win32 API 导入调用视为(未解析的)外部符号
Make MS Visual C++ compiler treat Win32 API import calls as (unresolved) external symbols
是否可以让 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.
的异常调用
正如问题下的评论所指出的,Win32 API 调用被编译成 call [__imp__xxx]
的原因是 __declspec(dllimport)
.
因此,要实现问题中的要求,所有 Win32 API 函数都必须在没有 __declspec(dllimport)
的情况下定义。
在Win32头文件中(如WinUser.h
)你可以看到所有的函数都是用WINxxxAPI
宏定义的,而这些函数又是在apisetcconv.h
中定义的。在后面的文件中 WINxxxAPI
宏定义为 DECLSPEC_IMPORT
,而后者又定义为 __declspec(dllimport)
.
因此,实现要求的一种简单方法是使用以下空预处理器定义 (see /D flag) 重新定义 DECLSPEC_IMPORT
:
/DDECLSPEC_IMPORT=
相当于
#define DECLSPEC_IMPORT
P.S。如果有其他方法,我还是想知道。
是否可以让 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.
正如问题下的评论所指出的,Win32 API 调用被编译成 call [__imp__xxx]
的原因是 __declspec(dllimport)
.
因此,要实现问题中的要求,所有 Win32 API 函数都必须在没有 __declspec(dllimport)
的情况下定义。
在Win32头文件中(如WinUser.h
)你可以看到所有的函数都是用WINxxxAPI
宏定义的,而这些函数又是在apisetcconv.h
中定义的。在后面的文件中 WINxxxAPI
宏定义为 DECLSPEC_IMPORT
,而后者又定义为 __declspec(dllimport)
.
因此,实现要求的一种简单方法是使用以下空预处理器定义 (see /D flag) 重新定义 DECLSPEC_IMPORT
:
/DDECLSPEC_IMPORT=
相当于
#define DECLSPEC_IMPORT
P.S。如果有其他方法,我还是想知道。