많은 기사에서 "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
예를 들어 데비안의 파일은 기본적으로 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