为什么我不能 运行 在 ubuntu 上构建基于 alpine 的 C 程序?

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

我在 alpine linux 容器中编译了一个简单的 hello world C 程序,并将其复制到我的 ubuntu 主机上。令我惊讶的是,我无法 运行 我的 ubuntu 主机上的二进制文件。相反,当我尝试执行程序时出现以下错误。

$ /bin/bash ./hello
$ ./hello: ./hello: cannot execute binary file

为什么我不能 运行 我在 ubuntu 上用 alpine 编译的程序?

更新 我犯了一个错误,试图将 运行 C 程序作为 bash 脚本。但是,改正错误后,还是报错...

$ ./hello
$ bash: ./hello: No such file or directory

我已将二进制文件设为可执行文件,所以这应该不是问题所在。 运行在主机上编译相同的程序时不会显示此错误消息。

更新 让我澄清几点。

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

A​​lpine 发行版使用 musl 作为标准 C 库实现。

Ubuntu(以及所有其他 linux 的 99%)发行版使用 glibc 作为其标准 C 库实现。

他们与自己不相容。 "incompatible" 我的意思是在 alpine 下编译的二进制文件 link 针对 musl 库,而不是针对 glibc。

有两种解决方法。您可以在 ubuntu 中安装 musl 库,这样二进制文件就可以 link 对抗它。您可以在 alpine 中安装 glibc 并在 alpine 中编译二进制文件,同时 link 对 glibc 进行编译。或者您可以针对 musl 静态编译二进制文件。