Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't I run a C program built on alpine on ubuntu? [duplicate]

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.

  • One executable was built in a ubuntu container and copied onto the ubuntu host. This executable works.
  • The other executable was built using an alpine container and copied onto the ubuntu host. This executable does not work.
  • Both executables have their executable bit set. When I run ./hello, I do it within the directory where the executable in question resides.
  • When I run file on the executable compiled using the ubuntu container, I get the following output.
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
  • When I run ldd on the executable compiled using the ubuntu container I get the following output.
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)
  • When I run file on the executable compiled using the alpine container, I get the following output.
hello: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-, with debug_info, not stripped
  • When I run ldd on the executable compiled using the alpine container, I get the following output.
linux-vdso.so.1 (0x00007ffec27f7000)
libc.musl-x86_64.so.1 => not found
like image 965
Tyler K Avatar asked Oct 25 '25 11:10

Tyler K


1 Answers

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.

like image 196
KamilCuk Avatar answered Oct 27 '25 01:10

KamilCuk



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!