LINUX.ORG.RU

Можно ли скомпилировать внутри chroot

 , , , ,


1

3

Привет, хорошие мои!

На тру amd64 системе можно сделать i386 chroot, и компилировать i386 программы внутри него без плясок с флагами. Однако обратного сделать нельзя, и тем более нельзя компилировать таким образом arm программы, например. Чтобы увеличить универсальность, хотелось бы завести какую-то функцию или команду в шелле типа:

# host is amd64

$ can_compile_for arm
false
$ can_compile_for amd64
true
$ can_compile_for i386
true


Какие есть мысли как такого добится без запуска компилятора внутри chroot (самый тупой и очевидный способ)?

Ответ на: комментарий от cvv

П̴̫̭̈о̴̲̪̗͇͆͒̚͘ч̵̬̱̗̑̍̈̐̊̇̐ӗ̶͉̂͝м̸̛̼͇͓̗͇͕͆́̇͘ͅӳ̶͔̩̹͍̹̟͎̰̖͗̌̾͝͠ ̸̤͂̃͊͛́̕͠͝у̷͍͔͖̳̝͈̠̻͂̃͐̏ ̶͓͚͙̜̺̀͐̾͑̾̀̚т̸̢̳̝̰͓͔̟͍̅̀̅̍̇̆̎е̵̨̭̼̱̳͓̦̥͋̄ͅͅб̷̡̢̞̗̫̭̖̭̒͌̃͂͐̆я̴̧̛̛͚͊̄̿̈́̔̾̇́ ̸͍̰͙͚͖̥̣̌̽̕ͅт̸̢̫͈̠̀̿̾ͅӓ̸̢̗̻͙̞͚́̇͛͂͛̕̕͘͜͠к̷̘͇͛͆̅̄͑̆̊͠͝и̷̲̊ͅе̵̨͈̪͙̰͇̺̭̪̠̓̓͒̽̽͋͆͝ ̸̫̳̤̼̪̑̏͛̀̌͝с̶̧̮̳̭̪̭͎͎̤̀͊̊̃͆ͅи̴͇̤͚̾̀̑̔̑̾͂͘̚м̷̢̞̗́̂̓̾̾̏̑̈̽в̶̛͈̮̱̺͕͓́͒͌͠о̷̟̅̇л̴̩͚̈́ы̷̩̙̰͎̼̟̤͗̏́̒ ̵̡̺̤̺̳̫̗̬͙̈́̏̋̂͝с̵̩̱̦̭͍͉̹̙̦͉̍͒́̄̏͒͘т̸̬͚̰̜̮̭̼̉͋̅̌͋̿̉̀̿̈́р̴̯̲̩̼̾̀͐͋̆̾̉͘а̵̨͇̫̝̻̹͍̱͂̊н̶͓̰͔̍̋͝н̸̨̥̲̞̦̠̕ӹ̷̧̖̦̜̲̰̱́͗̓̐ͅе̸̨̘̩̖͖͚̭̒ͅ ̵̱͇̪̑̂в̷̡̛̣̌̽̊̚͝ ̷̗̟̥̥̋̉̒͊̿с̵̯͕̠̺̘̺̇̎̉͘о̶̡̂̀̔͊͑͂͝о̵̦̥̹͚͇͗̃̂͠б̸̡̤̪͔̙̪̥͊͂͋͑̄̒̏̌щ̵̱̭̭̭̎̊̄͘е̶̝̱̘̮̥̱̙̿̅͗̉͠н̵̭̙̬̝̄̓̾̽̂̃͌ͅӥ̷̡̼͙̲̭̗͇́͗͋̆̈́̅͜и̵̧̼̲̻͚̤̟̖͔͕̐͂͛̔͌͐̀͗̑͠?̶̨̮̪̖͈̤̞̪̬́̑̂́̉̽̋͗͋̕

anonymous ()

Однако обратного сделать нельзя, и тем более нельзя компилировать таким образом arm программы, например.

Можно, смотри в сторону binfmt и qemu user-static

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

Ничего нового не привнесу, просто структурирую.

1) Естественно, что возможно, никаких принципиальных ограничений нет. Называется это кросс-компиляторы.

2) Даже не будь по какой-то причине возможной кросс-компиляция, есть user-mode emulation, с помощью которого можно не только скомпилировать, а хоть запустить.

Так что на твой дурацкий вопрос «возможно ли скомпилировать теоретически» ответом будет тождественное «да» двумя способами, и искомая тобой программа - true.

Меняй вопрос на поинтереснее, этот отстойный.

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

Я внутри jail компилирую для другого компьютера, под другую версию операционной системы. Всё работает. Только нужно установить внутри клетки все необходимые инструменты. Это фактически - изолированная среда, которая ничего не знает о внешней системе.

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

вопрос сформулирован чётко, ты просто читаешь очень выборочно. Нет никакого кросс-компилятора и qemu, забудь об этом. При чём тут вообще кросс-компиляторы? Есть простейший chroot, сделанный debootstrap, например. Перед началом прямой компиляции внутри него я хочу понять возможно ли такая компиляция в принципе. Тупо запустить gcc внутри него с простейшей программой я могу, это и так понятно. Я ищу другие, более прямые способы.

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

вопрос сформулирован чётко, ты просто читаешь очень выборочно. Нет никакого кросс-компилятора и qemu, забудь об этом. При чём тут вообще кросс-компиляторы?

...

Есть простейший chroot, сделанный debootstrap, например. Перед началом прямой компиляции внутри него я хочу понять возможно ли такая компиляция в принципе.

В принципе - возможна. Компилятором в твоем конкретном чруте - надо попробовать и ...

Тупо запустить gcc внутри него с простейшей программой я могу, это и так понятно.

ты издеваешься? «ищу решение, решение не предлагать»?

Я ищу другие, более прямые способы.

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

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

как qemu отвечает на мой вопрос?

qemu тебе ничего не должен отвечать.

Я не спрашивал о том, как скомпилировать.

Ты глупый или да? Создаешь sh скрипт, который запускает это окружение, и с помощью его запускаешь нужный инструментарий и собираешь. За примером - идти в Sailfish SDK.

xDShot ★★★★★ ()

Твоя ошибка в том, что ты считаешь, что тру 64-битная система по умолчанию может исполнять 32-битные бинарники, делая возможным использование 32 битного gcc. Хотя на самом деле это не обязательно так, и по этому безопаснее всегда использовать кросс-компиляцию, если целевая архитектура отличается от архитектуры платформы сборки. Иными словами, возможность сборки i386 в chroot на amd64 это особенность только данной конкретной платформы, обусловленная аппаратно.

Khnazile ★★★★★ ()

Тебе хочется странного.

А по компиляции - смотри сюда: https://proot-me.github.io

PRoot can also mix the execution of host programs and the execution of guest programs emulated by QEMU user-mode. This is useful to use host equivalents of programs that are missing from the guest rootfs and to speed up build-time by using cross-compilation tools or CPU-independent programs, like interpreters.

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

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

Иными словами, возможность сборки i386 в chroot на amd64 это особенность только данной конкретной платформы, обусловленная аппаратно.

тут говорят, что под некоторые arm тоже можно собирать тупо в arm chroot на amd64 хосте. Сам не проверял.

former_anonymous ★★★ ()

Однако обратного сделать нельзя, и тем более нельзя компилировать таким образом arm программы, например

Вообще-то с помощью qemu можно. arm chroot с полноценной arm системой, и можно собираться нам нативно. Скорость из-за эмуляции соответствующая, зато никаких костылей. Но с костылями можно повысить скорость сборки - FreeBSD'шная сборочница пакетов poudriere например в такой чрут умеет добавлять нативный кросс-компилятор, sh, архиваторы и кучу других cpu-hungry базовых утилит. В результате все работает на порядки быстрее (чистой эмуляции) и всего в разы медленнее хоста.

Какие есть мысли как такого добится без запуска компилятора внутри chroot (самый тупой и очевидный способ)?

Положить в каждый chroot руками файлик выдающий нужные флаги или устанавливающий переменные окружения.

slovazap ★★★★★ ()