GCC 隐藏符号
日常被 GCC 折磨,GCC 链接报错,提示未定义符号。
排查编译流程确认该符号其最终被链接进入 third_party/wireshark/build/run/libwireshark.dylib。
而我最终又链接了 libwireshark.dylib。
并且确认该符号并非 static。
直接查找二进制文件也能够确认其符号已经被链接进入 dylib。
通过 nm 确认符号属性发现其为 t。
再次查看对应的 .o 确认其为 T。
那么该文本符号从 T 变成了 t 只能够是在链接阶段了。最后确认了 -fvisibility=hidden。
这个选项会将所有符号的默认可见性设置为隐藏,除非显式地声明为 default。这意味着,尽管在编译 .o 文件时符号是全局可见的,但在链接生成 .dylib 文件时符号变成了局部可见。
那为什么要这么做呢?
主要目的是设置编译器默认隐藏符号,确保只有显式导出的符号才会在共享库(shared library)中可见。这可以帮助在更多的 Unix 系统上捕捉到符号导出失败的问题,而不仅仅是在 Windows 上。