我可以加载 elf 并在实际 运行 之前从 /proc/pid/maps 获取虚拟地址吗?

Could I load elf and get virtual address from /proc/pid/maps before actually running it?

看看 perf 是如何工作的,用户可以使用像“perf record -e cpu-clock ./binary”这样的命令来 运行 二进制文件并获取信息。 perf 是否加载二进制文件,进行一些配置,然后 运行ning 它?如果是这样,我可以通过查看 /proc/pid/maps 来获取某些代码的虚拟地址吗?本人是二进制执行的菜鸟,希望大家多多指教!

Could I load elf and get virtual address from /proc/pid/maps before actually running it?

没有。地址 space 被构建为程序 运行s。 “内存映射”是 进程(软件是 运行 并请求内存映射),而不是 属性二进制文件。现在,基本上所有主流操作系统都使用地址 space 布局随机化 (ASLR)!

,这一点变得更加清楚了

通常,很多事情是在 你的 C main() 甚至 运行 之前完成的 - 由加载程序(ld.so 在 Linux),但这仍然是从您的二进制文件执行代码。

您的 ELF 文件 包含的部分 可以 在固定地址加载,但如前所述,ASLR 使这种情况变得罕见。这些天编译的大部分代码都是可重定位,所以它只需要知道相对地址。

你关于 perf record 的问题是无关紧要的,但是 perf 所做的是设置一些内核-space 可观察对象(主要使用 eBPF),然后非常定期地执行二进制文件,同时探测说观察值。