glibc编译方法

我们在开发过程中,有时候可能需要根据我们的业务场景对glibc进行定制化修改,因此有必要了解glibc的编译方法。通常编译glibc需要以下几个步骤:

1. 由于我们一般是在x86环境的编译服务器下编译运行在arm环境下的目标固件,因此我们通常需要利用交叉编译工具链。所以,我们首先需要指定我们的交叉编译工具链的路径。

export PATH=$PATH:/home/xxxx(交叉编译工具链路径)

2. 利用configure编译生成makefile文件

../glibc-2.28/configure --host=arm-soft-linux-guneabi --disable-profile --enable-obsolete-rpc --disable-werror --enable-add-ons CC=arm-soft-linux-gnueabi-gcc CFLAGS="-g -O2 -fPIC -U_FORTIFY_SOURCE -funwind-tables" LDFLAGS="-Wl,--dynamic-linker=/lib/ld-linux.so.3" libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes libc_cv_ssp=yes --enable-kernel=3.0.0 --prefix

注意,我们执行configure命令时和glibc的源码不能在同一个路径下,否则会报错。我们可以在源码路径外单独建立文件夹用于glibc的编译。

上面关键参数说明如下:

  • --host:指定生成库目标运行机器,即lib库最终运行的平台环境
  • --build:当前编译服务器环境。可以让编译脚本自动监测,不直接指定。(本例即没有指定)
  • CC:指定交叉编译gcc工具名称
  • CFLAGS:指定编译时参数,如

-g表示编译带符号信息,这样方便利用gdb调试(前提是没有strip);

-O2:对编译生成程序进行优化

-fPIC:生成位置无关代码

-funwind-tables:固定栈格式形式。若不指定该参数,则backstrace函数不能对生成的库获取栈回溯信息。

  • LDFLAGS:指定链接时参数,如

-Wl,--dynamic-linker=/lib/ld-linux.so.3:指定glibc的动态链接器位置。如不指定则默认动态链接器为当前编译路径,这样运行时将找不到动态链接器位置,导致系统启动失败。glibc的动态链接器位置必须放在/lib下。-Wl表示将后面的参数在链接时传递给动态链接器。

  • --enable-kernel:表示生成的glibc支持的最低内核版本
  • --prefix:指定生成的lib库运行时保存的路径。最终一直glibc交付件时存放位置必须要和prefix指定路径保持一致

注意:由于glibc生成的动态链接器ld-linux.so.3必须放在/lib下,因此编译glibc时必须指定为根目录。另外指定为根目录时,prefix后面直接空白就行,这样就是运行时保存在根目录下。若prefix指定为“/”,则最终glibc生成的libc-2.28.so中指定动态库路径为"//XXX",即指定的动态链接器路径中前面会多一个“/”。

 通过readelf -l libc-2.28.so可查看生成的libc中指定要求的动态链接器ld-linux.so.3位置。

 3. 利用make命令执行makefile脚本编译

make -j32

相关参数说明如下:

  • -j32:表示最多可以开启32个线程进行多线程编译,这样可以提高编译速度。

4. 利用make install命令安装生成最终交付件

make install DESTDIR=/home/glibc/glibc-build/output

通过上述命令可以在/home/glibc/glibc-build/output路径下生成安装glibc的交付件,包括bin、etc、include、liblibexec、sbin、share和var目录。我们需要将include下的头文件、lib下的动态库等拷贝到最终的系统中根目录下,其他的可以不需要。

注意:make install安装lib库时,若后面不指定DESTDIR参数(即安装路径),则默认安装路径和prefix指定的库运行路径保持一致。我们要注意区分库的安装路径和运行路径。DESTDIR指定的是生成的库交付件保存在编译服务器上的哪个位置,而prefix指定的是生成的库最终在目标系统上运行时存放的路径。当我们不指定DESTDIR时,则DESTDIR将和prefix保持一致。

我们在拷贝交付件到目标系统时,注意以下几点:

  • 不能对glibc中main函数的引导文件crt1.o、crti.o、crtn.o进行strip,否则main函数的入参顺序会弄反。
  • 有时候不要替换原系统中的libc_nonshared.a文件,否则会编译报错。具体原因暂时还不太清楚,有时候即使替换了也不会报错。
  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值