【发布时间】:2012-01-06 10:38:24
【问题描述】:
我想修改现有的共享库,使其根据使用共享库的应用程序使用不同的内存管理例程。
(目前)将有两个系列的内存管理例程:
- 标准的 malloc、calloc 等函数
- malloc、calloc 等的特殊版本
我想出了解决这个问题的潜在方法(在 SO 上的一些人的帮助下)。目前仍有一些灰色区域,我想对我的提案提出一些反馈。
这就是我打算实现修改的方式:
用 my_malloc/my_calloc 等替换对 malloc/calloc 等的现有调用。这些新函数将调用正确分配的函数指针,而不是调用硬编码的函数名称。
为共享库提供一种机制来初始化 my_malloc 等使用的函数指针以指向标准 C 内存管理例程 - 这允许我为依赖于该共享库的应用程序提供向后兼容性 -也不必修改。在 C++ 中,我可以通过使用静态变量初始化(例如)来做到这一点 - 我不确定是否可以在 C 中使用相同的“模式”。
引入一个新的幂等函数 initAPI(type) 函数,由需要在共享库中使用不同 mem mgmt 例程的应用程序调用(在启动时)。 initAPI() 函数将内存 mgmt func ptrs 分配给适当的函数。
显然,如果我可以限制谁可以调用 initAPI() 或何时调用它会更可取 - 例如,在对库进行 API 调用后不应调用该函数 - 因为这会改变内存管理例程。所以我想限制它被调用的地方和由谁调用。这是一个访问问题,可以通过在 C++ 中将方法设为私有来解决,我不知道如何在 C 中做到这一点。
上面2和3中的问题可以用C++轻松解决,但是我受限于使用C,所以我想用C来解决这些问题。
最后,假设可以如上所述在初始化期间正确设置函数指针 - 我还有第二个问题,关于共享库中全局变量的可见性,使用共享库跨越不同进程。函数指针将被实现为全局变量(我现在不太关心线程安全 - 尽管我设想在某些时候使用互斥锁来包装访问)*并且每个使用共享库的应用程序不应干扰内存管理例程用于使用共享库的另一个应用程序。
我怀疑它是使用 shlib 在进程之间共享的代码(而不是数据) - 但是,我希望得到确认 - 最好带有支持该断言的链接。
*注意:如果我天真地淡化了由于上述“架构”而可能在未来发生的线程问题,请有人提醒我!..
顺便说一句,我正在 Linux (Ubuntu) 上构建库
【问题讨论】:
-
“这将改变 money mgmt 例程” ...您最好格外小心 :-)
-
@pmg:哦,快!弗洛伊德滑倒在那里:)
-
澄清一下:这是 linux 特有的问题吗?
-
@Asaf 是的,我正在 Linux 上构建(如问题中所述)。我想,我会添加 Linux 和 Ubuntu 标签,因为它们是相关的。
标签: c linux ubuntu shared-libraries