C++コンパイラとlibgcc_c.so、libstdc++.so

ビルドオプションのひとつであるCXXを何も指定しない場合、環境にも依ると思いますが、コンパイラにより生成されるmysqldバイナリが、libgcc_c.so、libstdc++.soにリンクする場合があります。CXXはC++コンパイラを指定するためのフラグです。

例えばこんな感じでビルドすると、、、

./configure --prefix=/usr/local/mysql && make && sudo make install

こんな感じでdynamic linkします。

mir@oss-amd:~/test/mysql-5.0.42/mysql-5.0.42-linux-x86_64/bin$ ldd mysqld
librt.so.1 => /lib64/tls/librt.so.1 (0x0000003d97f00000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003d94a00000)
libpthread.so.0 => /lib64/tls/libpthread.so.0 (0x0000003d94e00000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x0000003d96800000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x0000003d96000000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003d95600000)
libm.so.6 => /lib64/tls/libm.so.6 (0x0000003d94800000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003d95a00000)
libc.so.6 => /lib64/tls/libc.so.6 (0x0000003d94500000)
/lib64/ld-linux-x86-64.so.2 (0x0000003d94300000)

この場合、libstdc++.soとかlibgcc_c.soとかを入れていない環境だと、mysqldが起動できないことになります。他のライブラリは大抵の環境には最初から入っているので大丈夫(かも)。

これは、mysql.infoによると、C++コンパイラにデフォルトではg++が使用されてたことが原因のようです。

* If you are using `gcc' and don't have `libg++' or `libstdc++'
installed, you can tell `configure' to use `gcc' as your C++
compiler:

shell> CC=gcc CXX=gcc ./configure

When you use `gcc' as your C++ compiler, it does not attempt to
link in `libg++' or `libstdc++'. This may be a good thing to do
even if you have those libraries installed. Some versions of them
have caused strange problems for MySQL users in the past.

そこで以下のようにCXXを指定して(気分的についでにCCも)ビルドしてみます。

CC=gcc CXX=gcc ./configure --prefix=/usr/local/mysql && make && sudo make install

すると、以下のようにlibgcc_c.soおよびlibstdc++.soにはリンクしないようになります。

mir@oss-amd:~/test/mysql-5.0.42/mysql-5.0.42-linux-x86_64/bin$ ldd mysqld
librt.so.1 => /lib64/tls/librt.so.1 (0x0000003d97f00000)
libz.so.1 => /usr/lib64/libz.so.1 (0x0000003d94c00000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003d94a00000)
libpthread.so.0 => /lib64/tls/libpthread.so.0 (0x0000003d94e00000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x0000003d96800000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x0000003d96000000)
libm.so.6 => /lib64/tls/libm.so.6 (0x0000003d94800000)
libc.so.6 => /lib64/tls/libc.so.6 (0x0000003d94500000)
/lib64/ld-linux-x86-64.so.2 (0x0000003d94300000)