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

Subversion Repositories or1k

[/] [or1k/] [tags/] [VER_5_3/] [gdb-5.3/] [bfd/] [versados.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1181 sfurman
/* BFD back-end for VERSAdos-E objects.
2
   Copyright 1995, 1996, 1998, 1999, 2000, 2001, 2002
3
   Free Software Foundation, Inc.
4
   Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
5
 
6
   Versados is a Motorola trademark.
7
 
8
   This file is part of BFD, the Binary File Descriptor library.
9
 
10
   This program is free software; you can redistribute it and/or modify
11
   it under the terms of the GNU General Public License as published by
12
   the Free Software Foundation; either version 2 of the License, or
13
   (at your option) any later version.
14
 
15
   This program is distributed in the hope that it will be useful,
16
   but WITHOUT ANY WARRANTY; without even the implied warranty of
17
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
   GNU General Public License for more details.
19
 
20
   You should have received a copy of the GNU General Public License
21
   along with this program; if not, write to the Free Software
22
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
23
 
24
/*
25
   SUBSECTION
26
   VERSAdos-E relocateable object file format
27
 
28
   DESCRIPTION
29
 
30
   This module supports reading of VERSAdos relocateable
31
   object files.
32
 
33
   A VERSAdos file looks like contains
34
 
35
   o Indentification Record
36
   o External Symbol Definition Record
37
   o Object Text Recrod
38
   o End Record
39
 
40
 */
41
 
42
#include "bfd.h"
43
#include "sysdep.h"
44
#include "libbfd.h"
45
#include "libiberty.h"
46
 
47
static boolean versados_mkobject PARAMS ((bfd *));
48
static boolean versados_scan PARAMS ((bfd *));
49
static const bfd_target *versados_object_p PARAMS ((bfd *));
50
static asymbol *versados_new_symbol PARAMS ((bfd *, int, const char *, bfd_vma, asection *));
51
static char *new_symbol_string PARAMS ((bfd *, const char *));
52
static const bfd_target *versados_object_p PARAMS ((bfd *));
53
static boolean versados_pass_2 PARAMS ((bfd *));
54
static boolean versados_get_section_contents
55
  PARAMS ((bfd *, asection *, void *, file_ptr, bfd_size_type));
56
static boolean versados_set_section_contents
57
  PARAMS ((bfd *, sec_ptr, void *, file_ptr, bfd_size_type));
58
static int versados_sizeof_headers PARAMS ((bfd *, boolean));
59
static long int versados_get_symtab_upper_bound PARAMS ((bfd *));
60
static long int versados_get_symtab PARAMS ((bfd *, asymbol **));
61
static void versados_get_symbol_info
62
  PARAMS ((bfd *, asymbol *, symbol_info *));
63
static void versados_print_symbol
64
  PARAMS ((bfd *, PTR, asymbol *, bfd_print_symbol_type));
65
static long versados_get_reloc_upper_bound
66
  PARAMS ((bfd *, sec_ptr));
67
static long versados_canonicalize_reloc
68
  PARAMS ((bfd *, sec_ptr, arelent **, asymbol **));
69
 
70
#define VHEADER '1'
71
#define VESTDEF '2'
72
#define VOTR '3'
73
#define VEND '4'
74
 
75
#define ES_BASE 17              /* first symbol has esdid 17 */
76
 
77
/* Per file target dependent information */
78
 
79
/* one for each section */
80
struct esdid
81
  {
82
    asection *section;          /* ptr to bfd version */
83
    unsigned char *contents;    /* used to build image */
84
    int pc;
85
    int relocs;                 /* reloc count, valid end of pass 1 */
86
    int donerel;                /* have relocs been translated */
87
  };
88
 
89
typedef struct versados_data_struct
90
  {
91
    int es_done;                /* count of symbol index, starts at ES_BASE */
92
    asymbol *symbols;           /* pointer to local symbols */
93
    char *strings;              /* strings of all the above */
94
    int stringlen;              /* len of string table (valid end of pass1) */
95
    int nsecsyms;               /* number of sections */
96
 
97
    int ndefs;                  /* number of exported symbols (they dont get esdids) */
98
    int nrefs;                  /* number of imported symbols  (valid end of pass1) */
99
 
100
    int ref_idx;                /* current processed value of the above */
101
    int def_idx;
102
 
103
    int pass_2_done;
104
 
105
    struct esdid e[16];         /* per section info */
106
    int alert;                  /* to see if we're trampling */
107
    asymbol *rest[256 - 16];    /* per symbol info */
108
 
109
  }
110
tdata_type;
111
 
112
#define VDATA(abfd)       (abfd->tdata.versados_data)
113
#define EDATA(abfd, n)    (abfd->tdata.versados_data->e[n])
114
#define RDATA(abfd, n)    (abfd->tdata.versados_data->rest[n])
115
 
116
struct ext_otr
117
  {
118
    unsigned char size;
119
    char type;
120
    unsigned char map[4];
121
    unsigned char esdid;
122
    unsigned char data[200];
123
  };
124
 
125
struct ext_vheader
126
  {
127
    unsigned char size;
128
    char type;                  /* record type */
129
    char name[10];              /* module name */
130
    char rev;                   /* module rev number */
131
    char lang;
132
    char vol[4];
133
    char user[2];
134
    char cat[8];
135
    char fname[8];
136
    char ext[2];
137
    char time[3];
138
    char date[3];
139
    char rest[211];
140
  };
141
 
142
struct ext_esd
143
  {
144
    unsigned char size;
145
    char type;
146
    unsigned char esd_entries[1];
147
  };
148
#define ESD_ABS         0
149
#define ESD_COMMON      1
150
#define ESD_STD_REL_SEC 2
151
#define ESD_SHRT_REL_SEC 3
152
#define ESD_XDEF_IN_SEC 4
153
#define ESD_XREF_SYM    7
154
#define ESD_XREF_SEC    6
155
#define ESD_XDEF_IN_ABS 5
156
union ext_any
157
  {
158
    unsigned char size;
159
    struct ext_vheader header;
160
    struct ext_esd esd;
161
    struct ext_otr otr;
162
  };
163
 
164
static int get_record PARAMS ((bfd *, union ext_any *));
165
static int get_4 PARAMS ((unsigned char **));
166
static void get_10 PARAMS ((unsigned char **, char *));
167
static void process_esd PARAMS ((bfd *, struct ext_esd *, int));
168
static int get_offset PARAMS ((int, unsigned char *));
169
static void process_otr PARAMS ((bfd *, struct ext_otr *, int));
170
 
171
/* Initialize by filling in the hex conversion array.  */
172
 
173
/* Set up the tdata information.  */
174
 
175
static boolean
176
versados_mkobject (abfd)
177
     bfd *abfd;
178
{
179
  if (abfd->tdata.versados_data == NULL)
180
    {
181
      bfd_size_type amt = sizeof (tdata_type);
182
      tdata_type *tdata = (tdata_type *) bfd_alloc (abfd, amt);
183
      if (tdata == NULL)
184
        return false;
185
      abfd->tdata.versados_data = tdata;
186
      tdata->symbols = NULL;
187
      VDATA (abfd)->alert = 0x12345678;
188
    }
189
 
190
  bfd_default_set_arch_mach (abfd, bfd_arch_m68k, 0);
191
  return true;
192
}
193
 
194
/* Report a problem in an S record file.  FIXME: This probably should
195
   not call fprintf, but we really do need some mechanism for printing
196
   error messages.  */
197
 
198
static asymbol *
199
versados_new_symbol (abfd, snum, name, val, sec)
200
     bfd *abfd;
201
     int snum;
202
     const char *name;
203
     bfd_vma val;
204
     asection *sec;
205
{
206
  asymbol *n = VDATA (abfd)->symbols + snum;
207
  n->name = name;
208
  n->value = val;
209
  n->section = sec;
210
  n->the_bfd = abfd;
211
  n->flags = 0;
212
  return n;
213
}
214
 
215
static int
216
get_record (abfd, ptr)
217
     bfd *abfd;
218
     union ext_any *ptr;
219
{
220
  if (bfd_bread (&ptr->size, (bfd_size_type) 1, abfd) != 1
221
      || (bfd_bread ((char *) ptr + 1, (bfd_size_type) ptr->size, abfd)
222
          != ptr->size))
223
    return 0;
224
  return 1;
225
}
226
 
227
static int
228
get_4 (pp)
229
     unsigned char **pp;
230
{
231
  unsigned char *p = *pp;
232
  *pp += 4;
233
  return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | (p[3] << 0);
234
}
235
 
236
static void
237
get_10 (pp, name)
238
     unsigned char **pp;
239
     char *name;
240
{
241
  char *p = (char *) *pp;
242
  int len = 10;
243
  *pp += len;
244
  while (*p != ' '
245
         && len)
246
    {
247
      *name++ = *p++;
248
      len--;
249
    }
250
  *name = 0;
251
}
252
 
253
static char *
254
new_symbol_string (abfd, name)
255
     bfd *abfd;
256
     const char *name;
257
{
258
  char *n = VDATA (abfd)->strings;
259
  strcpy (VDATA (abfd)->strings, name);
260
  VDATA (abfd)->strings += strlen (VDATA (abfd)->strings) + 1;
261
  return n;
262
}
263
 
264
static void
265
process_esd (abfd, esd, pass)
266
     bfd *abfd;
267
     struct ext_esd *esd;
268
     int pass;
269
{
270
  /* Read through the ext def for the est entries */
271
  int togo = esd->size - 2;
272
  bfd_vma size;
273
  bfd_vma start;
274
  asection *sec;
275
  char name[11];
276
  unsigned char *ptr = esd->esd_entries;
277
  unsigned char *end = ptr + togo;
278
  while (ptr < end)
279
    {
280
      int scn = *ptr & 0xf;
281
      int typ = (*ptr >> 4) & 0xf;
282
 
283
      /* Declare this section */
284
      sprintf (name, "%d", scn);
285
      sec = bfd_make_section_old_way (abfd, strdup (name));
286
      sec->target_index = scn;
287
      EDATA (abfd, scn).section = sec;
288
      ptr++;
289
      switch (typ)
290
        {
291
        default:
292
          abort ();
293
        case ESD_XREF_SEC:
294
        case ESD_XREF_SYM:
295
          {
296
            int snum = VDATA (abfd)->ref_idx++;
297
            get_10 (&ptr, name);
298
            if (pass == 1)
299
              {
300
                VDATA (abfd)->stringlen += strlen (name) + 1;
301
              }
302
            else
303
              {
304
                int esidx;
305
                asymbol *s;
306
                char *n = new_symbol_string (abfd, name);
307
                s = versados_new_symbol (abfd, snum, n, (bfd_vma) 0,
308
                                         bfd_und_section_ptr);
309
                esidx = VDATA (abfd)->es_done++;
310
                RDATA (abfd, esidx - ES_BASE) = s;
311
              }
312
          }
313
          break;
314
 
315
        case ESD_ABS:
316
          size = get_4 (&ptr);
317
          start = get_4 (&ptr);
318
          break;
319
        case ESD_STD_REL_SEC:
320
        case ESD_SHRT_REL_SEC:
321
          {
322
            sec->_raw_size = get_4 (&ptr);
323
            sec->flags |= SEC_ALLOC;
324
          }
325
          break;
326
        case ESD_XDEF_IN_ABS:
327
          sec = (asection *) & bfd_abs_section;
328
        case ESD_XDEF_IN_SEC:
329
          {
330
            int snum = VDATA (abfd)->def_idx++;
331
            bfd_vma val;
332
            get_10 (&ptr, name);
333
            val = get_4 (&ptr);
334
            if (pass == 1)
335
              {
336
                /* Just remember the symbol */
337
                VDATA (abfd)->stringlen += strlen (name) + 1;
338
              }
339
            else
340
              {
341
                asymbol *s;
342
                char *n = new_symbol_string (abfd, name);
343
                s = versados_new_symbol (abfd, snum + VDATA (abfd)->nrefs, n,
344
                                         val, sec);
345
                s->flags |= BSF_GLOBAL;
346
              }
347
          }
348
          break;
349
        }
350
    }
351
}
352
 
353
#define R_RELWORD 1
354
#define R_RELLONG 2
355
#define R_RELWORD_NEG 3
356
#define R_RELLONG_NEG 4
357
 
358
reloc_howto_type versados_howto_table[] =
359
{
360
  HOWTO (R_RELWORD, 0, 1, 16, false,
361
         0, complain_overflow_dont, 0,
362
         "+v16", true, 0x0000ffff, 0x0000ffff, false),
363
  HOWTO (R_RELLONG, 0, 2, 32, false,
364
         0, complain_overflow_dont, 0,
365
         "+v32", true, 0xffffffff, 0xffffffff, false),
366
 
367
  HOWTO (R_RELWORD_NEG, 0, -1, 16, false,
368
         0, complain_overflow_dont, 0,
369
         "-v16", true, 0x0000ffff, 0x0000ffff, false),
370
  HOWTO (R_RELLONG_NEG, 0, -2, 32, false,
371
         0, complain_overflow_dont, 0,
372
         "-v32", true, 0xffffffff, 0xffffffff, false),
373
};
374
 
375
static int
376
get_offset (len, ptr)
377
     int len;
378
     unsigned char *ptr;
379
{
380
  int val = 0;
381
  if (len)
382
    {
383
      int i;
384
      val = *ptr++;
385
      if (val & 0x80)
386
        val |= ~0xff;
387
      for (i = 1; i < len; i++)
388
        val = (val << 8) | *ptr++;
389
    }
390
 
391
  return val;
392
}
393
 
394
static void
395
process_otr (abfd, otr, pass)
396
     bfd *abfd;
397
     struct ext_otr *otr;
398
     int pass;
399
{
400
  unsigned long shift;
401
  unsigned char *srcp = otr->data;
402
  unsigned char *endp = (unsigned char *) otr + otr->size;
403
  unsigned int bits = (otr->map[0] << 24)
404
  | (otr->map[1] << 16)
405
  | (otr->map[2] << 8)
406
  | (otr->map[3] << 0);
407
 
408
  struct esdid *esdid = &EDATA (abfd, otr->esdid - 1);
409
  unsigned char *contents = esdid->contents;
410
  int need_contents = 0;
411
  unsigned int dst_idx = esdid->pc;
412
 
413
  for (shift = ((unsigned long) 1 << 31); shift && srcp < endp; shift >>= 1)
414
    {
415
      if (bits & shift)
416
        {
417
          int flag = *srcp++;
418
          int esdids = (flag >> 5) & 0x7;
419
          int sizeinwords = ((flag >> 3) & 1) ? 2 : 1;
420
          int offsetlen = flag & 0x7;
421
          int j;
422
 
423
          if (esdids == 0)
424
            {
425
              /* A zero esdid means the new pc is the offset given */
426
              dst_idx += get_offset (offsetlen, srcp);
427
              srcp += offsetlen;
428
            }
429
          else
430
            {
431
              int val = get_offset (offsetlen, srcp + esdids);
432
              if (pass == 1)
433
                need_contents = 1;
434
              else
435
                for (j = 0; j < sizeinwords * 2; j++)
436
                  {
437
                    contents[dst_idx + (sizeinwords * 2) - j - 1] = val;
438
                    val >>= 8;
439
                  }
440
 
441
              for (j = 0; j < esdids; j++)
442
                {
443
                  int esdid = *srcp++;
444
 
445
                  if (esdid)
446
                    {
447
                      int rn = EDATA (abfd, otr->esdid - 1).relocs++;
448
                      if (pass == 1)
449
                        {
450
                          /* this is the first pass over the data,
451
                             just remember that we need a reloc */
452
                        }
453
                      else
454
                        {
455
                          arelent *n =
456
                          EDATA (abfd, otr->esdid - 1).section->relocation + rn;
457
                          n->address = dst_idx;
458
 
459
                          n->sym_ptr_ptr = (asymbol **) esdid;
460
                          n->addend = 0;
461
                          n->howto = versados_howto_table + ((j & 1) * 2) + (sizeinwords - 1);
462
                        }
463
                    }
464
                }
465
              srcp += offsetlen;
466
              dst_idx += sizeinwords * 2;
467
            }
468
        }
469
      else
470
        {
471
          need_contents = 1;
472
          if (dst_idx < esdid->section->_raw_size)
473
            if (pass == 2)
474
              {
475
                /* absolute code, comes in 16 bit lumps */
476
                contents[dst_idx] = srcp[0];
477
                contents[dst_idx + 1] = srcp[1];
478
              }
479
          dst_idx += 2;
480
          srcp += 2;
481
        }
482
    }
483
  EDATA (abfd, otr->esdid - 1).pc = dst_idx;
484
 
485
  if (!contents && need_contents)
486
    {
487
      bfd_size_type size = esdid->section->_raw_size;
488
      esdid->contents = (unsigned char *) bfd_alloc (abfd, size);
489
    }
490
}
491
 
492
static boolean
493
versados_scan (abfd)
494
     bfd *abfd;
495
{
496
  int loop = 1;
497
  int i;
498
  int j;
499
  int nsecs = 0;
500
  bfd_size_type amt;
501
 
502
  VDATA (abfd)->stringlen = 0;
503
  VDATA (abfd)->nrefs = 0;
504
  VDATA (abfd)->ndefs = 0;
505
  VDATA (abfd)->ref_idx = 0;
506
  VDATA (abfd)->def_idx = 0;
507
  VDATA (abfd)->pass_2_done = 0;
508
 
509
  while (loop)
510
    {
511
      union ext_any any;
512
      if (!get_record (abfd, &any))
513
        return true;
514
      switch (any.header.type)
515
        {
516
        case VHEADER:
517
          break;
518
        case VEND:
519
          loop = 0;
520
          break;
521
        case VESTDEF:
522
          process_esd (abfd, &any.esd, 1);
523
          break;
524
        case VOTR:
525
          process_otr (abfd, &any.otr, 1);
526
          break;
527
        }
528
    }
529
 
530
  /* Now allocate space for the relocs and sections */
531
 
532
  VDATA (abfd)->nrefs = VDATA (abfd)->ref_idx;
533
  VDATA (abfd)->ndefs = VDATA (abfd)->def_idx;
534
  VDATA (abfd)->ref_idx = 0;
535
  VDATA (abfd)->def_idx = 0;
536
 
537
  abfd->symcount = VDATA (abfd)->nrefs + VDATA (abfd)->ndefs;
538
 
539
  for (i = 0; i < 16; i++)
540
    {
541
      struct esdid *esdid = &EDATA (abfd, i);
542
      if (esdid->section)
543
        {
544
          amt = (bfd_size_type) esdid->relocs * sizeof (arelent);
545
          esdid->section->relocation = (arelent *) bfd_alloc (abfd, amt);
546
 
547
          esdid->pc = 0;
548
 
549
          if (esdid->contents)
550
            esdid->section->flags |= SEC_HAS_CONTENTS | SEC_LOAD;
551
 
552
          esdid->section->reloc_count = esdid->relocs;
553
          if (esdid->relocs)
554
            esdid->section->flags |= SEC_RELOC;
555
 
556
          esdid->relocs = 0;
557
 
558
          /* Add an entry into the symbol table for it */
559
          nsecs++;
560
          VDATA (abfd)->stringlen += strlen (esdid->section->name) + 1;
561
        }
562
    }
563
 
564
  abfd->symcount += nsecs;
565
 
566
  amt = abfd->symcount;
567
  amt *= sizeof (asymbol);
568
  VDATA (abfd)->symbols = (asymbol *) bfd_alloc (abfd, amt);
569
 
570
  amt = VDATA (abfd)->stringlen;
571
  VDATA (abfd)->strings = bfd_alloc (abfd, amt);
572
 
573
  if ((VDATA (abfd)->symbols == NULL && abfd->symcount > 0)
574
      || (VDATA (abfd)->strings == NULL && VDATA (abfd)->stringlen > 0))
575
    return false;
576
 
577
  /* Actually fill in the section symbols,
578
     we stick them at the end of the table */
579
 
580
  for (j = VDATA (abfd)->nrefs + VDATA (abfd)->ndefs, i = 0; i < 16; i++)
581
    {
582
      struct esdid *esdid = &EDATA (abfd, i);
583
      asection *sec = esdid->section;
584
      if (sec)
585
        {
586
          asymbol *s = VDATA (abfd)->symbols + j;
587
          s->name = new_symbol_string (abfd, sec->name);
588
          s->section = sec;
589
          s->flags = BSF_LOCAL;
590
          s->value = 0;
591
          s->the_bfd = abfd;
592
          j++;
593
        }
594
    }
595
  if (abfd->symcount)
596
    abfd->flags |= HAS_SYMS;
597
 
598
  /* Set this to nsecs - since we've already planted the section
599
     symbols */
600
  VDATA (abfd)->nsecsyms = nsecs;
601
 
602
  VDATA (abfd)->ref_idx = 0;
603
 
604
  return 1;
605
}
606
 
607
/* Check whether an existing file is a versados  file.  */
608
 
609
static const bfd_target *
610
versados_object_p (abfd)
611
     bfd *abfd;
612
{
613
  struct ext_vheader ext;
614
  unsigned char len;
615
  tdata_type *tdata_save;
616
 
617
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
618
    return NULL;
619
 
620
  if (bfd_bread (&len, (bfd_size_type) 1, abfd) != 1)
621
    {
622
      if (bfd_get_error () != bfd_error_system_call)
623
        bfd_set_error (bfd_error_wrong_format);
624
      return NULL;
625
    }
626
 
627
  if (bfd_bread (&ext.type, (bfd_size_type) len, abfd) != len)
628
    {
629
      if (bfd_get_error () != bfd_error_system_call)
630
        bfd_set_error (bfd_error_wrong_format);
631
      return NULL;
632
    }
633
 
634
  /* We guess that the language field will never be larger than 10.
635
     In sample files, it is always either 0 or 1.  Checking for this
636
     prevents confusion with Intel Hex files.  */
637
  if (ext.type != VHEADER
638
      || ext.lang > 10)
639
    {
640
      bfd_set_error (bfd_error_wrong_format);
641
      return NULL;
642
    }
643
 
644
  /* OK, looks like a record, build the tdata and read in.  */
645
 
646
  tdata_save = abfd->tdata.versados_data;
647
  if (!versados_mkobject (abfd) || !versados_scan (abfd))
648
    {
649
      abfd->tdata.versados_data = tdata_save;
650
      return NULL;
651
    }
652
 
653
  return abfd->xvec;
654
}
655
 
656
static boolean
657
versados_pass_2 (abfd)
658
     bfd *abfd;
659
{
660
  union ext_any any;
661
 
662
  if (VDATA (abfd)->pass_2_done)
663
    return 1;
664
 
665
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
666
    return 0;
667
 
668
  VDATA (abfd)->es_done = ES_BASE;
669
 
670
  /* read records till we get to where we want to be */
671
 
672
  while (1)
673
    {
674
      get_record (abfd, &any);
675
      switch (any.header.type)
676
        {
677
        case VEND:
678
          VDATA (abfd)->pass_2_done = 1;
679
          return 1;
680
        case VESTDEF:
681
          process_esd (abfd, &any.esd, 2);
682
          break;
683
        case VOTR:
684
          process_otr (abfd, &any.otr, 2);
685
          break;
686
        }
687
    }
688
}
689
 
690
static boolean
691
versados_get_section_contents (abfd, section, location, offset, count)
692
     bfd *abfd;
693
     asection *section;
694
     PTR location;
695
     file_ptr offset;
696
     bfd_size_type count;
697
{
698
  if (!versados_pass_2 (abfd))
699
    return false;
700
 
701
  memcpy (location,
702
          EDATA (abfd, section->target_index).contents + offset,
703
          (size_t) count);
704
 
705
  return true;
706
}
707
 
708
#define versados_get_section_contents_in_window \
709
  _bfd_generic_get_section_contents_in_window
710
 
711
static boolean
712
versados_set_section_contents (abfd, section, location, offset, bytes_to_do)
713
     bfd *abfd ATTRIBUTE_UNUSED;
714
     sec_ptr section ATTRIBUTE_UNUSED;
715
     PTR location ATTRIBUTE_UNUSED;
716
     file_ptr offset ATTRIBUTE_UNUSED;
717
     bfd_size_type bytes_to_do ATTRIBUTE_UNUSED;
718
{
719
  return false;
720
}
721
 
722
static int
723
versados_sizeof_headers (abfd, exec)
724
     bfd *abfd ATTRIBUTE_UNUSED;
725
     boolean exec ATTRIBUTE_UNUSED;
726
{
727
  return 0;
728
}
729
 
730
/* Return the amount of memory needed to read the symbol table.  */
731
 
732
static long
733
versados_get_symtab_upper_bound (abfd)
734
     bfd *abfd;
735
{
736
  return (bfd_get_symcount (abfd) + 1) * sizeof (asymbol *);
737
}
738
 
739
/* Return the symbol table.  */
740
 
741
static long
742
versados_get_symtab (abfd, alocation)
743
     bfd *abfd;
744
     asymbol **alocation;
745
{
746
  unsigned int symcount = bfd_get_symcount (abfd);
747
  unsigned int i;
748
  asymbol *s;
749
 
750
  versados_pass_2 (abfd);
751
 
752
  for (i = 0, s = VDATA (abfd)->symbols;
753
       i < symcount;
754
       s++, i++)
755
    {
756
      *alocation++ = s;
757
    }
758
 
759
  *alocation = NULL;
760
 
761
  return symcount;
762
}
763
 
764
static void
765
versados_get_symbol_info (ignore_abfd, symbol, ret)
766
     bfd *ignore_abfd ATTRIBUTE_UNUSED;
767
     asymbol *symbol;
768
     symbol_info *ret;
769
{
770
  bfd_symbol_info (symbol, ret);
771
}
772
 
773
static void
774
versados_print_symbol (abfd, afile, symbol, how)
775
     bfd *abfd;
776
     PTR afile;
777
     asymbol *symbol;
778
     bfd_print_symbol_type how;
779
{
780
  FILE *file = (FILE *) afile;
781
  switch (how)
782
    {
783
    case bfd_print_symbol_name:
784
      fprintf (file, "%s", symbol->name);
785
      break;
786
    default:
787
      bfd_print_symbol_vandf (abfd, (PTR) file, symbol);
788
      fprintf (file, " %-5s %s",
789
               symbol->section->name,
790
               symbol->name);
791
 
792
    }
793
}
794
 
795
static long
796
versados_get_reloc_upper_bound (abfd, asect)
797
     bfd *abfd ATTRIBUTE_UNUSED;
798
     sec_ptr asect;
799
{
800
  return (asect->reloc_count + 1) * sizeof (arelent *);
801
}
802
 
803
static long
804
versados_canonicalize_reloc (abfd, section, relptr, symbols)
805
     bfd *abfd;
806
     sec_ptr section;
807
     arelent **relptr;
808
     asymbol **symbols;
809
{
810
  unsigned int count;
811
  arelent *src;
812
 
813
  versados_pass_2 (abfd);
814
  src = section->relocation;
815
  if (!EDATA (abfd, section->target_index).donerel)
816
    {
817
      EDATA (abfd, section->target_index).donerel = 1;
818
      /* translate from indexes to symptr ptrs */
819
      for (count = 0; count < section->reloc_count; count++)
820
        {
821
          int esdid = (int) src[count].sym_ptr_ptr;
822
 
823
          if (esdid == 0)
824
            {
825
              src[count].sym_ptr_ptr = bfd_abs_section.symbol_ptr_ptr;
826
            }
827
          else if (esdid < ES_BASE)     /* Section relative thing */
828
            {
829
              struct esdid *e = &EDATA (abfd, esdid - 1);
830
              if (!section)
831
                {
832
                 /** relocation relative to section which was
833
                   never declared ! */
834
                }
835
              src[count].sym_ptr_ptr = e->section->symbol_ptr_ptr;
836
            }
837
          else
838
            {
839
              src[count].sym_ptr_ptr = symbols + esdid - ES_BASE;
840
            }
841
 
842
        }
843
    }
844
 
845
  for (count = 0; count < section->reloc_count; count++)
846
    {
847
      *relptr++ = src++;
848
    }
849
  *relptr = 0;
850
  return section->reloc_count;
851
}
852
 
853
#define versados_close_and_cleanup _bfd_generic_close_and_cleanup
854
#define versados_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
855
#define versados_new_section_hook _bfd_generic_new_section_hook
856
 
857
#define versados_bfd_is_local_label_name bfd_generic_is_local_label_name
858
#define versados_get_lineno _bfd_nosymbols_get_lineno
859
#define versados_find_nearest_line _bfd_nosymbols_find_nearest_line
860
#define versados_make_empty_symbol _bfd_generic_make_empty_symbol
861
#define versados_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
862
#define versados_read_minisymbols _bfd_generic_read_minisymbols
863
#define versados_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
864
 
865
#define versados_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
866
 
867
#define versados_set_arch_mach bfd_default_set_arch_mach
868
 
869
#define versados_bfd_get_relocated_section_contents \
870
  bfd_generic_get_relocated_section_contents
871
#define versados_bfd_relax_section bfd_generic_relax_section
872
#define versados_bfd_gc_sections bfd_generic_gc_sections
873
#define versados_bfd_merge_sections bfd_generic_merge_sections
874
#define versados_bfd_discard_group bfd_generic_discard_group
875
#define versados_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
876
#define versados_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
877
#define versados_bfd_link_add_symbols _bfd_generic_link_add_symbols
878
#define versados_bfd_link_just_syms _bfd_generic_link_just_syms
879
#define versados_bfd_final_link _bfd_generic_final_link
880
#define versados_bfd_link_split_section _bfd_generic_link_split_section
881
 
882
const bfd_target versados_vec =
883
{
884
  "versados",                   /* name */
885
  bfd_target_versados_flavour,
886
  BFD_ENDIAN_BIG,               /* target byte order */
887
  BFD_ENDIAN_BIG,               /* target headers byte order */
888
  (HAS_RELOC | EXEC_P |         /* object flags */
889
   HAS_LINENO | HAS_DEBUG |
890
   HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
891
  (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
892
   | SEC_ALLOC | SEC_LOAD | SEC_RELOC),         /* section flags */
893
  0,                             /* leading underscore */
894
  ' ',                          /* ar_pad_char */
895
  16,                           /* ar_max_namelen */
896
  bfd_getb64, bfd_getb_signed_64, bfd_putb64,
897
  bfd_getb32, bfd_getb_signed_32, bfd_putb32,
898
  bfd_getb16, bfd_getb_signed_16, bfd_putb16,   /* data */
899
  bfd_getb64, bfd_getb_signed_64, bfd_putb64,
900
  bfd_getb32, bfd_getb_signed_32, bfd_putb32,
901
  bfd_getb16, bfd_getb_signed_16, bfd_putb16,   /* hdrs */
902
 
903
  {
904
    _bfd_dummy_target,
905
    versados_object_p,          /* bfd_check_format */
906
    _bfd_dummy_target,
907
    _bfd_dummy_target,
908
  },
909
  {
910
    bfd_false,
911
    versados_mkobject,
912
    _bfd_generic_mkarchive,
913
    bfd_false,
914
  },
915
  {                             /* bfd_write_contents */
916
    bfd_false,
917
    bfd_false,
918
    _bfd_write_archive_contents,
919
    bfd_false,
920
  },
921
 
922
  BFD_JUMP_TABLE_GENERIC (versados),
923
  BFD_JUMP_TABLE_COPY (_bfd_generic),
924
  BFD_JUMP_TABLE_CORE (_bfd_nocore),
925
  BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
926
  BFD_JUMP_TABLE_SYMBOLS (versados),
927
  BFD_JUMP_TABLE_RELOCS (versados),
928
  BFD_JUMP_TABLE_WRITE (versados),
929
  BFD_JUMP_TABLE_LINK (versados),
930
  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
931
 
932
  NULL,
933
 
934
  (PTR) 0
935
};

powered by: WebSVN 2.1.0

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