`
jubincn
  • 浏览: 242549 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
文章分类
社区版块
存档分类
最新评论

ranlib的作用

 
阅读更多

转自:http://blog.csdn.net/yuntongsf/article/details/6284517


更新静态库的符号索引表

本小节的内容相对简单。前边提到过,静态库文件需要使用“ar”来创建和维护。当给静态库增建一个成员时(加入一个.o文件到静态库中),“ar”可直接 将需要增加的.o文件简单的追加到静态库的末尾。之后当我们使用这个库进行连接生成可执行文件时,链接程序“ld”却提示错误,这可能是:主程序使用了之 前加入到库中的.o文件中定义的一个函数或者全局变量,但连接程序无法找到这个函数或者变量。

这个问题的原因是:之前我们将编译完成的.o文件直接加入到了库的末尾,却并没有更新库的有效符号表。连接程序进行连接时,在静态库的符号索引表中无法定 位刚才加入的.o文件中定义的函数或者变量。这就需要在完成库成员追加以后让加入的所有.o文件中定义的函数(变量)有效,完成这个工作需要使用另外一个 工具“ranlib”来对静态库的符号索引表进行更新。

我们所使用到的静态库(文档文件)中,存在这样一个特殊的成员,它的名字是“__.SYMDEF”。它包含了静态库中所有成员所定义的有效符号(函数名、 变量名)。因此,当为库增加了一个成员时,相应的就需要更新成员“__.SYMDEF”,否则所增加的成员中定义的所有的符号将无法被连接程序定位。完成 更新的命令是:
ranlib ARCHIVEFILE
通常在Makefile中我们可以这样来实现:
libfoo.a: libfoo.a(x.o) libfoo.a(y.o) ...
ranlib libfoo.a

它所实现的是在更新静态库成员“x.o”和“y.o”之后,对静态库的成员“__.SYMDEF”进行更新(更新库的符号索引表)。

如果我们使用GNU ar工具来维护、管理静态库,我们就不需要考虑这一步。GNU ar本身已经提供了在更新库的同时更新符号索引表的功能(这是默认行为,也可以通过命令行选项控制ar的具体行为。可参考 GNU ar工具的man手册)。

GNU工具中ar是用来制作库文件.a的,但同时还提供了一个ranlib,从手册上看ranlib相当于ar -s,为什么这样呢?

这是由于最早在Unix系统上ar程序是单纯用来打包多个.o到.a(类似于tar做的事情),而不处理.o里的符号表。Linker程序则需 要.a文件提供一个完整的符号表,所以当时就写了单独的ranlib程序用来产生linker所需要的符号信息。也就是说,产生一个对linker合 格的的.a文件需要做ar和ranlib两步 。

很快,Unix厂商就发现ranlib做得事情完全可以合并到ar里面去,于是ar程序的升级版本就包括了ranlib的功能,但早期的很多项目的Makefile都已经是按照两步式的方法生成.a,所以为了保证这些早期文件的兼容性,ranlib被保留下来了。

如今,GNU/Linux系统上,ranlib依然存在,当然大部分项目已经不使用它了,因为ar -s就做了ranlib的工作。
历史通常是进步和妥协的混合!

分享到:
评论

相关推荐

    嵌入式linux截图工具移植(精华版).pdf

    嵌入式Linux截图工具是嵌入式系统中一个非常实用的功能,它可以方便地捕获屏幕上的图像并保存为文件,这对于系统调试、故障分析以及用户体验改进等方面都有着重要的作用。 #### 二、基本原理 嵌入式Linux截图工具的...

    实验一:构建ARM平台的交叉工具链实验一:构建ARM平台的交叉工具链

    export RANLIB=ranlib export NM=nm export OBJCOPY=objcopy export STRIP=strip export OBJDUMP=objdump export INSTALL=install export MAKE=make export PATCH=patch export GZIP=gzip export TAR=tar ...

    GNU tool binutils

    7. **ranlib**:更新归档文件的索引,使得链接器可以更高效地查找库中的符号。 8. **gprof**:性能分析工具,通过分析二进制文件中的特定数据来生成程序的调用图,帮助优化代码性能。 **binutils在软件开发流程中...

    arm交叉编译工具:arm-linux-gcc 4.5.1

    - **ar**和**ranlib**:用于创建和管理静态库。 - **nm**,**objdump**,**readelf**等调试工具,帮助分析编译结果。 **4. 动态链接库的作用** 在描述中提到,ARM-Linux-GCC工具的目录下包含了制造根文件系统时...

    交叉编译工具链的创建

    1. **了解交叉编译工具链**:深入理解交叉编译的概念及其在不同平台间的重要作用。 2. **理解分步构建交叉编译工具链的方法**:掌握具体的构建流程和技术细节。 #### 交叉编译工具链介绍 交叉编译是指在一个平台上...

    制作GNU-ARM交叉编译工具链.txt

    ### 制作GNU-ARM交叉编译工具链 在嵌入式系统开发中,交叉编译工具链扮演着至关重要的角色。本文将详细介绍如何构建一个...同时,理解各个工具的作用和配置参数的意义对于优化工具链的性能和适应特定需求也非常重要。

    基于S3C2410(ARM9)的Linux2.6.14.1系统全线移植文档

    - 介绍了常用的交叉工具,如arm-linux-gcc、arm-linux-ar、arm-linux-ranlib等。 - 汇编语言介绍,包括常用伪指令、专有符号等。 - **4. 可执行生成说明** - 介绍了ldscript文件的作用及其主要符号说明和段定义。...

    linux系统移植.pdf

    - **arm-linux-ar和arm-linux-ranlib的使用**:处理静态库文件。 - **arm-linux-objdump的使用**:反汇编二进制文件。 - **arm-linux-readelf的使用**:查看ELF文件格式信息。 - **arm-linux-copydump的使用**:...

    android_prebuilts_gcc_darwin-x86_arm_arm-linux-androideabi-4.9

    标题“android_prebuilts_gcc_darwin-x86_arm_arm-linux-androideabi-4.9”指的是Android开发环境中预构建的GNU Compiler Collection (GCC)...同时,与LineageOS的关联表明它在自定义Android ROM的构建中也有重要作用。

    嵌入式linux移植详解

    - **arm-linux-ar和arm-linux-ranlib的使用**:分别用于创建静态库和更新索引信息。 - **arm-linux-objdump的使用**:用于查看目标文件的反汇编信息。 - **arm-linux-readelf的使用**:用于查看ELF文件的内部结构...

Global site tag (gtag.js) - Google Analytics