如何仅从依赖库中删除符号?

时间:2017-12-19 06:14:01

标签: c linux gcc

我想发送由libfoo.a组成的foo.o - 而libVendorBar.a依赖于libVendorZoo.alibfoo.a

当我链接并生成libVendor*.a时,我注意到LD_FLAGS中的符号仍然是公开的,可供潜在的客户端应用程序链接。

由于我无法控制的许多原因,我绝对不希望第三方客户端能够直接链接到供应商库。

如何强制gcc解析libfoo的所有libVendor符号并将其丢弃,以便只显示libfoo中的符号?

我目前没有使用任何manage.py,而且所有内容都是静态链接的。

1 个答案:

答案 0 :(得分:1)

不幸的是,静态库没有用于共享库的等效-fvisibility=hidden。您可以通过更多工作来实现您的需求:

  • 首先将所有必要的代码链接到foo.o

    ld -r foo.o -Lpath/to/vendor/libs -lBar -lZoo -o foo_linked.o
    

    这样您就可以在没有供应商库的情况下发货libfoo.a(供应商符号仍然存在)。

  • 不幸的是,您不能简单地从库symtab中删除供应商符号(例如,通过objcopy -Lstrip --strip-symbol),因为链接器将需要它们在最终可执行链接期间进行重定位处理。但你至少可以将它们重命名为不可读的东西:

    for sym in all symbols you want to hide; do
      id=$(echo $sym | md5sum | awk '{print $1}')
      objcopy --redefine-sym $sym=f_$id foo_linked.o
    done
    

    但请注意,这不会阻止用户反向设计供应商的代码。