id:eel3:20150622:1434981139 の続きというかやり直しというか。

使用したソースファイルの内容や、ビルド時のコマンドなどについては、前回のエントリを参照してほしい。

前回の落穂拾い (1)：Go言語で動的リンク Go言語は、本家プロジェクトのコンパイラで普通にビルドすると、静的リンクの実行ファイルが生成される。 go build hello.go mv hello hello_bin/hello_go $ ldd hello_go 動的実行ファイルではありません $ _ オプション -ldflags を使ってリンカにオプションを設定することで、動的リンクの実行ファイルを生成できるようだ。 go build -ldflags ' -linkmode external ' hello.go mv hello hello_bin/hello_go $ ldd hello_go linux-gate.so.1 => (0xb774b000) libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb7719000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7570000) /lib/ld-linux.so.2 (0xb774c000) $ _ 実行ファイルの大きさを比較すると、こんな感じ。 link type not stripped stripped (strip -s) 静的リンク 1564840 1089912 動的リンク 1582347 1091428 ……あれ？ 動的リンクの方が微妙に大きいぞ？

前回の落穂拾い (2)：Rustをより動的リンクな感じにビルドする 前回、Rustのコードを次のようなコマンドでビルドした。 rustc -o hello_bin/hello_rust hello.rs このビルドでは、動的リンクする対象は、システム（Linux）に用意されているごく普通のライブラリのみだった。 $ ldd hello_rust linux-gate.so.1 => (0xb7752000) libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb76e7000) libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb76cc000) librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb76c2000) libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb76a4000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74fb000) /lib/ld-linux.so.2 (0xb7753000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb74cf000) 後で気づいたのだが、このビルド方法では、Rust本体にかかわるライブラリは静的リンクされ、実行ファイルに含まれている。 オプションとして prefer-dynamic を追加すると、Rustの言語本体のライブラリも動的リンクの対象となる。 rustc -C prefer-dynamic -o hello_bin/hello_rust hello.rs ldd(1)してみると、動的リンクの対象として libstd-4e7c5e5c.so が増えている。 $ ldd hello_rust linux-gate.so.1 => (0xb7721000) libstd-4e7c5e5c.so => /usr/local/rust/lib/libstd-4e7c5e5c.so (0xb735b000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb719e000) libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb7198000) libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb717d000) librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb7174000) libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb7156000) /lib/ld-linux.so.2 (0xb7722000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb712a000) $ _ prefer-dynamic の有無で実行ファイルの大きさを比較すると、こんな感じ。 prefer-dynamic 有無 not stripped stripped (strip -s) prefer-dynamic なし 553685 321648 prefer-dynamic あり 7593 5576 prefer-dynamic ありでnot strippedな状態での7,593 Byteという大きさは、gccで「動的リンク・最適化なし」でビルドしたC言語やC++の実行ファイルと同じくらいだ。