LINUX.ORG.RU

Способ избавиться от backward-несовместимости в glibc... Кошерно ль?


0

0

Имеется некая приблуда - компилятор+линкер. Она должна работать на всех пользовательских системах, рожая там исполняемые ELF-файлы и ELF shared libraries. В число требований входит, чтобы её продукты работали на всех линуксах.

Проблема в том, что её продукты используют некоторые функции из glibc, libpthread, etc. Обычно при линковке на endudser системах символы из glibc версионируются той версией, которая имеется на пользовательской системе. Скажем, foo@GLIBC_2.3.2 - запросто на SuSE 9.2. Так что эта программа не будет работать на SuSE 8.2, где стоит glibc 2.2.5, поскольку там нет foo@GLIBC_2.3.2, но есть foo@GLIBC_2.2.5.

Для обхождения сей неприятности предлагается собрать gcc-ом маленькую библиотечку, примерно такого вида:

void printf() {}
void strlen() {}
void _exit() {}
....
и т.д.

На enduser-машине линковаться к этой библиотечке. Таким образом слинкованная прилада при запуске засосёт нужный символ из /lib/libc.so.6 на _любой_ системе.

Для повышения надёжности сей схемы можно при сборке этой маленькой библиотечки-посредника заиспользовать version-скрипт со старыми версиями символов. Можно их набрать из сырцов glibc от того же SuSE8.2. Таким образом прилада всегда будет гарантированно работать на любой системе выше чем SuSE8.2.

Вопрос: насколько всё это "политкорректно", кошерно, юних-вей и т.д.?

Какие могут быть проблемы?

Спасибо за внимание...


А это будет 100% срабатывать разве?

shuthdar ★★★
()

там ABI в glibc не менялось ли с версиями?

лучше исходники давать. ну или статически собирать.

hateful_dead
()

А с самим glibc линковать на юзерской машине - не судьба? Как, например, oracle делает...

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

> А это будет 100% срабатывать разве?

Прочитай вопрос ещё раз, а? Там в конце есть фраза: "Какие могут быть проблемы?"

> лучше исходники давать. ну или статически собирать.

Исходники нельзя. Статически собирать нельзя: например libpthread и libdl невозможно прилинковать статически.

> А с самим glibc линковать на юзерской машине - не судьба? Как, например, oracle делает...

Прочитай ещё раз вопрос. Если так сделать, то слинкованная прилада не будет работать на системе, где glibc версией ниже.

> 2.3.x 2.2.x, сами по себе не совместимы, в 2.3.x выброшено много мусора

Какого мусора? Exported API, что ли? И printf/strlen/stat выбросили?! 8-)

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