📄 hppa.c
字号:
/* bfd back-end for HP PA-RISC SOM objects. Copyright (C) 1990-1991 Free Software Foundation, Inc. Contributed by the Center for Software Science at the University of Utah (pa-gdb-bugs@cs.utah.edu).This file is part of BFD, the Binary File Descriptor library.This program is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2 of the License, or(at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#ifdef hp9000s800#include <sysdep.h>#include "bfd.h"#include "libbfd.h"#include "libhppa.h"/* #include "aout/hppa.h" */#include <stdio.h>#include <sys/types.h>#include <sys/param.h>#include <sys/dir.h>#include <signal.h>#include <machine/reg.h>#ifndef hpux#include <aout/hppa.h> #include <machine/pcb.h>#include <sys/time.h>#include <hpux/hpux.h>#define USRSTACK 0x68FF3000#else#include <sys/user.h> /* After a.out.h */#endif#include <sys/file.h>#include <errno.h> struct container { struct header f; struct som_exec_auxhdr e;};#undef USIZE#undef UPAGES#define USIZE 3#define UPAGES 7voidfill_spaces(abfd, file_hdr, dbx_subspace, dbx_strings_subspace) bfd *abfd; struct header *file_hdr; struct subspace_dictionary_record *dbx_subspace, *dbx_strings_subspace;{ char *space_strings = (char *) alloca (file_hdr->space_strings_size); int i; /* for millicode games. */ struct space_dictionary_record space; struct subspace_dictionary_record subspace; int index; /* indices of subspace entries for $TEXT$ and $GDB_DEBUG$ */ int text_index = 0, gdb_debug_index = 0; /* initialize in case we don't find any dbx symbols. */ dbx_subspace->subspace_length = dbx_strings_subspace->subspace_length = 0; bfd_seek (abfd, file_hdr->space_strings_location, SEEK_SET); if (bfd_read ((PTR) space_strings, 1, file_hdr->space_strings_size, abfd) != file_hdr->space_strings_size) { bfd_error = wrong_format; /* space strings table corrupted. */ return; } bfd_seek (abfd, file_hdr->space_location, SEEK_SET); for (i = 0; i < file_hdr->space_total; i++) { bfd_read ((PTR) &space, 1, sizeof(space), abfd); index = (file_hdr->subspace_location + (space.subspace_index * sizeof(subspace))); if (!strcmp (space_strings + space.name.n_strx, "$TEXT$")) text_index = index; else if (!strcmp (space_strings + space.name.n_strx, "$GDB_DEBUG$")) gdb_debug_index = index; } /* search out the beginning and end if millicode */ bfd_seek (abfd, text_index, SEEK_SET); for (;;) { bfd_read ((PTR) &subspace, 1, sizeof(subspace), abfd); if (!strcmp (space_strings + subspace.name.n_strx, "$MILLICODE$")) { millicode_start = subspace.subspace_start; millicode_end = (millicode_start + subspace.subspace_length); break; } } /* read symbols subspace and strings subspace in possibly arbitrary order. */ bfd_seek (abfd, gdb_debug_index, SEEK_SET); bfd_read ((PTR) &subspace, 1, sizeof(struct subspace_dictionary_record), abfd); if (!strcmp (space_strings + subspace.name.n_strx, "$GDB_STRINGS$")) { *dbx_strings_subspace = subspace; bfd_read ((PTR) dbx_subspace, 1, sizeof(struct subspace_dictionary_record), abfd); } else { *dbx_subspace = subspace; bfd_read ((PTR) dbx_strings_subspace, 1, sizeof(struct subspace_dictionary_record), abfd); }}bfd_target *DEFUN(hppa_object_setup,(abfd, file_hdrp, aux_hdrp, dbx_subspace, dbx_strings_subspace), bfd *abfd AND struct header *file_hdrp AND struct som_exec_auxhdr *aux_hdrp AND struct subspace_dictionary_record *dbx_subspace AND struct subspace_dictionary_record *dbx_strings_subspace){ struct container *rawptr; struct header *f; struct hppa_data_struct *rawptr1; rawptr = (struct container *) bfd_zalloc (abfd, sizeof (struct container)); if (rawptr == NULL) { bfd_error = no_memory; return 0; } rawptr1 = (struct hppa_data_struct *) bfd_zalloc (abfd, sizeof (struct hppa_data_struct)); if (rawptr1 == NULL) { bfd_error = no_memory; return 0; } abfd->tdata.hppa_data = rawptr1; obj_file_hdr (abfd) = &rawptr->f; obj_aux_hdr (abfd) = &rawptr->e; *obj_file_hdr (abfd) = *file_hdrp; *obj_aux_hdr (abfd) = *aux_hdrp; /* Set the file flags */ abfd->flags = NO_FLAGS; if (file_hdrp->entry_offset) abfd->flags |= HAS_RELOC; if (file_hdrp->symbol_total) abfd->flags |= HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS; bfd_get_start_address (abfd) = aux_hdrp->exec_entry; obj_hp_symbol_entry_size (abfd) = sizeof(struct symbol_dictionary_record); obj_dbx_symbol_entry_size (abfd) = 12; obj_pa_symbols (abfd) = (hppa_symbol_type *)NULL; obj_hp_sym_count (abfd) = file_hdrp->symbol_total; obj_dbx_sym_count (abfd) = dbx_subspace->subspace_length / obj_dbx_symbol_entry_size (abfd); bfd_get_symcount (abfd) = obj_hp_sym_count (abfd) + obj_dbx_sym_count (abfd); bfd_default_set_arch_mach(abfd, bfd_arch_hppa, 0); /* create the sections. This is raunchy, but bfd_close wants to reclaim them */ obj_textsec (abfd) = (asection *)NULL; obj_datasec (abfd) = (asection *)NULL; obj_bsssec (abfd) = (asection *)NULL; (void)bfd_make_section(abfd, ".text"); (void)bfd_make_section(abfd, ".data"); (void)bfd_make_section(abfd, ".bss"); abfd->sections = obj_textsec (abfd); obj_textsec (abfd)->next = obj_datasec (abfd); obj_datasec (abfd)->next = obj_bsssec (abfd); obj_datasec (abfd)->_raw_size = aux_hdrp->exec_dsize; obj_bsssec (abfd)->_raw_size = aux_hdrp->exec_bsize; obj_textsec (abfd)->_raw_size = aux_hdrp->exec_tsize; obj_textsec (abfd)->flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS); obj_datasec (abfd)->flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS); obj_bsssec (abfd)->flags = SEC_ALLOC; /* The virtual memory addresses of the sections */ obj_datasec (abfd)->vma = aux_hdrp->exec_dmem; obj_bsssec (abfd)->vma = aux_hdrp->exec_bfill; obj_textsec (abfd)->vma = aux_hdrp->exec_tmem; /* The file offsets of the sections */ obj_textsec (abfd)->filepos = aux_hdrp->exec_tfile; obj_datasec (abfd)->filepos = aux_hdrp->exec_dfile; /* The file offsets of the relocation info */ obj_textsec (abfd)->rel_filepos = 0; obj_datasec (abfd)->rel_filepos = 0; /* The file offsets of the string table and symbol table. */ obj_hp_sym_filepos (abfd) = file_hdrp->symbol_location; obj_hp_str_filepos (abfd) = file_hdrp->symbol_strings_location; obj_dbx_sym_filepos (abfd) = dbx_subspace->file_loc_init_value; obj_dbx_str_filepos (abfd) = dbx_strings_subspace->file_loc_init_value; obj_hp_stringtab_size (abfd) = file_hdrp->symbol_strings_size; obj_dbx_stringtab_size (abfd) = dbx_strings_subspace->subspace_length; return abfd->xvec;}bfd_target *DEFUN(hppa_object_p,(abfd), bfd *abfd){ struct header file_hdr; struct som_exec_auxhdr aux_hdr; struct subspace_dictionary_record dbx_subspace; struct subspace_dictionary_record dbx_strings_subspace; if (bfd_read ((PTR) &file_hdr, 1, FILE_HDR_SIZE, abfd) != FILE_HDR_SIZE) { bfd_error = wrong_format; return 0; } if (bfd_read ((PTR) &aux_hdr, 1, AUX_HDR_SIZE, abfd) != AUX_HDR_SIZE) { bfd_error = wrong_format; return 0; } fill_spaces(abfd, &file_hdr, &dbx_subspace, &dbx_strings_subspace); return hppa_object_setup(abfd, &file_hdr, &aux_hdr, &dbx_subspace, &dbx_strings_subspace);}static booleanDEFUN(hppa_mkobject,(abfd), bfd *abfd){ fprintf (stderr, "hppa_mkobject unimplemented\n"); fflush (stderr); abort (); return (false);}booleanDEFUN(hppa_write_object_contents,(abfd), bfd *abfd){ fprintf (stderr, "hppa_write_object_contents unimplemented\n"); fflush (stderr); abort (); return (false);}unsigned intDEFUN(hppa_get_symtab_upper_bound,(abfd), bfd *abfd){ fprintf (stderr, "hppa_get_symtab_upper_bound unimplemented\n"); fflush (stderr); abort (); return (0);}unsigned intDEFUN(hppa_get_reloc_upper_bound,(abfd, asect), bfd *abfd AND sec_ptr asect){ fprintf (stderr, "hppa_get_reloc_upper_bound unimplemented\n"); fflush (stderr); abort (); return (0);}unsigned intDEFUN(hppa_canonicalize_reloc,(abfd, section, relptr, symbols), bfd *abfd AND sec_ptr section AND arelent **relptr AND asymbol **symbols){ fprintf (stderr, "hppa_canonicalize_reloc unimplemented\n"); fflush (stderr); abort ();}extern bfd_target hppa_vec;unsigned intDEFUN(hppa_get_symtab,(abfd, location), bfd *abfd AND asymbol **location){ fprintf (stderr, "hppa_get_symtab unimplemented\n"); fflush (stderr); abort (); return (0);}asymbol *DEFUN(hppa_make_empty_symbol,(abfd), bfd *abfd){ hppa_symbol_type *new = (hppa_symbol_type *)bfd_zalloc (abfd, sizeof (hppa_symbol_type)); new->symbol.the_bfd = abfd;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -