[sw정글-북] 📚CSAPP 7장-Linking
카테고리: swjungle CSAPP
📚📚CSAPP 7장-Linking
🚀노션에서 업데이트 된 내용으로 보기
📚CSAPP 7장 <== 클릭
📚CSAPP 7장 <== 클릭
📚CSAPP 7장 <== 클릭
📕start
-
7.1 compiler Drivers
- 링킹이란 무엇인가
- 여러가지 연결시켜주는게 링킹이고, 링킹을 수행하는게 링커
- 컴파일시: 정적연결
- 로드타임에 할 때: 동적 연결
- 실행시킬 때: 동적 연결
- 링커가 중요한 이유
- 큰 프로그램을 짤 때, main, RBtree, driver 등 각가 하나씩 컴파일 할 수 있음
- 질문: 근데 하나씩 컴파일하면 뭐가 좋음?
- 7.1 읽어보면 좋을듯
- 여러가지 연결시켜주는게 링킹이고, 링킹을 수행하는게 링커
- 정적 연결
- main.c와 sum.c를 합치는 과정이 정적연결
- 동적 연결
- 이를, 실행시킬 때 링킹 또함
- translators
- cpp, cc1, as (전처리기, C-compiler, assembly)
- 위에 사진처럼 translator을 통해 목적파일을 만들고, linker로 실행파일을 만드는 과정이 정적연결
- 정적링커가 하는 역할:
- 심볼해석 symbol resolution, 재배치 relocation
- 함수, 전역변수, 정적변수 세가지를 심볼이라고 함
- 위의 세가지를 심볼로 표현하여, 이걸 보고 링커가 컴파일 함
- 지역변수는 스택에서 관리!
- 전역변수만 링커에서 관리!!!!!
- 심볼에도 강한 심볼이 있고, 약한 심볼이 있는데 지들끼리 우선순위를 정함
- 컴파일러가 심볼을 해석하고, 컴파일러가 심볼테이블 엔트리를 만들어 줌
- 어셈블리는 심볼테이블 엔트리를 보고, 재배치 엔트리를 만들어줌
- 링커는 재배치 엔트리를 보고, 재배치를 함
- 단서가 많을수록 강함(함수도 강함)
- int a = 10은 할당하고 저장, int a 할당
- 그러니까 할당하고 저장하는게 더 심볼이 강함
- 따라서 int a=10 instruction이 더 높은 우선순위를 가지게 되고 이를 어셈블러나 컴파일러가 더 높은 우선순위라고 생각하게 만듬
- 함수, 전역변수, 정적변수 세가지를 심볼이라고 함
- 심볼해석 symbol resolution, 재배치 relocation
- 목적파일
- main.o와 sum.o를 링커가 묶어줄텐데… 이는
재배치가능 목적파일
- .exe나 prog도
실행 목적파일
이라고 함
- main.o와 sum.o를 링커가 묶어줄텐데… 이는
- 7.5심볼과 심볼 테이블
- global, externel 전역심볼
- static 지역심볼
- 함수안에 쓰이는 지역변수처럼 되어있지만
- static을 쓰면 링커가 관리해줌, 그리고 전역변수가 쌓이는 곳에 쌓임
- static변수는 조금 안전하게 쓸 수 있음
- static의 경우 .bss 나 .data에서 잡고있기때문에 조금 특별하다
-
정적 지역변수와, 지역변수와는 다르다는것을 인식하는게 중요하다
- 질문: 그렇다면 정적지역변수를 굳이 쓰는 이유는 무엇인가?
- 안전하게 작동함
- 전역변수 ‘처럼’작동하게 됨
- 함수가 끝난다고 해도 날아가지 않음
-
7.6 심볼 해석
- 초기화가 되어있으면 강한심볼, 초기화가 안되어있으면 약한심볼
- 강한심볼 없고 약한심볼만 있으면 개네는 계속 관리해줌
- 강한심볼 약한심볼 있으면 강한심볼 따라감
- 강한심볼 두개있으면 안됨: 두개의 태양 존재하면 안됨(충돌 ㅈㄴ 함)
- 심볼집합
- 아래와 같은 세가지가 있음
- 심볼들이 해석이 되지 않은애들: U
- 재배치 가능한 애들 E
- 이전에 정의된 심볼 집합D
- E가 점점많아지면서, U가 줄어듬
- 만약 U가 남아있으면 에러가 뜸
- 아래와 같은 세가지가 있음
- 해석끝났으면(어셈블러가 해줌)
- 이제 슬슬 정리 해야함~
- main.s에 재배치 엔트리가 포함되어있음
- 어셈블러가 해석해둔거 보고, 재배치 엔트리 생성
- 재배치(링커가 해줌)
- 링커가 UDE 테이블을 (또다시)보면서 다시 재배치 시작
- 이때 재배치 테이블도 같이 봄
-
그림 7.15
- 밑에 두개가 심볼테이블-엔트리임
- 이거 전체가 .exe인데, 여기에 심볼테이블이 아직도 남아있음
- 위의 그림을 보고 설명하는 동적 연결
- 이제 실행시킬 때 동적 링킹이 일어남
- 남아있는 심볼테이블 엔트리를 보고, 다시 링킹을 하는거임
- (링킹… 아직 남았다..)
-
위에가 정적, 아래가 동적
- 위에가 정적, 아래가 동적
- libc.so, libvector.so 이거 두개는 연결이 안되어있음
- 공간만 마련해줌, 텅 비어있음
- 이제 저 두개의 파일에다가, 최소한의 메모리손실을 가져가면서
프로그램을 실행시킬 때, 연결
시킨다 - 리눅스에서의: 동적 링크 라이브러리(.so)
- 윈도우: dll
- 7.10 이후 스킵
-
굿굿 이해 완벽하게 됨
-
😵배우면서 깨달은 내용을 정리해 보았습니다. 틀린 것 같은 개념을 아래 댓글에 달아주시면 감사합니다😵
🌜 Thank you for reading it. Please leave your comments below😄
댓글 남기기