π’ 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
β 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
β 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μ΄λΌκ³ ν©λλ€.
μ΄λ¦μ μ΄λ μ§λ§, κ²½μ°μ λ°λΌ 곡μ λͺ©μ νμΌμ μ§μ°ν΄ λ‘λνλ λ°©μμ μ λ§ μ μ©ν©λλ€. κ°μ λΌμ΄λΈλ¬λ¦¬μ λ³λ μ€ν νΉμ λ³λ λ²μ μ μν 곡μ λͺ©μ νμΌμ λ³κ°λ‘ λ§λ€λ €κ³ ν λ κ° μ§μ°λ λ‘λ©μ ν΄λΉνλ κ²½μ°μ λλ€.
μ§μ°λ λ‘λ©μ νλ©΄ νμν 곡μ λͺ©μ νμΌμ μμ λ‘κ² λ‘λν μ μμ΅λλ€. λ°λ©΄ μλμΌλ‘ λ‘λνλ©΄ μ΄μ λν μμ λκ° κ°μν©λλ€.