以前 Pyinstaller で実行ファイルを作成したのですが、ダイナミックリンクで作成されており、環境依存の問題を考慮し、完全に静的なライブラリで完結する実行ファイルにできないか調査してみました。
以下のサイトを参考に完全に静的なライブラリ化させた実行ファイルを作成してみました。
参考:
qiita.com
検証
pyinstaller でシングルバイナリを作成後に実行ファイルの共有オブジェクトの動的依存関係を確認します。
ダイナミックリンクかどうかは"ldd"コマンドで確認が行えます。
(lddコマンドは実行可能ファイルまたは共有オブジェクトの動的依存関係の表示するコマンドです)
依存関係のある場合は以下のような出力になります。
$ ldd sample linux-vdso.so.1 (0x00007ffc529ff000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f33193b8000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f331939c000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f3319379000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3319187000) /lib64/ld-linux-x86-64.so.2 (0x00007f33193d2000)
サイトを参考に、staticx というコマンドで "Fully-static application" として実行ファイルを作成します。
$ staticx sample sample
ダイナミックリンクがなくなっていることを確認します。
動的依存関係がなくなると、lddコマンド実行後に"not a dynamic executable"というメッセージが表示されます。
$ ldd sample not a dynamic executable