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

时间:2010-02-11 21:44:28

标签: 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

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

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

任何有关其他内容的建议表示赞赏。我试图避免在干净的机器上安装所有库源和依赖项。

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

4 个答案:

答案 0 :(得分:8)

您可以尝试为i686架构明确编译(使用gcc的-march=i686选项)。以防您的编译器生成一些特定于Core2的指令...

答案 1 :(得分:2)

引用:“开发机器是Intel Core2 Quad,而干净的机器是Pentium 4 Dual。我假设g ++默认使用x86指令的通用子集,并且处理器差异不是我的问题。”

我认为这是一个问题。尝试专门为该机器编译或在清洁机器上重新编译,或者获得两台相同的机器。 - 这些是我0.02美元。

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

答案 2 :(得分:1)

我可以想到你可以尝试的几件事:

  1. 您使用的是-O3以外的任何优化吗?也许旧系统不支持它。
  2. 您可能已经检查了这个,但是您是否检查过系统中二进制文件的md5与目标系统的对比?
  3. 您的图书馆是否正在进行多线程处理?如果是这样,由于核心数量不同,那么也许你在某个地方遇到了竞争条件

答案 3 :(得分:1)

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

无论如何都存在交叉依赖关系是不好的,如果结果是问题,你需要重新编写代码

相关问题