LINUX.ORG.RU

Линковать без привязки к версии

 ,


1

4

Привет, ЛОР!

Можно ли как-то собирать so-шник, и линковать к другому so-шнику, без привязки к версии?

Например, у меня собирается _mysql.so и он слинкован с libmysqlclient.so.18, а мне надо, что бы он кушал libmysqlclient.so -> libmysqlclient.so.16.

Пока он ругается на «no version information available».

Какие такие волшебные опции нужно передать gcc, что бы оно заработало?

И да, я понимаю что так делать не хорошо.

★★★★★

Последнее исправление: sphericalhorse (всего исправлений: 1)

Abi форсируют не просто так. Не занимайся порнографией а линкуй статически или кидай свои исошки в rpath или LD_PRELOAD=

anonymous
()
Ответ на: комментарий от anonymous

анонимус дело говорит. если у тебя слинковано с 18, то тебе нужен именно 18. как ему с 16 работать, там ведь отличия могут быть.

AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

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

Про статическую сборку думал, и про LD_PRELOAD тоже. К сожалению не подходит никак.

sphericalhorse ★★★★★
() автор топика

И да, я понимаю что так делать не хорошо

Зато можно хорошо объяснить зачем попытка этого действия? Вот так будет хорошо.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от AndreyKl

как насчёт создать 18 как симлинк на 16?

Пока он ругается на «no version information available».

sphericalhorse ★★★★★
() автор топика

Всяко можно сделать по уму, но ты не даёшь полноты картины. Пока самым логичным видится статическая линковка, хоть тебе она как будто и не подходит.

Bfgeshka ★★★★★
()
Ответ на: комментарий от Bfgeshka

Я уже начинаю тоже думать о статической линковке.
Возник вопрос: а можно so-шник, прилинковав в него только то, что в LSB входит, а остальное статически впихнуть? Или надо делать таки gcc -static -lglibc -llimb ...?

sphericalhorse ★★★★★
() автор топика
Ответ на: комментарий от sphericalhorse

О, по ходу нашел.
Я могу по идее собирать просто вот так:
gcc _mysql.o /usr/lib/libmysqlclient.a -o _mysql.so ...

sphericalhorse ★★★★★
() автор топика

Можно -l:<path> заюзать. Только учти, что порой GCC может вписать абсолютный путь вместо относительного. Поэтому проверь после этого бинарник с помощью ldd.

a1batross ★★★★★
()
Ответ на: комментарий от a1batross

Я пробовал. Оно при линковке смотрело не на то, что я указал в -l:...,
а на SONAME из ELF-заголовков той либы, к которой я линковался.

sphericalhorse ★★★★★
() автор топика

Как вариант, можно вовсе не линковать, а подгружать библиотеку в рантайме с помощью dlopen().

TeopeTuK ★★★★
()
Ответ на: комментарий от sphericalhorse

А, да, такое срабатывает, если soname пустой.

a1batross ★★★★★
()
Ответ на: комментарий от sphericalhorse

Так в этом-то и дело. Загрузчик потом смотрит на DT_NEEDED бинаря, чтобы найти нужный файл, который загрузить. И в этом файле должен быть тот SONAME, который он ожидает. Если не нужны версии, то тебе придётся убрать SONAME из библиотеки.

ilammy ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.