奇妙なLD_PRELOADエラーとインクルードファイルがありません - ディストリビューションが破損していますか?

奇妙なLD_PRELOADエラーとインクルードファイルがありません - ディストリビューションが破損していますか?

過去半日の間、少なくとも次の問題が発生しました。

  1. LD_PRELOAD私のインクルードのLD_PRELOADエントリが見つからないというエラーが発生します/lib64/libstdc++.so.6が(これが意味があるかどうかはわかりません)、ファイルが見つからないため、何でも実行するたびに次のような結果が得られます。

    ERROR: ld.so: object '/lib64/libstdc++.so.6' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
    

そのため、LD_PRELOADを見てみると、存在しない/lib64/libstdc++.so.6が含まれていることがわかりました。

  1. CMakeを使用してプロジェクトをビルドしようとすると、次のエラーで構成が失敗します。

    In file included from /usr/include/pthread.h:23:0,
                 from /home/eyalroz/src/mine/cuda-api-wrappers/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:
    /usr/include/sched.h:28:20: fatal error: stddef.h: No such file or directory
    

しかし、私はstdddef.hすでに安全です/usr/include/linux/stddef.h

私はGNU / Linux Mint 18.3を使用しており、最近私のシステムに奇妙なことをしたことがありません(まあ、とにかく覚えていません)。

答え1

何が起こっていますか?私はソースからこのプログラムを作成しています。賢明な管理者は次のように決めました。

  1. 誰もが自分とまったく同じシステムとOS構成で動作します。
  2. $HOME/.bashrcビルドスクリプトで想定できるように、すべての設定を設定に入れる必要があります。

これにより、私は.bashrcあちこちでexport CC、、、、そしてexport CXXもっと知りました。これは仕事を台無しにします。export C_INCLUDE_PATHLD_PRELOAD

レッスン:常に、、、、、~/.profileに奇妙な新しいアイテムがあること~/.shrcを確認してください。~/.bashrc~/.bash_profile~/.login~/.bash_login

答え2

標準設定がLD_PRELOAD使用されると、本当に悪い考えです。これは、実行しているすべてのソフトウェアの動作に影響を与える可能性があるためです。

目的の用途LD_PRELOADは主にデバッグです。セカンダリユースケースでは、プライマリ実装をmalloc()使用に適した他の実装に置き換えることができます。

LD_PRELOADデバッグの例を見てみましょう。コアダンプを開始するプログラムがあり、これがNULLポインタの逆参照の結果である可能性があると思うとします。この場合、次のように電話できます。

[email protected] program

これがもはやコアをダンプしない場合、NULLポインタの逆参照が発生します。

注:予測可能なビルドが好きな場合は、ビルド環境は次のようになります。

# clear environment variables we know to be bad for the build 
unset LD_OPTIONS 
unset LD_AUDIT          LD_AUDIT_32             LD_AUDIT_64 
unset LD_BIND_NOW       LD_BIND_NOW_32          LD_BIND_NOW_64 
unset LD_BREADTH        LD_BREADTH_32           LD_BREADTH_64 
unset LD_CONFIG         LD_CONFIG_32            LD_CONFIG_64 
unset LD_DEBUG          LD_DEBUG_32             LD_DEBUG_64 
unset LD_DEMANGLE       LD_DEMANGLE_32          LD_DEMANGLE_64 
unset LD_FLAGS          LD_FLAGS_32             LD_FLAGS_64 
unset LD_LIBRARY_PATH   LD_LIBRARY_PATH_32      LD_LIBRARY_PATH_64 
unset LD_LOADFLTR       LD_LOADFLTR_32          LD_LOADFLTR_64 
unset LD_NOAUDIT        LD_NOAUDIT_32           LD_NOAUDIT_64 
unset LD_NOAUXFLTR      LD_NOAUXFLTR_32         LD_NOAUXFLTR_64 
unset LD_NOCONFIG       LD_NOCONFIG_32          LD_NOCONFIG_64 
unset LD_NODIRCONFIG    LD_NODIRCONFIG_32       LD_NODIRCONFIG_64 
unset LD_NODIRECT       LD_NODIRECT_32          LD_NODIRECT_64 
unset LD_NOLAZYLOAD     LD_NOLAZYLOAD_32        LD_NOLAZYLOAD_64 
unset LD_NOOBJALTER     LD_NOOBJALTER_32        LD_NOOBJALTER_64 
unset LD_NOVERSION      LD_NOVERSION_32         LD_NOVERSION_64 
unset LD_ORIGIN         LD_ORIGIN_32            LD_ORIGIN_64 
unset LD_PRELOAD        LD_PRELOAD_32           LD_PRELOAD_64 
unset LD_PROFILE        LD_PROFILE_32           LD_PROFILE_64 

# 
# force locale to C
unset LC_ALL
LC_COLLATE=C;   export LC_COLLATE 
LC_CTYPE=C;     export LC_CTYPE 
LC_MESSAGES=C;  export LC_MESSAGES 
LC_MONETARY=C;  export LC_MONETARY 
LC_NUMERIC=C;   export LC_NUMERIC 
LC_TIME=C;      export LC_TIME 

自動ビルドを制御するスクリプトまたはmakefile(makefile内で環境変数の管理をサポートするmake実装を使用する場合)。ユーザーエクスペリエンスの編集は次のようになります。悪い奴の行動

関連情報