Alexander Voropay wrote: > <hellokishore@xxxxxxxxx> wrote: > > >>>However, if I compile the code with gcc3, it exits with the > >>>error "Cannot branch to unknown symbol". > > >On the other hand, if I replace > > > >bal jump_to_label > > > >by > > > >la t9, jump_to_label > >jalr t9 > > > >I don't see any warning. What could be the reason ? > > > 1) With "jal label " you'll have a MIPS_26 RELOC type in the ELF obj file: > > jal lablel > > 00000000 <.text>: > 0: 0c000000 jal 0x0 > 4: 00000000 nop > > RELOCATION RECORDS FOR [.text]: > OFFSET TYPE VALUE > 00000000 R_MIPS_26 label > > > 2) The "la r,label" is a syntetic inctruction wich expanded into two: > "lui r,%hi label ; addui r,%lo label". It gives you two RELOCs: > > la t0, label > jalr t0 > > 00000000 <.text>: > 0: 3c080000 lui t0,0x0 > 4: 25080000 addiu t0,t0,0 > 8: 0100f809 jalr t0 > c: 00000000 nop > > RELOCATION RECORDS FOR [.text]: > OFFSET TYPE VALUE > 00000000 R_MIPS_HI16 label > 00000004 R_MIPS_LO16 label > > 3) AFAIK (correct me), there is no MIPS-specific RELOC type for > the "branch" instruction format in the BFD, so "bal" to the *external* > symbols is impossible. There is R_MIPS_PC16 which was ill-defined (missing rightshift for the immediate) in the old ELF spec and thus unused. > May be, old gas generates something like RELOC_PCREL > for "bal external" ? Old gas/ld used R_MIPS_PC16 without reasonable range checking, IOW it broke silently for branch spans greater than +-32k. Implementing external branches for gas/ld with the correct R_MIPS_PC16 definition is somewhere on my TODO list but is unlikely to get priority any time soon. Thiemo