前言
本篇文章主要是记录我通过编译libc过程解决的一些困惑
glibc源码编译
编译部分请参考这篇博客: glibc的编译、安装和调试
为了方便以及排除一些可能的错误,我们直接选用与当前操作系统一致的glibc版本进行调试版本的编译
正文
我会在这里对glibc编译中一些感兴趣的部分进行介绍
glibc 编译
首先说明,我的GLIBC版本为2.35
所以我下载了glibc-2.35的源码进行编译
编译之后产生的文件被我放在了build
文件夹
随后通过make
将glibc
安装到/opt/glibc-2.35
目录下,我们熟悉的libc.so
在这里面
当然,libc.so
里面是指向libc.so.6
的路径,这点我们即便只看文件大小应该也能看出来,不过无关紧要了,我们只需要知道这里有libc
就够了
我们可能会看到编译之后的libc
文件远大于我们系统自带的libc
文件,
别担心,这是正常情况,这是因为我们没有剥离调试符号 且编译时未选择大小优先的优化级别 并且启用了额外的调试符号
libc 链接
现在我们或许可以开始思考libc
文件是怎么来的,为了方便拿我们熟悉的malloc
文件举例
源码经过编译后不会直接变成libc
文件,而是需要我们去将目标文件链接到一起,我们可以看到从mallloc源码编译出了四个东西malloc.o
malloc.o.d
malloc.os
malloc.os.d
其中malloc.o属于普通目标文件一般用于静态链接文件,malloc.os则属于位置无关目标文件在编译选项中选择了位置无关编译方式(-fPIC),这样他就可以用来链接为库文件,也即libc库文件。
至于.d结尾的文件,这里面存储的是malloc的依赖文件,由编译器的-MD或者-MMD选项自动生成
带调试版libc使用
废了这么大劲对libc文件编译,除了想要深入了解libc编译的过程以及源码怎么变成glibc文件以外,当然还想要使用带调试的glibc文件啦
gcc -g malloc_menu.c -Wl,--rpath=/opt/glibc-2.35/lib -Wl,--dynamic-linker=/opt/glibc-2.35/lib/ld-linux-x86-64.so.2 -o debug_SouceGlibc_malloc_menu
使用malloc_menu.c
文件进行编译,且指定libc文件和ld文件,编译为带调试符号版本。