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

我在一个存档文件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(删除符号)

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

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

或者,如果clib.a中的符号必须通过cpp.o中的某些内容可见,但您不希望其他任何人使用它:

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

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

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

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

点赞