【问题标题】:Find where library functions sit in memory查找库函数在内存中的位置
【发布时间】:2015-04-05 22:35:22
【问题描述】:

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

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

【问题讨论】:

  • 您可以在可执行文件上运行一些工具以获取偏移量等。您可以在执行代码中说: int (pprinf)(const char) =打印; prinf 变量将包含 printf 函数的地址。
  • 在运行时知道函数的地址和在构建过程中指示它的位置是完全不同的。我觉得您出于某些功能原因想要这个,下面提到的 gdb 之类的东西不能满足您的需求,但很难说。您能否详细说明您的需求?
  • 您将需要指定嵌入式平台,以及您用于构建它的工具链。您尝试做的事情取决于平台、工具链、平台上的可执行文件格式以及其他一些东西。也就是说,除了在具有分区内存层次结构的机器上,控制库函数在内存中的位置(代码大小相同,并且可能消耗相同的资源)几乎没有什么好处。
  • 感谢您的 cmets。假设我已将库图像下载到闪存。我想要实现的是拥有应用程序将要使用的所有库函数和符号的内存地址。我的工具链是 IAR8051,平台是基于 8051 的 SoC。将要下载的图像当然是二进制的。

标签: c memory linker memory-mapped-files


【解决方案1】:

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

printf("%p", myFunction);

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

【讨论】:

  • 谢谢卡尔。请注意,这是一个嵌入式应用程序,我没有 PC 编译器/链接器工具链。我想知道/控制库函数在内存中的位置。
  • 哦,好像一切都是静态链接的?只需让您的链接器输出一个映射文件。检查您的文档。
【解决方案2】:

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

使用 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

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

【讨论】:

  • 谢谢。我编辑问题更清楚。这是一个嵌入式应用程序,我不能使用这种方法。
  • 确定你可以使用 GDB。嵌入式设备上的一个实例作为服务器,一个本地实例作为客户端。 (我是不是把它弄反了,我很少用这种方式)这是一个关于如何做的wiki参考。 en.wikipedia.org/wiki/GNU_Debugger>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多