我们将在哪个内存段中找到函数的内存地址

问题描述 投票:0回答:1

函数指针指向C中函数的地址。这意味着一个函数具有一个存储器地址,它将成为任何存储器段的一部分。我只打印了函数的地址,并指向代码段。用C编写的所有函数的地址都在代码段中吗?

#include <stdio.h>

void func()
{
        printf("hi!!!\n");
}

int main()
{
        void (*fptr)();
        fptr = func;
        printf("fptr pointing func addr : %p and &fptr : %p\n", fptr, &fptr);
        fptr();
        while (1) {
                sleep(1); /* Sleep for accessing procfs of the process */
        }
        return 0;
}

程序输出:

[revarath@bgl-vms-vm0251 basic]$ ./a.out &
[1] 20168
[revarath@bgl-vms-vm0251 basic]$ fptr pointing func addr : 0x4005ad and &fptr : 0x7fff301e6b80
hi!!!
c = 10

查找PID以访问procfs:

[revarath@bgl-vms-vm0251 basic]$ ps -ef | grep a.out
revarath 20168 24339  0 04:55 pts/2    00:00:00 ./a.out
revarath 20180 24339  0 04:56 pts/2    00:00:00 grep --color=auto a.out

内存映射输出:

[revarath@bgl-vms-vm0251 basic]$ cat /proc/20168/maps
00400000-00401000 r-xp 00000000 00:2c 124964755                          /ws/revarath-bgl/backup/tests/basic/a.out
00600000-00601000 r--p 00000000 00:2c 124964755                          /ws/revarath-bgl/backup/tests/basic/a.out
00601000-00602000 rw-p 00001000 00:2c 124964755                          /ws/revarath-bgl/backup/tests/basic/a.out
.......
7fff301c8000-7fff301e9000 rw-p 00000000 00:00 0                          [stack]

My func addr:0x4005ad位于内存区域00400000-00401000

说函数的内存地址在或指向代码段的位置正确吗?

c function function-pointers memory-segmentation
1个回答
1
投票

这里还有更多关于语言的法律答案(例如,不要依赖代码中的系统实现,但是基本上,是的,这就是它的工作原理。

程序中的所有已编译代码,包括您说明的功能,都是所得二进制图像中代码(也称为“文本”)段的一部分。操作系统的加载程序会将所有已编译的代码字节吐到进程内的该内存段中,如果您以这种方式获取静态函数的地址,则会看到其相应的代码位于该段中的某个位置。 main等也是如此。


已编译程序进入内存并被执行的方式比看上去的少很多魔力。抛开现代操作系统的安全机制等,它有点像这样:

  1. 工具链将您的C代码转换为可执行字节。每个编译函数必然从该字节流的某个特定偏移量开始。
  2. “图像”(可执行文件)在其中包含不同的段:代码段,只读数据段和/或带有初始化数据的变量集,“段”指示一些初始为零的值,需要出现在程序启动时,但不必显式包含在映像中,等等。分离这些部分非常有用,以便加载程序可以对结果部分进行不同的处理,例如将代码段标记为“可执行”,而不是“可写”等]
  3. OS中的“加载程序”将图像文件拆开,然后将不同部分解压缩到内存中,修补静态引用,然后将控制跳到main函数的第一个字节(通过对您隐藏的C运行时方法)。
  4. 当您获得函数的地址时,就没有魔法了,它是指向该函数已编译指令的第一个字节的指针。

© www.soinside.com 2019 - 2024. All rights reserved.