elf64-mips.c revision 1.1 1 1.1 skrll /* MIPS-specific support for 64-bit ELF
2 1.1 skrll Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3 1.1 skrll 2007 Free Software Foundation, Inc.
4 1.1 skrll Ian Lance Taylor, Cygnus Support
5 1.1 skrll Linker support added by Mark Mitchell, CodeSourcery, LLC.
6 1.1 skrll <mark (at) codesourcery.com>
7 1.1 skrll
8 1.1 skrll This file is part of BFD, the Binary File Descriptor library.
9 1.1 skrll
10 1.1 skrll This program is free software; you can redistribute it and/or modify
11 1.1 skrll it under the terms of the GNU General Public License as published by
12 1.1 skrll the Free Software Foundation; either version 3 of the License, or
13 1.1 skrll (at your option) any later version.
14 1.1 skrll
15 1.1 skrll This program is distributed in the hope that it will be useful,
16 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
17 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 1.1 skrll GNU General Public License for more details.
19 1.1 skrll
20 1.1 skrll You should have received a copy of the GNU General Public License
21 1.1 skrll along with this program; if not, write to the Free Software
22 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23 1.1 skrll MA 02110-1301, USA. */
24 1.1 skrll
25 1.1 skrll
26 1.1 skrll /* This file supports the 64-bit MIPS ELF ABI.
27 1.1 skrll
28 1.1 skrll The MIPS 64-bit ELF ABI uses an unusual reloc format. This file
29 1.1 skrll overrides the usual ELF reloc handling, and handles reading and
30 1.1 skrll writing the relocations here. */
31 1.1 skrll
32 1.1 skrll /* TODO: Many things are unsupported, even if there is some code for it
33 1.1 skrll . (which was mostly stolen from elf32-mips.c and slightly adapted).
34 1.1 skrll .
35 1.1 skrll . - Relocation handling for REL relocs is wrong in many cases and
36 1.1 skrll . generally untested.
37 1.1 skrll . - Relocation handling for RELA relocs related to GOT support are
38 1.1 skrll . also likely to be wrong.
39 1.1 skrll . - Support for MIPS16 is untested.
40 1.1 skrll . - Combined relocs with RSS_* entries are unsupported.
41 1.1 skrll . - The whole GOT handling for NewABI is missing, some parts of
42 1.1 skrll . the OldABI version is still lying around and should be removed.
43 1.1 skrll */
44 1.1 skrll
45 1.1 skrll #include "sysdep.h"
46 1.1 skrll #include "bfd.h"
47 1.1 skrll #include "libbfd.h"
48 1.1 skrll #include "aout/ar.h"
49 1.1 skrll #include "bfdlink.h"
50 1.1 skrll #include "genlink.h"
51 1.1 skrll #include "elf-bfd.h"
52 1.1 skrll #include "elfxx-mips.h"
53 1.1 skrll #include "elf/mips.h"
54 1.1 skrll
55 1.1 skrll /* Get the ECOFF swapping routines. The 64-bit ABI is not supposed to
56 1.1 skrll use ECOFF. However, we support it anyhow for an easier changeover. */
57 1.1 skrll #include "coff/sym.h"
58 1.1 skrll #include "coff/symconst.h"
59 1.1 skrll #include "coff/internal.h"
60 1.1 skrll #include "coff/ecoff.h"
61 1.1 skrll /* The 64 bit versions of the mdebug data structures are in alpha.h. */
62 1.1 skrll #include "coff/alpha.h"
63 1.1 skrll #define ECOFF_SIGNED_64
64 1.1 skrll #include "ecoffswap.h"
65 1.1 skrll
66 1.1 skrll static void mips_elf64_swap_reloc_in
67 1.1 skrll (bfd *, const Elf64_Mips_External_Rel *, Elf64_Mips_Internal_Rela *);
68 1.1 skrll static void mips_elf64_swap_reloca_in
69 1.1 skrll (bfd *, const Elf64_Mips_External_Rela *, Elf64_Mips_Internal_Rela *);
70 1.1 skrll static void mips_elf64_swap_reloc_out
71 1.1 skrll (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rel *);
72 1.1 skrll static void mips_elf64_swap_reloca_out
73 1.1 skrll (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rela *);
74 1.1 skrll static void mips_elf64_be_swap_reloc_in
75 1.1 skrll (bfd *, const bfd_byte *, Elf_Internal_Rela *);
76 1.1 skrll static void mips_elf64_be_swap_reloc_out
77 1.1 skrll (bfd *, const Elf_Internal_Rela *, bfd_byte *);
78 1.1 skrll static void mips_elf64_be_swap_reloca_in
79 1.1 skrll (bfd *, const bfd_byte *, Elf_Internal_Rela *);
80 1.1 skrll static void mips_elf64_be_swap_reloca_out
81 1.1 skrll (bfd *, const Elf_Internal_Rela *, bfd_byte *);
82 1.1 skrll static reloc_howto_type *bfd_elf64_bfd_reloc_type_lookup
83 1.1 skrll (bfd *, bfd_reloc_code_real_type);
84 1.1 skrll static reloc_howto_type *mips_elf64_rtype_to_howto
85 1.1 skrll (unsigned int, bfd_boolean);
86 1.1 skrll static void mips_elf64_info_to_howto_rel
87 1.1 skrll (bfd *, arelent *, Elf_Internal_Rela *);
88 1.1 skrll static void mips_elf64_info_to_howto_rela
89 1.1 skrll (bfd *, arelent *, Elf_Internal_Rela *);
90 1.1 skrll static long mips_elf64_get_reloc_upper_bound
91 1.1 skrll (bfd *, asection *);
92 1.1 skrll static long mips_elf64_canonicalize_reloc
93 1.1 skrll (bfd *, asection *, arelent **, asymbol **);
94 1.1 skrll static long mips_elf64_get_dynamic_reloc_upper_bound
95 1.1 skrll (bfd *);
96 1.1 skrll static long mips_elf64_canonicalize_dynamic_reloc
97 1.1 skrll (bfd *, arelent **, asymbol **);
98 1.1 skrll static bfd_boolean mips_elf64_slurp_one_reloc_table
99 1.1 skrll (bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type, arelent *,
100 1.1 skrll asymbol **, bfd_boolean);
101 1.1 skrll static bfd_boolean mips_elf64_slurp_reloc_table
102 1.1 skrll (bfd *, asection *, asymbol **, bfd_boolean);
103 1.1 skrll static void mips_elf64_write_relocs
104 1.1 skrll (bfd *, asection *, void *);
105 1.1 skrll static void mips_elf64_write_rel
106 1.1 skrll (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
107 1.1 skrll static void mips_elf64_write_rela
108 1.1 skrll (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
109 1.1 skrll static bfd_reloc_status_type mips_elf64_gprel16_reloc
110 1.1 skrll (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
111 1.1 skrll static bfd_reloc_status_type mips_elf64_literal_reloc
112 1.1 skrll (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
113 1.1 skrll static bfd_reloc_status_type mips_elf64_gprel32_reloc
114 1.1 skrll (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
115 1.1 skrll static bfd_reloc_status_type mips_elf64_shift6_reloc
116 1.1 skrll (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
117 1.1 skrll static bfd_reloc_status_type mips16_gprel_reloc
118 1.1 skrll (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
119 1.1 skrll static bfd_boolean mips_elf64_assign_gp
120 1.1 skrll (bfd *, bfd_vma *);
121 1.1 skrll static bfd_reloc_status_type mips_elf64_final_gp
122 1.1 skrll (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
123 1.1 skrll static bfd_boolean mips_elf64_object_p
124 1.1 skrll (bfd *);
125 1.1 skrll static irix_compat_t elf64_mips_irix_compat
126 1.1 skrll (bfd *);
127 1.1 skrll static bfd_boolean elf64_mips_grok_prstatus
128 1.1 skrll (bfd *, Elf_Internal_Note *);
129 1.1 skrll static bfd_boolean elf64_mips_grok_psinfo
130 1.1 skrll (bfd *, Elf_Internal_Note *);
131 1.1 skrll
132 1.1 skrll extern const bfd_target bfd_elf64_bigmips_vec;
133 1.1 skrll extern const bfd_target bfd_elf64_littlemips_vec;
134 1.1 skrll
135 1.1 skrll /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
136 1.1 skrll from smaller values. Start with zero, widen, *then* decrement. */
137 1.1 skrll #define MINUS_ONE (((bfd_vma)0) - 1)
138 1.1 skrll
139 1.1 skrll /* The number of local .got entries we reserve. */
140 1.1 skrll #define MIPS_RESERVED_GOTNO (2)
141 1.1 skrll
142 1.1 skrll /* The relocation table used for SHT_REL sections. */
144 1.1 skrll
145 1.1 skrll static reloc_howto_type mips_elf64_howto_table_rel[] =
146 1.1 skrll {
147 1.1 skrll /* No relocation. */
148 1.1 skrll HOWTO (R_MIPS_NONE, /* type */
149 1.1 skrll 0, /* rightshift */
150 1.1 skrll 0, /* size (0 = byte, 1 = short, 2 = long) */
151 1.1 skrll 0, /* bitsize */
152 1.1 skrll FALSE, /* pc_relative */
153 1.1 skrll 0, /* bitpos */
154 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
155 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
156 1.1 skrll "R_MIPS_NONE", /* name */
157 1.1 skrll FALSE, /* partial_inplace */
158 1.1 skrll 0, /* src_mask */
159 1.1 skrll 0, /* dst_mask */
160 1.1 skrll FALSE), /* pcrel_offset */
161 1.1 skrll
162 1.1 skrll /* 16 bit relocation. */
163 1.1 skrll HOWTO (R_MIPS_16, /* type */
164 1.1 skrll 0, /* rightshift */
165 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
166 1.1 skrll 16, /* bitsize */
167 1.1 skrll FALSE, /* pc_relative */
168 1.1 skrll 0, /* bitpos */
169 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
170 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
171 1.1 skrll "R_MIPS_16", /* name */
172 1.1 skrll TRUE, /* partial_inplace */
173 1.1 skrll 0x0000ffff, /* src_mask */
174 1.1 skrll 0x0000ffff, /* dst_mask */
175 1.1 skrll FALSE), /* pcrel_offset */
176 1.1 skrll
177 1.1 skrll /* 32 bit relocation. */
178 1.1 skrll HOWTO (R_MIPS_32, /* type */
179 1.1 skrll 0, /* rightshift */
180 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
181 1.1 skrll 32, /* bitsize */
182 1.1 skrll FALSE, /* pc_relative */
183 1.1 skrll 0, /* bitpos */
184 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
185 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
186 1.1 skrll "R_MIPS_32", /* name */
187 1.1 skrll TRUE, /* partial_inplace */
188 1.1 skrll 0xffffffff, /* src_mask */
189 1.1 skrll 0xffffffff, /* dst_mask */
190 1.1 skrll FALSE), /* pcrel_offset */
191 1.1 skrll
192 1.1 skrll /* 32 bit symbol relative relocation. */
193 1.1 skrll HOWTO (R_MIPS_REL32, /* type */
194 1.1 skrll 0, /* rightshift */
195 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
196 1.1 skrll 32, /* bitsize */
197 1.1 skrll FALSE, /* pc_relative */
198 1.1 skrll 0, /* bitpos */
199 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
200 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
201 1.1 skrll "R_MIPS_REL32", /* name */
202 1.1 skrll TRUE, /* partial_inplace */
203 1.1 skrll 0xffffffff, /* src_mask */
204 1.1 skrll 0xffffffff, /* dst_mask */
205 1.1 skrll FALSE), /* pcrel_offset */
206 1.1 skrll
207 1.1 skrll /* 26 bit jump address. */
208 1.1 skrll HOWTO (R_MIPS_26, /* type */
209 1.1 skrll 2, /* rightshift */
210 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
211 1.1 skrll 26, /* bitsize */
212 1.1 skrll FALSE, /* pc_relative */
213 1.1 skrll 0, /* bitpos */
214 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
215 1.1 skrll /* This needs complex overflow
216 1.1 skrll detection, because the upper 36
217 1.1 skrll bits must match the PC + 4. */
218 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
219 1.1 skrll "R_MIPS_26", /* name */
220 1.1 skrll TRUE, /* partial_inplace */
221 1.1 skrll 0x03ffffff, /* src_mask */
222 1.1 skrll 0x03ffffff, /* dst_mask */
223 1.1 skrll FALSE), /* pcrel_offset */
224 1.1 skrll
225 1.1 skrll /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL.
226 1.1 skrll However, the native IRIX6 tools use them, so we try our best. */
227 1.1 skrll
228 1.1 skrll /* High 16 bits of symbol value. */
229 1.1 skrll HOWTO (R_MIPS_HI16, /* type */
230 1.1 skrll 16, /* rightshift */
231 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
232 1.1 skrll 16, /* bitsize */
233 1.1 skrll FALSE, /* pc_relative */
234 1.1 skrll 0, /* bitpos */
235 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
236 1.1 skrll _bfd_mips_elf_hi16_reloc, /* special_function */
237 1.1 skrll "R_MIPS_HI16", /* name */
238 1.1 skrll TRUE, /* partial_inplace */
239 1.1 skrll 0x0000ffff, /* src_mask */
240 1.1 skrll 0x0000ffff, /* dst_mask */
241 1.1 skrll FALSE), /* pcrel_offset */
242 1.1 skrll
243 1.1 skrll /* Low 16 bits of symbol value. */
244 1.1 skrll HOWTO (R_MIPS_LO16, /* type */
245 1.1 skrll 0, /* rightshift */
246 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
247 1.1 skrll 16, /* bitsize */
248 1.1 skrll FALSE, /* pc_relative */
249 1.1 skrll 0, /* bitpos */
250 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
251 1.1 skrll _bfd_mips_elf_lo16_reloc, /* special_function */
252 1.1 skrll "R_MIPS_LO16", /* name */
253 1.1 skrll TRUE, /* partial_inplace */
254 1.1 skrll 0x0000ffff, /* src_mask */
255 1.1 skrll 0x0000ffff, /* dst_mask */
256 1.1 skrll FALSE), /* pcrel_offset */
257 1.1 skrll
258 1.1 skrll /* GP relative reference. */
259 1.1 skrll HOWTO (R_MIPS_GPREL16, /* type */
260 1.1 skrll 0, /* rightshift */
261 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
262 1.1 skrll 16, /* bitsize */
263 1.1 skrll FALSE, /* pc_relative */
264 1.1 skrll 0, /* bitpos */
265 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
266 1.1 skrll mips_elf64_gprel16_reloc, /* special_function */
267 1.1 skrll "R_MIPS_GPREL16", /* name */
268 1.1 skrll TRUE, /* partial_inplace */
269 1.1 skrll 0x0000ffff, /* src_mask */
270 1.1 skrll 0x0000ffff, /* dst_mask */
271 1.1 skrll FALSE), /* pcrel_offset */
272 1.1 skrll
273 1.1 skrll /* Reference to literal section. */
274 1.1 skrll HOWTO (R_MIPS_LITERAL, /* type */
275 1.1 skrll 0, /* rightshift */
276 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
277 1.1 skrll 16, /* bitsize */
278 1.1 skrll FALSE, /* pc_relative */
279 1.1 skrll 0, /* bitpos */
280 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
281 1.1 skrll mips_elf64_literal_reloc, /* special_function */
282 1.1 skrll "R_MIPS_LITERAL", /* name */
283 1.1 skrll TRUE, /* partial_inplace */
284 1.1 skrll 0x0000ffff, /* src_mask */
285 1.1 skrll 0x0000ffff, /* dst_mask */
286 1.1 skrll FALSE), /* pcrel_offset */
287 1.1 skrll
288 1.1 skrll /* Reference to global offset table. */
289 1.1 skrll HOWTO (R_MIPS_GOT16, /* type */
290 1.1 skrll 0, /* rightshift */
291 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
292 1.1 skrll 16, /* bitsize */
293 1.1 skrll FALSE, /* pc_relative */
294 1.1 skrll 0, /* bitpos */
295 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
296 1.1 skrll _bfd_mips_elf_got16_reloc, /* special_function */
297 1.1 skrll "R_MIPS_GOT16", /* name */
298 1.1 skrll TRUE, /* partial_inplace */
299 1.1 skrll 0x0000ffff, /* src_mask */
300 1.1 skrll 0x0000ffff, /* dst_mask */
301 1.1 skrll FALSE), /* pcrel_offset */
302 1.1 skrll
303 1.1 skrll /* 16 bit PC relative reference. Note that the ABI document has a typo
304 1.1 skrll and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
305 1.1 skrll We do the right thing here. */
306 1.1 skrll HOWTO (R_MIPS_PC16, /* type */
307 1.1 skrll 2, /* rightshift */
308 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
309 1.1 skrll 16, /* bitsize */
310 1.1 skrll TRUE, /* pc_relative */
311 1.1 skrll 0, /* bitpos */
312 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
313 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
314 1.1 skrll "R_MIPS_PC16", /* name */
315 1.1 skrll TRUE, /* partial_inplace */
316 1.1 skrll 0x0000ffff, /* src_mask */
317 1.1 skrll 0x0000ffff, /* dst_mask */
318 1.1 skrll TRUE), /* pcrel_offset */
319 1.1 skrll
320 1.1 skrll /* 16 bit call through global offset table. */
321 1.1 skrll HOWTO (R_MIPS_CALL16, /* type */
322 1.1 skrll 0, /* rightshift */
323 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
324 1.1 skrll 16, /* bitsize */
325 1.1 skrll FALSE, /* pc_relative */
326 1.1 skrll 0, /* bitpos */
327 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
328 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
329 1.1 skrll "R_MIPS_CALL16", /* name */
330 1.1 skrll TRUE, /* partial_inplace */
331 1.1 skrll 0x0000ffff, /* src_mask */
332 1.1 skrll 0x0000ffff, /* dst_mask */
333 1.1 skrll FALSE), /* pcrel_offset */
334 1.1 skrll
335 1.1 skrll /* 32 bit GP relative reference. */
336 1.1 skrll HOWTO (R_MIPS_GPREL32, /* type */
337 1.1 skrll 0, /* rightshift */
338 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
339 1.1 skrll 32, /* bitsize */
340 1.1 skrll FALSE, /* pc_relative */
341 1.1 skrll 0, /* bitpos */
342 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
343 1.1 skrll mips_elf64_gprel32_reloc, /* special_function */
344 1.1 skrll "R_MIPS_GPREL32", /* name */
345 1.1 skrll TRUE, /* partial_inplace */
346 1.1 skrll 0xffffffff, /* src_mask */
347 1.1 skrll 0xffffffff, /* dst_mask */
348 1.1 skrll FALSE), /* pcrel_offset */
349 1.1 skrll
350 1.1 skrll EMPTY_HOWTO (13),
351 1.1 skrll EMPTY_HOWTO (14),
352 1.1 skrll EMPTY_HOWTO (15),
353 1.1 skrll
354 1.1 skrll /* A 5 bit shift field. */
355 1.1 skrll HOWTO (R_MIPS_SHIFT5, /* type */
356 1.1 skrll 0, /* rightshift */
357 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
358 1.1 skrll 5, /* bitsize */
359 1.1 skrll FALSE, /* pc_relative */
360 1.1 skrll 6, /* bitpos */
361 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
362 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
363 1.1 skrll "R_MIPS_SHIFT5", /* name */
364 1.1 skrll TRUE, /* partial_inplace */
365 1.1 skrll 0x000007c0, /* src_mask */
366 1.1 skrll 0x000007c0, /* dst_mask */
367 1.1 skrll FALSE), /* pcrel_offset */
368 1.1 skrll
369 1.1 skrll /* A 6 bit shift field. */
370 1.1 skrll HOWTO (R_MIPS_SHIFT6, /* type */
371 1.1 skrll 0, /* rightshift */
372 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
373 1.1 skrll 6, /* bitsize */
374 1.1 skrll FALSE, /* pc_relative */
375 1.1 skrll 6, /* bitpos */
376 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
377 1.1 skrll mips_elf64_shift6_reloc, /* special_function */
378 1.1 skrll "R_MIPS_SHIFT6", /* name */
379 1.1 skrll TRUE, /* partial_inplace */
380 1.1 skrll 0x000007c4, /* src_mask */
381 1.1 skrll 0x000007c4, /* dst_mask */
382 1.1 skrll FALSE), /* pcrel_offset */
383 1.1 skrll
384 1.1 skrll /* 64 bit relocation. */
385 1.1 skrll HOWTO (R_MIPS_64, /* type */
386 1.1 skrll 0, /* rightshift */
387 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
388 1.1 skrll 64, /* bitsize */
389 1.1 skrll FALSE, /* pc_relative */
390 1.1 skrll 0, /* bitpos */
391 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
392 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
393 1.1 skrll "R_MIPS_64", /* name */
394 1.1 skrll TRUE, /* partial_inplace */
395 1.1 skrll MINUS_ONE, /* src_mask */
396 1.1 skrll MINUS_ONE, /* dst_mask */
397 1.1 skrll FALSE), /* pcrel_offset */
398 1.1 skrll
399 1.1 skrll /* Displacement in the global offset table. */
400 1.1 skrll HOWTO (R_MIPS_GOT_DISP, /* type */
401 1.1 skrll 0, /* rightshift */
402 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
403 1.1 skrll 16, /* bitsize */
404 1.1 skrll FALSE, /* pc_relative */
405 1.1 skrll 0, /* bitpos */
406 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
407 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
408 1.1 skrll "R_MIPS_GOT_DISP", /* name */
409 1.1 skrll TRUE, /* partial_inplace */
410 1.1 skrll 0x0000ffff, /* src_mask */
411 1.1 skrll 0x0000ffff, /* dst_mask */
412 1.1 skrll FALSE), /* pcrel_offset */
413 1.1 skrll
414 1.1 skrll /* Displacement to page pointer in the global offset table. */
415 1.1 skrll HOWTO (R_MIPS_GOT_PAGE, /* type */
416 1.1 skrll 0, /* rightshift */
417 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
418 1.1 skrll 16, /* bitsize */
419 1.1 skrll FALSE, /* pc_relative */
420 1.1 skrll 0, /* bitpos */
421 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
422 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
423 1.1 skrll "R_MIPS_GOT_PAGE", /* name */
424 1.1 skrll TRUE, /* partial_inplace */
425 1.1 skrll 0x0000ffff, /* src_mask */
426 1.1 skrll 0x0000ffff, /* dst_mask */
427 1.1 skrll FALSE), /* pcrel_offset */
428 1.1 skrll
429 1.1 skrll /* Offset from page pointer in the global offset table. */
430 1.1 skrll HOWTO (R_MIPS_GOT_OFST, /* type */
431 1.1 skrll 0, /* rightshift */
432 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
433 1.1 skrll 16, /* bitsize */
434 1.1 skrll FALSE, /* pc_relative */
435 1.1 skrll 0, /* bitpos */
436 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
437 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
438 1.1 skrll "R_MIPS_GOT_OFST", /* name */
439 1.1 skrll TRUE, /* partial_inplace */
440 1.1 skrll 0x0000ffff, /* src_mask */
441 1.1 skrll 0x0000ffff, /* dst_mask */
442 1.1 skrll FALSE), /* pcrel_offset */
443 1.1 skrll
444 1.1 skrll /* High 16 bits of displacement in global offset table. */
445 1.1 skrll HOWTO (R_MIPS_GOT_HI16, /* type */
446 1.1 skrll 0, /* rightshift */
447 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
448 1.1 skrll 16, /* bitsize */
449 1.1 skrll FALSE, /* pc_relative */
450 1.1 skrll 0, /* bitpos */
451 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
452 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
453 1.1 skrll "R_MIPS_GOT_HI16", /* name */
454 1.1 skrll TRUE, /* partial_inplace */
455 1.1 skrll 0x0000ffff, /* src_mask */
456 1.1 skrll 0x0000ffff, /* dst_mask */
457 1.1 skrll FALSE), /* pcrel_offset */
458 1.1 skrll
459 1.1 skrll /* Low 16 bits of displacement in global offset table. */
460 1.1 skrll HOWTO (R_MIPS_GOT_LO16, /* type */
461 1.1 skrll 0, /* rightshift */
462 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
463 1.1 skrll 16, /* bitsize */
464 1.1 skrll FALSE, /* pc_relative */
465 1.1 skrll 0, /* bitpos */
466 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
467 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
468 1.1 skrll "R_MIPS_GOT_LO16", /* name */
469 1.1 skrll TRUE, /* partial_inplace */
470 1.1 skrll 0x0000ffff, /* src_mask */
471 1.1 skrll 0x0000ffff, /* dst_mask */
472 1.1 skrll FALSE), /* pcrel_offset */
473 1.1 skrll
474 1.1 skrll /* 64 bit subtraction. */
475 1.1 skrll HOWTO (R_MIPS_SUB, /* type */
476 1.1 skrll 0, /* rightshift */
477 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
478 1.1 skrll 64, /* bitsize */
479 1.1 skrll FALSE, /* pc_relative */
480 1.1 skrll 0, /* bitpos */
481 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
482 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
483 1.1 skrll "R_MIPS_SUB", /* name */
484 1.1 skrll TRUE, /* partial_inplace */
485 1.1 skrll MINUS_ONE, /* src_mask */
486 1.1 skrll MINUS_ONE, /* dst_mask */
487 1.1 skrll FALSE), /* pcrel_offset */
488 1.1 skrll
489 1.1 skrll /* Insert the addend as an instruction. */
490 1.1 skrll /* FIXME: Not handled correctly. */
491 1.1 skrll HOWTO (R_MIPS_INSERT_A, /* type */
492 1.1 skrll 0, /* rightshift */
493 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
494 1.1 skrll 32, /* bitsize */
495 1.1 skrll FALSE, /* pc_relative */
496 1.1 skrll 0, /* bitpos */
497 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
498 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
499 1.1 skrll "R_MIPS_INSERT_A", /* name */
500 1.1 skrll TRUE, /* partial_inplace */
501 1.1 skrll 0xffffffff, /* src_mask */
502 1.1 skrll 0xffffffff, /* dst_mask */
503 1.1 skrll FALSE), /* pcrel_offset */
504 1.1 skrll
505 1.1 skrll /* Insert the addend as an instruction, and change all relocations
506 1.1 skrll to refer to the old instruction at the address. */
507 1.1 skrll /* FIXME: Not handled correctly. */
508 1.1 skrll HOWTO (R_MIPS_INSERT_B, /* type */
509 1.1 skrll 0, /* rightshift */
510 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
511 1.1 skrll 32, /* bitsize */
512 1.1 skrll FALSE, /* pc_relative */
513 1.1 skrll 0, /* bitpos */
514 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
515 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
516 1.1 skrll "R_MIPS_INSERT_B", /* name */
517 1.1 skrll TRUE, /* partial_inplace */
518 1.1 skrll 0xffffffff, /* src_mask */
519 1.1 skrll 0xffffffff, /* dst_mask */
520 1.1 skrll FALSE), /* pcrel_offset */
521 1.1 skrll
522 1.1 skrll /* Delete a 32 bit instruction. */
523 1.1 skrll /* FIXME: Not handled correctly. */
524 1.1 skrll HOWTO (R_MIPS_DELETE, /* type */
525 1.1 skrll 0, /* rightshift */
526 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
527 1.1 skrll 32, /* bitsize */
528 1.1 skrll FALSE, /* pc_relative */
529 1.1 skrll 0, /* bitpos */
530 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
531 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
532 1.1 skrll "R_MIPS_DELETE", /* name */
533 1.1 skrll TRUE, /* partial_inplace */
534 1.1 skrll 0xffffffff, /* src_mask */
535 1.1 skrll 0xffffffff, /* dst_mask */
536 1.1 skrll FALSE), /* pcrel_offset */
537 1.1 skrll
538 1.1 skrll /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
539 1.1 skrll We don't, because
540 1.1 skrll a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/
541 1.1 skrll R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using
542 1.1 skrll fallable heuristics.
543 1.1 skrll b) No other NewABI toolchain actually emits such relocations. */
544 1.1 skrll EMPTY_HOWTO (R_MIPS_HIGHER),
545 1.1 skrll EMPTY_HOWTO (R_MIPS_HIGHEST),
546 1.1 skrll
547 1.1 skrll /* High 16 bits of displacement in global offset table. */
548 1.1 skrll HOWTO (R_MIPS_CALL_HI16, /* type */
549 1.1 skrll 0, /* rightshift */
550 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
551 1.1 skrll 16, /* bitsize */
552 1.1 skrll FALSE, /* pc_relative */
553 1.1 skrll 0, /* bitpos */
554 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
555 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
556 1.1 skrll "R_MIPS_CALL_HI16", /* name */
557 1.1 skrll TRUE, /* partial_inplace */
558 1.1 skrll 0x0000ffff, /* src_mask */
559 1.1 skrll 0x0000ffff, /* dst_mask */
560 1.1 skrll FALSE), /* pcrel_offset */
561 1.1 skrll
562 1.1 skrll /* Low 16 bits of displacement in global offset table. */
563 1.1 skrll HOWTO (R_MIPS_CALL_LO16, /* type */
564 1.1 skrll 0, /* rightshift */
565 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
566 1.1 skrll 16, /* bitsize */
567 1.1 skrll FALSE, /* pc_relative */
568 1.1 skrll 0, /* bitpos */
569 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
570 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
571 1.1 skrll "R_MIPS_CALL_LO16", /* name */
572 1.1 skrll TRUE, /* partial_inplace */
573 1.1 skrll 0x0000ffff, /* src_mask */
574 1.1 skrll 0x0000ffff, /* dst_mask */
575 1.1 skrll FALSE), /* pcrel_offset */
576 1.1 skrll
577 1.1 skrll /* Section displacement, used by an associated event location section. */
578 1.1 skrll HOWTO (R_MIPS_SCN_DISP, /* type */
579 1.1 skrll 0, /* rightshift */
580 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
581 1.1 skrll 32, /* bitsize */
582 1.1 skrll FALSE, /* pc_relative */
583 1.1 skrll 0, /* bitpos */
584 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
585 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
586 1.1 skrll "R_MIPS_SCN_DISP", /* name */
587 1.1 skrll TRUE, /* partial_inplace */
588 1.1 skrll 0xffffffff, /* src_mask */
589 1.1 skrll 0xffffffff, /* dst_mask */
590 1.1 skrll FALSE), /* pcrel_offset */
591 1.1 skrll
592 1.1 skrll HOWTO (R_MIPS_REL16, /* type */
593 1.1 skrll 0, /* rightshift */
594 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
595 1.1 skrll 16, /* bitsize */
596 1.1 skrll FALSE, /* pc_relative */
597 1.1 skrll 0, /* bitpos */
598 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
599 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
600 1.1 skrll "R_MIPS_REL16", /* name */
601 1.1 skrll TRUE, /* partial_inplace */
602 1.1 skrll 0xffff, /* src_mask */
603 1.1 skrll 0xffff, /* dst_mask */
604 1.1 skrll FALSE), /* pcrel_offset */
605 1.1 skrll
606 1.1 skrll /* These two are obsolete. */
607 1.1 skrll EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
608 1.1 skrll EMPTY_HOWTO (R_MIPS_PJUMP),
609 1.1 skrll
610 1.1 skrll /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
611 1.1 skrll It must be used for multigot GOT's (and only there). */
612 1.1 skrll HOWTO (R_MIPS_RELGOT, /* type */
613 1.1 skrll 0, /* rightshift */
614 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
615 1.1 skrll 32, /* bitsize */
616 1.1 skrll FALSE, /* pc_relative */
617 1.1 skrll 0, /* bitpos */
618 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
619 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
620 1.1 skrll "R_MIPS_RELGOT", /* name */
621 1.1 skrll TRUE, /* partial_inplace */
622 1.1 skrll 0xffffffff, /* src_mask */
623 1.1 skrll 0xffffffff, /* dst_mask */
624 1.1 skrll FALSE), /* pcrel_offset */
625 1.1 skrll
626 1.1 skrll /* Protected jump conversion. This is an optimization hint. No
627 1.1 skrll relocation is required for correctness. */
628 1.1 skrll HOWTO (R_MIPS_JALR, /* type */
629 1.1 skrll 0, /* rightshift */
630 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
631 1.1 skrll 32, /* bitsize */
632 1.1 skrll FALSE, /* pc_relative */
633 1.1 skrll 0, /* bitpos */
634 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
635 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
636 1.1 skrll "R_MIPS_JALR", /* name */
637 1.1 skrll FALSE, /* partial_inplace */
638 1.1 skrll 0, /* src_mask */
639 1.1 skrll 0x00000000, /* dst_mask */
640 1.1 skrll FALSE), /* pcrel_offset */
641 1.1 skrll
642 1.1 skrll /* TLS relocations. */
643 1.1 skrll EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
644 1.1 skrll EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
645 1.1 skrll
646 1.1 skrll HOWTO (R_MIPS_TLS_DTPMOD64, /* type */
647 1.1 skrll 0, /* rightshift */
648 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
649 1.1 skrll 64, /* bitsize */
650 1.1 skrll FALSE, /* pc_relative */
651 1.1 skrll 0, /* bitpos */
652 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
653 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
654 1.1 skrll "R_MIPS_TLS_DTPMOD64", /* name */
655 1.1 skrll TRUE, /* partial_inplace */
656 1.1 skrll MINUS_ONE, /* src_mask */
657 1.1 skrll MINUS_ONE, /* dst_mask */
658 1.1 skrll FALSE), /* pcrel_offset */
659 1.1 skrll
660 1.1 skrll HOWTO (R_MIPS_TLS_DTPREL64, /* type */
661 1.1 skrll 0, /* rightshift */
662 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
663 1.1 skrll 64, /* bitsize */
664 1.1 skrll FALSE, /* pc_relative */
665 1.1 skrll 0, /* bitpos */
666 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
667 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
668 1.1 skrll "R_MIPS_TLS_DTPREL64", /* name */
669 1.1 skrll TRUE, /* partial_inplace */
670 1.1 skrll MINUS_ONE, /* src_mask */
671 1.1 skrll MINUS_ONE, /* dst_mask */
672 1.1 skrll FALSE), /* pcrel_offset */
673 1.1 skrll
674 1.1 skrll /* TLS general dynamic variable reference. */
675 1.1 skrll HOWTO (R_MIPS_TLS_GD, /* type */
676 1.1 skrll 0, /* rightshift */
677 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
678 1.1 skrll 16, /* bitsize */
679 1.1 skrll FALSE, /* pc_relative */
680 1.1 skrll 0, /* bitpos */
681 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
682 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
683 1.1 skrll "R_MIPS_TLS_GD", /* name */
684 1.1 skrll TRUE, /* partial_inplace */
685 1.1 skrll 0x0000ffff, /* src_mask */
686 1.1 skrll 0x0000ffff, /* dst_mask */
687 1.1 skrll FALSE), /* pcrel_offset */
688 1.1 skrll
689 1.1 skrll /* TLS local dynamic variable reference. */
690 1.1 skrll HOWTO (R_MIPS_TLS_LDM, /* type */
691 1.1 skrll 0, /* rightshift */
692 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
693 1.1 skrll 16, /* bitsize */
694 1.1 skrll FALSE, /* pc_relative */
695 1.1 skrll 0, /* bitpos */
696 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
697 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
698 1.1 skrll "R_MIPS_TLS_LDM", /* name */
699 1.1 skrll TRUE, /* partial_inplace */
700 1.1 skrll 0x0000ffff, /* src_mask */
701 1.1 skrll 0x0000ffff, /* dst_mask */
702 1.1 skrll FALSE), /* pcrel_offset */
703 1.1 skrll
704 1.1 skrll /* TLS local dynamic offset. */
705 1.1 skrll HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */
706 1.1 skrll 0, /* rightshift */
707 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
708 1.1 skrll 16, /* bitsize */
709 1.1 skrll FALSE, /* pc_relative */
710 1.1 skrll 0, /* bitpos */
711 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
712 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
713 1.1 skrll "R_MIPS_TLS_DTPREL_HI16", /* name */
714 1.1 skrll TRUE, /* partial_inplace */
715 1.1 skrll 0x0000ffff, /* src_mask */
716 1.1 skrll 0x0000ffff, /* dst_mask */
717 1.1 skrll FALSE), /* pcrel_offset */
718 1.1 skrll
719 1.1 skrll /* TLS local dynamic offset. */
720 1.1 skrll HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */
721 1.1 skrll 0, /* rightshift */
722 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
723 1.1 skrll 16, /* bitsize */
724 1.1 skrll FALSE, /* pc_relative */
725 1.1 skrll 0, /* bitpos */
726 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
727 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
728 1.1 skrll "R_MIPS_TLS_DTPREL_LO16", /* name */
729 1.1 skrll TRUE, /* partial_inplace */
730 1.1 skrll 0x0000ffff, /* src_mask */
731 1.1 skrll 0x0000ffff, /* dst_mask */
732 1.1 skrll FALSE), /* pcrel_offset */
733 1.1 skrll
734 1.1 skrll /* TLS thread pointer offset. */
735 1.1 skrll HOWTO (R_MIPS_TLS_GOTTPREL, /* type */
736 1.1 skrll 0, /* rightshift */
737 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
738 1.1 skrll 16, /* bitsize */
739 1.1 skrll FALSE, /* pc_relative */
740 1.1 skrll 0, /* bitpos */
741 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
742 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
743 1.1 skrll "R_MIPS_TLS_GOTTPREL", /* name */
744 1.1 skrll TRUE, /* partial_inplace */
745 1.1 skrll 0x0000ffff, /* src_mask */
746 1.1 skrll 0x0000ffff, /* dst_mask */
747 1.1 skrll FALSE), /* pcrel_offset */
748 1.1 skrll
749 1.1 skrll /* TLS IE dynamic relocations. */
750 1.1 skrll EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
751 1.1 skrll
752 1.1 skrll HOWTO (R_MIPS_TLS_TPREL64, /* type */
753 1.1 skrll 0, /* rightshift */
754 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
755 1.1 skrll 64, /* bitsize */
756 1.1 skrll FALSE, /* pc_relative */
757 1.1 skrll 0, /* bitpos */
758 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
759 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
760 1.1 skrll "R_MIPS_TLS_TPREL64", /* name */
761 1.1 skrll TRUE, /* partial_inplace */
762 1.1 skrll MINUS_ONE, /* src_mask */
763 1.1 skrll MINUS_ONE, /* dst_mask */
764 1.1 skrll FALSE), /* pcrel_offset */
765 1.1 skrll
766 1.1 skrll /* TLS thread pointer offset. */
767 1.1 skrll HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
768 1.1 skrll 0, /* rightshift */
769 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
770 1.1 skrll 16, /* bitsize */
771 1.1 skrll FALSE, /* pc_relative */
772 1.1 skrll 0, /* bitpos */
773 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
774 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
775 1.1 skrll "R_MIPS_TLS_TPREL_HI16", /* name */
776 1.1 skrll TRUE, /* partial_inplace */
777 1.1 skrll 0x0000ffff, /* src_mask */
778 1.1 skrll 0x0000ffff, /* dst_mask */
779 1.1 skrll FALSE), /* pcrel_offset */
780 1.1 skrll
781 1.1 skrll /* TLS thread pointer offset. */
782 1.1 skrll HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
783 1.1 skrll 0, /* rightshift */
784 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
785 1.1 skrll 16, /* bitsize */
786 1.1 skrll FALSE, /* pc_relative */
787 1.1 skrll 0, /* bitpos */
788 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
789 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
790 1.1 skrll "R_MIPS_TLS_TPREL_LO16", /* name */
791 1.1 skrll TRUE, /* partial_inplace */
792 1.1 skrll 0x0000ffff, /* src_mask */
793 1.1 skrll 0x0000ffff, /* dst_mask */
794 1.1 skrll FALSE), /* pcrel_offset */
795 1.1 skrll
796 1.1 skrll /* 32 bit relocation with no addend. */
797 1.1 skrll HOWTO (R_MIPS_GLOB_DAT, /* type */
798 1.1 skrll 0, /* rightshift */
799 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
800 1.1 skrll 32, /* bitsize */
801 1.1 skrll FALSE, /* pc_relative */
802 1.1 skrll 0, /* bitpos */
803 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
804 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
805 1.1 skrll "R_MIPS_GLOB_DAT", /* name */
806 1.1 skrll FALSE, /* partial_inplace */
807 1.1 skrll 0x0, /* src_mask */
808 1.1 skrll 0xffffffff, /* dst_mask */
809 1.1 skrll FALSE), /* pcrel_offset */
810 1.1 skrll };
811 1.1 skrll
812 1.1 skrll /* The relocation table used for SHT_RELA sections. */
813 1.1 skrll
814 1.1 skrll static reloc_howto_type mips_elf64_howto_table_rela[] =
815 1.1 skrll {
816 1.1 skrll /* No relocation. */
817 1.1 skrll HOWTO (R_MIPS_NONE, /* type */
818 1.1 skrll 0, /* rightshift */
819 1.1 skrll 0, /* size (0 = byte, 1 = short, 2 = long) */
820 1.1 skrll 0, /* bitsize */
821 1.1 skrll FALSE, /* pc_relative */
822 1.1 skrll 0, /* bitpos */
823 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
824 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
825 1.1 skrll "R_MIPS_NONE", /* name */
826 1.1 skrll FALSE, /* partial_inplace */
827 1.1 skrll 0, /* src_mask */
828 1.1 skrll 0, /* dst_mask */
829 1.1 skrll FALSE), /* pcrel_offset */
830 1.1 skrll
831 1.1 skrll /* 16 bit relocation. */
832 1.1 skrll HOWTO (R_MIPS_16, /* type */
833 1.1 skrll 0, /* rightshift */
834 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
835 1.1 skrll 16, /* bitsize */
836 1.1 skrll FALSE, /* pc_relative */
837 1.1 skrll 0, /* bitpos */
838 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
839 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
840 1.1 skrll "R_MIPS_16", /* name */
841 1.1 skrll FALSE, /* partial_inplace */
842 1.1 skrll 0, /* src_mask */
843 1.1 skrll 0x0000ffff, /* dst_mask */
844 1.1 skrll FALSE), /* pcrel_offset */
845 1.1 skrll
846 1.1 skrll /* 32 bit relocation. */
847 1.1 skrll HOWTO (R_MIPS_32, /* type */
848 1.1 skrll 0, /* rightshift */
849 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
850 1.1 skrll 32, /* bitsize */
851 1.1 skrll FALSE, /* pc_relative */
852 1.1 skrll 0, /* bitpos */
853 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
854 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
855 1.1 skrll "R_MIPS_32", /* name */
856 1.1 skrll FALSE, /* partial_inplace */
857 1.1 skrll 0, /* src_mask */
858 1.1 skrll 0xffffffff, /* dst_mask */
859 1.1 skrll FALSE), /* pcrel_offset */
860 1.1 skrll
861 1.1 skrll /* 32 bit symbol relative relocation. */
862 1.1 skrll HOWTO (R_MIPS_REL32, /* type */
863 1.1 skrll 0, /* rightshift */
864 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
865 1.1 skrll 32, /* bitsize */
866 1.1 skrll FALSE, /* pc_relative */
867 1.1 skrll 0, /* bitpos */
868 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
869 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
870 1.1 skrll "R_MIPS_REL32", /* name */
871 1.1 skrll FALSE, /* partial_inplace */
872 1.1 skrll 0, /* src_mask */
873 1.1 skrll 0xffffffff, /* dst_mask */
874 1.1 skrll FALSE), /* pcrel_offset */
875 1.1 skrll
876 1.1 skrll /* 26 bit jump address. */
877 1.1 skrll HOWTO (R_MIPS_26, /* type */
878 1.1 skrll 2, /* rightshift */
879 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
880 1.1 skrll 26, /* bitsize */
881 1.1 skrll FALSE, /* pc_relative */
882 1.1 skrll 0, /* bitpos */
883 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
884 1.1 skrll /* This needs complex overflow
885 1.1 skrll detection, because the upper 36
886 1.1 skrll bits must match the PC + 4. */
887 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
888 1.1 skrll "R_MIPS_26", /* name */
889 1.1 skrll FALSE, /* partial_inplace */
890 1.1 skrll 0, /* src_mask */
891 1.1 skrll 0x03ffffff, /* dst_mask */
892 1.1 skrll FALSE), /* pcrel_offset */
893 1.1 skrll
894 1.1 skrll /* High 16 bits of symbol value. */
895 1.1 skrll HOWTO (R_MIPS_HI16, /* type */
896 1.1 skrll 0, /* rightshift */
897 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
898 1.1 skrll 16, /* bitsize */
899 1.1 skrll FALSE, /* pc_relative */
900 1.1 skrll 0, /* bitpos */
901 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
902 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
903 1.1 skrll "R_MIPS_HI16", /* name */
904 1.1 skrll FALSE, /* partial_inplace */
905 1.1 skrll 0, /* src_mask */
906 1.1 skrll 0x0000ffff, /* dst_mask */
907 1.1 skrll FALSE), /* pcrel_offset */
908 1.1 skrll
909 1.1 skrll /* Low 16 bits of symbol value. */
910 1.1 skrll HOWTO (R_MIPS_LO16, /* type */
911 1.1 skrll 0, /* rightshift */
912 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
913 1.1 skrll 16, /* bitsize */
914 1.1 skrll FALSE, /* pc_relative */
915 1.1 skrll 0, /* bitpos */
916 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
917 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
918 1.1 skrll "R_MIPS_LO16", /* name */
919 1.1 skrll FALSE, /* partial_inplace */
920 1.1 skrll 0, /* src_mask */
921 1.1 skrll 0x0000ffff, /* dst_mask */
922 1.1 skrll FALSE), /* pcrel_offset */
923 1.1 skrll
924 1.1 skrll /* GP relative reference. */
925 1.1 skrll HOWTO (R_MIPS_GPREL16, /* type */
926 1.1 skrll 0, /* rightshift */
927 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
928 1.1 skrll 16, /* bitsize */
929 1.1 skrll FALSE, /* pc_relative */
930 1.1 skrll 0, /* bitpos */
931 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
932 1.1 skrll mips_elf64_gprel16_reloc, /* special_function */
933 1.1 skrll "R_MIPS_GPREL16", /* name */
934 1.1 skrll FALSE, /* partial_inplace */
935 1.1 skrll 0, /* src_mask */
936 1.1 skrll 0x0000ffff, /* dst_mask */
937 1.1 skrll FALSE), /* pcrel_offset */
938 1.1 skrll
939 1.1 skrll /* Reference to literal section. */
940 1.1 skrll HOWTO (R_MIPS_LITERAL, /* type */
941 1.1 skrll 0, /* rightshift */
942 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
943 1.1 skrll 16, /* bitsize */
944 1.1 skrll FALSE, /* pc_relative */
945 1.1 skrll 0, /* bitpos */
946 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
947 1.1 skrll mips_elf64_literal_reloc, /* special_function */
948 1.1 skrll "R_MIPS_LITERAL", /* name */
949 1.1 skrll FALSE, /* partial_inplace */
950 1.1 skrll 0, /* src_mask */
951 1.1 skrll 0x0000ffff, /* dst_mask */
952 1.1 skrll FALSE), /* pcrel_offset */
953 1.1 skrll
954 1.1 skrll /* Reference to global offset table. */
955 1.1 skrll HOWTO (R_MIPS_GOT16, /* type */
956 1.1 skrll 0, /* rightshift */
957 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
958 1.1 skrll 16, /* bitsize */
959 1.1 skrll FALSE, /* pc_relative */
960 1.1 skrll 0, /* bitpos */
961 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
962 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
963 1.1 skrll "R_MIPS_GOT16", /* name */
964 1.1 skrll FALSE, /* partial_inplace */
965 1.1 skrll 0, /* src_mask */
966 1.1 skrll 0x0000ffff, /* dst_mask */
967 1.1 skrll FALSE), /* pcrel_offset */
968 1.1 skrll
969 1.1 skrll /* 16 bit PC relative reference. Note that the ABI document has a typo
970 1.1 skrll and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
971 1.1 skrll We do the right thing here. */
972 1.1 skrll HOWTO (R_MIPS_PC16, /* type */
973 1.1 skrll 2, /* rightshift */
974 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
975 1.1 skrll 16, /* bitsize */
976 1.1 skrll TRUE, /* pc_relative */
977 1.1 skrll 0, /* bitpos */
978 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
979 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
980 1.1 skrll "R_MIPS_PC16", /* name */
981 1.1 skrll FALSE, /* partial_inplace */
982 1.1 skrll 0, /* src_mask */
983 1.1 skrll 0x0000ffff, /* dst_mask */
984 1.1 skrll TRUE), /* pcrel_offset */
985 1.1 skrll
986 1.1 skrll /* 16 bit call through global offset table. */
987 1.1 skrll HOWTO (R_MIPS_CALL16, /* type */
988 1.1 skrll 0, /* rightshift */
989 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
990 1.1 skrll 16, /* bitsize */
991 1.1 skrll FALSE, /* pc_relative */
992 1.1 skrll 0, /* bitpos */
993 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
994 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
995 1.1 skrll "R_MIPS_CALL16", /* name */
996 1.1 skrll FALSE, /* partial_inplace */
997 1.1 skrll 0, /* src_mask */
998 1.1 skrll 0x0000ffff, /* dst_mask */
999 1.1 skrll FALSE), /* pcrel_offset */
1000 1.1 skrll
1001 1.1 skrll /* 32 bit GP relative reference. */
1002 1.1 skrll HOWTO (R_MIPS_GPREL32, /* type */
1003 1.1 skrll 0, /* rightshift */
1004 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1005 1.1 skrll 32, /* bitsize */
1006 1.1 skrll FALSE, /* pc_relative */
1007 1.1 skrll 0, /* bitpos */
1008 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1009 1.1 skrll mips_elf64_gprel32_reloc, /* special_function */
1010 1.1 skrll "R_MIPS_GPREL32", /* name */
1011 1.1 skrll FALSE, /* partial_inplace */
1012 1.1 skrll 0, /* src_mask */
1013 1.1 skrll 0xffffffff, /* dst_mask */
1014 1.1 skrll FALSE), /* pcrel_offset */
1015 1.1 skrll
1016 1.1 skrll EMPTY_HOWTO (13),
1017 1.1 skrll EMPTY_HOWTO (14),
1018 1.1 skrll EMPTY_HOWTO (15),
1019 1.1 skrll
1020 1.1 skrll /* A 5 bit shift field. */
1021 1.1 skrll HOWTO (R_MIPS_SHIFT5, /* type */
1022 1.1 skrll 0, /* rightshift */
1023 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1024 1.1 skrll 5, /* bitsize */
1025 1.1 skrll FALSE, /* pc_relative */
1026 1.1 skrll 6, /* bitpos */
1027 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
1028 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1029 1.1 skrll "R_MIPS_SHIFT5", /* name */
1030 1.1 skrll FALSE, /* partial_inplace */
1031 1.1 skrll 0, /* src_mask */
1032 1.1 skrll 0x000007c0, /* dst_mask */
1033 1.1 skrll FALSE), /* pcrel_offset */
1034 1.1 skrll
1035 1.1 skrll /* A 6 bit shift field. */
1036 1.1 skrll HOWTO (R_MIPS_SHIFT6, /* type */
1037 1.1 skrll 0, /* rightshift */
1038 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1039 1.1 skrll 6, /* bitsize */
1040 1.1 skrll FALSE, /* pc_relative */
1041 1.1 skrll 6, /* bitpos */
1042 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
1043 1.1 skrll mips_elf64_shift6_reloc, /* special_function */
1044 1.1 skrll "R_MIPS_SHIFT6", /* name */
1045 1.1 skrll FALSE, /* partial_inplace */
1046 1.1 skrll 0, /* src_mask */
1047 1.1 skrll 0x000007c4, /* dst_mask */
1048 1.1 skrll FALSE), /* pcrel_offset */
1049 1.1 skrll
1050 1.1 skrll /* 64 bit relocation. */
1051 1.1 skrll HOWTO (R_MIPS_64, /* type */
1052 1.1 skrll 0, /* rightshift */
1053 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
1054 1.1 skrll 64, /* bitsize */
1055 1.1 skrll FALSE, /* pc_relative */
1056 1.1 skrll 0, /* bitpos */
1057 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1058 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1059 1.1 skrll "R_MIPS_64", /* name */
1060 1.1 skrll FALSE, /* partial_inplace */
1061 1.1 skrll 0, /* src_mask */
1062 1.1 skrll MINUS_ONE, /* dst_mask */
1063 1.1 skrll FALSE), /* pcrel_offset */
1064 1.1 skrll
1065 1.1 skrll /* Displacement in the global offset table. */
1066 1.1 skrll HOWTO (R_MIPS_GOT_DISP, /* type */
1067 1.1 skrll 0, /* rightshift */
1068 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1069 1.1 skrll 16, /* bitsize */
1070 1.1 skrll FALSE, /* pc_relative */
1071 1.1 skrll 0, /* bitpos */
1072 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1073 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1074 1.1 skrll "R_MIPS_GOT_DISP", /* name */
1075 1.1 skrll FALSE, /* partial_inplace */
1076 1.1 skrll 0, /* src_mask */
1077 1.1 skrll 0x0000ffff, /* dst_mask */
1078 1.1 skrll FALSE), /* pcrel_offset */
1079 1.1 skrll
1080 1.1 skrll /* Displacement to page pointer in the global offset table. */
1081 1.1 skrll HOWTO (R_MIPS_GOT_PAGE, /* type */
1082 1.1 skrll 0, /* rightshift */
1083 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1084 1.1 skrll 16, /* bitsize */
1085 1.1 skrll FALSE, /* pc_relative */
1086 1.1 skrll 0, /* bitpos */
1087 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1088 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1089 1.1 skrll "R_MIPS_GOT_PAGE", /* name */
1090 1.1 skrll FALSE, /* partial_inplace */
1091 1.1 skrll 0, /* src_mask */
1092 1.1 skrll 0x0000ffff, /* dst_mask */
1093 1.1 skrll FALSE), /* pcrel_offset */
1094 1.1 skrll
1095 1.1 skrll /* Offset from page pointer in the global offset table. */
1096 1.1 skrll HOWTO (R_MIPS_GOT_OFST, /* type */
1097 1.1 skrll 0, /* rightshift */
1098 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1099 1.1 skrll 16, /* bitsize */
1100 1.1 skrll FALSE, /* pc_relative */
1101 1.1 skrll 0, /* bitpos */
1102 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1103 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1104 1.1 skrll "R_MIPS_GOT_OFST", /* name */
1105 1.1 skrll FALSE, /* partial_inplace */
1106 1.1 skrll 0, /* src_mask */
1107 1.1 skrll 0x0000ffff, /* dst_mask */
1108 1.1 skrll FALSE), /* pcrel_offset */
1109 1.1 skrll
1110 1.1 skrll /* High 16 bits of displacement in global offset table. */
1111 1.1 skrll HOWTO (R_MIPS_GOT_HI16, /* type */
1112 1.1 skrll 0, /* rightshift */
1113 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1114 1.1 skrll 16, /* bitsize */
1115 1.1 skrll FALSE, /* pc_relative */
1116 1.1 skrll 0, /* bitpos */
1117 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1118 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1119 1.1 skrll "R_MIPS_GOT_HI16", /* name */
1120 1.1 skrll FALSE, /* partial_inplace */
1121 1.1 skrll 0, /* src_mask */
1122 1.1 skrll 0x0000ffff, /* dst_mask */
1123 1.1 skrll FALSE), /* pcrel_offset */
1124 1.1 skrll
1125 1.1 skrll /* Low 16 bits of displacement in global offset table. */
1126 1.1 skrll HOWTO (R_MIPS_GOT_LO16, /* type */
1127 1.1 skrll 0, /* rightshift */
1128 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1129 1.1 skrll 16, /* bitsize */
1130 1.1 skrll FALSE, /* pc_relative */
1131 1.1 skrll 0, /* bitpos */
1132 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1133 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1134 1.1 skrll "R_MIPS_GOT_LO16", /* name */
1135 1.1 skrll FALSE, /* partial_inplace */
1136 1.1 skrll 0, /* src_mask */
1137 1.1 skrll 0x0000ffff, /* dst_mask */
1138 1.1 skrll FALSE), /* pcrel_offset */
1139 1.1 skrll
1140 1.1 skrll /* 64 bit subtraction. */
1141 1.1 skrll HOWTO (R_MIPS_SUB, /* type */
1142 1.1 skrll 0, /* rightshift */
1143 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
1144 1.1 skrll 64, /* bitsize */
1145 1.1 skrll FALSE, /* pc_relative */
1146 1.1 skrll 0, /* bitpos */
1147 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1148 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1149 1.1 skrll "R_MIPS_SUB", /* name */
1150 1.1 skrll FALSE, /* partial_inplace */
1151 1.1 skrll 0, /* src_mask */
1152 1.1 skrll MINUS_ONE, /* dst_mask */
1153 1.1 skrll FALSE), /* pcrel_offset */
1154 1.1 skrll
1155 1.1 skrll /* Insert the addend as an instruction. */
1156 1.1 skrll /* FIXME: Not handled correctly. */
1157 1.1 skrll HOWTO (R_MIPS_INSERT_A, /* type */
1158 1.1 skrll 0, /* rightshift */
1159 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1160 1.1 skrll 32, /* bitsize */
1161 1.1 skrll FALSE, /* pc_relative */
1162 1.1 skrll 0, /* bitpos */
1163 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1164 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1165 1.1 skrll "R_MIPS_INSERT_A", /* name */
1166 1.1 skrll FALSE, /* partial_inplace */
1167 1.1 skrll 0, /* src_mask */
1168 1.1 skrll 0xffffffff, /* dst_mask */
1169 1.1 skrll FALSE), /* pcrel_offset */
1170 1.1 skrll
1171 1.1 skrll /* Insert the addend as an instruction, and change all relocations
1172 1.1 skrll to refer to the old instruction at the address. */
1173 1.1 skrll /* FIXME: Not handled correctly. */
1174 1.1 skrll HOWTO (R_MIPS_INSERT_B, /* type */
1175 1.1 skrll 0, /* rightshift */
1176 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1177 1.1 skrll 32, /* bitsize */
1178 1.1 skrll FALSE, /* pc_relative */
1179 1.1 skrll 0, /* bitpos */
1180 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1181 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1182 1.1 skrll "R_MIPS_INSERT_B", /* name */
1183 1.1 skrll FALSE, /* partial_inplace */
1184 1.1 skrll 0, /* src_mask */
1185 1.1 skrll 0xffffffff, /* dst_mask */
1186 1.1 skrll FALSE), /* pcrel_offset */
1187 1.1 skrll
1188 1.1 skrll /* Delete a 32 bit instruction. */
1189 1.1 skrll /* FIXME: Not handled correctly. */
1190 1.1 skrll HOWTO (R_MIPS_DELETE, /* type */
1191 1.1 skrll 0, /* rightshift */
1192 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1193 1.1 skrll 32, /* bitsize */
1194 1.1 skrll FALSE, /* pc_relative */
1195 1.1 skrll 0, /* bitpos */
1196 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1197 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1198 1.1 skrll "R_MIPS_DELETE", /* name */
1199 1.1 skrll FALSE, /* partial_inplace */
1200 1.1 skrll 0, /* src_mask */
1201 1.1 skrll 0xffffffff, /* dst_mask */
1202 1.1 skrll FALSE), /* pcrel_offset */
1203 1.1 skrll
1204 1.1 skrll /* Get the higher value of a 64 bit addend. */
1205 1.1 skrll HOWTO (R_MIPS_HIGHER, /* type */
1206 1.1 skrll 0, /* rightshift */
1207 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1208 1.1 skrll 16, /* bitsize */
1209 1.1 skrll FALSE, /* pc_relative */
1210 1.1 skrll 0, /* bitpos */
1211 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1212 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1213 1.1 skrll "R_MIPS_HIGHER", /* name */
1214 1.1 skrll FALSE, /* partial_inplace */
1215 1.1 skrll 0, /* src_mask */
1216 1.1 skrll 0x0000ffff, /* dst_mask */
1217 1.1 skrll FALSE), /* pcrel_offset */
1218 1.1 skrll
1219 1.1 skrll /* Get the highest value of a 64 bit addend. */
1220 1.1 skrll HOWTO (R_MIPS_HIGHEST, /* type */
1221 1.1 skrll 0, /* rightshift */
1222 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1223 1.1 skrll 16, /* bitsize */
1224 1.1 skrll FALSE, /* pc_relative */
1225 1.1 skrll 0, /* bitpos */
1226 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1227 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1228 1.1 skrll "R_MIPS_HIGHEST", /* name */
1229 1.1 skrll FALSE, /* partial_inplace */
1230 1.1 skrll 0, /* src_mask */
1231 1.1 skrll 0x0000ffff, /* dst_mask */
1232 1.1 skrll FALSE), /* pcrel_offset */
1233 1.1 skrll
1234 1.1 skrll /* High 16 bits of displacement in global offset table. */
1235 1.1 skrll HOWTO (R_MIPS_CALL_HI16, /* type */
1236 1.1 skrll 0, /* rightshift */
1237 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1238 1.1 skrll 16, /* bitsize */
1239 1.1 skrll FALSE, /* pc_relative */
1240 1.1 skrll 0, /* bitpos */
1241 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1242 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1243 1.1 skrll "R_MIPS_CALL_HI16", /* name */
1244 1.1 skrll FALSE, /* partial_inplace */
1245 1.1 skrll 0, /* src_mask */
1246 1.1 skrll 0x0000ffff, /* dst_mask */
1247 1.1 skrll FALSE), /* pcrel_offset */
1248 1.1 skrll
1249 1.1 skrll /* Low 16 bits of displacement in global offset table. */
1250 1.1 skrll HOWTO (R_MIPS_CALL_LO16, /* type */
1251 1.1 skrll 0, /* rightshift */
1252 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1253 1.1 skrll 16, /* bitsize */
1254 1.1 skrll FALSE, /* pc_relative */
1255 1.1 skrll 0, /* bitpos */
1256 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1257 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1258 1.1 skrll "R_MIPS_CALL_LO16", /* name */
1259 1.1 skrll FALSE, /* partial_inplace */
1260 1.1 skrll 0, /* src_mask */
1261 1.1 skrll 0x0000ffff, /* dst_mask */
1262 1.1 skrll FALSE), /* pcrel_offset */
1263 1.1 skrll
1264 1.1 skrll /* Section displacement, used by an associated event location section. */
1265 1.1 skrll HOWTO (R_MIPS_SCN_DISP, /* type */
1266 1.1 skrll 0, /* rightshift */
1267 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1268 1.1 skrll 32, /* bitsize */
1269 1.1 skrll FALSE, /* pc_relative */
1270 1.1 skrll 0, /* bitpos */
1271 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1272 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1273 1.1 skrll "R_MIPS_SCN_DISP", /* name */
1274 1.1 skrll FALSE, /* partial_inplace */
1275 1.1 skrll 0, /* src_mask */
1276 1.1 skrll 0xffffffff, /* dst_mask */
1277 1.1 skrll FALSE), /* pcrel_offset */
1278 1.1 skrll
1279 1.1 skrll HOWTO (R_MIPS_REL16, /* type */
1280 1.1 skrll 0, /* rightshift */
1281 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
1282 1.1 skrll 16, /* bitsize */
1283 1.1 skrll FALSE, /* pc_relative */
1284 1.1 skrll 0, /* bitpos */
1285 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1286 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1287 1.1 skrll "R_MIPS_REL16", /* name */
1288 1.1 skrll FALSE, /* partial_inplace */
1289 1.1 skrll 0, /* src_mask */
1290 1.1 skrll 0xffff, /* dst_mask */
1291 1.1 skrll FALSE), /* pcrel_offset */
1292 1.1 skrll
1293 1.1 skrll /* These two are obsolete. */
1294 1.1 skrll EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
1295 1.1 skrll EMPTY_HOWTO (R_MIPS_PJUMP),
1296 1.1 skrll
1297 1.1 skrll /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
1298 1.1 skrll It must be used for multigot GOT's (and only there). */
1299 1.1 skrll HOWTO (R_MIPS_RELGOT, /* type */
1300 1.1 skrll 0, /* rightshift */
1301 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1302 1.1 skrll 32, /* bitsize */
1303 1.1 skrll FALSE, /* pc_relative */
1304 1.1 skrll 0, /* bitpos */
1305 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1306 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1307 1.1 skrll "R_MIPS_RELGOT", /* name */
1308 1.1 skrll FALSE, /* partial_inplace */
1309 1.1 skrll 0, /* src_mask */
1310 1.1 skrll 0xffffffff, /* dst_mask */
1311 1.1 skrll FALSE), /* pcrel_offset */
1312 1.1 skrll
1313 1.1 skrll /* Protected jump conversion. This is an optimization hint. No
1314 1.1 skrll relocation is required for correctness. */
1315 1.1 skrll HOWTO (R_MIPS_JALR, /* type */
1316 1.1 skrll 0, /* rightshift */
1317 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1318 1.1 skrll 32, /* bitsize */
1319 1.1 skrll FALSE, /* pc_relative */
1320 1.1 skrll 0, /* bitpos */
1321 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1322 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1323 1.1 skrll "R_MIPS_JALR", /* name */
1324 1.1 skrll FALSE, /* partial_inplace */
1325 1.1 skrll 0, /* src_mask */
1326 1.1 skrll 0x00000000, /* dst_mask */
1327 1.1 skrll FALSE), /* pcrel_offset */
1328 1.1 skrll
1329 1.1 skrll /* TLS relocations. */
1330 1.1 skrll EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
1331 1.1 skrll EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
1332 1.1 skrll EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
1333 1.1 skrll
1334 1.1 skrll HOWTO (R_MIPS_TLS_DTPREL64, /* type */
1335 1.1 skrll 0, /* rightshift */
1336 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
1337 1.1 skrll 64, /* bitsize */
1338 1.1 skrll FALSE, /* pc_relative */
1339 1.1 skrll 0, /* bitpos */
1340 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1341 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1342 1.1 skrll "R_MIPS_TLS_DTPREL64", /* name */
1343 1.1 skrll TRUE, /* partial_inplace */
1344 1.1 skrll MINUS_ONE, /* src_mask */
1345 1.1 skrll MINUS_ONE, /* dst_mask */
1346 1.1 skrll FALSE), /* pcrel_offset */
1347 1.1 skrll
1348 1.1 skrll /* TLS general dynamic variable reference. */
1349 1.1 skrll HOWTO (R_MIPS_TLS_GD, /* type */
1350 1.1 skrll 0, /* rightshift */
1351 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1352 1.1 skrll 16, /* bitsize */
1353 1.1 skrll FALSE, /* pc_relative */
1354 1.1 skrll 0, /* bitpos */
1355 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1356 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1357 1.1 skrll "R_MIPS_TLS_GD", /* name */
1358 1.1 skrll TRUE, /* partial_inplace */
1359 1.1 skrll 0x0000ffff, /* src_mask */
1360 1.1 skrll 0x0000ffff, /* dst_mask */
1361 1.1 skrll FALSE), /* pcrel_offset */
1362 1.1 skrll
1363 1.1 skrll /* TLS local dynamic variable reference. */
1364 1.1 skrll HOWTO (R_MIPS_TLS_LDM, /* type */
1365 1.1 skrll 0, /* rightshift */
1366 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1367 1.1 skrll 16, /* bitsize */
1368 1.1 skrll FALSE, /* pc_relative */
1369 1.1 skrll 0, /* bitpos */
1370 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1371 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1372 1.1 skrll "R_MIPS_TLS_LDM", /* name */
1373 1.1 skrll TRUE, /* partial_inplace */
1374 1.1 skrll 0x0000ffff, /* src_mask */
1375 1.1 skrll 0x0000ffff, /* dst_mask */
1376 1.1 skrll FALSE), /* pcrel_offset */
1377 1.1 skrll
1378 1.1 skrll /* TLS local dynamic offset. */
1379 1.1 skrll HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */
1380 1.1 skrll 0, /* rightshift */
1381 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1382 1.1 skrll 16, /* bitsize */
1383 1.1 skrll FALSE, /* pc_relative */
1384 1.1 skrll 0, /* bitpos */
1385 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1386 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1387 1.1 skrll "R_MIPS_TLS_DTPREL_HI16", /* name */
1388 1.1 skrll TRUE, /* partial_inplace */
1389 1.1 skrll 0x0000ffff, /* src_mask */
1390 1.1 skrll 0x0000ffff, /* dst_mask */
1391 1.1 skrll FALSE), /* pcrel_offset */
1392 1.1 skrll
1393 1.1 skrll /* TLS local dynamic offset. */
1394 1.1 skrll HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */
1395 1.1 skrll 0, /* rightshift */
1396 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1397 1.1 skrll 16, /* bitsize */
1398 1.1 skrll FALSE, /* pc_relative */
1399 1.1 skrll 0, /* bitpos */
1400 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1401 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1402 1.1 skrll "R_MIPS_TLS_DTPREL_LO16", /* name */
1403 1.1 skrll TRUE, /* partial_inplace */
1404 1.1 skrll 0x0000ffff, /* src_mask */
1405 1.1 skrll 0x0000ffff, /* dst_mask */
1406 1.1 skrll FALSE), /* pcrel_offset */
1407 1.1 skrll
1408 1.1 skrll /* TLS thread pointer offset. */
1409 1.1 skrll HOWTO (R_MIPS_TLS_GOTTPREL, /* type */
1410 1.1 skrll 0, /* rightshift */
1411 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1412 1.1 skrll 16, /* bitsize */
1413 1.1 skrll FALSE, /* pc_relative */
1414 1.1 skrll 0, /* bitpos */
1415 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1416 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1417 1.1 skrll "R_MIPS_TLS_GOTTPREL", /* name */
1418 1.1 skrll TRUE, /* partial_inplace */
1419 1.1 skrll 0x0000ffff, /* src_mask */
1420 1.1 skrll 0x0000ffff, /* dst_mask */
1421 1.1 skrll FALSE), /* pcrel_offset */
1422 1.1 skrll
1423 1.1 skrll EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
1424 1.1 skrll EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
1425 1.1 skrll
1426 1.1 skrll /* TLS thread pointer offset. */
1427 1.1 skrll HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
1428 1.1 skrll 0, /* rightshift */
1429 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1430 1.1 skrll 16, /* bitsize */
1431 1.1 skrll FALSE, /* pc_relative */
1432 1.1 skrll 0, /* bitpos */
1433 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1434 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1435 1.1 skrll "R_MIPS_TLS_TPREL_HI16", /* name */
1436 1.1 skrll TRUE, /* partial_inplace */
1437 1.1 skrll 0x0000ffff, /* src_mask */
1438 1.1 skrll 0x0000ffff, /* dst_mask */
1439 1.1 skrll FALSE), /* pcrel_offset */
1440 1.1 skrll
1441 1.1 skrll /* TLS thread pointer offset. */
1442 1.1 skrll HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
1443 1.1 skrll 0, /* rightshift */
1444 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1445 1.1 skrll 16, /* bitsize */
1446 1.1 skrll FALSE, /* pc_relative */
1447 1.1 skrll 0, /* bitpos */
1448 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1449 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1450 1.1 skrll "R_MIPS_TLS_TPREL_LO16", /* name */
1451 1.1 skrll TRUE, /* partial_inplace */
1452 1.1 skrll 0x0000ffff, /* src_mask */
1453 1.1 skrll 0x0000ffff, /* dst_mask */
1454 1.1 skrll FALSE), /* pcrel_offset */
1455 1.1 skrll
1456 1.1 skrll /* 32 bit relocation with no addend. */
1457 1.1 skrll HOWTO (R_MIPS_GLOB_DAT, /* type */
1458 1.1 skrll 0, /* rightshift */
1459 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1460 1.1 skrll 32, /* bitsize */
1461 1.1 skrll FALSE, /* pc_relative */
1462 1.1 skrll 0, /* bitpos */
1463 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1464 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1465 1.1 skrll "R_MIPS_GLOB_DAT", /* name */
1466 1.1 skrll FALSE, /* partial_inplace */
1467 1.1 skrll 0x0, /* src_mask */
1468 1.1 skrll 0xffffffff, /* dst_mask */
1469 1.1 skrll FALSE), /* pcrel_offset */
1470 1.1 skrll };
1471 1.1 skrll
1472 1.1 skrll static reloc_howto_type mips16_elf64_howto_table_rel[] =
1473 1.1 skrll {
1474 1.1 skrll /* The reloc used for the mips16 jump instruction. */
1475 1.1 skrll HOWTO (R_MIPS16_26, /* type */
1476 1.1 skrll 2, /* rightshift */
1477 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1478 1.1 skrll 26, /* bitsize */
1479 1.1 skrll FALSE, /* pc_relative */
1480 1.1 skrll 0, /* bitpos */
1481 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1482 1.1 skrll /* This needs complex overflow
1483 1.1 skrll detection, because the upper four
1484 1.1 skrll bits must match the PC. */
1485 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1486 1.1 skrll "R_MIPS16_26", /* name */
1487 1.1 skrll TRUE, /* partial_inplace */
1488 1.1 skrll 0x3ffffff, /* src_mask */
1489 1.1 skrll 0x3ffffff, /* dst_mask */
1490 1.1 skrll FALSE), /* pcrel_offset */
1491 1.1 skrll
1492 1.1 skrll /* The reloc used for the mips16 gprel instruction. */
1493 1.1 skrll HOWTO (R_MIPS16_GPREL, /* type */
1494 1.1 skrll 0, /* rightshift */
1495 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1496 1.1 skrll 16, /* bitsize */
1497 1.1 skrll FALSE, /* pc_relative */
1498 1.1 skrll 0, /* bitpos */
1499 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1500 1.1 skrll mips16_gprel_reloc, /* special_function */
1501 1.1 skrll "R_MIPS16_GPREL", /* name */
1502 1.1 skrll TRUE, /* partial_inplace */
1503 1.1 skrll 0x0000ffff, /* src_mask */
1504 1.1 skrll 0x0000ffff, /* dst_mask */
1505 1.1 skrll FALSE), /* pcrel_offset */
1506 1.1 skrll
1507 1.1 skrll /* A MIPS16 reference to the global offset table. */
1508 1.1 skrll HOWTO (R_MIPS16_GOT16, /* type */
1509 1.1 skrll 0, /* rightshift */
1510 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1511 1.1 skrll 16, /* bitsize */
1512 1.1 skrll FALSE, /* pc_relative */
1513 1.1 skrll 0, /* bitpos */
1514 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1515 1.1 skrll _bfd_mips_elf_got16_reloc, /* special_function */
1516 1.1 skrll "R_MIPS16_GOT16", /* name */
1517 1.1 skrll TRUE, /* partial_inplace */
1518 1.1 skrll 0x0000ffff, /* src_mask */
1519 1.1 skrll 0x0000ffff, /* dst_mask */
1520 1.1 skrll FALSE), /* pcrel_offset */
1521 1.1 skrll
1522 1.1 skrll /* A MIPS16 call through the global offset table. */
1523 1.1 skrll HOWTO (R_MIPS16_CALL16, /* type */
1524 1.1 skrll 0, /* rightshift */
1525 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1526 1.1 skrll 16, /* bitsize */
1527 1.1 skrll FALSE, /* pc_relative */
1528 1.1 skrll 0, /* bitpos */
1529 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1530 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1531 1.1 skrll "R_MIPS16_CALL16", /* name */
1532 1.1 skrll TRUE, /* partial_inplace */
1533 1.1 skrll 0x0000ffff, /* src_mask */
1534 1.1 skrll 0x0000ffff, /* dst_mask */
1535 1.1 skrll FALSE), /* pcrel_offset */
1536 1.1 skrll
1537 1.1 skrll /* MIPS16 high 16 bits of symbol value. */
1538 1.1 skrll HOWTO (R_MIPS16_HI16, /* type */
1539 1.1 skrll 16, /* rightshift */
1540 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1541 1.1 skrll 16, /* bitsize */
1542 1.1 skrll FALSE, /* pc_relative */
1543 1.1 skrll 0, /* bitpos */
1544 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1545 1.1 skrll _bfd_mips_elf_hi16_reloc, /* special_function */
1546 1.1 skrll "R_MIPS16_HI16", /* name */
1547 1.1 skrll TRUE, /* partial_inplace */
1548 1.1 skrll 0x0000ffff, /* src_mask */
1549 1.1 skrll 0x0000ffff, /* dst_mask */
1550 1.1 skrll FALSE), /* pcrel_offset */
1551 1.1 skrll
1552 1.1 skrll /* MIPS16 low 16 bits of symbol value. */
1553 1.1 skrll HOWTO (R_MIPS16_LO16, /* type */
1554 1.1 skrll 0, /* rightshift */
1555 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1556 1.1 skrll 16, /* bitsize */
1557 1.1 skrll FALSE, /* pc_relative */
1558 1.1 skrll 0, /* bitpos */
1559 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1560 1.1 skrll _bfd_mips_elf_lo16_reloc, /* special_function */
1561 1.1 skrll "R_MIPS16_LO16", /* name */
1562 1.1 skrll TRUE, /* partial_inplace */
1563 1.1 skrll 0x0000ffff, /* src_mask */
1564 1.1 skrll 0x0000ffff, /* dst_mask */
1565 1.1 skrll FALSE), /* pcrel_offset */
1566 1.1 skrll };
1567 1.1 skrll
1568 1.1 skrll static reloc_howto_type mips16_elf64_howto_table_rela[] =
1569 1.1 skrll {
1570 1.1 skrll /* The reloc used for the mips16 jump instruction. */
1571 1.1 skrll HOWTO (R_MIPS16_26, /* type */
1572 1.1 skrll 2, /* rightshift */
1573 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1574 1.1 skrll 26, /* bitsize */
1575 1.1 skrll FALSE, /* pc_relative */
1576 1.1 skrll 0, /* bitpos */
1577 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1578 1.1 skrll /* This needs complex overflow
1579 1.1 skrll detection, because the upper four
1580 1.1 skrll bits must match the PC. */
1581 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1582 1.1 skrll "R_MIPS16_26", /* name */
1583 1.1 skrll FALSE, /* partial_inplace */
1584 1.1 skrll 0x3ffffff, /* src_mask */
1585 1.1 skrll 0x3ffffff, /* dst_mask */
1586 1.1 skrll FALSE), /* pcrel_offset */
1587 1.1 skrll
1588 1.1 skrll /* The reloc used for the mips16 gprel instruction. */
1589 1.1 skrll HOWTO (R_MIPS16_GPREL, /* type */
1590 1.1 skrll 0, /* rightshift */
1591 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1592 1.1 skrll 16, /* bitsize */
1593 1.1 skrll FALSE, /* pc_relative */
1594 1.1 skrll 0, /* bitpos */
1595 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1596 1.1 skrll mips16_gprel_reloc, /* special_function */
1597 1.1 skrll "R_MIPS16_GPREL", /* name */
1598 1.1 skrll FALSE, /* partial_inplace */
1599 1.1 skrll 0x0000ffff, /* src_mask */
1600 1.1 skrll 0x0000ffff, /* dst_mask */
1601 1.1 skrll FALSE), /* pcrel_offset */
1602 1.1 skrll
1603 1.1 skrll /* A MIPS16 reference to the global offset table. */
1604 1.1 skrll HOWTO (R_MIPS16_GOT16, /* type */
1605 1.1 skrll 0, /* rightshift */
1606 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1607 1.1 skrll 16, /* bitsize */
1608 1.1 skrll FALSE, /* pc_relative */
1609 1.1 skrll 0, /* bitpos */
1610 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1611 1.1 skrll _bfd_mips_elf_got16_reloc, /* special_function */
1612 1.1 skrll "R_MIPS16_GOT16", /* name */
1613 1.1 skrll FALSE, /* partial_inplace */
1614 1.1 skrll 0x0000ffff, /* src_mask */
1615 1.1 skrll 0x0000ffff, /* dst_mask */
1616 1.1 skrll FALSE), /* pcrel_offset */
1617 1.1 skrll
1618 1.1 skrll /* A MIPS16 call through the global offset table. */
1619 1.1 skrll HOWTO (R_MIPS16_CALL16, /* type */
1620 1.1 skrll 0, /* rightshift */
1621 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1622 1.1 skrll 16, /* bitsize */
1623 1.1 skrll FALSE, /* pc_relative */
1624 1.1 skrll 0, /* bitpos */
1625 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1626 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1627 1.1 skrll "R_MIPS16_CALL16", /* name */
1628 1.1 skrll FALSE, /* partial_inplace */
1629 1.1 skrll 0x0000ffff, /* src_mask */
1630 1.1 skrll 0x0000ffff, /* dst_mask */
1631 1.1 skrll FALSE), /* pcrel_offset */
1632 1.1 skrll
1633 1.1 skrll /* MIPS16 high 16 bits of symbol value. */
1634 1.1 skrll HOWTO (R_MIPS16_HI16, /* type */
1635 1.1 skrll 16, /* rightshift */
1636 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1637 1.1 skrll 16, /* bitsize */
1638 1.1 skrll FALSE, /* pc_relative */
1639 1.1 skrll 0, /* bitpos */
1640 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1641 1.1 skrll _bfd_mips_elf_hi16_reloc, /* special_function */
1642 1.1 skrll "R_MIPS16_HI16", /* name */
1643 1.1 skrll FALSE, /* partial_inplace */
1644 1.1 skrll 0x0000ffff, /* src_mask */
1645 1.1 skrll 0x0000ffff, /* dst_mask */
1646 1.1 skrll FALSE), /* pcrel_offset */
1647 1.1 skrll
1648 1.1 skrll /* MIPS16 low 16 bits of symbol value. */
1649 1.1 skrll HOWTO (R_MIPS16_LO16, /* type */
1650 1.1 skrll 0, /* rightshift */
1651 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1652 1.1 skrll 16, /* bitsize */
1653 1.1 skrll FALSE, /* pc_relative */
1654 1.1 skrll 0, /* bitpos */
1655 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1656 1.1 skrll _bfd_mips_elf_lo16_reloc, /* special_function */
1657 1.1 skrll "R_MIPS16_LO16", /* name */
1658 1.1 skrll FALSE, /* partial_inplace */
1659 1.1 skrll 0x0000ffff, /* src_mask */
1660 1.1 skrll 0x0000ffff, /* dst_mask */
1661 1.1 skrll FALSE), /* pcrel_offset */
1662 1.1 skrll };
1663 1.1 skrll
1664 1.1 skrll /* GNU extension to record C++ vtable hierarchy */
1665 1.1 skrll static reloc_howto_type elf_mips_gnu_vtinherit_howto =
1666 1.1 skrll HOWTO (R_MIPS_GNU_VTINHERIT, /* type */
1667 1.1 skrll 0, /* rightshift */
1668 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1669 1.1 skrll 0, /* bitsize */
1670 1.1 skrll FALSE, /* pc_relative */
1671 1.1 skrll 0, /* bitpos */
1672 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1673 1.1 skrll NULL, /* special_function */
1674 1.1 skrll "R_MIPS_GNU_VTINHERIT", /* name */
1675 1.1 skrll FALSE, /* partial_inplace */
1676 1.1 skrll 0, /* src_mask */
1677 1.1 skrll 0, /* dst_mask */
1678 1.1 skrll FALSE); /* pcrel_offset */
1679 1.1 skrll
1680 1.1 skrll /* GNU extension to record C++ vtable member usage */
1681 1.1 skrll static reloc_howto_type elf_mips_gnu_vtentry_howto =
1682 1.1 skrll HOWTO (R_MIPS_GNU_VTENTRY, /* type */
1683 1.1 skrll 0, /* rightshift */
1684 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1685 1.1 skrll 0, /* bitsize */
1686 1.1 skrll FALSE, /* pc_relative */
1687 1.1 skrll 0, /* bitpos */
1688 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1689 1.1 skrll _bfd_elf_rel_vtable_reloc_fn, /* special_function */
1690 1.1 skrll "R_MIPS_GNU_VTENTRY", /* name */
1691 1.1 skrll FALSE, /* partial_inplace */
1692 1.1 skrll 0, /* src_mask */
1693 1.1 skrll 0, /* dst_mask */
1694 1.1 skrll FALSE); /* pcrel_offset */
1695 1.1 skrll
1696 1.1 skrll /* 16 bit offset for pc-relative branches. */
1698 1.1 skrll static reloc_howto_type elf_mips_gnu_rel16_s2 =
1699 1.1 skrll HOWTO (R_MIPS_GNU_REL16_S2, /* type */
1700 1.1 skrll 2, /* rightshift */
1701 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1702 1.1 skrll 16, /* bitsize */
1703 1.1 skrll TRUE, /* pc_relative */
1704 1.1 skrll 0, /* bitpos */
1705 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1706 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1707 1.1 skrll "R_MIPS_GNU_REL16_S2", /* name */
1708 1.1 skrll TRUE, /* partial_inplace */
1709 1.1 skrll 0x0000ffff, /* src_mask */
1710 1.1 skrll 0x0000ffff, /* dst_mask */
1711 1.1 skrll TRUE); /* pcrel_offset */
1712 1.1 skrll
1713 1.1 skrll /* 16 bit offset for pc-relative branches. */
1714 1.1 skrll static reloc_howto_type elf_mips_gnu_rela16_s2 =
1715 1.1 skrll HOWTO (R_MIPS_GNU_REL16_S2, /* type */
1716 1.1 skrll 2, /* rightshift */
1717 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1718 1.1 skrll 16, /* bitsize */
1719 1.1 skrll TRUE, /* pc_relative */
1720 1.1 skrll 0, /* bitpos */
1721 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1722 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1723 1.1 skrll "R_MIPS_GNU_REL16_S2", /* name */
1724 1.1 skrll FALSE, /* partial_inplace */
1725 1.1 skrll 0, /* src_mask */
1726 1.1 skrll 0x0000ffff, /* dst_mask */
1727 1.1 skrll TRUE); /* pcrel_offset */
1728 1.1 skrll
1729 1.1 skrll /* Originally a VxWorks extension, but now used for other systems too. */
1731 1.1 skrll static reloc_howto_type elf_mips_copy_howto =
1732 1.1 skrll HOWTO (R_MIPS_COPY, /* type */
1733 1.1 skrll 0, /* rightshift */
1734 1.1 skrll 0, /* this one is variable size */
1735 1.1 skrll 0, /* bitsize */
1736 1.1 skrll FALSE, /* pc_relative */
1737 1.1 skrll 0, /* bitpos */
1738 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
1739 1.1 skrll bfd_elf_generic_reloc, /* special_function */
1740 1.1 skrll "R_MIPS_COPY", /* name */
1741 1.1 skrll FALSE, /* partial_inplace */
1742 1.1 skrll 0x0, /* src_mask */
1743 1.1 skrll 0x0, /* dst_mask */
1744 1.1 skrll FALSE); /* pcrel_offset */
1745 1.1 skrll
1746 1.1 skrll /* Originally a VxWorks extension, but now used for other systems too. */
1747 1.1 skrll static reloc_howto_type elf_mips_jump_slot_howto =
1748 1.1 skrll HOWTO (R_MIPS_JUMP_SLOT, /* type */
1749 1.1 skrll 0, /* rightshift */
1750 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
1751 1.1 skrll 64, /* bitsize */
1752 1.1 skrll FALSE, /* pc_relative */
1753 1.1 skrll 0, /* bitpos */
1754 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
1755 1.1 skrll bfd_elf_generic_reloc, /* special_function */
1756 1.1 skrll "R_MIPS_JUMP_SLOT", /* name */
1757 1.1 skrll FALSE, /* partial_inplace */
1758 1.1 skrll 0x0, /* src_mask */
1759 1.1 skrll 0x0, /* dst_mask */
1760 1.1 skrll FALSE); /* pcrel_offset */
1761 1.1 skrll
1762 1.1 skrll /* Swap in a MIPS 64-bit Rel reloc. */
1764 1.1 skrll
1765 1.1 skrll static void
1766 1.1 skrll mips_elf64_swap_reloc_in (bfd *abfd, const Elf64_Mips_External_Rel *src,
1767 1.1 skrll Elf64_Mips_Internal_Rela *dst)
1768 1.1 skrll {
1769 1.1 skrll dst->r_offset = H_GET_64 (abfd, src->r_offset);
1770 1.1 skrll dst->r_sym = H_GET_32 (abfd, src->r_sym);
1771 1.1 skrll dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
1772 1.1 skrll dst->r_type3 = H_GET_8 (abfd, src->r_type3);
1773 1.1 skrll dst->r_type2 = H_GET_8 (abfd, src->r_type2);
1774 1.1 skrll dst->r_type = H_GET_8 (abfd, src->r_type);
1775 1.1 skrll dst->r_addend = 0;
1776 1.1 skrll }
1777 1.1 skrll
1778 1.1 skrll /* Swap in a MIPS 64-bit Rela reloc. */
1779 1.1 skrll
1780 1.1 skrll static void
1781 1.1 skrll mips_elf64_swap_reloca_in (bfd *abfd, const Elf64_Mips_External_Rela *src,
1782 1.1 skrll Elf64_Mips_Internal_Rela *dst)
1783 1.1 skrll {
1784 1.1 skrll dst->r_offset = H_GET_64 (abfd, src->r_offset);
1785 1.1 skrll dst->r_sym = H_GET_32 (abfd, src->r_sym);
1786 1.1 skrll dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
1787 1.1 skrll dst->r_type3 = H_GET_8 (abfd, src->r_type3);
1788 1.1 skrll dst->r_type2 = H_GET_8 (abfd, src->r_type2);
1789 1.1 skrll dst->r_type = H_GET_8 (abfd, src->r_type);
1790 1.1 skrll dst->r_addend = H_GET_S64 (abfd, src->r_addend);
1791 1.1 skrll }
1792 1.1 skrll
1793 1.1 skrll /* Swap out a MIPS 64-bit Rel reloc. */
1794 1.1 skrll
1795 1.1 skrll static void
1796 1.1 skrll mips_elf64_swap_reloc_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
1797 1.1 skrll Elf64_Mips_External_Rel *dst)
1798 1.1 skrll {
1799 1.1 skrll H_PUT_64 (abfd, src->r_offset, dst->r_offset);
1800 1.1 skrll H_PUT_32 (abfd, src->r_sym, dst->r_sym);
1801 1.1 skrll H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
1802 1.1 skrll H_PUT_8 (abfd, src->r_type3, dst->r_type3);
1803 1.1 skrll H_PUT_8 (abfd, src->r_type2, dst->r_type2);
1804 1.1 skrll H_PUT_8 (abfd, src->r_type, dst->r_type);
1805 1.1 skrll }
1806 1.1 skrll
1807 1.1 skrll /* Swap out a MIPS 64-bit Rela reloc. */
1808 1.1 skrll
1809 1.1 skrll static void
1810 1.1 skrll mips_elf64_swap_reloca_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
1811 1.1 skrll Elf64_Mips_External_Rela *dst)
1812 1.1 skrll {
1813 1.1 skrll H_PUT_64 (abfd, src->r_offset, dst->r_offset);
1814 1.1 skrll H_PUT_32 (abfd, src->r_sym, dst->r_sym);
1815 1.1 skrll H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
1816 1.1 skrll H_PUT_8 (abfd, src->r_type3, dst->r_type3);
1817 1.1 skrll H_PUT_8 (abfd, src->r_type2, dst->r_type2);
1818 1.1 skrll H_PUT_8 (abfd, src->r_type, dst->r_type);
1819 1.1 skrll H_PUT_S64 (abfd, src->r_addend, dst->r_addend);
1820 1.1 skrll }
1821 1.1 skrll
1822 1.1 skrll /* Swap in a MIPS 64-bit Rel reloc. */
1823 1.1 skrll
1824 1.1 skrll static void
1825 1.1 skrll mips_elf64_be_swap_reloc_in (bfd *abfd, const bfd_byte *src,
1826 1.1 skrll Elf_Internal_Rela *dst)
1827 1.1 skrll {
1828 1.1 skrll Elf64_Mips_Internal_Rela mirel;
1829 1.1 skrll
1830 1.1 skrll mips_elf64_swap_reloc_in (abfd,
1831 1.1 skrll (const Elf64_Mips_External_Rel *) src,
1832 1.1 skrll &mirel);
1833 1.1 skrll
1834 1.1 skrll dst[0].r_offset = mirel.r_offset;
1835 1.1 skrll dst[0].r_info = ELF64_R_INFO (mirel.r_sym, mirel.r_type);
1836 1.1 skrll dst[0].r_addend = 0;
1837 1.1 skrll dst[1].r_offset = mirel.r_offset;
1838 1.1 skrll dst[1].r_info = ELF64_R_INFO (mirel.r_ssym, mirel.r_type2);
1839 1.1 skrll dst[1].r_addend = 0;
1840 1.1 skrll dst[2].r_offset = mirel.r_offset;
1841 1.1 skrll dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirel.r_type3);
1842 1.1 skrll dst[2].r_addend = 0;
1843 1.1 skrll }
1844 1.1 skrll
1845 1.1 skrll /* Swap in a MIPS 64-bit Rela reloc. */
1846 1.1 skrll
1847 1.1 skrll static void
1848 1.1 skrll mips_elf64_be_swap_reloca_in (bfd *abfd, const bfd_byte *src,
1849 1.1 skrll Elf_Internal_Rela *dst)
1850 1.1 skrll {
1851 1.1 skrll Elf64_Mips_Internal_Rela mirela;
1852 1.1 skrll
1853 1.1 skrll mips_elf64_swap_reloca_in (abfd,
1854 1.1 skrll (const Elf64_Mips_External_Rela *) src,
1855 1.1 skrll &mirela);
1856 1.1 skrll
1857 1.1 skrll dst[0].r_offset = mirela.r_offset;
1858 1.1 skrll dst[0].r_info = ELF64_R_INFO (mirela.r_sym, mirela.r_type);
1859 1.1 skrll dst[0].r_addend = mirela.r_addend;
1860 1.1 skrll dst[1].r_offset = mirela.r_offset;
1861 1.1 skrll dst[1].r_info = ELF64_R_INFO (mirela.r_ssym, mirela.r_type2);
1862 1.1 skrll dst[1].r_addend = 0;
1863 1.1 skrll dst[2].r_offset = mirela.r_offset;
1864 1.1 skrll dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirela.r_type3);
1865 1.1 skrll dst[2].r_addend = 0;
1866 1.1 skrll }
1867 1.1 skrll
1868 1.1 skrll /* Swap out a MIPS 64-bit Rel reloc. */
1869 1.1 skrll
1870 1.1 skrll static void
1871 1.1 skrll mips_elf64_be_swap_reloc_out (bfd *abfd, const Elf_Internal_Rela *src,
1872 1.1 skrll bfd_byte *dst)
1873 1.1 skrll {
1874 1.1 skrll Elf64_Mips_Internal_Rela mirel;
1875 1.1 skrll
1876 1.1 skrll mirel.r_offset = src[0].r_offset;
1877 1.1 skrll BFD_ASSERT(src[0].r_offset == src[1].r_offset);
1878 1.1 skrll
1879 1.1 skrll mirel.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
1880 1.1 skrll mirel.r_sym = ELF64_R_SYM (src[0].r_info);
1881 1.1 skrll mirel.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
1882 1.1 skrll mirel.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
1883 1.1 skrll mirel.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
1884 1.1 skrll
1885 1.1 skrll mips_elf64_swap_reloc_out (abfd, &mirel,
1886 1.1 skrll (Elf64_Mips_External_Rel *) dst);
1887 1.1 skrll }
1888 1.1 skrll
1889 1.1 skrll /* Swap out a MIPS 64-bit Rela reloc. */
1890 1.1 skrll
1891 1.1 skrll static void
1892 1.1 skrll mips_elf64_be_swap_reloca_out (bfd *abfd, const Elf_Internal_Rela *src,
1893 1.1 skrll bfd_byte *dst)
1894 1.1 skrll {
1895 1.1 skrll Elf64_Mips_Internal_Rela mirela;
1896 1.1 skrll
1897 1.1 skrll mirela.r_offset = src[0].r_offset;
1898 1.1 skrll BFD_ASSERT(src[0].r_offset == src[1].r_offset);
1899 1.1 skrll BFD_ASSERT(src[0].r_offset == src[2].r_offset);
1900 1.1 skrll
1901 1.1 skrll mirela.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
1902 1.1 skrll mirela.r_sym = ELF64_R_SYM (src[0].r_info);
1903 1.1 skrll mirela.r_addend = src[0].r_addend;
1904 1.1 skrll BFD_ASSERT(src[1].r_addend == 0);
1905 1.1 skrll BFD_ASSERT(src[2].r_addend == 0);
1906 1.1 skrll
1907 1.1 skrll mirela.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
1908 1.1 skrll mirela.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
1909 1.1 skrll mirela.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
1910 1.1 skrll
1911 1.1 skrll mips_elf64_swap_reloca_out (abfd, &mirela,
1912 1.1 skrll (Elf64_Mips_External_Rela *) dst);
1913 1.1 skrll }
1914 1.1 skrll
1915 1.1 skrll /* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a
1917 1.1 skrll dangerous relocation. */
1918 1.1 skrll
1919 1.1 skrll static bfd_boolean
1920 1.1 skrll mips_elf64_assign_gp (bfd *output_bfd, bfd_vma *pgp)
1921 1.1 skrll {
1922 1.1 skrll unsigned int count;
1923 1.1 skrll asymbol **sym;
1924 1.1 skrll unsigned int i;
1925 1.1 skrll
1926 1.1 skrll /* If we've already figured out what GP will be, just return it. */
1927 1.1 skrll *pgp = _bfd_get_gp_value (output_bfd);
1928 1.1 skrll if (*pgp)
1929 1.1 skrll return TRUE;
1930 1.1 skrll
1931 1.1 skrll count = bfd_get_symcount (output_bfd);
1932 1.1 skrll sym = bfd_get_outsymbols (output_bfd);
1933 1.1 skrll
1934 1.1 skrll /* The linker script will have created a symbol named `_gp' with the
1935 1.1 skrll appropriate value. */
1936 1.1 skrll if (sym == NULL)
1937 1.1 skrll i = count;
1938 1.1 skrll else
1939 1.1 skrll {
1940 1.1 skrll for (i = 0; i < count; i++, sym++)
1941 1.1 skrll {
1942 1.1 skrll register const char *name;
1943 1.1 skrll
1944 1.1 skrll name = bfd_asymbol_name (*sym);
1945 1.1 skrll if (*name == '_' && strcmp (name, "_gp") == 0)
1946 1.1 skrll {
1947 1.1 skrll *pgp = bfd_asymbol_value (*sym);
1948 1.1 skrll _bfd_set_gp_value (output_bfd, *pgp);
1949 1.1 skrll break;
1950 1.1 skrll }
1951 1.1 skrll }
1952 1.1 skrll }
1953 1.1 skrll
1954 1.1 skrll if (i >= count)
1955 1.1 skrll {
1956 1.1 skrll /* Only get the error once. */
1957 1.1 skrll *pgp = 4;
1958 1.1 skrll _bfd_set_gp_value (output_bfd, *pgp);
1959 1.1 skrll return FALSE;
1960 1.1 skrll }
1961 1.1 skrll
1962 1.1 skrll return TRUE;
1963 1.1 skrll }
1964 1.1 skrll
1965 1.1 skrll /* We have to figure out the gp value, so that we can adjust the
1966 1.1 skrll symbol value correctly. We look up the symbol _gp in the output
1967 1.1 skrll BFD. If we can't find it, we're stuck. We cache it in the ELF
1968 1.1 skrll target data. We don't need to adjust the symbol value for an
1969 1.1 skrll external symbol if we are producing relocatable output. */
1970 1.1 skrll
1971 1.1 skrll static bfd_reloc_status_type
1972 1.1 skrll mips_elf64_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
1973 1.1 skrll char **error_message, bfd_vma *pgp)
1974 1.1 skrll {
1975 1.1 skrll if (bfd_is_und_section (symbol->section)
1976 1.1 skrll && ! relocatable)
1977 1.1 skrll {
1978 1.1 skrll *pgp = 0;
1979 1.1 skrll return bfd_reloc_undefined;
1980 1.1 skrll }
1981 1.1 skrll
1982 1.1 skrll *pgp = _bfd_get_gp_value (output_bfd);
1983 1.1 skrll if (*pgp == 0
1984 1.1 skrll && (! relocatable
1985 1.1 skrll || (symbol->flags & BSF_SECTION_SYM) != 0))
1986 1.1 skrll {
1987 1.1 skrll if (relocatable)
1988 1.1 skrll {
1989 1.1 skrll /* Make up a value. */
1990 1.1 skrll *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
1991 1.1 skrll _bfd_set_gp_value (output_bfd, *pgp);
1992 1.1 skrll }
1993 1.1 skrll else if (!mips_elf64_assign_gp (output_bfd, pgp))
1994 1.1 skrll {
1995 1.1 skrll *error_message =
1996 1.1 skrll (char *) _("GP relative relocation when _gp not defined");
1997 1.1 skrll return bfd_reloc_dangerous;
1998 1.1 skrll }
1999 1.1 skrll }
2000 1.1 skrll
2001 1.1 skrll return bfd_reloc_ok;
2002 1.1 skrll }
2003 1.1 skrll
2004 1.1 skrll /* Do a R_MIPS_GPREL16 relocation. This is a 16 bit value which must
2005 1.1 skrll become the offset from the gp register. */
2006 1.1 skrll
2007 1.1 skrll static bfd_reloc_status_type
2008 1.1 skrll mips_elf64_gprel16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2009 1.1 skrll void *data, asection *input_section, bfd *output_bfd,
2010 1.1 skrll char **error_message)
2011 1.1 skrll {
2012 1.1 skrll bfd_boolean relocatable;
2013 1.1 skrll bfd_reloc_status_type ret;
2014 1.1 skrll bfd_vma gp;
2015 1.1 skrll
2016 1.1 skrll /* If we're relocating, and this is an external symbol, we don't want
2017 1.1 skrll to change anything. */
2018 1.1 skrll if (output_bfd != NULL
2019 1.1 skrll && (symbol->flags & BSF_SECTION_SYM) == 0
2020 1.1 skrll && (symbol->flags & BSF_LOCAL) != 0)
2021 1.1 skrll {
2022 1.1 skrll reloc_entry->address += input_section->output_offset;
2023 1.1 skrll return bfd_reloc_ok;
2024 1.1 skrll }
2025 1.1 skrll
2026 1.1 skrll if (output_bfd != NULL)
2027 1.1 skrll relocatable = TRUE;
2028 1.1 skrll else
2029 1.1 skrll {
2030 1.1 skrll relocatable = FALSE;
2031 1.1 skrll output_bfd = symbol->section->output_section->owner;
2032 1.1 skrll }
2033 1.1 skrll
2034 1.1 skrll ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
2035 1.1 skrll &gp);
2036 1.1 skrll if (ret != bfd_reloc_ok)
2037 1.1 skrll return ret;
2038 1.1 skrll
2039 1.1 skrll return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2040 1.1 skrll input_section, relocatable,
2041 1.1 skrll data, gp);
2042 1.1 skrll }
2043 1.1 skrll
2044 1.1 skrll /* Do a R_MIPS_LITERAL relocation. */
2045 1.1 skrll
2046 1.1 skrll static bfd_reloc_status_type
2047 1.1 skrll mips_elf64_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2048 1.1 skrll void *data, asection *input_section, bfd *output_bfd,
2049 1.1 skrll char **error_message)
2050 1.1 skrll {
2051 1.1 skrll bfd_boolean relocatable;
2052 1.1 skrll bfd_reloc_status_type ret;
2053 1.1 skrll bfd_vma gp;
2054 1.1 skrll
2055 1.1 skrll /* R_MIPS_LITERAL relocations are defined for local symbols only. */
2056 1.1 skrll if (output_bfd != NULL
2057 1.1 skrll && (symbol->flags & BSF_SECTION_SYM) == 0
2058 1.1 skrll && (symbol->flags & BSF_LOCAL) != 0)
2059 1.1 skrll {
2060 1.1 skrll *error_message = (char *)
2061 1.1 skrll _("literal relocation occurs for an external symbol");
2062 1.1 skrll return bfd_reloc_outofrange;
2063 1.1 skrll }
2064 1.1 skrll
2065 1.1 skrll /* FIXME: The entries in the .lit8 and .lit4 sections should be merged. */
2066 1.1 skrll if (output_bfd != NULL)
2067 1.1 skrll relocatable = TRUE;
2068 1.1 skrll else
2069 1.1 skrll {
2070 1.1 skrll relocatable = FALSE;
2071 1.1 skrll output_bfd = symbol->section->output_section->owner;
2072 1.1 skrll }
2073 1.1 skrll
2074 1.1 skrll ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
2075 1.1 skrll &gp);
2076 1.1 skrll if (ret != bfd_reloc_ok)
2077 1.1 skrll return ret;
2078 1.1 skrll
2079 1.1 skrll return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2080 1.1 skrll input_section, relocatable,
2081 1.1 skrll data, gp);
2082 1.1 skrll }
2083 1.1 skrll
2084 1.1 skrll /* Do a R_MIPS_GPREL32 relocation. This is a 32 bit value which must
2085 1.1 skrll become the offset from the gp register. */
2086 1.1 skrll
2087 1.1 skrll static bfd_reloc_status_type
2088 1.1 skrll mips_elf64_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2089 1.1 skrll void *data, asection *input_section, bfd *output_bfd,
2090 1.1 skrll char **error_message)
2091 1.1 skrll {
2092 1.1 skrll bfd_boolean relocatable;
2093 1.1 skrll bfd_reloc_status_type ret;
2094 1.1 skrll bfd_vma gp;
2095 1.1 skrll bfd_vma relocation;
2096 1.1 skrll bfd_vma val;
2097 1.1 skrll
2098 1.1 skrll /* R_MIPS_GPREL32 relocations are defined for local symbols only. */
2099 1.1 skrll if (output_bfd != NULL
2100 1.1 skrll && (symbol->flags & BSF_SECTION_SYM) == 0
2101 1.1 skrll && (symbol->flags & BSF_LOCAL) != 0)
2102 1.1 skrll {
2103 1.1 skrll *error_message = (char *)
2104 1.1 skrll _("32bits gp relative relocation occurs for an external symbol");
2105 1.1 skrll return bfd_reloc_outofrange;
2106 1.1 skrll }
2107 1.1 skrll
2108 1.1 skrll if (output_bfd != NULL)
2109 1.1 skrll relocatable = TRUE;
2110 1.1 skrll else
2111 1.1 skrll {
2112 1.1 skrll relocatable = FALSE;
2113 1.1 skrll output_bfd = symbol->section->output_section->owner;
2114 1.1 skrll }
2115 1.1 skrll
2116 1.1 skrll ret = mips_elf64_final_gp (output_bfd, symbol, relocatable,
2117 1.1 skrll error_message, &gp);
2118 1.1 skrll if (ret != bfd_reloc_ok)
2119 1.1 skrll return ret;
2120 1.1 skrll
2121 1.1 skrll if (bfd_is_com_section (symbol->section))
2122 1.1 skrll relocation = 0;
2123 1.1 skrll else
2124 1.1 skrll relocation = symbol->value;
2125 1.1 skrll
2126 1.1 skrll relocation += symbol->section->output_section->vma;
2127 1.1 skrll relocation += symbol->section->output_offset;
2128 1.1 skrll
2129 1.1 skrll if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2130 1.1 skrll return bfd_reloc_outofrange;
2131 1.1 skrll
2132 1.1 skrll /* Set val to the offset into the section or symbol. */
2133 1.1 skrll val = reloc_entry->addend;
2134 1.1 skrll
2135 1.1 skrll if (reloc_entry->howto->partial_inplace)
2136 1.1 skrll val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
2137 1.1 skrll
2138 1.1 skrll /* Adjust val for the final section location and GP value. If we
2139 1.1 skrll are producing relocatable output, we don't want to do this for
2140 1.1 skrll an external symbol. */
2141 1.1 skrll if (! relocatable
2142 1.1 skrll || (symbol->flags & BSF_SECTION_SYM) != 0)
2143 1.1 skrll val += relocation - gp;
2144 1.1 skrll
2145 1.1 skrll if (reloc_entry->howto->partial_inplace)
2146 1.1 skrll bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
2147 1.1 skrll else
2148 1.1 skrll reloc_entry->addend = val;
2149 1.1 skrll
2150 1.1 skrll if (relocatable)
2151 1.1 skrll reloc_entry->address += input_section->output_offset;
2152 1.1 skrll
2153 1.1 skrll return bfd_reloc_ok;
2154 1.1 skrll }
2155 1.1 skrll
2156 1.1 skrll /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
2157 1.1 skrll the rest is at bits 6-10. The bitpos already got right by the howto. */
2158 1.1 skrll
2159 1.1 skrll static bfd_reloc_status_type
2160 1.1 skrll mips_elf64_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2161 1.1 skrll void *data, asection *input_section, bfd *output_bfd,
2162 1.1 skrll char **error_message)
2163 1.1 skrll {
2164 1.1 skrll if (reloc_entry->howto->partial_inplace)
2165 1.1 skrll {
2166 1.1 skrll reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
2167 1.1 skrll | (reloc_entry->addend & 0x00000800) >> 9);
2168 1.1 skrll }
2169 1.1 skrll
2170 1.1 skrll return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2171 1.1 skrll input_section, output_bfd,
2172 1.1 skrll error_message);
2173 1.1 skrll }
2174 1.1 skrll
2175 1.1 skrll /* Handle a mips16 GP relative reloc. */
2176 1.1 skrll
2177 1.1 skrll static bfd_reloc_status_type
2178 1.1 skrll mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2179 1.1 skrll void *data, asection *input_section, bfd *output_bfd,
2180 1.1 skrll char **error_message)
2181 1.1 skrll {
2182 1.1 skrll bfd_boolean relocatable;
2183 1.1 skrll bfd_reloc_status_type ret;
2184 1.1 skrll bfd_byte *location;
2185 1.1 skrll bfd_vma gp;
2186 1.1 skrll
2187 1.1 skrll /* If we're relocating, and this is an external symbol, we don't want
2188 1.1 skrll to change anything. */
2189 1.1 skrll if (output_bfd != NULL
2190 1.1 skrll && (symbol->flags & BSF_SECTION_SYM) == 0
2191 1.1 skrll && (symbol->flags & BSF_LOCAL) != 0)
2192 1.1 skrll {
2193 1.1 skrll reloc_entry->address += input_section->output_offset;
2194 1.1 skrll return bfd_reloc_ok;
2195 1.1 skrll }
2196 1.1 skrll
2197 1.1 skrll if (output_bfd != NULL)
2198 1.1 skrll relocatable = TRUE;
2199 1.1 skrll else
2200 1.1 skrll {
2201 1.1 skrll relocatable = FALSE;
2202 1.1 skrll output_bfd = symbol->section->output_section->owner;
2203 1.1 skrll }
2204 1.1 skrll
2205 1.1 skrll ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
2206 1.1 skrll &gp);
2207 1.1 skrll if (ret != bfd_reloc_ok)
2208 1.1 skrll return ret;
2209 1.1 skrll
2210 1.1 skrll location = (bfd_byte *) data + reloc_entry->address;
2211 1.1 skrll _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
2212 1.1 skrll location);
2213 1.1 skrll ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2214 1.1 skrll input_section, relocatable,
2215 1.1 skrll data, gp);
2216 1.1 skrll _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
2217 1.1 skrll location);
2218 1.1 skrll
2219 1.1 skrll return ret;
2220 1.1 skrll }
2221 1.1 skrll
2222 1.1 skrll /* A mapping from BFD reloc types to MIPS ELF reloc types. */
2224 1.1 skrll
2225 1.1 skrll struct elf_reloc_map {
2226 1.1 skrll bfd_reloc_code_real_type bfd_val;
2227 1.1 skrll enum elf_mips_reloc_type elf_val;
2228 1.1 skrll };
2229 1.1 skrll
2230 1.1 skrll static const struct elf_reloc_map mips_reloc_map[] =
2231 1.1 skrll {
2232 1.1 skrll { BFD_RELOC_NONE, R_MIPS_NONE },
2233 1.1 skrll { BFD_RELOC_16, R_MIPS_16 },
2234 1.1 skrll { BFD_RELOC_32, R_MIPS_32 },
2235 1.1 skrll /* There is no BFD reloc for R_MIPS_REL32. */
2236 1.1 skrll { BFD_RELOC_64, R_MIPS_64 },
2237 1.1 skrll { BFD_RELOC_CTOR, R_MIPS_64 },
2238 1.1 skrll { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
2239 1.1 skrll { BFD_RELOC_HI16_S, R_MIPS_HI16 },
2240 1.1 skrll { BFD_RELOC_LO16, R_MIPS_LO16 },
2241 1.1 skrll { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
2242 1.1 skrll { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
2243 1.1 skrll { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
2244 1.1 skrll { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
2245 1.1 skrll { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
2246 1.1 skrll { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
2247 1.1 skrll { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
2248 1.1 skrll { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
2249 1.1 skrll { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
2250 1.1 skrll { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
2251 1.1 skrll { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
2252 1.1 skrll { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
2253 1.1 skrll { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
2254 1.1 skrll { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
2255 1.1 skrll { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
2256 1.1 skrll { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
2257 1.1 skrll { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
2258 1.1 skrll { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
2259 1.1 skrll { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
2260 1.1 skrll { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
2261 1.1 skrll { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
2262 1.1 skrll { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
2263 1.1 skrll { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
2264 1.1 skrll /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated. */
2265 1.1 skrll { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
2266 1.1 skrll { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
2267 1.1 skrll { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
2268 1.1 skrll { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
2269 1.1 skrll { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
2270 1.1 skrll { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
2271 1.1 skrll { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
2272 1.1 skrll { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
2273 1.1 skrll { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
2274 1.1 skrll { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
2275 1.1 skrll { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
2276 1.1 skrll { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
2277 1.1 skrll { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
2278 1.1 skrll { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
2279 1.1 skrll { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 }
2280 1.1 skrll };
2281 1.1 skrll
2282 1.1 skrll static const struct elf_reloc_map mips16_reloc_map[] =
2283 1.1 skrll {
2284 1.1 skrll { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
2285 1.1 skrll { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
2286 1.1 skrll { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
2287 1.1 skrll { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
2288 1.1 skrll { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
2289 1.1 skrll { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
2290 1.1 skrll };
2291 1.1 skrll
2292 1.1 skrll /* Given a BFD reloc type, return a howto structure. */
2293 1.1 skrll
2294 1.1 skrll static reloc_howto_type *
2295 1.1 skrll bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2296 1.1 skrll bfd_reloc_code_real_type code)
2297 1.1 skrll {
2298 1.1 skrll unsigned int i;
2299 1.1 skrll /* FIXME: We default to RELA here instead of choosing the right
2300 1.1 skrll relocation variant. */
2301 1.1 skrll reloc_howto_type *howto_table = mips_elf64_howto_table_rela;
2302 1.1 skrll reloc_howto_type *howto16_table = mips16_elf64_howto_table_rela;
2303 1.1 skrll
2304 1.1 skrll for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
2305 1.1 skrll i++)
2306 1.1 skrll {
2307 1.1 skrll if (mips_reloc_map[i].bfd_val == code)
2308 1.1 skrll return &howto_table[(int) mips_reloc_map[i].elf_val];
2309 1.1 skrll }
2310 1.1 skrll
2311 1.1 skrll for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
2312 1.1 skrll i++)
2313 1.1 skrll {
2314 1.1 skrll if (mips16_reloc_map[i].bfd_val == code)
2315 1.1 skrll return &howto16_table[(int) mips16_reloc_map[i].elf_val];
2316 1.1 skrll }
2317 1.1 skrll
2318 1.1 skrll switch (code)
2319 1.1 skrll {
2320 1.1 skrll case BFD_RELOC_VTABLE_INHERIT:
2321 1.1 skrll return &elf_mips_gnu_vtinherit_howto;
2322 1.1 skrll case BFD_RELOC_VTABLE_ENTRY:
2323 1.1 skrll return &elf_mips_gnu_vtentry_howto;
2324 1.1 skrll case BFD_RELOC_MIPS_COPY:
2325 1.1 skrll return &elf_mips_copy_howto;
2326 1.1 skrll case BFD_RELOC_MIPS_JUMP_SLOT:
2327 1.1 skrll return &elf_mips_jump_slot_howto;
2328 1.1 skrll default:
2329 1.1 skrll bfd_set_error (bfd_error_bad_value);
2330 1.1 skrll return NULL;
2331 1.1 skrll }
2332 1.1 skrll }
2333 1.1 skrll
2334 1.1 skrll static reloc_howto_type *
2335 1.1 skrll bfd_elf64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2336 1.1 skrll const char *r_name)
2337 1.1 skrll {
2338 1.1 skrll unsigned int i;
2339 1.1 skrll
2340 1.1 skrll for (i = 0;
2341 1.1 skrll i < (sizeof (mips_elf64_howto_table_rela)
2342 1.1 skrll / sizeof (mips_elf64_howto_table_rela[0])); i++)
2343 1.1 skrll if (mips_elf64_howto_table_rela[i].name != NULL
2344 1.1 skrll && strcasecmp (mips_elf64_howto_table_rela[i].name, r_name) == 0)
2345 1.1 skrll return &mips_elf64_howto_table_rela[i];
2346 1.1 skrll
2347 1.1 skrll for (i = 0;
2348 1.1 skrll i < (sizeof (mips16_elf64_howto_table_rela)
2349 1.1 skrll / sizeof (mips16_elf64_howto_table_rela[0]));
2350 1.1 skrll i++)
2351 1.1 skrll if (mips16_elf64_howto_table_rela[i].name != NULL
2352 1.1 skrll && strcasecmp (mips16_elf64_howto_table_rela[i].name, r_name) == 0)
2353 1.1 skrll return &mips16_elf64_howto_table_rela[i];
2354 1.1 skrll
2355 1.1 skrll if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
2356 1.1 skrll return &elf_mips_gnu_vtinherit_howto;
2357 1.1 skrll if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
2358 1.1 skrll return &elf_mips_gnu_vtentry_howto;
2359 1.1 skrll if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
2360 1.1 skrll return &elf_mips_gnu_rel16_s2;
2361 1.1 skrll if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
2362 1.1 skrll return &elf_mips_gnu_rela16_s2;
2363 1.1 skrll if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
2364 1.1 skrll return &elf_mips_copy_howto;
2365 1.1 skrll if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
2366 1.1 skrll return &elf_mips_jump_slot_howto;
2367 1.1 skrll
2368 1.1 skrll return NULL;
2369 1.1 skrll }
2370 1.1 skrll
2371 1.1 skrll /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */
2372 1.1 skrll
2373 1.1 skrll static reloc_howto_type *
2374 1.1 skrll mips_elf64_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
2375 1.1 skrll {
2376 1.1 skrll switch (r_type)
2377 1.1 skrll {
2378 1.1 skrll case R_MIPS_GNU_VTINHERIT:
2379 1.1 skrll return &elf_mips_gnu_vtinherit_howto;
2380 1.1 skrll case R_MIPS_GNU_VTENTRY:
2381 1.1 skrll return &elf_mips_gnu_vtentry_howto;
2382 1.1 skrll case R_MIPS_GNU_REL16_S2:
2383 1.1 skrll if (rela_p)
2384 1.1 skrll return &elf_mips_gnu_rela16_s2;
2385 1.1 skrll else
2386 1.1 skrll return &elf_mips_gnu_rel16_s2;
2387 1.1 skrll case R_MIPS_COPY:
2388 1.1 skrll return &elf_mips_copy_howto;
2389 1.1 skrll case R_MIPS_JUMP_SLOT:
2390 1.1 skrll return &elf_mips_jump_slot_howto;
2391 1.1 skrll default:
2392 1.1 skrll if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
2393 1.1 skrll {
2394 1.1 skrll if (rela_p)
2395 1.1 skrll return &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min];
2396 1.1 skrll else
2397 1.1 skrll return &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min];
2398 1.1 skrll }
2399 1.1 skrll BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
2400 1.1 skrll if (rela_p)
2401 1.1 skrll return &mips_elf64_howto_table_rela[r_type];
2402 1.1 skrll else
2403 1.1 skrll return &mips_elf64_howto_table_rel[r_type];
2404 1.1 skrll break;
2405 1.1 skrll }
2406 1.1 skrll }
2407 1.1 skrll
2408 1.1 skrll /* Prevent relocation handling by bfd for MIPS ELF64. */
2409 1.1 skrll
2410 1.1 skrll static void
2411 1.1 skrll mips_elf64_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
2412 1.1 skrll arelent *cache_ptr ATTRIBUTE_UNUSED,
2413 1.1 skrll Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
2414 1.1 skrll {
2415 1.1 skrll BFD_ASSERT (0);
2416 1.1 skrll }
2417 1.1 skrll
2418 1.1 skrll static void
2419 1.1 skrll mips_elf64_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
2420 1.1 skrll arelent *cache_ptr ATTRIBUTE_UNUSED,
2421 1.1 skrll Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
2422 1.1 skrll {
2423 1.1 skrll BFD_ASSERT (0);
2424 1.1 skrll }
2425 1.1 skrll
2426 1.1 skrll /* Since each entry in an SHT_REL or SHT_RELA section can represent up
2427 1.1 skrll to three relocs, we must tell the user to allocate more space. */
2428 1.1 skrll
2429 1.1 skrll static long
2430 1.1 skrll mips_elf64_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
2431 1.1 skrll {
2432 1.1 skrll return (sec->reloc_count * 3 + 1) * sizeof (arelent *);
2433 1.1 skrll }
2434 1.1 skrll
2435 1.1 skrll static long
2436 1.1 skrll mips_elf64_get_dynamic_reloc_upper_bound (bfd *abfd)
2437 1.1 skrll {
2438 1.1 skrll return _bfd_elf_get_dynamic_reloc_upper_bound (abfd) * 3;
2439 1.1 skrll }
2440 1.1 skrll
2441 1.1 skrll /* We must also copy more relocations than the corresponding functions
2442 1.1 skrll in elf.c would, so the two following functions are slightly
2443 1.1 skrll modified from elf.c, that multiply the external relocation count by
2444 1.1 skrll 3 to obtain the internal relocation count. */
2445 1.1 skrll
2446 1.1 skrll static long
2447 1.1 skrll mips_elf64_canonicalize_reloc (bfd *abfd, sec_ptr section,
2448 1.1 skrll arelent **relptr, asymbol **symbols)
2449 1.1 skrll {
2450 1.1 skrll arelent *tblptr;
2451 1.1 skrll unsigned int i;
2452 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2453 1.1 skrll
2454 1.1 skrll if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
2455 1.1 skrll return -1;
2456 1.1 skrll
2457 1.1 skrll tblptr = section->relocation;
2458 1.1 skrll for (i = 0; i < section->reloc_count * 3; i++)
2459 1.1 skrll *relptr++ = tblptr++;
2460 1.1 skrll
2461 1.1 skrll *relptr = NULL;
2462 1.1 skrll
2463 1.1 skrll return section->reloc_count * 3;
2464 1.1 skrll }
2465 1.1 skrll
2466 1.1 skrll static long
2467 1.1 skrll mips_elf64_canonicalize_dynamic_reloc (bfd *abfd, arelent **storage,
2468 1.1 skrll asymbol **syms)
2469 1.1 skrll {
2470 1.1 skrll bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
2471 1.1 skrll asection *s;
2472 1.1 skrll long ret;
2473 1.1 skrll
2474 1.1 skrll if (elf_dynsymtab (abfd) == 0)
2475 1.1 skrll {
2476 1.1 skrll bfd_set_error (bfd_error_invalid_operation);
2477 1.1 skrll return -1;
2478 1.1 skrll }
2479 1.1 skrll
2480 1.1 skrll slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
2481 1.1 skrll ret = 0;
2482 1.1 skrll for (s = abfd->sections; s != NULL; s = s->next)
2483 1.1 skrll {
2484 1.1 skrll if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
2485 1.1 skrll && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
2486 1.1 skrll || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
2487 1.1 skrll {
2488 1.1 skrll arelent *p;
2489 1.1 skrll long count, i;
2490 1.1 skrll
2491 1.1 skrll if (! (*slurp_relocs) (abfd, s, syms, TRUE))
2492 1.1 skrll return -1;
2493 1.1 skrll count = s->size / elf_section_data (s)->this_hdr.sh_entsize * 3;
2494 1.1 skrll p = s->relocation;
2495 1.1 skrll for (i = 0; i < count; i++)
2496 1.1 skrll *storage++ = p++;
2497 1.1 skrll ret += count;
2498 1.1 skrll }
2499 1.1 skrll }
2500 1.1 skrll
2501 1.1 skrll *storage = NULL;
2502 1.1 skrll
2503 1.1 skrll return ret;
2504 1.1 skrll }
2505 1.1 skrll
2506 1.1 skrll /* Read the relocations from one reloc section. This is mostly copied
2507 1.1 skrll from elfcode.h, except for the changes to expand one external
2508 1.1 skrll relocation to 3 internal ones. We must unfortunately set
2509 1.1 skrll reloc_count to the number of external relocations, because a lot of
2510 1.1 skrll generic code seems to depend on this. */
2511 1.1 skrll
2512 1.1 skrll static bfd_boolean
2513 1.1 skrll mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect,
2514 1.1 skrll Elf_Internal_Shdr *rel_hdr,
2515 1.1 skrll bfd_size_type reloc_count,
2516 1.1 skrll arelent *relents, asymbol **symbols,
2517 1.1 skrll bfd_boolean dynamic)
2518 1.1 skrll {
2519 1.1 skrll void *allocated;
2520 1.1 skrll bfd_byte *native_relocs;
2521 1.1 skrll arelent *relent;
2522 1.1 skrll bfd_vma i;
2523 1.1 skrll int entsize;
2524 1.1 skrll bfd_boolean rela_p;
2525 1.1 skrll
2526 1.1 skrll allocated = bfd_malloc (rel_hdr->sh_size);
2527 1.1 skrll if (allocated == NULL)
2528 1.1 skrll return FALSE;
2529 1.1 skrll
2530 1.1 skrll if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
2531 1.1 skrll || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
2532 1.1 skrll != rel_hdr->sh_size))
2533 1.1 skrll goto error_return;
2534 1.1 skrll
2535 1.1 skrll native_relocs = allocated;
2536 1.1 skrll
2537 1.1 skrll entsize = rel_hdr->sh_entsize;
2538 1.1 skrll BFD_ASSERT (entsize == sizeof (Elf64_Mips_External_Rel)
2539 1.1 skrll || entsize == sizeof (Elf64_Mips_External_Rela));
2540 1.1 skrll
2541 1.1 skrll if (entsize == sizeof (Elf64_Mips_External_Rel))
2542 1.1 skrll rela_p = FALSE;
2543 1.1 skrll else
2544 1.1 skrll rela_p = TRUE;
2545 1.1 skrll
2546 1.1 skrll for (i = 0, relent = relents;
2547 1.1 skrll i < reloc_count;
2548 1.1 skrll i++, native_relocs += entsize)
2549 1.1 skrll {
2550 1.1 skrll Elf64_Mips_Internal_Rela rela;
2551 1.1 skrll bfd_boolean used_sym, used_ssym;
2552 1.1 skrll int ir;
2553 1.1 skrll
2554 1.1 skrll if (entsize == sizeof (Elf64_Mips_External_Rela))
2555 1.1 skrll mips_elf64_swap_reloca_in (abfd,
2556 1.1 skrll (Elf64_Mips_External_Rela *) native_relocs,
2557 1.1 skrll &rela);
2558 1.1 skrll else
2559 1.1 skrll mips_elf64_swap_reloc_in (abfd,
2560 1.1 skrll (Elf64_Mips_External_Rel *) native_relocs,
2561 1.1 skrll &rela);
2562 1.1 skrll
2563 1.1 skrll /* Each entry represents exactly three actual relocations. */
2564 1.1 skrll
2565 1.1 skrll used_sym = FALSE;
2566 1.1 skrll used_ssym = FALSE;
2567 1.1 skrll for (ir = 0; ir < 3; ir++)
2568 1.1 skrll {
2569 1.1 skrll enum elf_mips_reloc_type type;
2570 1.1 skrll
2571 1.1 skrll switch (ir)
2572 1.1 skrll {
2573 1.1 skrll default:
2574 1.1 skrll abort ();
2575 1.1 skrll case 0:
2576 1.1 skrll type = (enum elf_mips_reloc_type) rela.r_type;
2577 1.1 skrll break;
2578 1.1 skrll case 1:
2579 1.1 skrll type = (enum elf_mips_reloc_type) rela.r_type2;
2580 1.1 skrll break;
2581 1.1 skrll case 2:
2582 1.1 skrll type = (enum elf_mips_reloc_type) rela.r_type3;
2583 1.1 skrll break;
2584 1.1 skrll }
2585 1.1 skrll
2586 1.1 skrll /* Some types require symbols, whereas some do not. */
2587 1.1 skrll switch (type)
2588 1.1 skrll {
2589 1.1 skrll case R_MIPS_NONE:
2590 1.1 skrll case R_MIPS_LITERAL:
2591 1.1 skrll case R_MIPS_INSERT_A:
2592 1.1 skrll case R_MIPS_INSERT_B:
2593 1.1 skrll case R_MIPS_DELETE:
2594 1.1 skrll relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
2595 1.1 skrll break;
2596 1.1 skrll
2597 1.1 skrll default:
2598 1.1 skrll if (! used_sym)
2599 1.1 skrll {
2600 1.1 skrll if (rela.r_sym == 0)
2601 1.1 skrll relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
2602 1.1 skrll else
2603 1.1 skrll {
2604 1.1 skrll asymbol **ps, *s;
2605 1.1 skrll
2606 1.1 skrll ps = symbols + rela.r_sym - 1;
2607 1.1 skrll s = *ps;
2608 1.1 skrll if ((s->flags & BSF_SECTION_SYM) == 0)
2609 1.1 skrll relent->sym_ptr_ptr = ps;
2610 1.1 skrll else
2611 1.1 skrll relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
2612 1.1 skrll }
2613 1.1 skrll
2614 1.1 skrll used_sym = TRUE;
2615 1.1 skrll }
2616 1.1 skrll else if (! used_ssym)
2617 1.1 skrll {
2618 1.1 skrll switch (rela.r_ssym)
2619 1.1 skrll {
2620 1.1 skrll case RSS_UNDEF:
2621 1.1 skrll relent->sym_ptr_ptr =
2622 1.1 skrll bfd_abs_section_ptr->symbol_ptr_ptr;
2623 1.1 skrll break;
2624 1.1 skrll
2625 1.1 skrll case RSS_GP:
2626 1.1 skrll case RSS_GP0:
2627 1.1 skrll case RSS_LOC:
2628 1.1 skrll /* FIXME: I think these need to be handled using
2629 1.1 skrll special howto structures. */
2630 1.1 skrll BFD_ASSERT (0);
2631 1.1 skrll break;
2632 1.1 skrll
2633 1.1 skrll default:
2634 1.1 skrll BFD_ASSERT (0);
2635 1.1 skrll break;
2636 1.1 skrll }
2637 1.1 skrll
2638 1.1 skrll used_ssym = TRUE;
2639 1.1 skrll }
2640 1.1 skrll else
2641 1.1 skrll relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
2642 1.1 skrll
2643 1.1 skrll break;
2644 1.1 skrll }
2645 1.1 skrll
2646 1.1 skrll /* The address of an ELF reloc is section relative for an
2647 1.1 skrll object file, and absolute for an executable file or
2648 1.1 skrll shared library. The address of a BFD reloc is always
2649 1.1 skrll section relative. */
2650 1.1 skrll if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
2651 1.1 skrll relent->address = rela.r_offset;
2652 1.1 skrll else
2653 1.1 skrll relent->address = rela.r_offset - asect->vma;
2654 1.1 skrll
2655 1.1 skrll relent->addend = rela.r_addend;
2656 1.1 skrll
2657 1.1 skrll relent->howto = mips_elf64_rtype_to_howto (type, rela_p);
2658 1.1 skrll
2659 1.1 skrll ++relent;
2660 1.1 skrll }
2661 1.1 skrll }
2662 1.1 skrll
2663 1.1 skrll asect->reloc_count += (relent - relents) / 3;
2664 1.1 skrll
2665 1.1 skrll if (allocated != NULL)
2666 1.1 skrll free (allocated);
2667 1.1 skrll
2668 1.1 skrll return TRUE;
2669 1.1 skrll
2670 1.1 skrll error_return:
2671 1.1 skrll if (allocated != NULL)
2672 1.1 skrll free (allocated);
2673 1.1 skrll return FALSE;
2674 1.1 skrll }
2675 1.1 skrll
2676 1.1 skrll /* Read the relocations. On Irix 6, there can be two reloc sections
2677 1.1 skrll associated with a single data section. This is copied from
2678 1.1 skrll elfcode.h as well, with changes as small as accounting for 3
2679 1.1 skrll internal relocs per external reloc and resetting reloc_count to
2680 1.1 skrll zero before processing the relocs of a section. */
2681 1.1 skrll
2682 1.1 skrll static bfd_boolean
2683 1.1 skrll mips_elf64_slurp_reloc_table (bfd *abfd, asection *asect,
2684 1.1 skrll asymbol **symbols, bfd_boolean dynamic)
2685 1.1 skrll {
2686 1.1 skrll struct bfd_elf_section_data * const d = elf_section_data (asect);
2687 1.1 skrll Elf_Internal_Shdr *rel_hdr;
2688 1.1 skrll Elf_Internal_Shdr *rel_hdr2;
2689 1.1 skrll bfd_size_type reloc_count;
2690 1.1 skrll bfd_size_type reloc_count2;
2691 1.1 skrll arelent *relents;
2692 1.1 skrll bfd_size_type amt;
2693 1.1 skrll
2694 1.1 skrll if (asect->relocation != NULL)
2695 1.1 skrll return TRUE;
2696 1.1 skrll
2697 1.1 skrll if (! dynamic)
2698 1.1 skrll {
2699 1.1 skrll if ((asect->flags & SEC_RELOC) == 0
2700 1.1 skrll || asect->reloc_count == 0)
2701 1.1 skrll return TRUE;
2702 1.1 skrll
2703 1.1 skrll rel_hdr = &d->rel_hdr;
2704 1.1 skrll reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
2705 1.1 skrll rel_hdr2 = d->rel_hdr2;
2706 1.1 skrll reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0);
2707 1.1 skrll
2708 1.1 skrll BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
2709 1.1 skrll BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset
2710 1.1 skrll || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
2711 1.1 skrll
2712 1.1 skrll }
2713 1.1 skrll else
2714 1.1 skrll {
2715 1.1 skrll /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
2716 1.1 skrll case because relocations against this section may use the
2717 1.1 skrll dynamic symbol table, and in that case bfd_section_from_shdr
2718 1.1 skrll in elf.c does not update the RELOC_COUNT. */
2719 1.1 skrll if (asect->size == 0)
2720 1.1 skrll return TRUE;
2721 1.1 skrll
2722 1.1 skrll rel_hdr = &d->this_hdr;
2723 1.1 skrll reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
2724 1.1 skrll rel_hdr2 = NULL;
2725 1.1 skrll reloc_count2 = 0;
2726 1.1 skrll }
2727 1.1 skrll
2728 1.1 skrll /* Allocate space for 3 arelent structures for each Rel structure. */
2729 1.1 skrll amt = (reloc_count + reloc_count2) * 3 * sizeof (arelent);
2730 1.1 skrll relents = bfd_alloc (abfd, amt);
2731 1.1 skrll if (relents == NULL)
2732 1.1 skrll return FALSE;
2733 1.1 skrll
2734 1.1 skrll /* The slurp_one_reloc_table routine increments reloc_count. */
2735 1.1 skrll asect->reloc_count = 0;
2736 1.1 skrll
2737 1.1 skrll if (! mips_elf64_slurp_one_reloc_table (abfd, asect,
2738 1.1 skrll rel_hdr, reloc_count,
2739 1.1 skrll relents,
2740 1.1 skrll symbols, dynamic))
2741 1.1 skrll return FALSE;
2742 1.1 skrll if (d->rel_hdr2 != NULL)
2743 1.1 skrll {
2744 1.1 skrll if (! mips_elf64_slurp_one_reloc_table (abfd, asect,
2745 1.1 skrll rel_hdr2, reloc_count2,
2746 1.1 skrll relents + reloc_count * 3,
2747 1.1 skrll symbols, dynamic))
2748 1.1 skrll return FALSE;
2749 1.1 skrll }
2750 1.1 skrll
2751 1.1 skrll asect->relocation = relents;
2752 1.1 skrll return TRUE;
2753 1.1 skrll }
2754 1.1 skrll
2755 1.1 skrll /* Write out the relocations. */
2756 1.1 skrll
2757 1.1 skrll static void
2758 1.1 skrll mips_elf64_write_relocs (bfd *abfd, asection *sec, void *data)
2759 1.1 skrll {
2760 1.1 skrll bfd_boolean *failedp = data;
2761 1.1 skrll int count;
2762 1.1 skrll Elf_Internal_Shdr *rel_hdr;
2763 1.1 skrll unsigned int idx;
2764 1.1 skrll
2765 1.1 skrll /* If we have already failed, don't do anything. */
2766 1.1 skrll if (*failedp)
2767 1.1 skrll return;
2768 1.1 skrll
2769 1.1 skrll if ((sec->flags & SEC_RELOC) == 0)
2770 1.1 skrll return;
2771 1.1 skrll
2772 1.1 skrll /* The linker backend writes the relocs out itself, and sets the
2773 1.1 skrll reloc_count field to zero to inhibit writing them here. Also,
2774 1.1 skrll sometimes the SEC_RELOC flag gets set even when there aren't any
2775 1.1 skrll relocs. */
2776 1.1 skrll if (sec->reloc_count == 0)
2777 1.1 skrll return;
2778 1.1 skrll
2779 1.1 skrll /* We can combine up to three relocs that refer to the same address
2780 1.1 skrll if the latter relocs have no associated symbol. */
2781 1.1 skrll count = 0;
2782 1.1 skrll for (idx = 0; idx < sec->reloc_count; idx++)
2783 1.1 skrll {
2784 1.1 skrll bfd_vma addr;
2785 1.1 skrll unsigned int i;
2786 1.1 skrll
2787 1.1 skrll ++count;
2788 1.1 skrll
2789 1.1 skrll addr = sec->orelocation[idx]->address;
2790 1.1 skrll for (i = 0; i < 2; i++)
2791 1.1 skrll {
2792 1.1 skrll arelent *r;
2793 1.1 skrll
2794 1.1 skrll if (idx + 1 >= sec->reloc_count)
2795 1.1 skrll break;
2796 1.1 skrll r = sec->orelocation[idx + 1];
2797 1.1 skrll if (r->address != addr
2798 1.1 skrll || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
2799 1.1 skrll || (*r->sym_ptr_ptr)->value != 0)
2800 1.1 skrll break;
2801 1.1 skrll
2802 1.1 skrll /* We can merge the reloc at IDX + 1 with the reloc at IDX. */
2803 1.1 skrll
2804 1.1 skrll ++idx;
2805 1.1 skrll }
2806 1.1 skrll }
2807 1.1 skrll
2808 1.1 skrll rel_hdr = &elf_section_data (sec)->rel_hdr;
2809 1.1 skrll
2810 1.1 skrll /* Do the actual relocation. */
2811 1.1 skrll
2812 1.1 skrll if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rel))
2813 1.1 skrll mips_elf64_write_rel (abfd, sec, rel_hdr, &count, data);
2814 1.1 skrll else if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rela))
2815 1.1 skrll mips_elf64_write_rela (abfd, sec, rel_hdr, &count, data);
2816 1.1 skrll else
2817 1.1 skrll BFD_ASSERT (0);
2818 1.1 skrll }
2819 1.1 skrll
2820 1.1 skrll static void
2821 1.1 skrll mips_elf64_write_rel (bfd *abfd, asection *sec,
2822 1.1 skrll Elf_Internal_Shdr *rel_hdr,
2823 1.1 skrll int *count, void *data)
2824 1.1 skrll {
2825 1.1 skrll bfd_boolean *failedp = data;
2826 1.1 skrll Elf64_Mips_External_Rel *ext_rel;
2827 1.1 skrll unsigned int idx;
2828 1.1 skrll asymbol *last_sym = 0;
2829 1.1 skrll int last_sym_idx = 0;
2830 1.1 skrll
2831 1.1 skrll rel_hdr->sh_size = rel_hdr->sh_entsize * *count;
2832 1.1 skrll rel_hdr->contents = bfd_alloc (abfd, rel_hdr->sh_size);
2833 1.1 skrll if (rel_hdr->contents == NULL)
2834 1.1 skrll {
2835 1.1 skrll *failedp = TRUE;
2836 1.1 skrll return;
2837 1.1 skrll }
2838 1.1 skrll
2839 1.1 skrll ext_rel = (Elf64_Mips_External_Rel *) rel_hdr->contents;
2840 1.1 skrll for (idx = 0; idx < sec->reloc_count; idx++, ext_rel++)
2841 1.1 skrll {
2842 1.1 skrll arelent *ptr;
2843 1.1 skrll Elf64_Mips_Internal_Rela int_rel;
2844 1.1 skrll asymbol *sym;
2845 1.1 skrll int n;
2846 1.1 skrll unsigned int i;
2847 1.1 skrll
2848 1.1 skrll ptr = sec->orelocation[idx];
2849 1.1 skrll
2850 1.1 skrll /* The address of an ELF reloc is section relative for an object
2851 1.1 skrll file, and absolute for an executable file or shared library.
2852 1.1 skrll The address of a BFD reloc is always section relative. */
2853 1.1 skrll if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
2854 1.1 skrll int_rel.r_offset = ptr->address;
2855 1.1 skrll else
2856 1.1 skrll int_rel.r_offset = ptr->address + sec->vma;
2857 1.1 skrll
2858 1.1 skrll sym = *ptr->sym_ptr_ptr;
2859 1.1 skrll if (sym == last_sym)
2860 1.1 skrll n = last_sym_idx;
2861 1.1 skrll else if (bfd_is_abs_section (sym->section) && sym->value == 0)
2862 1.1 skrll n = STN_UNDEF;
2863 1.1 skrll else
2864 1.1 skrll {
2865 1.1 skrll last_sym = sym;
2866 1.1 skrll n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
2867 1.1 skrll if (n < 0)
2868 1.1 skrll {
2869 1.1 skrll *failedp = TRUE;
2870 1.1 skrll return;
2871 1.1 skrll }
2872 1.1 skrll last_sym_idx = n;
2873 1.1 skrll }
2874 1.1 skrll
2875 1.1 skrll int_rel.r_sym = n;
2876 1.1 skrll int_rel.r_ssym = RSS_UNDEF;
2877 1.1 skrll
2878 1.1 skrll if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
2879 1.1 skrll && ! _bfd_elf_validate_reloc (abfd, ptr))
2880 1.1 skrll {
2881 1.1 skrll *failedp = TRUE;
2882 1.1 skrll return;
2883 1.1 skrll }
2884 1.1 skrll
2885 1.1 skrll int_rel.r_type = ptr->howto->type;
2886 1.1 skrll int_rel.r_type2 = (int) R_MIPS_NONE;
2887 1.1 skrll int_rel.r_type3 = (int) R_MIPS_NONE;
2888 1.1 skrll
2889 1.1 skrll for (i = 0; i < 2; i++)
2890 1.1 skrll {
2891 1.1 skrll arelent *r;
2892 1.1 skrll
2893 1.1 skrll if (idx + 1 >= sec->reloc_count)
2894 1.1 skrll break;
2895 1.1 skrll r = sec->orelocation[idx + 1];
2896 1.1 skrll if (r->address != ptr->address
2897 1.1 skrll || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
2898 1.1 skrll || (*r->sym_ptr_ptr)->value != 0)
2899 1.1 skrll break;
2900 1.1 skrll
2901 1.1 skrll /* We can merge the reloc at IDX + 1 with the reloc at IDX. */
2902 1.1 skrll
2903 1.1 skrll if (i == 0)
2904 1.1 skrll int_rel.r_type2 = r->howto->type;
2905 1.1 skrll else
2906 1.1 skrll int_rel.r_type3 = r->howto->type;
2907 1.1 skrll
2908 1.1 skrll ++idx;
2909 1.1 skrll }
2910 1.1 skrll
2911 1.1 skrll mips_elf64_swap_reloc_out (abfd, &int_rel, ext_rel);
2912 1.1 skrll }
2913 1.1 skrll
2914 1.1 skrll BFD_ASSERT (ext_rel - (Elf64_Mips_External_Rel *) rel_hdr->contents
2915 1.1 skrll == *count);
2916 1.1 skrll }
2917 1.1 skrll
2918 1.1 skrll static void
2919 1.1 skrll mips_elf64_write_rela (bfd *abfd, asection *sec,
2920 1.1 skrll Elf_Internal_Shdr *rela_hdr,
2921 1.1 skrll int *count, void *data)
2922 1.1 skrll {
2923 1.1 skrll bfd_boolean *failedp = data;
2924 1.1 skrll Elf64_Mips_External_Rela *ext_rela;
2925 1.1 skrll unsigned int idx;
2926 1.1 skrll asymbol *last_sym = 0;
2927 1.1 skrll int last_sym_idx = 0;
2928 1.1 skrll
2929 1.1 skrll rela_hdr->sh_size = rela_hdr->sh_entsize * *count;
2930 1.1 skrll rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size);
2931 1.1 skrll if (rela_hdr->contents == NULL)
2932 1.1 skrll {
2933 1.1 skrll *failedp = TRUE;
2934 1.1 skrll return;
2935 1.1 skrll }
2936 1.1 skrll
2937 1.1 skrll ext_rela = (Elf64_Mips_External_Rela *) rela_hdr->contents;
2938 1.1 skrll for (idx = 0; idx < sec->reloc_count; idx++, ext_rela++)
2939 1.1 skrll {
2940 1.1 skrll arelent *ptr;
2941 1.1 skrll Elf64_Mips_Internal_Rela int_rela;
2942 1.1 skrll asymbol *sym;
2943 1.1 skrll int n;
2944 1.1 skrll unsigned int i;
2945 1.1 skrll
2946 1.1 skrll ptr = sec->orelocation[idx];
2947 1.1 skrll
2948 1.1 skrll /* The address of an ELF reloc is section relative for an object
2949 1.1 skrll file, and absolute for an executable file or shared library.
2950 1.1 skrll The address of a BFD reloc is always section relative. */
2951 1.1 skrll if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
2952 1.1 skrll int_rela.r_offset = ptr->address;
2953 1.1 skrll else
2954 1.1 skrll int_rela.r_offset = ptr->address + sec->vma;
2955 1.1 skrll
2956 1.1 skrll sym = *ptr->sym_ptr_ptr;
2957 1.1 skrll if (sym == last_sym)
2958 1.1 skrll n = last_sym_idx;
2959 1.1 skrll else if (bfd_is_abs_section (sym->section) && sym->value == 0)
2960 1.1 skrll n = STN_UNDEF;
2961 1.1 skrll else
2962 1.1 skrll {
2963 1.1 skrll last_sym = sym;
2964 1.1 skrll n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
2965 1.1 skrll if (n < 0)
2966 1.1 skrll {
2967 1.1 skrll *failedp = TRUE;
2968 1.1 skrll return;
2969 1.1 skrll }
2970 1.1 skrll last_sym_idx = n;
2971 1.1 skrll }
2972 1.1 skrll
2973 1.1 skrll int_rela.r_sym = n;
2974 1.1 skrll int_rela.r_addend = ptr->addend;
2975 1.1 skrll int_rela.r_ssym = RSS_UNDEF;
2976 1.1 skrll
2977 1.1 skrll if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
2978 1.1 skrll && ! _bfd_elf_validate_reloc (abfd, ptr))
2979 1.1 skrll {
2980 1.1 skrll *failedp = TRUE;
2981 1.1 skrll return;
2982 1.1 skrll }
2983 1.1 skrll
2984 1.1 skrll int_rela.r_type = ptr->howto->type;
2985 1.1 skrll int_rela.r_type2 = (int) R_MIPS_NONE;
2986 1.1 skrll int_rela.r_type3 = (int) R_MIPS_NONE;
2987 1.1 skrll
2988 1.1 skrll for (i = 0; i < 2; i++)
2989 1.1 skrll {
2990 1.1 skrll arelent *r;
2991 1.1 skrll
2992 1.1 skrll if (idx + 1 >= sec->reloc_count)
2993 1.1 skrll break;
2994 1.1 skrll r = sec->orelocation[idx + 1];
2995 1.1 skrll if (r->address != ptr->address
2996 1.1 skrll || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
2997 1.1 skrll || (*r->sym_ptr_ptr)->value != 0)
2998 1.1 skrll break;
2999 1.1 skrll
3000 1.1 skrll /* We can merge the reloc at IDX + 1 with the reloc at IDX. */
3001 1.1 skrll
3002 1.1 skrll if (i == 0)
3003 1.1 skrll int_rela.r_type2 = r->howto->type;
3004 1.1 skrll else
3005 1.1 skrll int_rela.r_type3 = r->howto->type;
3006 1.1 skrll
3007 1.1 skrll ++idx;
3008 1.1 skrll }
3009 1.1 skrll
3010 1.1 skrll mips_elf64_swap_reloca_out (abfd, &int_rela, ext_rela);
3011 1.1 skrll }
3012 1.1 skrll
3013 1.1 skrll BFD_ASSERT (ext_rela - (Elf64_Mips_External_Rela *) rela_hdr->contents
3014 1.1 skrll == *count);
3015 1.1 skrll }
3016 1.1 skrll
3017 1.1 skrll /* Set the right machine number for a MIPS ELF file. */
3019 1.1 skrll
3020 1.1 skrll static bfd_boolean
3021 1.1 skrll mips_elf64_object_p (bfd *abfd)
3022 1.1 skrll {
3023 1.1 skrll unsigned long mach;
3024 1.1 skrll
3025 1.1 skrll /* Irix 6 is broken. Object file symbol tables are not always
3026 1.1 skrll sorted correctly such that local symbols precede global symbols,
3027 1.1 skrll and the sh_info field in the symbol table is not always right. */
3028 1.1 skrll if (elf64_mips_irix_compat (abfd) != ict_none)
3029 1.1 skrll elf_bad_symtab (abfd) = TRUE;
3030 1.1 skrll
3031 1.1 skrll mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
3032 1.1 skrll bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
3033 1.1 skrll return TRUE;
3034 1.1 skrll }
3035 1.1 skrll
3036 1.1 skrll /* Depending on the target vector we generate some version of Irix
3037 1.1 skrll executables or "normal" MIPS ELF ABI executables. */
3038 1.1 skrll static irix_compat_t
3039 1.1 skrll elf64_mips_irix_compat (bfd *abfd)
3040 1.1 skrll {
3041 1.1 skrll if ((abfd->xvec == &bfd_elf64_bigmips_vec)
3042 1.1 skrll || (abfd->xvec == &bfd_elf64_littlemips_vec))
3043 1.1 skrll return ict_irix6;
3044 1.1 skrll else
3045 1.1 skrll return ict_none;
3046 1.1 skrll }
3047 1.1 skrll
3048 1.1 skrll /* Support for core dump NOTE sections. */
3050 1.1 skrll static bfd_boolean
3051 1.1 skrll elf64_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3052 1.1 skrll {
3053 1.1 skrll int offset;
3054 1.1 skrll unsigned int size;
3055 1.1 skrll
3056 1.1 skrll switch (note->descsz)
3057 1.1 skrll {
3058 1.1 skrll default:
3059 1.1 skrll return FALSE;
3060 1.1 skrll
3061 1.1 skrll case 480: /* Linux/MIPS - N64 kernel */
3062 1.1 skrll /* pr_cursig */
3063 1.1 skrll elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
3064 1.1 skrll
3065 1.1 skrll /* pr_pid */
3066 1.1 skrll elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 32);
3067 1.1 skrll
3068 1.1 skrll /* pr_reg */
3069 1.1 skrll offset = 112;
3070 1.1 skrll size = 360;
3071 1.1 skrll
3072 1.1 skrll break;
3073 1.1 skrll }
3074 1.1 skrll
3075 1.1 skrll /* Make a ".reg/999" section. */
3076 1.1 skrll return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3077 1.1 skrll size, note->descpos + offset);
3078 1.1 skrll }
3079 1.1 skrll
3080 1.1 skrll static bfd_boolean
3081 1.1 skrll elf64_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3082 1.1 skrll {
3083 1.1 skrll switch (note->descsz)
3084 1.1 skrll {
3085 1.1 skrll default:
3086 1.1 skrll return FALSE;
3087 1.1 skrll
3088 1.1 skrll case 136: /* Linux/MIPS - N64 kernel elf_prpsinfo */
3089 1.1 skrll elf_tdata (abfd)->core_program
3090 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
3091 1.1 skrll elf_tdata (abfd)->core_command
3092 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
3093 1.1 skrll }
3094 1.1 skrll
3095 1.1 skrll /* Note that for some reason, a spurious space is tacked
3096 1.1 skrll onto the end of the args in some (at least one anyway)
3097 1.1 skrll implementations, so strip it off if it exists. */
3098 1.1 skrll
3099 1.1 skrll {
3100 1.1 skrll char *command = elf_tdata (abfd)->core_command;
3101 1.1 skrll int n = strlen (command);
3102 1.1 skrll
3103 1.1 skrll if (0 < n && command[n - 1] == ' ')
3104 1.1 skrll command[n - 1] = '\0';
3105 1.1 skrll }
3106 1.1 skrll
3107 1.1 skrll return TRUE;
3108 1.1 skrll }
3109 1.1 skrll
3110 1.1 skrll /* ECOFF swapping routines. These are used when dealing with the
3112 1.1 skrll .mdebug section, which is in the ECOFF debugging format. */
3113 1.1 skrll static const struct ecoff_debug_swap mips_elf64_ecoff_debug_swap =
3114 1.1 skrll {
3115 1.1 skrll /* Symbol table magic number. */
3116 1.1 skrll magicSym2,
3117 1.1 skrll /* Alignment of debugging information. E.g., 4. */
3118 1.1 skrll 8,
3119 1.1 skrll /* Sizes of external symbolic information. */
3120 1.1 skrll sizeof (struct hdr_ext),
3121 1.1 skrll sizeof (struct dnr_ext),
3122 1.1 skrll sizeof (struct pdr_ext),
3123 1.1 skrll sizeof (struct sym_ext),
3124 1.1 skrll sizeof (struct opt_ext),
3125 1.1 skrll sizeof (struct fdr_ext),
3126 1.1 skrll sizeof (struct rfd_ext),
3127 1.1 skrll sizeof (struct ext_ext),
3128 1.1 skrll /* Functions to swap in external symbolic data. */
3129 1.1 skrll ecoff_swap_hdr_in,
3130 1.1 skrll ecoff_swap_dnr_in,
3131 1.1 skrll ecoff_swap_pdr_in,
3132 1.1 skrll ecoff_swap_sym_in,
3133 1.1 skrll ecoff_swap_opt_in,
3134 1.1 skrll ecoff_swap_fdr_in,
3135 1.1 skrll ecoff_swap_rfd_in,
3136 1.1 skrll ecoff_swap_ext_in,
3137 1.1 skrll _bfd_ecoff_swap_tir_in,
3138 1.1 skrll _bfd_ecoff_swap_rndx_in,
3139 1.1 skrll /* Functions to swap out external symbolic data. */
3140 1.1 skrll ecoff_swap_hdr_out,
3141 1.1 skrll ecoff_swap_dnr_out,
3142 1.1 skrll ecoff_swap_pdr_out,
3143 1.1 skrll ecoff_swap_sym_out,
3144 1.1 skrll ecoff_swap_opt_out,
3145 1.1 skrll ecoff_swap_fdr_out,
3146 1.1 skrll ecoff_swap_rfd_out,
3147 1.1 skrll ecoff_swap_ext_out,
3148 1.1 skrll _bfd_ecoff_swap_tir_out,
3149 1.1 skrll _bfd_ecoff_swap_rndx_out,
3150 1.1 skrll /* Function to read in symbolic data. */
3151 1.1 skrll _bfd_mips_elf_read_ecoff_info
3152 1.1 skrll };
3153 1.1 skrll
3154 1.1 skrll /* Relocations in the 64 bit MIPS ELF ABI are more complex than in
3156 1.1 skrll standard ELF. This structure is used to redirect the relocation
3157 1.1 skrll handling routines. */
3158 1.1 skrll
3159 1.1 skrll const struct elf_size_info mips_elf64_size_info =
3160 1.1 skrll {
3161 1.1 skrll sizeof (Elf64_External_Ehdr),
3162 1.1 skrll sizeof (Elf64_External_Phdr),
3163 1.1 skrll sizeof (Elf64_External_Shdr),
3164 1.1 skrll sizeof (Elf64_Mips_External_Rel),
3165 1.1 skrll sizeof (Elf64_Mips_External_Rela),
3166 1.1 skrll sizeof (Elf64_External_Sym),
3167 1.1 skrll sizeof (Elf64_External_Dyn),
3168 1.1 skrll sizeof (Elf_External_Note),
3169 1.1 skrll 4, /* hash-table entry size */
3170 1.1 skrll 3, /* internal relocations per external relocations */
3171 1.1 skrll 64, /* arch_size */
3172 1.1 skrll 3, /* log_file_align */
3173 1.1 skrll ELFCLASS64,
3174 1.1 skrll EV_CURRENT,
3175 1.1 skrll bfd_elf64_write_out_phdrs,
3176 1.1 skrll bfd_elf64_write_shdrs_and_ehdr,
3177 1.1 skrll bfd_elf64_checksum_contents,
3178 1.1 skrll mips_elf64_write_relocs,
3179 1.1 skrll bfd_elf64_swap_symbol_in,
3180 1.1 skrll bfd_elf64_swap_symbol_out,
3181 1.1 skrll mips_elf64_slurp_reloc_table,
3182 1.1 skrll bfd_elf64_slurp_symbol_table,
3183 1.1 skrll bfd_elf64_swap_dyn_in,
3184 1.1 skrll bfd_elf64_swap_dyn_out,
3185 1.1 skrll mips_elf64_be_swap_reloc_in,
3186 1.1 skrll mips_elf64_be_swap_reloc_out,
3187 1.1 skrll mips_elf64_be_swap_reloca_in,
3188 1.1 skrll mips_elf64_be_swap_reloca_out
3189 1.1 skrll };
3190 1.1 skrll
3191 1.1 skrll #define ELF_ARCH bfd_arch_mips
3192 1.1 skrll #define ELF_MACHINE_CODE EM_MIPS
3193 1.1 skrll
3194 1.1 skrll #define elf_backend_collect TRUE
3195 1.1 skrll #define elf_backend_type_change_ok TRUE
3196 1.1 skrll #define elf_backend_can_gc_sections TRUE
3197 1.1 skrll #define elf_info_to_howto mips_elf64_info_to_howto_rela
3198 1.1 skrll #define elf_info_to_howto_rel mips_elf64_info_to_howto_rel
3199 1.1 skrll #define elf_backend_object_p mips_elf64_object_p
3200 1.1 skrll #define elf_backend_symbol_processing _bfd_mips_elf_symbol_processing
3201 1.1 skrll #define elf_backend_section_processing _bfd_mips_elf_section_processing
3202 1.1 skrll #define elf_backend_section_from_shdr _bfd_mips_elf_section_from_shdr
3203 1.1 skrll #define elf_backend_fake_sections _bfd_mips_elf_fake_sections
3204 1.1 skrll #define elf_backend_section_from_bfd_section \
3205 1.1 skrll _bfd_mips_elf_section_from_bfd_section
3206 1.1 skrll #define elf_backend_add_symbol_hook _bfd_mips_elf_add_symbol_hook
3207 1.1 skrll #define elf_backend_link_output_symbol_hook \
3208 1.1 skrll _bfd_mips_elf_link_output_symbol_hook
3209 1.1 skrll #define elf_backend_create_dynamic_sections \
3210 1.1 skrll _bfd_mips_elf_create_dynamic_sections
3211 1.1 skrll #define elf_backend_check_relocs _bfd_mips_elf_check_relocs
3212 1.1 skrll #define elf_backend_merge_symbol_attribute \
3213 1.1 skrll _bfd_mips_elf_merge_symbol_attribute
3214 1.1 skrll #define elf_backend_get_target_dtag _bfd_mips_elf_get_target_dtag
3215 1.1 skrll #define elf_backend_adjust_dynamic_symbol \
3216 1.1 skrll _bfd_mips_elf_adjust_dynamic_symbol
3217 1.1 skrll #define elf_backend_always_size_sections \
3218 1.1 skrll _bfd_mips_elf_always_size_sections
3219 1.1 skrll #define elf_backend_size_dynamic_sections \
3220 1.1 skrll _bfd_mips_elf_size_dynamic_sections
3221 1.1 skrll #define elf_backend_init_index_section _bfd_elf_init_1_index_section
3222 1.1 skrll #define elf_backend_relocate_section _bfd_mips_elf_relocate_section
3223 1.1 skrll #define elf_backend_finish_dynamic_symbol \
3224 1.1 skrll _bfd_mips_elf_finish_dynamic_symbol
3225 1.1 skrll #define elf_backend_finish_dynamic_sections \
3226 1.1 skrll _bfd_mips_elf_finish_dynamic_sections
3227 1.1 skrll #define elf_backend_final_write_processing \
3228 1.1 skrll _bfd_mips_elf_final_write_processing
3229 1.1 skrll #define elf_backend_additional_program_headers \
3230 1.1 skrll _bfd_mips_elf_additional_program_headers
3231 1.1 skrll #define elf_backend_modify_segment_map _bfd_mips_elf_modify_segment_map
3232 1.1 skrll #define elf_backend_gc_mark_hook _bfd_mips_elf_gc_mark_hook
3233 1.1 skrll #define elf_backend_gc_sweep_hook _bfd_mips_elf_gc_sweep_hook
3234 1.1 skrll #define elf_backend_copy_indirect_symbol \
3235 1.1 skrll _bfd_mips_elf_copy_indirect_symbol
3236 1.1 skrll #define elf_backend_ignore_discarded_relocs \
3237 1.1 skrll _bfd_mips_elf_ignore_discarded_relocs
3238 1.1 skrll #define elf_backend_mips_irix_compat elf64_mips_irix_compat
3239 1.1 skrll #define elf_backend_mips_rtype_to_howto mips_elf64_rtype_to_howto
3240 1.1 skrll #define elf_backend_ecoff_debug_swap &mips_elf64_ecoff_debug_swap
3241 1.1 skrll #define elf_backend_size_info mips_elf64_size_info
3242 1.1 skrll
3243 1.1 skrll #define elf_backend_grok_prstatus elf64_mips_grok_prstatus
3244 1.1 skrll #define elf_backend_grok_psinfo elf64_mips_grok_psinfo
3245 1.1 skrll
3246 1.1 skrll #define elf_backend_got_header_size (4 * MIPS_RESERVED_GOTNO)
3247 1.1 skrll
3248 1.1 skrll /* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations
3249 1.1 skrll work better/work only in RELA, so we default to this. */
3250 1.1 skrll #define elf_backend_may_use_rel_p 1
3251 1.1 skrll #define elf_backend_may_use_rela_p 1
3252 1.1 skrll #define elf_backend_default_use_rela_p 1
3253 1.1 skrll #define elf_backend_rela_plts_and_copies_p 0
3254 1.1 skrll #define elf_backend_plt_readonly 1
3255 1.1 skrll #define elf_backend_plt_sym_val _bfd_mips_elf_plt_sym_val
3256 1.1 skrll
3257 1.1 skrll #define elf_backend_sign_extend_vma TRUE
3258 1.1 skrll
3259 1.1 skrll #define elf_backend_write_section _bfd_mips_elf_write_section
3260 1.1 skrll
3261 1.1 skrll /* We don't set bfd_elf64_bfd_is_local_label_name because the 32-bit
3262 1.1 skrll MIPS-specific function only applies to IRIX5, which had no 64-bit
3263 1.1 skrll ABI. */
3264 1.1 skrll #define bfd_elf64_find_nearest_line _bfd_mips_elf_find_nearest_line
3265 1.1 skrll #define bfd_elf64_find_inliner_info _bfd_mips_elf_find_inliner_info
3266 1.1 skrll #define bfd_elf64_new_section_hook _bfd_mips_elf_new_section_hook
3267 1.1 skrll #define bfd_elf64_set_section_contents _bfd_mips_elf_set_section_contents
3268 1.1 skrll #define bfd_elf64_bfd_get_relocated_section_contents \
3269 1.1 skrll _bfd_elf_mips_get_relocated_section_contents
3270 1.1 skrll #define bfd_elf64_mkobject _bfd_mips_elf_mkobject
3271 1.1 skrll #define bfd_elf64_bfd_link_hash_table_create \
3272 1.1 skrll _bfd_mips_elf_link_hash_table_create
3273 1.1 skrll #define bfd_elf64_bfd_final_link _bfd_mips_elf_final_link
3274 1.1 skrll #define bfd_elf64_bfd_merge_private_bfd_data \
3275 1.1 skrll _bfd_mips_elf_merge_private_bfd_data
3276 1.1 skrll #define bfd_elf64_bfd_set_private_flags _bfd_mips_elf_set_private_flags
3277 1.1 skrll #define bfd_elf64_bfd_print_private_bfd_data \
3278 1.1 skrll _bfd_mips_elf_print_private_bfd_data
3279 1.1 skrll
3280 1.1 skrll #define bfd_elf64_get_reloc_upper_bound mips_elf64_get_reloc_upper_bound
3281 1.1 skrll #define bfd_elf64_canonicalize_reloc mips_elf64_canonicalize_reloc
3282 1.1 skrll #define bfd_elf64_get_dynamic_reloc_upper_bound mips_elf64_get_dynamic_reloc_upper_bound
3283 1.1 skrll #define bfd_elf64_canonicalize_dynamic_reloc mips_elf64_canonicalize_dynamic_reloc
3284 1.1 skrll #define bfd_elf64_bfd_relax_section _bfd_mips_relax_section
3285 1.1 skrll
3286 1.1 skrll /* MIPS ELF64 archive functions. */
3287 1.1 skrll #define bfd_elf64_archive_functions
3288 1.1 skrll extern bfd_boolean bfd_elf64_archive_slurp_armap
3289 1.1 skrll (bfd *);
3290 1.1 skrll extern bfd_boolean bfd_elf64_archive_write_armap
3291 1.1 skrll (bfd *, unsigned int, struct orl *, unsigned int, int);
3292 1.1 skrll #define bfd_elf64_archive_slurp_extended_name_table \
3293 1.1 skrll _bfd_archive_coff_slurp_extended_name_table
3294 1.1 skrll #define bfd_elf64_archive_construct_extended_name_table \
3295 1.1 skrll _bfd_archive_coff_construct_extended_name_table
3296 1.1 skrll #define bfd_elf64_archive_truncate_arname \
3297 1.1 skrll _bfd_archive_coff_truncate_arname
3298 1.1 skrll #define bfd_elf64_archive_read_ar_hdr _bfd_archive_coff_read_ar_hdr
3299 1.1 skrll #define bfd_elf64_archive_openr_next_archived_file \
3300 1.1 skrll _bfd_archive_coff_openr_next_archived_file
3301 1.1 skrll #define bfd_elf64_archive_get_elt_at_index \
3302 1.1 skrll _bfd_archive_coff_get_elt_at_index
3303 1.1 skrll #define bfd_elf64_archive_generic_stat_arch_elt \
3304 1.1 skrll _bfd_archive_coff_generic_stat_arch_elt
3305 1.1 skrll #define bfd_elf64_archive_update_armap_timestamp \
3306 1.1 skrll _bfd_archive_coff_update_armap_timestamp
3307 1.1 skrll
3308 1.1 skrll /* The SGI style (n)64 NewABI. */
3309 1.1 skrll #define TARGET_LITTLE_SYM bfd_elf64_littlemips_vec
3310 1.1 skrll #define TARGET_LITTLE_NAME "elf64-littlemips"
3311 1.1 skrll #define TARGET_BIG_SYM bfd_elf64_bigmips_vec
3312 1.1 skrll #define TARGET_BIG_NAME "elf64-bigmips"
3313 1.1 skrll
3314 1.1 skrll #define ELF_MAXPAGESIZE 0x10000
3315 1.1 skrll #define ELF_COMMONPAGESIZE 0x1000
3316 1.1 skrll
3317 1.1 skrll #include "elf64-target.h"
3318 1.1 skrll
3319 1.1 skrll /* The SYSV-style 'traditional' (n)64 NewABI. */
3320 1.1 skrll #undef TARGET_LITTLE_SYM
3321 1.1 skrll #undef TARGET_LITTLE_NAME
3322 1.1 skrll #undef TARGET_BIG_SYM
3323 1.1 skrll #undef TARGET_BIG_NAME
3324 1.1 skrll
3325 1.1 skrll #undef ELF_MAXPAGESIZE
3326 1.1 skrll #undef ELF_COMMONPAGESIZE
3327 1.1 skrll
3328 1.1 skrll #define TARGET_LITTLE_SYM bfd_elf64_tradlittlemips_vec
3329 #define TARGET_LITTLE_NAME "elf64-tradlittlemips"
3330 #define TARGET_BIG_SYM bfd_elf64_tradbigmips_vec
3331 #define TARGET_BIG_NAME "elf64-tradbigmips"
3332
3333 #define ELF_MAXPAGESIZE 0x10000
3334 #define ELF_COMMONPAGESIZE 0x1000
3335 #define elf64_bed elf64_tradbed
3336
3337 /* Include the target file again for this target. */
3338 #include "elf64-target.h"
3339