【发布时间】:2019-08-02 22:15:50
【问题描述】:
我的项目依赖于一个第三方库,它可以导出更多的符号。其中一些符号被其他库和主程序无意覆盖。
如何更改已编译共享对象的函数和变量的可见性?
【问题讨论】:
标签: shared-libraries visibility elf
我的项目依赖于一个第三方库,它可以导出更多的符号。其中一些符号被其他库和主程序无意覆盖。
如何更改已编译共享对象的函数和变量的可见性?
【问题讨论】:
标签: shared-libraries visibility elf
如何更改已编译共享对象的函数和变量的可见性?
您可以通过修改动态符号部分 (.dynsym) 来更改符号的可见性——它包含 Elf32_Syms 或 Elf64_Syms 的平面数组,您可以覆盖 .st_info 和 .st_other其中的字段(请参阅this answer)。
我不知道有什么工具可以让这件事变得简单,您可能需要编写一个自定义程序才能做到这一点。
【讨论】:
如果您可以通过dlopen 动态加载有问题的库,您可以使用RTLD_DEEPBIND 标志强制它使用本地符号而不是主可执行文件或其他 shlib 中的符号。
如果您不想手动管理dlopen 和dlsym 调用,您可以创建一个简单的包装文件,其中包含必要功能的蹦床。如果之前没有加载过,每个蹦床将在内部 dlopen 库,并将调用转发到具有相同名称的 dlsym-ed 符号。这样的包装文件可以通过Implib.so tool自动生成。
【讨论】: