Spec-Zone.ru › GCC 15

3.16 Параметры компоновки

Эти параметры используются, когда компилятор компонуёт объектные файлы в исполняемый выходной файл. Они не имеют смысла, если компилятор не выполняет этап компоновки.

object-file-name

Имя файла, не оканчивающееся специальным распознаваемым суффиксом, считается именем объектного файла или библиотеки. (Компоновщик различает объектные файлы и библиотеки по содержимому файлов.) Если выполняется компоновка, эти объектные файлы используются в качестве входных данных для компоновщика.

-c
-S
-E

Если используется любой из этих параметров, компоновщик не запускается, и имена объектных файлов не следует использовать в качестве аргументов. См. Параметры, управляющие типом выходных данных.

-flinker-output=type

Этот параметр управляет генерацией кода оптимизатором на этапе компоновки. По умолчанию выходной файл компоновщика автоматически определяется подключаемым модулем компоновщика. Для отладки компилятора и если требуется инкрементальная компоновка с объектным файлом без LTO, может быть полезно задать тип вручную.

Если type — ‘exec’, генерация кода создаёт статический двоичный файл. В этом случае параметры -fpic и -fpie отключаются.

Если type — ‘dyn’, генерация кода создаёт разделяемую библиотеку. В этом случае параметр -fpic или -fPIC сохраняется, но не включается автоматически. Это позволяет создавать разделяемые библиотеки без позиционно-независимого кода на архитектурах, где это возможно, например на x86.

Если type — ‘pie’, генерация кода создаёт исполняемый файл с параметром -fpie. Это приводит к оптимизациям, аналогичным ‘exec’, за исключением того, что -fpie не отключается, если он был указан при компиляции.

Если type — ‘rel’, компилятор предполагает, что выполняется инкрементальная компоновка. Секции, содержащие промежуточный код для оптимизации на этапе компоновки, объединяются, предварительно оптимизируются и выводятся в результирующий объектный файл. Кроме того, если указан параметр -ffat-lto-objects, создаётся двоичный код для последующей компоновки без LTO. Объектный файл, созданный инкрементальной компоновкой, меньше статической библиотеки, созданной из тех же объектных файлов. Во время компоновки результат инкрементальной компоновки также загружается быстрее, чем статическая библиотека, если используется большинство объектов библиотеки.

Наконец, ‘nolto-rel’ настраивает компилятор для инкрементальной компоновки, при которой генерация кода принудительно включается, создаётся итоговый двоичный файл, а промежуточный код для последующей оптимизации на этапе компоновки удаляется. При компоновке нескольких объектных файлов результирующий код оптимизируется лучше, чем при отключённой оптимизации на этапе компоновки (например, выполняется встраивание функций между модулями), но большая часть преимуществ межмодульной оптимизации теряется.

При инкрементальной компоновке (с помощью -r) по умолчанию подключаемый модуль компоновщика использует rel. Однако с текущими интерфейсами GNU Binutils невозможно инкрементально скомпоновать объекты LTO и объекты без LTO в один смешанный объектный файл. Если какой-либо объектный файл в инкрементальной компоновке нельзя использовать для оптимизации на этапе компоновки, подключаемый модуль компоновщика выдаёт предупреждение и использует ‘nolto-rel’. Для сохранения межмодульной оптимизации рекомендуется вместо этого объединить такие объекты в статическую библиотеку. В качестве альтернативы можно использовать binutils H.J. Lu с поддержкой смешанных объектов.

-fuse-ld=bfd

Использовать компоновщик bfd вместо компоновщика по умолчанию.

-fuse-ld=gold

Использовать компоновщик gold вместо компоновщика по умолчанию.

-fuse-ld=lld

Использовать компоновщик LLVM lld вместо компоновщика по умолчанию.

-fuse-ld=mold

Использовать Modern Linker (mold) вместо компоновщика по умолчанию.

-llibrary
-l library

При компоновке искать библиотеку с именем library. (Второй вариант, в котором библиотека указывается отдельным аргументом, предназначен только для соответствия POSIX и не рекомендуется.)

Параметр -l передаётся компоновщику напрямую из GCC. Точные сведения см. в документации к вашему компоновщику. Приведённое ниже общее описание относится к компоновщику GNU.

Компоновщик ищет библиотеку в стандартном списке каталогов. В число просматриваемых каталогов входят несколько стандартных системных каталогов, а также каталоги, указанные с помощью -L.

Статические библиотеки представляют собой архивы объектных файлов и имеют имена вроде liblibrary.a. Некоторые целевые платформы также поддерживают разделяемые библиотеки, которые обычно имеют имена вроде liblibrary.so. Если найдены и статические, и разделяемые библиотеки, компоновщик предпочитает компоновку с разделяемой библиотекой, если не используется параметр -static.

Важно, в каком месте команды указан этот параметр: компоновщик ищет и обрабатывает библиотеки и объектные файлы в заданном порядке. Таким образом, ‘foo.o -lz bar.o’ выполняет поиск библиотеки ‘z’ после файла foo.o, но до bar.o. Если bar.o ссылается на функции из ‘z’, эти функции могут не быть загружены.

-lobjc

Этот специальный вариант параметра -l необходим для компоновки программы на Objective-C или Objective-C++.

-nostartfiles

Не использовать стандартные системные стартовые файлы при компоновке. Стандартные системные библиотеки используются обычным образом, если не указан параметр -nostdlib, -nolibc или -nodefaultlibs.

-nodefaultlibs

Не использовать стандартные системные библиотеки при компоновке. Компоновщику передаются только указанные вами библиотеки, а параметры, задающие подключение системных библиотек, например -static-libgcc или -shared-libgcc, игнорируются. Стандартные стартовые файлы используются обычным образом, если не указан параметр -nostartfiles.

Компилятор может генерировать вызовы memcmp, memset, memcpy и memmove. Обычно эти точки входа разрешаются соответствующими точками входа в libc. При использовании этого параметра необходимо предоставлять эти точки входа каким-либо другим способом.

-nolibc

Не использовать при компоновке библиотеку C и тесно связанные с ней системные библиотеки. При этом стартовые файлы, libgcc или предоставляемые набором инструментов библиотеки поддержки языков, такие как libgnat, libgfortran или libstdc++, всё равно подключаются, если также не используются параметры, запрещающие их включение. Обычно это удаляет -lc из командной строки компоновки, а также системные библиотеки, обычно подключаемые вместе с ней и теряющие смысл при предположении об отсутствии библиотеки C, например -lpthread или -lm в некоторых конфигурациях. Этот параметр предназначен для целевых платформ без операционной системы, где библиотека C действительно отсутствует.

-nostdlib

Не использовать стандартные системные стартовые файлы или библиотеки при компоновке. Компоновщику не передаются стартовые файлы, а из библиотек передаются только указанные вами; параметры, задающие подключение системных библиотек, например -static-libgcc или -shared-libgcc, игнорируются.

Компилятор может генерировать вызовы memcmp, memset, memcpy и memmove. Обычно эти точки входа разрешаются соответствующими точками входа в libc. При использовании этого параметра необходимо предоставлять эти точки входа каким-либо другим способом.

Одна из стандартных библиотек, исключаемых параметрами -nostdlib и -nodefaultlibs, — это libgcc.a, библиотека внутренних подпрограмм, которую GCC использует для устранения недостатков конкретных машин или удовлетворения особых потребностей некоторых языков. (Дополнительные сведения о libgcc.a см. в разделе Взаимодействие с выходными данными GCC в документе GNU Compiler Collection (GCC) Internals.) В большинстве случаев libgcc.a необходима, даже если вы хотите отказаться от других стандартных библиотек. Иными словами, при указании -nostdlib или -nodefaultlibs обычно следует также указать -lgcc. Это гарантирует отсутствие неразрешённых ссылок на внутренние подпрограммы библиотеки GCC. (Пример такой внутренней подпрограммы — __main, используемая для обеспечения вызова конструкторов C++; см. collect2 в документе GNU Compiler Collection (GCC) Internals.)

-nostdlib++

Не подключать автоматически стандартные библиотеки C++.

-e entry
--entry=entry

Указать, что точкой входа программы является entry. Аргумент интерпретируется компоновщиком; компоновщик GNU принимает имя символа или адрес.

-pie

Создать динамически компонуемый позиционно-независимый исполняемый файл на целевых платформах, которые его поддерживают. Для получения предсказуемых результатов при указании этого параметра компоновщика необходимо также указать тот же набор параметров, что и при компиляции (-fpie, -fPIE или параметры модели).

-no-pie

Не создавать динамически компонуемый позиционно-независимый исполняемый файл.

-static-pie

Создать статический позиционно-независимый исполняемый файл на целевых платформах, которые его поддерживают. Статический позиционно-независимый исполняемый файл похож на статический исполняемый файл, но может загружаться по любому адресу без динамического компоновщика. Для получения предсказуемых результатов при указании этого параметра компоновщика необходимо также указать тот же набор параметров, что и при компиляции (-fpie, -fPIE или параметры модели).

-pthread

Компоновка с библиотекой потоков POSIX. Этот параметр поддерживается целевыми платформами GNU/Linux, большинством других производных Unix, а также целевыми платформами x86 Cygwin и MinGW. На некоторых целевых платформах этот параметр также задаёт флаги препроцессора, поэтому его следует одинаково использовать как при компиляции, так и при компоновке.

-r

Создать на выходе перемещаемый объект. Это также называется частичной компоновкой.

-rdynamic

Передать параметр -export-dynamic компоновщику ELF на целевых платформах, которые его поддерживают. Это указывает компоновщику добавить в таблицу динамических символов все символы, а не только используемые. Этот параметр необходим для некоторых вариантов использования dlopen или для получения обратных трассировок из программы.

-s

Удалить из исполняемого файла всю информацию о таблице символов и перемещениях.

-static

В системах, поддерживающих динамическую компоновку, этот параметр переопределяет -pie и запрещает компоновку с разделяемыми библиотеками. В других системах этот параметр не действует.

-shared

Создать разделяемый объект, который затем можно скомпоновать с другими объектами для формирования исполняемого файла. Этот параметр поддерживается не всеми системами. Для получения предсказуемых результатов при указании этого параметра компоновщика необходимо также указать тот же набор параметров, что и при компиляции (-fpic, -fPIC или параметры модели).1

-shared-libgcc
-static-libgcc

В системах, предоставляющих libgcc в виде разделяемой библиотеки, эти параметры принудительно включают использование соответственно разделяемой или статической версии. Если разделяемая версия libgcc не была собрана при настройке компилятора, эти параметры не действуют.

В нескольких случаях приложению следует использовать разделяемую libgcc вместо статической версии. Наиболее распространённый случай — когда приложению необходимо передавать исключения между разными разделяемыми библиотеками. В этом случае и библиотеки, и само приложение должны использовать разделяемую libgcc.

Поэтому драйвер G++ автоматически добавляет -shared-libgcc при сборке разделяемой библиотеки или основного исполняемого файла, поскольку программы на C++ обычно используют исключения, и это правильный выбор.

Если же для создания разделяемых библиотек используется драйвер GCC, они могут не всегда компоновываться с разделяемой libgcc. Если при настройке GCC обнаруживается, что у вас не GNU-компоновщик или GNU-компоновщик, не поддерживающий параметр --eh-frame-hdr, разделяемая версия libgcc по умолчанию включается в разделяемые библиотеки. В противном случае GCC использует возможности компоновщика и оптимизирует компоновку с разделяемой версией libgcc, по умолчанию выполняя компоновку со статической версией libgcc. Это позволяет исключениям распространяться через такие разделяемые библиотеки без затрат на перемещения во время загрузки библиотеки.

Однако если библиотека или основной исполняемый файл должны генерировать или перехватывать исключения, их необходимо компоновывать с помощью драйвера G++ или с параметром -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++

При компоновке программы на C++ с помощью g++ программа обычно автоматически подключает libstdc++. Если libstdc++ доступна в виде разделяемой библиотеки и не используется параметр -static, подключается разделяемая версия libstdc++. Обычно это вполне подходит. Однако иногда полезно зафиксировать используемую программой версию libstdc++, не переходя к полностью статической компоновке. Параметр -static-libstdc++ указывает драйверу g++ статически скомпоновать libstdc++, не обязательно компонуя статически другие библиотеки.

-symbolic

Связывать ссылки на глобальные символы при сборке разделяемого объекта. Выдавать предупреждение о любых неразрешённых ссылках (если это не переопределено параметром редактора связей -Xlinker -z -Xlinker defs). Этот параметр поддерживается лишь несколькими системами.

-T script

Использовать script в качестве скрипта компоновщика. Этот параметр поддерживается большинством систем, использующих компоновщик GNU. На некоторых целевых платформах, например на платформах без операционной системы, параметр -T может быть необходим при компоновке, чтобы избежать ссылок на неопределённые символы.

-Xlinker option

Передать 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.

-u symbol

Считать символ symbol неопределённым, чтобы принудительно скомпоновать модули библиотеки, определяющие его. Параметр -u можно использовать несколько раз с разными символами, чтобы принудительно загрузить дополнительные модули библиотеки.

-z keyword

-z передаётся непосредственно компоновщику вместе с ключевым словом keyword. Допустимые значения и их значения см. в соответствующем разделе документации к вашему компоновщику.

Примечания

(1)

В некоторых системах ‘gcc -shared’ необходимо создавать дополнительный код-заглушку, чтобы конструкторы работали. В системах с несколькими библиотеками ‘gcc -shared’ должен выбирать правильные библиотеки поддержки для компоновки. Неправильные флаги могут привести к труднообнаружимым дефектам. Их указание в случаях, когда они не нужны, безвредно. На некоторых целевых платформах -shared подавляет добавление стартового кода, изменяющего среду операций с плавающей точкой, как это делается при использовании -ffast-math, -Ofast или -funsafe-math-optimizations.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Link-Options.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API