我想发送由libfoo.a
组成的foo.o
- 而libVendorBar.a
依赖于libVendorZoo.a
和libfoo.a
。
当我链接并生成libVendor*.a
时,我注意到LD_FLAGS
中的符号仍然是公开的,可供潜在的客户端应用程序链接。
由于我无法控制的许多原因,我绝对不希望第三方客户端能够直接链接到供应商库。
如何强制gcc解析libfoo的所有libVendor符号并将其丢弃,以便只显示libfoo中的符号?
我目前没有使用任何manage.py
,而且所有内容都是静态链接的。
答案 0 :(得分:1)
不幸的是,静态库没有用于共享库的等效-fvisibility=hidden
。您可以通过更多工作来实现您的需求:
首先将所有必要的代码链接到foo.o
:
ld -r foo.o -Lpath/to/vendor/libs -lBar -lZoo -o foo_linked.o
这样您就可以在没有供应商库的情况下发货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
但请注意,这不会阻止用户反向设计供应商的代码。