+2005-10-24 Alan Modra <amodra@bigpond.net.au>
+
+ * elflink.c (elf_link_input_bfd): Don't use linker_mark and
+ SEC_EXCLUDE to test for sections dropped from output. Instead,
+ use bfd_section_removed_from_list on normal sections. Don't
+ attempt to handle symbols with unknown reserved section indices.
+ * linker.c (_bfd_generic_link_output_symbols): Don't use
+ linker_mark to test for symbols belonging to dropped sections.
+ Do allow absolute symbols.
+
2005-10-24 Alan Modra <amodra@bigpond.net.au>
* elf32-i370.c (i370_elf_fake_sections): Don't set SHF_EXCLUDE on
isec = bfd_com_section_ptr;
else
{
- /* Who knows? */
- isec = NULL;
+ /* Don't attempt to output symbols with st_shnx in the
+ reserved range other than SHN_ABS and SHN_COMMON. */
+ *ppsection = NULL;
+ continue;
}
*ppsection = isec;
continue;
/* If this symbol is defined in a section which we are
- discarding, we don't need to keep it, but note that
- linker_mark is only reliable for sections that have contents.
- For the benefit of the MIPS ELF linker, we check SEC_EXCLUDE
- as well as linker_mark. */
- if ((isym->st_shndx < SHN_LORESERVE || isym->st_shndx > SHN_HIRESERVE)
+ discarding, we don't need to keep it. */
+ if (isym->st_shndx != SHN_UNDEF
+ && (isym->st_shndx < SHN_LORESERVE || isym->st_shndx > SHN_HIRESERVE)
&& (isec == NULL
- || (! isec->linker_mark && (isec->flags & SEC_HAS_CONTENTS) != 0)
- || (! finfo->info->relocatable
- && (isec->flags & SEC_EXCLUDE) != 0)))
- continue;
-
- /* If the section is not in the output BFD's section list, it is not
- being output. */
- if (bfd_section_removed_from_list (output_bfd, isec->output_section))
+ || bfd_section_removed_from_list (output_bfd,
+ isec->output_section)))
continue;
/* Get the name of the symbol. */
/* If this symbol is in a section which is not being included
in the output file, then we don't want to output the
- symbol. .bss and similar sections won't have the linker_mark
- field set. We also check if its output section has been
- removed from the output file. */
- if (((sym->section->flags & SEC_HAS_CONTENTS) != 0
- && ! sym->section->linker_mark)
- || bfd_section_removed_from_list (output_bfd,
+ symbol. */
+ if (!bfd_is_abs_section (sym->section)
+ && bfd_section_removed_from_list (output_bfd,
sym->section->output_section))
output = FALSE;