ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [devel] Как правильно использовать shared objects gcc
@ 2010-12-15 10:58 Rinat Bikov
  2010-12-15 11:16 ` REAL
  0 siblings, 1 reply; 5+ messages in thread
From: Rinat Bikov @ 2010-12-15 10:58 UTC (permalink / raw)
  To: ALT Linux Team development discussions

Здравствуйте!
Можете подсказать, как у нас правильно компилировать C-программы с
использованием динамических библиотек, учитывая то, что используемая
библиотека поставляется с программой?
Имеется ввиду, чтобы при запуске использовалась библиотека
libname.so.version, а не искалась libname.so?
Вот так у меня компилируется библиотека:
$(CC) -shared -o lib$(LIBNAME).so functions.o StringBuilder.o LibLoader.o -ldl

Вот такое работает, если есть символьная ссылка /usr/lib/libname.so ->
libname.so.version:
$(CC) $(AC)  main.o -ldl -o $(EXECNAME) -L. -l$(LIBNAME) -Wl,-rpath,/usr/lib

А как компилировать, чтобы по -lname ставилось в соответствие
/usr/lib/libname.so.version?

-- 
С уважением, Ринат Биков.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [devel] Как правильно использовать shared objects gcc
  2010-12-15 10:58 [devel] Как правильно использовать shared objects gcc Rinat Bikov
@ 2010-12-15 11:16 ` REAL
  2010-12-15 12:03   ` Rinat Bikov
  0 siblings, 1 reply; 5+ messages in thread
From: REAL @ 2010-12-15 11:16 UTC (permalink / raw)
  To: ALT Linux Team development discussions

15.12.2010 16:58, Rinat Bikov пишет:
> Имеется ввиду, чтобы при запуске использовалась библиотека
> libname.so.version, а не искалась libname.so?
> Вот так у меня компилируется библиотека:
Вместо вот этого:
> $(CC) -shared -o lib$(LIBNAME).so functions.o StringBuilder.o LibLoader.o -ldl

Используйте вот это:
$(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

>
> Вот такое работает, если есть символьная ссылка /usr/lib/libname.so ->
> libname.so.version:
> $(CC) $(AC)  main.o -ldl -o $(EXECNAME) -L. -l$(LIBNAME) -Wl,-rpath,/usr/lib
>
> А как компилировать, чтобы по -lname ставилось в соответствие
> /usr/lib/libname.so.version?

-- 

REAL aka Евгений Ростовцев, программист ЦНИТ КемГУ


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [devel] Как правильно использовать shared objects gcc
  2010-12-15 11:16 ` REAL
@ 2010-12-15 12:03   ` Rinat Bikov
  2010-12-15 12:23     ` Ivan Fedorov
  2010-12-15 12:52     ` Damir Shayhutdinov
  0 siblings, 2 replies; 5+ messages in thread
From: Rinat Bikov @ 2010-12-15 12:03 UTC (permalink / raw)
  To: ALT Linux Team development discussions

15 декабря 2010 г. 14:16 REAL написал:
> Используйте вот это:
> $(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
Спасибо большое!
Чего-то сам не догадался так сделать... Хотя про -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, то есть версии не совпадали...

-- 
С уважением, Ринат Биков.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [devel] Как правильно использовать shared objects gcc
  2010-12-15 12:03   ` Rinat Bikov
@ 2010-12-15 12:23     ` Ivan Fedorov
  2010-12-15 12:52     ` Damir Shayhutdinov
  1 sibling, 0 replies; 5+ messages in thread
From: Ivan Fedorov @ 2010-12-15 12:23 UTC (permalink / raw)
  To: ALT Linux Team development discussions

[-- Attachment #1: Type: text/plain, Size: 1041 bytes --]

Rinat Bikov <becase-u2l5PoMzF/Vg9hUCZPvPmw@public.gmane.org> writes:

> 15 декабря 2010 г. 14:16 REAL написал:
>> Используйте вот это:
>> $(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
> Спасибо большое!
> Чего-то сам не догадался так сделать... Хотя про -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, то есть версии не совпадали...

1.0.1 - это полная версия библиотеки, но при линковке обычно
используется только MAJOR-компонента.

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [devel] Как правильно использовать shared objects gcc
  2010-12-15 12:03   ` Rinat Bikov
  2010-12-15 12:23     ` Ivan Fedorov
@ 2010-12-15 12:52     ` Damir Shayhutdinov
  1 sibling, 0 replies; 5+ messages in thread
From: Damir Shayhutdinov @ 2010-12-15 12:52 UTC (permalink / raw)
  To: ALT Linux Team development discussions

>> $(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

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2010-12-15 12:52 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-12-15 10:58 [devel] Как правильно использовать shared objects gcc Rinat Bikov
2010-12-15 11:16 ` REAL
2010-12-15 12:03   ` Rinat Bikov
2010-12-15 12:23     ` Ivan Fedorov
2010-12-15 12:52     ` Damir Shayhutdinov

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git