我正在为win64编写一个汇编程序(与MASM兼容),如果可能的话,我想使用C函数mainCRTStartup()来设置环境并传递命令行参数。我能做些什么吗?
运行(控制台)C程序时,mainCRTStartup()是要调用的第一个函数,它调用程序的主函数。mainCRTStartup()函数从何而来?它是由编译器或链接器添加的,还是包含在MSVCRT.DLL中?我不使用微软链接器,我使用JWasm和JWlink。
我非常清楚如何从程序集调用普通的C函数,但是mainCRTStartup()非常特殊,我甚至不确定它是一个C函数,也许是一个windows操作系统函数。
如果我可以调用它,我需要传递自己的main()进行回调。

最佳答案

int mainCRTStartup()没有参数。所以您不能(或者不需要)直接为它传递参数。他使用命令行或通过调用GetCommandLine或通过调用__[w]getmainargsMSVCRT.DLL或静态链接的CRT代码。(非常依赖于CRT版本)
mainCRTStartupEXE入口点。从EXE执行的第一个代码,但当然不是在进程中执行的第一个代码(所有静态dll依赖项都已加载和初始化(如果应用程序使用它,则包括MSVCRT.DLL
mainCRTStartup来自LIBlibcmt.libmsvcrt.libmsvcurt.lib。当您链接exe时-首先您使用一些LIBsOBJs作为链接器输入,对于EXE您必须设置/ENTRY:function选项。可以显式设置此函数,如果不这样做,则使用默认值:
默认情况下,起始地址是C中的函数名
运行时库。链接器根据
程序,如下所示。
在您的情况下,这将是mainCRTStartup-链接器将在所有LIBsOBJs中搜索它,并将其作为输入传递给他。如果他没有找到-你得到了错误未解决的外部符号。如果链接器找到了它-他将其代码用作exe的一部分。因此链接器从lib中获取mainCRTStartup的代码(例如,甚至包含msvcrt.libmainCRTStartup作为代码,但不作为import thunk),并将其链接到exe。
mainCRTStartup不是windows操作系统功能。它只是一个入口点。不是更多。
我不明白你为什么要这么做。如果您只想在自己的程序集代码中使用CRT,则需要执行以下操作:
实现_main_wmain(对于x86)或mainwmain(对于
x64页)
使用saymsvcrt.lib作为链接器输入库
在项目设置或/ENTRY:[w]mainCRTStartupMASM中设置END [w]mainCRTStartup
如果您想要自己的自定义函数,该函数将在mainCRTStartup之前执行-将其命名为start-您需要更改点3:
在项目设置或/ENTRY:startMASM中设置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/

10-12 21:06