x86 - 分页和 PIC 可执行文件
问题描述
当使用虚拟内存时,我很难理解对 PIC 可执行文件的需求。根据我收集到的信息,每个程序都在页表中分配了一个条目,因此有一种错觉,即它拥有整个内存可供使用,而分页机制负责可能的重定位、页面错误等。所以,如果任何程序有这种错觉拥有所有可能的内存地址,为什么要使用 PIC?
解决方案
两个主要原因:
共享库。不能保证库在特定地址加载——即使在 64 位系统上,也无法保证每个库都具有唯一的加载地址,不会与任何其他库或动态内存冲突分配。因此,共享库中的代码被编译为 PIC,以便可以将其加载到所需的任何地址。
安全。将特定代码存在于内存中可预测的位置是一种安全风险,因为它允许利用跳转到内存中的短代码“小工具”,这些小工具可以串在一起执行任意操作。在应用程序启动时随机重定位代码有助于抵御这些攻击。
推荐阅读
- chilkat - 在套接字 fd 大于 1024 的情况下,由 chilkat lib 中的系统调用“select”引起的潜在崩溃
- python-3.x - 函数返回 None 而不是浮点数(仅适用于某些值)
- java - 为什么 TestNG Selenium 并行方法不起作用?
- html - 无法使 div 适合弹性高度
- reactjs - 如何使用 TS 在 create-react-app 中修复(缺失:任何)
- sas - 创建一个变量以有条件地等于另一个单元格的值
- c# - 身份验证和 RouteConfig
- django - 无法使用 django rest 框架使用自引用生成正确的树结构输出
- c# - 如何在 UserControl 中向 CheckBox 添加功能
- python - numpy.matrix_power 的输出不同于公式化的求解方式