私はEmacs 24.3の「ポータブル」バージョンを作りたいです。私はいくつかのDebian 7システムで作業していますが、rootアクセス権がありません。 Debian 7にはEmacs 24がないので、USBサムドライブを使って持ち運べるポータブルバージョンを作りたかったのです。私の具体的な質問は次のとおりです。
- インストールプレフィックスを柔軟に作成できますか、それとも固定的に接続されていますか
configure --prefix=...
? - インストール時に必要なすべてのファイルをどのよう
.so
にバンドルできますか?
ベストアンサー1
簡単な方法から始めてこれを行ういくつかの方法があります。
インストールプレフィックスを柔軟にするのは難しいです。インストールプレフィックスをホームディレクトリまたはコンピュータからアクセスできる場所に設定し、次を使用します。
make install DESTDIR=/path/to/place/where/binaries/should/be/installed
プレフィックス以外の場所にインストールしてください。
個人的に私はバイナリを入れたので、$HOME/bin
コマンドは次のようになります。
./configure --prefix=$HOME
一部のプログラム(FFmpegがそれらの1つであることがわかっています)は、プログラムにコンパイルされたすべてのライブラリを使用して構築できるため、共有ライブラリを回避できます。 ffmpeg(およびおそらく他のもの)の場合、設定フラグはです--disable-shared --enable-static
。
これを使用して、ldd (name-of-binary-file)
必要な共有オブジェクトを確認し、それをフラッシュドライブにコピーできます。
編集1
接続したいライブラリの名前を取得する方法を見つけましたが、これは非常に役立ちます。
ldd binary-name|sed 's/=>.*//'|sed 's/\t//'|sed 's/\ (0x.*//'
リンクされたすべてのライブラリのリストを取得します。
また、ハードコーディングされたパスを持つファイルのみが提供されます。
ldd binary-name|sed 's/=>.*//'|sed 's/\t//'|sed 's/\ (0x.*//'|grep --color=never /
これは通常、ハードコードされたパスを持つライブラリにのみ名前にスラッシュがあるために機能します。次の可能性に進むときに何を見つけるべきかについてのアイデアを提供します。
編集2
手動で指定されたライブラリでシンボルを使用LD_PRELOAD
および/またはLD_LIBRARY_PATH
ロードできるため、以下で説明する「ハードコードされたパス」の問題は排除されます。
ライブラリにハードコードされたパスがある場合というツールがあると聞きましたchrpath
。私は単に16進エディタでバイナリを開き、共有ライブラリへのパスを変更するだけで(制限された)成功を収めました(元のコンパイルされたパスより短い限り)。文字列ターミネーターで終わる必要があります。 (これはほぼ常にCの場合です00
)。パスを変更するのに十分なスペースがあることを確認するために、ライブラリが次の場所にある場合は(私がコンパイルしたシステムで)シンボリックリンクを使用して非常に長いプレフィックスを設定します/usr/lib
。
sudo mkdir /OH_THIS_IS_A_VERY_VERY_VERY_VERY_VERY_LONG_DIRECTORY_NAME/
sudo ln -s /usr/lib /OH_THIS_IS_A_VERY_VERY_VERY_VERY_VERY_LONG_DIRECTORY_NAME/lib
mkdir destdir
./configure --prefix=/OH_THIS_IS_A_VERY_VERY_VERY_VERY_VERY_LONG_DIRECTORY_NAME
make
make install DESTDIR=$PWD/DESTDIR
($PWD
それは現在のディレクトリです。)
これにより、パスを変更するのに十分なスペースが提供されます。物理パスの後にスペースが残っている場合は、00
通常のスペースの終わりに達するまで追加を続けることができます。これを達成するには、Android携帯用にコンパイルされたバイナリを使用する必要があり、ncurses
携帯電話のパスはバイナリにハードコードされています。
あなたが見つけた最後の事実:これを追加して場所をハードコーディングしないようにすることができますld-linux.so.*
(システムの位置に合わせて調整し、次のコマンドを実行して次のlocate ld-linux
ような場所を見つけます)。
-Wl,--dynamic-linker=/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
あなたの変数にLDFLAGS
。