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

ForSPOmetuk

.pdf
Скачиваний:
9
Добавлен:
06.02.2018
Размер:
199.58 Кб
Скачать

Синтаксис динамического компоновщика для современных систем Linux требует указания библиотеки объектных модулей, которые в этих системах традиционно имеют расширение, задаваемое единственной латинской буквой 'a', в общем перечне файлов. Таким образом, если предполагается построение исполняемого файла из объектного файла prog.o и библиотечного файла mylib.a, то в простейшем случае требуется вызывать компоновщик командой вида

ld prog.o mylib.a

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

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

В наиболее употребительной форме утилита ar вызывается в виде ar опции модификаторы имя_библиотеки объектные_файлы

где компонент объектные_файлы представляет собой перечисление имен файлов, разделяемых пробелами.

Основными опциями данной утилиты, которые используются чаще всего, являются опции -r, -d, -m, -t. Первая из них задает добавление нового объектного файла или файлов к библиотеке, вторая опция задает удаление указанных в перечне файлов из библиотеки, третья опция задает перемещение указанных в перечне файлов из библиотеки в текущий каталог, а опция -t приказывает выдать на стандартный вывод перечень файлов, содержащихся в библиотеке. Все перечисленные значения опций не могут комбинироваться друг с другом, а должны использоваться исключающим другие образом. Модификаторы призваны повысить эффективность использования и построения библиотек, и записываются непосредственно за опцией. Модификатор, задаваемый буквой 'c', предназначен для указания, что библиотеку нужно создать.

При многомодульной разработке программ, модули, которые используют данные, описанные в других модулях, на языке ассемблера должны содержать явные указания на такое описание в "другом месте". Для этих целей служат директивы ассемблера, обозначаемые в NASM мнемоникой EXTERN. В качестве операндом такой директивы используют одно или более имен программных объектов, разделяемых друг от друга запятой. Программные объекты, указываемые таким образом, могут быть либо именами областей данных, либо метками сегмента машинных команд. Та или иная разновидность этих имен сообщается программистом транслятору путем помещения директивы EXTERN в соответствующий сегмент исходного текста программы. Указание имен в директивах EXTERN в терминах профессионального программирования называют объявлением имен, в отличие от определения имен, имеющего место в тех частях программы, где директивами DB,

21

DW, DD, RESB, RESW или RESD для областей памяти, обозначаемыми этими именами "выделяется память".

Задание. Построить библиотеку объектных модулей Linux, содержащих доступные извне процедуры с именами atoi, itoa, lfwrit. Процедура atoi должна выполнять преобразование последовательности цифр, заданной адресом, который содержится регистре eax, в двоичный код, выдаваемой ее также через регистр eax. Процедура itoa должна выводить в стандартный вывод последовательность десятичных цифр, представляющих исходное значение аргумента в регистре eax, заданное им в двоичном коде. Процедура lfwrite переводит экранный вывод на следующую строку. Основная часть программы должна содержать массив записей вида {число, текст} и по введенному числу выводить текст из той записи, значение первого поля которой совпадает с этим числом. Процедуру поиска такой записи на завершающей стадии разработки целесообразно также поместить в библиотеку объектных модулей. Основная часть программы должна использовать библиотеку объектных модулей.

Контрольные вопросы.

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

2.Как указать нестандартное место размещения библиотек объектных моду-

лей?

3.Что получается с содержимым библиотеки объектных модулей, если в нее заноситься новая версия объектного файла, сохраняется ли в ней старая версия?

Лабораторная работа №6

Содержание работы. Изучение методов и средств использования библиотек объектных модулей в ОС Windows.

Предварительные сведения.

В связи со сложившейся спецификой операционных систем типа Windows, ориентированных в первую очередь на неквалифицированных пользователей и, поэтому, использующих преимущественно графический интерфейс, преобладающая часть отладчиков для этих ОС обеспечивают отладку только графических приложений. В частности только этими возможностями обладают отладчики известной фирмы Borland/Inprise.

К настоящему времени отдельные самостоятельные разработчики предлагают неплохие программные продукты - не очень известные среди корпоративных пользователей, но эффективные, надежные и, главное для высшей школы, - не требующие материальных затрат на их приобретение. В качестве такого программного инструмента рассмотрим отладчик OllyDbg, разработанный Oleh Yuschuk и доступный по электронному адресу на Internet сайте http://home.t- online.de/home/Ollydbg.

22

Имя исполняемого файла отладчика - OLLYDBG.EXE, по которому его и следует запускать. Имя исполняемого файла отлаживаемой программы может задаваться как аргумент строки вызова отладчика.

Практически более удобно запускать отладчик из его собственного оглавления, как текущего при таком запуске (или с помощью ярлыка). Причем, запускать без аргумента - имени исполняемого файла, а исполняемый файл задавать с помощью меню отладчика. Именно, после начального запуска программы OLLYDBG.EXE следует использовать раздел File в главном меню отладчика и пункт Open этого раздела для задания через диалоговую панель имени исполняемого файла - в любом желаемом оглавлении.

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

Работа отладчика OllyDbg управляется с помощью мыши и (или) с помощью клавиатуры, в частности управляющих комбинация "горячих" клавиш.

Точки приостановки (контрольные точки) устанавливаются выбором требуемой строки дизассемблированного текста в окне CPU и нажатием клавиши F2, причем эта клавиша действует как переключатель установки контрольной точки - повторное нажатие этой клавиши на строке с уже установленной контрольной точкой выключает ее (контрольная точка на данной строке изчезает).

Для выполнения программы в пошаговом режиме служат клавиши F7 и F8. Первая из них задает пошаговое исполнение с пошаговым вхождением и выполнением вызываемых подпрограмм. Клавиша F8 задает пошаговый режим только для текущей программы (подпрограммы), при этом выполнение всех вызываемых подпрограмм осуществляется автоматически до момента выхода из них, так что отлаживаемые действия приостанавливаются на следующей за вызовом команде. Автоматическое выполнение программы задается клавишей F9, при этом выполнение происходит до первой встретившейся контрольной точки, до системного вызова, следствием которого является ожидание события (например, ввод данных) или завершения программы. Повторный запуск программы осуществляется горячей клавишей Ctrl-F2.

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

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

Задание. Построить библиотеку объектных модулей ОС Windows, содержащих доступные извне процедуры с именами atoi, itoa, lfwrit. Процедура atoi должна выполнять преобразование последовательности цифр, заданной адресом, кото-

23

рый содержится регистре eax, в двоичный код, выдаваемой ее также через регистр eax. Процедура itoa должна выводить в стандартный вывод последовательность десятичных цифр, представляющих исходное значение аргумента в регистре eax, заданное им в двоичном коде. Процедура lfwrite переводит экранный вывод на следующую строку. Основная часть программы должна содержать массив записей вида {число, текст} и по введенному значению текст выводить число из той записи, значение второго поля которой совпадает с этим текстом. Процедуру поиска такой записи на завершающей стадии разработки целесообразно также поместить в библиотеку объектных модулей. Основная часть программы должна использовать библиотеку объектных модулей.

Контрольные вопросы.

1.Какие языковые средства описания структур данных содержит язык Си?

2.Какие языковые средства описания структур данных содержит ассемблер NASM?

3.Как на ассемблере NASM описать неинициализированный массив структур данных?

4.Как на ассемблере NASM описать инициализированный массив структур данных?

Лабораторная работа №7

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

Предварительные сведения.

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

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

В архитектуре IA32 регистр базирования кадра называется EBP. При использовании 32-битных аргументов вызова они указываются через регистр базирования как [EBP+8], [EBP+12] и т.д. Причем это правило соответствие имеет место только, если в самом начале машинного кода подпрограммы размещаются последовательно команды

push EBP mov EBP, ESP

24

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

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

mov ESP, EPB pop EBP

ret

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

mov ESP, EPB

в этом фрагменте может быть заменена на команду ADD ESP, длина области локальных переменных

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

Задание. Построить ассемблерную программу, использующую процедуру вычисления функции Аккермана. Эта функция задается реккурентными соотношениями

A(0,M)=M+1; A(N,0)=A(N-1,1); A(N,M)=A(N-1, A(N,M-1))

и естественный способ ее вычисления заключается в рекурсивных вызовах вычисляющей процедуры. Процедура вычисления функции Аккермана должна использовать передачу аргументов через кадр стека, а результат - по стандартному соглашению. Главная часть программы должна вводить числовые значения аргументов M и N, а затем обращаться к процедуре вычисления функции. Результат выводиться на экран. При отладке начинать проверку работы с очень небольших значений, в частности полагая N<3, иначе есть риск, не дождаться результата за приемлемое время.

Контрольные вопросы.

1.Как через регистр базового указателя кадра процедуры обозначаются аргументы вызова процедуры; приведите пример.

2.Как через регистр базового указателя кадра процедуры обозначаются локальные аргументы процедуры?

3.Что в кадре процедуры обозначает операнд, записанный в виде [EBP+4]?

4.Что в кадре процедуры обозначает операнд, записанный в виде [EBP]?

5.Чем отличаются соглашения по укладке аргументов в стек в языке Си и в языке Паскаль?

6.Чем отличаются соглашения по очистке стека от аргументов в языке Си и в языке Паскаль?

Лабораторная работа №8

25

Содержание работы. Изучение архитектурных средств для эффективной работы со строковыми данными и построение процедур обработки текстовых строк.

Предварительные сведения. Основные материалом для данной работы служит глава шестая учебного пособия [5].

Задание. Разработать программу, которая осуществляет ввод двух строк текста, поиск в них начала содержательной части путем поиска первого не пробела и сравнение этих содержательных частей до последующего пробельного символа. (Пробельным символом может быть обычный пробел или символ конца строки.) Программа должна выдавать результат сравнения - совпадают рассматриваемые части текста или не совпадают. Программа должна использовать процедуры для отдельных действий и строковые команды.

Контрольные вопросы.

1.Чем отличается поиск в строке с помощью строковой команды SCASB, когда этот поиск ведется с начала строки и когда такой поиск требуется вести с конца строки.

2.Как правильно перенести текст строки на новое место, которое частично занимает и исходное размещение строки.

Лабораторная работа №9

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

Предварительные сведения.

Библиотеки DLL создает системный компоновщик - почти также как он создает исполняемые файлы. Для того, чтобы компоновщику создавать исполняемый файл (с расширением EXE) или библиотеку DLL (с расширением DLL) требуются специальные указания. Для задания таких указаний сложилось два основных подхода: в одном они задаются как опции при вызове компоновщика, в другом включаются в состав вспомогательного файла определения компоновки с расширением DEF, который задается в качестве соответствующего файла-пара- метра при вызове компоновщика. Стандартный вызов компоновщика в командной строке по второму варианту используется в продукции Inprise/Borland и имеет вид

Имя_компоновшика опции объекфайлы, результ, карта, список_библк, def-файл

где результ обозначает имя исполняемого файла или DLL-библиотеки, карта обозначает имя файла карты загрузки, список_библк обозначает перечисление через пробел имен статических библиотек, используемых при компоновке, а defфайл обозначает файл определения параметров результирующего файла. Часть конструкции вызова компоновщика содержит перечисление используемых объектных файлов, причем они задаются перечислением их имен через пробелы или символ + (символ плюс).

Имя компоновщика в указанных системах для 16-битного варианта есть TLINK, а для 32-битного - TLINK32. Все компоненты - файлы в командной строке

26

вызова компоновщика, как правило, задаются без расширений, если они имеют стандартные расширения. Явное задание имен файлов вместе с расширениями встречается очень редко. Заметим, что файл карты загрузки имеет расширение MAP, статические библиотеки - расширение LIB. В любом варианте применение динамической компоновки в полном объеме требует как создания DLL-библиотек, так и создание приложений (исполняемых программных файлов), которые эти библиотеки используют.

Существенным дополнением к обычной подпрограмме, при реализации последней в составе DLL является дополнительная процедура, вызываемая по стартовому имени ..start. Эта процедура при реализации на ассемблере должна возвращать ненулевое значение в регистре eax и ее можно вынести в отдельный исходный и объектный файл. Такая ситуация оказывается очень удобной, так как позволяет один и тот же исходный текст использовать и для DLL-библиотек и для обычных статических библиотек. Особенности появляются при изготовлении результирующего исполняемого файла на этапе компоновки программы. Поэтому компиляция данного программного примера должна выполняться обычным образом, например с помощью вызова

nasmw -f obj wpd.asm -o wpd.obj -l wpd.lst

эта исходная программа преобразуется в объектный файл wpd.obj. В результате компиляции получается обычный объектный файл.

Для компоновки библиотеки динамической компоновки нужно позаботится о описании экспорта и импорта для этой библиотеки. Одним из вариантов такого описания служит файл определения модуля со стандартным расширением .def. Название такого файла могло быть любым, но в большинстве случаев удобно называть его также как исходный файл библиотеки (или один из исходных, если их несколько).

В файле определения модуля для Windows наиболее используемыми внутренними директивами являются директивы внутреннего именования библиотеки с ключевым словом LIBRARY, директива экспорта EXPORT и директива импорта IMPORT. Ключевые слова директив размещаются в отдельных строках файла, а после них через пробелы или символы конца строки перечисляются их операнды. Единственным операндом директивы внутреннего имени библиотеки служит такое имя. Операндами директив экспорта и импорта служат имена экспортируемых или импортируемых объектов. В частном случае экспортирования библиотекой единственного имени wiwoda файл определения модуля может иметь следующей содержимое, приведенное в листинге 3.

library wpdo exports wiwoda

Листинг 3. Файл определения wpd.def для Windows

Если требуется включить в состав DLL несколько функций, которые должны быть доступны снаружи, то имена их перечисляются после строки со служебным словом EXPORTS - каждое на своей строке или через пробелы в одной или нескольких строках. Теперь создать библиотеку можно командным вызовом

TLINK32 -Tpd wpd,wpdo,,import32, wpd.def

27

TLINK32 -Tpd wpd, wpdo,,IMPORT32,wpd.def

В результате работы компоновщика для нашего примера получается файл wpdo.DLL. Причем расширение def в последнем элементе можно было не использовать. Настоятельно рекомендуется использовать одинаковые названия результирующего исполняемого файла и в вызове компоновщика (в нашем примере неявно - через имя объектного модуля и опущенное имя на месте для названия файла результата), и в файле определения.

В тексте программы, использующей библиотеку динамической компоновки, может не быть никаких особенностей, определяющих, что процедуру следует использовать из библиотеки DLL. Относительно процедуры wiwoda в тексте такой программы может быть указано только то, что она внешняя, а поэтому реально может находиться в библиотеке статической компоновки и в составе отдельного объектного модуля, а может быть в составе библиотеки динамической компоновки - все это уточняется позже. Файл wexd.asm подобной программы обрабатывается компилятором обычным способом в результате вызова командной строки

nasmw -f obj wexd.asm -o wexd.obj -l wexd.lst

Для компоновки объектного модуля, получаемого при этом, можно использовать файл определения модуля, заданный листингом 4.

name wexd imports wpdo.wiwoda

Листинг 4. Пример файла определения wexd.def для Windows

Файл определения исполняемого файла EXE содержит два специализированных оператора: оператор именования приложения (со служебным словом NAME) и оператор импорта (со служебным словом IMPORTS). Оператор наименования содержит в качестве операнда имя результирующего файла, а оператор импорта - перечисление имен функций, используемых из DLL библиотек, причем перед именем каждой такой функции должно обязательно стоять имя библиотеки, в которой эта функция находится. Имена функций и библиотеки при этом разделяются символом точки - без дополнительных пробелов. Разделителями в перечислении имен функций могут быть как пробельные символы (пробелы и символы табуляции), так и символы перевода на новую строку. Обычно - для наглядности - используется последний вариант.

Получение исполняемого файла wexd.exe достигается командным вызовом TLINK32 wexd,,,IMPORT32, wexd.def

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

Использование файлов определения модуля оказывается неудобным при значительном числе экспортируемых имен. В таком случае предпочтительней оказывается применение библиотек импорта. Библиотеки импорта в системах разработки Inprise/Borland (как и в ряде других систем разработок) создаются с помощью утилиты, которая преобразует DLL-библиотеку в библиотеку импорта. Обычно такая утилита называется IMPLIB. Она используют два аргумента: название создаваемой библиотеки импорта и название исходной библиотеки DLL.

28

Например, из библиотеки wpdo.dll библиотека импорта wpdo.lib может быть построена командным вызовом

IMPLIB WPDO.LIB WPDO.DLL

При использовании библиотеки импорта wpdo.lib (вместо файла wexd.def определения модуля) построение исполняемого файла wexd.exe с помощью компоновщика TLINK32 может быть выполнено вызовом

TLINK32 wexd,,,IMPORT32 wpdo.lib

В общем случае все используемые библиотеки импорта перечисляются, разделяясь пробелами, вместе с обычными библиотеками объектных файлов. Более того, с точки зрения современных технологий компоновки список библиотек может включать только библиотеки импорта. В частности, библиотека IMPORT32.LIB в действительности представляет собой именно библиотеку импорта системных функций ядра операционной системы Windows.

Если исходная программа для построения DLL библиотеки строится на языке Си, то ее компиляция в системе разработки Borland/Inprise выполняется обычным образом с опцией -с (вызовом bcc32 -c имяисх.с ). Последующую компоновку можно задать командой

ilink32 -Tpd c0d32 имяисх, имяисх,,IMPORT32 cw32, имяисх.def

где c0d32 - имя специального загрузочного модуля в формате объектного файла для построения DLL, а библиотека cw32 (с полным именем cw32.LIB) необходима только при использовании функций из стандартной библиотеки языка Си (которые почти всегда используются, так как к ним относится, в частности, и функция printf ).

Если исходная программа для построения DLL библиотеки строится на языке Си, то ее компиляция в системе разработки Borland/Inprise выполняется обычным образом с опцией -с (вызовом bcc32 -c имяисх.с ). Последующую компоновку можно задать командой

ilink32 -Tpd c0d32 имяисх, имяисх,,IMPORT32 cw32, имяисх.def

где c0d32 - имя специального загрузочного модуля в формате объектного файла для построения DLL, а библиотека cw32 (с полным именем cw32.LIB) необходима только при использовании функций из стандартной библиотеки языка Си.

Задание. Построить DLL библиотеку Windows, функции которой позволяют запомнить внутри нее текст данных, а затем - в другой функции - прочитать этот текст в вызывающую программу. Использовать эту библиотеку в двух параллельно работающий процессах, где основная программа использует динамическую компоновку времени загрузки, один из программных модулей – либо DLL библиотека, либо основная программа - написан на языке ассемблера, а другой из этих модулей – на языке Си; библиотека DLL обеспечивает выдачу сообщений о подключении к ней процесса и об отключении его от нее.

Контрольные вопросы.

1.Чем использование библиотеки динамической компоновки отличается от использование библиотеки объектных модулей.

2.Сколько сегментов машинных команд использует DLL, разработанная вами

влабораторной работе, во время выполнения основной программы этой работы?

29

3.Сколько сегментов данных использует DLL, разработанная вами в лабораторной работе, во время выполнения основной программы этой работы?

4.Выскажите свое мнение по возможности и целесообразности применения того или иного из изученных методов подключения DLL при программировании на языке С++.

5.Чем косвенные вызовы подпрограмм на ассемблере отличаются от прямых вызовов подпрограмм, кроме самого синтаксиса записи в программе такого вызова?

Лабораторная работа №10

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

Предварительные сведения.

В операционной системе Linux ассемблерные программы для компилятора NASM, предназначенные для вызова извне разделяемой библиотеки, требуют дополнительных указаний. Они заключаются в дополнении имени подпрограмм служебным модификатором, который задается служебным словом function и отделяется от имени подпрограммы символом двоеточия. Это уточнение относиться только к указанию имени подпрограммы в качестве операнда директивы GLOBAL.

Для превращения этой исходной программы в разделяемую библиотеку нужно выполнить последовательность команд

nasm -f elf -o updll.exe updll.asm ld -shared -o myupdll.so updll.o

При составлении разделяемой библиотеки на языке С необходимо указывать опции позиционно-независимого кода для результата трансляции, эта опция для транслятора gcc задается как -fPIC, так что вызов транслятора для построения разделяемой библиотеки из файла prog.c будет записываться в виде

gcc -fPIC -shared -o myupdll.so prog.c

Задание. Построить разделяемую библиотеку в Linux, функции которой позволяют запомнить внутри нее текст данных, а затем - в другой функции - прочитать этот текст в вызывающую программу. Использовать эту библиотеку в двух параллельно работающий процессах, где основная программа использует динамическую компоновку времени выполнения. Программы записываются на языке Си, разделяемая библиотека обеспечивает выдачу сообщений о подключении к ней процесса и об отключении его от нее.

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1.Гордеев А.В., Молчанов А.Ю. Системное программное обеспечение. - CПб.: Питер, 2001. -736 с.

2.Гордеев, А.В. Операционные системы: учеб. для вузов по направлению подготовки бакалавром и магистров «Информатика и вычислительная техника». – СПб.: Питер, 2007. – 415 с.

30

Соседние файлы в предмете Операционные системы