Выбрать главу

Поскольку с точки зрения программы на языке C вызов функции-оболочки библиотеки C является синонимом запуска соответствующей подпрограммы обслуживания системного вызова, далее в книге для обозначения действия «вызов функции-оболочки, которая запускает системный вызов xyz()» будет использоваться фраза «запуск системного вызова xyz()».

Дополнительные сведения о механизме системных вызовов Linux можно найти в изданиях [Love, 2010], [Bovet & Cesati, 2005] и [Maxwell, 1999].

3.2. Библиотечные функции

Библиотечная функция — одна из множества функций, составляющих стандартную библиотеку языка C. (Для краткости далее в книге при упоминании о конкретной функции вместо словосочетания «библиотечная функция» будем просто использовать слово «функция».) Эти функции предназначены для решения широкого круга разнообразных задач: открытия файлов, преобразования времени в формат, понятный человеку, сравнения двух символьных строк и т. д.

Многие библиотечные функции вообще не используют системные вызовы (например, функции для работы со сроками). С другой стороны, некоторые библиотечные функции являются надстройками над системными вызовами. Например, библиотечная функция fopen() использует для открытия файла системный вызов open(). Зачастую библиотечные функции разработаны для предоставления более удобного интерфейса вызова по сравнению с тем, что имеется у исходного системного вызова. Например, функция printf() предоставляет форматирование вывода и буферизацию данных, а системный вызов write() просто выводит блок байтов. Аналогично этому функции malloc() и free() выполняют различные вспомогательные задачи, существенно облегчающие выделение и высвобождение оперативной памяти по сравнению с использованием исходного системного вызова brk().

3.3. Стандартная библиотека языка C; GNU-библиотека C (glibc)

В различных реализациях UNIX существуют разные версии стандартной библиотеки языка C. Наиболее часто используемой реализацией в Linux является GNU-библиотека языка C (glibc, http://www.gnu.org/software/libc/).

Первоначально основным разработчиком и специалистом по обслуживанию GNU-библиотеки C был Роланд Макграт (Roland McGrath). До 2012 года этим занимался Ульрих Дреппер (Ulrich Drepper), после чего его полномочия были переданы сообществу разработчиков, многие из которых перечислены на странице https://sourceware.org/glibc/wiki/MAINTAINERS.

Для Linux доступны и другие реализации/версии библиотеки C, среди которых есть и такие, которым требуется (относительно) небольшой объем памяти, а предназначены они для встраиваемых приложений. В качестве примера можно привести uClibc (http://www.uclibc.org/) и diet libc (http://www.fefe.de/dietlibc/). В данной книге мы ограничиваемся рассмотрением glibc, поскольку именно эта библиотека языка C используется большинством приложений, разработанных под Linux.

Определение версии glibc в системе

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

$ /lib/libc.so.6

GNU C Library stable release version 2.10.1, by Roland McGrath et al.

Copyright (C) 2009 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.

There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A

PARTICULAR PURPOSE.

Compiled by GNU CC version 4.4.0 20090506 (Red Hat 4.4.0–4).

Compiled on a Linux >>2.6.18-128.4.1.el5<< system on 2009-08-19.

Available extensions:

The C stubs add-on version 2.1.2.

crypt add-on version 2.1 by Michael Glad and others

GNU Libidn by Simon Josefsson

Native POSIX Threads Library by Ulrich Drepper et al

BIND-8.2.3-T5B

RT using linux kernel aio

For bug reporting instructions, please see:

<http://www.gnu.org/software/libc/bugs.html>.

В некоторых дистрибутивах Linux GNU-библиотека C находится в другом месте, путь к которому отличается от /lib/libc.so.6. Один из способов определить местоположение библиотеки — выполнить программу ldd (list dynamic dependencies — список динамических зависимостей) в отношении исполняемого файла, имеющего динамические ссылки на glibc (ссылки такого рода имеются у большинства исполняемых файлов). Затем можно изучить полученный в результате этого список библиотечных зависимостей, чтобы найти местоположение совместно используемой библиотеки glibc: