Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么可以';我不能在ubuntu上运行一个基于alpine的C程序吗?_Linux_Ubuntu_Gcc_Alpine - Fatal编程技术网

Linux 为什么可以';我不能在ubuntu上运行一个基于alpine的C程序吗?

Linux 为什么可以';我不能在ubuntu上运行一个基于alpine的C程序吗?,linux,ubuntu,gcc,alpine,Linux,Ubuntu,Gcc,Alpine,我在alpine linux容器中编译了一个简单的hello world C程序,并将其复制到我的ubuntu主机上。令我惊讶的是,我无法在我的ubuntu主机上运行二进制文件。相反,当我尝试执行该程序时,我会出现以下错误 $ /bin/bash ./hello $ ./hello: ./hello: cannot execute binary file 为什么我不能在ubuntu上运行在alpine上编译的程序 更新 我犯了一个错误,试图将C程序作为bash脚本运行。然而,在纠正我的错误后,

我在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容器编译的可执行文件上运行文件时,我得到以下输出
  • 当我在使用ubuntu容器编译的可执行文件上运行ldd时,我得到以下输出
  • 当我在使用alpine容器编译的可执行文件上运行文件时,我得到以下输出
  • 在使用alpine容器编译的可执行文件上运行ldd时,我得到以下输出
Alpine发行版使用作为标准C库实现

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

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

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

Alpine发行版用作标准C库实现

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

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


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

为什么选择bash?它不是bash脚本,而是一个二进制可执行文件;但是,当使用正确的语法时,我仍然会遇到以下错误:“bash:./hello:没有这样的文件或目录”?和
ldd hello
?我没有弄乱容器,但我怀疑容器内支持“hello”的容器库与容器外可用的库和C-runtine不兼容。我更新了我的问题,以包括文件和ldd命令的输出。alpine容器的ldd输出似乎表明存在链接错误。这是因为发行版之间的运行库不同吗?为什么是bash?它不是bash脚本,而是一个二进制可执行文件;但是,当使用正确的语法时,我仍然会遇到以下错误:“bash:./hello:没有这样的文件或目录”?和
ldd hello
?我没有弄乱容器,但我怀疑容器内支持“hello”的容器库与容器外可用的库和C-runtine不兼容。我更新了我的问题,以包括文件和ldd命令的输出。alpine容器的ldd输出似乎表明存在链接错误。这是因为发行版之间的运行库不同吗?这不是关于共享库,而是关于解释器a.k.a.动态加载程序。Alpine和Ubuntu使用不同的解释器。请参阅
文件
命令的输出。这个程序甚至没有进入加载共享库的阶段,因为没有正确的加载程序来加载它们。这个答案应该更新吗?对我来说很有用,太棒了!谢谢!这不是关于共享库,而是关于解释器a.k.a.动态加载程序。Alpine和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
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