在Linux上编译时未定义的引用mempcy@GLIBC_2.14

时间:2012-09-05 17:08:42

标签: c++ porting undefined-reference ftdi

我正在尝试移植一个应用程序来驱动一个使用ftdi2332h芯片的设备从windows到linux。我在ubuntu 10.04系统per these instructions上安装了libftd2xx库。

当我尝试编译任何示例程序时,我收到以下错误:

/usr/local/lib/libftd2xx.so: undefined reference to `memcpy@GLIBC_2.14'
collect2: ld returned 1 exit status

有关如何解决此问题的指南?

6 个答案:

答案 0 :(得分:4)

自述文件提到了Ubuntu 12.04,它附带了glibc 2.15。您使用的是Ubuntu 10.04,它带有glibc 2.11.1。您看到的错误消息告诉您一些二进制文件(这里很可能libftd2xx.so)依赖于一个比链接更新的glibc,这是合乎逻辑的,考虑到之前的事实。

从源代码重新编译libftd2xx.so与系统的glibc版本(可能不是选项,因为它只是二进制文件),或更新您的操作系统。 Ubuntu 10.04已经很老了。

作为最后的手段(如果你喜欢,只是尝试这样做,euhm,用大锤击打你的手指),你可以为你的系统编译一个更新的glibc,并将它安装在像/opt这样的地方。 / p>

答案 1 :(得分:2)

mempcy@GLIBC_2.14被称为版本化符号。 Glibc在其他运行时库(例如musl does not)中使用它们。

在Linux上进行编译时,mempcy@GLIBC_2.14的重要性是由于Glibc改变了memcpy在2012年的工作方式。memcpy用于复制字节{begin→end}(低内存地址)到高内存地址)。 Glibc 2.13提供了一个memcpy,它在某些平台上复制了{end→begin}。我相信“某些平台”包括带有SSE4.1的英特尔机器。 Glibc 2.14提供了memcpy,可以恢复{begin→end}行为。

某些程序依赖于{begin→end}副本。当程序使用重叠缓冲区时,memcpy会产生未定义的行为。在这种情况下,程序应该使用memmove,但由于{开始→结束}发生了复制,因此无法通过。另请参见Strange sound on mp3 flash website(由于Adobe Flash),Glibc change exposing bugs(在LWN上),The memcpy vs memmove saga和朋友。

要解决此问题,您可以将以下内容添加到源代码中:

__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");

也许类似以下内容。然后在项目中包含额外的源文件。

$ cat version.c

__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");

答案 2 :(得分:0)

升级到Ubuntu 12.04。我使用Qt发生了同样的事情,结果发现glibc库太旧了。谷歌搜索表明,试图升级glibc是一个非常危险的主张。

答案 3 :(得分:0)

您可以下载并编译libc,并在/opt/lib/libcX/libc.so.6下安装。然后,你可以有一个脚本:

LD_LIBRARY_PATH=/opt/lib/libcX:/lib/:/usr/lib:/usr/share/lib
./your_program

答案 4 :(得分:0)

我不确定,但如果它是您正在使用的交叉编译器,则必须在某处安装基本库的兼容版本( not in /usr/include和{ {1}}),您必须确保编译器使用它们,而不是本机编译器的那些。并且您必须确保整个工具链与版本兼容。 (而且我知道这不是一个非常完整的答案,但我知道这一切。)

答案 5 :(得分:0)

这是带有“ opatchauto”的Oracle Bug。请参见该网址https://dba010.com/2019/06/24/19cgi-12crdbms-opatchauto-re-link-fails-on-target-procob/。 替代方法:对每个适用的数据库修补程序手动使用“ opatch”,而不是“ opatchauto”。