elf64-mips.c revision 1.6 1 1.1 skrll /* MIPS-specific support for 64-bit ELF
2 1.6 christos Copyright (C) 1996-2015 Free Software Foundation, Inc.
3 1.1 skrll Ian Lance Taylor, Cygnus Support
4 1.1 skrll Linker support added by Mark Mitchell, CodeSourcery, LLC.
5 1.1 skrll <mark (at) codesourcery.com>
6 1.1 skrll
7 1.1 skrll This file is part of BFD, the Binary File Descriptor library.
8 1.1 skrll
9 1.1 skrll This program is free software; you can redistribute it and/or modify
10 1.1 skrll it under the terms of the GNU General Public License as published by
11 1.1 skrll the Free Software Foundation; either version 3 of the License, or
12 1.1 skrll (at your option) any later version.
13 1.1 skrll
14 1.1 skrll This program is distributed in the hope that it will be useful,
15 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
16 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 1.1 skrll GNU General Public License for more details.
18 1.1 skrll
19 1.1 skrll You should have received a copy of the GNU General Public License
20 1.1 skrll along with this program; if not, write to the Free Software
21 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22 1.1 skrll MA 02110-1301, USA. */
23 1.1 skrll
24 1.1 skrll
25 1.1 skrll /* This file supports the 64-bit MIPS ELF ABI.
26 1.1 skrll
27 1.1 skrll The MIPS 64-bit ELF ABI uses an unusual reloc format. This file
28 1.1 skrll overrides the usual ELF reloc handling, and handles reading and
29 1.1 skrll writing the relocations here. */
30 1.1 skrll
31 1.1 skrll /* TODO: Many things are unsupported, even if there is some code for it
32 1.1 skrll . (which was mostly stolen from elf32-mips.c and slightly adapted).
33 1.1 skrll .
34 1.1 skrll . - Relocation handling for REL relocs is wrong in many cases and
35 1.1 skrll . generally untested.
36 1.1 skrll . - Relocation handling for RELA relocs related to GOT support are
37 1.1 skrll . also likely to be wrong.
38 1.1 skrll . - Support for MIPS16 is untested.
39 1.1 skrll . - Combined relocs with RSS_* entries are unsupported.
40 1.1 skrll . - The whole GOT handling for NewABI is missing, some parts of
41 1.1 skrll . the OldABI version is still lying around and should be removed.
42 1.1 skrll */
43 1.1 skrll
44 1.1 skrll #include "sysdep.h"
45 1.1 skrll #include "bfd.h"
46 1.1 skrll #include "libbfd.h"
47 1.1 skrll #include "aout/ar.h"
48 1.1 skrll #include "bfdlink.h"
49 1.1 skrll #include "genlink.h"
50 1.1 skrll #include "elf-bfd.h"
51 1.1 skrll #include "elfxx-mips.h"
52 1.1 skrll #include "elf/mips.h"
53 1.1 skrll
54 1.1 skrll /* Get the ECOFF swapping routines. The 64-bit ABI is not supposed to
55 1.1 skrll use ECOFF. However, we support it anyhow for an easier changeover. */
56 1.1 skrll #include "coff/sym.h"
57 1.1 skrll #include "coff/symconst.h"
58 1.1 skrll #include "coff/internal.h"
59 1.1 skrll #include "coff/ecoff.h"
60 1.1 skrll /* The 64 bit versions of the mdebug data structures are in alpha.h. */
61 1.1 skrll #include "coff/alpha.h"
62 1.1 skrll #define ECOFF_SIGNED_64
63 1.1 skrll #include "ecoffswap.h"
64 1.1 skrll
65 1.1 skrll static void mips_elf64_swap_reloc_in
66 1.1 skrll (bfd *, const Elf64_Mips_External_Rel *, Elf64_Mips_Internal_Rela *);
67 1.1 skrll static void mips_elf64_swap_reloca_in
68 1.1 skrll (bfd *, const Elf64_Mips_External_Rela *, Elf64_Mips_Internal_Rela *);
69 1.1 skrll static void mips_elf64_swap_reloc_out
70 1.1 skrll (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rel *);
71 1.1 skrll static void mips_elf64_swap_reloca_out
72 1.1 skrll (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rela *);
73 1.1 skrll static void mips_elf64_be_swap_reloc_in
74 1.1 skrll (bfd *, const bfd_byte *, Elf_Internal_Rela *);
75 1.1 skrll static void mips_elf64_be_swap_reloc_out
76 1.1 skrll (bfd *, const Elf_Internal_Rela *, bfd_byte *);
77 1.1 skrll static void mips_elf64_be_swap_reloca_in
78 1.1 skrll (bfd *, const bfd_byte *, Elf_Internal_Rela *);
79 1.1 skrll static void mips_elf64_be_swap_reloca_out
80 1.1 skrll (bfd *, const Elf_Internal_Rela *, bfd_byte *);
81 1.1 skrll static reloc_howto_type *bfd_elf64_bfd_reloc_type_lookup
82 1.1 skrll (bfd *, bfd_reloc_code_real_type);
83 1.1 skrll static reloc_howto_type *mips_elf64_rtype_to_howto
84 1.1 skrll (unsigned int, bfd_boolean);
85 1.1 skrll static void mips_elf64_info_to_howto_rel
86 1.1 skrll (bfd *, arelent *, Elf_Internal_Rela *);
87 1.1 skrll static void mips_elf64_info_to_howto_rela
88 1.1 skrll (bfd *, arelent *, Elf_Internal_Rela *);
89 1.1 skrll static long mips_elf64_get_reloc_upper_bound
90 1.1 skrll (bfd *, asection *);
91 1.1 skrll static long mips_elf64_canonicalize_reloc
92 1.1 skrll (bfd *, asection *, arelent **, asymbol **);
93 1.1 skrll static long mips_elf64_get_dynamic_reloc_upper_bound
94 1.1 skrll (bfd *);
95 1.1 skrll static long mips_elf64_canonicalize_dynamic_reloc
96 1.1 skrll (bfd *, arelent **, asymbol **);
97 1.1 skrll static bfd_boolean mips_elf64_slurp_one_reloc_table
98 1.1 skrll (bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type, arelent *,
99 1.1 skrll asymbol **, bfd_boolean);
100 1.1 skrll static bfd_boolean mips_elf64_slurp_reloc_table
101 1.1 skrll (bfd *, asection *, asymbol **, bfd_boolean);
102 1.1 skrll static void mips_elf64_write_relocs
103 1.1 skrll (bfd *, asection *, void *);
104 1.1 skrll static void mips_elf64_write_rel
105 1.1 skrll (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
106 1.1 skrll static void mips_elf64_write_rela
107 1.1 skrll (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
108 1.1 skrll static bfd_reloc_status_type mips_elf64_gprel16_reloc
109 1.1 skrll (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
110 1.1 skrll static bfd_reloc_status_type mips_elf64_literal_reloc
111 1.1 skrll (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
112 1.1 skrll static bfd_reloc_status_type mips_elf64_gprel32_reloc
113 1.1 skrll (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
114 1.1 skrll static bfd_reloc_status_type mips_elf64_shift6_reloc
115 1.1 skrll (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
116 1.1 skrll static bfd_reloc_status_type mips16_gprel_reloc
117 1.1 skrll (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
118 1.1 skrll static bfd_boolean mips_elf64_assign_gp
119 1.1 skrll (bfd *, bfd_vma *);
120 1.1 skrll static bfd_reloc_status_type mips_elf64_final_gp
121 1.1 skrll (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
122 1.1 skrll static bfd_boolean mips_elf64_object_p
123 1.1 skrll (bfd *);
124 1.2 skrll static bfd_boolean mips_elf64_is_local_label_name
125 1.2 skrll (bfd *, const char *);
126 1.1 skrll static irix_compat_t elf64_mips_irix_compat
127 1.1 skrll (bfd *);
128 1.1 skrll static bfd_boolean elf64_mips_grok_prstatus
129 1.1 skrll (bfd *, Elf_Internal_Note *);
130 1.1 skrll static bfd_boolean elf64_mips_grok_psinfo
131 1.1 skrll (bfd *, Elf_Internal_Note *);
132 1.1 skrll
133 1.6 christos extern const bfd_target mips_elf64_be_vec;
134 1.6 christos extern const bfd_target mips_elf64_le_vec;
135 1.1 skrll
136 1.1 skrll /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
137 1.1 skrll from smaller values. Start with zero, widen, *then* decrement. */
138 1.1 skrll #define MINUS_ONE (((bfd_vma)0) - 1)
139 1.1 skrll
140 1.1 skrll /* The number of local .got entries we reserve. */
141 1.1 skrll #define MIPS_RESERVED_GOTNO (2)
142 1.1 skrll
143 1.1 skrll /* The relocation table used for SHT_REL sections. */
145 1.1 skrll
146 1.1 skrll static reloc_howto_type mips_elf64_howto_table_rel[] =
147 1.1 skrll {
148 1.1 skrll /* No relocation. */
149 1.1 skrll HOWTO (R_MIPS_NONE, /* type */
150 1.6 christos 0, /* rightshift */
151 1.1 skrll 3, /* size (0 = byte, 1 = short, 2 = long) */
152 1.1 skrll 0, /* bitsize */
153 1.1 skrll FALSE, /* pc_relative */
154 1.1 skrll 0, /* bitpos */
155 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
156 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
157 1.1 skrll "R_MIPS_NONE", /* name */
158 1.1 skrll FALSE, /* partial_inplace */
159 1.1 skrll 0, /* src_mask */
160 1.1 skrll 0, /* dst_mask */
161 1.1 skrll FALSE), /* pcrel_offset */
162 1.1 skrll
163 1.1 skrll /* 16 bit relocation. */
164 1.1 skrll HOWTO (R_MIPS_16, /* type */
165 1.1 skrll 0, /* rightshift */
166 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
167 1.1 skrll 16, /* bitsize */
168 1.1 skrll FALSE, /* pc_relative */
169 1.1 skrll 0, /* bitpos */
170 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
171 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
172 1.1 skrll "R_MIPS_16", /* name */
173 1.1 skrll TRUE, /* partial_inplace */
174 1.1 skrll 0x0000ffff, /* src_mask */
175 1.1 skrll 0x0000ffff, /* dst_mask */
176 1.1 skrll FALSE), /* pcrel_offset */
177 1.1 skrll
178 1.1 skrll /* 32 bit relocation. */
179 1.1 skrll HOWTO (R_MIPS_32, /* type */
180 1.1 skrll 0, /* rightshift */
181 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
182 1.1 skrll 32, /* bitsize */
183 1.1 skrll FALSE, /* pc_relative */
184 1.1 skrll 0, /* bitpos */
185 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
186 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
187 1.1 skrll "R_MIPS_32", /* name */
188 1.1 skrll TRUE, /* partial_inplace */
189 1.1 skrll 0xffffffff, /* src_mask */
190 1.1 skrll 0xffffffff, /* dst_mask */
191 1.1 skrll FALSE), /* pcrel_offset */
192 1.1 skrll
193 1.1 skrll /* 32 bit symbol relative relocation. */
194 1.1 skrll HOWTO (R_MIPS_REL32, /* type */
195 1.1 skrll 0, /* rightshift */
196 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
197 1.1 skrll 32, /* bitsize */
198 1.1 skrll FALSE, /* pc_relative */
199 1.1 skrll 0, /* bitpos */
200 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
201 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
202 1.1 skrll "R_MIPS_REL32", /* name */
203 1.1 skrll TRUE, /* partial_inplace */
204 1.1 skrll 0xffffffff, /* src_mask */
205 1.1 skrll 0xffffffff, /* dst_mask */
206 1.1 skrll FALSE), /* pcrel_offset */
207 1.1 skrll
208 1.1 skrll /* 26 bit jump address. */
209 1.1 skrll HOWTO (R_MIPS_26, /* type */
210 1.1 skrll 2, /* rightshift */
211 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
212 1.1 skrll 26, /* bitsize */
213 1.1 skrll FALSE, /* pc_relative */
214 1.1 skrll 0, /* bitpos */
215 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
216 1.1 skrll /* This needs complex overflow
217 1.1 skrll detection, because the upper 36
218 1.1 skrll bits must match the PC + 4. */
219 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
220 1.1 skrll "R_MIPS_26", /* name */
221 1.1 skrll TRUE, /* partial_inplace */
222 1.1 skrll 0x03ffffff, /* src_mask */
223 1.1 skrll 0x03ffffff, /* dst_mask */
224 1.1 skrll FALSE), /* pcrel_offset */
225 1.1 skrll
226 1.1 skrll /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL.
227 1.1 skrll However, the native IRIX6 tools use them, so we try our best. */
228 1.1 skrll
229 1.1 skrll /* High 16 bits of symbol value. */
230 1.1 skrll HOWTO (R_MIPS_HI16, /* type */
231 1.1 skrll 16, /* rightshift */
232 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
233 1.1 skrll 16, /* bitsize */
234 1.1 skrll FALSE, /* pc_relative */
235 1.1 skrll 0, /* bitpos */
236 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
237 1.1 skrll _bfd_mips_elf_hi16_reloc, /* special_function */
238 1.1 skrll "R_MIPS_HI16", /* name */
239 1.1 skrll TRUE, /* partial_inplace */
240 1.1 skrll 0x0000ffff, /* src_mask */
241 1.1 skrll 0x0000ffff, /* dst_mask */
242 1.1 skrll FALSE), /* pcrel_offset */
243 1.1 skrll
244 1.1 skrll /* Low 16 bits of symbol value. */
245 1.1 skrll HOWTO (R_MIPS_LO16, /* type */
246 1.1 skrll 0, /* rightshift */
247 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
248 1.1 skrll 16, /* bitsize */
249 1.1 skrll FALSE, /* pc_relative */
250 1.1 skrll 0, /* bitpos */
251 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
252 1.1 skrll _bfd_mips_elf_lo16_reloc, /* special_function */
253 1.1 skrll "R_MIPS_LO16", /* name */
254 1.1 skrll TRUE, /* partial_inplace */
255 1.1 skrll 0x0000ffff, /* src_mask */
256 1.1 skrll 0x0000ffff, /* dst_mask */
257 1.1 skrll FALSE), /* pcrel_offset */
258 1.1 skrll
259 1.1 skrll /* GP relative reference. */
260 1.1 skrll HOWTO (R_MIPS_GPREL16, /* type */
261 1.1 skrll 0, /* rightshift */
262 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
263 1.1 skrll 16, /* bitsize */
264 1.1 skrll FALSE, /* pc_relative */
265 1.1 skrll 0, /* bitpos */
266 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
267 1.1 skrll mips_elf64_gprel16_reloc, /* special_function */
268 1.1 skrll "R_MIPS_GPREL16", /* name */
269 1.1 skrll TRUE, /* partial_inplace */
270 1.1 skrll 0x0000ffff, /* src_mask */
271 1.1 skrll 0x0000ffff, /* dst_mask */
272 1.1 skrll FALSE), /* pcrel_offset */
273 1.1 skrll
274 1.1 skrll /* Reference to literal section. */
275 1.1 skrll HOWTO (R_MIPS_LITERAL, /* type */
276 1.1 skrll 0, /* rightshift */
277 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
278 1.1 skrll 16, /* bitsize */
279 1.1 skrll FALSE, /* pc_relative */
280 1.1 skrll 0, /* bitpos */
281 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
282 1.1 skrll mips_elf64_literal_reloc, /* special_function */
283 1.1 skrll "R_MIPS_LITERAL", /* name */
284 1.1 skrll TRUE, /* partial_inplace */
285 1.1 skrll 0x0000ffff, /* src_mask */
286 1.1 skrll 0x0000ffff, /* dst_mask */
287 1.1 skrll FALSE), /* pcrel_offset */
288 1.1 skrll
289 1.1 skrll /* Reference to global offset table. */
290 1.1 skrll HOWTO (R_MIPS_GOT16, /* type */
291 1.1 skrll 0, /* rightshift */
292 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
293 1.1 skrll 16, /* bitsize */
294 1.1 skrll FALSE, /* pc_relative */
295 1.1 skrll 0, /* bitpos */
296 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
297 1.1 skrll _bfd_mips_elf_got16_reloc, /* special_function */
298 1.1 skrll "R_MIPS_GOT16", /* name */
299 1.1 skrll TRUE, /* partial_inplace */
300 1.1 skrll 0x0000ffff, /* src_mask */
301 1.1 skrll 0x0000ffff, /* dst_mask */
302 1.1 skrll FALSE), /* pcrel_offset */
303 1.1 skrll
304 1.1 skrll /* 16 bit PC relative reference. Note that the ABI document has a typo
305 1.1 skrll and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
306 1.1 skrll We do the right thing here. */
307 1.1 skrll HOWTO (R_MIPS_PC16, /* type */
308 1.1 skrll 2, /* rightshift */
309 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
310 1.1 skrll 16, /* bitsize */
311 1.1 skrll TRUE, /* pc_relative */
312 1.1 skrll 0, /* bitpos */
313 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
314 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
315 1.1 skrll "R_MIPS_PC16", /* name */
316 1.1 skrll TRUE, /* partial_inplace */
317 1.1 skrll 0x0000ffff, /* src_mask */
318 1.1 skrll 0x0000ffff, /* dst_mask */
319 1.1 skrll TRUE), /* pcrel_offset */
320 1.1 skrll
321 1.1 skrll /* 16 bit call through global offset table. */
322 1.1 skrll HOWTO (R_MIPS_CALL16, /* type */
323 1.1 skrll 0, /* rightshift */
324 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
325 1.1 skrll 16, /* bitsize */
326 1.1 skrll FALSE, /* pc_relative */
327 1.1 skrll 0, /* bitpos */
328 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
329 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
330 1.1 skrll "R_MIPS_CALL16", /* name */
331 1.1 skrll TRUE, /* partial_inplace */
332 1.1 skrll 0x0000ffff, /* src_mask */
333 1.1 skrll 0x0000ffff, /* dst_mask */
334 1.1 skrll FALSE), /* pcrel_offset */
335 1.1 skrll
336 1.1 skrll /* 32 bit GP relative reference. */
337 1.1 skrll HOWTO (R_MIPS_GPREL32, /* type */
338 1.1 skrll 0, /* rightshift */
339 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
340 1.1 skrll 32, /* bitsize */
341 1.1 skrll FALSE, /* pc_relative */
342 1.1 skrll 0, /* bitpos */
343 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
344 1.1 skrll mips_elf64_gprel32_reloc, /* special_function */
345 1.1 skrll "R_MIPS_GPREL32", /* name */
346 1.1 skrll TRUE, /* partial_inplace */
347 1.1 skrll 0xffffffff, /* src_mask */
348 1.1 skrll 0xffffffff, /* dst_mask */
349 1.1 skrll FALSE), /* pcrel_offset */
350 1.1 skrll
351 1.1 skrll EMPTY_HOWTO (13),
352 1.1 skrll EMPTY_HOWTO (14),
353 1.1 skrll EMPTY_HOWTO (15),
354 1.1 skrll
355 1.1 skrll /* A 5 bit shift field. */
356 1.1 skrll HOWTO (R_MIPS_SHIFT5, /* type */
357 1.1 skrll 0, /* rightshift */
358 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
359 1.1 skrll 5, /* bitsize */
360 1.1 skrll FALSE, /* pc_relative */
361 1.1 skrll 6, /* bitpos */
362 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
363 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
364 1.1 skrll "R_MIPS_SHIFT5", /* name */
365 1.1 skrll TRUE, /* partial_inplace */
366 1.1 skrll 0x000007c0, /* src_mask */
367 1.1 skrll 0x000007c0, /* dst_mask */
368 1.1 skrll FALSE), /* pcrel_offset */
369 1.1 skrll
370 1.1 skrll /* A 6 bit shift field. */
371 1.1 skrll HOWTO (R_MIPS_SHIFT6, /* type */
372 1.1 skrll 0, /* rightshift */
373 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
374 1.1 skrll 6, /* bitsize */
375 1.1 skrll FALSE, /* pc_relative */
376 1.1 skrll 6, /* bitpos */
377 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
378 1.1 skrll mips_elf64_shift6_reloc, /* special_function */
379 1.1 skrll "R_MIPS_SHIFT6", /* name */
380 1.1 skrll TRUE, /* partial_inplace */
381 1.1 skrll 0x000007c4, /* src_mask */
382 1.1 skrll 0x000007c4, /* dst_mask */
383 1.1 skrll FALSE), /* pcrel_offset */
384 1.1 skrll
385 1.1 skrll /* 64 bit relocation. */
386 1.1 skrll HOWTO (R_MIPS_64, /* type */
387 1.1 skrll 0, /* rightshift */
388 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
389 1.1 skrll 64, /* bitsize */
390 1.1 skrll FALSE, /* pc_relative */
391 1.1 skrll 0, /* bitpos */
392 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
393 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
394 1.1 skrll "R_MIPS_64", /* name */
395 1.1 skrll TRUE, /* partial_inplace */
396 1.1 skrll MINUS_ONE, /* src_mask */
397 1.1 skrll MINUS_ONE, /* dst_mask */
398 1.1 skrll FALSE), /* pcrel_offset */
399 1.1 skrll
400 1.1 skrll /* Displacement in the global offset table. */
401 1.1 skrll HOWTO (R_MIPS_GOT_DISP, /* type */
402 1.1 skrll 0, /* rightshift */
403 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
404 1.1 skrll 16, /* bitsize */
405 1.1 skrll FALSE, /* pc_relative */
406 1.1 skrll 0, /* bitpos */
407 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
408 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
409 1.1 skrll "R_MIPS_GOT_DISP", /* name */
410 1.1 skrll TRUE, /* partial_inplace */
411 1.1 skrll 0x0000ffff, /* src_mask */
412 1.1 skrll 0x0000ffff, /* dst_mask */
413 1.1 skrll FALSE), /* pcrel_offset */
414 1.1 skrll
415 1.1 skrll /* Displacement to page pointer in the global offset table. */
416 1.1 skrll HOWTO (R_MIPS_GOT_PAGE, /* type */
417 1.1 skrll 0, /* rightshift */
418 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
419 1.1 skrll 16, /* bitsize */
420 1.1 skrll FALSE, /* pc_relative */
421 1.1 skrll 0, /* bitpos */
422 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
423 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
424 1.1 skrll "R_MIPS_GOT_PAGE", /* name */
425 1.1 skrll TRUE, /* partial_inplace */
426 1.1 skrll 0x0000ffff, /* src_mask */
427 1.1 skrll 0x0000ffff, /* dst_mask */
428 1.1 skrll FALSE), /* pcrel_offset */
429 1.1 skrll
430 1.1 skrll /* Offset from page pointer in the global offset table. */
431 1.1 skrll HOWTO (R_MIPS_GOT_OFST, /* type */
432 1.1 skrll 0, /* rightshift */
433 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
434 1.1 skrll 16, /* bitsize */
435 1.1 skrll FALSE, /* pc_relative */
436 1.1 skrll 0, /* bitpos */
437 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
438 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
439 1.1 skrll "R_MIPS_GOT_OFST", /* name */
440 1.1 skrll TRUE, /* partial_inplace */
441 1.1 skrll 0x0000ffff, /* src_mask */
442 1.1 skrll 0x0000ffff, /* dst_mask */
443 1.1 skrll FALSE), /* pcrel_offset */
444 1.1 skrll
445 1.1 skrll /* High 16 bits of displacement in global offset table. */
446 1.1 skrll HOWTO (R_MIPS_GOT_HI16, /* type */
447 1.1 skrll 0, /* rightshift */
448 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
449 1.1 skrll 16, /* bitsize */
450 1.1 skrll FALSE, /* pc_relative */
451 1.1 skrll 0, /* bitpos */
452 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
453 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
454 1.1 skrll "R_MIPS_GOT_HI16", /* name */
455 1.1 skrll TRUE, /* partial_inplace */
456 1.1 skrll 0x0000ffff, /* src_mask */
457 1.1 skrll 0x0000ffff, /* dst_mask */
458 1.1 skrll FALSE), /* pcrel_offset */
459 1.1 skrll
460 1.1 skrll /* Low 16 bits of displacement in global offset table. */
461 1.1 skrll HOWTO (R_MIPS_GOT_LO16, /* type */
462 1.1 skrll 0, /* rightshift */
463 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
464 1.1 skrll 16, /* bitsize */
465 1.1 skrll FALSE, /* pc_relative */
466 1.1 skrll 0, /* bitpos */
467 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
468 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
469 1.1 skrll "R_MIPS_GOT_LO16", /* name */
470 1.1 skrll TRUE, /* partial_inplace */
471 1.1 skrll 0x0000ffff, /* src_mask */
472 1.1 skrll 0x0000ffff, /* dst_mask */
473 1.1 skrll FALSE), /* pcrel_offset */
474 1.1 skrll
475 1.1 skrll /* 64 bit subtraction. */
476 1.1 skrll HOWTO (R_MIPS_SUB, /* type */
477 1.1 skrll 0, /* rightshift */
478 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
479 1.1 skrll 64, /* bitsize */
480 1.1 skrll FALSE, /* pc_relative */
481 1.1 skrll 0, /* bitpos */
482 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
483 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
484 1.1 skrll "R_MIPS_SUB", /* name */
485 1.1 skrll TRUE, /* partial_inplace */
486 1.1 skrll MINUS_ONE, /* src_mask */
487 1.1 skrll MINUS_ONE, /* dst_mask */
488 1.1 skrll FALSE), /* pcrel_offset */
489 1.1 skrll
490 1.1 skrll /* Insert the addend as an instruction. */
491 1.1 skrll /* FIXME: Not handled correctly. */
492 1.1 skrll HOWTO (R_MIPS_INSERT_A, /* type */
493 1.1 skrll 0, /* rightshift */
494 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
495 1.1 skrll 32, /* bitsize */
496 1.1 skrll FALSE, /* pc_relative */
497 1.1 skrll 0, /* bitpos */
498 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
499 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
500 1.1 skrll "R_MIPS_INSERT_A", /* name */
501 1.1 skrll TRUE, /* partial_inplace */
502 1.1 skrll 0xffffffff, /* src_mask */
503 1.1 skrll 0xffffffff, /* dst_mask */
504 1.1 skrll FALSE), /* pcrel_offset */
505 1.1 skrll
506 1.1 skrll /* Insert the addend as an instruction, and change all relocations
507 1.1 skrll to refer to the old instruction at the address. */
508 1.1 skrll /* FIXME: Not handled correctly. */
509 1.1 skrll HOWTO (R_MIPS_INSERT_B, /* type */
510 1.1 skrll 0, /* rightshift */
511 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
512 1.1 skrll 32, /* bitsize */
513 1.1 skrll FALSE, /* pc_relative */
514 1.1 skrll 0, /* bitpos */
515 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
516 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
517 1.1 skrll "R_MIPS_INSERT_B", /* name */
518 1.1 skrll TRUE, /* partial_inplace */
519 1.1 skrll 0xffffffff, /* src_mask */
520 1.1 skrll 0xffffffff, /* dst_mask */
521 1.1 skrll FALSE), /* pcrel_offset */
522 1.1 skrll
523 1.1 skrll /* Delete a 32 bit instruction. */
524 1.1 skrll /* FIXME: Not handled correctly. */
525 1.1 skrll HOWTO (R_MIPS_DELETE, /* type */
526 1.1 skrll 0, /* rightshift */
527 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
528 1.1 skrll 32, /* bitsize */
529 1.1 skrll FALSE, /* pc_relative */
530 1.1 skrll 0, /* bitpos */
531 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
532 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
533 1.1 skrll "R_MIPS_DELETE", /* name */
534 1.1 skrll TRUE, /* partial_inplace */
535 1.1 skrll 0xffffffff, /* src_mask */
536 1.1 skrll 0xffffffff, /* dst_mask */
537 1.1 skrll FALSE), /* pcrel_offset */
538 1.1 skrll
539 1.1 skrll /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
540 1.1 skrll We don't, because
541 1.1 skrll a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/
542 1.1 skrll R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using
543 1.1 skrll fallable heuristics.
544 1.1 skrll b) No other NewABI toolchain actually emits such relocations. */
545 1.1 skrll EMPTY_HOWTO (R_MIPS_HIGHER),
546 1.1 skrll EMPTY_HOWTO (R_MIPS_HIGHEST),
547 1.1 skrll
548 1.1 skrll /* High 16 bits of displacement in global offset table. */
549 1.1 skrll HOWTO (R_MIPS_CALL_HI16, /* type */
550 1.1 skrll 0, /* rightshift */
551 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
552 1.1 skrll 16, /* bitsize */
553 1.1 skrll FALSE, /* pc_relative */
554 1.1 skrll 0, /* bitpos */
555 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
556 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
557 1.1 skrll "R_MIPS_CALL_HI16", /* name */
558 1.1 skrll TRUE, /* partial_inplace */
559 1.1 skrll 0x0000ffff, /* src_mask */
560 1.1 skrll 0x0000ffff, /* dst_mask */
561 1.1 skrll FALSE), /* pcrel_offset */
562 1.1 skrll
563 1.1 skrll /* Low 16 bits of displacement in global offset table. */
564 1.1 skrll HOWTO (R_MIPS_CALL_LO16, /* type */
565 1.1 skrll 0, /* rightshift */
566 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
567 1.1 skrll 16, /* bitsize */
568 1.1 skrll FALSE, /* pc_relative */
569 1.1 skrll 0, /* bitpos */
570 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
571 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
572 1.1 skrll "R_MIPS_CALL_LO16", /* name */
573 1.1 skrll TRUE, /* partial_inplace */
574 1.1 skrll 0x0000ffff, /* src_mask */
575 1.1 skrll 0x0000ffff, /* dst_mask */
576 1.1 skrll FALSE), /* pcrel_offset */
577 1.1 skrll
578 1.1 skrll /* Section displacement, used by an associated event location section. */
579 1.1 skrll HOWTO (R_MIPS_SCN_DISP, /* type */
580 1.1 skrll 0, /* rightshift */
581 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
582 1.1 skrll 32, /* bitsize */
583 1.1 skrll FALSE, /* pc_relative */
584 1.1 skrll 0, /* bitpos */
585 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
586 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
587 1.1 skrll "R_MIPS_SCN_DISP", /* name */
588 1.1 skrll TRUE, /* partial_inplace */
589 1.1 skrll 0xffffffff, /* src_mask */
590 1.1 skrll 0xffffffff, /* dst_mask */
591 1.1 skrll FALSE), /* pcrel_offset */
592 1.1 skrll
593 1.1 skrll HOWTO (R_MIPS_REL16, /* type */
594 1.1 skrll 0, /* rightshift */
595 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
596 1.1 skrll 16, /* bitsize */
597 1.1 skrll FALSE, /* pc_relative */
598 1.1 skrll 0, /* bitpos */
599 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
600 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
601 1.1 skrll "R_MIPS_REL16", /* name */
602 1.1 skrll TRUE, /* partial_inplace */
603 1.1 skrll 0xffff, /* src_mask */
604 1.1 skrll 0xffff, /* dst_mask */
605 1.1 skrll FALSE), /* pcrel_offset */
606 1.1 skrll
607 1.1 skrll /* These two are obsolete. */
608 1.1 skrll EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
609 1.1 skrll EMPTY_HOWTO (R_MIPS_PJUMP),
610 1.1 skrll
611 1.1 skrll /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
612 1.1 skrll It must be used for multigot GOT's (and only there). */
613 1.1 skrll HOWTO (R_MIPS_RELGOT, /* type */
614 1.1 skrll 0, /* rightshift */
615 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
616 1.1 skrll 32, /* bitsize */
617 1.1 skrll FALSE, /* pc_relative */
618 1.1 skrll 0, /* bitpos */
619 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
620 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
621 1.1 skrll "R_MIPS_RELGOT", /* name */
622 1.1 skrll TRUE, /* partial_inplace */
623 1.1 skrll 0xffffffff, /* src_mask */
624 1.1 skrll 0xffffffff, /* dst_mask */
625 1.1 skrll FALSE), /* pcrel_offset */
626 1.1 skrll
627 1.1 skrll /* Protected jump conversion. This is an optimization hint. No
628 1.1 skrll relocation is required for correctness. */
629 1.1 skrll HOWTO (R_MIPS_JALR, /* type */
630 1.1 skrll 0, /* rightshift */
631 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
632 1.1 skrll 32, /* bitsize */
633 1.1 skrll FALSE, /* pc_relative */
634 1.1 skrll 0, /* bitpos */
635 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
636 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
637 1.1 skrll "R_MIPS_JALR", /* name */
638 1.1 skrll FALSE, /* partial_inplace */
639 1.1 skrll 0, /* src_mask */
640 1.1 skrll 0x00000000, /* dst_mask */
641 1.1 skrll FALSE), /* pcrel_offset */
642 1.1 skrll
643 1.1 skrll /* TLS relocations. */
644 1.1 skrll EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
645 1.1 skrll EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
646 1.1 skrll
647 1.1 skrll HOWTO (R_MIPS_TLS_DTPMOD64, /* type */
648 1.1 skrll 0, /* rightshift */
649 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
650 1.1 skrll 64, /* bitsize */
651 1.1 skrll FALSE, /* pc_relative */
652 1.1 skrll 0, /* bitpos */
653 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
654 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
655 1.1 skrll "R_MIPS_TLS_DTPMOD64", /* name */
656 1.1 skrll TRUE, /* partial_inplace */
657 1.1 skrll MINUS_ONE, /* src_mask */
658 1.1 skrll MINUS_ONE, /* dst_mask */
659 1.1 skrll FALSE), /* pcrel_offset */
660 1.1 skrll
661 1.1 skrll HOWTO (R_MIPS_TLS_DTPREL64, /* type */
662 1.1 skrll 0, /* rightshift */
663 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
664 1.1 skrll 64, /* bitsize */
665 1.1 skrll FALSE, /* pc_relative */
666 1.1 skrll 0, /* bitpos */
667 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
668 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
669 1.1 skrll "R_MIPS_TLS_DTPREL64", /* name */
670 1.1 skrll TRUE, /* partial_inplace */
671 1.1 skrll MINUS_ONE, /* src_mask */
672 1.1 skrll MINUS_ONE, /* dst_mask */
673 1.1 skrll FALSE), /* pcrel_offset */
674 1.1 skrll
675 1.1 skrll /* TLS general dynamic variable reference. */
676 1.1 skrll HOWTO (R_MIPS_TLS_GD, /* type */
677 1.1 skrll 0, /* rightshift */
678 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
679 1.1 skrll 16, /* bitsize */
680 1.1 skrll FALSE, /* pc_relative */
681 1.1 skrll 0, /* bitpos */
682 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
683 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
684 1.1 skrll "R_MIPS_TLS_GD", /* name */
685 1.1 skrll TRUE, /* partial_inplace */
686 1.1 skrll 0x0000ffff, /* src_mask */
687 1.1 skrll 0x0000ffff, /* dst_mask */
688 1.1 skrll FALSE), /* pcrel_offset */
689 1.1 skrll
690 1.1 skrll /* TLS local dynamic variable reference. */
691 1.1 skrll HOWTO (R_MIPS_TLS_LDM, /* type */
692 1.1 skrll 0, /* rightshift */
693 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
694 1.1 skrll 16, /* bitsize */
695 1.1 skrll FALSE, /* pc_relative */
696 1.1 skrll 0, /* bitpos */
697 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
698 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
699 1.1 skrll "R_MIPS_TLS_LDM", /* name */
700 1.1 skrll TRUE, /* partial_inplace */
701 1.1 skrll 0x0000ffff, /* src_mask */
702 1.1 skrll 0x0000ffff, /* dst_mask */
703 1.1 skrll FALSE), /* pcrel_offset */
704 1.1 skrll
705 1.1 skrll /* TLS local dynamic offset. */
706 1.1 skrll HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */
707 1.1 skrll 0, /* rightshift */
708 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
709 1.1 skrll 16, /* bitsize */
710 1.1 skrll FALSE, /* pc_relative */
711 1.1 skrll 0, /* bitpos */
712 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
713 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
714 1.1 skrll "R_MIPS_TLS_DTPREL_HI16", /* name */
715 1.1 skrll TRUE, /* partial_inplace */
716 1.1 skrll 0x0000ffff, /* src_mask */
717 1.1 skrll 0x0000ffff, /* dst_mask */
718 1.1 skrll FALSE), /* pcrel_offset */
719 1.1 skrll
720 1.1 skrll /* TLS local dynamic offset. */
721 1.1 skrll HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */
722 1.1 skrll 0, /* rightshift */
723 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
724 1.1 skrll 16, /* bitsize */
725 1.1 skrll FALSE, /* pc_relative */
726 1.1 skrll 0, /* bitpos */
727 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
728 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
729 1.1 skrll "R_MIPS_TLS_DTPREL_LO16", /* name */
730 1.1 skrll TRUE, /* partial_inplace */
731 1.1 skrll 0x0000ffff, /* src_mask */
732 1.1 skrll 0x0000ffff, /* dst_mask */
733 1.1 skrll FALSE), /* pcrel_offset */
734 1.1 skrll
735 1.1 skrll /* TLS thread pointer offset. */
736 1.1 skrll HOWTO (R_MIPS_TLS_GOTTPREL, /* type */
737 1.1 skrll 0, /* rightshift */
738 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
739 1.1 skrll 16, /* bitsize */
740 1.1 skrll FALSE, /* pc_relative */
741 1.1 skrll 0, /* bitpos */
742 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
743 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
744 1.1 skrll "R_MIPS_TLS_GOTTPREL", /* name */
745 1.1 skrll TRUE, /* partial_inplace */
746 1.1 skrll 0x0000ffff, /* src_mask */
747 1.1 skrll 0x0000ffff, /* dst_mask */
748 1.1 skrll FALSE), /* pcrel_offset */
749 1.1 skrll
750 1.1 skrll /* TLS IE dynamic relocations. */
751 1.1 skrll EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
752 1.1 skrll
753 1.1 skrll HOWTO (R_MIPS_TLS_TPREL64, /* type */
754 1.1 skrll 0, /* rightshift */
755 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
756 1.1 skrll 64, /* bitsize */
757 1.1 skrll FALSE, /* pc_relative */
758 1.1 skrll 0, /* bitpos */
759 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
760 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
761 1.1 skrll "R_MIPS_TLS_TPREL64", /* name */
762 1.1 skrll TRUE, /* partial_inplace */
763 1.1 skrll MINUS_ONE, /* src_mask */
764 1.1 skrll MINUS_ONE, /* dst_mask */
765 1.1 skrll FALSE), /* pcrel_offset */
766 1.1 skrll
767 1.1 skrll /* TLS thread pointer offset. */
768 1.1 skrll HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
769 1.1 skrll 0, /* rightshift */
770 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
771 1.1 skrll 16, /* bitsize */
772 1.1 skrll FALSE, /* pc_relative */
773 1.1 skrll 0, /* bitpos */
774 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
775 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
776 1.1 skrll "R_MIPS_TLS_TPREL_HI16", /* name */
777 1.1 skrll TRUE, /* partial_inplace */
778 1.1 skrll 0x0000ffff, /* src_mask */
779 1.1 skrll 0x0000ffff, /* dst_mask */
780 1.1 skrll FALSE), /* pcrel_offset */
781 1.1 skrll
782 1.1 skrll /* TLS thread pointer offset. */
783 1.1 skrll HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
784 1.1 skrll 0, /* rightshift */
785 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
786 1.1 skrll 16, /* bitsize */
787 1.1 skrll FALSE, /* pc_relative */
788 1.1 skrll 0, /* bitpos */
789 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
790 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
791 1.1 skrll "R_MIPS_TLS_TPREL_LO16", /* name */
792 1.1 skrll TRUE, /* partial_inplace */
793 1.1 skrll 0x0000ffff, /* src_mask */
794 1.1 skrll 0x0000ffff, /* dst_mask */
795 1.1 skrll FALSE), /* pcrel_offset */
796 1.1 skrll
797 1.1 skrll /* 32 bit relocation with no addend. */
798 1.1 skrll HOWTO (R_MIPS_GLOB_DAT, /* type */
799 1.1 skrll 0, /* rightshift */
800 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
801 1.1 skrll 32, /* bitsize */
802 1.1 skrll FALSE, /* pc_relative */
803 1.1 skrll 0, /* bitpos */
804 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
805 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
806 1.1 skrll "R_MIPS_GLOB_DAT", /* name */
807 1.1 skrll FALSE, /* partial_inplace */
808 1.1 skrll 0x0, /* src_mask */
809 1.1 skrll 0xffffffff, /* dst_mask */
810 1.6 christos FALSE), /* pcrel_offset */
811 1.6 christos
812 1.6 christos EMPTY_HOWTO (52),
813 1.6 christos EMPTY_HOWTO (53),
814 1.6 christos EMPTY_HOWTO (54),
815 1.6 christos EMPTY_HOWTO (55),
816 1.6 christos EMPTY_HOWTO (56),
817 1.6 christos EMPTY_HOWTO (57),
818 1.6 christos EMPTY_HOWTO (58),
819 1.6 christos EMPTY_HOWTO (59),
820 1.6 christos
821 1.6 christos HOWTO (R_MIPS_PC21_S2, /* type */
822 1.6 christos 2, /* rightshift */
823 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
824 1.6 christos 21, /* bitsize */
825 1.6 christos TRUE, /* pc_relative */
826 1.6 christos 0, /* bitpos */
827 1.6 christos complain_overflow_signed, /* complain_on_overflow */
828 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
829 1.6 christos "R_MIPS_PC21_S2", /* name */
830 1.6 christos TRUE, /* partial_inplace */
831 1.6 christos 0x001fffff, /* src_mask */
832 1.6 christos 0x001fffff, /* dst_mask */
833 1.6 christos TRUE), /* pcrel_offset */
834 1.6 christos
835 1.6 christos HOWTO (R_MIPS_PC26_S2, /* type */
836 1.6 christos 2, /* rightshift */
837 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
838 1.6 christos 26, /* bitsize */
839 1.6 christos TRUE, /* pc_relative */
840 1.6 christos 0, /* bitpos */
841 1.6 christos complain_overflow_signed, /* complain_on_overflow */
842 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
843 1.6 christos "R_MIPS_PC26_S2", /* name */
844 1.6 christos TRUE, /* partial_inplace */
845 1.6 christos 0x03ffffff, /* src_mask */
846 1.6 christos 0x03ffffff, /* dst_mask */
847 1.6 christos TRUE), /* pcrel_offset */
848 1.6 christos
849 1.6 christos HOWTO (R_MIPS_PC18_S3, /* type */
850 1.6 christos 3, /* rightshift */
851 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
852 1.6 christos 18, /* bitsize */
853 1.6 christos TRUE, /* pc_relative */
854 1.6 christos 0, /* bitpos */
855 1.6 christos complain_overflow_signed, /* complain_on_overflow */
856 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
857 1.6 christos "R_MIPS_PC18_S3", /* name */
858 1.6 christos TRUE, /* partial_inplace */
859 1.6 christos 0x0003ffff, /* src_mask */
860 1.6 christos 0x0003ffff, /* dst_mask */
861 1.6 christos TRUE), /* pcrel_offset */
862 1.6 christos
863 1.6 christos HOWTO (R_MIPS_PC19_S2, /* type */
864 1.6 christos 2, /* rightshift */
865 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
866 1.6 christos 19, /* bitsize */
867 1.6 christos TRUE, /* pc_relative */
868 1.6 christos 0, /* bitpos */
869 1.6 christos complain_overflow_signed, /* complain_on_overflow */
870 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
871 1.6 christos "R_MIPS_PC19_S2", /* name */
872 1.6 christos TRUE, /* partial_inplace */
873 1.6 christos 0x0007ffff, /* src_mask */
874 1.6 christos 0x0007ffff, /* dst_mask */
875 1.6 christos TRUE), /* pcrel_offset */
876 1.6 christos
877 1.6 christos HOWTO (R_MIPS_PCHI16, /* type */
878 1.6 christos 16, /* rightshift */
879 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
880 1.6 christos 16, /* bitsize */
881 1.6 christos TRUE, /* pc_relative */
882 1.6 christos 0, /* bitpos */
883 1.6 christos complain_overflow_signed, /* complain_on_overflow */
884 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
885 1.6 christos "R_MIPS_PCHI16", /* name */
886 1.6 christos TRUE, /* partial_inplace */
887 1.6 christos 0x0000ffff, /* src_mask */
888 1.6 christos 0x0000ffff, /* dst_mask */
889 1.6 christos TRUE), /* pcrel_offset */
890 1.6 christos
891 1.6 christos HOWTO (R_MIPS_PCLO16, /* type */
892 1.6 christos 0, /* rightshift */
893 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
894 1.6 christos 16, /* bitsize */
895 1.6 christos TRUE, /* pc_relative */
896 1.6 christos 0, /* bitpos */
897 1.6 christos complain_overflow_dont, /* complain_on_overflow */
898 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
899 1.6 christos "R_MIPS_PCLO16", /* name */
900 1.6 christos TRUE, /* partial_inplace */
901 1.6 christos 0x0000ffff, /* src_mask */
902 1.6 christos 0x0000ffff, /* dst_mask */
903 1.6 christos TRUE), /* pcrel_offset */
904 1.1 skrll
905 1.1 skrll };
906 1.1 skrll
907 1.1 skrll /* The relocation table used for SHT_RELA sections. */
908 1.1 skrll
909 1.1 skrll static reloc_howto_type mips_elf64_howto_table_rela[] =
910 1.1 skrll {
911 1.1 skrll /* No relocation. */
912 1.1 skrll HOWTO (R_MIPS_NONE, /* type */
913 1.6 christos 0, /* rightshift */
914 1.1 skrll 3, /* size (0 = byte, 1 = short, 2 = long) */
915 1.1 skrll 0, /* bitsize */
916 1.1 skrll FALSE, /* pc_relative */
917 1.1 skrll 0, /* bitpos */
918 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
919 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
920 1.1 skrll "R_MIPS_NONE", /* name */
921 1.1 skrll FALSE, /* partial_inplace */
922 1.1 skrll 0, /* src_mask */
923 1.1 skrll 0, /* dst_mask */
924 1.1 skrll FALSE), /* pcrel_offset */
925 1.1 skrll
926 1.1 skrll /* 16 bit relocation. */
927 1.1 skrll HOWTO (R_MIPS_16, /* type */
928 1.1 skrll 0, /* rightshift */
929 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
930 1.1 skrll 16, /* bitsize */
931 1.1 skrll FALSE, /* pc_relative */
932 1.1 skrll 0, /* bitpos */
933 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
934 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
935 1.1 skrll "R_MIPS_16", /* name */
936 1.1 skrll FALSE, /* partial_inplace */
937 1.1 skrll 0, /* src_mask */
938 1.1 skrll 0x0000ffff, /* dst_mask */
939 1.1 skrll FALSE), /* pcrel_offset */
940 1.1 skrll
941 1.1 skrll /* 32 bit relocation. */
942 1.1 skrll HOWTO (R_MIPS_32, /* type */
943 1.1 skrll 0, /* rightshift */
944 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
945 1.1 skrll 32, /* bitsize */
946 1.1 skrll FALSE, /* pc_relative */
947 1.1 skrll 0, /* bitpos */
948 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
949 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
950 1.1 skrll "R_MIPS_32", /* name */
951 1.1 skrll FALSE, /* partial_inplace */
952 1.1 skrll 0, /* src_mask */
953 1.1 skrll 0xffffffff, /* dst_mask */
954 1.1 skrll FALSE), /* pcrel_offset */
955 1.1 skrll
956 1.1 skrll /* 32 bit symbol relative relocation. */
957 1.1 skrll HOWTO (R_MIPS_REL32, /* type */
958 1.1 skrll 0, /* rightshift */
959 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
960 1.1 skrll 32, /* bitsize */
961 1.1 skrll FALSE, /* pc_relative */
962 1.1 skrll 0, /* bitpos */
963 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
964 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
965 1.1 skrll "R_MIPS_REL32", /* name */
966 1.1 skrll FALSE, /* partial_inplace */
967 1.1 skrll 0, /* src_mask */
968 1.1 skrll 0xffffffff, /* dst_mask */
969 1.1 skrll FALSE), /* pcrel_offset */
970 1.1 skrll
971 1.1 skrll /* 26 bit jump address. */
972 1.1 skrll HOWTO (R_MIPS_26, /* type */
973 1.1 skrll 2, /* rightshift */
974 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
975 1.1 skrll 26, /* bitsize */
976 1.1 skrll FALSE, /* pc_relative */
977 1.1 skrll 0, /* bitpos */
978 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
979 1.1 skrll /* This needs complex overflow
980 1.1 skrll detection, because the upper 36
981 1.1 skrll bits must match the PC + 4. */
982 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
983 1.1 skrll "R_MIPS_26", /* name */
984 1.1 skrll FALSE, /* partial_inplace */
985 1.1 skrll 0, /* src_mask */
986 1.1 skrll 0x03ffffff, /* dst_mask */
987 1.1 skrll FALSE), /* pcrel_offset */
988 1.1 skrll
989 1.1 skrll /* High 16 bits of symbol value. */
990 1.1 skrll HOWTO (R_MIPS_HI16, /* type */
991 1.1 skrll 0, /* rightshift */
992 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
993 1.1 skrll 16, /* bitsize */
994 1.1 skrll FALSE, /* pc_relative */
995 1.1 skrll 0, /* bitpos */
996 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
997 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
998 1.1 skrll "R_MIPS_HI16", /* name */
999 1.1 skrll FALSE, /* partial_inplace */
1000 1.1 skrll 0, /* src_mask */
1001 1.1 skrll 0x0000ffff, /* dst_mask */
1002 1.1 skrll FALSE), /* pcrel_offset */
1003 1.1 skrll
1004 1.1 skrll /* Low 16 bits of symbol value. */
1005 1.1 skrll HOWTO (R_MIPS_LO16, /* type */
1006 1.1 skrll 0, /* rightshift */
1007 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1008 1.1 skrll 16, /* bitsize */
1009 1.1 skrll FALSE, /* pc_relative */
1010 1.1 skrll 0, /* bitpos */
1011 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1012 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1013 1.1 skrll "R_MIPS_LO16", /* name */
1014 1.1 skrll FALSE, /* partial_inplace */
1015 1.1 skrll 0, /* src_mask */
1016 1.1 skrll 0x0000ffff, /* dst_mask */
1017 1.1 skrll FALSE), /* pcrel_offset */
1018 1.1 skrll
1019 1.1 skrll /* GP relative reference. */
1020 1.1 skrll HOWTO (R_MIPS_GPREL16, /* type */
1021 1.1 skrll 0, /* rightshift */
1022 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1023 1.1 skrll 16, /* bitsize */
1024 1.1 skrll FALSE, /* pc_relative */
1025 1.1 skrll 0, /* bitpos */
1026 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1027 1.1 skrll mips_elf64_gprel16_reloc, /* special_function */
1028 1.1 skrll "R_MIPS_GPREL16", /* name */
1029 1.1 skrll FALSE, /* partial_inplace */
1030 1.1 skrll 0, /* src_mask */
1031 1.1 skrll 0x0000ffff, /* dst_mask */
1032 1.1 skrll FALSE), /* pcrel_offset */
1033 1.1 skrll
1034 1.1 skrll /* Reference to literal section. */
1035 1.1 skrll HOWTO (R_MIPS_LITERAL, /* type */
1036 1.1 skrll 0, /* rightshift */
1037 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1038 1.1 skrll 16, /* bitsize */
1039 1.1 skrll FALSE, /* pc_relative */
1040 1.1 skrll 0, /* bitpos */
1041 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1042 1.1 skrll mips_elf64_literal_reloc, /* special_function */
1043 1.1 skrll "R_MIPS_LITERAL", /* name */
1044 1.1 skrll FALSE, /* partial_inplace */
1045 1.1 skrll 0, /* src_mask */
1046 1.1 skrll 0x0000ffff, /* dst_mask */
1047 1.1 skrll FALSE), /* pcrel_offset */
1048 1.1 skrll
1049 1.1 skrll /* Reference to global offset table. */
1050 1.1 skrll HOWTO (R_MIPS_GOT16, /* type */
1051 1.1 skrll 0, /* rightshift */
1052 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1053 1.1 skrll 16, /* bitsize */
1054 1.1 skrll FALSE, /* pc_relative */
1055 1.1 skrll 0, /* bitpos */
1056 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1057 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1058 1.1 skrll "R_MIPS_GOT16", /* name */
1059 1.1 skrll FALSE, /* partial_inplace */
1060 1.1 skrll 0, /* src_mask */
1061 1.1 skrll 0x0000ffff, /* dst_mask */
1062 1.1 skrll FALSE), /* pcrel_offset */
1063 1.1 skrll
1064 1.1 skrll /* 16 bit PC relative reference. Note that the ABI document has a typo
1065 1.1 skrll and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
1066 1.1 skrll We do the right thing here. */
1067 1.1 skrll HOWTO (R_MIPS_PC16, /* type */
1068 1.1 skrll 2, /* rightshift */
1069 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1070 1.1 skrll 16, /* bitsize */
1071 1.1 skrll TRUE, /* pc_relative */
1072 1.1 skrll 0, /* bitpos */
1073 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1074 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1075 1.1 skrll "R_MIPS_PC16", /* name */
1076 1.1 skrll FALSE, /* partial_inplace */
1077 1.1 skrll 0, /* src_mask */
1078 1.1 skrll 0x0000ffff, /* dst_mask */
1079 1.1 skrll TRUE), /* pcrel_offset */
1080 1.1 skrll
1081 1.1 skrll /* 16 bit call through global offset table. */
1082 1.1 skrll HOWTO (R_MIPS_CALL16, /* type */
1083 1.1 skrll 0, /* rightshift */
1084 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1085 1.1 skrll 16, /* bitsize */
1086 1.1 skrll FALSE, /* pc_relative */
1087 1.1 skrll 0, /* bitpos */
1088 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1089 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1090 1.1 skrll "R_MIPS_CALL16", /* name */
1091 1.1 skrll FALSE, /* partial_inplace */
1092 1.1 skrll 0, /* src_mask */
1093 1.1 skrll 0x0000ffff, /* dst_mask */
1094 1.1 skrll FALSE), /* pcrel_offset */
1095 1.1 skrll
1096 1.1 skrll /* 32 bit GP relative reference. */
1097 1.1 skrll HOWTO (R_MIPS_GPREL32, /* type */
1098 1.1 skrll 0, /* rightshift */
1099 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1100 1.1 skrll 32, /* bitsize */
1101 1.1 skrll FALSE, /* pc_relative */
1102 1.1 skrll 0, /* bitpos */
1103 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1104 1.1 skrll mips_elf64_gprel32_reloc, /* special_function */
1105 1.1 skrll "R_MIPS_GPREL32", /* name */
1106 1.1 skrll FALSE, /* partial_inplace */
1107 1.1 skrll 0, /* src_mask */
1108 1.1 skrll 0xffffffff, /* dst_mask */
1109 1.1 skrll FALSE), /* pcrel_offset */
1110 1.1 skrll
1111 1.1 skrll EMPTY_HOWTO (13),
1112 1.1 skrll EMPTY_HOWTO (14),
1113 1.1 skrll EMPTY_HOWTO (15),
1114 1.1 skrll
1115 1.1 skrll /* A 5 bit shift field. */
1116 1.1 skrll HOWTO (R_MIPS_SHIFT5, /* type */
1117 1.1 skrll 0, /* rightshift */
1118 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1119 1.1 skrll 5, /* bitsize */
1120 1.1 skrll FALSE, /* pc_relative */
1121 1.1 skrll 6, /* bitpos */
1122 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
1123 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1124 1.1 skrll "R_MIPS_SHIFT5", /* name */
1125 1.1 skrll FALSE, /* partial_inplace */
1126 1.1 skrll 0, /* src_mask */
1127 1.1 skrll 0x000007c0, /* dst_mask */
1128 1.1 skrll FALSE), /* pcrel_offset */
1129 1.1 skrll
1130 1.1 skrll /* A 6 bit shift field. */
1131 1.1 skrll HOWTO (R_MIPS_SHIFT6, /* type */
1132 1.1 skrll 0, /* rightshift */
1133 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1134 1.1 skrll 6, /* bitsize */
1135 1.1 skrll FALSE, /* pc_relative */
1136 1.1 skrll 6, /* bitpos */
1137 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
1138 1.1 skrll mips_elf64_shift6_reloc, /* special_function */
1139 1.1 skrll "R_MIPS_SHIFT6", /* name */
1140 1.1 skrll FALSE, /* partial_inplace */
1141 1.1 skrll 0, /* src_mask */
1142 1.1 skrll 0x000007c4, /* dst_mask */
1143 1.1 skrll FALSE), /* pcrel_offset */
1144 1.1 skrll
1145 1.1 skrll /* 64 bit relocation. */
1146 1.1 skrll HOWTO (R_MIPS_64, /* type */
1147 1.1 skrll 0, /* rightshift */
1148 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
1149 1.1 skrll 64, /* bitsize */
1150 1.1 skrll FALSE, /* pc_relative */
1151 1.1 skrll 0, /* bitpos */
1152 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1153 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1154 1.1 skrll "R_MIPS_64", /* name */
1155 1.1 skrll FALSE, /* partial_inplace */
1156 1.1 skrll 0, /* src_mask */
1157 1.1 skrll MINUS_ONE, /* dst_mask */
1158 1.1 skrll FALSE), /* pcrel_offset */
1159 1.1 skrll
1160 1.1 skrll /* Displacement in the global offset table. */
1161 1.1 skrll HOWTO (R_MIPS_GOT_DISP, /* type */
1162 1.1 skrll 0, /* rightshift */
1163 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1164 1.1 skrll 16, /* bitsize */
1165 1.1 skrll FALSE, /* pc_relative */
1166 1.1 skrll 0, /* bitpos */
1167 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1168 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1169 1.1 skrll "R_MIPS_GOT_DISP", /* name */
1170 1.1 skrll FALSE, /* partial_inplace */
1171 1.1 skrll 0, /* src_mask */
1172 1.1 skrll 0x0000ffff, /* dst_mask */
1173 1.1 skrll FALSE), /* pcrel_offset */
1174 1.1 skrll
1175 1.1 skrll /* Displacement to page pointer in the global offset table. */
1176 1.1 skrll HOWTO (R_MIPS_GOT_PAGE, /* type */
1177 1.1 skrll 0, /* rightshift */
1178 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1179 1.1 skrll 16, /* bitsize */
1180 1.1 skrll FALSE, /* pc_relative */
1181 1.1 skrll 0, /* bitpos */
1182 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1183 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1184 1.1 skrll "R_MIPS_GOT_PAGE", /* name */
1185 1.1 skrll FALSE, /* partial_inplace */
1186 1.1 skrll 0, /* src_mask */
1187 1.1 skrll 0x0000ffff, /* dst_mask */
1188 1.1 skrll FALSE), /* pcrel_offset */
1189 1.1 skrll
1190 1.1 skrll /* Offset from page pointer in the global offset table. */
1191 1.1 skrll HOWTO (R_MIPS_GOT_OFST, /* type */
1192 1.1 skrll 0, /* rightshift */
1193 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1194 1.1 skrll 16, /* bitsize */
1195 1.1 skrll FALSE, /* pc_relative */
1196 1.1 skrll 0, /* bitpos */
1197 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1198 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1199 1.1 skrll "R_MIPS_GOT_OFST", /* name */
1200 1.1 skrll FALSE, /* partial_inplace */
1201 1.1 skrll 0, /* src_mask */
1202 1.1 skrll 0x0000ffff, /* dst_mask */
1203 1.1 skrll FALSE), /* pcrel_offset */
1204 1.1 skrll
1205 1.1 skrll /* High 16 bits of displacement in global offset table. */
1206 1.1 skrll HOWTO (R_MIPS_GOT_HI16, /* type */
1207 1.1 skrll 0, /* rightshift */
1208 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1209 1.1 skrll 16, /* bitsize */
1210 1.1 skrll FALSE, /* pc_relative */
1211 1.1 skrll 0, /* bitpos */
1212 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1213 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1214 1.1 skrll "R_MIPS_GOT_HI16", /* name */
1215 1.1 skrll FALSE, /* partial_inplace */
1216 1.1 skrll 0, /* src_mask */
1217 1.1 skrll 0x0000ffff, /* dst_mask */
1218 1.1 skrll FALSE), /* pcrel_offset */
1219 1.1 skrll
1220 1.1 skrll /* Low 16 bits of displacement in global offset table. */
1221 1.1 skrll HOWTO (R_MIPS_GOT_LO16, /* type */
1222 1.1 skrll 0, /* rightshift */
1223 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1224 1.1 skrll 16, /* bitsize */
1225 1.1 skrll FALSE, /* pc_relative */
1226 1.1 skrll 0, /* bitpos */
1227 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1228 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1229 1.1 skrll "R_MIPS_GOT_LO16", /* name */
1230 1.1 skrll FALSE, /* partial_inplace */
1231 1.1 skrll 0, /* src_mask */
1232 1.1 skrll 0x0000ffff, /* dst_mask */
1233 1.1 skrll FALSE), /* pcrel_offset */
1234 1.1 skrll
1235 1.1 skrll /* 64 bit subtraction. */
1236 1.1 skrll HOWTO (R_MIPS_SUB, /* type */
1237 1.1 skrll 0, /* rightshift */
1238 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
1239 1.1 skrll 64, /* bitsize */
1240 1.1 skrll FALSE, /* pc_relative */
1241 1.1 skrll 0, /* bitpos */
1242 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1243 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1244 1.1 skrll "R_MIPS_SUB", /* name */
1245 1.1 skrll FALSE, /* partial_inplace */
1246 1.1 skrll 0, /* src_mask */
1247 1.1 skrll MINUS_ONE, /* dst_mask */
1248 1.1 skrll FALSE), /* pcrel_offset */
1249 1.1 skrll
1250 1.1 skrll /* Insert the addend as an instruction. */
1251 1.1 skrll /* FIXME: Not handled correctly. */
1252 1.1 skrll HOWTO (R_MIPS_INSERT_A, /* type */
1253 1.1 skrll 0, /* rightshift */
1254 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1255 1.1 skrll 32, /* bitsize */
1256 1.1 skrll FALSE, /* pc_relative */
1257 1.1 skrll 0, /* bitpos */
1258 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1259 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1260 1.1 skrll "R_MIPS_INSERT_A", /* name */
1261 1.1 skrll FALSE, /* partial_inplace */
1262 1.1 skrll 0, /* src_mask */
1263 1.1 skrll 0xffffffff, /* dst_mask */
1264 1.1 skrll FALSE), /* pcrel_offset */
1265 1.1 skrll
1266 1.1 skrll /* Insert the addend as an instruction, and change all relocations
1267 1.1 skrll to refer to the old instruction at the address. */
1268 1.1 skrll /* FIXME: Not handled correctly. */
1269 1.1 skrll HOWTO (R_MIPS_INSERT_B, /* type */
1270 1.1 skrll 0, /* rightshift */
1271 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1272 1.1 skrll 32, /* bitsize */
1273 1.1 skrll FALSE, /* pc_relative */
1274 1.1 skrll 0, /* bitpos */
1275 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1276 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1277 1.1 skrll "R_MIPS_INSERT_B", /* name */
1278 1.1 skrll FALSE, /* partial_inplace */
1279 1.1 skrll 0, /* src_mask */
1280 1.1 skrll 0xffffffff, /* dst_mask */
1281 1.1 skrll FALSE), /* pcrel_offset */
1282 1.1 skrll
1283 1.1 skrll /* Delete a 32 bit instruction. */
1284 1.1 skrll /* FIXME: Not handled correctly. */
1285 1.1 skrll HOWTO (R_MIPS_DELETE, /* type */
1286 1.1 skrll 0, /* rightshift */
1287 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1288 1.1 skrll 32, /* bitsize */
1289 1.1 skrll FALSE, /* pc_relative */
1290 1.1 skrll 0, /* bitpos */
1291 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1292 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1293 1.1 skrll "R_MIPS_DELETE", /* name */
1294 1.1 skrll FALSE, /* partial_inplace */
1295 1.1 skrll 0, /* src_mask */
1296 1.1 skrll 0xffffffff, /* dst_mask */
1297 1.1 skrll FALSE), /* pcrel_offset */
1298 1.1 skrll
1299 1.1 skrll /* Get the higher value of a 64 bit addend. */
1300 1.1 skrll HOWTO (R_MIPS_HIGHER, /* type */
1301 1.1 skrll 0, /* rightshift */
1302 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1303 1.1 skrll 16, /* bitsize */
1304 1.1 skrll FALSE, /* pc_relative */
1305 1.1 skrll 0, /* bitpos */
1306 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1307 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1308 1.1 skrll "R_MIPS_HIGHER", /* name */
1309 1.1 skrll FALSE, /* partial_inplace */
1310 1.1 skrll 0, /* src_mask */
1311 1.1 skrll 0x0000ffff, /* dst_mask */
1312 1.1 skrll FALSE), /* pcrel_offset */
1313 1.1 skrll
1314 1.1 skrll /* Get the highest value of a 64 bit addend. */
1315 1.1 skrll HOWTO (R_MIPS_HIGHEST, /* type */
1316 1.1 skrll 0, /* rightshift */
1317 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1318 1.1 skrll 16, /* 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_HIGHEST", /* name */
1324 1.1 skrll FALSE, /* partial_inplace */
1325 1.1 skrll 0, /* src_mask */
1326 1.1 skrll 0x0000ffff, /* dst_mask */
1327 1.1 skrll FALSE), /* pcrel_offset */
1328 1.1 skrll
1329 1.1 skrll /* High 16 bits of displacement in global offset table. */
1330 1.1 skrll HOWTO (R_MIPS_CALL_HI16, /* type */
1331 1.1 skrll 0, /* rightshift */
1332 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1333 1.1 skrll 16, /* bitsize */
1334 1.1 skrll FALSE, /* pc_relative */
1335 1.1 skrll 0, /* bitpos */
1336 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1337 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1338 1.1 skrll "R_MIPS_CALL_HI16", /* name */
1339 1.1 skrll FALSE, /* partial_inplace */
1340 1.1 skrll 0, /* src_mask */
1341 1.1 skrll 0x0000ffff, /* dst_mask */
1342 1.1 skrll FALSE), /* pcrel_offset */
1343 1.1 skrll
1344 1.1 skrll /* Low 16 bits of displacement in global offset table. */
1345 1.1 skrll HOWTO (R_MIPS_CALL_LO16, /* type */
1346 1.1 skrll 0, /* rightshift */
1347 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1348 1.1 skrll 16, /* bitsize */
1349 1.1 skrll FALSE, /* pc_relative */
1350 1.1 skrll 0, /* bitpos */
1351 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1352 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1353 1.1 skrll "R_MIPS_CALL_LO16", /* name */
1354 1.1 skrll FALSE, /* partial_inplace */
1355 1.1 skrll 0, /* src_mask */
1356 1.1 skrll 0x0000ffff, /* dst_mask */
1357 1.1 skrll FALSE), /* pcrel_offset */
1358 1.1 skrll
1359 1.1 skrll /* Section displacement, used by an associated event location section. */
1360 1.1 skrll HOWTO (R_MIPS_SCN_DISP, /* type */
1361 1.1 skrll 0, /* rightshift */
1362 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1363 1.1 skrll 32, /* bitsize */
1364 1.1 skrll FALSE, /* pc_relative */
1365 1.1 skrll 0, /* bitpos */
1366 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1367 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1368 1.1 skrll "R_MIPS_SCN_DISP", /* name */
1369 1.1 skrll FALSE, /* partial_inplace */
1370 1.1 skrll 0, /* src_mask */
1371 1.1 skrll 0xffffffff, /* dst_mask */
1372 1.1 skrll FALSE), /* pcrel_offset */
1373 1.1 skrll
1374 1.1 skrll HOWTO (R_MIPS_REL16, /* type */
1375 1.1 skrll 0, /* rightshift */
1376 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
1377 1.1 skrll 16, /* bitsize */
1378 1.1 skrll FALSE, /* pc_relative */
1379 1.1 skrll 0, /* bitpos */
1380 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1381 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1382 1.1 skrll "R_MIPS_REL16", /* name */
1383 1.1 skrll FALSE, /* partial_inplace */
1384 1.1 skrll 0, /* src_mask */
1385 1.1 skrll 0xffff, /* dst_mask */
1386 1.1 skrll FALSE), /* pcrel_offset */
1387 1.1 skrll
1388 1.1 skrll /* These two are obsolete. */
1389 1.1 skrll EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
1390 1.1 skrll EMPTY_HOWTO (R_MIPS_PJUMP),
1391 1.1 skrll
1392 1.1 skrll /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
1393 1.1 skrll It must be used for multigot GOT's (and only there). */
1394 1.1 skrll HOWTO (R_MIPS_RELGOT, /* type */
1395 1.1 skrll 0, /* rightshift */
1396 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1397 1.1 skrll 32, /* bitsize */
1398 1.1 skrll FALSE, /* pc_relative */
1399 1.1 skrll 0, /* bitpos */
1400 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1401 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1402 1.1 skrll "R_MIPS_RELGOT", /* name */
1403 1.1 skrll FALSE, /* partial_inplace */
1404 1.1 skrll 0, /* src_mask */
1405 1.1 skrll 0xffffffff, /* dst_mask */
1406 1.1 skrll FALSE), /* pcrel_offset */
1407 1.1 skrll
1408 1.1 skrll /* Protected jump conversion. This is an optimization hint. No
1409 1.1 skrll relocation is required for correctness. */
1410 1.1 skrll HOWTO (R_MIPS_JALR, /* type */
1411 1.1 skrll 0, /* rightshift */
1412 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1413 1.1 skrll 32, /* bitsize */
1414 1.1 skrll FALSE, /* pc_relative */
1415 1.1 skrll 0, /* bitpos */
1416 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1417 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1418 1.1 skrll "R_MIPS_JALR", /* name */
1419 1.1 skrll FALSE, /* partial_inplace */
1420 1.1 skrll 0, /* src_mask */
1421 1.1 skrll 0x00000000, /* dst_mask */
1422 1.1 skrll FALSE), /* pcrel_offset */
1423 1.1 skrll
1424 1.1 skrll /* TLS relocations. */
1425 1.1 skrll EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
1426 1.3 christos EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
1427 1.3 christos
1428 1.3 christos HOWTO (R_MIPS_TLS_DTPMOD64, /* type */
1429 1.3 christos 0, /* rightshift */
1430 1.3 christos 4, /* size (0 = byte, 1 = short, 2 = long) */
1431 1.3 christos 64, /* bitsize */
1432 1.3 christos FALSE, /* pc_relative */
1433 1.3 christos 0, /* bitpos */
1434 1.3 christos complain_overflow_dont, /* complain_on_overflow */
1435 1.3 christos _bfd_mips_elf_generic_reloc, /* special_function */
1436 1.3 christos "R_MIPS_TLS_DTPMOD64", /* name */
1437 1.4 christos FALSE, /* partial_inplace */
1438 1.3 christos 0, /* src_mask */
1439 1.3 christos MINUS_ONE, /* dst_mask */
1440 1.1 skrll FALSE), /* pcrel_offset */
1441 1.1 skrll
1442 1.1 skrll HOWTO (R_MIPS_TLS_DTPREL64, /* type */
1443 1.1 skrll 0, /* rightshift */
1444 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
1445 1.1 skrll 64, /* bitsize */
1446 1.1 skrll FALSE, /* pc_relative */
1447 1.1 skrll 0, /* bitpos */
1448 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1449 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1450 1.3 christos "R_MIPS_TLS_DTPREL64", /* name */
1451 1.4 christos FALSE, /* partial_inplace */
1452 1.1 skrll 0, /* src_mask */
1453 1.1 skrll MINUS_ONE, /* dst_mask */
1454 1.1 skrll FALSE), /* pcrel_offset */
1455 1.1 skrll
1456 1.1 skrll /* TLS general dynamic variable reference. */
1457 1.4 christos HOWTO (R_MIPS_TLS_GD, /* type */
1458 1.4 christos 0, /* rightshift */
1459 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1460 1.4 christos 16, /* bitsize */
1461 1.4 christos FALSE, /* pc_relative */
1462 1.4 christos 0, /* bitpos */
1463 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1464 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1465 1.4 christos "R_MIPS_TLS_GD", /* name */
1466 1.4 christos FALSE, /* partial_inplace */
1467 1.4 christos 0, /* src_mask */
1468 1.4 christos 0x0000ffff, /* dst_mask */
1469 1.4 christos FALSE), /* pcrel_offset */
1470 1.4 christos
1471 1.4 christos /* TLS local dynamic variable reference. */
1472 1.4 christos HOWTO (R_MIPS_TLS_LDM, /* type */
1473 1.4 christos 0, /* rightshift */
1474 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1475 1.4 christos 16, /* bitsize */
1476 1.4 christos FALSE, /* pc_relative */
1477 1.4 christos 0, /* bitpos */
1478 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1479 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1480 1.4 christos "R_MIPS_TLS_LDM", /* name */
1481 1.4 christos FALSE, /* partial_inplace */
1482 1.4 christos 0, /* src_mask */
1483 1.4 christos 0x0000ffff, /* dst_mask */
1484 1.4 christos FALSE), /* pcrel_offset */
1485 1.4 christos
1486 1.4 christos /* TLS local dynamic offset. */
1487 1.4 christos HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */
1488 1.4 christos 0, /* rightshift */
1489 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1490 1.4 christos 16, /* bitsize */
1491 1.4 christos FALSE, /* pc_relative */
1492 1.4 christos 0, /* bitpos */
1493 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1494 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1495 1.4 christos "R_MIPS_TLS_DTPREL_HI16", /* name */
1496 1.4 christos FALSE, /* partial_inplace */
1497 1.4 christos 0, /* src_mask */
1498 1.4 christos 0x0000ffff, /* dst_mask */
1499 1.4 christos FALSE), /* pcrel_offset */
1500 1.4 christos
1501 1.4 christos /* TLS local dynamic offset. */
1502 1.4 christos HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */
1503 1.4 christos 0, /* rightshift */
1504 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1505 1.4 christos 16, /* bitsize */
1506 1.4 christos FALSE, /* pc_relative */
1507 1.4 christos 0, /* bitpos */
1508 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1509 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1510 1.4 christos "R_MIPS_TLS_DTPREL_LO16", /* name */
1511 1.4 christos FALSE, /* partial_inplace */
1512 1.4 christos 0, /* src_mask */
1513 1.4 christos 0x0000ffff, /* dst_mask */
1514 1.4 christos FALSE), /* pcrel_offset */
1515 1.4 christos
1516 1.4 christos /* TLS thread pointer offset. */
1517 1.4 christos HOWTO (R_MIPS_TLS_GOTTPREL, /* type */
1518 1.4 christos 0, /* rightshift */
1519 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1520 1.4 christos 16, /* bitsize */
1521 1.4 christos FALSE, /* pc_relative */
1522 1.4 christos 0, /* bitpos */
1523 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1524 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1525 1.4 christos "R_MIPS_TLS_GOTTPREL", /* name */
1526 1.4 christos FALSE, /* partial_inplace */
1527 1.4 christos 0, /* src_mask */
1528 1.4 christos 0x0000ffff, /* dst_mask */
1529 1.4 christos FALSE), /* pcrel_offset */
1530 1.4 christos
1531 1.4 christos /* TLS IE dynamic relocations. */
1532 1.4 christos EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
1533 1.4 christos
1534 1.4 christos HOWTO (R_MIPS_TLS_TPREL64, /* type */
1535 1.4 christos 0, /* rightshift */
1536 1.4 christos 4, /* size (0 = byte, 1 = short, 2 = long) */
1537 1.4 christos 64, /* bitsize */
1538 1.4 christos FALSE, /* pc_relative */
1539 1.4 christos 0, /* bitpos */
1540 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1541 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1542 1.4 christos "R_MIPS_TLS_TPREL64", /* name */
1543 1.4 christos FALSE, /* partial_inplace */
1544 1.4 christos 0, /* src_mask */
1545 1.4 christos MINUS_ONE, /* dst_mask */
1546 1.4 christos FALSE), /* pcrel_offset */
1547 1.4 christos
1548 1.4 christos /* TLS thread pointer offset. */
1549 1.4 christos HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
1550 1.4 christos 0, /* rightshift */
1551 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1552 1.4 christos 16, /* bitsize */
1553 1.4 christos FALSE, /* pc_relative */
1554 1.4 christos 0, /* bitpos */
1555 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1556 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1557 1.4 christos "R_MIPS_TLS_TPREL_HI16", /* name */
1558 1.4 christos FALSE, /* partial_inplace */
1559 1.4 christos 0, /* src_mask */
1560 1.4 christos 0x0000ffff, /* dst_mask */
1561 1.4 christos FALSE), /* pcrel_offset */
1562 1.4 christos
1563 1.4 christos /* TLS thread pointer offset. */
1564 1.4 christos HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
1565 1.4 christos 0, /* rightshift */
1566 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1567 1.4 christos 16, /* bitsize */
1568 1.4 christos FALSE, /* pc_relative */
1569 1.4 christos 0, /* bitpos */
1570 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1571 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1572 1.4 christos "R_MIPS_TLS_TPREL_LO16", /* name */
1573 1.4 christos FALSE, /* partial_inplace */
1574 1.4 christos 0, /* src_mask */
1575 1.4 christos 0x0000ffff, /* dst_mask */
1576 1.4 christos FALSE), /* pcrel_offset */
1577 1.4 christos
1578 1.4 christos /* 32 bit relocation with no addend. */
1579 1.4 christos HOWTO (R_MIPS_GLOB_DAT, /* type */
1580 1.4 christos 0, /* rightshift */
1581 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1582 1.4 christos 32, /* bitsize */
1583 1.4 christos FALSE, /* pc_relative */
1584 1.4 christos 0, /* bitpos */
1585 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1586 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1587 1.4 christos "R_MIPS_GLOB_DAT", /* name */
1588 1.4 christos FALSE, /* partial_inplace */
1589 1.4 christos 0x0, /* src_mask */
1590 1.4 christos 0xffffffff, /* dst_mask */
1591 1.6 christos FALSE), /* pcrel_offset */
1592 1.6 christos
1593 1.6 christos EMPTY_HOWTO (52),
1594 1.6 christos EMPTY_HOWTO (53),
1595 1.6 christos EMPTY_HOWTO (54),
1596 1.6 christos EMPTY_HOWTO (55),
1597 1.6 christos EMPTY_HOWTO (56),
1598 1.6 christos EMPTY_HOWTO (57),
1599 1.6 christos EMPTY_HOWTO (58),
1600 1.6 christos EMPTY_HOWTO (59),
1601 1.6 christos
1602 1.6 christos HOWTO (R_MIPS_PC21_S2, /* type */
1603 1.6 christos 2, /* rightshift */
1604 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1605 1.6 christos 21, /* bitsize */
1606 1.6 christos TRUE, /* pc_relative */
1607 1.6 christos 0, /* bitpos */
1608 1.6 christos complain_overflow_signed, /* complain_on_overflow */
1609 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
1610 1.6 christos "R_MIPS_PC21_S2", /* name */
1611 1.6 christos FALSE, /* partial_inplace */
1612 1.6 christos 0, /* src_mask */
1613 1.6 christos 0x001fffff, /* dst_mask */
1614 1.6 christos TRUE), /* pcrel_offset */
1615 1.6 christos
1616 1.6 christos HOWTO (R_MIPS_PC26_S2, /* type */
1617 1.6 christos 2, /* rightshift */
1618 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1619 1.6 christos 26, /* bitsize */
1620 1.6 christos TRUE, /* pc_relative */
1621 1.6 christos 0, /* bitpos */
1622 1.6 christos complain_overflow_signed, /* complain_on_overflow */
1623 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
1624 1.6 christos "R_MIPS_PC26_S2", /* name */
1625 1.6 christos FALSE, /* partial_inplace */
1626 1.6 christos 0, /* src_mask */
1627 1.6 christos 0x03ffffff, /* dst_mask */
1628 1.6 christos TRUE), /* pcrel_offset */
1629 1.6 christos
1630 1.6 christos HOWTO (R_MIPS_PC18_S3, /* type */
1631 1.6 christos 3, /* rightshift */
1632 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1633 1.6 christos 18, /* bitsize */
1634 1.6 christos TRUE, /* pc_relative */
1635 1.6 christos 0, /* bitpos */
1636 1.6 christos complain_overflow_signed, /* complain_on_overflow */
1637 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
1638 1.6 christos "R_MIPS_PC18_S3", /* name */
1639 1.6 christos FALSE, /* partial_inplace */
1640 1.6 christos 0, /* src_mask */
1641 1.6 christos 0x0003ffff, /* dst_mask */
1642 1.6 christos TRUE), /* pcrel_offset */
1643 1.6 christos
1644 1.6 christos HOWTO (R_MIPS_PC19_S2, /* type */
1645 1.6 christos 2, /* rightshift */
1646 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1647 1.6 christos 19, /* bitsize */
1648 1.6 christos TRUE, /* pc_relative */
1649 1.6 christos 0, /* bitpos */
1650 1.6 christos complain_overflow_signed, /* complain_on_overflow */
1651 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
1652 1.6 christos "R_MIPS_PC19_S2", /* name */
1653 1.6 christos FALSE, /* partial_inplace */
1654 1.6 christos 0, /* src_mask */
1655 1.6 christos 0x0007ffff, /* dst_mask */
1656 1.6 christos TRUE), /* pcrel_offset */
1657 1.6 christos
1658 1.6 christos HOWTO (R_MIPS_PCHI16, /* type */
1659 1.6 christos 16, /* rightshift */
1660 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1661 1.6 christos 16, /* bitsize */
1662 1.6 christos TRUE, /* pc_relative */
1663 1.6 christos 0, /* bitpos */
1664 1.6 christos complain_overflow_signed, /* complain_on_overflow */
1665 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
1666 1.6 christos "R_MIPS_PCHI16", /* name */
1667 1.6 christos FALSE, /* partial_inplace */
1668 1.6 christos 0, /* src_mask */
1669 1.6 christos 0x0000ffff, /* dst_mask */
1670 1.6 christos TRUE), /* pcrel_offset */
1671 1.6 christos
1672 1.6 christos HOWTO (R_MIPS_PCLO16, /* type */
1673 1.6 christos 0, /* rightshift */
1674 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1675 1.6 christos 16, /* bitsize */
1676 1.6 christos TRUE, /* pc_relative */
1677 1.6 christos 0, /* bitpos */
1678 1.6 christos complain_overflow_dont, /* complain_on_overflow */
1679 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
1680 1.6 christos "R_MIPS_PCLO16", /* name */
1681 1.6 christos FALSE, /* partial_inplace */
1682 1.6 christos 0, /* src_mask */
1683 1.6 christos 0x0000ffff, /* dst_mask */
1684 1.6 christos TRUE), /* pcrel_offset */
1685 1.4 christos
1686 1.4 christos };
1687 1.4 christos
1688 1.4 christos static reloc_howto_type mips16_elf64_howto_table_rel[] =
1689 1.4 christos {
1690 1.4 christos /* The reloc used for the mips16 jump instruction. */
1691 1.4 christos HOWTO (R_MIPS16_26, /* type */
1692 1.4 christos 2, /* rightshift */
1693 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1694 1.4 christos 26, /* bitsize */
1695 1.4 christos FALSE, /* pc_relative */
1696 1.4 christos 0, /* bitpos */
1697 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1698 1.4 christos /* This needs complex overflow
1699 1.4 christos detection, because the upper four
1700 1.4 christos bits must match the PC. */
1701 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1702 1.4 christos "R_MIPS16_26", /* name */
1703 1.4 christos TRUE, /* partial_inplace */
1704 1.4 christos 0x3ffffff, /* src_mask */
1705 1.4 christos 0x3ffffff, /* dst_mask */
1706 1.4 christos FALSE), /* pcrel_offset */
1707 1.4 christos
1708 1.4 christos /* The reloc used for the mips16 gprel instruction. */
1709 1.4 christos HOWTO (R_MIPS16_GPREL, /* type */
1710 1.4 christos 0, /* rightshift */
1711 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1712 1.4 christos 16, /* bitsize */
1713 1.4 christos FALSE, /* pc_relative */
1714 1.4 christos 0, /* bitpos */
1715 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1716 1.4 christos mips16_gprel_reloc, /* special_function */
1717 1.4 christos "R_MIPS16_GPREL", /* name */
1718 1.4 christos TRUE, /* partial_inplace */
1719 1.4 christos 0x0000ffff, /* src_mask */
1720 1.4 christos 0x0000ffff, /* dst_mask */
1721 1.4 christos FALSE), /* pcrel_offset */
1722 1.4 christos
1723 1.4 christos /* A MIPS16 reference to the global offset table. */
1724 1.4 christos HOWTO (R_MIPS16_GOT16, /* type */
1725 1.4 christos 0, /* rightshift */
1726 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1727 1.4 christos 16, /* bitsize */
1728 1.4 christos FALSE, /* pc_relative */
1729 1.4 christos 0, /* bitpos */
1730 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1731 1.4 christos _bfd_mips_elf_got16_reloc, /* special_function */
1732 1.4 christos "R_MIPS16_GOT16", /* name */
1733 1.4 christos TRUE, /* partial_inplace */
1734 1.4 christos 0x0000ffff, /* src_mask */
1735 1.4 christos 0x0000ffff, /* dst_mask */
1736 1.4 christos FALSE), /* pcrel_offset */
1737 1.4 christos
1738 1.4 christos /* A MIPS16 call through the global offset table. */
1739 1.4 christos HOWTO (R_MIPS16_CALL16, /* type */
1740 1.4 christos 0, /* rightshift */
1741 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1742 1.4 christos 16, /* bitsize */
1743 1.4 christos FALSE, /* pc_relative */
1744 1.4 christos 0, /* bitpos */
1745 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1746 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1747 1.4 christos "R_MIPS16_CALL16", /* name */
1748 1.4 christos TRUE, /* partial_inplace */
1749 1.4 christos 0x0000ffff, /* src_mask */
1750 1.4 christos 0x0000ffff, /* dst_mask */
1751 1.4 christos FALSE), /* pcrel_offset */
1752 1.4 christos
1753 1.4 christos /* MIPS16 high 16 bits of symbol value. */
1754 1.4 christos HOWTO (R_MIPS16_HI16, /* type */
1755 1.4 christos 16, /* rightshift */
1756 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1757 1.4 christos 16, /* bitsize */
1758 1.4 christos FALSE, /* pc_relative */
1759 1.4 christos 0, /* bitpos */
1760 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1761 1.4 christos _bfd_mips_elf_hi16_reloc, /* special_function */
1762 1.4 christos "R_MIPS16_HI16", /* name */
1763 1.4 christos TRUE, /* partial_inplace */
1764 1.4 christos 0x0000ffff, /* src_mask */
1765 1.4 christos 0x0000ffff, /* dst_mask */
1766 1.4 christos FALSE), /* pcrel_offset */
1767 1.4 christos
1768 1.4 christos /* MIPS16 low 16 bits of symbol value. */
1769 1.4 christos HOWTO (R_MIPS16_LO16, /* type */
1770 1.4 christos 0, /* rightshift */
1771 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1772 1.4 christos 16, /* bitsize */
1773 1.4 christos FALSE, /* pc_relative */
1774 1.4 christos 0, /* bitpos */
1775 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1776 1.4 christos _bfd_mips_elf_lo16_reloc, /* special_function */
1777 1.4 christos "R_MIPS16_LO16", /* name */
1778 1.4 christos TRUE, /* partial_inplace */
1779 1.4 christos 0x0000ffff, /* src_mask */
1780 1.4 christos 0x0000ffff, /* dst_mask */
1781 1.4 christos FALSE), /* pcrel_offset */
1782 1.4 christos
1783 1.4 christos /* MIPS16 TLS general dynamic variable reference. */
1784 1.4 christos HOWTO (R_MIPS16_TLS_GD, /* type */
1785 1.4 christos 0, /* rightshift */
1786 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1787 1.4 christos 16, /* bitsize */
1788 1.4 christos FALSE, /* pc_relative */
1789 1.4 christos 0, /* bitpos */
1790 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1791 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1792 1.4 christos "R_MIPS16_TLS_GD", /* name */
1793 1.4 christos TRUE, /* partial_inplace */
1794 1.4 christos 0x0000ffff, /* src_mask */
1795 1.4 christos 0x0000ffff, /* dst_mask */
1796 1.4 christos FALSE), /* pcrel_offset */
1797 1.4 christos
1798 1.4 christos /* MIPS16 TLS local dynamic variable reference. */
1799 1.4 christos HOWTO (R_MIPS16_TLS_LDM, /* type */
1800 1.4 christos 0, /* rightshift */
1801 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1802 1.4 christos 16, /* bitsize */
1803 1.4 christos FALSE, /* pc_relative */
1804 1.4 christos 0, /* bitpos */
1805 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1806 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1807 1.4 christos "R_MIPS16_TLS_LDM", /* name */
1808 1.4 christos TRUE, /* partial_inplace */
1809 1.4 christos 0x0000ffff, /* src_mask */
1810 1.4 christos 0x0000ffff, /* dst_mask */
1811 1.4 christos FALSE), /* pcrel_offset */
1812 1.4 christos
1813 1.4 christos /* MIPS16 TLS local dynamic offset. */
1814 1.4 christos HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
1815 1.4 christos 0, /* rightshift */
1816 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1817 1.4 christos 16, /* bitsize */
1818 1.4 christos FALSE, /* pc_relative */
1819 1.4 christos 0, /* bitpos */
1820 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1821 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1822 1.4 christos "R_MIPS16_TLS_DTPREL_HI16", /* name */
1823 1.4 christos TRUE, /* partial_inplace */
1824 1.4 christos 0x0000ffff, /* src_mask */
1825 1.4 christos 0x0000ffff, /* dst_mask */
1826 1.4 christos FALSE), /* pcrel_offset */
1827 1.4 christos
1828 1.4 christos /* MIPS16 TLS local dynamic offset. */
1829 1.4 christos HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
1830 1.4 christos 0, /* rightshift */
1831 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1832 1.4 christos 16, /* bitsize */
1833 1.4 christos FALSE, /* pc_relative */
1834 1.4 christos 0, /* bitpos */
1835 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1836 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1837 1.4 christos "R_MIPS16_TLS_DTPREL_LO16", /* name */
1838 1.4 christos TRUE, /* partial_inplace */
1839 1.4 christos 0x0000ffff, /* src_mask */
1840 1.4 christos 0x0000ffff, /* dst_mask */
1841 1.4 christos FALSE), /* pcrel_offset */
1842 1.4 christos
1843 1.4 christos /* MIPS16 TLS thread pointer offset. */
1844 1.4 christos HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
1845 1.4 christos 0, /* rightshift */
1846 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1847 1.4 christos 16, /* bitsize */
1848 1.4 christos FALSE, /* pc_relative */
1849 1.4 christos 0, /* bitpos */
1850 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1851 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1852 1.4 christos "R_MIPS16_TLS_GOTTPREL", /* name */
1853 1.4 christos TRUE, /* partial_inplace */
1854 1.4 christos 0x0000ffff, /* src_mask */
1855 1.4 christos 0x0000ffff, /* dst_mask */
1856 1.4 christos FALSE), /* pcrel_offset */
1857 1.4 christos
1858 1.4 christos /* MIPS16 TLS thread pointer offset. */
1859 1.4 christos HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
1860 1.4 christos 0, /* rightshift */
1861 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1862 1.4 christos 16, /* bitsize */
1863 1.4 christos FALSE, /* pc_relative */
1864 1.4 christos 0, /* bitpos */
1865 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1866 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1867 1.4 christos "R_MIPS16_TLS_TPREL_HI16", /* name */
1868 1.4 christos TRUE, /* partial_inplace */
1869 1.4 christos 0x0000ffff, /* src_mask */
1870 1.4 christos 0x0000ffff, /* dst_mask */
1871 1.4 christos FALSE), /* pcrel_offset */
1872 1.4 christos
1873 1.4 christos /* MIPS16 TLS thread pointer offset. */
1874 1.4 christos HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
1875 1.4 christos 0, /* rightshift */
1876 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1877 1.4 christos 16, /* bitsize */
1878 1.4 christos FALSE, /* pc_relative */
1879 1.4 christos 0, /* bitpos */
1880 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1881 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1882 1.4 christos "R_MIPS16_TLS_TPREL_LO16", /* name */
1883 1.4 christos TRUE, /* partial_inplace */
1884 1.4 christos 0x0000ffff, /* src_mask */
1885 1.4 christos 0x0000ffff, /* dst_mask */
1886 1.4 christos FALSE), /* pcrel_offset */
1887 1.4 christos };
1888 1.4 christos
1889 1.4 christos static reloc_howto_type mips16_elf64_howto_table_rela[] =
1890 1.4 christos {
1891 1.4 christos /* The reloc used for the mips16 jump instruction. */
1892 1.4 christos HOWTO (R_MIPS16_26, /* type */
1893 1.4 christos 2, /* rightshift */
1894 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1895 1.4 christos 26, /* bitsize */
1896 1.4 christos FALSE, /* pc_relative */
1897 1.4 christos 0, /* bitpos */
1898 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1899 1.4 christos /* This needs complex overflow
1900 1.4 christos detection, because the upper four
1901 1.4 christos bits must match the PC. */
1902 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1903 1.4 christos "R_MIPS16_26", /* name */
1904 1.4 christos FALSE, /* partial_inplace */
1905 1.4 christos 0, /* src_mask */
1906 1.4 christos 0x3ffffff, /* dst_mask */
1907 1.4 christos FALSE), /* pcrel_offset */
1908 1.4 christos
1909 1.4 christos /* The reloc used for the mips16 gprel instruction. */
1910 1.4 christos HOWTO (R_MIPS16_GPREL, /* type */
1911 1.4 christos 0, /* rightshift */
1912 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1913 1.4 christos 16, /* bitsize */
1914 1.4 christos FALSE, /* pc_relative */
1915 1.4 christos 0, /* bitpos */
1916 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1917 1.4 christos mips16_gprel_reloc, /* special_function */
1918 1.4 christos "R_MIPS16_GPREL", /* name */
1919 1.4 christos FALSE, /* partial_inplace */
1920 1.4 christos 0, /* src_mask */
1921 1.4 christos 0x0000ffff, /* dst_mask */
1922 1.4 christos FALSE), /* pcrel_offset */
1923 1.4 christos
1924 1.4 christos /* A MIPS16 reference to the global offset table. */
1925 1.4 christos HOWTO (R_MIPS16_GOT16, /* type */
1926 1.4 christos 0, /* rightshift */
1927 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1928 1.4 christos 16, /* bitsize */
1929 1.4 christos FALSE, /* pc_relative */
1930 1.4 christos 0, /* bitpos */
1931 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1932 1.4 christos _bfd_mips_elf_got16_reloc, /* special_function */
1933 1.4 christos "R_MIPS16_GOT16", /* name */
1934 1.4 christos FALSE, /* partial_inplace */
1935 1.4 christos 0, /* src_mask */
1936 1.4 christos 0x0000ffff, /* dst_mask */
1937 1.4 christos FALSE), /* pcrel_offset */
1938 1.4 christos
1939 1.4 christos /* A MIPS16 call through the global offset table. */
1940 1.4 christos HOWTO (R_MIPS16_CALL16, /* type */
1941 1.4 christos 0, /* rightshift */
1942 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1943 1.4 christos 16, /* bitsize */
1944 1.4 christos FALSE, /* pc_relative */
1945 1.4 christos 0, /* bitpos */
1946 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1947 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1948 1.4 christos "R_MIPS16_CALL16", /* name */
1949 1.4 christos FALSE, /* partial_inplace */
1950 1.4 christos 0, /* src_mask */
1951 1.4 christos 0x0000ffff, /* dst_mask */
1952 1.4 christos FALSE), /* pcrel_offset */
1953 1.4 christos
1954 1.4 christos /* MIPS16 high 16 bits of symbol value. */
1955 1.4 christos HOWTO (R_MIPS16_HI16, /* type */
1956 1.4 christos 16, /* rightshift */
1957 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1958 1.4 christos 16, /* bitsize */
1959 1.4 christos FALSE, /* pc_relative */
1960 1.4 christos 0, /* bitpos */
1961 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1962 1.4 christos _bfd_mips_elf_hi16_reloc, /* special_function */
1963 1.4 christos "R_MIPS16_HI16", /* name */
1964 1.4 christos FALSE, /* partial_inplace */
1965 1.4 christos 0, /* src_mask */
1966 1.4 christos 0x0000ffff, /* dst_mask */
1967 1.4 christos FALSE), /* pcrel_offset */
1968 1.4 christos
1969 1.4 christos /* MIPS16 low 16 bits of symbol value. */
1970 1.4 christos HOWTO (R_MIPS16_LO16, /* type */
1971 1.4 christos 0, /* rightshift */
1972 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1973 1.4 christos 16, /* bitsize */
1974 1.4 christos FALSE, /* pc_relative */
1975 1.4 christos 0, /* bitpos */
1976 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1977 1.4 christos _bfd_mips_elf_lo16_reloc, /* special_function */
1978 1.4 christos "R_MIPS16_LO16", /* name */
1979 1.4 christos FALSE, /* partial_inplace */
1980 1.4 christos 0, /* src_mask */
1981 1.4 christos 0x0000ffff, /* dst_mask */
1982 1.4 christos FALSE), /* pcrel_offset */
1983 1.4 christos
1984 1.4 christos /* MIPS16 TLS general dynamic variable reference. */
1985 1.4 christos HOWTO (R_MIPS16_TLS_GD, /* type */
1986 1.4 christos 0, /* rightshift */
1987 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1988 1.4 christos 16, /* bitsize */
1989 1.4 christos FALSE, /* pc_relative */
1990 1.4 christos 0, /* bitpos */
1991 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1992 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1993 1.4 christos "R_MIPS16_TLS_GD", /* name */
1994 1.4 christos FALSE, /* partial_inplace */
1995 1.4 christos 0, /* src_mask */
1996 1.4 christos 0x0000ffff, /* dst_mask */
1997 1.4 christos FALSE), /* pcrel_offset */
1998 1.4 christos
1999 1.4 christos /* MIPS16 TLS local dynamic variable reference. */
2000 1.4 christos HOWTO (R_MIPS16_TLS_LDM, /* type */
2001 1.4 christos 0, /* rightshift */
2002 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2003 1.4 christos 16, /* bitsize */
2004 1.4 christos FALSE, /* pc_relative */
2005 1.4 christos 0, /* bitpos */
2006 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2007 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2008 1.4 christos "R_MIPS16_TLS_LDM", /* name */
2009 1.4 christos FALSE, /* partial_inplace */
2010 1.4 christos 0, /* src_mask */
2011 1.4 christos 0x0000ffff, /* dst_mask */
2012 1.4 christos FALSE), /* pcrel_offset */
2013 1.4 christos
2014 1.4 christos /* MIPS16 TLS local dynamic offset. */
2015 1.4 christos HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
2016 1.4 christos 0, /* rightshift */
2017 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2018 1.4 christos 16, /* bitsize */
2019 1.4 christos FALSE, /* pc_relative */
2020 1.4 christos 0, /* bitpos */
2021 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2022 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2023 1.4 christos "R_MIPS16_TLS_DTPREL_HI16", /* name */
2024 1.4 christos FALSE, /* partial_inplace */
2025 1.4 christos 0, /* src_mask */
2026 1.4 christos 0x0000ffff, /* dst_mask */
2027 1.4 christos FALSE), /* pcrel_offset */
2028 1.4 christos
2029 1.4 christos /* MIPS16 TLS local dynamic offset. */
2030 1.4 christos HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
2031 1.4 christos 0, /* rightshift */
2032 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2033 1.4 christos 16, /* bitsize */
2034 1.4 christos FALSE, /* pc_relative */
2035 1.4 christos 0, /* bitpos */
2036 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2037 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2038 1.4 christos "R_MIPS16_TLS_DTPREL_LO16", /* name */
2039 1.4 christos FALSE, /* partial_inplace */
2040 1.4 christos 0, /* src_mask */
2041 1.4 christos 0x0000ffff, /* dst_mask */
2042 1.4 christos FALSE), /* pcrel_offset */
2043 1.4 christos
2044 1.4 christos /* MIPS16 TLS thread pointer offset. */
2045 1.4 christos HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
2046 1.4 christos 0, /* rightshift */
2047 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2048 1.4 christos 16, /* bitsize */
2049 1.4 christos FALSE, /* pc_relative */
2050 1.4 christos 0, /* bitpos */
2051 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2052 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2053 1.4 christos "R_MIPS16_TLS_GOTTPREL", /* name */
2054 1.4 christos FALSE, /* partial_inplace */
2055 1.4 christos 0, /* src_mask */
2056 1.4 christos 0x0000ffff, /* dst_mask */
2057 1.4 christos FALSE), /* pcrel_offset */
2058 1.4 christos
2059 1.4 christos /* MIPS16 TLS thread pointer offset. */
2060 1.4 christos HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
2061 1.4 christos 0, /* rightshift */
2062 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2063 1.4 christos 16, /* bitsize */
2064 1.4 christos FALSE, /* pc_relative */
2065 1.4 christos 0, /* bitpos */
2066 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2067 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2068 1.4 christos "R_MIPS16_TLS_TPREL_HI16", /* name */
2069 1.4 christos FALSE, /* partial_inplace */
2070 1.4 christos 0, /* src_mask */
2071 1.4 christos 0x0000ffff, /* dst_mask */
2072 1.4 christos FALSE), /* pcrel_offset */
2073 1.4 christos
2074 1.4 christos /* MIPS16 TLS thread pointer offset. */
2075 1.4 christos HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
2076 1.4 christos 0, /* rightshift */
2077 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2078 1.4 christos 16, /* bitsize */
2079 1.4 christos FALSE, /* pc_relative */
2080 1.4 christos 0, /* bitpos */
2081 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2082 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2083 1.4 christos "R_MIPS16_TLS_TPREL_LO16", /* name */
2084 1.4 christos FALSE, /* partial_inplace */
2085 1.4 christos 0, /* src_mask */
2086 1.4 christos 0x0000ffff, /* dst_mask */
2087 1.4 christos FALSE), /* pcrel_offset */
2088 1.4 christos };
2089 1.4 christos
2090 1.4 christos static reloc_howto_type micromips_elf64_howto_table_rel[] =
2091 1.4 christos {
2092 1.4 christos EMPTY_HOWTO (130),
2093 1.4 christos EMPTY_HOWTO (131),
2094 1.4 christos EMPTY_HOWTO (132),
2095 1.4 christos
2096 1.4 christos /* 26 bit jump address. */
2097 1.4 christos HOWTO (R_MICROMIPS_26_S1, /* type */
2098 1.4 christos 1, /* rightshift */
2099 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2100 1.4 christos 26, /* bitsize */
2101 1.4 christos FALSE, /* pc_relative */
2102 1.4 christos 0, /* bitpos */
2103 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2104 1.4 christos /* This needs complex overflow
2105 1.4 christos detection, because the upper four
2106 1.4 christos bits must match the PC. */
2107 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2108 1.4 christos "R_MICROMIPS_26_S1", /* name */
2109 1.4 christos TRUE, /* partial_inplace */
2110 1.4 christos 0x3ffffff, /* src_mask */
2111 1.4 christos 0x3ffffff, /* dst_mask */
2112 1.4 christos FALSE), /* pcrel_offset */
2113 1.4 christos
2114 1.4 christos /* High 16 bits of symbol value. */
2115 1.4 christos HOWTO (R_MICROMIPS_HI16, /* type */
2116 1.4 christos 16, /* rightshift */
2117 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2118 1.4 christos 16, /* bitsize */
2119 1.4 christos FALSE, /* pc_relative */
2120 1.4 christos 0, /* bitpos */
2121 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2122 1.4 christos _bfd_mips_elf_hi16_reloc, /* special_function */
2123 1.4 christos "R_MICROMIPS_HI16", /* name */
2124 1.4 christos TRUE, /* partial_inplace */
2125 1.4 christos 0x0000ffff, /* src_mask */
2126 1.4 christos 0x0000ffff, /* dst_mask */
2127 1.4 christos FALSE), /* pcrel_offset */
2128 1.4 christos
2129 1.4 christos /* Low 16 bits of symbol value. */
2130 1.4 christos HOWTO (R_MICROMIPS_LO16, /* type */
2131 1.4 christos 0, /* rightshift */
2132 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2133 1.4 christos 16, /* bitsize */
2134 1.4 christos FALSE, /* pc_relative */
2135 1.4 christos 0, /* bitpos */
2136 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2137 1.4 christos _bfd_mips_elf_lo16_reloc, /* special_function */
2138 1.4 christos "R_MICROMIPS_LO16", /* name */
2139 1.4 christos TRUE, /* partial_inplace */
2140 1.4 christos 0x0000ffff, /* src_mask */
2141 1.4 christos 0x0000ffff, /* dst_mask */
2142 1.4 christos FALSE), /* pcrel_offset */
2143 1.4 christos
2144 1.4 christos /* GP relative reference. */
2145 1.4 christos HOWTO (R_MICROMIPS_GPREL16, /* type */
2146 1.4 christos 0, /* rightshift */
2147 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2148 1.4 christos 16, /* bitsize */
2149 1.4 christos FALSE, /* pc_relative */
2150 1.4 christos 0, /* bitpos */
2151 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2152 1.4 christos _bfd_mips_elf32_gprel16_reloc, /* special_function */
2153 1.4 christos "R_MICROMIPS_GPREL16", /* name */
2154 1.4 christos TRUE, /* partial_inplace */
2155 1.4 christos 0x0000ffff, /* src_mask */
2156 1.4 christos 0x0000ffff, /* dst_mask */
2157 1.4 christos FALSE), /* pcrel_offset */
2158 1.4 christos
2159 1.4 christos /* Reference to literal section. */
2160 1.4 christos HOWTO (R_MICROMIPS_LITERAL, /* type */
2161 1.4 christos 0, /* rightshift */
2162 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2163 1.4 christos 16, /* bitsize */
2164 1.4 christos FALSE, /* pc_relative */
2165 1.4 christos 0, /* bitpos */
2166 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2167 1.4 christos _bfd_mips_elf32_gprel16_reloc, /* special_function */
2168 1.4 christos "R_MICROMIPS_LITERAL", /* name */
2169 1.4 christos TRUE, /* partial_inplace */
2170 1.4 christos 0x0000ffff, /* src_mask */
2171 1.4 christos 0x0000ffff, /* dst_mask */
2172 1.4 christos FALSE), /* pcrel_offset */
2173 1.4 christos
2174 1.4 christos /* Reference to global offset table. */
2175 1.4 christos HOWTO (R_MICROMIPS_GOT16, /* type */
2176 1.4 christos 0, /* rightshift */
2177 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2178 1.4 christos 16, /* bitsize */
2179 1.4 christos FALSE, /* pc_relative */
2180 1.4 christos 0, /* bitpos */
2181 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2182 1.4 christos _bfd_mips_elf_got16_reloc, /* special_function */
2183 1.4 christos "R_MICROMIPS_GOT16", /* name */
2184 1.4 christos TRUE, /* partial_inplace */
2185 1.4 christos 0x0000ffff, /* src_mask */
2186 1.4 christos 0x0000ffff, /* dst_mask */
2187 1.4 christos FALSE), /* pcrel_offset */
2188 1.4 christos
2189 1.4 christos /* This is for microMIPS branches. */
2190 1.4 christos HOWTO (R_MICROMIPS_PC7_S1, /* type */
2191 1.4 christos 1, /* rightshift */
2192 1.4 christos 1, /* size (0 = byte, 1 = short, 2 = long) */
2193 1.4 christos 7, /* bitsize */
2194 1.4 christos TRUE, /* pc_relative */
2195 1.4 christos 0, /* bitpos */
2196 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2197 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2198 1.4 christos "R_MICROMIPS_PC7_S1", /* name */
2199 1.4 christos TRUE, /* partial_inplace */
2200 1.4 christos 0x0000007f, /* src_mask */
2201 1.4 christos 0x0000007f, /* dst_mask */
2202 1.4 christos TRUE), /* pcrel_offset */
2203 1.4 christos
2204 1.4 christos HOWTO (R_MICROMIPS_PC10_S1, /* type */
2205 1.4 christos 1, /* rightshift */
2206 1.4 christos 1, /* size (0 = byte, 1 = short, 2 = long) */
2207 1.4 christos 10, /* bitsize */
2208 1.4 christos TRUE, /* pc_relative */
2209 1.4 christos 0, /* bitpos */
2210 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2211 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2212 1.4 christos "R_MICROMIPS_PC10_S1", /* name */
2213 1.4 christos TRUE, /* partial_inplace */
2214 1.4 christos 0x000003ff, /* src_mask */
2215 1.4 christos 0x000003ff, /* dst_mask */
2216 1.4 christos TRUE), /* pcrel_offset */
2217 1.4 christos
2218 1.4 christos HOWTO (R_MICROMIPS_PC16_S1, /* type */
2219 1.4 christos 1, /* rightshift */
2220 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2221 1.4 christos 16, /* bitsize */
2222 1.4 christos TRUE, /* pc_relative */
2223 1.4 christos 0, /* bitpos */
2224 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2225 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2226 1.4 christos "R_MICROMIPS_PC16_S1", /* name */
2227 1.4 christos TRUE, /* partial_inplace */
2228 1.4 christos 0x0000ffff, /* src_mask */
2229 1.4 christos 0x0000ffff, /* dst_mask */
2230 1.4 christos TRUE), /* pcrel_offset */
2231 1.4 christos
2232 1.4 christos /* 16 bit call through global offset table. */
2233 1.4 christos HOWTO (R_MICROMIPS_CALL16, /* type */
2234 1.4 christos 0, /* rightshift */
2235 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2236 1.4 christos 16, /* bitsize */
2237 1.4 christos FALSE, /* pc_relative */
2238 1.4 christos 0, /* bitpos */
2239 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2240 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2241 1.4 christos "R_MICROMIPS_CALL16", /* name */
2242 1.4 christos TRUE, /* partial_inplace */
2243 1.4 christos 0x0000ffff, /* src_mask */
2244 1.4 christos 0x0000ffff, /* dst_mask */
2245 1.4 christos FALSE), /* pcrel_offset */
2246 1.4 christos
2247 1.4 christos EMPTY_HOWTO (143),
2248 1.4 christos EMPTY_HOWTO (144),
2249 1.4 christos
2250 1.4 christos /* Displacement in the global offset table. */
2251 1.4 christos HOWTO (R_MICROMIPS_GOT_DISP, /* type */
2252 1.4 christos 0, /* rightshift */
2253 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2254 1.4 christos 16, /* bitsize */
2255 1.4 christos FALSE, /* pc_relative */
2256 1.4 christos 0, /* bitpos */
2257 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2258 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2259 1.4 christos "R_MICROMIPS_GOT_DISP",/* name */
2260 1.4 christos TRUE, /* partial_inplace */
2261 1.4 christos 0x0000ffff, /* src_mask */
2262 1.4 christos 0x0000ffff, /* dst_mask */
2263 1.4 christos FALSE), /* pcrel_offset */
2264 1.4 christos
2265 1.4 christos /* Displacement to page pointer in the global offset table. */
2266 1.4 christos HOWTO (R_MICROMIPS_GOT_PAGE, /* type */
2267 1.4 christos 0, /* rightshift */
2268 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2269 1.4 christos 16, /* bitsize */
2270 1.4 christos FALSE, /* pc_relative */
2271 1.4 christos 0, /* bitpos */
2272 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2273 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2274 1.4 christos "R_MICROMIPS_GOT_PAGE",/* name */
2275 1.4 christos TRUE, /* partial_inplace */
2276 1.4 christos 0x0000ffff, /* src_mask */
2277 1.4 christos 0x0000ffff, /* dst_mask */
2278 1.4 christos FALSE), /* pcrel_offset */
2279 1.4 christos
2280 1.4 christos /* Offset from page pointer in the global offset table. */
2281 1.4 christos HOWTO (R_MICROMIPS_GOT_OFST, /* type */
2282 1.4 christos 0, /* rightshift */
2283 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2284 1.4 christos 16, /* bitsize */
2285 1.4 christos FALSE, /* pc_relative */
2286 1.4 christos 0, /* bitpos */
2287 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2288 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2289 1.4 christos "R_MICROMIPS_GOT_OFST",/* name */
2290 1.4 christos TRUE, /* partial_inplace */
2291 1.4 christos 0x0000ffff, /* src_mask */
2292 1.4 christos 0x0000ffff, /* dst_mask */
2293 1.4 christos FALSE), /* pcrel_offset */
2294 1.4 christos
2295 1.4 christos /* High 16 bits of displacement in global offset table. */
2296 1.4 christos HOWTO (R_MICROMIPS_GOT_HI16, /* type */
2297 1.4 christos 0, /* rightshift */
2298 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2299 1.4 christos 16, /* bitsize */
2300 1.4 christos FALSE, /* pc_relative */
2301 1.4 christos 0, /* bitpos */
2302 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2303 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2304 1.4 christos "R_MICROMIPS_GOT_HI16",/* name */
2305 1.4 christos TRUE, /* partial_inplace */
2306 1.4 christos 0x0000ffff, /* src_mask */
2307 1.4 christos 0x0000ffff, /* dst_mask */
2308 1.4 christos FALSE), /* pcrel_offset */
2309 1.4 christos
2310 1.4 christos /* Low 16 bits of displacement in global offset table. */
2311 1.4 christos HOWTO (R_MICROMIPS_GOT_LO16, /* type */
2312 1.4 christos 0, /* rightshift */
2313 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2314 1.4 christos 16, /* bitsize */
2315 1.4 christos FALSE, /* pc_relative */
2316 1.4 christos 0, /* bitpos */
2317 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2318 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2319 1.4 christos "R_MICROMIPS_GOT_LO16",/* name */
2320 1.4 christos TRUE, /* partial_inplace */
2321 1.4 christos 0x0000ffff, /* src_mask */
2322 1.4 christos 0x0000ffff, /* dst_mask */
2323 1.4 christos FALSE), /* pcrel_offset */
2324 1.4 christos
2325 1.4 christos /* 64 bit subtraction. Used in the N32 ABI. */
2326 1.4 christos HOWTO (R_MICROMIPS_SUB, /* type */
2327 1.4 christos 0, /* rightshift */
2328 1.4 christos 4, /* size (0 = byte, 1 = short, 2 = long) */
2329 1.4 christos 64, /* bitsize */
2330 1.4 christos FALSE, /* pc_relative */
2331 1.4 christos 0, /* bitpos */
2332 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2333 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2334 1.4 christos "R_MICROMIPS_SUB", /* name */
2335 1.4 christos TRUE, /* partial_inplace */
2336 1.4 christos MINUS_ONE, /* src_mask */
2337 1.4 christos MINUS_ONE, /* dst_mask */
2338 1.4 christos FALSE), /* pcrel_offset */
2339 1.4 christos
2340 1.4 christos /* We don't support these for REL relocations, because it means building
2341 1.4 christos the addend from a R_MICROMIPS_HIGHEST/R_MICROMIPS_HIGHER/
2342 1.4 christos R_MICROMIPS_HI16/R_MICROMIPS_LO16 sequence with varying ordering,
2343 1.4 christos using fallable heuristics. */
2344 1.4 christos EMPTY_HOWTO (R_MICROMIPS_HIGHER),
2345 1.4 christos EMPTY_HOWTO (R_MICROMIPS_HIGHEST),
2346 1.4 christos
2347 1.4 christos /* High 16 bits of displacement in global offset table. */
2348 1.4 christos HOWTO (R_MICROMIPS_CALL_HI16, /* type */
2349 1.4 christos 0, /* rightshift */
2350 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2351 1.4 christos 16, /* bitsize */
2352 1.4 christos FALSE, /* pc_relative */
2353 1.4 christos 0, /* bitpos */
2354 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2355 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2356 1.4 christos "R_MICROMIPS_CALL_HI16",/* name */
2357 1.4 christos TRUE, /* partial_inplace */
2358 1.4 christos 0x0000ffff, /* src_mask */
2359 1.4 christos 0x0000ffff, /* dst_mask */
2360 1.4 christos FALSE), /* pcrel_offset */
2361 1.4 christos
2362 1.4 christos /* Low 16 bits of displacement in global offset table. */
2363 1.4 christos HOWTO (R_MICROMIPS_CALL_LO16, /* type */
2364 1.4 christos 0, /* rightshift */
2365 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2366 1.4 christos 16, /* bitsize */
2367 1.4 christos FALSE, /* pc_relative */
2368 1.4 christos 0, /* bitpos */
2369 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2370 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2371 1.4 christos "R_MICROMIPS_CALL_LO16",/* name */
2372 1.4 christos TRUE, /* partial_inplace */
2373 1.4 christos 0x0000ffff, /* src_mask */
2374 1.4 christos 0x0000ffff, /* dst_mask */
2375 1.6 christos FALSE), /* pcrel_offset */
2376 1.6 christos
2377 1.6 christos /* Section displacement. */
2378 1.6 christos HOWTO (R_MICROMIPS_SCN_DISP, /* type */
2379 1.6 christos 0, /* rightshift */
2380 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2381 1.6 christos 32, /* bitsize */
2382 1.6 christos FALSE, /* pc_relative */
2383 1.6 christos 0, /* bitpos */
2384 1.6 christos complain_overflow_dont, /* complain_on_overflow */
2385 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
2386 1.6 christos "R_MICROMIPS_SCN_DISP", /* name */
2387 1.6 christos TRUE, /* partial_inplace */
2388 1.6 christos 0xffffffff, /* src_mask */
2389 1.6 christos 0xffffffff, /* dst_mask */
2390 1.6 christos FALSE), /* pcrel_offset */
2391 1.6 christos
2392 1.6 christos /* Protected jump conversion. This is an optimization hint. No
2393 1.6 christos relocation is required for correctness. */
2394 1.6 christos HOWTO (R_MICROMIPS_JALR, /* type */
2395 1.6 christos 0, /* rightshift */
2396 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2397 1.6 christos 32, /* bitsize */
2398 1.6 christos FALSE, /* pc_relative */
2399 1.6 christos 0, /* bitpos */
2400 1.6 christos complain_overflow_dont, /* complain_on_overflow */
2401 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
2402 1.6 christos "R_MICROMIPS_JALR", /* name */
2403 1.6 christos FALSE, /* partial_inplace */
2404 1.6 christos 0, /* src_mask */
2405 1.6 christos 0x00000000, /* dst_mask */
2406 1.4 christos FALSE), /* pcrel_offset */
2407 1.4 christos };
2408 1.4 christos
2409 1.4 christos static reloc_howto_type micromips_elf64_howto_table_rela[] =
2410 1.4 christos {
2411 1.4 christos EMPTY_HOWTO (130),
2412 1.4 christos EMPTY_HOWTO (131),
2413 1.4 christos EMPTY_HOWTO (132),
2414 1.4 christos
2415 1.4 christos /* 26 bit jump address. */
2416 1.4 christos HOWTO (R_MICROMIPS_26_S1, /* type */
2417 1.4 christos 1, /* rightshift */
2418 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2419 1.4 christos 26, /* bitsize */
2420 1.4 christos FALSE, /* pc_relative */
2421 1.4 christos 0, /* bitpos */
2422 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2423 1.4 christos /* This needs complex overflow
2424 1.4 christos detection, because the upper four
2425 1.4 christos bits must match the PC. */
2426 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2427 1.4 christos "R_MICROMIPS_26_S1", /* name */
2428 1.4 christos FALSE, /* partial_inplace */
2429 1.4 christos 0, /* src_mask */
2430 1.4 christos 0x3ffffff, /* dst_mask */
2431 1.4 christos FALSE), /* pcrel_offset */
2432 1.4 christos
2433 1.4 christos /* High 16 bits of symbol value. */
2434 1.4 christos HOWTO (R_MICROMIPS_HI16, /* type */
2435 1.1 skrll 16, /* rightshift */
2436 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2437 1.1 skrll 16, /* bitsize */
2438 1.1 skrll FALSE, /* pc_relative */
2439 1.4 christos 0, /* bitpos */
2440 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2441 1.4 christos _bfd_mips_elf_hi16_reloc, /* special_function */
2442 1.3 christos "R_MICROMIPS_HI16", /* name */
2443 1.4 christos FALSE, /* partial_inplace */
2444 1.1 skrll 0, /* src_mask */
2445 1.1 skrll 0x0000ffff, /* dst_mask */
2446 1.1 skrll FALSE), /* pcrel_offset */
2447 1.4 christos
2448 1.4 christos /* Low 16 bits of symbol value. */
2449 1.1 skrll HOWTO (R_MICROMIPS_LO16, /* type */
2450 1.1 skrll 0, /* rightshift */
2451 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2452 1.1 skrll 16, /* bitsize */
2453 1.1 skrll FALSE, /* pc_relative */
2454 1.4 christos 0, /* bitpos */
2455 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2456 1.4 christos _bfd_mips_elf_lo16_reloc, /* special_function */
2457 1.3 christos "R_MICROMIPS_LO16", /* name */
2458 1.4 christos FALSE, /* partial_inplace */
2459 1.1 skrll 0, /* src_mask */
2460 1.1 skrll 0x0000ffff, /* dst_mask */
2461 1.1 skrll FALSE), /* pcrel_offset */
2462 1.4 christos
2463 1.4 christos /* GP relative reference. */
2464 1.1 skrll HOWTO (R_MICROMIPS_GPREL16, /* type */
2465 1.1 skrll 0, /* rightshift */
2466 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2467 1.1 skrll 16, /* bitsize */
2468 1.1 skrll FALSE, /* pc_relative */
2469 1.1 skrll 0, /* bitpos */
2470 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2471 1.4 christos _bfd_mips_elf32_gprel16_reloc, /* special_function */
2472 1.3 christos "R_MICROMIPS_GPREL16", /* name */
2473 1.4 christos FALSE, /* partial_inplace */
2474 1.1 skrll 0, /* src_mask */
2475 1.1 skrll 0x0000ffff, /* dst_mask */
2476 1.1 skrll FALSE), /* pcrel_offset */
2477 1.4 christos
2478 1.4 christos /* Reference to literal section. */
2479 1.1 skrll HOWTO (R_MICROMIPS_LITERAL, /* type */
2480 1.1 skrll 0, /* rightshift */
2481 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2482 1.1 skrll 16, /* bitsize */
2483 1.1 skrll FALSE, /* pc_relative */
2484 1.1 skrll 0, /* bitpos */
2485 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2486 1.4 christos _bfd_mips_elf32_gprel16_reloc, /* special_function */
2487 1.3 christos "R_MICROMIPS_LITERAL", /* name */
2488 1.4 christos FALSE, /* partial_inplace */
2489 1.1 skrll 0, /* src_mask */
2490 1.1 skrll 0x0000ffff, /* dst_mask */
2491 1.1 skrll FALSE), /* pcrel_offset */
2492 1.4 christos
2493 1.4 christos /* Reference to global offset table. */
2494 1.1 skrll HOWTO (R_MICROMIPS_GOT16, /* type */
2495 1.1 skrll 0, /* rightshift */
2496 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2497 1.1 skrll 16, /* bitsize */
2498 1.1 skrll FALSE, /* pc_relative */
2499 1.1 skrll 0, /* bitpos */
2500 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2501 1.4 christos _bfd_mips_elf_got16_reloc, /* special_function */
2502 1.3 christos "R_MICROMIPS_GOT16", /* name */
2503 1.4 christos FALSE, /* partial_inplace */
2504 1.1 skrll 0, /* src_mask */
2505 1.1 skrll 0x0000ffff, /* dst_mask */
2506 1.1 skrll FALSE), /* pcrel_offset */
2507 1.4 christos
2508 1.4 christos /* This is for microMIPS branches. */
2509 1.4 christos HOWTO (R_MICROMIPS_PC7_S1, /* type */
2510 1.4 christos 1, /* rightshift */
2511 1.4 christos 1, /* size (0 = byte, 1 = short, 2 = long) */
2512 1.4 christos 7, /* bitsize */
2513 1.4 christos TRUE, /* pc_relative */
2514 1.4 christos 0, /* bitpos */
2515 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2516 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2517 1.4 christos "R_MICROMIPS_PC7_S1", /* name */
2518 1.4 christos FALSE, /* partial_inplace */
2519 1.4 christos 0, /* src_mask */
2520 1.4 christos 0x0000007f, /* dst_mask */
2521 1.3 christos TRUE), /* pcrel_offset */
2522 1.4 christos
2523 1.4 christos HOWTO (R_MICROMIPS_PC10_S1, /* type */
2524 1.4 christos 1, /* rightshift */
2525 1.4 christos 1, /* size (0 = byte, 1 = short, 2 = long) */
2526 1.4 christos 10, /* bitsize */
2527 1.3 christos TRUE, /* pc_relative */
2528 1.4 christos 0, /* bitpos */
2529 1.3 christos complain_overflow_signed, /* complain_on_overflow */
2530 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2531 1.3 christos "R_MICROMIPS_PC10_S1", /* name */
2532 1.4 christos FALSE, /* partial_inplace */
2533 1.4 christos 0, /* src_mask */
2534 1.4 christos 0x000003ff, /* dst_mask */
2535 1.1 skrll TRUE), /* pcrel_offset */
2536 1.4 christos
2537 1.4 christos HOWTO (R_MICROMIPS_PC16_S1, /* type */
2538 1.1 skrll 1, /* rightshift */
2539 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2540 1.4 christos 16, /* bitsize */
2541 1.1 skrll TRUE, /* pc_relative */
2542 1.1 skrll 0, /* bitpos */
2543 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
2544 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2545 1.3 christos "R_MICROMIPS_PC16_S1", /* name */
2546 1.4 christos FALSE, /* partial_inplace */
2547 1.1 skrll 0, /* src_mask */
2548 1.4 christos 0x0000ffff, /* dst_mask */
2549 1.1 skrll TRUE), /* pcrel_offset */
2550 1.4 christos
2551 1.4 christos /* 16 bit call through global offset table. */
2552 1.1 skrll HOWTO (R_MICROMIPS_CALL16, /* type */
2553 1.1 skrll 0, /* rightshift */
2554 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2555 1.1 skrll 16, /* bitsize */
2556 1.1 skrll FALSE, /* pc_relative */
2557 1.1 skrll 0, /* bitpos */
2558 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
2559 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2560 1.3 christos "R_MICROMIPS_CALL16", /* name */
2561 1.4 christos FALSE, /* partial_inplace */
2562 1.1 skrll 0, /* src_mask */
2563 1.1 skrll 0x0000ffff, /* dst_mask */
2564 1.1 skrll FALSE), /* pcrel_offset */
2565 1.4 christos
2566 1.4 christos EMPTY_HOWTO (143),
2567 1.4 christos EMPTY_HOWTO (144),
2568 1.4 christos
2569 1.4 christos /* Displacement in the global offset table. */
2570 1.1 skrll HOWTO (R_MICROMIPS_GOT_DISP, /* type */
2571 1.1 skrll 0, /* rightshift */
2572 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2573 1.1 skrll 16, /* bitsize */
2574 1.1 skrll FALSE, /* pc_relative */
2575 1.4 christos 0, /* bitpos */
2576 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
2577 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2578 1.1 skrll "R_MICROMIPS_GOT_DISP",/* name */
2579 1.4 christos FALSE, /* partial_inplace */
2580 1.4 christos 0, /* src_mask */
2581 1.1 skrll 0x0000ffff, /* dst_mask */
2582 1.1 skrll FALSE), /* pcrel_offset */
2583 1.4 christos
2584 1.4 christos /* Displacement to page pointer in the global offset table. */
2585 1.1 skrll HOWTO (R_MICROMIPS_GOT_PAGE, /* type */
2586 1.1 skrll 0, /* rightshift */
2587 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2588 1.1 skrll 16, /* bitsize */
2589 1.1 skrll FALSE, /* pc_relative */
2590 1.1 skrll 0, /* bitpos */
2591 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2592 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2593 1.4 christos "R_MICROMIPS_GOT_PAGE",/* name */
2594 1.4 christos FALSE, /* partial_inplace */
2595 1.4 christos 0, /* src_mask */
2596 1.1 skrll 0x0000ffff, /* dst_mask */
2597 1.1 skrll FALSE), /* pcrel_offset */
2598 1.4 christos
2599 1.4 christos /* Offset from page pointer in the global offset table. */
2600 1.1 skrll HOWTO (R_MICROMIPS_GOT_OFST, /* type */
2601 1.1 skrll 0, /* rightshift */
2602 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2603 1.1 skrll 16, /* bitsize */
2604 1.1 skrll FALSE, /* pc_relative */
2605 1.4 christos 0, /* bitpos */
2606 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2607 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2608 1.4 christos "R_MICROMIPS_GOT_OFST",/* name */
2609 1.4 christos FALSE, /* partial_inplace */
2610 1.4 christos 0, /* src_mask */
2611 1.1 skrll 0x0000ffff, /* dst_mask */
2612 1.1 skrll FALSE), /* pcrel_offset */
2613 1.4 christos
2614 1.4 christos /* High 16 bits of displacement in global offset table. */
2615 1.1 skrll HOWTO (R_MICROMIPS_GOT_HI16, /* type */
2616 1.1 skrll 0, /* rightshift */
2617 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2618 1.1 skrll 16, /* bitsize */
2619 1.1 skrll FALSE, /* pc_relative */
2620 1.1 skrll 0, /* bitpos */
2621 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
2622 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2623 1.4 christos "R_MICROMIPS_GOT_HI16",/* name */
2624 1.4 christos FALSE, /* partial_inplace */
2625 1.1 skrll 0, /* src_mask */
2626 1.1 skrll 0x0000ffff, /* dst_mask */
2627 1.1 skrll FALSE), /* pcrel_offset */
2628 1.4 christos
2629 1.4 christos /* Low 16 bits of displacement in global offset table. */
2630 1.1 skrll HOWTO (R_MICROMIPS_GOT_LO16, /* type */
2631 1.1 skrll 0, /* rightshift */
2632 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2633 1.1 skrll 16, /* bitsize */
2634 1.1 skrll FALSE, /* pc_relative */
2635 1.1 skrll 0, /* bitpos */
2636 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2637 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2638 1.4 christos "R_MICROMIPS_GOT_LO16",/* name */
2639 1.4 christos FALSE, /* partial_inplace */
2640 1.1 skrll 0, /* src_mask */
2641 1.1 skrll 0x0000ffff, /* dst_mask */
2642 1.1 skrll FALSE), /* pcrel_offset */
2643 1.4 christos
2644 1.4 christos /* 64 bit subtraction. Used in the N32 ABI. */
2645 1.4 christos HOWTO (R_MICROMIPS_SUB, /* type */
2646 1.4 christos 0, /* rightshift */
2647 1.4 christos 4, /* size (0 = byte, 1 = short, 2 = long) */
2648 1.1 skrll 64, /* bitsize */
2649 1.1 skrll FALSE, /* pc_relative */
2650 1.1 skrll 0, /* bitpos */
2651 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
2652 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2653 1.1 skrll "R_MICROMIPS_SUB", /* name */
2654 1.4 christos FALSE, /* partial_inplace */
2655 1.4 christos 0, /* src_mask */
2656 1.1 skrll MINUS_ONE, /* dst_mask */
2657 1.1 skrll FALSE), /* pcrel_offset */
2658 1.4 christos
2659 1.4 christos /* Get the higher value of a 64 bit addend. */
2660 1.1 skrll HOWTO (R_MICROMIPS_HIGHER, /* type */
2661 1.1 skrll 0, /* rightshift */
2662 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2663 1.1 skrll 16, /* bitsize */
2664 1.1 skrll FALSE, /* pc_relative */
2665 1.4 christos 0, /* bitpos */
2666 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2667 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2668 1.1 skrll "R_MICROMIPS_HIGHER", /* name */
2669 1.4 christos FALSE, /* partial_inplace */
2670 1.4 christos 0, /* src_mask */
2671 1.1 skrll 0x0000ffff, /* dst_mask */
2672 1.1 skrll FALSE), /* pcrel_offset */
2673 1.4 christos
2674 1.4 christos /* Get the highest value of a 64 bit addend. */
2675 1.1 skrll HOWTO (R_MICROMIPS_HIGHEST, /* type */
2676 1.1 skrll 0, /* rightshift */
2677 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2678 1.1 skrll 16, /* bitsize */
2679 1.1 skrll FALSE, /* pc_relative */
2680 1.1 skrll 0, /* bitpos */
2681 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2682 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2683 1.1 skrll "R_MICROMIPS_HIGHEST", /* name */
2684 1.4 christos FALSE, /* partial_inplace */
2685 1.4 christos 0, /* src_mask */
2686 1.1 skrll 0x0000ffff, /* dst_mask */
2687 1.1 skrll FALSE), /* pcrel_offset */
2688 1.4 christos
2689 1.4 christos /* High 16 bits of displacement in global offset table. */
2690 1.1 skrll HOWTO (R_MICROMIPS_CALL_HI16, /* type */
2691 1.1 skrll 0, /* rightshift */
2692 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2693 1.1 skrll 16, /* bitsize */
2694 1.1 skrll FALSE, /* pc_relative */
2695 1.1 skrll 0, /* bitpos */
2696 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
2697 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2698 1.1 skrll "R_MICROMIPS_CALL_HI16",/* name */
2699 1.4 christos FALSE, /* partial_inplace */
2700 1.1 skrll 0, /* src_mask */
2701 1.1 skrll 0x0000ffff, /* dst_mask */
2702 1.1 skrll FALSE), /* pcrel_offset */
2703 1.4 christos
2704 1.4 christos /* Low 16 bits of displacement in global offset table. */
2705 1.1 skrll HOWTO (R_MICROMIPS_CALL_LO16, /* type */
2706 1.1 skrll 0, /* rightshift */
2707 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2708 1.1 skrll 16, /* bitsize */
2709 1.1 skrll FALSE, /* pc_relative */
2710 1.1 skrll 0, /* bitpos */
2711 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2712 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2713 1.1 skrll "R_MICROMIPS_CALL_LO16",/* name */
2714 1.4 christos FALSE, /* partial_inplace */
2715 1.1 skrll 0, /* src_mask */
2716 1.1 skrll 0x0000ffff, /* dst_mask */
2717 1.6 christos FALSE), /* pcrel_offset */
2718 1.6 christos
2719 1.6 christos /* Section displacement. */
2720 1.6 christos HOWTO (R_MICROMIPS_SCN_DISP, /* type */
2721 1.6 christos 0, /* rightshift */
2722 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2723 1.6 christos 32, /* bitsize */
2724 1.6 christos FALSE, /* pc_relative */
2725 1.6 christos 0, /* bitpos */
2726 1.6 christos complain_overflow_dont, /* complain_on_overflow */
2727 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
2728 1.6 christos "R_MICROMIPS_SCN_DISP", /* name */
2729 1.6 christos FALSE, /* partial_inplace */
2730 1.6 christos 0, /* src_mask */
2731 1.6 christos 0xffffffff, /* dst_mask */
2732 1.6 christos FALSE), /* pcrel_offset */
2733 1.6 christos
2734 1.6 christos /* Protected jump conversion. This is an optimization hint. No
2735 1.6 christos relocation is required for correctness. */
2736 1.6 christos HOWTO (R_MICROMIPS_JALR, /* type */
2737 1.6 christos 0, /* rightshift */
2738 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2739 1.6 christos 32, /* bitsize */
2740 1.6 christos FALSE, /* pc_relative */
2741 1.6 christos 0, /* bitpos */
2742 1.6 christos complain_overflow_dont, /* complain_on_overflow */
2743 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
2744 1.6 christos "R_MICROMIPS_JALR", /* name */
2745 1.6 christos FALSE, /* partial_inplace */
2746 1.6 christos 0, /* src_mask */
2747 1.6 christos 0x00000000, /* dst_mask */
2748 1.1 skrll FALSE), /* pcrel_offset */
2749 1.1 skrll };
2750 1.1 skrll
2751 1.1 skrll /* GNU extension to record C++ vtable hierarchy */
2752 1.1 skrll static reloc_howto_type elf_mips_gnu_vtinherit_howto =
2753 1.1 skrll HOWTO (R_MIPS_GNU_VTINHERIT, /* type */
2754 1.1 skrll 0, /* rightshift */
2755 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2756 1.1 skrll 0, /* bitsize */
2757 1.1 skrll FALSE, /* pc_relative */
2758 1.1 skrll 0, /* bitpos */
2759 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
2760 1.1 skrll NULL, /* special_function */
2761 1.1 skrll "R_MIPS_GNU_VTINHERIT", /* name */
2762 1.1 skrll FALSE, /* partial_inplace */
2763 1.1 skrll 0, /* src_mask */
2764 1.1 skrll 0, /* dst_mask */
2765 1.1 skrll FALSE); /* pcrel_offset */
2766 1.1 skrll
2767 1.1 skrll /* GNU extension to record C++ vtable member usage */
2768 1.1 skrll static reloc_howto_type elf_mips_gnu_vtentry_howto =
2769 1.1 skrll HOWTO (R_MIPS_GNU_VTENTRY, /* type */
2770 1.1 skrll 0, /* rightshift */
2771 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2772 1.1 skrll 0, /* bitsize */
2773 1.1 skrll FALSE, /* pc_relative */
2774 1.1 skrll 0, /* bitpos */
2775 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
2776 1.1 skrll _bfd_elf_rel_vtable_reloc_fn, /* special_function */
2777 1.1 skrll "R_MIPS_GNU_VTENTRY", /* name */
2778 1.1 skrll FALSE, /* partial_inplace */
2779 1.1 skrll 0, /* src_mask */
2780 1.1 skrll 0, /* dst_mask */
2781 1.1 skrll FALSE); /* pcrel_offset */
2782 1.1 skrll
2783 1.1 skrll /* 16 bit offset for pc-relative branches. */
2785 1.1 skrll static reloc_howto_type elf_mips_gnu_rel16_s2 =
2786 1.1 skrll HOWTO (R_MIPS_GNU_REL16_S2, /* type */
2787 1.1 skrll 2, /* rightshift */
2788 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2789 1.1 skrll 16, /* bitsize */
2790 1.1 skrll TRUE, /* pc_relative */
2791 1.1 skrll 0, /* bitpos */
2792 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
2793 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
2794 1.1 skrll "R_MIPS_GNU_REL16_S2", /* name */
2795 1.1 skrll TRUE, /* partial_inplace */
2796 1.1 skrll 0x0000ffff, /* src_mask */
2797 1.1 skrll 0x0000ffff, /* dst_mask */
2798 1.1 skrll TRUE); /* pcrel_offset */
2799 1.1 skrll
2800 1.1 skrll /* 16 bit offset for pc-relative branches. */
2801 1.1 skrll static reloc_howto_type elf_mips_gnu_rela16_s2 =
2802 1.1 skrll HOWTO (R_MIPS_GNU_REL16_S2, /* type */
2803 1.1 skrll 2, /* rightshift */
2804 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2805 1.1 skrll 16, /* bitsize */
2806 1.1 skrll TRUE, /* pc_relative */
2807 1.1 skrll 0, /* bitpos */
2808 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
2809 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
2810 1.1 skrll "R_MIPS_GNU_REL16_S2", /* name */
2811 1.1 skrll FALSE, /* partial_inplace */
2812 1.1 skrll 0, /* src_mask */
2813 1.6 christos 0x0000ffff, /* dst_mask */
2814 1.6 christos TRUE); /* pcrel_offset */
2815 1.6 christos
2816 1.6 christos /* 32 bit pc-relative. Used for compact EH tables. */
2817 1.6 christos static reloc_howto_type elf_mips_gnu_pcrel32 =
2818 1.6 christos HOWTO (R_MIPS_PC32, /* type */
2819 1.6 christos 0, /* rightshift */
2820 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2821 1.6 christos 32, /* bitsize */
2822 1.6 christos TRUE, /* pc_relative */
2823 1.6 christos 0, /* bitpos */
2824 1.6 christos complain_overflow_signed, /* complain_on_overflow */
2825 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
2826 1.6 christos "R_MIPS_PC32", /* name */
2827 1.6 christos TRUE, /* partial_inplace */
2828 1.6 christos 0xffffffff, /* src_mask */
2829 1.6 christos 0xffffffff, /* dst_mask */
2830 1.1 skrll TRUE); /* pcrel_offset */
2831 1.1 skrll
2832 1.1 skrll
2833 1.1 skrll /* Originally a VxWorks extension, but now used for other systems too. */
2835 1.1 skrll static reloc_howto_type elf_mips_copy_howto =
2836 1.1 skrll HOWTO (R_MIPS_COPY, /* type */
2837 1.1 skrll 0, /* rightshift */
2838 1.1 skrll 0, /* this one is variable size */
2839 1.1 skrll 0, /* bitsize */
2840 1.6 christos FALSE, /* pc_relative */
2841 1.1 skrll 0, /* bitpos */
2842 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
2843 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
2844 1.1 skrll "R_MIPS_COPY", /* name */
2845 1.1 skrll FALSE, /* partial_inplace */
2846 1.1 skrll 0x0, /* src_mask */
2847 1.1 skrll 0x0, /* dst_mask */
2848 1.1 skrll FALSE); /* pcrel_offset */
2849 1.1 skrll
2850 1.1 skrll /* Originally a VxWorks extension, but now used for other systems too. */
2851 1.1 skrll static reloc_howto_type elf_mips_jump_slot_howto =
2852 1.1 skrll HOWTO (R_MIPS_JUMP_SLOT, /* type */
2853 1.1 skrll 0, /* rightshift */
2854 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
2855 1.1 skrll 64, /* bitsize */
2856 1.6 christos FALSE, /* pc_relative */
2857 1.1 skrll 0, /* bitpos */
2858 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
2859 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
2860 1.1 skrll "R_MIPS_JUMP_SLOT", /* name */
2861 1.1 skrll FALSE, /* partial_inplace */
2862 1.6 christos 0x0, /* src_mask */
2863 1.6 christos 0x0, /* dst_mask */
2864 1.6 christos FALSE); /* pcrel_offset */
2865 1.6 christos
2866 1.6 christos /* Used in EH tables. */
2867 1.6 christos static reloc_howto_type elf_mips_eh_howto =
2868 1.6 christos HOWTO (R_MIPS_EH, /* type */
2869 1.6 christos 0, /* rightshift */
2870 1.6 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2871 1.6 christos 32, /* bitsize */
2872 1.6 christos FALSE, /* pc_relative */
2873 1.6 christos 0, /* bitpos */
2874 1.6 christos complain_overflow_signed, /* complain_on_overflow */
2875 1.6 christos _bfd_mips_elf_generic_reloc, /* special_function */
2876 1.6 christos "R_MIPS_EH", /* name */
2877 1.6 christos TRUE, /* partial_inplace */
2878 1.6 christos 0xffffffff, /* src_mask */
2879 1.1 skrll 0xffffffff, /* dst_mask */
2880 1.1 skrll FALSE); /* pcrel_offset */
2881 1.1 skrll
2882 1.1 skrll
2883 1.1 skrll /* Swap in a MIPS 64-bit Rel reloc. */
2885 1.1 skrll
2886 1.1 skrll static void
2887 1.1 skrll mips_elf64_swap_reloc_in (bfd *abfd, const Elf64_Mips_External_Rel *src,
2888 1.1 skrll Elf64_Mips_Internal_Rela *dst)
2889 1.1 skrll {
2890 1.1 skrll dst->r_offset = H_GET_64 (abfd, src->r_offset);
2891 1.1 skrll dst->r_sym = H_GET_32 (abfd, src->r_sym);
2892 1.1 skrll dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
2893 1.1 skrll dst->r_type3 = H_GET_8 (abfd, src->r_type3);
2894 1.1 skrll dst->r_type2 = H_GET_8 (abfd, src->r_type2);
2895 1.1 skrll dst->r_type = H_GET_8 (abfd, src->r_type);
2896 1.1 skrll dst->r_addend = 0;
2897 1.1 skrll }
2898 1.1 skrll
2899 1.1 skrll /* Swap in a MIPS 64-bit Rela reloc. */
2900 1.1 skrll
2901 1.1 skrll static void
2902 1.1 skrll mips_elf64_swap_reloca_in (bfd *abfd, const Elf64_Mips_External_Rela *src,
2903 1.1 skrll Elf64_Mips_Internal_Rela *dst)
2904 1.1 skrll {
2905 1.1 skrll dst->r_offset = H_GET_64 (abfd, src->r_offset);
2906 1.1 skrll dst->r_sym = H_GET_32 (abfd, src->r_sym);
2907 1.1 skrll dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
2908 1.1 skrll dst->r_type3 = H_GET_8 (abfd, src->r_type3);
2909 1.1 skrll dst->r_type2 = H_GET_8 (abfd, src->r_type2);
2910 1.1 skrll dst->r_type = H_GET_8 (abfd, src->r_type);
2911 1.1 skrll dst->r_addend = H_GET_S64 (abfd, src->r_addend);
2912 1.1 skrll }
2913 1.1 skrll
2914 1.1 skrll /* Swap out a MIPS 64-bit Rel reloc. */
2915 1.1 skrll
2916 1.1 skrll static void
2917 1.1 skrll mips_elf64_swap_reloc_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
2918 1.1 skrll Elf64_Mips_External_Rel *dst)
2919 1.1 skrll {
2920 1.1 skrll H_PUT_64 (abfd, src->r_offset, dst->r_offset);
2921 1.1 skrll H_PUT_32 (abfd, src->r_sym, dst->r_sym);
2922 1.1 skrll H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
2923 1.1 skrll H_PUT_8 (abfd, src->r_type3, dst->r_type3);
2924 1.1 skrll H_PUT_8 (abfd, src->r_type2, dst->r_type2);
2925 1.1 skrll H_PUT_8 (abfd, src->r_type, dst->r_type);
2926 1.1 skrll }
2927 1.1 skrll
2928 1.1 skrll /* Swap out a MIPS 64-bit Rela reloc. */
2929 1.1 skrll
2930 1.1 skrll static void
2931 1.1 skrll mips_elf64_swap_reloca_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
2932 1.1 skrll Elf64_Mips_External_Rela *dst)
2933 1.1 skrll {
2934 1.1 skrll H_PUT_64 (abfd, src->r_offset, dst->r_offset);
2935 1.1 skrll H_PUT_32 (abfd, src->r_sym, dst->r_sym);
2936 1.1 skrll H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
2937 1.1 skrll H_PUT_8 (abfd, src->r_type3, dst->r_type3);
2938 1.1 skrll H_PUT_8 (abfd, src->r_type2, dst->r_type2);
2939 1.1 skrll H_PUT_8 (abfd, src->r_type, dst->r_type);
2940 1.1 skrll H_PUT_S64 (abfd, src->r_addend, dst->r_addend);
2941 1.1 skrll }
2942 1.1 skrll
2943 1.1 skrll /* Swap in a MIPS 64-bit Rel reloc. */
2944 1.1 skrll
2945 1.1 skrll static void
2946 1.1 skrll mips_elf64_be_swap_reloc_in (bfd *abfd, const bfd_byte *src,
2947 1.1 skrll Elf_Internal_Rela *dst)
2948 1.1 skrll {
2949 1.1 skrll Elf64_Mips_Internal_Rela mirel;
2950 1.1 skrll
2951 1.1 skrll mips_elf64_swap_reloc_in (abfd,
2952 1.1 skrll (const Elf64_Mips_External_Rel *) src,
2953 1.1 skrll &mirel);
2954 1.1 skrll
2955 1.1 skrll dst[0].r_offset = mirel.r_offset;
2956 1.1 skrll dst[0].r_info = ELF64_R_INFO (mirel.r_sym, mirel.r_type);
2957 1.1 skrll dst[0].r_addend = 0;
2958 1.1 skrll dst[1].r_offset = mirel.r_offset;
2959 1.1 skrll dst[1].r_info = ELF64_R_INFO (mirel.r_ssym, mirel.r_type2);
2960 1.1 skrll dst[1].r_addend = 0;
2961 1.1 skrll dst[2].r_offset = mirel.r_offset;
2962 1.1 skrll dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirel.r_type3);
2963 1.1 skrll dst[2].r_addend = 0;
2964 1.1 skrll }
2965 1.1 skrll
2966 1.1 skrll /* Swap in a MIPS 64-bit Rela reloc. */
2967 1.1 skrll
2968 1.1 skrll static void
2969 1.1 skrll mips_elf64_be_swap_reloca_in (bfd *abfd, const bfd_byte *src,
2970 1.1 skrll Elf_Internal_Rela *dst)
2971 1.1 skrll {
2972 1.1 skrll Elf64_Mips_Internal_Rela mirela;
2973 1.1 skrll
2974 1.1 skrll mips_elf64_swap_reloca_in (abfd,
2975 1.1 skrll (const Elf64_Mips_External_Rela *) src,
2976 1.1 skrll &mirela);
2977 1.1 skrll
2978 1.1 skrll dst[0].r_offset = mirela.r_offset;
2979 1.1 skrll dst[0].r_info = ELF64_R_INFO (mirela.r_sym, mirela.r_type);
2980 1.1 skrll dst[0].r_addend = mirela.r_addend;
2981 1.1 skrll dst[1].r_offset = mirela.r_offset;
2982 1.1 skrll dst[1].r_info = ELF64_R_INFO (mirela.r_ssym, mirela.r_type2);
2983 1.1 skrll dst[1].r_addend = 0;
2984 1.1 skrll dst[2].r_offset = mirela.r_offset;
2985 1.1 skrll dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirela.r_type3);
2986 1.1 skrll dst[2].r_addend = 0;
2987 1.1 skrll }
2988 1.1 skrll
2989 1.1 skrll /* Swap out a MIPS 64-bit Rel reloc. */
2990 1.1 skrll
2991 1.1 skrll static void
2992 1.1 skrll mips_elf64_be_swap_reloc_out (bfd *abfd, const Elf_Internal_Rela *src,
2993 1.1 skrll bfd_byte *dst)
2994 1.1 skrll {
2995 1.4 christos Elf64_Mips_Internal_Rela mirel;
2996 1.1 skrll
2997 1.1 skrll mirel.r_offset = src[0].r_offset;
2998 1.1 skrll BFD_ASSERT(src[0].r_offset == src[1].r_offset);
2999 1.1 skrll BFD_ASSERT(src[0].r_offset == src[2].r_offset);
3000 1.1 skrll
3001 1.1 skrll mirel.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
3002 1.1 skrll mirel.r_sym = ELF64_R_SYM (src[0].r_info);
3003 1.1 skrll mirel.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
3004 1.1 skrll mirel.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
3005 1.1 skrll mirel.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
3006 1.1 skrll
3007 1.1 skrll mips_elf64_swap_reloc_out (abfd, &mirel,
3008 1.1 skrll (Elf64_Mips_External_Rel *) dst);
3009 1.1 skrll }
3010 1.1 skrll
3011 1.1 skrll /* Swap out a MIPS 64-bit Rela reloc. */
3012 1.1 skrll
3013 1.1 skrll static void
3014 1.1 skrll mips_elf64_be_swap_reloca_out (bfd *abfd, const Elf_Internal_Rela *src,
3015 1.1 skrll bfd_byte *dst)
3016 1.1 skrll {
3017 1.1 skrll Elf64_Mips_Internal_Rela mirela;
3018 1.1 skrll
3019 1.1 skrll mirela.r_offset = src[0].r_offset;
3020 1.1 skrll BFD_ASSERT(src[0].r_offset == src[1].r_offset);
3021 1.1 skrll BFD_ASSERT(src[0].r_offset == src[2].r_offset);
3022 1.1 skrll
3023 1.1 skrll mirela.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
3024 1.1 skrll mirela.r_sym = ELF64_R_SYM (src[0].r_info);
3025 1.1 skrll mirela.r_addend = src[0].r_addend;
3026 1.1 skrll BFD_ASSERT(src[1].r_addend == 0);
3027 1.1 skrll BFD_ASSERT(src[2].r_addend == 0);
3028 1.1 skrll
3029 1.1 skrll mirela.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
3030 1.1 skrll mirela.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
3031 1.1 skrll mirela.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
3032 1.1 skrll
3033 1.1 skrll mips_elf64_swap_reloca_out (abfd, &mirela,
3034 1.1 skrll (Elf64_Mips_External_Rela *) dst);
3035 1.1 skrll }
3036 1.1 skrll
3037 1.1 skrll /* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a
3039 1.1 skrll dangerous relocation. */
3040 1.1 skrll
3041 1.1 skrll static bfd_boolean
3042 1.1 skrll mips_elf64_assign_gp (bfd *output_bfd, bfd_vma *pgp)
3043 1.1 skrll {
3044 1.1 skrll unsigned int count;
3045 1.1 skrll asymbol **sym;
3046 1.1 skrll unsigned int i;
3047 1.1 skrll
3048 1.1 skrll /* If we've already figured out what GP will be, just return it. */
3049 1.1 skrll *pgp = _bfd_get_gp_value (output_bfd);
3050 1.1 skrll if (*pgp)
3051 1.1 skrll return TRUE;
3052 1.1 skrll
3053 1.1 skrll count = bfd_get_symcount (output_bfd);
3054 1.1 skrll sym = bfd_get_outsymbols (output_bfd);
3055 1.1 skrll
3056 1.1 skrll /* The linker script will have created a symbol named `_gp' with the
3057 1.1 skrll appropriate value. */
3058 1.1 skrll if (sym == NULL)
3059 1.1 skrll i = count;
3060 1.1 skrll else
3061 1.1 skrll {
3062 1.1 skrll for (i = 0; i < count; i++, sym++)
3063 1.1 skrll {
3064 1.1 skrll register const char *name;
3065 1.1 skrll
3066 1.1 skrll name = bfd_asymbol_name (*sym);
3067 1.1 skrll if (*name == '_' && strcmp (name, "_gp") == 0)
3068 1.1 skrll {
3069 1.1 skrll *pgp = bfd_asymbol_value (*sym);
3070 1.1 skrll _bfd_set_gp_value (output_bfd, *pgp);
3071 1.1 skrll break;
3072 1.1 skrll }
3073 1.1 skrll }
3074 1.1 skrll }
3075 1.1 skrll
3076 1.1 skrll if (i >= count)
3077 1.1 skrll {
3078 1.1 skrll /* Only get the error once. */
3079 1.1 skrll *pgp = 4;
3080 1.1 skrll _bfd_set_gp_value (output_bfd, *pgp);
3081 1.1 skrll return FALSE;
3082 1.1 skrll }
3083 1.1 skrll
3084 1.1 skrll return TRUE;
3085 1.1 skrll }
3086 1.1 skrll
3087 1.1 skrll /* We have to figure out the gp value, so that we can adjust the
3088 1.1 skrll symbol value correctly. We look up the symbol _gp in the output
3089 1.1 skrll BFD. If we can't find it, we're stuck. We cache it in the ELF
3090 1.1 skrll target data. We don't need to adjust the symbol value for an
3091 1.1 skrll external symbol if we are producing relocatable output. */
3092 1.1 skrll
3093 1.1 skrll static bfd_reloc_status_type
3094 1.1 skrll mips_elf64_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
3095 1.1 skrll char **error_message, bfd_vma *pgp)
3096 1.1 skrll {
3097 1.1 skrll if (bfd_is_und_section (symbol->section)
3098 1.1 skrll && ! relocatable)
3099 1.1 skrll {
3100 1.1 skrll *pgp = 0;
3101 1.1 skrll return bfd_reloc_undefined;
3102 1.1 skrll }
3103 1.1 skrll
3104 1.1 skrll *pgp = _bfd_get_gp_value (output_bfd);
3105 1.1 skrll if (*pgp == 0
3106 1.1 skrll && (! relocatable
3107 1.1 skrll || (symbol->flags & BSF_SECTION_SYM) != 0))
3108 1.1 skrll {
3109 1.1 skrll if (relocatable)
3110 1.1 skrll {
3111 1.1 skrll /* Make up a value. */
3112 1.1 skrll *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
3113 1.1 skrll _bfd_set_gp_value (output_bfd, *pgp);
3114 1.1 skrll }
3115 1.1 skrll else if (!mips_elf64_assign_gp (output_bfd, pgp))
3116 1.1 skrll {
3117 1.1 skrll *error_message =
3118 1.1 skrll (char *) _("GP relative relocation when _gp not defined");
3119 1.1 skrll return bfd_reloc_dangerous;
3120 1.1 skrll }
3121 1.1 skrll }
3122 1.1 skrll
3123 1.1 skrll return bfd_reloc_ok;
3124 1.1 skrll }
3125 1.1 skrll
3126 1.1 skrll /* Do a R_MIPS_GPREL16 relocation. This is a 16 bit value which must
3127 1.1 skrll become the offset from the gp register. */
3128 1.1 skrll
3129 1.1 skrll static bfd_reloc_status_type
3130 1.1 skrll mips_elf64_gprel16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3131 1.1 skrll void *data, asection *input_section, bfd *output_bfd,
3132 1.1 skrll char **error_message)
3133 1.1 skrll {
3134 1.1 skrll bfd_boolean relocatable;
3135 1.1 skrll bfd_reloc_status_type ret;
3136 1.1 skrll bfd_vma gp;
3137 1.1 skrll
3138 1.1 skrll /* If we're relocating, and this is an external symbol, we don't want
3139 1.1 skrll to change anything. */
3140 1.1 skrll if (output_bfd != NULL
3141 1.1 skrll && (symbol->flags & BSF_SECTION_SYM) == 0
3142 1.1 skrll && (symbol->flags & BSF_LOCAL) != 0)
3143 1.1 skrll {
3144 1.1 skrll reloc_entry->address += input_section->output_offset;
3145 1.1 skrll return bfd_reloc_ok;
3146 1.1 skrll }
3147 1.1 skrll
3148 1.1 skrll if (output_bfd != NULL)
3149 1.1 skrll relocatable = TRUE;
3150 1.1 skrll else
3151 1.1 skrll {
3152 1.1 skrll relocatable = FALSE;
3153 1.1 skrll output_bfd = symbol->section->output_section->owner;
3154 1.1 skrll }
3155 1.1 skrll
3156 1.1 skrll ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
3157 1.1 skrll &gp);
3158 1.1 skrll if (ret != bfd_reloc_ok)
3159 1.1 skrll return ret;
3160 1.1 skrll
3161 1.1 skrll return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3162 1.1 skrll input_section, relocatable,
3163 1.1 skrll data, gp);
3164 1.1 skrll }
3165 1.1 skrll
3166 1.1 skrll /* Do a R_MIPS_LITERAL relocation. */
3167 1.1 skrll
3168 1.1 skrll static bfd_reloc_status_type
3169 1.1 skrll mips_elf64_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3170 1.1 skrll void *data, asection *input_section, bfd *output_bfd,
3171 1.1 skrll char **error_message)
3172 1.1 skrll {
3173 1.1 skrll bfd_boolean relocatable;
3174 1.1 skrll bfd_reloc_status_type ret;
3175 1.1 skrll bfd_vma gp;
3176 1.1 skrll
3177 1.1 skrll /* R_MIPS_LITERAL relocations are defined for local symbols only. */
3178 1.1 skrll if (output_bfd != NULL
3179 1.1 skrll && (symbol->flags & BSF_SECTION_SYM) == 0
3180 1.1 skrll && (symbol->flags & BSF_LOCAL) != 0)
3181 1.1 skrll {
3182 1.1 skrll *error_message = (char *)
3183 1.1 skrll _("literal relocation occurs for an external symbol");
3184 1.1 skrll return bfd_reloc_outofrange;
3185 1.1 skrll }
3186 1.1 skrll
3187 1.1 skrll /* FIXME: The entries in the .lit8 and .lit4 sections should be merged. */
3188 1.1 skrll if (output_bfd != NULL)
3189 1.1 skrll relocatable = TRUE;
3190 1.1 skrll else
3191 1.1 skrll {
3192 1.1 skrll relocatable = FALSE;
3193 1.1 skrll output_bfd = symbol->section->output_section->owner;
3194 1.1 skrll }
3195 1.1 skrll
3196 1.1 skrll ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
3197 1.1 skrll &gp);
3198 1.1 skrll if (ret != bfd_reloc_ok)
3199 1.1 skrll return ret;
3200 1.1 skrll
3201 1.1 skrll return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3202 1.1 skrll input_section, relocatable,
3203 1.1 skrll data, gp);
3204 1.1 skrll }
3205 1.1 skrll
3206 1.1 skrll /* Do a R_MIPS_GPREL32 relocation. This is a 32 bit value which must
3207 1.1 skrll become the offset from the gp register. */
3208 1.1 skrll
3209 1.1 skrll static bfd_reloc_status_type
3210 1.1 skrll mips_elf64_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3211 1.1 skrll void *data, asection *input_section, bfd *output_bfd,
3212 1.1 skrll char **error_message)
3213 1.1 skrll {
3214 1.1 skrll bfd_boolean relocatable;
3215 1.1 skrll bfd_reloc_status_type ret;
3216 1.1 skrll bfd_vma gp;
3217 1.1 skrll bfd_vma relocation;
3218 1.1 skrll bfd_vma val;
3219 1.1 skrll
3220 1.1 skrll /* R_MIPS_GPREL32 relocations are defined for local symbols only. */
3221 1.1 skrll if (output_bfd != NULL
3222 1.1 skrll && (symbol->flags & BSF_SECTION_SYM) == 0
3223 1.1 skrll && (symbol->flags & BSF_LOCAL) != 0)
3224 1.1 skrll {
3225 1.1 skrll *error_message = (char *)
3226 1.1 skrll _("32bits gp relative relocation occurs for an external symbol");
3227 1.1 skrll return bfd_reloc_outofrange;
3228 1.1 skrll }
3229 1.1 skrll
3230 1.1 skrll if (output_bfd != NULL)
3231 1.1 skrll relocatable = TRUE;
3232 1.1 skrll else
3233 1.1 skrll {
3234 1.1 skrll relocatable = FALSE;
3235 1.1 skrll output_bfd = symbol->section->output_section->owner;
3236 1.1 skrll }
3237 1.1 skrll
3238 1.1 skrll ret = mips_elf64_final_gp (output_bfd, symbol, relocatable,
3239 1.1 skrll error_message, &gp);
3240 1.1 skrll if (ret != bfd_reloc_ok)
3241 1.1 skrll return ret;
3242 1.1 skrll
3243 1.1 skrll if (bfd_is_com_section (symbol->section))
3244 1.1 skrll relocation = 0;
3245 1.1 skrll else
3246 1.1 skrll relocation = symbol->value;
3247 1.1 skrll
3248 1.1 skrll relocation += symbol->section->output_section->vma;
3249 1.1 skrll relocation += symbol->section->output_offset;
3250 1.1 skrll
3251 1.1 skrll if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
3252 1.1 skrll return bfd_reloc_outofrange;
3253 1.1 skrll
3254 1.1 skrll /* Set val to the offset into the section or symbol. */
3255 1.1 skrll val = reloc_entry->addend;
3256 1.1 skrll
3257 1.1 skrll if (reloc_entry->howto->partial_inplace)
3258 1.1 skrll val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
3259 1.1 skrll
3260 1.1 skrll /* Adjust val for the final section location and GP value. If we
3261 1.1 skrll are producing relocatable output, we don't want to do this for
3262 1.1 skrll an external symbol. */
3263 1.1 skrll if (! relocatable
3264 1.1 skrll || (symbol->flags & BSF_SECTION_SYM) != 0)
3265 1.1 skrll val += relocation - gp;
3266 1.1 skrll
3267 1.1 skrll if (reloc_entry->howto->partial_inplace)
3268 1.1 skrll bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
3269 1.1 skrll else
3270 1.1 skrll reloc_entry->addend = val;
3271 1.1 skrll
3272 1.1 skrll if (relocatable)
3273 1.1 skrll reloc_entry->address += input_section->output_offset;
3274 1.1 skrll
3275 1.1 skrll return bfd_reloc_ok;
3276 1.1 skrll }
3277 1.1 skrll
3278 1.1 skrll /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
3279 1.1 skrll the rest is at bits 6-10. The bitpos already got right by the howto. */
3280 1.1 skrll
3281 1.1 skrll static bfd_reloc_status_type
3282 1.1 skrll mips_elf64_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3283 1.1 skrll void *data, asection *input_section, bfd *output_bfd,
3284 1.1 skrll char **error_message)
3285 1.1 skrll {
3286 1.1 skrll if (reloc_entry->howto->partial_inplace)
3287 1.1 skrll {
3288 1.1 skrll reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
3289 1.1 skrll | (reloc_entry->addend & 0x00000800) >> 9);
3290 1.1 skrll }
3291 1.1 skrll
3292 1.1 skrll return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
3293 1.1 skrll input_section, output_bfd,
3294 1.1 skrll error_message);
3295 1.1 skrll }
3296 1.1 skrll
3297 1.1 skrll /* Handle a mips16 GP relative reloc. */
3298 1.1 skrll
3299 1.1 skrll static bfd_reloc_status_type
3300 1.1 skrll mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3301 1.1 skrll void *data, asection *input_section, bfd *output_bfd,
3302 1.1 skrll char **error_message)
3303 1.1 skrll {
3304 1.1 skrll bfd_boolean relocatable;
3305 1.1 skrll bfd_reloc_status_type ret;
3306 1.1 skrll bfd_byte *location;
3307 1.1 skrll bfd_vma gp;
3308 1.1 skrll
3309 1.1 skrll /* If we're relocating, and this is an external symbol, we don't want
3310 1.1 skrll to change anything. */
3311 1.1 skrll if (output_bfd != NULL
3312 1.1 skrll && (symbol->flags & BSF_SECTION_SYM) == 0
3313 1.1 skrll && (symbol->flags & BSF_LOCAL) != 0)
3314 1.1 skrll {
3315 1.1 skrll reloc_entry->address += input_section->output_offset;
3316 1.1 skrll return bfd_reloc_ok;
3317 1.1 skrll }
3318 1.1 skrll
3319 1.1 skrll if (output_bfd != NULL)
3320 1.1 skrll relocatable = TRUE;
3321 1.1 skrll else
3322 1.1 skrll {
3323 1.1 skrll relocatable = FALSE;
3324 1.1 skrll output_bfd = symbol->section->output_section->owner;
3325 1.1 skrll }
3326 1.1 skrll
3327 1.1 skrll ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
3328 1.4 christos &gp);
3329 1.4 christos if (ret != bfd_reloc_ok)
3330 1.1 skrll return ret;
3331 1.1 skrll
3332 1.1 skrll location = (bfd_byte *) data + reloc_entry->address;
3333 1.4 christos _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
3334 1.4 christos location);
3335 1.1 skrll ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3336 1.1 skrll input_section, relocatable,
3337 1.1 skrll data, gp);
3338 1.1 skrll _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
3339 1.1 skrll location);
3340 1.1 skrll
3341 1.1 skrll return ret;
3342 1.1 skrll }
3343 1.1 skrll
3344 1.1 skrll /* A mapping from BFD reloc types to MIPS ELF reloc types. */
3346 1.1 skrll
3347 1.1 skrll struct elf_reloc_map {
3348 1.1 skrll bfd_reloc_code_real_type bfd_val;
3349 1.1 skrll enum elf_mips_reloc_type elf_val;
3350 1.1 skrll };
3351 1.1 skrll
3352 1.1 skrll static const struct elf_reloc_map mips_reloc_map[] =
3353 1.1 skrll {
3354 1.1 skrll { BFD_RELOC_NONE, R_MIPS_NONE },
3355 1.1 skrll { BFD_RELOC_16, R_MIPS_16 },
3356 1.1 skrll { BFD_RELOC_32, R_MIPS_32 },
3357 1.1 skrll /* There is no BFD reloc for R_MIPS_REL32. */
3358 1.1 skrll { BFD_RELOC_64, R_MIPS_64 },
3359 1.1 skrll { BFD_RELOC_CTOR, R_MIPS_64 },
3360 1.1 skrll { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
3361 1.1 skrll { BFD_RELOC_HI16_S, R_MIPS_HI16 },
3362 1.1 skrll { BFD_RELOC_LO16, R_MIPS_LO16 },
3363 1.1 skrll { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
3364 1.1 skrll { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
3365 1.1 skrll { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
3366 1.1 skrll { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
3367 1.1 skrll { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
3368 1.1 skrll { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
3369 1.1 skrll { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
3370 1.1 skrll { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
3371 1.1 skrll { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
3372 1.1 skrll { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
3373 1.1 skrll { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
3374 1.1 skrll { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
3375 1.1 skrll { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
3376 1.1 skrll { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
3377 1.1 skrll { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
3378 1.1 skrll { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
3379 1.1 skrll { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
3380 1.1 skrll { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
3381 1.1 skrll { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
3382 1.1 skrll { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
3383 1.1 skrll { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
3384 1.1 skrll { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
3385 1.1 skrll { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
3386 1.1 skrll /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated. */
3387 1.1 skrll { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
3388 1.1 skrll { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
3389 1.1 skrll { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
3390 1.1 skrll { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
3391 1.1 skrll { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
3392 1.1 skrll { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
3393 1.1 skrll { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
3394 1.1 skrll { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
3395 1.6 christos { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
3396 1.6 christos { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
3397 1.6 christos { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
3398 1.6 christos { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
3399 1.6 christos { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
3400 1.6 christos { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
3401 1.6 christos { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 },
3402 1.1 skrll { BFD_RELOC_MIPS_21_PCREL_S2, R_MIPS_PC21_S2 },
3403 1.1 skrll { BFD_RELOC_MIPS_26_PCREL_S2, R_MIPS_PC26_S2 },
3404 1.1 skrll { BFD_RELOC_MIPS_18_PCREL_S3, R_MIPS_PC18_S3 },
3405 1.1 skrll { BFD_RELOC_MIPS_19_PCREL_S2, R_MIPS_PC19_S2 },
3406 1.1 skrll { BFD_RELOC_HI16_S_PCREL, R_MIPS_PCHI16 },
3407 1.1 skrll { BFD_RELOC_LO16_PCREL, R_MIPS_PCLO16 }
3408 1.1 skrll };
3409 1.1 skrll
3410 1.1 skrll static const struct elf_reloc_map mips16_reloc_map[] =
3411 1.1 skrll {
3412 1.4 christos { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
3413 1.4 christos { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
3414 1.4 christos { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
3415 1.4 christos { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
3416 1.4 christos { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
3417 1.4 christos { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
3418 1.4 christos { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
3419 1.4 christos { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
3420 1.4 christos { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
3421 1.1 skrll R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
3422 1.1 skrll { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
3423 1.4 christos R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
3424 1.4 christos { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
3425 1.4 christos { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
3426 1.4 christos { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
3427 1.4 christos };
3428 1.4 christos
3429 1.4 christos static const struct elf_reloc_map micromips_reloc_map[] =
3430 1.4 christos {
3431 1.4 christos { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min },
3432 1.4 christos { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min },
3433 1.4 christos { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min },
3434 1.4 christos { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min },
3435 1.4 christos { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min },
3436 1.4 christos { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min },
3437 1.4 christos { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min },
3438 1.4 christos { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min },
3439 1.4 christos { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min },
3440 1.4 christos { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min },
3441 1.4 christos { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min },
3442 1.4 christos { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min },
3443 1.4 christos { BFD_RELOC_MICROMIPS_GOT_OFST, R_MICROMIPS_GOT_OFST - R_MICROMIPS_min },
3444 1.4 christos { BFD_RELOC_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_HI16 - R_MICROMIPS_min },
3445 1.6 christos { BFD_RELOC_MICROMIPS_GOT_LO16, R_MICROMIPS_GOT_LO16 - R_MICROMIPS_min },
3446 1.6 christos { BFD_RELOC_MICROMIPS_SUB, R_MICROMIPS_SUB - R_MICROMIPS_min },
3447 1.4 christos { BFD_RELOC_MICROMIPS_HIGHER, R_MICROMIPS_HIGHER - R_MICROMIPS_min },
3448 1.1 skrll { BFD_RELOC_MICROMIPS_HIGHEST, R_MICROMIPS_HIGHEST - R_MICROMIPS_min },
3449 1.1 skrll { BFD_RELOC_MICROMIPS_CALL_HI16, R_MICROMIPS_CALL_HI16 - R_MICROMIPS_min },
3450 1.1 skrll { BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
3451 1.1 skrll { BFD_RELOC_MICROMIPS_SCN_DISP, R_MICROMIPS_SCN_DISP - R_MICROMIPS_min },
3452 1.1 skrll { BFD_RELOC_MICROMIPS_JALR, R_MICROMIPS_JALR - R_MICROMIPS_min },
3453 1.1 skrll };
3454 1.1 skrll /* Given a BFD reloc type, return a howto structure. */
3455 1.1 skrll
3456 1.1 skrll static reloc_howto_type *
3457 1.1 skrll bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3458 1.1 skrll bfd_reloc_code_real_type code)
3459 1.4 christos {
3460 1.1 skrll unsigned int i;
3461 1.1 skrll /* FIXME: We default to RELA here instead of choosing the right
3462 1.1 skrll relocation variant. */
3463 1.1 skrll reloc_howto_type *howto_table = mips_elf64_howto_table_rela;
3464 1.1 skrll reloc_howto_type *howto16_table = mips16_elf64_howto_table_rela;
3465 1.1 skrll reloc_howto_type *howto_micromips_table = micromips_elf64_howto_table_rela;
3466 1.1 skrll
3467 1.1 skrll for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
3468 1.1 skrll i++)
3469 1.1 skrll {
3470 1.1 skrll if (mips_reloc_map[i].bfd_val == code)
3471 1.1 skrll return &howto_table[(int) mips_reloc_map[i].elf_val];
3472 1.1 skrll }
3473 1.1 skrll
3474 1.1 skrll for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
3475 1.4 christos i++)
3476 1.4 christos {
3477 1.4 christos if (mips16_reloc_map[i].bfd_val == code)
3478 1.4 christos return &howto16_table[(int) mips16_reloc_map[i].elf_val];
3479 1.4 christos }
3480 1.4 christos
3481 1.4 christos for (i = 0; i < sizeof (micromips_reloc_map) / sizeof (struct elf_reloc_map);
3482 1.1 skrll i++)
3483 1.1 skrll {
3484 1.1 skrll if (micromips_reloc_map[i].bfd_val == code)
3485 1.1 skrll return &howto_micromips_table[(int) micromips_reloc_map[i].elf_val];
3486 1.1 skrll }
3487 1.1 skrll
3488 1.6 christos switch (code)
3489 1.6 christos {
3490 1.6 christos case BFD_RELOC_VTABLE_INHERIT:
3491 1.6 christos return &elf_mips_gnu_vtinherit_howto;
3492 1.1 skrll case BFD_RELOC_VTABLE_ENTRY:
3493 1.1 skrll return &elf_mips_gnu_vtentry_howto;
3494 1.1 skrll case BFD_RELOC_32_PCREL:
3495 1.1 skrll return &elf_mips_gnu_pcrel32;
3496 1.1 skrll case BFD_RELOC_MIPS_EH:
3497 1.1 skrll return &elf_mips_eh_howto;
3498 1.1 skrll case BFD_RELOC_MIPS_COPY:
3499 1.1 skrll return &elf_mips_copy_howto;
3500 1.1 skrll case BFD_RELOC_MIPS_JUMP_SLOT:
3501 1.1 skrll return &elf_mips_jump_slot_howto;
3502 1.1 skrll default:
3503 1.1 skrll bfd_set_error (bfd_error_bad_value);
3504 1.1 skrll return NULL;
3505 1.1 skrll }
3506 1.1 skrll }
3507 1.1 skrll
3508 1.1 skrll static reloc_howto_type *
3509 1.1 skrll bfd_elf64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3510 1.1 skrll const char *r_name)
3511 1.1 skrll {
3512 1.1 skrll unsigned int i;
3513 1.1 skrll
3514 1.1 skrll for (i = 0;
3515 1.1 skrll i < (sizeof (mips_elf64_howto_table_rela)
3516 1.1 skrll / sizeof (mips_elf64_howto_table_rela[0])); i++)
3517 1.1 skrll if (mips_elf64_howto_table_rela[i].name != NULL
3518 1.1 skrll && strcasecmp (mips_elf64_howto_table_rela[i].name, r_name) == 0)
3519 1.1 skrll return &mips_elf64_howto_table_rela[i];
3520 1.1 skrll
3521 1.1 skrll for (i = 0;
3522 1.1 skrll i < (sizeof (mips16_elf64_howto_table_rela)
3523 1.4 christos / sizeof (mips16_elf64_howto_table_rela[0]));
3524 1.4 christos i++)
3525 1.4 christos if (mips16_elf64_howto_table_rela[i].name != NULL
3526 1.4 christos && strcasecmp (mips16_elf64_howto_table_rela[i].name, r_name) == 0)
3527 1.4 christos return &mips16_elf64_howto_table_rela[i];
3528 1.4 christos
3529 1.4 christos for (i = 0;
3530 1.4 christos i < (sizeof (micromips_elf64_howto_table_rela)
3531 1.1 skrll / sizeof (micromips_elf64_howto_table_rela[0]));
3532 1.1 skrll i++)
3533 1.1 skrll if (micromips_elf64_howto_table_rela[i].name != NULL
3534 1.1 skrll && strcasecmp (micromips_elf64_howto_table_rela[i].name, r_name) == 0)
3535 1.1 skrll return µmips_elf64_howto_table_rela[i];
3536 1.1 skrll
3537 1.1 skrll if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
3538 1.1 skrll return &elf_mips_gnu_vtinherit_howto;
3539 1.6 christos if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
3540 1.6 christos return &elf_mips_gnu_vtentry_howto;
3541 1.6 christos if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
3542 1.6 christos return &elf_mips_gnu_rel16_s2;
3543 1.1 skrll if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
3544 1.1 skrll return &elf_mips_gnu_rela16_s2;
3545 1.1 skrll if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0)
3546 1.1 skrll return &elf_mips_gnu_pcrel32;
3547 1.1 skrll if (strcasecmp (elf_mips_eh_howto.name, r_name) == 0)
3548 1.1 skrll return &elf_mips_eh_howto;
3549 1.1 skrll if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
3550 1.1 skrll return &elf_mips_copy_howto;
3551 1.1 skrll if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
3552 1.1 skrll return &elf_mips_jump_slot_howto;
3553 1.1 skrll
3554 1.1 skrll return NULL;
3555 1.1 skrll }
3556 1.1 skrll
3557 1.1 skrll /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */
3558 1.1 skrll
3559 1.1 skrll static reloc_howto_type *
3560 1.1 skrll mips_elf64_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
3561 1.1 skrll {
3562 1.1 skrll switch (r_type)
3563 1.1 skrll {
3564 1.1 skrll case R_MIPS_GNU_VTINHERIT:
3565 1.1 skrll return &elf_mips_gnu_vtinherit_howto;
3566 1.1 skrll case R_MIPS_GNU_VTENTRY:
3567 1.6 christos return &elf_mips_gnu_vtentry_howto;
3568 1.6 christos case R_MIPS_GNU_REL16_S2:
3569 1.6 christos if (rela_p)
3570 1.6 christos return &elf_mips_gnu_rela16_s2;
3571 1.1 skrll else
3572 1.1 skrll return &elf_mips_gnu_rel16_s2;
3573 1.1 skrll case R_MIPS_PC32:
3574 1.1 skrll return &elf_mips_gnu_pcrel32;
3575 1.1 skrll case R_MIPS_EH:
3576 1.4 christos return &elf_mips_eh_howto;
3577 1.4 christos case R_MIPS_COPY:
3578 1.4 christos return &elf_mips_copy_howto;
3579 1.4 christos case R_MIPS_JUMP_SLOT:
3580 1.4 christos return &elf_mips_jump_slot_howto;
3581 1.4 christos default:
3582 1.4 christos if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
3583 1.1 skrll {
3584 1.1 skrll if (rela_p)
3585 1.1 skrll return µmips_elf64_howto_table_rela[r_type - R_MICROMIPS_min];
3586 1.1 skrll else
3587 1.1 skrll return µmips_elf64_howto_table_rel[r_type - R_MICROMIPS_min];
3588 1.1 skrll }
3589 1.1 skrll if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
3590 1.6 christos {
3591 1.6 christos if (rela_p)
3592 1.6 christos return &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min];
3593 1.6 christos else
3594 1.6 christos return &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min];
3595 1.6 christos }
3596 1.1 skrll if (r_type >= R_MIPS_max)
3597 1.1 skrll {
3598 1.1 skrll (*_bfd_error_handler) (_("unrecognised MIPS reloc number: %d"), r_type);
3599 1.1 skrll bfd_set_error (bfd_error_bad_value);
3600 1.1 skrll r_type = R_MIPS_NONE;
3601 1.1 skrll }
3602 1.1 skrll if (rela_p)
3603 1.1 skrll return &mips_elf64_howto_table_rela[r_type];
3604 1.1 skrll else
3605 1.1 skrll return &mips_elf64_howto_table_rel[r_type];
3606 1.1 skrll break;
3607 1.1 skrll }
3608 1.1 skrll }
3609 1.1 skrll
3610 1.1 skrll /* Prevent relocation handling by bfd for MIPS ELF64. */
3611 1.1 skrll
3612 1.1 skrll static void
3613 1.1 skrll mips_elf64_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
3614 1.1 skrll arelent *cache_ptr ATTRIBUTE_UNUSED,
3615 1.1 skrll Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
3616 1.1 skrll {
3617 1.1 skrll BFD_ASSERT (0);
3618 1.1 skrll }
3619 1.1 skrll
3620 1.1 skrll static void
3621 1.1 skrll mips_elf64_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
3622 1.1 skrll arelent *cache_ptr ATTRIBUTE_UNUSED,
3623 1.1 skrll Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
3624 1.1 skrll {
3625 1.1 skrll BFD_ASSERT (0);
3626 1.1 skrll }
3627 1.1 skrll
3628 1.1 skrll /* Since each entry in an SHT_REL or SHT_RELA section can represent up
3629 1.1 skrll to three relocs, we must tell the user to allocate more space. */
3630 1.1 skrll
3631 1.1 skrll static long
3632 1.1 skrll mips_elf64_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
3633 1.1 skrll {
3634 1.1 skrll return (sec->reloc_count * 3 + 1) * sizeof (arelent *);
3635 1.1 skrll }
3636 1.1 skrll
3637 1.1 skrll static long
3638 1.1 skrll mips_elf64_get_dynamic_reloc_upper_bound (bfd *abfd)
3639 1.1 skrll {
3640 1.1 skrll return _bfd_elf_get_dynamic_reloc_upper_bound (abfd) * 3;
3641 1.1 skrll }
3642 1.1 skrll
3643 1.1 skrll /* We must also copy more relocations than the corresponding functions
3644 1.1 skrll in elf.c would, so the two following functions are slightly
3645 1.1 skrll modified from elf.c, that multiply the external relocation count by
3646 1.1 skrll 3 to obtain the internal relocation count. */
3647 1.1 skrll
3648 1.1 skrll static long
3649 1.1 skrll mips_elf64_canonicalize_reloc (bfd *abfd, sec_ptr section,
3650 1.1 skrll arelent **relptr, asymbol **symbols)
3651 1.1 skrll {
3652 1.1 skrll arelent *tblptr;
3653 1.1 skrll unsigned int i;
3654 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3655 1.1 skrll
3656 1.1 skrll if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
3657 1.1 skrll return -1;
3658 1.1 skrll
3659 1.1 skrll tblptr = section->relocation;
3660 1.1 skrll for (i = 0; i < section->reloc_count * 3; i++)
3661 1.1 skrll *relptr++ = tblptr++;
3662 1.1 skrll
3663 1.1 skrll *relptr = NULL;
3664 1.1 skrll
3665 1.1 skrll return section->reloc_count * 3;
3666 1.1 skrll }
3667 1.1 skrll
3668 1.1 skrll static long
3669 1.1 skrll mips_elf64_canonicalize_dynamic_reloc (bfd *abfd, arelent **storage,
3670 1.1 skrll asymbol **syms)
3671 1.1 skrll {
3672 1.1 skrll bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3673 1.1 skrll asection *s;
3674 1.1 skrll long ret;
3675 1.1 skrll
3676 1.1 skrll if (elf_dynsymtab (abfd) == 0)
3677 1.1 skrll {
3678 1.1 skrll bfd_set_error (bfd_error_invalid_operation);
3679 1.1 skrll return -1;
3680 1.1 skrll }
3681 1.1 skrll
3682 1.1 skrll slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3683 1.1 skrll ret = 0;
3684 1.1 skrll for (s = abfd->sections; s != NULL; s = s->next)
3685 1.1 skrll {
3686 1.1 skrll if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
3687 1.1 skrll && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
3688 1.1 skrll || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
3689 1.1 skrll {
3690 1.1 skrll arelent *p;
3691 1.1 skrll long count, i;
3692 1.1 skrll
3693 1.1 skrll if (! (*slurp_relocs) (abfd, s, syms, TRUE))
3694 1.1 skrll return -1;
3695 1.1 skrll count = s->size / elf_section_data (s)->this_hdr.sh_entsize * 3;
3696 1.1 skrll p = s->relocation;
3697 1.1 skrll for (i = 0; i < count; i++)
3698 1.1 skrll *storage++ = p++;
3699 1.1 skrll ret += count;
3700 1.1 skrll }
3701 1.1 skrll }
3702 1.1 skrll
3703 1.1 skrll *storage = NULL;
3704 1.1 skrll
3705 1.1 skrll return ret;
3706 1.1 skrll }
3707 1.1 skrll
3708 1.1 skrll /* Read the relocations from one reloc section. This is mostly copied
3709 1.1 skrll from elfcode.h, except for the changes to expand one external
3710 1.1 skrll relocation to 3 internal ones. We must unfortunately set
3711 1.1 skrll reloc_count to the number of external relocations, because a lot of
3712 1.1 skrll generic code seems to depend on this. */
3713 1.1 skrll
3714 1.1 skrll static bfd_boolean
3715 1.1 skrll mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect,
3716 1.1 skrll Elf_Internal_Shdr *rel_hdr,
3717 1.1 skrll bfd_size_type reloc_count,
3718 1.1 skrll arelent *relents, asymbol **symbols,
3719 1.1 skrll bfd_boolean dynamic)
3720 1.1 skrll {
3721 1.1 skrll void *allocated;
3722 1.1 skrll bfd_byte *native_relocs;
3723 1.1 skrll arelent *relent;
3724 1.1 skrll bfd_vma i;
3725 1.1 skrll int entsize;
3726 1.1 skrll bfd_boolean rela_p;
3727 1.1 skrll
3728 1.1 skrll allocated = bfd_malloc (rel_hdr->sh_size);
3729 1.1 skrll if (allocated == NULL)
3730 1.1 skrll return FALSE;
3731 1.1 skrll
3732 1.1 skrll if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
3733 1.1 skrll || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
3734 1.1 skrll != rel_hdr->sh_size))
3735 1.1 skrll goto error_return;
3736 1.1 skrll
3737 1.1 skrll native_relocs = allocated;
3738 1.1 skrll
3739 1.1 skrll entsize = rel_hdr->sh_entsize;
3740 1.1 skrll BFD_ASSERT (entsize == sizeof (Elf64_Mips_External_Rel)
3741 1.1 skrll || entsize == sizeof (Elf64_Mips_External_Rela));
3742 1.1 skrll
3743 1.1 skrll if (entsize == sizeof (Elf64_Mips_External_Rel))
3744 1.1 skrll rela_p = FALSE;
3745 1.1 skrll else
3746 1.1 skrll rela_p = TRUE;
3747 1.1 skrll
3748 1.1 skrll for (i = 0, relent = relents;
3749 1.1 skrll i < reloc_count;
3750 1.1 skrll i++, native_relocs += entsize)
3751 1.1 skrll {
3752 1.1 skrll Elf64_Mips_Internal_Rela rela;
3753 1.1 skrll bfd_boolean used_sym, used_ssym;
3754 1.1 skrll int ir;
3755 1.1 skrll
3756 1.1 skrll if (entsize == sizeof (Elf64_Mips_External_Rela))
3757 1.1 skrll mips_elf64_swap_reloca_in (abfd,
3758 1.1 skrll (Elf64_Mips_External_Rela *) native_relocs,
3759 1.1 skrll &rela);
3760 1.1 skrll else
3761 1.1 skrll mips_elf64_swap_reloc_in (abfd,
3762 1.1 skrll (Elf64_Mips_External_Rel *) native_relocs,
3763 1.1 skrll &rela);
3764 1.1 skrll
3765 1.1 skrll /* Each entry represents exactly three actual relocations. */
3766 1.1 skrll
3767 1.1 skrll used_sym = FALSE;
3768 1.1 skrll used_ssym = FALSE;
3769 1.1 skrll for (ir = 0; ir < 3; ir++)
3770 1.1 skrll {
3771 1.1 skrll enum elf_mips_reloc_type type;
3772 1.1 skrll
3773 1.1 skrll switch (ir)
3774 1.1 skrll {
3775 1.1 skrll default:
3776 1.1 skrll abort ();
3777 1.1 skrll case 0:
3778 1.1 skrll type = (enum elf_mips_reloc_type) rela.r_type;
3779 1.1 skrll break;
3780 1.1 skrll case 1:
3781 1.1 skrll type = (enum elf_mips_reloc_type) rela.r_type2;
3782 1.1 skrll break;
3783 1.1 skrll case 2:
3784 1.1 skrll type = (enum elf_mips_reloc_type) rela.r_type3;
3785 1.1 skrll break;
3786 1.1 skrll }
3787 1.1 skrll
3788 1.1 skrll /* Some types require symbols, whereas some do not. */
3789 1.1 skrll switch (type)
3790 1.1 skrll {
3791 1.1 skrll case R_MIPS_NONE:
3792 1.1 skrll case R_MIPS_LITERAL:
3793 1.1 skrll case R_MIPS_INSERT_A:
3794 1.1 skrll case R_MIPS_INSERT_B:
3795 1.1 skrll case R_MIPS_DELETE:
3796 1.3 christos relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
3797 1.1 skrll break;
3798 1.1 skrll
3799 1.1 skrll default:
3800 1.1 skrll if (! used_sym)
3801 1.1 skrll {
3802 1.1 skrll if (rela.r_sym == STN_UNDEF)
3803 1.1 skrll relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
3804 1.1 skrll else
3805 1.1 skrll {
3806 1.1 skrll asymbol **ps, *s;
3807 1.1 skrll
3808 1.1 skrll ps = symbols + rela.r_sym - 1;
3809 1.1 skrll s = *ps;
3810 1.1 skrll if ((s->flags & BSF_SECTION_SYM) == 0)
3811 1.1 skrll relent->sym_ptr_ptr = ps;
3812 1.1 skrll else
3813 1.1 skrll relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
3814 1.1 skrll }
3815 1.1 skrll
3816 1.1 skrll used_sym = TRUE;
3817 1.1 skrll }
3818 1.1 skrll else if (! used_ssym)
3819 1.1 skrll {
3820 1.1 skrll switch (rela.r_ssym)
3821 1.1 skrll {
3822 1.1 skrll case RSS_UNDEF:
3823 1.1 skrll relent->sym_ptr_ptr =
3824 1.1 skrll bfd_abs_section_ptr->symbol_ptr_ptr;
3825 1.1 skrll break;
3826 1.1 skrll
3827 1.1 skrll case RSS_GP:
3828 1.1 skrll case RSS_GP0:
3829 1.1 skrll case RSS_LOC:
3830 1.1 skrll /* FIXME: I think these need to be handled using
3831 1.1 skrll special howto structures. */
3832 1.1 skrll BFD_ASSERT (0);
3833 1.1 skrll break;
3834 1.1 skrll
3835 1.1 skrll default:
3836 1.1 skrll BFD_ASSERT (0);
3837 1.1 skrll break;
3838 1.1 skrll }
3839 1.1 skrll
3840 1.1 skrll used_ssym = TRUE;
3841 1.1 skrll }
3842 1.1 skrll else
3843 1.1 skrll relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
3844 1.1 skrll
3845 1.1 skrll break;
3846 1.1 skrll }
3847 1.1 skrll
3848 1.1 skrll /* The address of an ELF reloc is section relative for an
3849 1.1 skrll object file, and absolute for an executable file or
3850 1.1 skrll shared library. The address of a BFD reloc is always
3851 1.1 skrll section relative. */
3852 1.1 skrll if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
3853 1.1 skrll relent->address = rela.r_offset;
3854 1.1 skrll else
3855 1.1 skrll relent->address = rela.r_offset - asect->vma;
3856 1.1 skrll
3857 1.1 skrll relent->addend = rela.r_addend;
3858 1.1 skrll
3859 1.1 skrll relent->howto = mips_elf64_rtype_to_howto (type, rela_p);
3860 1.1 skrll
3861 1.1 skrll ++relent;
3862 1.1 skrll }
3863 1.1 skrll }
3864 1.1 skrll
3865 1.1 skrll asect->reloc_count += (relent - relents) / 3;
3866 1.1 skrll
3867 1.1 skrll if (allocated != NULL)
3868 1.1 skrll free (allocated);
3869 1.1 skrll
3870 1.1 skrll return TRUE;
3871 1.1 skrll
3872 1.1 skrll error_return:
3873 1.1 skrll if (allocated != NULL)
3874 1.1 skrll free (allocated);
3875 1.1 skrll return FALSE;
3876 1.1 skrll }
3877 1.1 skrll
3878 1.1 skrll /* Read the relocations. On Irix 6, there can be two reloc sections
3879 1.1 skrll associated with a single data section. This is copied from
3880 1.1 skrll elfcode.h as well, with changes as small as accounting for 3
3881 1.1 skrll internal relocs per external reloc and resetting reloc_count to
3882 1.1 skrll zero before processing the relocs of a section. */
3883 1.1 skrll
3884 1.1 skrll static bfd_boolean
3885 1.1 skrll mips_elf64_slurp_reloc_table (bfd *abfd, asection *asect,
3886 1.1 skrll asymbol **symbols, bfd_boolean dynamic)
3887 1.1 skrll {
3888 1.1 skrll struct bfd_elf_section_data * const d = elf_section_data (asect);
3889 1.1 skrll Elf_Internal_Shdr *rel_hdr;
3890 1.1 skrll Elf_Internal_Shdr *rel_hdr2;
3891 1.1 skrll bfd_size_type reloc_count;
3892 1.1 skrll bfd_size_type reloc_count2;
3893 1.1 skrll arelent *relents;
3894 1.1 skrll bfd_size_type amt;
3895 1.1 skrll
3896 1.1 skrll if (asect->relocation != NULL)
3897 1.1 skrll return TRUE;
3898 1.1 skrll
3899 1.3 christos if (! dynamic)
3900 1.3 christos {
3901 1.3 christos if ((asect->flags & SEC_RELOC) == 0
3902 1.1 skrll || asect->reloc_count == 0)
3903 1.1 skrll return TRUE;
3904 1.1 skrll
3905 1.3 christos rel_hdr = d->rel.hdr;
3906 1.1 skrll reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
3907 1.1 skrll rel_hdr2 = d->rela.hdr;
3908 1.1 skrll reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0);
3909 1.1 skrll
3910 1.1 skrll BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
3911 1.1 skrll BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
3912 1.1 skrll || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
3913 1.1 skrll
3914 1.1 skrll }
3915 1.1 skrll else
3916 1.1 skrll {
3917 1.1 skrll /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
3918 1.1 skrll case because relocations against this section may use the
3919 1.1 skrll dynamic symbol table, and in that case bfd_section_from_shdr
3920 1.1 skrll in elf.c does not update the RELOC_COUNT. */
3921 1.1 skrll if (asect->size == 0)
3922 1.1 skrll return TRUE;
3923 1.1 skrll
3924 1.1 skrll rel_hdr = &d->this_hdr;
3925 1.1 skrll reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
3926 1.1 skrll rel_hdr2 = NULL;
3927 1.1 skrll reloc_count2 = 0;
3928 1.1 skrll }
3929 1.1 skrll
3930 1.1 skrll /* Allocate space for 3 arelent structures for each Rel structure. */
3931 1.1 skrll amt = (reloc_count + reloc_count2) * 3 * sizeof (arelent);
3932 1.1 skrll relents = bfd_alloc (abfd, amt);
3933 1.3 christos if (relents == NULL)
3934 1.3 christos return FALSE;
3935 1.3 christos
3936 1.3 christos /* The slurp_one_reloc_table routine increments reloc_count. */
3937 1.3 christos asect->reloc_count = 0;
3938 1.3 christos
3939 1.3 christos if (rel_hdr != NULL
3940 1.3 christos && ! mips_elf64_slurp_one_reloc_table (abfd, asect,
3941 1.3 christos rel_hdr, reloc_count,
3942 1.3 christos relents,
3943 1.3 christos symbols, dynamic))
3944 1.1 skrll return FALSE;
3945 1.1 skrll if (rel_hdr2 != NULL
3946 1.1 skrll && ! mips_elf64_slurp_one_reloc_table (abfd, asect,
3947 1.1 skrll rel_hdr2, reloc_count2,
3948 1.1 skrll relents + reloc_count * 3,
3949 1.1 skrll symbols, dynamic))
3950 1.1 skrll return FALSE;
3951 1.1 skrll
3952 1.1 skrll asect->relocation = relents;
3953 1.1 skrll return TRUE;
3954 1.1 skrll }
3955 1.1 skrll
3956 1.1 skrll /* Write out the relocations. */
3957 1.1 skrll
3958 1.1 skrll static void
3959 1.1 skrll mips_elf64_write_relocs (bfd *abfd, asection *sec, void *data)
3960 1.1 skrll {
3961 1.1 skrll bfd_boolean *failedp = data;
3962 1.1 skrll int count;
3963 1.1 skrll Elf_Internal_Shdr *rel_hdr;
3964 1.1 skrll unsigned int idx;
3965 1.1 skrll
3966 1.1 skrll /* If we have already failed, don't do anything. */
3967 1.1 skrll if (*failedp)
3968 1.1 skrll return;
3969 1.1 skrll
3970 1.1 skrll if ((sec->flags & SEC_RELOC) == 0)
3971 1.1 skrll return;
3972 1.1 skrll
3973 1.1 skrll /* The linker backend writes the relocs out itself, and sets the
3974 1.1 skrll reloc_count field to zero to inhibit writing them here. Also,
3975 1.1 skrll sometimes the SEC_RELOC flag gets set even when there aren't any
3976 1.1 skrll relocs. */
3977 1.1 skrll if (sec->reloc_count == 0)
3978 1.1 skrll return;
3979 1.1 skrll
3980 1.1 skrll /* We can combine up to three relocs that refer to the same address
3981 1.1 skrll if the latter relocs have no associated symbol. */
3982 1.1 skrll count = 0;
3983 1.1 skrll for (idx = 0; idx < sec->reloc_count; idx++)
3984 1.1 skrll {
3985 1.1 skrll bfd_vma addr;
3986 1.1 skrll unsigned int i;
3987 1.1 skrll
3988 1.1 skrll ++count;
3989 1.1 skrll
3990 1.1 skrll addr = sec->orelocation[idx]->address;
3991 1.1 skrll for (i = 0; i < 2; i++)
3992 1.1 skrll {
3993 1.1 skrll arelent *r;
3994 1.1 skrll
3995 1.1 skrll if (idx + 1 >= sec->reloc_count)
3996 1.1 skrll break;
3997 1.1 skrll r = sec->orelocation[idx + 1];
3998 1.1 skrll if (r->address != addr
3999 1.1 skrll || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
4000 1.1 skrll || (*r->sym_ptr_ptr)->value != 0)
4001 1.1 skrll break;
4002 1.1 skrll
4003 1.3 christos /* We can merge the reloc at IDX + 1 with the reloc at IDX. */
4004 1.1 skrll
4005 1.1 skrll ++idx;
4006 1.1 skrll }
4007 1.1 skrll }
4008 1.1 skrll
4009 1.1 skrll rel_hdr = _bfd_elf_single_rel_hdr (sec);
4010 1.1 skrll
4011 1.1 skrll /* Do the actual relocation. */
4012 1.1 skrll
4013 1.1 skrll if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rel))
4014 1.1 skrll mips_elf64_write_rel (abfd, sec, rel_hdr, &count, data);
4015 1.1 skrll else if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rela))
4016 1.1 skrll mips_elf64_write_rela (abfd, sec, rel_hdr, &count, data);
4017 1.1 skrll else
4018 1.1 skrll BFD_ASSERT (0);
4019 1.1 skrll }
4020 1.1 skrll
4021 1.1 skrll static void
4022 1.1 skrll mips_elf64_write_rel (bfd *abfd, asection *sec,
4023 1.1 skrll Elf_Internal_Shdr *rel_hdr,
4024 1.1 skrll int *count, void *data)
4025 1.1 skrll {
4026 1.1 skrll bfd_boolean *failedp = data;
4027 1.1 skrll Elf64_Mips_External_Rel *ext_rel;
4028 1.1 skrll unsigned int idx;
4029 1.1 skrll asymbol *last_sym = 0;
4030 1.1 skrll int last_sym_idx = 0;
4031 1.1 skrll
4032 1.1 skrll rel_hdr->sh_size = rel_hdr->sh_entsize * *count;
4033 1.1 skrll rel_hdr->contents = bfd_alloc (abfd, rel_hdr->sh_size);
4034 1.1 skrll if (rel_hdr->contents == NULL)
4035 1.1 skrll {
4036 1.1 skrll *failedp = TRUE;
4037 1.1 skrll return;
4038 1.1 skrll }
4039 1.1 skrll
4040 1.1 skrll ext_rel = (Elf64_Mips_External_Rel *) rel_hdr->contents;
4041 1.1 skrll for (idx = 0; idx < sec->reloc_count; idx++, ext_rel++)
4042 1.1 skrll {
4043 1.1 skrll arelent *ptr;
4044 1.1 skrll Elf64_Mips_Internal_Rela int_rel;
4045 1.1 skrll asymbol *sym;
4046 1.1 skrll int n;
4047 1.1 skrll unsigned int i;
4048 1.1 skrll
4049 1.1 skrll ptr = sec->orelocation[idx];
4050 1.1 skrll
4051 1.1 skrll /* The address of an ELF reloc is section relative for an object
4052 1.1 skrll file, and absolute for an executable file or shared library.
4053 1.1 skrll The address of a BFD reloc is always section relative. */
4054 1.1 skrll if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
4055 1.1 skrll int_rel.r_offset = ptr->address;
4056 1.1 skrll else
4057 1.1 skrll int_rel.r_offset = ptr->address + sec->vma;
4058 1.1 skrll
4059 1.1 skrll sym = *ptr->sym_ptr_ptr;
4060 1.1 skrll if (sym == last_sym)
4061 1.1 skrll n = last_sym_idx;
4062 1.1 skrll else if (bfd_is_abs_section (sym->section) && sym->value == 0)
4063 1.1 skrll n = STN_UNDEF;
4064 1.1 skrll else
4065 1.1 skrll {
4066 1.1 skrll last_sym = sym;
4067 1.1 skrll n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
4068 1.1 skrll if (n < 0)
4069 1.1 skrll {
4070 1.1 skrll *failedp = TRUE;
4071 1.1 skrll return;
4072 1.1 skrll }
4073 1.1 skrll last_sym_idx = n;
4074 1.1 skrll }
4075 1.1 skrll
4076 1.1 skrll int_rel.r_sym = n;
4077 1.1 skrll int_rel.r_ssym = RSS_UNDEF;
4078 1.1 skrll
4079 1.1 skrll if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
4080 1.1 skrll && ! _bfd_elf_validate_reloc (abfd, ptr))
4081 1.1 skrll {
4082 1.1 skrll *failedp = TRUE;
4083 1.1 skrll return;
4084 1.1 skrll }
4085 1.1 skrll
4086 1.1 skrll int_rel.r_type = ptr->howto->type;
4087 1.1 skrll int_rel.r_type2 = (int) R_MIPS_NONE;
4088 1.1 skrll int_rel.r_type3 = (int) R_MIPS_NONE;
4089 1.1 skrll
4090 1.1 skrll for (i = 0; i < 2; i++)
4091 1.1 skrll {
4092 1.1 skrll arelent *r;
4093 1.1 skrll
4094 1.1 skrll if (idx + 1 >= sec->reloc_count)
4095 1.1 skrll break;
4096 1.1 skrll r = sec->orelocation[idx + 1];
4097 1.1 skrll if (r->address != ptr->address
4098 1.1 skrll || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
4099 1.1 skrll || (*r->sym_ptr_ptr)->value != 0)
4100 1.1 skrll break;
4101 1.1 skrll
4102 1.1 skrll /* We can merge the reloc at IDX + 1 with the reloc at IDX. */
4103 1.1 skrll
4104 1.1 skrll if (i == 0)
4105 1.1 skrll int_rel.r_type2 = r->howto->type;
4106 1.1 skrll else
4107 1.1 skrll int_rel.r_type3 = r->howto->type;
4108 1.1 skrll
4109 1.1 skrll ++idx;
4110 1.1 skrll }
4111 1.1 skrll
4112 1.1 skrll mips_elf64_swap_reloc_out (abfd, &int_rel, ext_rel);
4113 1.1 skrll }
4114 1.1 skrll
4115 1.1 skrll BFD_ASSERT (ext_rel - (Elf64_Mips_External_Rel *) rel_hdr->contents
4116 1.1 skrll == *count);
4117 1.1 skrll }
4118 1.1 skrll
4119 1.1 skrll static void
4120 1.1 skrll mips_elf64_write_rela (bfd *abfd, asection *sec,
4121 1.1 skrll Elf_Internal_Shdr *rela_hdr,
4122 1.1 skrll int *count, void *data)
4123 1.1 skrll {
4124 1.1 skrll bfd_boolean *failedp = data;
4125 1.1 skrll Elf64_Mips_External_Rela *ext_rela;
4126 1.1 skrll unsigned int idx;
4127 1.1 skrll asymbol *last_sym = 0;
4128 1.1 skrll int last_sym_idx = 0;
4129 1.1 skrll
4130 1.1 skrll rela_hdr->sh_size = rela_hdr->sh_entsize * *count;
4131 1.1 skrll rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size);
4132 1.1 skrll if (rela_hdr->contents == NULL)
4133 1.1 skrll {
4134 1.1 skrll *failedp = TRUE;
4135 1.1 skrll return;
4136 1.1 skrll }
4137 1.1 skrll
4138 1.1 skrll ext_rela = (Elf64_Mips_External_Rela *) rela_hdr->contents;
4139 1.1 skrll for (idx = 0; idx < sec->reloc_count; idx++, ext_rela++)
4140 1.1 skrll {
4141 1.1 skrll arelent *ptr;
4142 1.1 skrll Elf64_Mips_Internal_Rela int_rela;
4143 1.1 skrll asymbol *sym;
4144 1.1 skrll int n;
4145 1.1 skrll unsigned int i;
4146 1.1 skrll
4147 1.1 skrll ptr = sec->orelocation[idx];
4148 1.1 skrll
4149 1.1 skrll /* The address of an ELF reloc is section relative for an object
4150 1.1 skrll file, and absolute for an executable file or shared library.
4151 1.1 skrll The address of a BFD reloc is always section relative. */
4152 1.1 skrll if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
4153 1.1 skrll int_rela.r_offset = ptr->address;
4154 1.1 skrll else
4155 1.1 skrll int_rela.r_offset = ptr->address + sec->vma;
4156 1.1 skrll
4157 1.1 skrll sym = *ptr->sym_ptr_ptr;
4158 1.1 skrll if (sym == last_sym)
4159 1.1 skrll n = last_sym_idx;
4160 1.1 skrll else if (bfd_is_abs_section (sym->section) && sym->value == 0)
4161 1.1 skrll n = STN_UNDEF;
4162 1.1 skrll else
4163 1.1 skrll {
4164 1.1 skrll last_sym = sym;
4165 1.1 skrll n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
4166 1.1 skrll if (n < 0)
4167 1.1 skrll {
4168 1.1 skrll *failedp = TRUE;
4169 1.1 skrll return;
4170 1.1 skrll }
4171 1.1 skrll last_sym_idx = n;
4172 1.1 skrll }
4173 1.1 skrll
4174 1.1 skrll int_rela.r_sym = n;
4175 1.1 skrll int_rela.r_addend = ptr->addend;
4176 1.1 skrll int_rela.r_ssym = RSS_UNDEF;
4177 1.1 skrll
4178 1.1 skrll if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
4179 1.1 skrll && ! _bfd_elf_validate_reloc (abfd, ptr))
4180 1.1 skrll {
4181 1.1 skrll *failedp = TRUE;
4182 1.1 skrll return;
4183 1.1 skrll }
4184 1.1 skrll
4185 1.1 skrll int_rela.r_type = ptr->howto->type;
4186 1.1 skrll int_rela.r_type2 = (int) R_MIPS_NONE;
4187 1.1 skrll int_rela.r_type3 = (int) R_MIPS_NONE;
4188 1.1 skrll
4189 1.1 skrll for (i = 0; i < 2; i++)
4190 1.1 skrll {
4191 1.1 skrll arelent *r;
4192 1.1 skrll
4193 1.1 skrll if (idx + 1 >= sec->reloc_count)
4194 1.1 skrll break;
4195 1.1 skrll r = sec->orelocation[idx + 1];
4196 1.1 skrll if (r->address != ptr->address
4197 1.1 skrll || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
4198 1.1 skrll || (*r->sym_ptr_ptr)->value != 0)
4199 1.1 skrll break;
4200 1.1 skrll
4201 1.1 skrll /* We can merge the reloc at IDX + 1 with the reloc at IDX. */
4202 1.1 skrll
4203 1.1 skrll if (i == 0)
4204 1.1 skrll int_rela.r_type2 = r->howto->type;
4205 1.1 skrll else
4206 1.1 skrll int_rela.r_type3 = r->howto->type;
4207 1.1 skrll
4208 1.1 skrll ++idx;
4209 1.1 skrll }
4210 1.1 skrll
4211 1.1 skrll mips_elf64_swap_reloca_out (abfd, &int_rela, ext_rela);
4212 1.1 skrll }
4213 1.1 skrll
4214 1.1 skrll BFD_ASSERT (ext_rela - (Elf64_Mips_External_Rela *) rela_hdr->contents
4215 1.1 skrll == *count);
4216 1.1 skrll }
4217 1.1 skrll
4218 1.1 skrll /* Set the right machine number for a MIPS ELF file. */
4220 1.1 skrll
4221 1.1 skrll static bfd_boolean
4222 1.1 skrll mips_elf64_object_p (bfd *abfd)
4223 1.1 skrll {
4224 1.1 skrll unsigned long mach;
4225 1.1 skrll
4226 1.1 skrll /* Irix 6 is broken. Object file symbol tables are not always
4227 1.1 skrll sorted correctly such that local symbols precede global symbols,
4228 1.1 skrll and the sh_info field in the symbol table is not always right. */
4229 1.2 skrll if (elf64_mips_irix_compat (abfd) != ict_none)
4230 1.2 skrll elf_bad_symtab (abfd) = TRUE;
4231 1.2 skrll
4232 1.2 skrll mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
4233 1.2 skrll bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
4234 1.2 skrll return TRUE;
4235 1.2 skrll }
4236 1.1 skrll
4237 1.2 skrll /* MIPS ELF local labels start with "$L". */
4239 1.2 skrll static bfd_boolean
4240 1.2 skrll mips_elf64_is_local_label_name (bfd *abfd, const char *name)
4241 1.1 skrll {
4242 1.1 skrll if (name[0] == '$' && name[1] == 'L')
4243 1.1 skrll return TRUE;
4244 1.1 skrll
4245 1.1 skrll /* We accept the generic ELF local label syntax as well. */
4246 1.6 christos return _bfd_elf_is_local_label_name (abfd, name);
4247 1.6 christos }
4248 1.1 skrll
4249 1.1 skrll /* Depending on the target vector we generate some version of Irix
4251 1.1 skrll executables or "normal" MIPS ELF ABI executables. */
4252 1.1 skrll static irix_compat_t
4253 1.1 skrll elf64_mips_irix_compat (bfd *abfd)
4254 1.1 skrll {
4255 1.1 skrll if ((abfd->xvec == &mips_elf64_be_vec)
4256 1.1 skrll || (abfd->xvec == &mips_elf64_le_vec))
4257 1.1 skrll return ict_irix6;
4258 1.1 skrll else
4259 1.1 skrll return ict_none;
4260 1.1 skrll }
4261 1.1 skrll
4262 1.1 skrll /* Support for core dump NOTE sections. */
4264 1.1 skrll static bfd_boolean
4265 1.1 skrll elf64_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
4266 1.1 skrll {
4267 1.6 christos int offset;
4268 1.1 skrll unsigned int size;
4269 1.1 skrll
4270 1.6 christos switch (note->descsz)
4271 1.1 skrll {
4272 1.1 skrll default:
4273 1.1 skrll return FALSE;
4274 1.1 skrll
4275 1.1 skrll case 480: /* Linux/MIPS - N64 kernel */
4276 1.1 skrll /* pr_cursig */
4277 1.1 skrll elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
4278 1.1 skrll
4279 1.1 skrll /* pr_pid */
4280 1.1 skrll elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
4281 1.1 skrll
4282 1.1 skrll /* pr_reg */
4283 1.1 skrll offset = 112;
4284 1.1 skrll size = 360;
4285 1.1 skrll
4286 1.1 skrll break;
4287 1.1 skrll }
4288 1.1 skrll
4289 1.1 skrll /* Make a ".reg/999" section. */
4290 1.1 skrll return _bfd_elfcore_make_pseudosection (abfd, ".reg",
4291 1.1 skrll size, note->descpos + offset);
4292 1.1 skrll }
4293 1.6 christos
4294 1.1 skrll static bfd_boolean
4295 1.6 christos elf64_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
4296 1.1 skrll {
4297 1.1 skrll switch (note->descsz)
4298 1.1 skrll {
4299 1.1 skrll default:
4300 1.1 skrll return FALSE;
4301 1.1 skrll
4302 1.1 skrll case 136: /* Linux/MIPS - N64 kernel elf_prpsinfo */
4303 1.1 skrll elf_tdata (abfd)->core->program
4304 1.6 christos = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
4305 1.1 skrll elf_tdata (abfd)->core->command
4306 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
4307 1.1 skrll }
4308 1.1 skrll
4309 1.1 skrll /* Note that for some reason, a spurious space is tacked
4310 1.1 skrll onto the end of the args in some (at least one anyway)
4311 1.1 skrll implementations, so strip it off if it exists. */
4312 1.1 skrll
4313 1.1 skrll {
4314 1.1 skrll char *command = elf_tdata (abfd)->core->command;
4315 1.1 skrll int n = strlen (command);
4316 1.1 skrll
4317 1.1 skrll if (0 < n && command[n - 1] == ' ')
4318 1.1 skrll command[n - 1] = '\0';
4319 1.1 skrll }
4320 1.1 skrll
4321 1.1 skrll return TRUE;
4322 1.1 skrll }
4323 1.1 skrll
4324 1.1 skrll /* ECOFF swapping routines. These are used when dealing with the
4326 1.1 skrll .mdebug section, which is in the ECOFF debugging format. */
4327 1.1 skrll static const struct ecoff_debug_swap mips_elf64_ecoff_debug_swap =
4328 1.1 skrll {
4329 1.1 skrll /* Symbol table magic number. */
4330 1.1 skrll magicSym2,
4331 1.1 skrll /* Alignment of debugging information. E.g., 4. */
4332 1.1 skrll 8,
4333 1.1 skrll /* Sizes of external symbolic information. */
4334 1.1 skrll sizeof (struct hdr_ext),
4335 1.1 skrll sizeof (struct dnr_ext),
4336 1.1 skrll sizeof (struct pdr_ext),
4337 1.1 skrll sizeof (struct sym_ext),
4338 1.1 skrll sizeof (struct opt_ext),
4339 1.1 skrll sizeof (struct fdr_ext),
4340 1.1 skrll sizeof (struct rfd_ext),
4341 1.1 skrll sizeof (struct ext_ext),
4342 1.1 skrll /* Functions to swap in external symbolic data. */
4343 1.1 skrll ecoff_swap_hdr_in,
4344 1.1 skrll ecoff_swap_dnr_in,
4345 1.1 skrll ecoff_swap_pdr_in,
4346 1.1 skrll ecoff_swap_sym_in,
4347 1.1 skrll ecoff_swap_opt_in,
4348 1.1 skrll ecoff_swap_fdr_in,
4349 1.1 skrll ecoff_swap_rfd_in,
4350 1.1 skrll ecoff_swap_ext_in,
4351 1.1 skrll _bfd_ecoff_swap_tir_in,
4352 1.1 skrll _bfd_ecoff_swap_rndx_in,
4353 1.1 skrll /* Functions to swap out external symbolic data. */
4354 1.1 skrll ecoff_swap_hdr_out,
4355 1.1 skrll ecoff_swap_dnr_out,
4356 1.1 skrll ecoff_swap_pdr_out,
4357 1.1 skrll ecoff_swap_sym_out,
4358 1.1 skrll ecoff_swap_opt_out,
4359 1.1 skrll ecoff_swap_fdr_out,
4360 1.1 skrll ecoff_swap_rfd_out,
4361 1.1 skrll ecoff_swap_ext_out,
4362 1.1 skrll _bfd_ecoff_swap_tir_out,
4363 1.1 skrll _bfd_ecoff_swap_rndx_out,
4364 1.1 skrll /* Function to read in symbolic data. */
4365 1.1 skrll _bfd_mips_elf_read_ecoff_info
4366 1.1 skrll };
4367 1.1 skrll
4368 1.1 skrll /* Relocations in the 64 bit MIPS ELF ABI are more complex than in
4370 1.1 skrll standard ELF. This structure is used to redirect the relocation
4371 1.1 skrll handling routines. */
4372 1.1 skrll
4373 1.1 skrll const struct elf_size_info mips_elf64_size_info =
4374 1.1 skrll {
4375 1.1 skrll sizeof (Elf64_External_Ehdr),
4376 1.1 skrll sizeof (Elf64_External_Phdr),
4377 1.1 skrll sizeof (Elf64_External_Shdr),
4378 1.1 skrll sizeof (Elf64_Mips_External_Rel),
4379 1.1 skrll sizeof (Elf64_Mips_External_Rela),
4380 1.1 skrll sizeof (Elf64_External_Sym),
4381 1.1 skrll sizeof (Elf64_External_Dyn),
4382 1.1 skrll sizeof (Elf_External_Note),
4383 1.1 skrll 4, /* hash-table entry size */
4384 1.1 skrll 3, /* internal relocations per external relocations */
4385 1.1 skrll 64, /* arch_size */
4386 1.1 skrll 3, /* log_file_align */
4387 1.1 skrll ELFCLASS64,
4388 1.1 skrll EV_CURRENT,
4389 1.1 skrll bfd_elf64_write_out_phdrs,
4390 1.1 skrll bfd_elf64_write_shdrs_and_ehdr,
4391 1.1 skrll bfd_elf64_checksum_contents,
4392 1.1 skrll mips_elf64_write_relocs,
4393 1.1 skrll bfd_elf64_swap_symbol_in,
4394 1.3 christos bfd_elf64_swap_symbol_out,
4395 1.1 skrll mips_elf64_slurp_reloc_table,
4396 1.1 skrll bfd_elf64_slurp_symbol_table,
4397 1.1 skrll bfd_elf64_swap_dyn_in,
4398 1.1 skrll bfd_elf64_swap_dyn_out,
4399 1.1 skrll mips_elf64_be_swap_reloc_in,
4400 1.6 christos mips_elf64_be_swap_reloc_out,
4401 1.6 christos mips_elf64_be_swap_reloca_in,
4402 1.1 skrll mips_elf64_be_swap_reloca_out
4403 1.1 skrll };
4404 1.1 skrll
4405 1.1 skrll #define ELF_ARCH bfd_arch_mips
4406 1.1 skrll #define ELF_TARGET_ID MIPS_ELF_DATA
4407 1.1 skrll #define ELF_MACHINE_CODE EM_MIPS
4408 1.1 skrll
4409 1.1 skrll #define elf_backend_collect TRUE
4410 1.1 skrll #define elf_backend_type_change_ok TRUE
4411 1.1 skrll #define elf_backend_can_gc_sections TRUE
4412 1.1 skrll #define elf_backend_gc_mark_extra_sections \
4413 1.1 skrll _bfd_mips_elf_gc_mark_extra_sections
4414 1.1 skrll #define elf_info_to_howto mips_elf64_info_to_howto_rela
4415 1.1 skrll #define elf_info_to_howto_rel mips_elf64_info_to_howto_rel
4416 1.1 skrll #define elf_backend_object_p mips_elf64_object_p
4417 1.1 skrll #define elf_backend_symbol_processing _bfd_mips_elf_symbol_processing
4418 1.1 skrll #define elf_backend_section_processing _bfd_mips_elf_section_processing
4419 1.1 skrll #define elf_backend_section_from_shdr _bfd_mips_elf_section_from_shdr
4420 1.1 skrll #define elf_backend_fake_sections _bfd_mips_elf_fake_sections
4421 1.1 skrll #define elf_backend_section_from_bfd_section \
4422 1.1 skrll _bfd_mips_elf_section_from_bfd_section
4423 1.1 skrll #define elf_backend_add_symbol_hook _bfd_mips_elf_add_symbol_hook
4424 1.1 skrll #define elf_backend_link_output_symbol_hook \
4425 1.1 skrll _bfd_mips_elf_link_output_symbol_hook
4426 1.1 skrll #define elf_backend_create_dynamic_sections \
4427 1.1 skrll _bfd_mips_elf_create_dynamic_sections
4428 1.1 skrll #define elf_backend_check_relocs _bfd_mips_elf_check_relocs
4429 1.1 skrll #define elf_backend_merge_symbol_attribute \
4430 1.1 skrll _bfd_mips_elf_merge_symbol_attribute
4431 1.1 skrll #define elf_backend_get_target_dtag _bfd_mips_elf_get_target_dtag
4432 1.1 skrll #define elf_backend_adjust_dynamic_symbol \
4433 1.1 skrll _bfd_mips_elf_adjust_dynamic_symbol
4434 1.1 skrll #define elf_backend_always_size_sections \
4435 1.1 skrll _bfd_mips_elf_always_size_sections
4436 1.1 skrll #define elf_backend_size_dynamic_sections \
4437 1.1 skrll _bfd_mips_elf_size_dynamic_sections
4438 1.1 skrll #define elf_backend_init_index_section _bfd_elf_init_1_index_section
4439 1.1 skrll #define elf_backend_relocate_section _bfd_mips_elf_relocate_section
4440 1.1 skrll #define elf_backend_finish_dynamic_symbol \
4441 1.1 skrll _bfd_mips_elf_finish_dynamic_symbol
4442 1.1 skrll #define elf_backend_finish_dynamic_sections \
4443 1.1 skrll _bfd_mips_elf_finish_dynamic_sections
4444 1.1 skrll #define elf_backend_final_write_processing \
4445 1.1 skrll _bfd_mips_elf_final_write_processing
4446 1.1 skrll #define elf_backend_additional_program_headers \
4447 1.1 skrll _bfd_mips_elf_additional_program_headers
4448 1.1 skrll #define elf_backend_modify_segment_map _bfd_mips_elf_modify_segment_map
4449 1.1 skrll #define elf_backend_gc_mark_hook _bfd_mips_elf_gc_mark_hook
4450 1.1 skrll #define elf_backend_gc_sweep_hook _bfd_mips_elf_gc_sweep_hook
4451 1.4 christos #define elf_backend_copy_indirect_symbol \
4452 1.1 skrll _bfd_mips_elf_copy_indirect_symbol
4453 1.1 skrll #define elf_backend_ignore_discarded_relocs \
4454 1.1 skrll _bfd_mips_elf_ignore_discarded_relocs
4455 1.1 skrll #define elf_backend_mips_irix_compat elf64_mips_irix_compat
4456 1.1 skrll #define elf_backend_mips_rtype_to_howto mips_elf64_rtype_to_howto
4457 1.1 skrll #define elf_backend_ecoff_debug_swap &mips_elf64_ecoff_debug_swap
4458 1.1 skrll #define elf_backend_size_info mips_elf64_size_info
4459 1.1 skrll
4460 1.1 skrll #define elf_backend_grok_prstatus elf64_mips_grok_prstatus
4461 1.1 skrll #define elf_backend_grok_psinfo elf64_mips_grok_psinfo
4462 1.1 skrll
4463 1.1 skrll #define elf_backend_got_header_size (8 * MIPS_RESERVED_GOTNO)
4464 1.1 skrll
4465 1.6 christos /* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations
4466 1.1 skrll work better/work only in RELA, so we default to this. */
4467 1.5 skrll #define elf_backend_may_use_rel_p 1
4468 1.5 skrll #define elf_backend_may_use_rela_p 1
4469 1.4 christos #define elf_backend_default_use_rela_p 1
4470 1.4 christos #define elf_backend_rela_plts_and_copies_p 0
4471 1.1 skrll #define elf_backend_plt_readonly 1
4472 1.1 skrll #define elf_backend_plt_sym_val _bfd_mips_elf_plt_sym_val
4473 1.1 skrll
4474 1.1 skrll #define elf_backend_sign_extend_vma TRUE
4475 1.1 skrll
4476 1.1 skrll #define elf_backend_write_section _bfd_mips_elf_write_section
4477 1.1 skrll #define elf_backend_sort_relocs_p _bfd_mips_elf_sort_relocs_p
4478 1.1 skrll
4479 1.1 skrll #define bfd_elf64_bfd_is_local_label_name \
4480 1.1 skrll mips_elf64_is_local_label_name
4481 1.1 skrll #define bfd_elf64_bfd_is_target_special_symbol \
4482 1.1 skrll _bfd_mips_elf_is_target_special_symbol
4483 1.1 skrll #define bfd_elf64_find_nearest_line _bfd_mips_elf_find_nearest_line
4484 1.1 skrll #define bfd_elf64_find_inliner_info _bfd_mips_elf_find_inliner_info
4485 1.1 skrll #define bfd_elf64_new_section_hook _bfd_mips_elf_new_section_hook
4486 1.1 skrll #define bfd_elf64_set_section_contents _bfd_mips_elf_set_section_contents
4487 1.1 skrll #define bfd_elf64_bfd_get_relocated_section_contents \
4488 1.1 skrll _bfd_elf_mips_get_relocated_section_contents
4489 1.1 skrll #define bfd_elf64_bfd_link_hash_table_create \
4490 1.1 skrll _bfd_mips_elf_link_hash_table_create
4491 1.6 christos #define bfd_elf64_bfd_final_link _bfd_mips_elf_final_link
4492 1.1 skrll #define bfd_elf64_bfd_merge_private_bfd_data \
4493 1.1 skrll _bfd_mips_elf_merge_private_bfd_data
4494 1.1 skrll #define bfd_elf64_bfd_set_private_flags _bfd_mips_elf_set_private_flags
4495 1.1 skrll #define bfd_elf64_bfd_print_private_bfd_data \
4496 1.1 skrll _bfd_mips_elf_print_private_bfd_data
4497 1.1 skrll
4498 1.1 skrll #define bfd_elf64_get_reloc_upper_bound mips_elf64_get_reloc_upper_bound
4499 1.1 skrll #define bfd_elf64_canonicalize_reloc mips_elf64_canonicalize_reloc
4500 1.1 skrll #define bfd_elf64_get_dynamic_reloc_upper_bound mips_elf64_get_dynamic_reloc_upper_bound
4501 1.1 skrll #define bfd_elf64_canonicalize_dynamic_reloc mips_elf64_canonicalize_dynamic_reloc
4502 1.1 skrll #define bfd_elf64_bfd_relax_section _bfd_mips_relax_section
4503 1.1 skrll #define bfd_elf64_mkobject _bfd_mips_elf_mkobject
4504 1.1 skrll
4505 1.1 skrll /* MIPS ELF64 archive functions. */
4506 1.3 christos #define bfd_elf64_archive_functions
4507 1.1 skrll extern bfd_boolean bfd_elf64_archive_slurp_armap
4508 1.1 skrll (bfd *);
4509 1.1 skrll extern bfd_boolean bfd_elf64_archive_write_armap
4510 1.1 skrll (bfd *, unsigned int, struct orl *, unsigned int, int);
4511 1.1 skrll #define bfd_elf64_archive_slurp_extended_name_table \
4512 1.1 skrll _bfd_archive_coff_slurp_extended_name_table
4513 1.1 skrll #define bfd_elf64_archive_construct_extended_name_table \
4514 1.1 skrll _bfd_archive_coff_construct_extended_name_table
4515 1.1 skrll #define bfd_elf64_archive_truncate_arname \
4516 1.1 skrll _bfd_archive_coff_truncate_arname
4517 1.6 christos #define bfd_elf64_archive_read_ar_hdr _bfd_archive_coff_read_ar_hdr
4518 1.1 skrll #define bfd_elf64_archive_write_ar_hdr _bfd_archive_coff_write_ar_hdr
4519 1.6 christos #define bfd_elf64_archive_openr_next_archived_file \
4520 1.1 skrll _bfd_archive_coff_openr_next_archived_file
4521 1.1 skrll #define bfd_elf64_archive_get_elt_at_index \
4522 1.1 skrll _bfd_archive_coff_get_elt_at_index
4523 1.1 skrll #define bfd_elf64_archive_generic_stat_arch_elt \
4524 1.1 skrll _bfd_archive_coff_generic_stat_arch_elt
4525 1.1 skrll #define bfd_elf64_archive_update_armap_timestamp \
4526 1.1 skrll _bfd_archive_coff_update_armap_timestamp
4527 1.1 skrll
4528 1.1 skrll /* The SGI style (n)64 NewABI. */
4529 1.1 skrll #define TARGET_LITTLE_SYM mips_elf64_le_vec
4530 1.1 skrll #define TARGET_LITTLE_NAME "elf64-littlemips"
4531 1.1 skrll #define TARGET_BIG_SYM mips_elf64_be_vec
4532 1.1 skrll #define TARGET_BIG_NAME "elf64-bigmips"
4533 1.1 skrll
4534 1.1 skrll #define ELF_MAXPAGESIZE 0x10000
4535 1.1 skrll #define ELF_COMMONPAGESIZE 0x1000
4536 1.6 christos
4537 1.1 skrll #include "elf64-target.h"
4538 1.6 christos
4539 1.1 skrll /* The SYSV-style 'traditional' (n)64 NewABI. */
4540 1.1 skrll #undef TARGET_LITTLE_SYM
4541 1.1 skrll #undef TARGET_LITTLE_NAME
4542 1.1 skrll #undef TARGET_BIG_SYM
4543 1.1 skrll #undef TARGET_BIG_NAME
4544 1.1 skrll
4545 1.1 skrll #undef ELF_MAXPAGESIZE
4546 1.1 skrll #undef ELF_COMMONPAGESIZE
4547 1.4 christos
4548 1.4 christos #define TARGET_LITTLE_SYM mips_elf64_trad_le_vec
4549 1.4 christos #define TARGET_LITTLE_NAME "elf64-tradlittlemips"
4550 1.4 christos #define TARGET_BIG_SYM mips_elf64_trad_be_vec
4551 1.4 christos #define TARGET_BIG_NAME "elf64-tradbigmips"
4552 1.4 christos
4553 1.4 christos #define ELF_MAXPAGESIZE 0x10000
4554 1.4 christos #define ELF_COMMONPAGESIZE 0x1000
4555 1.4 christos #define elf64_bed elf64_tradbed
4556 1.6 christos
4557 1.4 christos /* Include the target file again for this target. */
4558 1.6 christos #include "elf64-target.h"
4559 1.4 christos
4560 1.4 christos
4561 1.4 christos /* FreeBSD support. */
4562 1.4 christos
4563 1.4 christos #undef TARGET_LITTLE_SYM
4564 1.4 christos #undef TARGET_LITTLE_NAME
4565 1.4 christos #undef TARGET_BIG_SYM
4566 1.4 christos #undef TARGET_BIG_NAME
4567 1.4 christos
4568 #define TARGET_LITTLE_SYM mips_elf64_tradfbsd_le_vec
4569 #define TARGET_LITTLE_NAME "elf64-tradlittlemips-freebsd"
4570 #define TARGET_BIG_SYM mips_elf64_tradfbsd_be_vec
4571 #define TARGET_BIG_NAME "elf64-tradbigmips-freebsd"
4572
4573 #undef ELF_OSABI
4574 #define ELF_OSABI ELFOSABI_FREEBSD
4575
4576 #undef elf64_bed
4577 #define elf64_bed elf64_fbsd_tradbed
4578
4579 #include "elf64-target.h"
4580