rokdocs
v0.1

9.3. 패키지 아카이브 (.a) 포맷

라이브러리 패키지 foo 의 빌드 산출물은 두 파일입니다 (9.2.15).

파일내용
libfoo.a패키지의 object 를 codegen unit 마다 하나씩 담은 표준 ar archive (9.2.16)
foo.rokhir다운스트림이 단형화와 이름 해소에 쓰는 인터페이스 (9.4)

두 파일은 같은 디렉토리에 놓입니다. --extern foo=libfoo.a 와 --extern foo=foo.rokhir 는 서로 옆의 짝을 찾습니다 (9.2.3). 버전과 producer 같은 메타는 ROKHIR 의 header 에 있습니다 (9.4).

9.3.1. 표준 ar archive

libfoo.a 는 표준 Unix ar archive 입니다. ar, ranlib, nm, lld, clang 이 변환 없이 다룹니다.

ar t libfoo.a
part0.o
part1.o
...

9.3.2. object

각 object 는 AOT 빌드 파이프라인 이 codegen unit 하나에 대해 만든 표준 ELF / Mach-O / COFF object 입니다. 모두 합쳐 패키지의 concrete fn 가운데 패키지의 root 에서 닿는 것만 담습니다 (9.2.8).

섹션내용
.textconcrete fn 의 코드
.rodataconst, 리터럴, ScanTable
.datastatic 의 초기값
.bss0 으로 초기화되는 static

ScanTable 은 일반 상수 데이터이며, 생성된 등록 코드가 프로세스 시작 시 rok_gc_register_type 으로 런타임에 등록합니다 (8.2.13). rok 전용 섹션은 없습니다.

9.3.3. 정적 .a 원칙

모든 라이브러리 산출물은 정적 .a 입니다. 동적 라이브러리는 rok 의 표준 산출물이 아닙니다. FFI 로 동적 라이브러리를 부르는 것은 됩니다.

9.3.4. 버전 호환 검사

의존 패키지의 ROKHIR 을 읽을 때 ROKHIR 의 version 과 producer (그 ROKHIR 을 만든 rokc) 를 지금의 rokc 와 비교합니다. 다르면 무엇을 다시 빌드할지 밝히는 에러입니다 (9.4.9).

9.3.5. 심볼 노출

archive 가 노출하는 심볼은 그 object 들의 전역 심볼이며, 심볼 맹글링 을 따릅니다.

nm libfoo.a
0000000000000000 T _Y3f8a1c2b_foo_geom_distance_a7c91d8e44b2f190
0000000000000040 T _Y3f8a1c2b_foo_geom_Point_origin_b1234567...

9.3.6. 표준 라이브러리

표준 라이브러리 (rok::bare / core / std) 는 별도의 archive 로 배포하지 않습니다. 소스에서 컴파일하며 (--bootstrap), toolchain, 옵션, 소스가 같은 동안은 rokc 의 cache 에서 재사용합니다 (9.2.19).

9.3.7. 링크

clang main.o libfoo.a librokr.a -o my_binary

링커는 archive 의 object 중 필요한 심볼만 링크합니다. #[export_name] 으로 노출한 함수는 C 에서 직접 부를 수 있습니다.

extern uint32_t rok_compute(int32_t a, int32_t b);   // #[export_name("rok_compute")]
int main(void) { return (int)rok_compute(1, 2); }
clang main.c libfoo.a librokr.a -o my_binary

9.3.8. 안정성

archive 의 형식은 ABI 안정성 정책 을, ROKHIR 의 형식은 9.4 를 따릅니다.

GitHub에서 이 페이지 고치기