提问人:Xiaoyong Guo 提问时间:11/15/2023 最后编辑:Xiaoyong Guo 更新时间:11/15/2023 访问量:24
miniconda gcc 如何处理 glibc 名称解析?
How does miniconda gcc handle glibc name resolution?
问:
我在 miniconda env 中安装了 gcc 12.2。在 conda env 中,有一个 sysroot 目录,其中包含指向 .在我的系统目录中,还有指向 .libc.so.6
libc-2.12.so
/lib64/libc.so.6
libc-2.28.so
我知道它没有版本化符号,并且这个符号确实存在于 中。libc-2.12.so
memcpy@GLIBC_2.14
libc-2.28.so
我使用以下 C 代码进行了一个简单的测试。
// main.c file
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <gnu/libc-version.h>
#ifdef USE_VERSION
__asm__(".symver memcpy,memcpy@GLIBC_2.14");
#endif
int main(int argc, char *argv[]) {
char buf1[10];
const char buf2[N] = "ok, good";
memcpy(buf1, buf2, sizeof(buf1)); // N is a macro defined in command line
printf("GNU libc version: %s\n", gnu_get_libc_version());
exit(EXIT_SUCCESS);
}
案例 1:运行以下命令
$GCC -DN=9 main.c
发出警告 (),但编译并运行。程序打印 ,这意味着运行时的可执行文件与系统 libc.so.6 链接。reading 10 bytes from a region of size 9
GNU libc version: 2.28
案例 2:如果启用符号版本控制,
$GCC -DUSE_VERSION -DN=9 main.c
编译器失败,并显示错误 MSG 。由于系统有这个符号,但在 conda env 中没有。
所以在我看来,在编译时,编译器使用 conda env 。undefined reference to memcpy@GLIBC_2.14
libc.so.6 (v2.28)
libc.so.6 (v2.12)
libc.so.6 (v2.12)
案例 3:如果我启用符号版本控制并将 N 设置为 10 或更大。
$GCC -DUSE_VERSION -DN=10 main.c
它在没有任何警告/错误的情况下编译并运行,输出是 .GNU libc version: 2.28
所以这是我的问题:
- 为什么 conda gcc 不链接到 conda ?编译后的二进制文件链接到系统。
libc.so.6
libc.so.6
- 从我的实验来看,conda gcc 似乎链接到系统,但使用 conda 解析符号名称,这是真的吗?如果属实,为什么?
libc.so.6
libc.so.6
答: 暂无答案
评论