3.13 Варианты для связывания
Эти параметры применяются, когда компилятор связывает объектные файлы в выходной исполняемый файл. Они бессмысленны, если компилятор не выполняет этап связывания.
- object-file-name
- Имя файла, не заканчивающееся специальным распознаваемым суффиксом, считается именем файла объектного модуля или библиотеки. (Объектные файлы отличаются от библиотек линковщиком в соответствии с содержимым файла.) Если выполняется линковка, эти объектные файлы используются в качестве входных данных для линковщика.
-
-c-S-E - Если используется любой из этих параметров, то линковщик не запускается, и имена файлов объектных модулей не должны использоваться в качестве аргументов. См. Основные параметры.
-
-llibrary-llibrary - Искать библиотеку с именем library при линковке. (Второй вариант с библиотекой в качестве отдельного аргумента предназначен только для соответствия POSIX и не рекомендуется.)
Важен порядок указания этого параметра в команде; линковщик обрабатывает библиотеки и объектные файлы в том порядке, в котором они указаны. Таким образом, ‘
foo.o -lz bar.o’ ищет библиотеку ‘z’ после файлаfoo.oно передbar.o. Еслиbar.oссылается на функции в ‘z’, эти функции могут не загрузиться.Линковщик ищет библиотеку в стандартном списке каталогов, которая фактически является файлом с именем liblibrary.a. Затем линковщик использует этот файл так, как если бы он был указан точно по имени.
Используемые каталоги включают несколько стандартных системных каталогов плюс любые, которые вы указываете с помощью
-L.Обычно найденные файлы являются библиотеками — архивными файлами, члены которых являются объектами. Линковщик обрабатывает архивный файл, сканируя его на наличие членов, которые определяют символы, на которые до сих пор ссылались, но не были определены. Но если найден обычный объектный файл, он подключается стандартным способом. Единственное различие между использованием параметра
-lи указанием имени файла заключается в том, что-lокружает library строками ‘lib’ и ‘.a’ и ищет в нескольких каталогах. -lobjc- Этот специальный случай параметра
-lнеобходим для линковки программы Objective-C или Objective-C++. -nostartfiles- Не используйте стандартные системные файлы запуска при линковке. Стандартные системные библиотеки используются обычно, если не используется
-nostdlibили-nodefaultlibs. -nodefaultlibs- Не использовать стандартные системные библиотеки при линковке. Только указанные вами библиотеки передаются линковщику, а параметры, определяющие линковку системных библиотек, такие как
-static-libgccили-shared-libgcc, игнорируются. Стандартные файлы запуска используются обычно, если не используется-nostartfiles.Компилятор может сгенерировать вызовы
memcmp,memset,memcpyиmemmove. Эти записи обычно разрешаются записями в libc. Эти точки входа должны быть предоставлены через какой-либо другой механизм, когда указан этот параметр. -nostdlib- Не использовать стандартные системные файлы запуска или библиотеки при линковке. Никаких файлов запуска и только указанные вами библиотеки передаются линковщику, а параметры, определяющие линковку системных библиотек, такие как
-static-libgccили-shared-libgcc, игнорируются.Компилятор может сгенерировать вызовы
memcmp,memset,memcpyиmemmove. Эти записи обычно разрешаются записями в libc. Эти точки входа должны быть предоставлены через какой-либо другой механизм, когда указан этот параметр.Одной из стандартных библиотек, пропущенных
-nostdlibи-nodefaultlibs, являетсяlibgcc.a, библиотека внутренних подпрограмм, которую GCC использует для преодоления недостатков конкретных машин или особых потребностей некоторых языков. (См. Интеграция с выводом GCC для более подробного обсужденияlibgcc.a.) В большинстве случаев вам нуженlibgcc.a, даже если вы хотите избежать использования других стандартных библиотек. Другими словами, когда вы указываете-nostdlibили-nodefaultlibs, вам обычно следует указать также-lgcc. Это гарантирует отсутствие неразрешенных ссылок на внутренние подпрограммы библиотеки GCC. (Примеры такой внутренней подпрограммы — ‘__main’, используемая для обеспечения вызова конструкторов C++; см.collect2.) -pie- Создать позиционно-независимый исполняемый файл на целевых системах, которые его поддерживают. Для предсказуемых результатов вы также должны указать тот же набор параметров, используемых для компиляции (
-fpie,-fPIE, или параметры модели), когда вы указываете этот параметр линковщика. -rdynamic- Передать флаг
-export-dynamicлинковщику ELF на целевых системах, которые его поддерживают. Это указывает линковщику добавить все символы, а не только используемые, в таблицу динамических символов. Этот параметр необходим для некоторых примененийdlopenили для возможности получения трассировок изнутри программы. -s- Удалить всю информацию о таблице символов и перемещениях из исполняемого файла.
-static- В системах, поддерживающих динамическую линковку, это предотвращает линковку с общими библиотеками. В других системах этот параметр не влияет.
-shared- Создать общий объект, который затем можно связать с другими объектами для создания исполняемого файла. Не все системы поддерживают этот параметр. Для предсказуемых результатов вы также должны указать тот же набор параметров, используемых для компиляции (
-fpic,-fPIC, или параметры модели), когда вы указываете этот параметр линковщика.1 -
-shared-libgcc-static-libgcc - В системах, которые предоставляют
libgccкак общую библиотеку, эти параметры принудительно используют либо общую, либо статическую версию, соответственно. Если общая версияlibgccне была построена при конфигурации компилятора, эти параметры не оказывают никакого влияния.Есть несколько ситуаций, в которых приложение должно использовать общую
libgccвместо статической версии. Наиболее распространённый случай — когда приложение хочет бросать и перехватывать исключения через разные общие библиотеки. В этом случае каждая из библиотек, а также само приложение должны использовать общуюlibgcc.Поэтому драйверы G++ и GCJ автоматически добавляют
-shared-libgccпри построении общей библиотеки или основного исполняемого файла, так как программы C++ и Java обычно используют исключения, поэтому это правильное решение.Если вы используете драйвер GCC для создания общих библиотек, вы можете обнаружить, что они не всегда связаны с общей
libgcc. Если GCC обнаружит при конфигурации, что у вас не-GNU линковщик или GNU линковщик, который не поддерживает параметр--eh-frame-hdr, он по умолчанию связывает общую версиюlibgccв общие библиотеки. В противном случае он использует линковщик и оптимизирует связывание с общей версиейlibgcc, подключая статическую версию libgcc по умолчанию. Это позволяет исключениям распространяться через такие общие библиотеки без затрат на перебазирование во время загрузки библиотеки.Однако, если библиотека или основной исполняемый файл должны бросать или перехватывать исключения, вы должны связать их с помощью драйвера G++ или GCJ, соответственно языку, используемому в программе, или с помощью параметра
-shared-libgcc, таким образом, что он связан с общейlibgcc. -static-libasan- Когда используется параметр
-fsanitize=addressдля линковки программы, драйвер GCC автоматически подключаетlibasan. Еслиlibasanдоступна как общая библиотека, и параметр-staticне используется, то это связывает общую версиюlibasan. Параметр-static-libasanуказывает драйверу GCC связатьlibasanстатически, не обязательно связывая другие библиотеки статически. -static-libtsan- Когда используется параметр
-fsanitize=threadдля линковки программы, драйвер GCC автоматически подключаетlibtsan. Еслиlibtsanдоступна как общая библиотека, и параметр-staticне используется, то это связывает общую версиюlibtsan. Параметр-static-libtsanуказывает драйверу GCC связатьlibtsanстатически, не обязательно связывая другие библиотеки статически. -static-liblsan- Когда используется параметр
-fsanitize=leakдля линковки программы, драйвер GCC автоматически подключаетliblsan. Еслиliblsanдоступна как общая библиотека, и параметр-staticне используется, то это связывает общую версиюliblsan. Параметр-static-liblsanуказывает драйверу GCC связатьliblsanстатически, не обязательно связывая другие библиотеки статически. -static-libubsan- Когда используется параметр
-fsanitize=undefinedдля линковки программы, драйвер GCC автоматически подключаетlibubsan. Еслиlibubsanдоступна как общая библиотека, и параметр-staticне используется, то это связывает общую версиюlibubsan. Параметр-static-libubsanуказывает драйверу GCC связатьlibubsanстатически, не обязательно связывая другие библиотеки статически. -static-libstdc++- Когда используется программа
g++для линковки программы C++, она обычно автоматически подключаетlibstdc++. Еслиlibstdc++доступна как общая библиотека, и параметр-staticне используется, то это связывает общую версиюlibstdc++. Обычно это нормально. Однако иногда полезно заморозить версиюlibstdc++, используемую программой, не переходя к полной статической линковке. Параметр-static-libstdc++указывает драйверуg++связатьlibstdc++статически, не обязательно связывая другие библиотеки статически. -symbolic- Связывать ссылки на глобальные символы при создании общего объекта. Выдавать предупреждение о любых неразрешённых ссылках (если не переопределено параметром линковщика
-Xlinker -z -Xlinker defs). Эта опция поддерживается лишь несколькими системами. -
-Tscript
- Используйте script в качестве скрипта линковщика. Этот параметр поддерживается большинством систем, использующих GNU линковщик. В некоторых целях, таких как целевые системы без операционной системы, может потребоваться опция
-T, чтобы избежать ссылок на неопределённые символы при линковке. -
-Xlinkeroption - Передайте option в качестве параметра линковщику. Вы можете использовать это для передачи специфичных для системы параметров линковщика, которые GCC не распознаёт.
Если вы хотите передать параметр, который принимает отдельный аргумент, вы должны использовать
-Xlinkerдважды, один раз для параметра и один раз для аргумента. Например, чтобы передать-assert definitions, вы должны написать-Xlinker -assert -Xlinker definitions. Не работает запись-Xlinker "-assert definitions", потому что это передаёт всю строку как один аргумент, чего не ожидает линковщик.При использовании GNU линковщика, обычно удобнее передавать аргументы к параметрам линковщика с помощью синтаксиса option=value, чем как отдельные аргументы. Например, вы можете указать
-Xlinker -Map=output.mapвместо-Xlinker -Map -Xlinker output.map. Другие линковщики могут не поддерживать этот синтаксис для командной строки. -
-Wl,option - Передайте option в качестве параметра линковщику. Если option содержит запятые, он разбивается на несколько параметров в местах запятых. Вы можете использовать этот синтаксис для передачи аргумента параметру. Например,
-Wl,-Map,output.mapпередаёт-Map output.mapлинковщику. При использовании GNU линковщика, вы также можете получить тот же эффект с помощью-Wl,-Map=output.map. -
-usymbol - Представьте, что символ symbol не определён, чтобы принудительно связать модули библиотеки для его определения. Вы можете использовать
-uнесколько раз с различными символами, чтобы принудительно загрузить дополнительные модули библиотек.
Примечания
[1] В некоторых системах ‘gcc -shared’ необходимо для построения дополнительных вспомогательных фрагментов кода для работы конструкторов. В системах с множественными библиотеками ‘gcc -shared’ должен выбрать правильные поддерживающие библиотеки для линковки. Отсутствие правильных флагов может привести к скрытым ошибкам. Предоставление их в случаях, когда они не нужны, не причиняет вреда.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Link-Options.html