젠투에서 정적으로 링크된 바이너리 만들기

젠투에서 정적으로 링크된 바이너리 만들기

저는 젠투에서 완전히 정적으로 링크된 바이너리를 만드는 방법을 찾고 있습니다.

빌드 시스템은 Meson입니다. 나는 시도했지만 --prefer-static성공 --default_library=static하지 못했습니다.

한 가지 가능한 장애물은 일부 라이브러리(예: libeventglib)에 정적 버전이 설치되어 있지 않다는 것입니다( libc다른 라이브러리와 달리). emerge특별한 플래그를 사용하여 다시 실행 해야 하나요 ?

답변1

적용 가능한 모든 패키지의 정적 링크 지원

--static더 안전한 접근 방식은 젠투 전용 라이브러리로 필요한 라이브러리를 컴파일하는 것보다 전체 시스템을 정적으로 만드는 것입니다 . static-libs당신이있는 것처럼온라인 패키지 저장소, 많은 소프트웨어 패키지가 staticUSE 플래그를 지원합니다.

정적 연결이란 무엇입니까?

정적 링크는 사용자가 특정 애플리케이션 라이브러리에 액세스할 수 없는 임베디드 시스템이나 장치의 프로그램에 유용합니다. Windows 기반 시스템에서 이러한 라이브러리는 일반적으로 .DLL확장명(약어)을 가진 파일 로 저장됩니다 Dynamic Linking Library. Linux에서 이러한 라이브러리는 일반적으로 확장자가 .so또는 .so.versionNumberOfProgramThatUsesLibrary (공유 객체의 약자)인 파일로 저장됩니다. 정적으로 컴파일되면 위에서 설명한 라이브러리 파일이 컴파일된 프로그램과 함께 제공되므로 사용자는 전체 쓰기 액세스 권한이 있는 홈 디렉터리에 완성된 프로그램을 복사할 수 있으며 프로그램은 동일한 라이브러리 대신 해당 홈 디렉터리의 라이브러리 파일을 사용합니다. 파일 . 사용자가 액세스할 수 없는 호스트 시스템의 라이브러리입니다. 정적 연결과 동적 연결에 대한 자세한 내용은 다음을 참조하세요.정적 라이브러리와 동적(공유) 라이브러리 링크의 차이점은 무엇입니까?

경고에 주의하다

Gentoo의 첫해에 사용자는 다양한 단계의 타르볼에서 시스템을 구축할 수 있었으며, 당시에 허용된 프로세스였던 1단계를 사용하여 이 작업을 한두 번 수행했다고 자랑스럽게 생각합니다. 바라보다Gentoo Wiki의 스테이지 타르볼.. 경고 내용은 다음과 같습니다.

부팅 중에는 이것을 설정하지 마십시오! 바이너리가 동적으로 링크되는 대신 정적으로 링크되도록 합니다.

첫 번째 단계에 적용됩니다. 피하기 위해 존재한다닭이 먼저냐, 달걀이 먼저냐?. 정적 라이브러리를 사용하여 정적 라이브러리 파일을 빌드할 수 없기 때문에 정적 라이브러리를 사용하는 프로그램이나 라이브러리가 없는 프로그램에는 라이브러리 파일을 포함할 수 없습니다. 다시 말해서:정적 라이브러리를 빌드하고 이를 프로그램에 포함하려면 호스트 시스템의 동적 링크 라이브러리를 사용해야 합니다..

젠투에서 이를 수행하는 방법

  1. 마치다선택한 아키텍처에 대한 설치 매뉴얼.

  2. USE 플래그 및/또는 구성 파일을 미세 조정하십시오(훌륭한 도구는응용프로그램-포티지/ufedstatic, USE Flag Editor의 약어)는 새로 설치된 시스템에서 작동하지만 또는 을 추가하지 마십시오 static-libs. 이를 통해 데스크탑 환경, 사운드 지원, 커널 재구축 등을 추가할 수 있으며 기본 @system세트가 동적 라이브러리를 계속 사용할 수 있습니다.

    • 확실하게 하다2단계는 오류 없이 완료되었습니다. 또한 2단계를 여러 부분으로 나눌 수 있습니다. 예를 들어 데스크톱 지원을 활성화하고 emerge해당 지원을 구축하기 위해 사용 및 재실행 ufed하고 일부 유형의 그래픽 지원을 추가한 다음 emerge다시 실행합니다.
  3. 다시 실행 ufed하고 USE 플래그를 추가 static하세요 static-libs. 그런 다음 전체 트리를 다시 작성하고 각 패키지에 대한 지원 및 USE 플래그를 업데이트하려면 emerge -eafor를 실행하십시오.--empty-tree --askstaticstatic-libs

나는 이 방법을 "2패스 방탄 방법, 2패스 컴파일이라고도 함"이라고 부릅니다. 2단계의 첫 번째 단계에서는 3단계 시작 시 문제가 없는지 확인합니다. 3단계의 두 번째 패스가 어떤 식으로든 실패하는 경우 자유롭게 오류를 수정하고 3단계를 다시 시작하거나 emerge --resume이전 단계의 어떤 것도 사용자의 오류로 인해 손상되지 않을 것이라는 점을 알고 사용하고 계속할 수 있습니다. 이전에는 오류를 수정한 후 잘못된 패키지는 설치되지 않습니다.)

중간자

우리가 보면개발 유틸리티/중간자패키지 저장소에서 우리는 볼 수 있습니다전자 빌드USE 플래그를 직접 지원하지는 않지만 static많은 종속성이 지원하므로 static원하는 static-libs것을 얻을 수 있습니다.

관련 정보