2

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

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

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

可能吗?备择方案?

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

[更新]

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

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

4

2 回答 2

1

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

现在你brokenlib_foo()用来调用原始版本的foo().

于 2012-05-04T02:34:00.567 回答
1

如果您使用libtool编译和链接库而不是ld,您可以提供-export-symbols来控制输出符号,但这只有在您的旧库可以静态链接时才有效。如果它是动态链接的(.so.dylib.dll),这将是不可能的。

于 2012-05-04T01:41:35.630 回答