Операционная система UNIX. Руководство программиста


Использование библиотек объектных файлов - часть 2


Рассмотрим следующий пример:

  • В каждом из входных файлов file1.o и file2.o есть ссылки на внешнюю функцию FCN.
  • Входной файл file1.o содержит ссылку на внешнее имя ABC.
  • Входной файл file2.o содержит ссылку на внешнее имя XYZ.
  • Элемент 0 библиотеки liba.a содержит определение имени XYZ.
  • Элемент 0 библиотеки libc.a содержит определение имени ABC.
  • В обеих библиотеках в элементе 1 определяется функция FCN.

Пусть командная строка с вызовом ld(1) выглядит следующим образом:

ld file1.o -la file2.o -lc

Тогда ссылки на FCN разрешаются элементом 1 библиотеки liba.a, ссылка на ABC - элементом 0 библиотеки libc.a, а ссылка на XYZ

остается неразрешенной, так как библиотека liba.a просматривается раньше редактирования связей файла file2.o. Если же команда ld вводится таким образом:

ld file1.o file2.o -la -lc

то ссылки на FCN и ABC разрешаются как в предыдущем примере, а ссылка на XYZ разрешается элементом 0 библиотеки liba.a. Пусть, наконец, команда ld(1) введена так:

ld file1.o file2.o -lc -la

Отличие от предыдущего примера выразится в том, что для разрешения ссылки на FCN будет извлечен элемент 1 библиотеки libc.a, а не liba.a.

Опция -u используется, чтобы вызвать принудительное редактирование связей тех элементов библиотек, на которые, быть может, нет реально существующих внешних ссылок. Например, в случае вызова

ld -u rout1 -la

создается неопределенное имя rout1 и, если в каком-либо объектном файле библиотеки liba.a это имя определяется, то этот файл (а с ним, быть может, и некоторые другие) извлекается для редактирования связей. Без опции -u ld(1) не просматривал бы библиотеку вообще ввиду отсутствия неразрешенных ссылок и неопределенных имен.




Начало  Назад  Вперед



Книжный магазин