diff options
Diffstat (limited to 'bfd/aout-tic30.c')
-rw-r--r-- | bfd/aout-tic30.c | 98 |
1 files changed, 66 insertions, 32 deletions
diff --git a/bfd/aout-tic30.c b/bfd/aout-tic30.c index c872e9b..4946318 100644 --- a/bfd/aout-tic30.c +++ b/bfd/aout-tic30.c @@ -710,53 +710,87 @@ static bfd_boolean MY_bfd_final_link (bfd *abfd, struct bfd_link_info *info) { struct internal_exec *execp = exec_hdr (abfd); + asection *objsym_section; file_ptr pos; bfd_vma vma = 0; - int pad; /* Set the executable header size to 0, as we don't want one for an - output. */ + output. FIXME: Really? tic30_aout_object_p doesn't accept such + an executable! */ adata (abfd).exec_bytes_size = 0; + pos = adata (abfd).exec_bytes_size; + /* ??? Why are we looking at create_object_symbols_section? */ + objsym_section = info->create_object_symbols_section; + if (objsym_section != NULL) + vma = objsym_section->vma; + /* Text. */ - vma = info->create_object_symbols_section->vma; - pos += vma; - obj_textsec (abfd)->filepos = pos; - obj_textsec (abfd)->vma = vma; - obj_textsec (abfd)->user_set_vma = 1; - pos += obj_textsec (abfd)->size; - vma += obj_textsec (abfd)->size; + if (obj_textsec (abfd) != NULL) + { + pos += vma; + obj_textsec (abfd)->filepos = pos; + obj_textsec (abfd)->vma = vma; + obj_textsec (abfd)->user_set_vma = 1; + execp->a_text = obj_textsec (abfd)->size; + pos += obj_textsec (abfd)->size; + vma += obj_textsec (abfd)->size; + } /* Data. */ - if (abfd->flags & D_PAGED) + if (obj_datasec (abfd) != NULL) { - if (info->create_object_symbols_section->next->vma > 0) - obj_datasec (abfd)->vma = info->create_object_symbols_section->next->vma; + if (abfd->flags & D_PAGED) + { + if (objsym_section != NULL + && objsym_section->next != NULL + && objsym_section->next->vma != 0) + obj_datasec (abfd)->vma = objsym_section->next->vma; + else + obj_datasec (abfd)->vma = BFD_ALIGN (vma, adata (abfd).segment_size); + } else - obj_datasec (abfd)->vma = BFD_ALIGN (vma, adata (abfd).segment_size); - } - else - obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4); + obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4); - if (obj_datasec (abfd)->vma < vma) - obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4); + if (obj_datasec (abfd)->vma < vma) + obj_datasec (abfd)->vma = BFD_ALIGN (vma, 4); - obj_datasec (abfd)->user_set_vma = 1; - vma = obj_datasec (abfd)->vma; - obj_datasec (abfd)->filepos = vma + adata (abfd).exec_bytes_size; - execp->a_text = vma - obj_textsec (abfd)->vma; - obj_textsec (abfd)->size = execp->a_text; + pos += obj_datasec (abfd)->vma - vma; + obj_datasec (abfd)->filepos = pos; + obj_datasec (abfd)->user_set_vma = 1; + + vma = obj_datasec (abfd)->vma; + if (obj_textsec (abfd) != NULL) + { + execp->a_text = vma - obj_textsec (abfd)->vma; + obj_textsec (abfd)->size = execp->a_text; + } + execp->a_data = obj_datasec (abfd)->size; + vma += obj_datasec (abfd)->size; + } /* Since BSS follows data immediately, see if it needs alignment. */ - vma += obj_datasec (abfd)->size; - pad = align_power (vma, obj_bsssec (abfd)->alignment_power) - vma; - obj_datasec (abfd)->size += pad; - pos += obj_datasec (abfd)->size; - execp->a_data = obj_datasec (abfd)->size; - - /* BSS. */ - obj_bsssec (abfd)->vma = vma; - obj_bsssec (abfd)->user_set_vma = 1; + if (obj_bsssec (abfd) != NULL) + { + int pad; + + pad = align_power (vma, obj_bsssec (abfd)->alignment_power) - vma; + if (obj_datasec (abfd) != NULL) + { + obj_datasec (abfd)->size += pad; + execp->a_data += pad; + } + else if (obj_textsec (abfd) != NULL) + { + obj_textsec (abfd)->size += pad; + execp->a_text += pad; + } + + /* BSS. */ + vma += pad; + obj_bsssec (abfd)->vma = vma; + obj_bsssec (abfd)->user_set_vma = 1; + } /* We are fully resized, so don't readjust in final_link. */ adata (abfd).magic = z_magic; |