I can see the problem at line 813 of zcc.c. The default case was made to abort so that errors generated later on for unknown file types would not be so cryptic as noted in another bug report. The fix is the get_filetype_by_suffix() function should have a *.o case for object files added. I'll fix this later this evening before the nightly build but just in case dom has a go, I'll leave this note here
The other thing with makefiles is you probably have to use the -preserve flag when building the *.o files. The reason is zcc creates a "zcc_opts.def" file that communicates options it finds in c source to the crt. The -preserve flag makes sure the zcc invocations for object files add to that file rather than delete the file on each run. Then another question is when do you erase that zcc_opts.def file? For classic c lib builds, it would have to be during a make clean and you'd want to do a make clean if you got strange errors like printf not working.
Ok, I dont hurry. If you need more time for analysing and fixing you have it.
For me it is important that problem is known and somebody is working about it.