kiyoka.2012_09_12 RSSPLAIN

Related pages: !kiyoka.blog.list !kiyoka.blog.2012_09
555555555555555555555555555555555555555555555555555555555555555555555
5

[Linux] static linkしたアプリケーション配布の時代は終わったのだろうか

5

LinuxにはたくさんのDistributionがある。

5

昔は配布するビルド済みバイナリを1種類にしたい場合はglibcをstatic linkしたバイナリを配布するのが一般的だったように思う。

5

2005年くらいのMySQLはstaticバイナリを配布していて、rpm以外のディストリビューションの場合はそれを選べた。(Debianとか)

5

最近ではMySQLはrpmパッケージしか配布していない。

5

 

5

JDK

5

JDKはどうかと調べてみたら、JDK-1.7.0_05にはtar.gz版バイナリも置いてあったので中身を調べてみた。

5

 

5
 [64bit版のJDK-7u7]
5
 $ tar zxf jdk-7u7-linux-x64.tar.gz
5
 $ cd jdk1.7.0_07/bin
5
 $ ldd java
5
        linux-vdso.so.1 =>  (0x00007fff4cdff000)
5
        libpthread.so.0 => /lib/libpthread.so.0 (0x00007fd4cc205000)
5
        libjli.so => /home/kiyoka/Dropbox/temp/jdk1.7.0_07/bin/./../jre/lib/amd64/jli/libjli.so (0x00007fd4cbfee000)
5
        libdl.so.2 => /lib/libdl.so.2 (0x00007fd4cbdea000)
5
        libc.so.6 => /lib/libc.so.6 (0x00007fd4cba88000)
5
        /lib64/ld-linux-x86-64.so.2 (0x00007fd4cc431000)
5
 $ ldd javac
5
        linux-vdso.so.1 =>  (0x00007fff7e3ff000)
5
        libpthread.so.0 => /lib/libpthread.so.0 (0x00007f413512c000)
5
        libjli.so => /home/kiyoka/Dropbox/temp/jdk1.7.0_07/bin/./../jre/lib/amd64/jli/libjli.so (0x00007f4134f15000)
5
        libdl.so.2 => /lib/libdl.so.2 (0x00007f4134d11000)
5
        libc.so.6 => /lib/libc.so.6 (0x00007f41349af000)
5
        /lib64/ld-linux-x86-64.so.2 (0x00007f4135358000)
5

 

5

ネットの情報をあさってみたが、最近のglibcはもうstaticリンクできないようだ。

5

JDKもglibcのstaticリンクはあきらめているようだが、これで、どのDistributionでも動くのかなぁ。なんか不安だなあ。

5

 

5

Rubyは?

5

さて、自分が作りたい全方位Distribution対応Rubyバイナリはどうすれば作れるか。

5

Debian squeeze(64bit環境)でオプション無しのconfigureで ruby-1.9.3-p194 をビルドすると次のようになる。

5
 (1) [./configure 版]
5
 $ ldd ./ruby-1.9.3-p194/bin/ruby
5
        linux-vdso.so.1 =>  (0x00007fffc25ff000)
5
        libpthread.so.0 => /lib/libpthread.so.0 (0x00007fc720431000)
5
        librt.so.1 => /lib/librt.so.1 (0x00007fc720228000)
5
        libdl.so.2 => /lib/libdl.so.2 (0x00007fc720024000)
5
        libcrypt.so.1 => /lib/libcrypt.so.1 (0x00007fc71fded000)
5
        libm.so.6 => /lib/libm.so.6 (0x00007fc71fb6a000)
5
        libc.so.6 => /lib/libc.so.6 (0x00007fc71f808000)
5
        /lib64/ld-linux-x86-64.so.2 (0x00007fc72065d000)
5

 

5
 (2) [./configure --with-static-linked-ext --disable-shared]
5
 かつ、ext/Setupを次のように変更したバージョン
5

これは、拡張ライブラリがruby本体にスタティックリンクされるオプションのようだが…

5

 

5
 $ ldd ruby
5
        linux-vdso.so.1 =>  (0x00007fff554f3000)
5
        libpthread.so.0 => /lib/libpthread.so.0 (0x00007fdf7e270000)
5
        librt.so.1 => /lib/librt.so.1 (0x00007fdf7e067000)
5
        libdl.so.2 => /lib/libdl.so.2 (0x00007fdf7de63000)
5
        libcrypt.so.1 => /lib/libcrypt.so.1 (0x00007fdf7dc2c000)
5
        libm.so.6 => /lib/libm.so.6 (0x00007fdf7d9a9000)
5
        libc.so.6 => /lib/libc.so.6 (0x00007fdf7d647000)
5
        /lib64/ld-linux-x86-64.so.2 (0x00007fdf7e49c000)
5

 

5

あれ? 結局glibc部分はshared objectにリンクされるのはかわないのか…

5

というわけで、staticリンクはあきらめた。

5

 

5

解決策

5

要は、ユーザーのLinuxシステムがどのようなミニマム構成であっても自分のプログラムが動いてほしいということなのだ。opensslとかgdbmとかを使いたい。

5

実は、必要な *.so を自分でビルドしいっしょに配布すればよいのだった。

5

そして起動スクリプトで、LD_LIBRARY_PATHの先頭に、パスを追加すればよいだけだ。

5

 

5

うっかり深入りする前に気がついてよかった…

5

 

5

...comment disabled...