> > and the va_arg argument is used in several places inside, e.g. > > gi->custom_id = va_arg(ap, int); > > strncpy(gi->info_text, va_arg(ap, char *), max_textsize); > > gi->type = va_arg(ap, unsigned long); > > gi->deco.width = va_arg(ap, int); > > gi->deco.height = va_arg(ap, int); > > gi->design[GD_BUTTON_PRESSED].bitmap = va_arg(ap, Bitmap *); > > gi->event_mask = va_arg(ap, unsigned long); > > gi->callback_info = va_arg(ap, gadget_function); > > Somewhere, you left out one of the va_arg calls. It'll be using a char > or short argument. This is illegal C; only promoted types (int, > pointers, etc) may be given to va_arg.
The Bitmap* or gadget_function argument should be cast to void* I think. > > So this "undefined reference to __va_arg_type_violation", is it a known > > problem on the powerpc? Have others met it? Or does it mean the code has > > been written poorly? There's nothing obviously bad in the code that I can You must be using illegal types as arguments to va_arg (char, short, float, perhaps the pointers), that's what's bad. > > see, but I've never had to deal with powerpc or endian issues before (though > > I can't see any issues here). It works fine on x86. > > It works on x86 because x86 is a mostly unaligned architecture, that's > all :) Prepare for more breakage (run time, horrible stack corruption) after it compiles. Passing pointers to va_lists, using va_list_save = va_list instead of va_copy, all this makes for a fun debugging project. Lots of ix86 code using varargs isn't written portably, or even to the spec. Michael