При связывании программы с gcc в Linux или OSX, как я могу понять, как она вызывается при использовании -l - PullRequest
1 голос
/ 12 августа 2010

Имя файла, который содержит lib и имя, используемое в -l, не всегда совпадают. Так, как я могу выяснить имя, используемое при связывании? Обычно я гуглил, но это должно быть где-то в системе, я думаю ..

Ответы [ 3 ]

2 голосов
/ 12 августа 2010

Мой ответ немного грязный, извините за это.Я почти уверен, что есть лучшее решение, но оно, тем не менее, должно помочь.

Во время компоновки AFAIK компоновщик ищет все пути к библиотекам, о которых он знает, и ищет имя библиотеки, зависящее от архива, в Linux "-Я foo "будет искать" libfoo.so ", на Mac" libfoo.dylib ".Теперь, если вы посмотрите, например, в / usr / lib, вы заметите, что есть много символических ссылок.Например, если у вас есть libfoo.so.1.2.3, там также должны быть символические ссылки libfoo.so.1.2 -> libfoo.so.1.2.3, libfoo.so.1 -> libfoo.so.1.2 и libfoo.so -> libfoo.so.1.Идея заключается в поддержке различных версий.Поэтому, если вам нужно знать, какой файл используется, я предлагаю вам сделать это:

Добавьте «-v» к своим LDFLAGS или непосредственно к вашему вызову gcc.Это приведет к шумному выводу gcc, интересным является вызов «collect2».Он имеет различные аргументы -L ... и это каталоги, которые компоновщик ищет в библиотеках.Вы также увидите -l ... (строчные буквы).Вам нужно заглянуть в каталоги -L для библиотек, указанных в -l, и следовать их символическим ссылкам.

Если вам нужно знать, какая библиотека используется во время выполнения: это намного проще.Просто запустите ldd some_program, он скажет вам, какие библиотеки используются.Он на самом деле вызывает программу, так что динамический компоновщик запускается, но передает переменную окружения, которая заставляет компоновщик распечатать то, что он загрузил, и выйти из программы, даже не запустив ее.На Mac используйте otool -L some_program.

. Для работающей программы вам нужно узнать PID программы.Тогда сделай cat /proc/pid_of_program/maps.Это дает вам карту памяти.Интересной частью является правая колонка, в которой перечислены загруженные библиотеки (потому что они попадают в процесс mmap).Я не знаю эквивалента для этого на Mac.

1 голос
/ 21 марта 2011

Лучший способ увидеть, что здесь происходит, - это посмотреть, какими именно файлами манипулирует gcc (и компилятор, и компоновщик):

strace -f -e trace = open -o strace_output (your_gcc_command)

'-f' необходим для отслеживания дочерних процессов, поскольку именно так работает gcc. Я считаю этот метод чрезвычайно полезным, поскольку я могу точно определить, какие библиотеки компоновщик объединяет в мой исполняемый файл. Я только хотел бы, чтобы 'gcc -v' был таким многословным.

0 голосов
/ 12 августа 2010

Просто введите man gcc в командной строке, чтобы получить страницу руководства для gcc.Он подробно описывает, что делает опция -l.Если gcc использует ld в качестве компоновщика, просто наберите man ld для получения дополнительной информации.Например, в моей системе Linux последний говорит:

-lnamespec
--library = namespec

Добавить архив или объектный файл, указанный в namespec, в список файлов для ссылки,Эта опция может использоваться любое количество раз.Если namespec имеет вид: filename, ld будет искать путь к библиотеке для файла с именем filename, иначе он будет искать путь к библиотеке для файла с именем libnamespec.a.

В системах, которые поддерживают общие библиотеки, ldможет также искать файлы, отличные от libnamespec.a.В частности, в системах ELF и SunOS ld будет искать в каталоге библиотеку libnamespec.so, прежде чем искать библиотеку libnamespec.a.(По соглашению расширение «.so» указывает на разделяемую библиотеку.) Обратите внимание, что это поведение не применяется к: filename, который всегда указывает файл с именем filename.

Copyright (c) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.

Разрешено копирование,распространять и / или изменять этот документ в соответствии с условиями GNU Free Documentation License , версии 1.3 или любой более поздней версии, опубликованной Free Software Foundation;без инвариантных разделов, без текстов передней обложки и без текстов задней обложки.

Также обратите внимание, что в OSX, если вы установите переменные окружения RC_TRACE_ARCHIVES и RC_TRACE_DYLIBS, тогда ldпечатать много полезной информации отладки.Это может быть полезно, если вы берете не ту библиотеку во время сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...