Компоновщик. Руководство программиста

advertisement
УДОСТОВЕРЕН
ЮФКВ.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 сопрово-
Подп. Да-
рован-
(страниц)
докумен-
дительного
та
ных
в докум.
та
документа
и дата
Download