This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: PATCH: Fix the relax finalize pass
On Wed, May 14, 2003 at 05:05:58PM -0700, H. J. Lu wrote:
> On Thu, May 15, 2003 at 09:23:47AM +0930, Alan Modra wrote:
> > On Wed, May 14, 2003 at 04:28:38PM -0700, H. J. Lu wrote:
> > > On Thu, May 15, 2003 at 08:52:15AM +0930, Alan Modra wrote:
> > > > On Wed, May 14, 2003 at 03:53:46PM -0700, H. J. Lu wrote:
> > > > > The problem is linker keeps changing data segment address after the
> > > > > relax finalize pass starts. It makes the GP calculation in the relax
> > > > > finalize pass invalid. This patch tries to avoid it.
> > > >
> > > > Huh? When relax_finalize is set, you shouldn't be changing the size
> > > > of any sections.
> > > >
> > >
> > > That is what my patch tries to do. When the relax finalize is about to
> > > start, exp_data_seg.phase may be set to exp_dataseg_adjust during the
> > > last iteration. As the result, the data segment address may change.
> > > Also relax_finalize is not checked by lang_size_sections which will
> > > try to save a page whenever it has a chance.
> >
> > My point was that the backend shouldn't be changing sizes during
> > relax_finalize. If it does, then of course the generic parts of the
> > linker will also change sizes.
> >
>
> The ia64 backend does reduce got size in this case. But it is not
> the problem here. The problem is lang_process something like
>
> loop:
> lang_reset_memory_regions
> lang_do_assignments
> lang_size_sections
> ...
> goto looop
>
> lang_size_sections may set exp_data_seg.phase to exp_dataseg_adjust
> so that in the next iteration, fold_binary does
>
> if (exp_data_seg.phase != exp_dataseg_adjust)
> ...
> else if (commonepage < maxpage)
> adjust data segment address
>
> If exp_data_seg.phase is exp_dataseg_adjust when the relax finalize
> is about to start, the data segment address may be changed by
> fold_binary.
Hmm, reading back over what you said originally, I think the real
problem is the way the ia64 backend sets GP. The relax machinery
shouldn't be setting the final value for GP. Try making
elfNN_ia64_choose_gp return a gp value, and only call _bfd_set_gp_val
in elfNN_ia64_final_link.
--
Alan Modra
IBM OzLabs - Linux Technology Centre