linux-debian.Dockerfile
1 FROM debian:stable-slim 2 3 SHELL ["/bin/bash", "-c"] 4 5 WORKDIR /root 6 7 # A too high maximum number of file descriptors (with the default value 8 # inherited from the docker host) can cause issues with some of our tools: 9 # - sanitizers hanging: https://github.com/google/sanitizers/issues/1662 10 # - valgrind crashing: https://stackoverflow.com/a/75293014 11 # This is not be a problem on our CI hosts, but developers who run the image 12 # on their machines may run into this (e.g., on Arch Linux), so warn them. 13 # (Note that .bashrc is only executed in interactive bash shells.) 14 RUN echo 'if [[ $(ulimit -n) -gt 200000 ]]; then echo "WARNING: Very high value reported by \"ulimit -n\". Consider passing \"--ulimit nofile=32768\" to \"docker run\"."; fi' >> /root/.bashrc 15 16 RUN dpkg --add-architecture i386 && \ 17 dpkg --add-architecture s390x && \ 18 dpkg --add-architecture armhf && \ 19 dpkg --add-architecture arm64 && \ 20 dpkg --add-architecture ppc64el 21 22 # dpkg-dev: to make pkg-config work in cross-builds 23 # llvm: for llvm-symbolizer, which is used by clang's UBSan for symbolized stack traces 24 RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \ 25 git ca-certificates \ 26 make automake libtool pkg-config dpkg-dev valgrind qemu-user \ 27 gcc clang llvm libclang-rt-dev libc6-dbg \ 28 g++ \ 29 gcc-i686-linux-gnu libc6-dev-i386-cross libc6-dbg:i386 libubsan1:i386 libasan8:i386 \ 30 gcc-s390x-linux-gnu libc6-dev-s390x-cross libc6-dbg:s390x \ 31 gcc-arm-linux-gnueabihf libc6-dev-armhf-cross libc6-dbg:armhf \ 32 gcc-powerpc64le-linux-gnu libc6-dev-ppc64el-cross libc6-dbg:ppc64el \ 33 gcc-mingw-w64-x86-64-win32 wine64 wine \ 34 gcc-mingw-w64-i686-win32 wine32 \ 35 python3-full && \ 36 if ! ( dpkg --print-architecture | grep --quiet "arm64" ) ; then \ 37 DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \ 38 gcc-aarch64-linux-gnu libc6-dev-arm64-cross libc6-dbg:arm64 ;\ 39 fi && \ 40 apt-get clean && rm -rf /var/lib/apt/lists/* 41 42 # Build and install gcc snapshot 43 ARG GCC_SNAPSHOT_MAJOR=16 44 RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \ 45 wget libgmp-dev libmpfr-dev libmpc-dev flex && \ 46 mkdir gcc && cd gcc && \ 47 wget --progress=dot:giga --https-only --recursive --accept '*.tar.xz' --level 1 --no-directories "https://gcc.gnu.org/pub/gcc/snapshots/LATEST-${GCC_SNAPSHOT_MAJOR}" && \ 48 wget "https://gcc.gnu.org/pub/gcc/snapshots/LATEST-${GCC_SNAPSHOT_MAJOR}/sha512.sum" && \ 49 sha512sum --check --ignore-missing sha512.sum && \ 50 # We should have downloaded exactly one tar.xz file 51 ls && \ 52 [ $(ls *.tar.xz | wc -l) -eq "1" ] && \ 53 tar xf *.tar.xz && \ 54 mkdir gcc-build && cd gcc-build && \ 55 ../*/configure --prefix=/opt/gcc-snapshot --enable-languages=c --disable-bootstrap --disable-multilib --without-isl && \ 56 make -j $(nproc) && \ 57 make install && \ 58 cd ../.. && rm -rf gcc && \ 59 ln -s /opt/gcc-snapshot/bin/gcc /usr/bin/gcc-snapshot && \ 60 apt-get autoremove -y wget libgmp-dev libmpfr-dev libmpc-dev flex && \ 61 apt-get clean && rm -rf /var/lib/apt/lists/* 62 63 # Install clang snapshot, see https://apt.llvm.org/ 64 RUN \ 65 # Setup GPG keys of LLVM repository 66 apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y wget && \ 67 wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc && \ 68 # Add repository for this Debian release 69 . /etc/os-release && echo "deb http://apt.llvm.org/${VERSION_CODENAME} llvm-toolchain-${VERSION_CODENAME} main" >> /etc/apt/sources.list && \ 70 apt-get update && \ 71 # Determine the version number of the LLVM development branch 72 LLVM_VERSION=$(apt-cache search --names-only '^clang-[0-9]+$' | sort -V | tail -1 | cut -f1 -d" " | cut -f2 -d"-" ) && \ 73 # Install 74 DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y "clang-${LLVM_VERSION}" "libclang-rt-${LLVM_VERSION}-dev" && \ 75 # Create symlink 76 ln -s "/usr/bin/clang-${LLVM_VERSION}" /usr/bin/clang-snapshot && \ 77 # Clean up 78 apt-get autoremove -y wget && \ 79 apt-get clean && rm -rf /var/lib/apt/lists/* 80 81 ENV VIRTUAL_ENV=/root/venv 82 RUN python3 -m venv $VIRTUAL_ENV 83 ENV PATH="$VIRTUAL_ENV/bin:$PATH" 84 RUN pip install lief