Post

🐒 chap3. λͺ©μ  파일

⭐ 3.1 ABI

βœ… ABI와 APIλž€?

ABI : μ‘μš©ν”„λ‘œκ·Έλž¨ 이진 μΈν„°νŽ˜μ΄μŠ€

API : μ‘μš©ν”„λ‘œκ·Έλž¨ μΈν„°νŽ˜μ΄μŠ€

API : 두 μ†Œν”„νŠΈμ›¨μ–΄ μ»΄ν¬λ„ŒνŠΈκ°€ μ„œλ‘œλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ μ„œλ‘œ κΈ°λŠ₯을 μ œκ³΅ν•  λ•Œ μˆ˜μš©ν•˜λŠ” κ·œμΉ™μ΄λ‚˜ ν‘œμ€€

1
    ( μš΄μ˜μ²΄μ œμ™€ μ‘μš©ν”„λ‘œκ·Έλž¨ μ‚¬μ΄μ˜ 톡신에 μ‚¬μš©λ˜λŠ” μ–Έμ–΄λ‚˜ λ©”μ‹œμ§€ ν˜•μ‹)

라이브러리λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„κΈ°μœ„ν•΄μ„œλŠ” APIλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€!

라이브러리 API μˆ˜μ • μ‹œ μ½”λ“œ μ—­μ‹œ μƒˆ API에 λ§žμΆ”μ–΄μ•Ό ν•œλ‹€!

βœ… ABI와 API의 차이점

ABI와 APIλŠ” μˆ˜μ€€(level)이 λ‹€λ₯΄λ‹€.

  • API : 두 μ†Œν”„νŠΈμ›¨μ–΄μ˜ μ»΄ν¬λ„ŒνŠΈ κ°„ ν˜Έν™˜μ„±μ„ 보μž₯ν•˜μ—¬ κΈ°λŠ₯적으둜 계속 ν˜‘λ ₯ν•  수 μžˆλ„λ‘ ν•œλ‹€.
  • ABI : 두 ν”„λ‘œκ·Έλž¨μ΄ 기계 μˆ˜μ€€μ˜ λͺ…λ Ήμ–΄ μˆ˜μ€€μ—μ„œ ν˜Έν™˜ κ°€λŠ₯ν•˜λ„λ‘ 두 ν”„λ‘œκ·Έλž¨ λͺ©μ  νŒŒμΌμ„ ν•¨κ»˜ μ‚¬μš©ν•  수 있게 ν•œλ‹€.

β†’ ν”„λ‘œκ·Έλž¨μ€ μ„œλ‘œ λ‹€λ₯Έ ABIλ₯Ό κ°–λŠ” 동적/정적 라이브러리λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€!

βœ… ABIκ°€ ν¬ν•¨ν•˜λŠ” λ‚΄μš©

  • λŒ€μƒ μ•„ν‚€ν…μ²˜μ˜ λͺ…λ Ήμ–΄ 집합 :ν”„λ‘œμ„Έμ„œ λͺ…λ Ήμ–΄, λ©”λͺ¨λ¦¬ λ ˆμ΄μ•„μ›ƒ, μ—”λ””μ–Έ endianness, λ ˆμ§€μŠ€ν„° λ“±
  • 기쑴의 μžλ£Œν˜•κ³Ό 크기 및 μ •λ ¬ κ·œμΉ™ alignment policy-
  • ν•¨μˆ˜ 호좜 κ·œμΉ™ convention : ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λŠ” 방식. 예λ₯Ό λ“€μ–΄ μŠ€νƒ ν”„λ ˆμž„μ˜ κ΅¬μ‘°λ‚˜, 인자의 μˆœμ„œλ₯Ό ν‘Έμ‹œ pushν•˜λŠ” λ¬Έμ œκ°€ ν•¨μˆ˜ 호좜 방식과 관련이 μžˆμŠ΅λ‹ˆλ‹€.

● μœ λ‹‰μŠ€ 계열 μ‹œμŠ€ν…œμ—μ„œ μ‹œμŠ€ν…œ 호좜 방식 μ •μ˜

● μ‚¬μš©λœ λͺ©μ  파일 ν˜•μ‹: 재배치 κ°€λŠ₯ν•œ μ‹€ν–‰ κ°€λŠ₯ν•œ, 곡유 λͺ©μ  νŒŒμΌμ— κ΄€ν•œ λ‚΄μš©(λ‹€μŒ μ ˆμ—μ„œ μ„€λͺ… ν•©λ‹ˆλ‹€)

  • C++ 컴파일러둜 μƒμ„±ν•œ λͺ©μ  파일의 λ„€μž„ 맹글링, 가상 ν…Œμ΄λΈ” virtual table λ ˆμ΄μ•„μ›ƒ

System V ABIλŠ” λ¦¬λˆ…μŠ€λ‚˜ BSD μ‹œμŠ€ν…œκ³Ό 같은 μœ λ‹‰μŠ€ 계열 μ‹œμŠ€ν…œμ—μ„œ κ°€μž₯ 널리 μ‚¬μš©λ˜λŠ” ABI ν‘œμ€€

μ‹€ν–‰ κ°€λŠ₯ν•œ 링크 파일 ν˜•μ‹ executable and linking format (ELF)은 System V ABIμ—μ„œ μ‚¬μš©λ˜λŠ” ν‘œμ€€ λͺ©μ  파일 ν˜•μ‹

⭐ 3.2 λͺ©μ  파일 ν˜•μ‹

βœ… λͺ©μ νŒŒμΌ

ν”Œλž«νΌμ—μ„œ λͺ©μ  νŒŒμΌμ—λŠ” 기계 μˆ˜μ€€μ˜ λͺ…λ Ήμ–΄λ₯Ό μ €μž₯ν•˜λŠ” λͺ©μ  파일만의 νŠΉμ • 파일 ν˜•μ‹μ΄ 쑴재

λ‹€μ–‘ν•œ μš΄μ˜μ²΄μ œμ—μ„œ μ‚¬μš©λ˜λŠ” 널리 μ•Œλ €μ§„ λͺ©μ  파일 ν˜•μ‹ μ˜ˆμ‹œ

  • λ¦¬λˆ…μŠ€μ™€ λ‹€λ₯Έ μœ λ‹‰μŠ€ 계열 μš΄μ˜μ²΄μ œμ—μ„œ μ‚¬μš©λ˜λŠ” ELF
  • OS X(macOS 및 iOS)μ—μ„œ μ‚¬μš©λ˜λŠ” Mach-0
  • λ§ˆμ΄ν¬λ‘œμ†Œν”„νŠΈ μœˆλ„μš°μ—μ„œ μ‚¬μš©λ˜λŠ” PE

βœ… a.out λͺ©μ νŒŒμΌ

  • ν˜„μ‘΄ν•˜λŠ” λͺ¨λ“  λͺ©μ  파일 ν˜•μ‹μ€ μ˜ˆμ „μ˜ a.out λͺ©μ  파일 ν˜•μ‹μ„ κ³„μŠΉν•œλ‹€.
  • 이 파일 ν˜•μ‹μ€ μœ λ‹‰μŠ€μ˜ 초기 버전을 μœ„ν•΄ μ„€κ³„λ˜μ—ˆλ‹€.
  • a.out은 μ–΄μ…ˆλΈ”λŸ¬ 좜λ ₯ κ²°κ³Ό assembler output을 λ‚˜νƒ€λ‚Έλ‹€.
  • μ˜€λŠ˜λ‚ μ—λŠ” 이 파일 ν˜•μ‹μ€ κ΅¬μ‹μ΄μ§€λ§Œ, 이 이름은 λŒ€λΆ€λΆ„μ˜ 링컀가 μƒμ„±ν•˜λŠ” μ‹€ν–‰ 파일의 κΈ°λ³Έ μ΄λ¦„μœΌλ‘œ μ—¬μ „νžˆ μ‚¬μš©λœλ‹€.

βœ… COFF λͺ©μ νŒŒμΌ

  • a.out ν˜•μ‹μ€ 곧 COFF Common Object File Format (곡용 λͺ©μ  파일 ν˜•μ‹)둜 λŒ€μ²΄λ˜μ—ˆλ‹€.
  • COFFλŠ” ELF의 ν† λŒ€κ°€ λ˜μ—ˆλ‹€(ELFλŠ” λŒ€λΆ€λΆ„μ˜ μœ λ‹‰μŠ€ 계열 μ‹œμŠ€ν…œμ—μ„œ μ‚¬μš©ν•˜λŠ” λͺ©μ  파일 ν˜•μ‹)
  • μ• ν”Œμ€ a.out을 OS/Xμ—μ„œ Mach-O둜 λ°”κΎΈμ—ˆλ‹€.
  • μœˆλ„μš°λŠ” λͺ©μ νŒŒμΌμ˜ ν˜•μ‹μœΌλ‘œ 이식 κ°€λŠ₯ν•œ μ‹€ν–‰ 파일(PE)을 μ‚¬μš©ν•˜λ©° COFFλ₯Ό 기반으둜 ν•œλ‹€.
  • μ˜€λŠ˜λ‚ μ˜ λͺ¨λ“  μ£Όμš” λͺ©μ  파일 ν˜•μ‹μ€ 역사적인 λͺ©μ  파일 ν˜•μ‹μΈ a.outκ³Ό COFFλ₯Ό κΈ°λ°˜μœΌλ‘œν•˜λ©° μ—¬λŸ¬ λ©΄μ—μ„œ 같은 쑰상을 κ³΅μœ ν•œλ‹€.

βœ… ELF λͺ©μ νŒŒμΌ

  • ELFλŠ” λ¦¬λˆ…μŠ€μ™€ λŒ€λΆ€λΆ„μ˜ μœ λ‹‰μŠ€ 계열 μš΄μ˜μ²΄μ œμ—μ„œ μ‚¬μš©λ˜λŠ” λͺ©μ  파일 ν˜•μ‹.
  • ELFλŠ” System V ABIμ—μ„œ μ‚¬μš©λ˜λŠ” λͺ©μ  파일 ν˜•μ‹
  • μ˜€λŠ˜λ‚ μ—λŠ” μš΄μ˜μ²΄μ œκ°€ μ‚¬μš©ν•˜λŠ” λͺ©μ  파일 ν˜•μ‹μœΌλ‘œ 널리 받아듀여지고 μžˆλ‹€.

ELFλŠ” μš΄μ˜μ²΄μ œμ— ν¬ν•¨λ˜λŠ” ν‘œμ€€ 이진 파일 ν˜•μ‹μ΄λ‹€. ν•˜μ§€λ§Œ μ•„λž˜ 4κ°œμ— κ΅­ν•œλ˜μ§€λŠ” μ•ŠλŠ”λ‹€.

  • λ¦¬λˆ…μŠ€
  • FreeBSD
  • NetBSD
  • Solaris

ELF의 기반 μ•„ν‚€ν…μ²˜κ°€ κ°™λ‹€λ©΄, μ΄λŸ¬ν•œ ν•œ μš΄μ˜μ²΄μ œμ—μ„œ μƒμ„±λœ ELF λͺ©μ  νŒŒμΌμ€ λ‹€λ₯Έ μš΄μ˜μ²΄μ œμ—μ„œλ„ μ‹€ν–‰ν•˜κ±°λ‚˜ μ‚¬μš©ν•  수 μžˆλ‹€. ELFλŠ” λ‹€λ₯Έ λͺ¨λ“  파일 ν˜•μ‹κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ μ–΄λ–€ ꡬ쑰λ₯Ό κ°–λŠ”λ°, λ‹€μŒ μ ˆμ—μ„œ κ°„λ‹¨νžˆ μ‚΄νŽ΄λ΄…λ‹ˆλ‹€.

⭐ 3.3 재배치 κ°€λŠ₯ν•œ λͺ©μ  파일

βœ… 재배치 κ°€λŠ₯ν•œ λͺ©μ νŒŒμΌμ΄λž€?

재배치 κ°€λŠ₯ν•œ(relocatable) 의 μ˜λ―ΈλŠ”?

  • 링컀가 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” κ³Όμ •μ—μ„œ λΉ„λ‘―λœ 의미

λ§μ»€λŠ” 재배치 κ°€λŠ₯ν•œ λͺ©μ  파일 μ—¬λŸ¬ 개λ₯Ό ν•œλ° λͺ¨μ•„μ„œ 더 큰 λͺ©μ  νŒŒμΌμ„ ν˜•μ„±ν•˜λŠ”λ°,

이 νŒŒμΌμ€ μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ©μ  파일 ν˜Ήμ€ 곡유 λͺ©μ  파일이라고 ν•©λ‹ˆλ‹€.

μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ—μ„œ μ°Ύμ•„λ³Ό 수 μžˆλŠ” ν•­λͺ©μ€ 이 νŒŒμΌμ„ κ΅¬μ„±ν•˜λŠ” λͺ¨λ“  재배치 κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ—μ„œ μ°Ύμ•„λ³Ό 수 μžˆλŠ” ν•­λͺ©μ˜ μ΄ν•©μ΄λΌλŠ” μ μž…λ‹ˆλ‹€. λ¨Όμ € 기계 μˆ˜μ€€μ˜ λͺ…λ Ήμ–΄λ₯Ό μ•Œμ•„λ΄…μ‹œλ‹€.

  • ν•˜λ‚˜μ˜ 재배치 κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ—μ„œ λ‚˜νƒ€λ‚˜λŠ” 기계 μˆ˜μ€€μ˜ λͺ…λ Ήμ–΄λŠ” λ‹€λ₯Έ μž¬λ°°μ§€ κ°€λŠ₯ν•œ λͺ©μ νŒŒμΌμ—μ„œ λ‚˜μ˜¨ 기계 μˆ˜μ€€μ˜ λͺ…λ Ήμ–΄ λ‹€μŒμ— μœ„μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • μ΄λŠ” 즉 λͺ…λ Ήμ–΄κ°€ 이동할 수 μžˆκ±°λ‚˜ 재배치 κ°€λŠ₯ relocatable ν•˜λ‹€λŠ” 점을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • λ”°λΌμ„œ 재배치 κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ—μ„œ λͺ…λ Ήμ–΄λŠ” μ£Όμ†Œλ₯Ό 갖지 μ•Šκ³  링크 단계λ₯Ό 거치고 λ‚˜μ„œμ•Ό λͺ…λ Ήμ–΄λŠ” μ£Όμ†Œλ₯Ό κ°€μ§‘λ‹ˆλ‹€.

[예제 3-1]은 두 개의 μ†ŒμŠ€ νŒŒμΌμ— κ΄€ν•œ κ²ƒμœΌλ‘œ, ν•œ μ†ŒμŠ€ νŒŒμΌμ€ max와 max_3μ΄λΌλŠ” ν•¨μˆ˜ 2개의 μ •μ˜λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€. λ‹€λ₯Έ μ†ŒμŠ€ νŒŒμΌμ€ μ„ μ–Έλœ ν•¨μˆ˜ max와 max_3λ₯Ό μ‚¬μš©ν•˜λŠ” main ν•¨μˆ˜λ₯Όν¬ν•¨ν•©λ‹ˆλ‹€. λ‹€μŒμ€ 첫 번째 μ†ŒμŠ€ 파일의 λ‚΄μš©μž…λ‹ˆλ‹€.

μ½”λ“œ λ°•μŠ€ 3-1 [예제 3-1]의 두 ν•¨μˆ˜μ˜ μ •μ˜λ₯Ό ν¬ν•¨ν•˜λŠ” 파일(ExtremeC_examples_chapter3_1.funcs.c)

1
2
3
4
5
6
7
int max(int a, int b) {
	return a > b ? a : b;
}
int max_3(int a,int b, int c){
	int temp = max(a, b);
	return c > temp ? c : temp;
}

그리고 두 번째 μ†ŒμŠ€ νŒŒμΌμ€ λ‹€μŒ [μ½”λ“œ λ°•μŠ€ 3-2]와 κ°™μŠ΅λ‹ˆλ‹€.

μ½”λ“œ λ°•μŠ€ 3-2 [예제 3-1]의 이미 μ„ μ–Έλœ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” main ν•¨μˆ˜: μ •μ˜λŠ” λ³„λ„μ˜ μ†ŒμŠ€ νŒŒμΌμ— 있음 (ExtremeC_examples_chapter3_1.c)

1
2
3
4
5
6
7
8
9
10
11
12
int max(int, int);
int max_3(int, int, int);

int a = 5;
int b = 10;

int main(int argc, char** argv) {
	int m1 = max(a, b);
	int m2 =  max_3(5, 8, -1);
	return 0;
}

μ•žμ˜ μ†ŒμŠ€ 파일둜 재배치 κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ„ λ§Œλ“€μ–΄λ΄…μ‹œλ‹€. μ΄λ ‡κ²Œ ν•΄μ„œ μ½”λ“œμ˜ λ‚΄μš© 및 μ•žμ„œ μ„€λͺ…ν•œ λ‚΄μš©μ„ μ‚΄νŽ΄λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ¦¬λˆ…μŠ€ λ¨Έμ‹ μ—μ„œ μ†ŒμŠ€λ₯Ό μ»΄νŒŒμΌν•˜λ―€λ‘œ, 컴파일 κ²°κ³Όλ‘œλŠ” ELF λͺ©μ  파일이 λ‚˜μ˜€κ²Œ λœλ‹€.

μ…€ λ°•μŠ€ 3-1 μ†ŒμŠ€ νŒŒμΌμ— ν•΄λ‹Ήν•˜λŠ” 재배치 κ°€λŠ₯ν•œ λͺ©μ  파일둜 μ»΄νŒŒμΌν•˜κΈ°

1
2
3
$ gcc -c ExtremeC_examples_chapter3_1_funcs.c -o funcs.o
$ gcc -c ExtremeC_examples_chapter3_1.c -o main.o
$

funcs.o와 main.oλŠ” λ‘˜ λ‹€ 재배치 κ°€λŠ₯ν•œ ELF λͺ©μ  νŒŒμΌμž…λ‹ˆλ‹€. ELF λͺ©μ  νŒŒμΌμ—μ„œλŠ” 재배치 κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ—μ„œ μ„œμˆ λœ ν•­λͺ©μ΄ ELF λͺ©μ  파일의 μ—¬λŸ¬ μ„Ήμ…˜μ— λ°°μΉ˜λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 재배치 κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ— ν˜„μž¬ μ‘΄μž¬ν•˜λŠ” μ„Ήμ…˜μ„ ν™•μΈν•˜λ €λ©΄ readelf μœ ν‹Έλ¦¬ν‹°λ₯Ό λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ…Έ λ°•μŠ€ 3-2 funcs.o λͺ©μ  파일의 ELF λ‚΄μš©

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
**$ readelf -hsl funcs.o**
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Data:  2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: REL
Machine: Advanved Micro Devices X86-64

...

Number of section headers: 12
Section header string table index: 11

14.png

⭐ 3.4 μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ©μ  파일

βœ… μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ©μ  파일

μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ©μ  파일이 C μ–Έμ–΄μ˜ ν”„λ‘œμ νŠΈμ˜ μ΅œμ’… κ²°κ³Όλ¬Ό 쀑 ν•˜λ‚˜μΌκΉŒ?

  • μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌλ„ 재배치 κ°€λŠ₯ν•œ λͺ©μ  파일처럼 기계 μˆ˜μ€€μ˜ λͺ…λ Ήμ–΄, μ΄ˆκΈ°ν™”λœ μ „μ—­ λ³€μˆ«κ°’, μ‹¬λ²Œ ν…Œμ΄λΈ”κ³Ό 같은 ν•­λͺ©μ„ κ°€μ§‘λ‹ˆλ‹€.
  • ν•˜μ§€λ§Œ μ •λ ¬arrangement 은 λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

ELF μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ€ μƒμ„±ν•˜κΈ°λ„ λ‚΄λΆ€ ꡬ쑰λ₯Ό μ΄ν•΄ν•˜κΈ°λ„ μ‰¬μš΄ 만큼, 이 파일과 κ΄€λ ¨ν•œ 차이점을 μ„€λͺ…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ‹€ν–‰ κ°€λŠ₯ν•œ ELF λͺ©μ  νŒŒμΌμ„ λ§Œλ“€κ³ μž [예제 3-1]둜 λ„˜μ–΄κ°€ λ³΄κ² μŠ΅λ‹ˆλ‹€. μ•ž μ ˆμ—μ„œ μ˜ˆμ œμ— μžˆλŠ” μ†ŒμŠ€ 2κ°œλ‘œλΆ€ν„° 재배치 κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ„ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λ²ˆμ—λŠ” κ·Έ νŒŒμΌμ„ 링크해 ν•˜λ‚˜μ˜ μ‹€ν–‰ νŒŒμΌμ„ λ§Œλ“€κ² μŠ΅λ‹ˆλ‹€.

μ•ž μž₯μ—μ„œ μ„€λͺ…ν•œ λŒ€λ‘œ λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

1
gcc funcs.o main.o -o ex3_1.out

μ•ž μ ˆμ—μ„œ ELF λͺ©μ  νŒŒμΌμ— μ‘΄μž¬ν•˜λŠ” μ„Ήμ…˜μ„ μ„€λͺ…ν–ˆμŠ΅λ‹ˆλ‹€.

  • ELF μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ—λŠ” 더 λ§Žμ€ μ„Ήμ…˜μ΄ μžˆλŠ”λ°, 이듀은 λͺ‡λͺ‡ μ„Έκ·Έλ¨ΌνŠΈμ™€ ν•¨κ»˜ μžˆμŠ΅λ‹ˆλ‹€.
  • λͺ¨λ“  ELF μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ©μ  파일과, 이μž₯의 ν›„λ°˜λΆ€μ—μ„œ 보게 될 ELF 곡유 λͺ©μ  νŒŒμΌμ€ μ„Ήμ…˜λΏλ§Œ μ•„λ‹ˆλΌ μ—¬λŸ¬ μ„Έκ·Έλ¨ΌνŠΈλ₯Ό κ°–μŠ΅λ‹ˆλ‹€.
  • 각 μ„Έκ·Έλ¨ΌνŠΈλŠ” λ§Žμ€ μ„Ήμ…˜ (0개 ν˜Ήμ€ κ·Έ 이상)으둜 κ΅¬μ„±λ˜λ©°, μ„Ήμ…˜μ€ λ‚΄μš©μ— 따라 μ„Έκ·Έλ¨ΌνŠΈμ— λ†“μž…λ‹ˆλ‹€.
    • 예λ₯Ό λ“€λ©΄ 기계 μˆ˜μ€€μ˜ λͺ…λ Ήμ–΄λ₯Ό ν¬ν•¨ν•˜λŠ” λͺ¨λ“  μ„Ήμ…˜μ€ 같은 μ„Έκ·Έλ¨ΌνŠΈμ— λ“€μ–΄κ°‘λ‹ˆλ‹€.

이제 μ‹€ν–‰ 파일의 λ‚΄μš©μ„ μ‚΄νŽ΄λ³΄κ³  μ„Έκ·Έλ¨ΌνŠΈλ„ λ§Œλ‚˜λ΄…μ‹œλ‹€. 재배치 κ°€λŠ₯ν•œ λͺ©μ  파일과 λ§ˆμ°¬κ°€μ§€λ‘œ, μ‹€ν–‰ κ°€λŠ₯ν•œ ELF λͺ©μ  νŒŒμΌμ— μžˆλŠ” μ„Ήμ…˜κ³Ό μ„Έκ·Έλ¨ΌνŠΈλ₯Ό 보렀면 같은 λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ…Έ λ°•μŠ€ 3-6 ex3_1.out μ‹€ν–‰ λͺ©μ  파일의 ELF λ‚΄μš©

1
readelf -hSl ex3_1.out

14.png

⭐ 3.5 정적 라이브러리

이전에 μ„€λͺ…ν•œ λŒ€λ‘œ 정적 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” C ν”„λ‘œμ νŠΈμ—μ„œ 얻을 수 μžˆλŠ” κ²°κ³Όλ¬Ό 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

이 μ ˆμ—μ„œλŠ” 정적 라이브러리λ₯Ό 닀루며 μ–΄λ–»κ²Œ μƒμ„±λ˜κ³  μ‚¬μš©λ˜λŠ”μ§€λ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. κ·Έλ‹€ 음 μ ˆμ—μ„œλŠ” 동적 라이브러리λ₯Ό μ†Œκ°œν•˜λ©° μ„€λͺ…을 κ³„μ†ν•˜κ² μŠ΅λ‹ˆλ‹€. 정적 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” μ‰½κ²Œ 말해 재배치 κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ—μ„œ λ§Œλ“€μ–΄μ§€λŠ” μœ λ‹‰μŠ€ μ•„μΉ΄μ΄λΈŒμž…λ‹ˆλ‹€.

정적 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” λ‹€λ₯Έ λͺ©μ  파일과 ν•¨κ»˜ λ§ν¬λ˜μ–΄ μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ„ ν˜•μ„±ν•©λ‹ˆλ‹€. 정적 라이브러리 κ·Έ μžμ²΄λŠ” λͺ©μ  파일둜 λ³Ό 수 μ—†μœΌλ©°, 였히렀 λͺ©μ  νŒŒμΌμ„ μœ„ν•œ μ»¨ν…Œμ΄λ„ˆμž…λ‹ˆ λ‹€. 즉 λ¦¬λˆ…μŠ€ μ‹œμŠ€ν…œμ—μ„œ 정적 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” ELF 파일이 μ•„λ‹™λ‹ˆλ‹€. λ˜ν•œ macOS μ‹œμŠ€ν…œμ—μ„œ Mach-O 파일인 것도 μ•„λ‹™λ‹ˆλ‹€.

정적 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” μœ λ‹‰μŠ€μ˜ ar μœ ν‹Έλ¦¬ν‹°λ‘œ νŒŒμΌμ„ μ•„μΉ΄μ΄λΈŒν•  λΏμž…λ‹ˆλ‹€. 링컀가 링크 λ‹¨κ³„μ—μ„œ 정적 라이브러리λ₯Ό μ‚¬μš©ν•˜λ €κ³  ν•  λ•Œ, μš°μ„  재배치 κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ—μ„œ 정적 라이브러리λ₯Ό μΆ”μΆœν•˜λ €κ³  μ‹œλ„ν•©λ‹ˆλ‹€. κ·Έλ‹€μŒμ—λŠ” κ±°κΈ°μ„œ μ •μ˜λ˜μ§€ μ•Šμ€ μ‹¬λ²Œμ„ μ°Ύμ•„ μ„œ ν•΄κ²°ν•˜κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€.

μ΄λ²ˆμ—λŠ” μ—¬λŸ¬ 개의 μ†ŒμŠ€ νŒŒμΌμ„ 가진 ν”„λ‘œμ νŠΈμ—μ„œ 정적 라이브러리λ₯Ό λ§Œλ“€μ–΄λ³Ό μ°¨λ‘€μž…λ‹ˆλ‹€. 첫 번째 λ‹¨κ³„λŠ” 재배치 κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ„ λ§Œλ“œλŠ” μΌμž…λ‹ˆλ‹€. C/C++ ν”„λ‘œμ νŠΈμ˜ λͺ¨λ“  μ†ŒμŠ€ 파 일을 μ»΄νŒŒμΌν•˜κ³  λ‚˜λ©΄ 정적 라이브러리의 μ•„μΉ΄μ΄λΈŒ νŒŒμΌμ„ λ§Œλ“€κ³ μž μœ λ‹‰μŠ€μ˜ μ•„μΉ΄μ΄λΈŒ 도ꡬ 인 ar을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μœ λ‹‰μŠ€ μ‹œμŠ€ν…œμ—μ„œ 정적 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” 널리 μ‚¬μš©λ˜κ³  μˆ˜μš©λ˜λŠ” κ·œμΉ™μ— 따라 이름이 λΆ™μŠ΅λ‹ˆλ‹€. 이름은 Lib둜 μ‹œμž‘ν•˜κ³ . ν™•μž₯자둜 λλ‚©λ‹ˆλ‹€. λ‹€λ₯Έ μš΄μ˜μ²΄μ œμ—μ„œλŠ” λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Όλ“€μ–΄ μœˆλ„μš°μ—μ„œλŠ” 정적 λΌμ΄λΈŒλŸ¬λ¦¬μ—.libν™•μž₯μžκ°€ λΆ™μŠ΅λ‹ˆλ‹€.

κ°€μƒμ˜ C ν”„λ‘œμ νŠΈμ—μ„œ aa.c, bb.cλΆ€ν„° zz.cκΉŒμ§€ μ—¬λŸ¬ μ†ŒμŠ€ νŒŒμΌμ„ κ°€μ‘Œλ‹€κ³  κ°€μ •ν•΄λ΄…μ‹œλ‹€. 재배치 κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ„ λ§Œλ“€λ €λ©΄ λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•œ 것과 λΉ„μŠ·ν•œ λ°©μ‹μœΌλ‘œ μ†ŒμŠ€ νŒŒμΌμ„ μ»΄νŒŒμΌν•΄μ•Ό ν•©λ‹ˆλ‹€. 컴파일 과정은 이전 μž₯μ—μ„œ μžμ„Ένžˆ μ‚΄νŽ΄λ΄€μœΌλ‹ˆ μ°Έκ³ ν•˜μ„Έμš”.

μ—¬λŸ¬ μ†ŒμŠ€ νŒŒμΌμ„ 그에 ν•΄λ‹Ήν•˜λŠ” 재배치 κ°€λŠ₯ν•œ λͺ©μ  파일둜 μ»΄νŒŒμΌν•˜κΈ°

1
2
3
gcc -c aa.c -o aa.o
gcc -c bb.c -o bb.o
gcc -c ZZ.C -O zz.0

⭐ 3.6 동적 라이브러리

동적 라이브러리 ν˜Ήμ€ 곡유 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” μž¬μ‚¬μš©μ„ μœ„ν•œ 라이브러리λ₯Ό λ§Œλ“œλŠ” 또 λ‹€λ₯Έ λ°©μ‹μž…λ‹ˆλ‹€. μ΄λ¦„λŒ€λ‘œ, 정적 λΌμ΄λΈŒλŸ¬λ¦¬μ™€λŠ” 달리 동적 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” κ·Έ μžμ²΄κ°€ μ‹€ν–‰ νŒŒμΌμ— ν•΄λ‹Ήν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. λŒ€μ‹  동적 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” 싀행을 μœ„ν•œ ν”„λ‘œμ„ΈμŠ€κ°€ λ‘œλ”©λ  λ•Œ κ°€μ Έμ™€μ„œ λ‘œλ“œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

정적 λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ‹€ν–‰ 파일의 μΌλΆ€μ΄λ―€λ‘œ, λ§μ»€λŠ” 주어진 재배치 κ°€λŠ₯ν•œ 파일의 λͺ¨λ“  κ²ƒμ„μ΅œμ’… μ‹€ν–‰ νŒŒμΌμ— λ„£μŠ΅λ‹ˆλ‹€. 즉, λ§μ»€λŠ” μ •μ˜λ˜μ§€ μ•Šμ€ μ‹¬λ²Œμ„ κ°μ§€ν•˜κ³ , μ •μ˜κ°€ ν•„μš”ν•˜λ©°, 이λ₯Ό 주어진 재배치 κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ—μ„œ 찾고자 ν•˜κ³ , κ·Έλ ‡κ²Œ 좜λ ₯λ˜λŠ” μ΅œμ’… νŒŒμΌμ— λͺ¨λ“  것을 μ§‘μ–΄λ„£μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  μ •μ˜λ˜μ§€ μ•Šμ€ μ‹¬λ²Œμ„ μ°Ύκ³  λ‚˜μ„œμ•Ό μ΅œμ’… 결과물이 λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€. κ³ μœ ν•œ κ΄€μ μ—μ„œ 링크 λ‹¨κ³„μ—μ„œ λͺ¨λ“  μ‹¬λ²Œμ˜ 의쑴 관계λ₯Ό μ°Ύμ•„μ„œ ν•΄κ²°ν•©λ‹ˆλ‹€. 동적 라이브러리의 경우 μ •μ˜λ˜μ§€ μ•Šμ€ μ‹¬λ²Œμ„ κ°€μ§ˆ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ •μ˜λ˜μ§€ μ•Šμ€ μ‹¬λ²Œμ€ 링크 λ‹¨κ³„μ—μ„œ ν•΄κ²°λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ‹€ν–‰ 파일이 λ‘œλ“œλ˜κ³  싀행을 μ‹œμž‘ν•  λ•Œ 이 μ‹¬λ²Œμ„ κ²€μƒ‰ν•©λ‹ˆλ‹€.

즉, μ •μ˜λ˜μ§€ μ•Šμ€ 동적 μ‹¬λ²Œμ„ 찾고자 ν•  λ•ŒλŠ” λ‹€λ₯Έ μ’…λ₯˜μ˜ 링크 단계가 ν•„μš”ν•©λ‹ˆλ‹€. μ‹€ν–‰ νŒŒμΌμ„ λ‘œλ“œν•˜κ³  ν”„λ‘œμ„ΈμŠ€λ‘œ 싀행될 μ€€λΉ„λ₯Ό ν•  λ•Œ, 동적 링컀 dynamic linker ν˜Ήμ€ κ°„λ‹¨νžˆλŠ” λ‘œλ”loaderκ°€ 주둜 이 링크λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.

μ •μ˜λ˜μ§€ μ•Šμ€ 동적 μ‹¬λ²Œμ„ μ‹€ν–‰ νŒŒμΌμ—μ„œ 찾을 수 μ—†μœΌλ―€λ‘œ μ–΄λ”˜κ°€ λ‹€λ₯Έ κ³³μ—μ„œ μ°Ύμ•„μ•Ό ν•©λ‹ˆλ‹€. 이 μ‹¬λ²Œμ€ 곡유 λͺ©μ  νŒŒμΌμ—μ„œ λ‘œλ“œν•΄μ•Ό ν•©λ‹ˆλ‹€. 곡유 λͺ©μ  νŒŒμΌμ€ 정적 라이브러리 파일의 자맀 격인 νŒŒμΌμž…λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ μœ λ‹‰μŠ€ 계열 μ‹œμŠ€ν…œμ—μ„œ 정적 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” . ν™•μž₯자λ₯Ό κ°–μ§€λ§Œ, 정적 λͺ©μ  νŒŒμΌμ€ .SO ν™•μž₯자λ₯Ό κ°–μŠ΅λ‹ˆλ‹€. macOSμ—μ„œλŠ” dylib ν™•μž₯자λ₯Ό κ°€μ§‘λ‹ˆλ‹€. ν”„λ‘œμ„ΈμŠ€λ₯Ό λ‘œλ“œν•˜κ³  μ‹€ν–‰ν•  λ•Œ, 곡유 λͺ©μ  파일이 λ‘œλ“œλ˜λ©° ν”„λ‘œμ„ΈμŠ€κ°€ μ ‘κ·Όν•  수 μžˆλŠ” λ©”λͺ¨λ¦¬ 지역에 이 파일이 μ—°κ²°λ©λ‹ˆλ‹€. 이 μ ˆμ°¨λŠ” 동적 링컀 (ν˜Ήμ€ λ‘œλ”)에 μ˜ν•΄ μˆ˜ν–‰λ˜λ©°, 동적 λ§μ»€λŠ” μ‹€ν–‰ νŒŒμΌμ„ λ‘œλ“œν•˜κ³  μ‹€ν–‰ν•©λ‹ˆλ‹€.

μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ— λŒ€ν•œ μ ˆμ—μ„œ μ„€λͺ…ν•œ λŒ€λ‘œ, ELF μ‹€ν–‰ 파일 및 곡유 λͺ©μ  νŒŒμΌμ€ 각자의 ELF ꡬ쑰 내에 μ„Έκ·Έλ¨ΌνŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€. 각 μ„Έκ·Έλ¨ΌνŠΈ μ•ˆμ—λŠ” 0개 ν˜Ήμ€ κ·Έ μ΄μƒμ˜ μ„Ήμ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€. ELF μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ©μ  파일과 ELF 곡유 λͺ©μ  파일 κ°„μ—λŠ” μ£Όμš” 차이점이 두 가지 μžˆμŠ΅λ‹ˆλ‹€. 첫 번째, μ‹¬λ²Œμ΄ μƒλŒ€μ μΈ μ ˆλŒ€ μ£Όμ†Œλ₯Ό 가지며 이 μ£Όμ†Œλ₯Ό 톡해 μ‹¬λ²Œμ΄ μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€μ— λ™μ‹œμ— λ‘œλ“œλ˜λ„λ‘ ν•©λ‹ˆλ‹€.

μ΄λŠ” 각 λͺ…λ Ήμ–΄μ˜ μ£Όμ†Œκ°€ ν”„λ‘œμ„ΈμŠ€μ—μ„œ λ‹€λ₯Έ ν•œνŽΈ, 두 λͺ…λ Ήμ–΄ μ‚¬μ΄μ˜ κ±°λ¦¬λŠ” κ³ μ •λ˜μ–΄ μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. λ‹€μ‹œ λ§ν•˜λ©΄ μ£Όμ†ŒλŠ” μ˜€ν”„μ…‹ offset에 μƒλŒ€μ μœΌλ‘œ κ³ μ •λ©λ‹ˆλ‹€.

μ΄λŠ” 재배치 κ°€λŠ₯ν•œ λͺ©μ  파일이 μœ„μΉ˜ 독립적 position independent이기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 이번 μž₯의 λ§ˆμ§€λ§‰ λΆ€λΆ„μ—μ„œ 더 μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, ν•œ ν”„λ‘œμ„ΈμŠ€μ—μ„œ 두 λͺ…λ Ήμ–΄κ°€ 100κ³Ό 200μ΄λΌλŠ” μ£Όμ†Œμ— μœ„μΉ˜ν•˜κ³ , λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ—μ„œλŠ” λͺ…λ Ήμ–΄κ°€ 140κ³Ό 240, 또 λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ—μ„œλŠ” 323κ³Ό 423에 μžˆλ‹€κ³  ν•΄λ΄…μ‹œλ‹€.

μ„œλ‘œ μ—°κ΄€ 된 μ£Όμ†ŒλŠ” μ ˆλŒ€μ μ΄μ§€λ§Œ, μ‹€μ œ μ£Όμ†ŒλŠ” λ³€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 두 λͺ…λ Ήμ–΄λŠ” μ–Έμ œλ‚˜ μ£Όμ†Œκ°€ μ„œλ‘œ 100만큼 λ–¨μ–΄μ Έ μžˆμ„ κ²ƒμž…λ‹ˆλ‹€. 두 번째 차이점은 ELF μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ— κ΄€λ ¨λœ μ„Έκ·Έλ¨ΌνŠΈκ°€ 곡유 λͺ©μ  νŒŒμΌμ—λŠ” 쑴재 ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” κ²°κ΅­ 곡유 λͺ©μ  파일이 싀행될 수 μ—†μŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

곡유 λͺ©μ  파일이 λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ–΄λ–»κ²Œ μ ‘κ·Όν•˜λŠ”μ§€ μ„ΈλΆ€μ μœΌλ‘œ μ„€λͺ…ν•˜κΈ° 전에, 곡유 λͺ©μ  파일이 μ–΄λ–»κ²Œ μƒμ„±λ˜κ³  μ‚¬μš©λ˜λŠ”μ§€μ— κ΄€ν•œ 예제λ₯Ό μ‚΄νŽ΄λ΄μ•Ό ν•©λ‹ˆλ‹€. λ”°λΌμ„œ μ•ž μ ˆμ—μ„œ μž‘μ—…ν•œ [예제 3-2]와 λ™μΌν•œ κΈ°ν•˜ν•™ 라이브러리λ₯Ό μœ„ν•œ 동적 라이브러리λ₯Ό μƒμ„±ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ•žμ„œ κΈ°ν•˜ν•™ 라이브러리λ₯Ό μœ„ν•œ 정적 라이브러리λ₯Ό μƒμ„±ν–ˆμŠ΅λ‹ˆλ‹€. μ΄λ²ˆμ—λŠ” 곡유 λͺ©μ  νŒŒμΌμ„λ§Œλ“€κ³ μž μ†ŒμŠ€λ₯Ό λ‹€μ‹œ μ»΄νŒŒμΌν•˜λ € ν•©λ‹ˆλ‹€. λ‹€μŒ λͺ…λ Ήμ–΄λŠ” 3개의 μ†ŒμŠ€ νŒŒμΌμ„ 재배치 κ°€λŠ₯ν•œ λͺ©μ  파일둜 μ»΄νŒŒμΌν•˜λŠ” 방법을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. [예제 3-2]에 λΉ„ν•˜λ©΄ 단 ν•˜λ‚˜μ˜ 차이만 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ λͺ…λ Ήμ–΄μ—μ„œ -fPIC μ˜΅μ…˜μ΄ gcc둜 μ „λ‹¬λœλ‹€λŠ” 점에 μ£Όμ˜ν•˜μ„Έμš”.

1
2
3
gcc -c Extremec_examples_chapter3_2_2d.c -fPIC -o 2d.o
gcc -c ExtremeC_examples_chapter3_2_3d.c -fPIC -o 3d.o
gcc -c ExtremeC_examples_chapter3_2_trigon.c -fPIC -o trigon.o

λͺ…λ Ήμ–΄λ₯Ό 보면 μ†ŒμŠ€λ₯Ό μ»΄νŒŒμΌν•˜λŠ” λ™μ•ˆ gcc에 μΆ”κ°€ μ˜΅μ…˜μΈ FPICλ₯Ό μ „λ‹¬ν–ˆλ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ 재배치 κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ—μ„œ 곡유 λͺ©μ  νŒŒμΌμ„ λ§Œλ“€λ €κ³  ν•œλ‹€λ©΄ 이 μ˜΅μ…˜μ€ λ°˜λ“œμ‹œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

PICλŠ” μœ„μΉ˜ 독립적인 μ½”λ“œ position independent codeλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μ•žμ„œ μ„€λͺ…ν•œλŒ€λ‘œ λ§Œμ•½ 재배치 κ°€λŠ₯ν•œ λͺ©μ  파일이 μœ„μΉ˜ 독립적이라면, μ΄λŠ” 곧 파일 μ•ˆμ˜ λͺ…λ Ήμ–΄ instructionκ°€κ³ μ • μ£Όμ†Œλ₯Ό 갖지 μ•ŠλŠ”λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. κ·Έ λŒ€μ‹  μƒλŒ€ μ£Όμ†Œλ₯Ό κ°€μ§‘λ‹ˆλ‹€. λ”°λΌμ„œ 재배치 κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ€ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ—μ„œ λ‹€λ₯Έ μ£Όμ†Œλ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. 곡유 λͺ©μ  νŒŒμΌμ„ μ‚¬μš©ν•˜λŠ” 방식 λ•Œλ¬Έμ— μ΄λŠ” ν•„μˆ˜ μ‘°κ±΄μž…λ‹ˆλ‹€.

ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€λ₯Έ 경우 λ‘œλ” ν”„λ‘œκ·Έλž¨μ΄ 같은 μ£Όμ†Œμ—μ„œ 곡유 λͺ©μ  νŒŒμΌμ„ λ‘œλ“œν•˜λ¦¬λΌλŠ” 보μž₯은 μ—†μŠ΅λ‹ˆλ‹€. 사싀 λ‘œλ”λŠ” 곡유 λͺ©μ  νŒŒμΌμ— λ©”λͺ¨λ¦¬ 맀핑을 μƒμ„±ν•˜κ³ , κ·ΈλŸ¬ν•œ 맀핑을 μœ„ν•œ μ£Όμ†Œμ˜ λ²”μœ„λŠ” λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ λͺ…λ Ήμ–΄μ˜ μ£Όμ†Œκ°€ μ ˆλŒ€μ μ΄λΌλ©΄, λ‹€μ–‘ν•œ ν”„λ‘œμ„ΈμŠ€λ‚˜ λ‹€μ–‘ν•œ λ©”λͺ¨λ¦¬ μ§€μ—­μ—μ„œ 같은 곡유 λͺ©μ  νŒŒμΌμ„ λ™μ‹œμ— λ‘œλ“œν•  수 μ—†μŠ΅λ‹ˆλ‹€.

곡유 λͺ©μ  νŒŒμΌμ„ λ§Œλ“€λ €λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ ν•„μš”ν•˜λ©°, μ—¬κΈ°μ„œλŠ” λ‹€μ‹œ gccλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 정적 라이브러리 νŒŒμΌκ³ΌλŠ” 달리 곡유 λͺ©μ  νŒŒμΌμ€ λ‹¨μˆœν•œ μ•„μΉ΄μ΄λΈŒμ΄λ©°, 곡유 λͺ©μ  νŒŒμΌμ€ κ·Έ 자체둜 λͺ©μ  νŒŒμΌμž…λ‹ˆλ‹€. λ”°λΌμ„œ 재배치 κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ„ λ§Œλ“€λ €λ©΄ μ‚¬μš©ν•œ 것과 λ™μΌν•œ 링컀 ν”„λ‘œκ·Έλž¨μœΌλ‘œ 생성해야 ν•©λ‹ˆλ‹€.

μ•Œλ‹€μ‹œν”Ό λŒ€λΆ€λΆ„μ˜ μœ λ‹‰μŠ€ 계열 μ‹œμŠ€ν…œμ—μ„œ ldκ°€ μ»΄νŒŒμΌμ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ•žμ„œ μ„€λͺ…ν•œ 이유 λ•Œλ¬Έμ— ldλ₯Ό 직접 μ‚¬μš©ν•΄μ„œ λͺ©μ  νŒŒμΌμ„ λ§ν¬ν•˜μ§€ μ•ŠκΈ°λ₯Ό κ°•λ ₯히 κΆŒκ³ ν•©λ‹ˆλ‹€. λ‹€μŒ λͺ…λ Ήμ–΄λŠ” -fPIC μ˜΅μ…˜μ„ μ‚¬μš©ν•΄ μ»΄νŒŒμΌν•œ μ—¬λŸ¬ 재배치 κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌλ‘œλΆ€ν„° 곡유 λͺ©μ  νŒŒμΌμ„ λ§Œλ“œλŠ” 법을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

1
2
3
4
gcc -shared 2d.o 3d.o trigon.o -o libgeometry.so
mkdir -p /opt/geometry
mv libgeometry.so /opt/geometry
sudo mv libgeometry.so ../../../../opt/geometry/

첫 번째 λͺ…λ Ήμ–΄μ—μ„œ λ³Ό 수 μžˆλ“― -shared μ˜΅μ…˜μ„ gcc에 전달해 재배치 κ°€λŠ₯ν•œ λͺ©μ  νŒŒμΌμ—μ„œ 곡유 λͺ©μ  νŒŒμΌμ„ μƒμ„±ν•˜λ„λ‘ μ§€μ‹œν–ˆμŠ΅λ‹ˆλ‹€. 이 결과둜 곡유 λͺ©μ  νŒŒμΌμ€ libgeometry.so λΌλŠ” 이름이 λΆ™μŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” 곡유 λͺ©μ  νŒŒμΌμ„ opt/geometry둜 이동해 λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ΄ μ‚¬μš©ν•˜κΈ° μ‰½κ²Œ λ‘μ—ˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ [예제 3-3]을 λ‹€μ‹œ μ»΄νŒŒμΌν•˜κ³  λ§ν¬ν•˜λŠ” λ‹¨κ³„μž…λ‹ˆλ‹€.

μ•žμ—μ„œλŠ” [예제 3-3] μ»΄νŒŒμΌν•΄ 정적 라이브러리 파일인 libgeometry.a와 λ§ν¬ν–ˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ—μ„œλ„ 같은 과정을 μˆ˜ν–‰ν•˜μ§€λ§Œ, λ§ν¬λŠ” libgeometry.so, 즉 동적 λΌμ΄λΈŒλŸ¬λ¦¬μ™€ λ§ν¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  것은 κ°™μ•„ λ³΄μž…λ‹ˆλ‹€. 특히 λͺ…령어도 λ˜‘κ°™μ•„ λ³΄μ΄μ§€λ§Œ, 사싀은 λ‹€λ¦…λ‹ˆλ‹€. μ΄λ²ˆμ—λŠ” libgeometry.a λŒ€μ‹  libgeometry.so [예제 3-3]을 λ§ν¬ν•©λ‹ˆλ‹€. κ²Œλ‹€κ°€ 동적 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” μ΅œμ’… μ‹€ν–‰ νŒŒμΌμ— μž„λ² λ“œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λŒ€μ‹  μ‹€ν–‰ν•  λ•Œ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ λ‘œλ“œλ©λ‹ˆλ‹€.

μ—°μŠ΅μ„ μœ„ν•΄ [예제 3-3]을 λ‹€μ‹œ λ§ν¬ν•˜κΈ° μ „ opt/geometryμ—μ„œ 정적 라이브러리 파일 libgeometry.aλ₯Ό μ œκ±°ν•©μ‹œλ‹€.

1
2
3
rm -fv /opt/geometry/libgeometry.a
gcc -c ExtremeC_examples_chapter3_3.c -o main.o
gcc main.o -L/opt/geometry -lgeometry -lm -o ex3_3.out

μ•žμ„œ μ„€λͺ…ν•œ λŒ€λ‘œ-lgeometry μ˜΅μ…˜μ€ μ»΄νŒŒμΌλŸ¬κ°€ 정적 ν˜Ήμ€ 동적 라이브러리λ₯Ό μ°Ύμ•„μ„œ μ‚¬μš©ν•˜λ„λ‘ ν•˜κ³ , κ·Έ νŒŒμΌμ„ λ‚˜λ¨Έμ§€ λͺ©μ  파일과 λ§ν¬ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.

정적 라이브러리 νŒŒμΌμ„ μ œκ±°ν–ˆμœΌλ―€λ‘œ 곡유 λͺ©μ  파일이 μ„ νƒλ©λ‹ˆλ‹€. λ§Œμ•½ 지정 κ²½λ‘œμ— 정적 λΌμ΄λΈŒλŸ¬λ¦¬μ™€ 곡유 λͺ©μ  파일이 λ‘˜ λ‹€ μ‘΄μž¬ν•œλ‹€λ©΄, gccλŠ” 곡유 λͺ©μ  νŒŒμΌμ„ 선택해 ν”„λ‘œκ·Έλž¨κ³Ό λ§ν¬ν•©λ‹ˆλ‹€.μ‹€ν–‰ 파일인 ex3_3.out을 μ‹€ν–‰ν•˜λ©΄ λŒ€λΆ€λΆ„ λ‹€μŒκ³Ό 같은 였λ₯˜κ°€ λ‚˜νƒ€λ‚©λ‹ˆλ‹€.

1
./ex3_3.out

μ§€κΈˆκΉŒμ§€λŠ” 정적 링크와 정적 라이브러리λ₯Ό μ‚¬μš©ν–ˆμœΌλ―€λ‘œ 이런 였λ₯˜λ₯Ό λ³Ό 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ΄λ²ˆμ—λŠ” 동적 라이브러리λ₯Ό κ°€μ Έμ™”μœΌλ―€λ‘œ, λ§Œμ•½ 동적 μ˜μ‘΄μ„± dynamic dependency을 κ°–λŠ” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•œλ‹€λ©΄ 싀행에 ν•„μš”ν•œ 동적 라이브러리λ₯Ό μ œκ³΅ν•΄μ•Ό ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 무슨 일이 λ°œμƒν–ˆμœΌλ©° μ™œ 이런 였λ₯˜ λ©”μ‹œμ§€λ₯Ό λ°›κ²Œ λ κΉŒμš”?

μ‹€ν–‰ 파일 ex3_3.out은 ν•„μš”ν•œ μ •μ˜μ˜ 일뢀λ₯Ό 곡유 λͺ©μ  νŒŒμΌμ—μ„œλ§Œ μ°ΎμœΌλ―€λ‘œ libgeometry.so에 μ˜μ‘΄ν•©λ‹ˆλ‹€. 정적 라이브러리인 libgeometry.aμ—μ„œλŠ” 그렇지 μ•Šλ‹€λŠ” 점을 μ•Œμ•„λ‘μ„Έμš”.

정적 λΌμ΄λΈŒλŸ¬λ¦¬μ™€ 링크된 μ‹€ν–‰ νŒŒμΌμ€ 독립 μ‹€ν–‰ 파일 standalone executableμ—μ„œ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 정적 라이브러리 νŒŒμΌλ‘œλΆ€ν„° λͺ¨λ“  것을 λ³΅μ œν•˜κΈ° λ•Œλ¬Έμ΄λ©° λ”°λΌμ„œ 정적 라이브러리 파일의 μ‘΄μž¬μ— λ”λŠ” μ˜μ‘΄ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

곡유 λͺ©μ  νŒŒμΌμ—μ„œλŠ” 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨ λ‘œλ”κ°€ κΈ°λ³Έ 탐색 κ²½λ‘œμ—μ„œ libgeometry.soλ₯Ό 찾을 수 μ—†μœΌλ―€λ‘œ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ―€λ‘œ 탐색 κ²½λ‘œμ— /opt/geometryλ₯Ό μΆ”κ°€ν•΄μ„œ κ±°κΈ°μ—μ„œ libgeometry.soλ₯Ό 찾을 수 μžˆλ„λ‘ ν•΄μ•Ό ν•©λ‹ˆλ‹€. 경둜λ₯Ό μΆ”κ°€ν•˜κΈ° μœ„ν•΄ ν™˜κ²½λ³€μˆ˜μΈ LD_LIBRARY_PATHκ°€ ν˜„μž¬ 경둜λ₯Ό 가리킀도둝 μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

λ‘œλ”λŠ” ν™˜κ²½ λ³€μˆ˜λ₯Ό 검사할 것이고, ν•„μš”ν•œ 곡유 라이브러리λ₯Ό 지정 κ²½λ‘œμ—μ„œ 검색할 κ²ƒμž…λ‹ˆλ‹€. ν™˜κ²½ λ³€μˆ˜μ—λŠ” ν•˜λ‚˜ μ΄μƒμ˜ 경둜λ₯Ό 지정할 수 μžˆλ‹€λŠ” 점을 μ•Œμ•„λ‘μ„Έμš”

1
2
export LD_LIBRARY_PATH=/opt/geometry
./ex3_3.out

μ΄λ²ˆμ—λŠ” ν”„λ‘œκ·Έλž¨μ΄ μ„±κ³΅μ μœΌλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨ λ‘œλ”κ°€ 곡유 λͺ©μ  νŒŒμΌμ„ μ°Ύμ•˜κ³  동적 링컀가 κ·Έ νŒŒμΌλ‘œλΆ€ν„° ν•„μš”ν•œ μ‹¬λ²Œμ„ μ„±κ³΅μ μœΌλ‘œ λ‘œλ“œν–ˆλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

μ•žμ˜ μ…Έ λ°•μŠ€μ—μ„œ LD_LIBRARY_PATHλ₯Ό λ³€κ²½ν•˜λ €κ³  export λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν–ˆμœΌλ‹ˆ μœ μ˜ν•˜μ„Έμš”. ν•˜μ§€λ§Œ μΌλ°˜μ μœΌλ‘œλŠ” ν™˜κ²½ λ³€μˆ˜λ₯Ό μ‹€ν–‰ λͺ…령어와 ν•¨κ»˜ μ„€μ •ν•©λ‹ˆλ‹€. λ‹€μŒ μ…Έ λ°•μŠ€μ—μ„œ 이λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš© κ²°κ³ΌλŠ” λ‘˜ λ‹€ κ°™μŠ΅λ‹ˆλ‹€.

같은 λͺ…λ Ήμ–΄λ‘œ LD_LIBRARY_PATH의 경둜λ₯Ό 지정해 [예제 3-3]을 μ‹€ν–‰ν•˜κΈ°

1
LD_LIBRARY_PATH=/opt/geometry ./ex3_3.out

μ•žμ—μ„œ ν•œ λŒ€λ‘œ λͺ‡ 개의 곡유 λͺ©μ  파일과 μ‹€ν–‰ 파일 ν•˜λ‚˜λ₯Ό λ§ν¬ν•¨μœΌλ‘œμ¨, 이 μ‹€ν–‰ 파일이 μ‹€ν–‰ μ‹œ at runtime λ§Žμ€ 곡유 라이브러리λ₯Ό μ°Ύμ•„μ„œ λ‘œλ“œν•΄μ•Ό ν•œλ‹€κ³  μ‹œμŠ€ν…œμ— λͺ…λ Ήν•©λ‹ˆλ‹€.

λ”°λΌμ„œ μ‹€ν–‰ νŒŒμΌμ„ μ‹€ν–‰ν•˜κΈ° 전에, λ‘œλ”λŠ” μžλ™μœΌλ‘œ μ΄λŸ¬ν•œ 곡유 λͺ©μ  νŒŒμΌμ„ μ°Ύκ³ , ν•„μš”ν•œ μ‹¬λ²Œμ΄ ν”„λ‘œμ„ΈμŠ€κ°€ μ ‘κ·Όν•  수 μžˆλŠ” μ•Œλ§žμ€ μ£Όμ†Œμ— μ—°κ²°λ©λ‹ˆλ‹€. κ·Έλž˜μ•Όλ§Œ ν”„λ‘œμ„Έμ„œκ°€ 싀행을 μ‹œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

βœ… 곡유 라이브러리의 μˆ˜λ™ λ‘œλ”©

λ˜ν•œ 곡유 λͺ©μ  νŒŒμΌμ€ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ λ‘œλ“œλ˜κ³  μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. λ‘œλ” ν”„λ‘œκ·Έλž¨(동적 링컀)이 μžλ™μœΌλ‘œ λ‘œλ“œν•˜μ§€ μ•ŠλŠ” λ°©μ‹μž…λ‹ˆλ‹€.

곡유 라이브러리 λ‚΄λΆ€μ—μ„œ 찾을 수 μžˆλŠ” μ‹¬λ²Œ (ν•¨μˆ˜)을 μ΄μš©ν•˜κΈ°μ „, 곡유λͺ©μ  νŒŒμΌμ„ μˆ˜λ™μœΌλ‘œ λ‘œλ“œν•˜λŠ” ν•¨μˆ˜λ₯Ό κ°œλ°œμžκ°€ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μˆ˜λ™ λ‘œλ”© λ©”μ»€λ‹ˆμ¦˜μ„ μœ„ν•œ μ‘μš©ν”„λ‘œκ·Έλž¨μ΄ μ‘΄μž¬ν•˜λ©°, 이번 μ ˆμ—μ„œ μ•Œμ•„λ³Ό 것이라고 μ–ΈκΈ‰ν•œ 적이 μžˆλŠ” 예제λ₯Ό 톡해 μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

[예제 3-4]λŠ” 링크 λ‹¨κ³„μ—μ„œ 곡유 λͺ©μ  νŒŒμΌμ„ 느리게 λ˜λŠ” μˆ˜λ™μœΌλ‘œ, ν˜Ήμ€ 곡유 λͺ©μ  파일 없이 λ‘œλ“œν•˜λŠ” 법을 μ œμ‹œν•©λ‹ˆλ‹€. 이번 μ˜ˆμ œλŠ”

[예제 3-3]κ³Ό 같은 λ‘œμ§μ„ 빌렀 μ˜€μ§€λ§Œ, κ·Έ λŒ€μ‹  ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ 곡유 λͺ©μ  파일인 libgeometry.soλ₯Ό μˆ˜λ™μœΌλ‘œ λ‘œλ“œν•©λ‹ˆλ‹€. [예제 3-4]λ₯Ό 보기 전에 [예제 3-4]κ°€ μž‘λ™ν•  수 μžˆλ„λ‘ libgeometry.soλ₯Ό μ•½κ°„ λ‹€λ₯΄κ²Œ 생성해야 ν•©λ‹ˆλ‹€. 그러렀면 λ¦¬λˆ…μŠ€μ—μ„œ λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

1
gcc -shared 2d.o 3d.o trigon.o -lm -o libgeometry.so

μ•žμ˜ λͺ…λ Ήμ–΄μ—μ„œλŠ” μƒˆλ‘œμš΄ μ˜΅μ…˜μΈ -m을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 이것은 링컀가 ν‘œμ€€ μˆ˜ν•™ 라이브러리인 libm.so와 κ΄€λ ¨λœ 곡유 λͺ©μ  νŒŒμΌμ„ λ§ν¬ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.

libgeometry.soλ₯Ό μˆ˜λ™μœΌλ‘œ λ‘œλ“œν•  λ•Œ, 이 파일의 μ˜μ‘΄μ„±μ΄ μ–΄λŠ μ •λ„λŠ” μžλ™μœΌλ‘œ λ‘œλ“œλ˜μ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

λ§Œμ•½ 그렇지 μ•Šλ‹€λ©΄ cos λ˜λŠ” sqrt 같이 libgeometry.soκ°€ ν•„μš”λ‘œ ν•˜λŠ” μ‹¬λ²Œμ— κ΄€ν•œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. μ΅œμ’… μ‹€ν–‰ 파일과 μˆ˜ν•™ ν‘œμ€€ 라이브러리λ₯Ό λ§ν¬ν•˜μ§€λŠ” μ•Šμ„ 것이며, libgeometry.so λ₯Ό λ‘œλ“œν•  λ•Œ λ‘œλ”κ°€ 이λ₯Ό μžλ™μœΌλ‘œ ν•΄κ²°ν•  κ²ƒμ΄λΌλŠ” 점을 μ°Έκ³ ν•˜μ„Έμš”.

곡유 λͺ©μ  νŒŒμΌμ„ λ§ν¬ν–ˆμœΌλ‹ˆ 이제 [예제 3-4]λ₯Ό 진행할 수 μžˆμŠ΅λ‹ˆλ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// File name: ExtremeC_examples_chapter3_4.c
// Description: Load the shared object file using dlopen

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

#include "ExtremeC_examples_chapter3_2_geometry.h"

polar_pos_2d_t (*func_ptr)(cartesian_pos_2d_t*);

int main(int argc, char** argv)
{

  void* handle = dlopen ("/opt/geometry/libgeometry.so", RTLD_LAZY);
  if (!handle) {
    fprintf(stderr, "%s\n", dlerror());
    exit(1);
  }

  func_ptr = dlsym(handle, "convert_to_2d_polar_pos");
  if (!func_ptr)
	{
    fprintf(stderr, "%s\n", dlerror());
    exit(1);
  }

  cartesian_pos_2d_t cartesian_pos;
  cartesian_pos.x = 100;
  cartesian_pos.y = 200;
  polar_pos_2d_t polar_pos = func_ptr(&cartesian_pos);
  printf("Polar Position: Length: %f, Theta: %f (deg)\n",
    polar_pos.length, polar_pos.theta);
  return 0;
}

이 μ½”λ“œμ—μ„œ dlopenκ³Ό dlsymμ΄λΌλŠ” ν•¨μˆ˜λ‘œ 곡유 λͺ©μ  νŒŒμΌμ„ λ‘œλ“œν•˜λŠ” 방법을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ convert_to_2d_polar_posκ°€ 곡유 λͺ©μ  파일 μ•ˆμ— μžˆλ‹€λŠ” 것도 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

dlsym ν•¨μˆ˜λŠ” ν•¨μˆ˜ 포인터λ₯Ό λ°˜ν™˜ν•˜λ©°, 이 ν¬μΈν„°λŠ” λŒ€μƒ ν•¨μˆ˜λ₯Ό λΆˆλŸ¬μ˜€λŠ” invoke데에 μ“°μž…λ‹ˆλ‹€.

이 μ½”λ“œλŠ” /opt/geometryμ—μ„œ 곡유 λͺ©μ  νŒŒμΌμ„ 찾으며, 이 디렉터리에 ν•΄λ‹Ή 파일이 μ—†λ‹€λ©΄ 였λ₯˜ λ©”μ‹œμ§€κ°€ λ‚˜νƒ€λ‚˜λ‹ˆ μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. 참고둜 macOSμ—μ„œ 곡유 λͺ©μ  파일의 ν™•μž₯μžλŠ” dylibμž…λ‹ˆλ‹€. λ”°λΌμ„œ μ˜¬λ°”λ₯Έ ν™•μž₯자둜 νŒŒμΌμ„ λ‘œλ“œν•˜λ €λ©΄ 이 μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ‹€μŒ λͺ…λ Ήμ–΄λŠ” μ•žμ˜ μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•˜κ³  μ‹€ν–‰ νŒŒμΌμ„ μ‹€ν–‰ν•©λ‹ˆλ‹€.

1
gcc ExtremeC_examples_chapter3_4.c -ldl -o ex3_4.out

ν”„λ‘œκ·Έλž¨μ„ libgeometry.so 파일과 λ§ν¬ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. ν•„μš”ν•  λ•Œ 이 νŒŒμΌμ„ μˆ˜λ™μœΌλ‘œ λ‘œλ“œν•˜λ €κ³  ν–ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 이방법은 곡유 λͺ©μ  파일의 μ§€μ—°λœ λ‘œλ”© lazy loading이라고 ν•©λ‹ˆλ‹€.

이름은 μ΄λ ‡μ§€λ§Œ, κ²½μš°μ— 따라 곡유 λͺ©μ  νŒŒμΌμ„ 지연해 λ‘œλ“œν•˜λŠ” 방식은 정말 μœ μš©ν•©λ‹ˆλ‹€. 같은 라이브러리의 별도 μ‹€ν–‰ ν˜Ήμ€ 별도 버전을 μœ„ν•œ 곡유 λͺ©μ  νŒŒμΌμ„ λ³„κ°œλ‘œ λ§Œλ“€λ €κ³  ν•  λ•Œ κ°€ μ§€μ—°λœ λ‘œλ”©μ— ν•΄λ‹Ήν•˜λŠ” κ²½μš°μž…λ‹ˆλ‹€.

μ§€μ—°λœ λ‘œλ”©μ„ ν•˜λ©΄ ν•„μš”ν•œ 곡유 λͺ©μ  νŒŒμΌμ„ 자유둭게 λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€. 반면 μžλ™μœΌλ‘œ λ‘œλ“œν•˜λ©΄ 이에 λŒ€ν•œ μžμœ λ„κ°€ κ°μ†Œν•©λ‹ˆλ‹€.

This post is licensed under CC BY 4.0 by the author.