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

问题描述 投票:0回答:1

我想发运libfoo.a,它由foo.o组成 - 而libVendorBar.a又依赖于libVendorZoo.alibfoo.a

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

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

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

我目前没有使用任何-fvisibility=hidden,一切都是静态链接的。

c linux gcc
1个回答
1
投票

不幸的是,静态库没有用于共享库的foo.o。尽管如此,您可以通过更多工作实现所需:

  • 首先将所有必要的代码链接到ld -r foo.o -Lpath/to/vendor/libs -lBar -lZoo -o foo_linked.o libfoo.a 这将允许您可以在没有供应商库的情况下运送objcopy -L(供应商符号仍然存在于其中)。
  • 遗憾的是,您不能简单地从库symtab中删除供应商符号(例如,通过strip --strip-symbolfor 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 ),因为链接器将需要它们在最终可执行链接期间进行重定位处理。但你至少可以将它们重命名为不可读的东西: qazxswpoi 但请注意,这不会阻止激励用户使用逆向工程供应商的代码。
© www.soinside.com 2019 - 2024. All rights reserved.