How to solve “error while loading shared libraries” when trying to run an arm binary with qemu-arm?

后端 未结 6 715
-上瘾入骨i
-上瘾入骨i 2021-02-04 08:40

I\'m running Linux Mint 14 with qemu, qemu-user, and the gnueabi toolchain installed. I compiled test.c with arm-linux-gnueabi-gcc test.c -o test.

When I tr

相关标签:
6条回答
  • 2021-02-04 09:04

    If you want to run ARM without Linux, then you need a different compiler (at least). arm-linux-gnueabi-gcc is a compiler for Linux. The compiler and libc are intimately linked. You will need a newlib compiler with a portability layer for qemu.porting newlib

    See: Balau and Google newlib+qemu. A newlib port is hosted at Github and seems to the same as the Balau blog.

    Typically a non-Linux gcc is called arm-none-eabi-gcc. The prefix arm-none-eabi- is recognized by some configure scripts.

    0 讨论(0)
  • 2021-02-04 09:06

    I also met this problem when running a C program with assembly code. My solution is to build the executable with the option "-static", for instance

    arm-linux-gnueabi-gcc -static -g main.c square.s
    

    Then

    qemu-arm a.out
    

    will not report the error saying "can not find the /lib/ld-linux.so.3".

    The only drawback is that the executable could be with a large size. But it's helpful when you just want to test your code.

    Of course, you can go with the method from Balau(see artless noise's answer). But if you don't want to feel frustrated by something like "UART serial ports" in this step, which is only to run a simple "test" function, go for a try of my fix.

    0 讨论(0)
  • 2021-02-04 09:10

    I solved the problem by copying the following libraries into /lib but I believe there should be a way better solution rather than this nasty solution I invented!

    sudo cp  /usr/arm-linux-gnueabi/lib/ld-linux.so.3 /lib
    sudo cp /usr/arm-linux-gnueabi/lib/libgcc_s.so.1 /lib
    sudo cp /usr/arm-linux-gnueabi/lib/libc.so.6 /lib
    

    Please let me know if there are other better solutions as I am interested to know.

    0 讨论(0)
  • 2021-02-04 09:22
    $ export QEMU_LD_PREFIX=/usr/arm-linux-gnueabi
    

    This works for me. It's basically the same thing as:

    $ qemu-arm -L /usr/arm-linux-gnueabi/
    

    You can add it to the ~/.bashrc file so you don't have to type it everytime you open the terminal.

    0 讨论(0)
  • 2021-02-04 09:28

    A variant, which worked for me, was to pass the loader library directly and to specify the required library paths using the loader parameter --library-path. For example:

    $ TOOLCHAIN_ROOT=/usr/local/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/arm-linux-gnueabihf
    $ qemu-arm $TOOLCHAIN_ROOT/libc/lib/ld-linux-armhf.so.3 --library-path $TOOLCHAIN_ROOT/libc/lib/arm-linux-gnueabihf:/$TOOLCHAIN_ROOT/lib ./my_executable
    

    Or equivalently export LD_LIBRARY_PATH instead of using --library-path.

    0 讨论(0)
  • 2021-02-04 09:29

    you can run the example by providing a path to the arm-linux-gnueabi shared libs using the -L flag.

    qemu-arm -L /usr/arm-linux-gnueabi/
    

    also make sure the LD_LIBRARY_PATH is not set.

    unset LD_LIBRARY_PATH
    
    0 讨论(0)
提交回复
热议问题