earleh@eleazar.dartmouth.edu (Earle R. Horton) (07/28/89)
I ran into this interesting bug when adapting Apple Sample Code
12, Signals, to use with Aztec C. The Aztec linker will not resolve
inter-module short branches in MPW object files correctly. (What kind
of pervert uses inter-module short branches, you say? Well, someone
at Apple seems to think they are real neat.)
Here's an example, the source is in MPW Assembler, and the object
file will be linked into an Aztec C program using "ln."
Junk.a:
FOO PROC EXPORT
IMPORT BAZ
NOP
BRA.S BAZ
NOP
ENDP
FOO2 PROC EXPORT
EXPORT BAZ
NOP
BAZ DC.W $A9FF ;_Debugger
NOP
ENDP
END
Assemble junk.a with MPW Asm, then link it as follows, then look
at the output.
asm junk.a
ln junk.a.o -o junk
dumpcode junk
...
00000000: 4E71 'Nq' NOP
00000002: 60FC '`.' BRA.S *-$0002 ;00000000
00000004: 5671 4E71 'VqNq' ADDQ.W #$3,$71(A1,D4.L*8)
00000008: A9FF '..' _Debugger ; A9FF
0000000A: 4E71 'Nq' NOP
Apparently, the Aztec linker just doesn't understand how to edit
this type of reference properly, since the resulting code is not
exactly what I had in mind. The solution is to change all such
branches into word branches, and re-assemble the source file.
Note that the bad code produced by the linker is in the form of
an infinite loop. There was a lot of wailing and gnashing of teeth
before I got this debugged, since the body of the bogus loop is not
always a NOP in real code!
Earle R. Horton