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

问题描述 投票:1回答:2

我的项目依赖于第三方库,它可以导出更多符号。其中一些符号正在被其他图书馆和主程序覆盖而非故意。

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

shared-libraries visibility elf
2个回答
0
投票

如果您可以通过dlopen动态加载有问题的库,您可以使用RTLD_DEEPBIND标志强制它更喜欢本地符号与主可执行文件或其他shlib中的符号。

如果您不想手动管理dlopendlsym调用,则可以创建一个包含必要函数的trampolines的简单包装器文件。每个蹦床都会在内部dlopen库,如果它之前没有加载,并转发调用同名的dlsym-ed符号。这样的包装文件可以通过Implib.so tool自动生成。


2
投票

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

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

我不知道有任何工具会使这个变得简单,你可能不得不编写一个自定义程序来执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.