Skip to content

Commit 903922b

Browse files
committed
init
0 parents  commit 903922b

File tree

8 files changed

+187
-0
lines changed

8 files changed

+187
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/.idea
2+
/build

README.md

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# GCC Toolchain
2+
3+
GCC toolchain targeting **older glibc versions**, designed for building Linux binaries that run across a wide range of
4+
distributions. This toolchain is intended for use inside a Docker container running **Ubuntu 24.04 or later**.
5+
6+
## Why?
7+
8+
The usual method for producing portable Linux binaries is to compile them on an outdated distribution (e.g., CentOS 7).
9+
10+
This repository provides a **modern alternative**: a GCC toolchain configured to target an older glibc, ensuring
11+
compatibility and preventing errors like:
12+
13+
```text
14+
/lib64/libc.so.6: version `GLIBC_2.XX' not found
15+
```
16+
17+
## Supported Toolchains
18+
19+
* x86_64-linux-gnu:
20+
21+
| Component | Version |
22+
|:-----------|:---------|
23+
| GCC | 15.2.0 |
24+
| glibc | 2.17 |
25+
| Binutils | 2.45 |
26+
| GDB | 16.3 |
27+
28+
* aarch64-linux-gnu:
29+
30+
| Component | Version |
31+
|:-----------|:---------|
32+
| GCC | 15.2.0 |
33+
| glibc | 2.17 |
34+
| Binutils | 2.29.1 |
35+
| GDB | 16.3 |
36+
37+
## Compilation
38+
39+
* Clone the repository:
40+
41+
```shell
42+
git clone https://github.com/prepkg/gcc-toolchain.git && cd gcc-toolchain
43+
```
44+
45+
* Build the Docker image:
46+
47+
```shell
48+
./setup.sh build-image
49+
```
50+
51+
* Build the GCC toolchain:
52+
53+
```shell
54+
./setup.sh build-toolchain
55+
```
56+
57+
* (Optional) Check the toolchain component versions:
58+
59+
```shell
60+
./setup.sh version
61+
```
62+
63+
After compilation, the toolchains for each architecture will be available in the `build` directory.

config/aarch64-linux-gnu.config

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
CT_CONFIG_VERSION="4"
2+
CT_OBSOLETE=y
3+
CT_EXPERIMENTAL=y
4+
CT_ALLOW_BUILD_AS_ROOT=y
5+
CT_ALLOW_BUILD_AS_ROOT_SURE=y
6+
CT_ARCH_ARM=y
7+
CT_OMIT_TARGET_VENDOR=y
8+
CT_ARCH_64=y
9+
CT_KERNEL_LINUX=y
10+
CT_LINUX_V_3_10=y
11+
CT_BINUTILS_V_2_29=y
12+
CT_GLIBC_V_2_17=y
13+
CT_GCC_V_15=y
14+
CT_CC_GCC_LIBSANITIZER=y
15+
CT_CC_LANG_CXX=y
16+
CT_DEBUG_GDB=y
17+
CT_GLIBC_EXTRA_CFLAGS="-Wno-missing-attributes -Wno-array-bounds -Wno-array-parameter -Wno-stringop-overflow -Wno-maybe-uninitialized -Wno-implicit-int -gdwarf-4"

config/x86_64-linux-gnu.config

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
CT_CONFIG_VERSION="4"
2+
CT_OBSOLETE=y
3+
CT_EXPERIMENTAL=y
4+
CT_ALLOW_BUILD_AS_ROOT=y
5+
CT_ALLOW_BUILD_AS_ROOT_SURE=y
6+
CT_ARCH_X86=y
7+
CT_OMIT_TARGET_VENDOR=y
8+
CT_ARCH_64=y
9+
CT_KERNEL_LINUX=y
10+
CT_LINUX_V_3_10=y
11+
CT_BINUTILS_V_2_45=y
12+
CT_GLIBC_V_2_17=y
13+
CT_GCC_V_15=y
14+
CT_CC_GCC_LIBSANITIZER=y
15+
CT_CC_LANG_CXX=y
16+
CT_DEBUG_GDB=y

scripts/Dockerfile

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
FROM ubuntu:24.04
2+
3+
WORKDIR /app
4+
5+
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \
6+
wget ca-certificates git gcc g++ make automake libtool-bin flex bison texinfo bzip2 xz-utils unzip help2man \
7+
file patch gawk libncurses-dev python3-dev \
8+
&& rm -rf /var/lib/apt/lists/*
9+
10+
ENTRYPOINT ["/bin/bash"]

scripts/compile.sh

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#!/bin/bash
2+
3+
cd /tmp
4+
git clone https://github.com/crosstool-ng/crosstool-ng
5+
cd crosstool-ng
6+
git checkout 7f9d704
7+
8+
./bootstrap
9+
./configure --enable-local
10+
make -j$(nproc)
11+
12+
mkdir -p /app/build
13+
14+
TOOLCHAINS=(
15+
'x86_64-linux-gnu'
16+
'aarch64-linux-gnu'
17+
)
18+
19+
for toolchain in "${TOOLCHAINS[@]}"; do
20+
cd /tmp/crosstool-ng
21+
mkdir samples/$toolchain
22+
cp /app/config/$toolchain.config samples/$toolchain/crosstool.config
23+
./ct-ng $toolchain
24+
25+
CT_PREFIX=/opt ./ct-ng build.$(nproc)
26+
cd /opt && tar czf /app/build/gcc-$toolchain.tar.gz $toolchain
27+
done

scripts/version.sh

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#!/bin/bash
2+
3+
cd build
4+
5+
TOOLCHAINS=(
6+
'x86_64-linux-gnu'
7+
'aarch64-linux-gnu'
8+
)
9+
10+
for toolchain in "${TOOLCHAINS[@]}"; do
11+
tar xf gcc-$toolchain.tar.gz
12+
13+
GCC_VERSION=$($toolchain/bin/$toolchain-gcc -dumpversion)
14+
GLIBC_VERSION=$(strings $toolchain/$toolchain/sysroot/lib/libc.so.6 | grep GLIBC | sed 's/.*GLIBC_\([.0-9]*\).*/\1/g' | sort -Vu | tail -n1)
15+
BINUTILS_VERSION=$($toolchain/bin/$toolchain-ld --version | head -n1 | grep -Po '[0-9.]+$')
16+
GDB_VERSION=$($toolchain/bin/$toolchain-gdb --version | head -n1 | grep -Po '[0-9.]+$')
17+
18+
printf '* %s:\n\n' $toolchain
19+
printf '| %-10s | %-8s |\n' 'Component' 'Version'
20+
printf '|:-----------|:---------|\n'
21+
printf '| %-10s | %-8s |\n' 'GCC' $GCC_VERSION
22+
printf '| %-10s | %-8s |\n' 'glibc' $GLIBC_VERSION
23+
printf '| %-10s | %-8s |\n' 'Binutils' $BINUTILS_VERSION
24+
printf '| %-10s | %-8s |\n\n' 'GDB' $GDB_VERSION
25+
26+
rm -rf $toolchain
27+
done

setup.sh

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#!/bin/bash
2+
3+
if [[ ! $1 =~ ^(build-image|build-toolchain|version)$ ]]; then
4+
echo 'Available arguments: build-image, build-toolchain, version'
5+
exit 1
6+
fi
7+
8+
if [[ $1 == build-image ]]; then
9+
docker build -t gcc-toolchain scripts
10+
11+
exit 0
12+
fi
13+
14+
if [[ $1 == build-toolchain ]]; then
15+
docker run -it --rm -v ./:/app gcc-toolchain scripts/compile.sh
16+
sudo chown -R $USER:$USER build
17+
18+
exit 0
19+
fi
20+
21+
if [[ $1 == version ]]; then
22+
docker run -it --rm -v ./:/app gcc-toolchain scripts/version.sh
23+
24+
exit 0
25+
fi

0 commit comments

Comments
 (0)