提问人:blonded04 提问时间:11/9/2023 最后编辑:HolyBlackCatblonded04 更新时间:11/11/2023 访问量:150
C++ 标准对动态库有什么看法?
What does C++ standard say about dynamic libraries?
答:
4赞
Ext3h
11/9/2023
#1
实际上,动态库只有 2 个主要陷阱,您可以在其中轻松打破 C++ 标准中所做的假设,使其与抽象机器不匹配:
违反“一个定义”规则:例如,您设法将两个库与同一符号的不同实现动态链接;出于某种原因,每个链接都首选本地链接,并且根据调用者的不同,使用不同的实现。C++ 规范仍然告诉你允许你做什么,即使编译器、链接器和动态加载器可以很容易地配置为违反该规则。
在这种情况下,例如,在 Linux 系统上,具有所有符号的公共可见性,这意味着所有符号都由动态加载器在运行时解析,这实际上符合抽象机器的描述。
ld-linux + gcc + ld
不幸的是,出于性能原因,此默认值根本不可取。限制符号的可见性是允许最基本的内联优化形式的先决条件。
在意外时间加载和卸载库:这意味着指针(指向代码和数据段)可能会在任意时间变得(或保持)无效,这与抽象状态机完全不匹配。
在这两种情况下,作为开发人员,您仍然有责任确保保持在抽象机器的范围内,并且不会导致任何与抽象机器相矛盾的可观察行为。
理论就这么多。
现实情况是,在这两种情况下,大多数动态库实际上甚至没有尝试将系统/进程作为一个整体与 C++ 抽象机器兼容。
相反,C++ 只期望在每个动态库中完全正常运行,而整个外部接口完全了解动态链接、符号可见性等,并避免任何可能在边界上暴露未定义行为的 C++ 功能。每个库 - 单独 - 都与抽象机器保持一致。
评论
language-lawyer