重新定义共享库中的符号

pra*_*een 1 shared-libraries binutils objcopy readelf

我需要更改共享库 (.so) 文件中的某些符号,如下例所示:我需要将abc.so 文件中的符号重命名为 symbol xyz。我有一个工具可以在头文件中替换它,我面临的唯一挑战是更改我的 .so 共享库。对于共享库,是否有任何工具或命令可以帮助我反汇编 .so 文件、更新符号并再次重新组装为 .so 文件?对于共享库,我们需要一种重建符号表的机制。如果有任何工具可以完成我的任务,需要帮助吗?

仅供参考:更改源是最好的方法,但对于短期的解决方案来说,它可以帮助在符号级别替换代码字。

小智 5

objcopy无法重命名共享库上的符号,只能在目标文件 ( .o) 中重命名。

Patchelf 中添加了更改共享库中名称的功能:https://github.com/NixOS/patchelf/commit/da035d6acee1e5a608aafe5f6572a67609b0198a

它应该在下一个版本(0.17.2 之后)中可用。同时,您可以按照https://github.com/NixOS/patchelf#compiling-and-testing中的说明构建该工具

要使用它,请创建一个每行具有两个名称(旧名称和新名称)的映射文件,并使用以下命令调用 Patchelf:

$ patchelf --output libPatched.so --rename-dynamic-symbols map_file libOriginal.so
Run Code Online (Sandbox Code Playgroud)