TL;DR:------
When using native tcc (32) to build tcc cross compilers, the resulting tcc
cross compiler to windows x86_64 crashes when trying to create an executable.
However, if using gcc (32) to build tcc cross compilers, the resulting tcc
cross compiler to windows x86_64 seems to work. Compile-only seems to work and
create identical object files, and libtcc1.a is also identical between the two
cross compilers.
The long versions and steps to reproduce, from scratch if you need:
Setup msys2, build env and tcc:
-------------------------------
1. Download and install msys2 from http://msys2.github.io/ (I got
msys2-x86_64-20160921.exe) - can be used for native 32 or 64 gcc
2. Possibly follow the instructions to self-update (you may need to kill a
stray pacman.exe process after closing the terminal)
3. Install required tools: pacman -S --force git make diffutils texinfo
mingw-w64-i686-gcc
* due to bug at the current installer, the first 32 and 64 installs require
--force: https://github.com/Alexpux/MSYS2-packages/issues/689
4. Close the terminal and open the mingw 32 shell environment: double click
mingw32.exe
5. Get tcc: cd /c/ && git clone git://repo.or.cz/tinycc.git
Builds, tests and installs should complete successfully (assuming tcc was
cloned to /c/tinycc):
--------------------------------------------------------
6. Build (with gcc i686)/test/install native tcc 32 and cross compilers. Needs
--cpu since `uname -m` reports x86_64 (on a 64 system):
cd /c/tinycc && mkdir with-gcc32 && cd with-gcc32 && ../configure --cpu=i386 --enable-cross
--prefix=$(pwd)/dist && make && make test && make install
7. Build/test/install native tcc 32 and cross compilers again, now using the
newly built tcc 32 (it's fast! yay!):
cd /c/tinycc && mkdir with-tcc32 && cd with-tcc32 && ../configure --cpu=i386 --enable-cross
--prefix=$(pwd)/dist --cc=/c/tinycc/with-gcc32/dist/tcc.exe --ar=/c/tinycc/with-gcc32/dist/tiny_libmaker.exe && make
&& make test && make install
The bug:
--------
8. Create a test file: cd /c/tinycc && echo "int main(int argc, char **argv) { return
argc - 1; }" > test.c
9. Build the test file with x86_64-win32-tcc.exe which was built using gcc:
./with-gcc32/dist/x86_64-win32-tcc.exe test.c
- The build succeeds and the resulting test.exe is functional, e.g. this
prints 3: ./test.exe 1 2 3; echo $?
10 Same as above but using x86_64-win32-tcc.exe which was built using tcc:
./with-tcc32/dist/x86_64-win32-tcc.exe test.c
- crash/segmentation fault
Notes:
------
- Both compilers can run and report expected paths:
./with-{g|t}cc32/dist/x86_64-win32-tcc.exe -vv
- The lib objects (which were compiled with the respective
x86_64-win32-tcc.exe) and the resulting libtcc1.a are identical at
./with-{g|t}cc32/lib/x86_64-win32/ and at ./with-{g|t}cc32/dist/lib/64
- Compile only (-c) of the test file works and creates identical test.o with
both cross compilers. - The one with gcc succeeds link:
`./with-gcc32/dist/x86_64-win32-tcc.exe -o test.exe test.o`
- The one with tcc crashes: `./with-tcc32/dist/x86_64-win32-tcc.exe -o
test.exe test.o`