相关疑难解决方法(0)

为什么LD_PRELOAD不适用于其中一个加载的共享库?

我在RedHat Linux 5.0提供功能的内部共享库free和malloc:

>nm ./libmem_consumption.so | grep -P -e "\bfree\b|\bmalloc\b"
0000000000006540 T free
00000000000088a0 T malloc
Run Code Online (Sandbox Code Playgroud)

此共享库负责提供有关进程内存消耗的信息.不幸的是,当它与Apache一起使用时,这个共享库存在问题httpd.当使用这个库运行Apache httpd时,我得到一个coredump in libc::free和一条指针无效的消息.问题似乎是在http.so中,这是一个由libphp5.so加载的共享库,由httpd.

实际上,当我没有加载http.so一切都没关系,没有coredump.(加载或不加载http.so由配置文件中的指令管理:extension = http.so)当我加载http.sohttpd进程coredumps时.

httpd 以这种方式推出:

LD_PRELOAD=./libmem_consumption.so ./bin/httpd -f config
Run Code Online (Sandbox Code Playgroud)

和退出时的coredumps.

当我设置LD_BIND_NOW = 1并http.so加载时,我看到(在gdb下)http.so已free@plt指向libc::free并在其他已加载的库(例如libphp5.so)中free@plt指向libmem_consumption.so::free.怎么可能呢?

顺便说一句,当我导出LD_DEBUG = all并将输出保存到文件时,我看到这些行为libphp5.so(也加载了):

 25788: symbol=free;  lookup in file=/apache2/bin/httpd [0]
 25788: symbol=free;  lookup in file=/apache2/ps/lib/libmem_consumption.so [0]
 25788: binding file /apache2/modules/libphp5.so [0] …
Run Code Online (Sandbox Code Playgroud)

c++ linux coredump apache2 shared-libraries

4
推荐指数
1
解决办法
2671
查看次数

标签 统计

apache2 ×1

c++ ×1

coredump ×1

linux ×1

shared-libraries ×1