删除包含在共享库中的库

Removing a library included in a shared library

问题背景: 我有一个库,比如 mylib.so,其中包含一个旧的 libpng。 现在(由于最近的 Google Play 政策)我必须使用更新的 libpng;但这可能很困难,因为库是很久以前编译的,再次收集所有需要的库可能会很长时间,旧版本......等等。

问题:

是否可以 "remove" 文件 mylib.so 中的特定条目,这样我就可以 link 两个 mylib.so 和新的 libpng.so 从我的应用程序,一切都会 运行 很好(显然,如果 libpng 是落后的与之前 linked inside mylib.so)?

兼容

我不知道共享库的内部结构,但我希望 linker 能够以某种方式做到这一点而无需重新编译整个 mylib.so... 我是不是太乐观了?

附加问题(不是正题,但我想了解一下):如果mylib.so包括旧的 libpng 和我 link 到 mylib.so 和新的 libpng... 发生什么了?我的意思是,linker 允许我 link 2 个可能具有相似名称的导出符号的库...但这有点令人困惑...

Is it possible to "remove" specific entries from the file mylib.so,

没有

大多数 UNIX 系统(AIX 除外)将 .so 视为 最终 link 产品,并且无法进一步修改。

if mylib.so includes an old libpng and I link to both mylib.so and a new libpng... what happens?

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