1つのLinuxバージョンでコンパイルされた、小さくて非常に単純なプログラム(下図)の実行可能ファイルを別のバージョンのLinuxで実行できますか?それとも再コンパイルする必要がありますか?
この場合、マシンアーキテクチャは重要ですか?
int main()
{
return (99);
}
ベストアンサー1
簡単に言うと:コンパイルされたバイナリをあるホストから別のホストに転送するために同じ(または互換性のある)ホストを使用する場合建築学、おそらく全く別の場所に持って行くかもしれません。分配する。ただし、コードが複雑になると、別の場所にインストールされていないか、別のバージョンにインストールされているライブラリにリンクする可能性が高くなります。たとえば、コードはldd
(Debianから派生した)Ubuntu Linuxホストでコンパイルすると、次の依存関係が報告されます。gcc -o exit-test exit-test.c
$ ldd exit-test
linux-gate.so.1 => (0xb7748000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb757b000)
/lib/ld-linux.so.2 (0x8005a000)
このバイナリをMac()に転送すると./exit-test: cannot execute binary file: Exec format error
実行されないようです。 RHELボックスに移動しましょう。
$ ./exit-test
-bash: ./exit-test: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
こんな。なぜこれが起こるのですか?
$ ls /lib/ld-l* # reference the `ldd` output above
ls: cannot access /lib/ld-l*: No such file or directory
このユースケースでも、共有ライブラリがないため、 Forklift は失敗します。
gcc -static exit-test-static exit-test.c
しかし、ライブラリなしでシステムに移植した場合。もちろん、ディスク容量を犠牲にして:
$ ls -l ./exit-test{,-static}
-rwxr-xr-x 1 username groupname 7312 Jan 29 14:18 ./exit-test
-rwxr-xr-x 1 username groupname 728228 Jan 29 14:27 ./exit-test-static
別の考えられる解決策は、新しいホストに必要なライブラリをインストールすることです。
U&Lの世界の多くのように、この猫はいくつかのスキンを持っており、そのうちの2つが上記で説明されています。