검색

2.3. GCC를 사용하여 라이브러리 만들기

download PDF

라이브러리를 생성하는 단계와 Linux 운영 체제에서 라이브러리에 사용하는 필수 개념에 대해 알아봅니다.

2.3.1. 라이브러리 이름 지정 규칙

특수 파일 이름 규칙은 라이브러리에 사용됩니다. foo라는 라이브러리가 파일 lib foo.so 또는 libfoo . a 로 존재할 것으로 예상됩니다. 이 규칙은 GCC의 입력 옵션을 연결하면 자동으로 이해되지만 출력 옵션에는 해당되지 않습니다.

  • 라이브러리에 대해 연결할 때 라이브러리는 -l 옵션을 -l foo : 로 사용하여 foo 이름으로만 지정할 수 있습니다.

    $ gcc ... -lfoo ...
  • 라이브러리를 생성할 때 전체 파일 이름 libfoo.so 또는 libfoo.a 를 지정해야 합니다.

2.3.2. soname 메커니즘

동적으로 로드된 라이브러리(공유 오브젝트)는 soname 이라는 메커니즘을 사용하여 여러 호환 가능한 라이브러리 버전을 관리합니다.

사전 요구 사항

문제 도입

동적으로 로드된 라이브러리(공유 오브젝트)는 독립 실행 파일로 존재합니다. 이렇게 하면 라이브러리에 종속된 애플리케이션을 업데이트하지 않고 라이브러리를 업데이트할 수 있습니다. 그러나 이 개념에는 다음과 같은 문제가 발생합니다.

  • 라이브러리의 실제 버전 식별
  • 동일한 라이브러리의 여러 버전이 필요합니다.
  • 여러 버전의 ABI 호환성 신호

soname 메커니즘

이 문제를 해결하기 위해 Linux는 soname이라는 메커니즘을 사용합니다.

foo 라이브러리 버전 X.Y 는 버전 번호에서 동일한 X 값을 가진 다른 버전과 ABI와 호환됩니다. 호환성을 유지하는 마이너 변경으로 숫자 Y 가 증가합니다. 호환성을 중단시키는 주요 변경 사항은 숫자 X 를 증가시킵니다.

실제 foo 라이브러리 버전 X.Ylibfoo.so.x.y 파일로 존재합니다. 라이브러리 파일 내에서 soname이 libfoo.so.x 값으로 기록되어 호환성을 나타냅니다.

애플리케이션이 빌드되면 링커에서 libfoo.so 파일을 검색하여 라이브러리를 찾습니다. 이 이름의 심볼릭 링크가 있어야 실제 라이브러리 파일을 가리키는 심볼릭 링크가 있어야 합니다. 그런 다음 링커는 라이브러리 파일에서 soname을 읽고 이를 애플리케이션 실행 파일에 기록합니다. 마지막으로 링커는 이름 또는 파일 이름이 아닌 soname을 사용하여 라이브러리에 대한 종속성을 선언하는 애플리케이션을 생성합니다.

런타임 동적 링커가 애플리케이션을 실행하기 전에 연결하면 애플리케이션 실행 파일에서 soname을 읽습니다. 이 soname은 libfoo.so.x 입니다. 이 이름의 심볼릭 링크가 있어야 실제 라이브러리 파일을 가리키는 심볼릭 링크가 있어야 합니다. 이렇게 하면 soname이 변경되지 않기 때문에 버전의 Y 구성 요소에 관계없이 라이브러리를 로드할 수 있습니다.

참고

버전 번호의 Y 구성 요소는 단일 번호로만 제한되지 않습니다. 또한 일부 라이브러리는 해당 버전을 이름으로 인코딩합니다.

파일에서 soname 읽기

라이브러리 파일의 soname을 표시하려면 somelibrary:

$ objdump -p somelibrary | grep SONAME

somelibrary 를 검사할 라이브러리의 실제 파일 이름으로 바꿉니다.

2.3.3. GCC를 사용하여 동적 라이브러리 생성

동적으로 연결된 라이브러리(공유 오브젝트)는 다음을 허용합니다.

  • 코드 재사용을 통한 리소스
  • 라이브러리 코드를 더 쉽게 업데이트할 수 있도록 함으로써 보안이 강화되었습니다.

다음 단계에 따라 소스에서 동적 라이브러리를 빌드하고 설치합니다.

사전 요구 사항

절차

  1. 라이브러리 소스를 사용하여 디렉터리로 변경합니다.
  2. Position 독립적인 코드 옵션 -fPIC 를 사용하여 각 소스 파일을 개체 파일로 컴파일합니다.

    $ gcc ... -c -fPIC some_file.c ...

    오브젝트 파일의 이름은 원본 소스 코드 파일과 동일하지만 해당 확장자는 .o 입니다.

  3. 오브젝트 파일에서 공유 라이브러리를 연결합니다.

    $ gcc -shared -o libfoo.so.x.y -Wl,-soname,libfoo.so.x some_file.o ...

    사용된 주 버전 번호는 X 및 부 버전 번호 Y입니다.

  4. libfoo.so.x.y 파일을 시스템의 동적 링커가 찾을 수 있는 적절한 위치에 복사합니다. Red Hat Enterprise Linux에서 라이브러리 디렉터리는 /usr/lib64 입니다.

    # cp libfoo.so.x.y /usr/lib64

    이 디렉터리의 파일을 조작하려면 루트 권한이 필요합니다.

  5. soname 메커니즘에 대한 심볼릭 링크를 생성합니다.

    # ln -s libfoo.so.x.y libfoo.so.x
    # ln -s libfoo.so.x libfoo.so

추가 리소스

2.3.4. GCC 및 ar를 사용하여 정적 라이브러리 생성

오브젝트 파일을 특수 유형의 아카이브 파일로 변환하여 정적 연결을 위한 라이브러리를 만들 수 있습니다.

참고

Red Hat은 보안상의 이유로 정적 링크 사용을 권장하지 않습니다. 특히 Red Hat에서 제공하는 라이브러리에 대해 필요할 때만 정적 링크를 사용합니다. 자세한 내용은 2.2.2절. “정적 및 동적 연결”를 참조하십시오.

사전 요구 사항

절차

  1. GCC를 사용하여 중간 개체 파일을 만듭니다.

    $ gcc -c source_file.c ...

    필요한 경우 소스 파일을 더 추가합니다. 결과 오브젝트 파일은 파일 이름을 공유하지만 .o 파일 이름 확장자를 사용합니다.

  2. binutils 패키지의 ar 툴을 사용하여 오브젝트 파일을 정적 라이브러리(아카이브)로 전환합니다.

    $ ar rcs libfoo.a source_file.o ...

    libfoo.a 파일이 생성됩니다.

  3. nm 명령을 사용하여 결과 아카이브를 검사합니다.

    $ nm libfoo.a
  4. 정적 라이브러리 파일을 적절한 디렉터리에 복사합니다.
  5. 라이브러리를 연결할 때 GCC는 라이브러리가 정적 연결을 위한 아카이브인 .a 파일 이름 확장자에서 자동으로 인식됩니다.

    $ gcc ... -lfoo ...

추가 리소스

  • ar(1) 의 Linux 도움말 페이지 :

    $ man ar
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.