web-dev-qa-db-ja.com

ポータブルLinuxアプリを作成するにはどうすればよいですか?

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

  1. インストールプレフィックスを柔軟にすることはできますか、それともconfigure --prefix=...によってハードワイヤードされていますか?
  2. インストールに必要なすべての.so-ファイルをバンドルするにはどうすればよいですか?
7
Arne

これを行うにはいくつかの方法があります。最初は簡単な方法です。

インストールプレフィックスを柔軟にするのは難しいです-インストールプレフィックスをホームディレクトリ、または任意のマシンでアクセスできる場所に作成して、

_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_を追加し続けることができます。 ncursesのパスがバイナリにハードコードされているAndroid電話用にコンパイルしたバイナリを使用して、これに頼るだけで済みました。

最後に見つけたのは、これを追加することで_ld-linux.so.*_の場所をハードコードしないようにすることができることです(システムの場所に合わせて、_locate ld-linux_のようなものを実行し、以下のようなものを見つけます。

_-Wl,--dynamic-linker=/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
_

LDFLAGS変数に。

4
Wyatt8740

CentOS 7でEmacs 24のポータブルバージョンを作成することができました。Debianでも同じアプローチが機能するはずです。私が最初にしたことは、OSの新しいコピーを使用して仮想マシンをインストールし、rootがあり、必要なライブラリとツールをインストールできることを確認することでした。

ポータブルインストールを作成する最初の試みでは、仮想マシンにemacsパッケージをインストールし、バイナリとライブラリをカスタムフォルダーにコピーしてから、LD_LIBRARY_PATHをライブラリのあるフォルダーに設定しました。これはEmacsをターゲットシステムで起動するのに十分でしたが、残念ながら、Emacsはその構成設定の一部にハードコードされた値を使用しているようで、不足しているcharsetsディレクトリに関する次のエラーの回避策を見つけることができませんでした:

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のソースコード(ギガバイト以上!)をVMにダウンロードし、./configure --prefix=<DIR>コマンドを使用して独自のコピーを作成することでした。 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)に固有のライブラリ依存関係をインストールするには、いくつかの迂回を行う必要がありました。

これで、Emacsの実行に必要なすべてのバイナリとライブラリを含む~/bin/centosフォルダを他のCentOS 7システムの同じ場所にコピーし、~/bin/centos/binPATHに追加すると、Emacsを使用できるようになります。設定とテーマを保持するために、.emacsファイルと.emacs.dフォルダーをコピーする必要がありました。これは基本的に、システムのEmacsパッケージをインストールする権限を持っていないシステムのホームディレクトリにある自己完結型のポータブルEmacsインストールです。

configureコマンドにUSBドライブ上のフォルダー(./configure --prefix=/media/usb/binなど)を指定し、常に同じ場所にUSBドライブをマウントすると、USBドライブをマウントし、PATH変数を設定して、Emacsを実行できるはずです。 emacs自体を呼び出すときにカスタム.emacsファイルまたは.emacs.dフォルダーを指定する方法はないようですが、~/.emacsから/media/usb/.emacsなどへのシンボリックリンクを使用することもできます。

1
Steve HHH

私はあなたと同じ問題を抱えていました(いくつかの「証券化」されたLinux)。同じLinux OS(すべての/usr/share/emacsおよび/usr/libexecツリーとすべての/usr/bin/emacs*ファイル)で、すでにインストールされているバージョンを実行し、セキュリティで保護されたマシンに配置しました。

emacs24-xを実行した後、共有ライブラリを要求しました(.so)どれを思い出せません...

私はそれを宛先マシンにも持ち運び、emacs24-x呼び出しを(関数パラメーター"$@"を使用して).so変数にLD_LIBRARY_PATH位置を追加する関数にカプセル化しました(蓄積を避けるために()で囲まれています)。

次に、/usr/shareおよびlibexecの場所に関する上記のメッセージを受け取りました。

実行可能ファイル内の/usr/share/emacsおよび/usr/libexecへのすべての参照を、バイナリエディタ(たとえばmadeditなど)を使用して、および数十のASCIIファイルで変更しました。コピーされたツリーで、すべての「/ usr/share」を「/ tmp/share」と/tmp/libexecに置き換えます。

私の「emacs」関数では、コピーされたemacsツリーに接続するためにmkdir /tmp/shareと2つのシンボリックリンク(テスト後、それらはまだ存在していませんでした)を追加しました。

その後、実行

emacs <myfile>

私にとっては完璧に機能します。私は実際のポータブルEmacsバージョンを持っています(構成していません)。

1
Sylvain