关于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

相关文章

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

Ubuntu如何升级Python版本

《Ubuntu如何升级Python版本》Ubuntu22.04Docker中,安装Python3.11后,使用update-alternatives设置为默认版本,最后用python3-V验证... 目China编程录问题描述前提环境解决方法总结问题描述Ubuntu22.04系统自带python3.10,想升级

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

Nginx添加内置模块过程

《Nginx添加内置模块过程》文章指导如何检查并添加Nginx的with-http_gzip_static模块:确认该模块未默认安装后,需下载同版本源码重新编译,备份替换原有二进制文件,最后重启服务验... 目录1、查看Nginx已编辑的模块2、Nginx官网查看内置模块3、停止Nginx服务4、Nginx