2013-04-18 3 views
7

У меня есть проект Autotools C.Как скомпилировать двоичный файл, который работает как с libcrypto.so.0.9.8, так и с libcryto.so.1.0.0?

Как скомпилировать двоичный файл, который работает как с libcrypto.so.0.9.8, так и с libcryto.so.1.0.0? (т. е. Ubuntu 9.10 и 12.04)

В зависимости от возраста ОС, на котором я выполняю сборку, двоичный файл требует одну или другую версию.

Есть ли способ сделать это неважно, или различия между версиями libcryto являются непреодолимыми?

+1

Насколько я знаю, по собственному опыту, если вы не используете функции 1.0 (такие как отметка времени), она будет работать нормально. Все, что вам нужно сделать, это установить зависимость от libssl-dev. Но поскольку имя сонга изменилось, что означает изменение интерфейса, вы должны его протестировать ... – Felipe

+0

@Felipe - нет, изменение номера основной версии является ядром проблемы, для исполняемого файла требуется либо 0.9.8, либо 1.0.0 , в зависимости от версии ОС, на которой он был построен. то есть там, где символическая ссылка libcrypt.so указывала на время сборки. – fadedbee

+0

А, я думаю, я понял. Вы компилируете свою программу где-нибудь (в 0.9.8 или 1.0.0), а затем вы должны запускать ее где-то в другом месте (опять же в 0.9.8 или 1.0.0).Ваша среда сборки отличается от среды выполнения, и они оба могут меняться, исправлять? – Felipe

ответ

3

На мой взгляд, вы хотите использовать некоторые функции libcrypto.so.0.9.8, а некоторые из libcryto.so.1.0.0. Если большинство функций требуется от 1.0.0 или является предпочтительным выбором, тогда связывайтесь с libcrypto.so.1.0.0.

И вам может понадобиться некоторая функция из libcrypto.so.0.9.8, или у вас могут быть другие веские причины использовать libcrypto.so.0.9.8.

На мой взгляд, если вы связываетесь с библиотекой, вы получите ошибку компоновщика (дубликаты символов, так как обе библиотеки содержат одинаковые символы).

Если вам нужно использовать 0.9.8, загрузите его динамически с помощью dlopen и получите функцию обратного вызова функции, которую вы хотите использовать с dlsym.

Это может быть выполнено следующим образом:

void * handle; 
/*reqd_callback is the callback of required function.*/ 
reqd_callback cb; 

handle = dlopen ("libcrypto.so.0.9.8", RTLD_LAZY); 
cb  = (reqd_callback)dlsym(handle, "reqd_function"); 
//Call the cb 
cb (parameters); 

//Close the library. 
dlclose(handle); 

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

+0

Спасибо, я уже реализовал это перед вашим ответом, но вы получаете награду :-) Сначала я попробую libcrypto.so, затем libcrypto.so.1.0.0, затем libcrypto.so.0.9.8 и, наконец, libcrypto. so.0.9.8e (RHEL 5). Мне нужно только несколько хеш-функций, присутствующих во всех версиях, с которыми я столкнулся. Это дает мне лучшую совместимость на 5 лет (когда она построена на Etch) через RHEL/CentOS/Debian/Ubuntu/Fedora. У меня есть код проверки работоспособности для динамически связанных функций, на случай, если они изменятся в будущей версии libcrypto. Постскриптум http://www.virtsync.com – fadedbee

2

Можете ли вы создать мягкую ссылку, которая будет «указывать» на libcrypto.so.0.9.8 или libcryto.so.1.0.0. Дайте ему общее имя, а затем используйте его, то какая версия библиотеки будет привязана к ссылке? При установке приложения вы устанавливаете свою мягкую ссылку, чтобы указать на доступную версию библиотеки. Возможно, ваше программное обеспечение может быть проверено до 1.0.0, если lib достаточно совместим с обратной связью, т. Е. Вы не полагаетесь на somthing в 1.0.0, что не в 0.9.8, ваше одобрение.

2

Вы можете перестроить ssl-0.9.8 (не 1.x, потому что он содержит некоторые вещи, которые не будут работать в старой версии) и изменить строку в make-файле, где она выполняет заключительную общую библиотечную связь, и вставляет игнорирован

перекомпилировать его с игнорирован изменен с libssl.so.0.9.8 на libssl.so.0

это будет выглядеть примерно так: -Wl,-soname,libssl.so.0.9.8 изменить его: -Wl,-soname,libssl.so.0

теперь при компиляции против этой библиотеки двоичные файлы, созданные против нее, будут искать libssl.so.0 (whic h включен как символическая ссылка в обеих версиях)

+0

RHEL 5.X не имеет символической ссылки libcrypto.so. Он имеет только libcrypto.so.6 и libcrypto.so.0.9.8e iirc. – fadedbee

+0

Мне очень понравилась более ранняя версия этого ответа. Если бы не RHEL 5, лишенный символической ссылки libcrypto.so, я бы принял ее. – fadedbee

+0

Я не упоминал libcrypto, потому что исходный вопрос задал вопрос о ssl. Тем не менее, если вы это сделаете и напрямую свяжетесь с '-ssl', но _not_' -lcrypto' (пусть он будет динамически найти их во время выполнения), то objdump -x будет показывать только НЕОБХОДИМОЕ soname для ssl, а так как crypto является зависимостью, он будет динамически загружается на основе NEEDED в зависимости от того, какой из установленных libssl имеет символическую ссылку для libssl.so.0 – technosaurus

Смежные вопросы