linux lib

设置C链接库glibc


进行到这一步的时候, 需要保证正确地设置了内核头文件, 因为glibc要用到内核头文件!

进入build-tools目录, 下载
glibc-2.2.3
以及glibc-linuxthreads-2.2.3.tar.gz

解压glibc, 并打补丁

$ cd $PRJROOT/build-tools
$ tar -xvzf glibc-2.2.3.tar.gz
$ tar -xzvf glibc-linuxthreads-2.2.3.tar.gz --directory=glibc-2.2.3

配置glibc

$ cd build-glibc
$ CC=arm-linux-gcc ../glibc-2.2.3/configure --host=$TARGET  --prefix="/usr"--enable-add-ons --with-headers=$TARGET_PREFIX/include


CC=arm-linux-gcc 把 CC 变量设成你刚编译完的boostrap gcc, 用它来编译你的glibc.

--host=$TARGET 告诉该链接库在目标系统上执行, 而非在本地主机.

--prefix="/usr" 告诉配置脚本在目标板的根文件系统中glibc的位置.

--enable-add-ons 告诉配置脚本使用我们下载的附加包. 已经将glibc-linuxthreads-2.2.3放入了 glibc 源码目录中. 由于我们只添加了一个附加包, 这里--enable-add-ons等价于 --enable-add-ons=linuxthreads. (如果使用glibc-2.1.x, 需要使用glibc-crypt附加包, 就得使用: --enable-add-ons=linuxthreads, crypt选项).

--with-headers 告诉 glibc 我们的linux 内核头文件的目录位置.

编译并安装glibc

$ make
$ make install_root=$TARGET_PREFIX prefix="" install

install_root 指定了安装链接库组件的目录, 将glibc安装到与我们项目相关的目录, 而非/usr目录.

如果不指定prefix="", 那么glibc会被安装到$TARGET_PREFIX/usr/lib目录中. 指定prefix使glibc被安装到 $TARGET_PREFIX/lib目录.

修改$TARGET_PREFIX/lib目录中的libc.so

$ cd $TARGET_PREFIX/lib
$ cat libc.so

libc.so的内容:
/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a )

将/lib/绝对目录去掉, 既将"GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a )"改为:
GROUP ( libc.so.6 libc_nonshared.a )

由于嵌入式系统存储功能的限制, 使用glibc生成的可执行文件比较大, 可以使用uClibc. 文末介绍了使用uClibc.

 

装uClibc


 

这里下载uClibc库. 当前最新版是 0.9.28. 下载uClibc包, 保存到build-tools目录. 使用uClibc可以不考虑gnu工具版本依赖问题, 找最新的uClibc用.

将它解压, 进入uClibc-0.2.98目录, 对uClibc进行配置. 注意: uClibc不支持在自身目录之外操作. 所以这里的配置, 安装不要新建安装目录, 就在uClibc本身的目录中进行.

配置uClibc
$ cd $PRJROOT/build-tools/uClibc-0.2.98
$ make CROSS=arm-linux- menuconfig

使用menuconfig工具进行配置, 这和linux内核配置很相. 实际上uClibc的配置系统来自Roman Zippel的内核配置系统.

CROSS设置为"arm-linux-".

进入熟悉的menuconfig界面后, 需要进行一些设置. 我有一块ARM9的开发板, 所以这里的配置都针对ARM920T. 这里只列出了部分设置. 具体可参考menuconfig中的帮助信息.

Target Architecture (arm)

Target Architecture Features and Options  --->
Target Processor Type (Arm 920T)
Target Processor Endianness (Little Endian)
[*] Target CPU has a memory management unit (MMU)
[*] Enable floating point number support
[*] Target CPU has a floating point unit (FPU)
[*]   Enable full C99 math library support
($(PRJROOT)/kernel/linux-2.4.21) Linux kernel header location
这里的内核头文件位置设置为先前包含内核头文件的路径.

General Library Settings  --->
[*] Generate Position Independent Code (PIC)
要想使用动态库, 必须选上PIC.
[*] Enable support for shared libraries

 

如果你想将所有的应用程序静态连接, 那么你可以关闭动态库支持. 但如果以后要用动态库时, 又得重新编译uClibc了(glibc也是如此). 最好选上对动态库的支持. 你可以在gcc选项中加上-static来使用静态库.

 
Library Installation Options  --->
(/lib) Shared library loader path
指定共享库的目录: 一般为/lib. 这样uClibc安装后将把共享库安装到/lib目录.

(/) uClibc runtime library directory

($(PRJROOT)/tools/uclibc) uClibc development environment directory

...

如同用menuconfig配置内核, 所有的配置都位于.config文件中. 将它删除就能恢复到缺省配置.

编译, 安装uClibc
$ make CROSS=arm-linux-
$ make CROSS=arm-linux- PREFIX="" install

所有的uClibc组件将被安装到$PRJROOT/tools/uclibc目录.

运行 $ ls -l /lib/*uC*看看:
-rwxr-xr-x  1 root root  21504 2006-05-28 21:28 ld-uClibc-0.9.28.so
lrwxrwxrwx  1 root root     19 2006-05-28 21:28 ld-uClibc.so.0 -> ld-uClibc-0.9.28.so
-rw-r--r--  1 root root 228420 2006-05-28 21:28 libuClibc-0.9.28.so

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值