binutils简单使用

本文介绍了如何使用binutils中的ar工具创建、修改和提取档案文件(库文件),包括创建静态库和动态库的过程。同时,文章还提到了nm工具的作用,用于查看目标文件中的符号信息,以及objcopy用于转换目标文件格式的功能。此外,还简单提及了objdump的反汇编和readelf显示ELF文件信息的用途。
摘要由CSDN通过智能技术生成

ar

ar用于建立、修改、提取档案文件(archive)。archive是一个包含多个被包含文件的单一文件(也称之为库文件),其结构保证了可以从中检索并得到原始的被包含文件(称之为archive中的member)。member的原始文件内容、模式(权限)、时间戳、所有着和组等属性都被保存在 archive中。member被提取后,他们的属性被恢复到初始状态。

ar主要用于创建C库文件

创建静态库 
(1) 生成目标文件: 

$ gcc -Wall -c file1.c file2.c file3.c


不用指定生成.o文件名(默认生成file1.o, file2.o, file3.o)。

(2) 从.o目标文件创建静态连接库:


$ ar rv libNAME.a file1.o file2.o file3.o


ar生成了libNAME.a库,并列出库中的文件。
r : 将flie1.o, file2,o, file3.o插入archive,如故原先archive中已经存在某文件,则先将该文件删除。
v : 显示ar操作的附加信息



创建动态库(利用gcc,未用ar)

(1) 生成目标文件

$ gcc -Wall -c -fpic file1.c file2.c file3.c


-fpic: 指定生成的.o目标文件可被重定址. pic是position idependent code的缩写: 位置无关代码.

(2)生成动态库文件

$ gcc -shared -o libNAME.so file1.o file2.o file3.o


一般地, 连接器使用main()函数作为程序入口. 但在动态共享库中没有这样的入口. 所以就要指定-shared选项来避免编译器显示出错信息.

实际上, 上述的两条命令可以合并为下面这条:

$ gcc -Wall -shared -fpic -o libNAME.so file1.c file2.c file3.c



此后,将main函数所在的程序与libNAME.so连接

至此,与动态库连接的函数编译成了一个可执行文件。貌似成功了,但还差最后一步。如果直接运行该程序,会给出这样的错误信息:

error while loading shared libraries: libhello.so:
cannot open shared object file: No such file or directory


这是因为与动态库连接的程序在运行时,首先将该动态库加载到内存中,而gcc默认加载动态库文件所在目录为/usr/local/lib, /usr/lib。刚才的程序虽然能编译成功,但如果我们自己建立的动态库没有位于默认目录中,则执行时会应为无法找到它而失败。

解决办法:改变加载路径对应的环境变量,然后再执行。


export LD_LIBRARY_PATH=动态库所在目录:$LD_LIBRARY_PATH


查看archive内容

$ ar tv archiveNAME


t : 显示archive中member的内容,若不指定member,则列出所有。
v : 与t结合使用时,显示member的详细信息。

要想进了解ar的详细选项,参考ar的on-line manual


nm

nm用来列出目标文件中的符号,可以帮助程序员定位和分析执行程序和目标文件中的符号信息和它的属性。
如果没有目标文件作为参数传递给nm, n

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值