[英]calling C mainCRTStartup function from assembly (MASM compatible)
我正在为win64编写一个汇编程序(与MASM兼容),并希望在可能的情况下使用C函数mainCRTStartup()来设置环境并传递命令行参数。 我能以某种方式做到吗?
当您运行(控制台)C程序时,mainCRTStartup()是第一个要调用的函数,它将调用程序的main函数。 mainCRTStartup()函数从何而来? 它是由编译器或链接器添加的,还是包含在MSVCRT.DLL中的? 我没有使用Microsoft链接程序,而是使用JWasm和JWlink。
我非常清楚如何从汇编中调用普通的C函数,但是mainCRTStartup()非常特殊,我甚至不确定它根本不是C函数,也许是Windows OS函数。
如果可以通过某种方式调用它,则需要传递自己的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的一部分。 所以接头取的代码mainCRTStartup
从LIB(例如甚至msvcrt.lib
含有mainCRTStartup
作为代码,但不作为进口形实转换),并将其链接到exe。
mainCRTStartup
不是Windows操作系统的功能。 它只是EXE入口点。 不多。
我不完全了解您为什么尝试去做。 如果您只想在自己的汇编代码中使用CRT
,则需要执行以下操作:
_main
或_wmain
(对于x86)或main
或wmain
(对于x64) msvcrt.lib
作为链接器输入库 MASM
END [w]mainCRTStartup
设置/ENTRY:[w]mainCRTStartup
END [w]mainCRTStartup
如果你想自己的自定义功能,将之前执行mainCRTStartup
-让我们将其命名为start
-你需要改变3点:
/ENTRY:start
在项目设置中END 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]mainCRTStartup
并不是通过地址而是通过名称 [w]mainCRTStartup
调用[w]main
,因此您所需的所有内容都已在代码中实现了[w] main。 链接器已将[w]mainCRTStartup
呼叫绑定到您的[w]main
或说出未解决的符号
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.