This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch mach-o/bfd] Order relocs after the section data.


this is an almost cosmetic patch that causes us to order relocs after the section data - rather than after the indirect symbols.

The main purpose is that it makes it easier to compare the output of the native 'as' with GAS.

I suppose there's a minor 'do what ld expects' content, but one would hope that is largely unimportant...

OK?
Iain

bfd:

* mach-o.c (bfd_mach_o_write_relocs): Move the computation of relocs file
position from here ...
(bfd_mach_o_build_seg_command) ... to here.



bfd/mach-o.c | 27 +++++++++++++++++++-------- 1 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/bfd/mach-o.c b/bfd/mach-o.c
index c519663..2625319 100644
--- a/bfd/mach-o.c
+++ b/bfd/mach-o.c
@@ -1185,7 +1185,6 @@ bfd_mach_o_canonicalize_dynamic_reloc (bfd *abfd, arelent **rels,
static bfd_boolean
bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section)
{
- bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
unsigned int i;
arelent **entries;
asection *sec;
@@ -1198,13 +1197,6 @@ bfd_mach_o_write_relocs (bfd *abfd, bfd_mach_o_section *section)
if (bed->_bfd_mach_o_swap_reloc_out == NULL)
return TRUE;


-  /* Allocate relocation room.  */
-  mdata->filelen = FILE_ALIGN(mdata->filelen, 2);
-  section->nreloc = sec->reloc_count;
-  sec->rel_filepos = mdata->filelen;
-  section->reloff = sec->rel_filepos;
-  mdata->filelen += sec->reloc_count * BFD_MACH_O_RELENT_SIZE;
-
   if (bfd_seek (abfd, section->reloff, SEEK_SET) != 0)
     return FALSE;

@@ -2075,6 +2067,25 @@ bfd_mach_o_build_seg_command (const char *segment,
}


   seg->filesize = mdata->filelen - seg->fileoff;
+  seg->filesize = FILE_ALIGN(seg->filesize, 2);
+
+  /* Allocate relocation room.  */
+  mdata->filelen = FILE_ALIGN(mdata->filelen, 2);
+
+  for (i = 0; i < mdata->nsects; ++i)
+    {
+      bfd_mach_o_section *ms = mdata->sections[i];
+      asection *sec = ms->bfdsection;
+
+      if ((ms->nreloc = sec->reloc_count) == 0)
+        {
+	  ms->reloff = 0;
+	  continue;
+        }
+      sec->rel_filepos = mdata->filelen;
+      ms->reloff = sec->rel_filepos;
+      mdata->filelen += sec->reloc_count * BFD_MACH_O_RELENT_SIZE;
+    }

   return TRUE;
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]