lxg*_*xgr 11 libraries dynamic-linking dynamic-loading
是否可以使用自修改代码来加速动态链接库中的函数调用?
据我了解,ELF 共享库使用一种间接跳转表(过程链接表,或 PLT)来实现库函数的延迟绑定。目的似乎是避免在代码段中修改表,同时在第一次调用时仍然启用函数位置的延迟解析。
在加载时或者甚至在第一次函数调用时为该表动态创建代码不是更快吗?
是否尽可能地在进程之间共享代码段(动态表对进程来说是私有的)?是否出于安全原因(可写代码不应该是可执行的- 但 JIT 一直都在这样做,并且在实际启动程序之前,加载程序可以添加和删除写入权限)?
或者它是这些的组合,并且每个函数调用的小性能增益不值得付出努力?
我想我们在谈论 x86 架构。
您不能在保护模式下使用自修改代码,我所知道的大多数基于 UNIX 的操作系统(不仅如此)都使用这种模式,因为代码段始终是只读的。加载程序不控制它——它是由内核的内存管理子系统处理的。
但是,即使您可以像您所说的那样“在加载时为该表创建代码”,它也会违背共享库的全部目的。这样,每个进程将在其地址空间中拥有库函数的“私有”副本,从而有效地增加其内存占用——创建共享库的原因之一就是为了解决这个问题。
您描述的整个过程非常复杂,并且比现在使用的 PLT 方法花费更多的处理周期,并且可能会引入更多、新的和有趣的安全问题。