Вопрос о переносимости исполняемых файлов
От: plastictown Норвегия  
Дата: 19.10.20 23:43
Оценка:
Доброго времени суток!

Не так давно вышел релиз 10-го gcc с поддержкой execution и других клевых штук. Очень хочется все это использовать, однако целевая платформа — CentOS7 amd64.
Если упаковать все по-максимуму в бинарник (бинарник как исполняемый файл, так и so-библиотека), все равно останется зависимость от libc6 и мне скажут что-то про версию ABI и все на этом закончится.
Есть ли возможность запустить бинарник, собранный на свежем дистрибутиве со свежим компилятором на такой целевой ОС? И попутно вопрос, почему статические библиотеки на дистрибутивах x86_64 собираются без флага -fPIC,
т.е. если я компоную на x86 libboost_system.a, то все ок, если на x86_64, то линкер мне скажет "иди собери руками и возвращайся".
И вот идешь и пересобираешь тот же буст, да и все остальное, с указанием -fPIC и тогда все компонуется.
Почему так? Возможно ли в принципе статически приделать libc и сделать бинарник (особенно интересно для so), независимый от libc на машине?
Если да, то не придется ли пересобирать для этого libc?

Спасибо!
Re: Вопрос о переносимости исполняемых файлов
От: watchmaker  
Дата: 20.10.20 01:05
Оценка: 3 (1) +1
Здравствуйте, plastictown, Вы писали:

P>Не так давно вышел релиз 10-го gcc с поддержкой execution и других клевых штук. Очень хочется все это использовать, однако целевая платформа — CentOS7 amd64.

P>Если упаковать все по-максимуму в бинарник (бинарник как исполняемый файл, так и so-библиотека), все равно останется зависимость от libc6 и мне скажут что-то про версию ABI и все на этом закончится.
P>Есть ли возможность запустить бинарник, собранный на свежем дистрибутиве со свежим компилятором на такой целевой ОС?

Можно использовать кросс-компиляцию: указываешь --sysroot на sdk старой ОС и всё соберётся с ней. То есть, например, можно взять из ubuntu 12 или твоего centos7, и тогда всё соберётся с той древней версией libc (и остальных компонент), которые тогда были. Соответственно, запускаться будет под всеми версиями позже.
То есть это получается обычная сборка современным компилятором, но с указанием динамически слинковаться с произвольной старой версией библиотек.
Способ очень рабочий, но есть ещё лучше

P>Возможно ли в принципе статически приделать libc и сделать бинарник (особенно интересно для so), независимый от libc на машине?


Да, а именно, можно использовать musl — хорошая реализация libc, допускающая полностью статическую сборку. Соответственно, на выходе получается бинарник без зависимостей от системной версии libc.


P> И попутно вопрос, почему статические библиотеки на дистрибутивах x86_64 собираются без флага -fPIC,

Э… Ну так флаг -fPIC не бесплатен. С ним код получается более медленный. Иногда заметно.
То есть предполагается, что включать его будут только для необходимых частей, где без него не обойтись.
Re: Вопрос о переносимости исполняемых файлов
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 20.10.20 01:10
Оценка: 3 (1) +1
Здравствуйте, plastictown, Вы писали:

P>Не так давно вышел релиз 10-го gcc с поддержкой execution и других клевых штук. Очень хочется все это использовать, однако целевая платформа — CentOS7 amd64.


На RHEL-подобных дистрибутивах обычно доступны Developer Toolset. В их рамках делают обратное портирование компиляторов и вобщем-то все работате. Судя по всему на данный момент есть только Developer Toolset 8 для CentOS и Developer Toolset 9 для RHEL. Так что, 10-ка пока вообще никак не доступна, разве что из исходников её собрать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.