我有以下一段 C 代码,它打印rip寄存器和函数 foo 的地址。多次运行可执行文件会导致打印相同的rip和 &foo 值。
#include <stdio.h>
#include <inttypes.h>
void foo(int x) {
printf("foo sees %d\n", x);
}
int main(int argc, char *argv[]) {
uint64_t ip;
asm("leaq (%%rip), %0;": "=r"(ip));
printf("rip is 0x%016" PRIx64 "\n", ip);
void (*fp)(int) = &foo;
printf("foo is at offset %p\n", fp);
(*fp)(10);
return 0;
}
Q1:为什么 rip 保持不变?
Q2:如果二进制文件和机器保持不变,&foo 会保持不变吗?
Q3: &foo 什么时候可以改变?
背景:我正在尝试将函数的执行时间存储在历史表中。我正在考虑使用函数地址来索引表并计算与先前执行的偏差。