2

该程序由带有 -g 标志、-static-libgcc 和 -static-libstdc++ 的 g++ 编译。没有包括优化标志。但是由于某种原因,我无法进入主程序。为什么?

$ nm -C test.exe | grep 主要
006c05b0 T __getmainargs
006b0ad0 T __main
0088d0e8 B __mingw_winmain_hInstance
0088d0e4 B __mingw_winmain_lpCmdLine
0088d0ec B __mingw_winmain_nShowCmd
006ce518 D __native_dllmain_reason
00401180 t __tmainCRTStartup
0088edc8我_imp____getmainargs
007491c0 r jisx0213_to_ucs_main
00405f0c T 主
00401570 T mainCRTStartup
00884010 b 主网
004a3371 T sqlite3_backup_remaining
0078ada0 r uhc_1_2charset_main
0078c440 r uhc_1_2uni_main_page81
007899a0 r uhc_2_2charset_main
0078db00 r uhc_2_2uni_main_pagea1

$ gdb test.exe
GNU gdb (pcx32) 7.3.50.20111127-cvs
版权所有 (C) 2011 Free Software Foundation, Inc.
许可 GPLv3+:GNU GPL 版本 3 或更高版本
这是免费软件:您可以自由更改和重新分发它。
在法律允许的范围内,不提供任何保证。输入“显示复制”
和“显示保修”了解详情。
此 GDB 配置为“i686-w64-mingw32”。
有关错误报告说明,请参阅:
...
从 c:\test.exe 读取符号
...完毕。
(gdb) 中断主要
0x405f15 处的断点 1:文件 test.cpp,第 1054 行。
(gdb) 中断 mainCRTStartup
0x401570 处的断点 2
(gdb) 中断 __tmainCRTStartup
0x40118c 处的断点 3
(gdb) 中断 __main
0x6b0ad0 处的断点 4
(gdb) 中断 __getmainargs
0x6c05b0 处的断点 5
(gdb) 运行
启动程序:c:\test.exe
[新线程 5832.0xc0c]
在启动过程中,程序以代码 0xc0000022 退出。
(gdb)

PS dependency walker 显示它无法打开 SYSNTFY.DLL 并且找不到 IEFRAME.DLL。然而,这并不新鲜,也不应该成为问题。

(gdb) 信息文件
来自“c:\test.exe”的符号。
本地执行文件:
        `c:\test.exe',
        文件类型为 pei-i386。
        入口点:0x401570
        0x00401000 - 0x006c14c4 是 .text
        0x006c2000 - 0x006ce5d0 是 .data
        0x006cf000 - 0x0080c3e0 是 .rdata
        0x0080d000 - 0x00883c58 是 .eh_frame
        0x00884000 - 0x0088d178 是 .bss
        0x0088e000 - 0x00891d40 是 .idata
        0x00892000 - 0x00892038 是 .CRT
        0x00893000 - 0x00893020 是 .tls
(gdb) 中断 *0x401570
注意:断点 2 也设置在 pc 0x401570。
0x401570 处的断点 6
(gdb) 运行
启动程序:c:\test.exe
[新线程 5332.0x28b0]
在启动过程中,程序以代码 0xc0000022 退出。

这说明入口点确实是__tmainCRTStartup,但 gdb 似乎没有到达那里。

答案就像评论一样:图书馆把一切都搞砸了。为了弄清楚这一点,我一个一个地取消了每个库的链接,直到它设法进入主库。

4

2 回答 2

6

我怀疑您有一个引发 SIGSEGV 或其他错误的静态或全局变量初始化......所有静态和全局变量都在执行 main 之前初始化。

另外......我看到你正在运行 MinGW——你的路径是否正确设置到 MinGW bin 目录?当我构建 MinGW 应用程序(通过 Eclipse)时,我有一个启动器应用程序和两者都构建的应用程序。我必须使用启动器,除非我的 Windows 路径上有 MinGW bin 目录。

进一步阅读,值得注意的是,DLL 是在调用 mainCRTStartup 之前加载的。对于 Windoze 应用程序,您通常会中断 _DllMain 来处理它。我不确定在 MinGW 中如何/在哪里处理?

于 2013-04-09T19:42:38.977 回答
1

我在使用 Cygwin 时遇到了同样的问题,我发现了一个糟糕的解决方案:为共享库授予可执行权限:

$ chmod a+x lib<name>.so.<ver>

并且,还将选项 -m0755 添加到我的 $(INSTALL) 命令中。

于 2014-11-24T13:14:52.653 回答