c- 在主程序中使用不同的共享库和程序内部加载的so
c- Use different shared libraries in the main program and the so loaded inside the program
我的主程序需要调用标准的openssl函数,例如SSL_library_init()
。另一方面,该程序需要加载一个库,比如 mylib.so,它使用了 openssl 的修改版本。
主程序编译使用
-L/path-to/orig-openssl/lib -lssl -lcrypto
此外,mylib.so是使用
制作的
-Wl,-rpath,/path-to/modified-openssl/lib -Wl,-Bsymbolic
选项。
当我执行程序时,它会尝试加载 openssl 的修改版本,而不是原始版本。
如何强制程序在主程序中使用原始 openssl,同时在被调用库中使用修改后的版本,mylib.so?
注意1:如果我使用-rpath,/path-to/orig-openssl/lib
编译程序,程序会加载真正的(原始的)openssl。但是,当它尝试加载 mylib.so 时失败了(dlopen 无法打开库)。
注意 2:在 dlopen
函数中使用 RTLD_DEEPBIND
标志会导致相同的结果。
How can I enforce the program to use the original openssl inside the main program while use the modified version inside the called library, mylib.so?
简而言之,你不能。
无法可靠地完成您的要求。
您在 mylib.so
的要求(需要自定义版本的 OpenSSL)和您的代码(需要 "normal" 版本的 OpenSSL)之间存在冲突。
OpenSSL 并未设计为允许其自身的多个不同实例存在于单个进程中。将存在不可预测的符号冲突 - 期望函数或变量执行或成为一件事的代码获得函数或变量的符号执行或是不同的东西 - 例如,期望不同参数或具有不同字段的结构的函数.
即使您以某种方式想出一种方法使事情看起来正常,但当您由于新漏洞而必须升级 OpenSSL 版本并且该升级破坏了您的解决方法时,您打算怎么办?而且您找不到修复它们并再次获取东西 "working" 的方法? (而且我确实希望您不要忽略使用修改后的 OpenSSL 版本升级 OpenSSL 的必要性——您打算如何在下一个高优先级时推出对 that 的紧急修复OpenSSL 中与安全相关的漏洞已发布?)
如果您必须使用两个不同版本的 OpenSSL,则需要从两个单独的进程中执行此操作。
自答:
使用带有LM_ID_NEWLM
标志的dlmopen
在主程序中加载mylib.so。
此外,要编译主程序,使用-Wl,-rpath,/path-to/orig-openssl/lib
进行动态链接。换句话说,你应该为共享对象和主程序设置rpath。
我的主程序需要调用标准的openssl函数,例如SSL_library_init()
。另一方面,该程序需要加载一个库,比如 mylib.so,它使用了 openssl 的修改版本。
主程序编译使用
-L/path-to/orig-openssl/lib -lssl -lcrypto
此外,mylib.so是使用
制作的-Wl,-rpath,/path-to/modified-openssl/lib -Wl,-Bsymbolic
选项。
当我执行程序时,它会尝试加载 openssl 的修改版本,而不是原始版本。
如何强制程序在主程序中使用原始 openssl,同时在被调用库中使用修改后的版本,mylib.so?
注意1:如果我使用-rpath,/path-to/orig-openssl/lib
编译程序,程序会加载真正的(原始的)openssl。但是,当它尝试加载 mylib.so 时失败了(dlopen 无法打开库)。
注意 2:在 dlopen
函数中使用 RTLD_DEEPBIND
标志会导致相同的结果。
How can I enforce the program to use the original openssl inside the main program while use the modified version inside the called library, mylib.so?
简而言之,你不能。
无法可靠地完成您的要求。
您在 mylib.so
的要求(需要自定义版本的 OpenSSL)和您的代码(需要 "normal" 版本的 OpenSSL)之间存在冲突。
OpenSSL 并未设计为允许其自身的多个不同实例存在于单个进程中。将存在不可预测的符号冲突 - 期望函数或变量执行或成为一件事的代码获得函数或变量的符号执行或是不同的东西 - 例如,期望不同参数或具有不同字段的结构的函数.
即使您以某种方式想出一种方法使事情看起来正常,但当您由于新漏洞而必须升级 OpenSSL 版本并且该升级破坏了您的解决方法时,您打算怎么办?而且您找不到修复它们并再次获取东西 "working" 的方法? (而且我确实希望您不要忽略使用修改后的 OpenSSL 版本升级 OpenSSL 的必要性——您打算如何在下一个高优先级时推出对 that 的紧急修复OpenSSL 中与安全相关的漏洞已发布?)
如果您必须使用两个不同版本的 OpenSSL,则需要从两个单独的进程中执行此操作。
自答:
使用带有LM_ID_NEWLM
标志的dlmopen
在主程序中加载mylib.so。
此外,要编译主程序,使用-Wl,-rpath,/path-to/orig-openssl/lib
进行动态链接。换句话说,你应该为共享对象和主程序设置rpath。