Gnu C++로 정적 라이브러리 링크하는 방법

GNU C++ 프로그램에서 정적 라이브러리를 링크하는 방법

정적 라이브러리 사용

사용 시 고려 사항

  • 프로그램 크기 증가: 정적 라이브러리를 사용하면 실행 파일 크기가 크게 증가할 수 있슴

  • 라이브러리 업데이트: 정적 라이브러리를 사용하면 라이브러리 업데이트 시 프로그램을 다시 컴파일해야 필요

사용 장점

  • 운영 체제 의존성 감소: 정적 라이브러리를 사용하면 프로그램 실행에 필요한 모든 라이브러리가 실행 파일에 포함되어 있어 운영 체제에 동일한 라이브러리가 설치되어 있지 않아도 프로그램을 실행

  • 보안 강화: 정적 라이브러리를 사용하면 공유 라이브러리 공격과 같은 보안 취약점에 대한 위험을 줄일 수 있음

  • 성능 향상: 정적 라이브러리를 사용하면 프로그램 실행 속도를 향상시킬 수 있음

정적 라이브러리 링크

링크 옵션

  • -static

    • 컴파일러에게 모든 라이브러리를 정적으로 링크하도록 지시

    • 이 옵션을 사용하면 실행 파일 크기가 커지지만, 운영 체제에 동일한 라이브러리가 설치되어 있지 않아도 프로그램이 실행될 수 있슴

  • -static-libstdc++

    • C++ 표준 라이브러리(libstdc++)를 정적으로 링크하도록 지시.

    • 이 옵션은 -static 옵션과 함께 사용

g++ -static -static-libstdc++ main.cpp -o myprogram

라이브러리 지정 방법

  • -l 옵션 (일반적인 방법)

    • 컴파일러에게 특정 라이브러리를 링크하도록 지시.

    • 옵션 뒤에 라이브러리 이름을 지정. 예를 들어, -lstdc++은 C++ 표준 라이브러리를 링크.

    • 뒤에 오는 라이브러리 이름은 관례에 따라 lib 접두사와 .a 확장자를 가진 정적 라이브러리 파일명

  • -Wl,--whole-archive 옵션

    • 컴파일러에게 라이브러리에 있는 모든 객체 파일을 링크하도록 지시

    • 이 옵션을 사용하면 라이브러리에 있는 모든 함수가 사용될 수 있음

g++ main.cpp -lstdc++ -Wl,--whole-archive my_lib.a -o myprogram

의존성 확인

  • ldd 명령은 실행 파일의 의존성을 확인하는 데 사용. 다음 명령은 myprogram 실행 파일의 의존성을 확인합니다.
$ ldd myprogram-static
    not a dynamic executable

$ ldd myprogram
    linux-vdso.so.1 (0x0000ffff8323c000)
    libstdc++.so.6 => /lib/aarch64-linux-gnu/libstdc++.so.6 (0x0000ffff82f90000)
    libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x0000ffff82f60000)
    libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffff82db0000)
    /lib/ld-linux-aarch64.so.1 (0x0000ffff83203000)
    libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000ffff82d10000)

라이브러리 ABI(Application Binary Interface)의 버전 확인

  • strings 명령은 실행 파일 내에 포함된 문자열을 추출하는 데 사용.

  • 다음 명령은 myprogram 실행 파일 내에 포함된 라이브러리 버전 정보를 추출 확인

$ strings myprogram | grep ^GLIB
GLIBC_2.17
GLIBC_2.32
GLIBC_2.34
GLIBCXX_3.4.20
GLIBCXX_3.4.26
GLIBCXX_3.4.9
GLIBCXX_3.4.29
GLIBCXX_3.4.15
GLIBCXX_3.4.11
GLIBCXX_3.4.30
GLIBCXX_3.4.21
GLIBCXX_3.4.14
GLIBCXX_3.4.22
GLIBCXX_3.4

기타

  • pthread 정의 : 일부 Linux 배포판에서는 pthread 라이브러리를 명시적으로 정의 안해도 됨 (e.g. Ubuntu)

  • 표준 C/C++ 라이브러리의 static 버전을 별도로 설치가 필요할 수 있음

    • glibc : 표준 C 언어 헤더 파일 및 함수의 구현

    • libstdc++ : GNU Standard C++ Library의 약자이며, C++ 언어 표준에 따라 구현된 C++ 라이브러리.

참고자료