我在 alpine Linux 容器中编译了一个简单的 hello world C 程序,并将其复制到我的 ubuntu 主机上。令我惊讶的是,我无法在我的 ubuntu 主机上运行二进制文件。相反,当我尝试执行该程序时,出现以下错误。
$ /bin/bash ./hello
$ ./hello: ./hello: cannot execute binary file
为什么我无法在 ubuntu 上运行在 alpine 上编译的程序?
UPDATE我犯了一个错误,试图将 C 程序作为 bash 脚本运行。然而,在纠正我的错误后,我仍然收到错误......
$ ./hello
$ bash: ./hello: No such file or directory
我已经制作了二进制可执行文件,所以这不应该是问题。当运行在主机上编译的相同程序时,不会显示此错误消息。
UPDATE让我澄清几点。
- 在 ubuntu 容器中构建一个可执行文件,并将其复制到 ubuntu 主机上。该可执行文件有效。
- 另一个可执行文件是使用 alpine 容器构建的,并复制到 ubuntu 主机上。该可执行文件不起作用。
- 两个可执行文件都设置了其可执行位。当我运行 ./hello 时,我在相关可执行文件所在的目录中执行此操作。
- 当我跑步时使用 ubuntu 容器编译的可执行文件上的文件,我得到以下输出。
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 容器编译的可执行文件上的文件,我得到以下输出。
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