文档章节

gcc/glibc/binutils模块简介

w
 wangdy
发布于 2016/07/14 17:32
字数 1154
阅读 25
收藏 2
点赞 0
评论 0

一、关于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,其它基本功能

        gcc 和 libc 是互相依赖的两个软件,它们合作的方式类似 Linux 系统的 "自举"。先在一个可以运行的带有老 libc 和 gcc 的系统上,用老 gcc 编译出一个新版本的 gcc + 老 libc,再用这个新 gcc 编译出一个新 gcc + 新 libc,再用这套东东编译整个新系统。

        glibc版本查看:

        1) # /lib/libc.so.6

            # /lib/libstdc++.so.6

        2) # ldd --version

        3) # readelf -s ltrace  | grep -oP "GLIBC_[\d\.]*" | sort | uniq

            "ltrace"是系统中的命令

 

  二、在现有系统上如何升级

  1、升级这些库时,最好不要覆盖系统中缺省的;因为这些库,尤其是glibc库,是系统中最核心的共享库和工具,如果盲目覆盖,很可能导致整个系统瘫痪,因为一般更新glibc库时,其它所有以来libc库的共享库都需要重新被编译一遍。因此,为了调试某个程序进入glibc时,最好把glibc安装到/usr/local/lib下。

  2、首先编译glibc库。注意最好令建立一个glibc-build的目录,configure时加上–enable-add-ons=linuxthreads选项。make install安装到/usr/local下。

  3、修改gcc的spec文件(/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specs),更改ld-linux.so.2为/usr/local/lib下的新的共享库装载器。

  4、编译binutils库,此时被编译出的程序会连接到/usr/local/lib下的新的libc库。注意,在configure前,需要设置ld缺省连接的路径(LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib),否则binutils会configure出错,找不到libc中的一些符号。具体步骤如下:
 
  (1)export LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib
  (2)mkdir binutils-build && cd binutils-build
  (3)../binutils-2.13.90.0.18/configure
  (4)make
  (5)make -C ld clean
  (6)make -C ld LIB_PATH=/usr/lib:/lib:/usr/local/bin(设置编译后的ld的缺省库搜索路径,后面的比前面的优先级高)
  (7)make install

  三、总结

  1、运行时,动态库的装载依赖于ld-linux.so.6的实现,它查找共享库的顺序如下:
 
  (1)ld-linux.so.6在可执行的目标文件中被指定,可用readelf命令查看
  (2)ld-linux.so.6缺省在/usr/lib和lib中搜索;当glibc安装到/usr/local下时,它查找/usr/local/lib
  (3)LD_LIBRARY_PATH环境变量中所设定的路径
  (4)/etc/ld.so.conf(或/usr/local/etc/ld.so.conf)中所指定的路径,由ldconfig生成二进制的ld.so.cache中

  2、编译时,搜索库的路径顺序如下:
 
  (1)ld-linux.so.6由gcc的spec文件中所设定
  (2)gcc –print-search-dirs所打印出的路径,主要是libgcc_s.so等库。可以通过GCC_EXEC_PREFIX来设定
  (3)LIBRARY_PATH环境变量中所设定的路径,或编译的命令行中指定的-L/usr/local/lib 
  (4)binutils中的ld所设定的缺省搜索路径顺序,编译binutils时指定。(可以通过“ld –verbose | grep SEARCH”来查看)

  3、二进制程序的搜索路径顺序为PATH环境变量中所设定。一般/usr/local/bin高于/usr/bin

  4、编译时的头文件的搜索路径顺序,与library的查找顺序类似。一般/usr/local/include高于/usr/include

© 著作权归作者所有

共有 人打赏支持
w
粉丝 6
博文 111
码字总数 109707
作品 0
闵行
后端工程师
关于gcc、glibc和binutils模块之间的关系

转 http://www.mike.org.cn/articles/linux-about-gcc-glibc-and-binutils-the-relationship-between-modules/ 一、关于gcc、glibc和binutils模块之间的关系   1、gcc(gnu collect compile......

乔三爷 ⋅ 2014/02/07 ⋅ 0

关于gcc、glibc和binutils模块之间的关系,以及在现有系统上如何升级的总结(转)

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

jccpp ⋅ 2013/07/29 ⋅ 0

浅析gcc、arm-linux-gcc和arm-elf-gcc的关系

浅析gcc、arm-linux-gcc和arm-elf-gcc的关系 嵌入式开发交流群280352802,欢迎加入! 一、GCC简介 The GNU Compiler Collection,通常简称 GCC,是一套由 GNU 开发的编译器集,为什么是编辑器...

长平狐 ⋅ 2013/06/03 ⋅ 1

如何为嵌入式开发建立交叉编译环境

导读:   未显示需要 JavaScript 的文档选项   级别: 初级   2005 年 9 月 01 日   在进行嵌入式开发之前,首先要建立一个交叉编译环境,这是一套编译器、连接器和libc库等组成的开...

文艺小青年 ⋅ 2017/06/29 ⋅ 0

我的arm-gcc工具编译安装过程

我的编译环境是在xubuntu里,开始前确认环境里有texinfo, gawk(注意mawk编译glibc header时会有问题), bison, flex,没有就安装它们。 工作的目录是用户目录下 源文件放在目录crosssource里 ...

jtihj ⋅ 2009/09/26 ⋅ 0

Ubuntu11.04中搭建交叉编译环境(arm-linux-gcc-4.6.1版本)

Ubuntu11.04中搭建交叉编译环境(arm-linux-gcc-4.6.1版本) 声明:本文主要参考http://blog.csdn.net/xtxiaotian/article/details/6836739,并根据实际情况作了一定的修改与说明 编译环境:...

tangming ⋅ 2012/01/03 ⋅ 0

交叉编译环境

http://www.cnblogs.com/qianxudetianxia/p/3681890.html 交叉编译:就是在一个平台上生成另一个平台上的可执行代码。如x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统...

SibylY ⋅ 2014/11/17 ⋅ 0

嵌入式交叉工具链编译

读者可能会有疑问,为什么要用交叉编译器?交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台 (X86 CPU)上编译出能运行在以ARM为内核的CPU...

流云的博客 ⋅ 2015/04/30 ⋅ 0

制作mipsel 交叉工具链

在 ~/code 下建立目录 cross-compile, 在 cross-compile 下建立setup, 保存下载的文件: ls ~/code/cross-compile/setup/ binutils-2.24.tar.bz2 gcc-4.6.4.tar.bz2 glibc-2.18.tar.bz2 glib......

active_health ⋅ 2016/06/07 ⋅ 0

LFS遇到的一些问题之准备阶段

本机宿主系统archlinux,lfs SVN-20130711,参考文档 1.在离开或重新进入当前工作环境 (比如 su 成为root或者其他用户) 时不要忘记检查$LFS是否设置好。 echo $LFSexport LFS=/mnt/lfs 2.这个...

好铁 ⋅ 2014/04/15 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

笔试题之Java基础部分【简】【一】

基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法,其他 1.length、length()和size() length针对...

anlve ⋅ 7分钟前 ⋅ 0

table eg

user_id user_name full_name 1 zhangsan 张三 2 lisi 李四 `` ™ [========] 2018-06-18 09:42:06 星期一½ gdsgagagagdsgasgagadsgdasgagsa...

qwfys ⋅ 32分钟前 ⋅ 0

一个有趣的Java问题

先来看看源码: public class TestDemo { public static void main(String[] args) { Integer a = 10; Integer b = 20; swap(a, b); System.out......

linxyz ⋅ 36分钟前 ⋅ 0

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 今天 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 8

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部