繁体   English   中英

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

[英]Library load error when compiled with -fvisibility=hidden in Linux

我们面临与 OpenSSL 静态链接的共享库的问题。 The library is used in Apache HTTP Server.Although we have compiled our shared library statically with OpenSSL, it was using system OpenSSL library path, which the web server was using for https (web server SSL). 我们可以通过设置 LD_LIBRARY_PATH 来扭转这种行为并强制 https 使用我们的 OpenSSL 库。 但这不是我们想要的。 We want Apache HTTP Server to use its own OpenSSL library and our SSL module (loaded on Apache) to use its own version of OpenSSL libraries. 这是我们无法实现的,因此我们遵循以下链接中提到的编译器选项来控制符号的可见性,希望它可以解决问题。 (我们不做包装共享库)

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 服务器时给出错误“未定义符号 OPENSSL_sk_num”。 有人可以为我们的问题提出任何解决方案吗?

解决方案:

Basile Starynkevitch 指出的 Drepper 的论文非常有用。 最后,我们成功编译了静态链接到 OpenSSL 的模块

详细说明主要步骤。

1) 使用 -Wl,-z,defs 选项。 然后它报告了许多错误。 因此我使用了 Makefile。 我们的模块实际上包含的不仅仅是一个.cpp 文件

2)使用 linker 选项 --exclude-libs 并从导出中排除 libssl.a 和 libcrypto.a

3) 在 make 文件中使用 -fvisbility=hidden 标志,以便隐藏一些符号

4) 用于导出函数的已使用属性((visibility ("default")))

5)针对OpenSSL静态链接

作为一个特殊用例,我们使用了标志 RTLD_NOW| RTLD_DEEPBIND(dlopen 的第二个参数),以便我们的库从本地 scope 读取。 根据 Drepper 的帖子,RTLD_DEEPBIND 标志将用于罕见的用例。 因此,我们不会将其包含在面向所有客户的通用解决方案中。

我们面临与 OpenSSL静态链接的共享库的问题。

这个 static 链接到共享库对 Linux 来说是个坏主意,无论是技术上还是法律上。 但我不是律师。 阅读程序库 HowTO链接器和加载器

由于技术原因,请了解 Linux 上的共享库实际上需要是位置无关代码(PIC),因为ASLR 另请参见vdso(7)execve(2)syscalls(2)credentials(7) 每个 Linux 程序除了/sbin/init (以及其他一些与systemdudevmodprobe相关的程序)都由execve启动,它通常会运行ld.so(8)

Drepper 的论文如何编写共享库详细解释了这一点。

另请阅读高级 Linux 编程并查看kernelnewbies.org

你的用户也会很生气。 使用strace(1)ltrace(1)gdb(1)来了解发生了什么。 另请参阅此报告草案(解释有关GCC 编译器的有趣事实)。

一些开源许可证不鼓励 static 链接到共享库。 请咨询您的律师,也许还有FSF以及OpenSSL的版权所有者。

至少,将 OpenSSL从其源代码重新编译成 PIC 代码和object 文件

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM