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