Remove path name from test case
[binutils-gdb.git] / bfd / coff-alpha.c
1 /* BFD back-end for ALPHA Extended-Coff files.
2 Copyright (C) 1993-2023 Free Software Foundation, Inc.
3 Modified from coff-mips.c by Steve Chamberlain <sac@cygnus.com> and
4 Ian Lance Taylor <ian@cygnus.com>.
5
6 This file is part of BFD, the Binary File Descriptor library.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
22
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "bfdlink.h"
26 #include "libbfd.h"
27 #include "coff/internal.h"
28 #include "coff/sym.h"
29 #include "coff/symconst.h"
30 #include "coff/ecoff.h"
31 #include "coff/alpha.h"
32 #include "aout/ar.h"
33 #include "libcoff.h"
34 #include "libecoff.h"
35 \f
36 /* Prototypes for static functions. */
37
38
39 \f
40 /* ECOFF has COFF sections, but the debugging information is stored in
41 a completely different format. ECOFF targets use some of the
42 swapping routines from coffswap.h, and some of the generic COFF
43 routines in coffgen.c, but, unlike the real COFF targets, do not
44 use coffcode.h itself.
45
46 Get the generic COFF swapping routines, except for the reloc,
47 symbol, and lineno ones. Give them ecoff names. Define some
48 accessor macros for the large sizes used for Alpha ECOFF. */
49
50 #define GET_FILEHDR_SYMPTR H_GET_64
51 #define PUT_FILEHDR_SYMPTR H_PUT_64
52 #define GET_AOUTHDR_TSIZE H_GET_64
53 #define PUT_AOUTHDR_TSIZE H_PUT_64
54 #define GET_AOUTHDR_DSIZE H_GET_64
55 #define PUT_AOUTHDR_DSIZE H_PUT_64
56 #define GET_AOUTHDR_BSIZE H_GET_64
57 #define PUT_AOUTHDR_BSIZE H_PUT_64
58 #define GET_AOUTHDR_ENTRY H_GET_64
59 #define PUT_AOUTHDR_ENTRY H_PUT_64
60 #define GET_AOUTHDR_TEXT_START H_GET_64
61 #define PUT_AOUTHDR_TEXT_START H_PUT_64
62 #define GET_AOUTHDR_DATA_START H_GET_64
63 #define PUT_AOUTHDR_DATA_START H_PUT_64
64 #define GET_SCNHDR_PADDR H_GET_64
65 #define PUT_SCNHDR_PADDR H_PUT_64
66 #define GET_SCNHDR_VADDR H_GET_64
67 #define PUT_SCNHDR_VADDR H_PUT_64
68 #define GET_SCNHDR_SIZE H_GET_64
69 #define PUT_SCNHDR_SIZE H_PUT_64
70 #define GET_SCNHDR_SCNPTR H_GET_64
71 #define PUT_SCNHDR_SCNPTR H_PUT_64
72 #define GET_SCNHDR_RELPTR H_GET_64
73 #define PUT_SCNHDR_RELPTR H_PUT_64
74 #define GET_SCNHDR_LNNOPTR H_GET_64
75 #define PUT_SCNHDR_LNNOPTR H_PUT_64
76
77 #define ALPHAECOFF
78
79 #define NO_COFF_RELOCS
80 #define NO_COFF_SYMBOLS
81 #define NO_COFF_LINENOS
82 #define coff_swap_filehdr_in alpha_ecoff_swap_filehdr_in
83 #define coff_swap_filehdr_out alpha_ecoff_swap_filehdr_out
84 #define coff_swap_aouthdr_in alpha_ecoff_swap_aouthdr_in
85 #define coff_swap_aouthdr_out alpha_ecoff_swap_aouthdr_out
86 #define coff_swap_scnhdr_in alpha_ecoff_swap_scnhdr_in
87 #define coff_swap_scnhdr_out alpha_ecoff_swap_scnhdr_out
88 #include "coffswap.h"
89
90 /* Get the ECOFF swapping routines. */
91 #define ECOFF_64
92 #include "ecoffswap.h"
93 \f
94 /* How to process the various reloc types. */
95
96 static bfd_reloc_status_type
97 reloc_nil (bfd *abfd ATTRIBUTE_UNUSED,
98 arelent *reloc ATTRIBUTE_UNUSED,
99 asymbol *sym ATTRIBUTE_UNUSED,
100 void * data ATTRIBUTE_UNUSED,
101 asection *sec ATTRIBUTE_UNUSED,
102 bfd *output_bfd ATTRIBUTE_UNUSED,
103 char **error_message ATTRIBUTE_UNUSED)
104 {
105 return bfd_reloc_ok;
106 }
107
108 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
109 from smaller values. Start with zero, widen, *then* decrement. */
110 #define MINUS_ONE (((bfd_vma)0) - 1)
111
112 static reloc_howto_type alpha_howto_table[] =
113 {
114 /* Reloc type 0 is ignored by itself. However, it appears after a
115 GPDISP reloc to identify the location where the low order 16 bits
116 of the gp register are loaded. */
117 HOWTO (ALPHA_R_IGNORE, /* type */
118 0, /* rightshift */
119 1, /* size */
120 8, /* bitsize */
121 true, /* pc_relative */
122 0, /* bitpos */
123 complain_overflow_dont, /* complain_on_overflow */
124 reloc_nil, /* special_function */
125 "IGNORE", /* name */
126 true, /* partial_inplace */
127 0, /* src_mask */
128 0, /* dst_mask */
129 true), /* pcrel_offset */
130
131 /* A 32 bit reference to a symbol. */
132 HOWTO (ALPHA_R_REFLONG, /* type */
133 0, /* rightshift */
134 4, /* size */
135 32, /* bitsize */
136 false, /* pc_relative */
137 0, /* bitpos */
138 complain_overflow_bitfield, /* complain_on_overflow */
139 0, /* special_function */
140 "REFLONG", /* name */
141 true, /* partial_inplace */
142 0xffffffff, /* src_mask */
143 0xffffffff, /* dst_mask */
144 false), /* pcrel_offset */
145
146 /* A 64 bit reference to a symbol. */
147 HOWTO (ALPHA_R_REFQUAD, /* type */
148 0, /* rightshift */
149 8, /* size */
150 64, /* bitsize */
151 false, /* pc_relative */
152 0, /* bitpos */
153 complain_overflow_bitfield, /* complain_on_overflow */
154 0, /* special_function */
155 "REFQUAD", /* name */
156 true, /* partial_inplace */
157 MINUS_ONE, /* src_mask */
158 MINUS_ONE, /* dst_mask */
159 false), /* pcrel_offset */
160
161 /* A 32 bit GP relative offset. This is just like REFLONG except
162 that when the value is used the value of the gp register will be
163 added in. */
164 HOWTO (ALPHA_R_GPREL32, /* type */
165 0, /* rightshift */
166 4, /* size */
167 32, /* bitsize */
168 false, /* pc_relative */
169 0, /* bitpos */
170 complain_overflow_bitfield, /* complain_on_overflow */
171 0, /* special_function */
172 "GPREL32", /* name */
173 true, /* partial_inplace */
174 0xffffffff, /* src_mask */
175 0xffffffff, /* dst_mask */
176 false), /* pcrel_offset */
177
178 /* Used for an instruction that refers to memory off the GP
179 register. The offset is 16 bits of the 32 bit instruction. This
180 reloc always seems to be against the .lita section. */
181 HOWTO (ALPHA_R_LITERAL, /* type */
182 0, /* rightshift */
183 4, /* size */
184 16, /* bitsize */
185 false, /* pc_relative */
186 0, /* bitpos */
187 complain_overflow_signed, /* complain_on_overflow */
188 0, /* special_function */
189 "LITERAL", /* name */
190 true, /* partial_inplace */
191 0xffff, /* src_mask */
192 0xffff, /* dst_mask */
193 false), /* pcrel_offset */
194
195 /* This reloc only appears immediately following a LITERAL reloc.
196 It identifies a use of the literal. It seems that the linker can
197 use this to eliminate a portion of the .lita section. The symbol
198 index is special: 1 means the literal address is in the base
199 register of a memory format instruction; 2 means the literal
200 address is in the byte offset register of a byte-manipulation
201 instruction; 3 means the literal address is in the target
202 register of a jsr instruction. This does not actually do any
203 relocation. */
204 HOWTO (ALPHA_R_LITUSE, /* type */
205 0, /* rightshift */
206 4, /* size */
207 32, /* bitsize */
208 false, /* pc_relative */
209 0, /* bitpos */
210 complain_overflow_dont, /* complain_on_overflow */
211 reloc_nil, /* special_function */
212 "LITUSE", /* name */
213 false, /* partial_inplace */
214 0, /* src_mask */
215 0, /* dst_mask */
216 false), /* pcrel_offset */
217
218 /* Load the gp register. This is always used for a ldah instruction
219 which loads the upper 16 bits of the gp register. The next reloc
220 will be an IGNORE reloc which identifies the location of the lda
221 instruction which loads the lower 16 bits. The symbol index of
222 the GPDISP instruction appears to actually be the number of bytes
223 between the ldah and lda instructions. This gives two different
224 ways to determine where the lda instruction is; I don't know why
225 both are used. The value to use for the relocation is the
226 difference between the GP value and the current location; the
227 load will always be done against a register holding the current
228 address. */
229 HOWTO (ALPHA_R_GPDISP, /* type */
230 16, /* rightshift */
231 4, /* size */
232 16, /* bitsize */
233 true, /* pc_relative */
234 0, /* bitpos */
235 complain_overflow_dont, /* complain_on_overflow */
236 reloc_nil, /* special_function */
237 "GPDISP", /* name */
238 true, /* partial_inplace */
239 0xffff, /* src_mask */
240 0xffff, /* dst_mask */
241 true), /* pcrel_offset */
242
243 /* A 21 bit branch. The native assembler generates these for
244 branches within the text segment, and also fills in the PC
245 relative offset in the instruction. */
246 HOWTO (ALPHA_R_BRADDR, /* type */
247 2, /* rightshift */
248 4, /* size */
249 21, /* bitsize */
250 true, /* pc_relative */
251 0, /* bitpos */
252 complain_overflow_signed, /* complain_on_overflow */
253 0, /* special_function */
254 "BRADDR", /* name */
255 true, /* partial_inplace */
256 0x1fffff, /* src_mask */
257 0x1fffff, /* dst_mask */
258 false), /* pcrel_offset */
259
260 /* A hint for a jump to a register. */
261 HOWTO (ALPHA_R_HINT, /* type */
262 2, /* rightshift */
263 4, /* size */
264 14, /* bitsize */
265 true, /* pc_relative */
266 0, /* bitpos */
267 complain_overflow_dont, /* complain_on_overflow */
268 0, /* special_function */
269 "HINT", /* name */
270 true, /* partial_inplace */
271 0x3fff, /* src_mask */
272 0x3fff, /* dst_mask */
273 false), /* pcrel_offset */
274
275 /* 16 bit PC relative offset. */
276 HOWTO (ALPHA_R_SREL16, /* type */
277 0, /* rightshift */
278 2, /* size */
279 16, /* bitsize */
280 true, /* pc_relative */
281 0, /* bitpos */
282 complain_overflow_signed, /* complain_on_overflow */
283 0, /* special_function */
284 "SREL16", /* name */
285 true, /* partial_inplace */
286 0xffff, /* src_mask */
287 0xffff, /* dst_mask */
288 false), /* pcrel_offset */
289
290 /* 32 bit PC relative offset. */
291 HOWTO (ALPHA_R_SREL32, /* type */
292 0, /* rightshift */
293 4, /* size */
294 32, /* bitsize */
295 true, /* pc_relative */
296 0, /* bitpos */
297 complain_overflow_signed, /* complain_on_overflow */
298 0, /* special_function */
299 "SREL32", /* name */
300 true, /* partial_inplace */
301 0xffffffff, /* src_mask */
302 0xffffffff, /* dst_mask */
303 false), /* pcrel_offset */
304
305 /* A 64 bit PC relative offset. */
306 HOWTO (ALPHA_R_SREL64, /* type */
307 0, /* rightshift */
308 8, /* size */
309 64, /* bitsize */
310 true, /* pc_relative */
311 0, /* bitpos */
312 complain_overflow_signed, /* complain_on_overflow */
313 0, /* special_function */
314 "SREL64", /* name */
315 true, /* partial_inplace */
316 MINUS_ONE, /* src_mask */
317 MINUS_ONE, /* dst_mask */
318 false), /* pcrel_offset */
319
320 /* Push a value on the reloc evaluation stack. */
321 HOWTO (ALPHA_R_OP_PUSH, /* type */
322 0, /* rightshift */
323 0, /* size */
324 0, /* bitsize */
325 false, /* pc_relative */
326 0, /* bitpos */
327 complain_overflow_dont, /* complain_on_overflow */
328 0, /* special_function */
329 "OP_PUSH", /* name */
330 false, /* partial_inplace */
331 0, /* src_mask */
332 0, /* dst_mask */
333 false), /* pcrel_offset */
334
335 /* Store the value from the stack at the given address. Store it in
336 a bitfield of size r_size starting at bit position r_offset. */
337 HOWTO (ALPHA_R_OP_STORE, /* type */
338 0, /* rightshift */
339 8, /* size */
340 64, /* bitsize */
341 false, /* pc_relative */
342 0, /* bitpos */
343 complain_overflow_dont, /* complain_on_overflow */
344 0, /* special_function */
345 "OP_STORE", /* name */
346 false, /* partial_inplace */
347 0, /* src_mask */
348 MINUS_ONE, /* dst_mask */
349 false), /* pcrel_offset */
350
351 /* Subtract the reloc address from the value on the top of the
352 relocation stack. */
353 HOWTO (ALPHA_R_OP_PSUB, /* type */
354 0, /* rightshift */
355 0, /* size */
356 0, /* bitsize */
357 false, /* pc_relative */
358 0, /* bitpos */
359 complain_overflow_dont, /* complain_on_overflow */
360 0, /* special_function */
361 "OP_PSUB", /* name */
362 false, /* partial_inplace */
363 0, /* src_mask */
364 0, /* dst_mask */
365 false), /* pcrel_offset */
366
367 /* Shift the value on the top of the relocation stack right by the
368 given value. */
369 HOWTO (ALPHA_R_OP_PRSHIFT, /* type */
370 0, /* rightshift */
371 0, /* size */
372 0, /* bitsize */
373 false, /* pc_relative */
374 0, /* bitpos */
375 complain_overflow_dont, /* complain_on_overflow */
376 0, /* special_function */
377 "OP_PRSHIFT", /* name */
378 false, /* partial_inplace */
379 0, /* src_mask */
380 0, /* dst_mask */
381 false), /* pcrel_offset */
382
383 /* Adjust the GP value for a new range in the object file. */
384 HOWTO (ALPHA_R_GPVALUE, /* type */
385 0, /* rightshift */
386 0, /* size */
387 0, /* bitsize */
388 false, /* pc_relative */
389 0, /* bitpos */
390 complain_overflow_dont, /* complain_on_overflow */
391 0, /* special_function */
392 "GPVALUE", /* name */
393 false, /* partial_inplace */
394 0, /* src_mask */
395 0, /* dst_mask */
396 false) /* pcrel_offset */
397 };
398 \f
399 /* Recognize an Alpha ECOFF file. */
400
401 static bfd_cleanup
402 alpha_ecoff_object_p (bfd *abfd)
403 {
404 bfd_cleanup ret;
405
406 ret = coff_object_p (abfd);
407
408 if (ret != NULL)
409 {
410 asection *sec;
411
412 /* Alpha ECOFF has a .pdata section. The lnnoptr field of the
413 .pdata section is the number of entries it contains. Each
414 entry takes up 8 bytes. The number of entries is required
415 since the section is aligned to a 16 byte boundary. When we
416 link .pdata sections together, we do not want to include the
417 alignment bytes. We handle this on input by faking the size
418 of the .pdata section to remove the unwanted alignment bytes.
419 On output we will set the lnnoptr field and force the
420 alignment. */
421 sec = bfd_get_section_by_name (abfd, _PDATA);
422 if (sec != (asection *) NULL)
423 {
424 bfd_size_type size;
425
426 size = (bfd_size_type) sec->line_filepos * 8;
427 BFD_ASSERT (size == sec->size
428 || size + 8 == sec->size);
429 if (!bfd_set_section_size (sec, size))
430 return NULL;
431 }
432 }
433
434 return ret;
435 }
436
437 /* See whether the magic number matches. */
438
439 static bool
440 alpha_ecoff_bad_format_hook (bfd *abfd ATTRIBUTE_UNUSED,
441 void * filehdr)
442 {
443 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
444
445 if (! ALPHA_ECOFF_BADMAG (*internal_f))
446 return true;
447
448 if (ALPHA_ECOFF_COMPRESSEDMAG (*internal_f))
449 _bfd_error_handler
450 (_("%pB: cannot handle compressed Alpha binaries; "
451 "use compiler flags, or objZ, to generate uncompressed binaries"),
452 abfd);
453
454 return false;
455 }
456
457 /* This is a hook called by coff_real_object_p to create any backend
458 specific information. */
459
460 static void *
461 alpha_ecoff_mkobject_hook (bfd *abfd, void * filehdr, void * aouthdr)
462 {
463 void * ecoff;
464
465 ecoff = _bfd_ecoff_mkobject_hook (abfd, filehdr, aouthdr);
466
467 if (ecoff != NULL)
468 {
469 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
470
471 /* Set additional BFD flags according to the object type from the
472 machine specific file header flags. */
473 switch (internal_f->f_flags & F_ALPHA_OBJECT_TYPE_MASK)
474 {
475 case F_ALPHA_SHARABLE:
476 abfd->flags |= DYNAMIC;
477 break;
478 case F_ALPHA_CALL_SHARED:
479 /* Always executable if using shared libraries as the run time
480 loader might resolve undefined references. */
481 abfd->flags |= (DYNAMIC | EXEC_P);
482 break;
483 }
484 }
485 return ecoff;
486 }
487 \f
488 /* Reloc handling. */
489
490 /* Swap a reloc in. */
491
492 static void
493 alpha_ecoff_swap_reloc_in (bfd *abfd,
494 void * ext_ptr,
495 struct internal_reloc *intern)
496 {
497 const RELOC *ext = (RELOC *) ext_ptr;
498
499 intern->r_vaddr = H_GET_64 (abfd, ext->r_vaddr);
500 intern->r_symndx = H_GET_32 (abfd, ext->r_symndx);
501
502 BFD_ASSERT (bfd_header_little_endian (abfd));
503
504 intern->r_type = ((ext->r_bits[0] & RELOC_BITS0_TYPE_LITTLE)
505 >> RELOC_BITS0_TYPE_SH_LITTLE);
506 intern->r_extern = (ext->r_bits[1] & RELOC_BITS1_EXTERN_LITTLE) != 0;
507 intern->r_offset = ((ext->r_bits[1] & RELOC_BITS1_OFFSET_LITTLE)
508 >> RELOC_BITS1_OFFSET_SH_LITTLE);
509 /* Ignored the reserved bits. */
510 intern->r_size = ((ext->r_bits[3] & RELOC_BITS3_SIZE_LITTLE)
511 >> RELOC_BITS3_SIZE_SH_LITTLE);
512
513 if (intern->r_type == ALPHA_R_LITUSE
514 || intern->r_type == ALPHA_R_GPDISP)
515 {
516 /* Handle the LITUSE and GPDISP relocs specially. Its symndx
517 value is not actually a symbol index, but is instead a
518 special code. We put the code in the r_size field, and
519 clobber the symndx. */
520 if (intern->r_size != 0)
521 abort ();
522 intern->r_size = intern->r_symndx;
523 intern->r_symndx = RELOC_SECTION_NONE;
524 }
525 else if (intern->r_type == ALPHA_R_IGNORE)
526 {
527 /* The IGNORE reloc generally follows a GPDISP reloc, and is
528 against the .lita section. The section is irrelevant. */
529 if (! intern->r_extern &&
530 intern->r_symndx == RELOC_SECTION_ABS)
531 abort ();
532 if (! intern->r_extern && intern->r_symndx == RELOC_SECTION_LITA)
533 intern->r_symndx = RELOC_SECTION_ABS;
534 }
535 }
536
537 /* Swap a reloc out. */
538
539 static void
540 alpha_ecoff_swap_reloc_out (bfd *abfd,
541 const struct internal_reloc *intern,
542 void * dst)
543 {
544 RELOC *ext = (RELOC *) dst;
545 long symndx;
546 unsigned char size;
547
548 /* Undo the hackery done in swap_reloc_in. */
549 if (intern->r_type == ALPHA_R_LITUSE
550 || intern->r_type == ALPHA_R_GPDISP)
551 {
552 symndx = intern->r_size;
553 size = 0;
554 }
555 else if (intern->r_type == ALPHA_R_IGNORE
556 && ! intern->r_extern
557 && intern->r_symndx == RELOC_SECTION_ABS)
558 {
559 symndx = RELOC_SECTION_LITA;
560 size = intern->r_size;
561 }
562 else
563 {
564 symndx = intern->r_symndx;
565 size = intern->r_size;
566 }
567
568 /* XXX FIXME: The maximum symndx value used to be 14 but this
569 fails with object files produced by DEC's C++ compiler.
570 Where does the value 14 (or 15) come from anyway ? */
571 BFD_ASSERT (intern->r_extern
572 || (intern->r_symndx >= 0 && intern->r_symndx <= 15));
573
574 H_PUT_64 (abfd, intern->r_vaddr, ext->r_vaddr);
575 H_PUT_32 (abfd, symndx, ext->r_symndx);
576
577 BFD_ASSERT (bfd_header_little_endian (abfd));
578
579 ext->r_bits[0] = ((intern->r_type << RELOC_BITS0_TYPE_SH_LITTLE)
580 & RELOC_BITS0_TYPE_LITTLE);
581 ext->r_bits[1] = ((intern->r_extern ? RELOC_BITS1_EXTERN_LITTLE : 0)
582 | ((intern->r_offset << RELOC_BITS1_OFFSET_SH_LITTLE)
583 & RELOC_BITS1_OFFSET_LITTLE));
584 ext->r_bits[2] = 0;
585 ext->r_bits[3] = ((size << RELOC_BITS3_SIZE_SH_LITTLE)
586 & RELOC_BITS3_SIZE_LITTLE);
587 }
588
589 /* Finish canonicalizing a reloc. Part of this is generic to all
590 ECOFF targets, and that part is in ecoff.c. The rest is done in
591 this backend routine. It must fill in the howto field. */
592
593 static void
594 alpha_adjust_reloc_in (bfd *abfd,
595 const struct internal_reloc *intern,
596 arelent *rptr)
597 {
598 if (intern->r_type > ALPHA_R_GPVALUE)
599 {
600 /* xgettext:c-format */
601 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
602 abfd, intern->r_type);
603 bfd_set_error (bfd_error_bad_value);
604 rptr->addend = 0;
605 rptr->howto = NULL;
606 return;
607 }
608
609 switch (intern->r_type)
610 {
611 case ALPHA_R_BRADDR:
612 case ALPHA_R_SREL16:
613 case ALPHA_R_SREL32:
614 case ALPHA_R_SREL64:
615 /* This relocs appear to be fully resolved when they are against
616 internal symbols. Against external symbols, BRADDR at least
617 appears to be resolved against the next instruction. */
618 if (! intern->r_extern)
619 rptr->addend = 0;
620 else
621 rptr->addend = - (intern->r_vaddr + 4);
622 break;
623
624 case ALPHA_R_GPREL32:
625 case ALPHA_R_LITERAL:
626 /* Copy the gp value for this object file into the addend, to
627 ensure that we are not confused by the linker. */
628 if (! intern->r_extern)
629 rptr->addend += ecoff_data (abfd)->gp;
630 break;
631
632 case ALPHA_R_LITUSE:
633 case ALPHA_R_GPDISP:
634 /* The LITUSE and GPDISP relocs do not use a symbol, or an
635 addend, but they do use a special code. Put this code in the
636 addend field. */
637 rptr->addend = intern->r_size;
638 break;
639
640 case ALPHA_R_OP_STORE:
641 /* The STORE reloc needs the size and offset fields. We store
642 them in the addend. */
643 BFD_ASSERT (intern->r_offset <= 256);
644 rptr->addend = (intern->r_offset << 8) + intern->r_size;
645 break;
646
647 case ALPHA_R_OP_PUSH:
648 case ALPHA_R_OP_PSUB:
649 case ALPHA_R_OP_PRSHIFT:
650 /* The PUSH, PSUB and PRSHIFT relocs do not actually use an
651 address. I believe that the address supplied is really an
652 addend. */
653 rptr->addend = intern->r_vaddr;
654 break;
655
656 case ALPHA_R_GPVALUE:
657 /* Set the addend field to the new GP value. */
658 rptr->addend = intern->r_symndx + ecoff_data (abfd)->gp;
659 break;
660
661 case ALPHA_R_IGNORE:
662 /* If the type is ALPHA_R_IGNORE, make sure this is a reference
663 to the absolute section so that the reloc is ignored. For
664 some reason the address of this reloc type is not adjusted by
665 the section vma. We record the gp value for this object file
666 here, for convenience when doing the GPDISP relocation. */
667 rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
668 rptr->address = intern->r_vaddr;
669 rptr->addend = ecoff_data (abfd)->gp;
670 break;
671
672 default:
673 break;
674 }
675
676 rptr->howto = &alpha_howto_table[intern->r_type];
677 }
678
679 /* When writing out a reloc we need to pull some values back out of
680 the addend field into the reloc. This is roughly the reverse of
681 alpha_adjust_reloc_in, except that there are several changes we do
682 not need to undo. */
683
684 static void
685 alpha_adjust_reloc_out (bfd *abfd ATTRIBUTE_UNUSED,
686 const arelent *rel,
687 struct internal_reloc *intern)
688 {
689 switch (intern->r_type)
690 {
691 case ALPHA_R_LITUSE:
692 case ALPHA_R_GPDISP:
693 intern->r_size = rel->addend;
694 break;
695
696 case ALPHA_R_OP_STORE:
697 intern->r_size = rel->addend & 0xff;
698 intern->r_offset = (rel->addend >> 8) & 0xff;
699 break;
700
701 case ALPHA_R_OP_PUSH:
702 case ALPHA_R_OP_PSUB:
703 case ALPHA_R_OP_PRSHIFT:
704 intern->r_vaddr = rel->addend;
705 break;
706
707 case ALPHA_R_IGNORE:
708 intern->r_vaddr = rel->address;
709 break;
710
711 default:
712 break;
713 }
714 }
715
716 /* The size of the stack for the relocation evaluator. */
717 #define RELOC_STACKSIZE (10)
718
719 /* Alpha ECOFF relocs have a built in expression evaluator as well as
720 other interdependencies. Rather than use a bunch of special
721 functions and global variables, we use a single routine to do all
722 the relocation for a section. I haven't yet worked out how the
723 assembler is going to handle this. */
724
725 static bfd_byte *
726 alpha_ecoff_get_relocated_section_contents (bfd *abfd,
727 struct bfd_link_info *link_info,
728 struct bfd_link_order *link_order,
729 bfd_byte *data,
730 bool relocatable,
731 asymbol **symbols)
732 {
733 bfd *input_bfd = link_order->u.indirect.section->owner;
734 asection *input_section = link_order->u.indirect.section;
735 long reloc_size;
736 arelent **reloc_vector;
737 long reloc_count;
738 bfd *output_bfd = relocatable ? abfd : (bfd *) NULL;
739 bfd_vma gp;
740 bool gp_undefined;
741 bfd_vma stack[RELOC_STACKSIZE];
742 int tos = 0;
743
744 reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
745 if (reloc_size < 0)
746 return NULL;
747
748 bfd_byte *orig_data = data;
749 if (!bfd_get_full_section_contents (input_bfd, input_section, &data))
750 return NULL;
751
752 if (data == NULL)
753 return NULL;
754
755 if (reloc_size == 0)
756 return data;
757
758 reloc_vector = (arelent **) bfd_malloc (reloc_size);
759 if (reloc_vector == NULL)
760 goto error_return;
761
762 reloc_count = bfd_canonicalize_reloc (input_bfd, input_section,
763 reloc_vector, symbols);
764 if (reloc_count < 0)
765 goto error_return;
766 if (reloc_count == 0)
767 goto successful_return;
768
769 /* Get the GP value for the output BFD. */
770 gp_undefined = false;
771 gp = _bfd_get_gp_value (abfd);
772 if (gp == 0)
773 {
774 if (relocatable)
775 {
776 asection *sec;
777 bfd_vma lo;
778
779 /* Make up a value. */
780 lo = (bfd_vma) -1;
781 for (sec = abfd->sections; sec != NULL; sec = sec->next)
782 {
783 if (sec->vma < lo
784 && (strcmp (sec->name, ".sbss") == 0
785 || strcmp (sec->name, ".sdata") == 0
786 || strcmp (sec->name, ".lit4") == 0
787 || strcmp (sec->name, ".lit8") == 0
788 || strcmp (sec->name, ".lita") == 0))
789 lo = sec->vma;
790 }
791 gp = lo + 0x8000;
792 _bfd_set_gp_value (abfd, gp);
793 }
794 else
795 {
796 struct bfd_link_hash_entry *h;
797
798 h = bfd_link_hash_lookup (link_info->hash, "_gp", false, false,
799 true);
800 if (h == (struct bfd_link_hash_entry *) NULL
801 || h->type != bfd_link_hash_defined)
802 gp_undefined = true;
803 else
804 {
805 gp = (h->u.def.value
806 + h->u.def.section->output_section->vma
807 + h->u.def.section->output_offset);
808 _bfd_set_gp_value (abfd, gp);
809 }
810 }
811 }
812
813 for (arelent **relp = reloc_vector; *relp != NULL; relp++)
814 {
815 arelent *rel;
816 bfd_reloc_status_type r;
817 char *err;
818 unsigned int r_type;
819
820 rel = *relp;
821 if (rel->howto == NULL)
822 {
823 r = bfd_reloc_notsupported;
824 r_type = ALPHA_R_IGNORE;
825 }
826 else
827 {
828 r = bfd_reloc_ok;
829 r_type = rel->howto->type;
830 }
831 switch (r_type)
832 {
833 case ALPHA_R_IGNORE:
834 rel->address += input_section->output_offset;
835 break;
836
837 case ALPHA_R_REFLONG:
838 case ALPHA_R_REFQUAD:
839 case ALPHA_R_BRADDR:
840 case ALPHA_R_HINT:
841 case ALPHA_R_SREL16:
842 case ALPHA_R_SREL32:
843 case ALPHA_R_SREL64:
844 if (relocatable
845 && ((*rel->sym_ptr_ptr)->flags & BSF_SECTION_SYM) == 0)
846 {
847 rel->address += input_section->output_offset;
848 break;
849 }
850 r = bfd_perform_relocation (input_bfd, rel, data, input_section,
851 output_bfd, &err);
852 break;
853
854 case ALPHA_R_GPREL32:
855 /* This relocation is used in a switch table. It is a 32
856 bit offset from the current GP value. We must adjust it
857 by the different between the original GP value and the
858 current GP value. The original GP value is stored in the
859 addend. We adjust the addend and let
860 bfd_perform_relocation finish the job. */
861 rel->addend -= gp;
862 r = bfd_perform_relocation (input_bfd, rel, data, input_section,
863 output_bfd, &err);
864 if (r == bfd_reloc_ok && gp_undefined)
865 {
866 r = bfd_reloc_dangerous;
867 err = (char *) _("GP relative relocation used when GP not defined");
868 }
869 break;
870
871 case ALPHA_R_LITERAL:
872 /* This is a reference to a literal value, generally
873 (always?) in the .lita section. This is a 16 bit GP
874 relative relocation. Sometimes the subsequent reloc is a
875 LITUSE reloc, which indicates how this reloc is used.
876 This sometimes permits rewriting the two instructions
877 referred to by the LITERAL and the LITUSE into different
878 instructions which do not refer to .lita. This can save
879 a memory reference, and permits removing a value from
880 .lita thus saving GP relative space.
881
882 We do not these optimizations. To do them we would need
883 to arrange to link the .lita section first, so that by
884 the time we got here we would know the final values to
885 use. This would not be particularly difficult, but it is
886 not currently implemented. */
887
888 {
889 unsigned long insn;
890
891 /* I believe that the LITERAL reloc will only apply to a
892 ldq or ldl instruction, so check my assumption. */
893 insn = bfd_get_32 (input_bfd, data + rel->address);
894 BFD_ASSERT (((insn >> 26) & 0x3f) == 0x29
895 || ((insn >> 26) & 0x3f) == 0x28);
896
897 rel->addend -= gp;
898 r = bfd_perform_relocation (input_bfd, rel, data, input_section,
899 output_bfd, &err);
900 if (r == bfd_reloc_ok && gp_undefined)
901 {
902 r = bfd_reloc_dangerous;
903 err =
904 (char *) _("GP relative relocation used when GP not defined");
905 }
906 }
907 break;
908
909 case ALPHA_R_LITUSE:
910 /* See ALPHA_R_LITERAL above for the uses of this reloc. It
911 does not cause anything to happen, itself. */
912 rel->address += input_section->output_offset;
913 break;
914
915 case ALPHA_R_GPDISP:
916 /* This marks the ldah of an ldah/lda pair which loads the
917 gp register with the difference of the gp value and the
918 current location. The second of the pair is r_size bytes
919 ahead; it used to be marked with an ALPHA_R_IGNORE reloc,
920 but that no longer happens in OSF/1 3.2. */
921 {
922 unsigned long insn1, insn2;
923 bfd_vma addend;
924
925 /* Get the two instructions. */
926 insn1 = bfd_get_32 (input_bfd, data + rel->address);
927 insn2 = bfd_get_32 (input_bfd, data + rel->address + rel->addend);
928
929 BFD_ASSERT (((insn1 >> 26) & 0x3f) == 0x09); /* ldah */
930 BFD_ASSERT (((insn2 >> 26) & 0x3f) == 0x08); /* lda */
931
932 /* Get the existing addend. We must account for the sign
933 extension done by lda and ldah. */
934 addend = ((insn1 & 0xffff) << 16) + (insn2 & 0xffff);
935 if (insn1 & 0x8000)
936 {
937 addend -= 0x80000000;
938 addend -= 0x80000000;
939 }
940 if (insn2 & 0x8000)
941 addend -= 0x10000;
942
943 /* The existing addend includes the different between the
944 gp of the input BFD and the address in the input BFD.
945 Subtract this out. */
946 addend -= (ecoff_data (input_bfd)->gp
947 - (input_section->vma + rel->address));
948
949 /* Now add in the final gp value, and subtract out the
950 final address. */
951 addend += (gp
952 - (input_section->output_section->vma
953 + input_section->output_offset
954 + rel->address));
955
956 /* Change the instructions, accounting for the sign
957 extension, and write them out. */
958 if (addend & 0x8000)
959 addend += 0x10000;
960 insn1 = (insn1 & 0xffff0000) | ((addend >> 16) & 0xffff);
961 insn2 = (insn2 & 0xffff0000) | (addend & 0xffff);
962
963 bfd_put_32 (input_bfd, (bfd_vma) insn1, data + rel->address);
964 bfd_put_32 (input_bfd, (bfd_vma) insn2,
965 data + rel->address + rel->addend);
966
967 rel->address += input_section->output_offset;
968 }
969 break;
970
971 case ALPHA_R_OP_PUSH:
972 /* Push a value on the reloc evaluation stack. */
973 {
974 asymbol *symbol;
975 bfd_vma relocation;
976
977 if (relocatable)
978 {
979 rel->address += input_section->output_offset;
980 break;
981 }
982
983 /* Figure out the relocation of this symbol. */
984 symbol = *rel->sym_ptr_ptr;
985
986 if (bfd_is_und_section (symbol->section))
987 r = bfd_reloc_undefined;
988
989 if (bfd_is_com_section (symbol->section))
990 relocation = 0;
991 else
992 relocation = symbol->value;
993 relocation += symbol->section->output_section->vma;
994 relocation += symbol->section->output_offset;
995 relocation += rel->addend;
996
997 if (tos >= RELOC_STACKSIZE)
998 {
999 r = bfd_reloc_notsupported;
1000 break;
1001 }
1002
1003 stack[tos++] = relocation;
1004 }
1005 break;
1006
1007 case ALPHA_R_OP_STORE:
1008 /* Store a value from the reloc stack into a bitfield. */
1009 {
1010 bfd_vma val;
1011 int offset, size;
1012
1013 if (relocatable)
1014 {
1015 rel->address += input_section->output_offset;
1016 break;
1017 }
1018
1019 if (tos == 0)
1020 {
1021 r = bfd_reloc_notsupported;
1022 break;
1023 }
1024
1025 /* The offset and size for this reloc are encoded into the
1026 addend field by alpha_adjust_reloc_in. */
1027 offset = (rel->addend >> 8) & 0xff;
1028 size = rel->addend & 0xff;
1029
1030 val = bfd_get_64 (abfd, data + rel->address);
1031 val &=~ (((1 << size) - 1) << offset);
1032 val |= (stack[--tos] & ((1 << size) - 1)) << offset;
1033 bfd_put_64 (abfd, val, data + rel->address);
1034 }
1035 break;
1036
1037 case ALPHA_R_OP_PSUB:
1038 /* Subtract a value from the top of the stack. */
1039 {
1040 asymbol *symbol;
1041 bfd_vma relocation;
1042
1043 if (relocatable)
1044 {
1045 rel->address += input_section->output_offset;
1046 break;
1047 }
1048
1049 /* Figure out the relocation of this symbol. */
1050 symbol = *rel->sym_ptr_ptr;
1051
1052 if (bfd_is_und_section (symbol->section))
1053 r = bfd_reloc_undefined;
1054
1055 if (bfd_is_com_section (symbol->section))
1056 relocation = 0;
1057 else
1058 relocation = symbol->value;
1059 relocation += symbol->section->output_section->vma;
1060 relocation += symbol->section->output_offset;
1061 relocation += rel->addend;
1062
1063 if (tos == 0)
1064 {
1065 r = bfd_reloc_notsupported;
1066 break;
1067 }
1068
1069 stack[tos - 1] -= relocation;
1070 }
1071 break;
1072
1073 case ALPHA_R_OP_PRSHIFT:
1074 /* Shift the value on the top of the stack. */
1075 {
1076 asymbol *symbol;
1077 bfd_vma relocation;
1078
1079 if (relocatable)
1080 {
1081 rel->address += input_section->output_offset;
1082 break;
1083 }
1084
1085 /* Figure out the relocation of this symbol. */
1086 symbol = *rel->sym_ptr_ptr;
1087
1088 if (bfd_is_und_section (symbol->section))
1089 r = bfd_reloc_undefined;
1090
1091 if (bfd_is_com_section (symbol->section))
1092 relocation = 0;
1093 else
1094 relocation = symbol->value;
1095 relocation += symbol->section->output_section->vma;
1096 relocation += symbol->section->output_offset;
1097 relocation += rel->addend;
1098
1099 if (tos == 0)
1100 {
1101 r = bfd_reloc_notsupported;
1102 break;
1103 }
1104
1105 stack[tos - 1] >>= relocation;
1106 }
1107 break;
1108
1109 case ALPHA_R_GPVALUE:
1110 /* I really don't know if this does the right thing. */
1111 gp = rel->addend;
1112 gp_undefined = false;
1113 break;
1114
1115 default:
1116 r = bfd_reloc_notsupported;
1117 break;
1118 }
1119
1120 if (relocatable)
1121 {
1122 asection *os = input_section->output_section;
1123
1124 /* A partial link, so keep the relocs. */
1125 os->orelocation[os->reloc_count] = rel;
1126 os->reloc_count++;
1127 }
1128
1129 if (r != bfd_reloc_ok)
1130 {
1131 switch (r)
1132 {
1133 case bfd_reloc_undefined:
1134 (*link_info->callbacks->undefined_symbol)
1135 (link_info, bfd_asymbol_name (*rel->sym_ptr_ptr),
1136 input_bfd, input_section, rel->address, true);
1137 break;
1138 case bfd_reloc_dangerous:
1139 (*link_info->callbacks->reloc_dangerous)
1140 (link_info, err, input_bfd, input_section, rel->address);
1141 break;
1142 case bfd_reloc_overflow:
1143 (*link_info->callbacks->reloc_overflow)
1144 (link_info, NULL, bfd_asymbol_name (*rel->sym_ptr_ptr),
1145 rel->howto->name, rel->addend, input_bfd,
1146 input_section, rel->address);
1147 break;
1148 case bfd_reloc_outofrange:
1149 (*link_info->callbacks->einfo)
1150 /* xgettext:c-format */
1151 (_("%X%P: %pB(%pA): relocation \"%pR\" goes out of range\n"),
1152 abfd, input_section, rel);
1153 goto error_return;
1154 case bfd_reloc_notsupported:
1155 (*link_info->callbacks->einfo)
1156 /* xgettext:c-format */
1157 (_("%X%P: %pB(%pA): relocation \"%pR\" is not supported\n"),
1158 abfd, input_section, rel);
1159 goto error_return;
1160 default:
1161 (*link_info->callbacks->einfo)
1162 /* xgettext:c-format */
1163 (_("%X%P: %pB(%pA): relocation \"%pR\""
1164 " returns an unrecognized value %x\n"),
1165 abfd, input_section, rel, r);
1166 break;
1167 }
1168 }
1169 }
1170
1171 if (tos != 0)
1172 goto error_return;
1173
1174 successful_return:
1175 free (reloc_vector);
1176 return data;
1177
1178 error_return:
1179 free (reloc_vector);
1180 if (orig_data == NULL)
1181 free (data);
1182 return NULL;
1183 }
1184
1185 /* Get the howto structure for a generic reloc type. */
1186
1187 static reloc_howto_type *
1188 alpha_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1189 bfd_reloc_code_real_type code)
1190 {
1191 int alpha_type;
1192
1193 switch (code)
1194 {
1195 case BFD_RELOC_32:
1196 alpha_type = ALPHA_R_REFLONG;
1197 break;
1198 case BFD_RELOC_64:
1199 case BFD_RELOC_CTOR:
1200 alpha_type = ALPHA_R_REFQUAD;
1201 break;
1202 case BFD_RELOC_GPREL32:
1203 alpha_type = ALPHA_R_GPREL32;
1204 break;
1205 case BFD_RELOC_ALPHA_LITERAL:
1206 alpha_type = ALPHA_R_LITERAL;
1207 break;
1208 case BFD_RELOC_ALPHA_LITUSE:
1209 alpha_type = ALPHA_R_LITUSE;
1210 break;
1211 case BFD_RELOC_ALPHA_GPDISP_HI16:
1212 alpha_type = ALPHA_R_GPDISP;
1213 break;
1214 case BFD_RELOC_ALPHA_GPDISP_LO16:
1215 alpha_type = ALPHA_R_IGNORE;
1216 break;
1217 case BFD_RELOC_23_PCREL_S2:
1218 alpha_type = ALPHA_R_BRADDR;
1219 break;
1220 case BFD_RELOC_ALPHA_HINT:
1221 alpha_type = ALPHA_R_HINT;
1222 break;
1223 case BFD_RELOC_16_PCREL:
1224 alpha_type = ALPHA_R_SREL16;
1225 break;
1226 case BFD_RELOC_32_PCREL:
1227 alpha_type = ALPHA_R_SREL32;
1228 break;
1229 case BFD_RELOC_64_PCREL:
1230 alpha_type = ALPHA_R_SREL64;
1231 break;
1232 default:
1233 return (reloc_howto_type *) NULL;
1234 }
1235
1236 return &alpha_howto_table[alpha_type];
1237 }
1238
1239 static reloc_howto_type *
1240 alpha_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1241 const char *r_name)
1242 {
1243 unsigned int i;
1244
1245 for (i = 0;
1246 i < sizeof (alpha_howto_table) / sizeof (alpha_howto_table[0]);
1247 i++)
1248 if (alpha_howto_table[i].name != NULL
1249 && strcasecmp (alpha_howto_table[i].name, r_name) == 0)
1250 return &alpha_howto_table[i];
1251
1252 return NULL;
1253 }
1254 \f
1255 /* A helper routine for alpha_relocate_section which converts an
1256 external reloc when generating relocatable output. Returns the
1257 relocation amount. */
1258
1259 static bfd_vma
1260 alpha_convert_external_reloc (bfd *output_bfd ATTRIBUTE_UNUSED,
1261 struct bfd_link_info *info,
1262 bfd *input_bfd,
1263 struct external_reloc *ext_rel,
1264 struct ecoff_link_hash_entry *h)
1265 {
1266 unsigned long r_symndx;
1267 bfd_vma relocation;
1268
1269 BFD_ASSERT (bfd_link_relocatable (info));
1270
1271 if (h->root.type == bfd_link_hash_defined
1272 || h->root.type == bfd_link_hash_defweak)
1273 {
1274 asection *hsec;
1275 const char *name;
1276
1277 /* This symbol is defined in the output. Convert the reloc from
1278 being against the symbol to being against the section. */
1279
1280 /* Clear the r_extern bit. */
1281 ext_rel->r_bits[1] &=~ RELOC_BITS1_EXTERN_LITTLE;
1282
1283 /* Compute a new r_symndx value. */
1284 hsec = h->root.u.def.section;
1285 name = bfd_section_name (hsec->output_section);
1286
1287 r_symndx = (unsigned long) -1;
1288 switch (name[1])
1289 {
1290 case 'A':
1291 if (strcmp (name, "*ABS*") == 0)
1292 r_symndx = RELOC_SECTION_ABS;
1293 break;
1294 case 'b':
1295 if (strcmp (name, ".bss") == 0)
1296 r_symndx = RELOC_SECTION_BSS;
1297 break;
1298 case 'd':
1299 if (strcmp (name, ".data") == 0)
1300 r_symndx = RELOC_SECTION_DATA;
1301 break;
1302 case 'f':
1303 if (strcmp (name, ".fini") == 0)
1304 r_symndx = RELOC_SECTION_FINI;
1305 break;
1306 case 'i':
1307 if (strcmp (name, ".init") == 0)
1308 r_symndx = RELOC_SECTION_INIT;
1309 break;
1310 case 'l':
1311 if (strcmp (name, ".lita") == 0)
1312 r_symndx = RELOC_SECTION_LITA;
1313 else if (strcmp (name, ".lit8") == 0)
1314 r_symndx = RELOC_SECTION_LIT8;
1315 else if (strcmp (name, ".lit4") == 0)
1316 r_symndx = RELOC_SECTION_LIT4;
1317 break;
1318 case 'p':
1319 if (strcmp (name, ".pdata") == 0)
1320 r_symndx = RELOC_SECTION_PDATA;
1321 break;
1322 case 'r':
1323 if (strcmp (name, ".rdata") == 0)
1324 r_symndx = RELOC_SECTION_RDATA;
1325 else if (strcmp (name, ".rconst") == 0)
1326 r_symndx = RELOC_SECTION_RCONST;
1327 break;
1328 case 's':
1329 if (strcmp (name, ".sdata") == 0)
1330 r_symndx = RELOC_SECTION_SDATA;
1331 else if (strcmp (name, ".sbss") == 0)
1332 r_symndx = RELOC_SECTION_SBSS;
1333 break;
1334 case 't':
1335 if (strcmp (name, ".text") == 0)
1336 r_symndx = RELOC_SECTION_TEXT;
1337 break;
1338 case 'x':
1339 if (strcmp (name, ".xdata") == 0)
1340 r_symndx = RELOC_SECTION_XDATA;
1341 break;
1342 }
1343
1344 if (r_symndx == (unsigned long) -1)
1345 abort ();
1346
1347 /* Add the section VMA and the symbol value. */
1348 relocation = (h->root.u.def.value
1349 + hsec->output_section->vma
1350 + hsec->output_offset);
1351 }
1352 else
1353 {
1354 /* Change the symndx value to the right one for
1355 the output BFD. */
1356 r_symndx = h->indx;
1357 if (r_symndx == (unsigned long) -1)
1358 {
1359 /* Caller must give an error. */
1360 r_symndx = 0;
1361 }
1362 relocation = 0;
1363 }
1364
1365 /* Write out the new r_symndx value. */
1366 H_PUT_32 (input_bfd, r_symndx, ext_rel->r_symndx);
1367
1368 return relocation;
1369 }
1370
1371 /* Relocate a section while linking an Alpha ECOFF file. This is
1372 quite similar to get_relocated_section_contents. Perhaps they
1373 could be combined somehow. */
1374
1375 static bool
1376 alpha_relocate_section (bfd *output_bfd,
1377 struct bfd_link_info *info,
1378 bfd *input_bfd,
1379 asection *input_section,
1380 bfd_byte *contents,
1381 void * external_relocs)
1382 {
1383 asection **symndx_to_section, *lita_sec;
1384 struct ecoff_link_hash_entry **sym_hashes;
1385 bfd_vma gp;
1386 bool gp_undefined;
1387 bfd_vma stack[RELOC_STACKSIZE];
1388 int tos = 0;
1389 struct external_reloc *ext_rel;
1390 struct external_reloc *ext_rel_end;
1391 bfd_size_type amt;
1392
1393 /* We keep a table mapping the symndx found in an internal reloc to
1394 the appropriate section. This is faster than looking up the
1395 section by name each time. */
1396 symndx_to_section = ecoff_data (input_bfd)->symndx_to_section;
1397 if (symndx_to_section == (asection **) NULL)
1398 {
1399 amt = NUM_RELOC_SECTIONS * sizeof (asection *);
1400 symndx_to_section = (asection **) bfd_alloc (input_bfd, amt);
1401 if (!symndx_to_section)
1402 return false;
1403
1404 symndx_to_section[RELOC_SECTION_NONE] = NULL;
1405 symndx_to_section[RELOC_SECTION_TEXT] =
1406 bfd_get_section_by_name (input_bfd, ".text");
1407 symndx_to_section[RELOC_SECTION_RDATA] =
1408 bfd_get_section_by_name (input_bfd, ".rdata");
1409 symndx_to_section[RELOC_SECTION_DATA] =
1410 bfd_get_section_by_name (input_bfd, ".data");
1411 symndx_to_section[RELOC_SECTION_SDATA] =
1412 bfd_get_section_by_name (input_bfd, ".sdata");
1413 symndx_to_section[RELOC_SECTION_SBSS] =
1414 bfd_get_section_by_name (input_bfd, ".sbss");
1415 symndx_to_section[RELOC_SECTION_BSS] =
1416 bfd_get_section_by_name (input_bfd, ".bss");
1417 symndx_to_section[RELOC_SECTION_INIT] =
1418 bfd_get_section_by_name (input_bfd, ".init");
1419 symndx_to_section[RELOC_SECTION_LIT8] =
1420 bfd_get_section_by_name (input_bfd, ".lit8");
1421 symndx_to_section[RELOC_SECTION_LIT4] =
1422 bfd_get_section_by_name (input_bfd, ".lit4");
1423 symndx_to_section[RELOC_SECTION_XDATA] =
1424 bfd_get_section_by_name (input_bfd, ".xdata");
1425 symndx_to_section[RELOC_SECTION_PDATA] =
1426 bfd_get_section_by_name (input_bfd, ".pdata");
1427 symndx_to_section[RELOC_SECTION_FINI] =
1428 bfd_get_section_by_name (input_bfd, ".fini");
1429 symndx_to_section[RELOC_SECTION_LITA] =
1430 bfd_get_section_by_name (input_bfd, ".lita");
1431 symndx_to_section[RELOC_SECTION_ABS] = bfd_abs_section_ptr;
1432 symndx_to_section[RELOC_SECTION_RCONST] =
1433 bfd_get_section_by_name (input_bfd, ".rconst");
1434
1435 ecoff_data (input_bfd)->symndx_to_section = symndx_to_section;
1436 }
1437
1438 sym_hashes = ecoff_data (input_bfd)->sym_hashes;
1439
1440 /* On the Alpha, the .lita section must be addressable by the global
1441 pointer. To support large programs, we need to allow multiple
1442 global pointers. This works as long as each input .lita section
1443 is <64KB big. This implies that when producing relocatable
1444 output, the .lita section is limited to 64KB. . */
1445
1446 lita_sec = symndx_to_section[RELOC_SECTION_LITA];
1447 gp = _bfd_get_gp_value (output_bfd);
1448 if (! bfd_link_relocatable (info) && lita_sec != NULL)
1449 {
1450 struct ecoff_section_tdata *lita_sec_data;
1451
1452 /* Make sure we have a section data structure to which we can
1453 hang on to the gp value we pick for the section. */
1454 lita_sec_data = ecoff_section_data (input_bfd, lita_sec);
1455 if (lita_sec_data == NULL)
1456 {
1457 amt = sizeof (struct ecoff_section_tdata);
1458 lita_sec_data = ((struct ecoff_section_tdata *)
1459 bfd_zalloc (input_bfd, amt));
1460 lita_sec->used_by_bfd = lita_sec_data;
1461 }
1462
1463 if (lita_sec_data->gp != 0)
1464 {
1465 /* If we already assigned a gp to this section, we better
1466 stick with that value. */
1467 gp = lita_sec_data->gp;
1468 }
1469 else
1470 {
1471 bfd_vma lita_vma;
1472 bfd_size_type lita_size;
1473
1474 lita_vma = lita_sec->output_offset + lita_sec->output_section->vma;
1475 lita_size = lita_sec->size;
1476
1477 if (gp == 0
1478 || lita_vma < gp - 0x8000
1479 || lita_vma + lita_size >= gp + 0x8000)
1480 {
1481 /* Either gp hasn't been set at all or the current gp
1482 cannot address this .lita section. In both cases we
1483 reset the gp to point into the "middle" of the
1484 current input .lita section. */
1485 if (gp && !ecoff_data (output_bfd)->issued_multiple_gp_warning)
1486 {
1487 (*info->callbacks->warning) (info,
1488 _("using multiple gp values"),
1489 (char *) NULL, output_bfd,
1490 (asection *) NULL, (bfd_vma) 0);
1491 ecoff_data (output_bfd)->issued_multiple_gp_warning = true;
1492 }
1493 if (lita_vma < gp - 0x8000)
1494 gp = lita_vma + lita_size - 0x8000;
1495 else
1496 gp = lita_vma + 0x8000;
1497
1498 }
1499
1500 lita_sec_data->gp = gp;
1501 }
1502
1503 _bfd_set_gp_value (output_bfd, gp);
1504 }
1505
1506 gp_undefined = (gp == 0);
1507
1508 BFD_ASSERT (bfd_header_little_endian (output_bfd));
1509 BFD_ASSERT (bfd_header_little_endian (input_bfd));
1510
1511 ext_rel = (struct external_reloc *) external_relocs;
1512 ext_rel_end = ext_rel + input_section->reloc_count;
1513 for (; ext_rel < ext_rel_end; ext_rel++)
1514 {
1515 bfd_vma r_vaddr;
1516 unsigned long r_symndx;
1517 int r_type;
1518 int r_extern;
1519 int r_offset;
1520 int r_size;
1521 bool relocatep;
1522 bool adjust_addrp;
1523 bool gp_usedp;
1524 bfd_vma addend;
1525
1526 r_vaddr = H_GET_64 (input_bfd, ext_rel->r_vaddr);
1527 r_symndx = H_GET_32 (input_bfd, ext_rel->r_symndx);
1528
1529 r_type = ((ext_rel->r_bits[0] & RELOC_BITS0_TYPE_LITTLE)
1530 >> RELOC_BITS0_TYPE_SH_LITTLE);
1531 r_extern = (ext_rel->r_bits[1] & RELOC_BITS1_EXTERN_LITTLE) != 0;
1532 r_offset = ((ext_rel->r_bits[1] & RELOC_BITS1_OFFSET_LITTLE)
1533 >> RELOC_BITS1_OFFSET_SH_LITTLE);
1534 /* Ignored the reserved bits. */
1535 r_size = ((ext_rel->r_bits[3] & RELOC_BITS3_SIZE_LITTLE)
1536 >> RELOC_BITS3_SIZE_SH_LITTLE);
1537
1538 relocatep = false;
1539 adjust_addrp = true;
1540 gp_usedp = false;
1541 addend = 0;
1542
1543 switch (r_type)
1544 {
1545 case ALPHA_R_GPRELHIGH:
1546 _bfd_error_handler (_("%pB: %s unsupported"),
1547 input_bfd, "ALPHA_R_GPRELHIGH");
1548 bfd_set_error (bfd_error_bad_value);
1549 continue;
1550
1551 case ALPHA_R_GPRELLOW:
1552 _bfd_error_handler (_("%pB: %s unsupported"),
1553 input_bfd, "ALPHA_R_GPRELLOW");
1554 bfd_set_error (bfd_error_bad_value);
1555 continue;
1556
1557 default:
1558 /* xgettext:c-format */
1559 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1560 input_bfd, (int) r_type);
1561 bfd_set_error (bfd_error_bad_value);
1562 continue;
1563
1564 case ALPHA_R_IGNORE:
1565 /* This reloc appears after a GPDISP reloc. On earlier
1566 versions of OSF/1, It marked the position of the second
1567 instruction to be altered by the GPDISP reloc, but it is
1568 not otherwise used for anything. For some reason, the
1569 address of the relocation does not appear to include the
1570 section VMA, unlike the other relocation types. */
1571 if (bfd_link_relocatable (info))
1572 H_PUT_64 (input_bfd, input_section->output_offset + r_vaddr,
1573 ext_rel->r_vaddr);
1574 adjust_addrp = false;
1575 break;
1576
1577 case ALPHA_R_REFLONG:
1578 case ALPHA_R_REFQUAD:
1579 case ALPHA_R_HINT:
1580 relocatep = true;
1581 break;
1582
1583 case ALPHA_R_BRADDR:
1584 case ALPHA_R_SREL16:
1585 case ALPHA_R_SREL32:
1586 case ALPHA_R_SREL64:
1587 if (r_extern)
1588 addend += - (r_vaddr + 4);
1589 relocatep = true;
1590 break;
1591
1592 case ALPHA_R_GPREL32:
1593 /* This relocation is used in a switch table. It is a 32
1594 bit offset from the current GP value. We must adjust it
1595 by the different between the original GP value and the
1596 current GP value. */
1597 relocatep = true;
1598 addend = ecoff_data (input_bfd)->gp - gp;
1599 gp_usedp = true;
1600 break;
1601
1602 case ALPHA_R_LITERAL:
1603 /* This is a reference to a literal value, generally
1604 (always?) in the .lita section. This is a 16 bit GP
1605 relative relocation. Sometimes the subsequent reloc is a
1606 LITUSE reloc, which indicates how this reloc is used.
1607 This sometimes permits rewriting the two instructions
1608 referred to by the LITERAL and the LITUSE into different
1609 instructions which do not refer to .lita. This can save
1610 a memory reference, and permits removing a value from
1611 .lita thus saving GP relative space.
1612
1613 We do not these optimizations. To do them we would need
1614 to arrange to link the .lita section first, so that by
1615 the time we got here we would know the final values to
1616 use. This would not be particularly difficult, but it is
1617 not currently implemented. */
1618
1619 /* I believe that the LITERAL reloc will only apply to a ldq
1620 or ldl instruction, so check my assumption. */
1621 {
1622 unsigned long insn;
1623
1624 insn = bfd_get_32 (input_bfd,
1625 contents + r_vaddr - input_section->vma);
1626 BFD_ASSERT (((insn >> 26) & 0x3f) == 0x29
1627 || ((insn >> 26) & 0x3f) == 0x28);
1628 }
1629
1630 relocatep = true;
1631 addend = ecoff_data (input_bfd)->gp - gp;
1632 gp_usedp = true;
1633 break;
1634
1635 case ALPHA_R_LITUSE:
1636 /* See ALPHA_R_LITERAL above for the uses of this reloc. It
1637 does not cause anything to happen, itself. */
1638 break;
1639
1640 case ALPHA_R_GPDISP:
1641 /* This marks the ldah of an ldah/lda pair which loads the
1642 gp register with the difference of the gp value and the
1643 current location. The second of the pair is r_symndx
1644 bytes ahead. It used to be marked with an ALPHA_R_IGNORE
1645 reloc, but OSF/1 3.2 no longer does that. */
1646 {
1647 unsigned long insn1, insn2;
1648
1649 /* Get the two instructions. */
1650 insn1 = bfd_get_32 (input_bfd,
1651 contents + r_vaddr - input_section->vma);
1652 insn2 = bfd_get_32 (input_bfd,
1653 (contents
1654 + r_vaddr
1655 - input_section->vma
1656 + r_symndx));
1657
1658 BFD_ASSERT (((insn1 >> 26) & 0x3f) == 0x09); /* ldah */
1659 BFD_ASSERT (((insn2 >> 26) & 0x3f) == 0x08); /* lda */
1660
1661 /* Get the existing addend. We must account for the sign
1662 extension done by lda and ldah. */
1663 addend = ((insn1 & 0xffff) << 16) + (insn2 & 0xffff);
1664 if (insn1 & 0x8000)
1665 {
1666 /* This is addend -= 0x100000000 without causing an
1667 integer overflow on a 32 bit host. */
1668 addend -= 0x80000000;
1669 addend -= 0x80000000;
1670 }
1671 if (insn2 & 0x8000)
1672 addend -= 0x10000;
1673
1674 /* The existing addend includes the difference between the
1675 gp of the input BFD and the address in the input BFD.
1676 We want to change this to the difference between the
1677 final GP and the final address. */
1678 addend += (gp
1679 - ecoff_data (input_bfd)->gp
1680 + input_section->vma
1681 - (input_section->output_section->vma
1682 + input_section->output_offset));
1683
1684 /* Change the instructions, accounting for the sign
1685 extension, and write them out. */
1686 if (addend & 0x8000)
1687 addend += 0x10000;
1688 insn1 = (insn1 & 0xffff0000) | ((addend >> 16) & 0xffff);
1689 insn2 = (insn2 & 0xffff0000) | (addend & 0xffff);
1690
1691 bfd_put_32 (input_bfd, (bfd_vma) insn1,
1692 contents + r_vaddr - input_section->vma);
1693 bfd_put_32 (input_bfd, (bfd_vma) insn2,
1694 contents + r_vaddr - input_section->vma + r_symndx);
1695
1696 gp_usedp = true;
1697 }
1698 break;
1699
1700 case ALPHA_R_OP_PUSH:
1701 case ALPHA_R_OP_PSUB:
1702 case ALPHA_R_OP_PRSHIFT:
1703 /* Manipulate values on the reloc evaluation stack. The
1704 r_vaddr field is not an address in input_section, it is
1705 the current value (including any addend) of the object
1706 being used. */
1707 if (! r_extern)
1708 {
1709 asection *s;
1710
1711 s = symndx_to_section[r_symndx];
1712 if (s == (asection *) NULL)
1713 abort ();
1714 addend = s->output_section->vma + s->output_offset - s->vma;
1715 }
1716 else
1717 {
1718 struct ecoff_link_hash_entry *h;
1719
1720 h = sym_hashes[r_symndx];
1721 if (h == (struct ecoff_link_hash_entry *) NULL)
1722 abort ();
1723
1724 if (! bfd_link_relocatable (info))
1725 {
1726 if (h->root.type == bfd_link_hash_defined
1727 || h->root.type == bfd_link_hash_defweak)
1728 addend = (h->root.u.def.value
1729 + h->root.u.def.section->output_section->vma
1730 + h->root.u.def.section->output_offset);
1731 else
1732 {
1733 /* Note that we pass the address as 0, since we
1734 do not have a meaningful number for the
1735 location within the section that is being
1736 relocated. */
1737 (*info->callbacks->undefined_symbol)
1738 (info, h->root.root.string, input_bfd,
1739 input_section, (bfd_vma) 0, true);
1740 addend = 0;
1741 }
1742 }
1743 else
1744 {
1745 if (h->root.type != bfd_link_hash_defined
1746 && h->root.type != bfd_link_hash_defweak
1747 && h->indx == -1)
1748 {
1749 /* This symbol is not being written out. Pass
1750 the address as 0, as with undefined_symbol,
1751 above. */
1752 (*info->callbacks->unattached_reloc)
1753 (info, h->root.root.string,
1754 input_bfd, input_section, (bfd_vma) 0);
1755 }
1756
1757 addend = alpha_convert_external_reloc (output_bfd, info,
1758 input_bfd,
1759 ext_rel, h);
1760 }
1761 }
1762
1763 addend += r_vaddr;
1764
1765 if (bfd_link_relocatable (info))
1766 {
1767 /* Adjust r_vaddr by the addend. */
1768 H_PUT_64 (input_bfd, addend, ext_rel->r_vaddr);
1769 }
1770 else
1771 {
1772 switch (r_type)
1773 {
1774 case ALPHA_R_OP_PUSH:
1775 if (tos >= RELOC_STACKSIZE)
1776 abort ();
1777 stack[tos++] = addend;
1778 break;
1779
1780 case ALPHA_R_OP_PSUB:
1781 if (tos == 0)
1782 abort ();
1783 stack[tos - 1] -= addend;
1784 break;
1785
1786 case ALPHA_R_OP_PRSHIFT:
1787 if (tos == 0)
1788 abort ();
1789 stack[tos - 1] >>= addend;
1790 break;
1791 }
1792 }
1793
1794 adjust_addrp = false;
1795 break;
1796
1797 case ALPHA_R_OP_STORE:
1798 /* Store a value from the reloc stack into a bitfield. If
1799 we are generating relocatable output, all we do is
1800 adjust the address of the reloc. */
1801 if (! bfd_link_relocatable (info))
1802 {
1803 bfd_vma mask;
1804 bfd_vma val;
1805
1806 if (tos == 0)
1807 abort ();
1808
1809 /* Get the relocation mask. The separate steps and the
1810 casts to bfd_vma are attempts to avoid a bug in the
1811 Alpha OSF 1.3 C compiler. See reloc.c for more
1812 details. */
1813 mask = 1;
1814 mask <<= (bfd_vma) r_size;
1815 mask -= 1;
1816
1817 /* FIXME: I don't know what kind of overflow checking,
1818 if any, should be done here. */
1819 val = bfd_get_64 (input_bfd,
1820 contents + r_vaddr - input_section->vma);
1821 val &=~ mask << (bfd_vma) r_offset;
1822 val |= (stack[--tos] & mask) << (bfd_vma) r_offset;
1823 bfd_put_64 (input_bfd, val,
1824 contents + r_vaddr - input_section->vma);
1825 }
1826 break;
1827
1828 case ALPHA_R_GPVALUE:
1829 /* I really don't know if this does the right thing. */
1830 gp = ecoff_data (input_bfd)->gp + r_symndx;
1831 gp_undefined = false;
1832 break;
1833 }
1834
1835 if (relocatep)
1836 {
1837 reloc_howto_type *howto;
1838 struct ecoff_link_hash_entry *h = NULL;
1839 asection *s = NULL;
1840 bfd_vma relocation;
1841 bfd_reloc_status_type r;
1842
1843 /* Perform a relocation. */
1844
1845 howto = &alpha_howto_table[r_type];
1846
1847 if (r_extern)
1848 {
1849 h = sym_hashes[r_symndx];
1850 /* If h is NULL, that means that there is a reloc
1851 against an external symbol which we thought was just
1852 a debugging symbol. This should not happen. */
1853 if (h == (struct ecoff_link_hash_entry *) NULL)
1854 abort ();
1855 }
1856 else
1857 {
1858 if (r_symndx >= NUM_RELOC_SECTIONS)
1859 s = NULL;
1860 else
1861 s = symndx_to_section[r_symndx];
1862
1863 if (s == (asection *) NULL)
1864 abort ();
1865 }
1866
1867 if (bfd_link_relocatable (info))
1868 {
1869 /* We are generating relocatable output, and must
1870 convert the existing reloc. */
1871 if (r_extern)
1872 {
1873 if (h->root.type != bfd_link_hash_defined
1874 && h->root.type != bfd_link_hash_defweak
1875 && h->indx == -1)
1876 {
1877 /* This symbol is not being written out. */
1878 (*info->callbacks->unattached_reloc)
1879 (info, h->root.root.string, input_bfd,
1880 input_section, r_vaddr - input_section->vma);
1881 }
1882
1883 relocation = alpha_convert_external_reloc (output_bfd,
1884 info,
1885 input_bfd,
1886 ext_rel,
1887 h);
1888 }
1889 else
1890 {
1891 /* This is a relocation against a section. Adjust
1892 the value by the amount the section moved. */
1893 relocation = (s->output_section->vma
1894 + s->output_offset
1895 - s->vma);
1896 }
1897
1898 /* If this is PC relative, the existing object file
1899 appears to already have the reloc worked out. We
1900 must subtract out the old value and add in the new
1901 one. */
1902 if (howto->pc_relative)
1903 relocation -= (input_section->output_section->vma
1904 + input_section->output_offset
1905 - input_section->vma);
1906
1907 /* Put in any addend. */
1908 relocation += addend;
1909
1910 /* Adjust the contents. */
1911 r = _bfd_relocate_contents (howto, input_bfd, relocation,
1912 (contents
1913 + r_vaddr
1914 - input_section->vma));
1915 }
1916 else
1917 {
1918 /* We are producing a final executable. */
1919 if (r_extern)
1920 {
1921 /* This is a reloc against a symbol. */
1922 if (h->root.type == bfd_link_hash_defined
1923 || h->root.type == bfd_link_hash_defweak)
1924 {
1925 asection *hsec;
1926
1927 hsec = h->root.u.def.section;
1928 relocation = (h->root.u.def.value
1929 + hsec->output_section->vma
1930 + hsec->output_offset);
1931 }
1932 else
1933 {
1934 (*info->callbacks->undefined_symbol)
1935 (info, h->root.root.string, input_bfd, input_section,
1936 r_vaddr - input_section->vma, true);
1937 relocation = 0;
1938 }
1939 }
1940 else
1941 {
1942 /* This is a reloc against a section. */
1943 relocation = (s->output_section->vma
1944 + s->output_offset
1945 - s->vma);
1946
1947 /* Adjust a PC relative relocation by removing the
1948 reference to the original source section. */
1949 if (howto->pc_relative)
1950 relocation += input_section->vma;
1951 }
1952
1953 r = _bfd_final_link_relocate (howto,
1954 input_bfd,
1955 input_section,
1956 contents,
1957 r_vaddr - input_section->vma,
1958 relocation,
1959 addend);
1960 }
1961
1962 if (r != bfd_reloc_ok)
1963 {
1964 switch (r)
1965 {
1966 default:
1967 case bfd_reloc_outofrange:
1968 abort ();
1969 case bfd_reloc_overflow:
1970 {
1971 const char *name;
1972
1973 if (r_extern)
1974 name = sym_hashes[r_symndx]->root.root.string;
1975 else
1976 name = bfd_section_name (symndx_to_section[r_symndx]);
1977 (*info->callbacks->reloc_overflow)
1978 (info, NULL, name, alpha_howto_table[r_type].name,
1979 (bfd_vma) 0, input_bfd, input_section,
1980 r_vaddr - input_section->vma);
1981 }
1982 break;
1983 }
1984 }
1985 }
1986
1987 if (bfd_link_relocatable (info) && adjust_addrp)
1988 {
1989 /* Change the address of the relocation. */
1990 H_PUT_64 (input_bfd,
1991 (input_section->output_section->vma
1992 + input_section->output_offset
1993 - input_section->vma
1994 + r_vaddr),
1995 ext_rel->r_vaddr);
1996 }
1997
1998 if (gp_usedp && gp_undefined)
1999 {
2000 (*info->callbacks->reloc_dangerous)
2001 (info, _("GP relative relocation used when GP not defined"),
2002 input_bfd, input_section, r_vaddr - input_section->vma);
2003 /* Only give the error once per link. */
2004 gp = 4;
2005 _bfd_set_gp_value (output_bfd, gp);
2006 gp_undefined = false;
2007 }
2008 }
2009
2010 if (tos != 0)
2011 abort ();
2012
2013 return true;
2014 }
2015 \f
2016 /* Do final adjustments to the filehdr and the aouthdr. This routine
2017 sets the dynamic bits in the file header. */
2018
2019 static bool
2020 alpha_adjust_headers (bfd *abfd,
2021 struct internal_filehdr *fhdr,
2022 struct internal_aouthdr *ahdr ATTRIBUTE_UNUSED)
2023 {
2024 if ((abfd->flags & (DYNAMIC | EXEC_P)) == (DYNAMIC | EXEC_P))
2025 fhdr->f_flags |= F_ALPHA_CALL_SHARED;
2026 else if ((abfd->flags & DYNAMIC) != 0)
2027 fhdr->f_flags |= F_ALPHA_SHARABLE;
2028 return true;
2029 }
2030 \f
2031 /* Archive handling. In OSF/1 (or Digital Unix) v3.2, Digital
2032 introduced archive packing, in which the elements in an archive are
2033 optionally compressed using a simple dictionary scheme. We know
2034 how to read such archives, but we don't write them. */
2035
2036 #define alpha_ecoff_slurp_armap _bfd_ecoff_slurp_armap
2037 #define alpha_ecoff_slurp_extended_name_table \
2038 _bfd_ecoff_slurp_extended_name_table
2039 #define alpha_ecoff_construct_extended_name_table \
2040 _bfd_ecoff_construct_extended_name_table
2041 #define alpha_ecoff_truncate_arname _bfd_ecoff_truncate_arname
2042 #define alpha_ecoff_write_armap _bfd_ecoff_write_armap
2043 #define alpha_ecoff_write_ar_hdr _bfd_generic_write_ar_hdr
2044 #define alpha_ecoff_generic_stat_arch_elt _bfd_ecoff_generic_stat_arch_elt
2045 #define alpha_ecoff_update_armap_timestamp _bfd_ecoff_update_armap_timestamp
2046
2047 /* A compressed file uses this instead of ARFMAG. */
2048
2049 #define ARFZMAG "Z\012"
2050
2051 /* Read an archive header. This is like the standard routine, but it
2052 also accepts ARFZMAG. */
2053
2054 static void *
2055 alpha_ecoff_read_ar_hdr (bfd *abfd)
2056 {
2057 struct areltdata *ret;
2058 struct ar_hdr *h;
2059
2060 ret = (struct areltdata *) _bfd_generic_read_ar_hdr_mag (abfd, ARFZMAG);
2061 if (ret == NULL)
2062 return NULL;
2063
2064 h = (struct ar_hdr *) ret->arch_header;
2065 if (strncmp (h->ar_fmag, ARFZMAG, 2) == 0)
2066 {
2067 bfd_byte ab[8];
2068
2069 /* This is a compressed file. We must set the size correctly.
2070 The size is the eight bytes after the dummy file header. */
2071 if (bfd_seek (abfd, FILHSZ, SEEK_CUR) != 0
2072 || bfd_read (ab, 8, abfd) != 8
2073 || bfd_seek (abfd, -(FILHSZ + 8), SEEK_CUR) != 0)
2074 {
2075 free (ret);
2076 return NULL;
2077 }
2078
2079 ret->parsed_size = H_GET_64 (abfd, ab);
2080 }
2081
2082 return ret;
2083 }
2084
2085 /* Get an archive element at a specified file position. This is where
2086 we uncompress the archive element if necessary. */
2087
2088 static bfd *
2089 alpha_ecoff_get_elt_at_filepos (bfd *archive, file_ptr filepos,
2090 struct bfd_link_info *info)
2091 {
2092 bfd *nbfd = NULL;
2093 struct areltdata *tdata;
2094 struct ar_hdr *hdr;
2095 bfd_byte ab[8];
2096 bfd_size_type size;
2097 bfd_byte *buf, *p;
2098 struct bfd_in_memory *bim;
2099 ufile_ptr filesize;
2100
2101 buf = NULL;
2102 nbfd = _bfd_get_elt_at_filepos (archive, filepos, info);
2103 if (nbfd == NULL)
2104 goto error_return;
2105
2106 if ((nbfd->flags & BFD_IN_MEMORY) != 0)
2107 {
2108 /* We have already expanded this BFD. */
2109 return nbfd;
2110 }
2111
2112 tdata = (struct areltdata *) nbfd->arelt_data;
2113 hdr = (struct ar_hdr *) tdata->arch_header;
2114 if (strncmp (hdr->ar_fmag, ARFZMAG, 2) != 0)
2115 return nbfd;
2116
2117 /* We must uncompress this element. We do this by copying it into a
2118 memory buffer, and making bfd_read and bfd_seek use that buffer.
2119 This can use a lot of memory, but it's simpler than getting a
2120 temporary file, making that work with the file descriptor caching
2121 code, and making sure that it is deleted at all appropriate
2122 times. It can be changed if it ever becomes important. */
2123
2124 /* The compressed file starts with a dummy ECOFF file header. */
2125 if (bfd_seek (nbfd, FILHSZ, SEEK_SET) != 0)
2126 goto error_return;
2127
2128 /* The next eight bytes are the real file size. */
2129 if (bfd_read (ab, 8, nbfd) != 8)
2130 goto error_return;
2131 size = H_GET_64 (nbfd, ab);
2132
2133 /* The decompression algorithm will at most expand by eight times. */
2134 filesize = bfd_get_file_size (archive);
2135 if (filesize != 0 && size / 8 > filesize)
2136 {
2137 bfd_set_error (bfd_error_malformed_archive);
2138 goto error_return;
2139 }
2140
2141 if (size != 0)
2142 {
2143 bfd_size_type left;
2144 bfd_byte dict[4096];
2145 unsigned int h;
2146 bfd_byte b;
2147
2148 buf = (bfd_byte *) bfd_malloc (size);
2149 if (buf == NULL)
2150 goto error_return;
2151 p = buf;
2152
2153 left = size;
2154
2155 /* I don't know what the next eight bytes are for. */
2156 if (bfd_read (ab, 8, nbfd) != 8)
2157 goto error_return;
2158
2159 /* This is the uncompression algorithm. It's a simple
2160 dictionary based scheme in which each character is predicted
2161 by a hash of the previous three characters. A control byte
2162 indicates whether the character is predicted or whether it
2163 appears in the input stream; each control byte manages the
2164 next eight bytes in the output stream. */
2165 memset (dict, 0, sizeof dict);
2166 h = 0;
2167 while (bfd_read (&b, 1, nbfd) == 1)
2168 {
2169 unsigned int i;
2170
2171 for (i = 0; i < 8; i++, b >>= 1)
2172 {
2173 bfd_byte n;
2174
2175 if ((b & 1) == 0)
2176 n = dict[h];
2177 else
2178 {
2179 if (bfd_read (&n, 1, nbfd) != 1)
2180 goto error_return;
2181 dict[h] = n;
2182 }
2183
2184 *p++ = n;
2185
2186 --left;
2187 if (left == 0)
2188 break;
2189
2190 h <<= 4;
2191 h ^= n;
2192 h &= sizeof dict - 1;
2193 }
2194
2195 if (left == 0)
2196 break;
2197 }
2198 }
2199
2200 /* Now the uncompressed file contents are in buf. */
2201 bim = ((struct bfd_in_memory *)
2202 bfd_malloc ((bfd_size_type) sizeof (struct bfd_in_memory)));
2203 if (bim == NULL)
2204 goto error_return;
2205 bim->size = size;
2206 bim->buffer = buf;
2207
2208 nbfd->mtime_set = true;
2209 nbfd->mtime = strtol (hdr->ar_date, (char **) NULL, 10);
2210
2211 nbfd->flags |= BFD_IN_MEMORY;
2212 nbfd->iostream = bim;
2213 nbfd->iovec = &_bfd_memory_iovec;
2214 nbfd->origin = 0;
2215 nbfd->size = 0;
2216 BFD_ASSERT (! nbfd->cacheable);
2217
2218 return nbfd;
2219
2220 error_return:
2221 free (buf);
2222 if (nbfd != NULL)
2223 bfd_close (nbfd);
2224 return NULL;
2225 }
2226
2227 /* Open the next archived file. */
2228
2229 static bfd *
2230 alpha_ecoff_openr_next_archived_file (bfd *archive, bfd *last_file)
2231 {
2232 ufile_ptr filestart;
2233
2234 if (last_file == NULL)
2235 filestart = bfd_ardata (archive)->first_file_filepos;
2236 else
2237 {
2238 struct areltdata *t;
2239 struct ar_hdr *h;
2240 bfd_size_type size;
2241
2242 /* We can't use arelt_size here, because that uses parsed_size,
2243 which is the uncompressed size. We need the compressed size. */
2244 t = (struct areltdata *) last_file->arelt_data;
2245 h = (struct ar_hdr *) t->arch_header;
2246 size = strtol (h->ar_size, (char **) NULL, 10);
2247
2248 /* Pad to an even boundary...
2249 Note that last_file->origin can be odd in the case of
2250 BSD-4.4-style element with a long odd size. */
2251 filestart = last_file->proxy_origin + size;
2252 filestart += filestart % 2;
2253 if (filestart < last_file->proxy_origin)
2254 {
2255 /* Prevent looping. See PR19256. */
2256 bfd_set_error (bfd_error_malformed_archive);
2257 return NULL;
2258 }
2259 }
2260
2261 return alpha_ecoff_get_elt_at_filepos (archive, filestart, NULL);
2262 }
2263
2264 /* Open the archive file given an index into the armap. */
2265
2266 static bfd *
2267 alpha_ecoff_get_elt_at_index (bfd *abfd, symindex sym_index)
2268 {
2269 carsym *entry;
2270
2271 entry = bfd_ardata (abfd)->symdefs + sym_index;
2272 return alpha_ecoff_get_elt_at_filepos (abfd, entry->file_offset,
2273 NULL);
2274 }
2275
2276 static void
2277 alpha_ecoff_swap_coff_aux_in (bfd *abfd ATTRIBUTE_UNUSED,
2278 void *ext1 ATTRIBUTE_UNUSED,
2279 int type ATTRIBUTE_UNUSED,
2280 int in_class ATTRIBUTE_UNUSED,
2281 int indx ATTRIBUTE_UNUSED,
2282 int numaux ATTRIBUTE_UNUSED,
2283 void *in1 ATTRIBUTE_UNUSED)
2284 {
2285 }
2286
2287 static void
2288 alpha_ecoff_swap_coff_sym_in (bfd *abfd ATTRIBUTE_UNUSED,
2289 void *ext1 ATTRIBUTE_UNUSED,
2290 void *in1 ATTRIBUTE_UNUSED)
2291 {
2292 }
2293
2294 static void
2295 alpha_ecoff_swap_coff_lineno_in (bfd *abfd ATTRIBUTE_UNUSED,
2296 void *ext1 ATTRIBUTE_UNUSED,
2297 void *in1 ATTRIBUTE_UNUSED)
2298 {
2299 }
2300
2301 static unsigned int
2302 alpha_ecoff_swap_coff_aux_out (bfd *abfd ATTRIBUTE_UNUSED,
2303 void *inp ATTRIBUTE_UNUSED,
2304 int type ATTRIBUTE_UNUSED,
2305 int in_class ATTRIBUTE_UNUSED,
2306 int indx ATTRIBUTE_UNUSED,
2307 int numaux ATTRIBUTE_UNUSED,
2308 void *extp ATTRIBUTE_UNUSED)
2309 {
2310 return 0;
2311 }
2312
2313 static unsigned int
2314 alpha_ecoff_swap_coff_sym_out (bfd *abfd ATTRIBUTE_UNUSED,
2315 void *inp ATTRIBUTE_UNUSED,
2316 void *extp ATTRIBUTE_UNUSED)
2317 {
2318 return 0;
2319 }
2320
2321 static unsigned int
2322 alpha_ecoff_swap_coff_lineno_out (bfd *abfd ATTRIBUTE_UNUSED,
2323 void *inp ATTRIBUTE_UNUSED,
2324 void *extp ATTRIBUTE_UNUSED)
2325 {
2326 return 0;
2327 }
2328
2329 static unsigned int
2330 alpha_ecoff_swap_coff_reloc_out (bfd *abfd ATTRIBUTE_UNUSED,
2331 void *inp ATTRIBUTE_UNUSED,
2332 void *extp ATTRIBUTE_UNUSED)
2333 {
2334 return 0;
2335 }
2336 \f
2337 /* This is the ECOFF backend structure. The backend field of the
2338 target vector points to this. */
2339
2340 static const struct ecoff_backend_data alpha_ecoff_backend_data =
2341 {
2342 /* COFF backend structure. */
2343 {
2344 alpha_ecoff_swap_coff_aux_in, alpha_ecoff_swap_coff_sym_in,
2345 alpha_ecoff_swap_coff_lineno_in, alpha_ecoff_swap_coff_aux_out,
2346 alpha_ecoff_swap_coff_sym_out, alpha_ecoff_swap_coff_lineno_out,
2347 alpha_ecoff_swap_coff_reloc_out,
2348 alpha_ecoff_swap_filehdr_out, alpha_ecoff_swap_aouthdr_out,
2349 alpha_ecoff_swap_scnhdr_out,
2350 FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, FILNMLEN, true,
2351 ECOFF_NO_LONG_SECTION_NAMES, 4, false, 2, 32768,
2352 alpha_ecoff_swap_filehdr_in, alpha_ecoff_swap_aouthdr_in,
2353 alpha_ecoff_swap_scnhdr_in, NULL,
2354 alpha_ecoff_bad_format_hook, _bfd_ecoff_set_arch_mach_hook,
2355 alpha_ecoff_mkobject_hook, _bfd_ecoff_styp_to_sec_flags,
2356 _bfd_ecoff_set_alignment_hook, _bfd_ecoff_slurp_symbol_table,
2357 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
2358 NULL, NULL, NULL, NULL
2359 },
2360 /* Supported architecture. */
2361 bfd_arch_alpha,
2362 /* Initial portion of armap string. */
2363 "________64",
2364 /* The page boundary used to align sections in a demand-paged
2365 executable file. E.g., 0x1000. */
2366 0x2000,
2367 /* TRUE if the .rdata section is part of the text segment, as on the
2368 Alpha. FALSE if .rdata is part of the data segment, as on the
2369 MIPS. */
2370 true,
2371 /* Bitsize of constructor entries. */
2372 64,
2373 /* Reloc to use for constructor entries. */
2374 &alpha_howto_table[ALPHA_R_REFQUAD],
2375 {
2376 /* Symbol table magic number. */
2377 magicSym2,
2378 /* Alignment of debugging information. E.g., 4. */
2379 8,
2380 /* Sizes of external symbolic information. */
2381 sizeof (struct hdr_ext),
2382 sizeof (struct dnr_ext),
2383 sizeof (struct pdr_ext),
2384 sizeof (struct sym_ext),
2385 sizeof (struct opt_ext),
2386 sizeof (struct fdr_ext),
2387 sizeof (struct rfd_ext),
2388 sizeof (struct ext_ext),
2389 /* Functions to swap in external symbolic data. */
2390 ecoff_swap_hdr_in,
2391 ecoff_swap_dnr_in,
2392 ecoff_swap_pdr_in,
2393 ecoff_swap_sym_in,
2394 ecoff_swap_opt_in,
2395 ecoff_swap_fdr_in,
2396 ecoff_swap_rfd_in,
2397 ecoff_swap_ext_in,
2398 _bfd_ecoff_swap_tir_in,
2399 _bfd_ecoff_swap_rndx_in,
2400 /* Functions to swap out external symbolic data. */
2401 ecoff_swap_hdr_out,
2402 ecoff_swap_dnr_out,
2403 ecoff_swap_pdr_out,
2404 ecoff_swap_sym_out,
2405 ecoff_swap_opt_out,
2406 ecoff_swap_fdr_out,
2407 ecoff_swap_rfd_out,
2408 ecoff_swap_ext_out,
2409 _bfd_ecoff_swap_tir_out,
2410 _bfd_ecoff_swap_rndx_out,
2411 /* Function to read in symbolic data. */
2412 _bfd_ecoff_slurp_symbolic_info
2413 },
2414 /* External reloc size. */
2415 RELSZ,
2416 /* Reloc swapping functions. */
2417 alpha_ecoff_swap_reloc_in,
2418 alpha_ecoff_swap_reloc_out,
2419 /* Backend reloc tweaking. */
2420 alpha_adjust_reloc_in,
2421 alpha_adjust_reloc_out,
2422 /* Relocate section contents while linking. */
2423 alpha_relocate_section,
2424 /* Do final adjustments to filehdr and aouthdr. */
2425 alpha_adjust_headers,
2426 /* Read an element from an archive at a given file position. */
2427 alpha_ecoff_get_elt_at_filepos
2428 };
2429
2430 /* Looking up a reloc type is Alpha specific. */
2431 #define _bfd_ecoff_bfd_reloc_type_lookup alpha_bfd_reloc_type_lookup
2432 #define _bfd_ecoff_bfd_reloc_name_lookup \
2433 alpha_bfd_reloc_name_lookup
2434
2435 /* So is getting relocated section contents. */
2436 #define _bfd_ecoff_bfd_get_relocated_section_contents \
2437 alpha_ecoff_get_relocated_section_contents
2438
2439 /* Handling file windows is generic. */
2440 #define _bfd_ecoff_get_section_contents_in_window \
2441 _bfd_generic_get_section_contents_in_window
2442
2443 /* Input section flag lookup is generic. */
2444 #define _bfd_ecoff_bfd_lookup_section_flags bfd_generic_lookup_section_flags
2445
2446 /* Relaxing sections is generic. */
2447 #define _bfd_ecoff_bfd_relax_section bfd_generic_relax_section
2448 #define _bfd_ecoff_bfd_gc_sections bfd_generic_gc_sections
2449 #define _bfd_ecoff_bfd_merge_sections bfd_generic_merge_sections
2450 #define _bfd_ecoff_bfd_is_group_section bfd_generic_is_group_section
2451 #define _bfd_ecoff_bfd_group_name bfd_generic_group_name
2452 #define _bfd_ecoff_bfd_discard_group bfd_generic_discard_group
2453 #define _bfd_ecoff_section_already_linked \
2454 _bfd_coff_section_already_linked
2455 #define _bfd_ecoff_bfd_define_common_symbol bfd_generic_define_common_symbol
2456 #define _bfd_ecoff_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
2457 #define _bfd_ecoff_bfd_define_start_stop bfd_generic_define_start_stop
2458 #define _bfd_ecoff_bfd_link_check_relocs _bfd_generic_link_check_relocs
2459
2460 /* Installing internal relocations in a section is also generic. */
2461 #define _bfd_ecoff_set_reloc _bfd_generic_set_reloc
2462
2463 const bfd_target alpha_ecoff_le_vec =
2464 {
2465 "ecoff-littlealpha", /* name */
2466 bfd_target_ecoff_flavour,
2467 BFD_ENDIAN_LITTLE, /* data byte order is little */
2468 BFD_ENDIAN_LITTLE, /* header byte order is little */
2469
2470 (HAS_RELOC | EXEC_P /* object flags */
2471 | HAS_LINENO | HAS_DEBUG
2472 | HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
2473
2474 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE
2475 | SEC_DATA | SEC_SMALL_DATA),
2476 0, /* leading underscore */
2477 ' ', /* ar_pad_char */
2478 15, /* ar_max_namelen */
2479 0, /* match priority. */
2480 TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols. */
2481 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
2482 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
2483 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
2484 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
2485 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
2486 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
2487
2488 { /* bfd_check_format */
2489 _bfd_dummy_target,
2490 alpha_ecoff_object_p,
2491 bfd_generic_archive_p,
2492 _bfd_dummy_target
2493 },
2494 { /* bfd_set_format */
2495 _bfd_bool_bfd_false_error,
2496 _bfd_ecoff_mkobject,
2497 _bfd_generic_mkarchive,
2498 _bfd_bool_bfd_false_error
2499 },
2500 { /* bfd_write_contents */
2501 _bfd_bool_bfd_false_error,
2502 _bfd_ecoff_write_object_contents,
2503 _bfd_write_archive_contents,
2504 _bfd_bool_bfd_false_error
2505 },
2506
2507 BFD_JUMP_TABLE_GENERIC (_bfd_ecoff),
2508 BFD_JUMP_TABLE_COPY (_bfd_ecoff),
2509 BFD_JUMP_TABLE_CORE (_bfd_nocore),
2510 BFD_JUMP_TABLE_ARCHIVE (alpha_ecoff),
2511 BFD_JUMP_TABLE_SYMBOLS (_bfd_ecoff),
2512 BFD_JUMP_TABLE_RELOCS (_bfd_ecoff),
2513 BFD_JUMP_TABLE_WRITE (_bfd_ecoff),
2514 BFD_JUMP_TABLE_LINK (_bfd_ecoff),
2515 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
2516
2517 NULL,
2518
2519 &alpha_ecoff_backend_data
2520 };