当在 Linux 中启动一个可执行文件时,整个可执行文件如何在虚拟内存中分配地址?
我运行了“objdump -d bin”,它给了我如下输出:
11b0 48 83 c4 08 add $0x8,%rsp
11b4 c3 ret
我想知道整个可执行文件是如何在内存中引用的。在我运行 objdump 后,我是否正确地假设每个字节都分配了一个地址(在虚拟内存中)?例如11b0 = 48、11b1 = 83、11b2 = c4等?
如果是这样,这些地址是否基于加载文件时给出的“基地址”工作?
另外,每个程序的基地址是相同的还是不同的?也许 ASLR 处于活动状态?
现代可执行格式指定模块映像的内存布局,通常作为一系列segments或sections(术语取决于文件类型和格式)。一个段定义通常包括该段的虚拟地址和大小,是从文件加载还是补零,以及该段的内存权限(读、写、执行)。