From 7a276b09e5fa888d486cf5f298ae76147969d7c4 Mon Sep 17 00:00:00 2001 From: Steve Chamberlain Date: Thu, 4 Jul 1991 16:56:17 +0000 Subject: [PATCH] *** empty log message *** --- bfd/ChangeLog | 49 +- include/bfd.h | 1767 +++++++++++++++++++++++++++++++++---------------- 2 files changed, 1235 insertions(+), 581 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 1148a0ed394..859a71914eb 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,7 +1,50 @@ -Fri Jun 7 12:35:46 1991 Sean Fagan (sef at cygint.cygnus.com) +Thu Jul 4 09:53:16 1991 Steve Chamberlain (steve at cygint.cygnus.com) + + * Everything: created some new files, core.c format.c, reloc.c, + section.c and syms.c to split the functionality a bit better. + Cleaned up the rest of the files a bit, and added some + documentation. + + +Mon Jul 1 13:29:47 1991 David Wood (wood at david.ultra.nya.edu) + + * opncls.c, ../include/sys/h-sun3.h ../include/sys/h-sun4.h: fcntl + really takes 3 arguments, patched code and ammended prototypes. + +Fri Jun 14 13:19:40 1991 Steve Chamberlain (steve at cygint.cygnus.com) - * coffcode.h (coff_swap_aux_in): added else case to deal with - filenames less than 9 characters. + * ../include/bfd.h (struct bfd_target): Added new field + "align_power_min" which contains the minimum alignment for a + section. This is used in coff_new_section_hook. The field + insertion necessitates an update of all backends.. + + * aoutf1.h jump table field inserted + + * archive.c(snarf_ar_hdr)(bfd_slurp_coff_armap) can now parse dgux style extended + filenames too. + + * bout.c(b_out_squirt_out_relocs) fix to assertion tests. Jump + table field inserted. + + * coffcode.h(just about everything) Now patches up symbol tables + using a different mechanism. The Intel major bug has been fixed, + and the linker can self host on the Aviion and be debugged with + gdb. + + * ecoff.c: new include and jump table patch, i386coff.c: new + include and jump table patch, icoff.c: new include and jump table + patch, ieee.c: can now read archives containing ieee modules., + libcoff.h: added (combined_entry_type), libieee.h: uped max + sections to 20, m68kcoff.c: new include and jump table patch, + m88kbcs.c: new include and jump table patch, oasys.c: various bugs + fixed. opncls.c: added bfd_alloc_grow and bfd_alloc_finish. + srec.c: jump table patch. trad-code.c fixed #IF typeo + +Fri Jun 7 12:35:46 1991 Sean Fagan (sef at cygint.cygnus.com) + + * coffcode.h (coff_swap_aux_in): added else case to deal with + filenames less than 9 characters. + Thu Jun 6 18:27:38 1991 Steve Chamberlain (steve at cygint.cygnus.com) diff --git a/include/bfd.h b/include/bfd.h index 0d0b94e5a68..9c2c167a53b 100644 --- a/include/bfd.h +++ b/include/bfd.h @@ -1,6 +1,12 @@ /* A -*- C -*- header file for the bfd library */ -/* bfd.h -- The only header file required by users of the bfd library */ +/* bfd.h -- The only header file required by users of the bfd library + */ + +/* WARNING: +This file is generated from various .c files, if you change it, your +bits may be lost +*/ /* Copyright (C) 1990, 1991 Free Software Foundation, Inc. @@ -100,48 +106,6 @@ typedef enum bfd_format { #define WP_TEXT 0200 #define D_PAGED 0400 -/* This enum gives the object file's CPU architecture, in a global sense. - E.g. what processor family does it belong to? There is another field, - which indicates what processor within the family is in use. */ -enum bfd_architecture { - bfd_arch_unknown, /* File arch not known */ - bfd_arch_obscure, /* File arch known, not one of these */ - bfd_arch_m68k, /* Motorola 68xxx */ - bfd_arch_vax, /* DEC Vax */ - bfd_arch_i960, /* Intel 960 */ - - /* The order of the following is important. - * A lower number indicates a machine type - * that only accepts a subset of the - * instructions available to machines with - * higher numbers. - * - * The exception is the "ca", which is - * incompatible with all other machines except - * "core". - */ -#define bfd_mach_i960_core 1 -#define bfd_mach_i960_ka_sa 2 -#define bfd_mach_i960_kb_sb 3 -#define bfd_mach_i960_mc 4 -#define bfd_mach_i960_xa 5 -#define bfd_mach_i960_ca 6 - - bfd_arch_a29k, /* AMD 29000 */ - bfd_arch_sparc, /* Sun (SPARC International) SPARC */ - bfd_arch_mips, /* MIPS Rxxxx */ - bfd_arch_i386, /* Intel 386 */ - bfd_arch_ns32k, /* National Semiconductor 32xxx */ - bfd_arch_tahoe, /* CCI/Harris Tahoe */ - bfd_arch_i860, /* Intel 860 */ - bfd_arch_romp, /* IBM ROMP RS/6000 */ - bfd_arch_alliant, /* Alliant */ - bfd_arch_convex, /* Convex */ - bfd_arch_m88k, /* Motorola 88xxx */ - bfd_arch_pyramid, /* Pyramid Technology */ - bfd_arch_h8_300, /* Hitachi H8/300 */ - bfd_arch_last -}; /* symbols and relocation */ @@ -159,46 +123,10 @@ typedef enum {bfd_symclass_unknown = 0, typedef int symtype; /* Who knows, yet? */ -/* Symbol cache classifications: (Bfd-Symbol-Flag_FOOBAR) */ -#define BSF_NO_FLAGS 0x00 -#define BSF_LOCAL 0x01 /* bfd_symclass_unknown */ -#define BSF_GLOBAL 0x02 /* bfd_symclass_global */ -#define BSF_IMPORT 0x04 -#define BSF_EXPORT 0x08 -#define BSF_UNDEFINED 0x10 /* bfd_symclass_undefined */ -#define BSF_FORT_COMM 0x20 /* bfd_symclass_fcommon */ -#define BSF_DEBUGGING 0x40 /* bfd_symclass_debugger */ -#define BSF_ABSOLUTE 0x80 -#define BSF_KEEP 0x10000 -#define BSF_WARNING 0x20000 -#define BSF_KEEP_G 0x80000 -#define BSF_WEAK 0x100000 -#define BSF_CTOR 0x200000 /* Symbol is a con/destructor */ -#define BSF_FAKE 0x400000 /* Symbol doesn't really exist */ -#define BSF_OLD_COMMON 0x800000 /* Symbol used to be common, - but now is allocated */ - -/* If symbol is fort_comm, then value is size, and this is the contents */ -#define BFD_FORT_COMM_DEFAULT_VALUE 0 - -/* in some files the type of a symbol sometimes alters its location - in an output file - ie in coff a ISFCN symbol which is also C_EXT - symbol appears where it was declared and not at the end of a section. - This bit is set by the target bfd part to convey this information. */ -#define BSF_NOT_AT_END 0x40000 - /* general purpose part of a symbol; target specific parts will be found in libcoff.h, liba.out.h etc */ -typedef struct symbol_cache_entry -{ - struct _bfd *the_bfd; /* Just a way to find out host type */ - CONST char *name; - symvalue value; - flagword flags; - struct sec *section; - PTR udata; /* Target-specific stuff */ -} asymbol; + #define bfd_get_section(x) ((x)->section) #define bfd_get_output_section(x) ((x)->section->output_section) @@ -213,84 +141,6 @@ typedef struct carsym { file_ptr file_offset; /* look here to find the file */ } carsym; /* to make these you call a carsymogen */ -/* Relocation stuff */ - -/* Either: sym will point to a symbol and isextern will be 0, *OR* - sym will be NULL and isextern will be a symbol type (eg N_TEXT) - which means the location should be relocated relative to the - segment origin. This is because we won't necessarily have a symbol - which is guaranteed to point to the segment origin. */ - -typedef enum bfd_reloc_status { - bfd_reloc_ok, - bfd_reloc_overflow, - bfd_reloc_outofrange, - bfd_reloc_continue, - bfd_reloc_notsupported, - bfd_reloc_other, - bfd_reloc_undefined, - bfd_reloc_dangerous} - bfd_reloc_status_enum_type; - -typedef CONST struct rint -{ - unsigned int type; - unsigned int rightshift; - unsigned int size; - unsigned int bitsize; - boolean pc_relative; - unsigned int bitpos; - - boolean absolute; - boolean complain_on_overflow; - bfd_reloc_status_enum_type (*special_function)(); - char *name; - boolean partial_inplace; - /* Two mask fields, - the src_mask is used to select what parts of the read in data are to - be used in the relocation sum. Eg, if this was an 8 bit bit of data - which we read and relocated, this would be 0x000000ff. When we have - relocs which have an addend, such as sun4 extended relocs, the value - in the offset part of a relocating field is garbage so we never use - it. In this case the mask would be 0x00000000. - - The dst_mask is what parts of the instruction are replaced into the - instruction. In most cases src_mask == dst_mask, except in the above - special case, where dst_mask would be 0x000000ff, and src_mask would - be 0x00000000. - */ - bfd_word src_mask; /* What things to take from the source */ - bfd_word dst_mask; /* What things to put into the dest */ - - /* Does a pc rel offset already have the offset of the jump from the - beginnining of the module in place - eg on the sun3, a pcrel - instruction always has a negative number in place, containing the - displacement from the beginning of the module. 88k bcs has a zero - in there, so you have to work out the offset yourself. */ - boolean pcrel_offset; -} reloc_howto_type; - -#define HOWTO(CODE, RT,SIZE,BITSIZE, PCREL, BITPOS, ABS, OVERFLOW, SF, NAME, INPLACE, MASKSRC, MASKDST, PCRELDONE) \ -{(unsigned)CODE,RT,SIZE,BITSIZE, PCREL, BITPOS,ABS,OVERFLOW,SF,NAME,INPLACE,MASKSRC,MASKDST,PCRELDONE} - -typedef unsigned char bfd_byte; - -typedef struct reloc_cache_entry -{ - /* A pointer into the canonicalized table for the symbol */ - asymbol **sym_ptr_ptr; - - rawdata_offset address; /* offset in section */ - bfd_vma addend; /* addend for relocation value */ - struct sec *section; /* if sym is null this is the section */ - reloc_howto_type *howto; - -} arelent; - -typedef struct relent_chain { - arelent relent; - struct relent_chain *next; -} arelent_chain; /* Used in generating armaps. Perhaps just a forward definition would do? */ struct orl { /* output ranlib */ @@ -305,67 +155,13 @@ struct orl { /* output ranlib */ typedef struct lineno_cache_entry { unsigned int line_number; /* Linenumber from start of function*/ union { - asymbol *sym; /* Function name */ + struct symbol_cache_entry *sym; /* Function name */ unsigned long offset; /* Offset into section */ } u; } alent; /* object and core file sections */ -/* Section flag definitions */ -#define SEC_NO_FLAGS 000 -#define SEC_ALLOC 001 -#define SEC_LOAD 002 -#define SEC_RELOC 004 -#define SEC_BALIGN 010 -#define SEC_READONLY 020 -#define SEC_CODE 040 -#define SEC_DATA 0100 -#define SEC_ROM 0200 -#define SEC_CONSTRUCTOR 0400 -#define SEC_HAS_CONTENTS (0x200) - -typedef struct sec -{ - CONST char *name; - struct sec *next; - flagword flags; - - bfd_vma vma; - bfd_size_type size; - - /* The output_offset is the indent into the output section of - this section. If this is the first section to go into - an output section, this value will be 0... */ - bfd_vma output_offset; - struct sec *output_section; - unsigned int alignment_power; /* eg 4 aligns to 2^4*/ - - arelent *relocation; /* for input files */ - arelent **orelocation; /* for output files */ - - unsigned reloc_count; - file_ptr filepos; /* File position of section data */ - file_ptr rel_filepos; /* File position of relocation info */ - file_ptr line_filepos; - PTR *userdata; - struct lang_output_section *otheruserdata; - int index; /* Which section is it 0..nth */ - alent *lineno; - unsigned int lineno_count; - - /* When a section is being output, this value changes as more - linenumbers are written out */ - file_ptr moving_line_filepos; - - /* what the section number is in the target world */ - unsigned int target_index; - - PTR used_by_bfd; - - /* If this is a constructor section then here is a list of relents */ - arelent_chain *constructor_chain; -} asection; #define align_power(addr, align) \ ( ((addr) + ((1<<(align))-1)) & (-1 << (align))) @@ -415,155 +211,6 @@ typedef enum bfd_print_symbol } bfd_print_symbol_enum_type; -/* The BFD target structure. - - This structure is how to find out everything BFD knows about a target. - It includes things like its byte order, name, what routines to call - to do various operations, etc. - - Every BFD points to a target structure with its "xvec" member. */ - -/* Shortcut for declaring fields which are prototyped function pointers, - while avoiding anguish on compilers that don't support protos. */ - -#define SDEF(ret, name, arglist) PROTO(ret,(*name),arglist) -#define SDEF_FMT(ret, name, arglist) PROTO(ret,(*name[bfd_type_end]),arglist) - -/* These macros are used to dispatch to functions through the bfd_target - vector. They are used in a number of macros further down in bfd.h, - and are also used when calling various routines by hand inside the - bfd implementation. The "arglist" argument must be parenthesized; - it contains all the arguments to the called function. */ - -#define BFD_SEND(bfd, message, arglist) ((*((bfd)->xvec->message)) arglist) -/* For operations which index on the bfd format */ -#define BFD_SEND_FMT(bfd, message, arglist) \ - (((bfd)->xvec->message[(int)((bfd)->format)]) arglist) - -/* This is the struct which defines the type of BFD this is. The - "xvec" member of the struct bfd itself points here. Each module - that implements access to a different target under BFD, defines - one of these. */ - -/* FIXME, these names should be rationalised with the names of the entry points - which call them. Too bad we can't have one macro to define them both! */ -typedef struct bfd_target -{ - /* identifies the kind of target, eg SunOS4, Ultrix, etc */ - char *name; - - /* This is bogus. Anything that can be told from the "flavour" - by some user program should be an independent attribute that can - be queried instead. FIXME. -- gnu@cygnus.com */ - enum target_flavour_enum { - bfd_target_aout_flavour_enum, - bfd_target_coff_flavour_enum, - bfd_target_ieee_flavour_enum, - bfd_target_oasys_flavour_enum, - bfd_target_srec_flavour_enum} flavour; - - boolean byteorder_big_p; /* Order of bytes in data sections */ - boolean header_byteorder_big_p; /* Order of bytes in header */ - - flagword object_flags; /* these are the ones that may be set */ - flagword section_flags; /* ditto */ - - char ar_pad_char; /* filenames in archives padded w/this char */ - unsigned short ar_max_namelen; /* this could be a char too! */ - - unsigned int align_power_min; /* alignment for sections */ - /* Byte swapping for data */ - /* Note that these don't take bfd as first arg. Certain other handlers - could do the same. */ - SDEF (bfd_64_type, bfd_getx64, (bfd_byte *)); - SDEF (void, bfd_putx64, (bfd_64_type, bfd_byte *)); - SDEF (unsigned int, bfd_getx32, (bfd_byte *)); - SDEF (void, bfd_putx32, (unsigned long, bfd_byte *)); - SDEF (unsigned int, bfd_getx16, (bfd_byte *)); - SDEF (void, bfd_putx16, (int, bfd_byte *)); - - /* Byte swapping for headers */ - SDEF (bfd_64_type, bfd_h_getx64, (bfd_byte *)); - SDEF (void, bfd_h_putx64, (bfd_64_type, bfd_byte *)); - SDEF (unsigned int, bfd_h_getx32, (bfd_byte *)); - SDEF (void, bfd_h_putx32, (unsigned long, bfd_byte *)); - SDEF (unsigned int, bfd_h_getx16, (bfd_byte *)); - SDEF (void, bfd_h_putx16, (int, bfd_byte *)); - - /* Format-dependent */ - /* Check the format of a file being read. Return bfd_target * or zero. */ - SDEF_FMT (struct bfd_target *, _bfd_check_format, (bfd *)); - /* Set the format of a file being written. */ - SDEF_FMT (boolean, _bfd_set_format, (bfd *)); - /* Write cached information into a file being written, at bfd_close. */ - SDEF_FMT (boolean, _bfd_write_contents, (bfd *)); - - /* All these are defined in JUMP_TABLE */ - /* Core files */ - SDEF (char *, _core_file_failing_command, (bfd *)); - SDEF (int, _core_file_failing_signal, (bfd *)); - SDEF (boolean, _core_file_matches_executable_p, (bfd *, bfd *)); - - /* Archives */ - SDEF (boolean, _bfd_slurp_armap, (bfd *)); - SDEF (boolean, _bfd_slurp_extended_name_table, (bfd *)); - SDEF (void, _bfd_truncate_arname, (bfd *, CONST char *, char *)); - SDEF (boolean, write_armap, (bfd *arch, unsigned int elength, - struct orl *map, int orl_count, int - stridx)); - - /* All the standard stuff */ - SDEF (boolean, _close_and_cleanup, (bfd *)); /* free any allocated data */ - SDEF (boolean, _bfd_set_section_contents, (bfd *, sec_ptr, PTR, - file_ptr, bfd_size_type)); - SDEF (boolean, _bfd_get_section_contents, (bfd *, sec_ptr, PTR, - file_ptr, bfd_size_type)); - SDEF (boolean, _new_section_hook, (bfd *, sec_ptr)); - - /* Symbols and relocation */ - SDEF (unsigned int, _get_symtab_upper_bound, (bfd *)); - SDEF (unsigned int, _bfd_canonicalize_symtab, (bfd *, asymbol **)); - SDEF (unsigned int, _get_reloc_upper_bound, (bfd *, sec_ptr)); - SDEF (unsigned int, _bfd_canonicalize_reloc, (bfd *, sec_ptr, arelent **, - asymbol**)); - - /* FIXME: For steve -- clean up later */ - SDEF (asymbol *, _bfd_make_empty_symbol, (bfd *)); - SDEF (void, _bfd_print_symbol, (bfd *, PTR, asymbol *, - bfd_print_symbol_enum_type)); - SDEF (alent *, _get_lineno, (bfd *, asymbol *)); - - SDEF (boolean, _bfd_set_arch_mach, (bfd *, enum bfd_architecture, - unsigned long)); - - SDEF (bfd *, openr_next_archived_file, (bfd *arch, bfd *prev)); - SDEF (boolean, _bfd_find_nearest_line, - (bfd *abfd, asection *section, asymbol **symbols,bfd_vma offset, - CONST char **file, CONST char **func, unsigned int *line)); - SDEF (int, _bfd_stat_arch_elt, (bfd *, struct stat *)); - - SDEF (int, _bfd_sizeof_headers, (bfd *, boolean)); - - /* Jumps for coff swapping */ - - SDEF(void, _bfd_coff_swap_aux_in,( - bfd *abfd , - PTR ext, - int type, - int class , - PTR in)); - - SDEF(void, _bfd_coff_swap_sym_in,( - bfd *abfd , - PTR ext, - PTR in)); - - SDEF(void, _bfd_coff_swap_lineno_in, ( - bfd *abfd, - PTR ext, - PTR in)); - -} bfd_target; /* The code that implements targets can initialize a jump table with this macro. It must name all its routines the same way (a prefix plus @@ -602,7 +249,10 @@ CAT(NAME,_set_arch_mach),\ CAT(NAME,_openr_next_archived_file),\ CAT(NAME,_find_nearest_line),\ CAT(NAME,_generic_stat_arch_elt),\ -CAT(NAME,_sizeof_headers) +CAT(NAME,_sizeof_headers),\ +CAT(NAME,_bfd_debug_info_start),\ +CAT(NAME,_bfd_debug_info_end),\ +CAT(NAME,_bfd_debug_info_accumulate) #define COFF_SWAP_TABLE coff_swap_aux_in, coff_swap_sym_in, coff_swap_lineno_in, @@ -637,264 +287,1225 @@ extern CONST short _bfd_host_big_endian; #define bfd_get_architecture(abfd) ((abfd)->obj_arch) #define bfd_get_machine(abfd) ((abfd)->obj_machine) -/* Finally! The BFD struct itself. This contains the major data about - the file, and contains pointers to the rest of the data. - To avoid dragging too many header files into every file that - includes bfd.h, IOSTREAM has been declared as a "char *", and MTIME - as a "long". Their correct types, to which they are cast when used, - are "FILE *" and "time_t". */ +#define BYTE_SIZE 1 +#define SHORT_SIZE 2 +#define LONG_SIZE 4 + + + +/*THE FOLLOWING IS EXTRACTED FROM THE SOURCE */ + +/* Opens the file supplied (using fopen) with the target supplied, it +returns a pointer to the created bfd. + +If NULL is returned then an error has occured. +Possible errors are no_memory, invalid_target or system_call error. +*/ +PROTO(bfd*, bfd_openr, (CONST char *filename,CONST char*target)); +/* bfd_fdopenr is to bfd_fopenr much like fdopen is to fopen. It opens a bfd on +a file already described by the @var{fd} supplied. + +Possible errors are no_memory, invalid_target and system_call error. +*/ + PROTO(bfd *, bfd_fdopenr, + (CONST char *filename, CONST char *target, int fd)); +/* Creates a bfd, associated with file @var{filename}, using the file +format @var{target}, and returns a pointer to it. + +Possible errors are system_call_error, no_memory, invalid_target. +*/ +PROTO(bfd *, bfd_openw, (CONST char *filename, CONST char *target)); +/* This function closes a bfd. If the bfd was open for writing, then +pending operations are completed and the file written out and closed. +If the created file is executable, then @code{chmod} is called to mark +it as such. + +All memory attatched to the bfd's obstacks is released. + +@code{true} is returned if all is ok, otherwise @code{false}. +*/ +PROTO(boolean, bfd_close,(bfd *)); +/* This routine creates a new bfd in the manner of bfd_openw, but without +opening a file. The new bfd takes the target from the target used by +@var{template}. The format is always set to @code{bfd_object}. + +*/ +PROTO(bfd *, bfd_create, (CONST char *filename, bfd *template)); +/* Return the number of bytes in the obstacks connected to the supplied +bfd. +*/ +PROTO(bfd_size_type,bfd_alloc_size,(bfd *abfd)); +/* This enum gives the object file's CPU +architecture, in a global sense. E.g. what processor family does it +belong to? There is another field, which indicates what processor +within the family is in use. The machine gives a number which +distingushes different versions of the architecture, containing for +example 2 and 3 for Intel i960 KA and i960 KB, and 68020 and 68030 for +Motorola 68020 and 68030. + +*/ +enum bfd_architecture +{ + bfd_arch_unknown, /* File arch not known */ + bfd_arch_obscure, /* Arch known, not one of these */ + bfd_arch_m68k, /* Motorola 68xxx */ + bfd_arch_vax, /* DEC Vax */ + bfd_arch_i960, /* Intel 960 */ + /* The order of the following is important. + lower number indicates a machine type that + only accepts a subset of the instructions + available to machines with higher numbers. + The exception is the "ca", which is + incompatible with all other machines except + "core". */ + +#define bfd_mach_i960_core 1 +#define bfd_mach_i960_ka_sa 2 +#define bfd_mach_i960_kb_sb 3 +#define bfd_mach_i960_mc 4 +#define bfd_mach_i960_xa 5 +#define bfd_mach_i960_ca 6 + + bfd_arch_a29k, /* AMD 29000 */ + bfd_arch_sparc, /* SPARC */ + bfd_arch_mips, /* MIPS Rxxxx */ + bfd_arch_i386, /* Intel 386 */ + bfd_arch_ns32k, /* National Semiconductor 32xxx */ + bfd_arch_tahoe, /* CCI/Harris Tahoe */ + bfd_arch_i860, /* Intel 860 */ + bfd_arch_romp, /* IBM ROMP RS/6000 */ + bfd_arch_alliant, /* Alliant */ + bfd_arch_convex, /* Convex */ + bfd_arch_m88k, /* Motorola 88xxx */ + bfd_arch_pyramid, /* Pyramid Technology */ + bfd_arch_h8_300, /* Hitachi H8/300 */ + bfd_arch_last + }; + +/* stuff +*/ + +/* Return a printable string representing the architecture and machine +type. The result is only good until the next call to +bfd_printable_arch_mach. +*/ +PROTO(CONST char *,bfd_printable_arch_mach, + (enum bfd_architecture arch, unsigned long machine)); +/* Scan a string and attempt to turn it into an archive and machine type combination. +*/ +PROTO(boolean, bfd_scan_arch_mach, + (CONST char *, enum bfd_architecture *, unsigned long *)); +/* This routine is used to determine whether two BFDs' architectures and machine types are +compatible. It calculates the lowest common denominator between the +two architectures and machine types implied by the bfds and sets the +objects pointed at by @var{archp} and @var{machine} if non NULL. + +This routine returns @code{true} if the bfds are of compatible type, +otherwise @code{false}. +*/ +PROTO(boolean, bfd_arch_compatible, + (bfd *abfd, + bfd *bbfd, + enum bfd_architecture *archp, + unsigned long *machinep)); +/* Set atch mach +*/ +#define bfd_set_arch_mach(abfd, arch, mach) \ + BFD_SEND (abfd, _bfd_set_arch_mach,\ + (abfd, arch, mach)) + +/* These macros as used for reading and writing raw data in sections; +each access (except for bytes) is vectored through the target format +of the bfd and mangled accordingly. The mangling performs any +necessary endian translations and removes alignment restrictions. +*/ +#define bfd_put_8(abfd, val, ptr) \ + (*((char *)ptr) = (char)val) +#define bfd_get_8(abfd, ptr) \ + (*((char *)ptr)) +#define bfd_put_16(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_putx16, (val,ptr)) +#define bfd_get_16(abfd, ptr) \ + BFD_SEND(abfd, bfd_getx16, (ptr)) +#define bfd_put_32(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_putx32, (val,ptr)) +#define bfd_get_32(abfd, ptr) \ + BFD_SEND(abfd, bfd_getx32, (ptr)) +#define bfd_put_64(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_putx64, (val, ptr)) +#define bfd_get_64(abfd, ptr) \ + BFD_SEND(abfd, bfd_getx64, (ptr)) + +/* These macros have the same function as their @code{bfd_get_x} +bretherin, except that they are used for removing information for the +header records of object files. Believe it or not, some object files +keep their header records in big endian order, and their data in little +endan order. +*/ +#define bfd_h_put_8(abfd, val, ptr) \ + (*((char *)ptr) = (char)val) +#define bfd_h_get_8(abfd, ptr) \ + (*((char *)ptr)) +#define bfd_h_put_16(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_h_putx16,(val,ptr)) +#define bfd_h_get_16(abfd, ptr) \ + BFD_SEND(abfd, bfd_h_getx16,(ptr)) +#define bfd_h_put_32(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_h_putx32,(val,ptr)) +#define bfd_h_get_32(abfd, ptr) \ + BFD_SEND(abfd, bfd_h_getx32,(ptr)) +#define bfd_h_put_64(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_h_putx64,(val, ptr)) +#define bfd_h_get_64(abfd, ptr) \ + BFD_SEND(abfd, bfd_h_getx64,(ptr)) + +/* The shape of a section struct: + +*/ +typedef struct sec { + + /* The name of the section, the name isn't a copy, the pointer is + the same as that passed to bfd_make_section. + */ + CONST char *name; + + /* The next section in the list belonging to the bfd, or NULL. + */ + struct sec *next; + + /* The field flags contains attributes of the section. Some of these + flags are read in from the object file, and some are synthesized from + other information. + */ +flagword flags; +#define SEC_NO_FLAGS 0x000 + + /* Tells the OS to allocate space for this section when loaded. + This would clear for a section containing debug information only. + */ +#define SEC_ALLOC 0x001 + + /* Tells the OS to load the section from the file when loading. + This would be clear for a .bss section + */ +#define SEC_LOAD 0x002 + + /* The section contains data still to be relocated, so there will be some + relocation information too. + */ +#define SEC_RELOC 0x004 + + /* Obsolete ? + */ +#define SEC_BALIGN 0x008 + + /* A signal to the OS that the section contains read only data. + */ +#define SEC_READONLY 0x010 + + /* The section contains code only. + */ +#define SEC_CODE 0x020 + + /* The section contains data only. + */ +#define SEC_DATA 0x040 + + /* The section will reside in ROM. + */ +#define SEC_ROM 0x080 + + /* The section contains constructor information. This section type is + used by the linker to create lists of constructors and destructors + used by @code{g++}. When a back end sees a symbol which should be used + in a constructor list, it creates a new section for the type of name + (eg @code{__CTOR_LIST__}), attatches the symbol to it and builds a + relocation. To build the lists of constructors, all the linker has to + to is catenate all the sections called @code{__CTOR_LIST__} and + relocte the data contained within - exactly the operations it would + peform on standard data. + */ +#define SEC_CONSTRUCTOR 0x100 + + /* The section has contents - a bss section could be + @code{SEC_ALLOC} | @code{SEC_HAS_CONTENTS}, a debug section could be + @code{SEC_HAS_CONTENTS} + */ +#define SEC_HAS_CONTENTS 0x200 + + /* An instruction to the linker not to output sections containing + this flag even if they have information which would normally be written. + */ +#define SEC_NEVER_LOAD 0x400 + + /* The base address of the section in the address space of the target. + */ + bfd_vma vma; + + /* The size of the section in bytes of the loaded section. This contains + a value even if the section has no contents (eg, the size of @code{.bss}). + */ + bfd_size_type size; + + /* If this section is going to be output, then this value is the + offset into the output section of the first byte in the input + section. Eg, if this was going to start at the 100th byte in the + output section, this value would be 100. + */ + bfd_vma output_offset; + + /* The output section through which to map on output. + */ + struct sec *output_section; + + /* The alignment requirement of the section, as an exponent - eg 3 + aligns to 2^3 (or 8) + */ + unsigned int alignment_power; + + /* If an input section, a pointer to a vector of relocation records for + the data in this section. + */ + struct reloc_cache_entry *relocation; + + /* If an output section, a pointer to a vector of pointers to + relocation records for the data in this section. + */ + struct reloc_cache_entry **orelocation; + + /* The number of relocation records in one of the above + */ + unsigned reloc_count; + + /* Which section is it 0..nth + */ + int index; + + /* Information below is back end specific - and not always used or + updated + + File position of section data + */ + file_ptr filepos; + + /* File position of relocation info + */ + file_ptr rel_filepos; + + /* File position of line data + */ + file_ptr line_filepos; + + /* Pointer to data for applications + */ + PTR userdata; + struct lang_output_section *otheruserdata; + + /* Attached line number information + */ + alent *lineno; + + /* Number of line number records + */ + unsigned int lineno_count; + + /* When a section is being output, this value changes as more + linenumbers are written out + */ + file_ptr moving_line_filepos; + + /* what the section number is in the target world + */ + unsigned int target_index; + PTR used_by_bfd; + + /* If this is a constructor section then here is a list of the + relocations created to relocate items within it. + */ + struct relent_chain *constructor_chain; + + /* The bfd which owns the section. + */ + bfd *owner; +} asection ; + +/* Runs through the provided @var{abfd} and returns the @code{asection} +who's name matches that provided, otherwise NULL. @xref{Sections}, for more information. + +*/ +PROTO(asection *, bfd_get_section_by_name, + (bfd *abfd, CONST char *name)); +/* This function creates a new empty section called @var{name} and attatches it +to the end of the chain of sections for @var{bfd}. An attempt to +create a section with a name which is already in use, returns the old +section by that name instead. + +Possible errors are: +@table @code +@item invalid_operation +If output has already started for this bfd. +@item no_memory +If obstack alloc fails. +@end table + +*/ +PROTO(asection *, bfd_make_section, (bfd *, CONST char *name)); +/* Attempts to set the attributes of the section named in the bfd +supplied to the value. Returns true on success, false on error. +Possible error returns are: +@table @code +@item invalid operation +The section cannot have one or more of the attributes requested. For +example, a .bss section in @code{a.out} may not have the +@code{SEC_HAS_CONTENTS} field set. +@end table + +*/ +PROTO(boolean, bfd_set_section_flags, + (bfd *, asection *, flagword)); +/* Calls the provided function @var{func} for each section attatched to +the bfd @var{abfd}, passing @var{obj} as an argument. The function +will be called as if by + +@example + func(abfd, the_section, obj); +@end example + + +*/ +PROTO(void, bfd_map_over_sections, + (bfd *abfd, void (*func)(), PTR obj)); +/* This is the prefered method for iterating over sections, an +alternative would be to use a loop: + +@example + section *p; + for (p = abfd->sections; p != NULL; p = p->next) + func(abfd, p, ...) +@end example*/ + +/* Sets @var{section} to the size @var{val}. If the operation is ok, then +@code{true} is returned, else @code{false}. + +Possible error returns: +@table @code +@item invalid_operation +Writing has started to the bfd, so setting the size is invalid +@end table + +*/ +PROTO(boolean, bfd_set_section_size, + (bfd *, asection *, bfd_size_type val)); +/* Sets the contents of the section @var{section} in bfd @var{abfd} to +the data starting in memory at @var{data}. The data is written to the +output section starting at offset @var{offset} for @var{count} bytes. + +Normally @code{true} is returned, else @code{false}. Possible error +returns are: +@table @code +@item no_contents +The output section does not have the @code{SEC_HAS_CONTENTS} +attribute, so nothing can be written to it. +@item and some more too +@end table +This routine is front end to the back end function @code{_bfd_set_section_contents}. + +*/ +PROTO(boolean, bfd_set_section_contents, + (bfd *abfd, + asection *section, + PTR data, + file_ptr offset, + bfd_size_type count)); +/* This function reads data from @var{section} in bfd @var{abfd} into +memory starting at @var{location}. The data is read at an offset of +@var{offset} from the start of the input section, and is read for +@var{count} bytes. + +If the contents of a constuctor with the @code{SEC_CONSTUCTOR} flag +set are requested, then the @var{location} is filled with zeroes. + +If no errors occur, @code{true} is returned, else @code{false}. +Possible errors are: + +@table @code +@item unknown yet +@end table + +*/ +PROTO(boolean, bfd_get_section_contents, + (bfd *abfd, asection *section, PTR location, + file_ptr offset, bfd_size_type count)); +/* @subsection typedef asymbol +An @code{asymbol} has the form: + +*/ +typedef struct symbol_cache_entry +{ + + /* A pointer to the bfd which owns the symbol. This information is + necessary so that a back end can work out what additional (invisible to + the application writer) information is carried with the symbol. + */ + struct _bfd *the_bfd; + + /* The text of the symbol. The name is left alone, and not copied - the + application may not alter it. + */ + CONST char *name; + + /* The value of the symbol. + */ + symvalue value; + + /* Attributes of a symbol: + */ +#define BSF_NO_FLAGS 0x00 + + /* The symbol has local scope; @code{static} in @code{C}. The value is + the offset into the section of the data. + */ +#define BSF_LOCAL 0x01 + + /* The symbol has global scope; initialized data in @code{C}. The value + is the offset into the section of the data. + */ +#define BSF_GLOBAL 0x02 + + /* Obsolete + */ +#define BSF_IMPORT 0x04 + + /* The symbol has global scope, and is exported. The value is the offset + into the section of the data. + */ +#define BSF_EXPORT 0x08 + + /* The symbol is undefined. @code{extern} in @code{C}. The value has no meaning. + */ +#define BSF_UNDEFINED 0x10 + + /* The symbol is common, initialized to zero; default in @code{C}. The + value is the size of the object in bytes. + */ +#define BSF_FORT_COMM 0x20 + + /* A normal @code{C} symbol would be one of: + @code{BSF_LOCAL}, @code{BSF_FORT_COMM}, @code{BSF_UNDEFINED} or @code{BSF_EXPORT|BSD_GLOBAL} + + The symbol is a debugging record. The value has an arbitary meaning. + */ +#define BSF_DEBUGGING 0x40 + + /* The symbol has no section attached, any value is the actual value and + is not a relative offset to a section. + */ +#define BSF_ABSOLUTE 0x80 + + /* Used by the linker + */ +#define BSF_KEEP 0x10000 +#define BSF_WARNING 0x20000 +#define BSF_KEEP_G 0x80000 + + /* Unused + */ +#define BSF_WEAK 0x100000 +#define BSF_CTOR 0x200000 +#define BSF_FAKE 0x400000 + + /* The symbol used to be a common symbol, but now it is allocated. + */ +#define BSF_OLD_COMMON 0x800000 + + /* The default value for common data. + */ +#define BFD_FORT_COMM_DEFAULT_VALUE 0 + + /* In some files the type of a symbol sometimes alters its location + in an output file - ie in coff a @code{ISFCN} symbol which is also @code{C_EXT} + symbol appears where it was declared and not at the end of a section. + This bit is set by the target bfd part to convey this information. + */ +#define BSF_NOT_AT_END 0x40000 + flagword flags; + + /* Aointer to the section to which this symbol is relative, or 0 if the + symbol is absolute or undefined. Note that it is not sufficient to set + this location to 0 to mark a symbol as absolute - the flag + @code{BSF_ABSOLUTE} must be set also. + */ + struct sec *section; + + /* Back end special data. This is being phased out in favour of making + this a union. + */ + PTR udata; +} asymbol; + +/* Returns the number of bytes required in a vector of pointers to +@code{asymbols} for all the symbols in the supplied bfd, including a +terminal NULL pointer. If there are no symbols in the bfd, then 0 is +returned. +*/ +#define get_symtab_upper_bound(abfd) \ + BFD_SEND (abfd, _get_symtab_upper_bound, (abfd)) + +/* Supplied a bfd and a pointer to an uninitialized vector of pointers. +This reads in the symbols from the bfd, and fills in the table with +pointers to the symbols, and a trailing NULL. The routine returns the +actual number of symbol pointers not including the NULL. + +*/ +#define bfd_canonicalize_symtab(abfd, location) \ + BFD_SEND (abfd, _bfd_canonicalize_symtab,\ + (abfd, location)) + + +/* Provided a table of pointers to to symbols and a count, writes to the +output bfd the symbols when closed. + +*/ +PROTO(boolean, bfd_set_symtab, (bfd *, asymbol **, unsigned int )); +/* Prints the value and flags of the symbol supplied to the stream file. + +*/ +PROTO(void, bfd_print_symbol_vandf, (PTR file, asymbol *symbol)); +/* This function creates a new @code{asymbol} structure for the bfd, and +returns a pointer to it. + +This routine is necessary, since each back end has private information +surrounding the @code{asymbol}. Building your own @code{asymbol} and +pointing to it will not create the private information, and will cause +problems later on. +*/ +#define bfd_make_empty_symbol(abfd) \ + BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd)) + +/* @section typedef bfd + +Pointers to bfd structs are the cornerstone of any application using +libbfd. References though the bfd and to data in the bfd give the +entire bfd functionality. + +Finally! The BFD struct itself. This contains the major data about +the file, and contains pointers to the rest of the data. + +*/ struct _bfd { - CONST char *filename; /* could be null; filename user opened with */ - bfd_target *xvec; /* operation jump table */ - char *iostream; /* stdio FILE *, unless an archive element */ - - boolean cacheable; /* iostream can be closed if desired */ - boolean target_defaulted; /* Target type was default, not specific, - so we can try all the targets if needed. */ - struct _bfd *lru_prev; /* Used for file caching */ - struct _bfd *lru_next; /* Used for file caching */ - file_ptr where; /* Where the file was when closed */ + + /* The filename the application opened the bfd with. + */ + CONST char *filename; + + /* A pointer to the target jump table. + */ + struct bfd_target *xvec; + + /* To avoid dragging too many header files into every file that + includes bfd.h, IOSTREAM has been declared as a "char *", and MTIME + as a "long". Their correct types, to which they are cast when used, + are "FILE *" and "time_t". + + The iostream is the result of an fopen on the filename. + */ + char *iostream; + + /* Is the file being cached @xref{Caching}. + */ + boolean cacheable; + + /* Marks whether there was a default target specified when the bfd was + opened. This is used to select what matching algorithm to use to chose + the back end. + */ + boolean target_defaulted; + + /* The caching routines use these to maintain an LRU list of bfds. + */ + struct _bfd *lru_prev, *lru_next; + + /* When a file is closed by the caching routines, it retains the state + here: + */ + file_ptr where; + + /* and here: + */ boolean opened_once; - boolean mtime_set; /* Flag indicating mtime is available */ - long mtime; /* File modified time */ - int ifd; /* for output files, channel we locked. */ + boolean mtime_set; + + /* File modified time + */ + long mtime; + + /* For output files, channel we locked (is this used?). + */ +int ifd; + + /* The format which belongs to the bfd. + */ bfd_format format; - enum bfd_direction {no_direction = 0, - read_direction = 1, - write_direction = 2, - both_direction = 3} direction; - - flagword flags; /* format_specific */ - - /* Currently my_archive is tested before adding origin to anything. I - believe that this can become always an add of origin, with origin set - to 0 for non archive files. FIXME-soon. */ - file_ptr origin; /* for archive contents */ - boolean output_has_begun; /* cf bfd_set_section_size */ - asection *sections; /* Pointer to linked list of sections */ - unsigned int section_count; /* The number of sections */ - - /* Some object file stuff */ - bfd_vma start_address; /* for object files only, of course */ - unsigned int symcount; /* used for input and output */ - asymbol **outsymbols; /* symtab for output bfd */ - enum bfd_architecture obj_arch; /* Architecture of object machine, eg m68k */ - unsigned long obj_machine; /* Particular machine within arch, e.g. 68010 */ - - /* Archive stuff. strictly speaking we don't need all three bfd* vars, - but doing so would allow recursive archives! */ - PTR arelt_data; /* needed if this came from an archive */ - struct _bfd *my_archive; /* if this is an archive element */ - struct _bfd *next; /* output chain pointer */ - struct _bfd *archive_head; /* for output archive */ - boolean has_armap; /* if an arch; has it an armap? */ - - PTR tdata; /* target-specific storage */ - PTR usrdata; /* application-specific storage */ - - /* Should probably be enabled here always, so that library may be changed - to switch this on and off, while user code may remain unchanged */ -#ifdef BFD_LOCKS - struct flock *lock; - char *actual_name; /* for output files, name given to open() */ -#endif - /* Where all the allocated stuff under this BFD goes */ + /* The direction the bfd was opened with + */ + enum bfd_direction {no_direction = 0, + read_direction = 1, + write_direction = 2, + both_direction = 3} direction; + + /* Format_specific flags + */ + flagword flags; + + /* Currently my_archive is tested before adding origin to anything. I + believe that this can become always an add of origin, with origin set + to 0 for non archive files. + */ + file_ptr origin; + + /* Remember when output has begun, to stop strange things happening. + */ + boolean output_has_begun; + + /* Pointer to linked list of sections + */ + struct sec *sections; + + /* The number of sections + */ + unsigned int section_count; + + /* Stuff only usefull for object files: + The start address. + */ + bfd_vma start_address; + + /* Used for input and output + */ + unsigned int symcount; + + /* Symtab for output bfd + */ + struct symbol_cache_entry **outsymbols; + + /* Architecture of object machine, eg m68k + */ + enum bfd_architecture obj_arch; + + /* Particular machine within arch, e.g. 68010 + */ + unsigned long obj_machine; + + /* Stuff only usefull for archives: + */ + PTR arelt_data; + struct _bfd *my_archive; + struct _bfd *next; + struct _bfd *archive_head; + boolean has_armap; + + /* Used by the back end to hold private data. + */ + PTR tdata; + + /* Used by the application to hold private data + */ + PTR usrdata; + + /* Where all the allocated stuff under this BFD goes + */ struct obstack memory; }; - -/* The various callable routines */ -PROTO (bfd_size_type, bfd_alloc_size,(bfd *abfd)); -PROTO (char *, bfd_printable_arch_mach,(enum bfd_architecture, unsigned long)); -PROTO (char *, bfd_format_string, (bfd_format format)); - -PROTO (char**, bfd_target_list, ()); -PROTO (bfd *, bfd_openr, (CONST char *filename, CONST char *target)); -PROTO (bfd *, bfd_fdopenr,(CONST char *filename, CONST char *target, int fd)); -PROTO (bfd *, bfd_openw, (CONST char *filename, CONST char *target)); -PROTO (bfd *, bfd_create, (CONST char *filename, CONST bfd *abfd)); -PROTO (boolean, bfd_close, (bfd *abfd)); -PROTO (long, bfd_get_mtime, (bfd *abfd)); -PROTO (bfd *, bfd_openr_next_archived_file, (bfd *obfd, bfd *last_file)); -PROTO (boolean, bfd_set_archive_head, (bfd *output_archive, bfd *new_head)); -PROTO (boolean, bfd_check_format, (bfd *abfd, bfd_format format)); -PROTO (boolean, bfd_set_format, (bfd *abfd, bfd_format format)); -PROTO (char *, bfd_core_file_failing_command, (bfd *abfd)); -PROTO (int, bfd_core_file_failing_signal, (bfd *abfd)); -PROTO (boolean, core_file_matches_executable_p, (bfd *core_bfd, bfd *exec_bfd)); -PROTO (sec_ptr, bfd_get_section_by_name, (bfd *abfd, CONST char *name)); -PROTO (void, bfd_map_over_sections, (bfd *abfd, void (*operation)(), - PTR user_storage)); -PROTO (sec_ptr, bfd_make_section, (bfd *abfd, CONST char *CONST name)); -PROTO (boolean, bfd_set_section_flags, (bfd *abfd, sec_ptr section, - flagword flags)); -PROTO (boolean, bfd_set_file_flags, (bfd *abfd, flagword flags)); -PROTO (boolean, bfd_arch_compatible, (bfd *abfd, bfd *bbfd, - enum bfd_architecture *res_arch, - unsigned long *res_machine)); - -PROTO (boolean, bfd_set_section_size, (bfd *abfd, sec_ptr ptr, - unsigned long val)); -PROTO (boolean, bfd_get_section_contents, (bfd *abfd, sec_ptr section, - PTR location, file_ptr offset, - bfd_size_type count)); -PROTO (boolean, bfd_set_section_contents, (bfd *abfd, sec_ptr section, - PTR location, file_ptr offset, - bfd_size_type count)); - -PROTO (unsigned long, bfd_get_next_mapent, (bfd *abfd, symindex prev, - carsym **entry)); -PROTO (bfd *, bfd_get_elt_at_index, (bfd *abfd, int index)); -PROTO (boolean, bfd_set_symtab, (bfd *abfd, asymbol **location, - unsigned int symcount)); -PROTO (unsigned int, get_reloc_upper_bound, (bfd *abfd, sec_ptr asect)); -PROTO (unsigned int, bfd_canonicalize_reloc, (bfd *abfd, sec_ptr asect, - arelent **location, - asymbol **canon)); -PROTO (void, bfd_set_reloc, (bfd *abfd, sec_ptr asect, arelent **location, - unsigned int count)); -PROTO (boolean, bfd_set_start_address, (bfd *,bfd_vma)); - -PROTO (void, bfd_print_symbol_vandf, (PTR, asymbol *)); -PROTO (bfd_reloc_status_enum_type, bfd_perform_relocation, - (bfd *, arelent*, PTR, asection *, bfd*)); - -PROTO (bfd_vma, bfd_log2, (bfd_vma)); -#define bfd_symbol_same_target(abfd, symbol) \ -( ( ((symbol)->the_bfd->xvec) == (abfd)->xvec) ? true:false) - -PROTO(boolean, bfd_scan_arch_mach,(CONST char *, enum bfd_architecture *, - unsigned long *)); - -/* For speed and simplicity, we turn calls to these interface routines - directly into jumps through the transfer vector. */ -#define bfd_set_arch_mach(abfd, arch, mach) \ - BFD_SEND (abfd, _bfd_set_arch_mach, (abfd, arch, mach)) +/* Marks the entry point of an output bfd. Returns @code{true} on +success, @code{false} otherwise. + +*/ +PROTO(boolean, bfd_set_start_address,(bfd *, bfd_vma)); +/* Return cached file modification time (e.g. as read from archive header +for archive members, or from file system if we have been called +before); else determine modify time, cache it, and return it. +*;PROTO(long, bfd_get_mtime, (bfd *)); +*/ #define bfd_sizeof_headers(abfd, reloc) \ BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, reloc)) +#define bfd_find_nearest_line(abfd, section, symbols, offset, filename_ptr, func, line_ptr) \ + BFD_SEND (abfd, _bfd_find_nearest_line, (abfd, section, symbols, offset, filename_ptr, func, line_ptr)) -#define get_symtab_upper_bound(abfd) \ - BFD_SEND (abfd, _get_symtab_upper_bound, (abfd)) +#define bfd_debug_info_start(abfd) \ + BFD_SEND (abfd, _bfd_debug_info_start, (abfd)) -#define bfd_canonicalize_symtab(abfd, location) \ - BFD_SEND (abfd, _bfd_canonicalize_symtab, (abfd, location)) +#define bfd_debug_info_end(abfd) \ + BFD_SEND (abfd, _bfd_debug_info_end, (abfd)) + +#define bfd_debug_info_accumulate(abfd, section) \ + BFD_SEND (abfd, _bfd_debug_info_accumulate, (abfd, section)) + +#define bfd_stat_arch_elt(abfd, stat) \ + BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat)) -#define bfd_coff_swap_lineno_in(abfd, ext, in) \ - BFD_SEND(abfd, _bfd_coff_swap_lineno_in, (abfd, ext, in)) +/* What this does +*/ +PROTO(symindex, bfd_get_next_mapent, (bfd *, symindex, carsym **)); +/* Used whilst processing archives. Sets the head of the chain of bfds +contained in an archive to @var{new_head}. (see chapter on archives) +*/ +PROTO(boolean, bfd_set_archive_head, (bfd *output, bfd *new_head)); +/* Initially provided a bfd containing an archive and NULL, opens a bfd +on the first contained element and returns that. Subsequent calls to +bfd_openr_next_archived_file should pass the archive and the previous +return value to return a created bfd to the next contained element. +NULL is returned when there are no more. -#define bfd_coff_swap_sym_in(abfd, ext, in) \ - BFD_SEND(abfd, _bfd_coff_swap_sym_in,(abfd, ext, in)) +*/ +PROTO(bfd*, bfd_openr_next_archived_file, + (bfd *archive, bfd *previous)); +/* The relocation routine returns as a status an enumerated type: -#define bfd_coff_swap_aux_in(abfd, ext, type, class, in) \ - BFD_SEND(abfd, _bfd_coff_swap_aux_in,(abfd, ext, type, class, in)) +*/ +typedef enum bfd_reloc_status { -#define bfd_make_empty_symbol(abfd) \ - BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd)) + /* No errors detected + */ + bfd_reloc_ok, -#define bfd_print_symbol(abfd, file, symbol, how) \ - BFD_SEND (abfd, _bfd_print_symbol, (abfd, file, symbol, how)) + /* The relocation was performed, but there was an overflow. + */ + bfd_reloc_overflow, -#define bfd_get_lineno(abfd, symbol) \ - BFD_SEND (abfd, _get_lineno, (abfd, symbol)) + /* The address to relocate was not within the section supplied + */ + bfd_reloc_outofrange, -#define bfd_stat_arch_elt(abfd, buf) \ - BFD_SEND (abfd, _bfd_stat_arch_elt, (abfd, buf)) + /* Used by special functions + */ + bfd_reloc_continue, -#define bfd_find_nearest_line(abfd, section, symbols, offset, filename_ptr, func, line_ptr) \ - BFD_SEND (abfd, _bfd_find_nearest_line, \ - (abfd, section,symbols, offset, filename_ptr, func, line_ptr)) - -/* Some byte-swapping i/o operations */ -#define LONGLONG_SIZE 8 -#define LONG_SIZE 4 -#define SHORT_SIZE 2 -#define BYTE_SIZE 1 + /* Unused + */ + bfd_reloc_notsupported, + + /* Unsupported relocation size requested. + */ + bfd_reloc_other, + + /* The symbol to relocate against was undefined. + */ + bfd_reloc_undefined, + + /* The relocaction was performed, but may not be ok - presently generated + only when linking i960 coff files with i960 b.out symbols. + */ + bfd_reloc_dangerous + } + bfd_reloc_status_enum_type; +typedef struct reloc_cache_entry +{ + + /* A pointer into the canonical table of pointers + */ + struct symbol_cache_entry **sym_ptr_ptr; + + /* offset in section + */ + rawdata_offset address; + + /* addend for relocation value + */ + bfd_vma addend; + + /* if sym is null this is the section + */ + struct sec *section; + + /* Pointer to how to perform the required relocation + */ + struct reloc_howto_struct *howto; +} arelent; + +/* The @code{reloc_howto_type} is a structure which contains all the +information that bfd needs to know to tie up a back end's data. + +*/ +typedef CONST struct reloc_howto_struct +{ -#define bfd_put_8(abfd, val, ptr) (*((char *)ptr) = (char)val) -#define bfd_get_8(abfd, ptr) (*((char *)ptr)) + /* The type field has mainly a documetary use - the back end can to what + it wants with it, though the normally the back end's external idea of + what a reloc number would be would be stored in this field. For + example, the a PC relative word relocation in a coff environment would + have the type 023 - because that's what the outside world calls a + R_PCRWORD reloc. + */ + unsigned int type; -#define bfd_put_32(abfd, val, ptr) BFD_SEND(abfd, bfd_putx32, (val,ptr)) -#define bfd_get_32(abfd, ptr) BFD_SEND(abfd, bfd_getx32, (ptr)) + /* The value the final relocation is shifted right by. This drops + unwanted data from the relocation. + */ + unsigned int rightshift; -#define bfd_put_64(abfd, val, ptr) BFD_SEND(abfd, bfd_putx64, (val,ptr)) -#define bfd_get_64(abfd, ptr) BFD_SEND(abfd, bfd_getx64, (ptr)) + /* The size of the item to be relocated - 0, is one byte, 1 is 2 bytes, 3 + is four bytes. + */ + unsigned int size; -#define bfd_put_16(abfd, val, ptr) BFD_SEND(abfd, bfd_putx16, (val,ptr)) -#define bfd_get_16(abfd, ptr) BFD_SEND(abfd, bfd_getx16, (ptr)) + /* Now obsolete + */ + unsigned int bitsize; -#define bfd_h_put_8(abfd, val, ptr) bfd_put_8 (abfd, val, ptr) -#define bfd_h_get_8(abfd, ptr) bfd_get_8 (abfd, ptr) + /* Notes that the relocation is relative to the location in the data + section of the addend. The relocation function will subtract from the + relocation value the address of the location being relocated. + */ + boolean pc_relative; -#define bfd_h_put_32(abfd, val, ptr) BFD_SEND(abfd, bfd_h_putx32, \ - (val, (bfd_byte *) ptr)) -#define bfd_h_get_32(abfd, ptr) BFD_SEND(abfd, bfd_h_getx32, \ - ((bfd_byte *) ptr)) + /* Now obsolete + */ + unsigned int bitpos; -#define bfd_h_put_64(abfd, val, ptr) BFD_SEND(abfd, bfd_h_putx64, \ - (val, (bfd_byte *) ptr)) -#define bfd_h_get_64(abfd, ptr) BFD_SEND(abfd, bfd_h_getx64, \ - ((bfd_byte *) ptr)) + /* Now obsolete + */ + boolean absolute; -#define bfd_h_put_16(abfd, val, ptr) BFD_SEND(abfd, bfd_h_putx16, (val, (bfd_byte *) ptr)) -#define bfd_h_get_16(abfd, ptr) BFD_SEND(abfd, bfd_h_getx16, ((bfd_byte *) ptr)) + /* Causes the relocation routine to return an error if overflow is + detected when relocating. + */ + boolean complain_on_overflow; + /* If this field is non null, then the supplied function is called rather + than the normal function. This allows really strange relocation + methods to be accomodated (eg, i960 callj instructions). + */ + bfd_reloc_status_enum_type (*special_function)(); -/* General purpose one fits all. The do { } while (0) makes a single - statement out of it, for use in things like nested if-statements. - - The idea is to create your external ref as a byte array of the - right size eg: - char foo[4]; - then you may do things like: - bfd_h_put_x(abfd, 1, &foo); + /* The textual name of the relocation type. + */ + char *name; + /* When performing a partial link, some formats must modify the + relocations rather than the data - this flag signals this. + */ + boolean partial_inplace; + + /* The src_mask is used to select what parts of the read in data are to + be used in the relocation sum. Eg, if this was an 8 bit bit of data + which we read and relocated, this would be 0x000000ff. When we have + relocs which have an addend, such as sun4 extended relocs, the value + in the offset part of a relocating field is garbage so we never use + it. In this case the mask would be 0x00000000. + */ + bfd_word src_mask; + + /* The dst_mask is what parts of the instruction are replaced into the + instruction. In most cases src_mask == dst_mask, except in the above + special case, where dst_mask would be 0x000000ff, and src_mask would + be 0x00000000. + */ + bfd_word dst_mask; + + /* When some formats create PC relative instructions, they leave the + value of the pc of the place being relocated in the offset slot of the + instruction, so that a PC relative relocation can be made just by + adding in an ordinary offset (eg sun3 a.out). Some formats leave the + displacement part of an instruction empty (eg m88k bcs), this flag + signals the fact. + */ + boolean pcrel_offset; +} reloc_howto_type; + +/* The HOWTO define is horrible and will go away. */ +#define HOWTO(C, R,S,B, P, BI, ABS, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \ + {(unsigned)C,R,S,B, P, BI, ABS,O,SF,NAME,INPLACE,MASKSRC,MASKDST,PC} +typedef unsigned char bfd_byte; -#define bfd_h_put_x(abfd, val, ptr) \ - do { \ - if (sizeof((ptr)) == 8) \ - bfd_h_put_64 (abfd, val, (ptr));\ - if (sizeof((ptr)) == 4) \ - bfd_h_put_32 (abfd, val, (ptr));\ - else if (sizeof((ptr)) == 2) \ - bfd_h_put_16 (abfd, val, (ptr));\ - else if (sizeof((ptr)) == 1) \ - bfd_h_put_8 (abfd, val, (ptr));\ - else abort(); } while (0) +typedef struct relent_chain { + arelent relent; + struct relent_chain *next; +} arelent_chain; -#ifdef GNU960 +/* If an output_bfd is supplied to this function the generated image +will be relocatable, the relocations are copied to the output file +after they have been changed to reflect the new state of the world. +There are two ways of reflecting the results of partial linkage in an +output file; by modifying the output data in place, and by modifying +the relocation record. Some native formats (eg basic a.out and basic +coff) have no way of specifying an addend in the relocation type, so +the addend has to go in the output data. This is no big deal since in +these formats the output data slot will always be big enough for the +addend. Complex reloc types with addends were invented to solve just +this problem. +*/ +PROTO(bfd_reloc_status_enum_type, + bfd_perform_relocation, + (bfd * abfd, + arelent *reloc_entry, + PTR data, + asection *input_section, + bfd *output_bfd)); +/* @node bfd_target +This structure contains everything that BFD knows about a target. +It includes things like its byte order, name, what routines to call +to do various operations, etc. + +Every BFD points to a target structure with its "xvec" member. + + +Shortcut for declaring fields which are prototyped function pointers, +while avoiding anguish on compilers that don't support protos. +*/ +#define SDEF(ret, name, arglist) \ + PROTO(ret,(*name),arglist) +#define SDEF_FMT(ret, name, arglist) \ + PROTO(ret,(*name[bfd_type_end]),arglist) -#define BFD_COFF_FORMAT bfd_target_coff_flavour_enum -#define BFD_BOUT_FORMAT bfd_target_aout_flavour_enum +/* These macros are used to dispatch to functions through the bfd_target +vector. They are used in a number of macros further down in bfd.h, and +are also used when calling various routines by hand inside the bfd +implementation. The "arglist" argument must be parenthesized; it +contains all the arguments to the called function. +*/ +#define BFD_SEND(bfd, message, arglist) \ + ((*((bfd)->xvec->message)) arglist) -/* - * Return nonzero iff specified bfd is for big-endian target - */ -#define BFD_BIG_ENDIAN_FILE_P(abfd) \ - ((abfd)->xvec->header_byteorder_big_p == true) +/* For operations which index on the bfd format +*/ +#define BFD_SEND_FMT(bfd, message, arglist) \ + (((bfd)->xvec->message[(int)((bfd)->format)]) arglist) -/* - * Return nonzero iff specified bfd is for coff target - */ -#define BFD_COFF_FILE_P(abfd) ((abfd)->xvec->flavour == BFD_COFF_FORMAT) +/* This is the struct which defines the type of BFD this is. The +"xvec" member of the struct bfd itself points here. Each module +that implements access to a different target under BFD, defines +one of these. -/* - * The names of the only targets the GNU/960 release cares about - */ -#define BFD_BIG_COFF_TARG "coff-Intel-big" -#define BFD_LITTLE_COFF_TARG "coff-Intel-little" -#define BFD_BIG_BOUT_TARG "b.out.big" -#define BFD_LITTLE_BOUT_TARG "b.out.little" +FIXME, these names should be rationalised with the names of the +entry points which call them. Too bad we can't have one macro to +define them both! -extern PROTO (char *, bfd_make_targ_name,( enum target_flavour_enum format, int bigendian)); +*/ +typedef struct bfd_target +{ -#endif /* GNU960 */ + /* identifies the kind of target, eg SunOS4, Ultrix, etc + */ + char *name; + + /* The "flavour" of a back end is a general indication about the contents + of a file. + */ + enum target_flavour_enum { + bfd_target_aout_flavour_enum, + bfd_target_coff_flavour_enum, + bfd_target_ieee_flavour_enum, + bfd_target_oasys_flavour_enum, + bfd_target_srec_flavour_enum} flavour; + + /* The order of bytes within the data area of a file. + */ + boolean byteorder_big_p; + + /* The order of bytes within the header parts of a file. + */ + boolean header_byteorder_big_p; + + /* This is a mask of all the flags which an executable may have set - + from the set @code{NO_FLAGS}, @code{HAS_RELOC}, ...@code{D_PAGED}. + */ + flagword object_flags; + + /* This is a mask of all the flags which a section may have set - from + the set @code{SEC_NO_FLAGS}, @code{SEC_ALLOC}, ...@code{SET_NEVER_LOAD}. + */ + flagword section_flags; + + /* The pad character for filenames within an archive header. + */ + char ar_pad_char; + + /* The maximum number of characters in an archive header. + */ + unsigned short ar_max_namelen; + + /* The minimum alignment restriction for any section. + */ + unsigned int align_power_min; + + /* Entries for byte swapping for data. These are different to the other + entry points, since they don't take bfd as first arg. Certain other handlers + could do the same. + */ + SDEF (bfd_64_type, bfd_getx64, (bfd_byte *)); + SDEF (void, bfd_putx64, (bfd_64_type, bfd_byte *)); + SDEF (unsigned int, bfd_getx32, (bfd_byte *)); + SDEF (void, bfd_putx32, (unsigned long, bfd_byte *)); + SDEF (unsigned int, bfd_getx16, (bfd_byte *)); + SDEF (void, bfd_putx16, (int, bfd_byte *)); + + /* Byte swapping for the headers + */ + SDEF (bfd_64_type, bfd_h_getx64, (bfd_byte *)); + SDEF (void, bfd_h_putx64, (bfd_64_type, bfd_byte *)); + SDEF (unsigned int, bfd_h_getx32, (bfd_byte *)); + SDEF (void, bfd_h_putx32, (unsigned long, bfd_byte *)); + SDEF (unsigned int, bfd_h_getx16, (bfd_byte *)); + SDEF (void, bfd_h_putx16, (int, bfd_byte *)); + + /* Format dependent routines, these turn into vectors of entry points + within the target vector structure; one for each format to check. + + Check the format of a file being read. Return bfd_target * or zero. + */ + SDEF_FMT (struct bfd_target *, _bfd_check_format, (bfd *)); + + /* Set the format of a file being written. + */ + SDEF_FMT (boolean, _bfd_set_format, (bfd *)); + + /* Write cached information into a file being written, at bfd_close. + */ + SDEF_FMT (boolean, _bfd_write_contents, (bfd *)); + + /* The following functions are defined in @code{JUMP_TABLE}. The idea is + that the back end writer of @code{foo} names all the routines + @code{foo_}@var{entry_point}, @code{JUMP_TABLE} will built the entries + in this structure in the right order. + + Core file entry points + */ + SDEF (char *, _core_file_failing_command, (bfd *)); + SDEF (int, _core_file_failing_signal, (bfd *)); + SDEF (boolean, _core_file_matches_executable_p, (bfd *, bfd *)); + + /* Archive entry points + */ + SDEF (boolean, _bfd_slurp_armap, (bfd *)); + SDEF (boolean, _bfd_slurp_extended_name_table, (bfd *)); + SDEF (void, _bfd_truncate_arname, (bfd *, CONST char *, char *)); + SDEF (boolean, write_armap, (bfd *arch, + unsigned int elength, + struct orl *map, + int orl_count, + int stridx)); + + /* Standard stuff. + */ + SDEF (boolean, _close_and_cleanup, (bfd *)); + SDEF (boolean, _bfd_set_section_contents, (bfd *, sec_ptr, PTR, + file_ptr, bfd_size_type)); + SDEF (boolean, _bfd_get_section_contents, (bfd *, sec_ptr, PTR, + file_ptr, bfd_size_type)); + SDEF (boolean, _new_section_hook, (bfd *, sec_ptr)); + + /* Symbols and reloctions + */ + SDEF (unsigned int, _get_symtab_upper_bound, (bfd *)); + SDEF (unsigned int, _bfd_canonicalize_symtab, + (bfd *, struct symbol_cache_entry **)); + SDEF (unsigned int, _get_reloc_upper_bound, (bfd *, sec_ptr)); + SDEF (unsigned int, _bfd_canonicalize_reloc, (bfd *, sec_ptr, arelent **, + struct symbol_cache_entry**)); + SDEF (struct symbol_cache_entry *, _bfd_make_empty_symbol, (bfd *)); + SDEF (void, _bfd_print_symbol, (bfd *, PTR, struct symbol_cache_entry *, + bfd_print_symbol_enum_type)); +#define bfd_print_symbol(b,p,s,e) BFD_SEND(b, _bfd_print_symbol, (b,p,s,e)) + SDEF (alent *, _get_lineno, (bfd *, struct symbol_cache_entry *)); + + SDEF (boolean, _bfd_set_arch_mach, (bfd *, enum bfd_architecture, + unsigned long)); + + SDEF (bfd *, openr_next_archived_file, (bfd *arch, bfd *prev)); + SDEF (boolean, _bfd_find_nearest_line, + (bfd *abfd, struct sec *section, + struct symbol_cache_entry **symbols,bfd_vma offset, + CONST char **file, CONST char **func, unsigned int *line)); + SDEF (int, _bfd_stat_arch_elt, (bfd *, struct stat *)); + + SDEF (int, _bfd_sizeof_headers, (bfd *, boolean)); + + SDEF (void, _bfd_debug_info_start, (bfd *)); + SDEF (void, _bfd_debug_info_end, (bfd *)); + SDEF (void, _bfd_debug_info_accumulate, (bfd *, struct sec *)); + + /* Special entry points for gdb to swap in coff symbol table parts + */ + SDEF(void, _bfd_coff_swap_aux_in,( + bfd *abfd , + PTR ext, + int type, + int class , + PTR in)); + + SDEF(void, _bfd_coff_swap_sym_in,( + bfd *abfd , + PTR ext, + PTR in)); + + SDEF(void, _bfd_coff_swap_lineno_in, ( + bfd *abfd, + PTR ext, + PTR in)); + +} bfd_target; + +/* Returns a pointer to the transfer vector for the object target +named target_name. If target_name is NULL, chooses the one in the +environment variable GNUTARGET; if that is null or not defined then +the first entry in the target list is chosen. Passing in the +string "default" or setting the environment variable to "default" +will cause the first entry in the target list to be returned, +and "target_defaulted" will be set in the bfd. This causes +bfd_check_format to loop over all the targets to find the one +that matches the file being read. +*/ +PROTO(bfd_target *, bfd_find_target,(CONST char *, bfd *)); +/* This function returns a freshly malloced NULL-terminated vector of the +names of all the valid bfd targets. Do not modify the names +*/ +PROTO(CONST char **,bfd_target_list,()); +/* This routine is supplied a bfd and a format. It attempts to verify if +the file attatched to the bfd is indeed compatible with the format +specified (ie, one of @code{bfd_object}, @code{bfd_archive} or +@code{bfd_core}). + +If the bfd has been set to a specific @var{target} before the call, +only the named target and format combination will be checked. If the +target has not been set, or has been set to @code{default} then all +the known target backends will be interrogated to determine a match. + +The function returns @code{true} on success, otherwise @code{false} +with one of the following error codes: +@table @code +@item +invalid_operation +if @code{format} is not one of @code{bfd_object}, @code{bfd_archive} +or @code{bfd_core}. +@item system_call_error +if an error occured during a read - even some file mismatches can +cause system_call_errros +@item file_not_recognised +none of the backends recognised the file format +@item file_ambiguously_recognized +more than one backend recognised the file format. +@end table +*/ +PROTO(boolean, bfd_check_format, (bfd *abfd, bfd_format format)); +/* This function sets the file format of the supplied bfd to the format +requested. If the target set in the bfd does not support the format +requested, the format is illegal or the bfd is not open for writing +than an error occurs. +*/ +PROTO(boolean,bfd_set_format,(bfd *, bfd_format)); +/* This function takes one argument, and enumerated type (bfd_format) and +returns a pointer to a const string "invalid", "object", "archive", +"core" or "unknown" depending upon the value of the enumeration. +*/ +PROTO(CONST char *, bfd_format_string, (bfd_format)); +#endif -#endif /* __BFD_H_SEEN__ */ -- 2.30.2