我的项目依赖于第三方库,它可以导出更多符号。其中一些符号正在被其他图书馆和主程序覆盖而非故意。
如何更改已编译共享对象的函数和变量的可见性?
如果您可以通过dlopen
动态加载有问题的库,您可以使用RTLD_DEEPBIND
标志强制它更喜欢本地符号与主可执行文件或其他shlib中的符号。
如果您不想手动管理dlopen
和dlsym
调用,则可以创建一个包含必要函数的trampolines的简单包装器文件。每个蹦床都会在内部dlopen
库,如果它之前没有加载,并转发调用同名的dlsym
-ed符号。这样的包装文件可以通过Implib.so tool自动生成。
如何更改已编译共享对象的函数和变量的可见性?
您可以通过修改动态符号部分(.dynsym
)来更改符号的可见性 - 它包含Elf32_Sym
s或Elf64_Sym
s的平面数组,您可以覆盖其中的.st_info
和.st_other
字段(请参阅this answer)。
我不知道有任何工具会使这个变得简单,你可能不得不编写一个自定义程序来执行此操作。