diff options
author | Alan Modra <amodra@gmail.com> | 2009-07-10 12:29:40 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2009-07-10 12:29:40 +0000 |
commit | 4135c73ba23d0cffa1970681780664624ba98026 (patch) | |
tree | e60d4697e960002f62687c12eb22b8fda7120ed2 /ld | |
parent | e054468f6cf120142dbfdf64226a5c6c09ecf998 (diff) | |
download | ppe42-binutils-4135c73ba23d0cffa1970681780664624ba98026.tar.gz ppe42-binutils-4135c73ba23d0cffa1970681780664624ba98026.zip |
* emultempl/ppc32elf.em (ppc_before_allocation): Turn on
linker relaxation if it might be necessary.
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 5 | ||||
-rw-r--r-- | ld/emultempl/ppc32elf.em | 33 |
2 files changed, 38 insertions, 0 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 5836c86107..8ffee59231 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,5 +1,10 @@ 2009-07-10 Alan Modra <amodra@bigpond.net.au> + * emultempl/ppc32elf.em (ppc_before_allocation): Turn on + linker relaxation if it might be necessary. + +2009-07-10 Alan Modra <amodra@bigpond.net.au> + * emulparams/elf32ppc.sh (GOTPLT, PLT): Handle .iplt. 2009-07-06 Matthias Klose <doko@ubuntu.com> diff --git a/ld/emultempl/ppc32elf.em b/ld/emultempl/ppc32elf.em index 1a93ed4492..b801df8697 100644 --- a/ld/emultempl/ppc32elf.em +++ b/ld/emultempl/ppc32elf.em @@ -112,7 +112,40 @@ ppc_before_allocation (void) } } } + gld${EMULATION_NAME}_before_allocation (); + + /* Turn on relaxation if executable sections have addresses that + might make branches overflow. */ + if (!command_line.relax) + { + bfd_vma low = (bfd_vma) -1; + bfd_vma high = 0; + asection *o; + + /* Run lang_size_sections (if not already done). */ + if (expld.phase != lang_mark_phase_enum) + { + expld.phase = lang_mark_phase_enum; + expld.dataseg.phase = exp_dataseg_none; + one_lang_size_sections_pass (NULL, FALSE); + lang_reset_memory_regions (); + } + + for (o = link_info.output_bfd->sections; o != NULL; o = o->next) + { + if ((o->flags & (SEC_ALLOC | SEC_CODE)) != (SEC_ALLOC | SEC_CODE)) + continue; + if (o->size == 0) + continue; + if (low > o->vma) + low = o->vma; + if (high < o->vma + o->size - 1) + high = o->vma + o->size - 1; + } + if (high > low && high - low > (1 << 25) - 1) + command_line.relax = TRUE; + } } EOF |