OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [branches/] [oc/] [gdb-5.0/] [bfd/] [elf32-mips.c] - Blame information for rev 1781

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 104 markom
/* MIPS-specific support for 32-bit ELF
2
   Copyright 1993, 94, 95, 96, 97, 98, 1999 Free Software Foundation, Inc.
3
 
4
   Most of the information added by Ian Lance Taylor, Cygnus Support,
5
   <ian@cygnus.com>.
6
   N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
7
   <mark@codesourcery.com>
8
 
9
This file is part of BFD, the Binary File Descriptor library.
10
 
11
This program is free software; you can redistribute it and/or modify
12
it under the terms of the GNU General Public License as published by
13
the Free Software Foundation; either version 2 of the License, or
14
(at your option) any later version.
15
 
16
This program is distributed in the hope that it will be useful,
17
but WITHOUT ANY WARRANTY; without even the implied warranty of
18
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
GNU General Public License for more details.
20
 
21
You should have received a copy of the GNU General Public License
22
along with this program; if not, write to the Free Software
23
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
24
 
25
/* This file handles MIPS ELF targets.  SGI Irix 5 uses a slightly
26
   different MIPS ELF from other targets.  This matters when linking.
27
   This file supports both, switching at runtime.  */
28
 
29
#include "bfd.h"
30
#include "sysdep.h"
31
#include "libbfd.h"
32
#include "bfdlink.h"
33
#include "genlink.h"
34
#include "elf-bfd.h"
35
#include "elf/mips.h"
36
 
37
/* Get the ECOFF swapping routines.  */
38
#include "coff/sym.h"
39
#include "coff/symconst.h"
40
#include "coff/internal.h"
41
#include "coff/ecoff.h"
42
#include "coff/mips.h"
43
#define ECOFF_32
44
#include "ecoffswap.h"
45
 
46
/* This structure is used to hold .got information when linking.  It
47
   is stored in the tdata field of the bfd_elf_section_data structure.  */
48
 
49
struct mips_got_info
50
{
51
  /* The global symbol in the GOT with the lowest index in the dynamic
52
     symbol table.  */
53
  struct elf_link_hash_entry *global_gotsym;
54
  /* The number of global .got entries.  */
55
  unsigned int global_gotno;
56
  /* The number of local .got entries.  */
57
  unsigned int local_gotno;
58
  /* The number of local .got entries we have used.  */
59
  unsigned int assigned_gotno;
60
};
61
 
62
/* The MIPS ELF linker needs additional information for each symbol in
63
   the global hash table.  */
64
 
65
struct mips_elf_link_hash_entry
66
{
67
  struct elf_link_hash_entry root;
68
 
69
  /* External symbol information.  */
70
  EXTR esym;
71
 
72
  /* Number of R_MIPS_32, R_MIPS_REL32, or R_MIPS_64 relocs against
73
     this symbol.  */
74
  unsigned int possibly_dynamic_relocs;
75
 
76
  /* The index of the first dynamic relocation (in the .rel.dyn
77
     section) against this symbol.  */
78
  unsigned int min_dyn_reloc_index;
79
 
80
  /* If there is a stub that 32 bit functions should use to call this
81
     16 bit function, this points to the section containing the stub.  */
82
  asection *fn_stub;
83
 
84
  /* Whether we need the fn_stub; this is set if this symbol appears
85
     in any relocs other than a 16 bit call.  */
86
  boolean need_fn_stub;
87
 
88
  /* If there is a stub that 16 bit functions should use to call this
89
     32 bit function, this points to the section containing the stub.  */
90
  asection *call_stub;
91
 
92
  /* This is like the call_stub field, but it is used if the function
93
     being called returns a floating point value.  */
94
  asection *call_fp_stub;
95
};
96
 
97
static bfd_reloc_status_type mips32_64bit_reloc
98
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
99
static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
100
  PARAMS ((bfd *, bfd_reloc_code_real_type));
101
static reloc_howto_type *mips_rtype_to_howto
102
  PARAMS ((unsigned int));
103
static void mips_info_to_howto_rel
104
  PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
105
static void mips_info_to_howto_rela
106
  PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
107
static void bfd_mips_elf32_swap_gptab_in
108
  PARAMS ((bfd *, const Elf32_External_gptab *, Elf32_gptab *));
109
static void bfd_mips_elf32_swap_gptab_out
110
  PARAMS ((bfd *, const Elf32_gptab *, Elf32_External_gptab *));
111
#if 0
112
static void bfd_mips_elf_swap_msym_in
113
  PARAMS ((bfd *, const Elf32_External_Msym *, Elf32_Internal_Msym *));
114
#endif
115
static void bfd_mips_elf_swap_msym_out
116
  PARAMS ((bfd *, const Elf32_Internal_Msym *, Elf32_External_Msym *));
117
static boolean mips_elf_sym_is_global PARAMS ((bfd *, asymbol *));
118
static boolean mips_elf_create_procedure_table
119
  PARAMS ((PTR, bfd *, struct bfd_link_info *, asection *,
120
           struct ecoff_debug_info *));
121
static INLINE int elf_mips_isa PARAMS ((flagword));
122
static INLINE int elf_mips_mach PARAMS ((flagword));
123
static INLINE char* elf_mips_abi_name PARAMS ((bfd *));
124
static boolean mips_elf_is_local_label_name
125
  PARAMS ((bfd *, const char *));
126
static struct bfd_hash_entry *mips_elf_link_hash_newfunc
127
  PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
128
static int gptab_compare PARAMS ((const void *, const void *));
129
static bfd_reloc_status_type mips16_jump_reloc
130
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
131
static bfd_reloc_status_type mips16_gprel_reloc
132
  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
133
static boolean mips_elf_create_compact_rel_section
134
  PARAMS ((bfd *, struct bfd_link_info *));
135
static boolean mips_elf_create_got_section
136
  PARAMS ((bfd *, struct bfd_link_info *));
137
static bfd_reloc_status_type mips_elf_final_gp
138
  PARAMS ((bfd *, asymbol *, boolean, char **, bfd_vma *));
139
static bfd_byte *elf32_mips_get_relocated_section_contents
140
  PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
141
           bfd_byte *, boolean, asymbol **));
142
static asection *mips_elf_create_msym_section
143
  PARAMS ((bfd *));
144
static void mips_elf_irix6_finish_dynamic_symbol
145
  PARAMS ((bfd *, const char *, Elf_Internal_Sym *));
146
static bfd_vma mips_elf_sign_extend PARAMS ((bfd_vma, int));
147
static boolean mips_elf_overflow_p PARAMS ((bfd_vma, int));
148
static bfd_vma mips_elf_high PARAMS ((bfd_vma));
149
static bfd_vma mips_elf_higher PARAMS ((bfd_vma));
150
static bfd_vma mips_elf_highest PARAMS ((bfd_vma));
151
static bfd_vma mips_elf_global_got_index
152
  PARAMS ((bfd *, struct elf_link_hash_entry *));
153
static bfd_vma mips_elf_local_got_index
154
  PARAMS ((bfd *, struct bfd_link_info *, bfd_vma));
155
static bfd_vma mips_elf_got_offset_from_index
156
  PARAMS ((bfd *, bfd *, bfd_vma));
157
static boolean mips_elf_record_global_got_symbol
158
  PARAMS ((struct elf_link_hash_entry *, struct bfd_link_info *,
159
           struct mips_got_info *));
160
static bfd_vma mips_elf_got_page
161
  PARAMS ((bfd *, struct bfd_link_info *, bfd_vma, bfd_vma *));
162
static const Elf_Internal_Rela *mips_elf_next_relocation
163
  PARAMS ((unsigned int, const Elf_Internal_Rela *,
164
           const Elf_Internal_Rela *));
165
static bfd_reloc_status_type mips_elf_calculate_relocation
166
  PARAMS ((bfd *, bfd *, asection *, struct bfd_link_info *,
167
           const Elf_Internal_Rela *, bfd_vma, reloc_howto_type *,
168
           Elf_Internal_Sym *, asection **, bfd_vma *, const char **,
169
           boolean *));
170
static bfd_vma mips_elf_obtain_contents
171
  PARAMS ((reloc_howto_type *, const Elf_Internal_Rela *, bfd *, bfd_byte *));
172
static boolean mips_elf_perform_relocation
173
  PARAMS ((struct bfd_link_info *, reloc_howto_type *,
174
           const Elf_Internal_Rela *, bfd_vma,
175
           bfd *, asection *, bfd_byte *, boolean));
176
static boolean mips_elf_assign_gp PARAMS ((bfd *, bfd_vma *));
177
static boolean mips_elf_sort_hash_table_f
178
  PARAMS ((struct mips_elf_link_hash_entry *, PTR));
179
static boolean mips_elf_sort_hash_table
180
  PARAMS ((struct bfd_link_info *, unsigned long));
181
static asection * mips_elf_got_section PARAMS ((bfd *));
182
static struct mips_got_info *mips_elf_got_info
183
  PARAMS ((bfd *, asection **));
184
static boolean mips_elf_local_relocation_p
185
  PARAMS ((bfd *, const Elf_Internal_Rela *, asection **));
186
static bfd_vma mips_elf_create_local_got_entry
187
  PARAMS ((bfd *, struct mips_got_info *, asection *, bfd_vma));
188
static bfd_vma mips_elf_got16_entry
189
  PARAMS ((bfd *, struct bfd_link_info *, bfd_vma));
190
static boolean mips_elf_create_dynamic_relocation
191
  PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Rela *,
192
           struct mips_elf_link_hash_entry *, asection *,
193
           bfd_vma, bfd_vma *, asection *));
194
static void mips_elf_allocate_dynamic_relocations
195
  PARAMS ((bfd *, unsigned int));
196
static boolean mips_elf_stub_section_p
197
  PARAMS ((bfd *, asection *));
198
 
199
/* The level of IRIX compatibility we're striving for.  */
200
 
201
typedef enum {
202
  ict_none,
203
  ict_irix5,
204
  ict_irix6
205
} irix_compat_t;
206
 
207
/* Nonzero if ABFD is using the N32 ABI.  */
208
 
209
#define ABI_N32_P(abfd) \
210
  ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
211
 
212
/* Nonzero if ABFD is using the 64-bit ABI.  FIXME: This is never
213
   true, yet.  */
214
#define ABI_64_P(abfd) \
215
  ((elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64) != 0)
216
 
217
/* What version of Irix we are trying to be compatible with.  FIXME:
218
   At the moment, we never generate "normal" MIPS ELF ABI executables;
219
   we always use some version of Irix.  */
220
 
221
#define IRIX_COMPAT(abfd) \
222
  ((ABI_N32_P (abfd) || ABI_64_P (abfd)) ? ict_irix6 : ict_irix5)
223
 
224
/* Whether we are trying to be compatible with IRIX at all.  */
225
 
226
#define SGI_COMPAT(abfd) \
227
  (IRIX_COMPAT (abfd) != ict_none)
228
 
229
/* The name of the msym section.  */
230
#define MIPS_ELF_MSYM_SECTION_NAME(abfd) ".msym"
231
 
232
/* The name of the srdata section.  */
233
#define MIPS_ELF_SRDATA_SECTION_NAME(abfd) ".srdata"
234
 
235
/* The name of the options section.  */
236
#define MIPS_ELF_OPTIONS_SECTION_NAME(abfd) \
237
  (IRIX_COMPAT (abfd) == ict_irix6 ? ".MIPS.options" : ".options")
238
 
239
/* The name of the stub section.  */
240
#define MIPS_ELF_STUB_SECTION_NAME(abfd) \
241
  (IRIX_COMPAT (abfd) == ict_irix6 ? ".MIPS.stubs" : ".stub")
242
 
243
/* The name of the dynamic relocation section.  */
244
#define MIPS_ELF_REL_DYN_SECTION_NAME(abfd) ".rel.dyn"
245
 
246
/* The size of an external REL relocation.  */
247
#define MIPS_ELF_REL_SIZE(abfd) \
248
  (get_elf_backend_data (abfd)->s->sizeof_rel)
249
 
250
/* The size of an external dynamic table entry.  */
251
#define MIPS_ELF_DYN_SIZE(abfd) \
252
  (get_elf_backend_data (abfd)->s->sizeof_dyn)
253
 
254
/* The size of a GOT entry.  */
255
#define MIPS_ELF_GOT_SIZE(abfd) \
256
  (get_elf_backend_data (abfd)->s->arch_size / 8)
257
 
258
/* The size of a symbol-table entry.  */
259
#define MIPS_ELF_SYM_SIZE(abfd) \
260
  (get_elf_backend_data (abfd)->s->sizeof_sym)
261
 
262
/* The default alignment for sections, as a power of two.  */
263
#define MIPS_ELF_LOG_FILE_ALIGN(abfd)                           \
264
  (get_elf_backend_data (abfd)->s->file_align == 8 ? 3 : 2)
265
 
266
/* Get word-sized data.  */
267
#define MIPS_ELF_GET_WORD(abfd, ptr) \
268
  (ABI_64_P (abfd) ? bfd_get_64 (abfd, ptr) : bfd_get_32 (abfd, ptr))
269
 
270
/* Put out word-sized data.  */
271
#define MIPS_ELF_PUT_WORD(abfd, val, ptr)       \
272
  (ABI_64_P (abfd)                              \
273
   ? bfd_put_64 (abfd, val, ptr)                \
274
   : bfd_put_32 (abfd, val, ptr))
275
 
276
/* Add a dynamic symbol table-entry.  */
277
#ifdef BFD64
278
#define MIPS_ELF_ADD_DYNAMIC_ENTRY(info, tag, val) \
279
  (ABI_64_P (elf_hash_table (info)->dynobj)        \
280
   ? bfd_elf64_add_dynamic_entry (info, tag, val)  \
281
   : bfd_elf32_add_dynamic_entry (info, tag, val))
282
#else
283
#define MIPS_ELF_ADD_DYNAMIC_ENTRY(info, tag, val) \
284
  (ABI_64_P (elf_hash_table (info)->dynobj)        \
285
   ? (abort (), false)                             \
286
   : bfd_elf32_add_dynamic_entry (info, tag, val))
287
#endif
288
 
289
/* The number of local .got entries we reserve.  */
290
#define MIPS_RESERVED_GOTNO (2)
291
 
292
/* Instructions which appear in a stub.  For some reason the stub is
293
   slightly different on an SGI system.  */
294
#define ELF_MIPS_GP_OFFSET(abfd) (SGI_COMPAT (abfd) ? 0x7ff0 : 0x8000)
295
#define STUB_LW(abfd)                                           \
296
  (SGI_COMPAT (abfd)                                            \
297
   ? (ABI_64_P (abfd)                                           \
298
      ? 0xdf998010              /* ld t9,0x8010(gp) */          \
299
      : 0x8f998010)             /* lw t9,0x8010(gp) */          \
300
   : 0x8f998000)                /* lw t9,0x8000(gp) */
301
#define STUB_MOVE 0x03e07825    /* move t7,ra */
302
#define STUB_JALR 0x0320f809    /* jal t9 */
303
#define STUB_LI16 0x34180000    /* ori t8,zero,0 */
304
#define MIPS_FUNCTION_STUB_SIZE (16)
305
 
306
#if 0
307
/* We no longer try to identify particular sections for the .dynsym
308
   section.  When we do, we wind up crashing if there are other random
309
   sections with relocations.  */
310
 
311
/* Names of sections which appear in the .dynsym section in an Irix 5
312
   executable.  */
313
 
314
static const char * const mips_elf_dynsym_sec_names[] =
315
{
316
  ".text",
317
  ".init",
318
  ".fini",
319
  ".data",
320
  ".rodata",
321
  ".sdata",
322
  ".sbss",
323
  ".bss",
324
  NULL
325
};
326
 
327
#define SIZEOF_MIPS_DYNSYM_SECNAMES \
328
  (sizeof mips_elf_dynsym_sec_names / sizeof mips_elf_dynsym_sec_names[0])
329
 
330
/* The number of entries in mips_elf_dynsym_sec_names which go in the
331
   text segment.  */
332
 
333
#define MIPS_TEXT_DYNSYM_SECNO (3)
334
 
335
#endif /* 0 */
336
 
337
/* The names of the runtime procedure table symbols used on Irix 5.  */
338
 
339
static const char * const mips_elf_dynsym_rtproc_names[] =
340
{
341
  "_procedure_table",
342
  "_procedure_string_table",
343
  "_procedure_table_size",
344
  NULL
345
};
346
 
347
/* These structures are used to generate the .compact_rel section on
348
   Irix 5.  */
349
 
350
typedef struct
351
{
352
  unsigned long id1;            /* Always one?  */
353
  unsigned long num;            /* Number of compact relocation entries.  */
354
  unsigned long id2;            /* Always two?  */
355
  unsigned long offset;         /* The file offset of the first relocation.  */
356
  unsigned long reserved0;      /* Zero?  */
357
  unsigned long reserved1;      /* Zero?  */
358
} Elf32_compact_rel;
359
 
360
typedef struct
361
{
362
  bfd_byte id1[4];
363
  bfd_byte num[4];
364
  bfd_byte id2[4];
365
  bfd_byte offset[4];
366
  bfd_byte reserved0[4];
367
  bfd_byte reserved1[4];
368
} Elf32_External_compact_rel;
369
 
370
typedef struct
371
{
372
  unsigned int ctype : 1;       /* 1: long 0: short format. See below.  */
373
  unsigned int rtype : 4;       /* Relocation types. See below. */
374
  unsigned int dist2to : 8;
375
  unsigned int relvaddr : 19;   /* (VADDR - vaddr of the previous entry)/ 4 */
376
  unsigned long konst;          /* KONST field. See below.  */
377
  unsigned long vaddr;          /* VADDR to be relocated.  */
378
} Elf32_crinfo;
379
 
380
typedef struct
381
{
382
  unsigned int ctype : 1;       /* 1: long 0: short format. See below.  */
383
  unsigned int rtype : 4;       /* Relocation types. See below. */
384
  unsigned int dist2to : 8;
385
  unsigned int relvaddr : 19;   /* (VADDR - vaddr of the previous entry)/ 4 */
386
  unsigned long konst;          /* KONST field. See below.  */
387
} Elf32_crinfo2;
388
 
389
typedef struct
390
{
391
  bfd_byte info[4];
392
  bfd_byte konst[4];
393
  bfd_byte vaddr[4];
394
} Elf32_External_crinfo;
395
 
396
typedef struct
397
{
398
  bfd_byte info[4];
399
  bfd_byte konst[4];
400
} Elf32_External_crinfo2;
401
 
402
/* These are the constants used to swap the bitfields in a crinfo.  */
403
 
404
#define CRINFO_CTYPE (0x1)
405
#define CRINFO_CTYPE_SH (31)
406
#define CRINFO_RTYPE (0xf)
407
#define CRINFO_RTYPE_SH (27)
408
#define CRINFO_DIST2TO (0xff)
409
#define CRINFO_DIST2TO_SH (19)
410
#define CRINFO_RELVADDR (0x7ffff)
411
#define CRINFO_RELVADDR_SH (0)
412
 
413
/* A compact relocation info has long (3 words) or short (2 words)
414
   formats.  A short format doesn't have VADDR field and relvaddr
415
   fields contains ((VADDR - vaddr of the previous entry) >> 2).  */
416
#define CRF_MIPS_LONG                   1
417
#define CRF_MIPS_SHORT                  0
418
 
419
/* There are 4 types of compact relocation at least. The value KONST
420
   has different meaning for each type:
421
 
422
   (type)               (konst)
423
   CT_MIPS_REL32        Address in data
424
   CT_MIPS_WORD         Address in word (XXX)
425
   CT_MIPS_GPHI_LO      GP - vaddr
426
   CT_MIPS_JMPAD        Address to jump
427
   */
428
 
429
#define CRT_MIPS_REL32                  0xa
430
#define CRT_MIPS_WORD                   0xb
431
#define CRT_MIPS_GPHI_LO                0xc
432
#define CRT_MIPS_JMPAD                  0xd
433
 
434
#define mips_elf_set_cr_format(x,format)        ((x).ctype = (format))
435
#define mips_elf_set_cr_type(x,type)            ((x).rtype = (type))
436
#define mips_elf_set_cr_dist2to(x,v)            ((x).dist2to = (v))
437
#define mips_elf_set_cr_relvaddr(x,d)           ((x).relvaddr = (d)<<2)
438
 
439
static void bfd_elf32_swap_compact_rel_out
440
  PARAMS ((bfd *, const Elf32_compact_rel *, Elf32_External_compact_rel *));
441
static void bfd_elf32_swap_crinfo_out
442
  PARAMS ((bfd *, const Elf32_crinfo *, Elf32_External_crinfo *));
443
 
444
#define USE_REL 1               /* MIPS uses REL relocations instead of RELA */
445
 
446
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
447
   from smaller values.  Start with zero, widen, *then* decrement.  */
448
#define MINUS_ONE       (((bfd_vma)0) - 1)
449
 
450
static reloc_howto_type elf_mips_howto_table[] =
451
{
452
  /* No relocation.  */
453
  HOWTO (R_MIPS_NONE,           /* type */
454
         0,                      /* rightshift */
455
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
456
         0,                      /* bitsize */
457
         false,                 /* pc_relative */
458
         0,                      /* bitpos */
459
         complain_overflow_dont, /* complain_on_overflow */
460
         bfd_elf_generic_reloc, /* special_function */
461
         "R_MIPS_NONE",         /* name */
462
         false,                 /* partial_inplace */
463
         0,                      /* src_mask */
464
         0,                      /* dst_mask */
465
         false),                /* pcrel_offset */
466
 
467
  /* 16 bit relocation.  */
468
  HOWTO (R_MIPS_16,             /* type */
469
         0,                      /* rightshift */
470
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
471
         16,                    /* bitsize */
472
         false,                 /* pc_relative */
473
         0,                      /* bitpos */
474
         complain_overflow_bitfield, /* complain_on_overflow */
475
         bfd_elf_generic_reloc, /* special_function */
476
         "R_MIPS_16",           /* name */
477
         true,                  /* partial_inplace */
478
         0xffff,                /* src_mask */
479
         0xffff,                /* dst_mask */
480
         false),                /* pcrel_offset */
481
 
482
  /* 32 bit relocation.  */
483
  HOWTO (R_MIPS_32,             /* type */
484
         0,                      /* rightshift */
485
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
486
         32,                    /* bitsize */
487
         false,                 /* pc_relative */
488
         0,                      /* bitpos */
489
         complain_overflow_bitfield, /* complain_on_overflow */
490
         bfd_elf_generic_reloc, /* special_function */
491
         "R_MIPS_32",           /* name */
492
         true,                  /* partial_inplace */
493
         0xffffffff,            /* src_mask */
494
         0xffffffff,            /* dst_mask */
495
         false),                /* pcrel_offset */
496
 
497
  /* 32 bit symbol relative relocation.  */
498
  HOWTO (R_MIPS_REL32,          /* type */
499
         0,                      /* rightshift */
500
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
501
         32,                    /* bitsize */
502
         false,                 /* pc_relative */
503
         0,                      /* bitpos */
504
         complain_overflow_bitfield, /* complain_on_overflow */
505
         bfd_elf_generic_reloc, /* special_function */
506
         "R_MIPS_REL32",        /* name */
507
         true,                  /* partial_inplace */
508
         0xffffffff,            /* src_mask */
509
         0xffffffff,            /* dst_mask */
510
         false),                /* pcrel_offset */
511
 
512
  /* 26 bit branch address.  */
513
  HOWTO (R_MIPS_26,             /* type */
514
         2,                     /* rightshift */
515
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
516
         26,                    /* bitsize */
517
         false,                 /* pc_relative */
518
         0,                      /* bitpos */
519
         complain_overflow_dont, /* complain_on_overflow */
520
                                /* This needs complex overflow
521
                                   detection, because the upper four
522
                                   bits must match the PC.  */
523
         bfd_elf_generic_reloc, /* special_function */
524
         "R_MIPS_26",           /* name */
525
         true,                  /* partial_inplace */
526
         0x3ffffff,             /* src_mask */
527
         0x3ffffff,             /* dst_mask */
528
         false),                /* pcrel_offset */
529
 
530
  /* High 16 bits of symbol value.  */
531
  HOWTO (R_MIPS_HI16,           /* type */
532
         0,                      /* rightshift */
533
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
534
         16,                    /* bitsize */
535
         false,                 /* pc_relative */
536
         0,                      /* bitpos */
537
         complain_overflow_dont, /* complain_on_overflow */
538
         _bfd_mips_elf_hi16_reloc,      /* special_function */
539
         "R_MIPS_HI16",         /* name */
540
         true,                  /* partial_inplace */
541
         0xffff,                /* src_mask */
542
         0xffff,                /* dst_mask */
543
         false),                /* pcrel_offset */
544
 
545
  /* Low 16 bits of symbol value.  */
546
  HOWTO (R_MIPS_LO16,           /* type */
547
         0,                      /* rightshift */
548
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
549
         16,                    /* bitsize */
550
         false,                 /* pc_relative */
551
         0,                      /* bitpos */
552
         complain_overflow_dont, /* complain_on_overflow */
553
         _bfd_mips_elf_lo16_reloc,      /* special_function */
554
         "R_MIPS_LO16",         /* name */
555
         true,                  /* partial_inplace */
556
         0xffff,                /* src_mask */
557
         0xffff,                /* dst_mask */
558
         false),                /* pcrel_offset */
559
 
560
  /* GP relative reference.  */
561
  HOWTO (R_MIPS_GPREL16,        /* 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_signed, /* complain_on_overflow */
568
         _bfd_mips_elf_gprel16_reloc, /* special_function */
569
         "R_MIPS_GPREL16",      /* name */
570
         true,                  /* partial_inplace */
571
         0xffff,                /* src_mask */
572
         0xffff,                /* dst_mask */
573
         false),                /* pcrel_offset */
574
 
575
  /* Reference to literal section.  */
576
  HOWTO (R_MIPS_LITERAL,        /* type */
577
         0,                      /* rightshift */
578
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
579
         16,                    /* bitsize */
580
         false,                 /* pc_relative */
581
         0,                      /* bitpos */
582
         complain_overflow_signed, /* complain_on_overflow */
583
         _bfd_mips_elf_gprel16_reloc, /* special_function */
584
         "R_MIPS_LITERAL",      /* name */
585
         true,                  /* partial_inplace */
586
         0xffff,                /* src_mask */
587
         0xffff,                /* dst_mask */
588
         false),                /* pcrel_offset */
589
 
590
  /* Reference to global offset table.  */
591
  HOWTO (R_MIPS_GOT16,          /* type */
592
         0,                      /* rightshift */
593
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
594
         16,                    /* bitsize */
595
         false,                 /* pc_relative */
596
         0,                      /* bitpos */
597
         complain_overflow_signed, /* complain_on_overflow */
598
         _bfd_mips_elf_got16_reloc,     /* special_function */
599
         "R_MIPS_GOT16",        /* name */
600
         false,                 /* partial_inplace */
601
         0xffff,                /* src_mask */
602
         0xffff,                /* dst_mask */
603
         false),                /* pcrel_offset */
604
 
605
  /* 16 bit PC relative reference.  */
606
  HOWTO (R_MIPS_PC16,           /* type */
607
         0,                      /* rightshift */
608
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
609
         16,                    /* bitsize */
610
         true,                  /* pc_relative */
611
         0,                      /* bitpos */
612
         complain_overflow_signed, /* complain_on_overflow */
613
         bfd_elf_generic_reloc, /* special_function */
614
         "R_MIPS_PC16",         /* name */
615
         true,                  /* partial_inplace */
616
         0xffff,                /* src_mask */
617
         0xffff,                /* dst_mask */
618
         true),                 /* pcrel_offset */
619
 
620
  /* 16 bit call through global offset table.  */
621
  HOWTO (R_MIPS_CALL16,         /* type */
622
         0,                      /* rightshift */
623
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
624
         16,                    /* bitsize */
625
         false,                 /* pc_relative */
626
         0,                      /* bitpos */
627
         complain_overflow_signed, /* complain_on_overflow */
628
         bfd_elf_generic_reloc, /* special_function */
629
         "R_MIPS_CALL16",       /* name */
630
         false,                 /* partial_inplace */
631
         0xffff,                /* src_mask */
632
         0xffff,                /* dst_mask */
633
         false),                /* pcrel_offset */
634
 
635
  /* 32 bit GP relative reference.  */
636
  HOWTO (R_MIPS_GPREL32,        /* type */
637
         0,                      /* rightshift */
638
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
639
         32,                    /* bitsize */
640
         false,                 /* pc_relative */
641
         0,                      /* bitpos */
642
         complain_overflow_bitfield, /* complain_on_overflow */
643
         _bfd_mips_elf_gprel32_reloc, /* special_function */
644
         "R_MIPS_GPREL32",      /* name */
645
         true,                  /* partial_inplace */
646
         0xffffffff,            /* src_mask */
647
         0xffffffff,            /* dst_mask */
648
         false),                /* pcrel_offset */
649
 
650
    /* The remaining relocs are defined on Irix 5, although they are
651
       not defined by the ABI.  */
652
    EMPTY_HOWTO (13),
653
    EMPTY_HOWTO (14),
654
    EMPTY_HOWTO (15),
655
 
656
  /* A 5 bit shift field.  */
657
  HOWTO (R_MIPS_SHIFT5,         /* type */
658
         0,                      /* rightshift */
659
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
660
         5,                     /* bitsize */
661
         false,                 /* pc_relative */
662
         6,                     /* bitpos */
663
         complain_overflow_bitfield, /* complain_on_overflow */
664
         bfd_elf_generic_reloc, /* special_function */
665
         "R_MIPS_SHIFT5",       /* name */
666
         true,                  /* partial_inplace */
667
         0x000007c0,            /* src_mask */
668
         0x000007c0,            /* dst_mask */
669
         false),                /* pcrel_offset */
670
 
671
  /* A 6 bit shift field.  */
672
  /* FIXME: This is not handled correctly; a special function is
673
     needed to put the most significant bit in the right place.  */
674
  HOWTO (R_MIPS_SHIFT6,         /* type */
675
         0,                      /* rightshift */
676
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
677
         6,                     /* bitsize */
678
         false,                 /* pc_relative */
679
         6,                     /* bitpos */
680
         complain_overflow_bitfield, /* complain_on_overflow */
681
         bfd_elf_generic_reloc, /* special_function */
682
         "R_MIPS_SHIFT6",       /* name */
683
         true,                  /* partial_inplace */
684
         0x000007c4,            /* src_mask */
685
         0x000007c4,            /* dst_mask */
686
         false),                /* pcrel_offset */
687
 
688
  /* A 64 bit relocation.  */
689
  HOWTO (R_MIPS_64,             /* type */
690
         0,                      /* rightshift */
691
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
692
         64,                    /* bitsize */
693
         false,                 /* pc_relative */
694
         0,                      /* bitpos */
695
         complain_overflow_bitfield, /* complain_on_overflow */
696
         mips32_64bit_reloc,    /* special_function */
697
         "R_MIPS_64",           /* name */
698
         true,                  /* partial_inplace */
699
         MINUS_ONE,             /* src_mask */
700
         MINUS_ONE,             /* dst_mask */
701
         false),                /* pcrel_offset */
702
 
703
  /* Displacement in the global offset table.  */
704
  HOWTO (R_MIPS_GOT_DISP,       /* type */
705
         0,                      /* rightshift */
706
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
707
         16,                    /* bitsize */
708
         false,                 /* pc_relative */
709
         0,                      /* bitpos */
710
         complain_overflow_bitfield, /* complain_on_overflow */
711
         bfd_elf_generic_reloc, /* special_function */
712
         "R_MIPS_GOT_DISP",     /* name */
713
         true,                  /* partial_inplace */
714
         0x0000ffff,            /* src_mask */
715
         0x0000ffff,            /* dst_mask */
716
         false),                /* pcrel_offset */
717
 
718
  /* Displacement to page pointer in the global offset table.  */
719
  HOWTO (R_MIPS_GOT_PAGE,       /* type */
720
         0,                      /* rightshift */
721
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
722
         16,                    /* bitsize */
723
         false,                 /* pc_relative */
724
         0,                      /* bitpos */
725
         complain_overflow_bitfield, /* complain_on_overflow */
726
         bfd_elf_generic_reloc, /* special_function */
727
         "R_MIPS_GOT_PAGE",     /* name */
728
         true,                  /* partial_inplace */
729
         0x0000ffff,            /* src_mask */
730
         0x0000ffff,            /* dst_mask */
731
         false),                /* pcrel_offset */
732
 
733
  /* Offset from page pointer in the global offset table.  */
734
  HOWTO (R_MIPS_GOT_OFST,       /* type */
735
         0,                      /* rightshift */
736
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
737
         16,                    /* bitsize */
738
         false,                 /* pc_relative */
739
         0,                      /* bitpos */
740
         complain_overflow_bitfield, /* complain_on_overflow */
741
         bfd_elf_generic_reloc, /* special_function */
742
         "R_MIPS_GOT_OFST",     /* name */
743
         true,                  /* partial_inplace */
744
         0x0000ffff,            /* src_mask */
745
         0x0000ffff,            /* dst_mask */
746
         false),                /* pcrel_offset */
747
 
748
  /* High 16 bits of displacement in global offset table.  */
749
  HOWTO (R_MIPS_GOT_HI16,       /* type */
750
         0,                      /* rightshift */
751
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
752
         16,                    /* bitsize */
753
         false,                 /* pc_relative */
754
         0,                      /* bitpos */
755
         complain_overflow_dont, /* complain_on_overflow */
756
         bfd_elf_generic_reloc, /* special_function */
757
         "R_MIPS_GOT_HI16",     /* name */
758
         true,                  /* partial_inplace */
759
         0x0000ffff,            /* src_mask */
760
         0x0000ffff,            /* dst_mask */
761
         false),                /* pcrel_offset */
762
 
763
  /* Low 16 bits of displacement in global offset table.  */
764
  HOWTO (R_MIPS_GOT_LO16,       /* type */
765
         0,                      /* rightshift */
766
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
767
         16,                    /* bitsize */
768
         false,                 /* pc_relative */
769
         0,                      /* bitpos */
770
         complain_overflow_dont, /* complain_on_overflow */
771
         bfd_elf_generic_reloc, /* special_function */
772
         "R_MIPS_GOT_LO16",     /* name */
773
         true,                  /* partial_inplace */
774
         0x0000ffff,            /* src_mask */
775
         0x0000ffff,            /* dst_mask */
776
         false),                /* pcrel_offset */
777
 
778
  /* 64 bit subtraction.  Used in the N32 ABI.  */
779
  HOWTO (R_MIPS_SUB,            /* type */
780
         0,                      /* rightshift */
781
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
782
         64,                    /* bitsize */
783
         false,                 /* pc_relative */
784
         0,                      /* bitpos */
785
         complain_overflow_bitfield, /* complain_on_overflow */
786
         bfd_elf_generic_reloc, /* special_function */
787
         "R_MIPS_SUB",          /* name */
788
         true,                  /* partial_inplace */
789
         MINUS_ONE,             /* src_mask */
790
         MINUS_ONE,             /* dst_mask */
791
         false),                /* pcrel_offset */
792
 
793
  /* Used to cause the linker to insert and delete instructions?  */
794
  EMPTY_HOWTO (R_MIPS_INSERT_A),
795
  EMPTY_HOWTO (R_MIPS_INSERT_B),
796
  EMPTY_HOWTO (R_MIPS_DELETE),
797
 
798
  /* Get the higher value of a 64 bit addend.  */
799
  HOWTO (R_MIPS_HIGHER,         /* type */
800
         0,                      /* rightshift */
801
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
802
         16,                    /* bitsize */
803
         false,                 /* pc_relative */
804
         0,                      /* bitpos */
805
         complain_overflow_dont, /* complain_on_overflow */
806
         bfd_elf_generic_reloc, /* special_function */
807
         "R_MIPS_HIGHER",       /* name */
808
         true,                  /* partial_inplace */
809
         0,                      /* src_mask */
810
         0xffff,                /* dst_mask */
811
         false),                /* pcrel_offset */
812
 
813
  /* Get the highest value of a 64 bit addend.  */
814
  HOWTO (R_MIPS_HIGHEST,        /* type */
815
         0,                      /* rightshift */
816
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
817
         16,                    /* bitsize */
818
         false,                 /* pc_relative */
819
         0,                      /* bitpos */
820
         complain_overflow_dont, /* complain_on_overflow */
821
         bfd_elf_generic_reloc, /* special_function */
822
         "R_MIPS_HIGHEST",      /* name */
823
         true,                  /* partial_inplace */
824
         0,                      /* src_mask */
825
         0xffff,                /* dst_mask */
826
         false),                /* pcrel_offset */
827
 
828
  /* High 16 bits of displacement in global offset table.  */
829
  HOWTO (R_MIPS_CALL_HI16,      /* type */
830
         0,                      /* rightshift */
831
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
832
         16,                    /* bitsize */
833
         false,                 /* pc_relative */
834
         0,                      /* bitpos */
835
         complain_overflow_dont, /* complain_on_overflow */
836
         bfd_elf_generic_reloc, /* special_function */
837
         "R_MIPS_CALL_HI16",    /* name */
838
         true,                  /* partial_inplace */
839
         0x0000ffff,            /* src_mask */
840
         0x0000ffff,            /* dst_mask */
841
         false),                /* pcrel_offset */
842
 
843
  /* Low 16 bits of displacement in global offset table.  */
844
  HOWTO (R_MIPS_CALL_LO16,      /* type */
845
         0,                      /* rightshift */
846
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
847
         16,                    /* bitsize */
848
         false,                 /* pc_relative */
849
         0,                      /* bitpos */
850
         complain_overflow_dont, /* complain_on_overflow */
851
         bfd_elf_generic_reloc, /* special_function */
852
         "R_MIPS_CALL_LO16",    /* name */
853
         true,                  /* partial_inplace */
854
         0x0000ffff,            /* src_mask */
855
         0x0000ffff,            /* dst_mask */
856
         false),                /* pcrel_offset */
857
 
858
  /* Section displacement.  */
859
  HOWTO (R_MIPS_SCN_DISP,       /* type */
860
         0,                      /* rightshift */
861
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
862
         32,                    /* bitsize */
863
         false,                 /* pc_relative */
864
         0,                      /* bitpos */
865
         complain_overflow_dont, /* complain_on_overflow */
866
         bfd_elf_generic_reloc, /* special_function */
867
         "R_MIPS_SCN_DISP",     /* name */
868
         false,                 /* partial_inplace */
869
         0xffffffff,            /* src_mask */
870
         0xffffffff,            /* dst_mask */
871
         false),                /* pcrel_offset */
872
 
873
  EMPTY_HOWTO (R_MIPS_REL16),
874
  EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
875
  EMPTY_HOWTO (R_MIPS_PJUMP),
876
  EMPTY_HOWTO (R_MIPS_RELGOT),
877
 
878
  /* Protected jump conversion.  This is an optimization hint.  No
879
     relocation is required for correctness.  */
880
  HOWTO (R_MIPS_JALR,           /* type */
881
         0,                      /* rightshift */
882
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
883
         0,                      /* bitsize */
884
         false,                 /* pc_relative */
885
         0,                      /* bitpos */
886
         complain_overflow_dont, /* complain_on_overflow */
887
         bfd_elf_generic_reloc, /* special_function */
888
         "R_MIPS_JALR",         /* name */
889
         false,                 /* partial_inplace */
890
         0x00000000,            /* src_mask */
891
         0x00000000,            /* dst_mask */
892
         false),                /* pcrel_offset */
893
};
894
 
895
/* The reloc used for BFD_RELOC_CTOR when doing a 64 bit link.  This
896
   is a hack to make the linker think that we need 64 bit values.  */
897
static reloc_howto_type elf_mips_ctor64_howto =
898
  HOWTO (R_MIPS_64,             /* type */
899
         0,                      /* rightshift */
900
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
901
         32,                    /* bitsize */
902
         false,                 /* pc_relative */
903
         0,                      /* bitpos */
904
         complain_overflow_signed, /* complain_on_overflow */
905
         mips32_64bit_reloc,    /* special_function */
906
         "R_MIPS_64",           /* name */
907
         true,                  /* partial_inplace */
908
         0xffffffff,            /* src_mask */
909
         0xffffffff,            /* dst_mask */
910
         false);                /* pcrel_offset */
911
 
912
/* The reloc used for the mips16 jump instruction.  */
913
static reloc_howto_type elf_mips16_jump_howto =
914
  HOWTO (R_MIPS16_26,           /* type */
915
         2,                     /* rightshift */
916
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
917
         26,                    /* bitsize */
918
         false,                 /* pc_relative */
919
         0,                      /* bitpos */
920
         complain_overflow_dont, /* complain_on_overflow */
921
                                /* This needs complex overflow
922
                                   detection, because the upper four
923
                                   bits must match the PC.  */
924
         mips16_jump_reloc,     /* special_function */
925
         "R_MIPS16_26",         /* name */
926
         true,                  /* partial_inplace */
927
         0x3ffffff,             /* src_mask */
928
         0x3ffffff,             /* dst_mask */
929
         false);                /* pcrel_offset */
930
 
931
/* The reloc used for the mips16 gprel instruction.  */
932
static reloc_howto_type elf_mips16_gprel_howto =
933
  HOWTO (R_MIPS16_GPREL,        /* type */
934
         0,                      /* rightshift */
935
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
936
         16,                    /* bitsize */
937
         false,                 /* pc_relative */
938
         0,                      /* bitpos */
939
         complain_overflow_signed, /* complain_on_overflow */
940
         mips16_gprel_reloc,    /* special_function */
941
         "R_MIPS16_GPREL",      /* name */
942
         true,                  /* partial_inplace */
943
         0x07ff001f,            /* src_mask */
944
         0x07ff001f,            /* dst_mask */
945
         false);                /* pcrel_offset */
946
 
947
 
948
/* GNU extensions for embedded-pic.  */
949
/* High 16 bits of symbol value, pc-relative.  */
950
static reloc_howto_type elf_mips_gnu_rel_hi16 =
951
  HOWTO (R_MIPS_GNU_REL_HI16,   /* type */
952
         0,                      /* rightshift */
953
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
954
         16,                    /* bitsize */
955
         true,                  /* pc_relative */
956
         0,                      /* bitpos */
957
         complain_overflow_dont, /* complain_on_overflow */
958
         _bfd_mips_elf_hi16_reloc,      /* special_function */
959
         "R_MIPS_GNU_REL_HI16", /* name */
960
         true,                  /* partial_inplace */
961
         0xffff,                /* src_mask */
962
         0xffff,                /* dst_mask */
963
         true);                 /* pcrel_offset */
964
 
965
/* Low 16 bits of symbol value, pc-relative.  */
966
static reloc_howto_type elf_mips_gnu_rel_lo16 =
967
  HOWTO (R_MIPS_GNU_REL_LO16,   /* type */
968
         0,                      /* rightshift */
969
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
970
         16,                    /* bitsize */
971
         true,                  /* pc_relative */
972
         0,                      /* bitpos */
973
         complain_overflow_dont, /* complain_on_overflow */
974
         _bfd_mips_elf_lo16_reloc,      /* special_function */
975
         "R_MIPS_GNU_REL_LO16", /* name */
976
         true,                  /* partial_inplace */
977
         0xffff,                /* src_mask */
978
         0xffff,                /* dst_mask */
979
         true);                 /* pcrel_offset */
980
 
981
/* 16 bit offset for pc-relative branches.  */
982
static reloc_howto_type elf_mips_gnu_rel16_s2 =
983
  HOWTO (R_MIPS_GNU_REL16_S2,   /* type */
984
         2,                     /* rightshift */
985
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
986
         16,                    /* bitsize */
987
         true,                  /* pc_relative */
988
         0,                      /* bitpos */
989
         complain_overflow_signed, /* complain_on_overflow */
990
         bfd_elf_generic_reloc, /* special_function */
991
         "R_MIPS_GNU_REL16_S2", /* name */
992
         true,                  /* partial_inplace */
993
         0xffff,                /* src_mask */
994
         0xffff,                /* dst_mask */
995
         true);                 /* pcrel_offset */
996
 
997
/* 64 bit pc-relative.  */
998
static reloc_howto_type elf_mips_gnu_pcrel64 =
999
  HOWTO (R_MIPS_PC64,           /* type */
1000
         0,                      /* rightshift */
1001
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
1002
         64,                    /* bitsize */
1003
         true,                  /* pc_relative */
1004
         0,                      /* bitpos */
1005
         complain_overflow_signed, /* complain_on_overflow */
1006
         bfd_elf_generic_reloc, /* special_function */
1007
         "R_MIPS_PC64",         /* name */
1008
         true,                  /* partial_inplace */
1009
         MINUS_ONE,             /* src_mask */
1010
         MINUS_ONE,             /* dst_mask */
1011
         true);                 /* pcrel_offset */
1012
 
1013
/* 32 bit pc-relative.  */
1014
static reloc_howto_type elf_mips_gnu_pcrel32 =
1015
  HOWTO (R_MIPS_PC32,           /* type */
1016
         0,                      /* rightshift */
1017
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1018
         32,                    /* bitsize */
1019
         true,                  /* pc_relative */
1020
         0,                      /* bitpos */
1021
         complain_overflow_signed, /* complain_on_overflow */
1022
         bfd_elf_generic_reloc, /* special_function */
1023
         "R_MIPS_PC32",         /* name */
1024
         true,                  /* partial_inplace */
1025
         0xffffffff,            /* src_mask */
1026
         0xffffffff,            /* dst_mask */
1027
         true);                 /* pcrel_offset */
1028
 
1029
/* GNU extension to record C++ vtable hierarchy */
1030
static reloc_howto_type elf_mips_gnu_vtinherit_howto =
1031
  HOWTO (R_MIPS_GNU_VTINHERIT,  /* type */
1032
         0,                      /* rightshift */
1033
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1034
         0,                      /* bitsize */
1035
         false,                 /* pc_relative */
1036
         0,                      /* bitpos */
1037
         complain_overflow_dont, /* complain_on_overflow */
1038
         NULL,                  /* special_function */
1039
         "R_MIPS_GNU_VTINHERIT", /* name */
1040
         false,                 /* partial_inplace */
1041
         0,                      /* src_mask */
1042
         0,                      /* dst_mask */
1043
         false);                /* pcrel_offset */
1044
 
1045
/* GNU extension to record C++ vtable member usage */
1046
static reloc_howto_type elf_mips_gnu_vtentry_howto =
1047
  HOWTO (R_MIPS_GNU_VTENTRY,    /* type */
1048
         0,                      /* rightshift */
1049
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
1050
         0,                      /* bitsize */
1051
         false,                 /* pc_relative */
1052
         0,                      /* bitpos */
1053
         complain_overflow_dont, /* complain_on_overflow */
1054
         _bfd_elf_rel_vtable_reloc_fn, /* special_function */
1055
         "R_MIPS_GNU_VTENTRY",  /* name */
1056
         false,                 /* partial_inplace */
1057
         0,                      /* src_mask */
1058
         0,                      /* dst_mask */
1059
         false);                /* pcrel_offset */
1060
 
1061
/* Do a R_MIPS_HI16 relocation.  This has to be done in combination
1062
   with a R_MIPS_LO16 reloc, because there is a carry from the LO16 to
1063
   the HI16.  Here we just save the information we need; we do the
1064
   actual relocation when we see the LO16.  MIPS ELF requires that the
1065
   LO16 immediately follow the HI16.  As a GNU extension, we permit an
1066
   arbitrary number of HI16 relocs to be associated with a single LO16
1067
   reloc.  This extension permits gcc to output the HI and LO relocs
1068
   itself.  */
1069
 
1070
struct mips_hi16
1071
{
1072
  struct mips_hi16 *next;
1073
  bfd_byte *addr;
1074
  bfd_vma addend;
1075
};
1076
 
1077
/* FIXME: This should not be a static variable.  */
1078
 
1079
static struct mips_hi16 *mips_hi16_list;
1080
 
1081
bfd_reloc_status_type
1082
_bfd_mips_elf_hi16_reloc (abfd,
1083
                     reloc_entry,
1084
                     symbol,
1085
                     data,
1086
                     input_section,
1087
                     output_bfd,
1088
                     error_message)
1089
     bfd *abfd ATTRIBUTE_UNUSED;
1090
     arelent *reloc_entry;
1091
     asymbol *symbol;
1092
     PTR data;
1093
     asection *input_section;
1094
     bfd *output_bfd;
1095
     char **error_message;
1096
{
1097
  bfd_reloc_status_type ret;
1098
  bfd_vma relocation;
1099
  struct mips_hi16 *n;
1100
 
1101
  /* If we're relocating, and this an external symbol, we don't want
1102
     to change anything.  */
1103
  if (output_bfd != (bfd *) NULL
1104
      && (symbol->flags & BSF_SECTION_SYM) == 0
1105
      && reloc_entry->addend == 0)
1106
    {
1107
      reloc_entry->address += input_section->output_offset;
1108
      return bfd_reloc_ok;
1109
    }
1110
 
1111
  ret = bfd_reloc_ok;
1112
 
1113
  if (strcmp (bfd_asymbol_name (symbol), "_gp_disp") == 0)
1114
    {
1115
      boolean relocateable;
1116
      bfd_vma gp;
1117
 
1118
      if (ret == bfd_reloc_undefined)
1119
        abort ();
1120
 
1121
      if (output_bfd != NULL)
1122
        relocateable = true;
1123
      else
1124
        {
1125
          relocateable = false;
1126
          output_bfd = symbol->section->output_section->owner;
1127
        }
1128
 
1129
      ret = mips_elf_final_gp (output_bfd, symbol, relocateable,
1130
                               error_message, &gp);
1131
      if (ret != bfd_reloc_ok)
1132
        return ret;
1133
 
1134
      relocation = gp - reloc_entry->address;
1135
    }
1136
  else
1137
    {
1138
      if (bfd_is_und_section (symbol->section)
1139
          && output_bfd == (bfd *) NULL)
1140
        ret = bfd_reloc_undefined;
1141
 
1142
      if (bfd_is_com_section (symbol->section))
1143
        relocation = 0;
1144
      else
1145
        relocation = symbol->value;
1146
    }
1147
 
1148
  relocation += symbol->section->output_section->vma;
1149
  relocation += symbol->section->output_offset;
1150
  relocation += reloc_entry->addend;
1151
 
1152
  if (reloc_entry->address > input_section->_cooked_size)
1153
    return bfd_reloc_outofrange;
1154
 
1155
  /* Save the information, and let LO16 do the actual relocation.  */
1156
  n = (struct mips_hi16 *) bfd_malloc (sizeof *n);
1157
  if (n == NULL)
1158
    return bfd_reloc_outofrange;
1159
  n->addr = (bfd_byte *) data + reloc_entry->address;
1160
  n->addend = relocation;
1161
  n->next = mips_hi16_list;
1162
  mips_hi16_list = n;
1163
 
1164
  if (output_bfd != (bfd *) NULL)
1165
    reloc_entry->address += input_section->output_offset;
1166
 
1167
  return ret;
1168
}
1169
 
1170
/* Do a R_MIPS_LO16 relocation.  This is a straightforward 16 bit
1171
   inplace relocation; this function exists in order to do the
1172
   R_MIPS_HI16 relocation described above.  */
1173
 
1174
bfd_reloc_status_type
1175
_bfd_mips_elf_lo16_reloc (abfd,
1176
                     reloc_entry,
1177
                     symbol,
1178
                     data,
1179
                     input_section,
1180
                     output_bfd,
1181
                     error_message)
1182
     bfd *abfd;
1183
     arelent *reloc_entry;
1184
     asymbol *symbol;
1185
     PTR data;
1186
     asection *input_section;
1187
     bfd *output_bfd;
1188
     char **error_message;
1189
{
1190
  arelent gp_disp_relent;
1191
 
1192
  if (mips_hi16_list != NULL)
1193
    {
1194
      struct mips_hi16 *l;
1195
 
1196
      l = mips_hi16_list;
1197
      while (l != NULL)
1198
        {
1199
          unsigned long insn;
1200
          unsigned long val;
1201
          unsigned long vallo;
1202
          struct mips_hi16 *next;
1203
 
1204
          /* Do the HI16 relocation.  Note that we actually don't need
1205
             to know anything about the LO16 itself, except where to
1206
             find the low 16 bits of the addend needed by the LO16.  */
1207
          insn = bfd_get_32 (abfd, l->addr);
1208
          vallo = (bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address)
1209
                   & 0xffff);
1210
          val = ((insn & 0xffff) << 16) + vallo;
1211
          val += l->addend;
1212
 
1213
          /* The low order 16 bits are always treated as a signed
1214
             value.  Therefore, a negative value in the low order bits
1215
             requires an adjustment in the high order bits.  We need
1216
             to make this adjustment in two ways: once for the bits we
1217
             took from the data, and once for the bits we are putting
1218
             back in to the data.  */
1219
          if ((vallo & 0x8000) != 0)
1220
            val -= 0x10000;
1221
          if ((val & 0x8000) != 0)
1222
            val += 0x10000;
1223
 
1224
          insn = (insn &~ 0xffff) | ((val >> 16) & 0xffff);
1225
          bfd_put_32 (abfd, insn, l->addr);
1226
 
1227
          if (strcmp (bfd_asymbol_name (symbol), "_gp_disp") == 0)
1228
            {
1229
              gp_disp_relent = *reloc_entry;
1230
              reloc_entry = &gp_disp_relent;
1231
              reloc_entry->addend = l->addend;
1232
            }
1233
 
1234
          next = l->next;
1235
          free (l);
1236
          l = next;
1237
        }
1238
 
1239
      mips_hi16_list = NULL;
1240
    }
1241
  else if (strcmp (bfd_asymbol_name (symbol), "_gp_disp") == 0)
1242
    {
1243
      bfd_reloc_status_type ret;
1244
      bfd_vma gp, relocation;
1245
 
1246
      /* FIXME: Does this case ever occur?  */
1247
 
1248
      ret = mips_elf_final_gp (output_bfd, symbol, true, error_message, &gp);
1249
      if (ret != bfd_reloc_ok)
1250
        return ret;
1251
 
1252
      relocation = gp - reloc_entry->address;
1253
      relocation += symbol->section->output_section->vma;
1254
      relocation += symbol->section->output_offset;
1255
      relocation += reloc_entry->addend;
1256
 
1257
      if (reloc_entry->address > input_section->_cooked_size)
1258
        return bfd_reloc_outofrange;
1259
 
1260
      gp_disp_relent = *reloc_entry;
1261
      reloc_entry = &gp_disp_relent;
1262
      reloc_entry->addend = relocation - 4;
1263
    }
1264
 
1265
  /* Now do the LO16 reloc in the usual way.  */
1266
  return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1267
                                input_section, output_bfd, error_message);
1268
}
1269
 
1270
/* Do a R_MIPS_GOT16 reloc.  This is a reloc against the global offset
1271
   table used for PIC code.  If the symbol is an external symbol, the
1272
   instruction is modified to contain the offset of the appropriate
1273
   entry in the global offset table.  If the symbol is a section
1274
   symbol, the next reloc is a R_MIPS_LO16 reloc.  The two 16 bit
1275
   addends are combined to form the real addend against the section
1276
   symbol; the GOT16 is modified to contain the offset of an entry in
1277
   the global offset table, and the LO16 is modified to offset it
1278
   appropriately.  Thus an offset larger than 16 bits requires a
1279
   modified value in the global offset table.
1280
 
1281
   This implementation suffices for the assembler, but the linker does
1282
   not yet know how to create global offset tables.  */
1283
 
1284
bfd_reloc_status_type
1285
_bfd_mips_elf_got16_reloc (abfd,
1286
                      reloc_entry,
1287
                      symbol,
1288
                      data,
1289
                      input_section,
1290
                      output_bfd,
1291
                      error_message)
1292
     bfd *abfd;
1293
     arelent *reloc_entry;
1294
     asymbol *symbol;
1295
     PTR data;
1296
     asection *input_section;
1297
     bfd *output_bfd;
1298
     char **error_message;
1299
{
1300
  /* If we're relocating, and this an external symbol, we don't want
1301
     to change anything.  */
1302
  if (output_bfd != (bfd *) NULL
1303
      && (symbol->flags & BSF_SECTION_SYM) == 0
1304
      && reloc_entry->addend == 0)
1305
    {
1306
      reloc_entry->address += input_section->output_offset;
1307
      return bfd_reloc_ok;
1308
    }
1309
 
1310
  /* If we're relocating, and this is a local symbol, we can handle it
1311
     just like HI16.  */
1312
  if (output_bfd != (bfd *) NULL
1313
      && (symbol->flags & BSF_SECTION_SYM) != 0)
1314
    return _bfd_mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
1315
                                     input_section, output_bfd, error_message);
1316
 
1317
  abort ();
1318
}
1319
 
1320
/* Set the GP value for OUTPUT_BFD.  Returns false if this is a
1321
   dangerous relocation.  */
1322
 
1323
static boolean
1324
mips_elf_assign_gp (output_bfd, pgp)
1325
     bfd *output_bfd;
1326
     bfd_vma *pgp;
1327
{
1328
  unsigned int count;
1329
  asymbol **sym;
1330
  unsigned int i;
1331
 
1332
  /* If we've already figured out what GP will be, just return it.  */
1333
  *pgp = _bfd_get_gp_value (output_bfd);
1334
  if (*pgp)
1335
    return true;
1336
 
1337
  count = bfd_get_symcount (output_bfd);
1338
  sym = bfd_get_outsymbols (output_bfd);
1339
 
1340
  /* The linker script will have created a symbol named `_gp' with the
1341
     appropriate value.  */
1342
  if (sym == (asymbol **) NULL)
1343
    i = count;
1344
  else
1345
    {
1346
      for (i = 0; i < count; i++, sym++)
1347
        {
1348
          register CONST char *name;
1349
 
1350
          name = bfd_asymbol_name (*sym);
1351
          if (*name == '_' && strcmp (name, "_gp") == 0)
1352
            {
1353
              *pgp = bfd_asymbol_value (*sym);
1354
              _bfd_set_gp_value (output_bfd, *pgp);
1355
              break;
1356
            }
1357
        }
1358
    }
1359
 
1360
  if (i >= count)
1361
    {
1362
      /* Only get the error once.  */
1363
      *pgp = 4;
1364
      _bfd_set_gp_value (output_bfd, *pgp);
1365
      return false;
1366
    }
1367
 
1368
  return true;
1369
}
1370
 
1371
/* We have to figure out the gp value, so that we can adjust the
1372
   symbol value correctly.  We look up the symbol _gp in the output
1373
   BFD.  If we can't find it, we're stuck.  We cache it in the ELF
1374
   target data.  We don't need to adjust the symbol value for an
1375
   external symbol if we are producing relocateable output.  */
1376
 
1377
static bfd_reloc_status_type
1378
mips_elf_final_gp (output_bfd, symbol, relocateable, error_message, pgp)
1379
     bfd *output_bfd;
1380
     asymbol *symbol;
1381
     boolean relocateable;
1382
     char **error_message;
1383
     bfd_vma *pgp;
1384
{
1385
  if (bfd_is_und_section (symbol->section)
1386
      && ! relocateable)
1387
    {
1388
      *pgp = 0;
1389
      return bfd_reloc_undefined;
1390
    }
1391
 
1392
  *pgp = _bfd_get_gp_value (output_bfd);
1393
  if (*pgp == 0
1394
      && (! relocateable
1395
          || (symbol->flags & BSF_SECTION_SYM) != 0))
1396
    {
1397
      if (relocateable)
1398
        {
1399
          /* Make up a value.  */
1400
          *pgp = symbol->section->output_section->vma + 0x4000;
1401
          _bfd_set_gp_value (output_bfd, *pgp);
1402
        }
1403
      else if (!mips_elf_assign_gp (output_bfd, pgp))
1404
        {
1405
          *error_message =
1406
            (char *) _("GP relative relocation when _gp not defined");
1407
          return bfd_reloc_dangerous;
1408
        }
1409
    }
1410
 
1411
  return bfd_reloc_ok;
1412
}
1413
 
1414
/* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
1415
   become the offset from the gp register.  This function also handles
1416
   R_MIPS_LITERAL relocations, although those can be handled more
1417
   cleverly because the entries in the .lit8 and .lit4 sections can be
1418
   merged.  */
1419
 
1420
static bfd_reloc_status_type gprel16_with_gp PARAMS ((bfd *, asymbol *,
1421
                                                      arelent *, asection *,
1422
                                                      boolean, PTR, bfd_vma));
1423
 
1424
bfd_reloc_status_type
1425
_bfd_mips_elf_gprel16_reloc (abfd, reloc_entry, symbol, data, input_section,
1426
                             output_bfd, error_message)
1427
     bfd *abfd;
1428
     arelent *reloc_entry;
1429
     asymbol *symbol;
1430
     PTR data;
1431
     asection *input_section;
1432
     bfd *output_bfd;
1433
     char **error_message;
1434
{
1435
  boolean relocateable;
1436
  bfd_reloc_status_type ret;
1437
  bfd_vma gp;
1438
 
1439
  /* If we're relocating, and this is an external symbol with no
1440
     addend, we don't want to change anything.  We will only have an
1441
     addend if this is a newly created reloc, not read from an ELF
1442
     file.  */
1443
  if (output_bfd != (bfd *) NULL
1444
      && (symbol->flags & BSF_SECTION_SYM) == 0
1445
      && reloc_entry->addend == 0)
1446
    {
1447
      reloc_entry->address += input_section->output_offset;
1448
      return bfd_reloc_ok;
1449
    }
1450
 
1451
  if (output_bfd != (bfd *) NULL)
1452
    relocateable = true;
1453
  else
1454
    {
1455
      relocateable = false;
1456
      output_bfd = symbol->section->output_section->owner;
1457
    }
1458
 
1459
  ret = mips_elf_final_gp (output_bfd, symbol, relocateable, error_message,
1460
                           &gp);
1461
  if (ret != bfd_reloc_ok)
1462
    return ret;
1463
 
1464
  return gprel16_with_gp (abfd, symbol, reloc_entry, input_section,
1465
                          relocateable, data, gp);
1466
}
1467
 
1468
static bfd_reloc_status_type
1469
gprel16_with_gp (abfd, symbol, reloc_entry, input_section, relocateable, data,
1470
                 gp)
1471
     bfd *abfd;
1472
     asymbol *symbol;
1473
     arelent *reloc_entry;
1474
     asection *input_section;
1475
     boolean relocateable;
1476
     PTR data;
1477
     bfd_vma gp;
1478
{
1479
  bfd_vma relocation;
1480
  unsigned long insn;
1481
  unsigned long val;
1482
 
1483
  if (bfd_is_com_section (symbol->section))
1484
    relocation = 0;
1485
  else
1486
    relocation = symbol->value;
1487
 
1488
  relocation += symbol->section->output_section->vma;
1489
  relocation += symbol->section->output_offset;
1490
 
1491
  if (reloc_entry->address > input_section->_cooked_size)
1492
    return bfd_reloc_outofrange;
1493
 
1494
  insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1495
 
1496
  /* Set val to the offset into the section or symbol.  */
1497
  if (reloc_entry->howto->src_mask == 0)
1498
    {
1499
      /* This case occurs with the 64-bit MIPS ELF ABI.  */
1500
      val = reloc_entry->addend;
1501
    }
1502
  else
1503
    {
1504
      val = ((insn & 0xffff) + reloc_entry->addend) & 0xffff;
1505
      if (val & 0x8000)
1506
        val -= 0x10000;
1507
    }
1508
 
1509
  /* Adjust val for the final section location and GP value.  If we
1510
     are producing relocateable output, we don't want to do this for
1511
     an external symbol.  */
1512
  if (! relocateable
1513
      || (symbol->flags & BSF_SECTION_SYM) != 0)
1514
    val += relocation - gp;
1515
 
1516
  insn = (insn &~ 0xffff) | (val & 0xffff);
1517
  bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
1518
 
1519
  if (relocateable)
1520
    reloc_entry->address += input_section->output_offset;
1521
 
1522
  /* Make sure it fit in 16 bits.  */
1523
  if (val >= 0x8000 && val < 0xffff8000)
1524
    return bfd_reloc_overflow;
1525
 
1526
  return bfd_reloc_ok;
1527
}
1528
 
1529
/* Do a R_MIPS_GPREL32 relocation.  Is this 32 bit value the offset
1530
   from the gp register? XXX */
1531
 
1532
static bfd_reloc_status_type gprel32_with_gp PARAMS ((bfd *, asymbol *,
1533
                                                      arelent *, asection *,
1534
                                                      boolean, PTR, bfd_vma));
1535
 
1536
bfd_reloc_status_type
1537
_bfd_mips_elf_gprel32_reloc (abfd,
1538
                        reloc_entry,
1539
                        symbol,
1540
                        data,
1541
                        input_section,
1542
                        output_bfd,
1543
                        error_message)
1544
     bfd *abfd;
1545
     arelent *reloc_entry;
1546
     asymbol *symbol;
1547
     PTR data;
1548
     asection *input_section;
1549
     bfd *output_bfd;
1550
     char **error_message;
1551
{
1552
  boolean relocateable;
1553
  bfd_reloc_status_type ret;
1554
  bfd_vma gp;
1555
 
1556
  /* If we're relocating, and this is an external symbol with no
1557
     addend, we don't want to change anything.  We will only have an
1558
     addend if this is a newly created reloc, not read from an ELF
1559
     file.  */
1560
  if (output_bfd != (bfd *) NULL
1561
      && (symbol->flags & BSF_SECTION_SYM) == 0
1562
      && reloc_entry->addend == 0)
1563
    {
1564
      *error_message = (char *)
1565
        _("32bits gp relative relocation occurs for an external symbol");
1566
      return bfd_reloc_outofrange;
1567
    }
1568
 
1569
  if (output_bfd != (bfd *) NULL)
1570
    {
1571
      relocateable = true;
1572
      gp = _bfd_get_gp_value (output_bfd);
1573
    }
1574
  else
1575
    {
1576
      relocateable = false;
1577
      output_bfd = symbol->section->output_section->owner;
1578
 
1579
      ret = mips_elf_final_gp (output_bfd, symbol, relocateable,
1580
                               error_message, &gp);
1581
      if (ret != bfd_reloc_ok)
1582
        return ret;
1583
    }
1584
 
1585
  return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
1586
                          relocateable, data, gp);
1587
}
1588
 
1589
static bfd_reloc_status_type
1590
gprel32_with_gp (abfd, symbol, reloc_entry, input_section, relocateable, data,
1591
                 gp)
1592
     bfd *abfd;
1593
     asymbol *symbol;
1594
     arelent *reloc_entry;
1595
     asection *input_section;
1596
     boolean relocateable;
1597
     PTR data;
1598
     bfd_vma gp;
1599
{
1600
  bfd_vma relocation;
1601
  unsigned long val;
1602
 
1603
  if (bfd_is_com_section (symbol->section))
1604
    relocation = 0;
1605
  else
1606
    relocation = symbol->value;
1607
 
1608
  relocation += symbol->section->output_section->vma;
1609
  relocation += symbol->section->output_offset;
1610
 
1611
  if (reloc_entry->address > input_section->_cooked_size)
1612
    return bfd_reloc_outofrange;
1613
 
1614
  if (reloc_entry->howto->src_mask == 0)
1615
    {
1616
      /* This case arises with the 64-bit MIPS ELF ABI.  */
1617
      val = 0;
1618
    }
1619
  else
1620
    val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1621
 
1622
  /* Set val to the offset into the section or symbol.  */
1623
  val += reloc_entry->addend;
1624
 
1625
  /* Adjust val for the final section location and GP value.  If we
1626
     are producing relocateable output, we don't want to do this for
1627
     an external symbol.  */
1628
  if (! relocateable
1629
      || (symbol->flags & BSF_SECTION_SYM) != 0)
1630
    val += relocation - gp;
1631
 
1632
  bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
1633
 
1634
  if (relocateable)
1635
    reloc_entry->address += input_section->output_offset;
1636
 
1637
  return bfd_reloc_ok;
1638
}
1639
 
1640
/* Handle a 64 bit reloc in a 32 bit MIPS ELF file.  These are
1641
   generated when addreses are 64 bits.  The upper 32 bits are a simle
1642
   sign extension.  */
1643
 
1644
static bfd_reloc_status_type
1645
mips32_64bit_reloc (abfd, reloc_entry, symbol, data, input_section,
1646
                    output_bfd, error_message)
1647
     bfd *abfd;
1648
     arelent *reloc_entry;
1649
     asymbol *symbol;
1650
     PTR data;
1651
     asection *input_section;
1652
     bfd *output_bfd;
1653
     char **error_message;
1654
{
1655
  bfd_reloc_status_type r;
1656
  arelent reloc32;
1657
  unsigned long val;
1658
  bfd_size_type addr;
1659
 
1660
  r = bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1661
                             input_section, output_bfd, error_message);
1662
  if (r != bfd_reloc_continue)
1663
    return r;
1664
 
1665
  /* Do a normal 32 bit relocation on the lower 32 bits.  */
1666
  reloc32 = *reloc_entry;
1667
  if (bfd_big_endian (abfd))
1668
    reloc32.address += 4;
1669
  reloc32.howto = &elf_mips_howto_table[R_MIPS_32];
1670
  r = bfd_perform_relocation (abfd, &reloc32, data, input_section,
1671
                              output_bfd, error_message);
1672
 
1673
  /* Sign extend into the upper 32 bits.  */
1674
  val = bfd_get_32 (abfd, (bfd_byte *) data + reloc32.address);
1675
  if ((val & 0x80000000) != 0)
1676
    val = 0xffffffff;
1677
  else
1678
    val = 0;
1679
  addr = reloc_entry->address;
1680
  if (bfd_little_endian (abfd))
1681
    addr += 4;
1682
  bfd_put_32 (abfd, val, (bfd_byte *) data + addr);
1683
 
1684
  return r;
1685
}
1686
 
1687
/* Handle a mips16 jump.  */
1688
 
1689
static bfd_reloc_status_type
1690
mips16_jump_reloc (abfd, reloc_entry, symbol, data, input_section,
1691
                   output_bfd, error_message)
1692
     bfd *abfd ATTRIBUTE_UNUSED;
1693
     arelent *reloc_entry;
1694
     asymbol *symbol;
1695
     PTR data ATTRIBUTE_UNUSED;
1696
     asection *input_section;
1697
     bfd *output_bfd;
1698
     char **error_message ATTRIBUTE_UNUSED;
1699
{
1700
  if (output_bfd != (bfd *) NULL
1701
      && (symbol->flags & BSF_SECTION_SYM) == 0
1702
      && reloc_entry->addend == 0)
1703
    {
1704
      reloc_entry->address += input_section->output_offset;
1705
      return bfd_reloc_ok;
1706
    }
1707
 
1708
  /* FIXME.  */
1709
  {
1710
    static boolean warned;
1711
 
1712
    if (! warned)
1713
      (*_bfd_error_handler)
1714
        (_("Linking mips16 objects into %s format is not supported"),
1715
         bfd_get_target (input_section->output_section->owner));
1716
    warned = true;
1717
  }
1718
 
1719
  return bfd_reloc_undefined;
1720
}
1721
 
1722
/* Handle a mips16 GP relative reloc.  */
1723
 
1724
static bfd_reloc_status_type
1725
mips16_gprel_reloc (abfd, reloc_entry, symbol, data, input_section,
1726
                    output_bfd, error_message)
1727
     bfd *abfd;
1728
     arelent *reloc_entry;
1729
     asymbol *symbol;
1730
     PTR data;
1731
     asection *input_section;
1732
     bfd *output_bfd;
1733
     char **error_message;
1734
{
1735
  boolean relocateable;
1736
  bfd_reloc_status_type ret;
1737
  bfd_vma gp;
1738
  unsigned short extend, insn;
1739
  unsigned long final;
1740
 
1741
  /* If we're relocating, and this is an external symbol with no
1742
     addend, we don't want to change anything.  We will only have an
1743
     addend if this is a newly created reloc, not read from an ELF
1744
     file.  */
1745
  if (output_bfd != NULL
1746
      && (symbol->flags & BSF_SECTION_SYM) == 0
1747
      && reloc_entry->addend == 0)
1748
    {
1749
      reloc_entry->address += input_section->output_offset;
1750
      return bfd_reloc_ok;
1751
    }
1752
 
1753
  if (output_bfd != NULL)
1754
    relocateable = true;
1755
  else
1756
    {
1757
      relocateable = false;
1758
      output_bfd = symbol->section->output_section->owner;
1759
    }
1760
 
1761
  ret = mips_elf_final_gp (output_bfd, symbol, relocateable, error_message,
1762
                           &gp);
1763
  if (ret != bfd_reloc_ok)
1764
    return ret;
1765
 
1766
  if (reloc_entry->address > input_section->_cooked_size)
1767
    return bfd_reloc_outofrange;
1768
 
1769
  /* Pick up the mips16 extend instruction and the real instruction.  */
1770
  extend = bfd_get_16 (abfd, (bfd_byte *) data + reloc_entry->address);
1771
  insn = bfd_get_16 (abfd, (bfd_byte *) data + reloc_entry->address + 2);
1772
 
1773
  /* Stuff the current addend back as a 32 bit value, do the usual
1774
     relocation, and then clean up.  */
1775
  bfd_put_32 (abfd,
1776
              (((extend & 0x1f) << 11)
1777
               | (extend & 0x7e0)
1778
               | (insn & 0x1f)),
1779
              (bfd_byte *) data + reloc_entry->address);
1780
 
1781
  ret = gprel16_with_gp (abfd, symbol, reloc_entry, input_section,
1782
                         relocateable, data, gp);
1783
 
1784
  final = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1785
  bfd_put_16 (abfd,
1786
              ((extend & 0xf800)
1787
               | ((final >> 11) & 0x1f)
1788
               | (final & 0x7e0)),
1789
              (bfd_byte *) data + reloc_entry->address);
1790
  bfd_put_16 (abfd,
1791
              ((insn & 0xffe0)
1792
               | (final & 0x1f)),
1793
              (bfd_byte *) data + reloc_entry->address + 2);
1794
 
1795
  return ret;
1796
}
1797
 
1798
/* Return the ISA for a MIPS e_flags value.  */
1799
 
1800
static INLINE int
1801
elf_mips_isa (flags)
1802
     flagword flags;
1803
{
1804
  switch (flags & EF_MIPS_ARCH)
1805
    {
1806
    case E_MIPS_ARCH_1:
1807
      return 1;
1808
    case E_MIPS_ARCH_2:
1809
      return 2;
1810
    case E_MIPS_ARCH_3:
1811
      return 3;
1812
    case E_MIPS_ARCH_4:
1813
      return 4;
1814
    }
1815
  return 4;
1816
}
1817
 
1818
/* Return the MACH for a MIPS e_flags value.  */
1819
 
1820
static INLINE int
1821
elf_mips_mach (flags)
1822
     flagword flags;
1823
{
1824
  switch (flags & EF_MIPS_MACH)
1825
    {
1826
    case E_MIPS_MACH_3900:
1827
      return bfd_mach_mips3900;
1828
 
1829
    case E_MIPS_MACH_4010:
1830
      return bfd_mach_mips4010;
1831
 
1832
    case E_MIPS_MACH_4100:
1833
      return bfd_mach_mips4100;
1834
 
1835
    case E_MIPS_MACH_4111:
1836
      return bfd_mach_mips4111;
1837
 
1838
    case E_MIPS_MACH_4650:
1839
      return bfd_mach_mips4650;
1840
 
1841
    default:
1842
      switch (flags & EF_MIPS_ARCH)
1843
        {
1844
        default:
1845
        case E_MIPS_ARCH_1:
1846
          return bfd_mach_mips3000;
1847
          break;
1848
 
1849
        case E_MIPS_ARCH_2:
1850
          return bfd_mach_mips6000;
1851
          break;
1852
 
1853
        case E_MIPS_ARCH_3:
1854
          return bfd_mach_mips4000;
1855
          break;
1856
 
1857
        case E_MIPS_ARCH_4:
1858
          return bfd_mach_mips8000;
1859
          break;
1860
        }
1861
    }
1862
 
1863
  return 0;
1864
}
1865
 
1866
/* Return printable name for ABI. */
1867
 
1868
static INLINE char*
1869
elf_mips_abi_name (abfd)
1870
     bfd *abfd;
1871
{
1872
  flagword flags;
1873
 
1874
  if (ABI_N32_P (abfd))
1875
    return "N32";
1876
  else if (ABI_64_P (abfd))
1877
    return "64";
1878
 
1879
  flags = elf_elfheader (abfd)->e_flags;
1880
  switch (flags & EF_MIPS_ABI)
1881
    {
1882
    case 0:
1883
      return "none";
1884
    case E_MIPS_ABI_O32:
1885
      return "O32";
1886
    case E_MIPS_ABI_O64:
1887
      return "O64";
1888
    case E_MIPS_ABI_EABI32:
1889
      return "EABI32";
1890
    case E_MIPS_ABI_EABI64:
1891
      return "EABI64";
1892
    default:
1893
      return "unknown abi";
1894
    }
1895
}
1896
 
1897
/* A mapping from BFD reloc types to MIPS ELF reloc types.  */
1898
 
1899
struct elf_reloc_map {
1900
  bfd_reloc_code_real_type bfd_reloc_val;
1901
  enum elf_mips_reloc_type elf_reloc_val;
1902
};
1903
 
1904
static CONST struct elf_reloc_map mips_reloc_map[] =
1905
{
1906
  { BFD_RELOC_NONE, R_MIPS_NONE, },
1907
  { BFD_RELOC_16, R_MIPS_16 },
1908
  { BFD_RELOC_32, R_MIPS_32 },
1909
  { BFD_RELOC_64, R_MIPS_64 },
1910
  { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
1911
  { BFD_RELOC_HI16_S, R_MIPS_HI16 },
1912
  { BFD_RELOC_LO16, R_MIPS_LO16 },
1913
  { BFD_RELOC_MIPS_GPREL, R_MIPS_GPREL16 },
1914
  { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
1915
  { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
1916
  { BFD_RELOC_16_PCREL, R_MIPS_PC16 },
1917
  { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
1918
  { BFD_RELOC_MIPS_GPREL32, R_MIPS_GPREL32 },
1919
  { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
1920
  { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
1921
  { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
1922
  { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
1923
  { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
1924
  { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
1925
  { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
1926
  { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP }
1927
};
1928
 
1929
/* Given a BFD reloc type, return a howto structure.  */
1930
 
1931
static reloc_howto_type *
1932
bfd_elf32_bfd_reloc_type_lookup (abfd, code)
1933
     bfd *abfd;
1934
     bfd_reloc_code_real_type code;
1935
{
1936
  unsigned int i;
1937
 
1938
  for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map); i++)
1939
    {
1940
      if (mips_reloc_map[i].bfd_reloc_val == code)
1941
        return &elf_mips_howto_table[(int) mips_reloc_map[i].elf_reloc_val];
1942
    }
1943
 
1944
  switch (code)
1945
    {
1946
    default:
1947
      bfd_set_error (bfd_error_bad_value);
1948
      return NULL;
1949
 
1950
    case BFD_RELOC_CTOR:
1951
      /* We need to handle BFD_RELOC_CTOR specially.
1952
         Select the right relocation (R_MIPS_32 or R_MIPS_64) based on the
1953
         size of addresses on this architecture.  */
1954
      if (bfd_arch_bits_per_address (abfd) == 32)
1955
        return &elf_mips_howto_table[(int) R_MIPS_32];
1956
      else
1957
        return &elf_mips_ctor64_howto;
1958
 
1959
    case BFD_RELOC_MIPS16_JMP:
1960
      return &elf_mips16_jump_howto;
1961
    case BFD_RELOC_MIPS16_GPREL:
1962
      return &elf_mips16_gprel_howto;
1963
    case BFD_RELOC_VTABLE_INHERIT:
1964
      return &elf_mips_gnu_vtinherit_howto;
1965
    case BFD_RELOC_VTABLE_ENTRY:
1966
      return &elf_mips_gnu_vtentry_howto;
1967
    case BFD_RELOC_PCREL_HI16_S:
1968
      return &elf_mips_gnu_rel_hi16;
1969
    case BFD_RELOC_PCREL_LO16:
1970
      return &elf_mips_gnu_rel_lo16;
1971
    case BFD_RELOC_16_PCREL_S2:
1972
      return &elf_mips_gnu_rel16_s2;
1973
    case BFD_RELOC_64_PCREL:
1974
      return &elf_mips_gnu_pcrel64;
1975
    case BFD_RELOC_32_PCREL:
1976
      return &elf_mips_gnu_pcrel32;
1977
    }
1978
}
1979
 
1980
/* Given a MIPS Elf32_Internal_Rel, fill in an arelent structure.  */
1981
 
1982
static reloc_howto_type *
1983
mips_rtype_to_howto (r_type)
1984
     unsigned int r_type;
1985
{
1986
  switch (r_type)
1987
    {
1988
    case R_MIPS16_26:
1989
      return &elf_mips16_jump_howto;
1990
      break;
1991
    case R_MIPS16_GPREL:
1992
      return &elf_mips16_gprel_howto;
1993
      break;
1994
    case R_MIPS_GNU_VTINHERIT:
1995
      return &elf_mips_gnu_vtinherit_howto;
1996
      break;
1997
    case R_MIPS_GNU_VTENTRY:
1998
      return &elf_mips_gnu_vtentry_howto;
1999
      break;
2000
    case R_MIPS_GNU_REL_HI16:
2001
      return &elf_mips_gnu_rel_hi16;
2002
      break;
2003
    case R_MIPS_GNU_REL_LO16:
2004
      return &elf_mips_gnu_rel_lo16;
2005
      break;
2006
    case R_MIPS_GNU_REL16_S2:
2007
      return &elf_mips_gnu_rel16_s2;
2008
      break;
2009
    case R_MIPS_PC64:
2010
      return &elf_mips_gnu_pcrel64;
2011
      break;
2012
    case R_MIPS_PC32:
2013
      return &elf_mips_gnu_pcrel32;
2014
      break;
2015
 
2016
    default:
2017
      BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
2018
      return &elf_mips_howto_table[r_type];
2019
      break;
2020
    }
2021
}
2022
 
2023
/* Given a MIPS Elf32_Internal_Rel, fill in an arelent structure.  */
2024
 
2025
static void
2026
mips_info_to_howto_rel (abfd, cache_ptr, dst)
2027
     bfd *abfd;
2028
     arelent *cache_ptr;
2029
     Elf32_Internal_Rel *dst;
2030
{
2031
  unsigned int r_type;
2032
 
2033
  r_type = ELF32_R_TYPE (dst->r_info);
2034
  cache_ptr->howto = mips_rtype_to_howto (r_type);
2035
 
2036
  /* The addend for a GPREL16 or LITERAL relocation comes from the GP
2037
     value for the object file.  We get the addend now, rather than
2038
     when we do the relocation, because the symbol manipulations done
2039
     by the linker may cause us to lose track of the input BFD.  */
2040
  if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
2041
      && (r_type == (unsigned int) R_MIPS_GPREL16
2042
          || r_type == (unsigned int) R_MIPS_LITERAL))
2043
    cache_ptr->addend = elf_gp (abfd);
2044
}
2045
 
2046
/* Given a MIPS Elf32_Internal_Rela, fill in an arelent structure.  */
2047
 
2048
static void
2049
mips_info_to_howto_rela (abfd, cache_ptr, dst)
2050
     bfd *abfd;
2051
     arelent *cache_ptr;
2052
     Elf32_Internal_Rela *dst;
2053
{
2054
  /* Since an Elf32_Internal_Rel is an initial prefix of an
2055
     Elf32_Internal_Rela, we can just use mips_info_to_howto_rel
2056
     above.  */
2057
  mips_info_to_howto_rel (abfd, cache_ptr, (Elf32_Internal_Rel *) dst);
2058
 
2059
  /* If we ever need to do any extra processing with dst->r_addend
2060
     (the field omitted in an Elf32_Internal_Rel) we can do it here.  */
2061
}
2062
 
2063
/* A .reginfo section holds a single Elf32_RegInfo structure.  These
2064
   routines swap this structure in and out.  They are used outside of
2065
   BFD, so they are globally visible.  */
2066
 
2067
void
2068
bfd_mips_elf32_swap_reginfo_in (abfd, ex, in)
2069
     bfd *abfd;
2070
     const Elf32_External_RegInfo *ex;
2071
     Elf32_RegInfo *in;
2072
{
2073
  in->ri_gprmask = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_gprmask);
2074
  in->ri_cprmask[0] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[0]);
2075
  in->ri_cprmask[1] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[1]);
2076
  in->ri_cprmask[2] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[2]);
2077
  in->ri_cprmask[3] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[3]);
2078
  in->ri_gp_value = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_gp_value);
2079
}
2080
 
2081
void
2082
bfd_mips_elf32_swap_reginfo_out (abfd, in, ex)
2083
     bfd *abfd;
2084
     const Elf32_RegInfo *in;
2085
     Elf32_External_RegInfo *ex;
2086
{
2087
  bfd_h_put_32 (abfd, (bfd_vma) in->ri_gprmask,
2088
                (bfd_byte *) ex->ri_gprmask);
2089
  bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[0],
2090
                (bfd_byte *) ex->ri_cprmask[0]);
2091
  bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[1],
2092
                (bfd_byte *) ex->ri_cprmask[1]);
2093
  bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[2],
2094
                (bfd_byte *) ex->ri_cprmask[2]);
2095
  bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[3],
2096
                (bfd_byte *) ex->ri_cprmask[3]);
2097
  bfd_h_put_32 (abfd, (bfd_vma) in->ri_gp_value,
2098
                (bfd_byte *) ex->ri_gp_value);
2099
}
2100
 
2101
/* In the 64 bit ABI, the .MIPS.options section holds register
2102
   information in an Elf64_Reginfo structure.  These routines swap
2103
   them in and out.  They are globally visible because they are used
2104
   outside of BFD.  These routines are here so that gas can call them
2105
   without worrying about whether the 64 bit ABI has been included.  */
2106
 
2107
void
2108
bfd_mips_elf64_swap_reginfo_in (abfd, ex, in)
2109
     bfd *abfd;
2110
     const Elf64_External_RegInfo *ex;
2111
     Elf64_Internal_RegInfo *in;
2112
{
2113
  in->ri_gprmask = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_gprmask);
2114
  in->ri_pad = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_pad);
2115
  in->ri_cprmask[0] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[0]);
2116
  in->ri_cprmask[1] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[1]);
2117
  in->ri_cprmask[2] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[2]);
2118
  in->ri_cprmask[3] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[3]);
2119
  in->ri_gp_value = bfd_h_get_64 (abfd, (bfd_byte *) ex->ri_gp_value);
2120
}
2121
 
2122
void
2123
bfd_mips_elf64_swap_reginfo_out (abfd, in, ex)
2124
     bfd *abfd;
2125
     const Elf64_Internal_RegInfo *in;
2126
     Elf64_External_RegInfo *ex;
2127
{
2128
  bfd_h_put_32 (abfd, (bfd_vma) in->ri_gprmask,
2129
                (bfd_byte *) ex->ri_gprmask);
2130
  bfd_h_put_32 (abfd, (bfd_vma) in->ri_pad,
2131
                (bfd_byte *) ex->ri_pad);
2132
  bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[0],
2133
                (bfd_byte *) ex->ri_cprmask[0]);
2134
  bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[1],
2135
                (bfd_byte *) ex->ri_cprmask[1]);
2136
  bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[2],
2137
                (bfd_byte *) ex->ri_cprmask[2]);
2138
  bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[3],
2139
                (bfd_byte *) ex->ri_cprmask[3]);
2140
  bfd_h_put_64 (abfd, (bfd_vma) in->ri_gp_value,
2141
                (bfd_byte *) ex->ri_gp_value);
2142
}
2143
 
2144
/* Swap an entry in a .gptab section.  Note that these routines rely
2145
   on the equivalence of the two elements of the union.  */
2146
 
2147
static void
2148
bfd_mips_elf32_swap_gptab_in (abfd, ex, in)
2149
     bfd *abfd;
2150
     const Elf32_External_gptab *ex;
2151
     Elf32_gptab *in;
2152
{
2153
  in->gt_entry.gt_g_value = bfd_h_get_32 (abfd, ex->gt_entry.gt_g_value);
2154
  in->gt_entry.gt_bytes = bfd_h_get_32 (abfd, ex->gt_entry.gt_bytes);
2155
}
2156
 
2157
static void
2158
bfd_mips_elf32_swap_gptab_out (abfd, in, ex)
2159
     bfd *abfd;
2160
     const Elf32_gptab *in;
2161
     Elf32_External_gptab *ex;
2162
{
2163
  bfd_h_put_32 (abfd, (bfd_vma) in->gt_entry.gt_g_value,
2164
                ex->gt_entry.gt_g_value);
2165
  bfd_h_put_32 (abfd, (bfd_vma) in->gt_entry.gt_bytes,
2166
                ex->gt_entry.gt_bytes);
2167
}
2168
 
2169
static void
2170
bfd_elf32_swap_compact_rel_out (abfd, in, ex)
2171
     bfd *abfd;
2172
     const Elf32_compact_rel *in;
2173
     Elf32_External_compact_rel *ex;
2174
{
2175
  bfd_h_put_32 (abfd, (bfd_vma) in->id1, ex->id1);
2176
  bfd_h_put_32 (abfd, (bfd_vma) in->num, ex->num);
2177
  bfd_h_put_32 (abfd, (bfd_vma) in->id2, ex->id2);
2178
  bfd_h_put_32 (abfd, (bfd_vma) in->offset, ex->offset);
2179
  bfd_h_put_32 (abfd, (bfd_vma) in->reserved0, ex->reserved0);
2180
  bfd_h_put_32 (abfd, (bfd_vma) in->reserved1, ex->reserved1);
2181
}
2182
 
2183
static void
2184
bfd_elf32_swap_crinfo_out (abfd, in, ex)
2185
     bfd *abfd;
2186
     const Elf32_crinfo *in;
2187
     Elf32_External_crinfo *ex;
2188
{
2189
  unsigned long l;
2190
 
2191
  l = (((in->ctype & CRINFO_CTYPE) << CRINFO_CTYPE_SH)
2192
       | ((in->rtype & CRINFO_RTYPE) << CRINFO_RTYPE_SH)
2193
       | ((in->dist2to & CRINFO_DIST2TO) << CRINFO_DIST2TO_SH)
2194
       | ((in->relvaddr & CRINFO_RELVADDR) << CRINFO_RELVADDR_SH));
2195
  bfd_h_put_32 (abfd, (bfd_vma) l, ex->info);
2196
  bfd_h_put_32 (abfd, (bfd_vma) in->konst, ex->konst);
2197
  bfd_h_put_32 (abfd, (bfd_vma) in->vaddr, ex->vaddr);
2198
}
2199
 
2200
/* Swap in an options header.  */
2201
 
2202
void
2203
bfd_mips_elf_swap_options_in (abfd, ex, in)
2204
     bfd *abfd;
2205
     const Elf_External_Options *ex;
2206
     Elf_Internal_Options *in;
2207
{
2208
  in->kind = bfd_h_get_8 (abfd, ex->kind);
2209
  in->size = bfd_h_get_8 (abfd, ex->size);
2210
  in->section = bfd_h_get_16 (abfd, ex->section);
2211
  in->info = bfd_h_get_32 (abfd, ex->info);
2212
}
2213
 
2214
/* Swap out an options header.  */
2215
 
2216
void
2217
bfd_mips_elf_swap_options_out (abfd, in, ex)
2218
     bfd *abfd;
2219
     const Elf_Internal_Options *in;
2220
     Elf_External_Options *ex;
2221
{
2222
  bfd_h_put_8 (abfd, in->kind, ex->kind);
2223
  bfd_h_put_8 (abfd, in->size, ex->size);
2224
  bfd_h_put_16 (abfd, in->section, ex->section);
2225
  bfd_h_put_32 (abfd, in->info, ex->info);
2226
}
2227
#if 0
2228
/* Swap in an MSYM entry.  */
2229
 
2230
static void
2231
bfd_mips_elf_swap_msym_in (abfd, ex, in)
2232
     bfd *abfd;
2233
     const Elf32_External_Msym *ex;
2234
     Elf32_Internal_Msym *in;
2235
{
2236
  in->ms_hash_value = bfd_h_get_32 (abfd, ex->ms_hash_value);
2237
  in->ms_info = bfd_h_get_32 (abfd, ex->ms_info);
2238
}
2239
#endif
2240
/* Swap out an MSYM entry.  */
2241
 
2242
static void
2243
bfd_mips_elf_swap_msym_out (abfd, in, ex)
2244
     bfd *abfd;
2245
     const Elf32_Internal_Msym *in;
2246
     Elf32_External_Msym *ex;
2247
{
2248
  bfd_h_put_32 (abfd, in->ms_hash_value, ex->ms_hash_value);
2249
  bfd_h_put_32 (abfd, in->ms_info, ex->ms_info);
2250
}
2251
 
2252
 
2253
/* Determine whether a symbol is global for the purposes of splitting
2254
   the symbol table into global symbols and local symbols.  At least
2255
   on Irix 5, this split must be between section symbols and all other
2256
   symbols.  On most ELF targets the split is between static symbols
2257
   and externally visible symbols.  */
2258
 
2259
/*ARGSUSED*/
2260
static boolean
2261
mips_elf_sym_is_global (abfd, sym)
2262
     bfd *abfd ATTRIBUTE_UNUSED;
2263
     asymbol *sym;
2264
{
2265
  return (sym->flags & BSF_SECTION_SYM) == 0 ? true : false;
2266
}
2267
 
2268
/* Set the right machine number for a MIPS ELF file.  This is used for
2269
   both the 32-bit and the 64-bit ABI.  */
2270
 
2271
boolean
2272
_bfd_mips_elf_object_p (abfd)
2273
     bfd *abfd;
2274
{
2275
  /* Irix 5 and 6 is broken.  Object file symbol tables are not always
2276
     sorted correctly such that local symbols precede global symbols,
2277
     and the sh_info field in the symbol table is not always right.  */
2278
  elf_bad_symtab (abfd) = true;
2279
 
2280
  bfd_default_set_arch_mach (abfd, bfd_arch_mips,
2281
                             elf_mips_mach (elf_elfheader (abfd)->e_flags));
2282
  return true;
2283
}
2284
 
2285
/* The final processing done just before writing out a MIPS ELF object
2286
   file.  This gets the MIPS architecture right based on the machine
2287
   number.  This is used by both the 32-bit and the 64-bit ABI.  */
2288
 
2289
/*ARGSUSED*/
2290
void
2291
_bfd_mips_elf_final_write_processing (abfd, linker)
2292
     bfd *abfd;
2293
     boolean linker ATTRIBUTE_UNUSED;
2294
{
2295
  unsigned long val;
2296
  unsigned int i;
2297
  Elf_Internal_Shdr **hdrpp;
2298
  const char *name;
2299
  asection *sec;
2300
 
2301
  switch (bfd_get_mach (abfd))
2302
    {
2303
    default:
2304
    case bfd_mach_mips3000:
2305
      val = E_MIPS_ARCH_1;
2306
      break;
2307
 
2308
    case bfd_mach_mips3900:
2309
      val = E_MIPS_ARCH_1 | E_MIPS_MACH_3900;
2310
      break;
2311
 
2312
    case bfd_mach_mips6000:
2313
      val = E_MIPS_ARCH_2;
2314
      break;
2315
 
2316
    case bfd_mach_mips4000:
2317
    case bfd_mach_mips4300:
2318
      val = E_MIPS_ARCH_3;
2319
      break;
2320
 
2321
    case bfd_mach_mips4010:
2322
      val = E_MIPS_ARCH_3 | E_MIPS_MACH_4010;
2323
      break;
2324
 
2325
    case bfd_mach_mips4100:
2326
      val = E_MIPS_ARCH_3 | E_MIPS_MACH_4100;
2327
      break;
2328
 
2329
    case bfd_mach_mips4111:
2330
      val = E_MIPS_ARCH_3 | E_MIPS_MACH_4111;
2331
      break;
2332
 
2333
    case bfd_mach_mips4650:
2334
      val = E_MIPS_ARCH_3 | E_MIPS_MACH_4650;
2335
      break;
2336
 
2337
    case bfd_mach_mips8000:
2338
      val = E_MIPS_ARCH_4;
2339
      break;
2340
    }
2341
 
2342
  elf_elfheader (abfd)->e_flags &= ~ (EF_MIPS_ARCH | EF_MIPS_MACH);
2343
  elf_elfheader (abfd)->e_flags |= val;
2344
 
2345
  /* Set the sh_info field for .gptab sections and other appropriate
2346
     info for each special section.  */
2347
  for (i = 1, hdrpp = elf_elfsections (abfd) + 1;
2348
       i < elf_elfheader (abfd)->e_shnum;
2349
       i++, hdrpp++)
2350
    {
2351
      switch ((*hdrpp)->sh_type)
2352
        {
2353
        case SHT_MIPS_MSYM:
2354
        case SHT_MIPS_LIBLIST:
2355
          sec = bfd_get_section_by_name (abfd, ".dynstr");
2356
          if (sec != NULL)
2357
            (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
2358
          break;
2359
 
2360
        case SHT_MIPS_GPTAB:
2361
          BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
2362
          name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
2363
          BFD_ASSERT (name != NULL
2364
                      && strncmp (name, ".gptab.", sizeof ".gptab." - 1) == 0);
2365
          sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
2366
          BFD_ASSERT (sec != NULL);
2367
          (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
2368
          break;
2369
 
2370
        case SHT_MIPS_CONTENT:
2371
          BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
2372
          name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
2373
          BFD_ASSERT (name != NULL
2374
                      && strncmp (name, ".MIPS.content",
2375
                                  sizeof ".MIPS.content" - 1) == 0);
2376
          sec = bfd_get_section_by_name (abfd,
2377
                                         name + sizeof ".MIPS.content" - 1);
2378
          BFD_ASSERT (sec != NULL);
2379
          (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
2380
          break;
2381
 
2382
        case SHT_MIPS_SYMBOL_LIB:
2383
          sec = bfd_get_section_by_name (abfd, ".dynsym");
2384
          if (sec != NULL)
2385
            (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
2386
          sec = bfd_get_section_by_name (abfd, ".liblist");
2387
          if (sec != NULL)
2388
            (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
2389
          break;
2390
 
2391
        case SHT_MIPS_EVENTS:
2392
          BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
2393
          name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
2394
          BFD_ASSERT (name != NULL);
2395
          if (strncmp (name, ".MIPS.events", sizeof ".MIPS.events" - 1) == 0)
2396
            sec = bfd_get_section_by_name (abfd,
2397
                                           name + sizeof ".MIPS.events" - 1);
2398
          else
2399
            {
2400
              BFD_ASSERT (strncmp (name, ".MIPS.post_rel",
2401
                                   sizeof ".MIPS.post_rel" - 1) == 0);
2402
              sec = bfd_get_section_by_name (abfd,
2403
                                             (name
2404
                                              + sizeof ".MIPS.post_rel" - 1));
2405
            }
2406
          BFD_ASSERT (sec != NULL);
2407
          (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
2408
          break;
2409
 
2410
        }
2411
    }
2412
}
2413
 
2414
/* Function to keep MIPS specific file flags like as EF_MIPS_PIC. */
2415
 
2416
boolean
2417
_bfd_mips_elf_set_private_flags (abfd, flags)
2418
     bfd *abfd;
2419
     flagword flags;
2420
{
2421
  BFD_ASSERT (!elf_flags_init (abfd)
2422
              || elf_elfheader (abfd)->e_flags == flags);
2423
 
2424
  elf_elfheader (abfd)->e_flags = flags;
2425
  elf_flags_init (abfd) = true;
2426
  return true;
2427
}
2428
 
2429
/* Copy backend specific data from one object module to another */
2430
 
2431
boolean
2432
_bfd_mips_elf_copy_private_bfd_data (ibfd, obfd)
2433
     bfd *ibfd;
2434
     bfd *obfd;
2435
{
2436
  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2437
      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2438
    return true;
2439
 
2440
  BFD_ASSERT (!elf_flags_init (obfd)
2441
              || (elf_elfheader (obfd)->e_flags
2442
                  == elf_elfheader (ibfd)->e_flags));
2443
 
2444
  elf_gp (obfd) = elf_gp (ibfd);
2445
  elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
2446
  elf_flags_init (obfd) = true;
2447
  return true;
2448
}
2449
 
2450
/* Merge backend specific data from an object file to the output
2451
   object file when linking.  */
2452
 
2453
boolean
2454
_bfd_mips_elf_merge_private_bfd_data (ibfd, obfd)
2455
     bfd *ibfd;
2456
     bfd *obfd;
2457
{
2458
  flagword old_flags;
2459
  flagword new_flags;
2460
  boolean ok;
2461
 
2462
  /* Check if we have the same endianess */
2463
  if (ibfd->xvec->byteorder != obfd->xvec->byteorder
2464
      && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
2465
    {
2466
      const char *msg;
2467
 
2468
      if (bfd_big_endian (ibfd))
2469
        msg = _("%s: compiled for a big endian system and target is little endian");
2470
      else
2471
        msg = _("%s: compiled for a little endian system and target is big endian");
2472
 
2473
      (*_bfd_error_handler) (msg, bfd_get_filename (ibfd));
2474
 
2475
      bfd_set_error (bfd_error_wrong_format);
2476
      return false;
2477
    }
2478
 
2479
  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2480
      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2481
    return true;
2482
 
2483
  new_flags = elf_elfheader (ibfd)->e_flags;
2484
  elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_NOREORDER;
2485
  old_flags = elf_elfheader (obfd)->e_flags;
2486
 
2487
  if (! elf_flags_init (obfd))
2488
    {
2489
      elf_flags_init (obfd) = true;
2490
      elf_elfheader (obfd)->e_flags = new_flags;
2491
      elf_elfheader (obfd)->e_ident[EI_CLASS]
2492
        = elf_elfheader (ibfd)->e_ident[EI_CLASS];
2493
 
2494
      if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
2495
          && bfd_get_arch_info (obfd)->the_default)
2496
        {
2497
          if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
2498
                                   bfd_get_mach (ibfd)))
2499
            return false;
2500
        }
2501
 
2502
      return true;
2503
    }
2504
 
2505
  /* Check flag compatibility.  */
2506
 
2507
  new_flags &= ~EF_MIPS_NOREORDER;
2508
  old_flags &= ~EF_MIPS_NOREORDER;
2509
 
2510
  if (new_flags == old_flags)
2511
    return true;
2512
 
2513
  ok = true;
2514
 
2515
  if ((new_flags & EF_MIPS_PIC) != (old_flags & EF_MIPS_PIC))
2516
    {
2517
      new_flags &= ~EF_MIPS_PIC;
2518
      old_flags &= ~EF_MIPS_PIC;
2519
      (*_bfd_error_handler)
2520
        (_("%s: linking PIC files with non-PIC files"),
2521
         bfd_get_filename (ibfd));
2522
      ok = false;
2523
    }
2524
 
2525
  if ((new_flags & EF_MIPS_CPIC) != (old_flags & EF_MIPS_CPIC))
2526
    {
2527
      new_flags &= ~EF_MIPS_CPIC;
2528
      old_flags &= ~EF_MIPS_CPIC;
2529
      (*_bfd_error_handler)
2530
        (_("%s: linking abicalls files with non-abicalls files"),
2531
         bfd_get_filename (ibfd));
2532
      ok = false;
2533
    }
2534
 
2535
  /* Compare the ISA's. */
2536
  if ((new_flags & (EF_MIPS_ARCH | EF_MIPS_MACH))
2537
      != (old_flags & (EF_MIPS_ARCH | EF_MIPS_MACH)))
2538
    {
2539
      int new_mach = new_flags & EF_MIPS_MACH;
2540
      int old_mach = old_flags & EF_MIPS_MACH;
2541
      int new_isa = elf_mips_isa (new_flags);
2542
      int old_isa = elf_mips_isa (old_flags);
2543
 
2544
      /* If either has no machine specified, just compare the general isa's.
2545
         Some combinations of machines are ok, if the isa's match. */
2546
      if (! new_mach
2547
          || ! old_mach
2548
          || new_mach == old_mach
2549
          )
2550
        {
2551
          /* Don't warn about mixing -mips1 and -mips2 code, or mixing -mips3
2552
             and -mips4 code.  They will normally use the same data sizes and
2553
             calling conventions.  */
2554
 
2555
          if ((new_isa == 1 || new_isa == 2)
2556
              ? (old_isa != 1 && old_isa != 2)
2557
              : (old_isa == 1 || old_isa == 2))
2558
            {
2559
              (*_bfd_error_handler)
2560
               (_("%s: ISA mismatch (-mips%d) with previous modules (-mips%d)"),
2561
                bfd_get_filename (ibfd), new_isa, old_isa);
2562
              ok = false;
2563
            }
2564
        }
2565
 
2566
      else
2567
        {
2568
          (*_bfd_error_handler)
2569
            (_("%s: ISA mismatch (%d) with previous modules (%d)"),
2570
             bfd_get_filename (ibfd),
2571
             elf_mips_mach (new_flags),
2572
             elf_mips_mach (old_flags));
2573
          ok = false;
2574
        }
2575
 
2576
      new_flags &= ~ (EF_MIPS_ARCH | EF_MIPS_MACH);
2577
      old_flags &= ~ (EF_MIPS_ARCH | EF_MIPS_MACH);
2578
    }
2579
 
2580
  /* Compare ABI's.  The 64-bit ABI does not use EF_MIPS_ABI.  But, it
2581
     does set EI_CLASS differently from any 32-bit ABI.  */
2582
  if ((new_flags & EF_MIPS_ABI) != (old_flags & EF_MIPS_ABI)
2583
      || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
2584
          != elf_elfheader (obfd)->e_ident[EI_CLASS]))
2585
    {
2586
      /* Only error if both are set (to different values). */
2587
      if (((new_flags & EF_MIPS_ABI) && (old_flags & EF_MIPS_ABI))
2588
          || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
2589
              != elf_elfheader (obfd)->e_ident[EI_CLASS]))
2590
        {
2591
          (*_bfd_error_handler)
2592
            (_("%s: ABI mismatch: linking %s module with previous %s modules"),
2593
             bfd_get_filename (ibfd),
2594
             elf_mips_abi_name (ibfd),
2595
             elf_mips_abi_name (obfd));
2596
          ok = false;
2597
        }
2598
      new_flags &= ~EF_MIPS_ABI;
2599
      old_flags &= ~EF_MIPS_ABI;
2600
    }
2601
 
2602
  /* Warn about any other mismatches */
2603
  if (new_flags != old_flags)
2604
    {
2605
      (*_bfd_error_handler)
2606
        (_("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
2607
         bfd_get_filename (ibfd), (unsigned long) new_flags,
2608
         (unsigned long) old_flags);
2609
      ok = false;
2610
    }
2611
 
2612
  if (! ok)
2613
    {
2614
      bfd_set_error (bfd_error_bad_value);
2615
      return false;
2616
    }
2617
 
2618
  return true;
2619
}
2620
 
2621
boolean
2622
_bfd_mips_elf_print_private_bfd_data (abfd, ptr)
2623
     bfd *abfd;
2624
     PTR ptr;
2625
{
2626
  FILE *file = (FILE *) ptr;
2627
 
2628
  BFD_ASSERT (abfd != NULL && ptr != NULL);
2629
 
2630
  /* Print normal ELF private data.  */
2631
  _bfd_elf_print_private_bfd_data (abfd, ptr);
2632
 
2633
  /* xgettext:c-format */
2634
  fprintf (file, _ ("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
2635
 
2636
  if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O32)
2637
    fprintf (file, _ (" [abi=O32]"));
2638
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O64)
2639
    fprintf (file, _ (" [abi=O64]"));
2640
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32)
2641
    fprintf (file, _ (" [abi=EABI32]"));
2642
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64)
2643
    fprintf (file, _ (" [abi=EABI64]"));
2644
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI))
2645
    fprintf (file, _ (" [abi unknown]"));
2646
  else if (ABI_N32_P (abfd))
2647
    fprintf (file, _ (" [abi=N32]"));
2648
  else if (ABI_64_P (abfd))
2649
    fprintf (file, _ (" [abi=64]"));
2650
  else
2651
    fprintf (file, _ (" [no abi set]"));
2652
 
2653
  if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
2654
    fprintf (file, _ (" [mips1]"));
2655
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
2656
    fprintf (file, _ (" [mips2]"));
2657
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
2658
    fprintf (file, _ (" [mips3]"));
2659
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
2660
    fprintf (file, _ (" [mips4]"));
2661
  else
2662
    fprintf (file, _ (" [unknown ISA]"));
2663
 
2664
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_32BITMODE)
2665
    fprintf (file, _ (" [32bitmode]"));
2666
  else
2667
    fprintf (file, _ (" [not 32bitmode]"));
2668
 
2669
  fputc ('\n', file);
2670
 
2671
  return true;
2672
}
2673
 
2674
/* Handle a MIPS specific section when reading an object file.  This
2675
   is called when elfcode.h finds a section with an unknown type.
2676
   This routine supports both the 32-bit and 64-bit ELF ABI.
2677
 
2678
   FIXME: We need to handle the SHF_MIPS_GPREL flag, but I'm not sure
2679
   how to.  */
2680
 
2681
boolean
2682
_bfd_mips_elf_section_from_shdr (abfd, hdr, name)
2683
     bfd *abfd;
2684
     Elf_Internal_Shdr *hdr;
2685
     char *name;
2686
{
2687
  flagword flags = 0;
2688
 
2689
  /* There ought to be a place to keep ELF backend specific flags, but
2690
     at the moment there isn't one.  We just keep track of the
2691
     sections by their name, instead.  Fortunately, the ABI gives
2692
     suggested names for all the MIPS specific sections, so we will
2693
     probably get away with this.  */
2694
  switch (hdr->sh_type)
2695
    {
2696
    case SHT_MIPS_LIBLIST:
2697
      if (strcmp (name, ".liblist") != 0)
2698
        return false;
2699
      break;
2700
    case SHT_MIPS_MSYM:
2701
      if (strcmp (name, MIPS_ELF_MSYM_SECTION_NAME (abfd)) != 0)
2702
        return false;
2703
      break;
2704
    case SHT_MIPS_CONFLICT:
2705
      if (strcmp (name, ".conflict") != 0)
2706
        return false;
2707
      break;
2708
    case SHT_MIPS_GPTAB:
2709
      if (strncmp (name, ".gptab.", sizeof ".gptab." - 1) != 0)
2710
        return false;
2711
      break;
2712
    case SHT_MIPS_UCODE:
2713
      if (strcmp (name, ".ucode") != 0)
2714
        return false;
2715
      break;
2716
    case SHT_MIPS_DEBUG:
2717
      if (strcmp (name, ".mdebug") != 0)
2718
        return false;
2719
      flags = SEC_DEBUGGING;
2720
      break;
2721
    case SHT_MIPS_REGINFO:
2722
      if (strcmp (name, ".reginfo") != 0
2723
          || hdr->sh_size != sizeof (Elf32_External_RegInfo))
2724
        return false;
2725
      flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
2726
      break;
2727
    case SHT_MIPS_IFACE:
2728
      if (strcmp (name, ".MIPS.interfaces") != 0)
2729
        return false;
2730
      break;
2731
    case SHT_MIPS_CONTENT:
2732
      if (strncmp (name, ".MIPS.content", sizeof ".MIPS.content" - 1) != 0)
2733
        return false;
2734
      break;
2735
    case SHT_MIPS_OPTIONS:
2736
      if (strcmp (name, MIPS_ELF_OPTIONS_SECTION_NAME (abfd)) != 0)
2737
        return false;
2738
      break;
2739
    case SHT_MIPS_DWARF:
2740
      if (strncmp (name, ".debug_", sizeof ".debug_" - 1) != 0)
2741
        return false;
2742
      break;
2743
    case SHT_MIPS_SYMBOL_LIB:
2744
      if (strcmp (name, ".MIPS.symlib") != 0)
2745
        return false;
2746
      break;
2747
    case SHT_MIPS_EVENTS:
2748
      if (strncmp (name, ".MIPS.events", sizeof ".MIPS.events" - 1) != 0
2749
          && strncmp (name, ".MIPS.post_rel",
2750
                      sizeof ".MIPS.post_rel" - 1) != 0)
2751
        return false;
2752
      break;
2753
    default:
2754
      return false;
2755
    }
2756
 
2757
  if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
2758
    return false;
2759
 
2760
  if (flags)
2761
    {
2762
      if (! bfd_set_section_flags (abfd, hdr->bfd_section,
2763
                                   (bfd_get_section_flags (abfd,
2764
                                                           hdr->bfd_section)
2765
                                    | flags)))
2766
        return false;
2767
    }
2768
 
2769
  /* FIXME: We should record sh_info for a .gptab section.  */
2770
 
2771
  /* For a .reginfo section, set the gp value in the tdata information
2772
     from the contents of this section.  We need the gp value while
2773
     processing relocs, so we just get it now.  The .reginfo section
2774
     is not used in the 64-bit MIPS ELF ABI.  */
2775
  if (hdr->sh_type == SHT_MIPS_REGINFO)
2776
    {
2777
      Elf32_External_RegInfo ext;
2778
      Elf32_RegInfo s;
2779
 
2780
      if (! bfd_get_section_contents (abfd, hdr->bfd_section, (PTR) &ext,
2781
                                      (file_ptr) 0, sizeof ext))
2782
        return false;
2783
      bfd_mips_elf32_swap_reginfo_in (abfd, &ext, &s);
2784
      elf_gp (abfd) = s.ri_gp_value;
2785
    }
2786
 
2787
  /* For a SHT_MIPS_OPTIONS section, look for a ODK_REGINFO entry, and
2788
     set the gp value based on what we find.  We may see both
2789
     SHT_MIPS_REGINFO and SHT_MIPS_OPTIONS/ODK_REGINFO; in that case,
2790
     they should agree.  */
2791
  if (hdr->sh_type == SHT_MIPS_OPTIONS)
2792
    {
2793
      bfd_byte *contents, *l, *lend;
2794
 
2795
      contents = (bfd_byte *) bfd_malloc (hdr->sh_size);
2796
      if (contents == NULL)
2797
        return false;
2798
      if (! bfd_get_section_contents (abfd, hdr->bfd_section, contents,
2799
                                      (file_ptr) 0, hdr->sh_size))
2800
        {
2801
          free (contents);
2802
          return false;
2803
        }
2804
      l = contents;
2805
      lend = contents + hdr->sh_size;
2806
      while (l + sizeof (Elf_External_Options) <= lend)
2807
        {
2808
          Elf_Internal_Options intopt;
2809
 
2810
          bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
2811
                                        &intopt);
2812
          if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
2813
            {
2814
              Elf64_Internal_RegInfo intreg;
2815
 
2816
              bfd_mips_elf64_swap_reginfo_in
2817
                (abfd,
2818
                 ((Elf64_External_RegInfo *)
2819
                  (l + sizeof (Elf_External_Options))),
2820
                 &intreg);
2821
              elf_gp (abfd) = intreg.ri_gp_value;
2822
            }
2823
          else if (intopt.kind == ODK_REGINFO)
2824
            {
2825
              Elf32_RegInfo intreg;
2826
 
2827
              bfd_mips_elf32_swap_reginfo_in
2828
                (abfd,
2829
                 ((Elf32_External_RegInfo *)
2830
                  (l + sizeof (Elf_External_Options))),
2831
                 &intreg);
2832
              elf_gp (abfd) = intreg.ri_gp_value;
2833
            }
2834
          l += intopt.size;
2835
        }
2836
      free (contents);
2837
    }
2838
 
2839
  return true;
2840
}
2841
 
2842
/* Set the correct type for a MIPS ELF section.  We do this by the
2843
   section name, which is a hack, but ought to work.  This routine is
2844
   used by both the 32-bit and the 64-bit ABI.  */
2845
 
2846
boolean
2847
_bfd_mips_elf_fake_sections (abfd, hdr, sec)
2848
     bfd *abfd;
2849
     Elf32_Internal_Shdr *hdr;
2850
     asection *sec;
2851
{
2852
  register const char *name;
2853
 
2854
  name = bfd_get_section_name (abfd, sec);
2855
 
2856
  if (strcmp (name, ".liblist") == 0)
2857
    {
2858
      hdr->sh_type = SHT_MIPS_LIBLIST;
2859
      hdr->sh_info = sec->_raw_size / sizeof (Elf32_Lib);
2860
      /* The sh_link field is set in final_write_processing.  */
2861
    }
2862
  else if (strcmp (name, ".conflict") == 0)
2863
    hdr->sh_type = SHT_MIPS_CONFLICT;
2864
  else if (strncmp (name, ".gptab.", sizeof ".gptab." - 1) == 0)
2865
    {
2866
      hdr->sh_type = SHT_MIPS_GPTAB;
2867
      hdr->sh_entsize = sizeof (Elf32_External_gptab);
2868
      /* The sh_info field is set in final_write_processing.  */
2869
    }
2870
  else if (strcmp (name, ".ucode") == 0)
2871
    hdr->sh_type = SHT_MIPS_UCODE;
2872
  else if (strcmp (name, ".mdebug") == 0)
2873
    {
2874
      hdr->sh_type = SHT_MIPS_DEBUG;
2875
      /* In a shared object on Irix 5.3, the .mdebug section has an
2876
         entsize of 0.  FIXME: Does this matter?  */
2877
      if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0)
2878
        hdr->sh_entsize = 0;
2879
      else
2880
        hdr->sh_entsize = 1;
2881
    }
2882
  else if (strcmp (name, ".reginfo") == 0)
2883
    {
2884
      hdr->sh_type = SHT_MIPS_REGINFO;
2885
      /* In a shared object on Irix 5.3, the .reginfo section has an
2886
         entsize of 0x18.  FIXME: Does this matter?  */
2887
      if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0)
2888
        hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
2889
      else
2890
        hdr->sh_entsize = 1;
2891
    }
2892
  else if (SGI_COMPAT (abfd)
2893
           && (strcmp (name, ".hash") == 0
2894
               || strcmp (name, ".dynamic") == 0
2895
               || strcmp (name, ".dynstr") == 0))
2896
    {
2897
      hdr->sh_entsize = 0;
2898
#if 0
2899
      /* This isn't how the Irix 6 linker behaves.  */
2900
      hdr->sh_info = SIZEOF_MIPS_DYNSYM_SECNAMES;
2901
#endif
2902
    }
2903
  else if (strcmp (name, ".got") == 0
2904
           || strcmp (name, MIPS_ELF_SRDATA_SECTION_NAME (abfd)) == 0
2905
           || strcmp (name, ".sdata") == 0
2906
           || strcmp (name, ".sbss") == 0
2907
           || strcmp (name, ".lit4") == 0
2908
           || strcmp (name, ".lit8") == 0)
2909
    hdr->sh_flags |= SHF_MIPS_GPREL;
2910
  else if (strcmp (name, ".MIPS.interfaces") == 0)
2911
    {
2912
      hdr->sh_type = SHT_MIPS_IFACE;
2913
      hdr->sh_flags |= SHF_MIPS_NOSTRIP;
2914
    }
2915
  else if (strncmp (name, ".MIPS.content", strlen (".MIPS.content")) == 0)
2916
    {
2917
      hdr->sh_type = SHT_MIPS_CONTENT;
2918
      hdr->sh_flags |= SHF_MIPS_NOSTRIP;
2919
      /* The sh_info field is set in final_write_processing.  */
2920
    }
2921
  else if (strcmp (name, MIPS_ELF_OPTIONS_SECTION_NAME (abfd)) == 0)
2922
    {
2923
      hdr->sh_type = SHT_MIPS_OPTIONS;
2924
      hdr->sh_entsize = 1;
2925
      hdr->sh_flags |= SHF_MIPS_NOSTRIP;
2926
    }
2927
  else if (strncmp (name, ".debug_", sizeof ".debug_" - 1) == 0)
2928
    hdr->sh_type = SHT_MIPS_DWARF;
2929
  else if (strcmp (name, ".MIPS.symlib") == 0)
2930
    {
2931
      hdr->sh_type = SHT_MIPS_SYMBOL_LIB;
2932
      /* The sh_link and sh_info fields are set in
2933
         final_write_processing.  */
2934
    }
2935
  else if (strncmp (name, ".MIPS.events", sizeof ".MIPS.events" - 1) == 0
2936
           || strncmp (name, ".MIPS.post_rel",
2937
                       sizeof ".MIPS.post_rel" - 1) == 0)
2938
    {
2939
      hdr->sh_type = SHT_MIPS_EVENTS;
2940
      hdr->sh_flags |= SHF_MIPS_NOSTRIP;
2941
      /* The sh_link field is set in final_write_processing.  */
2942
    }
2943
  else if (strcmp (name, MIPS_ELF_MSYM_SECTION_NAME (abfd)) == 0)
2944
    {
2945
      hdr->sh_type = SHT_MIPS_MSYM;
2946
      hdr->sh_flags |= SHF_ALLOC;
2947
      hdr->sh_entsize = 8;
2948
    }
2949
 
2950
  /* The generic elf_fake_sections will set up REL_HDR using the
2951
     default kind of relocations.  But, we may actually need both
2952
     kinds of relocations, so we set up the second header here.  */
2953
  if ((sec->flags & SEC_RELOC) != 0)
2954
    {
2955
      struct bfd_elf_section_data *esd;
2956
 
2957
      esd = elf_section_data (sec);
2958
      BFD_ASSERT (esd->rel_hdr2 == NULL);
2959
      esd->rel_hdr2
2960
        = (Elf_Internal_Shdr *) bfd_zalloc (abfd, sizeof (Elf_Internal_Shdr));
2961
      if (!esd->rel_hdr2)
2962
        return false;
2963
      _bfd_elf_init_reloc_shdr (abfd, esd->rel_hdr2, sec,
2964
                                !elf_section_data (sec)->use_rela_p);
2965
    }
2966
 
2967
  return true;
2968
}
2969
 
2970
/* Given a BFD section, try to locate the corresponding ELF section
2971
   index.  This is used by both the 32-bit and the 64-bit ABI.
2972
   Actually, it's not clear to me that the 64-bit ABI supports these,
2973
   but for non-PIC objects we will certainly want support for at least
2974
   the .scommon section.  */
2975
 
2976
boolean
2977
_bfd_mips_elf_section_from_bfd_section (abfd, hdr, sec, retval)
2978
     bfd *abfd ATTRIBUTE_UNUSED;
2979
     Elf32_Internal_Shdr *hdr ATTRIBUTE_UNUSED;
2980
     asection *sec;
2981
     int *retval;
2982
{
2983
  if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
2984
    {
2985
      *retval = SHN_MIPS_SCOMMON;
2986
      return true;
2987
    }
2988
  if (strcmp (bfd_get_section_name (abfd, sec), ".acommon") == 0)
2989
    {
2990
      *retval = SHN_MIPS_ACOMMON;
2991
      return true;
2992
    }
2993
  return false;
2994
}
2995
 
2996
/* When are writing out the .options or .MIPS.options section,
2997
   remember the bytes we are writing out, so that we can install the
2998
   GP value in the section_processing routine.  */
2999
 
3000
boolean
3001
_bfd_mips_elf_set_section_contents (abfd, section, location, offset, count)
3002
     bfd *abfd;
3003
     sec_ptr section;
3004
     PTR location;
3005
     file_ptr offset;
3006
     bfd_size_type count;
3007
{
3008
  if (strcmp (section->name, MIPS_ELF_OPTIONS_SECTION_NAME (abfd)) == 0)
3009
    {
3010
      bfd_byte *c;
3011
 
3012
      if (elf_section_data (section) == NULL)
3013
        {
3014
          section->used_by_bfd =
3015
            (PTR) bfd_zalloc (abfd, sizeof (struct bfd_elf_section_data));
3016
          if (elf_section_data (section) == NULL)
3017
            return false;
3018
        }
3019
      c = (bfd_byte *) elf_section_data (section)->tdata;
3020
      if (c == NULL)
3021
        {
3022
          bfd_size_type size;
3023
 
3024
          if (section->_cooked_size != 0)
3025
            size = section->_cooked_size;
3026
          else
3027
            size = section->_raw_size;
3028
          c = (bfd_byte *) bfd_zalloc (abfd, size);
3029
          if (c == NULL)
3030
            return false;
3031
          elf_section_data (section)->tdata = (PTR) c;
3032
        }
3033
 
3034
      memcpy (c + offset, location, count);
3035
    }
3036
 
3037
  return _bfd_elf_set_section_contents (abfd, section, location, offset,
3038
                                        count);
3039
}
3040
 
3041
/* Work over a section just before writing it out.  This routine is
3042
   used by both the 32-bit and the 64-bit ABI.  FIXME: We recognize
3043
   sections that need the SHF_MIPS_GPREL flag by name; there has to be
3044
   a better way.  */
3045
 
3046
boolean
3047
_bfd_mips_elf_section_processing (abfd, hdr)
3048
     bfd *abfd;
3049
     Elf_Internal_Shdr *hdr;
3050
{
3051
  if (hdr->sh_type == SHT_MIPS_REGINFO
3052
      && hdr->sh_size > 0)
3053
    {
3054
      bfd_byte buf[4];
3055
 
3056
      BFD_ASSERT (hdr->sh_size == sizeof (Elf32_External_RegInfo));
3057
      BFD_ASSERT (hdr->contents == NULL);
3058
 
3059
      if (bfd_seek (abfd,
3060
                    hdr->sh_offset + sizeof (Elf32_External_RegInfo) - 4,
3061
                    SEEK_SET) == -1)
3062
        return false;
3063
      bfd_h_put_32 (abfd, (bfd_vma) elf_gp (abfd), buf);
3064
      if (bfd_write (buf, (bfd_size_type) 1, (bfd_size_type) 4, abfd) != 4)
3065
        return false;
3066
    }
3067
 
3068
  if (hdr->sh_type == SHT_MIPS_OPTIONS
3069
      && hdr->bfd_section != NULL
3070
      && elf_section_data (hdr->bfd_section) != NULL
3071
      && elf_section_data (hdr->bfd_section)->tdata != NULL)
3072
    {
3073
      bfd_byte *contents, *l, *lend;
3074
 
3075
      /* We stored the section contents in the elf_section_data tdata
3076
         field in the set_section_contents routine.  We save the
3077
         section contents so that we don't have to read them again.
3078
         At this point we know that elf_gp is set, so we can look
3079
         through the section contents to see if there is an
3080
         ODK_REGINFO structure.  */
3081
 
3082
      contents = (bfd_byte *) elf_section_data (hdr->bfd_section)->tdata;
3083
      l = contents;
3084
      lend = contents + hdr->sh_size;
3085
      while (l + sizeof (Elf_External_Options) <= lend)
3086
        {
3087
          Elf_Internal_Options intopt;
3088
 
3089
          bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
3090
                                        &intopt);
3091
          if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
3092
            {
3093
              bfd_byte buf[8];
3094
 
3095
              if (bfd_seek (abfd,
3096
                            (hdr->sh_offset
3097
                             + (l - contents)
3098
                             + sizeof (Elf_External_Options)
3099
                             + (sizeof (Elf64_External_RegInfo) - 8)),
3100
                             SEEK_SET) == -1)
3101
                return false;
3102
              bfd_h_put_64 (abfd, elf_gp (abfd), buf);
3103
              if (bfd_write (buf, 1, 8, abfd) != 8)
3104
                return false;
3105
            }
3106
          else if (intopt.kind == ODK_REGINFO)
3107
            {
3108
              bfd_byte buf[4];
3109
 
3110
              if (bfd_seek (abfd,
3111
                            (hdr->sh_offset
3112
                             + (l - contents)
3113
                             + sizeof (Elf_External_Options)
3114
                             + (sizeof (Elf32_External_RegInfo) - 4)),
3115
                             SEEK_SET) == -1)
3116
                return false;
3117
              bfd_h_put_32 (abfd, elf_gp (abfd), buf);
3118
              if (bfd_write (buf, 1, 4, abfd) != 4)
3119
                return false;
3120
            }
3121
          l += intopt.size;
3122
        }
3123
    }
3124
 
3125
  if (hdr->bfd_section != NULL)
3126
    {
3127
      const char *name = bfd_get_section_name (abfd, hdr->bfd_section);
3128
 
3129
      if (strcmp (name, ".sdata") == 0
3130
          || strcmp (name, ".lit8") == 0
3131
          || strcmp (name, ".lit4") == 0)
3132
        {
3133
          hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
3134
          hdr->sh_type = SHT_PROGBITS;
3135
        }
3136
      else if (strcmp (name, ".sbss") == 0)
3137
        {
3138
          hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
3139
          hdr->sh_type = SHT_NOBITS;
3140
        }
3141
      else if (strcmp (name, MIPS_ELF_SRDATA_SECTION_NAME (abfd)) == 0)
3142
        {
3143
          hdr->sh_flags |= SHF_ALLOC | SHF_MIPS_GPREL;
3144
          hdr->sh_type = SHT_PROGBITS;
3145
        }
3146
      else if (strcmp (name, ".compact_rel") == 0)
3147
        {
3148
          hdr->sh_flags = 0;
3149
          hdr->sh_type = SHT_PROGBITS;
3150
        }
3151
      else if (strcmp (name, ".rtproc") == 0)
3152
        {
3153
          if (hdr->sh_addralign != 0 && hdr->sh_entsize == 0)
3154
            {
3155
              unsigned int adjust;
3156
 
3157
              adjust = hdr->sh_size % hdr->sh_addralign;
3158
              if (adjust != 0)
3159
                hdr->sh_size += hdr->sh_addralign - adjust;
3160
            }
3161
        }
3162
    }
3163
 
3164
  return true;
3165
}
3166
 
3167
 
3168
/* MIPS ELF uses two common sections.  One is the usual one, and the
3169
   other is for small objects.  All the small objects are kept
3170
   together, and then referenced via the gp pointer, which yields
3171
   faster assembler code.  This is what we use for the small common
3172
   section.  This approach is copied from ecoff.c.  */
3173
static asection mips_elf_scom_section;
3174
static asymbol mips_elf_scom_symbol;
3175
static asymbol *mips_elf_scom_symbol_ptr;
3176
 
3177
/* MIPS ELF also uses an acommon section, which represents an
3178
   allocated common symbol which may be overridden by a
3179
   definition in a shared library.  */
3180
static asection mips_elf_acom_section;
3181
static asymbol mips_elf_acom_symbol;
3182
static asymbol *mips_elf_acom_symbol_ptr;
3183
 
3184
/* The Irix 5 support uses two virtual sections, which represent
3185
   text/data symbols defined in dynamic objects.  */
3186
static asection mips_elf_text_section;
3187
static asection *mips_elf_text_section_ptr;
3188
static asymbol mips_elf_text_symbol;
3189
static asymbol *mips_elf_text_symbol_ptr;
3190
 
3191
static asection mips_elf_data_section;
3192
static asection *mips_elf_data_section_ptr;
3193
static asymbol mips_elf_data_symbol;
3194
static asymbol *mips_elf_data_symbol_ptr;
3195
 
3196
/* Handle the special MIPS section numbers that a symbol may use.
3197
   This is used for both the 32-bit and the 64-bit ABI.  */
3198
 
3199
void
3200
_bfd_mips_elf_symbol_processing (abfd, asym)
3201
     bfd *abfd;
3202
     asymbol *asym;
3203
{
3204
  elf_symbol_type *elfsym;
3205
 
3206
  elfsym = (elf_symbol_type *) asym;
3207
  switch (elfsym->internal_elf_sym.st_shndx)
3208
    {
3209
    case SHN_MIPS_ACOMMON:
3210
      /* This section is used in a dynamically linked executable file.
3211
         It is an allocated common section.  The dynamic linker can
3212
         either resolve these symbols to something in a shared
3213
         library, or it can just leave them here.  For our purposes,
3214
         we can consider these symbols to be in a new section.  */
3215
      if (mips_elf_acom_section.name == NULL)
3216
        {
3217
          /* Initialize the acommon section.  */
3218
          mips_elf_acom_section.name = ".acommon";
3219
          mips_elf_acom_section.flags = SEC_ALLOC;
3220
          mips_elf_acom_section.output_section = &mips_elf_acom_section;
3221
          mips_elf_acom_section.symbol = &mips_elf_acom_symbol;
3222
          mips_elf_acom_section.symbol_ptr_ptr = &mips_elf_acom_symbol_ptr;
3223
          mips_elf_acom_symbol.name = ".acommon";
3224
          mips_elf_acom_symbol.flags = BSF_SECTION_SYM;
3225
          mips_elf_acom_symbol.section = &mips_elf_acom_section;
3226
          mips_elf_acom_symbol_ptr = &mips_elf_acom_symbol;
3227
        }
3228
      asym->section = &mips_elf_acom_section;
3229
      break;
3230
 
3231
    case SHN_COMMON:
3232
      /* Common symbols less than the GP size are automatically
3233
         treated as SHN_MIPS_SCOMMON symbols on IRIX5.  */
3234
      if (asym->value > elf_gp_size (abfd)
3235
          || IRIX_COMPAT (abfd) == ict_irix6)
3236
        break;
3237
      /* Fall through.  */
3238
    case SHN_MIPS_SCOMMON:
3239
      if (mips_elf_scom_section.name == NULL)
3240
        {
3241
          /* Initialize the small common section.  */
3242
          mips_elf_scom_section.name = ".scommon";
3243
          mips_elf_scom_section.flags = SEC_IS_COMMON;
3244
          mips_elf_scom_section.output_section = &mips_elf_scom_section;
3245
          mips_elf_scom_section.symbol = &mips_elf_scom_symbol;
3246
          mips_elf_scom_section.symbol_ptr_ptr = &mips_elf_scom_symbol_ptr;
3247
          mips_elf_scom_symbol.name = ".scommon";
3248
          mips_elf_scom_symbol.flags = BSF_SECTION_SYM;
3249
          mips_elf_scom_symbol.section = &mips_elf_scom_section;
3250
          mips_elf_scom_symbol_ptr = &mips_elf_scom_symbol;
3251
        }
3252
      asym->section = &mips_elf_scom_section;
3253
      asym->value = elfsym->internal_elf_sym.st_size;
3254
      break;
3255
 
3256
    case SHN_MIPS_SUNDEFINED:
3257
      asym->section = bfd_und_section_ptr;
3258
      break;
3259
 
3260
#if 0 /* for SGI_COMPAT */
3261
    case SHN_MIPS_TEXT:
3262
      asym->section = mips_elf_text_section_ptr;
3263
      break;
3264
 
3265
    case SHN_MIPS_DATA:
3266
      asym->section = mips_elf_data_section_ptr;
3267
      break;
3268
#endif
3269
    }
3270
}
3271
 
3272
/* When creating an Irix 5 executable, we need REGINFO and RTPROC
3273
   segments.  */
3274
 
3275
int
3276
_bfd_mips_elf_additional_program_headers (abfd)
3277
     bfd *abfd;
3278
{
3279
  asection *s;
3280
  int ret = 0;
3281
 
3282
  if (!SGI_COMPAT (abfd))
3283
    return 0;
3284
 
3285
  /* See if we need a PT_MIPS_REGINFO segment.  */
3286
  s = bfd_get_section_by_name (abfd, ".reginfo");
3287
  if (s && (s->flags & SEC_LOAD))
3288
    ++ret;
3289
 
3290
  /* See if we need a PT_MIPS_OPTIONS segment.  */
3291
  if (IRIX_COMPAT (abfd) == ict_irix6
3292
      && bfd_get_section_by_name (abfd,
3293
                                  MIPS_ELF_OPTIONS_SECTION_NAME (abfd)))
3294
    ++ret;
3295
 
3296
  /* See if we need a PT_MIPS_RTPROC segment.  */
3297
  if (IRIX_COMPAT (abfd) == ict_irix5
3298
      && bfd_get_section_by_name (abfd, ".dynamic")
3299
      && bfd_get_section_by_name (abfd, ".mdebug"))
3300
    ++ret;
3301
 
3302
  return ret;
3303
}
3304
 
3305
/* Modify the segment map for an Irix 5 executable.  */
3306
 
3307
boolean
3308
_bfd_mips_elf_modify_segment_map (abfd)
3309
     bfd *abfd;
3310
{
3311
  asection *s;
3312
  struct elf_segment_map *m, **pm;
3313
 
3314
  if (! SGI_COMPAT (abfd))
3315
    return true;
3316
 
3317
  /* If there is a .reginfo section, we need a PT_MIPS_REGINFO
3318
     segment.  */
3319
  s = bfd_get_section_by_name (abfd, ".reginfo");
3320
  if (s != NULL && (s->flags & SEC_LOAD) != 0)
3321
    {
3322
      for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
3323
        if (m->p_type == PT_MIPS_REGINFO)
3324
          break;
3325
      if (m == NULL)
3326
        {
3327
          m = (struct elf_segment_map *) bfd_zalloc (abfd, sizeof *m);
3328
          if (m == NULL)
3329
            return false;
3330
 
3331
          m->p_type = PT_MIPS_REGINFO;
3332
          m->count = 1;
3333
          m->sections[0] = s;
3334
 
3335
          /* We want to put it after the PHDR and INTERP segments.  */
3336
          pm = &elf_tdata (abfd)->segment_map;
3337
          while (*pm != NULL
3338
                 && ((*pm)->p_type == PT_PHDR
3339
                     || (*pm)->p_type == PT_INTERP))
3340
            pm = &(*pm)->next;
3341
 
3342
          m->next = *pm;
3343
          *pm = m;
3344
        }
3345
    }
3346
 
3347
  /* For IRIX 6, we don't have .mdebug sections, nor does anything but
3348
     .dynamic end up in PT_DYNAMIC.  However, we do have to insert a
3349
     PT_OPTIONS segement immediately following the program header
3350
     table.  */
3351
  if (IRIX_COMPAT (abfd) == ict_irix6)
3352
    {
3353
      asection *s;
3354
 
3355
      for (s = abfd->sections; s; s = s->next)
3356
        if (elf_section_data (s)->this_hdr.sh_type == SHT_MIPS_OPTIONS)
3357
          break;
3358
 
3359
      if (s)
3360
        {
3361
          struct elf_segment_map *options_segment;
3362
 
3363
          /* Usually, there's a program header table.  But, sometimes
3364
             there's not (like when running the `ld' testsuite).  So,
3365
             if there's no program header table, we just put the
3366
             options segement at the end.  */
3367
          for (pm = &elf_tdata (abfd)->segment_map;
3368
               *pm != NULL;
3369
               pm = &(*pm)->next)
3370
            if ((*pm)->p_type == PT_PHDR)
3371
              break;
3372
 
3373
          options_segment = bfd_zalloc (abfd,
3374
                                        sizeof (struct elf_segment_map));
3375
          options_segment->next = *pm;
3376
          options_segment->p_type = PT_MIPS_OPTIONS;
3377
          options_segment->p_flags = PF_R;
3378
          options_segment->p_flags_valid = true;
3379
          options_segment->count = 1;
3380
          options_segment->sections[0] = s;
3381
          *pm = options_segment;
3382
        }
3383
    }
3384
  else
3385
    {
3386
      /* If there are .dynamic and .mdebug sections, we make a room
3387
         for the RTPROC header.  FIXME: Rewrite without section names.  */
3388
      if (bfd_get_section_by_name (abfd, ".interp") == NULL
3389
          && bfd_get_section_by_name (abfd, ".dynamic") != NULL
3390
          && bfd_get_section_by_name (abfd, ".mdebug") != NULL)
3391
        {
3392
          for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
3393
            if (m->p_type == PT_MIPS_RTPROC)
3394
              break;
3395
          if (m == NULL)
3396
            {
3397
              m = (struct elf_segment_map *) bfd_zalloc (abfd, sizeof *m);
3398
              if (m == NULL)
3399
                return false;
3400
 
3401
              m->p_type = PT_MIPS_RTPROC;
3402
 
3403
              s = bfd_get_section_by_name (abfd, ".rtproc");
3404
              if (s == NULL)
3405
                {
3406
                  m->count = 0;
3407
                  m->p_flags = 0;
3408
                  m->p_flags_valid = 1;
3409
                }
3410
              else
3411
                {
3412
                  m->count = 1;
3413
                  m->sections[0] = s;
3414
                }
3415
 
3416
              /* We want to put it after the DYNAMIC segment.  */
3417
              pm = &elf_tdata (abfd)->segment_map;
3418
              while (*pm != NULL && (*pm)->p_type != PT_DYNAMIC)
3419
                pm = &(*pm)->next;
3420
              if (*pm != NULL)
3421
                pm = &(*pm)->next;
3422
 
3423
              m->next = *pm;
3424
              *pm = m;
3425
            }
3426
        }
3427
 
3428
      /* On Irix 5, the PT_DYNAMIC segment includes the .dynamic,
3429
         .dynstr, .dynsym, and .hash sections, and everything in
3430
         between.  */
3431
      for (pm = &elf_tdata (abfd)->segment_map; *pm != NULL; pm = &(*pm)->next)
3432
        if ((*pm)->p_type == PT_DYNAMIC)
3433
          break;
3434
      m = *pm;
3435
      if (m != NULL
3436
          && m->count == 1
3437
          && strcmp (m->sections[0]->name, ".dynamic") == 0)
3438
        {
3439
          static const char *sec_names[] =
3440
          { ".dynamic", ".dynstr", ".dynsym", ".hash" };
3441
          bfd_vma low, high;
3442
          unsigned int i, c;
3443
          struct elf_segment_map *n;
3444
 
3445
          low = 0xffffffff;
3446
          high = 0;
3447
          for (i = 0; i < sizeof sec_names / sizeof sec_names[0]; i++)
3448
            {
3449
              s = bfd_get_section_by_name (abfd, sec_names[i]);
3450
              if (s != NULL && (s->flags & SEC_LOAD) != 0)
3451
                {
3452
                  bfd_size_type sz;
3453
 
3454
                  if (low > s->vma)
3455
                    low = s->vma;
3456
                  sz = s->_cooked_size;
3457
                  if (sz == 0)
3458
                    sz = s->_raw_size;
3459
                  if (high < s->vma + sz)
3460
                    high = s->vma + sz;
3461
                }
3462
            }
3463
 
3464
          c = 0;
3465
          for (s = abfd->sections; s != NULL; s = s->next)
3466
            if ((s->flags & SEC_LOAD) != 0
3467
                && s->vma >= low
3468
                && ((s->vma
3469
                     + (s->_cooked_size != 0 ? s->_cooked_size : s->_raw_size))
3470
                    <= high))
3471
              ++c;
3472
 
3473
          n = ((struct elf_segment_map *)
3474
               bfd_zalloc (abfd, sizeof *n + (c - 1) * sizeof (asection *)));
3475
          if (n == NULL)
3476
            return false;
3477
          *n = *m;
3478
          n->count = c;
3479
 
3480
          i = 0;
3481
          for (s = abfd->sections; s != NULL; s = s->next)
3482
            {
3483
              if ((s->flags & SEC_LOAD) != 0
3484
                  && s->vma >= low
3485
                  && ((s->vma
3486
                       + (s->_cooked_size != 0 ?
3487
                          s->_cooked_size : s->_raw_size))
3488
                      <= high))
3489
                {
3490
                  n->sections[i] = s;
3491
                  ++i;
3492
                }
3493
            }
3494
 
3495
          *pm = n;
3496
        }
3497
    }
3498
 
3499
  return true;
3500
}
3501
 
3502
/* The structure of the runtime procedure descriptor created by the
3503
   loader for use by the static exception system.  */
3504
 
3505
typedef struct runtime_pdr {
3506
        bfd_vma adr;            /* memory address of start of procedure */
3507
        long    regmask;        /* save register mask */
3508
        long    regoffset;      /* save register offset */
3509
        long    fregmask;       /* save floating point register mask */
3510
        long    fregoffset;     /* save floating point register offset */
3511
        long    frameoffset;    /* frame size */
3512
        short   framereg;       /* frame pointer register */
3513
        short   pcreg;          /* offset or reg of return pc */
3514
        long    irpss;          /* index into the runtime string table */
3515
        long    reserved;
3516
        struct exception_info *exception_info;/* pointer to exception array */
3517
} RPDR, *pRPDR;
3518
#define cbRPDR sizeof(RPDR)
3519
#define rpdNil ((pRPDR) 0)
3520
 
3521
/* Swap RPDR (runtime procedure table entry) for output.  */
3522
 
3523
static void ecoff_swap_rpdr_out
3524
  PARAMS ((bfd *, const RPDR *, struct rpdr_ext *));
3525
 
3526
static void
3527
ecoff_swap_rpdr_out (abfd, in, ex)
3528
     bfd *abfd;
3529
     const RPDR *in;
3530
     struct rpdr_ext *ex;
3531
{
3532
  /* ecoff_put_off was defined in ecoffswap.h.  */
3533
  ecoff_put_off (abfd, in->adr, (bfd_byte *) ex->p_adr);
3534
  bfd_h_put_32 (abfd, in->regmask, (bfd_byte *) ex->p_regmask);
3535
  bfd_h_put_32 (abfd, in->regoffset, (bfd_byte *) ex->p_regoffset);
3536
  bfd_h_put_32 (abfd, in->fregmask, (bfd_byte *) ex->p_fregmask);
3537
  bfd_h_put_32 (abfd, in->fregoffset, (bfd_byte *) ex->p_fregoffset);
3538
  bfd_h_put_32 (abfd, in->frameoffset, (bfd_byte *) ex->p_frameoffset);
3539
 
3540
  bfd_h_put_16 (abfd, in->framereg, (bfd_byte *) ex->p_framereg);
3541
  bfd_h_put_16 (abfd, in->pcreg, (bfd_byte *) ex->p_pcreg);
3542
 
3543
  bfd_h_put_32 (abfd, in->irpss, (bfd_byte *) ex->p_irpss);
3544
#if 0 /* FIXME */
3545
  ecoff_put_off (abfd, in->exception_info, (bfd_byte *) ex->p_exception_info);
3546
#endif
3547
}
3548
 
3549
/* Read ECOFF debugging information from a .mdebug section into a
3550
   ecoff_debug_info structure.  */
3551
 
3552
boolean
3553
_bfd_mips_elf_read_ecoff_info (abfd, section, debug)
3554
     bfd *abfd;
3555
     asection *section;
3556
     struct ecoff_debug_info *debug;
3557
{
3558
  HDRR *symhdr;
3559
  const struct ecoff_debug_swap *swap;
3560
  char *ext_hdr = NULL;
3561
 
3562
  swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
3563
  memset (debug, 0, sizeof(*debug));
3564
 
3565
  ext_hdr = (char *) bfd_malloc ((size_t) swap->external_hdr_size);
3566
  if (ext_hdr == NULL && swap->external_hdr_size != 0)
3567
    goto error_return;
3568
 
3569
  if (bfd_get_section_contents (abfd, section, ext_hdr, (file_ptr) 0,
3570
                                swap->external_hdr_size)
3571
      == false)
3572
    goto error_return;
3573
 
3574
  symhdr = &debug->symbolic_header;
3575
  (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
3576
 
3577
  /* The symbolic header contains absolute file offsets and sizes to
3578
     read.  */
3579
#define READ(ptr, offset, count, size, type)                            \
3580
  if (symhdr->count == 0)                                                \
3581
    debug->ptr = NULL;                                                  \
3582
  else                                                                  \
3583
    {                                                                   \
3584
      debug->ptr = (type) bfd_malloc ((size_t) (size * symhdr->count)); \
3585
      if (debug->ptr == NULL)                                           \
3586
        goto error_return;                                              \
3587
      if (bfd_seek (abfd, (file_ptr) symhdr->offset, SEEK_SET) != 0      \
3588
          || (bfd_read (debug->ptr, size, symhdr->count,                \
3589
                        abfd) != size * symhdr->count))                 \
3590
        goto error_return;                                              \
3591
    }
3592
 
3593
  READ (line, cbLineOffset, cbLine, sizeof (unsigned char), unsigned char *);
3594
  READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, PTR);
3595
  READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, PTR);
3596
  READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, PTR);
3597
  READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, PTR);
3598
  READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
3599
        union aux_ext *);
3600
  READ (ss, cbSsOffset, issMax, sizeof (char), char *);
3601
  READ (ssext, cbSsExtOffset, issExtMax, sizeof (char), char *);
3602
  READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, PTR);
3603
  READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, PTR);
3604
  READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size, PTR);
3605
#undef READ
3606
 
3607
  debug->fdr = NULL;
3608
  debug->adjust = NULL;
3609
 
3610
  return true;
3611
 
3612
 error_return:
3613
  if (ext_hdr != NULL)
3614
    free (ext_hdr);
3615
  if (debug->line != NULL)
3616
    free (debug->line);
3617
  if (debug->external_dnr != NULL)
3618
    free (debug->external_dnr);
3619
  if (debug->external_pdr != NULL)
3620
    free (debug->external_pdr);
3621
  if (debug->external_sym != NULL)
3622
    free (debug->external_sym);
3623
  if (debug->external_opt != NULL)
3624
    free (debug->external_opt);
3625
  if (debug->external_aux != NULL)
3626
    free (debug->external_aux);
3627
  if (debug->ss != NULL)
3628
    free (debug->ss);
3629
  if (debug->ssext != NULL)
3630
    free (debug->ssext);
3631
  if (debug->external_fdr != NULL)
3632
    free (debug->external_fdr);
3633
  if (debug->external_rfd != NULL)
3634
    free (debug->external_rfd);
3635
  if (debug->external_ext != NULL)
3636
    free (debug->external_ext);
3637
  return false;
3638
}
3639
 
3640
/* MIPS ELF local labels start with '$', not 'L'.  */
3641
 
3642
/*ARGSUSED*/
3643
static boolean
3644
mips_elf_is_local_label_name (abfd, name)
3645
     bfd *abfd;
3646
     const char *name;
3647
{
3648
  if (name[0] == '$')
3649
    return true;
3650
 
3651
  /* On Irix 6, the labels go back to starting with '.', so we accept
3652
     the generic ELF local label syntax as well.  */
3653
  return _bfd_elf_is_local_label_name (abfd, name);
3654
}
3655
 
3656
/* MIPS ELF uses a special find_nearest_line routine in order the
3657
   handle the ECOFF debugging information.  */
3658
 
3659
struct mips_elf_find_line
3660
{
3661
  struct ecoff_debug_info d;
3662
  struct ecoff_find_line i;
3663
};
3664
 
3665
boolean
3666
_bfd_mips_elf_find_nearest_line (abfd, section, symbols, offset, filename_ptr,
3667
                                 functionname_ptr, line_ptr)
3668
     bfd *abfd;
3669
     asection *section;
3670
     asymbol **symbols;
3671
     bfd_vma offset;
3672
     const char **filename_ptr;
3673
     const char **functionname_ptr;
3674
     unsigned int *line_ptr;
3675
{
3676
  asection *msec;
3677
 
3678
  if (_bfd_dwarf1_find_nearest_line (abfd, section, symbols, offset,
3679
                                     filename_ptr, functionname_ptr,
3680
                                     line_ptr))
3681
    return true;
3682
 
3683
  if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
3684
                                     filename_ptr, functionname_ptr,
3685
                                     line_ptr,
3686
                                     ABI_64_P (abfd) ? 8 : 0))
3687
    return true;
3688
 
3689
  msec = bfd_get_section_by_name (abfd, ".mdebug");
3690
  if (msec != NULL)
3691
    {
3692
      flagword origflags;
3693
      struct mips_elf_find_line *fi;
3694
      const struct ecoff_debug_swap * const swap =
3695
        get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
3696
 
3697
      /* If we are called during a link, mips_elf_final_link may have
3698
         cleared the SEC_HAS_CONTENTS field.  We force it back on here
3699
         if appropriate (which it normally will be).  */
3700
      origflags = msec->flags;
3701
      if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
3702
        msec->flags |= SEC_HAS_CONTENTS;
3703
 
3704
      fi = elf_tdata (abfd)->find_line_info;
3705
      if (fi == NULL)
3706
        {
3707
          bfd_size_type external_fdr_size;
3708
          char *fraw_src;
3709
          char *fraw_end;
3710
          struct fdr *fdr_ptr;
3711
 
3712
          fi = ((struct mips_elf_find_line *)
3713
                bfd_zalloc (abfd, sizeof (struct mips_elf_find_line)));
3714
          if (fi == NULL)
3715
            {
3716
              msec->flags = origflags;
3717
              return false;
3718
            }
3719
 
3720
          if (! _bfd_mips_elf_read_ecoff_info (abfd, msec, &fi->d))
3721
            {
3722
              msec->flags = origflags;
3723
              return false;
3724
            }
3725
 
3726
          /* Swap in the FDR information.  */
3727
          fi->d.fdr = ((struct fdr *)
3728
                       bfd_alloc (abfd,
3729
                                  (fi->d.symbolic_header.ifdMax *
3730
                                   sizeof (struct fdr))));
3731
          if (fi->d.fdr == NULL)
3732
            {
3733
              msec->flags = origflags;
3734
              return false;
3735
            }
3736
          external_fdr_size = swap->external_fdr_size;
3737
          fdr_ptr = fi->d.fdr;
3738
          fraw_src = (char *) fi->d.external_fdr;
3739
          fraw_end = (fraw_src
3740
                      + fi->d.symbolic_header.ifdMax * external_fdr_size);
3741
          for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
3742
            (*swap->swap_fdr_in) (abfd, (PTR) fraw_src, fdr_ptr);
3743
 
3744
          elf_tdata (abfd)->find_line_info = fi;
3745
 
3746
          /* Note that we don't bother to ever free this information.
3747
             find_nearest_line is either called all the time, as in
3748
             objdump -l, so the information should be saved, or it is
3749
             rarely called, as in ld error messages, so the memory
3750
             wasted is unimportant.  Still, it would probably be a
3751
             good idea for free_cached_info to throw it away.  */
3752
        }
3753
 
3754
      if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
3755
                                  &fi->i, filename_ptr, functionname_ptr,
3756
                                  line_ptr))
3757
        {
3758
          msec->flags = origflags;
3759
          return true;
3760
        }
3761
 
3762
      msec->flags = origflags;
3763
    }
3764
 
3765
  /* Fall back on the generic ELF find_nearest_line routine.  */
3766
 
3767
  return _bfd_elf_find_nearest_line (abfd, section, symbols, offset,
3768
                                     filename_ptr, functionname_ptr,
3769
                                     line_ptr);
3770
}
3771
 
3772
  /* The mips16 compiler uses a couple of special sections to handle
3773
     floating point arguments.
3774
 
3775
     Section names that look like .mips16.fn.FNNAME contain stubs that
3776
     copy floating point arguments from the fp regs to the gp regs and
3777
     then jump to FNNAME.  If any 32 bit function calls FNNAME, the
3778
     call should be redirected to the stub instead.  If no 32 bit
3779
     function calls FNNAME, the stub should be discarded.  We need to
3780
     consider any reference to the function, not just a call, because
3781
     if the address of the function is taken we will need the stub,
3782
     since the address might be passed to a 32 bit function.
3783
 
3784
     Section names that look like .mips16.call.FNNAME contain stubs
3785
     that copy floating point arguments from the gp regs to the fp
3786
     regs and then jump to FNNAME.  If FNNAME is a 32 bit function,
3787
     then any 16 bit function that calls FNNAME should be redirected
3788
     to the stub instead.  If FNNAME is not a 32 bit function, the
3789
     stub should be discarded.
3790
 
3791
     .mips16.call.fp.FNNAME sections are similar, but contain stubs
3792
     which call FNNAME and then copy the return value from the fp regs
3793
     to the gp regs.  These stubs store the return value in $18 while
3794
     calling FNNAME; any function which might call one of these stubs
3795
     must arrange to save $18 around the call.  (This case is not
3796
     needed for 32 bit functions that call 16 bit functions, because
3797
     16 bit functions always return floating point values in both
3798
     $f0/$f1 and $2/$3.)
3799
 
3800
     Note that in all cases FNNAME might be defined statically.
3801
     Therefore, FNNAME is not used literally.  Instead, the relocation
3802
     information will indicate which symbol the section is for.
3803
 
3804
     We record any stubs that we find in the symbol table.  */
3805
 
3806
#define FN_STUB ".mips16.fn."
3807
#define CALL_STUB ".mips16.call."
3808
#define CALL_FP_STUB ".mips16.call.fp."
3809
 
3810
/* MIPS ELF linker hash table.  */
3811
 
3812
struct mips_elf_link_hash_table
3813
{
3814
  struct elf_link_hash_table root;
3815
#if 0
3816
  /* We no longer use this.  */
3817
  /* String section indices for the dynamic section symbols.  */
3818
  bfd_size_type dynsym_sec_strindex[SIZEOF_MIPS_DYNSYM_SECNAMES];
3819
#endif
3820
  /* The number of .rtproc entries.  */
3821
  bfd_size_type procedure_count;
3822
  /* The size of the .compact_rel section (if SGI_COMPAT).  */
3823
  bfd_size_type compact_rel_size;
3824
  /* This flag indicates that the value of DT_MIPS_RLD_MAP dynamic
3825
     entry is set to the address of __rld_obj_head as in Irix 5. */
3826
  boolean use_rld_obj_head;
3827
  /* This is the value of the __rld_map or __rld_obj_head symbol.  */
3828
  bfd_vma rld_value;
3829
  /* This is set if we see any mips16 stub sections. */
3830
  boolean mips16_stubs_seen;
3831
};
3832
 
3833
/* Look up an entry in a MIPS ELF linker hash table.  */
3834
 
3835
#define mips_elf_link_hash_lookup(table, string, create, copy, follow)  \
3836
  ((struct mips_elf_link_hash_entry *)                                  \
3837
   elf_link_hash_lookup (&(table)->root, (string), (create),            \
3838
                         (copy), (follow)))
3839
 
3840
/* Traverse a MIPS ELF linker hash table.  */
3841
 
3842
#define mips_elf_link_hash_traverse(table, func, info)                  \
3843
  (elf_link_hash_traverse                                               \
3844
   (&(table)->root,                                                     \
3845
    (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func),  \
3846
    (info)))
3847
 
3848
/* Get the MIPS ELF linker hash table from a link_info structure.  */
3849
 
3850
#define mips_elf_hash_table(p) \
3851
  ((struct mips_elf_link_hash_table *) ((p)->hash))
3852
 
3853
static boolean mips_elf_output_extsym
3854
  PARAMS ((struct mips_elf_link_hash_entry *, PTR));
3855
 
3856
/* Create an entry in a MIPS ELF linker hash table.  */
3857
 
3858
static struct bfd_hash_entry *
3859
mips_elf_link_hash_newfunc (entry, table, string)
3860
     struct bfd_hash_entry *entry;
3861
     struct bfd_hash_table *table;
3862
     const char *string;
3863
{
3864
  struct mips_elf_link_hash_entry *ret =
3865
    (struct mips_elf_link_hash_entry *) entry;
3866
 
3867
  /* Allocate the structure if it has not already been allocated by a
3868
     subclass.  */
3869
  if (ret == (struct mips_elf_link_hash_entry *) NULL)
3870
    ret = ((struct mips_elf_link_hash_entry *)
3871
           bfd_hash_allocate (table,
3872
                              sizeof (struct mips_elf_link_hash_entry)));
3873
  if (ret == (struct mips_elf_link_hash_entry *) NULL)
3874
    return (struct bfd_hash_entry *) ret;
3875
 
3876
  /* Call the allocation method of the superclass.  */
3877
  ret = ((struct mips_elf_link_hash_entry *)
3878
         _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
3879
                                     table, string));
3880
  if (ret != (struct mips_elf_link_hash_entry *) NULL)
3881
    {
3882
      /* Set local fields.  */
3883
      memset (&ret->esym, 0, sizeof (EXTR));
3884
      /* We use -2 as a marker to indicate that the information has
3885
         not been set.  -1 means there is no associated ifd.  */
3886
      ret->esym.ifd = -2;
3887
      ret->possibly_dynamic_relocs = 0;
3888
      ret->min_dyn_reloc_index = 0;
3889
      ret->fn_stub = NULL;
3890
      ret->need_fn_stub = false;
3891
      ret->call_stub = NULL;
3892
      ret->call_fp_stub = NULL;
3893
    }
3894
 
3895
  return (struct bfd_hash_entry *) ret;
3896
}
3897
 
3898
/* Create a MIPS ELF linker hash table.  */
3899
 
3900
struct bfd_link_hash_table *
3901
_bfd_mips_elf_link_hash_table_create (abfd)
3902
     bfd *abfd;
3903
{
3904
  struct mips_elf_link_hash_table *ret;
3905
 
3906
  ret = ((struct mips_elf_link_hash_table *)
3907
         bfd_alloc (abfd, sizeof (struct mips_elf_link_hash_table)));
3908
  if (ret == (struct mips_elf_link_hash_table *) NULL)
3909
    return NULL;
3910
 
3911
  if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
3912
                                       mips_elf_link_hash_newfunc))
3913
    {
3914
      bfd_release (abfd, ret);
3915
      return NULL;
3916
    }
3917
 
3918
#if 0
3919
  /* We no longer use this.  */
3920
  for (i = 0; i < SIZEOF_MIPS_DYNSYM_SECNAMES; i++)
3921
    ret->dynsym_sec_strindex[i] = (bfd_size_type) -1;
3922
#endif
3923
  ret->procedure_count = 0;
3924
  ret->compact_rel_size = 0;
3925
  ret->use_rld_obj_head = false;
3926
  ret->rld_value = 0;
3927
  ret->mips16_stubs_seen = false;
3928
 
3929
  return &ret->root.root;
3930
}
3931
 
3932
/* Hook called by the linker routine which adds symbols from an object
3933
   file.  We must handle the special MIPS section numbers here.  */
3934
 
3935
/*ARGSUSED*/
3936
boolean
3937
_bfd_mips_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
3938
     bfd *abfd;
3939
     struct bfd_link_info *info;
3940
     const Elf_Internal_Sym *sym;
3941
     const char **namep;
3942
     flagword *flagsp ATTRIBUTE_UNUSED;
3943
     asection **secp;
3944
     bfd_vma *valp;
3945
{
3946
  if (SGI_COMPAT (abfd)
3947
      && (abfd->flags & DYNAMIC) != 0
3948
      && strcmp (*namep, "_rld_new_interface") == 0)
3949
    {
3950
      /* Skip Irix 5 rld entry name.  */
3951
      *namep = NULL;
3952
      return true;
3953
    }
3954
 
3955
  switch (sym->st_shndx)
3956
    {
3957
    case SHN_COMMON:
3958
      /* Common symbols less than the GP size are automatically
3959
         treated as SHN_MIPS_SCOMMON symbols.  */
3960
      if (sym->st_size > elf_gp_size (abfd)
3961
          || IRIX_COMPAT (abfd) == ict_irix6)
3962
        break;
3963
      /* Fall through.  */
3964
    case SHN_MIPS_SCOMMON:
3965
      *secp = bfd_make_section_old_way (abfd, ".scommon");
3966
      (*secp)->flags |= SEC_IS_COMMON;
3967
      *valp = sym->st_size;
3968
      break;
3969
 
3970
    case SHN_MIPS_TEXT:
3971
      /* This section is used in a shared object.  */
3972
      if (mips_elf_text_section_ptr == NULL)
3973
        {
3974
          /* Initialize the section.  */
3975
          mips_elf_text_section.name = ".text";
3976
          mips_elf_text_section.flags = SEC_NO_FLAGS;
3977
          mips_elf_text_section.output_section = NULL;
3978
          mips_elf_text_section.symbol = &mips_elf_text_symbol;
3979
          mips_elf_text_section.symbol_ptr_ptr = &mips_elf_text_symbol_ptr;
3980
          mips_elf_text_symbol.name = ".text";
3981
          mips_elf_text_symbol.flags = BSF_SECTION_SYM | BSF_DYNAMIC;
3982
          mips_elf_text_symbol.section = &mips_elf_text_section;
3983
          mips_elf_text_symbol_ptr = &mips_elf_text_symbol;
3984
          mips_elf_text_section_ptr = &mips_elf_text_section;
3985
        }
3986
      /* This code used to do *secp = bfd_und_section_ptr if
3987
         info->shared.  I don't know why, and that doesn't make sense,
3988
         so I took it out.  */
3989
      *secp = mips_elf_text_section_ptr;
3990
      break;
3991
 
3992
    case SHN_MIPS_ACOMMON:
3993
      /* Fall through. XXX Can we treat this as allocated data?  */
3994
    case SHN_MIPS_DATA:
3995
      /* This section is used in a shared object.  */
3996
      if (mips_elf_data_section_ptr == NULL)
3997
        {
3998
          /* Initialize the section.  */
3999
          mips_elf_data_section.name = ".data";
4000
          mips_elf_data_section.flags = SEC_NO_FLAGS;
4001
          mips_elf_data_section.output_section = NULL;
4002
          mips_elf_data_section.symbol = &mips_elf_data_symbol;
4003
          mips_elf_data_section.symbol_ptr_ptr = &mips_elf_data_symbol_ptr;
4004
          mips_elf_data_symbol.name = ".data";
4005
          mips_elf_data_symbol.flags = BSF_SECTION_SYM | BSF_DYNAMIC;
4006
          mips_elf_data_symbol.section = &mips_elf_data_section;
4007
          mips_elf_data_symbol_ptr = &mips_elf_data_symbol;
4008
          mips_elf_data_section_ptr = &mips_elf_data_section;
4009
        }
4010
      /* This code used to do *secp = bfd_und_section_ptr if
4011
         info->shared.  I don't know why, and that doesn't make sense,
4012
         so I took it out.  */
4013
      *secp = mips_elf_data_section_ptr;
4014
      break;
4015
 
4016
    case SHN_MIPS_SUNDEFINED:
4017
      *secp = bfd_und_section_ptr;
4018
      break;
4019
    }
4020
 
4021
  if (SGI_COMPAT (abfd)
4022
      && ! info->shared
4023
      && info->hash->creator == abfd->xvec
4024
      && strcmp (*namep, "__rld_obj_head") == 0)
4025
    {
4026
      struct elf_link_hash_entry *h;
4027
 
4028
      /* Mark __rld_obj_head as dynamic.  */
4029
      h = NULL;
4030
      if (! (_bfd_generic_link_add_one_symbol
4031
             (info, abfd, *namep, BSF_GLOBAL, *secp,
4032
              (bfd_vma) *valp, (const char *) NULL, false,
4033
              get_elf_backend_data (abfd)->collect,
4034
              (struct bfd_link_hash_entry **) &h)))
4035
        return false;
4036
      h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF;
4037
      h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
4038
      h->type = STT_OBJECT;
4039
 
4040
      if (! bfd_elf32_link_record_dynamic_symbol (info, h))
4041
        return false;
4042
 
4043
      mips_elf_hash_table (info)->use_rld_obj_head = true;
4044
    }
4045
 
4046
  /* If this is a mips16 text symbol, add 1 to the value to make it
4047
     odd.  This will cause something like .word SYM to come up with
4048
     the right value when it is loaded into the PC.  */
4049
  if (sym->st_other == STO_MIPS16)
4050
    ++*valp;
4051
 
4052
  return true;
4053
}
4054
 
4055
/* Structure used to pass information to mips_elf_output_extsym.  */
4056
 
4057
struct extsym_info
4058
{
4059
  bfd *abfd;
4060
  struct bfd_link_info *info;
4061
  struct ecoff_debug_info *debug;
4062
  const struct ecoff_debug_swap *swap;
4063
  boolean failed;
4064
};
4065
 
4066
/* This routine is used to write out ECOFF debugging external symbol
4067
   information.  It is called via mips_elf_link_hash_traverse.  The
4068
   ECOFF external symbol information must match the ELF external
4069
   symbol information.  Unfortunately, at this point we don't know
4070
   whether a symbol is required by reloc information, so the two
4071
   tables may wind up being different.  We must sort out the external
4072
   symbol information before we can set the final size of the .mdebug
4073
   section, and we must set the size of the .mdebug section before we
4074
   can relocate any sections, and we can't know which symbols are
4075
   required by relocation until we relocate the sections.
4076
   Fortunately, it is relatively unlikely that any symbol will be
4077
   stripped but required by a reloc.  In particular, it can not happen
4078
   when generating a final executable.  */
4079
 
4080
static boolean
4081
mips_elf_output_extsym (h, data)
4082
     struct mips_elf_link_hash_entry *h;
4083
     PTR data;
4084
{
4085
  struct extsym_info *einfo = (struct extsym_info *) data;
4086
  boolean strip;
4087
  asection *sec, *output_section;
4088
 
4089
  if (h->root.indx == -2)
4090
    strip = false;
4091
  else if (((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
4092
            || (h->root.elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0)
4093
           && (h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0
4094
           && (h->root.elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0)
4095
    strip = true;
4096
  else if (einfo->info->strip == strip_all
4097
           || (einfo->info->strip == strip_some
4098
               && bfd_hash_lookup (einfo->info->keep_hash,
4099
                                   h->root.root.root.string,
4100
                                   false, false) == NULL))
4101
    strip = true;
4102
  else
4103
    strip = false;
4104
 
4105
  if (strip)
4106
    return true;
4107
 
4108
  if (h->esym.ifd == -2)
4109
    {
4110
      h->esym.jmptbl = 0;
4111
      h->esym.cobol_main = 0;
4112
      h->esym.weakext = 0;
4113
      h->esym.reserved = 0;
4114
      h->esym.ifd = ifdNil;
4115
      h->esym.asym.value = 0;
4116
      h->esym.asym.st = stGlobal;
4117
 
4118
      if (SGI_COMPAT (einfo->abfd)
4119
          && (h->root.root.type == bfd_link_hash_undefined
4120
              || h->root.root.type == bfd_link_hash_undefweak))
4121
        {
4122
          const char *name;
4123
 
4124
          /* Use undefined class.  Also, set class and type for some
4125
             special symbols.  */
4126
          name = h->root.root.root.string;
4127
          if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
4128
              || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
4129
            {
4130
              h->esym.asym.sc = scData;
4131
              h->esym.asym.st = stLabel;
4132
              h->esym.asym.value = 0;
4133
            }
4134
          else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
4135
            {
4136
              h->esym.asym.sc = scAbs;
4137
              h->esym.asym.st = stLabel;
4138
              h->esym.asym.value =
4139
                mips_elf_hash_table (einfo->info)->procedure_count;
4140
            }
4141
          else if (strcmp (name, "_gp_disp") == 0)
4142
            {
4143
              h->esym.asym.sc = scAbs;
4144
              h->esym.asym.st = stLabel;
4145
              h->esym.asym.value = elf_gp (einfo->abfd);
4146
            }
4147
          else
4148
            h->esym.asym.sc = scUndefined;
4149
        }
4150
      else if (h->root.root.type != bfd_link_hash_defined
4151
          && h->root.root.type != bfd_link_hash_defweak)
4152
        h->esym.asym.sc = scAbs;
4153
      else
4154
        {
4155
          const char *name;
4156
 
4157
          sec = h->root.root.u.def.section;
4158
          output_section = sec->output_section;
4159
 
4160
          /* When making a shared library and symbol h is the one from
4161
             the another shared library, OUTPUT_SECTION may be null.  */
4162
          if (output_section == NULL)
4163
            h->esym.asym.sc = scUndefined;
4164
          else
4165
            {
4166
              name = bfd_section_name (output_section->owner, output_section);
4167
 
4168
              if (strcmp (name, ".text") == 0)
4169
                h->esym.asym.sc = scText;
4170
              else if (strcmp (name, ".data") == 0)
4171
                h->esym.asym.sc = scData;
4172
              else if (strcmp (name, ".sdata") == 0)
4173
                h->esym.asym.sc = scSData;
4174
              else if (strcmp (name, ".rodata") == 0
4175
                       || strcmp (name, ".rdata") == 0)
4176
                h->esym.asym.sc = scRData;
4177
              else if (strcmp (name, ".bss") == 0)
4178
                h->esym.asym.sc = scBss;
4179
              else if (strcmp (name, ".sbss") == 0)
4180
                h->esym.asym.sc = scSBss;
4181
              else if (strcmp (name, ".init") == 0)
4182
                h->esym.asym.sc = scInit;
4183
              else if (strcmp (name, ".fini") == 0)
4184
                h->esym.asym.sc = scFini;
4185
              else
4186
                h->esym.asym.sc = scAbs;
4187
            }
4188
        }
4189
 
4190
      h->esym.asym.reserved = 0;
4191
      h->esym.asym.index = indexNil;
4192
    }
4193
 
4194
  if (h->root.root.type == bfd_link_hash_common)
4195
    h->esym.asym.value = h->root.root.u.c.size;
4196
  else if (h->root.root.type == bfd_link_hash_defined
4197
           || h->root.root.type == bfd_link_hash_defweak)
4198
    {
4199
      if (h->esym.asym.sc == scCommon)
4200
        h->esym.asym.sc = scBss;
4201
      else if (h->esym.asym.sc == scSCommon)
4202
        h->esym.asym.sc = scSBss;
4203
 
4204
      sec = h->root.root.u.def.section;
4205
      output_section = sec->output_section;
4206
      if (output_section != NULL)
4207
        h->esym.asym.value = (h->root.root.u.def.value
4208
                              + sec->output_offset
4209
                              + output_section->vma);
4210
      else
4211
        h->esym.asym.value = 0;
4212
    }
4213
  else if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
4214
    {
4215
      /* Set type and value for a symbol with a function stub.  */
4216
      h->esym.asym.st = stProc;
4217
      sec = h->root.root.u.def.section;
4218
      if (sec == NULL)
4219
        h->esym.asym.value = 0;
4220
      else
4221
        {
4222
          output_section = sec->output_section;
4223
          if (output_section != NULL)
4224
            h->esym.asym.value = (h->root.plt.offset
4225
                                  + sec->output_offset
4226
                                  + output_section->vma);
4227
          else
4228
            h->esym.asym.value = 0;
4229
        }
4230
#if 0 /* FIXME?  */
4231
      h->esym.ifd = 0;
4232
#endif
4233
    }
4234
 
4235
  if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
4236
                                      h->root.root.root.string,
4237
                                      &h->esym))
4238
    {
4239
      einfo->failed = true;
4240
      return false;
4241
    }
4242
 
4243
  return true;
4244
}
4245
 
4246
/* Create a runtime procedure table from the .mdebug section.  */
4247
 
4248
static boolean
4249
mips_elf_create_procedure_table (handle, abfd, info, s, debug)
4250
     PTR handle;
4251
     bfd *abfd;
4252
     struct bfd_link_info *info;
4253
     asection *s;
4254
     struct ecoff_debug_info *debug;
4255
{
4256
  const struct ecoff_debug_swap *swap;
4257
  HDRR *hdr = &debug->symbolic_header;
4258
  RPDR *rpdr, *rp;
4259
  struct rpdr_ext *erp;
4260
  PTR rtproc;
4261
  struct pdr_ext *epdr;
4262
  struct sym_ext *esym;
4263
  char *ss, **sv;
4264
  char *str;
4265
  unsigned long size, count;
4266
  unsigned long sindex;
4267
  unsigned long i;
4268
  PDR pdr;
4269
  SYMR sym;
4270
  const char *no_name_func = _("static procedure (no name)");
4271
 
4272
  epdr = NULL;
4273
  rpdr = NULL;
4274
  esym = NULL;
4275
  ss = NULL;
4276
  sv = NULL;
4277
 
4278
  swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
4279
 
4280
  sindex = strlen (no_name_func) + 1;
4281
  count = hdr->ipdMax;
4282
  if (count > 0)
4283
    {
4284
      size = swap->external_pdr_size;
4285
 
4286
      epdr = (struct pdr_ext *) bfd_malloc (size * count);
4287
      if (epdr == NULL)
4288
        goto error_return;
4289
 
4290
      if (! _bfd_ecoff_get_accumulated_pdr (handle, (PTR) epdr))
4291
        goto error_return;
4292
 
4293
      size = sizeof (RPDR);
4294
      rp = rpdr = (RPDR *) bfd_malloc (size * count);
4295
      if (rpdr == NULL)
4296
        goto error_return;
4297
 
4298
      sv = (char **) bfd_malloc (sizeof (char *) * count);
4299
      if (sv == NULL)
4300
        goto error_return;
4301
 
4302
      count = hdr->isymMax;
4303
      size = swap->external_sym_size;
4304
      esym = (struct sym_ext *) bfd_malloc (size * count);
4305
      if (esym == NULL)
4306
        goto error_return;
4307
 
4308
      if (! _bfd_ecoff_get_accumulated_sym (handle, (PTR) esym))
4309
        goto error_return;
4310
 
4311
      count = hdr->issMax;
4312
      ss = (char *) bfd_malloc (count);
4313
      if (ss == NULL)
4314
        goto error_return;
4315
      if (! _bfd_ecoff_get_accumulated_ss (handle, (PTR) ss))
4316
        goto error_return;
4317
 
4318
      count = hdr->ipdMax;
4319
      for (i = 0; i < count; i++, rp++)
4320
        {
4321
          (*swap->swap_pdr_in) (abfd, (PTR) (epdr + i), &pdr);
4322
          (*swap->swap_sym_in) (abfd, (PTR) &esym[pdr.isym], &sym);
4323
          rp->adr = sym.value;
4324
          rp->regmask = pdr.regmask;
4325
          rp->regoffset = pdr.regoffset;
4326
          rp->fregmask = pdr.fregmask;
4327
          rp->fregoffset = pdr.fregoffset;
4328
          rp->frameoffset = pdr.frameoffset;
4329
          rp->framereg = pdr.framereg;
4330
          rp->pcreg = pdr.pcreg;
4331
          rp->irpss = sindex;
4332
          sv[i] = ss + sym.iss;
4333
          sindex += strlen (sv[i]) + 1;
4334
        }
4335
    }
4336
 
4337
  size = sizeof (struct rpdr_ext) * (count + 2) + sindex;
4338
  size = BFD_ALIGN (size, 16);
4339
  rtproc = (PTR) bfd_alloc (abfd, size);
4340
  if (rtproc == NULL)
4341
    {
4342
      mips_elf_hash_table (info)->procedure_count = 0;
4343
      goto error_return;
4344
    }
4345
 
4346
  mips_elf_hash_table (info)->procedure_count = count + 2;
4347
 
4348
  erp = (struct rpdr_ext *) rtproc;
4349
  memset (erp, 0, sizeof (struct rpdr_ext));
4350
  erp++;
4351
  str = (char *) rtproc + sizeof (struct rpdr_ext) * (count + 2);
4352
  strcpy (str, no_name_func);
4353
  str += strlen (no_name_func) + 1;
4354
  for (i = 0; i < count; i++)
4355
    {
4356
      ecoff_swap_rpdr_out (abfd, rpdr + i, erp + i);
4357
      strcpy (str, sv[i]);
4358
      str += strlen (sv[i]) + 1;
4359
    }
4360
  ecoff_put_off (abfd, (bfd_vma) -1, (bfd_byte *) (erp + count)->p_adr);
4361
 
4362
  /* Set the size and contents of .rtproc section.  */
4363
  s->_raw_size = size;
4364
  s->contents = (bfd_byte *) rtproc;
4365
 
4366
  /* Skip this section later on (I don't think this currently
4367
     matters, but someday it might).  */
4368
  s->link_order_head = (struct bfd_link_order *) NULL;
4369
 
4370
  if (epdr != NULL)
4371
    free (epdr);
4372
  if (rpdr != NULL)
4373
    free (rpdr);
4374
  if (esym != NULL)
4375
    free (esym);
4376
  if (ss != NULL)
4377
    free (ss);
4378
  if (sv != NULL)
4379
    free (sv);
4380
 
4381
  return true;
4382
 
4383
 error_return:
4384
  if (epdr != NULL)
4385
    free (epdr);
4386
  if (rpdr != NULL)
4387
    free (rpdr);
4388
  if (esym != NULL)
4389
    free (esym);
4390
  if (ss != NULL)
4391
    free (ss);
4392
  if (sv != NULL)
4393
    free (sv);
4394
  return false;
4395
}
4396
 
4397
/* A comparison routine used to sort .gptab entries.  */
4398
 
4399
static int
4400
gptab_compare (p1, p2)
4401
     const PTR p1;
4402
     const PTR p2;
4403
{
4404
  const Elf32_gptab *a1 = (const Elf32_gptab *) p1;
4405
  const Elf32_gptab *a2 = (const Elf32_gptab *) p2;
4406
 
4407
  return a1->gt_entry.gt_g_value - a2->gt_entry.gt_g_value;
4408
}
4409
 
4410
/* We need to use a special link routine to handle the .reginfo and
4411
   the .mdebug sections.  We need to merge all instances of these
4412
   sections together, not write them all out sequentially.  */
4413
 
4414
boolean
4415
_bfd_mips_elf_final_link (abfd, info)
4416
     bfd *abfd;
4417
     struct bfd_link_info *info;
4418
{
4419
  asection **secpp;
4420
  asection *o;
4421
  struct bfd_link_order *p;
4422
  asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
4423
  asection *rtproc_sec;
4424
  Elf32_RegInfo reginfo;
4425
  struct ecoff_debug_info debug;
4426
  const struct ecoff_debug_swap *swap
4427
    = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
4428
  HDRR *symhdr = &debug.symbolic_header;
4429
  PTR mdebug_handle = NULL;
4430
 
4431
  /* If all the things we linked together were PIC, but we're
4432
     producing an executable (rather than a shared object), then the
4433
     resulting file is CPIC (i.e., it calls PIC code.)  */
4434
  if (!info->shared
4435
      && !info->relocateable
4436
      && elf_elfheader (abfd)->e_flags & EF_MIPS_PIC)
4437
    {
4438
      elf_elfheader (abfd)->e_flags &= ~EF_MIPS_PIC;
4439
      elf_elfheader (abfd)->e_flags |= EF_MIPS_CPIC;
4440
    }
4441
 
4442
  /* We'd carefully arranged the dynamic symbol indices, and then the
4443
     generic size_dynamic_sections renumbered them out from under us.
4444
     Rather than trying somehow to prevent the renumbering, just do
4445
     the sort again.  */
4446
  if (elf_hash_table (info)->dynamic_sections_created)
4447
    {
4448
      bfd *dynobj;
4449
      asection *got;
4450
      struct mips_got_info *g;
4451
 
4452
      /* When we resort, we must tell mips_elf_sort_hash_table what
4453
         the lowest index it may use is.  That's the number of section
4454
         symbols we're going to add.  The generic ELF linker only
4455
         adds these symbols when building a shared object.  Note that
4456
         we count the sections after (possibly) removing the .options
4457
         section above.  */
4458
      if (!mips_elf_sort_hash_table (info, (info->shared
4459
                                            ? bfd_count_sections (abfd) + 1
4460
                                            : 1)))
4461
        return false;
4462
 
4463
      /* Make sure we didn't grow the global .got region.  */
4464
      dynobj = elf_hash_table (info)->dynobj;
4465
      got = bfd_get_section_by_name (dynobj, ".got");
4466
      g = (struct mips_got_info *) elf_section_data (got)->tdata;
4467
 
4468
      if (g->global_gotsym != NULL)
4469
        BFD_ASSERT ((elf_hash_table (info)->dynsymcount
4470
                     - g->global_gotsym->dynindx)
4471
                    <= g->global_gotno);
4472
    }
4473
 
4474
  /* On IRIX5, we omit the .options section.  On IRIX6, however, we
4475
     include it, even though we don't process it quite right.  (Some
4476
     entries are supposed to be merged.)  Empirically, we seem to be
4477
     better off including it then not.  */
4478
  if (IRIX_COMPAT (abfd) == ict_irix5)
4479
    for (secpp = &abfd->sections; *secpp != NULL; secpp = &(*secpp)->next)
4480
      {
4481
        if (strcmp ((*secpp)->name, MIPS_ELF_OPTIONS_SECTION_NAME (abfd)) == 0)
4482
          {
4483
            for (p = (*secpp)->link_order_head; p != NULL; p = p->next)
4484
              if (p->type == bfd_indirect_link_order)
4485
                p->u.indirect.section->flags &=~ SEC_HAS_CONTENTS;
4486
            (*secpp)->link_order_head = NULL;
4487
            *secpp = (*secpp)->next;
4488
            --abfd->section_count;
4489
 
4490
            break;
4491
          }
4492
      }
4493
 
4494
  /* Get a value for the GP register.  */
4495
  if (elf_gp (abfd) == 0)
4496
    {
4497
      struct bfd_link_hash_entry *h;
4498
 
4499
      h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
4500
      if (h != (struct bfd_link_hash_entry *) NULL
4501
          && h->type == bfd_link_hash_defined)
4502
        elf_gp (abfd) = (h->u.def.value
4503
                         + h->u.def.section->output_section->vma
4504
                         + h->u.def.section->output_offset);
4505
      else if (info->relocateable)
4506
        {
4507
          bfd_vma lo;
4508
 
4509
          /* Find the GP-relative section with the lowest offset.  */
4510
          lo = (bfd_vma) -1;
4511
          for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4512
            if (o->vma < lo
4513
                && (elf_section_data (o)->this_hdr.sh_flags & SHF_MIPS_GPREL))
4514
              lo = o->vma;
4515
 
4516
          /* And calculate GP relative to that.  */
4517
          elf_gp (abfd) = lo + ELF_MIPS_GP_OFFSET (abfd);
4518
        }
4519
      else
4520
        {
4521
          /* If the relocate_section function needs to do a reloc
4522
             involving the GP value, it should make a reloc_dangerous
4523
             callback to warn that GP is not defined.  */
4524
        }
4525
    }
4526
 
4527
  /* Go through the sections and collect the .reginfo and .mdebug
4528
     information.  */
4529
  reginfo_sec = NULL;
4530
  mdebug_sec = NULL;
4531
  gptab_data_sec = NULL;
4532
  gptab_bss_sec = NULL;
4533
  for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4534
    {
4535
      if (strcmp (o->name, ".reginfo") == 0)
4536
        {
4537
          memset (&reginfo, 0, sizeof reginfo);
4538
 
4539
          /* We have found the .reginfo section in the output file.
4540
             Look through all the link_orders comprising it and merge
4541
             the information together.  */
4542
          for (p = o->link_order_head;
4543
               p != (struct bfd_link_order *) NULL;
4544
               p = p->next)
4545
            {
4546
              asection *input_section;
4547
              bfd *input_bfd;
4548
              Elf32_External_RegInfo ext;
4549
              Elf32_RegInfo sub;
4550
 
4551
              if (p->type != bfd_indirect_link_order)
4552
                {
4553
                  if (p->type == bfd_fill_link_order)
4554
                    continue;
4555
                  abort ();
4556
                }
4557
 
4558
              input_section = p->u.indirect.section;
4559
              input_bfd = input_section->owner;
4560
 
4561
              /* The linker emulation code has probably clobbered the
4562
                 size to be zero bytes.  */
4563
              if (input_section->_raw_size == 0)
4564
                input_section->_raw_size = sizeof (Elf32_External_RegInfo);
4565
 
4566
              if (! bfd_get_section_contents (input_bfd, input_section,
4567
                                              (PTR) &ext,
4568
                                              (file_ptr) 0,
4569
                                              sizeof ext))
4570
                return false;
4571
 
4572
              bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub);
4573
 
4574
              reginfo.ri_gprmask |= sub.ri_gprmask;
4575
              reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
4576
              reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
4577
              reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
4578
              reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
4579
 
4580
              /* ri_gp_value is set by the function
4581
                 mips_elf32_section_processing when the section is
4582
                 finally written out.  */
4583
 
4584
              /* Hack: reset the SEC_HAS_CONTENTS flag so that
4585
                 elf_link_input_bfd ignores this section.  */
4586
              input_section->flags &=~ SEC_HAS_CONTENTS;
4587
            }
4588
 
4589
          /* Size has been set in mips_elf_always_size_sections  */
4590
          BFD_ASSERT(o->_raw_size == sizeof (Elf32_External_RegInfo));
4591
 
4592
          /* Skip this section later on (I don't think this currently
4593
             matters, but someday it might).  */
4594
          o->link_order_head = (struct bfd_link_order *) NULL;
4595
 
4596
          reginfo_sec = o;
4597
        }
4598
 
4599
      if (strcmp (o->name, ".mdebug") == 0)
4600
        {
4601
          struct extsym_info einfo;
4602
 
4603
          /* We have found the .mdebug section in the output file.
4604
             Look through all the link_orders comprising it and merge
4605
             the information together.  */
4606
          symhdr->magic = swap->sym_magic;
4607
          /* FIXME: What should the version stamp be?  */
4608
          symhdr->vstamp = 0;
4609
          symhdr->ilineMax = 0;
4610
          symhdr->cbLine = 0;
4611
          symhdr->idnMax = 0;
4612
          symhdr->ipdMax = 0;
4613
          symhdr->isymMax = 0;
4614
          symhdr->ioptMax = 0;
4615
          symhdr->iauxMax = 0;
4616
          symhdr->issMax = 0;
4617
          symhdr->issExtMax = 0;
4618
          symhdr->ifdMax = 0;
4619
          symhdr->crfd = 0;
4620
          symhdr->iextMax = 0;
4621
 
4622
          /* We accumulate the debugging information itself in the
4623
             debug_info structure.  */
4624
          debug.line = NULL;
4625
          debug.external_dnr = NULL;
4626
          debug.external_pdr = NULL;
4627
          debug.external_sym = NULL;
4628
          debug.external_opt = NULL;
4629
          debug.external_aux = NULL;
4630
          debug.ss = NULL;
4631
          debug.ssext = debug.ssext_end = NULL;
4632
          debug.external_fdr = NULL;
4633
          debug.external_rfd = NULL;
4634
          debug.external_ext = debug.external_ext_end = NULL;
4635
 
4636
          mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
4637
          if (mdebug_handle == (PTR) NULL)
4638
            return false;
4639
 
4640
          if (SGI_COMPAT (abfd))
4641
            {
4642
              asection *s;
4643
              EXTR esym;
4644
              bfd_vma last;
4645
              unsigned int i;
4646
              static const char * const name[] =
4647
                { ".text", ".init", ".fini", ".data",
4648
                    ".rodata", ".sdata", ".sbss", ".bss" };
4649
              static const int sc[] = { scText, scInit, scFini, scData,
4650
                                          scRData, scSData, scSBss, scBss };
4651
 
4652
              esym.jmptbl = 0;
4653
              esym.cobol_main = 0;
4654
              esym.weakext = 0;
4655
              esym.reserved = 0;
4656
              esym.ifd = ifdNil;
4657
              esym.asym.iss = issNil;
4658
              esym.asym.st = stLocal;
4659
              esym.asym.reserved = 0;
4660
              esym.asym.index = indexNil;
4661
              last = 0;
4662
              for (i = 0; i < 8; i++)
4663
                {
4664
                  esym.asym.sc = sc[i];
4665
                  s = bfd_get_section_by_name (abfd, name[i]);
4666
                  if (s != NULL)
4667
                    {
4668
                      esym.asym.value = s->vma;
4669
                      last = s->vma + s->_raw_size;
4670
                    }
4671
                  else
4672
                    esym.asym.value = last;
4673
 
4674
                  if (! bfd_ecoff_debug_one_external (abfd, &debug, swap,
4675
                                                      name[i], &esym))
4676
                    return false;
4677
                }
4678
            }
4679
 
4680
          for (p = o->link_order_head;
4681
               p != (struct bfd_link_order *) NULL;
4682
               p = p->next)
4683
            {
4684
              asection *input_section;
4685
              bfd *input_bfd;
4686
              const struct ecoff_debug_swap *input_swap;
4687
              struct ecoff_debug_info input_debug;
4688
              char *eraw_src;
4689
              char *eraw_end;
4690
 
4691
              if (p->type != bfd_indirect_link_order)
4692
                {
4693
                  if (p->type == bfd_fill_link_order)
4694
                    continue;
4695
                  abort ();
4696
                }
4697
 
4698
              input_section = p->u.indirect.section;
4699
              input_bfd = input_section->owner;
4700
 
4701
              if (bfd_get_flavour (input_bfd) != bfd_target_elf_flavour
4702
                  || (get_elf_backend_data (input_bfd)
4703
                      ->elf_backend_ecoff_debug_swap) == NULL)
4704
                {
4705
                  /* I don't know what a non MIPS ELF bfd would be
4706
                     doing with a .mdebug section, but I don't really
4707
                     want to deal with it.  */
4708
                  continue;
4709
                }
4710
 
4711
              input_swap = (get_elf_backend_data (input_bfd)
4712
                            ->elf_backend_ecoff_debug_swap);
4713
 
4714
              BFD_ASSERT (p->size == input_section->_raw_size);
4715
 
4716
              /* The ECOFF linking code expects that we have already
4717
                 read in the debugging information and set up an
4718
                 ecoff_debug_info structure, so we do that now.  */
4719
              if (! _bfd_mips_elf_read_ecoff_info (input_bfd, input_section,
4720
                                                   &input_debug))
4721
                return false;
4722
 
4723
              if (! (bfd_ecoff_debug_accumulate
4724
                     (mdebug_handle, abfd, &debug, swap, input_bfd,
4725
                      &input_debug, input_swap, info)))
4726
                return false;
4727
 
4728
              /* Loop through the external symbols.  For each one with
4729
                 interesting information, try to find the symbol in
4730
                 the linker global hash table and save the information
4731
                 for the output external symbols.  */
4732
              eraw_src = input_debug.external_ext;
4733
              eraw_end = (eraw_src
4734
                          + (input_debug.symbolic_header.iextMax
4735
                             * input_swap->external_ext_size));
4736
              for (;
4737
                   eraw_src < eraw_end;
4738
                   eraw_src += input_swap->external_ext_size)
4739
                {
4740
                  EXTR ext;
4741
                  const char *name;
4742
                  struct mips_elf_link_hash_entry *h;
4743
 
4744
                  (*input_swap->swap_ext_in) (input_bfd, (PTR) eraw_src, &ext);
4745
                  if (ext.asym.sc == scNil
4746
                      || ext.asym.sc == scUndefined
4747
                      || ext.asym.sc == scSUndefined)
4748
                    continue;
4749
 
4750
                  name = input_debug.ssext + ext.asym.iss;
4751
                  h = mips_elf_link_hash_lookup (mips_elf_hash_table (info),
4752
                                                 name, false, false, true);
4753
                  if (h == NULL || h->esym.ifd != -2)
4754
                    continue;
4755
 
4756
                  if (ext.ifd != -1)
4757
                    {
4758
                      BFD_ASSERT (ext.ifd
4759
                                  < input_debug.symbolic_header.ifdMax);
4760
                      ext.ifd = input_debug.ifdmap[ext.ifd];
4761
                    }
4762
 
4763
                  h->esym = ext;
4764
                }
4765
 
4766
              /* Free up the information we just read.  */
4767
              free (input_debug.line);
4768
              free (input_debug.external_dnr);
4769
              free (input_debug.external_pdr);
4770
              free (input_debug.external_sym);
4771
              free (input_debug.external_opt);
4772
              free (input_debug.external_aux);
4773
              free (input_debug.ss);
4774
              free (input_debug.ssext);
4775
              free (input_debug.external_fdr);
4776
              free (input_debug.external_rfd);
4777
              free (input_debug.external_ext);
4778
 
4779
              /* Hack: reset the SEC_HAS_CONTENTS flag so that
4780
                 elf_link_input_bfd ignores this section.  */
4781
              input_section->flags &=~ SEC_HAS_CONTENTS;
4782
            }
4783
 
4784
          if (SGI_COMPAT (abfd) && info->shared)
4785
            {
4786
              /* Create .rtproc section.  */
4787
              rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
4788
              if (rtproc_sec == NULL)
4789
                {
4790
                  flagword flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
4791
                                    | SEC_LINKER_CREATED | SEC_READONLY);
4792
 
4793
                  rtproc_sec = bfd_make_section (abfd, ".rtproc");
4794
                  if (rtproc_sec == NULL
4795
                      || ! bfd_set_section_flags (abfd, rtproc_sec, flags)
4796
                      || ! bfd_set_section_alignment (abfd, rtproc_sec, 4))
4797
                    return false;
4798
                }
4799
 
4800
              if (! mips_elf_create_procedure_table (mdebug_handle, abfd,
4801
                                                     info, rtproc_sec, &debug))
4802
                return false;
4803
            }
4804
 
4805
          /* Build the external symbol information.  */
4806
          einfo.abfd = abfd;
4807
          einfo.info = info;
4808
          einfo.debug = &debug;
4809
          einfo.swap = swap;
4810
          einfo.failed = false;
4811
          mips_elf_link_hash_traverse (mips_elf_hash_table (info),
4812
                                       mips_elf_output_extsym,
4813
                                       (PTR) &einfo);
4814
          if (einfo.failed)
4815
            return false;
4816
 
4817
          /* Set the size of the .mdebug section.  */
4818
          o->_raw_size = bfd_ecoff_debug_size (abfd, &debug, swap);
4819
 
4820
          /* Skip this section later on (I don't think this currently
4821
             matters, but someday it might).  */
4822
          o->link_order_head = (struct bfd_link_order *) NULL;
4823
 
4824
          mdebug_sec = o;
4825
        }
4826
 
4827
      if (strncmp (o->name, ".gptab.", sizeof ".gptab." - 1) == 0)
4828
        {
4829
          const char *subname;
4830
          unsigned int c;
4831
          Elf32_gptab *tab;
4832
          Elf32_External_gptab *ext_tab;
4833
          unsigned int i;
4834
 
4835
          /* The .gptab.sdata and .gptab.sbss sections hold
4836
             information describing how the small data area would
4837
             change depending upon the -G switch.  These sections
4838
             not used in executables files.  */
4839
          if (! info->relocateable)
4840
            {
4841
              asection **secpp;
4842
 
4843
              for (p = o->link_order_head;
4844
                   p != (struct bfd_link_order *) NULL;
4845
                   p = p->next)
4846
                {
4847
                  asection *input_section;
4848
 
4849
                  if (p->type != bfd_indirect_link_order)
4850
                    {
4851
                      if (p->type == bfd_fill_link_order)
4852
                        continue;
4853
                      abort ();
4854
                    }
4855
 
4856
                  input_section = p->u.indirect.section;
4857
 
4858
                  /* Hack: reset the SEC_HAS_CONTENTS flag so that
4859
                     elf_link_input_bfd ignores this section.  */
4860
                  input_section->flags &=~ SEC_HAS_CONTENTS;
4861
                }
4862
 
4863
              /* Skip this section later on (I don't think this
4864
                 currently matters, but someday it might).  */
4865
              o->link_order_head = (struct bfd_link_order *) NULL;
4866
 
4867
              /* Really remove the section.  */
4868
              for (secpp = &abfd->sections;
4869
                   *secpp != o;
4870
                   secpp = &(*secpp)->next)
4871
                ;
4872
              *secpp = (*secpp)->next;
4873
              --abfd->section_count;
4874
 
4875
              continue;
4876
            }
4877
 
4878
          /* There is one gptab for initialized data, and one for
4879
             uninitialized data.  */
4880
          if (strcmp (o->name, ".gptab.sdata") == 0)
4881
            gptab_data_sec = o;
4882
          else if (strcmp (o->name, ".gptab.sbss") == 0)
4883
            gptab_bss_sec = o;
4884
          else
4885
            {
4886
              (*_bfd_error_handler)
4887
                (_("%s: illegal section name `%s'"),
4888
                 bfd_get_filename (abfd), o->name);
4889
              bfd_set_error (bfd_error_nonrepresentable_section);
4890
              return false;
4891
            }
4892
 
4893
          /* The linker script always combines .gptab.data and
4894
             .gptab.sdata into .gptab.sdata, and likewise for
4895
             .gptab.bss and .gptab.sbss.  It is possible that there is
4896
             no .sdata or .sbss section in the output file, in which
4897
             case we must change the name of the output section.  */
4898
          subname = o->name + sizeof ".gptab" - 1;
4899
          if (bfd_get_section_by_name (abfd, subname) == NULL)
4900
            {
4901
              if (o == gptab_data_sec)
4902
                o->name = ".gptab.data";
4903
              else
4904
                o->name = ".gptab.bss";
4905
              subname = o->name + sizeof ".gptab" - 1;
4906
              BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
4907
            }
4908
 
4909
          /* Set up the first entry.  */
4910
          c = 1;
4911
          tab = (Elf32_gptab *) bfd_malloc (c * sizeof (Elf32_gptab));
4912
          if (tab == NULL)
4913
            return false;
4914
          tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
4915
          tab[0].gt_header.gt_unused = 0;
4916
 
4917
          /* Combine the input sections.  */
4918
          for (p = o->link_order_head;
4919
               p != (struct bfd_link_order *) NULL;
4920
               p = p->next)
4921
            {
4922
              asection *input_section;
4923
              bfd *input_bfd;
4924
              bfd_size_type size;
4925
              unsigned long last;
4926
              bfd_size_type gpentry;
4927
 
4928
              if (p->type != bfd_indirect_link_order)
4929
                {
4930
                  if (p->type == bfd_fill_link_order)
4931
                    continue;
4932
                  abort ();
4933
                }
4934
 
4935
              input_section = p->u.indirect.section;
4936
              input_bfd = input_section->owner;
4937
 
4938
              /* Combine the gptab entries for this input section one
4939
                 by one.  We know that the input gptab entries are
4940
                 sorted by ascending -G value.  */
4941
              size = bfd_section_size (input_bfd, input_section);
4942
              last = 0;
4943
              for (gpentry = sizeof (Elf32_External_gptab);
4944
                   gpentry < size;
4945
                   gpentry += sizeof (Elf32_External_gptab))
4946
                {
4947
                  Elf32_External_gptab ext_gptab;
4948
                  Elf32_gptab int_gptab;
4949
                  unsigned long val;
4950
                  unsigned long add;
4951
                  boolean exact;
4952
                  unsigned int look;
4953
 
4954
                  if (! (bfd_get_section_contents
4955
                         (input_bfd, input_section, (PTR) &ext_gptab,
4956
                          gpentry, sizeof (Elf32_External_gptab))))
4957
                    {
4958
                      free (tab);
4959
                      return false;
4960
                    }
4961
 
4962
                  bfd_mips_elf32_swap_gptab_in (input_bfd, &ext_gptab,
4963
                                                &int_gptab);
4964
                  val = int_gptab.gt_entry.gt_g_value;
4965
                  add = int_gptab.gt_entry.gt_bytes - last;
4966
 
4967
                  exact = false;
4968
                  for (look = 1; look < c; look++)
4969
                    {
4970
                      if (tab[look].gt_entry.gt_g_value >= val)
4971
                        tab[look].gt_entry.gt_bytes += add;
4972
 
4973
                      if (tab[look].gt_entry.gt_g_value == val)
4974
                        exact = true;
4975
                    }
4976
 
4977
                  if (! exact)
4978
                    {
4979
                      Elf32_gptab *new_tab;
4980
                      unsigned int max;
4981
 
4982
                      /* We need a new table entry.  */
4983
                      new_tab = ((Elf32_gptab *)
4984
                                 bfd_realloc ((PTR) tab,
4985
                                              (c + 1) * sizeof (Elf32_gptab)));
4986
                      if (new_tab == NULL)
4987
                        {
4988
                          free (tab);
4989
                          return false;
4990
                        }
4991
                      tab = new_tab;
4992
                      tab[c].gt_entry.gt_g_value = val;
4993
                      tab[c].gt_entry.gt_bytes = add;
4994
 
4995
                      /* Merge in the size for the next smallest -G
4996
                         value, since that will be implied by this new
4997
                         value.  */
4998
                      max = 0;
4999
                      for (look = 1; look < c; look++)
5000
                        {
5001
                          if (tab[look].gt_entry.gt_g_value < val
5002
                              && (max == 0
5003
                                  || (tab[look].gt_entry.gt_g_value
5004
                                      > tab[max].gt_entry.gt_g_value)))
5005
                            max = look;
5006
                        }
5007
                      if (max != 0)
5008
                        tab[c].gt_entry.gt_bytes +=
5009
                          tab[max].gt_entry.gt_bytes;
5010
 
5011
                      ++c;
5012
                    }
5013
 
5014
                  last = int_gptab.gt_entry.gt_bytes;
5015
                }
5016
 
5017
              /* Hack: reset the SEC_HAS_CONTENTS flag so that
5018
                 elf_link_input_bfd ignores this section.  */
5019
              input_section->flags &=~ SEC_HAS_CONTENTS;
5020
            }
5021
 
5022
          /* The table must be sorted by -G value.  */
5023
          if (c > 2)
5024
            qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
5025
 
5026
          /* Swap out the table.  */
5027
          ext_tab = ((Elf32_External_gptab *)
5028
                     bfd_alloc (abfd, c * sizeof (Elf32_External_gptab)));
5029
          if (ext_tab == NULL)
5030
            {
5031
              free (tab);
5032
              return false;
5033
            }
5034
 
5035
          for (i = 0; i < c; i++)
5036
            bfd_mips_elf32_swap_gptab_out (abfd, tab + i, ext_tab + i);
5037
          free (tab);
5038
 
5039
          o->_raw_size = c * sizeof (Elf32_External_gptab);
5040
          o->contents = (bfd_byte *) ext_tab;
5041
 
5042
          /* Skip this section later on (I don't think this currently
5043
             matters, but someday it might).  */
5044
          o->link_order_head = (struct bfd_link_order *) NULL;
5045
        }
5046
    }
5047
 
5048
  /* Invoke the regular ELF backend linker to do all the work.  */
5049
  if (ABI_64_P (abfd))
5050
    {
5051
#ifdef BFD64
5052
      if (!bfd_elf64_bfd_final_link (abfd, info))
5053
        return false;
5054
#else
5055
      abort ();
5056
      return false;
5057
#endif /* BFD64 */
5058
    }
5059
  else if (!bfd_elf32_bfd_final_link (abfd, info))
5060
    return false;
5061
 
5062
  /* Now write out the computed sections.  */
5063
 
5064
  if (reginfo_sec != (asection *) NULL)
5065
    {
5066
      Elf32_External_RegInfo ext;
5067
 
5068
      bfd_mips_elf32_swap_reginfo_out (abfd, &reginfo, &ext);
5069
      if (! bfd_set_section_contents (abfd, reginfo_sec, (PTR) &ext,
5070
                                      (file_ptr) 0, sizeof ext))
5071
        return false;
5072
    }
5073
 
5074
  if (mdebug_sec != (asection *) NULL)
5075
    {
5076
      BFD_ASSERT (abfd->output_has_begun);
5077
      if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
5078
                                               swap, info,
5079
                                               mdebug_sec->filepos))
5080
        return false;
5081
 
5082
      bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
5083
    }
5084
 
5085
  if (gptab_data_sec != (asection *) NULL)
5086
    {
5087
      if (! bfd_set_section_contents (abfd, gptab_data_sec,
5088
                                      gptab_data_sec->contents,
5089
                                      (file_ptr) 0,
5090
                                      gptab_data_sec->_raw_size))
5091
        return false;
5092
    }
5093
 
5094
  if (gptab_bss_sec != (asection *) NULL)
5095
    {
5096
      if (! bfd_set_section_contents (abfd, gptab_bss_sec,
5097
                                      gptab_bss_sec->contents,
5098
                                      (file_ptr) 0,
5099
                                      gptab_bss_sec->_raw_size))
5100
        return false;
5101
    }
5102
 
5103
  if (SGI_COMPAT (abfd))
5104
    {
5105
      rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
5106
      if (rtproc_sec != NULL)
5107
        {
5108
          if (! bfd_set_section_contents (abfd, rtproc_sec,
5109
                                          rtproc_sec->contents,
5110
                                          (file_ptr) 0,
5111
                                          rtproc_sec->_raw_size))
5112
            return false;
5113
        }
5114
    }
5115
 
5116
  return true;
5117
}
5118
 
5119
/* Returns the GOT section for ABFD.  */
5120
 
5121
static asection *
5122
mips_elf_got_section (abfd)
5123
     bfd *abfd;
5124
{
5125
  return bfd_get_section_by_name (abfd, ".got");
5126
}
5127
 
5128
/* Returns the GOT information associated with the link indicated by
5129
   INFO.  If SGOTP is non-NULL, it is filled in with the GOT
5130
   section.  */
5131
 
5132
static struct mips_got_info *
5133
mips_elf_got_info (abfd, sgotp)
5134
     bfd *abfd;
5135
     asection **sgotp;
5136
{
5137
  asection *sgot;
5138
  struct mips_got_info *g;
5139
 
5140
  sgot = mips_elf_got_section (abfd);
5141
  BFD_ASSERT (sgot != NULL);
5142
  BFD_ASSERT (elf_section_data (sgot) != NULL);
5143
  g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
5144
  BFD_ASSERT (g != NULL);
5145
 
5146
  if (sgotp)
5147
    *sgotp = sgot;
5148
  return g;
5149
}
5150
 
5151
/* Return whether a relocation is against a local symbol.  */
5152
 
5153
static boolean
5154
mips_elf_local_relocation_p (input_bfd, relocation, local_sections)
5155
     bfd *input_bfd;
5156
     const Elf_Internal_Rela *relocation;
5157
     asection **local_sections;
5158
{
5159
  unsigned long r_symndx;
5160
  Elf_Internal_Shdr *symtab_hdr;
5161
 
5162
  r_symndx = ELF32_R_SYM (relocation->r_info);
5163
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5164
  if (! elf_bad_symtab (input_bfd))
5165
    return r_symndx < symtab_hdr->sh_info;
5166
  else
5167
    {
5168
      /* The symbol table does not follow the rule that local symbols
5169
         must come before globals.  */
5170
      return local_sections[r_symndx] != NULL;
5171
    }
5172
}
5173
 
5174
/* Sign-extend VALUE, which has the indicated number of BITS.  */
5175
 
5176
static bfd_vma
5177
mips_elf_sign_extend (value, bits)
5178
     bfd_vma value;
5179
     int bits;
5180
{
5181
  if (value & ((bfd_vma)1 << (bits - 1)))
5182
    /* VALUE is negative.  */
5183
    value |= ((bfd_vma) - 1) << bits;
5184
 
5185
  return value;
5186
}
5187
 
5188
/* Return non-zero if the indicated VALUE has overflowed the maximum
5189
   range expressable by a signed number with the indicated number of
5190
   BITS.  */
5191
 
5192
static boolean
5193
mips_elf_overflow_p (value, bits)
5194
     bfd_vma value;
5195
     int bits;
5196
{
5197
  bfd_signed_vma svalue = (bfd_signed_vma) value;
5198
 
5199
  if (svalue > (1 << (bits - 1)) - 1)
5200
    /* The value is too big.  */
5201
    return true;
5202
  else if (svalue < -(1 << (bits - 1)))
5203
    /* The value is too small.  */
5204
    return true;
5205
 
5206
  /* All is well.  */
5207
  return false;
5208
}
5209
 
5210
/* Calculate the %high function.  */
5211
 
5212
static bfd_vma
5213
mips_elf_high (value)
5214
     bfd_vma value;
5215
{
5216
  return ((value + (bfd_vma) 0x8000) >> 16) & 0xffff;
5217
}
5218
 
5219
/* Calculate the %higher function.  */
5220
 
5221
static bfd_vma
5222
mips_elf_higher (value)
5223
     bfd_vma value ATTRIBUTE_UNUSED;
5224
{
5225
#ifdef BFD64
5226
  return ((value + (bfd_vma) 0x80008000) >> 32) & 0xffff;
5227
#else
5228
  abort ();
5229
  return (bfd_vma) -1;
5230
#endif
5231
}
5232
 
5233
/* Calculate the %highest function.  */
5234
 
5235
static bfd_vma
5236
mips_elf_highest (value)
5237
     bfd_vma value ATTRIBUTE_UNUSED;
5238
{
5239
#ifdef BFD64
5240
  return ((value + (bfd_vma) 0x800080008000) >> 48) & 0xffff;
5241
#else
5242
  abort ();
5243
  return (bfd_vma) -1;
5244
#endif
5245
}
5246
 
5247
/* Returns the GOT index for the global symbol indicated by H.  */
5248
 
5249
static bfd_vma
5250
mips_elf_global_got_index (abfd, h)
5251
     bfd *abfd;
5252
     struct elf_link_hash_entry *h;
5253
{
5254
  bfd_vma index;
5255
  asection *sgot;
5256
  struct mips_got_info *g;
5257
 
5258
  g = mips_elf_got_info (abfd, &sgot);
5259
 
5260
  /* Once we determine the global GOT entry with the lowest dynamic
5261
     symbol table index, we must put all dynamic symbols with greater
5262
     indices into the GOT.  That makes it easy to calculate the GOT
5263
     offset.  */
5264
  BFD_ASSERT (h->dynindx >= g->global_gotsym->dynindx);
5265
  index = ((h->dynindx - g->global_gotsym->dynindx + g->local_gotno)
5266
           * MIPS_ELF_GOT_SIZE (abfd));
5267
  BFD_ASSERT (index < sgot->_raw_size);
5268
 
5269
  return index;
5270
}
5271
 
5272
/* Returns the offset for the entry at the INDEXth position
5273
   in the GOT.  */
5274
 
5275
static bfd_vma
5276
mips_elf_got_offset_from_index (dynobj, output_bfd, index)
5277
     bfd *dynobj;
5278
     bfd *output_bfd;
5279
     bfd_vma index;
5280
{
5281
  asection *sgot;
5282
  bfd_vma gp;
5283
 
5284
  sgot = mips_elf_got_section (dynobj);
5285
  gp = _bfd_get_gp_value (output_bfd);
5286
  return (sgot->output_section->vma + sgot->output_offset + index -
5287
          gp);
5288
}
5289
 
5290
/* If H is a symbol that needs a global GOT entry, but has a dynamic
5291
   symbol table index lower than any we've seen to date, record it for
5292
   posterity.  */
5293
 
5294
static boolean
5295
mips_elf_record_global_got_symbol (h, info, g)
5296
     struct elf_link_hash_entry *h;
5297
     struct bfd_link_info *info;
5298
     struct mips_got_info *g ATTRIBUTE_UNUSED;
5299
{
5300
  /* A global symbol in the GOT must also be in the dynamic symbol
5301
     table.  */
5302
  if (h->dynindx == -1
5303
      && !bfd_elf32_link_record_dynamic_symbol (info, h))
5304
    return false;
5305
 
5306
  /* If we've already marked this entry as need GOT space, we don't
5307
     need to do it again.  */
5308
  if (h->got.offset != (bfd_vma) - 1)
5309
    return true;
5310
 
5311
  /* By setting this to a value other than -1, we are indicating that
5312
     there needs to be a GOT entry for H.  */
5313
  h->got.offset = 0;
5314
 
5315
  return true;
5316
}
5317
 
5318
/* This structure is passed to mips_elf_sort_hash_table_f when sorting
5319
   the dynamic symbols.  */
5320
 
5321
struct mips_elf_hash_sort_data
5322
{
5323
  /* The symbol in the global GOT with the lowest dynamic symbol table
5324
     index.  */
5325
  struct elf_link_hash_entry *low;
5326
  /* The least dynamic symbol table index corresponding to a symbol
5327
     with a GOT entry.  */
5328
  long min_got_dynindx;
5329
  /* The greatest dynamic symbol table index not corresponding to a
5330
     symbol without a GOT entry.  */
5331
  long max_non_got_dynindx;
5332
};
5333
 
5334
/* If H needs a GOT entry, assign it the highest available dynamic
5335
   index.  Otherwise, assign it the lowest available dynamic
5336
   index.  */
5337
 
5338
static boolean
5339
mips_elf_sort_hash_table_f (h, data)
5340
     struct mips_elf_link_hash_entry *h;
5341
     PTR data;
5342
{
5343
  struct mips_elf_hash_sort_data *hsd
5344
    = (struct mips_elf_hash_sort_data *) data;
5345
 
5346
  /* Symbols without dynamic symbol table entries aren't interesting
5347
     at all.  */
5348
  if (h->root.dynindx == -1)
5349
    return true;
5350
 
5351
  if (h->root.got.offset != 0)
5352
    h->root.dynindx = hsd->max_non_got_dynindx++;
5353
  else
5354
    {
5355
      h->root.dynindx = --hsd->min_got_dynindx;
5356
      hsd->low = (struct elf_link_hash_entry *) h;
5357
    }
5358
 
5359
  return true;
5360
}
5361
 
5362
/* Sort the dynamic symbol table so that symbols that need GOT entries
5363
   appear towards the end.  This reduces the amount of GOT space
5364
   required.  MAX_LOCAL is used to set the number of local symbols
5365
   known to be in the dynamic symbol table.  During
5366
   mips_elf_size_dynamic_sections, this value is 1.  Afterward, the
5367
   section symbols are added and the count is higher.  */
5368
 
5369
static boolean
5370
mips_elf_sort_hash_table (info, max_local)
5371
     struct bfd_link_info *info;
5372
     unsigned long max_local;
5373
{
5374
  struct mips_elf_hash_sort_data hsd;
5375
  struct mips_got_info *g;
5376
  bfd *dynobj;
5377
 
5378
  dynobj = elf_hash_table (info)->dynobj;
5379
 
5380
  hsd.low = NULL;
5381
  hsd.min_got_dynindx = elf_hash_table (info)->dynsymcount;
5382
  hsd.max_non_got_dynindx = max_local;
5383
  mips_elf_link_hash_traverse (((struct mips_elf_link_hash_table *)
5384
                                elf_hash_table (info)),
5385
                               mips_elf_sort_hash_table_f,
5386
                               &hsd);
5387
 
5388
  /* There shoud have been enough room in the symbol table to
5389
     accomodate both the GOT and non-GOT symbols.  */
5390
  BFD_ASSERT (hsd.min_got_dynindx == hsd.max_non_got_dynindx);
5391
 
5392
  /* Now we know which dynamic symbol has the lowest dynamic symbol
5393
     table index in the GOT.  */
5394
  g = mips_elf_got_info (dynobj, NULL);
5395
  g->global_gotsym = hsd.low;
5396
 
5397
  return true;
5398
}
5399
 
5400
/* Create a local GOT entry for VALUE.  Return the index of the entry,
5401
   or -1 if it could not be created.  */
5402
 
5403
static bfd_vma
5404
mips_elf_create_local_got_entry (abfd, g, sgot, value)
5405
     bfd *abfd;
5406
     struct mips_got_info *g;
5407
     asection *sgot;
5408
     bfd_vma value;
5409
{
5410
  if (g->assigned_gotno >= g->local_gotno)
5411
    {
5412
      /* We didn't allocate enough space in the GOT.  */
5413
      (*_bfd_error_handler)
5414
        (_("not enough GOT space for local GOT entries"));
5415
      bfd_set_error (bfd_error_bad_value);
5416
      return (bfd_vma) -1;
5417
    }
5418
 
5419
  MIPS_ELF_PUT_WORD (abfd, value,
5420
                     (sgot->contents
5421
                      + MIPS_ELF_GOT_SIZE (abfd) * g->assigned_gotno));
5422
  return MIPS_ELF_GOT_SIZE (abfd) * g->assigned_gotno++;
5423
}
5424
 
5425
/* Returns the GOT offset at which the indicated address can be found.
5426
   If there is not yet a GOT entry for this value, create one.  Returns
5427
   -1 if no satisfactory GOT offset can be found.  */
5428
 
5429
static bfd_vma
5430
mips_elf_local_got_index (abfd, info, value)
5431
     bfd *abfd;
5432
     struct bfd_link_info *info;
5433
     bfd_vma value;
5434
{
5435
  asection *sgot;
5436
  struct mips_got_info *g;
5437
  bfd_byte *entry;
5438
 
5439
  g = mips_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
5440
 
5441
  /* Look to see if we already have an appropriate entry.  */
5442
  for (entry = (sgot->contents
5443
                + MIPS_ELF_GOT_SIZE (abfd) * MIPS_RESERVED_GOTNO);
5444
       entry != sgot->contents + MIPS_ELF_GOT_SIZE (abfd) * g->assigned_gotno;
5445
       entry += MIPS_ELF_GOT_SIZE (abfd))
5446
    {
5447
      bfd_vma address = MIPS_ELF_GET_WORD (abfd, entry);
5448
      if (address == value)
5449
        return entry - sgot->contents;
5450
    }
5451
 
5452
  return mips_elf_create_local_got_entry (abfd, g, sgot, value);
5453
}
5454
 
5455
/* Find a GOT entry that is within 32KB of the VALUE.  These entries
5456
   are supposed to be placed at small offsets in the GOT, i.e.,
5457
   within 32KB of GP.  Return the index into the GOT for this page,
5458
   and store the offset from this entry to the desired address in
5459
   OFFSETP, if it is non-NULL.  */
5460
 
5461
static bfd_vma
5462
mips_elf_got_page (abfd, info, value, offsetp)
5463
     bfd *abfd;
5464
     struct bfd_link_info *info;
5465
     bfd_vma value;
5466
     bfd_vma *offsetp;
5467
{
5468
  asection *sgot;
5469
  struct mips_got_info *g;
5470
  bfd_byte *entry;
5471
  bfd_byte *last_entry;
5472
  bfd_vma index = 0;
5473
  bfd_vma address;
5474
 
5475
  g = mips_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
5476
 
5477
  /* Look to see if we aleady have an appropriate entry.  */
5478
  last_entry = sgot->contents + MIPS_ELF_GOT_SIZE (abfd) * g->assigned_gotno;
5479
  for (entry = (sgot->contents
5480
                + MIPS_ELF_GOT_SIZE (abfd) * MIPS_RESERVED_GOTNO);
5481
       entry != last_entry;
5482
       entry += MIPS_ELF_GOT_SIZE (abfd))
5483
    {
5484
      address = MIPS_ELF_GET_WORD (abfd, entry);
5485
 
5486
      if (!mips_elf_overflow_p (value - address, 16))
5487
        {
5488
          /* This entry will serve as the page pointer.  We can add a
5489
             16-bit number to it to get the actual address.  */
5490
          index = entry - sgot->contents;
5491
          break;
5492
        }
5493
    }
5494
 
5495
  /* If we didn't have an appropriate entry, we create one now.  */
5496
  if (entry == last_entry)
5497
    index = mips_elf_create_local_got_entry (abfd, g, sgot, value);
5498
 
5499
  if (offsetp)
5500
    {
5501
      address = MIPS_ELF_GET_WORD (abfd, entry);
5502
      *offsetp = value - address;
5503
    }
5504
 
5505
  return index;
5506
}
5507
 
5508
/* Find a GOT entry whose higher-order 16 bits are the same as those
5509
   for value.  Return the index into the GOT for this entry.  */
5510
 
5511
static bfd_vma
5512
mips_elf_got16_entry (abfd, info, value)
5513
     bfd *abfd;
5514
     struct bfd_link_info *info;
5515
     bfd_vma value;
5516
{
5517
  asection *sgot;
5518
  struct mips_got_info *g;
5519
  bfd_byte *entry;
5520
  bfd_byte *last_entry;
5521
  bfd_vma index = 0;
5522
  bfd_vma address;
5523
 
5524
  /* Although the ABI says that it is "the high-order 16 bits" that we
5525
     want, it is really the %high value.  The complete value is
5526
     calculated with a `addiu' of a LO16 relocation, just as with a
5527
     HI16/LO16 pair.  */
5528
  value = mips_elf_high (value) << 16;
5529
  g = mips_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
5530
 
5531
  /* Look to see if we already have an appropriate entry.  */
5532
  last_entry = sgot->contents + MIPS_ELF_GOT_SIZE (abfd) * g->assigned_gotno;
5533
  for (entry = (sgot->contents
5534
                + MIPS_ELF_GOT_SIZE (abfd) * MIPS_RESERVED_GOTNO);
5535
       entry != last_entry;
5536
       entry += MIPS_ELF_GOT_SIZE (abfd))
5537
    {
5538
      address = MIPS_ELF_GET_WORD (abfd, entry);
5539
      if ((address & 0xffff0000) == value)
5540
        {
5541
          /* This entry has the right high-order 16 bits.  */
5542
          index = entry - sgot->contents;
5543
          break;
5544
        }
5545
    }
5546
 
5547
  /* If we didn't have an appropriate entry, we create one now.  */
5548
  if (entry == last_entry)
5549
    index = mips_elf_create_local_got_entry (abfd, g, sgot, value);
5550
 
5551
  return index;
5552
}
5553
 
5554
/* Returns the first relocation of type r_type found, beginning with
5555
   RELOCATION.  RELEND is one-past-the-end of the relocation table.  */
5556
 
5557
static const Elf_Internal_Rela *
5558
mips_elf_next_relocation (r_type, relocation, relend)
5559
     unsigned int r_type;
5560
     const Elf_Internal_Rela *relocation;
5561
     const Elf_Internal_Rela *relend;
5562
{
5563
  /* According to the MIPS ELF ABI, the R_MIPS_LO16 relocation must be
5564
     immediately following.  However, for the IRIX6 ABI, the next
5565
     relocation may be a composed relocation consisting of several
5566
     relocations for the same address.  In that case, the R_MIPS_LO16
5567
     relocation may occur as one of these.  We permit a similar
5568
     extension in general, as that is useful for GCC.  */
5569
  while (relocation < relend)
5570
    {
5571
      if (ELF32_R_TYPE (relocation->r_info) == r_type)
5572
        return relocation;
5573
 
5574
      ++relocation;
5575
    }
5576
 
5577
  /* We didn't find it.  */
5578
  bfd_set_error (bfd_error_bad_value);
5579
  return NULL;
5580
}
5581
 
5582
/* Create a rel.dyn relocation for the dynamic linker to resolve.  REL
5583
   is the original relocation, which is now being transformed into a
5584
   dyanmic relocation.  The ADDENDP is adjusted if necessary; the
5585
   caller should store the result in place of the original addend.  */
5586
 
5587
static boolean
5588
mips_elf_create_dynamic_relocation (output_bfd, info, rel, h, sec,
5589
                                    symbol, addendp, input_section)
5590
     bfd *output_bfd;
5591
     struct bfd_link_info *info;
5592
     const Elf_Internal_Rela *rel;
5593
     struct mips_elf_link_hash_entry *h;
5594
     asection *sec;
5595
     bfd_vma symbol;
5596
     bfd_vma *addendp;
5597
     asection *input_section;
5598
{
5599
  Elf_Internal_Rel outrel;
5600
  boolean skip;
5601
  asection *sreloc;
5602
  bfd *dynobj;
5603
  int r_type;
5604
 
5605
  r_type = ELF32_R_TYPE (rel->r_info);
5606
  dynobj = elf_hash_table (info)->dynobj;
5607
  sreloc
5608
    = bfd_get_section_by_name (dynobj,
5609
                               MIPS_ELF_REL_DYN_SECTION_NAME (output_bfd));
5610
  BFD_ASSERT (sreloc != NULL);
5611
 
5612
  skip = false;
5613
 
5614
  /* We begin by assuming that the offset for the dynamic relocation
5615
     is the same as for the original relocation.  We'll adjust this
5616
     later to reflect the correct output offsets.  */
5617
  if (elf_section_data (input_section)->stab_info == NULL)
5618
    outrel.r_offset = rel->r_offset;
5619
  else
5620
    {
5621
      /* Except that in a stab section things are more complex.
5622
         Because we compress stab information, the offset given in the
5623
         relocation may not be the one we want; we must let the stabs
5624
         machinery tell us the offset.  */
5625
      outrel.r_offset
5626
        = (_bfd_stab_section_offset
5627
           (output_bfd, &elf_hash_table (info)->stab_info,
5628
            input_section,
5629
            &elf_section_data (input_section)->stab_info,
5630
            rel->r_offset));
5631
      /* If we didn't need the relocation at all, this value will be
5632
         -1.  */
5633
      if (outrel.r_offset == (bfd_vma) -1)
5634
        skip = true;
5635
    }
5636
 
5637
  /* If we've decided to skip this relocation, just output an emtpy
5638
     record.  Note that R_MIPS_NONE == 0, so that this call to memset
5639
     is a way of setting R_TYPE to R_MIPS_NONE.  */
5640
  if (skip)
5641
    memset (&outrel, 0, sizeof (outrel));
5642
  else
5643
    {
5644
      long indx;
5645
      bfd_vma section_offset;
5646
 
5647
      /* We must now calculate the dynamic symbol table index to use
5648
         in the relocation.  */
5649
      if (h != NULL
5650
          && (! info->symbolic || (h->root.elf_link_hash_flags
5651
                                   & ELF_LINK_HASH_DEF_REGULAR) == 0))
5652
        {
5653
          indx = h->root.dynindx;
5654
          BFD_ASSERT (indx != -1);
5655
        }
5656
      else
5657
        {
5658
          if (sec != NULL && bfd_is_abs_section (sec))
5659
            indx = 0;
5660
          else if (sec == NULL || sec->owner == NULL)
5661
            {
5662
              bfd_set_error (bfd_error_bad_value);
5663
              return false;
5664
            }
5665
          else
5666
            {
5667
              indx = elf_section_data (sec->output_section)->dynindx;
5668
              if (indx == 0)
5669
                abort ();
5670
            }
5671
 
5672
          /* Figure out how far the target of the relocation is from
5673
             the beginning of its section.  */
5674
          section_offset = symbol - sec->output_section->vma;
5675
          /* The relocation we're building is section-relative.
5676
             Therefore, the original addend must be adjusted by the
5677
             section offset.  */
5678
          *addendp += symbol - sec->output_section->vma;
5679
          /* Now, the relocation is just against the section.  */
5680
          symbol = sec->output_section->vma;
5681
        }
5682
 
5683
      /* If the relocation was previously an absolute relocation, we
5684
         must adjust it by the value we give it in the dynamic symbol
5685
         table.  */
5686
      if (r_type != R_MIPS_REL32)
5687
        *addendp += symbol;
5688
 
5689
      /* The relocation is always an REL32 relocation because we don't
5690
         know where the shared library will wind up at load-time.  */
5691
      outrel.r_info = ELF32_R_INFO (indx, R_MIPS_REL32);
5692
 
5693
      /* Adjust the output offset of the relocation to reference the
5694
         correct location in the output file.  */
5695
      outrel.r_offset += (input_section->output_section->vma
5696
                          + input_section->output_offset);
5697
    }
5698
 
5699
  /* Put the relocation back out.  We have to use the special
5700
     relocation outputter in the 64-bit case since the 64-bit
5701
     relocation format is non-standard.  */
5702
  if (ABI_64_P (output_bfd))
5703
    {
5704
      (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
5705
        (output_bfd, &outrel,
5706
         (sreloc->contents
5707
          + sreloc->reloc_count * sizeof (Elf64_Mips_External_Rel)));
5708
    }
5709
  else
5710
    bfd_elf32_swap_reloc_out (output_bfd, &outrel,
5711
                              (((Elf32_External_Rel *)
5712
                                sreloc->contents)
5713
                               + sreloc->reloc_count));
5714
 
5715
  /* Record the index of the first relocation referencing H.  This
5716
     information is later emitted in the .msym section.  */
5717
  if (h != NULL
5718
      && (h->min_dyn_reloc_index == 0
5719
          || sreloc->reloc_count < h->min_dyn_reloc_index))
5720
    h->min_dyn_reloc_index = sreloc->reloc_count;
5721
 
5722
  /* We've now added another relocation.  */
5723
  ++sreloc->reloc_count;
5724
 
5725
  /* Make sure the output section is writable.  The dynamic linker
5726
     will be writing to it.  */
5727
  elf_section_data (input_section->output_section)->this_hdr.sh_flags
5728
    |= SHF_WRITE;
5729
 
5730
  /* On IRIX5, make an entry of compact relocation info.  */
5731
  if (! skip && IRIX_COMPAT (output_bfd) == ict_irix5)
5732
    {
5733
      asection* scpt = bfd_get_section_by_name (dynobj, ".compact_rel");
5734
      bfd_byte *cr;
5735
 
5736
      if (scpt)
5737
        {
5738
          Elf32_crinfo cptrel;
5739
 
5740
          mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG);
5741
          cptrel.vaddr = (rel->r_offset
5742
                          + input_section->output_section->vma
5743
                          + input_section->output_offset);
5744
          if (r_type == R_MIPS_REL32)
5745
            mips_elf_set_cr_type (cptrel, CRT_MIPS_REL32);
5746
          else
5747
            mips_elf_set_cr_type (cptrel, CRT_MIPS_WORD);
5748
          mips_elf_set_cr_dist2to (cptrel, 0);
5749
          cptrel.konst = *addendp;
5750
 
5751
          cr = (scpt->contents
5752
                + sizeof (Elf32_External_compact_rel));
5753
          bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
5754
                                     ((Elf32_External_crinfo *) cr
5755
                                      + scpt->reloc_count));
5756
          ++scpt->reloc_count;
5757
        }
5758
    }
5759
 
5760
  return true;
5761
}
5762
 
5763
/* Calculate the value produced by the RELOCATION (which comes from
5764
   the INPUT_BFD).  The ADDEND is the addend to use for this
5765
   RELOCATION; RELOCATION->R_ADDEND is ignored.
5766
 
5767
   The result of the relocation calculation is stored in VALUEP.
5768
   REQUIRE_JALXP indicates whether or not the opcode used with this
5769
   relocation must be JALX.
5770
 
5771
   This function returns bfd_reloc_continue if the caller need take no
5772
   further action regarding this relocation, bfd_reloc_notsupported if
5773
   something goes dramatically wrong, bfd_reloc_overflow if an
5774
   overflow occurs, and bfd_reloc_ok to indicate success.  */
5775
 
5776
static bfd_reloc_status_type
5777
mips_elf_calculate_relocation (abfd,
5778
                               input_bfd,
5779
                               input_section,
5780
                               info,
5781
                               relocation,
5782
                               addend,
5783
                               howto,
5784
                               local_syms,
5785
                               local_sections,
5786
                               valuep,
5787
                               namep,
5788
                               require_jalxp)
5789
     bfd *abfd;
5790
     bfd *input_bfd;
5791
     asection *input_section;
5792
     struct bfd_link_info *info;
5793
     const Elf_Internal_Rela *relocation;
5794
     bfd_vma addend;
5795
     reloc_howto_type *howto;
5796
     Elf_Internal_Sym *local_syms;
5797
     asection **local_sections;
5798
     bfd_vma *valuep;
5799
     const char **namep;
5800
     boolean *require_jalxp;
5801
{
5802
  /* The eventual value we will return.  */
5803
  bfd_vma value;
5804
  /* The address of the symbol against which the relocation is
5805
     occurring.  */
5806
  bfd_vma symbol = 0;
5807
  /* The final GP value to be used for the relocatable, executable, or
5808
     shared object file being produced.  */
5809
  bfd_vma gp = (bfd_vma) - 1;
5810
  /* The place (section offset or address) of the storage unit being
5811
     relocated.  */
5812
  bfd_vma p;
5813
  /* The value of GP used to create the relocatable object.  */
5814
  bfd_vma gp0 = (bfd_vma) - 1;
5815
  /* The offset into the global offset table at which the address of
5816
     the relocation entry symbol, adjusted by the addend, resides
5817
     during execution.  */
5818
  bfd_vma g = (bfd_vma) - 1;
5819
  /* The section in which the symbol referenced by the relocation is
5820
     located.  */
5821
  asection *sec = NULL;
5822
  struct mips_elf_link_hash_entry* h = NULL;
5823
  /* True if the symbol referred to by this relocation is a local
5824
     symbol.  */
5825
  boolean local_p;
5826
  /* True if the symbol referred to by this relocation is "_gp_disp".  */
5827
  boolean gp_disp_p = false;
5828
  Elf_Internal_Shdr *symtab_hdr;
5829
  size_t extsymoff;
5830
  unsigned long r_symndx;
5831
  int r_type;
5832
  /* True if overflow occurred during the calculation of the
5833
     relocation value.  */
5834
  boolean overflowed_p;
5835
  /* True if this relocation refers to a MIPS16 function.  */
5836
  boolean target_is_16_bit_code_p = false;
5837
 
5838
  /* Parse the relocation.  */
5839
  r_symndx = ELF32_R_SYM (relocation->r_info);
5840
  r_type = ELF32_R_TYPE (relocation->r_info);
5841
  p = (input_section->output_section->vma
5842
       + input_section->output_offset
5843
       + relocation->r_offset);
5844
 
5845
  /* Assume that there will be no overflow.  */
5846
  overflowed_p = false;
5847
 
5848
  /* Figure out whether or not the symbol is local, and get the offset
5849
     used in the array of hash table entries.  */
5850
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5851
  local_p = mips_elf_local_relocation_p (input_bfd, relocation,
5852
                                         local_sections);
5853
  if (! elf_bad_symtab (input_bfd))
5854
    extsymoff = symtab_hdr->sh_info;
5855
  else
5856
    {
5857
      /* The symbol table does not follow the rule that local symbols
5858
         must come before globals.  */
5859
      extsymoff = 0;
5860
    }
5861
 
5862
  /* Figure out the value of the symbol.  */
5863
  if (local_p)
5864
    {
5865
      Elf_Internal_Sym *sym;
5866
 
5867
      sym = local_syms + r_symndx;
5868
      sec = local_sections[r_symndx];
5869
 
5870
      symbol = sec->output_section->vma + sec->output_offset;
5871
      if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
5872
        symbol += sym->st_value;
5873
 
5874
      /* MIPS16 text labels should be treated as odd.  */
5875
      if (sym->st_other == STO_MIPS16)
5876
        ++symbol;
5877
 
5878
      /* Record the name of this symbol, for our caller.  */
5879
      *namep = bfd_elf_string_from_elf_section (input_bfd,
5880
                                                symtab_hdr->sh_link,
5881
                                                sym->st_name);
5882
      if (*namep == '\0')
5883
        *namep = bfd_section_name (input_bfd, sec);
5884
 
5885
      target_is_16_bit_code_p = (sym->st_other == STO_MIPS16);
5886
    }
5887
  else
5888
    {
5889
      /* For global symbols we look up the symbol in the hash-table.  */
5890
      h = ((struct mips_elf_link_hash_entry *)
5891
           elf_sym_hashes (input_bfd) [r_symndx - extsymoff]);
5892
      /* Find the real hash-table entry for this symbol.  */
5893
      while (h->root.type == bfd_link_hash_indirect
5894
             || h->root.type == bfd_link_hash_warning)
5895
        h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
5896
 
5897
      /* Record the name of this symbol, for our caller.  */
5898
      *namep = h->root.root.root.string;
5899
 
5900
      /* See if this is the special _gp_disp symbol.  Note that such a
5901
         symbol must always be a global symbol.  */
5902
      if (strcmp (h->root.root.root.string, "_gp_disp") == 0)
5903
        {
5904
          /* Relocations against _gp_disp are permitted only with
5905
             R_MIPS_HI16 and R_MIPS_LO16 relocations.  */
5906
          if (r_type != R_MIPS_HI16 && r_type != R_MIPS_LO16)
5907
            return bfd_reloc_notsupported;
5908
 
5909
          gp_disp_p = true;
5910
        }
5911
      /* If this symbol is defined, calculate its address.  Note that
5912
         _gp_disp is a magic symbol, always implicitly defined by the
5913
         linker, so it's inappropriate to check to see whether or not
5914
         its defined.  */
5915
      else if ((h->root.root.type == bfd_link_hash_defined
5916
                || h->root.root.type == bfd_link_hash_defweak)
5917
               && h->root.root.u.def.section)
5918
        {
5919
          sec = h->root.root.u.def.section;
5920
          if (sec->output_section)
5921
            symbol = (h->root.root.u.def.value
5922
                      + sec->output_section->vma
5923
                      + sec->output_offset);
5924
          else
5925
            symbol = h->root.root.u.def.value;
5926
        }
5927
      else if (h->root.root.type == bfd_link_hash_undefweak)
5928
        /* We allow relocations against undefined weak symbols, giving
5929
           it the value zero, so that you can undefined weak functions
5930
           and check to see if they exist by looking at their
5931
           addresses.  */
5932
        symbol = 0;
5933
      else if (info->shared && !info->symbolic && !info->no_undefined)
5934
        symbol = 0;
5935
      else if (strcmp (h->root.root.root.string, "_DYNAMIC_LINK") == 0)
5936
        {
5937
          /* If this is a dynamic link, we should have created a
5938
             _DYNAMIC_LINK symbol in mips_elf_create_dynamic_sections.
5939
             Otherwise, we should define the symbol with a value of 0.
5940
             FIXME: It should probably get into the symbol table
5941
             somehow as well.  */
5942
          BFD_ASSERT (! info->shared);
5943
          BFD_ASSERT (bfd_get_section_by_name (abfd, ".dynamic") == NULL);
5944
          symbol = 0;
5945
        }
5946
      else
5947
        {
5948
          if (! ((*info->callbacks->undefined_symbol)
5949
                 (info, h->root.root.root.string, input_bfd,
5950
                  input_section, relocation->r_offset,
5951
                  (!info->shared || info->no_undefined))))
5952
            return bfd_reloc_undefined;
5953
          symbol = 0;
5954
        }
5955
 
5956
      target_is_16_bit_code_p = (h->root.other == STO_MIPS16);
5957
    }
5958
 
5959
  /* If this is a 32-bit call to a 16-bit function with a stub, we
5960
     need to redirect the call to the stub, unless we're already *in*
5961
     a stub.  */
5962
  if (r_type != R_MIPS16_26 && !info->relocateable
5963
      && ((h != NULL && h->fn_stub != NULL)
5964
          || (local_p && elf_tdata (input_bfd)->local_stubs != NULL
5965
              && elf_tdata (input_bfd)->local_stubs[r_symndx] != NULL))
5966
      && !mips_elf_stub_section_p (input_bfd, input_section))
5967
    {
5968
      /* This is a 32-bit call to a 16-bit function.  We should
5969
         have already noticed that we were going to need the
5970
         stub.  */
5971
      if (local_p)
5972
        sec = elf_tdata (input_bfd)->local_stubs[r_symndx];
5973
      else
5974
        {
5975
          BFD_ASSERT (h->need_fn_stub);
5976
          sec = h->fn_stub;
5977
        }
5978
 
5979
      symbol = sec->output_section->vma + sec->output_offset;
5980
    }
5981
  /* If this is a 16-bit call to a 32-bit function with a stub, we
5982
     need to redirect the call to the stub.  */
5983
  else if (r_type == R_MIPS16_26 && !info->relocateable
5984
           && h != NULL
5985
           && (h->call_stub != NULL || h->call_fp_stub != NULL)
5986
           && !target_is_16_bit_code_p)
5987
    {
5988
      /* If both call_stub and call_fp_stub are defined, we can figure
5989
         out which one to use by seeing which one appears in the input
5990
         file.  */
5991
      if (h->call_stub != NULL && h->call_fp_stub != NULL)
5992
        {
5993
          asection *o;
5994
 
5995
          sec = NULL;
5996
          for (o = input_bfd->sections; o != NULL; o = o->next)
5997
            {
5998
              if (strncmp (bfd_get_section_name (input_bfd, o),
5999
                           CALL_FP_STUB, sizeof CALL_FP_STUB - 1) == 0)
6000
                {
6001
                  sec = h->call_fp_stub;
6002
                  break;
6003
                }
6004
            }
6005
          if (sec == NULL)
6006
            sec = h->call_stub;
6007
        }
6008
      else if (h->call_stub != NULL)
6009
        sec = h->call_stub;
6010
      else
6011
        sec = h->call_fp_stub;
6012
 
6013
      BFD_ASSERT (sec->_raw_size > 0);
6014
      symbol = sec->output_section->vma + sec->output_offset;
6015
    }
6016
 
6017
  /* Calls from 16-bit code to 32-bit code and vice versa require the
6018
     special jalx instruction.  */
6019
  *require_jalxp = (!info->relocateable
6020
                    && ((r_type == R_MIPS16_26) != target_is_16_bit_code_p));
6021
 
6022
  /* If we haven't already determined the GOT offset, or the GP value,
6023
     and we're going to need it, get it now.  */
6024
  switch (r_type)
6025
    {
6026
    case R_MIPS_CALL16:
6027
    case R_MIPS_GOT16:
6028
    case R_MIPS_GOT_DISP:
6029
    case R_MIPS_GOT_HI16:
6030
    case R_MIPS_CALL_HI16:
6031
    case R_MIPS_GOT_LO16:
6032
    case R_MIPS_CALL_LO16:
6033
      /* Find the index into the GOT where this value is located.  */
6034
      if (!local_p)
6035
        {
6036
          BFD_ASSERT (addend == 0);
6037
          g = mips_elf_global_got_index
6038
            (elf_hash_table (info)->dynobj,
6039
             (struct elf_link_hash_entry*) h);
6040
        }
6041
      else if (r_type == R_MIPS_GOT16)
6042
        /* There's no need to create a local GOT entry here; the
6043
           calculation for a local GOT16 entry does not involve G.  */
6044
        break;
6045
      else
6046
        {
6047
          g = mips_elf_local_got_index (abfd, info, symbol + addend);
6048
          if (g == (bfd_vma) -1)
6049
            return false;
6050
        }
6051
 
6052
      /* Convert GOT indices to actual offsets.  */
6053
      g = mips_elf_got_offset_from_index (elf_hash_table (info)->dynobj,
6054
                                          abfd, g);
6055
      break;
6056
 
6057
    case R_MIPS_HI16:
6058
    case R_MIPS_LO16:
6059
    case R_MIPS_GPREL16:
6060
    case R_MIPS_GPREL32:
6061
    case R_MIPS_LITERAL:
6062
      gp0 = _bfd_get_gp_value (input_bfd);
6063
      gp = _bfd_get_gp_value (abfd);
6064
      break;
6065
 
6066
    default:
6067
      break;
6068
    }
6069
 
6070
  /* Figure out what kind of relocation is being performed.  */
6071
  switch (r_type)
6072
    {
6073
    case R_MIPS_NONE:
6074
      return bfd_reloc_continue;
6075
 
6076
    case R_MIPS_16:
6077
      value = symbol + mips_elf_sign_extend (addend, 16);
6078
      overflowed_p = mips_elf_overflow_p (value, 16);
6079
      break;
6080
 
6081
    case R_MIPS_32:
6082
    case R_MIPS_REL32:
6083
    case R_MIPS_64:
6084
      if ((info->shared
6085
           || (elf_hash_table (info)->dynamic_sections_created
6086
               && h != NULL
6087
               && ((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)
6088
                   == 0)))
6089
          && (input_section->flags & SEC_ALLOC) != 0)
6090
        {
6091
          /* If we're creating a shared library, or this relocation is
6092
             against a symbol in a shared library, then we can't know
6093
             where the symbol will end up.  So, we create a relocation
6094
             record in the output, and leave the job up to the dynamic
6095
             linker.  */
6096
          value = addend;
6097
          if (!mips_elf_create_dynamic_relocation (abfd,
6098
                                                   info,
6099
                                                   relocation,
6100
                                                   h,
6101
                                                   sec,
6102
                                                   symbol,
6103
                                                   &value,
6104
                                                   input_section))
6105
            return false;
6106
        }
6107
      else
6108
        {
6109
          if (r_type != R_MIPS_REL32)
6110
            value = symbol + addend;
6111
          else
6112
            value = addend;
6113
        }
6114
      value &= howto->dst_mask;
6115
      break;
6116
 
6117
    case R_MIPS_PC32:
6118
    case R_MIPS_PC64:
6119
    case R_MIPS_GNU_REL_LO16:
6120
      value = symbol + addend - p;
6121
      value &= howto->dst_mask;
6122
      break;
6123
 
6124
    case R_MIPS_GNU_REL16_S2:
6125
      value = symbol + mips_elf_sign_extend (addend << 2, 18) - p;
6126
      overflowed_p = mips_elf_overflow_p (value, 18);
6127
      value = (value >> 2) & howto->dst_mask;
6128
      break;
6129
 
6130
    case R_MIPS_GNU_REL_HI16:
6131
      value = mips_elf_high (addend + symbol - p);
6132
      value &= howto->dst_mask;
6133
      break;
6134
 
6135
    case R_MIPS16_26:
6136
      /* The calculation for R_MIPS_26 is just the same as for an
6137
         R_MIPS_26.  It's only the storage of the relocated field into
6138
         the output file that's different.  That's handled in
6139
         mips_elf_perform_relocation.  So, we just fall through to the
6140
         R_MIPS_26 case here.  */
6141
    case R_MIPS_26:
6142
      if (local_p)
6143
        value = (((addend << 2) | (p & 0xf0000000)) + symbol) >> 2;
6144
      else
6145
        value = (mips_elf_sign_extend (addend << 2, 28) + symbol) >> 2;
6146
      value &= howto->dst_mask;
6147
      break;
6148
 
6149
    case R_MIPS_HI16:
6150
      if (!gp_disp_p)
6151
        {
6152
          value = mips_elf_high (addend + symbol);
6153
          value &= howto->dst_mask;
6154
        }
6155
      else
6156
        {
6157
          value = mips_elf_high (addend + gp - p);
6158
          overflowed_p = mips_elf_overflow_p (value, 16);
6159
        }
6160
      break;
6161
 
6162
    case R_MIPS_LO16:
6163
      if (!gp_disp_p)
6164
        value = (symbol + addend) & howto->dst_mask;
6165
      else
6166
        {
6167
          value = addend + gp - p + 4;
6168
          /* The MIPS ABI requires checking the R_MIPS_LO16 relocation
6169
             for overflow.  But, on, say, Irix 5, relocations against
6170
             _gp_disp are normally generated from the .cpload
6171
             pseudo-op.  It generates code that normally looks like
6172
             this:
6173
 
6174
               lui    $gp,%hi(_gp_disp)
6175
               addiu  $gp,$gp,%lo(_gp_disp)
6176
               addu   $gp,$gp,$t9
6177
 
6178
             Here $t9 holds the address of the function being called,
6179
             as required by the MIPS ELF ABI.  The R_MIPS_LO16
6180
             relocation can easily overflow in this situation, but the
6181
             R_MIPS_HI16 relocation will handle the overflow.
6182
             Therefore, we consider this a bug in the MIPS ABI, and do
6183
             not check for overflow here.  */
6184
        }
6185
      break;
6186
 
6187
    case R_MIPS_LITERAL:
6188
      /* Because we don't merge literal sections, we can handle this
6189
         just like R_MIPS_GPREL16.  In the long run, we should merge
6190
         shared literals, and then we will need to additional work
6191
         here.  */
6192
 
6193
      /* Fall through.  */
6194
 
6195
    case R_MIPS16_GPREL:
6196
      /* The R_MIPS16_GPREL performs the same calculation as
6197
         R_MIPS_GPREL16, but stores the relocated bits in a different
6198
         order.  We don't need to do anything special here; the
6199
         differences are handled in mips_elf_perform_relocation.  */
6200
    case R_MIPS_GPREL16:
6201
      if (local_p)
6202
        value = mips_elf_sign_extend (addend, 16) + symbol + gp0 - gp;
6203
      else
6204
        value = mips_elf_sign_extend (addend, 16) + symbol - gp;
6205
      overflowed_p = mips_elf_overflow_p (value, 16);
6206
      break;
6207
 
6208
    case R_MIPS_GOT16:
6209
      if (local_p)
6210
        {
6211
          value = mips_elf_got16_entry (abfd, info, symbol + addend);
6212
          if (value == (bfd_vma) -1)
6213
            return false;
6214
          value
6215
            = mips_elf_got_offset_from_index (elf_hash_table (info)->dynobj,
6216
                                              abfd,
6217
                                              value);
6218
          overflowed_p = mips_elf_overflow_p (value, 16);
6219
          break;
6220
        }
6221
 
6222
      /* Fall through.  */
6223
 
6224
    case R_MIPS_CALL16:
6225
    case R_MIPS_GOT_DISP:
6226
      value = g;
6227
      overflowed_p = mips_elf_overflow_p (value, 16);
6228
      break;
6229
 
6230
    case R_MIPS_GPREL32:
6231
      value = (addend + symbol + gp0 - gp) & howto->dst_mask;
6232
      break;
6233
 
6234
    case R_MIPS_PC16:
6235
      value = mips_elf_sign_extend (addend, 16) + symbol - p;
6236
      value = (bfd_vma) ((bfd_signed_vma) value / 4);
6237
      overflowed_p = mips_elf_overflow_p (value, 16);
6238
      break;
6239
 
6240
    case R_MIPS_GOT_HI16:
6241
    case R_MIPS_CALL_HI16:
6242
      /* We're allowed to handle these two relocations identically.
6243
         The dynamic linker is allowed to handle the CALL relocations
6244
         differently by creating a lazy evaluation stub.  */
6245
      value = g;
6246
      value = mips_elf_high (value);
6247
      value &= howto->dst_mask;
6248
      break;
6249
 
6250
    case R_MIPS_GOT_LO16:
6251
    case R_MIPS_CALL_LO16:
6252
      value = g & howto->dst_mask;
6253
      break;
6254
 
6255
    case R_MIPS_GOT_PAGE:
6256
      value = mips_elf_got_page (abfd, info, symbol + addend, NULL);
6257
      if (value == (bfd_vma) -1)
6258
        return false;
6259
      value = mips_elf_got_offset_from_index (elf_hash_table (info)->dynobj,
6260
                                              abfd,
6261
                                              value);
6262
      overflowed_p = mips_elf_overflow_p (value, 16);
6263
      break;
6264
 
6265
    case R_MIPS_GOT_OFST:
6266
      mips_elf_got_page (abfd, info, symbol + addend, &value);
6267
      overflowed_p = mips_elf_overflow_p (value, 16);
6268
      break;
6269
 
6270
    case R_MIPS_SUB:
6271
      value = symbol - addend;
6272
      value &= howto->dst_mask;
6273
      break;
6274
 
6275
    case R_MIPS_HIGHER:
6276
      value = mips_elf_higher (addend + symbol);
6277
      value &= howto->dst_mask;
6278
      break;
6279
 
6280
    case R_MIPS_HIGHEST:
6281
      value = mips_elf_highest (addend + symbol);
6282
      value &= howto->dst_mask;
6283
      break;
6284
 
6285
    case R_MIPS_SCN_DISP:
6286
      value = symbol + addend - sec->output_offset;
6287
      value &= howto->dst_mask;
6288
      break;
6289
 
6290
    case R_MIPS_PJUMP:
6291
    case R_MIPS_JALR:
6292
      /* Both of these may be ignored.  R_MIPS_JALR is an optimization
6293
         hint; we could improve performance by honoring that hint.  */
6294
      return bfd_reloc_continue;
6295
 
6296
    case R_MIPS_GNU_VTINHERIT:
6297
    case R_MIPS_GNU_VTENTRY:
6298
      /* We don't do anything with these at present.  */
6299
      return bfd_reloc_continue;
6300
 
6301
    default:
6302
      /* An unrecognized relocation type.  */
6303
      return bfd_reloc_notsupported;
6304
    }
6305
 
6306
  /* Store the VALUE for our caller.  */
6307
  *valuep = value;
6308
  return overflowed_p ? bfd_reloc_overflow : bfd_reloc_ok;
6309
}
6310
 
6311
/* Obtain the field relocated by RELOCATION.  */
6312
 
6313
static bfd_vma
6314
mips_elf_obtain_contents (howto, relocation, input_bfd, contents)
6315
     reloc_howto_type *howto;
6316
     const Elf_Internal_Rela *relocation;
6317
     bfd *input_bfd;
6318
     bfd_byte *contents;
6319
{
6320
  bfd_vma x;
6321
  bfd_byte *location = contents + relocation->r_offset;
6322
 
6323
  /* Obtain the bytes.  */
6324
  x = bfd_get (8 * bfd_get_reloc_size (howto), input_bfd, location);
6325
 
6326
  if ((ELF32_R_TYPE (relocation->r_info) == R_MIPS16_26
6327
       || ELF32_R_TYPE (relocation->r_info) == R_MIPS16_GPREL)
6328
      && bfd_little_endian (input_bfd))
6329
    /* The two 16-bit words will be reversed on a little-endian
6330
       system.  See mips_elf_perform_relocation for more details.  */
6331
    x = (((x & 0xffff) << 16) | ((x & 0xffff0000) >> 16));
6332
 
6333
  return x;
6334
}
6335
 
6336
/* It has been determined that the result of the RELOCATION is the
6337
   VALUE.  Use HOWTO to place VALUE into the output file at the
6338
   appropriate position.  The SECTION is the section to which the
6339
   relocation applies.  If REQUIRE_JALX is true, then the opcode used
6340
   for the relocation must be either JAL or JALX, and it is
6341
   unconditionally converted to JALX.
6342
 
6343
   Returns false if anything goes wrong.  */
6344
 
6345
static boolean
6346
mips_elf_perform_relocation (info, howto, relocation, value,
6347
                             input_bfd, input_section,
6348
                             contents, require_jalx)
6349
     struct bfd_link_info *info;
6350
     reloc_howto_type *howto;
6351
     const Elf_Internal_Rela *relocation;
6352
     bfd_vma value;
6353
     bfd *input_bfd;
6354
     asection *input_section;
6355
     bfd_byte *contents;
6356
     boolean require_jalx;
6357
{
6358
  bfd_vma x;
6359
  bfd_byte *location;
6360
  int r_type = ELF32_R_TYPE (relocation->r_info);
6361
 
6362
  /* Figure out where the relocation is occurring.  */
6363
  location = contents + relocation->r_offset;
6364
 
6365
  /* Obtain the current value.  */
6366
  x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
6367
 
6368
  /* Clear the field we are setting.  */
6369
  x &= ~howto->dst_mask;
6370
 
6371
  /* If this is the R_MIPS16_26 relocation, we must store the
6372
     value in a funny way.  */
6373
  if (r_type == R_MIPS16_26)
6374
    {
6375
      /* R_MIPS16_26 is used for the mips16 jal and jalx instructions.
6376
         Most mips16 instructions are 16 bits, but these instructions
6377
         are 32 bits.
6378
 
6379
         The format of these instructions is:
6380
 
6381
         +--------------+--------------------------------+
6382
         !     JALX     ! X!   Imm 20:16  !   Imm 25:21  !
6383
         +--------------+--------------------------------+
6384
         !                Immediate  15:0                   !
6385
         +-----------------------------------------------+
6386
 
6387
         JALX is the 5-bit value 00011.  X is 0 for jal, 1 for jalx.
6388
         Note that the immediate value in the first word is swapped.
6389
 
6390
         When producing a relocateable object file, R_MIPS16_26 is
6391
         handled mostly like R_MIPS_26.  In particular, the addend is
6392
         stored as a straight 26-bit value in a 32-bit instruction.
6393
         (gas makes life simpler for itself by never adjusting a
6394
         R_MIPS16_26 reloc to be against a section, so the addend is
6395
         always zero).  However, the 32 bit instruction is stored as 2
6396
         16-bit values, rather than a single 32-bit value.  In a
6397
         big-endian file, the result is the same; in a little-endian
6398
         file, the two 16-bit halves of the 32 bit value are swapped.
6399
         This is so that a disassembler can recognize the jal
6400
         instruction.
6401
 
6402
         When doing a final link, R_MIPS16_26 is treated as a 32 bit
6403
         instruction stored as two 16-bit values.  The addend A is the
6404
         contents of the targ26 field.  The calculation is the same as
6405
         R_MIPS_26.  When storing the calculated value, reorder the
6406
         immediate value as shown above, and don't forget to store the
6407
         value as two 16-bit values.
6408
 
6409
         To put it in MIPS ABI terms, the relocation field is T-targ26-16,
6410
         defined as
6411
 
6412
         big-endian:
6413
         +--------+----------------------+
6414
         |        |                      |
6415
         |        |    targ26-16         |
6416
         |31    26|25                   0|
6417
         +--------+----------------------+
6418
 
6419
         little-endian:
6420
         +----------+------+-------------+
6421
         |          |      |             |
6422
         |  sub1    |      |     sub2    |
6423
         |0        9|10  15|16         31|
6424
         +----------+--------------------+
6425
         where targ26-16 is sub1 followed by sub2 (i.e., the addend field A is
6426
         ((sub1 << 16) | sub2)).
6427
 
6428
         When producing a relocateable object file, the calculation is
6429
         (((A < 2) | (P & 0xf0000000) + S) >> 2)
6430
         When producing a fully linked file, the calculation is
6431
         let R = (((A < 2) | (P & 0xf0000000) + S) >> 2)
6432
         ((R & 0x1f0000) << 5) | ((R & 0x3e00000) >> 5) | (R & 0xffff)  */
6433
 
6434
      if (!info->relocateable)
6435
        /* Shuffle the bits according to the formula above.  */
6436
        value = (((value & 0x1f0000) << 5)
6437
                 | ((value & 0x3e00000) >> 5)
6438
                 | (value & 0xffff));
6439
 
6440
    }
6441
  else if (r_type == R_MIPS16_GPREL)
6442
    {
6443
      /* R_MIPS16_GPREL is used for GP-relative addressing in mips16
6444
         mode.  A typical instruction will have a format like this:
6445
 
6446
         +--------------+--------------------------------+
6447
         !    EXTEND    !     Imm 10:5    !   Imm 15:11  !
6448
         +--------------+--------------------------------+
6449
         !    Major     !   rx   !   ry   !   Imm  4:0   !
6450
         +--------------+--------------------------------+
6451
 
6452
         EXTEND is the five bit value 11110.  Major is the instruction
6453
         opcode.
6454
 
6455
         This is handled exactly like R_MIPS_GPREL16, except that the
6456
         addend is retrieved and stored as shown in this diagram; that
6457
         is, the Imm fields above replace the V-rel16 field.
6458
 
6459
         All we need to do here is shuffle the bits appropriately.  As
6460
         above, the two 16-bit halves must be swapped on a
6461
         little-endian system.  */
6462
      value = (((value & 0x7e0) << 16)
6463
               | ((value & 0xf800) << 5)
6464
               | (value & 0x1f));
6465
    }
6466
 
6467
  /* Set the field.  */
6468
  x |= (value & howto->dst_mask);
6469
 
6470
  /* If required, turn JAL into JALX.  */
6471
  if (require_jalx)
6472
    {
6473
      boolean ok;
6474
      bfd_vma opcode = x >> 26;
6475
      bfd_vma jalx_opcode;
6476
 
6477
      /* Check to see if the opcode is already JAL or JALX.  */
6478
      if (r_type == R_MIPS16_26)
6479
        {
6480
          ok = ((opcode == 0x6) || (opcode == 0x7));
6481
          jalx_opcode = 0x7;
6482
        }
6483
      else
6484
        {
6485
          ok = ((opcode == 0x3) || (opcode == 0x1d));
6486
          jalx_opcode = 0x1d;
6487
        }
6488
 
6489
      /* If the opcode is not JAL or JALX, there's a problem.  */
6490
      if (!ok)
6491
        {
6492
          (*_bfd_error_handler)
6493
            (_("%s: %s+0x%lx: jump to stub routine which is not jal"),
6494
             bfd_get_filename (input_bfd),
6495
             input_section->name,
6496
             (unsigned long) relocation->r_offset);
6497
          bfd_set_error (bfd_error_bad_value);
6498
          return false;
6499
        }
6500
 
6501
      /* Make this the JALX opcode.  */
6502
      x = (x & ~(0x3f << 26)) | (jalx_opcode << 26);
6503
    }
6504
 
6505
  /* Swap the high- and low-order 16 bits on little-endian systems
6506
     when doing a MIPS16 relocation.  */
6507
  if ((r_type == R_MIPS16_GPREL || r_type == R_MIPS16_26)
6508
      && bfd_little_endian (input_bfd))
6509
    x = (((x & 0xffff) << 16) | ((x & 0xffff0000) >> 16));
6510
 
6511
  /* Put the value into the output.  */
6512
  bfd_put (8 * bfd_get_reloc_size (howto), input_bfd, x, location);
6513
  return true;
6514
}
6515
 
6516
/* Returns true if SECTION is a MIPS16 stub section.  */
6517
 
6518
static boolean
6519
mips_elf_stub_section_p (abfd, section)
6520
     bfd *abfd ATTRIBUTE_UNUSED;
6521
     asection *section;
6522
{
6523
  const char *name = bfd_get_section_name (abfd, section);
6524
 
6525
  return (strncmp (name, FN_STUB, sizeof FN_STUB - 1) == 0
6526
          || strncmp (name, CALL_STUB, sizeof CALL_STUB - 1) == 0
6527
          || strncmp (name, CALL_FP_STUB, sizeof CALL_FP_STUB - 1) == 0);
6528
}
6529
 
6530
/* Relocate a MIPS ELF section.  */
6531
 
6532
boolean
6533
_bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
6534
                                contents, relocs, local_syms, local_sections)
6535
     bfd *output_bfd;
6536
     struct bfd_link_info *info;
6537
     bfd *input_bfd;
6538
     asection *input_section;
6539
     bfd_byte *contents;
6540
     Elf_Internal_Rela *relocs;
6541
     Elf_Internal_Sym *local_syms;
6542
     asection **local_sections;
6543
{
6544
  Elf_Internal_Rela *rel;
6545
  const Elf_Internal_Rela *relend;
6546
  bfd_vma addend = 0;
6547
  boolean use_saved_addend_p = false;
6548
  struct elf_backend_data *bed;
6549
 
6550
  bed = get_elf_backend_data (output_bfd);
6551
  relend = relocs + input_section->reloc_count * bed->s->int_rels_per_ext_rel;
6552
  for (rel = relocs; rel < relend; ++rel)
6553
    {
6554
      const char *name;
6555
      bfd_vma value;
6556
      reloc_howto_type *howto;
6557
      boolean require_jalx;
6558
      /* True if the relocation is a RELA relocation, rather than a
6559
         REL relocation.  */
6560
      boolean rela_relocation_p = true;
6561
      int r_type = ELF32_R_TYPE (rel->r_info);
6562
 
6563
      /* Find the relocation howto for this relocation.  */
6564
      if (r_type == R_MIPS_64 && !ABI_64_P (output_bfd))
6565
        {
6566
          /* Some 32-bit code uses R_MIPS_64.  In particular, people use
6567
             64-bit code, but make sure all their addresses are in the
6568
             lowermost or uppermost 32-bit section of the 64-bit address
6569
             space.  Thus, when they use an R_MIPS_64 they mean what is
6570
             usually meant by R_MIPS_32, with the exception that the
6571
             stored value is sign-extended to 64 bits.  */
6572
          howto = elf_mips_howto_table + R_MIPS_32;
6573
 
6574
          /* On big-endian systems, we need to lie about the position
6575
             of the reloc.  */
6576
          if (bfd_big_endian (input_bfd))
6577
              rel->r_offset += 4;
6578
        }
6579
      else
6580
        howto = mips_rtype_to_howto (r_type);
6581
 
6582
      if (!use_saved_addend_p)
6583
        {
6584
          Elf_Internal_Shdr *rel_hdr;
6585
 
6586
          /* If these relocations were originally of the REL variety,
6587
             we must pull the addend out of the field that will be
6588
             relocated.  Otherwise, we simply use the contents of the
6589
             RELA relocation.  To determine which flavor or relocation
6590
             this is, we depend on the fact that the INPUT_SECTION's
6591
             REL_HDR is read before its REL_HDR2.  */
6592
          rel_hdr = &elf_section_data (input_section)->rel_hdr;
6593
          if ((size_t) (rel - relocs)
6594
              >= (rel_hdr->sh_size / rel_hdr->sh_entsize
6595
                  * bed->s->int_rels_per_ext_rel))
6596
            rel_hdr = elf_section_data (input_section)->rel_hdr2;
6597
          if (rel_hdr->sh_entsize == MIPS_ELF_REL_SIZE (input_bfd))
6598
            {
6599
              /* Note that this is a REL relocation.  */
6600
              rela_relocation_p = false;
6601
 
6602
              /* Get the addend, which is stored in the input file.  */
6603
              addend = mips_elf_obtain_contents (howto,
6604
                                                 rel,
6605
                                                 input_bfd,
6606
                                                 contents);
6607
              addend &= howto->src_mask;
6608
 
6609
              /* For some kinds of relocations, the ADDEND is a
6610
                 combination of the addend stored in two different
6611
                 relocations.   */
6612
              if (r_type == R_MIPS_HI16
6613
                  || r_type == R_MIPS_GNU_REL_HI16
6614
                  || (r_type == R_MIPS_GOT16
6615
                      && mips_elf_local_relocation_p (input_bfd, rel,
6616
                                                      local_sections)))
6617
                {
6618
                  bfd_vma l;
6619
                  const Elf_Internal_Rela *lo16_relocation;
6620
                  reloc_howto_type *lo16_howto;
6621
                  int lo;
6622
 
6623
                  /* The combined value is the sum of the HI16 addend,
6624
                     left-shifted by sixteen bits, and the LO16
6625
                     addend, sign extended.  (Usually, the code does
6626
                     a `lui' of the HI16 value, and then an `addiu' of
6627
                     the LO16 value.)
6628
 
6629
                     Scan ahead to find a matching LO16 relocation.  */
6630
                  if (r_type == R_MIPS_GNU_REL_HI16)
6631
                    lo = R_MIPS_GNU_REL_LO16;
6632
                  else
6633
                    lo = R_MIPS_LO16;
6634
                  lo16_relocation
6635
                    = mips_elf_next_relocation (lo, rel, relend);
6636
                  if (lo16_relocation == NULL)
6637
                    return false;
6638
 
6639
                  /* Obtain the addend kept there.  */
6640
                  lo16_howto = mips_rtype_to_howto (lo);
6641
                  l = mips_elf_obtain_contents (lo16_howto,
6642
                                                lo16_relocation,
6643
                                                input_bfd, contents);
6644
                  l &= lo16_howto->src_mask;
6645
                  l = mips_elf_sign_extend (l, 16);
6646
 
6647
                  addend <<= 16;
6648
 
6649
                  /* Compute the combined addend.  */
6650
                  addend += l;
6651
                }
6652
              else if (r_type == R_MIPS16_GPREL)
6653
                {
6654
                  /* The addend is scrambled in the object file.  See
6655
                     mips_elf_perform_relocation for details on the
6656
                     format.  */
6657
                  addend = (((addend & 0x1f0000) >> 5)
6658
                            | ((addend & 0x7e00000) >> 16)
6659
                            | (addend & 0x1f));
6660
                }
6661
            }
6662
          else
6663
            addend = rel->r_addend;
6664
        }
6665
 
6666
      if (info->relocateable)
6667
        {
6668
          Elf_Internal_Sym *sym;
6669
          unsigned long r_symndx;
6670
 
6671
          if (r_type == R_MIPS_64 && !ABI_64_P (output_bfd)
6672
              && bfd_big_endian (input_bfd))
6673
            rel->r_offset -= 4;
6674
 
6675
          /* Since we're just relocating, all we need to do is copy
6676
             the relocations back out to the object file, unless
6677
             they're against a section symbol, in which case we need
6678
             to adjust by the section offset, or unless they're GP
6679
             relative in which case we need to adjust by the amount
6680
             that we're adjusting GP in this relocateable object.  */
6681
 
6682
          if (!mips_elf_local_relocation_p (input_bfd, rel, local_sections))
6683
            /* There's nothing to do for non-local relocations.  */
6684
            continue;
6685
 
6686
          if (r_type == R_MIPS16_GPREL
6687
              || r_type == R_MIPS_GPREL16
6688
              || r_type == R_MIPS_GPREL32
6689
              || r_type == R_MIPS_LITERAL)
6690
            addend -= (_bfd_get_gp_value (output_bfd)
6691
                       - _bfd_get_gp_value (input_bfd));
6692
          else if (r_type == R_MIPS_26 || r_type == R_MIPS16_26
6693
                   || r_type == R_MIPS_GNU_REL16_S2)
6694
            /* The addend is stored without its two least
6695
               significant bits (which are always zero.)  In a
6696
               non-relocateable link, calculate_relocation will do
6697
               this shift; here, we must do it ourselves.  */
6698
            addend <<= 2;
6699
 
6700
          r_symndx = ELF32_R_SYM (rel->r_info);
6701
          sym = local_syms + r_symndx;
6702
          if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6703
            /* Adjust the addend appropriately.  */
6704
            addend += local_sections[r_symndx]->output_offset;
6705
 
6706
          /* If the relocation is for a R_MIPS_HI16 or R_MIPS_GOT16,
6707
             then we only want to write out the high-order 16 bits.
6708
             The subsequent R_MIPS_LO16 will handle the low-order bits.  */
6709
          if (r_type == R_MIPS_HI16 || r_type == R_MIPS_GOT16
6710
              || r_type == R_MIPS_GNU_REL_HI16)
6711
            addend = mips_elf_high (addend);
6712
          /* If the relocation is for an R_MIPS_26 relocation, then
6713
             the two low-order bits are not stored in the object file;
6714
             they are implicitly zero.  */
6715
          else if (r_type == R_MIPS_26 || r_type == R_MIPS16_26
6716
                   || r_type == R_MIPS_GNU_REL16_S2)
6717
            addend >>= 2;
6718
 
6719
          if (rela_relocation_p)
6720
            /* If this is a RELA relocation, just update the addend.
6721
               We have to cast away constness for REL.  */
6722
            rel->r_addend = addend;
6723
          else
6724
            {
6725
              /* Otherwise, we have to write the value back out.  Note
6726
                 that we use the source mask, rather than the
6727
                 destination mask because the place to which we are
6728
                 writing will be source of the addend in the final
6729
                 link.  */
6730
              addend &= howto->src_mask;
6731
 
6732
              if (r_type == R_MIPS_64 && !ABI_64_P (output_bfd))
6733
                /* See the comment above about using R_MIPS_64 in the 32-bit
6734
                   ABI.  Here, we need to update the addend.  It would be
6735
                   possible to get away with just using the R_MIPS_32 reloc
6736
                   but for endianness.  */
6737
                {
6738
                  bfd_vma sign_bits;
6739
                  bfd_vma low_bits;
6740
                  bfd_vma high_bits;
6741
 
6742
                  if (addend & 0x80000000u)
6743
                    sign_bits = 0xffffffffu;
6744
                  else
6745
                    sign_bits = 0;
6746
 
6747
                  /* If we don't know that we have a 64-bit type,
6748
                     do two separate stores.  */
6749
                  if (bfd_big_endian (input_bfd))
6750
                    {
6751
                      /* Store the sign-bits (which are most significant)
6752
                         first.  */
6753
                      low_bits = sign_bits;
6754
                      high_bits = addend;
6755
                    }
6756
                  else
6757
                    {
6758
                      low_bits = addend;
6759
                      high_bits = sign_bits;
6760
                    }
6761
                  bfd_put_32 (input_bfd, low_bits,
6762
                              contents + rel->r_offset);
6763
                  bfd_put_32 (input_bfd, high_bits,
6764
                              contents + rel->r_offset + 4);
6765
                  continue;
6766
                }
6767
 
6768
              if (!mips_elf_perform_relocation (info, howto, rel, addend,
6769
                                                input_bfd,  input_section,
6770
                                                contents, false))
6771
                return false;
6772
            }
6773
 
6774
          /* Go on to the next relocation.  */
6775
          continue;
6776
        }
6777
 
6778
      /* In the N32 and 64-bit ABIs there may be multiple consecutive
6779
         relocations for the same offset.  In that case we are
6780
         supposed to treat the output of each relocation as the addend
6781
         for the next.  */
6782
      if (rel + 1 < relend
6783
          && rel->r_offset == rel[1].r_offset
6784
          && ELF32_R_TYPE (rel[1].r_info) != R_MIPS_NONE)
6785
        use_saved_addend_p = true;
6786
      else
6787
        use_saved_addend_p = false;
6788
 
6789
      /* Figure out what value we are supposed to relocate.  */
6790
      switch (mips_elf_calculate_relocation (output_bfd,
6791
                                             input_bfd,
6792
                                             input_section,
6793
                                             info,
6794
                                             rel,
6795
                                             addend,
6796
                                             howto,
6797
                                             local_syms,
6798
                                             local_sections,
6799
                                             &value,
6800
                                             &name,
6801
                                             &require_jalx))
6802
        {
6803
        case bfd_reloc_continue:
6804
          /* There's nothing to do.  */
6805
          continue;
6806
 
6807
        case bfd_reloc_undefined:
6808
          /* mips_elf_calculate_relocation already called the
6809
             undefined_symbol callback.  There's no real point in
6810
             trying to perform the relocation at this point, so we
6811
             just skip ahead to the next relocation.  */
6812
          continue;
6813
 
6814
        case bfd_reloc_notsupported:
6815
          abort ();
6816
          break;
6817
 
6818
        case bfd_reloc_overflow:
6819
          if (use_saved_addend_p)
6820
            /* Ignore overflow until we reach the last relocation for
6821
               a given location.  */
6822
            ;
6823
          else
6824
            {
6825
              BFD_ASSERT (name != NULL);
6826
              if (! ((*info->callbacks->reloc_overflow)
6827
                     (info, name, howto->name, (bfd_vma) 0,
6828
                      input_bfd, input_section, rel->r_offset)))
6829
                return false;
6830
            }
6831
          break;
6832
 
6833
        case bfd_reloc_ok:
6834
          break;
6835
 
6836
        default:
6837
          abort ();
6838
          break;
6839
        }
6840
 
6841
      /* If we've got another relocation for the address, keep going
6842
         until we reach the last one.  */
6843
      if (use_saved_addend_p)
6844
        {
6845
          addend = value;
6846
          continue;
6847
        }
6848
 
6849
      if (r_type == R_MIPS_64 && !ABI_64_P (output_bfd))
6850
        /* See the comment above about using R_MIPS_64 in the 32-bit
6851
           ABI.  Until now, we've been using the HOWTO for R_MIPS_32;
6852
           that calculated the right value.  Now, however, we
6853
           sign-extend the 32-bit result to 64-bits, and store it as a
6854
           64-bit value.  We are especially generous here in that we
6855
           go to extreme lengths to support this usage on systems with
6856
           only a 32-bit VMA.  */
6857
        {
6858
          bfd_vma sign_bits;
6859
          bfd_vma low_bits;
6860
          bfd_vma high_bits;
6861
 
6862
          if (value & 0x80000000u)
6863
            sign_bits = 0xffffffffu;
6864
          else
6865
            sign_bits = 0;
6866
 
6867
          /* If we don't know that we have a 64-bit type,
6868
             do two separate stores.  */
6869
          if (bfd_big_endian (input_bfd))
6870
            {
6871
              /* Undo what we did above.  */
6872
              rel->r_offset -= 4;
6873
              /* Store the sign-bits (which are most significant)
6874
                 first.  */
6875
              low_bits = sign_bits;
6876
              high_bits = value;
6877
            }
6878
          else
6879
            {
6880
              low_bits = value;
6881
              high_bits = sign_bits;
6882
            }
6883
          bfd_put_32 (input_bfd, low_bits,
6884
                      contents + rel->r_offset);
6885
          bfd_put_32 (input_bfd, high_bits,
6886
                      contents + rel->r_offset + 4);
6887
          continue;
6888
        }
6889
 
6890
      /* Actually perform the relocation.  */
6891
      if (!mips_elf_perform_relocation (info, howto, rel, value, input_bfd,
6892
                                        input_section, contents,
6893
                                        require_jalx))
6894
        return false;
6895
    }
6896
 
6897
  return true;
6898
}
6899
 
6900
/* This hook function is called before the linker writes out a global
6901
   symbol.  We mark symbols as small common if appropriate.  This is
6902
   also where we undo the increment of the value for a mips16 symbol.  */
6903
 
6904
/*ARGSIGNORED*/
6905
boolean
6906
_bfd_mips_elf_link_output_symbol_hook (abfd, info, name, sym, input_sec)
6907
     bfd *abfd ATTRIBUTE_UNUSED;
6908
     struct bfd_link_info *info ATTRIBUTE_UNUSED;
6909
     const char *name ATTRIBUTE_UNUSED;
6910
     Elf_Internal_Sym *sym;
6911
     asection *input_sec;
6912
{
6913
  /* If we see a common symbol, which implies a relocatable link, then
6914
     if a symbol was small common in an input file, mark it as small
6915
     common in the output file.  */
6916
  if (sym->st_shndx == SHN_COMMON
6917
      && strcmp (input_sec->name, ".scommon") == 0)
6918
    sym->st_shndx = SHN_MIPS_SCOMMON;
6919
 
6920
  if (sym->st_other == STO_MIPS16
6921
      && (sym->st_value & 1) != 0)
6922
    --sym->st_value;
6923
 
6924
  return true;
6925
}
6926
 
6927
/* Functions for the dynamic linker.  */
6928
 
6929
/* The name of the dynamic interpreter.  This is put in the .interp
6930
   section.  */
6931
 
6932
#define ELF_DYNAMIC_INTERPRETER(abfd)           \
6933
   (ABI_N32_P (abfd) ? "/usr/lib32/libc.so.1"   \
6934
    : ABI_64_P (abfd) ? "/usr/lib64/libc.so.1"  \
6935
    : "/usr/lib/libc.so.1")
6936
 
6937
/* Create dynamic sections when linking against a dynamic object.  */
6938
 
6939
boolean
6940
_bfd_mips_elf_create_dynamic_sections (abfd, info)
6941
     bfd *abfd;
6942
     struct bfd_link_info *info;
6943
{
6944
  struct elf_link_hash_entry *h;
6945
  flagword flags;
6946
  register asection *s;
6947
  const char * const *namep;
6948
 
6949
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
6950
           | SEC_LINKER_CREATED | SEC_READONLY);
6951
 
6952
  /* Mips ABI requests the .dynamic section to be read only.  */
6953
  s = bfd_get_section_by_name (abfd, ".dynamic");
6954
  if (s != NULL)
6955
    {
6956
      if (! bfd_set_section_flags (abfd, s, flags))
6957
        return false;
6958
    }
6959
 
6960
  /* We need to create .got section.  */
6961
  if (! mips_elf_create_got_section (abfd, info))
6962
    return false;
6963
 
6964
  /* Create the .msym section on IRIX6.  It is used by the dynamic
6965
     linker to speed up dynamic relocations, and to avoid computing
6966
     the ELF hash for symbols.  */
6967
  if (IRIX_COMPAT (abfd) == ict_irix6
6968
      && !mips_elf_create_msym_section (abfd))
6969
    return false;
6970
 
6971
  /* Create .stub section.  */
6972
  if (bfd_get_section_by_name (abfd,
6973
                               MIPS_ELF_STUB_SECTION_NAME (abfd)) == NULL)
6974
    {
6975
      s = bfd_make_section (abfd, MIPS_ELF_STUB_SECTION_NAME (abfd));
6976
      if (s == NULL
6977
          || ! bfd_set_section_flags (abfd, s, flags | SEC_CODE)
6978
          || ! bfd_set_section_alignment (abfd, s,
6979
                                          MIPS_ELF_LOG_FILE_ALIGN (abfd)))
6980
        return false;
6981
    }
6982
 
6983
  if (IRIX_COMPAT (abfd) == ict_irix5
6984
      && !info->shared
6985
      && bfd_get_section_by_name (abfd, ".rld_map") == NULL)
6986
    {
6987
      s = bfd_make_section (abfd, ".rld_map");
6988
      if (s == NULL
6989
          || ! bfd_set_section_flags (abfd, s, flags & ~SEC_READONLY)
6990
          || ! bfd_set_section_alignment (abfd, s,
6991
                                          MIPS_ELF_LOG_FILE_ALIGN (abfd)))
6992
        return false;
6993
    }
6994
 
6995
  /* On IRIX5, we adjust add some additional symbols and change the
6996
     alignments of several sections.  There is no ABI documentation
6997
     indicating that this is necessary on IRIX6, nor any evidence that
6998
     the linker takes such action.  */
6999
  if (IRIX_COMPAT (abfd) == ict_irix5)
7000
    {
7001
      for (namep = mips_elf_dynsym_rtproc_names; *namep != NULL; namep++)
7002
        {
7003
          h = NULL;
7004
          if (! (_bfd_generic_link_add_one_symbol
7005
                 (info, abfd, *namep, BSF_GLOBAL, bfd_und_section_ptr,
7006
                  (bfd_vma) 0, (const char *) NULL, false,
7007
                  get_elf_backend_data (abfd)->collect,
7008
                  (struct bfd_link_hash_entry **) &h)))
7009
            return false;
7010
          h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF;
7011
          h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
7012
          h->type = STT_SECTION;
7013
 
7014
          if (! bfd_elf32_link_record_dynamic_symbol (info, h))
7015
            return false;
7016
        }
7017
 
7018
      /* We need to create a .compact_rel section.  */
7019
      if (! mips_elf_create_compact_rel_section (abfd, info))
7020
        return false;
7021
 
7022
      /* Change aligments of some sections.  */
7023
      s = bfd_get_section_by_name (abfd, ".hash");
7024
      if (s != NULL)
7025
        bfd_set_section_alignment (abfd, s, 4);
7026
      s = bfd_get_section_by_name (abfd, ".dynsym");
7027
      if (s != NULL)
7028
        bfd_set_section_alignment (abfd, s, 4);
7029
      s = bfd_get_section_by_name (abfd, ".dynstr");
7030
      if (s != NULL)
7031
        bfd_set_section_alignment (abfd, s, 4);
7032
      s = bfd_get_section_by_name (abfd, ".reginfo");
7033
      if (s != NULL)
7034
        bfd_set_section_alignment (abfd, s, 4);
7035
      s = bfd_get_section_by_name (abfd, ".dynamic");
7036
      if (s != NULL)
7037
        bfd_set_section_alignment (abfd, s, 4);
7038
    }
7039
 
7040
  if (!info->shared)
7041
    {
7042
      h = NULL;
7043
      if (! (_bfd_generic_link_add_one_symbol
7044
             (info, abfd, "_DYNAMIC_LINK", BSF_GLOBAL, bfd_abs_section_ptr,
7045
              (bfd_vma) 0, (const char *) NULL, false,
7046
              get_elf_backend_data (abfd)->collect,
7047
              (struct bfd_link_hash_entry **) &h)))
7048
        return false;
7049
      h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF;
7050
      h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
7051
      h->type = STT_SECTION;
7052
 
7053
      if (! bfd_elf32_link_record_dynamic_symbol (info, h))
7054
        return false;
7055
 
7056
      if (! mips_elf_hash_table (info)->use_rld_obj_head)
7057
        {
7058
          /* __rld_map is a four byte word located in the .data section
7059
             and is filled in by the rtld to contain a pointer to
7060
             the _r_debug structure. Its symbol value will be set in
7061
             mips_elf_finish_dynamic_symbol.  */
7062
          s = bfd_get_section_by_name (abfd, ".rld_map");
7063
          BFD_ASSERT (s != NULL);
7064
 
7065
          h = NULL;
7066
          if (! (_bfd_generic_link_add_one_symbol
7067
                 (info, abfd, "__rld_map", BSF_GLOBAL, s,
7068
                  (bfd_vma) 0, (const char *) NULL, false,
7069
                  get_elf_backend_data (abfd)->collect,
7070
                  (struct bfd_link_hash_entry **) &h)))
7071
            return false;
7072
          h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF;
7073
          h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
7074
          h->type = STT_OBJECT;
7075
 
7076
          if (! bfd_elf32_link_record_dynamic_symbol (info, h))
7077
            return false;
7078
        }
7079
    }
7080
 
7081
  return true;
7082
}
7083
 
7084
/* Create the .compact_rel section.  */
7085
 
7086
static boolean
7087
mips_elf_create_compact_rel_section (abfd, info)
7088
     bfd *abfd;
7089
     struct bfd_link_info *info ATTRIBUTE_UNUSED;
7090
{
7091
  flagword flags;
7092
  register asection *s;
7093
 
7094
  if (bfd_get_section_by_name (abfd, ".compact_rel") == NULL)
7095
    {
7096
      flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED
7097
               | SEC_READONLY);
7098
 
7099
      s = bfd_make_section (abfd, ".compact_rel");
7100
      if (s == NULL
7101
          || ! bfd_set_section_flags (abfd, s, flags)
7102
          || ! bfd_set_section_alignment (abfd, s,
7103
                                          MIPS_ELF_LOG_FILE_ALIGN (abfd)))
7104
        return false;
7105
 
7106
      s->_raw_size = sizeof (Elf32_External_compact_rel);
7107
    }
7108
 
7109
  return true;
7110
}
7111
 
7112
/* Create the .got section to hold the global offset table. */
7113
 
7114
static boolean
7115
mips_elf_create_got_section (abfd, info)
7116
     bfd *abfd;
7117
     struct bfd_link_info *info;
7118
{
7119
  flagword flags;
7120
  register asection *s;
7121
  struct elf_link_hash_entry *h;
7122
  struct mips_got_info *g;
7123
 
7124
  /* This function may be called more than once.  */
7125
  if (mips_elf_got_section (abfd))
7126
    return true;
7127
 
7128
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
7129
           | SEC_LINKER_CREATED);
7130
 
7131
  s = bfd_make_section (abfd, ".got");
7132
  if (s == NULL
7133
      || ! bfd_set_section_flags (abfd, s, flags)
7134
      || ! bfd_set_section_alignment (abfd, s, 4))
7135
    return false;
7136
 
7137
  /* Define the symbol _GLOBAL_OFFSET_TABLE_.  We don't do this in the
7138
     linker script because we don't want to define the symbol if we
7139
     are not creating a global offset table.  */
7140
  h = NULL;
7141
  if (! (_bfd_generic_link_add_one_symbol
7142
         (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
7143
          (bfd_vma) 0, (const char *) NULL, false,
7144
          get_elf_backend_data (abfd)->collect,
7145
          (struct bfd_link_hash_entry **) &h)))
7146
    return false;
7147
  h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF;
7148
  h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
7149
  h->type = STT_OBJECT;
7150
 
7151
  if (info->shared
7152
      && ! bfd_elf32_link_record_dynamic_symbol (info, h))
7153
    return false;
7154
 
7155
  /* The first several global offset table entries are reserved.  */
7156
  s->_raw_size = MIPS_RESERVED_GOTNO * MIPS_ELF_GOT_SIZE (abfd);
7157
 
7158
  g = (struct mips_got_info *) bfd_alloc (abfd,
7159
                                          sizeof (struct mips_got_info));
7160
  if (g == NULL)
7161
    return false;
7162
  g->global_gotsym = NULL;
7163
  g->local_gotno = MIPS_RESERVED_GOTNO;
7164
  g->assigned_gotno = MIPS_RESERVED_GOTNO;
7165
  if (elf_section_data (s) == NULL)
7166
    {
7167
      s->used_by_bfd =
7168
        (PTR) bfd_zalloc (abfd, sizeof (struct bfd_elf_section_data));
7169
      if (elf_section_data (s) == NULL)
7170
        return false;
7171
    }
7172
  elf_section_data (s)->tdata = (PTR) g;
7173
  elf_section_data (s)->this_hdr.sh_flags
7174
    |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
7175
 
7176
  return true;
7177
}
7178
 
7179
/* Returns the .msym section for ABFD, creating it if it does not
7180
   already exist.  Returns NULL to indicate error.  */
7181
 
7182
static asection *
7183
mips_elf_create_msym_section (abfd)
7184
     bfd *abfd;
7185
{
7186
  asection *s;
7187
 
7188
  s = bfd_get_section_by_name (abfd, MIPS_ELF_MSYM_SECTION_NAME (abfd));
7189
  if (!s)
7190
    {
7191
      s = bfd_make_section (abfd, MIPS_ELF_MSYM_SECTION_NAME (abfd));
7192
      if (!s
7193
          || !bfd_set_section_flags (abfd, s,
7194
                                     SEC_ALLOC
7195
                                     | SEC_LOAD
7196
                                     | SEC_HAS_CONTENTS
7197
                                     | SEC_LINKER_CREATED
7198
                                     | SEC_READONLY)
7199
          || !bfd_set_section_alignment (abfd, s,
7200
                                         MIPS_ELF_LOG_FILE_ALIGN (abfd)))
7201
        return NULL;
7202
    }
7203
 
7204
  return s;
7205
}
7206
 
7207
/* Add room for N relocations to the .rel.dyn section in ABFD.  */
7208
 
7209
static void
7210
mips_elf_allocate_dynamic_relocations (abfd, n)
7211
     bfd *abfd;
7212
     unsigned int n;
7213
{
7214
  asection *s;
7215
 
7216
  s = bfd_get_section_by_name (abfd, MIPS_ELF_REL_DYN_SECTION_NAME (abfd));
7217
  BFD_ASSERT (s != NULL);
7218
 
7219
  if (s->_raw_size == 0)
7220
    {
7221
      /* Make room for a null element. */
7222
      s->_raw_size += MIPS_ELF_REL_SIZE (abfd);
7223
      ++s->reloc_count;
7224
    }
7225
  s->_raw_size += n * MIPS_ELF_REL_SIZE (abfd);
7226
}
7227
 
7228
/* Look through the relocs for a section during the first phase, and
7229
   allocate space in the global offset table.  */
7230
 
7231
boolean
7232
_bfd_mips_elf_check_relocs (abfd, info, sec, relocs)
7233
     bfd *abfd;
7234
     struct bfd_link_info *info;
7235
     asection *sec;
7236
     const Elf_Internal_Rela *relocs;
7237
{
7238
  const char *name;
7239
  bfd *dynobj;
7240
  Elf_Internal_Shdr *symtab_hdr;
7241
  struct elf_link_hash_entry **sym_hashes;
7242
  struct mips_got_info *g;
7243
  size_t extsymoff;
7244
  const Elf_Internal_Rela *rel;
7245
  const Elf_Internal_Rela *rel_end;
7246
  asection *sgot;
7247
  asection *sreloc;
7248
  struct elf_backend_data *bed;
7249
 
7250
  if (info->relocateable)
7251
    return true;
7252
 
7253
  dynobj = elf_hash_table (info)->dynobj;
7254
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
7255
  sym_hashes = elf_sym_hashes (abfd);
7256
  extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
7257
 
7258
  /* Check for the mips16 stub sections.  */
7259
 
7260
  name = bfd_get_section_name (abfd, sec);
7261
  if (strncmp (name, FN_STUB, sizeof FN_STUB - 1) == 0)
7262
    {
7263
      unsigned long r_symndx;
7264
 
7265
      /* Look at the relocation information to figure out which symbol
7266
         this is for.  */
7267
 
7268
      r_symndx = ELF32_R_SYM (relocs->r_info);
7269
 
7270
      if (r_symndx < extsymoff
7271
          || sym_hashes[r_symndx - extsymoff] == NULL)
7272
        {
7273
          asection *o;
7274
 
7275
          /* This stub is for a local symbol.  This stub will only be
7276
             needed if there is some relocation in this BFD, other
7277
             than a 16 bit function call, which refers to this symbol.  */
7278
          for (o = abfd->sections; o != NULL; o = o->next)
7279
            {
7280
              Elf_Internal_Rela *sec_relocs;
7281
              const Elf_Internal_Rela *r, *rend;
7282
 
7283
              /* We can ignore stub sections when looking for relocs.  */
7284
              if ((o->flags & SEC_RELOC) == 0
7285
                  || o->reloc_count == 0
7286
                  || strncmp (bfd_get_section_name (abfd, o), FN_STUB,
7287
                              sizeof FN_STUB - 1) == 0
7288
                  || strncmp (bfd_get_section_name (abfd, o), CALL_STUB,
7289
                              sizeof CALL_STUB - 1) == 0
7290
                  || strncmp (bfd_get_section_name (abfd, o), CALL_FP_STUB,
7291
                              sizeof CALL_FP_STUB - 1) == 0)
7292
                continue;
7293
 
7294
              sec_relocs = (_bfd_elf32_link_read_relocs
7295
                            (abfd, o, (PTR) NULL,
7296
                             (Elf_Internal_Rela *) NULL,
7297
                             info->keep_memory));
7298
              if (sec_relocs == NULL)
7299
                return false;
7300
 
7301
              rend = sec_relocs + o->reloc_count;
7302
              for (r = sec_relocs; r < rend; r++)
7303
                if (ELF32_R_SYM (r->r_info) == r_symndx
7304
                    && ELF32_R_TYPE (r->r_info) != R_MIPS16_26)
7305
                  break;
7306
 
7307
              if (! info->keep_memory)
7308
                free (sec_relocs);
7309
 
7310
              if (r < rend)
7311
                break;
7312
            }
7313
 
7314
          if (o == NULL)
7315
            {
7316
              /* There is no non-call reloc for this stub, so we do
7317
                 not need it.  Since this function is called before
7318
                 the linker maps input sections to output sections, we
7319
                 can easily discard it by setting the SEC_EXCLUDE
7320
                 flag.  */
7321
              sec->flags |= SEC_EXCLUDE;
7322
              return true;
7323
            }
7324
 
7325
          /* Record this stub in an array of local symbol stubs for
7326
             this BFD. */
7327
          if (elf_tdata (abfd)->local_stubs == NULL)
7328
            {
7329
              unsigned long symcount;
7330
              asection **n;
7331
 
7332
              if (elf_bad_symtab (abfd))
7333
                symcount = symtab_hdr->sh_size / symtab_hdr->sh_entsize;
7334
              else
7335
                symcount = symtab_hdr->sh_info;
7336
              n = (asection **) bfd_zalloc (abfd,
7337
                                            symcount * sizeof (asection *));
7338
              if (n == NULL)
7339
                return false;
7340
              elf_tdata (abfd)->local_stubs = n;
7341
            }
7342
 
7343
          elf_tdata (abfd)->local_stubs[r_symndx] = sec;
7344
 
7345
          /* We don't need to set mips16_stubs_seen in this case.
7346
             That flag is used to see whether we need to look through
7347
             the global symbol table for stubs.  We don't need to set
7348
             it here, because we just have a local stub.  */
7349
        }
7350
      else
7351
        {
7352
          struct mips_elf_link_hash_entry *h;
7353
 
7354
          h = ((struct mips_elf_link_hash_entry *)
7355
               sym_hashes[r_symndx - extsymoff]);
7356
 
7357
          /* H is the symbol this stub is for.  */
7358
 
7359
          h->fn_stub = sec;
7360
          mips_elf_hash_table (info)->mips16_stubs_seen = true;
7361
        }
7362
    }
7363
  else if (strncmp (name, CALL_STUB, sizeof CALL_STUB - 1) == 0
7364
           || strncmp (name, CALL_FP_STUB, sizeof CALL_FP_STUB - 1) == 0)
7365
    {
7366
      unsigned long r_symndx;
7367
      struct mips_elf_link_hash_entry *h;
7368
      asection **loc;
7369
 
7370
      /* Look at the relocation information to figure out which symbol
7371
         this is for.  */
7372
 
7373
      r_symndx = ELF32_R_SYM (relocs->r_info);
7374
 
7375
      if (r_symndx < extsymoff
7376
          || sym_hashes[r_symndx - extsymoff] == NULL)
7377
        {
7378
          /* This stub was actually built for a static symbol defined
7379
             in the same file.  We assume that all static symbols in
7380
             mips16 code are themselves mips16, so we can simply
7381
             discard this stub.  Since this function is called before
7382
             the linker maps input sections to output sections, we can
7383
             easily discard it by setting the SEC_EXCLUDE flag.  */
7384
          sec->flags |= SEC_EXCLUDE;
7385
          return true;
7386
        }
7387
 
7388
      h = ((struct mips_elf_link_hash_entry *)
7389
           sym_hashes[r_symndx - extsymoff]);
7390
 
7391
      /* H is the symbol this stub is for.  */
7392
 
7393
      if (strncmp (name, CALL_FP_STUB, sizeof CALL_FP_STUB - 1) == 0)
7394
        loc = &h->call_fp_stub;
7395
      else
7396
        loc = &h->call_stub;
7397
 
7398
      /* If we already have an appropriate stub for this function, we
7399
         don't need another one, so we can discard this one.  Since
7400
         this function is called before the linker maps input sections
7401
         to output sections, we can easily discard it by setting the
7402
         SEC_EXCLUDE flag.  We can also discard this section if we
7403
         happen to already know that this is a mips16 function; it is
7404
         not necessary to check this here, as it is checked later, but
7405
         it is slightly faster to check now.  */
7406
      if (*loc != NULL || h->root.other == STO_MIPS16)
7407
        {
7408
          sec->flags |= SEC_EXCLUDE;
7409
          return true;
7410
        }
7411
 
7412
      *loc = sec;
7413
      mips_elf_hash_table (info)->mips16_stubs_seen = true;
7414
    }
7415
 
7416
  if (dynobj == NULL)
7417
    {
7418
      sgot = NULL;
7419
      g = NULL;
7420
    }
7421
  else
7422
    {
7423
      sgot = mips_elf_got_section (dynobj);
7424
      if (sgot == NULL)
7425
        g = NULL;
7426
      else
7427
        {
7428
          BFD_ASSERT (elf_section_data (sgot) != NULL);
7429
          g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
7430
          BFD_ASSERT (g != NULL);
7431
        }
7432
    }
7433
 
7434
  sreloc = NULL;
7435
  bed = get_elf_backend_data (abfd);
7436
  rel_end = relocs + sec->reloc_count * bed->s->int_rels_per_ext_rel;
7437
  for (rel = relocs; rel < rel_end; ++rel)
7438
    {
7439
      unsigned long r_symndx;
7440
      int r_type;
7441
      struct elf_link_hash_entry *h;
7442
 
7443
      r_symndx = ELF32_R_SYM (rel->r_info);
7444
      r_type = ELF32_R_TYPE (rel->r_info);
7445
 
7446
      if (r_symndx < extsymoff)
7447
        h = NULL;
7448
      else
7449
        {
7450
          h = sym_hashes[r_symndx - extsymoff];
7451
 
7452
          /* This may be an indirect symbol created because of a version.  */
7453
          if (h != NULL)
7454
            {
7455
              while (h->root.type == bfd_link_hash_indirect)
7456
                h = (struct elf_link_hash_entry *) h->root.u.i.link;
7457
            }
7458
        }
7459
 
7460
      /* Some relocs require a global offset table.  */
7461
      if (dynobj == NULL || sgot == NULL)
7462
        {
7463
          switch (r_type)
7464
            {
7465
            case R_MIPS_GOT16:
7466
            case R_MIPS_CALL16:
7467
            case R_MIPS_CALL_HI16:
7468
            case R_MIPS_CALL_LO16:
7469
            case R_MIPS_GOT_HI16:
7470
            case R_MIPS_GOT_LO16:
7471
            case R_MIPS_GOT_PAGE:
7472
            case R_MIPS_GOT_OFST:
7473
            case R_MIPS_GOT_DISP:
7474
              if (dynobj == NULL)
7475
                elf_hash_table (info)->dynobj = dynobj = abfd;
7476
              if (! mips_elf_create_got_section (dynobj, info))
7477
                return false;
7478
              g = mips_elf_got_info (dynobj, &sgot);
7479
              break;
7480
 
7481
            case R_MIPS_32:
7482
            case R_MIPS_REL32:
7483
            case R_MIPS_64:
7484
              if (dynobj == NULL
7485
                  && (info->shared || h != NULL)
7486
                  && (sec->flags & SEC_ALLOC) != 0)
7487
                elf_hash_table (info)->dynobj = dynobj = abfd;
7488
              break;
7489
 
7490
            default:
7491
              break;
7492
            }
7493
        }
7494
 
7495
      if (!h && (r_type == R_MIPS_CALL_LO16
7496
                 || r_type == R_MIPS_GOT_LO16
7497
                 || r_type == R_MIPS_GOT_DISP))
7498
        {
7499
          /* We may need a local GOT entry for this relocation.  We
7500
             don't count R_MIPS_GOT_PAGE because we can estimate the
7501
             maximum number of pages needed by looking at the size of
7502
             the segment.  Similar comments apply to R_MIPS_GOT16.  We
7503
             don't count R_MIPS_GOT_HI16, or R_MIPS_CALL_HI16 because
7504
             these are always followed by an R_MIPS_GOT_LO16 or
7505
             R_MIPS_CALL_LO16.
7506
 
7507
             This estimation is very conservative since we can merge
7508
             duplicate entries in the GOT.  In order to be less
7509
             conservative, we could actually build the GOT here,
7510
             rather than in relocate_section.  */
7511
          g->local_gotno++;
7512
          sgot->_raw_size += MIPS_ELF_GOT_SIZE (dynobj);
7513
        }
7514
 
7515
      switch (r_type)
7516
        {
7517
        case R_MIPS_CALL16:
7518
          if (h == NULL)
7519
            {
7520
              (*_bfd_error_handler)
7521
                (_("%s: CALL16 reloc at 0x%lx not against global symbol"),
7522
                 bfd_get_filename (abfd), (unsigned long) rel->r_offset);
7523
              bfd_set_error (bfd_error_bad_value);
7524
              return false;
7525
            }
7526
          /* Fall through.  */
7527
 
7528
        case R_MIPS_CALL_HI16:
7529
        case R_MIPS_CALL_LO16:
7530
          if (h != NULL)
7531
            {
7532
              /* This symbol requires a global offset table entry.  */
7533
              if (!mips_elf_record_global_got_symbol (h, info, g))
7534
                return false;
7535
 
7536
              /* We need a stub, not a plt entry for the undefined
7537
                 function.  But we record it as if it needs plt.  See
7538
                 elf_adjust_dynamic_symbol in elflink.h.  */
7539
              h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
7540
              h->type = STT_FUNC;
7541
            }
7542
          break;
7543
 
7544
        case R_MIPS_GOT16:
7545
        case R_MIPS_GOT_HI16:
7546
        case R_MIPS_GOT_LO16:
7547
        case R_MIPS_GOT_DISP:
7548
          /* This symbol requires a global offset table entry.  */
7549
          if (h && !mips_elf_record_global_got_symbol (h, info, g))
7550
            return false;
7551
          break;
7552
 
7553
        case R_MIPS_32:
7554
        case R_MIPS_REL32:
7555
        case R_MIPS_64:
7556
          if ((info->shared || h != NULL)
7557
              && (sec->flags & SEC_ALLOC) != 0)
7558
            {
7559
              if (sreloc == NULL)
7560
                {
7561
                  const char *name = MIPS_ELF_REL_DYN_SECTION_NAME (dynobj);
7562
 
7563
                  sreloc = bfd_get_section_by_name (dynobj, name);
7564
                  if (sreloc == NULL)
7565
                    {
7566
                      sreloc = bfd_make_section (dynobj, name);
7567
                      if (sreloc == NULL
7568
                          || ! bfd_set_section_flags (dynobj, sreloc,
7569
                                                      (SEC_ALLOC
7570
                                                       | SEC_LOAD
7571
                                                       | SEC_HAS_CONTENTS
7572
                                                       | SEC_IN_MEMORY
7573
                                                       | SEC_LINKER_CREATED
7574
                                                       | SEC_READONLY))
7575
                          || ! bfd_set_section_alignment (dynobj, sreloc,
7576
                                                          4))
7577
                        return false;
7578
                    }
7579
                }
7580
              if (info->shared)
7581
                /* When creating a shared object, we must copy these
7582
                   reloc types into the output file as R_MIPS_REL32
7583
                   relocs.  We make room for this reloc in the
7584
                   .rel.dyn reloc section.  */
7585
                mips_elf_allocate_dynamic_relocations (dynobj, 1);
7586
              else
7587
                {
7588
                  struct mips_elf_link_hash_entry *hmips;
7589
 
7590
                  /* We only need to copy this reloc if the symbol is
7591
                     defined in a dynamic object.  */
7592
                  hmips = (struct mips_elf_link_hash_entry *) h;
7593
                  ++hmips->possibly_dynamic_relocs;
7594
                }
7595
 
7596
              /* Even though we don't directly need a GOT entry for
7597
                 this symbol, a symbol must have a dynamic symbol
7598
                 table index greater that DT_MIPS_GOTSYM if there are
7599
                 dynamic relocations against it.  */
7600
              if (h != NULL
7601
                  && !mips_elf_record_global_got_symbol (h, info, g))
7602
                return false;
7603
            }
7604
 
7605
          if (SGI_COMPAT (dynobj))
7606
            mips_elf_hash_table (info)->compact_rel_size +=
7607
              sizeof (Elf32_External_crinfo);
7608
          break;
7609
 
7610
        case R_MIPS_26:
7611
        case R_MIPS_GPREL16:
7612
        case R_MIPS_LITERAL:
7613
        case R_MIPS_GPREL32:
7614
          if (SGI_COMPAT (dynobj))
7615
            mips_elf_hash_table (info)->compact_rel_size +=
7616
              sizeof (Elf32_External_crinfo);
7617
          break;
7618
 
7619
          /* This relocation describes the C++ object vtable hierarchy.
7620
             Reconstruct it for later use during GC.  */
7621
        case R_MIPS_GNU_VTINHERIT:
7622
          if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
7623
            return false;
7624
          break;
7625
 
7626
          /* This relocation describes which C++ vtable entries are actually
7627
             used.  Record for later use during GC.  */
7628
        case R_MIPS_GNU_VTENTRY:
7629
          if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_offset))
7630
            return false;
7631
          break;
7632
 
7633
        default:
7634
          break;
7635
        }
7636
 
7637
      /* If this reloc is not a 16 bit call, and it has a global
7638
         symbol, then we will need the fn_stub if there is one.
7639
         References from a stub section do not count. */
7640
      if (h != NULL
7641
          && r_type != R_MIPS16_26
7642
          && strncmp (bfd_get_section_name (abfd, sec), FN_STUB,
7643
                      sizeof FN_STUB - 1) != 0
7644
          && strncmp (bfd_get_section_name (abfd, sec), CALL_STUB,
7645
                      sizeof CALL_STUB - 1) != 0
7646
          && strncmp (bfd_get_section_name (abfd, sec), CALL_FP_STUB,
7647
                      sizeof CALL_FP_STUB - 1) != 0)
7648
        {
7649
          struct mips_elf_link_hash_entry *mh;
7650
 
7651
          mh = (struct mips_elf_link_hash_entry *) h;
7652
          mh->need_fn_stub = true;
7653
        }
7654
    }
7655
 
7656
  return true;
7657
}
7658
 
7659
/* Return the section that should be marked against GC for a given
7660
   relocation.  */
7661
 
7662
asection *
7663
_bfd_mips_elf_gc_mark_hook (abfd, info, rel, h, sym)
7664
     bfd *abfd;
7665
     struct bfd_link_info *info ATTRIBUTE_UNUSED;
7666
     Elf_Internal_Rela *rel;
7667
     struct elf_link_hash_entry *h;
7668
     Elf_Internal_Sym *sym;
7669
{
7670
  /* ??? Do mips16 stub sections need to be handled special?  */
7671
 
7672
  if (h != NULL)
7673
    {
7674
      switch (ELF32_R_TYPE (rel->r_info))
7675
        {
7676
        case R_MIPS_GNU_VTINHERIT:
7677
        case R_MIPS_GNU_VTENTRY:
7678
          break;
7679
 
7680
        default:
7681
          switch (h->root.type)
7682
            {
7683
            case bfd_link_hash_defined:
7684
            case bfd_link_hash_defweak:
7685
              return h->root.u.def.section;
7686
 
7687
            case bfd_link_hash_common:
7688
              return h->root.u.c.p->section;
7689
 
7690
            default:
7691
              break;
7692
            }
7693
        }
7694
    }
7695
  else
7696
    {
7697
      if (!(elf_bad_symtab (abfd)
7698
            && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
7699
          && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
7700
                && sym->st_shndx != SHN_COMMON))
7701
        {
7702
          return bfd_section_from_elf_index (abfd, sym->st_shndx);
7703
        }
7704
    }
7705
 
7706
  return NULL;
7707
}
7708
 
7709
/* Update the got entry reference counts for the section being removed.  */
7710
 
7711
boolean
7712
_bfd_mips_elf_gc_sweep_hook (abfd, info, sec, relocs)
7713
     bfd *abfd ATTRIBUTE_UNUSED;
7714
     struct bfd_link_info *info ATTRIBUTE_UNUSED;
7715
     asection *sec ATTRIBUTE_UNUSED;
7716
     const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
7717
{
7718
#if 0
7719
  Elf_Internal_Shdr *symtab_hdr;
7720
  struct elf_link_hash_entry **sym_hashes;
7721
  bfd_signed_vma *local_got_refcounts;
7722
  const Elf_Internal_Rela *rel, *relend;
7723
  unsigned long r_symndx;
7724
  struct elf_link_hash_entry *h;
7725
 
7726
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
7727
  sym_hashes = elf_sym_hashes (abfd);
7728
  local_got_refcounts = elf_local_got_refcounts (abfd);
7729
 
7730
  relend = relocs + sec->reloc_count;
7731
  for (rel = relocs; rel < relend; rel++)
7732
    switch (ELF32_R_TYPE (rel->r_info))
7733
      {
7734
      case R_MIPS_GOT16:
7735
      case R_MIPS_CALL16:
7736
      case R_MIPS_CALL_HI16:
7737
      case R_MIPS_CALL_LO16:
7738
      case R_MIPS_GOT_HI16:
7739
      case R_MIPS_GOT_LO16:
7740
        /* ??? It would seem that the existing MIPS code does no sort
7741
           of reference counting or whatnot on its GOT and PLT entries,
7742
           so it is not possible to garbage collect them at this time.  */
7743
        break;
7744
 
7745
      default:
7746
        break;
7747
      }
7748
#endif
7749
 
7750
  return true;
7751
}
7752
 
7753
 
7754
/* Adjust a symbol defined by a dynamic object and referenced by a
7755
   regular object.  The current definition is in some section of the
7756
   dynamic object, but we're not including those sections.  We have to
7757
   change the definition to something the rest of the link can
7758
   understand.  */
7759
 
7760
boolean
7761
_bfd_mips_elf_adjust_dynamic_symbol (info, h)
7762
     struct bfd_link_info *info;
7763
     struct elf_link_hash_entry *h;
7764
{
7765
  bfd *dynobj;
7766
  struct mips_elf_link_hash_entry *hmips;
7767
  asection *s;
7768
 
7769
  dynobj = elf_hash_table (info)->dynobj;
7770
 
7771
  /* Make sure we know what is going on here.  */
7772
  BFD_ASSERT (dynobj != NULL
7773
              && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
7774
                  || h->weakdef != NULL
7775
                  || ((h->elf_link_hash_flags
7776
                       & ELF_LINK_HASH_DEF_DYNAMIC) != 0
7777
                      && (h->elf_link_hash_flags
7778
                          & ELF_LINK_HASH_REF_REGULAR) != 0
7779
                      && (h->elf_link_hash_flags
7780
                          & ELF_LINK_HASH_DEF_REGULAR) == 0)));
7781
 
7782
  /* If this symbol is defined in a dynamic object, we need to copy
7783
     any R_MIPS_32 or R_MIPS_REL32 relocs against it into the output
7784
     file.  */
7785
  hmips = (struct mips_elf_link_hash_entry *) h;
7786
  if (! info->relocateable
7787
      && hmips->possibly_dynamic_relocs != 0
7788
      && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
7789
    mips_elf_allocate_dynamic_relocations (dynobj,
7790
                                           hmips->possibly_dynamic_relocs);
7791
 
7792
  /* For a function, create a stub, if needed. */
7793
  if (h->type == STT_FUNC
7794
      || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
7795
    {
7796
      if (! elf_hash_table (info)->dynamic_sections_created)
7797
        return true;
7798
 
7799
      /* If this symbol is not defined in a regular file, then set
7800
         the symbol to the stub location.  This is required to make
7801
         function pointers compare as equal between the normal
7802
         executable and the shared library.  */
7803
      if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
7804
        {
7805
          /* We need .stub section.  */
7806
          s = bfd_get_section_by_name (dynobj,
7807
                                       MIPS_ELF_STUB_SECTION_NAME (dynobj));
7808
          BFD_ASSERT (s != NULL);
7809
 
7810
          h->root.u.def.section = s;
7811
          h->root.u.def.value = s->_raw_size;
7812
 
7813
          /* XXX Write this stub address somewhere.  */
7814
          h->plt.offset = s->_raw_size;
7815
 
7816
          /* Make room for this stub code.  */
7817
          s->_raw_size += MIPS_FUNCTION_STUB_SIZE;
7818
 
7819
          /* The last half word of the stub will be filled with the index
7820
             of this symbol in .dynsym section.  */
7821
          return true;
7822
        }
7823
    }
7824
 
7825
  /* If this is a weak symbol, and there is a real definition, the
7826
     processor independent code will have arranged for us to see the
7827
     real definition first, and we can just use the same value.  */
7828
  if (h->weakdef != NULL)
7829
    {
7830
      BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
7831
                  || h->weakdef->root.type == bfd_link_hash_defweak);
7832
      h->root.u.def.section = h->weakdef->root.u.def.section;
7833
      h->root.u.def.value = h->weakdef->root.u.def.value;
7834
      return true;
7835
    }
7836
 
7837
  /* This is a reference to a symbol defined by a dynamic object which
7838
     is not a function.  */
7839
 
7840
  return true;
7841
}
7842
 
7843
/* This function is called after all the input files have been read,
7844
   and the input sections have been assigned to output sections.  We
7845
   check for any mips16 stub sections that we can discard.  */
7846
 
7847
static boolean mips_elf_check_mips16_stubs
7848
  PARAMS ((struct mips_elf_link_hash_entry *, PTR));
7849
 
7850
boolean
7851
_bfd_mips_elf_always_size_sections (output_bfd, info)
7852
     bfd *output_bfd;
7853
     struct bfd_link_info *info;
7854
{
7855
  asection *ri;
7856
 
7857
  /* The .reginfo section has a fixed size.  */
7858
  ri = bfd_get_section_by_name (output_bfd, ".reginfo");
7859
  if (ri != NULL)
7860
    bfd_set_section_size (output_bfd, ri, sizeof (Elf32_External_RegInfo));
7861
 
7862
  if (info->relocateable
7863
      || ! mips_elf_hash_table (info)->mips16_stubs_seen)
7864
    return true;
7865
 
7866
  mips_elf_link_hash_traverse (mips_elf_hash_table (info),
7867
                               mips_elf_check_mips16_stubs,
7868
                               (PTR) NULL);
7869
 
7870
  return true;
7871
}
7872
 
7873
/* Check the mips16 stubs for a particular symbol, and see if we can
7874
   discard them.  */
7875
 
7876
/*ARGSUSED*/
7877
static boolean
7878
mips_elf_check_mips16_stubs (h, data)
7879
     struct mips_elf_link_hash_entry *h;
7880
     PTR data ATTRIBUTE_UNUSED;
7881
{
7882
  if (h->fn_stub != NULL
7883
      && ! h->need_fn_stub)
7884
    {
7885
      /* We don't need the fn_stub; the only references to this symbol
7886
         are 16 bit calls.  Clobber the size to 0 to prevent it from
7887
         being included in the link.  */
7888
      h->fn_stub->_raw_size = 0;
7889
      h->fn_stub->_cooked_size = 0;
7890
      h->fn_stub->flags &= ~ SEC_RELOC;
7891
      h->fn_stub->reloc_count = 0;
7892
      h->fn_stub->flags |= SEC_EXCLUDE;
7893
    }
7894
 
7895
  if (h->call_stub != NULL
7896
      && h->root.other == STO_MIPS16)
7897
    {
7898
      /* We don't need the call_stub; this is a 16 bit function, so
7899
         calls from other 16 bit functions are OK.  Clobber the size
7900
         to 0 to prevent it from being included in the link.  */
7901
      h->call_stub->_raw_size = 0;
7902
      h->call_stub->_cooked_size = 0;
7903
      h->call_stub->flags &= ~ SEC_RELOC;
7904
      h->call_stub->reloc_count = 0;
7905
      h->call_stub->flags |= SEC_EXCLUDE;
7906
    }
7907
 
7908
  if (h->call_fp_stub != NULL
7909
      && h->root.other == STO_MIPS16)
7910
    {
7911
      /* We don't need the call_stub; this is a 16 bit function, so
7912
         calls from other 16 bit functions are OK.  Clobber the size
7913
         to 0 to prevent it from being included in the link.  */
7914
      h->call_fp_stub->_raw_size = 0;
7915
      h->call_fp_stub->_cooked_size = 0;
7916
      h->call_fp_stub->flags &= ~ SEC_RELOC;
7917
      h->call_fp_stub->reloc_count = 0;
7918
      h->call_fp_stub->flags |= SEC_EXCLUDE;
7919
    }
7920
 
7921
  return true;
7922
}
7923
 
7924
/* Set the sizes of the dynamic sections.  */
7925
 
7926
boolean
7927
_bfd_mips_elf_size_dynamic_sections (output_bfd, info)
7928
     bfd *output_bfd;
7929
     struct bfd_link_info *info;
7930
{
7931
  bfd *dynobj;
7932
  asection *s;
7933
  boolean reltext;
7934
  struct mips_got_info *g = NULL;
7935
 
7936
  dynobj = elf_hash_table (info)->dynobj;
7937
  BFD_ASSERT (dynobj != NULL);
7938
 
7939
  if (elf_hash_table (info)->dynamic_sections_created)
7940
    {
7941
      /* Set the contents of the .interp section to the interpreter.  */
7942
      if (! info->shared)
7943
        {
7944
          s = bfd_get_section_by_name (dynobj, ".interp");
7945
          BFD_ASSERT (s != NULL);
7946
          s->_raw_size
7947
            = strlen (ELF_DYNAMIC_INTERPRETER (output_bfd)) + 1;
7948
          s->contents
7949
            = (bfd_byte *) ELF_DYNAMIC_INTERPRETER (output_bfd);
7950
        }
7951
    }
7952
 
7953
  /* The check_relocs and adjust_dynamic_symbol entry points have
7954
     determined the sizes of the various dynamic sections.  Allocate
7955
     memory for them.  */
7956
  reltext = false;
7957
  for (s = dynobj->sections; s != NULL; s = s->next)
7958
    {
7959
      const char *name;
7960
      boolean strip;
7961
 
7962
      /* It's OK to base decisions on the section name, because none
7963
         of the dynobj section names depend upon the input files.  */
7964
      name = bfd_get_section_name (dynobj, s);
7965
 
7966
      if ((s->flags & SEC_LINKER_CREATED) == 0)
7967
        continue;
7968
 
7969
      strip = false;
7970
 
7971
      if (strncmp (name, ".rel", 4) == 0)
7972
        {
7973
          if (s->_raw_size == 0)
7974
            {
7975
              /* We only strip the section if the output section name
7976
                 has the same name.  Otherwise, there might be several
7977
                 input sections for this output section.  FIXME: This
7978
                 code is probably not needed these days anyhow, since
7979
                 the linker now does not create empty output sections.  */
7980
              if (s->output_section != NULL
7981
                  && strcmp (name,
7982
                             bfd_get_section_name (s->output_section->owner,
7983
                                                   s->output_section)) == 0)
7984
                strip = true;
7985
            }
7986
          else
7987
            {
7988
              const char *outname;
7989
              asection *target;
7990
 
7991
              /* If this relocation section applies to a read only
7992
                 section, then we probably need a DT_TEXTREL entry.
7993
                 If the relocation section is .rel.dyn, we always
7994
                 assert a DT_TEXTREL entry rather than testing whether
7995
                 there exists a relocation to a read only section or
7996
                 not.  */
7997
              outname = bfd_get_section_name (output_bfd,
7998
                                              s->output_section);
7999
              target = bfd_get_section_by_name (output_bfd, outname + 4);
8000
              if ((target != NULL
8001
                   && (target->flags & SEC_READONLY) != 0
8002
                   && (target->flags & SEC_ALLOC) != 0)
8003
                  || strcmp (outname,
8004
                             MIPS_ELF_REL_DYN_SECTION_NAME (output_bfd)) == 0)
8005
                reltext = true;
8006
 
8007
              /* We use the reloc_count field as a counter if we need
8008
                 to copy relocs into the output file.  */
8009
              if (strcmp (name,
8010
                          MIPS_ELF_REL_DYN_SECTION_NAME (output_bfd)) != 0)
8011
                s->reloc_count = 0;
8012
            }
8013
        }
8014
      else if (strncmp (name, ".got", 4) == 0)
8015
        {
8016
          int i;
8017
          bfd_size_type loadable_size = 0;
8018
          bfd_size_type local_gotno;
8019
          struct _bfd *sub;
8020
 
8021
          BFD_ASSERT (elf_section_data (s) != NULL);
8022
          g = (struct mips_got_info *) elf_section_data (s)->tdata;
8023
          BFD_ASSERT (g != NULL);
8024
 
8025
          /* Calculate the total loadable size of the output.  That
8026
             will give us the maximum number of GOT_PAGE entries
8027
             required.  */
8028
          for (sub = info->input_bfds; sub; sub = sub->link_next)
8029
            {
8030
              asection *subsection;
8031
 
8032
              for (subsection = sub->sections;
8033
                   subsection;
8034
                   subsection = subsection->next)
8035
                {
8036
                  if ((subsection->flags & SEC_ALLOC) == 0)
8037
                    continue;
8038
                  loadable_size += (subsection->_raw_size + 0xf) & ~0xf;
8039
                }
8040
            }
8041
          loadable_size += MIPS_FUNCTION_STUB_SIZE;
8042
 
8043
          /* Assume there are two loadable segments consisting of
8044
             contiguous sections.  Is 5 enough?  */
8045
          local_gotno = (loadable_size >> 16) + 5;
8046
          if (IRIX_COMPAT (output_bfd) == ict_irix6)
8047
            /* It's possible we will need GOT_PAGE entries as well as
8048
               GOT16 entries.  Often, these will be able to share GOT
8049
               entries, but not always.  */
8050
            local_gotno *= 2;
8051
 
8052
          g->local_gotno += local_gotno;
8053
          s->_raw_size += local_gotno * MIPS_ELF_GOT_SIZE (dynobj);
8054
 
8055
          /* There has to be a global GOT entry for every symbol with
8056
             a dynamic symbol table index of DT_MIPS_GOTSYM or
8057
             higher.  Therefore, it make sense to put those symbols
8058
             that need GOT entries at the end of the symbol table.  We
8059
             do that here.  */
8060
          if (!mips_elf_sort_hash_table (info, 1))
8061
            return false;
8062
 
8063
          if (g->global_gotsym != NULL)
8064
            i = elf_hash_table (info)->dynsymcount - g->global_gotsym->dynindx;
8065
          else
8066
            /* If there are no global symbols, or none requiring
8067
               relocations, then GLOBAL_GOTSYM will be NULL.  */
8068
            i = 0;
8069
          g->global_gotno = i;
8070
          s->_raw_size += i * MIPS_ELF_GOT_SIZE (dynobj);
8071
        }
8072
      else if (strcmp (name, MIPS_ELF_STUB_SECTION_NAME (output_bfd)) == 0)
8073
        {
8074
          /* Irix rld assumes that the function stub isn't at the end
8075
             of .text section. So put a dummy. XXX  */
8076
          s->_raw_size += MIPS_FUNCTION_STUB_SIZE;
8077
        }
8078
      else if (! info->shared
8079
               && ! mips_elf_hash_table (info)->use_rld_obj_head
8080
               && strncmp (name, ".rld_map", 8) == 0)
8081
        {
8082
          /* We add a room for __rld_map. It will be filled in by the
8083
             rtld to contain a pointer to the _r_debug structure.  */
8084
          s->_raw_size += 4;
8085
        }
8086
      else if (SGI_COMPAT (output_bfd)
8087
               && strncmp (name, ".compact_rel", 12) == 0)
8088
        s->_raw_size += mips_elf_hash_table (info)->compact_rel_size;
8089
      else if (strcmp (name, MIPS_ELF_MSYM_SECTION_NAME (output_bfd))
8090
               == 0)
8091
        s->_raw_size = (sizeof (Elf32_External_Msym)
8092
                        * (elf_hash_table (info)->dynsymcount
8093
                           + bfd_count_sections (output_bfd)));
8094
      else if (strncmp (name, ".init", 5) != 0)
8095
        {
8096
          /* It's not one of our sections, so don't allocate space.  */
8097
          continue;
8098
        }
8099
 
8100
      if (strip)
8101
        {
8102
          _bfd_strip_section_from_output (info, s);
8103
          continue;
8104
        }
8105
 
8106
      /* Allocate memory for the section contents.  */
8107
      s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
8108
      if (s->contents == NULL && s->_raw_size != 0)
8109
        {
8110
          bfd_set_error (bfd_error_no_memory);
8111
          return false;
8112
        }
8113
    }
8114
 
8115
  if (elf_hash_table (info)->dynamic_sections_created)
8116
    {
8117
      /* Add some entries to the .dynamic section.  We fill in the
8118
         values later, in elf_mips_finish_dynamic_sections, but we
8119
         must add the entries now so that we get the correct size for
8120
         the .dynamic section.  The DT_DEBUG entry is filled in by the
8121
         dynamic linker and used by the debugger.  */
8122
      if (! info->shared)
8123
        {
8124
          if (SGI_COMPAT (output_bfd))
8125
            {
8126
              /* SGI object has the equivalence of DT_DEBUG in the
8127
                 DT_MIPS_RLD_MAP entry.  */
8128
              if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP, 0))
8129
                return false;
8130
            }
8131
          else
8132
            if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_DEBUG, 0))
8133
              return false;
8134
        }
8135
 
8136
      if (reltext)
8137
        {
8138
          if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_TEXTREL, 0))
8139
            return false;
8140
        }
8141
 
8142
      if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTGOT, 0))
8143
        return false;
8144
 
8145
      if (bfd_get_section_by_name (dynobj,
8146
                                   MIPS_ELF_REL_DYN_SECTION_NAME (dynobj)))
8147
        {
8148
          if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_REL, 0))
8149
            return false;
8150
 
8151
          if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELSZ, 0))
8152
            return false;
8153
 
8154
          if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELENT, 0))
8155
            return false;
8156
        }
8157
 
8158
      if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_CONFLICTNO, 0))
8159
        return false;
8160
 
8161
      if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_LIBLISTNO, 0))
8162
        return false;
8163
 
8164
      if (bfd_get_section_by_name (dynobj, ".conflict") != NULL)
8165
        {
8166
          if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_CONFLICT, 0))
8167
            return false;
8168
 
8169
          s = bfd_get_section_by_name (dynobj, ".liblist");
8170
          BFD_ASSERT (s != NULL);
8171
 
8172
          if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_LIBLIST, 0))
8173
            return false;
8174
        }
8175
 
8176
      if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_VERSION, 0))
8177
        return false;
8178
 
8179
      if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_FLAGS, 0))
8180
        return false;
8181
 
8182
#if 0
8183
      /* Time stamps in executable files are a bad idea.  */
8184
      if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_TIME_STAMP, 0))
8185
        return false;
8186
#endif
8187
 
8188
#if 0 /* FIXME  */
8189
      if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_ICHECKSUM, 0))
8190
        return false;
8191
#endif
8192
 
8193
#if 0 /* FIXME  */
8194
      if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_IVERSION, 0))
8195
        return false;
8196
#endif
8197
 
8198
      if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_BASE_ADDRESS, 0))
8199
        return false;
8200
 
8201
      if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_LOCAL_GOTNO, 0))
8202
        return false;
8203
 
8204
      if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_SYMTABNO, 0))
8205
        return false;
8206
 
8207
      if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_UNREFEXTNO, 0))
8208
        return false;
8209
 
8210
      if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_GOTSYM, 0))
8211
        return false;
8212
 
8213
      if (IRIX_COMPAT (dynobj) == ict_irix5
8214
          && ! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_HIPAGENO, 0))
8215
        return false;
8216
 
8217
      if (IRIX_COMPAT (dynobj) == ict_irix6
8218
          && (bfd_get_section_by_name
8219
              (dynobj, MIPS_ELF_OPTIONS_SECTION_NAME (dynobj)))
8220
          && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_OPTIONS, 0))
8221
        return false;
8222
 
8223
      if (bfd_get_section_by_name (dynobj,
8224
                                   MIPS_ELF_MSYM_SECTION_NAME (dynobj))
8225
          && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_MSYM, 0))
8226
        return false;
8227
    }
8228
 
8229
  return true;
8230
}
8231
 
8232
/* If NAME is one of the special IRIX6 symbols defined by the linker,
8233
   adjust it appropriately now.  */
8234
 
8235
static void
8236
mips_elf_irix6_finish_dynamic_symbol (abfd, name, sym)
8237
     bfd *abfd ATTRIBUTE_UNUSED;
8238
     const char *name;
8239
     Elf_Internal_Sym *sym;
8240
{
8241
  /* The linker script takes care of providing names and values for
8242
     these, but we must place them into the right sections.  */
8243
  static const char* const text_section_symbols[] = {
8244
    "_ftext",
8245
    "_etext",
8246
    "__dso_displacement",
8247
    "__elf_header",
8248
    "__program_header_table",
8249
    NULL
8250
  };
8251
 
8252
  static const char* const data_section_symbols[] = {
8253
    "_fdata",
8254
    "_edata",
8255
    "_end",
8256
    "_fbss",
8257
    NULL
8258
  };
8259
 
8260
  const char* const *p;
8261
  int i;
8262
 
8263
  for (i = 0; i < 2; ++i)
8264
    for (p = (i == 0) ? text_section_symbols : data_section_symbols;
8265
         *p;
8266
         ++p)
8267
      if (strcmp (*p, name) == 0)
8268
        {
8269
          /* All of these symbols are given type STT_SECTION by the
8270
             IRIX6 linker.  */
8271
          sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8272
 
8273
          /* The IRIX linker puts these symbols in special sections.  */
8274
          if (i == 0)
8275
            sym->st_shndx = SHN_MIPS_TEXT;
8276
          else
8277
            sym->st_shndx = SHN_MIPS_DATA;
8278
 
8279
          break;
8280
        }
8281
}
8282
 
8283
/* Finish up dynamic symbol handling.  We set the contents of various
8284
   dynamic sections here.  */
8285
 
8286
boolean
8287
_bfd_mips_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
8288
     bfd *output_bfd;
8289
     struct bfd_link_info *info;
8290
     struct elf_link_hash_entry *h;
8291
     Elf_Internal_Sym *sym;
8292
{
8293
  bfd *dynobj;
8294
  bfd_vma gval;
8295
  asection *sgot;
8296
  asection *smsym;
8297
  struct mips_got_info *g;
8298
  const char *name;
8299
  struct mips_elf_link_hash_entry *mh;
8300
 
8301
  dynobj = elf_hash_table (info)->dynobj;
8302
  gval = sym->st_value;
8303
  mh = (struct mips_elf_link_hash_entry *) h;
8304
 
8305
  if (h->plt.offset != (bfd_vma) -1)
8306
    {
8307
      asection *s;
8308
      bfd_byte *p;
8309
      bfd_byte stub[MIPS_FUNCTION_STUB_SIZE];
8310
 
8311
      /* This symbol has a stub.  Set it up.  */
8312
 
8313
      BFD_ASSERT (h->dynindx != -1);
8314
 
8315
      s = bfd_get_section_by_name (dynobj,
8316
                                   MIPS_ELF_STUB_SECTION_NAME (dynobj));
8317
      BFD_ASSERT (s != NULL);
8318
 
8319
      /* Fill the stub.  */
8320
      p = stub;
8321
      bfd_put_32 (output_bfd, STUB_LW(output_bfd), p);
8322
      p += 4;
8323
      bfd_put_32 (output_bfd, STUB_MOVE, p);
8324
      p += 4;
8325
 
8326
      /* FIXME: Can h->dynindex be more than 64K?  */
8327
      if (h->dynindx & 0xffff0000)
8328
        return false;
8329
 
8330
      bfd_put_32 (output_bfd, STUB_JALR, p);
8331
      p += 4;
8332
      bfd_put_32 (output_bfd, STUB_LI16 + h->dynindx, p);
8333
 
8334
      BFD_ASSERT (h->plt.offset <= s->_raw_size);
8335
      memcpy (s->contents + h->plt.offset, stub, MIPS_FUNCTION_STUB_SIZE);
8336
 
8337
      /* Mark the symbol as undefined.  plt.offset != -1 occurs
8338
         only for the referenced symbol.  */
8339
      sym->st_shndx = SHN_UNDEF;
8340
 
8341
      /* The run-time linker uses the st_value field of the symbol
8342
         to reset the global offset table entry for this external
8343
         to its stub address when unlinking a shared object.  */
8344
      gval = s->output_section->vma + s->output_offset + h->plt.offset;
8345
      sym->st_value = gval;
8346
    }
8347
 
8348
  BFD_ASSERT (h->dynindx != -1);
8349
 
8350
  sgot = mips_elf_got_section (dynobj);
8351
  BFD_ASSERT (sgot != NULL);
8352
  BFD_ASSERT (elf_section_data (sgot) != NULL);
8353
  g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
8354
  BFD_ASSERT (g != NULL);
8355
 
8356
  /* Run through the global symbol table, creating GOT entries for all
8357
     the symbols that need them.  */
8358
  if (g->global_gotsym != NULL
8359
      && h->dynindx >= g->global_gotsym->dynindx)
8360
    {
8361
      bfd_vma offset;
8362
      bfd_vma value;
8363
 
8364
      if (sym->st_value)
8365
        value = sym->st_value;
8366
      else
8367
        /* For an entity defined in a shared object, this will be
8368
           NULL.  (For functions in shared objects for
8369
           which we have created stubs, ST_VALUE will be non-NULL.
8370
           That's because such the functions are now no longer defined
8371
           in a shared object.)  */
8372
        value = h->root.u.def.value;
8373
 
8374
      offset = mips_elf_global_got_index (dynobj, h);
8375
      MIPS_ELF_PUT_WORD (output_bfd, value, sgot->contents + offset);
8376
    }
8377
 
8378
  /* Create a .msym entry, if appropriate.  */
8379
  smsym = bfd_get_section_by_name (dynobj,
8380
                                   MIPS_ELF_MSYM_SECTION_NAME (dynobj));
8381
  if (smsym)
8382
    {
8383
      Elf32_Internal_Msym msym;
8384
 
8385
      msym.ms_hash_value = bfd_elf_hash (h->root.root.string);
8386
      /* It is undocumented what the `1' indicates, but IRIX6 uses
8387
         this value.  */
8388
      msym.ms_info = ELF32_MS_INFO (mh->min_dyn_reloc_index, 1);
8389
      bfd_mips_elf_swap_msym_out
8390
        (dynobj, &msym,
8391
         ((Elf32_External_Msym *) smsym->contents) + h->dynindx);
8392
    }
8393
 
8394
  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
8395
  name = h->root.root.string;
8396
  if (strcmp (name, "_DYNAMIC") == 0
8397
      || strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
8398
    sym->st_shndx = SHN_ABS;
8399
  else if (strcmp (name, "_DYNAMIC_LINK") == 0)
8400
    {
8401
      sym->st_shndx = SHN_ABS;
8402
      sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8403
      sym->st_value = 1;
8404
    }
8405
  else if (SGI_COMPAT (output_bfd))
8406
    {
8407
      if (strcmp (name, "_gp_disp") == 0)
8408
        {
8409
          sym->st_shndx = SHN_ABS;
8410
          sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8411
          sym->st_value = elf_gp (output_bfd);
8412
        }
8413
      else if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
8414
               || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
8415
        {
8416
          sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8417
          sym->st_other = STO_PROTECTED;
8418
          sym->st_value = 0;
8419
          sym->st_shndx = SHN_MIPS_DATA;
8420
        }
8421
      else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
8422
        {
8423
          sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8424
          sym->st_other = STO_PROTECTED;
8425
          sym->st_value = mips_elf_hash_table (info)->procedure_count;
8426
          sym->st_shndx = SHN_ABS;
8427
        }
8428
      else if (sym->st_shndx != SHN_UNDEF && sym->st_shndx != SHN_ABS)
8429
        {
8430
          if (h->type == STT_FUNC)
8431
            sym->st_shndx = SHN_MIPS_TEXT;
8432
          else if (h->type == STT_OBJECT)
8433
            sym->st_shndx = SHN_MIPS_DATA;
8434
        }
8435
    }
8436
 
8437
  /* Handle the IRIX6-specific symbols.  */
8438
  if (IRIX_COMPAT (output_bfd) == ict_irix6)
8439
    mips_elf_irix6_finish_dynamic_symbol (output_bfd, name, sym);
8440
 
8441
  if (SGI_COMPAT (output_bfd)
8442
      && ! info->shared)
8443
    {
8444
      if (! mips_elf_hash_table (info)->use_rld_obj_head
8445
          && strcmp (name, "__rld_map") == 0)
8446
        {
8447
          asection *s = bfd_get_section_by_name (dynobj, ".rld_map");
8448
          BFD_ASSERT (s != NULL);
8449
          sym->st_value = s->output_section->vma + s->output_offset;
8450
          bfd_put_32 (output_bfd, (bfd_vma) 0, s->contents);
8451
          if (mips_elf_hash_table (info)->rld_value == 0)
8452
            mips_elf_hash_table (info)->rld_value = sym->st_value;
8453
        }
8454
      else if (mips_elf_hash_table (info)->use_rld_obj_head
8455
               && strcmp (name, "__rld_obj_head") == 0)
8456
        {
8457
          /* IRIX6 does not use a .rld_map section.  */
8458
          if (IRIX_COMPAT (output_bfd) == ict_irix5)
8459
            BFD_ASSERT (bfd_get_section_by_name (dynobj, ".rld_map")
8460
                        != NULL);
8461
          mips_elf_hash_table (info)->rld_value = sym->st_value;
8462
        }
8463
    }
8464
 
8465
  /* If this is a mips16 symbol, force the value to be even.  */
8466
  if (sym->st_other == STO_MIPS16
8467
      && (sym->st_value & 1) != 0)
8468
    --sym->st_value;
8469
 
8470
  return true;
8471
}
8472
 
8473
/* Finish up the dynamic sections.  */
8474
 
8475
boolean
8476
_bfd_mips_elf_finish_dynamic_sections (output_bfd, info)
8477
     bfd *output_bfd;
8478
     struct bfd_link_info *info;
8479
{
8480
  bfd *dynobj;
8481
  asection *sdyn;
8482
  asection *sgot;
8483
  struct mips_got_info *g;
8484
 
8485
  dynobj = elf_hash_table (info)->dynobj;
8486
 
8487
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
8488
 
8489
  sgot = mips_elf_got_section (dynobj);
8490
  if (sgot == NULL)
8491
    g = NULL;
8492
  else
8493
    {
8494
      BFD_ASSERT (elf_section_data (sgot) != NULL);
8495
      g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
8496
      BFD_ASSERT (g != NULL);
8497
    }
8498
 
8499
  if (elf_hash_table (info)->dynamic_sections_created)
8500
    {
8501
      bfd_byte *b;
8502
 
8503
      BFD_ASSERT (sdyn != NULL);
8504
      BFD_ASSERT (g != NULL);
8505
 
8506
      for (b = sdyn->contents;
8507
           b < sdyn->contents + sdyn->_raw_size;
8508
           b += MIPS_ELF_DYN_SIZE (dynobj))
8509
        {
8510
          Elf_Internal_Dyn dyn;
8511
          const char *name;
8512
          size_t elemsize;
8513
          asection *s;
8514
          boolean swap_out_p;
8515
 
8516
          /* Read in the current dynamic entry.  */
8517
          (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
8518
 
8519
          /* Assume that we're going to modify it and write it out.  */
8520
          swap_out_p = true;
8521
 
8522
          switch (dyn.d_tag)
8523
            {
8524
            case DT_RELENT:
8525
              s = (bfd_get_section_by_name
8526
                   (dynobj,
8527
                    MIPS_ELF_REL_DYN_SECTION_NAME (dynobj)));
8528
              BFD_ASSERT (s != NULL);
8529
              dyn.d_un.d_val = MIPS_ELF_REL_SIZE (dynobj);
8530
              break;
8531
 
8532
            case DT_STRSZ:
8533
              /* Rewrite DT_STRSZ.  */
8534
              dyn.d_un.d_val =
8535
                _bfd_stringtab_size (elf_hash_table (info)->dynstr);
8536
              break;
8537
 
8538
            case DT_PLTGOT:
8539
              name = ".got";
8540
              goto get_vma;
8541
            case DT_MIPS_CONFLICT:
8542
              name = ".conflict";
8543
              goto get_vma;
8544
            case DT_MIPS_LIBLIST:
8545
              name = ".liblist";
8546
            get_vma:
8547
              s = bfd_get_section_by_name (output_bfd, name);
8548
              BFD_ASSERT (s != NULL);
8549
              dyn.d_un.d_ptr = s->vma;
8550
              break;
8551
 
8552
            case DT_MIPS_RLD_VERSION:
8553
              dyn.d_un.d_val = 1; /* XXX */
8554
              break;
8555
 
8556
            case DT_MIPS_FLAGS:
8557
              dyn.d_un.d_val = RHF_NOTPOT; /* XXX */
8558
              break;
8559
 
8560
            case DT_MIPS_CONFLICTNO:
8561
              name = ".conflict";
8562
              elemsize = sizeof (Elf32_Conflict);
8563
              goto set_elemno;
8564
 
8565
            case DT_MIPS_LIBLISTNO:
8566
              name = ".liblist";
8567
              elemsize = sizeof (Elf32_Lib);
8568
            set_elemno:
8569
              s = bfd_get_section_by_name (output_bfd, name);
8570
              if (s != NULL)
8571
                {
8572
                  if (s->_cooked_size != 0)
8573
                    dyn.d_un.d_val = s->_cooked_size / elemsize;
8574
                  else
8575
                    dyn.d_un.d_val = s->_raw_size / elemsize;
8576
                }
8577
              else
8578
                    dyn.d_un.d_val = 0;
8579
              break;
8580
 
8581
            case DT_MIPS_TIME_STAMP:
8582
              time ((time_t *) &dyn.d_un.d_val);
8583
              break;
8584
 
8585
            case DT_MIPS_ICHECKSUM:
8586
              /* XXX FIXME: */
8587
              swap_out_p = false;
8588
              break;
8589
 
8590
            case DT_MIPS_IVERSION:
8591
              /* XXX FIXME: */
8592
              swap_out_p = false;
8593
              break;
8594
 
8595
            case DT_MIPS_BASE_ADDRESS:
8596
              s = output_bfd->sections;
8597
              BFD_ASSERT (s != NULL);
8598
              dyn.d_un.d_ptr = s->vma & ~(0xffff);
8599
              break;
8600
 
8601
            case DT_MIPS_LOCAL_GOTNO:
8602
              dyn.d_un.d_val = g->local_gotno;
8603
              break;
8604
 
8605
            case DT_MIPS_UNREFEXTNO:
8606
              /* The index into the dynamic symbol table which is the
8607
                 entry of the first external symbol that is not
8608
                 referenced within the same object.  */
8609
              dyn.d_un.d_val = bfd_count_sections (output_bfd) + 1;
8610
              break;
8611
 
8612
            case DT_MIPS_GOTSYM:
8613
              if (g->global_gotsym)
8614
                {
8615
                  dyn.d_un.d_val = g->global_gotsym->dynindx;
8616
                  break;
8617
                }
8618
              /* In case if we don't have global got symbols we default
8619
                 to setting DT_MIPS_GOTSYM to the same value as
8620
                 DT_MIPS_SYMTABNO, so we just fall through.  */
8621
 
8622
            case DT_MIPS_SYMTABNO:
8623
              name = ".dynsym";
8624
              elemsize = MIPS_ELF_SYM_SIZE (output_bfd);
8625
              s = bfd_get_section_by_name (output_bfd, name);
8626
              BFD_ASSERT (s != NULL);
8627
 
8628
              if (s->_cooked_size != 0)
8629
                dyn.d_un.d_val = s->_cooked_size / elemsize;
8630
              else
8631
                dyn.d_un.d_val = s->_raw_size / elemsize;
8632
              break;
8633
 
8634
            case DT_MIPS_HIPAGENO:
8635
              dyn.d_un.d_val = g->local_gotno - MIPS_RESERVED_GOTNO;
8636
              break;
8637
 
8638
            case DT_MIPS_RLD_MAP:
8639
              dyn.d_un.d_ptr = mips_elf_hash_table (info)->rld_value;
8640
              break;
8641
 
8642
            case DT_MIPS_OPTIONS:
8643
              s = (bfd_get_section_by_name
8644
                   (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (output_bfd)));
8645
              dyn.d_un.d_ptr = s->vma;
8646
              break;
8647
 
8648
            case DT_MIPS_MSYM:
8649
              s = (bfd_get_section_by_name
8650
                   (output_bfd, MIPS_ELF_MSYM_SECTION_NAME (output_bfd)));
8651
              dyn.d_un.d_ptr = s->vma;
8652
              break;
8653
 
8654
            default:
8655
              swap_out_p = false;
8656
              break;
8657
            }
8658
 
8659
          if (swap_out_p)
8660
            (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
8661
              (dynobj, &dyn, b);
8662
        }
8663
    }
8664
 
8665
  /* The first entry of the global offset table will be filled at
8666
     runtime. The second entry will be used by some runtime loaders.
8667
     This isn't the case of Irix rld. */
8668
  if (sgot != NULL && sgot->_raw_size > 0)
8669
    {
8670
      MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0, sgot->contents);
8671
      MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0x80000000,
8672
                         sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
8673
    }
8674
 
8675
  if (sgot != NULL)
8676
    elf_section_data (sgot->output_section)->this_hdr.sh_entsize
8677
      = MIPS_ELF_GOT_SIZE (output_bfd);
8678
 
8679
  {
8680
    asection *smsym;
8681
    asection *s;
8682
    Elf32_compact_rel cpt;
8683
 
8684
    /* ??? The section symbols for the output sections were set up in
8685
       _bfd_elf_final_link.  SGI sets the STT_NOTYPE attribute for these
8686
       symbols.  Should we do so?  */
8687
 
8688
    smsym = bfd_get_section_by_name (dynobj,
8689
                                     MIPS_ELF_MSYM_SECTION_NAME (dynobj));
8690
    if (smsym != NULL)
8691
      {
8692
        Elf32_Internal_Msym msym;
8693
 
8694
        msym.ms_hash_value = 0;
8695
        msym.ms_info = ELF32_MS_INFO (0, 1);
8696
 
8697
        for (s = output_bfd->sections; s != NULL; s = s->next)
8698
          {
8699
            long dynindx = elf_section_data (s)->dynindx;
8700
 
8701
            bfd_mips_elf_swap_msym_out
8702
              (output_bfd, &msym,
8703
               (((Elf32_External_Msym *) smsym->contents)
8704
                + dynindx));
8705
          }
8706
      }
8707
 
8708
    if (SGI_COMPAT (output_bfd))
8709
      {
8710
        /* Write .compact_rel section out.  */
8711
        s = bfd_get_section_by_name (dynobj, ".compact_rel");
8712
        if (s != NULL)
8713
          {
8714
            cpt.id1 = 1;
8715
            cpt.num = s->reloc_count;
8716
            cpt.id2 = 2;
8717
            cpt.offset = (s->output_section->filepos
8718
                          + sizeof (Elf32_External_compact_rel));
8719
            cpt.reserved0 = 0;
8720
            cpt.reserved1 = 0;
8721
            bfd_elf32_swap_compact_rel_out (output_bfd, &cpt,
8722
                                            ((Elf32_External_compact_rel *)
8723
                                             s->contents));
8724
 
8725
            /* Clean up a dummy stub function entry in .text.  */
8726
            s = bfd_get_section_by_name (dynobj,
8727
                                         MIPS_ELF_STUB_SECTION_NAME (dynobj));
8728
            if (s != NULL)
8729
              {
8730
                file_ptr dummy_offset;
8731
 
8732
                BFD_ASSERT (s->_raw_size >= MIPS_FUNCTION_STUB_SIZE);
8733
                dummy_offset = s->_raw_size - MIPS_FUNCTION_STUB_SIZE;
8734
                memset (s->contents + dummy_offset, 0,
8735
                        MIPS_FUNCTION_STUB_SIZE);
8736
              }
8737
          }
8738
      }
8739
 
8740
    /* Clean up a first relocation in .rel.dyn.  */
8741
    s = bfd_get_section_by_name (dynobj,
8742
                                 MIPS_ELF_REL_DYN_SECTION_NAME (dynobj));
8743
    if (s != NULL && s->_raw_size > 0)
8744
      memset (s->contents, 0, MIPS_ELF_REL_SIZE (dynobj));
8745
  }
8746
 
8747
  return true;
8748
}
8749
 
8750
/* This is almost identical to bfd_generic_get_... except that some
8751
   MIPS relocations need to be handled specially.  Sigh.  */
8752
 
8753
static bfd_byte *
8754
elf32_mips_get_relocated_section_contents (abfd, link_info, link_order, data,
8755
                                           relocateable, symbols)
8756
     bfd *abfd;
8757
     struct bfd_link_info *link_info;
8758
     struct bfd_link_order *link_order;
8759
     bfd_byte *data;
8760
     boolean relocateable;
8761
     asymbol **symbols;
8762
{
8763
  /* Get enough memory to hold the stuff */
8764
  bfd *input_bfd = link_order->u.indirect.section->owner;
8765
  asection *input_section = link_order->u.indirect.section;
8766
 
8767
  long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
8768
  arelent **reloc_vector = NULL;
8769
  long reloc_count;
8770
 
8771
  if (reloc_size < 0)
8772
    goto error_return;
8773
 
8774
  reloc_vector = (arelent **) bfd_malloc (reloc_size);
8775
  if (reloc_vector == NULL && reloc_size != 0)
8776
    goto error_return;
8777
 
8778
  /* read in the section */
8779
  if (!bfd_get_section_contents (input_bfd,
8780
                                 input_section,
8781
                                 (PTR) data,
8782
                                 0,
8783
                                 input_section->_raw_size))
8784
    goto error_return;
8785
 
8786
  /* We're not relaxing the section, so just copy the size info */
8787
  input_section->_cooked_size = input_section->_raw_size;
8788
  input_section->reloc_done = true;
8789
 
8790
  reloc_count = bfd_canonicalize_reloc (input_bfd,
8791
                                        input_section,
8792
                                        reloc_vector,
8793
                                        symbols);
8794
  if (reloc_count < 0)
8795
    goto error_return;
8796
 
8797
  if (reloc_count > 0)
8798
    {
8799
      arelent **parent;
8800
      /* for mips */
8801
      int gp_found;
8802
      bfd_vma gp = 0x12345678;  /* initialize just to shut gcc up */
8803
 
8804
      {
8805
        struct bfd_hash_entry *h;
8806
        struct bfd_link_hash_entry *lh;
8807
        /* Skip all this stuff if we aren't mixing formats.  */
8808
        if (abfd && input_bfd
8809
            && abfd->xvec == input_bfd->xvec)
8810
          lh = 0;
8811
        else
8812
          {
8813
            h = bfd_hash_lookup (&link_info->hash->table, "_gp", false, false);
8814
            lh = (struct bfd_link_hash_entry *) h;
8815
          }
8816
      lookup:
8817
        if (lh)
8818
          {
8819
            switch (lh->type)
8820
              {
8821
              case bfd_link_hash_undefined:
8822
              case bfd_link_hash_undefweak:
8823
              case bfd_link_hash_common:
8824
                gp_found = 0;
8825
                break;
8826
              case bfd_link_hash_defined:
8827
              case bfd_link_hash_defweak:
8828
                gp_found = 1;
8829
                gp = lh->u.def.value;
8830
                break;
8831
              case bfd_link_hash_indirect:
8832
              case bfd_link_hash_warning:
8833
                lh = lh->u.i.link;
8834
                /* @@FIXME  ignoring warning for now */
8835
                goto lookup;
8836
              case bfd_link_hash_new:
8837
              default:
8838
                abort ();
8839
              }
8840
          }
8841
        else
8842
          gp_found = 0;
8843
      }
8844
      /* end mips */
8845
      for (parent = reloc_vector; *parent != (arelent *) NULL;
8846
           parent++)
8847
        {
8848
          char *error_message = (char *) NULL;
8849
          bfd_reloc_status_type r;
8850
 
8851
          /* Specific to MIPS: Deal with relocation types that require
8852
             knowing the gp of the output bfd.  */
8853
          asymbol *sym = *(*parent)->sym_ptr_ptr;
8854
          if (bfd_is_abs_section (sym->section) && abfd)
8855
            {
8856
              /* The special_function wouldn't get called anyways.  */
8857
            }
8858
          else if (!gp_found)
8859
            {
8860
              /* The gp isn't there; let the special function code
8861
                 fall over on its own.  */
8862
            }
8863
          else if ((*parent)->howto->special_function
8864
                   == _bfd_mips_elf_gprel16_reloc)
8865
            {
8866
              /* bypass special_function call */
8867
              r = gprel16_with_gp (input_bfd, sym, *parent, input_section,
8868
                                   relocateable, (PTR) data, gp);
8869
              goto skip_bfd_perform_relocation;
8870
            }
8871
          /* end mips specific stuff */
8872
 
8873
          r = bfd_perform_relocation (input_bfd,
8874
                                      *parent,
8875
                                      (PTR) data,
8876
                                      input_section,
8877
                                      relocateable ? abfd : (bfd *) NULL,
8878
                                      &error_message);
8879
        skip_bfd_perform_relocation:
8880
 
8881
          if (relocateable)
8882
            {
8883
              asection *os = input_section->output_section;
8884
 
8885
              /* A partial link, so keep the relocs */
8886
              os->orelocation[os->reloc_count] = *parent;
8887
              os->reloc_count++;
8888
            }
8889
 
8890
          if (r != bfd_reloc_ok)
8891
            {
8892
              switch (r)
8893
                {
8894
                case bfd_reloc_undefined:
8895
                  if (!((*link_info->callbacks->undefined_symbol)
8896
                        (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
8897
                         input_bfd, input_section, (*parent)->address,
8898
                         true)))
8899
                    goto error_return;
8900
                  break;
8901
                case bfd_reloc_dangerous:
8902
                  BFD_ASSERT (error_message != (char *) NULL);
8903
                  if (!((*link_info->callbacks->reloc_dangerous)
8904
                        (link_info, error_message, input_bfd, input_section,
8905
                         (*parent)->address)))
8906
                    goto error_return;
8907
                  break;
8908
                case bfd_reloc_overflow:
8909
                  if (!((*link_info->callbacks->reloc_overflow)
8910
                        (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
8911
                         (*parent)->howto->name, (*parent)->addend,
8912
                         input_bfd, input_section, (*parent)->address)))
8913
                    goto error_return;
8914
                  break;
8915
                case bfd_reloc_outofrange:
8916
                default:
8917
                  abort ();
8918
                  break;
8919
                }
8920
 
8921
            }
8922
        }
8923
    }
8924
  if (reloc_vector != NULL)
8925
    free (reloc_vector);
8926
  return data;
8927
 
8928
error_return:
8929
  if (reloc_vector != NULL)
8930
    free (reloc_vector);
8931
  return NULL;
8932
}
8933
#define bfd_elf32_bfd_get_relocated_section_contents \
8934
  elf32_mips_get_relocated_section_contents
8935
 
8936
/* ECOFF swapping routines.  These are used when dealing with the
8937
   .mdebug section, which is in the ECOFF debugging format.  */
8938
static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap =
8939
{
8940
  /* Symbol table magic number.  */
8941
  magicSym,
8942
  /* Alignment of debugging information.  E.g., 4.  */
8943
  4,
8944
  /* Sizes of external symbolic information.  */
8945
  sizeof (struct hdr_ext),
8946
  sizeof (struct dnr_ext),
8947
  sizeof (struct pdr_ext),
8948
  sizeof (struct sym_ext),
8949
  sizeof (struct opt_ext),
8950
  sizeof (struct fdr_ext),
8951
  sizeof (struct rfd_ext),
8952
  sizeof (struct ext_ext),
8953
  /* Functions to swap in external symbolic data.  */
8954
  ecoff_swap_hdr_in,
8955
  ecoff_swap_dnr_in,
8956
  ecoff_swap_pdr_in,
8957
  ecoff_swap_sym_in,
8958
  ecoff_swap_opt_in,
8959
  ecoff_swap_fdr_in,
8960
  ecoff_swap_rfd_in,
8961
  ecoff_swap_ext_in,
8962
  _bfd_ecoff_swap_tir_in,
8963
  _bfd_ecoff_swap_rndx_in,
8964
  /* Functions to swap out external symbolic data.  */
8965
  ecoff_swap_hdr_out,
8966
  ecoff_swap_dnr_out,
8967
  ecoff_swap_pdr_out,
8968
  ecoff_swap_sym_out,
8969
  ecoff_swap_opt_out,
8970
  ecoff_swap_fdr_out,
8971
  ecoff_swap_rfd_out,
8972
  ecoff_swap_ext_out,
8973
  _bfd_ecoff_swap_tir_out,
8974
  _bfd_ecoff_swap_rndx_out,
8975
  /* Function to read in symbolic data.  */
8976
  _bfd_mips_elf_read_ecoff_info
8977
};
8978
 
8979
#define TARGET_LITTLE_SYM               bfd_elf32_littlemips_vec
8980
#define TARGET_LITTLE_NAME              "elf32-littlemips"
8981
#define TARGET_BIG_SYM                  bfd_elf32_bigmips_vec
8982
#define TARGET_BIG_NAME                 "elf32-bigmips"
8983
#define ELF_ARCH                        bfd_arch_mips
8984
#define ELF_MACHINE_CODE                EM_MIPS
8985
 
8986
/* The SVR4 MIPS ABI says that this should be 0x10000, but Irix 5 uses
8987
   a value of 0x1000, and we are compatible.  */
8988
#define ELF_MAXPAGESIZE                 0x1000
8989
 
8990
#define elf_backend_collect             true
8991
#define elf_backend_type_change_ok      true
8992
#define elf_backend_can_gc_sections     true
8993
#define elf_backend_sign_extend_vma     true
8994
#define elf_info_to_howto               mips_info_to_howto_rela
8995
#define elf_info_to_howto_rel           mips_info_to_howto_rel
8996
#define elf_backend_sym_is_global       mips_elf_sym_is_global
8997
#define elf_backend_object_p            _bfd_mips_elf_object_p
8998
#define elf_backend_section_from_shdr   _bfd_mips_elf_section_from_shdr
8999
#define elf_backend_fake_sections       _bfd_mips_elf_fake_sections
9000
#define elf_backend_section_from_bfd_section \
9001
                                        _bfd_mips_elf_section_from_bfd_section
9002
#define elf_backend_section_processing  _bfd_mips_elf_section_processing
9003
#define elf_backend_symbol_processing   _bfd_mips_elf_symbol_processing
9004
#define elf_backend_additional_program_headers \
9005
                                        _bfd_mips_elf_additional_program_headers
9006
#define elf_backend_modify_segment_map  _bfd_mips_elf_modify_segment_map
9007
#define elf_backend_final_write_processing \
9008
                                        _bfd_mips_elf_final_write_processing
9009
#define elf_backend_ecoff_debug_swap    &mips_elf32_ecoff_debug_swap
9010
#define elf_backend_add_symbol_hook     _bfd_mips_elf_add_symbol_hook
9011
#define elf_backend_create_dynamic_sections \
9012
                                        _bfd_mips_elf_create_dynamic_sections
9013
#define elf_backend_check_relocs        _bfd_mips_elf_check_relocs
9014
#define elf_backend_adjust_dynamic_symbol \
9015
                                        _bfd_mips_elf_adjust_dynamic_symbol
9016
#define elf_backend_always_size_sections \
9017
                                        _bfd_mips_elf_always_size_sections
9018
#define elf_backend_size_dynamic_sections \
9019
                                        _bfd_mips_elf_size_dynamic_sections
9020
#define elf_backend_relocate_section    _bfd_mips_elf_relocate_section
9021
#define elf_backend_link_output_symbol_hook \
9022
                                        _bfd_mips_elf_link_output_symbol_hook
9023
#define elf_backend_finish_dynamic_symbol \
9024
                                        _bfd_mips_elf_finish_dynamic_symbol
9025
#define elf_backend_finish_dynamic_sections \
9026
                                        _bfd_mips_elf_finish_dynamic_sections
9027
#define elf_backend_gc_mark_hook        _bfd_mips_elf_gc_mark_hook
9028
#define elf_backend_gc_sweep_hook       _bfd_mips_elf_gc_sweep_hook
9029
 
9030
#define elf_backend_got_header_size     (4*MIPS_RESERVED_GOTNO)
9031
#define elf_backend_plt_header_size     0
9032
 
9033
#define bfd_elf32_bfd_is_local_label_name \
9034
                                        mips_elf_is_local_label_name
9035
#define bfd_elf32_find_nearest_line     _bfd_mips_elf_find_nearest_line
9036
#define bfd_elf32_set_section_contents  _bfd_mips_elf_set_section_contents
9037
#define bfd_elf32_bfd_link_hash_table_create \
9038
                                        _bfd_mips_elf_link_hash_table_create
9039
#define bfd_elf32_bfd_final_link        _bfd_mips_elf_final_link
9040
#define bfd_elf32_bfd_copy_private_bfd_data \
9041
                                        _bfd_mips_elf_copy_private_bfd_data
9042
#define bfd_elf32_bfd_merge_private_bfd_data \
9043
                                        _bfd_mips_elf_merge_private_bfd_data
9044
#define bfd_elf32_bfd_set_private_flags _bfd_mips_elf_set_private_flags
9045
#define bfd_elf32_bfd_print_private_bfd_data \
9046
                                        _bfd_mips_elf_print_private_bfd_data
9047
#include "elf32-target.h"

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.