我有一个程序在我的开发机器上正常工作但在“干净机器”上进行测试时会产生非法指令错误,只有必要的文件被复制。
该程序包含我的共享库,它是用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会这样做吗?我猜我会完全研究指令集/架构选项。
答案 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)
我可以想到你可以尝试的几件事:
答案 3 :(得分:1)
你在静态初始化中死亡。事情完成的顺序是特定于实现的,并且可以根据运行时版本而变化。这可能是你的问题。两台机器上的libstdc ++是一样的吗?
无论如何都存在交叉依赖关系是不好的,如果结果是问题,你需要重新编写代码