首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从程序集调用C mainCRTStartup函数(MASM兼容)

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

Stack Overflow用户
提问于 2017-01-08 01:04:51
回答 1查看 1.1K关注 0票数 0

我正在为win64编写一个汇编程序(MASM兼容),并希望在可能的情况下使用C函数mainCRTStartup()来设置环境并传递命令行参数。我可以这么做吗?

当您运行一个(控制台)C程序时,mainCRTStartup()是要调用的第一个函数,它调用程序的主函数。mainCRTStartup()函数从何而来?它是由编译器或链接器添加的,还是包含在MSVCRT.DLL中?我不是使用微软链接器,而是使用JWasm和JWlink。

我非常清楚如何从程序集中调用普通的C函数,但是mainCRTStartup()非常特殊,我甚至不确定它是否是C函数,也许是windows OS函数。

如果我可以以某种方式调用它,我需要传递我自己的main()进行回调。

EN

回答 1

Stack Overflow用户

发布于 2017-01-08 02:13:40

int mainCRTStartup()没有争论。因此,您不能(或不需要)直接传递它的参数。他使用命令行,或者通过调用GetCommandLine,或者通过调用__[w]getmainargsMSVCRT.DLL或静态链接的CRT代码。(非常依赖于CRT版本)

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

mainCRTStartup来自LIB :libcmt.libmsvcrt.libmsvcurt.lib。当您链接exe时,首先您使用一些LIBsOBJs作为链接器输入,对于EXE,您必须设置/ENTRY:function选项。您可以显式设置此函数,或者如果不这样做,将使用默认设置:

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

在您的情况下,这将是mainCRTStartup -链接器将搜索它在所有的LIBsOBJs,您传递给他作为输入。如果他找不到-你得到了错误未解决的外部符号。如果链接器找到了它,他会使用它作为exe的一部分代码。因此,链接器将库中的mainCRTStartup代码(例如,包含mainCRTStartupmsvcrt.lib作为代码,而不是导入的mainCRTStartup)链接到exe。

mainCRTStartup不是windows函数。它只是EXE入口点。不多了。

我不太明白你为什么要这么做。如果您只想在自己的程序集代码中使用CRT,那么接下来需要做的是:

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

如果您希望自己的自定义函数在mainCRTStartup之前执行-让它命名为start -则需要更改点3:

  1. 在项目设置或MASM END start中设置MASM

和开始代码

代码语言:javascript
复制
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或者说关于未解决的符号。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41528376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档