From 98ece1b3139c38659c7016f41964663b3698b696 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sat, 8 Sep 2007 11:03:31 +0000 Subject: [PATCH] PR ld/2864, ld/5006 * elf.c (special_sections): Comment typo. (elf_fake_sections): Force SHT_PROGBITS for sections that are SHT_NOBITS if BFD section flags say they have contents. --- bfd/ChangeLog | 7 +++++++ bfd/elf.c | 32 ++++++++++++++++++++++---------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9366ed5d347..83c7a0cbfad 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2007-09-08 Alan Modra + + PR ld/2864, ld/5006 + * elf.c (special_sections): Comment typo. + (elf_fake_sections): Force SHT_PROGBITS for sections that are + SHT_NOBITS if BFD section flags say they have contents. + 2007-09-04 Michael Snyder * elf32-bfin.c (howto_table): Cut and paste error? diff --git a/bfd/elf.c b/bfd/elf.c index 16dd4a050f7..3ff33dda059 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -2084,7 +2084,7 @@ static const struct bfd_elf_special_section special_sections_t[] = static const struct bfd_elf_special_section *special_sections[] = { special_sections_b, /* 'b' */ - special_sections_c, /* 'b' */ + special_sections_c, /* 'c' */ special_sections_d, /* 'd' */ NULL, /* 'e' */ special_sections_f, /* 'f' */ @@ -2475,16 +2475,28 @@ elf_fake_sections (bfd *abfd, asection *asect, void *failedptrarg) /* If the section type is unspecified, we set it based on asect->flags. */ + if ((asect->flags & SEC_GROUP) != 0) + 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)) + sh_type = SHT_NOBITS; + else + sh_type = SHT_PROGBITS; + if (this_hdr->sh_type == SHT_NULL) - { - if ((asect->flags & SEC_GROUP) != 0) - 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; - else - this_hdr->sh_type = SHT_PROGBITS; + this_hdr->sh_type = sh_type; + else if (this_hdr->sh_type == SHT_NOBITS + && sh_type == SHT_PROGBITS + && (asect->flags & SEC_ALLOC) != 0) + { + /* Warn if we are changing a NOBITS section to PROGBITS, but + allow the link to proceed. This can happen when users link + non-bss input sections to bss output sections, or emit data + to a bss output section via a linker script. */ + (*_bfd_error_handler) + (_("section `%A' type changed to PROGBITS"), asect); + this_hdr->sh_type = sh_type; } switch (this_hdr->sh_type) -- 2.30.2