gpt4 book ai didi

c - 已编译二进制文件中的预初始化函数指针?

转载 作者:太空宇宙 更新时间:2023-11-04 04:17:52 28 4
gpt4 key购买 nike

我目前正在尝试理解 clang 编译器将一些简单的 C 代码转换为汇编的过程。但是,以下行为让我感到困惑:

int a(void);
int b(void);

int a() {
return 1;
}

int b() {
return 2;
}
int c(){
return 3;
}

int main(int argc, char **argv) {
int (*procs[])(void) = {a,b};
int (*procs2[])(void) = {c,b};
...

被翻译成:

enter image description here我发现地址 0x4006XX 处的值包含函数 a、b 和 c 的各自地址。但是我想知道为什么使用 0x4006XX 地址的这个额外步骤是必要的(为什么不只使用文字地址?)。甚至更好奇为什么它使用两个不同的地址作为 b 的地址。 我知道这可能是一个晦涩的问题,但我们将不胜感激 :)

最佳答案

您的编译器似乎生成了与位置无关的代码。与位置无关的代码可以在运行时加载到任意地址,从而使函数和静态变量的地址在编译时不可预测。可以预测的一件事是从变量或函数到当前指令的距离。编译器使用lea指令将指令指针rip的内容加到这个距离上,得到实际地址。这就是您所看到的。

关于c - 已编译二进制文件中的预初始化函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49843216/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com