我有一个类似的问题。在RHEL 7.1上尝试安装一些oracle组件时,遇到了这个错误:
$ gcc -o /some/oracle/bin/foo .... -L/some/oracle/lib ...
/some/oracle/lib/libfoo.so: undefined reference to `memcpy@GLIBC_2.14'
看起来我的RHEL的glibc只定义了memcpy@GLIBC_2.2.5:
$ readelf -Ws /usr/lib/x86_64-redhat-linux6E/lib64/libc_real.so | fgrep memcpy@
367: 000000000001bfe0 16 FUNC GLOBAL DEFAULT 8 memcpy@@GLIBC_2.2.5
1166: 0000000000019250 16 FUNC WEAK DEFAULT 8 wmemcpy@@GLIBC_2.2.5
因此,我成功绕过了这个问题,首先创建一个没有包装的memcpy.c文件,如下所示:
#include <string.h>
asm (".symver old_memcpy, memcpy@GLIBC_2.2.5");
void *old_memcpy(void *, const void *, size_t );
void *memcpy(void *dest, const void *src, size_t n)
{
return old_memcpy(dest, src, n);
}
我们有一个memcpy.map文件,将我们的memcpy导出为memcpy@GLIBC_2.14:
GLIBC_2.14 {
memcpy;
};
我随后将自己的memcpy.c编译成了一个共享库,步骤如下:
$ gcc -shared -fPIC -c memcpy.c
$ gcc -shared -fPIC -Wl,--version-script memcpy.map -o libmemcpy-2.14.so memcpy.o -lc
我将libmemcpy-2.14.so移动到/some/oracle/lib目录下(由我的链接参数-L指定),然后重新链接。
$ gcc -o /some/oracle/bin/foo .... -L/some/oracle/lib ... /some/oracle/lib/libmemcpy-2.14.so -lfoo ...
(没有错误编译)并通过以下方式进行验证:
$ ldd /some/oracle/bin/foo
linux-vdso.so.1 => (0x00007fff9f3fe000)
/some/oracle/lib/libmemcpy-2.14.so (0x00007f963a63e000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f963a428000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f963a20c000)
librt.so.1 => /lib64/librt.so.1 (0x00007f963a003000)
libc.so.6 => /lib64/libc.so.6 (0x00007f9639c42000)
/lib64/ld-linux-x86-64.so.2 (0x00007f963aa5b000)
这对我起作用了,希望对你也有用。
realpath
和memcpy
曾经引起注意并需要更正。而且,在变更日志中阅读、比较源代码并找到旧版本符合预期的内容并没有真正的问题... - 0xC0000022L