Рубрики

Работа с общими библиотеками | Набор 2

Мы рассмотрели основную информацию об общих библиотеках в предыдущем посте . В текущей статье мы узнаем, как создавать общие библиотеки в Linux.

До этого нам нужно понять, как программа загружается в память, различные (базовые) этапы, вовлеченные в процесс.

Давайте рассмотрим типичную программу «Hello World» на языке C. Простое изображение экрана программы Hello World приведено ниже.

Мы компилировали наш код с помощью команды « gcc -o sample shared.c ». Когда мы компилируем наш код, компилятор не разрешит реализацию функции printf () . Он только проверяет синтаксическую проверку. Цепочка инструментов оставляет заглушку в нашем приложении, которая будет заполнена динамическим компоновщиком. Поскольку printf является стандартной функцией, компилятор неявно вызывает свою разделяемую библиотеку. Больше подробностей вниз.

Мы используем ldd для перечисления зависимостей двоичного образа нашей программы. На изображении экрана мы видим, что наш пример программы зависит от трех двоичных файлов, а именно, linux-vdso.so.1 , libc.so.6 и /lib64/ld-linux-x86-64.so.2 .

Файл VDSO — это быстрая реализация интерфейса системных вызовов и некоторых других вещей, это не наша задача (на некоторых старых системах вы можете увидеть другое имя файла вместо * .vsdo. *). Игнорировать этот файл. У нас есть интерес к двум другим файлам.

Файл libc.so.6 является реализацией C различных стандартных функций. Это файл, в котором мы видим определение printf, необходимое для нашего Hello World . Это общая библиотека, которую нужно загрузить в память для запуска нашей программы Hello World.

Третий файл /lib64/ld-linux-x86-64.so.2 является в действительности исполняемым файлом, который запускается при вызове приложения. Когда мы вызываем программу на терминале bash, обычно bash разветвляется и заменяет свое адресное пространство изображением программы для запуска (так называемая пара fork-exec). Ядро проверяет, находится ли libc.so.6 в памяти. Если нет, он загрузит файл в память и выполнит перемещение символов libc.so.6. Затем он вызывает динамический компоновщик (/lib64/ld-linux-x86-64.so.2) для разрешения неразрешенных символов кода приложения (в данном случае printf). Затем управление переходит в нашу программу main . (Я намеренно пропустил много деталей в процессе, наша цель — понять основные детали).

Создание нашей собственной общей библиотеки:

Давайте работать с простой разделяемой библиотекой в Linux. Создайте файл library.c со следующим содержимым.

Файл library.c определяет функцию signum, которая будет использоваться нашим кодом приложения. Скомпилируйте файл library.c, используя следующую команду.

gcc -shared -fPIC -o liblibrary.so library.c

Флаг -shared указывает компилятору, что мы собираем разделяемую библиотеку. Флаг -fPIC должен генерировать независимый от позиции код (пока игнорировать). Команда создает общую библиотеку liblibrary.so в текущем рабочем каталоге. У нас есть готовый к использованию наш общий объектный файл (имя общей библиотеки в Linux).

Создайте другой файл application.c со следующим содержимым.

В файле application.c мы вызываем функцию signum, которая была определена в разделяемой библиотеке. Скомпилируйте файл application.c, используя следующую команду.

gcc application.c -L / home / geetanjali / coding / -llibrary -o sample

Флаг -llibrary указывает компилятору искать определения символов, которые недоступны в текущем коде (функция signum в нашем случае). Опция -L является подсказкой для компилятора, чтобы искать в каталоге, а затем опцией для любых общих библиотек (только во время ссылки). Команда генерирует исполняемый файл с именем « sample ».

Если вы вызовете исполняемый файл, динамический компоновщик не сможет найти требуемую общую библиотеку. По умолчанию он не смотрит в текущий рабочий каталог. Вы должны явно проинструктировать цепочку инструментов, чтобы обеспечить правильные пути. Динамический компоновщик ищет стандартные пути, доступные в LD_LIBRARY_PATH, а также выполняет поиск в системном кэше (для получения подробной информации изучите команду ldconfig ). Мы должны добавить наш рабочий каталог в переменную окружения LD_LIBRARY_PATH. Следующая команда делает то же самое.

экспорт LD_LIBRARY_PATH = / home / geetanjali / coding /: $ LD_LIBRARY_PATH

Теперь вы можете вызвать наш исполняемый файл, как показано на рисунке.

Рекомендуемые посты:

Работа с общими библиотеками | Набор 2

0.00 (0%) 0 votes