I was inspired by NCommander’s MinGW to Solaris cross compiler so I thought I’d dig out the one that got me started decades ago, cross compiling to the RS/6000 from Linux some time back in 1993. For this experiment I was able to beg/borrow a copy of /usr/lib & /usr/include from AIX 3.2.5 and wanted to use that as a base. I decided to use GCC 22.214.171.124 and Binutils 2.11.2 as these were old enough t build somewhat easy enough from MinGW/MSYS 1, but I figured they also had the best luck of being able to parse the headers without needing ‘fixinc’.
I was able to build both binutils and GCC with this simple incanation
sh configure --target=ppc-ibm-aix325 --prefix=/aix3
One weird thing was that binutils completely sidestepped ld, so I had to configure that manually like this:
Also ‘eaixppc.c’ didn’t generate properly I had to rebuild binutils from Linux to get it to pick up and build that file, copy that back in to get a working cross linker. Older stuff has some issues with CR/LF from time to time, and sometimes it’s easier to deal with builds from other systems and pluck files as needed.
Surprisingly things built, and transferring the to my Qemu AIX image gave me this fun error:
exec(): 0509-036 Cannot load program /cdrom/demo/hello/hello because of the following errors:
0509-150 Dependent module libc.a(shr.o) could not be loaded.
0509-022 Cannot load module libc.a(shr.o).
0509-026 System error: A file or directory in the path name does not exist.
Surprisingly IBM has a fix!
# export LIBPATH=$LIBPATH:/usr/lib # /cdrom/demo/hello/hello hello world, compiled by GCC 126.96.36.199! #
Of course it’s not all sunshine and rainbows, bigger programs like the ‘87 Infocom interpreter bomb like this:
C:\aix3\demo\infocom>gcc -v -o infocom file.o funcs.o infocom.o init.o input.o interp.o io.o jump.o object.o options.o page.o print.o property.o support.o variable.o term.o
gcc version 188.8.131.52
ld -T512 -H512 -btextro -bhalt:4 -bnodelcsect -o infocom /aix3/lib/crt0.o -L/aix3/lib file.o funcs.o infocom.o init.o input.o interp.o io.o jump.o object.o options.o page.o print.o property.o support.o variable.o term.o /aix3/lib/libgcc.a -lc /aix3/lib/libgcc.a
ld: section .data [0000000000000000 -> 00000000000007ff] overlaps section .text [0000000000000200 -> 0000000000009b0b]
ld: section .loader [0000000000000000 -> 00000000000014a8] overlaps section .text [0000000000000200 -> 0000000000009b0b]
gcc: Internal compiler error: program ld got fatal signal 1
Initially I thought this was a problem with the GCC Linker, but after copying the objects to Qemu, and linking from there, I found out that the GNAT gcc driver calls the linker in a different manner:
ld -bpT:0x10000000 -bpD:0x20000000 -btextro -bnodelcsect -o infocom /aix3/lib/crt0.o file.o funcs.o infocom.o init.o input.o interp.o io.o jump.o object.o options.o page.o print.o property.o support.o variable.o term.o /aix3/lib/libgcc.a /aix3/lib/libc.a /aix3/lib/libgcc.a
Reformatted for my cross, but this produces a running executable.
And finally phoon which heavily relies on floating point math:
C:\aix3\demo\phoon>ld -bpT:0x10000000 -bpD:0x20000000 -btextro -bnodelcsect -o phoon /aix3/lib/crt0.o phoon.o date_parse.o astro.o /aix3/lib/libc.a /aix3/lib/libgcc.a /aix3/lib/libm.a
/aix3/lib/libm.a(atan2.o)(.pr+0x308):atan2.c: undefined reference to
__itrunc' /aix3/lib/libm.a(atan2.o)(.pr+0x33c):atan2.c: undefined reference to__itrunc'
/aix3/lib/libm.a(atan2.o)(.pr+0x3c4):atan2.c: undefined reference to `__itrunc'
I thought first I could just tack -lm onto the end. However remembering years ago, linkers ARE position dependent, and on AIX libm must come before libc.
ld -bpT:0x10000000 -bpD:0x20000000 -btextro -bnodelcsect -o phoon /aix3/lib/crt0.o phoon.o date_parse.o astro.o /aix3/lib/libm.a /aix3/lib/libgcc.a /aix3/lib/libc.a
And yep it runs!
Sadly networking is a bit goofed on 4.3.3, and Im unable to upload more than a few hundred bytes before a stall on the console so slip/ppp would be a bit useless.
Speaking of useless, if anyone is crazy enough, you can follow here: MinGW-AIX325.7z