[sw정글-북] 📚CSAPP 7장-Linking

Date:     Updated:

카테고리:

태그:

📚📚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이 더 높은 우선순위를 가지게 되고 이를 어셈블러나 컴파일러가 더 높은 우선순위라고 생각하게 만듬
  • 목적파일
    • main.o와 sum.o를 링커가 묶어줄텐데… 이는 재배치가능 목적파일
    • .exe나 prog도 실행 목적파일이라고 함
  • 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😄

맨 위로 이동하기

swjungle CSAPP 카테고리 내 다른 글 보러가기

댓글 남기기