2

プログラムは、-g フラグ、-static-libgcc、および -static-libstdc++ を使用して g++ によってコンパイルされました。最適化フラグは含まれていません。しかし、なぜかメインに入れません。なんで?

$ nm -C test.exe | grep メイン
006c05b0 T __getmainargs
006b0ad0 T __メイン
0088d0e8B __mingw_winmain_hInstance
0088d0e4B __mingw_winmain_lpCmdLine
0088d0ec B __mingw_winmain_nShowCmd
006ce518 D __native_dllmain_reason
00401180 t __tmainCRTStartup
0088edc8 I _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
Copyright (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) break __tmainCRTStartup
0x40118c のブレークポイント 3
(gdb) ブレーク __main
0x6b0ad0 のブレークポイント 4
(gdb) break __getmainargs
0x6c05b0 のブレークポイント 5
(gdb) 実行
起動プログラム: c:\test.exe
[新スレッド 5832.0xc0c]
起動中、プログラムはコード 0xc0000022 で終了しました。
(gdb)

PS 依存関係ウォーカーは、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 はそこに到達していないようです。

答えはコメントのようなものでした: ライブラリがすべてを台無しにしていました。それを理解するために、メインに到達するまで、すべてのライブラリを1つずつリンク解除しました。

4

2 に答える 2

6

SIGSEGV またはその他のエラーをスローしている静的またはグローバル変数の初期化があると思われます... main が実行される前に、すべての静的変数とグローバル変数が初期化されます。

また... MinGW を実行しているようですが、MinGW の bin ディレクトリへのパスが正しく設定されていますか? MinGW アプリを (Eclipse 経由で) ビルドすると、ランチャー アプリとアプリの両方がビルドされます。Windows パスに MinGW の bin ディレクトリがない限り、ランチャーを使用する必要があります。

さらに読むと、mainCRTStartup が呼び出される前に DLL がロードされることに注意してください。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 に答える