告诉哪个版本的符号可用于链接(在 libc 中)?
Tell which version of symbols are available for linking against (in libc)?
好的,所以我想link针对较低版本的libc / glibc,以实现兼容性。我注意到这个关于如何根据具体情况执行此操作的答案:
How can I link to a specific glibc version?
然而,当我尝试自己应用它时,我 运行 遇到了问题,因为我无法弄清楚我应该使用哪个较低版本号来 link 。使用答案中的示例,如果我使用 "nm" 检查我的 /lib/libc.so.6 提供的符号(在我的例子中,它是 libc-2 的 link。 17.so), 我看貌似提供realpath的2.0和2.3版本:
> nm /lib/libc.so.6 | grep realpath@
4878d610 T realpath@@GLIBC_2.3
48885c20 T realpath@GLIBC_2.0
但是,如果我尝试 link 反对 realpath@GLIBC_2.0:
__asm__(".symver realpath,realpath@GLIBC_2.0");
...我得到一个错误:
> gcc -o test_glibc test_glibc.c
/tmp/ccMfnLmS.o: In function `main':
test_glibc.c:(.text+0x25): undefined reference to `realpath@GLIBC_2.0'
collect2: error: ld returned 1 exit status
但是,使用 realpath@GLIBC_2.3 有效...示例中的代码 realpath@GLIBC_2.2.5 有效 - 尽管根据 nm,不存在这样的符号. (仅供参考,如果我在没有任何 __asm__
指令的情况下进行编译,然后使用 nm 检查,我发现它 link 反对 realpath@GLIBC_2.3,这是有道理的;我确认 link转至 realpath@GLIBC_2.2.5 有效。)
所以,我的问题是,我怎么知道我可以 link 反对哪个版本的各种功能?甚至哪些可用?还有其他一些我应该喂给 nm 的 kwargs 吗?我检查错图书馆了吗?
谢谢!
在我看来,您有点混淆了库和二进制文件...
大多数 Linux 发行版上的 /lib/libc.so.6
是一个 32 位共享对象,应该包含 *@GLIBC_2.0
符号。不过,如果您在 x86_64 平台上,我希望 GCC 默认生成 64 位二进制文件。 64 位二进制文件通常链接到 /lib64/libc.so.6
,它不包含旧 glibc 版本(如 2.0)的兼容性符号 - x86_64 架构当时甚至不存在...
尝试使用 -m32
GCC 标志编译您的 *@GLIBC_2.0
程序以强制链接到 32 位 C 库。
好的,所以我想link针对较低版本的libc / glibc,以实现兼容性。我注意到这个关于如何根据具体情况执行此操作的答案:
How can I link to a specific glibc version?
然而,当我尝试自己应用它时,我 运行 遇到了问题,因为我无法弄清楚我应该使用哪个较低版本号来 link 。使用答案中的示例,如果我使用 "nm" 检查我的 /lib/libc.so.6 提供的符号(在我的例子中,它是 libc-2 的 link。 17.so), 我看貌似提供realpath的2.0和2.3版本:
> nm /lib/libc.so.6 | grep realpath@
4878d610 T realpath@@GLIBC_2.3
48885c20 T realpath@GLIBC_2.0
但是,如果我尝试 link 反对 realpath@GLIBC_2.0:
__asm__(".symver realpath,realpath@GLIBC_2.0");
...我得到一个错误:
> gcc -o test_glibc test_glibc.c
/tmp/ccMfnLmS.o: In function `main':
test_glibc.c:(.text+0x25): undefined reference to `realpath@GLIBC_2.0'
collect2: error: ld returned 1 exit status
但是,使用 realpath@GLIBC_2.3 有效...示例中的代码 realpath@GLIBC_2.2.5 有效 - 尽管根据 nm,不存在这样的符号. (仅供参考,如果我在没有任何 __asm__
指令的情况下进行编译,然后使用 nm 检查,我发现它 link 反对 realpath@GLIBC_2.3,这是有道理的;我确认 link转至 realpath@GLIBC_2.2.5 有效。)
所以,我的问题是,我怎么知道我可以 link 反对哪个版本的各种功能?甚至哪些可用?还有其他一些我应该喂给 nm 的 kwargs 吗?我检查错图书馆了吗?
谢谢!
在我看来,您有点混淆了库和二进制文件...
大多数 Linux 发行版上的/lib/libc.so.6
是一个 32 位共享对象,应该包含 *@GLIBC_2.0
符号。不过,如果您在 x86_64 平台上,我希望 GCC 默认生成 64 位二进制文件。 64 位二进制文件通常链接到 /lib64/libc.so.6
,它不包含旧 glibc 版本(如 2.0)的兼容性符号 - x86_64 架构当时甚至不存在...
尝试使用 -m32
GCC 标志编译您的 *@GLIBC_2.0
程序以强制链接到 32 位 C 库。