ar (Unix)
Original author(s) | Ken Thompson, Dennis Ritchie (AT&T Bell Laboratories) |
---|---|
Developer(s) | Various open-source and commercial developers |
Initial release | November 3, 1971 |
Operating system | Unix, Unix-like, V, Plan 9, Inferno |
Platform | Cross-platform |
Type | Command |
Filename extension | |
---|---|
Internet media type |
application/x-archive[1] |
Magic number | !<arch> |
Type of format | archive format |
Container for | usually object files (.o, .obj) |
Standard | Not standardized, several variants exist |
Open format? | Yes[2] |
archiver는, 역시 간단히 ar로 알려져 있으며, 파일의 그룹을 단일 아카이브 파일로 유지 관리하는 유닉스 유틸리티입니다. 오늘날, ar
는 일반적으로 링크 편집기 또는 링커가 사용하는 정적 라이브러리 파일을 만들고 업데이트하고 데비안 가족을 위한 .deb 패키지를 생성하기 위해 오직 사용됩니다; 그것은 임의의 목적에 대해 아카이브를 만들기 위해 사용될 수 있지만, 정적 라이브러리 이외의 목적에 대해 tar
로 크게 대체되어 왔습니다.[3] ar
의 구현은 GNU Binutils 중 하나로 포함됩니다.[2]
리눅스 표준 기반 (LSB)에서, ar
은 더 이상 사용되지 않고 해당 표준의 향후 릴리스에서 사라질 것으로 예상됩니다. 제공된 근거는 "LSB는 소프트웨어 개발 유틸리티를 포함하지도 않고 .o 및 .a 파일 형식을 지정하지도 않습니다."[4]
File format details
![](https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Deb_File_Structure.svg/220px-Deb_File_Structure.svg.png)
ar 형식은 표준화된 적이 없습니다; 현대 아카이브는 BSD와 System V (처음에는 COFF로 알려졌었고, GNU, ELF, 및 Windows에서도 사용됨)의 두 가지 주요 변형이 있는 공통 형식을 기반으로 합니다.
역사적으로 V6, V7, AIX (소형 및 대형) 및 Coherent를 비롯한 다른 변종이 있었으며,[5] 모두 공통 형식과 크게 다릅니다.[6]
데비안 ".deb" 아카이브는 공통 형식을 사용합니다.
ar 파일은 전역 헤더로 시작하고, ar 파일 내에 저장된 각 파일에 대해 헤더 및 데이터 섹션이 뒤따릅니다.
각 데이터 섹션은 2바이트로 정렬됩니다. 만약 그것이 홀수 오프셋에서 끝나면, 줄 바꿈 ('\n', 0x0A)은 필러로 사용됩니다.
File signature
파일 서명은 단일 LF 제어 문자 (0x0A)가 뒤따르는 마법 ASCII 문자열 "!<arch>"
를 포함하는 단일 필드입니다.
File header
ar 아카이브에 저장된 각 파일은 파일에 대한 정보를 저장하기 위한 파일 헤더를 포함합니다. 공통적인 형식은 다음과 같습니다. 숫자 값은 ASCII로 인코딩되고 모든 값은 ASCII 스페이스 (0x20)으로 오른쪽에 채워집니다.
오프셋 | 길이 | 이름 | 형식 |
---|---|---|---|
0 | 16 | 파일 식별자 | ASCII |
16 | 12 | 파일 수정 타임스탬프 | 십진수 |
28 | 6 | 소유자 ID | 십진수 |
34 | 6 | 그룹 ID | 십진수 |
40 | 8 | 파일 모드 (유형과 허가권) | 팔진수 |
48 | 10 | 파이트에서 파일 크기 | 십진수 |
58 | 2 | 끝나는 문자 | 0x60 0x0A |
헤더는 인쇄 가능한 ASCII 문자와 줄 바꿈을 오직 포함하고, 오직 텍스트 파일을 포함하는 아카이브는 여전히 텍스트 파일 자체로 나타납니다.
구성원은 짝수 바이트 경계에 맞춰 정렬됩니다. "각 아카이브 파일 구성원은 짝수 바이트 경계에서 시작합니다; 개행이 필요하다면 파일 사이에 삽입됩니다. 그럼에도 불구하고, 주어진 크기는 패딩을 제외한 파일의 실제 크기를 반영합니다."[7]
파일 이름 길이와 형식의 제한으로 인해, GNU와 BSD 변종 둘 다는 긴 파일이름을 저장하는 서로 다른 방법을 고안했습니다. 비록 공통적인 형식이 2038년 문제를 겪지는 않지만, ar 유틸리티의 많은 구현은 2147483647을 초과하는 타임스탬프를 올바르게 처리하기 위해 향후 수정되어야 할 필요가 있고 수정해야 할 수도 있습니다. 이들 확장에 대한 설명은 libbfd에서 찾을 수 있습니다.[8]
형식에 따라, 많은 ar 구현은 심볼에 대해 전체 아카이브를 스캔할 필요없이 빠른 링킹에 대해 전역 심볼 테이블 (일명 armap, 디렉토리 또는 인덱스)를 포함합니다. POSIX는 이 기능을 인식하고, ar 구현에 업데이트를 위한 -s
옵션을 가지는 것을 요구합니다. 대부분의 구현은 첫 번째 파일 항목에 그것을 넣습니다.[9]
BSD variant
BSD ar는 ASCII 스페이스로 오른쪽-패딩된 파일 이름을 저장합니다. 이것은 파일 이름 내부에 스페이스를 갖는 문제의 원인이 됩니다. 4.4BSD ar는 파일 이름 필드에 문자열 "#1/" 다음에 파일 이름 길이를 배치하고, 데이터 섹션의 앞에 실제 파일이름을 저장함으로써 확장된 파일 이름을 저장합니다.[6]
BSD ar 유틸리티는 전통적으로 전역 기호 조회 테이블의 구축을 처리하지 않고 이 임무를 첫 번째 아카이브 구성원으로 __.SYMDEF
라는 아키텍처-별 파일을 삽입하는 ranlib라는[10] 별도의 유틸리티에 위임합니다.[11] 일부 후손은 정렬된 버전을 나타내기 위해 이름 뒤에 스페이스와 "SORTED"를 넣습니다.[12] __.SYMDEF_64
라는 64비트 변형이 Darwin에 존재합니다.
POSIX가 -s
옵션에 대해 요구 사항을 ranlib의 대체품으로 추가한 이후로, 어쨌든, 더 새로운 BSD ar 구현이 이 기능을 갖도록 다시 작성되었습니다. 특히 FreeBSD는 SYMDEF 테이블 형식을 버리고 System V 스타일 테이블을 채택했습니다.[13]
System V (or GNU) variant
System V ar은 파일이름의 끝을 표시하기 위해 '/' 문자 (0x2F)를 사용합니다; 이것은 확장된 파일이름의 사용없이 스페이스의 사용을 허용합니다. 그런-다음 그것은 이름 "//"를 갖는 파일의 데이터 섹션에서 여러 확장된 파일이름을 저장하며, 이 레코드는 향후 헤더에 의해 참조됩니다. 헤더는 확장된 파일이름 데이터 섹션에서 파일이름의 시작에 십진수 오프셋이 뒤따르는 "/"를 저장함으로써 확장된 파일이름을 참조합니다. 이 "//" 파일 자체의 형식은 각각 하나 이상의 LF 문자로 구분된 긴 파일이름의 목록입니다. 십진수 오프셋은 "//" 파일 내의 줄 또는 문자열 번호가 아니라 문자의 숫자입니다. 이것은 보통 항상 첫 번째인 기호 테이블 다음으로 파일의 두 번째 항목임을 주목하십시오.
System V ar은 특수 파일이름 "/"을 다음 데이터 항목가 접근 속도를 높이기 위해 ar 라이브러리에서 사용되는 기호 조회 테이블을 포함한다는 것을 나타내기 위해 사용합니다. 이 기호 테이블은 연속 데이터로 함께 기록되는 세 부분으로 구축됩니다.
- 테이블의 항목의 숫자를 제공하는 32-비트 빅 엔디안 정수입니다.
- 32비트 빅 엔디안 정수 집합입니다. 각 기호에 대해 하나씩, 이 기호를 포함하는 파일에 대해 헤더의ㅏ 아카이브 내 위치를 기록합니다.
- 영-종료된 문자열 집합입니다. 각각은 기호 이름이고, 2부에서 위치 목록과 같은 순서로 발생합니다.
일부 System V 시스템은 기호 조회 테이블에 대해 위에서 설명한 형식을 사용하지 않습니다. HP-UX 11.0과 같은 운영 시스템에 대해, 이 정보는 SOM 파일 형식을 기반으로 하는 데이터 구조로 저장됩니다.
특수 파일 "/"은 특정 시퀀스로 끝나지 않습니다; 그 끝은 마지막 기호 이름이 읽혀진 후에 가정됩니다.
4GiB 파일 크기 제한을 극복하기 위해, Solaris 11.2 및 GNU와 같은 일부 시스템은 변종 조회 테이블을 사용합니다. 32-비트 정수 대신에, 64-비트 정수가 기호 조회 테이블에 사용됩니다. "/" 대신 문자열 "/SYM64/"가 이 테이블의 식별자로 사용됩니다.[14]
Windows variant
Windows (PE/COFF) 변종은 SysV/GNU 변종을 기반으로 합니다. 첫 번째 항목 "/"은 SysV/GNU 기호 테이블과 같은 레이아웃을 가집니다. 두 번째 항목은 확장된 기호 교차-참조 테이블을 저장하는 Microsoft ECOFF 확장인 또 다른 "/"입니다. 이 하나가 정렬되고 리틀-엔디안 정수를 사용합니다.[5][15] 세 번째 항목은 SysV/GNU에서와 같이 선택적 "//" 긴 이름 데이터입니다.[16]
Thin archive
GNU binutils 및 Elfutils에서 ar 버전은 매직 넘버 !<thin>을 갖는 추가적인 "얇은 아카이브" 형식을 가집니다. 얇은 아카이브는 오직 기호 테이블과 파일에 대한 참조를 포함합니다. 파일 형식은 필연적으로 모든 각 파일이 데이터 섹션없이 저장되는 System V 형식 아카이브입니다. 모든 각 파일이름은 "긴" 파일이름으로 저장되고 그것들은 마치 심볼릭 링크인 것처럼 해석되어야 합니다.[17]
Example usage
class1.o, class2.o, class3.o 파일에서 아카이브를 만들기 위해, 다음 명령이 사용됩니다:
ar rcs libclass.a class1.o class2.o class3.o
보통 C 컴파일러 cc
를 통해 호출되는 유닉스 링커는 ar 파일을 읽고 이 파일에서 객체 파일을 추출할 수 있으므로, libclass.a
가 class1.o
, class2.o
및 class3.o
를 포함하는 아카이브이면,
cc main.c libclass.a
또는 (libclass.a가 /usr/local/lib와 같은 표준 라이브러리 경로에 위치되면)
cc main.c -lclass
또는 (링킹 동안)
ld ... main.o -lclass ...
는 다음과 같습니다:
cc main.c class1.o class2.o class3.o
See also
References
- ^ a b "application/x-archive". Retrieved 2019-03-11.
- ^ a b "ar(1) - Linux man page". Retrieved 3 October 2013.
- ^ "Static Libraries". TLDP. Retrieved 3 October 2013.
- ^ Linux Standard Base Core Specification, version 4.1, Chapter 15. Commands and Utilities > ar
- ^ a b Levine, John R. (2000) [October 1999]. "Chapter 6: Libraries". Linkers and Loaders. The Morgan Kaufmann Series in Software Engineering and Programming (1 ed.). San Francisco, USA: Morgan Kaufmann. ISBN 1-55860-496-0. OCLC 42413382. Archived from the original on 2012-12-05. Retrieved 2020-01-12. Code: [1][2] Errata: [3]
- ^ a b Manual page for NET/2 ar file format
- ^ "ar.h". www.unix.com. The UNIX and Linux Forums.
- ^ "bminor/binutils-gdb: archive.c". GitHub.
- ^ The Single UNIX Specification, Issue 7 from The Open Group – Reference,
- ^ Manual page for NET/2 ranlib utility
- ^ Manual page for NET/2 ranlib file format
- ^ "ranlib.h". opensource.apple.com.
- ^ FreeBSD File Formats Manual –
- ^ "ar.h(3HEAD)". docs.oracle.com. Oracle Corporation. 11 November 2014. Retrieved 14 November 2018.
- ^ Pietrek, Matt (April 1998), "Under The Hood", Microsoft Systems Journal, archived from the original on 2007-06-24, retrieved 2014-08-23
- ^ "llvm-mirror/llvm: archive.cpp (format detection)". GitHub. Retrieved 10 February 2020.
- ^ "ar". GNU Binary Utilities.
External links
![](https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Wikibooks-logo-en-noslogan.svg/40px-Wikibooks-logo-en-noslogan.svg.png)
- The Single UNIX Specification, Issue 7 from The Open Group : create and maintain library archives – Commands & Utilities Reference,
- Plan 9 Programmer's Manual, Volume 1 –
- Inferno General commands Manual –
- Linux User Commands Manual –
- FreeBSD General Commands Manual –
- Version 7 Unix Programmer's Manual –
- FreeBSD File Formats Manual -- an account of Unix formats –
- The 32-bit PA-RISC Run-time Architecture Document, HP-UX 11.0 Version 1.0, Hewlett-Packard, 1997.
See Chapter 4: Relocatable Libraries. Available at [4] (devresource.hp.com)