5

Linux 実行可能ファイルを「一度コンパイルすれば、どこでも実行できる」ようにする必要があります。私のプログラムは非常に基本的なシステム コール (ネットワーク IO とファイル IO のシステム コール) しか使用しないため、理論的には可能です。実際には、それは別の話です。

私の開発プラットフォームは Ubuntu 12.04 で、これにはかなり最近のカーネル、glibc、およびツールチェーンが含まれています。最初に実行可能ファイルを静的にリンクしようとしましたが、実行可能ファイルは centos 5 (カーネル バージョン 2.6.18) での実行を拒否しました。実行可能ファイルが動的にリンクされている場合、動的ローダー (ld.so) は実行可能ファイルのロードを拒否します。私は修正した動的ローダー (カーネルのバージョンを無視するように修正しました) を出荷しようとしましたが、libc、libgcc_s はまだ動作しません。実行可能。

ロードしたいものすべてをやみくもにロードするダイナミックローダーが必要です。Linuxでそのような動的ローダーを知っている人はいますか? 正しい方向に向かっているかどうかはわかりませんので、どんな提案も大歓迎です。

4

3 に答える 3

5

チェックしてください

http://sourceforge.net/projects/html5remote/

このプロジェクトでは、patchElf、LD_PRELOAD、および LD_LIBRARY_PATH をいじってみました。

相対パスを機能させるには、いくつかのトリックがあります。いくつかの実験の後、ld.so を使用してコマンド ラインからターゲット プログラムを直接ロードできるため、ターゲット バイナリにパッチを適用する必要はないという結論に達しました。例:

$ /lib64/ld-linux-x86-64.so.2 [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...]

この場合、ターゲット バイナリの elf ヘッダーに記述されたインタープリターは無視されます。例:

$ ldd /usr/bin/mysql

    linux-vdso.so.1 =>  (0x00007fff3fde0000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f72f89ea000)
    libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007f72f87a8000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f72f8590000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f72f838c000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f72f8090000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f72f7cd0000)
    /original/path/to/ld.so (0x00007f72f9187000) ** ignored **
    libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f72f7aa9000)

オプション:

--ライブラリパス

共有ライブラリ (例: libc.so など) を検索する場所を ld.so ローダーに指示します。

これが役立つことを願っています:)

于 2013-03-18T10:08:59.500 に答える
3

CentOS 5をビルドマシンとして使用し、その実行可能ファイルを新しいプラットフォームで実行してみてください。その逆ではありません。

于 2013-01-29T06:23:34.077 に答える
0

バイナリの移植性を高めるだけです。

あなたはできる、

よろしく。

于 2013-03-18T10:38:12.663 に答える