-rdynamic 编译选项详解
功能
-rdynamic(或同义的 -export-dynamic)指示链接器将主程序的所有符号(包括函数和全局变量)导出到动态符号表(.dynsym 段),从而使这些符号对运行时加载的动态库(通过 dlopen)可见。
导出共享库(.so)符号到动态符号表
1. 默认导出(不推荐)
编译时不添加额外选项,默认导出所有非静态全局符号:
bash
Copy Code
gcc -shared -fPIC lib.c -o libexample.so
2. 精确控制导出(推荐)
使用编译器属性 visibility 实现选择性导出:
c
Copy Code
// 在代码中标记需导出的符号
__attribute__((visibility("default"))) void critical_func();
// 标记不导出的符号
__attribute__((visibility("hidden"))) void internal_func();
编译时添加 -fvisibility=hidden 隐藏未标记符号:
bash
Copy Code
gcc -shared -fPIC -fvisibility=hidden lib.c -o libexample.so
3. 通过链接脚本控制
创建符号导出脚本 export.map:
text
Copy Code
{
global: /* 导出的符号 */
exported_func1;
exported_var;
local: *; /* 隐藏其他所有符号 */
};
编译时应用脚本:
bash
Copy Code
gcc -shared -fPIC -Wl,--version-script=export.map lib.c -o libexample.so