最近才进入linux世界,这几天一直在为我的ARM开发板做一个交叉编译工具链,参考网上的一些资源,几经波折终于做好了两套交叉编译工具链,分别为2.95.3和3.4.3(这里的版本是以所用到的gcc版本来定的)
先声明两个版本交叉编译工具所使用到的资源情况:
2.95.3:binutils-2.10.1 ; gcc-2.95.3 ; glibc-2.2.3 ;glibc-linuxthreads-2.2.3 ; linux-2.4.21+rmk2。
3.4.3 : binutils-2.15 ; gcc-code-3.4.3 ;gcc-g++3.4.3 ; glibc-2.3.5 ; glibc-linuxthreads-2.3.5 ;linux-2.6.9
ARM开发板情况:
CPUs3c2440,预装linux OS 内核版本为:2.6.13
问题:
其中2.95.3版本的交叉编译工具链已经成功编译了vivi_20030630源代码,下载到s3c2440开发板后能正常启动ARM开发板;
本想使用3.4.3的toolchain编译2.6.13内核,不想竟出现很多问题,遂编写了两个测试程序hello.c和hello.cpp,使用这两个交叉编译工具进行编译,然后使用
file hello 和file hellocpp 显示的结果都是:
ELF 32-bit LSB executable ARM,version 1 (ARM) for GNU/Linux2.0.0 dynamically linked(uses shared libs),not stripped
接下来出现的错误让我搓手不及,把编译好的这两个文件载入开发板,使其执行,都发生错误其中使用3.4.1编译的这两个文件提示的出错信息如下:
执行hello.c可执行文件helloc提示信息:
/helloc: error while loading shared libraries: ./hello: symbol __register_frame_
info, version GLIBC_2.0 not defined in file libc.so.6 with link time reference
执行hello.cpp的可执行文件hellocpp提示信息:
/hellocpp: /lib/libc.so.6: version `GLIBC_2.3' not found (required by ./hellocpp)
再使用从网上下载的3.4.1交叉编译工具链对上述两个文件进行编译,下载到目标板上却都可以正常运行,唯一不同的地方是,使用file 显示文件属性时出现的信息是:
ELF 32-bit LSB executable ARM,version 1 (ARM) for GNU/Linux2.4.3 dynamically linked(uses shared libs),not stripped
所以我的问题是:
问题一:
做交叉编译工具时,我所使用的资源与大多数网友发贴出来所使用的资源是一致的,然而做出来的交叉编译工具功能并不一致(或者说,版本是不同的)。明显的信息如上所示:ARM,version 1 (ARM) for GNU/Linux2.0.0 (我做的);ARM,version 1 (ARM) for GNU/Linux2.4.3 (网上下载的),我想知道的是,这里的GNU/Linux2.0.0 和GNU/Linux2.4.3 中的2.0.0和2.4.3是依据什么定义出来的?这个版本号与内核有什么关系吗?
问题二:
通过阅读Kernel的README可以知道内核版本对gcc,make版本的要求,那么内核版本与glibc 版本,binutils版本又有什么关系呢?如果做一个交叉编译工具,有该如何来确定glibc版本和binutils版本呢?
我知道网上有做好的交叉编译工具链可以下载使用,但抱着学习的态度,我还是决定自己做。
请论坛的大侠们多多指教,不胜感激!