1 /* MIPS-specific support for 32-bit ELF
2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3    2003, 2004, 2005 Free Software Foundation, Inc.
4 
5    Most of the information added by Ian Lance Taylor, Cygnus Support,
6    <ian@cygnus.com>.
7    N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
8    <mark@codesourcery.com>
9    Traditional MIPS targets support added by Koundinya.K, Dansk Data
10    Elektronik & Operations Research Group. <kk@ddeorg.soft.net>
11 
12 This file is part of BFD, the Binary File Descriptor library.
13 
14 This program is free software; you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation; either version 2 of the License, or
17 (at your option) any later version.
18 
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22 GNU General Public License for more details.
23 
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
27 
28 /* This file handles MIPS ELF targets.  SGI Irix 5 uses a slightly
29    different MIPS ELF from other targets.  This matters when linking.
30    This file supports both, switching at runtime.  */
31 
32 #include "bfd.h"
33 #include "sysdep.h"
34 #include "libbfd.h"
35 #include "bfdlink.h"
36 #include "genlink.h"
37 #include "elf-bfd.h"
38 #include "elfxx-mips.h"
39 #include "elf/mips.h"
40 #include "elf-vxworks.h"
41 
42 /* Get the ECOFF swapping routines.  */
43 #include "coff/sym.h"
44 #include "coff/symconst.h"
45 #include "coff/internal.h"
46 #include "coff/ecoff.h"
47 #include "coff/mips.h"
48 #define ECOFF_SIGNED_32
49 #include "ecoffswap.h"
50 
51 static bfd_reloc_status_type gprel32_with_gp
52   (bfd *, asymbol *, arelent *, asection *, bfd_boolean, void *, bfd_vma);
53 static bfd_reloc_status_type mips_elf_gprel32_reloc
54   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
55 static bfd_reloc_status_type mips32_64bit_reloc
56   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
57 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
58   (bfd *, bfd_reloc_code_real_type);
59 static reloc_howto_type *mips_elf32_rtype_to_howto
60   (unsigned int, bfd_boolean);
61 static void mips_info_to_howto_rel
62   (bfd *, arelent *, Elf_Internal_Rela *);
63 static void mips_info_to_howto_rela
64   (bfd *, arelent *, Elf_Internal_Rela *);
65 static bfd_boolean mips_elf_sym_is_global
66   (bfd *, asymbol *);
67 static bfd_boolean mips_elf32_object_p
68   (bfd *);
69 static bfd_boolean mips_elf_is_local_label_name
70   (bfd *, const char *);
71 static bfd_reloc_status_type mips16_jump_reloc
72   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
73 static bfd_reloc_status_type mips16_gprel_reloc
74   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
75 static bfd_reloc_status_type mips_elf_final_gp
76   (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
77 static bfd_boolean mips_elf_assign_gp
78   (bfd *, bfd_vma *);
79 static bfd_boolean elf32_mips_grok_prstatus
80   (bfd *, Elf_Internal_Note *);
81 static bfd_boolean elf32_mips_grok_psinfo
82   (bfd *, Elf_Internal_Note *);
83 static irix_compat_t elf32_mips_irix_compat
84   (bfd *);
85 
86 extern const bfd_target bfd_elf32_bigmips_vec;
87 extern const bfd_target bfd_elf32_littlemips_vec;
88 
89 /* Nonzero if ABFD is using the N32 ABI.  */
90 #define ABI_N32_P(abfd) \
91   ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
92 
93 /* Whether we are trying to be compatible with IRIX at all.  */
94 #define SGI_COMPAT(abfd) \
95   (elf32_mips_irix_compat (abfd) != ict_none)
96 
97 /* The number of local .got entries we reserve.  */
98 #define MIPS_RESERVED_GOTNO (2)
99 
100 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
101    from smaller values.  Start with zero, widen, *then* decrement.  */
102 #define MINUS_ONE	(((bfd_vma)0) - 1)
103 
104 /* The relocation table used for SHT_REL sections.  */
105 
106 static reloc_howto_type elf_mips_howto_table_rel[] =
107 {
108   /* No relocation.  */
109   HOWTO (R_MIPS_NONE,		/* type */
110 	 0,			/* rightshift */
111 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
112 	 0,			/* bitsize */
113 	 FALSE,			/* pc_relative */
114 	 0,			/* bitpos */
115 	 complain_overflow_dont, /* complain_on_overflow */
116 	 _bfd_mips_elf_generic_reloc, /* special_function */
117 	 "R_MIPS_NONE",		/* name */
118 	 FALSE,			/* partial_inplace */
119 	 0,			/* src_mask */
120 	 0,			/* dst_mask */
121 	 FALSE),		/* pcrel_offset */
122 
123   /* 16 bit relocation.  */
124   HOWTO (R_MIPS_16,		/* type */
125 	 0,			/* rightshift */
126 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
127 	 16,			/* bitsize */
128 	 FALSE,			/* pc_relative */
129 	 0,			/* bitpos */
130 	 complain_overflow_signed, /* complain_on_overflow */
131 	 _bfd_mips_elf_generic_reloc, /* special_function */
132 	 "R_MIPS_16",		/* name */
133 	 TRUE,			/* partial_inplace */
134 	 0x0000ffff,		/* src_mask */
135 	 0x0000ffff,		/* dst_mask */
136 	 FALSE),		/* pcrel_offset */
137 
138   /* 32 bit relocation.  */
139   HOWTO (R_MIPS_32,		/* type */
140 	 0,			/* rightshift */
141 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
142 	 32,			/* bitsize */
143 	 FALSE,			/* pc_relative */
144 	 0,			/* bitpos */
145 	 complain_overflow_dont, /* complain_on_overflow */
146 	 _bfd_mips_elf_generic_reloc, /* special_function */
147 	 "R_MIPS_32",		/* name */
148 	 TRUE,			/* partial_inplace */
149 	 0xffffffff,		/* src_mask */
150 	 0xffffffff,		/* dst_mask */
151 	 FALSE),		/* pcrel_offset */
152 
153   /* 32 bit symbol relative relocation.  */
154   HOWTO (R_MIPS_REL32,		/* type */
155 	 0,			/* rightshift */
156 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
157 	 32,			/* bitsize */
158 	 FALSE,			/* pc_relative */
159 	 0,			/* bitpos */
160 	 complain_overflow_dont, /* complain_on_overflow */
161 	 _bfd_mips_elf_generic_reloc, /* special_function */
162 	 "R_MIPS_REL32",	/* name */
163 	 TRUE,			/* partial_inplace */
164 	 0xffffffff,		/* src_mask */
165 	 0xffffffff,		/* dst_mask */
166 	 FALSE),		/* pcrel_offset */
167 
168   /* 26 bit jump address.  */
169   HOWTO (R_MIPS_26,		/* type */
170 	 2,			/* rightshift */
171 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
172 	 26,			/* bitsize */
173 	 FALSE,			/* pc_relative */
174 	 0,			/* bitpos */
175 	 complain_overflow_dont, /* complain_on_overflow */
176 	 			/* This needs complex overflow
177 				   detection, because the upper four
178 				   bits must match the PC + 4.  */
179 	 _bfd_mips_elf_generic_reloc, /* special_function */
180 	 "R_MIPS_26",		/* name */
181 	 TRUE,			/* partial_inplace */
182 	 0x03ffffff,		/* src_mask */
183 	 0x03ffffff,		/* dst_mask */
184 	 FALSE),		/* pcrel_offset */
185 
186   /* High 16 bits of symbol value.  */
187   HOWTO (R_MIPS_HI16,		/* type */
188 	 16,			/* rightshift */
189 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
190 	 16,			/* bitsize */
191 	 FALSE,			/* pc_relative */
192 	 0,			/* bitpos */
193 	 complain_overflow_dont, /* complain_on_overflow */
194 	 _bfd_mips_elf_hi16_reloc, /* special_function */
195 	 "R_MIPS_HI16",		/* name */
196 	 TRUE,			/* partial_inplace */
197 	 0x0000ffff,		/* src_mask */
198 	 0x0000ffff,		/* dst_mask */
199 	 FALSE),		/* pcrel_offset */
200 
201   /* Low 16 bits of symbol value.  */
202   HOWTO (R_MIPS_LO16,		/* type */
203 	 0,			/* rightshift */
204 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
205 	 16,			/* bitsize */
206 	 FALSE,			/* pc_relative */
207 	 0,			/* bitpos */
208 	 complain_overflow_dont, /* complain_on_overflow */
209 	 _bfd_mips_elf_lo16_reloc, /* special_function */
210 	 "R_MIPS_LO16",		/* name */
211 	 TRUE,			/* partial_inplace */
212 	 0x0000ffff,		/* src_mask */
213 	 0x0000ffff,		/* dst_mask */
214 	 FALSE),		/* pcrel_offset */
215 
216   /* GP relative reference.  */
217   HOWTO (R_MIPS_GPREL16,	/* type */
218 	 0,			/* rightshift */
219 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
220 	 16,			/* bitsize */
221 	 FALSE,			/* pc_relative */
222 	 0,			/* bitpos */
223 	 complain_overflow_signed, /* complain_on_overflow */
224 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
225 	 "R_MIPS_GPREL16",	/* name */
226 	 TRUE,			/* partial_inplace */
227 	 0x0000ffff,		/* src_mask */
228 	 0x0000ffff,		/* dst_mask */
229 	 FALSE),		/* pcrel_offset */
230 
231   /* Reference to literal section.  */
232   HOWTO (R_MIPS_LITERAL,	/* type */
233 	 0,			/* rightshift */
234 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
235 	 16,			/* bitsize */
236 	 FALSE,			/* pc_relative */
237 	 0,			/* bitpos */
238 	 complain_overflow_signed, /* complain_on_overflow */
239 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
240 	 "R_MIPS_LITERAL",	/* name */
241 	 TRUE,			/* partial_inplace */
242 	 0x0000ffff,		/* src_mask */
243 	 0x0000ffff,		/* dst_mask */
244 	 FALSE),		/* pcrel_offset */
245 
246   /* Reference to global offset table.  */
247   HOWTO (R_MIPS_GOT16,		/* type */
248 	 0,			/* rightshift */
249 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
250 	 16,			/* bitsize */
251 	 FALSE,			/* pc_relative */
252 	 0,			/* bitpos */
253 	 complain_overflow_signed, /* complain_on_overflow */
254 	 _bfd_mips_elf_got16_reloc, /* special_function */
255 	 "R_MIPS_GOT16",	/* name */
256 	 TRUE,			/* partial_inplace */
257 	 0x0000ffff,		/* src_mask */
258 	 0x0000ffff,		/* dst_mask */
259 	 FALSE),		/* pcrel_offset */
260 
261   /* 16 bit PC relative reference.  Note that the ABI document has a typo
262      and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
263      We do the right thing here.  */
264   HOWTO (R_MIPS_PC16,		/* type */
265 	 2,			/* rightshift */
266 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
267 	 16,			/* bitsize */
268 	 TRUE,			/* pc_relative */
269 	 0,			/* bitpos */
270 	 complain_overflow_signed, /* complain_on_overflow */
271 	 _bfd_mips_elf_generic_reloc, /* special_function */
272 	 "R_MIPS_PC16",		/* name */
273 	 TRUE,			/* partial_inplace */
274 	 0x0000ffff,		/* src_mask */
275 	 0x0000ffff,		/* dst_mask */
276 	 TRUE),			/* pcrel_offset */
277 
278   /* 16 bit call through global offset table.  */
279   HOWTO (R_MIPS_CALL16,		/* type */
280 	 0,			/* rightshift */
281 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
282 	 16,			/* bitsize */
283 	 FALSE,			/* pc_relative */
284 	 0,			/* bitpos */
285 	 complain_overflow_signed, /* complain_on_overflow */
286 	 _bfd_mips_elf_generic_reloc, /* special_function */
287 	 "R_MIPS_CALL16",	/* name */
288 	 TRUE,			/* partial_inplace */
289 	 0x0000ffff,		/* src_mask */
290 	 0x0000ffff,		/* dst_mask */
291 	 FALSE),		/* pcrel_offset */
292 
293   /* 32 bit GP relative reference.  */
294   HOWTO (R_MIPS_GPREL32,	/* type */
295 	 0,			/* rightshift */
296 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
297 	 32,			/* bitsize */
298 	 FALSE,			/* pc_relative */
299 	 0,			/* bitpos */
300 	 complain_overflow_dont, /* complain_on_overflow */
301 	 mips_elf_gprel32_reloc, /* special_function */
302 	 "R_MIPS_GPREL32",	/* name */
303 	 TRUE,			/* partial_inplace */
304 	 0xffffffff,		/* src_mask */
305 	 0xffffffff,		/* dst_mask */
306 	 FALSE),		/* pcrel_offset */
307 
308   /* The remaining relocs are defined on Irix 5, although they are
309      not defined by the ABI.  */
310   EMPTY_HOWTO (13),
311   EMPTY_HOWTO (14),
312   EMPTY_HOWTO (15),
313 
314   /* A 5 bit shift field.  */
315   HOWTO (R_MIPS_SHIFT5,		/* type */
316 	 0,			/* rightshift */
317 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
318 	 5,			/* bitsize */
319 	 FALSE,			/* pc_relative */
320 	 6,			/* bitpos */
321 	 complain_overflow_bitfield, /* complain_on_overflow */
322 	 _bfd_mips_elf_generic_reloc, /* special_function */
323 	 "R_MIPS_SHIFT5",	/* name */
324 	 TRUE,			/* partial_inplace */
325 	 0x000007c0,		/* src_mask */
326 	 0x000007c0,		/* dst_mask */
327 	 FALSE),		/* pcrel_offset */
328 
329   /* A 6 bit shift field.  */
330   /* FIXME: This is not handled correctly; a special function is
331      needed to put the most significant bit in the right place.  */
332   HOWTO (R_MIPS_SHIFT6,		/* type */
333 	 0,			/* rightshift */
334 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
335 	 6,			/* bitsize */
336 	 FALSE,			/* pc_relative */
337 	 6,			/* bitpos */
338 	 complain_overflow_bitfield, /* complain_on_overflow */
339 	 _bfd_mips_elf_generic_reloc, /* special_function */
340 	 "R_MIPS_SHIFT6",	/* name */
341 	 TRUE,			/* partial_inplace */
342 	 0x000007c4,		/* src_mask */
343 	 0x000007c4,		/* dst_mask */
344 	 FALSE),		/* pcrel_offset */
345 
346   /* A 64 bit relocation.  */
347   HOWTO (R_MIPS_64,		/* type */
348 	 0,			/* rightshift */
349 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
350 	 64,			/* bitsize */
351 	 FALSE,			/* pc_relative */
352 	 0,			/* bitpos */
353 	 complain_overflow_dont, /* complain_on_overflow */
354 	 mips32_64bit_reloc,	/* special_function */
355 	 "R_MIPS_64",		/* name */
356 	 TRUE,			/* partial_inplace */
357 	 MINUS_ONE,		/* src_mask */
358 	 MINUS_ONE,		/* dst_mask */
359 	 FALSE),		/* pcrel_offset */
360 
361   /* Displacement in the global offset table.  */
362   HOWTO (R_MIPS_GOT_DISP,	/* type */
363 	 0,			/* rightshift */
364 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
365 	 16,			/* bitsize */
366 	 FALSE,			/* pc_relative */
367 	 0,			/* bitpos */
368 	 complain_overflow_signed, /* complain_on_overflow */
369 	 _bfd_mips_elf_generic_reloc, /* special_function */
370 	 "R_MIPS_GOT_DISP",	/* name */
371 	 TRUE,			/* partial_inplace */
372 	 0x0000ffff,		/* src_mask */
373 	 0x0000ffff,		/* dst_mask */
374 	 FALSE),		/* pcrel_offset */
375 
376   /* Displacement to page pointer in the global offset table.  */
377   HOWTO (R_MIPS_GOT_PAGE,	/* type */
378 	 0,			/* rightshift */
379 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
380 	 16,			/* bitsize */
381 	 FALSE,			/* pc_relative */
382 	 0,			/* bitpos */
383 	 complain_overflow_signed, /* complain_on_overflow */
384 	 _bfd_mips_elf_generic_reloc, /* special_function */
385 	 "R_MIPS_GOT_PAGE",	/* name */
386 	 TRUE,			/* partial_inplace */
387 	 0x0000ffff,		/* src_mask */
388 	 0x0000ffff,		/* dst_mask */
389 	 FALSE),		/* pcrel_offset */
390 
391   /* Offset from page pointer in the global offset table.  */
392   HOWTO (R_MIPS_GOT_OFST,	/* type */
393 	 0,			/* rightshift */
394 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
395 	 16,			/* bitsize */
396 	 FALSE,			/* pc_relative */
397 	 0,			/* bitpos */
398 	 complain_overflow_signed, /* complain_on_overflow */
399 	 _bfd_mips_elf_generic_reloc, /* special_function */
400 	 "R_MIPS_GOT_OFST",	/* name */
401 	 TRUE,			/* partial_inplace */
402 	 0x0000ffff,		/* src_mask */
403 	 0x0000ffff,		/* dst_mask */
404 	 FALSE),		/* pcrel_offset */
405 
406   /* High 16 bits of displacement in global offset table.  */
407   HOWTO (R_MIPS_GOT_HI16,	/* type */
408 	 0,			/* rightshift */
409 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
410 	 16,			/* bitsize */
411 	 FALSE,			/* pc_relative */
412 	 0,			/* bitpos */
413 	 complain_overflow_dont, /* complain_on_overflow */
414 	 _bfd_mips_elf_generic_reloc, /* special_function */
415 	 "R_MIPS_GOT_HI16",	/* name */
416 	 TRUE,			/* partial_inplace */
417 	 0x0000ffff,		/* src_mask */
418 	 0x0000ffff,		/* dst_mask */
419 	 FALSE),		/* pcrel_offset */
420 
421   /* Low 16 bits of displacement in global offset table.  */
422   HOWTO (R_MIPS_GOT_LO16,	/* type */
423 	 0,			/* rightshift */
424 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
425 	 16,			/* bitsize */
426 	 FALSE,			/* pc_relative */
427 	 0,			/* bitpos */
428 	 complain_overflow_dont, /* complain_on_overflow */
429 	 _bfd_mips_elf_generic_reloc, /* special_function */
430 	 "R_MIPS_GOT_LO16",	/* name */
431 	 TRUE,			/* partial_inplace */
432 	 0x0000ffff,		/* src_mask */
433 	 0x0000ffff,		/* dst_mask */
434 	 FALSE),		/* pcrel_offset */
435 
436   /* 64 bit subtraction.  Used in the N32 ABI.  */
437   HOWTO (R_MIPS_SUB,		/* type */
438 	 0,			/* rightshift */
439 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
440 	 64,			/* bitsize */
441 	 FALSE,			/* pc_relative */
442 	 0,			/* bitpos */
443 	 complain_overflow_dont, /* complain_on_overflow */
444 	 _bfd_mips_elf_generic_reloc, /* special_function */
445 	 "R_MIPS_SUB",		/* name */
446 	 TRUE,			/* partial_inplace */
447 	 MINUS_ONE,		/* src_mask */
448 	 MINUS_ONE,		/* dst_mask */
449 	 FALSE),		/* pcrel_offset */
450 
451   /* Used to cause the linker to insert and delete instructions?  */
452   EMPTY_HOWTO (R_MIPS_INSERT_A),
453   EMPTY_HOWTO (R_MIPS_INSERT_B),
454   EMPTY_HOWTO (R_MIPS_DELETE),
455 
456   /* Get the higher value of a 64 bit addend.  */
457   HOWTO (R_MIPS_HIGHER,		/* type */
458 	 0,			/* rightshift */
459 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
460 	 16,			/* bitsize */
461 	 FALSE,			/* pc_relative */
462 	 0,			/* bitpos */
463 	 complain_overflow_dont, /* complain_on_overflow */
464 	 _bfd_mips_elf_generic_reloc, /* special_function */
465 	 "R_MIPS_HIGHER",	/* name */
466 	 TRUE,			/* partial_inplace */
467 	 0x0000ffff,		/* src_mask */
468 	 0x0000ffff,		/* dst_mask */
469 	 FALSE),		/* pcrel_offset */
470 
471   /* Get the highest value of a 64 bit addend.  */
472   HOWTO (R_MIPS_HIGHEST,	/* type */
473 	 0,			/* rightshift */
474 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
475 	 16,			/* bitsize */
476 	 FALSE,			/* pc_relative */
477 	 0,			/* bitpos */
478 	 complain_overflow_dont, /* complain_on_overflow */
479 	 _bfd_mips_elf_generic_reloc, /* special_function */
480 	 "R_MIPS_HIGHEST",	/* name */
481 	 TRUE,			/* partial_inplace */
482 	 0x0000ffff,		/* src_mask */
483 	 0x0000ffff,		/* dst_mask */
484 	 FALSE),		/* pcrel_offset */
485 
486   /* High 16 bits of displacement in global offset table.  */
487   HOWTO (R_MIPS_CALL_HI16,	/* type */
488 	 0,			/* rightshift */
489 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
490 	 16,			/* bitsize */
491 	 FALSE,			/* pc_relative */
492 	 0,			/* bitpos */
493 	 complain_overflow_dont, /* complain_on_overflow */
494 	 _bfd_mips_elf_generic_reloc, /* special_function */
495 	 "R_MIPS_CALL_HI16",	/* name */
496 	 TRUE,			/* partial_inplace */
497 	 0x0000ffff,		/* src_mask */
498 	 0x0000ffff,		/* dst_mask */
499 	 FALSE),		/* pcrel_offset */
500 
501   /* Low 16 bits of displacement in global offset table.  */
502   HOWTO (R_MIPS_CALL_LO16,	/* type */
503 	 0,			/* rightshift */
504 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
505 	 16,			/* bitsize */
506 	 FALSE,			/* pc_relative */
507 	 0,			/* bitpos */
508 	 complain_overflow_dont, /* complain_on_overflow */
509 	 _bfd_mips_elf_generic_reloc, /* special_function */
510 	 "R_MIPS_CALL_LO16",	/* name */
511 	 TRUE,			/* partial_inplace */
512 	 0x0000ffff,		/* src_mask */
513 	 0x0000ffff,		/* dst_mask */
514 	 FALSE),		/* pcrel_offset */
515 
516   /* Section displacement.  */
517   HOWTO (R_MIPS_SCN_DISP,       /* type */
518 	 0,			/* rightshift */
519 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
520 	 32,			/* bitsize */
521 	 FALSE,			/* pc_relative */
522 	 0,			/* bitpos */
523 	 complain_overflow_dont, /* complain_on_overflow */
524 	 _bfd_mips_elf_generic_reloc, /* special_function */
525 	 "R_MIPS_SCN_DISP",     /* name */
526 	 TRUE,			/* partial_inplace */
527 	 0xffffffff,		/* src_mask */
528 	 0xffffffff,		/* dst_mask */
529 	 FALSE),		/* pcrel_offset */
530 
531   EMPTY_HOWTO (R_MIPS_REL16),
532   EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
533   EMPTY_HOWTO (R_MIPS_PJUMP),
534   EMPTY_HOWTO (R_MIPS_RELGOT),
535 
536   /* Protected jump conversion.  This is an optimization hint.  No
537      relocation is required for correctness.  */
538   HOWTO (R_MIPS_JALR,	        /* type */
539 	 0,			/* rightshift */
540 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
541 	 32,			/* bitsize */
542 	 FALSE,			/* pc_relative */
543 	 0,			/* bitpos */
544 	 complain_overflow_dont, /* complain_on_overflow */
545 	 _bfd_mips_elf_generic_reloc, /* special_function */
546 	 "R_MIPS_JALR",	        /* name */
547 	 FALSE,			/* partial_inplace */
548 	 0x00000000,		/* src_mask */
549 	 0x00000000,		/* dst_mask */
550 	 FALSE),		/* pcrel_offset */
551 
552   /* TLS GD/LD dynamic relocations.  */
553   HOWTO (R_MIPS_TLS_DTPMOD32,	/* type */
554 	 0,			/* rightshift */
555 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
556 	 32,			/* bitsize */
557 	 FALSE,			/* pc_relative */
558 	 0,			/* bitpos */
559 	 complain_overflow_dont, /* complain_on_overflow */
560 	 _bfd_mips_elf_generic_reloc, /* special_function */
561 	 "R_MIPS_TLS_DTPMOD32",	/* name */
562 	 TRUE,			/* partial_inplace */
563 	 0xffffffff,		/* src_mask */
564 	 0xffffffff,		/* dst_mask */
565 	 FALSE),		/* pcrel_offset */
566 
567   HOWTO (R_MIPS_TLS_DTPREL32,	/* type */
568 	 0,			/* rightshift */
569 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
570 	 32,			/* bitsize */
571 	 FALSE,			/* pc_relative */
572 	 0,			/* bitpos */
573 	 complain_overflow_dont, /* complain_on_overflow */
574 	 _bfd_mips_elf_generic_reloc, /* special_function */
575 	 "R_MIPS_TLS_DTPREL32",	/* name */
576 	 TRUE,			/* partial_inplace */
577 	 0xffffffff,		/* src_mask */
578 	 0xffffffff,		/* dst_mask */
579 	 FALSE),		/* pcrel_offset */
580 
581   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
582   EMPTY_HOWTO (R_MIPS_TLS_DTPREL64),
583 
584   /* TLS general dynamic variable reference.  */
585   HOWTO (R_MIPS_TLS_GD,		/* type */
586 	 0,			/* rightshift */
587 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
588 	 16,			/* bitsize */
589 	 FALSE,			/* pc_relative */
590 	 0,			/* bitpos */
591 	 complain_overflow_signed, /* complain_on_overflow */
592 	 _bfd_mips_elf_generic_reloc, /* special_function */
593 	 "R_MIPS_TLS_GD",	/* name */
594 	 TRUE,			/* partial_inplace */
595 	 0x0000ffff,		/* src_mask */
596 	 0x0000ffff,		/* dst_mask */
597 	 FALSE),		/* pcrel_offset */
598 
599   /* TLS local dynamic variable reference.  */
600   HOWTO (R_MIPS_TLS_LDM,	/* type */
601 	 0,			/* rightshift */
602 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
603 	 16,			/* bitsize */
604 	 FALSE,			/* pc_relative */
605 	 0,			/* bitpos */
606 	 complain_overflow_signed, /* complain_on_overflow */
607 	 _bfd_mips_elf_generic_reloc, /* special_function */
608 	 "R_MIPS_TLS_LDM",	/* name */
609 	 TRUE,			/* partial_inplace */
610 	 0x0000ffff,		/* src_mask */
611 	 0x0000ffff,		/* dst_mask */
612 	 FALSE),		/* pcrel_offset */
613 
614   /* TLS local dynamic offset.  */
615   HOWTO (R_MIPS_TLS_DTPREL_HI16,	/* type */
616 	 0,			/* rightshift */
617 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
618 	 16,			/* bitsize */
619 	 FALSE,			/* pc_relative */
620 	 0,			/* bitpos */
621 	 complain_overflow_signed, /* complain_on_overflow */
622 	 _bfd_mips_elf_generic_reloc, /* special_function */
623 	 "R_MIPS_TLS_DTPREL_HI16",	/* name */
624 	 TRUE,			/* partial_inplace */
625 	 0x0000ffff,		/* src_mask */
626 	 0x0000ffff,		/* dst_mask */
627 	 FALSE),		/* pcrel_offset */
628 
629   /* TLS local dynamic offset.  */
630   HOWTO (R_MIPS_TLS_DTPREL_LO16,	/* type */
631 	 0,			/* rightshift */
632 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
633 	 16,			/* bitsize */
634 	 FALSE,			/* pc_relative */
635 	 0,			/* bitpos */
636 	 complain_overflow_signed, /* complain_on_overflow */
637 	 _bfd_mips_elf_generic_reloc, /* special_function */
638 	 "R_MIPS_TLS_DTPREL_LO16",	/* name */
639 	 TRUE,			/* partial_inplace */
640 	 0x0000ffff,		/* src_mask */
641 	 0x0000ffff,		/* dst_mask */
642 	 FALSE),		/* pcrel_offset */
643 
644   /* TLS thread pointer offset.  */
645   HOWTO (R_MIPS_TLS_GOTTPREL,	/* type */
646 	 0,			/* rightshift */
647 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
648 	 16,			/* bitsize */
649 	 FALSE,			/* pc_relative */
650 	 0,			/* bitpos */
651 	 complain_overflow_signed, /* complain_on_overflow */
652 	 _bfd_mips_elf_generic_reloc, /* special_function */
653 	 "R_MIPS_TLS_GOTTPREL",	/* name */
654 	 TRUE,			/* partial_inplace */
655 	 0x0000ffff,		/* src_mask */
656 	 0x0000ffff,		/* dst_mask */
657 	 FALSE),		/* pcrel_offset */
658 
659   /* TLS IE dynamic relocations.  */
660   HOWTO (R_MIPS_TLS_TPREL32,	/* type */
661 	 0,			/* rightshift */
662 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
663 	 32,			/* bitsize */
664 	 FALSE,			/* pc_relative */
665 	 0,			/* bitpos */
666 	 complain_overflow_dont, /* complain_on_overflow */
667 	 _bfd_mips_elf_generic_reloc, /* special_function */
668 	 "R_MIPS_TLS_TPREL32",	/* name */
669 	 TRUE,			/* partial_inplace */
670 	 0xffffffff,		/* src_mask */
671 	 0xffffffff,		/* dst_mask */
672 	 FALSE),		/* pcrel_offset */
673 
674   EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
675 
676   /* TLS thread pointer offset.  */
677   HOWTO (R_MIPS_TLS_TPREL_HI16,	/* type */
678 	 0,			/* rightshift */
679 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
680 	 16,			/* bitsize */
681 	 FALSE,			/* pc_relative */
682 	 0,			/* bitpos */
683 	 complain_overflow_signed, /* complain_on_overflow */
684 	 _bfd_mips_elf_generic_reloc, /* special_function */
685 	 "R_MIPS_TLS_TPREL_HI16", /* name */
686 	 TRUE,			/* partial_inplace */
687 	 0x0000ffff,		/* src_mask */
688 	 0x0000ffff,		/* dst_mask */
689 	 FALSE),		/* pcrel_offset */
690 
691   /* TLS thread pointer offset.  */
692   HOWTO (R_MIPS_TLS_TPREL_LO16,	/* type */
693 	 0,			/* rightshift */
694 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
695 	 16,			/* bitsize */
696 	 FALSE,			/* pc_relative */
697 	 0,			/* bitpos */
698 	 complain_overflow_signed, /* complain_on_overflow */
699 	 _bfd_mips_elf_generic_reloc, /* special_function */
700 	 "R_MIPS_TLS_TPREL_LO16", /* name */
701 	 TRUE,			/* partial_inplace */
702 	 0x0000ffff,		/* src_mask */
703 	 0x0000ffff,		/* dst_mask */
704 	 FALSE),		/* pcrel_offset */
705 };
706 
707 /* The reloc used for BFD_RELOC_CTOR when doing a 64 bit link.  This
708    is a hack to make the linker think that we need 64 bit values.  */
709 static reloc_howto_type elf_mips_ctor64_howto =
710   HOWTO (R_MIPS_64,		/* type */
711 	 0,			/* rightshift */
712 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
713 	 32,			/* bitsize */
714 	 FALSE,			/* pc_relative */
715 	 0,			/* bitpos */
716 	 complain_overflow_signed, /* complain_on_overflow */
717 	 mips32_64bit_reloc,	/* special_function */
718 	 "R_MIPS_64",		/* name */
719 	 TRUE,			/* partial_inplace */
720 	 0xffffffff,		/* src_mask */
721 	 0xffffffff,		/* dst_mask */
722 	 FALSE);		/* pcrel_offset */
723 
724 static reloc_howto_type elf_mips16_howto_table_rel[] =
725 {
726   /* The reloc used for the mips16 jump instruction.  */
727   HOWTO (R_MIPS16_26,		/* type */
728 	 2,			/* rightshift */
729 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
730 	 26,			/* bitsize */
731 	 FALSE,			/* pc_relative */
732 	 0,			/* bitpos */
733 	 complain_overflow_dont, /* complain_on_overflow */
734 	 			/* This needs complex overflow
735 				   detection, because the upper four
736 				   bits must match the PC.  */
737 	 mips16_jump_reloc,	/* special_function */
738 	 "R_MIPS16_26",		/* name */
739 	 TRUE,			/* partial_inplace */
740 	 0x3ffffff,		/* src_mask */
741 	 0x3ffffff,		/* dst_mask */
742 	 FALSE),		/* pcrel_offset */
743 
744   /* The reloc used for the mips16 gprel instruction.  */
745   HOWTO (R_MIPS16_GPREL,	/* type */
746 	 0,			/* rightshift */
747 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
748 	 16,			/* bitsize */
749 	 FALSE,			/* pc_relative */
750 	 0,			/* bitpos */
751 	 complain_overflow_signed, /* complain_on_overflow */
752 	 mips16_gprel_reloc,	/* special_function */
753 	 "R_MIPS16_GPREL",	/* name */
754 	 TRUE,			/* partial_inplace */
755 	 0x0000ffff,		/* src_mask */
756 	 0x0000ffff,	        /* dst_mask */
757 	 FALSE),		/* pcrel_offset */
758 
759   /* A placeholder for MIPS16 reference to global offset table.  */
760   EMPTY_HOWTO (R_MIPS16_GOT16),
761 
762   /* A placeholder for MIPS16 16 bit call through global offset table.  */
763   EMPTY_HOWTO (R_MIPS16_CALL16),
764 
765   /* MIPS16 high 16 bits of symbol value.  */
766   HOWTO (R_MIPS16_HI16,		/* type */
767 	 16,			/* rightshift */
768 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
769 	 16,			/* bitsize */
770 	 FALSE,			/* pc_relative */
771 	 0,			/* bitpos */
772 	 complain_overflow_dont, /* complain_on_overflow */
773 	 _bfd_mips_elf_hi16_reloc, /* special_function */
774 	 "R_MIPS16_HI16",	/* name */
775 	 TRUE,			/* partial_inplace */
776 	 0x0000ffff,		/* src_mask */
777 	 0x0000ffff,	        /* dst_mask */
778 	 FALSE),		/* pcrel_offset */
779 
780   /* MIPS16 low 16 bits of symbol value.  */
781   HOWTO (R_MIPS16_LO16,		/* type */
782 	 0,			/* rightshift */
783 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
784 	 16,			/* bitsize */
785 	 FALSE,			/* pc_relative */
786 	 0,			/* bitpos */
787 	 complain_overflow_dont, /* complain_on_overflow */
788 	 _bfd_mips_elf_lo16_reloc, /* special_function */
789 	 "R_MIPS16_LO16",	/* name */
790 	 TRUE,			/* partial_inplace */
791 	 0x0000ffff,		/* src_mask */
792 	 0x0000ffff,	        /* dst_mask */
793 	 FALSE),		/* pcrel_offset */
794 };
795 
796 /* 16 bit offset for pc-relative branches.  */
797 static reloc_howto_type elf_mips_gnu_rel16_s2 =
798   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
799 	 2,			/* rightshift */
800 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
801 	 16,			/* bitsize */
802 	 TRUE,			/* pc_relative */
803 	 0,			/* bitpos */
804 	 complain_overflow_signed, /* complain_on_overflow */
805 	 _bfd_mips_elf_generic_reloc, /* special_function */
806 	 "R_MIPS_GNU_REL16_S2",	/* name */
807 	 TRUE,			/* partial_inplace */
808 	 0xffff,		/* src_mask */
809 	 0xffff,		/* dst_mask */
810 	 TRUE);			/* pcrel_offset */
811 
812 /* 32 bit pc-relative.  This was a GNU extension used by embedded-PIC.
813    It was co-opted by mips-linux for exception-handling data.  It is no
814    longer used, but should continue to be supported by the linker for
815    backward compatibility.  (GCC stopped using it in May, 2004.)  */
816 static reloc_howto_type elf_mips_gnu_pcrel32 =
817   HOWTO (R_MIPS_PC32,		/* type */
818 	 0,			/* rightshift */
819 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
820 	 32,			/* bitsize */
821 	 TRUE,			/* pc_relative */
822 	 0,			/* bitpos */
823 	 complain_overflow_signed, /* complain_on_overflow */
824 	 _bfd_mips_elf_generic_reloc, /* special_function */
825 	 "R_MIPS_PC32",		/* name */
826 	 TRUE,			/* partial_inplace */
827 	 0xffffffff,		/* src_mask */
828 	 0xffffffff,		/* dst_mask */
829 	 TRUE);			/* pcrel_offset */
830 
831 /* GNU extension to record C++ vtable hierarchy */
832 static reloc_howto_type elf_mips_gnu_vtinherit_howto =
833   HOWTO (R_MIPS_GNU_VTINHERIT,	/* type */
834 	 0,			/* rightshift */
835 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
836 	 0,			/* bitsize */
837 	 FALSE,			/* pc_relative */
838 	 0,			/* bitpos */
839 	 complain_overflow_dont, /* complain_on_overflow */
840 	 NULL,			/* special_function */
841 	 "R_MIPS_GNU_VTINHERIT", /* name */
842 	 FALSE,			/* partial_inplace */
843 	 0,			/* src_mask */
844 	 0,			/* dst_mask */
845 	 FALSE);		/* pcrel_offset */
846 
847 /* GNU extension to record C++ vtable member usage */
848 static reloc_howto_type elf_mips_gnu_vtentry_howto =
849   HOWTO (R_MIPS_GNU_VTENTRY,	/* type */
850 	 0,			/* rightshift */
851 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
852 	 0,			/* bitsize */
853 	 FALSE,			/* pc_relative */
854 	 0,			/* bitpos */
855 	 complain_overflow_dont, /* complain_on_overflow */
856 	 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
857 	 "R_MIPS_GNU_VTENTRY",	/* name */
858 	 FALSE,			/* partial_inplace */
859 	 0,			/* src_mask */
860 	 0,			/* dst_mask */
861 	 FALSE);		/* pcrel_offset */
862 
863 /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
864    dangerous relocation.  */
865 
866 static bfd_boolean
867 mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
868 {
869   unsigned int count;
870   asymbol **sym;
871   unsigned int i;
872 
873   /* If we've already figured out what GP will be, just return it.  */
874   *pgp = _bfd_get_gp_value (output_bfd);
875   if (*pgp)
876     return TRUE;
877 
878   count = bfd_get_symcount (output_bfd);
879   sym = bfd_get_outsymbols (output_bfd);
880 
881   /* The linker script will have created a symbol named `_gp' with the
882      appropriate value.  */
883   if (sym == NULL)
884     i = count;
885   else
886     {
887       for (i = 0; i < count; i++, sym++)
888 	{
889 	  register const char *name;
890 
891 	  name = bfd_asymbol_name (*sym);
892 	  if (*name == '_' && strcmp (name, "_gp") == 0)
893 	    {
894 	      *pgp = bfd_asymbol_value (*sym);
895 	      _bfd_set_gp_value (output_bfd, *pgp);
896 	      break;
897 	    }
898 	}
899     }
900 
901   if (i >= count)
902     {
903       /* Only get the error once.  */
904       *pgp = 4;
905       _bfd_set_gp_value (output_bfd, *pgp);
906       return FALSE;
907     }
908 
909   return TRUE;
910 }
911 
912 /* We have to figure out the gp value, so that we can adjust the
913    symbol value correctly.  We look up the symbol _gp in the output
914    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
915    target data.  We don't need to adjust the symbol value for an
916    external symbol if we are producing relocatable output.  */
917 
918 static bfd_reloc_status_type
919 mips_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
920 		   char **error_message, bfd_vma *pgp)
921 {
922   if (bfd_is_und_section (symbol->section)
923       && ! relocatable)
924     {
925       *pgp = 0;
926       return bfd_reloc_undefined;
927     }
928 
929   *pgp = _bfd_get_gp_value (output_bfd);
930   if (*pgp == 0
931       && (! relocatable
932 	  || (symbol->flags & BSF_SECTION_SYM) != 0))
933     {
934       if (relocatable)
935 	{
936 	  /* Make up a value.  */
937 	  *pgp = symbol->section->output_section->vma + 0x4000;
938 	  _bfd_set_gp_value (output_bfd, *pgp);
939 	}
940       else if (!mips_elf_assign_gp (output_bfd, pgp))
941 	{
942 	  *error_message =
943 	    (char *) _("GP relative relocation when _gp not defined");
944 	  return bfd_reloc_dangerous;
945 	}
946     }
947 
948   return bfd_reloc_ok;
949 }
950 
951 /* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
952    become the offset from the gp register.  This function also handles
953    R_MIPS_LITERAL relocations, although those can be handled more
954    cleverly because the entries in the .lit8 and .lit4 sections can be
955    merged.  */
956 
957 bfd_reloc_status_type
958 _bfd_mips_elf32_gprel16_reloc (bfd *abfd, arelent *reloc_entry,
959 			       asymbol *symbol, void *data,
960 			       asection *input_section, bfd *output_bfd,
961 			       char **error_message)
962 {
963   bfd_boolean relocatable;
964   bfd_reloc_status_type ret;
965   bfd_vma gp;
966 
967   /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
968   if (reloc_entry->howto->type == R_MIPS_LITERAL
969       && output_bfd != NULL
970       && (symbol->flags & BSF_SECTION_SYM) == 0
971       && (symbol->flags & BSF_LOCAL) != 0)
972     {
973       *error_message = (char *)
974 	_("literal relocation occurs for an external symbol");
975       return bfd_reloc_outofrange;
976     }
977 
978   if (output_bfd != NULL)
979     relocatable = TRUE;
980   else
981     {
982       relocatable = FALSE;
983       output_bfd = symbol->section->output_section->owner;
984     }
985 
986   ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
987 			   &gp);
988   if (ret != bfd_reloc_ok)
989     return ret;
990 
991   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
992 					input_section, relocatable,
993 					data, gp);
994 }
995 
996 /* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
997    become the offset from the gp register.  */
998 
999 static bfd_reloc_status_type
1000 mips_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1001 			void *data, asection *input_section, bfd *output_bfd,
1002 			char **error_message)
1003 {
1004   bfd_boolean relocatable;
1005   bfd_reloc_status_type ret;
1006   bfd_vma gp;
1007 
1008   /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
1009   if (output_bfd != NULL
1010       && (symbol->flags & BSF_SECTION_SYM) == 0
1011       && (symbol->flags & BSF_LOCAL) != 0)
1012     {
1013       *error_message = (char *)
1014 	_("32bits gp relative relocation occurs for an external symbol");
1015       return bfd_reloc_outofrange;
1016     }
1017 
1018   if (output_bfd != NULL)
1019     relocatable = TRUE;
1020   else
1021     {
1022       relocatable = FALSE;
1023       output_bfd = symbol->section->output_section->owner;
1024     }
1025 
1026   ret = mips_elf_final_gp (output_bfd, symbol, relocatable,
1027 			   error_message, &gp);
1028   if (ret != bfd_reloc_ok)
1029     return ret;
1030 
1031   return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
1032 			  relocatable, data, gp);
1033 }
1034 
1035 static bfd_reloc_status_type
1036 gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry,
1037 		 asection *input_section, bfd_boolean relocatable,
1038 		 void *data, bfd_vma gp)
1039 {
1040   bfd_vma relocation;
1041   bfd_vma val;
1042 
1043   if (bfd_is_com_section (symbol->section))
1044     relocation = 0;
1045   else
1046     relocation = symbol->value;
1047 
1048   relocation += symbol->section->output_section->vma;
1049   relocation += symbol->section->output_offset;
1050 
1051   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1052     return bfd_reloc_outofrange;
1053 
1054   /* Set val to the offset into the section or symbol.  */
1055   val = reloc_entry->addend;
1056 
1057   if (reloc_entry->howto->partial_inplace)
1058     val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1059 
1060   /* Adjust val for the final section location and GP value.  If we
1061      are producing relocatable output, we don't want to do this for
1062      an external symbol.  */
1063   if (! relocatable
1064       || (symbol->flags & BSF_SECTION_SYM) != 0)
1065     val += relocation - gp;
1066 
1067   if (reloc_entry->howto->partial_inplace)
1068     bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
1069   else
1070     reloc_entry->addend = val;
1071 
1072   if (relocatable)
1073     reloc_entry->address += input_section->output_offset;
1074 
1075   return bfd_reloc_ok;
1076 }
1077 
1078 /* Handle a 64 bit reloc in a 32 bit MIPS ELF file.  These are
1079    generated when addresses are 64 bits.  The upper 32 bits are a simple
1080    sign extension.  */
1081 
1082 static bfd_reloc_status_type
1083 mips32_64bit_reloc (bfd *abfd, arelent *reloc_entry,
1084 		    asymbol *symbol ATTRIBUTE_UNUSED,
1085 		    void *data, asection *input_section,
1086 		    bfd *output_bfd, char **error_message)
1087 {
1088   bfd_reloc_status_type r;
1089   arelent reloc32;
1090   unsigned long val;
1091   bfd_size_type addr;
1092 
1093   /* Do a normal 32 bit relocation on the lower 32 bits.  */
1094   reloc32 = *reloc_entry;
1095   if (bfd_big_endian (abfd))
1096     reloc32.address += 4;
1097   reloc32.howto = &elf_mips_howto_table_rel[R_MIPS_32];
1098   r = bfd_perform_relocation (abfd, &reloc32, data, input_section,
1099 			      output_bfd, error_message);
1100 
1101   /* Sign extend into the upper 32 bits.  */
1102   val = bfd_get_32 (abfd, (bfd_byte *) data + reloc32.address);
1103   if ((val & 0x80000000) != 0)
1104     val = 0xffffffff;
1105   else
1106     val = 0;
1107   addr = reloc_entry->address;
1108   if (bfd_little_endian (abfd))
1109     addr += 4;
1110   bfd_put_32 (abfd, val, (bfd_byte *) data + addr);
1111 
1112   return r;
1113 }
1114 
1115 /* Handle a mips16 jump.  */
1116 
1117 static bfd_reloc_status_type
1118 mips16_jump_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
1119 		   asymbol *symbol, void *data ATTRIBUTE_UNUSED,
1120 		   asection *input_section, bfd *output_bfd,
1121 		   char **error_message ATTRIBUTE_UNUSED)
1122 {
1123   if (output_bfd != NULL
1124       && (symbol->flags & BSF_SECTION_SYM) == 0
1125       && reloc_entry->addend == 0)
1126     {
1127       reloc_entry->address += input_section->output_offset;
1128       return bfd_reloc_ok;
1129     }
1130 
1131   /* FIXME.  */
1132   {
1133     static bfd_boolean warned;
1134 
1135     if (! warned)
1136       (*_bfd_error_handler)
1137 	(_("Linking mips16 objects into %s format is not supported"),
1138 	 bfd_get_target (input_section->output_section->owner));
1139     warned = TRUE;
1140   }
1141 
1142   return bfd_reloc_undefined;
1143 }
1144 
1145 /* Handle a mips16 GP relative reloc.  */
1146 
1147 static bfd_reloc_status_type
1148 mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1149 		    void *data, asection *input_section, bfd *output_bfd,
1150 		    char **error_message)
1151 {
1152   bfd_boolean relocatable;
1153   bfd_reloc_status_type ret;
1154   bfd_byte *location;
1155   bfd_vma gp;
1156 
1157   /* If we're relocating, and this is an external symbol, we don't want
1158      to change anything.  */
1159   if (output_bfd != NULL
1160       && (symbol->flags & BSF_SECTION_SYM) == 0
1161       && (symbol->flags & BSF_LOCAL) != 0)
1162     {
1163       reloc_entry->address += input_section->output_offset;
1164       return bfd_reloc_ok;
1165     }
1166 
1167   if (output_bfd != NULL)
1168     relocatable = TRUE;
1169   else
1170     {
1171       relocatable = FALSE;
1172       output_bfd = symbol->section->output_section->owner;
1173     }
1174 
1175   ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
1176 			   &gp);
1177   if (ret != bfd_reloc_ok)
1178     return ret;
1179 
1180   location = (bfd_byte *) data + reloc_entry->address;
1181   _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
1182 				   location);
1183   ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1184 				       input_section, relocatable,
1185 				       data, gp);
1186   _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
1187 				 location);
1188 
1189   return ret;
1190 }
1191 
1192 /* A mapping from BFD reloc types to MIPS ELF reloc types.  */
1193 
1194 struct elf_reloc_map {
1195   bfd_reloc_code_real_type bfd_val;
1196   enum elf_mips_reloc_type elf_val;
1197 };
1198 
1199 static const struct elf_reloc_map mips_reloc_map[] =
1200 {
1201   { BFD_RELOC_NONE, R_MIPS_NONE },
1202   { BFD_RELOC_16, R_MIPS_16 },
1203   { BFD_RELOC_32, R_MIPS_32 },
1204   /* There is no BFD reloc for R_MIPS_REL32.  */
1205   { BFD_RELOC_64, R_MIPS_64 },
1206   { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
1207   { BFD_RELOC_HI16_S, R_MIPS_HI16 },
1208   { BFD_RELOC_LO16, R_MIPS_LO16 },
1209   { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
1210   { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
1211   { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
1212   { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
1213   { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
1214   { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
1215   { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
1216   { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
1217   { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
1218   { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
1219   { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
1220   { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
1221   { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
1222   { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
1223   { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
1224   { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
1225   { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
1226   { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
1227   { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
1228   { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
1229   { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
1230   { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
1231   { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
1232   { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
1233   { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
1234   { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
1235   { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 }
1236 };
1237 
1238 static const struct elf_reloc_map mips16_reloc_map[] =
1239 {
1240   { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
1241   { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
1242   { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
1243   { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
1244 };
1245 
1246 /* Given a BFD reloc type, return a howto structure.  */
1247 
1248 static reloc_howto_type *
1249 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code)
1250 {
1251   unsigned int i;
1252   reloc_howto_type *howto_table = elf_mips_howto_table_rel;
1253   reloc_howto_type *howto16_table = elf_mips16_howto_table_rel;
1254 
1255   for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
1256        i++)
1257     {
1258       if (mips_reloc_map[i].bfd_val == code)
1259 	return &howto_table[(int) mips_reloc_map[i].elf_val];
1260     }
1261 
1262   for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
1263        i++)
1264     {
1265       if (mips16_reloc_map[i].bfd_val == code)
1266 	return &howto16_table[(int) mips16_reloc_map[i].elf_val];
1267     }
1268 
1269   switch (code)
1270     {
1271     default:
1272       bfd_set_error (bfd_error_bad_value);
1273       return NULL;
1274 
1275     case BFD_RELOC_CTOR:
1276       /* We need to handle BFD_RELOC_CTOR specially.
1277 	 Select the right relocation (R_MIPS_32 or R_MIPS_64) based on the
1278 	 size of addresses of the ABI.  */
1279       if ((elf_elfheader (abfd)->e_flags & (E_MIPS_ABI_O64
1280 					    | E_MIPS_ABI_EABI64)) != 0)
1281 	return &elf_mips_ctor64_howto;
1282       else
1283 	return &howto_table[(int) R_MIPS_32];
1284 
1285     case BFD_RELOC_VTABLE_INHERIT:
1286       return &elf_mips_gnu_vtinherit_howto;
1287     case BFD_RELOC_VTABLE_ENTRY:
1288       return &elf_mips_gnu_vtentry_howto;
1289     case BFD_RELOC_32_PCREL:
1290       return &elf_mips_gnu_pcrel32;
1291     }
1292 }
1293 
1294 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
1295 
1296 static reloc_howto_type *
1297 mips_elf32_rtype_to_howto (unsigned int r_type,
1298 			   bfd_boolean rela_p ATTRIBUTE_UNUSED)
1299 {
1300   switch (r_type)
1301     {
1302     case R_MIPS_GNU_VTINHERIT:
1303       return &elf_mips_gnu_vtinherit_howto;
1304     case R_MIPS_GNU_VTENTRY:
1305       return &elf_mips_gnu_vtentry_howto;
1306     case R_MIPS_GNU_REL16_S2:
1307       return &elf_mips_gnu_rel16_s2;
1308     case R_MIPS_PC32:
1309       return &elf_mips_gnu_pcrel32;
1310     default:
1311       if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
1312         return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
1313       BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
1314       return &elf_mips_howto_table_rel[r_type];
1315     }
1316 }
1317 
1318 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
1319 
1320 static void
1321 mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
1322 {
1323   const struct elf_backend_data *bed;
1324   unsigned int r_type;
1325 
1326   r_type = ELF32_R_TYPE (dst->r_info);
1327   bed = get_elf_backend_data (abfd);
1328   cache_ptr->howto = bed->elf_backend_mips_rtype_to_howto (r_type, FALSE);
1329 
1330   /* The addend for a GPREL16 or LITERAL relocation comes from the GP
1331      value for the object file.  We get the addend now, rather than
1332      when we do the relocation, because the symbol manipulations done
1333      by the linker may cause us to lose track of the input BFD.  */
1334   if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
1335       && (r_type == (unsigned int) R_MIPS_GPREL16
1336 	  || r_type == (unsigned int) R_MIPS_LITERAL))
1337     cache_ptr->addend = elf_gp (abfd);
1338 }
1339 
1340 /* Given a MIPS Elf_Internal_Rela, fill in an arelent structure.  */
1341 
1342 static void
1343 mips_info_to_howto_rela (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
1344 {
1345   mips_info_to_howto_rel (abfd, cache_ptr, dst);
1346 
1347   /* If we ever need to do any extra processing with dst->r_addend
1348      (the field omitted in an Elf_Internal_Rel) we can do it here.  */
1349 }
1350 
1351 /* Determine whether a symbol is global for the purposes of splitting
1352    the symbol table into global symbols and local symbols.  At least
1353    on Irix 5, this split must be between section symbols and all other
1354    symbols.  On most ELF targets the split is between static symbols
1355    and externally visible symbols.  */
1356 
1357 static bfd_boolean
1358 mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
1359 {
1360   if (SGI_COMPAT (abfd))
1361     return (sym->flags & BSF_SECTION_SYM) == 0;
1362   else
1363     return ((sym->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1364 	    || bfd_is_und_section (bfd_get_section (sym))
1365 	    || bfd_is_com_section (bfd_get_section (sym)));
1366 }
1367 
1368 /* Set the right machine number for a MIPS ELF file.  */
1369 
1370 static bfd_boolean
1371 mips_elf32_object_p (bfd *abfd)
1372 {
1373   unsigned long mach;
1374 
1375   /* Irix 5 and 6 are broken.  Object file symbol tables are not always
1376      sorted correctly such that local symbols precede global symbols,
1377      and the sh_info field in the symbol table is not always right.  */
1378   if (SGI_COMPAT (abfd))
1379     elf_bad_symtab (abfd) = TRUE;
1380 
1381   if (ABI_N32_P (abfd))
1382     return FALSE;
1383 
1384   mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
1385   bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
1386 
1387   return TRUE;
1388 }
1389 
1390 /* MIPS ELF local labels start with '$', not 'L'.  */
1391 
1392 static bfd_boolean
1393 mips_elf_is_local_label_name (bfd *abfd, const char *name)
1394 {
1395   if (name[0] == '$')
1396     return TRUE;
1397 
1398   /* On Irix 6, the labels go back to starting with '.', so we accept
1399      the generic ELF local label syntax as well.  */
1400   return _bfd_elf_is_local_label_name (abfd, name);
1401 }
1402 
1403 /* Support for core dump NOTE sections.  */
1404 static bfd_boolean
1405 elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1406 {
1407   int offset;
1408   unsigned int size;
1409 
1410   switch (note->descsz)
1411     {
1412       default:
1413 	return FALSE;
1414 
1415       case 256:		/* Linux/MIPS */
1416 	/* pr_cursig */
1417 	elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1418 
1419 	/* pr_pid */
1420 	elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
1421 
1422 	/* pr_reg */
1423 	offset = 72;
1424 	size = 180;
1425 
1426 	break;
1427     }
1428 
1429   /* Make a ".reg/999" section.  */
1430   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1431 					  size, note->descpos + offset);
1432 }
1433 
1434 static bfd_boolean
1435 elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1436 {
1437   switch (note->descsz)
1438     {
1439       default:
1440 	return FALSE;
1441 
1442       case 128:		/* Linux/MIPS elf_prpsinfo */
1443 	elf_tdata (abfd)->core_program
1444 	 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
1445 	elf_tdata (abfd)->core_command
1446 	 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
1447     }
1448 
1449   /* Note that for some reason, a spurious space is tacked
1450      onto the end of the args in some (at least one anyway)
1451      implementations, so strip it off if it exists.  */
1452 
1453   {
1454     char *command = elf_tdata (abfd)->core_command;
1455     int n = strlen (command);
1456 
1457     if (0 < n && command[n - 1] == ' ')
1458       command[n - 1] = '\0';
1459   }
1460 
1461   return TRUE;
1462 }
1463 
1464 /* Depending on the target vector we generate some version of Irix
1465    executables or "normal" MIPS ELF ABI executables.  */
1466 static irix_compat_t
1467 elf32_mips_irix_compat (bfd *abfd)
1468 {
1469   if ((abfd->xvec == &bfd_elf32_bigmips_vec)
1470       || (abfd->xvec == &bfd_elf32_littlemips_vec))
1471     return ict_irix5;
1472   else
1473     return ict_none;
1474 }
1475 
1476 /* ECOFF swapping routines.  These are used when dealing with the
1477    .mdebug section, which is in the ECOFF debugging format.  */
1478 static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
1479   /* Symbol table magic number.  */
1480   magicSym,
1481   /* Alignment of debugging information.  E.g., 4.  */
1482   4,
1483   /* Sizes of external symbolic information.  */
1484   sizeof (struct hdr_ext),
1485   sizeof (struct dnr_ext),
1486   sizeof (struct pdr_ext),
1487   sizeof (struct sym_ext),
1488   sizeof (struct opt_ext),
1489   sizeof (struct fdr_ext),
1490   sizeof (struct rfd_ext),
1491   sizeof (struct ext_ext),
1492   /* Functions to swap in external symbolic data.  */
1493   ecoff_swap_hdr_in,
1494   ecoff_swap_dnr_in,
1495   ecoff_swap_pdr_in,
1496   ecoff_swap_sym_in,
1497   ecoff_swap_opt_in,
1498   ecoff_swap_fdr_in,
1499   ecoff_swap_rfd_in,
1500   ecoff_swap_ext_in,
1501   _bfd_ecoff_swap_tir_in,
1502   _bfd_ecoff_swap_rndx_in,
1503   /* Functions to swap out external symbolic data.  */
1504   ecoff_swap_hdr_out,
1505   ecoff_swap_dnr_out,
1506   ecoff_swap_pdr_out,
1507   ecoff_swap_sym_out,
1508   ecoff_swap_opt_out,
1509   ecoff_swap_fdr_out,
1510   ecoff_swap_rfd_out,
1511   ecoff_swap_ext_out,
1512   _bfd_ecoff_swap_tir_out,
1513   _bfd_ecoff_swap_rndx_out,
1514   /* Function to read in symbolic data.  */
1515   _bfd_mips_elf_read_ecoff_info
1516 };
1517 
1518 #define ELF_ARCH			bfd_arch_mips
1519 #define ELF_MACHINE_CODE		EM_MIPS
1520 
1521 #define elf_backend_collect		TRUE
1522 #define elf_backend_type_change_ok	TRUE
1523 #define elf_backend_can_gc_sections	TRUE
1524 #define elf_info_to_howto		mips_info_to_howto_rela
1525 #define elf_info_to_howto_rel		mips_info_to_howto_rel
1526 #define elf_backend_sym_is_global	mips_elf_sym_is_global
1527 #define elf_backend_object_p		mips_elf32_object_p
1528 #define elf_backend_symbol_processing	_bfd_mips_elf_symbol_processing
1529 #define elf_backend_section_processing	_bfd_mips_elf_section_processing
1530 #define elf_backend_section_from_shdr	_bfd_mips_elf_section_from_shdr
1531 #define elf_backend_fake_sections	_bfd_mips_elf_fake_sections
1532 #define elf_backend_section_from_bfd_section \
1533 					_bfd_mips_elf_section_from_bfd_section
1534 #define elf_backend_add_symbol_hook	_bfd_mips_elf_add_symbol_hook
1535 #define elf_backend_link_output_symbol_hook \
1536 					_bfd_mips_elf_link_output_symbol_hook
1537 #define elf_backend_create_dynamic_sections \
1538 					_bfd_mips_elf_create_dynamic_sections
1539 #define elf_backend_check_relocs	_bfd_mips_elf_check_relocs
1540 #define elf_backend_adjust_dynamic_symbol \
1541 					_bfd_mips_elf_adjust_dynamic_symbol
1542 #define elf_backend_always_size_sections \
1543 					_bfd_mips_elf_always_size_sections
1544 #define elf_backend_size_dynamic_sections \
1545 					_bfd_mips_elf_size_dynamic_sections
1546 #define elf_backend_relocate_section	_bfd_mips_elf_relocate_section
1547 #define elf_backend_finish_dynamic_symbol \
1548 					_bfd_mips_elf_finish_dynamic_symbol
1549 #define elf_backend_finish_dynamic_sections \
1550 					_bfd_mips_elf_finish_dynamic_sections
1551 #define elf_backend_final_write_processing \
1552 					_bfd_mips_elf_final_write_processing
1553 #define elf_backend_additional_program_headers \
1554 					_bfd_mips_elf_additional_program_headers
1555 #define elf_backend_modify_segment_map	_bfd_mips_elf_modify_segment_map
1556 #define elf_backend_gc_mark_hook	_bfd_mips_elf_gc_mark_hook
1557 #define elf_backend_gc_sweep_hook	_bfd_mips_elf_gc_sweep_hook
1558 #define elf_backend_copy_indirect_symbol \
1559 					_bfd_mips_elf_copy_indirect_symbol
1560 #define elf_backend_hide_symbol		_bfd_mips_elf_hide_symbol
1561 #define elf_backend_grok_prstatus	elf32_mips_grok_prstatus
1562 #define elf_backend_grok_psinfo		elf32_mips_grok_psinfo
1563 #define elf_backend_ecoff_debug_swap	&mips_elf32_ecoff_debug_swap
1564 
1565 #define elf_backend_got_header_size	(4 * MIPS_RESERVED_GOTNO)
1566 #define elf_backend_may_use_rel_p	1
1567 #define elf_backend_may_use_rela_p	0
1568 #define elf_backend_default_use_rela_p	0
1569 #define elf_backend_sign_extend_vma	TRUE
1570 
1571 #define elf_backend_discard_info	_bfd_mips_elf_discard_info
1572 #define elf_backend_ignore_discarded_relocs \
1573 					_bfd_mips_elf_ignore_discarded_relocs
1574 #define elf_backend_mips_irix_compat	elf32_mips_irix_compat
1575 #define elf_backend_mips_rtype_to_howto	mips_elf32_rtype_to_howto
1576 #define bfd_elf32_bfd_is_local_label_name \
1577 					mips_elf_is_local_label_name
1578 #define bfd_elf32_find_nearest_line	_bfd_mips_elf_find_nearest_line
1579 #define bfd_elf32_find_inliner_info	_bfd_mips_elf_find_inliner_info
1580 #define bfd_elf32_new_section_hook	_bfd_mips_elf_new_section_hook
1581 #define bfd_elf32_set_section_contents	_bfd_mips_elf_set_section_contents
1582 #define bfd_elf32_bfd_get_relocated_section_contents \
1583 				_bfd_elf_mips_get_relocated_section_contents
1584 #define bfd_elf32_bfd_link_hash_table_create \
1585 					_bfd_mips_elf_link_hash_table_create
1586 #define bfd_elf32_bfd_final_link	_bfd_mips_elf_final_link
1587 #define bfd_elf32_bfd_merge_private_bfd_data \
1588 					_bfd_mips_elf_merge_private_bfd_data
1589 #define bfd_elf32_bfd_set_private_flags	_bfd_mips_elf_set_private_flags
1590 #define bfd_elf32_bfd_print_private_bfd_data \
1591 					_bfd_mips_elf_print_private_bfd_data
1592 
1593 /* Support for SGI-ish mips targets.  */
1594 #define TARGET_LITTLE_SYM		bfd_elf32_littlemips_vec
1595 #define TARGET_LITTLE_NAME		"elf32-littlemips"
1596 #define TARGET_BIG_SYM			bfd_elf32_bigmips_vec
1597 #define TARGET_BIG_NAME			"elf32-bigmips"
1598 
1599 /* The SVR4 MIPS ABI says that this should be 0x10000, but Irix 5 uses
1600    a value of 0x1000, and we are compatible.  */
1601 #define ELF_MAXPAGESIZE			0x1000
1602 
1603 #include "elf32-target.h"
1604 
1605 /* Support for traditional mips targets.  */
1606 #undef TARGET_LITTLE_SYM
1607 #undef TARGET_LITTLE_NAME
1608 #undef TARGET_BIG_SYM
1609 #undef TARGET_BIG_NAME
1610 
1611 #undef ELF_MAXPAGESIZE
1612 
1613 #define TARGET_LITTLE_SYM               bfd_elf32_tradlittlemips_vec
1614 #define TARGET_LITTLE_NAME              "elf32-tradlittlemips"
1615 #define TARGET_BIG_SYM                  bfd_elf32_tradbigmips_vec
1616 #define TARGET_BIG_NAME                 "elf32-tradbigmips"
1617 
1618 /* The SVR4 MIPS ABI says that this should be 0x10000, and Linux uses
1619    page sizes of up to that limit, so we need to respect it.  */
1620 #define ELF_MAXPAGESIZE			0x10000
1621 #define elf32_bed			elf32_tradbed
1622 
1623 /* Include the target file again for this target.  */
1624 #include "elf32-target.h"
1625 
1626 
1627 /* Specific to VxWorks.  */
1628 static reloc_howto_type mips_vxworks_copy_howto_rela =
1629   HOWTO (R_MIPS_COPY,		/* type */
1630 	 0,			/* rightshift */
1631 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1632 	 32,			/* bitsize */
1633 	 FALSE,			/* pc_relative */
1634 	 0,			/* bitpos */
1635 	 complain_overflow_bitfield, /* complain_on_overflow */
1636 	 bfd_elf_generic_reloc,	/* special_function */
1637 	 "R_MIPS_COPY",		/* name */
1638 	 FALSE,			/* partial_inplace */
1639 	 0x0,         		/* src_mask */
1640 	 0x0,		        /* dst_mask */
1641 	 FALSE);		/* pcrel_offset */
1642 
1643 /* Specific to VxWorks.  */
1644 static reloc_howto_type mips_vxworks_jump_slot_howto_rela =
1645   HOWTO (R_MIPS_JUMP_SLOT,	/* type */
1646 	 0,			/* rightshift */
1647 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1648 	 32,			/* bitsize */
1649 	 FALSE,			/* pc_relative */
1650 	 0,			/* bitpos */
1651 	 complain_overflow_bitfield, /* complain_on_overflow */
1652 	 bfd_elf_generic_reloc,	/* special_function */
1653 	 "R_MIPS_JUMP_SLOT",	/* name */
1654 	 FALSE,			/* partial_inplace */
1655 	 0x0,         		/* src_mask */
1656 	 0x0,		        /* dst_mask */
1657 	 FALSE);		/* pcrel_offset */
1658 
1659 /* Implement elf_backend_bfd_reloc_type_lookup for VxWorks.  */
1660 
1661 static reloc_howto_type *
1662 mips_vxworks_bfd_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code)
1663 {
1664   switch (code)
1665     {
1666     case BFD_RELOC_MIPS_COPY:
1667       return &mips_vxworks_copy_howto_rela;
1668     case BFD_RELOC_MIPS_JUMP_SLOT:
1669       return &mips_vxworks_jump_slot_howto_rela;
1670     default:
1671       return bfd_elf32_bfd_reloc_type_lookup (abfd, code);
1672     }
1673 }
1674 
1675 /* Implement elf_backend_mips_rtype_to_lookup for VxWorks.  */
1676 
1677 static reloc_howto_type *
1678 mips_vxworks_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
1679 {
1680   switch (r_type)
1681     {
1682     case R_MIPS_COPY:
1683       return &mips_vxworks_copy_howto_rela;
1684     case R_MIPS_JUMP_SLOT:
1685       return &mips_vxworks_jump_slot_howto_rela;
1686     default:
1687       return mips_elf32_rtype_to_howto (r_type, rela_p);
1688     }
1689 }
1690 
1691 /* Implement elf_backend_final_write_processing for VxWorks.  */
1692 
1693 static void
1694 mips_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
1695 {
1696   _bfd_mips_elf_final_write_processing (abfd, linker);
1697   elf_vxworks_final_write_processing (abfd, linker);
1698 }
1699 
1700 #undef TARGET_LITTLE_SYM
1701 #undef TARGET_LITTLE_NAME
1702 #undef TARGET_BIG_SYM
1703 #undef TARGET_BIG_NAME
1704 
1705 #define TARGET_LITTLE_SYM               bfd_elf32_littlemips_vxworks_vec
1706 #define TARGET_LITTLE_NAME              "elf32-littlemips-vxworks"
1707 #define TARGET_BIG_SYM                  bfd_elf32_bigmips_vxworks_vec
1708 #define TARGET_BIG_NAME                 "elf32-bigmips-vxworks"
1709 
1710 #undef elf32_bed
1711 #define elf32_bed			elf32_mips_vxworks_bed
1712 
1713 #undef ELF_MAXPAGESIZE
1714 #define ELF_MAXPAGESIZE			0x1000
1715 
1716 #undef elf_backend_want_got_plt
1717 #define elf_backend_want_got_plt		1
1718 #undef elf_backend_want_plt_sym
1719 #define elf_backend_want_plt_sym		1
1720 #undef elf_backend_got_symbol_offset
1721 #define elf_backend_got_symbol_offset		0
1722 #undef elf_backend_want_dynbss
1723 #define elf_backend_want_dynbss			1
1724 #undef elf_backend_may_use_rel_p
1725 #define elf_backend_may_use_rel_p		0
1726 #undef elf_backend_may_use_rela_p
1727 #define elf_backend_may_use_rela_p		1
1728 #undef elf_backend_default_use_rela_p
1729 #define elf_backend_default_use_rela_p		1
1730 #undef elf_backend_got_header_size
1731 #define elf_backend_got_header_size		(4 * 3)
1732 #undef elf_backend_plt_readonly
1733 #define elf_backend_plt_readonly		1
1734 
1735 #undef bfd_elf32_bfd_reloc_type_lookup
1736 #define bfd_elf32_bfd_reloc_type_lookup \
1737   mips_vxworks_bfd_reloc_type_lookup
1738 #undef elf_backend_mips_rtype_to_howto
1739 #define elf_backend_mips_rtype_to_howto	\
1740   mips_vxworks_rtype_to_howto
1741 #undef elf_backend_adjust_dynamic_symbol
1742 #define elf_backend_adjust_dynamic_symbol \
1743   _bfd_mips_vxworks_adjust_dynamic_symbol
1744 #undef elf_backend_finish_dynamic_symbol
1745 #define elf_backend_finish_dynamic_symbol \
1746   _bfd_mips_vxworks_finish_dynamic_symbol
1747 #undef bfd_elf32_bfd_link_hash_table_create
1748 #define bfd_elf32_bfd_link_hash_table_create \
1749   _bfd_mips_vxworks_link_hash_table_create
1750 #undef elf_backend_add_symbol_hook
1751 #define elf_backend_add_symbol_hook \
1752   elf_vxworks_add_symbol_hook
1753 #undef elf_backend_link_output_symbol_hook
1754 #define elf_backend_link_output_symbol_hook \
1755   elf_vxworks_link_output_symbol_hook
1756 #undef elf_backend_emit_relocs
1757 #define elf_backend_emit_relocs \
1758   elf_vxworks_emit_relocs
1759 #undef elf_backend_final_write_processing
1760 #define elf_backend_final_write_processing \
1761   mips_vxworks_final_write_processing
1762 
1763 #undef elf_backend_additional_program_headers
1764 #undef elf_backend_modify_segment_map
1765 #undef elf_backend_symbol_processing
1766 /* NOTE: elf_backend_rela_normal is not defined for MIPS.  */
1767 
1768 #include "elf32-target.h"
1769