我是它的新手,最近我在调试器和反汇编器中玩了一些。 在查看内部hopper工具中的二进制文件时,我注意到我们已经静态分配了内存地址。我的问题是:为什么如果操作系统管理内存(每次运行二进制文件时都会更改函数的地址等),我们在二进制文件(?)的实际示例中也会有一个静态内存地址:
在料斗中打开二进制文件,并显示一个printf位于地址0x11ed,然后在gdb中运行该程序,显然我们在不同的地址处有一个printf。编译器是否为二进制文件分配了静态地址,为什么?有推荐的资源以了解更多信息吗?
答案 0 :(得分:0)
似乎有两种不同的东西使他们感到困惑。
虚拟地址和实际内存地址之间的差异。进程被分配了自己的地址空间(从0开始)。这与实际内存地址0没有关系。映射由OS管理,通常在“内存管理单元”的硬件协助下进行。我的答案的这一部分解决了有关“操作系统管理内存”问题的一部分。
动态加载的库。地址可能是相对于此类库的地址;从库相对地址到虚拟地址的映射是在将库加载到地址空间时分配的。语言运行时库通常作为动态加载的共享库分发。这可能解释了独立运行程序与在调试器下运行地址之间的差异。我不知道什么是“漏斗”,所以我无法确切地说出它在向您显示什么。