The information below documents how I managed to get a working GCC compiler running on a Silicon Graphics Web Force Indy computer running the 6.2 version of IRIX. I pieced this information together after reading several of the Usenet newsgroups in the comp.os.sgi hierarchy plus a little experimentation. I had not seen all of the following information together in one place anywhere else on the net at the time I first put this page together.
I hope this helps others get GCC running on their IRIX based SGI computer.
The company Micro Madness has a web site with software archives for Silicon Graphics computer users.
The files for GCC which you need to download are:
gcc-2.6.3.inst.tar.gz libg++-2.6.2.inst.tar.gz binutils-2.6.tar.gz
NOTE: See below for references to more recent versions of these files.
Uncompress the two 'inst' images, un-tar them to a temporary directory, then use Software Manager to install them.
The binutils package needs to be installed in to /usr/local/bin. This is not difficult to do, however, the tar file has (almost) all files under a directory called binutils-2.6 instead of under usr/local. This complicates the installation of the files within the binutils tar file slightly. Here in a nutshell is how to install binutils.
Make a temporary directory and cd in to it. Next untar the binutils file with 'tar xvfz binutils-2.6.tar.gz'. If you look at the directory you are in you should see only a binutils-2.6 directory. Cd to the binutils-2.6 directory. You will now see a few files and directories. These directories need to be copied to the /usr/local portion of your machine. The way I did this was to create a new tar file (using the command 'tar cvf ../new-binutils.tar .') and then cd to /usr/local and untar the file just created a moment ago.
The Installation, Links, Id, History, and README files are not needed and can be deleted from /usr/local.
At this point you should have a working compiler but you are still missing some files needed to link compiled source files into a working program. This is the part that gave me a lot of trouble until I came up with the solution shown in the next step.
NOTE: You will need /usr/local/bin in the search path in order to complete the rest of the steps listed below. You will also need to have this directory in the search path for any users intending to make use of the compiler.
The first file missing is the actual linker program which must be obtained from an SGI running version 5.3 of IRIX. Currently the linker on an SGI running version 6.2 of IRIX will not work. Now you know why I said you should read this document before upgrading to version 6.2 of IRIX.
The linker program needed can be found in /usr/cpu/sysgen/root/usr/lib and is called 'ld'. Copy this file from the machine running IRIX 5.3 into the /usr/local/bin directory on the machine running version 6.2. It should still be called 'ld'.
An attempt to generate an executable program at this point revealed a missing object file, namely, the crt1.o object file. Later you will discover one more missing object file.
I looked over the Linux source for libc to see what its crt1.o file does. It confirmed my suspicions of crt1.o being a critical piece of code. It is the file which contains a routine called by the startup initialization code from the C library and eventually calls the main() routine in your C program.
I was somewhat fed up with looking for a useable crt1.o and waiting for people who were going to look so I started to wonder if I could create something that might work.
I created a crt1.c file as shown here:
void start(void) { exit( main() ); }
The next step was to compile this file. This is not a catch-22 situation since only an object file is needed and not an executable program. I issued the command 'gcc -c crt1.c' to create the needed crt1.o file.
It was now time to try compiling a small, simple test program once again to see if I could generate a working program. I created a file called hello.c with the contents shown below. This is the (in?)famous "Hello, world" program.
#include <stdio.h> void main(void) { printf("Hello, world!\n"); }
I compiled this with GCC but when it tried to run the linker, I received a message that I needed crtn.o. My first thought was "Oh, no. Here we go again!".
I made another visit to the Linux libc source. It looked like this file simply contained various references to data and did not contain any actual code so I took a chance and created a zero length crtn.c file. You can create this file by using 'touch crtn.c'. I then compiled crtn.c to an object file. I tried to compile the "Hello, world" program again and this time link it with the two object files. This time I got an executable file. Hoorah!!
I took a deep breath and typed './hello'. I almost fell out of my chair when I saw "Hello, World!" appear on my screen and the program exited cleanly. (Actually, the first time I forgot the call to exit() in crt1 so it printed the message and blew up with a segmentation fault but it indicated I was on the right track.)
At this point I had the ability to turn C source files into executable program files. I copied the two object files (crt1.o and crtn.o) to the directory /usr/local/lib where they are expected to be at link time.
I ran some tests to see if environment variables and argc/argv handling was working. As far as I have been able to tell, they both work as expected. My fear was that the crt1 file was responsible for parsing the command line and creating the argv[] array and also for making the shell environment variables accessible but this seems to be the job of the startup code which is run before the code in crt1.o ever gets called. I breathed a sigh of relief.
I have successfully compiled and ran many programs (starting with the source code) including both the regular and SSL-based versions of the Apache web server (versions 1.1.1, 1.1.3, and 1.2.x), Samba, a POP3 mail server, the wrapper function needed for the majordomo mailing list program, and the CMU SNMP package. All of them are working properly (barring any actual software bugs which may be in the programs).
PLEASE NOTE: Although I appear to have a working version of crt1.o and crtn.o, these should be considered experimental. I don't know what these files do in the versions supplied with the IDO. There may be things I am not doing that might be needed under certain circumstances. So far, everything I have compiled and run seems to work properly. Your mileage may vary.
You may feel I have been a little long winded here but I felt that giving you the history of what I went through to get GCC up and running would make for reading considerably less dry than simple step-by-step "do this, do that" instructions.
I received an E-mail message from Ancil Bethelmy on March 17 indicating that inst packages are available for the 2.7.2 versions of GCC and libg++. They can be found at: http://Mat075207.student.utwente.nl/pub/SGI/tardist/Compilers/ and are listed as gcc-2.7.2.3 and libg++-2.7.2.1.
I have made available a pre-compiled copy of binutils-2.9.1 to be used with the above GCC and libg++ components. Also, if you do not have access to the linker program from version 5.3 of IRIX, then you should also get the linker files from Ariel's web site. To install the linker files and the binutils files, simply 'cd /' and then use tar to extract the files from the tar file.
I have recompiled all of the programs I originally compiled using the 2.6.3 compiler but not with the 2.9.1 version of binutils. I have experienced no problems using the newer compiler and the 2.6 version of binutils.