Linux/Unix Команда: Id

НАЗВАНИЕ

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

СИНТАКСИС

ld [ параметры ] objfile

ОПИСАНИЕ

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

ld принимает файлы языка команд компоновщика, написанные в расширенном наборе синтаксиса языка команд редактора ссылок AT & T, чтобы обеспечить явный и полный контроль над процессом компоновки.

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

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

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

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

ОПЦИИ

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

-A Архитектура

– архитектура = Архитектура

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

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

-b Вводится формат

– формат = Вводится формат

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

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

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

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

-c МРТ-commandfile

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

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

-d

-dc

-dp

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

-e запись

– запись = запись

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

-E

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

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

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

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

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

-EB

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

-EL

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

-f

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

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

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

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

-F имя

– фильтр имя

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

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

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

-fini имя

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

-g

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

-G значение

– gpsize = значение

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

-h имя

-soname = имя

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

-i

Выполните добавочную ссылку (аналогично опции -r ).

-init имя

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

-l Архив

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

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

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

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

См. Параметр – (), чтобы заставить компоновщик искать архивы несколько раз.

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

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

-L searchdir

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

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

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

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

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

-m эмуляция

Эмулируйте компоновщик emulation . Вы можете перечислить доступные эмуляции с помощью параметров – verbose или -V .

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

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

-M

– печать карта

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

*

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

*

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

*

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

-n

– nmagic

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

-N

– omagic

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

– нет-omagic

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

-o Выход

– выход = Выход

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

-O уровень

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

-q

– выделяющие-relocs

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

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

-r

– relocateable

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

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

Этот параметр делает то же самое, что и -i .

-R имя_файла

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

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

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

-s

– стрип-все

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

-S

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

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

-t

– след

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

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

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

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

-u <сильный /> символ

– неопределенными = символ

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

-ur

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

– уникальный [= Раздел ]

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

-v

– версия

-V

Отобразите номер версии для ld . Опция -V также содержит список поддерживаемых эмуляций.

-x

– отбрасывать-все

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

-X

– выбросить-местные

Удалить все временные локальные символы. Для большинства целей это все локальные символы, имена которых начинаются с 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» отключает создание копий перемещений.

– ( архивы -)

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

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

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

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

– принять неизвестный-вход-арка

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

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

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

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

-Bdynamic

ау

-call_shared

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

-Bgroup

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

-Bstatic

-dn

-non_shared

-static

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

-Bsymbolic

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

– проверка сечений

– нет-чек-секции

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

– CREF

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

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

– нет-определения-общий

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

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

– 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».

– не-ГЦ-секции

– ГЦ-секции

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

– помощь

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

– целевой помощь

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

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

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

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

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

– не-не определено

-z defs

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

<Сильного> – позволяют многодисковое определение

-z muldefs

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

– позволяют-shlib-неопределенными

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

– нет-неопределенными-версия

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

– не предупреждайте-рассогласование

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

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

Отключите эффект параметра – весь архив для последующих файлов архива.

– noinhibit-Exec

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

-nostdlib

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

– oformat выход формата

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

-qmagic

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

-Qy

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

– расслабить

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

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

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

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

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

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

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

Вы можете указать – retain-symbols-file только один раз в командной строке. Он переопределяет -s и -S .

-rpath папка

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

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

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

-rpath-ссылка DIR

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

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

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

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

1.

Все каталоги, указанные в параметрах -rpath-link .

2.

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

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 существует, список каталогов, найденных в этом файле.

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

-shared

-Bshareable

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

– сортировки общий

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

– разделить по файлам [ размер ]

Аналогично – split-by-reloc , но создает новый раздел вывода для каждого входного файла при достижении размера . размер по умолчанию равен 1, если не указан.

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

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

– статистика

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

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

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

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

– секция-старт имя раздела = орг

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

-Tbss орг

-Tdata орг

-Ttext орг

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

– длл-многословным

– многословный

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

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

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

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

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

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

int i = 1;

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

extern int i;

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

int i;

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

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

1.

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

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

2.

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

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

3.

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

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

4.

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

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

5.

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

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

<Сильного> – предостерегает-конструкторы

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

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

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

– предупреждают однократное

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

– предупредит сечение выравнивать

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

– весь-архив

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

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

– обернуть символ

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

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

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

 void * 
__wrap_malloc (int c)
{
printf ("malloc вызван с% ld \ n", c);
return __real_malloc (c);
}

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

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

– включить новые-dtags

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

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

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

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

– адд-STDCALL псевдоним

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

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

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

– длл

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

– включить-STDCALL-Fixup

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

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

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

Если дано, все глобальные символы в объектах, использованных для создания 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”, cygwin_preg_preg_preg_preg_preg_preg_preg_preg_preg_preg_preg_pre , “Cygwin_premain3” и “environment”.

– исключающие-символы символ символ

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

– исключающие-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.

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

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

– из-Implib файл

Компоновщик создаст файл file , который будет содержать библиотеку импорта, соответствующую библиотеке 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 type extern_array []; 
extern_array [1] ->
{volatile type * t = extern_array; t [1]}

или же

 extern type 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) {
printf ("% d \ n", arr [1]);
}

Решение 1:

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

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

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

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

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

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

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

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

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

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

– раздел выравнивание

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

– стек <сильный /> Резерв

– стек Резерв фиксации

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

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

– подсистема , который главная

– подсистема , который :. главная второстепенный

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

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

Оцените статью
Solutics.ru
Добавить комментарий