miniconda gcc 如何处理 glibc 名称解析?

How does miniconda gcc handle glibc name resolution?

提问人:Xiaoyong Guo 提问时间:11/15/2023 最后编辑:Xiaoyong Guo 更新时间:11/15/2023 访问量:24

问:

我在 miniconda env 中安装了 gcc 12.2。在 conda env 中,有一个 sysroot 目录,其中包含指向 .在我的系统目录中,还有指向 .libc.so.6libc-2.12.so/lib64/libc.so.6libc-2.28.so

我知道它没有版本化符号,并且这个符号确实存在于 中。libc-2.12.somemcpy@GLIBC_2.14libc-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 9GNU libc version: 2.28

案例 2:如果启用符号版本控制,

 $GCC -DUSE_VERSION -DN=9 main.c

编译器失败,并显示错误 MSG 。由于系统有这个符号,但在 conda env 中没有。 所以在我看来,在编译时,编译器使用 conda env 。undefined reference to memcpy@GLIBC_2.14libc.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

所以这是我的问题:

  1. 为什么 conda gcc 不链接到 conda ?编译后的二进制文件链接到系统。libc.so.6libc.so.6
  2. 从我的实验来看,conda gcc 似乎链接到系统,但使用 conda 解析符号名称,这是真的吗?如果属实,为什么?libc.so.6libc.so.6
gcc linker-errors glibc miniconda

评论


答: 暂无答案