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

Crashing binary when building with for PPC

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

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

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

所以我的问题是,我怎样才能找到到达主入口点之前发生的错误的根源。我怎样才能找到可能存在的循环依赖关系。

而且只是为了 "fun":为什么它会在 x86 上而不是在 ppc 上构建和 运行 上帝的名字。

是的,我知道这些信息很少能真正提供帮助,但我是在问路,有点。因为无论如何我有时不得不处理这些问题。

Why in gods name would it build and run on x86 but not on ppc.

有一百万种可能的原因,从损坏的交叉工具链到 libc 中的错误,再到不正确的工具链调用。

i am asking for directions

你应该从编译这个源码开始:

int main() { return 0; }

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

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

更新:

It seems the PPC toolchain or rather its compiler did not know how to handle static variables being declared after usage

如果那是真的,你会得到一个编译错误。你没有,所以这是错误的。

On Target: "gdb crashing/app" and then look at the frames, somewhere there is a "__static_initialization_and_destruction_0" frame, which should even point you to the file and line the yet undeclared static variable is used.

你的真实问题很可能是这样的:不同翻译单元(即不同的源文件)中全局(或class-静态)变量的构造顺序是未定义(通常在 x86_64ppc 之间相反)。如果你在不同的文件中有两个这样的全局变量(比如 AB),并且如果 B 的构造函数依赖于已经构造好的 A,那么你的程序将运行在 B 之前构建 A 的平台上很好,但在 A.

之前尝试构建 B 的平台上会崩溃