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