【问题标题】:How to change the entry point name in a simple assembly program?如何在简单的汇编程序中更改入口点名称?
【发布时间】:2021-10-21 16:02:17
【问题描述】:

有这么简单的Win32汇编程序

.386
.model flat, c
option casemap :none

;includelib C:\Users\Darek\Dev\VC\lib\libcmt.lib
;includelib C:\Users\Darek\Dev\VC\lib\legacy_stdio_definitions.lib

EXTERN printf :PROC ; declare printf

.data
    HelloWorld db "Hello j World!:-)", 0

.code
main PROC
  push offset HelloWorld
  call printf
    add esp, 4
  ret
main ENDP
END

我想把入口点的名字从标准的main改成my_start,所以我把main函数的名字改成了@ 987654323@

...
my_start PROC
...
my_start ENDP
...

然后像下面这样链接

link /ENTRY:my_start /SUBSYSTEM:CONSOLE HelloWorld.obj libcmt.lib

但得到链接器错误:

在 _mainCRTStartup 中调用了未定义的外部符号 _main 为什么链接器会引入 ENTRY 选项? 我做错了什么以及如何让它发挥作用?

附言

我正在使用MSVC 2019 提供的mllink

【问题讨论】:

  • 实际入口点在 C 库中,然后调用您的 main
  • @Jester 对不起,你能解释一下吗?
  • 尝试使用“msvcrt.lib”而不是“libcmt.lib”。我试过你的代码在顶部附近添加以下行:includelib "\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\msvcrt.lib"(无需向链接器命令添加任何额外的文件)并且它有效。
  • @AdrianMole。好的 thx 从 libcmt 更改为 msvcrt 做的工作但是你能这么好,并解释我为什么 libcmt 的解决方案不起作用? libcmt 不接受入口点选项吗?

标签: windows visual-studio assembly masm


【解决方案1】:

C 要求你的主程序被称为main。这是 C 施加的限制,而不是硬件本身。我只用过UASM和x86-16,所以对Win32语法不熟悉,不过你可以试试这个:

my_start equ main

(假设 Win32 有一个 equ 指令。)

【讨论】:

  • Win32 是目标平台,而不是汇编程序。在这种情况下,汇编器是 MASM,但其他​​汇编器(如 NASM 或 FASM)也可以针对 Win32 目标文件或可执行文件。在 NASM 中,equ 绝对只适用于数字或已定义的符号,而不是像 CPP 宏这样的文本替换。在 FASM 中,它是一种文本替换。不确定 MASM。
  • 很公平。我不习惯在我的子例程中使用 PROC(我最近才发现它存在)所以我并不完全熟悉你可以用它做什么和不能做什么。
  • 这与您在 MASM 中使用 equ 可以做什么无关,但是可以。
  • 我想也许你可以说PROC main,然后有my_start equ main,这样你就可以在你的代码中使用CALL mainCALL myStart
  • 哦,是的,您可以这样做(如果您正在链接想要调用 main 的 CRT 代码,而不是实际将其作为进程入口点。)但是问题中的代码有 @ 987654330@ 不是proc main,所以你的equ 是倒退的。 (虽然 IDK 如果它可以反过来工作,将 main 定义为实际上对链接可见的同义词/别名。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
相关资源
最近更新 更多