X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Fsom.c;h=d44c474519c9f45fa6d4fe997242f376c52fd213;hb=5c9c6a54a4754329a339124b2d26a45a18f9776d;hp=4b40f1bf12a28e3a3371c343e21f7fc189dea296;hpb=082b7297014d9ccc3990c3c6be689dd18946d826;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/som.c b/bfd/som.c index 4b40f1bf12..d44c474519 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -196,6 +196,8 @@ static bfd_boolean som_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_header_data #define som_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data #define som_bfd_set_private_flags _bfd_generic_bfd_set_private_flags +static bfd_boolean som_bfd_print_private_bfd_data + (bfd *, void *); static bfd_boolean som_bfd_is_local_label_name PARAMS ((bfd *, const char *)); static bfd_boolean som_set_section_contents @@ -1772,7 +1774,6 @@ som_object_setup (abfd, file_hdrp, aux_hdrp, current_offset) unsigned long current_offset; { asection *section; - int found; /* som_mkobject will set bfd_error if som_mkobject fails. */ if (! som_mkobject (abfd)) @@ -1810,6 +1811,9 @@ som_object_setup (abfd, file_hdrp, aux_hdrp, current_offset) break; } + /* Save the auxiliary header. */ + obj_som_exec_hdr (abfd) = aux_hdrp; + /* Allocate space to hold the saved exec header information. */ obj_som_exec_data (abfd) = (struct som_exec_data *) bfd_zalloc (abfd, (bfd_size_type) sizeof (struct som_exec_data)); @@ -1824,32 +1828,40 @@ som_object_setup (abfd, file_hdrp, aux_hdrp, current_offset) It's about time, OSF has used the new id since at least 1992; HPUX didn't start till nearly 1995!. - The new approach examines the entry field. If it's zero or not 4 - byte aligned then it's not a proper code address and we guess it's - really the executable flags. */ - found = 0; - for (section = abfd->sections; section; section = section->next) + The new approach examines the entry field for an executable. If + it is not 4-byte aligned then it's not a proper code address and + we guess it's really the executable flags. For a main program, + we also consider zero to be indicative of a buggy linker, since + that is not a valid entry point. The entry point for a shared + library, however, can be zero so we do not consider that to be + indicative of a buggy linker. */ + if (aux_hdrp) { - bfd_vma entry; + int found = 0; - if ((section->flags & SEC_CODE) == 0) - continue; - entry = aux_hdrp->exec_entry; - if (entry >= section->vma - && entry < section->vma + section->size) - found = 1; - } - if (aux_hdrp->exec_entry == 0 - || (aux_hdrp->exec_entry & 0x3) != 0 - || ! found) - { - bfd_get_start_address (abfd) = aux_hdrp->exec_flags; - obj_som_exec_data (abfd)->exec_flags = aux_hdrp->exec_entry; - } - else - { - bfd_get_start_address (abfd) = aux_hdrp->exec_entry + current_offset; - obj_som_exec_data (abfd)->exec_flags = aux_hdrp->exec_flags; + for (section = abfd->sections; section; section = section->next) + { + bfd_vma entry; + + if ((section->flags & SEC_CODE) == 0) + continue; + entry = aux_hdrp->exec_entry + aux_hdrp->exec_tmem; + if (entry >= section->vma + && entry < section->vma + section->size) + found = 1; + } + if ((aux_hdrp->exec_entry == 0 && !(abfd->flags & DYNAMIC)) + || (aux_hdrp->exec_entry & 0x3) != 0 + || ! found) + { + bfd_get_start_address (abfd) = aux_hdrp->exec_flags; + obj_som_exec_data (abfd)->exec_flags = aux_hdrp->exec_entry; + } + else + { + bfd_get_start_address (abfd) = aux_hdrp->exec_entry + current_offset; + obj_som_exec_data (abfd)->exec_flags = aux_hdrp->exec_flags; + } } obj_som_exec_data (abfd)->version_id = file_hdrp->version_id; @@ -1913,6 +1925,7 @@ setup_sections (abfd, file_hdr, current_offset) struct som_subspace_dictionary_record subspace, save_subspace; unsigned int subspace_index; asection *space_asect; + bfd_size_type space_size = 0; char *newname; /* Read the space dictionary element. */ @@ -2104,6 +2117,9 @@ setup_sections (abfd, file_hdr, current_offset) subspace_asect->alignment_power = exact_log2 (subspace.alignment); if (subspace_asect->alignment_power == (unsigned) -1) goto error_return; + + /* Keep track of the accumulated sizes of the sections. */ + space_size += subspace.subspace_length; } /* This can happen for a .o which defines symbols in otherwise @@ -2111,11 +2127,25 @@ setup_sections (abfd, file_hdr, current_offset) if (!save_subspace.file_loc_init_value) space_asect->size = 0; else - /* Setup the size for the space section based upon the info in the - last subspace of the space. */ - space_asect->size = (save_subspace.subspace_start - - space_asect->vma - + save_subspace.subspace_length); + { + if (file_hdr->a_magic != RELOC_MAGIC) + { + /* Setup the size for the space section based upon the info + in the last subspace of the space. */ + space_asect->size = (save_subspace.subspace_start + - space_asect->vma + + save_subspace.subspace_length); + } + else + { + /* The subspace_start field is not initialised in relocatable + only objects, so it cannot be used for length calculations. + Instead we use the space_size value which we have been + accumulating. This isn't an accurate estimate since it + ignores alignment and ordering issues. */ + space_asect->size = space_size; + } + } } /* Now that we've read in all the subspace records, we need to assign a target index to each subspace. */ @@ -2165,7 +2195,7 @@ som_object_p (abfd) bfd *abfd; { struct header file_hdr; - struct som_exec_auxhdr aux_hdr; + struct som_exec_auxhdr *aux_hdr_ptr = NULL; unsigned long current_offset = 0; struct lst_header lst_header; struct som_entry som_entry; @@ -2277,11 +2307,14 @@ som_object_p (abfd) /* If the aux_header_size field in the file header is zero, then this object is an incomplete executable (a .o file). Do not try to read a non-existant auxiliary header. */ - memset (&aux_hdr, 0, sizeof (struct som_exec_auxhdr)); if (file_hdr.aux_header_size != 0) { + aux_hdr_ptr = bfd_zalloc (abfd, + (bfd_size_type) sizeof (*aux_hdr_ptr)); + if (aux_hdr_ptr == NULL) + return NULL; amt = AUX_HDR_SIZE; - if (bfd_bread ((PTR) &aux_hdr, amt, abfd) != amt) + if (bfd_bread ((PTR) aux_hdr_ptr, amt, abfd) != amt) { if (bfd_get_error () != bfd_error_system_call) bfd_set_error (bfd_error_wrong_format); @@ -2297,7 +2330,7 @@ som_object_p (abfd) } /* This appears to be a valid SOM object. Do some initialization. */ - return som_object_setup (abfd, &file_hdr, &aux_hdr, current_offset); + return som_object_setup (abfd, &file_hdr, aux_hdr_ptr, current_offset); } /* Create a SOM object. */ @@ -4510,11 +4543,6 @@ som_slurp_symbol_table (abfd) sym->symbol.value -= sym->symbol.section->vma; break; -#if 0 - /* SS_GLOBAL and SS_LOCAL are two names for the same thing. - Sound dumb? It is. */ - case SS_GLOBAL: -#endif case SS_LOCAL: sym->symbol.flags |= BSF_LOCAL; sym->symbol.section = bfd_section_from_som_symbol (abfd, bufp); @@ -5224,6 +5252,49 @@ som_bfd_copy_private_bfd_data (ibfd, obfd) return TRUE; } +/* Display the SOM header. */ + +static bfd_boolean +som_bfd_print_private_bfd_data (bfd *abfd, void *farg) +{ + struct som_exec_auxhdr *exec_header; + struct aux_id* auxhdr; + FILE *f; + + f = (FILE *) farg; + + exec_header = obj_som_exec_hdr (abfd); + if (exec_header) + { + fprintf (f, _("\nExec Auxiliary Header\n")); + fprintf (f, " flags "); + auxhdr = &exec_header->som_auxhdr; + if (auxhdr->mandatory) + fprintf (f, "mandatory "); + if (auxhdr->copy) + fprintf (f, "copy "); + if (auxhdr->append) + fprintf (f, "append "); + if (auxhdr->ignore) + fprintf (f, "ignore "); + fprintf (f, "\n"); + fprintf (f, " type %#x\n", auxhdr->type); + fprintf (f, " length %#x\n", auxhdr->length); + fprintf (f, " text size %#x\n", exec_header->exec_tsize); + fprintf (f, " text memory offset %#x\n", exec_header->exec_tmem); + fprintf (f, " text file offset %#x\n", exec_header->exec_tfile); + fprintf (f, " data size %#x\n", exec_header->exec_dsize); + fprintf (f, " data memory offset %#x\n", exec_header->exec_dmem); + fprintf (f, " data file offset %#x\n", exec_header->exec_dfile); + fprintf (f, " bss size %#x\n", exec_header->exec_bsize); + fprintf (f, " entry point %#x\n", exec_header->exec_entry); + fprintf (f, " loader flags %#x\n", exec_header->exec_flags); + fprintf (f, " bss initializer %#x\n", exec_header->exec_bfill); + } + + return TRUE; +} + /* Set backend info for sections which can not be described in the BFD data structures. */ @@ -6382,8 +6453,9 @@ som_bfd_link_split_section (abfd, sec) #define som_construct_extended_name_table \ _bfd_archive_coff_construct_extended_name_table #define som_update_armap_timestamp bfd_true -#define som_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data +#define som_bfd_is_target_special_symbol \ + ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false) #define som_get_lineno _bfd_nosymbols_get_lineno #define som_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol #define som_read_minisymbols _bfd_generic_read_minisymbols