I’m not talking about MingGW, Cygwin or anything else like that, but rather when support for Windows NT first appeared, it had to be compiled with Microsoft Visual C++ 1.0 of all things.
It was back in the 2.6 days of GCC, right before the stagnation that led to EGCS.
`i[345]86-*-winnt3.5' This version requires a GAS that has not yet been released. Until it is, you can get a prebuilt binary version via anonymous ftp from `cs.washington.edu:pub/gnat' or `cs.nyu.edu:pub/gnat'. You must also use the Microsoft header files from the Windows NT 3.5 SDK. Find these on the CDROM in the `/mstools/h' directory dated 9/4/94. You must use a fixed version of Microsoft linker made especially for NT 3.5, which is also is available on the NT 3.5 SDK CDROM. If you do not have this linker, can you also use the linker from Visual C/C++ 1.0 or 2.0. Installing GNU CC for NT builds a wrapper linker, called `ld.exe', which mimics the behaviour of Unix `ld' in the specification of libraries (`-L' and `-l'). `ld.exe' looks for both Unix and Microsoft named libraries. For example, if you specify `-lfoo', `ld.exe' will look first for `libfoo.a' and then for `foo.lib'. You may install GNU CC for Windows NT in one of two ways, depending on whether or not you have a Unix-like shell and various Unix-like utilities. 1. If you do not have a Unix-like shell and few Unix-like utilities, you will use a DOS style batch script called `configure.bat'. Invoke it as `configure winnt' from an MSDOS console window or from the program manager dialog box. `configure.bat' assumes you have already installed and have in your path a Unix-like `sed' program which is used to create a working `Makefile' from `Makefile.in'. `Makefile' uses the Microsoft Nmake program maintenance utility and the Visual C/C++ V8.00 compiler to build GNU CC. You need only have the utilities `sed' and `touch' to use this installation method, which only automatically builds the compiler itself. You must then examine what `fixinc.winnt' does, edit the header files by hand and build `libgcc.a' manually. 2. The second type of installation assumes you are running a Unix-like shell, have a complete suite of Unix-like utilities in your path, and have a previous version of GNU CC already installed, either through building it via the above installation method or acquiring a pre-built binary. In this case, use the `configure' script in the normal fashion.
Well, that is quite the tall order! I can’t believe I somehow managed to build it back then, and out of curiosity I managed to build it again. And as you can see you need a ‘beta’ release of the GAS assembler, which is kind of impossible to find now, but it was part of the GNAT project, which used to distribute binary builds of the GCC core back in the day. Luckily, I have a version stuffed away, although it’s from GCC 2.8.1, not as ancient as it would have when GCC 2.6 was a new thing. But it at least assembles enough for my simple Hello World experiment.
To build GCC you need a working SED, which surprisingly CL 8.0 from the Win32s SDK, and it runs fine on Windows 7 x64 of all things. I had to mess with some of the files, and substitute the linker & headder files from Visual C++ 2.0 but much to my amazement not only can I build GCC along with libgcc.a, it also builds incredibly fast. On my machine I can compile GCC in about 5 seconds. Â I remember in 1995 building this on Windows 95 (I was crazy) and it is taking HOURS and HOURS.
So, one nice thing about these binaries is that you don’t need any external DLL’s Even the import section of a simple hello world exe is tiny:
GetVersion GetEnvironmentStrings GetCommandLineA ExitProcess RtlUnwind UnhandledExceptionFilter GetModuleFileNameA GetFileType GetStdHandle GetStartupInfoA VirtualFree VirtualAlloc WriteFile WideCharToMultiByte GetLastError FlushFileBuffers SetFilePointer SetStdHandle CloseHandle KERNEL32.dll
Which implies that it only needs KERNEL32 to function.
I don’t know if it’s of any use to anyone else, but HERE is my dump of all the source and tools I used to build GCC.