aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2024-04-04 14:39:14 +1030
committerAlan Modra <amodra@gmail.com>2024-04-04 14:43:49 +1030
commitb43b352837ea11af64ea83754b06f0e8d335706e (patch)
treea278179c668f9235ac8903a61ebbcf08f6dfdc7c /bfd
parent0ab0435fe672b76f0efb8814594b65c8e968d983 (diff)
downloadgdb-b43b352837ea11af64ea83754b06f0e8d335706e.zip
gdb-b43b352837ea11af64ea83754b06f0e8d335706e.tar.gz
gdb-b43b352837ea11af64ea83754b06f0e8d335706e.tar.bz2
Memory corruption with USE_MMAP
mips64-linux-gnuabi64 +FAIL: GOT page 4 (two files) mipsel-linux-gnu +FAIL: GOT page 4 (two files) mipsisa32el-linux-gnu +FAIL: GOT page 4 (two files) mips-linux-gnu +FAIL: GOT page 4 (two files) powerpc64-freebsd +FAIL: relocatable relaxing large powerpc64le-linux-gnu +FAIL: relocatable relaxing large powerpc64-linux-gnu +FAIL: relocatable relaxing large powerpc-eabisim +FAIL: relocatable relaxing large powerpc-eabivle +FAIL: relocatable relaxing large powerpc-freebsd +FAIL: relocatable relaxing large powerpcle-elf +FAIL: relocatable relaxing large powerpc-linux-gnu +FAIL: relocatable relaxing large * elflink.c (bfd_elf_final_link): Heed bed->use_mmap when sizing buffers, not just USE_MMAP.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/elflink.c55
1 files changed, 32 insertions, 23 deletions
diff --git a/bfd/elflink.c b/bfd/elflink.c
index dd7ae17..fa1f127 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -12490,18 +12490,23 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
section, so that we know the sizes of the reloc sections. We
also figure out some maximum sizes. */
#ifdef USE_MMAP
- /* Mmap is used only if section size >= the minimum mmap section
- size. The initial max_contents_size value covers all sections
- smaller than the minimum mmap section size. It may be increased
- for compressed or linker created sections or sections whose
- rawsize != size. max_external_reloc_size covers all relocation
- sections smaller than the minimum mmap section size. */
- max_contents_size = _bfd_minimum_mmap_size;
- max_external_reloc_size = _bfd_minimum_mmap_size;
-#else
- max_contents_size = 0;
- max_external_reloc_size = 0;
+ if (bed->use_mmap)
+ {
+ /* Mmap is used only if section size >= the minimum mmap section
+ size. The initial max_contents_size value covers all sections
+ smaller than the minimum mmap section size. It may be increased
+ for compressed or linker created sections or sections whose
+ rawsize != size. max_external_reloc_size covers all relocation
+ sections smaller than the minimum mmap section size. */
+ max_contents_size = _bfd_minimum_mmap_size;
+ max_external_reloc_size = _bfd_minimum_mmap_size;
+ }
+ else
#endif
+ {
+ max_contents_size = 0;
+ max_external_reloc_size = 0;
+ }
max_internal_reloc_count = 0;
max_sym_count = 0;
max_sym_shndx_count = 0;
@@ -12538,9 +12543,10 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
#ifdef USE_MMAP
/* Mmap is used only on non-compressed, non-linker created
sections whose rawsize == size. */
- if (sec->compress_status != COMPRESS_SECTION_NONE
- || (sec->flags & SEC_LINKER_CREATED) != 0
- || sec->rawsize != sec->size)
+ if (!bed->use_mmap
+ || sec->compress_status != COMPRESS_SECTION_NONE
+ || (sec->flags & SEC_LINKER_CREATED) != 0
+ || sec->rawsize != sec->size)
#endif
{
if (sec->rawsize > max_contents_size)
@@ -12592,17 +12598,20 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
if ((sec->flags & SEC_RELOC) != 0)
{
-#ifndef USE_MMAP
- size_t ext_size = 0;
+#ifdef USE_MMAP
+ if (!bed->use_mmap)
+#endif
+ {
+ size_t ext_size = 0;
- if (esdi->rel.hdr != NULL)
- ext_size = esdi->rel.hdr->sh_size;
- if (esdi->rela.hdr != NULL)
- ext_size += esdi->rela.hdr->sh_size;
+ if (esdi->rel.hdr != NULL)
+ ext_size = esdi->rel.hdr->sh_size;
+ if (esdi->rela.hdr != NULL)
+ ext_size += esdi->rela.hdr->sh_size;
- if (ext_size > max_external_reloc_size)
- max_external_reloc_size = ext_size;
-#endif
+ if (ext_size > max_external_reloc_size)
+ max_external_reloc_size = ext_size;
+ }
if (sec->reloc_count > max_internal_reloc_count)
max_internal_reloc_count = sec->reloc_count;
}