Все о команде Linux / Unix: ld

ld — Использование LD, компоновщика GNU 

СИНТАКСИС

лд [параметры] Objfile … 

ОПИСАНИЕ

л.д. объединяет несколько объектных и архивных файлов, перемещает их данные и связывает ссылки на символы. Обычно последний шаг в компиляции программы — это запустить л.д..

л.д. принимает файлы языка команд компоновщика, написанные в расширенном наборе синтаксиса языка команд ATT Link Editor, чтобы обеспечить явный и полный контроль над процессом компоновки.

Эта страница руководства не описывает командный язык; увидеть л.д. запись в «info», или руководство ld: компоновщик GNU, для получения полной информации о языке команд и о других аспектах компоновщика GNU.

Эта версия л.д. использует библиотеки BFD общего назначения для работы с объектными файлами. Это позволяет л.д. читать, комбинировать и записывать объектные файлы во многих различных форматах — например, COFF или «a.out». Различные форматы могут быть связаны вместе для создания любого доступного вида объектного файла.

Помимо своей гибкости, линкер GNU более полезен, чем другие линкеры, в предоставлении диагностической информации. Многие компоновщики прекращают выполнение сразу же при обнаружении ошибки; как только возможно, л.д. продолжает выполнение, позволяя идентифицировать другие ошибки (или, в некоторых случаях, получить выходной файл, несмотря на ошибку).

ГНУ линкер л.д. предназначен для охвата широкого спектра ситуаций и обеспечения максимальной совместимости с другими компоновщиками. В результате у вас есть много вариантов, чтобы контролировать его поведение.  

ПАРАМЕТРЫ

Компоновщик поддерживает множество параметров командной строки, но на практике немногие из них используются в каком-либо конкретном контексте. Например, частое использование л.д. заключается в связывании стандартных объектных файлов Unix в стандартной поддерживаемой системе Unix. В такой системе, чтобы связать файл «hello.o»:

 ld -o /lib/crt0.o hello.o -lc

Это говорит л.д. создать файл с именем output в результате связывания файла «/lib/crt0.o» с «hello.o» и библиотеки «libc.a», которая будет поступать из стандартных каталогов поиска. (См. Обсуждение -L вариант ниже.)

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

Необязательные аргументы — это объектные файлы или архивы, которые должны быть связаны вместе. Они могут следовать, предшествовать или смешиваться с параметрами командной строки, за исключением того, что аргумент объектного файла не может быть помещен между параметром и его аргументом.

Обычно компоновщик вызывается как минимум с одним объектным файлом, но вы можете указать другие формы двоичных входных файлов, используя -L, и командный язык сценария. Если двоичные входные файлы вообще не указаны, компоновщик не выводит никаких данных и выдает сообщение Нет входных файлов.

Если компоновщик не может распознать формат объектного файла, он будет считать, что это скрипт компоновщика. Указанный таким образом сценарий дополняет сценарий основного компоновщика, используемый для ссылки (либо сценарий компоновщика по умолчанию, либо сценарий, указанный с помощью -T). Эта функция позволяет компоновщику связываться с файлом, который выглядит как объект или архив, но на самом деле просто определяет некоторые значения символов или использует «INPUT» или «GROUP» для загрузки других объектов. Обратите внимание, что указание сценария таким способом просто увеличивает основной сценарий компоновщика; использовать -T возможность полностью заменить скрипт компоновщика по умолчанию.

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

Для опций, имена которых состоят из нескольких букв, перед опцией может стоять одна или две черты; например, -след-символ а также —след-символ эквивалентны. Обратите внимание — есть одно исключение из этого правила. Многобуквенным опциям, начинающимся со строчной буквы «о», могут предшествовать только две черты. Это должно уменьшить путаницу с  вариант. Так например -omagic устанавливает имя выходного файла магия в то время как —omagic устанавливает флаг NMAGIC на выходе.

Аргументы к многобуквенным опциям должны либо отделяться от имени опции знаком равенства, либо передаваться как отдельные аргументы, сразу после опции, которая требует их. Например, —след-символ foo а также —след-символ = Foo эквивалентны. Допускаются уникальные сокращения названий многобуквенных вариантов.

Если компоновщик вызывается косвенно, через драйвер компилятора (например, НКУ) тогда все параметры командной строки компоновщика должны начинаться с префикса -Wl, (или то, что подходит для конкретного драйвера компилятора), например:

 gcc -Wl, - начальная группа foo.o bar.o -Wl, - конечная группа


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

Вот таблица общих параметров командной строки, принятых компоновщиком GNU:

ключевое слово

Эта опция поддерживается для совместимости с HP / UX. Ключевое слово аргумент должно быть одной из строк архивобщий, или же по умолчанию-aarchive функционально эквивалентно -Bstatic, а два других ключевых слова функционально эквивалентны -Bdynamic. Эта опция может использоваться любое количество раз.

архитектура

—архитектура =архитектура

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

Будущие выпуски л.д. может поддерживать аналогичную функциональность для других семейств архитектуры.

 Входной формат

—формат =Входной формат

л.д. может быть настроен для поддержки более одного вида объектного файла. Если твой л.д. настроен таким образом, вы можете использовать  опция, чтобы указать двоичный формат для входных объектных файлов, которые следуют за этой опцией в командной строке. Даже когда л.д. настроен для поддержки альтернативных форматов объектов, вам обычно не нужно указывать это, так как л.д. должен быть настроен на ожидание в качестве формата ввода по умолчанию самого обычного формата на каждой машине. input-format — это текстовая строка, имя определенного формата, поддерживаемого библиотеками BFD. (Вы можете перечислить доступные двоичные форматы с objdump -i.)

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

Формат по умолчанию берется из переменной среды «GNUTARGET».

Вы также можете определить формат ввода из скрипта, используя команду «TARGET»;

 МРТ-commandfile

—мрт-скрипт =МРТ-commandfile

Для совместимости с линкерами производства MRI, л.д. принимает файлы сценариев, написанные на альтернативном, ограниченном командном языке, описанном в разделе «Файлы сценариев, совместимых с MRI» документации GNU ld. Введите файлы сценариев МРТ с опцией ; использовать -T возможность запуска сценариев компоновщика, написанных в универсальном л.д. скриптовый язык. Если МРТ-cmdfile не существует, л.д.ищет его в каталогах, указанных любым -L параметры.

-d

-Округ Колумбия

-дп

Эти три варианта эквивалентны; Для совместимости с другими компоновщиками поддерживаются несколько форм. Они назначают пространство для общих символов, даже если указан перемещаемый выходной файл (с ). Команда сценария «FORCE_COMMON_ALLOCATION» имеет тот же эффект.

 запись

—запись =запись

Используйте запись как явный символ для начала выполнения вашей программы, а не точку входа по умолчанию. Если символа с именем entry нет, компоновщик попытается проанализировать запись как число и использовать его в качестве адреса входа (число будет интерпретировано в базе 10; вы можете использовать начальный символ). 0x для базы 16, или ведущий  для базы 8).

—экспорт-динамический

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

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

Если вы используете «dlopen» для загрузки динамического объекта, который должен ссылаться на символы, определенные программой, а не на какой-либо другой динамический объект, то вам, вероятно, потребуется использовать эту опцию при связывании самой программы.

Вы также можете использовать скрипт версии для управления тем, какие символы должны быть добавлены в динамическую таблицу символов, если формат вывода поддерживает это. Смотрите описание —версия-скрипт в @ исх {VERSION}.

-EB

Ссылка объектов с прямым порядком байтов. Это влияет на формат вывода по умолчанию.

-EL

Ссылка объектов с прямым порядком байтов. Это влияет на формат вывода по умолчанию.

—вспомогательный имя

При создании общего объекта ELF установите для внутреннего поля DT_AUXILIARY указанное имя. Это сообщает динамическому компоновщику, что таблица символов общего объекта должна использоваться в качестве вспомогательного фильтра в таблице символов имени общего объекта.

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

Эта опция может быть указана более одного раза. Записи DT_AUXILIARY будут созданы в порядке их появления в командной строке.

-F имя

—фильтр имя

При создании общего объекта ELF установите для внутреннего поля DT_FILTER указанное имя. Это говорит динамическому компоновщику, что таблица символов создаваемого общего объекта должна использоваться в качестве фильтра в таблице символов имени общего объекта.

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

Некоторые старые линкеры использовали -F опция во всей цепочке инструментов компиляции для указания формата объектного файла для входных и выходных объектных файлов. Для этой цели компоновщик GNU использует другие механизмы: —формат—oformat параметры, команда «TARGET» в сценариях компоновщика и переменная среды «GNUTARGET». Линкер GNU будет игнорировать -F опция, когда не создается общий объект ELF.

-Фини имя

При создании исполняемого или разделяемого объекта ELF вызовите NAME, когда исполняемый или разделяемый объект выгружен, установив для DT_FINI адрес функции. По умолчанию компоновщик использует «_fini» в качестве функции для вызова.

-грамм

Игнорируется. Предусмотрено для совместимости с другими инструментами.

-граммстоимость

—gpsize =стоимость

Установите максимальный размер объектов для оптимизации, используя размер регистра GP. Это имеет смысл только для форматов объектных файлов, таких как MIPS ECOFF, который поддерживает размещение больших и малых объектов в разных разделах. Это игнорируется для других форматов объектных файлов.

-часимя

-игнорирован =имя

При создании общего объекта ELF установите для внутреннего поля DT_SONAME указанное имя. Когда исполняемый файл связан с общим объектом, который имеет поле DT_SONAME, то при запуске исполняемого файла динамический компоновщик будет пытаться загрузить общий объект, указанный в поле DT_SONAME, а не с использованием имени файла, данного компоновщику.

Выполнить добавочную ссылку (так же, как опция ).

-в этом имя

При создании исполняемого или разделяемого объекта ELF вызовите NAME, когда исполняемый или разделяемый объект загружен, установив в DT_INIT адрес функции. По умолчанию компоновщик использует «_init» в качестве функции для вызова.

-Lархив

—библиотека =архив

Добавить архив файлов архива в список файлов для ссылки. Эта опция может использоваться любое количество раз. л.д. будет искать в своем путевом списке вхождения libarchive.a для каждого указанного архива.

В системах, которые поддерживают общие библиотеки, л.д. также может искать библиотеки с расширениями, отличными от «.a». В частности, в системах ELF и SunOS, л.д. будет искать каталог для библиотеки с расширением «.so», прежде чем искать каталог с расширением «.a». По соглашению расширение «.so» обозначает общую библиотеку.

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

Увидеть -( опция для способа заставить компоновщик искать архивы несколько раз.

Вы можете перечислить один и тот же архив несколько раз в командной строке.

Этот тип поиска в архиве является стандартным для линкеров Unix. Однако, если вы используете л.д. Обратите внимание, что в AIX он отличается от поведения компоновщика AIX.

-Lsearchdir

—Библиотека-путь =searchdir

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

Если searchdir начинается с «=», то «=» будет заменен префиксом sysroot, путем, указанным при настройке компоновщика.

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

Пути также могут быть указаны в сценарии связи с помощью команды «SEARCH_DIR». Каталоги, указанные таким образом, ищутся в той точке, в которой скрипт компоновщика появляется в командной строке.

эмуляция

Эмулируйте эмулятор линкера. Вы можете перечислить доступные эмуляции с помощью —подробный или же параметры.

Если  опция не используется, эмуляция берется из переменной среды «LDEMULATION», если она определена.

В противном случае эмуляция по умолчанию зависит от того, как был настроен компоновщик.

-M

—печать на карте

Распечатать карту ссылок на стандартный вывод. Карта ссылок предоставляет информацию о ссылке, включая следующие:

*

Где объектные файлы и символы отображаются в памяти.

*

Как распределяются общие символы.

*

Все участники архива включены в ссылку с упоминанием символа, который привел к вводу члена архива.

-N

—nmagic

Отключите выравнивание страниц по разделам и пометьте вывод как «NMAGIC», если это возможно.

-N

—omagic

Установите разделы текста и данных для чтения и записи. Кроме того, не выравнивайте сегмент данных по страницам и не отключайте связывание с общими библиотеками. Если формат вывода поддерживает магические числа в стиле Unix, пометьте вывод как «OMAGIC».

—нет-omagic

Эта опция сводит на нет большинство эффектов -N вариант. Он устанавливает текстовый раздел только для чтения и принудительно выравнивает сегмент данных. Примечание. Этот параметр не позволяет создавать ссылки на общие библиотеки. использование -Bdynamic за это.

 выход

—выход =выход

Используйте выходные данные в качестве имени для программы, созданной л.д.; если эта опция не указана, по умолчанию используется имя a.out. Команда сценария «OUTPUT» также может указывать имя выходного файла.

 уровень

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

-Q

—испускают-relocs

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

Эта опция в настоящее время поддерживается только на платформах ELF.

—relocateable

Генерировать перемещаемый вывод — т.е. генерировать выходной файл, который, в свою очередь, может служить входом длял.д.. Это часто называют частичной связью. Как побочный эффект, в средах, которые поддерживают стандартные магические числа Unix, эта опция также устанавливает магическое число выходного файла на «OMAGIC». Если эта опция не указана, создается абсолютный файл. При связывании программ на C ++ эта опция не разрешает ссылки на конструкторы; чтобы сделать это, используйте -Ур.

Если входной файл не имеет тот же формат, что и выходной файл, частичное связывание поддерживается только в том случае, если этот входной файл не содержит перемещений. Различные выходные форматы могут иметь дополнительные ограничения; например, некоторые форматы на основе «a.out» вообще не поддерживают частичное связывание с входными файлами в других форматах.

Эта опция делает то же самое, что и .

 имя файла

—всего-символы =имя файла

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

Для совместимости с другими линкерами ELF, если  За параметром следует имя каталога, а не имя файла, оно рассматривается как -RPATH вариант.

-s

—стрип-все

Опустить всю символьную информацию из выходного файла.

-S

—стрип-отладка

Опустить информацию о символах отладчика (но не все символы) из выходного файла.

-T

—след

Напечатайте имена входных файлов как л.д. обрабатывает их.

-T файл_сценария

—сценарий =файл_сценария

Используйте скрипт-файл как скрипт компоновщика. Этот скрипт заменяет л.д.Это скрипт компоновщика по умолчанию (а не добавление к нему), поэтому командный файл должен указывать все необходимое для описания выходного файла. Если скрипт-файл не существует в текущем каталоге, «ld» ищет его в каталогах, указанных любым предшествующим -L параметры. множественный -T варианты накапливаются.

-U условное обозначение

—неопределенные =условное обозначение

Принудительно ввести символ в выходной файл как неопределенный символ. Это может, например, инициировать связывание дополнительных модулей из стандартных библиотек. -U может повторяться с различными аргументами опции для ввода дополнительных неопределенных символов. Эта опция эквивалентна команде сценария компоновщика «EXTERN».

-Ур

Для любых программ, кроме C ++, эта опция эквивалентна : он генерирует перемещаемый вывод, т.е. выходной файл, который, в свою очередь, может служить входом для л.д.. При связывании программ на C ++, -Ур разрешает ссылки на конструкторы, в отличие . Это не работает, чтобы использовать-Ур на файлы, которые были связаны с -Ур; как только таблица конструктора была построена, она не может быть добавлена ​​в. использование -Ур только для последней частичной ссылки, и  для остальных.

—Уникальный [=РАЗДЕЛ]

Создает отдельный выходной раздел для каждого входного раздела, соответствующего SECTION, или, если необязательный аргумент подстановочного знака SECTION отсутствует, для каждого потерянного входного раздела. Сиротский раздел — это раздел, специально не упомянутый в скрипте компоновщика. Вы можете использовать эту опцию несколько раз в командной строке; Это предотвращает обычное объединение входных разделов с одинаковыми именами, переопределяя назначения выходных разделов в сценарии компоновщика.

-v

—версия

Показать номер версии для л.д..   опция также перечисляет поддерживаемые эмуляции.

-Икс

—отбросить все-

Удалить все локальные символы.

-Икс

—отбрасывать-местные

Удалить все временные локальные символы. Для большинства целей это все локальные символы, имена которых начинаются с L.

-Y условное обозначение

—трассировать-символ =условное обозначение

Напечатайте имя каждого связанного файла, в котором появляется символ. Эта опция может быть предоставлена ​​любое количество раз. Во многих системах необходимо добавить подчеркивание.

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

-Y дорожка

Добавьте путь к пути поиска библиотеки по умолчанию. Эта опция существует для совместимости с Solaris.

-Z ключевое слово

Распознанные ключевые слова: «initfirst», «interpose», «loadfltr», «nodefaultlib», «nodelete», «nodlopen», «nodump», «now», «origin», «combreloc», «nocombreloc» и «nocopyreloc ». Другие ключевые слова игнорируются для совместимости с Solaris. «initfirst» отмечает объект, который должен быть инициализирован первым во время выполнения перед любыми другими объектами. «interpose» отмечает объект, который его таблица символов вставляет перед всеми символами, кроме основного исполняемого файла. «loadfltr» отмечает объект, который его филиалы обрабатывают немедленно во время выполнения. «nodefaultlib» отмечает объект, который поиск зависимостей этого объекта будет игнорировать любые пути поиска библиотеки по умолчанию. «nodelete» отмечает, что объект не должен выгружаться во время выполнения. «nodlopen» отмечает объект, недоступный для «dlopen». «nodump» отмечает, что объект не может быть сброшен «dldump». «now» помечает объект без ленивого связывания во время выполнения. «origin» отмечает, что объект может содержать $ ORIGIN. «defs» запрещает неопределенные символы. «muldefs» допускает несколько определений. «combreloc» объединяет несколько секций перемещения и сортирует их, чтобы сделать возможным кэширование динамического поиска символов.

 «nocombreloc» отключает объединение нескольких секций перемещения. «nocopyreloc» отключает создание копий перемещений.

-( архив -)

—старт-группа, архив —концевые группы

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

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

Использование этой опции имеет значительную производительность. Лучше всего использовать его только тогда, когда между двумя или более архивами есть неизбежные циклические ссылки.

—принимать неизвестное-вход-арка

—нет-Accept-неизвестную-вход-арка

Сообщает компоновщику принимать входные файлы, архитектура которых не может быть распознана. Предполагается, что пользователь знает, что он делает, и намеренно хочет связать эти неизвестные входные файлы. Это было поведение компоновщика по умолчанию до выпуска 2.14. Поведение по умолчанию начиная с выпуска 2.14 и выше — отклонять такие входные файлы, и поэтому —принимать неизвестное-вход-арка была добавлена ​​опция для восстановления старого поведения.

-утверждать ключевое слово

Эта опция игнорируется для совместимости с SunOS.

-Bdynamic

-ду

-call_shared

Ссылка на динамические библиотеки. Это имеет смысл только на платформах, для которых поддерживаются общие библиотеки. Этот параметр обычно используется по умолчанию на таких платформах. Различные варианты этой опции предназначены для совместимости с различными системами. Вы можете использовать эту опцию несколько раз в командной строке: это влияет на поиск в библиотеке -L варианты, которые следуют за этим.

-Bgroup

Установите флаг «DF_1_GROUP» в записи «DT_FLAGS_1» в динамическом разделе. Это приводит к тому, что компоновщик времени выполнения обрабатывает поиск в этом объекте и его зависимости должны выполняться только внутри группы. —нет-не определено подразумевается. Эта опция имеет смысл только на платформах ELF, которые поддерживают общие библиотеки.

-Bstatic

-дп

-non_shared

-статический

Не связывайтесь с общими библиотеками. Это имеет смысл только на платформах, для которых поддерживаются общие библиотеки. Различные варианты этой опции предназначены для совместимости с различными системами. Вы можете использовать эту опцию несколько раз в командной строке: это влияет на поиск в библиотеке -L варианты, которые следуют за этим.

-Bsymbolic

При создании общей библиотеки свяжите ссылки на глобальные символы с определением в общей библиотеке, если оно есть. Обычно программа, связанная с общей библиотекой, может переопределить определение в общей библиотеке. Эта опция имеет смысл только на ELFplatforms, которые поддерживают общие библиотеки.

—проверки сечений

—нет проверки сечений

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

—CREF

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

Формат таблицы преднамеренно прост, поэтому при необходимости он может быть легко обработан скриптом. Символы распечатываются, сортируются по имени. Для каждого символа дается список имен файлов. Если символ определен, первый файл в списке является местоположением определения. Остальные файлы содержат ссылки на символ.

—нет-определить, общее

Эта опция запрещает назначение адресов общим символам. Команда сценария «INHIBIT_COMMON_ALLOCATION» имеет тот же эффект.

 —нет-определить, общее опция позволяет отделить решение о назначении адресов общим символам от выбора типа выходного файла; в противном случае не перемещаемый тип вывода вынуждает назначать адреса общим символам. С помощью —нет-определить, общее позволяет общим символам, на которые ссылаются из общей библиотеки, назначать адреса только в основной программе. Это исключает неиспользуемое пространство дубликатов в общей библиотеке, а также предотвращает любые возможные путаницы при разрешении неправильных дубликатов, когда существует много динамических модулей со специализированными путями поиска для разрешения символов времени выполнения.

—defsym условное обозначениезнак равновыражение

Создайте глобальный символ в выходном файле, содержащий абсолютный адрес, заданный выражением. Вы можете использовать эту опцию столько раз, сколько необходимо для определения нескольких символов в командной строке. Ограниченная форма арифметики поддерживается для выражения в этом контексте: вы можете дать шестнадцатеричную константу или имя существующего символа, или использовать «+» и «-», чтобы добавить или вычесть шестнадцатеричные константы или символы. Если вам нужны более сложные выражения, подумайте об использовании языка команд компоновщика из скрипта. Примечание: между символом не должно быть пробела, знак равенства («знак равно») и выражение.

—demangle [=стиль]

—нет-demangle

Эти параметры определяют, нужно ли разбирать имена символов в сообщениях об ошибках и других выходных данных. Когда компоновщику предписывается деманглить, он пытается представить имена символов в удобочитаемом виде: он удаляет первые подчеркивания, если они используются форматом объектного файла, и преобразует искаженные имена символов C ++ в читаемые пользователем имена. Различные компиляторы имеют разные стили искажения. Необязательный аргумент стиля demangling может использоваться для выбора подходящего стиля demangling для вашего компилятора. Компоновщик по умолчанию будет разбираться, если только переменная окружения COLLECT_NO_DEMANGLE установлено. Эти параметры могут быть использованы для переопределения по умолчанию.

—динамико-линкер файл

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

—внедренные-relocs

Эта опция имеет смысл только при связывании встроенного кода PIC MIPS, сгенерированного параметром -membedded-pic, с компилятором и ассемблером GNU. Это заставляет компоновщик создать таблицу, которая может использоваться во время выполнения для перемещения любых данных, которые были статически инициализированы в значения указателя. Подробности смотрите в коде в testsuite / ld-empic.

—фатальное-предупреждение

Относитесь ко всем предупреждениям как к ошибкам.

—сила-ех-суффикс

Убедитесь, что выходной файл имеет суффикс .exe.

Если успешно созданный полностью связанный выходной файл не имеет суффикса «.exe» или «.dll», этот параметр заставляет компоновщик скопировать выходной файл с одним суффиксом «.exe» в одноименное имя. Эта опция полезна при использовании неизмененных make-файлов Unix на хосте Microsoft Windows, поскольку некоторые версии Windows не запускают образ, если он не заканчивается суффиксом «.exe».

—нет-ГЦ-секции

—ГЦ-секции

Включить сбор мусора из неиспользуемых разделов ввода. Он игнорируется для целей, которые не поддерживают эту опцию. Эта опция не совместима с , и при этом это не должно использоваться с динамическим соединением. Поведение по умолчанию (не выполнение этой сборки мусора) можно восстановить, указав —нет-ГЦ-секции в командной строке.

—Помогите

Напечатайте сводку параметров командной строки в стандартном выводе и выйдите.

—целевая помощь

Напечатайте сводку всех опций, определенных для цели, на стандартном выходе и выйдите.

-карта файле проекта

Распечатайте карту ссылок на файл mapfile. Смотрите описание -M вариант, выше.

—нет-держать-память

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

—нет-не определено

-z defs

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

—позволяют многодисковое определение

-z muldefs

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

—позволяет-shlib-неопределенный

Разрешить неопределенные символы в общих объектах, даже если установлен параметр —no-undefined. Конечным результатом будет то, что неопределенные символы в обычных объектах будут по-прежнему вызывать ошибку, но неопределенные символы в общих объектах будут игнорироваться. Реализация no_undefined предполагает, что компоновщик времени выполнения захлебнется неопределенными символами. Однако есть по крайней мере одна система (BeOS), в которой неопределенные символы в общих библиотеках являются нормальными, поскольку ядро ​​исправляет их во время загрузки, чтобы выбрать, какая функция наиболее подходит для текущей архитектуры. И.Е. динамически выбрать подходящую функцию memset. По-видимому, для общих библиотек HPPA также нормально иметь неопределенные символы.

—нет-неопределенной-версии

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

—не предупреждайте-несоответствие

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

—нет-весь-архив

Отключить эффект от —Весь-архив опция для последующих архивных файлов.

—noinhibit-Exec

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

-nostdlib

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

—oformat Выходной формат

л.д. может быть настроен для поддержки более одного вида объектного файла. Если твой л.д. настроен таким образом, вы можете использовать —oformat возможность указать двоичный формат для выходного файла объекта. Даже когда л.д. настроен для поддержки альтернативных форматов объектов, вам обычно не нужно указывать это, так как л.д. должен быть настроен на вывод в качестве формата вывода по умолчанию наиболее обычного формата на каждой машине. output-format — это текстовая строка, имя определенного формата, поддерживаемого библиотеками BFD. (Вы можете перечислить доступные двоичные форматы с objdump -i.) Команда сценария «OUTPUT_FORMAT» также может указывать формат вывода, но этот параметр переопределяет его.

-QMAGIC

Эта опция игнорируется для совместимости с Linux.

-Qy

Эта опция игнорируется для совместимости с SVR4.

—расслабиться

Опция с машинно-зависимыми эффектами. Эта опция поддерживается только для нескольких целей.

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

На некоторых платформах эти глобальные оптимизации времени соединения могут сделать невозможной символическую отладку получающегося исполняемого файла. Известно, что это относится к семейству процессоров Matsushita MN10200 и MN10300.

На платформах, где это не поддерживается, —расслабиться принимается, но игнорируется.

—сохраняющие-символы-файл имя файла

Сохраните только символы, указанные в имени файла, отбрасывая все остальные. filename — это простой плоский файл с одним именем символа в строке. Эта опция особенно полезна в средах (таких как VxWorks), где большая глобальная таблица символов накапливается постепенно, чтобы сохранить память времени выполнения.

—сохраняющие-символы-файл не сбрасывает неопределенные символы или символы, необходимые для перемещения.

Вы можете указать только —сохраняющие-символы-файл один раз в командной строке. Это переопределяет -s а также -S.

-RPATH реж

Добавьте каталог в путь поиска библиотеки времени выполнения. Это используется при связывании исполняемого файла ELF с общими объектами. Все -RPATH аргументы объединяются и передаются компоновщику среды выполнения, который использует их для поиска общих объектов во время выполнения. -RPATH опция также используется при поиске общих объектов, которые необходимы для общих объектов, явно включенных в ссылку; см. описание -RPATH-ссылка вариант. Если -RPATH не используется при связывании исполняемого файла ELF, содержимое переменной среды «LD_RUN_PATH» будет использоваться, если оно определено.

 -RPATH опция также может быть использована в SunOS. По умолчанию в SunOS компоновщик формирует исправление поиска во время выполнения из всех -L варианты дано. Если -RPATH опция используется, путь поиска во время выполнения будет формироваться исключительно с использованием -RPATH варианты, игнорируя -Lпараметры. Это может быть полезно при использовании gcc, который добавляет много -L параметры, которые могут быть на смонтированных файловых системах NFS.

Для совместимости с другими линкерами ELF, если  За параметром следует имя каталога, а не имя файла, оно рассматривается как -RPATH вариант.

-RPATH-ссылка DIR

При использовании ELF или SunOS для одной общей библиотеки может потребоваться другая. Это происходит, когда ссылка «ld -shared» включает общую библиотеку в качестве одного из входных файлов.

Когда компоновщик сталкивается с такой зависимостью при создании не разделяемой, не перемещаемой ссылки, он автоматически попытается найти требуемую разделяемую библиотеку и включить ее в ссылку, если она явно не включена. В таком случае -RPATH-ссылка Опция указывает первый набор каталогов для поиска. -RPATH-ссылка Параметр option может указывать последовательность имен каталогов, указав список имен, разделенных двоеточиями, или появившись несколько раз.

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

Компоновщик использует следующие пути поиска для поиска необходимых общих библиотек.

1.

Любые каталоги, указанные -RPATH-ссылка параметры.

2.

Любые каталоги, указанные -RPATH параметры. Разница между -RPATH а также -RPATH-ссылка это каталоги, указанные -RPATH параметры включены в исполняемый файл и используются во время выполнения, тогда как -RPATH-ссылка опция действует только во время ссылки. Это только для родного компоновщика.

3.

В системе ELF, если -RPATH и параметры «rpath-link» не использовались, ищите содержимое переменной среды «LD_RUN_PATH». Это только для родного компоновщика.

4.

На SunOS, если -RPATH опция не использовалась, поиск любых каталогов, указанных с помощью -L параметры.

5.

Для встроенного компоновщика содержимое переменной среды «LD_LIBRARY_PATH».

6.

Для нативного компоновщика ELF, каталоги в «DT_RUNPATH» или «DT_RPATH» разделяемой библиотеки ищутся для необходимых разделяемых библиотек. Записи «DT_RPATH» игнорируются, если существуют записи «DT_RUNPATH».

7.

Каталоги по умолчанию, обычно / lib и / usr / lib.

8.

Для собственного компоновщика в системе ELF, если файл /etc/ld.so.conf существует, список каталогов, найденных в этом файле.

Если требуемая общая библиотека не найдена, компоновщик выдаст предупреждение и продолжит работу со ссылкой.

-общий

-Bshareable

Создать общую библиотеку. В настоящее время это поддерживается только на платформах ELF, XCOFF и SunOS. В SunOS компоновщик автоматически создаст общую библиотеку, если  опция не используется и в ссылке есть неопределенные символы.

—сортировки общее

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

—разделить на файл [размер]

Похожий на —сплит-на-RELOC но создает новый выходной раздел для каждого входного файла при достижении размера. размер по умолчанию равен 1, если не указан.

—разделить-переместить [подсчитывать]

Пытается создать дополнительные разделы в выходном файле, чтобы ни один выходной раздел в файле не содержал больше, чем количество перемещений. Это полезно при создании огромных перемещаемых файлов для загрузки в определенные ядра реального времени в формате объектного файла COFF; поскольку COFF не может представлять более 65535 перемещений в одном разделе. Обратите внимание, что это не будет работать с форматами объектных файлов, которые не поддерживают произвольные разделы. Линкер не будет разделять отдельные входные разделы для перераспределения, поэтому, если один входной раздел содержит больше перемещений, чем один, один выходной раздел будет содержать столько перемещений. по умолчанию считается значение 32768.

—статистика

Вычислять и отображать статистику о работе компоновщика, такую ​​как время выполнения и использование памяти.

—традиционный формат

Для некоторых целей вывод л.д. в чем-то отличается от вывода существующего компоновщика. Этот переключатель запрашивает л.д. вместо этого использовать традиционный формат.

Например, на SunOS, л.д. объединяет повторяющиеся записи в таблице символьных строк. Это может уменьшить размер выходного файла с полной информацией отладки более чем на 30 процентов. К сожалению, программа SunOS «dbx» не может прочитать полученную программу («gdb» не имеет проблем). —традиционный формат переключатель говорит л.д. не объединять дубликаты записей.

—Секция старта имя разделазнак равноорганизация

Найдите раздел в выходном файле по абсолютному адресу, указанному в org. Вы можете использовать эту опцию столько раз, сколько необходимо, чтобы найти несколько разделов в командной строке. org должен быть одним шестнадцатеричным целым числом; для совместимости с другими линкерами, вы можете опустить ведущие0x обычно связаны с шестнадцатеричными значениями. Примечание: между разделом не должно быть пробелов, знак равенства («знак равно») и орг.

-ТБСС организация

-TDATA организация

-TText организация

Используйте org в качестве начального адреса для — соответственно — сегмента «bss», «data» или «text» выходного файла. org должен быть одним шестнадцатеричным целым числом; для совместимости с другими линкерами, вы можете опустить ведущие 0x обычно связаны с шестнадцатеричными значениями.

—дллы-многословные

—подробный

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

—версия-скрипт =версия-файл_сценарий

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

—предупреждаю-общий

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

Существует три вида глобальных символов, проиллюстрированных здесь примерами C:

int i = 1;

Определение, которое содержится в разделе инициализированных данных выходного файла.

extern int i;

Неопределенная ссылка, которая не выделяет место. Там должно быть либо определение, либо общий символ для переменной где-то.

int i;

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

 —предупреждаю-общий Опция может выдавать пять видов предупреждений. Каждое предупреждение состоит из пары строк: первая описывает только что встреченный символ, а вторая описывает предыдущий символ с тем же именем. Один или оба из двух символов будут общим символом.

1.

Превращение общего символа в ссылку, потому что уже есть определение для символа.

 

 (): предупреждение: общее из `'
переопределено по определению
(): предупреждение: определено здесь

2.

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

 

 (): предупреждение: определение `'
переопределение общего
(): предупреждение: общее здесь

3.

Объединение общего символа с предыдущим общим символом того же размера.

 

 (): предупреждение: несколько общих
из `'
(): предупреждение: предыдущий общий здесь

4.

Объединение общего символа с предыдущим большим общим символом.

 

 (): предупреждение: общее из `'
переопределено более распространенным
(): предупреждение: здесь больше общего

5.

Объединение общего символа с предыдущим меньшим общим символом. Это то же самое, что и в предыдущем случае, за исключением того, что символы встречаются в другом порядке.

 

 (): предупреждение: общее из `'
переопределение меньшего общего
(): предупреждение: здесь меньше общего

—предупреждают-конструктор

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

—предупреждаю-множественным зм

Предупреждать, если в выходном файле требуется несколько значений глобального указателя. Это имеет смысл только для определенных процессоров, таких как Alpha. В частности, некоторые процессоры помещают многозначные константы в специальный раздел. Специальный регистр (глобальный указатель) указывает на середину этого раздела, так что константы могут быть эффективно загружены через режим относительной адресации базового регистра. Поскольку смещение в относительном режиме базового регистра является фиксированным и относительно небольшим (например, 16 битов), это ограничивает максимальный размер постоянного пула. Таким образом, в больших программах часто необходимо использовать несколько значений глобального указателя, чтобы иметь возможность обращаться ко всем возможным константам. Эта опция заставляет выдавать предупреждение всякий раз, когда происходит этот случай.

—предупредит однократное

Предупреждайте только один раз за каждый неопределенный символ, а не один раз за модуль, который ссылается на него.

—предупредит сечение выравнивания

Предупреждать, если адрес выходного раздела изменяется из-за выравнивания. Как правило, выравнивание будет установлено секцией ввода. Адрес будет изменен только в том случае, если он не указан явно; то есть, если команда «SECTIONS» не указывает начальный адрес раздела.

—Весь-архив

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

Два замечания при использовании этой опции от gcc: во-первых, gcc не знает об этой опции, поэтому вы должны использовать -Wl, -whole-архив. Во-вторых, не забудьте использовать -Wl, -по-весь-архивпосле вашего списка архивов, потому что gcc добавит свой собственный список архивов к вашей ссылке, и вы, возможно, не захотите, чтобы этот флаг также влиял на них.

—заворачивать условное обозначение

Используйте функцию-обертку для символа. Любая неопределенная ссылка на символ будет преобразована в «__wrap_symbol». Любая неопределенная ссылка на «__real_symbol» будет преобразована в символ.

Это можно использовать для предоставления оболочки для системной функции. Функция-обертка должна называться «__wrap_symbol». Если он хочет вызвать системную функцию, он должен вызвать «__ real_symbol».

Вот тривиальный пример:

 

 пустота *
__wrap_malloc (int c)
{
printf ("malloc вызывается с% ld \ n", c);
return __real_malloc (c);
}

Если вы связываете другой код с этим файлом, используя —завернуть маллок, тогда все вызовы «malloc» будут вызывать функцию «__wrap_malloc». Вызов «__real_malloc» в «__wrap_malloc» вызовет настоящую функцию «malloc».

Вы можете также предоставить функцию «__real_malloc», чтобы ссылки без —заворачивать вариант удастся. Если вы сделаете это, вы не должны помещать определение «__ real_malloc» в тот же файл, что и «__wrap_malloc»; если вы это сделаете, ассемблер может разрешить вызов до того, как у компоновщика появится возможность перевести его в «malloc».

—включить новый и новый-dtags

—отключить-новый-dtags

Этот компоновщик может создавать новые динамические теги в ELF. Но старые системы ELF могут не понимать их. Если вы укажете —включить новый и новый-dtags, динамические теги будут созданы по мере необходимости. Если вы укажете —отключить-новый-dtags, новые динамические теги не будут созданы. По умолчанию новые динамические теги не создаются. Обратите внимание, что эти опции доступны только для ELF систем.

Линкер i386 PE поддерживает -общий опция, которая заставляет вывод быть динамически связанной библиотекой (DLL) вместо нормального исполняемого файла. Вы должны назвать вывод «* .dll» при использовании этой опции. Кроме того, компоновщик полностью поддерживает стандартные файлы «* .def», которые могут быть указаны в командной строке компоновщика как объектный файл (фактически, он должен предшествовать архивам, из которых экспортируются символы, чтобы гарантировать, что они будут связаны, как обычный объектный файл).

В дополнение к параметрам, общим для всех целей, компоновщик i386 PE поддерживает дополнительные параметры командной строки, характерные для цели i386 PE. Параметры, принимающие значения, могут быть отделены от своих значений либо пробелом, либо знаком равенства.

—надстройку STDCALL-псевдоним

Если дано, символы с суффиксом stdcall (@nn) будут экспортированы как есть, а также с удаленным суффиксом.

—базовый файл файл

Используйте файл как имя файла, в котором сохраняются базовые адреса всех перемещений, необходимых для генерации DLL с помощью dlltool.

—длл

Создайте DLL вместо обычного исполняемого файла. Вы также можете использовать -общий или укажите «БИБЛИОТЕКУ» в данном файле «.def».

—включить-STDCALL-исправление

—отключить-STDCALL-исправление

Если ссылка найдет символ, который она не может разрешить, она попытается выполнить «нечеткое связывание» путем поиска другого определенного символа, который отличается только форматом имени символа (cdecl vs stdcall), и разрешит этот символ путем ссылки на матч. Например, неопределенный символ «_foo» может быть связан с функцией «_foo @ 12», или неопределенный символ «_bar @ 16» может быть связан с функцией «_bar». Когда компоновщик делает это, он печатает предупреждение, так как обычно он не должен был связываться, но иногда библиотекам импорта, созданным из сторонних библиотек, может потребоваться эта функция для использования. Если вы укажете —включить-STDCALL-исправление, эта функция полностью включена и предупреждения не распечатываются. Если вы укажете —отключить-STDCALL-исправление, эта функция отключена, и такие несоответствия считаются ошибками.

—экспорт-все-символы

Если дано, все глобальные символы в объектах, использованных для создания DLL, будут экспортированы DLL. Обратите внимание, что это значение по умолчанию, если в противном случае не было бы экспортируемых символов. Когда символы явно экспортируются через файлы DEF или неявно экспортируются через атрибуты функции, по умолчанию не экспортируется ничего другого, если не задана эта опция. Обратите внимание, что символы «DllMain @ 12», «DllEntryPoint @ 0», «DllMainCRTStartup @ 12» и «impure_ptr» не будут экспортироваться автоматически. Кроме того, символы, импортированные из других библиотек DLL, не будут реэкспортироваться, равно как и символы, указывающие внутренний макет библиотеки DLL, такие как символы, начинающиеся с «_head_» или заканчивающиеся «_iname». Кроме того, символы из «libgcc», «libstd ++», «libmingw32» или «crtX.o» не будут экспортированы. Символы, имена которых начинаются с «__rtti_» или «__builtin_», не будут экспортироваться, чтобы помочь с C ++ DLL. Наконец, существует обширный список частных символов cygwin, которые не экспортируются (очевидно, это применимо при создании библиотек DLL для целей cygwin).

К этим исключениям cygwin относятся: «_cygwin_dll_entry @ 12», «_cygwin_crt0_common @ 8», «_ cygwin_noncygwin_dll_entry @ 12», «_fmode», «_impure_ptr», «cygwin_attach_dll», cygwin_pre «, cygwin_pre», cygwin_prein «и» окружающая среда «.

—исключить-символы условное обозначение,условное обозначение,…

Определяет список символов, которые не должны автоматически экспортироваться. Имена символов могут быть разделены запятыми или двоеточиями.

—исключить-LIBS Lib,Lib,…

Указывает список архивных библиотек, из которых символы не должны автоматически экспортироваться. Имена библиотек могут быть разделены запятыми или двоеточиями. Указание «—exclude-libs ALL» исключает символы во всех библиотеках архива из автоматического экспорта. Символы, явно указанные в файле .def, по-прежнему экспортируются независимо от этой опции.

—Файл выравнивания

Укажите выравнивание файла. Разделы в файле всегда начинаются с смещений файла, кратных этому числу. По умолчанию это 512.

—куча резерв

—куча резерв,совершить

Укажите объем памяти, который нужно зарезервировать (и при необходимости зафиксировать) для использования в качестве кучи для этой программы. По умолчанию зарезервировано 1Mb, зафиксировано 4K.

—изображение базы стоимость

Используйте значение в качестве базового адреса вашей программы или DLL. Это самая низкая ячейка памяти, которая будет использоваться при загрузке вашей программы или DLL. Чтобы уменьшить необходимость перемещения и повышения производительности ваших библиотек, каждый из них должен иметь уникальный базовый адрес и не перекрывать любые другие библиотеки. По умолчанию 0x400000 для исполняемых файлов и 0x10000000 для DLL.

—убить-на

Если дано, суффиксы stdcall (@nn) будут удалены из символов перед их экспортом.

—мейджор-образ-версия стоимость

Устанавливает основной номер « версии изображения ». По умолчанию 1.

—мейджор-ОС-версия стоимость

Устанавливает основной номер версии `os ‘. По умолчанию 4.

—мейджор-подсистема-версия стоимость

Устанавливает основной номер «версии подсистемы». По умолчанию 4.

—минорное изображение версия стоимость

Устанавливает младший номер « версии изображения ». По умолчанию 0.

—минорная ОС-версия стоимость

Устанавливает младший номер версии os. По умолчанию 0.

—минорной подсистема-версия стоимость

Устанавливает младший номер «версии подсистемы». По умолчанию 0.

—выход четкости файл

Компоновщик создаст файл, который будет содержать файл DEF, соответствующий библиотеке DLL, которую генерирует компоновщик. Этот файл DEF (который должен называться «* .def») может использоваться для создания библиотеки импорта с помощью «dlltool» или может использоваться как ссылка на автоматически или неявно экспортируемые символы.

—из-Implib файл

Компоновщик создаст файл, который будет содержать импортируемую библиотеку, соответствующую DLL, которую генерирует компоновщик. Эта библиотека импорта (которая должна называться «* .dll.a» или «* .a» может использоваться для связи клиентов с созданной DLL; это поведение позволяет пропустить отдельный этап создания библиотеки импорта «dlltool»).

—включить автоматический режим-образную базу

Автоматически выбирайте базу изображений для DLL, если она не указана с помощью аргумента «—image-base». Используя хеш, сгенерированный из имени dll для создания уникальных баз изображений для каждой DLL, можно избежать коллизий и перемещений в памяти, которые могут задержать выполнение программы.

—отключить-авто-образ базы

Не генерируйте автоматически уникальную базу изображений. Если пользовательская база изображений отсутствует («—image-base»), используйте платформу по умолчанию.

—дллы-поиск-приставка строка

При динамическом соединении с dll без библиотеки импорта ищите «.dll» вместо «lib.dll». Такое поведение позволяет легко различать библиотеки DLL, созданные для различных «подплатформ»: native, cygwin, uwin, pw и т. Д. Например, библиотеки cygwin обычно используют «—dll-search-prefix = cyg».

—включить-авто-импорт

Выполните сложное связывание «_symbol» с «__imp__symbol» для импорта данных DATA из библиотек DLL и создайте необходимые символы thunking при создании библиотек импорта с использованием этих данных DATAexports. Обычно это «просто работает» — но иногда вы можете увидеть это сообщение:

«переменная» не может быть импортирована автоматически. Пожалуйста, прочитайте документацию для ld «—enable-auto-import» для деталей. «

Это сообщение возникает, когда какое-либо (под) выражение обращается к адресу, который в конечном итоге определяется суммой двух констант (таблицы импорта Win32 допускают только одну). Случаи, когда это может происходить, включают в себя доступ к полям-членам структурных переменных, импортированных из DLL, а также использование постоянного индекса в переменной массива, импортированной из DLL. Любая переменная с несколькими словами (массивы, структуры, long long и т. Д.) Может вызвать это состояние ошибки. Однако, независимо от точного типа данных экспортируемой переменной, нарушающей работу, ld всегда обнаружит ее, выдаст предупреждение и завершит работу.

Существует несколько способов решения этой проблемы, независимо от типа данных экспортируемой переменной:

Одним из способов является использование ключа —enable-runtime-pseudo-reloc. Это оставляет задачу настройки ссылок в вашем клиентском коде для среды выполнения, поэтому этот метод работает только тогда, когда среда выполнения поддерживает эту функцию.

Второе решение состоит в том, чтобы заставить одну из «констант» быть переменной, то есть неизвестной и неоптимизируемой во время компиляции. Для массивов есть две возможности: а) сделать индекс (адрес массива) переменной, или б) сделать «постоянный» индекс переменной. Таким образом:

 

 тип extern extern_array [];
extern_array [1] ->
{volatile type * t = extern_array; т [1]}

или же

 

 тип extern extern_array [];
extern_array [1] ->
{volatile int t = 1; extern_array [t]}

Для структур (и большинства других типов данных с несколькими словами) единственным вариантом является создание самой структуры (или long long, или …):

 

 extern struct s extern_struct;
extern_struct.field ->
{volatile struct s * t = extern_struct; t-> field}

или же

 

 extern long long extern_ll;
extern_ll ->
{volatile long long * local_ll = extern_ll; * local_ll}

Третий метод решения этой проблемы — отказаться от «автоимпорта» для символа-нарушителя и пометить его как «__declspec (dllimport)». Однако на практике это требует использования времени компиляции #defines, чтобы указать, собираете ли вы DLL, создаете клиентский код, который будет ссылаться на DLL, или просто создаете / связываете со статической библиотекой. Делая выбор между различными методами решения проблемы «прямой адрес с постоянным смещением», вы должны учитывать типичное реальное использование:

Оригинал:

 

 --foo.h
extern int arr [];
--foo.c
#include "foo.h"
void main (int argc, char ** argv) {
Е ( "% d \ п", обр [1]);
}

Решение 1:

 

 --foo.h
extern int arr [];
--foo.c
#include "foo.h"
void main (int argc, char ** argv) {
/ * Это временное решение для win32 и cygwin; не "оптимизировать" * /
volatile int * parr = arr;
Е ( "% d \ п", Парр [1]);
}

Решение 2:

 

 --foo.h
/ * Примечание: предполагается автоматический экспорт (без __declspec (dllexport)) * /
#if (определено (_WIN32) || определено (__ CYGWIN__)) \
!(определено (FOO_BUILD_DLL) || определено (FOO_STATIC))
#define FOO_IMPORT __declspec (dllimport)
#else
#define FOO_IMPORT
#endif
extern FOO_IMPORT int arr [];
--foo.c
#include "foo.h"
void main (int argc, char ** argv) {
Е ( "% d \ п", обр [1]);
}

Четвертый способ избежать этой проблемы — перекодировать вашу библиотеку, чтобы использовать функциональный интерфейс, а не интерфейс данных для проблемных переменных (например, функции доступа set_foo () и get_foo ()).

—отключение-авто-импорт

Не пытайтесь выполнить сложное связывание «_symbol» с «__imp__symbol» для импорта данных из DLL.

—включить-среда-псевдо-RELOC

Если ваш код содержит выражения, описанные в разделе —enable-auto-import, то есть DATAimports из DLL с ненулевым смещением, этот переключатель создаст вектор «псевдоперемещений во время выполнения», который может использоваться средой времени выполнения для настройки ссылок к таким данным в вашем коде клиента.

—отключение-среда-псевдо-RELOC

Не создавайте псевдо-перемещений для импорта данных DATA с ненулевым смещением из DLL. Это по умолчанию.

—включить-экстра-Пе-отлаживать

Показать дополнительную информацию об отладке, относящуюся к символу автоматического импорта символов.

—Секция выравнивания

Устанавливает выравнивание раздела. Разделы в памяти всегда начинаются с адресов, кратных этому числу. По умолчанию 0x1000.

—стек резерв

—стек резерв,совершить

Укажите объем памяти, который нужно зарезервировать (и при необходимости зафиксировать) для использования в качестве стека для этой программы. По умолчанию зарезервировано 2Mb, зафиксировано 4K.

—подсистема который

—подсистема который:главный

—подсистема который:главный.незначительный

Определяет подсистему, в которой будет выполняться ваша программа. Допустимые значения для whichare: «native», «windows», «console» и «posix». Вы также можете установить версию подсистемы.

Важный: Используйте команду man (% man), чтобы увидеть, как команда используется на вашем компьютере.

Ссылка на основную публикацию