eb435c85da7eddfe70e750e4ea5d3f0c2f30bdb0
[deliverable/binutils-gdb.git] / bfd / bfd.c
1 /* Copyright (C) 1990, 1991 Free Software Foundation, Inc.
2
3 This file is part of BFD, the Binary File Diddler.
4
5 BFD is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 1, or (at your option)
8 any later version.
9
10 BFD is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with BFD; see the file COPYING. If not, write to
17 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
18
19
20 /* $Id$ */
21
22 /*proto*
23 @section typedef bfd
24
25 Pointers to bfd structs are the cornerstone of any application using
26 libbfd. References though the bfd and to data in the bfd give the
27 entire bfd functionality.
28
29 Finally! The BFD struct itself. This contains the major data about
30 the file, and contains pointers to the rest of the data.
31
32 *+++
33
34 $struct _bfd
35 ${
36 The filename the application opened the bfd with.
37
38 $ CONST char *filename;
39
40 A pointer to the target jump table.
41
42 $ struct bfd_target *xvec;
43
44
45 To avoid dragging too many header files into every file that
46 includes bfd.h, IOSTREAM has been declared as a "char *", and MTIME
47 as a "long". Their correct types, to which they are cast when used,
48 are "FILE *" and "time_t".
49
50 The iostream is the result of an fopen on the filename.
51
52 $ char *iostream;
53
54 Is the file being cached @xref{File Caching}.
55
56 $ boolean cacheable;
57
58 Marks whether there was a default target specified when the bfd was
59 opened. This is used to select what matching algorithm to use to chose
60 the back end.
61
62 $ boolean target_defaulted;
63
64 The caching routines use these to maintain an LRU list of bfds.
65
66 $ struct _bfd *lru_prev, *lru_next;
67
68 When a file is closed by the caching routines, it retains the state
69 here:
70
71 $ file_ptr where;
72
73 and here:
74
75 $ boolean opened_once;
76
77 $ boolean mtime_set;
78 File modified time
79
80 $ long mtime;
81
82 For output files, channel we locked (is this used?).
83
84 $int ifd;
85
86 The format which belongs to the bfd.
87
88 $ bfd_format format;
89
90 The direction the bfd was opened with
91
92 $ enum bfd_direction {no_direction = 0,
93 $ read_direction = 1,
94 $ write_direction = 2,
95 $ both_direction = 3} direction;
96
97 Format_specific flags
98
99 $ flagword flags;
100
101 Currently my_archive is tested before adding origin to anything. I
102 believe that this can become always an add of origin, with origin set
103 to 0 for non archive files.
104
105 $ file_ptr origin;
106
107 Remember when output has begun, to stop strange things happening.
108
109 $ boolean output_has_begun;
110
111 Pointer to linked list of sections
112
113 $ struct sec *sections;
114
115 The number of sections
116
117 $ unsigned int section_count;
118
119 Stuff only usefull for object files:
120 The start address.
121
122 $ bfd_vma start_address;
123 Used for input and output
124
125 $ unsigned int symcount;
126 Symtab for output bfd
127
128 $ struct symbol_cache_entry **outsymbols;
129
130 Architecture of object machine, eg m68k
131
132 $ enum bfd_architecture obj_arch;
133
134 Particular machine within arch, e.g. 68010
135
136 $ unsigned long obj_machine;
137
138 Stuff only usefull for archives:
139
140 $ PTR arelt_data;
141 $ struct _bfd *my_archive;
142 $ struct _bfd *next;
143 $ struct _bfd *archive_head;
144 $ boolean has_armap;
145
146 Used by the back end to hold private data.
147
148 $ PTR tdata;
149
150 Used by the application to hold private data
151
152 $ PTR usrdata;
153
154 Where all the allocated stuff under this BFD goes
155
156 $ struct obstack memory;
157 $};
158
159 *---
160
161 */
162 #include <sysdep.h>
163 #include "bfd.h"
164 #include "libbfd.h"
165
166
167 short _bfd_host_big_endian = 0x0100;
168 /* Accessing the above as (*(char*)&_bfd_host_big_endian), will
169 return 1 if the host is big-endian, 0 otherwise.
170 (assuming that a short is two bytes long!!! FIXME)
171 (See HOST_IS_BIG_ENDIAN_P in bfd.h.) */
172 \f
173 /** Error handling
174 o - Most functions return nonzero on success (check doc for
175 precise semantics); 0 or NULL on error.
176 o - Internal errors are documented by the value of bfd_error.
177 If that is system_call_error then check errno.
178 o - The easiest way to report this to the user is to use bfd_perror.
179 */
180
181 bfd_ec bfd_error = no_error;
182
183 char *bfd_errmsgs[] = { "No error",
184 "System call error",
185 "Invalid target",
186 "File in wrong format",
187 "Invalid operation",
188 "Memory exhausted",
189 "No symbols",
190 "No relocation info",
191 "No more archived files",
192 "Malformed archive",
193 "Symbol not found",
194 "File format not recognized",
195 "File format is ambiguous",
196 "Section has no contents",
197 "Nonrepresentable section on output",
198 "#<Invalid error code>"
199 };
200
201 static
202 void
203 DEFUN(bfd_nonrepresentable_section,(abfd, name),
204 CONST bfd * CONST abfd AND
205 CONST char * CONST name)
206 {
207 printf("bfd error writing file %s, format %s can't represent section %s\n",
208 abfd->filename,
209 abfd->xvec->name,
210 name);
211 exit(1);
212 }
213
214 bfd_error_vector_type bfd_error_vector =
215 {
216 bfd_nonrepresentable_section
217 };
218
219 #if 1 || !defined(ANSI_LIBRARIES) && !defined(__STDC__)
220 char *
221 strerror (code)
222 int code;
223 {
224 extern int sys_nerr;
225 extern char *sys_errlist[];
226
227 return (((code < 0) || (code >= sys_nerr)) ? "(unknown error)" :
228 sys_errlist [code]);
229 }
230 #endif /* not ANSI_LIBRARIES */
231
232
233 char *
234 bfd_errmsg (error_tag)
235 bfd_ec error_tag;
236 {
237 #ifndef errno
238 extern int errno;
239 #endif
240 if (error_tag == system_call_error)
241 return strerror (errno);
242
243 if ((((int)error_tag <(int) no_error) ||
244 ((int)error_tag > (int)invalid_error_code)))
245 error_tag = invalid_error_code;/* sanity check */
246
247 return bfd_errmsgs [(int)error_tag];
248 }
249
250
251 void bfd_default_error_trap(error_tag)
252 bfd_ec error_tag;
253 {
254 printf("bfd assert fail (%s)\n", bfd_errmsg(error_tag));
255 }
256
257 void (*bfd_error_trap)() = bfd_default_error_trap;
258 void (*bfd_error_nonrepresentabltrap)() = bfd_default_error_trap;
259
260 void
261 DEFUN(bfd_perror,(message),
262 CONST char *message)
263 {
264 if (bfd_error == system_call_error)
265 perror((char *)message); /* must be system error then... */
266 else {
267 if (message == NULL || *message == '\0')
268 fprintf (stderr, "%s\n", bfd_errmsg (bfd_error));
269 else
270 fprintf (stderr, "%s: %s\n", message, bfd_errmsg (bfd_error));
271 }
272 }
273
274 \f
275 /** Symbols */
276
277 /* returns the number of octets of storage required */
278
279 unsigned int
280 get_reloc_upper_bound (abfd, asect)
281 bfd *abfd;
282 sec_ptr asect;
283 {
284 if (abfd->format != bfd_object) {
285 bfd_error = invalid_operation;
286 return 0;
287 }
288
289 return BFD_SEND (abfd, _get_reloc_upper_bound, (abfd, asect));
290 }
291
292 unsigned int
293 bfd_canonicalize_reloc (abfd, asect, location, symbols)
294 bfd *abfd;
295 sec_ptr asect;
296 arelent **location;
297 asymbol **symbols;
298 {
299 if (abfd->format != bfd_object) {
300 bfd_error = invalid_operation;
301 return 0;
302 }
303
304 return BFD_SEND (abfd, _bfd_canonicalize_reloc, (abfd, asect, location, symbols));
305 }
306
307
308 boolean
309 bfd_set_file_flags (abfd, flags)
310 bfd *abfd;
311 flagword flags;
312 {
313 if (abfd->format != bfd_object) {
314 bfd_error = wrong_format;
315 return false;
316 }
317
318 if (bfd_read_p (abfd)) {
319 bfd_error = invalid_operation;
320 return false;
321 }
322
323 if ((flags & bfd_applicable_file_flags (abfd)) != flags) {
324 bfd_error = invalid_operation;
325 return false;
326 }
327
328 bfd_get_file_flags (abfd) = flags;
329 return true;
330 }
331
332
333 void
334 bfd_set_reloc (ignore_abfd, asect, location, count)
335 bfd *ignore_abfd;
336 sec_ptr asect;
337 arelent **location;
338 unsigned int count;
339 {
340 asect->orelocation = location;
341 asect->reloc_count = count;
342 }
343
344 void
345 bfd_assert(file, line)
346 char *file;
347 int line;
348 {
349 printf("bfd assertion fail %s:%d\n",file,line);
350 }
351
352
353 /*proto* bfd_set_start_address
354
355 Marks the entry point of an output bfd. Returns @code{true} on
356 success, @code{false} otherwise.
357
358 *; PROTO(boolean, bfd_set_start_address,(bfd *, bfd_vma));
359 */
360
361 boolean
362 bfd_set_start_address(abfd, vma)
363 bfd *abfd;
364 bfd_vma vma;
365 {
366 abfd->start_address = vma;
367 return true;
368 }
369
370
371 /*proto* bfd_get_mtime
372
373 Return cached file modification time (e.g. as read from archive header
374 for archive members, or from file system if we have been called
375 before); else determine modify time, cache it, and return it.
376
377 *;PROTO(long, bfd_get_mtime, (bfd *));
378
379 */
380
381 long
382 bfd_get_mtime (abfd)
383 bfd *abfd;
384 {
385 FILE *fp;
386 struct stat buf;
387
388 if (abfd->mtime_set)
389 return abfd->mtime;
390
391 fp = bfd_cache_lookup (abfd);
392 if (0 != fstat (fileno (fp), &buf))
393 return 0;
394
395 abfd->mtime_set = true;
396 abfd->mtime = buf.st_mtime;
397 return abfd->mtime;
398 }
399
400 /*proto*
401 *i stuff
402 *+
403 #define bfd_sizeof_headers(abfd, reloc) \
404 BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, reloc))
405
406 #define bfd_find_nearest_line(abfd, section, symbols, offset, filename_ptr, func, line_ptr) \
407 BFD_SEND (abfd, _bfd_find_nearest_line, (abfd, section, symbols, offset, filename_ptr, func, line_ptr))
408
409 #define bfd_debug_info_start(abfd) \
410 BFD_SEND (abfd, _bfd_debug_info_start, (abfd))
411
412 #define bfd_debug_info_end(abfd) \
413 BFD_SEND (abfd, _bfd_debug_info_end, (abfd))
414
415 #define bfd_debug_info_accumulate(abfd, section) \
416 BFD_SEND (abfd, _bfd_debug_info_accumulate, (abfd, section))
417
418 #define bfd_stat_arch_elt(abfd, stat) \
419 BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat))
420 *-
421
422 */
423
424
425
426
427
428
This page took 0.045285 seconds and 4 git commands to generate.