工作程序在"清洁机器"上出现非法指令错误?

Ste*_*ows 4 c++ linux gdb g++

我有一个程序在我的开发机器上正常工作但在"干净机器"上进行测试时会产生非法指令错误,其中只有必要的文件被复制.

该程序包含我的共享库,它是从C++源代码构建的,以及一个演示库使用情况的C包装器示例程序.在开发机器上,所有都是用Eclipse w/g ++构建的,Debug和Release都可以正常工作.链接了许多标准库.

为了测试我可能错过的依赖项,我将.c文件,我的库的.so文件和库.h文件复制到新的Linux安装中,并使用Eclipse创建的简单脚本编译/链接它们.正在使用.两台机器都有g ++ 4.3.2.

当我在干净的机器上运行程序时,它会在打印"非法指令"后立即退出.

在gdb中运行会产生:

(gdb) run
Starting program: /home/sfallows/Source/Apps/MySample/MySample 
[Thread debugging using libthread_db enabled]
[New Thread 0xb5c4ca90 (LWP 7063)]

Program received signal SIGILL, Illegal instruction.
[Switching to Thread 0xb5c4ca90 (LWP 7063)]
0xb7f0cb29 in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at /usr/include/c++/4.3/iostream:77
77   static ios_base::Init __ioinit;
Current language:  auto; currently c++
(gdb) bt
#0  0xb7f0cb29 in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at /usr/include/c++/4.3/iostream:77
#1  0xb7f0cb48 in global constructors keyed to _ZN8NodeLockC2Ev () at ../NodeLock.cpp:194
#2  0xb7f204ad in __do_global_ctors_aux () from /home/sfallows/Source/Apps/MySample/libMyLib.so
#3  0xb7ee5c80 in _init () from /home/sfallows/Source/Apps/MySample/libMyLib.so
#4  0xb7fe1de4 in ?? () from /lib/ld-linux.so.2
#5  0x00000001 in ?? ()
#6  0xbf8e6b74 in ?? ()
#7  0xbf8e6b7c in ?? ()
#8  0x00000007 in ?? ()
#9  0xbf8e6b2c in ?? ()
#10 0x00000001 in ?? ()
#11 0x00000001 in ?? ()
#12 0xb7feeff4 in ?? () from /lib/ld-linux.so.2
#13 0x00000000 in ?? ()
(gdb) Quit
Run Code Online (Sandbox Code Playgroud)

我不确定它为什么在NodeLock.cpp中运行静态construtors.我在该文件中既没有任何静态/全局对象,也没有该类的任何静态/全局对象.

开发机器是Intel Core2 Quad,清洁机器是Pentium 4 Dual.我假设g ++默认使用x86指令的公共子集,并且处理器差异不是我的问题.

任何建议还有什么值得赞赏的.我试图避免在干净的机器上安装所有库源和依赖项.

对于rmn的答案和John Boker的评论:在Windows世界中,exes和dll运行在过多的Intel和AMD处理器上,所以显然有一个广泛使用的常用指令子集.我以为gcc会这样做吗?我猜我会完全研究指令集/架构选项.

Mar*_*ner 8

您可以尝试显式编译i686体系结构(使用-march=i686gcc选项).以防您的编译器生成一些特定于Core2的指令...