Last active
May 12, 2024 22:07
-
-
Save Varriount/7147ec47dccfb6522397d1b6d40d80cf to your computer and use it in GitHub Desktop.
Script to cross-compile GDB for Windows
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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