rootアクセス権を持たないシステムでglibcをアップグレードしようとしています。だからローカルプレフィックスにインストールしています。この機能の設定に関するベストプラクティスを理解し、特定の問題を解決するのに役立つ必要があります。 (私の問題の簡単な概要:lib pathに新しくインストールされたglibc libパスを含めると、LD_LIBRARY_PATH
ls、vim、pwdなどを含む実行しようとしているすべてのプログラムでsegfaultが発生します。)
背景情報:
$ uname -a
Linux 3.13.0-68-generic #111-Ubuntu SMP Fri Nov 6 18:17:06 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
コンパイラ/ツールチェーン:ローカルにコンパイルされ、gcc 5.3.0ソースからインストールされたバージョンを実行しています。とてもうまくいくようです。これは次の場所にインストールされます。~/toolchains/gcc_5.3.0
$ ls ~/toolchains/gcc_5.3.0
bin include lib lib32 lib64 libexec share
インストールしてみてください:glibc-2.23
ソースから--prefix=~/local/
このコンピュータにはsudoがありません(共有クラスタです。カスタム機能が必要な場合は、戦略は私のように独自のツールチェーンをインストールすることです)。
$ echo $LD_LIBRARY_PATH
~/toolchains/gcc_5.3.0/lib:~/toolchains/gcc_5.3.0/lib64
システムにインストールされているglibcのバージョンは2.19です。
$ ldd --version
ldd (Ubuntu EGLIBC 2.19-0ubuntu6.7) 2.19
(上と下では明確にするために上記の絶対パスを〜に置き換えました)
質問:
gcc 5.3.0 とシステムにインストールされている gcc 4.8.4 を使用して glibc-2.23 をコンパイルしてインストールできます。LD_LIBRARY_PATH
上記のように設定すると ~/local/ にコンパイルし、インストールすると正常に動作します。しかし、新しいglibcライブラリ(〜/ local / libにインストールされている)を利用するために、現在のライブラリの最後に〜/ local / libを追加しましたLD_LIBRARY_PATH
。
$ echo $LD_LIBRARY_PATH
~/toolchains/gcc_5.3.0/lib:~/toolchains/gcc_5.3.0/lib64:~/local/lib
これにより、セグフォルトを実行しようとしているすべてが失敗します。 lsやvimを実行することもできません。 bash 印刷「分割エラー」のみ表示されます。私のものを変えると、LD_LIBRARY_PATH
すべてが正常に戻ります。
何が起こっているのかを調べるためにgdbやstraceなどを実行することはできません(セグフォルトもあります)。
質問:
ここで何が起こっているのかというアイデアはありますか?
LD_LIBRARY_PATH
インストールおよび/または設定方法が間違っているようです。ローカルにインストールされたgccとローカルにインストールされたglibcのベストプラクティスは何ですか?バージョンをより慎重に一致させる必要がありますか?それぞれの最新の安定源を確保しました。今後私の知識では、gdbが機能しない場合にセグフォルトが発生する場所を正確に見つけるためにこの種のデバッグを実行する他の方法はありますか?
どんなアイデアもありがとうございます。
編集する: 私は通常、私のシステムに更新されたツールセットをインポートし、必要な開発ヘッダーやライブラリなどをインポートしようとします。たとえば、perf_events のいくつかの高度な機能を使用するには、libaudit などの他のものが必要です。もちろん、これにはldap、berkeley dbなどが必要です。最終的には、最新バージョンのglibcのみを提供するヘッダーが必要でした。たとえば、次はBerkeley dbをコンパイルしようとしたときに発生するエラーです。このタイプはglibcのヘッダーdirent.hで定義されているようですが、私のシステムにインストールされているパッケージにはありません。
-fPIC -DPIC -o .libs/os_dir.o
../src/os/os_dir.c: In function '__os_dirlist':
../src/os/os_dir.c:45:2: error: unknown type name 'DIR'
DIR *dirp;
^
私のシステムがデフォルトで見つけることができない開発ヘッダーとライブラリにアクセスする他の方法があるかどうかを知りたいです。上記のエラーはDIR
おそらく良い例です。
答え1
ld-linux-x86-64.so.2(man ld.so) と libc.so の間の不一致が原因で発生します。
LD_LIBRARY_PATH 設定で gdb を実行するには:
export LD_LIBRARY_PATH=~/local/lib
/lib64/ld-linux-x86-64.so.2 --library-path /lib64 /usr/bin/gdb /bin/ls
これにより、古いライブラリ環境では/usr/bin/gdbが実行され、新しいライブラリ環境では/bin/lsが実行されます。同様に、新しいライブラリ環境では、次のように1つのコマンドしか実行できません。
export LD_LIBRARY_PATH=~/local/lib
~/local/lib/ld-linux-x86-64.so.2 /bin/echo