public inbox for binutils-cvs@sourceware.org
 help / color / mirror / Atom feed
From: Alan Modra <amodra@sourceware.org>
To: binutils-cvs@sourceware.org
Subject: [binutils-gdb] Memory corruption with USE_MMAP
Date: Thu,  4 Apr 2024 04:30:09 +0000 (GMT)	[thread overview]
Message-ID: <20240404043009.5C0253858C32@sourceware.org> (raw)

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;
 		    }

                 reply	other threads:[~2024-04-04  4:30 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240404043009.5C0253858C32@sourceware.org \
    --to=amodra@sourceware.org \
    --cc=binutils-cvs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).