谁能建议我们可以限制将符号导出到全局符号表的某种方式?
提前致谢
你好,
感谢回复...
实际上,我有一个静态链接到第三方库的可执行文件,例如“ver1.a”,并且还使用第三方“.so”文件,该文件再次与相同的库链接,但不同的版本说“ver2.a”。问题是这两个版本的实现是不同的。一开始,当加载可执行文件时,“ver1.a”中的符号将被导出到全局符号表中。现在,无论何时加载“.so”,它都会尝试引用来自 ver2.a 的符号,最终将引用来自“ver1.a”的符号,这些符号之前已加载。从而使我们的二进制文件崩溃。
我们想到了一个解决方案,我们不会将可执行文件的符号导出到全局符号表,因此当“.so”被加载并尝试使用来自 ver2.a 的符号时,它不会在全局符号表中找到它,它将使用它的自己的符号,即来自 ver2.a 的符号
我找不到任何方法可以限制将符号导出到全局符号表。我尝试使用--version-script 和retain-symbol-file,但是没有用。对于 -fvisibility=hidden 选项,它给出的错误是“-f 选项只能与 -shared 一起使用”。所以我想,这也像“--version-script”一样只适用于共享库而不适用于可执行二进制文件。
代码在 c++、OS-Linux、gcc version-3.2 中。可能无法重新编译任何第三方库和“.so”。因此,排除了使用 bsymbolic 标志重新编译“so”文件的选项。
任何帮助,将不胜感激。