管理 so 动态库导出符号
2024-11-28 21:15:27

在 Windows 下开发 DLL,必须明确指定要导出哪些函数,MSVC 编译器通过 /def 链接选项来指定一个符号表。
到了 GCC 这里,所有符号竟然是默认导出的,不处理的话会将程序内所有类、函数等一并导出,完全是没有必要的,增加文件尺寸不说还暴露了程序内部的信息。


解决方案是通过-Wl,--version-script=exports.txt编译选项来指定一个符号文件,其中exports.txt文件内容格式如下:

1
2
3
4
5
6
7
8
{
global:
foo1;
foo2
my*;
local:
*;
};

这样就可以导出foo1foo2和所有以my开头的函数了。
CMake 中可以这样设置:

1
target_compile_options(target PRIVATE "-Wl,--version-script=exports.txt")

当然这个文件的功能远不止如此,另一个核心功能是符号版本控制,这个就与本文无关了。

相关阅读

VERSION Command
GCC 怎么控制 .so/.dll 中导出的符号?这个方法比 –fvisibility 更好用!
GCC编译之如何控制共享文件导出符号