Skip to content

Instantly share code, notes, and snippets.

@Varriount
Last active May 12, 2024 22:07
Show Gist options
  • Save Varriount/7147ec47dccfb6522397d1b6d40d80cf to your computer and use it in GitHub Desktop.
Save Varriount/7147ec47dccfb6522397d1b6d40d80cf to your computer and use it in GitHub Desktop.
Script to cross-compile GDB for Windows
# NOTES
# - Credit goes to @adamrehn for https://github.com/adamrehn/gdb-multiarch-windows,
# which much of this script is based upon.
# - `texinfo` may need to be installed on your system, otherwise the GDB
# build process may fail.
# - If any of the build processes fail due to problems such as missing
# dependencies, the entire build directory must usually be wiped, even if
# `configure` completed successfully. Otherwise `configure` and `make` will
# used cached information (and not pick up on any fixes).
bash set -euo pipefail
# sudo apt-get install texinfo
CPU_CORES=8
GMP_VERSION=6.3.0
MPFR_VERSION=4.2.1
GDB_VERSION=13.2
EXPAT_VERSION=2.6.2
EXPAT_RELEASE_NAME=$(echo "$EXPAT_VERSION" | sed 's|\.|_|g')
DIST_DIRECTORY="/tmp/dist/gdb-${GDB_VERSION}"
GMP_DOWNLOAD_URL="https://gmplib.org/download/gmp/gmp-${GMP_VERSION}.tar.xz"
GMP_ARCHIVE_PATH="/tmp/gmp-${GMP_VERSION}.tar.xz"
GMP_SRC_PATH="/tmp/src/gmp-${GMP_VERSION}"
GMP_BUILD_PATH="/tmp/build/gmp-${GMP_VERSION}"
GMP_INSTALL_PATH="/tmp/install/gmp-${GMP_VERSION}"
GMP_ARCHIVE_DIRECTORY="$(realpath --canonicalize-missing "$GMP_ARCHIVE_PATH/..")"
GMP_SRC_DIRECTORY="$(realpath --canonicalize-missing "$GMP_SRC_PATH/..")"
GMP_BUILD_DIRECTORY="$(realpath --canonicalize-missing "$GMP_BUILD_PATH/..")"
GMP_INSTALL_DIRECTORY="$(realpath --canonicalize-missing "$GMP_INSTALL_PATH/..")"
MPFR_DOWNLOAD_URL="https://www.mpfr.org/mpfr-current/mpfr-${MPFR_VERSION}.tar.gz"
MPFR_ARCHIVE_PATH="/tmp/mpfr-${MPFR_VERSION}.tar.gz"
MPFR_SRC_PATH="/tmp/src/mpfr-${MPFR_VERSION}"
MPFR_BUILD_PATH="/tmp/build/mpfr-${MPFR_VERSION}"
MPFR_INSTALL_PATH="/tmp/install/mpfr-${MPFR_VERSION}"
MPFR_ARCHIVE_DIRECTORY="$(realpath --canonicalize-missing "$MPFR_ARCHIVE_PATH/..")"
MPFR_SRC_DIRECTORY="$(realpath --canonicalize-missing "$MPFR_SRC_PATH/..")"
MPFR_BUILD_DIRECTORY="$(realpath --canonicalize-missing "$MPFR_BUILD_PATH/..")"
MPFR_INSTALL_DIRECTORY="$(realpath --canonicalize-missing "$MPFR_INSTALL_PATH/..")"
EXPAT_DOWNLOAD_URL="https://github.com/libexpat/libexpat/releases/download/R_${EXPAT_RELEASE_NAME}/expat-${EXPAT_VERSION}.tar.gz"
EXPAT_ARCHIVE_PATH="/tmp/expat-${EXPAT_VERSION}.tar.gz"
EXPAT_SRC_PATH="/tmp/src/expat-${EXPAT_VERSION}"
EXPAT_BUILD_PATH="/tmp/build/expat-${EXPAT_VERSION}"
EXPAT_INSTALL_PATH="/tmp/install/expat-${EXPAT_VERSION}"
EXPAT_ARCHIVE_DIRECTORY="$(realpath --canonicalize-missing "$EXPAT_ARCHIVE_PATH/..")"
EXPAT_SRC_DIRECTORY="$(realpath --canonicalize-missing "$EXPAT_SRC_PATH/..")"
EXPAT_BUILD_DIRECTORY="$(realpath --canonicalize-missing "$EXPAT_BUILD_PATH/..")"
EXPAT_INSTALL_DIRECTORY="$(realpath --canonicalize-missing "$EXPAT_INSTALL_PATH/..")"
GDB_DOWNLOAD_URL="https://ftp.gnu.org/gnu/gdb/gdb-${GDB_VERSION}.tar.gz"
GDB_ARCHIVE_PATH="/tmp/gdb-${GDB_VERSION}.tar.gz"
GDB_SRC_PATH="/tmp/src/gdb-${GDB_VERSION}"
GDB_BUILD_PATH="/tmp/build/gdb-${GDB_VERSION}"
GDB_INSTALL_PATH="/tmp/install/gdb-${GDB_VERSION}"
GDB_ARCHIVE_DIRECTORY="$(realpath --canonicalize-missing "$GDB_ARCHIVE_PATH/..")"
GDB_SRC_DIRECTORY="$(realpath --canonicalize-missing "$GDB_SRC_PATH/..")"
GDB_BUILD_DIRECTORY="$(realpath --canonicalize-missing "$GDB_BUILD_PATH/..")"
GDB_INSTALL_DIRECTORY="$(realpath --canonicalize-missing "$GDB_INSTALL_PATH/..")"
export CC_FOR_BUILD=gcc
rm -rf "$GMP_ARCHIVE_PATH"
rm -rf "$GMP_SRC_PATH"
rm -rf "$GMP_BUILD_PATH"
rm -rf "$GMP_INSTALL_PATH"
rm -rf "$MPFR_ARCHIVE_PATH"
rm -rf "$MPFR_SRC_PATH"
rm -rf "$MPFR_BUILD_PATH"
rm -rf "$MPFR_INSTALL_PATH"
rm -rf "$EXPAT_ARCHIVE_PATH"
rm -rf "$EXPAT_SRC_PATH"
rm -rf "$EXPAT_BUILD_PATH"
rm -rf "$EXPAT_INSTALL_PATH"
rm -rf "$GDB_ARCHIVE_PATH"
rm -rf "$GDB_SRC_PATH"
rm -rf "$GDB_BUILD_PATH"
rm -rf "$GDB_INSTALL_PATH"
mkdir -p "$GMP_ARCHIVE_DIRECTORY"
mkdir -p "$GMP_SRC_DIRECTORY"
mkdir -p "$GMP_BUILD_DIRECTORY"
mkdir -p "$GMP_INSTALL_DIRECTORY"
mkdir -p "$MPFR_ARCHIVE_DIRECTORY"
mkdir -p "$MPFR_SRC_DIRECTORY"
mkdir -p "$MPFR_BUILD_DIRECTORY"
mkdir -p "$MPFR_INSTALL_DIRECTORY"
mkdir -p "$EXPAT_ARCHIVE_DIRECTORY"
mkdir -p "$EXPAT_SRC_DIRECTORY"
mkdir -p "$EXPAT_BUILD_DIRECTORY"
mkdir -p "$EXPAT_INSTALL_DIRECTORY"
mkdir -p "$GDB_ARCHIVE_DIRECTORY"
mkdir -p "$GDB_SRC_DIRECTORY"
mkdir -p "$GDB_BUILD_DIRECTORY"
mkdir -p "$GDB_INSTALL_DIRECTORY"
curl -fSL "$GMP_DOWNLOAD_URL" -o "$GMP_ARCHIVE_PATH"
tar xvf "$GMP_ARCHIVE_PATH" --directory "$GMP_SRC_DIRECTORY"
curl -fSL "$MPFR_DOWNLOAD_URL" -o "$MPFR_ARCHIVE_PATH"
tar xvf "$MPFR_ARCHIVE_PATH" --directory "$MPFR_SRC_DIRECTORY"
curl -fSL "$EXPAT_DOWNLOAD_URL" -o "$EXPAT_ARCHIVE_PATH"
tar xvf "$EXPAT_ARCHIVE_PATH" --directory "$EXPAT_SRC_DIRECTORY"
curl -fSL "$GDB_DOWNLOAD_URL" -o "$GDB_ARCHIVE_PATH"
tar xvf "$GDB_ARCHIVE_PATH" --directory "$GDB_SRC_DIRECTORY"
mkdir -p "$GMP_BUILD_PATH"
cd "$GMP_BUILD_PATH"
"${GMP_SRC_PATH}/configure" \
--prefix="${GMP_INSTALL_PATH}" \
--host=x86_64-w64-mingw32 \
--enable-static \
--disable-shared
make "-j${CPU_CORES}" || make
make install
mkdir -p "$MPFR_BUILD_PATH"
cd "$MPFR_BUILD_PATH"
"${MPFR_SRC_PATH}/configure" \
--prefix="${MPFR_INSTALL_PATH}" \
--host=x86_64-w64-mingw32 \
--with-gmp="$GMP_INSTALL_PATH" \
--enable-static \
--disable-shared
make "-j${CPU_CORES}" || make
make install
mkdir -p "$EXPAT_BUILD_PATH"
cd "$EXPAT_BUILD_PATH"
"${EXPAT_SRC_PATH}/configure" \
--prefix="${EXPAT_INSTALL_PATH}" \
--host=x86_64-w64-mingw32 \
--enable-static \
--disable-shared
make "-j${CPU_CORES}" || make
make install
mkdir -p "$GDB_BUILD_PATH"
cd "$GDB_BUILD_PATH"
"${GDB_SRC_PATH}/configure" \
--prefix="${GDB_INSTALL_PATH}" \
--host=x86_64-w64-mingw32 \
--target=x86_64-w64-mingw32 \
--enable-targets=all \
--with-gmp \
--with-libgmp-prefix="${GMP_INSTALL_PATH}" \
--with-mpfr \
--with-libmpfr-prefix="${MPFR_INSTALL_PATH}" \
--with-expat \
--with-libexpat-prefix="${EXPAT_INSTALL_PATH}" \
--with-static-standard-libraries \
--enable-static \
--disable-shared \
--disable-ld \
--disable-gold \
--disable-sim
make "-j${CPU_CORES}" || make
make install
rm -rf "${DIST_DIRECTORY}"
mkdir "${DIST_DIRECTORY}"
cp "${GDB_INSTALL_PATH}/bin/gdb.exe" "${DIST_DIRECTORY}/gdb-multiarch.exe"
strip -s "${DIST_DIRECTORY}/gdb-multiarch.exe"
mkdir -p "${DIST_DIRECTORY}/licenses/gdb"
cp "/tmp/src/gdb-${GDB_VERSION}/COPYING" "${DIST_DIRECTORY}/licenses/gdb/"
mkdir -p "${DIST_DIRECTORY}/licenses/gmp"
cp "/tmp/src/gmp-${GMP_VERSION}/COPYING" "${DIST_DIRECTORY}/licenses/gmp/"
mkdir -p "${DIST_DIRECTORY}/licenses/bfd"
cp "/tmp/src/gdb-${GDB_VERSION}/bfd/COPYING" "${DIST_DIRECTORY}/licenses/bfd/"
mkdir -p "${DIST_DIRECTORY}/licenses/libiberty"
cp "/tmp/src/gdb-${GDB_VERSION}/libiberty/COPYING.LIB" "${DIST_DIRECTORY}/licenses/libiberty/"
mkdir -p "${DIST_DIRECTORY}/licenses/zlib"
cp "/tmp/src/gdb-${GDB_VERSION}/zlib/README" "${DIST_DIRECTORY}/licenses/zlib/"
mkdir -p "${DIST_DIRECTORY}/licenses/gcc"
curl -fSL 'https://raw.githubusercontent.com/gcc-mirror/gcc/master/COPYING3' -o "${DIST_DIRECTORY}/licenses/gcc/COPYING3"
curl -fSL 'https://raw.githubusercontent.com/gcc-mirror/gcc/master/COPYING.RUNTIME' -o "${DIST_DIRECTORY}/licenses/gcc/COPYING.RUNTIME"
echo 'This directory contains a distribution of The GNU Project Debugger (GDB) in object form.' >> "${DIST_DIRECTORY}/README.txt"
echo 'The binary was cross-compiled for Windows with MinGW-w64, and is statically linked against libgcc and libstdc++.' >> "${DIST_DIRECTORY}/README.txt"
echo 'This distribution of GDB is configured for debugging remote Linux applications from a local Windows system.' >> "${DIST_DIRECTORY}/README.txt"
echo '' >> "${DIST_DIRECTORY}/README.txt"
echo 'The licenses for GDB and its dependencies can be found in the `licenses` subdirectory.' >> "${DIST_DIRECTORY}/README.txt"
echo '' >> "${DIST_DIRECTORY}/README.txt"
echo 'The source code for GDB and its dependencies can be downloaded from the following URLs:' >> "${DIST_DIRECTORY}/README.txt"
echo '' >> "${DIST_DIRECTORY}/README.txt"
echo "- https://ftp.gnu.org/gnu/gdb/gdb-${GDB_VERSION}.tar.gz" >> "${DIST_DIRECTORY}/README.txt"
echo "- https://gmplib.org/download/gmp/gmp-${GMP_VERSION}.tar.xz" >> "${DIST_DIRECTORY}/README.txt"
echo '- https://github.com/gcc-mirror/gcc' >> "${DIST_DIRECTORY}/README.txt"
echo '' >> "${DIST_DIRECTORY}/README.txt"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment