dlopen相关

 Wed, 07-Jan-2026 12:11:38

-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