非PIE可执行文件是否一定会被操作系统加载到其预设基地址?
可执行文件加载地址确定性解答
这个加载地址的确定性并非由操作系统无条件提供保证,具体情况需要结合可执行文件的编译属性、系统配置判断:
- 针对编译时关闭了位置无关属性的普通可执行文件:编译阶段就已经固定了程序各段的预期加载基址,只要该地址没有被系统预留、或被其他进程资源占用,操作系统会按照编译时指定的地址完成段加载,此时加载地址是确定的。
- 针对编译时开启了位置无关属性的PIE(位置无关可执行文件):目前主流操作系统默认都会开启ASLR(地址空间布局随机化)防护,加载时操作系统会随机选择可用地址区间完成加载,此时不存在固定的预期加载地址,加载地址是完全不确定的。
即使是普通非PIE可执行文件,如果编译时指定的基地址出现冲突,部分操作系统也会自动调整加载地址避免冲突,并不会强制加载到不可用的预期地址。
不同操作系统的具体行为也有差异:
- Linux系统下:默认编译生成的非PIE可执行文件加载地址固定,PIE可执行文件默认随机化加载地址,你可以通过修改
/proc/sys/kernel/randomize_va_space内核参数关闭ASLR,关闭后PIE文件也会被加载到固定地址。 - Windows系统下:未开启动态基址选项的EXE文件加载地址固定,开启动态基址的EXE文件加载时会被系统随机分配基地址。
内容的提问来源于stack exchange,提问作者Aaa Bbb
相关产品推荐
相关产品推荐

