ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

【python】Pyinstaller でバイナリ化した実行ファイルにダイナミックリンクしているものがあったので完全に静的なライブラリ化をめざす方法

以前 Pyinstaller で実行ファイルを作成したのですが、ダイナミックリンクで作成されており、環境依存の問題を考慮し、完全に静的なライブラリで完結する実行ファイルにできないか調査してみました。

a1026302.hatenablog.com

以下のサイトを参考に完全に静的なライブラリ化させた実行ファイルを作成してみました。
参考:
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