我有一个Solaris共享对象(common.so文件),该对象是第三方应用程序(app.exe)的一部分。我无法访问应用程序的源代码。因此,我需要添加功能来发布HTTP请求。我的计划是将libcurl与openssl一起使用。棘手的部分是app.exe已经对较旧版本的curl(7.14)具有依赖性,该版本不支持tls v1.2。
。我下载了源代码,并构建了curl(7.55.1)和openssl .a文件。我也能够建立通用。因此,对这些存档文件的静态依赖性。LDD不显示对curl或ssl .So文件的依赖性,也没有报告任何"找不到的符号"错误。
有了这个结果,我希望当SO运行作为应用程序的一部分时,我会调用我的卷发版本,但事实并非如此。相反
我正在使用Solaris Studio编译器。该应用程序不直接取决于卷曲库,而取决于不同的.SO文件,该文件以与卷曲相同的名称导出符号。我从NM意识到,我假设此.SO文件也可以静态链接。
当app.exe加载两者时,它将每个功能添加到其符号表中。现在,必须发生两个可能的情况之一必须发生(实际上是OS细节,但在这里无关...):
- 旧版本较旧版本和较旧版本覆盖了较新的条目。
- ,由于表中已经有条目,因此不再更新。
现在是最清洁的解决方案–如果适用,我。e。如果您可以访问来源–将更新另一个,以便使用较新版本的Curl。如果这样做,请考虑将卷曲创建为新的,因此而不是将其静态链接到Common.So和另一个SO。
否则,要直接解决问题,您将必须切换应用程序加载so的顺序,而so则意味着要对app.exe进行反复编译,并使用SO更改的链接顺序对其进行重新构建。然后:当时可能有两个版本的app.exe,您必须确保只有一个正确的一个版本与您的共同点分发。潜在的麻烦来源也...
除此之外,我能想到的最好是解决方法:
您可以将卷曲前缀从curl_
修改为e。G。curl_755_
。不过,不要手工尝试一下,您很可能会以这种方式疯狂...相反,请使用脚本(例如g。Perl或Python)。而且,如果您更新卷曲源,则可以再次运行...
更快的版本,但可能不安全:只需替换任何事件即可。更安全:在第一次运行中标识外部可见功能(以及可能的全局对象),然后将其保存在地图中,然后用相应的值替换地图中包含的字符串的任何事件。
后一个方法(地图)还允许在以下形式的标头文件中生成宏:
#define curl_xyz curl_755_xyz
这些宏允许常见来源。