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