Jump to content

ar (Unix)

This is a fully translated article. Click here for more information.
From DawoumWiki, the free Mathematics self-learning

ar
Original author(s)Ken Thompson,
Dennis Ritchie
(AT&T Bell Laboratories)
Developer(s)Various open-source and commercial developers
Initial releaseNovember 3, 1971; 52 years ago (1971-11-03)
Operating systemUnix, Unix-like, V, Plan 9, Inferno
PlatformCross-platform
TypeCommand
archiver format
Filename extension
.a, .lib, .ar[1]
Internet media type
application/x-archive[1]
Magic number!<arch>
Type of formatarchive format
Container forusually object files (.o, .obj)
StandardNot 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

Diagram showing an example file structure of a .deb file

ar 형식은 표준화된 적이 없습니다; 현대 아카이브는 BSDSystem 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 라이브러리에서 사용되는 기호 조회 테이블을 포함한다는 것을 나타내기 위해 사용합니다. 이 기호 테이블은 연속 데이터로 함께 기록되는 세 부분으로 구축됩니다.

  1. 테이블의 항목의 숫자를 제공하는 32-비트 빅 엔디안 정수입니다.
  2. 32비트 빅 엔디안 정수 집합입니다. 각 기호에 대해 하나씩, 이 기호를 포함하는 파일에 대해 헤더의ㅏ 아카이브 내 위치를 기록합니다.
  3. 영-종료된 문자열 집합입니다. 각각은 기호 이름이고, 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 binutilsElfutils에서 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.aclass1.o, class2.oclass3.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

  1. ^ a b "application/x-archive". Retrieved 2019-03-11.
  2. ^ a b "ar(1) - Linux man page". Retrieved 3 October 2013.
  3. ^ "Static Libraries". TLDP. Retrieved 3 October 2013.
  4. ^ Linux Standard Base Core Specification, version 4.1, Chapter 15. Commands and Utilities > ar
  5. ^ 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]
  6. ^ a b Manual page for NET/2 ar file format
  7. ^ "ar.h". www.unix.com. The UNIX and Linux Forums.
  8. ^ "bminor/binutils-gdb: archive.c". GitHub.
  9. ^ ar – Reference, The Single UNIX Specification, Issue 7 from The Open Group
  10. ^ Manual page for NET/2 ranlib utility
  11. ^ Manual page for NET/2 ranlib file format
  12. ^ "ranlib.h". opensource.apple.com.
  13. ^ ar(5) – FreeBSD File Formats Manual
  14. ^ "ar.h(3HEAD)". docs.oracle.com. Oracle Corporation. 11 November 2014. Retrieved 14 November 2018.
  15. ^ Pietrek, Matt (April 1998), "Under The Hood", Microsoft Systems Journal, archived from the original on 2007-06-24, retrieved 2014-08-23
  16. ^ "llvm-mirror/llvm: archive.cpp (format detection)". GitHub. Retrieved 10 February 2020.
  17. ^ "ar". GNU Binary Utilities.

External links