ポータブルLinuxアプリケーションを作成するには?

ポータブルLinuxアプリケーションを作成するには?

私はEmacs 24.3の「ポータブル」バージョンを作りたいです。私はいくつかのDebian 7システムで作業していますが、rootアクセス権がありません。 Debian 7にはEmacs 24がないので、USBサムドライブを使って持ち運べるポータブルバージョンを作りたかったのです。私の具体的な質問は次のとおりです。

  1. インストールプレフィックスを柔軟に作成できますか、それとも固定的に接続されていますかconfigure --prefix=...
  2. インストール時に必要なすべてのファイルをどのよう.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

答え2

私はあなたと同じ問題を抱えました(いくつかの「セキュリティ」があるLinux)。同じLinux OS(すべての/usr/share/emacsツリーとすべてのファイル)/usr/libexecからインストールされたバージョンを実行し、/usr/bin/emacs*安全なシステムに保存しました。

実行後、emacs24-x共有ライブラリ()を要求しました。.soどのライブラリなのか覚えていません。

また、ターゲットコンピュータにインポートして変数に位置を追加する関数(累積を避けるために囲まれています)にemacs24-x呼び出し(関数引数を含む)をラップしました。"$@".soLD_LIBRARY_PATH()

/usr/shareその後、上記の場所に関するメッセージを受け取りましたlibexec

/usr/share/emacsバイナリエディタ(たとえば)を使用し、ツリー内の12個のASCIIファイルをコピーして各「/usr/share」を「/tmp/share」および)に置き換えて、実行可能ファイルのすべての参照を修正しました。/usr/libexecmadedit/tmp/libexec

mkdir /tmp/share私の「emacs」機能にコピーされたemacsツリーに接続するために、2つのシンボリックリンク(テスト後にまだ存在しない)を追加しました。

その後実行

emacs <myfile>

私にぴったりです。私はEmacsの実際のポータブルバージョンを持っています(設定しません)。

答え3

CentOS 7でEmacs 24のポータブルバージョンを作成できました。 Debian にも同じアプローチが適用されます。私が最初にしたことは、rootアクセス権があり、必要なライブラリとツールをインストールできることを確認するために、新しいオペレーティングシステムのコピーを含む仮想マシンをインストールすることでした。

ポータブルインストールを作成する最初の試みには、仮想emacsマシンにパッケージをインストールし、バイナリとライブラリをカスタムフォルダにコピーして、ライブラリを含むLD_LIBRARY_PATHフォルダを設定することが含まれていました。これはターゲットシステムでEmacsを起動するのに十分ですが、残念ながらEmacsはいくつかの構成設定にハードコードされた値を使用しているように見えます。

Warning: arch-dependent data dir (/usr/libexec/emacs/24.3/x86_64-redhat-linux-gnu/) does not exist.
Warning: arch-independent data dir (/usr/share/emacs/24.3/etc/) does not exist.
Warning: Lisp directory `/usr/share/emacs/24.3/lisp' does not exist.
Warning: Lisp directory `/usr/share/emacs/24.3/leim' does not exist.
Error: charsets directory not found:
/usr/share/emacs/24.3/etc/charsets
Emacs will not function correctly without the character map files.
Please check your installation!

/usr/shareターゲットシステムにリンクやフォルダを作成する権限がないため、進行はブロックされます。

2番目の試みは、Emacsのソースコード(1つ以上のパフォーマンス!)を仮想マシンにダウンロードし、この./configure --prefix=<DIR>コマンドを使用して自分のコピーを作成することでした。 Emacsを入手して構築する方法についてのガイドラインは、次のとおりです。http://ergoemacs.org/emacs/building_emacs_from_git_repository.html、Debianコマンドを使用します。私のワークフローは次のとおりです。

git clone https://github.com/mirrors/emacs.git
cd emacs
git pull
./autogen.sh
# Here, I tell make to install emacs to ~/bin/centos
./configure --prefix=~/bin/centos
make bootstrap
make install

CentOS関連のライブラリ依存関係をインストールするには少しバイパスする必要がありました(sudo yum install texinfo ncurses-devel.x86_64)。

~/bin/centosこれで、私のフォルダ(Emacsを実行するために必要なすべてのバイナリとライブラリが含まれています)を別のCentOS 7システムの同じ場所にコピーしてそれを~/bin/centos/bin私のフォルダに追加すると、PATHEmacsが実行されます。設定とテーマを維持するために.emacsファイルとフォルダをコピーする必要がありました。.emacs.dこれは、デフォルトでシステムEmacsパッケージをインストールする権限がないシステムのホームディレクトリにあるスタンドアロンポータブルEmacsインストールです。

configureUSBドライブ上のフォルダ(たとえば)と一緒にコマンドを提供し、常にUSBドライブを同じ場所にマウントする場合は、USBドライブをマウントし、変数を設定し./configure --prefix=/media/usb/binてEmacsを実行できる必要があります。PATH独自の呼び出しでカスタムファイルやフォルダを指定する方法はないようですが、.emacsシンボリックリンクなどを使用できます。.emacs.demacs~/.emacs/media/usb/.emacs

関連情報