Как мне сказать gcc (или ld) ссылаться на отладочные версии стандартных библиотек c и c ++ - PullRequest
4 голосов
/ 02 июля 2010

У меня есть отладочные версии libstdc ++ и libc, среди прочего, и я хотел бы дать ссылку на них. Они живут в / usr / lib / debug, а не в / usr / lib. Есть идеи?

Ответы [ 3 ]

5 голосов
/ 12 октября 2017

Я считаю, что принятый ответ вводит в заблуждение, поскольку библиотеки в /usr/lib/debug не являются откомпилированной (-g -O0 ...) версией библиотек в /lib, /usr/lib, а просто отладочными символами, удаленными изсоответствующая библиотека в /lib, /usr/lib.См. Объяснение принятых ответов на Как использовать отладочную версию libc и для Как связать с отладочными версиями libc и libstdc ++ в GCC? подробнее.

Цитаты:

Библиотеки в /usr/lib/debug не являются реальными библиотеками.Скорее, они содержат только отладочную информацию, но не содержат .text или .data разделов реального libc.so.6

и

Во многих Linuxустановки библиотеки отладки не содержат реального кода;они содержат только отладочную информацию.Они разделены, так что вы можете не устанавливать их, если они вам не нужны, и вам не хватает места на диске, но библиотеки отладки сами по себе не годятся.

Проверьте себяс:

objdump -h /usr/lib/debug/lib/x86_64-linux-gnu/libc-2.19.so | grep -C1 text
 11 .text         001488a3  000000000001f520  000000000001f520  000002b4  2**4
                  ALLOC, READONLY, CODE

Сегмент .text равен ALLOC, но без CONTENTS.Сравните с соответствующей библиотекой в ​​/lib/x86_64-linux-gnu/libc-2.19.so:

$ objdump -h /lib/x86_64-linux-gnu/libc-2.19.so | grep -C1 text
 11 .text         001488a3  000000000001f520  000000000001f520  0001f520  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
3 голосов
/ 02 июля 2010

Предполагая Linux,

  1. Статические библиотеки: добавьте -L/usr/lib/debug в командную строку компоновщика. gcc / ld будет выглядеть там до системных каталогов по умолчанию. Используйте команду ldd, чтобы убедиться, что с правильными версиями библиотеки связаны (только для общих библиотек).
  2. Общие библиотеки: установите LD_LIBRARY_PATH=usr/lib/debug, и ваше приложение будет получать библиотеки оттуда даже без шага 1, если есть версия библиотеки, что весьма вероятно, если вы устанавливаете с помощью менеджера пакетов дистрибутива. 1011 *

Это хорошая идея сделать и то и другое, поскольку некоторые библиотеки могут быть только в статической форме.

0 голосов
/ 18 апреля 2017

Использовать флаги компоновщика. ld / gcc -L<LIBRARY_PATH> важен только для времени ссылки, независимо от общего или статического , вы не можете связать библиотеку, если компоновщик не может ее найти.

Для разделяемых библиотек переменная окружения LD_LIBRARY_PATH важна для времени запуска. Загрузчик динамических библиотек ld.so и ld-linux.so будет искать их при запуске приложения.

...