许多文章提供了使用“ar”命令使用“ar rcs”的示例,但没有解释原因。
我自己尝试过使用或不使用修饰符“c”和“s”的命令,发现即使在二进制比较中输出也是相同的。
运行不带修饰符“c”和“s”的“ar”:
$ ar r out.a *.txt
ar: creating out.a
$ hexdump -C out.a
00000000 21 3c 61 72 63 68 3e 0a 61 2e 74 78 74 2f 20 20 |!<arch>.a.txt/ |
00000010 20 20 20 20 20 20 20 20 31 35 37 37 33 35 33 37 | 15773537|
00000020 35 38 20 20 31 30 30 30 20 20 31 30 30 30 20 20 |58 1000 1000 |
00000030 31 30 30 36 36 34 20 20 34 20 20 20 20 20 20 20 |100664 4 |
00000040 20 20 60 0a 61 62 63 0a 62 2e 74 78 74 2f 20 20 | `.abc.b.txt/ |
00000050 20 20 20 20 20 20 20 20 31 35 37 37 33 35 33 37 | 15773537|
00000060 35 38 20 20 31 30 30 30 20 20 31 30 30 30 20 20 |58 1000 1000 |
00000070 31 30 30 36 36 34 20 20 34 20 20 20 20 20 20 20 |100664 4 |
00000080 20 20 60 0a 64 65 66 0a | `.def.|
00000088
$ rm out.a
使用修饰符“c”和“s”运行“ar”:
$ ar rcs out.a *.txt
$ hexdump -C out.a
00000000 21 3c 61 72 63 68 3e 0a 61 2e 74 78 74 2f 20 20 |!<arch>.a.txt/ |
00000010 20 20 20 20 20 20 20 20 31 35 37 37 33 35 33 37 | 15773537|
00000020 35 38 20 20 31 30 30 30 20 20 31 30 30 30 20 20 |58 1000 1000 |
00000030 31 30 30 36 36 34 20 20 34 20 20 20 20 20 20 20 |100664 4 |
00000040 20 20 60 0a 61 62 63 0a 62 2e 74 78 74 2f 20 20 | `.abc.b.txt/ |
00000050 20 20 20 20 20 20 20 20 31 35 37 37 33 35 33 37 | 15773537|
00000060 35 38 20 20 31 30 30 30 20 20 31 30 30 30 20 20 |58 1000 1000 |
00000070 31 30 30 36 36 34 20 20 34 20 20 20 20 20 20 20 |100664 4 |
00000080 20 20 60 0a 64 65 66 0a | `.def.|
00000088
$
那么有人可以举一个例子来展示添加和不添加修饰符之间的区别吗?
我已经阅读了手册页,但仍然无法理解要点。
添加于 2019-12-27 02:28:45 UTC
谢谢。现在我已经理解了修饰符“c”,但仍然对修饰符“s”有疑问。
很多人提到“符号”,但它是什么意思呢?
我尝试过符号链接,但它们仍然相同:
[john@centos8-01 arTest]$ ls -l
total 8
-rw-r--r--. 1 john smith 4 Dec 27 10:18 a.txt
-rw-r--r--. 1 john smith 4 Dec 27 10:19 b.txt
lrwxrwxrwx. 1 john smith 5 Dec 27 10:19 c.txt -> a.txt
[john@centos8-01 arTest]$ ar -r out1.a *.txt
ar: creating out1.a
[john@centos8-01 arTest]$ ar -rs out2.a *.txt
ar: creating out2.a
[john@centos8-01 arTest]$ diff out1.a out2.a
[john@centos8-01 arTest]$ cat out1.a
!<arch>
a.txt/ 1577413136 1001 1001 100644 4 `
abc
b.txt/ 1577413141 1001 1001 100644 4 `
def
c.txt/ 1577413136 1001 1001 100644 4 `
abc
[john@centos8-01 arTest]$ cat out2.a
!<arch>
a.txt/ 1577413136 1001 1001 100644 4 `
abc
b.txt/ 1577413141 1001 1001 100644 4 `
def
c.txt/ 1577413136 1001 1001 100644 4 `
abc
[john@centos8-01 arTest]$
我尝试将符号添加到我的 txt 文件中:
[john@centos8-01 arTest]$ cat a.txt
abc
!@#$%^&*()_+-=~`[]\{}|;':"<>?,./
[john@centos8-01 arTest]$
正如你所看到的,“a.txt”之前没有符号,只有字母“abc”,但现在我已经添加了我可以在键盘上找到的所有符号。现在我运行带或不带修饰符“s”的“ar”,但它们仍然相同:
[john@centos8-01 arTest]$ ls
a.txt b.txt
[john@centos8-01 arTest]$ ar r out1.a *.txt
ar: creating out1.a
[john@centos8-01 arTest]$ ar rs out2.a *.txt
ar: creating out2.a
[john@centos8-01 arTest]$ diff out1.a out2.a
并且没有“符号表”:
[john@centos8-01 arTest]$ cat out1.a
!<arch>
a.txt/ 1577413538 1001 1001 100644 37 `
abc
!@#$%^&*()_+-=~`[]\{}|;':"<>?,./
b.txt/ 1577413141 1001 1001 100644 4 `
def
[john@centos8-01 arTest]$ cat out2.a
!<arch>
a.txt/ 1577413538 1001 1001 100644 37 `
abc
!@#$%^&*()_+-=~`[]\{}|;':"<>?,./
b.txt/ 1577413141 1001 1001 100644 4 `
def
[john@centos8-01 arTest]$
答案1
档案ar
一般用于目标文件,即使它们可能被滥用于其他目的(.deb
例如,来自 debian 的文件基本上是 ar 存档)。
如果您编译一个小型 C 程序,例如:
void foo(){}
到foo.o
目标文件中,该目标文件将包含foo
象征它指向构成该foo
函数的编译代码。当您使用 将此类文件添加到存档时ar rcs foo.a foo.o
,该符号将被添加到符号索引表中,其他程序使用该表ld
来快速查找存档中的哪个文件包含特定符号。
构建该符号表过去是可选的,取决于开关s
,但现在它是默认对于 GNU ar,s
切换基本上是无操作的。使用S
(大写 s)开关将阻止构建此类索引。
例子:
$ cc -Wall -c -o foo.o -xc - <<<'void foo(){}'
$ ar rc foo1.a foo.o
$ ar rcS foo2.a foo.o
$ cmp foo1.a foo2.a
foo1.a foo2.a differ: byte 9, line 2
$ nm -s foo1.a
Archive index:
foo in foo.o
foo.o:
0000000000000000 T foo
答案2
该-s
选项将在存档中(重新)创建符号表。如果它尚不存在,或者已被删除,这可能很有用strip
。您的存档不包含可为其创建表格的符号。
该选项只是抑制您不使用时获得的-c
输出。ar: creating out.a
-c