Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linker 链接器如何知道可执行文件的特定部分将映射到进程的地址空间?_Linker_Operating System_Virtual Memory - Fatal编程技术网

Linker 链接器如何知道可执行文件的特定部分将映射到进程的地址空间?

Linker 链接器如何知道可执行文件的特定部分将映射到进程的地址空间?,linker,operating-system,virtual-memory,Linker,Operating System,Virtual Memory,我在读关于程序是如何加载到内存中的。我想了解PE/ELF文件的不同部分(如文本、数据、rodata等)如何映射到进程虚拟地址空间中的不同位置。我特别想了解链接器如何知道特定部分(例如rodata)将映射到地址空间的位置,以便在创建可执行文件之前能够解析所有符号的正确地址 操作系统(如Windows)是否为加载/映射特定部分的进程提供固定范围的虚拟地址?如果没有,那么链接器将如何解析不同部分中符号的正确地址?没有。链接器只能建议在特定VA加载可执行映像,对于PE通常0x00400000,对于DLL

我在读关于程序是如何加载到内存中的。我想了解PE/ELF文件的不同部分(如文本、数据、rodata等)如何映射到进程虚拟地址空间中的不同位置。我特别想了解链接器如何知道特定部分(例如rodata)将映射到地址空间的位置,以便在创建可执行文件之前能够解析所有符号的正确地址


操作系统(如Windows)是否为加载/映射特定部分的进程提供固定范围的虚拟地址?如果没有,那么链接器将如何解析不同部分中符号的正确地址?

没有。链接器只能建议在特定VA加载可执行映像,对于PE通常
0x00400000
,对于DLL通常
0x10000000
。节(.text、.rodata、.data等)的虚拟地址通过节对齐(通常为
0x000011000
)对齐,因此它们的建议VA为
0x00401000
0x00402000
等。然后链接器将符号地址固定到假定的VAs。
默认的ImageBase地址(取自链接器脚本或链接器参数)是OS loader不需要的,但我看不出有什么理由更改它,在调试期间查看漂亮的四舍五入地址是一个好习惯

在极少数情况下,Windows加载程序可能会发现提议的地址空间的一部分被占用,因此它将在不同的VA加载映像,并将位置相关(绝对)引用固定到新VA。
特殊PE节relocs包含加载时需要重新定位的程序符号的引用地址。

它没有。链接器只能建议在特定VA加载可执行映像,对于PE通常
0x00400000
,对于DLL通常
0x10000000
。节(.text、.rodata、.data等)的虚拟地址通过节对齐(通常为
0x000011000
)对齐,因此它们的建议VA为
0x00401000
0x00402000
等。然后链接器将符号地址固定到假定的VAs。
默认的ImageBase地址(取自链接器脚本或链接器参数)是OS loader不需要的,但我看不出有什么理由更改它,在调试期间查看漂亮的四舍五入地址是一个好习惯

在极少数情况下,Windows加载程序可能会发现提议的地址空间的一部分被占用,因此它将在不同的VA加载映像,并将位置相关(绝对)引用固定到新VA。 特殊PE段relocs包含加载时需要重新定位的程序符号的引用地址