Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
x86_64 and/or i686 chroot on arm host
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index Gentoo on Alternative Architectures
View previous topic :: View next topic  
Author Message
dinominant
Tux's lil' helper
Tux's lil' helper


Joined: 27 Oct 2006
Posts: 77

PostPosted: Wed Nov 26, 2014 5:36 pm    Post subject: x86_64 and/or i686 chroot on arm host Reply with quote

Similar to my other post arm chroot on x86_64 host I am now trying to get my x86_64 chroot working on my arm host (it's actually a raspberry pi). I followed the same procedure and I can run the x86_64 binaries on the arm host, but I cannot chroot into the x86_64 environment.

Running statically linked x86_64 binaries works if I call them manually:
Code:
host03 ~ # uname -a
Linux host03 3.12.33 #1 PREEMPT Mon Nov 24 09:31:14 MST 2014 armv6l BCM2708 GNU/Linux
host03 ~ # file /usr/bin/qemu-x86_64
/usr/bin/qemu-x86_64: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=7f186e8257479d38f029c931a94f488878e8dfbe, stripped
host03 ~ # file x86_64-test/bin/busybox
x86_64-test/bin/busybox: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, stripped
host03 ~ # /usr/bin/qemu-x86_64 x86_64-test/bin/busybox cp
BusyBox v1.21.0 (2014-11-10 01:41:36 MST) multi-call binary.

Usage: cp [OPTIONS] SOURCE... DEST

Copy SOURCE(s) to DEST

        -a      Same as -dpR
        -R,-r   Recurse
        -d,-P   Preserve symlinks (default if -R)
        -L      Follow all symlinks
        -H      Follow symlinks on command line
        -p      Preserve file attributes if possible
        -f      Overwrite
        -i      Prompt before overwrite
        -l,-s   Create (sym)links


However when I chroot into the x86_64 environment I get this error:
Code:
host03 ~ # mount -t proc none x86_64-test/proc
host03 ~ # mount --rbind /dev x86_64-test/dev
host03 ~ # mount --rbind /sys x86_64-test/sys
host03 ~ # chroot x86_64-test /bin/bash
chroot: failed to run command ‘/bin/bash’: Exec format error


Looking at /etc/init.d/qemu-binfmt on the arm host I can see that the magic bits for x86_64 binaries are missing:
Code:
   # probe cpu type
   cpu=`uname -m`
   case "$cpu" in
      i386|i486|i586|i686|i86pc|BePC|x86_64)
         cpu="i386"
         ;;
      armv[4-9]*)
         cpu="arm"
      ;;
   esac

   # register the interpreter for each cpu except for the native one
   if [ $cpu != "i386" -a -x "/usr/bin/qemu-i386" ] ; then
      echo ':i386:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-i386:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
      echo ':i486:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-i386:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
   fi
   if [ $cpu != "arm" -a -x "/usr/bin/qemu-arm" ] ; then
      echo   ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\x00\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
   fi
   if [ $cpu != "arm" -a -x "/usr/bin/qemu-armeb" ] ; then
      echo   ':armeb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-armeb:'"${QEMU_BINFMT_FLAGS}" > /proc/sys/fs/binfmt_misc/register
   fi
   eend $?
}


Where can I find those magic bits? I would like to run x86_64 binaries on my raspberri pi (and other arm devices like my tablet) transparently. It would be great if we can get this patched too. Having any binary work on any platform would be fantastic for development purposes.
_________________
BTC: 18wdrw8sLtruvdwr5kB3RxbbxzjDeXUpRh
LTC: LYynwaSeBLb4gHaMnkB7NQ27H6wF3Fjyxo


Last edited by dinominant on Fri Nov 28, 2014 11:40 pm; edited 1 time in total
Back to top
View user's profile Send private message
heiwa
n00b
n00b


Joined: 24 Oct 2012
Posts: 69

PostPosted: Wed Nov 26, 2014 6:12 pm    Post subject: Reply with quote

Try out the following

Code:

echo ':x86_64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-x86_64:P' > /proc/sys/fs/binfmt_misc/register


and if it works, create a patch for /usr/portage/app-emulation/qemu/files/qemu-binfmt.initd-r1 and file a bug with it attached.
Back to top
View user's profile Send private message
NeddySeagoon
Administrator
Administrator


Joined: 05 Jul 2003
Posts: 39636
Location: 56N 3W

PostPosted: Wed Nov 26, 2014 9:02 pm    Post subject: Reply with quote

dinominant,

'Run' is going to be an exaggeration but it might crawl :)

You want to run 64 bit code in an emulator running a 32 bit, in the case of the Pi, CPU.
Good luck.

Still, I remember 32 bit software floating point running on a 8 bit CPU. It was a 6502.
_________________
Regards,

NeddySeagoon

Computer users fall into two groups:-
those that do backups
those that have never had a hard drive fail.
Back to top
View user's profile Send private message
dinominant
Tux's lil' helper
Tux's lil' helper


Joined: 27 Oct 2006
Posts: 77

PostPosted: Thu Nov 27, 2014 12:11 am    Post subject: Reply with quote

Thanks heiwa, I'm making progress :)

I can now transparently run x86_64 statically linked binaries on arm:
Code:
host03 ~ # uname -a
Linux host03 3.12.33 #1 PREEMPT Mon Nov 24 09:31:14 MST 2014 armv6l BCM2708 GNU/Linux
host03 ~ # file x86_64-test/bin/busybox
x86_64-test/bin/busybox: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, stripped
host03 ~ # x86_64-test/bin/busybox cp
BusyBox v1.21.0 (2014-11-10 01:41:36 MST) multi-call binary.

Usage: cp [OPTIONS] SOURCE... DEST

Copy SOURCE(s) to DEST

        -a      Same as -dpR
        -R,-r   Recurse
        -d,-P   Preserve symlinks (default if -R)
        -L      Follow all symlinks
        -H      Follow symlinks on command line
        -p      Preserve file attributes if possible
        -f      Overwrite
        -i      Prompt before overwrite
        -l,-s   Create (sym)links


However, when I chroot into the environment I get a cryptic segfault. I'm not sure if it is qemu that is crashing or if it is the busybox binary:
Code:
host03 ~ # chroot x86_64-test /bin/bash
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault


It seems that I can run binaries in a 'transient' chroot:
Code:
host03 ~ # chroot x86_64-test /bin/busybox cp
BusyBox v1.21.0 (2014-11-10 01:41:36 MST) multi-call binary.

Usage: cp [OPTIONS] SOURCE... DEST

Copy SOURCE(s) to DEST

        -a      Same as -dpR
        -R,-r   Recurse
        -d,-P   Preserve symlinks (default if -R)
        -L      Follow all symlinks
        -H      Follow symlinks on command line
        -p      Preserve file attributes if possible
        -f      Overwrite
        -i      Prompt before overwrite
        -l,-s   Create (sym)links


But something about the dynamically linked /bin/bash is causing the segfault:
Code:
host03 ~ # file x86_64-test/bin/bash
x86_64-test/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, stripped
host03 ~ # chroot x86_64-test /bin/bash
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault
host03 ~ # x86_64-test/bin/bash
/lib64/ld-linux-x86-64.so.2: No such file or directory


It doesn't seem too painfully slow. A friend callenged me to get some windows applications running on the raspberry pi. I'm attempting to do it via a "wine in a x86_64 chroot on arm on pi" proof of concept. It may be slow, but it should work in theory. And who knows, maybe some things like Chip's Challenge will run half decently :)
_________________
BTC: 18wdrw8sLtruvdwr5kB3RxbbxzjDeXUpRh
LTC: LYynwaSeBLb4gHaMnkB7NQ27H6wF3Fjyxo
Back to top
View user's profile Send private message
Ant P.
Advocate
Advocate


Joined: 18 Apr 2009
Posts: 4637

PostPosted: Thu Nov 27, 2014 3:12 am    Post subject: Reply with quote

If all you're doing it for is that, making a 64-bit chroot when it has to run wine 32-bit multilib anyway (if you can even get that setup to work) is kinda overkill...
_________________
*.ebuild // /etc/service/*
Back to top
View user's profile Send private message
dinominant
Tux's lil' helper
Tux's lil' helper


Joined: 27 Oct 2006
Posts: 77

PostPosted: Thu Nov 27, 2014 4:44 am    Post subject: Reply with quote

Ant P. wrote:
If all you're doing it for is that, making a 64-bit chroot when it has to run wine 32-bit multilib anyway (if you can even get that setup to work) is kinda overkill...


I also have an x86 template that would probably be better to work with, I'll also test that too. Ideally I would like to be able to run any of x86, x86_64, and arm binaries on any one of the three platforms.
_________________
BTC: 18wdrw8sLtruvdwr5kB3RxbbxzjDeXUpRh
LTC: LYynwaSeBLb4gHaMnkB7NQ27H6wF3Fjyxo
Back to top
View user's profile Send private message
heiwa
n00b
n00b


Joined: 24 Oct 2012
Posts: 69

PostPosted: Thu Nov 27, 2014 7:11 am    Post subject: Reply with quote

For further debugging, put a /bin/sh link to busybox into the chroot and chroot with /bin/sh. Then you should be able to explore better what is working in the chroot and what not. For debugging the dynamic linking problems, you can use 'qemu-x86_64 -strace' to test whether the dynamic linker is found and whether it finds the libraries.
Back to top
View user's profile Send private message
dinominant
Tux's lil' helper
Tux's lil' helper


Joined: 27 Oct 2006
Posts: 77

PostPosted: Fri Nov 28, 2014 11:53 pm    Post subject: Reply with quote

I switched my focus to getting an i686 chroot working on my arm host since that will eliminate some complexity in getting wine to work. Once I get i686 working I'll spend some time trying to get the x86_64 chroot working on my raspberry pi.

So far the i686 chroot on arm is working. I can chroot into my i686 gentoo template on my raspberry pi and run applications :)
_________________
BTC: 18wdrw8sLtruvdwr5kB3RxbbxzjDeXUpRh
LTC: LYynwaSeBLb4gHaMnkB7NQ27H6wF3Fjyxo
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Gentoo on Alternative Architectures All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum