我的计算机上安装了一个程序。当我使用 CFF Explorer 检查它时,我看不到任何导入或依赖项。您可以猜测它是一个纯资源可执行映像,但事实并非如此。它有一个 .text
部分,其中包含有效的可执行代码和该
.text
部分的入口点。很明显,它以某种方式加载并链接到系统库,因为否则,用户模式应用程序在不调用任何系统 API 的情况下无法执行任何有用的操作。
如果答案可以回答这些问题那就太好了:
您需要做的就是转到
project Properties -> Linker -> Input 并将 Ignore All Default Libraries
设置为
Yes /NODEFAULTLIB
。您需要提供您自己的 mainCRTstartup
版本,这是 MSVC 设置的入口点的默认名称。您可以通过转到
project Properties-> Linker -> Advanced 并将
Entry Point
设置为要用作入口点的函数的名称来更改此设置。或者,直接从命令行使用 cl.exe
:
cl.exe main.c /link /NODEFAULTLIB /ENTRY:"main"
。完整示例:$ more main.c
int main()
{
return 0;
}
$ cl.exe main.c /link /NODEFAULTLIB /ENTRY:"main"
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29333 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
main.c
Microsoft (R) Incremental Linker Version 14.28.29333.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:main.exe
/NODEFAULTLIB
/ENTRY:main
main.obj
$ dumpbin /imports main.exe
Microsoft (R) COFF/PE Dumper Version 14.28.29333.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file main.exe
File Type: EXECUTABLE IMAGE
Summary
1000 .rdata
1000 .text
当然,这意味着您不能使用任何 Win32 API。即使您静态链接 MSVC 提供的 C 运行时库,它仍然无法工作,因为它将使用系统 DLL 中的功能。如果您直接调用所需的系统调用(只要您知道它们的编号,该编号可能会从一个 Windows 版本更改为另一个 Windows 版本),则可以解决此问题。