@valentin_dev

Нужна помощь с кросс компиляцией бинарника под разные системы Linux?

Задача состоит в следующем:

  1. Имеется простая консольная программа, без библиотек и зависимостей
  2. Ее нужно скомпилировать в бинарник, таким образом что бы его можно было запускать на разных версиях Linux (Ubuntu, CentOS, Fedora т.п) в основном 64х битка. Просто скопировал и юзаем .
  3. Для решения этой проблемы пробовал использовать Holy Build Box + Docker, компиляцию статик и т.п, но проблема остается. После переноса бинарника на другой Linux хост и его запуска получаю ошибку : segmentation fault .


Код простой программки для теста :


#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

int main()
{
   std::cout << "TEST BUILDS FOR RUN LINUX" << std::endl;
   return 0;
}


Дополнительно:

Можно даже посмотреть не в сторону С/С++ ( это конечно меняет логику работы, но готов пожертвовать ее сменой, раз переносимость под вопросом).

Основная задача которую надо решить: Мне нужно передать в исполняемый файл запрос (число), получить ответ (ключ - генерация на основе переданного числа). Но исполняемый код должен быть скрыт. Варианты??

Очень нужна помощь в этом вопросе!
  • Вопрос задан
  • 411 просмотров
Пригласить эксперта
Ответы на вопрос 6
Просто собирите исполняемый файл на системе с минимальной версией ABI. На большинстве систем будет запускаться.
Ответ написан
Ternick
@Ternick
Думаю самый просто вариант решить проблему - это использовать интерпретатор. Взять какой-нибудь python3 или Dart. Dart кстати имеет возможно (компилироваться), но python3 в разы быстрее.

Думаю если перенесёшь свой проект на python не пожалеешь, НО желательно чтобы на всех машинах был установлен python3 если ты хочешь переносить его в виде исходного кода или можно упаковать проект через pyinstaller в исполняемый файл.
Ответ написан
@falconandy
Можно переписать на Go и скомпилировать статический бинарник без зависимостей.
https://www.arp242.net/static-go.html
В только что зарелизенном Go 1.15 размер бинарника будет поменьше чем на предыдущих версиях.

Для компиляции 32-битной версии просто устанавливайте пару переменных:
GOOS=linux GOARCH=386 go build
Ответ написан
shurshur
@shurshur
Сисадмин, просто сисадмин...
Скомпилировать как статический бинарник (можно даже под x86 чтобы работало на 32-битных и 64-битных машинах).

$ echo 'int main(){ printf("Hello, World\n"); }' > xxx.c
$ gcc -static xxx.c -o xxx
xxx.c: In function ‘main’:
xxx.c:1:13: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
 int main(){ printf("Hello, World\n"); }
             ^~~~~~
xxx.c:1:13: warning: incompatible implicit declaration of built-in function ‘printf’
xxx.c:1:13: note: include ‘<stdio.h>’ or provide a declaration of ‘printf’
$ ./xxx 
Hello, World
$ ls -l xxx
-rwxrwxr-x 1 shurik shurik 844696 авг 13 22:04 xxx
$ ldd ./xxx
        не является динамическим исполняемым файлом


Но если используется много всяких библиотек, потребуются их статические версии, что может быть напряжно.
Ответ написан
@pvsam
Компилировать статический g++ -static.
А segmentation fault, это где то ошибка, все вызовы надо проверять на возвращаемые данные.
Ответ написан
Комментировать
ValdikSS
@ValdikSS
* [amd64] Enable LEGACY_VSYSCALL_NONE instead of LEGACY_VSYSCALL_EMULATE.
This breaks (e)glibc 2.13 and earlier, and can be reverted using the kernel
parameter: vsyscall=emulate
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы