Читаем Linux API. Исчерпывающее руководство полностью

В этой главе мы сосредоточим свое внимание только на формате ELF (Executable and Linking Format — формат исполняемых и компонуемых файлов), поскольку именно он используется для создания исполняемых файлов и разделяемых библиотек в современных версиях Linux (а также во многих других реализациях UNIX).

ELF заменил собой старые форматы a.out и COFF.


41.4.1. Создание разделяемой библиотеки

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

$ gcc — g — c — fPIC — Wall mod1.c mod2.c mod3.c

$ gcc — g — shared — o libfoo.so mod1.o mod2.o mod3.o

Первая команда создает три объектных модуля (мы объясним назначение параметра cc — fPIC в следующем разделе). Команда cc — shared создает на основе этих модулей разделяемую библиотеку.

Имена разделяемых библиотек принято обрамлять префиксом lib и суффиксом. so (от англ. shared object — «разделяемый объект»).

Для демонстрации того, что параметры командной строки, которые мы задействуем при создании разделяемых библиотек, не зависят от компилятора, в наших примерах вместо cc указана команда gcc. Другой компилятор в иной UNIX-системе, вероятно, потребует пересмотра этих параметров.

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

$ gcc — g — fPIC — Wall mod1.c mod2.c mod3.c — shared — o libfoo.so

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

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


41.4.2. Адресно-независимый код

Параметр cc — fPIC заставляет компилятор сгенерировать адресно-независимый код. Это влияет на такие операции, как доступ к глобальным, статическим и внешним переменным, строковым константам, а также на то, как определяются адреса функций. Данные изменения позволяют размещать исполняемый код на любом участке виртуальной памяти. Такой механизм является необходимым для разделяемых библиотек, поскольку на этапе компоновки невозможно определить, куда именно будет загружен их код (точное местоположение разделяемой библиотеки в адресном пространстве зависит от различных факторов, таких как количество памяти, которую уже использует программа, загружающая библиотеку, и какие разделяемые библиотеки она успела загрузить).

Платформа Linux/x86-32 позволяет создавать исполняемые библиотеки на основе модулей, скомпилированных без параметра — fPIC. Однако в этом случае теряются некоторые преимущества разделяемых библиотек, так как страницы программного кода, содержащие адресно-независимые ссылки, не могут быть разделены между процессами. В ряде архитектур невозможно собрать разделяемую библиотеку без параметра — fPIC.

Чтобы определить, был ли имеющийся объектный файл скомпилирован с использованием данного параметра, можно проверить наличие имени _GLOBAL_OFFSET_TABLE_ в его таблице символов. Для этого подойдет любая из следующих двух команд:

$ nm mod1.o | grep _GLOBAL_OFFSET_TABLE_

$ readelf — s mod1.o | grep _GLOBAL_OFFSET_TABLE_

С другой стороны, если одна из нижеприведенных команд выведет что-либо на экран, это будет значить следующее: заданная разделяемая библиотека содержит как минимум один объектный модуль, скомпилированный без параметра — fPIC:

$ objdump — all-headers libfoo.so | grep TEXTREL

$ readelf — d libfoo.so | grep TEXTREL

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

Более подробно команды nm, readelf и objdump будут рассмотрены в разделе 41.5.


41.4.3. Использование статической библиотеки

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

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

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных