在过去的半天左右的时间里,我至少遇到了以下问题:
我收到有关缺少 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 - 它不存在。
尝试使用 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
发生的事情是这样的:我正在从源代码构建这个程序。聪明的维护者决定:
- 每个人都在与他们完全相同的机器和操作系统配置上运行
- 他们需要将所有设置放入您的设置中,
$HOME/.bashrc
以便他们可以在构建脚本中做出假设。
这让我.bashrc
到处都是export CC
、export CXX
、export C_INCLUDE_PATH
和LD_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 实现)。编辑用户环境可以被视为坏人的行为。