start-sanitize-d10v
[external/binutils.git] / bfd / elf32-mips.c
1 /* MIPS-specific support for 32-bit ELF
2    Copyright 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
3
4    Most of the information added by Ian Lance Taylor, Cygnus Support,
5    <ian@cygnus.com>.
6
7 This file is part of BFD, the Binary File Descriptor library.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
22
23 /* This file handles MIPS ELF targets.  SGI Irix 5 uses a slightly
24    different MIPS ELF from other targets.  This matters when linking.
25    This file supports both, switching at runtime.  */
26
27 #include "bfd.h"
28 #include "sysdep.h"
29 #include "libbfd.h"
30 #include "bfdlink.h"
31 #include "genlink.h"
32 #include "elf-bfd.h"
33 #include "elf/mips.h"
34
35 /* Get the ECOFF swapping routines.  */
36 #include "coff/sym.h"
37 #include "coff/symconst.h"
38 #include "coff/internal.h"
39 #include "coff/ecoff.h"
40 #include "coff/mips.h"
41 #define ECOFF_32
42 #include "ecoffswap.h"
43
44 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
45   PARAMS ((bfd *, bfd_reloc_code_real_type));
46 static void mips_info_to_howto_rel
47   PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
48 static void bfd_mips_elf32_swap_gptab_in
49   PARAMS ((bfd *, const Elf32_External_gptab *, Elf32_gptab *));
50 static void bfd_mips_elf32_swap_gptab_out
51   PARAMS ((bfd *, const Elf32_gptab *, Elf32_External_gptab *));
52 static boolean mips_elf_sym_is_global PARAMS ((bfd *, asymbol *));
53 static boolean mips_elf32_object_p PARAMS ((bfd *));
54 static boolean mips_elf_create_procedure_table
55   PARAMS ((PTR, bfd *, struct bfd_link_info *, asection *,
56            struct ecoff_debug_info *));
57 static int mips_elf_additional_program_headers PARAMS ((bfd *));
58 static boolean mips_elf_modify_segment_map PARAMS ((bfd *));
59 static boolean mips_elf32_section_from_shdr
60   PARAMS ((bfd *, Elf32_Internal_Shdr *, char *));
61 static boolean mips_elf32_section_processing
62   PARAMS ((bfd *, Elf32_Internal_Shdr *));
63 static boolean mips_elf_is_local_label
64   PARAMS ((bfd *, asymbol *));
65 static struct bfd_hash_entry *mips_elf_link_hash_newfunc
66   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
67 static struct bfd_link_hash_table *mips_elf_link_hash_table_create
68   PARAMS ((bfd *));
69 static int gptab_compare PARAMS ((const void *, const void *));
70 static boolean mips_elf_final_link
71   PARAMS ((bfd *, struct bfd_link_info *));
72 static void mips_elf_relocate_hi16
73   PARAMS ((bfd *, Elf_Internal_Rela *, Elf_Internal_Rela *, bfd_byte *,
74            bfd_vma));
75 static void mips_elf_relocate_got_local
76   PARAMS ((bfd *, bfd *, asection *, Elf_Internal_Rela *,
77            Elf_Internal_Rela *, bfd_byte *, bfd_vma));
78 static void mips_elf_relocate_global_got
79    PARAMS ((bfd *, Elf_Internal_Rela *, bfd_byte *, bfd_vma));
80 static boolean mips_elf_adjust_dynindx
81   PARAMS ((struct elf_link_hash_entry *, PTR));
82 static boolean mips_elf_relocate_section
83   PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
84            Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
85 static boolean mips_elf_create_dynamic_sections
86   PARAMS ((bfd *, struct bfd_link_info *));
87 static boolean mips_elf_create_compact_rel_section
88   PARAMS ((bfd *, struct bfd_link_info *));
89 static boolean mips_elf_create_got_section
90   PARAMS ((bfd *, struct bfd_link_info *));
91 static boolean mips_elf_check_relocs
92   PARAMS ((bfd *, struct bfd_link_info *, asection *,
93            const Elf_Internal_Rela *));
94 static boolean mips_elf_adjust_dynamic_symbol
95   PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
96 static boolean mips_elf_size_dynamic_sections
97   PARAMS ((bfd *, struct bfd_link_info *));
98 static boolean mips_elf_finish_dynamic_symbol
99   PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
100            Elf_Internal_Sym *));
101 static boolean mips_elf_finish_dynamic_sections
102   PARAMS ((bfd *, struct bfd_link_info *));
103 static boolean mips_elf_add_symbol_hook
104   PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
105            const char **, flagword *, asection **, bfd_vma *));
106 static bfd_reloc_status_type mips_elf_final_gp
107   PARAMS ((bfd *, asymbol *, boolean, char **, bfd_vma *));
108 static bfd_byte *elf32_mips_get_relocated_section_contents
109   PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
110            bfd_byte *, boolean, asymbol **));
111
112 /* This is true for Irix 5 executables, false for normal MIPS ELF ABI
113    executables.  FIXME: At the moment, we default to always generating
114    Irix 5 executables.  */
115
116 #define SGI_COMPAT(abfd) (1)
117
118 /* This structure is used to hold .got information when linking.  It
119    is stored in the tdata field of the bfd_elf_section_data structure.  */
120
121 struct mips_got_info
122 {
123   /* The symbol index of the first global .got symbol.  */
124   unsigned long global_gotsym;
125   /* The number of local .got entries.  */
126   unsigned int local_gotno;
127 };
128
129 /* The number of local .got entries we reserve.  */
130 #define MIPS_RESERVED_GOTNO (2)
131
132 /* Instructions which appear in a stub.  For some reason the stub is
133    slightly different on an SGI system.  */
134 #define ELF_MIPS_GP_OFFSET(abfd) (SGI_COMPAT (abfd) ? 0x7ff0 : 0x8000)
135 #define STUB_LW(abfd)                                   \
136   (SGI_COMPAT (abfd)                                    \
137    ? 0x8f998010                 /* lw t9,0x8010(gp) */  \
138    : 0x8f998000)                /* lw t9,0x8000(gp) */
139 #define STUB_MOVE 0x03e07825    /* move t7,ra */
140 #define STUB_JALR 0x0320f809    /* jal t9 */
141 #define STUB_LI16 0x34180000    /* ori t8,zero,0 */
142 #define MIPS_FUNCTION_STUB_SIZE (16)
143
144 /* Names of sections which appear in the .dynsym section in an Irix 5
145    executable.  */
146
147 static const char * const mips_elf_dynsym_sec_names[] =
148 {
149   ".text",
150   ".init",
151   ".fini",
152   ".data",
153   ".rodata",
154   ".sdata",
155   ".sbss",
156   ".bss",
157   NULL
158 };
159
160 #define SIZEOF_MIPS_DYNSYM_SECNAMES \
161   (sizeof mips_elf_dynsym_sec_names / sizeof mips_elf_dynsym_sec_names[0])
162
163 /* The number of entries in mips_elf_dynsym_sec_names which go in the
164    text segment.  */
165
166 #define MIPS_TEXT_DYNSYM_SECNO (3)
167
168 /* The names of the runtime procedure table symbols used on Irix 5.  */
169
170 static const char * const mips_elf_dynsym_rtproc_names[] =
171 {
172   "_procedure_table",
173   "_procedure_string_table",
174   "_procedure_table_size",
175   NULL
176 };
177
178 /* These structures are used to generate the .compact_rel section on
179    Irix 5.  */
180
181 typedef struct
182 {
183   unsigned long id1;            /* Always one?  */
184   unsigned long num;            /* Number of compact relocation entries.  */
185   unsigned long id2;            /* Always two?  */
186   unsigned long offset;         /* The file offset of the first relocation.  */
187   unsigned long reserved0;      /* Zero?  */
188   unsigned long reserved1;      /* Zero?  */
189 } Elf32_compact_rel;
190
191 typedef struct
192 {
193   bfd_byte id1[4];
194   bfd_byte num[4];
195   bfd_byte id2[4];
196   bfd_byte offset[4];
197   bfd_byte reserved0[4];
198   bfd_byte reserved1[4];
199 } Elf32_External_compact_rel;
200
201 typedef struct
202 {
203   unsigned int ctype : 1;       /* 1: long 0: short format. See below.  */
204   unsigned int rtype : 4;       /* Relocation types. See below. */
205   unsigned int dist2to : 8;
206   unsigned int relvaddr : 19;   /* (VADDR - vaddr of the previous entry)/ 4 */
207   unsigned long konst;          /* KONST field. See below.  */
208   unsigned long vaddr;          /* VADDR to be relocated.  */
209 } Elf32_crinfo;
210
211 typedef struct
212 {
213   unsigned int ctype : 1;       /* 1: long 0: short format. See below.  */
214   unsigned int rtype : 4;       /* Relocation types. See below. */
215   unsigned int dist2to : 8;
216   unsigned int relvaddr : 19;   /* (VADDR - vaddr of the previous entry)/ 4 */
217   unsigned long konst;          /* KONST field. See below.  */
218 } Elf32_crinfo2;
219
220 typedef struct
221 {
222   bfd_byte info[4];
223   bfd_byte konst[4];
224   bfd_byte vaddr[4];
225 } Elf32_External_crinfo;
226
227 typedef struct
228 {
229   bfd_byte info[4];
230   bfd_byte konst[4];
231 } Elf32_External_crinfo2;
232
233 /* These are the constants used to swap the bitfields in a crinfo.  */
234
235 #define CRINFO_CTYPE (0x1)
236 #define CRINFO_CTYPE_SH (31)
237 #define CRINFO_RTYPE (0xf)
238 #define CRINFO_RTYPE_SH (27)
239 #define CRINFO_DIST2TO (0xff)
240 #define CRINFO_DIST2TO_SH (19)
241 #define CRINFO_RELVADDR (0x7ffff)
242 #define CRINFO_RELVADDR_SH (0)
243
244 /* A compact relocation info has long (3 words) or short (2 words)
245    formats.  A short format doesn't have VADDR field and relvaddr
246    fields contains ((VADDR - vaddr of the previous entry) >> 2).  */
247 #define CRF_MIPS_LONG                   1
248 #define CRF_MIPS_SHORT                  0
249
250 /* There are 4 types of compact relocation at least. The value KONST
251    has different meaning for each type:
252
253    (type)               (konst)
254    CT_MIPS_REL32        Address in data
255    CT_MIPS_WORD         Address in word (XXX)
256    CT_MIPS_GPHI_LO      GP - vaddr
257    CT_MIPS_JMPAD        Address to jump
258    */
259
260 #define CRT_MIPS_REL32                  0xa
261 #define CRT_MIPS_WORD                   0xb
262 #define CRT_MIPS_GPHI_LO                0xc
263 #define CRT_MIPS_JMPAD                  0xd
264
265 #define mips_elf_set_cr_format(x,format)        ((x).ctype = (format))
266 #define mips_elf_set_cr_type(x,type)            ((x).rtype = (type))
267 #define mips_elf_set_cr_dist2to(x,v)            ((x).dist2to = (v))
268 #define mips_elf_set_cr_relvaddr(x,d)           ((x).relvaddr = (d)<<2)
269
270 static void bfd_elf32_swap_compact_rel_out
271   PARAMS ((bfd *, const Elf32_compact_rel *, Elf32_External_compact_rel *));
272 static void bfd_elf32_swap_crinfo_out
273   PARAMS ((bfd *, const Elf32_crinfo *, Elf32_External_crinfo *));
274
275 #define USE_REL 1               /* MIPS uses REL relocations instead of RELA */
276
277 enum reloc_type
278 {
279   R_MIPS_NONE = 0,
280   R_MIPS_16,            R_MIPS_32,
281   R_MIPS_REL32,         R_MIPS_26,
282   R_MIPS_HI16,          R_MIPS_LO16,
283   R_MIPS_GPREL16,       R_MIPS_LITERAL,
284   R_MIPS_GOT16,         R_MIPS_PC16,
285   R_MIPS_CALL16,        R_MIPS_GPREL32,
286   /* The remaining relocs are defined on Irix, although they are not
287      in the MIPS ELF ABI.  */
288   R_MIPS_UNUSED1,       R_MIPS_UNUSED2,
289   R_MIPS_UNUSED3,
290   R_MIPS_SHIFT5,        R_MIPS_SHIFT6,
291   R_MIPS_64,            R_MIPS_GOT_DISP,
292   R_MIPS_GOT_PAGE,      R_MIPS_GOT_OFST,
293   R_MIPS_GOT_HI16,      R_MIPS_GOT_LO16,
294   R_MIPS_SUB,           R_MIPS_INSERT_A,
295   R_MIPS_INSERT_B,      R_MIPS_DELETE,
296   R_MIPS_HIGHER,        R_MIPS_HIGHEST,
297   R_MIPS_CALL_HI16,     R_MIPS_CALL_LO16,
298   R_MIPS_max
299 };
300
301 static reloc_howto_type elf_mips_howto_table[] =
302 {
303   /* No relocation.  */
304   HOWTO (R_MIPS_NONE,           /* type */
305          0,                     /* rightshift */
306          0,                     /* size (0 = byte, 1 = short, 2 = long) */
307          0,                     /* bitsize */
308          false,                 /* pc_relative */
309          0,                     /* bitpos */
310          complain_overflow_dont, /* complain_on_overflow */
311          bfd_elf_generic_reloc, /* special_function */
312          "R_MIPS_NONE",         /* name */
313          false,                 /* partial_inplace */
314          0,                     /* src_mask */
315          0,                     /* dst_mask */
316          false),                /* pcrel_offset */
317
318   /* 16 bit relocation.  */
319   HOWTO (R_MIPS_16,             /* type */
320          0,                     /* rightshift */
321          1,                     /* size (0 = byte, 1 = short, 2 = long) */
322          16,                    /* bitsize */
323          false,                 /* pc_relative */
324          0,                     /* bitpos */
325          complain_overflow_bitfield, /* complain_on_overflow */
326          bfd_elf_generic_reloc, /* special_function */
327          "R_MIPS_16",           /* name */
328          true,                  /* partial_inplace */
329          0xffff,                /* src_mask */
330          0xffff,                /* dst_mask */
331          false),                /* pcrel_offset */
332
333   /* 32 bit relocation.  */
334   HOWTO (R_MIPS_32,             /* type */
335          0,                     /* rightshift */
336          2,                     /* size (0 = byte, 1 = short, 2 = long) */
337          32,                    /* bitsize */
338          false,                 /* pc_relative */
339          0,                     /* bitpos */
340          complain_overflow_bitfield, /* complain_on_overflow */
341          bfd_elf_generic_reloc, /* special_function */
342          "R_MIPS_32",           /* name */
343          true,                  /* partial_inplace */
344          0xffffffff,            /* src_mask */
345          0xffffffff,            /* dst_mask */
346          false),                /* pcrel_offset */
347
348   /* 32 bit symbol relative relocation.  */
349   HOWTO (R_MIPS_REL32,          /* type */
350          0,                     /* rightshift */
351          2,                     /* size (0 = byte, 1 = short, 2 = long) */
352          32,                    /* bitsize */
353          false,                 /* pc_relative */
354          0,                     /* bitpos */
355          complain_overflow_bitfield, /* complain_on_overflow */
356          bfd_elf_generic_reloc, /* special_function */
357          "R_MIPS_REL32",        /* name */
358          true,                  /* partial_inplace */
359          0xffffffff,            /* src_mask */
360          0xffffffff,            /* dst_mask */
361          false),                /* pcrel_offset */
362
363   /* 26 bit branch address.  */
364   HOWTO (R_MIPS_26,             /* type */
365          2,                     /* rightshift */
366          2,                     /* size (0 = byte, 1 = short, 2 = long) */
367          26,                    /* bitsize */
368          false,                 /* pc_relative */
369          0,                     /* bitpos */
370          complain_overflow_dont, /* complain_on_overflow */
371                                 /* This needs complex overflow
372                                    detection, because the upper four
373                                    bits must match the PC.  */
374          bfd_elf_generic_reloc, /* special_function */
375          "R_MIPS_26",           /* name */
376          true,                  /* partial_inplace */
377          0x3ffffff,             /* src_mask */
378          0x3ffffff,             /* dst_mask */
379          false),                /* pcrel_offset */
380
381   /* High 16 bits of symbol value.  */
382   HOWTO (R_MIPS_HI16,           /* type */
383          0,                     /* rightshift */
384          2,                     /* size (0 = byte, 1 = short, 2 = long) */
385          16,                    /* bitsize */
386          false,                 /* pc_relative */
387          0,                     /* bitpos */
388          complain_overflow_dont, /* complain_on_overflow */
389          _bfd_mips_elf_hi16_reloc,      /* special_function */
390          "R_MIPS_HI16",         /* name */
391          true,                  /* partial_inplace */
392          0xffff,                /* src_mask */
393          0xffff,                /* dst_mask */
394          false),                /* pcrel_offset */
395
396   /* Low 16 bits of symbol value.  */
397   HOWTO (R_MIPS_LO16,           /* type */
398          0,                     /* rightshift */
399          2,                     /* size (0 = byte, 1 = short, 2 = long) */
400          16,                    /* bitsize */
401          false,                 /* pc_relative */
402          0,                     /* bitpos */
403          complain_overflow_dont, /* complain_on_overflow */
404          _bfd_mips_elf_lo16_reloc,      /* special_function */
405          "R_MIPS_LO16",         /* name */
406          true,                  /* partial_inplace */
407          0xffff,                /* src_mask */
408          0xffff,                /* dst_mask */
409          false),                /* pcrel_offset */
410
411   /* GP relative reference.  */
412   HOWTO (R_MIPS_GPREL16,        /* type */
413          0,                     /* rightshift */
414          2,                     /* size (0 = byte, 1 = short, 2 = long) */
415          16,                    /* bitsize */
416          false,                 /* pc_relative */
417          0,                     /* bitpos */
418          complain_overflow_signed, /* complain_on_overflow */
419          _bfd_mips_elf_gprel16_reloc, /* special_function */
420          "R_MIPS_GPREL16",      /* name */
421          true,                  /* partial_inplace */
422          0xffff,                /* src_mask */
423          0xffff,                /* dst_mask */
424          false),                /* pcrel_offset */
425
426   /* Reference to literal section.  */
427   HOWTO (R_MIPS_LITERAL,        /* type */
428          0,                     /* rightshift */
429          2,                     /* size (0 = byte, 1 = short, 2 = long) */
430          16,                    /* bitsize */
431          false,                 /* pc_relative */
432          0,                     /* bitpos */
433          complain_overflow_signed, /* complain_on_overflow */
434          _bfd_mips_elf_gprel16_reloc, /* special_function */
435          "R_MIPS_LITERAL",      /* name */
436          true,                  /* partial_inplace */
437          0xffff,                /* src_mask */
438          0xffff,                /* dst_mask */
439          false),                /* pcrel_offset */
440
441   /* Reference to global offset table.  */
442   HOWTO (R_MIPS_GOT16,          /* type */
443          0,                     /* rightshift */
444          2,                     /* size (0 = byte, 1 = short, 2 = long) */
445          16,                    /* bitsize */
446          false,                 /* pc_relative */
447          0,                     /* bitpos */
448          complain_overflow_signed, /* complain_on_overflow */
449          _bfd_mips_elf_got16_reloc,     /* special_function */
450          "R_MIPS_GOT16",        /* name */
451          false,                 /* partial_inplace */
452          0,                     /* src_mask */
453          0xffff,                /* dst_mask */
454          false),                /* pcrel_offset */
455
456   /* 16 bit PC relative reference.  */
457   HOWTO (R_MIPS_PC16,           /* type */
458          0,                     /* rightshift */
459          2,                     /* size (0 = byte, 1 = short, 2 = long) */
460          16,                    /* bitsize */
461          true,                  /* pc_relative */
462          0,                     /* bitpos */
463          complain_overflow_signed, /* complain_on_overflow */
464          bfd_elf_generic_reloc, /* special_function */
465          "R_MIPS_PC16",         /* name */
466          true,                  /* partial_inplace */
467          0xffff,                /* src_mask */
468          0xffff,                /* dst_mask */
469          false),                /* pcrel_offset */
470
471   /* 16 bit call through global offset table.  */
472   /* FIXME: This is not handled correctly.  */
473   HOWTO (R_MIPS_CALL16,         /* type */
474          0,                     /* rightshift */
475          2,                     /* size (0 = byte, 1 = short, 2 = long) */
476          16,                    /* bitsize */
477          false,                 /* pc_relative */
478          0,                     /* bitpos */
479          complain_overflow_signed, /* complain_on_overflow */
480          bfd_elf_generic_reloc, /* special_function */
481          "R_MIPS_CALL16",       /* name */
482          false,                 /* partial_inplace */
483          0,                     /* src_mask */
484          0xffff,                /* dst_mask */
485          false),                /* pcrel_offset */
486
487   /* 32 bit GP relative reference.  */
488   HOWTO (R_MIPS_GPREL32,        /* type */
489          0,                     /* rightshift */
490          2,                     /* size (0 = byte, 1 = short, 2 = long) */
491          32,                    /* bitsize */
492          false,                 /* pc_relative */
493          0,                     /* bitpos */
494          complain_overflow_bitfield, /* complain_on_overflow */
495          _bfd_mips_elf_gprel32_reloc, /* special_function */
496          "R_MIPS_GPREL32",      /* name */
497          true,                  /* partial_inplace */
498          0xffffffff,            /* src_mask */
499          0xffffffff,            /* dst_mask */
500          false),                /* pcrel_offset */
501
502     /* The remaining relocs are defined on Irix 5, although they are
503        not defined by the ABI.  */
504     { 13 },
505     { 14 },
506     { 15 },
507
508   /* A 5 bit shift field.  */
509   HOWTO (R_MIPS_SHIFT5,         /* type */
510          0,                     /* rightshift */
511          2,                     /* size (0 = byte, 1 = short, 2 = long) */
512          5,                     /* bitsize */
513          false,                 /* pc_relative */
514          6,                     /* bitpos */
515          complain_overflow_bitfield, /* complain_on_overflow */
516          bfd_elf_generic_reloc, /* special_function */
517          "R_MIPS_SHIFT5",       /* name */
518          true,                  /* partial_inplace */
519          0x000007c0,            /* src_mask */
520          0x000007c0,            /* dst_mask */
521          false),                /* pcrel_offset */
522
523   /* A 6 bit shift field.  */
524   /* FIXME: This is not handled correctly; a special function is
525      needed to put the most significant bit in the right place.  */
526   HOWTO (R_MIPS_SHIFT6,         /* type */
527          0,                     /* rightshift */
528          2,                     /* size (0 = byte, 1 = short, 2 = long) */
529          6,                     /* bitsize */
530          false,                 /* pc_relative */
531          6,                     /* bitpos */
532          complain_overflow_bitfield, /* complain_on_overflow */
533          bfd_elf_generic_reloc, /* special_function */
534          "R_MIPS_SHIFT6",       /* name */
535          true,                  /* partial_inplace */
536          0x000007c4,            /* src_mask */
537          0x000007c4,            /* dst_mask */
538          false),                /* pcrel_offset */
539
540   /* A 64 bit relocation.  Presumably not used in 32 bit ELF.  */
541   { R_MIPS_64 },
542
543   /* Displacement in the global offset table.  */
544   /* FIXME: Not handled correctly.  */
545   HOWTO (R_MIPS_GOT_DISP,       /* type */
546          0,                     /* rightshift */
547          2,                     /* size (0 = byte, 1 = short, 2 = long) */
548          16,                    /* bitsize */
549          false,                 /* pc_relative */
550          0,                     /* bitpos */
551          complain_overflow_bitfield, /* complain_on_overflow */
552          bfd_elf_generic_reloc, /* special_function */
553          "R_MIPS_GOT_DISP",     /* name */
554          true,                  /* partial_inplace */
555          0x0000ffff,            /* src_mask */
556          0x0000ffff,            /* dst_mask */
557          false),                /* pcrel_offset */
558
559   /* Displacement to page pointer in the global offset table.  */
560   /* FIXME: Not handled correctly.  */
561   HOWTO (R_MIPS_GOT_PAGE,       /* type */
562          0,                     /* rightshift */
563          2,                     /* size (0 = byte, 1 = short, 2 = long) */
564          16,                    /* bitsize */
565          false,                 /* pc_relative */
566          0,                     /* bitpos */
567          complain_overflow_bitfield, /* complain_on_overflow */
568          bfd_elf_generic_reloc, /* special_function */
569          "R_MIPS_GOT_PAGE",     /* name */
570          true,                  /* partial_inplace */
571          0x0000ffff,            /* src_mask */
572          0x0000ffff,            /* dst_mask */
573          false),                /* pcrel_offset */
574
575   /* Offset from page pointer in the global offset table.  */
576   /* FIXME: Not handled correctly.  */
577   HOWTO (R_MIPS_GOT_OFST,       /* type */
578          0,                     /* rightshift */
579          2,                     /* size (0 = byte, 1 = short, 2 = long) */
580          16,                    /* bitsize */
581          false,                 /* pc_relative */
582          0,                     /* bitpos */
583          complain_overflow_bitfield, /* complain_on_overflow */
584          bfd_elf_generic_reloc, /* special_function */
585          "R_MIPS_GOT_OFST",     /* name */
586          true,                  /* partial_inplace */
587          0x0000ffff,            /* src_mask */
588          0x0000ffff,            /* dst_mask */
589          false),                /* pcrel_offset */
590
591   /* High 16 bits of displacement in global offset table.  */
592   /* FIXME: Not handled correctly.  */
593   HOWTO (R_MIPS_GOT_HI16,       /* type */
594          0,                     /* rightshift */
595          2,                     /* size (0 = byte, 1 = short, 2 = long) */
596          16,                    /* bitsize */
597          false,                 /* pc_relative */
598          0,                     /* bitpos */
599          complain_overflow_dont, /* complain_on_overflow */
600          bfd_elf_generic_reloc, /* special_function */
601          "R_MIPS_GOT_HI16",     /* name */
602          true,                  /* partial_inplace */
603          0x0000ffff,            /* src_mask */
604          0x0000ffff,            /* dst_mask */
605          false),                /* pcrel_offset */
606
607   /* Low 16 bits of displacement in global offset table.  */
608   /* FIXME: Not handled correctly.  */
609   HOWTO (R_MIPS_GOT_LO16,       /* type */
610          0,                     /* rightshift */
611          2,                     /* size (0 = byte, 1 = short, 2 = long) */
612          16,                    /* bitsize */
613          false,                 /* pc_relative */
614          0,                     /* bitpos */
615          complain_overflow_dont, /* complain_on_overflow */
616          bfd_elf_generic_reloc, /* special_function */
617          "R_MIPS_GOT_LO16",     /* name */
618          true,                  /* partial_inplace */
619          0x0000ffff,            /* src_mask */
620          0x0000ffff,            /* dst_mask */
621          false),                /* pcrel_offset */
622
623   /* 64 bit subtraction.  Presumably not used in 32 bit ELF.  */
624   { R_MIPS_SUB },
625
626   /* Used to cause the linker to insert and delete instructions?  */
627   { R_MIPS_INSERT_A },
628   { R_MIPS_INSERT_B },
629   { R_MIPS_DELETE },
630
631   /* Get the higher values of a 64 bit addend.  Presumably not used in
632      32 bit ELF.  */
633   { R_MIPS_HIGHER },
634   { R_MIPS_HIGHEST },
635
636   /* High 16 bits of displacement in global offset table.  */
637   /* FIXME: Not handled correctly.  */
638   HOWTO (R_MIPS_CALL_HI16,      /* type */
639          0,                     /* rightshift */
640          2,                     /* size (0 = byte, 1 = short, 2 = long) */
641          16,                    /* bitsize */
642          false,                 /* pc_relative */
643          0,                     /* bitpos */
644          complain_overflow_dont, /* complain_on_overflow */
645          bfd_elf_generic_reloc, /* special_function */
646          "R_MIPS_CALL_HI16",    /* name */
647          true,                  /* partial_inplace */
648          0x0000ffff,            /* src_mask */
649          0x0000ffff,            /* dst_mask */
650          false),                /* pcrel_offset */
651
652   /* Low 16 bits of displacement in global offset table.  */
653   /* FIXME: Not handled correctly.  */
654   HOWTO (R_MIPS_CALL_LO16,      /* type */
655          0,                     /* rightshift */
656          2,                     /* size (0 = byte, 1 = short, 2 = long) */
657          16,                    /* bitsize */
658          false,                 /* pc_relative */
659          0,                     /* bitpos */
660          complain_overflow_dont, /* complain_on_overflow */
661          bfd_elf_generic_reloc, /* special_function */
662          "R_MIPS_CALL_LO16",    /* name */
663          true,                  /* partial_inplace */
664          0x0000ffff,            /* src_mask */
665          0x0000ffff,            /* dst_mask */
666          false)                 /* pcrel_offset */
667 };
668
669 /* Do a R_MIPS_HI16 relocation.  This has to be done in combination
670    with a R_MIPS_LO16 reloc, because there is a carry from the LO16 to
671    the HI16.  Here we just save the information we need; we do the
672    actual relocation when we see the LO16.  MIPS ELF requires that the
673    LO16 immediately follow the HI16.  As a GNU extension, we permit an
674    arbitrary number of HI16 relocs to be associated with a single LO16
675    reloc.  This extension permits gcc to output the HI and LO relocs
676    itself.  */
677
678 struct mips_hi16
679 {
680   struct mips_hi16 *next;
681   bfd_byte *addr;
682   bfd_vma addend;
683 };
684
685 /* FIXME: This should not be a static variable.  */
686
687 static struct mips_hi16 *mips_hi16_list;
688
689 bfd_reloc_status_type
690 _bfd_mips_elf_hi16_reloc (abfd,
691                      reloc_entry,
692                      symbol,
693                      data,
694                      input_section,
695                      output_bfd,
696                      error_message)
697      bfd *abfd;
698      arelent *reloc_entry;
699      asymbol *symbol;
700      PTR data;
701      asection *input_section;
702      bfd *output_bfd;
703      char **error_message;
704 {
705   bfd_reloc_status_type ret;
706   bfd_vma relocation;
707   struct mips_hi16 *n;
708
709   /* If we're relocating, and this an external symbol, we don't want
710      to change anything.  */
711   if (output_bfd != (bfd *) NULL
712       && (symbol->flags & BSF_SECTION_SYM) == 0
713       && reloc_entry->addend == 0)
714     {
715       reloc_entry->address += input_section->output_offset;
716       return bfd_reloc_ok;
717     }
718
719   ret = bfd_reloc_ok;
720
721   if (strcmp (bfd_asymbol_name (symbol), "_gp_disp") == 0)
722     {
723       boolean relocateable;
724       bfd_vma gp;
725
726       if (ret == bfd_reloc_undefined)
727         abort ();
728
729       if (output_bfd != NULL)
730         relocateable = true;
731       else
732         {
733           relocateable = false;
734           output_bfd = symbol->section->output_section->owner;
735         }
736
737       ret = mips_elf_final_gp (output_bfd, symbol, relocateable,
738                                error_message, &gp);
739       if (ret != bfd_reloc_ok)
740         return ret;
741
742       relocation = gp - reloc_entry->address;
743     }
744   else
745     {
746       if (bfd_is_und_section (symbol->section)
747           && output_bfd == (bfd *) NULL)
748         ret = bfd_reloc_undefined;
749
750       if (bfd_is_com_section (symbol->section))
751         relocation = 0;
752       else
753         relocation = symbol->value;
754     }
755
756   relocation += symbol->section->output_section->vma;
757   relocation += symbol->section->output_offset;
758   relocation += reloc_entry->addend;
759
760   if (reloc_entry->address > input_section->_cooked_size)
761     return bfd_reloc_outofrange;
762
763   /* Save the information, and let LO16 do the actual relocation.  */
764   n = (struct mips_hi16 *) bfd_malloc (sizeof *n);
765   if (n == NULL)
766     return bfd_reloc_outofrange;
767   n->addr = (bfd_byte *) data + reloc_entry->address;
768   n->addend = relocation;
769   n->next = mips_hi16_list;
770   mips_hi16_list = n;
771
772   if (output_bfd != (bfd *) NULL)
773     reloc_entry->address += input_section->output_offset;
774
775   return ret;
776 }
777
778 /* Do a R_MIPS_LO16 relocation.  This is a straightforward 16 bit
779    inplace relocation; this function exists in order to do the
780    R_MIPS_HI16 relocation described above.  */
781
782 bfd_reloc_status_type
783 _bfd_mips_elf_lo16_reloc (abfd,
784                      reloc_entry,
785                      symbol,
786                      data,
787                      input_section,
788                      output_bfd,
789                      error_message)
790      bfd *abfd;
791      arelent *reloc_entry;
792      asymbol *symbol;
793      PTR data;
794      asection *input_section;
795      bfd *output_bfd;
796      char **error_message;
797 {
798   arelent gp_disp_relent;
799
800   if (mips_hi16_list != NULL)
801     {
802       struct mips_hi16 *l;
803
804       l = mips_hi16_list;
805       while (l != NULL)
806         {
807           unsigned long insn;
808           unsigned long val;
809           unsigned long vallo;
810           struct mips_hi16 *next;
811
812           /* Do the HI16 relocation.  Note that we actually don't need
813              to know anything about the LO16 itself, except where to
814              find the low 16 bits of the addend needed by the LO16.  */
815           insn = bfd_get_32 (abfd, l->addr);
816           vallo = (bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address)
817                    & 0xffff);
818           val = ((insn & 0xffff) << 16) + vallo;
819           val += l->addend;
820
821           /* The low order 16 bits are always treated as a signed
822              value.  Therefore, a negative value in the low order bits
823              requires an adjustment in the high order bits.  We need
824              to make this adjustment in two ways: once for the bits we
825              took from the data, and once for the bits we are putting
826              back in to the data.  */
827           if ((vallo & 0x8000) != 0)
828             val -= 0x10000;
829           if ((val & 0x8000) != 0)
830             val += 0x10000;
831
832           insn = (insn &~ 0xffff) | ((val >> 16) & 0xffff);
833           bfd_put_32 (abfd, insn, l->addr);
834
835           if (strcmp (bfd_asymbol_name (symbol), "_gp_disp") == 0)
836             {
837               gp_disp_relent = *reloc_entry;
838               reloc_entry = &gp_disp_relent;
839               reloc_entry->addend = l->addend;
840             }
841
842           next = l->next;
843           free (l);
844           l = next;
845         }
846
847       mips_hi16_list = NULL;
848     }
849   else if (strcmp (bfd_asymbol_name (symbol), "_gp_disp") == 0)
850     {
851       bfd_reloc_status_type ret;
852       bfd_vma gp, relocation;
853
854       /* FIXME: Does this case ever occur?  */
855
856       ret = mips_elf_final_gp (output_bfd, symbol, true, error_message, &gp);
857       if (ret != bfd_reloc_ok)
858         return ret;
859
860       relocation = gp - reloc_entry->address;
861       relocation += symbol->section->output_section->vma;
862       relocation += symbol->section->output_offset;
863       relocation += reloc_entry->addend;
864
865       if (reloc_entry->address > input_section->_cooked_size)
866         return bfd_reloc_outofrange;
867
868       gp_disp_relent = *reloc_entry;
869       reloc_entry = &gp_disp_relent;
870       reloc_entry->addend = relocation - 4;
871     }
872
873   /* Now do the LO16 reloc in the usual way.  */
874   return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
875                                 input_section, output_bfd, error_message);
876 }
877
878 /* Do a R_MIPS_GOT16 reloc.  This is a reloc against the global offset
879    table used for PIC code.  If the symbol is an external symbol, the
880    instruction is modified to contain the offset of the appropriate
881    entry in the global offset table.  If the symbol is a section
882    symbol, the next reloc is a R_MIPS_LO16 reloc.  The two 16 bit
883    addends are combined to form the real addend against the section
884    symbol; the GOT16 is modified to contain the offset of an entry in
885    the global offset table, and the LO16 is modified to offset it
886    appropriately.  Thus an offset larger than 16 bits requires a
887    modified value in the global offset table.
888
889    This implementation suffices for the assembler, but the linker does
890    not yet know how to create global offset tables.  */
891
892 bfd_reloc_status_type
893 _bfd_mips_elf_got16_reloc (abfd,
894                       reloc_entry,
895                       symbol,
896                       data,
897                       input_section,
898                       output_bfd,
899                       error_message)
900      bfd *abfd;
901      arelent *reloc_entry;
902      asymbol *symbol;
903      PTR data;
904      asection *input_section;
905      bfd *output_bfd;
906      char **error_message;
907 {
908   /* If we're relocating, and this an external symbol, we don't want
909      to change anything.  */
910   if (output_bfd != (bfd *) NULL
911       && (symbol->flags & BSF_SECTION_SYM) == 0
912       && reloc_entry->addend == 0)
913     {
914       reloc_entry->address += input_section->output_offset;
915       return bfd_reloc_ok;
916     }
917
918   /* If we're relocating, and this is a local symbol, we can handle it
919      just like HI16.  */
920   if (output_bfd != (bfd *) NULL
921       && (symbol->flags & BSF_SECTION_SYM) != 0)
922     return _bfd_mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
923                                      input_section, output_bfd, error_message);
924
925   abort ();
926 }
927
928 /* We have to figure out the gp value, so that we can adjust the
929    symbol value correctly.  We look up the symbol _gp in the output
930    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
931    target data.  We don't need to adjust the symbol value for an
932    external symbol if we are producing relocateable output.  */
933
934 static bfd_reloc_status_type
935 mips_elf_final_gp (output_bfd, symbol, relocateable, error_message, pgp)
936      bfd *output_bfd;
937      asymbol *symbol;
938      boolean relocateable;
939      char **error_message;
940      bfd_vma *pgp;
941 {
942   if (bfd_is_und_section (symbol->section)
943       && ! relocateable)
944     {
945       *pgp = 0;
946       return bfd_reloc_undefined;
947     }
948
949   *pgp = _bfd_get_gp_value (output_bfd);
950   if (*pgp == 0
951       && (! relocateable
952           || (symbol->flags & BSF_SECTION_SYM) != 0))
953     {
954       if (relocateable)
955         {
956           /* Make up a value.  */
957           *pgp = symbol->section->output_section->vma + 0x4000;
958           _bfd_set_gp_value (output_bfd, *pgp);
959         }
960       else
961         {
962           unsigned int count;
963           asymbol **sym;
964           unsigned int i;
965
966           count = bfd_get_symcount (output_bfd);
967           sym = bfd_get_outsymbols (output_bfd);
968
969           if (sym == (asymbol **) NULL)
970             i = count;
971           else
972             {
973               for (i = 0; i < count; i++, sym++)
974                 {
975                   register CONST char *name;
976
977                   name = bfd_asymbol_name (*sym);
978                   if (*name == '_' && strcmp (name, "_gp") == 0)
979                     {
980                       *pgp = bfd_asymbol_value (*sym);
981                       _bfd_set_gp_value (output_bfd, *pgp);
982                       break;
983                     }
984                 }
985             }
986
987           if (i >= count)
988             {
989               /* Only get the error once.  */
990               *pgp = 4;
991               _bfd_set_gp_value (output_bfd, *pgp);
992               *error_message =
993                 (char *) "GP relative relocation when _gp not defined";
994               return bfd_reloc_dangerous;
995             }
996         }
997     }
998
999   return bfd_reloc_ok;
1000 }
1001
1002 /* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
1003    become the offset from the gp register.  This function also handles
1004    R_MIPS_LITERAL relocations, although those can be handled more
1005    cleverly because the entries in the .lit8 and .lit4 sections can be
1006    merged.  */
1007
1008 static bfd_reloc_status_type gprel16_with_gp PARAMS ((bfd *, asymbol *,
1009                                                       arelent *, asection *,
1010                                                       boolean, PTR, bfd_vma));
1011
1012 bfd_reloc_status_type
1013 _bfd_mips_elf_gprel16_reloc (abfd, reloc_entry, symbol, data, input_section,
1014                              output_bfd, error_message)
1015      bfd *abfd;
1016      arelent *reloc_entry;
1017      asymbol *symbol;
1018      PTR data;
1019      asection *input_section;
1020      bfd *output_bfd;
1021      char **error_message;
1022 {
1023   boolean relocateable;
1024   bfd_reloc_status_type ret;
1025   bfd_vma gp;
1026
1027   /* If we're relocating, and this is an external symbol with no
1028      addend, we don't want to change anything.  We will only have an
1029      addend if this is a newly created reloc, not read from an ELF
1030      file.  */
1031   if (output_bfd != (bfd *) NULL
1032       && (symbol->flags & BSF_SECTION_SYM) == 0
1033       && reloc_entry->addend == 0)
1034     {
1035       reloc_entry->address += input_section->output_offset;
1036       return bfd_reloc_ok;
1037     }
1038
1039   if (output_bfd != (bfd *) NULL)
1040     relocateable = true;
1041   else
1042     {
1043       relocateable = false;
1044       output_bfd = symbol->section->output_section->owner;
1045     }
1046
1047   ret = mips_elf_final_gp (output_bfd, symbol, relocateable, error_message,
1048                            &gp);
1049   if (ret != bfd_reloc_ok)
1050     return ret;
1051
1052   return gprel16_with_gp (abfd, symbol, reloc_entry, input_section,
1053                           relocateable, data, gp);
1054 }
1055
1056 static bfd_reloc_status_type
1057 gprel16_with_gp (abfd, symbol, reloc_entry, input_section, relocateable, data,
1058                  gp)
1059      bfd *abfd;
1060      asymbol *symbol;
1061      arelent *reloc_entry;
1062      asection *input_section;
1063      boolean relocateable;
1064      PTR data;
1065      bfd_vma gp;
1066 {
1067   bfd_vma relocation;
1068   unsigned long insn;
1069   unsigned long val;
1070
1071   if (bfd_is_com_section (symbol->section))
1072     relocation = 0;
1073   else
1074     relocation = symbol->value;
1075
1076   relocation += symbol->section->output_section->vma;
1077   relocation += symbol->section->output_offset;
1078
1079   if (reloc_entry->address > input_section->_cooked_size)
1080     return bfd_reloc_outofrange;
1081
1082   insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1083
1084   /* Set val to the offset into the section or symbol.  */
1085   if (reloc_entry->howto->src_mask == 0)
1086     {
1087       /* This case occurs with the 64-bit MIPS ELF ABI.  */
1088       val = reloc_entry->addend;
1089     }
1090   else
1091     {
1092       val = ((insn & 0xffff) + reloc_entry->addend) & 0xffff;
1093       if (val & 0x8000)
1094         val -= 0x10000;
1095     }
1096
1097   /* Adjust val for the final section location and GP value.  If we
1098      are producing relocateable output, we don't want to do this for
1099      an external symbol.  */
1100   if (! relocateable
1101       || (symbol->flags & BSF_SECTION_SYM) != 0)
1102     val += relocation - gp;
1103
1104   insn = (insn &~ 0xffff) | (val & 0xffff);
1105   bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
1106
1107   if (relocateable)
1108     reloc_entry->address += input_section->output_offset;
1109
1110   /* Make sure it fit in 16 bits.  */
1111   if (val >= 0x8000 && val < 0xffff8000)
1112     return bfd_reloc_overflow;
1113
1114   return bfd_reloc_ok;
1115 }
1116
1117 /* Do a R_MIPS_GPREL32 relocation.  Is this 32 bit value the offset
1118    from the gp register? XXX */
1119
1120 static bfd_reloc_status_type gprel32_with_gp PARAMS ((bfd *, asymbol *,
1121                                                       arelent *, asection *,
1122                                                       boolean, PTR, bfd_vma));
1123
1124 bfd_reloc_status_type
1125 _bfd_mips_elf_gprel32_reloc (abfd,
1126                         reloc_entry,
1127                         symbol,
1128                         data,
1129                         input_section,
1130                         output_bfd,
1131                         error_message)
1132      bfd *abfd;
1133      arelent *reloc_entry;
1134      asymbol *symbol;
1135      PTR data;
1136      asection *input_section;
1137      bfd *output_bfd;
1138      char **error_message;
1139 {
1140   boolean relocateable;
1141   bfd_reloc_status_type ret;
1142   bfd_vma gp;
1143
1144   /* If we're relocating, and this is an external symbol with no
1145      addend, we don't want to change anything.  We will only have an
1146      addend if this is a newly created reloc, not read from an ELF
1147      file.  */
1148   if (output_bfd != (bfd *) NULL
1149       && (symbol->flags & BSF_SECTION_SYM) == 0
1150       && reloc_entry->addend == 0)
1151     {
1152       *error_message = (char *)
1153         "32bits gp relative relocation occurs for an external symbol";
1154       return bfd_reloc_outofrange;
1155     }
1156
1157   if (output_bfd != (bfd *) NULL)
1158     {
1159       relocateable = true;
1160       gp = _bfd_get_gp_value (output_bfd);
1161     }
1162   else
1163     {
1164       relocateable = false;
1165       output_bfd = symbol->section->output_section->owner;
1166
1167       ret = mips_elf_final_gp (output_bfd, symbol, relocateable,
1168                                error_message, &gp);
1169       if (ret != bfd_reloc_ok)
1170         return ret;
1171     }
1172
1173   return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
1174                           relocateable, data, gp);
1175 }
1176
1177 static bfd_reloc_status_type
1178 gprel32_with_gp (abfd, symbol, reloc_entry, input_section, relocateable, data,
1179                  gp)
1180      bfd *abfd;
1181      asymbol *symbol;
1182      arelent *reloc_entry;
1183      asection *input_section;
1184      boolean relocateable;
1185      PTR data;
1186      bfd_vma gp;
1187 {
1188   bfd_vma relocation;
1189   unsigned long val;
1190
1191   if (bfd_is_com_section (symbol->section))
1192     relocation = 0;
1193   else
1194     relocation = symbol->value;
1195
1196   relocation += symbol->section->output_section->vma;
1197   relocation += symbol->section->output_offset;
1198
1199   if (reloc_entry->address > input_section->_cooked_size)
1200     return bfd_reloc_outofrange;
1201
1202   if (reloc_entry->howto->src_mask == 0)
1203     {
1204       /* This case arises with the 64-bit MIPS ELF ABI.  */
1205       val = 0;
1206     }
1207   else
1208     val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1209
1210   /* Set val to the offset into the section or symbol.  */
1211   val += reloc_entry->addend;
1212
1213   /* Adjust val for the final section location and GP value.  If we
1214      are producing relocateable output, we don't want to do this for
1215      an external symbol.  */
1216   if (! relocateable
1217       || (symbol->flags & BSF_SECTION_SYM) != 0)
1218     val += relocation - gp;
1219
1220   bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
1221
1222   if (relocateable)
1223     reloc_entry->address += input_section->output_offset;
1224
1225   return bfd_reloc_ok;
1226 }
1227
1228 /* A mapping from BFD reloc types to MIPS ELF reloc types.  */
1229
1230 struct elf_reloc_map {
1231   bfd_reloc_code_real_type bfd_reloc_val;
1232   enum reloc_type elf_reloc_val;
1233 };
1234
1235 static CONST struct elf_reloc_map mips_reloc_map[] =
1236 {
1237   { BFD_RELOC_NONE, R_MIPS_NONE, },
1238   { BFD_RELOC_16, R_MIPS_16 },
1239   { BFD_RELOC_32, R_MIPS_32 },
1240   { BFD_RELOC_CTOR, R_MIPS_32 },
1241   { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
1242   { BFD_RELOC_HI16_S, R_MIPS_HI16 },
1243   { BFD_RELOC_LO16, R_MIPS_LO16 },
1244   { BFD_RELOC_MIPS_GPREL, R_MIPS_GPREL16 },
1245   { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
1246   { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
1247   { BFD_RELOC_16_PCREL, R_MIPS_PC16 },
1248   { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
1249   { BFD_RELOC_MIPS_GPREL32, R_MIPS_GPREL32 },
1250   { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
1251   { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
1252   { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
1253   { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 }
1254 };
1255
1256 /* Given a BFD reloc type, return a howto structure.  */
1257
1258 static reloc_howto_type *
1259 bfd_elf32_bfd_reloc_type_lookup (abfd, code)
1260      bfd *abfd;
1261      bfd_reloc_code_real_type code;
1262 {
1263   unsigned int i;
1264
1265   for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map); i++)
1266     {
1267       if (mips_reloc_map[i].bfd_reloc_val == code)
1268         return &elf_mips_howto_table[(int) mips_reloc_map[i].elf_reloc_val];
1269     }
1270   return NULL;
1271 }
1272
1273 /* Given a MIPS reloc type, fill in an arelent structure.  */
1274
1275 static void
1276 mips_info_to_howto_rel (abfd, cache_ptr, dst)
1277      bfd *abfd;
1278      arelent *cache_ptr;
1279      Elf32_Internal_Rel *dst;
1280 {
1281   unsigned int r_type;
1282
1283   r_type = ELF32_R_TYPE (dst->r_info);
1284   BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
1285   cache_ptr->howto = &elf_mips_howto_table[r_type];
1286
1287   /* The addend for a GPREL16 or LITERAL relocation comes from the GP
1288      value for the object file.  We get the addend now, rather than
1289      when we do the relocation, because the symbol manipulations done
1290      by the linker may cause us to lose track of the input BFD.  */
1291   if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
1292       && (r_type == (unsigned int) R_MIPS_GPREL16
1293           || r_type == (unsigned int) R_MIPS_LITERAL))
1294     cache_ptr->addend = elf_gp (abfd);
1295 }
1296 \f
1297 /* A .reginfo section holds a single Elf32_RegInfo structure.  These
1298    routines swap this structure in and out.  They are used outside of
1299    BFD, so they are globally visible.  */
1300
1301 void
1302 bfd_mips_elf32_swap_reginfo_in (abfd, ex, in)
1303      bfd *abfd;
1304      const Elf32_External_RegInfo *ex;
1305      Elf32_RegInfo *in;
1306 {
1307   in->ri_gprmask = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_gprmask);
1308   in->ri_cprmask[0] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[0]);
1309   in->ri_cprmask[1] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[1]);
1310   in->ri_cprmask[2] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[2]);
1311   in->ri_cprmask[3] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[3]);
1312   in->ri_gp_value = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_gp_value);
1313 }
1314
1315 void
1316 bfd_mips_elf32_swap_reginfo_out (abfd, in, ex)
1317      bfd *abfd;
1318      const Elf32_RegInfo *in;
1319      Elf32_External_RegInfo *ex;
1320 {
1321   bfd_h_put_32 (abfd, (bfd_vma) in->ri_gprmask,
1322                 (bfd_byte *) ex->ri_gprmask);
1323   bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[0],
1324                 (bfd_byte *) ex->ri_cprmask[0]);
1325   bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[1],
1326                 (bfd_byte *) ex->ri_cprmask[1]);
1327   bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[2],
1328                 (bfd_byte *) ex->ri_cprmask[2]);
1329   bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[3],
1330                 (bfd_byte *) ex->ri_cprmask[3]);
1331   bfd_h_put_32 (abfd, (bfd_vma) in->ri_gp_value,
1332                 (bfd_byte *) ex->ri_gp_value);
1333 }
1334
1335 /* In the 64 bit ABI, the .MIPS.options section holds register
1336    information in an Elf64_Reginfo structure.  These routines swap
1337    them in and out.  They are globally visible because they are used
1338    outside of BFD.  These routines are here so that gas can call them
1339    without worrying about whether the 64 bit ABI has been included.  */
1340
1341 void
1342 bfd_mips_elf64_swap_reginfo_in (abfd, ex, in)
1343      bfd *abfd;
1344      const Elf64_External_RegInfo *ex;
1345      Elf64_Internal_RegInfo *in;
1346 {
1347   in->ri_gprmask = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_gprmask);
1348   in->ri_pad = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_pad);
1349   in->ri_cprmask[0] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[0]);
1350   in->ri_cprmask[1] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[1]);
1351   in->ri_cprmask[2] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[2]);
1352   in->ri_cprmask[3] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[3]);
1353   in->ri_gp_value = bfd_h_get_64 (abfd, (bfd_byte *) ex->ri_gp_value);
1354 }
1355
1356 void
1357 bfd_mips_elf64_swap_reginfo_out (abfd, in, ex)
1358      bfd *abfd;
1359      const Elf64_Internal_RegInfo *in;
1360      Elf64_External_RegInfo *ex;
1361 {
1362   bfd_h_put_32 (abfd, (bfd_vma) in->ri_gprmask,
1363                 (bfd_byte *) ex->ri_gprmask);
1364   bfd_h_put_32 (abfd, (bfd_vma) in->ri_pad,
1365                 (bfd_byte *) ex->ri_pad);
1366   bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[0],
1367                 (bfd_byte *) ex->ri_cprmask[0]);
1368   bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[1],
1369                 (bfd_byte *) ex->ri_cprmask[1]);
1370   bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[2],
1371                 (bfd_byte *) ex->ri_cprmask[2]);
1372   bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[3],
1373                 (bfd_byte *) ex->ri_cprmask[3]);
1374   bfd_h_put_64 (abfd, (bfd_vma) in->ri_gp_value,
1375                 (bfd_byte *) ex->ri_gp_value);
1376 }
1377
1378 /* Swap an entry in a .gptab section.  Note that these routines rely
1379    on the equivalence of the two elements of the union.  */
1380
1381 static void
1382 bfd_mips_elf32_swap_gptab_in (abfd, ex, in)
1383      bfd *abfd;
1384      const Elf32_External_gptab *ex;
1385      Elf32_gptab *in;
1386 {
1387   in->gt_entry.gt_g_value = bfd_h_get_32 (abfd, ex->gt_entry.gt_g_value);
1388   in->gt_entry.gt_bytes = bfd_h_get_32 (abfd, ex->gt_entry.gt_bytes);
1389 }
1390
1391 static void
1392 bfd_mips_elf32_swap_gptab_out (abfd, in, ex)
1393      bfd *abfd;
1394      const Elf32_gptab *in;
1395      Elf32_External_gptab *ex;
1396 {
1397   bfd_h_put_32 (abfd, (bfd_vma) in->gt_entry.gt_g_value,
1398                 ex->gt_entry.gt_g_value);
1399   bfd_h_put_32 (abfd, (bfd_vma) in->gt_entry.gt_bytes,
1400                 ex->gt_entry.gt_bytes);
1401 }
1402
1403 static void
1404 bfd_elf32_swap_compact_rel_out (abfd, in, ex)
1405      bfd *abfd;
1406      const Elf32_compact_rel *in;
1407      Elf32_External_compact_rel *ex;
1408 {
1409   bfd_h_put_32 (abfd, (bfd_vma) in->id1, ex->id1);
1410   bfd_h_put_32 (abfd, (bfd_vma) in->num, ex->num);
1411   bfd_h_put_32 (abfd, (bfd_vma) in->id2, ex->id2);
1412   bfd_h_put_32 (abfd, (bfd_vma) in->offset, ex->offset);
1413   bfd_h_put_32 (abfd, (bfd_vma) in->reserved0, ex->reserved0);
1414   bfd_h_put_32 (abfd, (bfd_vma) in->reserved1, ex->reserved1);
1415 }
1416
1417 static void
1418 bfd_elf32_swap_crinfo_out (abfd, in, ex)
1419      bfd *abfd;
1420      const Elf32_crinfo *in;
1421      Elf32_External_crinfo *ex;
1422 {
1423   unsigned long l;
1424
1425   l = (((in->ctype & CRINFO_CTYPE) << CRINFO_CTYPE_SH)
1426        | ((in->rtype & CRINFO_RTYPE) << CRINFO_RTYPE_SH)
1427        | ((in->dist2to & CRINFO_DIST2TO) << CRINFO_DIST2TO_SH)
1428        | ((in->relvaddr & CRINFO_RELVADDR) << CRINFO_RELVADDR_SH));
1429   bfd_h_put_32 (abfd, (bfd_vma) l, ex->info);
1430   bfd_h_put_32 (abfd, (bfd_vma) in->konst, ex->konst);
1431   bfd_h_put_32 (abfd, (bfd_vma) in->vaddr, ex->vaddr);
1432 }
1433
1434 /* Swap in an options header.  */
1435
1436 void
1437 bfd_mips_elf_swap_options_in (abfd, ex, in)
1438      bfd *abfd;
1439      const Elf_External_Options *ex;
1440      Elf_Internal_Options *in;
1441 {
1442   in->kind = bfd_h_get_8 (abfd, ex->kind);
1443   in->size = bfd_h_get_8 (abfd, ex->size);
1444   in->section = bfd_h_get_16 (abfd, ex->section);
1445   in->info = bfd_h_get_32 (abfd, ex->info);
1446 }
1447
1448 /* Swap out an options header.  */
1449
1450 void
1451 bfd_mips_elf_swap_options_out (abfd, in, ex)
1452      bfd *abfd;
1453      const Elf_Internal_Options *in;
1454      Elf_External_Options *ex;
1455 {
1456   bfd_h_put_8 (abfd, in->kind, ex->kind);
1457   bfd_h_put_8 (abfd, in->size, ex->size);
1458   bfd_h_put_16 (abfd, in->section, ex->section);
1459   bfd_h_put_32 (abfd, in->info, ex->info);
1460 }
1461 \f
1462 /* Determine whether a symbol is global for the purposes of splitting
1463    the symbol table into global symbols and local symbols.  At least
1464    on Irix 5, this split must be between section symbols and all other
1465    symbols.  On most ELF targets the split is between static symbols
1466    and externally visible symbols.  */
1467
1468 /*ARGSUSED*/
1469 static boolean
1470 mips_elf_sym_is_global (abfd, sym)
1471      bfd *abfd;
1472      asymbol *sym;
1473 {
1474   return (sym->flags & BSF_SECTION_SYM) == 0 ? true : false;
1475 }
1476 \f
1477 /* Set the right machine number for a MIPS ELF file.  This is used for
1478    both the 32-bit and the 64-bit ABI.  */
1479
1480 boolean
1481 _bfd_mips_elf_object_p (abfd)
1482      bfd *abfd;
1483 {
1484   switch (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH)
1485     {
1486     default:
1487     case E_MIPS_ARCH_1:
1488       /* Just use the default, which was set in elfcode.h.  */
1489       break;
1490
1491     case E_MIPS_ARCH_2:
1492       (void) bfd_default_set_arch_mach (abfd, bfd_arch_mips, 6000);
1493       break;
1494
1495     case E_MIPS_ARCH_3:
1496       (void) bfd_default_set_arch_mach (abfd, bfd_arch_mips, 4000);
1497       break;
1498
1499     case E_MIPS_ARCH_4:
1500       (void) bfd_default_set_arch_mach (abfd, bfd_arch_mips, 8000);
1501       break;
1502     }
1503
1504   return true;
1505 }
1506
1507 /* Set the right machine number for a 32-bit MIPS ELF file.  */
1508
1509 static boolean
1510 mips_elf32_object_p (abfd)
1511      bfd *abfd;
1512 {
1513   /* Irix 5 is broken.  Object file symbol tables are not always
1514      sorted correctly such that local symbols precede global symbols,
1515      and the sh_info field in the symbol table is not always right.  */
1516   elf_bad_symtab (abfd) = true;
1517
1518   return _bfd_mips_elf_object_p (abfd);
1519 }
1520
1521 /* The final processing done just before writing out a MIPS ELF object
1522    file.  This gets the MIPS architecture right based on the machine
1523    number.  This is used by both the 32-bit and the 64-bit ABI.  */
1524
1525 /*ARGSUSED*/
1526 void
1527 _bfd_mips_elf_final_write_processing (abfd, linker)
1528      bfd *abfd;
1529      boolean linker;
1530 {
1531   unsigned long val;
1532   unsigned int i;
1533   Elf_Internal_Shdr **hdrpp;
1534
1535   switch (bfd_get_mach (abfd))
1536     {
1537     case 3000:
1538       val = E_MIPS_ARCH_1;
1539       break;
1540
1541     case 6000:
1542       val = E_MIPS_ARCH_2;
1543       break;
1544
1545     case 4000:
1546       val = E_MIPS_ARCH_3;
1547       break;
1548
1549     case 8000:
1550       val = E_MIPS_ARCH_4;
1551       break;
1552
1553     default:
1554       val = 0;
1555       break;
1556     }
1557
1558   elf_elfheader (abfd)->e_flags &=~ EF_MIPS_ARCH;
1559   elf_elfheader (abfd)->e_flags |= val;
1560
1561   /* Set the sh_info field for .gptab sections.  */
1562   for (i = 1, hdrpp = elf_elfsections (abfd) + 1;
1563        i < elf_elfheader (abfd)->e_shnum;
1564        i++, hdrpp++)
1565     {
1566       if ((*hdrpp)->sh_type == SHT_MIPS_GPTAB)
1567         {
1568           const char *name;
1569           asection *sec;
1570
1571           BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
1572           name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
1573           BFD_ASSERT (name != NULL
1574                       && strncmp (name, ".gptab.", sizeof ".gptab." - 1) == 0);
1575           sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
1576           BFD_ASSERT (sec != NULL);
1577           (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
1578         }
1579     }
1580 }
1581 \f
1582 /* Function to keep MIPS specific file flags like as EF_MIPS_PIC. */
1583
1584 boolean
1585 _bfd_mips_elf_set_private_flags (abfd, flags)
1586      bfd *abfd;
1587      flagword flags;
1588 {
1589   BFD_ASSERT (!elf_flags_init (abfd)
1590               || elf_elfheader (abfd)->e_flags == flags);
1591
1592   elf_elfheader (abfd)->e_flags = flags;
1593   elf_flags_init (abfd) = true;
1594   return true;
1595 }
1596
1597 /* Copy backend specific data from one object module to another */
1598
1599 boolean
1600 _bfd_mips_elf_copy_private_bfd_data (ibfd, obfd)
1601      bfd *ibfd;
1602      bfd *obfd;
1603 {
1604   /* This function is selected based on the input vector.  We only
1605      want to copy information over if the output BFD also uses Elf
1606      format.  */
1607   if (bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1608     return true;
1609
1610   BFD_ASSERT (!elf_flags_init (obfd)
1611               || (elf_elfheader (obfd)->e_flags
1612                   == elf_elfheader (ibfd)->e_flags));
1613
1614   elf_gp (obfd) = elf_gp (ibfd);
1615   elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
1616   elf_flags_init (obfd) = true;
1617   return true;
1618 }
1619
1620 /* Merge backend specific data from an object file to the output
1621    object file when linking.  */
1622
1623 boolean
1624 _bfd_mips_elf_merge_private_bfd_data (ibfd, obfd)
1625      bfd *ibfd;
1626      bfd *obfd;
1627 {
1628   flagword old_flags;
1629   flagword new_flags;
1630
1631   /* Check if we have the same endianess */
1632   if (ibfd->xvec->byteorder != obfd->xvec->byteorder
1633       && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
1634     {
1635       (*_bfd_error_handler)
1636         ("%s: compiled for a %s endian system and target is %s endian",
1637          bfd_get_filename (ibfd),
1638          bfd_big_endian (ibfd) ? "big" : "little",
1639          bfd_big_endian (obfd) ? "big" : "little");
1640
1641       bfd_set_error (bfd_error_wrong_format);
1642       return false;
1643     }
1644
1645   /* This function is selected based on the input vector.  We only
1646      want to copy information over if the output BFD also uses Elf
1647      format.  */
1648   if (bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1649     return true;
1650
1651   new_flags = elf_elfheader (ibfd)->e_flags;
1652   elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_NOREORDER;
1653   old_flags = elf_elfheader (obfd)->e_flags;
1654
1655   if (!elf_flags_init (obfd))   /* First call, no flags set */
1656     {
1657       elf_flags_init (obfd) = true;
1658       elf_elfheader (obfd)->e_flags = new_flags;
1659     }
1660   else if (((new_flags ^ old_flags) & ~EF_MIPS_NOREORDER)
1661            == 0)                        /* Compatible flags are ok */
1662     ;
1663   else                                  /* Incompatible flags */
1664     {
1665       /* Warn about -fPIC mismatch */
1666       if ((new_flags & EF_MIPS_PIC) != (old_flags & EF_MIPS_PIC))
1667         {
1668           new_flags &= ~EF_MIPS_PIC;
1669           (*_bfd_error_handler)
1670             ("%s: needs all files compiled with -fPIC",
1671              bfd_get_filename (ibfd));
1672         }
1673
1674       if ((new_flags & EF_MIPS_CPIC) != (old_flags & EF_MIPS_CPIC))
1675         {
1676           new_flags &= ~EF_MIPS_CPIC;
1677           (*_bfd_error_handler)
1678             ("%s: needs all files compiled with -mabicalls",
1679              bfd_get_filename (ibfd));
1680         }
1681
1682       /* Warn about any other mismatches */
1683       if (new_flags != old_flags)
1684         (*_bfd_error_handler)
1685           ("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)",
1686            bfd_get_filename (ibfd), (unsigned long) new_flags,
1687            (unsigned long) old_flags);
1688
1689       bfd_set_error (bfd_error_bad_value);
1690       return false;
1691     }
1692
1693   return true;
1694 }
1695 \f
1696 /* Handle a MIPS specific section when reading an object file.  This
1697    is called when elfcode.h finds a section with an unknown type.
1698    This routine supports both the 32-bit and 64-bit ELF ABI.
1699
1700    FIXME: We need to handle the SHF_MIPS_GPREL flag, but I'm not sure
1701    how to.  */
1702
1703 boolean
1704 _bfd_mips_elf_section_from_shdr (abfd, hdr, name)
1705      bfd *abfd;
1706      Elf_Internal_Shdr *hdr;
1707      const char *name;
1708 {
1709   /* There ought to be a place to keep ELF backend specific flags, but
1710      at the moment there isn't one.  We just keep track of the
1711      sections by their name, instead.  Fortunately, the ABI gives
1712      suggested names for all the MIPS specific sections, so we will
1713      probably get away with this.  */
1714   switch (hdr->sh_type)
1715     {
1716     case SHT_MIPS_LIBLIST:
1717       if (strcmp (name, ".liblist") != 0)
1718         return false;
1719       break;
1720     case SHT_MIPS_MSYM:
1721       if (strcmp (name, ".msym") != 0)
1722         return false;
1723       break;
1724     case SHT_MIPS_CONFLICT:
1725       if (strcmp (name, ".conflict") != 0)
1726         return false;
1727       break;
1728     case SHT_MIPS_GPTAB:
1729       if (strncmp (name, ".gptab.", sizeof ".gptab." - 1) != 0)
1730         return false;
1731       break;
1732     case SHT_MIPS_UCODE:
1733       if (strcmp (name, ".ucode") != 0)
1734         return false;
1735       break;
1736     case SHT_MIPS_DEBUG:
1737       if (strcmp (name, ".mdebug") != 0)
1738         return false;
1739       break;
1740     case SHT_MIPS_REGINFO:
1741       if (strcmp (name, ".reginfo") != 0
1742           || hdr->sh_size != sizeof (Elf32_External_RegInfo))
1743         return false;
1744       break;
1745     case SHT_MIPS_OPTIONS:
1746       if (strcmp (name, ".options") != 0
1747           && strcmp (name, ".MIPS.options") != 0)
1748         return false;
1749       break;
1750     case SHT_MIPS_DWARF:
1751       if (strncmp (name, ".debug_", sizeof ".debug_" - 1) != 0)
1752         return false;
1753       break;
1754     case SHT_MIPS_EVENTS:
1755       if (strncmp (name, ".MIPS.events.", sizeof ".MIPS.events." - 1) != 0)
1756         return false;
1757       break;
1758     default:
1759       return false;
1760     }
1761
1762   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
1763     return false;
1764
1765   if (hdr->sh_type == SHT_MIPS_DEBUG)
1766     {
1767       if (! bfd_set_section_flags (abfd, hdr->bfd_section,
1768                                    (bfd_get_section_flags (abfd,
1769                                                            hdr->bfd_section)
1770                                     | SEC_DEBUGGING)))
1771         return false;
1772     }
1773
1774   return true;
1775 }
1776
1777 /* Handle a 32-bit MIPS ELF specific section.  */
1778
1779 static boolean
1780 mips_elf32_section_from_shdr (abfd, hdr, name)
1781      bfd *abfd;
1782      Elf_Internal_Shdr *hdr;
1783      char *name;
1784 {
1785   if (! _bfd_mips_elf_section_from_shdr (abfd, hdr, name))
1786     return false;
1787
1788   /* FIXME: We should record sh_info for a .gptab section.  */
1789
1790   /* For a .reginfo section, set the gp value in the tdata information
1791      from the contents of this section.  We need the gp value while
1792      processing relocs, so we just get it now.  The .reginfo section
1793      is not used in the 64-bit MIPS ELF ABI.  */
1794   if (hdr->sh_type == SHT_MIPS_REGINFO)
1795     {
1796       Elf32_External_RegInfo ext;
1797       Elf32_RegInfo s;
1798
1799       if (! bfd_get_section_contents (abfd, hdr->bfd_section, (PTR) &ext,
1800                                       (file_ptr) 0, sizeof ext))
1801         return false;
1802       bfd_mips_elf32_swap_reginfo_in (abfd, &ext, &s);
1803       elf_gp (abfd) = s.ri_gp_value;
1804     }
1805
1806   /* For a SHT_MIPS_OPTIONS section, look for a ODK_REGINFO entry, and
1807      set the gp value based on what we find.  We may see both
1808      SHT_MIPS_REGINFO and SHT_MIPS_OPTIONS/ODK_REGINFO; in that case,
1809      they should agree.  */
1810   if (hdr->sh_type == SHT_MIPS_OPTIONS)
1811     {
1812       bfd_byte *contents, *l, *lend;
1813
1814       contents = (bfd_byte *) bfd_malloc (hdr->sh_size);
1815       if (contents == NULL)
1816         return false;
1817       if (! bfd_get_section_contents (abfd, hdr->bfd_section, contents,
1818                                       (file_ptr) 0, hdr->sh_size))
1819         {
1820           free (contents);
1821           return false;
1822         }
1823       l = contents;
1824       lend = contents + hdr->sh_size;
1825       while (l + sizeof (Elf_External_Options) <= lend)
1826         {
1827           Elf_Internal_Options intopt;
1828
1829           bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
1830                                         &intopt);
1831           if (intopt.kind == ODK_REGINFO)
1832             {
1833               Elf32_RegInfo intreg;
1834
1835               bfd_mips_elf32_swap_reginfo_in
1836                 (abfd,
1837                  ((Elf32_External_RegInfo *)
1838                   (l + sizeof (Elf_External_Options))),
1839                  &intreg);
1840               elf_gp (abfd) = intreg.ri_gp_value;
1841             }
1842           l += intopt.size;
1843         }
1844       free (contents);
1845     }
1846
1847   return true;
1848 }
1849
1850 /* Set the correct type for a MIPS ELF section.  We do this by the
1851    section name, which is a hack, but ought to work.  This routine is
1852    used by both the 32-bit and the 64-bit ABI.  */
1853
1854 boolean
1855 _bfd_mips_elf_fake_sections (abfd, hdr, sec)
1856      bfd *abfd;
1857      Elf32_Internal_Shdr *hdr;
1858      asection *sec;
1859 {
1860   register const char *name;
1861
1862   name = bfd_get_section_name (abfd, sec);
1863
1864   if (strcmp (name, ".liblist") == 0)
1865     {
1866       hdr->sh_type = SHT_MIPS_LIBLIST;
1867       hdr->sh_info = sec->_raw_size / sizeof (Elf32_Lib);
1868       /* FIXME: Set the sh_link field.  */
1869     }
1870   else if (strcmp (name, ".msym") == 0)
1871     {
1872       hdr->sh_type = SHT_MIPS_MSYM;
1873       hdr->sh_entsize = 8;
1874       /* FIXME: Set the sh_info field.  */
1875     }
1876   else if (strcmp (name, ".conflict") == 0)
1877     hdr->sh_type = SHT_MIPS_CONFLICT;
1878   else if (strncmp (name, ".gptab.", sizeof ".gptab." - 1) == 0)
1879     {
1880       hdr->sh_type = SHT_MIPS_GPTAB;
1881       hdr->sh_entsize = sizeof (Elf32_External_gptab);
1882       /* The sh_info field is set in final_write_processing.  */
1883     }
1884   else if (strcmp (name, ".ucode") == 0)
1885     hdr->sh_type = SHT_MIPS_UCODE;
1886   else if (strcmp (name, ".mdebug") == 0)
1887     {
1888       hdr->sh_type = SHT_MIPS_DEBUG;
1889       /* In a shared object on Irix 5.3, the .mdebug section has an
1890          entsize of 0.  FIXME: Does this matter?  */
1891       if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0)
1892         hdr->sh_entsize = 0;
1893       else
1894         hdr->sh_entsize = 1;
1895     }
1896   else if (strcmp (name, ".reginfo") == 0)
1897     {
1898       hdr->sh_type = SHT_MIPS_REGINFO;
1899       /* In a shared object on Irix 5.3, the .reginfo section has an
1900          entsize of 0x18.  FIXME: Does this matter?  */
1901       if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0)
1902         hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
1903       else
1904         hdr->sh_entsize = 1;
1905
1906       /* Force the section size to the correct value, even if the
1907          linker thinks it is larger.  The link routine below will only
1908          write out this much data for .reginfo.  */
1909       hdr->sh_size = sec->_raw_size = sizeof (Elf32_External_RegInfo);
1910     }
1911   else if (SGI_COMPAT (abfd)
1912            && (strcmp (name, ".hash") == 0
1913                || strcmp (name, ".dynamic") == 0
1914                || strcmp (name, ".dynstr") == 0))
1915     {
1916       hdr->sh_entsize = 0;
1917       hdr->sh_info = SIZEOF_MIPS_DYNSYM_SECNAMES;
1918     }
1919   else if (strcmp (name, ".got") == 0
1920            || strcmp (name, ".sdata") == 0
1921            || strcmp (name, ".sbss") == 0
1922            || strcmp (name, ".lit4") == 0
1923            || strcmp (name, ".lit8") == 0)
1924     hdr->sh_flags |= SHF_MIPS_GPREL;
1925   else if (strcmp (name, ".options") == 0
1926            || strcmp (name, ".MIPS.options") == 0)
1927     {
1928       hdr->sh_type = SHT_MIPS_OPTIONS;
1929       hdr->sh_entsize = 1;
1930     }
1931   else if (strncmp (name, ".debug_", sizeof ".debug_" - 1) == 0)
1932     hdr->sh_type = SHT_MIPS_DWARF;
1933   else if (strncmp (name, ".MIPS.events.", sizeof ".MIPS.events." - 1) == 0)
1934     hdr->sh_type = SHT_MIPS_EVENTS;
1935
1936   return true;
1937 }
1938
1939 /* Given a BFD section, try to locate the corresponding ELF section
1940    index.  This is used by both the 32-bit and the 64-bit ABI.
1941    Actually, it's not clear to me that the 64-bit ABI supports these,
1942    but for non-PIC objects we will certainly want support for at least
1943    the .scommon section.  */
1944
1945 boolean
1946 _bfd_mips_elf_section_from_bfd_section (abfd, hdr, sec, retval)
1947      bfd *abfd;
1948      Elf32_Internal_Shdr *hdr;
1949      asection *sec;
1950      int *retval;
1951 {
1952   if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
1953     {
1954       *retval = SHN_MIPS_SCOMMON;
1955       return true;
1956     }
1957   if (strcmp (bfd_get_section_name (abfd, sec), ".acommon") == 0)
1958     {
1959       *retval = SHN_MIPS_ACOMMON;
1960       return true;
1961     }
1962   return false;
1963 }
1964
1965 /* When are writing out the .options or .MIPS.options section,
1966    remember the bytes we are writing out, so that we can install the
1967    GP value in the section_processing routine.  */
1968
1969 boolean
1970 _bfd_mips_elf_set_section_contents (abfd, section, location, offset, count)
1971      bfd *abfd;
1972      sec_ptr section;
1973      PTR location;
1974      file_ptr offset;
1975      bfd_size_type count;
1976 {
1977   if (strcmp (section->name, ".options") == 0
1978       || strcmp (section->name, ".MIPS.options") == 0)
1979     {
1980       bfd_byte *c;
1981
1982       if (elf_section_data (section) == NULL)
1983         {
1984           section->used_by_bfd =
1985             (PTR) bfd_zalloc (abfd, sizeof (struct bfd_elf_section_data));
1986           if (elf_section_data (section) == NULL)
1987             return false;
1988         }
1989       c = (bfd_byte *) elf_section_data (section)->tdata;
1990       if (c == NULL)
1991         {
1992           bfd_size_type size;
1993
1994           if (section->_cooked_size != 0)
1995             size = section->_cooked_size;
1996           else
1997             size = section->_raw_size;
1998           c = (PTR) bfd_zalloc (abfd, size);
1999           if (c == NULL)
2000             return false;
2001           elf_section_data (section)->tdata = (PTR) c;
2002         }
2003
2004       memcpy (c + offset, location, count);
2005     }
2006
2007   return _bfd_elf_set_section_contents (abfd, section, location, offset,
2008                                         count);
2009 }
2010
2011 /* Work over a section just before writing it out.  This routine is
2012    used by both the 32-bit and the 64-bit ABI.  FIXME: We recognize
2013    sections that need the SHF_MIPS_GPREL flag by name; there has to be
2014    a better way.  */
2015
2016 boolean
2017 _bfd_mips_elf_section_processing (abfd, hdr)
2018      bfd *abfd;
2019      Elf_Internal_Shdr *hdr;
2020 {
2021   if (hdr->bfd_section != NULL)
2022     {
2023       const char *name = bfd_get_section_name (abfd, hdr->bfd_section);
2024
2025       if (strcmp (name, ".sdata") == 0)
2026         {
2027           hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
2028           hdr->sh_type = SHT_PROGBITS;
2029         }
2030       else if (strcmp (name, ".sbss") == 0)
2031         {
2032           hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
2033           hdr->sh_type = SHT_NOBITS;
2034         }
2035       else if (strcmp (name, ".lit8") == 0
2036                || strcmp (name, ".lit4") == 0)
2037         {
2038           hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
2039           hdr->sh_type = SHT_PROGBITS;
2040         }
2041       else if (strcmp (name, ".compact_rel") == 0)
2042         {
2043           hdr->sh_flags = 0;
2044           hdr->sh_type = SHT_PROGBITS;
2045         }
2046       else if (strcmp (name, ".rtproc") == 0)
2047         {
2048           if (hdr->sh_addralign != 0 && hdr->sh_entsize == 0)
2049             {
2050               unsigned int adjust;
2051
2052               adjust = hdr->sh_size % hdr->sh_addralign;
2053               if (adjust != 0)
2054                 hdr->sh_size += hdr->sh_addralign - adjust;
2055             }
2056         }
2057     }
2058
2059   return true;
2060 }
2061
2062 /* Work over a section just before writing it out.  We update the GP
2063    value in the SHT_MIPS_REGINFO and SHT_MIPS_OPTIONS sections based
2064    on the value we are using.  */
2065
2066 static boolean
2067 mips_elf32_section_processing (abfd, hdr)
2068      bfd *abfd;
2069      Elf32_Internal_Shdr *hdr;
2070 {
2071   if (hdr->sh_type == SHT_MIPS_REGINFO)
2072     {
2073       bfd_byte buf[4];
2074
2075       BFD_ASSERT (hdr->sh_size == sizeof (Elf32_External_RegInfo));
2076       BFD_ASSERT (hdr->contents == NULL);
2077
2078       if (bfd_seek (abfd,
2079                     hdr->sh_offset + sizeof (Elf32_External_RegInfo) - 4,
2080                     SEEK_SET) == -1)
2081         return false;
2082       bfd_h_put_32 (abfd, (bfd_vma) elf_gp (abfd), buf);
2083       if (bfd_write (buf, (bfd_size_type) 1, (bfd_size_type) 4, abfd) != 4)
2084         return false;
2085     }
2086
2087   if (hdr->sh_type == SHT_MIPS_OPTIONS
2088       && hdr->bfd_section != NULL
2089       && elf_section_data (hdr->bfd_section) != NULL
2090       && elf_section_data (hdr->bfd_section)->tdata != NULL)
2091     {
2092       bfd_byte *contents, *l, *lend;
2093
2094       /* We stored the section contents in the elf_section_data tdata
2095          field in the set_section_contents routine.  We save the
2096          section contents so that we don't have to read them again.
2097          At this point we know that elf_gp is set, so we can look
2098          through the section contents to see if there is an
2099          ODK_REGINFO structure.  */
2100
2101       contents = (bfd_byte *) elf_section_data (hdr->bfd_section)->tdata;
2102       l = contents;
2103       lend = contents + hdr->sh_size;
2104       while (l + sizeof (Elf_External_Options) <= lend)
2105         {
2106           Elf_Internal_Options intopt;
2107
2108           bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
2109                                         &intopt);
2110           if (intopt.kind == ODK_REGINFO)
2111             {
2112               bfd_byte buf[4];
2113
2114               if (bfd_seek (abfd,
2115                             (hdr->sh_offset
2116                              + (l - contents)
2117                              + sizeof (Elf_External_Options)
2118                              + (sizeof (Elf32_External_RegInfo) - 4)),
2119                              SEEK_SET) == -1)
2120                 return false;
2121               bfd_h_put_32 (abfd, elf_gp (abfd), buf);
2122               if (bfd_write (buf, 1, 4, abfd) != 4)
2123                 return false;
2124             }
2125           l += intopt.size;
2126         }
2127     }
2128
2129   return _bfd_mips_elf_section_processing (abfd, hdr);
2130 }
2131 \f
2132 /* MIPS ELF uses two common sections.  One is the usual one, and the
2133    other is for small objects.  All the small objects are kept
2134    together, and then referenced via the gp pointer, which yields
2135    faster assembler code.  This is what we use for the small common
2136    section.  This approach is copied from ecoff.c.  */
2137 static asection mips_elf_scom_section;
2138 static asymbol mips_elf_scom_symbol;
2139 static asymbol *mips_elf_scom_symbol_ptr;
2140
2141 /* MIPS ELF also uses an acommon section, which represents an
2142    allocated common symbol which may be overridden by a         
2143    definition in a shared library.  */
2144 static asection mips_elf_acom_section;
2145 static asymbol mips_elf_acom_symbol;
2146 static asymbol *mips_elf_acom_symbol_ptr;
2147
2148 /* The Irix 5 support uses two virtual sections, which represent
2149    text/data symbols defined in dynamic objects.  */
2150 static asection mips_elf_text_section;
2151 static asection *mips_elf_text_section_ptr;
2152 static asymbol mips_elf_text_symbol;
2153 static asymbol *mips_elf_text_symbol_ptr;
2154
2155 static asection mips_elf_data_section;
2156 static asection *mips_elf_data_section_ptr;
2157 static asymbol mips_elf_data_symbol;
2158 static asymbol *mips_elf_data_symbol_ptr;
2159
2160 /* Handle the special MIPS section numbers that a symbol may use.
2161    This is used for both the 32-bit and the 64-bit ABI.  */
2162
2163 void
2164 _bfd_mips_elf_symbol_processing (abfd, asym)
2165      bfd *abfd;
2166      asymbol *asym;
2167 {
2168   elf_symbol_type *elfsym;
2169
2170   elfsym = (elf_symbol_type *) asym;
2171   switch (elfsym->internal_elf_sym.st_shndx)
2172     {
2173     case SHN_MIPS_ACOMMON:
2174       /* This section is used in a dynamically linked executable file.
2175          It is an allocated common section.  The dynamic linker can
2176          either resolve these symbols to something in a shared
2177          library, or it can just leave them here.  For our purposes,
2178          we can consider these symbols to be in a new section.  */
2179       if (mips_elf_acom_section.name == NULL)
2180         {
2181           /* Initialize the acommon section.  */
2182           mips_elf_acom_section.name = ".acommon";
2183           mips_elf_acom_section.flags = SEC_ALLOC;
2184           mips_elf_acom_section.output_section = &mips_elf_acom_section;
2185           mips_elf_acom_section.symbol = &mips_elf_acom_symbol;
2186           mips_elf_acom_section.symbol_ptr_ptr = &mips_elf_acom_symbol_ptr;
2187           mips_elf_acom_symbol.name = ".acommon";
2188           mips_elf_acom_symbol.flags = BSF_SECTION_SYM;
2189           mips_elf_acom_symbol.section = &mips_elf_acom_section;
2190           mips_elf_acom_symbol_ptr = &mips_elf_acom_symbol;
2191         }
2192       asym->section = &mips_elf_acom_section;
2193       break;
2194
2195     case SHN_COMMON:
2196       /* Common symbols less than the GP size are automatically
2197          treated as SHN_MIPS_SCOMMON symbols.  */
2198       if (asym->value > elf_gp_size (abfd))
2199         break;
2200       /* Fall through.  */
2201     case SHN_MIPS_SCOMMON:
2202       if (mips_elf_scom_section.name == NULL)
2203         {
2204           /* Initialize the small common section.  */
2205           mips_elf_scom_section.name = ".scommon";
2206           mips_elf_scom_section.flags = SEC_IS_COMMON;
2207           mips_elf_scom_section.output_section = &mips_elf_scom_section;
2208           mips_elf_scom_section.symbol = &mips_elf_scom_symbol;
2209           mips_elf_scom_section.symbol_ptr_ptr = &mips_elf_scom_symbol_ptr;
2210           mips_elf_scom_symbol.name = ".scommon";
2211           mips_elf_scom_symbol.flags = BSF_SECTION_SYM;
2212           mips_elf_scom_symbol.section = &mips_elf_scom_section;
2213           mips_elf_scom_symbol_ptr = &mips_elf_scom_symbol;
2214         }
2215       asym->section = &mips_elf_scom_section;
2216       asym->value = elfsym->internal_elf_sym.st_size;
2217       break;
2218
2219     case SHN_MIPS_SUNDEFINED:
2220       asym->section = bfd_und_section_ptr;
2221       break;
2222
2223 #if 0 /* for SGI_COMPAT */
2224     case SHN_MIPS_TEXT:
2225       asym->section = mips_elf_text_section_ptr;
2226       break;
2227
2228     case SHN_MIPS_DATA:
2229       asym->section = mips_elf_data_section_ptr;
2230       break;
2231 #endif
2232     }
2233 }
2234 \f
2235 /* When creating an Irix 5 executable, we need REGINFO and RTPROC
2236    segments.  */
2237
2238 static int
2239 mips_elf_additional_program_headers (abfd)
2240      bfd *abfd;
2241 {
2242   asection *s;
2243   int ret;
2244
2245   ret = 0;
2246
2247   if (! SGI_COMPAT (abfd))
2248     return ret;
2249
2250   s = bfd_get_section_by_name (abfd, ".reginfo");
2251   if (s != NULL && (s->flags & SEC_LOAD) != 0)
2252     {
2253       /* We need a PT_MIPS_REGINFO segment.  */
2254       ++ret;
2255     }
2256
2257   if (bfd_get_section_by_name (abfd, ".dynamic") != NULL
2258       && bfd_get_section_by_name (abfd, ".mdebug") != NULL)
2259     {
2260       /* We need a PT_MIPS_RTPROC segment.  */
2261       ++ret;
2262     }
2263
2264   return ret;
2265 }
2266
2267 /* Modify the segment map for an Irix 5 executable.  */
2268
2269 static boolean
2270 mips_elf_modify_segment_map (abfd)
2271      bfd *abfd;
2272 {
2273   asection *s;
2274   struct elf_segment_map *m, **pm;
2275
2276   if (! SGI_COMPAT (abfd))
2277     return true;
2278
2279   /* If there is a .reginfo section, we need a PT_MIPS_REGINFO
2280      segment.  */
2281   s = bfd_get_section_by_name (abfd, ".reginfo");
2282   if (s != NULL && (s->flags & SEC_LOAD) != 0)
2283     {
2284       for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2285         if (m->p_type == PT_MIPS_REGINFO)
2286           break;
2287       if (m == NULL)
2288         {
2289           m = (struct elf_segment_map *) bfd_zalloc (abfd, sizeof *m);
2290           if (m == NULL)
2291             return false;
2292
2293           m->p_type = PT_MIPS_REGINFO;
2294           m->count = 1;
2295           m->sections[0] = s;
2296
2297           /* We want to put it after the PHDR and INTERP segments.  */
2298           pm = &elf_tdata (abfd)->segment_map;
2299           while (*pm != NULL
2300                  && ((*pm)->p_type == PT_PHDR
2301                      || (*pm)->p_type == PT_INTERP))
2302             pm = &(*pm)->next;
2303
2304           m->next = *pm;
2305           *pm = m;
2306         }
2307     }
2308           
2309   /* If there are .dynamic and .mdebug sections, we make a room for
2310      the RTPROC header.  FIXME: Rewrite without section names.  */
2311   if (bfd_get_section_by_name (abfd, ".interp") == NULL
2312       && bfd_get_section_by_name (abfd, ".dynamic") != NULL
2313       && bfd_get_section_by_name (abfd, ".mdebug") != NULL)
2314     {
2315       for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2316         if (m->p_type == PT_MIPS_RTPROC)
2317           break;
2318       if (m == NULL)
2319         {
2320           m = (struct elf_segment_map *) bfd_zalloc (abfd, sizeof *m);
2321           if (m == NULL)
2322             return false;
2323
2324           m->p_type = PT_MIPS_RTPROC;
2325
2326           s = bfd_get_section_by_name (abfd, ".rtproc");
2327           if (s == NULL)
2328             {
2329               m->count = 0;
2330               m->p_flags = 0;
2331               m->p_flags_valid = 1;
2332             }
2333           else
2334             {
2335               m->count = 1;
2336               m->sections[0] = s;
2337             }
2338
2339           /* We want to put it after the DYNAMIC segment.  */
2340           pm = &elf_tdata (abfd)->segment_map;
2341           while (*pm != NULL && (*pm)->p_type != PT_DYNAMIC)
2342             pm = &(*pm)->next;
2343           if (*pm != NULL)
2344             pm = &(*pm)->next;
2345
2346           m->next = *pm;
2347           *pm = m;
2348         }
2349     }
2350
2351   /* On Irix 5, the PT_DYNAMIC segment includes the .dynamic, .dynstr,
2352      .dynsym, and .hash sections, and everything in between.  */
2353   for (pm = &elf_tdata (abfd)->segment_map; *pm != NULL; pm = &(*pm)->next)
2354     if ((*pm)->p_type == PT_DYNAMIC)
2355       break;
2356   m = *pm;
2357   if (m != NULL
2358       && m->count == 1
2359       && strcmp (m->sections[0]->name, ".dynamic") == 0)
2360     {
2361       static const char *sec_names[] =
2362         { ".dynamic", ".dynstr", ".dynsym", ".hash" };
2363       bfd_vma low, high;
2364       unsigned int i, c;
2365       struct elf_segment_map *n;
2366
2367       low = 0xffffffff;
2368       high = 0;
2369       for (i = 0; i < sizeof sec_names / sizeof sec_names[0]; i++)
2370         {
2371           s = bfd_get_section_by_name (abfd, sec_names[i]);
2372           if (s != NULL && (s->flags & SEC_LOAD) != 0)
2373             {
2374               bfd_size_type sz;
2375
2376               if (low > s->vma)
2377                 low = s->vma;
2378               sz = s->_cooked_size;
2379               if (sz == 0)
2380                 sz = s->_raw_size;
2381               if (high < s->vma + sz)
2382                 high = s->vma + sz;
2383             }
2384         }
2385
2386       c = 0;
2387       for (s = abfd->sections; s != NULL; s = s->next)
2388         if ((s->flags & SEC_LOAD) != 0
2389             && s->vma >= low
2390             && ((s->vma
2391                  + (s->_cooked_size != 0 ? s->_cooked_size : s->_raw_size))
2392                 <= high))
2393           ++c;
2394
2395       n = ((struct elf_segment_map *)
2396            bfd_zalloc (abfd, sizeof *n + (c - 1) * sizeof (asection *)));
2397       if (n == NULL)
2398         return false;
2399       *n = *m;
2400       n->count = c;
2401
2402       i = 0;
2403       for (s = abfd->sections; s != NULL; s = s->next)
2404         {
2405           if ((s->flags & SEC_LOAD) != 0
2406               && s->vma >= low
2407               && ((s->vma
2408                    + (s->_cooked_size != 0 ? s->_cooked_size : s->_raw_size))
2409                   <= high))
2410             {
2411               n->sections[i] = s;
2412               ++i;
2413             }
2414         }
2415
2416       *pm = n;
2417     }
2418
2419   return true;
2420 }
2421 \f
2422 /* The structure of the runtime procedure descriptor created by the
2423    loader for use by the static exception system.  */
2424
2425 typedef struct runtime_pdr {
2426         bfd_vma adr;            /* memory address of start of procedure */
2427         long    regmask;        /* save register mask */
2428         long    regoffset;      /* save register offset */
2429         long    fregmask;       /* save floating point register mask */
2430         long    fregoffset;     /* save floating point register offset */
2431         long    frameoffset;    /* frame size */
2432         short   framereg;       /* frame pointer register */
2433         short   pcreg;          /* offset or reg of return pc */
2434         long    irpss;          /* index into the runtime string table */
2435         long    reserved;
2436         struct exception_info *exception_info;/* pointer to exception array */
2437 } RPDR, *pRPDR;
2438 #define cbRPDR sizeof(RPDR)
2439 #define rpdNil ((pRPDR) 0)
2440
2441 /* Swap RPDR (runtime procedure table entry) for output.  */
2442
2443 static void ecoff_swap_rpdr_out
2444   PARAMS ((bfd *, const RPDR *, struct rpdr_ext *));
2445
2446 static void
2447 ecoff_swap_rpdr_out (abfd, in, ex)
2448      bfd *abfd;
2449      const RPDR *in;
2450      struct rpdr_ext *ex;
2451 {
2452   /* ecoff_put_off was defined in ecoffswap.h.  */
2453   ecoff_put_off (abfd, in->adr, (bfd_byte *) ex->p_adr);
2454   bfd_h_put_32 (abfd, in->regmask, (bfd_byte *) ex->p_regmask);
2455   bfd_h_put_32 (abfd, in->regoffset, (bfd_byte *) ex->p_regoffset);
2456   bfd_h_put_32 (abfd, in->fregmask, (bfd_byte *) ex->p_fregmask);
2457   bfd_h_put_32 (abfd, in->fregoffset, (bfd_byte *) ex->p_fregoffset);
2458   bfd_h_put_32 (abfd, in->frameoffset, (bfd_byte *) ex->p_frameoffset);
2459
2460   bfd_h_put_16 (abfd, in->framereg, (bfd_byte *) ex->p_framereg);
2461   bfd_h_put_16 (abfd, in->pcreg, (bfd_byte *) ex->p_pcreg);
2462
2463   bfd_h_put_32 (abfd, in->irpss, (bfd_byte *) ex->p_irpss);
2464 #if 0 /* FIXME */
2465   ecoff_put_off (abfd, in->exception_info, (bfd_byte *) ex->p_exception_info);
2466 #endif
2467 }
2468 \f
2469 /* Read ECOFF debugging information from a .mdebug section into a
2470    ecoff_debug_info structure.  */
2471
2472 boolean
2473 _bfd_mips_elf_read_ecoff_info (abfd, section, debug)
2474      bfd *abfd;
2475      asection *section;
2476      struct ecoff_debug_info *debug;
2477 {
2478   HDRR *symhdr;
2479   const struct ecoff_debug_swap *swap;
2480   char *ext_hdr = NULL;
2481
2482   swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
2483
2484   ext_hdr = (char *) bfd_malloc ((size_t) swap->external_hdr_size);
2485   if (ext_hdr == NULL && swap->external_hdr_size != 0)
2486     goto error_return;
2487
2488   if (bfd_get_section_contents (abfd, section, ext_hdr, (file_ptr) 0,
2489                                 swap->external_hdr_size)
2490       == false)
2491     goto error_return;
2492
2493   symhdr = &debug->symbolic_header;
2494   (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
2495
2496   /* The symbolic header contains absolute file offsets and sizes to
2497      read.  */
2498 #define READ(ptr, offset, count, size, type)                            \
2499   if (symhdr->count == 0)                                               \
2500     debug->ptr = NULL;                                                  \
2501   else                                                                  \
2502     {                                                                   \
2503       debug->ptr = (type) bfd_malloc ((size_t) (size * symhdr->count)); \
2504       if (debug->ptr == NULL)                                           \
2505         goto error_return;                                              \
2506       if (bfd_seek (abfd, (file_ptr) symhdr->offset, SEEK_SET) != 0     \
2507           || (bfd_read (debug->ptr, size, symhdr->count,                \
2508                         abfd) != size * symhdr->count))                 \
2509         goto error_return;                                              \
2510     }
2511
2512   READ (line, cbLineOffset, cbLine, sizeof (unsigned char), unsigned char *);
2513   READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, PTR);
2514   READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, PTR);
2515   READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, PTR);
2516   READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, PTR);
2517   READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
2518         union aux_ext *);
2519   READ (ss, cbSsOffset, issMax, sizeof (char), char *);
2520   READ (ssext, cbSsExtOffset, issExtMax, sizeof (char), char *);
2521   READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, PTR);
2522   READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, PTR);
2523   READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size, PTR);
2524 #undef READ
2525
2526   debug->fdr = NULL;
2527   debug->adjust = NULL;
2528
2529   return true;
2530
2531  error_return:
2532   if (ext_hdr != NULL)
2533     free (ext_hdr);
2534   if (debug->line != NULL)
2535     free (debug->line);
2536   if (debug->external_dnr != NULL)
2537     free (debug->external_dnr);
2538   if (debug->external_pdr != NULL)
2539     free (debug->external_pdr);
2540   if (debug->external_sym != NULL)
2541     free (debug->external_sym);
2542   if (debug->external_opt != NULL)
2543     free (debug->external_opt);
2544   if (debug->external_aux != NULL)
2545     free (debug->external_aux);
2546   if (debug->ss != NULL)
2547     free (debug->ss);
2548   if (debug->ssext != NULL)
2549     free (debug->ssext);
2550   if (debug->external_fdr != NULL)
2551     free (debug->external_fdr);
2552   if (debug->external_rfd != NULL)
2553     free (debug->external_rfd);
2554   if (debug->external_ext != NULL)
2555     free (debug->external_ext);
2556   return false;
2557 }
2558 \f
2559 /* MIPS ELF local labels start with '$', not 'L'.  */
2560
2561 /*ARGSUSED*/
2562 static boolean
2563 mips_elf_is_local_label (abfd, symbol)
2564      bfd *abfd;
2565      asymbol *symbol;
2566 {
2567   return symbol->name[0] == '$';
2568 }
2569
2570 /* MIPS ELF uses a special find_nearest_line routine in order the
2571    handle the ECOFF debugging information.  */
2572
2573 struct mips_elf_find_line
2574 {
2575   struct ecoff_debug_info d;
2576   struct ecoff_find_line i;
2577 };
2578
2579 boolean
2580 _bfd_mips_elf_find_nearest_line (abfd, section, symbols, offset, filename_ptr,
2581                                  functionname_ptr, line_ptr)
2582      bfd *abfd;
2583      asection *section;
2584      asymbol **symbols;
2585      bfd_vma offset;
2586      const char **filename_ptr;
2587      const char **functionname_ptr;
2588      unsigned int *line_ptr;
2589 {
2590   asection *msec;
2591
2592   msec = bfd_get_section_by_name (abfd, ".mdebug");
2593   if (msec != NULL)
2594     {
2595       flagword origflags;
2596       struct mips_elf_find_line *fi;
2597       const struct ecoff_debug_swap * const swap =
2598         get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
2599
2600       /* If we are called during a link, mips_elf_final_link may have
2601          cleared the SEC_HAS_CONTENTS field.  We force it back on here
2602          if appropriate (which it normally will be).  */
2603       origflags = msec->flags;
2604       if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
2605         msec->flags |= SEC_HAS_CONTENTS;
2606
2607       fi = elf_tdata (abfd)->find_line_info;
2608       if (fi == NULL)
2609         {
2610           bfd_size_type external_fdr_size;
2611           char *fraw_src;
2612           char *fraw_end;
2613           struct fdr *fdr_ptr;
2614
2615           fi = ((struct mips_elf_find_line *)
2616                 bfd_zalloc (abfd, sizeof (struct mips_elf_find_line)));
2617           if (fi == NULL)
2618             {
2619               msec->flags = origflags;
2620               return false;
2621             }
2622
2623           if (! _bfd_mips_elf_read_ecoff_info (abfd, msec, &fi->d))
2624             {
2625               msec->flags = origflags;
2626               return false;
2627             }
2628
2629           /* Swap in the FDR information.  */
2630           fi->d.fdr = ((struct fdr *)
2631                        bfd_alloc (abfd,
2632                                   (fi->d.symbolic_header.ifdMax *
2633                                    sizeof (struct fdr))));
2634           if (fi->d.fdr == NULL)
2635             {
2636               msec->flags = origflags;
2637               return false;
2638             }
2639           external_fdr_size = swap->external_fdr_size;
2640           fdr_ptr = fi->d.fdr;
2641           fraw_src = (char *) fi->d.external_fdr;
2642           fraw_end = (fraw_src
2643                       + fi->d.symbolic_header.ifdMax * external_fdr_size);
2644           for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
2645             (*swap->swap_fdr_in) (abfd, (PTR) fraw_src, fdr_ptr);
2646
2647           elf_tdata (abfd)->find_line_info = fi;
2648
2649           /* Note that we don't bother to ever free this information.
2650              find_nearest_line is either called all the time, as in
2651              objdump -l, so the information should be saved, or it is
2652              rarely called, as in ld error messages, so the memory
2653              wasted is unimportant.  Still, it would probably be a
2654              good idea for free_cached_info to throw it away.  */
2655         }
2656
2657       if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
2658                                   &fi->i, filename_ptr, functionname_ptr,
2659                                   line_ptr))
2660         {
2661           msec->flags = origflags;
2662           return true;
2663         }
2664
2665       msec->flags = origflags;
2666     }
2667
2668   /* Fall back on the generic ELF find_nearest_line routine.  */
2669
2670   return _bfd_elf_find_nearest_line (abfd, section, symbols, offset,
2671                                      filename_ptr, functionname_ptr,
2672                                      line_ptr);
2673 }
2674 \f
2675 /* The MIPS ELF linker needs additional information for each symbol in
2676    the global hash table.  */
2677
2678 struct mips_elf_link_hash_entry
2679 {
2680   struct elf_link_hash_entry root;
2681
2682   /* External symbol information.  */
2683   EXTR esym;
2684
2685   /* Number of MIPS_32 or MIPS_REL32 relocs against this symbol.  */
2686   unsigned int mips_32_relocs;
2687 };
2688
2689 /* MIPS ELF linker hash table.  */
2690
2691 struct mips_elf_link_hash_table
2692 {
2693   struct elf_link_hash_table root;
2694   /* String section indices for the dynamic section symbols.  */
2695   bfd_size_type dynsym_sec_strindex[SIZEOF_MIPS_DYNSYM_SECNAMES];
2696   /* The number of .rtproc entries.  */
2697   bfd_size_type procedure_count;
2698   /* The size of the .compact_rel section (if SGI_COMPAT).  */
2699   bfd_size_type compact_rel_size;
2700   /* This flag indicates that the value of DT_MIPS_RLD_MAP dynamic
2701      entry is set to the address of __rld_obj_head as in Irix 5. */
2702   boolean use_rld_obj_head;
2703   /* This is the value of the __rld_map or __rld_obj_head symbol.  */
2704   bfd_vma rld_value;
2705 };
2706
2707 /* Look up an entry in a MIPS ELF linker hash table.  */
2708
2709 #define mips_elf_link_hash_lookup(table, string, create, copy, follow)  \
2710   ((struct mips_elf_link_hash_entry *)                                  \
2711    elf_link_hash_lookup (&(table)->root, (string), (create),            \
2712                          (copy), (follow)))
2713
2714 /* Traverse a MIPS ELF linker hash table.  */
2715
2716 #define mips_elf_link_hash_traverse(table, func, info)                  \
2717   (elf_link_hash_traverse                                               \
2718    (&(table)->root,                                                     \
2719     (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func),  \
2720     (info)))
2721
2722 /* Get the MIPS ELF linker hash table from a link_info structure.  */
2723
2724 #define mips_elf_hash_table(p) \
2725   ((struct mips_elf_link_hash_table *) ((p)->hash))
2726
2727 static boolean mips_elf_output_extsym
2728   PARAMS ((struct mips_elf_link_hash_entry *, PTR));
2729
2730 /* Create an entry in a MIPS ELF linker hash table.  */
2731
2732 static struct bfd_hash_entry *
2733 mips_elf_link_hash_newfunc (entry, table, string)
2734      struct bfd_hash_entry *entry;
2735      struct bfd_hash_table *table;
2736      const char *string;
2737 {
2738   struct mips_elf_link_hash_entry *ret =
2739     (struct mips_elf_link_hash_entry *) entry;
2740
2741   /* Allocate the structure if it has not already been allocated by a
2742      subclass.  */
2743   if (ret == (struct mips_elf_link_hash_entry *) NULL)
2744     ret = ((struct mips_elf_link_hash_entry *)
2745            bfd_hash_allocate (table,
2746                               sizeof (struct mips_elf_link_hash_entry)));
2747   if (ret == (struct mips_elf_link_hash_entry *) NULL)
2748     return (struct bfd_hash_entry *) ret;
2749
2750   /* Call the allocation method of the superclass.  */
2751   ret = ((struct mips_elf_link_hash_entry *)
2752          _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
2753                                      table, string));
2754   if (ret != (struct mips_elf_link_hash_entry *) NULL)
2755     {
2756       /* Set local fields.  */
2757       memset (&ret->esym, 0, sizeof (EXTR));
2758       /* We use -2 as a marker to indicate that the information has
2759          not been set.  -1 means there is no associated ifd.  */
2760       ret->esym.ifd = -2;
2761       ret->mips_32_relocs = 0;
2762     }
2763
2764   return (struct bfd_hash_entry *) ret;
2765 }
2766
2767 /* Create a MIPS ELF linker hash table.  */
2768
2769 static struct bfd_link_hash_table *
2770 mips_elf_link_hash_table_create (abfd)
2771      bfd *abfd;
2772 {
2773   struct mips_elf_link_hash_table *ret;
2774   unsigned int i;
2775
2776   ret = ((struct mips_elf_link_hash_table *)
2777          bfd_alloc (abfd, sizeof (struct mips_elf_link_hash_table)));
2778   if (ret == (struct mips_elf_link_hash_table *) NULL)
2779     return NULL;
2780
2781   if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
2782                                        mips_elf_link_hash_newfunc))
2783     {
2784       bfd_release (abfd, ret);
2785       return NULL;
2786     }
2787
2788   for (i = 0; i < SIZEOF_MIPS_DYNSYM_SECNAMES; i++)
2789     ret->dynsym_sec_strindex[i] = (bfd_size_type) -1;
2790   ret->procedure_count = 0;
2791   ret->compact_rel_size = 0;
2792   ret->use_rld_obj_head = false;
2793   ret->rld_value = 0;
2794
2795   return &ret->root.root;
2796 }
2797
2798 /* Hook called by the linker routine which adds symbols from an object
2799    file.  We must handle the special MIPS section numbers here.  */
2800
2801 /*ARGSUSED*/
2802 static boolean
2803 mips_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
2804      bfd *abfd;
2805      struct bfd_link_info *info;
2806      const Elf_Internal_Sym *sym;
2807      const char **namep;
2808      flagword *flagsp;
2809      asection **secp;
2810      bfd_vma *valp;
2811 {
2812   if (SGI_COMPAT (abfd)
2813       && (abfd->flags & DYNAMIC) != 0
2814       && strcmp (*namep, "_rld_new_interface") == 0)
2815     {
2816       /* Skip Irix 5 rld entry name.  */
2817       *namep = NULL;
2818       return true;
2819     }
2820
2821   switch (sym->st_shndx)
2822     {
2823     case SHN_COMMON:
2824       /* Common symbols less than the GP size are automatically
2825          treated as SHN_MIPS_SCOMMON symbols.  */
2826       if (sym->st_size > elf_gp_size (abfd))
2827         break;
2828       /* Fall through.  */
2829     case SHN_MIPS_SCOMMON:
2830       *secp = bfd_make_section_old_way (abfd, ".scommon");
2831       (*secp)->flags |= SEC_IS_COMMON;
2832       *valp = sym->st_size;
2833       break;
2834
2835     case SHN_MIPS_TEXT:
2836       /* This section is used in a shared object.  */
2837       if (mips_elf_text_section_ptr == NULL)
2838         {
2839           /* Initialize the section.  */
2840           mips_elf_text_section.name = ".text";
2841           mips_elf_text_section.flags = SEC_NO_FLAGS;
2842           mips_elf_text_section.output_section = NULL;
2843           mips_elf_text_section.owner = abfd;
2844           mips_elf_text_section.symbol = &mips_elf_text_symbol;
2845           mips_elf_text_section.symbol_ptr_ptr = &mips_elf_text_symbol_ptr;
2846           mips_elf_text_symbol.name = ".text";
2847           mips_elf_text_symbol.flags = BSF_SECTION_SYM;
2848           mips_elf_text_symbol.section = &mips_elf_text_section;
2849           mips_elf_text_symbol_ptr = &mips_elf_text_symbol;
2850           mips_elf_text_section_ptr = &mips_elf_text_section;
2851         }
2852       if (info->shared)
2853         *secp = bfd_und_section_ptr;
2854       else
2855         *secp = mips_elf_text_section_ptr;
2856       break;
2857
2858     case SHN_MIPS_ACOMMON:
2859       /* Fall through. XXX Can we treat this as allocated data?  */
2860     case SHN_MIPS_DATA:
2861       /* This section is used in a shared object.  */
2862       if (mips_elf_data_section_ptr == NULL)
2863         {
2864           /* Initialize the section.  */
2865           mips_elf_data_section.name = ".data";
2866           mips_elf_data_section.flags = SEC_NO_FLAGS;
2867           mips_elf_data_section.output_section = NULL;
2868           mips_elf_data_section.owner = abfd;
2869           mips_elf_data_section.symbol = &mips_elf_data_symbol;
2870           mips_elf_data_section.symbol_ptr_ptr = &mips_elf_data_symbol_ptr;
2871           mips_elf_data_symbol.name = ".data";
2872           mips_elf_data_symbol.flags = BSF_SECTION_SYM;
2873           mips_elf_data_symbol.section = &mips_elf_data_section;
2874           mips_elf_data_symbol_ptr = &mips_elf_data_symbol;
2875           mips_elf_data_section_ptr = &mips_elf_data_section;
2876         }
2877       if (info->shared)
2878         *secp = bfd_und_section_ptr;
2879       else
2880         *secp = mips_elf_data_section_ptr;
2881       break;
2882
2883     case SHN_MIPS_SUNDEFINED:
2884       *secp = bfd_und_section_ptr;
2885       break;
2886     }
2887
2888   if (SGI_COMPAT (abfd)
2889       && ! info->shared
2890       && info->hash->creator == abfd->xvec
2891       && strcmp (*namep, "__rld_obj_head") == 0)
2892     {
2893       struct elf_link_hash_entry *h;
2894
2895       /* Mark __rld_obj_head as dynamic.  */
2896       h = NULL;
2897       if (! (_bfd_generic_link_add_one_symbol
2898              (info, abfd, *namep, BSF_GLOBAL, *secp,
2899               (bfd_vma) *valp, (const char *) NULL, false,
2900               get_elf_backend_data (abfd)->collect,
2901               (struct bfd_link_hash_entry **) &h)))
2902         return false;
2903       h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF;
2904       h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
2905       h->type = STT_OBJECT;
2906
2907       if (! bfd_elf32_link_record_dynamic_symbol (info, h))
2908         return false;
2909
2910       mips_elf_hash_table (info)->use_rld_obj_head = true;
2911     }
2912
2913   return true;
2914 }
2915
2916 /* Structure used to pass information to mips_elf_output_extsym.  */
2917
2918 struct extsym_info
2919 {
2920   bfd *abfd;
2921   struct bfd_link_info *info;
2922   struct ecoff_debug_info *debug;
2923   const struct ecoff_debug_swap *swap;
2924   boolean failed;
2925 };
2926
2927 /* This routine is used to write out ECOFF debugging external symbol
2928    information.  It is called via mips_elf_link_hash_traverse.  The
2929    ECOFF external symbol information must match the ELF external
2930    symbol information.  Unfortunately, at this point we don't know
2931    whether a symbol is required by reloc information, so the two
2932    tables may wind up being different.  We must sort out the external
2933    symbol information before we can set the final size of the .mdebug
2934    section, and we must set the size of the .mdebug section before we
2935    can relocate any sections, and we can't know which symbols are
2936    required by relocation until we relocate the sections.
2937    Fortunately, it is relatively unlikely that any symbol will be
2938    stripped but required by a reloc.  In particular, it can not happen
2939    when generating a final executable.  */
2940
2941 static boolean
2942 mips_elf_output_extsym (h, data)
2943      struct mips_elf_link_hash_entry *h;
2944      PTR data;
2945 {
2946   struct extsym_info *einfo = (struct extsym_info *) data;
2947   boolean strip;
2948   asection *sec, *output_section;
2949
2950   if (h->root.indx == -2)
2951     strip = false;
2952   else if (((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
2953             || (h->root.elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0)
2954            && (h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0
2955            && (h->root.elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0)
2956     strip = true;
2957   else if (einfo->info->strip == strip_all
2958            || (einfo->info->strip == strip_some
2959                && bfd_hash_lookup (einfo->info->keep_hash,
2960                                    h->root.root.root.string,
2961                                    false, false) == NULL))
2962     strip = true;
2963   else
2964     strip = false;
2965
2966   if (strip)
2967     return true;
2968
2969   if (h->esym.ifd == -2)
2970     {
2971       h->esym.jmptbl = 0;
2972       h->esym.cobol_main = 0;
2973       h->esym.weakext = 0;
2974       h->esym.reserved = 0;
2975       h->esym.ifd = ifdNil;
2976       h->esym.asym.value = 0;
2977       h->esym.asym.st = stGlobal;
2978
2979       if (SGI_COMPAT (einfo->abfd)
2980           && (h->root.root.type == bfd_link_hash_undefined
2981               || h->root.root.type == bfd_link_hash_undefweak))
2982         {
2983           const char *name;
2984
2985           /* Use undefined class.  Also, set class and type for some
2986              special symbols.  */
2987           name = h->root.root.root.string;
2988           if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
2989               || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
2990             {
2991               h->esym.asym.sc = scData;
2992               h->esym.asym.st = stLabel;
2993               h->esym.asym.value = 0;
2994             }
2995           else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
2996             {
2997               h->esym.asym.sc = scAbs;
2998               h->esym.asym.st = stLabel;
2999               h->esym.asym.value =
3000                 mips_elf_hash_table (einfo->info)->procedure_count;
3001             }
3002           else if (strcmp (name, "_gp_disp") == 0)
3003             {
3004               h->esym.asym.sc = scAbs;
3005               h->esym.asym.st = stLabel;
3006               h->esym.asym.value = elf_gp (einfo->abfd);
3007             }
3008           else
3009             h->esym.asym.sc = scUndefined;
3010         }
3011       else if (h->root.root.type != bfd_link_hash_defined
3012           && h->root.root.type != bfd_link_hash_defweak)
3013         h->esym.asym.sc = scAbs;
3014       else
3015         {
3016           const char *name;
3017
3018           sec = h->root.root.u.def.section;
3019           output_section = sec->output_section;
3020
3021           /* When making a shared library and symbol h is the one from
3022              the another shared library, OUTPUT_SECTION may be null.  */
3023           if (output_section == NULL)
3024             h->esym.asym.sc = scUndefined;
3025           else
3026             {
3027               name = bfd_section_name (output_section->owner, output_section);
3028         
3029               if (strcmp (name, ".text") == 0)
3030                 h->esym.asym.sc = scText;
3031               else if (strcmp (name, ".data") == 0)
3032                 h->esym.asym.sc = scData;
3033               else if (strcmp (name, ".sdata") == 0)
3034                 h->esym.asym.sc = scSData;
3035               else if (strcmp (name, ".rodata") == 0
3036                        || strcmp (name, ".rdata") == 0)
3037                 h->esym.asym.sc = scRData;
3038               else if (strcmp (name, ".bss") == 0)
3039                 h->esym.asym.sc = scBss;
3040               else if (strcmp (name, ".sbss") == 0)
3041                 h->esym.asym.sc = scSBss;
3042               else if (strcmp (name, ".init") == 0)
3043                 h->esym.asym.sc = scInit;
3044               else if (strcmp (name, ".fini") == 0)
3045                 h->esym.asym.sc = scFini;
3046               else
3047                 h->esym.asym.sc = scAbs;
3048             }
3049         }
3050
3051       h->esym.asym.reserved = 0;
3052       h->esym.asym.index = indexNil;
3053     }
3054
3055   if (h->root.root.type == bfd_link_hash_common)
3056     h->esym.asym.value = h->root.root.u.c.size;
3057   else if (h->root.root.type == bfd_link_hash_defined
3058            || h->root.root.type == bfd_link_hash_defweak)
3059     {
3060       if (h->esym.asym.sc == scCommon)
3061         h->esym.asym.sc = scBss;
3062       else if (h->esym.asym.sc == scSCommon)
3063         h->esym.asym.sc = scSBss;
3064
3065       sec = h->root.root.u.def.section;
3066       output_section = sec->output_section;
3067       if (output_section != NULL)
3068         h->esym.asym.value = (h->root.root.u.def.value
3069                               + sec->output_offset
3070                               + output_section->vma);
3071       else
3072         h->esym.asym.value = 0;
3073     }
3074   else if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
3075     {
3076       /* Set type and value for a symbol with a function stub.  */
3077       h->esym.asym.st = stProc;
3078       sec = h->root.root.u.def.section;
3079       if (sec == NULL)
3080         h->esym.asym.value = 0;
3081       else
3082         {
3083           output_section = sec->output_section;
3084           if (output_section != NULL)
3085             h->esym.asym.value = (h->root.plt_offset
3086                                   + sec->output_offset
3087                                   + output_section->vma);
3088           else
3089             h->esym.asym.value = 0;
3090         }
3091 #if 0 /* FIXME?  */
3092       h->esym.ifd = 0;
3093 #endif
3094     }      
3095
3096   if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
3097                                       h->root.root.root.string,
3098                                       &h->esym))
3099     {
3100       einfo->failed = true;
3101       return false;
3102     }
3103
3104   return true;
3105 }
3106
3107 /* Create a runtime procedure table from the .mdebug section.  */
3108
3109 static boolean
3110 mips_elf_create_procedure_table (handle, abfd, info, s, debug)
3111      PTR handle;
3112      bfd *abfd;
3113      struct bfd_link_info *info;
3114      asection *s;
3115      struct ecoff_debug_info *debug;
3116 {
3117   const struct ecoff_debug_swap *swap;
3118   HDRR *hdr = &debug->symbolic_header;
3119   RPDR *rpdr, *rp;
3120   struct rpdr_ext *erp;
3121   PTR rtproc;
3122   struct pdr_ext *epdr;
3123   struct sym_ext *esym;
3124   char *ss, **sv;
3125   char *str;
3126   unsigned long size, count;
3127   unsigned long sindex;
3128   unsigned long i;
3129   PDR pdr;
3130   SYMR sym;
3131   const char *no_name_func = "static procedure (no name)";
3132
3133   epdr = NULL;
3134   rpdr = NULL;
3135   esym = NULL;
3136   ss = NULL;
3137   sv = NULL;
3138
3139   swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
3140
3141   sindex = strlen (no_name_func) + 1;
3142   count = hdr->ipdMax;
3143   if (count > 0)
3144     {
3145       size = swap->external_pdr_size;
3146
3147       epdr = (struct pdr_ext *) bfd_malloc (size * count);
3148       if (epdr == NULL)
3149         goto error_return;
3150
3151       if (! _bfd_ecoff_get_accumulated_pdr (handle, (PTR) epdr))
3152         goto error_return;
3153
3154       size = sizeof (RPDR);
3155       rp = rpdr = (RPDR *) bfd_malloc (size * count);
3156       if (rpdr == NULL)
3157         goto error_return;
3158
3159       sv = (char **) bfd_malloc (sizeof (char *) * count);
3160       if (sv == NULL)
3161         goto error_return;
3162
3163       count = hdr->isymMax;
3164       size = swap->external_sym_size;
3165       esym = (struct sym_ext *) bfd_malloc (size * count);
3166       if (esym == NULL)
3167         goto error_return;
3168
3169       if (! _bfd_ecoff_get_accumulated_sym (handle, (PTR) esym))
3170         goto error_return;
3171
3172       count = hdr->issMax;
3173       ss = (char *) bfd_malloc (count);
3174       if (ss == NULL)
3175         goto error_return;
3176       if (! _bfd_ecoff_get_accumulated_ss (handle, (PTR) ss))
3177         goto error_return;
3178
3179       count = hdr->ipdMax;
3180       for (i = 0; i < count; i++, rp++)
3181         {
3182           (*swap->swap_pdr_in) (abfd, (PTR) (epdr + i), &pdr);
3183           (*swap->swap_sym_in) (abfd, (PTR) &esym[pdr.isym], &sym);
3184           rp->adr = sym.value;
3185           rp->regmask = pdr.regmask;
3186           rp->regoffset = pdr.regoffset;
3187           rp->fregmask = pdr.fregmask;
3188           rp->fregoffset = pdr.fregoffset;
3189           rp->frameoffset = pdr.frameoffset;
3190           rp->framereg = pdr.framereg;
3191           rp->pcreg = pdr.pcreg;
3192           rp->irpss = sindex;
3193           sv[i] = ss + sym.iss;
3194           sindex += strlen (sv[i]) + 1;
3195         }
3196     }
3197
3198   size = sizeof (struct rpdr_ext) * (count + 2) + sindex;
3199   size = BFD_ALIGN (size, 16);
3200   rtproc = (PTR) bfd_alloc (abfd, size);
3201   if (rtproc == NULL)
3202     {
3203       mips_elf_hash_table (info)->procedure_count = 0;
3204       goto error_return;
3205     }
3206
3207   mips_elf_hash_table (info)->procedure_count = count + 2;
3208
3209   erp = (struct rpdr_ext *) rtproc;
3210   memset (erp, 0, sizeof (struct rpdr_ext));
3211   erp++;
3212   str = (char *) rtproc + sizeof (struct rpdr_ext) * (count + 2);
3213   strcpy (str, no_name_func);
3214   str += strlen (no_name_func) + 1;
3215   for (i = 0; i < count; i++)
3216     {
3217       ecoff_swap_rpdr_out (abfd, rpdr + i, erp + i);
3218       strcpy (str, sv[i]);
3219       str += strlen (sv[i]) + 1;
3220     }
3221   ecoff_put_off (abfd, (bfd_vma) -1, (bfd_byte *) (erp + count)->p_adr);
3222
3223   /* Set the size and contents of .rtproc section.  */
3224   s->_raw_size = size;
3225   s->contents = rtproc;
3226
3227   /* Skip this section later on (I don't think this currently
3228      matters, but someday it might).  */
3229   s->link_order_head = (struct bfd_link_order *) NULL;
3230
3231   if (epdr != NULL)
3232     free (epdr);
3233   if (rpdr != NULL)
3234     free (rpdr);
3235   if (esym != NULL)
3236     free (esym);
3237   if (ss != NULL)
3238     free (ss);
3239   if (sv != NULL)
3240     free (sv);
3241
3242   return true;
3243
3244  error_return:
3245   if (epdr != NULL)
3246     free (epdr);
3247   if (rpdr != NULL)
3248     free (rpdr);
3249   if (esym != NULL)
3250     free (esym);
3251   if (ss != NULL)
3252     free (ss);
3253   if (sv != NULL)
3254     free (sv);
3255   return false;
3256 }
3257
3258 /* A comparison routine used to sort .gptab entries.  */
3259
3260 static int
3261 gptab_compare (p1, p2)
3262      const PTR p1;
3263      const PTR p2;
3264 {
3265   const Elf32_gptab *a1 = (const Elf32_gptab *) p1;
3266   const Elf32_gptab *a2 = (const Elf32_gptab *) p2;
3267
3268   return a1->gt_entry.gt_g_value - a2->gt_entry.gt_g_value;
3269 }
3270
3271 /* We need to use a special link routine to handle the .reginfo and
3272    the .mdebug sections.  We need to merge all instances of these
3273    sections together, not write them all out sequentially.  */
3274
3275 static boolean
3276 mips_elf_final_link (abfd, info)
3277      bfd *abfd;
3278      struct bfd_link_info *info;
3279 {
3280   asection **secpp;
3281   asection *o;
3282   struct bfd_link_order *p;
3283   asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
3284   asection *rtproc_sec;
3285   Elf32_RegInfo reginfo;
3286   struct ecoff_debug_info debug;
3287   const struct ecoff_debug_swap *swap
3288     = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
3289   HDRR *symhdr = &debug.symbolic_header;
3290   PTR mdebug_handle = NULL;
3291
3292   /* Drop the .options section, since it has special semantics which I
3293      haven't bothered to figure out.  */
3294   for (secpp = &abfd->sections; *secpp != NULL; secpp = &(*secpp)->next)
3295     {
3296       if (strcmp ((*secpp)->name, ".options") == 0)
3297         {
3298           for (p = (*secpp)->link_order_head; p != NULL; p = p->next)
3299             if (p->type == bfd_indirect_link_order)
3300               p->u.indirect.section->flags &=~ SEC_HAS_CONTENTS;
3301           (*secpp)->link_order_head = NULL;
3302           *secpp = (*secpp)->next;
3303           --abfd->section_count;
3304           break;
3305         }
3306     }
3307
3308   /* Get a value for the GP register.  */
3309   if (elf_gp (abfd) == 0)
3310     {
3311       struct bfd_link_hash_entry *h;
3312
3313       h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
3314       if (h != (struct bfd_link_hash_entry *) NULL
3315           && h->type == bfd_link_hash_defined)
3316         elf_gp (abfd) = (h->u.def.value
3317                          + h->u.def.section->output_section->vma
3318                          + h->u.def.section->output_offset);
3319       else if (info->relocateable)
3320         {
3321           bfd_vma lo;
3322
3323           /* Make up a value.  */
3324           lo = (bfd_vma) -1;
3325           for (o = abfd->sections; o != (asection *) NULL; o = o->next)
3326             {
3327               if (o->vma < lo
3328                   && (strcmp (o->name, ".sbss") == 0
3329                       || strcmp (o->name, ".sdata") == 0
3330                       || strcmp (o->name, ".lit4") == 0
3331                       || strcmp (o->name, ".lit8") == 0))
3332                 lo = o->vma;
3333             }
3334           elf_gp (abfd) = lo + ELF_MIPS_GP_OFFSET (abfd);
3335         }
3336       else
3337         {
3338           /* If the relocate_section function needs to do a reloc
3339              involving the GP value, it should make a reloc_dangerous
3340              callback to warn that GP is not defined.  */
3341         }
3342     }
3343
3344   /* Go through the sections and collect the .reginfo and .mdebug
3345      information.  */
3346   reginfo_sec = NULL;
3347   mdebug_sec = NULL;
3348   gptab_data_sec = NULL;
3349   gptab_bss_sec = NULL;
3350   for (o = abfd->sections; o != (asection *) NULL; o = o->next)
3351     {
3352       if (strcmp (o->name, ".reginfo") == 0)
3353         {
3354           memset (&reginfo, 0, sizeof reginfo);
3355
3356           /* We have found the .reginfo section in the output file.
3357              Look through all the link_orders comprising it and merge
3358              the information together.  */
3359           for (p = o->link_order_head;
3360                p != (struct bfd_link_order *) NULL;
3361                p = p->next)
3362             {
3363               asection *input_section;
3364               bfd *input_bfd;
3365               Elf32_External_RegInfo ext;
3366               Elf32_RegInfo sub;
3367
3368               if (p->type != bfd_indirect_link_order)
3369                 {
3370                   if (p->type == bfd_fill_link_order)
3371                     continue;
3372                   abort ();
3373                 }
3374
3375               input_section = p->u.indirect.section;
3376               input_bfd = input_section->owner;
3377
3378               /* The linker emulation code has probably clobbered the
3379                  size to be zero bytes.  */
3380               if (input_section->_raw_size == 0)
3381                 input_section->_raw_size = sizeof (Elf32_External_RegInfo);
3382
3383               if (! bfd_get_section_contents (input_bfd, input_section,
3384                                               (PTR) &ext,
3385                                               (file_ptr) 0,
3386                                               sizeof ext))
3387                 return false;
3388
3389               bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub);
3390
3391               reginfo.ri_gprmask |= sub.ri_gprmask;
3392               reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
3393               reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
3394               reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
3395               reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
3396
3397               /* ri_gp_value is set by the function
3398                  mips_elf32_section_processing when the section is
3399                  finally written out.  */
3400
3401               /* Hack: reset the SEC_HAS_CONTENTS flag so that
3402                  elf_link_input_bfd ignores this section.  */
3403               input_section->flags &=~ SEC_HAS_CONTENTS;
3404             }
3405
3406           /* Force the section size to the value we want.  */
3407           o->_raw_size = sizeof (Elf32_External_RegInfo);
3408
3409           /* Skip this section later on (I don't think this currently
3410              matters, but someday it might).  */
3411           o->link_order_head = (struct bfd_link_order *) NULL;
3412
3413           reginfo_sec = o;
3414         }
3415
3416       if (strcmp (o->name, ".mdebug") == 0)
3417         {
3418           struct extsym_info einfo;
3419
3420           /* We have found the .mdebug section in the output file.
3421              Look through all the link_orders comprising it and merge
3422              the information together.  */
3423           symhdr->magic = swap->sym_magic;
3424           /* FIXME: What should the version stamp be?  */
3425           symhdr->vstamp = 0;
3426           symhdr->ilineMax = 0;
3427           symhdr->cbLine = 0;
3428           symhdr->idnMax = 0;
3429           symhdr->ipdMax = 0;
3430           symhdr->isymMax = 0;
3431           symhdr->ioptMax = 0;
3432           symhdr->iauxMax = 0;
3433           symhdr->issMax = 0;
3434           symhdr->issExtMax = 0;
3435           symhdr->ifdMax = 0;
3436           symhdr->crfd = 0;
3437           symhdr->iextMax = 0;
3438
3439           /* We accumulate the debugging information itself in the
3440              debug_info structure.  */
3441           debug.line = NULL;
3442           debug.external_dnr = NULL;
3443           debug.external_pdr = NULL;
3444           debug.external_sym = NULL;
3445           debug.external_opt = NULL;
3446           debug.external_aux = NULL;
3447           debug.ss = NULL;
3448           debug.ssext = debug.ssext_end = NULL;
3449           debug.external_fdr = NULL;
3450           debug.external_rfd = NULL;
3451           debug.external_ext = debug.external_ext_end = NULL;
3452
3453           mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
3454           if (mdebug_handle == (PTR) NULL)
3455             return false;
3456
3457           if (SGI_COMPAT (abfd))
3458             {
3459               asection *s;
3460               EXTR esym;
3461               bfd_vma last;
3462               unsigned int i;
3463               static const char * const name[] =
3464                 { ".text", ".init", ".fini", ".data",
3465                     ".rodata", ".sdata", ".sbss", ".bss" };
3466               static const int sc[] = { scText, scInit, scFini, scData,
3467                                           scRData, scSData, scSBss, scBss };
3468
3469               esym.jmptbl = 0;
3470               esym.cobol_main = 0;
3471               esym.weakext = 0;
3472               esym.reserved = 0;
3473               esym.ifd = ifdNil;
3474               esym.asym.iss = issNil;
3475               esym.asym.st = stLocal;
3476               esym.asym.reserved = 0;
3477               esym.asym.index = indexNil;
3478               for (i = 0; i < 8; i++)
3479                 {
3480                   esym.asym.sc = sc[i];
3481                   s = bfd_get_section_by_name (abfd, name[i]);
3482                   if (s != NULL)
3483                     {
3484                       esym.asym.value = s->vma;
3485                       last = s->vma + s->_raw_size;
3486                     }
3487                   else
3488                     esym.asym.value = last;
3489                 
3490                   if (! bfd_ecoff_debug_one_external (abfd, &debug, swap,
3491                                                       name[i], &esym))
3492                     return false;
3493                 }
3494             }
3495
3496           for (p = o->link_order_head;
3497                p != (struct bfd_link_order *) NULL;
3498                p = p->next)
3499             {
3500               asection *input_section;
3501               bfd *input_bfd;
3502               const struct ecoff_debug_swap *input_swap;
3503               struct ecoff_debug_info input_debug;
3504               char *eraw_src;
3505               char *eraw_end;
3506
3507               if (p->type != bfd_indirect_link_order)
3508                 {
3509                   if (p->type == bfd_fill_link_order)
3510                     continue;
3511                   abort ();
3512                 }
3513
3514               input_section = p->u.indirect.section;
3515               input_bfd = input_section->owner;
3516
3517               if (bfd_get_flavour (input_bfd) != bfd_target_elf_flavour
3518                   || (get_elf_backend_data (input_bfd)
3519                       ->elf_backend_ecoff_debug_swap) == NULL)
3520                 {
3521                   /* I don't know what a non MIPS ELF bfd would be
3522                      doing with a .mdebug section, but I don't really
3523                      want to deal with it.  */
3524                   continue;
3525                 }
3526
3527               input_swap = (get_elf_backend_data (input_bfd)
3528                             ->elf_backend_ecoff_debug_swap);
3529
3530               BFD_ASSERT (p->size == input_section->_raw_size);
3531
3532               /* The ECOFF linking code expects that we have already
3533                  read in the debugging information and set up an
3534                  ecoff_debug_info structure, so we do that now.  */
3535               if (! _bfd_mips_elf_read_ecoff_info (input_bfd, input_section,
3536                                                    &input_debug))
3537                 return false;
3538
3539               if (! (bfd_ecoff_debug_accumulate
3540                      (mdebug_handle, abfd, &debug, swap, input_bfd,
3541                       &input_debug, input_swap, info)))
3542                 return false;
3543
3544               /* Loop through the external symbols.  For each one with
3545                  interesting information, try to find the symbol in
3546                  the linker global hash table and save the information
3547                  for the output external symbols.  */
3548               eraw_src = input_debug.external_ext;
3549               eraw_end = (eraw_src
3550                           + (input_debug.symbolic_header.iextMax
3551                              * input_swap->external_ext_size));
3552               for (;
3553                    eraw_src < eraw_end;
3554                    eraw_src += input_swap->external_ext_size)
3555                 {
3556                   EXTR ext;
3557                   const char *name;
3558                   struct mips_elf_link_hash_entry *h;
3559
3560                   (*input_swap->swap_ext_in) (input_bfd, (PTR) eraw_src, &ext);
3561                   if (ext.asym.sc == scNil
3562                       || ext.asym.sc == scUndefined
3563                       || ext.asym.sc == scSUndefined)
3564                     continue;
3565
3566                   name = input_debug.ssext + ext.asym.iss;
3567                   h = mips_elf_link_hash_lookup (mips_elf_hash_table (info),
3568                                                  name, false, false, true);
3569                   if (h == NULL || h->esym.ifd != -2)
3570                     continue;
3571
3572                   if (ext.ifd != -1)
3573                     {
3574                       BFD_ASSERT (ext.ifd
3575                                   < input_debug.symbolic_header.ifdMax);
3576                       ext.ifd = input_debug.ifdmap[ext.ifd];
3577                     }
3578
3579                   h->esym = ext;
3580                 }
3581
3582               /* Free up the information we just read.  */
3583               free (input_debug.line);
3584               free (input_debug.external_dnr);
3585               free (input_debug.external_pdr);
3586               free (input_debug.external_sym);
3587               free (input_debug.external_opt);
3588               free (input_debug.external_aux);
3589               free (input_debug.ss);
3590               free (input_debug.ssext);
3591               free (input_debug.external_fdr);
3592               free (input_debug.external_rfd);
3593               free (input_debug.external_ext);
3594
3595               /* Hack: reset the SEC_HAS_CONTENTS flag so that
3596                  elf_link_input_bfd ignores this section.  */
3597               input_section->flags &=~ SEC_HAS_CONTENTS;
3598             }
3599
3600           if (SGI_COMPAT (abfd) && info->shared)
3601             {
3602               /* Create .rtproc section.  */
3603               rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
3604               if (rtproc_sec == NULL)
3605                 {
3606                   flagword flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
3607                                     | SEC_READONLY);
3608
3609                   rtproc_sec = bfd_make_section (abfd, ".rtproc");
3610                   if (rtproc_sec == NULL
3611                       || ! bfd_set_section_flags (abfd, rtproc_sec, flags)
3612                       || ! bfd_set_section_alignment (abfd, rtproc_sec, 12))
3613                     return false;
3614                 }
3615
3616               if (! mips_elf_create_procedure_table (mdebug_handle, abfd,
3617                                                      info, rtproc_sec, &debug))
3618                 return false;
3619             }
3620
3621           /* Build the external symbol information.  */
3622           einfo.abfd = abfd;
3623           einfo.info = info;
3624           einfo.debug = &debug;
3625           einfo.swap = swap;
3626           einfo.failed = false;
3627           mips_elf_link_hash_traverse (mips_elf_hash_table (info),
3628                                        mips_elf_output_extsym,
3629                                        (PTR) &einfo);
3630           if (einfo.failed)
3631             return false;
3632
3633           /* Set the size of the .mdebug section.  */
3634           o->_raw_size = bfd_ecoff_debug_size (abfd, &debug, swap);
3635
3636           /* Skip this section later on (I don't think this currently
3637              matters, but someday it might).  */
3638           o->link_order_head = (struct bfd_link_order *) NULL;
3639
3640           mdebug_sec = o;
3641         }
3642
3643       if (strncmp (o->name, ".gptab.", sizeof ".gptab." - 1) == 0)
3644         {
3645           const char *subname;
3646           unsigned int c;
3647           Elf32_gptab *tab;
3648           Elf32_External_gptab *ext_tab;
3649           unsigned int i;
3650
3651           /* The .gptab.sdata and .gptab.sbss sections hold
3652              information describing how the small data area would
3653              change depending upon the -G switch.  These sections
3654              not used in executables files.  */
3655           if (! info->relocateable)
3656             {
3657               asection **secpp;
3658
3659               for (p = o->link_order_head;
3660                    p != (struct bfd_link_order *) NULL;
3661                    p = p->next)
3662                 {
3663                   asection *input_section;
3664
3665                   if (p->type != bfd_indirect_link_order)
3666                     {
3667                       if (p->type == bfd_fill_link_order)
3668                         continue;
3669                       abort ();
3670                     }
3671
3672                   input_section = p->u.indirect.section;
3673
3674                   /* Hack: reset the SEC_HAS_CONTENTS flag so that
3675                      elf_link_input_bfd ignores this section.  */
3676                   input_section->flags &=~ SEC_HAS_CONTENTS;
3677                 }
3678
3679               /* Skip this section later on (I don't think this
3680                  currently matters, but someday it might).  */
3681               o->link_order_head = (struct bfd_link_order *) NULL;
3682
3683               /* Really remove the section.  */
3684               for (secpp = &abfd->sections;
3685                    *secpp != o;
3686                    secpp = &(*secpp)->next)
3687                 ;
3688               *secpp = (*secpp)->next;
3689               --abfd->section_count;
3690
3691               continue;
3692             }
3693
3694           /* There is one gptab for initialized data, and one for
3695              uninitialized data.  */
3696           if (strcmp (o->name, ".gptab.sdata") == 0)
3697             gptab_data_sec = o;
3698           else if (strcmp (o->name, ".gptab.sbss") == 0)
3699             gptab_bss_sec = o;
3700           else
3701             {
3702               (*_bfd_error_handler)
3703                 ("%s: illegal section name `%s'",
3704                  bfd_get_filename (abfd), o->name);
3705               bfd_set_error (bfd_error_nonrepresentable_section);
3706               return false;
3707             }
3708
3709           /* The linker script always combines .gptab.data and
3710              .gptab.sdata into .gptab.sdata, and likewise for
3711              .gptab.bss and .gptab.sbss.  It is possible that there is
3712              no .sdata or .sbss section in the output file, in which
3713              case we must change the name of the output section.  */
3714           subname = o->name + sizeof ".gptab" - 1;
3715           if (bfd_get_section_by_name (abfd, subname) == NULL)
3716             {
3717               if (o == gptab_data_sec)
3718                 o->name = ".gptab.data";
3719               else
3720                 o->name = ".gptab.bss";
3721               subname = o->name + sizeof ".gptab" - 1;
3722               BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
3723             }
3724
3725           /* Set up the first entry.  */
3726           c = 1;
3727           tab = (Elf32_gptab *) bfd_malloc (c * sizeof (Elf32_gptab));
3728           if (tab == NULL)
3729             return false;
3730           tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
3731           tab[0].gt_header.gt_unused = 0;
3732
3733           /* Combine the input sections.  */
3734           for (p = o->link_order_head;
3735                p != (struct bfd_link_order *) NULL;
3736                p = p->next)
3737             {
3738               asection *input_section;
3739               bfd *input_bfd;
3740               bfd_size_type size;
3741               unsigned long last;
3742               bfd_size_type gpentry;
3743
3744               if (p->type != bfd_indirect_link_order)
3745                 {
3746                   if (p->type == bfd_fill_link_order)
3747                     continue;
3748                   abort ();
3749                 }
3750
3751               input_section = p->u.indirect.section;
3752               input_bfd = input_section->owner;
3753
3754               /* Combine the gptab entries for this input section one
3755                  by one.  We know that the input gptab entries are
3756                  sorted by ascending -G value.  */
3757               size = bfd_section_size (input_bfd, input_section);
3758               last = 0;
3759               for (gpentry = sizeof (Elf32_External_gptab);
3760                    gpentry < size;
3761                    gpentry += sizeof (Elf32_External_gptab))
3762                 {
3763                   Elf32_External_gptab ext_gptab;
3764                   Elf32_gptab int_gptab;
3765                   unsigned long val;
3766                   unsigned long add;
3767                   boolean exact;
3768                   unsigned int look;
3769
3770                   if (! (bfd_get_section_contents
3771                          (input_bfd, input_section, (PTR) &ext_gptab,
3772                           gpentry, sizeof (Elf32_External_gptab))))
3773                     {
3774                       free (tab);
3775                       return false;
3776                     }
3777
3778                   bfd_mips_elf32_swap_gptab_in (input_bfd, &ext_gptab,
3779                                                 &int_gptab);
3780                   val = int_gptab.gt_entry.gt_g_value;
3781                   add = int_gptab.gt_entry.gt_bytes - last;
3782
3783                   exact = false;
3784                   for (look = 1; look < c; look++)
3785                     {
3786                       if (tab[look].gt_entry.gt_g_value >= val)
3787                         tab[look].gt_entry.gt_bytes += add;
3788
3789                       if (tab[look].gt_entry.gt_g_value == val)
3790                         exact = true;
3791                     }
3792
3793                   if (! exact)
3794                     {
3795                       Elf32_gptab *new_tab;
3796                       unsigned int max;
3797
3798                       /* We need a new table entry.  */
3799                       new_tab = ((Elf32_gptab *)
3800                                  bfd_realloc ((PTR) tab,
3801                                               (c + 1) * sizeof (Elf32_gptab)));
3802                       if (new_tab == NULL)
3803                         {
3804                           free (tab);
3805                           return false;
3806                         }
3807                       tab = new_tab;
3808                       tab[c].gt_entry.gt_g_value = val;
3809                       tab[c].gt_entry.gt_bytes = add;
3810
3811                       /* Merge in the size for the next smallest -G
3812                          value, since that will be implied by this new
3813                          value.  */
3814                       max = 0;
3815                       for (look = 1; look < c; look++)
3816                         {
3817                           if (tab[look].gt_entry.gt_g_value < val
3818                               && (max == 0
3819                                   || (tab[look].gt_entry.gt_g_value
3820                                       > tab[max].gt_entry.gt_g_value)))
3821                             max = look;
3822                         }
3823                       if (max != 0)
3824                         tab[c].gt_entry.gt_bytes +=
3825                           tab[max].gt_entry.gt_bytes;
3826
3827                       ++c;
3828                     }
3829
3830                   last = int_gptab.gt_entry.gt_bytes;
3831                 }
3832
3833               /* Hack: reset the SEC_HAS_CONTENTS flag so that
3834                  elf_link_input_bfd ignores this section.  */
3835               input_section->flags &=~ SEC_HAS_CONTENTS;
3836             }
3837
3838           /* The table must be sorted by -G value.  */
3839           if (c > 2)
3840             qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
3841
3842           /* Swap out the table.  */
3843           ext_tab = ((Elf32_External_gptab *)
3844                      bfd_alloc (abfd, c * sizeof (Elf32_External_gptab)));
3845           if (ext_tab == NULL)
3846             {
3847               free (tab);
3848               return false;
3849             }
3850
3851           for (i = 0; i < c; i++)
3852             bfd_mips_elf32_swap_gptab_out (abfd, tab + i, ext_tab + i);
3853           free (tab);
3854
3855           o->_raw_size = c * sizeof (Elf32_External_gptab);
3856           o->contents = (bfd_byte *) ext_tab;
3857
3858           /* Skip this section later on (I don't think this currently
3859              matters, but someday it might).  */
3860           o->link_order_head = (struct bfd_link_order *) NULL;
3861         }
3862     }
3863
3864   /* Invoke the regular ELF backend linker to do all the work.  */
3865   if (! bfd_elf32_bfd_final_link (abfd, info))
3866     return false;
3867
3868   /* Now write out the computed sections.  */
3869
3870   if (reginfo_sec != (asection *) NULL)
3871     {
3872       Elf32_External_RegInfo ext;
3873
3874       bfd_mips_elf32_swap_reginfo_out (abfd, &reginfo, &ext);
3875       if (! bfd_set_section_contents (abfd, reginfo_sec, (PTR) &ext,
3876                                       (file_ptr) 0, sizeof ext))
3877         return false;
3878     }
3879
3880   if (mdebug_sec != (asection *) NULL)
3881     {
3882       BFD_ASSERT (abfd->output_has_begun);
3883       if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
3884                                                swap, info,
3885                                                mdebug_sec->filepos))
3886         return false;
3887
3888       bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
3889     }
3890
3891   if (gptab_data_sec != (asection *) NULL)
3892     {
3893       if (! bfd_set_section_contents (abfd, gptab_data_sec,
3894                                       gptab_data_sec->contents,
3895                                       (file_ptr) 0,
3896                                       gptab_data_sec->_raw_size))
3897         return false;
3898     }
3899
3900   if (gptab_bss_sec != (asection *) NULL)
3901     {
3902       if (! bfd_set_section_contents (abfd, gptab_bss_sec,
3903                                       gptab_bss_sec->contents,
3904                                       (file_ptr) 0,
3905                                       gptab_bss_sec->_raw_size))
3906         return false;
3907     }
3908
3909   if (SGI_COMPAT (abfd))
3910     {
3911       rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
3912       if (rtproc_sec != NULL)
3913         {
3914           if (! bfd_set_section_contents (abfd, rtproc_sec,
3915                                           rtproc_sec->contents,
3916                                           (file_ptr) 0,
3917                                           rtproc_sec->_raw_size))
3918             return false;
3919         }
3920     }
3921
3922   return true;
3923 }
3924
3925 /* Handle a MIPS ELF HI16 reloc.  */
3926
3927 static void
3928 mips_elf_relocate_hi16 (input_bfd, relhi, rello, contents, addend)
3929      bfd *input_bfd;
3930      Elf_Internal_Rela *relhi;
3931      Elf_Internal_Rela *rello;
3932      bfd_byte *contents;
3933      bfd_vma addend;
3934 {
3935   bfd_vma insn;
3936   bfd_vma addlo;
3937
3938   insn = bfd_get_32 (input_bfd, contents + relhi->r_offset);
3939
3940   addlo = bfd_get_32 (input_bfd, contents + rello->r_offset);
3941   addlo &= 0xffff;
3942
3943   addend += ((insn & 0xffff) << 16) + addlo;
3944
3945   if ((addlo & 0x8000) != 0)
3946     addend -= 0x10000;
3947   if ((addend & 0x8000) != 0)
3948     addend += 0x10000;
3949
3950   bfd_put_32 (input_bfd,
3951               (insn & 0xffff0000) | ((addend >> 16) & 0xffff),
3952               contents + relhi->r_offset);
3953 }
3954
3955 /* Handle a MIPS ELF local GOT16 reloc.  */
3956
3957 static void
3958 mips_elf_relocate_got_local (output_bfd, input_bfd, sgot, relhi, rello,
3959                              contents, addend)
3960      bfd *output_bfd;
3961      bfd *input_bfd;
3962      asection *sgot;
3963      Elf_Internal_Rela *relhi;
3964      Elf_Internal_Rela *rello;
3965      bfd_byte *contents;
3966      bfd_vma addend;
3967 {
3968   int local_gotno;
3969   int i;
3970   bfd_vma insn;
3971   bfd_vma addlo;
3972   bfd_vma address;
3973   bfd_vma hipage;
3974   bfd_byte *got_contents;
3975   struct mips_got_info *g;
3976
3977   insn = bfd_get_32 (input_bfd, contents + relhi->r_offset);
3978
3979   addlo = bfd_get_32 (input_bfd, contents + rello->r_offset);
3980   addlo &= 0xffff;
3981
3982   addend += ((insn & 0xffff) << 16) + addlo;
3983
3984   if ((addlo & 0x8000) != 0)
3985     addend -= 0x10000;
3986   if ((addend & 0x8000) != 0)
3987     addend += 0x10000;
3988
3989   /* Get a got entry representing requested hipage.  */
3990   BFD_ASSERT (elf_section_data (sgot) != NULL);
3991   g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
3992   BFD_ASSERT (g != NULL);
3993
3994   local_gotno = g->local_gotno;
3995   got_contents = sgot->contents;
3996   hipage = addend & 0xffff0000;
3997
3998   for (i = MIPS_RESERVED_GOTNO; i < local_gotno; i++)
3999     {
4000       address = bfd_get_32 (input_bfd, got_contents + i * 4);
4001       if (hipage == (address & 0xffff0000))
4002         break;
4003       if (address == (bfd_vma) 0)
4004         {
4005           bfd_put_32 (input_bfd, hipage, got_contents + i * 4);
4006           break;
4007         }
4008     }
4009
4010   BFD_ASSERT (i < local_gotno);
4011 #if 1
4012   if (i == local_gotno)
4013     (*_bfd_error_handler)
4014       ("ELF MIPS linker: more got entries are needed for hipage: %x",
4015        hipage);
4016 #endif
4017
4018   i = - ELF_MIPS_GP_OFFSET (output_bfd) + i * 4;
4019   bfd_put_32 (input_bfd, (insn & 0xffff0000) | (i & 0xffff),
4020               contents + relhi->r_offset);
4021 }
4022
4023 /* Handle MIPS ELF CALL16 reloc and global GOT16 reloc.  */
4024
4025 static void
4026 mips_elf_relocate_global_got (input_bfd, rel, contents, offset)
4027      bfd *input_bfd;
4028      Elf_Internal_Rela *rel;
4029      bfd_byte *contents;
4030      bfd_vma offset;
4031 {
4032   bfd_vma insn;
4033
4034   insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
4035   bfd_put_32 (input_bfd,
4036               (insn & 0xffff0000) | (offset & 0xffff),
4037               contents + rel->r_offset);
4038 }
4039
4040 /* Relocate a MIPS ELF section.  */
4041
4042 static boolean
4043 mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
4044                            contents, relocs, local_syms, local_sections)
4045      bfd *output_bfd;
4046      struct bfd_link_info *info;
4047      bfd *input_bfd;
4048      asection *input_section;
4049      bfd_byte *contents;
4050      Elf_Internal_Rela *relocs;
4051      Elf_Internal_Sym *local_syms;
4052      asection **local_sections;
4053 {
4054   Elf_Internal_Shdr *symtab_hdr;
4055   size_t locsymcount;
4056   size_t extsymoff;
4057   asection *sgot, *sreloc, *scpt;
4058   bfd *dynobj;
4059   bfd_vma gp;
4060   Elf_Internal_Rela *rel;
4061   Elf_Internal_Rela *relend;
4062   struct mips_got_info *g;
4063
4064   dynobj = elf_hash_table (info)->dynobj;
4065   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4066
4067   sgot = NULL;
4068   sreloc = NULL;
4069   if (dynobj == NULL || ! SGI_COMPAT (output_bfd))
4070     scpt = NULL;
4071   else
4072     scpt = bfd_get_section_by_name (dynobj, ".compact_rel");
4073   g = NULL;
4074
4075   if (elf_bad_symtab (input_bfd))
4076     {
4077       locsymcount = symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
4078       extsymoff = 0;
4079     }
4080   else
4081     {
4082       locsymcount = symtab_hdr->sh_info;
4083       extsymoff = symtab_hdr->sh_info;
4084     }
4085
4086   gp = _bfd_get_gp_value (output_bfd);
4087
4088   rel = relocs;
4089   relend = relocs + input_section->reloc_count;
4090   for (; rel < relend; rel++)
4091     {
4092       int r_type;
4093       reloc_howto_type *howto;
4094       unsigned long r_symndx;
4095       bfd_vma addend;
4096       struct elf_link_hash_entry *h;
4097       asection *sec;
4098       Elf_Internal_Sym *sym;
4099       bfd_reloc_status_type r;
4100
4101       r_type = ELF32_R_TYPE (rel->r_info);
4102       if (r_type < 0 || r_type >= (int) R_MIPS_max)
4103         {
4104           bfd_set_error (bfd_error_bad_value);
4105           return false;
4106         }
4107       howto = elf_mips_howto_table + r_type;
4108
4109       if (dynobj != NULL
4110           && (r_type == R_MIPS_CALL16
4111               || r_type == R_MIPS_GOT16
4112               || r_type == R_MIPS_CALL_HI16
4113               || r_type == R_MIPS_CALL_LO16
4114               || r_type == R_MIPS_GOT_HI16
4115               || r_type == R_MIPS_GOT_LO16))
4116         {
4117           /* We need the .got section.  */
4118           if (sgot == NULL)
4119             {
4120               sgot = bfd_get_section_by_name (dynobj, ".got");
4121               BFD_ASSERT (sgot != NULL);
4122               BFD_ASSERT (elf_section_data (sgot) != NULL);
4123               g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
4124               BFD_ASSERT (g != NULL);
4125             }
4126         }
4127
4128       r_symndx = ELF32_R_SYM (rel->r_info);
4129
4130       /* Mix in the change in GP address for a GP relative reloc.  */
4131       if (r_type != R_MIPS_GPREL16
4132           && r_type != R_MIPS_LITERAL
4133           && r_type != R_MIPS_GPREL32)
4134         addend = 0;
4135       else
4136         {
4137           if (gp == 0)
4138             {
4139               if (! ((*info->callbacks->reloc_dangerous)
4140                      (info,
4141                       "GP relative relocation when GP not defined",
4142                       input_bfd, input_section,
4143                       rel->r_offset)))
4144                 return false;
4145               /* Only give the error once per link.  */
4146               gp = 4;
4147               _bfd_set_gp_value (output_bfd, gp);
4148             }
4149
4150           if (r_symndx < extsymoff
4151               || (elf_bad_symtab (input_bfd)
4152                   && local_sections[r_symndx] != NULL))
4153             {
4154               /* This is a relocation against a section.  The current
4155                  addend in the instruction is the difference between
4156                  INPUT_SECTION->vma and the GP value of INPUT_BFD.  We
4157                  must change this to be the difference between the
4158                  final definition (which will end up in RELOCATION)
4159                  and the GP value of OUTPUT_BFD (which is in GP).  */
4160               addend = elf_gp (input_bfd) - gp;
4161             }
4162           else if (! info->relocateable)
4163             {
4164               /* We are doing a final link.  The current addend in the
4165                  instruction is simply the desired offset into the
4166                  symbol (normally zero).  We want the instruction to
4167                  hold the difference between the final definition of
4168                  the symbol (which will end up in RELOCATION) and the
4169                  GP value of OUTPUT_BFD (which is in GP).  */
4170               addend = - gp;
4171             }
4172           else
4173             {
4174               /* We are generating relocateable output, and we aren't
4175                  going to define this symbol, so we just leave the
4176                  instruction alone.  */
4177               addend = 0;
4178             }
4179         }
4180
4181       h = NULL;
4182       sym = NULL;
4183       sec = NULL;
4184       if (info->relocateable)
4185         {
4186           /* This is a relocateable link.  We don't have to change
4187              anything, unless the reloc is against a section symbol,
4188              in which case we have to adjust according to where the
4189              section symbol winds up in the output section.  */
4190           if (r_symndx >= locsymcount
4191               || (elf_bad_symtab (input_bfd)
4192                   && local_sections[r_symndx] == NULL))
4193             r = bfd_reloc_ok;
4194           else
4195             {
4196               sym = local_syms + r_symndx;
4197               if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
4198                 r = bfd_reloc_ok;
4199               else
4200                 {
4201                   sec = local_sections[r_symndx];
4202
4203                   /* It would be logical to add sym->st_value here,
4204                      but Irix 5 sometimes generates a garbage symbol
4205                      value.  */
4206                   addend += sec->output_offset;
4207
4208                   /* If this is HI16 or GOT16 with an associated LO16,
4209                      adjust the addend accordingly.  Otherwise, just
4210                      relocate.  */
4211                   if (r_type != R_MIPS_HI16 && r_type != R_MIPS_GOT16)
4212                     r = _bfd_relocate_contents (howto, input_bfd,
4213                                                 addend,
4214                                                 contents + rel->r_offset);
4215                   else
4216                     {
4217                       Elf_Internal_Rela *lorel;
4218
4219                       /* As a GNU extension, permit an arbitrary
4220                          number of R_MIPS_HI16 relocs before the
4221                          R_MIPS_LO16 reloc.  This permits gcc to emit
4222                          the HI and LO relocs itself.  */
4223                       if (r_type == R_MIPS_GOT16)
4224                         lorel = rel + 1;
4225                       else
4226                         {
4227                           for (lorel = rel + 1;
4228                                (lorel < relend
4229                                 && (ELF32_R_TYPE (lorel->r_info)
4230                                     == R_MIPS_HI16));
4231                                lorel++)
4232                             ;
4233                         }
4234                       if (lorel < relend
4235                           && ELF32_R_TYPE (lorel->r_info) == R_MIPS_LO16)
4236                         {
4237                           mips_elf_relocate_hi16 (input_bfd, rel, lorel,
4238                                                   contents, addend);
4239                           r = bfd_reloc_ok;
4240                         }
4241                       else
4242                         r = _bfd_relocate_contents (howto, input_bfd,
4243                                                     addend,
4244                                                     contents + rel->r_offset);
4245                     }
4246                 }
4247             }
4248         }
4249       else
4250         {
4251           bfd_vma relocation;
4252           boolean local;
4253
4254           /* This is a final link.  */
4255           sym = NULL;
4256           if (r_symndx < extsymoff
4257               || (elf_bad_symtab (input_bfd)
4258                   && local_sections[r_symndx] != NULL))
4259             {
4260               local = true;
4261               sym = local_syms + r_symndx;
4262               sec = local_sections[r_symndx];
4263               relocation = (sec->output_section->vma
4264                             + sec->output_offset);
4265
4266               /* It would be logical to always add sym->st_value here,
4267                  but Irix 5 sometimes generates a garbage symbol
4268                  value.  */
4269               if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
4270                 relocation += sym->st_value;
4271             }
4272           else
4273             {
4274               long indx;
4275
4276               local = false;
4277               indx = r_symndx - extsymoff;
4278               h = elf_sym_hashes (input_bfd)[indx];
4279               while (h->root.type == bfd_link_hash_indirect
4280                      || h->root.type == bfd_link_hash_warning)
4281                 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4282               if (strcmp (h->root.root.string, "_gp_disp") == 0)
4283                 {
4284                   if (gp == 0)
4285                     {
4286                       if (! ((*info->callbacks->reloc_dangerous)
4287                              (info,
4288                               "_gp_disp used when GP not defined",
4289                               input_bfd, input_section,
4290                               rel->r_offset)))
4291                         return false;
4292                       /* Only give the error once per link.  */
4293                       gp = 4;
4294                       _bfd_set_gp_value (output_bfd, gp);
4295                       relocation = 0;
4296                     }
4297                   else
4298                     {
4299                       sec = input_section;
4300                       if (sec->output_section != NULL)
4301                         relocation = (gp
4302                                       - (rel->r_offset
4303                                          + sec->output_section->vma
4304                                          + sec->output_offset));
4305                       else
4306                         relocation = gp - rel->r_offset;
4307                       if (r_type == R_MIPS_LO16)
4308                         relocation += 4;
4309                     }
4310                 }
4311               else if (h->root.type == bfd_link_hash_defined
4312                   || h->root.type == bfd_link_hash_defweak)
4313                 {
4314                   sec = h->root.u.def.section;
4315                   if (sec->output_section == NULL)
4316                     relocation = 0;
4317                   else
4318                     relocation = (h->root.u.def.value
4319                                   + sec->output_section->vma
4320                                   + sec->output_offset);
4321                 }
4322               else if (h->root.type == bfd_link_hash_undefweak)
4323                 relocation = 0;
4324               else if (info->shared && ! info->symbolic)
4325                 relocation = 0;
4326               else if (strcmp (h->root.root.string, "_DYNAMIC_LINK") == 0)
4327                 {
4328                   /* If this is a dynamic link, we should have created
4329                      a _DYNAMIC_LINK symbol in
4330                      mips_elf_create_dynamic_sections.  Otherwise, we
4331                      should define the symbol with a value of 0.
4332                      FIXME: It should probably get into the symbol
4333                      table somehow as well.  */
4334                   BFD_ASSERT (! info->shared);
4335                   BFD_ASSERT (bfd_get_section_by_name (output_bfd,
4336                                                        ".dynamic") == NULL);
4337                   relocation = 0;
4338                 }
4339               else
4340                 {
4341                   if (! ((*info->callbacks->undefined_symbol)
4342                          (info, h->root.root.string, input_bfd,
4343                           input_section, rel->r_offset)))
4344                     return false;
4345                   relocation = 0;
4346                 }
4347             }
4348
4349           if (r_type == R_MIPS_HI16)
4350             {
4351               Elf_Internal_Rela *lorel;
4352
4353               /* As a GNU extension, permit an arbitrary number of
4354                  R_MIPS_HI16 relocs before the R_MIPS_LO16 reloc.
4355                  This permits gcc to emit the HI and LO relocs itself.  */
4356               for (lorel = rel + 1;
4357                    (lorel < relend
4358                     && ELF32_R_TYPE (lorel->r_info) == R_MIPS_HI16);
4359                    lorel++)
4360                 ;
4361               if (lorel < relend
4362                   && ELF32_R_TYPE (lorel->r_info) == R_MIPS_LO16)
4363                 {
4364                   mips_elf_relocate_hi16 (input_bfd, rel, lorel,
4365                                           contents, relocation + addend);
4366                   r = bfd_reloc_ok;
4367                 }
4368               else
4369                 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4370                                               contents, rel->r_offset,
4371                                               relocation, addend);
4372             }
4373           else if (r_type == R_MIPS_GOT16 && local)
4374             {
4375               /* GOT16 must also have an associated LO16 in the local
4376                  case.  In this case, the addend is extracted and the
4377                  section in which the referenced object is determined.
4378                  Then the final address of the object is computed and
4379                  the GOT entry for the hipage (an aligned 64kb chunk)
4380                  is added to .got section if needed.  The offset field
4381                  of the GOT16-relocated instruction is replaced by the
4382                  index of this GOT entry for the hipage.  */
4383               if ((rel + 1) < relend
4384                   && ELF32_R_TYPE ((rel + 1)->r_info) == R_MIPS_LO16)
4385                 {
4386                   mips_elf_relocate_got_local (output_bfd, input_bfd, sgot,
4387                                                rel, rel + 1,
4388                                                contents,
4389                                                relocation + addend);
4390                   r = bfd_reloc_ok;
4391                 }
4392               else
4393                 r = bfd_reloc_outofrange;
4394             }
4395           else if (r_type == R_MIPS_CALL16
4396                    || r_type == R_MIPS_GOT16
4397                    || r_type == R_MIPS_CALL_LO16
4398                    || r_type == R_MIPS_GOT_LO16)
4399             {
4400               bfd_vma offset;
4401
4402               /* This symbol must be registered as a global symbol
4403                  having the corresponding got entry.  */
4404               BFD_ASSERT (h->got_offset != (bfd_vma) -1);
4405
4406               offset = (h->dynindx - g->global_gotsym + g->local_gotno) * 4;
4407               BFD_ASSERT (g->local_gotno <= offset
4408                           && offset < sgot->_raw_size);
4409               bfd_put_32 (output_bfd, relocation + addend,
4410                           sgot->contents + offset);
4411               offset = (sgot->output_section->vma + sgot->output_offset
4412                         + offset - gp);
4413               mips_elf_relocate_global_got (input_bfd, rel, contents,
4414                                             offset);
4415               r = bfd_reloc_ok;
4416             }
4417           else if (r_type == R_MIPS_CALL_HI16
4418                    || r_type == R_MIPS_GOT_HI16)
4419             {
4420               bfd_vma offset;
4421
4422               /* This must be a global symbol with a got entry.  The
4423                  next reloc must be the corresponding LO16 reloc.  */
4424               BFD_ASSERT (h != NULL && h->got_offset != (bfd_vma) -1);
4425               BFD_ASSERT ((rel + 1) < relend);
4426               BFD_ASSERT (ELF32_R_TYPE ((rel + 1)->r_info)
4427                           == (r_type == R_MIPS_CALL_HI16
4428                               ? R_MIPS_CALL_LO16
4429                               : R_MIPS_GOT_LO16));
4430
4431               offset = (h->dynindx - g->global_gotsym + g->local_gotno) * 4;
4432               BFD_ASSERT (g->local_gotno <= offset
4433                           && offset < sgot->_raw_size);
4434               bfd_put_32 (output_bfd, relocation + addend,
4435                           sgot->contents + offset);
4436               offset = (sgot->output_section->vma + sgot->output_offset
4437                         + offset - gp);
4438               mips_elf_relocate_hi16 (input_bfd, rel, rel + 1, contents,
4439                                       offset);
4440               r = bfd_reloc_ok;
4441             }
4442           else if (r_type == R_MIPS_REL32
4443                    || r_type == R_MIPS_32)
4444             {
4445               Elf_Internal_Rel outrel;
4446               Elf32_crinfo cptrel;
4447               bfd_byte *cr;
4448
4449               if ((info->shared
4450                    || (elf_hash_table (info)->dynamic_sections_created
4451                        && h != NULL
4452                        && ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)
4453                            == 0)))
4454                   && (input_section->flags & SEC_ALLOC) != 0)
4455                 {
4456                   /* When generating a shared object, these
4457                      relocations are copied into the output file to be
4458                      resolved at run time.  */
4459                   if (sreloc == NULL)
4460                     {
4461                       sreloc = bfd_get_section_by_name (dynobj, ".rel.dyn");
4462                       BFD_ASSERT (sreloc != NULL);
4463                     }
4464
4465                   outrel.r_offset = (rel->r_offset
4466                                      + input_section->output_section->vma
4467                                      + input_section->output_offset);
4468
4469                   addend = bfd_get_32 (input_bfd, contents + rel->r_offset);
4470
4471                   if (h != NULL
4472                       && (! info->symbolic
4473                           || (h->elf_link_hash_flags
4474                               & ELF_LINK_HASH_DEF_REGULAR) == 0))
4475                     {
4476                       BFD_ASSERT (h->dynindx != -1);
4477                       outrel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_REL32);
4478                       sec = input_section;
4479                     }
4480                   else
4481                     {
4482                       long indx;
4483
4484                       if (h == NULL)
4485                         sec = local_sections[r_symndx];
4486                       else
4487                         {
4488                           BFD_ASSERT (h->root.type == bfd_link_hash_defined
4489                                       || (h->root.type
4490                                           == bfd_link_hash_defweak));
4491                           sec = h->root.u.def.section;
4492                         }
4493                       if (sec != NULL && bfd_is_abs_section (sec))
4494                         indx = 0;
4495                       else if (sec == NULL || sec->owner == NULL)
4496                         {
4497                           bfd_set_error (bfd_error_bad_value);
4498                           return false;
4499                         }
4500                       else
4501                         {
4502                           asection *osec;
4503
4504                           osec = sec->output_section;
4505                           indx = elf_section_data (osec)->dynindx;
4506                           if (indx == 0)
4507                             abort ();
4508                         }
4509
4510                       outrel.r_info = ELF32_R_INFO (indx, R_MIPS_REL32);
4511                       addend += relocation;
4512                     }
4513
4514                   bfd_put_32 (output_bfd, addend, contents + rel->r_offset);
4515                   bfd_elf32_swap_reloc_out (output_bfd, &outrel,
4516                                              (((Elf32_External_Rel *)
4517                                                sreloc->contents)
4518                                               + sreloc->reloc_count));
4519                   ++sreloc->reloc_count;
4520
4521                   if (SGI_COMPAT (output_bfd))
4522                     {
4523                       if (scpt == NULL)
4524                         continue;
4525
4526                       /* Make an entry of compact relocation info.  */
4527                       mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG);
4528                       cptrel.vaddr = (rel->r_offset
4529                                       + input_section->output_section->vma
4530                                       + input_section->output_offset);
4531                       if (r_type == R_MIPS_REL32)
4532                         mips_elf_set_cr_type (cptrel, CRT_MIPS_REL32);
4533                       else
4534                         mips_elf_set_cr_type (cptrel, CRT_MIPS_WORD);
4535                       mips_elf_set_cr_dist2to (cptrel, 0);
4536                       cptrel.konst = addend;
4537
4538                       cr = (scpt->contents
4539                             + sizeof (Elf32_External_compact_rel));
4540                       bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
4541                                                  ((Elf32_External_crinfo *) cr
4542                                                   + scpt->reloc_count));
4543                       ++scpt->reloc_count;
4544                     }
4545
4546                   /* This reloc will be computed at runtime, so
4547                      there's no need to do anything now.  */
4548                   continue;
4549                 }
4550               else
4551                 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4552                                               contents, rel->r_offset,
4553                                               relocation, addend);
4554             }
4555           else
4556             r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4557                                           contents, rel->r_offset,
4558                                           relocation, addend);
4559
4560           if (SGI_COMPAT (abfd)
4561               && scpt != NULL
4562               && (input_section->flags & SEC_ALLOC) != 0)
4563             {
4564               Elf32_crinfo cptrel;
4565               bfd_byte *cr;
4566
4567               /* Make an entry of compact relocation info.  */
4568               mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG);
4569               cptrel.vaddr = (rel->r_offset
4570                               + input_section->output_section->vma
4571                               + input_section->output_offset);
4572
4573               switch (r_type)
4574                 {
4575                 case R_MIPS_26:
4576                   mips_elf_set_cr_type (cptrel, CRT_MIPS_JMPAD);
4577                   /* XXX How should we set dist2to in this case. */
4578                   mips_elf_set_cr_dist2to (cptrel, 8);
4579                   cptrel.konst = addend + relocation;
4580                   cr = scpt->contents + sizeof (Elf32_External_compact_rel);
4581                   bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
4582                                              ((Elf32_External_crinfo *) cr
4583                                               + scpt->reloc_count));
4584                   ++scpt->reloc_count;
4585                   break;
4586
4587                 case R_MIPS_GPREL16:
4588                 case R_MIPS_LITERAL:
4589                 case R_MIPS_GPREL32:
4590                   mips_elf_set_cr_type (cptrel, CRT_MIPS_GPHI_LO);
4591                   cptrel.konst = gp - cptrel.vaddr;
4592                   mips_elf_set_cr_dist2to (cptrel, 4);
4593                   cr = scpt->contents + sizeof (Elf32_External_compact_rel);
4594                   bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
4595                                              ((Elf32_External_crinfo *) cr
4596                                               + scpt->reloc_count));
4597                   ++scpt->reloc_count;
4598                   break;
4599
4600                 default:
4601                   break;
4602                 }
4603             }
4604         }
4605
4606       if (r != bfd_reloc_ok)
4607         {
4608           switch (r)
4609             {
4610             default:
4611             case bfd_reloc_outofrange:
4612               abort ();
4613             case bfd_reloc_overflow:
4614               {
4615                 const char *name;
4616
4617                 if (h != NULL)
4618                   name = h->root.root.string;
4619                 else
4620                   {
4621                     name = bfd_elf_string_from_elf_section (input_bfd,
4622                                                             symtab_hdr->sh_link,
4623                                                             sym->st_name);
4624                     if (name == NULL)
4625                       return false;
4626                     if (*name == '\0')
4627                       name = bfd_section_name (input_bfd, sec);
4628                   }
4629                 if (! ((*info->callbacks->reloc_overflow)
4630                        (info, name, howto->name, (bfd_vma) 0,
4631                         input_bfd, input_section, rel->r_offset)))
4632                   return false;
4633               }
4634               break;
4635             }
4636         }
4637     }
4638
4639   return true;
4640 }
4641 \f
4642 /* Functions for the dynamic linker.  */
4643
4644 /* The name of the dynamic interpreter.  This is put in the .interp
4645    section.  */
4646
4647 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
4648
4649 /* Create dynamic sections when linking against a dynamic object.  */
4650
4651 static boolean
4652 mips_elf_create_dynamic_sections (abfd, info)
4653      bfd *abfd;
4654      struct bfd_link_info *info;
4655 {
4656   struct elf_link_hash_entry *h;
4657   flagword flags;
4658   register asection *s;
4659   const char * const *namep;
4660
4661   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4662            | SEC_READONLY);
4663
4664   /* Mips ABI requests the .dynamic section to be read only.  */
4665   s = bfd_get_section_by_name (abfd, ".dynamic");
4666   if (s != NULL)
4667     {
4668       if (! bfd_set_section_flags (abfd, s, flags))
4669         return false;
4670     }
4671
4672   /* We need to create .got section.  */
4673   if (! mips_elf_create_got_section (abfd, info))
4674     return false;
4675
4676   /* Create .stub section.  */
4677   if (bfd_get_section_by_name (abfd, ".stub") == NULL)
4678     {
4679       s = bfd_make_section (abfd, ".stub");
4680       if (s == NULL
4681           || ! bfd_set_section_flags (abfd, s, flags)
4682           || ! bfd_set_section_alignment (abfd, s, 2))
4683         return false;
4684     }
4685
4686   if (SGI_COMPAT (abfd)
4687       && !info->shared
4688       && bfd_get_section_by_name (abfd, ".rld_map") == NULL)
4689     {
4690       s = bfd_make_section (abfd, ".rld_map");
4691       if (s == NULL
4692           || ! bfd_set_section_flags (abfd, s, flags & ~SEC_READONLY)
4693           || ! bfd_set_section_alignment (abfd, s, 2))
4694         return false;
4695     }
4696
4697   if (SGI_COMPAT (abfd))
4698     {
4699       for (namep = mips_elf_dynsym_rtproc_names; *namep != NULL; namep++)
4700         {
4701           h = NULL;
4702           if (! (_bfd_generic_link_add_one_symbol
4703                  (info, abfd, *namep, BSF_GLOBAL, bfd_und_section_ptr,
4704                   (bfd_vma) 0, (const char *) NULL, false,
4705                   get_elf_backend_data (abfd)->collect,
4706                   (struct bfd_link_hash_entry **) &h)))
4707             return false;
4708           h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF;
4709           h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
4710           h->type = STT_SECTION;
4711
4712           if (! bfd_elf32_link_record_dynamic_symbol (info, h))
4713             return false;
4714         }
4715
4716       /* We need to create a .compact_rel section.  */
4717       if (! mips_elf_create_compact_rel_section (abfd, info))
4718         return false;
4719
4720       /* Change aligments of some sections.  */
4721       s = bfd_get_section_by_name (abfd, ".hash");
4722       if (s != NULL)
4723         bfd_set_section_alignment (abfd, s, 4);
4724       s = bfd_get_section_by_name (abfd, ".dynsym");
4725       if (s != NULL)
4726         bfd_set_section_alignment (abfd, s, 4);
4727       s = bfd_get_section_by_name (abfd, ".dynstr");
4728       if (s != NULL)
4729         bfd_set_section_alignment (abfd, s, 4);
4730       s = bfd_get_section_by_name (abfd, ".reginfo");
4731       if (s != NULL)
4732         bfd_set_section_alignment (abfd, s, 4);
4733       s = bfd_get_section_by_name (abfd, ".dynamic");
4734       if (s != NULL)
4735         bfd_set_section_alignment (abfd, s, 4);
4736     }
4737
4738   if (!info->shared)
4739     {
4740       h = NULL;
4741       if (! (_bfd_generic_link_add_one_symbol
4742              (info, abfd, "_DYNAMIC_LINK", BSF_GLOBAL, bfd_abs_section_ptr,
4743               (bfd_vma) 0, (const char *) NULL, false,
4744               get_elf_backend_data (abfd)->collect,
4745               (struct bfd_link_hash_entry **) &h)))
4746         return false;
4747       h->elf_link_hash_flags ^=~ ELF_LINK_NON_ELF;
4748       h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
4749       h->type = STT_SECTION;
4750
4751       if (! bfd_elf32_link_record_dynamic_symbol (info, h))
4752         return false;
4753
4754       if (! mips_elf_hash_table (info)->use_rld_obj_head)
4755         {
4756           /* __rld_map is a four byte word located in the .data section
4757              and is filled in by the rtld to contain a pointer to
4758              the _r_debug structure. Its symbol value will be set in
4759              mips_elf_finish_dynamic_symbol.  */
4760           s = bfd_get_section_by_name (abfd, ".rld_map");
4761           BFD_ASSERT (s != NULL);
4762
4763           h = NULL;
4764           if (! (_bfd_generic_link_add_one_symbol
4765                  (info, abfd, "__rld_map", BSF_GLOBAL, s,
4766                   (bfd_vma) 0, (const char *) NULL, false,
4767                   get_elf_backend_data (abfd)->collect,
4768                   (struct bfd_link_hash_entry **) &h)))
4769             return false;
4770           h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF;
4771           h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
4772           h->type = STT_OBJECT;
4773
4774           if (! bfd_elf32_link_record_dynamic_symbol (info, h))
4775             return false;
4776         }
4777     }
4778
4779   return true;
4780 }
4781
4782 /* Create the .compact_rel section.  */
4783
4784 static boolean
4785 mips_elf_create_compact_rel_section (abfd, info)
4786      bfd *abfd;
4787      struct bfd_link_info *info;
4788 {
4789   flagword flags;
4790   register asection *s;
4791
4792   if (bfd_get_section_by_name (abfd, ".compact_rel") == NULL)
4793     {
4794       flags = SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_READONLY;
4795
4796       s = bfd_make_section (abfd, ".compact_rel");
4797       if (s == NULL
4798           || ! bfd_set_section_flags (abfd, s, flags)
4799           || ! bfd_set_section_alignment (abfd, s, 2))
4800         return false;
4801
4802       s->_raw_size = sizeof (Elf32_External_compact_rel);
4803     }
4804
4805   return true;
4806 }
4807   
4808 /* Create the .got section to hold the global offset table. */
4809
4810 static boolean
4811 mips_elf_create_got_section (abfd, info)
4812      bfd *abfd;
4813      struct bfd_link_info *info;
4814 {
4815   flagword flags;
4816   register asection *s;
4817   struct elf_link_hash_entry *h;
4818   struct mips_got_info *g;
4819
4820   /* This function may be called more than once.  */
4821   if (bfd_get_section_by_name (abfd, ".got") != NULL)
4822     return true;
4823
4824   flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
4825
4826   s = bfd_make_section (abfd, ".got");
4827   if (s == NULL
4828       || ! bfd_set_section_flags (abfd, s, flags)
4829       || ! bfd_set_section_alignment (abfd, s, 4))
4830     return false;
4831
4832   /* Define the symbol _GLOBAL_OFFSET_TABLE_.  We don't do this in the
4833      linker script because we don't want to define the symbol if we
4834      are not creating a global offset table.  */
4835   h = NULL;
4836   if (! (_bfd_generic_link_add_one_symbol
4837          (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
4838           (bfd_vma) 0, (const char *) NULL, false,
4839           get_elf_backend_data (abfd)->collect,
4840           (struct bfd_link_hash_entry **) &h)))
4841     return false;
4842   h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF;
4843   h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
4844   h->type = STT_OBJECT;
4845
4846   if (info->shared
4847       && ! bfd_elf32_link_record_dynamic_symbol (info, h))
4848     return false;
4849
4850   /* The first several global offset table entries are reserved.  */
4851   s->_raw_size = MIPS_RESERVED_GOTNO * 4;
4852
4853   g = (struct mips_got_info *) bfd_alloc (abfd,
4854                                           sizeof (struct mips_got_info));
4855   if (g == NULL)
4856     return false;
4857   g->global_gotsym = 0;
4858   g->local_gotno = MIPS_RESERVED_GOTNO;
4859   if (elf_section_data (s) == NULL)
4860     {
4861       s->used_by_bfd =
4862         (PTR) bfd_zalloc (abfd, sizeof (struct bfd_elf_section_data));
4863       if (elf_section_data (s) == NULL)
4864         return false;
4865     }
4866   elf_section_data (s)->tdata = (PTR) g;
4867
4868   return true;
4869 }
4870
4871 /* Look through the relocs for a section during the first phase, and
4872    allocate space in the global offset table.  */
4873
4874 static boolean
4875 mips_elf_check_relocs (abfd, info, sec, relocs)
4876      bfd *abfd;
4877      struct bfd_link_info *info;
4878      asection *sec;
4879      const Elf_Internal_Rela *relocs;
4880 {
4881   bfd *dynobj;
4882   Elf_Internal_Shdr *symtab_hdr;
4883   struct elf_link_hash_entry **sym_hashes;
4884   struct mips_got_info *g;
4885   size_t extsymoff;
4886   const Elf_Internal_Rela *rel;
4887   const Elf_Internal_Rela *rel_end;
4888   asection *sgot;
4889   asection *sreloc;
4890
4891   if (info->relocateable)
4892     return true;
4893
4894   dynobj = elf_hash_table (info)->dynobj;
4895   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4896   sym_hashes = elf_sym_hashes (abfd);
4897   extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
4898
4899   sgot = NULL;
4900   sreloc = NULL;
4901
4902   rel_end = relocs + sec->reloc_count;
4903   for (rel = relocs; rel < rel_end; rel++)
4904     {
4905       unsigned long r_symndx;
4906       struct elf_link_hash_entry *h;
4907
4908       r_symndx = ELF32_R_SYM (rel->r_info);
4909
4910       if (r_symndx < extsymoff)
4911         h = NULL;
4912       else
4913         h = sym_hashes[r_symndx - extsymoff];
4914
4915       /* Some relocs require a global offset table.  */
4916       if (dynobj == NULL)
4917         {
4918           switch (ELF32_R_TYPE (rel->r_info))
4919             {
4920             case R_MIPS_GOT16:
4921             case R_MIPS_CALL16:
4922             case R_MIPS_CALL_HI16:
4923             case R_MIPS_CALL_LO16:
4924             case R_MIPS_GOT_HI16:
4925             case R_MIPS_GOT_LO16:
4926               elf_hash_table (info)->dynobj = dynobj = abfd;
4927               if (! mips_elf_create_got_section (dynobj, info))
4928                 return false;
4929               break;
4930
4931             default:
4932               break;
4933             }
4934         }
4935
4936       switch (ELF32_R_TYPE (rel->r_info))
4937         {
4938         case R_MIPS_CALL16:
4939         case R_MIPS_CALL_HI16:
4940         case R_MIPS_CALL_LO16:
4941           /* This symbol requires a global offset table entry.  */
4942           if (sgot == NULL)
4943             {
4944               sgot = bfd_get_section_by_name (dynobj, ".got");
4945               BFD_ASSERT (sgot != NULL);
4946               BFD_ASSERT (elf_section_data (sgot) != NULL);
4947               g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
4948               BFD_ASSERT (g != NULL);
4949             }
4950
4951           BFD_ASSERT (h != NULL);
4952
4953           /* Make sure this symbol is output as a dynamic symbol.  */
4954           if (h->dynindx == -1)
4955             {
4956               if (! bfd_elf32_link_record_dynamic_symbol (info, h))
4957                 return false;
4958             }
4959
4960           if (h->got_offset != (bfd_vma) -1)
4961             {
4962               /* We have already allocated space in the .got.  */
4963               break;
4964             }
4965
4966           /* Note the index of the first global got symbol in .dynsym.  */
4967           if (g->global_gotsym == 0
4968               || g->global_gotsym > (unsigned long) h->dynindx)
4969             g->global_gotsym = h->dynindx;
4970
4971           /* Make this symbol to have the corresponding got entry.  */
4972           h->got_offset = 0;
4973
4974           /* We need a stub, not a plt entry for the undefined
4975              function.  But we record it as if it needs plt.  See
4976              elf_adjust_dynamic_symbol in elflink.h.  */
4977           h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
4978           h->type = STT_FUNC;
4979
4980           break;
4981
4982         case R_MIPS_GOT16:
4983         case R_MIPS_GOT_HI16:
4984         case R_MIPS_GOT_LO16:
4985           /* This symbol requires a global offset table entry.  */
4986           if (sgot == NULL)
4987             {
4988               sgot = bfd_get_section_by_name (dynobj, ".got");
4989               BFD_ASSERT (sgot != NULL);
4990               BFD_ASSERT (elf_section_data (sgot) != NULL);
4991               g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
4992               BFD_ASSERT (g != NULL);
4993             }
4994
4995           if (h != NULL)
4996             {
4997               /* Make sure this symbol is output as a dynamic symbol.  */
4998               if (h->dynindx == -1)
4999                 {
5000                   if (! bfd_elf32_link_record_dynamic_symbol (info, h))
5001                     return false;
5002                 }
5003
5004               if (h->got_offset != (bfd_vma) -1)
5005                 {
5006                   /* We have already allocated space in the .got.  */
5007                   break;
5008                 }
5009               /* Note the index of the first global got symbol in
5010                  .dynsym.  */
5011               if (g->global_gotsym == 0
5012                   || g->global_gotsym > (unsigned long) h->dynindx)
5013                 g->global_gotsym = h->dynindx;
5014
5015               /* Make this symbol to be the global got symbol.  */
5016               h->got_offset = 0;
5017             }
5018
5019           break;
5020
5021         case R_MIPS_32:
5022         case R_MIPS_REL32:
5023           if ((info->shared || h != NULL)
5024               && (sec->flags & SEC_ALLOC) != 0)
5025             {
5026               if (info->shared)
5027                 {
5028                   /* When creating a shared object, we must copy these
5029                      reloc types into the output file as R_MIPS_REL32
5030                      relocs.  We create the .rel.dyn reloc section in
5031                      dynobj and make room for this reloc.  */
5032                   if (sreloc == NULL)
5033                     {
5034                       const char *name = ".rel.dyn";
5035
5036                       sreloc = bfd_get_section_by_name (dynobj, name);
5037                       if (sreloc == NULL)
5038                         {
5039                           sreloc = bfd_make_section (dynobj, name);
5040                           if (sreloc == NULL
5041                               || ! bfd_set_section_flags (dynobj, sreloc,
5042                                                           (SEC_ALLOC
5043                                                            | SEC_LOAD
5044                                                            | SEC_HAS_CONTENTS
5045                                                            | SEC_IN_MEMORY
5046                                                            | SEC_READONLY))
5047                               || ! bfd_set_section_alignment (dynobj, sreloc,
5048                                                               4))
5049                             return false;
5050
5051                           /* Add a null element. */
5052                           sreloc->_raw_size += sizeof (Elf32_External_Rel);
5053                           ++sreloc->reloc_count;
5054                         }
5055                     }
5056
5057                   sreloc->_raw_size += sizeof (Elf32_External_Rel);
5058                 }
5059               else
5060                 {
5061                   struct mips_elf_link_hash_entry *hmips;
5062
5063                   /* We only need to copy this reloc if the symbol is
5064                      defined in a dynamic object.  */
5065                   hmips = (struct mips_elf_link_hash_entry *) h;
5066                   ++hmips->mips_32_relocs;
5067                 }
5068             }
5069
5070           if (SGI_COMPAT (abfd))
5071             mips_elf_hash_table (info)->compact_rel_size +=
5072               sizeof (Elf32_External_crinfo);
5073
5074           break;
5075
5076         case R_MIPS_26:
5077         case R_MIPS_GPREL16:
5078         case R_MIPS_LITERAL:
5079         case R_MIPS_GPREL32:
5080           if (SGI_COMPAT (abfd))
5081             mips_elf_hash_table (info)->compact_rel_size +=
5082               sizeof (Elf32_External_crinfo);
5083           break;
5084
5085         default:
5086           break;
5087         }
5088     }
5089
5090   return true;
5091 }
5092
5093 /* Adjust a symbol defined by a dynamic object and referenced by a
5094    regular object.  The current definition is in some section of the
5095    dynamic object, but we're not including those sections.  We have to
5096    change the definition to something the rest of the link can
5097    understand.  */
5098
5099 static boolean
5100 mips_elf_adjust_dynamic_symbol (info, h)
5101      struct bfd_link_info *info;
5102      struct elf_link_hash_entry *h;
5103 {
5104   bfd *dynobj;
5105   struct mips_elf_link_hash_entry *hmips;
5106   asection *s;
5107
5108   dynobj = elf_hash_table (info)->dynobj;
5109
5110   /* Make sure we know what is going on here.  */
5111   BFD_ASSERT (dynobj != NULL
5112               && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
5113                   || h->weakdef != NULL
5114                   || ((h->elf_link_hash_flags
5115                        & ELF_LINK_HASH_DEF_DYNAMIC) != 0
5116                       && (h->elf_link_hash_flags
5117                           & ELF_LINK_HASH_REF_REGULAR) != 0
5118                       && (h->elf_link_hash_flags
5119                           & ELF_LINK_HASH_DEF_REGULAR) == 0)));
5120
5121   /* If this symbol is defined in a dynamic object, we need to copy
5122      any R_MIPS_32 or R_MIPS_REL32 relocs against it into the output
5123      file.  */
5124   hmips = (struct mips_elf_link_hash_entry *) h;
5125   if (! info->relocateable
5126       && hmips->mips_32_relocs != 0
5127       && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
5128     {
5129       s = bfd_get_section_by_name (dynobj, ".rel.dyn");
5130       BFD_ASSERT (s != NULL);
5131
5132       s->_raw_size += hmips->mips_32_relocs * sizeof (Elf32_External_Rel);
5133     }
5134
5135   /* For a function, create a stub, if needed. */
5136   if (h->type == STT_FUNC
5137       || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
5138     {
5139       if (! elf_hash_table (info)->dynamic_sections_created)
5140         return true;
5141
5142       /* If this symbol is not defined in a regular file, then set
5143          the symbol to the stub location.  This is required to make
5144          function pointers compare as equal between the normal
5145          executable and the shared library.  */
5146       if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
5147         {
5148           /* We need .stub section.  */
5149           s = bfd_get_section_by_name (dynobj, ".stub");
5150           BFD_ASSERT (s != NULL);
5151
5152           h->root.u.def.section = s;
5153           h->root.u.def.value = s->_raw_size;
5154
5155           /* XXX Write this stub address somewhere.  */
5156           h->plt_offset = s->_raw_size;
5157
5158           /* Make room for this stub code.  */
5159           s->_raw_size += MIPS_FUNCTION_STUB_SIZE;
5160
5161           /* The last half word of the stub will be filled with the index
5162              of this symbol in .dynsym section.  */
5163           return true;
5164         }
5165     }
5166
5167   /* If this is a weak symbol, and there is a real definition, the
5168      processor independent code will have arranged for us to see the
5169      real definition first, and we can just use the same value.  */
5170   if (h->weakdef != NULL)
5171     {
5172       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
5173                   || h->weakdef->root.type == bfd_link_hash_defweak);
5174       h->root.u.def.section = h->weakdef->root.u.def.section;
5175       h->root.u.def.value = h->weakdef->root.u.def.value;
5176       return true;
5177     }
5178
5179   /* This is a reference to a symbol defined by a dynamic object which
5180      is not a function.  */
5181
5182   return true;
5183 }
5184
5185 /* Set the sizes of the dynamic sections.  */
5186
5187 static boolean
5188 mips_elf_size_dynamic_sections (output_bfd, info)
5189      bfd *output_bfd;
5190      struct bfd_link_info *info;
5191 {
5192   bfd *dynobj;
5193   asection *s;
5194   boolean reltext;
5195   asection *sgot;
5196   struct mips_got_info *g;
5197
5198   dynobj = elf_hash_table (info)->dynobj;
5199   BFD_ASSERT (dynobj != NULL);
5200
5201   if (elf_hash_table (info)->dynamic_sections_created)
5202     {
5203       /* Set the contents of the .interp section to the interpreter.  */
5204       if (! info->shared)
5205         {
5206           s = bfd_get_section_by_name (dynobj, ".interp");
5207           BFD_ASSERT (s != NULL);
5208           s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
5209           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
5210         }
5211     }
5212
5213   /* Recompute the size of .got for local entires (reserved and
5214      hipages) if needed.  To estimate it, get the upper bound of total
5215      size of loadable sections.  */
5216   sgot = bfd_get_section_by_name (dynobj, ".got");
5217
5218   if (sgot != NULL)
5219     {
5220       bfd_size_type loadable_size = 0;
5221       bfd_size_type local_gotno;
5222       struct _bfd *sub;
5223
5224       BFD_ASSERT (elf_section_data (sgot) != NULL);
5225       g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
5226       BFD_ASSERT (g != NULL);
5227
5228       for (sub = info->input_bfds; sub; sub = sub->link_next)
5229         for (s = sub->sections; s != NULL; s = s->next)
5230           {
5231             if ((s->flags & SEC_ALLOC) == 0)
5232               continue;
5233             loadable_size += (s->_raw_size + 0xf) & ~0xf;
5234           }
5235
5236       loadable_size += MIPS_FUNCTION_STUB_SIZE;
5237
5238       /* Assume there are two loadable segments consisting of
5239          contiguous sections.  Is 5 enough? */
5240       local_gotno = (loadable_size >> 16) + 5 + MIPS_RESERVED_GOTNO;
5241       g->local_gotno = local_gotno;
5242       sgot->_raw_size += local_gotno * 4;
5243     }
5244
5245   /* The check_relocs and adjust_dynamic_symbol entry points have
5246      determined the sizes of the various dynamic sections.  Allocate
5247      memory for them.  */
5248   reltext = false;
5249   for (s = dynobj->sections; s != NULL; s = s->next)
5250     {
5251       const char *name;
5252       boolean strip;
5253
5254       /* It's OK to base decisions on the section name, because none
5255          of the dynobj section names depend upon the input files.  */
5256       name = bfd_get_section_name (dynobj, s);
5257
5258       if ((s->flags & SEC_IN_MEMORY) == 0)
5259         continue;
5260
5261       strip = false;
5262
5263       if (strncmp (name, ".rel", 4) == 0)
5264         {
5265           if (s->_raw_size == 0)
5266             strip = true;
5267           else
5268             {
5269               asection *target;
5270
5271               /* If this relocation section applies to a read only
5272                  section, then we probably need a DT_TEXTREL entry.
5273                  If the relocation section is .rel.dyn, we always
5274                  assert a DT_TEXTREL entry rather than testing whether
5275                  there exists a relocation to a read only section or
5276                  not.  */
5277               target = bfd_get_section_by_name (output_bfd, name + 4);
5278               if ((target != NULL && (target->flags & SEC_READONLY) != 0)
5279                   || strcmp (name, ".rel.dyn") == 0)
5280                 reltext = true;
5281
5282               /* We use the reloc_count field as a counter if we need
5283                  to copy relocs into the output file.  */
5284               if (strcmp (name, ".rel.dyn") != 0)
5285                 s->reloc_count = 0;
5286             }
5287         }
5288       else if (strncmp (name, ".got", 4) == 0)
5289         {
5290           int i;
5291
5292           BFD_ASSERT (elf_section_data (s) != NULL);
5293           g = (struct mips_got_info *) elf_section_data (s)->tdata;
5294           BFD_ASSERT (g != NULL);
5295
5296           /* Fix the size of .got section for the correspondence of
5297              global symbols and got entries. This adds some useless
5298              got entries. Is this required by ABI really?  */
5299           i = elf_hash_table (info)->dynsymcount - g->global_gotsym;
5300           s->_raw_size += i * 4;
5301         }
5302       else if (strncmp (name, ".stub", 5) == 0)
5303         {
5304           /* Irix rld assumes that the function stub isn't at the end
5305              of .text section. So put a dummy. XXX  */
5306           s->_raw_size += MIPS_FUNCTION_STUB_SIZE;
5307         }
5308       else if (! info->shared
5309                && ! mips_elf_hash_table (info)->use_rld_obj_head
5310                && strncmp (name, ".rld_map", 8) == 0)
5311         {
5312           /* We add a room for __rld_map. It will be filled in by the
5313              rtld to contain a pointer to the _r_debug structure.  */
5314           s->_raw_size += 4;
5315         }
5316       else if (SGI_COMPAT (output_bfd)
5317                && strncmp (name, ".compact_rel", 12) == 0)
5318         s->_raw_size += mips_elf_hash_table (info)->compact_rel_size;
5319       else if (strncmp (name, ".init", 5) != 0)
5320         {
5321           /* It's not one of our sections, so don't allocate space.  */
5322           continue;
5323         }
5324
5325       if (strip)
5326         {
5327           asection **spp;
5328
5329           for (spp = &s->output_section->owner->sections;
5330                *spp != s->output_section;
5331                spp = &(*spp)->next)
5332             ;
5333           *spp = s->output_section->next;
5334           --s->output_section->owner->section_count;
5335
5336           continue;
5337         }
5338
5339       /* Allocate memory for the section contents.  */
5340       s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size);
5341       if (s->contents == NULL && s->_raw_size != 0)
5342         {
5343           bfd_set_error (bfd_error_no_memory);
5344           return false;
5345         }
5346       memset (s->contents, 0, s->_raw_size);
5347     }
5348
5349   if (elf_hash_table (info)->dynamic_sections_created)
5350     {
5351       /* Add some entries to the .dynamic section.  We fill in the
5352          values later, in elf_mips_finish_dynamic_sections, but we
5353          must add the entries now so that we get the correct size for
5354          the .dynamic section.  The DT_DEBUG entry is filled in by the
5355          dynamic linker and used by the debugger.  */
5356       if (! info->shared)
5357         {
5358           if (SGI_COMPAT (output_bfd))
5359             {
5360               /* SGI object has the equivalence of DT_DEBUG in the
5361                  DT_MIPS_RLD_MAP entry.  */
5362               if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_RLD_MAP, 0))
5363                 return false;
5364             }
5365           else
5366             if (! bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0))
5367               return false;
5368         }
5369
5370       if (reltext)
5371         {
5372           if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0))
5373             return false;
5374         }
5375
5376       if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0))
5377         return false;
5378
5379       if (bfd_get_section_by_name (dynobj, ".rel.dyn"))
5380         {
5381           if (! bfd_elf32_add_dynamic_entry (info, DT_REL, 0))
5382             return false;
5383
5384           if (! bfd_elf32_add_dynamic_entry (info, DT_RELSZ, 0))
5385             return false;
5386
5387           if (! bfd_elf32_add_dynamic_entry (info, DT_RELENT, 0))
5388             return false;
5389         }
5390
5391       if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_CONFLICTNO, 0))
5392         return false;
5393
5394       if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_LIBLISTNO, 0))
5395         return false;
5396
5397       if (bfd_get_section_by_name (dynobj, ".conflict") != NULL)
5398         {
5399           if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_CONFLICT, 0))
5400             return false;
5401
5402           s = bfd_get_section_by_name (dynobj, ".liblist");
5403           BFD_ASSERT (s != NULL);
5404
5405           if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_LIBLIST, 0))
5406             return false;
5407         }
5408
5409       if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_RLD_VERSION, 0))
5410         return false;
5411
5412       if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_FLAGS, 0))
5413         return false;
5414
5415 #if 0
5416       /* Time stamps in executable files are a bad idea.  */
5417       if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_TIME_STAMP, 0))
5418         return false;
5419 #endif
5420
5421 #if 0 /* FIXME  */
5422       if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_ICHECKSUM, 0))
5423         return false;
5424 #endif
5425
5426 #if 0 /* FIXME  */
5427       if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_IVERSION, 0))
5428         return false;
5429 #endif
5430
5431       if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_BASE_ADDRESS, 0))
5432         return false;
5433
5434       if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_LOCAL_GOTNO, 0))
5435         return false;
5436
5437       if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_SYMTABNO, 0))
5438         return false;
5439
5440       if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_UNREFEXTNO, 0))
5441         return false;
5442
5443       if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_GOTSYM, 0))
5444         return false;
5445
5446       if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_HIPAGENO, 0))
5447         return false;
5448
5449 #if 0 /* (SGI_COMPAT) */
5450       if (! bfd_get_section_by_name (dynobj, ".init"))
5451         if (! bfd_elf32_add_dynamic_entry (info, DT_INIT, 0))
5452           return false;
5453
5454       if (! bfd_get_section_by_name (dynobj, ".fini"))
5455         if (! bfd_elf32_add_dynamic_entry (info, DT_FINI, 0))
5456           return false;
5457 #endif
5458     }
5459
5460   /* If we use dynamic linking, we generate a section symbol for each
5461      output section.  These are local symbols, which means that they
5462      must come first in the dynamic symbol table.
5463      That means we must increment the dynamic symbol index of every
5464      other dynamic symbol.  */
5465   {
5466     const char * const *namep;
5467     unsigned int c, i;
5468     bfd_size_type strindex;
5469     struct bfd_strtab_hash *dynstr;
5470     struct mips_got_info *g;
5471
5472     c = 0;
5473     if (elf_hash_table (info)->dynamic_sections_created)
5474       {
5475         if (SGI_COMPAT (output_bfd))
5476           {
5477             c = SIZEOF_MIPS_DYNSYM_SECNAMES - 1;
5478             elf_link_hash_traverse (elf_hash_table (info),
5479                                     mips_elf_adjust_dynindx,
5480                                     (PTR) &c);
5481             elf_hash_table (info)->dynsymcount += c;
5482
5483             dynstr = elf_hash_table (info)->dynstr;
5484             BFD_ASSERT (dynstr != NULL);
5485
5486             for (i = 1, namep = mips_elf_dynsym_sec_names;
5487                  *namep != NULL;
5488                  i++, namep++)
5489               {
5490                 s = bfd_get_section_by_name (output_bfd, *namep);
5491                 if (s != NULL)
5492                   elf_section_data (s)->dynindx = i;
5493
5494                 strindex = _bfd_stringtab_add (dynstr, *namep, true, false);
5495                 if (strindex == (bfd_size_type) -1)
5496                   return false;
5497
5498                 mips_elf_hash_table (info)->dynsym_sec_strindex[i] = strindex;
5499               }
5500           }
5501         else
5502           {
5503             c = bfd_count_sections (output_bfd);
5504             elf_link_hash_traverse (elf_hash_table (info),
5505                                     mips_elf_adjust_dynindx,
5506                                     (PTR) &c);
5507             elf_hash_table (info)->dynsymcount += c;
5508
5509             for (i = 1, s = output_bfd->sections; s != NULL; s = s->next, i++)
5510               {
5511                 elf_section_data (s)->dynindx = i;
5512                 /* These symbols will have no names, so we don't need to
5513                    fiddle with dynstr_index.  */
5514               }
5515           }
5516       }
5517
5518     s = bfd_get_section_by_name (dynobj, ".got");
5519     BFD_ASSERT (s != NULL);
5520     BFD_ASSERT (elf_section_data (s) != NULL);
5521     g = (struct mips_got_info *) elf_section_data (s)->tdata;
5522     BFD_ASSERT (g != NULL);
5523
5524     /* If there are no global got symbols, fake the last symbol so for
5525        safety.  */
5526     if (g->global_gotsym)
5527       g->global_gotsym += c;
5528     else
5529       g->global_gotsym = elf_hash_table (info)->dynsymcount - 1;
5530   }
5531
5532   return true;
5533 }
5534
5535 /* Increment the index of a dynamic symbol by a given amount.  Called
5536    via elf_link_hash_traverse.  */
5537
5538 static boolean
5539 mips_elf_adjust_dynindx (h, cparg)
5540      struct elf_link_hash_entry *h;
5541      PTR cparg;
5542 {
5543   unsigned int *cp = (unsigned int *) cparg;
5544
5545   if (h->dynindx != -1)
5546     h->dynindx += *cp;
5547   return true;
5548 }
5549
5550 /* Finish up dynamic symbol handling.  We set the contents of various
5551    dynamic sections here.  */
5552
5553 static boolean
5554 mips_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
5555      bfd *output_bfd;
5556      struct bfd_link_info *info;
5557      struct elf_link_hash_entry *h;
5558      Elf_Internal_Sym *sym;
5559 {
5560   bfd *dynobj;
5561   bfd_vma gval;
5562   asection *sgot;
5563   struct mips_got_info *g;
5564   const char *name;
5565
5566   dynobj = elf_hash_table (info)->dynobj;
5567   gval = sym->st_value;
5568
5569   if (h->plt_offset != (bfd_vma) -1)
5570     {
5571       asection *s;
5572       bfd_byte *p;
5573       bfd_byte stub[MIPS_FUNCTION_STUB_SIZE];
5574
5575       /* This symbol has a stub.  Set it up.  */
5576
5577       BFD_ASSERT (h->dynindx != -1);
5578
5579       s = bfd_get_section_by_name (dynobj, ".stub");
5580       BFD_ASSERT (s != NULL);
5581
5582       /* Fill the stub.  */
5583       p = stub;
5584       bfd_put_32 (output_bfd, STUB_LW(output_bfd), p);
5585       p += 4;
5586       bfd_put_32 (output_bfd, STUB_MOVE, p);
5587       p += 4;
5588
5589       /* FIXME: Can h->dynindex be more than 64K?  */
5590       if (h->dynindx & 0xffff0000)
5591         return false;
5592
5593       bfd_put_32 (output_bfd, STUB_JALR, p);
5594       p += 4;
5595       bfd_put_32 (output_bfd, STUB_LI16 + h->dynindx, p);
5596
5597       BFD_ASSERT (h->plt_offset <= s->_raw_size);
5598       memcpy (s->contents + h->plt_offset, stub, MIPS_FUNCTION_STUB_SIZE);
5599
5600       /* Mark the symbol as undefined.  plt_offset != -1 occurs
5601          only for the referenced symbol.  */
5602       sym->st_shndx = SHN_UNDEF;
5603
5604       /* The run-time linker uses the st_value field of the symbol
5605          to reset the global offset table entry for this external
5606          to its stub address when unlinking a shared object.  */
5607       gval = s->output_section->vma + s->output_offset + h->plt_offset;
5608       sym->st_value = gval;
5609     }
5610
5611   BFD_ASSERT (h->dynindx != -1);
5612
5613   sgot = bfd_get_section_by_name (dynobj, ".got");
5614   BFD_ASSERT (sgot != NULL);
5615   BFD_ASSERT (elf_section_data (sgot) != NULL);
5616   g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
5617   BFD_ASSERT (g != NULL);
5618
5619   if ((unsigned long) h->dynindx >= g->global_gotsym)
5620     {
5621       bfd_size_type offset;
5622
5623       /* This symbol has an entry in the global offset table.  Set its
5624          value to the corresponding got entry, if needed.  */
5625       if (h->got_offset == (bfd_vma) -1)
5626         {
5627           offset = (h->dynindx - g->global_gotsym + g->local_gotno) * 4;
5628           BFD_ASSERT (g->local_gotno * 4 <= offset
5629                       && offset < sgot->_raw_size);
5630           bfd_put_32 (output_bfd, gval, sgot->contents + offset);
5631         }
5632     }
5633
5634   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
5635   name = h->root.root.string;
5636   if (strcmp (name, "_DYNAMIC") == 0
5637       || strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
5638     sym->st_shndx = SHN_ABS;
5639   else if (strcmp (name, "_DYNAMIC_LINK") == 0)
5640     {
5641       sym->st_shndx = SHN_ABS;
5642       sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
5643       sym->st_value = 1;
5644     }
5645   else if (SGI_COMPAT (output_bfd))
5646     {
5647       if (strcmp (name, "_gp_disp") == 0)
5648         {
5649           sym->st_shndx = SHN_ABS;
5650           sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
5651           sym->st_value = elf_gp (output_bfd);
5652         }
5653       else if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
5654                || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
5655         {
5656           sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
5657           sym->st_other = STO_PROTECTED;
5658           sym->st_value = 0;
5659           sym->st_shndx = SHN_MIPS_DATA;
5660         }
5661       else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
5662         {
5663           sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
5664           sym->st_other = STO_PROTECTED;
5665           sym->st_value = mips_elf_hash_table (info)->procedure_count;
5666           sym->st_shndx = SHN_ABS;
5667         }
5668       else if (sym->st_shndx != SHN_UNDEF)
5669         {
5670           if (h->type == STT_FUNC)
5671             sym->st_shndx = SHN_MIPS_TEXT;
5672           else if (h->type == STT_OBJECT)
5673             sym->st_shndx = SHN_MIPS_DATA;
5674         }
5675     }
5676
5677   if (SGI_COMPAT (output_bfd)
5678       && ! info->shared)
5679     {
5680       if (! mips_elf_hash_table (info)->use_rld_obj_head
5681           && strcmp (name, "__rld_map") == 0)
5682         {
5683           asection *s = bfd_get_section_by_name (dynobj, ".rld_map");
5684           BFD_ASSERT (s != NULL);
5685           sym->st_value = s->output_section->vma + s->output_offset;
5686           bfd_put_32 (output_bfd, (bfd_vma) 0, s->contents);
5687           if (mips_elf_hash_table (info)->rld_value == 0)
5688             mips_elf_hash_table (info)->rld_value = sym->st_value;
5689         }
5690       else if (mips_elf_hash_table (info)->use_rld_obj_head
5691                && strcmp (name, "__rld_obj_head") == 0)
5692         {
5693           asection *s = bfd_get_section_by_name (dynobj, ".rld_map");
5694           BFD_ASSERT (s != NULL);
5695           mips_elf_hash_table (info)->rld_value = sym->st_value;
5696         }
5697     }
5698
5699   return true;
5700 }
5701
5702 /* Finish up the dynamic sections.  */
5703
5704 static boolean
5705 mips_elf_finish_dynamic_sections (output_bfd, info)
5706      bfd *output_bfd;
5707      struct bfd_link_info *info;
5708 {
5709   bfd *dynobj;
5710   asection *sdyn;
5711   asection *sgot;
5712   struct mips_got_info *g;
5713
5714   dynobj = elf_hash_table (info)->dynobj;
5715
5716   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
5717
5718   sgot = bfd_get_section_by_name (dynobj, ".got");
5719   BFD_ASSERT (sgot != NULL);
5720
5721   BFD_ASSERT (elf_section_data (sgot) != NULL);
5722   g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
5723   BFD_ASSERT (g != NULL);
5724
5725   if (elf_hash_table (info)->dynamic_sections_created)
5726     {
5727       Elf32_External_Dyn *dyncon, *dynconend;
5728
5729       BFD_ASSERT (sdyn != NULL);
5730
5731       dyncon = (Elf32_External_Dyn *) sdyn->contents;
5732       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
5733       for (; dyncon < dynconend; dyncon++)
5734         {
5735           Elf_Internal_Dyn dyn;
5736           const char *name;
5737           size_t elemsize;
5738           asection *s;
5739
5740           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5741
5742           switch (dyn.d_tag)
5743             {
5744             default:
5745               break;
5746
5747             case DT_RELENT:
5748               s = bfd_get_section_by_name (dynobj, ".rel.dyn");
5749               BFD_ASSERT (s != NULL);
5750               dyn.d_un.d_val = sizeof (Elf32_External_Rel);
5751               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5752               break;
5753
5754             case DT_STRSZ:
5755               /* Rewrite DT_STRSZ.  */
5756               dyn.d_un.d_val =
5757                 _bfd_stringtab_size (elf_hash_table (info)->dynstr);
5758               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5759               break;
5760
5761             case DT_PLTGOT:
5762               name = ".got";
5763               goto get_vma;
5764             case DT_MIPS_CONFLICT:
5765               name = ".conflict";
5766               goto get_vma;
5767             case DT_MIPS_LIBLIST:
5768               name = ".liblist";
5769             get_vma:
5770               s = bfd_get_section_by_name (output_bfd, name);
5771               BFD_ASSERT (s != NULL);
5772               dyn.d_un.d_ptr = s->vma;
5773               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5774               break;
5775
5776             case DT_MIPS_RLD_VERSION:
5777               dyn.d_un.d_val = 1; /* XXX */
5778               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5779               break;
5780
5781             case DT_MIPS_FLAGS:
5782               dyn.d_un.d_val = RHF_NOTPOT; /* XXX */
5783               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5784               break;
5785
5786             case DT_MIPS_CONFLICTNO:
5787               name = ".conflict";
5788               elemsize = sizeof (Elf32_Conflict);
5789               goto set_elemno;
5790
5791             case DT_MIPS_LIBLISTNO:
5792               name = ".liblist";
5793               elemsize = sizeof (Elf32_Lib);
5794             set_elemno:
5795               s = bfd_get_section_by_name (output_bfd, name);
5796               if (s != NULL)
5797                 {
5798                   if (s->_cooked_size != 0)
5799                     dyn.d_un.d_val = s->_cooked_size / elemsize;
5800                   else
5801                     dyn.d_un.d_val = s->_raw_size / elemsize;
5802                 }
5803               else
5804                     dyn.d_un.d_val = 0;
5805
5806               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5807               break;
5808
5809             case DT_MIPS_TIME_STAMP:
5810               time ((time_t *) &dyn.d_un.d_val);
5811               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5812               break;
5813               
5814             case DT_MIPS_ICHECKSUM:
5815               /* XXX FIXME: */
5816               break;
5817
5818             case DT_MIPS_IVERSION:
5819               /* XXX FIXME: */
5820               break;
5821
5822             case DT_MIPS_BASE_ADDRESS:
5823               s = output_bfd->sections;
5824               BFD_ASSERT (s != NULL);
5825               dyn.d_un.d_ptr = s->vma & ~(0xffff);
5826               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5827               break;
5828
5829             case DT_MIPS_LOCAL_GOTNO:
5830               dyn.d_un.d_val = g->local_gotno;
5831               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5832               break;
5833
5834             case DT_MIPS_SYMTABNO:
5835               name = ".dynsym";
5836               elemsize = sizeof (Elf32_External_Sym);
5837               s = bfd_get_section_by_name (output_bfd, name);
5838               BFD_ASSERT (s != NULL);
5839
5840               if (s->_cooked_size != 0)
5841                 dyn.d_un.d_val = s->_cooked_size / elemsize;
5842               else
5843                 dyn.d_un.d_val = s->_raw_size / elemsize;
5844               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5845               break;
5846
5847             case DT_MIPS_UNREFEXTNO:
5848               /* XXX FIXME: */
5849               dyn.d_un.d_val = SIZEOF_MIPS_DYNSYM_SECNAMES;
5850               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5851               break;
5852
5853             case DT_MIPS_GOTSYM:
5854               dyn.d_un.d_val = g->global_gotsym;
5855               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5856               break;
5857
5858             case DT_MIPS_HIPAGENO:
5859               dyn.d_un.d_val = g->local_gotno - MIPS_RESERVED_GOTNO;
5860               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5861               break;
5862
5863             case DT_MIPS_RLD_MAP:
5864               dyn.d_un.d_ptr = mips_elf_hash_table (info)->rld_value;
5865               bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5866               break;
5867
5868             }
5869         }
5870     }
5871
5872   /* The first entry of the global offset table will be filled at
5873      runtime. The second entry will be used by some runtime loaders.
5874      This isn't the case of Irix rld. */
5875   if (sgot->_raw_size > 0)
5876     {
5877       bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
5878       bfd_put_32 (output_bfd, (bfd_vma) 0x80000000, sgot->contents + 4);
5879     }
5880
5881   elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
5882
5883   {
5884     asection *sdynsym;
5885     asection *s;
5886     unsigned int i;
5887     bfd_vma last;
5888     Elf_Internal_Sym sym;
5889     long dindx;
5890     const char *name;
5891     const char * const * namep = mips_elf_dynsym_sec_names;
5892     Elf32_compact_rel cpt;
5893
5894     /* Set up the section symbols for the output sections. SGI sets
5895        the STT_NOTYPE attribute for these symbols.  Should we do so?  */
5896
5897     sdynsym = bfd_get_section_by_name (dynobj, ".dynsym");
5898     if (sdynsym != NULL)
5899       {
5900         if (SGI_COMPAT (output_bfd))
5901           {
5902             sym.st_size = 0;
5903             sym.st_name = 0;
5904             sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
5905             sym.st_other = 0;
5906
5907             i = 0;
5908             while ((name = *namep++) != NULL)
5909               {
5910                 s = bfd_get_section_by_name (output_bfd, name);
5911                 if (s != NULL)
5912                   {
5913                     sym.st_value = s->vma;
5914                     dindx = elf_section_data (s)->dynindx;
5915                     last = s->vma + s->_raw_size;
5916                   }
5917                 else
5918                   {
5919                     sym.st_value = last;
5920                     dindx++;
5921                   }
5922
5923                 sym.st_shndx = (i < MIPS_TEXT_DYNSYM_SECNO
5924                                 ? SHN_MIPS_TEXT
5925                                 : SHN_MIPS_DATA);
5926                 ++i;
5927                 sym.st_name =
5928                   mips_elf_hash_table (info)->dynsym_sec_strindex[dindx];
5929
5930                 bfd_elf32_swap_symbol_out (output_bfd, &sym,
5931                                            (((Elf32_External_Sym *)
5932                                              sdynsym->contents)
5933                                             + dindx));
5934               }
5935
5936             /* Set the sh_info field of the output .dynsym section to
5937                the index of the first global symbol.  */
5938             elf_section_data (sdynsym->output_section)->this_hdr.sh_info =
5939               SIZEOF_MIPS_DYNSYM_SECNAMES;
5940           }
5941         else
5942           {
5943             sym.st_size = 0;
5944             sym.st_name = 0;
5945             sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION);
5946             sym.st_other = 0;
5947
5948             for (s = output_bfd->sections; s != NULL; s = s->next)
5949               {
5950                 int indx;
5951
5952                 sym.st_value = s->vma;
5953
5954                 indx = elf_section_data (s)->this_idx;
5955                 BFD_ASSERT (indx > 0);
5956                 sym.st_shndx = indx;
5957
5958                 bfd_elf32_swap_symbol_out (output_bfd, &sym,
5959                                            (((Elf32_External_Sym *)
5960                                              sdynsym->contents)
5961                                             + elf_section_data (s)->dynindx));
5962               }
5963
5964             /* Set the sh_info field of the output .dynsym section to
5965                the index of the first global symbol.  */
5966             elf_section_data (sdynsym->output_section)->this_hdr.sh_info =
5967               bfd_count_sections (output_bfd) + 1;
5968           }
5969       }
5970
5971     if (SGI_COMPAT (output_bfd))
5972       {
5973         /* Write .compact_rel section out.  */
5974         s = bfd_get_section_by_name (dynobj, ".compact_rel");
5975         if (s != NULL)
5976           {
5977             cpt.id1 = 1;
5978             cpt.num = s->reloc_count;
5979             cpt.id2 = 2;
5980             cpt.offset = (s->output_section->filepos
5981                           + sizeof (Elf32_External_compact_rel));
5982             cpt.reserved0 = 0;
5983             cpt.reserved1 = 0;
5984             bfd_elf32_swap_compact_rel_out (output_bfd, &cpt, 
5985                                             ((Elf32_External_compact_rel *)
5986                                              s->contents));
5987
5988             /* Clean up a dummy stub function entry in .text.  */
5989             s = bfd_get_section_by_name (dynobj, ".stub");
5990             if (s != NULL)
5991               {
5992                 file_ptr dummy_offset;
5993
5994                 BFD_ASSERT (s->_raw_size >= MIPS_FUNCTION_STUB_SIZE);
5995                 dummy_offset = s->_raw_size - MIPS_FUNCTION_STUB_SIZE;
5996                 memset (s->contents + dummy_offset, 0,
5997                         MIPS_FUNCTION_STUB_SIZE);
5998               }
5999           }
6000       }
6001
6002     /* Clean up a first relocation in .rel.dyn.  */
6003     s = bfd_get_section_by_name (dynobj, ".rel.dyn");
6004     if (s != NULL)
6005       memset (s->contents, 0, sizeof (Elf32_External_Rel));
6006   }
6007
6008   return true;
6009 }
6010 \f
6011 /* This is almost identical to bfd_generic_get_... except that some
6012    MIPS relocations need to be handled specially.  Sigh.  */
6013
6014 static bfd_byte *
6015 elf32_mips_get_relocated_section_contents (abfd, link_info, link_order, data,
6016                                            relocateable, symbols)
6017      bfd *abfd;
6018      struct bfd_link_info *link_info;
6019      struct bfd_link_order *link_order;
6020      bfd_byte *data;
6021      boolean relocateable;
6022      asymbol **symbols;
6023 {
6024   /* Get enough memory to hold the stuff */
6025   bfd *input_bfd = link_order->u.indirect.section->owner;
6026   asection *input_section = link_order->u.indirect.section;
6027
6028   long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
6029   arelent **reloc_vector = NULL;
6030   long reloc_count;
6031
6032   if (reloc_size < 0)
6033     goto error_return;
6034
6035   reloc_vector = (arelent **) bfd_malloc (reloc_size);
6036   if (reloc_vector == NULL && reloc_size != 0)
6037     goto error_return;
6038
6039   /* read in the section */
6040   if (!bfd_get_section_contents (input_bfd,
6041                                  input_section,
6042                                  (PTR) data,
6043                                  0,
6044                                  input_section->_raw_size))
6045     goto error_return;
6046
6047   /* We're not relaxing the section, so just copy the size info */
6048   input_section->_cooked_size = input_section->_raw_size;
6049   input_section->reloc_done = true;
6050
6051   reloc_count = bfd_canonicalize_reloc (input_bfd,
6052                                         input_section,
6053                                         reloc_vector,
6054                                         symbols);
6055   if (reloc_count < 0)
6056     goto error_return;
6057
6058   if (reloc_count > 0)
6059     {
6060       arelent **parent;
6061       /* for mips */
6062       int gp_found;
6063       bfd_vma gp = 0x12345678;  /* initialize just to shut gcc up */
6064
6065       {
6066         struct bfd_hash_entry *h;
6067         struct bfd_link_hash_entry *lh;
6068         /* Skip all this stuff if we aren't mixing formats.  */
6069         if (abfd && input_bfd
6070             && abfd->xvec == input_bfd->xvec)
6071           lh = 0;
6072         else
6073           {
6074             h = bfd_hash_lookup (&link_info->hash->table, "_gp", false, false);
6075             lh = (struct bfd_link_hash_entry *) h;
6076           }
6077       lookup:
6078         if (lh)
6079           {
6080             switch (lh->type)
6081               {
6082               case bfd_link_hash_undefined:
6083               case bfd_link_hash_undefweak:
6084               case bfd_link_hash_common:
6085                 gp_found = 0;
6086                 break;
6087               case bfd_link_hash_defined:
6088               case bfd_link_hash_defweak:
6089                 gp_found = 1;
6090                 gp = lh->u.def.value;
6091                 break;
6092               case bfd_link_hash_indirect:
6093               case bfd_link_hash_warning:
6094                 lh = lh->u.i.link;
6095                 /* @@FIXME  ignoring warning for now */
6096                 goto lookup;
6097               case bfd_link_hash_new:
6098               default:
6099                 abort ();
6100               }
6101           }
6102         else
6103           gp_found = 0;
6104       }
6105       /* end mips */
6106       for (parent = reloc_vector; *parent != (arelent *) NULL;
6107            parent++)
6108         {
6109           char *error_message = (char *) NULL;
6110           bfd_reloc_status_type r;
6111
6112           /* Specific to MIPS: Deal with relocation types that require
6113              knowing the gp of the output bfd.  */
6114           asymbol *sym = *(*parent)->sym_ptr_ptr;
6115           if (bfd_is_abs_section (sym->section) && abfd)
6116             {
6117               /* The special_function wouldn't get called anyways.  */
6118             }
6119           else if (!gp_found)
6120             {
6121               /* The gp isn't there; let the special function code
6122                  fall over on its own.  */
6123             }
6124           else if ((*parent)->howto->special_function
6125                    == _bfd_mips_elf_gprel16_reloc)
6126             {
6127               /* bypass special_function call */
6128               r = gprel16_with_gp (input_bfd, sym, *parent, input_section,
6129                                    relocateable, (PTR) data, gp);
6130               goto skip_bfd_perform_relocation;
6131             }
6132           /* end mips specific stuff */
6133
6134           r = bfd_perform_relocation (input_bfd,
6135                                       *parent,
6136                                       (PTR) data,
6137                                       input_section,
6138                                       relocateable ? abfd : (bfd *) NULL,
6139                                       &error_message);
6140         skip_bfd_perform_relocation:
6141
6142           if (relocateable)
6143             {
6144               asection *os = input_section->output_section;
6145
6146               /* A partial link, so keep the relocs */
6147               os->orelocation[os->reloc_count] = *parent;
6148               os->reloc_count++;
6149             }
6150
6151           if (r != bfd_reloc_ok)
6152             {
6153               switch (r)
6154                 {
6155                 case bfd_reloc_undefined:
6156                   if (!((*link_info->callbacks->undefined_symbol)
6157                         (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
6158                          input_bfd, input_section, (*parent)->address)))
6159                     goto error_return;
6160                   break;
6161                 case bfd_reloc_dangerous:
6162                   BFD_ASSERT (error_message != (char *) NULL);
6163                   if (!((*link_info->callbacks->reloc_dangerous)
6164                         (link_info, error_message, input_bfd, input_section,
6165                          (*parent)->address)))
6166                     goto error_return;
6167                   break;
6168                 case bfd_reloc_overflow:
6169                   if (!((*link_info->callbacks->reloc_overflow)
6170                         (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
6171                          (*parent)->howto->name, (*parent)->addend,
6172                          input_bfd, input_section, (*parent)->address)))
6173                     goto error_return;
6174                   break;
6175                 case bfd_reloc_outofrange:
6176                 default:
6177                   abort ();
6178                   break;
6179                 }
6180
6181             }
6182         }
6183     }
6184   if (reloc_vector != NULL)
6185     free (reloc_vector);
6186   return data;
6187
6188 error_return:
6189   if (reloc_vector != NULL)
6190     free (reloc_vector);
6191   return NULL;
6192 }
6193 #define bfd_elf32_bfd_get_relocated_section_contents \
6194   elf32_mips_get_relocated_section_contents
6195 \f
6196 /* ECOFF swapping routines.  These are used when dealing with the
6197    .mdebug section, which is in the ECOFF debugging format.  */
6198 static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap =
6199 {
6200   /* Symbol table magic number.  */
6201   magicSym,
6202   /* Alignment of debugging information.  E.g., 4.  */
6203   4,
6204   /* Sizes of external symbolic information.  */
6205   sizeof (struct hdr_ext),
6206   sizeof (struct dnr_ext),
6207   sizeof (struct pdr_ext),
6208   sizeof (struct sym_ext),
6209   sizeof (struct opt_ext),
6210   sizeof (struct fdr_ext),
6211   sizeof (struct rfd_ext),
6212   sizeof (struct ext_ext),
6213   /* Functions to swap in external symbolic data.  */
6214   ecoff_swap_hdr_in,
6215   ecoff_swap_dnr_in,
6216   ecoff_swap_pdr_in,
6217   ecoff_swap_sym_in,
6218   ecoff_swap_opt_in,
6219   ecoff_swap_fdr_in,
6220   ecoff_swap_rfd_in,
6221   ecoff_swap_ext_in,
6222   _bfd_ecoff_swap_tir_in,
6223   _bfd_ecoff_swap_rndx_in,
6224   /* Functions to swap out external symbolic data.  */
6225   ecoff_swap_hdr_out,
6226   ecoff_swap_dnr_out,
6227   ecoff_swap_pdr_out,
6228   ecoff_swap_sym_out,
6229   ecoff_swap_opt_out,
6230   ecoff_swap_fdr_out,
6231   ecoff_swap_rfd_out,
6232   ecoff_swap_ext_out,
6233   _bfd_ecoff_swap_tir_out,
6234   _bfd_ecoff_swap_rndx_out,
6235   /* Function to read in symbolic data.  */
6236   _bfd_mips_elf_read_ecoff_info
6237 };
6238 \f
6239 #define TARGET_LITTLE_SYM               bfd_elf32_littlemips_vec
6240 #define TARGET_LITTLE_NAME              "elf32-littlemips"
6241 #define TARGET_BIG_SYM                  bfd_elf32_bigmips_vec
6242 #define TARGET_BIG_NAME                 "elf32-bigmips"
6243 #define ELF_ARCH                        bfd_arch_mips
6244 #define ELF_MACHINE_CODE                EM_MIPS
6245
6246 /* The SVR4 MIPS ABI says that this should be 0x10000, but Irix 5 uses
6247    a value of 0x1000, and we are compatible.  */
6248 #define ELF_MAXPAGESIZE                 0x1000
6249
6250 #define elf_backend_collect             true
6251 #define elf_backend_type_change_ok      true
6252 #define elf_info_to_howto               0
6253 #define elf_info_to_howto_rel           mips_info_to_howto_rel
6254 #define elf_backend_sym_is_global       mips_elf_sym_is_global
6255 #define elf_backend_object_p            mips_elf32_object_p
6256 #define elf_backend_section_from_shdr   mips_elf32_section_from_shdr
6257 #define elf_backend_fake_sections       _bfd_mips_elf_fake_sections
6258 #define elf_backend_section_from_bfd_section \
6259                                         _bfd_mips_elf_section_from_bfd_section
6260 #define elf_backend_section_processing  mips_elf32_section_processing
6261 #define elf_backend_symbol_processing   _bfd_mips_elf_symbol_processing
6262 #define elf_backend_additional_program_headers \
6263                                         mips_elf_additional_program_headers
6264 #define elf_backend_modify_segment_map  mips_elf_modify_segment_map
6265 #define elf_backend_final_write_processing \
6266                                         _bfd_mips_elf_final_write_processing
6267 #define elf_backend_ecoff_debug_swap    &mips_elf32_ecoff_debug_swap
6268
6269 #define bfd_elf32_bfd_is_local_label    mips_elf_is_local_label
6270 #define bfd_elf32_find_nearest_line     _bfd_mips_elf_find_nearest_line
6271 #define bfd_elf32_set_section_contents  _bfd_mips_elf_set_section_contents
6272 #define bfd_elf32_bfd_link_hash_table_create \
6273                                         mips_elf_link_hash_table_create
6274 #define bfd_elf32_bfd_final_link        mips_elf_final_link
6275 #define bfd_elf32_bfd_copy_private_bfd_data \
6276                                         _bfd_mips_elf_copy_private_bfd_data
6277 #define bfd_elf32_bfd_merge_private_bfd_data \
6278                                         _bfd_mips_elf_merge_private_bfd_data
6279 #define bfd_elf32_bfd_set_private_flags _bfd_mips_elf_set_private_flags
6280 #define elf_backend_add_symbol_hook     mips_elf_add_symbol_hook
6281 #define elf_backend_create_dynamic_sections \
6282                                         mips_elf_create_dynamic_sections
6283 #define elf_backend_check_relocs        mips_elf_check_relocs
6284 #define elf_backend_adjust_dynamic_symbol \
6285                                         mips_elf_adjust_dynamic_symbol
6286 #define elf_backend_size_dynamic_sections \
6287                                         mips_elf_size_dynamic_sections
6288 #define elf_backend_relocate_section    mips_elf_relocate_section
6289 #define elf_backend_finish_dynamic_symbol \
6290                                         mips_elf_finish_dynamic_symbol
6291 #define elf_backend_finish_dynamic_sections \
6292                                         mips_elf_finish_dynamic_sections
6293
6294 #include "elf32-target.h"