diff options
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/mach-o.c | 27 |
2 files changed, 24 insertions, 8 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 7e36b6d81d..77749a7833 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2012-01-13 Iain Sandoe <idsandoe@googlemail.com> + + * mach-o.c (bfd_mach_o_write_relocs): Move compuation of relocs file + position from here... to (bfd_mach_o_build_seg_command): Here. + 2012-01-12 Iain Sandoe <idsandoe@googlemail.com> * mach-o.c (bfd_mach_o_count_indirect_symbols): New. diff --git a/bfd/mach-o.c b/bfd/mach-o.c index c5196631c4..262531970f 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; } |