多くの記事では、「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