繁体   English   中英

从程序集中调用C mainCRTStartup函数(与MASM兼容)

[英]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]getmainargsMSVCRT.DLL或静态链接CRT代码。 (取决于CRT版本)

mainCRTStartupEXE入口点。 EXE执行的第一个代码,但是当然不是在进程中执行的第一个代码(所有静态dll依赖项已经加载和初始化(如果应用程序使用它,则包括MSVCRT.DLL

mainCRTStartup来自LIBlibcmt.libmsvcrt.libmsvcurt.lib 当您链接的exe -在第一次使用的一些LIBsOBJs作为链接器输入和EXE必须设置/ENTRY:function选项。 您可以显式设置此功能,或者如果不这样做,将使用默认值:

默认情况下,起始地址是C运行时库中的函数名称。 链接器根据程序的属性选择它,如下表所示

你的情况,这将是mainCRTStartup -连接器将在所有的被搜索它LIBsOBJs ,你传递给他作为输入。 如果他没有找到它-您有未解决的错误外部符号。 如果链接器找到它-他将其代码用作exe的一部分。 所以接头取的代码mainCRTStartup从LIB(例如甚至msvcrt.lib含有mainCRTStartup作为代码,但不作为进口形实转换),并将其链接到exe。

mainCRTStartup不是Windows操作系统的功能。 它只是EXE入口点。 不多。

我不完全了解您为什么尝试去做。 如果您只想在自己的汇编代码中使用CRT ,则需要执行以下操作:

  1. 实现_main_wmain (对于x86)或mainwmain (对于x64)
  2. 使用说msvcrt.lib作为链接器输入库
  3. 在项目设置或MASM END [w]mainCRTStartup设置/ENTRY:[w]mainCRTStartup END [w]mainCRTStartup

如果你想自己的自定义功能,将之前执行mainCRTStartup -让我们将其命名为start -你需要改变3点:

  1. 设置/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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM