| 1 | /* libbfd.h -- Declarations used by bfd library *implementation*. |
| 2 | (This include file is not for users of the library.) |
| 3 | Copyright 1990, 1991 Free Software Foundation, Inc. |
| 4 | Written by Cygnus Support. |
| 5 | |
| 6 | This file is part of BFD, the Binary File Descriptor library. |
| 7 | |
| 8 | This program is free software; you can redistribute it and/or modify |
| 9 | it under the terms of the GNU General Public License as published by |
| 10 | the Free Software Foundation; either version 2 of the License, or |
| 11 | (at your option) any later version. |
| 12 | |
| 13 | This program is distributed in the hope that it will be useful, |
| 14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 16 | GNU General Public License for more details. |
| 17 | |
| 18 | You should have received a copy of the GNU General Public License |
| 19 | along with this program; if not, write to the Free Software |
| 20 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ |
| 21 | |
| 22 | |
| 23 | /* Align an address upward to a boundary, expressed as a number of bytes. |
| 24 | E.g. align to an 8-byte boundary with argument of 8. */ |
| 25 | #define BFD_ALIGN(this, boundary) \ |
| 26 | ((( (this) + ((boundary) -1)) & (~((boundary)-1)))) |
| 27 | |
| 28 | /* If you want to read and write large blocks, you might want to do it |
| 29 | in quanta of this amount */ |
| 30 | #define DEFAULT_BUFFERSIZE 8192 |
| 31 | |
| 32 | /* Set a tdata field. Can't use the other macros for this, since they |
| 33 | do casts, and casting to the left of assignment isn't portable. */ |
| 34 | #define set_tdata(bfd, v) ((bfd)->tdata = (PTR) (v)) |
| 35 | |
| 36 | /* tdata for an archive. For an input archive, cache |
| 37 | needs to be free()'d. For an output archive, symdefs do. */ |
| 38 | |
| 39 | struct artdata { |
| 40 | file_ptr first_file_filepos; |
| 41 | /* Speed up searching the armap */ |
| 42 | struct ar_cache *cache; |
| 43 | bfd *archive_head; /* Only interesting in output routines */ |
| 44 | carsym *symdefs; /* the symdef entries */ |
| 45 | symindex symdef_count; /* how many there are */ |
| 46 | char *extended_names; /* clever intel extension */ |
| 47 | }; |
| 48 | |
| 49 | #define bfd_ardata(bfd) ((struct artdata *) ((bfd)->tdata)) |
| 50 | |
| 51 | /* Goes in bfd's arelt_data slot */ |
| 52 | struct areltdata { |
| 53 | char * arch_header; /* it's actually a string */ |
| 54 | unsigned int parsed_size; /* octets of filesize not including ar_hdr */ |
| 55 | char *filename; /* null-terminated */ |
| 56 | }; |
| 57 | |
| 58 | #define arelt_size(bfd) (((struct areltdata *)((bfd)->arelt_data))->parsed_size) |
| 59 | |
| 60 | /* FIXME -- a lot of my code allocates a large block and subdivides it. |
| 61 | This can't always work, because of alignment restrictions. We should change |
| 62 | it before it becomes a problem -- Gumby */ |
| 63 | |
| 64 | PROTO (char *, zalloc, (bfd_size_type size)); |
| 65 | |
| 66 | /* These routines allocate and free things on the BFD's obstack. Note |
| 67 | that realloc can never occur in place. */ |
| 68 | |
| 69 | PROTO(PTR, bfd_alloc, (bfd *abfd, bfd_size_type size)); |
| 70 | PROTO(PTR, bfd_zalloc,(bfd *abfd, bfd_size_type size)); |
| 71 | PROTO(PTR, bfd_realloc,(bfd *abfd, PTR orig, bfd_size_type new)); |
| 72 | PROTO(void, bfd_alloc_grow,(bfd *abfd, PTR thing, bfd_size_type size)); |
| 73 | PROTO(PTR, bfd_alloc_finish,(bfd *abfd)); |
| 74 | |
| 75 | #define bfd_release(x,y) (void) obstack_free(&(x->memory),y) |
| 76 | |
| 77 | |
| 78 | PROTO (bfd_size_type, bfd_read, (PTR ptr, bfd_size_type size, bfd_size_type nitems, bfd *abfd)); |
| 79 | PROTO (bfd_size_type, bfd_write, (CONST PTR ptr, bfd_size_type size, bfd_size_type nitems, bfd *abfd)); |
| 80 | |
| 81 | |
| 82 | |
| 83 | PROTO (int, bfd_seek,(bfd* abfd, file_ptr fp , int direction)); |
| 84 | PROTO (long, bfd_tell, (bfd *abfd)); |
| 85 | PROTO (bfd *, _bfd_create_empty_archive_element_shell, (bfd *obfd)); |
| 86 | PROTO (bfd *, look_for_bfd_in_cache, (bfd *arch_bfd, file_ptr index)); |
| 87 | PROTO (boolean, _bfd_generic_mkarchive, (bfd *abfd)); |
| 88 | PROTO (struct areltdata *, snarf_ar_hdr, (bfd *abfd)); |
| 89 | PROTO (bfd_target *, bfd_generic_archive_p, (bfd *abfd)); |
| 90 | PROTO (boolean, bfd_slurp_bsd_armap, (bfd *abfd)); |
| 91 | PROTO (boolean, bfd_slurp_coff_armap, (bfd *abfd)); |
| 92 | PROTO (boolean, _bfd_slurp_extended_name_table, (bfd *abfd)); |
| 93 | PROTO (boolean, _bfd_write_archive_contents, (bfd *abfd)); |
| 94 | PROTO (bfd *, new_bfd, ()); |
| 95 | |
| 96 | #define DEFAULT_STRING_SPACE_SIZE 0x2000 |
| 97 | PROTO (boolean, bfd_add_to_string_table, (char **table, char *new_string, |
| 98 | unsigned int *table_length, |
| 99 | char **free_ptr)); |
| 100 | PROTO (bfd_vma, _do_getb64, (unsigned char *addr)); |
| 101 | PROTO (bfd_vma, _do_getl64, (unsigned char *addr)); |
| 102 | PROTO (bfd_vma, _do_getb32, (unsigned char *addr)); |
| 103 | PROTO (bfd_vma, _do_getl32, (unsigned char *addr)); |
| 104 | PROTO (bfd_vma, _do_getb16, (unsigned char *addr)); |
| 105 | PROTO (bfd_vma, _do_getl16, (unsigned char *addr)); |
| 106 | PROTO (void, _do_putb64, (bfd_vma data, unsigned char *addr)); |
| 107 | PROTO (void, _do_putl64, (bfd_vma data, unsigned char *addr)); |
| 108 | PROTO (void, _do_putb32, (bfd_vma data, unsigned char *addr)); |
| 109 | PROTO (void, _do_putl32, (bfd_vma data, unsigned char *addr)); |
| 110 | PROTO (void, _do_putb16, (bfd_vma data, unsigned char *addr)); |
| 111 | PROTO (void, _do_putl16, (bfd_vma data, unsigned char *addr)); |
| 112 | |
| 113 | PROTO (boolean, bfd_false, (bfd *ignore)); |
| 114 | PROTO (boolean, bfd_true, (bfd *ignore)); |
| 115 | PROTO (PTR, bfd_nullvoidptr, (bfd *ignore)); |
| 116 | PROTO (int, bfd_0, (bfd *ignore)); |
| 117 | PROTO (unsigned int, bfd_0u, (bfd *ignore)); |
| 118 | PROTO (void, bfd_void, (bfd *ignore)); |
| 119 | |
| 120 | PROTO (bfd *,new_bfd_contained_in,(bfd *)); |
| 121 | PROTO (boolean, _bfd_dummy_new_section_hook, (bfd *ignore, asection *newsect)); |
| 122 | PROTO (char *, _bfd_dummy_core_file_failing_command, (bfd *abfd)); |
| 123 | PROTO (int, _bfd_dummy_core_file_failing_signal, (bfd *abfd)); |
| 124 | PROTO (boolean, _bfd_dummy_core_file_matches_executable_p, (bfd *core_bfd, |
| 125 | bfd *exec_bfd)); |
| 126 | PROTO (bfd_target *, _bfd_dummy_target, (bfd *abfd)); |
| 127 | |
| 128 | PROTO (void, bfd_dont_truncate_arname, (bfd *abfd, CONST char *filename, |
| 129 | char *hdr)); |
| 130 | PROTO (void, bfd_bsd_truncate_arname, (bfd *abfd, CONST char *filename, |
| 131 | char *hdr)); |
| 132 | PROTO (void, bfd_gnu_truncate_arname, (bfd *abfd, CONST char *filename, |
| 133 | char *hdr)); |
| 134 | |
| 135 | PROTO (boolean, bsd_write_armap, (bfd *arch, unsigned int elength, |
| 136 | struct orl *map, unsigned int orl_count, int stridx)); |
| 137 | |
| 138 | PROTO (boolean, coff_write_armap, (bfd *arch, unsigned int elength, |
| 139 | struct orl *map, unsigned int orl_count, int stridx)); |
| 140 | |
| 141 | PROTO (bfd *, bfd_generic_openr_next_archived_file, (bfd *archive, |
| 142 | bfd *last_file)); |
| 143 | |
| 144 | PROTO(int, bfd_generic_stat_arch_elt, (bfd *, struct stat *)); |
| 145 | |
| 146 | PROTO(boolean, bfd_generic_get_section_contents, |
| 147 | (bfd *abfd, sec_ptr section, PTR location, file_ptr offset, |
| 148 | bfd_size_type count)); |
| 149 | |
| 150 | PROTO(boolean, bfd_generic_set_section_contents, |
| 151 | (bfd *abfd, sec_ptr section, PTR location, file_ptr offset, |
| 152 | bfd_size_type count)); |
| 153 | |
| 154 | /* Macros to tell if bfds are read or write enabled. |
| 155 | |
| 156 | Note that bfds open for read may be scribbled into if the fd passed |
| 157 | to bfd_fdopenr is actually open both for read and write |
| 158 | simultaneously. However an output bfd will never be open for |
| 159 | read. Therefore sometimes you want to check bfd_read_p or |
| 160 | !bfd_read_p, and only sometimes bfd_write_p. |
| 161 | */ |
| 162 | |
| 163 | #define bfd_read_p(abfd) ((abfd)->direction == read_direction || (abfd)->direction == both_direction) |
| 164 | #define bfd_write_p(abfd) ((abfd)->direction == write_direction || (abfd)->direction == both_direction) |
| 165 | |
| 166 | PROTO (void, bfd_assert,(char*,int)); |
| 167 | #define BFD_ASSERT(x) \ |
| 168 | { if (!(x)) bfd_assert(__FILE__,__LINE__); } |
| 169 | |
| 170 | #define BFD_FAIL() \ |
| 171 | { bfd_assert(__FILE__,__LINE__); } |
| 172 | |
| 173 | PROTO (FILE *, bfd_cache_lookup_worker, (bfd *)); |
| 174 | |
| 175 | extern bfd *bfd_last_cache; |
| 176 | |
| 177 | /* Now Steve, what's the story here? */ |
| 178 | #ifdef lint |
| 179 | #define itos(x) "l" |
| 180 | #define stoi(x) 1 |
| 181 | #else |
| 182 | #define itos(x) ((char*)(x)) |
| 183 | #define stoi(x) ((int)(x)) |
| 184 | #endif |
| 185 | |
| 186 | /* Generic routine for close_and_cleanup is really just bfd_true. */ |
| 187 | #define bfd_generic_close_and_cleanup bfd_true |
| 188 | |
| 189 | /* THE FOLLOWING IS EXTRACTED FROM THE SOURCE*/ |
| 190 | |
| 191 | /*:init.c*/ |
| 192 | |
| 193 | /*:libbfd.c*/ |
| 194 | |
| 195 | /*:cache.c*/ |
| 196 | |
| 197 | /*:ctor.c*/ |
| 198 | |
| 199 | /*:reloc.c*/ |
| 200 | |
| 201 | /*:cpu-h8300.c*/ |
| 202 | |
| 203 | /*:cpu-i960.c*/ |
| 204 | |
| 205 | /*:cpu-empty.c*/ |
| 206 | |
| 207 | /*:archures.c*/ |
| 208 | |