使用PPC构建时崩溃二进制文件

时间:2016-07-05 16:46:28

标签: c++ linker powerpc

我正在为一些使用PowerPC Architechture的电路板开发一个程序。我刚刚对存储库进行了一些更改,重构了一些并移动并删除了类。

在我的开发机器(VM linux x64)上,二进制文件构建正常且可执行。当我使用CorssCompile工具链构建时,它可以顺利运行,没有任何错误或警告。但是在目标系统上我无法运行程序,它似乎甚至没有进入主要入口点。

所以我的猜测是,我以某种方式在项目中创建了一个链接问题。我只是不知道如何解开那只野兽。

所以我的问题是,如何在达到主要入口点之前找到错误的底部。如何找到可能的循环依赖关系。

只是为了"有趣":为什么在神的名字中它会在x86上构建并运行,而不是在ppc上运行。

是的,我知道这些信息很少能真正帮到我,但我想问的是方向。因为无论如何我将不得不处理这些问题。

1 个答案:

答案 0 :(得分:2)

  

为什么在神的名字中它会在x86上构建并运行,而不是在ppc上运行。

有一百万种可能的原因,从破碎的交叉工具链,到libc中的错误,到错误的工具链调用。

  我要求指示

您应该首先编译此来源:

int main() { return 0; }

并验证它是否有效(这验证了基本的工具链健全性)。如果是,则将其扩展为打印内容。然后使用您在实际项目中使用的标志进行编译。

如果所有这些检查完毕,您可以在strace和/或GDB下运行您的真实项目,看看您是否了解崩溃发生的位置。如果不这样做,请使用工具的输出编辑您的问题,有人可能会猜得更好。

<强>更新

  

似乎PPC工具链或者更确切地说它的编译器不知道如何处理在使用后声明的静态变量

如果确实如此,则会出现编译错误。你没有,所以这是假的。

  

On Target:“gdb crashing / app”,然后查看框架,某处有一个“__static_initialization_and_destruction_0”框架,它甚至可以指向文件和行,但尚未使用的静态变量被使用。

你的真正的问题非常可能是这样的:不同翻译单元(即不同的源文件)中构造全局(或类静态)变量的顺序是未定义的(通常在{{之间相反) 1}}和x86_64)。如果你在不同的文件中有两个这样的全局变量(比如ppcA),如果B的构造函数依赖于已经构造的B,那么你的程序将会工作在A之前构建A的平台上很好,但在B之前尝试构建B的平台上会崩溃。