ripレジスタと関数 foo のアドレスを出力する次の C コードがあります。実行可能ファイルを複数回実行すると、 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: リップが変わらないのはなぜですか?
Q2: バイナリとマシンが同じままであれば、&foo も同じままですか?
Q3: &foo はいつ変更できますか?
背景: 関数の実行時間を履歴テーブルに保存しようとしています。関数アドレスを使用してテーブルにインデックスを付け、以前の実行からの偏差を計算することを考えています。