修改已编译共享库中符号的可见性

Modify visibility of symbol in compiled shared library

我的项目依赖于导出更多符号的第三方库。其中一些符号被其他库和主程序无意覆盖。

如何更改已编译共享对象的函数和变量的可见性?

如果您可以通过 dlopen 动态加载有问题的库,您可以使用 RTLD_DEEPBIND 标志强制它优先选择本地符号而不是主可执行文件或其他 shlib 中的符号。

如果您不想手动管理 dlopendlsym 调用,您可以创建一个简单的包装文件,其中包含必要功能的 trampoline。如果之前未加载每个蹦床,它将在内部 dlopen 库并将调用转发给具有相同名称的 dlsym-ed 符号。这样的包装文件可以通过 Implib.so tool.

自动生成

How can I change the visibility of functions and variables of a compiled shared object?

您可以通过修改动态符号部分 (.dynsym) 来更改符号的可见性 -- 它包含 Elf32_SymElf64_Sym 的平面数组,您可以覆盖其中的 .st_info.st_other 字段(参见 )。

我不知道有什么工具可以使这个变得简单,您可能必须编写一个自定义程序才能做到这一点。

根据 EmployedRussian 的建议,我制作了一个简单的工具 SymbolHider 来修补可执行文件的动态部分:

$ sym-hider libmy.so sym1 sym2 ...

它也可以应用于目标文件。