This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: Problem setting the CONTENTS flag
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