我正在为win64编写一个汇编程序(MASM兼容),并希望在可能的情况下使用C函数mainCRTStartup()来设置环境并传递命令行参数。我可以这么做吗?
当您运行一个(控制台)C程序时,mainCRTStartup()是要调用的第一个函数,它调用程序的主函数。mainCRTStartup()函数从何而来?它是由编译器或链接器添加的,还是包含在MSVCRT.DLL中?我不是使用微软链接器,而是使用JWasm和JWlink。
我非常清楚如何从程序集中调用普通的C函数,但是mainCRTStartup()非常特殊,我甚至不确定它是否是C函数,也许是windows OS函数。
如果我可以以某种方式调用它,我需要传递我自己的main()进行回调。
发布于 2017-01-08 02:13:40
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的一部分代码。因此,链接器将库中的mainCRTStartup代码(例如,包含mainCRTStartup的msvcrt.lib作为代码,而不是导入的mainCRTStartup)链接到exe。
mainCRTStartup不是windows函数。它只是EXE入口点。不多了。
我不太明白你为什么要这么做。如果您只想在自己的程序集代码中使用CRT,那么接下来需要做的是:
_main或_wmain (用于x86)或main或wmain (用于x64)msvcrt.lib作为链接器输入库MASM END [w]mainCRTStartup中设置MASM如果您希望自己的自定义函数在mainCRTStartup之前执行-让它命名为start -则需要更改点3:
MASM END start中设置MASM和开始代码
start PROC
; do something here
call [w]mainCRTStartup ; no args, can even jump instead call
start ENDP[w]mainCRTStartup也会调用您的[w]main回调。您不需要传递自己的main,因为[w]mainCRTStartup调用[w]main而不是by address,而是通过名称调用-所以您需要的所有东西都已经在代码中实现了。链接器已经将调用从[w]mainCRTStartup绑定到您的[w]main或者说关于未解决的符号。
https://stackoverflow.com/questions/41528376
复制相似问题