TCMalloc 라이브러리에서 사용했던 강제 심볼 링크

TCMalloc은 다른 라이브러리와는 다르게 해더파일의 추가 없이 강제 심볼 링크 기법을 이용해 편리하게 사용하도록 고안되었다.

#prgama comment(linker, "/include:__tcmalloc") // 강제 심볼 링크 선언하는 코드


  • __tcmalloc이란 뭘까?
    TCMalloc 라이브러리 프로젝트에서 tcmalloc으로 검색해 보면 알겠지만,
    다음과 같은 빈 함수이다.
    extern "C" __declspec(dllexport) void _tcmalloc() {}
    이것 만으로, 어떻게 뭐가 된다는 거지?라는 생각이 들어 좀더 분석해 보았다.


    #pragma comment(linker, "/include:__tcmalloc")는 링커가 실행파일에 import table에 심볼을 등록할 수 있도록 알려준다.


    물론 import table에 등록되는 방법은 두 가지가 있다.

  • 첫 번째, 흔히 사용했던 dll의 해더파일에 정의하고 함수들을 선언하고,
    개발자들은 새로운 프로젝트에 그 해더파일을 포함시켜 사용하면 빌드시 자동으로 등록된다.
    해더파일에는 다음과 같은 코드로 선언된다.

  • #ifdef dll_interface
    extern "C"__declspec(dllexport) void _mytest(){}
    #else
    extern "C"__declspec(dllimport) void _mytest(){}
    #endif

    두 번째,
    #pragma comment(linker, "/include:__tcmalloc")와 같은 명령으로 링커가 등록할 수 있도록 알리는 방법.