GCC之编译(8)AR打包命令

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.ofile2.ofile3.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 -snm --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 number@<file>      - read options from <file>--target=BFDNAME - specify the target object format as BFDNAME--output=DIRNAME - specify the output directory for extraction operations--record-libdeps=<text> - specify the dependencies of this library--thin       - make a thin archiveoptional:--plugin <p> - load the specified plugin
2.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.o

(2)符号表索引([s]),在创建归档文件时,AR会同时创建归档文件的符号表索引,类似于ranlib命令的功能。这样可以加速对归档文件中符号的访问,特别是在大型项目中使用归档文件作为库时非常有用。

ar rs libtest.a file1.o file2.o

(3)依赖关系([l]),指定当前库文件的依赖关系。这个选项可以在归档文件中记录其所依赖的其他库文件,方便管理复杂的库依赖关系。

ar rl "libdep1.a libdep2.a" libtest.a file1.o file2.o

(4)不生成符号表([S]),在创建归档文件时,AR不会生成符号表。这可以减小归档文件的大小,但会影响对归档文件中符号的访问效率。

ar rS libtest.a file1.o file2.o

(5)详细输出([v]),在执行操作时,AR会显示详细的信息,包括正在处理的文件名、操作结果等。这对于调试和理解AR的行为非常有帮助。

ar rvx libtest.a file1.o file2.o

(6)版本号([V]),显示AR的版本号。这个选项可以用于检查当前系统中AR的版本,以确保兼容性。

ar V

(7)读取选项文件(@),从指定的文件中读取AR命令选项。这个功能可以将一组常用的AR选项存储在文件中,然后通过@选项来引用,从而简化AR命令的编写。

ar @options.txt

(8)目标文件格式(--target=BFDNAME),指定目标对象文件格式为BFDNAME。这个选项可以让AR适应不同的目标平台和文件格式,提高其灵活性和可移植性。

ar --target=elf64-x86-64 r libtest.a file1.o file2.o

(9)提取输出目录(--output=DIRNAME),指定提取操作的输出目录。这个选项可以将提取的文件放置在指定的目录中,而不是当前工作目录,方便管理提取出的文件。

ar --output=extracted_files x libtest.a

(10)记录依赖关系(--record-libdeps=),指定当前库文件的依赖关系,与[l]选项类似。这个选项提供了另一种记录库依赖关系的方式,可以根据个人喜好选择使用。

ar --record-libdeps="libdep1.a libdep2.a" r libtest.a file1.o file2.o

(11)瘦归档文件(–thin),创建瘦归档文件,即只存储文件的路径而不存储文件内容。这种归档文件可以大大减小归档文件的大小,特别适用于存储大量小文件的场景。但是,使用瘦归档文件时,需要确保原始文件在提取时可用。

ar --thin r libtest.a file1.o file2.o
2.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.0
  • my_custom_plugin.so
  • other_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工具的作用主要体现在以下两个方面:

  1. 创建静态库:将一组.o文件打包成一个.a静态库文件。
  2. 更新静态库:向已有的.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.ofile2.ofile3.o
  • CCCFLAGS变量定义了编译器和编译选项,用于编译源代码文件生成目标文件。
  • ARARFLAGS变量定义了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.ofile2.o两个目标文件。执行后,当前目录下会出现file1.ofile2.o文件。

(2)准备其他需要参与编译的源代码文件,例如file3.cfile4.c

(3)使用编译器(如gcc)将提取出的.o文件和其他源代码文件一起编译,生成新的二进制文件:

gcc -o newbinary file1.o file2.o file3.c file4.c

该命令将file1.ofile2.ofile3.cfile4.c一起编译,生成名为newbinary的新二进制文件。







Alt

Once Day

也信美人终作土,不堪幽梦太匆匆......

如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!

(。◕‿◕。)感谢您的阅读与支持~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7566.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot统一功能处理

一.拦截器 1.拦截器的简单介绍 拦截器是Spring框架提供的核⼼功能之⼀,主要⽤来拦截⽤⼾的请求,在指定⽅法前后,根据业务需要执⾏预先设定的代码. 2.使用 (i).定义拦截器&#xff1a; (ii).注册拦截器 (iii).拦截路径 (iv).实行流程 3.登录校验 4.DispatcherServlet源码&…

31、Java集合概述

目录 一.Collection 二.Map 三.Collection和Map的区别 四.应用场景 集合是一组对象的集合&#xff0c;它封装了对象的存储和操作方式。集合框架提供了一组接口和类&#xff0c;用于存储、访问和操作这些对象集合。这些接口和类定义了不同的数据结构&#xff0c;如列表、集合…

Unity|小游戏复刻|见缝插针1(C#)

准备 创建Scenes场景&#xff0c;Scripts脚本&#xff0c;Prefabs预制体文件夹 修改背景颜色 选中Main Camera 找到背景 选择颜色&#xff0c;一种白中透黄的颜色 创建小球 将文件夹里的Circle拖入层级里 选中Circle&#xff0c;位置为左右居中&#xff0c;偏上&…

Word 中实现方框内点击自动打 √ ☑

注&#xff1a; 本文为 “Word 中方框内点击打 √ ☑ / 打 ☒” 相关文章合辑。 对第一篇增加了打叉部分&#xff0c;第二篇为第一篇中方法 5 “控件” 实现的详解。 在 Word 方框内打 √ 的 6 种技巧 2020-03-09 12:38 使用 Word 制作一些调查表、检查表等&#xff0c;通常…

Android Studio:视图绑定的岁月变迁(2/100)

一、博文导读 本文是基于Android Studio真实项目&#xff0c;通过解析源码了解真实应用场景&#xff0c;写文的视角和读者是同步的&#xff0c;想到看到写到&#xff0c;没有上帝视角。 前期回顾&#xff0c;本文是第二期。 private Unbinder mUnbinder; 只是声明了一个 接口…

第13章 深入volatile关键字(Java高并发编程详解:多线程与系统设计)

1.并发编程的三个重要特性 并发编程有三个至关重要的特性&#xff0c;分别是原子性、有序性和可见性 1.1 原子性 所谓原子性是指在一次的操作或者多次操作中&#xff0c;要么所有的操作全部都得到了执行并 且不会受到任何因素的干扰而中断&#xff0c;要么所有的操作都不执行…

算法中的移动窗帘——C++滑动窗口算法详解

1. 滑动窗口简介 滑动窗口是一种在算法中常用的技巧&#xff0c;主要用来处理具有连续性的子数组或子序列问题。通过滑动窗口&#xff0c;可以在一维数组或字符串上维护一个固定或可变长度的窗口&#xff0c;逐步移动窗口&#xff0c;避免重复计算&#xff0c;从而提升效率。常…

基于SpringBoot的网上考试系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【java数据结构】map和set

【java数据结构】map和set 一、Map和Set的概念以及背景1.1 概念1.2 背景1.3 模型 二、Map2.1 Map说明2.2 Map的常用方法 三、Set3.1 Set说明3.2 Set的常用方法 四、Set和Map的关系 博客最后附有整篇博客的全部代码&#xff01;&#xff01;&#xff01; 一、Map和Set的概念以及…

基于迁移学习的ResNet50模型实现石榴病害数据集多分类图片预测

完整源码项目包获取→点击文章末尾名片&#xff01; 番石榴病害数据集 背景描述 番石榴 &#xff08;Psidium guajava&#xff09; 是南亚的主要作物&#xff0c;尤其是在孟加拉国。它富含维生素 C 和纤维&#xff0c;支持区域经济和营养。不幸的是&#xff0c;番石榴生产受到降…

企业信息化2:行政办公管理系统

总裁办公室作为综合行政管理部门服务于整个公司&#xff0c;工作职责包含从最基础的行政综合到协调督办、对外政务、品牌建设等等&#xff0c;工作量繁多而且琐碎。如何通过信息化来实现标准化和常态化的管理手段&#xff0c;确保总裁办的各项工作有章可循&#xff0c;提高工作…

基于springboot+vue的古城景区管理系统的设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

使用 Elasticsearch 导航检索增强生成图表

作者&#xff1a;来自 Elastic Louis Jourdain 及 Ivan Monnier 了解如何使用知识图谱来增强 RAG 结果&#xff0c;同时在 Elasticsearch 中高效存储图谱。本指南探讨了根据用户查询动态生成知识子图的详细策略。 检索增强生成 (RAG) 通过将大型语言模型 (LLM) 的输出基于事实数…

【数据结构】_以SLTPushBack(尾插)为例理解单链表的二级指针传参

目录 1. 第一版代码 2. 第二版代码 3. 第三版代码 前文已介绍无头单向不循环链表的实现&#xff0c;详见下文&#xff1a; 【数据结构】_不带头非循环单向链表-CSDN博客 但对于部分方法如尾插、头插、任意位置前插入、任意位置前删除的相关实现&#xff0c;其形参均采用了…

ceph新增节点,OSD设备,标签管理(二)

一、访问客户端集群方式 方式一: 使用cephadm shell交互式配置 [rootceph141 ~]# cephadm shell # 注意&#xff0c;此命令会启动一个新的容器&#xff0c;运行玩后会退出&#xff01; Inferring fsid c153209c-d8a0-11ef-a0ed-bdb84668ed01 Inferring config /var/lib/ce…

Spring Data JPA 实战:构建高性能数据访问层

1 简介 1.1 Spring Data JPA 概述 1.1.1 什么是 Spring Data JPA? Spring Data JPA 是 Spring Data 项目的一部分,旨在简化对基于 JPA 的数据库访问操作。它通过提供一致的编程模型和接口,使得开发者可以更轻松地与关系型数据库进行交互,同时减少了样板代码的编写。Spri…

Git进阶笔记系列(01)Git核心架构原理 | 常用命令实战集合

读书笔记&#xff1a;卓越强迫症强大恐惧症&#xff0c;在亲子家庭、职场关系里尤其是纵向关系模型里&#xff0c;这两种状态很容易无缝衔接。尤其父母对子女、领导对下属&#xff0c;都有望子成龙、强将无弱兵的期望&#xff0c;然而在你的面前&#xff0c;他们才是永远强大的…

基于模糊PID的孵化箱温度控制系统(论文+源码)

1系统方案设计 本课题为基于模糊PID的孵化箱温度控制系统&#xff0c;其以STM32最小系统与模糊PID控制器为控制核心。系统主要包括数据采集模块、处理器模块、电机控制模块。 数据采集模块由温度传感器构成&#xff0c;通过温度传感器感应温度变化&#xff0c;获得待处理的数据…

Arcgis国产化替代:Bigemap Pro正式发布

在数字化时代&#xff0c;数据如同新时代的石油&#xff0c;蕴含着巨大的价值。从商业决策到科研探索&#xff0c;从城市规划到环境监测&#xff0c;海量数据的高效处理、精准分析与直观可视化&#xff0c;已成为各行业突破发展瓶颈、实现转型升级的关键所在。历经十年精心打磨…

ThreeJS示例教程200+【目录】

Three.js 是一个强大的 JavaScript 库,旨在简化在网页上创建和展示3D图形的过程。它基于 WebGL 技术,但提供了比直接使用 WebGL 更易于使用的API,使得开发者无需深入了解 WebGL 的复杂细节就能创建出高质量的3D内容。 由于目前内容还不多,下面的内容暂时做一个占位。 文章目…