我从彼得·范·德·林登(Peter Van Der Linden)的书(《专家C编程:深入的C secret 》)中学到,有一些特定的库必须进行动态链接;这些库是哪些,以及为什么要强制它们动态链接?(更具体地讲,在GNU/Linux系统)
最佳答案
所有UNIX系统均保证向后兼容;也就是说,在较旧的系统上构建的二进制文件将继续工作,并且较新的系统也将继续工作。但是,此保证仅适用于动态链接系统库的二进制文件。
之所以有此限制,是因为用户级程序通常不直接进行系统调用,而是调用libc包装程序例程。因此,只要系统库也进行了更新,UNIX供应商可以自由地对syscall接口(interface)进行不兼容的更改(例如,修复错误)。通常,此类更改仅在升级到新的OS版本时发生,例如从Solaris
2.6到2.7。
Linux上的画面比我上面描述的还要复杂,因为glibc
的单个版本由大约200多个单独的二进制文件组成,所有二进制文件必须完全匹配。静态链接一个这样的片段,然后在其他片段不匹配的系统上运行将产生不可预测的结果;经常在libc
中崩溃。
摘要:除非您知道自己在做什么并且有充分的理由这样做,否则请不要将UNIX系统库静态链接到可执行文件中。