리눅스 바이너리가 모든 배포판에서 작동합니까?


24

Lazarus라는 Delphi를 대체 할 좋은 IDE를 찾았습니다. 그러나 프로그래머에게는 질문이 없습니다.

의지 정적으로 링크 된 모든 리눅스 배포판에서 리눅스 바이너리 작업은? 즉, 어떤 Linux 배포판을 빌드했는지는 중요하지 않으며 Debian / ArchLinux / Ubuntu / OpenSUSE / ...에서 작동합니다.

내 결과로 32 비트 대 64 비트 만 중요합니까? 게시하기 전에 확인하고 싶습니다.



프로그램을 연결하려는 라이브러리 종류에 대해 더 구체적으로 설명해 주시겠습니까? 일부 라이브러리에는 숨겨진 종속성 (데이터 파일, 동적 하위 시스템) 또는 실행중인 시스템에 대한 암시 적 가정이 있습니다.
Thomas Erker

답변:


29

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


정적으로 연결된 헬로 월드보다 복잡한 것은 아마도 답이 아닐 것이다 .
배포 X에서 테스트하지 않으면 X에 대한 답 아니오 라고 가정하십시오.

소프트웨어를 바이너리 형태로 배송하려면 다음과 같이 제한하십시오.

  • 소프트웨어 사용 분야 (데스크톱, 서버, 임베디드 등)에 대한 몇 가지 인기있는 배포판

  • 각각 하나 또는 두 개의 최신 버전

그렇지 않으면 당신은 모든 크기, 버전 및 연령 분포 만흥와 끝까지 (열 살짜리 분포는 아직 사용 지원).

그것들을 테스트하십시오. 그렇지 않으면 잘못 될 수있는 것과 그렇지 않은 것에 대한 몇 가지 포인터 :

  • 필요한 도구 / 라이브러리 패키지는 배포판과 동일한 배포판 버전에 따라 다르게 이름이 지정됩니다.

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

  • 동일한 라이브러리 (디스크의 파일)는 다른 배포판에서 다르게 이름이 지정되어 연결 불가능

  • 64 비트의 32 비트 : 32 비트 환경이 설치되지 않았거나 비 필수 32 비트 라이브러리가 32on64 환경과 별도로 추가 패키지로 이동되었으므로이 경우에만 추가 종속성이 있습니다.

  • 쉘 : Bash 버전을 가정하지 마십시오. 배쉬조차도 가정하지 마십시오.

  • 도구 : POSIX 이외의 명령 행 도구가 어디에도 있다고 가정하지 마십시오.

  • 도구 : 배포판의 GNU 버전 때문에 도구가 옵션을 인식한다고 가정하지 마십시오.

  • 커널 인터페이스 : 음주에있는 파일의 존재 또는 구조를 가정하지 /proc그들이 존재해서가 / 당신의 시스템의 구조

  • Java : 프로그램을 테스트하지 않고 SLES와 함께 제공되는대로 IBM의 JRE에서 프로그램이 실행되고 있습니까?

보너스:

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

되어 정적으로 연결 (또는 : 당신이 당신의 소프트웨어를 필요로하는 모든 라이브러리 번들) 솔루션을? 기술적으로 작동하더라도 관련 비용이 많이들 수 있습니다. 불행히도 그 대답은 아마도 아닙니다.

  • 보안 : 귀하는 소프트웨어 사용자로부터 자신에게 라이브러리를 업데이트해야 할 책임이 있습니다.

  • 크기와 복잡성 : 재미를 위해서 정적으로 링크 된 GUI 프로그램을 만들어보십시오.

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

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

  • 라이브러리 디자인 : 프로그램을 정적으로 링크하는 라이브러리는 데이터 파일이나 다른 리소스 (예 : 시간대 또는 로캘)를 사용합니다.


위에서 언급 한 모든 이유로 테스트 는 필수적입니다.

  • KVM 또는 기타 가상화 기술에 익숙해지고 지원하려는 모든 배포판의 VM을 확보하십시오. 모든 VM에서 소프트웨어를 테스트하십시오.

  • 해당 배포판의 최소 설치를 사용하십시오.

  • 제한된 명령어 세트로 VM을 생성합니다 (예 : SSE 4 없음).

  • 정적으로 링크되거나 번들로 제공되는 경우 : 바이너리 ldd가 실제로 정적으로 링크되어 있는지 확인하고 번들 라이브러리 만 사용하는지 확인하십시오 .

  • 정적으로 링크되거나 번들로 제공되는 경우 : 빈 디렉토리를 작성하고 소프트웨어를 해당 디렉토리에 복사하십시오. chroot해당 디렉토리에 넣고 소프트웨어를 실행하십시오.


그것은 꽤 포괄적 인 답변입니다 +1
sirlark

2
셸 : 특히 데비안은 bash를 사용하지 않으며 , 데비안 시스템의 셸 쇼크 취약점을 크게 완화 시켰기 때문에 당장 변경되는 것을 상상할 수 없습니다.
Kevin

1
또한 바이너리를 배송하려면 정적으로 연결하십시오 .
user253751

"지시 설정"이 "보너스"라고 불리는 이유는 무엇입니까? 이진 형식으로 배포하는 경우 컴파일 할 ISA를 고려해야합니다. m68k 사용자는 신경 쓰지 않아도되지만 최소한 ARM, IA32 및 X86_64를 무시하기는 어렵습니다.
Toby Speight

@TobySpeight SSE4 등을 생각하십시오. 어셈블러를 사용하는 경우에만 물릴 수 있습니다.
Thomas Erker

9

대답은 그것이 달려 있다는 것입니다. 필요한 라이브러리가 OS에 설치되어 있다면 대부분의 경우 가능합니다.

일반적으로 언급 한 것과 같은 대부분의 배포판에는 커뮤니티 관리 버전의 응용 프로그램을 설치하는 패키지 관리 도구가 있습니다. 응용 프로그램에 필요한 모든 필수 패키지를 처리합니다. 패키지 관리자없이 설치하는 경우 필요한 모든 패키지와 라이브러리가 OS에 설치되어 있는지 확인하십시오. 이러한 필수 구성 요소 응용 프로그램 목록을 설명서에 포함시키는 것이 좋습니다.


2

Crappy는 먼저 답변 : 그것은 달려 있습니다

당신이 바이너리를 해제하는 경우, 될 수있는 답을 가정 "아니오"당신은 배포하지 않는 한 모두 가하는 libs와 지금까지 당신이 자신 어쨌든에 서 정말 큰 시스템을 제공하지 않는 성가신 밑바닥에서 (그것으로 포함 ) 또는 해당 항목을 정적으로 연결합니다.

...하지만 마법사와 돈, 돈 마법사 ...

IBM은 "커널 유닉스 (Unixish)"인스톨러를 가지고있다. 여러 커널 세대의 여러 Linuces, OpenSolaris (또는 현재는 무엇이든), Solaris, BSD 등 내가 시도한 모든 곳에서 일하면서 충격을 준 일부 "유닉스 유닉스"설치 프로그램이있다. 그러나 그들은 크다. 그리고 그들이 제공하는 것은 똑같이 거대합니다. 이처럼 작은 레이싱 카 프로그램은 공개되지 않으며 IBM에서 기대할 수있는 대기업 용 제품입니다.

Linux를 유지하면서 대부분의 Linuxdom에서 잘 작동하는 한 일부 벤더에서 볼 수있는 다양한 "for Linux (일반)"유형 바이너리 설치 프로그램에서 알 수 있듯이 바이너리 형태로 가능한 것으로 보입니다. 여러 채팅, 브라우저, 게임, 메타 인스톨러 등이 이런 방식으로 게시되지만 항상이 권리를 얻기 위해 시간을 할애 할 수있는 거대한 벤더가이를 게시합니다. 그들이 "리눅스"라고 말할 수 있다는 것은 놀라운 일이며 일반적으로 그것이 작동 할 것이라고 확신하지만 이것이 사실 인 것 같습니다.

그러나...

빌드 유틸리티를 사용하여 소프트웨어를 소스로 배포합니다. 나는 C, Erlang, Python, Guile 등에서이 작업을 수행합니다. 이것은 실행 여부에 대해 훨씬 더 많은 유연성을 제공 하며 빌드 타임에 올바른 것들이 존재하는지 확인하는 빌드 스크립트를 작성하는 것이 훨씬 쉽습니다. 런타임에 모든 것이 제자리에 있는지 확인하십시오. 일단 소스가 배포되면 프로그램을위한 자동 업데이터를 작성하는 것은 사소한 일입니다. 소스는 일반적으로 모든 깊이와 다른 광기를 포함하는 바이너리보다 훨씬 작습니다. 이 방법을 사용하면 Unices (그리고 때로는 Windows이지만 안정적으로 배포하는 데 많은 어려움을 겪지 않았습니다).

충분한 차일 놀이, 자신을 무장하십시오!

srsly srs와 같이 진지하게 리눅스 세계에 부드럽게 적응하는 것에 대해 심각 해지면 C 소스를 배포 하거나 이미 사전 구축되어있는 hackishly 쾌적한 언어를 위해 완전히 관리되는 환경으로 전환하십시오. 예를 들어 Python 코드를 작성하는 경우 버전을 확인하고 사용중인 CPython 버전을 알 수 있으며 일반적으로 특정 Linux에 호환되는 버전이있을 것으로 기대합니다 (C 라이브러리의 광범위한 스윕보다 확인하기가 훨씬 쉽습니다) / versions 사용 중일 수 있습니다). Erlang, Guile, Python, Perl, CL 등은 모두 매우 이러한 종류의 배포를위한 쉬운 대상이며, 많은 사용자가 CPAN 또는 pip (또는 기타)와 같은 중앙 리포지토리를 사용하여 사용자가 원하는 때 서명 된 소스를 가져 오기위한 명령을 실행할 수 있으며 일반적으로 의도 한대로 작동한다는 것을 알고 있습니다. .

[부록 : 1. Haskell조차도 일반적으로 Cabal을 통해이 작업을 수행 할 수 있습니다.하지만 프로덕션 환경에서는이 작업을 신중하게 수행해야합니다. 2. Erlang과는 완전히 다른 "릴리스"배포 전략이 있으므로 코드가 완전한 환경을 갖도록 보장합니다. 3. 파이썬은 가상 환경을 한 단계 더 발전시킵니다. 모든 런타임이 그다지 도움이되는 것은 아닙니다.]

리눅스에서 관리되는 환경에 대한 마지막 부분은 정말 대단하다 . 또한 보너스로 훨씬 더 일반적인 종속성을 정의하고 별도의 노력없이 자동으로 해결할 수 있으며 배포판 당 패키지를 작성할 필요가 없으며 시스템이 32 또는 64인지에 대한 걱정을 중지 할 수 있습니다 비트 (일반적으로 어쨌든).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.