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