УДОСТОВЕРЕН

ЮФКВ.УД

Микросхема интегральная 1879ВМ2

Пакет средств разработки С/С++ программ для процессоров NeuroMatrix для операционных платформ Linux и Win32

Редактор связей (компоновщик) объектных файлов для микропроцессоров NeuroMatrix для платформы Win32

Руководство программиста

ЮФКВ.30074

(ЮФКВ.30074ФЛ)

Листов 24

Литера

Инв. N подл.

Подп. и дата

Взам. инв. N

АННОТАЦИЯ

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

1. На кого рассчитано данное руководство

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

2. Структура книги

Каждая глава руководства рассматривает отдельную тему, относящуюся к редактору связи.

3. Обратная связь

Мы старались сделать это руководство полезным, и очень хотелось бы услышать Ваше мнение о нем. Мы ценим обратную связь и благодарны любым письмам. Высылать свои письма Вы можете по адресу <*****@***ru>

Можно также воспользоваться обратной связью организованной на нашем сайте http://www. *****

СОДЕРЖАНИЕ

1. Командная строка................................................................................................................................ 4

2. Библиотеки объектных модулей........................................................................................................ 7

2.1. Создание библиотек..................................................................................................................... 7

2.2. Операции над библиотеками...................................................................................................... 7

2.3. Использование библиотек........................................................................................................... 8

3. Особенности реализации.................................................................................................................... 9

3.1. Размещение секций...................................................................................................................... 9

3.1.1. Конфигурационный файл.................................................................................................... 9

3.1.1.1. Пример использования конфигурационного файла................................................. 10

3.1.2. Стартовые и конечные символы....................................................................................... 10

3.1.3. Размещение секций в исполняемом файле....................................................................... 11

3.2. Особенности WEAK связывания............................................................................................. 13

3.3. Особенности COMMON связывания....................................................................................... 13

3.4. МАР - файл.................................................................................................................................. 14

Приложение A. Диагностические сообщения компоновщика........................................................ 15

A.1. Фатальные ошибки.................................................................................................................... 15

A.2. Ошибки....................................................................................................................................... 18

A.3. Предупреждения........................................................................................................................ 22

1. Командная строка

Компоновщик объектных файлов имеет два режима своей работы. Выбор режима управляется наличием или отсутствием опции -l.

·  Основной режим работы компоновщика – генерация исполняемого файла (опция -l отсутствует) в формате ELF.

·  Опция –l указывает компоновщику работать в режиме библиотекаря. В этом режиме обязательная опция –o указывает имя библиотеки, с которой работает библиотекарь.

Имя выходного файла указывается необязательной опцией –o. Имена по умолчанию составляются из имени первого из связываемых модулей и расширения .elf.

Синтаксис командной строки редактора связей:

lnk. exe [ опции [[ имя_объектного_файла ] | [ имя_модуля ]] ] [ имя_модуля ]

опции

Один из параметров, приведенных в Таблица 1.1, «Опции».

имя_объектного файла

Имя файла, предназначенного для связывания.

имя_модуля

Имя модуля. Необходимо для работы в режиме библиотеки.

Таблица 1.1. Опции

-h (-help)

вывести краткую информация об опциях командной строки.

-p[имя_файла]

создать карту (МАР - файл).

-q (-quiet)

«Тихий» режим. Выполнить без вывода информации на экран.

-l (-lib)

Указывает компоновщику работать в режимах библиотекаря. Эта опция необходима при использовании и она должна стоять слева от следующих опций: - f, - a, - i, - e.

-f (-forced)

Добавить модуль(и) в библиотеку с атрибутом принудительного связывания. Для выполнения данной операции необходимо наличие опции - l.

-a (-add)

Добавить модуль(и) в библиотеку. Для выполнения данной операции необходимо наличие опции - l.

-e (-extract)

Извлечь модуль и сохранить на диске. Модуль при этом удаляется из библиотеки. Для выполнения данной операции необходимо наличие опции - l.

-i (-info)

Вывести список модулей и символов библиотеки. Для выполнения данной операции необходимо наличие опции - l.

-ofile

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

-cfile

Имя конфигурационного файла. По умолчанию используется map. cfg.

-nd

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

-Mcodepage

Установка языка и кодировки сообщений компилятора

Предписывает компилятору выводить все диагностические сообщения на указанном языке и в указанной кодировке. Допустимые значения codepage:

"en_US.850" - английский язык, кодировка 850;

"ru_RU.1251" - русский язык, кодировка 1251 (Windows);

"ru_RU.866" - русский язык, кодировка 866 (DOS).

Значение по умолчанию "en_US.850" (используется английский язык, кодировка 850).

Пример:

-M "ru_RU.1251"

-Men_US.850

--

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

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

НЕ нашли? Не то? Что вы ищете?

lnk. exe main. obj \LIB\cpp. lib

Генерирует объектный файл с расширением "elf", используя объектный файл main. obj и библиотеку \LIB\cpp. lib.

2. Библиотеки объектных модулей

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

2.1. Создание библиотек

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

lnk. exe - l - a - oимя_библиотеки имя_объектного_модуля

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

Например, для создания библиотеки с именем my. lib, которая будет содержать один объектный модуль с именем math. obj, надо ввести команду

lnk. exe - l - a - omy math. obj

2.2. Операции над библиотеками

Для дальнейшего добавления объектных модулей в уже созданную библиотеку используется опция - a.

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

Для удаления из библиотеки модуля используется опция - e. Результатом операции будет удаление модуля из библиотеки и сохранении его на диске. Имя модуля указывается без разрешения.

lnk. exe - l - e - ocpplib. lib math

Для копирования модуля из библиотеки надо будет последовательно воспользоваться опцией - e и опцией - a.

lnk. exe - l - e - ocpplib. lib math

lnk. exe - l - a - ocpplib. lib math. obj

Может понадобиться просмотреть модули, входящие в библиотеку. Для этого нужно ввести команду

lnk. exe - l - i - oclib. lib

2.3. Использование библиотек

Имена используемых библиотек разделяются одним или несколькими пробелами или табуляцией.

3. Особенности реализации

3.1. Размещение секций

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

3.1.1. Конфигурационный файл

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

<ФАЙЛ> ::= (<описание раздела>)*

<описание раздела> ::= [<задание размера стека или кучи>] '\n' [(<информация о размещении области раздела>)*] '\n'

<задание размера стека или кучи> ::= stacksize | heapsize <размер> '\n'

<информация о размещении области раздела> ::= (<адрес начала > | Next)[<макс. размер> ] '\n'

default | ( (<имя секции> | <атрибуты> ) [ '(' ("имя библиотеки "[ ':' "имя модуля" ( ',' "имя модуля" ) * ] | "имя модуля" ) ')' ] ) '\n'

<атрибуты> - любой непустой набор из +ro, +data, разделённых любым числом пробелов. При этом для разделов данных допустимо указывать только атрибут +data, а для разделов команд необходимо, чтобы присутствовал атрибут +ro.

<имя секции> := "имя секции" | code | data | zidata | init | heap | stack

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

Допустимо разделение строк конфигурационного файла пустыми строками.

Конфигурационный файл задаётся опцией компоновщика - c, либо по умолчанию ищется файл map. cfg в каталоге, в котором располагается исполняемый файл компоновщика (lnk. exe).

3.1.1.1. Пример использования конфигурационного файла

stacksize 0x1000

heapsize 0x3000

0x

+ro ("f1.obj" "f2.obj" "mylib. lib":"f10")

Next

".mycode"

0x3000

".mydata" ("mylib. lib")

Next

Default

В данном примере установлены размеры стека и кучи. Далее указано, что в первой области (начинается адреса 0x200) размещаются секции кода из объектных файлов f1.obj и f2.obj и библиотечного модуля f10 библиотеки mylib. lib. Также указан максимально допустимый размер данной области = 1000. В следующую область попадут секции с именем “.mycode”. Данная область размещается в памяти сразу же после предыдущей. C адреса 0x3000 размещаются секции “.mydata” из библиотеки “mylib. lib”. И, наконец, в оставшуюся область попадают все остальные секции.

3.1.2. Стартовые и конечные символы

Для удобства доступа к секциям введены символы, указывающие на начало и конец секции (конец секции – адрес, следующий за последним байтом секции). Имена этих символов получаются следующим образом: Сначала в имени секции все символы “.” заменяются на “_”, а “_” – на “__”. Затем к преобразованному имени секции (_text) добавляется в начало два знака подчеркивания, за которыми идет имя секции. После имени добавляется два подчеркивания и слово base или limit в зависимости от признака начала или конца секции соответственно, например: (___text__base).

В качестве примера использования стартовых и конечных символов можно предложить следующий:

Пример 3.1. Вычисление размера кучи.

#include <stddef. h>

extern "C" char __heap__base;

extern "C" char __heap__limit;

int main ()

{

size_t heap_size = &__heap__limit - &__heap__base;

return heap_size;

}

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

3.1.3. Размещение секций в исполняемом файле

Различные секции содержат программные инструкции и управляющую информацию. Секции расположенные ниже предопределены и имеют свои типы и атрибуты.

Таблица 3.1. Предопределенные имена секций

Имя секции

Размер секции по умолчанию

Тип секции

Атрибуты

.text

0

SHT_PROGBITS

SHF_EXECINSTR + SHF_ALLOC

.data

0

SHT_PROGBITS

SHF_WRITE + SHF_ALLOC

.bss

0

SHT_NOBITS

SHF_WRITE + SHF_ALLOC

.init

0

SHT_PROGBITS

SHF_ALLOC

.stack

0x10000

SHT_NOBITS

SHF_WRITE + SHF_ALLOC + SHF_NOINIT

.heap

0x10000

SHT_NOBITS

SHF_WRITE + SHF_ALLOC + SHF_NOINIT

.text

Эта секция содержит текст или исполняемые инструкции программы.

.data

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

.bss

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

.init

Эта секция содержит адреса функций, которые должны быть вызваны для инициализации программы. При исполнении программы эти функции вызываются до вызова главной функции программы. (Для C это функция main())

.stack

Во время исполнения программы эта область памяти используется для работы со стеком.

.heap

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

Последовательность загрузки секций из объектного файла следующая: при распределении очередной секции определяется область, в которую попадает данная секция. Каждая область характеризуется адресом начала, максимально возможным размером и признаками (атрибуты, имена и местоположение секций), по которым анализируемые секции можно отнести именно к данной области. При распределении имя секции имеет более высокий приоритет, чем её атрибуты. Поэтому если в соответствии со своим именем секция попадает в первую область, а по атрибутам во вторую, то она будет размещена в первой области. Однако совпадение имени секции или её атрибутов ещё не гарантирует её размещение в выбранном адресном пространстве. Если в описании области присутствует указание на месторасположение (список файлов и библиотек), то происходит дополнительная проверка. Если получилось так, что секция по своему описанию попала более чем в одну область, то выбирается та из них, которая имеет наименьший адрес начала. Если же секция не попала ни в одну из областей, то в качестве области распределения берётся та область раздела, в описании которой присутствует ключевое слово default. Если же и такой области нет, то секция размещается в области раздела, имеющей максимальный адрес начала. Конфигурационный файл может быть построен так, что в нём отсутствуют описания областей или же может не быть самого конфигурационного файла. В этом случае считается, что существует единственная область, начинающаяся с нулевого адреса. Секции с одинаковыми именами, попавшие в одну и ту же область, располагаются последовательно друг за другом. Порядок размещения секций с предопределёнными именами, попавшими в одну и ту же область, следующий: .text, .data, .bss, .init, .stack, .heap. Секции с именами, отличающимися от предопределённых, размещаются после. Например, если в некую область попали секции с именами .text, .data и. text2, то сначала будут размещены секции .text, затем .data и, наконец, .text2.

3.2. Особенности WEAK связывания

Когда редактор связей (компоновщик) объединяет несколько объектных файлов, то не разрешается множественное объявление глобальных символов с одинаковыми именами. С другой стороны, если есть объявленный глобальный символ, то появление WEAK символа с таким же именем, не вызовет ошибки. Компоновщик отождествляет эти символы и секции, в которых они находятся. То же верно и для двух и более символов со связыванием STB_WEAK.

3.3. Особенности COMMON связывания

Если имя символа(ов), объявленного(ых) в секции SHN_COMMON, совпадает с именем символа, объявленного в нормальной секции, то символ из SHN_COMMON будет указывать на символ из обычной секции. Если же все символы с данным именем относятся к секции SHN_COMMON, то для символа в секции .bss будет выделена память. Размер выделяемой памяти будет взят из атрибута символа SH_SIZE.

3.4. МАР - файл

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

·  перечисляются ошибки и замечания

·  перечисляются все секции

·  перечисляются все символы

Для секций указывается тип и атрибуты в следующем виде:

тип

P

Секция имеет тип SGT_PROGBITS

N

Секция имеет тип SGT_NOBITS

атрибуты

D

У секции нет признака SHF_EXECINSTR (секция данных)

RO

У секции нет признака SHF_WRITE (секция только для чтения)

NA

У секции нет признака SHF_ALLOC (для секции не отводится пространство в исполняемом образе в памяти)

Приложение A. Диагностические сообщения компоновщика

A.1. Фатальные ошибки

LNK00001 FATAL

Недостаточно памяти

not enough memory

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

LNK00002 FATAL

ошибка при работе с файлом: %s

file error: %s

Произошла ошибка при обращении к файлу.

LNK00005 FATAL

ELF имеет слишком большой размер

size of ELF is too big

Произошла ошибка при обращении к файлу.

LNK00006 FATAL

Отсутствуют переход на новую строку или пробелы

New line or white space expected

Выдается, когда вместо конца строки встречаем недопустимые символы

LNK00007 FATAL

Лишние символы в конце числа

extra text after expected end of number

Лишние символы в конце числа

LNK00008 FATAL

Адрес начала области слишком большой

Address of area is too big

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

LNK00009 FATAL

Размер области слишком велик

Size of area is too big

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

LNK00010 FATAL

Размер секции слишком велик

Size of section is too big

Выдается, когда размер секции превышает размер адресного пространства

LNK00011 FATAL

Неправильное указание размещения секции

Bad description of section location

Описание местоположения секции задано неправильно

LNK00012 FATAL

Неизвестно имя атрибута

Unknown atribute name

Выдается, когда имя атрибута отличается от ro и data

LNK00013 FATAL

Ошибочное указание имени секции

Bad section name

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

LNK00014 FATAL

Ошибочное описание начала области

Bad description of area

При задании области отсутствует адрес её начала.

LNK00016 FATAL

Незавершенное описание области

Unfinished area description

Незавершенное описание области

LNK00017 FATAL

Ошибочное задание начала описания секции

Bad beginning of section description

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

LNK00018 FATAL

Размер секции определен не для всех секций

Section size isn't defined for all sections

Размер секции определен не для всех секций.

LNK00020 FATAL

Слишком много default

Too many 'default'

Ключевое слово 'default' нельзя указывать более одного раза.

A.2. Ошибки

LNK00101 ERROR

Неверный формат объектного файла

illegal format of elf object file

Неверный формат объектного файла.

LNK00102 ERROR

Ошибка во время записи в файл

error while storing output file

Произошла ошибка во время записи в файл

LNK00103 ERROR

Не могу открыть объектный файл (библиотеку)

cannot open object file '%s'

Возможно указан неверный путь и/или имя файла или файл не является объектным.

LNK00104 ERROR

Не могу открыть объектный файл (библиотеку)

fail to open object file '%s'

Возможно указан неверный путь и/или имя файла или файл не является объектным. Аналогична ошибке cannot open object file "имя_объектного_файла".

LNK00105 ERROR

Повторное объявление внешнего символа

duplicate external '%s' (defined in modules '%s' and '%s')

Повторное объявление внешнего символа.

LNK00106 ERROR

Возникла ошибка записи файла на диск

file error while writing '%s' to disk

Возможно, диск переполнен или защищен от записи.

LNK00107 ERROR

Модуль с таким именем уже существует

module with name '%s' already exists

Модуль с таким именем уже существует. Измените имя модуля и повторите попытку.

LNK00108 ERROR

Не указано имя библиотеки

no library name specified

Укажите имя библиотеки.

LNK00109 ERROR

Модуль с таким именем уже существует

no module with the name '%s'

Измените имя и попробуйте еще раз.

LNK00110 ERROR

Операция не определена в режиме библиотеки

no operation specifiend in librarian mode

Операция не определена в режиме библиотеки.

LNK00111 ERROR

Нет такой библиотеки

no such library

Нет такой библиотеки. По указанному пути не найдена библиотека. Проверьте правильность написания пути и имени библиотеки.

LNK00112 ERROR

Секция конфликтует в адресном пространстве

section '%s' has conflicting address space allocation

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

LNK00113 ERROR

Символ с таким именем уже существует

symbol '%s' already exists

Измените имя символа.

LNK00114 ERROR

Формат библиотеки больше не поддерживается

library format is no longer supported

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

LNK00117 ERROR

Размер области (%u) превышает её максимально допустимый размер (%u)

Size of area (%u) is bigger than its maximum size (%u)

Размер области превышает её максимально допустимый размер.

LNK00125 ERROR

Неразрешенный внешний символ

unresolved external '%s' (module '%s')

Неразрешенный внешний символ.

LNK00126 ERROR

Неразрешенный внешний WEAK символ

unresolved weak external '%s' (module '%s')

Неразрешенный внешний WEAK символ.

LNK00150 COMMAND LINE ERROR

Несовместима с предыдущими опциями

overriding option '%s'

Указанная опция не может использоваться с предыдущей.

LNK00151 COMMAND LINE ERROR

Данная операция может использоваться только в режиме библиотекаря

operation makes sense only in librarian mode '%s'

Данная операция может использоваться только в режиме библиотекаря. Используйте опцию - l для входа в режим библиотекаря.

LNK00152 COMMAND LINE ERROR

Допускается использовать одновременно только одну операцию в режиме библиотекаря

only one operation allowed in librarian mode '%s'

Допускается использовать одновременно только одну операцию в режиме библиотекаря.

LNK00153 COMMAND LINE ERROR

Неизвестная опция '%s'

unknown option '%s'

Неизвестная опция '%s'. Проверьте правильность написания командной строки.

LNK00154 COMMAND LINE ERROR

Не указано имя объектного файла

missing object file name

Укажите имя объектного файла.

LNK00155 ERROR

деление на ноль целого

integer division by zero

Ошибка при деление, деление на ноль.

A.3. Предупреждения

LNK00201 WARNINGS

Отсутствует точка входа

entry point missed

Отсутствует точка входа. Возможно, не указана(ы) библиотеки.

LNK00202 WARNINGS

Секция имеет конфликтные атрибуты

section '%s' has conflicting attributes

Атрибуты секции не совпадают с атрибутами другой секции с тем же именем.

LNK00207 WARNING

Неизвестная кодировка

Unknown coding

Неизвестная кодировка.

LNK00250 COMMAND LINE WARNING

Повторяющаяся опция

duplicate option '%s'

Повторяющаяся опция не обрабатывается.

LNK00251 COMMAND LINE WARNING

Данная опция используется только в режиме библиотекаря

option '%s' only makes sense in linker mode

Данная опция используется только в режиме библиотекаря.


Лист регистрации изменений

Номера листов (страниц)

Всего

Входящий

Изм

изме-

заменен-

новых

аннули-

листов

N

N сопрово-

Подп.

Да-

.

ненных

ных

рован-

(страниц)

докумен-

дительного

та

ных

в докум.

та

документа

и дата