63 Commits
2.0 ... master

Author SHA1 Message Date
b951abd511 Update Discord invitation link 2024-06-15 22:35:59 +02:00
2171eaeed6 Fix incompatible pointer type error 2024-06-07 08:28:40 +02:00
7075a9ad58 Update LLVM to 18.1.7 2024-06-07 08:10:31 +02:00
9025a85bcc Update software and get rid of binutils 2024-05-15 21:14:53 +02:00
3342b87fd0 Update LLVM to 18.1.4 2024-04-21 09:38:29 +02:00
cd4b20b701 Update LLVM to 18.1.2 2024-03-23 12:16:49 +01:00
fc120f4f33 Update LLVM to 18.1.1 2024-03-17 12:20:12 +01:00
b8d5a76ee7 Update LLVM to 18.1.0 2024-03-06 19:42:22 +01:00
009d4a3421 Update PE file subsystem together with signature 2024-01-18 14:35:55 +01:00
460d5820da Minimize exetool's output 2023-11-28 15:21:17 +01:00
83e84c3ebf Update LLVM to 17.0.6 2023-11-28 14:51:07 +01:00
eeb1953d87 Improve performance with Git shallow clone and add .gitignore
Reviewed-on: xt-sys/xtchain#5
Reviewed-by: Rafal Kupiec <belliash@noreply.codingworkshop.git>
Co-authored-by: Pedro Valadés <perikiyoxd@gmail.com>
Co-committed-by: Pedro Valadés <perikiyoxd@gmail.com>
2023-11-23 23:13:06 +01:00
e9707563d7 Update LLVM to 17.0.5 2023-11-14 12:24:00 +01:00
11d0593c9e Add 'help' and 'xbuild' commands; fix 'version' command overriding build settings 2023-11-08 19:41:22 +01:00
22a5abd279 Update release badge color 2023-11-07 15:09:38 +01:00
8c047d6083 Add releases link to readme 2023-11-07 15:07:04 +01:00
1832a39ed3 Update LLVM to 17.0.4 2023-10-31 19:08:00 +01:00
2a00526666 Update LLVM to 17.0.3 2023-10-17 23:36:43 +02:00
1f72016fc2 Print original/new subsystem names and turn new subsystem name case insensitive 2023-10-17 22:12:46 +02:00
a522cdc583 Massive toolchain update 2023-10-04 16:05:03 +02:00
37230435aa Add bin2c utility 2023-09-28 22:47:04 +02:00
737dda2960 Update LLVM to 17.0.1 2023-09-21 15:09:24 +02:00
0d468bf245 Cleanup after NASM removal 2023-07-28 23:07:02 +02:00
b0baae79ba Update badge and URL for CI/CD 2023-07-18 14:55:02 +02:00
ecd243ed0d Better way to check if building from tag 2023-07-15 09:00:33 +02:00
b9d0458a65 Migrate to Gitea Actions 2023-07-13 23:16:29 +02:00
7fb2227034 Update LLVM to 16.0.6 2023-06-21 21:33:02 +02:00
0e49773bf4 Upgrade LLVM to 16.0.5 2023-06-03 09:47:03 +02:00
5684623164 Upgrade LLVM and rewrite exetool in C 2023-05-17 15:17:58 +02:00
14f2f7cf1f Update used software list 2023-03-29 22:43:20 +02:00
37e38daf36 Update versioning strategy 2023-03-29 22:42:25 +02:00
b65a92d147 Add accidentally removed ninja_build() function 2023-03-28 21:57:18 +02:00
173b6d6dd0 Enable control flow guard and fix LLVM compilation 2023-03-28 07:09:15 +02:00
2da20a4eba Use ninja as build system; reconfigure LLVM and enable LLDB 2023-03-26 17:45:22 +02:00
c9ef8a6484 Get rid of NASM 2023-03-26 13:19:09 +02:00
be63d61cf4 Unify README look'n'feel 2023-03-26 12:42:28 +02:00
9fd40e9617 Import missing binutils patches 2023-03-26 09:40:15 +02:00
116d309962 Update LLVM and add GAS from binutils 2023-03-25 22:59:27 +01:00
6845594e6a Update LLVM to 15.0.7 2023-02-19 16:26:26 +01:00
69ae9afb88 Correct URL 2023-01-07 10:19:56 +01:00
3ae3ceaabb Add shields 2023-01-07 10:19:00 +01:00
361c0a1cdb Add exetool for modifying PE/COFF image subsystem 2023-01-06 16:23:54 +01:00
d6531be5ee Update LLVM 2022-12-17 12:10:08 +01:00
771d3783fa Update LLVM 2022-11-08 23:32:18 +01:00
2e7c7ec1d7 Update LLVM to 15.0.2 2022-10-05 08:25:06 +02:00
99f0b83ac7 Add missing cmake patch 2022-10-02 14:29:45 +02:00
9cc7d052dd Update cmake, llvm and mingw 2022-09-28 18:09:27 +02:00
abefcf8fe2 Remove old LLVM patch 2022-09-28 15:51:43 +02:00
015bc8a666 Install llvm-lib, a lib.exe compatible tool 2022-08-09 18:43:15 +02:00
546d8718d2 Reimplement new pipeline and allow limiting number of cores used fo build
Co-authored-by: belliash <belliash@codingworkshop.eu.org>
Reviewed-on: xt-sys/xtchain#3
Reviewed-by: Piotr Likoski <likoski@noreply.codingworkshop.git>
2022-07-25 15:21:17 +02:00
a65685de5c Rewrite pipeline 2022-07-22 22:50:10 +02:00
f9af39e058 Allow xtchain to be launched by root 2022-07-22 22:48:22 +02:00
9b7d73e0e9 Update LLVM 2022-06-29 09:46:44 +02:00
8eb76f6b90 Update LLVM to 14.0.5 2022-06-17 13:40:22 +02:00
00c659911d Make XTchain great again 2022-05-29 15:05:09 +02:00
b1de0a02b6 Update Mingw64 to v10.0.0 2022-05-28 14:24:41 +02:00
36df8e42e6 Update LLVM to 14.0.4 2022-05-28 12:37:01 +02:00
7d802e0835 Merge branch 'llvm_toolchain' into master 2022-05-28 12:35:49 +02:00
1904f94583 Update cmake, ninja & wine packages 2022-05-28 12:09:43 +02:00
3096bf9255 Return 0 when printing help or version in the windres tool. 2021-02-02 18:20:19 +01:00
fdd5e32ea0 Update readme. 2021-02-02 18:17:12 +01:00
3a35c39c8e Update readme. 2021-02-02 18:14:50 +01:00
51284f1845 Import readme and license. 2020-08-17 07:59:45 +02:00
14 changed files with 418 additions and 3320 deletions

View File

@@ -1,8 +0,0 @@
kind: pipeline
type: exec
name: XT Toolchain Pipeline
steps:
- name: Compile XT Toolchain
commands:
- sh build-linux.sh

20
.github/workflows/build.yml vendored Normal file
View File

@@ -0,0 +1,20 @@
name: Builds
run-name: ${{ github.actor }} runs Gitea Actions
on: [push]
jobs:
XTChain:
runs-on: oscw
container:
image: codingworkshop/oscw-runner:latest
steps:
- name: Clone repository
uses: actions/checkout@v3
- name: Build XTChain
run: CORES=10 ./build-linux.sh
- name: Publish binaries
if: startsWith(github.ref, 'refs/tags/')
env:
OSCW_GITHUB_USERNAME: ${{ secrets.OSCW_GITHUB_USERNAME }}
OSCW_GITHUB_PASSWORD: ${{ secrets.OSCW_GITHUB_PASSWORD }}
run: github_publish $OSCW_GITHUB_USERNAME $OSCW_GITHUB_PASSWORD $(ls xtchain-*-linux.tar.zst)

3
.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
binaries/*
sources/*
xtchain-*.zst

View File

@@ -1,7 +1,30 @@
<p align=center>
<a href="https://git.codingworkshop.eu.org/xt-sys/xtchain">
<img alt="GIT Repository" src="https://img.shields.io/badge/Source-GIT-purple">
</a>
<a href="https://git.codingworkshop.eu.org/xt-sys/xtchain/actions">
<img alt="Build Status" src="https://codingworkshop.eu.org/actions.php?project=xt-sys/xtchain">
</a>
<a href="https://github.com/xt-sys/xtchain/releases">
<img alt="Releases" src="https://img.shields.io/github/v/release/xt-sys/xtchain?label=Release&amp;color=blueviolet">
</a>
<a href="https://git.codingworkshop.eu.org/xt-sys/xtchain/src/branch/master/COPYING.md">
<img alt="License" src="https://img.shields.io/badge/License-GPLv3-blue.svg">
</a>
<a href="https://github.com/sponsors/xt-sys/">
<img alt="Sponsors" src="https://img.shields.io/badge/Sponsor-%E2%9D%A4-red?logo=GitHub">
</a>
<a href="https://discord.com/invite/zBzJ5qMGX7">
<img alt="Discord" src="https://img.shields.io/badge/Chat-Join%20Discord-success">
</a>
</p>
---
## XT Toolchain ## XT Toolchain
This is a LLVM/Clang/LLD based mingw-w64 toolchain. It currently supports C and C++, and provides This is a LLVM/Clang/LLD based mingw-w64 toolchain. It currently supports C and C++, and provides
a variety of tools including IDL, message and resource compilers. The XT Toolchain is also the a variety of tools including IDL, message and resource compilers. The XT Toolchain is also the
official build environment for compiling XT software, including the FerretOS. Currently, it is official build environment for compiling XT software, including the XT OS. Currently, it is
targeted at Linux host only, however it should be possible to build it in MSYS2 as well. targeted at Linux host only, however it should be possible to build it in MSYS2 as well.
Benefits of a LLVM based MinGW toolchain are: Benefits of a LLVM based MinGW toolchain are:
@@ -11,10 +34,10 @@ Benefits of a LLVM based MinGW toolchain are:
This software includes: This software includes:
* CMake * CMake
* GNU Assembler
* LLVM * LLVM
* Make * Make
* Mingw-w64 * Mingw-w64
* NASM
* Ninja * Ninja
* Wine * Wine

View File

@@ -18,39 +18,34 @@ GENERIC="generic-w64-mingw32"
# CMake Settings # CMake Settings
CMAKEDIR="${SRCDIR}/cmake" CMAKEDIR="${SRCDIR}/cmake"
CMAKETAG="v3.19.2" CMAKETAG="v3.29.3"
CMAKEVCS="https://gitlab.kitware.com/cmake/cmake.git" CMAKEVCS="https://gitlab.kitware.com/cmake/cmake.git"
# LLVM Settings # LLVM Settings
LLVMDIR="${SRCDIR}/llvm" LLVMDIR="${SRCDIR}/llvm"
LLVMTAG="llvmorg-11.0.0" LLVMTAG="llvmorg-18.1.7"
LLVMVCS="https://github.com/llvm/llvm-project.git" LLVMVCS="https://github.com/llvm/llvm-project.git"
# Make Settings # Make Settings
MAKEDIR="${SRCDIR}/make" MAKEDIR="${SRCDIR}/make"
MAKETAG="4.3" MAKETAG="4.4.1"
MAKEVCS="git://git.savannah.gnu.org/make" MAKEVCS="git://git.savannah.gnu.org/make"
# Mingw-w64 Settings # Mingw-w64 Settings
MINGWDIR="${SRCDIR}/mingw-w64" MINGWDIR="${SRCDIR}/mingw-w64"
MINGWLIB="ucrt" MINGWLIB="ucrt"
MINGWTAG="v8.0.0" MINGWTAG="master"
MINGWNTV="0x601" MINGWNTV="0x601"
MINGWVCS="https://github.com/mirror/mingw-w64.git" MINGWVCS="https://github.com/mirror/mingw-w64.git"
# NASM Settings
NASMDIR="${SRCDIR}/nasm"
NASMTAG="nasm-2.15.05"
NASMVCS="https://github.com/netwide-assembler/nasm.git"
# Ninja Settings # Ninja Settings
NINJADIR="${SRCDIR}/ninja" NINJADIR="${SRCDIR}/ninja"
NINJATAG="v1.10.0" NINJATAG="v1.12.1"
NINJAVCS="https://github.com/ninja-build/ninja.git" NINJAVCS="https://github.com/ninja-build/ninja.git"
# Wine Settings # Wine Settings
WINEDIR="${SRCDIR}/wine" WINEDIR="${SRCDIR}/wine"
WINETAG="wine-5.15" WINETAG="wine-9.8"
WINEVCS="git://source.winehq.org/git/wine.git" WINEVCS="git://source.winehq.org/git/wine.git"
@@ -100,9 +95,8 @@ cmake_fetch()
{ {
if [ ! -d ${CMAKEDIR} ]; then if [ ! -d ${CMAKEDIR} ]; then
echo ">>> Downloading CMAKE ..." echo ">>> Downloading CMAKE ..."
git clone ${CMAKEVCS} ${CMAKEDIR} git clone --depth 1 --branch ${CMAKETAG} ${CMAKEVCS} ${CMAKEDIR}
cd ${CMAKEDIR} cd ${CMAKEDIR}
git checkout tags/${CMAKETAG}
apply_patches ${CMAKEDIR##*/} ${CMAKETAG} apply_patches ${CMAKEDIR##*/} ${CMAKETAG}
cd ${WRKDIR} cd ${WRKDIR}
fi fi
@@ -129,156 +123,71 @@ llvm_build()
done done
LLVM_ARCHS=( $(for ARCH in ${LLVM_ARCHS[@]}; do echo ${ARCH}; done | sort -u) ) LLVM_ARCHS=( $(for ARCH in ${LLVM_ARCHS[@]}; do echo ${ARCH}; done | sort -u) )
cd ${LLVMDIR}/llvm/tools cd ${LLVMDIR}/llvm/tools
for UTIL in clang lld lldb; do for UTIL in clang lld; do
if [ ! -e ${UTIL} ]; then if [ ! -e ${UTIL} ]; then
ln -sf ../../${UTIL} . ln -sf ../../${UTIL} .
fi fi
done done
mkdir -p ${LLVMDIR}/llvm/build mkdir -p ${LLVMDIR}/llvm/build
cd ${LLVMDIR}/llvm/build cd ${LLVMDIR}/llvm/build
cmake \ cmake -G Ninja \
-DCMAKE_BUILD_TYPE="Release" \ -DCMAKE_BUILD_TYPE="Release" \
-DCMAKE_INSTALL_PREFIX=${BINDIR} \ -DCMAKE_INSTALL_PREFIX=${BINDIR} \
-DLLDB_ENABLE_CURSES=FALSE \
-DLLDB_ENABLE_LIBEDIT=FALSE \
-DLLDB_ENABLE_LUA=FALSE \
-DLLDB_ENABLE_PYTHON=FALSE \
-DLLDB_INCLUDE_TESTS=FALSE \ -DLLDB_INCLUDE_TESTS=FALSE \
-DLLVM_ENABLE_ASSERTIONS=FALSE \ -DLLVM_ENABLE_ASSERTIONS=FALSE \
-DLLVM_INSTALL_TOOLCHAIN_ONLY=TRUE \ -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld;lldb" \
-DLLVM_INSTALL_TOOLCHAIN_ONLY=ON \
-DLLVM_LINK_LLVM_DYLIB=ON \
-DLLVM_TARGETS_TO_BUILD="$(echo ${LLVM_ARCHS[@]} | tr ' ' ';')" \ -DLLVM_TARGETS_TO_BUILD="$(echo ${LLVM_ARCHS[@]} | tr ' ' ';')" \
-DLLVM_TOOLCHAIN_TOOLS="clang;llvm-addr2line;llvm-ar;llvm-as;llvm-cov;llvm-cvtres;llvm-dlltool;llvm-nm;llvm-objdump;llvm-objcopy;llvm-pdbutil;llvm-profdata;llvm-ranlib;llvm-rc;llvm-readobj;llvm-strings;llvm-strip;llvm-symbolizer" \ -DLLVM_TOOLCHAIN_TOOLS="llvm-addr2line;llvm-ar;llvm-as;llvm-cov;llvm-cvtres;llvm-dlltool;llvm-lib;llvm-ml;llvm-nm;llvm-objdump;llvm-objcopy;llvm-pdbutil;llvm-profdata;llvm-ranlib;llvm-rc;llvm-readelf;llvm-readobj;llvm-strings;llvm-strip;llvm-symbolizer;llvm-windres" \
.. ..
make -j${CORES} install/strip ninja install/strip
cd ${WRKDIR} cd ${WRKDIR}
} }
# This function compiles and install LIBCXX # This function compiles and install LIBCXX & LIBUNWIND
llvm_build_libcxx() llvm_build_libs()
{ {
echo ">>> Building LLVM libraries (libcxx) ..." echo ">>> Building LLVM libraries (libcxx) ..."
for ARCH in ${ARCHS}; do for ARCH in ${ARCHS}; do
[ -z ${CLEAN} ] || rm -rf ${LLVMDIR}/libcxx/build-${ARCH} [ -z ${CLEAN} ] || rm -rf ${LLVMDIR}/runtimes/build-${ARCH}
mkdir -p ${LLVMDIR}/libcxx/build-${ARCH} mkdir -p ${LLVMDIR}/runtimes/build-${ARCH}
cd ${LLVMDIR}/libcxx/build-${ARCH} cd ${LLVMDIR}/runtimes/build-${ARCH}
cmake \ cmake -G Ninja \
-DCMAKE_BUILD_TYPE="Release" \ -DCMAKE_BUILD_TYPE="Release" \
-DCMAKE_INSTALL_PREFIX=${BINDIR}/${ARCH}-w64-mingw32 \ -DCMAKE_INSTALL_PREFIX="${BINDIR}/${ARCH}-w64-mingw32" \
-DCMAKE_AR="${BINDIR}/bin/llvm-ar" \ -DCMAKE_AR="${BINDIR}/bin/llvm-ar" \
-DCMAKE_C_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang" \ -DCMAKE_C_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang" \
-DCMAKE_C_COMPILER_WORKS=1 \ -DCMAKE_C_COMPILER_WORKS=1 \
-DCMAKE_C_FLAGS_INIT=-mguard=cf \
-DCMAKE_CXX_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang++" \ -DCMAKE_CXX_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang++" \
-DCMAKE_CXX_COMPILER_TARGET=${ARCH}-w64-windows-gnu \
-DCMAKE_CXX_COMPILER_WORKS=1 \ -DCMAKE_CXX_COMPILER_WORKS=1 \
-DCMAKE_CXX_FLAGS_INIT=-mguard=cf \
-DCMAKE_CROSSCOMPILING=TRUE \ -DCMAKE_CROSSCOMPILING=TRUE \
-DCMAKE_RANLIB="${BINDIR}/bin/llvm-ranlib" \ -DCMAKE_RANLIB="${BINDIR}/bin/llvm-ranlib" \
-DCMAKE_SHARED_LINKER_FLAGS="-lunwind" \
-DCMAKE_SYSTEM_NAME="Windows" \
-DLLVM_PATH="${LLVMDIR}/llvm" \
-DLIBCXX_CXX_ABI="libcxxabi" \
-DLIBCXX_CXX_ABI_INCLUDE_PATHS="../../libcxxabi/include" \
-DLIBCXX_CXX_ABI_LIBRARY_PATH="../../libcxxabi/build-${ARCH}/lib" \
-DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=FALSE \
-DLIBCXX_ENABLE_EXCEPTIONS=TRUE \
-DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=FALSE \
-DLIBCXX_ENABLE_FILESYSTEM=FALSE \
-DLIBCXX_ENABLE_MONOTONIC_CLOCK=TRUE \
-DLIBCXX_ENABLE_SHARED=TRUE \
-DLIBCXX_ENABLE_STATIC=TRUE \
-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \
-DLIBCXX_ENABLE_THREADS=TRUE \
-DLIBCXX_HAS_WIN32_THREAD_API=TRUE \
-DLIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB=TRUE \
-DLIBCXX_INCLUDE_TESTS=FALSE \
-DLIBCXX_INSTALL_HEADERS=TRUE \
-DLIBCXX_LIBDIR_SUFFIX="" \
-DLIBCXX_USE_COMPILER_RT=TRUE \
..
make -j${CORES}
make install
${BINDIR}/bin/llvm-ar qcsL \
${BINDIR}/${ARCH}-w64-mingw32/lib/libc++.dll.a \
${BINDIR}/${ARCH}-w64-mingw32/lib/libunwind.dll.a
${BINDIR}/bin/llvm-ar qcsL \
${BINDIR}/${ARCH}-w64-mingw32/lib/libc++.a \
${BINDIR}/${ARCH}-w64-mingw32/lib/libunwind.a
if [ ! -e ${BINDIR}/${ARCH}-w64-mingw32/bin ]; then
mkdir -p ${BINDIR}/${ARCH}-w64-mingw32/bin
fi
cp lib/libc++.dll ${BINDIR}/${ARCH}-w64-mingw32/bin/
done
cd ${WRKDIR}
}
# This function compiles LIBCXXABI
llvm_build_libcxxabi()
{
echo ">>> Building LLVM libraries (libcxxabi) ..."
for ARCH in ${ARCHS}; do
[ -z ${CLEAN} ] || rm -rf ${LLVMDIR}/libcxxabi/build-${ARCH}
mkdir -p ${LLVMDIR}/libcxxabi/build-${ARCH}
cd ${LLVMDIR}/libcxxabi/build-${ARCH}
cmake \
-DCMAKE_BUILD_TYPE="Release" \
-DCMAKE_INSTALL_PREFIX=${BINDIR}/${ARCH}-w64-mingw32 \
-DCMAKE_AR="${BINDIR}/bin/llvm-ar" \
-DCMAKE_C_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang" \
-DCMAKE_C_COMPILER_WORKS=1 \
-DCMAKE_CROSSCOMPILING=TRUE \
-DCMAKE_CXX_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang++" \
-DCMAKE_CXX_COMPILER_WORKS=1 \
-DCMAKE_CXX_FLAGS="-D_LIBCPP_HAS_THREAD_API_WIN32 -D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS" \
-DCMAKE_RANLIB="${BINDIR}/bin/llvm-ranlib" \
-DCMAKE_SYSTEM_NAME="Windows" \ -DCMAKE_SYSTEM_NAME="Windows" \
-DLLVM_PATH="${LLVMDIR}/llvm" \ -DLLVM_PATH="${LLVMDIR}/llvm" \
-DLIBCXXABI_ENABLE_EXCEPTIONS=TRUE \ -DLLVM_ENABLE_RUNTIMES="libunwind;libcxxabi;libcxx" \
-DLIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS=FALSE \ -DLIBUNWIND_USE_COMPILER_RT=TRUE \
-DLIBCXXABI_ENABLE_SHARED=FALSE \
-DLIBCXXABI_ENABLE_THREADS=TRUE \
-DLIBCXXABI_LIBCXX_INCLUDES="../../libcxx/include" \
-DLIBCXXABI_LIBDIR_SUFFIX="" \
-DLIBCXXABI_TARGET_TRIPLE="${ARCH}-w64-mingw32" \
-DLIBCXXABI_USE_COMPILER_RT=TRUE \
..
make -j${CORES}
done
cd ${WRKDIR}
}
# This function compiles and installs LIBUNWIND
llvm_build_libunwind()
{
echo ">>> Building LLVM libraries (libunwind) ..."
for ARCH in ${ARCHS}; do
[ -z ${CLEAN} ] || rm -rf ${LLVMDIR}/libunwind/build-${ARCH}
mkdir -p ${LLVMDIR}/libunwind/build-${ARCH}
cd ${LLVMDIR}/libunwind/build-${ARCH}
cmake \
-DCMAKE_BUILD_TYPE="Release" \
-DCMAKE_INSTALL_PREFIX=${BINDIR}/${ARCH}-w64-mingw32 \
-DCMAKE_AR="${BINDIR}/bin/llvm-ar" \
-DCMAKE_C_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang" \
-DCMAKE_C_COMPILER_WORKS=1 \
-DCMAKE_C_FLAGS="-Wno-dll-attribute-on-redeclaration" \
-DCMAKE_CROSSCOMPILING=TRUE \
-DCMAKE_CXX_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang++" \
-DCMAKE_CXX_COMPILER_WORKS=1 \
-DCMAKE_CXX_FLAGS="-Wno-dll-attribute-on-redeclaration" \
-DCMAKE_SYSTEM_NAME="Windows" \
-DCMAKE_RANLIB="${BINDIR}/bin/llvm-ranlib" \
-DLLVM_COMPILER_CHECKED=TRUE \
-DLLVM_PATH="${LLVMDIR}/llvm" \
-DLIBUNWIND_ENABLE_CROSS_UNWINDING=FALSE \
-DLIBUNWIND_ENABLE_SHARED=TRUE \ -DLIBUNWIND_ENABLE_SHARED=TRUE \
-DLIBUNWIND_ENABLE_STATIC=TRUE \ -DLIBUNWIND_ENABLE_STATIC=TRUE \
-DLIBUNWIND_ENABLE_THREADS=TRUE \ -DLIBCXX_USE_COMPILER_RT=ON \
-DLIBUNWIND_USE_COMPILER_RT=TRUE \ -DLIBCXX_ENABLE_SHARED=TRUE \
-DLIBCXX_ENABLE_STATIC=TRUE \
-DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \
-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \
-DLIBCXX_CXX_ABI="libcxxabi" \
-DLIBCXX_LIBDIR_SUFFIX="" \
-DLIBCXX_INCLUDE_TESTS=FALSE \
-DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=FALSE \
-DLIBCXXABI_USE_COMPILER_RT=ON \
-DLIBCXXABI_ENABLE_SHARED=OFF \
-DLIBCXXABI_LIBDIR_SUFFIX="" \
-DLIBCXXABI_USE_LLVM_UNWINDER=ON \
.. ..
make -j${CORES} ninja
make install ninja install
if [ ! -e ${BINDIR}/${ARCH}-w64-mingw32/bin ]; then
mkdir -p ${BINDIR}/${ARCH}-w64-mingw32/bin
fi
cp lib/libunwind.dll ${BINDIR}/${ARCH}-w64-mingw32/bin/
done done
cd ${WRKDIR} cd ${WRKDIR}
} }
@@ -291,43 +200,28 @@ llvm_build_runtime()
[ -z ${CLEAN} ] || rm -rf ${LLVMDIR}/compiler-rt/build-${ARCH} [ -z ${CLEAN} ] || rm -rf ${LLVMDIR}/compiler-rt/build-${ARCH}
mkdir -p ${LLVMDIR}/compiler-rt/build-${ARCH} mkdir -p ${LLVMDIR}/compiler-rt/build-${ARCH}
cd ${LLVMDIR}/compiler-rt/build-${ARCH} cd ${LLVMDIR}/compiler-rt/build-${ARCH}
case ${ARCH} in cmake -G Ninja \
"armv7")
BARCH="armv7"
LARCH="arm"
;;
"i686")
if [ ! -e ${BINDIR}/i386-w64-mingw32 ]; then
ln -sf i686-w64-mingw32 ${BINDIR}/i386-w64-mingw32
fi
BARCH="i386"
LARCH="i386"
;;
*)
BARCH="${ARCH}"
LARCH="${ARCH}"
;;
esac
cmake \
-DCMAKE_BUILD_TYPE="Release" \ -DCMAKE_BUILD_TYPE="Release" \
-DCMAKE_INSTALL_PREFIX=${BINDIR}/${ARCH}-w64-mingw32 \
-DCMAKE_AR="${BINDIR}/bin/llvm-ar" \ -DCMAKE_AR="${BINDIR}/bin/llvm-ar" \
-DCMAKE_C_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang" \ -DCMAKE_C_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang" \
-DCMAKE_C_COMPILER_TARGET="${BARCH}-windows-gnu" \ -DCMAKE_C_COMPILER_TARGET="${ARCH}-windows-gnu" \
-DCMAKE_C_COMPILER_WORKS=1 \ -DCMAKE_C_FLAGS_INIT="-mguard=cf" \
-DCMAKE_CXX_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang++" \ -DCMAKE_CXX_COMPILER="${BINDIR}/bin/${ARCH}-w64-mingw32-clang++" \
-DCMAKE_CXX_COMPILER_WORKS=1 \ -DCMAKE_CXX_FLAGS_INIT="-mguard=cf" \
-DCMAKE_FIND_ROOT_PATH="${BINDIR}/${ARCH}-w64-mingw32" \
-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \
-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY \
-DCMAKE_INSTALL_PREFIX=$(${BINDIR}/bin/${ARCH}-w64-mingw32-clang --print-resource-dir) \
-DCMAKE_RANLIB="${BINDIR}/bin/llvm-ranlib" \ -DCMAKE_RANLIB="${BINDIR}/bin/llvm-ranlib" \
-DCMAKE_SYSTEM_NAME="Windows" \ -DCMAKE_SYSTEM_NAME="Windows" \
-DCOMPILER_RT_BUILD_BUILTINS=TRUE \
-DCOMPILER_RT_DEFAULT_TARGET_ONLY=TRUE \ -DCOMPILER_RT_DEFAULT_TARGET_ONLY=TRUE \
-DCOMPILER_RT_USE_BUILTINS_LIBRARY=TRUE \ -DCOMPILER_RT_USE_BUILTINS_LIBRARY=TRUE \
-DSANITIZER_CXX_ABI=libc++ \ -DLLVM_CONFIG_PATH="" \
-DSANITIZER_CXX_ABI="libc++" \
../lib/builtins ../lib/builtins
make -j${CORES} ninja
mkdir -p ${BINDIR}/lib/clang/${LLVMTAG#*-}/lib/windows ninja install
for LIB in lib/windows/libclang_rt.*.a; do
cp ${LIB} ${BINDIR}/lib/clang/${LLVMTAG#*-}/lib/windows/$(basename ${LIB} | sed s/${BARCH}/${LARCH}/)
done
done done
cd ${WRKDIR} cd ${WRKDIR}
} }
@@ -337,9 +231,8 @@ llvm_fetch()
{ {
if [ ! -d ${LLVMDIR} ]; then if [ ! -d ${LLVMDIR} ]; then
echo ">>> Downloading LLVM ..." echo ">>> Downloading LLVM ..."
git clone ${LLVMVCS} ${LLVMDIR} git clone --depth 1 --branch ${LLVMTAG} ${LLVMVCS} ${LLVMDIR}
cd ${LLVMDIR} cd ${LLVMDIR}
git checkout tags/${LLVMTAG}
apply_patches ${LLVMDIR##*/} ${LLVMTAG##*-} apply_patches ${LLVMDIR##*/} ${LLVMTAG##*-}
cd ${WRKDIR} cd ${WRKDIR}
fi fi
@@ -374,9 +267,8 @@ make_fetch()
{ {
if [ ! -d ${MAKEDIR} ]; then if [ ! -d ${MAKEDIR} ]; then
echo ">>> Downloading Make ..." echo ">>> Downloading Make ..."
git clone ${MAKEVCS} ${MAKEDIR} git clone --depth 1 --branch ${MAKETAG} ${MAKEVCS} ${MAKEDIR}
cd ${MAKEDIR} cd ${MAKEDIR}
git checkout tags/${MAKETAG}
apply_patches ${MAKEDIR##*/} ${MAKETAG} apply_patches ${MAKEDIR##*/} ${MAKETAG}
cd ${WRKDIR} cd ${WRKDIR}
fi fi
@@ -411,6 +303,7 @@ mingw_build_crt()
--prefix=${BINDIR}/${ARCH}-w64-mingw32 \ --prefix=${BINDIR}/${ARCH}-w64-mingw32 \
--with-sysroot=${BINDIR} \ --with-sysroot=${BINDIR} \
--with-default-msvcrt=${MINGWLIB} \ --with-default-msvcrt=${MINGWLIB} \
--enable-cfguard \
${FLAGS} ${FLAGS}
make -j${CORES} make -j${CORES}
make install make install
@@ -456,7 +349,9 @@ mingw_build_libs()
../configure \ ../configure \
--host=${ARCH}-w64-mingw32 \ --host=${ARCH}-w64-mingw32 \
--prefix=${BINDIR}/${ARCH}-w64-mingw32 \ --prefix=${BINDIR}/${ARCH}-w64-mingw32 \
--libdir=${BINDIR}/${ARCH}-w64-mingw32/lib --libdir=${BINDIR}/${ARCH}-w64-mingw32/lib \
CFLAGS="-O2 -mguard=cf" \
CXXFLAGS="-O2 -mguard=cf"
make -j${CORES} make -j${CORES}
make install make install
PATH="${ORIGPATH}" PATH="${ORIGPATH}"
@@ -492,38 +387,13 @@ mingw_fetch()
{ {
if [ ! -d ${MINGWDIR} ]; then if [ ! -d ${MINGWDIR} ]; then
echo ">>> Downloading MinGW-w64 ..." echo ">>> Downloading MinGW-w64 ..."
git clone ${MINGWVCS} ${MINGWDIR} git clone --depth 1 --branch ${MINGWTAG} ${MINGWVCS} ${MINGWDIR}
cd ${MINGWDIR} cd ${MINGWDIR}
git checkout tags/${MINGWTAG}
apply_patches ${MINGWDIR##*/} ${MINGWTAG} apply_patches ${MINGWDIR##*/} ${MINGWTAG}
cd ${WRKDIR} cd ${WRKDIR}
fi fi
} }
# This function compiles and installs NASM
nasm_build()
{
cd ${NASMDIR}
./autogen.sh
./configure
make -j${CORES}
install nasm ndisasm ${BINDIR}/bin/
cd ${WRKDIR}
}
# This function downloads NASM from VCS
nasm_fetch()
{
if [ ! -d ${NASMDIR} ]; then
echo ">>> Downloading NASM ..."
git clone ${NASMVCS} ${NASMDIR}
cd ${NASMDIR}
git checkout tags/${NASMTAG}
apply_patches ${NASMDIR##*/} ${NASMTAG##*-}
cd ${WRKDIR}
fi
}
# This function compiles and installs NINJA # This function compiles and installs NINJA
ninja_build() ninja_build()
{ {
@@ -541,9 +411,8 @@ ninja_fetch()
{ {
if [ ! -d ${NINJADIR} ]; then if [ ! -d ${NINJADIR} ]; then
echo ">>> Downloading NINJA ..." echo ">>> Downloading NINJA ..."
git clone ${NINJAVCS} ${NINJADIR} git clone --depth 1 --branch ${NINJATAG} ${NINJAVCS} ${NINJADIR}
cd ${NINJADIR} cd ${NINJADIR}
git checkout tags/${NINJATAG}
apply_patches ${NINJADIR##*/} ${NINJATAG} apply_patches ${NINJADIR##*/} ${NINJATAG}
cd ${WRKDIR} cd ${WRKDIR}
fi fi
@@ -557,9 +426,10 @@ wine_build()
cd ${WINEDIR}/build cd ${WINEDIR}/build
../configure \ ../configure \
-enable-win64 \ -enable-win64 \
--without-freetype \
--without-x --without-x
for TOOL in winedump wmc wrc; do for TOOL in winedump wmc wrc; do
make -j${CORES} tools/${TOOL} make -j${CORES} tools/${TOOL}/all
cp tools/${TOOL}/${TOOL} ${BINDIR}/bin/ cp tools/${TOOL}/${TOOL} ${BINDIR}/bin/
for ARCH in ${ARCHS}; do for ARCH in ${ARCHS}; do
if [ ! -e ${BINDIR}/bin/${ARCH}-w64-mingw32-${TOOL} ]; then if [ ! -e ${BINDIR}/bin/${ARCH}-w64-mingw32-${TOOL} ]; then
@@ -575,9 +445,8 @@ wine_fetch()
{ {
if [ ! -d ${WINEDIR} ]; then if [ ! -d ${WINEDIR} ]; then
echo ">>> Downloading WINE ..." echo ">>> Downloading WINE ..."
git clone ${WINEVCS} ${WINEDIR} git clone --depth 1 --branch ${WINETAG} ${WINEVCS} ${WINEDIR}
cd ${WINEDIR} cd ${WINEDIR}
git checkout tags/${WINETAG}
apply_patches ${WINEDIR##*/} ${WINETAG##*-} apply_patches ${WINEDIR##*/} ${WINETAG##*-}
cd ${WRKDIR} cd ${WRKDIR}
fi fi
@@ -601,7 +470,7 @@ xtchain_build()
for EXEC in dlltool ld objdump; do for EXEC in dlltool ld objdump; do
ln -sf ../${GENERIC}/bin/${EXEC}-wrapper ${BINDIR}/bin/${ARCH}-w64-mingw32-${EXEC} ln -sf ../${GENERIC}/bin/${EXEC}-wrapper ${BINDIR}/bin/${ARCH}-w64-mingw32-${EXEC}
done done
for EXEC in windres xtcspecc; do for EXEC in bin2c exetool windres xtcspecc; do
if [ ! -e ${BINDIR}/bin/${EXEC} ]; then if [ ! -e ${BINDIR}/bin/${EXEC} ]; then
gcc ${WRKDIR}/tools/${EXEC}.c -o ${BINDIR}/bin/${EXEC} gcc ${WRKDIR}/tools/${EXEC}.c -o ${BINDIR}/bin/${EXEC}
fi fi
@@ -616,16 +485,12 @@ xtchain_build()
# Exit immediately on any failure # Exit immediately on any failure
set -e set -e
# Check if script launched as root
if [ "$(whoami)" = "root" ]; then
echo "This script cannot be run as root!"
exit 1
fi
# Check number of CPU cores available # Check number of CPU cores available
: ${CORES:=$(sysctl -n hw.ncpu 2>/dev/null)} if [[ ! -n ${CORES} ]]; then
: ${CORES:=$(nproc 2>/dev/null)} : ${CORES:=$(sysctl -n hw.ncpu 2>/dev/null)}
: ${CORES:=1} : ${CORES:=$(nproc 2>/dev/null)}
: ${CORES:=1}
fi
# Create working directories # Create working directories
mkdir -p ${BINDIR} mkdir -p ${BINDIR}
@@ -640,12 +505,6 @@ llvm_fetch
# Build and install LLVM # Build and install LLVM
llvm_build llvm_build
# Download NASM
nasm_fetch
# Build and install NASM
nasm_build
# Download Mingw-W64 # Download Mingw-W64
mingw_fetch mingw_fetch
@@ -658,17 +517,15 @@ mingw_build_crt
# Build and install LLVM compiler runtime # Build and install LLVM compiler runtime
llvm_build_runtime llvm_build_runtime
# Build and install LLVM compiler libraries
llvm_build_libs
# Build and install Mingw-W64 libraries # Build and install Mingw-W64 libraries
mingw_build_libs mingw_build_libs
# Build and install Mingw-W64 tools # Build and install Mingw-W64 tools
mingw_build_tools mingw_build_tools
# Build LLVM libraries
llvm_build_libunwind
llvm_build_libcxxabi
llvm_build_libcxx
# Download Wine # Download Wine
wine_fetch wine_fetch
@@ -696,12 +553,12 @@ ninja_build
# Remove unneeded files to save disk space # Remove unneeded files to save disk space
echo ">>> Removing unneeded files to save disk space ..." echo ">>> Removing unneeded files to save disk space ..."
rm -rf ${BINDIR}/{doc,include,share/{bash-completion,emacs,info,locale,man,vim}} rm -rf ${BINDIR}/{doc,include,share/{bash-completion,emacs,info,locale,man,vim}}
rm -rf ${BINDIR}/bin/{clang-{check,exdef-mapping,import-test,offload-*,rename,scan-deps},hmaptool,ld64.lld,wasm-ld} rm -rf ${BINDIR}/bin/amdgpu-arch,{clang-{check,exdef-mapping,import-test,offload-*,rename,scan-deps},diagtool,hmaptool,ld64.lld,modularize,nxptx-arch,wasm-ld}
# Save XT Toolchain version # Save XT Toolchain version
cd ${WRKDIR} cd ${WRKDIR}
: ${XTCVER:=$(git describe --exact-match --tags 2>/dev/null)} : ${XTCVER:=$(git describe --exact-match --tags 2>/dev/null)}
: ${XTCVER:=DEV} : ${XTCVER:=DEVEL}
echo "${XTCVER}" > ${BINDIR}/Version echo "${XTCVER}" > ${BINDIR}/Version
# Prepare archive # Prepare archive

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +0,0 @@
diff --git a/src/job.c b/src/job.c
index d6e28d3..f8f6950 100644
--- a/src/job.c
+++ b/src/job.c
@@ -2391,7 +2391,7 @@ child_execute_job (struct childbase *child, int good_stdin, char **argv)
}
}
- cmd = (char *)find_in_given_path (argv[0], p, 0);
+ cmd = (char *)find_in_given_path (argv[0], p, 0, false);
}
if (!cmd)

File diff suppressed because it is too large Load Diff

View File

@@ -6,12 +6,6 @@
# DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org> # DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
# Check if script launched as root
if [ "$(whoami)" = "root" ]; then
echo "This script cannot be run as root!"
exit 1
fi
# Get the absolute path to the XTchain # Get the absolute path to the XTchain
export XTCDIR="$(realpath $(dirname ${0}))" export XTCDIR="$(realpath $(dirname ${0}))"

View File

@@ -51,6 +51,19 @@ chbuild()
} }
export -f chbuild export -f chbuild
# Prints help
help()
{
version
echo "XTChain defines an internal list of commands:"
echo " * charch [arch] - sets the target CPU architecture [aarch64/armv7/i686/amd64]"
echo " * chbuild [type] - sets build type [debug/release]"
echo " * help - prints this message"
echo " * version - prints XTChain and its components version"
echo " * xbuild - builds an application with a Ninja build system"
}
export -f help
# Displays version banner # Displays version banner
version() version()
{ {
@@ -66,9 +79,26 @@ version()
echo "Wine Message Compiler Version: $(${XTCDIR}/bin/wmc -V | grep 'version' | cut -d' ' -f5)" echo "Wine Message Compiler Version: $(${XTCDIR}/bin/wmc -V | grep 'version' | cut -d' ' -f5)"
echo "Wine Resource Compiler Version: $(${XTCDIR}/bin/wrc --version | grep 'version' | cut -d' ' -f5)" echo "Wine Resource Compiler Version: $(${XTCDIR}/bin/wrc --version | grep 'version' | cut -d' ' -f5)"
echo echo
charch ${TARGET} charch ${TARGET:-amd64}
chbuild DEBUG chbuild ${BUILD_TYPE:-DEBUG}
echo echo
echo echo
} }
export -f version export -f version
# Builds application (wrapper to Ninja)
xbuild()
{
if [ ! -f build.arch ]; then
ninja "$@"
else
ARCH=$(cat build.arch)
if [ x"${ARCH}" != x"${TARGET}" ]; then
echo "Build is configured for '${ARCH}' while current target set to '${TARGET}'!"
echo "Cannot continue until conflict is resolved ..."
return 1
fi
ninja "$@"
fi
}
export -f xbuild

74
tools/bin2c.c Normal file
View File

@@ -0,0 +1,74 @@
/**
* PROJECT: XTchain
* LICENSE: See COPYING.md in the top level directory
* FILE: tools/bin2c.c
* DESCRIPTION: Binary to C converter
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
*/
#include "xtchain.h"
int main(int argc, char *argv[])
{
/* Check for proper number of arguments */
if(argc != 4)
{
printf("Usage: %s <input binary> <output file> <structure name>\n", argv[0]);
return 1;
}
/* Open the input binary file in binary mode */
FILE *inputFile = fopen(argv[1], "rb");
if(inputFile == NULL)
{
printf("Error: unable to open file %s\n", argv[1]);
return 1;
}
/* Open the destination source code file in text mode */
FILE *outputFile = fopen(argv[2], "w");
if(outputFile == NULL)
{
printf("Error: unable to open file %s\n", argv[2]);
fclose(inputFile);
return 1;
}
/* Get the size of the binary file */
fseek(inputFile, 0, SEEK_END);
long binSize = ftell(inputFile);
rewind(inputFile);
/* Allocate memory for the binary data */
unsigned char *binData = (unsigned char *)malloc(binSize);
if(binData == NULL)
{
printf("Error: unable to allocate memory for binary data\n");
fclose(inputFile);
fclose(outputFile);
return 1;
}
/* Read the binary data into memory */
fread(binData, sizeof(unsigned char), binSize, inputFile);
/* Write the C structure to the header file */
fprintf(outputFile, "unsigned char %s[] = {", argv[3]);
for(int i = 0; i < binSize; i++)
{
fprintf(outputFile, "0x%02X", binData[i]);
if(i < binSize - 1)
{
fprintf(outputFile, ",");
}
}
fprintf(outputFile, "};\nunsigned int %s_size = %ld;\n", argv[3], binSize);
free(binData);
/* Close all open files */
fclose(inputFile);
fclose(outputFile);
printf("Binary data converted to C structure successfully.\n");
return 0;
}

182
tools/exetool.c Normal file
View File

@@ -0,0 +1,182 @@
/**
* PROJECT: XTchain
* LICENSE: See COPYING.md in the top level directory
* FILE: tools/exetool.c
* DESCRIPTION: Portable Executable (PE) utility for changing its signature and subsystem
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
*/
#include "xtchain.h"
typedef struct _PE_SUBSYSTEM
{
int Identifier;
char *Name;
} PE_SUBSYSTEM, *PPE_SUBSYSTEM;
static PE_SUBSYSTEM SubSystems[] = {
{0x00, "INVALID_SUBSYSTEM"},
{0x01, "NT_NATIVE"},
{0x02, "WINDOWS_GUI"},
{0x03, "WINDOWS_CLI"},
{0x04, "WINDOWS_CE_OLD"},
{0x05, "OS2_CUI"},
{0x07, "POSIX_CUI"},
{0x08, "NATIVE_WINDOWS"},
{0x09, "WINDOWS_CE_GUI"},
{0x0A, "EFI_APPLICATION"},
{0x0B, "EFI_BOOT_SERVICE_DRIVER"},
{0x0C, "EFI_RUNTIME_DRIVER"},
{0x0D, "EFI_ROM"},
{0x0E, "XBOX"},
{0x10, "WINDOWS_BOOT_APPLICATION"},
{0x14, "XT_NATIVE_KERNEL"},
{0x15, "XT_NATIVE_APPLICATION"},
{0x16, "XT_NATIVE_DRIVER"},
{0x17, "XT_DYNAMIC_LIBRARY"},
{0x18, "XT_APPLICATION_CLI"},
{0x19, "XT_APPLICATION_GDI"}
};
PPE_SUBSYSTEM getSubSystem(char *Name)
{
int Index;
int SubSystemsCount;
PPE_SUBSYSTEM SubSystem;
/* Count number of subsystems avaialble */
SubSystemsCount = sizeof(SubSystems) / sizeof(PE_SUBSYSTEM);
/* Find subsystem */
for(Index = 0; Index < SubSystemsCount; Index++)
{
SubSystem = &SubSystems[Index];
if(strcasecmp(SubSystem->Name, Name) == 0)
{
/* Subsystem found, return its ID */
return SubSystem;
}
}
/* No valid subsystem found */
return &SubSystems[0];
}
char *getSubSystemName(int Identifier)
{
int Index;
int SubSystemsCount;
PPE_SUBSYSTEM SubSystem;
/* Count number of subsystems avaialble */
SubSystemsCount = sizeof(SubSystems) / sizeof(PE_SUBSYSTEM);
/* Find subsystem */
for(Index = 0; Index < SubSystemsCount; Index++)
{
SubSystem = &SubSystems[Index];
if(SubSystem->Identifier == Identifier)
{
/* Subsystem found, return its ID */
return SubSystem->Name;
}
}
/* No valid subsystem found */
return SubSystems[0].Name;
}
int main(int argc, char *argv[])
{
FILE *ExeFile;
unsigned char Signature[4];
unsigned int HeaderOffset;
unsigned int ImageSignature;
unsigned short SubSystem;
PPE_SUBSYSTEM NewSubSystem;
/* Check for proper number of arguments */
if(argc != 3)
{
printf("Usage: %s <filename> <new SubSystem>\n", argv[0]);
return 1;
}
/* Parse the new SubSystem value from the command line argument */
NewSubSystem = getSubSystem(argv[2]);
if(NewSubSystem->Identifier == 0)
{
/* Invalid SubSystem provided */
printf("Error: %s is not a valid PE SubSystem\n", argv[2]);
return 1;
}
/* Open the EXE file in binary mode */
ExeFile = fopen(argv[1], "r+b");
if(ExeFile == NULL)
{
/* Failed to open PE file */
printf("ERROR: Unable to open file %s\n", argv[1]);
return 2;
}
/* Verify that the input file has a valid DOS header */
fread(Signature, sizeof(unsigned char), 4, ExeFile);
if(Signature[0] != 'M' || Signature[1] != 'Z')
{
/* Invalid DOS header */
printf("ERROR: %s is not a valid EXE file\n", argv[1]);
fclose(ExeFile);
return 3;
}
/* Verify that the input file has a valid PE header */
fseek(ExeFile, 0x3C, SEEK_SET);
fread(&HeaderOffset, sizeof(unsigned int), 1, ExeFile);
fseek(ExeFile, HeaderOffset, SEEK_SET);
fread(Signature, sizeof(unsigned char), 4, ExeFile);
if((Signature[0] != 'P' || Signature[1] != 'E' || Signature[2] != 0 || Signature[3] != 0) &&
(Signature[0] != 'P' || Signature[1] != 'E' || Signature[2] != 'X' || Signature[3] != 'T'))
{
/* Invalid PE header */
printf("Error: %s is not a valid PE file\n", argv[1]);
fclose(ExeFile);
return 3;
}
/* Check if setting XT subsystem */
if(NewSubSystem->Identifier >= 0x14 && NewSubSystem->Identifier <= 0x19)
{
/* Write PEXT signature */
ImageSignature = 0x54584550;
}
else
{
/* Write PE00 signature */
ImageSignature = 0x00004550;
}
/* Seek back to header offset and write new signature */
fseek(ExeFile, HeaderOffset, SEEK_SET);
fwrite(&ImageSignature, sizeof(ImageSignature), 1, ExeFile);
/* Seek to the offset of the SubSystem field in the optional header */
fseek(ExeFile, HeaderOffset + 0x5C, SEEK_SET);
/* Read the current SubSystem value */
fread(&SubSystem, sizeof(unsigned short), 1, ExeFile);
/* Seek back to the SubSystem field in the optional header */
fseek(ExeFile, -sizeof(unsigned short), SEEK_CUR);
/* Write the new SubSystem value */
fwrite(&NewSubSystem->Identifier, sizeof(unsigned short), 1, ExeFile);
/* Close the file */
fclose(ExeFile);
/* Finished successfully */
printf("PE SubSystem modified: 0x%02X <%s> to 0x%02X <%s>\n",
SubSystem, getSubSystemName(SubSystem), NewSubSystem->Identifier, NewSubSystem->Name);
return 0;
}

View File

@@ -87,7 +87,7 @@ static
void print_version(void) void print_version(void)
{ {
printf("XTchain windres (GNU windres compatible) %s\n", WINDRES_VERSION); printf("XTchain windres (GNU windres compatible) %s\n", WINDRES_VERSION);
exit(-1); exit(0);
} }
static static
@@ -126,7 +126,7 @@ void print_help(void)
" pei-x86-64\n" " pei-x86-64\n"
" pe-i386\n" " pe-i386\n"
" pei-i386\n"); " pei-i386\n");
exit(1); exit(0);
} }
static static
@@ -169,9 +169,9 @@ void check_num_args(int arg,
int main(int argc, int main(int argc,
char* argv[]) char* argv[])
{ {
const char *dir; char *dir;
const char *basename; char *basename;
const char *target; char *target;
split_argv(argv[0], &dir, &basename, &target, NULL); split_argv(argv[0], &dir, &basename, &target, NULL);