Ошибка неопределенный скрытый символ «__dso_дескриптор » не может использоваться при создании общего объекта

#yocto

#йокто

Вопрос:

Yocto 3.4 потерпел неудачу при компиляции glibc 2.34.

Я думаю, что ошибка происходит на этапе связывания:

 | /mnt/DATA/build/tmp/work/core2-64-poky-linux/glibc/2.34-r0/recipe-sysroot-native/usr/bin/x86_64-poky-linux/../../libexec/x86_64-poky-linux/gcc/x86_64-poky-linux/11.2.0/ld.bfd: /mnt/DATA/build/tmp/work/core2-64-poky-linux/glibc/2.34-r0/build-x86_64-poky-linux/malloc/libc_malloc_debug_pic.a(malloc-debug.os): in function `do_mtrace': | /usr/src/debug/glibc/2.34-r0/git/malloc/mtrace-impl.c:201: undefined reference to `__dso_handle' | /mnt/DATA/build/tmp/work/core2-64-poky-linux/glibc/2.34-r0/recipe-sysroot-native/usr/bin/x86_64-poky-linux/../../libexec/x86_64-poky-linux/gcc/x86_64-poky-linux/11.2.0/ld.bfd: /mnt/DATA/build/tmp/work/core2-64-poky-linux/glibc/2.34-r0/build-x86_64-poky-linux/malloc/libc_malloc_debug_pic.a(malloc-debug.os): relocation R_X86_64_PC32 against undefined hidden symbol `__dso_handle' can not be used when making a shared object | /mnt/DATA/build/tmp/work/core2-64-poky-linux/glibc/2.34-r0/recipe-sysroot-native/usr/bin/x86_64-poky-linux/../../libexec/x86_64-poky-linux/gcc/x86_64-poky-linux/11.2.0/ld.bfd: final link failed: bad value | collect2: error: ld returned 1 exit status | make[2]: *** [../Makerules:536: /mnt/DATA/build/tmp/work/core2-64-poky-linux/glibc/2.34-r0/build-x86_64-poky-linux/malloc/libc_malloc_debug.so] Error 1 | make[2]: Leaving directory '/mnt/DATA/build/tmp/work/core2-64-poky-linux/glibc/2.34-r0/git/malloc' | make[1]: *** [Makefile:498: malloc/others] Error 2 | make[1]: Leaving directory '/mnt/DATA/build/tmp/work/core2-64-poky-linux/glibc/2.34-r0/git' | make: *** [Makefile:9: all] Error 2 | ERROR: oe_runmake failed | WARNING: exit code 1 from a shell command. ERROR: Task (/mnt/DATA/build/../poky/meta/recipes-core/glibc/glibc_2.34.bb:do_compile) failed with exit code '1'  

Что касается «__dso_handle», это связано с созданием общих объектов.

Я не понимаю, в чем причина ошибки. Какая-нибудь идея может помочь?

Фрагмент кода для этой ошибки:

 {  static int added_atexit_handler;  char *mallfile;   /* Don't panic if we're called more than once. */  if (mallstream != NULL)  return;   mallfile = secure_getenv (mallenv);  if (mallfile != NULL)  {  char *mtb = malloc (TRACE_BUFFER_SIZE);  if (mtb == NULL)  return;   mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null", "wce");  if (mallstream != NULL)  {  /* Be sure it doesn't malloc its buffer! */  malloc_trace_buffer = mtb;  setvbuf (mallstream, malloc_trace_buffer, _IOFBF, TRACE_BUFFER_SIZE);  fprintf (mallstream, "= Startn");  if (!added_atexit_handler)  {  added_atexit_handler = 1;  __cxa_atexit ((void (*)(void *))release_libc_mem, NULL,  __dso_handle);  }  __malloc_debug_enable (MALLOC_MTRACE_HOOK);  }  else  free (mtb);  } }  

Комментарии:

1. Я попробовал с «-fno-use-cxa-atexit». Но это не работает!

Ответ №1:

Я попытался использовать определение в dso_handle.h, как показано ниже:

 void *__dso_handle __attribute__((weak)) = NULL;  

Но в моем случае это не сработало.

Ошибка выглядела так, как будто произошла из-за совместимости gcc.

И мое решение таково

Я обновил версию gcc узла сборки (gt;= 7.5.0), затем очистил и перестроил gt;glibc. И результат в порядке.