`
poson
  • 浏览: 361496 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

记录linux编译

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

二、在现有系统上如何升级(redhat9上实践的)

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
(2)binutils中的ld所设定的缺省搜索路径顺序,编译binutils时指定。(可以通过“ld --verbose | grep SEARCH”来查看)

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

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

Linux下的LDD程序分析...

1、首先ldd不是一个可执行程序,而只是一个shell脚本

2、ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量,如下:LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE等。当LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的dependency,而程序并不真正执行。要不你可以在shell终端测试一下,如下:
(1) export LD_TRACE_LOADED_OBJECTS=1
    ps:使用unset LD_TRACE_LOADED_OBJECTS 取消设置
(2) 再执行任何的程序,如ls等,看看程序的运行结果

3、ldd显示可执行模块的dependency的工作原理,其实质是通过ld-linux.so(elf动态库的装载器)来实现的。我们知道,ld-linux.so模块会先于executable模块程序工作,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so选择了显示可执行模块的dependency。

4、实际上可以直接执行ld-linux.so模块,如:/lib/ld-linux.so.2 --list program(这相当于ldd program)
分享到:
评论

相关推荐

    poco c++ linux 可编译使用

    在Linux环境下使用Poco,你需要经历几个关键步骤:解压、编译和安装。下面我们将详细探讨这些步骤以及相关的知识点。 首先,解压Poco库。当你下载了poco-1.9.0的压缩包后,通常是一个.tar.gz或.zip文件,你需要将其...

    linux编译与调试

    这门课程"Linux编译与调试"旨在深入探讨这两个主题,帮助开发者提升在Linux系统上的编程效率和问题解决能力。下面我们将详细讨论相关知识点。 一、Linux编译 1. **源码管理**:在Linux环境下,通常使用Git等版本...

    Nginx1.22.0版本Linux已编译可直接使用

    然而,这个“Nginx1.22.0 版本 Linux 已编译可直接使用”的压缩包提供了预编译的二进制文件,简化了部署过程,使得用户可以直接在 Linux 系统上运行,无需经历复杂的编译步骤。 Nginx 的主要功能包括: 1. **Web ...

    Linux实验十一 arm-Linux交叉编译环境搭建

    ### Linux实验十一 arm-Linux交叉编译环境搭建 #### 实验目的 本次实验的主要目标是让学生熟练掌握在Linux环境下构建arm-Linux嵌入式开发环境的过程,包括交叉编译器的搭建、安装与配置方法。通过实践操作,学生...

    编译linux的内核文档

    "编译Linux的内核文档"这一过程涉及了内核配置、驱动设置以及文件系统设置等多个环节。在进行内核编译时,我们通常会使用`make menuconfig`命令来配置内核选项。 `make menuconfig`是一个基于文本菜单的内核配置...

    Linux-kernel.zip_linux编译内核_内核_编译内核

    本文将深入探讨“Linux-kernel.zip”中的主题,包括Linux编译内核、内核调试以及80386的分段机制,这些都是Linux系统管理员和开发者必备的知识点。 首先,让我们了解一下Linux编译内核的过程。当需要对内核进行定制...

    linux内核编译各个选项的含义[参照].pdf

    Linux 内核编译选项详解 Linux 内核编译选项是 Linux 内核编译过程中的一个重要步骤,其中包含了许多选项,用于控制内核的行为和功能。在本文中,我们将详细介绍 Linux 内核编译选项的含义和作用。 代码成熟度选项...

    linux内核编译配置查看工具

    `.config`文件是记录这些配置选项的地方,包含了用户在编译内核时选择的模块和功能。`LinuxKernelCfg.c`、`procLinuxKernelCfg.dsp`这两个文件似乎是一个Windows环境下编写的程序,用于查看`.config`文件中的内容。 ...

    Linux 内核编译升级记录

    在IT领域,特别是操作系统开发与维护中,Linux内核的编译与升级是一项技术含量高且过程复杂的任务。本文基于给定的文件信息,详细解析Linux内核升级过程中的关键步骤、常见问题及其解决方案,旨在为Linux系统管理员...

    linux内核编译.doc

    3. 编译过程中,系统会生成`.config`文件,记录用户在`menuconfig`中所做的选择。 通过以上步骤,我们可以定制一个符合特定需求的Linux内核。这个过程对于系统性能优化、添加特定硬件支持或修复内核问题至关重要。...

    Linux交叉编译平台实验.pdf.rar

    14. 表格数据:686.xlsx文件可能包含了实验数据、性能指标或者配置参数,用于记录和分析交叉编译过程中的信息。 总结,Linux交叉编译平台实验涉及到从理解交叉编译概念到配置环境、使用工具链、编译、链接、调试...

    一个Linux爱好者的2.6.11内核编译过程

    Linux 内核编译过程详解 本文档将详细介绍 Linux 内核编译过程,涵盖从安装 module-init-tools 到编译和配置 Linux 2.6.11 内核的所有步骤。 一、安装 module-init-tools module-init-tools 是一个 Linux 内核...

    LINUX下编译与调试

    在Linux环境下,对C/C++程序进行编译和调试是软件开发中的基本操作。本文将详细介绍如何使用gcc/g++编译器,理解makefile的工作原理,以及如何利用gdb进行程序调试。 ### 1. gcc/g++编译器 gcc/g++是Linux下广泛...

    qbreakpad linux下编译可以正常使用

    在 Linux 系统中,qBreakpad 提供了在 C++ 应用程序中集成崩溃日志记录的功能。本文将详细介绍如何在 Linux 环境下编译和使用 qBreakpad,并探讨其与 Qt5 的集成。 首先,确保你的系统已经安装了必要的编译工具和库...

    OS report, 英文配图, linux编译内核添加system call

    首先,实验报告的标题《OS report, 英文配图, linux编译内核添加system call》表明,本次实验的主要内容是关于在Linux操作系统上进行内核编译,并添加一个系统调用。该系统调用的作用是在终端(shell)上打印“hello...

    嵌入式海思板交叉编译ffmpeg libx264 和 libx265可以在板子上面跑起来详细步骤记录。

    以下是一个详细的步骤记录,教你如何在海思板上交叉编译并运行这些组件。 1. **编译libx264** 在交叉编译libx264时,你需要指定目标系统和交叉编译器。以下是一个示例配置命令: ``` ./configure --prefix=/home...

    AFSim2.9.0 Linux编译指南

    最近很多朋友咨询Linux平台下编译AFSim; 我记录了一次自己的编译过程,为大家准备了一份文档; 指导用户通过源码代码编译AFSim软件平台; 提供完整的环境依赖描述、编译流程、编译结果展示; 下载请留意:我很忙,...

    linux内核编译笔记

    ### Linux内核编译知识点详解 #### 一、编译环境准备 在开始编译Linux内核之前,首先需要确保你的开发环境满足以下条件: 1. **下载内核源码**:可以从官方网址(`http://www.kernel.org/pub/linux/kernel/v2.6/`...

    linux内核源码编译的入门技术.pdf

    ### Linux内核源码编译入门技术解析 #### 一、Linux内核源码的文件组织 对于初学者而言,了解Linux内核源码的基本结构是至关重要的第一步。Linux内核源码通常安装在`/usr/src/linux`目录下,并采用了一个简单但...

Global site tag (gtag.js) - Google Analytics