수정자 "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예를 들어 데비안의 파일은 기본적으로 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

관련 정보