LD_PRELOAD导致linux命令的分段错误

时间:2014-03-05 11:13:39

标签: c++ c linux

我有一个.so文件,用于查找内存泄漏。我在会话中设置LD_PRELOAD env变量,我想在其中执行目标二进制文件。 export LD_PRELOAD=./memleakfinder.so 但是一旦设置了这个环境变量,即使像lsps之类的简单linux命令也会导致Segmentation fault (core dumped)。为什么会发生这种情况?我已经重载了malloc()calloc()realloc()free()newnew[]等版本.so文件。 CentOS6的自动错误报告工具说: source:coreutils Problem:process /bin/ls was killed by signal 11(SIGSEGV)。很明显,库注入导致了这里的问题。我怎么能避免它?

2 个答案:

答案 0 :(得分:0)

不是导出环境变量,而是将变量添加到要运行/调试的命令中。

例如:

LD_PRELOAD=./memleakfinder.so a.out

只有在调用a.out而不是当前shell中的所有命令时才会加载库。

如果没有看到某些代码,我们无法帮助您确定分段错误的原因。

答案 1 :(得分:0)

尝试覆盖malloc函数时,我遇到了同样的问题。

对我来说,我在函数printf()的声明中使用了malloc()(以查看其是否有效)。

当我改用write()printf()时,它起作用了。这是因为某些库函数(例如printf)可能会为其操作分配内存。因此,如果您在库中使用这些功能中的任何一个,则可能会陷入无限递归的风险。