X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Fsom.c;h=ffdbf69886dad7c0951dc7a139cbf6b6d1cfac29;hb=226c1993e9f93611d21bb2e9b38d27e4333651d1;hp=2a74377c637ca800e6b0d5b9a630ccb30cf2d5c2;hpb=fa803dc60f0bf01297674c41d001798e18ade4dc;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/som.c b/bfd/som.c index 2a74377c63..ffdbf69886 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -1,5 +1,5 @@ /* bfd back-end for HP PA-RISC SOM objects. - Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 1997 + Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc. Contributed by the Center for Software Science at the @@ -19,7 +19,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ #include "bfd.h" #include "sysdep.h" @@ -29,13 +30,11 @@ #include "libbfd.h" #include "som.h" -#include -#include #include #include #include #include -#include +#include /* Magic not defined in standard HP-UX header files until 8.0 */ @@ -47,6 +46,10 @@ #define CPU_PA_RISC1_1 0x210 #endif /* CPU_PA_RISC1_1 */ +#ifndef CPU_PA_RISC2_0 +#define CPU_PA_RISC2_0 0x214 +#endif /* CPU_PA_RISC2_0 */ + #ifndef _PA_RISC1_0_ID #define _PA_RISC1_0_ID CPU_PA_RISC1_0 #endif /* _PA_RISC1_0_ID */ @@ -55,6 +58,10 @@ #define _PA_RISC1_1_ID CPU_PA_RISC1_1 #endif /* _PA_RISC1_1_ID */ +#ifndef _PA_RISC2_0_ID +#define _PA_RISC2_0_ID CPU_PA_RISC2_0 +#endif /* _PA_RISC2_0_ID */ + #ifndef _PA_RISC_MAXID #define _PA_RISC_MAXID 0x2FF #endif /* _PA_RISC_MAXID */ @@ -250,8 +257,8 @@ static boolean som_bfd_prep_for_ar_write PARAMS ((bfd *, unsigned int *, static unsigned int som_bfd_ar_symbol_hash PARAMS ((asymbol *)); static boolean som_bfd_ar_write_symbol_stuff PARAMS ((bfd *, unsigned int, unsigned int, - struct lst_header)); -static CONST char *normalize PARAMS ((CONST char *file)); + struct lst_header, + unsigned int)); static boolean som_is_space PARAMS ((asection *)); static boolean som_is_subspace PARAMS ((asection *)); static boolean som_is_container PARAMS ((asection *, asection *)); @@ -3647,6 +3654,8 @@ som_finish_writing (abfd) BFD private data happens *after* section contents are set. */ if (abfd->flags & (EXEC_P | DYNAMIC)) obj_som_file_hdr(abfd)->system_id = obj_som_exec_data (abfd)->system_id; + else if (bfd_get_mach (abfd) == pa20) + obj_som_file_hdr(abfd)->system_id = CPU_PA_RISC2_0; else if (bfd_get_mach (abfd) == pa11) obj_som_file_hdr(abfd)->system_id = CPU_PA_RISC1_1; else @@ -5044,7 +5053,7 @@ som_sizeof_headers (abfd, reloc) bfd *abfd; boolean reloc; { - (*_bfd_error_handler) ("som_sizeof_headers unimplemented"); + (*_bfd_error_handler) (_("som_sizeof_headers unimplemented")); fflush (stderr); abort (); return (0); @@ -5518,27 +5527,15 @@ som_bfd_ar_symbol_hash (symbol) | (symbol->name[len-2] << 8) | symbol->name[len-1]; } -static CONST char * -normalize (file) - CONST char *file; -{ - CONST char *filename = strrchr (file, '/'); - - if (filename != NULL) - filename++; - else - filename = file; - return filename; -} - /* Do the bulk of the work required to write the SOM library symbol table. */ static boolean -som_bfd_ar_write_symbol_stuff (abfd, nsyms, string_size, lst) +som_bfd_ar_write_symbol_stuff (abfd, nsyms, string_size, lst, elength) bfd *abfd; unsigned int nsyms, string_size; struct lst_header lst; + unsigned elength; { file_ptr lst_filepos; char *strings = NULL, *p; @@ -5547,8 +5544,7 @@ som_bfd_ar_write_symbol_stuff (abfd, nsyms, string_size, lst) unsigned int *hash_table = NULL; struct som_entry *som_dict = NULL; struct lst_symbol_record **last_hash_entry = NULL; - unsigned int curr_som_offset, som_index, extended_name_length = 0; - unsigned int maxname = abfd->xvec->ar_max_namelen; + unsigned int curr_som_offset, som_index = 0; hash_table = (unsigned int *) bfd_malloc (lst.hash_size * sizeof (unsigned int)); @@ -5584,28 +5580,17 @@ som_bfd_ar_write_symbol_stuff (abfd, nsyms, string_size, lst) describes. We have to compute that information as we iterate through the SOMs/symbols. */ som_index = 0; - curr_som_offset = 8 + 2 * sizeof (struct ar_hdr) + lst.file_end; - /* Yow! We have to know the size of the extended name table - too. */ - for (curr_bfd = abfd->archive_head; - curr_bfd != NULL; - curr_bfd = curr_bfd->next) - { - CONST char *normal = normalize (curr_bfd->filename); - unsigned int thislen; - - if (!normal) - return false; - thislen = strlen (normal); - if (thislen > maxname) - extended_name_length += thislen + 2; - } + /* We add in the size of the archive header twice as the location + in the SOM dictionary is the actual offset of the SOM, not the + archive header before the SOM. */ + curr_som_offset = 8 + 2 * sizeof (struct ar_hdr) + lst.file_end; /* Make room for the archive header and the contents of the - extended string table. */ - if (extended_name_length) - curr_som_offset += extended_name_length + sizeof (struct ar_hdr); + extended string table. Note that elength includes the size + of the archive header for the extended name table! */ + if (elength) + curr_som_offset += elength; /* Make sure we're properly aligned. */ curr_som_offset = (curr_som_offset + 0x1) & ~0x1; @@ -5922,7 +5907,8 @@ som_write_armap (abfd, elength, map, orl_count, stridx) return false; /* Build and write the armap. */ - if (som_bfd_ar_write_symbol_stuff (abfd, nsyms, stringsize, lst) == false) + if (som_bfd_ar_write_symbol_stuff (abfd, nsyms, stringsize, lst, elength) + == false) return false; /* Done. */ @@ -5996,6 +5982,8 @@ som_bfd_link_split_section (abfd, sec) #define som_bfd_link_add_symbols _bfd_generic_link_add_symbols #define som_bfd_final_link _bfd_generic_final_link +#define som_bfd_gc_sections bfd_generic_gc_sections + const bfd_target som_vec = {