GNU binary utilities —— ar
个人笔记,仅供参考!!
Controlling ar on the Command Line
1 | ar [-X32_64] [-]p[mod] [--plugin name] [--target bfdname] [--output dirname] [--record-libdeps libdeps] [--thin] [relpos] [count] archive [member…] |
当以Unix风格使用ar
工具时,ar
至少需要两个参数:一个指定操作的关键字(可选地伴随着指定修饰符的其它关键字),以及要执行的存档名称。大多数操作还可以接受进一步的成员参数,指定要操作的特定文件。
GNU ar 允许在第一个命令行参数中以任意顺序混合操作代码p
和修饰符标志mod
。
关键字p
指定要执行的操作;它可以是以下任何一个,但必须只指定其中一个:
‘d’:从归档中删除模块。指定要删除的模块名称作为 member;如果不指定要删除的文件,则归档保持不变。
如果指定了 ‘v’ 修饰符,ar 将列出每个被删除的模块。‘m’:使用此操作在归档中移动成员。
如果一个符号在多个成员中定义,归档中成员的顺序可能影响使用库链接程序的程序。
如果不使用修饰符与 ‘m’ 一起使用,那么在member参数中指定的任何成员都会被移动到归档的末尾;可以使用 ‘a’、‘b’ 或 ‘i’ 修饰符将它们移动到指定的位置。‘p’:将指定的成员打印到标准输出文件。如果指定了 ‘v’ 修饰符,显示成员名称并将其内容复制到标准输出。
如果不指定member参数,将打印归档中的所有文件。‘q’:将member指定的文件添加到归档的末尾,无需检查替换。
‘a’、‘b’ 和 ‘i’ 修饰符不影响此操作;新成员始终放置在归档的末尾。
‘v’ 修饰符使 ar 在追加文件时列出每个文件。‘r’:将 member 指定的文件插入到归档中(替换)。与 ‘q’ 不同,如果已存在的成员的名称与要添加的成员的名称匹配,先删除已存在的成员。
如果 member 中的某个文件不存在,ar 将显示错误消息,并保留与该名称匹配的现有成员。
默认情况下,新成员添加到文件末尾;但可以使用 ‘a’、‘b’ 或 ‘i’ 修饰符请求相对于某个现有成员的位置。‘s’:向归档添加索引,或者如果已存在则更新索引。这是一个特殊的命令,可以用作命令或修饰符。
‘t’:显示归档的内容列表,或者显示在归档中存在的 member列出的文件的内容。通常只显示成员名称,但如果指定了 ‘O’ 修饰符,则还会显示成员的相应偏移量。
要查看权限、时间戳、所有者、组和大小,应包括 ‘v’ 修饰符。
如果不指定member,将列出归档中的所有文件。‘x’:从归档中提取member指定的成员。可以使用 ‘v’ 修饰符请求 ar 在提取时列出每个名称。
如果未指定成员,则提取存档中的所有文件。
无法从“thin”归档中提取文件,并且从使用 P 创建的归档中提取存在限制:路径不能是绝对路径,不能包含..
,路径中的任何子目录都必须存在。如果希望避免这些限制,可以使用 –output 选项指定输出目录。
以下修饰符(mod)参数可以紧跟着p
关键字之后,以指定操作行为的变化:
NU ar 命令行工具时,以下是关于操作和修饰符的解释:
‘a’:在现有归档成员之后添加新文件。如果使用 ‘a’ 修饰符,现有归档成员的名称必须作为
relpos
参数出现在archive
参数之前。‘b’:在现有归档成员之前添加新文件。如果使用 ‘b’ 修饰符,现有归档成员的名称必须作为
relpos
参数出现在archive
参数之前。‘c’:创建存档。当请求更新时,如果指定的归档文件不存在,则始终创建该归档文件。但是,除非使用此修饰符预先指定希望创建它,否则会发出警告。
‘D’:在添加文件和归档索引时使用确定性模式。使用零作为 UID、GID、时间戳,并对所有文件使用一致的文件模式。
如果使用相同的选项和相同的输入文件运行 ar,多次运行将创建相同的输出文件,而不考虑输入文件的所有者、组、文件模式或修改时间。
如果 binutils 配置了 –enable-deterministic-archives,则默认情况下启用此模式。可以使用下面的 ‘U’ 修饰符禁用它。‘f’:截断归档中的文件名。GNU ar 通常允许任意长度的文件名。这将导致创建与某些系统上本机 ar 程序不兼容的归档。如果这是一个问题,可以使用 ‘f’ 修饰符在将文件放入归档时截断文件名。
‘i’:在现有归档成员之前插入新文件。如果使用 ‘i’ 修饰符,现有归档成员的名称必须作为
relpos
参数出现在archive
参数之前。‘l’:指定此库的依赖项。依赖项必须紧随此选项字符,必须使用与链接器命令行相同的语法,并且必须在单个参数内指定。如果需要多个项,则必须将它们加引号以形成单个命令行参数。例如,
L “-L/usr/local/lib -lmydep1 -lmydep2”
‘N’:count参数。如果存档中有多个具有相同名称的条目,则使用此方法,从归档文件中提取或删除给定名称的实例计数。
‘o’:提取成员时保留其原始日期。如果未指定此修饰符,则从存档中提取的文件将带有提取时间戳。
‘O’:在归档中显示成员的偏移量。与 ‘t’ 选项一起使用。
‘P’:使用完整路径名来匹配或存储归档中的文件名。使用完整路径名创建的归档不符合 POSIX 标准,因此可能无法与除最新的 GNU 工具之外的其他工具一起使用。
如果不使用 ‘P’,使用 GNU ar 修改这些归档时会删除完整路径名,除非归档是“thin”归档。添加 ‘P’ 可以防止此替换。
例如,执行以下命令:ar rcST archive.a subdir/file1 subdir/file2 file1
将导致第一个 subdir/file1 被当前目录中的 file1 替换。添加 ‘P’ 将阻止此替换。‘s’:将对象文件索引写入归档,或者更新现有索引,即使对归档没有进行其他更改。您可以将此修饰符标志与任何操作一起使用,也可以单独使用。在归档上运行 ‘ar s’ 等效于在其上运行 ‘ranlib’。
(ranlib 为静态库生成索引)‘S’:不生成归档符号表。这可以加速分步构建大型库。生成的归档不能与链接器一起使用。要构建符号表,必须在最后一次运行 ‘ar’ 时省略 ‘S’ 修饰符,或者必须在归档上运行 ‘ranlib’。
‘u’:通常,‘ar r’… 将所有列出的文件插入到归档中。如果只想插入那些与现有相同名称的成员较新的文件,使用此修饰符。‘u’ 修饰符仅允许用于操作 ‘r’(替换)。特别是,组合 ‘qu’ 不允许,因为检查时间戳会丧失操作 ‘q’ 的速度优势。
注意——如果存档是以一种确定的方式创建的,例如通过使用D修饰符,那么总会发生替换,u修饰符将无效。‘U’:
不要在确定性模式下操作。这是上面 ‘D’ 修饰符的反义词:添加的文件和归档索引将获得其实际的 UID、GID、时间戳和文件模式值。
默认情况下,除非 binutils 配置了 –enable-deterministic-archives,否则会使用此选项。‘v’:此修饰符请求操作的详细版本。许多操作在附加 ‘v’ 时会显示其他信息,例如处理的文件名。
‘V’:此修饰符显示 ar 的版本号。
ar 程序还支持一些命令行选项,这些选项既不是修饰符也不是操作,但它们确实以特定的方式改变其行为,例如:
–help:显示 ar 支持的命令行选项列表,然后退出。
–version:显示 ar 的版本信息,然后退出。
-X32_64:ar 忽略以 -X32_64 拼写的初始选项,以与 AIX 兼容。该选项产生的行为是 GNU ar 的默认行为。ar 不支持其他 -X 选项,特别是不支持 AIX ar 的默认选项 -X32。
–plugin name:可选的命令行开关,使 ar 加载名为 name 的插件,该插件添加对更多文件格式的支持,包括具有链接时优化信息的目标文件。此选项仅在工具链已启用插件支持的情况下可用。
–target target:可选的命令行开关,指定归档成员的目标代码格式与系统默认格式不同。
–output dirname:–output 选项可用于指定一个路径,用于将归档成员提取到其中。如果未指定此选项,则使用当前目录。
注意:尽管存在此选项,但它仍需要在命令行中包含 x 提取操作的选项。–record-libdeps libdeps:–record-libdeps 选项与 l 修饰符作用相同,只是以长格式处理。
–thin:将指定的归档设置为“thin”归档。如果已存在且是常规归档文件,则现有成员必须位于与归档文件相同的目录中。
参考连接:
【1】https://sourceware.org/binutils/docs/binutils/ar-cmdline.html