This takes care of -mid-shared-library requirements for code generated by m68k_output_mi_thunk(). NOTE: the generated assembly code clobbers %a1. I don't know whether this is safe. diff -Npr -U10 gcc-3.3.1.orig/gcc/config/m68k/m68k.c gcc-3.3.1/gcc/config/m68k/m68k.c --- gcc-3.3.1.orig/gcc/config/m68k/m68k.c 2003-07-25 00:35:34.000000000 +0200 +++ gcc-3.3.1/gcc/config/m68k/m68k.c 2003-07-25 00:36:14.000000000 +0200 @@ -4181,40 +4181,44 @@ m68k_output_mi_thunk (file, thunk, delta #endif } xops[0] = DECL_RTL (function); /* Logic taken from call patterns in m68k.md. */ if (flag_pic) { if (TARGET_PCREL) fmt = "bra.l %o0"; - else + else if ((flag_pic == 1) || TARGET_68020) { #ifdef MOTOROLA #ifdef HPUX_ASM fmt = "bra.l %0"; #else #ifdef USE_GAS fmt = "bra.l %0@PLTPC"; #else fmt = "bra %0@PLTPC"; #endif #endif #else #ifdef USE_GAS fmt = "bra.l %0"; #else fmt = "jra %0,a1"; #endif #endif } + else if (optimize_size || TARGET_ID_SHARED_LIBRARY) + fmt = "move.l %0@GOT(%%a5), %%a1\n\tjmp (%%a1)"; + else + fmt = "lea %0-.-8,%%a1\n\tjsr 0(%%pc,%%a1)"; } else { #if defined (MOTOROLA) && !defined (USE_GAS) #ifdef MOTOROLA_BSR fmt = "bra %0"; #else fmt = "jmp %0"; #endif #else