다양한 libc/musl 인터프리터를 사용하여 "교차 Linux 시스템" 프로그램 구축

다양한 libc/musl 인터프리터를 사용하여 "교차 Linux 시스템" 프로그램 구축

내 목표는 간단합니다. 가능한 한 적은 종속성을 사용하여 루트가 아닌 사용자로 모든 아키텍처에서 nix 패키지 관리자를 부팅하는 프로그램을 만들고 싶습니다. 이제 제가 한 일은 다음과 같습니다. 멋진 아치가 포함된 Alpine의 미니멀리스트 버전을 콘솔에 다운로드했습니다. 그런 다음 압축을 풀고 그 안에 "chroot"(실제로는 원래 루트)를 지정했습니다. 그런 다음 빌드의 모든 종속성을 chroot에 설치하고 좋은 옵션으로 빌드한 다음 파일을 다시 호스트 시스템에 복사합니다.

그러나 중요한 문제가 있습니다. 모든 시스템에는 file"인터프리터 파일"(실행할 때 얻는 파일)이 다른 위치에 있는 것 같습니다. 내 데비안에서는 이 파일이 위치 /lib64/ld-linux-x86-64.so.2하지만 알파인에서는 위치가 입니다 /lib/ld-musl-x86_64.so.1. 그래서 실행하면 비슷한 오류가 발생합니다 File does not exists(분명히 존재하지만).

그래서 내 질문은 다음과 같습니다. 인터프리터가 모든(또는 적어도 대부분의) Linux 배포판에서 발견되도록 도구(nix와 같은)를 어떻게 컴파일합니까? 이것이 가능하지 않다면 어떻게든 시스템에 chroot/proot를 적용하고 호스트 인터프리터를 사용하여 파일을 호스트에 다시 복사할 때 인터프리터가 좋은 인터프리터가 되도록 할 수 있습니까?

감사합니다!

답변1

이러한 유형의 문제를 처리하는 방법에는 세 가지가 있습니다.

  1. 정적으로 빌드 할 수 nix있으면 런타임에 동적 링커가 필요하지 않으며 거의 ​​모든 곳에서 작동합니다. (이것은 또한 라이브러리 호환성 문제를 훌륭하게 해결합니다.)

  2. 각 대상 libc에 대해 한 번씩 여러 번 빌드할 수 있습니다 nix. 실제로 Linux에서는 GNU libc 및 musl(아마도Dietlibc도 마찬가지입니다). 그러면 대상 환경의 libc를 기반으로 적절하게 사용할 수 있는 바이너리가 제공됩니다. Alpine Linux에 대해서는 모르지만 Debian에서는 이것이 가능합니다. 기본 컴파일러를 사용하여 GNU libc로 빌드한 다음 musl-dev패키지를 설치하고 musl-gccmusl로 빌드할 수 있습니다.

  3. 모든 바이너리에 대한 종속성을 지정할 수 있습니다.하다빌드를 결정하고 대상 환경에 설치합니다. 예를 들어, Debian 파생 버전에 패키지를 설치하면 muslAlpine에 구축된 musl 기반 바이너리는 Debian 파생 버전에서 더 쉽게 실행됩니다.

관련 정보