내 Linux 바이너리는 모든 배포판에서 실행됩니까?

내 Linux 바이너리는 모든 배포판에서 실행됩니까?

저는 Lazarus라는 Delphi의 좋은 대안 IDE를 찾았습니다. 하지만 프로그래머에게는 질문이 없습니다.

그럴까요?정적 링크모든 Linux 배포판에서 Linux 바이너리를 사용할 수 있습니까? 즉, 어떤 Linux 배포판에 구축했는지는 중요하지 않습니다. Debian/ArchLinux/Ubuntu/OpenSUSE/... 등에서 실행됩니까?

제가 조사한 바에 따르면 실제로 32비트와 64비트만 중요한가요? 포스팅하기 전에 확인하고 싶었어요.

답변1

이 답변은 "내 바이너리가 모든 배포판에서 실행됩니까?"라는 보다 일반적인 질문에 대해 처음 작성되었지만 후반부에서는 정적으로 연결된 바이너리를 다룹니다.


정적으로 연결된 Hello World보다 더 복잡한 경우 대답은 다음과 같습니다.아마.
대답을 가정하면 distro X에서 테스트할 필요가 없습니다.X 번호

소프트웨어를 바이너리 형식으로 배포하려면 다음으로 제한하십시오.

  • 귀하의 소프트웨어 사용 영역(데스크톱, 서버, 임베디드...)에 대해 널리 사용되는 배포판

  • 각각 최신 버전 1~2개

그렇지 않으면 다양한 크기, 버전 및 연령의 수백 개의 배포판이 생성됩니다(10년 전의 배포판은 여전히 ​​사용 중입니다).그리고지원됨).

시험을 봐요. 그렇지 않으면 무엇이 잘못될 수 있는지에 대한 몇 가지 힌트:

  • 필요한 도구/라이브러리 패키지의 이름은 배포판마다 다르거나 동일한 배포판의 다른 버전에서도 다르게 지정됩니다.

  • 필요한 라이브러리가 너무 새롭거나 너무 오래되었습니다(잘못된 버전). 프로그램이 링크할 수 있다고 해서 올바른 라이브러리와 연결된다고 가정하지 마십시오.

  • 동일한 라이브러리(디스크의 파일)가 배포판에 따라 이름이 달라서 링크에 실패함

  • 64비트의 32비트: 32비트 환경이 설치되지 않았거나 일부 중요하지 않은 32비트 라이브러리가 32on64 환경 외부의 추가 패키지로 이동되었을 수 있으므로 이 경우 추가 종속성이 있습니다.

  • Shell: Bash 버전을 가정하지 마세요. Bash를 가정하지 마십시오.

  • 도구: POSIX가 아닌 명령줄 도구가 어디에나 있다고 가정하지 마십시오.

  • 도구: 배포판의 GNU 버전이 도구를 인식한다고 해서 옵션을 인식하지 못합니다.

  • /proc커널 인터페이스: 컴퓨터에 파일이 존재하거나 구조가 있다는 이유만으로 파일의 존재나 구조를 가정 하지 마세요.

  • Java: 귀하의 프로그램이 테스트 없이 SLES와 함께 제공되는 IBM JRE에서 실행될 것이라고 정말로 확신하십니까?

보너스:

  • 지침 세트: 컴퓨터에서 컴파일된 바이너리는 이전 하드웨어에서는 실행되지 않습니다.

정적 링크(또는: 필요한 모든 라이브러리를 소프트웨어와 함께 번들로 묶음) 해결책은 무엇입니까? 기술적으로 가능하더라도 관련 비용이 높을 수 있습니다. 불행하게도 대답은 '아니요'일 수도 있습니다.

  • 보안: 라이브러리 업데이트에 대한 책임은 소프트웨어 사용자에게서 자신에게로 옮겨집니다.

  • 크기 및 복잡성: 정적으로 링크된 GUI 프로그램을 구축하는 재미를 위해서입니다.

  • 상호 운용성: 귀하의 소프트웨어가 어떤 종류의 "플러그인"인 경우 소프트웨어 호출에 의존합니다.

  • 라이브러리 설계: 프로그램을 GNU libc에 정적으로 연결하고 이름 서비스( getpwnam()등)를 사용하면 libc의 NSS(이름 서비스 스위치)에 동적으로 연결됩니다.

  • 라이브러리 디자인: 프로그램과 정적으로 연결된 라이브러리는 데이터 파일이나 기타 리소스(예: 시간대 또는 로케일 설정)를 사용합니다.


위의 모든 이유 때문에,시험필수적이다.

  • KVM 또는 기타 가상화 기술을 숙지하고 지원하려는 각 배포에 대한 VM을 보유하십시오. 각 가상 머신에서 소프트웨어를 테스트하십시오.

  • 이러한 배포판의 최소 설치를 사용하십시오.

  • 제한된 명령 집합(예: SSE 4 없음)을 사용하여 VM을 만듭니다.

  • ldd정적으로 링크되거나 번들로만 제공됨: 바이너리 가 실제로 정적으로 링크되어 있는지/번들 라이브러리만 사용하는지 확인하려면 바이너리를 확인하세요 .

  • 정적 링크 또는 번들링에만 해당: 빈 디렉터리를 만들고 여기에 소프트웨어를 복사합니다. chroot이 디렉토리로 이동하여 소프트웨어를 실행하십시오.

답변2

정답은때에 따라 다르지., 그러나 필요한 라이브러리가 운영 체제에 설치되어 있는 한 대부분의 경우 그렇습니다.

일반적으로 말하면 대부분의 주요 배포판(예: 언급한 배포판)에는 커뮤니티에서 관리하는 응용 프로그램 버전을 설치하기 위한 패키지 관리 도구가 있습니다. 이는 애플리케이션에 필요한 모든 필수 구성 요소 패키지를 처리합니다. 패키지 관리자 없이 설치하는 경우 모든 필수 패키지와 라이브러리가 운영 체제에 설치되어 있는지 확인해야 합니다. 문서에 이러한 필수 애플리케이션 목록을 포함시키는 것이 좋습니다.

답변3

형편없는 답변부터 시작해 보겠습니다.때에 따라 다르지

바이너리를 출시하는 경우 배포하는 것이 아니라면 대답은 "아니요"라고 가정하세요.모두도서관한 번이를 포함시키거나(완전히 독립된 거대한 시스템을 제공하지 않는 한 처음부터 시작하는 것은 짜증나는 일입니다) 또는 이에 상응하는 정적 링크를 포함시키십시오.

...하지만 마법사와 돈, 그리고 돈의 마법사...

IBM에는 여러 세대에 걸친 커널의 여러 Linux, OpenSolaris(또는 요즘은 무엇이든), Solaris 및 BSD 등 내가 시도하는 모든 곳에서 작동하여 나를 놀라게 하는 몇 가지 "일반 Unixish" 설치 프로그램이 있습니다. 하지만 그들은 크다. 그리고 그들이 제공하는 것도 마찬가지로 엄청납니다. 이런 식으로 깔끔하고 작은 레이싱 프로그램은 출시되지 않을 것이며 IBM에서 기대할 수 있는 대기업 유형의 제품만 출시될 것입니다.

Linux에 머무르지만 대부분의 Linuxdom에서 잘 실행된다는 점에서 프로그램에서 시연된 것처럼 일부 공급업체의 다양한 "Linux용(유니버설)" 유형 바이너리 설치를 볼 수 있으므로 이는 바이너리 형식으로도 가능한 것 같습니다. 일부 채팅, 브라우저, 게임, 메타 설치 프로그램 등은 이런 방식으로 출시되지만 항상 시간을 들여 잘 수행할 수 있는 대규모 공급업체에 의해 출시됩니다. 그들이 "Linux용"이라고 말하고 일반적으로 그것이 작동할 것이라고 믿는 것은 다소 놀라운 일이지만 실제로는 그런 것 같습니다.

하지만...

내 소프트웨어를 소스 코드로 배포하기 위해 빌드 유틸리티를 사용합니다. 저는 C, Erlang, Python, Guile 등에서 이 작업을 수행합니다. 이것은 나에게많은실행 여부에 대한 유연성이 더 뛰어나며 실행할 때 모든 것이 제 위치에 있는지 확인하는 것보다 빌드할 때 올바른 항목이 있는지 확인하기 위해 빌드 스크립트를 작성하는 것이 훨씬 쉽습니다. 소스 코드가 존재하면 소스 코드를 배포하는 경우 프로그램에 대한 자동 업데이트를 작성하는 것은 간단합니다. 소스 코드는 일반적으로 모든 dep 및 기타 이상한 항목이 포함된 바이너리보다 훨씬 작습니다. 이 접근 방식을 사용하면 Unices(때때로 Windows에서는 약간 번거롭지만)에서 안정적으로 배포하는 데 큰 문제가 없습니다.

충분히 재미있으니 무장하세요!

srsly srs처럼 Linux 세계에 원활하게 통합하는 것에 대해 진지하게 생각한다면 C 소스 코드를 배포하십시오.또는이미 사전 구축된 편리한 언어를 사용하여 완전 관리형 환경으로 전환하세요. 예를 들어, Python 코드를 작성하는 경우 버전을 확인하고 CPython 버전이 작동하는 버전을 확인할 수 있으며 일반적으로 특정 Linux에 호환 가능한 버전이 있을 것으로 예상할 수 있습니다(이는 광범위한 C 라이브러리보다 확인하기가 더 쉽습니다). 사용된 버전에서 작업 중일 수 있음). Erlang, Guile, Python, Perl, CL 등은 모두매우이러한 배포를 위한 간단한 대상은 CPAN이나 pip(또는 무엇이든)와 같은 중앙 저장소가 있어 사용자가 필요할 때 서명 소스를 직접 가져오는 명령을 실행할 수 있고 일반적으로 예상대로 작동할 것임을 알 수 있습니다.

[부록 1.Haskell조차도 일반적으로 Cabal을 통해 이를 달성할 수 있습니다.– 프로덕션 환경에서는 이 작업을 수행하는 데 조심스럽습니다. 2. Erlang은 코드가 완전한 환경과 함께 제공되도록 보장하는 완전히 다른 "릴리스" 배포 전략을 가지고 있습니다. 3. Python은 가상 환경을 통해 한 단계 더 나아갑니다. 모든 런타임이 그다지 도움이 될 수는 없습니다. ]

Linux 호스팅 환경에 대한 마지막 참고 사항기이. 그리고 보너스로 더 일반적인 종속성을 정의하여 각 배포판에 대한 패키지를 작성하지 않고도 추가 노력 없이 자동으로 해결할 수 있습니다.시스템이 32비트인지 64비트인지 더 이상 신경 쓸 필요가 없습니다.(어쨌든 일반적으로 말하면).

관련 정보