PR24015, glibc-2.28 on little-endian mips32 broken
Commit 2bf2bf23da
exposed a bug on targets that create common sections
other than the standard ELF SHN_COMMON. If these are output by ld -r,
then their type becomes SHT_PROGBITS unless the target handles them
specially (eg. by elf_backend_special_sections), and if they are
merged into .bss/.sbss by ld -r then that section becomes SHT_PROGBITS.
Worse, if they are output by ld -r, then their size is increased by
bfd_generic_define_common_symbol during final link, which leads to
bogus file contents being copied to output.
For mips, it seems to me that the .scommon section should not be
output for ld -r, but I haven't made that change in this patch.
PR 24015
* elf.c (bfd_elf_get_default_section_type): Make common sections
SHT_NOBITS.
* linker.c (bfd_generic_define_common_symbol): Clear
SEC_HAS_CONTENTS.
This commit is contained in:
parent
cb87d9f1a4
commit
0e41bebb93
@ -1,3 +1,11 @@
|
||||
2018-12-28 Alan Modra <amodra@gmail.com>
|
||||
|
||||
PR 24015
|
||||
* elf.c (bfd_elf_get_default_section_type): Make common sections
|
||||
SHT_NOBITS.
|
||||
* linker.c (bfd_generic_define_common_symbol): Clear
|
||||
SEC_HAS_CONTENTS.
|
||||
|
||||
2018-12-28 Alan Modra <amodra@gmail.com>
|
||||
|
||||
PR 23966
|
||||
|
@ -3127,7 +3127,7 @@ _bfd_elf_init_reloc_shdr (bfd *abfd,
|
||||
int
|
||||
bfd_elf_get_default_section_type (flagword flags)
|
||||
{
|
||||
if ((flags & SEC_ALLOC) != 0
|
||||
if ((flags & (SEC_ALLOC | SEC_IS_COMMON)) != 0
|
||||
&& (flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
|
||||
return SHT_NOBITS;
|
||||
return SHT_PROGBITS;
|
||||
|
@ -3119,7 +3119,7 @@ bfd_generic_define_common_symbol (bfd *output_bfd,
|
||||
/* Make sure the section is allocated in memory, and make sure that
|
||||
it is no longer a common section. */
|
||||
section->flags |= SEC_ALLOC;
|
||||
section->flags &= ~SEC_IS_COMMON;
|
||||
section->flags &= ~(SEC_IS_COMMON | SEC_HAS_CONTENTS);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user