binutils工具集之---ar

1.如果要将多个.o文件生成一个库文件,则存在两种类型的库,在linux里面后缀是.a,另一种是动态库,后缀为.so。

当可执行程序要与静态库进行链接时,所用到的库中的函数和数据会被拷贝到最终的可执行程序中。而采用动态库则不会,程序加载器在后台为我们讲所需的动态库自动加载到内存中且保证整个系统只有一份拷贝。

如果一个系统中存在多个需要同时运行的程序且这些程序之间存在共享库,那么采用动态库的形式将更节省内存。但是对于嵌入式系统,大多数情况下都是整个软件就是一个可执行程序且不支持动态加载的方式,即以静态库为主。

eg:

创建foo.c bar.c文件,

1 #include <stdio.h>
2 void bar()
3 {
4     printf("This is bar()!\n");
5 }
1 #include<stdio.h>
2 void foo()
3 {
4     printf("This is foo()!\n");
5 }

然后把这两个函数放在静态库libmy.a中,在次之前,需要将他们编译成.o目标文件,然后生成静态库。

gcc -c foo.c bar.c

ar crs libmy.a foo.o bar.o

ar的c参数表示创建一个档案文件,而r参数指示将文件增加到所创建的库文件中,s参数就是为了生成库索引以提高库被链接时的效率。

ar --help:

用法:ar [仿真选项] [-]{dmpqrstx}[abcDfilMNoPsSTuvV] [--plugin <名称>] [成员名] [计数] 归档 文件…
ar -M [<mri-脚本]
命令:
d - 从归档文件中删除文件
m[ab] - 在归档文件中移动文件
p - 打印在归档文件中找到的文件
q[f] - 将文件快速追加到归档文件中
r[ab][f][u] - 替换归档文件中已有的文件或加入新文件
s - 作为 ranlib 工作
t - 显示归档文件的内容
x[o] - 从归档文件中分解文件
特定命令修饰符:
[a] - 将文件置于 [成员名] 之后
[b] - 将文件置于 [成员名] 之前 (于 [i] 相同)
[D] - 将 0 用于时间戳和 uid/gid(默认)
[D] - 使用实际时间戳和 uid/gid
[N] - 使用名称的实例 [数量]
[f] - 截去插入的文件名称
[P] - 在匹配时使用完整的路径名
[o] - 保留原来的日期
[u] - 只替换比当前归档内容更新的文件
通用修饰符:
[c] - 不在必须创建库的时候给出警告
[s] - 创建归档索引 (cf. ranlib)
[S] - 不要创建符号表
[T] - 产生一个简单归档
[v] - 输出较多信息
[V] - 显示版本号
@<file> - 从 <file> 读取选项
--target=BFDNAME - 指定目标对象格式为 BFDNAME
可选项:
--plugin <p> - 加载指定的插件程序
仿真选项:
没有仿真特有的选项

库一旦生成,我们可以检测其可用性,main.c如下:

1 extern void foo();
2 extern void bar();
3 int main (void)
4 {
5     foo();
6     bar();
7     return 0;
8 }

执行:gcc main.c libmy.a -o app

./app

可以看到函数输出。

ar t libmy.a   可以看到libmy库的内容,(t参数,详情man)

d参数可以删除库中的目标文件:

ar d libmy.a foo.o

2.或许不如你所期

将上面的生成可执行文件命令做点更改:gcc main.c libmy.a -o app改成gcc libmy.a main.c -o app

居然报错了,找不到依赖项了:

这样可以看出,gcc对于依赖项需要从左往右指定。gcc的这种奇怪特性造成当依赖关系比较复杂时需要对同一个库在不同的位置指定多次,否则就会出现无法成功链接的情形。

3.需要知道的小东西

-L选项用于告诉gcc从哪个目录查找库文件,可以多次使用它指定多个目录;

-l(小L)选项用于告诉gcc在生成可执行程序是需要链接的库名,这一选项同样可以多次使用以指定多个库。

使用-l选项时要注意,后面所跟名字并不包括lib前缀和.a后缀,比如上面例子中的-lmy代表指定libmy.a参与链接。

测试发现,-L和-l选项有着依赖关系,可以只是用-L选项,后面使用库的全名,但是不能只使用-l选项,否则将出现erro。

时间: 2024-10-21 09:22:43

binutils工具集之---ar的相关文章

Makefile 学习&amp;binutils工具集,软件开发利器

gcc -E 能有效的帮助我们解决与宏有关的编译错误: gcc -S能获得一个C源程序文件的汇编程序: gcc -v能获得系统头文件的路径 生成依赖关系: gcc -M gcc -MM 生成不包含系统头文件的依赖关系 指定链接库: gcc -L:告诉gcc可以从哪个目录查找库文件: gcc -l :用于告诉gcc在生成可执行程序时需要链接的库名: 一.静态库生成步骤如下:步骤一:生成 str_out.o 目标文件gcc -c str_out.c注:不加 -o 则生成同名的 *.o 目标文件(st

binutils工具集之---addr2line

addr2line用于得到程序指令地址所对应的函数,以及函数所在的源文件名和行号. 在不少嵌入式开发环境中,编译器的名称往往不是gcc,而是想arm-rtems-gcc这样的,对于这种命名形式的编译器,读者通常可以找到arm-rtems-addr2line ,arm-rtems-objdump等相应名称的工具,这是GNU工具集的一种命名惯例. 本文并不是binutils工具集的完整参考手册,当需要得到更为详细的帮助信息时,可以参照对应工具的man和info信息.另一个更为简单的方法时运行相应的工

binutils工具集,软件开发利器

在binutils工具集中,以下工具是我们在做嵌入式软件开发时需要掌握的: as是汇编编译器,用于将汇编代码转换为目标文件. add2line用户得到程序指令地址所对应的函数,以及函数所在的源文件名和函号: ar用于创建和修改档案文件,以及从档案文件中抽取文件.静态库(.a文件)就是一种档案文件,需要用它生成和管理: ld:链接器: nm:用于列出程序文件中的符号及符号在内存中的(开始)地址:符号包含C程序中的函数名和变量名: objcopy:用于用来从程序文件中拷贝出我们所指定的段.代码格式转

binutils工具集之---objcopy,ranlib,size

objcopy的作用是拷贝一个目标文件的内容到另一个目标文件中.objcopy使用GNU BFD库去读或写目标文件.objcopy可以使用不同于源目标文件的格式来写目的目标文件(也即是说可以将一种格式的目标文件转换成另一种格式的目标文件).objcopy在进行目标文件的转换时,将生成一个临时文件,转换完成后就将这个临时文件删掉.objcopy使用BFD做转换工作.如果没有明确地格式要求,则objcopy将访问所有在BFD库中已经描述了的并且它可以识别的格式. 这里只介绍arm开发板中可能会用到的

binutils工具集之---objdump

在嵌入式软件开发中,有时需要知道所生成的程序文件中的段信息以分析问题,或者需要查看c语言对应的汇编代码,此时,objdump工具就可以帮大忙了.obj--object  dump:转储. #include<stdio.h> #include<time.h> int global1; int global2=3; static int static_global1; static int static_global2=3; void foo() { static int intern

OBJ文件格式分析工具: objdump, nm,ar

首先简要阐述关于gcc.glibc和 binutils模块之间的关系 一.关于gcc.glibc和binutils模块之间的关系 1.gcc(gnu collect compiler)是一组编译工具的总称.它主要完成的工作任务是"预处理"和"编译",以及提供了与编译器紧密相关的运行库的支持,如 libgcc_s.so.libstdc++.so等. 2.binutils提供了一系列用来创建.管理和维护二进制目标文件的工具程序,如汇编(as).连接(ld).静态库归档(

IBM Rational-完整的软件工程解决方案工具集

IBM,即国际商业机器公司,1911年创立于美国,是全球最大的信息技术和业务解决方案公司,其业务遍及全球170多个国家和地区.IBM软件分为五个部分,其中Rational系列是专门针对软件工程的软件工具系列.IBM提供业内最佳工具集,使整个软件开发生命周期管理自动化并支持最佳实践.IBM Rational系列不但有工具的支持,更有理论方法的支持,通过优化开发过程的每个阶段,IBM的工具充分提高数据透明度.协同工作和验证能力,确保客户更快.更好地开发出软件和系统. 产品介绍 1. IBM Rati

解决 vs2010问题 error MSB8008: 指定的平台工具集(v110)未安装或无效

在VC++编译程序时,出现如下图所示的问题: >------ 已启动生成: 项目: PhotoStore, 配置: Debug Win32 ------ 1>生成启动时间为 2013-01-15 18:10:34. 1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\Microsoft.Cpp.Win32.Targets(511,5): error MSB8008: 指定的平台工具集(v110)未安装或无效.请确保选

工具集

好用的工具集 转:http://www.yimingzhi.com/2015/03/lao-yi-de-kai-fa-gong-ju-he-lei-ku-ji-2014-ban Visual Studio 2013 扩展 Visual Studio 2013 Update 4:是目前微软发布的最新版开发工具升级包,高效而且强大.下面的扩展都是该版本的Visual Studio下的,老版本可以根据名字自行查找安装. CodeMaid: 可快速整理代码文件,清理不必要的代码和杂乱的格式.并在开发时实