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