aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2007-09-08 11:03:31 +0000
committerAlan Modra <amodra@gmail.com>2007-09-08 11:03:31 +0000
commit98ece1b3139c38659c7016f41964663b3698b696 (patch)
treedfd46e2ccbd76d953b7f1b19a3878cc549e8ca35 /bfd/elf.c
parent3b98f92378e902fa528bc66fe6b66d8c0fb029d0 (diff)
downloadgdb-98ece1b3139c38659c7016f41964663b3698b696.zip
gdb-98ece1b3139c38659c7016f41964663b3698b696.tar.gz
gdb-98ece1b3139c38659c7016f41964663b3698b696.tar.bz2
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.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r--bfd/elf.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/bfd/elf.c b/bfd/elf.c
index 16dd4a0..3ff33dd 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)