173 lines
5.7 KiB
C
173 lines
5.7 KiB
C
/* HP PA-RISC SOM object file format: definitions internal to BFD.
|
|
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 modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the 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 of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
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., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|
|
|
#ifndef _SOM_H
|
|
#define _SOM_H
|
|
|
|
#include "../bfd/sysdep.h"
|
|
#include "libhppa.h"
|
|
|
|
#include <a.out.h>
|
|
#include <lst.h>
|
|
#include <ar.h>
|
|
|
|
|
|
#if defined(HOST_HPPABSD) || defined (HOST_HPPAOSF)
|
|
/* BSD uses a completely different scheme for object file identification.
|
|
so for now, define _PA_RISC_ID to accept any random value for a model
|
|
number. */
|
|
#undef _PA_RISC_ID
|
|
#define _PA_RISC_ID(__m_num) 1
|
|
#endif /* HOST_HPPABSD */
|
|
|
|
#define FILE_HDR_SIZE sizeof(struct header)
|
|
#define AUX_HDR_SIZE sizeof(struct som_exec_auxhdr)
|
|
|
|
typedef struct som_symbol
|
|
{
|
|
asymbol symbol;
|
|
short desc;
|
|
char other;
|
|
unsigned char type;
|
|
unsigned int som_type;
|
|
|
|
/* Structured like the ELF tc_data union. Allows more code sharing
|
|
in GAS this way. */
|
|
union
|
|
{
|
|
unsigned int hppa_arg_reloc;
|
|
PTR any;
|
|
}
|
|
tc_data;
|
|
|
|
/* Index of this symbol in the symbol table. Only used when
|
|
building relocation streams for incomplete objects. */
|
|
int index;
|
|
|
|
/* How many times this symbol is used in a relocation. By sorting
|
|
the symbols from most used to least used we can significantly
|
|
reduce the size of the relocation stream for incomplete objects. */
|
|
int reloc_count;
|
|
|
|
/* The unwind descriptor bits associated with R_ENTRY relocations
|
|
for functions (not enough room in a BFD reloc to store all the
|
|
information, so we tack it onto the symbol associated with the
|
|
function. */
|
|
char *unwind;
|
|
}
|
|
som_symbol_type;
|
|
|
|
struct somdata
|
|
{
|
|
struct header *file_hdr;
|
|
struct copyright_aux_hdr *copyright_aux_hdr;
|
|
struct user_string_aux_hdr *version_aux_hdr;
|
|
som_symbol_type *symtab;
|
|
char *stringtab;
|
|
|
|
/* We remember these offsets so that after check_file_format, we have
|
|
no dependencies on the particular format of the exec_hdr. */
|
|
|
|
file_ptr sym_filepos;
|
|
file_ptr str_filepos;
|
|
file_ptr reloc_filepos;
|
|
|
|
unsigned stringtab_size;
|
|
};
|
|
|
|
struct som_data_struct
|
|
{
|
|
struct somdata a;
|
|
};
|
|
|
|
/* Used to keep extra SOM specific information for a given section.
|
|
|
|
reloc_size holds the size of the relocation stream, note this
|
|
is very different from the number of relocations as SOM relocations
|
|
are variable length.
|
|
|
|
reloc_stream is the actual stream of relocation entries.
|
|
|
|
The BFD section index may not exactly match a SOM subspace index,
|
|
for this reason we keep track of the original SOM subspace index
|
|
when a subspace is turned into a BFD section. */
|
|
|
|
struct som_section_data_struct
|
|
{
|
|
unsigned int reloc_size;
|
|
char *reloc_stream;
|
|
unsigned int subspace_index;
|
|
asection *containing_space;
|
|
int is_space;
|
|
struct space_dictionary_record space_dict;
|
|
int is_subspace;
|
|
struct subspace_dictionary_record subspace_dict;
|
|
};
|
|
|
|
#define somdata(bfd) ((bfd)->tdata.som_data->a)
|
|
#define obj_som_file_hdr(bfd) (somdata(bfd).file_hdr)
|
|
#define obj_som_copyright_hdr(bfd) (somdata(bfd).copyright_aux_hdr)
|
|
#define obj_som_version_hdr(bfd) (somdata(bfd).version_aux_hdr)
|
|
#define obj_som_symtab(bfd) (somdata(bfd).symtab)
|
|
#define obj_som_stringtab(bfd) (somdata(bfd).stringtab)
|
|
#define obj_som_sym_filepos(bfd) (somdata(bfd).sym_filepos)
|
|
#define obj_som_str_filepos(bfd) (somdata(bfd).str_filepos)
|
|
#define obj_som_stringtab_size(bfd) (somdata(bfd).stringtab_size)
|
|
#define obj_som_reloc_filepos(bfd) (somdata(bfd).reloc_filepos)
|
|
#define som_section_data(sec) \
|
|
((struct som_section_data_struct *)sec->used_by_bfd)
|
|
#define som_symbol_data(symbol) \
|
|
((som_symbol_type *) symbol)
|
|
|
|
|
|
/* Defines groups of basic relocations. FIXME: These should
|
|
be the only basic relocations created by GAS. The rest
|
|
should be internal to the BFD backend.
|
|
|
|
The idea is both SOM and ELF define these basic relocation
|
|
types so they map into a SOM or ELF specific reloation as
|
|
appropriate. This allows GAS to share much more code
|
|
between the two object formats. */
|
|
|
|
#define R_HPPA_NONE R_NO_RELOCATION
|
|
#define R_HPPA R_CODE_ONE_SYMBOL
|
|
#define R_HPPA_ABS_CALL R_ABS_CALL
|
|
#define R_HPPA_PCREL_CALL R_PCREL_CALL
|
|
#define R_HPPA_GOTOFF R_DP_RELATIVE
|
|
#define R_HPPA_COMPLEX R_COMP1
|
|
#define R_HPPA_COMPLEX_PCREL_CALL R_COMP2
|
|
#define R_HPPA_COMPLEX_ABS_CALL R_COMP3
|
|
#define R_HPPA_ENTRY R_ENTRY
|
|
#define R_HPPA_EXIT R_EXIT
|
|
|
|
/* Exported functions, mostly for use by GAS. */
|
|
void bfd_som_set_section_attributes PARAMS ((asection *, int, int,
|
|
unsigned int, int));
|
|
void bfd_som_set_subsection_attributes PARAMS ((asection *, asection *,
|
|
int, unsigned int, int));
|
|
void bfd_som_set_symbol_type PARAMS ((asymbol *, unsigned int));
|
|
void bfd_som_attach_unwind_info PARAMS ((asymbol *, char *));
|
|
boolean bfd_som_attach_aux_hdr PARAMS ((bfd *, int, char *));
|
|
int ** hppa_som_gen_reloc_type
|
|
PARAMS ((bfd *, int, int, enum hppa_reloc_field_selector_type_alt));
|
|
#endif /* _SOM_H */
|