9

我正在开发一个使用 ftdi D2XX 驱动程序与 ENTTEC DMX usb pro 设备接口的项目。ftdi 驱动程序(libftdi2xx.so.1.1.12 存储在 /usr/local/lib/ 中)是针对 glibc v2.14 或更高版本编译的。

我正在 debian 7 上开发,它只支持 glibc v2.13。当执行我编写的 C 代码(调用 ftdi 驱动程序)时,它给出了一个错误:

./a.out: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /usr/local/lib/libftd2xx.so)

这是有道理的,知道 glibc 版本不兼容。我已将最新版本的 glibc (v2.17) 下载并安装到我计算机上的临时目录 ('~/glibc-testing/install/lib/') 中,并使用以下调用:

~/glibc-testing/install/lib/ld-linux-x86-64.so.2 --library-path ~/glibc-testing/install/lib/ ./a.out 

通过这个调用,我能够成功运行 C 代码。

我想将此 C 代码编译为共享库。它将用于与 DMX 设备交互,并由基于 C# 开发的主应用程序调用。

我不确定如何前进。看起来我需要做的是告诉 fdti 驱动程序始终使用较新的 glibc,同时让应用程序的其余部分使用普通库。ftdi 2DXX 驱动程序仅提供预编译(无源代码可用)。有没有办法将此预编译程序链接到新库?

我研究了导出 LD_LIBRARY_PATH=/home/.../glibc/install/lib/ 的选项,但收效甚微。

谢谢!

4

3 回答 3

1

您可以在自己的代码中提供缺少的功能,但请注意这些功能是版本化的,您可以提供地图文件或随代码一起做所有事情。例子:

#define SYMVER(ver, sym) __asm__(".symver " #sym "," #sym "@" #ver "\n")

SYMVER(GLIBC_2.14, foo);
int foo(int a, char *b)
{
    return 4;
}

为了弄清楚要实现什么,您可以使用 readelf:

readelf -s /usr/local/lib/libftd2xx.so | grep '@GLIBC_2\.14'

就是这样,就功能而言。

现在棘手的部分是让加载器相信它得到了正确的库(除非你想实现自己的加载器),因为你需要修补库以删除对 的引用GLIBC_2.14,因为它会专门查看 libc .

有几种方法可以继续;到目前为止,最简单的是替换GLIBC_2.14GLIBC_2.13,请记住,您需要使用替换版本(即GLIBC_2.13)定义符号,因为版本是通过引用存储的。

这样你的程序就应该运行了。

现在,理论上你可以改为:

  • 解析 ELF 文件,DYNAMIC在程序标题中找到类型条目,在那里搜索一个VERNEED条目,最后在该条目之后您应该找到可以修剪参考的需求表(您也可以使用.gnu.version_r节标题到达那里如果可供使用的话)。

  • 或者,您可以编写一个链接标准加载器但用于ptrace覆盖查找的加载器。

于 2016-09-23T08:11:32.000 回答
0

其中一种变体是将 debian 更新为 sid。

另一种选择是更改文件/etc/ld.so.conf.d/libc.conf/etc/ld.so.conf.d/x86_64-linux-gnu.conf

这些文件包含在系统中搜索库的路径。

于 2014-10-01T19:14:05.700 回答
0

您可以使用PatchELF修改提供的共享库的 rpath:

$ patchelf --set-rpath /home/user/glibc-testing/install/lib/ libftdi2xx.so.1.1.12

然后使用以下命令编译您的共享库:

$ gcc -Wl,-rpath=/home/user/glibc-testing/install/lib/ <rest of flags>

您编译的任何可执行文件都必须使用以下命令进行编译:

$ gcc -Wl,-rpath=/home/user/glibc-testing/install/lib/  -Wl,--dynamic-linker=/home/user/glibc-testing/install/lib/ld-linux-x86-64.so.2 <rest of flags>
于 2016-03-31T17:49:05.753 回答