💡
原文中文,约13200字,阅读约需32分钟。
📝
内容提要
这篇文章讨论了eCapture项目在Ubuntu下编译二进制文件时出现Segment Fault的问题。经过排查发现,问题是由于使用了Gin框架导致的。进一步分析发现,问题是由于Golang在CGO调用getaddrinfo时使用了glibc的变量导致的。解决方法是避免使用glibc提供的DNS查找,而使用Go内置的DNS来处理。文章还讨论了使用外部链接器以静态链接方式进行链接时,不同版本的glibc中特定字段的offset不一致导致的Segment Fault问题。
🎯
关键要点
- eCapture项目在Ubuntu下编译二进制文件时出现Segment Fault问题。
- 问题源于使用Gin框架,导致Golang在CGO调用getaddrinfo时使用了glibc的变量。
- 解决方法是避免使用glibc提供的DNS查找,改用Go内置的DNS处理。
- 不同版本的glibc中特定字段的offset不一致,导致静态链接时出现Segment Fault。
- 使用git bisect确定问题是由938fcffb95e23015af8643ae046c0e912de0a438引入的。
- 通过调试发现,使用localhost作为监听地址时触发DNS Lookup,导致CGO使用glibc的getaddrinfo。
- 在构建参数中新增-tags 'netgo'后,问题得到解决。
- 静态链接时,__ctype_init等方法被静态编译至二进制中,导致不同glibc版本间的offset不一致。
- 总结指出,问题的根本原因在于不同glibc版本间的结构变化导致的offset不一致。
➡️