⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hppa.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 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 + -