MinGW compiled programs crash on 64 bit Windows

匿名 (未验证) 提交于 2019-12-03 02:01:02

问题:

I have 32bit MinGW and 64 bit Eclipse CDT installed on 64 bit Windows 7 with an Intel Core i7-3612QM. When I compile and run hello world, the string prints, but the program gets a SIGILL afterward.

Source:

#include  using namespace std;  int main() {     cout 

Stacktrace:

hello.exe [C/C++ Application]        hello.exe [5532]             Thread [1] 0 (Suspended : Signal : SIGILL:Illegal instruction)               libstdc++-6!_ZSt4cout() at 0x6fccc3c0                libstdc++-6!_ZNSolsEPFRSoS_E() at 0x6fc8908c                 _fu0___ZSt4cout() at hello.cpp:5 0x4013be        gdb  

Adding cin causes a segfault:

Source:

#include  #include   using namespace std;  int main() {     string name;     cout > name;     cout 

Verbose compiler output:

C:\Users\Sean\temp>g++ -v main.cpp Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.6.2/lto-wrapper.exe Target: mingw32 Configured with: ../gcc-4.6.2/configure --enable-languages=c,c++,ada,fortran,obj c,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgo mp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-r untime-libs --build=mingw32 --prefix=/mingw Thread model: win32 gcc version 4.6.2 (GCC) COLLECT_GCC_OPTIONS='-v' '-shared-libgcc' '-mtune=i386' '-march=i386'  c:/mingw/bin/../libexec/gcc/mingw32/4.6.2/cc1plus.exe -quiet -v -iprefix c:\min gw\bin\../lib/gcc/mingw32/4.6.2/ main.cpp -quiet -dumpbase main.cpp -mtune=i386 -march=i386 -auxbase main -version -o C:\Users\Sean\AppData\Local\Temp\ccSVBzeY. s GNU C++ (GCC) version 4.6.2 (mingw32)         compiled by GNU C version 4.6.2, GMP version 5.0.1, MPFR version 2.4.1, MPC version 0.8.1 GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 ignoring nonexistent directory "c:\mingw\bin\../lib/gcc/mingw32/4.6.2/../../../. ./mingw32/include" ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.6.2/inclu de/c++" ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.6.2/inclu de/c++/mingw32" ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.6.2/inclu de/c++/backward" ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.6.2/inclu de" ignoring duplicate directory "/mingw/lib/gcc/mingw32/4.6.2/../../../../include" ignoring duplicate directory "c:/mingw/lib/gcc/../../include" ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.6.2/inclu de-fixed" ignoring nonexistent directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.6.2/../ ../../../mingw32/include" ignoring duplicate directory "/mingw/include" #include "..." search starts here: #include <...> search starts here:  c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++  c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/mingw32  c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/backward  c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include  c:\mingw\bin\../lib/gcc/mingw32/4.6.2/../../../../include  c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include-fixed End of search list. GNU C++ (GCC) version 4.6.2 (mingw32)         compiled by GNU C version 4.6.2, GMP version 5.0.1, MPFR version 2.4.1, MPC version 0.8.1 GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: f7eb4168c2cf10318cc29da8d23b7f3c COLLECT_GCC_OPTIONS='-v' '-shared-libgcc' '-mtune=i386' '-march=i386'  c:/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/as.exe -o C:\User s\Sean\AppData\Local\Temp\ccb0vTGl.o C:\Users\Sean\AppData\Local\Temp\ccSVBzeY.s  COMPILER_PATH=c:/mingw/bin/../libexec/gcc/mingw32/4.6.2/;c:/mingw/bin/../libexec /gcc/;c:/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ LIBRARY_PATH=c:/mingw/bin/../lib/gcc/mingw32/4.6.2/;c:/mingw/bin/../lib/gcc/;c:/ mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/lib/;c:/mingw/bin/../lib/ gcc/mingw32/4.6.2/../../../;/mingw/lib/ COLLECT_GCC_OPTIONS='-v' '-shared-libgcc' '-mtune=i386' '-march=i386'  c:/mingw/bin/../libexec/gcc/mingw32/4.6.2/collect2.exe -Bdynamic -u ___register _frame_info -u ___deregister_frame_info c:/mingw/bin/../lib/gcc/mingw32/4.6.2/.. /../../crt2.o c:/mingw/bin/../lib/gcc/mingw32/4.6.2/crtbegin.o -Lc:/mingw/bin/.. /lib/gcc/mingw32/4.6.2 -Lc:/mingw/bin/../lib/gcc -Lc:/mingw/bin/../lib/gcc/mingw 32/4.6.2/../../../../mingw32/lib -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.2/../../. . -L/mingw/lib C:\Users\Sean\AppData\Local\Temp\ccb0vTGl.o -lstdc++ -lmingw32 -l gcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel 32 -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt c:/mingw/bin/../lib/gcc /mingw32/4.6.2/crtend.o 

Stacktrace:

hello.exe [C/C++ Application]        hello.exe [9092]             Thread [1] 0 (Suspended : Signal : SIGSEGV:Segmentation fault)               libstdc++-6!_ZNSs12_Alloc_hiderC1EPcRKSaIcE() at 0x6fc89542              libstdc++-6!_ZNSsC1Ev() at 0x6fc8c38b                main() at hello.cpp:7 0x4013a7       gdb  

The problems also occur using 32 bit code::blocks or when compiled manually from the command line.

How can I fix this?

回答1:

When I tried to run the EXE on another computer that didn't have MinGW intalled, it complained:

The program can't start because libgcc_s_dw2-1.dll is missing from you computer. Try reinstalling the program to fix this problem.

Googling that error led me to the SO question The program can't start because libgcc_s_dw2-1.dll is missing

From the answer:

The libgcc_s_dw2-1.dll should be in the compiler's bin directory. You can add this directory to your PATH environment variable for runtime linking, or you can avoid the problem by adding "-static-libgcc -static-libstdc++" to your compiler flags.

So I added the flags, and the resulting program ran normally on both systems. I'm not sure why these flags were required for it to work properly on my dev system, because the MinGW bin directory is in the PATH. Can anyone provide an explinantion? Should I create a seperate question?



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!