linux - 在 64 位机器(gcc、docker)上使用 -m32 构建 32 位程序时找不到 -lgcc
问题描述
我想为 32 位的 linux 构建一个简单的 hello world C 程序。我试图用 docker 来做(因为我机器上的操作系统不是 Linux)
这是Dockerfile
:
FROM gcc:4.9
RUN dpkg --add-architecture i386
RUN apt-get update && apt-get install -y libc6-dbg libc6-dbg:i386 gcc-multilib libc-dev:i386 gcc-4.9-base:i386
我这样构建它:
docker build -t my-gcc .
然后我尝试像这样使用它:
docker run --rm -v ${pwd}:/usr/src/myapp -w /usr/src/myapp my-gcc gcc -m32 -o hello hello.c
我收到此错误:
/usr/bin/ld: skipping incompatible /usr/local/lib/gcc/x86_64-linux-gnu/4.9.4/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status
我错了什么?怎么可能修复它?我发现了类似的问题,但他们建议gcc-multilib
,我已经安装了。
主机是 Windows 10 x64,带有 WSL2。但据我所知,这无关紧要。我想用 gcc 构建 x86 32bit linux 二进制文件。
解决方案
以下 Dockerfile 修复了该问题:
FROM gcc:4.9
RUN apt-get update \
&& apt-get install --assume-yes --no-install-recommends --quiet \
libc6-dev-i386 \
gcc-multilib \
&& apt-get clean all
ENTRYPOINT ["/usr/bin/gcc-4.9", "-m32"]
测试:
$ docker run --rm -v .:/usr/local/src/:rw my-gcc /usr/local/src/hello.c -o /usr/local/src/hello
$ file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=32f247e8f3406cde7902af8baf469907b42ed969, not stripped
docker 镜像提供了两个 gcc 编译器:
$ docker run --rm -it --entrypoint=bash my-gcc
root@efe1bcf6c715:/# which gcc
/usr/local/bin/gcc
root@efe1bcf6c715:/# which gcc-4.9
/usr/bin/gcc-4.9
如果使用gcc
编译器,我们会得到几个链接器错误:
$ podman run --rm -v .:/usr/local/src/:rw --entrypoint="gcc" my-gcc:latest -m32 /usr/local/src/hello.c -o /usr/local/src/hello
/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
/usr/bin/ld: skipping incompatible /usr/local/lib/gcc/x86_64-linux-gnu/4.9.4/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status
强制gcc-4.9
一个,解决问题。
推荐阅读
- flutter - 颤振亮度的 Amoled 黑色亮度设置
- node.js - 带有 Webpack、Typescript 和 ES6 的 elastic-apm-node 不起作用?
- python - 了解 lambda 函数重新格式化以进行闭包
- apache-kafka - Kafka:简单 ACL 授权器与自定义 ACL 授权器
- python-3.x - 有没有办法从 Python 3.x 中的一行整数中只读取一个整数?
- javascript - 我是否使用下面的代码来创建一个 jquery 滑块,img 会改变它而不是 href 吗?
- reactjs - 在 react application(expo) 和 react native 应用程序之间共享代码
- css - 如何在@media print 中打印页码?
- vue.js - 在 vuetify v-select 中显示原始 html
- reactjs - Reactjs 应用程序如何使用/运行它以及移动的可能性