出现奇怪的 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. 每个人都在与他们完全相同的机器和操作系统配置上运行
  2. 他们需要将所有设置放入您的设置中,$HOME/.bashrc以便他们可以在构建脚本中做出假设。

这让我.bashrc到处都是export CCexport CXXexport 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 实现)。编辑用户环境可以被视为坏人的行为

相关内容