X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/bee84e0bc354c1c148df5d97851acd5d0da78e2a..f6868b8e5bd019f763808ff1bf7a183d9e57071e:/include/bfd.h diff --git a/include/bfd.h b/include/bfd.h index 72cdae48c1..ce6c4465c3 100644 --- a/include/bfd.h +++ b/include/bfd.h @@ -80,8 +80,6 @@ typedef HOST_64_BIT symvalue; typedef HOST_64_BIT bfd_64_type; #define fprintf_vma(s,x) \ fprintf(s,"%08x%08x", uint64_typeHIGH(x), uint64_typeLOW(x)) -#define printf_vma(x) \ - printf( "%08x%08x", uint64_typeHIGH(x), uint64_typeLOW(x)) #else typedef struct {int a,b;} bfd_64_type; typedef unsigned long rawdata_offset; @@ -91,9 +89,9 @@ typedef unsigned long bfd_word; typedef unsigned long bfd_size; typedef unsigned long symvalue; typedef unsigned long bfd_size_type; -#define printf_vma(x) printf( "%08lx", x) #define fprintf_vma(s,x) fprintf(s, "%08lx", x) #endif +#define printf_vma(x) fprintf_vma(stdout,x) typedef unsigned int flagword; /* 32 bits of flags */ @@ -183,7 +181,7 @@ typedef struct lineno_cache_entry { typedef struct sec *sec_ptr; #define bfd_section_name(bfd, ptr) ((ptr)->name) -#define bfd_section_size(bfd, ptr) ((ptr)->size) +#define bfd_section_size(bfd, ptr) (bfd_get_section_size_before_reloc(ptr)) #define bfd_section_vma(bfd, ptr) ((ptr)->vma) #define bfd_section_alignment(bfd, ptr) ((ptr)->alignment_power) #define bfd_get_section_flags(bfd, ptr) ((ptr)->flags) @@ -209,10 +207,23 @@ typedef enum bfd_error { invalid_error_code} bfd_ec; extern bfd_ec bfd_error; +struct reloc_cache_entry; +struct bfd_seclet_struct ; + typedef struct bfd_error_vector { PROTO(void,(* nonrepresentable_section ),(CONST bfd *CONST abfd, CONST char *CONST name)); + PROTO(void,(* undefined_symbol),(CONST struct reloc_cache_entry *rel, + CONST struct bfd_seclet_struct *sec + )); + PROTO(void, (* reloc_value_truncated),(CONST struct + reloc_cache_entry *rel, + struct bfd_seclet_struct *sec)); + + PROTO(void, (* reloc_dangerous),(CONST struct reloc_cache_entry *rel, + CONST struct bfd_seclet_struct *sec)); + } bfd_error_vector_type; PROTO (char *, bfd_errmsg, ()); @@ -224,7 +235,7 @@ typedef enum bfd_print_symbol bfd_print_symbol_name, bfd_print_symbol_more, bfd_print_symbol_all, - bfd_print_symbol_nm, /* Pretty format suitable for nm program. */ + bfd_print_symbol_nm /* Pretty format suitable for nm program. */ } bfd_print_symbol_type; @@ -269,7 +280,8 @@ CAT(NAME,_generic_stat_arch_elt),\ CAT(NAME,_sizeof_headers),\ CAT(NAME,_bfd_debug_info_start),\ CAT(NAME,_bfd_debug_info_end),\ -CAT(NAME,_bfd_debug_info_accumulate) +CAT(NAME,_bfd_debug_info_accumulate),\ +CAT(NAME,_bfd_get_relocated_section_contents) #define COFF_SWAP_TABLE \ coff_swap_aux_in, coff_swap_sym_in, coff_swap_lineno_in, \ @@ -295,7 +307,7 @@ extern CONST short _bfd_host_big_endian; #define bfd_get_file_flags(abfd) ((abfd)->flags) #define bfd_applicable_file_flags(abfd) ((abfd)->xvec->object_flags) #define bfd_applicable_section_flags(abfd) ((abfd)->xvec->section_flags) -#define bfd_my_archive(abfd) ((abfd)->my_archive); +#define bfd_my_archive(abfd) ((abfd)->my_archive) #define bfd_has_map(abfd) ((abfd)->has_armap) #define bfd_header_twiddle_required(abfd) \ ((((abfd)->xvec->header_byteorder_big_p) \ @@ -319,113 +331,24 @@ extern CONST short _bfd_host_big_endian; -/*THE FOLLOWING IS EXTRACTED FROM THE SOURCE */ - - -/*:init.c*/ -/* bfd_init - -This routine must be called before any other bfd function to initialize -magical internal data structures. -*/ - - void EXFUN(bfd_init,(void)); - -/* -*/ - -/*:opncls.c*/ -/* *i bfd_openr -Opens the file supplied (using @code{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)); - -/* - -*i bfd_fdopenr -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)); - -/* - - bfd_openw -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)); - -/* - - bfd_close -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 attached to the BFD's obstacks is released. +/* ANd more from the source */ -@code{true} is returned if all is ok, otherwise @code{false}. -*/ - PROTO(boolean, bfd_close,(bfd *)); -/* - bfd_close_all_done -This function closes a BFD. It differs from @code{bfd_close} since it -does not complete any pending operations. This routine would be used -if the application had just used BFD for swapping and didn't want to -use any of the writing code. -If the created file is executable, then @code{chmod} is called to mark -it as such. -All memory attached to the BFD's obstacks is released. -@code{true} is returned if all is ok, otherwise @code{false}. -*/ - PROTO(boolean, bfd_close_all_done,(bfd *)); -/* - bfd_create -This routine creates a new BFD in the manner of @code{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)); - -/* - - bfd_alloc_size -Return the number of bytes in the obstacks connected to the supplied -BFD. -*/ - PROTO(bfd_size_type,bfd_alloc_size,(bfd *abfd)); - -/* -*/ - - -/*:libbfd.c*/ -/* *i bfd_put_size -*i bfd_get_size -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. -*/ + +void EXFUN(bfd_init, (void)); +bfd *EXFUN(bfd_openr, (CONST char *filename, CONST char*target)); +bfd *EXFUN(bfd_fdopenr, (CONST char *filename, CONST char *target, int fd)); +bfd *EXFUN(bfd_openw, (CONST char *filename, CONST char *target)); +boolean EXFUN(bfd_close, (bfd *)); +boolean EXFUN(bfd_close_all_done, (bfd *)); +bfd_size_type EXFUN(bfd_alloc_size, (bfd *abfd)); +bfd *EXFUN(bfd_create, (CONST char *filename, bfd *template)); #define bfd_put_8(abfd, val, ptr) \ (*((char *)ptr) = (char)val) #define bfd_get_8(abfd, ptr) \ @@ -442,14 +365,6 @@ necessary endian translations and removes alignment restrictions. BFD_SEND(abfd, bfd_putx64, (val, ptr)) #define bfd_get_64(abfd, ptr) \ BFD_SEND(abfd, bfd_getx64, (ptr)) -/* *i bfd_h_put_size -*i bfd_h_get_size -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) \ @@ -466,448 +381,246 @@ endan order. BFD_SEND(abfd, bfd_h_putx64,(val, ptr)) #define bfd_h_get_64(abfd, ptr) \ BFD_SEND(abfd, bfd_h_getx64,(ptr)) +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. */ -/*:section.c*/ -/* The shape of a section struct: -*/ + CONST char *name; -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. -*/ + /* Which section is it 0.nth */ - CONST char *name; + int index; -/* -The next section in the list belonging to the BFD, or NULL. -*/ + /* 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; + /* The field flags contains attributes of the section. Some of + 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. -*/ + /* 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 -*/ + /* 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. -*/ + /* The section contains data still to be relocated, so there will + be some relocation information too. */ #define SEC_RELOC 0x004 -/* -Obsolete ? -*/ + /* Obsolete ? */ #define SEC_BALIGN 0x008 -/* -A signal to the OS that the section contains read only data. -*/ - + /* A signal to the OS that the section contains read only + data. */ #define SEC_READONLY 0x010 -/* -The section contains code only. -*/ + /* The section contains code only. */ #define SEC_CODE 0x020 -/* -The section contains data only. -*/ + /* The section contains data only. */ #define SEC_DATA 0x040 -/* -The section will reside in ROM. -*/ + /* 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__}), attaches 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. -*/ + /* The section contains constructor information. This section + type is used by the linker to create lists of constructors and + destructors used by <>. 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 <<__CTOR_LIST__>>), attaches + 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 <<__CTOR_LIST__>> and relocte the data + contained within - exactly the operations it would peform on + standard data. */ #define SEC_CONSTRUCTOR 0x100 -/* -The section is a constuctor, and should be placed at the end of the .. -*/ + /* The section is a constuctor, and should be placed at the + end of the . */ + #define SEC_CONSTRUCTOR_TEXT 0x1100 -/* -*/ #define SEC_CONSTRUCTOR_DATA 0x2100 -/* -*/ #define SEC_CONSTRUCTOR_BSS 0x3100 -/* -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} -*/ + /* The section has contents - a bss section could be + <> | <>, a debug section could be + <> */ #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. -*/ + /* 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}). -*/ + /* The size of the section in bytes, as it will be output. + contains a value even if the section has no contents (eg, the + size of <<.bss>>). This will be filled in after relocation */ + + bfd_size_type _cooked_size; - bfd_size_type size; + /* The size on disk of the section in bytes originally. Normally this + value is the same as the size, but if some relaxing has + been done, then this value will be bigger. */ -/* -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_size_type _raw_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. -*/ + /* 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) -*/ + /* 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. -*/ + /* 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. -*/ + /* 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 -*/ + /* 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 -/* -Information below is back end specific - and not always used or -updated - -File position of section data -*/ + File position of section data */ file_ptr filepos; -/* File position of relocation info -*/ + + /* File position of relocation info */ file_ptr rel_filepos; -/* -File position of line data -*/ + /* File position of line data */ file_ptr line_filepos; -/* -Pointer to data for applications -*/ + /* Pointer to data for applications */ PTR userdata; -/* -*/ struct lang_output_section *otheruserdata; -/* -Attached line number information -*/ + /* Attached line number information */ alent *lineno; -/* Number of line number records -*/ + + /* Number of line number records */ unsigned int lineno_count; -/* -When a section is being output, this value changes as more -linenumbers are written out -*/ + /* 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 -*/ + /* what the section number is in the target world */ - unsigned int target_index; + 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. -*/ + /* 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. -*/ + /* The BFD which owns the section. */ bfd *owner; -/* -*/ + boolean reloc_done; + /* A symbol which points at this section only */ + struct symbol_cache_entry *symbol; + struct symbol_cache_entry **symbol_ptr_ptr; + struct bfd_seclet_struct *seclets_head; + struct bfd_seclet_struct *seclets_tail; } asection ; -/* - - bfd_get_section_by_name -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)); - -/* - - bfd_make_section_old_way -This function creates a new empty section called @var{name} and attaches it -to the end of the chain of sections for the BFD supplied. An attempt to -create a section with a name which is already in use, returns its pointer without -changing the section chain. - -It has the funny name since this is the way it used to be before gilmore broke it. - -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_old_way, (bfd *, CONST char *name)); - -/* - - bfd_make_section -This function creates a new empty section called @var{name} and attaches it -to the end of the chain of sections for the BFD supplied. An attempt to -create a section with a name which is already in use, returns NULL without -changing the section chain. - -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)); - -/* - - bfd_set_section_flags -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)); - -/* - - bfd_map_over_sections -Calls the provided function @var{func} for each section attached 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 - - bfd_set_section_size -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)); - -/* - - bfd_set_section_contents -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)); - -/* - - bfd_get_section_contents -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)); - -/* -*/ - - - -/*:archures.c*/ -/* bfd_architecture -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. -*/ +#define BFD_ABS_SECTION_NAME "*ABS*" +#define BFD_UND_SECTION_NAME "*UND*" +#define BFD_COM_SECTION_NAME "*COM*" + + /* the absolute section */ + extern asection bfd_abs_section; + /* Pointer to the undefined section */ + extern asection bfd_und_section; + /* Pointer to the common section */ + extern asection bfd_com_section; + + extern struct symbol_cache_entry *bfd_abs_symbol; + extern struct symbol_cache_entry *bfd_com_symbol; + extern struct symbol_cache_entry *bfd_und_symbol; +#define bfd_get_section_size_before_reloc(section) \ + (section->reloc_done ? (abort(),1): (section)->_raw_size) +#define bfd_get_section_size_after_reloc(section) \ + ((section->reloc_done) ? (section)->_cooked_size: (abort(),1)) +asection *EXFUN(bfd_get_section_by_name, (bfd *abfd, CONST char *name)); +asection *EXFUN(bfd_make_section_old_way, (bfd *, CONST char *name)); +asection * EXFUN(bfd_make_section, (bfd *, CONST char *name)); +boolean EXFUN(bfd_set_section_flags, (bfd *, asection *, flagword)); +void EXFUN(bfd_map_over_sections, (bfd *abfd, void (*func)(), PTR obj)); +boolean EXFUN(bfd_set_section_size, (bfd *, asection *, bfd_size_type val)); +boolean EXFUN(bfd_set_section_contents + , (bfd *abfd, + asection *section, + PTR data, + file_ptr offset, + bfd_size_type count)); +boolean EXFUN(bfd_get_section_contents + , (bfd *abfd, asection *section, PTR location, + file_ptr offset, bfd_size_type count)); 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. + 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. @@ -922,29 +635,22 @@ enum bfd_architecture #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 PC/RT */ - bfd_arch_alliant, /* Alliant */ - bfd_arch_convex, /* Convex */ - bfd_arch_m88k, /* Motorola 88xxx */ - bfd_arch_pyramid, /* Pyramid Technology */ - bfd_arch_h8300, /* Hitachi H8/300 */ - bfd_arch_rs6000, /* IBM RS/6000 */ + 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 PC/RT */ + bfd_arch_alliant, /* Alliant */ + bfd_arch_convex, /* Convex */ + bfd_arch_m88k, /* Motorola 88xxx */ + bfd_arch_pyramid, /* Pyramid Technology */ + bfd_arch_h8300, /* Hitachi H8/300 */ + bfd_arch_rs6000, /* IBM RS/6000 */ bfd_arch_last }; - -/* -stuff - - bfd_arch_info -This structure contains information on architectures. -*/ typedef int bfd_reloc_code_type; typedef struct bfd_arch_info @@ -956,924 +662,474 @@ typedef struct bfd_arch_info long mach; char *arch_name; CONST char *printable_name; -/* true if this is the default machine for the architecture */ + /* true if this is the default machine for the architecture */ + unsigned int section_align_power; boolean the_default; - CONST struct bfd_arch_info * EXFUN((*compatible),(CONST struct bfd_arch_info *a, - CONST struct bfd_arch_info *b)); + CONST struct bfd_arch_info * EXFUN((*compatible), + (CONST struct bfd_arch_info *a, + CONST struct bfd_arch_info *b)); boolean EXFUN((*scan),(CONST struct bfd_arch_info *,CONST char *)); unsigned int EXFUN((*disassemble),(bfd_vma addr, CONST char *data, PTR stream)); - CONST struct reloc_howto_struct *EXFUN((*reloc_type_lookup), (CONST struct - bfd_arch_info *, - bfd_reloc_code_type code)); + CONST struct reloc_howto_struct *EXFUN((*reloc_type_lookup), + (CONST struct bfd_arch_info *, + bfd_reloc_code_type code)); struct bfd_arch_info *next; } bfd_arch_info_type; - -/* - bfd_printable_name - -Return a printable string representing the architecture and machine -from the pointer to the arch info structure -*/ - - CONST char *EXFUN(bfd_printable_name,(bfd *abfd)); - -/* - -*i bfd_scan_arch -This routine is provided with a string and tries to work out if bfd -supports any cpu which could be described with the name provided. The -routine returns a pointer to an arch_info structure if a machine is -found, otherwise NULL. -*/ - - bfd_arch_info_type *EXFUN(bfd_scan_arch,(CONST char *)); - -/* - - bfd_arch_get_compatible -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 returns a pointer to an arch_info structure describing -the compatible machine. -*/ - - CONST bfd_arch_info_type *EXFUN(bfd_arch_get_compatible, - (CONST bfd *abfd, - CONST bfd *bbfd)); - -/* - - bfd_set_arch_info -*/ - - void EXFUN(bfd_set_arch_info,(bfd *, bfd_arch_info_type *)); - -/* - - bfd_get_arch - -Returns the enumerated type which describes the supplied bfd's -architecture -*/ - - enum bfd_architecture EXFUN(bfd_get_arch, (bfd *abfd)); - -/* - - bfd_get_mach - -Returns the long type which describes the supplied bfd's -machine -*/ - - unsigned long EXFUN(bfd_get_mach, (bfd *abfd)); - -/* - - bfd_arch_bits_per_byte - -Returns the number of bits in one of the architectures bytes -*/ - - unsigned int EXFUN(bfd_arch_bits_per_byte, (bfd *abfd)); - -/* - - bfd_arch_bits_per_address - -Returns the number of bits in one of the architectures addresses -*/ - - unsigned int EXFUN(bfd_arch_bits_per_address, (bfd *abfd)); - -/* - - bfd_get_arch_info -*/ - - bfd_arch_info_type * EXFUN(bfd_get_arch_info,(bfd *)); - -/* - - bfd_lookup_arch - -*/ - bfd_arch_info_type * EXFUN(bfd_lookup_arch,(enum - bfd_architecture arch,long machine)); - -/* - -Look for the architecure info struct which matches the arguments -given. A machine of 0 will match the machine/architecture structure which -marks itself as the default. - - bfd_printable_arch_mach -Return a printable string representing the architecture and machine -type. - -NB. The use of this routine is depreciated. -*/ - - PROTO(CONST char *,bfd_printable_arch_mach, - (enum bfd_architecture arch, unsigned long machine)); - -/* -*/ - -/*:reloc.c*/ -/* bfd_perform_relocation -The relocation routine returns as a status an enumerated type: -*/ - -typedef enum bfd_reloc_status { -/* No errors detected -*/ - +CONST char *EXFUN(bfd_printable_name, (bfd *abfd)); +bfd_arch_info_type *EXFUN(bfd_scan_arch, (CONST char *)); +CONST bfd_arch_info_type *EXFUN(bfd_arch_get_compatible, ( + CONST bfd *abfd, + CONST bfd *bbfd)); +void EXFUN(bfd_set_arch_info, (bfd *, bfd_arch_info_type *)); +enum bfd_architecture EXFUN(bfd_get_arch, (bfd *abfd)); +unsigned long EXFUN(bfd_get_mach, (bfd *abfd)); +unsigned int EXFUN(bfd_arch_bits_per_byte, (bfd *abfd)); +unsigned int EXFUN(bfd_arch_bits_per_address, (bfd *abfd)); +bfd_arch_info_type * EXFUN(bfd_get_arch_info, (bfd *)); +bfd_arch_info_type *EXFUN(bfd_lookup_arch + , (enum bfd_architecture + arch, + long machine)); +CONST char * EXFUN(bfd_printable_arch_mach + , (enum bfd_architecture arch, unsigned long machine)); +typedef enum bfd_reloc_status +{ + /* No errors detected */ bfd_reloc_ok, -/* -The relocation was performed, but there was an overflow. -*/ - + /* The relocation was performed, but there was an overflow. */ bfd_reloc_overflow, -/* -The address to relocate was not within the section supplied -*/ - + /* The address to relocate was not within the section supplied*/ bfd_reloc_outofrange, -/* -Used by special functions -*/ - + /* Used by special functions */ bfd_reloc_continue, -/* -Unused -*/ - + /* Unused */ bfd_reloc_notsupported, -/* -Unsupported relocation size requested. -*/ - + /* Unsupported relocation size requested. */ bfd_reloc_other, -/* -The symbol to relocate against was undefined. -*/ - + /* The symbol to relocate against was undefined.*/ bfd_reloc_undefined, -/* -The relocation was performed, but may not be ok - presently generated -only when linking i960 coff files with i960 b.out symbols. -*/ - + /* The relocation 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_type; -/* -*/ typedef struct reloc_cache_entry { - -/* -A pointer into the canonical table of pointers -*/ - + /* A pointer into the canonical table of pointers */ struct symbol_cache_entry **sym_ptr_ptr; -/* -offset in section -*/ - + /* offset in section */ rawdata_offset address; -/* -addend for relocation value -*/ - + /* 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 -*/ - + /* Pointer to how to perform the required relocation */ CONST struct reloc_howto_struct *howto; -} arelent; - -/* - - reloc_howto_type -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. -*/ +} arelent; typedef CONST struct reloc_howto_struct { -/* 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. -*/ - + /* 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; -/* -The value the final relocation is shifted right by. This drops -unwanted data from the relocation. -*/ - + /* The value the final relocation is shifted right by. This drops + unwanted data from the relocation. */ unsigned int rightshift; -/* -The size of the item to be relocated - 0, is one byte, 1 is 2 bytes, 3 -is four bytes. -*/ - + /* The size of the item to be relocated - 0, is one byte, 1 is 2 + bytes, 3 is four bytes. */ unsigned int size; -/* -Now obsolete -*/ - + /* Now obsolete */ unsigned int bitsize; -/* -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. -*/ - + /* 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; -/* -Now obsolete -*/ - + /* Now obsolete */ unsigned int bitpos; -/* -Now obsolete -*/ - + /* Now obsolete */ boolean absolute; -/* -Causes the relocation routine to return an error if overflow is -detected when relocating. -*/ - + /* 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). -*/ - + /* 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_type (*special_function)(); -/* -The textual name of the relocation type. -*/ - + /* 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. -*/ - + /* 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. -*/ - + /* 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. -*/ + /* 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. -*/ - + /* 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; -/* - - HOWTO -The HOWTO define is horrible and will go away. -*/ +} reloc_howto_type; #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} - -/* -And will be replaced with the totally magic way. But for the moment, -we are compatible, so do it this way.. -*/ - #define NEWHOWTO( FUNCTION, NAME,SIZE,REL,IN) HOWTO(0,0,SIZE,0,REL,0,false,false,FUNCTION, NAME,false,0,0,IN) -/* -Helper routine to turn a symbol into a relocation value. -*/ - - -#define HOWTO_PREPARE(relocation, symbol) \ - { \ - if (symbol != (asymbol *)NULL) { \ - if (symbol->flags & BSF_FORT_COMM) { \ - relocation = 0; \ - } \ - else { \ - relocation = symbol->value; \ - } \ - } \ - if (symbol->section != (asection *)NULL) { \ - relocation += symbol->section->output_section->vma + \ - symbol->section->output_offset; \ - } \ -} - -/* - reloc_chain -*/ +#define HOWTO_PREPARE(relocation, symbol) \ + { \ + if (symbol != (asymbol *)NULL) { \ + if (symbol->section == &bfd_com_section) { \ + relocation = 0; \ + } \ + else { \ + relocation = symbol->value; \ + } \ + } \ +} typedef unsigned char bfd_byte; typedef struct relent_chain { arelent relent; struct relent_chain *next; } arelent_chain; +bfd_reloc_status_type +EXFUN(bfd_perform_relocation + , (bfd * abfd, + arelent *reloc_entry, + PTR data, + asection *input_section, + bfd *output_bfd)); +typedef enum bfd_reloc_code_real +{ + /* 16 bits wide, simple reloc */ + BFD_RELOC_16, -/* - -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_type, - bfd_perform_relocation, - (bfd * abfd, - arelent *reloc_entry, - PTR data, - asection *input_section, - bfd *output_bfd)); - -/* - - bfd_reloc_code_type -*/ - -typedef enum bfd_reloc_code_real { - -/* -16 bits wide, simple reloc -*/ - - BFD_RELOC_16, - -/* -8 bits wide, but used to form an address like 0xffnn -*/ - + /* 8 bits wide, but used to form an address like 0xffnn */ BFD_RELOC_8_FFnn, -/* -8 bits wide, simple -*/ - + /* 8 bits wide, simple */ BFD_RELOC_8, -/* -8 bits wide, pc relative -*/ - + /* 8 bits wide, pc relative */ BFD_RELOC_8_PCREL, -/* -The type of reloc used to build a contructor table - at the moment probably a 32 bit -wide abs address, but the cpu can choose. -*/ + /* The type of reloc used to build a contructor table - at the + moment probably a 32 bit wide abs address, but the cpu can + choose. */ BFD_RELOC_CTOR - -/* -*/ } bfd_reloc_code_real_type; - -/* - - bfd_reloc_type_lookup -This routine returns a pointer to a howto struct which when invoked, -will perform the supplied relocation on data from the architecture -noted. -*/ - - PROTO(CONST struct reloc_howto_struct *, - bfd_reloc_type_lookup, - (CONST bfd_arch_info_type *arch, bfd_reloc_code_type code)); - -/* -*/ - -/*:syms.c*/ -/* @subsection typedef asymbol -An @code{asymbol} has the form: -*/ - +CONST struct reloc_howto_struct * +EXFUN(bfd_reloc_type_lookup + , (CONST bfd_arch_info_type *arch, bfd_reloc_code_type code)); 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. -*/ + /* 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. -*/ + /* The text of the symbol. The name is left alone, and not copied - the + application may not alter it. */ + CONST char *name; - symvalue value; + /* The value of the symbol.*/ + symvalue value; -/* -Attributes of a symbol: -*/ + /* 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. -*/ - + /* The symbol has local scope; <> in <>. 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. -*/ - + /* The symbol has global scope; initialized data in <>. The + value is the offset into the section of the data. */ #define BSF_GLOBAL 0x02 -/* -Obsolete -*/ - + /* Obsolete */ #define BSF_IMPORT 0x04 -/* -The symbol has global scope, and is exported. The value is the offset -into the section of the data. -*/ - + /* 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. -*/ + /* The symbol is undefined. <> in <>. The value has + no meaning. */ +#define BSF_UNDEFINED_OBS 0x10 -#define BSF_UNDEFINED 0x10 + /* The symbol is common, initialized to zero; default in + <>. The value is the size of the object in bytes. */ +#define BSF_FORT_COMM_OBS 0x20 -/* -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. -*/ + /* A normal C symbol would be one of: + <>, <>, <> or + <> */ + /* 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 -*/ - + /* Used by the linker */ #define BSF_KEEP 0x10000 #define BSF_KEEP_G 0x80000 -/* -Unused -*/ - + /* 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. -*/ + /* This symbol was created to point to a section */ +#define BSF_SECTION_SYM 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. -*/ - + /* 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. -*/ + /* In some files the type of a symbol sometimes alters its + location in an output file - ie in coff a <> symbol + which is also <> 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 -/* -Signal that the symbol is the label of constructor section. -*/ - + /* Signal that the symbol is the label of constructor section. */ #define BSF_CONSTRUCTOR 0x1000000 -/* -Signal that the symbol is a warning symbol. If the symbol is a warning -symbol, then the value field (I know this is tacky) will point to the -asymbol which when referenced will cause the warning. -*/ - + /* Signal that the symbol is a warning symbol. If the symbol + is a warning symbol, then the value field (I know this is + tacky) will point to the asymbol which when referenced will + cause the warning. */ #define BSF_WARNING 0x2000000 -/* -Signal that the symbol is indirect. The value of the symbol is a -pointer to an undefined asymbol which contains the name to use -instead. -*/ - + /* Signal that the symbol is indirect. The value of the symbol + is a pointer to an undefined asymbol which contains the + name to use instead. */ #define BSF_INDIRECT 0x4000000 -/* -*/ flagword flags; -/* -A pointer 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. -*/ - + /* A pointer to the section to which this symbol is + relative. This will always be non NULL, there are special + sections for undefined and absolute symbols */ struct sec *section; -/* -Back end special data. This is being phased out in favour of making -this a union. -*/ - + /* Back end special data. This is being phased out in favour + of making this a union. */ PTR udata; -} asymbol; -/* - - get_symtab_upper_bound -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. -*/ +} asymbol; #define get_symtab_upper_bound(abfd) \ BFD_SEND (abfd, _get_symtab_upper_bound, (abfd)) - -/* - - bfd_canonicalize_symtab -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)) - -/* - bfd_set_symtab -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 )); - -/* - - bfd_print_symbol_vandf -Prints the value and flags of the symbol supplied to the stream file. -*/ - - PROTO(void, bfd_print_symbol_vandf, (PTR file, asymbol *symbol)); - -/* - - bfd_make_empty_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. -*/ +boolean EXFUN(bfd_set_symtab , (bfd *, asymbol **, unsigned int )); +void EXFUN(bfd_print_symbol_vandf, (PTR file, asymbol *symbol)); #define bfd_make_empty_symbol(abfd) \ BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd)) - -/* - bfd_decode_symclass -Return a lower-case character corresponding to the symbol class of symbol. -*/ - - PROTO(int, bfd_decode_symclass, (asymbol *symbol)); - -/* - - bfd_stab_name -Returns a string for the stab with the given code, or NULL if not found. -*/ - - PROTO(char *, bfd_stab_name, (int code)); - -/* -*/ - -/*:bfd.c*/ -/* @section @code{typedef bfd} - -A BFD is has type @code{bfd}; objects of this type are the cornerstone -of any application using @code{libbfd}. References though the BFD and -to data in the BFD give the entire BFD functionality. - -Here is the struct used to define the type @code{bfd}. This contains -the major data about the file, and contains pointers to the rest of -the data. -*/ - +int EXFUN(bfd_decode_symclass, (asymbol *symbol)); struct _bfd { -/* 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 @file{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{File Caching}. -*/ + /* The filename the application opened the BFD with. */ + CONST char *filename; - boolean cacheable; + /* A pointer to the target jump table. */ + struct bfd_target *xvec; -/* -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. -*/ + /* To avoid dragging too many header files into every file that + includes @file{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; - boolean target_defaulted; + /* Is the file being cached */ -/* -The caching routines use these to maintain a least-recently-used list of -BFDs (@pxref{File Caching}). -*/ + boolean cacheable; - struct _bfd *lru_prev, *lru_next; + /* 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. */ -/* -When a file is closed by the caching routines, BFD retains state -information on the file here: -*/ + boolean target_defaulted; - file_ptr where; + /* The caching routines use these to maintain a + least-recently-used list of BFDs */ -/* -and here: -*/ + struct _bfd *lru_prev, *lru_next; - boolean opened_once; + /* When a file is closed by the caching routines, BFD retains + state information on the file here: + */ -/* -*/ - boolean mtime_set; -/* File modified time -*/ + file_ptr where; - long mtime; + /* and here:*/ -/* -Reserved for an unimplemented file locking extension. -*/ + boolean opened_once; -int ifd; + /* Set if we have a locally maintained mtime value, rather than + getting it from the file each time: */ -/* -The format which belongs to the BFD. -*/ + boolean mtime_set; - bfd_format format; + /* File modified time, if mtime_set is true: */ -/* -The direction the BFD was opened with -*/ + long mtime; - enum bfd_direction {no_direction = 0, - read_direction = 1, - write_direction = 2, - both_direction = 3} direction; + /* Reserved for an unimplemented file locking extension.*/ -/* -Format_specific flags -*/ + int ifd; - flagword flags; + /* The format which belongs to the BFD.*/ -/* -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. -*/ + bfd_format format; - file_ptr origin; + /* The direction the BFD was opened with*/ -/* -Remember when output has begun, to stop strange things happening. -*/ + enum bfd_direction {no_direction = 0, + read_direction = 1, + write_direction = 2, + both_direction = 3} direction; - boolean output_has_begun; + /* Format_specific flags*/ -/* -Pointer to linked list of sections -*/ + flagword flags; - struct sec *sections; + /* 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. */ -/* -The number of sections -*/ + file_ptr origin; - unsigned int section_count; + /* Remember when output has begun, to stop strange things + happening. */ + boolean output_has_begun; -/* -Stuff only useful for object files: -The start address. -*/ + /* Pointer to linked list of sections*/ + struct sec *sections; - bfd_vma start_address; -/* Used for input and output -*/ + /* The number of sections */ + unsigned int section_count; - unsigned int symcount; -/* Symbol table for output BFD -*/ + /* Stuff only useful for object files: + The start address. */ + bfd_vma start_address; - struct symbol_cache_entry **outsymbols; + /* Used for input and output*/ + unsigned int symcount; -/* -Pointer to structure which contains architecture information -*/ + /* Symbol table for output BFD*/ + struct symbol_cache_entry **outsymbols; - struct bfd_arch_info *arch_info; + /* Pointer to structure which contains architecture information*/ + struct bfd_arch_info *arch_info; -/* -Stuff only useful for archives: -*/ + /* Stuff only useful for archives:*/ + PTR arelt_data; + struct _bfd *my_archive; + struct _bfd *next; + struct _bfd *archive_head; + boolean has_armap; - 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. */ -/* -Used by the back end to hold private data. -*/ - - PTR tdata; - -/* -Used by the application to hold private data -*/ - - PTR usrdata; + union + { + struct aout_data_struct *aout_data; + struct artdata *aout_ar_data; + struct _oasys_data *oasys_obj_data; + struct _oasys_ar_data *oasys_ar_data; + struct coff_tdata *coff_obj_data; + struct ieee_data_struct *ieee_data; + struct ieee_ar_data_struct *ieee_ar_data; + struct srec_data_struct *srec_data; + struct elf_obj_tdata_struct *elf_obj_data; + struct elf_core_tdata_struct *elf_core_data; + struct bout_data_struct *bout_data; + struct sun_core_struct *sun_core_data; + PTR any; + } tdata; + + /* Used by the application to hold private data*/ + PTR usrdata; -/* -Where all the allocated stuff under this BFD goes (@pxref{Memory Usage}). -*/ + /* Where all the allocated stuff under this BFD goes */ + struct obstack memory; - struct obstack memory; + asymbol **ld_symbols; }; -/* - - bfd_set_start_address - -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)); - -/* - - bfd_get_mtime - -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 *)); - -/* - - stuff -*/ - - +unsigned int EXFUN(bfd_get_reloc_upper_bound, (bfd *abfd, asection *sect)); +unsigned int EXFUN(bfd_canonicalize_reloc + , (bfd *abfd, + asection *sec, + arelent **loc, + asymbol **syms)); +boolean EXFUN(bfd_set_file_flags, (bfd *abfd, flagword flags)); +void EXFUN(bfd_set_reloc + , (bfd *abfd, asection *sec, arelent **rel, unsigned int count) + + ); +boolean EXFUN(bfd_set_start_address, (bfd *, bfd_vma)); +long EXFUN(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 bfd_find_nearest_line(abfd, sec, syms, off, file, func, line) \ + BFD_SEND (abfd, _bfd_find_nearest_line, (abfd, sec, syms, off, file, func, line)) #define bfd_debug_info_start(abfd) \ BFD_SEND (abfd, _bfd_debug_info_start, (abfd)) @@ -1920,142 +1176,27 @@ before); else determine modify time, cache it, and return it. #define bfd_coff_swap_aouthdr_out(abfd, i,o) \ BFD_SEND (abfd, _bfd_coff_swap_aouthdr_out, (abfd, i, o)) -/* -*/ - -/*:archive.c*/ -/* bfd_get_next_mapent -What this does -*/ - PROTO(symindex, bfd_get_next_mapent, (bfd *, symindex, carsym **)); - -/* - - bfd_set_archive_head - -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)); - -/* - - bfd_get_elt_at_index -Return the sub bfd contained within the archive at archive index n. -*/ - - PROTO(bfd *, bfd_get_elt_at_index, (bfd *, int)); - -/* - - bfd_openr_next_archived_file -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. -*/ - - PROTO(bfd*, bfd_openr_next_archived_file, - (bfd *archive, bfd *previous)); - -/* -*/ - - -/*:core.c*/ -/* bfd_core_file_failing_command -Returns a read-only string explaining what program was running when -it failed and produced the core file being read -*/ - - PROTO(CONST char *, bfd_core_file_failing_command, (bfd *)); - -/* - - bfd_core_file_failing_signal -Returns the signal number which caused the core dump which generated -the file the BFD is attached to. -*/ - - PROTO(int, bfd_core_file_failing_signal, (bfd *)); - -/* - - core_file_matches_executable_p -Returns @code{true} if the core file attached to @var{core_bfd} was -generated by a run of the executable file attached to @var{exec_bfd}, -or else @code{false}. -*/ - PROTO(boolean, core_file_matches_executable_p, - (bfd *core_bfd, bfd *exec_bfd)); - -/* -*/ - -/*:targets.c*/ -/* bfd_target -@node bfd_target, , Targets, Targets -@subsection 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 bfd_get_relocated_section_contents(abfd, seclet) \ + BFD_SEND (abfd, _bfd_get_relocated_section_contents, (abfd, seclet)) +symindex EXFUN(bfd_get_next_mapent, (bfd *, symindex previous, carsym ** sym)); +boolean EXFUN(bfd_set_archive_head, (bfd *output, bfd *new_head)); +bfd *EXFUN(bfd_get_elt_at_index, (bfd * archive, int index)); +bfd* EXFUN(bfd_openr_next_archived_file, (bfd *archive, bfd *previous)); +CONST char *EXFUN(bfd_core_file_failing_command, (bfd *)); +int EXFUN(bfd_core_file_failing_signal, (bfd *)); +boolean EXFUN(core_file_matches_executable_p + , (bfd *core_bfd, bfd *exec_bfd)); #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 @file{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 @code{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; - -/* -The "flavour" of a back end is a general indication about the contents -of a file. -*/ - enum target_flavour { bfd_target_unknown_flavour, bfd_target_aout_flavour, @@ -2064,113 +1205,31 @@ of a file. bfd_target_ieee_flavour, bfd_target_oasys_flavour, bfd_target_srec_flavour} 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_vma, bfd_getx64, (bfd_byte *)); SDEF (void, bfd_putx64, (bfd_vma, bfd_byte *)); SDEF (bfd_vma, bfd_getx32, (bfd_byte *)); SDEF (void, bfd_putx32, (bfd_vma, bfd_byte *)); SDEF (bfd_vma, bfd_getx16, (bfd_byte *)); SDEF (void, bfd_putx16, (bfd_vma, bfd_byte *)); - -/* -Byte swapping for the headers -*/ - SDEF (bfd_vma, bfd_h_getx64, (bfd_byte *)); SDEF (void, bfd_h_putx64, (bfd_vma, bfd_byte *)); SDEF (bfd_vma, bfd_h_getx32, (bfd_byte *)); SDEF (void, bfd_h_putx32, (bfd_vma, bfd_byte *)); SDEF (bfd_vma, bfd_h_getx16, (bfd_byte *)); SDEF (void, bfd_h_putx16, (bfd_vma, 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 *)); @@ -2179,23 +1238,13 @@ Archive entry points struct orl *map, unsigned 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, _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)); @@ -2222,11 +1271,7 @@ Symbols and reloctions 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 (bfd_byte *, _bfd_get_relocated_section_contents, (bfd*,struct bfd_seclet_struct *)); SDEF(void, _bfd_coff_swap_aux_in,( bfd *abfd , PTR ext, @@ -2244,10 +1289,6 @@ Special entry points for gdb to swap in coff symbol table parts PTR ext, PTR in)); -/* -Special entry points for gas to swap coff parts -*/ - SDEF(unsigned int, _bfd_coff_swap_aux_out,( bfd *abfd, PTR in, @@ -2286,89 +1327,9 @@ Special entry points for gas to swap coff parts PTR out)); } bfd_target; - -/* - -*i bfd_find_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 -@code{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 *)); - -/* - -*i bfd_target_list -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,()); - -/* -*/ - - -/*:format.c*/ -/* *i bfd_check_format -This routine is supplied a BFD and a format. It attempts to verify if -the file attached 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)); - -/* - -*i bfd_set_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)); - -/* - -*i bfd_format_string -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)); - -/* -*/ - +bfd_target *EXFUN(bfd_find_target, (CONST char *, bfd *)); +CONST char **EXFUN(bfd_target_list, ()); +boolean EXFUN(bfd_check_format, (bfd *abfd, bfd_format format)); +boolean EXFUN(bfd_set_format, (bfd *, bfd_format)); +CONST char *EXFUN(bfd_format_string, (bfd_format)); #endif - - - - -