This is the mail archive of the
binutils@sourceware.cygnus.com
mailing list for the binutils project.
Re: PATCH for uninitialized junk in .dynsym
- To: mark@codesourcery.com
- Subject: Re: PATCH for uninitialized junk in .dynsym
- From: Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
- Date: Wed, 16 Jun 1999 00:30:13 +0200
- Cc: ian@zembu.com,binutils@sourceware.cygnus.com,geoffk@ozemail.com.au
- References: <19990615151350H.mitchell@codesourcery.com>
Am Mit, 16 Jun 1999 schrieb mark@codesourcery.com:
>>>>>> "Franz" == Franz Sirl <Franz.Sirl-kernel@lauterbach.com> writes:
>
> Franz> That didn't help :-(. And I don't think this is correct
> Franz> either. dynindx is checked against -1 all over the
> Franz> place.
>
>That's the for hash-table entries, though, not for sections. I
>believe sections have their dynindices initialized to zero.
>
> Franz> And AFA I could see dynindx entries containing eg. 2 were
> Franz> zeroed too, decremented by one on every call.
>
>The idea is that the PPC back-end is assigning dynindices to most
>sections, in ouput order. So:
>
> Section Index Dynamic Index
> section 1 -1
> section 2 1
> section 3 -1
> section 4 2
> section 5 3
> ...
>
>Now, if we remove sections with section index 2 and 4, say, section 5,
>which used to have dynamic index 3, should now have dynamic index 1.
>But, the -1s will make it have dynamic index -1!
>
>Still, if you say that didn't fix it, I'm not sure what *else* is
>causing problems. But, I am sure the -1 there will conflict with the
>assumptions in the code I checked in; either that code is wrong, or
>the ppc back-end is, now. There are indeed other places in the PPC
>back-end where -1 is used for sections; these shold be changed to.
>Here's one:
>
> for (s = output_bfd->sections; s != NULL; s = s->next)
> {
> int indx, dindx;
>
> sym.st_value = s->vma;
>
> indx = elf_section_data (s)->this_idx;
> dindx = elf_section_data (s)->dynindx;
> if (dindx != -1)
> {
> BFD_ASSERT(indx > 0);
> BFD_ASSERT(dindx > 0);
>
> if (dindx > maxdindx)
> maxdindx = dindx;
>
> sym.st_shndx = indx;
>
> bfd_elf32_swap_symbol_out (output_bfd, &sym,
> (PTR) (((Elf32_External_Sym *)
> sdynsym->contents)
> + dindx));
> }
>
>Make that -1 a zero. Note that this code implies that zero is not a
>valid value; it uses `BFD_ASSERT (dindx > 0)'.
Ok, this one turned the testsuite results back to normal, but I'm not feeling
comfortable...
Franz.