Linux
<<  Работа с внешними устройствами linux Linux  >>
Картинок нет
Картинки из презентации «СТАТИЧЕСКИЕ и ДИНАМИЧЕСКИЕ БИБЛИОТЕКИ в LINUX» к уроку информатики на тему «Linux»

Автор: Гунько Андрей Васильевич. Чтобы познакомиться с картинкой полного размера, нажмите на её эскиз. Чтобы можно было использовать все картинки для урока информатики, скачайте бесплатно презентацию «СТАТИЧЕСКИЕ и ДИНАМИЧЕСКИЕ БИБЛИОТЕКИ в LINUX.pptx» со всеми картинками в zip-архиве размером 123 КБ.

СТАТИЧЕСКИЕ и ДИНАМИЧЕСКИЕ БИБЛИОТЕКИ в LINUX

содержание презентации «СТАТИЧЕСКИЕ и ДИНАМИЧЕСКИЕ БИБЛИОТЕКИ в LINUX.pptx»
Сл Текст Сл Текст
1СТАТИЧЕСКИЕ и ДИНАМИЧЕСКИЕ БИБЛИОТЕКИ 28библиотеки.
в LINUX. 29Использование динамических библиотек.
2Компиляция нескольких файлов. Обычно Мы обнаружили, что запуск программ,
простые программы состоят из одного скомпилированных вместе с динамическими
исходного файла. Если программа становится библиотеками, вызывает ошибку: [gun]$
большой, то при работе ней может ./rezultdyn ./rezultdyn: error in loading
возникнуть несколько достаточно серьезных shared libraries: libfsdyn.so: cannot open
проблем: Файл, становясь большим, shared object file: No such file or
увеличивает время компиляции, и малейшие directory.
изменения в исходном тексте автоматически 30Использование динамических библиотек.
вынуждают тратить время программиста на Это сообщение выдает загрузчик
перекомпиляцию программы. динамических библиотек, который в нашем
3Компиляция нескольких файлов. Если над случае не может обнаружить библиотеку
программой работает много человек, то libfsdyn.so. Для настройки динамического
практически невозможно отследить сделанные линковщика существует программа ldd. Она
изменения. Процесс правки и само выдает на экран список динамических
ориентирование при большом исходном тексте библиотек используемых в программе и их
становится сложным и поиск небольшой местоположение. В качестве параметра ей
ошибки может повлечь за собой вынужденное сообщается название обследуемой программы.
"изучение" кода заново. 31Использование динамических библиотек.
4Компиляция нескольких файлов. Поэтому [gun]$ ldd rezultdyn libfsdyn.so => not
при разработке программ рекомендуется их found libc.so.6 => /lib/libc.so.6
разбивать на куски, которые функционально (0x40016000) /lib/ld-linux.so.2 =>
ограничены и закончены. Для того, чтобы /lib/ld-linux.so.2 (0x40000000) Программа
вынести функцию или переменную в отдельный использует три библиотеки: libc.so.6 -
файл надо перед ней поставить стандартную библиотеку функций языка C++.
зарезервированное слово extern. Давайте 32Использование динамических библиотек.
для примера создадим программу из ld-linux.so.2 - библиотеку динамической
нескольких файлов. Сначала создадим линковки программ ELF формата. libfsdyn.so
главную программу, в которой будут две - нашу динамическую библиотеку функций.
внешние процедуры. Назовем этот файл Нашу библиотеку она найти не может.
main.c: Динамический линковщик ищет библиотеки
5Компиляция нескольких файлов. #include только в известных ему каталогах. Для
<stdio.h> extern int f1(); extern того, чтобы добавить нашу директорию с
int f2(); int main() { int n1, n2; n1 = библиотекой в список известных директорий
f1(); n2 = f2(); printf("f1() = надо редактировать файл /etc/ld.so.conf.
%d\n",n1); printf("f2() = 33Использование динамических библиотек.
%d\n",n2); return 0; }. Наша библиотека станет
6Компиляция нескольких файлов. Теперь "заметной", если поместить ее в
создаем два файла, каждый из которых будет один из перечисленных там этих каталогов,
содержать полное определение внешней либо в директорию /lib, либо если дописать
функции из главной программы. Файлы каталог в этот файл. После изменения
назовем f1.c и f2.c: // файл f1.c int f1() конфигурационного файла ld.so.conf
{ return 2; } // файл f2.c int f2() { необходимо, чтобы система перечитала
return 10; }. настройки заново. Это делает программа
7Компиляция нескольких файлов. ldconfig.
Компилировать можно все файлы одновременно 34Использование динамических библиотек.
одной командой, перечисляя составные файлы Но описанный метод влияет на всю систему в
через пробел после ключа -c: gcc -c main.c целом и требует доступа администратора
f1.c f2.c В результате работы компилятора системы, т.е. прав root. Для простого
мы получим три отдельных объектных файла: пользователя есть другое решение. Это
main.o f1.o f2.o Чтобы их собрать в один использование специальной переменной среды
файл с помощью gcc надо использовать ключ LD_LIBRARY_PATH, в которой перечисляются
-o: все каталоги содержащие пользовательские
8Компиляция нескольких файлов. gcc динамические библиотеки.
main.o f1.o f2.o -o rezult В результате 35Использование динамических библиотек.
вызова полученной программы rezult Для начала посмотрим есть ли у нас такая
командой: ./rezult На экране появится переменная среды: [gun]$ echo
результат работы: [gun]$ ./rezult f1() = 2 $LD_LIBRARY_PATH У меня в ответ выводится
f2() = 10 Теперь, если мы изменим какую-то пустая строка, означающая, что такой
из процедур, например f1(): int f1() { переменной среды нет. Устанавливается она
return 25; }. следующим образом:
9Компиляция нескольких файлов. то [gun]$LD_LIBRARY_PATH=/home/gun/libs
компилировать заново все файлы не [gun]$ export LD_LIBRARY_PATH.
придется, а понадобится лишь 36Использование динамических библиотек.
скомпилировать измененный файл и собрать После этого программа rezultdyn будет
результирующий файл из кусков: Таким прекрасно работать. В случае, если у Вас в
образом можно создавать большие проекты, системе эта переменная среды уже
которые больше не будут отнимать много установлена, то, чтобы не испортить ее
времени на компиляцию и поиск ошибок. значение, надо новый каталог прибавить к
10Библиотеки объектных файлов. старому значению. Делается это другой
Библиотека объектных файлов - это файл командой:
содержащий несколько объектных файлов, [gun]$LD_LIBRARY_PATH=/home/gun/libs:$LD_L
которые будут использоваться вместе в BRARY_PATH [gun]$ export LD_LIBRARY_PATH.
стадии линковки программы. Нормальная 37Использование динамических библиотек.
библиотека содержит символьный индекс, Вы также параллельно можете зайти в
который состоит из названий функций и систему под другим пользователем или даже
переменных и т.д., которые содержатся в тем же самым, но если Вы захотите
библиотеке. Это позволяет ускорить процесс просмотреть значение LD_LIBRARY_PATH, то
линковки программы. увидите ее прежнее значение. Это означает,
11Библиотеки объектных файлов. Объектные что два разных пользователя Linux не могут
библиотеки по способу использования влиять на работу друг друга, а это есть
разделяются на два вида: Статическая хорошее отличие систем Unix от большинства
библиотека - это коллекция объектных других систем.
файлов, которые присоединяются к программе 38Функции работы с динамическими
во время линковки программы. Таким образом библиотеками. Оказывается, что
статические библиотеки используются только использовать динамические библиотеки можно
при создании программы. Потом в работе не только в начале загрузки, но и в
самой программы они не принимают участие, процессе самой работы программы. Программа
в отличие от динамических библиотек. сама может вызывать любые функции из
12Библиотеки объектных файлов. библиотеки, когда ей захочется. Для этого
Динамическая библиотека - это созданная всего-лишь надо использовать библиотеку
специальным образом библиотека, которая dl, которая позволяет линковать библиотеки
присоединяется к результирующей программе "на лету". Она управляет
в два этапа. Первый этап, это естественно загрузкой динамических библиотек, вызовом
этап компиляции. На этом этапе линковщик функций из них и выгрузкой после конца
встраивает в программу описания требуемых работы.
функций и переменных, которые присутствуют 39Функции работы с динамическими
в библиотеке. Сами объектные файлы из библиотеками. Для использования функций
библиотеки не присоединяются к программе. программной работы с динамическими
13Библиотеки объектных файлов. библиотеками необходимо подключить
Присоединение этих объектных файлов(кодов заголовочный файл: #include
функций) осуществляет системный <dlfcn.h> Чтобы вызывать какие-то
динамический загрузчик во время запуска функции из динамической библиотеки сначала
программы. Загрузчик проверяет все надо открыть эту библиотеку (можно сказать
библиотеки прилинкованные с программе на "загрузить"). Открывается она
наличие требуемых объектных файлов, затем функцией: void *dlopen (const char
загружает их в память и присоединяет их в *filename, int flag);
копии запущенной программы, находящейся в 40Функции работы с динамическими
памяти. библиотеками. Параметр filename содержит
14Библиотеки объектных файлов. Сложный путь до требуемой библиотеки, а параметр
процесс загрузки динамических библиотек flag задает некоторые специфические флаги
замедляет запуск программы, но у него есть для работы. Функция возвращает указатель
существенный плюс - если другая на загруженную библиотеку. В случае любой
запускаемая программа линкована с этой же ошибки возвращается указатель NULL. В
загруженной динамической библиотекой, то таком случае тест ошибки понятный человеку
она использует туже копию библиотеки. Это можно получить с помощью функции
означает, что требуется гораздо меньше dlerror(). Приведем стандартный код для
памяти для запуска нескольких программ, открытия библиотеки:
сами загрузочные файлы меньше по размеру, 41Функции работы с динамическими
что экономит место на дисках. библиотеками. Void *library_handler;
15Создание статической библиотеки. Для library_handler =
создания статических библиотек существует dlopen("/path/to/the/library.So"
специальная простая программа называемая rtld_lazy); if (!Library_handler){ //если
ar (сокр. от archiver - архиватор). Она ошибка fprintf(stderr,"dlopen()
используется для создания, модификации и error: %s\n", dlerror()); exit(1); };
просмотра объектных файлов в статических 42Функции работы с динамическими
библиотеках, которые в действительности библиотеками. Получить адрес функции или
представляют из себя простые архивы. переменной можно по ее имени с помощью
Давайте создадим из файлов f1.c и f2.c функции: void *dlsym(void *handle, char
отдельную библиотеку. Для начала *symbol); Для этой функции требуется адрес
компилируем эти файлы: загруженной библиотеки handle, полученный
16Создание статической библиотеки. при открытии функцией dlopen(). Требуемая
[gun]$ gcc -c f1.c f2.c В результате функция или переменная задается своим
получим, как обычно, два файла - f1.o и именем в переменной symbol.
f2.o. Для того, чтобы создать библиотеку 43Функции работы с динамическими
из объектых файлов надо вызвать программу библиотеками. Закрывается библиотека
ar со следующими параметрами: ar rc функцией: dlclose(void *handle); При
libимя_библиотеки.a [список_*.o_файлов] закрытии библиотеки динамический линковщик
Допустим наша библиотека будет называться проверяет счетчик количества открытий
fs, тогда команда запишется в виде: [gun]$ библиотеки, и если она была открыта
ar rc libfs.a f1.o f2.o. несколькими программами одновременно, то
17Создание статической библиотеки. В она не выгружается до тех пор, пока все
результате получим файл libfs.a, в котором программы не закроют эту библиотеку.
будут лежать копии объектых файлов f1.o и 44Функции работы с динамическими
f2.o. Если файл библиотеки уже существует, библиотеками. Для примера создадим
то архиватор будет анализировать программу, которая в качестве параметра
содержимое архива, он добавит новые получает название функции, которую она
объектные файлы и заменит старые будет использовать в работе. Например, это
обновленными версиями. Опция c заставляет будут математические функции возведения в
создавать (от create) библиотеку, если ее степень. Создадим сначала динамическую
нет, а опция r (от replace) заменяет библиотеку. Пишем ее код: double
старые объектные файлы новыми версиями. power2(double x){return x*x;}; double
18Создание статической библиотеки. Пока power3(double x){ return x*x*x; };
у нас есть лишь архивный файл libfs.a. 45Функции работы с динамическими
Чтобы из него сделать полноценную библиотеками. Сохраняем его в файл lib.c и
библиотеку объектных файлов, надо добавить создаем динамическую библиотеку
к этому архиву индекс символов, т.е. libpowers.so следующими командами: [gun]$
список вложенных в библиотеку функций и gcc -fPIC -c lib.c [gun]$ gcc -shared
переменных, чтобы линковка происходила lib.o -o libpowers.so Теперь создаем
быстрее. Делается это командой: ranlib основную программу в файле main.c:
libимя_библиотеки.a. 46Функции работы с динамическими
19Создание статической библиотеки. Для библиотеками. #include <stdio.h>
компиляции основного файла main.c надо #include <dlfcn.h> int main(int
сообщить компилятору, что надо argc, char* argv[]){ void *ext_library;
использовать библиотеки. Чтобы компилятор double value=0; double (*powerfunc)(double
знал где искать библиотеки ему надо x); ext_library = dlopen
сообщить каталог, в котором они содержатся ("/root/libpowers.so",RTLD_LAZY)
и список этих библиотек. Каталог с 47Функции работы с динамическими
библиотеками указывается ключом -L, в библиотеками. if (!ext_library){
нашем случае библиотека находится в fprintf(stderr,"dlopen() error:
текущем каталоге, значит путь до нее будет %s\n", dlerror()); return 1; };
в виде точки (-L.). powerfunc = dlsym(ext_library, argv[1]);
20Создание статической библиотеки. value=3.0; printf("%s(%f) =
Используемые библиотеки перечисляются %f\n",argv[1],value,(*powerfunc)(valu
через ключ -l, после которого указывается )); dlclose(ext_library); };
название библиотеки без префикса lib и 48Функции работы с динамическими
окончания .a. В нашем случае этот ключ библиотеками. Код главной программы готов.
будет выглядеть, как -lfs. Теперь все Требуется его откомпилировать с
одной командой: [gun]$ gcc -c main.c использованием библиотеки dl: [gun]$ gcc
[gun]$ gcc main.o -L. -lfs -o rezult Или main.c -o main -ldl Получим программный
можно чуть короче: [gun]$ gcc main.c -L. файл main, который можно тестировать.
-lfs -o rezult. 49Инициализация динамических библиотек.
21Создание статической библиотеки. Представим себе ситуацию, когда функции
Заметьте, что компилятору нужны библиотеки библиотеки для работы требуют правильно
на этапе создания конечного файла, т.е. инициализированные переменные. Ну,
линковки. Если же мы попытаемся подсунуть например, для работы функции нужен буфер
библиотеку на этапе компиляции, то получим или массив. Специально для таких случаев в
вежливый ответ: [gun]$ gcc -c main.c -L. библиотеках можно задавать
-lfs gcc: -lfs: linker input file unused инициализирующую и деинициализирующую
since linking not done Это означает, что функции: void _init() - инициализация void
файлы библиотек не нужны до процесса _fini() - деинициализация.
линковки. 50Инициализация динамических библиотек.
22Создание динамической библиотеки. Чтобы понять, что к чему, введем в нашей
Динамические библиотеки немного лучше библиотеке lib.c переменную test и
статических, но их использование более возвращающую ее функцию: char *test; char
сложное. И не из-за того, что процесс *ret_test(){ return test; }; Пишем
загрузки программы замедляется. Проблемы основную программу main.c: #include
начинаются уже на этапе компиляции. <stdio.h> #include <dlfcn.h>
Объектные файлы создаваемые обычным int main(){.
образом не имеют представления о том в 51Инициализация динамических библиотек.
какие адреса памяти будет загружена void *ext_library; double value=0; char *
использующая их программа. (*ret_test)(); ext_library = dlopen
23Создание динамической библиотеки. ("libtest.so",RTLD_LAZY); if
Несколько различных программ могут (!ext_library){
использовать одну библиотеку, и каждая из fprintf(stderr,"dlopen() error:
них располагается в различном адресном %s\n", dlerror()); return 1; };
пространстве. Поэтому требуется, чтобы 52Инициализация динамических библиотек.
переходы в функциях библиотеки ret_test = dlsym
использовали не абсолютную адресацию, а (ext_library,"ret_test");
относительную. То есть генерируемый printf("Return of
компилятором код должен быть независимым ret_test:\"%s\"
от адресов, такая технология получила [%p]\n",(*ret_test)(),(*ret_test)());
название PIC - Position Independent Code. dlclose(ext_library); }; После компиляции
24Создание динамической библиотеки. В всего этого хозяйства мы получим
компиляторе gcc данная возможность результат:
включается ключом -fPIC. Теперь 53Инициализация динамических библиотек.
компилирование наших файлов будет иметь [gun]$ gcc -c lib.c -fPIC [gun]$ gcc
вид: [gun]$ gcc -fPIC -c f1.c f2.c Для -shared lib.o -o libtest.so [gun]$ gcc -o
того, чтобы создать динамическую main main.c -ldl [gun]$ ./main Return of
библиотеку надо использовать ключ -shared: ret_test: "(null)" [(nil)] Как
[gun}$ gcc -shared -o libfsdyn.so f1.o видите переменная test оказалась равной
f2.o. NULL, а нам бы хотелось нечто другое.
25Создание динамической библиотеки. В 54Инициализация динамических библиотек.
результате получим динамическую библиотеку Ну, так давайте посмотрим как работают
libfsdyn.so, которая будет динамической функции _init() и _fini(). Создадим вторую
версией библиотеки libfs.a, что видно из библиотеку lib1.c: #include
названия. Теперь, чтобы компилировать <stdlib.h> char *test; char
результирующий файл с использованием *ret_test(){ return test; }; void _init(){
динамической библиотеки нам надо собрать test=(char *)malloc(5);
файл командой: [gun]$ gcc -с main.с [gun]$ 55Инициализация динамических библиотек.
gcc main.o -L. -lfsdyn -o rezultdyn. if (test!=NULL){ *(test+0)=‘g';
26Создание динамической библиотеки. Если *(test+1)=‘u'; *(test+2)=‘n';
попробовать запустить файл rezultdyn, то *(test+3)=‘!'; *(test+4)=0; };
получится ошибка: [gun]$ ./rezultdyn printf("_init() executed...\n");
./rezultdyn: error in loading shared }; void _fini(){ if (test!=NULL)
libraries: libfsdyn.so: cannot open shared free(test); printf("_fini()
object file: No such file or directory Это executed...\n"); };
сообщение выдает динамический линковщик. 56Инициализация динамических библиотек.
Он просто не может найти файл нашей Теперь пробуем компилировать: [gun]$ gcc
динамической библиотеки. -c lib1.c -fPIC [gun]$ gcc -shared lib1.o
27Создание динамической библиотеки. Дело -o libtest.so lib1.o: In function `_init':
в том, что загрузчик ищет файлы lib1.o(.text+0x24):multiple definition of
динамических библиотек в известных ему `_init' /usr/lib/crti.o(.init+0x0): first
директориях, а наша директория ему не defined here lib1.o:
известна. Но это мы чуть отложим, потому 57Инициализация динамических библиотек.
что это достаточно сложный вопрос. Если у In function `_fini': lib1.o(.text+0xc0):
Вас две библиотеки статическая и multiple definition of `_fini'
динамическая с одинаковыми названиями, то /usr/lib/crti.o(.fini+0x0): first defined
есть libfs.a и libfs.so, то компилятор here collect2: ld returned 1 exit status
всегда будет использовать динамическую Оказывается кто-то уже использовал эти
библиотеку. функции до нас и программа не может
28Создание динамической библиотеки. слинковаться. Чтобы избавиться от мешающей
Связано это с тем, что в ключе -l задается библиотеки надо использовать ключ
часть имени библиотеки, а префикс lib и компилятора -nostdlib. Попробуем:
окончание .a или .so приставляет сам 58Инициализация динамических библиотек.
компилятор. Так вот алгоритм работы [gun]$ gcc -shared -nostdlib lib1.o -o
компилятора таков, что если есть libtest.so Теперь попробуем запустить
динамическая библиотека, то она main: [gun]$ ./main _init() executed...
используется по умолчанию. Статическая же Return of ret_test: "gun!"
библиотека используется когда компилятор [0x8049c20] _fini() executed...
не может обнаружить файл .so этой
СТАТИЧЕСКИЕ и ДИНАМИЧЕСКИЕ БИБЛИОТЕКИ в LINUX.pptx
http://900igr.net/kartinka/informatika/staticheskie-i-dinamicheskie-biblioteki-v-linux-140750.html
cсылка на страницу

СТАТИЧЕСКИЕ и ДИНАМИЧЕСКИЕ БИБЛИОТЕКИ в LINUX

другие презентации на тему «СТАТИЧЕСКИЕ и ДИНАМИЧЕСКИЕ БИБЛИОТЕКИ в LINUX»

«Создание библиотеки» - 2. Создание тематического каталога. Форматы документов. Стиль (внешний вид) ссылок может быть произвольным. 3.2. Создать аналогичные каталоги по другим темам. Следует придерживаться стандартных библиографических правил. Возможность создания связей (гиперссылки). 1. Подготовка документа. 5. Сохранить папку на любой носитель или разместить на сайте.

«День библиотек» - Книга прекрасно оформлена, обильно орнаментирована. НБ РТ имеет давнюю историю. Но только 10 (24) января 1865 года была открыта городская публичная библиотека. Начала выходитьв 1621 году по распоряжению царя Михаила Федоровича. Справочно-библиографический аппарат библиотеки состоит из традиционных и электронных каталогов и картотек.

«Сайты - библиотеки» - Произведения зарубежных русскоязычных авторов. Цель и задачи Национальной программы поддержки и развития чтения. АНДРЕЙ ВОЗНЕСЕНСКИЙ avos111.Narod.Ru. Читателям Читальный зал. Ресурсы Интернета в поддержку чтения. Театр - драма "Энума Элиш". Самая известная в Рунете www-библиотека, открыта в 1994.

«Linux» - Линукс Мастер. Требования к самому серверу зависят от количества компьютеров в классе. EdUbuntu. Линукс Терминал. RED HAT. KDE 4. Отличительная особенность – базовые услуги технической поддержки. Отличия Linux от других ОС. DEBIAN GNU/Linux. Ubuntu Linux. Требования к компьютерам учеников (от 32Мб оперативной памяти, процессор от Pentium I).

«Работа школьной библиотеки» - Школьная библиотека на сайте школы: Печорская лингвистическая гимназия. Роль, значение школьной библиотеки в информационном пространстве школы. (Краткий справочник школьного библиотекаря. Комплектование библиотечного фонда. Из Стандарта начального общего среднего образования: Массовая работа со школьниками.

Linux

12 презентаций о Linux
Урок

Информатика

130 тем
Картинки
900igr.net > Презентации по информатике > Linux > СТАТИЧЕСКИЕ и ДИНАМИЧЕСКИЕ БИБЛИОТЕКИ в LINUX