linux - 为什么我无法在 ubuntu 上运行基于 alpine 构建的 C 程序?

标签 linux ubuntu gcc alpine-linux

我在 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

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

更新 让我澄清几点。

  • 在 ubuntu 容器中构建一个可执行文件并将其复制到 ubuntu 主机上。该可执行文件有效。
  • 另一个可执行文件是使用 alpine 容器构建的,并复制到 ubuntu 主机上。该可执行文件无法运行。
  • 两个可执行文件都设置了可执行位。当我运行 ./hello 时,我是在相关可执行文件所在的目录中执行的。
  • 当我在使用 ubuntu 容器编译的可执行文件上运行 file 时,我得到以下输出。
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
  • 当我在使用 ubuntu 容器编译的可执行文件上运行ldd时,我得到以下输出。
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)
  • 当我在使用 alpine 容器编译的可执行文件上运行 file 时,我得到以下输出。
hello: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-, with debug_info, not stripped
  • 当我在使用 alpine 容器编译的可执行文件上运行 ldd 时,我得到以下输出。
linux-vdso.so.1 (0x00007ffec27f7000)
libc.musl-x86_64.so.1 => not found

最佳答案

Alpine 分布使用 musl作为标准 C 库实现。

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

他们与自己不相容。我所说的“不兼容”是指在 alpine 下编译的二进制文件与 musl 库链接,而不是与 glibc 链接。

有两种解决方案。您可以在 ubuntu 中安装 musl 库,以便二进制文件可以链接到它。您可以在 alpine 中安装 glibc,并在 alpine 中编译二进制文件,同时将其链接到 glibc。或者您可以针对 musl 静态编译二进制文件。

关于linux - 为什么我无法在 ubuntu 上运行基于 alpine 构建的 C 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59341750/

相关文章:

linux - iMacros + FF : Linux, 命令行

linux - 用于多个设备的可加载内核模块 (LKM)

gcc - 一个人如何颠倒 "int"值的低 8 位的顺序并保持高 8 位不变?

c - GCC 找不到指定 -I 选项的头文件

linux - 在 bash 中运行时,如何在特定点向脚本发送击键?

c - 如何在Linux中使用RAW套接字发送802.11管理帧和数据帧

Linux 'script' docker 内的命令未按预期写入文件

python - 如何仅在第一次通过时以 root 身份运行 Ansible?

php - 致命的!用户 postgres 的身份验证失败,多个操作系统,没有任何工作

C: 未定义的楼层引用