[英]C executable code independence from shared libraries
我正在读一本关于gcc的书,以下段落让我困惑:
此外,共享库可以更新库而无需重新编译使用它的程序(前提是库的接口不会更改)。
这只是指尚未联系的节目,对吧? 我的意思是,在C中是不是可执行代码完全独立于编译器? 在哪种情况下,对库的任何更改,无论其接口或实现是否与可执行代码无关?
在执行程序之前,不会链接 共享库,因此可以升级/更改库而无需重新编译(也不需要重新链接)。
EG,在Linux上,人们可能会有
/bin/myprogram
依赖于
/usr/lib64/mylibrary.so
用不同的版本替换mylibrary.so
(只要它导出的函数/符号相同/兼容)将在下次启动myprogram
时影响myprogram
。 在Linux上,这由系统程序/lib64/ld-linux-x864-64.so.2
或类似程序处理,系统在程序启动时自动运行。
与静态库对比, 静态库在编译时链接。 对静态库的更改需要重新链接应用程序。
另外一个好处是,如果两个程序共享同一个共享库,则内存占用量可以更小,因为内核可以“告诉”它是相同的代码,而不是将其复制到RAM中两次。 对于静态库,情况并非如此。
不,这是在谈论一个链接代码。 如果链接到静态库并更改库,则可执行文件将不会获取更改,因为它包含自己的库原始版本副本。
如果链接到共享库(也称为动态链接) ,则可执行文件不包含库的副本。 程序运行时,会将当前版本的库加载到内存中。 这允许您修复库,修复程序将被库的所有用户选中,而无需重新链接。
库为外界提供接口(API)。 使用库的应用程序(例如.DLL)绑定到接口(意味着它们从API调用函数)。 只要不修改接口,库作者就可以自由地修改库并重新分发新版本。
如果库作者要修改接口,他们可能会破坏依赖于该功能的所有应用程序!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.