限制链接对象的全局符号范围

时间:2014-05-15 12:57:11

标签: c++ c gcc static-linking ar

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

ar cTrvs cppwrap.a clib.a cpp.o

链接到此代码的代码将无法直接使用clib.a中的内容,除非包含正确的标头。然而,如果有人巧合地创造了一个合适的原型 - 例如void myCoincidentallyNamedGlobalFunction() - 我担心 myCoincidentallyNamedGlobalFunction定义将适用。

由于clib.a中的符号只需要在cpp.o中访问,而不是与cppwrap.a相关联的任何内容,是否有办法完全隐藏它们以便不会发生碰撞(所以即使包括clib头也会失败)?

1 个答案:

答案 0 :(得分:2)

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

$ objcopy -N foo cppwrap.a(删除符号)

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

$ objcopy -L bar cppwrap.a(本地化符号)

或者,如果clib.a 中的某个符号必须cpp.o中的内容可以显示,但您不希望其他任何人使用该符号:

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

在这种情况下,与其他目标文件/库中的符号冲突将遵循其用法,即使符号仍然可见。为了进一步模糊事物或减少偶然碰撞的可能性,您还可以使用:

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

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