OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [bfd/] [bfd.c] - Blame information for rev 1772

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 104 markom
/* Generic BFD library interface and support routines.
2
   Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
3
   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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
21
 
22
/*
23
SECTION
24
        <<typedef bfd>>
25
 
26
        A BFD has type <<bfd>>; objects of this type are the
27
        cornerstone of any application using BFD. Using BFD
28
        consists of making references though the BFD and to data in the BFD.
29
 
30
        Here is the structure that defines the type <<bfd>>.  It
31
        contains the major data about the file and pointers
32
        to the rest of the data.
33
 
34
CODE_FRAGMENT
35
.
36
.struct _bfd
37
.{
38
.    {* The filename the application opened the BFD with.  *}
39
.    CONST char *filename;
40
.
41
.    {* A pointer to the target jump table.             *}
42
.    const struct bfd_target *xvec;
43
.
44
.    {* To avoid dragging too many header files into every file that
45
.       includes `<<bfd.h>>', IOSTREAM has been declared as a "char
46
.       *", and MTIME as a "long".  Their correct types, to which they
47
.       are cast when used, are "FILE *" and "time_t".    The iostream
48
.       is the result of an fopen on the filename.  However, if the
49
.       BFD_IN_MEMORY flag is set, then iostream is actually a pointer
50
.       to a bfd_in_memory struct.  *}
51
.    PTR iostream;
52
.
53
.    {* Is the file descriptor being cached?  That is, can it be closed as
54
.       needed, and re-opened when accessed later?  *}
55
.
56
.    boolean cacheable;
57
.
58
.    {* Marks whether there was a default target specified when the
59
.       BFD was opened. This is used to select which matching algorithm
60
.       to use to choose the back end. *}
61
.
62
.    boolean target_defaulted;
63
.
64
.    {* The caching routines use these to maintain a
65
.       least-recently-used list of BFDs *}
66
.
67
.    struct _bfd *lru_prev, *lru_next;
68
.
69
.    {* When a file is closed by the caching routines, BFD retains
70
.       state information on the file here: *}
71
.
72
.    file_ptr where;
73
.
74
.    {* and here: (``once'' means at least once) *}
75
.
76
.    boolean opened_once;
77
.
78
.    {* Set if we have a locally maintained mtime value, rather than
79
.       getting it from the file each time: *}
80
.
81
.    boolean mtime_set;
82
.
83
.    {* File modified time, if mtime_set is true: *}
84
.
85
.    long mtime;
86
.
87
.    {* Reserved for an unimplemented file locking extension.*}
88
.
89
.    int ifd;
90
.
91
.    {* The format which belongs to the BFD. (object, core, etc.) *}
92
.
93
.    bfd_format format;
94
.
95
.    {* The direction the BFD was opened with*}
96
.
97
.    enum bfd_direction {no_direction = 0,
98
.                        read_direction = 1,
99
.                        write_direction = 2,
100
.                        both_direction = 3} direction;
101
.
102
.    {* Format_specific flags*}
103
.
104
.    flagword flags;
105
.
106
.    {* Currently my_archive is tested before adding origin to
107
.       anything. I believe that this can become always an add of
108
.       origin, with origin set to 0 for non archive files.   *}
109
.
110
.    file_ptr origin;
111
.
112
.    {* Remember when output has begun, to stop strange things
113
.       from happening. *}
114
.    boolean output_has_begun;
115
.
116
.    {* Pointer to linked list of sections*}
117
.    struct sec  *sections;
118
.
119
.    {* The number of sections *}
120
.    unsigned int section_count;
121
.
122
.    {* Stuff only useful for object files:
123
.       The start address. *}
124
.    bfd_vma start_address;
125
.
126
.    {* Used for input and output*}
127
.    unsigned int symcount;
128
.
129
.    {* Symbol table for output BFD (with symcount entries) *}
130
.    struct symbol_cache_entry  **outsymbols;
131
.
132
.    {* Pointer to structure which contains architecture information*}
133
.    const struct bfd_arch_info *arch_info;
134
.
135
.    {* Stuff only useful for archives:*}
136
.    PTR arelt_data;
137
.    struct _bfd *my_archive;     {* The containing archive BFD.  *}
138
.    struct _bfd *next;           {* The next BFD in the archive.  *}
139
.    struct _bfd *archive_head;   {* The first BFD in the archive.  *}
140
.    boolean has_armap;
141
.
142
.    {* A chain of BFD structures involved in a link.  *}
143
.    struct _bfd *link_next;
144
.
145
.    {* A field used by _bfd_generic_link_add_archive_symbols.  This will
146
.       be used only for archive elements.  *}
147
.    int archive_pass;
148
.
149
.    {* Used by the back end to hold private data. *}
150
.
151
.    union
152
.      {
153
.      struct aout_data_struct *aout_data;
154
.      struct artdata *aout_ar_data;
155
.      struct _oasys_data *oasys_obj_data;
156
.      struct _oasys_ar_data *oasys_ar_data;
157
.      struct coff_tdata *coff_obj_data;
158
.      struct pe_tdata *pe_obj_data;
159
.      struct xcoff_tdata *xcoff_obj_data;
160
.      struct ecoff_tdata *ecoff_obj_data;
161
.      struct ieee_data_struct *ieee_data;
162
.      struct ieee_ar_data_struct *ieee_ar_data;
163
.      struct srec_data_struct *srec_data;
164
.      struct ihex_data_struct *ihex_data;
165
.      struct tekhex_data_struct *tekhex_data;
166
.      struct elf_obj_tdata *elf_obj_data;
167
.      struct nlm_obj_tdata *nlm_obj_data;
168
.      struct bout_data_struct *bout_data;
169
.      struct sun_core_struct *sun_core_data;
170
.      struct sco5_core_struct *sco5_core_data;
171
.      struct trad_core_struct *trad_core_data;
172
.      struct som_data_struct *som_data;
173
.      struct hpux_core_struct *hpux_core_data;
174
.      struct hppabsd_core_struct *hppabsd_core_data;
175
.      struct sgi_core_struct *sgi_core_data;
176
.      struct lynx_core_struct *lynx_core_data;
177
.      struct osf_core_struct *osf_core_data;
178
.      struct cisco_core_struct *cisco_core_data;
179
.      struct versados_data_struct *versados_data;
180
.      struct netbsd_core_struct *netbsd_core_data;
181
.      PTR any;
182
.      } tdata;
183
.
184
.    {* Used by the application to hold private data*}
185
.    PTR usrdata;
186
.
187
.  {* Where all the allocated stuff under this BFD goes.  This is a
188
.     struct objalloc *, but we use PTR to avoid requiring the inclusion of
189
.     objalloc.h.  *}
190
.    PTR memory;
191
.};
192
.
193
*/
194
 
195
#include "bfd.h"
196
#include "sysdep.h"
197
 
198
#ifdef ANSI_PROTOTYPES
199
#include <stdarg.h>
200
#else
201
#include <varargs.h>
202
#endif
203
 
204
#include "libiberty.h"
205
#include "bfdlink.h"
206
#include "libbfd.h"
207
#include "coff/internal.h"
208
#include "coff/sym.h"
209
#include "libcoff.h"
210
#include "libecoff.h"
211
#undef obj_symbols
212
#include "elf-bfd.h"
213
 
214
#include <ctype.h>
215
 
216
/* provide storage for subsystem, stack and heap data which may have been
217
   passed in on the command line.  Ld puts this data into a bfd_link_info
218
   struct which ultimately gets passed in to the bfd.  When it arrives, copy
219
   it to the following struct so that the data will be available in coffcode.h
220
   where it is needed.  The typedef's used are defined in bfd.h */
221
 
222
 
223
 
224
/*
225
SECTION
226
        Error reporting
227
 
228
        Most BFD functions return nonzero on success (check their
229
        individual documentation for precise semantics).  On an error,
230
        they call <<bfd_set_error>> to set an error condition that callers
231
        can check by calling <<bfd_get_error>>.
232
        If that returns <<bfd_error_system_call>>, then check
233
        <<errno>>.
234
 
235
        The easiest way to report a BFD error to the user is to
236
        use <<bfd_perror>>.
237
 
238
SUBSECTION
239
        Type <<bfd_error_type>>
240
 
241
        The values returned by <<bfd_get_error>> are defined by the
242
        enumerated type <<bfd_error_type>>.
243
 
244
CODE_FRAGMENT
245
.
246
.typedef enum bfd_error
247
.{
248
.  bfd_error_no_error = 0,
249
.  bfd_error_system_call,
250
.  bfd_error_invalid_target,
251
.  bfd_error_wrong_format,
252
.  bfd_error_invalid_operation,
253
.  bfd_error_no_memory,
254
.  bfd_error_no_symbols,
255
.  bfd_error_no_armap,
256
.  bfd_error_no_more_archived_files,
257
.  bfd_error_malformed_archive,
258
.  bfd_error_file_not_recognized,
259
.  bfd_error_file_ambiguously_recognized,
260
.  bfd_error_no_contents,
261
.  bfd_error_nonrepresentable_section,
262
.  bfd_error_no_debug_section,
263
.  bfd_error_bad_value,
264
.  bfd_error_file_truncated,
265
.  bfd_error_file_too_big,
266
.  bfd_error_invalid_error_code
267
.} bfd_error_type;
268
.
269
*/
270
 
271
static bfd_error_type bfd_error = bfd_error_no_error;
272
 
273
CONST char *CONST bfd_errmsgs[] = {
274
                        N_("No error"),
275
                        N_("System call error"),
276
                        N_("Invalid bfd target"),
277
                        N_("File in wrong format"),
278
                        N_("Invalid operation"),
279
                        N_("Memory exhausted"),
280
                        N_("No symbols"),
281
                        N_("Archive has no index; run ranlib to add one"),
282
                        N_("No more archived files"),
283
                        N_("Malformed archive"),
284
                        N_("File format not recognized"),
285
                        N_("File format is ambiguous"),
286
                        N_("Section has no contents"),
287
                        N_("Nonrepresentable section on output"),
288
                        N_("Symbol needs debug section which does not exist"),
289
                        N_("Bad value"),
290
                        N_("File truncated"),
291
                        N_("File too big"),
292
                        N_("#<Invalid error code>")
293
                       };
294
 
295
/*
296
FUNCTION
297
        bfd_get_error
298
 
299
SYNOPSIS
300
        bfd_error_type bfd_get_error (void);
301
 
302
DESCRIPTION
303
        Return the current BFD error condition.
304
*/
305
 
306
bfd_error_type
307
bfd_get_error ()
308
{
309
  return bfd_error;
310
}
311
 
312
/*
313
FUNCTION
314
        bfd_set_error
315
 
316
SYNOPSIS
317
        void bfd_set_error (bfd_error_type error_tag);
318
 
319
DESCRIPTION
320
        Set the BFD error condition to be @var{error_tag}.
321
*/
322
 
323
void
324
bfd_set_error (error_tag)
325
     bfd_error_type error_tag;
326
{
327
  bfd_error = error_tag;
328
}
329
 
330
/*
331
FUNCTION
332
        bfd_errmsg
333
 
334
SYNOPSIS
335
        CONST char *bfd_errmsg (bfd_error_type error_tag);
336
 
337
DESCRIPTION
338
        Return a string describing the error @var{error_tag}, or
339
        the system error if @var{error_tag} is <<bfd_error_system_call>>.
340
*/
341
 
342
CONST char *
343
bfd_errmsg (error_tag)
344
     bfd_error_type error_tag;
345
{
346
#ifndef errno
347
  extern int errno;
348
#endif
349
  if (error_tag == bfd_error_system_call)
350
    return xstrerror (errno);
351
 
352
  if ((((int)error_tag <(int) bfd_error_no_error) ||
353
       ((int)error_tag > (int)bfd_error_invalid_error_code)))
354
    error_tag = bfd_error_invalid_error_code;/* sanity check */
355
 
356
  return _(bfd_errmsgs [(int)error_tag]);
357
}
358
 
359
/*
360
FUNCTION
361
        bfd_perror
362
 
363
SYNOPSIS
364
        void bfd_perror (CONST char *message);
365
 
366
DESCRIPTION
367
        Print to the standard error stream a string describing the
368
        last BFD error that occurred, or the last system error if
369
        the last BFD error was a system call failure.  If @var{message}
370
        is non-NULL and non-empty, the error string printed is preceded
371
        by @var{message}, a colon, and a space.  It is followed by a newline.
372
*/
373
 
374
void
375
bfd_perror (message)
376
     CONST char *message;
377
{
378
  if (bfd_get_error () == bfd_error_system_call)
379
    perror((char *)message);            /* must be system error then... */
380
  else {
381
    if (message == NULL || *message == '\0')
382
      fprintf (stderr, "%s\n", bfd_errmsg (bfd_get_error ()));
383
    else
384
      fprintf (stderr, "%s: %s\n", message, bfd_errmsg (bfd_get_error ()));
385
  }
386
}
387
 
388
/*
389
SUBSECTION
390
        BFD error handler
391
 
392
        Some BFD functions want to print messages describing the
393
        problem.  They call a BFD error handler function.  This
394
        function may be overriden by the program.
395
 
396
        The BFD error handler acts like printf.
397
 
398
CODE_FRAGMENT
399
.
400
.typedef void (*bfd_error_handler_type) PARAMS ((const char *, ...));
401
.
402
*/
403
 
404
/* The program name used when printing BFD error messages.  */
405
 
406
static const char *_bfd_error_program_name;
407
 
408
/* This is the default routine to handle BFD error messages.  */
409
 
410
#ifdef ANSI_PROTOTYPES
411
 
412
static void _bfd_default_error_handler PARAMS ((const char *s, ...));
413
 
414
static void
415
_bfd_default_error_handler (const char *s, ...)
416
{
417
  va_list p;
418
 
419
  if (_bfd_error_program_name != NULL)
420
    fprintf (stderr, "%s: ", _bfd_error_program_name);
421
  else
422
    fprintf (stderr, "BFD: ");
423
 
424
  va_start (p, s);
425
 
426
  vfprintf (stderr, s, p);
427
 
428
  va_end (p);
429
 
430
  fprintf (stderr, "\n");
431
}
432
 
433
#else /* ! defined (ANSI_PROTOTYPES) */
434
 
435
static void _bfd_default_error_handler ();
436
 
437
static void
438
_bfd_default_error_handler (va_alist)
439
     va_dcl
440
{
441
  va_list p;
442
  const char *s;
443
 
444
  if (_bfd_error_program_name != NULL)
445
    fprintf (stderr, "%s: ", _bfd_error_program_name);
446
  else
447
    fprintf (stderr, "BFD: ");
448
 
449
  va_start (p);
450
 
451
  s = va_arg (p, const char *);
452
  vfprintf (stderr, s, p);
453
 
454
  va_end (p);
455
 
456
  fprintf (stderr, "\n");
457
}
458
 
459
#endif /* ! defined (ANSI_PROTOTYPES) */
460
 
461
/* This is a function pointer to the routine which should handle BFD
462
   error messages.  It is called when a BFD routine encounters an
463
   error for which it wants to print a message.  Going through a
464
   function pointer permits a program linked against BFD to intercept
465
   the messages and deal with them itself.  */
466
 
467
bfd_error_handler_type _bfd_error_handler = _bfd_default_error_handler;
468
 
469
/*
470
FUNCTION
471
        bfd_set_error_handler
472
 
473
SYNOPSIS
474
        bfd_error_handler_type bfd_set_error_handler (bfd_error_handler_type);
475
 
476
DESCRIPTION
477
        Set the BFD error handler function.  Returns the previous
478
        function.
479
*/
480
 
481
bfd_error_handler_type
482
bfd_set_error_handler (pnew)
483
     bfd_error_handler_type pnew;
484
{
485
  bfd_error_handler_type pold;
486
 
487
  pold = _bfd_error_handler;
488
  _bfd_error_handler = pnew;
489
  return pold;
490
}
491
 
492
/*
493
FUNCTION
494
        bfd_set_error_program_name
495
 
496
SYNOPSIS
497
        void bfd_set_error_program_name (const char *);
498
 
499
DESCRIPTION
500
        Set the program name to use when printing a BFD error.  This
501
        is printed before the error message followed by a colon and
502
        space.  The string must not be changed after it is passed to
503
        this function.
504
*/
505
 
506
void
507
bfd_set_error_program_name (name)
508
     const char *name;
509
{
510
  _bfd_error_program_name = name;
511
}
512
 
513
 
514
/*
515
FUNCTION
516
        bfd_get_error_handler
517
 
518
SYNOPSIS
519
        bfd_error_handler_type bfd_get_error_handler (void);
520
 
521
DESCRIPTION
522
        Return the BFD error handler function.
523
*/
524
 
525
bfd_error_handler_type
526
bfd_get_error_handler ()
527
{
528
  return _bfd_error_handler;
529
}
530
 
531
/*
532
SECTION
533
        Symbols
534
*/
535
 
536
/*
537
FUNCTION
538
        bfd_get_reloc_upper_bound
539
 
540
SYNOPSIS
541
        long bfd_get_reloc_upper_bound(bfd *abfd, asection *sect);
542
 
543
DESCRIPTION
544
        Return the number of bytes required to store the
545
        relocation information associated with section @var{sect}
546
        attached to bfd @var{abfd}.  If an error occurs, return -1.
547
 
548
*/
549
 
550
 
551
long
552
bfd_get_reloc_upper_bound (abfd, asect)
553
     bfd *abfd;
554
     sec_ptr asect;
555
{
556
  if (abfd->format != bfd_object) {
557
    bfd_set_error (bfd_error_invalid_operation);
558
    return -1;
559
  }
560
 
561
  return BFD_SEND (abfd, _get_reloc_upper_bound, (abfd, asect));
562
}
563
 
564
/*
565
FUNCTION
566
        bfd_canonicalize_reloc
567
 
568
SYNOPSIS
569
        long bfd_canonicalize_reloc
570
                (bfd *abfd,
571
                asection *sec,
572
                arelent **loc,
573
                asymbol **syms);
574
 
575
DESCRIPTION
576
        Call the back end associated with the open BFD
577
        @var{abfd} and translate the external form of the relocation
578
        information attached to @var{sec} into the internal canonical
579
        form.  Place the table into memory at @var{loc}, which has
580
        been preallocated, usually by a call to
581
        <<bfd_get_reloc_upper_bound>>.  Returns the number of relocs, or
582
        -1 on error.
583
 
584
        The @var{syms} table is also needed for horrible internal magic
585
        reasons.
586
 
587
 
588
*/
589
long
590
bfd_canonicalize_reloc (abfd, asect, location, symbols)
591
     bfd *abfd;
592
     sec_ptr asect;
593
     arelent **location;
594
     asymbol **symbols;
595
{
596
  if (abfd->format != bfd_object) {
597
    bfd_set_error (bfd_error_invalid_operation);
598
    return -1;
599
  }
600
  return BFD_SEND (abfd, _bfd_canonicalize_reloc,
601
                   (abfd, asect, location, symbols));
602
}
603
 
604
/*
605
FUNCTION
606
        bfd_set_reloc
607
 
608
SYNOPSIS
609
        void bfd_set_reloc
610
          (bfd *abfd, asection *sec, arelent **rel, unsigned int count)
611
 
612
DESCRIPTION
613
        Set the relocation pointer and count within
614
        section @var{sec} to the values @var{rel} and @var{count}.
615
        The argument @var{abfd} is ignored.
616
 
617
*/
618
/*ARGSUSED*/
619
void
620
bfd_set_reloc (ignore_abfd, asect, location, count)
621
     bfd *ignore_abfd ATTRIBUTE_UNUSED;
622
     sec_ptr asect;
623
     arelent **location;
624
     unsigned int count;
625
{
626
  asect->orelocation = location;
627
  asect->reloc_count = count;
628
}
629
 
630
/*
631
FUNCTION
632
        bfd_set_file_flags
633
 
634
SYNOPSIS
635
        boolean bfd_set_file_flags(bfd *abfd, flagword flags);
636
 
637
DESCRIPTION
638
        Set the flag word in the BFD @var{abfd} to the value @var{flags}.
639
 
640
        Possible errors are:
641
        o <<bfd_error_wrong_format>> - The target bfd was not of object format.
642
        o <<bfd_error_invalid_operation>> - The target bfd was open for reading.
643
        o <<bfd_error_invalid_operation>> -
644
        The flag word contained a bit which was not applicable to the
645
        type of file.  E.g., an attempt was made to set the <<D_PAGED>> bit
646
        on a BFD format which does not support demand paging.
647
 
648
*/
649
 
650
boolean
651
bfd_set_file_flags (abfd, flags)
652
     bfd *abfd;
653
     flagword flags;
654
{
655
  if (abfd->format != bfd_object) {
656
    bfd_set_error (bfd_error_wrong_format);
657
    return false;
658
  }
659
 
660
  if (bfd_read_p (abfd)) {
661
    bfd_set_error (bfd_error_invalid_operation);
662
    return false;
663
  }
664
 
665
  bfd_get_file_flags (abfd) = flags;
666
  if ((flags & bfd_applicable_file_flags (abfd)) != flags) {
667
    bfd_set_error (bfd_error_invalid_operation);
668
    return false;
669
  }
670
 
671
return true;
672
}
673
 
674
void
675
bfd_assert (file, line)
676
     const char *file;
677
     int line;
678
{
679
  (*_bfd_error_handler) (_("bfd assertion fail %s:%d"), file, line);
680
}
681
 
682
/* A more or less friendly abort message.  In libbfd.h abort is
683
   defined to call this function.  */
684
 
685
#ifndef EXIT_FAILURE
686
#define EXIT_FAILURE 1
687
#endif
688
 
689
void
690
_bfd_abort (file, line, fn)
691
     const char *file;
692
     int line;
693
     const char *fn;
694
{
695
  if (fn != NULL)
696
    (*_bfd_error_handler)
697
      (_("BFD internal error, aborting at %s line %d in %s\n"),
698
       file, line, fn);
699
  else
700
    (*_bfd_error_handler)
701
      (_("BFD internal error, aborting at %s line %d\n"),
702
       file, line);
703
  (*_bfd_error_handler) (_("Please report this bug.\n"));
704
  xexit (EXIT_FAILURE);
705
}
706
 
707
/*
708
FUNCTION
709
        bfd_set_start_address
710
 
711
SYNOPSIS
712
        boolean bfd_set_start_address(bfd *abfd, bfd_vma vma);
713
 
714
DESCRIPTION
715
        Make @var{vma} the entry point of output BFD @var{abfd}.
716
 
717
RETURNS
718
        Returns <<true>> on success, <<false>> otherwise.
719
*/
720
 
721
boolean
722
bfd_set_start_address(abfd, vma)
723
bfd *abfd;
724
bfd_vma vma;
725
{
726
  abfd->start_address = vma;
727
  return true;
728
}
729
 
730
 
731
/*
732
FUNCTION
733
        bfd_get_mtime
734
 
735
SYNOPSIS
736
        long bfd_get_mtime(bfd *abfd);
737
 
738
DESCRIPTION
739
        Return the file modification time (as read from the file system, or
740
        from the archive header for archive members).
741
 
742
*/
743
 
744
long
745
bfd_get_mtime (abfd)
746
     bfd *abfd;
747
{
748
  FILE *fp;
749
  struct stat buf;
750
 
751
  if (abfd->mtime_set)
752
    return abfd->mtime;
753
 
754
  fp = bfd_cache_lookup (abfd);
755
  if (0 != fstat (fileno (fp), &buf))
756
    return 0;
757
 
758
  abfd->mtime = buf.st_mtime;           /* Save value in case anyone wants it */
759
  return buf.st_mtime;
760
}
761
 
762
/*
763
FUNCTION
764
        bfd_get_size
765
 
766
SYNOPSIS
767
        long bfd_get_size(bfd *abfd);
768
 
769
DESCRIPTION
770
        Return the file size (as read from file system) for the file
771
        associated with BFD @var{abfd}.
772
 
773
        The initial motivation for, and use of, this routine is not
774
        so we can get the exact size of the object the BFD applies to, since
775
        that might not be generally possible (archive members for example).
776
        It would be ideal if someone could eventually modify
777
        it so that such results were guaranteed.
778
 
779
        Instead, we want to ask questions like "is this NNN byte sized
780
        object I'm about to try read from file offset YYY reasonable?"
781
        As as example of where we might do this, some object formats
782
        use string tables for which the first <<sizeof(long)>> bytes of the
783
        table contain the size of the table itself, including the size bytes.
784
        If an application tries to read what it thinks is one of these
785
        string tables, without some way to validate the size, and for
786
        some reason the size is wrong (byte swapping error, wrong location
787
        for the string table, etc.), the only clue is likely to be a read
788
        error when it tries to read the table, or a "virtual memory
789
        exhausted" error when it tries to allocate 15 bazillon bytes
790
        of space for the 15 bazillon byte table it is about to read.
791
        This function at least allows us to answer the quesion, "is the
792
        size reasonable?".
793
*/
794
 
795
long
796
bfd_get_size (abfd)
797
     bfd *abfd;
798
{
799
  FILE *fp;
800
  struct stat buf;
801
 
802
  if ((abfd->flags & BFD_IN_MEMORY) != 0)
803
    return ((struct bfd_in_memory *) abfd->iostream)->size;
804
 
805
  fp = bfd_cache_lookup (abfd);
806
  if (0 != fstat (fileno (fp), &buf))
807
    return 0;
808
 
809
  return buf.st_size;
810
}
811
 
812
/*
813
FUNCTION
814
        bfd_get_gp_size
815
 
816
SYNOPSIS
817
        int bfd_get_gp_size(bfd *abfd);
818
 
819
DESCRIPTION
820
        Return the maximum size of objects to be optimized using the GP
821
        register under MIPS ECOFF.  This is typically set by the <<-G>>
822
        argument to the compiler, assembler or linker.
823
*/
824
 
825
int
826
bfd_get_gp_size (abfd)
827
     bfd *abfd;
828
{
829
  if (abfd->format == bfd_object)
830
    {
831
      if (abfd->xvec->flavour == bfd_target_ecoff_flavour)
832
        return ecoff_data (abfd)->gp_size;
833
      else if (abfd->xvec->flavour == bfd_target_elf_flavour)
834
        return elf_gp_size (abfd);
835
    }
836
  return 0;
837
}
838
 
839
/*
840
FUNCTION
841
        bfd_set_gp_size
842
 
843
SYNOPSIS
844
        void bfd_set_gp_size(bfd *abfd, int i);
845
 
846
DESCRIPTION
847
        Set the maximum size of objects to be optimized using the GP
848
        register under ECOFF or MIPS ELF.  This is typically set by
849
        the <<-G>> argument to the compiler, assembler or linker.
850
*/
851
 
852
void
853
bfd_set_gp_size (abfd, i)
854
     bfd *abfd;
855
     int i;
856
{
857
  /* Don't try to set GP size on an archive or core file! */
858
  if (abfd->format != bfd_object)
859
    return;
860
  if (abfd->xvec->flavour == bfd_target_ecoff_flavour)
861
    ecoff_data (abfd)->gp_size = i;
862
  else if (abfd->xvec->flavour == bfd_target_elf_flavour)
863
    elf_gp_size (abfd) = i;
864
}
865
 
866
/* Get the GP value.  This is an internal function used by some of the
867
   relocation special_function routines on targets which support a GP
868
   register.  */
869
 
870
bfd_vma
871
_bfd_get_gp_value (abfd)
872
     bfd *abfd;
873
{
874
  if (abfd->format == bfd_object)
875
    {
876
      if (abfd->xvec->flavour == bfd_target_ecoff_flavour)
877
        return ecoff_data (abfd)->gp;
878
      else if (abfd->xvec->flavour == bfd_target_elf_flavour)
879
        return elf_gp (abfd);
880
    }
881
  return 0;
882
}
883
 
884
/* Set the GP value.  */
885
 
886
void
887
_bfd_set_gp_value (abfd, v)
888
     bfd *abfd;
889
     bfd_vma v;
890
{
891
  if (abfd->format != bfd_object)
892
    return;
893
  if (abfd->xvec->flavour == bfd_target_ecoff_flavour)
894
    ecoff_data (abfd)->gp = v;
895
  else if (abfd->xvec->flavour == bfd_target_elf_flavour)
896
    elf_gp (abfd) = v;
897
}
898
 
899
/*
900
FUNCTION
901
        bfd_scan_vma
902
 
903
SYNOPSIS
904
        bfd_vma bfd_scan_vma(CONST char *string, CONST char **end, int base);
905
 
906
DESCRIPTION
907
        Convert, like <<strtoul>>, a numerical expression
908
        @var{string} into a <<bfd_vma>> integer, and return that integer.
909
        (Though without as many bells and whistles as <<strtoul>>.)
910
        The expression is assumed to be unsigned (i.e., positive).
911
        If given a @var{base}, it is used as the base for conversion.
912
        A base of 0 causes the function to interpret the string
913
        in hex if a leading "0x" or "0X" is found, otherwise
914
        in octal if a leading zero is found, otherwise in decimal.
915
 
916
        Overflow is not detected.
917
*/
918
 
919
bfd_vma
920
bfd_scan_vma (string, end, base)
921
     CONST char *string;
922
     CONST char **end;
923
     int base;
924
{
925
  bfd_vma value;
926
  int digit;
927
 
928
  /* Let the host do it if possible.  */
929
  if (sizeof(bfd_vma) <= sizeof(unsigned long))
930
    return (bfd_vma) strtoul (string, (char **) end, base);
931
 
932
  /* A negative base makes no sense, and we only need to go as high as hex.  */
933
  if ((base < 0) || (base > 16))
934
    return (bfd_vma) 0;
935
 
936
  if (base == 0)
937
    {
938
      if (string[0] == '0')
939
        {
940
          if ((string[1] == 'x') || (string[1] == 'X'))
941
            base = 16;
942
          /* XXX should we also allow "0b" or "0B" to set base to 2? */
943
          else
944
            base = 8;
945
        }
946
      else
947
        base = 10;
948
    }
949
  if ((base == 16) &&
950
      (string[0] == '0') && ((string[1] == 'x') || (string[1] == 'X')))
951
    string += 2;
952
  /* XXX should we also skip over "0b" or "0B" if base is 2? */
953
 
954
/* Speed could be improved with a table like hex_value[] in gas.  */
955
#define HEX_VALUE(c) \
956
  (isxdigit ((unsigned char) c)                                 \
957
   ? (isdigit ((unsigned char) c)                               \
958
      ? (c - '0')                                               \
959
      : (10 + c - (islower ((unsigned char) c) ? 'a' : 'A')))   \
960
   : 42)
961
 
962
  for (value = 0; (digit = HEX_VALUE(*string)) < base; string++)
963
    {
964
      value = value * base + digit;
965
    }
966
 
967
  if (end)
968
    *end = string;
969
 
970
  return value;
971
}
972
 
973
/*
974
FUNCTION
975
        bfd_copy_private_bfd_data
976
 
977
SYNOPSIS
978
        boolean bfd_copy_private_bfd_data(bfd *ibfd, bfd *obfd);
979
 
980
DESCRIPTION
981
        Copy private BFD information from the BFD @var{ibfd} to the
982
        the BFD @var{obfd}.  Return <<true>> on success, <<false>> on error.
983
        Possible error returns are:
984
 
985
        o <<bfd_error_no_memory>> -
986
        Not enough memory exists to create private data for @var{obfd}.
987
 
988
.#define bfd_copy_private_bfd_data(ibfd, obfd) \
989
.     BFD_SEND (obfd, _bfd_copy_private_bfd_data, \
990
.               (ibfd, obfd))
991
 
992
*/
993
 
994
/*
995
FUNCTION
996
        bfd_merge_private_bfd_data
997
 
998
SYNOPSIS
999
        boolean bfd_merge_private_bfd_data(bfd *ibfd, bfd *obfd);
1000
 
1001
DESCRIPTION
1002
        Merge private BFD information from the BFD @var{ibfd} to the
1003
        the output file BFD @var{obfd} when linking.  Return <<true>>
1004
        on success, <<false>> on error.  Possible error returns are:
1005
 
1006
        o <<bfd_error_no_memory>> -
1007
        Not enough memory exists to create private data for @var{obfd}.
1008
 
1009
.#define bfd_merge_private_bfd_data(ibfd, obfd) \
1010
.     BFD_SEND (obfd, _bfd_merge_private_bfd_data, \
1011
.               (ibfd, obfd))
1012
 
1013
*/
1014
 
1015
/*
1016
FUNCTION
1017
        bfd_set_private_flags
1018
 
1019
SYNOPSIS
1020
        boolean bfd_set_private_flags(bfd *abfd, flagword flags);
1021
 
1022
DESCRIPTION
1023
        Set private BFD flag information in the BFD @var{abfd}.
1024
        Return <<true>> on success, <<false>> on error.  Possible error
1025
        returns are:
1026
 
1027
        o <<bfd_error_no_memory>> -
1028
        Not enough memory exists to create private data for @var{obfd}.
1029
 
1030
.#define bfd_set_private_flags(abfd, flags) \
1031
.     BFD_SEND (abfd, _bfd_set_private_flags, \
1032
.               (abfd, flags))
1033
 
1034
*/
1035
 
1036
/*
1037
FUNCTION
1038
        stuff
1039
 
1040
DESCRIPTION
1041
        Stuff which should be documented:
1042
 
1043
.#define bfd_sizeof_headers(abfd, reloc) \
1044
.     BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, reloc))
1045
.
1046
.#define bfd_find_nearest_line(abfd, sec, syms, off, file, func, line) \
1047
.     BFD_SEND (abfd, _bfd_find_nearest_line,  (abfd, sec, syms, off, file, func, line))
1048
.
1049
.       {* Do these three do anything useful at all, for any back end?  *}
1050
.#define bfd_debug_info_start(abfd) \
1051
.        BFD_SEND (abfd, _bfd_debug_info_start, (abfd))
1052
.
1053
.#define bfd_debug_info_end(abfd) \
1054
.        BFD_SEND (abfd, _bfd_debug_info_end, (abfd))
1055
.
1056
.#define bfd_debug_info_accumulate(abfd, section) \
1057
.        BFD_SEND (abfd, _bfd_debug_info_accumulate, (abfd, section))
1058
.
1059
.
1060
.#define bfd_stat_arch_elt(abfd, stat) \
1061
.        BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat))
1062
.
1063
.#define bfd_update_armap_timestamp(abfd) \
1064
.        BFD_SEND (abfd, _bfd_update_armap_timestamp, (abfd))
1065
.
1066
.#define bfd_set_arch_mach(abfd, arch, mach)\
1067
.        BFD_SEND ( abfd, _bfd_set_arch_mach, (abfd, arch, mach))
1068
.
1069
.#define bfd_relax_section(abfd, section, link_info, again) \
1070
.       BFD_SEND (abfd, _bfd_relax_section, (abfd, section, link_info, again))
1071
.
1072
.#define bfd_gc_sections(abfd, link_info) \
1073
.       BFD_SEND (abfd, _bfd_gc_sections, (abfd, link_info))
1074
.
1075
.#define bfd_link_hash_table_create(abfd) \
1076
.       BFD_SEND (abfd, _bfd_link_hash_table_create, (abfd))
1077
.
1078
.#define bfd_link_add_symbols(abfd, info) \
1079
.       BFD_SEND (abfd, _bfd_link_add_symbols, (abfd, info))
1080
.
1081
.#define bfd_final_link(abfd, info) \
1082
.       BFD_SEND (abfd, _bfd_final_link, (abfd, info))
1083
.
1084
.#define bfd_free_cached_info(abfd) \
1085
.       BFD_SEND (abfd, _bfd_free_cached_info, (abfd))
1086
.
1087
.#define bfd_get_dynamic_symtab_upper_bound(abfd) \
1088
.       BFD_SEND (abfd, _bfd_get_dynamic_symtab_upper_bound, (abfd))
1089
.
1090
.#define bfd_print_private_bfd_data(abfd, file)\
1091
.       BFD_SEND (abfd, _bfd_print_private_bfd_data, (abfd, file))
1092
.
1093
.#define bfd_canonicalize_dynamic_symtab(abfd, asymbols) \
1094
.       BFD_SEND (abfd, _bfd_canonicalize_dynamic_symtab, (abfd, asymbols))
1095
.
1096
.#define bfd_get_dynamic_reloc_upper_bound(abfd) \
1097
.       BFD_SEND (abfd, _bfd_get_dynamic_reloc_upper_bound, (abfd))
1098
.
1099
.#define bfd_canonicalize_dynamic_reloc(abfd, arels, asyms) \
1100
.       BFD_SEND (abfd, _bfd_canonicalize_dynamic_reloc, (abfd, arels, asyms))
1101
.
1102
.extern bfd_byte *bfd_get_relocated_section_contents
1103
.       PARAMS ((bfd *, struct bfd_link_info *,
1104
.                 struct bfd_link_order *, bfd_byte *,
1105
.                 boolean, asymbol **));
1106
.
1107
 
1108
*/
1109
 
1110
bfd_byte *
1111
bfd_get_relocated_section_contents (abfd, link_info, link_order, data,
1112
                                    relocateable, symbols)
1113
     bfd *abfd;
1114
     struct bfd_link_info *link_info;
1115
     struct bfd_link_order *link_order;
1116
     bfd_byte *data;
1117
     boolean relocateable;
1118
     asymbol **symbols;
1119
{
1120
  bfd *abfd2;
1121
  bfd_byte *(*fn) PARAMS ((bfd *, struct bfd_link_info *,
1122
                           struct bfd_link_order *, bfd_byte *, boolean,
1123
                           asymbol **));
1124
 
1125
  if (link_order->type == bfd_indirect_link_order)
1126
    {
1127
      abfd2 = link_order->u.indirect.section->owner;
1128
      if (abfd2 == 0)
1129
        abfd2 = abfd;
1130
    }
1131
  else
1132
    abfd2 = abfd;
1133
  fn = abfd2->xvec->_bfd_get_relocated_section_contents;
1134
 
1135
  return (*fn) (abfd, link_info, link_order, data, relocateable, symbols);
1136
}
1137
 
1138
/* Record information about an ELF program header.  */
1139
 
1140
boolean
1141
bfd_record_phdr (abfd, type, flags_valid, flags, at_valid, at,
1142
                 includes_filehdr, includes_phdrs, count, secs)
1143
     bfd *abfd;
1144
     unsigned long type;
1145
     boolean flags_valid;
1146
     flagword flags;
1147
     boolean at_valid;
1148
     bfd_vma at;
1149
     boolean includes_filehdr;
1150
     boolean includes_phdrs;
1151
     unsigned int count;
1152
     asection **secs;
1153
{
1154
  struct elf_segment_map *m, **pm;
1155
 
1156
  if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
1157
    return true;
1158
 
1159
  m = ((struct elf_segment_map *)
1160
       bfd_alloc (abfd,
1161
                  (sizeof (struct elf_segment_map)
1162
                   + ((size_t) count - 1) * sizeof (asection *))));
1163
  if (m == NULL)
1164
    return false;
1165
 
1166
  m->next = NULL;
1167
  m->p_type = type;
1168
  m->p_flags = flags;
1169
  m->p_paddr = at;
1170
  m->p_flags_valid = flags_valid;
1171
  m->p_paddr_valid = at_valid;
1172
  m->includes_filehdr = includes_filehdr;
1173
  m->includes_phdrs = includes_phdrs;
1174
  m->count = count;
1175
  if (count > 0)
1176
    memcpy (m->sections, secs, count * sizeof (asection *));
1177
 
1178
  for (pm = &elf_tdata (abfd)->segment_map; *pm != NULL; pm = &(*pm)->next)
1179
    ;
1180
  *pm = m;
1181
 
1182
  return true;
1183
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.