石家庄免费自助建站模板,优书网所有书单,wordpress 评论作者链接,沈阳专门做网站GCC之(8)AR二进制打包命令 Author: Once Day Date: 2025年1月23日 一位热衷于Linux学习和开发的菜鸟#xff0c;试图谱写一场冒险之旅#xff0c;也许终点只是一场白日梦… 漫漫长路#xff0c;有人对你微笑过嘛… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-C… GCC之(8)AR二进制打包命令 Author: Once Day Date: 2025年1月23日 一位热衷于Linux学习和开发的菜鸟试图谱写一场冒险之旅也许终点只是一场白日梦… 漫漫长路有人对你微笑过嘛… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-CSDN博客 参考文章: ar(1) - Linux manual page【Linux】ar命令用于创建、修改和提取静态库archive-CSDN博客Linux命令学习手册-ar - 知乎Linux ar命令介绍 和常用示例 - Link_Z - 博客园 文章目录 GCC之(8)AR二进制打包命令1. AR概述1.1 介绍1.2 档案(archive) 2. 命令参数介绍2.1 ar操作指令2.2 ar通用命令修饰符2.3 plugin选项 3. 使用技巧3.1 makefile打包二进制文件3.2 重新组合二进制文件 1. AR概述
1.1 介绍
GCC中的AR命令全称是Archive是一个用于创建、修改和提取档案archive文件的工具。档案文件通常用于将多个目标文件打包成一个文件以便于管理和分发。AR命令在Linux/Unix系统的开发和构建过程中经常使用。
以下是AR命令的一些常见用法
1创建档案文件
ar rc libmylib.a file1.o file2.o file3.o上述命令会创建一个名为libmylib.a的档案文件并将file1.o、file2.o和file3.o三个目标文件打包进去。
2查看档案文件内容
ar t libmylib.a该命令会列出libmylib.a档案文件中包含的所有目标文件。
3向档案文件中添加目标文件
ar r libmylib.a file4.o该命令会将file4.o目标文件添加到libmylib.a档案文件中。如果档案文件不存在则会创建一个新的档案文件。
4从档案文件中提取目标文件
ar x libmylib.a file2.o该命令会从libmylib.a档案文件中提取出file2.o目标文件。
5删除档案文件中的目标文件
ar d libmylib.a file3.o该命令会从libmylib.a档案文件中删除file3.o目标文件。
AR命令还有其他一些选项和用法可以通过man ar命令查看完整的文档。
在使用GCC进行编译和链接时AR命令通常用于创建静态库。静态库是一种将目标文件打包成单个文件的方式在链接阶段会被链接到最终的可执行文件中。通过使用AR命令创建静态库可以方便地管理和重用代码提高开发效率。
1.2 档案(archive)
档案(archive)是一个包含多个文件的单个文件其结构使得可以检索原始的单个文件(称为档案的成员)。
ar可以保留原始文件的内容、模式(权限)、时间戳、所有者和组并在提取时恢复。GNU ar支持成员名称任意长度但可能会根据系统配置对成员名称长度施加限制以兼容其他工具维护的档案格式。通常限制为15个字符(与a.out相关的格式)或16个字符(与coff相关的格式)。
ar被视为二进制实用程序因为这种档案通常用作包含常用子程序的库。由于库通常依赖于其他库ar还可以在指定--record-libdeps选项时记录库的依赖关系。
当指定修饰符s时ar会为档案中的可重定位目标模块创建符号索引。创建后每当ar对档案内容进行更改时(除了q更新操作)都会更新该索引。具有此索引的档案可加速链接到库的过程并允许库中的例程相互调用而无需考虑它们在档案中的位置。
可以使用nm -s或nm --print-armap列出该索引表。如果档案缺少该表可以使用另一种形式的ar(称为ranlib)仅添加该表。
GNU ar可以选择创建薄档案(thin archive)其中包含符号索引和对档案成员文件原始副本的引用。这对于在本地构建树中构建库很有用在那里可重定位对象预期保持可用而复制每个对象的内容只会浪费时间和空间。
档案可以是薄的也可以是普通的但不能同时是两者。一旦创建了档案如果不先删除它并在其位置创建新档案就无法更改其格式。
薄档案也是扁平的因此将一个薄档案添加到另一个薄档案中不会嵌套它而普通档案则会发生这种情况。相反第一个档案的元素被单独添加到第二个档案中。
档案元素的路径相对于档案本身进行存储。
可重定位目标模块是指包含机器码、数据和重定位信息的目标文件通常由编译器或汇编器生成可以在链接阶段与其他模块合并以创建可执行文件或库。
符号是指在程序中使用的变量、函数或标签的名称。符号索引可以加快链接速度因为链接器可以快速定位所需的符号而无需搜索整个档案。
2. 命令参数介绍
AR的命令帮助信息如下
ubuntu-~:$ ar --help
Usage: ar [emulation options] [-]{dmpqrstx}[abcDfilMNoOPsSTuvV] [--plugin name] [member-name] [count] archive-file file...ar -M [mri-script]commands:d - delete file(s) from the archivem[ab] - move file(s) in the archivep - print file(s) found in the archiveq[f] - quick append file(s) to the archiver[ab][f][u] - replace existing or insert new file(s) into the archives - act as ranlibt[O][v] - display contents of the archivex[o] - extract file(s) from the archivecommand specific modifiers:[a] - put file(s) after [member-name][b] - put file(s) before [member-name] (same as [i])[D] - use zero for timestamps and uids/gids (default)[U] - use actual timestamps and uids/gids[N] - use instance [count] of name[f] - truncate inserted file names[P] - use full path names when matching[o] - preserve original dates[O] - display offsets of files in the archive[u] - only replace files that are newer than current archive contentsgeneric modifiers:[c] - do not warn if the library had to be created[s] - create an archive index (cf. ranlib)[l text ] - specify the dependencies of this library[S] - do not build a symbol table[T] - deprecated, use --thin instead[v] - be verbose[V] - display the version numberfile - read options from file--targetBFDNAME - specify the target object format as BFDNAME--outputDIRNAME - specify the output directory for extraction operations--record-libdepstext - specify the dependencies of this library--thin - make a thin archiveoptional:--plugin p - load the specified plugin2.1 ar操作指令
下面是AR的常用操作指令说明
1删除(d)从归档文件中删除指定的文件。
ar d libtest.a file1.o file2.o该命令将从libtest.a归档文件中删除file1.o和file2.o文件。
2移动(m[ab])在归档文件中移动文件的位置。
ar mab libtest.a file1.o file2.o该命令将file1.o和file2.o文件移动到归档文件的末尾b选项或者开头a选项。
3打印§打印归档文件中指定文件的内容。
ar p libtest.a file1.o该命令将显示libtest.a归档文件中file1.o文件的内容。
4快速追加(q[f])将文件快速追加到归档文件的末尾。
ar q libtest.a file3.o file4.o该命令将file3.o和file4.o文件追加到libtest.a归档文件的末尾。如果使用f选项则即使归档文件不存在也会创建它。
5替换或插入(r[ab][f][u])替换归档文件中已有的文件或插入新文件。
ar r libtest.a file1.o file5.o该命令将用file5.o替换libtest.a归档文件中的file1.o如果file5.o不存在则将其插入到归档文件中。选项a和b分别表示将文件插入到归档的开头或末尾f选项表示即使归档文件不存在也会创建它u选项表示只有当文件比归档中的同名文件更新时才替换。
6符号表(s)类似于ranlib命令用于创建或更新归档文件的符号表。
ar s libtest.a该命令将创建或更新libtest.a归档文件的符号表加速对归档文件中符号的访问。
7内容列表(t[O][v])显示归档文件的内容列表。
ar tv libtest.a该命令将显示libtest.a归档文件中的文件列表。v选项提供详细输出O选项按照归档文件中的顺序显示文件列表。
8提取(x[o])从归档文件中提取指定的文件。
ar x libtest.a file1.o file2.o该命令将从libtest.a归档文件中提取file1.o和file2.o文件。o选项表示提取文件时保留原始的日期。
2.2 ar通用命令修饰符
下面是AR的通用命令修饰符介绍
1不警告([c])在创建归档文件时如果归档文件不存在AR不会显示警告信息。这在脚本或自动化流程中很有用可以避免不必要的警告输出。
ar cr libtest.a file1.o file2.o2符号表索引([s])在创建归档文件时AR会同时创建归档文件的符号表索引类似于ranlib命令的功能。这样可以加速对归档文件中符号的访问特别是在大型项目中使用归档文件作为库时非常有用。
ar rs libtest.a file1.o file2.o3依赖关系([l])指定当前库文件的依赖关系。这个选项可以在归档文件中记录其所依赖的其他库文件方便管理复杂的库依赖关系。
ar rl libdep1.a libdep2.a libtest.a file1.o file2.o4不生成符号表([S])在创建归档文件时AR不会生成符号表。这可以减小归档文件的大小但会影响对归档文件中符号的访问效率。
ar rS libtest.a file1.o file2.o5详细输出([v])在执行操作时AR会显示详细的信息包括正在处理的文件名、操作结果等。这对于调试和理解AR的行为非常有帮助。
ar rvx libtest.a file1.o file2.o6版本号([V])显示AR的版本号。这个选项可以用于检查当前系统中AR的版本以确保兼容性。
ar V7读取选项文件()从指定的文件中读取AR命令选项。这个功能可以将一组常用的AR选项存储在文件中然后通过选项来引用从而简化AR命令的编写。
ar options.txt8目标文件格式(--targetBFDNAME)指定目标对象文件格式为BFDNAME。这个选项可以让AR适应不同的目标平台和文件格式提高其灵活性和可移植性。
ar --targetelf64-x86-64 r libtest.a file1.o file2.o9提取输出目录(--outputDIRNAME)指定提取操作的输出目录。这个选项可以将提取的文件放置在指定的目录中而不是当前工作目录方便管理提取出的文件。
ar --outputextracted_files x libtest.a10记录依赖关系(--record-libdeps)指定当前库文件的依赖关系与[l]选项类似。这个选项提供了另一种记录库依赖关系的方式可以根据个人喜好选择使用。
ar --record-libdepslibdep1.a libdep2.a r libtest.a file1.o file2.o11瘦归档文件(–thin)创建瘦归档文件即只存储文件的路径而不存储文件内容。这种归档文件可以大大减小归档文件的大小特别适用于存储大量小文件的场景。但是使用瘦归档文件时需要确保原始文件在提取时可用。
ar --thin r libtest.a file1.o file2.o2.3 plugin选项
AR的--plugin选项允许AR加载额外的插件以支持更多的文件格式包括包含链接时优化(Link-Time Optimization, LTO)信息的目标文件。这个功能可以显著扩展AR的应用范围和灵活性特别是在使用LTO等高级编译优化技术时。
使用--plugin选项的基本语法如下 ar --plugin name [other options] [member...]其中name是要加载的插件名称。例如要加载名为liblto_plugin.so的插件可以使用以下命令 ar --plugin liblto_plugin.so r libtest.a file1.o file2.o需要注意的是--plugin选项只在工具链启用了插件支持时可用。如果在构建工具链时没有启用插件支持则无法使用该选项。
如果没有通过--plugin选项指定要加载的插件但工具链启用了插件支持那么AR会自动搜索${libdir}/bfd-plugins目录下的插件文件。AR会按照字母顺序遍历该目录下的文件并使用第一个声明支持当前目标文件的插件。这种机制可以简化插件的管理和使用无需每次都显式指定插件名称。
例如假设${libdir}/bfd-plugins目录下有以下插件文件
liblto_plugin.so.0.0.0my_custom_plugin.soother_plugin.so
当使用AR操作包含LTO信息的目标文件时如果没有通过--plugin选项指定插件名称AR会自动选择liblto_plugin.so.0.0.0插件因为它在字母顺序上优先于其他插件。
需要特别注意的是AR的--plugin选项使用的插件搜索目录与ld的-plugin选项不同。为了让AR使用ld的插件需要将插件文件复制到${libdir}/bfd-plugins目录下。对于基于GCC的编译ld的插件文件通常名为liblto_plugin.so.0.0.0而基于Clang的编译则使用LLVMgold.so。GCC插件通常向后兼容早期版本因此只需复制最新版本的插件文件即可。
3. 使用技巧
3.1 makefile打包二进制文件
在Makefile编译流程中AR工具通常用于创建和管理静态库文件(.a文件)。静态库是一组目标文件(.o文件)的集合可以在链接阶段被其他目标文件或可执行文件引用。通过将常用的函数、类等代码编译为静态库可以提高代码的重用性、模块化和可维护性。
在Makefile中AR工具的作用主要体现在以下两个方面
创建静态库将一组.o文件打包成一个.a静态库文件。更新静态库向已有的.a静态库文件中添加、删除或替换.o文件。
以下是在Makefile中使用AR工具的典型实现形式
# 定义静态库的名称
LIBRARY libmylib.a# 定义静态库所包含的目标文件
OBJECTS file1.o file2.o file3.o# 定义编译器和编译选项
CC gcc
CFLAGS -Wall -c# 定义AR工具和操作选项
AR ar
ARFLAGS rcs# 默认的目标创建静态库
all: $(LIBRARY)# 创建静态库的规则
$(LIBRARY): $(OBJECTS)$(AR) $(ARFLAGS) $ $^# 编译目标文件的规则
%.o: %.c$(CC) $(CFLAGS) $ -o $# 清理生成的文件
clean:rm -f $(OBJECTS) $(LIBRARY)在上面的Makefile示例中
LIBRARY变量定义了要创建的静态库的名称这里是libmylib.a。OBJECTS变量定义了静态库所包含的目标文件这里是file1.o、file2.o和file3.o。CC和CFLAGS变量定义了编译器和编译选项用于编译源代码文件生成目标文件。AR和ARFLAGS变量定义了AR工具和操作选项。ARFLAGS中的r表示替换或添加目标文件c表示在必要时创建静态库s表示创建目标文件索引以加快访问速度。all目标是默认目标依赖于$(LIBRARY)表示创建静态库。$(LIBRARY)目标的规则描述了如何从目标文件$(OBJECTS)创建静态库。$表示目标名称即$(LIBRARY)$^表示所有的依赖文件即$(OBJECTS)。%.o: %.c是一个隐含规则描述了如何从.c源文件编译生成.o目标文件。clean目标用于清理生成的中间文件和静态库文件。
当在命令行中执行make命令时Makefile中的规则将被依次执行最终生成静态库文件libmylib.a。
3.2 重新组合二进制文件
在某些情况下我们可能需要从现有的静态库中提取出特定的目标文件(.o文件并将其与其他源代码文件一起重新编译以生成新的二进制文件。这种技术可以用于重用现有的代码库、修复特定模块中的错误、或者创建定制的库和可执行文件。以下是使用AR提取静态库中的.o文件并与其他源代码混合编译新的二进制文件的详细步骤
1使用AR的x操作提取静态库中的.o文件
ar x libtest.a file1.o file2.o该命令将从libtest.a静态库中提取出file1.o和file2.o两个目标文件。执行后当前目录下会出现file1.o和file2.o文件。
2准备其他需要参与编译的源代码文件例如file3.c和file4.c。
3使用编译器(如gcc)将提取出的.o文件和其他源代码文件一起编译生成新的二进制文件
gcc -o newbinary file1.o file2.o file3.c file4.c该命令将file1.o、file2.o、file3.c和file4.c一起编译生成名为newbinary的新二进制文件。 Once Day 也信美人终作土不堪幽梦太匆匆...... 如果这篇文章为您带来了帮助或启发不妨点个赞和关注再加上一个小小的收藏⭐ (◕‿◕)感谢您的阅读与支持~~~