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