Отсутствуют символы GDB - libc заявил, что он не соответствует библиотеке или версии не соответствует - PullRequest
0 голосов
/ 30 января 2019

У меня возникают проблемы с отображением правильных символов отладки на обратной трассировке в GDB в кросс-скомпилированной системе ARM, построенной с использованием Yocto.

abc.c - это простой printf ("Hello world \ n");Программа на C (ничего сложного).На компьютере сборки:

> yocto-dir/build/tmp-angstrom-glibc/sysroots/x86_64-linux/usr/bin/arm-angstrom-linux-gnueabi/arm-angstrom-linux-gnueabi-gcc abc --sysroot=yocto-dir/build/tmp-angstrom-glibc/sysroots/imx28scm -g -O0 -o abc
> scp abc root@DEVICE-IP:~

На цели ARM:

> gdbserver :2345 abc

Запустить GDB на компьютере сборки (из установленного Yocto SDK):

> /usr/local/oecore-x86_64/sysroots/x86_64-angstromsdk-linux/usr/bin/arm-angstrom-linux-gnueabi/arm-angstrom-linux-gnueabi-gdb abc
GNU gdb (Linaro GDB) 7.8-2014.09
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-angstromsdk-linux --target=arm-angstrom-linux-gnueabi".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://bugs.linaro.org>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from abc...done.
(gdb) target remote DEVICE-IP:2345
Remote debugging using DEVICE-IP:2345
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
Cannot access memory at address 0x0
0x4ae90a20 in ?? ()
(gdb) bt
#0  0x4ae90a20 in ?? ()
#1  0x00000000 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) set sysroot yocto-dir/build/tmp-angstrom-glibc/sysroots/imx28scm
Reading symbols from yocto-dir/build/tmp-angstrom-glibc/sysroots/imx28scm/lib/ld-linux.so.3...done.
Loaded symbols for yocto-dir/build/tmp-angstrom-glibc/sysroots/imx28scm/lib/ld-linux.so.3
Cannot access memory at address 0x0

После установки sysroot он по-прежнему не дает символов.

(gdb) bt
#0  0x4ae90a20 in ?? ()
#1  0x00000000 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) b main
Breakpoint 1 at 0x84a8: file abc.c, line 5.
(gdb) c
Continuing.

Breakpoint 1, main () at abc.c:5
5      printf("Hello world\n");

Хорошо, когда он достигает точки останова, он отображает символы.

(gdb) bt
Cannot access memory at address 0x0
#0  main () at abc.c:5

Однако, он выходит за пределы странного шага.там.

(gdb) n
Cannot access memory at address 0x1
0x4aea6ea0 in ?? ()
(gdb) bt
#0  0x4aea6ea0 in ?? ()
#1  0x0000a014 in do_lookup_unique (Cannot access memory at address 0x1
undef_map=0x1, ref=0x0, strtab=0x56ebb27 <error: Cannot access memory at address 0x56ebb27>, sym=0x84a0 <main>, type_class=-1224757248, result=0x1, map=<optimized out>, 
    new_hash=<optimized out>, undef_name=<optimized out>) at /usr/src/debug/glibc/2.24-r0/git/elf/dl-lookup.c:332
#2  do_lookup_x (undef_name=<optimized out>, new_hash=<optimized out>, old_hash=<optimized out>, ref=0x0, result=<optimized out>, scope=0x177ff8e, i=<optimized out>, version=<optimized out>, 
    flags=-1224757248, skip=0x1, type_class=100, undef_map=0x1) at /usr/src/debug/glibc/2.24-r0/git/elf/dl-lookup.c:544
#3  0x4aec0b10 in ?? ()
Cannot access memory at address 0x1
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Не удается найти нужную версию libc.so.6.

(gdb) info sharedlibrary
warning: .dynamic section for "yocto-dir/build/tmp-angstrom-glibc/sysroots/imx28scm/lib/libc.so.6" is not at the expected address (wrong library or version mismatch?)
From        To          Syms Read   Shared Object Library
0x000007d0  0x0001bee0  Yes         yocto-dir/build/tmp-angstrom-glibc/sysroots/imx28scm/lib/ld-linux.so.3
0x4aee73c0  0x4afe2018  No          yocto-dir/build/tmp-angstrom-glibc/sysroots/imx28scm/lib/libc.so.6
(gdb) n
Cannot find bounds of current function

Не дает идеального опыта отладки.

Существует gcc внутри sysroot yocto-dir (как использовано выше), а также в / usr / local / oecore-x86_64.Они оба ведут себя одинаково./ Usr / local / oecore-x86_64 SDK только что собран и установлен.

Точно так же есть sysroot imx28scm внутри yocto-dir (как использовалось выше), а также в / usr / local / oecore-x86_64, и они оба ведут себя одинаково. Однако у них явно есть разные версии libc.so.6 - yocto-dir имеет размер 14,8 МБ, а / usr / local / oecore-x86_64 - 1,3 МБ. Это вызывает беспокойство, однако установка любого изэти места, так как sysroot не решает проблему.

Один из способов - связать с -static.В этом случае GDB дает символы:

(gdb) target remote DEVICE-IP:2345
Remote debugging using DEVICE-IP:2345
_start () at ../sysdeps/arm/start.S:79
79  ../sysdeps/arm/start.S: No such file or directory.
(gdb) set sysroot yocto-dir/build/tmp-angstrom-glibc/sysroots/imx28scm
(gdb) bt
#0  _start () at ../sysdeps/arm/start.S:79
(gdb) b main
Breakpoint 1 at 0x8480: file abc.c, line 5.
(gdb) c
Continuing.

Breakpoint 1, main () at abc.c:5
5      printf("Hello world\n");
(gdb) n
6      return 0;
(gdb) n
7   }

Связывание с -Wl,--verbose, кажется, показывает, что оно связывается с библиотекой в ​​ожидаемом sysroot:

yocto-dir/build/tmp-angstrom-glibc/sysroots/x86_64-linux/usr/libexec/arm-angstrom-linux-gnueabi/gcc/arm-angstrom-linux-gnueabi/6.2.1/ld: Attempt to open yocto-dir/build/tmp-angstrom-glibc/sysroots/imx28scm/lib/libc.so.6 succeeded

Компоновщик также находит этоодин, но он не упоминается как libc.so.6, так что, вероятно, это не мешает.

yocto-dir/build/tmp-angstrom-glibc/sysroots/x86_64-linux/usr/libexec/arm-angstrom-linux-gnueabi/gcc/arm-angstrom-linux-gnueabi/6.2.1/ld: Attempt to open yocto-dir/build/tmp-angstrom-glibc/sysroots/imx28scm/usr/lib/libc.so succeeded

Почему в этом случае несовпадение версий библиотеки?Как я могу заставить GDB отображать символы из библиотеки, которую он ожидает? Я не хочу связывать статически.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Очевидно, что у цели GDB для ARM есть проблема с попыткой загрузки символов перед main () ( Отладка общих библиотек с помощью gdbserver ):

У меня была проблема с остановкой gdbserverв динамическом загрузчике, прежде чем main, и динамические библиотеки еще не загружены в этот момент, и поэтому GDB еще не знает, куда будут помещаться символы в памяти.

GDB, похоже, имеет некоторые механизмы для автоматической загрузкисимволы разделяемой библиотеки, и если я скомпилирую для хоста и запустлю gdbserver локально, запуск на main не нужен.Но для цели ARM это наиболее надежная вещь.

Поэтому установите ее так, чтобы она загружала общие символы после нажатия main:

> b main
> c
  <breakpoint hit>
> set sysroot <sysroot>

Или перезагрузитесимволы после того, как вы нажмете main.

> set sysroot <sysroot>
...
> b main
> c
  <breakpoint hit>
> nosharedlibrary
> sharedlibrary

Или может быть полезно при взаимодействии с отладчиками IDE установить автоматическую загрузку символов, которые будут отключены при запуске GDB:

> set auto-solib-add off
0 голосов
/ 30 января 2019

Пожалуйста, убедитесь, что libc в коробке такой же, как и на вашем сервере сборки.извините, это должны быть комментарии, но в настоящее время у меня недостаточно репутации.

...