- 浏览: 361496 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
guji528:
很好,清晰明了!
(8)python教程:几行代码搞定python 设计模式 -
poson:
为什么踩啊?
三言两语谈团队合作 -
andyhelberg:
你好,想请教一下关于应用敏捷开发在软件维护过程的经验。欢迎与我 ...
对scrum开发的感受 -
poson:
chenwq 写道可以提供behavior targeting ...
最近公司培训的算法 -
chenwq:
可以提供behavior targeting 相关材料不?先谢 ...
最近公司培训的算法
一、关于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)
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)
发表评论
-
重新设计短信查询系统
2012-03-12 23:09 0服务抓取 人工标注工具 消息中心 Query分析 索引 ... -
secureCRT常用技巧
2012-02-26 12:43 1338SecureCRT 反空闲(anti-idle)的设置方式 ... -
常用的php代码,hash,split,unset
2011-04-26 12:11 1039[size=large] <?php /** * ... -
linux 常用命令 备忘录
2010-10-13 10:47 806yum常用命令很多,需要熟悉: yum install; yu ... -
excel vba根据条件删除一行
2009-10-16 14:42 6550Sub 删除一行() Dim R As Long'For R ... -
在文件夹中查找一个字符串
2009-08-18 12:00 887find . -type f -prin ... -
尝试了阿里旺旺的sdk
2009-07-11 10:31 1951。。。。。。。。。。。。。。 -
excel表格中的数字
2007-07-20 15:06 1026excel表格中一列有的是文字有的是数字。其中的数字要在前面添 ... -
怎么改变listbox的item颜色(C#)
2008-04-18 12:41 2896C# (1)需要先设置属性: 该事件由所有者描述的 Li ... -
繁体转换简体的程序(c#)
2008-04-18 12:53 1046//big5繁体转换简体的程序public cla ... -
怎么替换excel中的问号
2008-04-21 13:59 1449查找问号只需要使用“~? ”只要在前面加一个~就行了 -
用FileSystemWatcher监视文件变化
2008-04-23 18:48 1544c#中一个非常方便的工具。以前用vc++6.0实现监视文 ... -
对单词词库按照字符长度排序。然后去除含有“-”的单词。
2008-04-25 12:17 1404excel 几个函数:search,find,len ... -
Mapinfo的一些用法
2008-04-25 13:10 15761、打开: MapInfo.Data.Table ta ... -
怎样实时更新服务器的数据
2008-04-28 15:44 8461、通过数据库服务器的trigger机制。得到变化的数据 ... -
关键词排行榜
2008-04-29 12:36 942对用户查询的关键词计数。选出每天、每周、每月的计数次数。 ... -
Sqldeveloper简单用法
2008-04-29 12:43 1709Sqldeveloper 这是一个oracle公司的免 ... -
使用dataset提高查询速度
2008-04-29 12:44 1430把数据库表放在内存中,使用dataset来管理。使用da ... -
sdk、开源工具
2008-04-30 15:58 808用HTML制作网页就象是用画笔绘制一幅图画。只有那些对网 ... -
excel相关的代码
2008-05-06 12:48 863string SheetName = "she ...
相关推荐
在Linux环境下使用Poco,你需要经历几个关键步骤:解压、编译和安装。下面我们将详细探讨这些步骤以及相关的知识点。 首先,解压Poco库。当你下载了poco-1.9.0的压缩包后,通常是一个.tar.gz或.zip文件,你需要将其...
这门课程"Linux编译与调试"旨在深入探讨这两个主题,帮助开发者提升在Linux系统上的编程效率和问题解决能力。下面我们将详细讨论相关知识点。 一、Linux编译 1. **源码管理**:在Linux环境下,通常使用Git等版本...
然而,这个“Nginx1.22.0 版本 Linux 已编译可直接使用”的压缩包提供了预编译的二进制文件,简化了部署过程,使得用户可以直接在 Linux 系统上运行,无需经历复杂的编译步骤。 Nginx 的主要功能包括: 1. **Web ...
### Linux实验十一 arm-Linux交叉编译环境搭建 #### 实验目的 本次实验的主要目标是让学生熟练掌握在Linux环境下构建arm-Linux嵌入式开发环境的过程,包括交叉编译器的搭建、安装与配置方法。通过实践操作,学生...
"编译Linux的内核文档"这一过程涉及了内核配置、驱动设置以及文件系统设置等多个环节。在进行内核编译时,我们通常会使用`make menuconfig`命令来配置内核选项。 `make menuconfig`是一个基于文本菜单的内核配置...
本文将深入探讨“Linux-kernel.zip”中的主题,包括Linux编译内核、内核调试以及80386的分段机制,这些都是Linux系统管理员和开发者必备的知识点。 首先,让我们了解一下Linux编译内核的过程。当需要对内核进行定制...
Linux 内核编译选项详解 Linux 内核编译选项是 Linux 内核编译过程中的一个重要步骤,其中包含了许多选项,用于控制内核的行为和功能。在本文中,我们将详细介绍 Linux 内核编译选项的含义和作用。 代码成熟度选项...
`.config`文件是记录这些配置选项的地方,包含了用户在编译内核时选择的模块和功能。`LinuxKernelCfg.c`、`procLinuxKernelCfg.dsp`这两个文件似乎是一个Windows环境下编写的程序,用于查看`.config`文件中的内容。 ...
在IT领域,特别是操作系统开发与维护中,Linux内核的编译与升级是一项技术含量高且过程复杂的任务。本文基于给定的文件信息,详细解析Linux内核升级过程中的关键步骤、常见问题及其解决方案,旨在为Linux系统管理员...
3. 编译过程中,系统会生成`.config`文件,记录用户在`menuconfig`中所做的选择。 通过以上步骤,我们可以定制一个符合特定需求的Linux内核。这个过程对于系统性能优化、添加特定硬件支持或修复内核问题至关重要。...
14. 表格数据:686.xlsx文件可能包含了实验数据、性能指标或者配置参数,用于记录和分析交叉编译过程中的信息。 总结,Linux交叉编译平台实验涉及到从理解交叉编译概念到配置环境、使用工具链、编译、链接、调试...
Linux 内核编译过程详解 本文档将详细介绍 Linux 内核编译过程,涵盖从安装 module-init-tools 到编译和配置 Linux 2.6.11 内核的所有步骤。 一、安装 module-init-tools module-init-tools 是一个 Linux 内核...
在Linux环境下,对C/C++程序进行编译和调试是软件开发中的基本操作。本文将详细介绍如何使用gcc/g++编译器,理解makefile的工作原理,以及如何利用gdb进行程序调试。 ### 1. gcc/g++编译器 gcc/g++是Linux下广泛...
在 Linux 系统中,qBreakpad 提供了在 C++ 应用程序中集成崩溃日志记录的功能。本文将详细介绍如何在 Linux 环境下编译和使用 qBreakpad,并探讨其与 Qt5 的集成。 首先,确保你的系统已经安装了必要的编译工具和库...
首先,实验报告的标题《OS report, 英文配图, linux编译内核添加system call》表明,本次实验的主要内容是关于在Linux操作系统上进行内核编译,并添加一个系统调用。该系统调用的作用是在终端(shell)上打印“hello...
以下是一个详细的步骤记录,教你如何在海思板上交叉编译并运行这些组件。 1. **编译libx264** 在交叉编译libx264时,你需要指定目标系统和交叉编译器。以下是一个示例配置命令: ``` ./configure --prefix=/home...
最近很多朋友咨询Linux平台下编译AFSim; 我记录了一次自己的编译过程,为大家准备了一份文档; 指导用户通过源码代码编译AFSim软件平台; 提供完整的环境依赖描述、编译流程、编译结果展示; 下载请留意:我很忙,...
### Linux内核编译知识点详解 #### 一、编译环境准备 在开始编译Linux内核之前,首先需要确保你的开发环境满足以下条件: 1. **下载内核源码**:可以从官方网址(`http://www.kernel.org/pub/linux/kernel/v2.6/`...
### Linux内核源码编译入门技术解析 #### 一、Linux内核源码的文件组织 对于初学者而言,了解Linux内核源码的基本结构是至关重要的第一步。Linux内核源码通常安装在`/usr/src/linux`目录下,并采用了一个简单但...