这是这个问题的后续:链接器可以内联函数吗?
这次我想知道相同的优化,不是在链接时,而是在链接到动态库时的运行时。有可能吗?现代操作系统能做到吗?为什么?
这是这个问题的后续:链接器可以内联函数吗?
这次我想知道相同的优化,不是在链接时,而是在链接到动态库时的运行时。有可能吗?现代操作系统能做到吗?为什么?
理论上这是可能的,但有很多理由不这样做。在实践中,“动态链接”并不是真正的完整链接;除了主程序(也可能是主程序)之外的所有程序都使用与位置无关的代码,因此不需要完整(静态)链接器可能必须执行的全部重定位。相反,只需要少量的重定位类型,基本上只是将库中包含的函数和对象的地址填充到一个大的连续表中。当然,.data
segment中的静态存储时长的对象中的这种引用也必须填写,所以比填写一张连续的表要稍微麻烦一些,但关键是只修改了数据,没有修改代码。
如果你开始修改代码,你就放弃了动态链接的大部分优点:代码页不能在应用程序/库的多个实例之间共享,并且在启动复制时会花费更多时间(通过页面错误和写时复制语义)映射的代码页。这只是在代码中到处修补几个字节的最低成本。
对于来自动态库的实际内联代码,您必须做的就是完整的链接时优化。测量 LTO 链接大型程序所需的时间,然后问自己是否可以接受用户每次启动程序时等待这么长时间。答案几乎肯定是否定的。