TipsAndTricks/Running YP binaries on Ubuntu and Vice Versa

From Yocto Project
Revision as of 23:34, 23 March 2017 by Bavery (talk | contribs)
Jump to navigationJump to search

Fun with moving things between os's!

Note: This is a hack to allow you to do some interesting things for experimental purposes. There are a large number of undiscovered ways this can fail. Use at your own risk :).

So, you want to run your ubuntu binary on qemux86-64 built with YP

  • We'll assume that the binary of interest is gawk. Chosen pretty randomly...
  • I will call the ubuntu native gawk gawk-ubuntu. I got it by cp /usr/bin/gawk ~/gawk-ubuntu
  • If I scp the gawk-ubuntu onto qemux86-64 and try to run it, I get the following:

root@qemux86-64:~# ./gawk-ubuntu   
-sh: ./gawk-ubuntu: No such file or directory  

  • so, what does this mean? It means that the dynamic loader ("ELF interpreter") for the ubuntu binary "knows" what it is looking for and is not finding it on the qemux86-64 system. So, how can we "fix" this. I have 2 different ways.
    • Path 1: add patchelf to your qemux86-64 image, and use it to change the interpreter that gawk-ubuntu is looking for. Do this by
 $ patchelf --set-interpreter /lib/ld-linux-x86-64.so.2 gawk-ubuntu  
      • Now when we run it we get:
 
root@qemux86-64:~# ./gawk-ubuntu
./gawk-ubuntu: error while loading shared libraries: libsigsegv.so.2: cannot open shared object file: No such file or directory

      • Better, (it is!). Now we just need the shared libs we are missing. In particular: libsigsegv.so.2: I could build this on qemux86-64 with YP if I have a recipe for it, (I don't) or I can grab it from Ubuntu as well. It looks like this:

root@qemux86-64:~# ls  
gawk-ubuntu       gawk-ubuntu-orig  libsigsegv.so.2  
root@qemux86-64:~# LD_LIBRARY_PATH=/home/root/ ./gawk-ubuntu   
Usage: gawk-ubuntu [POSIX or GNU style options] -f progfile [--] file ...  
Usage: gawk-ubuntu [POSIX or GNU style options] [--] 'program' file ...  
< more usage details ....>

      • - SUCCESS! This means it ran:)
      • But, what if you don't like modifying your binary? See Path2
    • Path2: change your system aka rootfs aka qemu image to accommodate ubuntu binaries:
      • What is the ubuntu gawk looking for anyway?

root@qemux86-64:~# patchelf --print-interpreter gawk-ubuntu-orig
/lib64/ld-linux-x86-64.so.2

      • Ahh, so what if we soft link /lib/ld-linux-x86-64.so.2 to /lib64/ld-linux-x86-64.so.2?

root@qemux86-64:~# ln -s /lib/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
root@qemux86-64:~# ./gawk-ubuntu-orig 
./gawk-ubuntu-orig: error while loading shared libraries: libsigsegv.so.2: cannot open shared object file: No such file or directory

      • That looks familiar and we know how to fix that.

root@qemux86-64:~# LD_LIBRARY_PATH=/home/root ./gawk-ubuntu-orig 
Usage: gawk-ubuntu-orig [POSIX or GNU style options] -f progfile [--] file ...
Usage: gawk-ubuntu-orig [POSIX or GNU style options] [--] 'program' file ...
< more usage details ....>