解决方法 --exclude-libs在OS X上的clang中不可用

5
我需要创建一个包装库,它需要使用不同版本的OpenSSL(BoringSSL),原因在[1]的“Wrapper Shared Objects”中提供。
问题是,在OS X上,clang不支持--exclude-libs选项,因此必须避免导出符号。
我有哪些选项可以解决这个问题,例如在构建库之后剥离符号?
[1]https://wiki.openssl.org/index.php/Android

也许不使用AppleClang? - Richard Barber
那也是我的第一个想法。问题不在于clang本身,而在于ld,在OS X上没有替代品(至少不再有了,我找到了一个过时的项目)。 - benjist
@benjist,LLVM有lld,但我不确定它是否支持您想要的选项。 - rubenvb
你的包装库是动态框架吗?也许你可以像我在这里的回答中所述进行后构建可执行文件处理(因此基本上删除相关的LC_LOAD_DYLIB),并添加自定义的一个。假设API是相同的。 - Kamil.S
你找到解决问题的答案了吗?我也在处理很多静态库和隐藏这些库中的符号通常需要源代码修改。从静态库中静态剥离符号可能有效,但我找不到如何做到。 - ceztko
2个回答

1

macOS的ld链接器允许您通过使用-hidden-l而不是-l来隐藏特定静态库中的符号。以下是来自Mac上man ld的一句话:

     -hidden-lx  This is the same as the -lx for locating a static library,
                 but treats all global symbols from the static library as if
                 they are visibility hidden.  Useful when building a dynamic
                 library that uses a static library but does not want to
                 export anything from that static library.

因此,在您的链接器标志中不要使用-lssl,而要使用-hidden-lssl

这个开关是相当新的,XCode 12或13才有。 - ceztko

-1

我在我的项目中使用不同版本的 OpenSSL。我构建并链接静态库,没有参考已安装的 dylibs。这完全独立于机器上可能存在的任何其他 OpenSSL 实现。那种策略适用于您吗?我想知道为什么您必须将静态库包装在动态库中?为什么不直接将静态库链接到将使用它的可执行文件中呢?


我还必须链接到系统的OpenSSL。因此,这个不幸地行不通。 - benjist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接