C 如何仅从依赖库中剥离符号?

C 如何仅从依赖库中剥离符号?,c,linux,gcc,C,Linux,Gcc,我想发布libfoo.a,它由foo.o——这反过来又取决于libVendorBar.a和libVendorZoo.a 当我链接并生成我的libfoo.a时,我注意到libVendor*.a中的符号仍然是公共的,对于潜在的客户端应用程序来说是可见的 由于许多我无法控制的原因,我绝对不希望第三方客户能够直接链接到供应商库 如何强制gcc解析libfoo的所有libVendor符号并丢弃它们,以便只有libfoo中的符号可见 我目前没有使用任何LD_标志,所有东西都是静态链接的。不幸的是,静态库没有

我想发布
libfoo.a
,它由
foo.o
——这反过来又取决于
libVendorBar.a
libVendorZoo.a

当我链接并生成我的
libfoo.a
时,我注意到
libVendor*.a
中的符号仍然是公共的,对于潜在的客户端应用程序来说是可见的

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

如何强制gcc解析libfoo的所有libVendor符号并丢弃它们,以便只有libfoo中的符号可见


我目前没有使用任何
LD_标志,所有东西都是静态链接的。

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

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

    ld -r foo.o -Lpath/to/vendor/libs -lBar -lZoo -o foo_linked.o
    
    这将允许您在没有供应商LIB的情况下发布
    libfoo.a
    (供应商符号仍然存在于其中)

  • 不幸的是,您不能简单地从库symtab中删除供应商符号(例如,通过
    objcopy-L
    strip--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
    
    但请注意,这并不会阻止积极的用户对供应商代码进行反向工程


你看到了吗?
strip
即使使用
-K
也不能满足我的要求。它似乎从静态库中丢弃了称为归档索引的内容,链接的二进制文件非常奇怪,每个“分支和链接”指令都会跳转到自身,并创建一个无限循环。我花了半天的时间调试
strip
ranlib
的影响,然后才意识到我在做一些根本错误的事情。当然,
gcc
中肯定有什么东西可以做我想做的事情?根据我寻找的是
-static
标志,它完全解析所有符号。我希望这也意味着gcc足够聪明,可以丢弃大部分符号。如果这篇文章成功的话,我想我明天会更新它。