工作程序在“干净机器”上遇到非法指令错误?

问题描述 投票:0回答:5

我有一个程序可以在我的开发机器上正常运行,但在仅复制必要文件的“干净机器”上测试时会产生非法指令错误。

该程序由我的共享库(从 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 也会做同样的事情?我想我会充分研究指令集/架构选项。

c++ linux gdb g++
5个回答
8
投票

您可以尝试针对 i686 架构显式编译(使用 gcc 的

-march=i686
选项)。以防万一您的编译器生成了一些特定于 Core2 的指令...


2
投票

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

我确实认为这是一个问题..尝试专门为该机器编译或在干净的机器上重新编译,或者获取两台相同的机器。 - 这是我的 0.02 美元。

另外,看起来你在加载 ld-linux.so 时快要死了。也许linux版本不同?


1
投票

我可以想到一些你可以尝试的事情:

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

1
投票

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

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


0
投票

谢谢您的指导。我已连接外部驱动器并打开电源。现在,我将前往“备份和恢复”控制面板。到达那里后,我将单击“控制面板主页”下的“创建系统映像”。了解更多:https://www.cleaningmachines.ca/product-category/equipment/walk-behind-scrubber/

© www.soinside.com 2019 - 2024. All rights reserved.