glibc库的交叉编译及使用

在调试过程中,遇到coredump堆栈信息无法跳出c库的情况,需要debug版本的c库


一、编译过程

 tar -xvf glibc-2.11.1.tar.gz
 cd glibc-2.11.1

 tar -xvf glibc-ports-2.11.tar.gz
cd glibc-ports-2.11

mkdir build_hi3716m
cd build_hi3716m/

../configure --host=arm-hisiv200-linux-gnueabi CC=arm-hisiv200-linux-gcc CFLAGS="-g -O2 -U_FORTIFY_SOURCE" --enable-add-ons  --prefix=/root/temp/lijiancheng/henan/glibc-2.11.1/build_hi3716m/installdir/ libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes --enable-kernel=2.6.0

make

二、使用(将下面两个debug版本的c库覆盖原先的c库)

 cp ./ld-linux.so.3  /lib/

cp ./libc.so.6  /lib/libc.so.6


三、效果

改动前:

#0  0x40744678 in raise () from /lib/libc.so.6
(gdb) wher
#0  0x40744678 in raise () from /lib/libc.so.6
#1  0x4074a1ec in abort () from /lib/libc.so.6
#2  0x4077f0c0 in ?? () from /lib/libc.so.6
(gdb) up
#1  0x4074a1ec in abort () from /lib/libc.so.6
(gdb) up
#2  0x4077f0c0 in ?? () from /lib/libc.so.6
(gdb) up
Initial frame selected; you cannot go up.
(gdb)


改动后:

#0  0x405c93cc in *__GI_raise (sig=6)
    at ../nptl/sysdeps/unix/sysv/linux/raise.c:67
67      ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
        in ../nptl/sysdeps/unix/sysv/linux/raise.c
(gdb) bt
#0  0x405c93cc in *__GI_raise (sig=6)
    at ../nptl/sysdeps/unix/sysv/linux/raise.c:67
#1  0x405ca92c in *__GI_abort () at abort.c:92
#2  0x406078dc in __libc_message (do_abort=,
    fmt=0x406c9904 "*** glibc detected *** %s: %s: 0x%s ***\n")
    at ../sysdeps/unix/sysv/linux/libc_fatal.c:186
#3  0x4060d858 in malloc_printerr (action=3,
    str=0x406c9aec "free(): invalid next size (fast)",
    ptr=) at malloc.c:6264
#4  0x406131a0 in *__GI___libc_free (mem=)
    at malloc.c:3738
#5  0x4045c3dc in DVBBuffPoolReleaseBuf ()
   from /usr/local/hmt/middleware/lib/libdvbtrans.so
#6  0x00014754 in _dass_DataMonitor (pdata=)
    at source/dvn_dass_demux.c:295
#7  0x40043014 in Thread_Callback_Wrapper ()
   from /usr/local/hmt/platform/lib/libosal.so
#8  0x406e7a8c in ?? () from /lib/libpthread.so.0

宿主系统:ubuntu 10.04

交叉编译工具:arm-fsl-linux-gnueabi 版本4.4.4

下载glibc的源码包:ftp://ftp.gnu.org/gnu/glibc/glibc-2.11.1.tar.gz

下载glibc-ports的源码包:ftp://ftp.gnu.org/gnu/glibc/glibc-ports-2.11.tar.gz

分别解压缩文件:

把glibc-ports-2.11文件夹重命名为ports放入glibc-2.11.1中;

在与glibc-2.11.1的同级目录下下建立一个文件夹叫:glibc

在glibc目录下编写配置脚本:

我的编译器的路径为:../cross_compiler/arm-fsl-linux-gnueabi/...

我的glibc-2.11.1的路径为:../glibc.2.11.1

 

export SRCROOT=${PWD}/..
export CC_PATH=${SRCROOT}/cross_compiler/arm-fsl-linux-gnueabi
export CROSS_COMPILE=${CC_PATH}/bin/arm-none-linux-gnueabi-
export CC=${CROSS_COMPILE}gcc
export ARCH=arm
echo "CFLAGS +=-O2 -U_FORTIFY_SOURCE" >configparm
../glibc-2.11.1/configure --host=arm-linux-gnueabi --enable-add-ons \
--with-include=$CROSS_COMPILE/arm-fsl-linux-gnueabi/include/ \
--prefix=/media/Backup/code \
libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes \
--enable-kernel=2.6.0 --with-tls --disable-profile


以上脚本是根据我的文件路径配置的,各位需要按照自己的  配置进行相应的修改。

 

解释下配置中的涵义:

 

--host=arm-linux-gnueabi 表示目标机器为 arm-linux-gnueabi

如果使用 --host=arm-linux会出现如下错误:

 

 

/tmp/ccGiL4fV.s: Assembler messages:
/tmp/ccGiL4fV.s:40: Error: selected processor does not support `rfs r1'
/tmp/ccGiL4fV.s:52: Error: selected processor does not support `wfs r3'
make[2]: *** [/media/Backup/Software/ROM1210_PVT/glibc/math/setfpucw.o] Error 1
make[2]: Leaving directory `/media/Backup/Software/ROM1210_PVT/glibc-2.11.1/math'
make[1]: *** [math/subdir_lib] Error 2
make[1]: Leaving directory `/media/Backup/Software/ROM1210_PVT/glibc-2.11.1'
make: *** [all] Error 2


上网查询的很久,感觉大致意思就是选择的目标机器不支持硬浮点计算之类的。应该就是host选择错误了吧。

 

总之修改完host选项就可以了。具体原因我也不是很清楚。求高手解答。

 

 

--enable-add-ons表示把我们加入的ports加进编译。
--with-include=$CROSS_COMPILE/arm-fsl-linux-gnueabi/include/ 就是交叉编译工具的头文件路径
--prefix=/media/Backup/code 表示安装路径
libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes 这两个其实我不知道是啥意思,应该是两个开关,根据网上资料说不加这两个可能会引起某些错误
我自己是没有发现,不过还是加进去吧。
--enable-kernel=2.6.0 设置内核最低版本
--with-tls --disable-profile 打开tls 

此外这句话是必要的:

 

echo "CFLAGS +=-O2 -U_FORTIFY_SOURCE" >configparm

如果不加入这个就会引起下面这个错误。

 

 

../misc/syslog.c: In function ‘__vsyslog_chk’:
../misc/syslog.c:123: sorry, unimplemented: inlining failed in call to ‘syslog’: function body not available
../misc/syslog.c:155: sorry, unimplemented: called from here
make[2]: *** [/home/wstone/Build/glibc/glibc-build/misc/syslog.o] Error 1
make[2]: Leaving directory `/home/wstone/Build/glibc/glibc-2.9/misc'
make[1]: *** [misc/subdir_lib] Error 2
make[1]: Leaving directory `/home/wstone/Build/glibc/glibc-2.9'
make: *** [all] Error 2

最后还有一个错误是一个宏没有定义:

ELFOSABI_ARM_AEABI

好像是我把host修改了引进的吧

没事在 定义宏 :ELFOSABI_ARM的文件里面添加一行定义

#define ELFOSABI_ARM_AEABI   ELFOSABI_ARM

这样就ok了。

我忘记了这个文件是那个了```如果出现错误了根据错误信息应该能很快的查找到的。

 

 

配置结束后

make

make install

就完成了编译了。

PS:编译可能需要root权限。

你可能感兴趣的:(杂项)