工作程序在“清洁机器”上获得非法指令错误?

我有一个在我的开发机器上正常工作的程序,但是在只有必要的文件被复制的“干净的机器”上testing时会产生一个非法的指令错误。

该程序由我的共享库(由C ++源代码构build而成)以及一个演示库用法的C封装示例程序组成。 在开发机器上,所有的都是用Eclipse w / g ++编译的,Debug和Release都能正常工作。 一些标准的图书馆被链接在。

为了testing我可能错过的依赖关系,我将.c文件,库的.so文件和库.h文件复制到新的Linux安装目录,并使用与Eclipse相同的发行版编译选项创build的简单脚本进行编译/链接正在使用。 两台机器都有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 

我不知道为什么它在NodeLock.cpp中运行静态构造器。 我没有在该文件中的任何静态/全局对象,也没有该类的任何静态/全局对象的任何地方。

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

任何build议,还有什么可以看看赞赏。 我试图避免在清洁机器上安装所有库源代码和依赖项。

对于rmn的回答和John Boker的评论:在Windows世界中,exes和dll运行在众多的Intel和AMD处理器上,所以显然有一个广泛使用的通用子集指令。 我以为海湾合作委员会也会这样做? 猜猜我会充分研究指令集/架构选项。

您可以尝试为i686体系结构显式编译(对于gcc使用-march=i686选项)。 以防万一你有编译器生成的一些特定于Core2的指令…

引用:“开发机器是英特尔酷睿2四核处理器,清理机器是奔腾4双核处理器,我假定g ++默认使用x86指令的一个公共子集,处理器的差异不是我的问题。

我认为这是一个问题。请尝试为该机器专门编译或在清理机器上重新编译,或者得到两个相同的机器。 – 这是我的0.02美元。

另外,看起来你正在加载ld-linux.so。 也许linux版本有所不同?

我可以想一些你可以尝试的东西:

  1. 你使用超越-O3的任何优化? 也许旧的系统不支持它。
  2. 你可能已经检查过了,但是你是否已经检查了系统中的二进制文件的MD5与目标系统?
  3. 你的库是否在执行多线程? 如果是这样,由于内核数量不同,所以也许你在某个地方遇到了竞争情况

你正在死于静态初始化。 事情完成的顺序是特定于实现的,并且可以根据运行时版本而有所不同。 这可能是你的问题。 两台机器上的libstdc ++是一样的吗?

不管怎么说,交叉依赖关系都是不好的,如果事实证明是这样的话,你需要重新编写代码