添加修饰符“c”和“s”或不添加修饰符“ar”命令之间的区别的任何示例

添加修饰符“c”和“s”或不添加修饰符“ar”命令之间的区别的任何示例

许多文章提供了使用“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

相关内容