【问题标题】:Symbol lookup error after replacing strings替换字符串后符号查找错误
【发布时间】:2023-05-10 16:37:01
【问题描述】:

我试图更改共享库中的特定字符串,在运行与之链接的程序后,我收到此错误:

./prog: symbol lookup error: /home/user/lib/libprog.so: undefined symbol: have_qwerty, version PROG_PRIVATE

更改字符串的命令是:

sed -i "s/have_somewq/have_qwerty/g" ./libprog.so

理论上,这应该工作无论如何,因为这个字符串在使用这个库的所有文件和整个库中都发生了变化。

那么这里有什么问题呢?
如何修复或调试此问题?

【问题讨论】:

  • “理论上,这无论如何都应该工作......” - 您没有在程序中更改它progprog 不是@987654325 的参数@(或者你没有说明)。你确定这些名字没有以某种方式排序吗?

标签: c linux shared-libraries elf


【解决方案1】:

sed -i "s/have_somewq/have_qwerty/g" ./libprog.so

您是否尝试使用 sed 更改二进制文件中的符号名称?这是行不通的。一个原因是,除了符号名称之外,共享库还在专用部分中包含它们的哈希值,您将无法不费力地对其进行修改。

另请注意,符号具有 PROG_PRIVATE 版本,可能意味着它不打算在库之外使用。

【讨论】:

  • 谢谢!只有一个问题,是否有任何公共工具可以做到这一点?喜欢混淆符号?
  • 我曾经在寻找类似的东西,但一无所获,众所周知,它很难实现。