为什么在 x64dbg 中加载 .exe 文件时找不到“_main”符号?

Why is "_main" symbol not found when .exe file is loaded in x64dbg?

写一个简单的hello_world.c程序,用32位MinGW编译, objdump 可以显示符号 table 使用:

objdump -t hello_world.exe

然后符号 table 有一个 _main 的条目:

...
[ 32](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 1) 0x00000460 _main
...

但是,在 x64dbg 调试器中加载 hello_world.exe 文件时, _main符号没有显示,从下面的符号列表可以看出 当 hello_world 模块被选中时。

这很烦人,因为我想在用户启动时创建一个断点 hello_world中的代码,并使用符号跳转到起始位置 会很方便。

知道如何获取符号列表中包含的 _main 个符号吗?

虽然 PE 支持存储调试信息,但符号 table 主要是一个 ELF 概念。

如果您查看 PE 部分(使用 ),您会看到许多未在 PE 目录中引用的额外部分。
binutils 使用这些来提取 DWARF information 并向您显示例如符号 table.

x64dbg 是一个纯粹的 Windows/PE 工具,不理解 DWARF。
然而,它会告诉你 PE 入口点的地址(虽然很少是“main”本身的地址)并且会自动为你在那里设置一个断点。
入口点显示在正在检查的二进制文件的导出符号下方。

此外,x64dbg 将在“ntdll”上中断,允许您使用忍者 CTRL+F9 到达入口点(注意 TLS 初始化回调)。

要到达 main,您可以单步执行代码,直到找到对 .text 部分中某个地址的调用,或者只是一个调用,然后是对 cexitcexit 的两次调用ExitProcess.

此外,给定使用 objdumpt -t 检索到的 _main 的偏移量 _main 的 VA 是 BASE ADDRESS + .text RVA + __main OFFSET .
就我而言,这是 4010460h