修改已编译共享库中符号的可见性
Modify visibility of symbol in compiled shared library
我的项目依赖于导出更多符号的第三方库。其中一些符号被其他库和主程序无意覆盖。
如何更改已编译共享对象的函数和变量的可见性?
如果您可以通过 dlopen
动态加载有问题的库,您可以使用 RTLD_DEEPBIND
标志强制它优先选择本地符号而不是主可执行文件或其他 shlib 中的符号。
如果您不想手动管理 dlopen
和 dlsym
调用,您可以创建一个简单的包装文件,其中包含必要功能的 trampoline。如果之前未加载每个蹦床,它将在内部 dlopen
库并将调用转发给具有相同名称的 dlsym
-ed 符号。这样的包装文件可以通过 Implib.so tool.
自动生成
How can I change the visibility of functions and variables of a compiled shared object?
您可以通过修改动态符号部分 (.dynsym
) 来更改符号的可见性 -- 它包含 Elf32_Sym
或 Elf64_Sym
的平面数组,您可以覆盖其中的 .st_info
和 .st_other
字段(参见 )。
我不知道有什么工具可以使这个变得简单,您可能必须编写一个自定义程序才能做到这一点。
根据 EmployedRussian 的建议,我制作了一个简单的工具 SymbolHider 来修补可执行文件的动态部分:
$ sym-hider libmy.so sym1 sym2 ...
它也可以应用于目标文件。
我的项目依赖于导出更多符号的第三方库。其中一些符号被其他库和主程序无意覆盖。
如何更改已编译共享对象的函数和变量的可见性?
如果您可以通过 dlopen
动态加载有问题的库,您可以使用 RTLD_DEEPBIND
标志强制它优先选择本地符号而不是主可执行文件或其他 shlib 中的符号。
如果您不想手动管理 dlopen
和 dlsym
调用,您可以创建一个简单的包装文件,其中包含必要功能的 trampoline。如果之前未加载每个蹦床,它将在内部 dlopen
库并将调用转发给具有相同名称的 dlsym
-ed 符号。这样的包装文件可以通过 Implib.so tool.
How can I change the visibility of functions and variables of a compiled shared object?
您可以通过修改动态符号部分 (.dynsym
) 来更改符号的可见性 -- 它包含 Elf32_Sym
或 Elf64_Sym
的平面数组,您可以覆盖其中的 .st_info
和 .st_other
字段(参见
我不知道有什么工具可以使这个变得简单,您可能必须编写一个自定义程序才能做到这一点。
根据 EmployedRussian 的建议,我制作了一个简单的工具 SymbolHider 来修补可执行文件的动态部分:
$ sym-hider libmy.so sym1 sym2 ...
它也可以应用于目标文件。