[РЕШЕНО] qemu-arm и ld-linux-x86-64.so.2 [РЕШЕНО]
Потребовалось собрать систему для arm, кросскомпиляция - не вариант, решил использовать эмуляцию, но с нативным armv5-...-gcc. Раньше подобная конструкция работала.
Используется chroot и binfmt, как бинарник для arm используется qemu-wrapper
include <string.h> #include <unistd.h> int main(int argc, char **argv, char **envp) { char *newargv[argc + 4]; newargv[3] = "/mnt/root/usr/bin/qemu-arm"; newargv[0] = argv[0]; newargv[1] = "--library-path"; newargv[2] = "/mnt/root/lib:/mnt/root/usr/lib"; memcpy(&newargv[4], &argv[1], sizeof(*argv) * (argc - 1)); newargv[argc + 3] = NULL; return execve("/mnt/root/lib/ld-linux-x86-64.so.2", newargv, envp); }
(slepnoga, надеюсь это ты удалять не будешь?)
Возможно, криво, но это недопеределка.
При подборке аргументов обнаружил:
mittorn@mittorn-desktop ~ $ /lib/ld-linux-x86-64.so.2 /usr/bin/qemu-arm Registering `arm-cpu' which already exists Аварийный останов
И так с любыми аргументами. Если запускать напрямую, то всё отлично работает, но у меня в chroot нет на месте x86-64 либ и быть не может. Раньше ставил qemu, оно отлично таким манипуляциям поддавалось.
Вот strace с ld-linux и напрямую. Как видно, отличаются только адреса и поведение после
brk(0)=0x7f5d5435c000 brk(0x7f5d5437d000)
Гугл не помог, яндекс тоже.
ЗЫ
Уже собрал qemu-user c --enable-static --disable-shared из qemu-kvm вручную (без install естественнно, просто бинарник куда надо кинул), были проблемы с интернетом, не отписался. Так что [РЕШЕНО] уже давно. Сейчас парюсь с gcc. portage нативный уже работает простым запуском через ld-linux + оверлеем некоторых bash-скриптов. В qemu-arm теряются некоторые env-ы, по этому поправил bash-скрипты, исправления с mount -o bind накладываются. прирост скорости огромен. Но gcc как на зло не хочет static делаться.
- Для комментирования войдите или зарегистрируйтесь
У меня конструкция chroot и
У меня конструкция chroot и binfmt отлично работает. Делалось по одной из инструкций вида:
1. FEATURES="buildpkg" emerge qemu-user
2. ROOT=/patch/to/chroot emerge -K qemu-user
3. /etc/init.d/qemu-binfmt start
4. Монтируем dev, proc и возможно portage
5. chroot в arm
И никаких костылей с врапперами.
И да, qemu/qemu-kvm и qemu-user конфликтуют, поэтому можно поставить qemu-user, создав бинарный пакет, установить его в chroot, а потом вернуть qemu/qemu-kvm.
А как вообще собрать
А как вообще собрать qemu-user? У меня сборка вылетала, что-то ругалось на неверный usage. Точный вывод сейчас не могу привести.
ЗЫЖ дело было в gcc-4x
Локальный оверлей растёт
Последнюю версию
Последнюю версию размаскируйте, она собирается нормально.
Уже собрал qemu-user c
Уже собрал qemu-user c --enable-static --disable-shared из qemu-kvm вручную (без install естественнно, просто бинарник куда надо кинул), были проблемы с интернетом, не отписался. Так что [РЕШЕНО] уже давно. Сейчас парюсь с gcc. portage нативный уже работает простым запуском через ld-linux + оверлеем некоторых bash-скриптов. В qemu-arm теряются некоторые env-ы, по этому поправил bash-скрипты, исправления с mount -o bind накладываются. прирост скорости огромен. Но gcc как на зло не хочет static делаться.
Локальный оверлей растёт