Date: Thu, 17 May 2012 10:36:33 +0000 (UTC) From: Dimitry Andric <dim@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org Subject: svn commit: r235540 - stable/9/contrib/binutils/ld/emultempl Message-ID: <201205171036.q4HAaXuV091301@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: dim Date: Thu May 17 10:36:32 2012 New Revision: 235540 URL: http://svn.freebsd.org/changeset/base/235540 Log: MFC r235133: Revert r234656, and apply a proper fix for binutils PR 10474, which caused linking clang on 32-bit PowerPC to fail with "relocation truncated to fit: R_PPC_REL24" errors. Original diffs (relicensed under GPLv2 with permission from author): http://sourceware.org/git/?p=binutils.git;a=commit;h=1fd262ff7d7ea5adf4894c6b960e092e7e43e3cd http://sourceware.org/git/?p=binutils.git;a=commit;h=053c49fbff58bd33bd0d12200ea61302f92caceb Tested by: andreast Modified: stable/9/contrib/binutils/ld/emultempl/ppc32elf.em Directory Properties: stable/9/contrib/binutils/ (props changed) Modified: stable/9/contrib/binutils/ld/emultempl/ppc32elf.em ============================================================================== --- stable/9/contrib/binutils/ld/emultempl/ppc32elf.em Thu May 17 10:25:34 2012 (r235539) +++ stable/9/contrib/binutils/ld/emultempl/ppc32elf.em Thu May 17 10:36:32 2012 (r235540) @@ -119,7 +119,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 = output_bfd->sections; o != NULL; o = o->next) + { + if ((o->flags & (SEC_ALLOC | SEC_CODE)) != (SEC_ALLOC | SEC_CODE)) + continue; + if (o->rawsize == 0) + continue; + if (low > o->vma) + low = o->vma; + if (high < o->vma + o->rawsize - 1) + high = o->vma + o->rawsize - 1; + } + if (high > low && high - low > (1 << 25) - 1) + command_line.relax = TRUE; + } } EOF
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201205171036.q4HAaXuV091301>