@
catror #9
像 steam、nvidia 闭源驱动、oracle jdk 等等软件,你会发现他们发布的二进制文件能在几乎所有的现代发行版上运行!其实就是尽量避免对发行版的库依赖实现的。但是如果没有向用户分发二进制的需求时,就不用考虑这些乱七八糟的事情了。
制作纯静态 elf 时,无法使用 dlopen()系列的调用!这对需要制作需要运行时加载插件 elf 的程序是个灾难(虽然也有很脏的方法达到大致等价的效果),所以总是不应该制作纯静态 elf !这也是我为什么讨厌 golang。rust 则没有这个糟心的问题。
运行速度快我说的有歧义,我是指“程序启动时速度快”,你的 elf 依赖
a.so,
b.so,
c.so ,知名的库很可能早就由其他程序加载了,运行时肯定内核只需要从硬盘上加载你的 elf 即可(现代系统的写时复制机制)。如果你静态链接,这些“ so 的代码”(其实是.a 的代码)还得费劲给你从硬盘上加载到内存里,相当于白白重复做事,加载后还得进行重定位等“修剪”工作,这些 I/O 和修剪都是需要花费 CPU 时间去等待 /完成的。启动后的运行速度就不受影响了。但是启动时会慢,而且也会占用更多内存。(如果是动态链接,写时复制机制使 .so 在主存中只有 1 份)