Compare commits

..

24 Commits

Author SHA1 Message Date
a79d453c78 Refactor build-libraries.sh to streamline OpenSSL configuration
- Removed several disabled options from the OpenSSL build configuration to simplify the setup process.
- Enhanced clarity by reducing the complexity of the configuration flags used during the build.
2026-03-31 10:25:03 +03:00
a1e8038cd9 Refactor env.sh to streamline environment variable exports
- Removed redundant export statements for environment variables in env.sh.
- Clarified default architecture and mode settings for improved readability.
- Enhanced output messages for better user feedback during environment activation.
2026-03-31 09:31:51 +03:00
fdeb97ee3b Update README.md to include bzip2 installation instructions for Ubuntu/WSL
- Added bzip2 to the list of required tools for building.
- Provided a command snippet for installing the necessary packages, enhancing clarity for users setting up the environment.
2026-03-31 08:43:55 +03:00
d16bb178b0 Update README.md to clarify env.sh usage and toolchain modes
- Added detailed instructions for two modes of operation in env.sh: normal mode and full toolchain mode.
- Updated the deactivation command to reflect changes in the toolchain registration process.
- Revised default CFLAGS for host/toolset builds to enhance clarity and consistency.
2026-03-31 08:24:02 +03:00
b4ad220386 Refactor build-toolchain.sh to improve toolchain archiving process
- Created a dedicated directory for the target toolchain within the temporary working directory.
- Copied the environment script to the working directory for inclusion in the archive.
- Updated the tar command to include the target directory and environment script in the final archive, enhancing organization and clarity.
2026-03-30 20:01:11 +03:00
0ef34c8a10 Enhance build-libraries.sh and env.sh for toolchain integration
- Updated build-libraries.sh to consistently use the --toolchain flag for environment registration and unregistration.
- Modified env.sh to clarify usage instructions and enforce the --toolchain option for environment setup, improving user experience and consistency in toolchain management.
2026-03-30 19:20:40 +03:00
bb72c9b049 Update SYSROOT_DIR assignment in build-libraries.sh and remove --disable-tls from build-toolchain.sh configuration
- Changed SYSROOT_DIR to directly reference SYSROOT for clarity.
- Removed --disable-tls option from GCC build configuration to streamline the build process.
2026-03-30 18:30:16 +03:00
f6111b0bb8 Enhance env.sh to improve toolchain registration logic
- Updated usage instructions to clarify default behavior and options.
- Improved path resolution for toolchain installation, checking for both ./bin and ./arm-uclinuxfdpiceabi directories.
- Added automatic registration when no arguments are provided, streamlining the user experience.
2026-03-30 10:01:14 +03:00
13b4127521 Revert: remove -fno-stack-protector from CFLAGS_TARGET
Was not the root cause of the __aeabi_read_tp linker error.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-18 11:48:20 +03:00
39ea36dfc2 Disable stack protector for target CFLAGS
Stack protector on ARM reads the canary via TLS (__aeabi_read_tp), which
is unavailable since the toolchain is built with --disable-tls and uClibc
runs on uClinux without TLS support. This caused linker errors in d3des.c.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-18 11:42:38 +03:00
a0b70bd271 Make --register accept install root instead of bin directory
env.sh now appends /bin internally, so callers pass the install root
(e.g. build/install) consistently, both when using the default path
and when specifying it explicitly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-18 10:10:52 +03:00
3bdde2147b Extract package versions into a single versions.sh file
All hardcoded versions are now defined once in versions.sh and sourced
by build-toolchain.sh, download_prerequisites.sh, and build-libraries.sh,
eliminating the need to update multiple files when changing a version.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-18 10:07:30 +03:00
a2034926f8 Add README with project documentation for ARM uClinux FDPIC cross-compiler toolchain 2026-02-17 08:17:21 +03:00
f51144e388 Add --disable-tls option to GCC build configuration for improved compatibility 2026-02-16 17:21:01 +03:00
b1421bf4ae Refactor env.sh to improve registration and unregistration handling for toolchain environment 2026-02-16 16:07:15 +03:00
8b4a75b42d Update uClibc version to 1.0.55 in build scripts and download prerequisites 2026-02-16 15:42:10 +03:00
c581c66f74 Refactor build scripts to improve directory structure and enhance file handling 2026-02-16 14:46:24 +03:00
a3a929ff40 Fix uClibc version and update build directory structure for improved clarity 2026-02-16 10:27:32 +03:00
a724e6ad7c Fix build directory paths and improve archive extraction error handling 2026-02-16 09:08:07 +03:00
f861c2845f Add 'src' directory to .gitignore 2026-02-16 08:56:55 +03:00
343844e690 Fix file download logic to skip already downloaded files 2026-02-16 08:56:39 +03:00
402393867b Link to zlib on the official website has been corrected. 2025-12-09 10:40:17 +03:00
f92f1b441d Added library loading script 2025-12-09 09:08:44 +03:00
c5878566d2 Added a configuration file for building with the new version of uCLib 2025-12-09 00:42:51 +03:00
8 changed files with 693 additions and 90 deletions

1
.gitignore vendored
View File

@@ -1,4 +1,5 @@
lib
src
build
install
*.tar.xz

141
README.md Normal file
View File

@@ -0,0 +1,141 @@
# Build Toolchain — кросс-компилятор для ARM uClinux FDPIC
Набор скриптов для сборки кросс-компилятора под целевую платформу **ARM uClinux FDPIC (Thumb, ARMv7-m)**.
Целевой триплет: `arm-uclinuxfdpiceabi`
## Состав тулчейна
| Компонент | Версия | Назначение |
|-----------------|----------|-------------------------------------|
| Binutils | 2.42 | Ассемблер, линковщик, утилиты |
| GCC | 13.4.0 | Компилятор C/C++ |
| Linux (headers) | 4.9.224 | Заголовочные файлы ядра |
| uClibc-ng | 1.0.55 | Стандартная библиотека C |
### Дополнительные библиотеки
| Библиотека | Версия | Назначение |
|--------------|--------|---------------------------|
| zlib | 1.2.13 | Сжатие данных |
| OpenSSL | 3.0.13 | Криптография |
| LibVNCServer | 0.9.14 | VNC-сервер |
| FreeType | 2.13.2 | Рендеринг шрифтов |
Все библиотеки собираются статически.
## Характеристики целевой платформы
- **Архитектура:** ARM 32-bit (ARMv7-m)
- **Набор инструкций:** Thumb
- **ABI:** EABI с поддержкой FDPIC
- **Плавающая точка:** программная (soft float)
- **Потоки:** отключены
- **TLS:** отключён
## Зависимости хостовой системы
- bash
- make
- gcc (или другой C-компилятор для хоста)
- cmake
- wget
- bzip2
- tar
- стандартные утилиты (grep, sed и т.д.)
Для Ubuntu/WSL можно установить минимальный набор так:
```bash
sudo apt update
sudo apt install -y make gcc g++ cmake wget bzip2 tar sed grep xz-utils
```
## Использование
### 1. Загрузка исходников
```bash
./download_prerequisites.sh
```
Скрипт загружает архивы исходного кода всех компонентов в каталоги `src/toolchain/` и `src/libs/`. Уже загруженные архивы пропускаются.
### 2. Сборка тулчейна
```bash
./build-toolchain.sh
```
Сборка выполняется поэтапно:
1. Распаковка архивов
2. Сборка Binutils
3. Сборка GCC (этап 1 — минимальный компилятор C без libc)
4. Установка заголовочных файлов ядра Linux
5. Сборка uClibc-ng
6. Сборка GCC (этап 2 — полный компилятор C/C++ с поддержкой FDPIC)
7. Сборка дополнительных библиотек
8. Упаковка результата в архив
На выходе создаётся архив `toolset-jlv-armv7-m-gcc13.4.0-uclibc1.0.55.tar.xz`.
### 3. Настройка окружения
Есть два режима работы `env.sh`.
Обычный режим:
```bash
source ./env.sh
```
Этот режим работает "как раньше":
- добавляет `${PWD}/arm-uclinuxfdpiceabi/bin` в `PATH`
- задаёт `CFLAGS`, `CFLAGS_FOR_TARGET`, `CXXFLAGS_FOR_TARGET`
- задаёт `SUBARCH=armv7-m` и `SUBMODE=thumb`
- не переопределяет `CC`/`CXX`, поэтому не мешает хостовой сборке под WSL
Режим полного toolchain-окружения:
```bash
source ./env.sh --toolchain /путь/к/install [arflags]
```
Этот режим используется сборочными скриптами и дополнительно устанавливает `CC`, `CXX`, `CPP`, `LD`, `AR`, `RANLIB`, `STRIP`, `OBJCOPY`, `OBJDUMP`, `SYSROOT`, `LDFLAGS` и добавляет путь к тулчейну в `PATH`.
Деактивация:
```bash
source ./env.sh --toolchain --unregister
```
## Флаги компиляции
| Переменная | Значение | Назначение |
|------------|----------|------------|
| `CFLAGS` | `-O2` | Флаги хостовой/toolset-сборки по умолчанию |
| `CFLAGS_FOR_TARGET` | `-Os -mthumb` | Оптимизация по размеру, Thumb-инструкции для target |
| `LDFLAGS` | `-Wl,--fdpic` | Линковка с поддержкой FDPIC |
## Структура каталогов
```
build-toolchain/
├── build-toolchain.sh # Основной скрипт сборки
├── build-libraries.sh # Сборка дополнительных библиотек
├── download_prerequisites.sh # Загрузка исходников
├── env.sh # Настройка окружения
├── config/ # Конфигурации uClibc
│ ├── config-uClibc-ng-1.0.34
│ └── config-uClibc-ng-1.0.55
├── src/ # Исходный код (после загрузки)
│ ├── toolchain/ # Архивы компонентов тулчейна
│ └── libs/ # Архивы библиотек
├── build/ # Каталог сборки (создаётся автоматически)
└── install/ # Каталог установки (создаётся автоматически)
```
## Лицензия
Компоненты тулчейна распространяются под собственными лицензиями (GPL, LGPL и др.).

View File

@@ -1,23 +1,29 @@
#!/bin/bash
set -e
source "$(dirname "$0")/versions.sh"
# Подготавливаем переменные
TOP="$(pwd)"
INSTALL_DIR="${TOP}/install"
INSTALL_DIR="${TOP}/build/install"
INSTALL_BIN_DIR="${INSTALL_DIR}/bin"
# Запускаем предварительно для того чтобы подтянуть переменные
. ./env.sh "${INSTALL_BIN_DIR}"
. ./env.sh --toolchain --register "${INSTALL_DIR}"
# Сбрасываем CFLAGS/CXXFLAGS — все флаги уже встроены в CC/CXX
export CFLAGS=""
export CXXFLAGS=""
# Подготавливаем пути к разделам
LIB_DIR="${TOP}/lib"
SYSROOT_DIR="${INSTALL_DIR}${SYSROOT}"
LIB_DIR="${TOP}/src/libs"
SYSROOT_DIR="${SYSROOT}"
SYSROOT_ETC_DIR="${SYSROOT_DIR}/etc"
SYSROOT_USR_DIR="${SYSROOT_DIR}/usr"
BUILD_SRC_DIR="${TOP}/build"
LIB_BUILD_DIR="${BUILD_SRC_DIR}/lib"
LIB_BUILD_DIR="${BUILD_SRC_DIR}/src/libs"
# ==================================================================
# Проверка файла окружения
@@ -72,9 +78,11 @@ echo "== Распаковка завершена =="
# ==================================================================
cd ${TOP}
./env.sh "${INSTALL_BIN_DIR}" "rc"
. ./env.sh --toolchain --register "${INSTALL_DIR}" "rc"
export CFLAGS=""
export CXXFLAGS=""
cd "${LIB_BUILD_DIR}/zlib-1.2.13"
cd "${LIB_BUILD_DIR}/zlib-${ZLIB_VER}"
./configure --prefix=${SYSROOT_USR_DIR} --libdir=${SYSROOT_USR_DIR}/lib --static
make -j$(nproc)
make install
@@ -82,9 +90,11 @@ make install
# ==================================================================
cd ${TOP}
./env.sh "${INSTALL_BIN_DIR}"
. ./env.sh --toolchain --register "${INSTALL_DIR}"
export CFLAGS=""
export CXXFLAGS=""
cd "${LIB_BUILD_DIR}/openssl-3.0.13"
cd "${LIB_BUILD_DIR}/openssl-${OPENSSL_VER}"
./Configure linux-armv4 \
--prefix=${SYSROOT_USR_DIR} \
--libdir=${SYSROOT_USR_DIR}/lib \
@@ -92,7 +102,7 @@ cd "${LIB_BUILD_DIR}/openssl-3.0.13"
enable-legacy no-mdc2 no-rc5 no-ec2m no-sm2 no-sm4 no-ssl3 \
no-shared no-dso no-async no-comp no-idea no-tests no-threads no-asm no-secure-memory no-seed no-weak-ssl-ciphers \
no-afalgeng no-aria no-async no-bf no-blake2 no-camellia no-capieng no-cast no-chacha no-cms no-cmp no-ct \
no-dgram no-dsa no-dtls no-ecdh no-ecdsa no-engine no-err no-filenames no-gost no-md4 \
no-dgram no-dsa no-dtls no-ecdh no-ecdsa no-engine no-err no-filenames no-gost \
no-ocsp no-pinshared no-poly1305 no-posix-io no-rc2 no-rc4 no-rdrand no-rfc3779 no-rmd160 no-scrypt no-sctp no-siphash \
no-sm3 no-srp no-srtp no-ssl-trace no-ssl3 no-ssl3-method no-ts no-whirlpool enable-ktls \
-DNO_FORK -DHAVE_FORK=0
@@ -102,7 +112,7 @@ make install_sw
# ==================================================================
cd "${LIB_BUILD_DIR}/LibVNCServer-0.9.14"
cd "${LIB_BUILD_DIR}/LibVNCServer-${LIBVNCSERVER_VER}"
rm -rf build
mkdir -p build && cd build
cmake -S .. -B . \
@@ -138,7 +148,7 @@ make install
# ==================================================================
cd "${LIB_BUILD_DIR}/freetype-2.13.2"
cd "${LIB_BUILD_DIR}/freetype-${FREETYPE_VER}"
[ -d "build" ] && rm -rf build
mkdir -p build && cd build
cmake -S .. -B . \
@@ -160,3 +170,8 @@ cmake -S .. -B . \
make -j$(nproc)
make install
# ==================================================================
cd ${TOP}
. ./env.sh --toolchain --unregister

View File

@@ -12,10 +12,7 @@ PKG_UCLIBC="uClibc-ng"
# ==================================================================
# Версии пакетов
# ==================================================================
BINUTILS_VER="2.42"
GCC_VER="13.4.0"
LINUX_VER="4.9.224"
UCLIBC_VER="1.0.34"
source "$(dirname "$0")/versions.sh"
# ==================================================================
# Основные параметры тулчейна
@@ -27,10 +24,11 @@ SUBMODE="thumb"
TOP="$(pwd)"
CONFIGS_DIR="${TOP}/config"
SRC_DIR="${TOP}/src/toolchain"
BUILD_DIR="${TOP}/build"
BUILD_SRC_DIR="${BUILD_DIR}/src"
BUILD_SRC_DIR="${BUILD_DIR}/src/toolchain"
INSTALL_DIR="${TOP}/install"
INSTALL_DIR="${BUILD_DIR}/install"
INSTALL_BIN_DIR="${INSTALL_DIR}/bin"
KERNEL_SYSROOT_DIR="${INSTALL_DIR}/sysroot"
@@ -53,24 +51,31 @@ SRC_LINUX="${BUILD_SRC_DIR}/${PKG_LINUX}-${LINUX_VER}"
SRC_UCLIBC="${BUILD_SRC_DIR}/${PKG_UCLIBC}-${UCLIBC_VER}"
# ==================================================================
echo "== Создание директорий =="
echo "== Очистка и создание директорий =="
rm -rf "${BUILD_DIR}"
mkdir -p "${KERNEL_SYSROOT_DIR}" "${BUILD_SRC_DIR}"
echo "== Распаковка архивов в ${BUILD_SRC_DIR} =="
shopt -s nullglob
for f in *.tar.xz; do
[ -f "$f" ] || { echo "Нет архивов *.tar.xz в текущей директории!"; exit 1; }
echo " * $f"
echo "== Распаковка архивов из ${SRC_DIR} в ${BUILD_SRC_DIR} =="
ARCHIVES=(
"${SRC_DIR}/${PKG_BINUTILS}-${BINUTILS_VER}.tar.xz"
"${SRC_DIR}/${PKG_GCC}-${GCC_VER}.tar.xz"
"${SRC_DIR}/${PKG_LINUX}-${LINUX_VER}.tar.xz"
"${SRC_DIR}/${PKG_UCLIBC}-${UCLIBC_VER}.tar.xz"
)
dirname="${f%.tar.xz}"
target_dir="${BUILD_SRC_DIR}/${dirname}"
for f in "${ARCHIVES[@]}"; do
if [ ! -f "$f" ]; then
echo "Ошибка: архив не найден: $f"
exit 1
fi
if [ -d "$target_dir" ]; then
echo " -> Пропуск: директория '${dirname}' уже существует"
dirname="$(basename "${f%.tar.*}")"
if [ -d "${BUILD_SRC_DIR}/${dirname}" ]; then
echo " * Пропуск (уже распакован): ${dirname}"
continue
fi
echo " -> Распаковка в '${BUILD_SRC_DIR}'"
echo " * Распаковка: $(basename "$f")"
tar -xf "$f" -C "${BUILD_SRC_DIR}"
done
@@ -78,16 +83,17 @@ done
# BINUTILS
# ==================================================================
echo "== Сборка binutils-${BINUTILS_VER} =="
rm -rf build/binutils && mkdir -p build/binutils && cd build/binutils
mkdir -p "${BUILD_DIR}/binutils" && cd "${BUILD_DIR}/binutils"
"${SRC_BINUTILS}/configure" \
--target="${TARGET}" \
--prefix="${INSTALL_DIR}" \
--with-sysroot="${KERNEL_SYSROOT_DIR}" \
--disable-nls \
--without-bugurl \
--disable-werror
make -j$(nproc) all
make install
--disable-werror \
MAKEINFO=true
make -j$(nproc) MAKEINFO=true all
make MAKEINFO=true install
cd "${TOP}"
# ==================================================================
@@ -99,7 +105,7 @@ cd "${SRC_GCC}"
./contrib/download_prerequisites
cd "${TOP}"
rm -rf build/gcc1 && mkdir -p build/gcc1 && cd build/gcc1
mkdir -p "${BUILD_DIR}/gcc1" && cd "${BUILD_DIR}/gcc1"
"${SRC_GCC}/configure" \
--target="${TARGET}" \
--prefix="${INSTALL_DIR}" \
@@ -115,6 +121,7 @@ rm -rf build/gcc1 && mkdir -p build/gcc1 && cd build/gcc1
--enable-languages=c \
--disable-libquadmath \
--disable-multilib \
--disable-libitm \
--without-cloog \
--without-ppl \
--disable-nls \
@@ -131,14 +138,14 @@ cd "${TOP}"
# ==================================================================
echo "== Установка заголовков linux-${LINUX_VER} =="
rm -rf build/kernelheader && mkdir -p build/kernelheader
mkdir -p "${BUILD_DIR}/kernelheader"
cd "${SRC_LINUX}"
PATH="${INSTALL_BIN_DIR}:${PATH}" \
make ARCH=arm \
INSTALL_HDR_PATH="${KERNEL_SYSROOT_USR_DIR}" \
CROSS_COMPILE="${TARGET}-" \
O="${TOP}/build/kernelheader" \
O="${BUILD_DIR}/kernelheader" \
headers_install
cd "${TOP}"
@@ -174,7 +181,7 @@ cd "${TOP}"
# GCC FINAL (C + C++)
# ==================================================================
echo "== Сборка финального GCC-${GCC_VER} (C+C++) =="
rm -rf build/gcc2 && mkdir -p build/gcc2 && cd build/gcc2
mkdir -p "${BUILD_DIR}/gcc2" && cd "${BUILD_DIR}/gcc2"
"${SRC_GCC}/configure" \
--target="${TARGET}" \
--prefix="${INSTALL_DIR}" \
@@ -182,9 +189,10 @@ rm -rf build/gcc2 && mkdir -p build/gcc2 && cd build/gcc2
--with-arch="${SUBARCH}" \
--with-mode="${SUBMODE}" \
--enable-languages=c,c++ \
--enable-threads=posix \
--disable-threads \
--enable-fdpic \
--disable-libstdcxx-pch \
--disable-libitm \
--disable-multilib \
--disable-bootstrap \
--disable-libgomp \
@@ -205,14 +213,18 @@ cd "${TOP}"
# ==================================================================
echo "== Strip toolchain и упаковка =="
cd ${TOP}
cd "${TOP}"
WDIR=$(mktemp -d)
trap 'rm -rf "$WDIR"' EXIT
cp -a install/* "$WDIR"/
find "$WDIR" -type f -executable -exec strip -p {} \; 2>/dev/null || true
ARCHIVE_TOOLCHAIN_DIR="${WDIR}/${TARGET}"
mkdir -p "${ARCHIVE_TOOLCHAIN_DIR}"
cp -a "${INSTALL_DIR}"/* "${ARCHIVE_TOOLCHAIN_DIR}/"
cp -a "${TOP}/env.sh" "${WDIR}/env.sh"
tar -C "$WDIR" --owner=0 --group=0 -cJf "toolset-jlv-${SUBARCH}-gcc${GCC_VER}-uclibc${UCLIBC_VER}.tar.xz" .
find "${ARCHIVE_TOOLCHAIN_DIR}" -type f -executable -exec strip -p {} \; 2>/dev/null || true
tar -C "$WDIR" --owner=0 --group=0 -cJf "toolset-jlv-${SUBARCH}-gcc${GCC_VER}-uclibc${UCLIBC_VER}.tar.xz" "${TARGET}" "env.sh"
echo "Готово: toolset-jlv-${SUBARCH}-gcc${GCC_VER}-uclibc${UCLIBC_VER}.tar.xz"
# ==================================================================
@@ -220,11 +232,11 @@ echo "Готово: toolset-jlv-${SUBARCH}-gcc${GCC_VER}-uclibc${UCLIBC_VER}.tar
# ==================================================================
echo
echo "=== Управление архивами и очистка ==="
read -p "Удалить исходники (*.tar.xz)? (y/N): " -n 1 -r REPLY; echo
[[ $REPLY =~ ^[Yy]$ ]] && rm -f *.tar.xz && echo "Исходные архивы удалены."
read -p "Удалить исходники (src/)? (y/N): " -n 1 -r REPLY; echo
[[ $REPLY =~ ^[Yy]$ ]] && rm -rf "${SRC_DIR}" && echo "Директория исходников удалена."
read -p "Удалить директории сборки (build/, install/)? (y/N): " -n 1 -r REPLY; echo
[[ $REPLY =~ ^[Yy]$ ]] && rm -rf build install && echo "Директории сборки удалены."
read -p "Удалить директорию сборки (build/)? (y/N): " -n 1 -r REPLY; echo
[[ $REPLY =~ ^[Yy]$ ]] && rm -rf "${BUILD_DIR}" && echo "Директория сборки удалена."
echo
echo "== Сборка полностью завершена! =="

View File

@@ -0,0 +1,262 @@
#
# Automatically generated file; DO NOT EDIT.
# uClibc-ng 1.0.55 C Library Configuration
#
# TARGET_aarch64 is not set
# TARGET_alpha is not set
# TARGET_arc is not set
TARGET_arm=y
# TARGET_avr32 is not set
# TARGET_bfin is not set
# TARGET_c6x is not set
# TARGET_cris is not set
# TARGET_csky is not set
# TARGET_frv is not set
# TARGET_h8300 is not set
# TARGET_hppa is not set
# TARGET_i386 is not set
# TARGET_ia64 is not set
# TARGET_kvx is not set
# TARGET_lm32 is not set
# TARGET_m68k is not set
# TARGET_metag is not set
# TARGET_microblaze is not set
# TARGET_mips is not set
# TARGET_nds32 is not set
# TARGET_nios2 is not set
# TARGET_or1k is not set
# TARGET_powerpc is not set
# TARGET_riscv64 is not set
# TARGET_riscv32 is not set
# TARGET_sh is not set
# TARGET_sparc is not set
# TARGET_sparc64 is not set
# TARGET_tile is not set
# TARGET_x86_64 is not set
# TARGET_xtensa is not set
TARGET_LDSO_NAME="ld-uClibc"
TARGET_ARCH_BITS=32
#
# Target Architecture Features and Options
#
TARGET_ARCH="arm"
FORCE_OPTIONS_FOR_ARCH=y
CONFIG_ARM_EABI=y
TARGET_SUBARCH=""
# UCLIBC_FORMAT_ELF is not set
UCLIBC_FORMAT_FDPIC_ELF=y
# UCLIBC_FORMAT_FLAT is not set
# UCLIBC_FORMAT_FLAT_SEP_DATA is not set
ARCH_HAS_DEPRECATED_SYSCALLS=y
ARCH_ANY_ENDIAN=y
ARCH_LITTLE_ENDIAN=y
# ARCH_WANTS_BIG_ENDIAN is not set
ARCH_WANTS_LITTLE_ENDIAN=y
ARCH_HAS_MMU=y
# ARCH_USE_MMU is not set
UCLIBC_HAS_FLOATS=y
# UCLIBC_HAS_FPU is not set
UCLIBC_HAS_SOFT_FLOAT=y
DO_C99_MATH=y
DO_XSI_MATH=y
# UCLIBC_HAS_FENV is not set
UCLIBC_HAS_LONG_DOUBLE_MATH=y
KERNEL_HEADERS="/home/stargazer/build-toolchain/install/sysroot/usr/include"
UCLIBC_UCLINUX_BROKEN_MUNMAP=y
HAVE_DOT_CONFIG=y
#
# General Library Settings
#
DOPIC=y
ARCH_HAS_UCONTEXT=y
HAVE_LDSO=y
HAVE_SHARED=y
FORCE_SHAREABLE_TEXT_SEGMENTS=y
LDSO_LDD_SUPPORT=y
LDSO_CACHE_SUPPORT=y
LDSO_PRELOAD_ENV_SUPPORT=y
# LDSO_PRELOAD_FILE_SUPPORT is not set
LDSO_BASE_FILENAME="ld.so"
# LDSO_STANDALONE_SUPPORT is not set
# LDSO_PRELINK_SUPPORT is not set
ARCH_VDSO_SUPPORT=y
# VDSO_SUPPORT is not set
UCLIBC_STATIC_LDCONFIG=y
LDSO_RUNPATH=y
# LDSO_RUNPATH_OF_EXECUTABLE is not set
LDSO_SAFE_RUNPATH=y
LDSO_SEARCH_INTERP_PATH=y
LDSO_LD_LIBRARY_PATH=y
UCLIBC_CTOR_DTOR=y
# LDSO_GNU_HASH_SUPPORT is not set
# HAS_NO_THREADS is not set
# UCLIBC_HAS_LINUXTHREADS is not set
# UCLIBC_HAS_THREADS_NATIVE is not set
# UCLIBC_HAS_THREADS is not set
HAS_NO_THREADS=y
UCLIBC_HAS_TLS=n
PTHREADS_DEBUG_SUPPORT=n
PTHREADS_STACK_DEFAULT_SIZE=16384
UCLIBC_HAS_SYSLOG=y
UCLIBC_HAS_LFS=y
MALLOC=y
# MALLOC_SIMPLE is not set
UCLIBC_DYNAMIC_ATEXIT=y
UCLIBC_HAS_UTMPX=y
# UCLIBC_HAS_UTMP is not set
# UCLIBC_SUSV2_LEGACY is not set
UCLIBC_SUSV3_LEGACY=y
# UCLIBC_HAS_CONTEXT_FUNCS is not set
UCLIBC_SUSV3_LEGACY_MACROS=y
UCLIBC_SUSV4_LEGACY=y
# UCLIBC_STRICT_HEADERS is not set
# UCLIBC_HAS_STUBS is not set
UCLIBC_HAS_SHADOW=y
UCLIBC_HAS_PROGRAM_INVOCATION_NAME=y
UCLIBC_HAS___PROGNAME=y
UCLIBC_HAS_PTY=y
ASSUME_DEVPTS=y
UNIX98PTY_ONLY=y
UCLIBC_HAS_GETPT=y
UCLIBC_HAS_LIBUTIL=y
UCLIBC_HAS_TM_EXTENSIONS=y
UCLIBC_HAS_TZ_CACHING=y
UCLIBC_HAS_TZ_FILE=y
UCLIBC_HAS_TZ_FILE_READ_MANY=y
UCLIBC_TZ_FILE_PATH="/etc/TZ"
UCLIBC_FALLBACK_TO_ETC_LOCALTIME=y
# UCLIBC_USE_TIME64 is not set
#
# Advanced Library Settings
#
UCLIBC_PWD_BUFFER_SIZE=256
UCLIBC_GRP_BUFFER_SIZE=256
#
# Support various families of functions
#
UCLIBC_LINUX_SPECIFIC=y
UCLIBC_HAS_GNU_ERROR=y
UCLIBC_BSD_SPECIFIC=y
UCLIBC_HAS_BSD_ERR=y
UCLIBC_HAS_OBSOLETE_BSD_SIGNAL=y
# UCLIBC_HAS_BSD_B64_NTOP_B64_PTON is not set
# UCLIBC_HAS_OBSOLETE_SYSV_SIGNAL is not set
# UCLIBC_NTP_LEGACY is not set
# UCLIBC_SV4_DEPRECATED is not set
UCLIBC_HAS_REALTIME=y
UCLIBC_HAS_ADVANCED_REALTIME=y
UCLIBC_HAS_EPOLL=y
UCLIBC_HAS_XATTR=y
UCLIBC_HAS_PROFILING=y
UCLIBC_HAS_CRYPT_IMPL=y
# UCLIBC_HAS_SHA256_CRYPT_IMPL is not set
# UCLIBC_HAS_SHA512_CRYPT_IMPL is not set
UCLIBC_HAS_CRYPT=y
UCLIBC_HAS_NETWORK_SUPPORT=y
UCLIBC_HAS_SOCKET=y
UCLIBC_HAS_IPV4=y
# UCLIBC_HAS_IPV6 is not set
# UCLIBC_USE_NETLINK is not set
# UCLIBC_HAS_BSD_RES_CLOSE is not set
UCLIBC_HAS_COMPAT_RES_STATE=y
# UCLIBC_HAS_EXTRA_COMPAT_RES_STATE is not set
UCLIBC_HAS_RESOLVER_SUPPORT=y
# UCLIBC_DNSRAND_MODE_URANDOM is not set
# UCLIBC_DNSRAND_MODE_CLOCK is not set
UCLIBC_DNSRAND_MODE_PRNGPLUS=y
# UCLIBC_DNSRAND_MODE_SIMPLECOUNTER is not set
#
# String and Stdio Support
#
UCLIBC_HAS_STRING_GENERIC_OPT=y
UCLIBC_HAS_STRING_ARCH_OPT=y
UCLIBC_HAS_STDIO_FUTEXES=y
UCLIBC_HAS_CTYPE_TABLES=y
UCLIBC_HAS_CTYPE_SIGNED=y
UCLIBC_HAS_CTYPE_UNSAFE=y
# UCLIBC_HAS_CTYPE_CHECKED is not set
# UCLIBC_HAS_CTYPE_ENFORCED is not set
UCLIBC_HAS_WCHAR=y
# UCLIBC_HAS_LIBICONV is not set
# UCLIBC_HAS_LIBINTL is not set
# UCLIBC_HAS_LOCALE is not set
# UCLIBC_HAS_HEXADECIMAL_FLOATS is not set
UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y
UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9
# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set
# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set
# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set
# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set
UCLIBC_HAS_STDIO_BUFSIZ_4096=y
# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set
UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y
# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set
# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set
# UCLIBC_HAS_STDIO_SHUTDOWN_ON_ABORT is not set
UCLIBC_HAS_STDIO_GETC_MACRO=y
UCLIBC_HAS_STDIO_PUTC_MACRO=y
UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y
# UCLIBC_HAS_FOPEN_LARGEFILE_MODE is not set
# UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE is not set
# UCLIBC_HAS_FOPEN_CLOSEEXEC_MODE is not set
# UCLIBC_HAS_GLIBC_CUSTOM_STREAMS is not set
UCLIBC_HAS_PRINTF_M_SPEC=y
UCLIBC_HAS_ERRNO_MESSAGES=y
# UCLIBC_HAS_SYS_ERRLIST is not set
UCLIBC_HAS_SIGNUM_MESSAGES=y
# UCLIBC_HAS_SYS_SIGLIST is not set
UCLIBC_HAS_GNU_GETOPT=y
UCLIBC_HAS_GETOPT_LONG=y
UCLIBC_HAS_GNU_GETSUBOPT=y
# UCLIBC_HAS_ARGP is not set
#
# Big and Tall
#
UCLIBC_HAS_REGEX=y
UCLIBC_HAS_FNMATCH=y
# UCLIBC_HAS_WORDEXP is not set
UCLIBC_HAS_NFTW=y
UCLIBC_HAS_FTW=y
UCLIBC_HAS_FTS=y
UCLIBC_HAS_GLOB=y
UCLIBC_HAS_GNU_GLOB=y
#
# Library Installation Options
#
RUNTIME_PREFIX="/"
DEVEL_PREFIX="/usr"
MULTILIB_DIR="lib"
HARDWIRED_ABSPATH=y
#
# Security options
#
# UCLIBC_BUILD_PIE is not set
UCLIBC_HAS_SSP=y
# SSP_QUICK_CANARY is not set
UCLIBC_BUILD_SSP=y
# UCLIBC_BUILD_RELRO is not set
UCLIBC_BUILD_NOW=y
UCLIBC_BUILD_NOEXECSTACK=y
#
# Development/debugging options
#
CROSS_COMPILER_PREFIX="arm-uclinuxfdpiceabi-"
UCLIBC_EXTRA_CFLAGS="-fomit-frame-pointer -funwind-tables -fasynchronous-unwind-tables"
# DODEBUG is not set
DOSTRIP=y
DOASSERTS=y
SUPPORT_LD_DEBUG=y
# SUPPORT_LD_DEBUG_EARLY is not set
# UCLIBC_MALLOC_DEBUGGING is not set
# UCLIBC_HAS_BACKTRACE is not set
WARNINGS="-Wall"
EXTRA_WARNINGS=y

65
download_prerequisites.sh Executable file
View File

@@ -0,0 +1,65 @@
#!/bin/bash
source "$(dirname "$0")/versions.sh"
# Создаем папки для исходников
mkdir -p src/toolchain src/libs
# Функция загрузки файлов в указанную папку
download_files() {
local target_dir="$1"
shift
local urls=("$@")
cd "$target_dir" || exit 1
for url in "${urls[@]}"; do
filename=$(basename "$url")
if [ -f "$filename" ]; then
echo "⊘ Пропускаю (уже загружен): $filename"
continue
fi
echo "Загружаю: $filename"
wget -q --show-progress "$url"
if [ $? -eq 0 ]; then
echo "✓ Успешно: $filename"
else
echo "✗ Ошибка при загрузке: $filename"
fi
done
cd - > /dev/null
}
# Исходники тулчейна
toolchain_files=(
"https://ftp.gnu.org/gnu/binutils/binutils-${BINUTILS_VER}.tar.xz"
"https://ftp.gnu.org/gnu/gcc/gcc-${GCC_VER}/gcc-${GCC_VER}.tar.xz"
"https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-${LINUX_VER}.tar.xz"
"https://downloads.uclibc-ng.org/releases/${UCLIBC_VER}/uClibc-ng-${UCLIBC_VER}.tar.xz"
)
# Исходники библиотек
libs_files=(
"https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VER}.tar.gz"
"https://github.com/LibVNC/libvncserver/archive/LibVNCServer-${LIBVNCSERVER_VER}.tar.gz"
"https://www.openssl.org/source/openssl-${OPENSSL_VER}.tar.gz"
"https://zlib.net/fossils/zlib-${ZLIB_VER}.tar.gz"
)
echo "=== Загрузка исходников тулчейна в 'src/toolchain' ==="
download_files src/toolchain "${toolchain_files[@]}"
echo ""
echo "=== Загрузка исходников библиотек в 'src/libs' ==="
download_files src/libs "${libs_files[@]}"
echo ""
echo "Загрузка завершена!"
echo ""
echo "Тулчейн (src/toolchain):"
ls -la src/toolchain/*.tar.* 2>/dev/null
echo ""
echo "Библиотеки (src/libs):"
ls -la src/libs/*.tar.* 2>/dev/null

118
env.sh
View File

@@ -1,20 +1,44 @@
#!/bin/bash
# env.sh — окружение для сборки под arm-uclinuxfdpiceabi (FDPIC, thumb)
#
# Использование:
# . ./env.sh --toolchain --register /path/to/install [arflags]
# . ./env.sh --toolchain --unregister
_env_usage() {
echo "Использование:"
echo " . ./env.sh"
echo " . ./env.sh --toolchain --register /path/to/install [arflags]"
echo " . ./env.sh --toolchain --unregister"
}
_env_register() {
local install_root="${1:-}"
local arflags_target="${2:-}"
# Если путь не указан — пробуем найти локальную папку тулчейна
if [ -z "$install_root" ]; then
local default_path="$(pwd)/arm-uclinuxfdpiceabi"
if [ -d "$default_path" ]; then
install_root="$default_path"
echo "Путь не указан, используется: ${default_path}"
else
echo "Ошибка: не указан путь к тулчейну и папка arm-uclinuxfdpiceabi не найдена"
_env_usage
return 1
fi
fi
TOP="$(pwd)"
TARGET=arm-uclinuxfdpiceabi
TOOLCHAIN=arm-uclinuxfdpiceabi
TOOLCHAIN_PATH="${install_root}/bin"
# Если передали путь — используем его, иначе берём bin в текущей папке
# Пример вызова: ./env.sh /opt/toolchains/arm/bin
TOOLCHAIN_PATH="${1:-${TOP}/${TARGET}/bin}"
SYSROOT="${TOOLCHAIN_ROOT}/sysroot"
SYSROOT="${install_root}/sysroot"
PREFIX="${SYSROOT}/usr"
# Флаги тулчейна
CFLAGS_TOOLSET='-O2'
ARFLAGS_TARGET="${2:-}"
CFLAGS_TARGET='-Os -mthumb'
CXXFLAGS_TARGET=$CFLAGS_TARGET
LDFLAGS_TARGET='-Wl,--fdpic'
@@ -24,7 +48,8 @@ CC="${TOOLCHAIN_PATH}/${TOOLCHAIN}-gcc ${CFLAGS_TOOLSET} ${CFLAGS_TARGET}"
CXX="${TOOLCHAIN_PATH}/${TOOLCHAIN}-g++ ${CFLAGS_TOOLSET} ${CXXFLAGS_TARGET}"
CPP="${TOOLCHAIN_PATH}/${TOOLCHAIN}-cpp"
LD="${TOOLCHAIN_PATH}/${TOOLCHAIN}-ld"
AR="${TOOLCHAIN_PATH}/${TOOLCHAIN}-ar ${ARFLAGS_TARGET}"
AR="${TOOLCHAIN_PATH}/${TOOLCHAIN}-ar"
ARFLAGS="${arflags_target}"
AS="${TOOLCHAIN_PATH}/${TOOLCHAIN}-as"
NM="${TOOLCHAIN_PATH}/${TOOLCHAIN}-nm"
RANLIB="${TOOLCHAIN_PATH}/${TOOLCHAIN}-ranlib"
@@ -32,15 +57,17 @@ STRIP="${TOOLCHAIN_PATH}/${TOOLCHAIN}-strip"
OBJCOPY="${TOOLCHAIN_PATH}/${TOOLCHAIN}-objcopy"
OBJDUMP="${TOOLCHAIN_PATH}/${TOOLCHAIN}-objdump"
# Сохраняем оригинальный PATH (только при первой регистрации)
if [ -z "${_ENV_ORIG_PATH:-}" ]; then
_ENV_ORIG_PATH="$PATH"
fi
# PATH — toolchain/bin должен быть в начале
PATH="${TOOLCHAIN_PATH}:${PATH}"
PATH="${TOOLCHAIN_PATH}:${_ENV_ORIG_PATH}"
# Экспорт
export SYSROOT
export PREFIX
export TARGET
export TOOLCHAIN
export CC CXX CPP LD AR AS NM RANLIB STRIP OBJCOPY OBJDUMP
export SYSROOT PREFIX TARGET TOOLCHAIN
export CC CXX CPP LD AR ARFLAGS AS NM RANLIB STRIP OBJCOPY OBJDUMP
export CFLAGS CXXFLAGS LDFLAGS
export CFLAGS_FOR_TARGET CXXFLAGS_FOR_TARGET LDFLAGS_FOR_TARGET
export PATH
@@ -51,3 +78,68 @@ echo "Окружение для ${TARGET} (Thumb/FDPIC) активировано
echo " TOOLCHAIN_PATH = $TOOLCHAIN_PATH"
echo " CC = $CC"
echo " CXX = $CXX"
}
_env_unregister() {
# Восстанавливаем PATH
if [ -n "${_ENV_ORIG_PATH:-}" ]; then
PATH="$_ENV_ORIG_PATH"
export PATH
unset _ENV_ORIG_PATH
fi
# Снимаем все экспортированные переменные
unset SYSROOT PREFIX TARGET TOOLCHAIN
unset CC CXX CPP LD AR ARFLAGS AS NM RANLIB STRIP OBJCOPY OBJDUMP
unset CFLAGS CXXFLAGS LDFLAGS
unset CFLAGS_FOR_TARGET CXXFLAGS_FOR_TARGET LDFLAGS_FOR_TARGET
unset SUBARCH SUBMODE
unset TOOLCHAIN_PATH CFLAGS_TOOLSET CFLAGS_TARGET CXXFLAGS_TARGET LDFLAGS_TARGET
echo "Окружение деактивировано, PATH восстановлен"
}
if [ $# -eq 0 ]; then
TOP="$(pwd)"
TARGET="arm-uclinuxfdpiceabi"
TOOLCHAIN="${TARGET}"
TOOLCHAIN_PATH="${TOP}/${TARGET}/bin"
CFLAGS_TOOLSET='-O2'
CFLAGS_TARGET='-Os -mthumb'
if [ -z "${_ENV_ORIG_PATH:-}" ]; then
_ENV_ORIG_PATH="$PATH"
fi
CFLAGS="${CFLAGS_TOOLSET}"
CFLAGS_FOR_TARGET="${CFLAGS_TARGET}"
CXXFLAGS_FOR_TARGET="${CFLAGS_TARGET}"
PATH="${TOOLCHAIN_PATH}:${_ENV_ORIG_PATH}"
SUBARCH=armv7-m
SUBMODE=thumb
echo "Окружение по умолчанию активировано"
echo " TOP = $TOP"
echo " TARGET = $TARGET"
return 0 2>/dev/null || exit 0
fi
if [ "${1:-}" != "--toolchain" ]; then
_env_usage
return 1 2>/dev/null || exit 1
fi
shift
case "${1:-}" in
--register)
shift
_env_register "$@"
;;
--unregister)
_env_unregister
;;
*)
_env_usage
;;
esac

15
versions.sh Normal file
View File

@@ -0,0 +1,15 @@
# ==================================================================
# Версии компонентов тулчейна
# ==================================================================
BINUTILS_VER="2.42"
GCC_VER="13.4.0"
LINUX_VER="4.9.224"
UCLIBC_VER="1.0.34"
# ==================================================================
# Версии библиотек
# ==================================================================
ZLIB_VER="1.2.13"
OPENSSL_VER="3.0.13"
LIBVNCSERVER_VER="0.9.14"
FREETYPE_VER="2.13.2"