我想发运libfoo.a
,它由foo.o
组成 - 而libVendorBar.a
又依赖于libVendorZoo.a
和libfoo.a
。
当我链接并生成我的libVendor*.a
时,我注意到LD_FLAGS
中的符号仍然公开且可见,以便潜在客户端应用程序链接。
由于我无法控制的许多原因,我绝对不希望第三方客户端能够直接链接到供应商库。
如何强制gcc解析libfoo的所有libVendor符号并将其丢弃,以便只显示libfoo中的符号?
我目前没有使用任何-fvisibility=hidden
,一切都是静态链接的。
不幸的是,静态库没有用于共享库的foo.o
。尽管如此,您可以通过更多工作实现所需:
ld -r foo.o -Lpath/to/vendor/libs -lBar -lZoo -o foo_linked.o
:
libfoo.a
这将允许您可以在没有供应商库的情况下运送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
),因为链接器将需要它们在最终可执行链接期间进行重定位处理。但你至少可以将它们重命名为不可读的东西:
qazxswpoi
但请注意,这不会阻止激励用户使用逆向工程供应商的代码。