2015-09-25 143 views
0

我有Ubuntu 12.01 gcc 4.8.2,并且想要为运行旧的2.6.23内核的Vortex86DX CPU进行交叉编译。GCC交叉编译为i586架构(Vortex86DX)

我正尝试下面的测试代码:

#include <iostream> 

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

正在使用下面的命令行编译:

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

当我的目标架构I'm得到这个运行test586错误:

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

有什么想法在这里发生了什么?这仅仅是一个小的代码 - 真正的代码有大约10种不同的库中的所有C++编写的11


其实从马可的评论是正确的。该代码还需要一些动态库:

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

我必须避免所有动态库为目标的系统要么没有他们或将在一个很旧的版本。

帮助赞赏完成。

+1

您似乎缺少一些动态库,你有没有试过LDD ./test586? – Marco

+0

我不想使用动态库,这就是为什么我选择'-static'标志(目标硬件没有这个库)....我怎样才能避免使用这些库? – Mendes

+2

是的你是正确使用-static,但它看起来像你的可执行文件仍然在寻找dinamically,ldd会告诉你你的程序正试图加载和哪里失败的库 – Marco

回答

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 
+0

工作正常...现在我有另一个问题 - 非法指令 - 它不会在我的Vortex86DX处理器上运行...试过i486和i586。 – Mendes

+0

哦,我认为你必须为这个架构构建整个工具链(binutils,gcc,glibc),因为你的Ubuntu工具链(libc和libstdC++)可能使用较新的内核头文件等为i686进行了优化。 – mariusm

+0

是的,我同意。我为它开了一个新话题。 – Mendes