Coverage Report

Created: 2025-06-24 06:45

/src/binutils-gdb/bfd/elfxx-mips.c
Line
Count
Source (jump to first uncovered line)
1
/* MIPS-specific support for ELF
2
   Copyright (C) 1993-2025 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
   Traditional MIPS targets support added by Koundinya.K, Dansk Data
9
   Elektronik & Operations Research Group. <kk@ddeorg.soft.net>
10
11
   This file is part of BFD, the Binary File Descriptor library.
12
13
   This program is free software; you can redistribute it and/or modify
14
   it under the terms of the GNU General Public License as published by
15
   the Free Software Foundation; either version 3 of the License, or
16
   (at your option) any later version.
17
18
   This program is distributed in the hope that it will be useful,
19
   but WITHOUT ANY WARRANTY; without even the implied warranty of
20
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
   GNU General Public License for more details.
22
23
   You should have received a copy of the GNU General Public License
24
   along with this program; if not, write to the Free Software
25
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
26
   MA 02110-1301, USA.  */
27
28
29
/* This file handles functionality common to the different MIPS ABI's.  */
30
31
#include "sysdep.h"
32
#include "bfd.h"
33
#include "libbfd.h"
34
#include "libiberty.h"
35
#include "elf-bfd.h"
36
#include "ecoff-bfd.h"
37
#include "elfxx-mips.h"
38
#include "elf/mips.h"
39
#include "elf-vxworks.h"
40
#include "dwarf2.h"
41
42
/* Get the ECOFF swapping routines.  */
43
#include "coff/sym.h"
44
#include "coff/symconst.h"
45
#include "coff/ecoff.h"
46
#include "coff/mips.h"
47
48
#include "hashtab.h"
49
50
/* Types of TLS GOT entry.  */
51
enum mips_got_tls_type {
52
  GOT_TLS_NONE,
53
  GOT_TLS_GD,
54
  GOT_TLS_LDM,
55
  GOT_TLS_IE
56
};
57
58
/* This structure is used to hold information about one GOT entry.
59
   There are four types of entry:
60
61
      (1) an absolute address
62
      requires: abfd == NULL
63
      fields: d.address
64
65
      (2) a SYMBOL + OFFSET address, where SYMBOL is local to an input bfd
66
      requires: abfd != NULL, symndx >= 0, tls_type != GOT_TLS_LDM
67
      fields: abfd, symndx, d.addend, tls_type
68
69
      (3) a SYMBOL address, where SYMBOL is not local to an input bfd
70
      requires: abfd != NULL, symndx == -1
71
      fields: d.h, tls_type
72
73
      (4) a TLS LDM slot
74
      requires: abfd != NULL, symndx == 0, tls_type == GOT_TLS_LDM
75
      fields: none; there's only one of these per GOT.  */
76
struct mips_got_entry
77
{
78
  /* One input bfd that needs the GOT entry.  */
79
  bfd *abfd;
80
  /* The index of the symbol, as stored in the relocation r_info, if
81
     we have a local symbol; -1 otherwise.  */
82
  long symndx;
83
  union
84
  {
85
    /* If abfd == NULL, an address that must be stored in the got.  */
86
    bfd_vma address;
87
    /* If abfd != NULL && symndx != -1, the addend of the relocation
88
       that should be added to the symbol value.  */
89
    bfd_vma addend;
90
    /* If abfd != NULL && symndx == -1, the hash table entry
91
       corresponding to a symbol in the GOT.  The symbol's entry
92
       is in the local area if h->global_got_area is GGA_NONE,
93
       otherwise it is in the global area.  */
94
    struct mips_elf_link_hash_entry *h;
95
  } d;
96
97
  /* The TLS type of this GOT entry.  An LDM GOT entry will be a local
98
     symbol entry with r_symndx == 0.  */
99
  unsigned char tls_type;
100
101
  /* True if we have filled in the GOT contents for a TLS entry,
102
     and created the associated relocations.  */
103
  unsigned char tls_initialized;
104
105
  /* The offset from the beginning of the .got section to the entry
106
     corresponding to this symbol+addend.  If it's a global symbol
107
     whose offset is yet to be decided, it's going to be -1.  */
108
  long gotidx;
109
};
110
111
/* This structure represents a GOT page reference from an input bfd.
112
   Each instance represents a symbol + ADDEND, where the representation
113
   of the symbol depends on whether it is local to the input bfd.
114
   If it is, then SYMNDX >= 0, and the symbol has index SYMNDX in U.ABFD.
115
   Otherwise, SYMNDX < 0 and U.H points to the symbol's hash table entry.
116
117
   Page references with SYMNDX >= 0 always become page references
118
   in the output.  Page references with SYMNDX < 0 only become page
119
   references if the symbol binds locally; in other cases, the page
120
   reference decays to a global GOT reference.  */
121
struct mips_got_page_ref
122
{
123
  long symndx;
124
  union
125
  {
126
    struct mips_elf_link_hash_entry *h;
127
    bfd *abfd;
128
  } u;
129
  bfd_vma addend;
130
};
131
132
/* This structure describes a range of addends: [MIN_ADDEND, MAX_ADDEND].
133
   The structures form a non-overlapping list that is sorted by increasing
134
   MIN_ADDEND.  */
135
struct mips_got_page_range
136
{
137
  struct mips_got_page_range *next;
138
  bfd_signed_vma min_addend;
139
  bfd_signed_vma max_addend;
140
};
141
142
/* This structure describes the range of addends that are applied to page
143
   relocations against a given section.  */
144
struct mips_got_page_entry
145
{
146
  /* The section that these entries are based on.  */
147
  asection *sec;
148
  /* The ranges for this page entry.  */
149
  struct mips_got_page_range *ranges;
150
  /* The maximum number of page entries needed for RANGES.  */
151
  bfd_vma num_pages;
152
};
153
154
/* This structure is used to hold .got information when linking.  */
155
156
struct mips_got_info
157
{
158
  /* The number of global .got entries.  */
159
  unsigned int global_gotno;
160
  /* The number of global .got entries that are in the GGA_RELOC_ONLY area.  */
161
  unsigned int reloc_only_gotno;
162
  /* The number of .got slots used for TLS.  */
163
  unsigned int tls_gotno;
164
  /* The first unused TLS .got entry.  Used only during
165
     mips_elf_initialize_tls_index.  */
166
  unsigned int tls_assigned_gotno;
167
  /* The number of local .got entries, eventually including page entries.  */
168
  unsigned int local_gotno;
169
  /* The maximum number of page entries needed.  */
170
  unsigned int page_gotno;
171
  /* The number of relocations needed for the GOT entries.  */
172
  unsigned int relocs;
173
  /* The first unused local .got entry.  */
174
  unsigned int assigned_low_gotno;
175
  /* The last unused local .got entry.  */
176
  unsigned int assigned_high_gotno;
177
  /* A hash table holding members of the got.  */
178
  struct htab *got_entries;
179
  /* A hash table holding mips_got_page_ref structures.  */
180
  struct htab *got_page_refs;
181
  /* A hash table of mips_got_page_entry structures.  */
182
  struct htab *got_page_entries;
183
  /* In multi-got links, a pointer to the next got (err, rather, most
184
     of the time, it points to the previous got).  */
185
  struct mips_got_info *next;
186
};
187
188
/* Structure passed when merging bfds' gots.  */
189
190
struct mips_elf_got_per_bfd_arg
191
{
192
  /* The output bfd.  */
193
  bfd *obfd;
194
  /* The link information.  */
195
  struct bfd_link_info *info;
196
  /* A pointer to the primary got, i.e., the one that's going to get
197
     the implicit relocations from DT_MIPS_LOCAL_GOTNO and
198
     DT_MIPS_GOTSYM.  */
199
  struct mips_got_info *primary;
200
  /* A non-primary got we're trying to merge with other input bfd's
201
     gots.  */
202
  struct mips_got_info *current;
203
  /* The maximum number of got entries that can be addressed with a
204
     16-bit offset.  */
205
  unsigned int max_count;
206
  /* The maximum number of page entries needed by each got.  */
207
  unsigned int max_pages;
208
  /* The total number of global entries which will live in the
209
     primary got and be automatically relocated.  This includes
210
     those not referenced by the primary GOT but included in
211
     the "master" GOT.  */
212
  unsigned int global_count;
213
};
214
215
/* A structure used to pass information to htab_traverse callbacks
216
   when laying out the GOT.  */
217
218
struct mips_elf_traverse_got_arg
219
{
220
  struct bfd_link_info *info;
221
  struct mips_got_info *g;
222
  int value;
223
};
224
225
struct _mips_elf_section_data
226
{
227
  struct bfd_elf_section_data elf;
228
  union
229
  {
230
    bfd_byte *tdata;
231
  } u;
232
};
233
234
#define mips_elf_section_data(sec) \
235
0
  ((struct _mips_elf_section_data *) elf_section_data (sec))
236
237
#define is_mips_elf(bfd)        \
238
0
  (bfd_get_flavour (bfd) == bfd_target_elf_flavour  \
239
0
   && elf_tdata (bfd) != NULL        \
240
0
   && elf_object_id (bfd) == MIPS_ELF_DATA)
241
242
/* The ABI says that every symbol used by dynamic relocations must have
243
   a global GOT entry.  Among other things, this provides the dynamic
244
   linker with a free, directly-indexed cache.  The GOT can therefore
245
   contain symbols that are not referenced by GOT relocations themselves
246
   (in other words, it may have symbols that are not referenced by things
247
   like R_MIPS_GOT16 and R_MIPS_GOT_PAGE).
248
249
   GOT relocations are less likely to overflow if we put the associated
250
   GOT entries towards the beginning.  We therefore divide the global
251
   GOT entries into two areas: "normal" and "reloc-only".  Entries in
252
   the first area can be used for both dynamic relocations and GP-relative
253
   accesses, while those in the "reloc-only" area are for dynamic
254
   relocations only.
255
256
   These GGA_* ("Global GOT Area") values are organised so that lower
257
   values are more general than higher values.  Also, non-GGA_NONE
258
   values are ordered by the position of the area in the GOT.  */
259
0
#define GGA_NORMAL 0
260
0
#define GGA_RELOC_ONLY 1
261
0
#define GGA_NONE 2
262
263
/* Information about a non-PIC interface to a PIC function.  There are
264
   two ways of creating these interfaces.  The first is to add:
265
266
  lui $25,%hi(func)
267
  addiu $25,$25,%lo(func)
268
269
   immediately before a PIC function "func".  The second is to add:
270
271
  lui $25,%hi(func)
272
  j func
273
  addiu $25,$25,%lo(func)
274
275
   to a separate trampoline section.
276
277
   Stubs of the first kind go in a new section immediately before the
278
   target function.  Stubs of the second kind go in a single section
279
   pointed to by the hash table's "strampoline" field.  */
280
struct mips_elf_la25_stub {
281
  /* The generated section that contains this stub.  */
282
  asection *stub_section;
283
284
  /* The offset of the stub from the start of STUB_SECTION.  */
285
  bfd_vma offset;
286
287
  /* One symbol for the original function.  Its location is available
288
     in H->root.root.u.def.  */
289
  struct mips_elf_link_hash_entry *h;
290
};
291
292
/* Macros for populating a mips_elf_la25_stub.  */
293
294
#define LA25_LUI(VAL) (0x3c190000 | (VAL))  /* lui t9,VAL */
295
#define LA25_J(VAL) (0x08000000 | (((VAL) >> 2) & 0x3ffffff)) /* j VAL */
296
#define LA25_BC(VAL) (0xc8000000 | (((VAL) >> 2) & 0x3ffffff)) /* bc VAL */
297
#define LA25_ADDIU(VAL) (0x27390000 | (VAL))  /* addiu t9,t9,VAL */
298
#define LA25_LUI_MICROMIPS(VAL)           \
299
0
  (0x41b90000 | (VAL))        /* lui t9,VAL */
300
#define LA25_J_MICROMIPS(VAL)           \
301
0
  (0xd4000000 | (((VAL) >> 1) & 0x3ffffff))  /* j VAL */
302
#define LA25_ADDIU_MICROMIPS(VAL)         \
303
0
  (0x33390000 | (VAL))        /* addiu t9,t9,VAL */
304
305
/* This structure is passed to mips_elf_sort_hash_table_f when sorting
306
   the dynamic symbols.  */
307
308
struct mips_elf_hash_sort_data
309
{
310
  /* The symbol in the global GOT with the lowest dynamic symbol table
311
     index.  */
312
  struct elf_link_hash_entry *low;
313
  /* The least dynamic symbol table index corresponding to a non-TLS
314
     symbol with a GOT entry.  */
315
  bfd_size_type min_got_dynindx;
316
  /* The greatest dynamic symbol table index corresponding to a symbol
317
     with a GOT entry that is not referenced (e.g., a dynamic symbol
318
     with dynamic relocations pointing to it from non-primary GOTs).  */
319
  bfd_size_type max_unref_got_dynindx;
320
  /* The greatest dynamic symbol table index corresponding to a local
321
     symbol.  */
322
  bfd_size_type max_local_dynindx;
323
  /* The greatest dynamic symbol table index corresponding to an external
324
     symbol without a GOT entry.  */
325
  bfd_size_type max_non_got_dynindx;
326
  /* If non-NULL, output BFD for .MIPS.xhash finalization.  */
327
  bfd *output_bfd;
328
  /* If non-NULL, pointer to contents of .MIPS.xhash for filling in
329
     real final dynindx.  */
330
  bfd_byte *mipsxhash;
331
};
332
333
/* We make up to two PLT entries if needed, one for standard MIPS code
334
   and one for compressed code, either a MIPS16 or microMIPS one.  We
335
   keep a separate record of traditional lazy-binding stubs, for easier
336
   processing.  */
337
338
struct plt_entry
339
{
340
  /* Traditional SVR4 stub offset, or -1 if none.  */
341
  bfd_vma stub_offset;
342
343
  /* Standard PLT entry offset, or -1 if none.  */
344
  bfd_vma mips_offset;
345
346
  /* Compressed PLT entry offset, or -1 if none.  */
347
  bfd_vma comp_offset;
348
349
  /* The corresponding .got.plt index, or -1 if none.  */
350
  bfd_vma gotplt_index;
351
352
  /* Whether we need a standard PLT entry.  */
353
  unsigned int need_mips : 1;
354
355
  /* Whether we need a compressed PLT entry.  */
356
  unsigned int need_comp : 1;
357
};
358
359
/* The MIPS ELF linker needs additional information for each symbol in
360
   the global hash table.  */
361
362
struct mips_elf_link_hash_entry
363
{
364
  struct elf_link_hash_entry root;
365
366
  /* External symbol information.  */
367
  EXTR esym;
368
369
  /* The la25 stub we have created for ths symbol, if any.  */
370
  struct mips_elf_la25_stub *la25_stub;
371
372
  /* Number of R_MIPS_32, R_MIPS_REL32, or R_MIPS_64 relocs against
373
     this symbol.  */
374
  unsigned int possibly_dynamic_relocs;
375
376
  /* If there is a stub that 32 bit functions should use to call this
377
     16 bit function, this points to the section containing the stub.  */
378
  asection *fn_stub;
379
380
  /* If there is a stub that 16 bit functions should use to call this
381
     32 bit function, this points to the section containing the stub.  */
382
  asection *call_stub;
383
384
  /* This is like the call_stub field, but it is used if the function
385
     being called returns a floating point value.  */
386
  asection *call_fp_stub;
387
388
  /* If non-zero, location in .MIPS.xhash to write real final dynindx.  */
389
  bfd_vma mipsxhash_loc;
390
391
  /* The highest GGA_* value that satisfies all references to this symbol.  */
392
  unsigned int global_got_area : 2;
393
394
  /* True if all GOT relocations against this symbol are for calls.  This is
395
     a looser condition than no_fn_stub below, because there may be other
396
     non-call non-GOT relocations against the symbol.  */
397
  unsigned int got_only_for_calls : 1;
398
399
  /* True if one of the relocations described by possibly_dynamic_relocs
400
     is against a readonly section.  */
401
  unsigned int readonly_reloc : 1;
402
403
  /* True if there is a relocation against this symbol that must be
404
     resolved by the static linker (in other words, if the relocation
405
     cannot possibly be made dynamic).  */
406
  unsigned int has_static_relocs : 1;
407
408
  /* True if we must not create a .MIPS.stubs entry for this symbol.
409
     This is set, for example, if there are relocations related to
410
     taking the function's address, i.e. any but R_MIPS_CALL*16 ones.
411
     See "MIPS ABI Supplement, 3rd Edition", p. 4-20.  */
412
  unsigned int no_fn_stub : 1;
413
414
  /* Whether we need the fn_stub; this is true if this symbol appears
415
     in any relocs other than a 16 bit call.  */
416
  unsigned int need_fn_stub : 1;
417
418
  /* True if this symbol is referenced by branch relocations from
419
     any non-PIC input file.  This is used to determine whether an
420
     la25 stub is required.  */
421
  unsigned int has_nonpic_branches : 1;
422
423
  /* Does this symbol need a traditional MIPS lazy-binding stub
424
     (as opposed to a PLT entry)?  */
425
  unsigned int needs_lazy_stub : 1;
426
427
  /* Does this symbol resolve to a PLT entry?  */
428
  unsigned int use_plt_entry : 1;
429
};
430
431
/* MIPS ELF linker hash table.  */
432
433
struct mips_elf_link_hash_table
434
{
435
  struct elf_link_hash_table root;
436
437
  /* The number of .rtproc entries.  */
438
  bfd_size_type procedure_count;
439
440
  /* The size of the .compact_rel section (if SGI_COMPAT).  */
441
  bfd_size_type compact_rel_size;
442
443
  /* This flag indicates that the value of DT_MIPS_RLD_MAP dynamic entry
444
     is set to the address of __rld_obj_head as in IRIX5 and IRIX6.  */
445
  bool use_rld_obj_head;
446
447
  /* The  __rld_map or __rld_obj_head symbol. */
448
  struct elf_link_hash_entry *rld_symbol;
449
450
  /* This is set if we see any mips16 stub sections.  */
451
  bool mips16_stubs_seen;
452
453
  /* True if we can generate copy relocs and PLTs.  */
454
  bool use_plts_and_copy_relocs;
455
456
  /* True if we can only use 32-bit microMIPS instructions.  */
457
  bool insn32;
458
459
  /* True if we suppress checks for invalid branches between ISA modes.  */
460
  bool ignore_branch_isa;
461
462
  /* True if we are targetting R6 compact branches.  */
463
  bool compact_branches;
464
465
  /* True if we already reported the small-data section overflow.  */
466
  bool small_data_overflow_reported;
467
468
  /* True if we use the special `__gnu_absolute_zero' symbol.  */
469
  bool use_absolute_zero;
470
471
  /* True if we have been configured for a GNU target.  */
472
  bool gnu_target;
473
474
  /* Shortcuts to some dynamic sections, or NULL if they are not
475
     being used.  */
476
  asection *srelplt2;
477
  asection *sstubs;
478
479
  /* The master GOT information.  */
480
  struct mips_got_info *got_info;
481
482
  /* The global symbol in the GOT with the lowest index in the dynamic
483
     symbol table.  */
484
  struct elf_link_hash_entry *global_gotsym;
485
486
  /* The size of the PLT header in bytes.  */
487
  bfd_vma plt_header_size;
488
489
  /* The size of a standard PLT entry in bytes.  */
490
  bfd_vma plt_mips_entry_size;
491
492
  /* The size of a compressed PLT entry in bytes.  */
493
  bfd_vma plt_comp_entry_size;
494
495
  /* The offset of the next standard PLT entry to create.  */
496
  bfd_vma plt_mips_offset;
497
498
  /* The offset of the next compressed PLT entry to create.  */
499
  bfd_vma plt_comp_offset;
500
501
  /* The index of the next .got.plt entry to create.  */
502
  bfd_vma plt_got_index;
503
504
  /* The number of functions that need a lazy-binding stub.  */
505
  bfd_vma lazy_stub_count;
506
507
  /* The size of a function stub entry in bytes.  */
508
  bfd_vma function_stub_size;
509
510
  /* The number of reserved entries at the beginning of the GOT.  */
511
  unsigned int reserved_gotno;
512
513
  /* The section used for mips_elf_la25_stub trampolines.
514
     See the comment above that structure for details.  */
515
  asection *strampoline;
516
517
  /* A table of mips_elf_la25_stubs, indexed by (input_section, offset)
518
     pairs.  */
519
  htab_t la25_stubs;
520
521
  /* A function FN (NAME, IS, OS) that creates a new input section
522
     called NAME and links it to output section OS.  If IS is nonnull,
523
     the new section should go immediately before it, otherwise it
524
     should go at the (current) beginning of OS.
525
526
     The function returns the new section on success, otherwise it
527
     returns null.  */
528
  asection *(*add_stub_section) (const char *, asection *, asection *);
529
530
  /* Is the PLT header compressed?  */
531
  unsigned int plt_header_is_comp : 1;
532
};
533
534
/* Get the MIPS ELF linker hash table from a link_info structure.  */
535
536
#define mips_elf_hash_table(p) \
537
0
  ((is_elf_hash_table ((p)->hash)          \
538
0
    && elf_hash_table_id (elf_hash_table (p)) == MIPS_ELF_DATA)   \
539
0
   ? (struct mips_elf_link_hash_table *) (p)->hash : NULL)
540
541
/* A structure used to communicate with htab_traverse callbacks.  */
542
struct mips_htab_traverse_info
543
{
544
  /* The usual link-wide information.  */
545
  struct bfd_link_info *info;
546
  bfd *output_bfd;
547
548
  /* Starts off FALSE and is set to TRUE if the link should be aborted.  */
549
  bool error;
550
};
551
552
/* Used to store a REL high-part relocation such as R_MIPS_HI16 or
553
   R_MIPS_GOT16.  REL is the relocation, INPUT_SECTION is the section
554
   that contains the relocation field and DATA points to the start of
555
   INPUT_SECTION.  */
556
557
struct mips_hi16
558
{
559
  struct mips_hi16 *next;
560
  bfd_byte *data;
561
  asection *input_section;
562
  arelent rel;
563
};
564
565
/* MIPS ELF private object data.  */
566
567
struct mips_elf_obj_tdata
568
{
569
  /* Generic ELF private object data.  */
570
  struct elf_obj_tdata root;
571
572
  /* Input BFD providing Tag_GNU_MIPS_ABI_FP attribute for output.  */
573
  bfd *abi_fp_bfd;
574
575
  /* Input BFD providing Tag_GNU_MIPS_ABI_MSA attribute for output.  */
576
  bfd *abi_msa_bfd;
577
578
  /* The abiflags for this object.  */
579
  Elf_Internal_ABIFlags_v0 abiflags;
580
  bool abiflags_valid;
581
582
  /* The GOT requirements of input bfds.  */
583
  struct mips_got_info *got;
584
585
  /* Used by _bfd_mips_elf_find_nearest_line.  The structure could be
586
     included directly in this one, but there's no point to wasting
587
     the memory just for the infrequently called find_nearest_line.  */
588
  struct mips_elf_find_line *find_line_info;
589
590
  /* An array of stub sections indexed by symbol number.  */
591
  asection **local_stubs;
592
  asection **local_call_stubs;
593
594
  /* The Irix 5 support uses two virtual sections, which represent
595
     text/data symbols defined in dynamic objects.  */
596
  asection *elf_data_section;
597
  asection *elf_text_section;
598
599
  struct mips_hi16 *mips_hi16_list;
600
};
601
602
/* Get MIPS ELF private object data from BFD's tdata.  */
603
604
#define mips_elf_tdata(bfd) \
605
1.96M
  ((struct mips_elf_obj_tdata *) (bfd)->tdata.any)
606
607
#define TLS_RELOC_P(r_type) \
608
0
  (r_type == R_MIPS_TLS_DTPMOD32    \
609
0
   || r_type == R_MIPS_TLS_DTPMOD64    \
610
0
   || r_type == R_MIPS_TLS_DTPREL32    \
611
0
   || r_type == R_MIPS_TLS_DTPREL64    \
612
0
   || r_type == R_MIPS_TLS_GD      \
613
0
   || r_type == R_MIPS_TLS_LDM      \
614
0
   || r_type == R_MIPS_TLS_DTPREL_HI16    \
615
0
   || r_type == R_MIPS_TLS_DTPREL_LO16    \
616
0
   || r_type == R_MIPS_TLS_GOTTPREL    \
617
0
   || r_type == R_MIPS_TLS_TPREL32    \
618
0
   || r_type == R_MIPS_TLS_TPREL64    \
619
0
   || r_type == R_MIPS_TLS_TPREL_HI16    \
620
0
   || r_type == R_MIPS_TLS_TPREL_LO16    \
621
0
   || r_type == R_MIPS16_TLS_GD      \
622
0
   || r_type == R_MIPS16_TLS_LDM    \
623
0
   || r_type == R_MIPS16_TLS_DTPREL_HI16  \
624
0
   || r_type == R_MIPS16_TLS_DTPREL_LO16  \
625
0
   || r_type == R_MIPS16_TLS_GOTTPREL    \
626
0
   || r_type == R_MIPS16_TLS_TPREL_HI16    \
627
0
   || r_type == R_MIPS16_TLS_TPREL_LO16    \
628
0
   || r_type == R_MICROMIPS_TLS_GD    \
629
0
   || r_type == R_MICROMIPS_TLS_LDM    \
630
0
   || r_type == R_MICROMIPS_TLS_DTPREL_HI16  \
631
0
   || r_type == R_MICROMIPS_TLS_DTPREL_LO16  \
632
0
   || r_type == R_MICROMIPS_TLS_GOTTPREL  \
633
0
   || r_type == R_MICROMIPS_TLS_TPREL_HI16  \
634
0
   || r_type == R_MICROMIPS_TLS_TPREL_LO16)
635
636
/* Structure used to pass information to mips_elf_output_extsym.  */
637
638
struct extsym_info
639
{
640
  bfd *abfd;
641
  struct bfd_link_info *info;
642
  struct ecoff_debug_info *debug;
643
  const struct ecoff_debug_swap *swap;
644
  bool failed;
645
};
646
647
/* The names of the runtime procedure table symbols used on IRIX5.  */
648
649
static const char * const mips_elf_dynsym_rtproc_names[] =
650
{
651
  "_procedure_table",
652
  "_procedure_string_table",
653
  "_procedure_table_size",
654
  NULL
655
};
656
657
/* These structures are used to generate the .compact_rel section on
658
   IRIX5.  */
659
660
typedef struct
661
{
662
  unsigned long id1;    /* Always one?  */
663
  unsigned long num;    /* Number of compact relocation entries.  */
664
  unsigned long id2;    /* Always two?  */
665
  unsigned long offset;   /* The file offset of the first relocation.  */
666
  unsigned long reserved0;  /* Zero?  */
667
  unsigned long reserved1;  /* Zero?  */
668
} Elf32_compact_rel;
669
670
typedef struct
671
{
672
  bfd_byte id1[4];
673
  bfd_byte num[4];
674
  bfd_byte id2[4];
675
  bfd_byte offset[4];
676
  bfd_byte reserved0[4];
677
  bfd_byte reserved1[4];
678
} Elf32_External_compact_rel;
679
680
typedef struct
681
{
682
  unsigned int ctype : 1; /* 1: long 0: short format. See below.  */
683
  unsigned int rtype : 4; /* Relocation types. See below.  */
684
  unsigned int dist2to : 8;
685
  unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
686
  unsigned long konst;    /* KONST field. See below.  */
687
  unsigned long vaddr;    /* VADDR to be relocated.  */
688
} Elf32_crinfo;
689
690
typedef struct
691
{
692
  unsigned int ctype : 1; /* 1: long 0: short format. See below.  */
693
  unsigned int rtype : 4; /* Relocation types. See below.  */
694
  unsigned int dist2to : 8;
695
  unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
696
  unsigned long konst;    /* KONST field. See below.  */
697
} Elf32_crinfo2;
698
699
typedef struct
700
{
701
  bfd_byte info[4];
702
  bfd_byte konst[4];
703
  bfd_byte vaddr[4];
704
} Elf32_External_crinfo;
705
706
typedef struct
707
{
708
  bfd_byte info[4];
709
  bfd_byte konst[4];
710
} Elf32_External_crinfo2;
711
712
/* These are the constants used to swap the bitfields in a crinfo.  */
713
714
0
#define CRINFO_CTYPE (0x1U)
715
0
#define CRINFO_CTYPE_SH (31)
716
0
#define CRINFO_RTYPE (0xfU)
717
0
#define CRINFO_RTYPE_SH (27)
718
0
#define CRINFO_DIST2TO (0xffU)
719
0
#define CRINFO_DIST2TO_SH (19)
720
0
#define CRINFO_RELVADDR (0x7ffffU)
721
0
#define CRINFO_RELVADDR_SH (0)
722
723
/* A compact relocation info has long (3 words) or short (2 words)
724
   formats.  A short format doesn't have VADDR field and relvaddr
725
   fields contains ((VADDR - vaddr of the previous entry) >> 2).  */
726
#define CRF_MIPS_LONG     1
727
#define CRF_MIPS_SHORT      0
728
729
/* There are 4 types of compact relocation at least. The value KONST
730
   has different meaning for each type:
731
732
   (type)   (konst)
733
   CT_MIPS_REL32  Address in data
734
   CT_MIPS_WORD   Address in word (XXX)
735
   CT_MIPS_GPHI_LO  GP - vaddr
736
   CT_MIPS_JMPAD  Address to jump
737
   */
738
739
#define CRT_MIPS_REL32      0xa
740
#define CRT_MIPS_WORD     0xb
741
#define CRT_MIPS_GPHI_LO    0xc
742
#define CRT_MIPS_JMPAD      0xd
743
744
0
#define mips_elf_set_cr_format(x,format)  ((x).ctype = (format))
745
0
#define mips_elf_set_cr_type(x,type)    ((x).rtype = (type))
746
0
#define mips_elf_set_cr_dist2to(x,v)    ((x).dist2to = (v))
747
0
#define mips_elf_set_cr_relvaddr(x,d)   ((x).relvaddr = (d)<<2)
748

749
/* The structure of the runtime procedure descriptor created by the
750
   loader for use by the static exception system.  */
751
752
typedef struct runtime_pdr {
753
  bfd_vma adr;    /* Memory address of start of procedure.  */
754
  long  regmask;  /* Save register mask.  */
755
  long  regoffset;  /* Save register offset.  */
756
  long  fregmask; /* Save floating point register mask.  */
757
  long  fregoffset; /* Save floating point register offset.  */
758
  long  frameoffset;  /* Frame size.  */
759
  short framereg; /* Frame pointer register.  */
760
  short pcreg;    /* Offset or reg of return pc.  */
761
  long  irpss;    /* Index into the runtime string table.  */
762
  long  reserved;
763
  struct exception_info *exception_info;/* Pointer to exception array.  */
764
} RPDR, *pRPDR;
765
#define cbRPDR sizeof (RPDR)
766
#define rpdNil ((pRPDR) 0)
767

768
static struct mips_got_entry *mips_elf_create_local_got_entry
769
  (bfd *, struct bfd_link_info *, bfd *, bfd_vma, unsigned long,
770
   struct mips_elf_link_hash_entry *, int);
771
static bool mips_elf_sort_hash_table_f
772
  (struct mips_elf_link_hash_entry *, void *);
773
static bfd_vma mips_elf_high
774
  (bfd_vma);
775
static bool mips_elf_create_dynamic_relocation
776
  (bfd *, struct bfd_link_info *, const Elf_Internal_Rela *,
777
   struct mips_elf_link_hash_entry *, asection *, bfd_vma,
778
   bfd_vma *, asection *);
779
static bfd_vma mips_elf_adjust_gp
780
  (bfd *, struct mips_got_info *, bfd *);
781
782
/* This will be used when we sort the dynamic relocation records.  */
783
static bfd *reldyn_sorting_bfd;
784
785
/* True if ABFD is for CPUs with load interlocking that include
786
   non-MIPS1 CPUs and R3900.  */
787
#define LOAD_INTERLOCKS_P(abfd) \
788
0
  (   ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) != EF_MIPS_ARCH_1) \
789
0
   || ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == EF_MIPS_MACH_3900))
790
791
/* True if ABFD is for CPUs that are faster if JAL is converted to BAL.
792
   This should be safe for all architectures.  We enable this predicate
793
   for RM9000 for now.  */
794
#define JAL_TO_BAL_P(abfd) \
795
0
  ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == EF_MIPS_MACH_9000)
796
797
/* True if ABFD is for CPUs that are faster if JALR is converted to BAL.
798
   This should be safe for all architectures.  We enable this predicate for
799
   all CPUs.  */
800
0
#define JALR_TO_BAL_P(abfd) 1
801
802
/* True if ABFD is for CPUs that are faster if JR is converted to B.
803
   This should be safe for all architectures.  We enable this predicate for
804
   all CPUs.  */
805
0
#define JR_TO_B_P(abfd) 1
806
807
/* True if ABFD is a PIC object.  */
808
#define PIC_OBJECT_P(abfd) \
809
0
  ((elf_elfheader (abfd)->e_flags & EF_MIPS_PIC) != 0)
810
811
/* Nonzero if ABFD is using the O32 ABI.  */
812
#define ABI_O32_P(abfd) \
813
  ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == EF_MIPS_ABI_O32)
814
815
/* Nonzero if ABFD is using the N32 ABI.  */
816
#define ABI_N32_P(abfd) \
817
4.46k
  ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
818
819
/* Nonzero if ABFD is using the N64 ABI.  */
820
#define ABI_64_P(abfd) \
821
3.64k
  (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
822
823
/* Nonzero if ABFD is using NewABI conventions.  */
824
2.13k
#define NEWABI_P(abfd) (ABI_N32_P (abfd) || ABI_64_P (abfd))
825
826
/* Nonzero if ABFD has microMIPS code.  */
827
#define MICROMIPS_P(abfd) \
828
70
  ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS) != 0)
829
830
/* Nonzero if ABFD is MIPS R6.  */
831
#define MIPSR6_P(abfd) \
832
0
  ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32R6 \
833
0
    || (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_64R6)
834
835
/* The IRIX compatibility level we are striving for.  */
836
#define IRIX_COMPAT(abfd) \
837
6
  (get_elf_backend_data (abfd)->elf_backend_mips_irix_compat (abfd))
838
839
/* Whether we are trying to be compatible with IRIX at all.  */
840
#define SGI_COMPAT(abfd) \
841
6
  (IRIX_COMPAT (abfd) != ict_none)
842
843
/* The name of the options section.  */
844
#define MIPS_ELF_OPTIONS_SECTION_NAME(abfd) \
845
2.13k
  (NEWABI_P (abfd) ? ".MIPS.options" : ".options")
846
847
/* True if NAME is the recognized name of any SHT_MIPS_OPTIONS section.
848
   Some IRIX system files do not use MIPS_ELF_OPTIONS_SECTION_NAME.  */
849
#define MIPS_ELF_OPTIONS_SECTION_NAME_P(NAME) \
850
9.94k
  (strcmp (NAME, ".MIPS.options") == 0 || strcmp (NAME, ".options") == 0)
851
852
/* True if NAME is the recognized name of any SHT_MIPS_ABIFLAGS section.  */
853
#define MIPS_ELF_ABIFLAGS_SECTION_NAME_P(NAME) \
854
489
  (strcmp (NAME, ".MIPS.abiflags") == 0)
855
856
/* Whether the section is readonly.  */
857
#define MIPS_ELF_READONLY_SECTION(sec) \
858
0
  ((sec->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))    \
859
0
   == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
860
861
/* The name of the stub section.  */
862
0
#define MIPS_ELF_STUB_SECTION_NAME(abfd) ".MIPS.stubs"
863
864
/* The size of an external REL relocation.  */
865
#define MIPS_ELF_REL_SIZE(abfd) \
866
0
  (get_elf_backend_data (abfd)->s->sizeof_rel)
867
868
/* The size of an external RELA relocation.  */
869
#define MIPS_ELF_RELA_SIZE(abfd) \
870
0
  (get_elf_backend_data (abfd)->s->sizeof_rela)
871
872
/* The size of an external dynamic table entry.  */
873
#define MIPS_ELF_DYN_SIZE(abfd) \
874
0
  (get_elf_backend_data (abfd)->s->sizeof_dyn)
875
876
/* The size of a GOT entry.  */
877
#define MIPS_ELF_GOT_SIZE(abfd) \
878
0
  (get_elf_backend_data (abfd)->s->arch_size / 8)
879
880
/* The size of the .rld_map section. */
881
#define MIPS_ELF_RLD_MAP_SIZE(abfd) \
882
0
  (get_elf_backend_data (abfd)->s->arch_size / 8)
883
884
/* The size of a symbol-table entry.  */
885
#define MIPS_ELF_SYM_SIZE(abfd) \
886
0
  (get_elf_backend_data (abfd)->s->sizeof_sym)
887
888
/* The default alignment for sections, as a power of two.  */
889
#define MIPS_ELF_LOG_FILE_ALIGN(abfd)       \
890
0
  (get_elf_backend_data (abfd)->s->log_file_align)
891
892
/* Get word-sized data.  */
893
#define MIPS_ELF_GET_WORD(abfd, ptr) \
894
  (ABI_64_P (abfd) ? bfd_get_64 (abfd, ptr) : bfd_get_32 (abfd, ptr))
895
896
/* Put out word-sized data.  */
897
#define MIPS_ELF_PUT_WORD(abfd, val, ptr) \
898
0
  (ABI_64_P (abfd)       \
899
0
   ? bfd_put_64 (abfd, val, ptr)   \
900
0
   : bfd_put_32 (abfd, val, ptr))
901
902
/* The opcode for word-sized loads (LW or LD).  */
903
#define MIPS_ELF_LOAD_WORD(abfd) \
904
0
  (ABI_64_P (abfd) ? 0xdc000000 : 0x8c000000)
905
906
/* Add a dynamic symbol table-entry.  */
907
#define MIPS_ELF_ADD_DYNAMIC_ENTRY(info, tag, val)  \
908
0
  _bfd_elf_add_dynamic_entry (info, tag, val)
909
910
#define MIPS_ELF_RTYPE_TO_HOWTO(abfd, rtype, rela)      \
911
13
  (get_elf_backend_data (abfd)->elf_backend_mips_rtype_to_howto (abfd, rtype, rela))
912
913
/* The name of the dynamic relocation section.  */
914
#define MIPS_ELF_REL_DYN_NAME(INFO) \
915
0
  (mips_elf_hash_table (INFO)->root.target_os == is_vxworks \
916
0
   ? ".rela.dyn" : ".rel.dyn")
917
918
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
919
   from smaller values.  Start with zero, widen, *then* decrement.  */
920
0
#define MINUS_ONE (((bfd_vma)0) - 1)
921
0
#define MINUS_TWO (((bfd_vma)0) - 2)
922
923
/* The value to write into got[1] for SVR4 targets, to identify it is
924
   a GNU object.  The dynamic linker can then use got[1] to store the
925
   module pointer.  */
926
#define MIPS_ELF_GNU_GOT1_MASK(abfd) \
927
  ((bfd_vma) 1 << (ABI_64_P (abfd) ? 63 : 31))
928
929
/* The offset of $gp from the beginning of the .got section.  */
930
#define ELF_MIPS_GP_OFFSET(INFO) \
931
0
  (mips_elf_hash_table (INFO)->root.target_os == is_vxworks \
932
0
   ? 0x0 : 0x7ff0)
933
934
/* The maximum size of the GOT for it to be addressable using 16-bit
935
   offsets from $gp.  */
936
0
#define MIPS_ELF_GOT_MAX_SIZE(INFO) (ELF_MIPS_GP_OFFSET (INFO) + 0x7fff)
937
938
/* Instructions which appear in a stub.  */
939
#define STUB_LW(abfd)             \
940
  ((ABI_64_P (abfd)             \
941
    ? 0xdf998010        /* ld t9,0x8010(gp) */  \
942
    : 0x8f998010))        /* lw t9,0x8010(gp) */
943
#define STUB_MOVE 0x03e07825      /* or t7,ra,zero */
944
#define STUB_LUI(VAL) (0x3c180000 + (VAL))  /* lui t8,VAL */
945
#define STUB_JALR 0x0320f809      /* jalr ra,t9 */
946
#define STUB_JALRC 0xf8190000     /* jalrc ra,t9 */
947
#define STUB_ORI(VAL) (0x37180000 + (VAL))  /* ori t8,t8,VAL */
948
#define STUB_LI16U(VAL) (0x34180000 + (VAL))  /* ori t8,zero,VAL unsigned */
949
#define STUB_LI16S(abfd, VAL)           \
950
   ((ABI_64_P (abfd)              \
951
    ? (0x64180000 + (VAL))  /* daddiu t8,zero,VAL sign extended */  \
952
    : (0x24180000 + (VAL))))  /* addiu t8,zero,VAL sign extended */
953
954
/* Likewise for the microMIPS ASE.  */
955
#define STUB_LW_MICROMIPS(abfd)           \
956
0
  (ABI_64_P (abfd)             \
957
0
   ? 0xdf3c8010          /* ld t9,0x8010(gp) */  \
958
0
   : 0xff3c8010)        /* lw t9,0x8010(gp) */
959
#define STUB_MOVE_MICROMIPS 0x0dff    /* move t7,ra */
960
0
#define STUB_MOVE32_MICROMIPS 0x001f7a90  /* or t7,ra,zero */
961
#define STUB_LUI_MICROMIPS(VAL)           \
962
0
   (0x41b80000 + (VAL))        /* lui t8,VAL */
963
#define STUB_JALR_MICROMIPS 0x45d9    /* jalr t9 */
964
0
#define STUB_JALR32_MICROMIPS 0x03f90f3c  /* jalr ra,t9 */
965
#define STUB_ORI_MICROMIPS(VAL)           \
966
0
  (0x53180000 + (VAL))        /* ori t8,t8,VAL */
967
#define STUB_LI16U_MICROMIPS(VAL)         \
968
0
  (0x53000000 + (VAL))        /* ori t8,zero,VAL unsigned */
969
#define STUB_LI16S_MICROMIPS(abfd, VAL)         \
970
0
   (ABI_64_P (abfd)             \
971
0
    ? 0x5f000000 + (VAL)  /* daddiu t8,zero,VAL sign extended */  \
972
0
    : 0x33000000 + (VAL))  /* addiu t8,zero,VAL sign extended */
973
974
0
#define MIPS_FUNCTION_STUB_NORMAL_SIZE 16
975
0
#define MIPS_FUNCTION_STUB_BIG_SIZE 20
976
0
#define MICROMIPS_FUNCTION_STUB_NORMAL_SIZE 12
977
0
#define MICROMIPS_FUNCTION_STUB_BIG_SIZE 16
978
0
#define MICROMIPS_INSN32_FUNCTION_STUB_NORMAL_SIZE 16
979
0
#define MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE 20
980
981
/* The name of the dynamic interpreter.  This is put in the .interp
982
   section.  */
983
984
#define ELF_DYNAMIC_INTERPRETER(abfd)   \
985
0
   (ABI_N32_P (abfd) ? "/usr/lib32/libc.so.1"  \
986
0
    : ABI_64_P (abfd) ? "/usr/lib64/libc.so.1"  \
987
0
    : "/usr/lib/libc.so.1")
988
989
#ifdef BFD64
990
#define MNAME(bfd,pre,pos) \
991
  (ABI_64_P (bfd) ? CONCAT4 (pre,64,_,pos) : CONCAT4 (pre,32,_,pos))
992
#define ELF_R_SYM(bfd, i)         \
993
0
  (ABI_64_P (bfd) ? ELF64_R_SYM (i) : ELF32_R_SYM (i))
994
#define ELF_R_TYPE(bfd, i)          \
995
0
  (ABI_64_P (bfd) ? ELF64_MIPS_R_TYPE (i) : ELF32_R_TYPE (i))
996
#define ELF_R_INFO(bfd, s, t)         \
997
0
  (ABI_64_P (bfd) ? ELF64_R_INFO (s, t) : ELF32_R_INFO (s, t))
998
#else
999
#define MNAME(bfd,pre,pos) CONCAT4 (pre,32,_,pos)
1000
#define ELF_R_SYM(bfd, i)         \
1001
  (ELF32_R_SYM (i))
1002
#define ELF_R_TYPE(bfd, i)          \
1003
  (ELF32_R_TYPE (i))
1004
#define ELF_R_INFO(bfd, s, t)         \
1005
  (ELF32_R_INFO (s, t))
1006
#endif
1007

1008
  /* The mips16 compiler uses a couple of special sections to handle
1009
     floating point arguments.
1010
1011
     Section names that look like .mips16.fn.FNNAME contain stubs that
1012
     copy floating point arguments from the fp regs to the gp regs and
1013
     then jump to FNNAME.  If any 32 bit function calls FNNAME, the
1014
     call should be redirected to the stub instead.  If no 32 bit
1015
     function calls FNNAME, the stub should be discarded.  We need to
1016
     consider any reference to the function, not just a call, because
1017
     if the address of the function is taken we will need the stub,
1018
     since the address might be passed to a 32 bit function.
1019
1020
     Section names that look like .mips16.call.FNNAME contain stubs
1021
     that copy floating point arguments from the gp regs to the fp
1022
     regs and then jump to FNNAME.  If FNNAME is a 32 bit function,
1023
     then any 16 bit function that calls FNNAME should be redirected
1024
     to the stub instead.  If FNNAME is not a 32 bit function, the
1025
     stub should be discarded.
1026
1027
     .mips16.call.fp.FNNAME sections are similar, but contain stubs
1028
     which call FNNAME and then copy the return value from the fp regs
1029
     to the gp regs.  These stubs store the return value in $18 while
1030
     calling FNNAME; any function which might call one of these stubs
1031
     must arrange to save $18 around the call.  (This case is not
1032
     needed for 32 bit functions that call 16 bit functions, because
1033
     16 bit functions always return floating point values in both
1034
     $f0/$f1 and $2/$3.)
1035
1036
     Note that in all cases FNNAME might be defined statically.
1037
     Therefore, FNNAME is not used literally.  Instead, the relocation
1038
     information will indicate which symbol the section is for.
1039
1040
     We record any stubs that we find in the symbol table.  */
1041
1042
0
#define FN_STUB ".mips16.fn."
1043
0
#define CALL_STUB ".mips16.call."
1044
0
#define CALL_FP_STUB ".mips16.call.fp."
1045
1046
0
#define FN_STUB_P(name) startswith (name, FN_STUB)
1047
0
#define CALL_STUB_P(name) startswith (name, CALL_STUB)
1048
0
#define CALL_FP_STUB_P(name) startswith (name, CALL_FP_STUB)
1049

1050
/* The format of the first PLT entry in an O32 executable.  */
1051
static const bfd_vma mips_o32_exec_plt0_entry[] =
1052
{
1053
  0x3c1c0000, /* lui $28, %hi(&GOTPLT[0])       */
1054
  0x8f990000, /* lw $25, %lo(&GOTPLT[0])($28)       */
1055
  0x279c0000, /* addiu $28, $28, %lo(&GOTPLT[0])      */
1056
  0x031cc023, /* subu $24, $24, $28         */
1057
  0x03e07825, /* or t7, ra, zero          */
1058
  0x0018c082, /* srl $24, $24, 2          */
1059
  0x0320f809, /* jalr $25           */
1060
  0x2718fffe  /* subu $24, $24, 2         */
1061
};
1062
1063
/* The format of the first PLT entry in an O32 executable using compact
1064
   jumps.  */
1065
static const bfd_vma mipsr6_o32_exec_plt0_entry_compact[] =
1066
{
1067
  0x3c1c0000, /* lui $28, %hi(&GOTPLT[0])       */
1068
  0x8f990000, /* lw $25, %lo(&GOTPLT[0])($28)       */
1069
  0x279c0000, /* addiu $28, $28, %lo(&GOTPLT[0])      */
1070
  0x031cc023, /* subu $24, $24, $28         */
1071
  0x03e07821, /* move $15, $31  # 32-bit move (addu)    */
1072
  0x0018c082, /* srl $24, $24, 2          */
1073
  0x2718fffe, /* subu $24, $24, 2         */
1074
  0xf8190000  /* jalrc $25            */
1075
};
1076
1077
/* The format of the first PLT entry in an N32 executable.  Different
1078
   because gp ($28) is not available; we use t2 ($14) instead.  */
1079
static const bfd_vma mips_n32_exec_plt0_entry[] =
1080
{
1081
  0x3c0e0000, /* lui $14, %hi(&GOTPLT[0])       */
1082
  0x8dd90000, /* lw $25, %lo(&GOTPLT[0])($14)       */
1083
  0x25ce0000, /* addiu $14, $14, %lo(&GOTPLT[0])      */
1084
  0x030ec023, /* subu $24, $24, $14         */
1085
  0x03e07825, /* or t7, ra, zero          */
1086
  0x0018c082, /* srl $24, $24, 2          */
1087
  0x0320f809, /* jalr $25           */
1088
  0x2718fffe  /* subu $24, $24, 2         */
1089
};
1090
1091
/* The format of the first PLT entry in an N32 executable using compact
1092
   jumps.  Different because gp ($28) is not available; we use t2 ($14)
1093
   instead.  */
1094
static const bfd_vma mipsr6_n32_exec_plt0_entry_compact[] =
1095
{
1096
  0x3c0e0000, /* lui $14, %hi(&GOTPLT[0])       */
1097
  0x8dd90000, /* lw $25, %lo(&GOTPLT[0])($14)       */
1098
  0x25ce0000, /* addiu $14, $14, %lo(&GOTPLT[0])      */
1099
  0x030ec023, /* subu $24, $24, $14         */
1100
  0x03e07821, /* move $15, $31  # 32-bit move (addu)    */
1101
  0x0018c082, /* srl $24, $24, 2          */
1102
  0x2718fffe, /* subu $24, $24, 2         */
1103
  0xf8190000  /* jalrc $25            */
1104
};
1105
1106
/* The format of the first PLT entry in an N64 executable.  Different
1107
   from N32 because of the increased size of GOT entries.  */
1108
static const bfd_vma mips_n64_exec_plt0_entry[] =
1109
{
1110
  0x3c0e0000, /* lui $14, %hi(&GOTPLT[0])       */
1111
  0xddd90000, /* ld $25, %lo(&GOTPLT[0])($14)       */
1112
  0x25ce0000, /* addiu $14, $14, %lo(&GOTPLT[0])      */
1113
  0x030ec023, /* subu $24, $24, $14         */
1114
  0x03e07825, /* or t7, ra, zero          */
1115
  0x0018c0c2, /* srl $24, $24, 3          */
1116
  0x0320f809, /* jalr $25           */
1117
  0x2718fffe  /* subu $24, $24, 2         */
1118
};
1119
1120
/* The format of the first PLT entry in an N64 executable using compact
1121
   jumps.  Different from N32 because of the increased size of GOT
1122
   entries.  */
1123
static const bfd_vma mipsr6_n64_exec_plt0_entry_compact[] =
1124
{
1125
  0x3c0e0000, /* lui $14, %hi(&GOTPLT[0])       */
1126
  0xddd90000, /* ld $25, %lo(&GOTPLT[0])($14)       */
1127
  0x25ce0000, /* addiu $14, $14, %lo(&GOTPLT[0])      */
1128
  0x030ec023, /* subu $24, $24, $14         */
1129
  0x03e0782d, /* move $15, $31  # 64-bit move (daddu)   */
1130
  0x0018c0c2, /* srl $24, $24, 3          */
1131
  0x2718fffe, /* subu $24, $24, 2         */
1132
  0xf8190000  /* jalrc $25            */
1133
};
1134
1135
1136
/* The format of the microMIPS first PLT entry in an O32 executable.
1137
   We rely on v0 ($2) rather than t8 ($24) to contain the address
1138
   of the GOTPLT entry handled, so this stub may only be used when
1139
   all the subsequent PLT entries are microMIPS code too.
1140
1141
   The trailing NOP is for alignment and correct disassembly only.  */
1142
static const bfd_vma micromips_o32_exec_plt0_entry[] =
1143
{
1144
  0x7980, 0x0000, /* addiupc $3, (&GOTPLT[0]) - .     */
1145
  0xff23, 0x0000, /* lw $25, 0($3)        */
1146
  0x0535,   /* subu $2, $2, $3        */
1147
  0x2525,   /* srl $2, $2, 2        */
1148
  0x3302, 0xfffe, /* subu $24, $2, 2        */
1149
  0x0dff,   /* move $15, $31        */
1150
  0x45f9,   /* jalrs $25          */
1151
  0x0f83,   /* move $28, $3         */
1152
  0x0c00    /* nop            */
1153
};
1154
1155
/* The format of the microMIPS first PLT entry in an O32 executable
1156
   in the insn32 mode.  */
1157
static const bfd_vma micromips_insn32_o32_exec_plt0_entry[] =
1158
{
1159
  0x41bc, 0x0000, /* lui $28, %hi(&GOTPLT[0])     */
1160
  0xff3c, 0x0000, /* lw $25, %lo(&GOTPLT[0])($28)     */
1161
  0x339c, 0x0000, /* addiu $28, $28, %lo(&GOTPLT[0])    */
1162
  0x0398, 0xc1d0, /* subu $24, $24, $28       */
1163
  0x001f, 0x7a90, /* or $15, $31, zero        */
1164
  0x0318, 0x1040, /* srl $24, $24, 2        */
1165
  0x03f9, 0x0f3c, /* jalr $25         */
1166
  0x3318, 0xfffe  /* subu $24, $24, 2       */
1167
};
1168
1169
/* The format of subsequent standard PLT entries.  */
1170
static const bfd_vma mips_exec_plt_entry[] =
1171
{
1172
  0x3c0f0000, /* lui $15, %hi(.got.plt entry)     */
1173
  0x01f90000, /* l[wd] $25, %lo(.got.plt entry)($15)    */
1174
  0x25f80000, /* addiu $24, $15, %lo(.got.plt entry)    */
1175
  0x03200008  /* jr $25         */
1176
};
1177
1178
static const bfd_vma mipsr6_exec_plt_entry[] =
1179
{
1180
  0x3c0f0000, /* lui $15, %hi(.got.plt entry)     */
1181
  0x01f90000, /* l[wd] $25, %lo(.got.plt entry)($15)    */
1182
  0x25f80000, /* addiu $24, $15, %lo(.got.plt entry)    */
1183
  0x03200009  /* jr $25         */
1184
};
1185
1186
static const bfd_vma mipsr6_exec_plt_entry_compact[] =
1187
{
1188
  0x3c0f0000, /* lui $15, %hi(.got.plt entry)     */
1189
  0x01f90000, /* l[wd] $25, %lo(.got.plt entry)($15)    */
1190
  0x25f80000, /* addiu $24, $15, %lo(.got.plt entry)    */
1191
  0xd8190000  /* jic $25, 0         */
1192
};
1193
1194
/* The format of subsequent MIPS16 o32 PLT entries.  We use v0 ($2)
1195
   and v1 ($3) as temporaries because t8 ($24) and t9 ($25) are not
1196
   directly addressable.  */
1197
static const bfd_vma mips16_o32_exec_plt_entry[] =
1198
{
1199
  0xb203,   /* lw $2, 12($pc)     */
1200
  0x9a60,   /* lw $3, 0($2)       */
1201
  0x651a,   /* move $24, $2       */
1202
  0xeb00,   /* jr $3        */
1203
  0x653b,   /* move $25, $3       */
1204
  0x6500,   /* nop          */
1205
  0x0000, 0x0000  /* .word (.got.plt entry)   */
1206
};
1207
1208
/* The format of subsequent microMIPS o32 PLT entries.  We use v0 ($2)
1209
   as a temporary because t8 ($24) is not addressable with ADDIUPC.  */
1210
static const bfd_vma micromips_o32_exec_plt_entry[] =
1211
{
1212
  0x7900, 0x0000, /* addiupc $2, (.got.plt entry) - . */
1213
  0xff22, 0x0000, /* lw $25, 0($2)      */
1214
  0x4599,   /* jr $25       */
1215
  0x0f02    /* move $24, $2       */
1216
};
1217
1218
/* The format of subsequent microMIPS o32 PLT entries in the insn32 mode.  */
1219
static const bfd_vma micromips_insn32_o32_exec_plt_entry[] =
1220
{
1221
  0x41af, 0x0000, /* lui $15, %hi(.got.plt entry)   */
1222
  0xff2f, 0x0000, /* lw $25, %lo(.got.plt entry)($15) */
1223
  0x0019, 0x0f3c, /* jr $25       */
1224
  0x330f, 0x0000  /* addiu $24, $15, %lo(.got.plt entry)  */
1225
};
1226
1227
/* The format of the first PLT entry in a VxWorks executable.  */
1228
static const bfd_vma mips_vxworks_exec_plt0_entry[] =
1229
{
1230
  0x3c190000, /* lui t9, %hi(_GLOBAL_OFFSET_TABLE_)   */
1231
  0x27390000, /* addiu t9, t9, %lo(_GLOBAL_OFFSET_TABLE_) */
1232
  0x8f390008, /* lw t9, 8(t9)         */
1233
  0x00000000, /* nop            */
1234
  0x03200008, /* jr t9          */
1235
  0x00000000  /* nop            */
1236
};
1237
1238
/* The format of subsequent PLT entries.  */
1239
static const bfd_vma mips_vxworks_exec_plt_entry[] =
1240
{
1241
  0x10000000, /* b .PLT_resolver      */
1242
  0x24180000, /* li t8, <pltindex>      */
1243
  0x3c190000, /* lui t9, %hi(<.got.plt slot>)   */
1244
  0x27390000, /* addiu t9, t9, %lo(<.got.plt slot>) */
1245
  0x8f390000, /* lw t9, 0(t9)       */
1246
  0x00000000, /* nop          */
1247
  0x03200008, /* jr t9        */
1248
  0x00000000  /* nop          */
1249
};
1250
1251
/* The format of the first PLT entry in a VxWorks shared object.  */
1252
static const bfd_vma mips_vxworks_shared_plt0_entry[] =
1253
{
1254
  0x8f990008, /* lw t9, 8(gp)   */
1255
  0x00000000, /* nop      */
1256
  0x03200008, /* jr t9    */
1257
  0x00000000, /* nop      */
1258
  0x00000000, /* nop      */
1259
  0x00000000  /* nop      */
1260
};
1261
1262
/* The format of subsequent PLT entries.  */
1263
static const bfd_vma mips_vxworks_shared_plt_entry[] =
1264
{
1265
  0x10000000, /* b .PLT_resolver  */
1266
  0x24180000  /* li t8, <pltindex>  */
1267
};
1268

1269
/* microMIPS 32-bit opcode helper installer.  */
1270
1271
static void
1272
bfd_put_micromips_32 (const bfd *abfd, bfd_vma opcode, bfd_byte *ptr)
1273
0
{
1274
0
  bfd_put_16 (abfd, (opcode >> 16) & 0xffff, ptr);
1275
0
  bfd_put_16 (abfd,  opcode    & 0xffff, ptr + 2);
1276
0
}
1277
1278
/* microMIPS 32-bit opcode helper retriever.  */
1279
1280
static bfd_vma
1281
bfd_get_micromips_32 (const bfd *abfd, const bfd_byte *ptr)
1282
0
{
1283
0
  return (bfd_get_16 (abfd, ptr) << 16) | bfd_get_16 (abfd, ptr + 2);
1284
0
}
1285

1286
/* Look up an entry in a MIPS ELF linker hash table.  */
1287
1288
#define mips_elf_link_hash_lookup(table, string, create, copy, follow)  \
1289
0
  ((struct mips_elf_link_hash_entry *)          \
1290
0
   elf_link_hash_lookup (&(table)->root, (string), (create),    \
1291
0
       (copy), (follow)))
1292
1293
/* Traverse a MIPS ELF linker hash table.  */
1294
1295
#define mips_elf_link_hash_traverse(table, func, info)      \
1296
0
  (elf_link_hash_traverse           \
1297
0
   (&(table)->root,              \
1298
0
    (bool (*) (struct elf_link_hash_entry *, void *)) (func),   \
1299
0
    (info)))
1300
1301
/* Find the base offsets for thread-local storage in this object,
1302
   for GD/LD and IE/LE respectively.  */
1303
1304
0
#define TP_OFFSET 0x7000
1305
0
#define DTP_OFFSET 0x8000
1306
1307
static bfd_vma
1308
dtprel_base (struct bfd_link_info *info)
1309
0
{
1310
  /* If tls_sec is NULL, we should have signalled an error already.  */
1311
0
  if (elf_hash_table (info)->tls_sec == NULL)
1312
0
    return 0;
1313
0
  return elf_hash_table (info)->tls_sec->vma + DTP_OFFSET;
1314
0
}
1315
1316
static bfd_vma
1317
tprel_base (struct bfd_link_info *info)
1318
0
{
1319
  /* If tls_sec is NULL, we should have signalled an error already.  */
1320
0
  if (elf_hash_table (info)->tls_sec == NULL)
1321
0
    return 0;
1322
0
  return elf_hash_table (info)->tls_sec->vma + TP_OFFSET;
1323
0
}
1324
1325
/* Create an entry in a MIPS ELF linker hash table.  */
1326
1327
static struct bfd_hash_entry *
1328
mips_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
1329
          struct bfd_hash_table *table, const char *string)
1330
0
{
1331
0
  struct mips_elf_link_hash_entry *ret =
1332
0
    (struct mips_elf_link_hash_entry *) entry;
1333
1334
  /* Allocate the structure if it has not already been allocated by a
1335
     subclass.  */
1336
0
  if (ret == NULL)
1337
0
    ret = bfd_hash_allocate (table, sizeof (struct mips_elf_link_hash_entry));
1338
0
  if (ret == NULL)
1339
0
    return (struct bfd_hash_entry *) ret;
1340
1341
  /* Call the allocation method of the superclass.  */
1342
0
  ret = ((struct mips_elf_link_hash_entry *)
1343
0
   _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
1344
0
             table, string));
1345
0
  if (ret != NULL)
1346
0
    {
1347
      /* Set local fields.  */
1348
0
      memset (&ret->esym, 0, sizeof (EXTR));
1349
      /* We use -2 as a marker to indicate that the information has
1350
   not been set.  -1 means there is no associated ifd.  */
1351
0
      ret->esym.ifd = -2;
1352
0
      ret->la25_stub = 0;
1353
0
      ret->possibly_dynamic_relocs = 0;
1354
0
      ret->fn_stub = NULL;
1355
0
      ret->call_stub = NULL;
1356
0
      ret->call_fp_stub = NULL;
1357
0
      ret->mipsxhash_loc = 0;
1358
0
      ret->global_got_area = GGA_NONE;
1359
0
      ret->got_only_for_calls = true;
1360
0
      ret->readonly_reloc = false;
1361
0
      ret->has_static_relocs = false;
1362
0
      ret->no_fn_stub = false;
1363
0
      ret->need_fn_stub = false;
1364
0
      ret->has_nonpic_branches = false;
1365
0
      ret->needs_lazy_stub = false;
1366
0
      ret->use_plt_entry = false;
1367
0
    }
1368
1369
0
  return (struct bfd_hash_entry *) ret;
1370
0
}
1371
1372
/* Allocate MIPS ELF private object data.  */
1373
1374
bool
1375
_bfd_mips_elf_mkobject (bfd *abfd)
1376
3.06M
{
1377
3.06M
  return bfd_elf_allocate_object (abfd, sizeof (struct mips_elf_obj_tdata));
1378
3.06M
}
1379
1380
/* MIPS ELF uses a special find_nearest_line routine in order the
1381
   handle the ECOFF debugging information.  */
1382
1383
struct mips_elf_find_line
1384
{
1385
  struct ecoff_debug_info d;
1386
  struct ecoff_find_line i;
1387
};
1388
1389
bool
1390
_bfd_mips_elf_free_cached_info (bfd *abfd)
1391
117k
{
1392
117k
  struct mips_elf_obj_tdata *tdata;
1393
1394
117k
  if ((bfd_get_format (abfd) == bfd_object
1395
117k
       || bfd_get_format (abfd) == bfd_core)
1396
117k
      && (tdata = mips_elf_tdata (abfd)) != NULL)
1397
47.3k
    {
1398
47.3k
      BFD_ASSERT (tdata->root.object_id == MIPS_ELF_DATA);
1399
47.3k
      while (tdata->mips_hi16_list != NULL)
1400
8
  {
1401
8
    struct mips_hi16 *hi = tdata->mips_hi16_list;
1402
8
    tdata->mips_hi16_list = hi->next;
1403
8
    free (hi);
1404
8
  }
1405
47.3k
      if (tdata->find_line_info != NULL)
1406
337
  _bfd_ecoff_free_ecoff_debug_info (&tdata->find_line_info->d);
1407
47.3k
    }
1408
117k
  return _bfd_elf_free_cached_info (abfd);
1409
117k
}
1410
1411
bool
1412
_bfd_mips_elf_new_section_hook (bfd *abfd, asection *sec)
1413
1.12M
{
1414
1.12M
  struct _mips_elf_section_data *sdata;
1415
1416
1.12M
  sdata = bfd_zalloc (abfd, sizeof (*sdata));
1417
1.12M
  if (sdata == NULL)
1418
0
    return false;
1419
1.12M
  sec->used_by_bfd = sdata;
1420
1421
1.12M
  return _bfd_elf_new_section_hook (abfd, sec);
1422
1.12M
}
1423

1424
/* Read ECOFF debugging information from a .mdebug section into a
1425
   ecoff_debug_info structure.  */
1426
1427
bool
1428
_bfd_mips_elf_read_ecoff_info (bfd *abfd, asection *section,
1429
             struct ecoff_debug_info *debug)
1430
3.90k
{
1431
3.90k
  HDRR *symhdr;
1432
3.90k
  const struct ecoff_debug_swap *swap;
1433
3.90k
  char *ext_hdr;
1434
1435
3.90k
  swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1436
3.90k
  memset (debug, 0, sizeof (*debug));
1437
1438
3.90k
  ext_hdr = bfd_malloc (swap->external_hdr_size);
1439
3.90k
  if (ext_hdr == NULL && swap->external_hdr_size != 0)
1440
0
    goto error_return;
1441
1442
3.90k
  if (! bfd_get_section_contents (abfd, section, ext_hdr, 0,
1443
3.90k
          swap->external_hdr_size))
1444
278
    goto error_return;
1445
1446
3.62k
  symhdr = &debug->symbolic_header;
1447
3.62k
  (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
1448
3.62k
  free (ext_hdr);
1449
3.62k
  ext_hdr = NULL;
1450
1451
  /* The symbolic header contains absolute file offsets and sizes to
1452
     read.  */
1453
3.62k
#define READ(ptr, offset, count, size)          \
1454
19.6k
  do                  \
1455
19.6k
    {                 \
1456
19.6k
      size_t amt;             \
1457
19.6k
      debug->ptr = NULL;            \
1458
19.6k
      if (symhdr->count == 0)           \
1459
19.6k
  break;               \
1460
19.6k
      if (_bfd_mul_overflow (size, symhdr->count, &amt))   \
1461
7.82k
  {               \
1462
0
    bfd_set_error (bfd_error_file_too_big);     \
1463
0
    goto error_return;            \
1464
0
  }                \
1465
7.82k
      if (bfd_seek (abfd, symhdr->offset, SEEK_SET) != 0)   \
1466
7.82k
  goto error_return;           \
1467
7.82k
      debug->ptr = _bfd_malloc_and_read (abfd, amt + 1, amt);   \
1468
6.53k
      if (debug->ptr == NULL)           \
1469
6.53k
  goto error_return;           \
1470
6.53k
      ((char *) debug->ptr)[amt] = 0;         \
1471
4.53k
    } while (0)
1472
1473
3.62k
  READ (line, cbLineOffset, cbLine, sizeof (unsigned char));
1474
2.63k
  READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size);
1475
2.36k
  READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size);
1476
2.12k
  READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size);
1477
1.94k
  READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size);
1478
1.72k
  READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext));
1479
1.48k
  READ (ss, cbSsOffset, issMax, sizeof (char));
1480
1.29k
  READ (ssext, cbSsExtOffset, issExtMax, sizeof (char));
1481
1.05k
  READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size);
1482
819
  READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size);
1483
572
  READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size);
1484
337
#undef READ
1485
1486
337
  return true;
1487
1488
3.56k
 error_return:
1489
3.56k
  free (ext_hdr);
1490
3.56k
  _bfd_ecoff_free_ecoff_debug_info (debug);
1491
3.56k
  return false;
1492
572
}
1493

1494
/* Swap RPDR (runtime procedure table entry) for output.  */
1495
1496
static void
1497
ecoff_swap_rpdr_out (bfd *abfd, const RPDR *in, struct rpdr_ext *ex)
1498
0
{
1499
0
  H_PUT_S32 (abfd, in->adr, ex->p_adr);
1500
0
  H_PUT_32 (abfd, in->regmask, ex->p_regmask);
1501
0
  H_PUT_32 (abfd, in->regoffset, ex->p_regoffset);
1502
0
  H_PUT_32 (abfd, in->fregmask, ex->p_fregmask);
1503
0
  H_PUT_32 (abfd, in->fregoffset, ex->p_fregoffset);
1504
0
  H_PUT_32 (abfd, in->frameoffset, ex->p_frameoffset);
1505
1506
0
  H_PUT_16 (abfd, in->framereg, ex->p_framereg);
1507
0
  H_PUT_16 (abfd, in->pcreg, ex->p_pcreg);
1508
1509
0
  H_PUT_32 (abfd, in->irpss, ex->p_irpss);
1510
0
}
1511
1512
/* Create a runtime procedure table from the .mdebug section.  */
1513
1514
static bool
1515
mips_elf_create_procedure_table (void *handle, bfd *abfd,
1516
         struct bfd_link_info *info, asection *s,
1517
         struct ecoff_debug_info *debug)
1518
0
{
1519
0
  const struct ecoff_debug_swap *swap;
1520
0
  HDRR *hdr = &debug->symbolic_header;
1521
0
  RPDR *rpdr, *rp;
1522
0
  struct rpdr_ext *erp;
1523
0
  void *rtproc;
1524
0
  struct pdr_ext *epdr;
1525
0
  struct sym_ext *esym;
1526
0
  char *ss, **sv;
1527
0
  char *str;
1528
0
  bfd_size_type size;
1529
0
  bfd_size_type count;
1530
0
  unsigned long sindex;
1531
0
  unsigned long i;
1532
0
  PDR pdr;
1533
0
  SYMR sym;
1534
0
  const char *no_name_func = _("static procedure (no name)");
1535
1536
0
  epdr = NULL;
1537
0
  rpdr = NULL;
1538
0
  esym = NULL;
1539
0
  ss = NULL;
1540
0
  sv = NULL;
1541
1542
0
  swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1543
1544
0
  sindex = strlen (no_name_func) + 1;
1545
0
  count = hdr->ipdMax;
1546
0
  if (count > 0)
1547
0
    {
1548
0
      size = swap->external_pdr_size;
1549
1550
0
      epdr = bfd_malloc (size * count);
1551
0
      if (epdr == NULL)
1552
0
  goto error_return;
1553
1554
0
      if (! _bfd_ecoff_get_accumulated_pdr (handle, (bfd_byte *) epdr))
1555
0
  goto error_return;
1556
1557
0
      size = sizeof (RPDR);
1558
0
      rp = rpdr = bfd_malloc (size * count);
1559
0
      if (rpdr == NULL)
1560
0
  goto error_return;
1561
1562
0
      size = sizeof (char *);
1563
0
      sv = bfd_malloc (size * count);
1564
0
      if (sv == NULL)
1565
0
  goto error_return;
1566
1567
0
      count = hdr->isymMax;
1568
0
      size = swap->external_sym_size;
1569
0
      esym = bfd_malloc (size * count);
1570
0
      if (esym == NULL)
1571
0
  goto error_return;
1572
1573
0
      if (! _bfd_ecoff_get_accumulated_sym (handle, (bfd_byte *) esym))
1574
0
  goto error_return;
1575
1576
0
      count = hdr->issMax;
1577
0
      ss = bfd_malloc (count);
1578
0
      if (ss == NULL)
1579
0
  goto error_return;
1580
0
      if (! _bfd_ecoff_get_accumulated_ss (handle, (bfd_byte *) ss))
1581
0
  goto error_return;
1582
1583
0
      count = hdr->ipdMax;
1584
0
      for (i = 0; i < (unsigned long) count; i++, rp++)
1585
0
  {
1586
0
    (*swap->swap_pdr_in) (abfd, epdr + i, &pdr);
1587
0
    (*swap->swap_sym_in) (abfd, &esym[pdr.isym], &sym);
1588
0
    rp->adr = sym.value;
1589
0
    rp->regmask = pdr.regmask;
1590
0
    rp->regoffset = pdr.regoffset;
1591
0
    rp->fregmask = pdr.fregmask;
1592
0
    rp->fregoffset = pdr.fregoffset;
1593
0
    rp->frameoffset = pdr.frameoffset;
1594
0
    rp->framereg = pdr.framereg;
1595
0
    rp->pcreg = pdr.pcreg;
1596
0
    rp->irpss = sindex;
1597
0
    sv[i] = ss + sym.iss;
1598
0
    sindex += strlen (sv[i]) + 1;
1599
0
  }
1600
0
    }
1601
1602
0
  size = sizeof (struct rpdr_ext) * (count + 2) + sindex;
1603
0
  size = BFD_ALIGN (size, 16);
1604
0
  rtproc = bfd_alloc (abfd, size);
1605
0
  if (rtproc == NULL)
1606
0
    {
1607
0
      mips_elf_hash_table (info)->procedure_count = 0;
1608
0
      goto error_return;
1609
0
    }
1610
1611
0
  mips_elf_hash_table (info)->procedure_count = count + 2;
1612
1613
0
  erp = rtproc;
1614
0
  memset (erp, 0, sizeof (struct rpdr_ext));
1615
0
  erp++;
1616
0
  str = (char *) rtproc + sizeof (struct rpdr_ext) * (count + 2);
1617
0
  strcpy (str, no_name_func);
1618
0
  str += strlen (no_name_func) + 1;
1619
0
  for (i = 0; i < count; i++)
1620
0
    {
1621
0
      ecoff_swap_rpdr_out (abfd, rpdr + i, erp + i);
1622
0
      strcpy (str, sv[i]);
1623
0
      str += strlen (sv[i]) + 1;
1624
0
    }
1625
0
  H_PUT_S32 (abfd, -1, (erp + count)->p_adr);
1626
1627
  /* Set the size and contents of .rtproc section.  */
1628
0
  s->size = size;
1629
0
  s->contents = rtproc;
1630
1631
  /* Skip this section later on (I don't think this currently
1632
     matters, but someday it might).  */
1633
0
  s->map_head.link_order = NULL;
1634
1635
0
  free (epdr);
1636
0
  free (rpdr);
1637
0
  free (esym);
1638
0
  free (ss);
1639
0
  free (sv);
1640
0
  return true;
1641
1642
0
 error_return:
1643
0
  free (epdr);
1644
0
  free (rpdr);
1645
0
  free (esym);
1646
0
  free (ss);
1647
0
  free (sv);
1648
0
  return false;
1649
0
}
1650

1651
/* We're going to create a stub for H.  Create a symbol for the stub's
1652
   value and size, to help make the disassembly easier to read.  */
1653
1654
static bool
1655
mips_elf_create_stub_symbol (struct bfd_link_info *info,
1656
           struct mips_elf_link_hash_entry *h,
1657
           const char *prefix, asection *s, bfd_vma value,
1658
           bfd_vma size)
1659
0
{
1660
0
  bool micromips_p = ELF_ST_IS_MICROMIPS (h->root.other);
1661
0
  struct bfd_link_hash_entry *bh;
1662
0
  struct elf_link_hash_entry *elfh;
1663
0
  char *name;
1664
0
  bool res;
1665
1666
0
  if (micromips_p)
1667
0
    value |= 1;
1668
1669
  /* Create a new symbol.  */
1670
0
  name = concat (prefix, h->root.root.root.string, NULL);
1671
0
  bh = NULL;
1672
0
  res = _bfd_generic_link_add_one_symbol (info, s->owner, name,
1673
0
            BSF_LOCAL, s, value, NULL,
1674
0
            true, false, &bh);
1675
0
  free (name);
1676
0
  if (! res)
1677
0
    return false;
1678
1679
  /* Make it a local function.  */
1680
0
  elfh = (struct elf_link_hash_entry *) bh;
1681
0
  elfh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
1682
0
  elfh->size = size;
1683
0
  elfh->forced_local = 1;
1684
0
  if (micromips_p)
1685
0
    elfh->other = ELF_ST_SET_MICROMIPS (elfh->other);
1686
0
  return true;
1687
0
}
1688
1689
/* We're about to redefine H.  Create a symbol to represent H's
1690
   current value and size, to help make the disassembly easier
1691
   to read.  */
1692
1693
static bool
1694
mips_elf_create_shadow_symbol (struct bfd_link_info *info,
1695
             struct mips_elf_link_hash_entry *h,
1696
             const char *prefix)
1697
0
{
1698
0
  struct bfd_link_hash_entry *bh;
1699
0
  struct elf_link_hash_entry *elfh;
1700
0
  char *name;
1701
0
  asection *s;
1702
0
  bfd_vma value;
1703
0
  bool res;
1704
1705
  /* Read the symbol's value.  */
1706
0
  BFD_ASSERT (h->root.root.type == bfd_link_hash_defined
1707
0
        || h->root.root.type == bfd_link_hash_defweak);
1708
0
  s = h->root.root.u.def.section;
1709
0
  value = h->root.root.u.def.value;
1710
1711
  /* Create a new symbol.  */
1712
0
  name = concat (prefix, h->root.root.root.string, NULL);
1713
0
  bh = NULL;
1714
0
  res = _bfd_generic_link_add_one_symbol (info, s->owner, name,
1715
0
            BSF_LOCAL, s, value, NULL,
1716
0
            true, false, &bh);
1717
0
  free (name);
1718
0
  if (! res)
1719
0
    return false;
1720
1721
  /* Make it local and copy the other attributes from H.  */
1722
0
  elfh = (struct elf_link_hash_entry *) bh;
1723
0
  elfh->type = ELF_ST_INFO (STB_LOCAL, ELF_ST_TYPE (h->root.type));
1724
0
  elfh->other = h->root.other;
1725
0
  elfh->size = h->root.size;
1726
0
  elfh->forced_local = 1;
1727
0
  return true;
1728
0
}
1729
1730
/* Return TRUE if relocations in SECTION can refer directly to a MIPS16
1731
   function rather than to a hard-float stub.  */
1732
1733
static bool
1734
section_allows_mips16_refs_p (asection *section)
1735
0
{
1736
0
  const char *name;
1737
1738
0
  name = bfd_section_name (section);
1739
0
  return (FN_STUB_P (name)
1740
0
    || CALL_STUB_P (name)
1741
0
    || CALL_FP_STUB_P (name)
1742
0
    || strcmp (name, ".pdr") == 0);
1743
0
}
1744
1745
/* [RELOCS, RELEND) are the relocations against SEC, which is a MIPS16
1746
   stub section of some kind.  Return the R_SYMNDX of the target
1747
   function, or 0 if we can't decide which function that is.  */
1748
1749
static unsigned long
1750
mips16_stub_symndx (const struct elf_backend_data *bed,
1751
        asection *sec ATTRIBUTE_UNUSED,
1752
        const Elf_Internal_Rela *relocs,
1753
        const Elf_Internal_Rela *relend)
1754
0
{
1755
0
  int int_rels_per_ext_rel = bed->s->int_rels_per_ext_rel;
1756
0
  const Elf_Internal_Rela *rel;
1757
1758
  /* Trust the first R_MIPS_NONE relocation, if any, but not a subsequent
1759
     one in a compound relocation.  */
1760
0
  for (rel = relocs; rel < relend; rel += int_rels_per_ext_rel)
1761
0
    if (ELF_R_TYPE (sec->owner, rel->r_info) == R_MIPS_NONE)
1762
0
      return ELF_R_SYM (sec->owner, rel->r_info);
1763
1764
  /* Otherwise trust the first relocation, whatever its kind.  This is
1765
     the traditional behavior.  */
1766
0
  if (relocs < relend)
1767
0
    return ELF_R_SYM (sec->owner, relocs->r_info);
1768
1769
0
  return 0;
1770
0
}
1771
1772
/* Check the mips16 stubs for a particular symbol, and see if we can
1773
   discard them.  */
1774
1775
static void
1776
mips_elf_check_mips16_stubs (struct bfd_link_info *info,
1777
           struct mips_elf_link_hash_entry *h)
1778
0
{
1779
  /* Dynamic symbols must use the standard call interface, in case other
1780
     objects try to call them.  */
1781
0
  if (h->fn_stub != NULL
1782
0
      && h->root.dynindx != -1)
1783
0
    {
1784
0
      mips_elf_create_shadow_symbol (info, h, ".mips16.");
1785
0
      h->need_fn_stub = true;
1786
0
    }
1787
1788
0
  if (h->fn_stub != NULL
1789
0
      && ! h->need_fn_stub)
1790
0
    {
1791
      /* We don't need the fn_stub; the only references to this symbol
1792
   are 16 bit calls.  Clobber the size to 0 to prevent it from
1793
   being included in the link.  */
1794
0
      h->fn_stub->size = 0;
1795
0
      h->fn_stub->flags &= ~SEC_RELOC;
1796
0
      h->fn_stub->reloc_count = 0;
1797
0
      h->fn_stub->flags |= SEC_EXCLUDE;
1798
0
      h->fn_stub->output_section = bfd_abs_section_ptr;
1799
0
    }
1800
1801
0
  if (h->call_stub != NULL
1802
0
      && ELF_ST_IS_MIPS16 (h->root.other))
1803
0
    {
1804
      /* We don't need the call_stub; this is a 16 bit function, so
1805
   calls from other 16 bit functions are OK.  Clobber the size
1806
   to 0 to prevent it from being included in the link.  */
1807
0
      h->call_stub->size = 0;
1808
0
      h->call_stub->flags &= ~SEC_RELOC;
1809
0
      h->call_stub->reloc_count = 0;
1810
0
      h->call_stub->flags |= SEC_EXCLUDE;
1811
0
      h->call_stub->output_section = bfd_abs_section_ptr;
1812
0
    }
1813
1814
0
  if (h->call_fp_stub != NULL
1815
0
      && ELF_ST_IS_MIPS16 (h->root.other))
1816
0
    {
1817
      /* We don't need the call_stub; this is a 16 bit function, so
1818
   calls from other 16 bit functions are OK.  Clobber the size
1819
   to 0 to prevent it from being included in the link.  */
1820
0
      h->call_fp_stub->size = 0;
1821
0
      h->call_fp_stub->flags &= ~SEC_RELOC;
1822
0
      h->call_fp_stub->reloc_count = 0;
1823
0
      h->call_fp_stub->flags |= SEC_EXCLUDE;
1824
0
      h->call_fp_stub->output_section = bfd_abs_section_ptr;
1825
0
    }
1826
0
}
1827
1828
/* Hashtable callbacks for mips_elf_la25_stubs.  */
1829
1830
static hashval_t
1831
mips_elf_la25_stub_hash (const void *entry_)
1832
0
{
1833
0
  const struct mips_elf_la25_stub *entry;
1834
1835
0
  entry = (struct mips_elf_la25_stub *) entry_;
1836
0
  return entry->h->root.root.u.def.section->id
1837
0
    + entry->h->root.root.u.def.value;
1838
0
}
1839
1840
static int
1841
mips_elf_la25_stub_eq (const void *entry1_, const void *entry2_)
1842
0
{
1843
0
  const struct mips_elf_la25_stub *entry1, *entry2;
1844
1845
0
  entry1 = (struct mips_elf_la25_stub *) entry1_;
1846
0
  entry2 = (struct mips_elf_la25_stub *) entry2_;
1847
0
  return ((entry1->h->root.root.u.def.section
1848
0
     == entry2->h->root.root.u.def.section)
1849
0
    && (entry1->h->root.root.u.def.value
1850
0
        == entry2->h->root.root.u.def.value));
1851
0
}
1852
1853
/* Called by the linker to set up the la25 stub-creation code.  FN is
1854
   the linker's implementation of add_stub_function.  Return true on
1855
   success.  */
1856
1857
bool
1858
_bfd_mips_elf_init_stubs (struct bfd_link_info *info,
1859
        asection *(*fn) (const char *, asection *,
1860
             asection *))
1861
0
{
1862
0
  struct mips_elf_link_hash_table *htab;
1863
1864
0
  htab = mips_elf_hash_table (info);
1865
0
  if (htab == NULL)
1866
0
    return false;
1867
1868
0
  htab->add_stub_section = fn;
1869
0
  htab->la25_stubs = htab_try_create (1, mips_elf_la25_stub_hash,
1870
0
              mips_elf_la25_stub_eq, NULL);
1871
0
  if (htab->la25_stubs == NULL)
1872
0
    return false;
1873
1874
0
  return true;
1875
0
}
1876
1877
/* Return true if H is a locally-defined PIC function, in the sense
1878
   that it or its fn_stub might need $25 to be valid on entry.
1879
   Note that MIPS16 functions set up $gp using PC-relative instructions,
1880
   so they themselves never need $25 to be valid.  Only non-MIPS16
1881
   entry points are of interest here.  */
1882
1883
static bool
1884
mips_elf_local_pic_function_p (struct mips_elf_link_hash_entry *h)
1885
0
{
1886
0
  return ((h->root.root.type == bfd_link_hash_defined
1887
0
     || h->root.root.type == bfd_link_hash_defweak)
1888
0
    && h->root.def_regular
1889
0
    && !bfd_is_abs_section (h->root.root.u.def.section)
1890
0
    && !bfd_is_und_section (h->root.root.u.def.section)
1891
0
    && (!ELF_ST_IS_MIPS16 (h->root.other)
1892
0
        || (h->fn_stub && h->need_fn_stub))
1893
0
    && (PIC_OBJECT_P (h->root.root.u.def.section->owner)
1894
0
        || ELF_ST_IS_MIPS_PIC (h->root.other)));
1895
0
}
1896
1897
/* Set *SEC to the input section that contains the target of STUB.
1898
   Return the offset of the target from the start of that section.  */
1899
1900
static bfd_vma
1901
mips_elf_get_la25_target (struct mips_elf_la25_stub *stub,
1902
        asection **sec)
1903
0
{
1904
0
  if (ELF_ST_IS_MIPS16 (stub->h->root.other))
1905
0
    {
1906
0
      BFD_ASSERT (stub->h->need_fn_stub);
1907
0
      *sec = stub->h->fn_stub;
1908
0
      return 0;
1909
0
    }
1910
0
  else
1911
0
    {
1912
0
      *sec = stub->h->root.root.u.def.section;
1913
0
      return stub->h->root.root.u.def.value;
1914
0
    }
1915
0
}
1916
1917
/* STUB describes an la25 stub that we have decided to implement
1918
   by inserting an LUI/ADDIU pair before the target function.
1919
   Create the section and redirect the function symbol to it.  */
1920
1921
static bool
1922
mips_elf_add_la25_intro (struct mips_elf_la25_stub *stub,
1923
       struct bfd_link_info *info)
1924
0
{
1925
0
  struct mips_elf_link_hash_table *htab;
1926
0
  char *name;
1927
0
  asection *s, *input_section;
1928
0
  unsigned int align;
1929
1930
0
  htab = mips_elf_hash_table (info);
1931
0
  if (htab == NULL)
1932
0
    return false;
1933
1934
  /* Create a unique name for the new section.  */
1935
0
  name = bfd_malloc (11 + sizeof (".text.stub."));
1936
0
  if (name == NULL)
1937
0
    return false;
1938
0
  sprintf (name, ".text.stub.%d", (int) htab_elements (htab->la25_stubs));
1939
1940
  /* Create the section.  */
1941
0
  mips_elf_get_la25_target (stub, &input_section);
1942
0
  s = htab->add_stub_section (name, input_section,
1943
0
            input_section->output_section);
1944
0
  if (s == NULL)
1945
0
    return false;
1946
1947
  /* Make sure that any padding goes before the stub.  */
1948
0
  align = input_section->alignment_power;
1949
0
  if (!bfd_link_align_section (s, align))
1950
0
    return false;
1951
0
  if (align > 3)
1952
0
    s->size = (1 << align) - 8;
1953
1954
  /* Create a symbol for the stub.  */
1955
0
  mips_elf_create_stub_symbol (info, stub->h, ".pic.", s, s->size, 8);
1956
0
  stub->stub_section = s;
1957
0
  stub->offset = s->size;
1958
1959
  /* Allocate room for it.  */
1960
0
  s->size += 8;
1961
0
  return true;
1962
0
}
1963
1964
/* STUB describes an la25 stub that we have decided to implement
1965
   with a separate trampoline.  Allocate room for it and redirect
1966
   the function symbol to it.  */
1967
1968
static bool
1969
mips_elf_add_la25_trampoline (struct mips_elf_la25_stub *stub,
1970
            struct bfd_link_info *info)
1971
0
{
1972
0
  struct mips_elf_link_hash_table *htab;
1973
0
  asection *s;
1974
1975
0
  htab = mips_elf_hash_table (info);
1976
0
  if (htab == NULL)
1977
0
    return false;
1978
1979
  /* Create a trampoline section, if we haven't already.  */
1980
0
  s = htab->strampoline;
1981
0
  if (s == NULL)
1982
0
    {
1983
0
      asection *input_section = stub->h->root.root.u.def.section;
1984
0
      s = htab->add_stub_section (".text", NULL,
1985
0
          input_section->output_section);
1986
0
      if (s == NULL || !bfd_link_align_section (s, 4))
1987
0
  return false;
1988
0
      htab->strampoline = s;
1989
0
    }
1990
1991
  /* Create a symbol for the stub.  */
1992
0
  mips_elf_create_stub_symbol (info, stub->h, ".pic.", s, s->size, 16);
1993
0
  stub->stub_section = s;
1994
0
  stub->offset = s->size;
1995
1996
  /* Allocate room for it.  */
1997
0
  s->size += 16;
1998
0
  return true;
1999
0
}
2000
2001
/* H describes a symbol that needs an la25 stub.  Make sure that an
2002
   appropriate stub exists and point H at it.  */
2003
2004
static bool
2005
mips_elf_add_la25_stub (struct bfd_link_info *info,
2006
      struct mips_elf_link_hash_entry *h)
2007
0
{
2008
0
  struct mips_elf_link_hash_table *htab;
2009
0
  struct mips_elf_la25_stub search, *stub;
2010
0
  bool use_trampoline_p;
2011
0
  asection *s;
2012
0
  bfd_vma value;
2013
0
  void **slot;
2014
2015
  /* Describe the stub we want.  */
2016
0
  search.stub_section = NULL;
2017
0
  search.offset = 0;
2018
0
  search.h = h;
2019
2020
  /* See if we've already created an equivalent stub.  */
2021
0
  htab = mips_elf_hash_table (info);
2022
0
  if (htab == NULL)
2023
0
    return false;
2024
2025
0
  slot = htab_find_slot (htab->la25_stubs, &search, INSERT);
2026
0
  if (slot == NULL)
2027
0
    return false;
2028
2029
0
  stub = (struct mips_elf_la25_stub *) *slot;
2030
0
  if (stub != NULL)
2031
0
    {
2032
      /* We can reuse the existing stub.  */
2033
0
      h->la25_stub = stub;
2034
0
      return true;
2035
0
    }
2036
2037
  /* Create a permanent copy of ENTRY and add it to the hash table.  */
2038
0
  stub = bfd_malloc (sizeof (search));
2039
0
  if (stub == NULL)
2040
0
    return false;
2041
0
  *stub = search;
2042
0
  *slot = stub;
2043
2044
  /* Prefer to use LUI/ADDIU stubs if the function is at the beginning
2045
     of the section and if we would need no more than 2 nops.  */
2046
0
  value = mips_elf_get_la25_target (stub, &s);
2047
0
  if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
2048
0
    value &= ~1;
2049
0
  use_trampoline_p = (value != 0 || s->alignment_power > 4);
2050
2051
0
  h->la25_stub = stub;
2052
0
  return (use_trampoline_p
2053
0
    ? mips_elf_add_la25_trampoline (stub, info)
2054
0
    : mips_elf_add_la25_intro (stub, info));
2055
0
}
2056
2057
/* A mips_elf_link_hash_traverse callback that is called before sizing
2058
   sections.  DATA points to a mips_htab_traverse_info structure.  */
2059
2060
static bool
2061
mips_elf_check_symbols (struct mips_elf_link_hash_entry *h, void *data)
2062
0
{
2063
0
  struct mips_htab_traverse_info *hti;
2064
2065
0
  hti = (struct mips_htab_traverse_info *) data;
2066
0
  if (!bfd_link_relocatable (hti->info))
2067
0
    mips_elf_check_mips16_stubs (hti->info, h);
2068
2069
0
  if (mips_elf_local_pic_function_p (h))
2070
0
    {
2071
      /* PR 12845: If H is in a section that has been garbage
2072
   collected it will have its output section set to *ABS*.  */
2073
0
      if (bfd_is_abs_section (h->root.root.u.def.section->output_section))
2074
0
  return true;
2075
2076
      /* H is a function that might need $25 to be valid on entry.
2077
   If we're creating a non-PIC relocatable object, mark H as
2078
   being PIC.  If we're creating a non-relocatable object with
2079
   non-PIC branches and jumps to H, make sure that H has an la25
2080
   stub.  */
2081
0
      if (bfd_link_relocatable (hti->info))
2082
0
  {
2083
0
    if (!PIC_OBJECT_P (hti->output_bfd))
2084
0
      h->root.other = ELF_ST_SET_MIPS_PIC (h->root.other);
2085
0
  }
2086
0
      else if (h->has_nonpic_branches && !mips_elf_add_la25_stub (hti->info, h))
2087
0
  {
2088
0
    hti->error = true;
2089
0
    return false;
2090
0
  }
2091
0
    }
2092
0
  return true;
2093
0
}
2094

2095
/* R_MIPS16_26 is used for the mips16 jal and jalx instructions.
2096
   Most mips16 instructions are 16 bits, but these instructions
2097
   are 32 bits.
2098
2099
   The format of these instructions is:
2100
2101
   +--------------+--------------------------------+
2102
   |     JALX     | X|   Imm 20:16  |   Imm 25:21  |
2103
   +--------------+--------------------------------+
2104
   |        Immediate  15:0      |
2105
   +-----------------------------------------------+
2106
2107
   JALX is the 5-bit value 00011.  X is 0 for jal, 1 for jalx.
2108
   Note that the immediate value in the first word is swapped.
2109
2110
   When producing a relocatable object file, R_MIPS16_26 is
2111
   handled mostly like R_MIPS_26.  In particular, the addend is
2112
   stored as a straight 26-bit value in a 32-bit instruction.
2113
   (gas makes life simpler for itself by never adjusting a
2114
   R_MIPS16_26 reloc to be against a section, so the addend is
2115
   always zero).  However, the 32 bit instruction is stored as 2
2116
   16-bit values, rather than a single 32-bit value.  In a
2117
   big-endian file, the result is the same; in a little-endian
2118
   file, the two 16-bit halves of the 32 bit value are swapped.
2119
   This is so that a disassembler can recognize the jal
2120
   instruction.
2121
2122
   When doing a final link, R_MIPS16_26 is treated as a 32 bit
2123
   instruction stored as two 16-bit values.  The addend A is the
2124
   contents of the targ26 field.  The calculation is the same as
2125
   R_MIPS_26.  When storing the calculated value, reorder the
2126
   immediate value as shown above, and don't forget to store the
2127
   value as two 16-bit values.
2128
2129
   To put it in MIPS ABI terms, the relocation field is T-targ26-16,
2130
   defined as
2131
2132
   big-endian:
2133
   +--------+----------------------+
2134
   |      |        |
2135
   |      |  targ26-16     |
2136
   |31    26|25       0|
2137
   +--------+----------------------+
2138
2139
   little-endian:
2140
   +----------+------+-------------+
2141
   |        |      |       |
2142
   |  sub1    |      |     sub2    |
2143
   |0      9|10  15|16   31|
2144
   +----------+--------------------+
2145
   where targ26-16 is sub1 followed by sub2 (i.e., the addend field A is
2146
   ((sub1 << 16) | sub2)).
2147
2148
   When producing a relocatable object file, the calculation is
2149
   (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
2150
   When producing a fully linked file, the calculation is
2151
   let R = (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
2152
   ((R & 0x1f0000) << 5) | ((R & 0x3e00000) >> 5) | (R & 0xffff)
2153
2154
   The table below lists the other MIPS16 instruction relocations.
2155
   Each one is calculated in the same way as the non-MIPS16 relocation
2156
   given on the right, but using the extended MIPS16 layout of 16-bit
2157
   immediate fields:
2158
2159
  R_MIPS16_GPREL    R_MIPS_GPREL16
2160
  R_MIPS16_GOT16    R_MIPS_GOT16
2161
  R_MIPS16_CALL16   R_MIPS_CALL16
2162
  R_MIPS16_HI16   R_MIPS_HI16
2163
  R_MIPS16_LO16   R_MIPS_LO16
2164
2165
   A typical instruction will have a format like this:
2166
2167
   +--------------+--------------------------------+
2168
   |    EXTEND    |     Imm 10:5    |   Imm 15:11  |
2169
   +--------------+--------------------------------+
2170
   |    Major     |   rx   |   ry   |   Imm  4:0   |
2171
   +--------------+--------------------------------+
2172
2173
   EXTEND is the five bit value 11110.  Major is the instruction
2174
   opcode.
2175
2176
   All we need to do here is shuffle the bits appropriately.
2177
   As above, the two 16-bit halves must be swapped on a
2178
   little-endian system.
2179
2180
   Finally R_MIPS16_PC16_S1 corresponds to R_MIPS_PC16, however the
2181
   relocatable field is shifted by 1 rather than 2 and the same bit
2182
   shuffling is done as with the relocations above.  */
2183
2184
static inline bool
2185
mips16_reloc_p (int r_type)
2186
1.44k
{
2187
1.44k
  switch (r_type)
2188
1.44k
    {
2189
42
    case R_MIPS16_26:
2190
51
    case R_MIPS16_GPREL:
2191
51
    case R_MIPS16_GOT16:
2192
53
    case R_MIPS16_CALL16:
2193
69
    case R_MIPS16_HI16:
2194
105
    case R_MIPS16_LO16:
2195
129
    case R_MIPS16_TLS_GD:
2196
129
    case R_MIPS16_TLS_LDM:
2197
129
    case R_MIPS16_TLS_DTPREL_HI16:
2198
131
    case R_MIPS16_TLS_DTPREL_LO16:
2199
133
    case R_MIPS16_TLS_GOTTPREL:
2200
133
    case R_MIPS16_TLS_TPREL_HI16:
2201
133
    case R_MIPS16_TLS_TPREL_LO16:
2202
133
    case R_MIPS16_PC16_S1:
2203
133
      return true;
2204
2205
1.30k
    default:
2206
1.30k
      return false;
2207
1.44k
    }
2208
1.44k
}
2209
2210
/* Check if a microMIPS reloc.  */
2211
2212
static inline bool
2213
micromips_reloc_p (unsigned int r_type)
2214
1.49k
{
2215
1.49k
  return r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max;
2216
1.49k
}
2217
2218
/* Similar to MIPS16, the two 16-bit halves in microMIPS must be swapped
2219
   on a little-endian system.  This does not apply to R_MICROMIPS_PC7_S1,
2220
   R_MICROMIPS_PC10_S1 and R_MICROMIPS_GPREL7_S2 relocs that apply to
2221
   16-bit instructions.  */
2222
2223
static inline bool
2224
micromips_reloc_shuffle_p (unsigned int r_type)
2225
1.30k
{
2226
1.30k
  return (micromips_reloc_p (r_type)
2227
1.30k
    && r_type != R_MICROMIPS_PC7_S1
2228
1.30k
    && r_type != R_MICROMIPS_PC10_S1
2229
1.30k
    && r_type != R_MICROMIPS_GPREL7_S2);
2230
1.30k
}
2231
2232
static inline bool
2233
got16_reloc_p (int r_type)
2234
0
{
2235
0
  return (r_type == R_MIPS_GOT16
2236
0
    || r_type == R_MIPS16_GOT16
2237
0
    || r_type == R_MICROMIPS_GOT16);
2238
0
}
2239
2240
static inline bool
2241
call16_reloc_p (int r_type)
2242
0
{
2243
0
  return (r_type == R_MIPS_CALL16
2244
0
    || r_type == R_MIPS16_CALL16
2245
0
    || r_type == R_MICROMIPS_CALL16);
2246
0
}
2247
2248
static inline bool
2249
got_disp_reloc_p (unsigned int r_type)
2250
0
{
2251
0
  return r_type == R_MIPS_GOT_DISP || r_type == R_MICROMIPS_GOT_DISP;
2252
0
}
2253
2254
static inline bool
2255
got_page_reloc_p (unsigned int r_type)
2256
0
{
2257
0
  return r_type == R_MIPS_GOT_PAGE || r_type == R_MICROMIPS_GOT_PAGE;
2258
0
}
2259
2260
static inline bool
2261
got_lo16_reloc_p (unsigned int r_type)
2262
0
{
2263
0
  return r_type == R_MIPS_GOT_LO16 || r_type == R_MICROMIPS_GOT_LO16;
2264
0
}
2265
2266
static inline bool
2267
call_hi16_reloc_p (unsigned int r_type)
2268
0
{
2269
0
  return r_type == R_MIPS_CALL_HI16 || r_type == R_MICROMIPS_CALL_HI16;
2270
0
}
2271
2272
static inline bool
2273
call_lo16_reloc_p (unsigned int r_type)
2274
0
{
2275
0
  return r_type == R_MIPS_CALL_LO16 || r_type == R_MICROMIPS_CALL_LO16;
2276
0
}
2277
2278
static inline bool
2279
hi16_reloc_p (int r_type)
2280
0
{
2281
0
  return (r_type == R_MIPS_HI16
2282
0
    || r_type == R_MIPS16_HI16
2283
0
    || r_type == R_MICROMIPS_HI16
2284
0
    || r_type == R_MIPS_PCHI16);
2285
0
}
2286
2287
static inline bool
2288
lo16_reloc_p (int r_type)
2289
0
{
2290
0
  return (r_type == R_MIPS_LO16
2291
0
    || r_type == R_MIPS16_LO16
2292
0
    || r_type == R_MICROMIPS_LO16
2293
0
    || r_type == R_MIPS_PCLO16);
2294
0
}
2295
2296
static inline bool
2297
mips16_call_reloc_p (int r_type)
2298
0
{
2299
0
  return r_type == R_MIPS16_26 || r_type == R_MIPS16_CALL16;
2300
0
}
2301
2302
static inline bool
2303
jal_reloc_p (int r_type)
2304
0
{
2305
0
  return (r_type == R_MIPS_26
2306
0
    || r_type == R_MIPS16_26
2307
0
    || r_type == R_MICROMIPS_26_S1);
2308
0
}
2309
2310
static inline bool
2311
b_reloc_p (int r_type)
2312
0
{
2313
0
  return (r_type == R_MIPS_PC26_S2
2314
0
    || r_type == R_MIPS_PC21_S2
2315
0
    || r_type == R_MIPS_PC16
2316
0
    || r_type == R_MIPS_GNU_REL16_S2
2317
0
    || r_type == R_MIPS16_PC16_S1
2318
0
    || r_type == R_MICROMIPS_PC16_S1
2319
0
    || r_type == R_MICROMIPS_PC10_S1
2320
0
    || r_type == R_MICROMIPS_PC7_S1);
2321
0
}
2322
2323
static inline bool
2324
aligned_pcrel_reloc_p (int r_type)
2325
0
{
2326
0
  return (r_type == R_MIPS_PC18_S3
2327
0
    || r_type == R_MIPS_PC19_S2);
2328
0
}
2329
2330
static inline bool
2331
branch_reloc_p (int r_type)
2332
0
{
2333
0
  return (r_type == R_MIPS_26
2334
0
    || r_type == R_MIPS_PC26_S2
2335
0
    || r_type == R_MIPS_PC21_S2
2336
0
    || r_type == R_MIPS_PC16
2337
0
    || r_type == R_MIPS_GNU_REL16_S2);
2338
0
}
2339
2340
static inline bool
2341
mips16_branch_reloc_p (int r_type)
2342
0
{
2343
0
  return (r_type == R_MIPS16_26
2344
0
    || r_type == R_MIPS16_PC16_S1);
2345
0
}
2346
2347
static inline bool
2348
micromips_branch_reloc_p (int r_type)
2349
0
{
2350
0
  return (r_type == R_MICROMIPS_26_S1
2351
0
    || r_type == R_MICROMIPS_PC16_S1
2352
0
    || r_type == R_MICROMIPS_PC10_S1
2353
0
    || r_type == R_MICROMIPS_PC7_S1);
2354
0
}
2355
2356
static inline bool
2357
tls_gd_reloc_p (unsigned int r_type)
2358
0
{
2359
0
  return (r_type == R_MIPS_TLS_GD
2360
0
    || r_type == R_MIPS16_TLS_GD
2361
0
    || r_type == R_MICROMIPS_TLS_GD);
2362
0
}
2363
2364
static inline bool
2365
tls_ldm_reloc_p (unsigned int r_type)
2366
0
{
2367
0
  return (r_type == R_MIPS_TLS_LDM
2368
0
    || r_type == R_MIPS16_TLS_LDM
2369
0
    || r_type == R_MICROMIPS_TLS_LDM);
2370
0
}
2371
2372
static inline bool
2373
tls_gottprel_reloc_p (unsigned int r_type)
2374
0
{
2375
0
  return (r_type == R_MIPS_TLS_GOTTPREL
2376
0
    || r_type == R_MIPS16_TLS_GOTTPREL
2377
0
    || r_type == R_MICROMIPS_TLS_GOTTPREL);
2378
0
}
2379
2380
static inline bool
2381
needs_shuffle (int r_type)
2382
1.44k
{
2383
1.44k
  return mips16_reloc_p (r_type) || micromips_reloc_shuffle_p (r_type);
2384
1.44k
}
2385
2386
void
2387
_bfd_mips_elf_reloc_unshuffle (bfd *abfd, int r_type,
2388
             bool jal_shuffle, bfd_byte *data)
2389
703
{
2390
703
  bfd_vma first, second, val;
2391
2392
703
  if (!needs_shuffle (r_type))
2393
607
    return;
2394
2395
  /* Pick up the first and second halfwords of the instruction.  */
2396
96
  first = bfd_get_16 (abfd, data);
2397
96
  second = bfd_get_16 (abfd, data + 2);
2398
96
  if (micromips_reloc_p (r_type) || (r_type == R_MIPS16_26 && !jal_shuffle))
2399
53
    val = first << 16 | second;
2400
43
  else if (r_type != R_MIPS16_26)
2401
43
    val = (((first & 0xf800) << 16) | ((second & 0xffe0) << 11)
2402
43
     | ((first & 0x1f) << 11) | (first & 0x7e0) | (second & 0x1f));
2403
0
  else
2404
0
    val = (((first & 0xfc00) << 16) | ((first & 0x3e0) << 11)
2405
0
     | ((first & 0x1f) << 21) | second);
2406
96
  bfd_put_32 (abfd, val, data);
2407
96
}
2408
2409
void
2410
_bfd_mips_elf_reloc_shuffle (bfd *abfd, int r_type,
2411
           bool jal_shuffle, bfd_byte *data)
2412
703
{
2413
703
  bfd_vma first, second, val;
2414
2415
703
  if (!needs_shuffle (r_type))
2416
607
    return;
2417
2418
96
  val = bfd_get_32 (abfd, data);
2419
96
  if (micromips_reloc_p (r_type) || (r_type == R_MIPS16_26 && !jal_shuffle))
2420
53
    {
2421
53
      second = val & 0xffff;
2422
53
      first = val >> 16;
2423
53
    }
2424
43
  else if (r_type != R_MIPS16_26)
2425
43
    {
2426
43
      second = ((val >> 11) & 0xffe0) | (val & 0x1f);
2427
43
      first = ((val >> 16) & 0xf800) | ((val >> 11) & 0x1f) | (val & 0x7e0);
2428
43
    }
2429
0
  else
2430
0
    {
2431
0
      second = val & 0xffff;
2432
0
      first = ((val >> 16) & 0xfc00) | ((val >> 11) & 0x3e0)
2433
0
         | ((val >> 21) & 0x1f);
2434
0
    }
2435
96
  bfd_put_16 (abfd, second, data + 2);
2436
96
  bfd_put_16 (abfd, first, data);
2437
96
}
2438
2439
/* Perform reloc offset checking.
2440
   We can only use bfd_reloc_offset_in_range, which takes into account
2441
   the size of the field being relocated, when section contents will
2442
   be accessed because mips object files may use relocations that seem
2443
   to access beyond section limits.
2444
   gas/testsuite/gas/mips/dla-reloc.s is an example that puts
2445
   R_MIPS_SUB, a 64-bit relocation, on the last instruction in the
2446
   section.  The R_MIPS_SUB applies to the addend for the next reloc
2447
   rather than the section contents.
2448
2449
   CHECK is CHECK_STD for the standard bfd_reloc_offset_in_range check,
2450
   CHECK_INPLACE to only check partial_inplace relocs, and
2451
   CHECK_SHUFFLE to only check relocs that shuffle/unshuffle.  */
2452
2453
bool
2454
_bfd_mips_reloc_offset_in_range (bfd *abfd, asection *input_section,
2455
         arelent *reloc_entry, enum reloc_check check)
2456
780
{
2457
780
  if (check == check_inplace && !reloc_entry->howto->partial_inplace)
2458
3
    return true;
2459
777
  if (check == check_shuffle && !needs_shuffle (reloc_entry->howto->type))
2460
20
    return true;
2461
757
  return bfd_reloc_offset_in_range (reloc_entry->howto, abfd,
2462
757
            input_section, reloc_entry->address);
2463
777
}
2464
2465
bfd_reloc_status_type
2466
_bfd_mips_elf_gprel16_with_gp (bfd *abfd, asymbol *symbol,
2467
             arelent *reloc_entry, asection *input_section,
2468
             bool relocatable, void *data, bfd_vma gp)
2469
52
{
2470
52
  bfd_vma relocation;
2471
52
  bfd_signed_vma val;
2472
52
  bfd_reloc_status_type status;
2473
2474
52
  if (bfd_is_com_section (symbol->section))
2475
3
    relocation = 0;
2476
49
  else
2477
49
    relocation = symbol->value;
2478
2479
52
  if (symbol->section->output_section != NULL)
2480
52
    {
2481
52
      relocation += symbol->section->output_section->vma;
2482
52
      relocation += symbol->section->output_offset;
2483
52
    }
2484
2485
  /* Set val to the offset into the section or symbol.  */
2486
52
  val = reloc_entry->addend;
2487
2488
52
  _bfd_mips_elf_sign_extend (val, 16);
2489
2490
  /* Adjust val for the final section location and GP value.  If we
2491
     are producing relocatable output, we don't want to do this for
2492
     an external symbol.  */
2493
52
  if (! relocatable
2494
52
      || (symbol->flags & BSF_SECTION_SYM) != 0)
2495
52
    val += relocation - gp;
2496
2497
52
  if (reloc_entry->howto->partial_inplace)
2498
21
    {
2499
21
      if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd, input_section,
2500
21
              reloc_entry->address))
2501
2
  return bfd_reloc_outofrange;
2502
2503
19
      status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
2504
19
               (bfd_byte *) data
2505
19
               + reloc_entry->address);
2506
19
      if (status != bfd_reloc_ok)
2507
2
  return status;
2508
19
    }
2509
31
  else
2510
31
    reloc_entry->addend = val;
2511
2512
48
  if (relocatable)
2513
0
    reloc_entry->address += input_section->output_offset;
2514
2515
48
  return bfd_reloc_ok;
2516
52
}
2517
2518
/* A howto special_function for REL *HI16 relocations.  We can only
2519
   calculate the correct value once we've seen the partnering
2520
   *LO16 relocation, so just save the information for later.
2521
2522
   The ABI requires that the *LO16 immediately follow the *HI16.
2523
   However, as a GNU extension, we permit an arbitrary number of
2524
   *HI16s to be associated with a single *LO16.  This significantly
2525
   simplies the relocation handling in gcc.  */
2526
2527
bfd_reloc_status_type
2528
_bfd_mips_elf_hi16_reloc (bfd *abfd, arelent *reloc_entry,
2529
        asymbol *symbol ATTRIBUTE_UNUSED, void *data,
2530
        asection *input_section, bfd *output_bfd,
2531
        char **error_message ATTRIBUTE_UNUSED)
2532
43
{
2533
43
  struct mips_hi16 *n;
2534
43
  struct mips_elf_obj_tdata *tdata;
2535
2536
43
  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2537
8
    return bfd_reloc_outofrange;
2538
2539
35
  n = bfd_malloc (sizeof *n);
2540
35
  if (n == NULL)
2541
0
    return bfd_reloc_outofrange;
2542
2543
35
  tdata = mips_elf_tdata (abfd);
2544
35
  n->next = tdata->mips_hi16_list;
2545
35
  n->data = data;
2546
35
  n->input_section = input_section;
2547
35
  n->rel = *reloc_entry;
2548
35
  tdata->mips_hi16_list = n;
2549
2550
35
  if (output_bfd != NULL)
2551
0
    reloc_entry->address += input_section->output_offset;
2552
2553
35
  return bfd_reloc_ok;
2554
35
}
2555
2556
/* A howto special_function for REL R_MIPS*_GOT16 relocations.  This is just
2557
   like any other 16-bit relocation when applied to global symbols, but is
2558
   treated in the same as R_MIPS_HI16 when applied to local symbols.  */
2559
2560
bfd_reloc_status_type
2561
_bfd_mips_elf_got16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2562
         void *data, asection *input_section,
2563
         bfd *output_bfd, char **error_message)
2564
32
{
2565
32
  if ((symbol->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
2566
32
      || bfd_is_und_section (bfd_asymbol_section (symbol))
2567
32
      || bfd_is_com_section (bfd_asymbol_section (symbol)))
2568
    /* The relocation is against a global symbol.  */
2569
0
    return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2570
0
          input_section, output_bfd,
2571
0
          error_message);
2572
2573
32
  return _bfd_mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
2574
32
           input_section, output_bfd, error_message);
2575
32
}
2576
2577
/* A howto special_function for REL *LO16 relocations.  The *LO16 itself
2578
   is a straightforward 16 bit inplace relocation, but we must deal with
2579
   any partnering high-part relocations as well.  */
2580
2581
bfd_reloc_status_type
2582
_bfd_mips_elf_lo16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2583
        void *data, asection *input_section,
2584
        bfd *output_bfd, char **error_message)
2585
18
{
2586
18
  bfd_vma vallo;
2587
18
  bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
2588
18
  struct mips_elf_obj_tdata *tdata;
2589
2590
18
  if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd, input_section,
2591
18
          reloc_entry->address))
2592
2
    return bfd_reloc_outofrange;
2593
2594
16
  _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, false,
2595
16
         location);
2596
  /* The high 16 bits of the addend are stored in the high insn, the
2597
     low 16 bits in the low insn, but there is a catch:  You can't
2598
     just concatenate the high and low parts.  The high part of the
2599
     addend is adjusted for the fact that the low part is sign
2600
     extended.  For example, an addend of 0x38000 would have 0x0004 in
2601
     the high part and 0x8000 (=0xff..f8000) in the low part.
2602
     To extract the actual addend, calculate (a)
2603
     ((hi & 0xffff) << 16) + ((lo & 0xffff) ^ 0x8000) - 0x8000.
2604
     We will be applying (symbol + addend) & 0xffff to the low insn,
2605
     and we want to apply (b) (symbol + addend + 0x8000) >> 16 to the
2606
     high insn (the +0x8000 adjusting for when the applied low part is
2607
     negative).  Substituting (a) into (b) and recognising that
2608
     (hi & 0xffff) is already in the high insn gives a high part
2609
     addend adjustment of (lo & 0xffff) ^ 0x8000.  */
2610
16
  vallo = (bfd_get_32 (abfd, location) & 0xffff) ^ 0x8000;
2611
16
  _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, false,
2612
16
             location);
2613
2614
16
  tdata = mips_elf_tdata (abfd);
2615
30
  while (tdata->mips_hi16_list != NULL)
2616
14
    {
2617
14
      bfd_reloc_status_type ret;
2618
14
      struct mips_hi16 *hi;
2619
2620
14
      hi = tdata->mips_hi16_list;
2621
2622
      /* R_MIPS*_GOT16 relocations are something of a special case.  We
2623
   want to install the addend in the same way as for a R_MIPS*_HI16
2624
   relocation (with a rightshift of 16).  However, since GOT16
2625
   relocations can also be used with global symbols, their howto
2626
   has a rightshift of 0.  */
2627
14
      if (hi->rel.howto->type == R_MIPS_GOT16)
2628
0
  hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MIPS_HI16, false);
2629
14
      else if (hi->rel.howto->type == R_MIPS16_GOT16)
2630
8
  hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MIPS16_HI16, false);
2631
6
      else if (hi->rel.howto->type == R_MICROMIPS_GOT16)
2632
5
  hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MICROMIPS_HI16, false);
2633
2634
14
      hi->rel.addend += vallo;
2635
2636
14
      ret = _bfd_mips_elf_generic_reloc (abfd, &hi->rel, symbol, hi->data,
2637
14
           hi->input_section, output_bfd,
2638
14
           error_message);
2639
14
      if (ret != bfd_reloc_ok)
2640
0
  return ret;
2641
2642
14
      tdata->mips_hi16_list = hi->next;
2643
14
      free (hi);
2644
14
    }
2645
2646
16
  return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2647
16
              input_section, output_bfd,
2648
16
              error_message);
2649
16
}
2650
2651
/* A generic howto special_function.  This calculates and installs the
2652
   relocation itself, thus avoiding the oft-discussed problems in
2653
   bfd_perform_relocation and bfd_install_relocation.  */
2654
2655
bfd_reloc_status_type
2656
_bfd_mips_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2657
           asymbol *symbol, void *data ATTRIBUTE_UNUSED,
2658
           asection *input_section, bfd *output_bfd,
2659
           char **error_message ATTRIBUTE_UNUSED)
2660
737
{
2661
737
  bfd_signed_vma val;
2662
737
  bfd_reloc_status_type status;
2663
737
  bool relocatable;
2664
2665
737
  relocatable = (output_bfd != NULL);
2666
2667
737
  if (!_bfd_mips_reloc_offset_in_range (abfd, input_section, reloc_entry,
2668
737
          (relocatable
2669
737
           ? check_inplace : check_std)))
2670
80
    return bfd_reloc_outofrange;
2671
2672
  /* Build up the field adjustment in VAL.  */
2673
657
  val = 0;
2674
657
  if ((!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0)
2675
657
      && symbol->section->output_section != NULL)
2676
657
    {
2677
      /* Either we're calculating the final field value or we have a
2678
   relocation against a section symbol.  Add in the section's
2679
   offset or address.  */
2680
657
      val += symbol->section->output_section->vma;
2681
657
      val += symbol->section->output_offset;
2682
657
    }
2683
2684
657
  if (!relocatable)
2685
657
    {
2686
      /* We're calculating the final field value.  Add in the symbol's value
2687
   and, if pc-relative, subtract the address of the field itself.  */
2688
657
      val += symbol->value;
2689
657
      if (reloc_entry->howto->pc_relative)
2690
35
  {
2691
35
    val -= input_section->output_section->vma;
2692
35
    val -= input_section->output_offset;
2693
35
    val -= reloc_entry->address;
2694
35
  }
2695
657
    }
2696
2697
  /* VAL is now the final adjustment.  If we're keeping this relocation
2698
     in the output file, and if the relocation uses a separate addend,
2699
     we just need to add VAL to that addend.  Otherwise we need to add
2700
     VAL to the relocation field itself.  */
2701
657
  if (relocatable && !reloc_entry->howto->partial_inplace)
2702
0
    reloc_entry->addend += val;
2703
657
  else
2704
657
    {
2705
657
      bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
2706
2707
      /* Add in the separate addend, if any.  */
2708
657
      val += reloc_entry->addend;
2709
2710
      /* Add VAL to the relocation field.  */
2711
657
      _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, false,
2712
657
             location);
2713
657
      status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
2714
657
               location);
2715
657
      _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, false,
2716
657
           location);
2717
2718
657
      if (status != bfd_reloc_ok)
2719
44
  return status;
2720
657
    }
2721
2722
613
  if (relocatable)
2723
0
    reloc_entry->address += input_section->output_offset;
2724
2725
613
  return bfd_reloc_ok;
2726
657
}
2727

2728
/* Swap an entry in a .gptab section.  Note that these routines rely
2729
   on the equivalence of the two elements of the union.  */
2730
2731
static void
2732
bfd_mips_elf32_swap_gptab_in (bfd *abfd, const Elf32_External_gptab *ex,
2733
            Elf32_gptab *in)
2734
0
{
2735
0
  in->gt_entry.gt_g_value = H_GET_32 (abfd, ex->gt_entry.gt_g_value);
2736
0
  in->gt_entry.gt_bytes = H_GET_32 (abfd, ex->gt_entry.gt_bytes);
2737
0
}
2738
2739
static void
2740
bfd_mips_elf32_swap_gptab_out (bfd *abfd, const Elf32_gptab *in,
2741
             Elf32_External_gptab *ex)
2742
0
{
2743
0
  H_PUT_32 (abfd, in->gt_entry.gt_g_value, ex->gt_entry.gt_g_value);
2744
0
  H_PUT_32 (abfd, in->gt_entry.gt_bytes, ex->gt_entry.gt_bytes);
2745
0
}
2746
2747
static void
2748
bfd_elf32_swap_compact_rel_out (bfd *abfd, const Elf32_compact_rel *in,
2749
        Elf32_External_compact_rel *ex)
2750
0
{
2751
0
  H_PUT_32 (abfd, in->id1, ex->id1);
2752
0
  H_PUT_32 (abfd, in->num, ex->num);
2753
0
  H_PUT_32 (abfd, in->id2, ex->id2);
2754
0
  H_PUT_32 (abfd, in->offset, ex->offset);
2755
0
  H_PUT_32 (abfd, in->reserved0, ex->reserved0);
2756
0
  H_PUT_32 (abfd, in->reserved1, ex->reserved1);
2757
0
}
2758
2759
static void
2760
bfd_elf32_swap_crinfo_out (bfd *abfd, const Elf32_crinfo *in,
2761
         Elf32_External_crinfo *ex)
2762
0
{
2763
0
  unsigned long l;
2764
2765
0
  l = (((in->ctype & CRINFO_CTYPE) << CRINFO_CTYPE_SH)
2766
0
       | ((in->rtype & CRINFO_RTYPE) << CRINFO_RTYPE_SH)
2767
0
       | ((in->dist2to & CRINFO_DIST2TO) << CRINFO_DIST2TO_SH)
2768
0
       | ((in->relvaddr & CRINFO_RELVADDR) << CRINFO_RELVADDR_SH));
2769
0
  H_PUT_32 (abfd, l, ex->info);
2770
0
  H_PUT_32 (abfd, in->konst, ex->konst);
2771
0
  H_PUT_32 (abfd, in->vaddr, ex->vaddr);
2772
0
}
2773

2774
/* A .reginfo section holds a single Elf32_RegInfo structure.  These
2775
   routines swap this structure in and out.  They are used outside of
2776
   BFD, so they are globally visible.  */
2777
2778
void
2779
bfd_mips_elf32_swap_reginfo_in (bfd *abfd, const Elf32_External_RegInfo *ex,
2780
        Elf32_RegInfo *in)
2781
48
{
2782
48
  in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
2783
48
  in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
2784
48
  in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
2785
48
  in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
2786
48
  in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
2787
48
  in->ri_gp_value = H_GET_32 (abfd, ex->ri_gp_value);
2788
48
}
2789
2790
void
2791
bfd_mips_elf32_swap_reginfo_out (bfd *abfd, const Elf32_RegInfo *in,
2792
         Elf32_External_RegInfo *ex)
2793
0
{
2794
0
  H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
2795
0
  H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
2796
0
  H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
2797
0
  H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
2798
0
  H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
2799
0
  H_PUT_32 (abfd, in->ri_gp_value, ex->ri_gp_value);
2800
0
}
2801
2802
/* In the 64 bit ABI, the .MIPS.options section holds register
2803
   information in an Elf64_Reginfo structure.  These routines swap
2804
   them in and out.  They are globally visible because they are used
2805
   outside of BFD.  These routines are here so that gas can call them
2806
   without worrying about whether the 64 bit ABI has been included.  */
2807
2808
void
2809
bfd_mips_elf64_swap_reginfo_in (bfd *abfd, const Elf64_External_RegInfo *ex,
2810
        Elf64_Internal_RegInfo *in)
2811
2.08k
{
2812
2.08k
  in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
2813
2.08k
  in->ri_pad = H_GET_32 (abfd, ex->ri_pad);
2814
2.08k
  in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
2815
2.08k
  in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
2816
2.08k
  in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
2817
2.08k
  in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
2818
2.08k
  in->ri_gp_value = H_GET_64 (abfd, ex->ri_gp_value);
2819
2.08k
}
2820
2821
void
2822
bfd_mips_elf64_swap_reginfo_out (bfd *abfd, const Elf64_Internal_RegInfo *in,
2823
         Elf64_External_RegInfo *ex)
2824
0
{
2825
0
  H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
2826
0
  H_PUT_32 (abfd, in->ri_pad, ex->ri_pad);
2827
0
  H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
2828
0
  H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
2829
0
  H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
2830
0
  H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
2831
0
  H_PUT_64 (abfd, in->ri_gp_value, ex->ri_gp_value);
2832
0
}
2833
2834
/* Swap in an options header.  */
2835
2836
void
2837
bfd_mips_elf_swap_options_in (bfd *abfd, const Elf_External_Options *ex,
2838
            Elf_Internal_Options *in)
2839
7.75k
{
2840
7.75k
  in->kind = H_GET_8 (abfd, ex->kind);
2841
7.75k
  in->size = H_GET_8 (abfd, ex->size);
2842
7.75k
  in->section = H_GET_16 (abfd, ex->section);
2843
7.75k
  in->info = H_GET_32 (abfd, ex->info);
2844
7.75k
}
2845
2846
/* Swap out an options header.  */
2847
2848
void
2849
bfd_mips_elf_swap_options_out (bfd *abfd, const Elf_Internal_Options *in,
2850
             Elf_External_Options *ex)
2851
0
{
2852
0
  H_PUT_8 (abfd, in->kind, ex->kind);
2853
0
  H_PUT_8 (abfd, in->size, ex->size);
2854
0
  H_PUT_16 (abfd, in->section, ex->section);
2855
0
  H_PUT_32 (abfd, in->info, ex->info);
2856
0
}
2857
2858
/* Swap in an abiflags structure.  */
2859
2860
void
2861
bfd_mips_elf_swap_abiflags_v0_in (bfd *abfd,
2862
          const Elf_External_ABIFlags_v0 *ex,
2863
          Elf_Internal_ABIFlags_v0 *in)
2864
0
{
2865
0
  in->version = H_GET_16 (abfd, ex->version);
2866
0
  in->isa_level = H_GET_8 (abfd, ex->isa_level);
2867
0
  in->isa_rev = H_GET_8 (abfd, ex->isa_rev);
2868
0
  in->gpr_size = H_GET_8 (abfd, ex->gpr_size);
2869
0
  in->cpr1_size = H_GET_8 (abfd, ex->cpr1_size);
2870
0
  in->cpr2_size = H_GET_8 (abfd, ex->cpr2_size);
2871
0
  in->fp_abi = H_GET_8 (abfd, ex->fp_abi);
2872
0
  in->isa_ext = H_GET_32 (abfd, ex->isa_ext);
2873
0
  in->ases = H_GET_32 (abfd, ex->ases);
2874
0
  in->flags1 = H_GET_32 (abfd, ex->flags1);
2875
0
  in->flags2 = H_GET_32 (abfd, ex->flags2);
2876
0
}
2877
2878
/* Swap out an abiflags structure.  */
2879
2880
void
2881
bfd_mips_elf_swap_abiflags_v0_out (bfd *abfd,
2882
           const Elf_Internal_ABIFlags_v0 *in,
2883
           Elf_External_ABIFlags_v0 *ex)
2884
0
{
2885
0
  H_PUT_16 (abfd, in->version, ex->version);
2886
0
  H_PUT_8 (abfd, in->isa_level, ex->isa_level);
2887
0
  H_PUT_8 (abfd, in->isa_rev, ex->isa_rev);
2888
0
  H_PUT_8 (abfd, in->gpr_size, ex->gpr_size);
2889
0
  H_PUT_8 (abfd, in->cpr1_size, ex->cpr1_size);
2890
0
  H_PUT_8 (abfd, in->cpr2_size, ex->cpr2_size);
2891
0
  H_PUT_8 (abfd, in->fp_abi, ex->fp_abi);
2892
0
  H_PUT_32 (abfd, in->isa_ext, ex->isa_ext);
2893
0
  H_PUT_32 (abfd, in->ases, ex->ases);
2894
0
  H_PUT_32 (abfd, in->flags1, ex->flags1);
2895
0
  H_PUT_32 (abfd, in->flags2, ex->flags2);
2896
0
}
2897

2898
/* This function is called via qsort() to sort the dynamic relocation
2899
   entries by increasing r_symndx value.  */
2900
2901
static int
2902
sort_dynamic_relocs (const void *arg1, const void *arg2)
2903
0
{
2904
0
  Elf_Internal_Rela int_reloc1;
2905
0
  Elf_Internal_Rela int_reloc2;
2906
0
  int diff;
2907
2908
0
  bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg1, &int_reloc1);
2909
0
  bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg2, &int_reloc2);
2910
2911
0
  diff = ELF32_R_SYM (int_reloc1.r_info) - ELF32_R_SYM (int_reloc2.r_info);
2912
0
  if (diff != 0)
2913
0
    return diff;
2914
2915
0
  if (int_reloc1.r_offset < int_reloc2.r_offset)
2916
0
    return -1;
2917
0
  if (int_reloc1.r_offset > int_reloc2.r_offset)
2918
0
    return 1;
2919
0
  return 0;
2920
0
}
2921
2922
/* Like sort_dynamic_relocs, but used for elf64 relocations.  */
2923
2924
static int
2925
sort_dynamic_relocs_64 (const void *arg1 ATTRIBUTE_UNUSED,
2926
      const void *arg2 ATTRIBUTE_UNUSED)
2927
0
{
2928
0
#ifdef BFD64
2929
0
  Elf_Internal_Rela int_reloc1[3];
2930
0
  Elf_Internal_Rela int_reloc2[3];
2931
2932
0
  (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
2933
0
    (reldyn_sorting_bfd, arg1, int_reloc1);
2934
0
  (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
2935
0
    (reldyn_sorting_bfd, arg2, int_reloc2);
2936
2937
0
  if (ELF64_R_SYM (int_reloc1[0].r_info) < ELF64_R_SYM (int_reloc2[0].r_info))
2938
0
    return -1;
2939
0
  if (ELF64_R_SYM (int_reloc1[0].r_info) > ELF64_R_SYM (int_reloc2[0].r_info))
2940
0
    return 1;
2941
2942
0
  if (int_reloc1[0].r_offset < int_reloc2[0].r_offset)
2943
0
    return -1;
2944
0
  if (int_reloc1[0].r_offset > int_reloc2[0].r_offset)
2945
0
    return 1;
2946
0
  return 0;
2947
#else
2948
  abort ();
2949
#endif
2950
0
}
2951
2952
2953
/* This routine is used to write out ECOFF debugging external symbol
2954
   information.  It is called via mips_elf_link_hash_traverse.  The
2955
   ECOFF external symbol information must match the ELF external
2956
   symbol information.  Unfortunately, at this point we don't know
2957
   whether a symbol is required by reloc information, so the two
2958
   tables may wind up being different.  We must sort out the external
2959
   symbol information before we can set the final size of the .mdebug
2960
   section, and we must set the size of the .mdebug section before we
2961
   can relocate any sections, and we can't know which symbols are
2962
   required by relocation until we relocate the sections.
2963
   Fortunately, it is relatively unlikely that any symbol will be
2964
   stripped but required by a reloc.  In particular, it can not happen
2965
   when generating a final executable.  */
2966
2967
static bool
2968
mips_elf_output_extsym (struct mips_elf_link_hash_entry *h, void *data)
2969
0
{
2970
0
  struct extsym_info *einfo = data;
2971
0
  bool strip;
2972
0
  asection *sec, *output_section;
2973
2974
0
  if (h->root.indx == -2)
2975
0
    strip = false;
2976
0
  else if ((h->root.def_dynamic
2977
0
      || h->root.ref_dynamic
2978
0
      || h->root.type == bfd_link_hash_new)
2979
0
     && !h->root.def_regular
2980
0
     && !h->root.ref_regular)
2981
0
    strip = true;
2982
0
  else if (einfo->info->strip == strip_all
2983
0
     || (einfo->info->strip == strip_some
2984
0
         && bfd_hash_lookup (einfo->info->keep_hash,
2985
0
           h->root.root.root.string,
2986
0
           false, false) == NULL))
2987
0
    strip = true;
2988
0
  else
2989
0
    strip = false;
2990
2991
0
  if (strip)
2992
0
    return true;
2993
2994
0
  if (h->esym.ifd == -2)
2995
0
    {
2996
0
      h->esym.jmptbl = 0;
2997
0
      h->esym.cobol_main = 0;
2998
0
      h->esym.weakext = 0;
2999
0
      h->esym.reserved = 0;
3000
0
      h->esym.ifd = ifdNil;
3001
0
      h->esym.asym.value = 0;
3002
0
      h->esym.asym.st = stGlobal;
3003
3004
0
      if (h->root.root.type == bfd_link_hash_undefined
3005
0
    || h->root.root.type == bfd_link_hash_undefweak)
3006
0
  {
3007
0
    const char *name;
3008
3009
    /* Use undefined class.  Also, set class and type for some
3010
       special symbols.  */
3011
0
    name = h->root.root.root.string;
3012
0
    if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
3013
0
        || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
3014
0
      {
3015
0
        h->esym.asym.sc = scData;
3016
0
        h->esym.asym.st = stLabel;
3017
0
        h->esym.asym.value = 0;
3018
0
      }
3019
0
    else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
3020
0
      {
3021
0
        h->esym.asym.sc = scAbs;
3022
0
        h->esym.asym.st = stLabel;
3023
0
        h->esym.asym.value =
3024
0
    mips_elf_hash_table (einfo->info)->procedure_count;
3025
0
      }
3026
0
    else
3027
0
      h->esym.asym.sc = scUndefined;
3028
0
  }
3029
0
      else if (h->root.root.type != bfd_link_hash_defined
3030
0
    && h->root.root.type != bfd_link_hash_defweak)
3031
0
  h->esym.asym.sc = scAbs;
3032
0
      else
3033
0
  {
3034
0
    const char *name;
3035
3036
0
    sec = h->root.root.u.def.section;
3037
0
    output_section = sec->output_section;
3038
3039
    /* When making a shared library and symbol h is the one from
3040
       the another shared library, OUTPUT_SECTION may be null.  */
3041
0
    if (output_section == NULL)
3042
0
      h->esym.asym.sc = scUndefined;
3043
0
    else
3044
0
      {
3045
0
        name = bfd_section_name (output_section);
3046
3047
0
        if (strcmp (name, ".text") == 0)
3048
0
    h->esym.asym.sc = scText;
3049
0
        else if (strcmp (name, ".data") == 0)
3050
0
    h->esym.asym.sc = scData;
3051
0
        else if (strcmp (name, ".sdata") == 0)
3052
0
    h->esym.asym.sc = scSData;
3053
0
        else if (strcmp (name, ".rodata") == 0
3054
0
           || strcmp (name, ".rdata") == 0)
3055
0
    h->esym.asym.sc = scRData;
3056
0
        else if (strcmp (name, ".bss") == 0)
3057
0
    h->esym.asym.sc = scBss;
3058
0
        else if (strcmp (name, ".sbss") == 0)
3059
0
    h->esym.asym.sc = scSBss;
3060
0
        else if (strcmp (name, ".init") == 0)
3061
0
    h->esym.asym.sc = scInit;
3062
0
        else if (strcmp (name, ".fini") == 0)
3063
0
    h->esym.asym.sc = scFini;
3064
0
        else
3065
0
    h->esym.asym.sc = scAbs;
3066
0
      }
3067
0
  }
3068
3069
0
      h->esym.asym.reserved = 0;
3070
0
      h->esym.asym.index = indexNil;
3071
0
    }
3072
3073
0
  if (h->root.root.type == bfd_link_hash_common)
3074
0
    h->esym.asym.value = h->root.root.u.c.size;
3075
0
  else if (h->root.root.type == bfd_link_hash_defined
3076
0
     || h->root.root.type == bfd_link_hash_defweak)
3077
0
    {
3078
0
      if (h->esym.asym.sc == scCommon)
3079
0
  h->esym.asym.sc = scBss;
3080
0
      else if (h->esym.asym.sc == scSCommon)
3081
0
  h->esym.asym.sc = scSBss;
3082
3083
0
      sec = h->root.root.u.def.section;
3084
0
      output_section = sec->output_section;
3085
0
      if (output_section != NULL)
3086
0
  h->esym.asym.value = (h->root.root.u.def.value
3087
0
            + sec->output_offset
3088
0
            + output_section->vma);
3089
0
      else
3090
0
  h->esym.asym.value = 0;
3091
0
    }
3092
0
  else
3093
0
    {
3094
0
      struct mips_elf_link_hash_entry *hd = h;
3095
3096
0
      while (hd->root.root.type == bfd_link_hash_indirect)
3097
0
  hd = (struct mips_elf_link_hash_entry *)h->root.root.u.i.link;
3098
3099
0
      if (hd->needs_lazy_stub)
3100
0
  {
3101
0
    BFD_ASSERT (hd->root.plt.plist != NULL);
3102
0
    BFD_ASSERT (hd->root.plt.plist->stub_offset != MINUS_ONE);
3103
    /* Set type and value for a symbol with a function stub.  */
3104
0
    h->esym.asym.st = stProc;
3105
0
    sec = hd->root.root.u.def.section;
3106
0
    if (sec == NULL)
3107
0
      h->esym.asym.value = 0;
3108
0
    else
3109
0
      {
3110
0
        output_section = sec->output_section;
3111
0
        if (output_section != NULL)
3112
0
    h->esym.asym.value = (hd->root.plt.plist->stub_offset
3113
0
              + sec->output_offset
3114
0
              + output_section->vma);
3115
0
        else
3116
0
    h->esym.asym.value = 0;
3117
0
      }
3118
0
  }
3119
0
    }
3120
3121
0
  if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
3122
0
              h->root.root.root.string,
3123
0
              &h->esym))
3124
0
    {
3125
0
      einfo->failed = true;
3126
0
      return false;
3127
0
    }
3128
3129
0
  return true;
3130
0
}
3131
3132
/* A comparison routine used to sort .gptab entries.  */
3133
3134
static int
3135
gptab_compare (const void *p1, const void *p2)
3136
0
{
3137
0
  const Elf32_gptab *a1 = p1;
3138
0
  const Elf32_gptab *a2 = p2;
3139
3140
0
  return a1->gt_entry.gt_g_value - a2->gt_entry.gt_g_value;
3141
0
}
3142

3143
/* Functions to manage the got entry hash table.  */
3144
3145
/* Use all 64 bits of a bfd_vma for the computation of a 32-bit
3146
   hash number.  */
3147
3148
static inline hashval_t
3149
mips_elf_hash_bfd_vma (bfd_vma addr)
3150
0
{
3151
0
#ifdef BFD64
3152
0
  return addr + (addr >> 32);
3153
#else
3154
  return addr;
3155
#endif
3156
0
}
3157
3158
static hashval_t
3159
mips_elf_got_entry_hash (const void *entry_)
3160
0
{
3161
0
  const struct mips_got_entry *entry = (struct mips_got_entry *)entry_;
3162
3163
0
  return (entry->symndx
3164
0
    + ((entry->tls_type == GOT_TLS_LDM) << 18)
3165
0
    + (entry->tls_type == GOT_TLS_LDM ? 0
3166
0
       : !entry->abfd ? mips_elf_hash_bfd_vma (entry->d.address)
3167
0
       : entry->symndx >= 0 ? (entry->abfd->id
3168
0
             + mips_elf_hash_bfd_vma (entry->d.addend))
3169
0
       : entry->d.h->root.root.root.hash));
3170
0
}
3171
3172
static int
3173
mips_elf_got_entry_eq (const void *entry1, const void *entry2)
3174
0
{
3175
0
  const struct mips_got_entry *e1 = (struct mips_got_entry *)entry1;
3176
0
  const struct mips_got_entry *e2 = (struct mips_got_entry *)entry2;
3177
3178
0
  return (e1->symndx == e2->symndx
3179
0
    && e1->tls_type == e2->tls_type
3180
0
    && (e1->tls_type == GOT_TLS_LDM ? true
3181
0
        : !e1->abfd ? !e2->abfd && e1->d.address == e2->d.address
3182
0
        : e1->symndx >= 0 ? (e1->abfd == e2->abfd
3183
0
           && e1->d.addend == e2->d.addend)
3184
0
        : e2->abfd && e1->d.h == e2->d.h));
3185
0
}
3186
3187
static hashval_t
3188
mips_got_page_ref_hash (const void *ref_)
3189
0
{
3190
0
  const struct mips_got_page_ref *ref;
3191
3192
0
  ref = (const struct mips_got_page_ref *) ref_;
3193
0
  return ((ref->symndx >= 0
3194
0
     ? (hashval_t) (ref->u.abfd->id + ref->symndx)
3195
0
     : ref->u.h->root.root.root.hash)
3196
0
    + mips_elf_hash_bfd_vma (ref->addend));
3197
0
}
3198
3199
static int
3200
mips_got_page_ref_eq (const void *ref1_, const void *ref2_)
3201
0
{
3202
0
  const struct mips_got_page_ref *ref1, *ref2;
3203
3204
0
  ref1 = (const struct mips_got_page_ref *) ref1_;
3205
0
  ref2 = (const struct mips_got_page_ref *) ref2_;
3206
0
  return (ref1->symndx == ref2->symndx
3207
0
    && (ref1->symndx < 0
3208
0
        ? ref1->u.h == ref2->u.h
3209
0
        : ref1->u.abfd == ref2->u.abfd)
3210
0
    && ref1->addend == ref2->addend);
3211
0
}
3212
3213
static hashval_t
3214
mips_got_page_entry_hash (const void *entry_)
3215
0
{
3216
0
  const struct mips_got_page_entry *entry;
3217
3218
0
  entry = (const struct mips_got_page_entry *) entry_;
3219
0
  return entry->sec->id;
3220
0
}
3221
3222
static int
3223
mips_got_page_entry_eq (const void *entry1_, const void *entry2_)
3224
0
{
3225
0
  const struct mips_got_page_entry *entry1, *entry2;
3226
3227
0
  entry1 = (const struct mips_got_page_entry *) entry1_;
3228
0
  entry2 = (const struct mips_got_page_entry *) entry2_;
3229
0
  return entry1->sec == entry2->sec;
3230
0
}
3231

3232
/* Create and return a new mips_got_info structure.  */
3233
3234
static struct mips_got_info *
3235
mips_elf_create_got_info (bfd *abfd)
3236
0
{
3237
0
  struct mips_got_info *g;
3238
3239
0
  g = bfd_zalloc (abfd, sizeof (struct mips_got_info));
3240
0
  if (g == NULL)
3241
0
    return NULL;
3242
3243
0
  g->got_entries = htab_try_create (1, mips_elf_got_entry_hash,
3244
0
            mips_elf_got_entry_eq, NULL);
3245
0
  if (g->got_entries == NULL)
3246
0
    return NULL;
3247
3248
0
  g->got_page_refs = htab_try_create (1, mips_got_page_ref_hash,
3249
0
              mips_got_page_ref_eq, NULL);
3250
0
  if (g->got_page_refs == NULL)
3251
0
    return NULL;
3252
3253
0
  return g;
3254
0
}
3255
3256
/* Return the GOT info for input bfd ABFD, trying to create a new one if
3257
   CREATE_P and if ABFD doesn't already have a GOT.  */
3258
3259
static struct mips_got_info *
3260
mips_elf_bfd_got (bfd *abfd, bool create_p)
3261
0
{
3262
0
  struct mips_elf_obj_tdata *tdata;
3263
3264
0
  if (!is_mips_elf (abfd))
3265
0
    return NULL;
3266
3267
0
  tdata = mips_elf_tdata (abfd);
3268
0
  if (!tdata->got && create_p)
3269
0
    tdata->got = mips_elf_create_got_info (abfd);
3270
0
  return tdata->got;
3271
0
}
3272
3273
/* Record that ABFD should use output GOT G.  */
3274
3275
static void
3276
mips_elf_replace_bfd_got (bfd *abfd, struct mips_got_info *g)
3277
0
{
3278
0
  struct mips_elf_obj_tdata *tdata;
3279
3280
0
  BFD_ASSERT (is_mips_elf (abfd));
3281
0
  tdata = mips_elf_tdata (abfd);
3282
0
  if (tdata->got)
3283
0
    {
3284
      /* The GOT structure itself and the hash table entries are
3285
   allocated to a bfd, but the hash tables aren't.  */
3286
0
      htab_delete (tdata->got->got_entries);
3287
0
      htab_delete (tdata->got->got_page_refs);
3288
0
      if (tdata->got->got_page_entries)
3289
0
  htab_delete (tdata->got->got_page_entries);
3290
0
    }
3291
0
  tdata->got = g;
3292
0
}
3293
3294
/* Return the dynamic relocation section.  If it doesn't exist, try to
3295
   create a new it if CREATE_P, otherwise return NULL.  Also return NULL
3296
   if creation fails.  */
3297
3298
static asection *
3299
mips_elf_rel_dyn_section (struct bfd_link_info *info, bool create_p)
3300
0
{
3301
0
  const char *dname;
3302
0
  asection *sreloc;
3303
0
  bfd *dynobj;
3304
3305
0
  dname = MIPS_ELF_REL_DYN_NAME (info);
3306
0
  dynobj = elf_hash_table (info)->dynobj;
3307
0
  sreloc = bfd_get_linker_section (dynobj, dname);
3308
0
  if (sreloc == NULL && create_p)
3309
0
    {
3310
0
      sreloc = bfd_make_section_anyway_with_flags (dynobj, dname,
3311
0
               (SEC_ALLOC
3312
0
                | SEC_LOAD
3313
0
                | SEC_HAS_CONTENTS
3314
0
                | SEC_IN_MEMORY
3315
0
                | SEC_LINKER_CREATED
3316
0
                | SEC_READONLY));
3317
0
      if (sreloc == NULL
3318
0
    || !bfd_set_section_alignment (sreloc,
3319
0
           MIPS_ELF_LOG_FILE_ALIGN (dynobj)))
3320
0
  return NULL;
3321
0
    }
3322
0
  return sreloc;
3323
0
}
3324
3325
/* Return the GOT_TLS_* type required by relocation type R_TYPE.  */
3326
3327
static int
3328
mips_elf_reloc_tls_type (unsigned int r_type)
3329
0
{
3330
0
  if (tls_gd_reloc_p (r_type))
3331
0
    return GOT_TLS_GD;
3332
3333
0
  if (tls_ldm_reloc_p (r_type))
3334
0
    return GOT_TLS_LDM;
3335
3336
0
  if (tls_gottprel_reloc_p (r_type))
3337
0
    return GOT_TLS_IE;
3338
3339
0
  return GOT_TLS_NONE;
3340
0
}
3341
3342
/* Return the number of GOT slots needed for GOT TLS type TYPE.  */
3343
3344
static int
3345
mips_tls_got_entries (unsigned int type)
3346
0
{
3347
0
  switch (type)
3348
0
    {
3349
0
    case GOT_TLS_GD:
3350
0
    case GOT_TLS_LDM:
3351
0
      return 2;
3352
3353
0
    case GOT_TLS_IE:
3354
0
      return 1;
3355
3356
0
    case GOT_TLS_NONE:
3357
0
      return 0;
3358
0
    }
3359
0
  abort ();
3360
0
}
3361
3362
/* Count the number of relocations needed for a TLS GOT entry, with
3363
   access types from TLS_TYPE, and symbol H (or a local symbol if H
3364
   is NULL).  */
3365
3366
static int
3367
mips_tls_got_relocs (struct bfd_link_info *info, unsigned char tls_type,
3368
         struct elf_link_hash_entry *h)
3369
0
{
3370
0
  int indx = 0;
3371
0
  bool need_relocs = false;
3372
0
  bool dyn = elf_hash_table (info)->dynamic_sections_created;
3373
3374
0
  if (h != NULL
3375
0
      && h->dynindx != -1
3376
0
      && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
3377
0
      && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, h)))
3378
0
    indx = h->dynindx;
3379
3380
0
  if ((bfd_link_dll (info) || indx != 0)
3381
0
      && (h == NULL
3382
0
    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3383
0
    || h->root.type != bfd_link_hash_undefweak))
3384
0
    need_relocs = true;
3385
3386
0
  if (!need_relocs)
3387
0
    return 0;
3388
3389
0
  switch (tls_type)
3390
0
    {
3391
0
    case GOT_TLS_GD:
3392
0
      return indx != 0 ? 2 : 1;
3393
3394
0
    case GOT_TLS_IE:
3395
0
      return 1;
3396
3397
0
    case GOT_TLS_LDM:
3398
0
      return bfd_link_dll (info) ? 1 : 0;
3399
3400
0
    default:
3401
0
      return 0;
3402
0
    }
3403
0
}
3404
3405
/* Add the number of GOT entries and TLS relocations required by ENTRY
3406
   to G.  */
3407
3408
static void
3409
mips_elf_count_got_entry (struct bfd_link_info *info,
3410
        struct mips_got_info *g,
3411
        struct mips_got_entry *entry)
3412
0
{
3413
0
  if (entry->tls_type)
3414
0
    {
3415
0
      g->tls_gotno += mips_tls_got_entries (entry->tls_type);
3416
0
      g->relocs += mips_tls_got_relocs (info, entry->tls_type,
3417
0
          entry->symndx < 0
3418
0
          ? &entry->d.h->root : NULL);
3419
0
    }
3420
0
  else if (entry->symndx >= 0 || entry->d.h->global_got_area == GGA_NONE)
3421
0
    g->local_gotno += 1;
3422
0
  else
3423
0
    g->global_gotno += 1;
3424
0
}
3425
3426
/* Output a simple dynamic relocation into SRELOC.  */
3427
3428
static void
3429
mips_elf_output_dynamic_relocation (bfd *output_bfd,
3430
            asection *sreloc,
3431
            unsigned long reloc_index,
3432
            unsigned long indx,
3433
            int r_type,
3434
            bfd_vma offset)
3435
0
{
3436
0
  Elf_Internal_Rela rel[3];
3437
3438
0
  memset (rel, 0, sizeof (rel));
3439
3440
0
  rel[0].r_info = ELF_R_INFO (output_bfd, indx, r_type);
3441
0
  rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
3442
3443
0
  if (ABI_64_P (output_bfd))
3444
0
    {
3445
0
      (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
3446
0
  (output_bfd, &rel[0],
3447
0
   (sreloc->contents
3448
0
    + reloc_index * sizeof (Elf64_Mips_External_Rel)));
3449
0
    }
3450
0
  else
3451
0
    bfd_elf32_swap_reloc_out
3452
0
      (output_bfd, &rel[0],
3453
0
       (sreloc->contents
3454
0
  + reloc_index * sizeof (Elf32_External_Rel)));
3455
0
}
3456
3457
/* Initialize a set of TLS GOT entries for one symbol.  */
3458
3459
static void
3460
mips_elf_initialize_tls_slots (bfd *abfd, struct bfd_link_info *info,
3461
             struct mips_got_entry *entry,
3462
             struct mips_elf_link_hash_entry *h,
3463
             bfd_vma value)
3464
0
{
3465
0
  bool dyn = elf_hash_table (info)->dynamic_sections_created;
3466
0
  struct mips_elf_link_hash_table *htab;
3467
0
  int indx;
3468
0
  asection *sreloc, *sgot;
3469
0
  bfd_vma got_offset, got_offset2;
3470
0
  bool need_relocs = false;
3471
3472
0
  htab = mips_elf_hash_table (info);
3473
0
  if (htab == NULL)
3474
0
    return;
3475
3476
0
  sgot = htab->root.sgot;
3477
3478
0
  indx = 0;
3479
0
  if (h != NULL
3480
0
      && h->root.dynindx != -1
3481
0
      && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), &h->root)
3482
0
      && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, &h->root)))
3483
0
    indx = h->root.dynindx;
3484
3485
0
  if (entry->tls_initialized)
3486
0
    return;
3487
3488
0
  if ((bfd_link_dll (info) || indx != 0)
3489
0
      && (h == NULL
3490
0
    || ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT
3491
0
    || h->root.type != bfd_link_hash_undefweak))
3492
0
    need_relocs = true;
3493
3494
  /* MINUS_ONE means the symbol is not defined in this object.  It may not
3495
     be defined at all; assume that the value doesn't matter in that
3496
     case.  Otherwise complain if we would use the value.  */
3497
0
  BFD_ASSERT (value != MINUS_ONE || (indx != 0 && need_relocs)
3498
0
        || h->root.root.type == bfd_link_hash_undefweak);
3499
3500
  /* Emit necessary relocations.  */
3501
0
  sreloc = mips_elf_rel_dyn_section (info, false);
3502
0
  got_offset = entry->gotidx;
3503
3504
0
  switch (entry->tls_type)
3505
0
    {
3506
0
    case GOT_TLS_GD:
3507
      /* General Dynamic.  */
3508
0
      got_offset2 = got_offset + MIPS_ELF_GOT_SIZE (abfd);
3509
3510
0
      if (need_relocs)
3511
0
  {
3512
0
    mips_elf_output_dynamic_relocation
3513
0
      (abfd, sreloc, sreloc->reloc_count++, indx,
3514
0
       ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
3515
0
       sgot->output_offset + sgot->output_section->vma + got_offset);
3516
3517
0
    if (indx)
3518
0
      mips_elf_output_dynamic_relocation
3519
0
        (abfd, sreloc, sreloc->reloc_count++, indx,
3520
0
         ABI_64_P (abfd) ? R_MIPS_TLS_DTPREL64 : R_MIPS_TLS_DTPREL32,
3521
0
         sgot->output_offset + sgot->output_section->vma + got_offset2);
3522
0
    else
3523
0
      MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
3524
0
             sgot->contents + got_offset2);
3525
0
  }
3526
0
      else
3527
0
  {
3528
0
    MIPS_ELF_PUT_WORD (abfd, 1,
3529
0
           sgot->contents + got_offset);
3530
0
    MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
3531
0
           sgot->contents + got_offset2);
3532
0
  }
3533
0
      break;
3534
3535
0
    case GOT_TLS_IE:
3536
      /* Initial Exec model.  */
3537
0
      if (need_relocs)
3538
0
  {
3539
0
    if (indx == 0)
3540
0
      MIPS_ELF_PUT_WORD (abfd, value - elf_hash_table (info)->tls_sec->vma,
3541
0
             sgot->contents + got_offset);
3542
0
    else
3543
0
      MIPS_ELF_PUT_WORD (abfd, 0,
3544
0
             sgot->contents + got_offset);
3545
3546
0
    mips_elf_output_dynamic_relocation
3547
0
      (abfd, sreloc, sreloc->reloc_count++, indx,
3548
0
       ABI_64_P (abfd) ? R_MIPS_TLS_TPREL64 : R_MIPS_TLS_TPREL32,
3549
0
       sgot->output_offset + sgot->output_section->vma + got_offset);
3550
0
  }
3551
0
      else
3552
0
  MIPS_ELF_PUT_WORD (abfd, value - tprel_base (info),
3553
0
         sgot->contents + got_offset);
3554
0
      break;
3555
3556
0
    case GOT_TLS_LDM:
3557
      /* The initial offset is zero, and the LD offsets will include the
3558
   bias by DTP_OFFSET.  */
3559
0
      MIPS_ELF_PUT_WORD (abfd, 0,
3560
0
       sgot->contents + got_offset
3561
0
       + MIPS_ELF_GOT_SIZE (abfd));
3562
3563
0
      if (!bfd_link_dll (info))
3564
0
  MIPS_ELF_PUT_WORD (abfd, 1,
3565
0
         sgot->contents + got_offset);
3566
0
      else
3567
0
  mips_elf_output_dynamic_relocation
3568
0
    (abfd, sreloc, sreloc->reloc_count++, indx,
3569
0
     ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
3570
0
     sgot->output_offset + sgot->output_section->vma + got_offset);
3571
0
      break;
3572
3573
0
    default:
3574
0
      abort ();
3575
0
    }
3576
3577
0
  entry->tls_initialized = true;
3578
0
}
3579
3580
/* Return the offset from _GLOBAL_OFFSET_TABLE_ of the .got.plt entry
3581
   for global symbol H.  .got.plt comes before the GOT, so the offset
3582
   will be negative.  */
3583
3584
static bfd_vma
3585
mips_elf_gotplt_index (struct bfd_link_info *info,
3586
           struct elf_link_hash_entry *h)
3587
0
{
3588
0
  bfd_vma got_address, got_value;
3589
0
  struct mips_elf_link_hash_table *htab;
3590
3591
0
  htab = mips_elf_hash_table (info);
3592
0
  BFD_ASSERT (htab != NULL);
3593
3594
0
  BFD_ASSERT (h->plt.plist != NULL);
3595
0
  BFD_ASSERT (h->plt.plist->gotplt_index != MINUS_ONE);
3596
3597
  /* Calculate the address of the associated .got.plt entry.  */
3598
0
  got_address = (htab->root.sgotplt->output_section->vma
3599
0
     + htab->root.sgotplt->output_offset
3600
0
     + (h->plt.plist->gotplt_index
3601
0
        * MIPS_ELF_GOT_SIZE (info->output_bfd)));
3602
3603
  /* Calculate the value of _GLOBAL_OFFSET_TABLE_.  */
3604
0
  got_value = (htab->root.hgot->root.u.def.section->output_section->vma
3605
0
         + htab->root.hgot->root.u.def.section->output_offset
3606
0
         + htab->root.hgot->root.u.def.value);
3607
3608
0
  return got_address - got_value;
3609
0
}
3610
3611
/* Return the GOT offset for address VALUE.   If there is not yet a GOT
3612
   entry for this value, create one.  If R_SYMNDX refers to a TLS symbol,
3613
   create a TLS GOT entry instead.  Return -1 if no satisfactory GOT
3614
   offset can be found.  */
3615
3616
static bfd_vma
3617
mips_elf_local_got_index (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
3618
        bfd_vma value, unsigned long r_symndx,
3619
        struct mips_elf_link_hash_entry *h, int r_type)
3620
0
{
3621
0
  struct mips_elf_link_hash_table *htab;
3622
0
  struct mips_got_entry *entry;
3623
3624
0
  htab = mips_elf_hash_table (info);
3625
0
  BFD_ASSERT (htab != NULL);
3626
3627
0
  entry = mips_elf_create_local_got_entry (abfd, info, ibfd, value,
3628
0
             r_symndx, h, r_type);
3629
0
  if (!entry)
3630
0
    return MINUS_ONE;
3631
3632
0
  if (entry->tls_type)
3633
0
    mips_elf_initialize_tls_slots (abfd, info, entry, h, value);
3634
0
  return entry->gotidx;
3635
0
}
3636
3637
/* Return the GOT index of global symbol H in the primary GOT.  */
3638
3639
static bfd_vma
3640
mips_elf_primary_global_got_index (bfd *obfd, struct bfd_link_info *info,
3641
           struct elf_link_hash_entry *h)
3642
0
{
3643
0
  struct mips_elf_link_hash_table *htab;
3644
0
  long global_got_dynindx;
3645
0
  struct mips_got_info *g;
3646
0
  bfd_vma got_index;
3647
3648
0
  htab = mips_elf_hash_table (info);
3649
0
  BFD_ASSERT (htab != NULL);
3650
3651
0
  global_got_dynindx = 0;
3652
0
  if (htab->global_gotsym != NULL)
3653
0
    global_got_dynindx = htab->global_gotsym->dynindx;
3654
3655
  /* Once we determine the global GOT entry with the lowest dynamic
3656
     symbol table index, we must put all dynamic symbols with greater
3657
     indices into the primary GOT.  That makes it easy to calculate the
3658
     GOT offset.  */
3659
0
  BFD_ASSERT (h->dynindx >= global_got_dynindx);
3660
0
  g = mips_elf_bfd_got (obfd, false);
3661
0
  got_index = ((h->dynindx - global_got_dynindx + g->local_gotno)
3662
0
         * MIPS_ELF_GOT_SIZE (obfd));
3663
0
  BFD_ASSERT (got_index < htab->root.sgot->size);
3664
3665
0
  return got_index;
3666
0
}
3667
3668
/* Return the GOT index for the global symbol indicated by H, which is
3669
   referenced by a relocation of type R_TYPE in IBFD.  */
3670
3671
static bfd_vma
3672
mips_elf_global_got_index (bfd *obfd, struct bfd_link_info *info, bfd *ibfd,
3673
         struct elf_link_hash_entry *h, int r_type)
3674
0
{
3675
0
  struct mips_elf_link_hash_table *htab;
3676
0
  struct mips_got_info *g;
3677
0
  struct mips_got_entry lookup, *entry;
3678
0
  bfd_vma gotidx;
3679
3680
0
  htab = mips_elf_hash_table (info);
3681
0
  BFD_ASSERT (htab != NULL);
3682
3683
0
  g = mips_elf_bfd_got (ibfd, false);
3684
0
  BFD_ASSERT (g);
3685
3686
0
  lookup.tls_type = mips_elf_reloc_tls_type (r_type);
3687
0
  if (!lookup.tls_type && g == mips_elf_bfd_got (obfd, false))
3688
0
    return mips_elf_primary_global_got_index (obfd, info, h);
3689
3690
0
  lookup.abfd = ibfd;
3691
0
  lookup.symndx = -1;
3692
0
  lookup.d.h = (struct mips_elf_link_hash_entry *) h;
3693
0
  entry = htab_find (g->got_entries, &lookup);
3694
0
  BFD_ASSERT (entry);
3695
3696
0
  gotidx = entry->gotidx;
3697
0
  BFD_ASSERT (gotidx > 0 && gotidx < htab->root.sgot->size);
3698
3699
0
  if (lookup.tls_type)
3700
0
    {
3701
0
      bfd_vma value = MINUS_ONE;
3702
3703
0
      if ((h->root.type == bfd_link_hash_defined
3704
0
     || h->root.type == bfd_link_hash_defweak)
3705
0
    && h->root.u.def.section->output_section)
3706
0
  value = (h->root.u.def.value
3707
0
     + h->root.u.def.section->output_offset
3708
0
     + h->root.u.def.section->output_section->vma);
3709
3710
0
      mips_elf_initialize_tls_slots (obfd, info, entry, lookup.d.h, value);
3711
0
    }
3712
0
  return gotidx;
3713
0
}
3714
3715
/* Find a GOT page entry that points to within 32KB of VALUE.  These
3716
   entries are supposed to be placed at small offsets in the GOT, i.e.,
3717
   within 32KB of GP.  Return the index of the GOT entry, or -1 if no
3718
   entry could be created.  If OFFSETP is nonnull, use it to return the
3719
   offset of the GOT entry from VALUE.  */
3720
3721
static bfd_vma
3722
mips_elf_got_page (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
3723
       bfd_vma value, bfd_vma *offsetp)
3724
0
{
3725
0
  bfd_vma page, got_index;
3726
0
  struct mips_got_entry *entry;
3727
3728
0
  page = (value + 0x8000) & ~(bfd_vma) 0xffff;
3729
0
  entry = mips_elf_create_local_got_entry (abfd, info, ibfd, page, 0,
3730
0
             NULL, R_MIPS_GOT_PAGE);
3731
3732
0
  if (!entry)
3733
0
    return MINUS_ONE;
3734
3735
0
  got_index = entry->gotidx;
3736
3737
0
  if (offsetp)
3738
0
    *offsetp = value - entry->d.address;
3739
3740
0
  return got_index;
3741
0
}
3742
3743
/* Find a local GOT entry for an R_MIPS*_GOT16 relocation against VALUE.
3744
   EXTERNAL is true if the relocation was originally against a global
3745
   symbol that binds locally.  */
3746
3747
static bfd_vma
3748
mips_elf_got16_entry (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
3749
          bfd_vma value, bool external)
3750
0
{
3751
0
  struct mips_got_entry *entry;
3752
3753
  /* GOT16 relocations against local symbols are followed by a LO16
3754
     relocation; those against global symbols are not.  Thus if the
3755
     symbol was originally local, the GOT16 relocation should load the
3756
     equivalent of %hi(VALUE), otherwise it should load VALUE itself.  */
3757
0
  if (! external)
3758
0
    value = mips_elf_high (value) << 16;
3759
3760
  /* It doesn't matter whether the original relocation was R_MIPS_GOT16,
3761
     R_MIPS16_GOT16, R_MIPS_CALL16, etc.  The format of the entry is the
3762
     same in all cases.  */
3763
0
  entry = mips_elf_create_local_got_entry (abfd, info, ibfd, value, 0,
3764
0
             NULL, R_MIPS_GOT16);
3765
0
  if (entry)
3766
0
    return entry->gotidx;
3767
0
  else
3768
0
    return MINUS_ONE;
3769
0
}
3770
3771
/* Returns the offset for the entry at the INDEXth position
3772
   in the GOT.  */
3773
3774
static bfd_vma
3775
mips_elf_got_offset_from_index (struct bfd_link_info *info, bfd *output_bfd,
3776
        bfd *input_bfd, bfd_vma got_index)
3777
0
{
3778
0
  struct mips_elf_link_hash_table *htab;
3779
0
  asection *sgot;
3780
0
  bfd_vma gp;
3781
3782
0
  htab = mips_elf_hash_table (info);
3783
0
  BFD_ASSERT (htab != NULL);
3784
3785
0
  sgot = htab->root.sgot;
3786
0
  gp = _bfd_get_gp_value (output_bfd)
3787
0
    + mips_elf_adjust_gp (output_bfd, htab->got_info, input_bfd);
3788
3789
0
  return sgot->output_section->vma + sgot->output_offset + got_index - gp;
3790
0
}
3791
3792
/* Create and return a local GOT entry for VALUE, which was calculated
3793
   from a symbol belonging to INPUT_SECTON.  Return NULL if it could not
3794
   be created.  If R_SYMNDX refers to a TLS symbol, create a TLS entry
3795
   instead.  */
3796
3797
static struct mips_got_entry *
3798
mips_elf_create_local_got_entry (bfd *abfd, struct bfd_link_info *info,
3799
         bfd *ibfd, bfd_vma value,
3800
         unsigned long r_symndx,
3801
         struct mips_elf_link_hash_entry *h,
3802
         int r_type)
3803
0
{
3804
0
  struct mips_got_entry lookup, *entry;
3805
0
  void **loc;
3806
0
  struct mips_got_info *g;
3807
0
  struct mips_elf_link_hash_table *htab;
3808
0
  bfd_vma gotidx;
3809
3810
0
  htab = mips_elf_hash_table (info);
3811
0
  BFD_ASSERT (htab != NULL);
3812
3813
0
  g = mips_elf_bfd_got (ibfd, false);
3814
0
  if (g == NULL)
3815
0
    {
3816
0
      g = mips_elf_bfd_got (abfd, false);
3817
0
      BFD_ASSERT (g != NULL);
3818
0
    }
3819
3820
  /* This function shouldn't be called for symbols that live in the global
3821
     area of the GOT.  */
3822
0
  BFD_ASSERT (h == NULL || h->global_got_area == GGA_NONE);
3823
3824
0
  lookup.tls_type = mips_elf_reloc_tls_type (r_type);
3825
0
  if (lookup.tls_type)
3826
0
    {
3827
0
      lookup.abfd = ibfd;
3828
0
      if (tls_ldm_reloc_p (r_type))
3829
0
  {
3830
0
    lookup.symndx = 0;
3831
0
    lookup.d.addend = 0;
3832
0
  }
3833
0
      else if (h == NULL)
3834
0
  {
3835
0
    lookup.symndx = r_symndx;
3836
0
    lookup.d.addend = 0;
3837
0
  }
3838
0
      else
3839
0
  {
3840
0
    lookup.symndx = -1;
3841
0
    lookup.d.h = h;
3842
0
  }
3843
3844
0
      entry = (struct mips_got_entry *) htab_find (g->got_entries, &lookup);
3845
0
      BFD_ASSERT (entry);
3846
3847
0
      gotidx = entry->gotidx;
3848
0
      BFD_ASSERT (gotidx > 0 && gotidx < htab->root.sgot->size);
3849
3850
0
      return entry;
3851
0
    }
3852
3853
0
  lookup.abfd = NULL;
3854
0
  lookup.symndx = -1;
3855
0
  lookup.d.address = value;
3856
0
  loc = htab_find_slot (g->got_entries, &lookup, INSERT);
3857
0
  if (!loc)
3858
0
    return NULL;
3859
3860
0
  entry = (struct mips_got_entry *) *loc;
3861
0
  if (entry)
3862
0
    return entry;
3863
3864
0
  if (g->assigned_low_gotno > g->assigned_high_gotno)
3865
0
    {
3866
      /* We didn't allocate enough space in the GOT.  */
3867
0
      _bfd_error_handler
3868
0
  (_("not enough GOT space for local GOT entries"));
3869
0
      bfd_set_error (bfd_error_bad_value);
3870
0
      return NULL;
3871
0
    }
3872
3873
0
  entry = (struct mips_got_entry *) bfd_alloc (abfd, sizeof (*entry));
3874
0
  if (!entry)
3875
0
    return NULL;
3876
3877
0
  if (got16_reloc_p (r_type)
3878
0
      || call16_reloc_p (r_type)
3879
0
      || got_page_reloc_p (r_type)
3880
0
      || got_disp_reloc_p (r_type))
3881
0
    lookup.gotidx = MIPS_ELF_GOT_SIZE (abfd) * g->assigned_low_gotno++;
3882
0
  else
3883
0
    lookup.gotidx = MIPS_ELF_GOT_SIZE (abfd) * g->assigned_high_gotno--;
3884
3885
0
  *entry = lookup;
3886
0
  *loc = entry;
3887
3888
0
  MIPS_ELF_PUT_WORD (abfd, value, htab->root.sgot->contents + entry->gotidx);
3889
3890
  /* These GOT entries need a dynamic relocation on VxWorks.  */
3891
0
  if (htab->root.target_os == is_vxworks)
3892
0
    {
3893
0
      Elf_Internal_Rela outrel;
3894
0
      asection *s;
3895
0
      bfd_byte *rloc;
3896
0
      bfd_vma got_address;
3897
3898
0
      s = mips_elf_rel_dyn_section (info, false);
3899
0
      got_address = (htab->root.sgot->output_section->vma
3900
0
         + htab->root.sgot->output_offset
3901
0
         + entry->gotidx);
3902
3903
0
      rloc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
3904
0
      outrel.r_offset = got_address;
3905
0
      outrel.r_info = ELF32_R_INFO (STN_UNDEF, R_MIPS_32);
3906
0
      outrel.r_addend = value;
3907
0
      bfd_elf32_swap_reloca_out (abfd, &outrel, rloc);
3908
0
    }
3909
3910
0
  return entry;
3911
0
}
3912
3913
/* Return the number of dynamic section symbols required by OUTPUT_BFD.
3914
   The number might be exact or a worst-case estimate, depending on how
3915
   much information is available to elf_backend_omit_section_dynsym at
3916
   the current linking stage.  */
3917
3918
static bfd_size_type
3919
count_section_dynsyms (bfd *output_bfd, struct bfd_link_info *info)
3920
0
{
3921
0
  bfd_size_type count;
3922
3923
0
  count = 0;
3924
0
  if (bfd_link_pic (info))
3925
0
    {
3926
0
      asection *p;
3927
0
      const struct elf_backend_data *bed;
3928
3929
0
      bed = get_elf_backend_data (output_bfd);
3930
0
      for (p = output_bfd->sections; p ; p = p->next)
3931
0
  if ((p->flags & SEC_EXCLUDE) == 0
3932
0
      && (p->flags & SEC_ALLOC) != 0
3933
0
      && elf_hash_table (info)->dynamic_relocs
3934
0
      && !(*bed->elf_backend_omit_section_dynsym) (output_bfd, info, p))
3935
0
    ++count;
3936
0
    }
3937
0
  return count;
3938
0
}
3939
3940
/* Sort the dynamic symbol table so that symbols that need GOT entries
3941
   appear towards the end.  */
3942
3943
static bool
3944
mips_elf_sort_hash_table (bfd *abfd, struct bfd_link_info *info)
3945
0
{
3946
0
  struct mips_elf_link_hash_table *htab;
3947
0
  struct mips_elf_hash_sort_data hsd;
3948
0
  struct mips_got_info *g;
3949
3950
0
  htab = mips_elf_hash_table (info);
3951
0
  BFD_ASSERT (htab != NULL);
3952
3953
0
  if (htab->root.dynsymcount == 0)
3954
0
    return true;
3955
3956
0
  g = htab->got_info;
3957
0
  if (g == NULL)
3958
0
    return true;
3959
3960
0
  hsd.low = NULL;
3961
0
  hsd.max_unref_got_dynindx
3962
0
    = hsd.min_got_dynindx
3963
0
    = (htab->root.dynsymcount - g->reloc_only_gotno);
3964
  /* Add 1 to local symbol indices to account for the mandatory NULL entry
3965
     at the head of the table; see `_bfd_elf_link_renumber_dynsyms'.  */
3966
0
  hsd.max_local_dynindx = count_section_dynsyms (abfd, info) + 1;
3967
0
  hsd.max_non_got_dynindx = htab->root.local_dynsymcount + 1;
3968
0
  hsd.output_bfd = abfd;
3969
0
  if (htab->root.dynobj != NULL
3970
0
      && htab->root.dynamic_sections_created
3971
0
      && info->emit_gnu_hash)
3972
0
    {
3973
0
      asection *s = bfd_get_linker_section (htab->root.dynobj, ".MIPS.xhash");
3974
0
      BFD_ASSERT (s != NULL);
3975
0
      hsd.mipsxhash = s->contents;
3976
0
      BFD_ASSERT (hsd.mipsxhash != NULL);
3977
0
    }
3978
0
  else
3979
0
    hsd.mipsxhash = NULL;
3980
0
  mips_elf_link_hash_traverse (htab, mips_elf_sort_hash_table_f, &hsd);
3981
3982
  /* There should have been enough room in the symbol table to
3983
     accommodate both the GOT and non-GOT symbols.  */
3984
0
  BFD_ASSERT (hsd.max_local_dynindx <= htab->root.local_dynsymcount + 1);
3985
0
  BFD_ASSERT (hsd.max_non_got_dynindx <= hsd.min_got_dynindx);
3986
0
  BFD_ASSERT (hsd.max_unref_got_dynindx == htab->root.dynsymcount);
3987
0
  BFD_ASSERT (htab->root.dynsymcount - hsd.min_got_dynindx == g->global_gotno);
3988
3989
  /* Now we know which dynamic symbol has the lowest dynamic symbol
3990
     table index in the GOT.  */
3991
0
  htab->global_gotsym = hsd.low;
3992
3993
0
  return true;
3994
0
}
3995
3996
/* If H needs a GOT entry, assign it the highest available dynamic
3997
   index.  Otherwise, assign it the lowest available dynamic
3998
   index.  */
3999
4000
static bool
4001
mips_elf_sort_hash_table_f (struct mips_elf_link_hash_entry *h, void *data)
4002
0
{
4003
0
  struct mips_elf_hash_sort_data *hsd = data;
4004
4005
  /* Symbols without dynamic symbol table entries aren't interesting
4006
     at all.  */
4007
0
  if (h->root.dynindx == -1)
4008
0
    return true;
4009
4010
0
  switch (h->global_got_area)
4011
0
    {
4012
0
    case GGA_NONE:
4013
0
      if (h->root.forced_local)
4014
0
  h->root.dynindx = hsd->max_local_dynindx++;
4015
0
      else
4016
0
  h->root.dynindx = hsd->max_non_got_dynindx++;
4017
0
      break;
4018
4019
0
    case GGA_NORMAL:
4020
0
      h->root.dynindx = --hsd->min_got_dynindx;
4021
0
      hsd->low = (struct elf_link_hash_entry *) h;
4022
0
      break;
4023
4024
0
    case GGA_RELOC_ONLY:
4025
0
      if (hsd->max_unref_got_dynindx == hsd->min_got_dynindx)
4026
0
  hsd->low = (struct elf_link_hash_entry *) h;
4027
0
      h->root.dynindx = hsd->max_unref_got_dynindx++;
4028
0
      break;
4029
0
    }
4030
4031
  /* Populate the .MIPS.xhash translation table entry with
4032
     the symbol dynindx.  */
4033
0
  if (h->mipsxhash_loc != 0 && hsd->mipsxhash != NULL)
4034
0
    bfd_put_32 (hsd->output_bfd, h->root.dynindx,
4035
0
    hsd->mipsxhash + h->mipsxhash_loc);
4036
4037
0
  return true;
4038
0
}
4039
4040
/* Record that input bfd ABFD requires a GOT entry like *LOOKUP
4041
   (which is owned by the caller and shouldn't be added to the
4042
   hash table directly).  */
4043
4044
static bool
4045
mips_elf_record_got_entry (struct bfd_link_info *info, bfd *abfd,
4046
         struct mips_got_entry *lookup)
4047
0
{
4048
0
  struct mips_elf_link_hash_table *htab;
4049
0
  struct mips_got_entry *entry;
4050
0
  struct mips_got_info *g;
4051
0
  void **loc, **bfd_loc;
4052
4053
  /* Make sure there's a slot for this entry in the master GOT.  */
4054
0
  htab = mips_elf_hash_table (info);
4055
0
  g = htab->got_info;
4056
0
  loc = htab_find_slot (g->got_entries, lookup, INSERT);
4057
0
  if (!loc)
4058
0
    return false;
4059
4060
  /* Populate the entry if it isn't already.  */
4061
0
  entry = (struct mips_got_entry *) *loc;
4062
0
  if (!entry)
4063
0
    {
4064
0
      entry = (struct mips_got_entry *) bfd_alloc (abfd, sizeof (*entry));
4065
0
      if (!entry)
4066
0
  return false;
4067
4068
0
      lookup->tls_initialized = false;
4069
0
      lookup->gotidx = -1;
4070
0
      *entry = *lookup;
4071
0
      *loc = entry;
4072
0
    }
4073
4074
  /* Reuse the same GOT entry for the BFD's GOT.  */
4075
0
  g = mips_elf_bfd_got (abfd, true);
4076
0
  if (!g)
4077
0
    return false;
4078
4079
0
  bfd_loc = htab_find_slot (g->got_entries, lookup, INSERT);
4080
0
  if (!bfd_loc)
4081
0
    return false;
4082
4083
0
  if (!*bfd_loc)
4084
0
    *bfd_loc = entry;
4085
0
  return true;
4086
0
}
4087
4088
/* ABFD has a GOT relocation of type R_TYPE against H.  Reserve a GOT
4089
   entry for it.  FOR_CALL is true if the caller is only interested in
4090
   using the GOT entry for calls.  */
4091
4092
static bool
4093
mips_elf_record_global_got_symbol (struct elf_link_hash_entry *h,
4094
           bfd *abfd, struct bfd_link_info *info,
4095
           bool for_call, int r_type)
4096
0
{
4097
0
  struct mips_elf_link_hash_table *htab;
4098
0
  struct mips_elf_link_hash_entry *hmips;
4099
0
  struct mips_got_entry entry;
4100
0
  unsigned char tls_type;
4101
4102
0
  htab = mips_elf_hash_table (info);
4103
0
  BFD_ASSERT (htab != NULL);
4104
4105
0
  hmips = (struct mips_elf_link_hash_entry *) h;
4106
0
  if (!for_call)
4107
0
    hmips->got_only_for_calls = false;
4108
4109
  /* A global symbol in the GOT must also be in the dynamic symbol
4110
     table.  */
4111
0
  if (h->dynindx == -1)
4112
0
    {
4113
0
      switch (ELF_ST_VISIBILITY (h->other))
4114
0
  {
4115
0
  case STV_INTERNAL:
4116
0
  case STV_HIDDEN:
4117
0
    _bfd_mips_elf_hide_symbol (info, h, true);
4118
0
    break;
4119
0
  }
4120
0
      if (!bfd_elf_link_record_dynamic_symbol (info, h))
4121
0
  return false;
4122
0
    }
4123
4124
0
  tls_type = mips_elf_reloc_tls_type (r_type);
4125
0
  if (tls_type == GOT_TLS_NONE && hmips->global_got_area > GGA_NORMAL)
4126
0
    hmips->global_got_area = GGA_NORMAL;
4127
4128
0
  entry.abfd = abfd;
4129
0
  entry.symndx = -1;
4130
0
  entry.d.h = (struct mips_elf_link_hash_entry *) h;
4131
0
  entry.tls_type = tls_type;
4132
0
  return mips_elf_record_got_entry (info, abfd, &entry);
4133
0
}
4134
4135
/* ABFD has a GOT relocation of type R_TYPE against symbol SYMNDX + ADDEND,
4136
   where SYMNDX is a local symbol.  Reserve a GOT entry for it.  */
4137
4138
static bool
4139
mips_elf_record_local_got_symbol (bfd *abfd, long symndx, bfd_vma addend,
4140
          struct bfd_link_info *info, int r_type)
4141
0
{
4142
0
  struct mips_elf_link_hash_table *htab;
4143
0
  struct mips_got_info *g;
4144
0
  struct mips_got_entry entry;
4145
4146
0
  htab = mips_elf_hash_table (info);
4147
0
  BFD_ASSERT (htab != NULL);
4148
4149
0
  g = htab->got_info;
4150
0
  BFD_ASSERT (g != NULL);
4151
4152
0
  entry.abfd = abfd;
4153
0
  entry.symndx = symndx;
4154
0
  entry.d.addend = addend;
4155
0
  entry.tls_type = mips_elf_reloc_tls_type (r_type);
4156
0
  return mips_elf_record_got_entry (info, abfd, &entry);
4157
0
}
4158
4159
/* Record that ABFD has a page relocation against SYMNDX + ADDEND.
4160
   H is the symbol's hash table entry, or null if SYMNDX is local
4161
   to ABFD.  */
4162
4163
static bool
4164
mips_elf_record_got_page_ref (struct bfd_link_info *info, bfd *abfd,
4165
            long symndx, struct elf_link_hash_entry *h,
4166
            bfd_signed_vma addend)
4167
0
{
4168
0
  struct mips_elf_link_hash_table *htab;
4169
0
  struct mips_got_info *g1, *g2;
4170
0
  struct mips_got_page_ref lookup, *entry;
4171
0
  void **loc, **bfd_loc;
4172
4173
0
  htab = mips_elf_hash_table (info);
4174
0
  BFD_ASSERT (htab != NULL);
4175
4176
0
  g1 = htab->got_info;
4177
0
  BFD_ASSERT (g1 != NULL);
4178
4179
0
  if (h)
4180
0
    {
4181
0
      lookup.symndx = -1;
4182
0
      lookup.u.h = (struct mips_elf_link_hash_entry *) h;
4183
0
    }
4184
0
  else
4185
0
    {
4186
0
      lookup.symndx = symndx;
4187
0
      lookup.u.abfd = abfd;
4188
0
    }
4189
0
  lookup.addend = addend;
4190
0
  loc = htab_find_slot (g1->got_page_refs, &lookup, INSERT);
4191
0
  if (loc == NULL)
4192
0
    return false;
4193
4194
0
  entry = (struct mips_got_page_ref *) *loc;
4195
0
  if (!entry)
4196
0
    {
4197
0
      entry = bfd_alloc (abfd, sizeof (*entry));
4198
0
      if (!entry)
4199
0
  return false;
4200
4201
0
      *entry = lookup;
4202
0
      *loc = entry;
4203
0
    }
4204
4205
  /* Add the same entry to the BFD's GOT.  */
4206
0
  g2 = mips_elf_bfd_got (abfd, true);
4207
0
  if (!g2)
4208
0
    return false;
4209
4210
0
  bfd_loc = htab_find_slot (g2->got_page_refs, &lookup, INSERT);
4211
0
  if (!bfd_loc)
4212
0
    return false;
4213
4214
0
  if (!*bfd_loc)
4215
0
    *bfd_loc = entry;
4216
4217
0
  return true;
4218
0
}
4219
4220
/* Add room for N relocations to the .rel(a).dyn section in ABFD.  */
4221
4222
static void
4223
mips_elf_allocate_dynamic_relocations (bfd *abfd, struct bfd_link_info *info,
4224
               unsigned int n)
4225
0
{
4226
0
  asection *s;
4227
0
  struct mips_elf_link_hash_table *htab;
4228
4229
0
  htab = mips_elf_hash_table (info);
4230
0
  BFD_ASSERT (htab != NULL);
4231
4232
0
  s = mips_elf_rel_dyn_section (info, false);
4233
0
  BFD_ASSERT (s != NULL);
4234
4235
0
  if (htab->root.target_os == is_vxworks)
4236
0
    s->size += n * MIPS_ELF_RELA_SIZE (abfd);
4237
0
  else
4238
0
    {
4239
0
      if (s->size == 0)
4240
0
  {
4241
    /* Make room for a null element.  */
4242
0
    s->size += MIPS_ELF_REL_SIZE (abfd);
4243
0
    ++s->reloc_count;
4244
0
  }
4245
0
      s->size += n * MIPS_ELF_REL_SIZE (abfd);
4246
0
    }
4247
0
}
4248

4249
/* A htab_traverse callback for GOT entries, with DATA pointing to a
4250
   mips_elf_traverse_got_arg structure.  Count the number of GOT
4251
   entries and TLS relocs.  Set DATA->value to true if we need
4252
   to resolve indirect or warning symbols and then recreate the GOT.  */
4253
4254
static int
4255
mips_elf_check_recreate_got (void **entryp, void *data)
4256
0
{
4257
0
  struct mips_got_entry *entry;
4258
0
  struct mips_elf_traverse_got_arg *arg;
4259
4260
0
  entry = (struct mips_got_entry *) *entryp;
4261
0
  arg = (struct mips_elf_traverse_got_arg *) data;
4262
0
  if (entry->abfd != NULL && entry->symndx == -1)
4263
0
    {
4264
0
      struct mips_elf_link_hash_entry *h;
4265
4266
0
      h = entry->d.h;
4267
0
      if (h->root.root.type == bfd_link_hash_indirect
4268
0
    || h->root.root.type == bfd_link_hash_warning)
4269
0
  {
4270
0
    arg->value = true;
4271
0
    return 0;
4272
0
  }
4273
0
    }
4274
0
  mips_elf_count_got_entry (arg->info, arg->g, entry);
4275
0
  return 1;
4276
0
}
4277
4278
/* A htab_traverse callback for GOT entries, with DATA pointing to a
4279
   mips_elf_traverse_got_arg structure.  Add all entries to DATA->g,
4280
   converting entries for indirect and warning symbols into entries
4281
   for the target symbol.  Set DATA->g to null on error.  */
4282
4283
static int
4284
mips_elf_recreate_got (void **entryp, void *data)
4285
0
{
4286
0
  struct mips_got_entry new_entry, *entry;
4287
0
  struct mips_elf_traverse_got_arg *arg;
4288
0
  void **slot;
4289
4290
0
  entry = (struct mips_got_entry *) *entryp;
4291
0
  arg = (struct mips_elf_traverse_got_arg *) data;
4292
0
  if (entry->abfd != NULL
4293
0
      && entry->symndx == -1
4294
0
      && (entry->d.h->root.root.type == bfd_link_hash_indirect
4295
0
    || entry->d.h->root.root.type == bfd_link_hash_warning))
4296
0
    {
4297
0
      struct mips_elf_link_hash_entry *h;
4298
4299
0
      new_entry = *entry;
4300
0
      entry = &new_entry;
4301
0
      h = entry->d.h;
4302
0
      do
4303
0
  {
4304
0
    BFD_ASSERT (h->global_got_area == GGA_NONE);
4305
0
    h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
4306
0
  }
4307
0
      while (h->root.root.type == bfd_link_hash_indirect
4308
0
       || h->root.root.type == bfd_link_hash_warning);
4309
0
      entry->d.h = h;
4310
0
    }
4311
0
  slot = htab_find_slot (arg->g->got_entries, entry, INSERT);
4312
0
  if (slot == NULL)
4313
0
    {
4314
0
      arg->g = NULL;
4315
0
      return 0;
4316
0
    }
4317
0
  if (*slot == NULL)
4318
0
    {
4319
0
      if (entry == &new_entry)
4320
0
  {
4321
0
    entry = bfd_alloc (entry->abfd, sizeof (*entry));
4322
0
    if (!entry)
4323
0
      {
4324
0
        arg->g = NULL;
4325
0
        return 0;
4326
0
      }
4327
0
    *entry = new_entry;
4328
0
  }
4329
0
      *slot = entry;
4330
0
      mips_elf_count_got_entry (arg->info, arg->g, entry);
4331
0
    }
4332
0
  return 1;
4333
0
}
4334
4335
/* Return the maximum number of GOT page entries required for RANGE.  */
4336
4337
static bfd_vma
4338
mips_elf_pages_for_range (const struct mips_got_page_range *range)
4339
0
{
4340
0
  return (range->max_addend - range->min_addend + 0x1ffff) >> 16;
4341
0
}
4342
4343
/* Record that G requires a page entry that can reach SEC + ADDEND.  */
4344
4345
static bool
4346
mips_elf_record_got_page_entry (struct mips_elf_traverse_got_arg *arg,
4347
        asection *sec, bfd_signed_vma addend)
4348
0
{
4349
0
  struct mips_got_info *g = arg->g;
4350
0
  struct mips_got_page_entry lookup, *entry;
4351
0
  struct mips_got_page_range **range_ptr, *range;
4352
0
  bfd_vma old_pages, new_pages;
4353
0
  void **loc;
4354
4355
  /* Find the mips_got_page_entry hash table entry for this section.  */
4356
0
  lookup.sec = sec;
4357
0
  loc = htab_find_slot (g->got_page_entries, &lookup, INSERT);
4358
0
  if (loc == NULL)
4359
0
    return false;
4360
4361
  /* Create a mips_got_page_entry if this is the first time we've
4362
     seen the section.  */
4363
0
  entry = (struct mips_got_page_entry *) *loc;
4364
0
  if (!entry)
4365
0
    {
4366
0
      entry = bfd_zalloc (arg->info->output_bfd, sizeof (*entry));
4367
0
      if (!entry)
4368
0
  return false;
4369
4370
0
      entry->sec = sec;
4371
0
      *loc = entry;
4372
0
    }
4373
4374
  /* Skip over ranges whose maximum extent cannot share a page entry
4375
     with ADDEND.  */
4376
0
  range_ptr = &entry->ranges;
4377
0
  while (*range_ptr && addend > (*range_ptr)->max_addend + 0xffff)
4378
0
    range_ptr = &(*range_ptr)->next;
4379
4380
  /* If we scanned to the end of the list, or found a range whose
4381
     minimum extent cannot share a page entry with ADDEND, create
4382
     a new singleton range.  */
4383
0
  range = *range_ptr;
4384
0
  if (!range || addend < range->min_addend - 0xffff)
4385
0
    {
4386
0
      range = bfd_zalloc (arg->info->output_bfd, sizeof (*range));
4387
0
      if (!range)
4388
0
  return false;
4389
4390
0
      range->next = *range_ptr;
4391
0
      range->min_addend = addend;
4392
0
      range->max_addend = addend;
4393
4394
0
      *range_ptr = range;
4395
0
      entry->num_pages++;
4396
0
      g->page_gotno++;
4397
0
      return true;
4398
0
    }
4399
4400
  /* Remember how many pages the old range contributed.  */
4401
0
  old_pages = mips_elf_pages_for_range (range);
4402
4403
  /* Update the ranges.  */
4404
0
  if (addend < range->min_addend)
4405
0
    range->min_addend = addend;
4406
0
  else if (addend > range->max_addend)
4407
0
    {
4408
0
      if (range->next && addend >= range->next->min_addend - 0xffff)
4409
0
  {
4410
0
    old_pages += mips_elf_pages_for_range (range->next);
4411
0
    range->max_addend = range->next->max_addend;
4412
0
    range->next = range->next->next;
4413
0
  }
4414
0
      else
4415
0
  range->max_addend = addend;
4416
0
    }
4417
4418
  /* Record any change in the total estimate.  */
4419
0
  new_pages = mips_elf_pages_for_range (range);
4420
0
  if (old_pages != new_pages)
4421
0
    {
4422
0
      entry->num_pages += new_pages - old_pages;
4423
0
      g->page_gotno += new_pages - old_pages;
4424
0
    }
4425
4426
0
  return true;
4427
0
}
4428
4429
/* A htab_traverse callback for which *REFP points to a mips_got_page_ref
4430
   and for which DATA points to a mips_elf_traverse_got_arg.  Work out
4431
   whether the page reference described by *REFP needs a GOT page entry,
4432
   and record that entry in DATA->g if so.  Set DATA->g to null on failure.  */
4433
4434
static int
4435
mips_elf_resolve_got_page_ref (void **refp, void *data)
4436
0
{
4437
0
  struct mips_got_page_ref *ref;
4438
0
  struct mips_elf_traverse_got_arg *arg;
4439
0
  struct mips_elf_link_hash_table *htab;
4440
0
  asection *sec;
4441
0
  bfd_vma addend;
4442
4443
0
  ref = (struct mips_got_page_ref *) *refp;
4444
0
  arg = (struct mips_elf_traverse_got_arg *) data;
4445
0
  htab = mips_elf_hash_table (arg->info);
4446
4447
0
  if (ref->symndx < 0)
4448
0
    {
4449
0
      struct mips_elf_link_hash_entry *h;
4450
4451
      /* Global GOT_PAGEs decay to GOT_DISP and so don't need page entries.  */
4452
0
      h = ref->u.h;
4453
0
      if (!SYMBOL_REFERENCES_LOCAL (arg->info, &h->root))
4454
0
  return 1;
4455
4456
      /* Ignore undefined symbols; we'll issue an error later if
4457
   appropriate.  */
4458
0
      if (!((h->root.root.type == bfd_link_hash_defined
4459
0
       || h->root.root.type == bfd_link_hash_defweak)
4460
0
      && h->root.root.u.def.section))
4461
0
  return 1;
4462
4463
0
      sec = h->root.root.u.def.section;
4464
0
      addend = h->root.root.u.def.value + ref->addend;
4465
0
    }
4466
0
  else
4467
0
    {
4468
0
      Elf_Internal_Sym *isym;
4469
4470
      /* Read in the symbol.  */
4471
0
      isym = bfd_sym_from_r_symndx (&htab->root.sym_cache, ref->u.abfd,
4472
0
            ref->symndx);
4473
0
      if (isym == NULL)
4474
0
  {
4475
0
    arg->g = NULL;
4476
0
    return 0;
4477
0
  }
4478
4479
      /* Get the associated input section.  */
4480
0
      sec = bfd_section_from_elf_index (ref->u.abfd, isym->st_shndx);
4481
0
      if (sec == NULL)
4482
0
  {
4483
0
    arg->g = NULL;
4484
0
    return 0;
4485
0
  }
4486
4487
      /* If this is a mergable section, work out the section and offset
4488
   of the merged data.  For section symbols, the addend specifies
4489
   of the offset _of_ the first byte in the data, otherwise it
4490
   specifies the offset _from_ the first byte.  */
4491
0
      if (sec->flags & SEC_MERGE)
4492
0
  {
4493
0
    void *secinfo;
4494
4495
0
    secinfo = elf_section_data (sec)->sec_info;
4496
0
    if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
4497
0
      addend = _bfd_merged_section_offset (ref->u.abfd, &sec, secinfo,
4498
0
             isym->st_value + ref->addend);
4499
0
    else
4500
0
      addend = _bfd_merged_section_offset (ref->u.abfd, &sec, secinfo,
4501
0
             isym->st_value) + ref->addend;
4502
0
  }
4503
0
      else
4504
0
  addend = isym->st_value + ref->addend;
4505
0
    }
4506
0
  if (!mips_elf_record_got_page_entry (arg, sec, addend))
4507
0
    {
4508
0
      arg->g = NULL;
4509
0
      return 0;
4510
0
    }
4511
0
  return 1;
4512
0
}
4513
4514
/* If any entries in G->got_entries are for indirect or warning symbols,
4515
   replace them with entries for the target symbol.  Convert g->got_page_refs
4516
   into got_page_entry structures and estimate the number of page entries
4517
   that they require.  */
4518
4519
static bool
4520
mips_elf_resolve_final_got_entries (struct bfd_link_info *info,
4521
            struct mips_got_info *g)
4522
0
{
4523
0
  struct mips_elf_traverse_got_arg tga;
4524
0
  struct mips_got_info oldg;
4525
4526
0
  oldg = *g;
4527
4528
0
  tga.info = info;
4529
0
  tga.g = g;
4530
0
  tga.value = false;
4531
0
  htab_traverse (g->got_entries, mips_elf_check_recreate_got, &tga);
4532
0
  if (tga.value)
4533
0
    {
4534
0
      *g = oldg;
4535
0
      g->got_entries = htab_create (htab_size (oldg.got_entries),
4536
0
            mips_elf_got_entry_hash,
4537
0
            mips_elf_got_entry_eq, NULL);
4538
0
      if (!g->got_entries)
4539
0
  return false;
4540
4541
0
      htab_traverse (oldg.got_entries, mips_elf_recreate_got, &tga);
4542
0
      if (!tga.g)
4543
0
  return false;
4544
4545
0
      htab_delete (oldg.got_entries);
4546
0
    }
4547
4548
0
  g->got_page_entries = htab_try_create (1, mips_got_page_entry_hash,
4549
0
           mips_got_page_entry_eq, NULL);
4550
0
  if (g->got_page_entries == NULL)
4551
0
    return false;
4552
4553
0
  tga.info = info;
4554
0
  tga.g = g;
4555
0
  htab_traverse (g->got_page_refs, mips_elf_resolve_got_page_ref, &tga);
4556
4557
0
  return true;
4558
0
}
4559
4560
/* Return true if a GOT entry for H should live in the local rather than
4561
   global GOT area.  */
4562
4563
static bool
4564
mips_use_local_got_p (struct bfd_link_info *info,
4565
          struct mips_elf_link_hash_entry *h)
4566
0
{
4567
  /* Symbols that aren't in the dynamic symbol table must live in the
4568
     local GOT.  This includes symbols that are completely undefined
4569
     and which therefore don't bind locally.  We'll report undefined
4570
     symbols later if appropriate.  */
4571
0
  if (h->root.dynindx == -1)
4572
0
    return true;
4573
4574
  /* Absolute symbols, if ever they need a GOT entry, cannot ever go
4575
     to the local GOT, as they would be implicitly relocated by the
4576
     base address by the dynamic loader.  */
4577
0
  if (bfd_is_abs_symbol (&h->root.root))
4578
0
    return false;
4579
4580
  /* Symbols that bind locally can (and in the case of forced-local
4581
     symbols, must) live in the local GOT.  */
4582
0
  if (h->got_only_for_calls
4583
0
      ? SYMBOL_CALLS_LOCAL (info, &h->root)
4584
0
      : SYMBOL_REFERENCES_LOCAL (info, &h->root))
4585
0
    return true;
4586
4587
  /* If this is an executable that must provide a definition of the symbol,
4588
     either though PLTs or copy relocations, then that address should go in
4589
     the local rather than global GOT.  */
4590
0
  if (bfd_link_executable (info) && h->has_static_relocs)
4591
0
    return true;
4592
4593
0
  return false;
4594
0
}
4595
4596
/* A mips_elf_link_hash_traverse callback for which DATA points to the
4597
   link_info structure.  Decide whether the hash entry needs an entry in
4598
   the global part of the primary GOT, setting global_got_area accordingly.
4599
   Count the number of global symbols that are in the primary GOT only
4600
   because they have relocations against them (reloc_only_gotno).  */
4601
4602
static bool
4603
mips_elf_count_got_symbols (struct mips_elf_link_hash_entry *h, void *data)
4604
0
{
4605
0
  struct bfd_link_info *info;
4606
0
  struct mips_elf_link_hash_table *htab;
4607
0
  struct mips_got_info *g;
4608
4609
0
  info = (struct bfd_link_info *) data;
4610
0
  htab = mips_elf_hash_table (info);
4611
0
  g = htab->got_info;
4612
0
  if (h->global_got_area != GGA_NONE)
4613
0
    {
4614
      /* Make a final decision about whether the symbol belongs in the
4615
   local or global GOT.  */
4616
0
      if (mips_use_local_got_p (info, h))
4617
  /* The symbol belongs in the local GOT.  We no longer need this
4618
     entry if it was only used for relocations; those relocations
4619
     will be against the null or section symbol instead of H.  */
4620
0
  h->global_got_area = GGA_NONE;
4621
0
      else if (htab->root.target_os == is_vxworks
4622
0
         && h->got_only_for_calls
4623
0
         && h->root.plt.plist->mips_offset != MINUS_ONE)
4624
  /* On VxWorks, calls can refer directly to the .got.plt entry;
4625
     they don't need entries in the regular GOT.  .got.plt entries
4626
     will be allocated by _bfd_mips_elf_adjust_dynamic_symbol.  */
4627
0
  h->global_got_area = GGA_NONE;
4628
0
      else if (h->global_got_area == GGA_RELOC_ONLY)
4629
0
  {
4630
0
    g->reloc_only_gotno++;
4631
0
    g->global_gotno++;
4632
0
  }
4633
0
    }
4634
0
  return 1;
4635
0
}
4636

4637
/* A htab_traverse callback for GOT entries.  Add each one to the GOT
4638
   given in mips_elf_traverse_got_arg DATA.  Clear DATA->G on error.  */
4639
4640
static int
4641
mips_elf_add_got_entry (void **entryp, void *data)
4642
0
{
4643
0
  struct mips_got_entry *entry;
4644
0
  struct mips_elf_traverse_got_arg *arg;
4645
0
  void **slot;
4646
4647
0
  entry = (struct mips_got_entry *) *entryp;
4648
0
  arg = (struct mips_elf_traverse_got_arg *) data;
4649
0
  slot = htab_find_slot (arg->g->got_entries, entry, INSERT);
4650
0
  if (!slot)
4651
0
    {
4652
0
      arg->g = NULL;
4653
0
      return 0;
4654
0
    }
4655
0
  if (!*slot)
4656
0
    {
4657
0
      *slot = entry;
4658
0
      mips_elf_count_got_entry (arg->info, arg->g, entry);
4659
0
    }
4660
0
  return 1;
4661
0
}
4662
4663
/* A htab_traverse callback for GOT page entries.  Add each one to the GOT
4664
   given in mips_elf_traverse_got_arg DATA.  Clear DATA->G on error.  */
4665
4666
static int
4667
mips_elf_add_got_page_entry (void **entryp, void *data)
4668
0
{
4669
0
  struct mips_got_page_entry *entry;
4670
0
  struct mips_elf_traverse_got_arg *arg;
4671
0
  void **slot;
4672
4673
0
  entry = (struct mips_got_page_entry *) *entryp;
4674
0
  arg = (struct mips_elf_traverse_got_arg *) data;
4675
0
  slot = htab_find_slot (arg->g->got_page_entries, entry, INSERT);
4676
0
  if (!slot)
4677
0
    {
4678
0
      arg->g = NULL;
4679
0
      return 0;
4680
0
    }
4681
0
  if (!*slot)
4682
0
    {
4683
0
      *slot = entry;
4684
0
      arg->g->page_gotno += entry->num_pages;
4685
0
    }
4686
0
  return 1;
4687
0
}
4688
4689
/* Consider merging FROM, which is ABFD's GOT, into TO.  Return -1 if
4690
   this would lead to overflow, 1 if they were merged successfully,
4691
   and 0 if a merge failed due to lack of memory.  (These values are chosen
4692
   so that nonnegative return values can be returned by a htab_traverse
4693
   callback.)  */
4694
4695
static int
4696
mips_elf_merge_got_with (bfd *abfd, struct mips_got_info *from,
4697
       struct mips_got_info *to,
4698
       struct mips_elf_got_per_bfd_arg *arg)
4699
0
{
4700
0
  struct mips_elf_traverse_got_arg tga;
4701
0
  unsigned int estimate;
4702
4703
  /* Work out how many page entries we would need for the combined GOT.  */
4704
0
  estimate = arg->max_pages;
4705
0
  if (estimate >= from->page_gotno + to->page_gotno)
4706
0
    estimate = from->page_gotno + to->page_gotno;
4707
4708
  /* And conservatively estimate how many local and TLS entries
4709
     would be needed.  */
4710
0
  estimate += from->local_gotno + to->local_gotno;
4711
0
  estimate += from->tls_gotno + to->tls_gotno;
4712
4713
  /* If we're merging with the primary got, any TLS relocations will
4714
     come after the full set of global entries.  Otherwise estimate those
4715
     conservatively as well.  */
4716
0
  if (to == arg->primary && from->tls_gotno + to->tls_gotno)
4717
0
    estimate += arg->global_count;
4718
0
  else
4719
0
    estimate += from->global_gotno + to->global_gotno;
4720
4721
  /* Bail out if the combined GOT might be too big.  */
4722
0
  if (estimate > arg->max_count)
4723
0
    return -1;
4724
4725
  /* Transfer the bfd's got information from FROM to TO.  */
4726
0
  tga.info = arg->info;
4727
0
  tga.g = to;
4728
0
  htab_traverse (from->got_entries, mips_elf_add_got_entry, &tga);
4729
0
  if (!tga.g)
4730
0
    return 0;
4731
4732
0
  htab_traverse (from->got_page_entries, mips_elf_add_got_page_entry, &tga);
4733
0
  if (!tga.g)
4734
0
    return 0;
4735
4736
0
  mips_elf_replace_bfd_got (abfd, to);
4737
0
  return 1;
4738
0
}
4739
4740
/* Attempt to merge GOT G, which belongs to ABFD.  Try to use as much
4741
   as possible of the primary got, since it doesn't require explicit
4742
   dynamic relocations, but don't use bfds that would reference global
4743
   symbols out of the addressable range.  Failing the primary got,
4744
   attempt to merge with the current got, or finish the current got
4745
   and then make make the new got current.  */
4746
4747
static bool
4748
mips_elf_merge_got (bfd *abfd, struct mips_got_info *g,
4749
        struct mips_elf_got_per_bfd_arg *arg)
4750
0
{
4751
0
  unsigned int estimate;
4752
0
  int result;
4753
4754
0
  if (!mips_elf_resolve_final_got_entries (arg->info, g))
4755
0
    return false;
4756
4757
  /* Work out the number of page, local and TLS entries.  */
4758
0
  estimate = arg->max_pages;
4759
0
  if (estimate > g->page_gotno)
4760
0
    estimate = g->page_gotno;
4761
0
  estimate += g->local_gotno + g->tls_gotno;
4762
4763
  /* We place TLS GOT entries after both locals and globals.  The globals
4764
     for the primary GOT may overflow the normal GOT size limit, so be
4765
     sure not to merge a GOT which requires TLS with the primary GOT in that
4766
     case.  This doesn't affect non-primary GOTs.  */
4767
0
  estimate += (g->tls_gotno > 0 ? arg->global_count : g->global_gotno);
4768
4769
0
  if (estimate <= arg->max_count)
4770
0
    {
4771
      /* If we don't have a primary GOT, use it as
4772
   a starting point for the primary GOT.  */
4773
0
      if (!arg->primary)
4774
0
  {
4775
0
    arg->primary = g;
4776
0
    return true;
4777
0
  }
4778
4779
      /* Try merging with the primary GOT.  */
4780
0
      result = mips_elf_merge_got_with (abfd, g, arg->primary, arg);
4781
0
      if (result >= 0)
4782
0
  return result;
4783
0
    }
4784
4785
  /* If we can merge with the last-created got, do it.  */
4786
0
  if (arg->current)
4787
0
    {
4788
0
      result = mips_elf_merge_got_with (abfd, g, arg->current, arg);
4789
0
      if (result >= 0)
4790
0
  return result;
4791
0
    }
4792
4793
  /* Well, we couldn't merge, so create a new GOT.  Don't check if it
4794
     fits; if it turns out that it doesn't, we'll get relocation
4795
     overflows anyway.  */
4796
0
  g->next = arg->current;
4797
0
  arg->current = g;
4798
4799
0
  return true;
4800
0
}
4801
4802
/* ENTRYP is a hash table entry for a mips_got_entry.  Set its gotidx
4803
   to GOTIDX, duplicating the entry if it has already been assigned
4804
   an index in a different GOT.  */
4805
4806
static bool
4807
mips_elf_set_gotidx (void **entryp, long gotidx)
4808
0
{
4809
0
  struct mips_got_entry *entry;
4810
4811
0
  entry = (struct mips_got_entry *) *entryp;
4812
0
  if (entry->gotidx > 0)
4813
0
    {
4814
0
      struct mips_got_entry *new_entry;
4815
4816
0
      new_entry = bfd_alloc (entry->abfd, sizeof (*entry));
4817
0
      if (!new_entry)
4818
0
  return false;
4819
4820
0
      *new_entry = *entry;
4821
0
      *entryp = new_entry;
4822
0
      entry = new_entry;
4823
0
    }
4824
0
  entry->gotidx = gotidx;
4825
0
  return true;
4826
0
}
4827
4828
/* Set the TLS GOT index for the GOT entry in ENTRYP.  DATA points to a
4829
   mips_elf_traverse_got_arg in which DATA->value is the size of one
4830
   GOT entry.  Set DATA->g to null on failure.  */
4831
4832
static int
4833
mips_elf_initialize_tls_index (void **entryp, void *data)
4834
0
{
4835
0
  struct mips_got_entry *entry;
4836
0
  struct mips_elf_traverse_got_arg *arg;
4837
4838
  /* We're only interested in TLS symbols.  */
4839
0
  entry = (struct mips_got_entry *) *entryp;
4840
0
  if (entry->tls_type == GOT_TLS_NONE)
4841
0
    return 1;
4842
4843
0
  arg = (struct mips_elf_traverse_got_arg *) data;
4844
0
  if (!mips_elf_set_gotidx (entryp, arg->value * arg->g->tls_assigned_gotno))
4845
0
    {
4846
0
      arg->g = NULL;
4847
0
      return 0;
4848
0
    }
4849
4850
  /* Account for the entries we've just allocated.  */
4851
0
  arg->g->tls_assigned_gotno += mips_tls_got_entries (entry->tls_type);
4852
0
  return 1;
4853
0
}
4854
4855
/* A htab_traverse callback for GOT entries, where DATA points to a
4856
   mips_elf_traverse_got_arg.  Set the global_got_area of each global
4857
   symbol to DATA->value.  */
4858
4859
static int
4860
mips_elf_set_global_got_area (void **entryp, void *data)
4861
0
{
4862
0
  struct mips_got_entry *entry;
4863
0
  struct mips_elf_traverse_got_arg *arg;
4864
4865
0
  entry = (struct mips_got_entry *) *entryp;
4866
0
  arg = (struct mips_elf_traverse_got_arg *) data;
4867
0
  if (entry->abfd != NULL
4868
0
      && entry->symndx == -1
4869
0
      && entry->d.h->global_got_area != GGA_NONE)
4870
0
    entry->d.h->global_got_area = arg->value;
4871
0
  return 1;
4872
0
}
4873
4874
/* A htab_traverse callback for secondary GOT entries, where DATA points
4875
   to a mips_elf_traverse_got_arg.  Assign GOT indices to global entries
4876
   and record the number of relocations they require.  DATA->value is
4877
   the size of one GOT entry.  Set DATA->g to null on failure.  */
4878
4879
static int
4880
mips_elf_set_global_gotidx (void **entryp, void *data)
4881
0
{
4882
0
  struct mips_got_entry *entry;
4883
0
  struct mips_elf_traverse_got_arg *arg;
4884
4885
0
  entry = (struct mips_got_entry *) *entryp;
4886
0
  arg = (struct mips_elf_traverse_got_arg *) data;
4887
0
  if (entry->abfd != NULL
4888
0
      && entry->symndx == -1
4889
0
      && entry->d.h->global_got_area != GGA_NONE)
4890
0
    {
4891
0
      if (!mips_elf_set_gotidx (entryp, arg->value * arg->g->assigned_low_gotno))
4892
0
  {
4893
0
    arg->g = NULL;
4894
0
    return 0;
4895
0
  }
4896
0
      arg->g->assigned_low_gotno += 1;
4897
4898
0
      if (bfd_link_pic (arg->info)
4899
0
    || (elf_hash_table (arg->info)->dynamic_sections_created
4900
0
        && entry->d.h->root.def_dynamic
4901
0
        && !entry->d.h->root.def_regular))
4902
0
  arg->g->relocs += 1;
4903
0
    }
4904
4905
0
  return 1;
4906
0
}
4907
4908
/* A htab_traverse callback for GOT entries for which DATA is the
4909
   bfd_link_info.  Forbid any global symbols from having traditional
4910
   lazy-binding stubs.  */
4911
4912
static int
4913
mips_elf_forbid_lazy_stubs (void **entryp, void *data)
4914
0
{
4915
0
  struct bfd_link_info *info;
4916
0
  struct mips_elf_link_hash_table *htab;
4917
0
  struct mips_got_entry *entry;
4918
4919
0
  entry = (struct mips_got_entry *) *entryp;
4920
0
  info = (struct bfd_link_info *) data;
4921
0
  htab = mips_elf_hash_table (info);
4922
0
  BFD_ASSERT (htab != NULL);
4923
4924
0
  if (entry->abfd != NULL
4925
0
      && entry->symndx == -1
4926
0
      && entry->d.h->needs_lazy_stub)
4927
0
    {
4928
0
      entry->d.h->needs_lazy_stub = false;
4929
0
      htab->lazy_stub_count--;
4930
0
    }
4931
4932
0
  return 1;
4933
0
}
4934
4935
/* Return the offset of an input bfd IBFD's GOT from the beginning of
4936
   the primary GOT.  */
4937
static bfd_vma
4938
mips_elf_adjust_gp (bfd *abfd, struct mips_got_info *g, bfd *ibfd)
4939
0
{
4940
0
  if (!g->next)
4941
0
    return 0;
4942
4943
0
  g = mips_elf_bfd_got (ibfd, false);
4944
0
  if (! g)
4945
0
    return 0;
4946
4947
0
  BFD_ASSERT (g->next);
4948
4949
0
  g = g->next;
4950
4951
0
  return (g->local_gotno + g->global_gotno + g->tls_gotno)
4952
0
    * MIPS_ELF_GOT_SIZE (abfd);
4953
0
}
4954
4955
/* Turn a single GOT that is too big for 16-bit addressing into
4956
   a sequence of GOTs, each one 16-bit addressable.  */
4957
4958
static bool
4959
mips_elf_multi_got (bfd *abfd, struct bfd_link_info *info,
4960
        asection *got, bfd_size_type pages)
4961
0
{
4962
0
  struct mips_elf_link_hash_table *htab;
4963
0
  struct mips_elf_got_per_bfd_arg got_per_bfd_arg;
4964
0
  struct mips_elf_traverse_got_arg tga;
4965
0
  struct mips_got_info *g, *gg;
4966
0
  unsigned int assign, needed_relocs;
4967
0
  bfd *dynobj, *ibfd;
4968
4969
0
  dynobj = elf_hash_table (info)->dynobj;
4970
0
  htab = mips_elf_hash_table (info);
4971
0
  BFD_ASSERT (htab != NULL);
4972
4973
0
  g = htab->got_info;
4974
4975
0
  got_per_bfd_arg.obfd = abfd;
4976
0
  got_per_bfd_arg.info = info;
4977
0
  got_per_bfd_arg.current = NULL;
4978
0
  got_per_bfd_arg.primary = NULL;
4979
0
  got_per_bfd_arg.max_count = ((MIPS_ELF_GOT_MAX_SIZE (info)
4980
0
        / MIPS_ELF_GOT_SIZE (abfd))
4981
0
             - htab->reserved_gotno);
4982
0
  got_per_bfd_arg.max_pages = pages;
4983
  /* The number of globals that will be included in the primary GOT.
4984
     See the calls to mips_elf_set_global_got_area below for more
4985
     information.  */
4986
0
  got_per_bfd_arg.global_count = g->global_gotno;
4987
4988
  /* Try to merge the GOTs of input bfds together, as long as they
4989
     don't seem to exceed the maximum GOT size, choosing one of them
4990
     to be the primary GOT.  */
4991
0
  for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
4992
0
    {
4993
0
      gg = mips_elf_bfd_got (ibfd, false);
4994
0
      if (gg && !mips_elf_merge_got (ibfd, gg, &got_per_bfd_arg))
4995
0
  return false;
4996
0
    }
4997
4998
  /* If we do not find any suitable primary GOT, create an empty one.  */
4999
0
  if (got_per_bfd_arg.primary == NULL)
5000
0
    g->next = mips_elf_create_got_info (abfd);
5001
0
  else
5002
0
    g->next = got_per_bfd_arg.primary;
5003
0
  g->next->next = got_per_bfd_arg.current;
5004
5005
  /* GG is now the master GOT, and G is the primary GOT.  */
5006
0
  gg = g;
5007
0
  g = g->next;
5008
5009
  /* Map the output bfd to the primary got.  That's what we're going
5010
     to use for bfds that use GOT16 or GOT_PAGE relocations that we
5011
     didn't mark in check_relocs, and we want a quick way to find it.
5012
     We can't just use gg->next because we're going to reverse the
5013
     list.  */
5014
0
  mips_elf_replace_bfd_got (abfd, g);
5015
5016
  /* Every symbol that is referenced in a dynamic relocation must be
5017
     present in the primary GOT, so arrange for them to appear after
5018
     those that are actually referenced.  */
5019
0
  gg->reloc_only_gotno = gg->global_gotno - g->global_gotno;
5020
0
  g->global_gotno = gg->global_gotno;
5021
5022
0
  tga.info = info;
5023
0
  tga.value = GGA_RELOC_ONLY;
5024
0
  htab_traverse (gg->got_entries, mips_elf_set_global_got_area, &tga);
5025
0
  tga.value = GGA_NORMAL;
5026
0
  htab_traverse (g->got_entries, mips_elf_set_global_got_area, &tga);
5027
5028
  /* Now go through the GOTs assigning them offset ranges.
5029
     [assigned_low_gotno, local_gotno[ will be set to the range of local
5030
     entries in each GOT.  We can then compute the end of a GOT by
5031
     adding local_gotno to global_gotno.  We reverse the list and make
5032
     it circular since then we'll be able to quickly compute the
5033
     beginning of a GOT, by computing the end of its predecessor.  To
5034
     avoid special cases for the primary GOT, while still preserving
5035
     assertions that are valid for both single- and multi-got links,
5036
     we arrange for the main got struct to have the right number of
5037
     global entries, but set its local_gotno such that the initial
5038
     offset of the primary GOT is zero.  Remember that the primary GOT
5039
     will become the last item in the circular linked list, so it
5040
     points back to the master GOT.  */
5041
0
  gg->local_gotno = -g->global_gotno;
5042
0
  gg->global_gotno = g->global_gotno;
5043
0
  gg->tls_gotno = 0;
5044
0
  assign = 0;
5045
0
  gg->next = gg;
5046
5047
0
  do
5048
0
    {
5049
0
      struct mips_got_info *gn;
5050
5051
0
      assign += htab->reserved_gotno;
5052
0
      g->assigned_low_gotno = assign;
5053
0
      g->local_gotno += assign;
5054
0
      g->local_gotno += (pages < g->page_gotno ? pages : g->page_gotno);
5055
0
      g->assigned_high_gotno = g->local_gotno - 1;
5056
0
      assign = g->local_gotno + g->global_gotno + g->tls_gotno;
5057
5058
      /* Take g out of the direct list, and push it onto the reversed
5059
   list that gg points to.  g->next is guaranteed to be nonnull after
5060
   this operation, as required by mips_elf_initialize_tls_index. */
5061
0
      gn = g->next;
5062
0
      g->next = gg->next;
5063
0
      gg->next = g;
5064
5065
      /* Set up any TLS entries.  We always place the TLS entries after
5066
   all non-TLS entries.  */
5067
0
      g->tls_assigned_gotno = g->local_gotno + g->global_gotno;
5068
0
      tga.g = g;
5069
0
      tga.value = MIPS_ELF_GOT_SIZE (abfd);
5070
0
      htab_traverse (g->got_entries, mips_elf_initialize_tls_index, &tga);
5071
0
      if (!tga.g)
5072
0
  return false;
5073
0
      BFD_ASSERT (g->tls_assigned_gotno == assign);
5074
5075
      /* Move onto the next GOT.  It will be a secondary GOT if nonull.  */
5076
0
      g = gn;
5077
5078
      /* Forbid global symbols in every non-primary GOT from having
5079
   lazy-binding stubs.  */
5080
0
      if (g)
5081
0
  htab_traverse (g->got_entries, mips_elf_forbid_lazy_stubs, info);
5082
0
    }
5083
0
  while (g);
5084
5085
0
  got->size = assign * MIPS_ELF_GOT_SIZE (abfd);
5086
5087
0
  needed_relocs = 0;
5088
0
  for (g = gg->next; g && g->next != gg; g = g->next)
5089
0
    {
5090
0
      unsigned int save_assign;
5091
5092
      /* Assign offsets to global GOT entries and count how many
5093
   relocations they need.  */
5094
0
      save_assign = g->assigned_low_gotno;
5095
0
      g->assigned_low_gotno = g->local_gotno;
5096
0
      tga.info = info;
5097
0
      tga.value = MIPS_ELF_GOT_SIZE (abfd);
5098
0
      tga.g = g;
5099
0
      htab_traverse (g->got_entries, mips_elf_set_global_gotidx, &tga);
5100
0
      if (!tga.g)
5101
0
  return false;
5102
0
      BFD_ASSERT (g->assigned_low_gotno == g->local_gotno + g->global_gotno);
5103
0
      g->assigned_low_gotno = save_assign;
5104
5105
0
      if (bfd_link_pic (info))
5106
0
  {
5107
0
    g->relocs += g->local_gotno - g->assigned_low_gotno;
5108
0
    BFD_ASSERT (g->assigned_low_gotno == g->next->local_gotno
5109
0
          + g->next->global_gotno
5110
0
          + g->next->tls_gotno
5111
0
          + htab->reserved_gotno);
5112
0
  }
5113
0
      needed_relocs += g->relocs;
5114
0
    }
5115
0
  needed_relocs += g->relocs;
5116
5117
0
  if (needed_relocs)
5118
0
    mips_elf_allocate_dynamic_relocations (dynobj, info,
5119
0
             needed_relocs);
5120
5121
0
  return true;
5122
0
}
5123
5124

5125
/* Returns the first relocation of type r_type found, beginning with
5126
   RELOCATION.  RELEND is one-past-the-end of the relocation table.  */
5127
5128
static const Elf_Internal_Rela *
5129
mips_elf_next_relocation (bfd *abfd ATTRIBUTE_UNUSED, unsigned int r_type,
5130
        const Elf_Internal_Rela *relocation,
5131
        const Elf_Internal_Rela *relend)
5132
0
{
5133
0
  unsigned long r_symndx = ELF_R_SYM (abfd, relocation->r_info);
5134
5135
0
  while (relocation < relend)
5136
0
    {
5137
0
      if (ELF_R_TYPE (abfd, relocation->r_info) == r_type
5138
0
    && ELF_R_SYM (abfd, relocation->r_info) == r_symndx)
5139
0
  return relocation;
5140
5141
0
      ++relocation;
5142
0
    }
5143
5144
  /* We didn't find it.  */
5145
0
  return NULL;
5146
0
}
5147
5148
/* Return whether an input relocation is against a local symbol.  */
5149
5150
static bool
5151
mips_elf_local_relocation_p (bfd *input_bfd,
5152
           const Elf_Internal_Rela *relocation,
5153
           asection **local_sections)
5154
0
{
5155
0
  unsigned long r_symndx;
5156
0
  Elf_Internal_Shdr *symtab_hdr;
5157
0
  size_t extsymoff;
5158
5159
0
  r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
5160
0
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5161
0
  extsymoff = (elf_bad_symtab (input_bfd)) ? 0 : symtab_hdr->sh_info;
5162
5163
0
  if (r_symndx < extsymoff)
5164
0
    return true;
5165
0
  if (elf_bad_symtab (input_bfd) && local_sections[r_symndx] != NULL)
5166
0
    return true;
5167
5168
0
  return false;
5169
0
}
5170

5171
/* Sign-extend VALUE, which has the indicated number of BITS.  */
5172
5173
bfd_vma
5174
_bfd_mips_elf_sign_extend (bfd_vma value, int bits)
5175
52
{
5176
52
  if (value & ((bfd_vma) 1 << (bits - 1)))
5177
    /* VALUE is negative.  */
5178
19
    value |= ((bfd_vma) - 1) << bits;
5179
5180
52
  return value;
5181
52
}
5182
5183
/* Return non-zero if the indicated VALUE has overflowed the maximum
5184
   range expressible by a signed number with the indicated number of
5185
   BITS.  */
5186
5187
static bool
5188
mips_elf_overflow_p (bfd_vma value, int bits)
5189
0
{
5190
0
  bfd_signed_vma svalue = (bfd_signed_vma) value;
5191
5192
0
  if (svalue > (1 << (bits - 1)) - 1)
5193
    /* The value is too big.  */
5194
0
    return true;
5195
0
  else if (svalue < -(1 << (bits - 1)))
5196
    /* The value is too small.  */
5197
0
    return true;
5198
5199
  /* All is well.  */
5200
0
  return false;
5201
0
}
5202
5203
/* Calculate the %high function.  */
5204
5205
static bfd_vma
5206
mips_elf_high (bfd_vma value)
5207
0
{
5208
0
  return ((value + (bfd_vma) 0x8000) >> 16) & 0xffff;
5209
0
}
5210
5211
/* Calculate the %higher function.  */
5212
5213
static bfd_vma
5214
mips_elf_higher (bfd_vma value ATTRIBUTE_UNUSED)
5215
0
{
5216
0
#ifdef BFD64
5217
0
  return ((value + (bfd_vma) 0x80008000) >> 32) & 0xffff;
5218
#else
5219
  abort ();
5220
  return MINUS_ONE;
5221
#endif
5222
0
}
5223
5224
/* Calculate the %highest function.  */
5225
5226
static bfd_vma
5227
mips_elf_highest (bfd_vma value ATTRIBUTE_UNUSED)
5228
0
{
5229
0
#ifdef BFD64
5230
0
  return ((value + (((bfd_vma) 0x8000 << 32) | 0x80008000)) >> 48) & 0xffff;
5231
#else
5232
  abort ();
5233
  return MINUS_ONE;
5234
#endif
5235
0
}
5236

5237
/* Create the .compact_rel section.  */
5238
5239
static bool
5240
mips_elf_create_compact_rel_section
5241
  (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
5242
0
{
5243
0
  flagword flags;
5244
0
  register asection *s;
5245
5246
0
  if (bfd_get_linker_section (abfd, ".compact_rel") == NULL)
5247
0
    {
5248
0
      flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED
5249
0
         | SEC_READONLY);
5250
5251
0
      s = bfd_make_section_anyway_with_flags (abfd, ".compact_rel", flags);
5252
0
      if (s == NULL
5253
0
    || !bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd)))
5254
0
  return false;
5255
5256
0
      s->size = sizeof (Elf32_External_compact_rel);
5257
0
    }
5258
5259
0
  return true;
5260
0
}
5261
5262
/* Create the .got section to hold the global offset table.  */
5263
5264
static bool
5265
mips_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
5266
0
{
5267
0
  flagword flags;
5268
0
  register asection *s;
5269
0
  struct elf_link_hash_entry *h;
5270
0
  struct bfd_link_hash_entry *bh;
5271
0
  struct mips_elf_link_hash_table *htab;
5272
5273
0
  htab = mips_elf_hash_table (info);
5274
0
  BFD_ASSERT (htab != NULL);
5275
5276
  /* This function may be called more than once.  */
5277
0
  if (htab->root.sgot)
5278
0
    return true;
5279
5280
0
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
5281
0
     | SEC_LINKER_CREATED);
5282
5283
  /* We have to use an alignment of 2**4 here because this is hardcoded
5284
     in the function stub generation and in the linker script.  */
5285
0
  s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
5286
0
  if (s == NULL
5287
0
      || !bfd_set_section_alignment (s, 4))
5288
0
    return false;
5289
0
  htab->root.sgot = s;
5290
5291
  /* Define the symbol _GLOBAL_OFFSET_TABLE_.  We don't do this in the
5292
     linker script because we don't want to define the symbol if we
5293
     are not creating a global offset table.  */
5294
0
  bh = NULL;
5295
0
  if (! (_bfd_generic_link_add_one_symbol
5296
0
   (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
5297
0
    0, NULL, false, get_elf_backend_data (abfd)->collect, &bh)))
5298
0
    return false;
5299
5300
0
  h = (struct elf_link_hash_entry *) bh;
5301
0
  h->non_elf = 0;
5302
0
  h->def_regular = 1;
5303
0
  h->type = STT_OBJECT;
5304
0
  h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
5305
0
  elf_hash_table (info)->hgot = h;
5306
5307
0
  if (bfd_link_pic (info)
5308
0
      && ! bfd_elf_link_record_dynamic_symbol (info, h))
5309
0
    return false;
5310
5311
0
  htab->got_info = mips_elf_create_got_info (abfd);
5312
0
  mips_elf_section_data (s)->elf.this_hdr.sh_flags
5313
0
    |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
5314
5315
  /* We also need a .got.plt section when generating PLTs.  */
5316
0
  s = bfd_make_section_anyway_with_flags (abfd, ".got.plt",
5317
0
            SEC_ALLOC | SEC_LOAD
5318
0
            | SEC_HAS_CONTENTS
5319
0
            | SEC_IN_MEMORY
5320
0
            | SEC_LINKER_CREATED);
5321
0
  if (s == NULL)
5322
0
    return false;
5323
0
  htab->root.sgotplt = s;
5324
5325
0
  return true;
5326
0
}
5327

5328
/* Return true if H refers to the special VxWorks __GOTT_BASE__ or
5329
   __GOTT_INDEX__ symbols.  These symbols are only special for
5330
   shared objects; they are not used in executables.  */
5331
5332
static bool
5333
is_gott_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h)
5334
0
{
5335
0
  return (mips_elf_hash_table (info)->root.target_os == is_vxworks
5336
0
    && bfd_link_pic (info)
5337
0
    && (strcmp (h->root.root.string, "__GOTT_BASE__") == 0
5338
0
        || strcmp (h->root.root.string, "__GOTT_INDEX__") == 0));
5339
0
}
5340
5341
/* Return TRUE if a relocation of type R_TYPE from INPUT_BFD might
5342
   require an la25 stub.  See also mips_elf_local_pic_function_p,
5343
   which determines whether the destination function ever requires a
5344
   stub.  */
5345
5346
static bool
5347
mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type,
5348
             bool target_is_16_bit_code_p)
5349
0
{
5350
  /* We specifically ignore branches and jumps from EF_PIC objects,
5351
     where the onus is on the compiler or programmer to perform any
5352
     necessary initialization of $25.  Sometimes such initialization
5353
     is unnecessary; for example, -mno-shared functions do not use
5354
     the incoming value of $25, and may therefore be called directly.  */
5355
0
  if (PIC_OBJECT_P (input_bfd))
5356
0
    return false;
5357
5358
0
  switch (r_type)
5359
0
    {
5360
0
    case R_MIPS_26:
5361
0
    case R_MIPS_PC16:
5362
0
    case R_MIPS_PC21_S2:
5363
0
    case R_MIPS_PC26_S2:
5364
0
    case R_MICROMIPS_26_S1:
5365
0
    case R_MICROMIPS_PC7_S1:
5366
0
    case R_MICROMIPS_PC10_S1:
5367
0
    case R_MICROMIPS_PC16_S1:
5368
0
    case R_MICROMIPS_PC23_S2:
5369
0
      return true;
5370
5371
0
    case R_MIPS16_26:
5372
0
      return !target_is_16_bit_code_p;
5373
5374
0
    default:
5375
0
      return false;
5376
0
    }
5377
0
}
5378

5379
/* Obtain the field relocated by RELOCATION.  */
5380
5381
static bfd_vma
5382
mips_elf_obtain_contents (reloc_howto_type *howto,
5383
        const Elf_Internal_Rela *relocation,
5384
        bfd *input_bfd, bfd_byte *contents)
5385
0
{
5386
0
  bfd_vma x = 0;
5387
0
  bfd_byte *location = contents + relocation->r_offset;
5388
0
  unsigned int size = bfd_get_reloc_size (howto);
5389
5390
  /* Obtain the bytes.  */
5391
0
  if (size != 0)
5392
0
    x = bfd_get (8 * size, input_bfd, location);
5393
5394
0
  return x;
5395
0
}
5396
5397
/* Store the field relocated by RELOCATION.  */
5398
5399
static void
5400
mips_elf_store_contents (reloc_howto_type *howto,
5401
       const Elf_Internal_Rela *relocation,
5402
       bfd *input_bfd, bfd_byte *contents, bfd_vma x)
5403
0
{
5404
0
  bfd_byte *location = contents + relocation->r_offset;
5405
0
  unsigned int size = bfd_get_reloc_size (howto);
5406
5407
  /* Put the value into the output.  */
5408
0
  if (size != 0)
5409
0
    bfd_put (8 * size, input_bfd, x, location);
5410
0
}
5411
5412
/* Try to patch a load from GOT instruction in CONTENTS pointed to by
5413
   RELOCATION described by HOWTO, with a move of 0 to the load target
5414
   register, returning TRUE if that is successful and FALSE otherwise.
5415
   If DOIT is FALSE, then only determine it patching is possible and
5416
   return status without actually changing CONTENTS.
5417
*/
5418
5419
static bool
5420
mips_elf_nullify_got_load (bfd *input_bfd, bfd_byte *contents,
5421
         const Elf_Internal_Rela *relocation,
5422
         reloc_howto_type *howto, bool doit)
5423
0
{
5424
0
  int r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
5425
0
  bfd_byte *location = contents + relocation->r_offset;
5426
0
  bool nullified = true;
5427
0
  bfd_vma x;
5428
5429
0
  _bfd_mips_elf_reloc_unshuffle (input_bfd, r_type, false, location);
5430
5431
  /* Obtain the current value.  */
5432
0
  x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
5433
5434
  /* Note that in the unshuffled MIPS16 encoding RX is at bits [21:19]
5435
     while RY is at bits [18:16] of the combined 32-bit instruction word.  */
5436
0
  if (mips16_reloc_p (r_type)
5437
0
      && (((x >> 22) & 0x3ff) == 0x3d3        /* LW */
5438
0
    || ((x >> 22) & 0x3ff) == 0x3c7))      /* LD */
5439
0
    x = (0x3cdU << 22) | (x & (7 << 16)) << 3;     /* LI */
5440
0
  else if (micromips_reloc_p (r_type)
5441
0
     && ((x >> 26) & 0x37) == 0x37)     /* LW/LD */
5442
0
    x = (0xc << 26) | (x & (0x1f << 21));     /* ADDIU */
5443
0
  else if (((x >> 26) & 0x3f) == 0x23        /* LW */
5444
0
     || ((x >> 26) & 0x3f) == 0x37)     /* LD */
5445
0
    x = (0x9 << 26) | (x & (0x1f << 16));     /* ADDIU */
5446
0
  else
5447
0
    nullified = false;
5448
5449
  /* Put the value into the output.  */
5450
0
  if (doit && nullified)
5451
0
    mips_elf_store_contents (howto, relocation, input_bfd, contents, x);
5452
5453
0
  _bfd_mips_elf_reloc_shuffle (input_bfd, r_type, false, location);
5454
5455
0
  return nullified;
5456
0
}
5457
5458
/* Calculate the value produced by the RELOCATION (which comes from
5459
   the INPUT_BFD).  The ADDEND is the addend to use for this
5460
   RELOCATION; RELOCATION->R_ADDEND is ignored.
5461
5462
   The result of the relocation calculation is stored in VALUEP.
5463
   On exit, set *CROSS_MODE_JUMP_P to true if the relocation field
5464
   is a MIPS16 or microMIPS jump to standard MIPS code, or vice versa.
5465
5466
   This function returns bfd_reloc_continue if the caller need take no
5467
   further action regarding this relocation, bfd_reloc_notsupported if
5468
   something goes dramatically wrong, bfd_reloc_overflow if an
5469
   overflow occurs, and bfd_reloc_ok to indicate success.  */
5470
5471
static bfd_reloc_status_type
5472
mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
5473
             asection *input_section, bfd_byte *contents,
5474
             struct bfd_link_info *info,
5475
             const Elf_Internal_Rela *relocation,
5476
             bfd_vma addend, reloc_howto_type *howto,
5477
             Elf_Internal_Sym *local_syms,
5478
             asection **local_sections, bfd_vma *valuep,
5479
             const char **namep,
5480
             bool *cross_mode_jump_p,
5481
             bool save_addend)
5482
0
{
5483
  /* The eventual value we will return.  */
5484
0
  bfd_vma value;
5485
  /* The address of the symbol against which the relocation is
5486
     occurring.  */
5487
0
  bfd_vma symbol = 0;
5488
  /* The final GP value to be used for the relocatable, executable, or
5489
     shared object file being produced.  */
5490
0
  bfd_vma gp;
5491
  /* The place (section offset or address) of the storage unit being
5492
     relocated.  */
5493
0
  bfd_vma p;
5494
  /* The value of GP used to create the relocatable object.  */
5495
0
  bfd_vma gp0;
5496
  /* The offset into the global offset table at which the address of
5497
     the relocation entry symbol, adjusted by the addend, resides
5498
     during execution.  */
5499
0
  bfd_vma g = MINUS_ONE;
5500
  /* The section in which the symbol referenced by the relocation is
5501
     located.  */
5502
0
  asection *sec = NULL;
5503
0
  struct mips_elf_link_hash_entry *h = NULL;
5504
  /* TRUE if the symbol referred to by this relocation is a local
5505
     symbol.  */
5506
0
  bool local_p, was_local_p;
5507
  /* TRUE if the symbol referred to by this relocation is a section
5508
     symbol.  */
5509
0
  bool section_p = false;
5510
  /* TRUE if the symbol referred to by this relocation is "_gp_disp".  */
5511
0
  bool gp_disp_p = false;
5512
  /* TRUE if the symbol referred to by this relocation is
5513
     "__gnu_local_gp".  */
5514
0
  bool gnu_local_gp_p = false;
5515
0
  Elf_Internal_Shdr *symtab_hdr;
5516
0
  size_t extsymoff;
5517
0
  unsigned long r_symndx;
5518
0
  int r_type;
5519
  /* TRUE if overflow occurred during the calculation of the
5520
     relocation value.  */
5521
0
  bool overflowed_p;
5522
  /* TRUE if this relocation refers to a MIPS16 function.  */
5523
0
  bool target_is_16_bit_code_p = false;
5524
0
  bool target_is_micromips_code_p = false;
5525
0
  struct mips_elf_link_hash_table *htab;
5526
0
  bfd *dynobj;
5527
0
  bool resolved_to_zero;
5528
5529
0
  dynobj = elf_hash_table (info)->dynobj;
5530
0
  htab = mips_elf_hash_table (info);
5531
0
  BFD_ASSERT (htab != NULL);
5532
5533
  /* Parse the relocation.  */
5534
0
  r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
5535
0
  r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
5536
0
  p = (input_section->output_section->vma
5537
0
       + input_section->output_offset
5538
0
       + relocation->r_offset);
5539
5540
  /* Assume that there will be no overflow.  */
5541
0
  overflowed_p = false;
5542
5543
  /* Figure out whether or not the symbol is local, and get the offset
5544
     used in the array of hash table entries.  */
5545
0
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5546
0
  local_p = mips_elf_local_relocation_p (input_bfd, relocation,
5547
0
           local_sections);
5548
0
  was_local_p = local_p;
5549
0
  if (! elf_bad_symtab (input_bfd))
5550
0
    extsymoff = symtab_hdr->sh_info;
5551
0
  else
5552
0
    {
5553
      /* The symbol table does not follow the rule that local symbols
5554
   must come before globals.  */
5555
0
      extsymoff = 0;
5556
0
    }
5557
5558
  /* Figure out the value of the symbol.  */
5559
0
  if (local_p)
5560
0
    {
5561
0
      bool micromips_p = MICROMIPS_P (abfd);
5562
0
      Elf_Internal_Sym *sym;
5563
5564
0
      sym = local_syms + r_symndx;
5565
0
      sec = local_sections[r_symndx];
5566
5567
0
      section_p = ELF_ST_TYPE (sym->st_info) == STT_SECTION;
5568
5569
0
      symbol = sec->output_section->vma + sec->output_offset;
5570
0
      if (!section_p || (sec->flags & SEC_MERGE))
5571
0
  symbol += sym->st_value;
5572
0
      if ((sec->flags & SEC_MERGE) && section_p)
5573
0
  {
5574
0
    addend = _bfd_elf_rel_local_sym (abfd, sym, &sec, addend);
5575
0
    addend -= symbol;
5576
0
    addend += sec->output_section->vma + sec->output_offset;
5577
0
  }
5578
5579
      /* MIPS16/microMIPS text labels should be treated as odd.  */
5580
0
      if (ELF_ST_IS_COMPRESSED (sym->st_other))
5581
0
  ++symbol;
5582
5583
      /* Record the name of this symbol, for our caller.  */
5584
0
      *namep = bfd_elf_string_from_elf_section (input_bfd,
5585
0
            symtab_hdr->sh_link,
5586
0
            sym->st_name);
5587
0
      if (*namep == NULL || **namep == '\0')
5588
0
  *namep = bfd_section_name (sec);
5589
5590
      /* For relocations against a section symbol and ones against no
5591
   symbol (absolute relocations) infer the ISA mode from the addend.  */
5592
0
      if (section_p || r_symndx == STN_UNDEF)
5593
0
  {
5594
0
    target_is_16_bit_code_p = (addend & 1) && !micromips_p;
5595
0
    target_is_micromips_code_p = (addend & 1) && micromips_p;
5596
0
  }
5597
      /* For relocations against an absolute symbol infer the ISA mode
5598
   from the value of the symbol plus addend.  */
5599
0
      else if (bfd_is_abs_section (sec))
5600
0
  {
5601
0
    target_is_16_bit_code_p = ((symbol + addend) & 1) && !micromips_p;
5602
0
    target_is_micromips_code_p = ((symbol + addend) & 1) && micromips_p;
5603
0
  }
5604
      /* Otherwise just use the regular symbol annotation available.  */
5605
0
      else
5606
0
  {
5607
0
    target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (sym->st_other);
5608
0
    target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (sym->st_other);
5609
0
  }
5610
0
    }
5611
0
  else
5612
0
    {
5613
      /* ??? Could we use RELOC_FOR_GLOBAL_SYMBOL here ?  */
5614
5615
      /* For global symbols we look up the symbol in the hash-table.  */
5616
0
      h = ((struct mips_elf_link_hash_entry *)
5617
0
     elf_sym_hashes (input_bfd) [r_symndx - extsymoff]);
5618
      /* Find the real hash-table entry for this symbol.  */
5619
0
      while (h->root.root.type == bfd_link_hash_indirect
5620
0
       || h->root.root.type == bfd_link_hash_warning)
5621
0
  h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
5622
5623
      /* Record the name of this symbol, for our caller.  */
5624
0
      *namep = h->root.root.root.string;
5625
5626
      /* See if this is the special _gp_disp symbol.  Note that such a
5627
   symbol must always be a global symbol.  */
5628
0
      if (strcmp (*namep, "_gp_disp") == 0
5629
0
    && ! NEWABI_P (input_bfd))
5630
0
  {
5631
    /* Relocations against _gp_disp are permitted only with
5632
       R_MIPS_HI16 and R_MIPS_LO16 relocations.  */
5633
0
    if (!hi16_reloc_p (r_type) && !lo16_reloc_p (r_type))
5634
0
      return bfd_reloc_notsupported;
5635
5636
0
    gp_disp_p = true;
5637
0
  }
5638
      /* See if this is the special _gp symbol.  Note that such a
5639
   symbol must always be a global symbol.  */
5640
0
      else if (strcmp (*namep, "__gnu_local_gp") == 0)
5641
0
  gnu_local_gp_p = true;
5642
5643
5644
      /* If this symbol is defined, calculate its address.  Note that
5645
   _gp_disp is a magic symbol, always implicitly defined by the
5646
   linker, so it's inappropriate to check to see whether or not
5647
   its defined.  */
5648
0
      else if ((h->root.root.type == bfd_link_hash_defined
5649
0
    || h->root.root.type == bfd_link_hash_defweak)
5650
0
         && h->root.root.u.def.section)
5651
0
  {
5652
0
    sec = h->root.root.u.def.section;
5653
0
    if (sec->output_section)
5654
0
      symbol = (h->root.root.u.def.value
5655
0
          + sec->output_section->vma
5656
0
          + sec->output_offset);
5657
0
    else
5658
0
      symbol = h->root.root.u.def.value;
5659
0
  }
5660
0
      else if (h->root.root.type == bfd_link_hash_undefweak)
5661
  /* We allow relocations against undefined weak symbols, giving
5662
     it the value zero, so that you can undefined weak functions
5663
     and check to see if they exist by looking at their
5664
     addresses.  */
5665
0
  symbol = 0;
5666
0
      else if (info->unresolved_syms_in_objects == RM_IGNORE
5667
0
         && ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
5668
0
  symbol = 0;
5669
0
      else if (strcmp (*namep, SGI_COMPAT (input_bfd)
5670
0
           ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING") == 0)
5671
0
  {
5672
    /* If this is a dynamic link, we should have created a
5673
       _DYNAMIC_LINK symbol or _DYNAMIC_LINKING(for normal mips) symbol
5674
       in _bfd_mips_elf_create_dynamic_sections.
5675
       Otherwise, we should define the symbol with a value of 0.
5676
       FIXME: It should probably get into the symbol table
5677
       somehow as well.  */
5678
0
    BFD_ASSERT (! bfd_link_pic (info));
5679
0
    BFD_ASSERT (bfd_get_section_by_name (abfd, ".dynamic") == NULL);
5680
0
    symbol = 0;
5681
0
  }
5682
0
      else if (ELF_MIPS_IS_OPTIONAL (h->root.other))
5683
0
  {
5684
    /* This is an optional symbol - an Irix specific extension to the
5685
       ELF spec.  Ignore it for now.
5686
       XXX - FIXME - there is more to the spec for OPTIONAL symbols
5687
       than simply ignoring them, but we do not handle this for now.
5688
       For information see the "64-bit ELF Object File Specification"
5689
       which is available from here:
5690
       http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf  */
5691
0
    symbol = 0;
5692
0
  }
5693
0
      else
5694
0
  {
5695
0
          bool reject_undefined
5696
0
      = ((info->unresolved_syms_in_objects == RM_DIAGNOSE
5697
0
    && !info->warn_unresolved_syms)
5698
0
         || ELF_ST_VISIBILITY (h->root.other) != STV_DEFAULT);
5699
5700
0
    info->callbacks->undefined_symbol
5701
0
      (info, h->root.root.root.string, input_bfd,
5702
0
       input_section, relocation->r_offset, reject_undefined);
5703
5704
0
    if (reject_undefined)
5705
0
      return bfd_reloc_undefined;
5706
5707
0
    symbol = 0;
5708
0
  }
5709
5710
0
      target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (h->root.other);
5711
0
      target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (h->root.other);
5712
0
    }
5713
5714
  /* If this is a reference to a 16-bit function with a stub, we need
5715
     to redirect the relocation to the stub unless:
5716
5717
     (a) the relocation is for a MIPS16 JAL;
5718
5719
     (b) the relocation is for a MIPS16 PIC call, and there are no
5720
   non-MIPS16 uses of the GOT slot; or
5721
5722
     (c) the section allows direct references to MIPS16 functions.  */
5723
0
  if (r_type != R_MIPS16_26
5724
0
      && !bfd_link_relocatable (info)
5725
0
      && ((h != NULL
5726
0
     && h->fn_stub != NULL
5727
0
     && (r_type != R_MIPS16_CALL16 || h->need_fn_stub))
5728
0
    || (local_p
5729
0
        && mips_elf_tdata (input_bfd)->local_stubs != NULL
5730
0
        && mips_elf_tdata (input_bfd)->local_stubs[r_symndx] != NULL))
5731
0
      && !section_allows_mips16_refs_p (input_section))
5732
0
    {
5733
      /* This is a 32- or 64-bit call to a 16-bit function.  We should
5734
   have already noticed that we were going to need the
5735
   stub.  */
5736
0
      if (local_p)
5737
0
  {
5738
0
    sec = mips_elf_tdata (input_bfd)->local_stubs[r_symndx];
5739
0
    value = 0;
5740
0
  }
5741
0
      else
5742
0
  {
5743
0
    BFD_ASSERT (h->need_fn_stub);
5744
0
    if (h->la25_stub)
5745
0
      {
5746
        /* If a LA25 header for the stub itself exists, point to the
5747
     prepended LUI/ADDIU sequence.  */
5748
0
        sec = h->la25_stub->stub_section;
5749
0
        value = h->la25_stub->offset;
5750
0
      }
5751
0
    else
5752
0
      {
5753
0
        sec = h->fn_stub;
5754
0
        value = 0;
5755
0
      }
5756
0
  }
5757
5758
0
      symbol = sec->output_section->vma + sec->output_offset + value;
5759
      /* The target is 16-bit, but the stub isn't.  */
5760
0
      target_is_16_bit_code_p = false;
5761
0
    }
5762
  /* If this is a MIPS16 call with a stub, that is made through the PLT or
5763
     to a standard MIPS function, we need to redirect the call to the stub.
5764
     Note that we specifically exclude R_MIPS16_CALL16 from this behavior;
5765
     indirect calls should use an indirect stub instead.  */
5766
0
  else if (r_type == R_MIPS16_26 && !bfd_link_relocatable (info)
5767
0
     && ((h != NULL && (h->call_stub != NULL || h->call_fp_stub != NULL))
5768
0
         || (local_p
5769
0
       && mips_elf_tdata (input_bfd)->local_call_stubs != NULL
5770
0
       && mips_elf_tdata (input_bfd)->local_call_stubs[r_symndx] != NULL))
5771
0
     && ((h != NULL && h->use_plt_entry) || !target_is_16_bit_code_p))
5772
0
    {
5773
0
      if (local_p)
5774
0
  sec = mips_elf_tdata (input_bfd)->local_call_stubs[r_symndx];
5775
0
      else
5776
0
  {
5777
    /* If both call_stub and call_fp_stub are defined, we can figure
5778
       out which one to use by checking which one appears in the input
5779
       file.  */
5780
0
    if (h->call_stub != NULL && h->call_fp_stub != NULL)
5781
0
      {
5782
0
        asection *o;
5783
5784
0
        sec = NULL;
5785
0
        for (o = input_bfd->sections; o != NULL; o = o->next)
5786
0
    {
5787
0
      if (CALL_FP_STUB_P (bfd_section_name (o)))
5788
0
        {
5789
0
          sec = h->call_fp_stub;
5790
0
          break;
5791
0
        }
5792
0
    }
5793
0
        if (sec == NULL)
5794
0
    sec = h->call_stub;
5795
0
      }
5796
0
    else if (h->call_stub != NULL)
5797
0
      sec = h->call_stub;
5798
0
    else
5799
0
      sec = h->call_fp_stub;
5800
0
  }
5801
5802
0
      BFD_ASSERT (sec->size > 0);
5803
0
      symbol = sec->output_section->vma + sec->output_offset;
5804
0
    }
5805
  /* If this is a direct call to a PIC function, redirect to the
5806
     non-PIC stub.  */
5807
0
  else if (h != NULL && h->la25_stub
5808
0
     && mips_elf_relocation_needs_la25_stub (input_bfd, r_type,
5809
0
               target_is_16_bit_code_p))
5810
0
    {
5811
0
  symbol = (h->la25_stub->stub_section->output_section->vma
5812
0
      + h->la25_stub->stub_section->output_offset
5813
0
      + h->la25_stub->offset);
5814
0
  if (ELF_ST_IS_MICROMIPS (h->root.other))
5815
0
    symbol |= 1;
5816
0
    }
5817
  /* For direct MIPS16 and microMIPS calls make sure the compressed PLT
5818
     entry is used if a standard PLT entry has also been made.  In this
5819
     case the symbol will have been set by mips_elf_set_plt_sym_value
5820
     to point to the standard PLT entry, so redirect to the compressed
5821
     one.  */
5822
0
  else if ((mips16_branch_reloc_p (r_type)
5823
0
      || micromips_branch_reloc_p (r_type))
5824
0
     && !bfd_link_relocatable (info)
5825
0
     && h != NULL
5826
0
     && h->use_plt_entry
5827
0
     && h->root.plt.plist->comp_offset != MINUS_ONE
5828
0
     && h->root.plt.plist->mips_offset != MINUS_ONE)
5829
0
    {
5830
0
      bool micromips_p = MICROMIPS_P (abfd);
5831
5832
0
      sec = htab->root.splt;
5833
0
      symbol = (sec->output_section->vma
5834
0
    + sec->output_offset
5835
0
    + htab->plt_header_size
5836
0
    + htab->plt_mips_offset
5837
0
    + h->root.plt.plist->comp_offset
5838
0
    + 1);
5839
5840
0
      target_is_16_bit_code_p = !micromips_p;
5841
0
      target_is_micromips_code_p = micromips_p;
5842
0
    }
5843
5844
  /* Make sure MIPS16 and microMIPS are not used together.  */
5845
0
  if ((mips16_branch_reloc_p (r_type) && target_is_micromips_code_p)
5846
0
      || (micromips_branch_reloc_p (r_type) && target_is_16_bit_code_p))
5847
0
   {
5848
0
      _bfd_error_handler
5849
0
  (_("MIPS16 and microMIPS functions cannot call each other"));
5850
0
      return bfd_reloc_notsupported;
5851
0
   }
5852
5853
  /* Calls from 16-bit code to 32-bit code and vice versa require the
5854
     mode change.  However, we can ignore calls to undefined weak symbols,
5855
     which should never be executed at runtime.  This exception is important
5856
     because the assembly writer may have "known" that any definition of the
5857
     symbol would be 16-bit code, and that direct jumps were therefore
5858
     acceptable.  */
5859
0
  *cross_mode_jump_p = (!bfd_link_relocatable (info)
5860
0
      && !(h && h->root.root.type == bfd_link_hash_undefweak)
5861
0
      && ((mips16_branch_reloc_p (r_type)
5862
0
           && !target_is_16_bit_code_p)
5863
0
          || (micromips_branch_reloc_p (r_type)
5864
0
        && !target_is_micromips_code_p)
5865
0
          || ((branch_reloc_p (r_type)
5866
0
         || r_type == R_MIPS_JALR)
5867
0
        && (target_is_16_bit_code_p
5868
0
            || target_is_micromips_code_p))));
5869
5870
0
  resolved_to_zero = (h != NULL
5871
0
          && UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->root));
5872
5873
0
  switch (r_type)
5874
0
    {
5875
0
    case R_MIPS16_CALL16:
5876
0
    case R_MIPS16_GOT16:
5877
0
    case R_MIPS_CALL16:
5878
0
    case R_MIPS_GOT16:
5879
0
    case R_MIPS_GOT_PAGE:
5880
0
    case R_MIPS_GOT_DISP:
5881
0
    case R_MIPS_GOT_LO16:
5882
0
    case R_MIPS_CALL_LO16:
5883
0
    case R_MICROMIPS_CALL16:
5884
0
    case R_MICROMIPS_GOT16:
5885
0
    case R_MICROMIPS_GOT_PAGE:
5886
0
    case R_MICROMIPS_GOT_DISP:
5887
0
    case R_MICROMIPS_GOT_LO16:
5888
0
    case R_MICROMIPS_CALL_LO16:
5889
0
      if (resolved_to_zero
5890
0
    && !bfd_link_relocatable (info)
5891
0
    && bfd_reloc_offset_in_range (howto, input_bfd, input_section,
5892
0
          relocation->r_offset)
5893
0
    && mips_elf_nullify_got_load (input_bfd, contents,
5894
0
          relocation, howto, true))
5895
0
  return bfd_reloc_continue;
5896
5897
      /* Fall through.  */
5898
0
    case R_MIPS_GOT_HI16:
5899
0
    case R_MIPS_CALL_HI16:
5900
0
    case R_MICROMIPS_GOT_HI16:
5901
0
    case R_MICROMIPS_CALL_HI16:
5902
0
      if (resolved_to_zero
5903
0
    && htab->use_absolute_zero
5904
0
    && bfd_link_pic (info))
5905
0
  {
5906
    /* Redirect to the special `__gnu_absolute_zero' symbol.  */
5907
0
    h = mips_elf_link_hash_lookup (htab, "__gnu_absolute_zero",
5908
0
           false, false, false);
5909
0
    BFD_ASSERT (h != NULL);
5910
0
  }
5911
0
      break;
5912
0
    }
5913
5914
0
  local_p = (h == NULL || mips_use_local_got_p (info, h));
5915
5916
0
  gp0 = _bfd_get_gp_value (input_bfd);
5917
0
  gp = _bfd_get_gp_value (abfd);
5918
0
  if (htab->got_info)
5919
0
    gp += mips_elf_adjust_gp (abfd, htab->got_info, input_bfd);
5920
5921
0
  if (gnu_local_gp_p)
5922
0
    symbol = gp;
5923
5924
  /* Global R_MIPS_GOT_PAGE/R_MICROMIPS_GOT_PAGE relocations are equivalent
5925
     to R_MIPS_GOT_DISP/R_MICROMIPS_GOT_DISP.  The addend is applied by the
5926
     corresponding R_MIPS_GOT_OFST/R_MICROMIPS_GOT_OFST.  */
5927
0
  if (got_page_reloc_p (r_type) && !local_p)
5928
0
    {
5929
0
      r_type = (micromips_reloc_p (r_type)
5930
0
    ? R_MICROMIPS_GOT_DISP : R_MIPS_GOT_DISP);
5931
0
      addend = 0;
5932
0
    }
5933
5934
  /* If we haven't already determined the GOT offset, and we're going
5935
     to need it, get it now.  */
5936
0
  switch (r_type)
5937
0
    {
5938
0
    case R_MIPS16_CALL16:
5939
0
    case R_MIPS16_GOT16:
5940
0
    case R_MIPS_CALL16:
5941
0
    case R_MIPS_GOT16:
5942
0
    case R_MIPS_GOT_DISP:
5943
0
    case R_MIPS_GOT_HI16:
5944
0
    case R_MIPS_CALL_HI16:
5945
0
    case R_MIPS_GOT_LO16:
5946
0
    case R_MIPS_CALL_LO16:
5947
0
    case R_MICROMIPS_CALL16:
5948
0
    case R_MICROMIPS_GOT16:
5949
0
    case R_MICROMIPS_GOT_DISP:
5950
0
    case R_MICROMIPS_GOT_HI16:
5951
0
    case R_MICROMIPS_CALL_HI16:
5952
0
    case R_MICROMIPS_GOT_LO16:
5953
0
    case R_MICROMIPS_CALL_LO16:
5954
0
    case R_MIPS_TLS_GD:
5955
0
    case R_MIPS_TLS_GOTTPREL:
5956
0
    case R_MIPS_TLS_LDM:
5957
0
    case R_MIPS16_TLS_GD:
5958
0
    case R_MIPS16_TLS_GOTTPREL:
5959
0
    case R_MIPS16_TLS_LDM:
5960
0
    case R_MICROMIPS_TLS_GD:
5961
0
    case R_MICROMIPS_TLS_GOTTPREL:
5962
0
    case R_MICROMIPS_TLS_LDM:
5963
      /* Find the index into the GOT where this value is located.  */
5964
0
      if (tls_ldm_reloc_p (r_type))
5965
0
  {
5966
0
    g = mips_elf_local_got_index (abfd, input_bfd, info,
5967
0
          0, 0, NULL, r_type);
5968
0
    if (g == MINUS_ONE)
5969
0
      return bfd_reloc_outofrange;
5970
0
  }
5971
0
      else if (!local_p)
5972
0
  {
5973
    /* On VxWorks, CALL relocations should refer to the .got.plt
5974
       entry, which is initialized to point at the PLT stub.  */
5975
0
    if (htab->root.target_os == is_vxworks
5976
0
        && (call_hi16_reloc_p (r_type)
5977
0
      || call_lo16_reloc_p (r_type)
5978
0
      || call16_reloc_p (r_type)))
5979
0
      {
5980
0
        BFD_ASSERT (addend == 0);
5981
0
        BFD_ASSERT (h->root.needs_plt);
5982
0
        g = mips_elf_gotplt_index (info, &h->root);
5983
0
      }
5984
0
    else
5985
0
      {
5986
0
        BFD_ASSERT (addend == 0);
5987
0
        g = mips_elf_global_got_index (abfd, info, input_bfd,
5988
0
               &h->root, r_type);
5989
0
        if (!TLS_RELOC_P (r_type)
5990
0
      && !elf_hash_table (info)->dynamic_sections_created)
5991
    /* This is a static link.  We must initialize the GOT entry.  */
5992
0
    MIPS_ELF_PUT_WORD (dynobj, symbol, htab->root.sgot->contents + g);
5993
0
      }
5994
0
  }
5995
0
      else if (htab->root.target_os != is_vxworks
5996
0
         && (call16_reloc_p (r_type) || got16_reloc_p (r_type)))
5997
  /* The calculation below does not involve "g".  */
5998
0
  break;
5999
0
      else
6000
0
  {
6001
0
    g = mips_elf_local_got_index (abfd, input_bfd, info,
6002
0
          symbol + addend, r_symndx, h, r_type);
6003
0
    if (g == MINUS_ONE)
6004
0
      return bfd_reloc_outofrange;
6005
0
  }
6006
6007
      /* Convert GOT indices to actual offsets.  */
6008
0
      g = mips_elf_got_offset_from_index (info, abfd, input_bfd, g);
6009
0
      break;
6010
0
    }
6011
6012
  /* Relocations against the VxWorks __GOTT_BASE__ and __GOTT_INDEX__
6013
     symbols are resolved by the loader.  Add them to .rela.dyn.  */
6014
0
  if (h != NULL && is_gott_symbol (info, &h->root))
6015
0
    {
6016
0
      Elf_Internal_Rela outrel;
6017
0
      bfd_byte *loc;
6018
0
      asection *s;
6019
6020
0
      s = mips_elf_rel_dyn_section (info, false);
6021
0
      loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
6022
6023
0
      outrel.r_offset = (input_section->output_section->vma
6024
0
       + input_section->output_offset
6025
0
       + relocation->r_offset);
6026
0
      outrel.r_info = ELF32_R_INFO (h->root.dynindx, r_type);
6027
0
      outrel.r_addend = addend;
6028
0
      bfd_elf32_swap_reloca_out (abfd, &outrel, loc);
6029
6030
      /* If we've written this relocation for a readonly section,
6031
   we need to set DF_TEXTREL again, so that we do not delete the
6032
   DT_TEXTREL tag.  */
6033
0
      if (MIPS_ELF_READONLY_SECTION (input_section))
6034
0
  info->flags |= DF_TEXTREL;
6035
6036
0
      *valuep = 0;
6037
0
      return bfd_reloc_ok;
6038
0
    }
6039
6040
  /* Figure out what kind of relocation is being performed.  */
6041
0
  switch (r_type)
6042
0
    {
6043
0
    case R_MIPS_NONE:
6044
0
      return bfd_reloc_continue;
6045
6046
0
    case R_MIPS_16:
6047
0
      if (howto->partial_inplace)
6048
0
  addend = _bfd_mips_elf_sign_extend (addend, 16);
6049
0
      value = symbol + addend;
6050
0
      overflowed_p = mips_elf_overflow_p (value, 16);
6051
0
      break;
6052
6053
0
    case R_MIPS_32:
6054
0
    case R_MIPS_REL32:
6055
0
    case R_MIPS_64:
6056
0
      if ((bfd_link_pic (info)
6057
0
     || (htab->root.dynamic_sections_created
6058
0
         && h != NULL
6059
0
         && h->root.def_dynamic
6060
0
         && !h->root.def_regular
6061
0
         && !h->has_static_relocs))
6062
0
    && r_symndx != STN_UNDEF
6063
0
    && (h == NULL
6064
0
        || h->root.root.type != bfd_link_hash_undefweak
6065
0
        || (ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT
6066
0
      && !resolved_to_zero))
6067
0
    && (input_section->flags & SEC_ALLOC) != 0)
6068
0
  {
6069
    /* If we're creating a shared library, then we can't know
6070
       where the symbol will end up.  So, we create a relocation
6071
       record in the output, and leave the job up to the dynamic
6072
       linker.  We must do the same for executable references to
6073
       shared library symbols, unless we've decided to use copy
6074
       relocs or PLTs instead.  */
6075
0
    value = addend;
6076
0
    if (!mips_elf_create_dynamic_relocation (abfd,
6077
0
               info,
6078
0
               relocation,
6079
0
               h,
6080
0
               sec,
6081
0
               symbol,
6082
0
               &value,
6083
0
               input_section))
6084
0
      return bfd_reloc_undefined;
6085
0
  }
6086
0
      else
6087
0
  {
6088
0
    if (r_type != R_MIPS_REL32)
6089
0
      value = symbol + addend;
6090
0
    else
6091
0
      value = addend;
6092
0
  }
6093
0
      value &= howto->dst_mask;
6094
0
      break;
6095
6096
0
    case R_MIPS_PC32:
6097
0
      value = symbol + addend - p;
6098
0
      value &= howto->dst_mask;
6099
0
      break;
6100
6101
0
    case R_MIPS16_26:
6102
      /* The calculation for R_MIPS16_26 is just the same as for an
6103
   R_MIPS_26.  It's only the storage of the relocated field into
6104
   the output file that's different.  That's handled in
6105
   mips_elf_perform_relocation.  So, we just fall through to the
6106
   R_MIPS_26 case here.  */
6107
0
    case R_MIPS_26:
6108
0
    case R_MICROMIPS_26_S1:
6109
0
      {
6110
0
  unsigned int shift;
6111
6112
  /* Shift is 2, unusually, for microMIPS JALX.  */
6113
0
  shift = (!*cross_mode_jump_p && r_type == R_MICROMIPS_26_S1) ? 1 : 2;
6114
6115
0
  if (howto->partial_inplace && !section_p)
6116
0
    value = _bfd_mips_elf_sign_extend (addend, 26 + shift);
6117
0
  else
6118
0
    value = addend;
6119
0
  value += symbol;
6120
6121
  /* Make sure the target of a jump is suitably aligned.  Bit 0 must
6122
     be the correct ISA mode selector except for weak undefined
6123
     symbols.  */
6124
0
  if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6125
0
      && (*cross_mode_jump_p
6126
0
    ? (value & 3) != (r_type == R_MIPS_26)
6127
0
    : (value & ((1 << shift) - 1)) != (r_type != R_MIPS_26)))
6128
0
    return bfd_reloc_outofrange;
6129
6130
0
  value >>= shift;
6131
0
  if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6132
0
    overflowed_p = (value >> 26) != ((p + 4) >> (26 + shift));
6133
0
  value &= howto->dst_mask;
6134
0
      }
6135
0
      break;
6136
6137
0
    case R_MIPS_TLS_DTPREL_HI16:
6138
0
    case R_MIPS16_TLS_DTPREL_HI16:
6139
0
    case R_MICROMIPS_TLS_DTPREL_HI16:
6140
0
      value = (mips_elf_high (addend + symbol - dtprel_base (info))
6141
0
         & howto->dst_mask);
6142
0
      break;
6143
6144
0
    case R_MIPS_TLS_DTPREL_LO16:
6145
0
    case R_MIPS_TLS_DTPREL32:
6146
0
    case R_MIPS_TLS_DTPREL64:
6147
0
    case R_MIPS16_TLS_DTPREL_LO16:
6148
0
    case R_MICROMIPS_TLS_DTPREL_LO16:
6149
0
      value = (symbol + addend - dtprel_base (info)) & howto->dst_mask;
6150
0
      break;
6151
6152
0
    case R_MIPS_TLS_TPREL_HI16:
6153
0
    case R_MIPS16_TLS_TPREL_HI16:
6154
0
    case R_MICROMIPS_TLS_TPREL_HI16:
6155
0
      value = (mips_elf_high (addend + symbol - tprel_base (info))
6156
0
         & howto->dst_mask);
6157
0
      break;
6158
6159
0
    case R_MIPS_TLS_TPREL_LO16:
6160
0
    case R_MIPS_TLS_TPREL32:
6161
0
    case R_MIPS_TLS_TPREL64:
6162
0
    case R_MIPS16_TLS_TPREL_LO16:
6163
0
    case R_MICROMIPS_TLS_TPREL_LO16:
6164
0
      value = (symbol + addend - tprel_base (info)) & howto->dst_mask;
6165
0
      break;
6166
6167
0
    case R_MIPS_HI16:
6168
0
    case R_MIPS16_HI16:
6169
0
    case R_MICROMIPS_HI16:
6170
0
      if (!gp_disp_p)
6171
0
  {
6172
0
    value = mips_elf_high (addend + symbol);
6173
0
    value &= howto->dst_mask;
6174
0
  }
6175
0
      else
6176
0
  {
6177
    /* For MIPS16 ABI code we generate this sequence
6178
    0: li      $v0,%hi(_gp_disp)
6179
    4: addiupc $v1,%lo(_gp_disp)
6180
    8: sll     $v0,16
6181
         12: addu    $v0,$v1
6182
         14: move    $gp,$v0
6183
       So the offsets of hi and lo relocs are the same, but the
6184
       base $pc is that used by the ADDIUPC instruction at $t9 + 4.
6185
       ADDIUPC clears the low two bits of the instruction address,
6186
       so the base is ($t9 + 4) & ~3.  */
6187
0
    if (r_type == R_MIPS16_HI16)
6188
0
      value = mips_elf_high (addend + gp - ((p + 4) & ~(bfd_vma) 0x3));
6189
    /* The microMIPS .cpload sequence uses the same assembly
6190
       instructions as the traditional psABI version, but the
6191
       incoming $t9 has the low bit set.  */
6192
0
    else if (r_type == R_MICROMIPS_HI16)
6193
0
      value = mips_elf_high (addend + gp - p - 1);
6194
0
    else
6195
0
      value = mips_elf_high (addend + gp - p);
6196
0
  }
6197
0
      break;
6198
6199
0
    case R_MIPS_LO16:
6200
0
    case R_MIPS16_LO16:
6201
0
    case R_MICROMIPS_LO16:
6202
0
    case R_MICROMIPS_HI0_LO16:
6203
0
      if (!gp_disp_p)
6204
0
  value = (symbol + addend) & howto->dst_mask;
6205
0
      else
6206
0
  {
6207
    /* See the comment for R_MIPS16_HI16 above for the reason
6208
       for this conditional.  */
6209
0
    if (r_type == R_MIPS16_LO16)
6210
0
      value = addend + gp - (p & ~(bfd_vma) 0x3);
6211
0
    else if (r_type == R_MICROMIPS_LO16
6212
0
       || r_type == R_MICROMIPS_HI0_LO16)
6213
0
      value = addend + gp - p + 3;
6214
0
    else
6215
0
      value = addend + gp - p + 4;
6216
    /* The MIPS ABI requires checking the R_MIPS_LO16 relocation
6217
       for overflow.  But, on, say, IRIX5, relocations against
6218
       _gp_disp are normally generated from the .cpload
6219
       pseudo-op.  It generates code that normally looks like
6220
       this:
6221
6222
         lui    $gp,%hi(_gp_disp)
6223
         addiu  $gp,$gp,%lo(_gp_disp)
6224
         addu   $gp,$gp,$t9
6225
6226
       Here $t9 holds the address of the function being called,
6227
       as required by the MIPS ELF ABI.  The R_MIPS_LO16
6228
       relocation can easily overflow in this situation, but the
6229
       R_MIPS_HI16 relocation will handle the overflow.
6230
       Therefore, we consider this a bug in the MIPS ABI, and do
6231
       not check for overflow here.  */
6232
0
  }
6233
0
      break;
6234
6235
0
    case R_MIPS_LITERAL:
6236
0
    case R_MICROMIPS_LITERAL:
6237
      /* Because we don't merge literal sections, we can handle this
6238
   just like R_MIPS_GPREL16.  In the long run, we should merge
6239
   shared literals, and then we will need to additional work
6240
   here.  */
6241
6242
      /* Fall through.  */
6243
6244
0
    case R_MIPS16_GPREL:
6245
      /* The R_MIPS16_GPREL performs the same calculation as
6246
   R_MIPS_GPREL16, but stores the relocated bits in a different
6247
   order.  We don't need to do anything special here; the
6248
   differences are handled in mips_elf_perform_relocation.  */
6249
0
    case R_MIPS_GPREL16:
6250
0
    case R_MICROMIPS_GPREL7_S2:
6251
0
    case R_MICROMIPS_GPREL16:
6252
0
      {
6253
0
  int bits = howto->bitsize + howto->rightshift;
6254
  /* Only sign-extend the addend if it was extracted from the
6255
     instruction.  If the addend was separate, leave it alone,
6256
     otherwise we may lose significant bits.  */
6257
0
  if (howto->partial_inplace)
6258
0
    addend = _bfd_mips_elf_sign_extend (addend, bits);
6259
0
  value = symbol + addend - gp;
6260
  /* If the symbol was local, any earlier relocatable links will
6261
     have adjusted its addend with the gp offset, so compensate
6262
     for that now.  Don't do it for symbols forced local in this
6263
     link, though, since they won't have had the gp offset applied
6264
     to them before.  */
6265
0
  if (was_local_p)
6266
0
    value += gp0;
6267
0
  if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6268
0
    overflowed_p = mips_elf_overflow_p (value, bits);
6269
0
      }
6270
0
      break;
6271
6272
0
    case R_MIPS16_GOT16:
6273
0
    case R_MIPS16_CALL16:
6274
0
    case R_MIPS_GOT16:
6275
0
    case R_MIPS_CALL16:
6276
0
    case R_MICROMIPS_GOT16:
6277
0
    case R_MICROMIPS_CALL16:
6278
      /* VxWorks does not have separate local and global semantics for
6279
   R_MIPS*_GOT16; every relocation evaluates to "G".  */
6280
0
      if (htab->root.target_os != is_vxworks && local_p)
6281
0
  {
6282
0
    value = mips_elf_got16_entry (abfd, input_bfd, info,
6283
0
          symbol + addend, !was_local_p);
6284
0
    if (value == MINUS_ONE)
6285
0
      return bfd_reloc_outofrange;
6286
0
    value
6287
0
      = mips_elf_got_offset_from_index (info, abfd, input_bfd, value);
6288
0
    overflowed_p = mips_elf_overflow_p (value, 16);
6289
0
    break;
6290
0
  }
6291
6292
      /* Fall through.  */
6293
6294
0
    case R_MIPS_TLS_GD:
6295
0
    case R_MIPS_TLS_GOTTPREL:
6296
0
    case R_MIPS_TLS_LDM:
6297
0
    case R_MIPS_GOT_DISP:
6298
0
    case R_MIPS16_TLS_GD:
6299
0
    case R_MIPS16_TLS_GOTTPREL:
6300
0
    case R_MIPS16_TLS_LDM:
6301
0
    case R_MICROMIPS_TLS_GD:
6302
0
    case R_MICROMIPS_TLS_GOTTPREL:
6303
0
    case R_MICROMIPS_TLS_LDM:
6304
0
    case R_MICROMIPS_GOT_DISP:
6305
0
      value = g;
6306
0
      overflowed_p = mips_elf_overflow_p (value, 16);
6307
0
      break;
6308
6309
0
    case R_MIPS_GPREL32:
6310
0
      value = (addend + symbol + gp0 - gp);
6311
0
      if (!save_addend)
6312
0
  value &= howto->dst_mask;
6313
0
      break;
6314
6315
0
    case R_MIPS_PC16:
6316
0
    case R_MIPS_GNU_REL16_S2:
6317
0
      if (howto->partial_inplace)
6318
0
  addend = _bfd_mips_elf_sign_extend (addend, 18);
6319
6320
      /* No need to exclude weak undefined symbols here as they resolve
6321
   to 0 and never set `*cross_mode_jump_p', so this alignment check
6322
   will never trigger for them.  */
6323
0
      if (*cross_mode_jump_p
6324
0
    ? ((symbol + addend) & 3) != 1
6325
0
    : ((symbol + addend) & 3) != 0)
6326
0
  return bfd_reloc_outofrange;
6327
6328
0
      value = symbol + addend - p;
6329
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6330
0
  overflowed_p = mips_elf_overflow_p (value, 18);
6331
0
      value >>= howto->rightshift;
6332
0
      value &= howto->dst_mask;
6333
0
      break;
6334
6335
0
    case R_MIPS16_PC16_S1:
6336
0
      if (howto->partial_inplace)
6337
0
  addend = _bfd_mips_elf_sign_extend (addend, 17);
6338
6339
0
      if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6340
0
    && (*cross_mode_jump_p
6341
0
        ? ((symbol + addend) & 3) != 0
6342
0
        : ((symbol + addend) & 1) == 0))
6343
0
  return bfd_reloc_outofrange;
6344
6345
0
      value = symbol + addend - p;
6346
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6347
0
  overflowed_p = mips_elf_overflow_p (value, 17);
6348
0
      value >>= howto->rightshift;
6349
0
      value &= howto->dst_mask;
6350
0
      break;
6351
6352
0
    case R_MIPS_PC21_S2:
6353
0
      if (howto->partial_inplace)
6354
0
  addend = _bfd_mips_elf_sign_extend (addend, 23);
6355
6356
0
      if ((symbol + addend) & 3)
6357
0
  return bfd_reloc_outofrange;
6358
6359
0
      value = symbol + addend - p;
6360
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6361
0
  overflowed_p = mips_elf_overflow_p (value, 23);
6362
0
      value >>= howto->rightshift;
6363
0
      value &= howto->dst_mask;
6364
0
      break;
6365
6366
0
    case R_MIPS_PC26_S2:
6367
0
      if (howto->partial_inplace)
6368
0
  addend = _bfd_mips_elf_sign_extend (addend, 28);
6369
6370
0
      if ((symbol + addend) & 3)
6371
0
  return bfd_reloc_outofrange;
6372
6373
0
      value = symbol + addend - p;
6374
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6375
0
  overflowed_p = mips_elf_overflow_p (value, 28);
6376
0
      value >>= howto->rightshift;
6377
0
      value &= howto->dst_mask;
6378
0
      break;
6379
6380
0
    case R_MIPS_PC18_S3:
6381
0
      if (howto->partial_inplace)
6382
0
  addend = _bfd_mips_elf_sign_extend (addend, 21);
6383
6384
0
      if ((symbol + addend) & 7)
6385
0
  return bfd_reloc_outofrange;
6386
6387
0
      value = symbol + addend - ((p | 7) ^ 7);
6388
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6389
0
  overflowed_p = mips_elf_overflow_p (value, 21);
6390
0
      value >>= howto->rightshift;
6391
0
      value &= howto->dst_mask;
6392
0
      break;
6393
6394
0
    case R_MIPS_PC19_S2:
6395
0
      if (howto->partial_inplace)
6396
0
  addend = _bfd_mips_elf_sign_extend (addend, 21);
6397
6398
0
      if ((symbol + addend) & 3)
6399
0
  return bfd_reloc_outofrange;
6400
6401
0
      value = symbol + addend - p;
6402
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6403
0
  overflowed_p = mips_elf_overflow_p (value, 21);
6404
0
      value >>= howto->rightshift;
6405
0
      value &= howto->dst_mask;
6406
0
      break;
6407
6408
0
    case R_MIPS_PCHI16:
6409
0
      value = mips_elf_high (symbol + addend - p);
6410
0
      value &= howto->dst_mask;
6411
0
      break;
6412
6413
0
    case R_MIPS_PCLO16:
6414
0
      if (howto->partial_inplace)
6415
0
  addend = _bfd_mips_elf_sign_extend (addend, 16);
6416
0
      value = symbol + addend - p;
6417
0
      value &= howto->dst_mask;
6418
0
      break;
6419
6420
0
    case R_MICROMIPS_PC7_S1:
6421
0
      if (howto->partial_inplace)
6422
0
  addend = _bfd_mips_elf_sign_extend (addend, 8);
6423
6424
0
      if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6425
0
    && (*cross_mode_jump_p
6426
0
        ? ((symbol + addend + 2) & 3) != 0
6427
0
        : ((symbol + addend + 2) & 1) == 0))
6428
0
  return bfd_reloc_outofrange;
6429
6430
0
      value = symbol + addend - p;
6431
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6432
0
  overflowed_p = mips_elf_overflow_p (value, 8);
6433
0
      value >>= howto->rightshift;
6434
0
      value &= howto->dst_mask;
6435
0
      break;
6436
6437
0
    case R_MICROMIPS_PC10_S1:
6438
0
      if (howto->partial_inplace)
6439
0
  addend = _bfd_mips_elf_sign_extend (addend, 11);
6440
6441
0
      if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6442
0
    && (*cross_mode_jump_p
6443
0
        ? ((symbol + addend + 2) & 3) != 0
6444
0
        : ((symbol + addend + 2) & 1) == 0))
6445
0
  return bfd_reloc_outofrange;
6446
6447
0
      value = symbol + addend - p;
6448
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6449
0
  overflowed_p = mips_elf_overflow_p (value, 11);
6450
0
      value >>= howto->rightshift;
6451
0
      value &= howto->dst_mask;
6452
0
      break;
6453
6454
0
    case R_MICROMIPS_PC16_S1:
6455
0
      if (howto->partial_inplace)
6456
0
  addend = _bfd_mips_elf_sign_extend (addend, 17);
6457
6458
0
      if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6459
0
    && (*cross_mode_jump_p
6460
0
        ? ((symbol + addend) & 3) != 0
6461
0
        : ((symbol + addend) & 1) == 0))
6462
0
  return bfd_reloc_outofrange;
6463
6464
0
      value = symbol + addend - p;
6465
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6466
0
  overflowed_p = mips_elf_overflow_p (value, 17);
6467
0
      value >>= howto->rightshift;
6468
0
      value &= howto->dst_mask;
6469
0
      break;
6470
6471
0
    case R_MICROMIPS_PC23_S2:
6472
0
      if (howto->partial_inplace)
6473
0
  addend = _bfd_mips_elf_sign_extend (addend, 25);
6474
0
      value = symbol + addend - ((p | 3) ^ 3);
6475
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6476
0
  overflowed_p = mips_elf_overflow_p (value, 25);
6477
0
      value >>= howto->rightshift;
6478
0
      value &= howto->dst_mask;
6479
0
      break;
6480
6481
0
    case R_MIPS_GOT_HI16:
6482
0
    case R_MIPS_CALL_HI16:
6483
0
    case R_MICROMIPS_GOT_HI16:
6484
0
    case R_MICROMIPS_CALL_HI16:
6485
      /* We're allowed to handle these two relocations identically.
6486
   The dynamic linker is allowed to handle the CALL relocations
6487
   differently by creating a lazy evaluation stub.  */
6488
0
      value = g;
6489
0
      value = mips_elf_high (value);
6490
0
      value &= howto->dst_mask;
6491
0
      break;
6492
6493
0
    case R_MIPS_GOT_LO16:
6494
0
    case R_MIPS_CALL_LO16:
6495
0
    case R_MICROMIPS_GOT_LO16:
6496
0
    case R_MICROMIPS_CALL_LO16:
6497
0
      value = g & howto->dst_mask;
6498
0
      break;
6499
6500
0
    case R_MIPS_GOT_PAGE:
6501
0
    case R_MICROMIPS_GOT_PAGE:
6502
0
      value = mips_elf_got_page (abfd, input_bfd, info, symbol + addend, NULL);
6503
0
      if (value == MINUS_ONE)
6504
0
  return bfd_reloc_outofrange;
6505
0
      value = mips_elf_got_offset_from_index (info, abfd, input_bfd, value);
6506
0
      overflowed_p = mips_elf_overflow_p (value, 16);
6507
0
      break;
6508
6509
0
    case R_MIPS_GOT_OFST:
6510
0
    case R_MICROMIPS_GOT_OFST:
6511
0
      if (local_p)
6512
0
  mips_elf_got_page (abfd, input_bfd, info, symbol + addend, &value);
6513
0
      else
6514
0
  value = addend;
6515
0
      overflowed_p = mips_elf_overflow_p (value, 16);
6516
0
      break;
6517
6518
0
    case R_MIPS_SUB:
6519
0
    case R_MICROMIPS_SUB:
6520
0
      value = symbol - addend;
6521
0
      value &= howto->dst_mask;
6522
0
      break;
6523
6524
0
    case R_MIPS_HIGHER:
6525
0
    case R_MICROMIPS_HIGHER:
6526
0
      value = mips_elf_higher (addend + symbol);
6527
0
      value &= howto->dst_mask;
6528
0
      break;
6529
6530
0
    case R_MIPS_HIGHEST:
6531
0
    case R_MICROMIPS_HIGHEST:
6532
0
      value = mips_elf_highest (addend + symbol);
6533
0
      value &= howto->dst_mask;
6534
0
      break;
6535
6536
0
    case R_MIPS_SCN_DISP:
6537
0
    case R_MICROMIPS_SCN_DISP:
6538
0
      value = symbol + addend - sec->output_offset;
6539
0
      value &= howto->dst_mask;
6540
0
      break;
6541
6542
0
    case R_MIPS_JALR:
6543
0
    case R_MICROMIPS_JALR:
6544
      /* This relocation is only a hint.  In some cases, we optimize
6545
   it into a bal instruction.  But we don't try to optimize
6546
   when the symbol does not resolve locally.  */
6547
0
      if (h != NULL && !SYMBOL_CALLS_LOCAL (info, &h->root))
6548
0
  return bfd_reloc_continue;
6549
      /* We can't optimize cross-mode jumps either.  */
6550
0
      if (*cross_mode_jump_p)
6551
0
  return bfd_reloc_continue;
6552
0
      value = symbol + addend;
6553
      /* Neither we can non-instruction-aligned targets.  */
6554
0
      if (r_type == R_MIPS_JALR ? (value & 3) != 0 : (value & 1) == 0)
6555
0
  return bfd_reloc_continue;
6556
0
      break;
6557
6558
0
    case R_MIPS_PJUMP:
6559
0
    case R_MIPS_GNU_VTINHERIT:
6560
0
    case R_MIPS_GNU_VTENTRY:
6561
      /* We don't do anything with these at present.  */
6562
0
      return bfd_reloc_continue;
6563
6564
0
    default:
6565
      /* An unrecognized relocation type.  */
6566
0
      return bfd_reloc_notsupported;
6567
0
    }
6568
6569
  /* Store the VALUE for our caller.  */
6570
0
  *valuep = value;
6571
0
  return overflowed_p ? bfd_reloc_overflow : bfd_reloc_ok;
6572
0
}
6573
6574
/* It has been determined that the result of the RELOCATION is the
6575
   VALUE.  Use HOWTO to place VALUE into the output file at the
6576
   appropriate position.  The SECTION is the section to which the
6577
   relocation applies.
6578
   CROSS_MODE_JUMP_P is true if the relocation field
6579
   is a MIPS16 or microMIPS jump to standard MIPS code, or vice versa.
6580
6581
   Returns FALSE if anything goes wrong.  */
6582
6583
static bool
6584
mips_elf_perform_relocation (struct bfd_link_info *info,
6585
           reloc_howto_type *howto,
6586
           const Elf_Internal_Rela *relocation,
6587
           bfd_vma value, bfd *input_bfd,
6588
           asection *input_section, bfd_byte *contents,
6589
           bool cross_mode_jump_p)
6590
0
{
6591
0
  bfd_vma x;
6592
0
  bfd_byte *location;
6593
0
  int r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
6594
6595
  /* Figure out where the relocation is occurring.  */
6596
0
  location = contents + relocation->r_offset;
6597
6598
0
  _bfd_mips_elf_reloc_unshuffle (input_bfd, r_type, false, location);
6599
6600
  /* Obtain the current value.  */
6601
0
  x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
6602
6603
  /* Clear the field we are setting.  */
6604
0
  x &= ~howto->dst_mask;
6605
6606
  /* Set the field.  */
6607
0
  x |= (value & howto->dst_mask);
6608
6609
  /* Detect incorrect JALX usage.  If required, turn JAL or BAL into JALX.  */
6610
0
  if (!cross_mode_jump_p && jal_reloc_p (r_type))
6611
0
    {
6612
0
      bfd_vma opcode = x >> 26;
6613
6614
0
      if (r_type == R_MIPS16_26 ? opcode == 0x7
6615
0
    : r_type == R_MICROMIPS_26_S1 ? opcode == 0x3c
6616
0
    : opcode == 0x1d)
6617
0
  {
6618
0
    info->callbacks->einfo
6619
0
      (_("%X%H: unsupported JALX to the same ISA mode\n"),
6620
0
       input_bfd, input_section, relocation->r_offset);
6621
0
    return true;
6622
0
  }
6623
0
    }
6624
0
  if (cross_mode_jump_p && jal_reloc_p (r_type))
6625
0
    {
6626
0
      bool ok;
6627
0
      bfd_vma opcode = x >> 26;
6628
0
      bfd_vma jalx_opcode;
6629
6630
      /* Check to see if the opcode is already JAL or JALX.  */
6631
0
      if (r_type == R_MIPS16_26)
6632
0
  {
6633
0
    ok = ((opcode == 0x6) || (opcode == 0x7));
6634
0
    jalx_opcode = 0x7;
6635
0
  }
6636
0
      else if (r_type == R_MICROMIPS_26_S1)
6637
0
  {
6638
0
    ok = ((opcode == 0x3d) || (opcode == 0x3c));
6639
0
    jalx_opcode = 0x3c;
6640
0
  }
6641
0
      else
6642
0
  {
6643
0
    ok = ((opcode == 0x3) || (opcode == 0x1d));
6644
0
    jalx_opcode = 0x1d;
6645
0
  }
6646
6647
      /* If the opcode is not JAL or JALX, there's a problem.  We cannot
6648
   convert J or JALS to JALX.  */
6649
0
      if (!ok)
6650
0
  {
6651
0
    info->callbacks->einfo
6652
0
      (_("%X%H: unsupported jump between ISA modes; "
6653
0
         "consider recompiling with interlinking enabled\n"),
6654
0
       input_bfd, input_section, relocation->r_offset);
6655
0
    return true;
6656
0
  }
6657
6658
      /* Make this the JALX opcode.  */
6659
0
      x = (x & ~(0x3fu << 26)) | (jalx_opcode << 26);
6660
0
    }
6661
0
  else if (cross_mode_jump_p && b_reloc_p (r_type))
6662
0
    {
6663
0
      bool ok = false;
6664
0
      bfd_vma opcode = x >> 16;
6665
0
      bfd_vma jalx_opcode = 0;
6666
0
      bfd_vma sign_bit = 0;
6667
0
      bfd_vma addr;
6668
0
      bfd_vma dest;
6669
6670
0
      if (r_type == R_MICROMIPS_PC16_S1)
6671
0
  {
6672
0
    ok = opcode == 0x4060;
6673
0
    jalx_opcode = 0x3c;
6674
0
    sign_bit = 0x10000;
6675
0
    value <<= 1;
6676
0
  }
6677
0
      else if (r_type == R_MIPS_PC16 || r_type == R_MIPS_GNU_REL16_S2)
6678
0
  {
6679
0
    ok = opcode == 0x411;
6680
0
    jalx_opcode = 0x1d;
6681
0
    sign_bit = 0x20000;
6682
0
    value <<= 2;
6683
0
  }
6684
6685
0
      if (ok && !bfd_link_pic (info))
6686
0
  {
6687
0
    addr = (input_section->output_section->vma
6688
0
      + input_section->output_offset
6689
0
      + relocation->r_offset
6690
0
      + 4);
6691
0
    dest = (addr
6692
0
      + (((value & ((sign_bit << 1) - 1)) ^ sign_bit) - sign_bit));
6693
6694
0
    if ((addr >> 28) << 28 != (dest >> 28) << 28)
6695
0
      {
6696
0
        info->callbacks->einfo
6697
0
    (_("%X%H: cannot convert branch between ISA modes "
6698
0
       "to JALX: relocation out of range\n"),
6699
0
     input_bfd, input_section, relocation->r_offset);
6700
0
        return true;
6701
0
      }
6702
6703
    /* Make this the JALX opcode.  */
6704
0
    x = ((dest >> 2) & 0x3ffffff) | jalx_opcode << 26;
6705
0
  }
6706
0
      else if (!mips_elf_hash_table (info)->ignore_branch_isa)
6707
0
  {
6708
0
    info->callbacks->einfo
6709
0
      (_("%X%H: unsupported branch between ISA modes\n"),
6710
0
       input_bfd, input_section, relocation->r_offset);
6711
0
    return true;
6712
0
  }
6713
0
    }
6714
6715
  /* Try converting JAL to BAL and J(AL)R to B(AL), if the target is in
6716
     range.  */
6717
0
  if (!bfd_link_relocatable (info)
6718
0
      && !cross_mode_jump_p
6719
0
      && ((JAL_TO_BAL_P (input_bfd)
6720
0
     && r_type == R_MIPS_26
6721
0
     && (x >> 26) == 0x3)     /* jal addr */
6722
0
    || (JALR_TO_BAL_P (input_bfd)
6723
0
        && r_type == R_MIPS_JALR
6724
0
        && x == 0x0320f809)   /* jalr t9 */
6725
0
    || (JR_TO_B_P (input_bfd)
6726
0
        && r_type == R_MIPS_JALR
6727
0
        && (x & ~1) == 0x03200008))) /* jr t9 / jalr zero, t9 */
6728
0
    {
6729
0
      bfd_vma addr;
6730
0
      bfd_vma dest;
6731
0
      bfd_signed_vma off;
6732
6733
0
      addr = (input_section->output_section->vma
6734
0
        + input_section->output_offset
6735
0
        + relocation->r_offset
6736
0
        + 4);
6737
0
      if (r_type == R_MIPS_26)
6738
0
  dest = (value << 2) | ((addr >> 28) << 28);
6739
0
      else
6740
0
  dest = value;
6741
0
      off = dest - addr;
6742
0
      if (off <= 0x1ffff && off >= -0x20000)
6743
0
  {
6744
0
    if ((x & ~1) == 0x03200008)   /* jr t9 / jalr zero, t9 */
6745
0
      x = 0x10000000 | (((bfd_vma) off >> 2) & 0xffff);   /* b addr */
6746
0
    else
6747
0
      x = 0x04110000 | (((bfd_vma) off >> 2) & 0xffff);   /* bal addr */
6748
0
  }
6749
0
    }
6750
6751
  /* Put the value into the output.  */
6752
0
  mips_elf_store_contents (howto, relocation, input_bfd, contents, x);
6753
6754
0
  _bfd_mips_elf_reloc_shuffle (input_bfd, r_type, !bfd_link_relocatable (info),
6755
0
             location);
6756
6757
0
  return true;
6758
0
}
6759

6760
/* Create a rel.dyn relocation for the dynamic linker to resolve.  REL
6761
   is the original relocation, which is now being transformed into a
6762
   dynamic relocation.  The ADDENDP is adjusted if necessary; the
6763
   caller should store the result in place of the original addend.  */
6764
6765
static bool
6766
mips_elf_create_dynamic_relocation (bfd *output_bfd,
6767
            struct bfd_link_info *info,
6768
            const Elf_Internal_Rela *rel,
6769
            struct mips_elf_link_hash_entry *h,
6770
            asection *sec, bfd_vma symbol,
6771
            bfd_vma *addendp, asection *input_section)
6772
0
{
6773
0
  Elf_Internal_Rela outrel[3];
6774
0
  asection *sreloc;
6775
0
  bfd *dynobj;
6776
0
  int r_type;
6777
0
  long indx;
6778
0
  bool defined_p;
6779
0
  struct mips_elf_link_hash_table *htab;
6780
6781
0
  htab = mips_elf_hash_table (info);
6782
0
  BFD_ASSERT (htab != NULL);
6783
6784
0
  r_type = ELF_R_TYPE (output_bfd, rel->r_info);
6785
0
  dynobj = elf_hash_table (info)->dynobj;
6786
0
  sreloc = mips_elf_rel_dyn_section (info, false);
6787
0
  BFD_ASSERT (sreloc != NULL);
6788
0
  BFD_ASSERT (sreloc->contents != NULL);
6789
0
  BFD_ASSERT (sreloc->reloc_count * MIPS_ELF_REL_SIZE (output_bfd)
6790
0
        < sreloc->size);
6791
6792
0
  outrel[0].r_offset =
6793
0
    _bfd_elf_section_offset (output_bfd, info, input_section, rel[0].r_offset);
6794
0
  if (ABI_64_P (output_bfd))
6795
0
    {
6796
0
      outrel[1].r_offset =
6797
0
  _bfd_elf_section_offset (output_bfd, info, input_section, rel[1].r_offset);
6798
0
      outrel[2].r_offset =
6799
0
  _bfd_elf_section_offset (output_bfd, info, input_section, rel[2].r_offset);
6800
0
    }
6801
6802
0
  if (outrel[0].r_offset == MINUS_ONE)
6803
    /* The relocation field has been deleted.  */
6804
0
    return true;
6805
6806
0
  if (outrel[0].r_offset == MINUS_TWO)
6807
0
    {
6808
      /* The relocation field has been converted into a relative value of
6809
   some sort.  Functions like _bfd_elf_write_section_eh_frame expect
6810
   the field to be fully relocated, so add in the symbol's value.  */
6811
0
      *addendp += symbol;
6812
0
      return true;
6813
0
    }
6814
6815
  /* We must now calculate the dynamic symbol table index to use
6816
     in the relocation.  */
6817
0
  if (h != NULL && ! SYMBOL_REFERENCES_LOCAL (info, &h->root))
6818
0
    {
6819
0
      BFD_ASSERT (htab->root.target_os == is_vxworks
6820
0
      || h->global_got_area != GGA_NONE);
6821
0
      indx = h->root.dynindx;
6822
0
      if (SGI_COMPAT (output_bfd))
6823
0
  defined_p = h->root.def_regular;
6824
0
      else
6825
  /* ??? glibc's ld.so just adds the final GOT entry to the
6826
     relocation field.  It therefore treats relocs against
6827
     defined symbols in the same way as relocs against
6828
     undefined symbols.  */
6829
0
  defined_p = false;
6830
0
    }
6831
0
  else
6832
0
    {
6833
0
      if (sec != NULL && bfd_is_abs_section (sec))
6834
0
  indx = 0;
6835
0
      else if (sec == NULL || sec->owner == NULL)
6836
0
  {
6837
0
    BFD_ASSERT (0);
6838
0
    bfd_set_error (bfd_error_bad_value);
6839
0
    return false;
6840
0
  }
6841
0
      else
6842
0
  {
6843
0
    indx = elf_section_data (sec->output_section)->dynindx;
6844
0
    if (indx == 0)
6845
0
      {
6846
0
        asection *osec = htab->root.text_index_section;
6847
0
        indx = elf_section_data (osec)->dynindx;
6848
0
      }
6849
0
    if (indx == 0)
6850
0
      abort ();
6851
0
  }
6852
6853
      /* Instead of generating a relocation using the section
6854
   symbol, we may as well make it a fully relative
6855
   relocation.  We want to avoid generating relocations to
6856
   local symbols because we used to generate them
6857
   incorrectly, without adding the original symbol value,
6858
   which is mandated by the ABI for section symbols.  In
6859
   order to give dynamic loaders and applications time to
6860
   phase out the incorrect use, we refrain from emitting
6861
   section-relative relocations.  It's not like they're
6862
   useful, after all.  This should be a bit more efficient
6863
   as well.  */
6864
      /* ??? Although this behavior is compatible with glibc's ld.so,
6865
   the ABI says that relocations against STN_UNDEF should have
6866
   a symbol value of 0.  Irix rld honors this, so relocations
6867
   against STN_UNDEF have no effect.  */
6868
0
      if (!SGI_COMPAT (output_bfd))
6869
0
  indx = 0;
6870
0
      defined_p = true;
6871
0
    }
6872
6873
  /* If the relocation was previously an absolute relocation and
6874
     this symbol will not be referred to by the relocation, we must
6875
     adjust it by the value we give it in the dynamic symbol table.
6876
     Otherwise leave the job up to the dynamic linker.  */
6877
0
  if (defined_p && r_type != R_MIPS_REL32)
6878
0
    *addendp += symbol;
6879
6880
0
  if (htab->root.target_os == is_vxworks)
6881
    /* VxWorks uses non-relative relocations for this.  */
6882
0
    outrel[0].r_info = ELF32_R_INFO (indx, R_MIPS_32);
6883
0
  else
6884
    /* The relocation is always an REL32 relocation because we don't
6885
       know where the shared library will wind up at load-time.  */
6886
0
    outrel[0].r_info = ELF_R_INFO (output_bfd, (unsigned long) indx,
6887
0
           R_MIPS_REL32);
6888
6889
  /* For strict adherence to the ABI specification, we should
6890
     generate a R_MIPS_64 relocation record by itself before the
6891
     _REL32/_64 record as well, such that the addend is read in as
6892
     a 64-bit value (REL32 is a 32-bit relocation, after all).
6893
     However, since none of the existing ELF64 MIPS dynamic
6894
     loaders seems to care, we don't waste space with these
6895
     artificial relocations.  If this turns out to not be true,
6896
     mips_elf_allocate_dynamic_relocation() should be tweaked so
6897
     as to make room for a pair of dynamic relocations per
6898
     invocation if ABI_64_P, and here we should generate an
6899
     additional relocation record with R_MIPS_64 by itself for a
6900
     NULL symbol before this relocation record.  */
6901
0
  outrel[1].r_info = ELF_R_INFO (output_bfd, 0,
6902
0
         ABI_64_P (output_bfd)
6903
0
         ? R_MIPS_64
6904
0
         : R_MIPS_NONE);
6905
0
  outrel[2].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_NONE);
6906
6907
  /* Adjust the output offset of the relocation to reference the
6908
     correct location in the output file.  */
6909
0
  outrel[0].r_offset += (input_section->output_section->vma
6910
0
       + input_section->output_offset);
6911
0
  outrel[1].r_offset += (input_section->output_section->vma
6912
0
       + input_section->output_offset);
6913
0
  outrel[2].r_offset += (input_section->output_section->vma
6914
0
       + input_section->output_offset);
6915
6916
  /* Put the relocation back out.  We have to use the special
6917
     relocation outputter in the 64-bit case since the 64-bit
6918
     relocation format is non-standard.  */
6919
0
  if (ABI_64_P (output_bfd))
6920
0
    {
6921
0
      (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
6922
0
  (output_bfd, &outrel[0],
6923
0
   (sreloc->contents
6924
0
    + sreloc->reloc_count * sizeof (Elf64_Mips_External_Rel)));
6925
0
    }
6926
0
  else if (htab->root.target_os == is_vxworks)
6927
0
    {
6928
      /* VxWorks uses RELA rather than REL dynamic relocations.  */
6929
0
      outrel[0].r_addend = *addendp;
6930
0
      bfd_elf32_swap_reloca_out
6931
0
  (output_bfd, &outrel[0],
6932
0
   (sreloc->contents
6933
0
    + sreloc->reloc_count * sizeof (Elf32_External_Rela)));
6934
0
    }
6935
0
  else
6936
0
    bfd_elf32_swap_reloc_out
6937
0
      (output_bfd, &outrel[0],
6938
0
       (sreloc->contents + sreloc->reloc_count * sizeof (Elf32_External_Rel)));
6939
6940
  /* We've now added another relocation.  */
6941
0
  ++sreloc->reloc_count;
6942
6943
  /* Make sure the output section is writable.  The dynamic linker
6944
     will be writing to it.  */
6945
0
  elf_section_data (input_section->output_section)->this_hdr.sh_flags
6946
0
    |= SHF_WRITE;
6947
6948
  /* On IRIX5, make an entry of compact relocation info.  */
6949
0
  if (IRIX_COMPAT (output_bfd) == ict_irix5)
6950
0
    {
6951
0
      asection *scpt = bfd_get_linker_section (dynobj, ".compact_rel");
6952
0
      bfd_byte *cr;
6953
6954
0
      if (scpt)
6955
0
  {
6956
0
    Elf32_crinfo cptrel;
6957
6958
0
    mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG);
6959
0
    cptrel.vaddr = (rel->r_offset
6960
0
        + input_section->output_section->vma
6961
0
        + input_section->output_offset);
6962
0
    if (r_type == R_MIPS_REL32)
6963
0
      mips_elf_set_cr_type (cptrel, CRT_MIPS_REL32);
6964
0
    else
6965
0
      mips_elf_set_cr_type (cptrel, CRT_MIPS_WORD);
6966
0
    mips_elf_set_cr_dist2to (cptrel, 0);
6967
0
    cptrel.konst = *addendp;
6968
6969
0
    cr = (scpt->contents
6970
0
    + sizeof (Elf32_External_compact_rel));
6971
0
    mips_elf_set_cr_relvaddr (cptrel, 0);
6972
0
    bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
6973
0
             ((Elf32_External_crinfo *) cr
6974
0
              + scpt->reloc_count));
6975
0
    ++scpt->reloc_count;
6976
0
  }
6977
0
    }
6978
6979
  /* If we've written this relocation for a readonly section,
6980
     we need to set DF_TEXTREL again, so that we do not delete the
6981
     DT_TEXTREL tag.  */
6982
0
  if (MIPS_ELF_READONLY_SECTION (input_section))
6983
0
    info->flags |= DF_TEXTREL;
6984
6985
0
  return true;
6986
0
}
6987

6988
/* Return the MACH for a MIPS e_flags value.  */
6989
6990
unsigned long
6991
_bfd_elf_mips_mach (flagword flags)
6992
170k
{
6993
170k
  switch (flags & EF_MIPS_MACH)
6994
170k
    {
6995
6
    case EF_MIPS_MACH_3900:
6996
6
      return bfd_mach_mips3900;
6997
6998
0
    case EF_MIPS_MACH_4010:
6999
0
      return bfd_mach_mips4010;
7000
7001
313
    case EF_MIPS_MACH_ALLEGREX:
7002
313
      return bfd_mach_mips_allegrex;
7003
7004
12
    case EF_MIPS_MACH_4100:
7005
12
      return bfd_mach_mips4100;
7006
7007
7
    case EF_MIPS_MACH_4111:
7008
7
      return bfd_mach_mips4111;
7009
7010
5
    case EF_MIPS_MACH_4120:
7011
5
      return bfd_mach_mips4120;
7012
7013
14
    case EF_MIPS_MACH_4650:
7014
14
      return bfd_mach_mips4650;
7015
7016
3
    case EF_MIPS_MACH_5400:
7017
3
      return bfd_mach_mips5400;
7018
7019
7
    case EF_MIPS_MACH_5500:
7020
7
      return bfd_mach_mips5500;
7021
7022
806
    case EF_MIPS_MACH_5900:
7023
806
      return bfd_mach_mips5900;
7024
7025
2.24k
    case EF_MIPS_MACH_9000:
7026
2.24k
      return bfd_mach_mips9000;
7027
7028
7
    case EF_MIPS_MACH_SB1:
7029
7
      return bfd_mach_mips_sb1;
7030
7031
12
    case EF_MIPS_MACH_LS2E:
7032
12
      return bfd_mach_mips_loongson_2e;
7033
7034
1.22k
    case EF_MIPS_MACH_LS2F:
7035
1.22k
      return bfd_mach_mips_loongson_2f;
7036
7037
6
    case EF_MIPS_MACH_GS464:
7038
6
      return bfd_mach_mips_gs464;
7039
7040
10
    case EF_MIPS_MACH_GS464E:
7041
10
      return bfd_mach_mips_gs464e;
7042
7043
70
    case EF_MIPS_MACH_GS264E:
7044
70
      return bfd_mach_mips_gs264e;
7045
7046
692
    case EF_MIPS_MACH_OCTEON3:
7047
692
      return bfd_mach_mips_octeon3;
7048
7049
303
    case EF_MIPS_MACH_OCTEON2:
7050
303
      return bfd_mach_mips_octeon2;
7051
7052
977
    case EF_MIPS_MACH_OCTEON:
7053
977
      return bfd_mach_mips_octeon;
7054
7055
4
    case EF_MIPS_MACH_XLR:
7056
4
      return bfd_mach_mips_xlr;
7057
7058
6
    case EF_MIPS_MACH_IAMR2:
7059
6
      return bfd_mach_mips_interaptiv_mr2;
7060
7061
163k
    default:
7062
163k
      switch (flags & EF_MIPS_ARCH)
7063
163k
  {
7064
20.5k
  default:
7065
141k
  case EF_MIPS_ARCH_1:
7066
141k
    return bfd_mach_mips3000;
7067
7068
1.01k
  case EF_MIPS_ARCH_2:
7069
1.01k
    return bfd_mach_mips6000;
7070
7071
8.27k
  case EF_MIPS_ARCH_3:
7072
8.27k
    return bfd_mach_mips4000;
7073
7074
4.75k
  case EF_MIPS_ARCH_4:
7075
4.75k
    return bfd_mach_mips8000;
7076
7077
718
  case EF_MIPS_ARCH_5:
7078
718
    return bfd_mach_mips5;
7079
7080
46
  case EF_MIPS_ARCH_32:
7081
46
    return bfd_mach_mipsisa32;
7082
7083
1.07k
  case EF_MIPS_ARCH_64:
7084
1.07k
    return bfd_mach_mipsisa64;
7085
7086
1.40k
  case EF_MIPS_ARCH_32R2:
7087
1.40k
    return bfd_mach_mipsisa32r2;
7088
7089
2.81k
  case EF_MIPS_ARCH_64R2:
7090
2.81k
    return bfd_mach_mipsisa64r2;
7091
7092
1.49k
  case EF_MIPS_ARCH_32R6:
7093
1.49k
    return bfd_mach_mipsisa32r6;
7094
7095
373
  case EF_MIPS_ARCH_64R6:
7096
373
    return bfd_mach_mipsisa64r6;
7097
163k
  }
7098
170k
    }
7099
7100
0
  return 0;
7101
170k
}
7102
7103
/* Return printable name for ABI.  */
7104
7105
static inline char *
7106
elf_mips_abi_name (bfd *abfd)
7107
0
{
7108
0
  flagword flags;
7109
7110
0
  flags = elf_elfheader (abfd)->e_flags;
7111
0
  switch (flags & EF_MIPS_ABI)
7112
0
    {
7113
0
    case 0:
7114
0
      if (ABI_N32_P (abfd))
7115
0
  return "N32";
7116
0
      else if (ABI_64_P (abfd))
7117
0
  return "64";
7118
0
      else
7119
0
  return "none";
7120
0
    case EF_MIPS_ABI_O32:
7121
0
      return "O32";
7122
0
    case EF_MIPS_ABI_O64:
7123
0
      return "O64";
7124
0
    case EF_MIPS_ABI_EABI32:
7125
0
      return "EABI32";
7126
0
    case EF_MIPS_ABI_EABI64:
7127
0
      return "EABI64";
7128
0
    default:
7129
0
      return "unknown abi";
7130
0
    }
7131
0
}
7132

7133
/* MIPS ELF uses two common sections.  One is the usual one, and the
7134
   other is for small objects.  All the small objects are kept
7135
   together, and then referenced via the gp pointer, which yields
7136
   faster assembler code.  This is what we use for the small common
7137
   section.  This approach is copied from ecoff.c.  */
7138
static asection mips_elf_scom_section;
7139
static const asymbol mips_elf_scom_symbol =
7140
  GLOBAL_SYM_INIT (".scommon", &mips_elf_scom_section);
7141
static asection mips_elf_scom_section =
7142
  BFD_FAKE_SECTION (mips_elf_scom_section, &mips_elf_scom_symbol,
7143
        ".scommon", 0, SEC_IS_COMMON | SEC_SMALL_DATA);
7144
7145
/* MIPS ELF also uses an acommon section, which represents an
7146
   allocated common symbol which may be overridden by a
7147
   definition in a shared library.  */
7148
static asection mips_elf_acom_section;
7149
static const asymbol mips_elf_acom_symbol =
7150
  GLOBAL_SYM_INIT (".acommon", &mips_elf_acom_section);
7151
static asection mips_elf_acom_section =
7152
  BFD_FAKE_SECTION (mips_elf_acom_section, &mips_elf_acom_symbol,
7153
        ".acommon", 0, SEC_ALLOC);
7154
7155
/* This is used for both the 32-bit and the 64-bit ABI.  */
7156
7157
void
7158
_bfd_mips_elf_symbol_processing (bfd *abfd, asymbol *asym)
7159
13.7k
{
7160
13.7k
  elf_symbol_type *elfsym;
7161
7162
  /* Handle the special MIPS section numbers that a symbol may use.  */
7163
13.7k
  elfsym = (elf_symbol_type *) asym;
7164
13.7k
  switch (elfsym->internal_elf_sym.st_shndx)
7165
13.7k
    {
7166
11
    case SHN_MIPS_ACOMMON:
7167
      /* This section is used in a dynamically linked executable file.
7168
   It is an allocated common section.  The dynamic linker can
7169
   either resolve these symbols to something in a shared
7170
   library, or it can just leave them here.  For our purposes,
7171
   we can consider these symbols to be in a new section.  */
7172
11
      asym->section = &mips_elf_acom_section;
7173
11
      break;
7174
7175
12
    case SHN_COMMON:
7176
      /* Common symbols less than the GP size are automatically
7177
   treated as SHN_MIPS_SCOMMON symbols, with some exceptions.  */
7178
12
      if (asym->value > elf_gp_size (abfd)
7179
12
    || ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_TLS
7180
12
    || IRIX_COMPAT (abfd) == ict_irix6
7181
12
    || strcmp (asym->name, "__gnu_lto_slim") == 0)
7182
12
  break;
7183
      /* Fall through.  */
7184
3
    case SHN_MIPS_SCOMMON:
7185
3
      asym->section = &mips_elf_scom_section;
7186
3
      asym->value = elfsym->internal_elf_sym.st_size;
7187
3
      break;
7188
7189
5
    case SHN_MIPS_SUNDEFINED:
7190
5
      asym->section = bfd_und_section_ptr;
7191
5
      break;
7192
7193
3
    case SHN_MIPS_TEXT:
7194
3
      {
7195
3
  asection *section = bfd_get_section_by_name (abfd, ".text");
7196
7197
3
  if (section != NULL)
7198
1
    {
7199
1
      asym->section = section;
7200
      /* MIPS_TEXT is a bit special, the address is not an offset
7201
         to the base of the .text section.  So subtract the section
7202
         base address to make it an offset.  */
7203
1
      asym->value -= section->vma;
7204
1
    }
7205
3
      }
7206
3
      break;
7207
7208
16
    case SHN_MIPS_DATA:
7209
16
      {
7210
16
  asection *section = bfd_get_section_by_name (abfd, ".data");
7211
7212
16
  if (section != NULL)
7213
2
    {
7214
2
      asym->section = section;
7215
      /* MIPS_DATA is a bit special, the address is not an offset
7216
         to the base of the .data section.  So subtract the section
7217
         base address to make it an offset.  */
7218
2
      asym->value -= section->vma;
7219
2
    }
7220
16
      }
7221
16
      break;
7222
13.7k
    }
7223
7224
  /* If this is an odd-valued function symbol, assume it's a MIPS16
7225
     or microMIPS one.  */
7226
13.7k
  if (ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_FUNC
7227
13.7k
      && (asym->value & 1) != 0)
7228
19
    {
7229
19
      asym->value--;
7230
19
      if (MICROMIPS_P (abfd))
7231
3
  elfsym->internal_elf_sym.st_other
7232
3
    = ELF_ST_SET_MICROMIPS (elfsym->internal_elf_sym.st_other);
7233
16
      else
7234
16
  elfsym->internal_elf_sym.st_other
7235
16
    = ELF_ST_SET_MIPS16 (elfsym->internal_elf_sym.st_other);
7236
19
    }
7237
13.7k
}
7238

7239
/* Implement elf_backend_eh_frame_address_size.  This differs from
7240
   the default in the way it handles EABI64.
7241
7242
   EABI64 was originally specified as an LP64 ABI, and that is what
7243
   -mabi=eabi normally gives on a 64-bit target.  However, gcc has
7244
   historically accepted the combination of -mabi=eabi and -mlong32,
7245
   and this ILP32 variation has become semi-official over time.
7246
   Both forms use elf32 and have pointer-sized FDE addresses.
7247
7248
   If an EABI object was generated by GCC 4.0 or above, it will have
7249
   an empty .gcc_compiled_longXX section, where XX is the size of longs
7250
   in bits.  Unfortunately, ILP32 objects generated by earlier compilers
7251
   have no special marking to distinguish them from LP64 objects.
7252
7253
   We don't want users of the official LP64 ABI to be punished for the
7254
   existence of the ILP32 variant, but at the same time, we don't want
7255
   to mistakenly interpret pre-4.0 ILP32 objects as being LP64 objects.
7256
   We therefore take the following approach:
7257
7258
      - If ABFD contains a .gcc_compiled_longXX section, use it to
7259
  determine the pointer size.
7260
7261
      - Otherwise check the type of the first relocation.  Assume that
7262
  the LP64 ABI is being used if the relocation is of type R_MIPS_64.
7263
7264
      - Otherwise punt.
7265
7266
   The second check is enough to detect LP64 objects generated by pre-4.0
7267
   compilers because, in the kind of output generated by those compilers,
7268
   the first relocation will be associated with either a CIE personality
7269
   routine or an FDE start address.  Furthermore, the compilers never
7270
   used a special (non-pointer) encoding for this ABI.
7271
7272
   Checking the relocation type should also be safe because there is no
7273
   reason to use R_MIPS_64 in an ILP32 object.  Pre-4.0 compilers never
7274
   did so.  */
7275
7276
unsigned int
7277
_bfd_mips_elf_eh_frame_address_size (bfd *abfd, const asection *sec)
7278
0
{
7279
0
  if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
7280
0
    return 8;
7281
0
  if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == EF_MIPS_ABI_EABI64)
7282
0
    {
7283
0
      bool long32_p, long64_p;
7284
7285
0
      long32_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long32") != 0;
7286
0
      long64_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long64") != 0;
7287
0
      if (long32_p && long64_p)
7288
0
  return 0;
7289
0
      if (long32_p)
7290
0
  return 4;
7291
0
      if (long64_p)
7292
0
  return 8;
7293
7294
0
      if (sec->reloc_count > 0)
7295
0
  {
7296
    /* Load the relocations for this section.  */
7297
0
    Elf_Internal_Rela *internal_relocs =
7298
0
      _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, true);
7299
0
    if (internal_relocs == NULL)
7300
0
      return 0;
7301
7302
0
    unsigned int size = 0;
7303
0
    if (ELF32_R_TYPE (internal_relocs[0].r_info) == R_MIPS_64)
7304
0
      size = 8;
7305
7306
0
    if (elf_section_data (sec)->relocs != internal_relocs)
7307
0
      free (internal_relocs);
7308
7309
0
    return size;
7310
0
  }
7311
7312
0
      return 0;
7313
0
    }
7314
0
  return 4;
7315
0
}
7316

7317
/* There appears to be a bug in the MIPSpro linker that causes GOT_DISP
7318
   relocations against two unnamed section symbols to resolve to the
7319
   same address.  For example, if we have code like:
7320
7321
  lw  $4,%got_disp(.data)($gp)
7322
  lw  $25,%got_disp(.text)($gp)
7323
  jalr  $25
7324
7325
   then the linker will resolve both relocations to .data and the program
7326
   will jump there rather than to .text.
7327
7328
   We can work around this problem by giving names to local section symbols.
7329
   This is also what the MIPSpro tools do.  */
7330
7331
bool
7332
_bfd_mips_elf_name_local_section_symbols (bfd *abfd)
7333
0
{
7334
0
  return elf_elfheader (abfd)->e_type == ET_REL && SGI_COMPAT (abfd);
7335
0
}
7336

7337
/* Work over a section just before writing it out.  This routine is
7338
   used by both the 32-bit and the 64-bit ABI.  FIXME: We recognize
7339
   sections that need the SHF_MIPS_GPREL flag by name; there has to be
7340
   a better way.  */
7341
7342
bool
7343
_bfd_mips_elf_section_processing (bfd *abfd, Elf_Internal_Shdr *hdr)
7344
2
{
7345
2
  if (hdr->sh_type == SHT_MIPS_REGINFO
7346
2
      && hdr->sh_size > 0)
7347
0
    {
7348
0
      bfd_byte buf[4];
7349
7350
0
      BFD_ASSERT (hdr->contents == NULL);
7351
7352
0
      if (hdr->sh_size != sizeof (Elf32_External_RegInfo))
7353
0
  {
7354
0
    _bfd_error_handler
7355
0
      (_("%pB: incorrect `.reginfo' section size; "
7356
0
         "expected %" PRIu64 ", got %" PRIu64),
7357
0
       abfd, (uint64_t) sizeof (Elf32_External_RegInfo),
7358
0
       (uint64_t) hdr->sh_size);
7359
0
    bfd_set_error (bfd_error_bad_value);
7360
0
    return false;
7361
0
  }
7362
7363
0
      if (bfd_seek (abfd,
7364
0
        hdr->sh_offset + sizeof (Elf32_External_RegInfo) - 4,
7365
0
        SEEK_SET) != 0)
7366
0
  return false;
7367
0
      H_PUT_32 (abfd, elf_gp (abfd), buf);
7368
0
      if (bfd_write (buf, 4, abfd) != 4)
7369
0
  return false;
7370
0
    }
7371
7372
2
  if (hdr->sh_type == SHT_MIPS_OPTIONS
7373
2
      && hdr->bfd_section != NULL
7374
2
      && mips_elf_section_data (hdr->bfd_section) != NULL
7375
2
      && mips_elf_section_data (hdr->bfd_section)->u.tdata != NULL)
7376
0
    {
7377
0
      bfd_byte *contents, *l, *lend;
7378
7379
      /* We stored the section contents in the tdata field in the
7380
   set_section_contents routine.  We save the section contents
7381
   so that we don't have to read them again.
7382
   At this point we know that elf_gp is set, so we can look
7383
   through the section contents to see if there is an
7384
   ODK_REGINFO structure.  */
7385
7386
0
      contents = mips_elf_section_data (hdr->bfd_section)->u.tdata;
7387
0
      l = contents;
7388
0
      lend = contents + hdr->sh_size;
7389
0
      while (l + sizeof (Elf_External_Options) <= lend)
7390
0
  {
7391
0
    Elf_Internal_Options intopt;
7392
7393
0
    bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
7394
0
          &intopt);
7395
0
    if (intopt.size < sizeof (Elf_External_Options))
7396
0
      {
7397
0
        _bfd_error_handler
7398
    /* xgettext:c-format */
7399
0
    (_("%pB: warning: bad `%s' option size %u smaller than"
7400
0
       " its header"),
7401
0
    abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd), intopt.size);
7402
0
        break;
7403
0
      }
7404
0
    if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
7405
0
      {
7406
0
        bfd_byte buf[8];
7407
7408
0
        if (bfd_seek (abfd,
7409
0
          (hdr->sh_offset
7410
0
           + (l - contents)
7411
0
           + sizeof (Elf_External_Options)
7412
0
           + (sizeof (Elf64_External_RegInfo) - 8)),
7413
0
           SEEK_SET) != 0)
7414
0
    return false;
7415
0
        H_PUT_64 (abfd, elf_gp (abfd), buf);
7416
0
        if (bfd_write (buf, 8, abfd) != 8)
7417
0
    return false;
7418
0
      }
7419
0
    else if (intopt.kind == ODK_REGINFO)
7420
0
      {
7421
0
        bfd_byte buf[4];
7422
7423
0
        if (bfd_seek (abfd,
7424
0
          (hdr->sh_offset
7425
0
           + (l - contents)
7426
0
           + sizeof (Elf_External_Options)
7427
0
           + (sizeof (Elf32_External_RegInfo) - 4)),
7428
0
          SEEK_SET) != 0)
7429
0
    return false;
7430
0
        H_PUT_32 (abfd, elf_gp (abfd), buf);
7431
0
        if (bfd_write (buf, 4, abfd) != 4)
7432
0
    return false;
7433
0
      }
7434
0
    l += intopt.size;
7435
0
  }
7436
0
    }
7437
7438
2
  if (hdr->bfd_section != NULL)
7439
0
    {
7440
0
      const char *name = bfd_section_name (hdr->bfd_section);
7441
7442
      /* .sbss is not handled specially here because the GNU/Linux
7443
   prelinker can convert .sbss from NOBITS to PROGBITS and
7444
   changing it back to NOBITS breaks the binary.  The entry in
7445
   _bfd_mips_elf_special_sections will ensure the correct flags
7446
   are set on .sbss if BFD creates it without reading it from an
7447
   input file, and without special handling here the flags set
7448
   on it in an input file will be followed.  */
7449
0
      if (strcmp (name, ".sdata") == 0
7450
0
    || strcmp (name, ".lit8") == 0
7451
0
    || strcmp (name, ".lit4") == 0)
7452
0
  hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
7453
0
      else if (strcmp (name, ".srdata") == 0)
7454
0
  hdr->sh_flags |= SHF_ALLOC | SHF_MIPS_GPREL;
7455
0
      else if (strcmp (name, ".compact_rel") == 0)
7456
0
  hdr->sh_flags = 0;
7457
0
      else if (strcmp (name, ".rtproc") == 0)
7458
0
  {
7459
0
    if (hdr->sh_addralign != 0 && hdr->sh_entsize == 0)
7460
0
      {
7461
0
        unsigned int adjust;
7462
7463
0
        adjust = hdr->sh_size % hdr->sh_addralign;
7464
0
        if (adjust != 0)
7465
0
    hdr->sh_size += hdr->sh_addralign - adjust;
7466
0
      }
7467
0
  }
7468
0
    }
7469
7470
2
  return true;
7471
2
}
7472
7473
/* Handle a MIPS specific section when reading an object file.  This
7474
   is called when elfcode.h finds a section with an unknown type.
7475
   This routine supports both the 32-bit and 64-bit ELF ABI.  */
7476
7477
bool
7478
_bfd_mips_elf_section_from_shdr (bfd *abfd,
7479
         Elf_Internal_Shdr *hdr,
7480
         const char *name,
7481
         int shindex)
7482
591k
{
7483
591k
  flagword flags = 0;
7484
7485
  /* There ought to be a place to keep ELF backend specific flags, but
7486
     at the moment there isn't one.  We just keep track of the
7487
     sections by their name, instead.  Fortunately, the ABI gives
7488
     suggested names for all the MIPS specific sections, so we will
7489
     probably get away with this.  */
7490
591k
  switch (hdr->sh_type)
7491
591k
    {
7492
8.39k
    case SHT_MIPS_LIBLIST:
7493
8.39k
      if (strcmp (name, ".liblist") != 0)
7494
8.39k
  return false;
7495
0
      break;
7496
491
    case SHT_MIPS_MSYM:
7497
491
      if (strcmp (name, ".msym") != 0)
7498
491
  return false;
7499
0
      break;
7500
482
    case SHT_MIPS_CONFLICT:
7501
482
      if (strcmp (name, ".conflict") != 0)
7502
482
  return false;
7503
0
      break;
7504
476
    case SHT_MIPS_GPTAB:
7505
476
      if (! startswith (name, ".gptab."))
7506
471
  return false;
7507
5
      break;
7508
484
    case SHT_MIPS_UCODE:
7509
484
      if (strcmp (name, ".ucode") != 0)
7510
484
  return false;
7511
0
      break;
7512
489
    case SHT_MIPS_DEBUG:
7513
489
      if (strcmp (name, ".mdebug") != 0)
7514
484
  return false;
7515
5
      flags = SEC_DEBUGGING;
7516
5
      break;
7517
71
    case SHT_MIPS_REGINFO:
7518
71
      if (strcmp (name, ".reginfo") != 0
7519
71
    || hdr->sh_size != sizeof (Elf32_External_RegInfo))
7520
23
  return false;
7521
48
      flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
7522
48
      break;
7523
1.79k
    case SHT_MIPS_IFACE:
7524
1.79k
      if (strcmp (name, ".MIPS.interfaces") != 0)
7525
1.79k
  return false;
7526
0
      break;
7527
1.88k
    case SHT_MIPS_CONTENT:
7528
1.88k
      if (! startswith (name, ".MIPS.content"))
7529
1.18k
  return false;
7530
701
      break;
7531
9.94k
    case SHT_MIPS_OPTIONS:
7532
9.94k
      if (!MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
7533
4.73k
  return false;
7534
5.21k
      break;
7535
5.21k
    case SHT_MIPS_ABIFLAGS:
7536
489
      if (!MIPS_ELF_ABIFLAGS_SECTION_NAME_P (name))
7537
489
  return false;
7538
0
      flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
7539
0
      break;
7540
6.54k
    case SHT_MIPS_DWARF:
7541
6.54k
      if (! startswith (name, ".debug_")
7542
6.54k
         && ! startswith (name, ".gnu.debuglto_.debug_")
7543
6.54k
         && ! startswith (name, ".zdebug_")
7544
6.54k
         && ! startswith (name, ".gnu.debuglto_.zdebug_"))
7545
3.73k
  return false;
7546
2.80k
      break;
7547
2.80k
    case SHT_MIPS_SYMBOL_LIB:
7548
472
      if (strcmp (name, ".MIPS.symlib") != 0)
7549
472
  return false;
7550
0
      break;
7551
980
    case SHT_MIPS_EVENTS:
7552
980
      if (! startswith (name, ".MIPS.events")
7553
980
    && ! startswith (name, ".MIPS.post_rel"))
7554
676
  return false;
7555
304
      break;
7556
473
    case SHT_MIPS_XHASH:
7557
473
      if (strcmp (name, ".MIPS.xhash") != 0)
7558
473
  return false;
7559
558k
    default:
7560
558k
      break;
7561
591k
    }
7562
7563
567k
  if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
7564
52
    return false;
7565
7566
567k
  if (hdr->sh_flags & SHF_MIPS_GPREL)
7567
98.9k
    flags |= SEC_SMALL_DATA;
7568
7569
567k
  if (flags)
7570
99.0k
    {
7571
99.0k
      if (!bfd_set_section_flags (hdr->bfd_section,
7572
99.0k
          (bfd_section_flags (hdr->bfd_section)
7573
99.0k
           | flags)))
7574
0
  return false;
7575
99.0k
    }
7576
7577
567k
  if (hdr->sh_type == SHT_MIPS_ABIFLAGS)
7578
0
    {
7579
0
      Elf_External_ABIFlags_v0 ext;
7580
7581
0
      if (! bfd_get_section_contents (abfd, hdr->bfd_section,
7582
0
              &ext, 0, sizeof ext))
7583
0
  return false;
7584
0
      bfd_mips_elf_swap_abiflags_v0_in (abfd, &ext,
7585
0
          &mips_elf_tdata (abfd)->abiflags);
7586
0
      if (mips_elf_tdata (abfd)->abiflags.version != 0)
7587
0
  return false;
7588
0
      mips_elf_tdata (abfd)->abiflags_valid = true;
7589
0
    }
7590
7591
  /* FIXME: We should record sh_info for a .gptab section.  */
7592
7593
  /* For a .reginfo section, set the gp value in the tdata information
7594
     from the contents of this section.  We need the gp value while
7595
     processing relocs, so we just get it now.  The .reginfo section
7596
     is not used in the 64-bit MIPS ELF ABI.  */
7597
567k
  if (hdr->sh_type == SHT_MIPS_REGINFO)
7598
48
    {
7599
48
      Elf32_External_RegInfo ext;
7600
48
      Elf32_RegInfo s;
7601
7602
48
      if (! bfd_get_section_contents (abfd, hdr->bfd_section,
7603
48
              &ext, 0, sizeof ext))
7604
0
  return false;
7605
48
      bfd_mips_elf32_swap_reginfo_in (abfd, &ext, &s);
7606
48
      elf_gp (abfd) = s.ri_gp_value;
7607
48
    }
7608
7609
  /* For a SHT_MIPS_OPTIONS section, look for a ODK_REGINFO entry, and
7610
     set the gp value based on what we find.  We may see both
7611
     SHT_MIPS_REGINFO and SHT_MIPS_OPTIONS/ODK_REGINFO; in that case,
7612
     they should agree.  */
7613
567k
  if (hdr->sh_type == SHT_MIPS_OPTIONS)
7614
5.21k
    {
7615
5.21k
      bfd_byte *contents, *l, *lend;
7616
7617
5.21k
      if (!bfd_malloc_and_get_section (abfd, hdr->bfd_section, &contents))
7618
680
  {
7619
680
    free (contents);
7620
680
    return false;
7621
680
  }
7622
4.53k
      l = contents;
7623
4.53k
      lend = contents + hdr->sh_size;
7624
10.1k
      while (l + sizeof (Elf_External_Options) <= lend)
7625
7.75k
  {
7626
7.75k
    Elf_Internal_Options intopt;
7627
7628
7.75k
    bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
7629
7.75k
          &intopt);
7630
7.75k
    if (intopt.size < sizeof (Elf_External_Options))
7631
1.42k
      {
7632
2.13k
      bad_opt:
7633
2.13k
        _bfd_error_handler
7634
    /* xgettext:c-format */
7635
2.13k
    (_("%pB: warning: truncated `%s' option"),
7636
2.13k
     abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd));
7637
2.13k
        break;
7638
1.42k
      }
7639
6.33k
    if (intopt.kind == ODK_REGINFO)
7640
2.79k
      {
7641
2.79k
        if (ABI_64_P (abfd))
7642
2.79k
    {
7643
2.79k
      Elf64_Internal_RegInfo intreg;
7644
2.79k
      size_t needed = (sizeof (Elf_External_Options)
7645
2.79k
           + sizeof (Elf64_External_RegInfo));
7646
2.79k
      if (intopt.size < needed || (size_t) (lend - l) < needed)
7647
710
        goto bad_opt;
7648
2.08k
      bfd_mips_elf64_swap_reginfo_in
7649
2.08k
        (abfd,
7650
2.08k
         ((Elf64_External_RegInfo *)
7651
2.08k
          (l + sizeof (Elf_External_Options))),
7652
2.08k
         &intreg);
7653
2.08k
      elf_gp (abfd) = intreg.ri_gp_value;
7654
2.08k
    }
7655
0
        else
7656
0
    {
7657
0
      Elf32_RegInfo intreg;
7658
0
      size_t needed = (sizeof (Elf_External_Options)
7659
0
           + sizeof (Elf32_External_RegInfo));
7660
0
      if (intopt.size < needed || (size_t) (lend - l) < needed)
7661
0
        goto bad_opt;
7662
0
      bfd_mips_elf32_swap_reginfo_in
7663
0
        (abfd,
7664
0
         ((Elf32_External_RegInfo *)
7665
0
          (l + sizeof (Elf_External_Options))),
7666
0
         &intreg);
7667
0
      elf_gp (abfd) = intreg.ri_gp_value;
7668
0
    }
7669
2.79k
      }
7670
5.62k
    l += intopt.size;
7671
5.62k
  }
7672
4.53k
      free (contents);
7673
4.53k
    }
7674
7675
566k
  return true;
7676
567k
}
7677
7678
/* Set the correct type for a MIPS ELF section.  We do this by the
7679
   section name, which is a hack, but ought to work.  This routine is
7680
   used by both the 32-bit and the 64-bit ABI.  */
7681
7682
bool
7683
_bfd_mips_elf_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
7684
0
{
7685
0
  const char *name = bfd_section_name (sec);
7686
7687
0
  if (strcmp (name, ".liblist") == 0)
7688
0
    {
7689
0
      hdr->sh_type = SHT_MIPS_LIBLIST;
7690
0
      hdr->sh_info = sec->size / sizeof (Elf32_Lib);
7691
      /* The sh_link field is set in final_write_processing.  */
7692
0
    }
7693
0
  else if (strcmp (name, ".conflict") == 0)
7694
0
    hdr->sh_type = SHT_MIPS_CONFLICT;
7695
0
  else if (startswith (name, ".gptab."))
7696
0
    {
7697
0
      hdr->sh_type = SHT_MIPS_GPTAB;
7698
0
      hdr->sh_entsize = sizeof (Elf32_External_gptab);
7699
      /* The sh_info field is set in final_write_processing.  */
7700
0
    }
7701
0
  else if (strcmp (name, ".ucode") == 0)
7702
0
    hdr->sh_type = SHT_MIPS_UCODE;
7703
0
  else if (strcmp (name, ".mdebug") == 0)
7704
0
    {
7705
0
      hdr->sh_type = SHT_MIPS_DEBUG;
7706
      /* In a shared object on IRIX 5.3, the .mdebug section has an
7707
   entsize of 0.  FIXME: Does this matter?  */
7708
0
      if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0)
7709
0
  hdr->sh_entsize = 0;
7710
0
      else
7711
0
  hdr->sh_entsize = 1;
7712
0
    }
7713
0
  else if (strcmp (name, ".reginfo") == 0)
7714
0
    {
7715
0
      hdr->sh_type = SHT_MIPS_REGINFO;
7716
      /* In a shared object on IRIX 5.3, the .reginfo section has an
7717
   entsize of 0x18.  FIXME: Does this matter?  */
7718
0
      if (SGI_COMPAT (abfd))
7719
0
  {
7720
0
    if ((abfd->flags & DYNAMIC) != 0)
7721
0
      hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
7722
0
    else
7723
0
      hdr->sh_entsize = 1;
7724
0
  }
7725
0
      else
7726
0
  hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
7727
0
    }
7728
0
  else if (SGI_COMPAT (abfd)
7729
0
     && (strcmp (name, ".hash") == 0
7730
0
         || strcmp (name, ".dynamic") == 0
7731
0
         || strcmp (name, ".dynstr") == 0))
7732
0
    {
7733
0
      if (SGI_COMPAT (abfd))
7734
0
  hdr->sh_entsize = 0;
7735
#if 0
7736
      /* This isn't how the IRIX6 linker behaves.  */
7737
      hdr->sh_info = SIZEOF_MIPS_DYNSYM_SECNAMES;
7738
#endif
7739
0
    }
7740
0
  else if (strcmp (name, ".got") == 0
7741
0
     || strcmp (name, ".srdata") == 0
7742
0
     || strcmp (name, ".sdata") == 0
7743
0
     || strcmp (name, ".sbss") == 0
7744
0
     || strcmp (name, ".lit4") == 0
7745
0
     || strcmp (name, ".lit8") == 0)
7746
0
    hdr->sh_flags |= SHF_MIPS_GPREL;
7747
0
  else if (strcmp (name, ".MIPS.interfaces") == 0)
7748
0
    {
7749
0
      hdr->sh_type = SHT_MIPS_IFACE;
7750
0
      hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7751
0
    }
7752
0
  else if (startswith (name, ".MIPS.content"))
7753
0
    {
7754
0
      hdr->sh_type = SHT_MIPS_CONTENT;
7755
0
      hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7756
      /* The sh_info field is set in final_write_processing.  */
7757
0
    }
7758
0
  else if (MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
7759
0
    {
7760
0
      hdr->sh_type = SHT_MIPS_OPTIONS;
7761
0
      hdr->sh_entsize = 1;
7762
0
      hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7763
0
    }
7764
0
  else if (startswith (name, ".MIPS.abiflags"))
7765
0
    {
7766
0
      hdr->sh_type = SHT_MIPS_ABIFLAGS;
7767
0
      hdr->sh_entsize = sizeof (Elf_External_ABIFlags_v0);
7768
0
    }
7769
0
  else if (startswith (name, ".debug_")
7770
0
     || startswith (name, ".gnu.debuglto_.debug_")
7771
0
     || startswith (name, ".zdebug_")
7772
0
     || startswith (name, ".gnu.debuglto_.zdebug_"))
7773
0
    {
7774
0
      hdr->sh_type = SHT_MIPS_DWARF;
7775
7776
      /* Irix facilities such as libexc expect a single .debug_frame
7777
   per executable, the system ones have NOSTRIP set and the linker
7778
   doesn't merge sections with different flags so ...  */
7779
0
      if (SGI_COMPAT (abfd) && startswith (name, ".debug_frame"))
7780
0
  hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7781
0
    }
7782
0
  else if (strcmp (name, ".MIPS.symlib") == 0)
7783
0
    {
7784
0
      hdr->sh_type = SHT_MIPS_SYMBOL_LIB;
7785
      /* The sh_link and sh_info fields are set in
7786
   final_write_processing.  */
7787
0
    }
7788
0
  else if (startswith (name, ".MIPS.events")
7789
0
     || startswith (name, ".MIPS.post_rel"))
7790
0
    {
7791
0
      hdr->sh_type = SHT_MIPS_EVENTS;
7792
0
      hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7793
      /* The sh_link field is set in final_write_processing.  */
7794
0
    }
7795
0
  else if (strcmp (name, ".msym") == 0)
7796
0
    {
7797
0
      hdr->sh_type = SHT_MIPS_MSYM;
7798
0
      hdr->sh_flags |= SHF_ALLOC;
7799
0
      hdr->sh_entsize = 8;
7800
0
    }
7801
0
  else if (strcmp (name, ".MIPS.xhash") == 0)
7802
0
    {
7803
0
      hdr->sh_type = SHT_MIPS_XHASH;
7804
0
      hdr->sh_flags |= SHF_ALLOC;
7805
0
      hdr->sh_entsize = get_elf_backend_data(abfd)->s->arch_size == 64 ? 0 : 4;
7806
0
    }
7807
7808
  /* The generic elf_fake_sections will set up REL_HDR using the default
7809
   kind of relocations.  We used to set up a second header for the
7810
   non-default kind of relocations here, but only NewABI would use
7811
   these, and the IRIX ld doesn't like resulting empty RELA sections.
7812
   Thus we create those header only on demand now.  */
7813
7814
0
  return true;
7815
0
}
7816
7817
/* Given a BFD section, try to locate the corresponding ELF section
7818
   index.  This is used by both the 32-bit and the 64-bit ABI.
7819
   Actually, it's not clear to me that the 64-bit ABI supports these,
7820
   but for non-PIC objects we will certainly want support for at least
7821
   the .scommon section.  */
7822
7823
bool
7824
_bfd_mips_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
7825
          asection *sec, int *retval)
7826
0
{
7827
0
  if (strcmp (bfd_section_name (sec), ".scommon") == 0)
7828
0
    {
7829
0
      *retval = SHN_MIPS_SCOMMON;
7830
0
      return true;
7831
0
    }
7832
0
  if (strcmp (bfd_section_name (sec), ".acommon") == 0)
7833
0
    {
7834
0
      *retval = SHN_MIPS_ACOMMON;
7835
0
      return true;
7836
0
    }
7837
0
  return false;
7838
0
}
7839

7840
/* Hook called by the linker routine which adds symbols from an object
7841
   file.  We must handle the special MIPS section numbers here.  */
7842
7843
bool
7844
_bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
7845
             Elf_Internal_Sym *sym, const char **namep,
7846
             flagword *flagsp ATTRIBUTE_UNUSED,
7847
             asection **secp, bfd_vma *valp)
7848
0
{
7849
0
  if (SGI_COMPAT (abfd)
7850
0
      && (abfd->flags & DYNAMIC) != 0
7851
0
      && strcmp (*namep, "_rld_new_interface") == 0)
7852
0
    {
7853
      /* Skip IRIX5 rld entry name.  */
7854
0
      *namep = NULL;
7855
0
      return true;
7856
0
    }
7857
7858
  /* Shared objects may have a dynamic symbol '_gp_disp' defined as
7859
     a SECTION *ABS*.  This causes ld to think it can resolve _gp_disp
7860
     by setting a DT_NEEDED for the shared object.  Since _gp_disp is
7861
     a magic symbol resolved by the linker, we ignore this bogus definition
7862
     of _gp_disp.  New ABI objects do not suffer from this problem so this
7863
     is not done for them. */
7864
0
  if (!NEWABI_P(abfd)
7865
0
      && (sym->st_shndx == SHN_ABS)
7866
0
      && (strcmp (*namep, "_gp_disp") == 0))
7867
0
    {
7868
0
      *namep = NULL;
7869
0
      return true;
7870
0
    }
7871
7872
0
  switch (sym->st_shndx)
7873
0
    {
7874
0
    case SHN_COMMON:
7875
      /* Common symbols less than the GP size are automatically
7876
   treated as SHN_MIPS_SCOMMON symbols, with some exceptions.  */
7877
0
      if (sym->st_size > elf_gp_size (abfd)
7878
0
    || ELF_ST_TYPE (sym->st_info) == STT_TLS
7879
0
    || IRIX_COMPAT (abfd) == ict_irix6
7880
0
    || strcmp (*namep, "__gnu_lto_slim") == 0)
7881
0
  break;
7882
      /* Fall through.  */
7883
0
    case SHN_MIPS_SCOMMON:
7884
0
      *secp = bfd_make_section_old_way (abfd, ".scommon");
7885
0
      (*secp)->flags |= SEC_IS_COMMON | SEC_SMALL_DATA;
7886
0
      *valp = sym->st_size;
7887
0
      break;
7888
7889
0
    case SHN_MIPS_TEXT:
7890
      /* This section is used in a shared object.  */
7891
0
      if (mips_elf_tdata (abfd)->elf_text_section == NULL)
7892
0
  {
7893
0
    asymbol *elf_text_symbol;
7894
0
    asection *elf_text_section;
7895
0
    size_t amt = sizeof (asection);
7896
7897
0
    elf_text_section = bfd_zalloc (abfd, amt);
7898
0
    if (elf_text_section == NULL)
7899
0
      return false;
7900
7901
0
    amt = sizeof (asymbol);
7902
0
    elf_text_symbol = bfd_zalloc (abfd, amt);
7903
0
    if (elf_text_symbol == NULL)
7904
0
      return false;
7905
7906
    /* Initialize the section.  */
7907
7908
0
    mips_elf_tdata (abfd)->elf_text_section = elf_text_section;
7909
7910
0
    elf_text_section->symbol = elf_text_symbol;
7911
0
    elf_text_section->name = ".text";
7912
0
    elf_text_section->flags = SEC_NO_FLAGS;
7913
0
    elf_text_section->output_section = NULL;
7914
0
    elf_text_section->owner = abfd;
7915
0
    elf_text_symbol->name = ".text";
7916
0
    elf_text_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
7917
0
    elf_text_symbol->section = elf_text_section;
7918
0
  }
7919
      /* This code used to do *secp = bfd_und_section_ptr if
7920
   bfd_link_pic (info).  I don't know why, and that doesn't make sense,
7921
   so I took it out.  */
7922
0
      *secp = mips_elf_tdata (abfd)->elf_text_section;
7923
0
      break;
7924
7925
0
    case SHN_MIPS_ACOMMON:
7926
      /* Fall through. XXX Can we treat this as allocated data?  */
7927
0
    case SHN_MIPS_DATA:
7928
      /* This section is used in a shared object.  */
7929
0
      if (mips_elf_tdata (abfd)->elf_data_section == NULL)
7930
0
  {
7931
0
    asymbol *elf_data_symbol;
7932
0
    asection *elf_data_section;
7933
0
    size_t amt = sizeof (asection);
7934
7935
0
    elf_data_section = bfd_zalloc (abfd, amt);
7936
0
    if (elf_data_section == NULL)
7937
0
      return false;
7938
7939
0
    amt = sizeof (asymbol);
7940
0
    elf_data_symbol = bfd_zalloc (abfd, amt);
7941
0
    if (elf_data_symbol == NULL)
7942
0
      return false;
7943
7944
    /* Initialize the section.  */
7945
7946
0
    mips_elf_tdata (abfd)->elf_data_section = elf_data_section;
7947
7948
0
    elf_data_section->symbol = elf_data_symbol;
7949
0
    elf_data_section->name = ".data";
7950
0
    elf_data_section->flags = SEC_NO_FLAGS;
7951
0
    elf_data_section->output_section = NULL;
7952
0
    elf_data_section->owner = abfd;
7953
0
    elf_data_symbol->name = ".data";
7954
0
    elf_data_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
7955
0
    elf_data_symbol->section = elf_data_section;
7956
0
  }
7957
      /* This code used to do *secp = bfd_und_section_ptr if
7958
   bfd_link_pic (info).  I don't know why, and that doesn't make sense,
7959
   so I took it out.  */
7960
0
      *secp = mips_elf_tdata (abfd)->elf_data_section;
7961
0
      break;
7962
7963
0
    case SHN_MIPS_SUNDEFINED:
7964
0
      *secp = bfd_und_section_ptr;
7965
0
      break;
7966
0
    }
7967
7968
0
  if (SGI_COMPAT (abfd)
7969
0
      && ! bfd_link_pic (info)
7970
0
      && info->output_bfd->xvec == abfd->xvec
7971
0
      && strcmp (*namep, "__rld_obj_head") == 0)
7972
0
    {
7973
0
      struct elf_link_hash_entry *h;
7974
0
      struct bfd_link_hash_entry *bh;
7975
7976
      /* Mark __rld_obj_head as dynamic.  */
7977
0
      bh = NULL;
7978
0
      if (! (_bfd_generic_link_add_one_symbol
7979
0
       (info, abfd, *namep, BSF_GLOBAL, *secp, *valp, NULL, false,
7980
0
        get_elf_backend_data (abfd)->collect, &bh)))
7981
0
  return false;
7982
7983
0
      h = (struct elf_link_hash_entry *) bh;
7984
0
      h->non_elf = 0;
7985
0
      h->def_regular = 1;
7986
0
      h->type = STT_OBJECT;
7987
7988
0
      if (! bfd_elf_link_record_dynamic_symbol (info, h))
7989
0
  return false;
7990
7991
0
      mips_elf_hash_table (info)->use_rld_obj_head = true;
7992
0
      mips_elf_hash_table (info)->rld_symbol = h;
7993
0
    }
7994
7995
  /* If this is a mips16 text symbol, add 1 to the value to make it
7996
     odd.  This will cause something like .word SYM to come up with
7997
     the right value when it is loaded into the PC.  */
7998
0
  if (ELF_ST_IS_COMPRESSED (sym->st_other))
7999
0
    ++*valp;
8000
8001
0
  return true;
8002
0
}
8003
8004
/* This hook function is called before the linker writes out a global
8005
   symbol.  We mark symbols as small common if appropriate.  This is
8006
   also where we undo the increment of the value for a mips16 symbol.  */
8007
8008
int
8009
_bfd_mips_elf_link_output_symbol_hook
8010
  (struct bfd_link_info *info ATTRIBUTE_UNUSED,
8011
   const char *name ATTRIBUTE_UNUSED, Elf_Internal_Sym *sym,
8012
   asection *input_sec, struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
8013
0
{
8014
  /* If we see a common symbol, which implies a relocatable link, then
8015
     if a symbol was small common in an input file, mark it as small
8016
     common in the output file.  */
8017
0
  if (sym->st_shndx == SHN_COMMON
8018
0
      && strcmp (input_sec->name, ".scommon") == 0)
8019
0
    sym->st_shndx = SHN_MIPS_SCOMMON;
8020
8021
0
  if (ELF_ST_IS_COMPRESSED (sym->st_other))
8022
0
    sym->st_value &= ~1;
8023
8024
0
  return 1;
8025
0
}
8026

8027
/* Functions for the dynamic linker.  */
8028
8029
/* Create dynamic sections when linking against a dynamic object.  */
8030
8031
bool
8032
_bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
8033
0
{
8034
0
  struct elf_link_hash_entry *h;
8035
0
  struct bfd_link_hash_entry *bh;
8036
0
  flagword flags;
8037
0
  register asection *s;
8038
0
  const char * const *namep;
8039
0
  struct mips_elf_link_hash_table *htab;
8040
8041
0
  htab = mips_elf_hash_table (info);
8042
0
  BFD_ASSERT (htab != NULL);
8043
8044
0
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
8045
0
     | SEC_LINKER_CREATED | SEC_READONLY);
8046
8047
  /* The psABI requires a read-only .dynamic section, but the VxWorks
8048
     EABI doesn't.  */
8049
0
  if (htab->root.target_os != is_vxworks)
8050
0
    {
8051
0
      s = bfd_get_linker_section (abfd, ".dynamic");
8052
0
      if (s != NULL)
8053
0
  {
8054
0
    if (!bfd_set_section_flags (s, flags))
8055
0
      return false;
8056
0
  }
8057
0
    }
8058
8059
  /* We need to create .got section.  */
8060
0
  if (!mips_elf_create_got_section (abfd, info))
8061
0
    return false;
8062
8063
0
  if (! mips_elf_rel_dyn_section (info, true))
8064
0
    return false;
8065
8066
  /* Create .stub section.  */
8067
0
  s = bfd_make_section_anyway_with_flags (abfd,
8068
0
            MIPS_ELF_STUB_SECTION_NAME (abfd),
8069
0
            flags | SEC_CODE);
8070
0
  if (s == NULL
8071
0
      || !bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd)))
8072
0
    return false;
8073
0
  htab->sstubs = s;
8074
8075
0
  if (!mips_elf_hash_table (info)->use_rld_obj_head
8076
0
      && bfd_link_executable (info)
8077
0
      && bfd_get_linker_section (abfd, ".rld_map") == NULL)
8078
0
    {
8079
0
      s = bfd_make_section_anyway_with_flags (abfd, ".rld_map",
8080
0
                flags &~ (flagword) SEC_READONLY);
8081
0
      if (s == NULL
8082
0
    || !bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd)))
8083
0
  return false;
8084
0
    }
8085
8086
  /* Create .MIPS.xhash section.  */
8087
0
  if (info->emit_gnu_hash)
8088
0
    s = bfd_make_section_anyway_with_flags (abfd, ".MIPS.xhash",
8089
0
              flags | SEC_READONLY);
8090
8091
  /* On IRIX5, we adjust add some additional symbols and change the
8092
     alignments of several sections.  There is no ABI documentation
8093
     indicating that this is necessary on IRIX6, nor any evidence that
8094
     the linker takes such action.  */
8095
0
  if (IRIX_COMPAT (abfd) == ict_irix5)
8096
0
    {
8097
0
      for (namep = mips_elf_dynsym_rtproc_names; *namep != NULL; namep++)
8098
0
  {
8099
0
    bh = NULL;
8100
0
    if (! (_bfd_generic_link_add_one_symbol
8101
0
     (info, abfd, *namep, BSF_GLOBAL, bfd_und_section_ptr, 0,
8102
0
      NULL, false, get_elf_backend_data (abfd)->collect, &bh)))
8103
0
      return false;
8104
8105
0
    h = (struct elf_link_hash_entry *) bh;
8106
0
    h->mark = 1;
8107
0
    h->non_elf = 0;
8108
0
    h->def_regular = 1;
8109
0
    h->type = STT_SECTION;
8110
8111
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
8112
0
      return false;
8113
0
  }
8114
8115
      /* We need to create a .compact_rel section.  */
8116
0
      if (SGI_COMPAT (abfd))
8117
0
  {
8118
0
    if (!mips_elf_create_compact_rel_section (abfd, info))
8119
0
      return false;
8120
0
  }
8121
8122
      /* Change alignments of some sections.  */
8123
0
      s = bfd_get_linker_section (abfd, ".hash");
8124
0
      if (s != NULL)
8125
0
  bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
8126
8127
0
      s = bfd_get_linker_section (abfd, ".dynsym");
8128
0
      if (s != NULL)
8129
0
  bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
8130
8131
0
      s = bfd_get_linker_section (abfd, ".dynstr");
8132
0
      if (s != NULL)
8133
0
  bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
8134
8135
      /* ??? */
8136
0
      s = bfd_get_section_by_name (abfd, ".reginfo");
8137
0
      if (s != NULL)
8138
0
  bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
8139
8140
0
      s = bfd_get_linker_section (abfd, ".dynamic");
8141
0
      if (s != NULL)
8142
0
  bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
8143
0
    }
8144
8145
0
  if (bfd_link_executable (info))
8146
0
    {
8147
0
      const char *name;
8148
8149
0
      name = SGI_COMPAT (abfd) ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING";
8150
0
      bh = NULL;
8151
0
      if (!(_bfd_generic_link_add_one_symbol
8152
0
      (info, abfd, name, BSF_GLOBAL, bfd_abs_section_ptr, 0,
8153
0
       NULL, false, get_elf_backend_data (abfd)->collect, &bh)))
8154
0
  return false;
8155
8156
0
      h = (struct elf_link_hash_entry *) bh;
8157
0
      h->non_elf = 0;
8158
0
      h->def_regular = 1;
8159
0
      h->type = STT_SECTION;
8160
8161
0
      if (! bfd_elf_link_record_dynamic_symbol (info, h))
8162
0
  return false;
8163
8164
0
      if (! mips_elf_hash_table (info)->use_rld_obj_head)
8165
0
  {
8166
    /* __rld_map is a four byte word located in the .data section
8167
       and is filled in by the rtld to contain a pointer to
8168
       the _r_debug structure. Its symbol value will be set in
8169
       _bfd_mips_elf_finish_dynamic_symbol.  */
8170
0
    s = bfd_get_linker_section (abfd, ".rld_map");
8171
0
    BFD_ASSERT (s != NULL);
8172
8173
0
    name = SGI_COMPAT (abfd) ? "__rld_map" : "__RLD_MAP";
8174
0
    bh = NULL;
8175
0
    if (!(_bfd_generic_link_add_one_symbol
8176
0
    (info, abfd, name, BSF_GLOBAL, s, 0, NULL, false,
8177
0
     get_elf_backend_data (abfd)->collect, &bh)))
8178
0
      return false;
8179
8180
0
    h = (struct elf_link_hash_entry *) bh;
8181
0
    h->non_elf = 0;
8182
0
    h->def_regular = 1;
8183
0
    h->type = STT_OBJECT;
8184
8185
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
8186
0
      return false;
8187
0
    mips_elf_hash_table (info)->rld_symbol = h;
8188
0
  }
8189
0
    }
8190
8191
  /* Create the .plt, .rel(a).plt, .dynbss and .rel(a).bss sections.
8192
     Also, on VxWorks, create the _PROCEDURE_LINKAGE_TABLE_ symbol.  */
8193
0
  if (!_bfd_elf_create_dynamic_sections (abfd, info))
8194
0
    return false;
8195
8196
  /* Do the usual VxWorks handling.  */
8197
0
  if (htab->root.target_os == is_vxworks
8198
0
      && !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
8199
0
    return false;
8200
8201
0
  return true;
8202
0
}
8203

8204
/* Return true if relocation REL against section SEC is a REL rather than
8205
   RELA relocation.  RELOCS is the first relocation in the section and
8206
   ABFD is the bfd that contains SEC.  */
8207
8208
static bool
8209
mips_elf_rel_relocation_p (bfd *abfd, asection *sec,
8210
         const Elf_Internal_Rela *relocs,
8211
         const Elf_Internal_Rela *rel)
8212
0
{
8213
0
  Elf_Internal_Shdr *rel_hdr;
8214
0
  const struct elf_backend_data *bed;
8215
8216
  /* To determine which flavor of relocation this is, we depend on the
8217
     fact that the INPUT_SECTION's REL_HDR is read before RELA_HDR.  */
8218
0
  rel_hdr = elf_section_data (sec)->rel.hdr;
8219
0
  if (rel_hdr == NULL)
8220
0
    return false;
8221
0
  bed = get_elf_backend_data (abfd);
8222
0
  return ((size_t) (rel - relocs)
8223
0
    < NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel);
8224
0
}
8225
8226
/* Read the addend for REL relocation REL, which belongs to bfd ABFD.
8227
   HOWTO is the relocation's howto and CONTENTS points to the contents
8228
   of the section that REL is against.  */
8229
8230
static bfd_vma
8231
mips_elf_read_rel_addend (bfd *abfd, asection *sec,
8232
        const Elf_Internal_Rela *rel,
8233
        reloc_howto_type *howto, bfd_byte *contents)
8234
0
{
8235
0
  bfd_byte *location;
8236
0
  unsigned int r_type;
8237
0
  bfd_vma addend;
8238
0
  bfd_vma bytes;
8239
8240
0
  if (!bfd_reloc_offset_in_range (howto, abfd, sec, rel->r_offset))
8241
0
    return 0;
8242
8243
0
  r_type = ELF_R_TYPE (abfd, rel->r_info);
8244
0
  location = contents + rel->r_offset;
8245
8246
  /* Get the addend, which is stored in the input file.  */
8247
0
  _bfd_mips_elf_reloc_unshuffle (abfd, r_type, false, location);
8248
0
  bytes = mips_elf_obtain_contents (howto, rel, abfd, contents);
8249
0
  _bfd_mips_elf_reloc_shuffle (abfd, r_type, false, location);
8250
8251
0
  addend = bytes & howto->src_mask;
8252
8253
  /* Shift is 2, unusually, for microMIPS JALX.  Adjust the addend
8254
     accordingly.  */
8255
0
  if (r_type == R_MICROMIPS_26_S1 && (bytes >> 26) == 0x3c)
8256
0
    addend <<= 1;
8257
8258
0
  return addend;
8259
0
}
8260
8261
/* REL is a relocation in ABFD that needs a partnering LO16 relocation
8262
   and *ADDEND is the addend for REL itself.  Look for the LO16 relocation
8263
   and update *ADDEND with the final addend.  Return true on success
8264
   or false if the LO16 could not be found.  RELEND is the exclusive
8265
   upper bound on the relocations for REL's section.  */
8266
8267
static bool
8268
mips_elf_add_lo16_rel_addend (bfd *abfd,
8269
            asection *sec,
8270
            const Elf_Internal_Rela *rel,
8271
            const Elf_Internal_Rela *relend,
8272
            bfd_byte *contents, bfd_vma *addend)
8273
0
{
8274
0
  unsigned int r_type, lo16_type;
8275
0
  const Elf_Internal_Rela *lo16_relocation;
8276
0
  reloc_howto_type *lo16_howto;
8277
0
  bfd_vma l;
8278
8279
0
  r_type = ELF_R_TYPE (abfd, rel->r_info);
8280
0
  if (mips16_reloc_p (r_type))
8281
0
    lo16_type = R_MIPS16_LO16;
8282
0
  else if (micromips_reloc_p (r_type))
8283
0
    lo16_type = R_MICROMIPS_LO16;
8284
0
  else if (r_type == R_MIPS_PCHI16)
8285
0
    lo16_type = R_MIPS_PCLO16;
8286
0
  else
8287
0
    lo16_type = R_MIPS_LO16;
8288
8289
  /* The combined value is the sum of the HI16 addend, left-shifted by
8290
     sixteen bits, and the LO16 addend, sign extended.  (Usually, the
8291
     code does a `lui' of the HI16 value, and then an `addiu' of the
8292
     LO16 value.)
8293
8294
     Scan ahead to find a matching LO16 relocation.
8295
8296
     According to the MIPS ELF ABI, the R_MIPS_LO16 relocation must
8297
     be immediately following.  However, for the IRIX6 ABI, the next
8298
     relocation may be a composed relocation consisting of several
8299
     relocations for the same address.  In that case, the R_MIPS_LO16
8300
     relocation may occur as one of these.  We permit a similar
8301
     extension in general, as that is useful for GCC.
8302
8303
     In some cases GCC dead code elimination removes the LO16 but keeps
8304
     the corresponding HI16.  This is strictly speaking a violation of
8305
     the ABI but not immediately harmful.  */
8306
0
  lo16_relocation = mips_elf_next_relocation (abfd, lo16_type, rel, relend);
8307
0
  if (lo16_relocation == NULL)
8308
0
    return false;
8309
8310
  /* Obtain the addend kept there.  */
8311
0
  lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, lo16_type, false);
8312
0
  l = mips_elf_read_rel_addend (abfd, sec, lo16_relocation, lo16_howto,
8313
0
        contents);
8314
8315
0
  l <<= lo16_howto->rightshift;
8316
0
  l = _bfd_mips_elf_sign_extend (l, 16);
8317
8318
0
  *addend <<= 16;
8319
0
  *addend += l;
8320
0
  return true;
8321
0
}
8322
8323
/* Try to read the contents of section SEC in bfd ABFD.  Return true and
8324
   store the contents in *CONTENTS on success.  Assume that *CONTENTS
8325
   already holds the contents if it is nonull on entry.  */
8326
8327
static bool
8328
mips_elf_get_section_contents (bfd *abfd, asection *sec, bfd_byte **contents)
8329
0
{
8330
0
  if (*contents)
8331
0
    return true;
8332
8333
  /* Get cached copy if it exists.  */
8334
0
  if (elf_section_data (sec)->this_hdr.contents != NULL)
8335
0
    {
8336
0
      *contents = elf_section_data (sec)->this_hdr.contents;
8337
0
      return true;
8338
0
    }
8339
8340
0
  return bfd_malloc_and_get_section (abfd, sec, contents);
8341
0
}
8342
8343
/* Make a new PLT record to keep internal data.  */
8344
8345
static struct plt_entry *
8346
mips_elf_make_plt_record (bfd *abfd)
8347
0
{
8348
0
  struct plt_entry *entry;
8349
8350
0
  entry = bfd_zalloc (abfd, sizeof (*entry));
8351
0
  if (entry == NULL)
8352
0
    return NULL;
8353
8354
0
  entry->stub_offset = MINUS_ONE;
8355
0
  entry->mips_offset = MINUS_ONE;
8356
0
  entry->comp_offset = MINUS_ONE;
8357
0
  entry->gotplt_index = MINUS_ONE;
8358
0
  return entry;
8359
0
}
8360
8361
/* Define the special `__gnu_absolute_zero' symbol.  We only need this
8362
   for PIC code, as otherwise there is no load-time relocation involved
8363
   and local GOT entries whose value is zero at static link time will
8364
   retain their value at load time.  */
8365
8366
static bool
8367
mips_elf_define_absolute_zero (bfd *abfd, struct bfd_link_info *info,
8368
             struct mips_elf_link_hash_table *htab,
8369
             unsigned int r_type)
8370
0
{
8371
0
  union
8372
0
    {
8373
0
      struct elf_link_hash_entry *eh;
8374
0
      struct bfd_link_hash_entry *bh;
8375
0
    }
8376
0
  hzero;
8377
8378
0
  BFD_ASSERT (!htab->use_absolute_zero);
8379
0
  BFD_ASSERT (bfd_link_pic (info));
8380
8381
0
  hzero.bh = NULL;
8382
0
  if (!_bfd_generic_link_add_one_symbol (info, abfd, "__gnu_absolute_zero",
8383
0
           BSF_GLOBAL, bfd_abs_section_ptr, 0,
8384
0
           NULL, false, false, &hzero.bh))
8385
0
    return false;
8386
8387
0
  BFD_ASSERT (hzero.bh != NULL);
8388
0
  hzero.eh->size = 0;
8389
0
  hzero.eh->type = STT_NOTYPE;
8390
0
  hzero.eh->other = STV_PROTECTED;
8391
0
  hzero.eh->def_regular = 1;
8392
0
  hzero.eh->non_elf = 0;
8393
8394
0
  if (!mips_elf_record_global_got_symbol (hzero.eh, abfd, info, true, r_type))
8395
0
    return false;
8396
8397
0
  htab->use_absolute_zero = true;
8398
8399
0
  return true;
8400
0
}
8401
8402
/* Look through the relocs for a section during the first phase, and
8403
   allocate space in the global offset table and record the need for
8404
   standard MIPS and compressed procedure linkage table entries.  */
8405
8406
bool
8407
_bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
8408
          asection *sec, const Elf_Internal_Rela *relocs)
8409
0
{
8410
0
  const char *name;
8411
0
  bfd *dynobj;
8412
0
  Elf_Internal_Shdr *symtab_hdr;
8413
0
  struct elf_link_hash_entry **sym_hashes;
8414
0
  size_t extsymoff;
8415
0
  const Elf_Internal_Rela *rel;
8416
0
  const Elf_Internal_Rela *rel_end;
8417
0
  asection *sreloc;
8418
0
  const struct elf_backend_data *bed;
8419
0
  struct mips_elf_link_hash_table *htab;
8420
0
  bfd_byte *contents;
8421
0
  bfd_vma addend;
8422
0
  reloc_howto_type *howto;
8423
8424
0
  if (bfd_link_relocatable (info))
8425
0
    return true;
8426
8427
0
  htab = mips_elf_hash_table (info);
8428
0
  BFD_ASSERT (htab != NULL);
8429
8430
0
  dynobj = elf_hash_table (info)->dynobj;
8431
0
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8432
0
  sym_hashes = elf_sym_hashes (abfd);
8433
0
  extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
8434
8435
0
  bed = get_elf_backend_data (abfd);
8436
0
  rel_end = relocs + sec->reloc_count;
8437
8438
  /* Check for the mips16 stub sections.  */
8439
8440
0
  name = bfd_section_name (sec);
8441
0
  if (FN_STUB_P (name))
8442
0
    {
8443
0
      unsigned long r_symndx;
8444
8445
      /* Look at the relocation information to figure out which symbol
8446
   this is for.  */
8447
8448
0
      r_symndx = mips16_stub_symndx (bed, sec, relocs, rel_end);
8449
0
      if (r_symndx == 0)
8450
0
  {
8451
0
    _bfd_error_handler
8452
      /* xgettext:c-format */
8453
0
      (_("%pB: warning: cannot determine the target function for"
8454
0
         " stub section `%s'"),
8455
0
       abfd, name);
8456
0
    bfd_set_error (bfd_error_bad_value);
8457
0
    return false;
8458
0
  }
8459
8460
0
      if (r_symndx < extsymoff
8461
0
    || sym_hashes[r_symndx - extsymoff] == NULL)
8462
0
  {
8463
0
    asection *o;
8464
8465
    /* This stub is for a local symbol.  This stub will only be
8466
       needed if there is some relocation in this BFD, other
8467
       than a 16 bit function call, which refers to this symbol.  */
8468
0
    for (o = abfd->sections; o != NULL; o = o->next)
8469
0
      {
8470
0
        Elf_Internal_Rela *sec_relocs;
8471
0
        const Elf_Internal_Rela *r, *rend;
8472
8473
        /* We can ignore stub sections when looking for relocs.  */
8474
0
        if ((o->flags & SEC_RELOC) == 0
8475
0
      || o->reloc_count == 0
8476
0
      || section_allows_mips16_refs_p (o))
8477
0
    continue;
8478
8479
0
        sec_relocs
8480
0
    = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
8481
0
               info->keep_memory);
8482
0
        if (sec_relocs == NULL)
8483
0
    return false;
8484
8485
0
        rend = sec_relocs + o->reloc_count;
8486
0
        for (r = sec_relocs; r < rend; r++)
8487
0
    if (ELF_R_SYM (abfd, r->r_info) == r_symndx
8488
0
        && !mips16_call_reloc_p (ELF_R_TYPE (abfd, r->r_info)))
8489
0
      break;
8490
8491
0
        if (elf_section_data (o)->relocs != sec_relocs)
8492
0
    free (sec_relocs);
8493
8494
0
        if (r < rend)
8495
0
    break;
8496
0
      }
8497
8498
0
    if (o == NULL)
8499
0
      {
8500
        /* There is no non-call reloc for this stub, so we do
8501
     not need it.  Since this function is called before
8502
     the linker maps input sections to output sections, we
8503
     can easily discard it by setting the SEC_EXCLUDE
8504
     flag.  */
8505
0
        sec->flags |= SEC_EXCLUDE;
8506
0
        return true;
8507
0
      }
8508
8509
    /* Record this stub in an array of local symbol stubs for
8510
       this BFD.  */
8511
0
    if (mips_elf_tdata (abfd)->local_stubs == NULL)
8512
0
      {
8513
0
        unsigned long symcount;
8514
0
        asection **n;
8515
0
        bfd_size_type amt;
8516
8517
0
        if (elf_bad_symtab (abfd))
8518
0
    symcount = NUM_SHDR_ENTRIES (symtab_hdr);
8519
0
        else
8520
0
    symcount = symtab_hdr->sh_info;
8521
0
        amt = symcount * sizeof (asection *);
8522
0
        n = bfd_zalloc (abfd, amt);
8523
0
        if (n == NULL)
8524
0
    return false;
8525
0
        mips_elf_tdata (abfd)->local_stubs = n;
8526
0
      }
8527
8528
0
    sec->flags |= SEC_KEEP;
8529
0
    mips_elf_tdata (abfd)->local_stubs[r_symndx] = sec;
8530
8531
    /* We don't need to set mips16_stubs_seen in this case.
8532
       That flag is used to see whether we need to look through
8533
       the global symbol table for stubs.  We don't need to set
8534
       it here, because we just have a local stub.  */
8535
0
  }
8536
0
      else
8537
0
  {
8538
0
    struct mips_elf_link_hash_entry *h;
8539
8540
0
    h = ((struct mips_elf_link_hash_entry *)
8541
0
         sym_hashes[r_symndx - extsymoff]);
8542
8543
0
    while (h->root.root.type == bfd_link_hash_indirect
8544
0
     || h->root.root.type == bfd_link_hash_warning)
8545
0
      h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
8546
8547
    /* H is the symbol this stub is for.  */
8548
8549
    /* If we already have an appropriate stub for this function, we
8550
       don't need another one, so we can discard this one.  Since
8551
       this function is called before the linker maps input sections
8552
       to output sections, we can easily discard it by setting the
8553
       SEC_EXCLUDE flag.  */
8554
0
    if (h->fn_stub != NULL)
8555
0
      {
8556
0
        sec->flags |= SEC_EXCLUDE;
8557
0
        return true;
8558
0
      }
8559
8560
0
    sec->flags |= SEC_KEEP;
8561
0
    h->fn_stub = sec;
8562
0
    mips_elf_hash_table (info)->mips16_stubs_seen = true;
8563
0
  }
8564
0
    }
8565
0
  else if (CALL_STUB_P (name) || CALL_FP_STUB_P (name))
8566
0
    {
8567
0
      unsigned long r_symndx;
8568
0
      struct mips_elf_link_hash_entry *h;
8569
0
      asection **loc;
8570
8571
      /* Look at the relocation information to figure out which symbol
8572
   this is for.  */
8573
8574
0
      r_symndx = mips16_stub_symndx (bed, sec, relocs, rel_end);
8575
0
      if (r_symndx == 0)
8576
0
  {
8577
0
    _bfd_error_handler
8578
      /* xgettext:c-format */
8579
0
      (_("%pB: warning: cannot determine the target function for"
8580
0
         " stub section `%s'"),
8581
0
       abfd, name);
8582
0
    bfd_set_error (bfd_error_bad_value);
8583
0
    return false;
8584
0
  }
8585
8586
0
      if (r_symndx < extsymoff
8587
0
    || sym_hashes[r_symndx - extsymoff] == NULL)
8588
0
  {
8589
0
    asection *o;
8590
8591
    /* This stub is for a local symbol.  This stub will only be
8592
       needed if there is some relocation (R_MIPS16_26) in this BFD
8593
       that refers to this symbol.  */
8594
0
    for (o = abfd->sections; o != NULL; o = o->next)
8595
0
      {
8596
0
        Elf_Internal_Rela *sec_relocs;
8597
0
        const Elf_Internal_Rela *r, *rend;
8598
8599
        /* We can ignore stub sections when looking for relocs.  */
8600
0
        if ((o->flags & SEC_RELOC) == 0
8601
0
      || o->reloc_count == 0
8602
0
      || section_allows_mips16_refs_p (o))
8603
0
    continue;
8604
8605
0
        sec_relocs
8606
0
    = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
8607
0
               info->keep_memory);
8608
0
        if (sec_relocs == NULL)
8609
0
    return false;
8610
8611
0
        rend = sec_relocs + o->reloc_count;
8612
0
        for (r = sec_relocs; r < rend; r++)
8613
0
    if (ELF_R_SYM (abfd, r->r_info) == r_symndx
8614
0
        && ELF_R_TYPE (abfd, r->r_info) == R_MIPS16_26)
8615
0
        break;
8616
8617
0
        if (elf_section_data (o)->relocs != sec_relocs)
8618
0
    free (sec_relocs);
8619
8620
0
        if (r < rend)
8621
0
    break;
8622
0
      }
8623
8624
0
    if (o == NULL)
8625
0
      {
8626
        /* There is no non-call reloc for this stub, so we do
8627
     not need it.  Since this function is called before
8628
     the linker maps input sections to output sections, we
8629
     can easily discard it by setting the SEC_EXCLUDE
8630
     flag.  */
8631
0
        sec->flags |= SEC_EXCLUDE;
8632
0
        return true;
8633
0
      }
8634
8635
    /* Record this stub in an array of local symbol call_stubs for
8636
       this BFD.  */
8637
0
    if (mips_elf_tdata (abfd)->local_call_stubs == NULL)
8638
0
      {
8639
0
        unsigned long symcount;
8640
0
        asection **n;
8641
0
        bfd_size_type amt;
8642
8643
0
        if (elf_bad_symtab (abfd))
8644
0
    symcount = NUM_SHDR_ENTRIES (symtab_hdr);
8645
0
        else
8646
0
    symcount = symtab_hdr->sh_info;
8647
0
        amt = symcount * sizeof (asection *);
8648
0
        n = bfd_zalloc (abfd, amt);
8649
0
        if (n == NULL)
8650
0
    return false;
8651
0
        mips_elf_tdata (abfd)->local_call_stubs = n;
8652
0
      }
8653
8654
0
    sec->flags |= SEC_KEEP;
8655
0
    mips_elf_tdata (abfd)->local_call_stubs[r_symndx] = sec;
8656
8657
    /* We don't need to set mips16_stubs_seen in this case.
8658
       That flag is used to see whether we need to look through
8659
       the global symbol table for stubs.  We don't need to set
8660
       it here, because we just have a local stub.  */
8661
0
  }
8662
0
      else
8663
0
  {
8664
0
    h = ((struct mips_elf_link_hash_entry *)
8665
0
         sym_hashes[r_symndx - extsymoff]);
8666
8667
    /* H is the symbol this stub is for.  */
8668
8669
0
    if (CALL_FP_STUB_P (name))
8670
0
      loc = &h->call_fp_stub;
8671
0
    else
8672
0
      loc = &h->call_stub;
8673
8674
    /* If we already have an appropriate stub for this function, we
8675
       don't need another one, so we can discard this one.  Since
8676
       this function is called before the linker maps input sections
8677
       to output sections, we can easily discard it by setting the
8678
       SEC_EXCLUDE flag.  */
8679
0
    if (*loc != NULL)
8680
0
      {
8681
0
        sec->flags |= SEC_EXCLUDE;
8682
0
        return true;
8683
0
      }
8684
8685
0
    sec->flags |= SEC_KEEP;
8686
0
    *loc = sec;
8687
0
    mips_elf_hash_table (info)->mips16_stubs_seen = true;
8688
0
  }
8689
0
    }
8690
8691
0
  sreloc = NULL;
8692
0
  contents = NULL;
8693
0
  for (rel = relocs; rel < rel_end; ++rel)
8694
0
    {
8695
0
      unsigned long r_symndx;
8696
0
      unsigned int r_type;
8697
0
      struct elf_link_hash_entry *h;
8698
0
      bool can_make_dynamic_p;
8699
0
      bool call_reloc_p;
8700
0
      bool constrain_symbol_p;
8701
8702
0
      r_symndx = ELF_R_SYM (abfd, rel->r_info);
8703
0
      r_type = ELF_R_TYPE (abfd, rel->r_info);
8704
8705
0
      if (r_symndx < extsymoff)
8706
0
  h = NULL;
8707
0
      else if (r_symndx >= extsymoff + NUM_SHDR_ENTRIES (symtab_hdr))
8708
0
  {
8709
0
    _bfd_error_handler
8710
      /* xgettext:c-format */
8711
0
      (_("%pB: malformed reloc detected for section %s"),
8712
0
       abfd, name);
8713
0
    bfd_set_error (bfd_error_bad_value);
8714
0
    return false;
8715
0
  }
8716
0
      else
8717
0
  {
8718
0
    h = sym_hashes[r_symndx - extsymoff];
8719
0
    if (h != NULL)
8720
0
      {
8721
0
        while (h->root.type == bfd_link_hash_indirect
8722
0
         || h->root.type == bfd_link_hash_warning)
8723
0
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
8724
0
      }
8725
0
  }
8726
8727
      /* Set CAN_MAKE_DYNAMIC_P to true if we can convert this
8728
   relocation into a dynamic one.  */
8729
0
      can_make_dynamic_p = false;
8730
8731
      /* Set CALL_RELOC_P to true if the relocation is for a call,
8732
   and if pointer equality therefore doesn't matter.  */
8733
0
      call_reloc_p = false;
8734
8735
      /* Set CONSTRAIN_SYMBOL_P if we need to take the relocation
8736
   into account when deciding how to define the symbol.  */
8737
0
      constrain_symbol_p = true;
8738
8739
0
      switch (r_type)
8740
0
  {
8741
0
  case R_MIPS_CALL16:
8742
0
  case R_MIPS_CALL_HI16:
8743
0
  case R_MIPS_CALL_LO16:
8744
0
  case R_MIPS16_CALL16:
8745
0
  case R_MICROMIPS_CALL16:
8746
0
  case R_MICROMIPS_CALL_HI16:
8747
0
  case R_MICROMIPS_CALL_LO16:
8748
0
    call_reloc_p = true;
8749
    /* Fall through.  */
8750
8751
0
  case R_MIPS_GOT16:
8752
0
  case R_MIPS_GOT_LO16:
8753
0
  case R_MIPS_GOT_PAGE:
8754
0
  case R_MIPS_GOT_DISP:
8755
0
  case R_MIPS16_GOT16:
8756
0
  case R_MICROMIPS_GOT16:
8757
0
  case R_MICROMIPS_GOT_LO16:
8758
0
  case R_MICROMIPS_GOT_PAGE:
8759
0
  case R_MICROMIPS_GOT_DISP:
8760
    /* If we have a symbol that will resolve to zero at static link
8761
       time and it is used by a GOT relocation applied to code we
8762
       cannot relax to an immediate zero load, then we will be using
8763
       the special `__gnu_absolute_zero' symbol whose value is zero
8764
       at dynamic load time.  We ignore HI16-type GOT relocations at
8765
       this stage, because their handling will depend entirely on
8766
       the corresponding LO16-type GOT relocation.  */
8767
0
    if (!call_hi16_reloc_p (r_type)
8768
0
        && h != NULL
8769
0
        && bfd_link_pic (info)
8770
0
        && !htab->use_absolute_zero
8771
0
        && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
8772
0
      {
8773
0
        bool rel_reloc;
8774
8775
0
        if (!mips_elf_get_section_contents (abfd, sec, &contents))
8776
0
    return false;
8777
8778
0
        rel_reloc = mips_elf_rel_relocation_p (abfd, sec, relocs, rel);
8779
0
        howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, !rel_reloc);
8780
0
        if (bfd_reloc_offset_in_range (howto, abfd, sec, rel->r_offset))
8781
0
    if (!mips_elf_nullify_got_load (abfd, contents, rel, howto,
8782
0
            false))
8783
0
      if (!mips_elf_define_absolute_zero (abfd, info, htab,
8784
0
                  r_type))
8785
0
        return false;
8786
0
      }
8787
8788
    /* Fall through.  */
8789
0
  case R_MIPS_GOT_HI16:
8790
0
  case R_MIPS_GOT_OFST:
8791
0
  case R_MIPS_TLS_GOTTPREL:
8792
0
  case R_MIPS_TLS_GD:
8793
0
  case R_MIPS_TLS_LDM:
8794
0
  case R_MIPS16_TLS_GOTTPREL:
8795
0
  case R_MIPS16_TLS_GD:
8796
0
  case R_MIPS16_TLS_LDM:
8797
0
  case R_MICROMIPS_GOT_HI16:
8798
0
  case R_MICROMIPS_GOT_OFST:
8799
0
  case R_MICROMIPS_TLS_GOTTPREL:
8800
0
  case R_MICROMIPS_TLS_GD:
8801
0
  case R_MICROMIPS_TLS_LDM:
8802
0
    if (dynobj == NULL)
8803
0
      elf_hash_table (info)->dynobj = dynobj = abfd;
8804
0
    if (!mips_elf_create_got_section (dynobj, info))
8805
0
      return false;
8806
0
    if (htab->root.target_os == is_vxworks
8807
0
        && !bfd_link_pic (info))
8808
0
      {
8809
0
        _bfd_error_handler
8810
    /* xgettext:c-format */
8811
0
    (_("%pB: GOT reloc at %#" PRIx64 " not expected in executables"),
8812
0
     abfd, (uint64_t) rel->r_offset);
8813
0
        bfd_set_error (bfd_error_bad_value);
8814
0
        return false;
8815
0
      }
8816
0
    can_make_dynamic_p = true;
8817
0
    break;
8818
8819
0
  case R_MIPS_NONE:
8820
0
  case R_MIPS_JALR:
8821
0
  case R_MICROMIPS_JALR:
8822
    /* These relocations have empty fields and are purely there to
8823
       provide link information.  The symbol value doesn't matter.  */
8824
0
    constrain_symbol_p = false;
8825
0
    break;
8826
8827
0
  case R_MIPS_GPREL16:
8828
0
  case R_MIPS_GPREL32:
8829
0
  case R_MIPS16_GPREL:
8830
0
  case R_MICROMIPS_GPREL16:
8831
    /* GP-relative relocations always resolve to a definition in a
8832
       regular input file, ignoring the one-definition rule.  This is
8833
       important for the GP setup sequence in NewABI code, which
8834
       always resolves to a local function even if other relocations
8835
       against the symbol wouldn't.  */
8836
0
    constrain_symbol_p = false;
8837
0
    break;
8838
8839
0
  case R_MIPS_32:
8840
0
  case R_MIPS_REL32:
8841
0
  case R_MIPS_64:
8842
    /* In VxWorks executables, references to external symbols
8843
       must be handled using copy relocs or PLT entries; it is not
8844
       possible to convert this relocation into a dynamic one.
8845
8846
       For executables that use PLTs and copy-relocs, we have a
8847
       choice between converting the relocation into a dynamic
8848
       one or using copy relocations or PLT entries.  It is
8849
       usually better to do the former, unless the relocation is
8850
       against a read-only section.  */
8851
0
    if ((bfd_link_pic (info)
8852
0
         || (h != NULL
8853
0
       && htab->root.target_os != is_vxworks
8854
0
       && strcmp (h->root.root.string, "__gnu_local_gp") != 0
8855
0
       && !(!info->nocopyreloc
8856
0
      && !PIC_OBJECT_P (abfd)
8857
0
      && MIPS_ELF_READONLY_SECTION (sec))))
8858
0
        && (sec->flags & SEC_ALLOC) != 0)
8859
0
      {
8860
0
        can_make_dynamic_p = true;
8861
0
        if (dynobj == NULL)
8862
0
    elf_hash_table (info)->dynobj = dynobj = abfd;
8863
0
      }
8864
0
    break;
8865
8866
0
  case R_MIPS_26:
8867
0
  case R_MIPS_PC16:
8868
0
  case R_MIPS_PC21_S2:
8869
0
  case R_MIPS_PC26_S2:
8870
0
  case R_MIPS16_26:
8871
0
  case R_MIPS16_PC16_S1:
8872
0
  case R_MICROMIPS_26_S1:
8873
0
  case R_MICROMIPS_PC7_S1:
8874
0
  case R_MICROMIPS_PC10_S1:
8875
0
  case R_MICROMIPS_PC16_S1:
8876
0
  case R_MICROMIPS_PC23_S2:
8877
0
    call_reloc_p = true;
8878
0
    break;
8879
0
  }
8880
8881
0
      if (h)
8882
0
  {
8883
0
    if (constrain_symbol_p)
8884
0
      {
8885
0
        if (!can_make_dynamic_p)
8886
0
    ((struct mips_elf_link_hash_entry *) h)->has_static_relocs = 1;
8887
8888
0
        if (!call_reloc_p)
8889
0
    h->pointer_equality_needed = 1;
8890
8891
        /* We must not create a stub for a symbol that has
8892
     relocations related to taking the function's address.
8893
     This doesn't apply to VxWorks, where CALL relocs refer
8894
     to a .got.plt entry instead of a normal .got entry.  */
8895
0
        if (htab->root.target_os != is_vxworks
8896
0
      && (!can_make_dynamic_p || !call_reloc_p))
8897
0
    ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = true;
8898
0
      }
8899
8900
    /* Relocations against the special VxWorks __GOTT_BASE__ and
8901
       __GOTT_INDEX__ symbols must be left to the loader.  Allocate
8902
       room for them in .rela.dyn.  */
8903
0
    if (is_gott_symbol (info, h))
8904
0
      {
8905
0
        if (sreloc == NULL)
8906
0
    {
8907
0
      sreloc = mips_elf_rel_dyn_section (info, true);
8908
0
      if (sreloc == NULL)
8909
0
        return false;
8910
0
    }
8911
0
        mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
8912
0
        if (MIPS_ELF_READONLY_SECTION (sec))
8913
    /* We tell the dynamic linker that there are
8914
       relocations against the text segment.  */
8915
0
    info->flags |= DF_TEXTREL;
8916
0
      }
8917
0
  }
8918
0
      else if (call_lo16_reloc_p (r_type)
8919
0
         || got_lo16_reloc_p (r_type)
8920
0
         || got_disp_reloc_p (r_type)
8921
0
         || (got16_reloc_p (r_type)
8922
0
       && htab->root.target_os == is_vxworks))
8923
0
  {
8924
    /* We may need a local GOT entry for this relocation.  We
8925
       don't count R_MIPS_GOT_PAGE because we can estimate the
8926
       maximum number of pages needed by looking at the size of
8927
       the segment.  Similar comments apply to R_MIPS*_GOT16 and
8928
       R_MIPS*_CALL16, except on VxWorks, where GOT relocations
8929
       always evaluate to "G".  We don't count R_MIPS_GOT_HI16, or
8930
       R_MIPS_CALL_HI16 because these are always followed by an
8931
       R_MIPS_GOT_LO16 or R_MIPS_CALL_LO16.  */
8932
0
    if (!mips_elf_record_local_got_symbol (abfd, r_symndx,
8933
0
             rel->r_addend, info, r_type))
8934
0
      return false;
8935
0
  }
8936
8937
0
      if (h != NULL
8938
0
    && mips_elf_relocation_needs_la25_stub (abfd, r_type,
8939
0
              ELF_ST_IS_MIPS16 (h->other)))
8940
0
  ((struct mips_elf_link_hash_entry *) h)->has_nonpic_branches = true;
8941
8942
0
      switch (r_type)
8943
0
  {
8944
0
  case R_MIPS_CALL16:
8945
0
  case R_MIPS16_CALL16:
8946
0
  case R_MICROMIPS_CALL16:
8947
0
    if (h == NULL)
8948
0
      {
8949
0
        _bfd_error_handler
8950
    /* xgettext:c-format */
8951
0
    (_("%pB: CALL16 reloc at %#" PRIx64 " not against global symbol"),
8952
0
     abfd, (uint64_t) rel->r_offset);
8953
0
        bfd_set_error (bfd_error_bad_value);
8954
0
        return false;
8955
0
      }
8956
    /* Fall through.  */
8957
8958
0
  case R_MIPS_CALL_HI16:
8959
0
  case R_MIPS_CALL_LO16:
8960
0
  case R_MICROMIPS_CALL_HI16:
8961
0
  case R_MICROMIPS_CALL_LO16:
8962
0
    if (h != NULL)
8963
0
      {
8964
        /* Make sure there is room in the regular GOT to hold the
8965
     function's address.  We may eliminate it in favour of
8966
     a .got.plt entry later; see mips_elf_count_got_symbols.  */
8967
0
        if (!mips_elf_record_global_got_symbol (h, abfd, info, true,
8968
0
                  r_type))
8969
0
    return false;
8970
8971
        /* We need a stub, not a plt entry for the undefined
8972
     function.  But we record it as if it needs plt.  See
8973
     _bfd_elf_adjust_dynamic_symbol.  */
8974
0
        h->needs_plt = 1;
8975
0
        h->type = STT_FUNC;
8976
0
      }
8977
0
    break;
8978
8979
0
  case R_MIPS_GOT_PAGE:
8980
0
  case R_MICROMIPS_GOT_PAGE:
8981
0
  case R_MIPS16_GOT16:
8982
0
  case R_MIPS_GOT16:
8983
0
  case R_MIPS_GOT_HI16:
8984
0
  case R_MIPS_GOT_LO16:
8985
0
  case R_MICROMIPS_GOT16:
8986
0
  case R_MICROMIPS_GOT_HI16:
8987
0
  case R_MICROMIPS_GOT_LO16:
8988
0
    if (!h || got_page_reloc_p (r_type))
8989
0
      {
8990
        /* This relocation needs (or may need, if h != NULL) a
8991
     page entry in the GOT.  For R_MIPS_GOT_PAGE we do not
8992
     know for sure until we know whether the symbol is
8993
     preemptible.  */
8994
0
        if (mips_elf_rel_relocation_p (abfd, sec, relocs, rel))
8995
0
    {
8996
0
      if (!mips_elf_get_section_contents (abfd, sec, &contents))
8997
0
        return false;
8998
0
      howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, false);
8999
0
      addend = mips_elf_read_rel_addend (abfd, sec, rel,
9000
0
                 howto, contents);
9001
0
      if (got16_reloc_p (r_type))
9002
0
        mips_elf_add_lo16_rel_addend (abfd, sec, rel, rel_end,
9003
0
              contents, &addend);
9004
0
      else
9005
0
        addend <<= howto->rightshift;
9006
0
    }
9007
0
        else
9008
0
    addend = rel->r_addend;
9009
0
        if (!mips_elf_record_got_page_ref (info, abfd, r_symndx,
9010
0
             h, addend))
9011
0
    return false;
9012
9013
0
        if (h)
9014
0
    {
9015
0
      struct mips_elf_link_hash_entry *hmips =
9016
0
        (struct mips_elf_link_hash_entry *) h;
9017
9018
      /* This symbol is definitely not overridable.  */
9019
0
      if (hmips->root.def_regular
9020
0
          && ! (bfd_link_pic (info) && ! info->symbolic
9021
0
          && ! hmips->root.forced_local))
9022
0
        h = NULL;
9023
0
    }
9024
0
      }
9025
    /* If this is a global, overridable symbol, GOT_PAGE will
9026
       decay to GOT_DISP, so we'll need a GOT entry for it.  */
9027
    /* Fall through.  */
9028
9029
0
  case R_MIPS_GOT_DISP:
9030
0
  case R_MICROMIPS_GOT_DISP:
9031
0
    if (h && !mips_elf_record_global_got_symbol (h, abfd, info,
9032
0
                   false, r_type))
9033
0
      return false;
9034
0
    break;
9035
9036
0
  case R_MIPS_TLS_GOTTPREL:
9037
0
  case R_MIPS16_TLS_GOTTPREL:
9038
0
  case R_MICROMIPS_TLS_GOTTPREL:
9039
0
    if (bfd_link_pic (info))
9040
0
      info->flags |= DF_STATIC_TLS;
9041
    /* Fall through */
9042
9043
0
  case R_MIPS_TLS_LDM:
9044
0
  case R_MIPS16_TLS_LDM:
9045
0
  case R_MICROMIPS_TLS_LDM:
9046
0
    if (tls_ldm_reloc_p (r_type))
9047
0
      {
9048
0
        r_symndx = STN_UNDEF;
9049
0
        h = NULL;
9050
0
      }
9051
    /* Fall through */
9052
9053
0
  case R_MIPS_TLS_GD:
9054
0
  case R_MIPS16_TLS_GD:
9055
0
  case R_MICROMIPS_TLS_GD:
9056
    /* This symbol requires a global offset table entry, or two
9057
       for TLS GD relocations.  */
9058
0
    if (h != NULL)
9059
0
      {
9060
0
        if (!mips_elf_record_global_got_symbol (h, abfd, info,
9061
0
                  false, r_type))
9062
0
    return false;
9063
0
      }
9064
0
    else
9065
0
      {
9066
0
        if (!mips_elf_record_local_got_symbol (abfd, r_symndx,
9067
0
                 rel->r_addend,
9068
0
                 info, r_type))
9069
0
    return false;
9070
0
      }
9071
0
    break;
9072
9073
0
  case R_MIPS_32:
9074
0
  case R_MIPS_REL32:
9075
0
  case R_MIPS_64:
9076
    /* In VxWorks executables, references to external symbols
9077
       are handled using copy relocs or PLT stubs, so there's
9078
       no need to add a .rela.dyn entry for this relocation.  */
9079
0
    if (can_make_dynamic_p)
9080
0
      {
9081
0
        if (sreloc == NULL)
9082
0
    {
9083
0
      sreloc = mips_elf_rel_dyn_section (info, true);
9084
0
      if (sreloc == NULL)
9085
0
        return false;
9086
0
    }
9087
0
        if (bfd_link_pic (info) && h == NULL)
9088
0
    {
9089
      /* When creating a shared object, we must copy these
9090
         reloc types into the output file as R_MIPS_REL32
9091
         relocs.  Make room for this reloc in .rel(a).dyn.  */
9092
0
      mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
9093
0
      if (MIPS_ELF_READONLY_SECTION (sec))
9094
        /* We tell the dynamic linker that there are
9095
           relocations against the text segment.  */
9096
0
        info->flags |= DF_TEXTREL;
9097
0
    }
9098
0
        else
9099
0
    {
9100
0
      struct mips_elf_link_hash_entry *hmips;
9101
9102
      /* For a shared object, we must copy this relocation
9103
         unless the symbol turns out to be undefined and
9104
         weak with non-default visibility, in which case
9105
         it will be left as zero.
9106
9107
         We could elide R_MIPS_REL32 for locally binding symbols
9108
         in shared libraries, but do not yet do so.
9109
9110
         For an executable, we only need to copy this
9111
         reloc if the symbol is defined in a dynamic
9112
         object.  */
9113
0
      hmips = (struct mips_elf_link_hash_entry *) h;
9114
0
      ++hmips->possibly_dynamic_relocs;
9115
0
      if (MIPS_ELF_READONLY_SECTION (sec))
9116
        /* We need it to tell the dynamic linker if there
9117
           are relocations against the text segment.  */
9118
0
        hmips->readonly_reloc = true;
9119
0
    }
9120
0
      }
9121
9122
0
    if (SGI_COMPAT (abfd))
9123
0
      mips_elf_hash_table (info)->compact_rel_size +=
9124
0
        sizeof (Elf32_External_crinfo);
9125
0
    break;
9126
9127
0
  case R_MIPS_26:
9128
0
  case R_MIPS_GPREL16:
9129
0
  case R_MIPS_LITERAL:
9130
0
  case R_MIPS_GPREL32:
9131
0
  case R_MICROMIPS_26_S1:
9132
0
  case R_MICROMIPS_GPREL16:
9133
0
  case R_MICROMIPS_LITERAL:
9134
0
  case R_MICROMIPS_GPREL7_S2:
9135
0
    if (SGI_COMPAT (abfd))
9136
0
      mips_elf_hash_table (info)->compact_rel_size +=
9137
0
        sizeof (Elf32_External_crinfo);
9138
0
    break;
9139
9140
    /* This relocation describes the C++ object vtable hierarchy.
9141
       Reconstruct it for later use during GC.  */
9142
0
  case R_MIPS_GNU_VTINHERIT:
9143
0
    if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
9144
0
      return false;
9145
0
    break;
9146
9147
    /* This relocation describes which C++ vtable entries are actually
9148
       used.  Record for later use during GC.  */
9149
0
  case R_MIPS_GNU_VTENTRY:
9150
0
    if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
9151
0
      return false;
9152
0
    break;
9153
9154
0
  default:
9155
0
    break;
9156
0
  }
9157
9158
      /* Record the need for a PLT entry.  At this point we don't know
9159
   yet if we are going to create a PLT in the first place, but
9160
   we only record whether the relocation requires a standard MIPS
9161
   or a compressed code entry anyway.  If we don't make a PLT after
9162
   all, then we'll just ignore these arrangements.  Likewise if
9163
   a PLT entry is not created because the symbol is satisfied
9164
   locally.  */
9165
0
      if (h != NULL
9166
0
    && (branch_reloc_p (r_type)
9167
0
        || mips16_branch_reloc_p (r_type)
9168
0
        || micromips_branch_reloc_p (r_type))
9169
0
    && !SYMBOL_CALLS_LOCAL (info, h))
9170
0
  {
9171
0
    if (h->plt.plist == NULL)
9172
0
      h->plt.plist = mips_elf_make_plt_record (abfd);
9173
0
    if (h->plt.plist == NULL)
9174
0
      return false;
9175
9176
0
    if (branch_reloc_p (r_type))
9177
0
      h->plt.plist->need_mips = true;
9178
0
    else
9179
0
      h->plt.plist->need_comp = true;
9180
0
  }
9181
9182
      /* See if this reloc would need to refer to a MIPS16 hard-float stub,
9183
   if there is one.  We only need to handle global symbols here;
9184
   we decide whether to keep or delete stubs for local symbols
9185
   when processing the stub's relocations.  */
9186
0
      if (h != NULL
9187
0
    && !mips16_call_reloc_p (r_type)
9188
0
    && !section_allows_mips16_refs_p (sec))
9189
0
  {
9190
0
    struct mips_elf_link_hash_entry *mh;
9191
9192
0
    mh = (struct mips_elf_link_hash_entry *) h;
9193
0
    mh->need_fn_stub = true;
9194
0
  }
9195
9196
      /* Refuse some position-dependent relocations when creating a
9197
   shared library.  Do not refuse R_MIPS_32 / R_MIPS_64; they're
9198
   not PIC, but we can create dynamic relocations and the result
9199
   will be fine.  Also do not refuse R_MIPS_LO16, which can be
9200
   combined with R_MIPS_GOT16.  */
9201
0
      if (bfd_link_pic (info))
9202
0
  {
9203
0
    switch (r_type)
9204
0
      {
9205
0
      case R_MIPS_TLS_TPREL_HI16:
9206
0
      case R_MIPS16_TLS_TPREL_HI16:
9207
0
      case R_MICROMIPS_TLS_TPREL_HI16:
9208
0
      case R_MIPS_TLS_TPREL_LO16:
9209
0
      case R_MIPS16_TLS_TPREL_LO16:
9210
0
      case R_MICROMIPS_TLS_TPREL_LO16:
9211
        /* These are okay in PIE, but not in a shared library.  */
9212
0
        if (bfd_link_executable (info))
9213
0
    break;
9214
9215
        /* FALLTHROUGH */
9216
9217
0
      case R_MIPS16_HI16:
9218
0
      case R_MIPS_HI16:
9219
0
      case R_MIPS_HIGHER:
9220
0
      case R_MIPS_HIGHEST:
9221
0
      case R_MICROMIPS_HI16:
9222
0
      case R_MICROMIPS_HIGHER:
9223
0
      case R_MICROMIPS_HIGHEST:
9224
        /* Don't refuse a high part relocation if it's against
9225
     no symbol (e.g. part of a compound relocation).  */
9226
0
        if (r_symndx == STN_UNDEF)
9227
0
    break;
9228
9229
        /* Likewise an absolute symbol.  */
9230
0
        if (h != NULL && bfd_is_abs_symbol (&h->root))
9231
0
    break;
9232
9233
        /* R_MIPS_HI16 against _gp_disp is used for $gp setup,
9234
     and has a special meaning.  */
9235
0
        if (!NEWABI_P (abfd) && h != NULL
9236
0
      && strcmp (h->root.root.string, "_gp_disp") == 0)
9237
0
    break;
9238
9239
        /* Likewise __GOTT_BASE__ and __GOTT_INDEX__ on VxWorks.  */
9240
0
        if (is_gott_symbol (info, h))
9241
0
    break;
9242
9243
        /* FALLTHROUGH */
9244
9245
0
      case R_MIPS16_26:
9246
0
      case R_MIPS_26:
9247
0
      case R_MICROMIPS_26_S1:
9248
0
        howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, NEWABI_P (abfd));
9249
        /* An error for unsupported relocations is raised as part
9250
     of the above search, so we can skip the following.  */
9251
0
        if (howto != NULL)
9252
0
    info->callbacks->einfo
9253
      /* xgettext:c-format */
9254
0
      (_("%X%H: relocation %s against `%s' cannot be used"
9255
0
         " when making a shared object; recompile with -fPIC\n"),
9256
0
       abfd, sec, rel->r_offset, howto->name,
9257
0
       (h) ? h->root.root.string : "a local symbol");
9258
0
        break;
9259
0
      default:
9260
0
        break;
9261
0
      }
9262
0
  }
9263
0
    }
9264
9265
0
  return true;
9266
0
}
9267

9268
/* Allocate space for global sym dynamic relocs.  */
9269
9270
static bool
9271
allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
9272
0
{
9273
0
  struct bfd_link_info *info = inf;
9274
0
  bfd *dynobj;
9275
0
  struct mips_elf_link_hash_entry *hmips;
9276
0
  struct mips_elf_link_hash_table *htab;
9277
9278
0
  htab = mips_elf_hash_table (info);
9279
0
  BFD_ASSERT (htab != NULL);
9280
9281
0
  dynobj = elf_hash_table (info)->dynobj;
9282
0
  hmips = (struct mips_elf_link_hash_entry *) h;
9283
9284
  /* VxWorks executables are handled elsewhere; we only need to
9285
     allocate relocations in shared objects.  */
9286
0
  if (htab->root.target_os == is_vxworks && !bfd_link_pic (info))
9287
0
    return true;
9288
9289
  /* Ignore indirect symbols.  All relocations against such symbols
9290
     will be redirected to the target symbol.  */
9291
0
  if (h->root.type == bfd_link_hash_indirect)
9292
0
    return true;
9293
9294
  /* If this symbol is defined in a dynamic object, or we are creating
9295
     a shared library, we will need to copy any R_MIPS_32 or
9296
     R_MIPS_REL32 relocs against it into the output file.  */
9297
0
  if (! bfd_link_relocatable (info)
9298
0
      && hmips->possibly_dynamic_relocs != 0
9299
0
      && (h->root.type == bfd_link_hash_defweak
9300
0
    || (!h->def_regular && !ELF_COMMON_DEF_P (h))
9301
0
    || bfd_link_pic (info)))
9302
0
    {
9303
0
      bool do_copy = true;
9304
9305
0
      if (h->root.type == bfd_link_hash_undefweak)
9306
0
  {
9307
    /* Do not copy relocations for undefined weak symbols that
9308
       we are not going to export.  */
9309
0
    if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
9310
0
      do_copy = false;
9311
9312
    /* Make sure undefined weak symbols are output as a dynamic
9313
       symbol in PIEs.  */
9314
0
    else if (h->dynindx == -1 && !h->forced_local)
9315
0
      {
9316
0
        if (! bfd_elf_link_record_dynamic_symbol (info, h))
9317
0
    return false;
9318
0
      }
9319
0
  }
9320
9321
0
      if (do_copy)
9322
0
  {
9323
    /* Even though we don't directly need a GOT entry for this symbol,
9324
       the SVR4 psABI requires it to have a dynamic symbol table
9325
       index greater that DT_MIPS_GOTSYM if there are dynamic
9326
       relocations against it.
9327
9328
       VxWorks does not enforce the same mapping between the GOT
9329
       and the symbol table, so the same requirement does not
9330
       apply there.  */
9331
0
    if (htab->root.target_os != is_vxworks)
9332
0
      {
9333
0
        if (hmips->global_got_area > GGA_RELOC_ONLY)
9334
0
    hmips->global_got_area = GGA_RELOC_ONLY;
9335
0
        hmips->got_only_for_calls = false;
9336
0
      }
9337
9338
0
    mips_elf_allocate_dynamic_relocations
9339
0
      (dynobj, info, hmips->possibly_dynamic_relocs);
9340
0
    if (hmips->readonly_reloc)
9341
      /* We tell the dynamic linker that there are relocations
9342
         against the text segment.  */
9343
0
      info->flags |= DF_TEXTREL;
9344
0
  }
9345
0
    }
9346
9347
0
  return true;
9348
0
}
9349
9350
/* Adjust a symbol defined by a dynamic object and referenced by a
9351
   regular object.  The current definition is in some section of the
9352
   dynamic object, but we're not including those sections.  We have to
9353
   change the definition to something the rest of the link can
9354
   understand.  */
9355
9356
bool
9357
_bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
9358
             struct elf_link_hash_entry *h)
9359
0
{
9360
0
  bfd *dynobj;
9361
0
  struct mips_elf_link_hash_entry *hmips;
9362
0
  struct mips_elf_link_hash_table *htab;
9363
0
  asection *s, *srel;
9364
9365
0
  htab = mips_elf_hash_table (info);
9366
0
  BFD_ASSERT (htab != NULL);
9367
9368
0
  dynobj = elf_hash_table (info)->dynobj;
9369
0
  hmips = (struct mips_elf_link_hash_entry *) h;
9370
9371
  /* Make sure we know what is going on here.  */
9372
0
  if (dynobj == NULL
9373
0
      || (! h->needs_plt
9374
0
    && ! h->is_weakalias
9375
0
    && (! h->def_dynamic
9376
0
        || ! h->ref_regular
9377
0
        || h->def_regular)))
9378
0
    {
9379
0
      if (h->type == STT_GNU_IFUNC)
9380
0
  _bfd_error_handler (_("IFUNC symbol %s in dynamic symbol table - IFUNCS are not supported"),
9381
0
          h->root.root.string);
9382
0
      else
9383
0
  _bfd_error_handler (_("non-dynamic symbol %s in dynamic symbol table"),
9384
0
          h->root.root.string);
9385
0
      return true;
9386
0
    }
9387
9388
0
  hmips = (struct mips_elf_link_hash_entry *) h;
9389
9390
  /* If there are call relocations against an externally-defined symbol,
9391
     see whether we can create a MIPS lazy-binding stub for it.  We can
9392
     only do this if all references to the function are through call
9393
     relocations, and in that case, the traditional lazy-binding stubs
9394
     are much more efficient than PLT entries.
9395
9396
     Traditional stubs are only available on SVR4 psABI-based systems;
9397
     VxWorks always uses PLTs instead.  */
9398
0
  if (htab->root.target_os != is_vxworks
9399
0
      && h->needs_plt
9400
0
      && !hmips->no_fn_stub)
9401
0
    {
9402
0
      if (! elf_hash_table (info)->dynamic_sections_created)
9403
0
  return true;
9404
9405
      /* If this symbol is not defined in a regular file, then set
9406
   the symbol to the stub location.  This is required to make
9407
   function pointers compare as equal between the normal
9408
   executable and the shared library.  */
9409
0
      if (!h->def_regular
9410
0
    && !bfd_is_abs_section (htab->sstubs->output_section))
9411
0
  {
9412
0
    hmips->needs_lazy_stub = true;
9413
0
    htab->lazy_stub_count++;
9414
0
    return true;
9415
0
  }
9416
0
    }
9417
  /* As above, VxWorks requires PLT entries for externally-defined
9418
     functions that are only accessed through call relocations.
9419
9420
     Both VxWorks and non-VxWorks targets also need PLT entries if there
9421
     are static-only relocations against an externally-defined function.
9422
     This can technically occur for shared libraries if there are
9423
     branches to the symbol, although it is unlikely that this will be
9424
     used in practice due to the short ranges involved.  It can occur
9425
     for any relative or absolute relocation in executables; in that
9426
     case, the PLT entry becomes the function's canonical address.  */
9427
0
  else if (((h->needs_plt && !hmips->no_fn_stub)
9428
0
      || (h->type == STT_FUNC && hmips->has_static_relocs))
9429
0
     && htab->use_plts_and_copy_relocs
9430
0
     && !SYMBOL_CALLS_LOCAL (info, h)
9431
0
     && !(ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
9432
0
    && h->root.type == bfd_link_hash_undefweak))
9433
0
    {
9434
0
      bool micromips_p = MICROMIPS_P (info->output_bfd);
9435
0
      bool newabi_p = NEWABI_P (info->output_bfd);
9436
9437
      /* If this is the first symbol to need a PLT entry, then make some
9438
   basic setup.  Also work out PLT entry sizes.  We'll need them
9439
   for PLT offset calculations.  */
9440
0
      if (htab->plt_mips_offset + htab->plt_comp_offset == 0)
9441
0
  {
9442
0
    BFD_ASSERT (htab->root.sgotplt->size == 0);
9443
0
    BFD_ASSERT (htab->plt_got_index == 0);
9444
9445
    /* If we're using the PLT additions to the psABI, each PLT
9446
       entry is 16 bytes and the PLT0 entry is 32 bytes.
9447
       Encourage better cache usage by aligning.  We do this
9448
       lazily to avoid pessimizing traditional objects.  */
9449
0
    if (htab->root.target_os != is_vxworks
9450
0
        && !bfd_link_align_section (htab->root.splt, 5))
9451
0
      return false;
9452
9453
    /* Make sure that .got.plt is word-aligned.  We do this lazily
9454
       for the same reason as above.  */
9455
0
    if (!bfd_link_align_section (htab->root.sgotplt,
9456
0
               MIPS_ELF_LOG_FILE_ALIGN (dynobj)))
9457
0
      return false;
9458
9459
    /* On non-VxWorks targets, the first two entries in .got.plt
9460
       are reserved.  */
9461
0
    if (htab->root.target_os != is_vxworks)
9462
0
      htab->plt_got_index
9463
0
        += (get_elf_backend_data (dynobj)->got_header_size
9464
0
      / MIPS_ELF_GOT_SIZE (dynobj));
9465
9466
    /* On VxWorks, also allocate room for the header's
9467
       .rela.plt.unloaded entries.  */
9468
0
    if (htab->root.target_os == is_vxworks
9469
0
        && !bfd_link_pic (info))
9470
0
      htab->srelplt2->size += 2 * sizeof (Elf32_External_Rela);
9471
9472
    /* Now work out the sizes of individual PLT entries.  */
9473
0
    if (htab->root.target_os == is_vxworks
9474
0
        && bfd_link_pic (info))
9475
0
      htab->plt_mips_entry_size
9476
0
        = 4 * ARRAY_SIZE (mips_vxworks_shared_plt_entry);
9477
0
    else if (htab->root.target_os == is_vxworks)
9478
0
      htab->plt_mips_entry_size
9479
0
        = 4 * ARRAY_SIZE (mips_vxworks_exec_plt_entry);
9480
0
    else if (newabi_p)
9481
0
      htab->plt_mips_entry_size
9482
0
        = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9483
0
    else if (!micromips_p)
9484
0
      {
9485
0
        htab->plt_mips_entry_size
9486
0
    = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9487
0
        htab->plt_comp_entry_size
9488
0
    = 2 * ARRAY_SIZE (mips16_o32_exec_plt_entry);
9489
0
      }
9490
0
    else if (htab->insn32)
9491
0
      {
9492
0
        htab->plt_mips_entry_size
9493
0
    = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9494
0
        htab->plt_comp_entry_size
9495
0
    = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt_entry);
9496
0
      }
9497
0
    else
9498
0
      {
9499
0
        htab->plt_mips_entry_size
9500
0
    = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9501
0
        htab->plt_comp_entry_size
9502
0
    = 2 * ARRAY_SIZE (micromips_o32_exec_plt_entry);
9503
0
      }
9504
0
  }
9505
9506
0
      if (h->plt.plist == NULL)
9507
0
  h->plt.plist = mips_elf_make_plt_record (dynobj);
9508
0
      if (h->plt.plist == NULL)
9509
0
  return false;
9510
9511
      /* There are no defined MIPS16 or microMIPS PLT entries for VxWorks,
9512
   n32 or n64, so always use a standard entry there.
9513
9514
   If the symbol has a MIPS16 call stub and gets a PLT entry, then
9515
   all MIPS16 calls will go via that stub, and there is no benefit
9516
   to having a MIPS16 entry.  And in the case of call_stub a
9517
   standard entry actually has to be used as the stub ends with a J
9518
   instruction.  */
9519
0
      if (newabi_p
9520
0
    || htab->root.target_os == is_vxworks
9521
0
    || hmips->call_stub
9522
0
    || hmips->call_fp_stub)
9523
0
  {
9524
0
    h->plt.plist->need_mips = true;
9525
0
    h->plt.plist->need_comp = false;
9526
0
  }
9527
9528
      /* Otherwise, if there are no direct calls to the function, we
9529
   have a free choice of whether to use standard or compressed
9530
   entries.  Prefer microMIPS entries if the object is known to
9531
   contain microMIPS code, so that it becomes possible to create
9532
   pure microMIPS binaries.  Prefer standard entries otherwise,
9533
   because MIPS16 ones are no smaller and are usually slower.  */
9534
0
      if (!h->plt.plist->need_mips && !h->plt.plist->need_comp)
9535
0
  {
9536
0
    if (micromips_p)
9537
0
      h->plt.plist->need_comp = true;
9538
0
    else
9539
0
      h->plt.plist->need_mips = true;
9540
0
  }
9541
9542
0
      if (h->plt.plist->need_mips)
9543
0
  {
9544
0
    h->plt.plist->mips_offset = htab->plt_mips_offset;
9545
0
    htab->plt_mips_offset += htab->plt_mips_entry_size;
9546
0
  }
9547
0
      if (h->plt.plist->need_comp)
9548
0
  {
9549
0
    h->plt.plist->comp_offset = htab->plt_comp_offset;
9550
0
    htab->plt_comp_offset += htab->plt_comp_entry_size;
9551
0
  }
9552
9553
      /* Reserve the corresponding .got.plt entry now too.  */
9554
0
      h->plt.plist->gotplt_index = htab->plt_got_index++;
9555
9556
      /* If the output file has no definition of the symbol, set the
9557
   symbol's value to the address of the stub.  */
9558
0
      if (!bfd_link_pic (info) && !h->def_regular)
9559
0
  hmips->use_plt_entry = true;
9560
9561
      /* Make room for the R_MIPS_JUMP_SLOT relocation.  */
9562
0
      htab->root.srelplt->size += (htab->root.target_os == is_vxworks
9563
0
           ? MIPS_ELF_RELA_SIZE (dynobj)
9564
0
           : MIPS_ELF_REL_SIZE (dynobj));
9565
9566
      /* Make room for the .rela.plt.unloaded relocations.  */
9567
0
      if (htab->root.target_os == is_vxworks && !bfd_link_pic (info))
9568
0
  htab->srelplt2->size += 3 * sizeof (Elf32_External_Rela);
9569
9570
      /* All relocations against this symbol that could have been made
9571
   dynamic will now refer to the PLT entry instead.  */
9572
0
      hmips->possibly_dynamic_relocs = 0;
9573
9574
0
      return true;
9575
0
    }
9576
9577
  /* If this is a weak symbol, and there is a real definition, the
9578
     processor independent code will have arranged for us to see the
9579
     real definition first, and we can just use the same value.  */
9580
0
  if (h->is_weakalias)
9581
0
    {
9582
0
      struct elf_link_hash_entry *def = weakdef (h);
9583
0
      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
9584
0
      h->root.u.def.section = def->root.u.def.section;
9585
0
      h->root.u.def.value = def->root.u.def.value;
9586
0
      return true;
9587
0
    }
9588
9589
  /* Otherwise, there is nothing further to do for symbols defined
9590
     in regular objects.  */
9591
0
  if (h->def_regular)
9592
0
    return true;
9593
9594
  /* There's also nothing more to do if we'll convert all relocations
9595
     against this symbol into dynamic relocations.  */
9596
0
  if (!hmips->has_static_relocs)
9597
0
    return true;
9598
9599
  /* We're now relying on copy relocations.  Complain if we have
9600
     some that we can't convert.  */
9601
0
  if (!htab->use_plts_and_copy_relocs || bfd_link_pic (info))
9602
0
    {
9603
0
      _bfd_error_handler (_("non-dynamic relocations refer to "
9604
0
          "dynamic symbol %s"),
9605
0
        h->root.root.string);
9606
0
      bfd_set_error (bfd_error_bad_value);
9607
0
      return false;
9608
0
    }
9609
9610
  /* We must allocate the symbol in our .dynbss section, which will
9611
     become part of the .bss section of the executable.  There will be
9612
     an entry for this symbol in the .dynsym section.  The dynamic
9613
     object will contain position independent code, so all references
9614
     from the dynamic object to this symbol will go through the global
9615
     offset table.  The dynamic linker will use the .dynsym entry to
9616
     determine the address it must put in the global offset table, so
9617
     both the dynamic object and the regular object will refer to the
9618
     same memory location for the variable.  */
9619
9620
0
  if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
9621
0
    {
9622
0
      s = htab->root.sdynrelro;
9623
0
      srel = htab->root.sreldynrelro;
9624
0
    }
9625
0
  else
9626
0
    {
9627
0
      s = htab->root.sdynbss;
9628
0
      srel = htab->root.srelbss;
9629
0
    }
9630
0
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
9631
0
    {
9632
0
      if (htab->root.target_os == is_vxworks)
9633
0
  srel->size += sizeof (Elf32_External_Rela);
9634
0
      else
9635
0
  mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
9636
0
      h->needs_copy = 1;
9637
0
    }
9638
9639
  /* All relocations against this symbol that could have been made
9640
     dynamic will now refer to the local copy instead.  */
9641
0
  hmips->possibly_dynamic_relocs = 0;
9642
9643
0
  return _bfd_elf_adjust_dynamic_copy (info, h, s);
9644
0
}
9645

9646
/* If the link uses a GOT, lay it out and work out its size.  */
9647
9648
static bool
9649
mips_elf_lay_out_got (bfd *output_bfd, struct bfd_link_info *info)
9650
0
{
9651
0
  bfd *dynobj;
9652
0
  asection *s;
9653
0
  struct mips_got_info *g;
9654
0
  bfd_size_type loadable_size = 0;
9655
0
  bfd_size_type page_gotno;
9656
0
  bfd *ibfd;
9657
0
  struct mips_elf_traverse_got_arg tga;
9658
0
  struct mips_elf_link_hash_table *htab;
9659
9660
0
  htab = mips_elf_hash_table (info);
9661
0
  BFD_ASSERT (htab != NULL);
9662
9663
0
  s = htab->root.sgot;
9664
0
  if (s == NULL)
9665
0
    return true;
9666
9667
0
  dynobj = elf_hash_table (info)->dynobj;
9668
0
  g = htab->got_info;
9669
9670
  /* Allocate room for the reserved entries.  VxWorks always reserves
9671
     3 entries; other objects only reserve 2 entries.  */
9672
0
  BFD_ASSERT (g->assigned_low_gotno == 0);
9673
0
  if (htab->root.target_os == is_vxworks)
9674
0
    htab->reserved_gotno = 3;
9675
0
  else
9676
0
    htab->reserved_gotno = 2;
9677
0
  g->local_gotno += htab->reserved_gotno;
9678
0
  g->assigned_low_gotno = htab->reserved_gotno;
9679
9680
  /* Decide which symbols need to go in the global part of the GOT and
9681
     count the number of reloc-only GOT symbols.  */
9682
0
  mips_elf_link_hash_traverse (htab, mips_elf_count_got_symbols, info);
9683
9684
0
  if (!mips_elf_resolve_final_got_entries (info, g))
9685
0
    return false;
9686
9687
  /* Calculate the total loadable size of the output.  That
9688
     will give us the maximum number of GOT_PAGE entries
9689
     required.  */
9690
0
  for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
9691
0
    {
9692
0
      asection *subsection;
9693
9694
0
      for (subsection = ibfd->sections;
9695
0
     subsection;
9696
0
     subsection = subsection->next)
9697
0
  {
9698
0
    if ((subsection->flags & SEC_ALLOC) == 0)
9699
0
      continue;
9700
0
    loadable_size += ((subsection->size + 0xf)
9701
0
          &~ (bfd_size_type) 0xf);
9702
0
  }
9703
0
    }
9704
9705
0
  if (htab->root.target_os == is_vxworks)
9706
    /* There's no need to allocate page entries for VxWorks; R_MIPS*_GOT16
9707
       relocations against local symbols evaluate to "G", and the EABI does
9708
       not include R_MIPS_GOT_PAGE.  */
9709
0
    page_gotno = 0;
9710
0
  else
9711
    /* Assume there are two loadable segments consisting of contiguous
9712
       sections.  Is 5 enough?  */
9713
0
    page_gotno = (loadable_size >> 16) + 5;
9714
9715
  /* Choose the smaller of the two page estimates; both are intended to be
9716
     conservative.  */
9717
0
  if (page_gotno > g->page_gotno)
9718
0
    page_gotno = g->page_gotno;
9719
9720
0
  g->local_gotno += page_gotno;
9721
0
  g->assigned_high_gotno = g->local_gotno - 1;
9722
9723
0
  s->size += g->local_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
9724
0
  s->size += g->global_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
9725
0
  s->size += g->tls_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
9726
9727
  /* VxWorks does not support multiple GOTs.  It initializes $gp to
9728
     __GOTT_BASE__[__GOTT_INDEX__], the value of which is set by the
9729
     dynamic loader.  */
9730
0
  if (htab->root.target_os != is_vxworks
9731
0
      && s->size > MIPS_ELF_GOT_MAX_SIZE (info))
9732
0
    {
9733
0
      if (!mips_elf_multi_got (output_bfd, info, s, page_gotno))
9734
0
  return false;
9735
0
    }
9736
0
  else
9737
0
    {
9738
      /* Record that all bfds use G.  This also has the effect of freeing
9739
   the per-bfd GOTs, which we no longer need.  */
9740
0
      for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
9741
0
  if (mips_elf_bfd_got (ibfd, false))
9742
0
    mips_elf_replace_bfd_got (ibfd, g);
9743
0
      mips_elf_replace_bfd_got (output_bfd, g);
9744
9745
      /* Set up TLS entries.  */
9746
0
      g->tls_assigned_gotno = g->global_gotno + g->local_gotno;
9747
0
      tga.info = info;
9748
0
      tga.g = g;
9749
0
      tga.value = MIPS_ELF_GOT_SIZE (output_bfd);
9750
0
      htab_traverse (g->got_entries, mips_elf_initialize_tls_index, &tga);
9751
0
      if (!tga.g)
9752
0
  return false;
9753
0
      BFD_ASSERT (g->tls_assigned_gotno
9754
0
      == g->global_gotno + g->local_gotno + g->tls_gotno);
9755
9756
      /* Each VxWorks GOT entry needs an explicit relocation.  */
9757
0
      if (htab->root.target_os == is_vxworks && bfd_link_pic (info))
9758
0
  g->relocs += g->global_gotno + g->local_gotno - htab->reserved_gotno;
9759
9760
      /* Allocate room for the TLS relocations.  */
9761
0
      if (g->relocs)
9762
0
  mips_elf_allocate_dynamic_relocations (dynobj, info, g->relocs);
9763
0
    }
9764
9765
0
  return true;
9766
0
}
9767
9768
/* Estimate the size of the .MIPS.stubs section.  */
9769
9770
static void
9771
mips_elf_estimate_stub_size (bfd *output_bfd, struct bfd_link_info *info)
9772
0
{
9773
0
  struct mips_elf_link_hash_table *htab;
9774
0
  bfd_size_type dynsymcount;
9775
9776
0
  htab = mips_elf_hash_table (info);
9777
0
  BFD_ASSERT (htab != NULL);
9778
9779
0
  if (htab->lazy_stub_count == 0)
9780
0
    return;
9781
9782
  /* IRIX rld assumes that a function stub isn't at the end of the .text
9783
     section, so add a dummy entry to the end.  */
9784
0
  htab->lazy_stub_count++;
9785
9786
  /* Get a worst-case estimate of the number of dynamic symbols needed.
9787
     At this point, dynsymcount does not account for section symbols
9788
     and count_section_dynsyms may overestimate the number that will
9789
     be needed.  */
9790
0
  dynsymcount = (elf_hash_table (info)->dynsymcount
9791
0
     + count_section_dynsyms (output_bfd, info));
9792
9793
  /* Determine the size of one stub entry.  There's no disadvantage
9794
     from using microMIPS code here, so for the sake of pure-microMIPS
9795
     binaries we prefer it whenever there's any microMIPS code in
9796
     output produced at all.  This has a benefit of stubs being
9797
     shorter by 4 bytes each too, unless in the insn32 mode.  */
9798
0
  if (!MICROMIPS_P (output_bfd))
9799
0
    htab->function_stub_size = (dynsymcount > 0x10000
9800
0
        ? MIPS_FUNCTION_STUB_BIG_SIZE
9801
0
        : MIPS_FUNCTION_STUB_NORMAL_SIZE);
9802
0
  else if (htab->insn32)
9803
0
    htab->function_stub_size = (dynsymcount > 0x10000
9804
0
        ? MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE
9805
0
        : MICROMIPS_INSN32_FUNCTION_STUB_NORMAL_SIZE);
9806
0
  else
9807
0
    htab->function_stub_size = (dynsymcount > 0x10000
9808
0
        ? MICROMIPS_FUNCTION_STUB_BIG_SIZE
9809
0
        : MICROMIPS_FUNCTION_STUB_NORMAL_SIZE);
9810
9811
0
  htab->sstubs->size = htab->lazy_stub_count * htab->function_stub_size;
9812
0
}
9813
9814
/* A mips_elf_link_hash_traverse callback for which DATA points to a
9815
   mips_htab_traverse_info.  If H needs a traditional MIPS lazy-binding
9816
   stub, allocate an entry in the stubs section.  */
9817
9818
static bool
9819
mips_elf_allocate_lazy_stub (struct mips_elf_link_hash_entry *h, void *data)
9820
0
{
9821
0
  struct mips_htab_traverse_info *hti = data;
9822
0
  struct mips_elf_link_hash_table *htab;
9823
0
  struct bfd_link_info *info;
9824
0
  bfd *output_bfd;
9825
9826
0
  info = hti->info;
9827
0
  output_bfd = hti->output_bfd;
9828
0
  htab = mips_elf_hash_table (info);
9829
0
  BFD_ASSERT (htab != NULL);
9830
9831
0
  if (h->needs_lazy_stub)
9832
0
    {
9833
0
      bool micromips_p = MICROMIPS_P (output_bfd);
9834
0
      unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9835
0
      bfd_vma isa_bit = micromips_p;
9836
9837
0
      BFD_ASSERT (htab->root.dynobj != NULL);
9838
0
      if (h->root.plt.plist == NULL)
9839
0
  h->root.plt.plist = mips_elf_make_plt_record (htab->sstubs->owner);
9840
0
      if (h->root.plt.plist == NULL)
9841
0
  {
9842
0
    hti->error = true;
9843
0
    return false;
9844
0
  }
9845
0
      h->root.root.u.def.section = htab->sstubs;
9846
0
      h->root.root.u.def.value = htab->sstubs->size + isa_bit;
9847
0
      h->root.plt.plist->stub_offset = htab->sstubs->size;
9848
0
      h->root.other = other;
9849
0
      htab->sstubs->size += htab->function_stub_size;
9850
0
    }
9851
0
  return true;
9852
0
}
9853
9854
/* Allocate offsets in the stubs section to each symbol that needs one.
9855
   Set the final size of the .MIPS.stub section.  */
9856
9857
static bool
9858
mips_elf_lay_out_lazy_stubs (struct bfd_link_info *info)
9859
0
{
9860
0
  bfd *output_bfd = info->output_bfd;
9861
0
  bool micromips_p = MICROMIPS_P (output_bfd);
9862
0
  unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9863
0
  bfd_vma isa_bit = micromips_p;
9864
0
  struct mips_elf_link_hash_table *htab;
9865
0
  struct mips_htab_traverse_info hti;
9866
0
  struct elf_link_hash_entry *h;
9867
0
  bfd *dynobj;
9868
9869
0
  htab = mips_elf_hash_table (info);
9870
0
  BFD_ASSERT (htab != NULL);
9871
9872
0
  if (htab->lazy_stub_count == 0)
9873
0
    return true;
9874
9875
0
  htab->sstubs->size = 0;
9876
0
  hti.info = info;
9877
0
  hti.output_bfd = output_bfd;
9878
0
  hti.error = false;
9879
0
  mips_elf_link_hash_traverse (htab, mips_elf_allocate_lazy_stub, &hti);
9880
0
  if (hti.error)
9881
0
    return false;
9882
0
  htab->sstubs->size += htab->function_stub_size;
9883
0
  BFD_ASSERT (htab->sstubs->size
9884
0
        == htab->lazy_stub_count * htab->function_stub_size);
9885
9886
0
  dynobj = elf_hash_table (info)->dynobj;
9887
0
  BFD_ASSERT (dynobj != NULL);
9888
0
  h = _bfd_elf_define_linkage_sym (dynobj, info, htab->sstubs, "_MIPS_STUBS_");
9889
0
  if (h == NULL)
9890
0
    return false;
9891
0
  h->root.u.def.value = isa_bit;
9892
0
  h->other = other;
9893
0
  h->type = STT_FUNC;
9894
9895
0
  return true;
9896
0
}
9897
9898
/* A mips_elf_link_hash_traverse callback for which DATA points to a
9899
   bfd_link_info.  If H uses the address of a PLT entry as the value
9900
   of the symbol, then set the entry in the symbol table now.  Prefer
9901
   a standard MIPS PLT entry.  */
9902
9903
static bool
9904
mips_elf_set_plt_sym_value (struct mips_elf_link_hash_entry *h, void *data)
9905
0
{
9906
0
  struct bfd_link_info *info = data;
9907
0
  bool micromips_p = MICROMIPS_P (info->output_bfd);
9908
0
  struct mips_elf_link_hash_table *htab;
9909
0
  unsigned int other;
9910
0
  bfd_vma isa_bit;
9911
0
  bfd_vma val;
9912
9913
0
  htab = mips_elf_hash_table (info);
9914
0
  BFD_ASSERT (htab != NULL);
9915
9916
0
  if (h->use_plt_entry)
9917
0
    {
9918
0
      BFD_ASSERT (h->root.plt.plist != NULL);
9919
0
      BFD_ASSERT (h->root.plt.plist->mips_offset != MINUS_ONE
9920
0
      || h->root.plt.plist->comp_offset != MINUS_ONE);
9921
9922
0
      val = htab->plt_header_size;
9923
0
      if (h->root.plt.plist->mips_offset != MINUS_ONE)
9924
0
  {
9925
0
    isa_bit = 0;
9926
0
    val += h->root.plt.plist->mips_offset;
9927
0
    other = 0;
9928
0
  }
9929
0
      else
9930
0
  {
9931
0
    isa_bit = 1;
9932
0
    val += htab->plt_mips_offset + h->root.plt.plist->comp_offset;
9933
0
    other = micromips_p ? STO_MICROMIPS : STO_MIPS16;
9934
0
  }
9935
0
      val += isa_bit;
9936
      /* For VxWorks, point at the PLT load stub rather than the lazy
9937
   resolution stub; this stub will become the canonical function
9938
   address.  */
9939
0
      if (htab->root.target_os == is_vxworks)
9940
0
  val += 8;
9941
9942
0
      h->root.root.u.def.section = htab->root.splt;
9943
0
      h->root.root.u.def.value = val;
9944
0
      h->root.other = other;
9945
0
    }
9946
9947
0
  return true;
9948
0
}
9949
9950
/* Set the sizes of the dynamic sections, some mips non-dynamic sections,
9951
   and check for any mips16 stub sections that we can discard.  */
9952
9953
bool
9954
_bfd_mips_elf_late_size_sections (bfd *output_bfd,
9955
          struct bfd_link_info *info)
9956
0
{
9957
0
  bfd *dynobj;
9958
0
  asection *s, *sreldyn;
9959
0
  bool reltext;
9960
0
  struct mips_elf_link_hash_table *htab;
9961
0
  struct mips_htab_traverse_info hti;
9962
9963
0
  htab = mips_elf_hash_table (info);
9964
0
  BFD_ASSERT (htab != NULL);
9965
9966
  /* The .reginfo section has a fixed size.  */
9967
0
  s = bfd_get_section_by_name (output_bfd, ".reginfo");
9968
0
  if (s != NULL)
9969
0
    {
9970
0
      bfd_set_section_size (s, sizeof (Elf32_External_RegInfo));
9971
0
      s->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
9972
0
    }
9973
9974
  /* The .MIPS.abiflags section has a fixed size.  */
9975
0
  s = bfd_get_section_by_name (output_bfd, ".MIPS.abiflags");
9976
0
  if (s != NULL)
9977
0
    {
9978
0
      bfd_set_section_size (s, sizeof (Elf_External_ABIFlags_v0));
9979
0
      s->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
9980
0
    }
9981
9982
0
  hti.info = info;
9983
0
  hti.output_bfd = output_bfd;
9984
0
  hti.error = false;
9985
0
  mips_elf_link_hash_traverse (htab, mips_elf_check_symbols, &hti);
9986
0
  if (hti.error)
9987
0
    return false;
9988
9989
0
  dynobj = htab->root.dynobj;
9990
0
  if (dynobj == NULL)
9991
0
    return true;
9992
9993
0
  if (htab->root.dynamic_sections_created)
9994
0
    {
9995
      /* Set the contents of the .interp section to the interpreter.  */
9996
0
      if (bfd_link_executable (info) && !info->nointerp)
9997
0
  {
9998
0
    s = bfd_get_linker_section (dynobj, ".interp");
9999
0
    BFD_ASSERT (s != NULL);
10000
0
    s->size
10001
0
      = strlen (ELF_DYNAMIC_INTERPRETER (output_bfd)) + 1;
10002
0
    s->contents
10003
0
      = (bfd_byte *) ELF_DYNAMIC_INTERPRETER (output_bfd);
10004
0
    s->alloced = 1;
10005
0
  }
10006
10007
      /* Figure out the size of the PLT header if we know that we
10008
   are using it.  For the sake of cache alignment always use
10009
   a standard header whenever any standard entries are present
10010
   even if microMIPS entries are present as well.  This also
10011
   lets the microMIPS header rely on the value of $v0 only set
10012
   by microMIPS entries, for a small size reduction.
10013
10014
   Set symbol table entry values for symbols that use the
10015
   address of their PLT entry now that we can calculate it.
10016
10017
   Also create the _PROCEDURE_LINKAGE_TABLE_ symbol if we
10018
   haven't already in _bfd_elf_create_dynamic_sections.  */
10019
0
      if (htab->root.splt && htab->plt_mips_offset + htab->plt_comp_offset != 0)
10020
0
  {
10021
0
    bool micromips_p = (MICROMIPS_P (output_bfd)
10022
0
             && !htab->plt_mips_offset);
10023
0
    unsigned int other = micromips_p ? STO_MICROMIPS : 0;
10024
0
    bfd_vma isa_bit = micromips_p;
10025
0
    struct elf_link_hash_entry *h;
10026
0
    bfd_vma size;
10027
10028
0
    BFD_ASSERT (htab->use_plts_and_copy_relocs);
10029
0
    BFD_ASSERT (htab->root.sgotplt->size == 0);
10030
0
    BFD_ASSERT (htab->root.splt->size == 0);
10031
10032
0
    if (htab->root.target_os == is_vxworks && bfd_link_pic (info))
10033
0
      size = 4 * ARRAY_SIZE (mips_vxworks_shared_plt0_entry);
10034
0
    else if (htab->root.target_os == is_vxworks)
10035
0
      size = 4 * ARRAY_SIZE (mips_vxworks_exec_plt0_entry);
10036
0
    else if (ABI_64_P (output_bfd))
10037
0
      size = 4 * ARRAY_SIZE (mips_n64_exec_plt0_entry);
10038
0
    else if (ABI_N32_P (output_bfd))
10039
0
      size = 4 * ARRAY_SIZE (mips_n32_exec_plt0_entry);
10040
0
    else if (!micromips_p)
10041
0
      size = 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry);
10042
0
    else if (htab->insn32)
10043
0
      size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry);
10044
0
    else
10045
0
      size = 2 * ARRAY_SIZE (micromips_o32_exec_plt0_entry);
10046
10047
0
    htab->plt_header_is_comp = micromips_p;
10048
0
    htab->plt_header_size = size;
10049
0
    htab->root.splt->size = (size
10050
0
           + htab->plt_mips_offset
10051
0
           + htab->plt_comp_offset);
10052
0
    htab->root.sgotplt->size = (htab->plt_got_index
10053
0
              * MIPS_ELF_GOT_SIZE (dynobj));
10054
10055
0
    mips_elf_link_hash_traverse (htab, mips_elf_set_plt_sym_value, info);
10056
10057
0
    if (htab->root.hplt == NULL)
10058
0
      {
10059
0
        h = _bfd_elf_define_linkage_sym (dynobj, info, htab->root.splt,
10060
0
                 "_PROCEDURE_LINKAGE_TABLE_");
10061
0
        htab->root.hplt = h;
10062
0
        if (h == NULL)
10063
0
    return false;
10064
0
      }
10065
10066
0
    h = htab->root.hplt;
10067
0
    h->root.u.def.value = isa_bit;
10068
0
    h->other = other;
10069
0
    h->type = STT_FUNC;
10070
0
  }
10071
0
    }
10072
10073
  /* Allocate space for global sym dynamic relocs.  */
10074
0
  elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
10075
10076
0
  mips_elf_estimate_stub_size (output_bfd, info);
10077
10078
0
  if (!mips_elf_lay_out_got (output_bfd, info))
10079
0
    return false;
10080
10081
0
  mips_elf_lay_out_lazy_stubs (info);
10082
10083
  /* The check_relocs and adjust_dynamic_symbol entry points have
10084
     determined the sizes of the various dynamic sections.  Allocate
10085
     memory for them.  */
10086
0
  reltext = false;
10087
0
  for (s = dynobj->sections; s != NULL; s = s->next)
10088
0
    {
10089
0
      const char *name;
10090
10091
      /* It's OK to base decisions on the section name, because none
10092
   of the dynobj section names depend upon the input files.  */
10093
0
      name = bfd_section_name (s);
10094
10095
0
      if ((s->flags & SEC_LINKER_CREATED) == 0)
10096
0
  continue;
10097
10098
0
      if (startswith (name, ".rel"))
10099
0
  {
10100
0
    if (s->size != 0)
10101
0
      {
10102
0
        const char *outname;
10103
0
        asection *target;
10104
10105
        /* If this relocation section applies to a read only
10106
     section, then we probably need a DT_TEXTREL entry.
10107
     If the relocation section is .rel(a).dyn, we always
10108
     assert a DT_TEXTREL entry rather than testing whether
10109
     there exists a relocation to a read only section or
10110
     not.  */
10111
0
        outname = bfd_section_name (s->output_section);
10112
0
        target = bfd_get_section_by_name (output_bfd, outname + 4);
10113
0
        if ((target != NULL
10114
0
       && (target->flags & SEC_READONLY) != 0
10115
0
       && (target->flags & SEC_ALLOC) != 0)
10116
0
      || strcmp (outname, MIPS_ELF_REL_DYN_NAME (info)) == 0)
10117
0
    reltext = true;
10118
10119
        /* We use the reloc_count field as a counter if we need
10120
     to copy relocs into the output file.  */
10121
0
        if (strcmp (name, MIPS_ELF_REL_DYN_NAME (info)) != 0)
10122
0
    s->reloc_count = 0;
10123
10124
        /* If combreloc is enabled, elf_link_sort_relocs() will
10125
     sort relocations, but in a different way than we do,
10126
     and before we're done creating relocations.  Also, it
10127
     will move them around between input sections'
10128
     relocation's contents, so our sorting would be
10129
     broken, so don't let it run.  */
10130
0
        info->combreloc = 0;
10131
0
      }
10132
0
  }
10133
0
      else if (bfd_link_executable (info)
10134
0
         && !htab->use_rld_obj_head
10135
0
         && startswith (name, ".rld_map"))
10136
0
  {
10137
    /* We add a room for __rld_map.  It will be filled in by the
10138
       rtld to contain a pointer to the _r_debug structure.  */
10139
0
    s->size += MIPS_ELF_RLD_MAP_SIZE (output_bfd);
10140
0
  }
10141
0
      else if (SGI_COMPAT (output_bfd)
10142
0
         && startswith (name, ".compact_rel"))
10143
0
  s->size += htab->compact_rel_size;
10144
0
      else if (s == htab->root.splt)
10145
0
  {
10146
    /* If the last PLT entry has a branch delay slot, allocate
10147
       room for an extra nop to fill the delay slot.  This is
10148
       for CPUs without load interlocking.  */
10149
0
    if (! LOAD_INTERLOCKS_P (output_bfd)
10150
0
        && htab->root.target_os != is_vxworks
10151
0
        && s->size > 0)
10152
0
      s->size += 4;
10153
0
  }
10154
0
      else if (! startswith (name, ".init")
10155
0
         && s != htab->root.sgot
10156
0
         && s != htab->root.sgotplt
10157
0
         && s != htab->sstubs
10158
0
         && s != htab->root.sdynbss
10159
0
         && s != htab->root.sdynrelro)
10160
0
  {
10161
    /* It's not one of our sections, so don't allocate space.  */
10162
0
    continue;
10163
0
  }
10164
10165
0
      if (s->size == 0)
10166
0
  {
10167
0
    s->flags |= SEC_EXCLUDE;
10168
0
    continue;
10169
0
  }
10170
10171
0
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
10172
0
  continue;
10173
10174
      /* Allocate memory for the section contents.  */
10175
0
      s->contents = bfd_zalloc (dynobj, s->size);
10176
0
      if (s->contents == NULL)
10177
0
  {
10178
0
    bfd_set_error (bfd_error_no_memory);
10179
0
    return false;
10180
0
  }
10181
0
      s->alloced = 1;
10182
0
    }
10183
10184
0
  if (htab->root.dynamic_sections_created)
10185
0
    {
10186
      /* Add some entries to the .dynamic section.  We fill in the
10187
   values later, in _bfd_mips_elf_finish_dynamic_sections, but we
10188
   must add the entries now so that we get the correct size for
10189
   the .dynamic section.  */
10190
10191
      /* SGI object has the equivalence of DT_DEBUG in the
10192
   DT_MIPS_RLD_MAP entry.  This must come first because glibc
10193
   only fills in DT_MIPS_RLD_MAP (not DT_DEBUG) and some tools
10194
   may only look at the first one they see.  */
10195
0
      if (!bfd_link_pic (info)
10196
0
    && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP, 0))
10197
0
  return false;
10198
10199
0
      if (bfd_link_executable (info)
10200
0
    && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP_REL, 0))
10201
0
  return false;
10202
10203
      /* The DT_DEBUG entry may be filled in by the dynamic linker and
10204
   used by the debugger.  */
10205
0
      if (bfd_link_executable (info)
10206
0
    && !SGI_COMPAT (output_bfd)
10207
0
    && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_DEBUG, 0))
10208
0
  return false;
10209
10210
0
      if (reltext
10211
0
    && (SGI_COMPAT (output_bfd)
10212
0
        || htab->root.target_os == is_vxworks))
10213
0
  info->flags |= DF_TEXTREL;
10214
10215
0
      if ((info->flags & DF_TEXTREL) != 0)
10216
0
  {
10217
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_TEXTREL, 0))
10218
0
      return false;
10219
10220
    /* Clear the DF_TEXTREL flag.  It will be set again if we
10221
       write out an actual text relocation; we may not, because
10222
       at this point we do not know whether e.g. any .eh_frame
10223
       absolute relocations have been converted to PC-relative.  */
10224
0
    info->flags &= ~DF_TEXTREL;
10225
0
  }
10226
10227
0
      if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTGOT, 0))
10228
0
  return false;
10229
10230
0
      sreldyn = mips_elf_rel_dyn_section (info, false);
10231
0
      if (htab->root.target_os == is_vxworks)
10232
0
  {
10233
    /* VxWorks uses .rela.dyn instead of .rel.dyn.  It does not
10234
       use any of the DT_MIPS_* tags.  */
10235
0
    if (sreldyn && sreldyn->size > 0)
10236
0
      {
10237
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELA, 0))
10238
0
    return false;
10239
10240
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELASZ, 0))
10241
0
    return false;
10242
10243
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELAENT, 0))
10244
0
    return false;
10245
0
      }
10246
0
  }
10247
0
      else
10248
0
  {
10249
0
    if (sreldyn && sreldyn->size > 0
10250
0
        && !bfd_is_abs_section (sreldyn->output_section))
10251
0
      {
10252
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_REL, 0))
10253
0
    return false;
10254
10255
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELSZ, 0))
10256
0
    return false;
10257
10258
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELENT, 0))
10259
0
    return false;
10260
0
      }
10261
10262
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_VERSION, 0))
10263
0
      return false;
10264
10265
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_FLAGS, 0))
10266
0
      return false;
10267
10268
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_BASE_ADDRESS, 0))
10269
0
      return false;
10270
10271
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_LOCAL_GOTNO, 0))
10272
0
      return false;
10273
10274
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_SYMTABNO, 0))
10275
0
      return false;
10276
10277
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_UNREFEXTNO, 0))
10278
0
      return false;
10279
10280
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_GOTSYM, 0))
10281
0
      return false;
10282
10283
0
    if (info->emit_gnu_hash
10284
0
        && ! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_XHASH, 0))
10285
0
      return false;
10286
10287
0
    if (IRIX_COMPAT (dynobj) == ict_irix5
10288
0
        && ! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_HIPAGENO, 0))
10289
0
      return false;
10290
10291
0
    if (IRIX_COMPAT (dynobj) == ict_irix6
10292
0
        && (bfd_get_section_by_name
10293
0
      (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (dynobj)))
10294
0
        && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_OPTIONS, 0))
10295
0
      return false;
10296
0
  }
10297
0
      if (htab->root.splt->size > 0)
10298
0
  {
10299
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTREL, 0))
10300
0
      return false;
10301
10302
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_JMPREL, 0))
10303
0
      return false;
10304
10305
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTRELSZ, 0))
10306
0
      return false;
10307
10308
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_PLTGOT, 0))
10309
0
      return false;
10310
0
  }
10311
0
      if (htab->root.target_os == is_vxworks
10312
0
    && !elf_vxworks_add_dynamic_entries (output_bfd, info))
10313
0
  return false;
10314
0
    }
10315
10316
0
  return true;
10317
0
}
10318

10319
/* REL is a relocation in INPUT_BFD that is being copied to OUTPUT_BFD.
10320
   Adjust its R_ADDEND field so that it is correct for the output file.
10321
   LOCAL_SYMS and LOCAL_SECTIONS are arrays of INPUT_BFD's local symbols
10322
   and sections respectively; both use symbol indexes.  */
10323
10324
static void
10325
mips_elf_adjust_addend (bfd *output_bfd, struct bfd_link_info *info,
10326
      bfd *input_bfd, Elf_Internal_Sym *local_syms,
10327
      asection **local_sections, Elf_Internal_Rela *rel)
10328
0
{
10329
0
  unsigned int r_type, r_symndx;
10330
0
  Elf_Internal_Sym *sym;
10331
0
  asection *sec;
10332
10333
0
  if (mips_elf_local_relocation_p (input_bfd, rel, local_sections))
10334
0
    {
10335
0
      r_type = ELF_R_TYPE (output_bfd, rel->r_info);
10336
0
      if (gprel16_reloc_p (r_type)
10337
0
    || r_type == R_MIPS_GPREL32
10338
0
    || literal_reloc_p (r_type))
10339
0
  {
10340
0
    rel->r_addend += _bfd_get_gp_value (input_bfd);
10341
0
    rel->r_addend -= _bfd_get_gp_value (output_bfd);
10342
0
  }
10343
10344
0
      r_symndx = ELF_R_SYM (output_bfd, rel->r_info);
10345
0
      sym = local_syms + r_symndx;
10346
10347
      /* Adjust REL's addend to account for section merging.  */
10348
0
      if (!bfd_link_relocatable (info))
10349
0
  {
10350
0
    sec = local_sections[r_symndx];
10351
0
    _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
10352
0
  }
10353
10354
      /* This would normally be done by the rela_normal code in elflink.c.  */
10355
0
      if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
10356
0
  rel->r_addend += local_sections[r_symndx]->output_offset;
10357
0
    }
10358
0
}
10359
10360
/* Handle relocations against symbols from removed linkonce sections,
10361
   or sections discarded by a linker script.  We use this wrapper around
10362
   RELOC_AGAINST_DISCARDED_SECTION to handle triplets of compound relocs
10363
   on 64-bit ELF targets.  In this case for any relocation handled, which
10364
   always be the first in a triplet, the remaining two have to be processed
10365
   together with the first, even if they are R_MIPS_NONE.  It is the symbol
10366
   index referred by the first reloc that applies to all the three and the
10367
   remaining two never refer to an object symbol.  And it is the final
10368
   relocation (the last non-null one) that determines the output field of
10369
   the whole relocation so retrieve the corresponding howto structure for
10370
   the relocatable field to be cleared by RELOC_AGAINST_DISCARDED_SECTION.
10371
10372
   Note that RELOC_AGAINST_DISCARDED_SECTION is a macro that uses "continue"
10373
   and therefore requires to be pasted in a loop.  It also defines a block
10374
   and does not protect any of its arguments, hence the extra brackets.  */
10375
10376
static void
10377
mips_reloc_against_discarded_section (bfd *output_bfd,
10378
              struct bfd_link_info *info,
10379
              bfd *input_bfd, asection *input_section,
10380
              Elf_Internal_Rela **rel,
10381
              const Elf_Internal_Rela **relend,
10382
              bool rel_reloc,
10383
              reloc_howto_type *howto,
10384
              bfd_byte *contents)
10385
0
{
10386
0
  const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
10387
0
  int count = bed->s->int_rels_per_ext_rel;
10388
0
  unsigned int r_type;
10389
0
  int i;
10390
10391
0
  for (i = count - 1; i > 0; i--)
10392
0
    {
10393
0
      r_type = ELF_R_TYPE (output_bfd, (*rel)[i].r_info);
10394
0
      if (r_type != R_MIPS_NONE)
10395
0
  {
10396
0
    howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type, !rel_reloc);
10397
0
    break;
10398
0
  }
10399
0
    }
10400
0
  do
10401
0
    {
10402
0
       RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
10403
0
          (*rel), count, (*relend),
10404
0
          howto, i, contents);
10405
0
    }
10406
0
  while (0);
10407
0
}
10408
10409
/* Relocate a MIPS ELF section.  */
10410
10411
int
10412
_bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
10413
        bfd *input_bfd, asection *input_section,
10414
        bfd_byte *contents, Elf_Internal_Rela *relocs,
10415
        Elf_Internal_Sym *local_syms,
10416
        asection **local_sections)
10417
0
{
10418
0
  Elf_Internal_Rela *rel;
10419
0
  const Elf_Internal_Rela *relend;
10420
0
  bfd_vma addend = 0;
10421
0
  bool use_saved_addend_p = false;
10422
10423
0
  relend = relocs + input_section->reloc_count;
10424
0
  for (rel = relocs; rel < relend; ++rel)
10425
0
    {
10426
0
      const char *name;
10427
0
      bfd_vma value = 0;
10428
0
      reloc_howto_type *howto;
10429
0
      bool cross_mode_jump_p = false;
10430
      /* TRUE if the relocation is a RELA relocation, rather than a
10431
   REL relocation.  */
10432
0
      bool rela_relocation_p = true;
10433
0
      unsigned int r_type = ELF_R_TYPE (output_bfd, rel->r_info);
10434
0
      const char *msg;
10435
0
      unsigned long r_symndx;
10436
0
      asection *sec;
10437
0
      Elf_Internal_Shdr *symtab_hdr;
10438
0
      struct elf_link_hash_entry *h;
10439
0
      bool rel_reloc;
10440
10441
0
      rel_reloc = (NEWABI_P (input_bfd)
10442
0
       && mips_elf_rel_relocation_p (input_bfd, input_section,
10443
0
             relocs, rel));
10444
      /* Find the relocation howto for this relocation.  */
10445
0
      howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type, !rel_reloc);
10446
10447
0
      r_symndx = ELF_R_SYM (input_bfd, rel->r_info);
10448
0
      symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
10449
0
      if (mips_elf_local_relocation_p (input_bfd, rel, local_sections))
10450
0
  {
10451
0
    sec = local_sections[r_symndx];
10452
0
    h = NULL;
10453
0
  }
10454
0
      else
10455
0
  {
10456
0
    unsigned long extsymoff;
10457
10458
0
    extsymoff = 0;
10459
0
    if (!elf_bad_symtab (input_bfd))
10460
0
      extsymoff = symtab_hdr->sh_info;
10461
0
    h = elf_sym_hashes (input_bfd) [r_symndx - extsymoff];
10462
0
    while (h->root.type == bfd_link_hash_indirect
10463
0
     || h->root.type == bfd_link_hash_warning)
10464
0
      h = (struct elf_link_hash_entry *) h->root.u.i.link;
10465
10466
0
    sec = NULL;
10467
0
    if (h->root.type == bfd_link_hash_defined
10468
0
        || h->root.type == bfd_link_hash_defweak)
10469
0
      sec = h->root.u.def.section;
10470
0
  }
10471
10472
0
      if (sec != NULL && discarded_section (sec))
10473
0
  {
10474
0
    mips_reloc_against_discarded_section (output_bfd, info, input_bfd,
10475
0
            input_section, &rel, &relend,
10476
0
            rel_reloc, howto, contents);
10477
0
    continue;
10478
0
  }
10479
10480
0
      if (r_type == R_MIPS_64 && ! NEWABI_P (input_bfd))
10481
0
  {
10482
    /* Some 32-bit code uses R_MIPS_64.  In particular, people use
10483
       64-bit code, but make sure all their addresses are in the
10484
       lowermost or uppermost 32-bit section of the 64-bit address
10485
       space.  Thus, when they use an R_MIPS_64 they mean what is
10486
       usually meant by R_MIPS_32, with the exception that the
10487
       stored value is sign-extended to 64 bits.  */
10488
0
    howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, R_MIPS_32, false);
10489
10490
    /* On big-endian systems, we need to lie about the position
10491
       of the reloc.  */
10492
0
    if (bfd_big_endian (input_bfd))
10493
0
      rel->r_offset += 4;
10494
0
  }
10495
10496
0
      if (!use_saved_addend_p)
10497
0
  {
10498
    /* If these relocations were originally of the REL variety,
10499
       we must pull the addend out of the field that will be
10500
       relocated.  Otherwise, we simply use the contents of the
10501
       RELA relocation.  */
10502
0
    if (mips_elf_rel_relocation_p (input_bfd, input_section,
10503
0
           relocs, rel))
10504
0
      {
10505
0
        rela_relocation_p = false;
10506
0
        addend = mips_elf_read_rel_addend (input_bfd, input_section,
10507
0
             rel, howto, contents);
10508
0
        if (hi16_reloc_p (r_type)
10509
0
      || (got16_reloc_p (r_type)
10510
0
          && mips_elf_local_relocation_p (input_bfd, rel,
10511
0
                  local_sections)))
10512
0
    {
10513
0
      if (!mips_elf_add_lo16_rel_addend (input_bfd, input_section,
10514
0
                 rel, relend,
10515
0
                 contents, &addend))
10516
0
        {
10517
0
          if (h)
10518
0
      name = h->root.root.string;
10519
0
          else
10520
0
      name = bfd_elf_sym_name (input_bfd, symtab_hdr,
10521
0
             local_syms + r_symndx,
10522
0
             sec);
10523
0
          _bfd_error_handler
10524
      /* xgettext:c-format */
10525
0
      (_("%pB: can't find matching LO16 reloc against `%s'"
10526
0
         " for %s at %#" PRIx64 " in section `%pA'"),
10527
0
       input_bfd, name,
10528
0
       howto->name, (uint64_t) rel->r_offset, input_section);
10529
0
        }
10530
0
    }
10531
0
        else
10532
0
    addend <<= howto->rightshift;
10533
0
      }
10534
0
    else
10535
0
      addend = rel->r_addend;
10536
0
    mips_elf_adjust_addend (output_bfd, info, input_bfd,
10537
0
          local_syms, local_sections, rel);
10538
0
  }
10539
10540
0
      if (bfd_link_relocatable (info))
10541
0
  {
10542
0
    if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd)
10543
0
        && bfd_big_endian (input_bfd))
10544
0
      rel->r_offset -= 4;
10545
10546
0
    if (!rela_relocation_p && rel->r_addend)
10547
0
      {
10548
0
        addend += rel->r_addend;
10549
0
        if (hi16_reloc_p (r_type) || got16_reloc_p (r_type))
10550
0
    addend = mips_elf_high (addend);
10551
0
        else if (r_type == R_MIPS_HIGHER)
10552
0
    addend = mips_elf_higher (addend);
10553
0
        else if (r_type == R_MIPS_HIGHEST)
10554
0
    addend = mips_elf_highest (addend);
10555
0
        else
10556
0
    addend >>= howto->rightshift;
10557
10558
        /* We use the source mask, rather than the destination
10559
     mask because the place to which we are writing will be
10560
     source of the addend in the final link.  */
10561
0
        addend &= howto->src_mask;
10562
10563
0
        if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
10564
    /* See the comment above about using R_MIPS_64 in the 32-bit
10565
       ABI.  Here, we need to update the addend.  It would be
10566
       possible to get away with just using the R_MIPS_32 reloc
10567
       but for endianness.  */
10568
0
    {
10569
0
      bfd_vma sign_bits;
10570
0
      bfd_vma low_bits;
10571
0
      bfd_vma high_bits;
10572
10573
0
      if (addend & ((bfd_vma) 1 << 31))
10574
0
#ifdef BFD64
10575
0
        sign_bits = ((bfd_vma) 1 << 32) - 1;
10576
#else
10577
        sign_bits = -1;
10578
#endif
10579
0
      else
10580
0
        sign_bits = 0;
10581
10582
      /* If we don't know that we have a 64-bit type,
10583
         do two separate stores.  */
10584
0
      if (bfd_big_endian (input_bfd))
10585
0
        {
10586
          /* Store the sign-bits (which are most significant)
10587
       first.  */
10588
0
          low_bits = sign_bits;
10589
0
          high_bits = addend;
10590
0
        }
10591
0
      else
10592
0
        {
10593
0
          low_bits = addend;
10594
0
          high_bits = sign_bits;
10595
0
        }
10596
0
      bfd_put_32 (input_bfd, low_bits,
10597
0
            contents + rel->r_offset);
10598
0
      bfd_put_32 (input_bfd, high_bits,
10599
0
            contents + rel->r_offset + 4);
10600
0
      continue;
10601
0
    }
10602
10603
0
        if (! mips_elf_perform_relocation (info, howto, rel, addend,
10604
0
             input_bfd, input_section,
10605
0
             contents, false))
10606
0
    return false;
10607
0
      }
10608
10609
    /* Go on to the next relocation.  */
10610
0
    continue;
10611
0
  }
10612
10613
      /* In the N32 and 64-bit ABIs there may be multiple consecutive
10614
   relocations for the same offset.  In that case we are
10615
   supposed to treat the output of each relocation as the addend
10616
   for the next.  */
10617
0
      if (rel + 1 < relend
10618
0
    && rel->r_offset == rel[1].r_offset
10619
0
    && ELF_R_TYPE (input_bfd, rel[1].r_info) != R_MIPS_NONE)
10620
0
  use_saved_addend_p = true;
10621
0
      else
10622
0
  use_saved_addend_p = false;
10623
10624
      /* Figure out what value we are supposed to relocate.  */
10625
0
      switch (mips_elf_calculate_relocation (output_bfd, input_bfd,
10626
0
               input_section, contents,
10627
0
               info, rel, addend, howto,
10628
0
               local_syms, local_sections,
10629
0
               &value, &name, &cross_mode_jump_p,
10630
0
               use_saved_addend_p))
10631
0
  {
10632
0
  case bfd_reloc_continue:
10633
    /* There's nothing to do.  */
10634
0
    continue;
10635
10636
0
  case bfd_reloc_undefined:
10637
    /* mips_elf_calculate_relocation already called the
10638
       undefined_symbol callback.  There's no real point in
10639
       trying to perform the relocation at this point, so we
10640
       just skip ahead to the next relocation.  */
10641
0
    continue;
10642
10643
0
  case bfd_reloc_notsupported:
10644
0
    msg = _("internal error: unsupported relocation error");
10645
0
    info->callbacks->warning
10646
0
      (info, msg, name, input_bfd, input_section, rel->r_offset);
10647
0
    return false;
10648
10649
0
  case bfd_reloc_overflow:
10650
0
    if (use_saved_addend_p)
10651
      /* Ignore overflow until we reach the last relocation for
10652
         a given location.  */
10653
0
      ;
10654
0
    else
10655
0
      {
10656
0
        struct mips_elf_link_hash_table *htab;
10657
10658
0
        htab = mips_elf_hash_table (info);
10659
0
        BFD_ASSERT (htab != NULL);
10660
0
        BFD_ASSERT (name != NULL);
10661
0
        if (!htab->small_data_overflow_reported
10662
0
      && (gprel16_reloc_p (howto->type)
10663
0
          || literal_reloc_p (howto->type)))
10664
0
    {
10665
0
      msg = _("small-data section too large;"
10666
0
        " lower small-data size limit (see option -G)");
10667
10668
0
      htab->small_data_overflow_reported = true;
10669
0
      (*info->callbacks->einfo) ("%P: %s\n", msg);
10670
0
    }
10671
0
        (*info->callbacks->reloc_overflow)
10672
0
    (info, NULL, name, howto->name, (bfd_vma) 0,
10673
0
     input_bfd, input_section, rel->r_offset);
10674
0
      }
10675
0
    break;
10676
10677
0
  case bfd_reloc_ok:
10678
0
    break;
10679
10680
0
  case bfd_reloc_outofrange:
10681
0
    msg = NULL;
10682
0
    if (jal_reloc_p (howto->type))
10683
0
      msg = (cross_mode_jump_p
10684
0
       ? _("cannot convert a jump to JALX "
10685
0
           "for a non-word-aligned address")
10686
0
       : (howto->type == R_MIPS16_26
10687
0
          ? _("jump to a non-word-aligned address")
10688
0
          : _("jump to a non-instruction-aligned address")));
10689
0
    else if (b_reloc_p (howto->type))
10690
0
      msg = (cross_mode_jump_p
10691
0
       ? _("cannot convert a branch to JALX "
10692
0
           "for a non-word-aligned address")
10693
0
       : _("branch to a non-instruction-aligned address"));
10694
0
    else if (aligned_pcrel_reloc_p (howto->type))
10695
0
      msg = _("PC-relative load from unaligned address");
10696
0
    if (msg)
10697
0
      {
10698
0
        info->callbacks->einfo
10699
0
    ("%X%H: %s\n", input_bfd, input_section, rel->r_offset, msg);
10700
0
        break;
10701
0
      }
10702
    /* Fall through.  */
10703
10704
0
  default:
10705
0
    abort ();
10706
0
    break;
10707
0
  }
10708
10709
      /* If we've got another relocation for the address, keep going
10710
   until we reach the last one.  */
10711
0
      if (use_saved_addend_p)
10712
0
  {
10713
0
    addend = value;
10714
0
    continue;
10715
0
  }
10716
10717
0
      if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
10718
  /* See the comment above about using R_MIPS_64 in the 32-bit
10719
     ABI.  Until now, we've been using the HOWTO for R_MIPS_32;
10720
     that calculated the right value.  Now, however, we
10721
     sign-extend the 32-bit result to 64-bits, and store it as a
10722
     64-bit value.  We are especially generous here in that we
10723
     go to extreme lengths to support this usage on systems with
10724
     only a 32-bit VMA.  */
10725
0
  {
10726
0
    bfd_vma sign_bits;
10727
0
    bfd_vma low_bits;
10728
0
    bfd_vma high_bits;
10729
10730
0
    if (value & ((bfd_vma) 1 << 31))
10731
0
#ifdef BFD64
10732
0
      sign_bits = ((bfd_vma) 1 << 32) - 1;
10733
#else
10734
      sign_bits = -1;
10735
#endif
10736
0
    else
10737
0
      sign_bits = 0;
10738
10739
    /* If we don't know that we have a 64-bit type,
10740
       do two separate stores.  */
10741
0
    if (bfd_big_endian (input_bfd))
10742
0
      {
10743
        /* Undo what we did above.  */
10744
0
        rel->r_offset -= 4;
10745
        /* Store the sign-bits (which are most significant)
10746
     first.  */
10747
0
        low_bits = sign_bits;
10748
0
        high_bits = value;
10749
0
      }
10750
0
    else
10751
0
      {
10752
0
        low_bits = value;
10753
0
        high_bits = sign_bits;
10754
0
      }
10755
0
    bfd_put_32 (input_bfd, low_bits,
10756
0
          contents + rel->r_offset);
10757
0
    bfd_put_32 (input_bfd, high_bits,
10758
0
          contents + rel->r_offset + 4);
10759
0
    continue;
10760
0
  }
10761
10762
      /* Actually perform the relocation.  */
10763
0
      if (! mips_elf_perform_relocation (info, howto, rel, value,
10764
0
           input_bfd, input_section,
10765
0
           contents, cross_mode_jump_p))
10766
0
  return false;
10767
0
    }
10768
10769
0
  return true;
10770
0
}
10771

10772
/* A function that iterates over each entry in la25_stubs and fills
10773
   in the code for each one.  DATA points to a mips_htab_traverse_info.  */
10774
10775
static int
10776
mips_elf_create_la25_stub (void **slot, void *data)
10777
0
{
10778
0
  struct mips_htab_traverse_info *hti;
10779
0
  struct mips_elf_link_hash_table *htab;
10780
0
  struct mips_elf_la25_stub *stub;
10781
0
  asection *s;
10782
0
  bfd_byte *loc;
10783
0
  bfd_vma offset, target, target_high, target_low;
10784
0
  bfd_vma branch_pc;
10785
0
  bfd_signed_vma pcrel_offset = 0;
10786
10787
0
  stub = (struct mips_elf_la25_stub *) *slot;
10788
0
  hti = (struct mips_htab_traverse_info *) data;
10789
0
  htab = mips_elf_hash_table (hti->info);
10790
0
  BFD_ASSERT (htab != NULL);
10791
10792
  /* Create the section contents, if we haven't already.  */
10793
0
  s = stub->stub_section;
10794
0
  loc = s->contents;
10795
0
  if (loc == NULL)
10796
0
    {
10797
0
      loc = bfd_malloc (s->size);
10798
0
      if (loc == NULL)
10799
0
  {
10800
0
    hti->error = true;
10801
0
    return false;
10802
0
  }
10803
0
      s->contents = loc;
10804
0
    }
10805
10806
  /* Work out where in the section this stub should go.  */
10807
0
  offset = stub->offset;
10808
10809
  /* We add 8 here to account for the LUI/ADDIU instructions
10810
     before the branch instruction.  This cannot be moved down to
10811
     where pcrel_offset is calculated as 's' is updated in
10812
     mips_elf_get_la25_target.  */
10813
0
  branch_pc = s->output_section->vma + s->output_offset + offset + 8;
10814
10815
  /* Work out the target address.  */
10816
0
  target = mips_elf_get_la25_target (stub, &s);
10817
0
  target += s->output_section->vma + s->output_offset;
10818
10819
0
  target_high = ((target + 0x8000) >> 16) & 0xffff;
10820
0
  target_low = (target & 0xffff);
10821
10822
  /* Calculate the PC of the compact branch instruction (for the case where
10823
     compact branches are used for either microMIPSR6 or MIPSR6 with
10824
     compact branches.  Add 4-bytes to account for BC using the PC of the
10825
     next instruction as the base.  */
10826
0
  pcrel_offset = target - (branch_pc + 4);
10827
10828
0
  if (stub->stub_section != htab->strampoline)
10829
0
    {
10830
      /* This is a simple LUI/ADDIU stub.  Zero out the beginning
10831
   of the section and write the two instructions at the end.  */
10832
0
      memset (loc, 0, offset);
10833
0
      loc += offset;
10834
0
      if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
10835
0
  {
10836
0
    bfd_put_micromips_32 (hti->output_bfd,
10837
0
        LA25_LUI_MICROMIPS (target_high),
10838
0
        loc);
10839
0
    bfd_put_micromips_32 (hti->output_bfd,
10840
0
        LA25_ADDIU_MICROMIPS (target_low),
10841
0
        loc + 4);
10842
0
  }
10843
0
      else
10844
0
  {
10845
0
    bfd_put_32 (hti->output_bfd, LA25_LUI (target_high), loc);
10846
0
    bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 4);
10847
0
  }
10848
0
    }
10849
0
  else
10850
0
    {
10851
      /* This is trampoline.  */
10852
0
      loc += offset;
10853
0
      if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
10854
0
  {
10855
0
    bfd_put_micromips_32 (hti->output_bfd,
10856
0
        LA25_LUI_MICROMIPS (target_high), loc);
10857
0
    bfd_put_micromips_32 (hti->output_bfd,
10858
0
        LA25_J_MICROMIPS (target), loc + 4);
10859
0
    bfd_put_micromips_32 (hti->output_bfd,
10860
0
        LA25_ADDIU_MICROMIPS (target_low), loc + 8);
10861
0
    bfd_put_32 (hti->output_bfd, 0, loc + 12);
10862
0
  }
10863
0
      else
10864
0
  {
10865
0
    bfd_put_32 (hti->output_bfd, LA25_LUI (target_high), loc);
10866
0
    if (MIPSR6_P (hti->output_bfd) && htab->compact_branches)
10867
0
      {
10868
0
        bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 4);
10869
0
        bfd_put_32 (hti->output_bfd, LA25_BC (pcrel_offset), loc + 8);
10870
0
      }
10871
0
    else
10872
0
      {
10873
0
        bfd_put_32 (hti->output_bfd, LA25_J (target), loc + 4);
10874
0
        bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 8);
10875
0
      }
10876
0
    bfd_put_32 (hti->output_bfd, 0, loc + 12);
10877
0
  }
10878
0
    }
10879
0
  return true;
10880
0
}
10881
10882
/* If NAME is one of the special IRIX6 symbols defined by the linker,
10883
   adjust it appropriately now.  */
10884
10885
static void
10886
mips_elf_irix6_finish_dynamic_symbol (bfd *abfd ATTRIBUTE_UNUSED,
10887
              const char *name, Elf_Internal_Sym *sym)
10888
0
{
10889
  /* The linker script takes care of providing names and values for
10890
     these, but we must place them into the right sections.  */
10891
0
  static const char* const text_section_symbols[] = {
10892
0
    "_ftext",
10893
0
    "_etext",
10894
0
    "__dso_displacement",
10895
0
    "__elf_header",
10896
0
    "__program_header_table",
10897
0
    NULL
10898
0
  };
10899
10900
0
  static const char* const data_section_symbols[] = {
10901
0
    "_fdata",
10902
0
    "_edata",
10903
0
    "_end",
10904
0
    "_fbss",
10905
0
    NULL
10906
0
  };
10907
10908
0
  const char* const *p;
10909
0
  int i;
10910
10911
0
  for (i = 0; i < 2; ++i)
10912
0
    for (p = (i == 0) ? text_section_symbols : data_section_symbols;
10913
0
   *p;
10914
0
   ++p)
10915
0
      if (strcmp (*p, name) == 0)
10916
0
  {
10917
    /* All of these symbols are given type STT_SECTION by the
10918
       IRIX6 linker.  */
10919
0
    sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
10920
0
    sym->st_other = STO_PROTECTED;
10921
10922
    /* The IRIX linker puts these symbols in special sections.  */
10923
0
    if (i == 0)
10924
0
      sym->st_shndx = SHN_MIPS_TEXT;
10925
0
    else
10926
0
      sym->st_shndx = SHN_MIPS_DATA;
10927
10928
0
    break;
10929
0
  }
10930
0
}
10931
10932
/* Finish up dynamic symbol handling.  We set the contents of various
10933
   dynamic sections here.  */
10934
10935
bool
10936
_bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
10937
             struct bfd_link_info *info,
10938
             struct elf_link_hash_entry *h,
10939
             Elf_Internal_Sym *sym)
10940
0
{
10941
0
  bfd *dynobj;
10942
0
  asection *sgot;
10943
0
  struct mips_got_info *g, *gg;
10944
0
  const char *name;
10945
0
  int idx;
10946
0
  struct mips_elf_link_hash_table *htab;
10947
0
  struct mips_elf_link_hash_entry *hmips;
10948
10949
0
  htab = mips_elf_hash_table (info);
10950
0
  BFD_ASSERT (htab != NULL);
10951
0
  dynobj = elf_hash_table (info)->dynobj;
10952
0
  hmips = (struct mips_elf_link_hash_entry *) h;
10953
10954
0
  BFD_ASSERT (htab->root.target_os != is_vxworks);
10955
10956
0
  if (h->plt.plist != NULL
10957
0
      && (h->plt.plist->mips_offset != MINUS_ONE
10958
0
    || h->plt.plist->comp_offset != MINUS_ONE))
10959
0
    {
10960
      /* We've decided to create a PLT entry for this symbol.  */
10961
0
      bfd_byte *loc;
10962
0
      bfd_vma header_address, got_address;
10963
0
      bfd_vma got_address_high, got_address_low, load;
10964
0
      bfd_vma got_index;
10965
0
      bfd_vma isa_bit;
10966
10967
0
      got_index = h->plt.plist->gotplt_index;
10968
10969
0
      BFD_ASSERT (htab->use_plts_and_copy_relocs);
10970
0
      BFD_ASSERT (h->dynindx != -1);
10971
0
      BFD_ASSERT (htab->root.splt != NULL);
10972
0
      BFD_ASSERT (got_index != MINUS_ONE);
10973
0
      BFD_ASSERT (!h->def_regular);
10974
10975
      /* Calculate the address of the PLT header.  */
10976
0
      isa_bit = htab->plt_header_is_comp;
10977
0
      header_address = (htab->root.splt->output_section->vma
10978
0
      + htab->root.splt->output_offset + isa_bit);
10979
10980
      /* Calculate the address of the .got.plt entry.  */
10981
0
      got_address = (htab->root.sgotplt->output_section->vma
10982
0
         + htab->root.sgotplt->output_offset
10983
0
         + got_index * MIPS_ELF_GOT_SIZE (dynobj));
10984
10985
0
      got_address_high = ((got_address + 0x8000) >> 16) & 0xffff;
10986
0
      got_address_low = got_address & 0xffff;
10987
10988
      /* The PLT sequence is not safe for N64 if .got.plt entry's address
10989
   cannot be loaded in two instructions.  */
10990
0
      if (ABI_64_P (output_bfd)
10991
0
    && ((got_address + 0x80008000) & ~(bfd_vma) 0xffffffff) != 0)
10992
0
  {
10993
0
    _bfd_error_handler
10994
      /* xgettext:c-format */
10995
0
      (_("%pB: `%pA' entry VMA of %#" PRIx64 " outside the 32-bit range "
10996
0
         "supported; consider using `-Ttext-segment=...'"),
10997
0
       output_bfd,
10998
0
       htab->root.sgotplt->output_section,
10999
0
       (int64_t) got_address);
11000
0
    bfd_set_error (bfd_error_no_error);
11001
0
    return false;
11002
0
  }
11003
11004
      /* Initially point the .got.plt entry at the PLT header.  */
11005
0
      loc = (htab->root.sgotplt->contents
11006
0
       + got_index * MIPS_ELF_GOT_SIZE (dynobj));
11007
0
      if (ABI_64_P (output_bfd))
11008
0
  bfd_put_64 (output_bfd, header_address, loc);
11009
0
      else
11010
0
  bfd_put_32 (output_bfd, header_address, loc);
11011
11012
      /* Now handle the PLT itself.  First the standard entry (the order
11013
   does not matter, we just have to pick one).  */
11014
0
      if (h->plt.plist->mips_offset != MINUS_ONE)
11015
0
  {
11016
0
    const bfd_vma *plt_entry;
11017
0
    bfd_vma plt_offset;
11018
11019
0
    plt_offset = htab->plt_header_size + h->plt.plist->mips_offset;
11020
11021
0
    BFD_ASSERT (plt_offset <= htab->root.splt->size);
11022
11023
    /* Find out where the .plt entry should go.  */
11024
0
    loc = htab->root.splt->contents + plt_offset;
11025
11026
    /* Pick the load opcode.  */
11027
0
    load = MIPS_ELF_LOAD_WORD (output_bfd);
11028
11029
    /* Fill in the PLT entry itself.  */
11030
11031
0
    if (MIPSR6_P (output_bfd))
11032
0
      plt_entry = htab->compact_branches ? mipsr6_exec_plt_entry_compact
11033
0
                 : mipsr6_exec_plt_entry;
11034
0
    else
11035
0
      plt_entry = mips_exec_plt_entry;
11036
0
    bfd_put_32 (output_bfd, plt_entry[0] | got_address_high, loc);
11037
0
    bfd_put_32 (output_bfd, plt_entry[1] | got_address_low | load,
11038
0
          loc + 4);
11039
11040
0
    if (! LOAD_INTERLOCKS_P (output_bfd)
11041
0
        || (MIPSR6_P (output_bfd) && htab->compact_branches))
11042
0
      {
11043
0
        bfd_put_32 (output_bfd, plt_entry[2] | got_address_low, loc + 8);
11044
0
        bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
11045
0
      }
11046
0
    else
11047
0
      {
11048
0
        bfd_put_32 (output_bfd, plt_entry[3], loc + 8);
11049
0
        bfd_put_32 (output_bfd, plt_entry[2] | got_address_low,
11050
0
        loc + 12);
11051
0
      }
11052
0
  }
11053
11054
      /* Now the compressed entry.  They come after any standard ones.  */
11055
0
      if (h->plt.plist->comp_offset != MINUS_ONE)
11056
0
  {
11057
0
    bfd_vma plt_offset;
11058
11059
0
    plt_offset = (htab->plt_header_size + htab->plt_mips_offset
11060
0
      + h->plt.plist->comp_offset);
11061
11062
0
    BFD_ASSERT (plt_offset <= htab->root.splt->size);
11063
11064
    /* Find out where the .plt entry should go.  */
11065
0
    loc = htab->root.splt->contents + plt_offset;
11066
11067
    /* Fill in the PLT entry itself.  */
11068
0
    if (!MICROMIPS_P (output_bfd))
11069
0
      {
11070
0
        const bfd_vma *plt_entry = mips16_o32_exec_plt_entry;
11071
11072
0
        bfd_put_16 (output_bfd, plt_entry[0], loc);
11073
0
        bfd_put_16 (output_bfd, plt_entry[1], loc + 2);
11074
0
        bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11075
0
        bfd_put_16 (output_bfd, plt_entry[3], loc + 6);
11076
0
        bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11077
0
        bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
11078
0
        bfd_put_32 (output_bfd, got_address, loc + 12);
11079
0
      }
11080
0
    else if (htab->insn32)
11081
0
      {
11082
0
        const bfd_vma *plt_entry = micromips_insn32_o32_exec_plt_entry;
11083
11084
0
        bfd_put_16 (output_bfd, plt_entry[0], loc);
11085
0
        bfd_put_16 (output_bfd, got_address_high, loc + 2);
11086
0
        bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11087
0
        bfd_put_16 (output_bfd, got_address_low, loc + 6);
11088
0
        bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11089
0
        bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
11090
0
        bfd_put_16 (output_bfd, plt_entry[6], loc + 12);
11091
0
        bfd_put_16 (output_bfd, got_address_low, loc + 14);
11092
0
      }
11093
0
    else
11094
0
      {
11095
0
        const bfd_vma *plt_entry = micromips_o32_exec_plt_entry;
11096
0
        bfd_signed_vma gotpc_offset;
11097
0
        bfd_vma loc_address;
11098
11099
0
        BFD_ASSERT (got_address % 4 == 0);
11100
11101
0
        loc_address = (htab->root.splt->output_section->vma
11102
0
           + htab->root.splt->output_offset + plt_offset);
11103
0
        gotpc_offset = got_address - ((loc_address | 3) ^ 3);
11104
11105
        /* ADDIUPC has a span of +/-16MB, check we're in range.  */
11106
0
        if (gotpc_offset + 0x1000000 >= 0x2000000)
11107
0
    {
11108
0
      _bfd_error_handler
11109
        /* xgettext:c-format */
11110
0
        (_("%pB: `%pA' offset of %" PRId64 " from `%pA' "
11111
0
           "beyond the range of ADDIUPC"),
11112
0
         output_bfd,
11113
0
         htab->root.sgotplt->output_section,
11114
0
         (int64_t) gotpc_offset,
11115
0
         htab->root.splt->output_section);
11116
0
      bfd_set_error (bfd_error_no_error);
11117
0
      return false;
11118
0
    }
11119
0
        bfd_put_16 (output_bfd,
11120
0
        plt_entry[0] | ((gotpc_offset >> 18) & 0x7f), loc);
11121
0
        bfd_put_16 (output_bfd, (gotpc_offset >> 2) & 0xffff, loc + 2);
11122
0
        bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11123
0
        bfd_put_16 (output_bfd, plt_entry[3], loc + 6);
11124
0
        bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11125
0
        bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
11126
0
      }
11127
0
  }
11128
11129
      /* Emit an R_MIPS_JUMP_SLOT relocation against the .got.plt entry.  */
11130
0
      mips_elf_output_dynamic_relocation (output_bfd, htab->root.srelplt,
11131
0
            got_index - 2, h->dynindx,
11132
0
            R_MIPS_JUMP_SLOT, got_address);
11133
11134
      /* We distinguish between PLT entries and lazy-binding stubs by
11135
   giving the former an st_other value of STO_MIPS_PLT.  Set the
11136
   flag and leave the value if there are any relocations in the
11137
   binary where pointer equality matters.  */
11138
0
      sym->st_shndx = SHN_UNDEF;
11139
0
      if (h->pointer_equality_needed)
11140
0
  sym->st_other = ELF_ST_SET_MIPS_PLT (sym->st_other);
11141
0
      else
11142
0
  {
11143
0
    sym->st_value = 0;
11144
0
    sym->st_other = 0;
11145
0
  }
11146
0
    }
11147
11148
0
  if (h->plt.plist != NULL && h->plt.plist->stub_offset != MINUS_ONE)
11149
0
    {
11150
      /* We've decided to create a lazy-binding stub.  */
11151
0
      bool micromips_p = MICROMIPS_P (output_bfd);
11152
0
      unsigned int other = micromips_p ? STO_MICROMIPS : 0;
11153
0
      bfd_vma stub_size = htab->function_stub_size;
11154
0
      bfd_byte stub[MIPS_FUNCTION_STUB_BIG_SIZE];
11155
0
      bfd_vma isa_bit = micromips_p;
11156
0
      bfd_vma stub_big_size;
11157
11158
0
      if (!micromips_p)
11159
0
  stub_big_size = MIPS_FUNCTION_STUB_BIG_SIZE;
11160
0
      else if (htab->insn32)
11161
0
  stub_big_size = MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE;
11162
0
      else
11163
0
  stub_big_size = MICROMIPS_FUNCTION_STUB_BIG_SIZE;
11164
11165
      /* This symbol has a stub.  Set it up.  */
11166
11167
0
      BFD_ASSERT (h->dynindx != -1);
11168
11169
0
      BFD_ASSERT (stub_size == stub_big_size || h->dynindx <= 0xffff);
11170
11171
      /* Values up to 2^31 - 1 are allowed.  Larger values would cause
11172
   sign extension at runtime in the stub, resulting in a negative
11173
   index value.  */
11174
0
      if (h->dynindx & ~0x7fffffff)
11175
0
  {
11176
0
    _bfd_error_handler
11177
0
      (_("%pB: cannot handle more than %d dynamic symbols"),
11178
0
       output_bfd, 0x7fffffff);
11179
0
    bfd_set_error (bfd_error_bad_value);
11180
0
    return false;
11181
0
  }
11182
11183
      /* Fill the stub.  */
11184
0
      if (micromips_p)
11185
0
  {
11186
0
    idx = 0;
11187
0
    bfd_put_micromips_32 (output_bfd, STUB_LW_MICROMIPS (output_bfd),
11188
0
        stub + idx);
11189
0
    idx += 4;
11190
0
    if (htab->insn32)
11191
0
      {
11192
0
        bfd_put_micromips_32 (output_bfd,
11193
0
            STUB_MOVE32_MICROMIPS, stub + idx);
11194
0
        idx += 4;
11195
0
      }
11196
0
    else
11197
0
      {
11198
0
        bfd_put_16 (output_bfd, STUB_MOVE_MICROMIPS, stub + idx);
11199
0
        idx += 2;
11200
0
      }
11201
0
    if (stub_size == stub_big_size)
11202
0
      {
11203
0
        long dynindx_hi = (h->dynindx >> 16) & 0x7fff;
11204
11205
0
        bfd_put_micromips_32 (output_bfd,
11206
0
            STUB_LUI_MICROMIPS (dynindx_hi),
11207
0
            stub + idx);
11208
0
        idx += 4;
11209
0
      }
11210
0
    if (htab->insn32)
11211
0
      {
11212
0
        bfd_put_micromips_32 (output_bfd, STUB_JALR32_MICROMIPS,
11213
0
            stub + idx);
11214
0
        idx += 4;
11215
0
      }
11216
0
    else
11217
0
      {
11218
0
        bfd_put_16 (output_bfd, STUB_JALR_MICROMIPS, stub + idx);
11219
0
        idx += 2;
11220
0
      }
11221
11222
    /* If a large stub is not required and sign extension is not a
11223
       problem, then use legacy code in the stub.  */
11224
0
    if (stub_size == stub_big_size)
11225
0
      bfd_put_micromips_32 (output_bfd,
11226
0
          STUB_ORI_MICROMIPS (h->dynindx & 0xffff),
11227
0
          stub + idx);
11228
0
    else if (h->dynindx & ~0x7fff)
11229
0
      bfd_put_micromips_32 (output_bfd,
11230
0
          STUB_LI16U_MICROMIPS (h->dynindx & 0xffff),
11231
0
          stub + idx);
11232
0
    else
11233
0
      bfd_put_micromips_32 (output_bfd,
11234
0
          STUB_LI16S_MICROMIPS (output_bfd,
11235
0
              h->dynindx),
11236
0
          stub + idx);
11237
0
  }
11238
0
      else
11239
0
  {
11240
0
    idx = 0;
11241
0
    bfd_put_32 (output_bfd, STUB_LW (output_bfd), stub + idx);
11242
0
    idx += 4;
11243
0
    bfd_put_32 (output_bfd, STUB_MOVE, stub + idx);
11244
0
    idx += 4;
11245
0
    if (stub_size == stub_big_size)
11246
0
      {
11247
0
        bfd_put_32 (output_bfd, STUB_LUI ((h->dynindx >> 16) & 0x7fff),
11248
0
        stub + idx);
11249
0
        idx += 4;
11250
0
      }
11251
11252
0
    if (!(MIPSR6_P (output_bfd) && htab->compact_branches))
11253
0
      {
11254
0
        bfd_put_32 (output_bfd, STUB_JALR, stub + idx);
11255
0
        idx += 4;
11256
0
      }
11257
11258
    /* If a large stub is not required and sign extension is not a
11259
       problem, then use legacy code in the stub.  */
11260
0
    if (stub_size == stub_big_size)
11261
0
      bfd_put_32 (output_bfd, STUB_ORI (h->dynindx & 0xffff),
11262
0
      stub + idx);
11263
0
    else if (h->dynindx & ~0x7fff)
11264
0
      bfd_put_32 (output_bfd, STUB_LI16U (h->dynindx & 0xffff),
11265
0
      stub + idx);
11266
0
    else
11267
0
      bfd_put_32 (output_bfd, STUB_LI16S (output_bfd, h->dynindx),
11268
0
      stub + idx);
11269
0
    idx += 4;
11270
11271
0
    if (MIPSR6_P (output_bfd) && htab->compact_branches)
11272
0
      bfd_put_32 (output_bfd, STUB_JALRC, stub + idx);
11273
0
  }
11274
11275
0
      BFD_ASSERT (h->plt.plist->stub_offset <= htab->sstubs->size);
11276
0
      memcpy (htab->sstubs->contents + h->plt.plist->stub_offset,
11277
0
        stub, stub_size);
11278
11279
      /* Mark the symbol as undefined.  stub_offset != -1 occurs
11280
   only for the referenced symbol.  */
11281
0
      sym->st_shndx = SHN_UNDEF;
11282
11283
      /* The run-time linker uses the st_value field of the symbol
11284
   to reset the global offset table entry for this external
11285
   to its stub address when unlinking a shared object.  */
11286
0
      sym->st_value = (htab->sstubs->output_section->vma
11287
0
           + htab->sstubs->output_offset
11288
0
           + h->plt.plist->stub_offset
11289
0
           + isa_bit);
11290
0
      sym->st_other = other;
11291
0
    }
11292
11293
  /* If we have a MIPS16 function with a stub, the dynamic symbol must
11294
     refer to the stub, since only the stub uses the standard calling
11295
     conventions.  */
11296
0
  if (h->dynindx != -1 && hmips->fn_stub != NULL)
11297
0
    {
11298
0
      BFD_ASSERT (hmips->need_fn_stub);
11299
0
      sym->st_value = (hmips->fn_stub->output_section->vma
11300
0
           + hmips->fn_stub->output_offset);
11301
0
      sym->st_size = hmips->fn_stub->size;
11302
0
      sym->st_other = ELF_ST_VISIBILITY (sym->st_other);
11303
0
    }
11304
11305
0
  BFD_ASSERT (h->dynindx != -1
11306
0
        || h->forced_local);
11307
11308
0
  sgot = htab->root.sgot;
11309
0
  g = htab->got_info;
11310
0
  BFD_ASSERT (g != NULL);
11311
11312
  /* Run through the global symbol table, creating GOT entries for all
11313
     the symbols that need them.  */
11314
0
  if (hmips->global_got_area != GGA_NONE)
11315
0
    {
11316
0
      bfd_vma offset;
11317
0
      bfd_vma value;
11318
11319
0
      value = sym->st_value;
11320
0
      offset = mips_elf_primary_global_got_index (output_bfd, info, h);
11321
0
      MIPS_ELF_PUT_WORD (output_bfd, value, sgot->contents + offset);
11322
0
    }
11323
11324
0
  if (hmips->global_got_area != GGA_NONE && g->next)
11325
0
    {
11326
0
      struct mips_got_entry e, *p;
11327
0
      bfd_vma entry;
11328
0
      bfd_vma offset;
11329
11330
0
      gg = g;
11331
11332
0
      e.abfd = output_bfd;
11333
0
      e.symndx = -1;
11334
0
      e.d.h = hmips;
11335
0
      e.tls_type = GOT_TLS_NONE;
11336
11337
0
      for (g = g->next; g->next != gg; g = g->next)
11338
0
  {
11339
0
    if (g->got_entries
11340
0
        && (p = (struct mips_got_entry *) htab_find (g->got_entries,
11341
0
                 &e)))
11342
0
      {
11343
0
        offset = p->gotidx;
11344
0
        BFD_ASSERT (offset > 0 && offset < htab->root.sgot->size);
11345
0
        if (bfd_link_pic (info)
11346
0
      || (elf_hash_table (info)->dynamic_sections_created
11347
0
          && p->d.h != NULL
11348
0
          && p->d.h->root.def_dynamic
11349
0
          && !p->d.h->root.def_regular))
11350
0
    {
11351
      /* Create an R_MIPS_REL32 relocation for this entry.  Due to
11352
         the various compatibility problems, it's easier to mock
11353
         up an R_MIPS_32 or R_MIPS_64 relocation and leave
11354
         mips_elf_create_dynamic_relocation to calculate the
11355
         appropriate addend.  */
11356
0
      Elf_Internal_Rela rel[3];
11357
11358
0
      memset (rel, 0, sizeof (rel));
11359
0
      if (ABI_64_P (output_bfd))
11360
0
        rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_64);
11361
0
      else
11362
0
        rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_32);
11363
0
      rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
11364
11365
0
      entry = 0;
11366
0
      if (! (mips_elf_create_dynamic_relocation
11367
0
       (output_bfd, info, rel,
11368
0
        e.d.h, NULL, sym->st_value, &entry, sgot)))
11369
0
        return false;
11370
0
    }
11371
0
        else
11372
0
    entry = sym->st_value;
11373
0
        MIPS_ELF_PUT_WORD (output_bfd, entry, sgot->contents + offset);
11374
0
      }
11375
0
  }
11376
0
    }
11377
11378
  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
11379
0
  name = h->root.root.string;
11380
0
  if (h == elf_hash_table (info)->hdynamic
11381
0
      || h == elf_hash_table (info)->hgot)
11382
0
    sym->st_shndx = SHN_ABS;
11383
0
  else if (strcmp (name, "_DYNAMIC_LINK") == 0
11384
0
     || strcmp (name, "_DYNAMIC_LINKING") == 0)
11385
0
    {
11386
0
      sym->st_shndx = SHN_ABS;
11387
0
      sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11388
0
      sym->st_value = 1;
11389
0
    }
11390
0
  else if (SGI_COMPAT (output_bfd))
11391
0
    {
11392
0
      if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
11393
0
    || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
11394
0
  {
11395
0
    sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11396
0
    sym->st_other = STO_PROTECTED;
11397
0
    sym->st_value = 0;
11398
0
    sym->st_shndx = SHN_MIPS_DATA;
11399
0
  }
11400
0
      else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
11401
0
  {
11402
0
    sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11403
0
    sym->st_other = STO_PROTECTED;
11404
0
    sym->st_value = mips_elf_hash_table (info)->procedure_count;
11405
0
    sym->st_shndx = SHN_ABS;
11406
0
  }
11407
0
      else if (sym->st_shndx != SHN_UNDEF && sym->st_shndx != SHN_ABS)
11408
0
  {
11409
0
    if (h->type == STT_FUNC)
11410
0
      sym->st_shndx = SHN_MIPS_TEXT;
11411
0
    else if (h->type == STT_OBJECT)
11412
0
      sym->st_shndx = SHN_MIPS_DATA;
11413
0
  }
11414
0
    }
11415
11416
  /* Emit a copy reloc, if needed.  */
11417
0
  if (h->needs_copy)
11418
0
    {
11419
0
      asection *s;
11420
0
      bfd_vma symval;
11421
11422
0
      BFD_ASSERT (h->dynindx != -1);
11423
0
      BFD_ASSERT (htab->use_plts_and_copy_relocs);
11424
11425
0
      s = mips_elf_rel_dyn_section (info, false);
11426
0
      symval = (h->root.u.def.section->output_section->vma
11427
0
    + h->root.u.def.section->output_offset
11428
0
    + h->root.u.def.value);
11429
0
      mips_elf_output_dynamic_relocation (output_bfd, s, s->reloc_count++,
11430
0
            h->dynindx, R_MIPS_COPY, symval);
11431
0
    }
11432
11433
  /* Handle the IRIX6-specific symbols.  */
11434
0
  if (IRIX_COMPAT (output_bfd) == ict_irix6)
11435
0
    mips_elf_irix6_finish_dynamic_symbol (output_bfd, name, sym);
11436
11437
  /* Keep dynamic compressed symbols odd.  This allows the dynamic linker
11438
     to treat compressed symbols like any other.  */
11439
0
  if (ELF_ST_IS_MIPS16 (sym->st_other))
11440
0
    {
11441
0
      BFD_ASSERT (sym->st_value & 1);
11442
0
      sym->st_other -= STO_MIPS16;
11443
0
    }
11444
0
  else if (ELF_ST_IS_MICROMIPS (sym->st_other))
11445
0
    {
11446
0
      BFD_ASSERT (sym->st_value & 1);
11447
0
      sym->st_other -= STO_MICROMIPS;
11448
0
    }
11449
11450
0
  return true;
11451
0
}
11452
11453
/* Likewise, for VxWorks.  */
11454
11455
bool
11456
_bfd_mips_vxworks_finish_dynamic_symbol (bfd *output_bfd,
11457
           struct bfd_link_info *info,
11458
           struct elf_link_hash_entry *h,
11459
           Elf_Internal_Sym *sym)
11460
0
{
11461
0
  bfd *dynobj;
11462
0
  asection *sgot;
11463
0
  struct mips_got_info *g;
11464
0
  struct mips_elf_link_hash_table *htab;
11465
0
  struct mips_elf_link_hash_entry *hmips;
11466
11467
0
  htab = mips_elf_hash_table (info);
11468
0
  BFD_ASSERT (htab != NULL);
11469
0
  dynobj = elf_hash_table (info)->dynobj;
11470
0
  hmips = (struct mips_elf_link_hash_entry *) h;
11471
11472
0
  if (h->plt.plist != NULL && h->plt.plist->mips_offset != MINUS_ONE)
11473
0
    {
11474
0
      bfd_byte *loc;
11475
0
      bfd_vma plt_address, got_address, got_offset, branch_offset;
11476
0
      Elf_Internal_Rela rel;
11477
0
      static const bfd_vma *plt_entry;
11478
0
      bfd_vma gotplt_index;
11479
0
      bfd_vma plt_offset;
11480
11481
0
      plt_offset = htab->plt_header_size + h->plt.plist->mips_offset;
11482
0
      gotplt_index = h->plt.plist->gotplt_index;
11483
11484
0
      BFD_ASSERT (h->dynindx != -1);
11485
0
      BFD_ASSERT (htab->root.splt != NULL);
11486
0
      BFD_ASSERT (gotplt_index != MINUS_ONE);
11487
0
      BFD_ASSERT (plt_offset <= htab->root.splt->size);
11488
11489
      /* Calculate the address of the .plt entry.  */
11490
0
      plt_address = (htab->root.splt->output_section->vma
11491
0
         + htab->root.splt->output_offset
11492
0
         + plt_offset);
11493
11494
      /* Calculate the address of the .got.plt entry.  */
11495
0
      got_address = (htab->root.sgotplt->output_section->vma
11496
0
         + htab->root.sgotplt->output_offset
11497
0
         + gotplt_index * MIPS_ELF_GOT_SIZE (output_bfd));
11498
11499
      /* Calculate the offset of the .got.plt entry from
11500
   _GLOBAL_OFFSET_TABLE_.  */
11501
0
      got_offset = mips_elf_gotplt_index (info, h);
11502
11503
      /* Calculate the offset for the branch at the start of the PLT
11504
   entry.  The branch jumps to the beginning of .plt.  */
11505
0
      branch_offset = -(plt_offset / 4 + 1) & 0xffff;
11506
11507
      /* Fill in the initial value of the .got.plt entry.  */
11508
0
      bfd_put_32 (output_bfd, plt_address,
11509
0
      (htab->root.sgotplt->contents
11510
0
       + gotplt_index * MIPS_ELF_GOT_SIZE (output_bfd)));
11511
11512
      /* Find out where the .plt entry should go.  */
11513
0
      loc = htab->root.splt->contents + plt_offset;
11514
11515
0
      if (bfd_link_pic (info))
11516
0
  {
11517
0
    plt_entry = mips_vxworks_shared_plt_entry;
11518
0
    bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
11519
0
    bfd_put_32 (output_bfd, plt_entry[1] | gotplt_index, loc + 4);
11520
0
  }
11521
0
      else
11522
0
  {
11523
0
    bfd_vma got_address_high, got_address_low;
11524
11525
0
    plt_entry = mips_vxworks_exec_plt_entry;
11526
0
    got_address_high = ((got_address + 0x8000) >> 16) & 0xffff;
11527
0
    got_address_low = got_address & 0xffff;
11528
11529
0
    bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
11530
0
    bfd_put_32 (output_bfd, plt_entry[1] | gotplt_index, loc + 4);
11531
0
    bfd_put_32 (output_bfd, plt_entry[2] | got_address_high, loc + 8);
11532
0
    bfd_put_32 (output_bfd, plt_entry[3] | got_address_low, loc + 12);
11533
0
    bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11534
0
    bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11535
0
    bfd_put_32 (output_bfd, plt_entry[6], loc + 24);
11536
0
    bfd_put_32 (output_bfd, plt_entry[7], loc + 28);
11537
11538
0
    loc = (htab->srelplt2->contents
11539
0
     + (gotplt_index * 3 + 2) * sizeof (Elf32_External_Rela));
11540
11541
    /* Emit a relocation for the .got.plt entry.  */
11542
0
    rel.r_offset = got_address;
11543
0
    rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
11544
0
    rel.r_addend = plt_offset;
11545
0
    bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11546
11547
    /* Emit a relocation for the lui of %hi(<.got.plt slot>).  */
11548
0
    loc += sizeof (Elf32_External_Rela);
11549
0
    rel.r_offset = plt_address + 8;
11550
0
    rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11551
0
    rel.r_addend = got_offset;
11552
0
    bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11553
11554
    /* Emit a relocation for the addiu of %lo(<.got.plt slot>).  */
11555
0
    loc += sizeof (Elf32_External_Rela);
11556
0
    rel.r_offset += 4;
11557
0
    rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11558
0
    bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11559
0
  }
11560
11561
      /* Emit an R_MIPS_JUMP_SLOT relocation against the .got.plt entry.  */
11562
0
      loc = (htab->root.srelplt->contents
11563
0
       + gotplt_index * sizeof (Elf32_External_Rela));
11564
0
      rel.r_offset = got_address;
11565
0
      rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_JUMP_SLOT);
11566
0
      rel.r_addend = 0;
11567
0
      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11568
11569
0
      if (!h->def_regular)
11570
0
  sym->st_shndx = SHN_UNDEF;
11571
0
    }
11572
11573
0
  BFD_ASSERT (h->dynindx != -1 || h->forced_local);
11574
11575
0
  sgot = htab->root.sgot;
11576
0
  g = htab->got_info;
11577
0
  BFD_ASSERT (g != NULL);
11578
11579
  /* See if this symbol has an entry in the GOT.  */
11580
0
  if (hmips->global_got_area != GGA_NONE)
11581
0
    {
11582
0
      bfd_vma offset;
11583
0
      Elf_Internal_Rela outrel;
11584
0
      bfd_byte *loc;
11585
0
      asection *s;
11586
11587
      /* Install the symbol value in the GOT.   */
11588
0
      offset = mips_elf_primary_global_got_index (output_bfd, info, h);
11589
0
      MIPS_ELF_PUT_WORD (output_bfd, sym->st_value, sgot->contents + offset);
11590
11591
      /* Add a dynamic relocation for it.  */
11592
0
      s = mips_elf_rel_dyn_section (info, false);
11593
0
      loc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
11594
0
      outrel.r_offset = (sgot->output_section->vma
11595
0
       + sgot->output_offset
11596
0
       + offset);
11597
0
      outrel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_32);
11598
0
      outrel.r_addend = 0;
11599
0
      bfd_elf32_swap_reloca_out (dynobj, &outrel, loc);
11600
0
    }
11601
11602
  /* Emit a copy reloc, if needed.  */
11603
0
  if (h->needs_copy)
11604
0
    {
11605
0
      Elf_Internal_Rela rel;
11606
0
      asection *srel;
11607
0
      bfd_byte *loc;
11608
11609
0
      BFD_ASSERT (h->dynindx != -1);
11610
11611
0
      rel.r_offset = (h->root.u.def.section->output_section->vma
11612
0
          + h->root.u.def.section->output_offset
11613
0
          + h->root.u.def.value);
11614
0
      rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_COPY);
11615
0
      rel.r_addend = 0;
11616
0
      if (h->root.u.def.section == htab->root.sdynrelro)
11617
0
  srel = htab->root.sreldynrelro;
11618
0
      else
11619
0
  srel = htab->root.srelbss;
11620
0
      loc = srel->contents + srel->reloc_count * sizeof (Elf32_External_Rela);
11621
0
      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11622
0
      ++srel->reloc_count;
11623
0
    }
11624
11625
  /* If this is a mips16/microMIPS symbol, force the value to be even.  */
11626
0
  if (ELF_ST_IS_COMPRESSED (sym->st_other))
11627
0
    sym->st_value &= ~1;
11628
11629
0
  return true;
11630
0
}
11631
11632
/* Write out a plt0 entry to the beginning of .plt.  */
11633
11634
static bool
11635
mips_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
11636
0
{
11637
0
  bfd_byte *loc;
11638
0
  bfd_vma gotplt_value, gotplt_value_high, gotplt_value_low;
11639
0
  static const bfd_vma *plt_entry;
11640
0
  struct mips_elf_link_hash_table *htab;
11641
11642
0
  htab = mips_elf_hash_table (info);
11643
0
  BFD_ASSERT (htab != NULL);
11644
11645
0
  if (ABI_64_P (output_bfd))
11646
0
    plt_entry = (htab->compact_branches
11647
0
     ? mipsr6_n64_exec_plt0_entry_compact
11648
0
     : mips_n64_exec_plt0_entry);
11649
0
  else if (ABI_N32_P (output_bfd))
11650
0
    plt_entry = (htab->compact_branches
11651
0
     ? mipsr6_n32_exec_plt0_entry_compact
11652
0
     : mips_n32_exec_plt0_entry);
11653
0
  else if (!htab->plt_header_is_comp)
11654
0
    plt_entry = (htab->compact_branches
11655
0
     ? mipsr6_o32_exec_plt0_entry_compact
11656
0
     : mips_o32_exec_plt0_entry);
11657
0
  else if (htab->insn32)
11658
0
    plt_entry = micromips_insn32_o32_exec_plt0_entry;
11659
0
  else
11660
0
    plt_entry = micromips_o32_exec_plt0_entry;
11661
11662
  /* Calculate the value of .got.plt.  */
11663
0
  gotplt_value = (htab->root.sgotplt->output_section->vma
11664
0
      + htab->root.sgotplt->output_offset);
11665
0
  gotplt_value_high = ((gotplt_value + 0x8000) >> 16) & 0xffff;
11666
0
  gotplt_value_low = gotplt_value & 0xffff;
11667
11668
  /* The PLT sequence is not safe for N64 if .got.plt's address can
11669
     not be loaded in two instructions.  */
11670
0
  if (ABI_64_P (output_bfd)
11671
0
      && ((gotplt_value + 0x80008000) & ~(bfd_vma) 0xffffffff) != 0)
11672
0
    {
11673
0
      _bfd_error_handler
11674
  /* xgettext:c-format */
11675
0
  (_("%pB: `%pA' start VMA of %#" PRIx64 " outside the 32-bit range "
11676
0
     "supported; consider using `-Ttext-segment=...'"),
11677
0
   output_bfd,
11678
0
   htab->root.sgotplt->output_section,
11679
0
   (int64_t) gotplt_value);
11680
0
      bfd_set_error (bfd_error_no_error);
11681
0
      return false;
11682
0
    }
11683
11684
  /* Install the PLT header.  */
11685
0
  loc = htab->root.splt->contents;
11686
0
  if (plt_entry == micromips_o32_exec_plt0_entry)
11687
0
    {
11688
0
      bfd_vma gotpc_offset;
11689
0
      bfd_vma loc_address;
11690
0
      size_t i;
11691
11692
0
      BFD_ASSERT (gotplt_value % 4 == 0);
11693
11694
0
      loc_address = (htab->root.splt->output_section->vma
11695
0
         + htab->root.splt->output_offset);
11696
0
      gotpc_offset = gotplt_value - ((loc_address | 3) ^ 3);
11697
11698
      /* ADDIUPC has a span of +/-16MB, check we're in range.  */
11699
0
      if (gotpc_offset + 0x1000000 >= 0x2000000)
11700
0
  {
11701
0
    _bfd_error_handler
11702
      /* xgettext:c-format */
11703
0
      (_("%pB: `%pA' offset of %" PRId64 " from `%pA' "
11704
0
         "beyond the range of ADDIUPC"),
11705
0
       output_bfd,
11706
0
       htab->root.sgotplt->output_section,
11707
0
       (int64_t) gotpc_offset,
11708
0
       htab->root.splt->output_section);
11709
0
    bfd_set_error (bfd_error_no_error);
11710
0
    return false;
11711
0
  }
11712
0
      bfd_put_16 (output_bfd,
11713
0
      plt_entry[0] | ((gotpc_offset >> 18) & 0x7f), loc);
11714
0
      bfd_put_16 (output_bfd, (gotpc_offset >> 2) & 0xffff, loc + 2);
11715
0
      for (i = 2; i < ARRAY_SIZE (micromips_o32_exec_plt0_entry); i++)
11716
0
  bfd_put_16 (output_bfd, plt_entry[i], loc + (i * 2));
11717
0
    }
11718
0
  else if (plt_entry == micromips_insn32_o32_exec_plt0_entry)
11719
0
    {
11720
0
      size_t i;
11721
11722
0
      bfd_put_16 (output_bfd, plt_entry[0], loc);
11723
0
      bfd_put_16 (output_bfd, gotplt_value_high, loc + 2);
11724
0
      bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11725
0
      bfd_put_16 (output_bfd, gotplt_value_low, loc + 6);
11726
0
      bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11727
0
      bfd_put_16 (output_bfd, gotplt_value_low, loc + 10);
11728
0
      for (i = 6; i < ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry); i++)
11729
0
  bfd_put_16 (output_bfd, plt_entry[i], loc + (i * 2));
11730
0
    }
11731
0
  else
11732
0
    {
11733
0
      bfd_put_32 (output_bfd, plt_entry[0] | gotplt_value_high, loc);
11734
0
      bfd_put_32 (output_bfd, plt_entry[1] | gotplt_value_low, loc + 4);
11735
0
      bfd_put_32 (output_bfd, plt_entry[2] | gotplt_value_low, loc + 8);
11736
0
      bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
11737
0
      bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11738
0
      bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11739
0
      bfd_put_32 (output_bfd, plt_entry[6], loc + 24);
11740
0
      bfd_put_32 (output_bfd, plt_entry[7], loc + 28);
11741
0
    }
11742
11743
0
  return true;
11744
0
}
11745
11746
/* Install the PLT header for a VxWorks executable and finalize the
11747
   contents of .rela.plt.unloaded.  */
11748
11749
static void
11750
mips_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
11751
0
{
11752
0
  Elf_Internal_Rela rela;
11753
0
  bfd_byte *loc;
11754
0
  bfd_vma got_value, got_value_high, got_value_low, plt_address;
11755
0
  static const bfd_vma *plt_entry;
11756
0
  struct mips_elf_link_hash_table *htab;
11757
11758
0
  htab = mips_elf_hash_table (info);
11759
0
  BFD_ASSERT (htab != NULL);
11760
11761
0
  plt_entry = mips_vxworks_exec_plt0_entry;
11762
11763
  /* Calculate the value of _GLOBAL_OFFSET_TABLE_.  */
11764
0
  got_value = (htab->root.hgot->root.u.def.section->output_section->vma
11765
0
         + htab->root.hgot->root.u.def.section->output_offset
11766
0
         + htab->root.hgot->root.u.def.value);
11767
11768
0
  got_value_high = ((got_value + 0x8000) >> 16) & 0xffff;
11769
0
  got_value_low = got_value & 0xffff;
11770
11771
  /* Calculate the address of the PLT header.  */
11772
0
  plt_address = (htab->root.splt->output_section->vma
11773
0
     + htab->root.splt->output_offset);
11774
11775
  /* Install the PLT header.  */
11776
0
  loc = htab->root.splt->contents;
11777
0
  bfd_put_32 (output_bfd, plt_entry[0] | got_value_high, loc);
11778
0
  bfd_put_32 (output_bfd, plt_entry[1] | got_value_low, loc + 4);
11779
0
  bfd_put_32 (output_bfd, plt_entry[2], loc + 8);
11780
0
  bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
11781
0
  bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11782
0
  bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11783
11784
  /* Output the relocation for the lui of %hi(_GLOBAL_OFFSET_TABLE_).  */
11785
0
  loc = htab->srelplt2->contents;
11786
0
  rela.r_offset = plt_address;
11787
0
  rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11788
0
  rela.r_addend = 0;
11789
0
  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
11790
0
  loc += sizeof (Elf32_External_Rela);
11791
11792
  /* Output the relocation for the following addiu of
11793
     %lo(_GLOBAL_OFFSET_TABLE_).  */
11794
0
  rela.r_offset += 4;
11795
0
  rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11796
0
  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
11797
0
  loc += sizeof (Elf32_External_Rela);
11798
11799
  /* Fix up the remaining relocations.  They may have the wrong
11800
     symbol index for _G_O_T_ or _P_L_T_ depending on the order
11801
     in which symbols were output.  */
11802
0
  while (loc < htab->srelplt2->contents + htab->srelplt2->size)
11803
0
    {
11804
0
      Elf_Internal_Rela rel;
11805
11806
0
      bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11807
0
      rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
11808
0
      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11809
0
      loc += sizeof (Elf32_External_Rela);
11810
11811
0
      bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11812
0
      rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11813
0
      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11814
0
      loc += sizeof (Elf32_External_Rela);
11815
11816
0
      bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11817
0
      rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11818
0
      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11819
0
      loc += sizeof (Elf32_External_Rela);
11820
0
    }
11821
0
}
11822
11823
/* Install the PLT header for a VxWorks shared library.  */
11824
11825
static void
11826
mips_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info)
11827
0
{
11828
0
  unsigned int i;
11829
0
  struct mips_elf_link_hash_table *htab;
11830
11831
0
  htab = mips_elf_hash_table (info);
11832
0
  BFD_ASSERT (htab != NULL);
11833
11834
  /* We just need to copy the entry byte-by-byte.  */
11835
0
  for (i = 0; i < ARRAY_SIZE (mips_vxworks_shared_plt0_entry); i++)
11836
0
    bfd_put_32 (output_bfd, mips_vxworks_shared_plt0_entry[i],
11837
0
    htab->root.splt->contents + i * 4);
11838
0
}
11839
11840
/* Finish up the dynamic sections.  */
11841
11842
bool
11843
_bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
11844
               struct bfd_link_info *info)
11845
0
{
11846
0
  bfd *dynobj;
11847
0
  asection *sdyn;
11848
0
  asection *sgot;
11849
0
  struct mips_got_info *gg, *g;
11850
0
  struct mips_elf_link_hash_table *htab;
11851
11852
0
  htab = mips_elf_hash_table (info);
11853
0
  BFD_ASSERT (htab != NULL);
11854
11855
0
  dynobj = elf_hash_table (info)->dynobj;
11856
11857
0
  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
11858
11859
0
  sgot = htab->root.sgot;
11860
0
  gg = htab->got_info;
11861
11862
0
  if (elf_hash_table (info)->dynamic_sections_created)
11863
0
    {
11864
0
      bfd_byte *b;
11865
0
      int dyn_to_skip = 0, dyn_skipped = 0;
11866
11867
0
      BFD_ASSERT (sdyn != NULL);
11868
0
      BFD_ASSERT (gg != NULL);
11869
11870
0
      g = mips_elf_bfd_got (output_bfd, false);
11871
0
      BFD_ASSERT (g != NULL);
11872
11873
0
      for (b = sdyn->contents;
11874
0
     b < sdyn->contents + sdyn->size;
11875
0
     b += MIPS_ELF_DYN_SIZE (dynobj))
11876
0
  {
11877
0
    Elf_Internal_Dyn dyn;
11878
0
    const char *name;
11879
0
    size_t elemsize;
11880
0
    asection *s;
11881
0
    bool swap_out_p;
11882
11883
    /* Read in the current dynamic entry.  */
11884
0
    (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
11885
11886
    /* Assume that we're going to modify it and write it out.  */
11887
0
    swap_out_p = true;
11888
11889
0
    switch (dyn.d_tag)
11890
0
      {
11891
0
      case DT_RELENT:
11892
0
        dyn.d_un.d_val = MIPS_ELF_REL_SIZE (dynobj);
11893
0
        break;
11894
11895
0
      case DT_RELAENT:
11896
0
        BFD_ASSERT (htab->root.target_os == is_vxworks);
11897
0
        dyn.d_un.d_val = MIPS_ELF_RELA_SIZE (dynobj);
11898
0
        break;
11899
11900
0
      case DT_STRSZ:
11901
        /* Rewrite DT_STRSZ.  */
11902
0
        dyn.d_un.d_val =
11903
0
    _bfd_elf_strtab_size (elf_hash_table (info)->dynstr);
11904
0
        break;
11905
11906
0
      case DT_PLTGOT:
11907
0
        s = htab->root.sgot;
11908
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
11909
0
        break;
11910
11911
0
      case DT_MIPS_PLTGOT:
11912
0
        s = htab->root.sgotplt;
11913
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
11914
0
        break;
11915
11916
0
      case DT_MIPS_RLD_VERSION:
11917
0
        dyn.d_un.d_val = 1; /* XXX */
11918
0
        break;
11919
11920
0
      case DT_MIPS_FLAGS:
11921
0
        dyn.d_un.d_val = RHF_NOTPOT; /* XXX */
11922
0
        break;
11923
11924
0
      case DT_MIPS_TIME_STAMP:
11925
0
        {
11926
0
    time_t t;
11927
0
    time (&t);
11928
0
    dyn.d_un.d_val = t;
11929
0
        }
11930
0
        break;
11931
11932
0
      case DT_MIPS_ICHECKSUM:
11933
        /* XXX FIXME: */
11934
0
        swap_out_p = false;
11935
0
        break;
11936
11937
0
      case DT_MIPS_IVERSION:
11938
        /* XXX FIXME: */
11939
0
        swap_out_p = false;
11940
0
        break;
11941
11942
0
      case DT_MIPS_BASE_ADDRESS:
11943
0
        s = output_bfd->sections;
11944
0
        BFD_ASSERT (s != NULL);
11945
0
        dyn.d_un.d_ptr = s->vma & ~(bfd_vma) 0xffff;
11946
0
        break;
11947
11948
0
      case DT_MIPS_LOCAL_GOTNO:
11949
0
        dyn.d_un.d_val = g->local_gotno;
11950
0
        break;
11951
11952
0
      case DT_MIPS_UNREFEXTNO:
11953
        /* The index into the dynamic symbol table which is the
11954
     entry of the first external symbol that is not
11955
     referenced within the same object.  */
11956
0
        dyn.d_un.d_val = bfd_count_sections (output_bfd) + 1;
11957
0
        break;
11958
11959
0
      case DT_MIPS_GOTSYM:
11960
0
        if (htab->global_gotsym)
11961
0
    {
11962
0
      dyn.d_un.d_val = htab->global_gotsym->dynindx;
11963
0
      break;
11964
0
    }
11965
        /* In case if we don't have global got symbols we default
11966
     to setting DT_MIPS_GOTSYM to the same value as
11967
     DT_MIPS_SYMTABNO.  */
11968
        /* Fall through.  */
11969
11970
0
      case DT_MIPS_SYMTABNO:
11971
0
        name = ".dynsym";
11972
0
        elemsize = MIPS_ELF_SYM_SIZE (output_bfd);
11973
0
        s = bfd_get_linker_section (dynobj, name);
11974
11975
0
        if (s != NULL)
11976
0
    dyn.d_un.d_val = s->size / elemsize;
11977
0
        else
11978
0
    dyn.d_un.d_val = 0;
11979
0
        break;
11980
11981
0
      case DT_MIPS_HIPAGENO:
11982
0
        dyn.d_un.d_val = g->local_gotno - htab->reserved_gotno;
11983
0
        break;
11984
11985
0
      case DT_MIPS_RLD_MAP:
11986
0
        {
11987
0
    struct elf_link_hash_entry *h;
11988
0
    h = mips_elf_hash_table (info)->rld_symbol;
11989
0
    if (!h)
11990
0
      {
11991
0
        dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
11992
0
        swap_out_p = false;
11993
0
        break;
11994
0
      }
11995
0
    s = h->root.u.def.section;
11996
11997
    /* The MIPS_RLD_MAP tag stores the absolute address of the
11998
       debug pointer.  */
11999
0
    dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
12000
0
          + h->root.u.def.value);
12001
0
        }
12002
0
        break;
12003
12004
0
      case DT_MIPS_RLD_MAP_REL:
12005
0
        {
12006
0
    struct elf_link_hash_entry *h;
12007
0
    bfd_vma dt_addr, rld_addr;
12008
0
    h = mips_elf_hash_table (info)->rld_symbol;
12009
0
    if (!h)
12010
0
      {
12011
0
        dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
12012
0
        swap_out_p = false;
12013
0
        break;
12014
0
      }
12015
0
    s = h->root.u.def.section;
12016
12017
    /* The MIPS_RLD_MAP_REL tag stores the offset to the debug
12018
       pointer, relative to the address of the tag.  */
12019
0
    dt_addr = (sdyn->output_section->vma + sdyn->output_offset
12020
0
         + (b - sdyn->contents));
12021
0
    rld_addr = (s->output_section->vma + s->output_offset
12022
0
          + h->root.u.def.value);
12023
0
    dyn.d_un.d_ptr = rld_addr - dt_addr;
12024
0
        }
12025
0
        break;
12026
12027
0
      case DT_MIPS_OPTIONS:
12028
0
        s = (bfd_get_section_by_name
12029
0
       (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (output_bfd)));
12030
0
        dyn.d_un.d_ptr = s->vma;
12031
0
        break;
12032
12033
0
      case DT_PLTREL:
12034
0
        BFD_ASSERT (htab->use_plts_and_copy_relocs);
12035
0
        if (htab->root.target_os == is_vxworks)
12036
0
    dyn.d_un.d_val = DT_RELA;
12037
0
        else
12038
0
    dyn.d_un.d_val = DT_REL;
12039
0
        break;
12040
12041
0
      case DT_PLTRELSZ:
12042
0
        BFD_ASSERT (htab->use_plts_and_copy_relocs);
12043
0
        dyn.d_un.d_val = htab->root.srelplt->size;
12044
0
        break;
12045
12046
0
      case DT_JMPREL:
12047
0
        BFD_ASSERT (htab->use_plts_and_copy_relocs);
12048
0
        dyn.d_un.d_ptr = (htab->root.srelplt->output_section->vma
12049
0
        + htab->root.srelplt->output_offset);
12050
0
        break;
12051
12052
0
      case DT_TEXTREL:
12053
        /* If we didn't need any text relocations after all, delete
12054
     the dynamic tag.  */
12055
0
        if (!(info->flags & DF_TEXTREL))
12056
0
    {
12057
0
      dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
12058
0
      swap_out_p = false;
12059
0
    }
12060
0
        break;
12061
12062
0
      case DT_FLAGS:
12063
        /* If we didn't need any text relocations after all, clear
12064
     DF_TEXTREL from DT_FLAGS.  */
12065
0
        if (!(info->flags & DF_TEXTREL))
12066
0
    dyn.d_un.d_val &= ~DF_TEXTREL;
12067
0
        else
12068
0
    swap_out_p = false;
12069
0
        break;
12070
12071
0
      case DT_MIPS_XHASH:
12072
0
        name = ".MIPS.xhash";
12073
0
        s = bfd_get_linker_section (dynobj, name);
12074
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
12075
0
        break;
12076
12077
0
      default:
12078
0
        swap_out_p = false;
12079
0
        if (htab->root.target_os == is_vxworks
12080
0
      && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
12081
0
    swap_out_p = true;
12082
0
        break;
12083
0
      }
12084
12085
0
    if (swap_out_p || dyn_skipped)
12086
0
      (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
12087
0
        (dynobj, &dyn, b - dyn_skipped);
12088
12089
0
    if (dyn_to_skip)
12090
0
      {
12091
0
        dyn_skipped += dyn_to_skip;
12092
0
        dyn_to_skip = 0;
12093
0
      }
12094
0
  }
12095
12096
      /* Wipe out any trailing entries if we shifted down a dynamic tag.  */
12097
0
      if (dyn_skipped > 0)
12098
0
  memset (b - dyn_skipped, 0, dyn_skipped);
12099
0
    }
12100
12101
0
  if (sgot != NULL && sgot->size > 0
12102
0
      && !bfd_is_abs_section (sgot->output_section))
12103
0
    {
12104
0
      if (htab->root.target_os == is_vxworks)
12105
0
  {
12106
    /* The first entry of the global offset table points to the
12107
       ".dynamic" section.  The second is initialized by the
12108
       loader and contains the shared library identifier.
12109
       The third is also initialized by the loader and points
12110
       to the lazy resolution stub.  */
12111
0
    MIPS_ELF_PUT_WORD (output_bfd,
12112
0
           sdyn->output_offset + sdyn->output_section->vma,
12113
0
           sgot->contents);
12114
0
    MIPS_ELF_PUT_WORD (output_bfd, 0,
12115
0
           sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
12116
0
    MIPS_ELF_PUT_WORD (output_bfd, 0,
12117
0
           sgot->contents
12118
0
           + 2 * MIPS_ELF_GOT_SIZE (output_bfd));
12119
0
  }
12120
0
      else
12121
0
  {
12122
    /* The first entry of the global offset table will be filled at
12123
       runtime. The second entry will be used by some runtime loaders.
12124
       This isn't the case of IRIX rld.  */
12125
0
    MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0, sgot->contents);
12126
0
    MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
12127
0
           sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
12128
0
  }
12129
12130
0
      elf_section_data (sgot->output_section)->this_hdr.sh_entsize
12131
0
   = MIPS_ELF_GOT_SIZE (output_bfd);
12132
0
    }
12133
12134
  /* Generate dynamic relocations for the non-primary gots.  */
12135
0
  if (gg != NULL && gg->next)
12136
0
    {
12137
0
      Elf_Internal_Rela rel[3];
12138
0
      bfd_vma addend = 0;
12139
12140
0
      memset (rel, 0, sizeof (rel));
12141
0
      rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_REL32);
12142
12143
0
      for (g = gg->next; g->next != gg; g = g->next)
12144
0
  {
12145
0
    bfd_vma got_index = g->next->local_gotno + g->next->global_gotno
12146
0
      + g->next->tls_gotno;
12147
12148
0
    MIPS_ELF_PUT_WORD (output_bfd, 0, sgot->contents
12149
0
           + got_index++ * MIPS_ELF_GOT_SIZE (output_bfd));
12150
0
    MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
12151
0
           sgot->contents
12152
0
           + got_index++ * MIPS_ELF_GOT_SIZE (output_bfd));
12153
12154
0
    if (! bfd_link_pic (info))
12155
0
      continue;
12156
12157
0
    for (; got_index < g->local_gotno; got_index++)
12158
0
      {
12159
0
        if (got_index >= g->assigned_low_gotno
12160
0
      && got_index <= g->assigned_high_gotno)
12161
0
    continue;
12162
12163
0
        rel[0].r_offset = rel[1].r_offset = rel[2].r_offset
12164
0
    = got_index * MIPS_ELF_GOT_SIZE (output_bfd);
12165
0
        if (!(mips_elf_create_dynamic_relocation
12166
0
        (output_bfd, info, rel, NULL,
12167
0
         bfd_abs_section_ptr,
12168
0
         0, &addend, sgot)))
12169
0
    return false;
12170
0
        BFD_ASSERT (addend == 0);
12171
0
      }
12172
0
  }
12173
0
    }
12174
12175
  /* The generation of dynamic relocations for the non-primary gots
12176
     adds more dynamic relocations.  We cannot count them until
12177
     here.  */
12178
12179
0
  if (elf_hash_table (info)->dynamic_sections_created)
12180
0
    {
12181
0
      bfd_byte *b;
12182
0
      bool swap_out_p;
12183
12184
0
      BFD_ASSERT (sdyn != NULL);
12185
12186
0
      for (b = sdyn->contents;
12187
0
     b < sdyn->contents + sdyn->size;
12188
0
     b += MIPS_ELF_DYN_SIZE (dynobj))
12189
0
  {
12190
0
    Elf_Internal_Dyn dyn;
12191
0
    asection *s;
12192
12193
    /* Read in the current dynamic entry.  */
12194
0
    (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
12195
12196
    /* Assume that we're going to modify it and write it out.  */
12197
0
    swap_out_p = true;
12198
12199
0
    switch (dyn.d_tag)
12200
0
      {
12201
0
      case DT_RELSZ:
12202
        /* Reduce DT_RELSZ to account for any relocations we
12203
     decided not to make.  This is for the n64 irix rld,
12204
     which doesn't seem to apply any relocations if there
12205
     are trailing null entries.  */
12206
0
        s = mips_elf_rel_dyn_section (info, false);
12207
0
        dyn.d_un.d_val = (s->reloc_count
12208
0
        * (ABI_64_P (output_bfd)
12209
0
           ? sizeof (Elf64_Mips_External_Rel)
12210
0
           : sizeof (Elf32_External_Rel)));
12211
        /* Adjust the section size too.  Tools like the prelinker
12212
     can reasonably expect the values to the same.  */
12213
0
        BFD_ASSERT (!bfd_is_abs_section (s->output_section));
12214
0
        elf_section_data (s->output_section)->this_hdr.sh_size
12215
0
    = dyn.d_un.d_val;
12216
0
        break;
12217
12218
0
      default:
12219
0
        swap_out_p = false;
12220
0
        break;
12221
0
      }
12222
12223
0
    if (swap_out_p)
12224
0
      (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
12225
0
        (dynobj, &dyn, b);
12226
0
  }
12227
0
    }
12228
12229
0
  {
12230
0
    asection *s;
12231
0
    Elf32_compact_rel cpt;
12232
12233
0
    if (SGI_COMPAT (output_bfd))
12234
0
      {
12235
  /* Write .compact_rel section out.  */
12236
0
  s = bfd_get_linker_section (dynobj, ".compact_rel");
12237
0
  if (s != NULL)
12238
0
    {
12239
0
      cpt.id1 = 1;
12240
0
      cpt.num = s->reloc_count;
12241
0
      cpt.id2 = 2;
12242
0
      cpt.offset = (s->output_section->filepos
12243
0
        + sizeof (Elf32_External_compact_rel));
12244
0
      cpt.reserved0 = 0;
12245
0
      cpt.reserved1 = 0;
12246
0
      bfd_elf32_swap_compact_rel_out (output_bfd, &cpt,
12247
0
              ((Elf32_External_compact_rel *)
12248
0
               s->contents));
12249
12250
      /* Clean up a dummy stub function entry in .text.  */
12251
0
      if (htab->sstubs != NULL
12252
0
    && htab->sstubs->contents != NULL)
12253
0
        {
12254
0
    file_ptr dummy_offset;
12255
12256
0
    BFD_ASSERT (htab->sstubs->size >= htab->function_stub_size);
12257
0
    dummy_offset = htab->sstubs->size - htab->function_stub_size;
12258
0
    memset (htab->sstubs->contents + dummy_offset, 0,
12259
0
      htab->function_stub_size);
12260
0
        }
12261
0
    }
12262
0
      }
12263
12264
    /* The psABI says that the dynamic relocations must be sorted in
12265
       increasing order of r_symndx.  The VxWorks EABI doesn't require
12266
       this, and because the code below handles REL rather than RELA
12267
       relocations, using it for VxWorks would be outright harmful.  */
12268
0
    if (htab->root.target_os != is_vxworks)
12269
0
      {
12270
0
  s = mips_elf_rel_dyn_section (info, false);
12271
0
  if (s != NULL
12272
0
      && s->size > (bfd_vma)2 * MIPS_ELF_REL_SIZE (output_bfd))
12273
0
    {
12274
0
      reldyn_sorting_bfd = output_bfd;
12275
12276
0
      if (ABI_64_P (output_bfd))
12277
0
        qsort ((Elf64_External_Rel *) s->contents + 1,
12278
0
         s->reloc_count - 1, sizeof (Elf64_Mips_External_Rel),
12279
0
         sort_dynamic_relocs_64);
12280
0
      else
12281
0
        qsort ((Elf32_External_Rel *) s->contents + 1,
12282
0
         s->reloc_count - 1, sizeof (Elf32_External_Rel),
12283
0
         sort_dynamic_relocs);
12284
0
    }
12285
0
      }
12286
0
  }
12287
12288
0
  if (htab->root.splt && htab->root.splt->size > 0)
12289
0
    {
12290
0
      if (htab->root.target_os == is_vxworks)
12291
0
  {
12292
0
    if (bfd_link_pic (info))
12293
0
      mips_vxworks_finish_shared_plt (output_bfd, info);
12294
0
    else
12295
0
      mips_vxworks_finish_exec_plt (output_bfd, info);
12296
0
  }
12297
0
      else
12298
0
  {
12299
0
    BFD_ASSERT (!bfd_link_pic (info));
12300
0
    if (!mips_finish_exec_plt (output_bfd, info))
12301
0
      return false;
12302
0
  }
12303
0
    }
12304
0
  return true;
12305
0
}
12306
12307
12308
/* Set ABFD's EF_MIPS_ARCH and EF_MIPS_MACH flags.  */
12309
12310
static void
12311
mips_set_isa_flags (bfd *abfd)
12312
2
{
12313
2
  flagword val;
12314
12315
2
  switch (bfd_get_mach (abfd))
12316
2
    {
12317
0
    default:
12318
0
      if (ABI_N32_P (abfd) || ABI_64_P (abfd))
12319
0
        val = MIPS_DEFAULT_R6 ? EF_MIPS_ARCH_64R6 : EF_MIPS_ARCH_3;
12320
0
      else
12321
0
        val = MIPS_DEFAULT_R6 ? EF_MIPS_ARCH_32R6 : EF_MIPS_ARCH_1;
12322
0
      break;
12323
12324
1
    case bfd_mach_mips3000:
12325
1
      val = EF_MIPS_ARCH_1;
12326
1
      break;
12327
12328
0
    case bfd_mach_mips3900:
12329
0
      val = EF_MIPS_ARCH_1 | EF_MIPS_MACH_3900;
12330
0
      break;
12331
12332
0
    case bfd_mach_mips6000:
12333
0
      val = EF_MIPS_ARCH_2;
12334
0
      break;
12335
12336
0
    case bfd_mach_mips4010:
12337
0
      val = EF_MIPS_ARCH_2 | EF_MIPS_MACH_4010;
12338
0
      break;
12339
12340
0
    case bfd_mach_mips_allegrex:
12341
0
      val = EF_MIPS_ARCH_2 | EF_MIPS_MACH_ALLEGREX;
12342
0
      break;
12343
12344
0
    case bfd_mach_mips4000:
12345
0
    case bfd_mach_mips4300:
12346
0
    case bfd_mach_mips4400:
12347
0
    case bfd_mach_mips4600:
12348
0
      val = EF_MIPS_ARCH_3;
12349
0
      break;
12350
12351
0
    case bfd_mach_mips4100:
12352
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_4100;
12353
0
      break;
12354
12355
0
    case bfd_mach_mips4111:
12356
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_4111;
12357
0
      break;
12358
12359
0
    case bfd_mach_mips4120:
12360
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_4120;
12361
0
      break;
12362
12363
0
    case bfd_mach_mips4650:
12364
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_4650;
12365
0
      break;
12366
12367
0
    case bfd_mach_mips5400:
12368
0
      val = EF_MIPS_ARCH_4 | EF_MIPS_MACH_5400;
12369
0
      break;
12370
12371
0
    case bfd_mach_mips5500:
12372
0
      val = EF_MIPS_ARCH_4 | EF_MIPS_MACH_5500;
12373
0
      break;
12374
12375
0
    case bfd_mach_mips5900:
12376
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_5900;
12377
0
      break;
12378
12379
0
    case bfd_mach_mips9000:
12380
0
      val = EF_MIPS_ARCH_4 | EF_MIPS_MACH_9000;
12381
0
      break;
12382
12383
0
    case bfd_mach_mips5000:
12384
0
    case bfd_mach_mips7000:
12385
1
    case bfd_mach_mips8000:
12386
1
    case bfd_mach_mips10000:
12387
1
    case bfd_mach_mips12000:
12388
1
    case bfd_mach_mips14000:
12389
1
    case bfd_mach_mips16000:
12390
1
      val = EF_MIPS_ARCH_4;
12391
1
      break;
12392
12393
0
    case bfd_mach_mips5:
12394
0
      val = EF_MIPS_ARCH_5;
12395
0
      break;
12396
12397
0
    case bfd_mach_mips_loongson_2e:
12398
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_LS2E;
12399
0
      break;
12400
12401
0
    case bfd_mach_mips_loongson_2f:
12402
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_LS2F;
12403
0
      break;
12404
12405
0
    case bfd_mach_mips_sb1:
12406
0
      val = EF_MIPS_ARCH_64 | EF_MIPS_MACH_SB1;
12407
0
      break;
12408
12409
0
    case bfd_mach_mips_gs464:
12410
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_GS464;
12411
0
      break;
12412
12413
0
    case bfd_mach_mips_gs464e:
12414
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_GS464E;
12415
0
      break;
12416
12417
0
    case bfd_mach_mips_gs264e:
12418
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_GS264E;
12419
0
      break;
12420
12421
0
    case bfd_mach_mips_octeon:
12422
0
    case bfd_mach_mips_octeonp:
12423
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_OCTEON;
12424
0
      break;
12425
12426
0
    case bfd_mach_mips_octeon3:
12427
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_OCTEON3;
12428
0
      break;
12429
12430
0
    case bfd_mach_mips_xlr:
12431
0
      val = EF_MIPS_ARCH_64 | EF_MIPS_MACH_XLR;
12432
0
      break;
12433
12434
0
    case bfd_mach_mips_octeon2:
12435
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_OCTEON2;
12436
0
      break;
12437
12438
0
    case bfd_mach_mipsisa32:
12439
0
      val = EF_MIPS_ARCH_32;
12440
0
      break;
12441
12442
0
    case bfd_mach_mipsisa64:
12443
0
      val = EF_MIPS_ARCH_64;
12444
0
      break;
12445
12446
0
    case bfd_mach_mipsisa32r2:
12447
0
    case bfd_mach_mipsisa32r3:
12448
0
    case bfd_mach_mipsisa32r5:
12449
0
      val = EF_MIPS_ARCH_32R2;
12450
0
      break;
12451
12452
0
    case bfd_mach_mips_interaptiv_mr2:
12453
0
      val = EF_MIPS_ARCH_32R2 | EF_MIPS_MACH_IAMR2;
12454
0
      break;
12455
12456
0
    case bfd_mach_mipsisa64r2:
12457
0
    case bfd_mach_mipsisa64r3:
12458
0
    case bfd_mach_mipsisa64r5:
12459
0
      val = EF_MIPS_ARCH_64R2;
12460
0
      break;
12461
12462
0
    case bfd_mach_mipsisa32r6:
12463
0
      val = EF_MIPS_ARCH_32R6;
12464
0
      break;
12465
12466
0
    case bfd_mach_mipsisa64r6:
12467
0
      val = EF_MIPS_ARCH_64R6;
12468
0
      break;
12469
2
    }
12470
2
  elf_elfheader (abfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
12471
2
  elf_elfheader (abfd)->e_flags |= val;
12472
12473
2
}
12474
12475
12476
/* Whether to sort relocs output by ld -r or ld --emit-relocs, by r_offset.
12477
   Don't do so for code sections.  We want to keep ordering of HI16/LO16
12478
   as is.  On the other hand, elf-eh-frame.c processing requires .eh_frame
12479
   relocs to be sorted.  */
12480
12481
bool
12482
_bfd_mips_elf_sort_relocs_p (asection *sec)
12483
0
{
12484
0
  return (sec->flags & SEC_CODE) == 0;
12485
0
}
12486
12487
12488
/* The final processing done just before writing out a MIPS ELF object
12489
   file.  This gets the MIPS architecture right based on the machine
12490
   number.  This is used by both the 32-bit and the 64-bit ABI.  */
12491
12492
void
12493
_bfd_mips_final_write_processing (bfd *abfd)
12494
2
{
12495
2
  unsigned int i;
12496
2
  Elf_Internal_Shdr **hdrpp;
12497
2
  const char *name;
12498
2
  asection *sec;
12499
12500
  /* Keep the existing EF_MIPS_MACH and EF_MIPS_ARCH flags if the former
12501
     is nonzero.  This is for compatibility with old objects, which used
12502
     a combination of a 32-bit EF_MIPS_ARCH and a 64-bit EF_MIPS_MACH.  */
12503
2
  if ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == 0)
12504
2
    mips_set_isa_flags (abfd);
12505
12506
  /* Set the sh_info field for .gptab sections and other appropriate
12507
     info for each special section.  */
12508
2
  for (i = 1, hdrpp = elf_elfsections (abfd) + 1;
12509
4
       i < elf_numsections (abfd);
12510
2
       i++, hdrpp++)
12511
2
    {
12512
2
      switch ((*hdrpp)->sh_type)
12513
2
  {
12514
0
  case SHT_MIPS_MSYM:
12515
0
  case SHT_MIPS_LIBLIST:
12516
0
    sec = bfd_get_section_by_name (abfd, ".dynstr");
12517
0
    if (sec != NULL)
12518
0
      (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12519
0
    break;
12520
12521
0
  case SHT_MIPS_GPTAB:
12522
0
    BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
12523
0
    name = bfd_section_name ((*hdrpp)->bfd_section);
12524
0
    if (startswith (name, ".gptab."))
12525
0
      {
12526
0
        sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
12527
0
        if (sec != NULL)
12528
0
    (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
12529
0
      }
12530
0
    break;
12531
12532
0
  case SHT_MIPS_CONTENT:
12533
0
    BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
12534
0
    name = bfd_section_name ((*hdrpp)->bfd_section);
12535
0
    if (startswith (name, ".MIPS.content"))
12536
0
      {
12537
0
        sec = bfd_get_section_by_name (abfd,
12538
0
               name + sizeof ".MIPS.content" - 1);
12539
0
        if (sec != NULL)
12540
0
    (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12541
0
      }
12542
0
    break;
12543
12544
0
  case SHT_MIPS_SYMBOL_LIB:
12545
0
    sec = bfd_get_section_by_name (abfd, ".dynsym");
12546
0
    if (sec != NULL)
12547
0
      (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12548
0
    sec = bfd_get_section_by_name (abfd, ".liblist");
12549
0
    if (sec != NULL)
12550
0
      (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
12551
0
    break;
12552
12553
0
  case SHT_MIPS_EVENTS:
12554
0
    BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
12555
0
    name = bfd_section_name ((*hdrpp)->bfd_section);
12556
0
    if (startswith (name, ".MIPS.events"))
12557
0
      sec = bfd_get_section_by_name (abfd,
12558
0
             name + sizeof ".MIPS.events" - 1);
12559
0
    else if (startswith (name, ".MIPS.post_rel"))
12560
0
      sec = bfd_get_section_by_name (abfd,
12561
0
             name + sizeof ".MIPS.post_rel" - 1);
12562
0
    else
12563
0
      sec = NULL;
12564
0
    if (sec != NULL)
12565
0
      (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12566
0
    break;
12567
12568
0
  case SHT_MIPS_XHASH:
12569
0
    sec = bfd_get_section_by_name (abfd, ".dynsym");
12570
0
    if (sec != NULL)
12571
0
      (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12572
2
  }
12573
2
    }
12574
2
}
12575
12576
bool
12577
_bfd_mips_elf_final_write_processing (bfd *abfd)
12578
2
{
12579
2
  _bfd_mips_final_write_processing (abfd);
12580
2
  return _bfd_elf_final_write_processing (abfd);
12581
2
}
12582

12583
/* When creating an IRIX5 executable, we need REGINFO and RTPROC
12584
   segments.  */
12585
12586
int
12587
_bfd_mips_elf_additional_program_headers (bfd *abfd,
12588
            struct bfd_link_info *info ATTRIBUTE_UNUSED)
12589
0
{
12590
0
  asection *s;
12591
0
  int ret = 0;
12592
12593
  /* See if we need a PT_MIPS_REGINFO segment.  */
12594
0
  s = bfd_get_section_by_name (abfd, ".reginfo");
12595
0
  if (s && (s->flags & SEC_LOAD))
12596
0
    ++ret;
12597
12598
  /* See if we need a PT_MIPS_ABIFLAGS segment.  */
12599
0
  if (bfd_get_section_by_name (abfd, ".MIPS.abiflags"))
12600
0
    ++ret;
12601
12602
  /* See if we need a PT_MIPS_OPTIONS segment.  */
12603
0
  if (IRIX_COMPAT (abfd) == ict_irix6
12604
0
      && bfd_get_section_by_name (abfd,
12605
0
          MIPS_ELF_OPTIONS_SECTION_NAME (abfd)))
12606
0
    ++ret;
12607
12608
  /* See if we need a PT_MIPS_RTPROC segment.  */
12609
0
  if (IRIX_COMPAT (abfd) == ict_irix5
12610
0
      && bfd_get_section_by_name (abfd, ".dynamic")
12611
0
      && bfd_get_section_by_name (abfd, ".mdebug"))
12612
0
    ++ret;
12613
12614
  /* Allocate a PT_NULL header in dynamic objects.  See
12615
     _bfd_mips_elf_modify_segment_map for details.  */
12616
0
  if (!SGI_COMPAT (abfd)
12617
0
      && bfd_get_section_by_name (abfd, ".dynamic"))
12618
0
    ++ret;
12619
12620
0
  return ret;
12621
0
}
12622
12623
/* Modify the segment map for an IRIX5 executable.  */
12624
12625
bool
12626
_bfd_mips_elf_modify_segment_map (bfd *abfd,
12627
          struct bfd_link_info *info)
12628
2
{
12629
2
  asection *s;
12630
2
  struct elf_segment_map *m, **pm;
12631
2
  size_t amt;
12632
12633
  /* If there is a .reginfo section, we need a PT_MIPS_REGINFO
12634
     segment.  */
12635
2
  s = bfd_get_section_by_name (abfd, ".reginfo");
12636
2
  if (s != NULL && (s->flags & SEC_LOAD) != 0)
12637
0
    {
12638
0
      for (m = elf_seg_map (abfd); m != NULL; m = m->next)
12639
0
  if (m->p_type == PT_MIPS_REGINFO)
12640
0
    break;
12641
0
      if (m == NULL)
12642
0
  {
12643
0
    amt = sizeof *m;
12644
0
    m = bfd_zalloc (abfd, amt);
12645
0
    if (m == NULL)
12646
0
      return false;
12647
12648
0
    m->p_type = PT_MIPS_REGINFO;
12649
0
    m->count = 1;
12650
0
    m->sections[0] = s;
12651
12652
    /* We want to put it after the PHDR and INTERP segments.  */
12653
0
    pm = &elf_seg_map (abfd);
12654
0
    while (*pm != NULL
12655
0
     && ((*pm)->p_type == PT_PHDR
12656
0
         || (*pm)->p_type == PT_INTERP))
12657
0
      pm = &(*pm)->next;
12658
12659
0
    m->next = *pm;
12660
0
    *pm = m;
12661
0
  }
12662
0
    }
12663
12664
  /* If there is a .MIPS.abiflags section, we need a PT_MIPS_ABIFLAGS
12665
     segment.  */
12666
2
  s = bfd_get_section_by_name (abfd, ".MIPS.abiflags");
12667
2
  if (s != NULL && (s->flags & SEC_LOAD) != 0)
12668
0
    {
12669
0
      for (m = elf_seg_map (abfd); m != NULL; m = m->next)
12670
0
  if (m->p_type == PT_MIPS_ABIFLAGS)
12671
0
    break;
12672
0
      if (m == NULL)
12673
0
  {
12674
0
    amt = sizeof *m;
12675
0
    m = bfd_zalloc (abfd, amt);
12676
0
    if (m == NULL)
12677
0
      return false;
12678
12679
0
    m->p_type = PT_MIPS_ABIFLAGS;
12680
0
    m->count = 1;
12681
0
    m->sections[0] = s;
12682
12683
    /* We want to put it after the PHDR and INTERP segments.  */
12684
0
    pm = &elf_seg_map (abfd);
12685
0
    while (*pm != NULL
12686
0
     && ((*pm)->p_type == PT_PHDR
12687
0
         || (*pm)->p_type == PT_INTERP))
12688
0
      pm = &(*pm)->next;
12689
12690
0
    m->next = *pm;
12691
0
    *pm = m;
12692
0
  }
12693
0
    }
12694
12695
  /* For IRIX 6, we don't have .mdebug sections, nor does anything but
12696
     .dynamic end up in PT_DYNAMIC.  However, we do have to insert a
12697
     PT_MIPS_OPTIONS segment immediately following the program header
12698
     table.  */
12699
2
  if (NEWABI_P (abfd)
12700
      /* On non-IRIX6 new abi, we'll have already created a segment
12701
   for this section, so don't create another.  I'm not sure this
12702
   is not also the case for IRIX 6, but I can't test it right
12703
   now.  */
12704
2
      && IRIX_COMPAT (abfd) == ict_irix6)
12705
0
    {
12706
0
      for (s = abfd->sections; s; s = s->next)
12707
0
  if (elf_section_data (s)->this_hdr.sh_type == SHT_MIPS_OPTIONS)
12708
0
    break;
12709
12710
0
      if (s)
12711
0
  {
12712
0
    struct elf_segment_map *options_segment;
12713
12714
0
    pm = &elf_seg_map (abfd);
12715
0
    while (*pm != NULL
12716
0
     && ((*pm)->p_type == PT_PHDR
12717
0
         || (*pm)->p_type == PT_INTERP))
12718
0
      pm = &(*pm)->next;
12719
12720
0
    if (*pm == NULL || (*pm)->p_type != PT_MIPS_OPTIONS)
12721
0
      {
12722
0
        amt = sizeof (struct elf_segment_map);
12723
0
        options_segment = bfd_zalloc (abfd, amt);
12724
0
        options_segment->next = *pm;
12725
0
        options_segment->p_type = PT_MIPS_OPTIONS;
12726
0
        options_segment->p_flags = PF_R;
12727
0
        options_segment->p_flags_valid = true;
12728
0
        options_segment->count = 1;
12729
0
        options_segment->sections[0] = s;
12730
0
        *pm = options_segment;
12731
0
      }
12732
0
  }
12733
0
    }
12734
2
  else
12735
2
    {
12736
2
      if (IRIX_COMPAT (abfd) == ict_irix5)
12737
2
  {
12738
    /* If there are .dynamic and .mdebug sections, we make a room
12739
       for the RTPROC header.  FIXME: Rewrite without section names.  */
12740
2
    if (bfd_get_section_by_name (abfd, ".interp") == NULL
12741
2
        && bfd_get_section_by_name (abfd, ".dynamic") != NULL
12742
2
        && bfd_get_section_by_name (abfd, ".mdebug") != NULL)
12743
0
      {
12744
0
        for (m = elf_seg_map (abfd); m != NULL; m = m->next)
12745
0
    if (m->p_type == PT_MIPS_RTPROC)
12746
0
      break;
12747
0
        if (m == NULL)
12748
0
    {
12749
0
      amt = sizeof *m;
12750
0
      m = bfd_zalloc (abfd, amt);
12751
0
      if (m == NULL)
12752
0
        return false;
12753
12754
0
      m->p_type = PT_MIPS_RTPROC;
12755
12756
0
      s = bfd_get_section_by_name (abfd, ".rtproc");
12757
0
      if (s == NULL)
12758
0
        {
12759
0
          m->count = 0;
12760
0
          m->p_flags = 0;
12761
0
          m->p_flags_valid = 1;
12762
0
        }
12763
0
      else
12764
0
        {
12765
0
          m->count = 1;
12766
0
          m->sections[0] = s;
12767
0
        }
12768
12769
      /* We want to put it after the DYNAMIC segment.  */
12770
0
      pm = &elf_seg_map (abfd);
12771
0
      while (*pm != NULL && (*pm)->p_type != PT_DYNAMIC)
12772
0
        pm = &(*pm)->next;
12773
0
      if (*pm != NULL)
12774
0
        pm = &(*pm)->next;
12775
12776
0
      m->next = *pm;
12777
0
      *pm = m;
12778
0
    }
12779
0
      }
12780
2
  }
12781
      /* On IRIX5, the PT_DYNAMIC segment includes the .dynamic,
12782
   .dynstr, .dynsym, and .hash sections, and everything in
12783
   between.  */
12784
2
      for (pm = &elf_seg_map (abfd); *pm != NULL;
12785
2
     pm = &(*pm)->next)
12786
0
  if ((*pm)->p_type == PT_DYNAMIC)
12787
0
    break;
12788
2
      m = *pm;
12789
      /* GNU/Linux binaries do not need the extended PT_DYNAMIC section.
12790
   glibc's dynamic linker has traditionally derived the number of
12791
   tags from the p_filesz field, and sometimes allocates stack
12792
   arrays of that size.  An overly-big PT_DYNAMIC segment can
12793
   be actively harmful in such cases.  Making PT_DYNAMIC contain
12794
   other sections can also make life hard for the prelinker,
12795
   which might move one of the other sections to a different
12796
   PT_LOAD segment.  */
12797
2
      if (SGI_COMPAT (abfd)
12798
2
    && m != NULL
12799
2
    && m->count == 1
12800
2
    && strcmp (m->sections[0]->name, ".dynamic") == 0)
12801
0
  {
12802
0
    static const char *sec_names[] =
12803
0
    {
12804
0
      ".dynamic", ".dynstr", ".dynsym", ".hash"
12805
0
    };
12806
0
    bfd_vma low, high;
12807
0
    unsigned int i, c;
12808
0
    struct elf_segment_map *n;
12809
12810
0
    low = ~(bfd_vma) 0;
12811
0
    high = 0;
12812
0
    for (i = 0; i < sizeof sec_names / sizeof sec_names[0]; i++)
12813
0
      {
12814
0
        s = bfd_get_section_by_name (abfd, sec_names[i]);
12815
0
        if (s != NULL && (s->flags & SEC_LOAD) != 0)
12816
0
    {
12817
0
      bfd_size_type sz;
12818
12819
0
      if (low > s->vma)
12820
0
        low = s->vma;
12821
0
      sz = s->size;
12822
0
      if (high < s->vma + sz)
12823
0
        high = s->vma + sz;
12824
0
    }
12825
0
      }
12826
12827
0
    c = 0;
12828
0
    for (s = abfd->sections; s != NULL; s = s->next)
12829
0
      if ((s->flags & SEC_LOAD) != 0
12830
0
    && s->vma >= low
12831
0
    && s->vma + s->size <= high)
12832
0
        ++c;
12833
12834
0
    amt = sizeof *n - sizeof (asection *) + c * sizeof (asection *);
12835
0
    n = bfd_zalloc (abfd, amt);
12836
0
    if (n == NULL)
12837
0
      return false;
12838
0
    *n = *m;
12839
0
    n->count = c;
12840
12841
0
    i = 0;
12842
0
    for (s = abfd->sections; s != NULL; s = s->next)
12843
0
      {
12844
0
        if ((s->flags & SEC_LOAD) != 0
12845
0
      && s->vma >= low
12846
0
      && s->vma + s->size <= high)
12847
0
    {
12848
0
      n->sections[i] = s;
12849
0
      ++i;
12850
0
    }
12851
0
      }
12852
12853
0
    *pm = n;
12854
0
  }
12855
2
    }
12856
12857
  /* Allocate a spare program header in dynamic objects so that tools
12858
     like the prelinker can add an extra PT_LOAD entry.
12859
12860
     If the prelinker needs to make room for a new PT_LOAD entry, its
12861
     standard procedure is to move the first (read-only) sections into
12862
     the new (writable) segment.  However, the MIPS ABI requires
12863
     .dynamic to be in a read-only segment, and the section will often
12864
     start within sizeof (ElfNN_Phdr) bytes of the last program header.
12865
12866
     Although the prelinker could in principle move .dynamic to a
12867
     writable segment, it seems better to allocate a spare program
12868
     header instead, and avoid the need to move any sections.
12869
     There is a long tradition of allocating spare dynamic tags,
12870
     so allocating a spare program header seems like a natural
12871
     extension.
12872
12873
     If INFO is NULL, we may be copying an already prelinked binary
12874
     with objcopy or strip, so do not add this header.  */
12875
2
  if (info != NULL
12876
2
      && !SGI_COMPAT (abfd)
12877
2
      && bfd_get_section_by_name (abfd, ".dynamic"))
12878
0
    {
12879
0
      for (pm = &elf_seg_map (abfd); *pm != NULL; pm = &(*pm)->next)
12880
0
  if ((*pm)->p_type == PT_NULL)
12881
0
    break;
12882
0
      if (*pm == NULL)
12883
0
  {
12884
0
    m = bfd_zalloc (abfd, sizeof (*m));
12885
0
    if (m == NULL)
12886
0
      return false;
12887
12888
0
    m->p_type = PT_NULL;
12889
0
    *pm = m;
12890
0
  }
12891
0
    }
12892
12893
2
  return true;
12894
2
}
12895

12896
/* Return the section that should be marked against GC for a given
12897
   relocation.  */
12898
12899
asection *
12900
_bfd_mips_elf_gc_mark_hook (asection *sec,
12901
          struct bfd_link_info *info,
12902
          Elf_Internal_Rela *rel,
12903
          struct elf_link_hash_entry *h,
12904
          Elf_Internal_Sym *sym)
12905
0
{
12906
  /* ??? Do mips16 stub sections need to be handled special?  */
12907
12908
0
  if (h != NULL)
12909
0
    switch (ELF_R_TYPE (sec->owner, rel->r_info))
12910
0
      {
12911
0
      case R_MIPS_GNU_VTINHERIT:
12912
0
      case R_MIPS_GNU_VTENTRY:
12913
0
  return NULL;
12914
0
      }
12915
12916
0
  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
12917
0
}
12918
12919
/* Prevent .MIPS.abiflags from being discarded with --gc-sections.  */
12920
12921
bool
12922
_bfd_mips_elf_gc_mark_extra_sections (struct bfd_link_info *info,
12923
              elf_gc_mark_hook_fn gc_mark_hook)
12924
0
{
12925
0
  bfd *sub;
12926
12927
0
  _bfd_elf_gc_mark_extra_sections (info, gc_mark_hook);
12928
12929
0
  for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
12930
0
    {
12931
0
      asection *o;
12932
12933
0
      if (! is_mips_elf (sub))
12934
0
  continue;
12935
12936
0
      for (o = sub->sections; o != NULL; o = o->next)
12937
0
  if (!o->gc_mark
12938
0
      && MIPS_ELF_ABIFLAGS_SECTION_NAME_P (bfd_section_name (o)))
12939
0
    {
12940
0
      if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
12941
0
        return false;
12942
0
    }
12943
0
    }
12944
12945
0
  return true;
12946
0
}
12947

12948
/* Copy data from a MIPS ELF indirect symbol to its direct symbol,
12949
   hiding the old indirect symbol.  Process additional relocation
12950
   information.  Also called for weakdefs, in which case we just let
12951
   _bfd_elf_link_hash_copy_indirect copy the flags for us.  */
12952
12953
void
12954
_bfd_mips_elf_copy_indirect_symbol (struct bfd_link_info *info,
12955
            struct elf_link_hash_entry *dir,
12956
            struct elf_link_hash_entry *ind)
12957
0
{
12958
0
  struct mips_elf_link_hash_entry *dirmips, *indmips;
12959
12960
0
  _bfd_elf_link_hash_copy_indirect (info, dir, ind);
12961
12962
0
  dirmips = (struct mips_elf_link_hash_entry *) dir;
12963
0
  indmips = (struct mips_elf_link_hash_entry *) ind;
12964
  /* Any absolute non-dynamic relocations against an indirect or weak
12965
     definition will be against the target symbol.  */
12966
0
  if (indmips->has_static_relocs)
12967
0
    dirmips->has_static_relocs = true;
12968
12969
0
  if (ind->root.type != bfd_link_hash_indirect)
12970
0
    return;
12971
12972
0
  dirmips->possibly_dynamic_relocs += indmips->possibly_dynamic_relocs;
12973
0
  if (indmips->readonly_reloc)
12974
0
    dirmips->readonly_reloc = true;
12975
0
  if (indmips->no_fn_stub)
12976
0
    dirmips->no_fn_stub = true;
12977
0
  if (indmips->fn_stub)
12978
0
    {
12979
0
      dirmips->fn_stub = indmips->fn_stub;
12980
0
      indmips->fn_stub = NULL;
12981
0
    }
12982
0
  if (indmips->need_fn_stub)
12983
0
    {
12984
0
      dirmips->need_fn_stub = true;
12985
0
      indmips->need_fn_stub = false;
12986
0
    }
12987
0
  if (indmips->call_stub)
12988
0
    {
12989
0
      dirmips->call_stub = indmips->call_stub;
12990
0
      indmips->call_stub = NULL;
12991
0
    }
12992
0
  if (indmips->call_fp_stub)
12993
0
    {
12994
0
      dirmips->call_fp_stub = indmips->call_fp_stub;
12995
0
      indmips->call_fp_stub = NULL;
12996
0
    }
12997
0
  if (indmips->global_got_area < dirmips->global_got_area)
12998
0
    dirmips->global_got_area = indmips->global_got_area;
12999
0
  if (indmips->global_got_area < GGA_NONE)
13000
0
    indmips->global_got_area = GGA_NONE;
13001
0
  if (indmips->has_nonpic_branches)
13002
0
    dirmips->has_nonpic_branches = true;
13003
0
}
13004
13005
/* Take care of the special `__gnu_absolute_zero' symbol and ignore attempts
13006
   to hide it.  It has to remain global (it will also be protected) so as to
13007
   be assigned a global GOT entry, which will then remain unchanged at load
13008
   time.  */
13009
13010
void
13011
_bfd_mips_elf_hide_symbol (struct bfd_link_info *info,
13012
         struct elf_link_hash_entry *entry,
13013
         bool force_local)
13014
0
{
13015
0
  struct mips_elf_link_hash_table *htab;
13016
13017
0
  htab = mips_elf_hash_table (info);
13018
0
  BFD_ASSERT (htab != NULL);
13019
0
  if (htab->use_absolute_zero
13020
0
      && strcmp (entry->root.root.string, "__gnu_absolute_zero") == 0)
13021
0
    return;
13022
13023
0
  _bfd_elf_link_hash_hide_symbol (info, entry, force_local);
13024
0
}
13025

13026
0
#define PDR_SIZE 32
13027
13028
bool
13029
_bfd_mips_elf_discard_info (bfd *abfd, struct elf_reloc_cookie *cookie,
13030
          struct bfd_link_info *info)
13031
0
{
13032
0
  asection *o;
13033
0
  bool ret = false;
13034
0
  unsigned char *tdata;
13035
0
  size_t i, skip;
13036
13037
0
  o = bfd_get_section_by_name (abfd, ".pdr");
13038
0
  if (! o)
13039
0
    return false;
13040
0
  if (o->size == 0)
13041
0
    return false;
13042
0
  if (o->size % PDR_SIZE != 0)
13043
0
    return false;
13044
0
  if (o->output_section != NULL
13045
0
      && bfd_is_abs_section (o->output_section))
13046
0
    return false;
13047
13048
0
  tdata = bfd_zmalloc (o->size / PDR_SIZE);
13049
0
  if (! tdata)
13050
0
    return false;
13051
13052
0
  cookie->rels = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
13053
0
              info->keep_memory);
13054
0
  if (!cookie->rels)
13055
0
    {
13056
0
      free (tdata);
13057
0
      return false;
13058
0
    }
13059
13060
0
  cookie->rel = cookie->rels;
13061
0
  cookie->relend = cookie->rels + o->reloc_count;
13062
13063
0
  for (i = 0, skip = 0; i < o->size / PDR_SIZE; i ++)
13064
0
    {
13065
0
      if (bfd_elf_reloc_symbol_deleted_p (i * PDR_SIZE, cookie))
13066
0
  {
13067
0
    tdata[i] = 1;
13068
0
    skip ++;
13069
0
  }
13070
0
    }
13071
13072
0
  if (skip != 0)
13073
0
    {
13074
0
      mips_elf_section_data (o)->u.tdata = tdata;
13075
0
      if (o->rawsize == 0)
13076
0
  o->rawsize = o->size;
13077
0
      o->size -= skip * PDR_SIZE;
13078
0
      ret = true;
13079
0
    }
13080
0
  else
13081
0
    free (tdata);
13082
13083
0
  if (! info->keep_memory)
13084
0
    free (cookie->rels);
13085
13086
0
  return ret;
13087
0
}
13088
13089
bool
13090
_bfd_mips_elf_ignore_discarded_relocs (asection *sec)
13091
0
{
13092
0
  if (strcmp (sec->name, ".pdr") == 0)
13093
0
    return true;
13094
0
  return false;
13095
0
}
13096
13097
bool
13098
_bfd_mips_elf_write_section (bfd *output_bfd,
13099
           struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
13100
           asection *sec, bfd_byte *contents)
13101
0
{
13102
0
  bfd_byte *to, *from, *end;
13103
0
  int i;
13104
13105
0
  if (strcmp (sec->name, ".pdr") != 0)
13106
0
    return false;
13107
13108
0
  if (mips_elf_section_data (sec)->u.tdata == NULL)
13109
0
    return false;
13110
13111
0
  to = contents;
13112
0
  end = contents + sec->size;
13113
0
  for (from = contents, i = 0;
13114
0
       from < end;
13115
0
       from += PDR_SIZE, i++)
13116
0
    {
13117
0
      if ((mips_elf_section_data (sec)->u.tdata)[i] == 1)
13118
0
  continue;
13119
0
      if (to != from)
13120
0
  memcpy (to, from, PDR_SIZE);
13121
0
      to += PDR_SIZE;
13122
0
    }
13123
0
  bfd_set_section_contents (output_bfd, sec->output_section, contents,
13124
0
          sec->output_offset, sec->size);
13125
0
  return true;
13126
0
}
13127

13128
/* microMIPS code retains local labels for linker relaxation.  Omit them
13129
   from output by default for clarity.  */
13130
13131
bool
13132
_bfd_mips_elf_is_target_special_symbol (bfd *abfd, asymbol *sym)
13133
591
{
13134
591
  return _bfd_elf_is_local_label_name (abfd, sym->name);
13135
591
}
13136
13137
bool
13138
_bfd_mips_elf_find_nearest_line (bfd *abfd, asymbol **symbols,
13139
         asection *section, bfd_vma offset,
13140
         const char **filename_ptr,
13141
         const char **functionname_ptr,
13142
         unsigned int *line_ptr,
13143
         unsigned int *discriminator_ptr)
13144
7.14k
{
13145
7.14k
  asection *msec;
13146
13147
7.14k
  if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
13148
7.14k
             filename_ptr, functionname_ptr,
13149
7.14k
             line_ptr, discriminator_ptr,
13150
7.14k
             dwarf_debug_sections,
13151
7.14k
             &elf_tdata (abfd)->dwarf2_find_line_info)
13152
7.14k
      == 1)
13153
0
    return true;
13154
13155
7.14k
  if (_bfd_dwarf1_find_nearest_line (abfd, symbols, section, offset,
13156
7.14k
             filename_ptr, functionname_ptr,
13157
7.14k
             line_ptr))
13158
0
    {
13159
0
      if (!*functionname_ptr)
13160
0
  _bfd_elf_find_function (abfd, symbols, section, offset,
13161
0
        *filename_ptr ? NULL : filename_ptr,
13162
0
        functionname_ptr);
13163
0
      return true;
13164
0
    }
13165
13166
7.14k
  msec = bfd_get_section_by_name (abfd, ".mdebug");
13167
7.14k
  if (msec != NULL)
13168
5.44k
    {
13169
5.44k
      flagword origflags;
13170
5.44k
      struct mips_elf_find_line *fi;
13171
5.44k
      const struct ecoff_debug_swap * const swap =
13172
5.44k
  get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
13173
13174
      /* If we are called during a link, mips_elf_final_link may have
13175
   cleared the SEC_HAS_CONTENTS field.  We force it back on here
13176
   if appropriate (which it normally will be).  */
13177
5.44k
      origflags = msec->flags;
13178
5.44k
      if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
13179
5.42k
  msec->flags |= SEC_HAS_CONTENTS;
13180
13181
5.44k
      fi = mips_elf_tdata (abfd)->find_line_info;
13182
5.44k
      if (fi == NULL)
13183
3.90k
  {
13184
3.90k
    bfd_size_type external_fdr_size;
13185
3.90k
    char *fraw_src;
13186
3.90k
    char *fraw_end;
13187
3.90k
    struct fdr *fdr_ptr;
13188
3.90k
    bfd_size_type amt = sizeof (struct mips_elf_find_line);
13189
13190
3.90k
    fi = bfd_zalloc (abfd, amt);
13191
3.90k
    if (fi == NULL)
13192
0
      {
13193
0
        msec->flags = origflags;
13194
0
        return false;
13195
0
      }
13196
13197
3.90k
    if (! _bfd_mips_elf_read_ecoff_info (abfd, msec, &fi->d))
13198
3.56k
      {
13199
3.56k
        msec->flags = origflags;
13200
3.56k
        return false;
13201
3.56k
      }
13202
13203
    /* Swap in the FDR information.  */
13204
337
    amt = fi->d.symbolic_header.ifdMax * sizeof (struct fdr);
13205
337
    fi->d.fdr = bfd_alloc (abfd, amt);
13206
337
    if (fi->d.fdr == NULL)
13207
0
      {
13208
0
        _bfd_ecoff_free_ecoff_debug_info (&fi->d);
13209
0
        msec->flags = origflags;
13210
0
        return false;
13211
0
      }
13212
337
    external_fdr_size = swap->external_fdr_size;
13213
337
    fdr_ptr = fi->d.fdr;
13214
337
    fraw_src = (char *) fi->d.external_fdr;
13215
337
    fraw_end = (fraw_src
13216
337
          + fi->d.symbolic_header.ifdMax * external_fdr_size);
13217
51.1k
    for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
13218
50.8k
      (*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr);
13219
13220
337
    mips_elf_tdata (abfd)->find_line_info = fi;
13221
337
  }
13222
13223
1.88k
      if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
13224
1.88k
          &fi->i, filename_ptr, functionname_ptr,
13225
1.88k
          line_ptr))
13226
1.17k
  {
13227
1.17k
    msec->flags = origflags;
13228
1.17k
    return true;
13229
1.17k
  }
13230
13231
714
      msec->flags = origflags;
13232
714
    }
13233
13234
  /* Fall back on the generic ELF find_nearest_line routine.  */
13235
13236
2.40k
  return _bfd_elf_find_nearest_line (abfd, symbols, section, offset,
13237
2.40k
             filename_ptr, functionname_ptr,
13238
2.40k
             line_ptr, discriminator_ptr);
13239
7.14k
}
13240
13241
bool
13242
_bfd_mips_elf_find_inliner_info (bfd *abfd,
13243
         const char **filename_ptr,
13244
         const char **functionname_ptr,
13245
         unsigned int *line_ptr)
13246
0
{
13247
0
  bool found;
13248
0
  found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
13249
0
           functionname_ptr, line_ptr,
13250
0
           & elf_tdata (abfd)->dwarf2_find_line_info);
13251
0
  return found;
13252
0
}
13253
13254

13255
/* When are writing out the .options or .MIPS.options section,
13256
   remember the bytes we are writing out, so that we can install the
13257
   GP value in the section_processing routine.  */
13258
13259
bool
13260
_bfd_mips_elf_set_section_contents (bfd *abfd, sec_ptr section,
13261
            const void *location,
13262
            file_ptr offset, bfd_size_type count)
13263
0
{
13264
0
  if (MIPS_ELF_OPTIONS_SECTION_NAME_P (section->name))
13265
0
    {
13266
0
      bfd_byte *c;
13267
13268
0
      if (elf_section_data (section) == NULL)
13269
0
  {
13270
0
    size_t amt = sizeof (struct bfd_elf_section_data);
13271
0
    section->used_by_bfd = bfd_zalloc (abfd, amt);
13272
0
    if (elf_section_data (section) == NULL)
13273
0
      return false;
13274
0
  }
13275
0
      c = mips_elf_section_data (section)->u.tdata;
13276
0
      if (c == NULL)
13277
0
  {
13278
0
    c = bfd_zalloc (abfd, section->size);
13279
0
    if (c == NULL)
13280
0
      return false;
13281
0
    mips_elf_section_data (section)->u.tdata = c;
13282
0
  }
13283
13284
0
      memcpy (c + offset, location, count);
13285
0
    }
13286
13287
0
  return _bfd_elf_set_section_contents (abfd, section, location, offset,
13288
0
          count);
13289
0
}
13290
13291
/* This is almost identical to bfd_generic_get_... except that some
13292
   MIPS relocations need to be handled specially.  Sigh.  */
13293
13294
bfd_byte *
13295
_bfd_elf_mips_get_relocated_section_contents
13296
  (bfd *abfd,
13297
   struct bfd_link_info *link_info,
13298
   struct bfd_link_order *link_order,
13299
   bfd_byte *data,
13300
   bool relocatable,
13301
   asymbol **symbols)
13302
245
{
13303
245
  bfd *input_bfd = link_order->u.indirect.section->owner;
13304
245
  asection *input_section = link_order->u.indirect.section;
13305
245
  long reloc_size;
13306
245
  arelent **reloc_vector;
13307
245
  long reloc_count;
13308
13309
245
  reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
13310
245
  if (reloc_size < 0)
13311
1
    return NULL;
13312
13313
  /* Read in the section.  */
13314
244
  bfd_byte *orig_data = data;
13315
244
  if (!bfd_get_full_section_contents (input_bfd, input_section, &data))
13316
2
    return NULL;
13317
13318
242
  if (data == NULL)
13319
2
    return NULL;
13320
13321
240
  if (reloc_size == 0)
13322
0
    return data;
13323
13324
240
  reloc_vector = (arelent **) bfd_malloc (reloc_size);
13325
240
  if (reloc_vector == NULL)
13326
0
    {
13327
0
      struct mips_elf_obj_tdata *tdata;
13328
0
      struct mips_hi16 **hip, *hi;
13329
194
    error_return:
13330
      /* If we are going to return an error, remove entries on
13331
   mips_hi16_list that point into this section's data.  Data
13332
   will typically be freed on return from this function.  */
13333
194
      tdata = mips_elf_tdata (abfd);
13334
194
      hip = &tdata->mips_hi16_list;
13335
215
      while ((hi = *hip) != NULL)
13336
21
  {
13337
21
    if (hi->input_section == input_section)
13338
13
      {
13339
13
        *hip = hi->next;
13340
13
        free (hi);
13341
13
      }
13342
8
    else
13343
8
      hip = &hi->next;
13344
21
  }
13345
194
      if (orig_data == NULL)
13346
15
  free (data);
13347
194
      data = NULL;
13348
194
      goto out;
13349
0
    }
13350
13351
240
  reloc_count = bfd_canonicalize_reloc (input_bfd,
13352
240
          input_section,
13353
240
          reloc_vector,
13354
240
          symbols);
13355
240
  if (reloc_count < 0)
13356
94
    goto error_return;
13357
13358
146
  if (reloc_count > 0)
13359
128
    {
13360
128
      arelent **parent;
13361
      /* for mips */
13362
128
      int gp_found;
13363
128
      bfd_vma gp = 0x12345678;  /* initialize just to shut gcc up */
13364
13365
128
      {
13366
128
  struct bfd_hash_entry *h;
13367
128
  struct bfd_link_hash_entry *lh;
13368
  /* Skip all this stuff if we aren't mixing formats.  */
13369
128
  if (abfd && input_bfd
13370
128
      && abfd->xvec == input_bfd->xvec)
13371
128
    lh = 0;
13372
0
  else
13373
0
    {
13374
0
      h = bfd_hash_lookup (&link_info->hash->table, "_gp", false, false);
13375
0
      lh = (struct bfd_link_hash_entry *) h;
13376
0
    }
13377
128
      lookup:
13378
128
  if (lh)
13379
0
    {
13380
0
      switch (lh->type)
13381
0
        {
13382
0
        case bfd_link_hash_undefined:
13383
0
        case bfd_link_hash_undefweak:
13384
0
        case bfd_link_hash_common:
13385
0
    gp_found = 0;
13386
0
    break;
13387
0
        case bfd_link_hash_defined:
13388
0
        case bfd_link_hash_defweak:
13389
0
    gp_found = 1;
13390
0
    gp = lh->u.def.value;
13391
0
    break;
13392
0
        case bfd_link_hash_indirect:
13393
0
        case bfd_link_hash_warning:
13394
0
    lh = lh->u.i.link;
13395
    /* @@FIXME  ignoring warning for now */
13396
0
    goto lookup;
13397
0
        case bfd_link_hash_new:
13398
0
        default:
13399
0
    abort ();
13400
0
        }
13401
0
    }
13402
128
  else
13403
128
    gp_found = 0;
13404
128
      }
13405
      /* end mips */
13406
13407
1.01k
      for (parent = reloc_vector; *parent != NULL; parent++)
13408
990
  {
13409
990
    char *error_message = NULL;
13410
990
    asymbol *symbol;
13411
990
    bfd_reloc_status_type r;
13412
13413
990
    symbol = *(*parent)->sym_ptr_ptr;
13414
    /* PR ld/19628: A specially crafted input file
13415
       can result in a NULL symbol pointer here.  */
13416
990
    if (symbol == NULL)
13417
0
      {
13418
0
        link_info->callbacks->einfo
13419
    /* xgettext:c-format */
13420
0
    (_("%X%P: %pB(%pA): error: relocation for offset %V has no value\n"),
13421
0
     abfd, input_section, (* parent)->address);
13422
0
        goto error_return;
13423
0
      }
13424
13425
    /* Zap reloc field when the symbol is from a discarded
13426
       section, ignoring any addend.  Do the same when called
13427
       from bfd_simple_get_relocated_section_contents for
13428
       undefined symbols in debug sections.  This is to keep
13429
       debug info reasonably sane, in particular so that
13430
       DW_FORM_ref_addr to another file's .debug_info isn't
13431
       confused with an offset into the current file's
13432
       .debug_info.  */
13433
990
    if ((symbol->section != NULL && discarded_section (symbol->section))
13434
990
        || (symbol->section == bfd_und_section_ptr
13435
990
      && (input_section->flags & SEC_DEBUGGING) != 0
13436
990
      && link_info->input_bfds == link_info->output_bfd))
13437
34
      {
13438
34
        bfd_vma off;
13439
34
        static reloc_howto_type none_howto
13440
34
    = HOWTO (0, 0, 0, 0, false, 0, complain_overflow_dont, NULL,
13441
34
       "unused", false, 0, 0, false);
13442
13443
34
        off = ((*parent)->address
13444
34
         * bfd_octets_per_byte (input_bfd, input_section));
13445
34
        _bfd_clear_contents ((*parent)->howto, input_bfd,
13446
34
           input_section, data, off);
13447
34
        (*parent)->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
13448
34
        (*parent)->addend = 0;
13449
34
        (*parent)->howto = &none_howto;
13450
34
        r = bfd_reloc_ok;
13451
34
      }
13452
13453
    /* Specific to MIPS: Deal with relocation types that require
13454
       knowing the gp of the output bfd.  */
13455
13456
    /* If we've managed to find the gp and have a special
13457
       function for the relocation then go ahead, else default
13458
       to the generic handling.  */
13459
956
    else if (gp_found
13460
956
       && ((*parent)->howto->special_function
13461
0
           == _bfd_mips_elf32_gprel16_reloc))
13462
0
      r = _bfd_mips_elf_gprel16_with_gp (input_bfd, symbol, *parent,
13463
0
                 input_section, relocatable,
13464
0
                 data, gp);
13465
956
    else
13466
956
      r = bfd_perform_relocation (input_bfd,
13467
956
          *parent,
13468
956
          data,
13469
956
          input_section,
13470
956
          relocatable ? abfd : NULL,
13471
956
          &error_message);
13472
13473
990
    if (relocatable)
13474
0
      {
13475
0
        asection *os = input_section->output_section;
13476
13477
        /* A partial link, so keep the relocs.  */
13478
0
        os->orelocation[os->reloc_count] = *parent;
13479
0
        os->reloc_count++;
13480
0
      }
13481
13482
990
    if (r != bfd_reloc_ok)
13483
256
      {
13484
256
        switch (r)
13485
256
    {
13486
59
    case bfd_reloc_undefined:
13487
59
      (*link_info->callbacks->undefined_symbol)
13488
59
        (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13489
59
         input_bfd, input_section, (*parent)->address, true);
13490
59
      break;
13491
51
    case bfd_reloc_dangerous:
13492
51
      BFD_ASSERT (error_message != NULL);
13493
51
      (*link_info->callbacks->reloc_dangerous)
13494
51
        (link_info, error_message,
13495
51
         input_bfd, input_section, (*parent)->address);
13496
51
      break;
13497
46
    case bfd_reloc_overflow:
13498
46
      (*link_info->callbacks->reloc_overflow)
13499
46
        (link_info, NULL,
13500
46
         bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13501
46
         (*parent)->howto->name, (*parent)->addend,
13502
46
         input_bfd, input_section, (*parent)->address);
13503
46
      break;
13504
100
    case bfd_reloc_outofrange:
13505
      /* PR ld/13730:
13506
         This error can result when processing some partially
13507
         complete binaries.  Do not abort, but issue an error
13508
         message instead.  */
13509
100
      link_info->callbacks->einfo
13510
        /* xgettext:c-format */
13511
100
        (_("%X%P: %pB(%pA): relocation \"%pR\" goes out of range\n"),
13512
100
         abfd, input_section, * parent);
13513
100
      goto error_return;
13514
13515
0
    case bfd_reloc_notsupported:
13516
      /* PR ld/17512
13517
         This error can result when processing a corrupt binary.
13518
         Do not abort.  Issue an error message instead.  */
13519
0
      link_info->callbacks->einfo
13520
        /* xgettext:c-format */
13521
0
        (_("%X%P: %pB(%pA): relocation \"%pR\" is not supported\n"),
13522
0
         abfd, input_section, * parent);
13523
0
      goto error_return;
13524
13525
0
    default:
13526
      /* PR 17512; file: 90c2a92e.
13527
         Report unexpected results, without aborting.  */
13528
0
      link_info->callbacks->einfo
13529
        /* xgettext:c-format */
13530
0
        (_("%X%P: %pB(%pA): relocation \"%pR\" returns an unrecognized value %x\n"),
13531
0
         abfd, input_section, * parent, r);
13532
0
      break;
13533
256
    }
13534
13535
256
      }
13536
990
  }
13537
128
    }
13538
13539
240
 out:
13540
240
  free (reloc_vector);
13541
240
  return data;
13542
146
}
13543

13544
static bool
13545
mips_elf_relax_delete_bytes (bfd *abfd,
13546
           asection *sec, bfd_vma addr, int count)
13547
0
{
13548
0
  Elf_Internal_Shdr *symtab_hdr;
13549
0
  unsigned int sec_shndx;
13550
0
  bfd_byte *contents;
13551
0
  Elf_Internal_Rela *irel, *irelend;
13552
0
  Elf_Internal_Sym *isym;
13553
0
  Elf_Internal_Sym *isymend;
13554
0
  struct elf_link_hash_entry **sym_hashes;
13555
0
  struct elf_link_hash_entry **end_hashes;
13556
0
  struct elf_link_hash_entry **start_hashes;
13557
0
  unsigned int symcount;
13558
13559
0
  sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
13560
0
  contents = elf_section_data (sec)->this_hdr.contents;
13561
13562
0
  irel = elf_section_data (sec)->relocs;
13563
0
  irelend = irel + sec->reloc_count;
13564
13565
  /* Actually delete the bytes.  */
13566
0
  memmove (contents + addr, contents + addr + count,
13567
0
     (size_t) (sec->size - addr - count));
13568
0
  sec->size -= count;
13569
13570
  /* Adjust all the relocs.  */
13571
0
  for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
13572
0
    {
13573
      /* Get the new reloc address.  */
13574
0
      if (irel->r_offset > addr)
13575
0
  irel->r_offset -= count;
13576
0
    }
13577
13578
0
  BFD_ASSERT (addr % 2 == 0);
13579
0
  BFD_ASSERT (count % 2 == 0);
13580
13581
  /* Adjust the local symbols defined in this section.  */
13582
0
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
13583
0
  isym = (Elf_Internal_Sym *) symtab_hdr->contents;
13584
0
  for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
13585
0
    if (isym->st_shndx == sec_shndx && isym->st_value > addr)
13586
0
      isym->st_value -= count;
13587
13588
  /* Now adjust the global symbols defined in this section.  */
13589
0
  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
13590
0
        - symtab_hdr->sh_info);
13591
0
  sym_hashes = start_hashes = elf_sym_hashes (abfd);
13592
0
  end_hashes = sym_hashes + symcount;
13593
13594
0
  for (; sym_hashes < end_hashes; sym_hashes++)
13595
0
    {
13596
0
      struct elf_link_hash_entry *sym_hash = *sym_hashes;
13597
13598
0
      if ((sym_hash->root.type == bfd_link_hash_defined
13599
0
     || sym_hash->root.type == bfd_link_hash_defweak)
13600
0
    && sym_hash->root.u.def.section == sec)
13601
0
  {
13602
0
    bfd_vma value = sym_hash->root.u.def.value;
13603
13604
0
    if (ELF_ST_IS_MICROMIPS (sym_hash->other))
13605
0
      value &= MINUS_TWO;
13606
0
    if (value > addr)
13607
0
      sym_hash->root.u.def.value -= count;
13608
0
  }
13609
0
    }
13610
13611
0
  return true;
13612
0
}
13613
13614
13615
/* Opcodes needed for microMIPS relaxation as found in
13616
   opcodes/micromips-opc.c.  */
13617
13618
struct opcode_descriptor {
13619
  unsigned long match;
13620
  unsigned long mask;
13621
};
13622
13623
/* The $ra register aka $31.  */
13624
13625
0
#define RA 31
13626
13627
/* 32-bit instruction format register fields.  */
13628
13629
0
#define OP32_SREG(opcode) (((opcode) >> 16) & 0x1f)
13630
0
#define OP32_TREG(opcode) (((opcode) >> 21) & 0x1f)
13631
13632
/* Check if a 5-bit register index can be abbreviated to 3 bits.  */
13633
13634
#define OP16_VALID_REG(r) \
13635
0
  ((2 <= (r) && (r) <= 7) || (16 <= (r) && (r) <= 17))
13636
13637
13638
/* 32-bit and 16-bit branches.  */
13639
13640
static const struct opcode_descriptor b_insns_32[] = {
13641
  { /* "b", "p",    */ 0x40400000, 0xffff0000 }, /* bgez 0 */
13642
  { /* "b", "p",    */ 0x94000000, 0xffff0000 }, /* beq 0, 0 */
13643
  { 0, 0 }  /* End marker for find_match().  */
13644
};
13645
13646
static const struct opcode_descriptor bc_insn_32 =
13647
  { /* "bc(1|2)(ft)", "N,p",  */ 0x42800000, 0xfec30000 };
13648
13649
static const struct opcode_descriptor bz_insn_32 =
13650
  { /* "b(g|l)(e|t)z", "s,p", */ 0x40000000, 0xff200000 };
13651
13652
static const struct opcode_descriptor bzal_insn_32 =
13653
  { /* "b(ge|lt)zal", "s,p",  */ 0x40200000, 0xffa00000 };
13654
13655
static const struct opcode_descriptor beq_insn_32 =
13656
  { /* "b(eq|ne)", "s,t,p", */ 0x94000000, 0xdc000000 };
13657
13658
static const struct opcode_descriptor b_insn_16 =
13659
  { /* "b", "mD",   */ 0xcc00,     0xfc00 };
13660
13661
static const struct opcode_descriptor bz_insn_16 =
13662
  { /* "b(eq|ne)z", "md,mE",  */ 0x8c00,     0xdc00 };
13663
13664
13665
/* 32-bit and 16-bit branch EQ and NE zero.  */
13666
13667
/* NOTE: All opcode tables have BEQ/BNE in the same order: first the
13668
   eq and second the ne.  This convention is used when replacing a
13669
   32-bit BEQ/BNE with the 16-bit version.  */
13670
13671
0
#define BZC32_REG_FIELD(r) (((r) & 0x1f) << 16)
13672
13673
static const struct opcode_descriptor bz_rs_insns_32[] = {
13674
  { /* "beqz",  "s,p",    */ 0x94000000, 0xffe00000 },
13675
  { /* "bnez",  "s,p",    */ 0xb4000000, 0xffe00000 },
13676
  { 0, 0 }  /* End marker for find_match().  */
13677
};
13678
13679
static const struct opcode_descriptor bz_rt_insns_32[] = {
13680
  { /* "beqz",  "t,p",    */ 0x94000000, 0xfc01f000 },
13681
  { /* "bnez",  "t,p",    */ 0xb4000000, 0xfc01f000 },
13682
  { 0, 0 }  /* End marker for find_match().  */
13683
};
13684
13685
static const struct opcode_descriptor bzc_insns_32[] = {
13686
  { /* "beqzc", "s,p",    */ 0x40e00000, 0xffe00000 },
13687
  { /* "bnezc", "s,p",    */ 0x40a00000, 0xffe00000 },
13688
  { 0, 0 }  /* End marker for find_match().  */
13689
};
13690
13691
static const struct opcode_descriptor bz_insns_16[] = {
13692
  { /* "beqz",  "md,mE",  */ 0x8c00,     0xfc00 },
13693
  { /* "bnez",  "md,mE",  */ 0xac00,     0xfc00 },
13694
  { 0, 0 }  /* End marker for find_match().  */
13695
};
13696
13697
/* Switch between a 5-bit register index and its 3-bit shorthand.  */
13698
13699
0
#define BZ16_REG(opcode) ((((((opcode) >> 7) & 7) + 0x1e) & 0xf) + 2)
13700
#define BZ16_REG_FIELD(r) (((r) & 7) << 7)
13701
13702
13703
/* 32-bit instructions with a delay slot.  */
13704
13705
static const struct opcode_descriptor jal_insn_32_bd16 =
13706
  { /* "jals",  "a",    */ 0x74000000, 0xfc000000 };
13707
13708
static const struct opcode_descriptor jal_insn_32_bd32 =
13709
  { /* "jal", "a",    */ 0xf4000000, 0xfc000000 };
13710
13711
static const struct opcode_descriptor jal_x_insn_32_bd32 =
13712
  { /* "jal[x]", "a",   */ 0xf0000000, 0xf8000000 };
13713
13714
static const struct opcode_descriptor j_insn_32 =
13715
  { /* "j", "a",    */ 0xd4000000, 0xfc000000 };
13716
13717
static const struct opcode_descriptor jalr_insn_32 =
13718
  { /* "jalr[.hb]", "t,s",  */ 0x00000f3c, 0xfc00efff };
13719
13720
/* This table can be compacted, because no opcode replacement is made.  */
13721
13722
static const struct opcode_descriptor ds_insns_32_bd16[] = {
13723
  { /* "jals",  "a",    */ 0x74000000, 0xfc000000 },
13724
13725
  { /* "jalrs[.hb]", "t,s", */ 0x00004f3c, 0xfc00efff },
13726
  { /* "b(ge|lt)zals", "s,p", */ 0x42200000, 0xffa00000 },
13727
13728
  { /* "b(g|l)(e|t)z", "s,p", */ 0x40000000, 0xff200000 },
13729
  { /* "b(eq|ne)", "s,t,p", */ 0x94000000, 0xdc000000 },
13730
  { /* "j", "a",    */ 0xd4000000, 0xfc000000 },
13731
  { 0, 0 }  /* End marker for find_match().  */
13732
};
13733
13734
/* This table can be compacted, because no opcode replacement is made.  */
13735
13736
static const struct opcode_descriptor ds_insns_32_bd32[] = {
13737
  { /* "jal[x]", "a",   */ 0xf0000000, 0xf8000000 },
13738
13739
  { /* "jalr[.hb]", "t,s",  */ 0x00000f3c, 0xfc00efff },
13740
  { /* "b(ge|lt)zal", "s,p",  */ 0x40200000, 0xffa00000 },
13741
  { 0, 0 }  /* End marker for find_match().  */
13742
};
13743
13744
13745
/* 16-bit instructions with a delay slot.  */
13746
13747
static const struct opcode_descriptor jalr_insn_16_bd16 =
13748
  { /* "jalrs", "my,mj",  */ 0x45e0,     0xffe0 };
13749
13750
static const struct opcode_descriptor jalr_insn_16_bd32 =
13751
  { /* "jalr",  "my,mj",  */ 0x45c0,     0xffe0 };
13752
13753
static const struct opcode_descriptor jr_insn_16 =
13754
  { /* "jr",  "mj",   */ 0x4580,     0xffe0 };
13755
13756
0
#define JR16_REG(opcode) ((opcode) & 0x1f)
13757
13758
/* This table can be compacted, because no opcode replacement is made.  */
13759
13760
static const struct opcode_descriptor ds_insns_16_bd16[] = {
13761
  { /* "jalrs", "my,mj",  */ 0x45e0,     0xffe0 },
13762
13763
  { /* "b", "mD",   */ 0xcc00,     0xfc00 },
13764
  { /* "b(eq|ne)z", "md,mE",  */ 0x8c00,     0xdc00 },
13765
  { /* "jr",  "mj",   */ 0x4580,     0xffe0 },
13766
  { 0, 0 }  /* End marker for find_match().  */
13767
};
13768
13769
13770
/* LUI instruction.  */
13771
13772
static const struct opcode_descriptor lui_insn =
13773
 { /* "lui",  "s,u",    */ 0x41a00000, 0xffe00000 };
13774
13775
13776
/* ADDIU instruction.  */
13777
13778
static const struct opcode_descriptor addiu_insn =
13779
  { /* "addiu", "t,r,j",  */ 0x30000000, 0xfc000000 };
13780
13781
static const struct opcode_descriptor addiupc_insn =
13782
  { /* "addiu", "mb,$pc,mQ",  */ 0x78000000, 0xfc000000 };
13783
13784
#define ADDIUPC_REG_FIELD(r) \
13785
0
  (((2 <= (r) && (r) <= 7) ? (r) : ((r) - 16)) << 23)
13786
13787
13788
/* Relaxable instructions in a JAL delay slot: MOVE.  */
13789
13790
/* The 16-bit move has rd in 9:5 and rs in 4:0.  The 32-bit moves
13791
   (ADDU, OR) have rd in 15:11 and rs in 10:16.  */
13792
#define MOVE32_RD(opcode) (((opcode) >> 11) & 0x1f)
13793
#define MOVE32_RS(opcode) (((opcode) >> 16) & 0x1f)
13794
13795
#define MOVE16_RD_FIELD(r) (((r) & 0x1f) << 5)
13796
#define MOVE16_RS_FIELD(r) (((r) & 0x1f)     )
13797
13798
static const struct opcode_descriptor move_insns_32[] = {
13799
  { /* "move",  "d,s",    */ 0x00000290, 0xffe007ff }, /* or   d,s,$0 */
13800
  { /* "move",  "d,s",    */ 0x00000150, 0xffe007ff }, /* addu d,s,$0 */
13801
  { 0, 0 }  /* End marker for find_match().  */
13802
};
13803
13804
static const struct opcode_descriptor move_insn_16 =
13805
  { /* "move",  "mp,mj",  */ 0x0c00,     0xfc00 };
13806
13807
13808
/* NOP instructions.  */
13809
13810
static const struct opcode_descriptor nop_insn_32 =
13811
  { /* "nop", "",   */ 0x00000000, 0xffffffff };
13812
13813
static const struct opcode_descriptor nop_insn_16 =
13814
  { /* "nop", "",   */ 0x0c00,     0xffff };
13815
13816
13817
/* Instruction match support.  */
13818
13819
0
#define MATCH(opcode, insn) ((opcode & insn.mask) == insn.match)
13820
13821
static int
13822
find_match (unsigned long opcode, const struct opcode_descriptor insn[])
13823
0
{
13824
0
  unsigned long indx;
13825
13826
0
  for (indx = 0; insn[indx].mask != 0; indx++)
13827
0
    if (MATCH (opcode, insn[indx]))
13828
0
      return indx;
13829
13830
0
  return -1;
13831
0
}
13832
13833
13834
/* Branch and delay slot decoding support.  */
13835
13836
/* If PTR points to what *might* be a 16-bit branch or jump, then
13837
   return the minimum length of its delay slot, otherwise return 0.
13838
   Non-zero results are not definitive as we might be checking against
13839
   the second half of another instruction.  */
13840
13841
static int
13842
check_br16_dslot (bfd *abfd, bfd_byte *ptr)
13843
0
{
13844
0
  unsigned long opcode;
13845
0
  int bdsize;
13846
13847
0
  opcode = bfd_get_16 (abfd, ptr);
13848
0
  if (MATCH (opcode, jalr_insn_16_bd32) != 0)
13849
    /* 16-bit branch/jump with a 32-bit delay slot.  */
13850
0
    bdsize = 4;
13851
0
  else if (MATCH (opcode, jalr_insn_16_bd16) != 0
13852
0
     || find_match (opcode, ds_insns_16_bd16) >= 0)
13853
    /* 16-bit branch/jump with a 16-bit delay slot.  */
13854
0
    bdsize = 2;
13855
0
  else
13856
    /* No delay slot.  */
13857
0
    bdsize = 0;
13858
13859
0
  return bdsize;
13860
0
}
13861
13862
/* If PTR points to what *might* be a 32-bit branch or jump, then
13863
   return the minimum length of its delay slot, otherwise return 0.
13864
   Non-zero results are not definitive as we might be checking against
13865
   the second half of another instruction.  */
13866
13867
static int
13868
check_br32_dslot (bfd *abfd, bfd_byte *ptr)
13869
0
{
13870
0
  unsigned long opcode;
13871
0
  int bdsize;
13872
13873
0
  opcode = bfd_get_micromips_32 (abfd, ptr);
13874
0
  if (find_match (opcode, ds_insns_32_bd32) >= 0)
13875
    /* 32-bit branch/jump with a 32-bit delay slot.  */
13876
0
    bdsize = 4;
13877
0
  else if (find_match (opcode, ds_insns_32_bd16) >= 0)
13878
    /* 32-bit branch/jump with a 16-bit delay slot.  */
13879
0
    bdsize = 2;
13880
0
  else
13881
    /* No delay slot.  */
13882
0
    bdsize = 0;
13883
13884
0
  return bdsize;
13885
0
}
13886
13887
/* If PTR points to a 16-bit branch or jump with a 32-bit delay slot
13888
   that doesn't fiddle with REG, then return TRUE, otherwise FALSE.  */
13889
13890
static bool
13891
check_br16 (bfd *abfd, bfd_byte *ptr, unsigned long reg)
13892
0
{
13893
0
  unsigned long opcode;
13894
13895
0
  opcode = bfd_get_16 (abfd, ptr);
13896
0
  if (MATCH (opcode, b_insn_16)
13897
            /* B16  */
13898
0
      || (MATCH (opcode, jr_insn_16) && reg != JR16_REG (opcode))
13899
            /* JR16  */
13900
0
      || (MATCH (opcode, bz_insn_16) && reg != BZ16_REG (opcode))
13901
            /* BEQZ16, BNEZ16  */
13902
0
      || (MATCH (opcode, jalr_insn_16_bd32)
13903
            /* JALR16  */
13904
0
    && reg != JR16_REG (opcode) && reg != RA))
13905
0
    return true;
13906
13907
0
  return false;
13908
0
}
13909
13910
/* If PTR points to a 32-bit branch or jump that doesn't fiddle with REG,
13911
   then return TRUE, otherwise FALSE.  */
13912
13913
static bool
13914
check_br32 (bfd *abfd, bfd_byte *ptr, unsigned long reg)
13915
0
{
13916
0
  unsigned long opcode;
13917
13918
0
  opcode = bfd_get_micromips_32 (abfd, ptr);
13919
0
  if (MATCH (opcode, j_insn_32)
13920
            /* J  */
13921
0
      || MATCH (opcode, bc_insn_32)
13922
            /* BC1F, BC1T, BC2F, BC2T  */
13923
0
      || (MATCH (opcode, jal_x_insn_32_bd32) && reg != RA)
13924
            /* JAL, JALX  */
13925
0
      || (MATCH (opcode, bz_insn_32) && reg != OP32_SREG (opcode))
13926
            /* BGEZ, BGTZ, BLEZ, BLTZ  */
13927
0
      || (MATCH (opcode, bzal_insn_32)
13928
            /* BGEZAL, BLTZAL  */
13929
0
    && reg != OP32_SREG (opcode) && reg != RA)
13930
0
      || ((MATCH (opcode, jalr_insn_32) || MATCH (opcode, beq_insn_32))
13931
            /* JALR, JALR.HB, BEQ, BNE  */
13932
0
    && reg != OP32_SREG (opcode) && reg != OP32_TREG (opcode)))
13933
0
    return true;
13934
13935
0
  return false;
13936
0
}
13937
13938
/* If the instruction encoding at PTR and relocations [INTERNAL_RELOCS,
13939
   IRELEND) at OFFSET indicate that there must be a compact branch there,
13940
   then return TRUE, otherwise FALSE.  */
13941
13942
static bool
13943
check_relocated_bzc (bfd *abfd, const bfd_byte *ptr, bfd_vma offset,
13944
         const Elf_Internal_Rela *internal_relocs,
13945
         const Elf_Internal_Rela *irelend)
13946
0
{
13947
0
  const Elf_Internal_Rela *irel;
13948
0
  unsigned long opcode;
13949
13950
0
  opcode = bfd_get_micromips_32 (abfd, ptr);
13951
0
  if (find_match (opcode, bzc_insns_32) < 0)
13952
0
    return false;
13953
13954
0
  for (irel = internal_relocs; irel < irelend; irel++)
13955
0
    if (irel->r_offset == offset
13956
0
  && ELF32_R_TYPE (irel->r_info) == R_MICROMIPS_PC16_S1)
13957
0
      return true;
13958
13959
0
  return false;
13960
0
}
13961
13962
/* Bitsize checking.  */
13963
#define IS_BITSIZE(val, N)            \
13964
0
  (((((val) & ((1ULL << (N)) - 1)) ^ (1ULL << ((N) - 1)))   \
13965
0
    - (1ULL << ((N) - 1))) == (val))
13966
13967

13968
bool
13969
_bfd_mips_elf_relax_section (bfd *abfd, asection *sec,
13970
           struct bfd_link_info *link_info,
13971
           bool *again)
13972
0
{
13973
0
  bool insn32 = mips_elf_hash_table (link_info)->insn32;
13974
0
  Elf_Internal_Shdr *symtab_hdr;
13975
0
  Elf_Internal_Rela *internal_relocs;
13976
0
  Elf_Internal_Rela *irel, *irelend;
13977
0
  bfd_byte *contents = NULL;
13978
0
  Elf_Internal_Sym *isymbuf = NULL;
13979
13980
  /* Assume nothing changes.  */
13981
0
  *again = false;
13982
13983
  /* We don't have to do anything for a relocatable link, if
13984
     this section does not have relocs, or if this is not a
13985
     code section.  */
13986
13987
0
  if (bfd_link_relocatable (link_info)
13988
0
      || sec->reloc_count == 0
13989
0
      || (sec->flags & SEC_RELOC) == 0
13990
0
      || (sec->flags & SEC_HAS_CONTENTS) == 0
13991
0
      || (sec->flags & SEC_CODE) == 0)
13992
0
    return true;
13993
13994
0
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
13995
13996
  /* Get a copy of the native relocations.  */
13997
0
  internal_relocs = (_bfd_elf_link_read_relocs
13998
0
         (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
13999
0
          link_info->keep_memory));
14000
0
  if (internal_relocs == NULL)
14001
0
    goto error_return;
14002
14003
  /* Walk through them looking for relaxing opportunities.  */
14004
0
  irelend = internal_relocs + sec->reloc_count;
14005
0
  for (irel = internal_relocs; irel < irelend; irel++)
14006
0
    {
14007
0
      unsigned long r_symndx = ELF32_R_SYM (irel->r_info);
14008
0
      unsigned int r_type = ELF32_R_TYPE (irel->r_info);
14009
0
      bool target_is_micromips_code_p;
14010
0
      unsigned long opcode;
14011
0
      bfd_vma symval;
14012
0
      bfd_vma pcrval;
14013
0
      bfd_byte *ptr;
14014
0
      int fndopc;
14015
14016
      /* The number of bytes to delete for relaxation and from where
14017
   to delete these bytes starting at irel->r_offset.  */
14018
0
      int delcnt = 0;
14019
0
      int deloff = 0;
14020
14021
      /* If this isn't something that can be relaxed, then ignore
14022
   this reloc.  */
14023
0
      if (r_type != R_MICROMIPS_HI16
14024
0
    && r_type != R_MICROMIPS_PC16_S1
14025
0
    && r_type != R_MICROMIPS_26_S1)
14026
0
  continue;
14027
14028
      /* Get the section contents if we haven't done so already.  */
14029
0
      if (contents == NULL)
14030
0
  {
14031
    /* Get cached copy if it exists.  */
14032
0
    if (elf_section_data (sec)->this_hdr.contents != NULL)
14033
0
      contents = elf_section_data (sec)->this_hdr.contents;
14034
    /* Go get them off disk.  */
14035
0
    else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
14036
0
      goto error_return;
14037
0
  }
14038
0
      ptr = contents + irel->r_offset;
14039
14040
      /* Read this BFD's local symbols if we haven't done so already.  */
14041
0
      if (isymbuf == NULL && symtab_hdr->sh_info != 0)
14042
0
  {
14043
0
    isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
14044
0
    if (isymbuf == NULL)
14045
0
      isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
14046
0
              symtab_hdr->sh_info, 0,
14047
0
              NULL, NULL, NULL);
14048
0
    if (isymbuf == NULL)
14049
0
      goto error_return;
14050
0
  }
14051
14052
      /* Get the value of the symbol referred to by the reloc.  */
14053
0
      if (r_symndx < symtab_hdr->sh_info)
14054
0
  {
14055
    /* A local symbol.  */
14056
0
    Elf_Internal_Sym *isym;
14057
0
    asection *sym_sec;
14058
14059
0
    isym = isymbuf + r_symndx;
14060
0
    if (isym->st_shndx == SHN_UNDEF)
14061
0
      sym_sec = bfd_und_section_ptr;
14062
0
    else if (isym->st_shndx == SHN_ABS)
14063
0
      sym_sec = bfd_abs_section_ptr;
14064
0
    else if (isym->st_shndx == SHN_COMMON)
14065
0
      sym_sec = bfd_com_section_ptr;
14066
0
    else
14067
0
      sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
14068
0
    symval = (isym->st_value
14069
0
        + sym_sec->output_section->vma
14070
0
        + sym_sec->output_offset);
14071
0
    target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (isym->st_other);
14072
0
  }
14073
0
      else
14074
0
  {
14075
0
    unsigned long indx;
14076
0
    struct elf_link_hash_entry *h;
14077
14078
    /* An external symbol.  */
14079
0
    indx = r_symndx - symtab_hdr->sh_info;
14080
0
    h = elf_sym_hashes (abfd)[indx];
14081
0
    BFD_ASSERT (h != NULL);
14082
14083
0
    if (h->root.type != bfd_link_hash_defined
14084
0
        && h->root.type != bfd_link_hash_defweak)
14085
      /* This appears to be a reference to an undefined
14086
         symbol.  Just ignore it -- it will be caught by the
14087
         regular reloc processing.  */
14088
0
      continue;
14089
14090
0
    symval = (h->root.u.def.value
14091
0
        + h->root.u.def.section->output_section->vma
14092
0
        + h->root.u.def.section->output_offset);
14093
0
    target_is_micromips_code_p = (!h->needs_plt
14094
0
          && ELF_ST_IS_MICROMIPS (h->other));
14095
0
  }
14096
14097
14098
      /* For simplicity of coding, we are going to modify the
14099
   section contents, the section relocs, and the BFD symbol
14100
   table.  We must tell the rest of the code not to free up this
14101
   information.  It would be possible to instead create a table
14102
   of changes which have to be made, as is done in coff-mips.c;
14103
   that would be more work, but would require less memory when
14104
   the linker is run.  */
14105
14106
      /* Only 32-bit instructions relaxed.  */
14107
0
      if (irel->r_offset + 4 > sec->size)
14108
0
  continue;
14109
14110
0
      opcode = bfd_get_micromips_32 (abfd, ptr);
14111
14112
      /* This is the pc-relative distance from the instruction the
14113
   relocation is applied to, to the symbol referred.  */
14114
0
      pcrval = (symval
14115
0
    - (sec->output_section->vma + sec->output_offset)
14116
0
    - irel->r_offset);
14117
14118
      /* R_MICROMIPS_HI16 / LUI relaxation to nil, performing relaxation
14119
   of corresponding R_MICROMIPS_LO16 to R_MICROMIPS_HI0_LO16 or
14120
   R_MICROMIPS_PC23_S2.  The R_MICROMIPS_PC23_S2 condition is
14121
14122
     (symval % 4 == 0 && IS_BITSIZE (pcrval, 25))
14123
14124
   where pcrval has first to be adjusted to apply against the LO16
14125
   location (we make the adjustment later on, when we have figured
14126
   out the offset).  */
14127
0
      if (r_type == R_MICROMIPS_HI16 && MATCH (opcode, lui_insn))
14128
0
  {
14129
0
    bool bzc = false;
14130
0
    unsigned long nextopc;
14131
0
    unsigned long reg;
14132
0
    bfd_vma offset;
14133
14134
    /* Give up if the previous reloc was a HI16 against this symbol
14135
       too.  */
14136
0
    if (irel > internal_relocs
14137
0
        && ELF32_R_TYPE (irel[-1].r_info) == R_MICROMIPS_HI16
14138
0
        && ELF32_R_SYM (irel[-1].r_info) == r_symndx)
14139
0
      continue;
14140
14141
    /* Or if the next reloc is not a LO16 against this symbol.  */
14142
0
    if (irel + 1 >= irelend
14143
0
        || ELF32_R_TYPE (irel[1].r_info) != R_MICROMIPS_LO16
14144
0
        || ELF32_R_SYM (irel[1].r_info) != r_symndx)
14145
0
      continue;
14146
14147
    /* Or if the second next reloc is a LO16 against this symbol too.  */
14148
0
    if (irel + 2 >= irelend
14149
0
        && ELF32_R_TYPE (irel[2].r_info) == R_MICROMIPS_LO16
14150
0
        && ELF32_R_SYM (irel[2].r_info) == r_symndx)
14151
0
      continue;
14152
14153
    /* See if the LUI instruction *might* be in a branch delay slot.
14154
       We check whether what looks like a 16-bit branch or jump is
14155
       actually an immediate argument to a compact branch, and let
14156
       it through if so.  */
14157
0
    if (irel->r_offset >= 2
14158
0
        && check_br16_dslot (abfd, ptr - 2)
14159
0
        && !(irel->r_offset >= 4
14160
0
       && (bzc = check_relocated_bzc (abfd,
14161
0
              ptr - 4, irel->r_offset - 4,
14162
0
              internal_relocs, irelend))))
14163
0
      continue;
14164
0
    if (irel->r_offset >= 4
14165
0
        && !bzc
14166
0
        && check_br32_dslot (abfd, ptr - 4))
14167
0
      continue;
14168
14169
0
    reg = OP32_SREG (opcode);
14170
14171
    /* We only relax adjacent instructions or ones separated with
14172
       a branch or jump that has a delay slot.  The branch or jump
14173
       must not fiddle with the register used to hold the address.
14174
       Subtract 4 for the LUI itself.  */
14175
0
    offset = irel[1].r_offset - irel[0].r_offset;
14176
0
    switch (offset - 4)
14177
0
      {
14178
0
      case 0:
14179
0
        break;
14180
0
      case 2:
14181
0
        if (check_br16 (abfd, ptr + 4, reg))
14182
0
    break;
14183
0
        continue;
14184
0
      case 4:
14185
0
        if (check_br32 (abfd, ptr + 4, reg))
14186
0
    break;
14187
0
        continue;
14188
0
      default:
14189
0
        continue;
14190
0
      }
14191
14192
0
    nextopc = bfd_get_micromips_32 (abfd, contents + irel[1].r_offset);
14193
14194
    /* Give up unless the same register is used with both
14195
       relocations.  */
14196
0
    if (OP32_SREG (nextopc) != reg)
14197
0
      continue;
14198
14199
    /* Now adjust pcrval, subtracting the offset to the LO16 reloc
14200
       and rounding up to take masking of the two LSBs into account.  */
14201
0
    pcrval = ((pcrval - offset + 3) | 3) ^ 3;
14202
14203
    /* R_MICROMIPS_LO16 relaxation to R_MICROMIPS_HI0_LO16.  */
14204
0
    if (IS_BITSIZE (symval, 16))
14205
0
      {
14206
        /* Fix the relocation's type.  */
14207
0
        irel[1].r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_HI0_LO16);
14208
14209
        /* Instructions using R_MICROMIPS_LO16 have the base or
14210
     source register in bits 20:16.  This register becomes $0
14211
     (zero) as the result of the R_MICROMIPS_HI16 being 0.  */
14212
0
        nextopc &= ~0x001f0000;
14213
0
        bfd_put_16 (abfd, (nextopc >> 16) & 0xffff,
14214
0
        contents + irel[1].r_offset);
14215
0
      }
14216
14217
    /* R_MICROMIPS_LO16 / ADDIU relaxation to R_MICROMIPS_PC23_S2.
14218
       We add 4 to take LUI deletion into account while checking
14219
       the PC-relative distance.  */
14220
0
    else if (symval % 4 == 0
14221
0
       && IS_BITSIZE (pcrval + 4, 25)
14222
0
       && MATCH (nextopc, addiu_insn)
14223
0
       && OP32_TREG (nextopc) == OP32_SREG (nextopc)
14224
0
       && OP16_VALID_REG (OP32_TREG (nextopc)))
14225
0
      {
14226
        /* Fix the relocation's type.  */
14227
0
        irel[1].r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC23_S2);
14228
14229
        /* Replace ADDIU with the ADDIUPC version.  */
14230
0
        nextopc = (addiupc_insn.match
14231
0
       | ADDIUPC_REG_FIELD (OP32_TREG (nextopc)));
14232
14233
0
        bfd_put_micromips_32 (abfd, nextopc,
14234
0
            contents + irel[1].r_offset);
14235
0
      }
14236
14237
    /* Can't do anything, give up, sigh...  */
14238
0
    else
14239
0
      continue;
14240
14241
    /* Fix the relocation's type.  */
14242
0
    irel->r_info = ELF32_R_INFO (r_symndx, R_MIPS_NONE);
14243
14244
    /* Delete the LUI instruction: 4 bytes at irel->r_offset.  */
14245
0
    delcnt = 4;
14246
0
    deloff = 0;
14247
0
  }
14248
14249
      /* Compact branch relaxation -- due to the multitude of macros
14250
   employed by the compiler/assembler, compact branches are not
14251
   always generated.  Obviously, this can/will be fixed elsewhere,
14252
   but there is no drawback in double checking it here.  */
14253
0
      else if (r_type == R_MICROMIPS_PC16_S1
14254
0
         && irel->r_offset + 5 < sec->size
14255
0
         && ((fndopc = find_match (opcode, bz_rs_insns_32)) >= 0
14256
0
       || (fndopc = find_match (opcode, bz_rt_insns_32)) >= 0)
14257
0
         && ((!insn32
14258
0
        && (delcnt = MATCH (bfd_get_16 (abfd, ptr + 4),
14259
0
          nop_insn_16) ? 2 : 0))
14260
0
       || (irel->r_offset + 7 < sec->size
14261
0
           && (delcnt = MATCH (bfd_get_micromips_32 (abfd,
14262
0
                 ptr + 4),
14263
0
             nop_insn_32) ? 4 : 0))))
14264
0
  {
14265
0
    unsigned long reg;
14266
14267
0
    reg = OP32_SREG (opcode) ? OP32_SREG (opcode) : OP32_TREG (opcode);
14268
14269
    /* Replace BEQZ/BNEZ with the compact version.  */
14270
0
    opcode = (bzc_insns_32[fndopc].match
14271
0
        | BZC32_REG_FIELD (reg)
14272
0
        | (opcode & 0xffff));   /* Addend value.  */
14273
14274
0
    bfd_put_micromips_32 (abfd, opcode, ptr);
14275
14276
    /* Delete the delay slot NOP: two or four bytes from
14277
       irel->offset + 4; delcnt has already been set above.  */
14278
0
    deloff = 4;
14279
0
  }
14280
14281
      /* R_MICROMIPS_PC16_S1 relaxation to R_MICROMIPS_PC10_S1.  We need
14282
   to check the distance from the next instruction, so subtract 2.  */
14283
0
      else if (!insn32
14284
0
         && r_type == R_MICROMIPS_PC16_S1
14285
0
         && IS_BITSIZE (pcrval - 2, 11)
14286
0
         && find_match (opcode, b_insns_32) >= 0)
14287
0
  {
14288
    /* Fix the relocation's type.  */
14289
0
    irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC10_S1);
14290
14291
    /* Replace the 32-bit opcode with a 16-bit opcode.  */
14292
0
    bfd_put_16 (abfd,
14293
0
          (b_insn_16.match
14294
0
           | (opcode & 0x3ff)),   /* Addend value.  */
14295
0
          ptr);
14296
14297
    /* Delete 2 bytes from irel->r_offset + 2.  */
14298
0
    delcnt = 2;
14299
0
    deloff = 2;
14300
0
  }
14301
14302
      /* R_MICROMIPS_PC16_S1 relaxation to R_MICROMIPS_PC7_S1.  We need
14303
   to check the distance from the next instruction, so subtract 2.  */
14304
0
      else if (!insn32
14305
0
         && r_type == R_MICROMIPS_PC16_S1
14306
0
         && IS_BITSIZE (pcrval - 2, 8)
14307
0
         && (((fndopc = find_match (opcode, bz_rs_insns_32)) >= 0
14308
0
        && OP16_VALID_REG (OP32_SREG (opcode)))
14309
0
       || ((fndopc = find_match (opcode, bz_rt_insns_32)) >= 0
14310
0
           && OP16_VALID_REG (OP32_TREG (opcode)))))
14311
0
  {
14312
0
    unsigned long reg;
14313
14314
0
    reg = OP32_SREG (opcode) ? OP32_SREG (opcode) : OP32_TREG (opcode);
14315
14316
    /* Fix the relocation's type.  */
14317
0
    irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC7_S1);
14318
14319
    /* Replace the 32-bit opcode with a 16-bit opcode.  */
14320
0
    bfd_put_16 (abfd,
14321
0
          (bz_insns_16[fndopc].match
14322
0
           | BZ16_REG_FIELD (reg)
14323
0
           | (opcode & 0x7f)),    /* Addend value.  */
14324
0
          ptr);
14325
14326
    /* Delete 2 bytes from irel->r_offset + 2.  */
14327
0
    delcnt = 2;
14328
0
    deloff = 2;
14329
0
  }
14330
14331
      /* R_MICROMIPS_26_S1 -- JAL to JALS relaxation for microMIPS targets.  */
14332
0
      else if (!insn32
14333
0
         && r_type == R_MICROMIPS_26_S1
14334
0
         && target_is_micromips_code_p
14335
0
         && irel->r_offset + 7 < sec->size
14336
0
         && MATCH (opcode, jal_insn_32_bd32))
14337
0
  {
14338
0
    unsigned long n32opc;
14339
0
    bool relaxed = false;
14340
14341
0
    n32opc = bfd_get_micromips_32 (abfd, ptr + 4);
14342
14343
0
    if (MATCH (n32opc, nop_insn_32))
14344
0
      {
14345
        /* Replace delay slot 32-bit NOP with a 16-bit NOP.  */
14346
0
        bfd_put_16 (abfd, nop_insn_16.match, ptr + 4);
14347
14348
0
        relaxed = true;
14349
0
      }
14350
0
    else if (find_match (n32opc, move_insns_32) >= 0)
14351
0
      {
14352
        /* Replace delay slot 32-bit MOVE with 16-bit MOVE.  */
14353
0
        bfd_put_16 (abfd,
14354
0
        (move_insn_16.match
14355
0
         | MOVE16_RD_FIELD (MOVE32_RD (n32opc))
14356
0
         | MOVE16_RS_FIELD (MOVE32_RS (n32opc))),
14357
0
        ptr + 4);
14358
14359
0
        relaxed = true;
14360
0
      }
14361
    /* Other 32-bit instructions relaxable to 16-bit
14362
       instructions will be handled here later.  */
14363
14364
0
    if (relaxed)
14365
0
      {
14366
        /* JAL with 32-bit delay slot that is changed to a JALS
14367
     with 16-bit delay slot.  */
14368
0
        bfd_put_micromips_32 (abfd, jal_insn_32_bd16.match, ptr);
14369
14370
        /* Delete 2 bytes from irel->r_offset + 6.  */
14371
0
        delcnt = 2;
14372
0
        deloff = 6;
14373
0
      }
14374
0
  }
14375
14376
0
      if (delcnt != 0)
14377
0
  {
14378
    /* Note that we've changed the relocs, section contents, etc.  */
14379
0
    elf_section_data (sec)->relocs = internal_relocs;
14380
0
    elf_section_data (sec)->this_hdr.contents = contents;
14381
0
    symtab_hdr->contents = (unsigned char *) isymbuf;
14382
14383
    /* Delete bytes depending on the delcnt and deloff.  */
14384
0
    if (!mips_elf_relax_delete_bytes (abfd, sec,
14385
0
              irel->r_offset + deloff, delcnt))
14386
0
      goto error_return;
14387
14388
    /* That will change things, so we should relax again.
14389
       Note that this is not required, and it may be slow.  */
14390
0
    *again = true;
14391
0
  }
14392
0
    }
14393
14394
0
  if (isymbuf != NULL
14395
0
      && symtab_hdr->contents != (unsigned char *) isymbuf)
14396
0
    {
14397
0
      if (! link_info->keep_memory)
14398
0
  free (isymbuf);
14399
0
      else
14400
0
  {
14401
    /* Cache the symbols for elf_link_input_bfd.  */
14402
0
    symtab_hdr->contents = (unsigned char *) isymbuf;
14403
0
  }
14404
0
    }
14405
14406
0
  if (contents != NULL
14407
0
      && elf_section_data (sec)->this_hdr.contents != contents)
14408
0
    {
14409
0
      if (! link_info->keep_memory)
14410
0
  free (contents);
14411
0
      else
14412
0
  {
14413
    /* Cache the section contents for elf_link_input_bfd.  */
14414
0
    elf_section_data (sec)->this_hdr.contents = contents;
14415
0
  }
14416
0
    }
14417
14418
0
  if (elf_section_data (sec)->relocs != internal_relocs)
14419
0
    free (internal_relocs);
14420
14421
0
  return true;
14422
14423
0
 error_return:
14424
0
  if (symtab_hdr->contents != (unsigned char *) isymbuf)
14425
0
    free (isymbuf);
14426
0
  if (elf_section_data (sec)->this_hdr.contents != contents)
14427
0
    free (contents);
14428
0
  if (elf_section_data (sec)->relocs != internal_relocs)
14429
0
    free (internal_relocs);
14430
14431
0
  return false;
14432
0
}
14433

14434
/* Create a MIPS ELF linker hash table.  */
14435
14436
struct bfd_link_hash_table *
14437
_bfd_mips_elf_link_hash_table_create (bfd *abfd)
14438
0
{
14439
0
  struct mips_elf_link_hash_table *ret;
14440
0
  size_t amt = sizeof (struct mips_elf_link_hash_table);
14441
14442
0
  ret = bfd_zmalloc (amt);
14443
0
  if (ret == NULL)
14444
0
    return NULL;
14445
14446
0
  if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
14447
0
              mips_elf_link_hash_newfunc,
14448
0
              sizeof (struct mips_elf_link_hash_entry)))
14449
0
    {
14450
0
      free (ret);
14451
0
      return NULL;
14452
0
    }
14453
0
  ret->root.init_plt_refcount.plist = NULL;
14454
0
  ret->root.init_plt_offset.plist = NULL;
14455
14456
0
  return &ret->root.root;
14457
0
}
14458
14459
/* Likewise, but indicate that the target is VxWorks.  */
14460
14461
struct bfd_link_hash_table *
14462
_bfd_mips_vxworks_link_hash_table_create (bfd *abfd)
14463
0
{
14464
0
  struct bfd_link_hash_table *ret;
14465
14466
0
  ret = _bfd_mips_elf_link_hash_table_create (abfd);
14467
0
  if (ret)
14468
0
    {
14469
0
      struct mips_elf_link_hash_table *htab;
14470
14471
0
      htab = (struct mips_elf_link_hash_table *) ret;
14472
0
      htab->use_plts_and_copy_relocs = true;
14473
0
    }
14474
0
  return ret;
14475
0
}
14476
14477
/* A function that the linker calls if we are allowed to use PLTs
14478
   and copy relocs.  */
14479
14480
void
14481
_bfd_mips_elf_use_plts_and_copy_relocs (struct bfd_link_info *info)
14482
0
{
14483
0
  mips_elf_hash_table (info)->use_plts_and_copy_relocs = true;
14484
0
}
14485
14486
/* A function that the linker calls to select between all or only
14487
   32-bit microMIPS instructions, and between making or ignoring
14488
   branch relocation checks for invalid transitions between ISA modes.
14489
   Also record whether we have been configured for a GNU target.  */
14490
14491
void
14492
_bfd_mips_elf_linker_flags (struct bfd_link_info *info, bool insn32,
14493
          bool ignore_branch_isa,
14494
          bool gnu_target)
14495
0
{
14496
0
  mips_elf_hash_table (info)->insn32 = insn32;
14497
0
  mips_elf_hash_table (info)->ignore_branch_isa = ignore_branch_isa;
14498
0
  mips_elf_hash_table (info)->gnu_target = gnu_target;
14499
0
}
14500
14501
/* A function that the linker calls to enable use of compact branches in
14502
   linker generated code for MIPSR6.  */
14503
14504
void
14505
_bfd_mips_elf_compact_branches (struct bfd_link_info *info, bool on)
14506
0
{
14507
0
  mips_elf_hash_table (info)->compact_branches = on;
14508
0
}
14509
14510

14511
/* Structure for saying that BFD machine EXTENSION extends BASE.  */
14512
14513
struct mips_mach_extension
14514
{
14515
  unsigned long extension, base;
14516
};
14517
14518
/* An array that maps 64-bit architectures to the corresponding 32-bit
14519
   architectures.  */
14520
static const struct mips_mach_extension mips_mach_32_64[] =
14521
{
14522
  { bfd_mach_mipsisa64r6, bfd_mach_mipsisa32r6 },
14523
  { bfd_mach_mipsisa64r5, bfd_mach_mipsisa32r5 },
14524
  { bfd_mach_mipsisa64r3, bfd_mach_mipsisa32r3 },
14525
  { bfd_mach_mipsisa64r2, bfd_mach_mipsisa32r2 },
14526
  { bfd_mach_mipsisa64,   bfd_mach_mipsisa32 }
14527
};
14528
14529
/* An array describing how BFD machines relate to one another.  The entries
14530
   are ordered topologically with MIPS I extensions listed last.  */
14531
14532
static const struct mips_mach_extension mips_mach_extensions[] =
14533
{
14534
  /* MIPS64r2 extensions.  */
14535
  { bfd_mach_mips_octeon3, bfd_mach_mips_octeon2 },
14536
  { bfd_mach_mips_octeon2, bfd_mach_mips_octeonp },
14537
  { bfd_mach_mips_octeonp, bfd_mach_mips_octeon },
14538
  { bfd_mach_mips_octeon, bfd_mach_mipsisa64r2 },
14539
  { bfd_mach_mips_gs264e, bfd_mach_mips_gs464e },
14540
  { bfd_mach_mips_gs464e, bfd_mach_mips_gs464 },
14541
  { bfd_mach_mips_gs464, bfd_mach_mipsisa64r2 },
14542
14543
  /* MIPS64 extensions.  */
14544
  { bfd_mach_mipsisa64r2, bfd_mach_mipsisa64 },
14545
  { bfd_mach_mips_sb1, bfd_mach_mipsisa64 },
14546
  { bfd_mach_mips_xlr, bfd_mach_mipsisa64 },
14547
14548
  /* MIPS V extensions.  */
14549
  { bfd_mach_mipsisa64, bfd_mach_mips5 },
14550
14551
  /* R10000 extensions.  */
14552
  { bfd_mach_mips12000, bfd_mach_mips10000 },
14553
  { bfd_mach_mips14000, bfd_mach_mips10000 },
14554
  { bfd_mach_mips16000, bfd_mach_mips10000 },
14555
14556
  /* R5000 extensions.  Note: the vr5500 ISA is an extension of the core
14557
     vr5400 ISA, but doesn't include the multimedia stuff.  It seems
14558
     better to allow vr5400 and vr5500 code to be merged anyway, since
14559
     many libraries will just use the core ISA.  Perhaps we could add
14560
     some sort of ASE flag if this ever proves a problem.  */
14561
  { bfd_mach_mips5500, bfd_mach_mips5400 },
14562
  { bfd_mach_mips5400, bfd_mach_mips5000 },
14563
14564
  /* MIPS IV extensions.  */
14565
  { bfd_mach_mips5, bfd_mach_mips8000 },
14566
  { bfd_mach_mips10000, bfd_mach_mips8000 },
14567
  { bfd_mach_mips5000, bfd_mach_mips8000 },
14568
  { bfd_mach_mips7000, bfd_mach_mips8000 },
14569
  { bfd_mach_mips9000, bfd_mach_mips8000 },
14570
14571
  /* VR4100 extensions.  */
14572
  { bfd_mach_mips4120, bfd_mach_mips4100 },
14573
  { bfd_mach_mips4111, bfd_mach_mips4100 },
14574
14575
  /* MIPS III extensions.  */
14576
  { bfd_mach_mips_loongson_2e, bfd_mach_mips4000 },
14577
  { bfd_mach_mips_loongson_2f, bfd_mach_mips4000 },
14578
  { bfd_mach_mips8000, bfd_mach_mips4000 },
14579
  { bfd_mach_mips4650, bfd_mach_mips4000 },
14580
  { bfd_mach_mips4600, bfd_mach_mips4000 },
14581
  { bfd_mach_mips4400, bfd_mach_mips4000 },
14582
  { bfd_mach_mips4300, bfd_mach_mips4000 },
14583
  { bfd_mach_mips4100, bfd_mach_mips4000 },
14584
  { bfd_mach_mips5900, bfd_mach_mips4000 },
14585
14586
  /* MIPS32r3 extensions.  */
14587
  { bfd_mach_mips_interaptiv_mr2, bfd_mach_mipsisa32r3 },
14588
14589
  /* MIPS32r2 extensions.  */
14590
  { bfd_mach_mipsisa32r3, bfd_mach_mipsisa32r2 },
14591
14592
  /* MIPS32 extensions.  */
14593
  { bfd_mach_mipsisa32r2, bfd_mach_mipsisa32 },
14594
14595
  /* MIPS II extensions.  */
14596
  { bfd_mach_mips4000, bfd_mach_mips6000 },
14597
  { bfd_mach_mipsisa32, bfd_mach_mips6000 },
14598
  { bfd_mach_mips4010, bfd_mach_mips6000 },
14599
  { bfd_mach_mips_allegrex, bfd_mach_mips6000 },
14600
14601
  /* MIPS I extensions.  */
14602
  { bfd_mach_mips6000, bfd_mach_mips3000 },
14603
  { bfd_mach_mips3900, bfd_mach_mips3000 }
14604
};
14605
14606
/* Return true if bfd machine EXTENSION is the same as BASE, or if
14607
   EXTENSION is the 64-bit equivalent of a 32-bit BASE.  */
14608
14609
static bool
14610
mips_mach_extends_32_64 (unsigned long base, unsigned long extension)
14611
0
{
14612
0
  size_t i;
14613
14614
0
  if (extension == base)
14615
0
    return true;
14616
14617
0
  for (i = 0; i < ARRAY_SIZE (mips_mach_32_64); i++)
14618
0
    if (extension == mips_mach_32_64[i].extension)
14619
0
      return base == mips_mach_32_64[i].base;
14620
14621
0
  return false;
14622
0
}
14623
14624
static bool
14625
mips_mach_extends_p (unsigned long base, unsigned long extension)
14626
0
{
14627
0
  size_t i;
14628
14629
0
  if (mips_mach_extends_32_64 (base, extension))
14630
0
    return true;
14631
14632
0
  for (i = 0; i < ARRAY_SIZE (mips_mach_extensions); i++)
14633
0
    if (extension == mips_mach_extensions[i].extension)
14634
0
      {
14635
0
  extension = mips_mach_extensions[i].base;
14636
0
  if (mips_mach_extends_32_64 (base, extension))
14637
0
    return true;
14638
0
      }
14639
14640
0
  return false;
14641
0
}
14642
14643
/* Return the BFD mach for each .MIPS.abiflags ISA Extension.  */
14644
14645
static unsigned long
14646
bfd_mips_isa_ext_mach (unsigned int isa_ext)
14647
0
{
14648
0
  switch (isa_ext)
14649
0
    {
14650
0
    case AFL_EXT_3900:       return bfd_mach_mips3900;
14651
0
    case AFL_EXT_4010:       return bfd_mach_mips4010;
14652
0
    case AFL_EXT_4100:       return bfd_mach_mips4100;
14653
0
    case AFL_EXT_4111:       return bfd_mach_mips4111;
14654
0
    case AFL_EXT_4120:       return bfd_mach_mips4120;
14655
0
    case AFL_EXT_4650:       return bfd_mach_mips4650;
14656
0
    case AFL_EXT_5400:       return bfd_mach_mips5400;
14657
0
    case AFL_EXT_5500:       return bfd_mach_mips5500;
14658
0
    case AFL_EXT_5900:       return bfd_mach_mips5900;
14659
0
    case AFL_EXT_10000:       return bfd_mach_mips10000;
14660
0
    case AFL_EXT_LOONGSON_2E: return bfd_mach_mips_loongson_2e;
14661
0
    case AFL_EXT_LOONGSON_2F: return bfd_mach_mips_loongson_2f;
14662
0
    case AFL_EXT_SB1:       return bfd_mach_mips_sb1;
14663
0
    case AFL_EXT_OCTEON:      return bfd_mach_mips_octeon;
14664
0
    case AFL_EXT_OCTEONP:     return bfd_mach_mips_octeonp;
14665
0
    case AFL_EXT_OCTEON2:     return bfd_mach_mips_octeon2;
14666
0
    case AFL_EXT_XLR:       return bfd_mach_mips_xlr;
14667
0
    default:          return bfd_mach_mips3000;
14668
0
    }
14669
0
}
14670
14671
/* Return the .MIPS.abiflags value representing each ISA Extension.  */
14672
14673
unsigned int
14674
bfd_mips_isa_ext (bfd *abfd)
14675
0
{
14676
0
  switch (bfd_get_mach (abfd))
14677
0
    {
14678
0
    case bfd_mach_mips3900:     return AFL_EXT_3900;
14679
0
    case bfd_mach_mips4010:     return AFL_EXT_4010;
14680
0
    case bfd_mach_mips4100:     return AFL_EXT_4100;
14681
0
    case bfd_mach_mips4111:     return AFL_EXT_4111;
14682
0
    case bfd_mach_mips4120:     return AFL_EXT_4120;
14683
0
    case bfd_mach_mips4650:     return AFL_EXT_4650;
14684
0
    case bfd_mach_mips5400:     return AFL_EXT_5400;
14685
0
    case bfd_mach_mips5500:     return AFL_EXT_5500;
14686
0
    case bfd_mach_mips5900:     return AFL_EXT_5900;
14687
0
    case bfd_mach_mips10000:     return AFL_EXT_10000;
14688
0
    case bfd_mach_mips_loongson_2e: return AFL_EXT_LOONGSON_2E;
14689
0
    case bfd_mach_mips_loongson_2f: return AFL_EXT_LOONGSON_2F;
14690
0
    case bfd_mach_mips_sb1:     return AFL_EXT_SB1;
14691
0
    case bfd_mach_mips_octeon:     return AFL_EXT_OCTEON;
14692
0
    case bfd_mach_mips_octeonp:     return AFL_EXT_OCTEONP;
14693
0
    case bfd_mach_mips_octeon3:     return AFL_EXT_OCTEON3;
14694
0
    case bfd_mach_mips_octeon2:     return AFL_EXT_OCTEON2;
14695
0
    case bfd_mach_mips_xlr:     return AFL_EXT_XLR;
14696
0
    case bfd_mach_mips_interaptiv_mr2:
14697
0
      return AFL_EXT_INTERAPTIV_MR2;
14698
0
    default:          return 0;
14699
0
    }
14700
0
}
14701
14702
/* Encode ISA level and revision as a single value.  */
14703
0
#define LEVEL_REV(LEV,REV) ((LEV) << 3 | (REV))
14704
14705
/* Decode a single value into level and revision.  */
14706
0
#define ISA_LEVEL(LEVREV)  ((LEVREV) >> 3)
14707
0
#define ISA_REV(LEVREV)    ((LEVREV) & 0x7)
14708
14709
/* Update the isa_level, isa_rev, isa_ext fields of abiflags.  */
14710
14711
static void
14712
update_mips_abiflags_isa (bfd *abfd, Elf_Internal_ABIFlags_v0 *abiflags)
14713
0
{
14714
0
  int new_isa = 0;
14715
0
  switch (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH)
14716
0
    {
14717
0
    case EF_MIPS_ARCH_1:    new_isa = LEVEL_REV (1, 0); break;
14718
0
    case EF_MIPS_ARCH_2:    new_isa = LEVEL_REV (2, 0); break;
14719
0
    case EF_MIPS_ARCH_3:    new_isa = LEVEL_REV (3, 0); break;
14720
0
    case EF_MIPS_ARCH_4:    new_isa = LEVEL_REV (4, 0); break;
14721
0
    case EF_MIPS_ARCH_5:    new_isa = LEVEL_REV (5, 0); break;
14722
0
    case EF_MIPS_ARCH_32:   new_isa = LEVEL_REV (32, 1); break;
14723
0
    case EF_MIPS_ARCH_32R2: new_isa = LEVEL_REV (32, 2); break;
14724
0
    case EF_MIPS_ARCH_32R6: new_isa = LEVEL_REV (32, 6); break;
14725
0
    case EF_MIPS_ARCH_64:   new_isa = LEVEL_REV (64, 1); break;
14726
0
    case EF_MIPS_ARCH_64R2: new_isa = LEVEL_REV (64, 2); break;
14727
0
    case EF_MIPS_ARCH_64R6: new_isa = LEVEL_REV (64, 6); break;
14728
0
    default:
14729
0
      _bfd_error_handler
14730
  /* xgettext:c-format */
14731
0
  (_("%pB: unknown architecture %s"),
14732
0
   abfd, bfd_printable_name (abfd));
14733
0
    }
14734
14735
0
  if (new_isa > LEVEL_REV (abiflags->isa_level, abiflags->isa_rev))
14736
0
    {
14737
0
      abiflags->isa_level = ISA_LEVEL (new_isa);
14738
0
      abiflags->isa_rev = ISA_REV (new_isa);
14739
0
    }
14740
14741
  /* Update the isa_ext if ABFD describes a further extension.  */
14742
0
  if (mips_mach_extends_p (bfd_mips_isa_ext_mach (abiflags->isa_ext),
14743
0
         bfd_get_mach (abfd)))
14744
0
    abiflags->isa_ext = bfd_mips_isa_ext (abfd);
14745
0
}
14746
14747
/* Return true if the given ELF header flags describe a 32-bit binary.  */
14748
14749
static bool
14750
mips_32bit_flags_p (flagword flags)
14751
0
{
14752
0
  return ((flags & EF_MIPS_32BITMODE) != 0
14753
0
    || (flags & EF_MIPS_ABI) == EF_MIPS_ABI_O32
14754
0
    || (flags & EF_MIPS_ABI) == EF_MIPS_ABI_EABI32
14755
0
    || (flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_1
14756
0
    || (flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_2
14757
0
    || (flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32
14758
0
    || (flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32R2
14759
0
    || (flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32R6);
14760
0
}
14761
14762
/* Infer the content of the ABI flags based on the elf header.  */
14763
14764
static void
14765
infer_mips_abiflags (bfd *abfd, Elf_Internal_ABIFlags_v0* abiflags)
14766
0
{
14767
0
  obj_attribute *in_attr;
14768
14769
0
  memset (abiflags, 0, sizeof (Elf_Internal_ABIFlags_v0));
14770
0
  update_mips_abiflags_isa (abfd, abiflags);
14771
14772
0
  if (mips_32bit_flags_p (elf_elfheader (abfd)->e_flags))
14773
0
    abiflags->gpr_size = AFL_REG_32;
14774
0
  else
14775
0
    abiflags->gpr_size = AFL_REG_64;
14776
14777
0
  abiflags->cpr1_size = AFL_REG_NONE;
14778
14779
0
  in_attr = elf_known_obj_attributes (abfd)[OBJ_ATTR_GNU];
14780
0
  abiflags->fp_abi = in_attr[Tag_GNU_MIPS_ABI_FP].i;
14781
14782
0
  if (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_SINGLE
14783
0
      || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_XX
14784
0
      || (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_DOUBLE
14785
0
    && abiflags->gpr_size == AFL_REG_32))
14786
0
    abiflags->cpr1_size = AFL_REG_32;
14787
0
  else if (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_DOUBLE
14788
0
     || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_64
14789
0
     || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_64A)
14790
0
    abiflags->cpr1_size = AFL_REG_64;
14791
14792
0
  abiflags->cpr2_size = AFL_REG_NONE;
14793
14794
0
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
14795
0
    abiflags->ases |= AFL_ASE_MDMX;
14796
0
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
14797
0
    abiflags->ases |= AFL_ASE_MIPS16;
14798
0
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
14799
0
    abiflags->ases |= AFL_ASE_MICROMIPS;
14800
14801
0
  if (abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_ANY
14802
0
      && abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_SOFT
14803
0
      && abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_64A
14804
0
      && abiflags->isa_level >= 32
14805
0
      && abiflags->ases != AFL_ASE_LOONGSON_EXT)
14806
0
    abiflags->flags1 |= AFL_FLAGS1_ODDSPREG;
14807
0
}
14808
14809
/* We need to use a special link routine to handle the .reginfo and
14810
   the .mdebug sections.  We need to merge all instances of these
14811
   sections together, not write them all out sequentially.  */
14812
14813
bool
14814
_bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
14815
0
{
14816
0
  asection *o;
14817
0
  struct bfd_link_order *p;
14818
0
  asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
14819
0
  asection *rtproc_sec, *abiflags_sec;
14820
0
  Elf32_RegInfo reginfo;
14821
0
  struct ecoff_debug_info debug;
14822
0
  struct mips_htab_traverse_info hti;
14823
0
  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
14824
0
  const struct ecoff_debug_swap *swap = bed->elf_backend_ecoff_debug_swap;
14825
0
  HDRR *symhdr = &debug.symbolic_header;
14826
0
  void *mdebug_handle = NULL;
14827
0
  asection *s;
14828
0
  EXTR esym;
14829
0
  unsigned int i;
14830
0
  bfd_size_type amt;
14831
0
  struct mips_elf_link_hash_table *htab;
14832
14833
0
  static const char * const secname[] =
14834
0
  {
14835
0
    ".text", ".init", ".fini", ".data",
14836
0
    ".rodata", ".sdata", ".sbss", ".bss"
14837
0
  };
14838
0
  static const int sc[] =
14839
0
  {
14840
0
    scText, scInit, scFini, scData,
14841
0
    scRData, scSData, scSBss, scBss
14842
0
  };
14843
14844
0
  htab = mips_elf_hash_table (info);
14845
0
  BFD_ASSERT (htab != NULL);
14846
14847
  /* Sort the dynamic symbols so that those with GOT entries come after
14848
     those without.  */
14849
0
  if (!mips_elf_sort_hash_table (abfd, info))
14850
0
    return false;
14851
14852
  /* Create any scheduled LA25 stubs.  */
14853
0
  hti.info = info;
14854
0
  hti.output_bfd = abfd;
14855
0
  hti.error = false;
14856
0
  htab_traverse (htab->la25_stubs, mips_elf_create_la25_stub, &hti);
14857
0
  if (hti.error)
14858
0
    return false;
14859
14860
  /* Get a value for the GP register.  */
14861
0
  if (elf_gp (abfd) == 0)
14862
0
    {
14863
0
      struct bfd_link_hash_entry *h;
14864
14865
0
      h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
14866
0
      if (h != NULL && h->type == bfd_link_hash_defined)
14867
0
  elf_gp (abfd) = (h->u.def.value
14868
0
       + h->u.def.section->output_section->vma
14869
0
       + h->u.def.section->output_offset);
14870
0
      else if (htab->root.target_os == is_vxworks
14871
0
         && (h = bfd_link_hash_lookup (info->hash,
14872
0
               "_GLOBAL_OFFSET_TABLE_",
14873
0
               false, false, true))
14874
0
         && h->type == bfd_link_hash_defined)
14875
0
  elf_gp (abfd) = (h->u.def.section->output_section->vma
14876
0
       + h->u.def.section->output_offset
14877
0
       + h->u.def.value);
14878
0
      else if (bfd_link_relocatable (info))
14879
0
  {
14880
0
    bfd_vma lo = MINUS_ONE;
14881
14882
    /* Find the GP-relative section with the lowest offset.  */
14883
0
    for (o = abfd->sections; o != NULL; o = o->next)
14884
0
      if (o->vma < lo
14885
0
    && (elf_section_data (o)->this_hdr.sh_flags & SHF_MIPS_GPREL))
14886
0
        lo = o->vma;
14887
14888
    /* And calculate GP relative to that.  */
14889
0
    elf_gp (abfd) = lo + ELF_MIPS_GP_OFFSET (info);
14890
0
  }
14891
0
      else
14892
0
  {
14893
    /* If the relocate_section function needs to do a reloc
14894
       involving the GP value, it should make a reloc_dangerous
14895
       callback to warn that GP is not defined.  */
14896
0
  }
14897
0
    }
14898
14899
  /* Go through the sections and collect the .reginfo and .mdebug
14900
     information.  */
14901
0
  abiflags_sec = NULL;
14902
0
  reginfo_sec = NULL;
14903
0
  mdebug_sec = NULL;
14904
0
  gptab_data_sec = NULL;
14905
0
  gptab_bss_sec = NULL;
14906
0
  for (o = abfd->sections; o != NULL; o = o->next)
14907
0
    {
14908
0
      if (strcmp (o->name, ".MIPS.abiflags") == 0)
14909
0
  {
14910
    /* We have found the .MIPS.abiflags section in the output file.
14911
       Look through all the link_orders comprising it and remove them.
14912
       The data is merged in _bfd_mips_elf_merge_private_bfd_data.  */
14913
0
    for (p = o->map_head.link_order; p != NULL; p = p->next)
14914
0
      {
14915
0
        asection *input_section;
14916
14917
0
        if (p->type != bfd_indirect_link_order)
14918
0
    {
14919
0
      if (p->type == bfd_data_link_order)
14920
0
        continue;
14921
0
      abort ();
14922
0
    }
14923
14924
0
        input_section = p->u.indirect.section;
14925
14926
        /* Hack: reset the SEC_HAS_CONTENTS flag so that
14927
     elf_link_input_bfd ignores this section.  */
14928
0
        input_section->flags &= ~SEC_HAS_CONTENTS;
14929
0
      }
14930
14931
    /* Size has been set in _bfd_mips_elf_late_size_sections.  */
14932
0
    BFD_ASSERT(o->size == sizeof (Elf_External_ABIFlags_v0));
14933
14934
    /* Skip this section later on (I don't think this currently
14935
       matters, but someday it might).  */
14936
0
    o->map_head.link_order = NULL;
14937
14938
0
    abiflags_sec = o;
14939
0
  }
14940
14941
0
      if (strcmp (o->name, ".reginfo") == 0)
14942
0
  {
14943
0
    memset (&reginfo, 0, sizeof reginfo);
14944
14945
    /* We have found the .reginfo section in the output file.
14946
       Look through all the link_orders comprising it and merge
14947
       the information together.  */
14948
0
    for (p = o->map_head.link_order; p != NULL; p = p->next)
14949
0
      {
14950
0
        asection *input_section;
14951
0
        bfd *input_bfd;
14952
0
        Elf32_External_RegInfo ext;
14953
0
        Elf32_RegInfo sub;
14954
0
        bfd_size_type sz;
14955
14956
0
        if (p->type != bfd_indirect_link_order)
14957
0
    {
14958
0
      if (p->type == bfd_data_link_order)
14959
0
        continue;
14960
0
      abort ();
14961
0
    }
14962
14963
0
        input_section = p->u.indirect.section;
14964
0
        input_bfd = input_section->owner;
14965
14966
0
        sz = (input_section->size < sizeof (ext)
14967
0
        ? input_section->size : sizeof (ext));
14968
0
        memset (&ext, 0, sizeof (ext));
14969
0
        if (! bfd_get_section_contents (input_bfd, input_section,
14970
0
                &ext, 0, sz))
14971
0
    return false;
14972
14973
0
        bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub);
14974
14975
0
        reginfo.ri_gprmask |= sub.ri_gprmask;
14976
0
        reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
14977
0
        reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
14978
0
        reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
14979
0
        reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
14980
14981
        /* ri_gp_value is set by the function
14982
     `_bfd_mips_elf_section_processing' when the section is
14983
     finally written out.  */
14984
14985
        /* Hack: reset the SEC_HAS_CONTENTS flag so that
14986
     elf_link_input_bfd ignores this section.  */
14987
0
        input_section->flags &= ~SEC_HAS_CONTENTS;
14988
0
      }
14989
14990
    /* Size has been set in _bfd_mips_elf_late_size_sections.  */
14991
0
    BFD_ASSERT(o->size == sizeof (Elf32_External_RegInfo));
14992
14993
    /* Skip this section later on (I don't think this currently
14994
       matters, but someday it might).  */
14995
0
    o->map_head.link_order = NULL;
14996
14997
0
    reginfo_sec = o;
14998
0
  }
14999
15000
0
      if (strcmp (o->name, ".mdebug") == 0)
15001
0
  {
15002
0
    struct extsym_info einfo;
15003
0
    bfd_vma last;
15004
15005
    /* We have found the .mdebug section in the output file.
15006
       Look through all the link_orders comprising it and merge
15007
       the information together.  */
15008
0
    symhdr->magic = swap->sym_magic;
15009
    /* FIXME: What should the version stamp be?  */
15010
0
    symhdr->vstamp = 0;
15011
0
    symhdr->ilineMax = 0;
15012
0
    symhdr->cbLine = 0;
15013
0
    symhdr->idnMax = 0;
15014
0
    symhdr->ipdMax = 0;
15015
0
    symhdr->isymMax = 0;
15016
0
    symhdr->ioptMax = 0;
15017
0
    symhdr->iauxMax = 0;
15018
0
    symhdr->issMax = 0;
15019
0
    symhdr->issExtMax = 0;
15020
0
    symhdr->ifdMax = 0;
15021
0
    symhdr->crfd = 0;
15022
0
    symhdr->iextMax = 0;
15023
15024
    /* We accumulate the debugging information itself in the
15025
       debug_info structure.  */
15026
0
    debug.alloc_syments = false;
15027
0
    debug.line = NULL;
15028
0
    debug.external_dnr = NULL;
15029
0
    debug.external_pdr = NULL;
15030
0
    debug.external_sym = NULL;
15031
0
    debug.external_opt = NULL;
15032
0
    debug.external_aux = NULL;
15033
0
    debug.ss = NULL;
15034
0
    debug.ssext = debug.ssext_end = NULL;
15035
0
    debug.external_fdr = NULL;
15036
0
    debug.external_rfd = NULL;
15037
0
    debug.external_ext = debug.external_ext_end = NULL;
15038
15039
0
    mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
15040
0
    if (mdebug_handle == NULL)
15041
0
      return false;
15042
15043
0
    esym.jmptbl = 0;
15044
0
    esym.cobol_main = 0;
15045
0
    esym.weakext = 0;
15046
0
    esym.reserved = 0;
15047
0
    esym.ifd = ifdNil;
15048
0
    esym.asym.iss = issNil;
15049
0
    esym.asym.st = stLocal;
15050
0
    esym.asym.reserved = 0;
15051
0
    esym.asym.index = indexNil;
15052
0
    last = 0;
15053
0
    for (i = 0; i < sizeof (secname) / sizeof (secname[0]); i++)
15054
0
      {
15055
0
        esym.asym.sc = sc[i];
15056
0
        s = bfd_get_section_by_name (abfd, secname[i]);
15057
0
        if (s != NULL)
15058
0
    {
15059
0
      esym.asym.value = s->vma;
15060
0
      last = s->vma + s->size;
15061
0
    }
15062
0
        else
15063
0
    esym.asym.value = last;
15064
0
        if (!bfd_ecoff_debug_one_external (abfd, &debug, swap,
15065
0
             secname[i], &esym))
15066
0
    return false;
15067
0
      }
15068
15069
0
    for (p = o->map_head.link_order; p != NULL; p = p->next)
15070
0
      {
15071
0
        asection *input_section;
15072
0
        bfd *input_bfd;
15073
0
        const struct ecoff_debug_swap *input_swap;
15074
0
        struct ecoff_debug_info input_debug;
15075
0
        char *eraw_src;
15076
0
        char *eraw_end;
15077
15078
0
        if (p->type != bfd_indirect_link_order)
15079
0
    {
15080
0
      if (p->type == bfd_data_link_order)
15081
0
        continue;
15082
0
      abort ();
15083
0
    }
15084
15085
0
        input_section = p->u.indirect.section;
15086
0
        input_bfd = input_section->owner;
15087
15088
0
        if (!is_mips_elf (input_bfd))
15089
0
    {
15090
      /* I don't know what a non MIPS ELF bfd would be
15091
         doing with a .mdebug section, but I don't really
15092
         want to deal with it.  */
15093
0
      continue;
15094
0
    }
15095
15096
0
        input_swap = (get_elf_backend_data (input_bfd)
15097
0
          ->elf_backend_ecoff_debug_swap);
15098
15099
0
        BFD_ASSERT (p->size == input_section->size);
15100
15101
        /* The ECOFF linking code expects that we have already
15102
     read in the debugging information and set up an
15103
     ecoff_debug_info structure, so we do that now.  */
15104
0
        if (! _bfd_mips_elf_read_ecoff_info (input_bfd, input_section,
15105
0
               &input_debug))
15106
0
    return false;
15107
15108
0
        if (! (bfd_ecoff_debug_accumulate
15109
0
         (mdebug_handle, abfd, &debug, swap, input_bfd,
15110
0
          &input_debug, input_swap, info)))
15111
0
    {
15112
0
      _bfd_ecoff_free_ecoff_debug_info (&input_debug);
15113
0
      return false;
15114
0
    }
15115
15116
        /* Loop through the external symbols.  For each one with
15117
     interesting information, try to find the symbol in
15118
     the linker global hash table and save the information
15119
     for the output external symbols.  */
15120
0
        eraw_src = input_debug.external_ext;
15121
0
        eraw_end = (eraw_src
15122
0
        + (input_debug.symbolic_header.iextMax
15123
0
           * input_swap->external_ext_size));
15124
0
        for (;
15125
0
       eraw_src < eraw_end;
15126
0
       eraw_src += input_swap->external_ext_size)
15127
0
    {
15128
0
      EXTR ext;
15129
0
      const char *name;
15130
0
      struct mips_elf_link_hash_entry *h;
15131
15132
0
      (*input_swap->swap_ext_in) (input_bfd, eraw_src, &ext);
15133
0
      if (ext.asym.sc == scNil
15134
0
          || ext.asym.sc == scUndefined
15135
0
          || ext.asym.sc == scSUndefined)
15136
0
        continue;
15137
15138
0
      name = input_debug.ssext + ext.asym.iss;
15139
0
      h = mips_elf_link_hash_lookup (mips_elf_hash_table (info),
15140
0
             name, false, false, true);
15141
0
      if (h == NULL || h->esym.ifd != -2)
15142
0
        continue;
15143
15144
0
      if (ext.ifd != -1)
15145
0
        {
15146
0
          BFD_ASSERT (ext.ifd
15147
0
          < input_debug.symbolic_header.ifdMax);
15148
0
          ext.ifd = input_debug.ifdmap[ext.ifd];
15149
0
        }
15150
15151
0
      h->esym = ext;
15152
0
    }
15153
15154
        /* Free up the information we just read.  */
15155
0
        _bfd_ecoff_free_ecoff_debug_info (&input_debug);
15156
15157
        /* Hack: reset the SEC_HAS_CONTENTS flag so that
15158
     elf_link_input_bfd ignores this section.  */
15159
0
        input_section->flags &= ~SEC_HAS_CONTENTS;
15160
0
      }
15161
15162
0
    if (SGI_COMPAT (abfd) && bfd_link_pic (info))
15163
0
      {
15164
        /* Create .rtproc section.  */
15165
0
        rtproc_sec = bfd_get_linker_section (abfd, ".rtproc");
15166
0
        if (rtproc_sec == NULL)
15167
0
    {
15168
0
      flagword flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
15169
0
            | SEC_LINKER_CREATED | SEC_READONLY);
15170
15171
0
      rtproc_sec = bfd_make_section_anyway_with_flags (abfd,
15172
0
                   ".rtproc",
15173
0
                   flags);
15174
0
      if (rtproc_sec == NULL
15175
0
          || !bfd_set_section_alignment (rtproc_sec, 4))
15176
0
        return false;
15177
0
    }
15178
15179
0
        if (! mips_elf_create_procedure_table (mdebug_handle, abfd,
15180
0
                 info, rtproc_sec,
15181
0
                 &debug))
15182
0
    return false;
15183
0
      }
15184
15185
    /* Build the external symbol information.  */
15186
0
    einfo.abfd = abfd;
15187
0
    einfo.info = info;
15188
0
    einfo.debug = &debug;
15189
0
    einfo.swap = swap;
15190
0
    einfo.failed = false;
15191
0
    mips_elf_link_hash_traverse (mips_elf_hash_table (info),
15192
0
               mips_elf_output_extsym, &einfo);
15193
0
    if (einfo.failed)
15194
0
      return false;
15195
15196
    /* Set the size of the .mdebug section.  */
15197
0
    o->size = bfd_ecoff_debug_size (abfd, &debug, swap);
15198
15199
    /* Skip this section later on (I don't think this currently
15200
       matters, but someday it might).  */
15201
0
    o->map_head.link_order = NULL;
15202
15203
0
    mdebug_sec = o;
15204
0
  }
15205
15206
0
      if (startswith (o->name, ".gptab."))
15207
0
  {
15208
0
    const char *subname;
15209
0
    unsigned int c;
15210
0
    Elf32_gptab *tab;
15211
0
    Elf32_External_gptab *ext_tab;
15212
0
    unsigned int j;
15213
15214
    /* The .gptab.sdata and .gptab.sbss sections hold
15215
       information describing how the small data area would
15216
       change depending upon the -G switch.  These sections
15217
       not used in executables files.  */
15218
0
    if (! bfd_link_relocatable (info))
15219
0
      {
15220
0
        for (p = o->map_head.link_order; p != NULL; p = p->next)
15221
0
    {
15222
0
      asection *input_section;
15223
15224
0
      if (p->type != bfd_indirect_link_order)
15225
0
        {
15226
0
          if (p->type == bfd_data_link_order)
15227
0
      continue;
15228
0
          abort ();
15229
0
        }
15230
15231
0
      input_section = p->u.indirect.section;
15232
15233
      /* Hack: reset the SEC_HAS_CONTENTS flag so that
15234
         elf_link_input_bfd ignores this section.  */
15235
0
      input_section->flags &= ~SEC_HAS_CONTENTS;
15236
0
    }
15237
15238
        /* Skip this section later on (I don't think this
15239
     currently matters, but someday it might).  */
15240
0
        o->map_head.link_order = NULL;
15241
15242
        /* Really remove the section.  */
15243
0
        bfd_section_list_remove (abfd, o);
15244
0
        --abfd->section_count;
15245
15246
0
        continue;
15247
0
      }
15248
15249
    /* There is one gptab for initialized data, and one for
15250
       uninitialized data.  */
15251
0
    if (strcmp (o->name, ".gptab.sdata") == 0)
15252
0
      gptab_data_sec = o;
15253
0
    else if (strcmp (o->name, ".gptab.sbss") == 0)
15254
0
      gptab_bss_sec = o;
15255
0
    else
15256
0
      {
15257
0
        _bfd_error_handler
15258
    /* xgettext:c-format */
15259
0
    (_("%pB: illegal section name `%pA'"), abfd, o);
15260
0
        bfd_set_error (bfd_error_nonrepresentable_section);
15261
0
        return false;
15262
0
      }
15263
15264
    /* The linker script always combines .gptab.data and
15265
       .gptab.sdata into .gptab.sdata, and likewise for
15266
       .gptab.bss and .gptab.sbss.  It is possible that there is
15267
       no .sdata or .sbss section in the output file, in which
15268
       case we must change the name of the output section.  */
15269
0
    subname = o->name + sizeof ".gptab" - 1;
15270
0
    if (bfd_get_section_by_name (abfd, subname) == NULL)
15271
0
      {
15272
0
        if (o == gptab_data_sec)
15273
0
    o->name = ".gptab.data";
15274
0
        else
15275
0
    o->name = ".gptab.bss";
15276
0
        subname = o->name + sizeof ".gptab" - 1;
15277
0
        BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
15278
0
      }
15279
15280
    /* Set up the first entry.  */
15281
0
    c = 1;
15282
0
    amt = c * sizeof (Elf32_gptab);
15283
0
    tab = bfd_malloc (amt);
15284
0
    if (tab == NULL)
15285
0
      return false;
15286
0
    tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
15287
0
    tab[0].gt_header.gt_unused = 0;
15288
15289
    /* Combine the input sections.  */
15290
0
    for (p = o->map_head.link_order; p != NULL; p = p->next)
15291
0
      {
15292
0
        asection *input_section;
15293
0
        bfd *input_bfd;
15294
0
        bfd_size_type size;
15295
0
        unsigned long last;
15296
0
        bfd_size_type gpentry;
15297
15298
0
        if (p->type != bfd_indirect_link_order)
15299
0
    {
15300
0
      if (p->type == bfd_data_link_order)
15301
0
        continue;
15302
0
      abort ();
15303
0
    }
15304
15305
0
        input_section = p->u.indirect.section;
15306
0
        input_bfd = input_section->owner;
15307
15308
        /* Combine the gptab entries for this input section one
15309
     by one.  We know that the input gptab entries are
15310
     sorted by ascending -G value.  */
15311
0
        size = input_section->size;
15312
0
        last = 0;
15313
0
        for (gpentry = sizeof (Elf32_External_gptab);
15314
0
       gpentry < size;
15315
0
       gpentry += sizeof (Elf32_External_gptab))
15316
0
    {
15317
0
      Elf32_External_gptab ext_gptab;
15318
0
      Elf32_gptab int_gptab;
15319
0
      unsigned long val;
15320
0
      unsigned long add;
15321
0
      bool exact;
15322
0
      unsigned int look;
15323
15324
0
      if (! (bfd_get_section_contents
15325
0
       (input_bfd, input_section, &ext_gptab, gpentry,
15326
0
        sizeof (Elf32_External_gptab))))
15327
0
        {
15328
0
          free (tab);
15329
0
          return false;
15330
0
        }
15331
15332
0
      bfd_mips_elf32_swap_gptab_in (input_bfd, &ext_gptab,
15333
0
            &int_gptab);
15334
0
      val = int_gptab.gt_entry.gt_g_value;
15335
0
      add = int_gptab.gt_entry.gt_bytes - last;
15336
15337
0
      exact = false;
15338
0
      for (look = 1; look < c; look++)
15339
0
        {
15340
0
          if (tab[look].gt_entry.gt_g_value >= val)
15341
0
      tab[look].gt_entry.gt_bytes += add;
15342
15343
0
          if (tab[look].gt_entry.gt_g_value == val)
15344
0
      exact = true;
15345
0
        }
15346
15347
0
      if (! exact)
15348
0
        {
15349
0
          Elf32_gptab *new_tab;
15350
0
          unsigned int max;
15351
15352
          /* We need a new table entry.  */
15353
0
          amt = (bfd_size_type) (c + 1) * sizeof (Elf32_gptab);
15354
0
          new_tab = bfd_realloc (tab, amt);
15355
0
          if (new_tab == NULL)
15356
0
      {
15357
0
        free (tab);
15358
0
        return false;
15359
0
      }
15360
0
          tab = new_tab;
15361
0
          tab[c].gt_entry.gt_g_value = val;
15362
0
          tab[c].gt_entry.gt_bytes = add;
15363
15364
          /* Merge in the size for the next smallest -G
15365
       value, since that will be implied by this new
15366
       value.  */
15367
0
          max = 0;
15368
0
          for (look = 1; look < c; look++)
15369
0
      {
15370
0
        if (tab[look].gt_entry.gt_g_value < val
15371
0
            && (max == 0
15372
0
          || (tab[look].gt_entry.gt_g_value
15373
0
              > tab[max].gt_entry.gt_g_value)))
15374
0
          max = look;
15375
0
      }
15376
0
          if (max != 0)
15377
0
      tab[c].gt_entry.gt_bytes +=
15378
0
        tab[max].gt_entry.gt_bytes;
15379
15380
0
          ++c;
15381
0
        }
15382
15383
0
      last = int_gptab.gt_entry.gt_bytes;
15384
0
    }
15385
15386
        /* Hack: reset the SEC_HAS_CONTENTS flag so that
15387
     elf_link_input_bfd ignores this section.  */
15388
0
        input_section->flags &= ~SEC_HAS_CONTENTS;
15389
0
      }
15390
15391
    /* The table must be sorted by -G value.  */
15392
0
    if (c > 2)
15393
0
      qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
15394
15395
    /* Swap out the table.  */
15396
0
    amt = (bfd_size_type) c * sizeof (Elf32_External_gptab);
15397
0
    ext_tab = bfd_alloc (abfd, amt);
15398
0
    if (ext_tab == NULL)
15399
0
      {
15400
0
        free (tab);
15401
0
        return false;
15402
0
      }
15403
15404
0
    for (j = 0; j < c; j++)
15405
0
      bfd_mips_elf32_swap_gptab_out (abfd, tab + j, ext_tab + j);
15406
0
    free (tab);
15407
15408
0
    o->size = c * sizeof (Elf32_External_gptab);
15409
0
    o->contents = (bfd_byte *) ext_tab;
15410
0
    o->alloced = 1;
15411
15412
    /* Skip this section later on (I don't think this currently
15413
       matters, but someday it might).  */
15414
0
    o->map_head.link_order = NULL;
15415
0
  }
15416
0
    }
15417
15418
  /* Invoke the regular ELF backend linker to do all the work.  */
15419
0
  if (!bfd_elf_final_link (abfd, info))
15420
0
    return false;
15421
15422
  /* Now write out the computed sections.  */
15423
15424
0
  if (abiflags_sec != NULL)
15425
0
    {
15426
0
      Elf_External_ABIFlags_v0 ext;
15427
0
      Elf_Internal_ABIFlags_v0 *abiflags;
15428
15429
0
      abiflags = &mips_elf_tdata (abfd)->abiflags;
15430
15431
      /* Set up the abiflags if no valid input sections were found.  */
15432
0
      if (!mips_elf_tdata (abfd)->abiflags_valid)
15433
0
  {
15434
0
    infer_mips_abiflags (abfd, abiflags);
15435
0
    mips_elf_tdata (abfd)->abiflags_valid = true;
15436
0
  }
15437
0
      bfd_mips_elf_swap_abiflags_v0_out (abfd, abiflags, &ext);
15438
0
      if (! bfd_set_section_contents (abfd, abiflags_sec, &ext, 0, sizeof ext))
15439
0
  return false;
15440
0
    }
15441
15442
0
  if (reginfo_sec != NULL)
15443
0
    {
15444
0
      Elf32_External_RegInfo ext;
15445
15446
0
      bfd_mips_elf32_swap_reginfo_out (abfd, &reginfo, &ext);
15447
0
      if (! bfd_set_section_contents (abfd, reginfo_sec, &ext, 0, sizeof ext))
15448
0
  return false;
15449
0
    }
15450
15451
0
  if (mdebug_sec != NULL)
15452
0
    {
15453
0
      BFD_ASSERT (abfd->output_has_begun);
15454
0
      if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
15455
0
                 swap, info,
15456
0
                 mdebug_sec->filepos))
15457
0
  return false;
15458
15459
0
      bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
15460
0
    }
15461
15462
0
  if (gptab_data_sec != NULL)
15463
0
    {
15464
0
      if (! bfd_set_section_contents (abfd, gptab_data_sec,
15465
0
              gptab_data_sec->contents,
15466
0
              0, gptab_data_sec->size))
15467
0
  return false;
15468
0
    }
15469
15470
0
  if (gptab_bss_sec != NULL)
15471
0
    {
15472
0
      if (! bfd_set_section_contents (abfd, gptab_bss_sec,
15473
0
              gptab_bss_sec->contents,
15474
0
              0, gptab_bss_sec->size))
15475
0
  return false;
15476
0
    }
15477
15478
0
  if (SGI_COMPAT (abfd))
15479
0
    {
15480
0
      rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
15481
0
      if (rtproc_sec != NULL)
15482
0
  {
15483
0
    if (! bfd_set_section_contents (abfd, rtproc_sec,
15484
0
            rtproc_sec->contents,
15485
0
            0, rtproc_sec->size))
15486
0
      return false;
15487
0
  }
15488
0
    }
15489
15490
0
  return true;
15491
0
}
15492

15493
/* Merge object file header flags from IBFD into OBFD.  Raise an error
15494
   if there are conflicting settings.  */
15495
15496
static bool
15497
mips_elf_merge_obj_e_flags (bfd *ibfd, struct bfd_link_info *info)
15498
0
{
15499
0
  bfd *obfd = info->output_bfd;
15500
0
  struct mips_elf_obj_tdata *out_tdata = mips_elf_tdata (obfd);
15501
0
  flagword old_flags;
15502
0
  flagword new_flags;
15503
0
  bool ok;
15504
15505
0
  new_flags = elf_elfheader (ibfd)->e_flags;
15506
0
  elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_NOREORDER;
15507
0
  old_flags = elf_elfheader (obfd)->e_flags;
15508
15509
  /* Check flag compatibility.  */
15510
15511
0
  new_flags &= ~EF_MIPS_NOREORDER;
15512
0
  old_flags &= ~EF_MIPS_NOREORDER;
15513
15514
  /* Some IRIX 6 BSD-compatibility objects have this bit set.  It
15515
     doesn't seem to matter.  */
15516
0
  new_flags &= ~EF_MIPS_XGOT;
15517
0
  old_flags &= ~EF_MIPS_XGOT;
15518
15519
  /* MIPSpro generates ucode info in n64 objects.  Again, we should
15520
     just be able to ignore this.  */
15521
0
  new_flags &= ~EF_MIPS_UCODE;
15522
0
  old_flags &= ~EF_MIPS_UCODE;
15523
15524
  /* DSOs should only be linked with CPIC code.  */
15525
0
  if ((ibfd->flags & DYNAMIC) != 0)
15526
0
    new_flags |= EF_MIPS_PIC | EF_MIPS_CPIC;
15527
15528
0
  if (new_flags == old_flags)
15529
0
    return true;
15530
15531
0
  ok = true;
15532
15533
0
  if (((new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0)
15534
0
      != ((old_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0))
15535
0
    {
15536
0
      _bfd_error_handler
15537
0
  (_("%pB: warning: linking abicalls files with non-abicalls files"),
15538
0
   ibfd);
15539
0
      ok = true;
15540
0
    }
15541
15542
0
  if (new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC))
15543
0
    elf_elfheader (obfd)->e_flags |= EF_MIPS_CPIC;
15544
0
  if (! (new_flags & EF_MIPS_PIC))
15545
0
    elf_elfheader (obfd)->e_flags &= ~EF_MIPS_PIC;
15546
15547
0
  new_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
15548
0
  old_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
15549
15550
  /* Compare the ISAs.  */
15551
0
  if (mips_32bit_flags_p (old_flags) != mips_32bit_flags_p (new_flags))
15552
0
    {
15553
0
      _bfd_error_handler
15554
0
  (_("%pB: linking 32-bit code with 64-bit code"),
15555
0
   ibfd);
15556
0
      ok = false;
15557
0
    }
15558
0
  else if (!mips_mach_extends_p (bfd_get_mach (ibfd), bfd_get_mach (obfd)))
15559
0
    {
15560
      /* OBFD's ISA isn't the same as, or an extension of, IBFD's.  */
15561
0
      if (mips_mach_extends_p (bfd_get_mach (obfd), bfd_get_mach (ibfd)))
15562
0
  {
15563
    /* Copy the architecture info from IBFD to OBFD.  Also copy
15564
       the 32-bit flag (if set) so that we continue to recognise
15565
       OBFD as a 32-bit binary.  */
15566
0
    bfd_set_arch_info (obfd, bfd_get_arch_info (ibfd));
15567
0
    elf_elfheader (obfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
15568
0
    elf_elfheader (obfd)->e_flags
15569
0
      |= new_flags & (EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15570
15571
    /* Update the ABI flags isa_level, isa_rev, isa_ext fields.  */
15572
0
    update_mips_abiflags_isa (obfd, &out_tdata->abiflags);
15573
15574
    /* Copy across the ABI flags if OBFD doesn't use them
15575
       and if that was what caused us to treat IBFD as 32-bit.  */
15576
0
    if ((old_flags & EF_MIPS_ABI) == 0
15577
0
        && mips_32bit_flags_p (new_flags)
15578
0
        && !mips_32bit_flags_p (new_flags & ~EF_MIPS_ABI))
15579
0
      elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ABI;
15580
0
  }
15581
0
      else
15582
0
  {
15583
    /* The ISAs aren't compatible.  */
15584
0
    _bfd_error_handler
15585
      /* xgettext:c-format */
15586
0
      (_("%pB: linking %s module with previous %s modules"),
15587
0
       ibfd,
15588
0
       bfd_printable_name (ibfd),
15589
0
       bfd_printable_name (obfd));
15590
0
    ok = false;
15591
0
  }
15592
0
    }
15593
15594
0
  new_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15595
0
  old_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15596
15597
  /* Compare ABIs.  The 64-bit ABI does not use EF_MIPS_ABI.  But, it
15598
     does set EI_CLASS differently from any 32-bit ABI.  */
15599
0
  if ((new_flags & EF_MIPS_ABI) != (old_flags & EF_MIPS_ABI)
15600
0
      || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
15601
0
    != elf_elfheader (obfd)->e_ident[EI_CLASS]))
15602
0
    {
15603
      /* Only error if both are set (to different values).  */
15604
0
      if (((new_flags & EF_MIPS_ABI) && (old_flags & EF_MIPS_ABI))
15605
0
    || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
15606
0
        != elf_elfheader (obfd)->e_ident[EI_CLASS]))
15607
0
  {
15608
0
    _bfd_error_handler
15609
      /* xgettext:c-format */
15610
0
      (_("%pB: ABI mismatch: linking %s module with previous %s modules"),
15611
0
       ibfd,
15612
0
       elf_mips_abi_name (ibfd),
15613
0
       elf_mips_abi_name (obfd));
15614
0
    ok = false;
15615
0
  }
15616
0
      new_flags &= ~EF_MIPS_ABI;
15617
0
      old_flags &= ~EF_MIPS_ABI;
15618
0
    }
15619
15620
  /* Compare ASEs.  Forbid linking MIPS16 and microMIPS ASE modules together
15621
     and allow arbitrary mixing of the remaining ASEs (retain the union).  */
15622
0
  if ((new_flags & EF_MIPS_ARCH_ASE) != (old_flags & EF_MIPS_ARCH_ASE))
15623
0
    {
15624
0
      int old_micro = old_flags & EF_MIPS_ARCH_ASE_MICROMIPS;
15625
0
      int new_micro = new_flags & EF_MIPS_ARCH_ASE_MICROMIPS;
15626
0
      int old_m16 = old_flags & EF_MIPS_ARCH_ASE_M16;
15627
0
      int new_m16 = new_flags & EF_MIPS_ARCH_ASE_M16;
15628
0
      int micro_mis = old_m16 && new_micro;
15629
0
      int m16_mis = old_micro && new_m16;
15630
15631
0
      if (m16_mis || micro_mis)
15632
0
  {
15633
0
    _bfd_error_handler
15634
      /* xgettext:c-format */
15635
0
      (_("%pB: ASE mismatch: linking %s module with previous %s modules"),
15636
0
       ibfd,
15637
0
       m16_mis ? "MIPS16" : "microMIPS",
15638
0
       m16_mis ? "microMIPS" : "MIPS16");
15639
0
    ok = false;
15640
0
  }
15641
15642
0
      elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ARCH_ASE;
15643
15644
0
      new_flags &= ~ EF_MIPS_ARCH_ASE;
15645
0
      old_flags &= ~ EF_MIPS_ARCH_ASE;
15646
0
    }
15647
15648
  /* Compare NaN encodings.  */
15649
0
  if ((new_flags & EF_MIPS_NAN2008) != (old_flags & EF_MIPS_NAN2008))
15650
0
    {
15651
      /* xgettext:c-format */
15652
0
      _bfd_error_handler (_("%pB: linking %s module with previous %s modules"),
15653
0
        ibfd,
15654
0
        (new_flags & EF_MIPS_NAN2008
15655
0
         ? "-mnan=2008" : "-mnan=legacy"),
15656
0
        (old_flags & EF_MIPS_NAN2008
15657
0
         ? "-mnan=2008" : "-mnan=legacy"));
15658
0
      ok = false;
15659
0
      new_flags &= ~EF_MIPS_NAN2008;
15660
0
      old_flags &= ~EF_MIPS_NAN2008;
15661
0
    }
15662
15663
  /* Compare FP64 state.  */
15664
0
  if ((new_flags & EF_MIPS_FP64) != (old_flags & EF_MIPS_FP64))
15665
0
    {
15666
      /* xgettext:c-format */
15667
0
      _bfd_error_handler (_("%pB: linking %s module with previous %s modules"),
15668
0
        ibfd,
15669
0
        (new_flags & EF_MIPS_FP64
15670
0
         ? "-mfp64" : "-mfp32"),
15671
0
        (old_flags & EF_MIPS_FP64
15672
0
         ? "-mfp64" : "-mfp32"));
15673
0
      ok = false;
15674
0
      new_flags &= ~EF_MIPS_FP64;
15675
0
      old_flags &= ~EF_MIPS_FP64;
15676
0
    }
15677
15678
  /* Warn about any other mismatches */
15679
0
  if (new_flags != old_flags)
15680
0
    {
15681
      /* xgettext:c-format */
15682
0
      _bfd_error_handler
15683
0
  (_("%pB: uses different e_flags (%#x) fields than previous modules "
15684
0
     "(%#x)"),
15685
0
   ibfd, new_flags, old_flags);
15686
0
      ok = false;
15687
0
    }
15688
15689
0
  return ok;
15690
0
}
15691
15692
/* Merge object attributes from IBFD into OBFD.  Raise an error if
15693
   there are conflicting attributes.  */
15694
static bool
15695
mips_elf_merge_obj_attributes (bfd *ibfd, struct bfd_link_info *info)
15696
0
{
15697
0
  bfd *obfd = info->output_bfd;
15698
0
  obj_attribute *in_attr;
15699
0
  obj_attribute *out_attr;
15700
0
  bfd *abi_fp_bfd;
15701
0
  bfd *abi_msa_bfd;
15702
15703
0
  abi_fp_bfd = mips_elf_tdata (obfd)->abi_fp_bfd;
15704
0
  in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
15705
0
  if (!abi_fp_bfd && in_attr[Tag_GNU_MIPS_ABI_FP].i != Val_GNU_MIPS_ABI_FP_ANY)
15706
0
    mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
15707
15708
0
  abi_msa_bfd = mips_elf_tdata (obfd)->abi_msa_bfd;
15709
0
  if (!abi_msa_bfd
15710
0
      && in_attr[Tag_GNU_MIPS_ABI_MSA].i != Val_GNU_MIPS_ABI_MSA_ANY)
15711
0
    mips_elf_tdata (obfd)->abi_msa_bfd = ibfd;
15712
15713
0
  if (!elf_known_obj_attributes_proc (obfd)[0].i)
15714
0
    {
15715
      /* This is the first object.  Copy the attributes.  */
15716
0
      _bfd_elf_copy_obj_attributes (ibfd, obfd);
15717
15718
      /* Use the Tag_null value to indicate the attributes have been
15719
   initialized.  */
15720
0
      elf_known_obj_attributes_proc (obfd)[0].i = 1;
15721
15722
0
      return true;
15723
0
    }
15724
15725
  /* Check for conflicting Tag_GNU_MIPS_ABI_FP attributes and merge
15726
     non-conflicting ones.  */
15727
0
  out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
15728
0
  if (in_attr[Tag_GNU_MIPS_ABI_FP].i != out_attr[Tag_GNU_MIPS_ABI_FP].i)
15729
0
    {
15730
0
      int out_fp, in_fp;
15731
15732
0
      out_fp = out_attr[Tag_GNU_MIPS_ABI_FP].i;
15733
0
      in_fp = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15734
0
      out_attr[Tag_GNU_MIPS_ABI_FP].type = 1;
15735
0
      if (out_fp == Val_GNU_MIPS_ABI_FP_ANY)
15736
0
  out_attr[Tag_GNU_MIPS_ABI_FP].i = in_fp;
15737
0
      else if (out_fp == Val_GNU_MIPS_ABI_FP_XX
15738
0
         && (in_fp == Val_GNU_MIPS_ABI_FP_DOUBLE
15739
0
       || in_fp == Val_GNU_MIPS_ABI_FP_64
15740
0
       || in_fp == Val_GNU_MIPS_ABI_FP_64A))
15741
0
  {
15742
0
    mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
15743
0
    out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15744
0
  }
15745
0
      else if (in_fp == Val_GNU_MIPS_ABI_FP_XX
15746
0
         && (out_fp == Val_GNU_MIPS_ABI_FP_DOUBLE
15747
0
       || out_fp == Val_GNU_MIPS_ABI_FP_64
15748
0
       || out_fp == Val_GNU_MIPS_ABI_FP_64A))
15749
0
  /* Keep the current setting.  */;
15750
0
      else if (out_fp == Val_GNU_MIPS_ABI_FP_64A
15751
0
         && in_fp == Val_GNU_MIPS_ABI_FP_64)
15752
0
  {
15753
0
    mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
15754
0
    out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15755
0
  }
15756
0
      else if (in_fp == Val_GNU_MIPS_ABI_FP_64A
15757
0
         && out_fp == Val_GNU_MIPS_ABI_FP_64)
15758
0
  /* Keep the current setting.  */;
15759
0
      else if (in_fp != Val_GNU_MIPS_ABI_FP_ANY)
15760
0
  {
15761
0
    const char *out_string, *in_string;
15762
15763
0
    out_string = _bfd_mips_fp_abi_string (out_fp);
15764
0
    in_string = _bfd_mips_fp_abi_string (in_fp);
15765
    /* First warn about cases involving unrecognised ABIs.  */
15766
0
    if (!out_string && !in_string)
15767
      /* xgettext:c-format */
15768
0
      _bfd_error_handler
15769
0
        (_("warning: %pB uses unknown floating point ABI %d "
15770
0
     "(set by %pB), %pB uses unknown floating point ABI %d"),
15771
0
         obfd, out_fp, abi_fp_bfd, ibfd, in_fp);
15772
0
    else if (!out_string)
15773
0
      _bfd_error_handler
15774
        /* xgettext:c-format */
15775
0
        (_("warning: %pB uses unknown floating point ABI %d "
15776
0
     "(set by %pB), %pB uses %s"),
15777
0
         obfd, out_fp, abi_fp_bfd, ibfd, in_string);
15778
0
    else if (!in_string)
15779
0
      _bfd_error_handler
15780
        /* xgettext:c-format */
15781
0
        (_("warning: %pB uses %s (set by %pB), "
15782
0
     "%pB uses unknown floating point ABI %d"),
15783
0
         obfd, out_string, abi_fp_bfd, ibfd, in_fp);
15784
0
    else
15785
0
      {
15786
        /* If one of the bfds is soft-float, the other must be
15787
     hard-float.  The exact choice of hard-float ABI isn't
15788
     really relevant to the error message.  */
15789
0
        if (in_fp == Val_GNU_MIPS_ABI_FP_SOFT)
15790
0
    out_string = "-mhard-float";
15791
0
        else if (out_fp == Val_GNU_MIPS_ABI_FP_SOFT)
15792
0
    in_string = "-mhard-float";
15793
0
        _bfd_error_handler
15794
    /* xgettext:c-format */
15795
0
    (_("warning: %pB uses %s (set by %pB), %pB uses %s"),
15796
0
     obfd, out_string, abi_fp_bfd, ibfd, in_string);
15797
0
      }
15798
0
  }
15799
0
    }
15800
15801
  /* Check for conflicting Tag_GNU_MIPS_ABI_MSA attributes and merge
15802
     non-conflicting ones.  */
15803
0
  if (in_attr[Tag_GNU_MIPS_ABI_MSA].i != out_attr[Tag_GNU_MIPS_ABI_MSA].i)
15804
0
    {
15805
0
      out_attr[Tag_GNU_MIPS_ABI_MSA].type = 1;
15806
0
      if (out_attr[Tag_GNU_MIPS_ABI_MSA].i == Val_GNU_MIPS_ABI_MSA_ANY)
15807
0
  out_attr[Tag_GNU_MIPS_ABI_MSA].i = in_attr[Tag_GNU_MIPS_ABI_MSA].i;
15808
0
      else if (in_attr[Tag_GNU_MIPS_ABI_MSA].i != Val_GNU_MIPS_ABI_MSA_ANY)
15809
0
  switch (out_attr[Tag_GNU_MIPS_ABI_MSA].i)
15810
0
    {
15811
0
    case Val_GNU_MIPS_ABI_MSA_128:
15812
0
      _bfd_error_handler
15813
        /* xgettext:c-format */
15814
0
        (_("warning: %pB uses %s (set by %pB), "
15815
0
     "%pB uses unknown MSA ABI %d"),
15816
0
         obfd, "-mmsa", abi_msa_bfd,
15817
0
         ibfd, in_attr[Tag_GNU_MIPS_ABI_MSA].i);
15818
0
      break;
15819
15820
0
    default:
15821
0
      switch (in_attr[Tag_GNU_MIPS_ABI_MSA].i)
15822
0
        {
15823
0
        case Val_GNU_MIPS_ABI_MSA_128:
15824
0
    _bfd_error_handler
15825
      /* xgettext:c-format */
15826
0
      (_("warning: %pB uses unknown MSA ABI %d "
15827
0
         "(set by %pB), %pB uses %s"),
15828
0
         obfd, out_attr[Tag_GNU_MIPS_ABI_MSA].i,
15829
0
       abi_msa_bfd, ibfd, "-mmsa");
15830
0
      break;
15831
15832
0
        default:
15833
0
    _bfd_error_handler
15834
      /* xgettext:c-format */
15835
0
      (_("warning: %pB uses unknown MSA ABI %d "
15836
0
         "(set by %pB), %pB uses unknown MSA ABI %d"),
15837
0
       obfd, out_attr[Tag_GNU_MIPS_ABI_MSA].i,
15838
0
       abi_msa_bfd, ibfd, in_attr[Tag_GNU_MIPS_ABI_MSA].i);
15839
0
    break;
15840
0
        }
15841
0
    }
15842
0
    }
15843
15844
  /* Merge Tag_compatibility attributes and any common GNU ones.  */
15845
0
  return _bfd_elf_merge_object_attributes (ibfd, info);
15846
0
}
15847
15848
/* Merge object ABI flags from IBFD into OBFD.  Raise an error if
15849
   there are conflicting settings.  */
15850
15851
static bool
15852
mips_elf_merge_obj_abiflags (bfd *ibfd, bfd *obfd)
15853
0
{
15854
0
  obj_attribute *out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
15855
0
  struct mips_elf_obj_tdata *out_tdata = mips_elf_tdata (obfd);
15856
0
  struct mips_elf_obj_tdata *in_tdata = mips_elf_tdata (ibfd);
15857
15858
  /* Update the output abiflags fp_abi using the computed fp_abi.  */
15859
0
  out_tdata->abiflags.fp_abi = out_attr[Tag_GNU_MIPS_ABI_FP].i;
15860
15861
0
#define max(a, b) ((a) > (b) ? (a) : (b))
15862
  /* Merge abiflags.  */
15863
0
  out_tdata->abiflags.isa_level = max (out_tdata->abiflags.isa_level,
15864
0
               in_tdata->abiflags.isa_level);
15865
0
  out_tdata->abiflags.isa_rev = max (out_tdata->abiflags.isa_rev,
15866
0
             in_tdata->abiflags.isa_rev);
15867
0
  out_tdata->abiflags.gpr_size = max (out_tdata->abiflags.gpr_size,
15868
0
              in_tdata->abiflags.gpr_size);
15869
0
  out_tdata->abiflags.cpr1_size = max (out_tdata->abiflags.cpr1_size,
15870
0
               in_tdata->abiflags.cpr1_size);
15871
0
  out_tdata->abiflags.cpr2_size = max (out_tdata->abiflags.cpr2_size,
15872
0
               in_tdata->abiflags.cpr2_size);
15873
0
#undef max
15874
0
  out_tdata->abiflags.ases |= in_tdata->abiflags.ases;
15875
0
  out_tdata->abiflags.flags1 |= in_tdata->abiflags.flags1;
15876
15877
0
  return true;
15878
0
}
15879
15880
/* Merge backend specific data from an object file to the output
15881
   object file when linking.  */
15882
15883
bool
15884
_bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
15885
0
{
15886
0
  bfd *obfd = info->output_bfd;
15887
0
  struct mips_elf_obj_tdata *out_tdata;
15888
0
  struct mips_elf_obj_tdata *in_tdata;
15889
0
  bool null_input_bfd = true;
15890
0
  asection *sec;
15891
0
  bool ok;
15892
15893
  /* Check if we have the same endianness.  */
15894
0
  if (! _bfd_generic_verify_endian_match (ibfd, info))
15895
0
    {
15896
0
      _bfd_error_handler
15897
0
  (_("%pB: endianness incompatible with that of the selected emulation"),
15898
0
   ibfd);
15899
0
      return false;
15900
0
    }
15901
15902
0
  if (!is_mips_elf (ibfd) || !is_mips_elf (obfd))
15903
0
    return true;
15904
15905
0
  in_tdata = mips_elf_tdata (ibfd);
15906
0
  out_tdata = mips_elf_tdata (obfd);
15907
15908
0
  if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
15909
0
    {
15910
0
      _bfd_error_handler
15911
0
  (_("%pB: ABI is incompatible with that of the selected emulation"),
15912
0
   ibfd);
15913
0
      return false;
15914
0
    }
15915
15916
  /* Check to see if the input BFD actually contains any sections.  If not,
15917
     then it has no attributes, and its flags may not have been initialized
15918
     either, but it cannot actually cause any incompatibility.  */
15919
  /* FIXME: This excludes any input shared library from consideration.  */
15920
0
  for (sec = ibfd->sections; sec != NULL; sec = sec->next)
15921
0
    {
15922
      /* Ignore synthetic sections and empty .text, .data and .bss sections
15923
   which are automatically generated by gas.  Also ignore fake
15924
   (s)common sections, since merely defining a common symbol does
15925
   not affect compatibility.  */
15926
0
      if ((sec->flags & SEC_IS_COMMON) == 0
15927
0
    && strcmp (sec->name, ".reginfo")
15928
0
    && strcmp (sec->name, ".mdebug")
15929
0
    && (sec->size != 0
15930
0
        || (strcmp (sec->name, ".text")
15931
0
      && strcmp (sec->name, ".data")
15932
0
      && strcmp (sec->name, ".bss"))))
15933
0
  {
15934
0
    null_input_bfd = false;
15935
0
    break;
15936
0
  }
15937
0
    }
15938
0
  if (null_input_bfd)
15939
0
    return true;
15940
15941
  /* Populate abiflags using existing information.  */
15942
0
  if (in_tdata->abiflags_valid)
15943
0
    {
15944
0
      obj_attribute *in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
15945
0
      Elf_Internal_ABIFlags_v0 in_abiflags;
15946
0
      Elf_Internal_ABIFlags_v0 abiflags;
15947
15948
      /* Set up the FP ABI attribute from the abiflags if it is not already
15949
   set.  */
15950
0
      if (in_attr[Tag_GNU_MIPS_ABI_FP].i == Val_GNU_MIPS_ABI_FP_ANY)
15951
0
  in_attr[Tag_GNU_MIPS_ABI_FP].i = in_tdata->abiflags.fp_abi;
15952
15953
0
      infer_mips_abiflags (ibfd, &abiflags);
15954
0
      in_abiflags = in_tdata->abiflags;
15955
15956
      /* It is not possible to infer the correct ISA revision
15957
   for R3 or R5 so drop down to R2 for the checks.  */
15958
0
      if (in_abiflags.isa_rev == 3 || in_abiflags.isa_rev == 5)
15959
0
  in_abiflags.isa_rev = 2;
15960
15961
0
      if (LEVEL_REV (in_abiflags.isa_level, in_abiflags.isa_rev)
15962
0
    < LEVEL_REV (abiflags.isa_level, abiflags.isa_rev))
15963
0
  _bfd_error_handler
15964
0
    (_("%pB: warning: inconsistent ISA between e_flags and "
15965
0
       ".MIPS.abiflags"), ibfd);
15966
0
      if (abiflags.fp_abi != Val_GNU_MIPS_ABI_FP_ANY
15967
0
    && in_abiflags.fp_abi != abiflags.fp_abi)
15968
0
  _bfd_error_handler
15969
0
    (_("%pB: warning: inconsistent FP ABI between .gnu.attributes and "
15970
0
       ".MIPS.abiflags"), ibfd);
15971
0
      if ((in_abiflags.ases & abiflags.ases) != abiflags.ases)
15972
0
  _bfd_error_handler
15973
0
    (_("%pB: warning: inconsistent ASEs between e_flags and "
15974
0
       ".MIPS.abiflags"), ibfd);
15975
      /* The isa_ext is allowed to be an extension of what can be inferred
15976
   from e_flags.  */
15977
0
      if (!mips_mach_extends_p (bfd_mips_isa_ext_mach (abiflags.isa_ext),
15978
0
        bfd_mips_isa_ext_mach (in_abiflags.isa_ext)))
15979
0
  _bfd_error_handler
15980
0
    (_("%pB: warning: inconsistent ISA extensions between e_flags and "
15981
0
       ".MIPS.abiflags"), ibfd);
15982
0
      if (in_abiflags.flags2 != 0)
15983
0
  _bfd_error_handler
15984
0
    (_("%pB: warning: unexpected flag in the flags2 field of "
15985
0
       ".MIPS.abiflags (0x%lx)"), ibfd,
15986
0
     in_abiflags.flags2);
15987
0
    }
15988
0
  else
15989
0
    {
15990
0
      infer_mips_abiflags (ibfd, &in_tdata->abiflags);
15991
0
      in_tdata->abiflags_valid = true;
15992
0
    }
15993
15994
0
  if (!out_tdata->abiflags_valid)
15995
0
    {
15996
      /* Copy input abiflags if output abiflags are not already valid.  */
15997
0
      out_tdata->abiflags = in_tdata->abiflags;
15998
0
      out_tdata->abiflags_valid = true;
15999
0
    }
16000
16001
0
  if (! elf_flags_init (obfd))
16002
0
    {
16003
0
      elf_flags_init (obfd) = true;
16004
0
      elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
16005
0
      elf_elfheader (obfd)->e_ident[EI_CLASS]
16006
0
  = elf_elfheader (ibfd)->e_ident[EI_CLASS];
16007
16008
0
      if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
16009
0
    && (bfd_get_arch_info (obfd)->the_default
16010
0
        || mips_mach_extends_p (bfd_get_mach (obfd),
16011
0
              bfd_get_mach (ibfd))))
16012
0
  {
16013
0
    if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
16014
0
           bfd_get_mach (ibfd)))
16015
0
      return false;
16016
16017
    /* Update the ABI flags isa_level, isa_rev and isa_ext fields.  */
16018
0
    update_mips_abiflags_isa (obfd, &out_tdata->abiflags);
16019
0
  }
16020
16021
0
      ok = true;
16022
0
    }
16023
0
  else
16024
0
    ok = mips_elf_merge_obj_e_flags (ibfd, info);
16025
16026
0
  ok = mips_elf_merge_obj_attributes (ibfd, info) && ok;
16027
16028
0
  ok = mips_elf_merge_obj_abiflags (ibfd, obfd) && ok;
16029
16030
0
  if (!ok)
16031
0
    {
16032
0
      bfd_set_error (bfd_error_bad_value);
16033
0
      return false;
16034
0
    }
16035
16036
0
  return true;
16037
0
}
16038
16039
/* Function to keep MIPS specific file flags like as EF_MIPS_PIC.  */
16040
16041
bool
16042
_bfd_mips_elf_set_private_flags (bfd *abfd, flagword flags)
16043
0
{
16044
0
  BFD_ASSERT (!elf_flags_init (abfd)
16045
0
        || elf_elfheader (abfd)->e_flags == flags);
16046
16047
0
  elf_elfheader (abfd)->e_flags = flags;
16048
0
  elf_flags_init (abfd) = true;
16049
0
  return true;
16050
0
}
16051
16052
char *
16053
_bfd_mips_elf_get_target_dtag (bfd_vma dtag)
16054
32
{
16055
32
  switch (dtag)
16056
32
    {
16057
0
    default: return "";
16058
4
    case DT_MIPS_RLD_VERSION:
16059
4
      return "MIPS_RLD_VERSION";
16060
0
    case DT_MIPS_TIME_STAMP:
16061
0
      return "MIPS_TIME_STAMP";
16062
0
    case DT_MIPS_ICHECKSUM:
16063
0
      return "MIPS_ICHECKSUM";
16064
0
    case DT_MIPS_IVERSION:
16065
0
      return "MIPS_IVERSION";
16066
4
    case DT_MIPS_FLAGS:
16067
4
      return "MIPS_FLAGS";
16068
4
    case DT_MIPS_BASE_ADDRESS:
16069
4
      return "MIPS_BASE_ADDRESS";
16070
0
    case DT_MIPS_MSYM:
16071
0
      return "MIPS_MSYM";
16072
0
    case DT_MIPS_CONFLICT:
16073
0
      return "MIPS_CONFLICT";
16074
0
    case DT_MIPS_LIBLIST:
16075
0
      return "MIPS_LIBLIST";
16076
4
    case DT_MIPS_LOCAL_GOTNO:
16077
4
      return "MIPS_LOCAL_GOTNO";
16078
0
    case DT_MIPS_CONFLICTNO:
16079
0
      return "MIPS_CONFLICTNO";
16080
0
    case DT_MIPS_LIBLISTNO:
16081
0
      return "MIPS_LIBLISTNO";
16082
4
    case DT_MIPS_SYMTABNO:
16083
4
      return "MIPS_SYMTABNO";
16084
4
    case DT_MIPS_UNREFEXTNO:
16085
4
      return "MIPS_UNREFEXTNO";
16086
4
    case DT_MIPS_GOTSYM:
16087
4
      return "MIPS_GOTSYM";
16088
0
    case DT_MIPS_HIPAGENO:
16089
0
      return "MIPS_HIPAGENO";
16090
4
    case DT_MIPS_RLD_MAP:
16091
4
      return "MIPS_RLD_MAP";
16092
0
    case DT_MIPS_RLD_MAP_REL:
16093
0
      return "MIPS_RLD_MAP_REL";
16094
0
    case DT_MIPS_DELTA_CLASS:
16095
0
      return "MIPS_DELTA_CLASS";
16096
0
    case DT_MIPS_DELTA_CLASS_NO:
16097
0
      return "MIPS_DELTA_CLASS_NO";
16098
0
    case DT_MIPS_DELTA_INSTANCE:
16099
0
      return "MIPS_DELTA_INSTANCE";
16100
0
    case DT_MIPS_DELTA_INSTANCE_NO:
16101
0
      return "MIPS_DELTA_INSTANCE_NO";
16102
0
    case DT_MIPS_DELTA_RELOC:
16103
0
      return "MIPS_DELTA_RELOC";
16104
0
    case DT_MIPS_DELTA_RELOC_NO:
16105
0
      return "MIPS_DELTA_RELOC_NO";
16106
0
    case DT_MIPS_DELTA_SYM:
16107
0
      return "MIPS_DELTA_SYM";
16108
0
    case DT_MIPS_DELTA_SYM_NO:
16109
0
      return "MIPS_DELTA_SYM_NO";
16110
0
    case DT_MIPS_DELTA_CLASSSYM:
16111
0
      return "MIPS_DELTA_CLASSSYM";
16112
0
    case DT_MIPS_DELTA_CLASSSYM_NO:
16113
0
      return "MIPS_DELTA_CLASSSYM_NO";
16114
0
    case DT_MIPS_CXX_FLAGS:
16115
0
      return "MIPS_CXX_FLAGS";
16116
0
    case DT_MIPS_PIXIE_INIT:
16117
0
      return "MIPS_PIXIE_INIT";
16118
0
    case DT_MIPS_SYMBOL_LIB:
16119
0
      return "MIPS_SYMBOL_LIB";
16120
0
    case DT_MIPS_LOCALPAGE_GOTIDX:
16121
0
      return "MIPS_LOCALPAGE_GOTIDX";
16122
0
    case DT_MIPS_LOCAL_GOTIDX:
16123
0
      return "MIPS_LOCAL_GOTIDX";
16124
0
    case DT_MIPS_HIDDEN_GOTIDX:
16125
0
      return "MIPS_HIDDEN_GOTIDX";
16126
0
    case DT_MIPS_PROTECTED_GOTIDX:
16127
0
      return "MIPS_PROTECTED_GOT_IDX";
16128
0
    case DT_MIPS_OPTIONS:
16129
0
      return "MIPS_OPTIONS";
16130
0
    case DT_MIPS_INTERFACE:
16131
0
      return "MIPS_INTERFACE";
16132
0
    case DT_MIPS_DYNSTR_ALIGN:
16133
0
      return "DT_MIPS_DYNSTR_ALIGN";
16134
0
    case DT_MIPS_INTERFACE_SIZE:
16135
0
      return "DT_MIPS_INTERFACE_SIZE";
16136
0
    case DT_MIPS_RLD_TEXT_RESOLVE_ADDR:
16137
0
      return "DT_MIPS_RLD_TEXT_RESOLVE_ADDR";
16138
0
    case DT_MIPS_PERF_SUFFIX:
16139
0
      return "DT_MIPS_PERF_SUFFIX";
16140
0
    case DT_MIPS_COMPACT_SIZE:
16141
0
      return "DT_MIPS_COMPACT_SIZE";
16142
0
    case DT_MIPS_GP_VALUE:
16143
0
      return "DT_MIPS_GP_VALUE";
16144
0
    case DT_MIPS_AUX_DYNAMIC:
16145
0
      return "DT_MIPS_AUX_DYNAMIC";
16146
0
    case DT_MIPS_PLTGOT:
16147
0
      return "DT_MIPS_PLTGOT";
16148
0
    case DT_MIPS_RWPLT:
16149
0
      return "DT_MIPS_RWPLT";
16150
0
    case DT_MIPS_XHASH:
16151
0
      return "DT_MIPS_XHASH";
16152
32
    }
16153
32
}
16154
16155
/* Return the meaning of Tag_GNU_MIPS_ABI_FP value FP, or null if
16156
   not known.  */
16157
16158
const char *
16159
_bfd_mips_fp_abi_string (int fp)
16160
0
{
16161
0
  switch (fp)
16162
0
    {
16163
      /* These strings aren't translated because they're simply
16164
   option lists.  */
16165
0
    case Val_GNU_MIPS_ABI_FP_DOUBLE:
16166
0
      return "-mdouble-float";
16167
16168
0
    case Val_GNU_MIPS_ABI_FP_SINGLE:
16169
0
      return "-msingle-float";
16170
16171
0
    case Val_GNU_MIPS_ABI_FP_SOFT:
16172
0
      return "-msoft-float";
16173
16174
0
    case Val_GNU_MIPS_ABI_FP_OLD_64:
16175
0
      return _("-mips32r2 -mfp64 (12 callee-saved)");
16176
16177
0
    case Val_GNU_MIPS_ABI_FP_XX:
16178
0
      return "-mfpxx";
16179
16180
0
    case Val_GNU_MIPS_ABI_FP_64:
16181
0
      return "-mgp32 -mfp64";
16182
16183
0
    case Val_GNU_MIPS_ABI_FP_64A:
16184
0
      return "-mgp32 -mfp64 -mno-odd-spreg";
16185
16186
0
    default:
16187
0
      return 0;
16188
0
    }
16189
0
}
16190
16191
static void
16192
print_mips_ases (FILE *file, unsigned int mask)
16193
0
{
16194
0
  if (mask & AFL_ASE_DSP)
16195
0
    fputs ("\n\tDSP ASE", file);
16196
0
  if (mask & AFL_ASE_DSPR2)
16197
0
    fputs ("\n\tDSP R2 ASE", file);
16198
0
  if (mask & AFL_ASE_DSPR3)
16199
0
    fputs ("\n\tDSP R3 ASE", file);
16200
0
  if (mask & AFL_ASE_EVA)
16201
0
    fputs ("\n\tEnhanced VA Scheme", file);
16202
0
  if (mask & AFL_ASE_MCU)
16203
0
    fputs ("\n\tMCU (MicroController) ASE", file);
16204
0
  if (mask & AFL_ASE_MDMX)
16205
0
    fputs ("\n\tMDMX ASE", file);
16206
0
  if (mask & AFL_ASE_MIPS3D)
16207
0
    fputs ("\n\tMIPS-3D ASE", file);
16208
0
  if (mask & AFL_ASE_MT)
16209
0
    fputs ("\n\tMT ASE", file);
16210
0
  if (mask & AFL_ASE_SMARTMIPS)
16211
0
    fputs ("\n\tSmartMIPS ASE", file);
16212
0
  if (mask & AFL_ASE_VIRT)
16213
0
    fputs ("\n\tVZ ASE", file);
16214
0
  if (mask & AFL_ASE_MSA)
16215
0
    fputs ("\n\tMSA ASE", file);
16216
0
  if (mask & AFL_ASE_MIPS16)
16217
0
    fputs ("\n\tMIPS16 ASE", file);
16218
0
  if (mask & AFL_ASE_MICROMIPS)
16219
0
    fputs ("\n\tMICROMIPS ASE", file);
16220
0
  if (mask & AFL_ASE_XPA)
16221
0
    fputs ("\n\tXPA ASE", file);
16222
0
  if (mask & AFL_ASE_MIPS16E2)
16223
0
    fputs ("\n\tMIPS16e2 ASE", file);
16224
0
  if (mask & AFL_ASE_CRC)
16225
0
    fputs ("\n\tCRC ASE", file);
16226
0
  if (mask & AFL_ASE_GINV)
16227
0
    fputs ("\n\tGINV ASE", file);
16228
0
  if (mask & AFL_ASE_LOONGSON_MMI)
16229
0
    fputs ("\n\tLoongson MMI ASE", file);
16230
0
  if (mask & AFL_ASE_LOONGSON_CAM)
16231
0
    fputs ("\n\tLoongson CAM ASE", file);
16232
0
  if (mask & AFL_ASE_LOONGSON_EXT)
16233
0
    fputs ("\n\tLoongson EXT ASE", file);
16234
0
  if (mask & AFL_ASE_LOONGSON_EXT2)
16235
0
    fputs ("\n\tLoongson EXT2 ASE", file);
16236
0
  if (mask == 0)
16237
0
    fprintf (file, "\n\t%s", _("None"));
16238
0
  else if ((mask & ~AFL_ASE_MASK) != 0)
16239
0
    fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
16240
0
}
16241
16242
static void
16243
print_mips_isa_ext (FILE *file, unsigned int isa_ext)
16244
0
{
16245
0
  switch (isa_ext)
16246
0
    {
16247
0
    case 0:
16248
0
      fputs (_("None"), file);
16249
0
      break;
16250
0
    case AFL_EXT_XLR:
16251
0
      fputs ("RMI XLR", file);
16252
0
      break;
16253
0
    case AFL_EXT_OCTEON3:
16254
0
      fputs ("Cavium Networks Octeon3", file);
16255
0
      break;
16256
0
    case AFL_EXT_OCTEON2:
16257
0
      fputs ("Cavium Networks Octeon2", file);
16258
0
      break;
16259
0
    case AFL_EXT_OCTEONP:
16260
0
      fputs ("Cavium Networks OcteonP", file);
16261
0
      break;
16262
0
    case AFL_EXT_OCTEON:
16263
0
      fputs ("Cavium Networks Octeon", file);
16264
0
      break;
16265
0
    case AFL_EXT_5900:
16266
0
      fputs ("Toshiba R5900", file);
16267
0
      break;
16268
0
    case AFL_EXT_4650:
16269
0
      fputs ("MIPS R4650", file);
16270
0
      break;
16271
0
    case AFL_EXT_4010:
16272
0
      fputs ("LSI R4010", file);
16273
0
      break;
16274
0
    case AFL_EXT_4100:
16275
0
      fputs ("NEC VR4100", file);
16276
0
      break;
16277
0
    case AFL_EXT_3900:
16278
0
      fputs ("Toshiba R3900", file);
16279
0
      break;
16280
0
    case AFL_EXT_10000:
16281
0
      fputs ("MIPS R10000", file);
16282
0
      break;
16283
0
    case AFL_EXT_SB1:
16284
0
      fputs ("Broadcom SB-1", file);
16285
0
      break;
16286
0
    case AFL_EXT_4111:
16287
0
      fputs ("NEC VR4111/VR4181", file);
16288
0
      break;
16289
0
    case AFL_EXT_4120:
16290
0
      fputs ("NEC VR4120", file);
16291
0
      break;
16292
0
    case AFL_EXT_5400:
16293
0
      fputs ("NEC VR5400", file);
16294
0
      break;
16295
0
    case AFL_EXT_5500:
16296
0
      fputs ("NEC VR5500", file);
16297
0
      break;
16298
0
    case AFL_EXT_LOONGSON_2E:
16299
0
      fputs ("ST Microelectronics Loongson 2E", file);
16300
0
      break;
16301
0
    case AFL_EXT_LOONGSON_2F:
16302
0
      fputs ("ST Microelectronics Loongson 2F", file);
16303
0
      break;
16304
0
    case AFL_EXT_INTERAPTIV_MR2:
16305
0
      fputs ("Imagination interAptiv MR2", file);
16306
0
      break;
16307
0
    default:
16308
0
      fprintf (file, "%s (%d)", _("Unknown"), isa_ext);
16309
0
      break;
16310
0
    }
16311
0
}
16312
16313
static void
16314
print_mips_fp_abi_value (FILE *file, int val)
16315
0
{
16316
0
  switch (val)
16317
0
    {
16318
0
    case Val_GNU_MIPS_ABI_FP_ANY:
16319
0
      fprintf (file, _("Hard or soft float\n"));
16320
0
      break;
16321
0
    case Val_GNU_MIPS_ABI_FP_DOUBLE:
16322
0
      fprintf (file, _("Hard float (double precision)\n"));
16323
0
      break;
16324
0
    case Val_GNU_MIPS_ABI_FP_SINGLE:
16325
0
      fprintf (file, _("Hard float (single precision)\n"));
16326
0
      break;
16327
0
    case Val_GNU_MIPS_ABI_FP_SOFT:
16328
0
      fprintf (file, _("Soft float\n"));
16329
0
      break;
16330
0
    case Val_GNU_MIPS_ABI_FP_OLD_64:
16331
0
      fprintf (file, _("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
16332
0
      break;
16333
0
    case Val_GNU_MIPS_ABI_FP_XX:
16334
0
      fprintf (file, _("Hard float (32-bit CPU, Any FPU)\n"));
16335
0
      break;
16336
0
    case Val_GNU_MIPS_ABI_FP_64:
16337
0
      fprintf (file, _("Hard float (32-bit CPU, 64-bit FPU)\n"));
16338
0
      break;
16339
0
    case Val_GNU_MIPS_ABI_FP_64A:
16340
0
      fprintf (file, _("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
16341
0
      break;
16342
0
    default:
16343
0
      fprintf (file, "??? (%d)\n", val);
16344
0
      break;
16345
0
    }
16346
0
}
16347
16348
static int
16349
get_mips_reg_size (int reg_size)
16350
0
{
16351
0
  return (reg_size == AFL_REG_NONE) ? 0
16352
0
   : (reg_size == AFL_REG_32) ? 32
16353
0
   : (reg_size == AFL_REG_64) ? 64
16354
0
   : (reg_size == AFL_REG_128) ? 128
16355
0
   : -1;
16356
0
}
16357
16358
bool
16359
_bfd_mips_elf_print_private_bfd_data (bfd *abfd, void *ptr)
16360
368
{
16361
368
  FILE *file = ptr;
16362
16363
368
  BFD_ASSERT (abfd != NULL && ptr != NULL);
16364
16365
  /* Print normal ELF private data.  */
16366
368
  _bfd_elf_print_private_bfd_data (abfd, ptr);
16367
16368
  /* xgettext:c-format */
16369
368
  fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
16370
16371
368
  if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == EF_MIPS_ABI_O32)
16372
8
    fprintf (file, _(" [abi=O32]"));
16373
360
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == EF_MIPS_ABI_O64)
16374
4
    fprintf (file, _(" [abi=O64]"));
16375
356
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == EF_MIPS_ABI_EABI32)
16376
3
    fprintf (file, _(" [abi=EABI32]"));
16377
353
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == EF_MIPS_ABI_EABI64)
16378
1
    fprintf (file, _(" [abi=EABI64]"));
16379
352
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI))
16380
154
    fprintf (file, _(" [abi unknown]"));
16381
198
  else if (ABI_N32_P (abfd))
16382
52
    fprintf (file, _(" [abi=N32]"));
16383
146
  else if (ABI_64_P (abfd))
16384
48
    fprintf (file, _(" [abi=64]"));
16385
98
  else
16386
98
    fprintf (file, _(" [no abi set]"));
16387
16388
368
  if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_1)
16389
190
    fprintf (file, " [mips1]");
16390
178
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_2)
16391
5
    fprintf (file, " [mips2]");
16392
173
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_3)
16393
6
    fprintf (file, " [mips3]");
16394
167
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_4)
16395
9
    fprintf (file, " [mips4]");
16396
158
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_5)
16397
3
    fprintf (file, " [mips5]");
16398
155
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32)
16399
13
    fprintf (file, " [mips32]");
16400
142
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_64)
16401
3
    fprintf (file, " [mips64]");
16402
139
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32R2)
16403
49
    fprintf (file, " [mips32r2]");
16404
90
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_64R2)
16405
6
    fprintf (file, " [mips64r2]");
16406
84
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32R6)
16407
52
    fprintf (file, " [mips32r6]");
16408
32
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_64R6)
16409
16
    fprintf (file, " [mips64r6]");
16410
16
  else
16411
16
    fprintf (file, _(" [unknown ISA]"));
16412
16413
368
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
16414
126
    fprintf (file, " [mdmx]");
16415
16416
368
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
16417
57
    fprintf (file, " [mips16]");
16418
16419
368
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
16420
178
    fprintf (file, " [micromips]");
16421
16422
368
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_NAN2008)
16423
151
    fprintf (file, " [nan2008]");
16424
16425
368
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_FP64)
16426
148
    fprintf (file, " [old fp64]");
16427
16428
368
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_32BITMODE)
16429
120
    fprintf (file, " [32bitmode]");
16430
248
  else
16431
248
    fprintf (file, _(" [not 32bitmode]"));
16432
16433
368
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_NOREORDER)
16434
143
    fprintf (file, " [noreorder]");
16435
16436
368
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_PIC)
16437
66
    fprintf (file, " [PIC]");
16438
16439
368
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_CPIC)
16440
165
    fprintf (file, " [CPIC]");
16441
16442
368
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_XGOT)
16443
63
    fprintf (file, " [XGOT]");
16444
16445
368
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_UCODE)
16446
154
    fprintf (file, " [UCODE]");
16447
16448
368
  fputc ('\n', file);
16449
16450
368
  if (mips_elf_tdata (abfd)->abiflags_valid)
16451
0
    {
16452
0
      Elf_Internal_ABIFlags_v0 *abiflags = &mips_elf_tdata (abfd)->abiflags;
16453
0
      fprintf (file, "\nMIPS ABI Flags Version: %d\n", abiflags->version);
16454
0
      fprintf (file, "\nISA: MIPS%d", abiflags->isa_level);
16455
0
      if (abiflags->isa_rev > 1)
16456
0
  fprintf (file, "r%d", abiflags->isa_rev);
16457
0
      fprintf (file, "\nGPR size: %d",
16458
0
         get_mips_reg_size (abiflags->gpr_size));
16459
0
      fprintf (file, "\nCPR1 size: %d",
16460
0
         get_mips_reg_size (abiflags->cpr1_size));
16461
0
      fprintf (file, "\nCPR2 size: %d",
16462
0
         get_mips_reg_size (abiflags->cpr2_size));
16463
0
      fputs ("\nFP ABI: ", file);
16464
0
      print_mips_fp_abi_value (file, abiflags->fp_abi);
16465
0
      fputs ("ISA Extension: ", file);
16466
0
      print_mips_isa_ext (file, abiflags->isa_ext);
16467
0
      fputs ("\nASEs:", file);
16468
0
      print_mips_ases (file, abiflags->ases);
16469
0
      fprintf (file, "\nFLAGS 1: %8.8lx", abiflags->flags1);
16470
0
      fprintf (file, "\nFLAGS 2: %8.8lx", abiflags->flags2);
16471
0
      fputc ('\n', file);
16472
0
    }
16473
16474
368
  return true;
16475
368
}
16476
16477
const struct bfd_elf_special_section _bfd_mips_elf_special_sections[] =
16478
{
16479
  { STRING_COMMA_LEN (".lit4"),   0, SHT_PROGBITS,   SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16480
  { STRING_COMMA_LEN (".lit8"),   0, SHT_PROGBITS,   SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16481
  { STRING_COMMA_LEN (".mdebug"), 0, SHT_MIPS_DEBUG, 0 },
16482
  { STRING_COMMA_LEN (".sbss"),  -2, SHT_NOBITS,     SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16483
  { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS,   SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16484
  { STRING_COMMA_LEN (".ucode"),  0, SHT_MIPS_UCODE, 0 },
16485
  { STRING_COMMA_LEN (".MIPS.xhash"),  0, SHT_MIPS_XHASH,   SHF_ALLOC },
16486
  { NULL,         0,  0, 0,        0 }
16487
};
16488
16489
/* Merge non visibility st_other attributes.  Ensure that the
16490
   STO_OPTIONAL flag is copied into h->other, even if this is not a
16491
   definiton of the symbol.  */
16492
void
16493
_bfd_mips_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
16494
              unsigned int st_other,
16495
              bool definition,
16496
              bool dynamic ATTRIBUTE_UNUSED)
16497
0
{
16498
0
  if ((st_other & ~ELF_ST_VISIBILITY (-1)) != 0)
16499
0
    {
16500
0
      unsigned char other;
16501
16502
0
      other = (definition ? st_other : h->other);
16503
0
      other &= ~ELF_ST_VISIBILITY (-1);
16504
0
      h->other = other | ELF_ST_VISIBILITY (h->other);
16505
0
    }
16506
16507
0
  if (!definition
16508
0
      && ELF_MIPS_IS_OPTIONAL (st_other))
16509
0
    h->other |= STO_OPTIONAL;
16510
0
}
16511
16512
/* Decide whether an undefined symbol is special and can be ignored.
16513
   This is the case for OPTIONAL symbols on IRIX.  */
16514
bool
16515
_bfd_mips_elf_ignore_undef_symbol (struct elf_link_hash_entry *h)
16516
0
{
16517
0
  return ELF_MIPS_IS_OPTIONAL (h->other) != 0;
16518
0
}
16519
16520
bool
16521
_bfd_mips_elf_common_definition (Elf_Internal_Sym *sym)
16522
0
{
16523
0
  return (sym->st_shndx == SHN_COMMON
16524
0
    || sym->st_shndx == SHN_MIPS_ACOMMON
16525
0
    || sym->st_shndx == SHN_MIPS_SCOMMON);
16526
0
}
16527
16528
/* Return address for Ith PLT stub in section PLT, for relocation REL
16529
   or (bfd_vma) -1 if it should not be included.  */
16530
16531
bfd_vma
16532
_bfd_mips_elf_plt_sym_val (bfd_vma i, const asection *plt,
16533
         const arelent *rel ATTRIBUTE_UNUSED)
16534
0
{
16535
0
  return (plt->vma
16536
0
    + 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry)
16537
0
    + i * 4 * ARRAY_SIZE (mips_exec_plt_entry));
16538
0
}
16539
16540
/* Build a table of synthetic symbols to represent the PLT.  As with MIPS16
16541
   and microMIPS PLT slots we may have a many-to-one mapping between .plt
16542
   and .got.plt and also the slots may be of a different size each we walk
16543
   the PLT manually fetching instructions and matching them against known
16544
   patterns.  To make things easier standard MIPS slots, if any, always come
16545
   first.  As we don't create proper ELF symbols we use the UDATA.I member
16546
   of ASYMBOL to carry ISA annotation.  The encoding used is the same as
16547
   with the ST_OTHER member of the ELF symbol.  */
16548
16549
long
16550
_bfd_mips_elf_get_synthetic_symtab (bfd *abfd,
16551
            long symcount ATTRIBUTE_UNUSED,
16552
            asymbol **syms ATTRIBUTE_UNUSED,
16553
            long dynsymcount, asymbol **dynsyms,
16554
            asymbol **ret)
16555
51
{
16556
51
  static const char pltname[] = "_PROCEDURE_LINKAGE_TABLE_";
16557
51
  static const char microsuffix[] = "@micromipsplt";
16558
51
  static const char m16suffix[] = "@mips16plt";
16559
51
  static const char mipssuffix[] = "@plt";
16560
16561
51
  bool (*slurp_relocs) (bfd *, asection *, asymbol **, bool);
16562
51
  const struct elf_backend_data *bed = get_elf_backend_data (abfd);
16563
51
  bool micromips_p = MICROMIPS_P (abfd);
16564
51
  Elf_Internal_Shdr *hdr;
16565
51
  bfd_byte *plt_data;
16566
51
  bfd_vma plt_offset;
16567
51
  unsigned int other;
16568
51
  bfd_vma entry_size;
16569
51
  bfd_vma plt0_size;
16570
51
  asection *relplt;
16571
51
  bfd_vma opcode;
16572
51
  asection *plt;
16573
51
  asymbol *send;
16574
51
  size_t size;
16575
51
  char *names;
16576
51
  long counti;
16577
51
  arelent *p;
16578
51
  asymbol *s;
16579
51
  char *nend;
16580
51
  long count;
16581
51
  long pi;
16582
51
  long i;
16583
51
  long n;
16584
16585
51
  *ret = NULL;
16586
16587
51
  if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0 || dynsymcount <= 0)
16588
48
    return 0;
16589
16590
3
  relplt = bfd_get_section_by_name (abfd, ".rel.plt");
16591
3
  if (relplt == NULL)
16592
3
    return 0;
16593
16594
0
  hdr = &elf_section_data (relplt)->this_hdr;
16595
0
  if (hdr->sh_link != elf_dynsymtab (abfd) || hdr->sh_type != SHT_REL)
16596
0
    return 0;
16597
16598
0
  plt = bfd_get_section_by_name (abfd, ".plt");
16599
0
  if (plt == NULL || (plt->flags & SEC_HAS_CONTENTS) == 0)
16600
0
    return 0;
16601
16602
0
  slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
16603
0
  if (!(*slurp_relocs) (abfd, relplt, dynsyms, true))
16604
0
    return -1;
16605
0
  p = relplt->relocation;
16606
16607
  /* Calculating the exact amount of space required for symbols would
16608
     require two passes over the PLT, so just pessimise assuming two
16609
     PLT slots per relocation.  */
16610
0
  count = NUM_SHDR_ENTRIES (hdr);
16611
0
  counti = count * bed->s->int_rels_per_ext_rel;
16612
0
  size = 2 * count * sizeof (asymbol);
16613
0
  size += count * (sizeof (mipssuffix) +
16614
0
       (micromips_p ? sizeof (microsuffix) : sizeof (m16suffix)));
16615
0
  for (pi = 0; pi < counti; pi += bed->s->int_rels_per_ext_rel)
16616
0
    size += 2 * strlen ((*p[pi].sym_ptr_ptr)->name);
16617
16618
  /* Add the size of "_PROCEDURE_LINKAGE_TABLE_" too.  */
16619
0
  size += sizeof (asymbol) + sizeof (pltname);
16620
16621
0
  if (!bfd_malloc_and_get_section (abfd, plt, &plt_data))
16622
0
    return -1;
16623
16624
0
  if (plt->size < 16)
16625
0
    return -1;
16626
16627
0
  s = *ret = bfd_malloc (size);
16628
0
  if (s == NULL)
16629
0
    return -1;
16630
0
  send = s + 2 * count + 1;
16631
16632
0
  names = (char *) send;
16633
0
  nend = (char *) s + size;
16634
0
  n = 0;
16635
16636
0
  opcode = bfd_get_micromips_32 (abfd, plt_data + 12);
16637
0
  if (opcode == 0x3302fffe)
16638
0
    {
16639
0
      if (!micromips_p)
16640
0
  return -1;
16641
0
      plt0_size = 2 * ARRAY_SIZE (micromips_o32_exec_plt0_entry);
16642
0
      other = STO_MICROMIPS;
16643
0
    }
16644
0
  else if (opcode == 0x0398c1d0)
16645
0
    {
16646
0
      if (!micromips_p)
16647
0
  return -1;
16648
0
      plt0_size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry);
16649
0
      other = STO_MICROMIPS;
16650
0
    }
16651
0
  else
16652
0
    {
16653
0
      plt0_size = 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry);
16654
0
      other = 0;
16655
0
    }
16656
16657
0
  s->the_bfd = abfd;
16658
0
  s->flags = BSF_SYNTHETIC | BSF_FUNCTION | BSF_LOCAL;
16659
0
  s->section = plt;
16660
0
  s->value = 0;
16661
0
  s->name = names;
16662
0
  s->udata.i = other;
16663
0
  memcpy (names, pltname, sizeof (pltname));
16664
0
  names += sizeof (pltname);
16665
0
  ++s, ++n;
16666
16667
0
  pi = 0;
16668
0
  for (plt_offset = plt0_size;
16669
0
       plt_offset + 8 <= plt->size && s < send;
16670
0
       plt_offset += entry_size)
16671
0
    {
16672
0
      bfd_vma gotplt_addr;
16673
0
      const char *suffix;
16674
0
      bfd_vma gotplt_hi;
16675
0
      bfd_vma gotplt_lo;
16676
0
      size_t suffixlen;
16677
16678
0
      opcode = bfd_get_micromips_32 (abfd, plt_data + plt_offset + 4);
16679
16680
      /* Check if the second word matches the expected MIPS16 instruction.  */
16681
0
      if (opcode == 0x651aeb00)
16682
0
  {
16683
0
    if (micromips_p)
16684
0
      return -1;
16685
    /* Truncated table???  */
16686
0
    if (plt_offset + 16 > plt->size)
16687
0
      break;
16688
0
    gotplt_addr = bfd_get_32 (abfd, plt_data + plt_offset + 12);
16689
0
    entry_size = 2 * ARRAY_SIZE (mips16_o32_exec_plt_entry);
16690
0
    suffixlen = sizeof (m16suffix);
16691
0
    suffix = m16suffix;
16692
0
    other = STO_MIPS16;
16693
0
  }
16694
      /* Likewise the expected microMIPS instruction (no insn32 mode).  */
16695
0
      else if (opcode == 0xff220000)
16696
0
  {
16697
0
    if (!micromips_p)
16698
0
      return -1;
16699
0
    gotplt_hi = bfd_get_16 (abfd, plt_data + plt_offset) & 0x7f;
16700
0
    gotplt_lo = bfd_get_16 (abfd, plt_data + plt_offset + 2) & 0xffff;
16701
0
    gotplt_hi = ((gotplt_hi ^ 0x40) - 0x40) << 18;
16702
0
    gotplt_lo <<= 2;
16703
0
    gotplt_addr = gotplt_hi + gotplt_lo;
16704
0
    gotplt_addr += ((plt->vma + plt_offset) | 3) ^ 3;
16705
0
    entry_size = 2 * ARRAY_SIZE (micromips_o32_exec_plt_entry);
16706
0
    suffixlen = sizeof (microsuffix);
16707
0
    suffix = microsuffix;
16708
0
    other = STO_MICROMIPS;
16709
0
  }
16710
      /* Likewise the expected microMIPS instruction (insn32 mode).  */
16711
0
      else if ((opcode & 0xffff0000) == 0xff2f0000)
16712
0
  {
16713
0
    gotplt_hi = bfd_get_16 (abfd, plt_data + plt_offset + 2) & 0xffff;
16714
0
    gotplt_lo = bfd_get_16 (abfd, plt_data + plt_offset + 6) & 0xffff;
16715
0
    gotplt_hi = ((gotplt_hi ^ 0x8000) - 0x8000) << 16;
16716
0
    gotplt_lo = (gotplt_lo ^ 0x8000) - 0x8000;
16717
0
    gotplt_addr = gotplt_hi + gotplt_lo;
16718
0
    entry_size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt_entry);
16719
0
    suffixlen = sizeof (microsuffix);
16720
0
    suffix = microsuffix;
16721
0
    other = STO_MICROMIPS;
16722
0
  }
16723
      /* Otherwise assume standard MIPS code.  */
16724
0
      else
16725
0
  {
16726
0
    gotplt_hi = bfd_get_32 (abfd, plt_data + plt_offset) & 0xffff;
16727
0
    gotplt_lo = bfd_get_32 (abfd, plt_data + plt_offset + 4) & 0xffff;
16728
0
    gotplt_hi = ((gotplt_hi ^ 0x8000) - 0x8000) << 16;
16729
0
    gotplt_lo = (gotplt_lo ^ 0x8000) - 0x8000;
16730
0
    gotplt_addr = gotplt_hi + gotplt_lo;
16731
0
    entry_size = 4 * ARRAY_SIZE (mips_exec_plt_entry);
16732
0
    suffixlen = sizeof (mipssuffix);
16733
0
    suffix = mipssuffix;
16734
0
    other = 0;
16735
0
  }
16736
      /* Truncated table???  */
16737
0
      if (plt_offset + entry_size > plt->size)
16738
0
  break;
16739
16740
0
      for (i = 0;
16741
0
     i < count && p[pi].address != gotplt_addr;
16742
0
     i++, pi = (pi + bed->s->int_rels_per_ext_rel) % counti);
16743
16744
0
      if (i < count)
16745
0
  {
16746
0
    size_t namelen;
16747
0
    size_t len;
16748
16749
0
    *s = **p[pi].sym_ptr_ptr;
16750
    /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set.  Since
16751
       we are defining a symbol, ensure one of them is set.  */
16752
0
    if ((s->flags & BSF_LOCAL) == 0)
16753
0
      s->flags |= BSF_GLOBAL;
16754
0
    s->flags |= BSF_SYNTHETIC;
16755
0
    s->section = plt;
16756
0
    s->value = plt_offset;
16757
0
    s->name = names;
16758
0
    s->udata.i = other;
16759
16760
0
    len = strlen ((*p[pi].sym_ptr_ptr)->name);
16761
0
    namelen = len + suffixlen;
16762
0
    if (names + namelen > nend)
16763
0
      break;
16764
16765
0
    memcpy (names, (*p[pi].sym_ptr_ptr)->name, len);
16766
0
    names += len;
16767
0
    memcpy (names, suffix, suffixlen);
16768
0
    names += suffixlen;
16769
16770
0
    ++s, ++n;
16771
0
    pi = (pi + bed->s->int_rels_per_ext_rel) % counti;
16772
0
  }
16773
0
    }
16774
16775
0
  free (plt_data);
16776
16777
0
  return n;
16778
0
}
16779
16780
/* Return the ABI flags associated with ABFD if available.  */
16781
16782
Elf_Internal_ABIFlags_v0 *
16783
bfd_mips_elf_get_abiflags (bfd *abfd)
16784
1.91M
{
16785
1.91M
  struct mips_elf_obj_tdata *tdata = mips_elf_tdata (abfd);
16786
16787
1.91M
  return tdata->abiflags_valid ? &tdata->abiflags : NULL;
16788
1.91M
}
16789
16790
/* MIPS libc ABI versions, used with the EI_ABIVERSION ELF file header
16791
   field.  Taken from `libc-abis.h' generated at GNU libc build time.
16792
   Using a MIPS_ prefix as other libc targets use different values.  */
16793
enum
16794
{
16795
  MIPS_LIBC_ABI_DEFAULT = 0,
16796
  MIPS_LIBC_ABI_MIPS_PLT,
16797
  MIPS_LIBC_ABI_UNIQUE,
16798
  MIPS_LIBC_ABI_MIPS_O32_FP64,
16799
  MIPS_LIBC_ABI_ABSOLUTE,
16800
  MIPS_LIBC_ABI_XHASH,
16801
  MIPS_LIBC_ABI_MAX
16802
};
16803
16804
bool
16805
_bfd_mips_init_file_header (bfd *abfd, struct bfd_link_info *link_info)
16806
2
{
16807
2
  struct mips_elf_link_hash_table *htab = NULL;
16808
2
  Elf_Internal_Ehdr *i_ehdrp;
16809
16810
2
  if (!_bfd_elf_init_file_header (abfd, link_info))
16811
0
    return false;
16812
16813
2
  i_ehdrp = elf_elfheader (abfd);
16814
2
  if (link_info)
16815
0
    {
16816
0
      htab = mips_elf_hash_table (link_info);
16817
0
      BFD_ASSERT (htab != NULL);
16818
0
    }
16819
16820
2
  if (htab != NULL
16821
2
      && htab->use_plts_and_copy_relocs
16822
2
      && htab->root.target_os != is_vxworks)
16823
0
    i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_MIPS_PLT;
16824
16825
2
  if (mips_elf_tdata (abfd)->abiflags.fp_abi == Val_GNU_MIPS_ABI_FP_64
16826
2
      || mips_elf_tdata (abfd)->abiflags.fp_abi == Val_GNU_MIPS_ABI_FP_64A)
16827
0
    i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_MIPS_O32_FP64;
16828
16829
  /* Mark that we need support for absolute symbols in the dynamic loader.  */
16830
2
  if (htab != NULL && htab->use_absolute_zero && htab->gnu_target)
16831
0
    i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_ABSOLUTE;
16832
16833
  /* Mark that we need support for .MIPS.xhash in the dynamic linker,
16834
     if it is the only hash section that will be created.  */
16835
2
  if (link_info && link_info->emit_gnu_hash && !link_info->emit_hash)
16836
0
    i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_XHASH;
16837
2
  return true;
16838
2
}
16839
16840
int
16841
_bfd_mips_elf_compact_eh_encoding
16842
  (struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
16843
0
{
16844
0
  return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
16845
0
}
16846
16847
/* Return the opcode for can't unwind.  */
16848
16849
int
16850
_bfd_mips_elf_cant_unwind_opcode
16851
  (struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
16852
0
{
16853
0
  return COMPACT_EH_CANT_UNWIND_OPCODE;
16854
0
}
16855
16856
/* Record a position XLAT_LOC in the xlat translation table, associated with
16857
   the hash entry H.  The entry in the translation table will later be
16858
   populated with the real symbol dynindx.  */
16859
16860
void
16861
_bfd_mips_elf_record_xhash_symbol (struct elf_link_hash_entry *h,
16862
           bfd_vma xlat_loc)
16863
0
{
16864
0
  struct mips_elf_link_hash_entry *hmips;
16865
16866
0
  hmips = (struct mips_elf_link_hash_entry *) h;
16867
0
  hmips->mipsxhash_loc = xlat_loc;
16868
0
}