【问题标题】:Modify visibility of symbol in compiled shared library修改已编译共享库中符号的可见性
【发布时间】:2019-08-02 22:15:50
【问题描述】:

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

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

【问题讨论】:

    标签: shared-libraries visibility elf


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我认为@EmployedRussian 的回答更合适。
      猜你喜欢
      • 2021-07-27
      • 2013-05-22
      • 2022-01-22
      • 1970-01-01
      • 2022-01-08
      • 2014-12-07
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      相关资源
      最近更新 更多