我有一个程序在我的开发机器上正常工作但在"干净机器"上进行测试时会产生非法指令错误,其中只有必要的文件被复制.
该程序包含我的共享库,它是从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会这样做吗?我猜我会完全研究指令集/架构选项.
| 归档时间: |
|
| 查看次数: |
5434 次 |
| 最近记录: |