I compiled a simple hello world C program inside of an alpine linux container and copied it onto my ubuntu host. To my surprise, I am not able to run the binary on my ubuntu host. Instead, I get the following error when I try to execute the program.
$ /bin/bash ./hello
$ ./hello: ./hello: cannot execute binary file
Why can't I run my program that was compiled on alpine on ubuntu?
UPDATE I made the mistake of trying to run the C program as a bash script. However, after correcting my mistake, I still get an error...
$ ./hello
$ bash: ./hello: No such file or directory
I have made the binary executable, so that should not be the issue. This error message does not show up when running the same program compiled on the host.
UPDATE Let me clarify a few points.
hello: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=bc9e3e2ecfc026f8077dca28dbbdee4778862d7a, not stripped
linux-vdso.so.1 (0x00007ffdbc79e000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f517b5ae000)
/lib64/ld-linux-x86-64.so.2 (0x00007f517bba1000)
hello: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-, with debug_info, not stripped
linux-vdso.so.1 (0x00007ffec27f7000)
libc.musl-x86_64.so.1 => not found
Alpine distribution uses musl as the standard C library implementation.
Ubuntu (and 99% of all the others linux) distributions use glibc as their standard C library implementation.
They are incompatible with themselves. By "incompatible" I mean that a binary compiled under alpine is linked against the musl library, not against glibc.
There are two solutions. You can install musl library in ubuntu so that the binary can link against it. You can install glibc in alpine and compile the binary in alpine while linking it against glibc. Or you can compile your binary statically against musl.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With