* [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