gpt4 book ai didi

c++ - 在 Linux 中使用 -fvisibility=hidden 编译时出现库加载错误

转载 作者:行者123 更新时间:2023-12-02 10:30:49 31 4
gpt4 key购买 nike

我们面临与 OpenSSL 静态链接的共享库的问题。该库用于 Apache HTTP Server。虽然我们已经使用 OpenSSL 静态编译了我们的共享库,但它使用的是系统 OpenSSL 库路径,该路径是 Web 服务器用于 https(Web 服务器 SSL)的。我们可以通过设置 LD_LIBRARY_PATH 来扭转这种行为并强制 https 使用我们的 OpenSSL 库。但这不是我们想要的。我们希望 Apache HTTP Server 使用它自己的 OpenSSL 库和我们的 SSL 模块(加载在 Apache 上)使用它自己版本的 OpenSSL 库。
这是我们无法实现的,因此我们遵循以下链接中提到的编译器选项来控制符号的可见性,希望它可以解决问题。 (我们不做包装共享库)
https://wiki.openssl.org/index.php/Android#Wrapper_Shared_Objects

g++ SSlModule.cpp -fPIC -shared -I/usr/local/ssl/include -fvisibility=hidden -Wl,--exclude-libs,ALL \
-Wl,-Bstatic -lcrypto -lssl -L/usr/local/ssl/lib -o SSLModule.so -Wl,-Bdynamic
新的共享库在启动 Apache HTTP Server 时给出错误“ undefined symbol OPENSSL_sk_num”。有人可以为我们的问题提出任何解决方案吗?
解决方案:
Basile Starynkevitch 指出的 Drepper 的论文非常有用。
最后,我们成功编译了静态链接到 OpenSSL 的模块
详细说明主要步骤。
1) 使用 -Wl,-z,defs 选项。然后它报告了许多错误。因此,我使用了 Makefile。我们的模块实际上包含的不仅仅是一个 .cpp 文件
2) 使用链接器选项 --exclude-libs 并从导出中排除 libssl.a 和 libcrypto.a
3) 在 make 文件中使用 -fvisbility=hidden 标志,以便隐藏一些符号
4)二手 属性 ((visibility ("default"))) 导出函数
输出共享库仍在导出它正在从全局范围读取的两个符号
5) 静态链接到 OpenSSL
作为一个特殊用例,我们使用了标志 RTLD_NOW| RTLD_DEEPBIND(dlopen 的第二个参数),以便我们的库从本地范围读取。根据 Drepper 的帖子,RTLD_DEEPBIND 标志将用于罕见的用例。因此,我们不会将其包含在面向所有客户的通用解决方案中。

最佳答案

We face an issue with our shared library linked statically with OpenSSL.



这个静态链接到 shared library Linux 上的一个坏主意 ,无论是技术上还是法律上。但我不是律师。阅读 Program Library HowTOLinkers and Loaders

出于技术原因,请理解 Linux 上的共享库实际上需要是 position-independent-code (PIC) 因为 ASLR .另见 vdso(7) , execve(2) , syscalls(2) , credentials(7) .除了 /sbin/init 之外的所有 Linux 程序(以及与 systemdudevmodprobe 相关的其他一些)由 execve 启动通常会运行 ld.so(8) .

德雷珀的论文 How to write shared libraries详细解释。

另请阅读 Advanced Linux Programmingkernelnewbies.org

你的用户也会很生气。使用 strace(1)ltrace(1)gdb(1)了解发生了什么。另见 this draft报告(解释关于 GCC compilers 的有趣事实)。

还有一些 open source许可证不鼓励静态链接到共享库。请咨询您的律师,也许可以调用 FSF ,以及 OpenSSL 的版权所有者.

至少重新编译 OpenSSL从它的源代码到 PIC 代码和 object files .

注意: Android是一种Linux系统。它运行 Linux kernel .

关于c++ - 在 Linux 中使用 -fvisibility=hidden 编译时出现库加载错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62324162/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com