在64位计算机(gcc、docker)上使用-m32构建32位程序时,找不到-lgcc

sqougxex  于 2022-11-13  发布在  Docker
关注(0)|答案(2)|浏览(157)

我想用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

我错了什么?怎么可能修复它?我找到了similar questions,但他们建议我安装gcc-multilib
主机是Windows 10 x64,带有WSL2。但据我所知,这应该不重要。我想用gcc构建x86 32位linux二进制文件。

5anewei6

5anewei61#

以下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,可修复此问题。

hmmo2u0o

hmmo2u0o2#

我得到了32位编译工作与gcc 10(在debian)使用这个dockerfile:

FROM debian:bullseye

RUN apt-get update \
 && apt-get install --assume-yes --no-install-recommends --quiet \
         build-essential \
         gcc-multilib \
         g++-multilib \
         autoconf \
         automake \
         libtool

我还需要各种各样的自动工具,你可以看到。
如果你需要使用configure在32位模式下设置一个工具(在我的例子中是cpputest),那么你可以使用如下的参数:

RUN ./configure \
      CFLAGS=-m32 \
      CXXFLAGS=-m32 \
      LDFLAGS=-m32 \
      --build=x86_64-pc-linux-gnu \
      --host=i686-pc-linux-gnu

然后,当您在容器内进行编译时(如您的问题所示),使用gcc和正确的-m32标志,它可以很好地工作,没有错误:

gcc -m32 -O2 main.c -o main.o

相关问题