我有一个程序可以在我的开发机器上正常运行,但在仅复制必要文件的“干净机器”上测试时会产生非法指令错误。
该程序由我的共享库(从 C++ 源代码构建)和演示库用法的 C 包装示例程序组成。在开发机器上,所有内容都是在 Eclipse w/g++ 中构建的,调试和发布都工作正常。链接了许多标准库。
为了测试我可能错过的依赖项,我将 .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 世界中,exe 和 dll 在大量 Intel 和 AMD 处理器上运行,因此显然存在广泛使用的通用指令子集。我以为 gcc 也会做同样的事情?我想我会充分研究指令集/架构选项。
您可以尝试针对 i686 架构显式编译(使用 gcc 的
-march=i686
选项)。以防万一您的编译器生成了一些特定于 Core2 的指令...
引用:“开发机器是 Intel Core2 Quad,干净机器是 Pentium 4 Dual。我假设 g++ 默认使用 x86 指令的公共子集,并且处理器差异不是我的问题。”
我确实认为这是一个问题..尝试专门为该机器编译或在干净的机器上重新编译,或者获取两台相同的机器。 - 这是我的 0.02 美元。
另外,看起来你在加载 ld-linux.so 时快要死了。也许linux版本不同?
我可以想到一些你可以尝试的事情:
你正在静态初始化中死去。事情完成的顺序是特定于实现的,并且可能根据运行时版本而变化。这可能是你的问题。两台机器上的 libstdc++ 是否相同?
无论如何,存在交叉依赖关系都是不好的,如果这是问题所在,则需要重新编写代码
谢谢您的指导。我已连接外部驱动器并打开电源。现在,我将前往“备份和恢复”控制面板。到达那里后,我将单击“控制面板主页”下的“创建系统映像”。了解更多:https://www.cleaningmachines.ca/product-category/equipment/walk-behind-scrubber/