http://sourceware.org/bugzilla/show_bug.cgi?id=12494
--- Comment #8 from Bjoern Haase <bjoern.m.haase at web dot de> 2011-07-26 15:26:13 UTC --- Maybe the two following hints are helpful: 1.) As a fast fix, there is a command line switch for the linker that disables the problematic rcall ret optimization. Execute your avr-ld with "-h" and you get the information on the options to configure the relaxation optimization. 2.) The source of the problem is that the present relaxation algorithm does not check wether relocations point to the return instruction. The place to fix the issue is the file bfd/elf32-avr.c and the function to place the fix is static bfd_boolean elf32_avr_relax_section (bfd *abfd, asection *sec, struct bfd_link_info *link_info, bfd_boolean *again) The part of the function to fix is around line 1912 where the relaxation algorithm tries to identify call/ret and rcall/ret sequences. #code fragment to look for /* Here we look for rcall/ret or call/ret sequences that could be safely replaced by rjmp/ret or jmp/ret. */ #end of code fragment What is missing is code that checks wether there is somebody actually needing the seemingly useless ret instruction before it is deleted. Code that does this job can be taken from the code part some lines later that deletes ret instructions that immediately follow jumps and rjmps. Note that one needs to check for three possible uses of the "ret" instruction a) global labels refering to the ret b) local labels refering to the ret c) relocations refering to the ret The required code already exists and the method for these checks could be taken from about line 2062 #code fragment to look for /* We now only have to make sure that there is no local label defined at the address of the ret instruction and that there is no local relocation in this section pointing to the ret. */ int deleting_ret_is_safe = 1; unsigned int section_offset_of_ret_insn = irel->r_offset + insn_size; Elf_Internal_Sym *isym, *isymend; unsigned int sec_shndx; sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec); /* Check for local symbols. */ .... /* Now check for global symbols. */ .... /* Now we check for relocations pointing to ret. */ .... #end of code fragment Since these checks obviously are required at three places, it might be useful to move the checking code above to a seperate function, in order to avoid code duplication. HTH, Björn. -- Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are on the CC list for the bug. _______________________________________________ bug-binutils mailing list bug-binutils@gnu.org https://lists.gnu.org/mailman/listinfo/bug-binutils