glibc的编译和调试

简介:   在上一节中,我们调试了malloc,调试它需要自己下载glibc的源码,自己编译,替换linux系统的c库。  环境当时用的是ubuntu14 ,glibc版本系统默认为glibc2.
  在上一节中,我们调试了malloc,调试它需要自己下载glibc的源码,自己编译,替换linux系统的c库。
 环境当时用的是ubuntu14 ,glibc版本系统默认为glibc2.19. 我们用的是glibc2.21
 下载源码: http://ftp.gnu.org/gnu/glibc
  它需要安装linux-headers-·uname -r· 
  以及软件版本的要求:

make  3.79

gcc  4.6

binutils 2.22

texinfo 4.7

awk 3.1.2

per5  ---

sed 3.02

autoconf gettext 0.10.36

bison 2.7

由于内核比较新,所以编译的时候会提示找不到头文件等问题,需要:

点击(此处)折叠或打开

  1. 解决办法:
  2. 不是 ln –s /usr/include/asm-generic/ /usr/include/asm
  3. 而是
  4. Ln –s /usr/include/i386-linux-gnu/asm /usr/include/asm

对于 64位系统,我们需要设置cflags–march=x86-64 ;其他的默认为-march=i486/i386/i686

Ln –s  /usr/include/x86-64-linux-gnu/asm  /usr/include/asm

编译步骤:

#tar -zxvf glibc-2.21.tar.gz
#cd glibc-2.21
#export CFLAGS="-g -O2 -march=i486"
#./glibc-2.21/configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin --disable-sanity-checks

#make
#make install


在修改glibc源代码的时候,我们不免需要打印,这里可以用:
fprintf(stderr,"this is  your  val:%d...\n",val);

configure 关键选项说明:
 prefix=/usr/local/glibc  指定glibc安装目录
--with-headers=/usr/include  指定需要的系统头文件目录
 --with-binutils=/usr/bin       指定需要的系统工具目录
--with-libs=                          指定需要的库目录


有时候我们编译安装后,可能会找不到库什么的,比如 error while loading shared libraries

出现这类错误表示,系统不知道xxx.so放在哪个目录下,这时候就要在/etc/ld.so.conf中加入xxx.so所在的目录。

一般而言,有很多的so会存放在/usr/local/lib这个目录底下,去这个目录底下找,果然发现自己所需要的.so文件。

所以,在/etc/ld.so.conf中加入/usr/local/lib这一行,保存之后,再运行:/sbin/ldconfig –v更新一下配置即可


系统的库一般是一个软件链接,即libc.so.6,我的环境是:
#ls  -l   /lib/i386-linux-gnu/libc.so.6 
#lrwxrwxrwx 1 root root 32  4月 17 11:10 /lib/i386-linux-gnu/libc.so.6 -> /lib/i386-linux-gnu/libc-2.19.so

一般make会成功,但是make install的时候可能会失败,比如创建link的时候,这个时候
在你编译的目录下有一个libc.so 它就是你要的c库。只不过后来会改名字为libc-2.21.so而已,如果make install 成功
它会把系统的libc.so.6 链接到 libc-2.21.so
这里需要注意的是 :
1.  /lib /usr/lib 里面加东西,是不用修改 /etc/ld.so.conf 的,但是完了之后要调一下 ldconfig ,不然这个library会找不到
2. 想往上面两个目录以外加东西的时候,一定要修改/etc/ld.so.conf,然后再调用ldconfig,不然也会找不到
3.
如果想在这两个目录以外放lib,但是又不想在/etc/ld.so.conf中加东西(或者是没有权限加东西)。那也可以,就是export一个全局变量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找library。一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时候使用

比如我遇到的问题就是虽然make成功了,在make install的最后一步替换libc失败,导致运行依赖c库的程序都不能成功运行。
可以执行如下操作,需要知道系统的glibc版本:
 #LD_PRELOAD=/lib/i386-linux-gnu/libc-2.19.so  ls  -l    

然后在进一步操作,比如我的安装glibc到/usr/下,那么虽然make install失败,那么利用上面的执行ldconfig -V 即可,需要让/usr/lib生效.
然后删除系统的libc.so.6链接。我们的库就可以运行了。你也可以直接替换libc.so.6链接的库,都是可以的.





相关文章
|
Linux C语言 Python
CentOS7下升级GLIBC2.31
CentOS7下升级GLIBC2.31
4836 0
CentOS7下升级GLIBC2.31
|
Java
java 读取文件 获取byte[]字节 并执行Gzip的压缩和解压
java 读取文件 获取byte[]字节 并执行Gzip的压缩和解压
620 0
|
缓存 Shell Linux
【Shell 命令集合 链接器(linker)工具】Linux ld命令 将目标文件与库链接为可执行文件或库文件
【Shell 命令集合 链接器(linker)工具】Linux ld命令 将目标文件与库链接为可执行文件或库文件
909 0
|
5月前
|
人工智能 Linux API
【最全】OpenClaw保姆级部署步骤(阿里云/Win11/MacOS/Linux)+必装SKill清单+FAQ,让AI成为全能助手!
“OpenClaw只是个框架,真正让它变强的是Skills”——这是无数用户的实战心得。2026年ClawHub技能市场持续扩容,但多数用户仍面临“选技能难、用技能乱”的困境:要么找不到适配场景的工具,要么安装后不知如何发挥价值。参考文章作者从数据分析、文件管理、视频处理等核心场景出发,精选出一批高实用度技能,用真实案例验证了“装对技能=效率翻倍”的核心逻辑。
867 5
|
中间件 Linux vr&ar
Centos7升级Glibc
centos7升级glic问题
4162 0
|
JavaScript Linux C语言
【NodeJS】GLIBC_2.28 not found CentOS7不兼容Node高版本
【NodeJS】GLIBC_2.28 not found CentOS7不兼容Node高版本
5001 2
【NodeJS】GLIBC_2.28 not found CentOS7不兼容Node高版本
|
Oracle 关系型数据库 Shell
Oracle 19C RPM安装及创建非容器数据库
Oracle 19c rpm安装及创建非容器数据库
2314 0
|
人工智能 自然语言处理 搜索推荐
2024年年度CRM系统排名及使用建议
随着数字化转型的深入,客户关系管理(CRM)系统成为企业不可或缺的工具。本文综合分析了2024年市场上的主流CRM系统,包括销售易、神州云动、天衣云、简道云、悟空CRM和金蝶云之家。从品牌介绍、产品功能、优势特色到使用建议,为您提供全面的年度排名和建议。每个系统都有其独特的优势,企业应根据自身需求和预算进行选择。
|
设计模式 开发者 Python
Python中循环依赖问题及其解决方案
循环依赖是 Python 开发中需要特别注意的问题。通过重新设计模块结构、延迟导入、依赖注入、利用 Python 的动态特性以及代码重构等方法,可以有效地解决循环依赖问题。这些策略不仅有助于提高代码的可维护性和可读性,还能避免潜在的运行时错误。在实际开发中,开发者应该根据具体情况选择合适的解决方案。
|
JavaScript
【奇葩问题】vue 多个el-drawer 嵌套遮罩混乱问题解决方案,vue在<el-drawer>中嵌套<el-drawer>时遮罩bug 为了解决问题自己封装了一个简易的抽屉组件
【奇葩问题】vue 多个el-drawer 嵌套遮罩混乱问题解决方案,vue在<el-drawer>中嵌套<el-drawer>时遮罩bug 为了解决问题自己封装了一个简易的抽屉组件
1240 0

热门文章

最新文章