c++ - GCC 交叉编译为 i586 架构 (Vortex86DX)

标签 c++ g++ cross-compiling

我有带有 gcc 4.8.2 的 Ubuntu 12.01,并且想要为运行旧的 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)

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

感谢您帮助实现这一目标。

最佳答案

我认为问题在于命令切换的顺序,即链接器首先发现依赖项(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

关于c++ - GCC 交叉编译为 i586 架构 (Vortex86DX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32781281/

相关文章:

c++ - 为什么在使用 O_DIRECT 写入文件时从文件中读回数据时数据损坏

c++ - 编译器优化创建系统调用?

为 Windows 平台构建的 Qt X11 应用程序

c++ - 从命令行覆盖宏

c++ - “to_string”是't a member of “std”吗?

Lambda 使用 g++ 4.7 变慢 - 使用 g++ 4.6 更快

可以生成 Linux ARM 可执行文件的 C# 编译器

c++ - 链接到编译为 C++ 的 C 库

C++ 风格指南 : why to have non-lvalues on the left side?

c++ - 没有实例化的属性除数?