gpt4 book ai didi

c - 链接到 .so 文件中的旧符号版本

转载 作者:IT老高 更新时间:2023-10-28 12:37:10 26 4
gpt4 key购买 nike

在 x86_64 linux 上使用 gcc 和 ld 我需要链接到较新版本的库 (glibc 2.14),但可执行文件需要在具有较旧版本 (2.5) 的系统上运行。由于唯一不兼容的符号是 memcpy(需要 memcpy@GLIBC_2.2.5 但库提供 memcpy@GLIBC_2.14),我想告诉链接器,与其采用 memcpy 的默认版本,不如采用我指定的旧版本.

我找到了一种非常笨拙的方法:只需在链接器命令行中指定旧的 .so 文件的副本即可。这工作得很好,但我不喜欢有多个 .so 文件的想法(我只能通过指定我链接到的所有旧库也有对 memcpy 的引用来使其工作)检查到 svn 并由我的构建系统需要.

所以我正在寻找一种方法来告诉链接器采用旧版本符号。

对我来说不起作用(很好)的替代方案是:

  • 使用 asm .symver(如 Web Archive of Trevor Pounds' Blog 所示),因为这需要我确保 symver 在所有使用 memcpy 的代码之前,这将非常困难(复杂的代码库与第 3 方代码)<
  • 使用旧库维护构建环境;只是因为我想在我的桌面系统上进行开发,而在我们的网络中同步内容将是一个皮塔。

在考虑链接器所做的所有工作时,实现起来似乎并不难,毕竟它也有一些代码可以找出符号的默认版本。

任何其他与简单链接器命令行具有相同复杂性级别的想法(如创建简单的链接器脚本等)也是受欢迎的,只要它们不是像编辑生成的二进制文件这样的奇怪黑客......

编辑:为了为 future 的读者保留这一点,除了以下想法之外,我还为链接器找到了 --wrap 选项,这有时也很有用。

最佳答案

我找到了以下可行的解决方案。首先创建文件memcpy.c:

#include <string.h>

/* some systems do not have newest memcpy@@GLIBC_2.14 - stay with old good one */
asm (".symver memcpy, memcpy@GLIBC_2.2.5");

void *__wrap_memcpy(void *dest, const void *src, size_t n)
{
return memcpy(dest, src, n);
}

编译此文件不需要额外的 CFLAGS。然后用 -Wl,--wrap=memcpy 链接你的程序。

关于c - 链接到 .so 文件中的旧符号版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8823267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com