繁体   English   中英

C可执行代码独立于共享库

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM