Opentelemetry社区在gRPC的几个链接问题(静态库和动态库混用,musl工具链,符号裁剪)

💡 原文中文,约4500字,阅读约需11分钟。
📝

内容提要

本文讨论了使用gRPC作为传输协议时,静态库同时链接进多个动态库可能会出现的问题及解决方案,同时提到了grpc::Status::OK的实现方式可能会导致链接错误的解决方法,最后建议对输出接口使用符号导出并改变默认可见性。

🎯

关键要点

  • opentelemetry-cpp支持使用gRPC作为传输协议,但在某些平台上静态库与动态库混用时会出现问题。

  • gRPC初始化时使用全局变量,导致多个动态库中存在重复的全局变量和符号,可能引发链接错误。

  • 在Windows中,每个DLL有独立的符号表,重复符号不会造成问题,但在Linux的ELF ABI下,符号表是共享的,可能导致构造函数执行异常。

  • 解决方案是避免使用全局变量,改用静态函数返回static变量,或通过新增编译目标otlp_grpc_client来避免gRPC被多次链接。

  • 修复第一个问题后,gRPC的grpc::Status::OK实现方式引入了新的链接错误,解决方法是将对gRPC的直接调用托管到otlp_grpc_client中。

  • 动态库与静态库混合使用的问题因操作系统ABI不同而复杂,推荐使用符号导出和修改可见性来提高跨平台兼容性。

➡️

继续阅读