Problem setting the CONTENTS flag

Nick Clifton nickc@redhat.com
Tue Apr 25 16:37:00 GMT 2006


HI H.J.

> Here is an updated patch.

There are a couple of minor problems with this version of the patch:

> +  /* When we read a file or section BFD flags have been set, we don't
> +     need section type and flags unless it is a linker created section.
> +     They will be overridden in _bfd_elf_make_section_from_shdr
> +     anyway.  */
> +  if ((!sec->flags && abfd->direction != read_direction)
>        || (sec->flags & SEC_LINKER_CREATED) != 0)

I think that the comment could be reworded to be clearer.  For example:

   A section without any flags or with the SEC_LINKER_CREATED flag
   must have its type and other flags set.  Skip this for sections
   with no flags that have been read in, as this state must have been
   requested by the user, and it will be overridden by
   _bfd_elf_make_section_from_shdr anyway.

> -  /* FIXME: What if the output ELF section type has been set to
> -     something different?  */
> -  if (elf_section_type (osec) == SHT_NULL)
> +  /* Don't copy the output ELF section type from input if it has been
> +     set to something different.  */
> +  if (osec->flags == isec->flags || !osec->flags)
>      elf_section_type (osec) = elf_section_type (isec);

A section's type is not determined by its flags.  Therefore it seems to 
be counter-intuitive to be testing the flags when we are concerned about 
the type.   Also what happens if the output sections flags have been set 
to something other than the input section's flags, but the output 
section's type is SHT_NULL ?  According to the ELF spec this would mean 
that the flags are undefined as well.

I think that for this part of the patch the comment ought to be reworded 
and you ought to test for SHT_NULL and either change it or issue an 
error message.  eg:

   /* Copy the output ELF section type from the input section type if
      the output section flags were copied from the input, or if the
      output section has no type or flags.  */
   if (osec->flags == isec->flags
       || osec->flags == 0
       || elf_section_type (osec) == SHT_NULL)
    elf_section_type (osec) = elf_section_type (isec);


Cheers
   Nick




More information about the Binutils mailing list