c + + 컴 파 일 러 와 링크 기 링크 작업 원리

5549 단어
원문:http://blog.sina.com.cn/s/blog_5f8817250100i3oz.html
여 기 는 대학 과정 에서 배 운 을 토론 하 는 것 이 아니 라 제 가 C + 컴 파일 러 와 링크 기의 작업 원리 에 대한 이해 와 견 해 를 썼 을 뿐 입 니 다. 제 수준 으로 는 컴 파일 원 리 를 설명 하지 못 했 습 니 다. (이것 은 복잡 하고 대학 때 거의 배우 지 못 했 습 니 다)알 아야 할 몇 가지 개념: 1. 컴 파일: 컴 파일 러 가 소스 파일 을 컴 파일 하 는 것 은 바로 소스 파일 에 존재 하 는 소스 코드 를 기계 언어 형식의 목표 파일 로 번역 하 는 과정 이다. 이 과정 에서 컴 파일 러 는 일련의 문법 검 사 를 할 것 이다.컴 파일 이 통과 되면 해당 CPP 를 OBJ 파일 로 변환 합 니 다.2. 컴 파일 유닛: C + 표준 에 따라 모든 CPP 파일 은 컴 파일 유닛 입 니 다.모든 컴 파일 단원 간 은 서로 독립 되 고 서로 알 수 없다.3. 대상 파일: 컴 파일 로 생 성 된 파일 은 기계 코드 형식 으로 컴 파일 단원 의 모든 코드 와 데 이 터 를 포함 하고 기호 표 가 해결 되 지 않 은 경우 기호 표 와 주소 재 설정 표 내 보 내기 등 다른 정보 도 있 습 니 다.대상 파일 은 바 이 너 리 형식 으로 존재 합 니 다.
  C++  ,      (Translation Unit)    .cpp      include   .h  ,.h                 .cpp   ,        .cpp     .obj  ,    PE(Portable Executable, Windows     )    ,              ,        ,            main  。             .cpp             ,             .exe .dll  。

다음은 컴 파일 러 의 작업 과정 을 분석 합 니 다. 우 리 는 문법 분석 을 뛰 어 넘 고 목표 파일 의 생 성 에 직접 옵 니 다. 만약 에 우리 가 A. cpp 파일 이 있다 고 가정 하면 다음 과 같은 정의 가 있 습 니 다. int n = 1;void FunA() { ++n; }
          A.obj       (     ),          ,    n、FunA,                    :
               
0x0000    n       4
0x0004    FunA    ??
  :     ,               ,??      ,                ,      0x0000  。
FunA         :
0x0004 inc DWORD PTR[0x0000]
0x00?? ret
  ++n      inc DWORD PTR[0x0000],        0x0000     DWORD(4  ) 1。

     B.cpp  ,    :
extern int n;
void FunB()
{
    ++n;
}
    B.obj       :
               
0x0000    FunB    ??
       n    ,  n    extern,  extern          n             ,            。              ,         n     ,     FunB       n   ,    FunB      :
0x0000 inc DWORD PTR[????]
0x00?? ret
     ?               。
                    (    ????),                   ,     **“      ”**,   unresolved symbol table。  ,  n           **“     ”**   exprot symbol table,                。

 ,          ,                    ,         :            ,                     。                 ?          :**  **。 C/C++ ,                ,   n     n,          ,  FunA     _FunA(          )。
  ,
A.obj       
        
n       0x0000
_FunA   0x0004
       (                 )。
B.obj       
        
_FunB   0x0000
       
        
n       0x0001
        ,      0x0001       ,     ,    n。
      ,   B.obj         ,                                   ,    ,           B.obj          。      ,       。    , A.obj      n,   n     B.obj 0x0001 。

  ,         ,       ,B.obj   FunB       inc DWORD PTR[0x000](  n A.obj     0x0000),              0x0000  ,                     。                         。      ,  B.obj 0x0000          0x00001000 , A.obj 0x0000          0x00002000 ,           ,A.obj            0x00002000,B.obj           0x00001000。             。

  n      0x00002000,  FunA  inc DWORD PTR[0x0000]     ,             ,       ,address redirect table。

**    :**
            :      ,            。
      :                             。
     :            ,                            。
      :                    。

**        :**
           ,                      。                 ,             (       ,                  )。                 ,                   ,                      。                     ,        ,          。
  :            ,              ,        ,       ,        。
                ,              。

                   :    unresolved external link..         ,             ,                 。         ,                        。(  ,           ,        ),                         duplicated external simbols...                    ,                。            ,        。          C/C++              :    extern:       ,              ,                   。(    )        static:                      ,              /     。              。(    )。   static    ,                ,         。              :       ,      ,  const  ,      。(      extern static      )           :       ,            (       )。                      (    duplicated external simbols)           :       ,            。                        。                        :              ,         ,                             ,          ,    duplicated external simbols。           ,                 。                ,     :                     const int n = 0       。        ,                      。                    ,                  ,                 ,             ,          。                :                ,       ,                ,            ,                 ,         ,                     。  ,                      。                     :                 :        class A        {            static char msg[] = "aha";        };          ,  class           ,       ,                 const  。     C++ ,       const      :               ,   C         const int  ,                        。       const ,       。  : 2           :        1。        const                  ,           ,         。(        )        2。        mutable   ,            ,              。                      :                      const  。    ,int/char          ,                  ,     。        :        C++              ,           。                        :                        ,          .cpp   ,                            ,           。            .cpp   ,       cpp          。                  :                         ,                                     。                        ,           :                           ,          ,             ,    。       export       :        export                ,           

좋은 웹페이지 즐겨찾기