修飾子 "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。アーカイブにはテーブルを作成できるシンボルは含まれていません。

このオプションは、使用しないときに得られる出力を単純に抑制します-car: creating out.a-c

関連情報