
TextmetukSPO
.pdfПРИЛОЖЕНИЕ 3.
Компоновщик ALINK.EXE для операционных систем типа Windows
Утилита ALINK есть компоновщик для OBJ и LIB файлов, и создает COM и EXE файлы для MSDOS, а также файлы Win32 PE. Он также поддерживает ресурсные файлы для их компоновки в состав PE файлов. Поддерживает MS/Intel OMF и MS-COFF объектные и библиотечные файлы, но не поддерживает библиотеки импорта для формата MS-COFF. Компоновщик ALINK является свободно распространяемым программным продуктом.
Командная строка его вызова имеет в общем случае вид:
ALINK [options] filename [options] [filenames] [options] ...
По умолчанию ALINK выполняет компоновку с учетом регистра букв (различая строчные и прописные буквы) для EXE файла. Если имена файлов в строке вызова не включают расширения, то предполагается расширение .obj. Дополнительные параметры могут быть взяты из файлов отзыва (response files) путем указания имени файла, которому предшествует символ @, т.е. в виде
ALINK @response.fil
Пустые строки в таком файле отзыва игнорируются, опции могут быть заданы либо вместе на одной строке, либо на раздельных строках. Текстовые строки в кавычках рассматриваются как один параметр. Символы точки с запятой рассматриваются как начало комментария, а остаток строки после такого символа игнорируется. Если требуется использовать точку с запятой в качестве значащего символа, то его следует поместить в кавычки.
Опции и имена файлов могут быть использованы в файле параметров, но имена файлов не могут включать метасимволы. Может быть использовано более одного файла отзыва в одном командном вызове компоновщика ALINK, а также могут быть использованы дополнительные файлы отзыва, включаемые в свою очередь в файл отзыва. Циклические ссылки не детектируются и могут вызвать проблемы зацикливания вызовов до исчерпания памяти.
Возможны следующие опции:
-c |
Действует компоновка с различием прописных и строчных букв |
-c+ |
То же самое |
-c- |
Выключить различение прописных и строчных букв |
-o yyy |
Задание выходного файла yyy |
-oxxx |
Задает в качесте выходного файла формат xxx |
|
COM = выходной файл типа COM |
|
EXE = выходной файл типа EXE |
61
|
PE = выходной файл типа Win32 PE (с расширением .EXE) |
-m |
Порождать файл карты загрузки с расширением map |
-m+ |
То же самое |
-m- |
Не порождать файл карты загрузки |
-L ddd |
Добавить каталог ddd к списку поиска библиотек |
-h |
Отобразить список справочной информации |
-H |
То же самое |
-? |
То же самое |
-entry name |
Использовать глобальное имя name как точку запуска программы |
Для PE файлов дополнительно предоставляются следующие опции:
-base addr |
Установить базовый адрес для image (по умолчанию = 4Mb) |
-objectalign xxx |
Установить выравнивание в памяти (по умолчанию = 64K) |
-filealign xxx Установить выравнивание секций в файле (по умолчанию = 512) -subsys xxx Установить подсистему выполнения (по умолчанию = windows)
windows, win или gui => оконная подсистема console, con или char => консольная подсистема native => подсистема внутреннего интерфейса native posix => подсистема POSIX
-subsysver x.y |
Установить x.y версию подсистемы (по умолчанию = 4.0) |
|
-osver x.y |
|
Установить x.y версию OS (по умолчанию = 1.0) |
-heapsize xxx |
|
Установить размер heap (по умолчанию = 1Mb) |
-heapcommitsize xxx Установить размер привязки heap к физической памяти |
||
|
|
(по умолчанию = 4K) |
-stacksize xxx |
|
Установить размер стека (по умолчанию = 1Mb) |
-stackcommitsize xxx Установить размер привязки стека (по умолчанию = 4K) |
||
-dll |
Построить DLL вместо исполняемого EXE файла. |
|
-stub filename |
|
Использовать указанный файл как заглушку MSDOS. |
Выравнивание должно быть степенью 2. Выравнивание объекта может быть от 512 до 256Mb, выравнивание файла может быть от 512 до 64K. Базовый адрес образа и его выравнивание могу быть указаны как десятичные числа или как шестнадчатеричные числа, которым предшествует префикс 0x. База образа должна быть кратна 64K.
В задании опции существенно, задаются они прописными или строчными буквами.
Если имя выходного файла не указано, то его имя определяется по типу выходного файла и основной части имени для первого в списке объектных файлов. Т.е. командный вызов
ALINK file1.obj -oCOM -o outfile.com
создает выходной файл outfile.com из файла file1.obj, а вызов
ALINK file2.obj file3.obj -oEXE создает файл file2.exe
62
Сегменты из различных объектных файлов соединяются в один, если эти сегменты имеют одно и то же имя и класс, а также не объявлены как private. Абсолютные сегменты никогда не соединяются в один, а стековые сегменты всегда объединяются в общий сегмент стека.
Сегменты размещаются в порядке, в котором они присутствуют в объектных файлах, если только не использованы директивы создания групп (директивы group). Все сегмент в группах размещаются перед сегментами, не входящими в группы. Сегмент не может находиться более чем в одной группе. Сегменты в группах размещаются в порядке, указанном в определении группы. Если описаны два различных определения одной и той же группы, перечисляющие сегменты в различном порядке, то используется первое определение.
Таким образом, если во втором примере выше файл file2.obj содержит определение группы, эквивалентное исходному описанию
agroup group code,data,stack
а файл file3.obj содержит определение группы, эквивалентное исходному описанию
agroup group data,stack,bss,code
то окончательное строение группы agroup будет code,data,stack,bss
Текстовый вывод компоновщика содержит всю осведомительную информациюи список всех файлов, в тому порядке, как они загружались. Любая нераспознанная объектная запись будет вызывать ошибку. Любые повторно распознаваемые, но игнорируемые записи, такие как записи LINNUM и записи COMENT будут отображены на экране. Так как отладочная информация часто содержится в записях COMENT, это может приводить к значительному объему вывода.
Файл карты загрузки перечисляет сегменты, глобальные имена, экспортируемые и импортируемые имена.
Образец библиотеки импорта для Win32 включен как win32.lib. В нее включены все имена, экспортируемые библиотеками динамической компоновки Kernel32, User32, GDI32, Shell32, ADVAPI32, version,winmm, lz32,commdlg и commctl. Следует использовать вызов
alink -oPE file[.obj] win32.lib
чтобы подключить этот инструментальную библиотеку win32.lib.
Другим вариантом указания этой библиотеки импорта служит задание директивы
INCLUDELIB "win32"
в исходном ассемблерном файле для ассемблеров, использующих подобные директивы.
При использовании библиотеки импорта win32.lib можно применять глобальные имена системных функций как в виде вызова
call importName так и в виде вызова
call [__imp_MessageBoxA]
63
Последний вариант будет иметь следствием более быстрое выполнение, поскольку первый вызов влечет перенаправление действий с импортируемыми объектами и, в конечном счете неявно сводится ко второму вызову.
64