Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 查找库函数在内存中的位置_C_Memory_Linker_Memory Mapped Files - Fatal编程技术网

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

C 查找库函数在内存中的位置,c,memory,linker,memory-mapped-files,C,Memory,Linker,Memory Mapped Files,假设我们有一个使用大型库的C应用程序。 我试图找到一种方法来知道库函数和符号位于什么内存地址。或者确切地告诉编译器/链接器在内存中的位置。方法是什么 编辑:这是一个嵌入式应用程序,所以我不能使用桌面编译器工具链 函数名,如数组,在使用时会衰减为指针。这意味着您可以: printf("%p", myFunction); 无论如何,在大多数系统上。要严格遵守标准,请检查函数名,如数组,在使用时会衰减为指针。这意味着您可以: printf("%p", myFunction); 无论如何,在大多数系

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


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

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

printf("%p", myFunction);

无论如何,在大多数系统上。要严格遵守标准,请检查函数名,如数组,在使用时会衰减为指针。这意味着您可以:

printf("%p", myFunction);

无论如何,在大多数系统上。要严格遵守标准,请查看有几种方法可以做到这一点。最简单的可能是使用调试器

使用GDB 使用
gdb
可以连接到正在运行的程序。例如,假设我想连接到正在运行的
vim
进程。首先我需要知道它的
PID
number:

$ 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 使用
gdb
可以连接到正在运行的程序。例如,假设我想连接到正在运行的
vim
进程。首先我需要知道它的
PID
number:

$ 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。嵌入式设备上的一个实例作为服务器,本地的一个实例作为客户端。(我倒过来说,我很少用这种方式)这里有一个维基参考如何做到这一点。谢谢我编辑了这个问题以便更清楚。这是一个嵌入式应用程序,我不能使用此方法。请确定您可以使用GDB。嵌入式设备上的一个实例作为服务器,本地的一个实例作为客户端。(我倒过来说,我很少用这种方式)这里有一个维基参考如何做到这一点。谢谢你,卡尔。请注意,这是一个嵌入式应用程序,我没有PC编译器/链接器工具链。我想知道/控制库函数在内存中的位置。哦,好像所有的东西都是静态链接的?只要让你的链接器输出一个映射文件。检查一下你的文档,谢谢Carl。请注意,这是一个嵌入式应用程序,我没有PC编译器/链接器工具链。我想知道/控制库函数在内存中的位置。哦,好像所有的东西都是静态链接的?只要让你的链接器输出一个映射文件。检查您的文档以了解这一点。您可以在可执行文件上运行一些工具以获得偏移量等。您可以在执行代码中说:int(pprinf)(const char)=printf;pprinf变量将包含printf函数的地址。在运行时知道函数的地址和在构建过程中指定函数的位置是完全不同的。我感觉你想要这个是因为一些功能上的原因,下面提到的gdb之类的东西不能满足你的需求,但是很难说。你能提供更多关于你需要什么的细节吗?你需要指定嵌入式平台,以及你用来构建它的工具链。您试图做的事情取决于平台、工具链、平台上的可执行文件格式以及一系列其他事情。也就是说,除了在具有分区内存层次结构的计算机上,控制库函数在内存中的位置几乎没有什么好处(代码大小相同,可能消耗相同的资源)。谢谢您的评论。假设我已将库图像下载到flash。我想要实现的是拥有应用程序将要使用的所有库函数和符号的内存地址。我的工具链是IAR8051,平台是基于8051的SoC。要下载的图像当然是二进制的。您可以在可执行文件上运行一些工具来获取偏移量,等等。在执行代码中,您可以这样说:int(pprinf)(const char)=printf;pprinf变量将包含printf函数的地址。在运行时知道函数的地址和在构建过程中指定函数的位置是完全不同的。我感觉你想要这个是因为一些功能上的原因,下面提到的gdb之类的东西不能满足你的需求,但是很难说。你能提供更多关于你需要什么的细节吗?你需要指定嵌入式平台,以及你用来构建它的工具链。您试图做的事情取决于平台、工具链、平台上的可执行文件格式以及一系列其他事情。也就是说,除了在具有分区内存层次结构的计算机上,控制库函数在内存中的位置几乎没有什么好处(代码大小相同,可能消耗相同的资源)。谢谢您的评论。假设我已将库图像下载到flash。我想要实现的是拥有应用程序将要使用的所有库函数和符号的内存地址。我的工具链是IAR8051,平台是基于8051的SoC。伊姆河