GCC 交叉编译为 i586 架构 (Vortex86DX)
GCC Cross compile to a i586 architecture (Vortex86DX)
我有 Ubuntu 12.01 和 gcc 4.8.2,想交叉编译 Vortex86DX CPU 运行 旧的 2.6.23 内核。
我正在尝试以下测试代码:
#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 动态库,因为目标系统要么没有它们,要么在非常旧的版本中会有。
帮助完成这项工作表示感谢。
我认为问题在于命令开关的顺序,即链接器首先发现依赖项(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
我有 Ubuntu 12.01 和 gcc 4.8.2,想交叉编译 Vortex86DX CPU 运行 旧的 2.6.23 内核。
我正在尝试以下测试代码:
#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 动态库,因为目标系统要么没有它们,要么在非常旧的版本中会有。
帮助完成这项工作表示感谢。
我认为问题在于命令开关的顺序,即链接器首先发现依赖项(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