限制链接对象的全局符号的作用域



我在存档文件clib.a中有一个C库。我已经为它编写了一个c++包装器,cpp.o,并希望将其用作静态库:

ar cTrvs cppwrap.a clib.a cpp.o

链接到此的代码将无法直接使用clib.a的东西,除非包含正确的标题。然而,如果有人碰巧创造了一个合适的原型——例如void myCoincidentallyNamedGlobalFunction()——我担心myCoincidentallyNamedGlobalFunction的定义是否适用。

由于clib.a的符号只需要在cpp.o中访问,而不是链接到cppwrap.a的任何东西,是否有一种方法可以完全隐藏它们,以便没有可能的碰撞(因此即使包括clib标头也会失败)?

您可以手动删除最终组合库中不需要的符号:

$ objcopy -N foo cppwrap.a (remove symbol)

或者,如果您需要这些符号,但要确保外部用户无法访问它们:

$ objcopy -L bar cppwrap.a (localalize symbol)

或者,如果clib.a中的符号必须cpp.o中可见,但你不希望它被其他人使用:

$ objcopy -W baz cppwrap.a(弱符号)

在这种情况下,与其他目标文件/库中的符号的冲突将推迟其使用,即使该符号仍然是可见的。为了进一步模糊事物或减少恭敬碰撞的机会,您还可以使用:

$ objcopy --redefine-sym old=new cppwrap.a

匿名命名空间在某些情况下可能会有所帮助,但如果包装器需要功能但试图隐藏外部用户,则不起作用。

相关内容

  • 没有找到相关文章

最新更新