Committed: mmo.c: Fix ld testsuite regression "objcopy executable (pr25662)".

Message ID alpine.BSF.2.20.16.2003312212580.36620@arjuna.pair.com
State New
Headers show
Series
  • Committed: mmo.c: Fix ld testsuite regression "objcopy executable (pr25662)".
Related show

Commit Message

Hans-Peter Nilsson April 1, 2020, 2:14 a.m.
* mmo.c (mmo_scan): Create .text section only when needed, not
	from the start.

For the test-case at hand, the .data section is created and output
first by the linker, but the mmo input-reader mmo_scan always creates
a .text section.  Since sections are output in the order in which
they're created, it's output first, breaking the assumption that
obcopy without options (or with -p) creates output identical to its
input.  The point of creating it at the top of mmo_scan is a trivial
default assignment for the current section variable "sec".  Instead we
now defer the default, creating it only when needed and sec is NULL.

---
 bfd/ChangeLog |    5 +++++
 bfd/mmo.c     |    6 +++++-
 2 files changed, 10 insertions(+), 1 deletions(-)

-- 

brgds, H-P

Patch

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 4c2bb14..d11421f 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@ 
+2020-04-01  Hans-Peter Nilsson  <hp@bitrange.com>
+
+	* mmo.c (mmo_scan): Create .text section only when needed, not
+	from the start.
+
 2020-03-31  Alan Modra  <amodra@gmail.com>

 	* coff-alpha.c (alpha_ecoff_get_elt_at_filepos): Correct bfd_bread
diff --git a/bfd/mmo.c b/bfd/mmo.c
index 3b7e5c0..ea7c4c6 100644
--- a/bfd/mmo.c
+++ b/bfd/mmo.c
@@ -1588,7 +1588,7 @@  mmo_scan (bfd *abfd)
   unsigned int lineno = 1;
   bfd_boolean error = FALSE;
   bfd_vma vma = 0;
-  asection *sec = bfd_make_section_old_way (abfd, MMO_TEXT_SECTION_NAME);
+  asection *sec = NULL;
   asection *non_spec_sec = NULL;
   bfd_vma non_spec_vma = 0;
   bfd_size_type nbytes_read = 0;
@@ -1646,6 +1646,8 @@  mmo_scan (bfd *abfd)
 		goto error_return;

 	      vma &= ~3;
+	      if (sec == NULL)
+		sec = bfd_make_section_old_way (abfd, MMO_TEXT_SECTION_NAME);
 	      mmo_xore_32 (sec, vma, bfd_get_32 (abfd, buf));
 	      vma += 4;
 	      lineno++;
@@ -2038,6 +2040,8 @@  mmo_scan (bfd *abfd)
       else
 	{
 	  /* This wasn't a lopcode, so store it in the current section.  */
+	  if (sec == NULL)
+	    sec = bfd_make_section_old_way (abfd, MMO_TEXT_SECTION_NAME);
 	  mmo_xore_32 (sec, vma & ~3, bfd_get_32 (abfd, buf));
 	  vma += 4;
 	  vma &= ~3;