相关疑难解决方法(0)

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

在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(在Trevor Pounds博客的Web Archive上看到)因为这需要我确保symver在所有使用memcpy的代码之前,这将是非常困难的(具有第三方代码的复杂代码库)
  • 使用旧库维护构建环境; 仅仅是因为我想在我的桌面系统上进行开发,并且在我们的网络中同步这些东西将会变得很有用.

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

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

编辑: 为了保护未来的读者,除了以下的想法,我找到--wrap了链接器的选项,这有时也很有用.

c linux linker gcc ld

43
推荐指数
5
解决办法
3万
查看次数

标签 统计

c ×1

gcc ×1

ld ×1

linker ×1

linux ×1