; This is a simple macro with label math in it. The linker gets ; screwed up if the label it uses is imported. #define IMMUR(lbl,s,reg) .label L_##lbl ! bl .+8,reg ! \ IMMU(lbl-L_##lbl-8,s) ! \ add s,reg,reg ; To fix it I needed to use this: #define IMMUR_imported(lbl,s,reg) \ IMMU(lbl,s) ! IMMU(L_##lbl+8,reg) ! \ sub s,reg,s ! \ .label L_##lbl ! bl .+8,reg ! \ add s,reg,reg ################################################## Postscript - is this really a linker bug? Is it the linkers responsibility to do math? I don't think so - the linker doesn't have to do the math if the label isn't imported - the assembler does it.