【问题标题】:How do I strip symbols only from dependent libraries?如何仅从依赖库中剥离符号?
【发布时间】:2017-12-19 06:14:00
【问题描述】:

我想发送libfoo.a,它由foo.o组成--这又取决于libVendorBar.alibVendorZoo.a

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

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

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

我目前没有使用任何LD_FLAGS,所有内容都是静态链接的。

【问题讨论】:

  • 你看过这个linux.die.net/man/1/strip 吗?
  • strip 即使使用-K 也无法满足我的要求。它似乎从静态库中丢弃了称为存档索引的东西。 If I regenerate the index via ranlib,链接的二进制文件超级很奇怪,每条“分支和链接”指令都会跳转到自身并创建一个无限循环。我花了半天时间调试stripranlib 的后果,然后才意识到我做错了什么。 gcc 中肯定有什么东西可以做我想做的事吗?
  • 根据stackoverflow.com/questions/33851045/…,我正在寻找的是-static 标志,它可以完全解析所有符号。我希望这也意味着 gcc 将足够聪明,可以丢弃大部分符号。如果成功了,我想我明天会更新这篇文章。

标签: c linux gcc


【解决方案1】:

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

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

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

    这将允许您在没有供应商库的情况下发送 libfoo.a(供应商符号仍然存在于其中)。

  • 不幸的是,您不能简单地从库符号表中删除供应商符号(例如通过 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
    

    但是请注意,这不会阻止有动力的用户对供应商的代码进行逆向工程。

【讨论】:

    猜你喜欢
    • 2020-11-15
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2015-01-03
    • 2011-08-30
    • 2010-09-18
    相关资源
    最近更新 更多