В никсах я около недели назад был почти что ньюбом. Сильно не бейте... Пытаюсь сделать исполнимый модуль, который запускался бы и в любом Линуксе и в любом BSD (x86) без перекомпиляции. Возможно ли это в принципе? С чем столкнулся: 1. Формат исполнимого модуля в BSD слегка отличается от формата линукса. С установленным пакетом совместимости с Linux в BSD, эти различия сводятся к значению одного байта в заголовке. 2. Последние официальные версии LIBC в BSD и в Linux отличаются. Заставлять юзера настраивать ссылки на LIBC - не вариант. Поэтому решил отказаться от LIBC. Кажется, syscalls вполне совместимы, хотя соглашения вызова отличаются, но с этим я уже более-менее разобрался. Как быть с п1? На худой конец может сойти вариант с двумя экзешниками и скриптом, который детектит ось и запускает нужный экзешник. Может, есть более прямые пути? Ссылки и советы по сабжу приветствуются.
EvilsInterrupt brandelf годится только если запущен пакет совместимости с линуксом, AFAIK. Мне бы для общего случая... А что если использовать a.out? BSD'шный a.out и линуксовый a.out одинаковые, если не учитывать поддержку динамической линковки? Последние версии линуксов и BSD всё ещё поддерживают a.out? Кстати, а можно слинковать эльф таким образом, чтобы версия LIBC не попадала в заголовок и интерпретатор (динамический линкер) использовал бы потом любую версию LIBC?
Думаю да, по крайней мере без libc. Если системные вызовы сводятся к read/write/exit, то даже не потребуется run-time определение ОС. По крайней мере простейший бинарник, запускающийся и под Linux и под FreeBSD (про остальные BSD не знаю, врать не буду) делается без проблем. Хитрость лишь в том, чтобы компилировать его нужно в FreeBSD, а не в линуксе
EvilsInterrupt Ясно. Спасибо! konst Уррррря!!! Спасибо огромное! Статический эльф отлично работает и во FreeBSD, и в двух разных версиях Debian, и в Mandrake. С остальными BSD проблем, думаю, быть не должно. И с другими популярными линуксами, наверное, тоже.