Short: Make MorphOS GCC output WarpOS binaries
Author: dennisvdboon -> gmail (Dennis Boon)
Uploader: dennisvdboon gmail com (Dennis Boon)
Architecture: ppc-morphos >= 3.10
IT IS RECOMMENDED TO USE A CLEANLY INSTALLED MORPHOS SDK 3.12!
The files in this archive will let you develop for WarpOS on a MorphOS
machine. When looking at the warpup/powerup gcc compiler version 2.95.3
I noticed that it was actually a powerup compiler with the warpup extensions
bolted on top of it using a custom gcc spec file.
As powerup evolved into MorphOS, they actually use the same ABI. The only
difference as I can tell is the __abox__ symbol being present in MorphOS
binaries and not in powerup ELF binaries.
So I adapted the spec files for various MorphOS gcc compilers firstly of SDK
version 3.10 and later 3.12. I also recompiled warpcollect for MorphOS.
Adaptations were also made to some of the powerup macros to let the newer
gcc compilers (4+) accept them (clobbers and such).
When invoking the gcc compiler for Morphos with the --specs=warpup option,
instead of linking with the default linker (for example collect2) warpcollect
is invoked which in its turn invokes Elf2Exe2 This will result in a WarpOS
gcc --specs=warpup -O2 helloworld.c -o helloworld.exe
Or for configure for example:
CFLAGS="--specs=warpup -O2" CPPFLAGS=--specs=warpup LDFLAGS=--specs=warpup
CXXFLAGS="-specs=-warpup -O2" ./configure
To select a compiler use gccselect. Valid arguments are 2.95.3, 4.4.5, 5 and 6.
will select version 4.4.5 of gcc/g++ as your compiler. The gccselect script
is as a default stored in the parent dir of GG. It comes with the SDK.
At the moment the library looks for NOIXPATHS in ENVARC:. If set to 1 all
paths are converted to Amiga format. /GG becomes GG: for example.
- The 4.4.5 compiler that comes with SDK 3.10 seems to have a problem with the
built-in mfpr library and often throws an error when used with g++.
- Don't forget to use the #pragma pack(2) / pack() combo when using AmigaOS
structures (that is, anything included from os-includeppc).
- Even better would be #pragma pack(push,2) / pack(pop) combo.
- Without the --specs=warpup option it should probably still compile correctly
for MorphOS, but is not longer actively supported since version 0.8.
- This has only been tested with the gcc compilers included with SDK 3.12.
- This is a work in progress. Stuff might be broken.
- COMPILED PROGRAMS WILL MAYBE NOT WORK (correctly) ON MOS. Make sure to
also test on a Classic PPC machine with WarpOS. Default stack on real WarpOS
and MOS systems is mostly insufficient (1-4KB). You may need to increase
stack to make a program work.
- Now you can use the more up-to-date binutils of MorphOS.
- Use of the newer compilers 4.4.5, 5.5.0 and 6.4.0 for C and C++ (compared
to the old 2.95.3)
- Statically compiled mpfr library in 4.4.5 seems to crash a lot during use
of g++. Use 5.5.0./6.4.0. when that happens.
- WarpOS uses a modified PowerOpen ABI while gcc uses SVR4 ABI. It can lead
to stack troubles when switching between the two. It is a first thing to
look at when stuff crash. That being said, I already compiled a lot with
these compilers and the only problem showed in minigl/Warp3D where a lot
of libraries are called in a row. A quick fix was put in place in
powerpc/warpup_macros.h for this.
- You cannot use g++ of the newer compilers with libnix, only newlib.
- The internal errors of bsdsocket.library and newlib differ in some places.
To this end, two errno.h files are added. The original with just EAGAIN
adjusted and a modified AmiTCP (errno.h_bsdsocket).
Changes from 0.8:
- Wrangler fixed the SDL CD-ROM functions in libSDL_wos.a (newlib).
- Added libSDL_net (untested - newlib).
- Fixed ftruntace which used file pointer (fp) instead of
file descriptor (fd) (newlib).
- Added accept, bind, connect, gethostbyaddr, gethostbyname, gethostid,
getnetbyaddr, getnetbyname, getpeername, getprotobyname, getprotobynumber,
getservbyname, getservbyport, getsockname, getsockopt, inet_addr,
inet_lnaof, inet_makeaddr, inet_netof, inet_network, inet_ntoa, listen,
setprogname, getprogname, umask, recv, recvfrom, recvmsg, send, sendmsg,
sendto, setsockopt, shutdown, socket, select, ioctl, getlogin, getpwnam,
getpwuid, fsync, ffs, getdtablesize, dup, dup2, fcntl.
-> Thanks to Frank Wille for PosixLib on which this was based! (newlib)
- Updated close, read, write to handle sockets (newlib).
- Updated dir functions readdir, opendir, rewinddir and closedir and updated
associated includes (dirent.h - newlib).
- Added various includes for sockets (newlib).
- Opening, closing, reading and writing now done through fd (as intended)
and not DOS filehandles (fh). Idea/source taken from Bebbo's newlib.
- Updated pwd.h, grp.h to be bsdsocket.library compatible (newlib)
- Updated errno.h with EAGAIN = 35 (newlib) - SEE KNOWN BUGS
- All memory allocated with malloc now freed upon exiting program (newlib).
- Fixed an error in the specs file of 4.4.5.
Changes from 0.7:
- Fixed calloc. It was not clearing memory. WOS executables compiled with
newlib now behave far better on MOS.
- Added more libnix support for the newer compilers:
- Added a new include dir /gg/include-std
- Renamed /gg/ppc-amigaos/lib/2.95 to /gg/ppc-amigaos/lib/libnix
- Old 2.95 dir can be deleted.
- Updated warpnix specs file accordingly.
- Fixed various bugs in libSDL_wos and updated it for both newlib and libnix.
- Added sleep, getppid.
Changes from 0.6:
- Improved the MOS hang workaround: Less 68K OS Calls.
- Added dirname, chdir, execl, execle, execlp, execve, execvp.
- Replaced gcc 5.3.0 files with 5.5.0.
- Removed experimental gcc 2.95.4.
- Added gcc 6.4.0 files.
- Made several fixes (hopefully) to libSDL_wos.
- Enabled Altivec code.
- Added CD-ROM support.
- Fixed joystick support.
- Fixed endianness problem.
- Renamed libnosys to libglosswos and adjusted specs files accordingly.
- General clean-up.
- THIS UPDATE NEEDS A CLEANLY INSTALLED MORPHOS SDK 3.12!
Changes from 0.5:
- Added ftruncate, readlink, realpath, nanosleep, usleep, kprintf.
- Added --specs=warpnix if you want to use libnix with 4.4.5/5.3.0.
- Fixed various bugs including but not all:
- Newlib now correctly uses 32 bit for time_t.
- Closing stderr on MOS caused a hang on MOS. Implemented a work around.
- Now unix paths are also correctly converted by mkdir in libnix.
- Included correct/up-to-date Warp3D includes this time.
Changes from 0.4:
- Separated 2.95 and 4.4.5/5.3.0 libs and updated specs files accordingly.
- Added specs file, includes and compiled libs for 5.3.0.
- Now you should use --specs=warpup option instead of the -warpup option.
- Fixed an error in the 4.4.5 specs file. os-includeppc and -DWARPUP were
- Compiled newlib for WarpOS. It's the default c lib for 4.4.5 and 5.3.0.
Default for 2.95.x is still libnix.
- Compiled libgcc of the 4.4.5 package for WarpOS and added it for 4.4.5 and
5.3.0 (called libgccwos.a).
- Compiled libstdc++ of the 5.3.0 package for WarpOS and added it for 4.4.5
- Newlib includes are in gg:/ppc-amigaos/newlib/include/
- Libs for 4.4.5/5 are in gg:/ppc-amigaos/newlib/lib/
- Fixed the semaphore functions in SDL Threads. They now put tasks in waiting
states instead of performing busy-wait loops.
- Added minigl library and updated includes (called libmgl.a).
- Updated/corrected the Warp3D includes.
- WarpOS macros now reserve a bit more stack to prevent callback issues.
- Recompiled most of the libs with 5.3.0.
- Removed libSDL_sound.a from 4.4.5/5.3.0. Obsolete and didn't work.
- -WARPUP IS NO LONGER GUARANTEED TO WORK. USE --SPECS=WARPUP INSTEAD!
Changes from 0.3:
- Both libnix 2 and 3 are missing __stdfiledes. DO NOT USE THIS IN YOUR
CODE. I've added __get_handle and __set_handle to circumvent some
of the issues with this.
- Added CPUF_G3 and CPUF_G4 to powerpc.h.
- Added RawDoFmtPPC to powerpc_protos.h (already in 0.3).
- Added ftruncate to libnix.
- Removed double truncate (in truncate.c and open.c) from libnix).
- Added libiconv.a (already in 0.3).
- Full screen from libSDL_wos was not working in 1.2.14. Reverted for
video code back to 1.2.6. (already in 0.3)
- Added Morgoth's experimental 2.95.4 compiler (version 4 with Altivec).
Use gccselect 2.95.4 to use it.
- Fixed stristr/strcasestr. It was pointing to a 68k utility.library function.
Changes from 0.2:
- Compiled libnix for WarpOS and added it as libcwos.a.
- Compiled the math functions from clib2 and added it to libcwos.a.
- Added (obsolete?) libSDL_sound.a.
- Removed obsolete libsmpeg.a; use libmad instead.
- Recompiled/updated the other libs.
- Added freetype-config and libpng-config to /bin.
- Added -woslibs as option to link in all libs in the correct sequence.
Changes from 0.1:
- Specfile for 4.4.5 was incorrect. A long line was wrapped.
- Added various (updated) libs and headers.
- Specfile for 2.95.3 was incorrect. Reversed libgccwos and libcwos link
- If the Elf2Exe2 source can be supplied, any host with target ppc-morphos
could compile also for WarpOS. Please let me know if you have it or know
where to find it (It actually already can. but you would have to invoke
- Please report stuff that doesn't work to me. It would be even better if you
could also supply the fix :-) I'll then re-upload a fixed version.