在库中隐藏库

时间:2012-05-04 01:37:16

标签: c interface linker

这是情况。我有一个旧的遗留库,在许多地方被破坏,但内置了许多重要的代码(我们没有源代码,只有lib +头文件)。这个库暴露的功能必须以“特殊”方式处理,一些发布和预处理或事情变坏。我在想的是创建另一个使用这个旧库的库,并公开一组“安全”的新函数。

我很快就尝试创建这个新库,并将其链接到主程序中。但是,它仍然链接到旧库中通过新库公开的符号。

显然有一件事是要求人们不要使用这些功能,但如果我能通过某种方式隐藏它们,只能暴露安全功能,那就更好了。

有可能吗?替代?

(它在ARM微控制器上运行。文件格式为ELF,操作系统是Keil的RTOS,使用他们的编译器)

[更新]

这就是我最终做的事情:我在新库中创建了虚拟函数,这些函数使用与旧版本相同的原型。将新库链接到主程序中,如果其他开发人员尝试使用旧库中的“坏”函数,它将使用“符号abcd多次定义(由old_lib.o和new_lib.o)来破坏构建。”足以胜任政府工作......

[UPDATE2] 我实际上发现,当通过IDE = P链接它们时,我可以手动隐藏库的组件,这是更好的解决方案。抱歉在这里占用空间。

2 个答案:

答案 0 :(得分:1)

如果您使用libtool来编译和链接库而不是ld,则可以提供-export-symbols来控制输出符号,但这仅适用于您的旧库可以静态联系。如果它是动态关联的(.so.dylib.dll),则无法进行此操作。

答案 1 :(得分:1)

如果您正在使用GNU binutils,objcopy可以使用您选择的字符串为所有符号添加前缀。只需使用objcopy --prefix-symbols=brokenlib_ old.so new.so(注意:省略new.so会导致old.so被覆盖!)

现在,您使用brokenlib_foo()来调用foo()的原始版本。

相关问题