在调试过程中,遇到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

二、使用(将下面两个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=<value optimized out>,
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=<value optimized out>) at malloc.c:6264
#4  0x406131a0 in *__GI___libc_free (mem=<value optimized out>)
at malloc.c:3738
#5  0x4045c3dc in DVBBuffPoolReleaseBuf ()
from /usr/local/hmt/middleware/lib/libdvbtrans.so
#6  0x00014754 in _dass_DataMonitor (pdata=<value optimized out>)
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 install

就完成了编译了。

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

原文链接:https://blog.csdn.net/jianchenglee/article/details/11724363 2009-10-22 20:27 <DIR> . 2009-10-22 20:27 <DIR> .. 2009-10-22 20:09 27,425,338 gcc-3.4.3.tar.bz2 2009-10-22 20:08 7,421,782 binutils-2.10.91.0.2.tar.bz2 2009-10-22 20:08 242,445 glibc-linuxthreads-2.5.tar.bz2 2009-10-22 20:10 20,544,628 glibc-2.5.tar.gz 2009-10-22 20:20 1,720 elf-machine-rela-mips.dpatch 2009-10-22 20:26 4,727 建立基于linux的MIPS交叉编译环境 .txt 6 个文件 55,640,640 字节 2 个目录 6,793,084,928 可用字节 三、构建过程 1、准备环境 目标平台: mipsel-linux(即little endian,x86也是little endian的,不懂的话自己到网上查资料吧) 安装目录: /usr/local/crossdev 源代码安装目录: /usr/local/src 注:没有的目录请自行建立。 2、准备MIPS环境的头文件 我们是在i386下编译的,但要使用MIPS的头文件定义才能正确编译MIPS的交叉编译工具。这些头文件都在kernel源程序中。 cd /usr/local/src/ tar xzvf linux-2.4.2.tar.gz cd linux/ make ARCH=mips menuconfig 在"CPU selection"中, 选中"(R3000) CPU type",也可以选你实际的MIPS平台的CPU类型 在"General setup"中, 选中"Generate little endian code" make dep mkdir -p /usr/local/crossdev/mipsel-linux/include cp -r /usr/local/src/linux/include/asm-mips /usr/local/crossdev/mipsel-linux/include/asm cp -r /usr/local/src/linux/include/linux /usr/local/crossdev/mipsel-linux/include/ 3、编译binutils cd /usr/local/src/ tar xzvf binutils-2.11.90.0.31.tar.gz cd binutils-2.11.90.0.31/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev make install export PATH=/usr/local/crossdev/bin:$PATH 4、编译自举的(bootstrap)gcc 因为这时还没有MIPS的glibc可以使用,只能编译一个最简单的gcc,用这个gcc编译出glibc后就可以再编译一个完成的gcc了。 cd /usr/local/src/ tar xzvf gcc-3.0.2.tar.gz cd gcc-3.0.2/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev --enable-languages=c --with-newlib --disable-shared make install 注:以上编译安装的工具已经可以直接编译MIPS的kernel(make zImage)了。 5、编译glibc 现在可以使用刚才建立的binutils和gcc来编译MIPS的glibc了。 cd /usr/local/src/ tar xzvf glibc-2.2.3.tar.gz cd glibc-2.2.3/ tar xzvf ../glibc-linuxthreads-2.2.3.tar.gz patch -p1 < ../glibc-2.2.3-mips-base-addr-got.diff CC=mipsel-linux-gcc AR=mipsel-linux-ar RANLIB=mipsel-linux-ranlib ./configure --host=mipsel-linux --prefix=/usr/local/crossdev/mipsel-linux --enable-add-ons=linuxthreads make install 6、重新编译完整的gcc cd /usr/local/src/ rm -rf gcc-3.0.2/ tar xzvf gcc-3.0.2.tar.gz cd gcc-3.0.2/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev --enable-languages=c,c++ make install 以上就构建好了一套自己的MIPS交叉编译环境,目录在/usr/local/crossdev下,你可以把它打包拷贝到其它i386的Linux系统下也能使用。 要使用其来交叉编译时请先加上PATH环境变量:export PATH=/usr/local/crossdev/bin:$PATH http://man.chinaunix.net/linux/lfs/htmlbook/chapter06/chapter06.html参考具体的gcc相关软件安装 本人的联系方式为:549827768@qq.com,西华大学 我们采用crosstool0.42来作为我们编译交叉编译工具链的脚本。详细的用法说明请阅读网站上的文档crosstool-how to 。 [zzl@localhost] tar -xzvf crosstool-0.43.tar.gz [zzl@localhost]cd crosstool-0.42 我们可以看到目录下有很多.sh脚本和.dat配置文件。每一个支持的CPU都有它所相应的脚本,如我们选用demo-arm9tdmi.sh 需要我们记住的三个重要的变量: TARBALLS_DIR=$HOME/downloads #$HOME为用户的主目录,如fedora这个目录,是固定的,与$PWD为当前路径不同 RESULT_TOP=/usr/local/arm #做了更改 GCC_LANGUAGES="c,c++" 我们需要如下压缩包:gcc-3.4.1.tar.gz glibc-2.3.3.tar.gz linux-2.6.17binutils-2.15.tar.gz glibc-linuxthreads-2.3.3.tar.gz gdb6.0a.tar.gz,且还要下载内核arm补丁,给它打补丁,之后再压缩成原来格式,并删除解压的文件,只保留打补丁后的文件 下面为打补丁的格式,其中linux为linux内核解压后产生的目录: tar jxvf patch-2.4.18-rmk7.bz2;cp patch-2.4.18-rmk7 linux;cd linux;patch -p1<patch-2.4.18-rmk7 最后再次还原成原来的包文件:tar czvf linux-2.4.18.tar.gz linux ,即将linux目录及其文件打包为前面的文件名 首要任务是下载这些源代码软件包,并将它们放在/home/fedora/downloads下面,保证这些包的所有者为当前用户而不是根用户。 可以用chown usr 文件名,更改使用者,更改后的使用者为usr,我的用户名为fedora,可以用ll查看用户名 我们选择的配置是:demo-arm9tdmi.sh,其内容具体如下: #!/bin/sh set -ex TARBALLS_DIR=$HOME/downloads RESULT_TOP=/usr/local/arm #原本是:/opt/crosstool ,后修改了 export TARBALLS_DIR RESULT_TOP GCC_LANGUAGES="c,c++" export GCC_LANGUAGES # Really, you should do the mkdir before running this, # and chown /opt/crosstool to yourself so you don't need to run as root. mkdir -p $RESULT_TOP #应该先创建/usr/local/arm目录,并chmod fedora /usr/local/arm 目录的用户为fedora #-p, --parents 需要时创建目标目录的上层目录,但即使这些目录已存在也不当作错误处理 # Build the toolchain. Takes a couple hours and a couple gigabytes. eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest --gdb#增加调试器 从 eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest --gdb 可以看出,我们的gcc版本采用3.2.3,glibc版本采用2.2.5。 我们再来看gcc-3.2.3-glibc-2.2.5.dat这个文件,并做一些更改 BINUTILS_DIR=binutils-2.15 GCC_DIR=gcc-3.2.3 GLIBC_DIR=glibc-2.2.5 LINUX_DIR=linux-2.4.18 #修改后的内容,为了匹配内核 GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.2.5 GDB_DIR=gdb-6.0 #增加的内容 修改 armtdmi.dat 文件如下红色部分: KERNELCONFIG=`pwd`/arm.config TARGET=arm-9tdmi-linux-gnu(这个名字可以改成你想要的交叉工具链前缀名) TARGET_CFLAGS="-O" GCC_EXTRA_CONFIG="--with-cpu=arm9tdmi --enable-cxx-flags=-mcpu=arm9tdmi" TOOLCOMBO=3.2.3 #gcc版本号作为文件名 修改第 70 行,更改安装路径,将: PREFIX=${PREFIX‐$RESULT_TOP/$TOOLCOMBO/$TARGET} PREFIX=${PREFIX‐$RESULT_TOP/$TOOLCOMBO} #即路径最终为:/usr/local/arm/3.2.3,gcc就在3.2.3的bin中 #vi /etc/profile在if代码 语句中添加绝对路径 PATH=$PATH :/usr/local/arm/3.2.3/gcc-3.2.3-glibc-2.2.5/arm9tdmi-linux-gnu/bin 也可以设置为临时变量:export PATH=$PATH :/usr/local/arm/3.2.3/gcc-3.2.3-glibc-2.2.5/arm9tdmi-linux-gnu/bin 但每次开机要重启,此时我们编译器就上上述的路径中,包含arm-9tdmi-linux-gnu-gcc,arm-9tdmi-linux-gnu-g++,arm-9tdmi-linux-gnu-ld 如果gcc版本太高,可以用 yum install compat-gcc-34 ,3.4版本的gcc不过之前应该在/usr/bin下重命名gcc,以保证之后还能运行,可以查看它的版 本,cat /proc/version,用它的版本号来重命名,gcc -v查看当前gcc版本号 ftp://ftp.sunet.se/pub/Linux/distributions/scientific/53/i386/SL/ 上面这个网站中有一些低版本的gcc和glibc,另外还有一些nfs工具等等,其中就有以compat开头的gcc和glibc,另外当然还有以gcc、glibc开头的 specs文件最后在/usr/local/arm/3.2.3/gcc-3.2.3-glibc-2.2.5/arm9tdmi-linux-gnu/lib中,specs文件中一般有一句/lib/ld-linux.so.2,有可能要修改为自己的 2009-10-22 20:27 <DIR> . 2009-10-22 20:27 <DIR> .. 2009-10-22 20:09 27,425,338 gcc-3.4.3.tar.bz2 2009-10-22 20:08 7,421,782 binutils-2.10.91.0.2.tar.bz2 2009-10-22 20:08 242,445 glibc-linuxthreads-2.5.tar.bz2 2009-10-22 20:10 20,544,628 glibc-2.5.tar.gz 2009-10-22 20:20 1,720 elf-machine-rela-mips.dpatch 2009-10-22 20:26 4,727 建立基于linux的MIPS交叉编译环境 .txt 6 个文件 55,640,640 字节 2 个目录 6,793,084,928 可用字节 三、构建过程 1、准备环境 目标平台: mipsel-linux(即little endian,x86也是little endian的,不懂的话自己到网上查资料吧) 安装目录: /usr/local/crossdev 源代码安装目录: /usr/local/src 注:没有的目录请自行建立。 2、准备MIPS环境的头文件 我们是在i386下编译的,但要使用MIPS的头文件定义才能正确编译MIPS的交叉编译工具。这些头文件都在kernel源程序中。 cd /usr/local/src/ tar xzvf linux-2.4.2.tar.gz cd linux/ make ARCH=mips menuconfig 在"CPU selection"中, 选中"(R3000) CPU type",也可以选你实际的MIPS平台的CPU类型 在"General setup"中, 选中"Generate little endian code" make dep mkdir -p /usr/local/crossdev/mipsel-linux/include cp -r /usr/local/src/linux/include/asm-mips /usr/local/crossdev/mipsel-linux/include/asm cp -r /usr/local/src/linux/include/linux /usr/local/crossdev/mipsel-linux/include/ 3、编译binutils cd /usr/local/src/ tar xzvf binutils-2.11.90.0.31.tar.gz cd binutils-2.11.90.0.31/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev make install export PATH=/usr/local/crossdev/bin:$PATH 4、编译自举的(bootstrap)gcc 因为这时还没有MIPS的glibc可以使用,只能编译一个最简单的gcc,用这个gcc编译出glibc后就可以再编译一个完成的gcc了。 cd /usr/local/src/ tar xzvf gcc-3.0.2.tar.gz cd gcc-3.0.2/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev --enable-languages=c --with-newlib --disable-shared make install 注:以上编译安装的工具已经可以直接编译MIPS的kernel(make zImage)了。 5、编译glibc 现在可以使用刚才建立的binutils和gcc来编译MIPS的glibc了。 cd /usr/local/src/ tar xzvf glibc-2.2.3.tar.gz cd glibc-2.2.3/ tar xzvf ../glibc-linuxthreads-2.2.3.tar.gz patch -p1 < ../glibc-2.2.3-mips-base-addr-got.diff CC=mipsel-linux-gcc AR=mipsel-linux-ar RANLIB=mipsel-linux-ranlib ./configure --host=mipsel-linux --prefix=/usr/local/crossdev/mipsel-linux --enable-add-ons=linuxthreads make install 6、重新编译完整的gcc cd /usr/local/src/ rm -rf gcc-3.0.2/ tar xzvf gcc-3.0.2.tar.gz cd gcc-3.0.2/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev --enable-languages=c,c++ make install 以上就构建好了一套自己的MIPS交叉编译环境,目录在/usr/local/crossdev下,你可以把它打包拷贝到其它i386的Linux系统下也能使用。 要使用其来交叉编译时请先加上PATH环境变量:export PATH=/usr/local/crossdev/bin:$PATH http://blog.csdn.net/shell2522/article/details/5798884 ================================================================================ 对于交叉编译工具链,本人参照原文编译时遇到了不少问题,这里将我的修改方案贴在这里,以供大家参考 2019独角兽企业重金招聘Python工程师标准>>> glibc下载地址:http://ftp.gnu.org/gnu/glibc/这里下载 glibc-2.15:http://ftp.gnu.org/gnu/glibc/glibc-2.15.tar.gzglibc-ports-2.15:http://ftp.gnu.org/gnu/glibc/glibc-ports-2.... 2.6.32-754.el6.x86_64 //各个版本的glibc可以从http://ftp.gnu.org/gnu/glibc/找,包括其插件glibc-port,最新到2.20,我保守的选择2.15 //对于低版本glibc,还有glibc-li... ubuntu版本:ubuntu 14.04 交叉编译工具链:OpenWrt-Toolchain-ramips-mt7628_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-i686 编译:libosip2-3.5.0、libeXosip2-3.5.0 报错内容: 1、libosip2-3.5.0 checking... 最近在使用arm-linux的过程中遇到了各种各样的问题,通过网络找到了一些解决方法,现在汇总一下,希望能对遇到类似困扰的兄弟们有所帮助,这篇总结是我自己写的,上面大部分方法都是从网上找的,没有注明出处,望原作者见谅工具:1.host :ubuntu8.042.linux-kernel :2.4.18-rmk73.arm-linux-gcc :2.95.3url:4.arm-linux-gdb :... v\:* {behavior:url(#default#VML);}o\:* {behavior:url(#default#VML);}w\:* {behavior:url(#default#VML);}.shape {behavior:url(#default#VML);}Normal07.8 磅02falsefalsefalseMicrosoftInternetExplorer4st1\:*{... 环境kali 2017.2为什么写这篇记录其实这个主要是之前调试linux堆漏洞的时候,崩溃的定位有点困难,尤其是free的时候出错的时候,之前硬跟了free的汇编半天才找到问题,心累啊~步骤0x01 修改/etc/apt/sources.list,将deb-src那条记录前面的注释去掉,我的修改后如下:root@kali:~# cat /etc/apt/sources.list # # deb c