Dll Hell на Линукс

Модератор: Модераторы разделов

yeziz
Сообщения: 5

Dll Hell на Линукс

Сообщение yeziz »

Добрый день, ув. All

Проблема в следующем: как гарантировать правильную загрузку shared objects на Линукс?
Майкрософт дала некоторое решение - манифесты. Есть ли что-то подобное (общее решение) для Линукс?
Я занимаюсь разработкой SDK и хочу быть уверен, что грузиться будут именно мои модули, независимо от того, где находится приложение, написанное с использованием SDK, и как сконфигурирована система.
Речь идет, в частности, о Red Hat
Спасибо сказали:
Аватара пользователя
halturin
Сообщения: 167
ОС: Linux

Re: Dll Hell на Линукс

Сообщение halturin »

если слинкуешь со своими библиотеками, то они автоматом подгрузятся при старте твоей либы, касабельно пути, то 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)
Спасибо сказали:
yeziz
Сообщения: 5

Re: Dll Hell на Линукс

Сообщение yeziz »

2 halturin:
Спасибо, поковыряюсь
Проблема в том, что мне надо гарантировать:
а) если аппликация, слинкованная со мной, загрузила уже такую библиотеку (ACE, например), то мои модули все равно должны грузить _мою_ версию.
б) если мои модули загрузили "мой" ACE, то аппликация должна получить оригинальную версию.
Спасибо сказали:
Аватара пользователя
halturin
Сообщения: 167
ОС: Linux

Re: Dll Hell на Линукс

Сообщение halturin »

брррр... ниче не понял
Спасибо сказали:
yeziz
Сообщения: 5

Re: Dll Hell на Линукс

Сообщение yeziz »

Есть SDK, использующий модули A, B, C. Эти модули могут быть "стандартными" (уже установленными в системе) или "нестандартными" (написанными мной лично). С "нестандартными" все боле-мене просто я ясно.
Рассмотрим стандартные модули (тот же ACE). В нем исправлен баг, критичный для SDK. В то же время, я не могу быть уверен, что мое исправление абсолютно хорошо для всех и всегда (возможно, кто-то уже завязался на ошибочное поведение, или оно только мне кажется ошибочным - не приципиально).
Есть приложение, использующее SDK.
Я хочу быть уверен, что при запуске приложения SDK будет вызывать функции "исправленного" ACE, а приложение, если захочет пользоваться ACE, - функции оригинального ACE. Независимо от конфигурации системы, независимо от порядка загрузки библиотек в приложении.
Спасибо сказали:
Аватара пользователя
halturin
Сообщения: 167
ОС: Linux

Re: Dll Hell на Линукс

Сообщение halturin »

LD_PRELOAD думаю тебе может помочь
Спасибо сказали:
yeziz
Сообщения: 5

Re: Dll Hell на Линукс

Сообщение yeziz »

Ок, спасибо.
Поковыряю
Спасибо сказали:
d_n_k
Сообщения: 636
ОС: Gentoo GNU/Linux

Re: Dll Hell на Линукс

Сообщение d_n_k »

имхо, система не гарантирует что будет грузится именно твоя версия библиотеки, тк у неё есть свой кеш библиотек и грузится будет от туда.

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

на то они shared objects, чтобы были едиными для все прог. если хочешь именно свою либу, используй статическую линковку. один фиг тока твоя прога может пользовать эту либу
все сказанное есть имхо...
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Dll Hell на Линукс

Сообщение v04bvs »

1 вариант: При линковке указывай конкретную версию -lace-1.2.3
Не уверен, что не будет происходить плохих вещей, если загружены одновременно 2 библиотеки с разными версиями.
2 вариант - 100% рабочий: положить библиотеку в известное место, открывать её dlopen-ом, получать адреса нужных функций, присваивать их указателям на функции, и далее юзать эти указатели.
3 вариант - наиболее правильный - не привязываться к конкретным версиям и не пытаться решать проблемы, которых нет.
Спасибо сказали:
Аватара пользователя
nonstop
Сообщения: 132
ОС: Slackware

Re: Dll Hell на Линукс

Сообщение nonstop »

v04bvs писал(а):
23.01.2007 15:23
3 вариант - наиболее правильный - не привязываться к конкретным версиям и не пытаться решать проблемы, которых нет.

+1
slackware - linux for human brains
Спасибо сказали:
Аватара пользователя
halturin
Сообщения: 167
ОС: Linux

Re: Dll Hell на Линукс

Сообщение halturin »

v04bvs писал(а):
23.01.2007 15:23
3 вариант - наиболее правильный - не привязываться к конкретным версиям и не пытаться решать проблемы, которых нет.

:) ну еже ли человек хочет с "мельницами" побороться, так почему бы ему не дать такой шанс ;)
Спасибо сказали:
yeziz
Сообщения: 5

Re: Dll Hell на Линукс

Сообщение yeziz »

Классно. Всем спасибо.
"не пытаться решать проблемы, которых нет" - хороший совет.
К сожалению, проблема реальная.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Dll Hell на Линукс

Сообщение t.t »

(yeziz @ Jan 23 2007, в 17:19) писал(а):Классно. Всем спасибо.
"не пытаться решать проблемы, которых нет" - хороший совет.
К сожалению, проблема реальная.
Если я правильно понимаю, о чём речь.. Когда кто-либо пишет на базе существующей библиотеки нечто, существенно отличающееся от оригинала, либо используемое параллельно с оригиналом, -- это называется форк, и обычно имеет другое название, чем оригинальная библиотека -- от чего названная вами проблема действительно просто не возникает.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Dll Hell на Линукс

Сообщение v04bvs »

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
Спасибо сказали: