我正在为win64编写一个汇编程序(与MASM兼容),如果可能的话,我想使用C函数mainCRTStartup()来设置环境并传递命令行参数。我能做些什么吗?
运行(控制台)C程序时,mainCRTStartup()是要调用的第一个函数,它调用程序的主函数。mainCRTStartup()函数从何而来?它是由编译器或链接器添加的,还是包含在MSVCRT.DLL中?我不使用微软链接器,我使用JWasm和JWlink。
我非常清楚如何从程序集调用普通的C函数,但是mainCRTStartup()非常特殊,我甚至不确定它是一个C函数,也许是一个windows操作系统函数。
如果我可以调用它,我需要传递自己的main()进行回调。
最佳答案
int mainCRTStartup()
没有参数。所以您不能(或者不需要)直接为它传递参数。他使用命令行或通过调用GetCommandLine
或通过调用__[w]getmainargs
来MSVCRT.DLL
或静态链接的CRT
代码。(非常依赖于CRT
版本)mainCRTStartup
是EXE
入口点。从EXE
执行的第一个代码,但当然不是在进程中执行的第一个代码(所有静态dll依赖项都已加载和初始化(如果应用程序使用它,则包括MSVCRT.DLL
)mainCRTStartup
来自LIB
:libcmt.lib
或msvcrt.lib
或msvcurt.lib
。当您链接exe时-首先您使用一些LIBs
和OBJs
作为链接器输入,对于EXE
您必须设置/ENTRY:function
选项。可以显式设置此函数,如果不这样做,则使用默认值:
默认情况下,起始地址是C中的函数名
运行时库。链接器根据
程序,如下所示。
在您的情况下,这将是mainCRTStartup
-链接器将在所有LIBs
和OBJs
中搜索它,并将其作为输入传递给他。如果他没有找到-你得到了错误未解决的外部符号。如果链接器找到了它-他将其代码用作exe的一部分。因此链接器从lib中获取mainCRTStartup
的代码(例如,甚至包含msvcrt.lib
的mainCRTStartup
作为代码,但不作为import thunk),并将其链接到exe。mainCRTStartup
不是windows操作系统功能。它只是一个入口点。不是更多。
我不明白你为什么要这么做。如果您只想在自己的程序集代码中使用CRT
,则需要执行以下操作:
实现_main
或_wmain
(对于x86)或main
或wmain
(对于
x64页)
使用saymsvcrt.lib
作为链接器输入库
在项目设置或/ENTRY:[w]mainCRTStartup
MASM
中设置END [w]mainCRTStartup
如果您想要自己的自定义函数,该函数将在mainCRTStartup
之前执行-将其命名为start
-您需要更改点3:
在项目设置或/ENTRY:start
MASM
中设置END start
和起始代码
start PROC
; do something here
call [w]mainCRTStartup ; no args, can even jump instead call
start ENDP
并且总是给你的回拨打电话。您不需要传递自己的
[w]mainCRTStartup
,因为[w]main
不是按地址而是按名称调用了main
,所以您需要的所有东西都在代码中实现了[w]main。链接器已将来自[w]mainCRTStartup
的调用绑定到您的[w]main
或说明未解析的符号关于c - 从程序集中调用C mainCRTStartup函数(与MASM兼容),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41528376/