关于gcc、glibc和binutils模块之间的关系,连同在现有系统上升级glibc

2024-02-04 11:38

本文主要是介绍关于gcc、glibc和binutils模块之间的关系,连同在现有系统上升级glibc,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 关于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
那么是从考前的路径往靠后的路径开始搜索
参考文档:
http://www.yuanma.org/data/2007/1212/article_2923.htm

 

转自

http://blog.chinaunix.net/u1/49742/showart_465161.html

 

这篇关于关于gcc、glibc和binutils模块之间的关系,连同在现有系统上升级glibc的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/677371

相关文章

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文