【发布时间】:2020-08-10 06:32:53
【问题描述】:
我已经实现了一个客户端程序,它使用 openSSL 以安全的方式连接到服务器。客户端被编译为共享对象 (SO),以便第三方应用程序可以加载它并连接到服务器。 (注意:SO 的编译方式使得 openSSL 静态链接到它。[如果知道这对您的答案有影响])
它在许多应用程序中都能正常工作。但是,如果第三方应用程序本身出于任何其他原因加载 openSSL,则在库尝试调用 SSL_library_init() 时会发生分段错误。看来,调用不可重入函数SSL_library_init() 两次会导致分段错误。第一次调用发生在主程序中,第二次调用由我的共享对象触发。
有什么方法可以解决这个问题吗?例如,通过分离SSL_library_init() 的main 和SO 调用并强制SO 在单独的内存空间中调用函数?或者,通过使用类似objcopy --prefix-symbols=... 命令的方式重命名 openSSL 的符号名称?
总之,当我不知道哪些程序会加载这个库时,是否可以从共享库中安全地调用不可重入函数SSL_library_init?
显然,我无法控制第三方应用程序。所以,我无法确定它应该在哪里以及如何调用该函数。
【问题讨论】:
标签: c openssl linker shared-libraries