More testing shows that if I restore two-level namespace linking for OS X the resulting Pike works fine again. This means switching from
LDSHARED="$REALCC $CFLAGS -bundle -bind_at_load -flat_namespace -undefined suppress"
to
LDSHARED="$REALCC $CFLAGS -bundle -bind_at_load -undefined dynamic_lookup"
combined with "export MACOSX_DEPLOYMENT_TARGET=10.4".
In src/configure.in r1.568 Grubba added Bill's patch for bug #2820 which forced flat namespace (i.e. the OS X 10.0 default link mode). This bug ticket says:
After considerable fiddling, it appears that it will be necessary to use the flat namespace when compiling for Darwin (ask me offline if you need specific examples and reasons).
Bill, can you recall the rationale for this change? Otherwise one solution is to switch to my alternate LDSHARED above.
Separately Grubba and Agehall have identified a GCC visibility pragma that may solve this particular issue in image_jpeg.c and image_tiff.c. I'm rebuilding again (poor slow G4 laptop :-) and will soon report the results. Still, this would only fix the identified problem and not future issues caused by multiple symbols in other places.