查找库函数在内存中的位置

时间:2015-02-05 21:47:12

标签: c memory linker memory-mapped-files

假设我们有一个使用大型库的C应用程序。 我试图找到一种方法来了解内存库函数和符号的位置。或者准确地说出编译器/链接器将它们放在内存中的位置。方法是什么?

编辑:这是一个嵌入式应用程序,所以我不能使用桌面编译器工具链。

2 个答案:

答案 0 :(得分:3)

函数名称(如数组)在使用时会衰减为指针。这意味着你可以:

printf("%p", myFunction);

无论如何,在大多数系统上。要严格遵守标准,请查看How to format a function pointer?

答案 1 :(得分:3)

有几种方法可以解决这个问题。最简单的可能是使用调试器。

使用GDB

使用gdb,您可以连接到正在运行的程序。比方说,我想连接到正在运行的vim进程。首先,我需要知道PID号:

$ pidof vim
15425

我现在可以使用gdb

连接到该流程
$ gdb `which vim` 15425

在提示符下,我现在可以查询不同的符号:

$ info symbol fprintf
fprintf in section .text of /lib/x86_64-linux-gnu/libc.so.6
$ info address fprintf
Symbol "fprintf" is at 0x7fc9b44314a0 in a file compiled without debugging.

使用/ proc

另一种从/proc转储库内存位置的方法。

同样,您需要PID(参见上文),您可以将库及其位置转储到流程的虚拟内存中。

$ cat /proc/15425/maps
7fc9a9427000-7fc9a9432000 r-xp 00000000 fd:02 539295973                  /lib/x86_64-linux-gnu/libnss_files-2.19.so
7fc9a9432000-7fc9a9631000 ---p 0000b000 fd:02 539295973                  /lib/x86_64-linux-gnu/libnss_files-2.19.so
7fc9a9631000-7fc9a9632000 r--p 0000a000 fd:02 539295973                  /lib/x86_64-linux-gnu/libnss_files-2.19.so
7fc9a9632000-7fc9a9633000 rw-p 0000b000 fd:02 539295973                  /lib/x86_64-linux-gnu/libnss_files-2.19.so

每个库都有多个部分,这取决于它是如何编译/链接的。