2012-06-26 6 views
6
$ printf 'int main(){}' | gcc -static -x c - -o hello 
$ scp hello vi-server.org:./ 
hello        100% 565KB 565.2KB/s 00:00 
$ ssh -t vi-server.org "./hello; uname -r" 
FATAL: kernel too old 
sh: line 1: 15378 Segmentation fault  ./hello 
2.6.18-274.... # can't easily upgrade the kernel 
Connection to vi-server.org closed. 

古いシステムで動作するスタティックバイナリをビルドするにはどうすればいいですか? 2.4でも静的なバイナリが動作することを期待しています。古いカーネルでGNU/Linuxインストール用の静的バイナリを構築するには?

答えて

8

古いカーネルバージョンをターゲットにするためにglibcを設定する必要があります。 Per http://www.gnu.org/software/libc/manual/html_node/Configuring-and-compiling.html glibcは、コンフィグレーションオプション--enable-kernel=versionを受け入れます。ここで、versionは古いカーネルバージョンをターゲットにする形で2.4.20です。

その後、プログラムを静的にgcc -static -nodefaultlibs [...] /path/to/my/libc.aにリンクすることができます。

0

は、上記のポスターecatmurにありがとう - それは確かに私は次のように追加しますconfigureオプション--enable-カーネル=バージョン

でのglibcを再構築/再構成するために、動作しません - あなたは、GCC -staticを使用することができます-L/path/to/local/lib(ディレクトリへの大きなLオプション)を指定すると、ライブラリファイル自体にリンクするだけでなく動作するように見えます。後者の方法で(/path/to/local/lib/libc.aに)リンクすると、不必要に大きな実行可能ファイルが作成されました。

+2

注: "半静的"バイナリを作成するオプションがよくあります。 libcに動的にリンクしますが、静的に他のライブラリにリンクします(バイナリに含めるライブラリとリンクするライブラリを選択できます)。これは、リンクコマンドを手動で編集することで実行できます。 –

関連する問題