Книга: Программирование для Linux. Профессиональный подход
Позиционно-независимый код
Позиционно-независимый код
Аббревиатура PIC (Position-Independent Code) в названии опции расшифровывается как "позиционно-независимый код". Функции в совместно используемой библиотеке могут загружаться по разным адресам разными программами, поэтому код библиотеки не должен зависеть от адреса (или позиции), по которому она загружена. Все это никак не касается программистов, просто нужно не забывать указывать флаг -fPIC
при компиляции файлов, которые могут включаться в совместно используемую библиотеку.
Затем следует объединить объектные файлы в библиотеку:
% gcc -shared -fPIC -о libtest.so test1.o test2.o
Опция -shared
заставляет компоновщик создать совместно используемую библиотеку, а не обычный исполняемый файл. Такие библиотеки имеют расширение .so
. Подобно статическому архиву, имя библиотеки всегда начинается с префикса lib
, указывающего на то. что файл является библиотекой.
Компоновка совместно используемой библиотеки аналогична компоновке архива. Например, следующая команда подключает к программе файл libtest.so
, если он находится в текущем каталоге или одном из стандартных системных библиотечных каталогов:
% gcc -о app арр.о -L. ltest
Предположим, имеются оба файла: libtest.а
и libtest.so
. Каким образом компоновщик принимает решение? Он просматривает каждый заданный каталог (сначала те, что указаны в опции -L
, затем стандартные) и, как только обнаруживает хотя бы один из файлов, тут же прекращает поиск. Если в найденном каталоге присутствует только один из файлов, он и выбирается. В противном случае выбор делается в пользу совместно используемой библиотеки, если явно не указано обратное. Отдать приоритет статическому архиву позволяет опция -static
. Например, следующая команда подключит к программе архив libtest.a
, даже если присутствует библиотека libtest.so
:
% gcc -static -о app арр.о -L. -ltest
Команда ldd
выводит список совместно используемых библиотек, подключенных к заданному исполняемому файлу. Все они должны быть доступны при запуске программы. Обратите внимание на то, что команда ldd
сообщает о наличии дополнительной библиотеки: ld-linux.so
. Она является частью механизма динамической компоновки в Linux.
- Дополнительные национальные кодовые страницы и порядки сортировки
- Глава 5 Агрессивные формы кода и борьба с ними
- Стиль написания исходного кода
- 1.4. Кодирование информации
- 1.4.1. Кодирование во время выполнения
- Три способа кодирования звука
- Листинг 15.11. Код для загрузки файла с Web-сервера
- 2. Пример создания базового отношения в записи на псевдокоде
- 5. Нормальная форма Бойса – Кодда (NFBC)
- Определение позиционного уровня
- Приложение 10. Коды ошибок
- Двоичный код