From e999e5f9056a9d2f103e4c6b80afc880c4818966 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Fri, 30 Apr 2004 15:04:30 +0000 Subject: [PATCH] 2004-04-30 H.J. Lu * elf.c (bfd_section_from_shdr): Maintain the section order in a section group. (special_sections): Add ".note.GNU-stack". (elf_fake_sections): Handle section group for relocatable link.. --- bfd/ChangeLog | 8 ++++++++ bfd/elf.c | 31 +++++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 1a431dad1..e7f9d7a46 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,13 @@ 2004-04-30 H.J. Lu + * elf.c (bfd_section_from_shdr): Maintain the section order in + a section group. + (special_sections): Add ".note.GNU-stack". + (elf_fake_sections): Handle section group for relocatable + link.. + +2004-04-30 H.J. Lu + * section.c (bfd_sections_find_if): New. * bfd-in2.h: Regenerated. diff --git a/bfd/elf.c b/bfd/elf.c index 159e040b4..00443c2cc 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -1951,8 +1951,10 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex) hdr->bfd_section->flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD; + /* We try to keep the same section order as it comes in. */ + idx += n_elt; while (--n_elt != 0) - if ((s = (++idx)->shdr->bfd_section) != NULL + if ((s = (--idx)->shdr->bfd_section) != NULL && elf_next_in_group (s) != NULL) { elf_next_in_group (hdr->bfd_section) = s; @@ -2060,6 +2062,7 @@ static struct bfd_elf_special_section const special_sections[] = { ".gnu.version", 12, 0, SHT_GNU_versym, 0 }, { ".gnu.version_d", 14, 0, SHT_GNU_verdef, 0 }, { ".gnu.version_r", 14, 0, SHT_GNU_verneed, 0 }, + { ".note.GNU-stack",15, 0, SHT_PROGBITS, 0 }, { ".note", 5, -1, SHT_NOTE, 0 }, { ".rela", 5, -1, SHT_RELA, 0 }, { ".rel", 4, -1, SHT_REL, 0 }, @@ -2392,7 +2395,31 @@ elf_fake_sections (bfd *abfd, asection *asect, void *failedptrarg) asect->flags. */ if (this_hdr->sh_type == SHT_NULL) { - if ((asect->flags & SEC_ALLOC) != 0 + if ((asect->flags & SEC_GROUP) != 0) + { + /* We also need to mark SHF_GROUP here for relocatable + link. */ + struct bfd_link_order *l; + asection *elt; + + for (l = asect->link_order_head; l != NULL; l = l->next) + if (l->type == bfd_indirect_link_order + && (elt = elf_next_in_group (l->u.indirect.section)) != NULL) + do + { + /* The name is not important. Anything will do. */ + elf_group_name (elt->output_section) = "G"; + elf_section_flags (elt->output_section) |= SHF_GROUP; + + elt = elf_next_in_group (elt); + /* During a relocatable link, the lists are + circular. */ + } + while (elt != elf_next_in_group (l->u.indirect.section)); + + this_hdr->sh_type = SHT_GROUP; + } + else if ((asect->flags & SEC_ALLOC) != 0 && (((asect->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0) || (asect->flags & SEC_NEVER_LOAD) != 0)) this_hdr->sh_type = SHT_NOBITS; -- 2.11.4.GIT