私のLinuxバイナリはすべてのディストリビューションで動作しますか?


24

Lazarusと呼ばれるDelphiの優れた代替IDEを見つけました。しかし、プログラマーに質問はありません。

ウィル静的にリンクされたすべてのLinuxディストリビューション上のLinuxバイナリ仕事は?すなわち、どのLinuxディストリビューションを構築したかには関係なく、Debian / ArchLinux / Ubuntu / OpenSUSE / ...なんでも動作しますか?

私の発見の結果、本当に重要なのは32ビット対64ビットだけですか?公開する前に確認したい。



プログラムをリンクする予定のライブラリの種類をより具体的に教えていただけますか?一部のライブラリには、非表示の依存関係(データファイル、動的サブシステム)、または実行中のシステムに関する暗黙の前提があります。
トーマスエルカー

回答:


29

この回答は、最初に「すべてのディストリビューションでバイナリを実行します」というより一般的な質問に対して書かれましたが、後半に静的にリンクされたバイナリに対処します。


静的にリンクされたhello worldよりも複雑なものの場合、答えはおそらくnoです。
ディストリビューションXでテストせずに、Xの答えノーだと仮定します。

ソフトウェアをバイナリ形式で出荷する場合は、

  • ソフトウェアの使用分野向けのいくつかの一般的なディストリビューション(デスクトップ、サーバー、組み込み、...)

  • それぞれの最新の1つまたは2つのバージョン

それ以外の場合は、すべてのサイズ、バージョン、および年齢の何千もの配布になります(10年前の配布はまだ使用されサポートされています)。

それらをテストします。それ以外の場合、何が間違っている可能性がある(そして、それが起こる)かについてのほんのいくつかのポインター:

  • 必要なツール/ライブラリのパッケージは、ディストリビューション間で、また同じディストリビューションのバージョン間でも異なる名前になります

  • 必要なライブラリが新しすぎるか古すぎます(間違ったバージョン)。プログラムがリンクできるからといって、正しいライブラリとリンクしていると仮定しないでください。

  • 同じライブラリ(ディスク上のファイル)は異なるディストリビューションで異なる名前が付けられているため、リンクは不可能です。

  • 64ビット上の32ビット:32ビット環境がインストールされていないか、一部の重要ではない32ビットライブラリが32on64環境とは別の追加パッケージに移動されている可能性があるため、この場合だけ追加の依存関係があります。

  • シェル:お使いのBashのバージョンを想定しないでください。Bashでさえも想定しないでください。

  • ツール:POSIX以外のコマンドラインツールがどこかに存在すると想定しないでください。

  • ツール:ディストリビューションのGNUバージョンが認識しているという理由だけで、ツールがオプションを認識すると仮定しないでください。

  • カーネルインターフェイス:/procマシン上にファイルが存在する/構造を持っているという理由だけで、ファイルの存在や構造を想定しないでください

  • Java:SLESに同梱されているIBMのJREで、プログラムをテストせずに実行しますか?

ボーナス:

  • 命令セット:マシンでコンパイルされたバイナリは、古いハードウェアでは実行されません。

される静的にリンクする溶液は:(あなたがソフトウェアを必要とするすべてのライブラリをバンドルしますか)?技術的には機能していても、関連するコストは高すぎる可能性があります。残念ながら、答えはおそらくどちらでもありません。

  • セキュリティ:ライブラリを更新する責任を、ソフトウェアのユーザーから自分に移します。

  • サイズと複雑さ:楽しみのために、静的にリンクされたGUIプログラムを作成してみてください。

  • 相互運用性:ソフトウェアがあらゆる種類の「プラグイン」である場合、呼び出し元のソフトウェアに依存します。

  • ライブラリの設計:プログラムをGNU libcに静的にリンクし、ネームサービス(getpwnam()など)を使用すると、libcのNSS(ネームサービススイッチ)に対して動的にリンクされます。

  • ライブラリデザイン:プログラムを静的にリンクするライブラリは、データファイルまたはその他のリソース(タイムゾーンやロケールなど)を使用します。


上記のすべての理由から、テストは不可欠です。

  • KVMまたはその他の仮想化技術に精通し、サポートする予定のすべてのディストリビューションのVMを用意します。すべてのVMでソフトウェアをテストします。

  • これらのディストリビューションの最小インストールを使用してください。

  • 制限された命令セット(SSE 4なしなど)でVMを作成します。

  • 静的リンクまたはバンドルのみ:バイナリlddが本当に静的にリンクされているかどうかを確認し、バンドルライブラリのみを使用します。

  • 静的リンクまたはバンドルのみ:空のディレクトリを作成し、そこにソフトウェアをコピーします。chrootそのディレクトリに移動し、ソフトウェアを実行します。


それはかなり包括的な答えです+1
sirlark

2
シェル:特に、Debianはbashを使用していません。これにより、DebianシステムのShellshockの脆弱性が大幅に軽減されたため、近い将来に変更されることは想像できません。
ケビン

1
また、バイナリを出荷する場合は、それらを静的リンクします
user253751

「命令セット」が「ボーナス」と呼ばれるのはなぜですか?バイナリ形式で配布する場合、どのISAをコンパイルするのかを本当に考慮する必要があります。m68kユーザーは気にしないかもしれませんが、少なくともARM、IA32、およびX86_64を無視するのは困難です。
トビーSpeight

@TobySpeight SSE4などを考えてください。アセンブラーを使用している場合にのみ噛むことがあります。
トーマスエルカー

9

答えはそれによって異なります。、ただし、必要なライブラリがOSにインストールされている限り、ほとんどの場合、はい。

一般的に、あなたが言及したようなほとんどの主要なディストリビューションには、コミュニティ管理バージョンのアプリケーションをインストールするパッケージ管理ツールがあります。これにより、アプリケーションに必要な前提条件パッケージが処理されます。パッケージマネージャーなしでインストールする場合、必要なすべてのパッケージとライブラリがOSにインストールされていることを確認するのはユーザー次第です。これらの前提アプリケーションのリストをドキュメントに含めることをお勧めします。


2

安っぽい答え最初:それは依存します

バイナリをリリースする場合、それ関与するすべてのライブラリを配布しない限り、答えは「いいえ」であると仮定します(最初から、とにかく独立した本当に巨大なシステムを提供しない限り、これは迷惑です) )または同等のものを静的にリンクしています。

...しかし、魔法使いとお金、そしてお金の魔法使い...

IBMには、いくつかのカーネル世代、OpenSolaris(または現在の名称)、Solaris、およびBSDのいくつかのLinucesを試してみたところ、衝撃を受けた「一般的なUnixish」インストーラーがいくつかあります。しかし、それらは巨大です。そして、彼らが提供するものも同様に巨大です。このようにして公開されるのは、すてきな小さなレースカープログラムではなく、IBMに期待される大規模なエンタープライズタイプのものだけです。

Linuxにとどまっているが、ほとんどのLinuxdomでうまく機能している限り、これはバイナリ形式で可能であるように見えます。これは、一部のベンダーが提供するさまざまな「for Linux(general)」タイプのバイナリインストーラによって証明されています。いくつかのチャット、ブラウザ、ゲーム、メタインストーラなどがこの方法で公開されていますが、常にこれを正しくするために時間を費やすことができる巨大なベンダーによって公開されています。彼らが「for Linux」と言うことができ、それがうまくいくと一般的に確信しているのは驚くべきことですが、これは事実のようです。

しかし...

ビルドユーティリティを使用して、ソフトウェアをソースとして配布します。私はこれが私に与え等のC、アーラン、パイソン、ガイル、でこれを行うに多く、それが実行するかではないでしょうかどうかについて、より多くの柔軟性を、そして確かに正しいことをするよりも、ビルド時に存在しますbuildscriptを書くためにはるかに簡単です実行時にすべてが適切に配置されていることを確認してください。それが存在する場合、ソースを配布する場合、プログラムの自動更新プログラムを作成するのは簡単です。ソースは通常、すべての依存関係やその他の狂気を含むバイナリよりもはるかに小さくなります。この方法を使用すると、Unices(および場合によってはWindowsでも)を確実に展開するのにそれほど苦労することはありませんでしたが、それはもう少し面倒です。

十分な子供の遊び、あなた自身を武装してください!

srsly srsのように、Linuxの世界にスムーズにフィットすることに真剣に取り組んでいるとき、Cソースを配布する、完全に管理された環境に切り替えて、既に構築済みのハック的で楽しい言語にします。たとえば、Pythonコードを記述している場合は、バージョンを確認して、どのCPythonバージョンが動作するかを知ることができ、通常、特定のLinuxに互換性のあるバージョンが存在することを期待できます(これは、Cライブラリの広範なスイープよりもはるかに簡単に確認できます/ versionsを使用している可能性があります)。Erlang、Guile、Python、Perl、CLなどはすべて非常に この種の展開の簡単なターゲットであり、多くのユーザーはCPANやpip(または何でも)のような中央リポジトリを持ち、ユーザーは必要に応じてコマンドを実行して署名されたソースを自分でプルでき、通常は意図したとおりに機能することを知っています。

[補遺:1. Haskellでさえ、通常はCabalを介してこれを実行できます。2. Erlangには完全に異なる「リリース」デプロイメント戦略があり、コードが完全な環境を運ぶことを保証します。3. Pythonは仮想環境でさらに一歩前進します。すべてのランタイムがあなたを助けるわけではありません。]

Linuxの管理された環境についてのこの最後の話は驚くばかりです。また、ボーナスとして、より一般的な依存関係を定義し、余分な労力を必要とせずに自動的に解決し、ディストリビューションごとにパッケージを書く必要がなく、システムが32か64かを気にするのを止めることができますビット(通常、とにかく)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.