Linker 删除共享库中包含的库

Linker 删除共享库中包含的库,linker,shared-libraries,symbols,Linker,Shared Libraries,Symbols,问题背景: 我有一个库,比如说mylib,它包含一个旧的libpng。 现在(由于最近的谷歌播放政策),我不得不使用一个更新的libpng;但这可能很困难,因为该库是在很久以前编译的,使用旧版本重新收集所需的所有库可能需要很长时间。。。等等 问题: 是否可以从文件mylib.so中“删除”特定的条目,这样我就可以从我的应用程序中链接mylib.so和新的libpng.so,并且一切都可以正常运行(显然,如果libpng与之前在mylib.so中链接的libpng向后兼容) 我不知道共享库的内部结

问题背景: 我有一个库,比如说mylib,它包含一个旧的libpng。 现在(由于最近的谷歌播放政策),我不得不使用一个更新的libpng;但这可能很困难,因为该库是在很久以前编译的,使用旧版本重新收集所需的所有库可能需要很长时间。。。等等

问题:

是否可以从文件mylib.so中“删除”特定的条目,这样我就可以从我的应用程序中链接mylib.so和新的libpng.so,并且一切都可以正常运行(显然,如果libpng与之前在mylib.so中链接的libpng向后兼容)

我不知道共享库的内部结构,但我希望链接器能够在不重新编译整个mylib的情况下实现这一点。。。 我是不是太乐观了

额外问题(不是主要问题,但我想理解):如果mylib.so包含一个旧libpng,并且我链接到mylib.so和一个新libpng。。。会发生什么?我的意思是,链接器允许我链接两个库,它们可能具有相似的导出符号名称。。。但这有点让人困惑

是否可以从文件mylib.so中“删除”特定条目

没有

大多数UNIX系统(除AIX之外)考虑<代码>。因此< /COD>作为最终链接产品,并且不可能进一步修改。

如果mylib.so包含一个旧的libpng和一个指向mylib.so和一个新libpng的链接。。。会发生什么


您的程序违反了一个定义规则,从而表现出未定义的行为。通常它只会崩溃,但其他任何事情都是可能的。例如,它可能会悄无声息地损坏堆栈,并导致崩溃,每小时或每天只发生一次。这样的错误是最难找到的。不要这样做。

依赖项是版本化的还是未版本化的
readelf
可以告诉你这一点。如果它是未版本的,你不需要做任何事情,它应该可以工作。谷歌播放政策似乎相当严格,他们不希望旧的libpng出现在你的应用程序中。。。。由于这个原因,我尝试了一种方法来移除、损坏:-或者做一些事情来克服这个问题而不必重新编译MyLIB。SO1),这显然不是关于C语言或C++语言的一种。2) 看起来像是XY问题。您应该更新您的程序/lib以使用新的libpng;即使接口没有改变,语义也可以。也许你可以写一个包装库。3) 弄乱libpng是一个非常糟糕的主意,因为这可能会破坏系统中的其他代码。4) 不清楚你到底想要什么。“特定条目”是什么意思?嗨@Olaf。。。好的,重点是,已经编译了一个库,我可以从中删除一些东西吗?(ops,错误地发送了不完整的注释)重点是:如果我从mylib内部删除libpng,那么也许我可以从外部包括它,正如@KerrekSB强调的那样…谢谢,我整晚都在尝试,用readelf和objdump,但最后我明白这并不太明显。。。至少不能使用简单可用的命令。如果没有人给出解决方案,这似乎是一个正确的解决方案:没有解决方案…:-)