МИНИСТЕРСТВО НАУКИ И ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА МОЭВМ
ОТЧЕТ
ПО ЛАБОРАТОРНОЙ РАБОТЕ №2
«Создание make-файла»
по дисциплине
«Операционные системы»
Вариант №8
Преподаватель: Алексеев А.Н.
Выполнил СТ. ГР. 3351 ФКТИ: Чепас А.С.
САНКТ-ПЕТЕРБУРГ
2005
1. Постановка задачи
- Написать программу, решающую задачу в соответствии с выданным вариантом. Входные параметры задаются с клавиатуры. Формат ввода и ограничения определяется самостоятельно.
- Написать файл с набором правил сборки и линковки программы (Makefile) с целями all и clean. По all программа должна собираться, а по clean удалять все созданные бинарные файлы.
- Получить из исполняемого файла список символов для линковщика с помощью утилиты nm. Найти символы, соответствующие функциям из разработанной программы.
- Для любой функции программы получить с помощью утилиты objdump ее бинарный и ассемблерный код с соответствующими сороками на С.
- С помощью утилиты objdump, определить в какой секции хранятся символьные строки, и в какой исполняемый код программы.
- Вывести ELF заголовок программы с помощью утилиты readelf
Вариант 8
Отсортировать последовательность введенных строк в лексикографическом порядке. Входные параметры: количество строк и сами строки.
2. Реализация поставленной задачи
С клавиатуры вводится количество элементов, то есть строк. Далее вводятся сами строки причем с указанием длины каждой из них. Строки представляются в виде двухмерного массива элементов типа char. В головной программеOS_INPUT.Cтри процедуры, описанные в отдельном файлеOS2.C. Это процедура ввода, выполнения, то есть сортировки и вывода на экран. Также есть файлOS2.H, в котором описаны заголовки процедур. Теперь необходимо это 3 файла соединить в один объектный и т.д.
3. Текст программы
//os_input.c
#include <iostream>
#include "os2.h"
int main(void)
{
//Ввод
input();
//Реализация
realize();
//Вывод
output();
return 0;
};
//os2.c
#include "os2.h"
#include <iostream>
// Ввод
char stroka[10][10];
int n;
void input(void)
{ int n1;
std::cout<<"Число строк"<<"\n";
std::cin>>n;
for (int i=1; i<=n; i++)
{std::cout<< "строка № " << i <<"\n" ;
std::cout<<"Число букв в строке"<<"\n";
std::cin>>n1;
for (int j=1; j<=n1; j++)
{
std::cin>>stroka[i][j];
}
for (int j1=n1+1; j1<=10; j1++)
stroka[i][j1]=' ';
}
};
//Обработка
void realize(void)
{
int f,k;
char p;
for (int i=1; i<=n; i++)
{
for (int j=n; j>=i+1; j--)
{
f=0;
k=1;
while (((stroka[i][k]!=' ') || (stroka[j][k]!=' ')) && (f==0))
{
if (stroka[i][k]>stroka[j][k])
{f=1;}
else if (stroka[i][k]==stroka[j][k])
{f=0;}
else {f=2;}
k++;
}
if (f==1)
{
for (int k=1; k<=10; k++)
{
p=stroka[j][k];
stroka[j][k]=stroka[i][k];
stroka[i][k]=p;
};
};
};
};
};
//Вывод
void output(void)
{
for (int i=1; i<=n; i++)
{
for (int j=1; j<=10; j++)
{
std::cout<<stroka[i][j];
};
std::cout<<"\n";
};
}
//os2.h
void input(void);
void realize(void);
void output(void);
4. Make-файл
Создали makefile:mp.makefileс целямиallиclean. Он автоматически собирает программу:
make –f mp.makefile all. И удаляет промежуточные файлы:make–fmp.makefileclean.
Текст файла mp.makefile:
all: myprog
myprog: os_input.o os2.o
g++ os_input.o os2.o -o myprog
os_input.o: os_input.c os2.h
g++ -g -Wall -c os_input.c
os2.o: os2.c os2.h
g++ -g -Wall -c os2.c
clean:
rm os_input.o
rm os2.o
rm myprog
Ключи g++:
-c |
Отменить фазу редактирования связей и создавать объектный файл даже в случае программы, состоящей только из одного модуля. |
-g |
Сгенерировать дополнительную информацию для отладчика sdb(1). |
-О |
Включить оптимизацию объектного кода. |
-L каталог |
Дополнить каталогом список каталогов, которые содержат объектные библиотечные модули |
-l библиотека |
Скомпоновать с объектной библиотекой |
-I каталог |
Изменить алгоритм поиска включаемых (посредством директивы #include) файлов, имена которых не начинаются с символа /, а именно: сначала искать в указанном каталоге, а затем уже в каталогах стандартного списка. Так, включаемые файлы, чьи имена заданы в двойных кавычках, сначала ищутся в каталоге, содержащем файл, затем в каталогах, указанных с помощью опции -I, а затем уже в каталогах стандартного списка. Включаемые файлы, чьи имена заданы в угловых скобках, не ищутся в каталоге, содержащем файл. |