当前位置: 首页 > news >正文

关于gcc、glibc和binutils的关系

关于gcc、glibc和binutils模块之间的关系,以及在现有系统上升级glibc
gcc、glibc和binutils模块之间的关系
1) gcc(gnu collect compiler)是一组编译工具的总称。它主要完成的工作任务是“预处理”和“编译”,以及提供了与编译器紧密相关的

运行库的支持,如libgcc_s.so、libstdc++.so等。
2) binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编

(objdump)、elf结构分析工具(readelf)、无效调试信息和符号的工具(strip)等。通常,binutils与gcc是紧密相集成的,没有binutils

的话,gcc是不能正常工作的。
3) glibc是gnu发布的libc库,也即c运行库。glibc是linux系统中最底层的api,几乎其它任何的运行库都会倚赖于glibc。glibc除了封装

linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现,主要的如下:
 (1)string,字符串处理
 (2)signal,信号处理
 (3)dlfcn,管理共享库的动态加载
 (4)direct,文件目录操作
 (5)elf,共享库的动态加载器,也即interpreter
 (6)iconv,不同字符集的编码转换
 (7)inet,socket接口的实现
 (8)intl,国际化,也即gettext的实现
 (9)io
 (10)linuxthreads
 (11)locale,本地化
 (12)login,虚拟终端设备的管理,及系统的安全访问
 (13)malloc,动态内存的分配与管理
 (14)nis
 (15)stdlib,其它基本功能
4.在现有系统上升级glibc库
glibc库,是系统中最核心的共享库和工具,所以最好不要覆盖系统默认的,如果盲目覆盖,很可能导致整个系统瘫痪,因为一般更新glibc库时

,其它所有依赖libc库的共享库都需要重新被编译一遍. 一般做好安装到: /usr/local/lib.
首先编译glibc库。注意最好令建立一个glibc-build的目录,configure时加上--enable-add-ons=linuxthreads选项。make install安装

到/usr/local下。

程序在运行的时候动态库的装载依赖于ld-linux.so.6, 所以要修改修改gcc的spec文件(/usr/lib/gcc/i486-linux-gnu/3.4.6/specs),更改

ld-linux.so.2为/usr/local/lib下的新的共享库装载器,默认情况ld-linux.so.2 在/lib/ld-linux.so.2。
编译binutils库,此时被编译出的程序会连接到/usr/local/lib下的新的libc库。注意,在configure前,需要设置ld缺省连接的路径

(LD_LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib),否则binutils会configure出错,找不到libc中的一些符号。具体步骤如下:
export LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib
mkdir binutils-build && cd binutils-build
../binutils-2.13.90.0.18/configure
make
make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib:/usr/local/lib(设置编译后的ld的缺省库搜索路径,后面的比前面的优先级高)
make install


Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被创建后,一般都复制到这两个目录中。当程序执行时需要某动态库,并且该动态库还

未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库

中的函数,以及该动态库的其它资源了。在Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种方法来指定

1.程序在编译时搜索库的路径顺序
ld-linux.so.6由gcc的spec文件中所设定
gcc --print-search-dirs所打印出的路径,主要是libgcc_s.so等库。可以通过GCC_EXEC_PREFIX来设定
LD_LIBRARY_PATH环境变量中所设定的路径,或编译的命令行中指定的-L/usr/local/lib

2.程序在运行的时候动态库的装载依赖于ld-linux.so.6的实现,搜索动态库路径的顺序:
编译目标代码时指定的动态库搜索路径
环境变量LD_LIBRARY_PATH指定的动态库搜索路径
配置文件/etc/ld.so.conf(或/usr/local/etc/ld.so.conf)中指定的动态库搜索路径
默认的动态库搜索路径/lib
默认的动态库搜索路径/usr/lib
注意:编辑完配置文件/etc/ld.so.conf后,要运行ldconfig,这样才能把内容添加到/etc/ld.so.cache中

3、二进制程序的搜索路径顺序为PATH环境变量中所设定。
如果 PATH=/usr/bin:/usr/local/bin:/bin
那么是从考前的路径往靠后的路径开始搜索

转载于:https://www.cnblogs.com/papam/archive/2009/08/31/1557590.html

相关文章:

  • VGA_HS,VS,DOTCLOCK和分辨率之间的计算
  • 图灵近期新书精彩不断,让你应接不暇
  • 远古vod5.0的安装!
  • 烫发
  • 理解T-SQL:数据库表的创建、修改、删除
  • 关于战略 - 杰克韦尔奇的5张PPT
  • Autodesk 2011系列新产品DevDay将于12月在北京/上海举行
  • Producer Consumer
  • DMZ基础及应用
  • Oracle编程高手箴言:位图索引(Bitmap Index)的故事
  • 一生有你做朋友
  • Linux+Svn+apache2安装与配置
  • sql 中要求现实数据保留两位小数
  • Forefront Security For Exchange的反病毒测试
  • Application Data转移,修改Application Data文件夹路径
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【Amaple教程】5. 插件
  • CSS实用技巧干货
  • Fabric架构演变之路
  • Fundebug计费标准解释:事件数是如何定义的?
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Linux Process Manage
  • RxJS: 简单入门
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 回顾2016
  • 老板让我十分钟上手nx-admin
  • 双管齐下,VMware的容器新战略
  • 说说我为什么看好Spring Cloud Alibaba
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​520就是要宠粉,你的心头书我买单
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • (done) 两个矩阵 “相似” 是什么意思?
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (差分)胡桃爱原石
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (三) diretfbrc详解
  • (十三)Flask之特殊装饰器详解
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转载)hibernate缓存
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .net refrector
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NetCore部署微服务(二)
  • .NET框架
  • .NET命令行(CLI)常用命令
  • .net网站发布-允许更新此预编译站点
  • .NET中使用Protobuffer 实现序列化和反序列化
  • /boot 内存空间不够
  • @我的前任是个极品 微博分析
  • [20171102]视图v$session中process字段含义
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
  • [Erlang 0129] Erlang 杂记 VI 2014年10月28日