【发布时间】:2021-12-30 06:56:50
【问题描述】:
例如,我的一个项目中有一个稍微复杂的库依赖案例:
/--------------------------------\
| |
/----> GRPC <------------------\ |
| | |
| (c++) | |
\------- A --------------> B |
| (rust) |
| |
\------------------> c++ <---/
Rust 默认更喜欢使用静态链接。可执行文件 A 也被构建为静态链接 lib(std)c++。因此,据我了解,A 和 B 中都会有两个 STL 实现副本。这正是https://developer.android.com/ndk/guides/cpp-support#sr 建议避免的模式。
但是,查看B的动态链接表(例如通过nm -D);我看不到导出的 lib(std)c++/grpc 符号。这是因为默认情况下 rust 会将它们标记为隐藏。
- 那么,如果 B 中的所有常用符号都被隐藏,是否安全(或符合 ODR)?
【问题讨论】:
-
B 和 A 是如何关联的?
-
B 是共享库。
-
个人建议动态链接libstdc++。它并不大(0.5MB 未压缩,在我的 Rust + C++ + Android 项目中)
-
共享链接阻止 PLT/GOT 被优化。这是团队的担忧之一。由于我们要迁移到 LLVM,另一个问题是我们可能需要将 libc++.so 与我们的发行版一起发布。
标签: c++ rust linker shared-libraries one-definition-rule