Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методы / Куликова Н.В., Петровская Е.Н. (ч.1,2)

.pdf
Скачиваний:
58
Добавлен:
11.06.2015
Размер:
2.62 Mб
Скачать

ФайлTLINK.CFG

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

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

Файл подсказки

Файлы подсказки представляют собой обычные текстовые файлы, содержащие параметры и/или имена файлов, которые обычно вводятся после имени программы TLINK в командной строке. Однако в отличие от командной строки файл подсказки может занимать несколько строк текста. Можно разбить длинный список объектных файлов или файлов библиотек на несколько строк, завершая одну строку знаком (+) и продолжая список на следующей строке. Когда + возникает в конце строки, следуя непосредственно за одним из параметров TLINK, в котором + используется для включения параметра (например, /ye+), + не рассматривается как символ продолжения строки.

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

Предположим такую командную строку:

tlink /c mainline wd ln tx,fin,mfin,work\lib\comm. work\lib\suррort

Ее можно заменить, используя файл подсказки, например, FINRESP:

/c mainline wd+ ln tx,fin mfin

worl\lib\comm work\lib\suррort

91

Тогда команду TLINK следует вводить так: tlink @finresр

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

Имя файла

Содержимое

LISTOBJS

mainline+

wd+

 

ln tx

LISTLIBS

lib\comm+

lib\suррort

 

Теперь команду TLINK можно ввести в виде tlink /c @listobjs,fin,mfin,@listlibs

Использование TLINK c BCC.EXE

Параметры и файлы для компоновщика можно указать в командной строке компиляторов BCC и BCC32, указав явные расширения .OBJ и .LIB. BCC запускает TLINK с файлами

C0WS.OBJ, CWS.LIB и IMPORT.LIB (модуль инициализации,

библиотека исполняющей системы и библиотека импорта WINDOWS). BCC32 запускает TLINK32 с файлами C0W32.OBJ, CW32.LIB и IMPORT32.LIB.

Компоновка библиотек

Всегда следует указывать компоновку с библиотекой исполняющей системы Borland С++, которая содержит стандартные библиотечные функции Borland С++ для того типа приложения, которое генерируется. Нужно также указать соответствующую библиотеку импорта для 16-разрядных приложений, IMPORT32.LIB для консольных приложений или IMPRTW32.LIB для 32-разрядных приложений WINDOWS.

Литература

1. Бруно Бабэ. Просто и ясно о Borland C++. – М.: Бином, 1995.

92

РАЗДЕЛ 5. ОСОБЕННОСТИ КОМПИЛЯЦИИ В ИНТЕГРИРОВАННОЙ СРЕДЕ ПРОГРАММИРОВАНИЯ

BORLAND C++

1. Работа с утилитой OBJXREF. OBJXREF: утилита для работы с перекрестными ссылками в объектных модулях

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

Существует две категории общих имен: глобальные переменные и имена функций.

Объектные модули – это объектные (.OBJ) файлы, созданные компиляторами ВС, ВСС или TASM. Библиотечные файлы (.LIB) содержат несколько объектных модулей. Объектные модули, которые генерирует ВС, имеют то же имя, что и исходный модуль с расширением , если только не указано другое имя в командной строке.

Командная строка утилиты OBJXREF. Командная строка

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

Синтаксис командной строки:

OBJXREF <параметры> имя_файла <имя_файла>

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

Каждый параметр начинается со знака (/), за которым следует одноили двухсимвольное имя параметра.

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

.OBJ, включаются в отчеты. Подобно программе TLINK,

93

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

Имена файлов могут включать в себя имена дисковода и маршрут. Для определения более одного файла могут быть использованы специальные (трафаретные) символы DOS – ? и *. Имена файлов могут относиться к файлам .OBJ или файлам .LIB (если не задано расширение файла, то по умолчанию используется расширение .OBJ). Параметры и имена файлов могут следовать в командной строке в любом порядке.

Отчет, сгенерированный утилитой OBJXREF, выводится на стандартное устройство вывода DOS (по умолчанию – на экран). При помощи символа переназначения DOS (>) возможно вывести отчет как на печать (>LPT1:), так и в файл (>имя файла).

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

Параметры командной строки утилиты OBJXREF. Па-

раметры командной строки утилиты OBJXREF делятся на две категории: управляющие параметры и параметры отчетов.

Управляющие параметры. Управляющие параметры изменя-

ют поведение утилиты. По умолчаниювсе параметры разрешены. /I – игнорирование различий между прописными и строчными буквами в общих именах используется в том случае, когда вызывается компоновщик TLINK без параметра (который

воспринимает различия).

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

/D – поиск .OBJ файлов в других директориях

OBJXREF /D dir1 [; dir2 [; dir3]] или OBJXREF /D dir1 [/Ddir2] [/Ddir3]

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

94

Если не используется параметр /D, OBJXREF просмотрит только текущую директорию. При использовании этого параметра, текущая директория не будет просмотрена, если она явно не указана в списке директорий.

– позволяет определить выходной файл, в который OBJXREF будет помещать отчет (по умолчанию вывод осуществляется на экран)

OBJXREF filename .obj /report option/ /Оoutputfilename.ext

/V – вывод полной информации, выдача полного списка общих имен, модулей, сегментов и классов.

/Z – включение сегментов с нулевой длиной. В объектных модулях могут быть определены сегменты, для которых не отводится память.

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

/RC – отчет о типах классов; размеры модулей упорядочены по типу класса сегмента;

/RM – отчет о модуле; вывод общих имен, находящихся в модуле;

/RP – отчет об общих именах; вывод общих имен вместе с именем определенного модуля;

/RR (по умолчанию) – отчет о ссылках; вывод определений общих имен и ссылок, упорядоченных по имени;

/RS – отчет о размере модуля; вывод размеров модулей, упорядоченных по имени сегмента;

/RU – сообщение об общих именах, на которых отсутствуют ссылки;

/RV – полный отчет, OBJXREF генерирует отчет каждого типа; /RX отчет о внешних ссылках: вывод внешних ссылок, упо-

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

Размер командной строки ограничен в MS-DOS 128 символами. Если размер командной строки превышает предельную величину, то можно разместить имена файлов в файле подсказки

(response-файле).

Файл подсказки (файл ответов) – это простой текстовый файл, который может быть создан при помощи текстового редактора.

95

Утилита OBJXREF может использовать различные типы файлов подсказки. Файлы подсказки вызываются из командной строки при помощи одного из параметров. Имя файла должно следовать непосредственно за параметром (без пробелов: /Lresp, a не /L resp).

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

Произвольные файлы подсказки. Для использования файла подсказки с утилитой OBJXREF надо указать его имя в командной строке. Имени должен предшествовать символ @. Имя файла должно быть отделено от имен других файлов пробелами либо символами табуляции:

@имя файла @имя файла ...

Для любого файла, имя которого указано в файле подсказки без расширения, по умолчанию подразумевается расширение .OBJ.

Файлы подсказки. Возможно также использование файлов подсказки, ранее подготовленных для компоновщика TLINK. Файл подсказки такого формата вызывается при помощи параметра /L:

/Lимя_файла

Команда /О. Чтобы утилита OBJXREF выполнила действия над объектными файлами, которые находятся в каталоге, отличном от текущего, надо определить требуемый каталог при помощи команды

/Omyobjdir

Команда /N. Для ограничения количества имен модулей, сегментов, классов и внешних имен в отчетах утилиты OBJXREF необходимоуказать эти имена в командной строкепосле команды /N OBJXREF <список_файлов> /RM /Test

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

Простые отчеты утилиты OBJXREF. Предположим, что имеются два исходных файла, и необходимо при помощи OBJXREF сгенерировать отчеты по объектным файлам, полученным в результате компиляции исходных файлов. Эти файлы называются TEST1.C и TEST2.C и выглядят следующим образом:

96

/*testl.c*/

 

int i1;

/* defines i1 */

extern int i2;

/* refers to i2 */

static int i3;

/* not a public name*/

extern void look(void); /* refers to look */

void main(void)

/* defines main */

{

 

int i4;

/* not a public name */

look();

/* refers to look */

}

 

/* test2.c */

#include <process.h>

extern int i1;

/* refers to i1 */

int i2;

/* defines i2 */

void look(void)

/* defines look */

{

 

exit(i1);

/* refers to exit... */

}

/* and to i1 */

Объектные модули, полученные при компиляции исходных файлов, имеют соответственно имена TEST1.0BJ и TEST2.0BJ. Для того, чтобы получить требуемый отчет об этих объектных файлах, необходимо указать их имена в командной строке после /RX, где Х определяет тип генерируемого отчета.

Отчет об общих именах (/RP). В этом отчете содержатся все общие имена, определенные в объектных модулях, и имена модулей, в которых эти имена определены. Если ввести следующую командную строку

OBJXREF/RP test1 test2,

то утилита OBJXREF выдаст отчет следующего вида:

Идентификатор

Определен в

_i1

TEST1

_i2

TEST2

_look

TEST2

_main

TEST1

97

Отчет о модуле (/RM). Этот отчет содержит имена всех заданных объектных модулей, за которыми следуют имена общих имен, объявленных в этом модуле. Если ввести командную строку

OBJXREF/RM test1 test2,

то утилита OBJXREF выдаст отчет следующего вида:

Module: TEST1 defines the following symbols: public: _i1

public: _main

Module: TEST2 defines the following symbols: public: _i2

public: _look

Утилита сообщает, что в модуле определены следующие идентификаторы.

Отчет о ссылках (/RR по умолчанию). В этом отчете со-

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

OBJXREF/RR test1 test2,

то утилита OBJXREF выдаст отчет следующего вида:

_exit (EXIT)

С0 TEST2

_i1 (TEST1) TEST2

_i2 (TEST2) _look (TEST2)

TEST1

_main (TEST1) C0

Отчет о внешних ссылках (/RX). В этом отчете содержатся имена модулей, за которыми следуют внешние ссылки, определенные в этом модуле. Если ввести командную строку

OBJXREF/RX test1 test2 CS.LIB,

то OBJXREF выдаст отчет вида:

98

MODULE: C0 references the following symbols: _main

MODULE: TEST1 references the following symbols: _i2

_look

MODULE: TEST2 references the following symbols: _exit

_i1

Утилита сообщает, что модуль ссылается на следующие идентификаторы.

Отчет о размерах модулей (/RS). В этом отчете содержатся имена сегментов, за которыми следует список модулей, в которых определен этот сегмент. Размер приводится в байтах в десятичном и шестнадцатиричном представлении. Когда ни одному идентификатору в сегменте заранее не присваивается значение, тогда после имени сегмента присутствует слово uninitialized (неинициализирован). Если сегмент является абсолютным (т.е. настроен на определенный адрес оперативной памяти), то слева от размера сегмента присутствует слово Abs.

Если ввести командную строку

OBJXREF/RS test1 test2,

то OBJXREF выдаст отчет следующего вида:

These files were TEST1_TEXT compiled using the 6 (00006h) TEST1

large memory 6 (00006h). total

model. TEST2_TEXT 10(0000Ah) TEST2 10(0000Ah) total

_BSS

4 (00004h) TEST1, uninitialized

2 (00002h) TEST2, uninitialized

6(00006h) total

Отчет о типах классов (/RC). В этом отчете приводятся определения сегментов по классам сегментов. Класс CODE содержит исполняемые инструкции, класс DATA инициализированные данные, а класс BSS неинициализированные данные.

99

Сегменты, не имеющие класса, будут приведены под заголовком No class type (нет типа класса).

Если ввести командную строку

OBJXREF /RC test1 test2,

то утилита OBJXREF выдаст отчет следующего вида:

BSS

4 (00004h) TEST1

2 (00002h) TEST2

132 (00084h) total

CODE

6 (00006h) TEST1

10 (0000Ah) TEST2

16 (0001 Oh) total DATA

143 (0008Fh) CO

143 (0008Fh) total

Отчет об общих именах, на которые нет ссылок (/RU). В

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

на этот идентификатор имеются ссылки внутри модуля (в этом случае данный идентификатор не должен объявляться как общий);

на идентификатор совсем нет ссылок (в этом случае этот идентификатор надо удалить). Если ввести командную строку

OBJXREF /RU test1 test2 ,

то утилита OBJXREF выдаст отчет следующего вида:

MODULE: TEST2 defines the unreferenced symbol _i2

В модуле TEST2 определены следующие идентификаторы, на которые отсутствуют ссылки.

Полный отчет (/RV). При указании этого параметра в командной строке для каждого модуля будет генерироваться отчет каждого из перечисленных выше типов.

100