我们的项目(C++、Linux、gcc、PowerPC)由几个共享库组成。在发布新版本的软件包时,只有那些库应该更改其源代码实际受到影响的库。“更改”是指绝对二进制身份(比较文件的校验和。不同的校验和 - > 根据策略的不同版本)。(我应该提一下,整个项目总是同时构建的,无论每个库是否更改了任何代码)。
通常这可以通过隐藏包含的头文件的私有部分而不更改公共部分来实现。
但是,有一种情况是delete
,库 libTableManager.so 的类 TableManager(在 TableManager.cpp 文件中!)的析构函数中添加了一个,而库 libB.so(使用类 TableManager)的二进制/校验和变了。
表管理器.h:
class TableManager
{
public:
TableManager();
~TableManager();
private:
int* myPtr;
}
表管理器.cpp:
TableManager::~TableManager()
{
doSomeCleanup();
delete myPtr; // this delete has been added
}
通过检查 libB.so 并readelf --all libB.so
查看 .dynsym 部分,结果发现所有函数的长度,甚至是来自其他库的动态使用的函数,都存储在 libB 中!它看起来像这样(长度是第 3 列中的 668):
527: 00000000 668 FUNC GLOBAL DEFAULT UND _ZN12TableManagerD1Ev
所以我的问题是:
- 为什么函数的长度实际上存储在客户端库中?起始地址还不够吗?
- 在编译/链接 libB.so (某种“剥离”)时可以以某种方式抑制这种情况吗?我们真的很想减少这种依赖程度......