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