这是情况。我有一个旧的遗留库,在许多地方被破坏,但内置了许多重要的代码(我们没有源代码,只有lib +头文件)。这个库暴露的功能必须以“特殊”方式处理,一些发布和预处理或事情变坏。我在想的是创建另一个使用这个旧库的库,并公开一组“安全”的新函数。
我很快就尝试创建这个新库,并将其链接到主程序中。但是,它仍然链接到旧库中通过新库公开的符号。
显然有一件事是要求人们不要使用这些功能,但如果我能通过某种方式隐藏它们,只能暴露安全功能,那就更好了。有可能吗?替代?
(它在ARM微控制器上运行。文件格式为ELF,操作系统是Keil的RTOS,使用他们的编译器)
[更新]
这就是我最终做的事情:我在新库中创建了虚拟函数,这些函数使用与旧版本相同的原型。将新库链接到主程序中,如果其他开发人员尝试使用旧库中的“坏”函数,它将使用“符号abcd多次定义(由old_lib.o和new_lib.o)来破坏构建。”足以胜任政府工作......
[UPDATE2] 我实际上发现,当通过IDE = P链接它们时,我可以手动隐藏库的组件,这是更好的解决方案。抱歉在这里占用空间。
答案 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()
的原始版本。