【问题标题】:GCC Cross compile to a i586 architecture (Vortex86DX)GCC 交叉编译为 i586 架构 (Vortex86DX)
【发布时间】:2015-12-23 05:35:41
【问题描述】:

我有 Ubuntu 12.01 和 gcc 4.8.2,并希望为运行旧 2.6.23 内核的 Vortex86DX CPU 进行交叉编译。

我正在尝试以下测试代码:

#include <iostream>

int main()
{
   std::cout << "Hello world" << std::endl;
}

使用以下命令行编译:

g++ -static-libgcc -static-libstdc++ -march=i586 test.cpp -otest586

当我在目标架构上运行 test586 时,我收到了这个错误:

$ ./test586
./teste586: symbol lookup error: ./test586: undefined symbol: _ZMSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE

对这里发生的事情有任何想法吗?这只是一个小代码——真正的代码有大约 10 个不同的库,全部用 C++ 11 编写。


事实上,Marco 的评论是对的。代码还需要一些动态库:

$ ldd ./test586
linux-gate.so.1 =>  (0xb776b000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75a4000)
/lib/ld-linux.so.2 (0xb776e000)

我必须避免 all 动态库,因为目标系统要么没有它们,要么将具有非常旧的版本。

帮助实现这一目标。

【问题讨论】:

  • 看起来你缺少一些动态库,你试过 ldd ./test586 吗?
  • 我不想使用动态库,这就是为什么我选择-static 标志(目标硬件没有这个库)....我怎样才能避免使用这些库?
  • 是的,您使用 -static 是正确的,但看起来您的可执行文件仍在动态查找某些内容,ldd 会告诉您您的程序正在尝试加载哪些库以及失败的位置
  • 你是对的...非常好的观点...现在我需要帮助来避免它们...请查看已编辑的帖子。
  • 马可说得对。我们了解您不想要动态链接,但目前您ldd 将告诉您应该归咎于哪个库,为您提供如何继续调试的指导。

标签: c++ g++ cross-compiling


【解决方案1】:

我认为问题在于命令开关的顺序,即链接器首先发现依赖项(libgcc、libstdc++),然后才解决它们。 如果你在它找到依赖之前给它 -static-libgcc 那么它会简单地忽略它。

以下对我有用:

$ g++ -m32 -march=i586 test.cpp -o test586 -static -static-libgcc -static-libstdc++
$ ./test586 
Hello world
$ ldd test586 
not a dynamic executable

【讨论】:

  • 工作正常...现在我遇到了另一个问题 - 非法指令 - 它根本无法在我的 Vortex86DX 处理器上运行...尝试了 i486 和 i586。
  • 哦,我认为你必须为这个架构构建整个工具链(binutils、gcc、glibc),因为你的 Ubuntu 工具链(libc 和 libstdc++)可能使用更新的内核头文件针对 i686 进行了优化,或者所以。
  • 是的,我同意。我正在为它打开一个新话题。
  • 如果您对 vortex 上的任何二进制可执行文件使用 file 命令,它会告诉您它们是如何编译的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
相关资源
最近更新 更多