Вопрос

Я создаю библиотеку .so, и мне было интересно - в чем разница между параметрами b / w -h и - o cc complier (с использованием Sun Studio C ++)?

Разве они не ссылаются на одно и то же - на имя выходного файла?

Это было полезно?

Решение

-o это имя файла, который будет записан компилятором на диск

-h это имя, которое будет записано в двоичных файлах ELF, которые ссылаются на этот файл.

Одним из распространенных способов использования является предоставление младших номеров версий библиотеки.Например, если вы создаете общую библиотеку libfoo, вы могли бы сделать:

cc -o libfoo.so.1.0 -h libfoo.so.1 *.o
ln -s libfoo.so.1.0 libfoo.so.1
ln -s libfoo.so libfoo.so.1

Затем, если вы скомпилируете свое приложение hello world и свяжете его с помощью

cc -o hello -lfoo

двоичный файл elf для hello запишет NEEDED запись для libfoo.so.1 (что вы можете увидеть, запустив elfdump -d hello ).

Затем, когда вам понадобится добавить новые функции позже, вы могли бы изменить -o ценность для libfoo.so.1.1 но оставьте -h на libfoo.so.1 - все программы, которые вы уже создали с версией 1.0 все еще пытаются загрузить libfoo.so.1 во время выполнения, так что продолжать работу без перестроен, но вы увидите через лс, что это 1.1.

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

cc -o libfoo.so.1.new -h libfoo.so.1 *.o
rm libfoo.so.1 ; mv libfoo.so.1.new libfoo.so.1

(Обычно это делают Makefile-файлы, созданные старым генератором makefile Imake от X.)

Другие советы

Они ссылаются на разные имена.В частности, -o параметр - это файл фактический имя - то, которое находится в файловой системе.Тот Самый -h опция устанавливает внутренний DT_SONAME в конечном объектном файле.Это имя, с помощью которого другие модули ссылаются на общий объект внутри себя.Я полагаю, что это имя вы также видите, когда запускаете ldd об объектах, которые ссылаются на него.

Опция -o присвоит выходному файлу имя, в то время как опция -h установит внутреннее имя внутри библиотеки.Это внутреннее имя имеет приоритет над именем файла при использовании динамическим загрузчиком и позволяет ему использовать предопределенные правила для поиска нужной библиотеки.

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

elfdump -d xxx.so | grep СОНАМЕ

Подробнее смотрите здесь:

http://docs.oracle.com/cd/E23824_01/html/819-0690/chapter4-97194.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top