📄 aoutf1.h
字号:
intcore->c_dsize = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_dsize); intcore->c_ssize = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_ssize); memcpy (intcore->c_cmdname, extcore->c_cmdname, sizeof (intcore->c_cmdname)); intcore->fp_stuff_pos = (long) (((struct external_sun3_core *)0)->fp_stuff); /* FP stuff takes up whole rest of struct, except c_ucode. */ intcore->fp_stuff_size = intcore->c_len - (sizeof extcore->c_ucode) - (file_ptr)(((struct external_sun3_core *)0)->fp_stuff); /* Ucode is the last thing in the struct -- just before the end */ intcore->c_ucode = bfd_h_get_32 (abfd, intcore->c_len - sizeof (extcore->c_ucode) + (unsigned char *)extcore); intcore->c_stacktop = 0x0E000000; /* By experimentation */}/* byte-swap in the Sparc core structure */static voidDEFUN(swapcore_sparc,(abfd, ext, intcore), bfd *abfd AND char *ext AND struct internal_sunos_core *intcore){ struct external_sparc_core *extcore = (struct external_sparc_core *)ext; intcore->c_magic = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_magic); intcore->c_len = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_len ); intcore->c_regs_pos = (long) (((struct external_sparc_core *)0)->c_regs); intcore->c_regs_size = sizeof (extcore->c_regs); NAME(aout,swap_exec_header_in)(abfd, &extcore->c_aouthdr,&intcore->c_aouthdr); intcore->c_signo = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_signo); intcore->c_tsize = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_tsize); intcore->c_dsize = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_dsize); intcore->c_ssize = bfd_h_get_32 (abfd, (unsigned char *)&extcore->c_ssize); memcpy (intcore->c_cmdname, extcore->c_cmdname, sizeof (intcore->c_cmdname)); intcore->fp_stuff_pos = (long) (((struct external_sparc_core *)0)->fp_stuff); /* FP stuff takes up whole rest of struct, except c_ucode. */ intcore->fp_stuff_size = intcore->c_len - (sizeof extcore->c_ucode) - (file_ptr)(((struct external_sparc_core *)0)->fp_stuff); /* Ucode is the last thing in the struct -- just before the end */ intcore->c_ucode = bfd_h_get_32 (abfd, intcore->c_len - sizeof (extcore->c_ucode) + (unsigned char *)extcore); /* Supposedly the user stack grows downward from the bottom of kernel memory. Presuming that this remains true, this definition will work. */#define SPARC_USRSTACK (-(128*1024*1024)) intcore->c_stacktop = SPARC_USRSTACK; /* By experimentation */}/* need this cast because ptr is really void * */#define core_hdr(bfd) ((bfd)->tdata.sun_core_data)#define core_datasec(bfd) (core_hdr(bfd)->data_section)#define core_stacksec(bfd) (core_hdr(bfd)->stack_section)#define core_regsec(bfd) (core_hdr(bfd)->reg_section)#define core_reg2sec(bfd) (core_hdr(bfd)->reg2_section)/* These are stored in the bfd's tdata */struct sun_core_struct { struct internal_sunos_core *hdr; /* core file header */ asection *data_section; asection *stack_section; asection *reg_section; asection *reg2_section;};static bfd_target *DEFUN(sunos4_core_file_p,(abfd), bfd *abfd){ unsigned char longbuf[4]; /* Raw bytes of various header fields */ int core_size; int core_mag; struct internal_sunos_core *core; char *extcore; struct mergem { struct sun_core_struct suncoredata; struct internal_sunos_core internal_sunos_core; char external_core[1]; } *mergem; bfd_error = system_call_error; if (bfd_read ((PTR)longbuf, 1, sizeof (longbuf), abfd) != sizeof (longbuf)) return 0; core_mag = bfd_h_get_32 (abfd, longbuf); if (core_mag != CORE_MAGIC) return 0; /* SunOS core headers can vary in length; second word is size; */ if (bfd_read ((PTR)longbuf, 1, sizeof (longbuf), abfd) != sizeof (longbuf)) return 0; core_size = bfd_h_get_32 (abfd, longbuf); /* Sanity check */ if (core_size > 20000) return 0; if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) < 0) return 0; mergem = (struct mergem *)bfd_zalloc (abfd, core_size + sizeof (struct mergem)); if (mergem == NULL) { bfd_error = no_memory; return 0; } extcore = mergem->external_core; if ((bfd_read ((PTR) extcore, 1, core_size, abfd)) != core_size) { bfd_error = system_call_error; bfd_release (abfd, (char *)mergem); return 0; } /* Validate that it's a core file we know how to handle, due to sun botching the positioning of registers and other fields in a machine dependent way. */ core = &mergem->internal_sunos_core; switch (core_size) { case SPARC_CORE_LEN: swapcore_sparc (abfd, extcore, core); break; case SUN3_CORE_LEN: swapcore_sun3 (abfd, extcore, core); break; default: bfd_error = system_call_error; /* FIXME */ bfd_release (abfd, (char *)mergem); return 0; } abfd->tdata.sun_core_data = &mergem->suncoredata; abfd->tdata.sun_core_data->hdr = core; /* create the sections. This is raunchy, but bfd_close wants to reclaim them */ core_stacksec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); if (core_stacksec (abfd) == NULL) { loser: bfd_error = no_memory; bfd_release (abfd, (char *)mergem); return 0; } core_datasec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); if (core_datasec (abfd) == NULL) { loser1: bfd_release (abfd, core_stacksec (abfd)); goto loser; } core_regsec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); if (core_regsec (abfd) == NULL) { loser2: bfd_release (abfd, core_datasec (abfd)); goto loser1; } core_reg2sec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); if (core_reg2sec (abfd) == NULL) { bfd_release (abfd, core_regsec (abfd)); goto loser2; } core_stacksec (abfd)->name = ".stack"; core_datasec (abfd)->name = ".data"; core_regsec (abfd)->name = ".reg"; core_reg2sec (abfd)->name = ".reg2"; core_stacksec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS; core_datasec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS; core_regsec (abfd)->flags = SEC_ALLOC + SEC_HAS_CONTENTS; core_reg2sec (abfd)->flags = SEC_ALLOC + SEC_HAS_CONTENTS; core_stacksec (abfd)->_raw_size = core->c_ssize; core_datasec (abfd)->_raw_size = core->c_dsize; core_regsec (abfd)->_raw_size = core->c_regs_size; core_reg2sec (abfd)->_raw_size = core->fp_stuff_size; core_stacksec (abfd)->vma = (core->c_stacktop - core->c_ssize); core_datasec (abfd)->vma = N_DATADDR(core->c_aouthdr); core_regsec (abfd)->vma = 0; core_reg2sec (abfd)->vma = 0; core_stacksec (abfd)->filepos = core->c_len + core->c_dsize; core_datasec (abfd)->filepos = core->c_len; /* We'll access the regs afresh in the core file, like any section: */ core_regsec (abfd)->filepos = (file_ptr)core->c_regs_pos; core_reg2sec (abfd)->filepos = (file_ptr)core->fp_stuff_pos; /* Align to word at least */ core_stacksec (abfd)->alignment_power = 2; core_datasec (abfd)->alignment_power = 2; core_regsec (abfd)->alignment_power = 2; core_reg2sec (abfd)->alignment_power = 2; abfd->sections = core_stacksec (abfd); core_stacksec (abfd)->next = core_datasec (abfd); core_datasec (abfd)->next = core_regsec (abfd); core_regsec (abfd)->next = core_reg2sec (abfd); abfd->section_count = 4; return abfd->xvec;}static char *sunos4_core_file_failing_command (abfd)bfd *abfd; { return core_hdr (abfd)->hdr->c_cmdname;}static intDEFUN(sunos4_core_file_failing_signal,(abfd), bfd *abfd){ return core_hdr (abfd)->hdr->c_signo;}static booleanDEFUN(sunos4_core_file_matches_executable_p, (core_bfd, exec_bfd), bfd *core_bfd AND bfd *exec_bfd){ if (core_bfd->xvec != exec_bfd->xvec) { bfd_error = system_call_error; return false; } return (memcmp ((char *)&((core_hdr (core_bfd)->hdr)->c_aouthdr), (char *) exec_hdr (exec_bfd), sizeof (struct internal_exec)) == 0) ? true : false;}extern reloc_howto_type aout_32_ext_howto_table[];static reloc_howto_type *DEFUN (sunos4_reloc_type_lookup, (abfd, code), bfd *abfd AND bfd_reloc_code_real_type code){ switch (bfd_get_arch (abfd)) { default: return 0; case bfd_arch_sparc: switch (code) { default: return 0;#define IDX(i,j) case i: return &aout_32_ext_howto_table[j] IDX (BFD_RELOC_CTOR, 2); IDX (BFD_RELOC_32, 2); IDX (BFD_RELOC_HI22, 8); IDX (BFD_RELOC_LO10, 11); IDX (BFD_RELOC_32_PCREL_S2, 6); } }}static booleanDEFUN (sunos4_set_sizes, (abfd), bfd *abfd){ switch (bfd_get_arch (abfd)) { default: return false; case bfd_arch_sparc: adata(abfd).page_size = 0x2000; adata(abfd).segment_size = 0x2000; adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE; return true; case bfd_arch_m68k: adata(abfd).page_size = 0x2000; adata(abfd).segment_size = 0x20000; adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE; return true; }}static CONST struct aout_backend_data sunos4_aout_backend = { 0, 1, 0, sunos4_set_sizes, 0,};#define MY_core_file_failing_command sunos4_core_file_failing_command#define MY_core_file_failing_signal sunos4_core_file_failing_signal#define MY_core_file_matches_executable_p sunos4_core_file_matches_executable_p#define MY_bfd_debug_info_start bfd_void#define MY_bfd_debug_info_end bfd_void#define MY_bfd_debug_info_accumulate (PROTO(void,(*),(bfd*, struct sec *))) bfd_void#define MY_core_file_p sunos4_core_file_p#define MY_write_object_contents NAME(aout,sunos4_write_object_contents)#define MY_backend_data &sunos4_aout_backend#define TARGET_IS_BIG_ENDIAN_P#include "aout-target.h"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -