主要观点:
- 多数编程语言提供语言运行时库,Linux 中共享库的默认设置可能使语言运行时在静态库时更复杂。
- 介绍了 C 编译模型,包括对象文件、归档(静态库)和共享对象(动态库)等概念及相关细节。
- 共享对象有导出符号列表,默认会导出对象中的所有外部符号,如 Flang 编译器使用静态库实现运行时会导出大量符号,带来诸多问题。
- 详细阐述了 Flang 相关的问题及表现,如与 OpenMPI 共享对象链接时可能出错、运行时调试报错位置不准确、增加动态链接成本等。
- 介绍了控制符号导出的方法,如使用
--exclude-libs
排除库或使用版本脚本,同时指出版本脚本的优缺点及在 C++标准库中的应用。
关键信息:
- Linux 中共享库默认会导出大量符号,可能导致链接错误等问题。
- Flang 编译器使用静态库实现运行时会导出大量符号。
- 控制符号导出的方法有
--exclude-libs
和版本脚本。 - 版本脚本可更精确控制符号导出,但目前工具支持不足。
重要细节:
- C 编译模型中对象文件、归档和共享对象的生成及链接过程。
- 共享对象导出符号的机制及默认行为。
- Flang 测试用例及相关符号导出情况。
- 链接不同库时使用
--exclude-libs
和版本脚本的示例及效果。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。