~ubuntu-branches/ubuntu/quantal/gclcvs/quantal

« back to all changes in this revision

Viewing changes to binutils/bfd/libbfd.c

  • Committer: Bazaar Package Importer
  • Author(s): Camm Maguire
  • Date: 2004-06-24 15:13:46 UTC
  • Revision ID: james.westby@ubuntu.com-20040624151346-xh0xaaktyyp7aorc
Tags: 2.7.0-26
C_GC_OFFSET is 2 on m68k-linux

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Assorted BFD support routines, only used internally.
 
2
   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
 
3
   2000, 2001, 2002
 
4
   Free Software Foundation, Inc.
 
5
   Written by Cygnus Support.
 
6
 
 
7
   This file is part of BFD, the Binary File Descriptor library.
 
8
 
 
9
   This program is free software; you can redistribute it and/or modify
 
10
   it under the terms of the GNU General Public License as published by
 
11
   the Free Software Foundation; either version 2 of the License, or
 
12
   (at your option) any later version.
 
13
 
 
14
   This program is distributed in the hope that it will be useful,
 
15
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
16
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
17
   GNU General Public License for more details.
 
18
 
 
19
   You should have received a copy of the GNU General Public License
 
20
   along with this program; if not, write to the Free Software
 
21
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
22
 
 
23
#include "bfd.h"
 
24
#include "sysdep.h"
 
25
#include "libbfd.h"
 
26
 
 
27
#ifndef HAVE_GETPAGESIZE
 
28
#define getpagesize() 2048
 
29
#endif
 
30
 
 
31
static size_t real_read PARAMS ((PTR, size_t, size_t, FILE *));
 
32
 
 
33
/*
 
34
SECTION
 
35
        Internal functions
 
36
 
 
37
DESCRIPTION
 
38
        These routines are used within BFD.
 
39
        They are not intended for export, but are documented here for
 
40
        completeness.
 
41
*/
 
42
 
 
43
/* A routine which is used in target vectors for unsupported
 
44
   operations.  */
 
45
 
 
46
boolean
 
47
bfd_false (ignore)
 
48
     bfd *ignore ATTRIBUTE_UNUSED;
 
49
{
 
50
  bfd_set_error (bfd_error_invalid_operation);
 
51
  return false;
 
52
}
 
53
 
 
54
/* A routine which is used in target vectors for supported operations
 
55
   which do not actually do anything.  */
 
56
 
 
57
boolean
 
58
bfd_true (ignore)
 
59
     bfd *ignore ATTRIBUTE_UNUSED;
 
60
{
 
61
  return true;
 
62
}
 
63
 
 
64
/* A routine which is used in target vectors for unsupported
 
65
   operations which return a pointer value.  */
 
66
 
 
67
PTR
 
68
bfd_nullvoidptr (ignore)
 
69
     bfd *ignore ATTRIBUTE_UNUSED;
 
70
{
 
71
  bfd_set_error (bfd_error_invalid_operation);
 
72
  return NULL;
 
73
}
 
74
 
 
75
int
 
76
bfd_0 (ignore)
 
77
     bfd *ignore ATTRIBUTE_UNUSED;
 
78
{
 
79
  return 0;
 
80
}
 
81
 
 
82
unsigned int
 
83
bfd_0u (ignore)
 
84
     bfd *ignore ATTRIBUTE_UNUSED;
 
85
{
 
86
   return 0;
 
87
}
 
88
 
 
89
long
 
90
bfd_0l (ignore)
 
91
     bfd *ignore ATTRIBUTE_UNUSED;
 
92
{
 
93
  return 0;
 
94
}
 
95
 
 
96
/* A routine which is used in target vectors for unsupported
 
97
   operations which return -1 on error.  */
 
98
 
 
99
long
 
100
_bfd_n1 (ignore_abfd)
 
101
     bfd *ignore_abfd ATTRIBUTE_UNUSED;
 
102
{
 
103
  bfd_set_error (bfd_error_invalid_operation);
 
104
  return -1;
 
105
}
 
106
 
 
107
void
 
108
bfd_void (ignore)
 
109
     bfd *ignore ATTRIBUTE_UNUSED;
 
110
{
 
111
}
 
112
 
 
113
boolean
 
114
_bfd_nocore_core_file_matches_executable_p (ignore_core_bfd, ignore_exec_bfd)
 
115
     bfd *ignore_core_bfd ATTRIBUTE_UNUSED;
 
116
     bfd *ignore_exec_bfd ATTRIBUTE_UNUSED;
 
117
{
 
118
  bfd_set_error (bfd_error_invalid_operation);
 
119
  return false;
 
120
}
 
121
 
 
122
/* Routine to handle core_file_failing_command entry point for targets
 
123
   without core file support.  */
 
124
 
 
125
char *
 
126
_bfd_nocore_core_file_failing_command (ignore_abfd)
 
127
     bfd *ignore_abfd ATTRIBUTE_UNUSED;
 
128
{
 
129
  bfd_set_error (bfd_error_invalid_operation);
 
130
  return (char *)NULL;
 
131
}
 
132
 
 
133
/* Routine to handle core_file_failing_signal entry point for targets
 
134
   without core file support.  */
 
135
 
 
136
int
 
137
_bfd_nocore_core_file_failing_signal (ignore_abfd)
 
138
     bfd *ignore_abfd ATTRIBUTE_UNUSED;
 
139
{
 
140
  bfd_set_error (bfd_error_invalid_operation);
 
141
  return 0;
 
142
}
 
143
 
 
144
const bfd_target *
 
145
_bfd_dummy_target (ignore_abfd)
 
146
     bfd *ignore_abfd ATTRIBUTE_UNUSED;
 
147
{
 
148
  bfd_set_error (bfd_error_wrong_format);
 
149
  return 0;
 
150
}
 
151
 
 
152
/* Allocate memory using malloc.  */
 
153
 
 
154
PTR
 
155
bfd_malloc (size)
 
156
     bfd_size_type size;
 
157
{
 
158
  PTR ptr;
 
159
 
 
160
  if (size != (size_t) size)
 
161
    {
 
162
      bfd_set_error (bfd_error_no_memory);
 
163
      return NULL;
 
164
    }
 
165
 
 
166
  ptr = (PTR) malloc ((size_t) size);
 
167
  if (ptr == NULL && (size_t) size != 0)
 
168
    bfd_set_error (bfd_error_no_memory);
 
169
 
 
170
  return ptr;
 
171
}
 
172
 
 
173
/* Reallocate memory using realloc.  */
 
174
 
 
175
PTR
 
176
bfd_realloc (ptr, size)
 
177
     PTR ptr;
 
178
     bfd_size_type size;
 
179
{
 
180
  PTR ret;
 
181
 
 
182
  if (size != (size_t) size)
 
183
    {
 
184
      bfd_set_error (bfd_error_no_memory);
 
185
      return NULL;
 
186
    }
 
187
 
 
188
  if (ptr == NULL)
 
189
    ret = malloc ((size_t) size);
 
190
  else
 
191
    ret = realloc (ptr, (size_t) size);
 
192
 
 
193
  if (ret == NULL && (size_t) size != 0)
 
194
    bfd_set_error (bfd_error_no_memory);
 
195
 
 
196
  return ret;
 
197
}
 
198
 
 
199
/* Allocate memory using malloc and clear it.  */
 
200
 
 
201
PTR
 
202
bfd_zmalloc (size)
 
203
     bfd_size_type size;
 
204
{
 
205
  PTR ptr;
 
206
 
 
207
  if (size != (size_t) size)
 
208
    {
 
209
      bfd_set_error (bfd_error_no_memory);
 
210
      return NULL;
 
211
    }
 
212
 
 
213
  ptr = (PTR) malloc ((size_t) size);
 
214
 
 
215
  if ((size_t) size != 0)
 
216
    {
 
217
      if (ptr == NULL)
 
218
        bfd_set_error (bfd_error_no_memory);
 
219
      else
 
220
        memset (ptr, 0, (size_t) size);
 
221
    }
 
222
 
 
223
  return ptr;
 
224
}
 
225
 
 
226
/* Some IO code */
 
227
 
 
228
/* Note that archive entries don't have streams; they share their parent's.
 
229
   This allows someone to play with the iostream behind BFD's back.
 
230
 
 
231
   Also, note that the origin pointer points to the beginning of a file's
 
232
   contents (0 for non-archive elements).  For archive entries this is the
 
233
   first octet in the file, NOT the beginning of the archive header.  */
 
234
 
 
235
static size_t
 
236
real_read (where, a, b, file)
 
237
     PTR where;
 
238
     size_t a;
 
239
     size_t b;
 
240
     FILE *file;
 
241
{
 
242
  /* FIXME - this looks like an optimization, but it's really to cover
 
243
     up for a feature of some OSs (not solaris - sigh) that
 
244
     ld/pe-dll.c takes advantage of (apparently) when it creates BFDs
 
245
     internally and tries to link against them.  BFD seems to be smart
 
246
     enough to realize there are no symbol records in the "file" that
 
247
     doesn't exist but attempts to read them anyway.  On Solaris,
 
248
     attempting to read zero bytes from a NULL file results in a core
 
249
     dump, but on other platforms it just returns zero bytes read.
 
250
     This makes it to something reasonable. - DJ */
 
251
  if (a == 0 || b == 0)
 
252
    return 0;
 
253
 
 
254
 
 
255
#if defined (__VAX) && defined (VMS)
 
256
  /* Apparently fread on Vax VMS does not keep the record length
 
257
     information.  */
 
258
  return read (fileno (file), where, a * b);
 
259
#else
 
260
  return fread (where, a, b, file);
 
261
#endif
 
262
}
 
263
 
 
264
/* Return value is amount read.  */
 
265
 
 
266
bfd_size_type
 
267
bfd_bread (ptr, size, abfd)
 
268
     PTR ptr;
 
269
     bfd_size_type size;
 
270
     bfd *abfd;
 
271
{
 
272
  size_t nread;
 
273
 
 
274
  if ((abfd->flags & BFD_IN_MEMORY) != 0)
 
275
    {
 
276
      struct bfd_in_memory *bim;
 
277
      bfd_size_type get;
 
278
 
 
279
      bim = (struct bfd_in_memory *) abfd->iostream;
 
280
      get = size;
 
281
      if (abfd->where + get > bim->size)
 
282
        {
 
283
          if (bim->size < (bfd_size_type) abfd->where)
 
284
            get = 0;
 
285
          else
 
286
            get = bim->size - abfd->where;
 
287
          bfd_set_error (bfd_error_file_truncated);
 
288
        }
 
289
      memcpy (ptr, bim->buffer + abfd->where, (size_t) get);
 
290
      abfd->where += get;
 
291
      return get;
 
292
    }
 
293
 
 
294
  nread = real_read (ptr, 1, (size_t) size, bfd_cache_lookup (abfd));
 
295
  if (nread != (size_t) -1)
 
296
    abfd->where += nread;
 
297
 
 
298
  /* Set bfd_error if we did not read as much data as we expected.
 
299
 
 
300
     If the read failed due to an error set the bfd_error_system_call,
 
301
     else set bfd_error_file_truncated.
 
302
 
 
303
     A BFD backend may wish to override bfd_error_file_truncated to
 
304
     provide something more useful (eg. no_symbols or wrong_format).  */
 
305
  if (nread != size)
 
306
    {
 
307
      if (ferror (bfd_cache_lookup (abfd)))
 
308
        bfd_set_error (bfd_error_system_call);
 
309
      else
 
310
        bfd_set_error (bfd_error_file_truncated);
 
311
    }
 
312
 
 
313
  return nread;
 
314
}
 
315
 
 
316
/* The window support stuff should probably be broken out into
 
317
   another file....  */
 
318
/* The idea behind the next and refcount fields is that one mapped
 
319
   region can suffice for multiple read-only windows or multiple
 
320
   non-overlapping read-write windows.  It's not implemented yet
 
321
   though.  */
 
322
struct _bfd_window_internal {
 
323
  struct _bfd_window_internal *next;
 
324
  PTR data;
 
325
  bfd_size_type size;
 
326
  int refcount : 31;            /* should be enough...  */
 
327
  unsigned mapped : 1;          /* 1 = mmap, 0 = malloc */
 
328
};
 
329
 
 
330
void
 
331
bfd_init_window (windowp)
 
332
     bfd_window *windowp;
 
333
{
 
334
  windowp->data = 0;
 
335
  windowp->i = 0;
 
336
  windowp->size = 0;
 
337
}
 
338
 
 
339
/* Currently, if USE_MMAP is undefined, none if the window stuff is
 
340
   used.  Okay, so it's mis-named.  At least the command-line option
 
341
   "--without-mmap" is more obvious than "--without-windows" or some
 
342
   such.  */
 
343
#ifdef USE_MMAP
 
344
 
 
345
#undef HAVE_MPROTECT /* code's not tested yet */
 
346
 
 
347
#if HAVE_MMAP || HAVE_MPROTECT || HAVE_MADVISE
 
348
#include <sys/mman.h>
 
349
#endif
 
350
 
 
351
#ifndef MAP_FILE
 
352
#define MAP_FILE 0
 
353
#endif
 
354
 
 
355
static int debug_windows;
 
356
 
 
357
void
 
358
bfd_free_window (windowp)
 
359
     bfd_window *windowp;
 
360
{
 
361
  bfd_window_internal *i = windowp->i;
 
362
  windowp->i = 0;
 
363
  windowp->data = 0;
 
364
  if (i == 0)
 
365
    return;
 
366
  i->refcount--;
 
367
  if (debug_windows)
 
368
    fprintf (stderr, "freeing window @%p<%p,%lx,%p>\n",
 
369
             windowp, windowp->data, windowp->size, windowp->i);
 
370
  if (i->refcount != 0)
 
371
    return;
 
372
 
 
373
  if (i->mapped)
 
374
    {
 
375
#ifdef HAVE_MMAP
 
376
      munmap (i->data, i->size);
 
377
      goto no_free;
 
378
#else
 
379
      abort ();
 
380
#endif
 
381
    }
 
382
#ifdef HAVE_MPROTECT
 
383
  mprotect (i->data, i->size, PROT_READ | PROT_WRITE);
 
384
#endif
 
385
  free (i->data);
 
386
#ifdef HAVE_MMAP
 
387
 no_free:
 
388
#endif
 
389
  i->data = 0;
 
390
  /* There should be no more references to i at this point.  */
 
391
  free (i);
 
392
}
 
393
 
 
394
static int ok_to_map = 1;
 
395
 
 
396
boolean
 
397
bfd_get_file_window (abfd, offset, size, windowp, writable)
 
398
     bfd *abfd;
 
399
     file_ptr offset;
 
400
     bfd_size_type size;
 
401
     bfd_window *windowp;
 
402
     boolean writable;
 
403
{
 
404
  static size_t pagesize;
 
405
  bfd_window_internal *i = windowp->i;
 
406
  bfd_size_type size_to_alloc = size;
 
407
 
 
408
  if (debug_windows)
 
409
    fprintf (stderr, "bfd_get_file_window (%p, %6ld, %6ld, %p<%p,%lx,%p>, %d)",
 
410
             abfd, (long) offset, (long) size,
 
411
             windowp, windowp->data, (unsigned long) windowp->size,
 
412
             windowp->i, writable);
 
413
 
 
414
  /* Make sure we know the page size, so we can be friendly to mmap.  */
 
415
  if (pagesize == 0)
 
416
    pagesize = getpagesize ();
 
417
  if (pagesize == 0)
 
418
    abort ();
 
419
 
 
420
  if (i == 0)
 
421
    {
 
422
      i = ((bfd_window_internal *)
 
423
           bfd_zmalloc ((bfd_size_type) sizeof (bfd_window_internal)));
 
424
      windowp->i = i;
 
425
      if (i == 0)
 
426
        return false;
 
427
      i->data = 0;
 
428
    }
 
429
#ifdef HAVE_MMAP
 
430
  if (ok_to_map
 
431
      && (i->data == 0 || i->mapped == 1)
 
432
      && (abfd->flags & BFD_IN_MEMORY) == 0)
 
433
    {
 
434
      file_ptr file_offset, offset2;
 
435
      size_t real_size;
 
436
      int fd;
 
437
      FILE *f;
 
438
 
 
439
      /* Find the real file and the real offset into it.  */
 
440
      while (abfd->my_archive != NULL)
 
441
        {
 
442
          offset += abfd->origin;
 
443
          abfd = abfd->my_archive;
 
444
        }
 
445
      f = bfd_cache_lookup (abfd);
 
446
      fd = fileno (f);
 
447
 
 
448
      /* Compute offsets and size for mmap and for the user's data.  */
 
449
      offset2 = offset % pagesize;
 
450
      if (offset2 < 0)
 
451
        abort ();
 
452
      file_offset = offset - offset2;
 
453
      real_size = offset + size - file_offset;
 
454
      real_size = real_size + pagesize - 1;
 
455
      real_size -= real_size % pagesize;
 
456
 
 
457
      /* If we're re-using a memory region, make sure it's big enough.  */
 
458
      if (i->data && i->size < size)
 
459
        {
 
460
          munmap (i->data, i->size);
 
461
          i->data = 0;
 
462
        }
 
463
      i->data = mmap (i->data, real_size,
 
464
                      writable ? PROT_WRITE | PROT_READ : PROT_READ,
 
465
                      (writable
 
466
                       ? MAP_FILE | MAP_PRIVATE
 
467
                       : MAP_FILE | MAP_SHARED),
 
468
                      fd, file_offset);
 
469
      if (i->data == (PTR) -1)
 
470
        {
 
471
          /* An error happened.  Report it, or try using malloc, or
 
472
             something.  */
 
473
          bfd_set_error (bfd_error_system_call);
 
474
          i->data = 0;
 
475
          windowp->data = 0;
 
476
          if (debug_windows)
 
477
            fprintf (stderr, "\t\tmmap failed!\n");
 
478
          return false;
 
479
        }
 
480
      if (debug_windows)
 
481
        fprintf (stderr, "\n\tmapped %ld at %p, offset is %ld\n",
 
482
                 (long) real_size, i->data, (long) offset2);
 
483
      i->size = real_size;
 
484
      windowp->data = (PTR) ((bfd_byte *) i->data + offset2);
 
485
      windowp->size = size;
 
486
      i->mapped = 1;
 
487
      return true;
 
488
    }
 
489
  else if (debug_windows)
 
490
    {
 
491
      if (ok_to_map)
 
492
        fprintf (stderr, _("not mapping: data=%lx mapped=%d\n"),
 
493
                 (unsigned long) i->data, (int) i->mapped);
 
494
      else
 
495
        fprintf (stderr, _("not mapping: env var not set\n"));
 
496
    }
 
497
#else
 
498
  ok_to_map = 0;
 
499
#endif
 
500
 
 
501
#ifdef HAVE_MPROTECT
 
502
  if (!writable)
 
503
    {
 
504
      size_to_alloc += pagesize - 1;
 
505
      size_to_alloc -= size_to_alloc % pagesize;
 
506
    }
 
507
#endif
 
508
  if (debug_windows)
 
509
    fprintf (stderr, "\n\t%s(%6ld)",
 
510
             i->data ? "realloc" : " malloc", (long) size_to_alloc);
 
511
  i->data = (PTR) bfd_realloc (i->data, size_to_alloc);
 
512
  if (debug_windows)
 
513
    fprintf (stderr, "\t-> %p\n", i->data);
 
514
  i->refcount = 1;
 
515
  if (i->data == NULL)
 
516
    {
 
517
      if (size_to_alloc == 0)
 
518
        return true;
 
519
      return false;
 
520
    }
 
521
  if (bfd_seek (abfd, offset, SEEK_SET) != 0)
 
522
    return false;
 
523
  i->size = bfd_bread (i->data, size, abfd);
 
524
  if (i->size != size)
 
525
    return false;
 
526
  i->mapped = 0;
 
527
#ifdef HAVE_MPROTECT
 
528
  if (!writable)
 
529
    {
 
530
      if (debug_windows)
 
531
        fprintf (stderr, "\tmprotect (%p, %ld, PROT_READ)\n", i->data,
 
532
                 (long) i->size);
 
533
      mprotect (i->data, i->size, PROT_READ);
 
534
    }
 
535
#endif
 
536
  windowp->data = i->data;
 
537
  windowp->size = i->size;
 
538
  return true;
 
539
}
 
540
 
 
541
#endif /* USE_MMAP */
 
542
 
 
543
bfd_size_type
 
544
bfd_bwrite (ptr, size, abfd)
 
545
     const PTR ptr;
 
546
     bfd_size_type size;
 
547
     bfd *abfd;
 
548
{
 
549
  size_t nwrote;
 
550
 
 
551
  if ((abfd->flags & BFD_IN_MEMORY) != 0)
 
552
    {
 
553
      struct bfd_in_memory *bim = (struct bfd_in_memory *) (abfd->iostream);
 
554
      size = (size_t) size;
 
555
      if (abfd->where + size > bim->size)
 
556
        {
 
557
          bfd_size_type newsize, oldsize;
 
558
 
 
559
          oldsize = (bim->size + 127) & ~(bfd_size_type) 127;
 
560
          bim->size = abfd->where + size;
 
561
          /* Round up to cut down on memory fragmentation */
 
562
          newsize = (bim->size + 127) & ~(bfd_size_type) 127;
 
563
          if (newsize > oldsize)
 
564
            {
 
565
              bim->buffer = bfd_realloc (bim->buffer, newsize);
 
566
              if (bim->buffer == 0)
 
567
                {
 
568
                  bim->size = 0;
 
569
                  return 0;
 
570
                }
 
571
            }
 
572
        }
 
573
      memcpy (bim->buffer + abfd->where, ptr, (size_t) size);
 
574
      abfd->where += size;
 
575
      return size;
 
576
    }
 
577
 
 
578
  nwrote = fwrite (ptr, 1, (size_t) size, bfd_cache_lookup (abfd));
 
579
  if (nwrote != (size_t) -1)
 
580
    abfd->where += nwrote;
 
581
  if (nwrote != size)
 
582
    {
 
583
#ifdef ENOSPC
 
584
      errno = ENOSPC;
 
585
#endif
 
586
      bfd_set_error (bfd_error_system_call);
 
587
    }
 
588
  return nwrote;
 
589
}
 
590
 
 
591
/*
 
592
INTERNAL_FUNCTION
 
593
        bfd_write_bigendian_4byte_int
 
594
 
 
595
SYNOPSIS
 
596
        boolean bfd_write_bigendian_4byte_int (bfd *, unsigned int);
 
597
 
 
598
DESCRIPTION
 
599
        Write a 4 byte integer @var{i} to the output BFD @var{abfd}, in big
 
600
        endian order regardless of what else is going on.  This is useful in
 
601
        archives.
 
602
 
 
603
*/
 
604
boolean
 
605
bfd_write_bigendian_4byte_int (abfd, i)
 
606
     bfd *abfd;
 
607
     unsigned int i;
 
608
{
 
609
  bfd_byte buffer[4];
 
610
  bfd_putb32 ((bfd_vma) i, buffer);
 
611
  return bfd_bwrite ((PTR) buffer, (bfd_size_type) 4, abfd) == 4;
 
612
}
 
613
 
 
614
bfd_vma
 
615
bfd_tell (abfd)
 
616
     bfd *abfd;
 
617
{
 
618
  file_ptr ptr;
 
619
 
 
620
  if ((abfd->flags & BFD_IN_MEMORY) != 0)
 
621
    return abfd->where;
 
622
 
 
623
  ptr = ftell (bfd_cache_lookup (abfd));
 
624
 
 
625
  if (abfd->my_archive)
 
626
    ptr -= abfd->origin;
 
627
  abfd->where = ptr;
 
628
  return ptr;
 
629
}
 
630
 
 
631
int
 
632
bfd_flush (abfd)
 
633
     bfd *abfd;
 
634
{
 
635
  if ((abfd->flags & BFD_IN_MEMORY) != 0)
 
636
    return 0;
 
637
  return fflush (bfd_cache_lookup(abfd));
 
638
}
 
639
 
 
640
/* Returns 0 for success, negative value for failure (in which case
 
641
   bfd_get_error can retrieve the error code).  */
 
642
int
 
643
bfd_stat (abfd, statbuf)
 
644
     bfd *abfd;
 
645
     struct stat *statbuf;
 
646
{
 
647
  FILE *f;
 
648
  int result;
 
649
 
 
650
  if ((abfd->flags & BFD_IN_MEMORY) != 0)
 
651
    abort ();
 
652
 
 
653
  f = bfd_cache_lookup (abfd);
 
654
  if (f == NULL)
 
655
    {
 
656
      bfd_set_error (bfd_error_system_call);
 
657
      return -1;
 
658
    }
 
659
  result = fstat (fileno (f), statbuf);
 
660
  if (result < 0)
 
661
    bfd_set_error (bfd_error_system_call);
 
662
  return result;
 
663
}
 
664
 
 
665
/* Returns 0 for success, nonzero for failure (in which case bfd_get_error
 
666
   can retrieve the error code).  */
 
667
 
 
668
int
 
669
bfd_seek (abfd, position, direction)
 
670
     bfd *abfd;
 
671
     file_ptr position;
 
672
     int direction;
 
673
{
 
674
  int result;
 
675
  FILE *f;
 
676
  long file_position;
 
677
  /* For the time being, a BFD may not seek to it's end.  The problem
 
678
     is that we don't easily have a way to recognize the end of an
 
679
     element in an archive.  */
 
680
 
 
681
  BFD_ASSERT (direction == SEEK_SET || direction == SEEK_CUR);
 
682
 
 
683
  if (direction == SEEK_CUR && position == 0)
 
684
    return 0;
 
685
 
 
686
  if ((abfd->flags & BFD_IN_MEMORY) != 0)
 
687
    {
 
688
      struct bfd_in_memory *bim;
 
689
 
 
690
      bim = (struct bfd_in_memory *) abfd->iostream;
 
691
 
 
692
      if (direction == SEEK_SET)
 
693
        abfd->where = position;
 
694
      else
 
695
        abfd->where += position;
 
696
 
 
697
      if (abfd->where > bim->size)
 
698
        {
 
699
          if ((abfd->direction == write_direction) ||
 
700
              (abfd->direction == both_direction))
 
701
            {
 
702
              bfd_size_type newsize, oldsize;
 
703
              oldsize = (bim->size + 127) & ~(bfd_size_type) 127;
 
704
              bim->size = abfd->where;
 
705
              /* Round up to cut down on memory fragmentation */
 
706
              newsize = (bim->size + 127) & ~(bfd_size_type) 127;
 
707
              if (newsize > oldsize)
 
708
                {
 
709
                  bim->buffer = bfd_realloc (bim->buffer, newsize);
 
710
                  if (bim->buffer == 0)
 
711
                    {
 
712
                      bim->size = 0;
 
713
                      return -1;
 
714
                    }
 
715
                }
 
716
            }
 
717
          else
 
718
            {
 
719
              abfd->where = bim->size;
 
720
              bfd_set_error (bfd_error_file_truncated);
 
721
              return -1;
 
722
            }
 
723
        }
 
724
      return 0;
 
725
    }
 
726
 
 
727
  if (abfd->format != bfd_archive && abfd->my_archive == 0)
 
728
    {
 
729
#if 0
 
730
      /* Explanation for this code: I'm only about 95+% sure that the above
 
731
         conditions are sufficient and that all i/o calls are properly
 
732
         adjusting the `where' field.  So this is sort of an `assert'
 
733
         that the `where' field is correct.  If we can go a while without
 
734
         tripping the abort, we can probably safely disable this code,
 
735
         so that the real optimizations happen.  */
 
736
      file_ptr where_am_i_now;
 
737
      where_am_i_now = ftell (bfd_cache_lookup (abfd));
 
738
      if (abfd->my_archive)
 
739
        where_am_i_now -= abfd->origin;
 
740
      if (where_am_i_now != abfd->where)
 
741
        abort ();
 
742
#endif
 
743
      if (direction == SEEK_SET && (bfd_vma) position == abfd->where)
 
744
        return 0;
 
745
    }
 
746
  else
 
747
    {
 
748
      /* We need something smarter to optimize access to archives.
 
749
         Currently, anything inside an archive is read via the file
 
750
         handle for the archive.  Which means that a bfd_seek on one
 
751
         component affects the `current position' in the archive, as
 
752
         well as in any other component.
 
753
 
 
754
         It might be sufficient to put a spike through the cache
 
755
         abstraction, and look to the archive for the file position,
 
756
         but I think we should try for something cleaner.
 
757
 
 
758
         In the meantime, no optimization for archives.  */
 
759
    }
 
760
 
 
761
  f = bfd_cache_lookup (abfd);
 
762
  file_position = position;
 
763
  if (direction == SEEK_SET && abfd->my_archive != NULL)
 
764
    file_position += abfd->origin;
 
765
 
 
766
  result = fseek (f, file_position, direction);
 
767
  if (result != 0)
 
768
    {
 
769
      int hold_errno = errno;
 
770
 
 
771
      /* Force redetermination of `where' field.  */
 
772
      bfd_tell (abfd);
 
773
 
 
774
      /* An EINVAL error probably means that the file offset was
 
775
         absurd.  */
 
776
      if (hold_errno == EINVAL)
 
777
        bfd_set_error (bfd_error_file_truncated);
 
778
      else
 
779
        {
 
780
          bfd_set_error (bfd_error_system_call);
 
781
          errno = hold_errno;
 
782
        }
 
783
    }
 
784
  else
 
785
    {
 
786
      /* Adjust `where' field.  */
 
787
      if (direction == SEEK_SET)
 
788
        abfd->where = position;
 
789
      else
 
790
        abfd->where += position;
 
791
    }
 
792
  return result;
 
793
}
 
794
 
 
795
/** The do-it-yourself (byte) sex-change kit */
 
796
 
 
797
/* The middle letter e.g. get<b>short indicates Big or Little endian
 
798
   target machine.  It doesn't matter what the byte order of the host
 
799
   machine is; these routines work for either.  */
 
800
 
 
801
/* FIXME: Should these take a count argument?
 
802
   Answer (gnu@cygnus.com):  No, but perhaps they should be inline
 
803
                             functions in swap.h #ifdef __GNUC__.
 
804
                             Gprof them later and find out.  */
 
805
 
 
806
/*
 
807
FUNCTION
 
808
        bfd_put_size
 
809
FUNCTION
 
810
        bfd_get_size
 
811
 
 
812
DESCRIPTION
 
813
        These macros as used for reading and writing raw data in
 
814
        sections; each access (except for bytes) is vectored through
 
815
        the target format of the BFD and mangled accordingly. The
 
816
        mangling performs any necessary endian translations and
 
817
        removes alignment restrictions.  Note that types accepted and
 
818
        returned by these macros are identical so they can be swapped
 
819
        around in macros---for example, @file{libaout.h} defines <<GET_WORD>>
 
820
        to either <<bfd_get_32>> or <<bfd_get_64>>.
 
821
 
 
822
        In the put routines, @var{val} must be a <<bfd_vma>>.  If we are on a
 
823
        system without prototypes, the caller is responsible for making
 
824
        sure that is true, with a cast if necessary.  We don't cast
 
825
        them in the macro definitions because that would prevent <<lint>>
 
826
        or <<gcc -Wall>> from detecting sins such as passing a pointer.
 
827
        To detect calling these with less than a <<bfd_vma>>, use
 
828
        <<gcc -Wconversion>> on a host with 64 bit <<bfd_vma>>'s.
 
829
 
 
830
.
 
831
.{* Byte swapping macros for user section data.  *}
 
832
.
 
833
.#define bfd_put_8(abfd, val, ptr) \
 
834
.                ((void) (*((unsigned char *) (ptr)) = (unsigned char) (val)))
 
835
.#define bfd_put_signed_8 \
 
836
.               bfd_put_8
 
837
.#define bfd_get_8(abfd, ptr) \
 
838
.                (*(unsigned char *) (ptr) & 0xff)
 
839
.#define bfd_get_signed_8(abfd, ptr) \
 
840
.               (((*(unsigned char *) (ptr) & 0xff) ^ 0x80) - 0x80)
 
841
.
 
842
.#define bfd_put_16(abfd, val, ptr) \
 
843
.                BFD_SEND(abfd, bfd_putx16, ((val),(ptr)))
 
844
.#define bfd_put_signed_16 \
 
845
.                bfd_put_16
 
846
.#define bfd_get_16(abfd, ptr) \
 
847
.                BFD_SEND(abfd, bfd_getx16, (ptr))
 
848
.#define bfd_get_signed_16(abfd, ptr) \
 
849
.                BFD_SEND (abfd, bfd_getx_signed_16, (ptr))
 
850
.
 
851
.#define bfd_put_32(abfd, val, ptr) \
 
852
.                BFD_SEND(abfd, bfd_putx32, ((val),(ptr)))
 
853
.#define bfd_put_signed_32 \
 
854
.                bfd_put_32
 
855
.#define bfd_get_32(abfd, ptr) \
 
856
.                BFD_SEND(abfd, bfd_getx32, (ptr))
 
857
.#define bfd_get_signed_32(abfd, ptr) \
 
858
.                BFD_SEND(abfd, bfd_getx_signed_32, (ptr))
 
859
.
 
860
.#define bfd_put_64(abfd, val, ptr) \
 
861
.                BFD_SEND(abfd, bfd_putx64, ((val), (ptr)))
 
862
.#define bfd_put_signed_64 \
 
863
.                bfd_put_64
 
864
.#define bfd_get_64(abfd, ptr) \
 
865
.                BFD_SEND(abfd, bfd_getx64, (ptr))
 
866
.#define bfd_get_signed_64(abfd, ptr) \
 
867
.                BFD_SEND(abfd, bfd_getx_signed_64, (ptr))
 
868
.
 
869
.#define bfd_get(bits, abfd, ptr)                               \
 
870
.                ( (bits) ==  8 ? (bfd_vma) bfd_get_8 (abfd, ptr)       \
 
871
.                : (bits) == 16 ? bfd_get_16 (abfd, ptr)        \
 
872
.                : (bits) == 32 ? bfd_get_32 (abfd, ptr)        \
 
873
.                : (bits) == 64 ? bfd_get_64 (abfd, ptr)        \
 
874
.                : (abort (), (bfd_vma) - 1))
 
875
.
 
876
.#define bfd_put(bits, abfd, val, ptr)                          \
 
877
.                ( (bits) ==  8 ? bfd_put_8  (abfd, val, ptr)   \
 
878
.                : (bits) == 16 ? bfd_put_16 (abfd, val, ptr)   \
 
879
.                : (bits) == 32 ? bfd_put_32 (abfd, val, ptr)   \
 
880
.                : (bits) == 64 ? bfd_put_64 (abfd, val, ptr)   \
 
881
.                : (abort (), (void) 0))
 
882
.
 
883
*/
 
884
 
 
885
/*
 
886
FUNCTION
 
887
        bfd_h_put_size
 
888
        bfd_h_get_size
 
889
 
 
890
DESCRIPTION
 
891
        These macros have the same function as their <<bfd_get_x>>
 
892
        brethren, except that they are used for removing information
 
893
        for the header records of object files. Believe it or not,
 
894
        some object files keep their header records in big endian
 
895
        order and their data in little endian order.
 
896
.
 
897
.{* Byte swapping macros for file header data.  *}
 
898
.
 
899
.#define bfd_h_put_8(abfd, val, ptr) \
 
900
.  bfd_put_8 (abfd, val, ptr)
 
901
.#define bfd_h_put_signed_8(abfd, val, ptr) \
 
902
.  bfd_put_8 (abfd, val, ptr)
 
903
.#define bfd_h_get_8(abfd, ptr) \
 
904
.  bfd_get_8 (abfd, ptr)
 
905
.#define bfd_h_get_signed_8(abfd, ptr) \
 
906
.  bfd_get_signed_8 (abfd, ptr)
 
907
.
 
908
.#define bfd_h_put_16(abfd, val, ptr) \
 
909
.  BFD_SEND (abfd, bfd_h_putx16, (val, ptr))
 
910
.#define bfd_h_put_signed_16 \
 
911
.  bfd_h_put_16
 
912
.#define bfd_h_get_16(abfd, ptr) \
 
913
.  BFD_SEND (abfd, bfd_h_getx16, (ptr))
 
914
.#define bfd_h_get_signed_16(abfd, ptr) \
 
915
.  BFD_SEND (abfd, bfd_h_getx_signed_16, (ptr))
 
916
.
 
917
.#define bfd_h_put_32(abfd, val, ptr) \
 
918
.  BFD_SEND (abfd, bfd_h_putx32, (val, ptr))
 
919
.#define bfd_h_put_signed_32 \
 
920
.  bfd_h_put_32
 
921
.#define bfd_h_get_32(abfd, ptr) \
 
922
.  BFD_SEND (abfd, bfd_h_getx32, (ptr))
 
923
.#define bfd_h_get_signed_32(abfd, ptr) \
 
924
.  BFD_SEND (abfd, bfd_h_getx_signed_32, (ptr))
 
925
.
 
926
.#define bfd_h_put_64(abfd, val, ptr) \
 
927
.  BFD_SEND (abfd, bfd_h_putx64, (val, ptr))
 
928
.#define bfd_h_put_signed_64 \
 
929
.  bfd_h_put_64
 
930
.#define bfd_h_get_64(abfd, ptr) \
 
931
.  BFD_SEND (abfd, bfd_h_getx64, (ptr))
 
932
.#define bfd_h_get_signed_64(abfd, ptr) \
 
933
.  BFD_SEND (abfd, bfd_h_getx_signed_64, (ptr))
 
934
.
 
935
.{* Refinements on the above, which should eventually go away.  Save
 
936
.   cluttering the source with (bfd_vma) and (bfd_byte *) casts.  *}
 
937
.
 
938
.#define H_PUT_64(abfd, val, where) \
 
939
.  bfd_h_put_64 ((abfd), (bfd_vma) (val), (bfd_byte *) (where))
 
940
.
 
941
.#define H_PUT_32(abfd, val, where) \
 
942
.  bfd_h_put_32 ((abfd), (bfd_vma) (val), (bfd_byte *) (where))
 
943
.
 
944
.#define H_PUT_16(abfd, val, where) \
 
945
.  bfd_h_put_16 ((abfd), (bfd_vma) (val), (bfd_byte *) (where))
 
946
.
 
947
.#define H_PUT_8 bfd_h_put_8
 
948
.
 
949
.#define H_PUT_S64(abfd, val, where) \
 
950
.  bfd_h_put_signed_64 ((abfd), (bfd_vma) (val), (bfd_byte *) (where))
 
951
.
 
952
.#define H_PUT_S32(abfd, val, where) \
 
953
.  bfd_h_put_signed_32 ((abfd), (bfd_vma) (val), (bfd_byte *) (where))
 
954
.
 
955
.#define H_PUT_S16(abfd, val, where) \
 
956
.  bfd_h_put_signed_16 ((abfd), (bfd_vma) (val), (bfd_byte *) (where))
 
957
.
 
958
.#define H_PUT_S8 bfd_h_put_signed_8
 
959
.
 
960
.#define H_GET_64(abfd, where) \
 
961
.  bfd_h_get_64 ((abfd), (bfd_byte *) (where))
 
962
.
 
963
.#define H_GET_32(abfd, where) \
 
964
.  bfd_h_get_32 ((abfd), (bfd_byte *) (where))
 
965
.
 
966
.#define H_GET_16(abfd, where) \
 
967
.  bfd_h_get_16 ((abfd), (bfd_byte *) (where))
 
968
.
 
969
.#define H_GET_8 bfd_h_get_8
 
970
.
 
971
.#define H_GET_S64(abfd, where) \
 
972
.  bfd_h_get_signed_64 ((abfd), (bfd_byte *) (where))
 
973
.
 
974
.#define H_GET_S32(abfd, where) \
 
975
.  bfd_h_get_signed_32 ((abfd), (bfd_byte *) (where))
 
976
.
 
977
.#define H_GET_S16(abfd, where) \
 
978
.  bfd_h_get_signed_16 ((abfd), (bfd_byte *) (where))
 
979
.
 
980
.#define H_GET_S8 bfd_h_get_signed_8
 
981
.
 
982
.*/
 
983
 
 
984
/* Sign extension to bfd_signed_vma.  */
 
985
#define COERCE16(x) (((bfd_signed_vma) (x) ^ 0x8000) - 0x8000)
 
986
#define COERCE32(x) \
 
987
  ((bfd_signed_vma) (long) (((unsigned long) (x) ^ 0x80000000) - 0x80000000))
 
988
#define EIGHT_GAZILLION (((BFD_HOST_64_BIT)0x80000000) << 32)
 
989
#define COERCE64(x) \
 
990
  (((bfd_signed_vma) (x) ^ EIGHT_GAZILLION) - EIGHT_GAZILLION)
 
991
 
 
992
bfd_vma
 
993
bfd_getb16 (addr)
 
994
     register const bfd_byte *addr;
 
995
{
 
996
  return (addr[0] << 8) | addr[1];
 
997
}
 
998
 
 
999
bfd_vma
 
1000
bfd_getl16 (addr)
 
1001
     register const bfd_byte *addr;
 
1002
{
 
1003
  return (addr[1] << 8) | addr[0];
 
1004
}
 
1005
 
 
1006
bfd_signed_vma
 
1007
bfd_getb_signed_16 (addr)
 
1008
     register const bfd_byte *addr;
 
1009
{
 
1010
  return COERCE16((addr[0] << 8) | addr[1]);
 
1011
}
 
1012
 
 
1013
bfd_signed_vma
 
1014
bfd_getl_signed_16 (addr)
 
1015
     register const bfd_byte *addr;
 
1016
{
 
1017
  return COERCE16((addr[1] << 8) | addr[0]);
 
1018
}
 
1019
 
 
1020
void
 
1021
bfd_putb16 (data, addr)
 
1022
     bfd_vma data;
 
1023
     register bfd_byte *addr;
 
1024
{
 
1025
  addr[0] = (bfd_byte) (data >> 8);
 
1026
  addr[1] = (bfd_byte) data;
 
1027
}
 
1028
 
 
1029
void
 
1030
bfd_putl16 (data, addr)
 
1031
     bfd_vma data;
 
1032
     register bfd_byte *addr;
 
1033
{
 
1034
  addr[0] = (bfd_byte) data;
 
1035
  addr[1] = (bfd_byte) (data >> 8);
 
1036
}
 
1037
 
 
1038
bfd_vma
 
1039
bfd_getb32 (addr)
 
1040
     register const bfd_byte *addr;
 
1041
{
 
1042
  unsigned long v;
 
1043
 
 
1044
  v = (unsigned long) addr[0] << 24;
 
1045
  v |= (unsigned long) addr[1] << 16;
 
1046
  v |= (unsigned long) addr[2] << 8;
 
1047
  v |= (unsigned long) addr[3];
 
1048
  return (bfd_vma) v;
 
1049
}
 
1050
 
 
1051
bfd_vma
 
1052
bfd_getl32 (addr)
 
1053
     register const bfd_byte *addr;
 
1054
{
 
1055
  unsigned long v;
 
1056
 
 
1057
  v = (unsigned long) addr[0];
 
1058
  v |= (unsigned long) addr[1] << 8;
 
1059
  v |= (unsigned long) addr[2] << 16;
 
1060
  v |= (unsigned long) addr[3] << 24;
 
1061
  return (bfd_vma) v;
 
1062
}
 
1063
 
 
1064
bfd_signed_vma
 
1065
bfd_getb_signed_32 (addr)
 
1066
     register const bfd_byte *addr;
 
1067
{
 
1068
  unsigned long v;
 
1069
 
 
1070
  v = (unsigned long) addr[0] << 24;
 
1071
  v |= (unsigned long) addr[1] << 16;
 
1072
  v |= (unsigned long) addr[2] << 8;
 
1073
  v |= (unsigned long) addr[3];
 
1074
  return COERCE32 (v);
 
1075
}
 
1076
 
 
1077
bfd_signed_vma
 
1078
bfd_getl_signed_32 (addr)
 
1079
     register const bfd_byte *addr;
 
1080
{
 
1081
  unsigned long v;
 
1082
 
 
1083
  v = (unsigned long) addr[0];
 
1084
  v |= (unsigned long) addr[1] << 8;
 
1085
  v |= (unsigned long) addr[2] << 16;
 
1086
  v |= (unsigned long) addr[3] << 24;
 
1087
  return COERCE32 (v);
 
1088
}
 
1089
 
 
1090
bfd_vma
 
1091
bfd_getb64 (addr)
 
1092
     register const bfd_byte *addr ATTRIBUTE_UNUSED;
 
1093
{
 
1094
#ifdef BFD64
 
1095
  bfd_vma low, high;
 
1096
 
 
1097
  high= ((((((((addr[0]) << 8) |
 
1098
              addr[1]) << 8) |
 
1099
            addr[2]) << 8) |
 
1100
          addr[3]) );
 
1101
 
 
1102
  low = (((((((((bfd_vma)addr[4]) << 8) |
 
1103
              addr[5]) << 8) |
 
1104
            addr[6]) << 8) |
 
1105
          addr[7]));
 
1106
 
 
1107
  return high << 32 | low;
 
1108
#else
 
1109
  BFD_FAIL();
 
1110
  return 0;
 
1111
#endif
 
1112
}
 
1113
 
 
1114
bfd_vma
 
1115
bfd_getl64 (addr)
 
1116
     register const bfd_byte *addr ATTRIBUTE_UNUSED;
 
1117
{
 
1118
#ifdef BFD64
 
1119
  bfd_vma low, high;
 
1120
  high= (((((((addr[7] << 8) |
 
1121
              addr[6]) << 8) |
 
1122
            addr[5]) << 8) |
 
1123
          addr[4]));
 
1124
 
 
1125
  low = ((((((((bfd_vma)addr[3] << 8) |
 
1126
              addr[2]) << 8) |
 
1127
            addr[1]) << 8) |
 
1128
          addr[0]) );
 
1129
 
 
1130
  return high << 32 | low;
 
1131
#else
 
1132
  BFD_FAIL();
 
1133
  return 0;
 
1134
#endif
 
1135
 
 
1136
}
 
1137
 
 
1138
bfd_signed_vma
 
1139
bfd_getb_signed_64 (addr)
 
1140
     register const bfd_byte *addr ATTRIBUTE_UNUSED;
 
1141
{
 
1142
#ifdef BFD64
 
1143
  bfd_vma low, high;
 
1144
 
 
1145
  high= ((((((((addr[0]) << 8) |
 
1146
              addr[1]) << 8) |
 
1147
            addr[2]) << 8) |
 
1148
          addr[3]) );
 
1149
 
 
1150
  low = (((((((((bfd_vma)addr[4]) << 8) |
 
1151
              addr[5]) << 8) |
 
1152
            addr[6]) << 8) |
 
1153
          addr[7]));
 
1154
 
 
1155
  return COERCE64(high << 32 | low);
 
1156
#else
 
1157
  BFD_FAIL();
 
1158
  return 0;
 
1159
#endif
 
1160
}
 
1161
 
 
1162
bfd_signed_vma
 
1163
bfd_getl_signed_64 (addr)
 
1164
     register const bfd_byte *addr ATTRIBUTE_UNUSED;
 
1165
{
 
1166
#ifdef BFD64
 
1167
  bfd_vma low, high;
 
1168
  high= (((((((addr[7] << 8) |
 
1169
              addr[6]) << 8) |
 
1170
            addr[5]) << 8) |
 
1171
          addr[4]));
 
1172
 
 
1173
  low = ((((((((bfd_vma)addr[3] << 8) |
 
1174
              addr[2]) << 8) |
 
1175
            addr[1]) << 8) |
 
1176
          addr[0]) );
 
1177
 
 
1178
  return COERCE64(high << 32 | low);
 
1179
#else
 
1180
  BFD_FAIL();
 
1181
  return 0;
 
1182
#endif
 
1183
}
 
1184
 
 
1185
void
 
1186
bfd_putb32 (data, addr)
 
1187
     bfd_vma data;
 
1188
     register bfd_byte *addr;
 
1189
{
 
1190
        addr[0] = (bfd_byte) (data >> 24);
 
1191
        addr[1] = (bfd_byte) (data >> 16);
 
1192
        addr[2] = (bfd_byte) (data >>  8);
 
1193
        addr[3] = (bfd_byte) data;
 
1194
}
 
1195
 
 
1196
void
 
1197
bfd_putl32 (data, addr)
 
1198
     bfd_vma data;
 
1199
     register bfd_byte *addr;
 
1200
{
 
1201
        addr[0] = (bfd_byte) data;
 
1202
        addr[1] = (bfd_byte) (data >>  8);
 
1203
        addr[2] = (bfd_byte) (data >> 16);
 
1204
        addr[3] = (bfd_byte) (data >> 24);
 
1205
}
 
1206
 
 
1207
void
 
1208
bfd_putb64 (data, addr)
 
1209
     bfd_vma data ATTRIBUTE_UNUSED;
 
1210
     register bfd_byte *addr ATTRIBUTE_UNUSED;
 
1211
{
 
1212
#ifdef BFD64
 
1213
  addr[0] = (bfd_byte) (data >> (7*8));
 
1214
  addr[1] = (bfd_byte) (data >> (6*8));
 
1215
  addr[2] = (bfd_byte) (data >> (5*8));
 
1216
  addr[3] = (bfd_byte) (data >> (4*8));
 
1217
  addr[4] = (bfd_byte) (data >> (3*8));
 
1218
  addr[5] = (bfd_byte) (data >> (2*8));
 
1219
  addr[6] = (bfd_byte) (data >> (1*8));
 
1220
  addr[7] = (bfd_byte) (data >> (0*8));
 
1221
#else
 
1222
  BFD_FAIL();
 
1223
#endif
 
1224
}
 
1225
 
 
1226
void
 
1227
bfd_putl64 (data, addr)
 
1228
     bfd_vma data ATTRIBUTE_UNUSED;
 
1229
     register bfd_byte *addr ATTRIBUTE_UNUSED;
 
1230
{
 
1231
#ifdef BFD64
 
1232
  addr[7] = (bfd_byte) (data >> (7*8));
 
1233
  addr[6] = (bfd_byte) (data >> (6*8));
 
1234
  addr[5] = (bfd_byte) (data >> (5*8));
 
1235
  addr[4] = (bfd_byte) (data >> (4*8));
 
1236
  addr[3] = (bfd_byte) (data >> (3*8));
 
1237
  addr[2] = (bfd_byte) (data >> (2*8));
 
1238
  addr[1] = (bfd_byte) (data >> (1*8));
 
1239
  addr[0] = (bfd_byte) (data >> (0*8));
 
1240
#else
 
1241
  BFD_FAIL();
 
1242
#endif
 
1243
}
 
1244
 
 
1245
void
 
1246
bfd_put_bits (data, addr, bits, big_p)
 
1247
     bfd_vma data;
 
1248
     bfd_byte *addr;
 
1249
     int bits;
 
1250
     boolean big_p;
 
1251
{
 
1252
  int i;
 
1253
  int bytes;
 
1254
 
 
1255
  if (bits % 8 != 0)
 
1256
    abort ();
 
1257
 
 
1258
  bytes = bits / 8;
 
1259
  for (i = 0; i < bytes; i++)
 
1260
    {
 
1261
      int index = big_p ? bytes - i - 1 : i;
 
1262
 
 
1263
      addr[index] = (bfd_byte) data;
 
1264
      data >>= 8;
 
1265
    }
 
1266
}
 
1267
 
 
1268
bfd_vma
 
1269
bfd_get_bits (addr, bits, big_p)
 
1270
     bfd_byte *addr;
 
1271
     int bits;
 
1272
     boolean big_p;
 
1273
{
 
1274
  bfd_vma data;
 
1275
  int i;
 
1276
  int bytes;
 
1277
 
 
1278
  if (bits % 8 != 0)
 
1279
    abort ();
 
1280
 
 
1281
  data = 0;
 
1282
  bytes = bits / 8;
 
1283
  for (i = 0; i < bytes; i++)
 
1284
    {
 
1285
      int index = big_p ? i : bytes - i - 1;
 
1286
 
 
1287
      data = (data << 8) | addr[index];
 
1288
    }
 
1289
 
 
1290
  return data;
 
1291
}
 
1292
 
 
1293
/* Default implementation */
 
1294
 
 
1295
boolean
 
1296
_bfd_generic_get_section_contents (abfd, section, location, offset, count)
 
1297
     bfd *abfd;
 
1298
     sec_ptr section;
 
1299
     PTR location;
 
1300
     file_ptr offset;
 
1301
     bfd_size_type count;
 
1302
{
 
1303
  if (count == 0)
 
1304
    return true;
 
1305
 
 
1306
  if (offset + count > section->_raw_size)
 
1307
    {
 
1308
      bfd_set_error (bfd_error_invalid_operation);
 
1309
      return false;
 
1310
    }
 
1311
 
 
1312
  if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
 
1313
      || bfd_bread (location, count, abfd) != count)
 
1314
    return false;
 
1315
 
 
1316
  return true;
 
1317
}
 
1318
 
 
1319
boolean
 
1320
_bfd_generic_get_section_contents_in_window (abfd, section, w, offset, count)
 
1321
     bfd *abfd ATTRIBUTE_UNUSED;
 
1322
     sec_ptr section ATTRIBUTE_UNUSED;
 
1323
     bfd_window *w ATTRIBUTE_UNUSED;
 
1324
     file_ptr offset ATTRIBUTE_UNUSED;
 
1325
     bfd_size_type count ATTRIBUTE_UNUSED;
 
1326
{
 
1327
#ifdef USE_MMAP
 
1328
  if (count == 0)
 
1329
    return true;
 
1330
  if (abfd->xvec->_bfd_get_section_contents != _bfd_generic_get_section_contents)
 
1331
    {
 
1332
      /* We don't know what changes the bfd's get_section_contents
 
1333
         method may have to make.  So punt trying to map the file
 
1334
         window, and let get_section_contents do its thing.  */
 
1335
      /* @@ FIXME : If the internal window has a refcount of 1 and was
 
1336
         allocated with malloc instead of mmap, just reuse it.  */
 
1337
      bfd_free_window (w);
 
1338
      w->i = ((bfd_window_internal *)
 
1339
              bfd_zmalloc ((bfd_size_type) sizeof (bfd_window_internal)));
 
1340
      if (w->i == NULL)
 
1341
        return false;
 
1342
      w->i->data = (PTR) bfd_malloc (count);
 
1343
      if (w->i->data == NULL)
 
1344
        {
 
1345
          free (w->i);
 
1346
          w->i = NULL;
 
1347
          return false;
 
1348
        }
 
1349
      w->i->mapped = 0;
 
1350
      w->i->refcount = 1;
 
1351
      w->size = w->i->size = count;
 
1352
      w->data = w->i->data;
 
1353
      return bfd_get_section_contents (abfd, section, w->data, offset, count);
 
1354
    }
 
1355
  if (offset + count > section->_raw_size
 
1356
      || ! bfd_get_file_window (abfd, section->filepos + offset, count, w,
 
1357
                                true))
 
1358
    return false;
 
1359
  return true;
 
1360
#else
 
1361
  abort ();
 
1362
#endif
 
1363
}
 
1364
 
 
1365
/* This generic function can only be used in implementations where creating
 
1366
   NEW sections is disallowed.  It is useful in patching existing sections
 
1367
   in read-write files, though.  See other set_section_contents functions
 
1368
   to see why it doesn't work for new sections.  */
 
1369
boolean
 
1370
_bfd_generic_set_section_contents (abfd, section, location, offset, count)
 
1371
     bfd *abfd;
 
1372
     sec_ptr section;
 
1373
     PTR location;
 
1374
     file_ptr offset;
 
1375
     bfd_size_type count;
 
1376
{
 
1377
  if (count == 0)
 
1378
    return true;
 
1379
 
 
1380
  if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
 
1381
      || bfd_bwrite (location, count, abfd) != count)
 
1382
    return false;
 
1383
 
 
1384
  return true;
 
1385
}
 
1386
 
 
1387
/*
 
1388
INTERNAL_FUNCTION
 
1389
        bfd_log2
 
1390
 
 
1391
SYNOPSIS
 
1392
        unsigned int bfd_log2 (bfd_vma x);
 
1393
 
 
1394
DESCRIPTION
 
1395
        Return the log base 2 of the value supplied, rounded up.  E.g., an
 
1396
        @var{x} of 1025 returns 11.  A @var{x} of 0 returns 0.
 
1397
*/
 
1398
 
 
1399
unsigned int
 
1400
bfd_log2 (x)
 
1401
     bfd_vma x;
 
1402
{
 
1403
  unsigned int result = 0;
 
1404
 
 
1405
  while ((x = (x >> 1)) != 0)
 
1406
    ++result;
 
1407
  return result;
 
1408
}
 
1409
 
 
1410
boolean
 
1411
bfd_generic_is_local_label_name (abfd, name)
 
1412
     bfd *abfd;
 
1413
     const char *name;
 
1414
{
 
1415
  char locals_prefix = (bfd_get_symbol_leading_char (abfd) == '_') ? 'L' : '.';
 
1416
 
 
1417
  return (name[0] == locals_prefix);
 
1418
}
 
1419
 
 
1420
/*  Can be used from / for bfd_merge_private_bfd_data to check that
 
1421
    endianness matches between input and output file.  Returns
 
1422
    true for a match, otherwise returns false and emits an error.  */
 
1423
boolean
 
1424
_bfd_generic_verify_endian_match (ibfd, obfd)
 
1425
     bfd *ibfd;
 
1426
     bfd *obfd;
 
1427
{
 
1428
  if (ibfd->xvec->byteorder != obfd->xvec->byteorder
 
1429
      && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
 
1430
      && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
 
1431
    {
 
1432
      const char *msg;
 
1433
 
 
1434
      if (bfd_big_endian (ibfd))
 
1435
        msg = _("%s: compiled for a big endian system and target is little endian");
 
1436
      else
 
1437
        msg = _("%s: compiled for a little endian system and target is big endian");
 
1438
 
 
1439
      (*_bfd_error_handler) (msg, bfd_archive_filename (ibfd));
 
1440
 
 
1441
      bfd_set_error (bfd_error_wrong_format);
 
1442
      return false;
 
1443
    }
 
1444
 
 
1445
  return true;
 
1446
}
 
1447
 
 
1448
/* Give a warning at runtime if someone compiles code which calls
 
1449
   old routines.  */
 
1450
 
 
1451
void
 
1452
warn_deprecated (what, file, line, func)
 
1453
     const char *what;
 
1454
     const char *file;
 
1455
     int line;
 
1456
     const char *func;
 
1457
{
 
1458
  /* Poor man's tracking of functions we've already warned about.  */
 
1459
  static size_t mask = 0;
 
1460
 
 
1461
  if (~(size_t) func & ~mask)
 
1462
    {
 
1463
      /* Note: seperate sentances in order to allow
 
1464
         for translation into other languages.  */
 
1465
      if (func)
 
1466
        fprintf (stderr, _("Deprecated %s called at %s line %d in %s\n"),
 
1467
                 what, file, line, func);
 
1468
      else
 
1469
        fprintf (stderr, _("Deprecated %s called\n"), what);
 
1470
      mask |= ~(size_t) func;
 
1471
    }
 
1472
}