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