[devel] Как правильно использовать shared objects gcc

Damir Shayhutdinov damir на altlinux.org
Ср Дек 15 12:52:58 UTC 2010


>> $(CC) -shared -o lib$(LIBNAME).so.version functions.o StringBuilder.o
>> LibLoader.o -ldl -Wl,-soname,lib$(LIBNAME).so.version
>> ln -s lib$(LIBNAME).so.version lib$(LIBNAME).so

Обычно тут делают -o lib$(LIBNAME).so.version.minor, а потом делают два симлинка
ln -s lib$(LIBNAME).so.version.minor lib$(LIBNAME).so.version
ln -s lib$(LIBNAME).so.version.minor lib$(LIBNAME).so

> Спасибо большое!
> Чего-то сам не догадался так сделать... Хотя про -Wl,-soname нашёл вот тут:
> http://www.adp-gmbh.ch/cpp/gcc/create_lib.html
Там пример неправильный - не делается симлинк.

> Только там ln -s не делалось, поэтому не компилилось с динамической привязкой.
> И почему-то использовалось -Wl,-soname,libmean.so.1 -o
> libmean.so.1.0.1, то есть версии не совпадали...

Это чтобы не было путаницы, потому что у одной и той же библиотеки
может быть 3 "названия".

Первое - это libname.so - используется на этапе сборки линкером
(обычно ld), если указано -lname в строчке. Обычно это симлинк,
запаковывается в libname-devel пакеты. Библиотеки с такими именами
ищутся в стандартных каталогах, а также во всех каталогах, переданных
линкеру через параметр -L или через -rpath/-rpath-link

Второе - обычно, по соглашению, - имя libname.so.X - это т.н. soname.
Библиотеку с таким именем ищет динамический загрузчик
(/lib/ld-linux.so.2), когда грузит исполняемый файл или библиотеку.
Поиск идет по стандартным каталогам, каталогам указанным в
elf-параметре RPATH, а также перечисленным в /etc/ld.so.conf. Также,
именно такие имена обычно заносятся в секцию NEEDED того же elf-файла
при его линковке. Обычно это симлинк, который запаковывается в пакет
libname или даже в пакет libnameX.

Третье имя - обычно, по соглашению, - имя libname.so.X.Y, и обычно это
реальный файл, а первые два имени - это симлинки на этот файл. Иногда
файл называется по-другому, например у glibc это /lib/libc-2.11.2.so.
Это имя используется только для идентификации версии, его не
использует ни динамический загрузчик, ни линкер.

Почему такая сложная схема? Для того, чтобы в одну и ту же систему
можно было установить несколько версий одной и той же библиотеки (с
разными soname). Обычно это нужно для проприетарного софта, или на
момент переезда с одного soname на другое.

Вот тут еще есть немного по этой теме:
http://www.altlinux.org/Soname


Подробная информация о списке рассылки Devel