Добрый день, ув. All
Проблема в следующем: как гарантировать правильную загрузку shared objects на Линукс?
Майкрософт дала некоторое решение - манифесты. Есть ли что-то подобное (общее решение) для Линукс?
Я занимаюсь разработкой SDK и хочу быть уверен, что грузиться будут именно мои модули, независимо от того, где находится приложение, написанное с использованием SDK, и как сконфигурирована система.
Речь идет, в частности, о Red Hat
Dll Hell на Линукс
Модератор: Модераторы разделов
-
halturin
- Сообщения: 167
- ОС: Linux
Re: Dll Hell на Линукс
если слинкуешь со своими библиотеками, то они автоматом подгрузятся при старте твоей либы, касабельно пути, то ldconfig тебе в помощь. еже ли сам будешь загружать, то в исходниках желательно использовать mylib = PATH_TO_MYLIB"/mylib.so" а в процессе configure реализовать явное объявление вроде
./configure --libs=/usr/lib/myprog чтобы в твоем config.h появилась строка вида #define PATH_TO_MYLIB=/usr/lib/myprog
в этом случае могу лишь порекомендовать почитать документацию на предмет autotools (autoconf, automake)
./configure --libs=/usr/lib/myprog чтобы в твоем config.h появилась строка вида #define PATH_TO_MYLIB=/usr/lib/myprog
в этом случае могу лишь порекомендовать почитать документацию на предмет autotools (autoconf, automake)
-
yeziz
- Сообщения: 5
Re: Dll Hell на Линукс
2 halturin:
Спасибо, поковыряюсь
Проблема в том, что мне надо гарантировать:
а) если аппликация, слинкованная со мной, загрузила уже такую библиотеку (ACE, например), то мои модули все равно должны грузить _мою_ версию.
б) если мои модули загрузили "мой" ACE, то аппликация должна получить оригинальную версию.
Спасибо, поковыряюсь
Проблема в том, что мне надо гарантировать:
а) если аппликация, слинкованная со мной, загрузила уже такую библиотеку (ACE, например), то мои модули все равно должны грузить _мою_ версию.
б) если мои модули загрузили "мой" ACE, то аппликация должна получить оригинальную версию.
-
yeziz
- Сообщения: 5
Re: Dll Hell на Линукс
Есть SDK, использующий модули A, B, C. Эти модули могут быть "стандартными" (уже установленными в системе) или "нестандартными" (написанными мной лично). С "нестандартными" все боле-мене просто я ясно.
Рассмотрим стандартные модули (тот же ACE). В нем исправлен баг, критичный для SDK. В то же время, я не могу быть уверен, что мое исправление абсолютно хорошо для всех и всегда (возможно, кто-то уже завязался на ошибочное поведение, или оно только мне кажется ошибочным - не приципиально).
Есть приложение, использующее SDK.
Я хочу быть уверен, что при запуске приложения SDK будет вызывать функции "исправленного" ACE, а приложение, если захочет пользоваться ACE, - функции оригинального ACE. Независимо от конфигурации системы, независимо от порядка загрузки библиотек в приложении.
Рассмотрим стандартные модули (тот же ACE). В нем исправлен баг, критичный для SDK. В то же время, я не могу быть уверен, что мое исправление абсолютно хорошо для всех и всегда (возможно, кто-то уже завязался на ошибочное поведение, или оно только мне кажется ошибочным - не приципиально).
Есть приложение, использующее SDK.
Я хочу быть уверен, что при запуске приложения SDK будет вызывать функции "исправленного" ACE, а приложение, если захочет пользоваться ACE, - функции оригинального ACE. Независимо от конфигурации системы, независимо от порядка загрузки библиотек в приложении.
-
halturin
- Сообщения: 167
- ОС: Linux
Re: Dll Hell на Линукс
LD_PRELOAD думаю тебе может помочь
-
d_n_k
- Сообщения: 636
- ОС: Gentoo GNU/Linux
Re: Dll Hell на Линукс
имхо, система не гарантирует что будет грузится именно твоя версия библиотеки, тк у неё есть свой кеш библиотек и грузится будет от туда.
единственный способ загружать свои либы это динамическая линковка, и то это либу могут подменить на свою.
на то они shared objects, чтобы были едиными для все прог. если хочешь именно свою либу, используй статическую линковку. один фиг тока твоя прога может пользовать эту либу
единственный способ загружать свои либы это динамическая линковка, и то это либу могут подменить на свою.
на то они shared objects, чтобы были едиными для все прог. если хочешь именно свою либу, используй статическую линковку. один фиг тока твоя прога может пользовать эту либу
все сказанное есть имхо...
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Dll Hell на Линукс
1 вариант: При линковке указывай конкретную версию -lace-1.2.3
Не уверен, что не будет происходить плохих вещей, если загружены одновременно 2 библиотеки с разными версиями.
2 вариант - 100% рабочий: положить библиотеку в известное место, открывать её dlopen-ом, получать адреса нужных функций, присваивать их указателям на функции, и далее юзать эти указатели.
3 вариант - наиболее правильный - не привязываться к конкретным версиям и не пытаться решать проблемы, которых нет.
Не уверен, что не будет происходить плохих вещей, если загружены одновременно 2 библиотеки с разными версиями.
2 вариант - 100% рабочий: положить библиотеку в известное место, открывать её dlopen-ом, получать адреса нужных функций, присваивать их указателям на функции, и далее юзать эти указатели.
3 вариант - наиболее правильный - не привязываться к конкретным версиям и не пытаться решать проблемы, которых нет.
-
nonstop
- Сообщения: 132
- ОС: Slackware
-
halturin
- Сообщения: 167
- ОС: Linux
-
yeziz
- Сообщения: 5
Re: Dll Hell на Линукс
Классно. Всем спасибо.
"не пытаться решать проблемы, которых нет" - хороший совет.
К сожалению, проблема реальная.
"не пытаться решать проблемы, которых нет" - хороший совет.
К сожалению, проблема реальная.
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Dll Hell на Линукс
Если я правильно понимаю, о чём речь.. Когда кто-либо пишет на базе существующей библиотеки нечто, существенно отличающееся от оригинала, либо используемое параллельно с оригиналом, -- это называется форк, и обычно имеет другое название, чем оригинальная библиотека -- от чего названная вами проблема действительно просто не возникает.(yeziz @ Jan 23 2007, в 17:19) писал(а):Классно. Всем спасибо.
"не пытаться решать проблемы, которых нет" - хороший совет.
К сожалению, проблема реальная.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Dll Hell на Линукс
t.t писал(а): ↑23.01.2007 18:22Если я правильно понимаю, о чём речь.. Когда кто-либо пишет на базе существующей библиотеки нечто, существенно отличающееся от оригинала, либо используемое параллельно с оригиналом, -- это называется форк, и обычно имеет другое название, чем оригинальная библиотека -- от чего названная вами проблема действительно просто не возникает.(yeziz @ Jan 23 2007, в 17:19) писал(а):Классно. Всем спасибо.
"не пытаться решать проблемы, которых нет" - хороший совет.
К сожалению, проблема реальная.
Тут еще проблема в том, что будут одинаковые имена у функций, поэтому будет использоваться какая то одна, а не обе одновременно. Конечно если изменить namespace (если С++), то все будет ок.
Есть еше вот такая штука, вроде по делу:
http://www.gnu.org/software/binutils/manua...node/ld_25.html