public inbox for binutils-cvs@sourceware.org
 help / color / mirror / Atom feed
* [binutils-gdb] Memory corruption with USE_MMAP
@ 2024-04-04  4:30 Alan Modra
  0 siblings, 0 replies; only message in thread
From: Alan Modra @ 2024-04-04  4:30 UTC (permalink / raw)
  To: binutils-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=b43b352837ea11af64ea83754b06f0e8d335706e

commit b43b352837ea11af64ea83754b06f0e8d335706e
Author: Alan Modra <amodra@gmail.com>
Date:   Thu Apr 4 14:39:14 2024 +1030

    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.

Diff:
---
 bfd/elflink.c | 55 ++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 32 insertions(+), 23 deletions(-)

diff --git a/bfd/elflink.c b/bfd/elflink.c
index dd7ae1705b6..fa1f1273d15 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;
 		    }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-04-04  4:30 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-04  4:30 [binutils-gdb] Memory corruption with USE_MMAP Alan Modra

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).