在 dockerized Centos 7 上编译 gcc 12.2.0 失败并显示“execvp:权限被拒绝”

问题描述 投票:0回答:0

由于某些限制,我必须在 dockerized centos7 中编译最新版本的 gcc,这里是测试 Dockerfile :

FROM centos:7 as deps

ENV INSTALL_PREFIX /opt/deps
ENV PROC -j4
ENV LD_LIBRARY_PATH $INSTALL_PREFIX/lib:$LD_LIBRARY_PATH
ENV PATH $INSTALL_PREFIX/bin:$PATH

WORKDIR /root
RUN yum -y -q install deltarpm && yum -y -q update && yum -y -q groupinstall 'Development Tools'
COPY packages/common/ .
RUN tar -xzf lzip-1.23.tar.gz && cd lzip-1.23 && ./configure && make $PROC && make install

RUN tar -xzf binutils-2.35.2.tar.gz && cd binutils-2.35.2 && ./configure --prefix=$INSTALL_PREFIX && make $PROC && make install
RUN tar --lzip -xf gmp-6.2.1.tar.lz && cd gmp-6.2.1 && ./configure --prefix=$INSTALL_PREFIX && make $PROC && make install
RUN tar -xzf mpfr-4.2.0.tar.gz && cd mpfr-4.2.0 && ./configure --prefix=$INSTALL_PREFIX --with-gmp=$INSTALL_PREFIX && make $PROC && make install
RUN tar -xzf mpc-1.3.1.tar.gz && cd mpc-1.3.1 && ./configure --prefix=$INSTALL_PREFIX --with-mpfr=$INSTALL_PREFIX --with-gmp=$INSTALL_PREFIX && make $PROC && make install
RUN tar -xzf zstd-1.5.4.tar.gz && cd zstd-1.5.4 && make $PROC && make DESTDIR=$INSTALL_PREFIX install && cp -R $INSTALL_PREFIX/usr/local/* $INSTALL_PREFIX/. && rm -rf $INSTALL_PREFIX/usr
RUN tar -xzf isl-0.25.tar.gz && cd isl-0.25 && ./configure --prefix=$INSTALL_PREFIX --with-gmp-prefix=$INSTALL_PREFIX && make $PROC && make install
RUN tar -xzf gcc-12.2.0.tar.gz && mkdir $INSTALL_PREFIX/../gcc

WORKDIR /tmp/gcc

RUN ~/gcc-12.2.0/configure --prefix=$INSTALL_PREFIX/../gcc --with-ld=$INSTALL_PREFIX/bin --enable-languages=c,c++ --disable-multilib --with-mpfr=$INSTALL_PREFIX --with-gmp=$INSTALL_PREFIX \
    --with-mpc=$INSTALL_PREFIX --with-isl=$INSTALL_PREFIX --with-zstd=$INSTALL_PREFIX

RUN make $PROC || true
#RUN make install

ENTRYPOINT ["/bin/bash"]

这是我在尝试编译 gcc 版本 12.2.0 时遇到的错误:

[ -f stage_final ] || echo stage3 > stage_final
make[1]: Entering directory `/tmp/gcc'
make[2]: Entering directory `/tmp/gcc'
make[3]: Entering directory `/tmp/gcc'
rm -f stage_current
make[3]: Leaving directory `/tmp/gcc'
make[2]: Leaving directory `/tmp/gcc'
make[2]: Entering directory `/tmp/gcc'
make[3]: Entering directory `/tmp/gcc/libiberty'
make[4]: Entering directory `/tmp/gcc/libiberty/testsuite'
make[4]: Nothing to be done for `all'.
make[4]: Leaving directory `/tmp/gcc/libiberty/testsuite'
make[3]: Leaving directory `/tmp/gcc/libiberty'
make[3]: Entering directory `/tmp/gcc/lto-plugin'
make  all-am
make[4]: Entering directory `/tmp/gcc/lto-plugin'
make[4]: Leaving directory `/tmp/gcc/lto-plugin'
make[3]: Leaving directory `/tmp/gcc/lto-plugin'
make[3]: Entering directory `/tmp/gcc/intl'
make[3]: Nothing to be done for `all'.
make[3]: Leaving directory `/tmp/gcc/intl'
make[3]: Entering directory `/tmp/gcc/build-x86_64-pc-linux-gnu/libiberty'
make[4]: Entering directory `/tmp/gcc/build-x86_64-pc-linux-gnu/libiberty/testsuite'
make[4]: Nothing to be done for `all'.
make[4]: Leaving directory `/tmp/gcc/build-x86_64-pc-linux-gnu/libiberty/testsuite'
make[3]: Leaving directory `/tmp/gcc/build-x86_64-pc-linux-gnu/libiberty'
make[3]: Entering directory `/tmp/gcc/build-x86_64-pc-linux-gnu/fixincludes'
make[3]: Nothing to be done for `all'.
make[3]: Leaving directory `/tmp/gcc/build-x86_64-pc-linux-gnu/fixincludes'
make[3]: Entering directory `/tmp/gcc/build-x86_64-pc-linux-gnu/libcpp'
test -f config.h || (rm -f stamp-h1 && make stamp-h1)
make[3]: Leaving directory `/tmp/gcc/build-x86_64-pc-linux-gnu/libcpp'
make[3]: Entering directory `/tmp/gcc/zlib'
true "AR_FLAGS=rc" "CC_FOR_BUILD=gcc -std=gnu99" "CFLAGS=-g" "CXXFLAGS=-g" "CFLAGS_FOR_BUILD=-g -O2" "CFLAGS_FOR_TARGET=-g -O2" "INSTALL=/usr/bin/install -c" "INSTALL_DATA=/usr/bin/install -c -m 644" "INSTALL_PROGRAM=/usr/bin/install -c$make[3]: Leaving directory `/tmp/gcc/zlib'
make[3]: Entering directory `/tmp/gcc/libbacktrace'
make  all-am
make[4]: Entering directory `/tmp/gcc/libbacktrace'
true  DO=all multi-do # make
make[4]: Leaving directory `/tmp/gcc/libbacktrace'
make[3]: Leaving directory `/tmp/gcc/libbacktrace'
make[3]: Entering directory `/tmp/gcc/libcpp'
make[3]: Leaving directory `/tmp/gcc/libcpp'
make[3]: Entering directory `/tmp/gcc/libcody'
make[3]: Nothing to be done for `all'.
make[3]: Leaving directory `/tmp/gcc/libcody'
make[3]: Entering directory `/tmp/gcc/libdecnumber'
make[3]: Nothing to be done for `all'.
make[3]: Leaving directory `/tmp/gcc/libdecnumber'
make[3]: Entering directory `/tmp/gcc/gcc'
make[3]: Leaving directory `/tmp/gcc/gcc'
Checking multilib configuration for libgcc...
make[3]: Entering directory `/tmp/gcc/x86_64-pc-linux-gnu/libgcc'
# If this is the top-level multilib, build all the other
# multilibs.
# Early copyback; see "all" above for the rationale.  The
# early copy is necessary so that the gcc -B options find
# the right startup files when linking shared libgcc.
/bin/sh /root/gcc-12.2.0/libgcc/../mkinstalldirs ../.././gcc
parts="crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o crtprec32.o crtprec64.o crtprec80.o crtfastmath.o";                                        \
for file in $parts; do                                  \
  rm -f ../.././gcc/$file;              \
  /usr/bin/install -c -m 644 $file ../.././gcc/;        \
  case $file in                                         \
    *.a)                                                \
      ranlib ../.././gcc/$file ;;       \
  esac;                                                 \
done
# @multilib_flags@ is still needed because this may use
# /tmp/gcc/./gcc/xgcc -B/tmp/gcc/./gcc/ -B/opt/deps/../gcc/x86_64-pc-linux-gnu/bin/ -B/opt/deps/../gcc/x86_64-pc-linux-gnu/lib/ -isystem /opt/deps/../gcc/x86_64-pc-linux-gnu/include -isystem /opt/deps/../gcc/x86_64-pc-linux-gnu/sys-incl$# @multilib_dir@ is not really necessary, but sometimes it has
# more uses than just a directory name.
/bin/sh /root/gcc-12.2.0/libgcc/../mkinstalldirs .
/tmp/gcc/./gcc/xgcc -B/tmp/gcc/./gcc/ -B/opt/deps/../gcc/x86_64-pc-linux-gnu/bin/ -B/opt/deps/../gcc/x86_64-pc-linux-gnu/lib/ -isystem /opt/deps/../gcc/x86_64-pc-linux-gnu/include -isystem /opt/deps/../gcc/x86_64-pc-linux-gnu/sys-includ$collect2: fatal error: execvp: Permission denied
compilation terminated.
make[3]: *** [libgcc_s.so] Error 1
make[3]: Leaving directory `/tmp/gcc/x86_64-pc-linux-gnu/libgcc'
make[2]: *** [all-stage1-target-libgcc] Error 2
make[2]: Leaving directory `/tmp/gcc'
make[1]: *** [stage1-bubble] Error 2
make[1]: Leaving directory `/tmp/gcc'
make: *** [all] Error 2

我在 gcc 10 和 9 上遇到了同样的错误。我在 Windows 版本 4.16.3(96739) 上使用 docker。

我无法理解 execvp 的含义,而且由于我是 root,我是如何获得权限被拒绝的。我应该能够成功地能够完全编译gcc。怎么办?

6752767867090507 不起作用(我无法使用 67090507)

docker gcc compiler-errors centos7 execvp
© www.soinside.com 2019 - 2024. All rights reserved.