没有简单的方法可以做到这一点,但这种方法可能会满足您的需求。
我编写了 3 个小型应用程序,因此您可以按照我的说明进行操作。它们是:
-
app:将在您的系统上运行的二进制文件。从 libmiddleman.so 调用一个函数,尝试通过 malloc() 分配一些内存
源代码:gcc app.c -o app -L. -lmiddle_man
//File: app.c
#include "libmiddle_man.h"
#include <stdio.h>
int main()
{
do_something();
return 0;
}
-
libmiddle_man.so:导出一个简单调用 malloc() 的函数
源代码:gcc libmiddle_man.c -o libmiddle_man.so -shared
//File: libmiddle_man.c
void do_something()
{
int* tmp = malloc(sizeof(int));
}
还有:
//File: libmiddle_man.h
void do_something();
-
libfake_malloc.so:实现并导出我们的 malloc() 版本,在终端上打印一些东西
源代码:gcc lbfake_malloc.c -o libfake_malloc.so -shared
//File: libfake_malloc.c
#include <stdio.h>
#include <unistd.h>
void* malloc(size_t size)
{
printf("fake malloc()\n");
printf("Process ID: %d\n", getpid());
while(1)
{
}
return NULL;
}
当您使用LD_PRELOAD=libfake_malloc.so ./app 执行应用程序时,它将输出以下内容:
fake malloc()
Process ID: 14230 (the PID will be different each time you run the application)
并且应用程序将挂在那里,因为我们需要它。我们将检查进程内存映射并确保 app 都加载了我们的两个库。
所以暂时把它放在那里,然后打开另一个终端。当您在进程列表中搜索此 PID 时,它将显示哪个应用程序正在使用 libfake_malloc.so。这不是我们的目标,但这是一个有趣的信息。
ps -aux | grep 14230
输出:
karl 14230 97.3 0.0 1648 396 pts/9 R+ 13:57 10:20 ./app
请记住将 14230 更改为应用程序返回给您的任何号码。接下来,我们将检查进程内存并验证两个 out 库都已加载。
cat /proc/14230/maps
显示:
00110000-00263000 r-xp 00000000 08:06 2158492 /lib/tls/i686/cmov/libc-2.11.1.so
00263000-00264000 ---p 00153000 08:06 2158492 /lib/tls/i686/cmov/libc-2.11.1.so
00264000-00266000 r--p 00153000 08:06 2158492 /lib/tls/i686/cmov/libc-2.11.1.so
00266000-00267000 rw-p 00155000 08:06 2158492 /lib/tls/i686/cmov/libc-2.11.1.so
00267000-0026a000 rw-p 00000000 00:00 0
00584000-00585000 r-xp 00000000 08:07 2921104 /home/karl/workspace/shared_libs/who_called_my_shared/libmiddle_man.so
00585000-00586000 r--p 00000000 08:07 2921104 /home/karl/workspace/shared_libs/who_called_my_shared/libmiddle_man.so
00586000-00587000 rw-p 00001000 08:07 2921104 /home/karl/workspace/shared_libs/who_called_my_shared/libmiddle_man.so
00605000-00606000 r-xp 00000000 08:07 2921103 /home/karl/workspace/shared_libs/who_called_my_shared/libfake_malloc.so
00606000-00607000 r--p 00000000 08:07 2921103 /home/karl/workspace/shared_libs/who_called_my_shared/libfake_malloc.so
00607000-00608000 rw-p 00001000 08:07 2921103 /home/karl/workspace/shared_libs/who_called_my_shared/libfake_malloc.so
007e6000-007e7000 r-xp 00000000 00:00 0 [vdso]
0096a000-00985000 r-xp 00000000 08:06 2142529 /lib/ld-2.11.1.so
00985000-00986000 r--p 0001a000 08:06 2142529 /lib/ld-2.11.1.so
00986000-00987000 rw-p 0001b000 08:06 2142529 /lib/ld-2.11.1.so
08048000-08049000 r-xp 00000000 08:07 2921106 /home/karl/workspace/shared_libs/who_called_my_shared/app
08049000-0804a000 r--p 00000000 08:07 2921106 /home/karl/workspace/shared_libs/who_called_my_shared/app
0804a000-0804b000 rw-p 00001000 08:07 2921106 /home/karl/workspace/shared_libs/who_called_my_shared/app
b77b0000-b77b2000 rw-p 00000000 00:00 0
b77c9000-b77cc000 rw-p 00000000 00:00 0
bfb69000-bfb7e000 rw-p 00000000 00:00 0 [stack]
你会注意到 libfake_malloc.so 的 inode 是 2921103 而加载它的库(即 libmiddle_man.so)的 inode 实际上是 2921103+1,即 2921104。
我有机会在几台机器和一些也运行 Linux 的嵌入式设备上对此进行了测试。总而言之,通过解析 /proc/pid/maps 上的可用信息,似乎可以发现哪个库加载了您的库。