質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

0回答

3079閲覧

共有ライブラリのバージョン問題

kataksk

総合スコア13

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

1グッド

2クリップ

投稿2019/01/25 11:07

あるツールを使うときの共有ライブラリのバージョンがシステムに組み込まれているのに、見つからないと怒られて困っています。

そのツールは、使う際に以下のエラーを吐き出して中止してしまします。

ツール名: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ツール名) ツール名: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ツール名)

そこでlddでツールの共有ライブラリへの依存関係を調べてみたら、以下の通りです。

$ ldd ツール名 linux-vdso.so.1 => (0x00007ffe33bcd000) libz.so.1 => /lib64/libz.so.1 (0x00002b71aefbf000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b71af1d5000) libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00002b71af3f2000) libm.so.6 => /lib64/libm.so.6 (0x00002b71af6fa000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002b71af9fc000) libc.so.6 => /lib64/libc.so.6 (0x00002b71afc13000) /lib64/ld-linux-x86-64.so.2 (0x000055c9a6258000)

とりあえず、libc.so.6とlibstdc++.so.6はありました。

次に、libc.so.6とlibstdc++.so.6には、GLIBC_2.14とGLIBCXX_3.4.15が組み込まれているか調べました。

$ strings /lib64/libc.so.6 | grep GLIBC_2.14 GLIBC_2.14 memcpy@@GLIBC_2.14 GLIBC_2.14
$ strings /lib64/libstdc++.so.6 | grep GLIBCXX_3.4.15 GLIBCXX_3.4.15

以上のように、libc.so.6とlibstdc++.so.6には、GLIBC_2.14とGLIBCXX_3.4.15が組み込まれていました。

詳細は書ききれませんが、grep GLIBCやgrep GLIBCXXなどとバージョンの詳細を書かずに検索すると、GLIBC_2.xx(xx=15, 16, 17など)やGLIBCXX_3.4.xx(xx=16, 17など)などと他のバージョンも多く出てきました。

ちなみに、libc.so.6とlibstdc++.so.6の実体は何だろうと調べました。

$ ls -l /lib64/libc.so.6 lrwxrwxrwx. 1 root root 12 1月 24 2018 /lib64/libc.so.6 -> libc-2.17.so
$ ls -la /usr/lib64/libstdc++.so.6 lrwxrwxrwx. 1 root root 19 1月 24 2018 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.19

このように、libc.so.6とlibstdc++.so.6は以下のように紐づけられていました。

libc.so.6 -> libc-2.17.so libstdc++.so.6 -> libstdc++.so.6.0.19

もちろん、libc-2.17.soやlibstdc++.so.6.0.19には、GLIBC_2.14とGLIBCXX_3.4.15が組み込まれていました。

ここまでやったのですが、ツールが要求するGLIBC_2.14とGLIBCXX_3.4.15をどう呼び込めば良いのかわかりません。

推測では、システムがとあるバージョンの使用を優先的に促していて、そのバージョンがツールが要求するバージョンと異なるのではないかと考えています。

当方、かなり初心者ですのでやさしくご教授いただければ幸いでございます。

何卒宜しくお願い申し上げます。

set0gut1👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stan_Dma

2019/01/25 12:41

What will be output when you type "ldd --version"?
kataksk

2019/01/25 14:24 編集

It was as follows: $ ldd --version ldd (GNU libc) 2.17 Copyright (C) 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 作者 Roland McGrath および Ulrich Drepper。
wwbQzhMkhhgEmhU

2019/01/25 15:54

以下はどうでしょう? echo $LD_LIBRARY_PATH cat /etc/ld.so.conf
kataksk

2019/01/25 16:16

$ echo $LD_LIBRARY_PATH $ cat /etc/ld.so.conf include ld.so.conf.d/*.conf 以上のようになりました。 "echo $LD_LIBRARY_PATH"に関しては何も出力されていません。
wwbQzhMkhhgEmhU

2019/01/25 16:31

特殊なdistributionですか? うちのUbuntu 18.10は include /etc/ld.so.conf.d/*.conf でした。すみませんが、確認をお願いします。
wwbQzhMkhhgEmhU

2019/01/26 08:24

そろそろ忘れそうなので、次に聞こうと思った懸念点だけ書いておきます。 prelinkです。
kataksk

2019/01/26 09:00

返信が遅くなり申し訳ございません。 ディストリビューションに関しては、CentOS Linux release 7.4.1708 (Core) でした。 prelinkに関してですが、コマンドでprelinkと打ってもコマンドが見つかりませんでした。となりました。 ちなみにhttps://qiita.com/ymko/items/41d5c0f542fa163a0c65を参考に、/etc/cron.daily/の中身を確認したら、以下のようでした。。。 $ ls -l 合計 24 -rwxr-xr-x. 1 root root 332 8月 6 2017 0yum-daily.cron -rwxr-xr-x. 1 root root 2239 6月 10 2014 certwatch -rwx------. 1 root root 219 8月 2 2017 logrotate -rwxr-xr-x. 1 root root 618 3月 18 2014 man-db.cron -rwx------. 1 root root 208 11月 5 2016 mlocate -rwxr-xr-x. 1 root root 744 11月 7 2016 snapper
wwbQzhMkhhgEmhU

2019/01/26 09:06

CentOSって確かなくなったんですよね。7くらいから。 ただprelinkの話の前に、/etc/ld.so.confの内容に/etc/が本当にないのかどうかを確認してもらえますか? なくていいのか、ないといけないのか、それとも書き間違いなのか。
kataksk

2019/01/26 09:19 編集

返信いただきありがとうございます。 $ cat /etc/ld.so.conf include ld.so.conf.d/*.conf やっぱり、上記のようなのが返ってくるだけですね。 /etc/は付いていません。 もし質問の意味を履き違えていたらご指摘いただけると幸いです。
wwbQzhMkhhgEmhU

2019/01/26 10:36

ごめんなさい。全然現象を読み違えていました。 CやC++の標準ライブラリ+αのバージョンが違っててリンクできないって話だったんですね。 ようは古いのがないとダメと。詳しくないので調べないと分かりません。頓珍漢なことを聞いていてすみません。ってわけで調べます。今日中は無理かも。
wwbQzhMkhhgEmhU

2019/01/26 13:08

結論から先に。glibcの2.14とglibcxxの3.4.15が必要です。パッケージ管理さえきちんとされていれば大丈夫なのでしょうが、何らかの理由で静的にリンクされてもおらず、共有ライブラリ自体もセットになっていない場合は、ビルドし直すのが正攻法かと思います。無理であれば依存するバージョンのライブラリのバイナリを持ってきて、LD_LIBRARY_PATHなどで逃げるかしかないと思います。 なおstringsでバージョンが出てきているのは、関数のシンボルにバージョンがついていて、その関数の実装に変更をした最後のglibcのバージョンがついているからです。 例えば、memcpy@@GLIBC_2.14みたいなシンボルがありますが、これはmemcpyを最後にいじったのが2.14だったってだけです。glibc自体のバージョンは2.17です。 2.15以降で変更のあった関数を「あるツール」とやらが使用していなければそのまま使えるのでしょうが、変更のある関数があったために、エラーになったということのようです。
kataksk

2019/01/30 04:11

ありがとうございます。 あれから色々と格闘し、おっしゃる通りビルドし直し、何とか動かすことができそうです。 ご教授いただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問