УДОСТОВЕРЕН ЮФКВ.30074-01-УД МИКРОСХЕМА ИНТЕГРАЛЬНАЯ 1879ВМ2 ПАКЕТ СРЕДСТВ РАЗРАБОТКИ С/С++ ПРОГРАММ ДЛЯ ПРОЦЕССОРОВ NEUROMATRIX ДЛЯ ОПЕРАЦИОННЫХ ПЛАТФОРМ LINUX И WIN32 Редактор связей (компоновщик) объектных файлов для микропроцессоров NeuroMatrix для платформы Win32 Руководство программиста ЮФКВ.30074-01 33 02 (ЮФКВ.30074-01 33 02-001ФЛ) Листов 24 Литера Инв.N подл. Подп. и дата Взам.инв.N 2 ЮФКВ.30074-01 33 02 АННОТАЦИЯ Данный документ содержит руководство пользователя на редактор связей (компоновщик) объектных файлов, получаемого в результате работы компилятора Интерстрон C++. Описываются используемые опции командной строки, диагностические сообщения и особенности текущей реализации. 1. На кого рассчитано данное руководство Данное руководство будет полезно каждому, кто разрабатывает приложения для микропроцессоров NeuroMatrix. 2. Структура книги Каждая глава руководства рассматривает отдельную тему, относящуюся к редактору связи. 3. Обратная связь Мы старались сделать это руководство полезным, и очень хотелось бы услышать Ваше мнение о нем. Мы ценим обратную связь и благодарны любым письмам. Высылать свои письма Вы можете по адресу <about@interstron.ru> Можно также воспользоваться обратной связью организованной на нашем сайте http://www.interstron.ru 3 ЮФКВ.30074-01 33 02 СОДЕРЖАНИЕ 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 4 ЮФКВ.30074-01 33 02 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. 5 ЮФКВ.30074-01 33 02 -f (-forced) -a (-add) -e (-extract) -i (-info) Добавить модуль(и) в библиотеку с атрибутом принудительного связывания. Для выполнения данной операции необходимо наличие опции -l. Добавить модуль(и) в библиотеку. Для выполнения данной операции необходимо наличие опции -l. Извлечь модуль и сохранить на диске. Модуль при этом удаляется из библиотеки. Для выполнения данной операции необходимо наличие опции -l. Вывести список модулей и символов библиотеки. Для выполнения данной операции необходимо наличие опции -l. Имя исполняемого файла в режиме компоновщика и имя создаваемой -ofile библиотеки в режиме библиотекаря. Пробела или другого разделяющего знака между опцией и именем файла быть не должно. -cfile Имя конфигурационного файла. По умолчанию используется map.cfg. Не добавлять в исполняемый файл отладочные секции. Все секции, чьё имя -nd начинается с .debug не будут включены в исполняемый файл. Используется в режиме компоновщика. Установка языка и кодировки сообщений компилятора Предписывает компилятору выводить все диагностические сообщения на указанном языке и в указанной кодировке. Допустимые значения codepage: "en_US.850" - английский язык, кодировка 850; "ru_RU.1251" - русский язык, кодировка 1251 (Windows); "ru_RU.866" - русский язык, кодировка 866 (DOS). -Mcodepage Значение по умолчанию "en_US.850" (используется английский язык, кодировка 850). Пример: -M "ru_RU.1251" -Men_US.850 6 ЮФКВ.30074-01 33 02 -- Используется для указания парсеру командной строки, что все последующие аргументы не являются опциями. Пример 1.1. Примеры использования командной строки lnk.exe main.obj \LIB\cpp.lib Генерирует объектный файл с расширением "elf", используя объектный файл main.obj и библиотеку \LIB\cpp.lib. 7 ЮФКВ.30074-01 33 02 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 8 ЮФКВ.30074-01 33 02 Для копирования модуля из библиотеки надо будет последовательно воспользоваться опцией -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. Использование библиотек Имена используемых библиотек разделяются одним или несколькими пробелами или табуляцией. 9 ЮФКВ.30074-01 33 02 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 – указание компоновщику, что секции данной области следует размещать с конца предыдущей области. Если при этом описание предыдущей области в конфигурационном файле отсутствует, то секции будут размещаться, начиная с нулевого адреса. Допустимо разделение строк конфигурационного файла пустыми строками. 10 ЮФКВ.30074-01 33 02 Конфигурационный файл задаётся опцией компоновщика -c, либо по умолчанию ищется файл map.cfg в каталоге, в котором располагается исполняемый файл компоновщика (lnk.exe). 3.1.1.1. Пример использования конфигурационного файла stacksize 0x1000 heapsize 0x3000 0x200 1000 +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). 11 ЮФКВ.30074-01 33 02 В качестве примера использования стартовых и конечных символов можно предложить следующий: Пример 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 .init 0 SHT_PROGBITS SHF_ALLOC .stack 0x10000 SHT_NOBITS SHF_WRITE + SHF_ALLOC SHF_WRITE + SHF_ALLOC + 12 ЮФКВ.30074-01 33 02 Имя Размер секции по секции умолчанию Тип секции Атрибуты SHF_NOINIT .heap 0x10000 SHF_WRITE + SHF_ALLOC + SHT_NOBITS SHF_NOINIT .text Эта секция содержит текст или исполняемые инструкции программы. .data Эта секция содержит проинициализированные данные, которые вносятся в область данных программы .bss Эта секция содержит не проинициализированные данные, которые вносятся в область данных программы. В момент запуска программы, область память заполняется нулями. .init Эта секция содержит адреса функций, которые должны быть вызваны для инициализации программы. При исполнении программы эти функции вызываются до вызова главной функции программы. (Для C это функция main()) .stack Во время исполнения программы эта область памяти используется для работы со стеком. .heap Область памяти, называемая "кучей", используется для динамической работы с памятью. Последовательность загрузки секций из объектного файла следующая: при распределении очередной секции определяется область, в которую попадает данная секция. Каждая область характеризуется адресом начала, максимально возможным размером и признаками (атрибуты, имена и местоположение секций), по которым анализируемые секции можно отнести именно к данной области. При распределении имя секции имеет более высокий 13 ЮФКВ.30074-01 33 02 приоритет, чем её атрибуты. Поэтому если в соответствии со своим именем секция попадает в первую область, а по атрибутам во вторую, то она будет размещена в первой области. Однако совпадение имени секции или её атрибутов ещё не гарантирует её размещение в выбранном адресном пространстве. Если в описании области присутствует указание на месторасположение (список файлов и библиотек), то происходит дополнительная проверка. Если получилось так, что секция по своему описанию попала более чем в одну область, то выбирается та из них, которая имеет наименьший адрес начала. Если же секция не попала ни в одну из областей, то в качестве области распределения берётся та область раздела, в описании которой присутствует ключевое слово 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. 14 ЮФКВ.30074-01 33 02 3.4. МАР - файл В МАР-файле перечислены все секции и символы, используемые в исходной программе, а также указаны все ошибки и замечания, выдаваемые компоновщиком в процессе работы. Структура файла такова: перечисляются ошибки и замечания перечисляются все секции перечисляются все символы Для секций указывается тип и атрибуты в следующем виде: тип P Секция имеет тип SGT_PROGBITS N Секция имеет тип SGT_NOBITS атрибуты D У секции нет признака SHF_EXECINSTR (секция данных) RO У секции нет признака SHF_WRITE (секция только для чтения) NA У секции нет признака SHF_ALLOC (для секции не отводится пространство в исполняемом образе в памяти) 15 ЮФКВ.30074-01 33 02 ПРИЛОЖЕНИЕ 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 16 ЮФКВ.30074-01 33 02 Лишние символы в конце числа 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 17 ЮФКВ.30074-01 33 02 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 Размер секции определен не для всех секций. 18 ЮФКВ.30074-01 33 02 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 "имя_объектного_файла". 19 ЮФКВ.30074-01 33 02 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 20 ЮФКВ.30074-01 33 02 Операция не определена в режиме библиотеки 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 21 ЮФКВ.30074-01 33 02 Размер области (%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 Допускается использовать одновременно только одну операцию в режиме библиотекаря 22 ЮФКВ.30074-01 33 02 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 Секция имеет конфликтные атрибуты 23 ЮФКВ.30074-01 33 02 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 Данная опция используется только в режиме библиотекаря. 24 ЮФКВ.30074-01 33 02 Лист регистрации изменений Номера листов (страниц) Изм изме- заменен- . ненных ных новых Всего Входящий аннули- листов N N сопрово- Подп. Да- рован- (страниц) докумен- дительного та ных в докум. та документа и дата