Проблема g++ и gdb: символы отладки для общих библиотек не найдены
Я портирую большой набор приложений и библиотек с Debian 7 на Ubuntu 16.04. Это проект автоинструментов GNU, поэтому задействован libtool. GDB не может найти символы для большинства общих библиотек, хотя я строю с опциями, которые всегда работали для меня раньше. Мне интересно, сталкивался ли кто-нибудь еще с этой проблемой, и если да, то какие рекомендации они могли бы дать.
Я использую версию GDB Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1.
Я компилирую с -g O0 и другими опциями компилятора. Эти параметры последовательно используются при создании 12 библиотек. Именно один из них возникает в процессе сборки с отладочными символами. Мы обозначим эту одну либу. (В обсуждении ниже, это просто замена пути проекта.)
Оставляя много директив -I, используются следующие опции:
-g -O0 -Wconversion -Woverloaded-virtual -Wall -Werror -Wreturn-type -
Wformat -Wparentheses -Wswitch -Wno-deprecated -Wsign-compare -fno-
strict-aliasing -Wunused -D__STDC_LIMIT_MACROS -MT MyModule.lo -MD -MP
-MF .deps/MyModule.Tpo -fPIC -DPIC -o .libs/MyModule.o
Когда я смотрю на libA, используя gdb, file и другие утилиты, это выглядит нормально.
u16dev01:(18:01:32):file libA.so.0.0.0 ~/dev/product-
<path>lib/liba/.libs
libA.so.0.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
dynamically linked,
BuildID[sha1]=14dc765142914be4c32a07eaa1683b5b2a2f6dae, not stripped
Объектные файлы выглядят так:
u16dev01:(18:01:43):file AModule1.o
<path>/lib/liba/.libs
AModule1.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not
stripped
Если я открываю общую библиотеку с помощью gdb, у меня есть символы, и я могу перечислить код. Если я открываю любой из его.o файлов с помощью GDB, я получаю символы и могу перечислить код.
Из оставшихся 11 команда file сообщает, что два - SYSV, а остальные 9 - GNU/Linux, например:
u16dev01:(18:08:34):file libD.so.0.0.0
~/<path>/lib/.libs
libD.so.0.0.0: ELF 64-bit LSB shared object, x86-64,
version 1 (GNU/Linux), dynamically linked,
BuildID[sha1]=059733fbc888c3dce86eae21984ea82cddc5b0e9, not stripped
GDB не видит символов, когда я открываю эту библиотеку или любой из ее файлов.o. Команда file также сообщает GNU / Linux для файлов.o. Там нет символов.
Есть две библиотеки, которые представляют отчеты как SYSV. Их файлы.o также не содержат отладочной информации, как и библиотеки.
Я переименовал программу стриптиза, чтобы исключить возможность запуска Makefile-ов полосы, хотя тщательный поиск выходных данных компилятора показал, что это не так. Так что это не тот случай, когда символы удаляются после сборки библиотеки.
Я попытался создать небольшую тестовую библиотеку, используя параметры компиляции моего проекта. Он создает библиотеку SYSV и GDB прекрасно загружает символы отладки.
Выходные данные objdump -g редки в тех случаях, когда gdb не может загружать символы.
Я и пара моих коллег уже несколько дней ломаем голову над этим. Почему процедура сборки производит жизнеспособные символы только для одной из библиотек? В этой библиотеке нет ничего особенного. Почему 9 из оставшихся 11 сообщили о GNU / Linux и 2 о SYSV? Почему у этих двоих тоже нет символов?
Любые идеи будут очень цениться.
2 ответа
В конечном итоге проблема была обнаружена в устаревшем пользовательском макросе m4. Он не смог обнаружить библиотечный пакет и сократил свой вклад в переменные, которые были записаны в Makefile.in для включаемых путей. В результате был -I без пути в последовательности многих -I директив. Как ни странно, это не вызывало ошибок... но, похоже, оно вызывало опцию -g, которая сразу же следовала за ней, чтобы "проглотить". (Результатом стал длинный список путей -I, который заканчивался на "-I -g". Похоже, это не позволило g++ обработать опцию -g.).
Исправление ошибочного макроса m4 для получения непустого и правильного пути к включаемому файлу устранило проблему.
Вам нужно использовать -g в вашей команде компиляции. См. Справочную страницу для gcc в разделе "Параметры отладки вашей программы" У них есть некоторые предостережения при использовании опции -O.