Coverage Report

Created: 2026-03-10 08:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/bfd/elfxx-mips.c
Line
Count
Source
1
/* MIPS-specific support for ELF
2
   Copyright (C) 1993-2026 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
/* Used to store a REL high-part relocation, such as R_MIPS_HI16 or
226
   R_MIPS_GOT16.  REL is the relocation.  DATA nominally points to the
227
   start of the section  contents, but note that gas may use multiple
228
   chunks of memory for a section (with DATA + [offset,offset+frag_size)
229
   addressing a given frag).  A HI16 reloc might need a different "data"
230
   from a lo16.  OUTPUT_BFD is the output BFD for relocatable output or
231
   a NULL pointer otherwise.  */
232
233
struct mips_hi16
234
{
235
  struct mips_hi16 *next;
236
  bfd *output_bfd;
237
  bfd_byte *data;
238
  arelent rel;
239
};
240
241
struct _mips_elf_section_data
242
{
243
  struct bfd_elf_section_data elf;
244
  union
245
  {
246
    bfd_byte *tdata;
247
  } u;
248
249
  struct mips_hi16 *mips_hi16_list;
250
};
251
252
#define mips_elf_section_data(sec) \
253
45.3k
  ((struct _mips_elf_section_data *) elf_section_data (sec))
254
255
#define is_mips_elf(bfd)        \
256
0
  (bfd_get_flavour (bfd) == bfd_target_elf_flavour  \
257
0
   && elf_tdata (bfd) != NULL        \
258
0
   && elf_object_id (bfd) == MIPS_ELF_DATA)
259
260
/* The ABI says that every symbol used by dynamic relocations must have
261
   a global GOT entry.  Among other things, this provides the dynamic
262
   linker with a free, directly-indexed cache.  The GOT can therefore
263
   contain symbols that are not referenced by GOT relocations themselves
264
   (in other words, it may have symbols that are not referenced by things
265
   like R_MIPS_GOT16 and R_MIPS_GOT_PAGE).
266
267
   GOT relocations are less likely to overflow if we put the associated
268
   GOT entries towards the beginning.  We therefore divide the global
269
   GOT entries into two areas: "normal" and "reloc-only".  Entries in
270
   the first area can be used for both dynamic relocations and GP-relative
271
   accesses, while those in the "reloc-only" area are for dynamic
272
   relocations only.
273
274
   These GGA_* ("Global GOT Area") values are organised so that lower
275
   values are more general than higher values.  Also, non-GGA_NONE
276
   values are ordered by the position of the area in the GOT.  */
277
0
#define GGA_NORMAL 0
278
0
#define GGA_RELOC_ONLY 1
279
0
#define GGA_NONE 2
280
281
/* Information about a non-PIC interface to a PIC function.  There are
282
   two ways of creating these interfaces.  The first is to add:
283
284
  lui $25,%hi(func)
285
  addiu $25,$25,%lo(func)
286
287
   immediately before a PIC function "func".  The second is to add:
288
289
  lui $25,%hi(func)
290
  j func
291
  addiu $25,$25,%lo(func)
292
293
   to a separate trampoline section.
294
295
   Stubs of the first kind go in a new section immediately before the
296
   target function.  Stubs of the second kind go in a single section
297
   pointed to by the hash table's "strampoline" field.  */
298
struct mips_elf_la25_stub {
299
  /* The generated section that contains this stub.  */
300
  asection *stub_section;
301
302
  /* The offset of the stub from the start of STUB_SECTION.  */
303
  bfd_vma offset;
304
305
  /* One symbol for the original function.  Its location is available
306
     in H->root.root.u.def.  */
307
  struct mips_elf_link_hash_entry *h;
308
};
309
310
/* Macros for populating a mips_elf_la25_stub.  */
311
312
#define LA25_LUI(VAL) (0x3c190000 | (VAL))  /* lui t9,VAL */
313
#define LA25_J(VAL) (0x08000000 | (((VAL) >> 2) & 0x3ffffff)) /* j VAL */
314
#define LA25_BC(VAL) (0xc8000000 | (((VAL) >> 2) & 0x3ffffff)) /* bc VAL */
315
#define LA25_ADDIU(VAL) (0x27390000 | (VAL))  /* addiu t9,t9,VAL */
316
#define LA25_LUI_MICROMIPS(VAL)           \
317
0
  (0x41b90000 | (VAL))        /* lui t9,VAL */
318
#define LA25_J_MICROMIPS(VAL)           \
319
0
  (0xd4000000 | (((VAL) >> 1) & 0x3ffffff))  /* j VAL */
320
#define LA25_ADDIU_MICROMIPS(VAL)         \
321
0
  (0x33390000 | (VAL))        /* addiu t9,t9,VAL */
322
323
/* This structure is passed to mips_elf_sort_hash_table_f when sorting
324
   the dynamic symbols.  */
325
326
struct mips_elf_hash_sort_data
327
{
328
  /* The symbol in the global GOT with the lowest dynamic symbol table
329
     index.  */
330
  struct elf_link_hash_entry *low;
331
  /* The least dynamic symbol table index corresponding to a non-TLS
332
     symbol with a GOT entry.  */
333
  bfd_size_type min_got_dynindx;
334
  /* The greatest dynamic symbol table index corresponding to a symbol
335
     with a GOT entry that is not referenced (e.g., a dynamic symbol
336
     with dynamic relocations pointing to it from non-primary GOTs).  */
337
  bfd_size_type max_unref_got_dynindx;
338
  /* The greatest dynamic symbol table index corresponding to a local
339
     symbol.  */
340
  bfd_size_type max_local_dynindx;
341
  /* The greatest dynamic symbol table index corresponding to an external
342
     symbol without a GOT entry.  */
343
  bfd_size_type max_non_got_dynindx;
344
  /* If non-NULL, output BFD for .MIPS.xhash finalization.  */
345
  bfd *output_bfd;
346
  /* If non-NULL, pointer to contents of .MIPS.xhash for filling in
347
     real final dynindx.  */
348
  bfd_byte *mipsxhash;
349
};
350
351
/* We make up to two PLT entries if needed, one for standard MIPS code
352
   and one for compressed code, either a MIPS16 or microMIPS one.  We
353
   keep a separate record of traditional lazy-binding stubs, for easier
354
   processing.  */
355
356
struct plt_entry
357
{
358
  /* Traditional SVR4 stub offset, or -1 if none.  */
359
  bfd_vma stub_offset;
360
361
  /* Standard PLT entry offset, or -1 if none.  */
362
  bfd_vma mips_offset;
363
364
  /* Compressed PLT entry offset, or -1 if none.  */
365
  bfd_vma comp_offset;
366
367
  /* The corresponding .got.plt index, or -1 if none.  */
368
  bfd_vma gotplt_index;
369
370
  /* Whether we need a standard PLT entry.  */
371
  unsigned int need_mips : 1;
372
373
  /* Whether we need a compressed PLT entry.  */
374
  unsigned int need_comp : 1;
375
};
376
377
/* The MIPS ELF linker needs additional information for each symbol in
378
   the global hash table.  */
379
380
struct mips_elf_link_hash_entry
381
{
382
  struct elf_link_hash_entry root;
383
384
  /* External symbol information.  */
385
  EXTR esym;
386
387
  /* The la25 stub we have created for ths symbol, if any.  */
388
  struct mips_elf_la25_stub *la25_stub;
389
390
  /* Number of R_MIPS_32, R_MIPS_REL32, or R_MIPS_64 relocs against
391
     this symbol.  */
392
  unsigned int possibly_dynamic_relocs;
393
394
  /* If there is a stub that 32 bit functions should use to call this
395
     16 bit function, this points to the section containing the stub.  */
396
  asection *fn_stub;
397
398
  /* If there is a stub that 16 bit functions should use to call this
399
     32 bit function, this points to the section containing the stub.  */
400
  asection *call_stub;
401
402
  /* This is like the call_stub field, but it is used if the function
403
     being called returns a floating point value.  */
404
  asection *call_fp_stub;
405
406
  /* If non-zero, location in .MIPS.xhash to write real final dynindx.  */
407
  bfd_vma mipsxhash_loc;
408
409
  /* The highest GGA_* value that satisfies all references to this symbol.  */
410
  unsigned int global_got_area : 2;
411
412
  /* True if all GOT relocations against this symbol are for calls.  This is
413
     a looser condition than no_fn_stub below, because there may be other
414
     non-call non-GOT relocations against the symbol.  */
415
  unsigned int got_only_for_calls : 1;
416
417
  /* True if one of the relocations described by possibly_dynamic_relocs
418
     is against a readonly section.  */
419
  unsigned int readonly_reloc : 1;
420
421
  /* True if there is a relocation against this symbol that must be
422
     resolved by the static linker (in other words, if the relocation
423
     cannot possibly be made dynamic).  */
424
  unsigned int has_static_relocs : 1;
425
426
  /* True if we must not create a .MIPS.stubs entry for this symbol.
427
     This is set, for example, if there are relocations related to
428
     taking the function's address, i.e. any but R_MIPS_CALL*16 ones.
429
     See "MIPS ABI Supplement, 3rd Edition", p. 4-20.  */
430
  unsigned int no_fn_stub : 1;
431
432
  /* Whether we need the fn_stub; this is true if this symbol appears
433
     in any relocs other than a 16 bit call.  */
434
  unsigned int need_fn_stub : 1;
435
436
  /* True if this symbol is referenced by branch relocations from
437
     any non-PIC input file.  This is used to determine whether an
438
     la25 stub is required.  */
439
  unsigned int has_nonpic_branches : 1;
440
441
  /* Does this symbol need a traditional MIPS lazy-binding stub
442
     (as opposed to a PLT entry)?  */
443
  unsigned int needs_lazy_stub : 1;
444
445
  /* Does this symbol resolve to a PLT entry?  */
446
  unsigned int use_plt_entry : 1;
447
};
448
449
/* MIPS ELF linker hash table.  */
450
451
struct mips_elf_link_hash_table
452
{
453
  struct elf_link_hash_table root;
454
455
  /* The number of .rtproc entries.  */
456
  bfd_size_type procedure_count;
457
458
  /* The size of the .compact_rel section (if SGI_COMPAT).  */
459
  bfd_size_type compact_rel_size;
460
461
  /* This flag indicates that the value of DT_MIPS_RLD_MAP dynamic entry
462
     is set to the address of __rld_obj_head as in IRIX5 and IRIX6.  */
463
  bool use_rld_obj_head;
464
465
  /* The  __rld_map or __rld_obj_head symbol. */
466
  struct elf_link_hash_entry *rld_symbol;
467
468
  /* This is set if we see any mips16 stub sections.  */
469
  bool mips16_stubs_seen;
470
471
  /* True if we can generate copy relocs and PLTs.  */
472
  bool use_plts_and_copy_relocs;
473
474
  /* True if we can only use 32-bit microMIPS instructions.  */
475
  bool insn32;
476
477
  /* True if we suppress checks for invalid branches between ISA modes.  */
478
  bool ignore_branch_isa;
479
480
  /* True if we are targetting R6 compact branches.  */
481
  bool compact_branches;
482
483
  /* True if we already reported the small-data section overflow.  */
484
  bool small_data_overflow_reported;
485
486
  /* True if we use the special `__gnu_absolute_zero' symbol.  */
487
  bool use_absolute_zero;
488
489
  /* True if we have been configured for a GNU target.  */
490
  bool gnu_target;
491
492
  /* Shortcuts to some dynamic sections, or NULL if they are not
493
     being used.  */
494
  asection *srelplt2;
495
  asection *sstubs;
496
497
  /* The master GOT information.  */
498
  struct mips_got_info *got_info;
499
500
  /* The global symbol in the GOT with the lowest index in the dynamic
501
     symbol table.  */
502
  struct elf_link_hash_entry *global_gotsym;
503
504
  /* The size of the PLT header in bytes.  */
505
  bfd_vma plt_header_size;
506
507
  /* The size of a standard PLT entry in bytes.  */
508
  bfd_vma plt_mips_entry_size;
509
510
  /* The size of a compressed PLT entry in bytes.  */
511
  bfd_vma plt_comp_entry_size;
512
513
  /* The offset of the next standard PLT entry to create.  */
514
  bfd_vma plt_mips_offset;
515
516
  /* The offset of the next compressed PLT entry to create.  */
517
  bfd_vma plt_comp_offset;
518
519
  /* The index of the next .got.plt entry to create.  */
520
  bfd_vma plt_got_index;
521
522
  /* The number of functions that need a lazy-binding stub.  */
523
  bfd_vma lazy_stub_count;
524
525
  /* The size of a function stub entry in bytes.  */
526
  bfd_vma function_stub_size;
527
528
  /* The number of reserved entries at the beginning of the GOT.  */
529
  unsigned int reserved_gotno;
530
531
  /* The section used for mips_elf_la25_stub trampolines.
532
     See the comment above that structure for details.  */
533
  asection *strampoline;
534
535
  /* A table of mips_elf_la25_stubs, indexed by (input_section, offset)
536
     pairs.  */
537
  htab_t la25_stubs;
538
539
  /* A function FN (NAME, IS, OS) that creates a new input section
540
     called NAME and links it to output section OS.  If IS is nonnull,
541
     the new section should go immediately before it, otherwise it
542
     should go at the (current) beginning of OS.
543
544
     The function returns the new section on success, otherwise it
545
     returns null.  */
546
  asection *(*add_stub_section) (const char *, asection *, asection *);
547
548
  /* Is the PLT header compressed?  */
549
  unsigned int plt_header_is_comp : 1;
550
};
551
552
/* Get the MIPS ELF linker hash table from a link_info structure.  */
553
554
#define mips_elf_hash_table(p) \
555
0
  ((is_elf_hash_table ((p)->hash)          \
556
0
    && elf_hash_table_id (elf_hash_table (p)) == MIPS_ELF_DATA)   \
557
0
   ? (struct mips_elf_link_hash_table *) (p)->hash : NULL)
558
559
/* A structure used to communicate with htab_traverse callbacks.  */
560
struct mips_htab_traverse_info
561
{
562
  /* The usual link-wide information.  */
563
  struct bfd_link_info *info;
564
  bfd *output_bfd;
565
566
  /* Starts off FALSE and is set to TRUE if the link should be aborted.  */
567
  bool error;
568
};
569
570
/* MIPS ELF private object data.  */
571
572
struct mips_elf_obj_tdata
573
{
574
  /* Generic ELF private object data.  */
575
  struct elf_obj_tdata root;
576
577
  /* Input BFD providing Tag_GNU_MIPS_ABI_FP attribute for output.  */
578
  bfd *abi_fp_bfd;
579
580
  /* Input BFD providing Tag_GNU_MIPS_ABI_MSA attribute for output.  */
581
  bfd *abi_msa_bfd;
582
583
  /* The abiflags for this object.  */
584
  Elf_Internal_ABIFlags_v0 abiflags;
585
  bool abiflags_valid;
586
587
  /* The GOT requirements of input bfds.  */
588
  struct mips_got_info *got;
589
590
  /* Used by _bfd_mips_elf_find_nearest_line.  The structure could be
591
     included directly in this one, but there's no point to wasting
592
     the memory just for the infrequently called find_nearest_line.  */
593
  struct mips_elf_find_line *find_line_info;
594
595
  /* An array of stub sections indexed by symbol number.  */
596
  asection **local_stubs;
597
  asection **local_call_stubs;
598
599
  /* The Irix 5 support uses two virtual sections, which represent
600
     text/data symbols defined in dynamic objects.  */
601
  asection *elf_data_section;
602
  asection *elf_text_section;
603
};
604
605
/* Get MIPS ELF private object data from BFD's tdata.  */
606
607
#define mips_elf_tdata(bfd) \
608
433k
  ((struct mips_elf_obj_tdata *) (bfd)->tdata.any)
609
610
#define TLS_RELOC_P(r_type) \
611
0
  (r_type == R_MIPS_TLS_DTPMOD32    \
612
0
   || r_type == R_MIPS_TLS_DTPMOD64    \
613
0
   || r_type == R_MIPS_TLS_DTPREL32    \
614
0
   || r_type == R_MIPS_TLS_DTPREL64    \
615
0
   || r_type == R_MIPS_TLS_GD      \
616
0
   || r_type == R_MIPS_TLS_LDM      \
617
0
   || r_type == R_MIPS_TLS_DTPREL_HI16    \
618
0
   || r_type == R_MIPS_TLS_DTPREL_LO16    \
619
0
   || r_type == R_MIPS_TLS_GOTTPREL    \
620
0
   || r_type == R_MIPS_TLS_TPREL32    \
621
0
   || r_type == R_MIPS_TLS_TPREL64    \
622
0
   || r_type == R_MIPS_TLS_TPREL_HI16    \
623
0
   || r_type == R_MIPS_TLS_TPREL_LO16    \
624
0
   || r_type == R_MIPS16_TLS_GD      \
625
0
   || r_type == R_MIPS16_TLS_LDM    \
626
0
   || r_type == R_MIPS16_TLS_DTPREL_HI16  \
627
0
   || r_type == R_MIPS16_TLS_DTPREL_LO16  \
628
0
   || r_type == R_MIPS16_TLS_GOTTPREL    \
629
0
   || r_type == R_MIPS16_TLS_TPREL_HI16    \
630
0
   || r_type == R_MIPS16_TLS_TPREL_LO16    \
631
0
   || r_type == R_MICROMIPS_TLS_GD    \
632
0
   || r_type == R_MICROMIPS_TLS_LDM    \
633
0
   || r_type == R_MICROMIPS_TLS_DTPREL_HI16  \
634
0
   || r_type == R_MICROMIPS_TLS_DTPREL_LO16  \
635
0
   || r_type == R_MICROMIPS_TLS_GOTTPREL  \
636
0
   || r_type == R_MICROMIPS_TLS_TPREL_HI16  \
637
0
   || r_type == R_MICROMIPS_TLS_TPREL_LO16)
638
639
/* Structure used to pass information to mips_elf_output_extsym.  */
640
641
struct extsym_info
642
{
643
  bfd *abfd;
644
  struct bfd_link_info *info;
645
  struct ecoff_debug_info *debug;
646
  const struct ecoff_debug_swap *swap;
647
  bool failed;
648
};
649
650
/* The names of the runtime procedure table symbols used on IRIX5.  */
651
652
static const char * const mips_elf_dynsym_rtproc_names[] =
653
{
654
  "_procedure_table",
655
  "_procedure_string_table",
656
  "_procedure_table_size",
657
  NULL
658
};
659
660
/* These structures are used to generate the .compact_rel section on
661
   IRIX5.  */
662
663
typedef struct
664
{
665
  unsigned long id1;    /* Always one?  */
666
  unsigned long num;    /* Number of compact relocation entries.  */
667
  unsigned long id2;    /* Always two?  */
668
  unsigned long offset;   /* The file offset of the first relocation.  */
669
  unsigned long reserved0;  /* Zero?  */
670
  unsigned long reserved1;  /* Zero?  */
671
} Elf32_compact_rel;
672
673
typedef struct
674
{
675
  bfd_byte id1[4];
676
  bfd_byte num[4];
677
  bfd_byte id2[4];
678
  bfd_byte offset[4];
679
  bfd_byte reserved0[4];
680
  bfd_byte reserved1[4];
681
} Elf32_External_compact_rel;
682
683
typedef struct
684
{
685
  unsigned int ctype : 1; /* 1: long 0: short format. See below.  */
686
  unsigned int rtype : 4; /* Relocation types. See below.  */
687
  unsigned int dist2to : 8;
688
  unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
689
  unsigned long konst;    /* KONST field. See below.  */
690
  unsigned long vaddr;    /* VADDR to be relocated.  */
691
} Elf32_crinfo;
692
693
typedef struct
694
{
695
  unsigned int ctype : 1; /* 1: long 0: short format. See below.  */
696
  unsigned int rtype : 4; /* Relocation types. See below.  */
697
  unsigned int dist2to : 8;
698
  unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
699
  unsigned long konst;    /* KONST field. See below.  */
700
} Elf32_crinfo2;
701
702
typedef struct
703
{
704
  bfd_byte info[4];
705
  bfd_byte konst[4];
706
  bfd_byte vaddr[4];
707
} Elf32_External_crinfo;
708
709
typedef struct
710
{
711
  bfd_byte info[4];
712
  bfd_byte konst[4];
713
} Elf32_External_crinfo2;
714
715
/* These are the constants used to swap the bitfields in a crinfo.  */
716
717
0
#define CRINFO_CTYPE (0x1U)
718
0
#define CRINFO_CTYPE_SH (31)
719
0
#define CRINFO_RTYPE (0xfU)
720
0
#define CRINFO_RTYPE_SH (27)
721
0
#define CRINFO_DIST2TO (0xffU)
722
0
#define CRINFO_DIST2TO_SH (19)
723
0
#define CRINFO_RELVADDR (0x7ffffU)
724
0
#define CRINFO_RELVADDR_SH (0)
725
726
/* A compact relocation info has long (3 words) or short (2 words)
727
   formats.  A short format doesn't have VADDR field and relvaddr
728
   fields contains ((VADDR - vaddr of the previous entry) >> 2).  */
729
#define CRF_MIPS_LONG     1
730
#define CRF_MIPS_SHORT      0
731
732
/* There are 4 types of compact relocation at least. The value KONST
733
   has different meaning for each type:
734
735
   (type)   (konst)
736
   CT_MIPS_REL32  Address in data
737
   CT_MIPS_WORD   Address in word (XXX)
738
   CT_MIPS_GPHI_LO  GP - vaddr
739
   CT_MIPS_JMPAD  Address to jump
740
   */
741
742
#define CRT_MIPS_REL32      0xa
743
#define CRT_MIPS_WORD     0xb
744
#define CRT_MIPS_GPHI_LO    0xc
745
#define CRT_MIPS_JMPAD      0xd
746
747
0
#define mips_elf_set_cr_format(x,format)  ((x).ctype = (format))
748
0
#define mips_elf_set_cr_type(x,type)    ((x).rtype = (type))
749
0
#define mips_elf_set_cr_dist2to(x,v)    ((x).dist2to = (v))
750
0
#define mips_elf_set_cr_relvaddr(x,d)   ((x).relvaddr = (d)<<2)
751

752
/* The structure of the runtime procedure descriptor created by the
753
   loader for use by the static exception system.  */
754
755
typedef struct runtime_pdr {
756
  bfd_vma adr;    /* Memory address of start of procedure.  */
757
  long  regmask;  /* Save register mask.  */
758
  long  regoffset;  /* Save register offset.  */
759
  long  fregmask; /* Save floating point register mask.  */
760
  long  fregoffset; /* Save floating point register offset.  */
761
  long  frameoffset;  /* Frame size.  */
762
  short framereg; /* Frame pointer register.  */
763
  short pcreg;    /* Offset or reg of return pc.  */
764
  long  irpss;    /* Index into the runtime string table.  */
765
  long  reserved;
766
  struct exception_info *exception_info;/* Pointer to exception array.  */
767
} RPDR, *pRPDR;
768
#define cbRPDR sizeof (RPDR)
769
#define rpdNil ((pRPDR) 0)
770

771
static struct mips_got_entry *mips_elf_create_local_got_entry
772
  (bfd *, struct bfd_link_info *, bfd *, bfd_vma, unsigned long,
773
   struct mips_elf_link_hash_entry *, int);
774
static bool mips_elf_sort_hash_table_f
775
  (struct mips_elf_link_hash_entry *, void *);
776
static bfd_vma mips_elf_high
777
  (bfd_vma);
778
static bool mips_elf_create_dynamic_relocation
779
  (bfd *, struct bfd_link_info *, const Elf_Internal_Rela *,
780
   struct mips_elf_link_hash_entry *, asection *, bfd_vma,
781
   bfd_vma *, asection *);
782
static bfd_vma mips_elf_adjust_gp
783
  (bfd *, struct mips_got_info *, bfd *);
784
static bool mips_elf_free_hi16_list
785
  (bfd *, asection *, bool, struct bfd_link_info *);
786
787
/* This will be used when we sort the dynamic relocation records.  */
788
static bfd *reldyn_sorting_bfd;
789
790
/* True if ABFD is for CPUs with load interlocking that include
791
   non-MIPS1 CPUs and R3900.  */
792
#define LOAD_INTERLOCKS_P(abfd) \
793
0
  (   ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) != EF_MIPS_ARCH_1) \
794
0
   || ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == EF_MIPS_MACH_3900))
795
796
/* True if ABFD is for CPUs that are faster if JAL is converted to BAL.
797
   This should be safe for all architectures.  We enable this predicate
798
   for RM9000 for now.  */
799
#define JAL_TO_BAL_P(abfd) \
800
0
  ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == EF_MIPS_MACH_9000)
801
802
/* True if ABFD is for CPUs that are faster if JALR is converted to BAL.
803
   This should be safe for all architectures.  We enable this predicate for
804
   all CPUs.  */
805
0
#define JALR_TO_BAL_P(abfd) 1
806
807
/* True if ABFD is for CPUs that are faster if JR is converted to B.
808
   This should be safe for all architectures.  We enable this predicate for
809
   all CPUs.  */
810
0
#define JR_TO_B_P(abfd) 1
811
812
/* True if ABFD is a PIC object.  */
813
#define PIC_OBJECT_P(abfd) \
814
0
  ((elf_elfheader (abfd)->e_flags & EF_MIPS_PIC) != 0)
815
816
/* Nonzero if ABFD is using the O32 ABI.  */
817
#define ABI_O32_P(abfd) \
818
  ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == EF_MIPS_ABI_O32)
819
820
/* Nonzero if ABFD is using the N32 ABI.  */
821
#define ABI_N32_P(abfd) \
822
430
  ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
823
824
/* Nonzero if ABFD is using NewABI conventions.  */
825
190
#define NEWABI_P(abfd) (ABI_N32_P (abfd) || ABI_64_P (abfd))
826
827
/* Nonzero if ABFD has microMIPS code.  */
828
#define MICROMIPS_P(abfd) \
829
116
  ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS) != 0)
830
831
/* Nonzero if ABFD is MIPS R6.  */
832
#define MIPSR6_P(abfd) \
833
0
  ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32R6 \
834
0
    || (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_64R6)
835
836
/* The IRIX compatibility level we are striving for.  */
837
#define IRIX_COMPAT(abfd) \
838
214
  (get_elf_backend_data (abfd)->elf_backend_mips_irix_compat (abfd))
839
840
/* Whether we are trying to be compatible with IRIX at all.  */
841
#define SGI_COMPAT(abfd) \
842
352
  (IRIX_COMPAT (abfd) != ict_none)
843
844
/* The name of the options section.  */
845
#define MIPS_ELF_OPTIONS_SECTION_NAME(abfd) \
846
102
  (NEWABI_P (abfd) ? ".MIPS.options" : ".options")
847
848
/* True if NAME is the recognized name of any SHT_MIPS_OPTIONS section.
849
   Some IRIX system files do not use MIPS_ELF_OPTIONS_SECTION_NAME.  */
850
#define MIPS_ELF_OPTIONS_SECTION_NAME_P(NAME) \
851
479
  (strcmp (NAME, ".MIPS.options") == 0 || strcmp (NAME, ".options") == 0)
852
853
/* True if NAME is the recognized name of any SHT_MIPS_ABIFLAGS section.  */
854
#define MIPS_ELF_ABIFLAGS_SECTION_NAME_P(NAME) \
855
64
  (strcmp (NAME, ".MIPS.abiflags") == 0)
856
857
/* Whether the section is readonly.  */
858
#define MIPS_ELF_READONLY_SECTION(sec) \
859
0
  ((sec->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))    \
860
0
   == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
861
862
/* The name of the stub section.  */
863
0
#define MIPS_ELF_STUB_SECTION_NAME(abfd) ".MIPS.stubs"
864
865
/* The size of an external REL relocation.  */
866
#define MIPS_ELF_REL_SIZE(abfd) \
867
0
  (get_elf_backend_data (abfd)->s->sizeof_rel)
868
869
/* The size of an external RELA relocation.  */
870
#define MIPS_ELF_RELA_SIZE(abfd) \
871
0
  (get_elf_backend_data (abfd)->s->sizeof_rela)
872
873
/* The size of an external dynamic table entry.  */
874
#define MIPS_ELF_DYN_SIZE(abfd) \
875
0
  (get_elf_backend_data (abfd)->s->sizeof_dyn)
876
877
/* The size of a GOT entry.  */
878
#define MIPS_ELF_GOT_SIZE(abfd) \
879
0
  (get_elf_backend_data (abfd)->s->arch_size / 8)
880
881
/* The size of the .rld_map section. */
882
#define MIPS_ELF_RLD_MAP_SIZE(abfd) \
883
0
  (get_elf_backend_data (abfd)->s->arch_size / 8)
884
885
/* The size of a symbol-table entry.  */
886
#define MIPS_ELF_SYM_SIZE(abfd) \
887
0
  (get_elf_backend_data (abfd)->s->sizeof_sym)
888
889
/* The default alignment for sections, as a power of two.  */
890
#define MIPS_ELF_LOG_FILE_ALIGN(abfd)       \
891
0
  (get_elf_backend_data (abfd)->s->log_file_align)
892
893
/* Get word-sized data.  */
894
#define MIPS_ELF_GET_WORD(abfd, ptr) \
895
  (ABI_64_P (abfd) ? bfd_get_64 (abfd, ptr) : bfd_get_32 (abfd, ptr))
896
897
/* Put out word-sized data.  */
898
#define MIPS_ELF_PUT_WORD(abfd, val, ptr) \
899
0
  (ABI_64_P (abfd)       \
900
0
   ? bfd_put_64 (abfd, val, ptr)   \
901
0
   : bfd_put_32 (abfd, val, ptr))
902
903
/* The opcode for word-sized loads (LW or LD).  */
904
#define MIPS_ELF_LOAD_WORD(abfd) \
905
0
  (ABI_64_P (abfd) ? 0xdc000000 : 0x8c000000)
906
907
/* Add a dynamic symbol table-entry.  */
908
#define MIPS_ELF_ADD_DYNAMIC_ENTRY(info, tag, val)  \
909
0
  _bfd_elf_add_dynamic_entry (info, tag, val)
910
911
#define MIPS_ELF_RTYPE_TO_HOWTO(abfd, rtype, rela)      \
912
0
  (get_elf_backend_data (abfd)->elf_backend_mips_rtype_to_howto (abfd, rtype, rela))
913
914
/* The name of the dynamic relocation section.  */
915
#define MIPS_ELF_REL_DYN_NAME(INFO) \
916
0
  (mips_elf_hash_table (INFO)->root.target_os == is_vxworks \
917
0
   ? ".rela.dyn" : ".rel.dyn")
918
919
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
920
   from smaller values.  Start with zero, widen, *then* decrement.  */
921
0
#define MINUS_ONE (((bfd_vma)0) - 1)
922
0
#define MINUS_TWO (((bfd_vma)0) - 2)
923
924
/* The value to write into got[1] for SVR4 targets, to identify it is
925
   a GNU object.  The dynamic linker can then use got[1] to store the
926
   module pointer.  */
927
#define MIPS_ELF_GNU_GOT1_MASK(abfd) \
928
  ((bfd_vma) 1 << (ABI_64_P (abfd) ? 63 : 31))
929
930
/* The offset of $gp from the beginning of the .got section.  */
931
#define ELF_MIPS_GP_OFFSET(INFO) \
932
0
  (mips_elf_hash_table (INFO)->root.target_os == is_vxworks \
933
0
   ? 0x0 : 0x7ff0)
934
935
/* The maximum size of the GOT for it to be addressable using 16-bit
936
   offsets from $gp.  */
937
0
#define MIPS_ELF_GOT_MAX_SIZE(INFO) (ELF_MIPS_GP_OFFSET (INFO) + 0x7fff)
938
939
/* Instructions which appear in a stub.  */
940
#define STUB_LW(abfd)             \
941
  ((ABI_64_P (abfd)             \
942
    ? 0xdf998010        /* ld t9,0x8010(gp) */  \
943
    : 0x8f998010))        /* lw t9,0x8010(gp) */
944
#define STUB_MOVE 0x03e07825      /* or t7,ra,zero */
945
#define STUB_LUI(VAL) (0x3c180000 + (VAL))  /* lui t8,VAL */
946
#define STUB_JALR 0x0320f809      /* jalr ra,t9 */
947
#define STUB_JALRC 0xf8190000     /* jalrc ra,t9 */
948
#define STUB_ORI(VAL) (0x37180000 + (VAL))  /* ori t8,t8,VAL */
949
#define STUB_LI16U(VAL) (0x34180000 + (VAL))  /* ori t8,zero,VAL unsigned */
950
#define STUB_LI16S(abfd, VAL)           \
951
   ((ABI_64_P (abfd)              \
952
    ? (0x64180000 + (VAL))  /* daddiu t8,zero,VAL sign extended */  \
953
    : (0x24180000 + (VAL))))  /* addiu t8,zero,VAL sign extended */
954
955
/* Likewise for the microMIPS ASE.  */
956
#define STUB_LW_MICROMIPS(abfd)           \
957
0
  (ABI_64_P (abfd)             \
958
0
   ? 0xdf3c8010          /* ld t9,0x8010(gp) */  \
959
0
   : 0xff3c8010)        /* lw t9,0x8010(gp) */
960
#define STUB_MOVE_MICROMIPS 0x0dff    /* move t7,ra */
961
0
#define STUB_MOVE32_MICROMIPS 0x001f7a90  /* or t7,ra,zero */
962
#define STUB_LUI_MICROMIPS(VAL)           \
963
0
   (0x41b80000 + (VAL))        /* lui t8,VAL */
964
#define STUB_JALR_MICROMIPS 0x45d9    /* jalr t9 */
965
0
#define STUB_JALR32_MICROMIPS 0x03f90f3c  /* jalr ra,t9 */
966
#define STUB_ORI_MICROMIPS(VAL)           \
967
0
  (0x53180000 + (VAL))        /* ori t8,t8,VAL */
968
#define STUB_LI16U_MICROMIPS(VAL)         \
969
0
  (0x53000000 + (VAL))        /* ori t8,zero,VAL unsigned */
970
#define STUB_LI16S_MICROMIPS(abfd, VAL)         \
971
0
   (ABI_64_P (abfd)             \
972
0
    ? 0x5f000000 + (VAL)  /* daddiu t8,zero,VAL sign extended */  \
973
0
    : 0x33000000 + (VAL))  /* addiu t8,zero,VAL sign extended */
974
975
0
#define MIPS_FUNCTION_STUB_NORMAL_SIZE 16
976
0
#define MIPS_FUNCTION_STUB_BIG_SIZE 20
977
0
#define MICROMIPS_FUNCTION_STUB_NORMAL_SIZE 12
978
0
#define MICROMIPS_FUNCTION_STUB_BIG_SIZE 16
979
0
#define MICROMIPS_INSN32_FUNCTION_STUB_NORMAL_SIZE 16
980
0
#define MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE 20
981
982
/* The name of the dynamic interpreter.  This is put in the .interp
983
   section.  */
984
985
#define ELF_DYNAMIC_INTERPRETER(abfd)   \
986
0
   (ABI_N32_P (abfd) ? "/usr/lib32/libc.so.1"  \
987
0
    : ABI_64_P (abfd) ? "/usr/lib64/libc.so.1"  \
988
0
    : "/usr/lib/libc.so.1")
989
990
#ifdef BFD64
991
#define MNAME(bfd,pre,pos) \
992
  (ABI_64_P (bfd) ? CONCAT4 (pre,64,_,pos) : CONCAT4 (pre,32,_,pos))
993
#define ELF_R_SYM(bfd, i)         \
994
0
  (ABI_64_P (bfd) ? ELF64_R_SYM (i) : ELF32_R_SYM (i))
995
#define ELF_R_TYPE(bfd, i)          \
996
0
  (ABI_64_P (bfd) ? ELF64_MIPS_R_TYPE (i) : ELF32_R_TYPE (i))
997
#define ELF_R_INFO(bfd, s, t)         \
998
0
  (ABI_64_P (bfd) ? ELF64_R_INFO (s, t) : ELF32_R_INFO (s, t))
999
#else
1000
#define MNAME(bfd,pre,pos) CONCAT4 (pre,32,_,pos)
1001
#define ELF_R_SYM(bfd, i)         \
1002
  (ELF32_R_SYM (i))
1003
#define ELF_R_TYPE(bfd, i)          \
1004
  (ELF32_R_TYPE (i))
1005
#define ELF_R_INFO(bfd, s, t)         \
1006
  (ELF32_R_INFO (s, t))
1007
#endif
1008

1009
  /* The mips16 compiler uses a couple of special sections to handle
1010
     floating point arguments.
1011
1012
     Section names that look like .mips16.fn.FNNAME contain stubs that
1013
     copy floating point arguments from the fp regs to the gp regs and
1014
     then jump to FNNAME.  If any 32 bit function calls FNNAME, the
1015
     call should be redirected to the stub instead.  If no 32 bit
1016
     function calls FNNAME, the stub should be discarded.  We need to
1017
     consider any reference to the function, not just a call, because
1018
     if the address of the function is taken we will need the stub,
1019
     since the address might be passed to a 32 bit function.
1020
1021
     Section names that look like .mips16.call.FNNAME contain stubs
1022
     that copy floating point arguments from the gp regs to the fp
1023
     regs and then jump to FNNAME.  If FNNAME is a 32 bit function,
1024
     then any 16 bit function that calls FNNAME should be redirected
1025
     to the stub instead.  If FNNAME is not a 32 bit function, the
1026
     stub should be discarded.
1027
1028
     .mips16.call.fp.FNNAME sections are similar, but contain stubs
1029
     which call FNNAME and then copy the return value from the fp regs
1030
     to the gp regs.  These stubs store the return value in $18 while
1031
     calling FNNAME; any function which might call one of these stubs
1032
     must arrange to save $18 around the call.  (This case is not
1033
     needed for 32 bit functions that call 16 bit functions, because
1034
     16 bit functions always return floating point values in both
1035
     $f0/$f1 and $2/$3.)
1036
1037
     Note that in all cases FNNAME might be defined statically.
1038
     Therefore, FNNAME is not used literally.  Instead, the relocation
1039
     information will indicate which symbol the section is for.
1040
1041
     We record any stubs that we find in the symbol table.  */
1042
1043
0
#define FN_STUB ".mips16.fn."
1044
0
#define CALL_STUB ".mips16.call."
1045
0
#define CALL_FP_STUB ".mips16.call.fp."
1046
1047
0
#define FN_STUB_P(name) startswith (name, FN_STUB)
1048
0
#define CALL_STUB_P(name) startswith (name, CALL_STUB)
1049
0
#define CALL_FP_STUB_P(name) startswith (name, CALL_FP_STUB)
1050

1051
/* The format of the first PLT entry in an O32 executable.  */
1052
static const bfd_vma mips_o32_exec_plt0_entry[] =
1053
{
1054
  0x3c1c0000, /* lui $28, %hi(&GOTPLT[0])       */
1055
  0x8f990000, /* lw $25, %lo(&GOTPLT[0])($28)       */
1056
  0x279c0000, /* addiu $28, $28, %lo(&GOTPLT[0])      */
1057
  0x031cc023, /* subu $24, $24, $28         */
1058
  0x03e07825, /* or t7, ra, zero          */
1059
  0x0018c082, /* srl $24, $24, 2          */
1060
  0x0320f809, /* jalr $25           */
1061
  0x2718fffe  /* subu $24, $24, 2         */
1062
};
1063
1064
/* The format of the first PLT entry in an O32 executable using compact
1065
   jumps.  */
1066
static const bfd_vma mipsr6_o32_exec_plt0_entry_compact[] =
1067
{
1068
  0x3c1c0000, /* lui $28, %hi(&GOTPLT[0])       */
1069
  0x8f990000, /* lw $25, %lo(&GOTPLT[0])($28)       */
1070
  0x279c0000, /* addiu $28, $28, %lo(&GOTPLT[0])      */
1071
  0x031cc023, /* subu $24, $24, $28         */
1072
  0x03e07821, /* move $15, $31  # 32-bit move (addu)    */
1073
  0x0018c082, /* srl $24, $24, 2          */
1074
  0x2718fffe, /* subu $24, $24, 2         */
1075
  0xf8190000  /* jalrc $25            */
1076
};
1077
1078
/* The format of the first PLT entry in an N32 executable.  Different
1079
   because gp ($28) is not available; we use t2 ($14) instead.  */
1080
static const bfd_vma mips_n32_exec_plt0_entry[] =
1081
{
1082
  0x3c0e0000, /* lui $14, %hi(&GOTPLT[0])       */
1083
  0x8dd90000, /* lw $25, %lo(&GOTPLT[0])($14)       */
1084
  0x25ce0000, /* addiu $14, $14, %lo(&GOTPLT[0])      */
1085
  0x030ec023, /* subu $24, $24, $14         */
1086
  0x03e07825, /* or t7, ra, zero          */
1087
  0x0018c082, /* srl $24, $24, 2          */
1088
  0x0320f809, /* jalr $25           */
1089
  0x2718fffe  /* subu $24, $24, 2         */
1090
};
1091
1092
/* The format of the first PLT entry in an N32 executable using compact
1093
   jumps.  Different because gp ($28) is not available; we use t2 ($14)
1094
   instead.  */
1095
static const bfd_vma mipsr6_n32_exec_plt0_entry_compact[] =
1096
{
1097
  0x3c0e0000, /* lui $14, %hi(&GOTPLT[0])       */
1098
  0x8dd90000, /* lw $25, %lo(&GOTPLT[0])($14)       */
1099
  0x25ce0000, /* addiu $14, $14, %lo(&GOTPLT[0])      */
1100
  0x030ec023, /* subu $24, $24, $14         */
1101
  0x03e07821, /* move $15, $31  # 32-bit move (addu)    */
1102
  0x0018c082, /* srl $24, $24, 2          */
1103
  0x2718fffe, /* subu $24, $24, 2         */
1104
  0xf8190000  /* jalrc $25            */
1105
};
1106
1107
/* The format of the first PLT entry in an N64 executable.  Different
1108
   from N32 because of the increased size of GOT entries.  */
1109
static const bfd_vma mips_n64_exec_plt0_entry[] =
1110
{
1111
  0x3c0e0000, /* lui $14, %hi(&GOTPLT[0])       */
1112
  0xddd90000, /* ld $25, %lo(&GOTPLT[0])($14)       */
1113
  0x25ce0000, /* addiu $14, $14, %lo(&GOTPLT[0])      */
1114
  0x030ec023, /* subu $24, $24, $14         */
1115
  0x03e07825, /* or t7, ra, zero          */
1116
  0x0018c0c2, /* srl $24, $24, 3          */
1117
  0x0320f809, /* jalr $25           */
1118
  0x2718fffe  /* subu $24, $24, 2         */
1119
};
1120
1121
/* The format of the first PLT entry in an N64 executable using compact
1122
   jumps.  Different from N32 because of the increased size of GOT
1123
   entries.  */
1124
static const bfd_vma mipsr6_n64_exec_plt0_entry_compact[] =
1125
{
1126
  0x3c0e0000, /* lui $14, %hi(&GOTPLT[0])       */
1127
  0xddd90000, /* ld $25, %lo(&GOTPLT[0])($14)       */
1128
  0x25ce0000, /* addiu $14, $14, %lo(&GOTPLT[0])      */
1129
  0x030ec023, /* subu $24, $24, $14         */
1130
  0x03e0782d, /* move $15, $31  # 64-bit move (daddu)   */
1131
  0x0018c0c2, /* srl $24, $24, 3          */
1132
  0x2718fffe, /* subu $24, $24, 2         */
1133
  0xf8190000  /* jalrc $25            */
1134
};
1135
1136
1137
/* The format of the microMIPS first PLT entry in an O32 executable.
1138
   We rely on v0 ($2) rather than t8 ($24) to contain the address
1139
   of the GOTPLT entry handled, so this stub may only be used when
1140
   all the subsequent PLT entries are microMIPS code too.
1141
1142
   The trailing NOP is for alignment and correct disassembly only.  */
1143
static const bfd_vma micromips_o32_exec_plt0_entry[] =
1144
{
1145
  0x7980, 0x0000, /* addiupc $3, (&GOTPLT[0]) - .     */
1146
  0xff23, 0x0000, /* lw $25, 0($3)        */
1147
  0x0535,   /* subu $2, $2, $3        */
1148
  0x2525,   /* srl $2, $2, 2        */
1149
  0x3302, 0xfffe, /* subu $24, $2, 2        */
1150
  0x0dff,   /* move $15, $31        */
1151
  0x45f9,   /* jalrs $25          */
1152
  0x0f83,   /* move $28, $3         */
1153
  0x0c00    /* nop            */
1154
};
1155
1156
/* The format of the microMIPS first PLT entry in an O32 executable
1157
   in the insn32 mode.  */
1158
static const bfd_vma micromips_insn32_o32_exec_plt0_entry[] =
1159
{
1160
  0x41bc, 0x0000, /* lui $28, %hi(&GOTPLT[0])     */
1161
  0xff3c, 0x0000, /* lw $25, %lo(&GOTPLT[0])($28)     */
1162
  0x339c, 0x0000, /* addiu $28, $28, %lo(&GOTPLT[0])    */
1163
  0x0398, 0xc1d0, /* subu $24, $24, $28       */
1164
  0x001f, 0x7a90, /* or $15, $31, zero        */
1165
  0x0318, 0x1040, /* srl $24, $24, 2        */
1166
  0x03f9, 0x0f3c, /* jalr $25         */
1167
  0x3318, 0xfffe  /* subu $24, $24, 2       */
1168
};
1169
1170
/* The format of subsequent standard PLT entries.  */
1171
static const bfd_vma mips_exec_plt_entry[] =
1172
{
1173
  0x3c0f0000, /* lui $15, %hi(.got.plt entry)     */
1174
  0x01f90000, /* l[wd] $25, %lo(.got.plt entry)($15)    */
1175
  0x25f80000, /* addiu $24, $15, %lo(.got.plt entry)    */
1176
  0x03200008  /* jr $25         */
1177
};
1178
1179
static const bfd_vma mipsr6_exec_plt_entry[] =
1180
{
1181
  0x3c0f0000, /* lui $15, %hi(.got.plt entry)     */
1182
  0x01f90000, /* l[wd] $25, %lo(.got.plt entry)($15)    */
1183
  0x25f80000, /* addiu $24, $15, %lo(.got.plt entry)    */
1184
  0x03200009  /* jr $25         */
1185
};
1186
1187
static const bfd_vma mipsr6_exec_plt_entry_compact[] =
1188
{
1189
  0x3c0f0000, /* lui $15, %hi(.got.plt entry)     */
1190
  0x01f90000, /* l[wd] $25, %lo(.got.plt entry)($15)    */
1191
  0x25f80000, /* addiu $24, $15, %lo(.got.plt entry)    */
1192
  0xd8190000  /* jic $25, 0         */
1193
};
1194
1195
/* The format of subsequent MIPS16 o32 PLT entries.  We use v0 ($2)
1196
   and v1 ($3) as temporaries because t8 ($24) and t9 ($25) are not
1197
   directly addressable.  */
1198
static const bfd_vma mips16_o32_exec_plt_entry[] =
1199
{
1200
  0xb203,   /* lw $2, 12($pc)     */
1201
  0x9a60,   /* lw $3, 0($2)       */
1202
  0x651a,   /* move $24, $2       */
1203
  0xeb00,   /* jr $3        */
1204
  0x653b,   /* move $25, $3       */
1205
  0x6500,   /* nop          */
1206
  0x0000, 0x0000  /* .word (.got.plt entry)   */
1207
};
1208
1209
/* The format of subsequent microMIPS o32 PLT entries.  We use v0 ($2)
1210
   as a temporary because t8 ($24) is not addressable with ADDIUPC.  */
1211
static const bfd_vma micromips_o32_exec_plt_entry[] =
1212
{
1213
  0x7900, 0x0000, /* addiupc $2, (.got.plt entry) - . */
1214
  0xff22, 0x0000, /* lw $25, 0($2)      */
1215
  0x4599,   /* jr $25       */
1216
  0x0f02    /* move $24, $2       */
1217
};
1218
1219
/* The format of subsequent microMIPS o32 PLT entries in the insn32 mode.  */
1220
static const bfd_vma micromips_insn32_o32_exec_plt_entry[] =
1221
{
1222
  0x41af, 0x0000, /* lui $15, %hi(.got.plt entry)   */
1223
  0xff2f, 0x0000, /* lw $25, %lo(.got.plt entry)($15) */
1224
  0x0019, 0x0f3c, /* jr $25       */
1225
  0x330f, 0x0000  /* addiu $24, $15, %lo(.got.plt entry)  */
1226
};
1227
1228
/* The format of the first PLT entry in a VxWorks executable.  */
1229
static const bfd_vma mips_vxworks_exec_plt0_entry[] =
1230
{
1231
  0x3c190000, /* lui t9, %hi(_GLOBAL_OFFSET_TABLE_)   */
1232
  0x27390000, /* addiu t9, t9, %lo(_GLOBAL_OFFSET_TABLE_) */
1233
  0x8f390008, /* lw t9, 8(t9)         */
1234
  0x00000000, /* nop            */
1235
  0x03200008, /* jr t9          */
1236
  0x00000000  /* nop            */
1237
};
1238
1239
/* The format of subsequent PLT entries.  */
1240
static const bfd_vma mips_vxworks_exec_plt_entry[] =
1241
{
1242
  0x10000000, /* b .PLT_resolver      */
1243
  0x24180000, /* li t8, <pltindex>      */
1244
  0x3c190000, /* lui t9, %hi(<.got.plt slot>)   */
1245
  0x27390000, /* addiu t9, t9, %lo(<.got.plt slot>) */
1246
  0x8f390000, /* lw t9, 0(t9)       */
1247
  0x00000000, /* nop          */
1248
  0x03200008, /* jr t9        */
1249
  0x00000000  /* nop          */
1250
};
1251
1252
/* The format of the first PLT entry in a VxWorks shared object.  */
1253
static const bfd_vma mips_vxworks_shared_plt0_entry[] =
1254
{
1255
  0x8f990008, /* lw t9, 8(gp)   */
1256
  0x00000000, /* nop      */
1257
  0x03200008, /* jr t9    */
1258
  0x00000000, /* nop      */
1259
  0x00000000, /* nop      */
1260
  0x00000000  /* nop      */
1261
};
1262
1263
/* The format of subsequent PLT entries.  */
1264
static const bfd_vma mips_vxworks_shared_plt_entry[] =
1265
{
1266
  0x10000000, /* b .PLT_resolver  */
1267
  0x24180000  /* li t8, <pltindex>  */
1268
};
1269

1270
/* microMIPS 32-bit opcode helper installer.  */
1271
1272
static void
1273
bfd_put_micromips_32 (const bfd *abfd, bfd_vma opcode, bfd_byte *ptr)
1274
0
{
1275
0
  bfd_put_16 (abfd, (opcode >> 16) & 0xffff, ptr);
1276
0
  bfd_put_16 (abfd,  opcode    & 0xffff, ptr + 2);
1277
0
}
1278
1279
/* microMIPS 32-bit opcode helper retriever.  */
1280
1281
static bfd_vma
1282
bfd_get_micromips_32 (const bfd *abfd, const bfd_byte *ptr)
1283
0
{
1284
0
  return (bfd_get_16 (abfd, ptr) << 16) | bfd_get_16 (abfd, ptr + 2);
1285
0
}
1286

1287
/* Look up an entry in a MIPS ELF linker hash table.  */
1288
1289
#define mips_elf_link_hash_lookup(table, string, create, copy, follow)  \
1290
0
  ((struct mips_elf_link_hash_entry *)          \
1291
0
   elf_link_hash_lookup (&(table)->root, (string), (create),    \
1292
0
       (copy), (follow)))
1293
1294
/* Traverse a MIPS ELF linker hash table.  */
1295
1296
#define mips_elf_link_hash_traverse(table, func, info)      \
1297
0
  (elf_link_hash_traverse           \
1298
0
   (&(table)->root,              \
1299
0
    (bool (*) (struct elf_link_hash_entry *, void *)) (func),   \
1300
0
    (info)))
1301
1302
/* Find the base offsets for thread-local storage in this object,
1303
   for GD/LD and IE/LE respectively.  */
1304
1305
0
#define TP_OFFSET 0x7000
1306
0
#define DTP_OFFSET 0x8000
1307
1308
static bfd_vma
1309
dtprel_base (struct bfd_link_info *info)
1310
0
{
1311
  /* If tls_sec is NULL, we should have signalled an error already.  */
1312
0
  if (elf_hash_table (info)->tls_sec == NULL)
1313
0
    return 0;
1314
0
  return elf_hash_table (info)->tls_sec->vma + DTP_OFFSET;
1315
0
}
1316
1317
static bfd_vma
1318
tprel_base (struct bfd_link_info *info)
1319
0
{
1320
  /* If tls_sec is NULL, we should have signalled an error already.  */
1321
0
  if (elf_hash_table (info)->tls_sec == NULL)
1322
0
    return 0;
1323
0
  return elf_hash_table (info)->tls_sec->vma + TP_OFFSET;
1324
0
}
1325
1326
/* Create an entry in a MIPS ELF linker hash table.  */
1327
1328
static struct bfd_hash_entry *
1329
mips_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
1330
          struct bfd_hash_table *table, const char *string)
1331
0
{
1332
0
  struct mips_elf_link_hash_entry *ret =
1333
0
    (struct mips_elf_link_hash_entry *) entry;
1334
1335
  /* Allocate the structure if it has not already been allocated by a
1336
     subclass.  */
1337
0
  if (ret == NULL)
1338
0
    ret = bfd_hash_allocate (table, sizeof (struct mips_elf_link_hash_entry));
1339
0
  if (ret == NULL)
1340
0
    return (struct bfd_hash_entry *) ret;
1341
1342
  /* Call the allocation method of the superclass.  */
1343
0
  ret = ((struct mips_elf_link_hash_entry *)
1344
0
   _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
1345
0
             table, string));
1346
0
  if (ret != NULL)
1347
0
    {
1348
      /* Set local fields.  */
1349
0
      memset (&ret->esym, 0, sizeof (EXTR));
1350
      /* We use -2 as a marker to indicate that the information has
1351
   not been set.  -1 means there is no associated ifd.  */
1352
0
      ret->esym.ifd = -2;
1353
0
      ret->la25_stub = 0;
1354
0
      ret->possibly_dynamic_relocs = 0;
1355
0
      ret->fn_stub = NULL;
1356
0
      ret->call_stub = NULL;
1357
0
      ret->call_fp_stub = NULL;
1358
0
      ret->mipsxhash_loc = 0;
1359
0
      ret->global_got_area = GGA_NONE;
1360
0
      ret->got_only_for_calls = true;
1361
0
      ret->readonly_reloc = false;
1362
0
      ret->has_static_relocs = false;
1363
0
      ret->no_fn_stub = false;
1364
0
      ret->need_fn_stub = false;
1365
0
      ret->has_nonpic_branches = false;
1366
0
      ret->needs_lazy_stub = false;
1367
0
      ret->use_plt_entry = false;
1368
0
    }
1369
1370
0
  return (struct bfd_hash_entry *) ret;
1371
0
}
1372
1373
/* Allocate MIPS ELF private object data.  */
1374
1375
bool
1376
_bfd_mips_elf_mkobject (bfd *abfd)
1377
251k
{
1378
251k
  return bfd_elf_allocate_object (abfd, sizeof (struct mips_elf_obj_tdata));
1379
251k
}
1380
1381
/* MIPS ELF uses a special find_nearest_line routine in order the
1382
   handle the ECOFF debugging information.  */
1383
1384
struct mips_elf_find_line
1385
{
1386
  struct ecoff_debug_info d;
1387
  struct ecoff_find_line i;
1388
};
1389
1390
bool
1391
_bfd_mips_elf_free_cached_info (bfd *abfd)
1392
766k
{
1393
766k
  struct mips_elf_obj_tdata *tdata;
1394
1395
766k
  if ((bfd_get_format (abfd) == bfd_object
1396
763k
       || bfd_get_format (abfd) == bfd_core)
1397
4.20k
      && (tdata = mips_elf_tdata (abfd)) != NULL)
1398
4.20k
    {
1399
4.20k
      BFD_ASSERT (tdata->root.object_id == MIPS_ELF_DATA);
1400
49.1k
      for (asection *sec = abfd->sections; sec; sec = sec->next)
1401
44.9k
  mips_elf_free_hi16_list (abfd, sec, false, NULL);
1402
4.20k
      if (tdata->find_line_info != NULL)
1403
248
  _bfd_ecoff_free_ecoff_debug_info (&tdata->find_line_info->d);
1404
4.20k
    }
1405
766k
  return _bfd_elf_free_cached_info (abfd);
1406
766k
}
1407
1408
bool
1409
_bfd_mips_elf_new_section_hook (bfd *abfd, asection *sec)
1410
179k
{
1411
179k
  struct _mips_elf_section_data *sdata;
1412
1413
179k
  sdata = bfd_zalloc (abfd, sizeof (*sdata));
1414
179k
  if (sdata == NULL)
1415
0
    return false;
1416
179k
  sec->used_by_bfd = sdata;
1417
1418
179k
  return _bfd_elf_new_section_hook (abfd, sec);
1419
179k
}
1420

1421
/* Read ECOFF debugging information from a .mdebug section into a
1422
   ecoff_debug_info structure.  */
1423
1424
bool
1425
_bfd_mips_elf_read_ecoff_info (bfd *abfd, asection *section,
1426
             struct ecoff_debug_info *debug)
1427
3.45k
{
1428
3.45k
  HDRR *symhdr;
1429
3.45k
  const struct ecoff_debug_swap *swap;
1430
3.45k
  char *ext_hdr;
1431
1432
3.45k
  swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1433
3.45k
  memset (debug, 0, sizeof (*debug));
1434
1435
3.45k
  ext_hdr = bfd_malloc (swap->external_hdr_size);
1436
3.45k
  if (ext_hdr == NULL && swap->external_hdr_size != 0)
1437
0
    goto error_return;
1438
1439
3.45k
  if (! bfd_get_section_contents (abfd, section, ext_hdr, 0,
1440
3.45k
          swap->external_hdr_size))
1441
236
    goto error_return;
1442
1443
3.21k
  symhdr = &debug->symbolic_header;
1444
3.21k
  (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
1445
3.21k
  free (ext_hdr);
1446
3.21k
  ext_hdr = NULL;
1447
1448
  /* The symbolic header contains absolute file offsets and sizes to
1449
     read.  */
1450
3.21k
#define READ(ptr, offset, count, size)          \
1451
17.4k
  do                  \
1452
17.4k
    {                 \
1453
17.4k
      size_t amt;             \
1454
17.4k
      debug->ptr = NULL;            \
1455
17.4k
      if (symhdr->count == 0)           \
1456
17.4k
  break;               \
1457
17.4k
      if (_bfd_mul_overflow (size, symhdr->count, &amt))   \
1458
6.41k
  {               \
1459
0
    bfd_set_error (bfd_error_file_too_big);     \
1460
0
    goto error_return;            \
1461
0
  }                \
1462
6.41k
      if (bfd_seek (abfd, symhdr->offset, SEEK_SET) != 0)   \
1463
6.41k
  goto error_return;           \
1464
6.41k
      debug->ptr = _bfd_malloc_and_read (abfd, amt + 1, amt);   \
1465
5.16k
      if (debug->ptr == NULL)           \
1466
5.16k
  goto error_return;           \
1467
5.16k
      ((char *) debug->ptr)[amt] = 0;         \
1468
3.44k
    } while (0)
1469
1470
3.21k
  READ (line, cbLineOffset, cbLine, sizeof (unsigned char));
1471
2.41k
  READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size);
1472
2.10k
  READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size);
1473
1.88k
  READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size);
1474
1.76k
  READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size);
1475
1.58k
  READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext));
1476
1.34k
  READ (ss, cbSsOffset, issMax, sizeof (char));
1477
1.11k
  READ (ssext, cbSsExtOffset, issExtMax, sizeof (char));
1478
890
  READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size);
1479
656
  READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size);
1480
435
  READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size);
1481
248
#undef READ
1482
1483
248
  return true;
1484
1485
3.20k
 error_return:
1486
3.20k
  free (ext_hdr);
1487
3.20k
  _bfd_ecoff_free_ecoff_debug_info (debug);
1488
3.20k
  return false;
1489
435
}
1490

1491
/* Swap RPDR (runtime procedure table entry) for output.  */
1492
1493
static void
1494
ecoff_swap_rpdr_out (bfd *abfd, const RPDR *in, struct rpdr_ext *ex)
1495
0
{
1496
0
  H_PUT_S32 (abfd, in->adr, ex->p_adr);
1497
0
  H_PUT_32 (abfd, in->regmask, ex->p_regmask);
1498
0
  H_PUT_32 (abfd, in->regoffset, ex->p_regoffset);
1499
0
  H_PUT_32 (abfd, in->fregmask, ex->p_fregmask);
1500
0
  H_PUT_32 (abfd, in->fregoffset, ex->p_fregoffset);
1501
0
  H_PUT_32 (abfd, in->frameoffset, ex->p_frameoffset);
1502
1503
0
  H_PUT_16 (abfd, in->framereg, ex->p_framereg);
1504
0
  H_PUT_16 (abfd, in->pcreg, ex->p_pcreg);
1505
1506
0
  H_PUT_32 (abfd, in->irpss, ex->p_irpss);
1507
0
}
1508
1509
/* Create a runtime procedure table from the .mdebug section.  */
1510
1511
static bool
1512
mips_elf_create_procedure_table (void *handle, bfd *abfd,
1513
         struct bfd_link_info *info, asection *s,
1514
         struct ecoff_debug_info *debug)
1515
0
{
1516
0
  const struct ecoff_debug_swap *swap;
1517
0
  HDRR *hdr = &debug->symbolic_header;
1518
0
  RPDR *rpdr, *rp;
1519
0
  struct rpdr_ext *erp;
1520
0
  void *rtproc;
1521
0
  struct pdr_ext *epdr;
1522
0
  struct sym_ext *esym;
1523
0
  char *ss, **sv;
1524
0
  char *str;
1525
0
  bfd_size_type size;
1526
0
  bfd_size_type count;
1527
0
  unsigned long sindex;
1528
0
  unsigned long i;
1529
0
  PDR pdr;
1530
0
  SYMR sym;
1531
0
  const char *no_name_func = _("static procedure (no name)");
1532
1533
0
  epdr = NULL;
1534
0
  rpdr = NULL;
1535
0
  esym = NULL;
1536
0
  ss = NULL;
1537
0
  sv = NULL;
1538
1539
0
  swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1540
1541
0
  sindex = strlen (no_name_func) + 1;
1542
0
  count = hdr->ipdMax;
1543
0
  if (count > 0)
1544
0
    {
1545
0
      size = swap->external_pdr_size;
1546
1547
0
      epdr = bfd_malloc (size * count);
1548
0
      if (epdr == NULL)
1549
0
  goto error_return;
1550
1551
0
      if (! _bfd_ecoff_get_accumulated_pdr (handle, (bfd_byte *) epdr))
1552
0
  goto error_return;
1553
1554
0
      size = sizeof (RPDR);
1555
0
      rp = rpdr = bfd_malloc (size * count);
1556
0
      if (rpdr == NULL)
1557
0
  goto error_return;
1558
1559
0
      size = sizeof (char *);
1560
0
      sv = bfd_malloc (size * count);
1561
0
      if (sv == NULL)
1562
0
  goto error_return;
1563
1564
0
      count = hdr->isymMax;
1565
0
      size = swap->external_sym_size;
1566
0
      esym = bfd_malloc (size * count);
1567
0
      if (esym == NULL)
1568
0
  goto error_return;
1569
1570
0
      if (! _bfd_ecoff_get_accumulated_sym (handle, (bfd_byte *) esym))
1571
0
  goto error_return;
1572
1573
0
      count = hdr->issMax;
1574
0
      ss = bfd_malloc (count);
1575
0
      if (ss == NULL)
1576
0
  goto error_return;
1577
0
      if (! _bfd_ecoff_get_accumulated_ss (handle, (bfd_byte *) ss))
1578
0
  goto error_return;
1579
1580
0
      count = hdr->ipdMax;
1581
0
      for (i = 0; i < (unsigned long) count; i++, rp++)
1582
0
  {
1583
0
    (*swap->swap_pdr_in) (abfd, epdr + i, &pdr);
1584
0
    (*swap->swap_sym_in) (abfd, &esym[pdr.isym], &sym);
1585
0
    rp->adr = sym.value;
1586
0
    rp->regmask = pdr.regmask;
1587
0
    rp->regoffset = pdr.regoffset;
1588
0
    rp->fregmask = pdr.fregmask;
1589
0
    rp->fregoffset = pdr.fregoffset;
1590
0
    rp->frameoffset = pdr.frameoffset;
1591
0
    rp->framereg = pdr.framereg;
1592
0
    rp->pcreg = pdr.pcreg;
1593
0
    rp->irpss = sindex;
1594
0
    sv[i] = ss + sym.iss;
1595
0
    sindex += strlen (sv[i]) + 1;
1596
0
  }
1597
0
    }
1598
1599
0
  size = sizeof (struct rpdr_ext) * (count + 2) + sindex;
1600
0
  size = BFD_ALIGN (size, 16);
1601
0
  rtproc = bfd_alloc (abfd, size);
1602
0
  if (rtproc == NULL)
1603
0
    {
1604
0
      mips_elf_hash_table (info)->procedure_count = 0;
1605
0
      goto error_return;
1606
0
    }
1607
1608
0
  mips_elf_hash_table (info)->procedure_count = count + 2;
1609
1610
0
  erp = rtproc;
1611
0
  memset (erp, 0, sizeof (struct rpdr_ext));
1612
0
  erp++;
1613
0
  str = (char *) rtproc + sizeof (struct rpdr_ext) * (count + 2);
1614
0
  strcpy (str, no_name_func);
1615
0
  str += strlen (no_name_func) + 1;
1616
0
  for (i = 0; i < count; i++)
1617
0
    {
1618
0
      ecoff_swap_rpdr_out (abfd, rpdr + i, erp + i);
1619
0
      strcpy (str, sv[i]);
1620
0
      str += strlen (sv[i]) + 1;
1621
0
    }
1622
0
  H_PUT_S32 (abfd, -1, (erp + count)->p_adr);
1623
1624
  /* Set the size and contents of .rtproc section.  */
1625
0
  s->size = size;
1626
0
  s->contents = rtproc;
1627
1628
  /* Skip this section later on (I don't think this currently
1629
     matters, but someday it might).  */
1630
0
  s->map_head.link_order = NULL;
1631
1632
0
  free (epdr);
1633
0
  free (rpdr);
1634
0
  free (esym);
1635
0
  free (ss);
1636
0
  free (sv);
1637
0
  return true;
1638
1639
0
 error_return:
1640
0
  free (epdr);
1641
0
  free (rpdr);
1642
0
  free (esym);
1643
0
  free (ss);
1644
0
  free (sv);
1645
0
  return false;
1646
0
}
1647

1648
/* We're going to create a stub for H.  Create a symbol for the stub's
1649
   value and size, to help make the disassembly easier to read.  */
1650
1651
static bool
1652
mips_elf_create_stub_symbol (struct bfd_link_info *info,
1653
           struct mips_elf_link_hash_entry *h,
1654
           const char *prefix, asection *s, bfd_vma value,
1655
           bfd_vma size)
1656
0
{
1657
0
  bool micromips_p = ELF_ST_IS_MICROMIPS (h->root.other);
1658
0
  struct bfd_link_hash_entry *bh;
1659
0
  struct elf_link_hash_entry *elfh;
1660
0
  char *name;
1661
0
  bool res;
1662
1663
0
  if (micromips_p)
1664
0
    value |= 1;
1665
1666
  /* Create a new symbol.  */
1667
0
  name = concat (prefix, h->root.root.root.string, NULL);
1668
0
  bh = NULL;
1669
0
  res = _bfd_generic_link_add_one_symbol (info, s->owner, name,
1670
0
            BSF_LOCAL, s, value, NULL,
1671
0
            true, false, &bh);
1672
0
  free (name);
1673
0
  if (! res)
1674
0
    return false;
1675
1676
  /* Make it a local function.  */
1677
0
  elfh = (struct elf_link_hash_entry *) bh;
1678
0
  elfh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
1679
0
  elfh->size = size;
1680
0
  elfh->forced_local = 1;
1681
0
  if (micromips_p)
1682
0
    elfh->other = ELF_ST_SET_MICROMIPS (elfh->other);
1683
0
  return true;
1684
0
}
1685
1686
/* We're about to redefine H.  Create a symbol to represent H's
1687
   current value and size, to help make the disassembly easier
1688
   to read.  */
1689
1690
static bool
1691
mips_elf_create_shadow_symbol (struct bfd_link_info *info,
1692
             struct mips_elf_link_hash_entry *h,
1693
             const char *prefix)
1694
0
{
1695
0
  struct bfd_link_hash_entry *bh;
1696
0
  struct elf_link_hash_entry *elfh;
1697
0
  char *name;
1698
0
  asection *s;
1699
0
  bfd_vma value;
1700
0
  bool res;
1701
1702
  /* Read the symbol's value.  */
1703
0
  BFD_ASSERT (h->root.root.type == bfd_link_hash_defined
1704
0
        || h->root.root.type == bfd_link_hash_defweak);
1705
0
  s = h->root.root.u.def.section;
1706
0
  value = h->root.root.u.def.value;
1707
1708
  /* Create a new symbol.  */
1709
0
  name = concat (prefix, h->root.root.root.string, NULL);
1710
0
  bh = NULL;
1711
0
  res = _bfd_generic_link_add_one_symbol (info, s->owner, name,
1712
0
            BSF_LOCAL, s, value, NULL,
1713
0
            true, false, &bh);
1714
0
  free (name);
1715
0
  if (! res)
1716
0
    return false;
1717
1718
  /* Make it local and copy the other attributes from H.  */
1719
0
  elfh = (struct elf_link_hash_entry *) bh;
1720
0
  elfh->type = ELF_ST_INFO (STB_LOCAL, ELF_ST_TYPE (h->root.type));
1721
0
  elfh->other = h->root.other;
1722
0
  elfh->size = h->root.size;
1723
0
  elfh->forced_local = 1;
1724
0
  return true;
1725
0
}
1726
1727
/* Return TRUE if relocations in SECTION can refer directly to a MIPS16
1728
   function rather than to a hard-float stub.  */
1729
1730
static bool
1731
section_allows_mips16_refs_p (asection *section)
1732
0
{
1733
0
  const char *name;
1734
1735
0
  name = bfd_section_name (section);
1736
0
  return (FN_STUB_P (name)
1737
0
    || CALL_STUB_P (name)
1738
0
    || CALL_FP_STUB_P (name)
1739
0
    || strcmp (name, ".pdr") == 0);
1740
0
}
1741
1742
/* [RELOCS, RELEND) are the relocations against SEC, which is a MIPS16
1743
   stub section of some kind.  Return the R_SYMNDX of the target
1744
   function, or 0 if we can't decide which function that is.  */
1745
1746
static unsigned long
1747
mips16_stub_symndx (elf_backend_data *bed,
1748
        asection *sec ATTRIBUTE_UNUSED,
1749
        const Elf_Internal_Rela *relocs,
1750
        const Elf_Internal_Rela *relend)
1751
0
{
1752
0
  int int_rels_per_ext_rel = bed->s->int_rels_per_ext_rel;
1753
0
  const Elf_Internal_Rela *rel;
1754
1755
  /* Trust the first R_MIPS_NONE relocation, if any, but not a subsequent
1756
     one in a compound relocation.  */
1757
0
  for (rel = relocs; rel < relend; rel += int_rels_per_ext_rel)
1758
0
    if (ELF_R_TYPE (sec->owner, rel->r_info) == R_MIPS_NONE)
1759
0
      return ELF_R_SYM (sec->owner, rel->r_info);
1760
1761
  /* Otherwise trust the first relocation, whatever its kind.  This is
1762
     the traditional behavior.  */
1763
0
  if (relocs < relend)
1764
0
    return ELF_R_SYM (sec->owner, relocs->r_info);
1765
1766
0
  return 0;
1767
0
}
1768
1769
/* Check the mips16 stubs for a particular symbol, and see if we can
1770
   discard them.  */
1771
1772
static void
1773
mips_elf_check_mips16_stubs (struct bfd_link_info *info,
1774
           struct mips_elf_link_hash_entry *h)
1775
0
{
1776
  /* Dynamic symbols must use the standard call interface, in case other
1777
     objects try to call them.  */
1778
0
  if (h->fn_stub != NULL
1779
0
      && h->root.dynindx != -1)
1780
0
    {
1781
0
      mips_elf_create_shadow_symbol (info, h, ".mips16.");
1782
0
      h->need_fn_stub = true;
1783
0
    }
1784
1785
0
  if (h->fn_stub != NULL
1786
0
      && ! h->need_fn_stub)
1787
0
    {
1788
      /* We don't need the fn_stub; the only references to this symbol
1789
   are 16 bit calls.  Clobber the size to 0 to prevent it from
1790
   being included in the link.  */
1791
0
      h->fn_stub->size = 0;
1792
0
      h->fn_stub->flags &= ~SEC_RELOC;
1793
0
      h->fn_stub->reloc_count = 0;
1794
0
      h->fn_stub->flags |= SEC_EXCLUDE;
1795
0
      h->fn_stub->output_section = bfd_abs_section_ptr;
1796
0
    }
1797
1798
0
  if (h->call_stub != NULL
1799
0
      && ELF_ST_IS_MIPS16 (h->root.other))
1800
0
    {
1801
      /* We don't need the call_stub; this is a 16 bit function, so
1802
   calls from other 16 bit functions are OK.  Clobber the size
1803
   to 0 to prevent it from being included in the link.  */
1804
0
      h->call_stub->size = 0;
1805
0
      h->call_stub->flags &= ~SEC_RELOC;
1806
0
      h->call_stub->reloc_count = 0;
1807
0
      h->call_stub->flags |= SEC_EXCLUDE;
1808
0
      h->call_stub->output_section = bfd_abs_section_ptr;
1809
0
    }
1810
1811
0
  if (h->call_fp_stub != NULL
1812
0
      && ELF_ST_IS_MIPS16 (h->root.other))
1813
0
    {
1814
      /* We don't need the call_stub; this is a 16 bit function, so
1815
   calls from other 16 bit functions are OK.  Clobber the size
1816
   to 0 to prevent it from being included in the link.  */
1817
0
      h->call_fp_stub->size = 0;
1818
0
      h->call_fp_stub->flags &= ~SEC_RELOC;
1819
0
      h->call_fp_stub->reloc_count = 0;
1820
0
      h->call_fp_stub->flags |= SEC_EXCLUDE;
1821
0
      h->call_fp_stub->output_section = bfd_abs_section_ptr;
1822
0
    }
1823
0
}
1824
1825
/* Hashtable callbacks for mips_elf_la25_stubs.  */
1826
1827
static hashval_t
1828
mips_elf_la25_stub_hash (const void *entry_)
1829
0
{
1830
0
  const struct mips_elf_la25_stub *entry;
1831
1832
0
  entry = (struct mips_elf_la25_stub *) entry_;
1833
0
  return entry->h->root.root.u.def.section->id
1834
0
    + entry->h->root.root.u.def.value;
1835
0
}
1836
1837
static int
1838
mips_elf_la25_stub_eq (const void *entry1_, const void *entry2_)
1839
0
{
1840
0
  const struct mips_elf_la25_stub *entry1, *entry2;
1841
1842
0
  entry1 = (struct mips_elf_la25_stub *) entry1_;
1843
0
  entry2 = (struct mips_elf_la25_stub *) entry2_;
1844
0
  return ((entry1->h->root.root.u.def.section
1845
0
     == entry2->h->root.root.u.def.section)
1846
0
    && (entry1->h->root.root.u.def.value
1847
0
        == entry2->h->root.root.u.def.value));
1848
0
}
1849
1850
/* Called by the linker to set up the la25 stub-creation code.  FN is
1851
   the linker's implementation of add_stub_function.  Return true on
1852
   success.  */
1853
1854
bool
1855
_bfd_mips_elf_init_stubs (struct bfd_link_info *info,
1856
        asection *(*fn) (const char *, asection *,
1857
             asection *))
1858
0
{
1859
0
  struct mips_elf_link_hash_table *htab;
1860
1861
0
  htab = mips_elf_hash_table (info);
1862
0
  if (htab == NULL)
1863
0
    return false;
1864
1865
0
  htab->add_stub_section = fn;
1866
0
  htab->la25_stubs = htab_try_create (1, mips_elf_la25_stub_hash,
1867
0
              mips_elf_la25_stub_eq, NULL);
1868
0
  if (htab->la25_stubs == NULL)
1869
0
    return false;
1870
1871
0
  return true;
1872
0
}
1873
1874
/* Return true if H is a locally-defined PIC function, in the sense
1875
   that it or its fn_stub might need $25 to be valid on entry.
1876
   Note that MIPS16 functions set up $gp using PC-relative instructions,
1877
   so they themselves never need $25 to be valid.  Only non-MIPS16
1878
   entry points are of interest here.  */
1879
1880
static bool
1881
mips_elf_local_pic_function_p (struct mips_elf_link_hash_entry *h)
1882
0
{
1883
0
  return ((h->root.root.type == bfd_link_hash_defined
1884
0
     || h->root.root.type == bfd_link_hash_defweak)
1885
0
    && h->root.def_regular
1886
0
    && !bfd_is_abs_section (h->root.root.u.def.section)
1887
0
    && !bfd_is_und_section (h->root.root.u.def.section)
1888
0
    && (!ELF_ST_IS_MIPS16 (h->root.other)
1889
0
        || (h->fn_stub && h->need_fn_stub))
1890
0
    && (PIC_OBJECT_P (h->root.root.u.def.section->owner)
1891
0
        || ELF_ST_IS_MIPS_PIC (h->root.other)));
1892
0
}
1893
1894
/* Set *SEC to the input section that contains the target of STUB.
1895
   Return the offset of the target from the start of that section.  */
1896
1897
static bfd_vma
1898
mips_elf_get_la25_target (struct mips_elf_la25_stub *stub,
1899
        asection **sec)
1900
0
{
1901
0
  if (ELF_ST_IS_MIPS16 (stub->h->root.other))
1902
0
    {
1903
0
      BFD_ASSERT (stub->h->need_fn_stub);
1904
0
      *sec = stub->h->fn_stub;
1905
0
      return 0;
1906
0
    }
1907
0
  else
1908
0
    {
1909
0
      *sec = stub->h->root.root.u.def.section;
1910
0
      return stub->h->root.root.u.def.value;
1911
0
    }
1912
0
}
1913
1914
/* STUB describes an la25 stub that we have decided to implement
1915
   by inserting an LUI/ADDIU pair before the target function.
1916
   Create the section and redirect the function symbol to it.  */
1917
1918
static bool
1919
mips_elf_add_la25_intro (struct mips_elf_la25_stub *stub,
1920
       struct bfd_link_info *info)
1921
0
{
1922
0
  struct mips_elf_link_hash_table *htab;
1923
0
  char *name;
1924
0
  asection *s, *input_section;
1925
0
  unsigned int align;
1926
1927
0
  htab = mips_elf_hash_table (info);
1928
0
  if (htab == NULL)
1929
0
    return false;
1930
1931
  /* Create a unique name for the new section.  */
1932
0
  name = bfd_malloc (11 + sizeof (".text.stub."));
1933
0
  if (name == NULL)
1934
0
    return false;
1935
0
  sprintf (name, ".text.stub.%d", (int) htab_elements (htab->la25_stubs));
1936
1937
  /* Create the section.  */
1938
0
  mips_elf_get_la25_target (stub, &input_section);
1939
0
  s = htab->add_stub_section (name, input_section,
1940
0
            input_section->output_section);
1941
0
  if (s == NULL)
1942
0
    return false;
1943
1944
  /* Make sure that any padding goes before the stub.  */
1945
0
  align = input_section->alignment_power;
1946
0
  if (!bfd_link_align_section (s, align))
1947
0
    return false;
1948
0
  if (align > 3)
1949
0
    s->size = (1 << align) - 8;
1950
1951
  /* Create a symbol for the stub.  */
1952
0
  mips_elf_create_stub_symbol (info, stub->h, ".pic.", s, s->size, 8);
1953
0
  stub->stub_section = s;
1954
0
  stub->offset = s->size;
1955
1956
  /* Allocate room for it.  */
1957
0
  s->size += 8;
1958
0
  return true;
1959
0
}
1960
1961
/* STUB describes an la25 stub that we have decided to implement
1962
   with a separate trampoline.  Allocate room for it and redirect
1963
   the function symbol to it.  */
1964
1965
static bool
1966
mips_elf_add_la25_trampoline (struct mips_elf_la25_stub *stub,
1967
            struct bfd_link_info *info)
1968
0
{
1969
0
  struct mips_elf_link_hash_table *htab;
1970
0
  asection *s;
1971
1972
0
  htab = mips_elf_hash_table (info);
1973
0
  if (htab == NULL)
1974
0
    return false;
1975
1976
  /* Create a trampoline section, if we haven't already.  */
1977
0
  s = htab->strampoline;
1978
0
  if (s == NULL)
1979
0
    {
1980
0
      asection *input_section = stub->h->root.root.u.def.section;
1981
0
      s = htab->add_stub_section (".text", NULL,
1982
0
          input_section->output_section);
1983
0
      if (s == NULL || !bfd_link_align_section (s, 4))
1984
0
  return false;
1985
0
      htab->strampoline = s;
1986
0
    }
1987
1988
  /* Create a symbol for the stub.  */
1989
0
  mips_elf_create_stub_symbol (info, stub->h, ".pic.", s, s->size, 16);
1990
0
  stub->stub_section = s;
1991
0
  stub->offset = s->size;
1992
1993
  /* Allocate room for it.  */
1994
0
  s->size += 16;
1995
0
  return true;
1996
0
}
1997
1998
/* H describes a symbol that needs an la25 stub.  Make sure that an
1999
   appropriate stub exists and point H at it.  */
2000
2001
static bool
2002
mips_elf_add_la25_stub (struct bfd_link_info *info,
2003
      struct mips_elf_link_hash_entry *h)
2004
0
{
2005
0
  struct mips_elf_link_hash_table *htab;
2006
0
  struct mips_elf_la25_stub search, *stub;
2007
0
  bool use_trampoline_p;
2008
0
  asection *s;
2009
0
  bfd_vma value;
2010
0
  void **slot;
2011
2012
  /* Describe the stub we want.  */
2013
0
  search.stub_section = NULL;
2014
0
  search.offset = 0;
2015
0
  search.h = h;
2016
2017
  /* See if we've already created an equivalent stub.  */
2018
0
  htab = mips_elf_hash_table (info);
2019
0
  if (htab == NULL)
2020
0
    return false;
2021
2022
0
  slot = htab_find_slot (htab->la25_stubs, &search, INSERT);
2023
0
  if (slot == NULL)
2024
0
    return false;
2025
2026
0
  stub = (struct mips_elf_la25_stub *) *slot;
2027
0
  if (stub != NULL)
2028
0
    {
2029
      /* We can reuse the existing stub.  */
2030
0
      h->la25_stub = stub;
2031
0
      return true;
2032
0
    }
2033
2034
  /* Create a permanent copy of ENTRY and add it to the hash table.  */
2035
0
  stub = bfd_malloc (sizeof (search));
2036
0
  if (stub == NULL)
2037
0
    return false;
2038
0
  *stub = search;
2039
0
  *slot = stub;
2040
2041
  /* Prefer to use LUI/ADDIU stubs if the function is at the beginning
2042
     of the section and if we would need no more than 2 nops.  */
2043
0
  value = mips_elf_get_la25_target (stub, &s);
2044
0
  if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
2045
0
    value &= ~1;
2046
0
  use_trampoline_p = (value != 0 || s->alignment_power > 4);
2047
2048
0
  h->la25_stub = stub;
2049
0
  return (use_trampoline_p
2050
0
    ? mips_elf_add_la25_trampoline (stub, info)
2051
0
    : mips_elf_add_la25_intro (stub, info));
2052
0
}
2053
2054
/* A mips_elf_link_hash_traverse callback that is called before sizing
2055
   sections.  DATA points to a mips_htab_traverse_info structure.  */
2056
2057
static bool
2058
mips_elf_check_symbols (struct mips_elf_link_hash_entry *h, void *data)
2059
0
{
2060
0
  struct mips_htab_traverse_info *hti;
2061
2062
0
  hti = (struct mips_htab_traverse_info *) data;
2063
0
  if (!bfd_link_relocatable (hti->info))
2064
0
    mips_elf_check_mips16_stubs (hti->info, h);
2065
2066
0
  if (mips_elf_local_pic_function_p (h))
2067
0
    {
2068
      /* PR 12845: If H is in a section that has been garbage
2069
   collected it will have its output section set to *ABS*.  */
2070
0
      if (bfd_is_abs_section (h->root.root.u.def.section->output_section))
2071
0
  return true;
2072
2073
      /* H is a function that might need $25 to be valid on entry.
2074
   If we're creating a non-PIC relocatable object, mark H as
2075
   being PIC.  If we're creating a non-relocatable object with
2076
   non-PIC branches and jumps to H, make sure that H has an la25
2077
   stub.  */
2078
0
      if (bfd_link_relocatable (hti->info))
2079
0
  {
2080
0
    if (!PIC_OBJECT_P (hti->output_bfd))
2081
0
      h->root.other = ELF_ST_SET_MIPS_PIC (h->root.other);
2082
0
  }
2083
0
      else if (h->has_nonpic_branches && !mips_elf_add_la25_stub (hti->info, h))
2084
0
  {
2085
0
    hti->error = true;
2086
0
    return false;
2087
0
  }
2088
0
    }
2089
0
  return true;
2090
0
}
2091

2092
/* R_MIPS16_26 is used for the mips16 jal and jalx instructions.
2093
   Most mips16 instructions are 16 bits, but these instructions
2094
   are 32 bits.
2095
2096
   The format of these instructions is:
2097
2098
   +--------------+--------------------------------+
2099
   |     JALX     | X|   Imm 20:16  |   Imm 25:21  |
2100
   +--------------+--------------------------------+
2101
   |        Immediate  15:0      |
2102
   +-----------------------------------------------+
2103
2104
   JALX is the 5-bit value 00011.  X is 0 for jal, 1 for jalx.
2105
   Note that the immediate value in the first word is swapped.
2106
2107
   When producing a relocatable object file, R_MIPS16_26 is
2108
   handled mostly like R_MIPS_26.  In particular, the addend is
2109
   stored as a straight 26-bit value in a 32-bit instruction.
2110
   (gas makes life simpler for itself by never adjusting a
2111
   R_MIPS16_26 reloc to be against a section, so the addend is
2112
   always zero).  However, the 32 bit instruction is stored as 2
2113
   16-bit values, rather than a single 32-bit value.  In a
2114
   big-endian file, the result is the same; in a little-endian
2115
   file, the two 16-bit halves of the 32 bit value are swapped.
2116
   This is so that a disassembler can recognize the jal
2117
   instruction.
2118
2119
   When doing a final link, R_MIPS16_26 is treated as a 32 bit
2120
   instruction stored as two 16-bit values.  The addend A is the
2121
   contents of the targ26 field.  The calculation is the same as
2122
   R_MIPS_26.  When storing the calculated value, reorder the
2123
   immediate value as shown above, and don't forget to store the
2124
   value as two 16-bit values.
2125
2126
   To put it in MIPS ABI terms, the relocation field is T-targ26-16,
2127
   defined as
2128
2129
   big-endian:
2130
   +--------+----------------------+
2131
   |      |        |
2132
   |      |  targ26-16     |
2133
   |31    26|25       0|
2134
   +--------+----------------------+
2135
2136
   little-endian:
2137
   +----------+------+-------------+
2138
   |        |      |       |
2139
   |  sub1    |      |     sub2    |
2140
   |0      9|10  15|16   31|
2141
   +----------+--------------------+
2142
   where targ26-16 is sub1 followed by sub2 (i.e., the addend field A is
2143
   ((sub1 << 16) | sub2)).
2144
2145
   When producing a relocatable object file, the calculation is
2146
   (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
2147
   When producing a fully linked file, the calculation is
2148
   let R = (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
2149
   ((R & 0x1f0000) << 5) | ((R & 0x3e00000) >> 5) | (R & 0xffff)
2150
2151
   The table below lists the other MIPS16 instruction relocations.
2152
   Each one is calculated in the same way as the non-MIPS16 relocation
2153
   given on the right, but using the extended MIPS16 layout of 16-bit
2154
   immediate fields:
2155
2156
  R_MIPS16_GPREL    R_MIPS_GPREL16
2157
  R_MIPS16_GOT16    R_MIPS_GOT16
2158
  R_MIPS16_CALL16   R_MIPS_CALL16
2159
  R_MIPS16_HI16   R_MIPS_HI16
2160
  R_MIPS16_LO16   R_MIPS_LO16
2161
2162
   A typical instruction will have a format like this:
2163
2164
   +--------------+--------------------------------+
2165
   |    EXTEND    |     Imm 10:5    |   Imm 15:11  |
2166
   +--------------+--------------------------------+
2167
   |    Major     |   rx   |   ry   |   Imm  4:0   |
2168
   +--------------+--------------------------------+
2169
2170
   EXTEND is the five bit value 11110.  Major is the instruction
2171
   opcode.
2172
2173
   All we need to do here is shuffle the bits appropriately.
2174
   As above, the two 16-bit halves must be swapped on a
2175
   little-endian system.
2176
2177
   Finally R_MIPS16_PC16_S1 corresponds to R_MIPS_PC16, however the
2178
   relocatable field is shifted by 1 rather than 2 and the same bit
2179
   shuffling is done as with the relocations above.  */
2180
2181
static inline bool
2182
mips16_reloc_p (int r_type)
2183
725
{
2184
725
  switch (r_type)
2185
725
    {
2186
26
    case R_MIPS16_26:
2187
26
    case R_MIPS16_GPREL:
2188
56
    case R_MIPS16_GOT16:
2189
58
    case R_MIPS16_CALL16:
2190
58
    case R_MIPS16_HI16:
2191
72
    case R_MIPS16_LO16:
2192
72
    case R_MIPS16_TLS_GD:
2193
72
    case R_MIPS16_TLS_LDM:
2194
72
    case R_MIPS16_TLS_DTPREL_HI16:
2195
72
    case R_MIPS16_TLS_DTPREL_LO16:
2196
76
    case R_MIPS16_TLS_GOTTPREL:
2197
76
    case R_MIPS16_TLS_TPREL_HI16:
2198
76
    case R_MIPS16_TLS_TPREL_LO16:
2199
76
    case R_MIPS16_PC16_S1:
2200
76
      return true;
2201
2202
649
    default:
2203
649
      return false;
2204
725
    }
2205
725
}
2206
2207
/* Check if a microMIPS reloc.  */
2208
2209
static inline bool
2210
micromips_reloc_p (unsigned int r_type)
2211
775
{
2212
775
  return r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max;
2213
775
}
2214
2215
/* Similar to MIPS16, the two 16-bit halves in microMIPS must be swapped
2216
   on a little-endian system.  This does not apply to R_MICROMIPS_PC7_S1,
2217
   R_MICROMIPS_PC10_S1 and R_MICROMIPS_GPREL7_S2 relocs that apply to
2218
   16-bit instructions.  */
2219
2220
static inline bool
2221
micromips_reloc_shuffle_p (unsigned int r_type)
2222
649
{
2223
649
  return (micromips_reloc_p (r_type)
2224
71
    && r_type != R_MICROMIPS_PC7_S1
2225
65
    && r_type != R_MICROMIPS_PC10_S1
2226
55
    && r_type != R_MICROMIPS_GPREL7_S2);
2227
649
}
2228
2229
static inline bool
2230
got16_reloc_p (int r_type)
2231
0
{
2232
0
  return (r_type == R_MIPS_GOT16
2233
0
    || r_type == R_MIPS16_GOT16
2234
0
    || r_type == R_MICROMIPS_GOT16);
2235
0
}
2236
2237
static inline bool
2238
call16_reloc_p (int r_type)
2239
0
{
2240
0
  return (r_type == R_MIPS_CALL16
2241
0
    || r_type == R_MIPS16_CALL16
2242
0
    || r_type == R_MICROMIPS_CALL16);
2243
0
}
2244
2245
static inline bool
2246
got_disp_reloc_p (unsigned int r_type)
2247
0
{
2248
0
  return r_type == R_MIPS_GOT_DISP || r_type == R_MICROMIPS_GOT_DISP;
2249
0
}
2250
2251
static inline bool
2252
got_page_reloc_p (unsigned int r_type)
2253
0
{
2254
0
  return r_type == R_MIPS_GOT_PAGE || r_type == R_MICROMIPS_GOT_PAGE;
2255
0
}
2256
2257
static inline bool
2258
got_lo16_reloc_p (unsigned int r_type)
2259
0
{
2260
0
  return r_type == R_MIPS_GOT_LO16 || r_type == R_MICROMIPS_GOT_LO16;
2261
0
}
2262
2263
static inline bool
2264
call_hi16_reloc_p (unsigned int r_type)
2265
0
{
2266
0
  return r_type == R_MIPS_CALL_HI16 || r_type == R_MICROMIPS_CALL_HI16;
2267
0
}
2268
2269
static inline bool
2270
call_lo16_reloc_p (unsigned int r_type)
2271
0
{
2272
0
  return r_type == R_MIPS_CALL_LO16 || r_type == R_MICROMIPS_CALL_LO16;
2273
0
}
2274
2275
static inline bool
2276
hi16_reloc_p (int r_type)
2277
0
{
2278
0
  return (r_type == R_MIPS_HI16
2279
0
    || r_type == R_MIPS16_HI16
2280
0
    || r_type == R_MICROMIPS_HI16
2281
0
    || r_type == R_MIPS_PCHI16);
2282
0
}
2283
2284
static inline bool
2285
lo16_reloc_p (int r_type)
2286
0
{
2287
0
  return (r_type == R_MIPS_LO16
2288
0
    || r_type == R_MIPS16_LO16
2289
0
    || r_type == R_MICROMIPS_LO16
2290
0
    || r_type == R_MIPS_PCLO16);
2291
0
}
2292
2293
static inline bool
2294
tls_hi16_reloc_p (int r_type)
2295
0
{
2296
0
  return (r_type == R_MIPS_TLS_DTPREL_HI16
2297
0
    || r_type == R_MIPS_TLS_TPREL_HI16
2298
0
    || r_type == R_MIPS16_TLS_DTPREL_HI16
2299
0
    || r_type == R_MIPS16_TLS_TPREL_HI16
2300
0
    || r_type == R_MICROMIPS_TLS_DTPREL_HI16
2301
0
    || r_type == R_MICROMIPS_TLS_TPREL_HI16);
2302
0
}
2303
2304
static inline bool
2305
mips16_call_reloc_p (int r_type)
2306
0
{
2307
0
  return r_type == R_MIPS16_26 || r_type == R_MIPS16_CALL16;
2308
0
}
2309
2310
static inline bool
2311
jal_reloc_p (int r_type)
2312
0
{
2313
0
  return (r_type == R_MIPS_26
2314
0
    || r_type == R_MIPS16_26
2315
0
    || r_type == R_MICROMIPS_26_S1);
2316
0
}
2317
2318
static inline bool
2319
b_reloc_p (int r_type)
2320
0
{
2321
0
  return (r_type == R_MIPS_PC26_S2
2322
0
    || r_type == R_MIPS_PC21_S2
2323
0
    || r_type == R_MIPS_PC16
2324
0
    || r_type == R_MIPS_GNU_REL16_S2
2325
0
    || r_type == R_MIPS16_PC16_S1
2326
0
    || r_type == R_MICROMIPS_PC16_S1
2327
0
    || r_type == R_MICROMIPS_PC10_S1
2328
0
    || r_type == R_MICROMIPS_PC7_S1);
2329
0
}
2330
2331
static inline bool
2332
aligned_pcrel_reloc_p (int r_type)
2333
0
{
2334
0
  return (r_type == R_MIPS_PC18_S3
2335
0
    || r_type == R_MIPS_PC19_S2);
2336
0
}
2337
2338
static inline bool
2339
branch_reloc_p (int r_type)
2340
0
{
2341
0
  return (r_type == R_MIPS_26
2342
0
    || r_type == R_MIPS_PC26_S2
2343
0
    || r_type == R_MIPS_PC21_S2
2344
0
    || r_type == R_MIPS_PC16
2345
0
    || r_type == R_MIPS_GNU_REL16_S2);
2346
0
}
2347
2348
static inline bool
2349
mips16_branch_reloc_p (int r_type)
2350
0
{
2351
0
  return (r_type == R_MIPS16_26
2352
0
    || r_type == R_MIPS16_PC16_S1);
2353
0
}
2354
2355
static inline bool
2356
micromips_branch_reloc_p (int r_type)
2357
0
{
2358
0
  return (r_type == R_MICROMIPS_26_S1
2359
0
    || r_type == R_MICROMIPS_PC16_S1
2360
0
    || r_type == R_MICROMIPS_PC10_S1
2361
0
    || r_type == R_MICROMIPS_PC7_S1);
2362
0
}
2363
2364
static inline bool
2365
tls_gd_reloc_p (unsigned int r_type)
2366
0
{
2367
0
  return (r_type == R_MIPS_TLS_GD
2368
0
    || r_type == R_MIPS16_TLS_GD
2369
0
    || r_type == R_MICROMIPS_TLS_GD);
2370
0
}
2371
2372
static inline bool
2373
tls_ldm_reloc_p (unsigned int r_type)
2374
0
{
2375
0
  return (r_type == R_MIPS_TLS_LDM
2376
0
    || r_type == R_MIPS16_TLS_LDM
2377
0
    || r_type == R_MICROMIPS_TLS_LDM);
2378
0
}
2379
2380
static inline bool
2381
tls_gottprel_reloc_p (unsigned int r_type)
2382
0
{
2383
0
  return (r_type == R_MIPS_TLS_GOTTPREL
2384
0
    || r_type == R_MIPS16_TLS_GOTTPREL
2385
0
    || r_type == R_MICROMIPS_TLS_GOTTPREL);
2386
0
}
2387
2388
static inline bool
2389
needs_shuffle (int r_type)
2390
725
{
2391
725
  return mips16_reloc_p (r_type) || micromips_reloc_shuffle_p (r_type);
2392
725
}
2393
2394
void
2395
_bfd_mips_elf_reloc_unshuffle (bfd *abfd, int r_type,
2396
             bool jal_shuffle, bfd_byte *data)
2397
359
{
2398
359
  bfd_vma first, second, val;
2399
2400
359
  if (!needs_shuffle (r_type))
2401
296
    return;
2402
2403
  /* Pick up the first and second halfwords of the instruction.  */
2404
63
  first = bfd_get_16 (abfd, data);
2405
63
  second = bfd_get_16 (abfd, data + 2);
2406
63
  if (micromips_reloc_p (r_type) || (r_type == R_MIPS16_26 && !jal_shuffle))
2407
38
    val = first << 16 | second;
2408
25
  else if (r_type != R_MIPS16_26)
2409
25
    val = (((first & 0xf800) << 16) | ((second & 0xffe0) << 11)
2410
25
     | ((first & 0x1f) << 11) | (first & 0x7e0) | (second & 0x1f));
2411
0
  else
2412
0
    val = (((first & 0xfc00) << 16) | ((first & 0x3e0) << 11)
2413
0
     | ((first & 0x1f) << 21) | second);
2414
63
  bfd_put_32 (abfd, val, data);
2415
63
}
2416
2417
void
2418
_bfd_mips_elf_reloc_shuffle (bfd *abfd, int r_type,
2419
           bool jal_shuffle, bfd_byte *data)
2420
359
{
2421
359
  bfd_vma first, second, val;
2422
2423
359
  if (!needs_shuffle (r_type))
2424
296
    return;
2425
2426
63
  val = bfd_get_32 (abfd, data);
2427
63
  if (micromips_reloc_p (r_type) || (r_type == R_MIPS16_26 && !jal_shuffle))
2428
38
    {
2429
38
      second = val & 0xffff;
2430
38
      first = val >> 16;
2431
38
    }
2432
25
  else if (r_type != R_MIPS16_26)
2433
25
    {
2434
25
      second = ((val >> 11) & 0xffe0) | (val & 0x1f);
2435
25
      first = ((val >> 16) & 0xf800) | ((val >> 11) & 0x1f) | (val & 0x7e0);
2436
25
    }
2437
0
  else
2438
0
    {
2439
0
      second = val & 0xffff;
2440
0
      first = ((val >> 16) & 0xfc00) | ((val >> 11) & 0x3e0)
2441
0
         | ((val >> 21) & 0x1f);
2442
0
    }
2443
63
  bfd_put_16 (abfd, second, data + 2);
2444
63
  bfd_put_16 (abfd, first, data);
2445
63
}
2446
2447
/* Perform reloc offset checking.
2448
   We can only use bfd_reloc_offset_in_range, which takes into account
2449
   the size of the field being relocated, when section contents will
2450
   be accessed because mips object files may use relocations that seem
2451
   to access beyond section limits.
2452
   gas/testsuite/gas/mips/dla-reloc.s is an example that puts
2453
   R_MIPS_SUB, a 64-bit relocation, on the last instruction in the
2454
   section.  The R_MIPS_SUB applies to the addend for the next reloc
2455
   rather than the section contents.
2456
2457
   CHECK is CHECK_STD for the standard bfd_reloc_offset_in_range check,
2458
   CHECK_INPLACE to only check partial_inplace relocs, and
2459
   CHECK_SHUFFLE to only check relocs that shuffle/unshuffle.  */
2460
2461
bool
2462
_bfd_mips_reloc_offset_in_range (bfd *abfd, asection *input_section,
2463
         arelent *reloc_entry, enum reloc_check check)
2464
426
{
2465
426
  if (check == check_inplace && !reloc_entry->howto->partial_inplace)
2466
0
    return true;
2467
426
  if (check == check_shuffle && !needs_shuffle (reloc_entry->howto->type))
2468
2
    return true;
2469
424
  return bfd_reloc_offset_in_range (reloc_entry->howto, abfd,
2470
424
            input_section, reloc_entry->address);
2471
426
}
2472
2473
bfd_reloc_status_type
2474
_bfd_mips_elf_gprel16_with_gp (bfd *abfd, asymbol *symbol,
2475
             arelent *reloc_entry, asection *input_section,
2476
             bool relocatable, void *data, bfd_vma gp)
2477
22
{
2478
22
  bfd_vma relocation;
2479
22
  bfd_signed_vma val;
2480
22
  bfd_reloc_status_type status;
2481
2482
22
  if (bfd_is_com_section (symbol->section))
2483
2
    relocation = 0;
2484
20
  else
2485
20
    relocation = symbol->value;
2486
2487
22
  if (symbol->section->output_section != NULL)
2488
22
    {
2489
22
      relocation += symbol->section->output_section->vma;
2490
22
      relocation += symbol->section->output_offset;
2491
22
    }
2492
2493
  /* Set val to the offset into the section or symbol.  */
2494
22
  val = reloc_entry->addend;
2495
2496
22
  _bfd_mips_elf_sign_extend (val, 16);
2497
2498
  /* Adjust val for the final section location and GP value.  If we
2499
     are producing relocatable output, we don't want to do this for
2500
     an external symbol.  */
2501
22
  if (! relocatable
2502
0
      || (symbol->flags & BSF_SECTION_SYM) != 0)
2503
22
    val += relocation - gp;
2504
2505
22
  if (reloc_entry->howto->partial_inplace)
2506
2
    {
2507
2
      if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd, input_section,
2508
2
              reloc_entry->address))
2509
2
  return bfd_reloc_outofrange;
2510
2511
0
      status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
2512
0
               (bfd_byte *) data
2513
0
               + reloc_entry->address);
2514
0
      if (status != bfd_reloc_ok)
2515
0
  return status;
2516
0
    }
2517
20
  else
2518
20
    reloc_entry->addend = val;
2519
2520
20
  if (relocatable)
2521
0
    reloc_entry->address += input_section->output_offset;
2522
2523
20
  return bfd_reloc_ok;
2524
22
}
2525
2526
/* A howto special_function for REL *HI16 relocations.  We can only
2527
   calculate the correct value once we've seen the partnering
2528
   *LO16 relocation, so just save the information for later.
2529
2530
   The ABI requires that the *LO16 immediately follow the *HI16.
2531
   However, as a GNU extension, we permit an arbitrary number of
2532
   *HI16s to be associated with a single *LO16.  This significantly
2533
   simplies the relocation handling in gcc.  */
2534
2535
bfd_reloc_status_type
2536
_bfd_mips_elf_hi16_reloc (bfd *abfd, arelent *reloc_entry,
2537
        asymbol *symbol ATTRIBUTE_UNUSED, void *data,
2538
        asection *input_section, bfd *output_bfd,
2539
        char **error_message ATTRIBUTE_UNUSED)
2540
2
{
2541
2
  struct _mips_elf_section_data *sdata;
2542
2
  struct mips_hi16 *n;
2543
2544
2
  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2545
0
    return bfd_reloc_outofrange;
2546
2547
2
  n = bfd_malloc (sizeof *n);
2548
2
  if (n == NULL)
2549
0
    return bfd_reloc_outofrange;
2550
2551
2
  sdata = mips_elf_section_data (input_section);
2552
2
  n->next = sdata->mips_hi16_list;
2553
2
  n->data = data;
2554
2
  n->output_bfd = output_bfd;
2555
2
  n->rel = *reloc_entry;
2556
2
  sdata->mips_hi16_list = n;
2557
2558
2
  if (output_bfd != NULL)
2559
0
    reloc_entry->address += input_section->output_offset;
2560
2561
2
  return bfd_reloc_ok;
2562
2
}
2563
2564
/* A howto special_function for REL R_MIPS*_GOT16 relocations.  This is just
2565
   like any other 16-bit relocation when applied to global symbols, but is
2566
   treated in the same as R_MIPS_HI16 when applied to local symbols.  */
2567
2568
bfd_reloc_status_type
2569
_bfd_mips_elf_got16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2570
         void *data, asection *input_section,
2571
         bfd *output_bfd, char **error_message)
2572
0
{
2573
0
  if ((symbol->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
2574
0
      || bfd_is_und_section (bfd_asymbol_section (symbol))
2575
0
      || bfd_is_com_section (bfd_asymbol_section (symbol)))
2576
    /* The relocation is against a global symbol.  */
2577
0
    return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2578
0
          input_section, output_bfd,
2579
0
          error_message);
2580
2581
0
  return _bfd_mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
2582
0
           input_section, output_bfd, error_message);
2583
0
}
2584
2585
/* A helper function for REL high-part relocations that takes into account
2586
   local R_MIPS*_GOT16 relocations, which are something of a special case.
2587
   We want to install the addend in the same way as for a R_MIPS*_HI16
2588
   relocation (with a rightshift of 16).  However, since GOT16 relocations
2589
   can also be used with global symbols, their howto has a rightshift of 0.  */
2590
2591
static bfd_reloc_status_type
2592
_bfd_mips_elf_shr16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2593
         void *data, asection *input_section,
2594
         bfd *output_bfd, char **error_message)
2595
2
{
2596
2
  reloc_howto_type **howto = &reloc_entry->howto;
2597
2598
2
  if ((*howto)->type == R_MIPS_GOT16)
2599
0
    *howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MIPS_HI16, false);
2600
2
  else if ((*howto)->type == R_MIPS16_GOT16)
2601
0
    *howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MIPS16_HI16, false);
2602
2
  else if ((*howto)->type == R_MICROMIPS_GOT16)
2603
0
    *howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MICROMIPS_HI16, false);
2604
2605
2
  return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2606
2
              input_section, output_bfd,
2607
2
              error_message);
2608
2
}
2609
2610
/* A howto special_function for REL *LO16 relocations.  The *LO16 itself
2611
   is a straightforward 16 bit inplace relocation, but we must deal with
2612
   any partnering high-part relocations as well.  */
2613
2614
bfd_reloc_status_type
2615
_bfd_mips_elf_lo16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2616
        void *data, asection *input_section,
2617
        bfd *output_bfd, char **error_message)
2618
2
{
2619
2
  bfd_vma vallo;
2620
2
  bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
2621
2
  struct _mips_elf_section_data *sdata;
2622
2623
2
  if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd, input_section,
2624
2
          reloc_entry->address))
2625
2
    return bfd_reloc_outofrange;
2626
2627
0
  _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, false,
2628
0
         location);
2629
  /* The high 16 bits of the addend are stored in the high insn, the
2630
     low 16 bits in the low insn, but there is a catch:  You can't
2631
     just concatenate the high and low parts.  The high part of the
2632
     addend is adjusted for the fact that the low part is sign
2633
     extended.  For example, an addend of 0x38000 would have 0x0004 in
2634
     the high part and 0x8000 (=0xff..f8000) in the low part.
2635
     To extract the actual addend, calculate
2636
     ((hi & 0xffff) << 16) + ((lo & 0xffff) ^ 0x8000) - 0x8000.  */
2637
0
  vallo = _bfd_mips_elf_sign_extend (bfd_get_32 (abfd, location) & 0xffff, 16);
2638
0
  _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, false,
2639
0
             location);
2640
  /* Add in the separate addend, if any.  Since we are REL here this
2641
     will have been set and the in-place addend cleared if we have
2642
     been called from GAS via `bfd_install_relocation'.  */
2643
0
  vallo += reloc_entry->addend;
2644
2645
0
  sdata = mips_elf_section_data (input_section);
2646
0
  while (sdata->mips_hi16_list != NULL)
2647
0
    {
2648
0
      bfd_reloc_status_type ret;
2649
0
      struct mips_hi16 *hi;
2650
0
      bfd_vma addhi;
2651
0
      bfd_vma addlo;
2652
2653
0
      hi = sdata->mips_hi16_list;
2654
2655
      /* We will be applying (symbol + addend) & 0xffff to the low insn,
2656
   and we want to apply (symbol + addend + 0x8000) >> 16 to the
2657
   high insn (the +0x8000 adjusting for when the applied low part is
2658
   negative).  */
2659
0
      addhi = (hi->rel.addend + 0x8000) & ~(bfd_vma) 0xffff;
2660
0
      addlo = vallo;
2661
2662
      /* For a PC-relative relocation the PCLO16 part of the addend
2663
   is relative to its PC and not ours, so we need to adjust it.  */
2664
0
      if (hi->rel.howto->type == R_MIPS_PCHI16)
2665
0
  addlo -= reloc_entry->address - hi->rel.address;
2666
2667
0
      hi->rel.addend = addhi + _bfd_mips_elf_sign_extend (addlo & 0xffff, 16);
2668
2669
0
      ret = _bfd_mips_elf_shr16_reloc (abfd, &hi->rel, symbol, hi->data,
2670
0
               input_section, hi->output_bfd,
2671
0
               error_message);
2672
2673
0
      sdata->mips_hi16_list = hi->next;
2674
0
      free (hi);
2675
2676
0
      if (ret != bfd_reloc_ok)
2677
0
  return ret;
2678
0
    }
2679
2680
0
  return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2681
0
              input_section, output_bfd,
2682
0
              error_message);
2683
0
}
2684
2685
/* A generic howto special_function.  This calculates and installs the
2686
   relocation itself, thus avoiding the oft-discussed problems in
2687
   bfd_perform_relocation and bfd_install_relocation.  */
2688
2689
bfd_reloc_status_type
2690
_bfd_mips_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2691
           asymbol *symbol, void *data ATTRIBUTE_UNUSED,
2692
           asection *input_section, bfd *output_bfd,
2693
           char **error_message ATTRIBUTE_UNUSED)
2694
419
{
2695
419
  bfd_signed_vma val;
2696
419
  bfd_reloc_status_type status;
2697
419
  bool relocatable;
2698
2699
419
  relocatable = (output_bfd != NULL);
2700
2701
419
  if (!_bfd_mips_reloc_offset_in_range (abfd, input_section, reloc_entry,
2702
419
          (relocatable
2703
419
           ? check_inplace : check_std)))
2704
67
    return bfd_reloc_outofrange;
2705
2706
  /* Build up the field adjustment in VAL.  */
2707
352
  val = 0;
2708
352
  if ((!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0)
2709
352
      && symbol->section->output_section != NULL)
2710
352
    {
2711
      /* Either we're calculating the final field value or we have a
2712
   relocation against a section symbol.  Add in the section's
2713
   offset or address.  */
2714
352
      val += symbol->section->output_section->vma;
2715
352
      val += symbol->section->output_offset;
2716
352
    }
2717
2718
352
  if (!relocatable)
2719
352
    {
2720
      /* We're calculating the final field value.  Add in the symbol's value
2721
   and, if pc-relative, subtract the address of the field itself.  */
2722
352
      val += symbol->value;
2723
352
      if (reloc_entry->howto->pc_relative)
2724
16
  {
2725
16
    val -= input_section->output_section->vma;
2726
16
    val -= input_section->output_offset;
2727
16
    val -= reloc_entry->address;
2728
16
  }
2729
352
    }
2730
2731
  /* VAL is now the final adjustment.  If we're keeping this relocation
2732
     in the output file, and if the relocation uses a separate addend,
2733
     we just need to add VAL to that addend.  Otherwise we need to add
2734
     VAL to the relocation field itself.  */
2735
352
  if (relocatable && !reloc_entry->howto->partial_inplace)
2736
0
    reloc_entry->addend += val;
2737
352
  else
2738
352
    {
2739
352
      bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
2740
2741
      /* Add in the separate addend, if any.  */
2742
352
      val += reloc_entry->addend;
2743
2744
      /* The high 16 bits of the addend are stored in the high insn, the
2745
   low 16 bits in the low insn, but there is a catch:  You can't
2746
   just concatenate the high and low parts.  The high part of the
2747
   addend is adjusted for the fact that the low part is sign
2748
   extended.  For example, an addend of 0x38000 would have 0x0004 in
2749
   the high part and 0x8000 (=0xff..f8000) in the low part.
2750
   We will be applying (symbol + addend) & 0xffff to the low insn,
2751
   and we want to apply (symbol + addend + 0x8000) >> 16 to the
2752
   high insn (the +0x8000 adjusting for when the applied low part is
2753
   negative).  Analogously for the higher parts of a 64-bit addend.  */
2754
352
      if (reloc_entry->howto->bitsize == 16
2755
73
    && reloc_entry->howto->rightshift % 16 == 0)
2756
68
#ifdef BFD64
2757
68
  val += 0x800080008000ULL >> (48 - reloc_entry->howto->rightshift);
2758
#else
2759
  {
2760
    if (reloc_entry->howto->rightshift <= 16)
2761
      val += 0x8000 >> (16 - reloc_entry->howto->rightshift);
2762
    else
2763
      abort ();
2764
  }
2765
#endif
2766
2767
      /* Add VAL to the relocation field.  */
2768
352
      _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, false,
2769
352
             location);
2770
352
      status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
2771
352
               location);
2772
352
      _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, false,
2773
352
           location);
2774
2775
352
      if (status != bfd_reloc_ok)
2776
23
  return status;
2777
352
    }
2778
2779
329
  if (relocatable)
2780
0
    reloc_entry->address += input_section->output_offset;
2781
2782
329
  return bfd_reloc_ok;
2783
352
}
2784

2785
/* Swap an entry in a .gptab section.  Note that these routines rely
2786
   on the equivalence of the two elements of the union.  */
2787
2788
static void
2789
bfd_mips_elf32_swap_gptab_in (bfd *abfd, const Elf32_External_gptab *ex,
2790
            Elf32_gptab *in)
2791
0
{
2792
0
  in->gt_entry.gt_g_value = H_GET_32 (abfd, ex->gt_entry.gt_g_value);
2793
0
  in->gt_entry.gt_bytes = H_GET_32 (abfd, ex->gt_entry.gt_bytes);
2794
0
}
2795
2796
static void
2797
bfd_mips_elf32_swap_gptab_out (bfd *abfd, const Elf32_gptab *in,
2798
             Elf32_External_gptab *ex)
2799
0
{
2800
0
  H_PUT_32 (abfd, in->gt_entry.gt_g_value, ex->gt_entry.gt_g_value);
2801
0
  H_PUT_32 (abfd, in->gt_entry.gt_bytes, ex->gt_entry.gt_bytes);
2802
0
}
2803
2804
static void
2805
bfd_elf32_swap_compact_rel_out (bfd *abfd, const Elf32_compact_rel *in,
2806
        Elf32_External_compact_rel *ex)
2807
0
{
2808
0
  H_PUT_32 (abfd, in->id1, ex->id1);
2809
0
  H_PUT_32 (abfd, in->num, ex->num);
2810
0
  H_PUT_32 (abfd, in->id2, ex->id2);
2811
0
  H_PUT_32 (abfd, in->offset, ex->offset);
2812
0
  H_PUT_32 (abfd, in->reserved0, ex->reserved0);
2813
0
  H_PUT_32 (abfd, in->reserved1, ex->reserved1);
2814
0
}
2815
2816
static void
2817
bfd_elf32_swap_crinfo_out (bfd *abfd, const Elf32_crinfo *in,
2818
         Elf32_External_crinfo *ex)
2819
0
{
2820
0
  unsigned long l;
2821
2822
0
  l = (((in->ctype & CRINFO_CTYPE) << CRINFO_CTYPE_SH)
2823
0
       | ((in->rtype & CRINFO_RTYPE) << CRINFO_RTYPE_SH)
2824
0
       | ((in->dist2to & CRINFO_DIST2TO) << CRINFO_DIST2TO_SH)
2825
0
       | ((in->relvaddr & CRINFO_RELVADDR) << CRINFO_RELVADDR_SH));
2826
0
  H_PUT_32 (abfd, l, ex->info);
2827
0
  H_PUT_32 (abfd, in->konst, ex->konst);
2828
0
  H_PUT_32 (abfd, in->vaddr, ex->vaddr);
2829
0
}
2830

2831
/* A .reginfo section holds a single Elf32_RegInfo structure.  These
2832
   routines swap this structure in and out.  They are used outside of
2833
   BFD, so they are globally visible.  */
2834
2835
void
2836
bfd_mips_elf32_swap_reginfo_in (bfd *abfd, const Elf32_External_RegInfo *ex,
2837
        Elf32_RegInfo *in)
2838
0
{
2839
0
  in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
2840
0
  in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
2841
0
  in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
2842
0
  in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
2843
0
  in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
2844
0
  in->ri_gp_value = H_GET_32 (abfd, ex->ri_gp_value);
2845
0
}
2846
2847
void
2848
bfd_mips_elf32_swap_reginfo_out (bfd *abfd, const Elf32_RegInfo *in,
2849
         Elf32_External_RegInfo *ex)
2850
0
{
2851
0
  H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
2852
0
  H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
2853
0
  H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
2854
0
  H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
2855
0
  H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
2856
0
  H_PUT_32 (abfd, in->ri_gp_value, ex->ri_gp_value);
2857
0
}
2858
2859
/* In the 64 bit ABI, the .MIPS.options section holds register
2860
   information in an Elf64_Reginfo structure.  These routines swap
2861
   them in and out.  They are globally visible because they are used
2862
   outside of BFD.  These routines are here so that gas can call them
2863
   without worrying about whether the 64 bit ABI has been included.  */
2864
2865
void
2866
bfd_mips_elf64_swap_reginfo_in (bfd *abfd, const Elf64_External_RegInfo *ex,
2867
        Elf64_Internal_RegInfo *in)
2868
50
{
2869
50
  in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
2870
50
  in->ri_pad = H_GET_32 (abfd, ex->ri_pad);
2871
50
  in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
2872
50
  in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
2873
50
  in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
2874
50
  in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
2875
50
  in->ri_gp_value = H_GET_64 (abfd, ex->ri_gp_value);
2876
50
}
2877
2878
void
2879
bfd_mips_elf64_swap_reginfo_out (bfd *abfd, const Elf64_Internal_RegInfo *in,
2880
         Elf64_External_RegInfo *ex)
2881
0
{
2882
0
  H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
2883
0
  H_PUT_32 (abfd, in->ri_pad, ex->ri_pad);
2884
0
  H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
2885
0
  H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
2886
0
  H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
2887
0
  H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
2888
0
  H_PUT_64 (abfd, in->ri_gp_value, ex->ri_gp_value);
2889
0
}
2890
2891
/* Swap in an options header.  */
2892
2893
void
2894
bfd_mips_elf_swap_options_in (bfd *abfd, const Elf_External_Options *ex,
2895
            Elf_Internal_Options *in)
2896
903
{
2897
903
  in->kind = H_GET_8 (abfd, ex->kind);
2898
903
  in->size = H_GET_8 (abfd, ex->size);
2899
903
  in->section = H_GET_16 (abfd, ex->section);
2900
903
  in->info = H_GET_32 (abfd, ex->info);
2901
903
}
2902
2903
/* Swap out an options header.  */
2904
2905
void
2906
bfd_mips_elf_swap_options_out (bfd *abfd, const Elf_Internal_Options *in,
2907
             Elf_External_Options *ex)
2908
0
{
2909
0
  H_PUT_8 (abfd, in->kind, ex->kind);
2910
0
  H_PUT_8 (abfd, in->size, ex->size);
2911
0
  H_PUT_16 (abfd, in->section, ex->section);
2912
0
  H_PUT_32 (abfd, in->info, ex->info);
2913
0
}
2914
2915
/* Swap in an abiflags structure.  */
2916
2917
void
2918
bfd_mips_elf_swap_abiflags_v0_in (bfd *abfd,
2919
          const Elf_External_ABIFlags_v0 *ex,
2920
          Elf_Internal_ABIFlags_v0 *in)
2921
0
{
2922
0
  in->version = H_GET_16 (abfd, ex->version);
2923
0
  in->isa_level = H_GET_8 (abfd, ex->isa_level);
2924
0
  in->isa_rev = H_GET_8 (abfd, ex->isa_rev);
2925
0
  in->gpr_size = H_GET_8 (abfd, ex->gpr_size);
2926
0
  in->cpr1_size = H_GET_8 (abfd, ex->cpr1_size);
2927
0
  in->cpr2_size = H_GET_8 (abfd, ex->cpr2_size);
2928
0
  in->fp_abi = H_GET_8 (abfd, ex->fp_abi);
2929
0
  in->isa_ext = H_GET_32 (abfd, ex->isa_ext);
2930
0
  in->ases = H_GET_32 (abfd, ex->ases);
2931
0
  in->flags1 = H_GET_32 (abfd, ex->flags1);
2932
0
  in->flags2 = H_GET_32 (abfd, ex->flags2);
2933
0
}
2934
2935
/* Swap out an abiflags structure.  */
2936
2937
void
2938
bfd_mips_elf_swap_abiflags_v0_out (bfd *abfd,
2939
           const Elf_Internal_ABIFlags_v0 *in,
2940
           Elf_External_ABIFlags_v0 *ex)
2941
0
{
2942
0
  H_PUT_16 (abfd, in->version, ex->version);
2943
0
  H_PUT_8 (abfd, in->isa_level, ex->isa_level);
2944
0
  H_PUT_8 (abfd, in->isa_rev, ex->isa_rev);
2945
0
  H_PUT_8 (abfd, in->gpr_size, ex->gpr_size);
2946
0
  H_PUT_8 (abfd, in->cpr1_size, ex->cpr1_size);
2947
0
  H_PUT_8 (abfd, in->cpr2_size, ex->cpr2_size);
2948
0
  H_PUT_8 (abfd, in->fp_abi, ex->fp_abi);
2949
0
  H_PUT_32 (abfd, in->isa_ext, ex->isa_ext);
2950
0
  H_PUT_32 (abfd, in->ases, ex->ases);
2951
0
  H_PUT_32 (abfd, in->flags1, ex->flags1);
2952
0
  H_PUT_32 (abfd, in->flags2, ex->flags2);
2953
0
}
2954

2955
/* This function is called via qsort() to sort the dynamic relocation
2956
   entries by increasing r_symndx value.  */
2957
2958
static int
2959
sort_dynamic_relocs (const void *arg1, const void *arg2)
2960
0
{
2961
0
  Elf_Internal_Rela int_reloc1;
2962
0
  Elf_Internal_Rela int_reloc2;
2963
0
  int diff;
2964
2965
0
  bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg1, &int_reloc1);
2966
0
  bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg2, &int_reloc2);
2967
2968
0
  diff = ELF32_R_SYM (int_reloc1.r_info) - ELF32_R_SYM (int_reloc2.r_info);
2969
0
  if (diff != 0)
2970
0
    return diff;
2971
2972
0
  if (int_reloc1.r_offset < int_reloc2.r_offset)
2973
0
    return -1;
2974
0
  if (int_reloc1.r_offset > int_reloc2.r_offset)
2975
0
    return 1;
2976
0
  return 0;
2977
0
}
2978
2979
/* Like sort_dynamic_relocs, but used for elf64 relocations.  */
2980
2981
static int
2982
sort_dynamic_relocs_64 (const void *arg1 ATTRIBUTE_UNUSED,
2983
      const void *arg2 ATTRIBUTE_UNUSED)
2984
0
{
2985
0
#ifdef BFD64
2986
0
  Elf_Internal_Rela int_reloc1[3];
2987
0
  Elf_Internal_Rela int_reloc2[3];
2988
2989
0
  (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
2990
0
    (reldyn_sorting_bfd, arg1, int_reloc1);
2991
0
  (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
2992
0
    (reldyn_sorting_bfd, arg2, int_reloc2);
2993
2994
0
  if (ELF64_R_SYM (int_reloc1[0].r_info) < ELF64_R_SYM (int_reloc2[0].r_info))
2995
0
    return -1;
2996
0
  if (ELF64_R_SYM (int_reloc1[0].r_info) > ELF64_R_SYM (int_reloc2[0].r_info))
2997
0
    return 1;
2998
2999
0
  if (int_reloc1[0].r_offset < int_reloc2[0].r_offset)
3000
0
    return -1;
3001
0
  if (int_reloc1[0].r_offset > int_reloc2[0].r_offset)
3002
0
    return 1;
3003
0
  return 0;
3004
#else
3005
  abort ();
3006
#endif
3007
0
}
3008
3009
3010
/* This routine is used to write out ECOFF debugging external symbol
3011
   information.  It is called via mips_elf_link_hash_traverse.  The
3012
   ECOFF external symbol information must match the ELF external
3013
   symbol information.  Unfortunately, at this point we don't know
3014
   whether a symbol is required by reloc information, so the two
3015
   tables may wind up being different.  We must sort out the external
3016
   symbol information before we can set the final size of the .mdebug
3017
   section, and we must set the size of the .mdebug section before we
3018
   can relocate any sections, and we can't know which symbols are
3019
   required by relocation until we relocate the sections.
3020
   Fortunately, it is relatively unlikely that any symbol will be
3021
   stripped but required by a reloc.  In particular, it can not happen
3022
   when generating a final executable.  */
3023
3024
static bool
3025
mips_elf_output_extsym (struct mips_elf_link_hash_entry *h, void *data)
3026
0
{
3027
0
  struct extsym_info *einfo = data;
3028
0
  bool strip;
3029
0
  asection *sec, *output_section;
3030
3031
0
  if (h->root.indx == -2)
3032
0
    strip = false;
3033
0
  else if ((h->root.def_dynamic
3034
0
      || h->root.ref_dynamic
3035
0
      || h->root.type == bfd_link_hash_new)
3036
0
     && !h->root.def_regular
3037
0
     && !h->root.ref_regular)
3038
0
    strip = true;
3039
0
  else if (einfo->info->strip == strip_all
3040
0
     || (einfo->info->strip == strip_some
3041
0
         && bfd_hash_lookup (einfo->info->keep_hash,
3042
0
           h->root.root.root.string,
3043
0
           false, false) == NULL))
3044
0
    strip = true;
3045
0
  else
3046
0
    strip = false;
3047
3048
0
  if (strip)
3049
0
    return true;
3050
3051
0
  if (h->esym.ifd == -2)
3052
0
    {
3053
0
      h->esym.jmptbl = 0;
3054
0
      h->esym.cobol_main = 0;
3055
0
      h->esym.weakext = 0;
3056
0
      h->esym.reserved = 0;
3057
0
      h->esym.ifd = ifdNil;
3058
0
      h->esym.asym.value = 0;
3059
0
      h->esym.asym.st = stGlobal;
3060
3061
0
      if (h->root.root.type == bfd_link_hash_undefined
3062
0
    || h->root.root.type == bfd_link_hash_undefweak)
3063
0
  {
3064
0
    const char *name;
3065
3066
    /* Use undefined class.  Also, set class and type for some
3067
       special symbols.  */
3068
0
    name = h->root.root.root.string;
3069
0
    if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
3070
0
        || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
3071
0
      {
3072
0
        h->esym.asym.sc = scData;
3073
0
        h->esym.asym.st = stLabel;
3074
0
        h->esym.asym.value = 0;
3075
0
      }
3076
0
    else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
3077
0
      {
3078
0
        h->esym.asym.sc = scAbs;
3079
0
        h->esym.asym.st = stLabel;
3080
0
        h->esym.asym.value =
3081
0
    mips_elf_hash_table (einfo->info)->procedure_count;
3082
0
      }
3083
0
    else
3084
0
      h->esym.asym.sc = scUndefined;
3085
0
  }
3086
0
      else if (h->root.root.type != bfd_link_hash_defined
3087
0
    && h->root.root.type != bfd_link_hash_defweak)
3088
0
  h->esym.asym.sc = scAbs;
3089
0
      else
3090
0
  {
3091
0
    const char *name;
3092
3093
0
    sec = h->root.root.u.def.section;
3094
0
    output_section = sec->output_section;
3095
3096
    /* When making a shared library and symbol h is the one from
3097
       the another shared library, OUTPUT_SECTION may be null.  */
3098
0
    if (output_section == NULL)
3099
0
      h->esym.asym.sc = scUndefined;
3100
0
    else
3101
0
      {
3102
0
        name = bfd_section_name (output_section);
3103
3104
0
        if (strcmp (name, ".text") == 0)
3105
0
    h->esym.asym.sc = scText;
3106
0
        else if (strcmp (name, ".data") == 0)
3107
0
    h->esym.asym.sc = scData;
3108
0
        else if (strcmp (name, ".sdata") == 0)
3109
0
    h->esym.asym.sc = scSData;
3110
0
        else if (strcmp (name, ".rodata") == 0
3111
0
           || strcmp (name, ".rdata") == 0)
3112
0
    h->esym.asym.sc = scRData;
3113
0
        else if (strcmp (name, ".bss") == 0)
3114
0
    h->esym.asym.sc = scBss;
3115
0
        else if (strcmp (name, ".sbss") == 0)
3116
0
    h->esym.asym.sc = scSBss;
3117
0
        else if (strcmp (name, ".init") == 0)
3118
0
    h->esym.asym.sc = scInit;
3119
0
        else if (strcmp (name, ".fini") == 0)
3120
0
    h->esym.asym.sc = scFini;
3121
0
        else
3122
0
    h->esym.asym.sc = scAbs;
3123
0
      }
3124
0
  }
3125
3126
0
      h->esym.asym.reserved = 0;
3127
0
      h->esym.asym.index = indexNil;
3128
0
    }
3129
3130
0
  if (h->root.root.type == bfd_link_hash_common)
3131
0
    h->esym.asym.value = h->root.root.u.c.size;
3132
0
  else if (h->root.root.type == bfd_link_hash_defined
3133
0
     || h->root.root.type == bfd_link_hash_defweak)
3134
0
    {
3135
0
      if (h->esym.asym.sc == scCommon)
3136
0
  h->esym.asym.sc = scBss;
3137
0
      else if (h->esym.asym.sc == scSCommon)
3138
0
  h->esym.asym.sc = scSBss;
3139
3140
0
      sec = h->root.root.u.def.section;
3141
0
      output_section = sec->output_section;
3142
0
      if (output_section != NULL)
3143
0
  h->esym.asym.value = (h->root.root.u.def.value
3144
0
            + sec->output_offset
3145
0
            + output_section->vma);
3146
0
      else
3147
0
  h->esym.asym.value = 0;
3148
0
    }
3149
0
  else
3150
0
    {
3151
0
      struct mips_elf_link_hash_entry *hd = h;
3152
3153
0
      while (hd->root.root.type == bfd_link_hash_indirect)
3154
0
  hd = (struct mips_elf_link_hash_entry *)h->root.root.u.i.link;
3155
3156
0
      if (hd->needs_lazy_stub)
3157
0
  {
3158
0
    BFD_ASSERT (hd->root.plt.plist != NULL);
3159
0
    BFD_ASSERT (hd->root.plt.plist->stub_offset != MINUS_ONE);
3160
    /* Set type and value for a symbol with a function stub.  */
3161
0
    h->esym.asym.st = stProc;
3162
0
    sec = hd->root.root.u.def.section;
3163
0
    if (sec == NULL)
3164
0
      h->esym.asym.value = 0;
3165
0
    else
3166
0
      {
3167
0
        output_section = sec->output_section;
3168
0
        if (output_section != NULL)
3169
0
    h->esym.asym.value = (hd->root.plt.plist->stub_offset
3170
0
              + sec->output_offset
3171
0
              + output_section->vma);
3172
0
        else
3173
0
    h->esym.asym.value = 0;
3174
0
      }
3175
0
  }
3176
0
    }
3177
3178
0
  if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
3179
0
              h->root.root.root.string,
3180
0
              &h->esym))
3181
0
    {
3182
0
      einfo->failed = true;
3183
0
      return false;
3184
0
    }
3185
3186
0
  return true;
3187
0
}
3188
3189
/* A comparison routine used to sort .gptab entries.  */
3190
3191
static int
3192
gptab_compare (const void *p1, const void *p2)
3193
0
{
3194
0
  const Elf32_gptab *a1 = p1;
3195
0
  const Elf32_gptab *a2 = p2;
3196
3197
0
  return a1->gt_entry.gt_g_value - a2->gt_entry.gt_g_value;
3198
0
}
3199

3200
/* Functions to manage the got entry hash table.  */
3201
3202
/* Use all 64 bits of a bfd_vma for the computation of a 32-bit
3203
   hash number.  */
3204
3205
static inline hashval_t
3206
mips_elf_hash_bfd_vma (bfd_vma addr)
3207
0
{
3208
0
#ifdef BFD64
3209
0
  return addr + (addr >> 32);
3210
#else
3211
  return addr;
3212
#endif
3213
0
}
3214
3215
static hashval_t
3216
mips_elf_got_entry_hash (const void *entry_)
3217
0
{
3218
0
  const struct mips_got_entry *entry = (struct mips_got_entry *)entry_;
3219
3220
0
  return (entry->symndx
3221
0
    + ((entry->tls_type == GOT_TLS_LDM) << 18)
3222
0
    + (entry->tls_type == GOT_TLS_LDM ? 0
3223
0
       : !entry->abfd ? mips_elf_hash_bfd_vma (entry->d.address)
3224
0
       : entry->symndx >= 0 ? (entry->abfd->id
3225
0
             + mips_elf_hash_bfd_vma (entry->d.addend))
3226
0
       : entry->d.h->root.root.root.hash));
3227
0
}
3228
3229
static int
3230
mips_elf_got_entry_eq (const void *entry1, const void *entry2)
3231
0
{
3232
0
  const struct mips_got_entry *e1 = (struct mips_got_entry *)entry1;
3233
0
  const struct mips_got_entry *e2 = (struct mips_got_entry *)entry2;
3234
3235
0
  return (e1->symndx == e2->symndx
3236
0
    && e1->tls_type == e2->tls_type
3237
0
    && (e1->tls_type == GOT_TLS_LDM ? true
3238
0
        : !e1->abfd ? !e2->abfd && e1->d.address == e2->d.address
3239
0
        : e1->symndx >= 0 ? (e1->abfd == e2->abfd
3240
0
           && e1->d.addend == e2->d.addend)
3241
0
        : e2->abfd && e1->d.h == e2->d.h));
3242
0
}
3243
3244
static hashval_t
3245
mips_got_page_ref_hash (const void *ref_)
3246
0
{
3247
0
  const struct mips_got_page_ref *ref;
3248
3249
0
  ref = (const struct mips_got_page_ref *) ref_;
3250
0
  return ((ref->symndx >= 0
3251
0
     ? (hashval_t) (ref->u.abfd->id + ref->symndx)
3252
0
     : ref->u.h->root.root.root.hash)
3253
0
    + mips_elf_hash_bfd_vma (ref->addend));
3254
0
}
3255
3256
static int
3257
mips_got_page_ref_eq (const void *ref1_, const void *ref2_)
3258
0
{
3259
0
  const struct mips_got_page_ref *ref1, *ref2;
3260
3261
0
  ref1 = (const struct mips_got_page_ref *) ref1_;
3262
0
  ref2 = (const struct mips_got_page_ref *) ref2_;
3263
0
  return (ref1->symndx == ref2->symndx
3264
0
    && (ref1->symndx < 0
3265
0
        ? ref1->u.h == ref2->u.h
3266
0
        : ref1->u.abfd == ref2->u.abfd)
3267
0
    && ref1->addend == ref2->addend);
3268
0
}
3269
3270
static hashval_t
3271
mips_got_page_entry_hash (const void *entry_)
3272
0
{
3273
0
  const struct mips_got_page_entry *entry;
3274
3275
0
  entry = (const struct mips_got_page_entry *) entry_;
3276
0
  return entry->sec->id;
3277
0
}
3278
3279
static int
3280
mips_got_page_entry_eq (const void *entry1_, const void *entry2_)
3281
0
{
3282
0
  const struct mips_got_page_entry *entry1, *entry2;
3283
3284
0
  entry1 = (const struct mips_got_page_entry *) entry1_;
3285
0
  entry2 = (const struct mips_got_page_entry *) entry2_;
3286
0
  return entry1->sec == entry2->sec;
3287
0
}
3288

3289
/* Create and return a new mips_got_info structure.  */
3290
3291
static struct mips_got_info *
3292
mips_elf_create_got_info (bfd *abfd)
3293
0
{
3294
0
  struct mips_got_info *g;
3295
3296
0
  g = bfd_zalloc (abfd, sizeof (struct mips_got_info));
3297
0
  if (g == NULL)
3298
0
    return NULL;
3299
3300
0
  g->got_entries = htab_try_create (1, mips_elf_got_entry_hash,
3301
0
            mips_elf_got_entry_eq, NULL);
3302
0
  if (g->got_entries == NULL)
3303
0
    return NULL;
3304
3305
0
  g->got_page_refs = htab_try_create (1, mips_got_page_ref_hash,
3306
0
              mips_got_page_ref_eq, NULL);
3307
0
  if (g->got_page_refs == NULL)
3308
0
    return NULL;
3309
3310
0
  return g;
3311
0
}
3312
3313
/* Return the GOT info for input bfd ABFD, trying to create a new one if
3314
   CREATE_P and if ABFD doesn't already have a GOT.  */
3315
3316
static struct mips_got_info *
3317
mips_elf_bfd_got (bfd *abfd, bool create_p)
3318
0
{
3319
0
  struct mips_elf_obj_tdata *tdata;
3320
3321
0
  if (!is_mips_elf (abfd))
3322
0
    return NULL;
3323
3324
0
  tdata = mips_elf_tdata (abfd);
3325
0
  if (!tdata->got && create_p)
3326
0
    tdata->got = mips_elf_create_got_info (abfd);
3327
0
  return tdata->got;
3328
0
}
3329
3330
/* Record that ABFD should use output GOT G.  */
3331
3332
static void
3333
mips_elf_replace_bfd_got (bfd *abfd, struct mips_got_info *g)
3334
0
{
3335
0
  struct mips_elf_obj_tdata *tdata;
3336
3337
0
  BFD_ASSERT (is_mips_elf (abfd));
3338
0
  tdata = mips_elf_tdata (abfd);
3339
0
  if (tdata->got)
3340
0
    {
3341
      /* The GOT structure itself and the hash table entries are
3342
   allocated to a bfd, but the hash tables aren't.  */
3343
0
      htab_delete (tdata->got->got_entries);
3344
0
      htab_delete (tdata->got->got_page_refs);
3345
0
      if (tdata->got->got_page_entries)
3346
0
  htab_delete (tdata->got->got_page_entries);
3347
0
    }
3348
0
  tdata->got = g;
3349
0
}
3350
3351
/* Return the dynamic relocation section.  If it doesn't exist, try to
3352
   create a new it if CREATE_P, otherwise return NULL.  Also return NULL
3353
   if creation fails.  */
3354
3355
static asection *
3356
mips_elf_rel_dyn_section (struct bfd_link_info *info, bool create_p)
3357
0
{
3358
0
  const char *dname;
3359
0
  asection *sreloc;
3360
0
  bfd *dynobj;
3361
3362
0
  dname = MIPS_ELF_REL_DYN_NAME (info);
3363
0
  dynobj = elf_hash_table (info)->dynobj;
3364
0
  sreloc = bfd_get_linker_section (dynobj, dname);
3365
0
  if (sreloc == NULL && create_p)
3366
0
    {
3367
0
      sreloc = bfd_make_section_anyway_with_flags (dynobj, dname,
3368
0
               (SEC_ALLOC
3369
0
                | SEC_LOAD
3370
0
                | SEC_HAS_CONTENTS
3371
0
                | SEC_IN_MEMORY
3372
0
                | SEC_LINKER_CREATED
3373
0
                | SEC_READONLY));
3374
0
      if (sreloc == NULL
3375
0
    || !bfd_set_section_alignment (sreloc,
3376
0
           MIPS_ELF_LOG_FILE_ALIGN (dynobj)))
3377
0
  return NULL;
3378
0
    }
3379
0
  return sreloc;
3380
0
}
3381
3382
/* Return the GOT_TLS_* type required by relocation type R_TYPE.  */
3383
3384
static int
3385
mips_elf_reloc_tls_type (unsigned int r_type)
3386
0
{
3387
0
  if (tls_gd_reloc_p (r_type))
3388
0
    return GOT_TLS_GD;
3389
3390
0
  if (tls_ldm_reloc_p (r_type))
3391
0
    return GOT_TLS_LDM;
3392
3393
0
  if (tls_gottprel_reloc_p (r_type))
3394
0
    return GOT_TLS_IE;
3395
3396
0
  return GOT_TLS_NONE;
3397
0
}
3398
3399
/* Return the number of GOT slots needed for GOT TLS type TYPE.  */
3400
3401
static int
3402
mips_tls_got_entries (unsigned int type)
3403
0
{
3404
0
  switch (type)
3405
0
    {
3406
0
    case GOT_TLS_GD:
3407
0
    case GOT_TLS_LDM:
3408
0
      return 2;
3409
3410
0
    case GOT_TLS_IE:
3411
0
      return 1;
3412
3413
0
    case GOT_TLS_NONE:
3414
0
      return 0;
3415
0
    }
3416
0
  abort ();
3417
0
}
3418
3419
/* Count the number of relocations needed for a TLS GOT entry, with
3420
   access types from TLS_TYPE, and symbol H (or a local symbol if H
3421
   is NULL).  */
3422
3423
static int
3424
mips_tls_got_relocs (struct bfd_link_info *info, unsigned char tls_type,
3425
         struct elf_link_hash_entry *h)
3426
0
{
3427
0
  int indx = 0;
3428
0
  bool need_relocs = false;
3429
0
  bool dyn = elf_hash_table (info)->dynamic_sections_created;
3430
3431
0
  if (h != NULL
3432
0
      && h->dynindx != -1
3433
0
      && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
3434
0
      && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, h)))
3435
0
    indx = h->dynindx;
3436
3437
0
  if ((bfd_link_dll (info) || indx != 0)
3438
0
      && (h == NULL
3439
0
    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3440
0
    || h->root.type != bfd_link_hash_undefweak))
3441
0
    need_relocs = true;
3442
3443
0
  if (!need_relocs)
3444
0
    return 0;
3445
3446
0
  switch (tls_type)
3447
0
    {
3448
0
    case GOT_TLS_GD:
3449
0
      return indx != 0 ? 2 : 1;
3450
3451
0
    case GOT_TLS_IE:
3452
0
      return 1;
3453
3454
0
    case GOT_TLS_LDM:
3455
0
      return bfd_link_dll (info) ? 1 : 0;
3456
3457
0
    default:
3458
0
      return 0;
3459
0
    }
3460
0
}
3461
3462
/* Add the number of GOT entries and TLS relocations required by ENTRY
3463
   to G.  */
3464
3465
static void
3466
mips_elf_count_got_entry (struct bfd_link_info *info,
3467
        struct mips_got_info *g,
3468
        struct mips_got_entry *entry)
3469
0
{
3470
0
  if (entry->tls_type)
3471
0
    {
3472
0
      g->tls_gotno += mips_tls_got_entries (entry->tls_type);
3473
0
      g->relocs += mips_tls_got_relocs (info, entry->tls_type,
3474
0
          entry->symndx < 0
3475
0
          ? &entry->d.h->root : NULL);
3476
0
    }
3477
0
  else if (entry->symndx >= 0)
3478
0
    g->local_gotno += 1;
3479
0
  else if (entry->d.h->global_got_area == GGA_NONE)
3480
0
    {
3481
      /* On VxWorks, calls can refer directly to the .got.plt entry,
3482
   in which case they won't have an entry in the regular GOT.
3483
   This is arranged for in `mips_elf_count_got_symbols' and we
3484
   need to refrain from counting these entries for the regular
3485
   GOT here.  */
3486
0
      if (mips_elf_hash_table (info)->root.target_os != is_vxworks
3487
0
    || entry->d.h->root.dynindx == -1
3488
0
    || !entry->d.h->got_only_for_calls
3489
0
    || entry->d.h->root.plt.plist->mips_offset == MINUS_ONE)
3490
0
  g->local_gotno += 1;
3491
0
    }
3492
0
  else
3493
0
    g->global_gotno += 1;
3494
0
}
3495
3496
/* Output a simple dynamic relocation into SRELOC.  */
3497
3498
static void
3499
mips_elf_output_dynamic_relocation (bfd *output_bfd,
3500
            asection *sreloc,
3501
            unsigned long reloc_index,
3502
            unsigned long indx,
3503
            int r_type,
3504
            bfd_vma offset)
3505
0
{
3506
0
  Elf_Internal_Rela rel[3];
3507
3508
0
  memset (rel, 0, sizeof (rel));
3509
3510
0
  rel[0].r_info = ELF_R_INFO (output_bfd, indx, r_type);
3511
0
  rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
3512
3513
0
  if (ABI_64_P (output_bfd))
3514
0
    {
3515
0
      (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
3516
0
  (output_bfd, &rel[0],
3517
0
   (sreloc->contents
3518
0
    + reloc_index * sizeof (Elf64_Mips_External_Rel)));
3519
0
    }
3520
0
  else
3521
0
    bfd_elf32_swap_reloc_out
3522
0
      (output_bfd, &rel[0],
3523
0
       (sreloc->contents
3524
0
  + reloc_index * sizeof (Elf32_External_Rel)));
3525
0
}
3526
3527
/* Initialize a set of TLS GOT entries for one symbol.  */
3528
3529
static void
3530
mips_elf_initialize_tls_slots (bfd *abfd, struct bfd_link_info *info,
3531
             struct mips_got_entry *entry,
3532
             struct mips_elf_link_hash_entry *h,
3533
             bfd_vma value)
3534
0
{
3535
0
  bool dyn = elf_hash_table (info)->dynamic_sections_created;
3536
0
  struct mips_elf_link_hash_table *htab;
3537
0
  int indx;
3538
0
  asection *sreloc, *sgot;
3539
0
  bfd_vma got_offset, got_offset2;
3540
0
  bool need_relocs = false;
3541
3542
0
  htab = mips_elf_hash_table (info);
3543
0
  if (htab == NULL)
3544
0
    return;
3545
3546
0
  sgot = htab->root.sgot;
3547
3548
0
  indx = 0;
3549
0
  if (h != NULL
3550
0
      && h->root.dynindx != -1
3551
0
      && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), &h->root)
3552
0
      && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, &h->root)))
3553
0
    indx = h->root.dynindx;
3554
3555
0
  if (entry->tls_initialized)
3556
0
    return;
3557
3558
0
  if ((bfd_link_dll (info) || indx != 0)
3559
0
      && (h == NULL
3560
0
    || ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT
3561
0
    || h->root.type != bfd_link_hash_undefweak))
3562
0
    need_relocs = true;
3563
3564
  /* MINUS_ONE means the symbol is not defined in this object.  It may not
3565
     be defined at all; assume that the value doesn't matter in that
3566
     case.  Otherwise complain if we would use the value.  */
3567
0
  BFD_ASSERT (value != MINUS_ONE || (indx != 0 && need_relocs)
3568
0
        || h->root.root.type == bfd_link_hash_undefweak);
3569
3570
  /* Emit necessary relocations.  */
3571
0
  sreloc = mips_elf_rel_dyn_section (info, false);
3572
0
  got_offset = entry->gotidx;
3573
3574
0
  switch (entry->tls_type)
3575
0
    {
3576
0
    case GOT_TLS_GD:
3577
      /* General Dynamic.  */
3578
0
      got_offset2 = got_offset + MIPS_ELF_GOT_SIZE (abfd);
3579
3580
0
      if (need_relocs)
3581
0
  {
3582
0
    mips_elf_output_dynamic_relocation
3583
0
      (abfd, sreloc, sreloc->reloc_count++, indx,
3584
0
       ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
3585
0
       sgot->output_offset + sgot->output_section->vma + got_offset);
3586
3587
0
    if (indx)
3588
0
      mips_elf_output_dynamic_relocation
3589
0
        (abfd, sreloc, sreloc->reloc_count++, indx,
3590
0
         ABI_64_P (abfd) ? R_MIPS_TLS_DTPREL64 : R_MIPS_TLS_DTPREL32,
3591
0
         sgot->output_offset + sgot->output_section->vma + got_offset2);
3592
0
    else
3593
0
      MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
3594
0
             sgot->contents + got_offset2);
3595
0
  }
3596
0
      else
3597
0
  {
3598
0
    MIPS_ELF_PUT_WORD (abfd, 1,
3599
0
           sgot->contents + got_offset);
3600
0
    MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
3601
0
           sgot->contents + got_offset2);
3602
0
  }
3603
0
      break;
3604
3605
0
    case GOT_TLS_IE:
3606
      /* Initial Exec model.  */
3607
0
      if (need_relocs)
3608
0
  {
3609
0
    if (indx == 0)
3610
0
      MIPS_ELF_PUT_WORD (abfd, value - elf_hash_table (info)->tls_sec->vma,
3611
0
             sgot->contents + got_offset);
3612
0
    else
3613
0
      MIPS_ELF_PUT_WORD (abfd, 0,
3614
0
             sgot->contents + got_offset);
3615
3616
0
    mips_elf_output_dynamic_relocation
3617
0
      (abfd, sreloc, sreloc->reloc_count++, indx,
3618
0
       ABI_64_P (abfd) ? R_MIPS_TLS_TPREL64 : R_MIPS_TLS_TPREL32,
3619
0
       sgot->output_offset + sgot->output_section->vma + got_offset);
3620
0
  }
3621
0
      else
3622
0
  MIPS_ELF_PUT_WORD (abfd, value - tprel_base (info),
3623
0
         sgot->contents + got_offset);
3624
0
      break;
3625
3626
0
    case GOT_TLS_LDM:
3627
      /* The initial offset is zero, and the LD offsets will include the
3628
   bias by DTP_OFFSET.  */
3629
0
      MIPS_ELF_PUT_WORD (abfd, 0,
3630
0
       sgot->contents + got_offset
3631
0
       + MIPS_ELF_GOT_SIZE (abfd));
3632
3633
0
      if (!bfd_link_dll (info))
3634
0
  MIPS_ELF_PUT_WORD (abfd, 1,
3635
0
         sgot->contents + got_offset);
3636
0
      else
3637
0
  mips_elf_output_dynamic_relocation
3638
0
    (abfd, sreloc, sreloc->reloc_count++, indx,
3639
0
     ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
3640
0
     sgot->output_offset + sgot->output_section->vma + got_offset);
3641
0
      break;
3642
3643
0
    default:
3644
0
      abort ();
3645
0
    }
3646
3647
0
  entry->tls_initialized = true;
3648
0
}
3649
3650
/* Return the offset from _GLOBAL_OFFSET_TABLE_ of the .got.plt entry
3651
   for global symbol H.  .got.plt comes before the GOT, so the offset
3652
   will be negative.  */
3653
3654
static bfd_vma
3655
mips_elf_gotplt_index (struct bfd_link_info *info,
3656
           struct elf_link_hash_entry *h)
3657
0
{
3658
0
  bfd_vma got_address, got_value;
3659
0
  struct mips_elf_link_hash_table *htab;
3660
3661
0
  htab = mips_elf_hash_table (info);
3662
0
  BFD_ASSERT (htab != NULL);
3663
3664
0
  BFD_ASSERT (h->plt.plist != NULL);
3665
0
  BFD_ASSERT (h->plt.plist->gotplt_index != MINUS_ONE);
3666
3667
  /* Calculate the address of the associated .got.plt entry.  */
3668
0
  got_address = (htab->root.sgotplt->output_section->vma
3669
0
     + htab->root.sgotplt->output_offset
3670
0
     + (h->plt.plist->gotplt_index
3671
0
        * MIPS_ELF_GOT_SIZE (info->output_bfd)));
3672
3673
  /* Calculate the value of _GLOBAL_OFFSET_TABLE_.  */
3674
0
  got_value = (htab->root.hgot->root.u.def.section->output_section->vma
3675
0
         + htab->root.hgot->root.u.def.section->output_offset
3676
0
         + htab->root.hgot->root.u.def.value);
3677
3678
0
  return got_address - got_value;
3679
0
}
3680
3681
/* Return the GOT offset for address VALUE.   If there is not yet a GOT
3682
   entry for this value, create one.  If R_SYMNDX refers to a TLS symbol,
3683
   create a TLS GOT entry instead.  Return -1 if no satisfactory GOT
3684
   offset can be found.  */
3685
3686
static bfd_vma
3687
mips_elf_local_got_index (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
3688
        bfd_vma value, unsigned long r_symndx,
3689
        struct mips_elf_link_hash_entry *h, int r_type)
3690
0
{
3691
0
  struct mips_elf_link_hash_table *htab;
3692
0
  struct mips_got_entry *entry;
3693
3694
0
  htab = mips_elf_hash_table (info);
3695
0
  BFD_ASSERT (htab != NULL);
3696
3697
0
  entry = mips_elf_create_local_got_entry (abfd, info, ibfd, value,
3698
0
             r_symndx, h, r_type);
3699
0
  if (!entry)
3700
0
    return MINUS_ONE;
3701
3702
0
  if (entry->tls_type)
3703
0
    mips_elf_initialize_tls_slots (abfd, info, entry, h, value);
3704
0
  return entry->gotidx;
3705
0
}
3706
3707
/* Return the GOT index of global symbol H in the primary GOT.  */
3708
3709
static bfd_vma
3710
mips_elf_primary_global_got_index (bfd *obfd, struct bfd_link_info *info,
3711
           struct elf_link_hash_entry *h)
3712
0
{
3713
0
  struct mips_elf_link_hash_table *htab;
3714
0
  long global_got_dynindx;
3715
0
  struct mips_got_info *g;
3716
0
  bfd_vma got_index;
3717
3718
0
  htab = mips_elf_hash_table (info);
3719
0
  BFD_ASSERT (htab != NULL);
3720
3721
0
  global_got_dynindx = 0;
3722
0
  if (htab->global_gotsym != NULL)
3723
0
    global_got_dynindx = htab->global_gotsym->dynindx;
3724
3725
  /* Once we determine the global GOT entry with the lowest dynamic
3726
     symbol table index, we must put all dynamic symbols with greater
3727
     indices into the primary GOT.  That makes it easy to calculate the
3728
     GOT offset.  */
3729
0
  BFD_ASSERT (h->dynindx >= global_got_dynindx);
3730
0
  g = mips_elf_bfd_got (obfd, false);
3731
0
  got_index = ((h->dynindx - global_got_dynindx + g->local_gotno)
3732
0
         * MIPS_ELF_GOT_SIZE (obfd));
3733
0
  BFD_ASSERT (got_index < htab->root.sgot->size);
3734
3735
0
  return got_index;
3736
0
}
3737
3738
/* Return the GOT index for the global symbol indicated by H, which is
3739
   referenced by a relocation of type R_TYPE in IBFD.  */
3740
3741
static bfd_vma
3742
mips_elf_global_got_index (bfd *obfd, struct bfd_link_info *info, bfd *ibfd,
3743
         struct elf_link_hash_entry *h, int r_type)
3744
0
{
3745
0
  struct mips_elf_link_hash_table *htab;
3746
0
  struct mips_got_info *g;
3747
0
  struct mips_got_entry lookup, *entry;
3748
0
  bfd_vma gotidx;
3749
3750
0
  htab = mips_elf_hash_table (info);
3751
0
  BFD_ASSERT (htab != NULL);
3752
3753
0
  g = mips_elf_bfd_got (ibfd, false);
3754
0
  BFD_ASSERT (g);
3755
3756
0
  lookup.tls_type = mips_elf_reloc_tls_type (r_type);
3757
0
  if (!lookup.tls_type && g == mips_elf_bfd_got (obfd, false))
3758
0
    return mips_elf_primary_global_got_index (obfd, info, h);
3759
3760
0
  lookup.abfd = ibfd;
3761
0
  lookup.symndx = -1;
3762
0
  lookup.d.h = (struct mips_elf_link_hash_entry *) h;
3763
0
  entry = htab_find (g->got_entries, &lookup);
3764
0
  BFD_ASSERT (entry);
3765
3766
0
  gotidx = entry->gotidx;
3767
0
  BFD_ASSERT (gotidx > 0 && gotidx < htab->root.sgot->size);
3768
3769
0
  if (lookup.tls_type)
3770
0
    {
3771
0
      bfd_vma value = MINUS_ONE;
3772
3773
0
      if ((h->root.type == bfd_link_hash_defined
3774
0
     || h->root.type == bfd_link_hash_defweak)
3775
0
    && h->root.u.def.section->output_section)
3776
0
  value = (h->root.u.def.value
3777
0
     + h->root.u.def.section->output_offset
3778
0
     + h->root.u.def.section->output_section->vma);
3779
3780
0
      mips_elf_initialize_tls_slots (obfd, info, entry, lookup.d.h, value);
3781
0
    }
3782
0
  return gotidx;
3783
0
}
3784
3785
/* Find a GOT page entry that points to within 32KB of VALUE.  These
3786
   entries are supposed to be placed at small offsets in the GOT, i.e.,
3787
   within 32KB of GP.  Return the index of the GOT entry, or -1 if no
3788
   entry could be created.  If OFFSETP is nonnull, use it to return the
3789
   offset of the GOT entry from VALUE.  */
3790
3791
static bfd_vma
3792
mips_elf_got_page (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
3793
       bfd_vma value, bfd_vma *offsetp)
3794
0
{
3795
0
  bfd_vma page, got_index;
3796
0
  struct mips_got_entry *entry;
3797
3798
0
  page = (value + 0x8000) & ~(bfd_vma) 0xffff;
3799
0
  entry = mips_elf_create_local_got_entry (abfd, info, ibfd, page, 0,
3800
0
             NULL, R_MIPS_GOT_PAGE);
3801
3802
0
  if (!entry)
3803
0
    return MINUS_ONE;
3804
3805
0
  got_index = entry->gotidx;
3806
3807
0
  if (offsetp)
3808
0
    *offsetp = value - entry->d.address;
3809
3810
0
  return got_index;
3811
0
}
3812
3813
/* Find a local GOT entry for an R_MIPS*_GOT16 relocation against VALUE.
3814
   EXTERNAL is true if the relocation was originally against a global
3815
   symbol that binds locally.  */
3816
3817
static bfd_vma
3818
mips_elf_got16_entry (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
3819
          bfd_vma value, bool external)
3820
0
{
3821
0
  struct mips_got_entry *entry;
3822
3823
  /* GOT16 relocations against local symbols are followed by a LO16
3824
     relocation; those against global symbols are not.  Thus if the
3825
     symbol was originally local, the GOT16 relocation should load the
3826
     equivalent of %hi(VALUE), otherwise it should load VALUE itself.  */
3827
0
  if (! external)
3828
0
    value = mips_elf_high (value) << 16;
3829
3830
  /* It doesn't matter whether the original relocation was R_MIPS_GOT16,
3831
     R_MIPS16_GOT16, R_MIPS_CALL16, etc.  The format of the entry is the
3832
     same in all cases.  */
3833
0
  entry = mips_elf_create_local_got_entry (abfd, info, ibfd, value, 0,
3834
0
             NULL, R_MIPS_GOT16);
3835
0
  if (entry)
3836
0
    return entry->gotidx;
3837
0
  else
3838
0
    return MINUS_ONE;
3839
0
}
3840
3841
/* Returns the offset for the entry at the INDEXth position
3842
   in the GOT.  */
3843
3844
static bfd_vma
3845
mips_elf_got_offset_from_index (struct bfd_link_info *info, bfd *output_bfd,
3846
        bfd *input_bfd, bfd_vma got_index)
3847
0
{
3848
0
  struct mips_elf_link_hash_table *htab;
3849
0
  asection *sgot;
3850
0
  bfd_vma gp;
3851
3852
0
  htab = mips_elf_hash_table (info);
3853
0
  BFD_ASSERT (htab != NULL);
3854
3855
0
  sgot = htab->root.sgot;
3856
0
  gp = _bfd_get_gp_value (output_bfd)
3857
0
    + mips_elf_adjust_gp (output_bfd, htab->got_info, input_bfd);
3858
3859
0
  return sgot->output_section->vma + sgot->output_offset + got_index - gp;
3860
0
}
3861
3862
/* Create and return a local GOT entry for VALUE, which was calculated
3863
   from a symbol belonging to INPUT_SECTON.  Return NULL if it could not
3864
   be created.  If R_SYMNDX refers to a TLS symbol, create a TLS entry
3865
   instead.  */
3866
3867
static struct mips_got_entry *
3868
mips_elf_create_local_got_entry (bfd *abfd, struct bfd_link_info *info,
3869
         bfd *ibfd, bfd_vma value,
3870
         unsigned long r_symndx,
3871
         struct mips_elf_link_hash_entry *h,
3872
         int r_type)
3873
0
{
3874
0
  struct mips_got_entry lookup, *entry;
3875
0
  void **loc;
3876
0
  struct mips_got_info *g;
3877
0
  struct mips_elf_link_hash_table *htab;
3878
0
  bfd_vma gotidx;
3879
3880
0
  htab = mips_elf_hash_table (info);
3881
0
  BFD_ASSERT (htab != NULL);
3882
3883
0
  g = mips_elf_bfd_got (ibfd, false);
3884
0
  if (g == NULL)
3885
0
    {
3886
0
      g = mips_elf_bfd_got (abfd, false);
3887
0
      BFD_ASSERT (g != NULL);
3888
0
    }
3889
3890
  /* This function shouldn't be called for symbols that live in the global
3891
     area of the GOT.  */
3892
0
  BFD_ASSERT (h == NULL || h->global_got_area == GGA_NONE);
3893
3894
0
  lookup.tls_type = mips_elf_reloc_tls_type (r_type);
3895
0
  if (lookup.tls_type)
3896
0
    {
3897
0
      lookup.abfd = ibfd;
3898
0
      if (tls_ldm_reloc_p (r_type))
3899
0
  {
3900
0
    lookup.symndx = 0;
3901
0
    lookup.d.addend = 0;
3902
0
  }
3903
0
      else if (h == NULL)
3904
0
  {
3905
0
    lookup.symndx = r_symndx;
3906
0
    lookup.d.addend = 0;
3907
0
  }
3908
0
      else
3909
0
  {
3910
0
    lookup.symndx = -1;
3911
0
    lookup.d.h = h;
3912
0
  }
3913
3914
0
      entry = (struct mips_got_entry *) htab_find (g->got_entries, &lookup);
3915
0
      BFD_ASSERT (entry);
3916
3917
0
      gotidx = entry->gotidx;
3918
0
      BFD_ASSERT (gotidx > 0 && gotidx < htab->root.sgot->size);
3919
3920
0
      return entry;
3921
0
    }
3922
3923
0
  lookup.abfd = NULL;
3924
0
  lookup.symndx = -1;
3925
0
  lookup.d.address = value;
3926
0
  loc = htab_find_slot (g->got_entries, &lookup, INSERT);
3927
0
  if (!loc)
3928
0
    return NULL;
3929
3930
0
  entry = (struct mips_got_entry *) *loc;
3931
0
  if (entry)
3932
0
    return entry;
3933
3934
0
  if (g->assigned_low_gotno > g->assigned_high_gotno)
3935
0
    {
3936
      /* We didn't allocate enough space in the GOT.  */
3937
0
      _bfd_error_handler
3938
0
  (_("not enough GOT space for local GOT entries"));
3939
0
      bfd_set_error (bfd_error_bad_value);
3940
0
      return NULL;
3941
0
    }
3942
3943
0
  entry = (struct mips_got_entry *) bfd_alloc (abfd, sizeof (*entry));
3944
0
  if (!entry)
3945
0
    return NULL;
3946
3947
0
  if (got16_reloc_p (r_type)
3948
0
      || call16_reloc_p (r_type)
3949
0
      || got_page_reloc_p (r_type)
3950
0
      || got_disp_reloc_p (r_type))
3951
0
    lookup.gotidx = MIPS_ELF_GOT_SIZE (abfd) * g->assigned_low_gotno++;
3952
0
  else
3953
0
    lookup.gotidx = MIPS_ELF_GOT_SIZE (abfd) * g->assigned_high_gotno--;
3954
3955
0
  *entry = lookup;
3956
0
  *loc = entry;
3957
3958
0
  MIPS_ELF_PUT_WORD (abfd, value, htab->root.sgot->contents + entry->gotidx);
3959
3960
  /* These GOT entries need a dynamic relocation on VxWorks.  */
3961
0
  if (htab->root.target_os == is_vxworks)
3962
0
    {
3963
0
      Elf_Internal_Rela outrel;
3964
0
      asection *s;
3965
0
      bfd_byte *rloc;
3966
0
      bfd_vma got_address;
3967
3968
0
      s = mips_elf_rel_dyn_section (info, false);
3969
0
      got_address = (htab->root.sgot->output_section->vma
3970
0
         + htab->root.sgot->output_offset
3971
0
         + entry->gotidx);
3972
3973
0
      rloc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
3974
0
      outrel.r_offset = got_address;
3975
0
      outrel.r_info = ELF32_R_INFO (STN_UNDEF, R_MIPS_32);
3976
0
      outrel.r_addend = value;
3977
0
      bfd_elf32_swap_reloca_out (abfd, &outrel, rloc);
3978
0
    }
3979
3980
0
  return entry;
3981
0
}
3982
3983
/* Return the number of dynamic section symbols required by OUTPUT_BFD.
3984
   The number might be exact or a worst-case estimate, depending on how
3985
   much information is available to elf_backend_omit_section_dynsym at
3986
   the current linking stage.  */
3987
3988
static bfd_size_type
3989
count_section_dynsyms (bfd *output_bfd, struct bfd_link_info *info)
3990
0
{
3991
0
  bfd_size_type count;
3992
3993
0
  count = 0;
3994
0
  if (bfd_link_pic (info))
3995
0
    {
3996
0
      asection *p;
3997
0
      elf_backend_data *bed = get_elf_backend_data (output_bfd);
3998
3999
0
      for (p = output_bfd->sections; p ; p = p->next)
4000
0
  if ((p->flags & SEC_EXCLUDE) == 0
4001
0
      && (p->flags & SEC_ALLOC) != 0
4002
0
      && elf_hash_table (info)->dynamic_relocs
4003
0
      && !(*bed->elf_backend_omit_section_dynsym) (output_bfd, info, p))
4004
0
    ++count;
4005
0
    }
4006
0
  return count;
4007
0
}
4008
4009
/* Sort the dynamic symbol table so that symbols that need GOT entries
4010
   appear towards the end.  */
4011
4012
static bool
4013
mips_elf_sort_hash_table (bfd *abfd, struct bfd_link_info *info)
4014
0
{
4015
0
  struct mips_elf_link_hash_table *htab;
4016
0
  struct mips_elf_hash_sort_data hsd;
4017
0
  struct mips_got_info *g;
4018
4019
0
  htab = mips_elf_hash_table (info);
4020
0
  BFD_ASSERT (htab != NULL);
4021
4022
0
  if (htab->root.dynsymcount <= 1)
4023
0
    return true;
4024
4025
0
  g = htab->got_info;
4026
0
  if (g == NULL)
4027
0
    return true;
4028
4029
0
  hsd.low = NULL;
4030
0
  hsd.max_unref_got_dynindx
4031
0
    = hsd.min_got_dynindx
4032
0
    = (htab->root.dynsymcount - g->reloc_only_gotno);
4033
  /* Add 1 to local symbol indices to account for the mandatory NULL entry
4034
     at the head of the table; see `_bfd_elf_link_renumber_dynsyms'.  */
4035
0
  hsd.max_local_dynindx = count_section_dynsyms (abfd, info) + 1;
4036
0
  hsd.max_non_got_dynindx = htab->root.local_dynsymcount + 1;
4037
0
  hsd.output_bfd = abfd;
4038
0
  if (htab->root.dynobj != NULL
4039
0
      && htab->root.dynamic_sections_created
4040
0
      && info->emit_gnu_hash)
4041
0
    {
4042
0
      asection *s = bfd_get_linker_section (htab->root.dynobj, ".MIPS.xhash");
4043
0
      BFD_ASSERT (s != NULL);
4044
0
      hsd.mipsxhash = s->contents;
4045
0
      BFD_ASSERT (hsd.mipsxhash != NULL);
4046
0
    }
4047
0
  else
4048
0
    hsd.mipsxhash = NULL;
4049
0
  mips_elf_link_hash_traverse (htab, mips_elf_sort_hash_table_f, &hsd);
4050
4051
  /* There should have been enough room in the symbol table to
4052
     accommodate both the GOT and non-GOT symbols.  */
4053
0
  BFD_ASSERT (hsd.max_local_dynindx <= htab->root.local_dynsymcount + 1);
4054
0
  BFD_ASSERT (hsd.max_non_got_dynindx <= hsd.min_got_dynindx);
4055
0
  BFD_ASSERT (hsd.max_unref_got_dynindx == htab->root.dynsymcount);
4056
0
  BFD_ASSERT (htab->root.dynsymcount - hsd.min_got_dynindx == g->global_gotno);
4057
4058
  /* Now we know which dynamic symbol has the lowest dynamic symbol
4059
     table index in the GOT.  */
4060
0
  htab->global_gotsym = hsd.low;
4061
4062
0
  return true;
4063
0
}
4064
4065
/* If H needs a GOT entry, assign it the highest available dynamic
4066
   index.  Otherwise, assign it the lowest available dynamic
4067
   index.  */
4068
4069
static bool
4070
mips_elf_sort_hash_table_f (struct mips_elf_link_hash_entry *h, void *data)
4071
0
{
4072
0
  struct mips_elf_hash_sort_data *hsd = data;
4073
4074
  /* Symbols without dynamic symbol table entries aren't interesting
4075
     at all.  */
4076
0
  if (h->root.dynindx == -1)
4077
0
    return true;
4078
4079
0
  switch (h->global_got_area)
4080
0
    {
4081
0
    case GGA_NONE:
4082
0
      if (h->root.forced_local)
4083
0
  h->root.dynindx = hsd->max_local_dynindx++;
4084
0
      else
4085
0
  h->root.dynindx = hsd->max_non_got_dynindx++;
4086
0
      break;
4087
4088
0
    case GGA_NORMAL:
4089
0
      h->root.dynindx = --hsd->min_got_dynindx;
4090
0
      hsd->low = (struct elf_link_hash_entry *) h;
4091
0
      break;
4092
4093
0
    case GGA_RELOC_ONLY:
4094
0
      if (hsd->max_unref_got_dynindx == hsd->min_got_dynindx)
4095
0
  hsd->low = (struct elf_link_hash_entry *) h;
4096
0
      h->root.dynindx = hsd->max_unref_got_dynindx++;
4097
0
      break;
4098
0
    }
4099
4100
  /* Populate the .MIPS.xhash translation table entry with
4101
     the symbol dynindx.  */
4102
0
  if (h->mipsxhash_loc != 0 && hsd->mipsxhash != NULL)
4103
0
    bfd_put_32 (hsd->output_bfd, h->root.dynindx,
4104
0
    hsd->mipsxhash + h->mipsxhash_loc);
4105
4106
0
  return true;
4107
0
}
4108
4109
/* Record that input bfd ABFD requires a GOT entry like *LOOKUP
4110
   (which is owned by the caller and shouldn't be added to the
4111
   hash table directly).  */
4112
4113
static bool
4114
mips_elf_record_got_entry (struct bfd_link_info *info, bfd *abfd,
4115
         struct mips_got_entry *lookup)
4116
0
{
4117
0
  struct mips_elf_link_hash_table *htab;
4118
0
  struct mips_got_entry *entry;
4119
0
  struct mips_got_info *g;
4120
0
  void **loc, **bfd_loc;
4121
4122
  /* Make sure there's a slot for this entry in the master GOT.  */
4123
0
  htab = mips_elf_hash_table (info);
4124
0
  g = htab->got_info;
4125
0
  loc = htab_find_slot (g->got_entries, lookup, INSERT);
4126
0
  if (!loc)
4127
0
    return false;
4128
4129
  /* Populate the entry if it isn't already.  */
4130
0
  entry = (struct mips_got_entry *) *loc;
4131
0
  if (!entry)
4132
0
    {
4133
0
      entry = (struct mips_got_entry *) bfd_alloc (abfd, sizeof (*entry));
4134
0
      if (!entry)
4135
0
  return false;
4136
4137
0
      lookup->tls_initialized = false;
4138
0
      lookup->gotidx = -1;
4139
0
      *entry = *lookup;
4140
0
      *loc = entry;
4141
0
    }
4142
4143
  /* Reuse the same GOT entry for the BFD's GOT.  */
4144
0
  g = mips_elf_bfd_got (abfd, true);
4145
0
  if (!g)
4146
0
    return false;
4147
4148
0
  bfd_loc = htab_find_slot (g->got_entries, lookup, INSERT);
4149
0
  if (!bfd_loc)
4150
0
    return false;
4151
4152
0
  if (!*bfd_loc)
4153
0
    *bfd_loc = entry;
4154
0
  return true;
4155
0
}
4156
4157
/* ABFD has a GOT relocation of type R_TYPE against H.  Reserve a GOT
4158
   entry for it.  FOR_CALL is true if the caller is only interested in
4159
   using the GOT entry for calls.  */
4160
4161
static bool
4162
mips_elf_record_global_got_symbol (struct elf_link_hash_entry *h,
4163
           bfd *abfd, struct bfd_link_info *info,
4164
           bool for_call, int r_type)
4165
0
{
4166
0
  struct mips_elf_link_hash_table *htab;
4167
0
  struct mips_elf_link_hash_entry *hmips;
4168
0
  struct mips_got_entry entry;
4169
0
  unsigned char tls_type;
4170
4171
0
  htab = mips_elf_hash_table (info);
4172
0
  BFD_ASSERT (htab != NULL);
4173
4174
0
  hmips = (struct mips_elf_link_hash_entry *) h;
4175
0
  if (!for_call)
4176
0
    hmips->got_only_for_calls = false;
4177
4178
  /* A global symbol in the GOT must also be in the dynamic symbol
4179
     table.  */
4180
0
  if (h->dynindx == -1)
4181
0
    {
4182
0
      switch (ELF_ST_VISIBILITY (h->other))
4183
0
  {
4184
0
  case STV_INTERNAL:
4185
0
  case STV_HIDDEN:
4186
0
    _bfd_mips_elf_hide_symbol (info, h, true);
4187
0
    break;
4188
0
  }
4189
0
      if (!bfd_elf_link_record_dynamic_symbol (info, h))
4190
0
  return false;
4191
0
    }
4192
4193
0
  tls_type = mips_elf_reloc_tls_type (r_type);
4194
0
  if (tls_type == GOT_TLS_NONE && hmips->global_got_area > GGA_NORMAL)
4195
0
    hmips->global_got_area = GGA_NORMAL;
4196
4197
0
  entry.abfd = abfd;
4198
0
  entry.symndx = -1;
4199
0
  entry.d.h = (struct mips_elf_link_hash_entry *) h;
4200
0
  entry.tls_type = tls_type;
4201
0
  return mips_elf_record_got_entry (info, abfd, &entry);
4202
0
}
4203
4204
/* ABFD has a GOT relocation of type R_TYPE against symbol SYMNDX + ADDEND,
4205
   where SYMNDX is a local symbol.  Reserve a GOT entry for it.  */
4206
4207
static bool
4208
mips_elf_record_local_got_symbol (bfd *abfd, long symndx, bfd_vma addend,
4209
          struct bfd_link_info *info, int r_type)
4210
0
{
4211
0
  struct mips_elf_link_hash_table *htab;
4212
0
  struct mips_got_info *g;
4213
0
  struct mips_got_entry entry;
4214
4215
0
  htab = mips_elf_hash_table (info);
4216
0
  BFD_ASSERT (htab != NULL);
4217
4218
0
  g = htab->got_info;
4219
0
  BFD_ASSERT (g != NULL);
4220
4221
0
  entry.abfd = abfd;
4222
0
  entry.symndx = symndx;
4223
0
  entry.d.addend = addend;
4224
0
  entry.tls_type = mips_elf_reloc_tls_type (r_type);
4225
0
  return mips_elf_record_got_entry (info, abfd, &entry);
4226
0
}
4227
4228
/* Record that ABFD has a page relocation against SYMNDX + ADDEND.
4229
   H is the symbol's hash table entry, or null if SYMNDX is local
4230
   to ABFD.  */
4231
4232
static bool
4233
mips_elf_record_got_page_ref (struct bfd_link_info *info, bfd *abfd,
4234
            long symndx, struct elf_link_hash_entry *h,
4235
            bfd_signed_vma addend)
4236
0
{
4237
0
  struct mips_elf_link_hash_table *htab;
4238
0
  struct mips_got_info *g1, *g2;
4239
0
  struct mips_got_page_ref lookup, *entry;
4240
0
  void **loc, **bfd_loc;
4241
4242
0
  htab = mips_elf_hash_table (info);
4243
0
  BFD_ASSERT (htab != NULL);
4244
4245
0
  g1 = htab->got_info;
4246
0
  BFD_ASSERT (g1 != NULL);
4247
4248
0
  if (h)
4249
0
    {
4250
0
      lookup.symndx = -1;
4251
0
      lookup.u.h = (struct mips_elf_link_hash_entry *) h;
4252
0
    }
4253
0
  else
4254
0
    {
4255
0
      lookup.symndx = symndx;
4256
0
      lookup.u.abfd = abfd;
4257
0
    }
4258
0
  lookup.addend = addend;
4259
0
  loc = htab_find_slot (g1->got_page_refs, &lookup, INSERT);
4260
0
  if (loc == NULL)
4261
0
    return false;
4262
4263
0
  entry = (struct mips_got_page_ref *) *loc;
4264
0
  if (!entry)
4265
0
    {
4266
0
      entry = bfd_alloc (abfd, sizeof (*entry));
4267
0
      if (!entry)
4268
0
  return false;
4269
4270
0
      *entry = lookup;
4271
0
      *loc = entry;
4272
0
    }
4273
4274
  /* Add the same entry to the BFD's GOT.  */
4275
0
  g2 = mips_elf_bfd_got (abfd, true);
4276
0
  if (!g2)
4277
0
    return false;
4278
4279
0
  bfd_loc = htab_find_slot (g2->got_page_refs, &lookup, INSERT);
4280
0
  if (!bfd_loc)
4281
0
    return false;
4282
4283
0
  if (!*bfd_loc)
4284
0
    *bfd_loc = entry;
4285
4286
0
  return true;
4287
0
}
4288
4289
/* Add room for N relocations to the .rel(a).dyn section in ABFD.  */
4290
4291
static void
4292
mips_elf_allocate_dynamic_relocations (bfd *abfd, struct bfd_link_info *info,
4293
               unsigned int n)
4294
0
{
4295
0
  asection *s;
4296
0
  struct mips_elf_link_hash_table *htab;
4297
4298
0
  htab = mips_elf_hash_table (info);
4299
0
  BFD_ASSERT (htab != NULL);
4300
4301
0
  s = mips_elf_rel_dyn_section (info, false);
4302
0
  BFD_ASSERT (s != NULL);
4303
4304
0
  if (htab->root.target_os == is_vxworks)
4305
0
    s->size += n * MIPS_ELF_RELA_SIZE (abfd);
4306
0
  else
4307
0
    {
4308
0
      if (s->size == 0)
4309
0
  {
4310
    /* Make room for a null element.  */
4311
0
    s->size += MIPS_ELF_REL_SIZE (abfd);
4312
0
    ++s->reloc_count;
4313
0
  }
4314
0
      s->size += n * MIPS_ELF_REL_SIZE (abfd);
4315
0
    }
4316
0
}
4317

4318
/* A htab_traverse callback for GOT entries, with DATA pointing to a
4319
   mips_elf_traverse_got_arg structure.  Count the number of GOT
4320
   entries and TLS relocs.  Set DATA->value to true if we need
4321
   to resolve indirect or warning symbols and then recreate the GOT.  */
4322
4323
static int
4324
mips_elf_check_recreate_got (void **entryp, void *data)
4325
0
{
4326
0
  struct mips_got_entry *entry;
4327
0
  struct mips_elf_traverse_got_arg *arg;
4328
4329
0
  entry = (struct mips_got_entry *) *entryp;
4330
0
  arg = (struct mips_elf_traverse_got_arg *) data;
4331
0
  if (entry->abfd != NULL && entry->symndx == -1)
4332
0
    {
4333
0
      struct mips_elf_link_hash_entry *h;
4334
4335
0
      h = entry->d.h;
4336
0
      if (h->root.root.type == bfd_link_hash_indirect
4337
0
    || h->root.root.type == bfd_link_hash_warning)
4338
0
  {
4339
0
    arg->value = true;
4340
0
    return 0;
4341
0
  }
4342
0
    }
4343
0
  mips_elf_count_got_entry (arg->info, arg->g, entry);
4344
0
  return 1;
4345
0
}
4346
4347
/* A htab_traverse callback for GOT entries, with DATA pointing to a
4348
   mips_elf_traverse_got_arg structure.  Add all entries to DATA->g,
4349
   converting entries for indirect and warning symbols into entries
4350
   for the target symbol.  Set DATA->g to null on error.  */
4351
4352
static int
4353
mips_elf_recreate_got (void **entryp, void *data)
4354
0
{
4355
0
  struct mips_got_entry new_entry, *entry;
4356
0
  struct mips_elf_traverse_got_arg *arg;
4357
0
  void **slot;
4358
4359
0
  entry = (struct mips_got_entry *) *entryp;
4360
0
  arg = (struct mips_elf_traverse_got_arg *) data;
4361
0
  if (entry->abfd != NULL
4362
0
      && entry->symndx == -1
4363
0
      && (entry->d.h->root.root.type == bfd_link_hash_indirect
4364
0
    || entry->d.h->root.root.type == bfd_link_hash_warning))
4365
0
    {
4366
0
      struct mips_elf_link_hash_entry *h;
4367
4368
0
      new_entry = *entry;
4369
0
      entry = &new_entry;
4370
0
      h = entry->d.h;
4371
0
      do
4372
0
  {
4373
0
    BFD_ASSERT (h->global_got_area == GGA_NONE);
4374
0
    h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
4375
0
  }
4376
0
      while (h->root.root.type == bfd_link_hash_indirect
4377
0
       || h->root.root.type == bfd_link_hash_warning);
4378
0
      entry->d.h = h;
4379
0
    }
4380
0
  slot = htab_find_slot (arg->g->got_entries, entry, INSERT);
4381
0
  if (slot == NULL)
4382
0
    {
4383
0
      arg->g = NULL;
4384
0
      return 0;
4385
0
    }
4386
0
  if (*slot == NULL)
4387
0
    {
4388
0
      if (entry == &new_entry)
4389
0
  {
4390
0
    entry = bfd_alloc (entry->abfd, sizeof (*entry));
4391
0
    if (!entry)
4392
0
      {
4393
0
        arg->g = NULL;
4394
0
        return 0;
4395
0
      }
4396
0
    *entry = new_entry;
4397
0
  }
4398
0
      *slot = entry;
4399
0
      mips_elf_count_got_entry (arg->info, arg->g, entry);
4400
0
    }
4401
0
  return 1;
4402
0
}
4403
4404
/* Return the maximum number of GOT page entries required for RANGE.  */
4405
4406
static bfd_vma
4407
mips_elf_pages_for_range (const struct mips_got_page_range *range)
4408
0
{
4409
0
  return (range->max_addend - range->min_addend + 0x1ffff) >> 16;
4410
0
}
4411
4412
/* Record that G requires a page entry that can reach SEC + ADDEND.  */
4413
4414
static bool
4415
mips_elf_record_got_page_entry (struct mips_elf_traverse_got_arg *arg,
4416
        asection *sec, bfd_signed_vma addend)
4417
0
{
4418
0
  struct mips_got_info *g = arg->g;
4419
0
  struct mips_got_page_entry lookup, *entry;
4420
0
  struct mips_got_page_range **range_ptr, *range;
4421
0
  bfd_vma old_pages, new_pages;
4422
0
  void **loc;
4423
4424
  /* Find the mips_got_page_entry hash table entry for this section.  */
4425
0
  lookup.sec = sec;
4426
0
  loc = htab_find_slot (g->got_page_entries, &lookup, INSERT);
4427
0
  if (loc == NULL)
4428
0
    return false;
4429
4430
  /* Create a mips_got_page_entry if this is the first time we've
4431
     seen the section.  */
4432
0
  entry = (struct mips_got_page_entry *) *loc;
4433
0
  if (!entry)
4434
0
    {
4435
0
      entry = bfd_zalloc (arg->info->output_bfd, sizeof (*entry));
4436
0
      if (!entry)
4437
0
  return false;
4438
4439
0
      entry->sec = sec;
4440
0
      *loc = entry;
4441
0
    }
4442
4443
  /* Skip over ranges whose maximum extent cannot share a page entry
4444
     with ADDEND.  */
4445
0
  range_ptr = &entry->ranges;
4446
0
  while (*range_ptr && addend > (*range_ptr)->max_addend + 0xffff)
4447
0
    range_ptr = &(*range_ptr)->next;
4448
4449
  /* If we scanned to the end of the list, or found a range whose
4450
     minimum extent cannot share a page entry with ADDEND, create
4451
     a new singleton range.  */
4452
0
  range = *range_ptr;
4453
0
  if (!range || addend < range->min_addend - 0xffff)
4454
0
    {
4455
0
      range = bfd_zalloc (arg->info->output_bfd, sizeof (*range));
4456
0
      if (!range)
4457
0
  return false;
4458
4459
0
      range->next = *range_ptr;
4460
0
      range->min_addend = addend;
4461
0
      range->max_addend = addend;
4462
4463
0
      *range_ptr = range;
4464
0
      entry->num_pages++;
4465
0
      g->page_gotno++;
4466
0
      return true;
4467
0
    }
4468
4469
  /* Remember how many pages the old range contributed.  */
4470
0
  old_pages = mips_elf_pages_for_range (range);
4471
4472
  /* Update the ranges.  */
4473
0
  if (addend < range->min_addend)
4474
0
    range->min_addend = addend;
4475
0
  else if (addend > range->max_addend)
4476
0
    {
4477
0
      if (range->next && addend >= range->next->min_addend - 0xffff)
4478
0
  {
4479
0
    old_pages += mips_elf_pages_for_range (range->next);
4480
0
    range->max_addend = range->next->max_addend;
4481
0
    range->next = range->next->next;
4482
0
  }
4483
0
      else
4484
0
  range->max_addend = addend;
4485
0
    }
4486
4487
  /* Record any change in the total estimate.  */
4488
0
  new_pages = mips_elf_pages_for_range (range);
4489
0
  if (old_pages != new_pages)
4490
0
    {
4491
0
      entry->num_pages += new_pages - old_pages;
4492
0
      g->page_gotno += new_pages - old_pages;
4493
0
    }
4494
4495
0
  return true;
4496
0
}
4497
4498
/* A htab_traverse callback for which *REFP points to a mips_got_page_ref
4499
   and for which DATA points to a mips_elf_traverse_got_arg.  Work out
4500
   whether the page reference described by *REFP needs a GOT page entry,
4501
   and record that entry in DATA->g if so.  Set DATA->g to null on failure.  */
4502
4503
static int
4504
mips_elf_resolve_got_page_ref (void **refp, void *data)
4505
0
{
4506
0
  struct mips_got_page_ref *ref;
4507
0
  struct mips_elf_traverse_got_arg *arg;
4508
0
  struct mips_elf_link_hash_table *htab;
4509
0
  asection *sec;
4510
0
  bfd_vma addend;
4511
4512
0
  ref = (struct mips_got_page_ref *) *refp;
4513
0
  arg = (struct mips_elf_traverse_got_arg *) data;
4514
0
  htab = mips_elf_hash_table (arg->info);
4515
4516
0
  if (ref->symndx < 0)
4517
0
    {
4518
0
      struct mips_elf_link_hash_entry *h;
4519
4520
      /* Global GOT_PAGEs decay to GOT_DISP and so don't need page entries.  */
4521
0
      h = ref->u.h;
4522
0
      if (!SYMBOL_REFERENCES_LOCAL (arg->info, &h->root))
4523
0
  return 1;
4524
4525
      /* Ignore undefined symbols; we'll issue an error later if
4526
   appropriate.  */
4527
0
      if (!((h->root.root.type == bfd_link_hash_defined
4528
0
       || h->root.root.type == bfd_link_hash_defweak)
4529
0
      && h->root.root.u.def.section))
4530
0
  return 1;
4531
4532
0
      sec = h->root.root.u.def.section;
4533
0
      addend = h->root.root.u.def.value + ref->addend;
4534
0
    }
4535
0
  else
4536
0
    {
4537
0
      Elf_Internal_Sym *isym;
4538
4539
      /* Read in the symbol.  */
4540
0
      isym = bfd_sym_from_r_symndx (&htab->root.sym_cache, ref->u.abfd,
4541
0
            ref->symndx);
4542
0
      if (isym == NULL)
4543
0
  {
4544
0
    arg->g = NULL;
4545
0
    return 0;
4546
0
  }
4547
4548
      /* Get the associated input section.  */
4549
0
      sec = bfd_section_from_elf_index (ref->u.abfd, isym->st_shndx);
4550
0
      if (sec == NULL)
4551
0
  {
4552
0
    arg->g = NULL;
4553
0
    return 0;
4554
0
  }
4555
4556
      /* If this is a mergable section, work out the section and offset
4557
   of the merged data.  For section symbols, the addend specifies
4558
   of the offset _of_ the first byte in the data, otherwise it
4559
   specifies the offset _from_ the first byte.  */
4560
0
      if (sec->flags & SEC_MERGE)
4561
0
  {
4562
0
    if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
4563
0
      addend = _bfd_merged_section_offset (ref->u.abfd, &sec,
4564
0
             isym->st_value + ref->addend);
4565
0
    else
4566
0
      addend = _bfd_merged_section_offset (ref->u.abfd, &sec,
4567
0
             isym->st_value) + ref->addend;
4568
0
  }
4569
0
      else
4570
0
  addend = isym->st_value + ref->addend;
4571
0
    }
4572
0
  if (!mips_elf_record_got_page_entry (arg, sec, addend))
4573
0
    {
4574
0
      arg->g = NULL;
4575
0
      return 0;
4576
0
    }
4577
0
  return 1;
4578
0
}
4579
4580
/* If any entries in G->got_entries are for indirect or warning symbols,
4581
   replace them with entries for the target symbol.  Convert g->got_page_refs
4582
   into got_page_entry structures and estimate the number of page entries
4583
   that they require.  */
4584
4585
static bool
4586
mips_elf_resolve_final_got_entries (struct bfd_link_info *info,
4587
            struct mips_got_info *g)
4588
0
{
4589
0
  struct mips_elf_traverse_got_arg tga;
4590
0
  struct mips_got_info oldg;
4591
4592
0
  oldg = *g;
4593
4594
0
  tga.info = info;
4595
0
  tga.g = g;
4596
0
  tga.value = false;
4597
0
  htab_traverse (g->got_entries, mips_elf_check_recreate_got, &tga);
4598
0
  if (tga.value)
4599
0
    {
4600
0
      *g = oldg;
4601
0
      g->got_entries = htab_create (htab_size (oldg.got_entries),
4602
0
            mips_elf_got_entry_hash,
4603
0
            mips_elf_got_entry_eq, NULL);
4604
0
      if (!g->got_entries)
4605
0
  return false;
4606
4607
0
      htab_traverse (oldg.got_entries, mips_elf_recreate_got, &tga);
4608
0
      if (!tga.g)
4609
0
  return false;
4610
4611
0
      htab_delete (oldg.got_entries);
4612
0
    }
4613
4614
0
  g->got_page_entries = htab_try_create (1, mips_got_page_entry_hash,
4615
0
           mips_got_page_entry_eq, NULL);
4616
0
  if (g->got_page_entries == NULL)
4617
0
    return false;
4618
4619
0
  tga.info = info;
4620
0
  tga.g = g;
4621
0
  htab_traverse (g->got_page_refs, mips_elf_resolve_got_page_ref, &tga);
4622
4623
0
  return true;
4624
0
}
4625
4626
/* Return true if a GOT entry for H should live in the local rather than
4627
   global GOT area.  */
4628
4629
static bool
4630
mips_use_local_got_p (struct bfd_link_info *info,
4631
          struct mips_elf_link_hash_entry *h)
4632
0
{
4633
  /* Symbols that aren't in the dynamic symbol table must live in the
4634
     local GOT.  This includes symbols that are completely undefined
4635
     and which therefore don't bind locally.  We'll report undefined
4636
     symbols later if appropriate.  */
4637
0
  if (h->root.dynindx == -1)
4638
0
    return true;
4639
4640
  /* Absolute symbols, if ever they need a GOT entry, cannot ever go
4641
     to the local GOT, as they would be implicitly relocated by the
4642
     base address by the dynamic loader.  */
4643
0
  if (bfd_is_abs_symbol (&h->root.root))
4644
0
    return false;
4645
4646
  /* Symbols that bind locally can (and in the case of forced-local
4647
     symbols, must) live in the local GOT.  */
4648
0
  if (h->got_only_for_calls
4649
0
      ? SYMBOL_CALLS_LOCAL (info, &h->root)
4650
0
      : SYMBOL_REFERENCES_LOCAL (info, &h->root))
4651
0
    return true;
4652
4653
  /* If this is an executable that must provide a definition of the symbol,
4654
     either though PLTs or copy relocations, then that address should go in
4655
     the local rather than global GOT.  */
4656
0
  if (bfd_link_executable (info) && h->has_static_relocs)
4657
0
    return true;
4658
4659
0
  return false;
4660
0
}
4661
4662
/* A mips_elf_link_hash_traverse callback for which DATA points to the
4663
   link_info structure.  Decide whether the hash entry needs an entry in
4664
   the global part of the primary GOT, setting global_got_area accordingly.
4665
   Count the number of global symbols that are in the primary GOT only
4666
   because they have relocations against them (reloc_only_gotno).  */
4667
4668
static bool
4669
mips_elf_count_got_symbols (struct mips_elf_link_hash_entry *h, void *data)
4670
0
{
4671
0
  struct bfd_link_info *info;
4672
0
  struct mips_elf_link_hash_table *htab;
4673
0
  struct mips_got_info *g;
4674
4675
0
  info = (struct bfd_link_info *) data;
4676
0
  htab = mips_elf_hash_table (info);
4677
0
  g = htab->got_info;
4678
0
  if (h->global_got_area != GGA_NONE)
4679
0
    {
4680
      /* Make a final decision about whether the symbol belongs in the
4681
   local or global GOT.  */
4682
0
      if (mips_use_local_got_p (info, h))
4683
  /* The symbol belongs in the local GOT.  We no longer need this
4684
     entry if it was only used for relocations; those relocations
4685
     will be against the null or section symbol instead of H.  */
4686
0
  h->global_got_area = GGA_NONE;
4687
0
      else if (htab->root.target_os == is_vxworks
4688
0
         && h->got_only_for_calls
4689
0
         && h->root.plt.plist->mips_offset != MINUS_ONE)
4690
  /* On VxWorks, calls can refer directly to the .got.plt entry;
4691
     they don't need entries in the regular GOT.  .got.plt entries
4692
     will be allocated by _bfd_mips_elf_adjust_dynamic_symbol.  */
4693
0
  h->global_got_area = GGA_NONE;
4694
0
      else if (h->global_got_area == GGA_RELOC_ONLY)
4695
0
  {
4696
0
    g->reloc_only_gotno++;
4697
0
    g->global_gotno++;
4698
0
  }
4699
0
    }
4700
0
  return 1;
4701
0
}
4702

4703
/* A htab_traverse callback for GOT entries.  Add each one to the GOT
4704
   given in mips_elf_traverse_got_arg DATA.  Clear DATA->G on error.  */
4705
4706
static int
4707
mips_elf_add_got_entry (void **entryp, void *data)
4708
0
{
4709
0
  struct mips_got_entry *entry;
4710
0
  struct mips_elf_traverse_got_arg *arg;
4711
0
  void **slot;
4712
4713
0
  entry = (struct mips_got_entry *) *entryp;
4714
0
  arg = (struct mips_elf_traverse_got_arg *) data;
4715
0
  slot = htab_find_slot (arg->g->got_entries, entry, INSERT);
4716
0
  if (!slot)
4717
0
    {
4718
0
      arg->g = NULL;
4719
0
      return 0;
4720
0
    }
4721
0
  if (!*slot)
4722
0
    {
4723
0
      *slot = entry;
4724
0
      mips_elf_count_got_entry (arg->info, arg->g, entry);
4725
0
    }
4726
0
  return 1;
4727
0
}
4728
4729
/* A htab_traverse callback for GOT page entries.  Add each one to the GOT
4730
   given in mips_elf_traverse_got_arg DATA.  Clear DATA->G on error.  */
4731
4732
static int
4733
mips_elf_add_got_page_entry (void **entryp, void *data)
4734
0
{
4735
0
  struct mips_got_page_entry *entry;
4736
0
  struct mips_elf_traverse_got_arg *arg;
4737
0
  void **slot;
4738
4739
0
  entry = (struct mips_got_page_entry *) *entryp;
4740
0
  arg = (struct mips_elf_traverse_got_arg *) data;
4741
0
  slot = htab_find_slot (arg->g->got_page_entries, entry, INSERT);
4742
0
  if (!slot)
4743
0
    {
4744
0
      arg->g = NULL;
4745
0
      return 0;
4746
0
    }
4747
0
  if (!*slot)
4748
0
    {
4749
0
      *slot = entry;
4750
0
      arg->g->page_gotno += entry->num_pages;
4751
0
    }
4752
0
  return 1;
4753
0
}
4754
4755
/* Consider merging FROM, which is ABFD's GOT, into TO.  Return -1 if
4756
   this would lead to overflow, 1 if they were merged successfully,
4757
   and 0 if a merge failed due to lack of memory.  (These values are chosen
4758
   so that nonnegative return values can be returned by a htab_traverse
4759
   callback.)  */
4760
4761
static int
4762
mips_elf_merge_got_with (bfd *abfd, struct mips_got_info *from,
4763
       struct mips_got_info *to,
4764
       struct mips_elf_got_per_bfd_arg *arg)
4765
0
{
4766
0
  struct mips_elf_traverse_got_arg tga;
4767
0
  unsigned int estimate;
4768
4769
  /* Work out how many page entries we would need for the combined GOT.  */
4770
0
  estimate = arg->max_pages;
4771
0
  if (estimate >= from->page_gotno + to->page_gotno)
4772
0
    estimate = from->page_gotno + to->page_gotno;
4773
4774
  /* And conservatively estimate how many local and TLS entries
4775
     would be needed.  */
4776
0
  estimate += from->local_gotno + to->local_gotno;
4777
0
  estimate += from->tls_gotno + to->tls_gotno;
4778
4779
  /* If we're merging with the primary got, any TLS relocations will
4780
     come after the full set of global entries.  Otherwise estimate those
4781
     conservatively as well.  */
4782
0
  if (to == arg->primary && from->tls_gotno + to->tls_gotno)
4783
0
    estimate += arg->global_count;
4784
0
  else
4785
0
    estimate += from->global_gotno + to->global_gotno;
4786
4787
  /* Bail out if the combined GOT might be too big.  */
4788
0
  if (estimate > arg->max_count)
4789
0
    return -1;
4790
4791
  /* Transfer the bfd's got information from FROM to TO.  */
4792
0
  tga.info = arg->info;
4793
0
  tga.g = to;
4794
0
  htab_traverse (from->got_entries, mips_elf_add_got_entry, &tga);
4795
0
  if (!tga.g)
4796
0
    return 0;
4797
4798
0
  htab_traverse (from->got_page_entries, mips_elf_add_got_page_entry, &tga);
4799
0
  if (!tga.g)
4800
0
    return 0;
4801
4802
0
  mips_elf_replace_bfd_got (abfd, to);
4803
0
  return 1;
4804
0
}
4805
4806
/* Attempt to merge GOT G, which belongs to ABFD.  Try to use as much
4807
   as possible of the primary got, since it doesn't require explicit
4808
   dynamic relocations, but don't use bfds that would reference global
4809
   symbols out of the addressable range.  Failing the primary got,
4810
   attempt to merge with the current got, or finish the current got
4811
   and then make make the new got current.  */
4812
4813
static bool
4814
mips_elf_merge_got (bfd *abfd, struct mips_got_info *g,
4815
        struct mips_elf_got_per_bfd_arg *arg)
4816
0
{
4817
0
  unsigned int estimate;
4818
0
  int result;
4819
4820
0
  if (!mips_elf_resolve_final_got_entries (arg->info, g))
4821
0
    return false;
4822
4823
  /* Work out the number of page, local and TLS entries.  */
4824
0
  estimate = arg->max_pages;
4825
0
  if (estimate > g->page_gotno)
4826
0
    estimate = g->page_gotno;
4827
0
  estimate += g->local_gotno + g->tls_gotno;
4828
4829
  /* We place TLS GOT entries after both locals and globals.  The globals
4830
     for the primary GOT may overflow the normal GOT size limit, so be
4831
     sure not to merge a GOT which requires TLS with the primary GOT in that
4832
     case.  This doesn't affect non-primary GOTs.  */
4833
0
  estimate += (g->tls_gotno > 0 ? arg->global_count : g->global_gotno);
4834
4835
0
  if (estimate <= arg->max_count)
4836
0
    {
4837
      /* If we don't have a primary GOT, use it as
4838
   a starting point for the primary GOT.  */
4839
0
      if (!arg->primary)
4840
0
  {
4841
0
    arg->primary = g;
4842
0
    return true;
4843
0
  }
4844
4845
      /* Try merging with the primary GOT.  */
4846
0
      result = mips_elf_merge_got_with (abfd, g, arg->primary, arg);
4847
0
      if (result >= 0)
4848
0
  return result;
4849
0
    }
4850
4851
  /* If we can merge with the last-created got, do it.  */
4852
0
  if (arg->current)
4853
0
    {
4854
0
      result = mips_elf_merge_got_with (abfd, g, arg->current, arg);
4855
0
      if (result >= 0)
4856
0
  return result;
4857
0
    }
4858
4859
  /* Well, we couldn't merge, so create a new GOT.  Don't check if it
4860
     fits; if it turns out that it doesn't, we'll get relocation
4861
     overflows anyway.  */
4862
0
  g->next = arg->current;
4863
0
  arg->current = g;
4864
4865
0
  return true;
4866
0
}
4867
4868
/* ENTRYP is a hash table entry for a mips_got_entry.  Set its gotidx
4869
   to GOTIDX, duplicating the entry if it has already been assigned
4870
   an index in a different GOT.  */
4871
4872
static bool
4873
mips_elf_set_gotidx (void **entryp, long gotidx)
4874
0
{
4875
0
  struct mips_got_entry *entry;
4876
4877
0
  entry = (struct mips_got_entry *) *entryp;
4878
0
  if (entry->gotidx > 0)
4879
0
    {
4880
0
      struct mips_got_entry *new_entry;
4881
4882
0
      new_entry = bfd_alloc (entry->abfd, sizeof (*entry));
4883
0
      if (!new_entry)
4884
0
  return false;
4885
4886
0
      *new_entry = *entry;
4887
0
      *entryp = new_entry;
4888
0
      entry = new_entry;
4889
0
    }
4890
0
  entry->gotidx = gotidx;
4891
0
  return true;
4892
0
}
4893
4894
/* Set the TLS GOT index for the GOT entry in ENTRYP.  DATA points to a
4895
   mips_elf_traverse_got_arg in which DATA->value is the size of one
4896
   GOT entry.  Set DATA->g to null on failure.  */
4897
4898
static int
4899
mips_elf_initialize_tls_index (void **entryp, void *data)
4900
0
{
4901
0
  struct mips_got_entry *entry;
4902
0
  struct mips_elf_traverse_got_arg *arg;
4903
4904
  /* We're only interested in TLS symbols.  */
4905
0
  entry = (struct mips_got_entry *) *entryp;
4906
0
  if (entry->tls_type == GOT_TLS_NONE)
4907
0
    return 1;
4908
4909
0
  arg = (struct mips_elf_traverse_got_arg *) data;
4910
0
  if (!mips_elf_set_gotidx (entryp, arg->value * arg->g->tls_assigned_gotno))
4911
0
    {
4912
0
      arg->g = NULL;
4913
0
      return 0;
4914
0
    }
4915
4916
  /* Account for the entries we've just allocated.  */
4917
0
  arg->g->tls_assigned_gotno += mips_tls_got_entries (entry->tls_type);
4918
0
  return 1;
4919
0
}
4920
4921
/* A htab_traverse callback for GOT entries, where DATA points to a
4922
   mips_elf_traverse_got_arg.  Set the global_got_area of each global
4923
   symbol to DATA->value.  */
4924
4925
static int
4926
mips_elf_set_global_got_area (void **entryp, void *data)
4927
0
{
4928
0
  struct mips_got_entry *entry;
4929
0
  struct mips_elf_traverse_got_arg *arg;
4930
4931
0
  entry = (struct mips_got_entry *) *entryp;
4932
0
  arg = (struct mips_elf_traverse_got_arg *) data;
4933
0
  if (entry->abfd != NULL
4934
0
      && entry->symndx == -1
4935
0
      && entry->d.h->global_got_area != GGA_NONE)
4936
0
    entry->d.h->global_got_area = arg->value;
4937
0
  return 1;
4938
0
}
4939
4940
/* A htab_traverse callback for secondary GOT entries, where DATA points
4941
   to a mips_elf_traverse_got_arg.  Assign GOT indices to global entries
4942
   and record the number of relocations they require.  DATA->value is
4943
   the size of one GOT entry.  Set DATA->g to null on failure.  */
4944
4945
static int
4946
mips_elf_set_global_gotidx (void **entryp, void *data)
4947
0
{
4948
0
  struct mips_got_entry *entry;
4949
0
  struct mips_elf_traverse_got_arg *arg;
4950
4951
0
  entry = (struct mips_got_entry *) *entryp;
4952
0
  arg = (struct mips_elf_traverse_got_arg *) data;
4953
0
  if (entry->abfd != NULL
4954
0
      && entry->symndx == -1
4955
0
      && entry->d.h->global_got_area != GGA_NONE)
4956
0
    {
4957
0
      if (!mips_elf_set_gotidx (entryp, arg->value * arg->g->assigned_low_gotno))
4958
0
  {
4959
0
    arg->g = NULL;
4960
0
    return 0;
4961
0
  }
4962
0
      arg->g->assigned_low_gotno += 1;
4963
4964
0
      if (bfd_link_pic (arg->info)
4965
0
    || (elf_hash_table (arg->info)->dynamic_sections_created
4966
0
        && entry->d.h->root.def_dynamic
4967
0
        && !entry->d.h->root.def_regular))
4968
0
  arg->g->relocs += 1;
4969
0
    }
4970
4971
0
  return 1;
4972
0
}
4973
4974
/* A htab_traverse callback for GOT entries for which DATA is the
4975
   bfd_link_info.  Forbid any global symbols from having traditional
4976
   lazy-binding stubs.  */
4977
4978
static int
4979
mips_elf_forbid_lazy_stubs (void **entryp, void *data)
4980
0
{
4981
0
  struct bfd_link_info *info;
4982
0
  struct mips_elf_link_hash_table *htab;
4983
0
  struct mips_got_entry *entry;
4984
4985
0
  entry = (struct mips_got_entry *) *entryp;
4986
0
  info = (struct bfd_link_info *) data;
4987
0
  htab = mips_elf_hash_table (info);
4988
0
  BFD_ASSERT (htab != NULL);
4989
4990
0
  if (entry->abfd != NULL
4991
0
      && entry->symndx == -1
4992
0
      && entry->d.h->needs_lazy_stub)
4993
0
    {
4994
0
      entry->d.h->needs_lazy_stub = false;
4995
0
      htab->lazy_stub_count--;
4996
0
    }
4997
4998
0
  return 1;
4999
0
}
5000
5001
/* Return the offset of an input bfd IBFD's GOT from the beginning of
5002
   the primary GOT.  */
5003
static bfd_vma
5004
mips_elf_adjust_gp (bfd *abfd, struct mips_got_info *g, bfd *ibfd)
5005
0
{
5006
0
  if (!g->next)
5007
0
    return 0;
5008
5009
0
  g = mips_elf_bfd_got (ibfd, false);
5010
0
  if (! g)
5011
0
    return 0;
5012
5013
0
  BFD_ASSERT (g->next);
5014
5015
0
  g = g->next;
5016
5017
0
  return (g->local_gotno + g->global_gotno + g->tls_gotno)
5018
0
    * MIPS_ELF_GOT_SIZE (abfd);
5019
0
}
5020
5021
/* Turn a single GOT that is too big for 16-bit addressing into
5022
   a sequence of GOTs, each one 16-bit addressable.  */
5023
5024
static bool
5025
mips_elf_multi_got (bfd *abfd, struct bfd_link_info *info,
5026
        asection *got, bfd_size_type pages)
5027
0
{
5028
0
  struct mips_elf_link_hash_table *htab;
5029
0
  struct mips_elf_got_per_bfd_arg got_per_bfd_arg;
5030
0
  struct mips_elf_traverse_got_arg tga;
5031
0
  struct mips_got_info *g, *gg;
5032
0
  unsigned int assign, needed_relocs;
5033
0
  bfd *dynobj, *ibfd;
5034
5035
0
  dynobj = elf_hash_table (info)->dynobj;
5036
0
  htab = mips_elf_hash_table (info);
5037
0
  BFD_ASSERT (htab != NULL);
5038
5039
0
  g = htab->got_info;
5040
5041
0
  got_per_bfd_arg.obfd = abfd;
5042
0
  got_per_bfd_arg.info = info;
5043
0
  got_per_bfd_arg.current = NULL;
5044
0
  got_per_bfd_arg.primary = NULL;
5045
0
  got_per_bfd_arg.max_count = ((MIPS_ELF_GOT_MAX_SIZE (info)
5046
0
        / MIPS_ELF_GOT_SIZE (abfd))
5047
0
             - htab->reserved_gotno);
5048
0
  got_per_bfd_arg.max_pages = pages;
5049
  /* The number of globals that will be included in the primary GOT.
5050
     See the calls to mips_elf_set_global_got_area below for more
5051
     information.  */
5052
0
  got_per_bfd_arg.global_count = g->global_gotno;
5053
5054
  /* Try to merge the GOTs of input bfds together, as long as they
5055
     don't seem to exceed the maximum GOT size, choosing one of them
5056
     to be the primary GOT.  */
5057
0
  for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
5058
0
    {
5059
0
      gg = mips_elf_bfd_got (ibfd, false);
5060
0
      if (gg && !mips_elf_merge_got (ibfd, gg, &got_per_bfd_arg))
5061
0
  return false;
5062
0
    }
5063
5064
  /* If we do not find any suitable primary GOT, create an empty one.  */
5065
0
  if (got_per_bfd_arg.primary == NULL)
5066
0
    g->next = mips_elf_create_got_info (abfd);
5067
0
  else
5068
0
    g->next = got_per_bfd_arg.primary;
5069
0
  g->next->next = got_per_bfd_arg.current;
5070
5071
  /* GG is now the master GOT, and G is the primary GOT.  */
5072
0
  gg = g;
5073
0
  g = g->next;
5074
5075
  /* Map the output bfd to the primary got.  That's what we're going
5076
     to use for bfds that use GOT16 or GOT_PAGE relocations that we
5077
     didn't mark in check_relocs, and we want a quick way to find it.
5078
     We can't just use gg->next because we're going to reverse the
5079
     list.  */
5080
0
  mips_elf_replace_bfd_got (abfd, g);
5081
5082
  /* Every symbol that is referenced in a dynamic relocation must be
5083
     present in the primary GOT, so arrange for them to appear after
5084
     those that are actually referenced.  */
5085
0
  gg->reloc_only_gotno = gg->global_gotno - g->global_gotno;
5086
0
  g->global_gotno = gg->global_gotno;
5087
5088
0
  tga.info = info;
5089
0
  tga.value = GGA_RELOC_ONLY;
5090
0
  htab_traverse (gg->got_entries, mips_elf_set_global_got_area, &tga);
5091
0
  tga.value = GGA_NORMAL;
5092
0
  htab_traverse (g->got_entries, mips_elf_set_global_got_area, &tga);
5093
5094
  /* Now go through the GOTs assigning them offset ranges.
5095
     [assigned_low_gotno, local_gotno[ will be set to the range of local
5096
     entries in each GOT.  We can then compute the end of a GOT by
5097
     adding local_gotno to global_gotno.  We reverse the list and make
5098
     it circular since then we'll be able to quickly compute the
5099
     beginning of a GOT, by computing the end of its predecessor.  To
5100
     avoid special cases for the primary GOT, while still preserving
5101
     assertions that are valid for both single- and multi-got links,
5102
     we arrange for the main got struct to have the right number of
5103
     global entries, but set its local_gotno such that the initial
5104
     offset of the primary GOT is zero.  Remember that the primary GOT
5105
     will become the last item in the circular linked list, so it
5106
     points back to the master GOT.  */
5107
0
  gg->local_gotno = -g->global_gotno;
5108
0
  gg->global_gotno = g->global_gotno;
5109
0
  gg->tls_gotno = 0;
5110
0
  assign = 0;
5111
0
  gg->next = gg;
5112
5113
0
  do
5114
0
    {
5115
0
      struct mips_got_info *gn;
5116
5117
0
      assign += htab->reserved_gotno;
5118
0
      g->assigned_low_gotno = assign;
5119
0
      g->local_gotno += assign;
5120
0
      g->local_gotno += (pages < g->page_gotno ? pages : g->page_gotno);
5121
0
      g->assigned_high_gotno = g->local_gotno - 1;
5122
0
      assign = g->local_gotno + g->global_gotno + g->tls_gotno;
5123
5124
      /* Take g out of the direct list, and push it onto the reversed
5125
   list that gg points to.  g->next is guaranteed to be nonnull after
5126
   this operation, as required by mips_elf_initialize_tls_index. */
5127
0
      gn = g->next;
5128
0
      g->next = gg->next;
5129
0
      gg->next = g;
5130
5131
      /* Set up any TLS entries.  We always place the TLS entries after
5132
   all non-TLS entries.  */
5133
0
      g->tls_assigned_gotno = g->local_gotno + g->global_gotno;
5134
0
      tga.g = g;
5135
0
      tga.value = MIPS_ELF_GOT_SIZE (abfd);
5136
0
      htab_traverse (g->got_entries, mips_elf_initialize_tls_index, &tga);
5137
0
      if (!tga.g)
5138
0
  return false;
5139
0
      BFD_ASSERT (g->tls_assigned_gotno == assign);
5140
5141
      /* Move onto the next GOT.  It will be a secondary GOT if nonull.  */
5142
0
      g = gn;
5143
5144
      /* Forbid global symbols in every non-primary GOT from having
5145
   lazy-binding stubs.  */
5146
0
      if (g)
5147
0
  htab_traverse (g->got_entries, mips_elf_forbid_lazy_stubs, info);
5148
0
    }
5149
0
  while (g);
5150
5151
0
  got->size = assign * MIPS_ELF_GOT_SIZE (abfd);
5152
5153
0
  needed_relocs = 0;
5154
0
  for (g = gg->next; g && g->next != gg; g = g->next)
5155
0
    {
5156
0
      unsigned int save_assign;
5157
5158
      /* Assign offsets to global GOT entries and count how many
5159
   relocations they need.  */
5160
0
      save_assign = g->assigned_low_gotno;
5161
0
      g->assigned_low_gotno = g->local_gotno;
5162
0
      tga.info = info;
5163
0
      tga.value = MIPS_ELF_GOT_SIZE (abfd);
5164
0
      tga.g = g;
5165
0
      htab_traverse (g->got_entries, mips_elf_set_global_gotidx, &tga);
5166
0
      if (!tga.g)
5167
0
  return false;
5168
0
      BFD_ASSERT (g->assigned_low_gotno == g->local_gotno + g->global_gotno);
5169
0
      g->assigned_low_gotno = save_assign;
5170
5171
0
      if (bfd_link_pic (info))
5172
0
  {
5173
0
    g->relocs += g->local_gotno - g->assigned_low_gotno;
5174
0
    BFD_ASSERT (g->assigned_low_gotno == g->next->local_gotno
5175
0
          + g->next->global_gotno
5176
0
          + g->next->tls_gotno
5177
0
          + htab->reserved_gotno);
5178
0
  }
5179
0
      needed_relocs += g->relocs;
5180
0
    }
5181
0
  needed_relocs += g->relocs;
5182
5183
0
  if (needed_relocs)
5184
0
    mips_elf_allocate_dynamic_relocations (dynobj, info,
5185
0
             needed_relocs);
5186
5187
0
  return true;
5188
0
}
5189
5190

5191
/* Returns the first relocation of type r_type found, beginning with
5192
   RELOCATION.  RELEND is one-past-the-end of the relocation table.  */
5193
5194
static const Elf_Internal_Rela *
5195
mips_elf_next_relocation (bfd *abfd ATTRIBUTE_UNUSED, unsigned int r_type,
5196
        const Elf_Internal_Rela *relocation,
5197
        const Elf_Internal_Rela *relend)
5198
0
{
5199
0
  unsigned long r_symndx = ELF_R_SYM (abfd, relocation->r_info);
5200
5201
0
  while (relocation < relend)
5202
0
    {
5203
0
      if (ELF_R_TYPE (abfd, relocation->r_info) == r_type
5204
0
    && ELF_R_SYM (abfd, relocation->r_info) == r_symndx)
5205
0
  return relocation;
5206
5207
0
      ++relocation;
5208
0
    }
5209
5210
  /* We didn't find it.  */
5211
0
  return NULL;
5212
0
}
5213
5214
/* Return whether an input relocation is against a local symbol.  */
5215
5216
static bool
5217
mips_elf_local_relocation_p (bfd *input_bfd,
5218
           const Elf_Internal_Rela *relocation,
5219
           asection **local_sections)
5220
0
{
5221
0
  unsigned long r_symndx;
5222
0
  Elf_Internal_Shdr *symtab_hdr;
5223
0
  size_t extsymoff;
5224
5225
0
  r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
5226
0
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5227
0
  extsymoff = (elf_bad_symtab (input_bfd)) ? 0 : symtab_hdr->sh_info;
5228
5229
0
  if (r_symndx < extsymoff)
5230
0
    return true;
5231
0
  if (elf_bad_symtab (input_bfd) && local_sections[r_symndx] != NULL)
5232
0
    return true;
5233
5234
0
  return false;
5235
0
}
5236

5237
/* Sign-extend VALUE, which has the indicated number of BITS.  */
5238
5239
bfd_vma
5240
_bfd_mips_elf_sign_extend (bfd_vma value, int bits)
5241
22
{
5242
22
  if (value & ((bfd_vma) 1 << (bits - 1)))
5243
    /* VALUE is negative.  */
5244
12
    value |= ((bfd_vma) - 1) << bits;
5245
5246
22
  return value;
5247
22
}
5248
5249
/* Return non-zero if the indicated VALUE has overflowed the maximum
5250
   range expressible by a signed number with the indicated number of
5251
   BITS.  */
5252
5253
static bool
5254
mips_elf_overflow_p (bfd_vma value, int bits)
5255
0
{
5256
0
  bfd_signed_vma svalue = (bfd_signed_vma) value;
5257
5258
0
  if (svalue > (1 << (bits - 1)) - 1)
5259
    /* The value is too big.  */
5260
0
    return true;
5261
0
  else if (svalue < -(1 << (bits - 1)))
5262
    /* The value is too small.  */
5263
0
    return true;
5264
5265
  /* All is well.  */
5266
0
  return false;
5267
0
}
5268
5269
/* Calculate the %high function.  */
5270
5271
static bfd_vma
5272
mips_elf_high (bfd_vma value)
5273
0
{
5274
0
  return ((value + (bfd_vma) 0x8000) >> 16) & 0xffff;
5275
0
}
5276
5277
/* Calculate the %higher function.  */
5278
5279
static bfd_vma
5280
mips_elf_higher (bfd_vma value ATTRIBUTE_UNUSED)
5281
0
{
5282
0
#ifdef BFD64
5283
0
  return ((value + (bfd_vma) 0x80008000) >> 32) & 0xffff;
5284
#else
5285
  abort ();
5286
  return MINUS_ONE;
5287
#endif
5288
0
}
5289
5290
/* Calculate the %highest function.  */
5291
5292
static bfd_vma
5293
mips_elf_highest (bfd_vma value ATTRIBUTE_UNUSED)
5294
0
{
5295
0
#ifdef BFD64
5296
0
  return ((value + (((bfd_vma) 0x8000 << 32) | 0x80008000)) >> 48) & 0xffff;
5297
#else
5298
  abort ();
5299
  return MINUS_ONE;
5300
#endif
5301
0
}
5302

5303
/* Create the .compact_rel section.  */
5304
5305
static bool
5306
mips_elf_create_compact_rel_section
5307
  (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
5308
0
{
5309
0
  flagword flags;
5310
0
  register asection *s;
5311
5312
0
  if (bfd_get_linker_section (abfd, ".compact_rel") == NULL)
5313
0
    {
5314
0
      flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED
5315
0
         | SEC_READONLY);
5316
5317
0
      s = bfd_make_section_anyway_with_flags (abfd, ".compact_rel", flags);
5318
0
      if (s == NULL
5319
0
    || !bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd)))
5320
0
  return false;
5321
5322
0
      s->size = sizeof (Elf32_External_compact_rel);
5323
0
    }
5324
5325
0
  return true;
5326
0
}
5327
5328
/* Create the .got section to hold the global offset table.  */
5329
5330
static bool
5331
mips_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
5332
0
{
5333
0
  flagword flags;
5334
0
  register asection *s;
5335
0
  struct elf_link_hash_entry *h;
5336
0
  struct bfd_link_hash_entry *bh;
5337
0
  struct mips_elf_link_hash_table *htab;
5338
5339
0
  htab = mips_elf_hash_table (info);
5340
0
  BFD_ASSERT (htab != NULL);
5341
5342
  /* This function may be called more than once.  */
5343
0
  if (htab->root.sgot)
5344
0
    return true;
5345
5346
0
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
5347
0
     | SEC_LINKER_CREATED);
5348
5349
  /* We have to use an alignment of 2**4 here because this is hardcoded
5350
     in the function stub generation and in the linker script.  */
5351
0
  s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
5352
0
  if (s == NULL
5353
0
      || !bfd_set_section_alignment (s, 4))
5354
0
    return false;
5355
0
  htab->root.sgot = s;
5356
5357
  /* Define the symbol _GLOBAL_OFFSET_TABLE_.  We don't do this in the
5358
     linker script because we don't want to define the symbol if we
5359
     are not creating a global offset table.  */
5360
0
  bh = NULL;
5361
0
  if (! (_bfd_generic_link_add_one_symbol
5362
0
   (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
5363
0
    0, NULL, false, get_elf_backend_data (abfd)->collect, &bh)))
5364
0
    return false;
5365
5366
0
  h = (struct elf_link_hash_entry *) bh;
5367
0
  h->non_elf = 0;
5368
0
  h->def_regular = 1;
5369
0
  h->type = STT_OBJECT;
5370
0
  h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
5371
0
  elf_hash_table (info)->hgot = h;
5372
5373
0
  if (bfd_link_pic (info)
5374
0
      && ! bfd_elf_link_record_dynamic_symbol (info, h))
5375
0
    return false;
5376
5377
0
  htab->got_info = mips_elf_create_got_info (abfd);
5378
0
  mips_elf_section_data (s)->elf.this_hdr.sh_flags
5379
0
    |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
5380
5381
  /* We also need a .got.plt section when generating PLTs.  */
5382
0
  s = bfd_make_section_anyway_with_flags (abfd, ".got.plt",
5383
0
            SEC_ALLOC | SEC_LOAD
5384
0
            | SEC_HAS_CONTENTS
5385
0
            | SEC_IN_MEMORY
5386
0
            | SEC_LINKER_CREATED);
5387
0
  if (s == NULL)
5388
0
    return false;
5389
0
  htab->root.sgotplt = s;
5390
5391
0
  return true;
5392
0
}
5393

5394
/* Return true if H refers to the special VxWorks __GOTT_BASE__ or
5395
   __GOTT_INDEX__ symbols.  These symbols are only special for
5396
   shared objects; they are not used in executables.  */
5397
5398
static bool
5399
is_gott_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h)
5400
0
{
5401
0
  return (mips_elf_hash_table (info)->root.target_os == is_vxworks
5402
0
    && bfd_link_pic (info)
5403
0
    && (strcmp (h->root.root.string, "__GOTT_BASE__") == 0
5404
0
        || strcmp (h->root.root.string, "__GOTT_INDEX__") == 0));
5405
0
}
5406
5407
/* Return TRUE if a relocation of type R_TYPE from INPUT_BFD might
5408
   require an la25 stub.  See also mips_elf_local_pic_function_p,
5409
   which determines whether the destination function ever requires a
5410
   stub.  */
5411
5412
static bool
5413
mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type,
5414
             bool target_is_16_bit_code_p)
5415
0
{
5416
  /* We specifically ignore branches and jumps from EF_PIC objects,
5417
     where the onus is on the compiler or programmer to perform any
5418
     necessary initialization of $25.  Sometimes such initialization
5419
     is unnecessary; for example, -mno-shared functions do not use
5420
     the incoming value of $25, and may therefore be called directly.  */
5421
0
  if (PIC_OBJECT_P (input_bfd))
5422
0
    return false;
5423
5424
0
  switch (r_type)
5425
0
    {
5426
0
    case R_MIPS_26:
5427
0
    case R_MIPS_PC16:
5428
0
    case R_MIPS_PC21_S2:
5429
0
    case R_MIPS_PC26_S2:
5430
0
    case R_MICROMIPS_26_S1:
5431
0
    case R_MICROMIPS_PC7_S1:
5432
0
    case R_MICROMIPS_PC10_S1:
5433
0
    case R_MICROMIPS_PC16_S1:
5434
0
    case R_MICROMIPS_PC23_S2:
5435
0
      return true;
5436
5437
0
    case R_MIPS16_26:
5438
0
      return !target_is_16_bit_code_p;
5439
5440
0
    default:
5441
0
      return false;
5442
0
    }
5443
0
}
5444

5445
/* Obtain the field relocated by RELOCATION.  */
5446
5447
static bfd_vma
5448
mips_elf_obtain_contents (reloc_howto_type *howto,
5449
        const Elf_Internal_Rela *relocation,
5450
        bfd *input_bfd, bfd_byte *contents)
5451
0
{
5452
0
  bfd_vma x = 0;
5453
0
  bfd_byte *location = contents + relocation->r_offset;
5454
0
  unsigned int size = bfd_get_reloc_size (howto);
5455
5456
  /* Obtain the bytes.  */
5457
0
  if (size != 0)
5458
0
    x = bfd_get (8 * size, input_bfd, location);
5459
5460
0
  return x;
5461
0
}
5462
5463
/* Store the field relocated by RELOCATION.  */
5464
5465
static void
5466
mips_elf_store_contents (reloc_howto_type *howto,
5467
       const Elf_Internal_Rela *relocation,
5468
       bfd *input_bfd, bfd_byte *contents, bfd_vma x)
5469
0
{
5470
0
  bfd_byte *location = contents + relocation->r_offset;
5471
0
  unsigned int size = bfd_get_reloc_size (howto);
5472
5473
  /* Put the value into the output.  */
5474
0
  if (size != 0)
5475
0
    bfd_put (8 * size, input_bfd, x, location);
5476
0
}
5477
5478
/* Try to patch a load from GOT instruction in CONTENTS pointed to by
5479
   RELOCATION described by HOWTO, with a move of 0 to the load target
5480
   register, returning TRUE if that is successful and FALSE otherwise.
5481
   If DOIT is FALSE, then only determine it patching is possible and
5482
   return status without actually changing CONTENTS.
5483
*/
5484
5485
static bool
5486
mips_elf_nullify_got_load (bfd *input_bfd, bfd_byte *contents,
5487
         const Elf_Internal_Rela *relocation,
5488
         reloc_howto_type *howto, bool doit)
5489
0
{
5490
0
  int r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
5491
0
  bfd_byte *location = contents + relocation->r_offset;
5492
0
  bool nullified = true;
5493
0
  bfd_vma x;
5494
5495
0
  _bfd_mips_elf_reloc_unshuffle (input_bfd, r_type, false, location);
5496
5497
  /* Obtain the current value.  */
5498
0
  x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
5499
5500
  /* Note that in the unshuffled MIPS16 encoding RX is at bits [21:19]
5501
     while RY is at bits [18:16] of the combined 32-bit instruction word.  */
5502
0
  if (mips16_reloc_p (r_type)
5503
0
      && (((x >> 22) & 0x3ff) == 0x3d3        /* LW */
5504
0
    || ((x >> 22) & 0x3ff) == 0x3c7))      /* LD */
5505
0
    x = (0x3cdU << 22) | (x & (7 << 16)) << 3;     /* LI */
5506
0
  else if (micromips_reloc_p (r_type)
5507
0
     && ((x >> 26) & 0x37) == 0x37)     /* LW/LD */
5508
0
    x = (0xc << 26) | (x & (0x1f << 21));     /* ADDIU */
5509
0
  else if (((x >> 26) & 0x3f) == 0x23        /* LW */
5510
0
     || ((x >> 26) & 0x3f) == 0x37)     /* LD */
5511
0
    x = (0x9 << 26) | (x & (0x1f << 16));     /* ADDIU */
5512
0
  else
5513
0
    nullified = false;
5514
5515
  /* Put the value into the output.  */
5516
0
  if (doit && nullified)
5517
0
    mips_elf_store_contents (howto, relocation, input_bfd, contents, x);
5518
5519
0
  _bfd_mips_elf_reloc_shuffle (input_bfd, r_type, false, location);
5520
5521
0
  return nullified;
5522
0
}
5523
5524
/* Calculate the value produced by the RELOCATION (which comes from
5525
   the INPUT_BFD).  The ADDEND is the addend to use for this
5526
   RELOCATION; RELOCATION->R_ADDEND is ignored.
5527
5528
   The result of the relocation calculation is stored in VALUEP.
5529
   On exit, set *CROSS_MODE_JUMP_P to true if the relocation field
5530
   is a MIPS16 or microMIPS jump to standard MIPS code, or vice versa.
5531
5532
   This function returns bfd_reloc_continue if the caller need take no
5533
   further action regarding this relocation, bfd_reloc_notsupported if
5534
   something goes dramatically wrong, bfd_reloc_overflow if an
5535
   overflow occurs, and bfd_reloc_ok to indicate success.  */
5536
5537
static bfd_reloc_status_type
5538
mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
5539
             asection *input_section, bfd_byte *contents,
5540
             struct bfd_link_info *info,
5541
             const Elf_Internal_Rela *relocation,
5542
             bfd_vma addend, reloc_howto_type *howto,
5543
             Elf_Internal_Sym *local_syms,
5544
             asection **local_sections, bfd_vma *valuep,
5545
             const char **namep,
5546
             bool *cross_mode_jump_p,
5547
             bool save_addend)
5548
0
{
5549
  /* The eventual value we will return.  */
5550
0
  bfd_vma value;
5551
  /* The address of the symbol against which the relocation is
5552
     occurring.  */
5553
0
  bfd_vma symbol = 0;
5554
  /* The final GP value to be used for the relocatable, executable, or
5555
     shared object file being produced.  */
5556
0
  bfd_vma gp;
5557
  /* The place (section offset or address) of the storage unit being
5558
     relocated.  */
5559
0
  bfd_vma p;
5560
  /* The value of GP used to create the relocatable object.  */
5561
0
  bfd_vma gp0;
5562
  /* The offset into the global offset table at which the address of
5563
     the relocation entry symbol, adjusted by the addend, resides
5564
     during execution.  */
5565
0
  bfd_vma g = MINUS_ONE;
5566
  /* The section in which the symbol referenced by the relocation is
5567
     located.  */
5568
0
  asection *sec = NULL;
5569
0
  struct mips_elf_link_hash_entry *h = NULL;
5570
  /* TRUE if the symbol referred to by this relocation is a local
5571
     symbol.  */
5572
0
  bool local_p, was_local_p;
5573
  /* TRUE if the symbol referred to by this relocation is a section
5574
     symbol.  */
5575
0
  bool section_p = false;
5576
  /* TRUE if the symbol referred to by this relocation is "_gp_disp".  */
5577
0
  bool gp_disp_p = false;
5578
  /* TRUE if the symbol referred to by this relocation is
5579
     "__gnu_local_gp".  */
5580
0
  bool gnu_local_gp_p = false;
5581
0
  Elf_Internal_Shdr *symtab_hdr;
5582
0
  size_t extsymoff;
5583
0
  unsigned long r_symndx;
5584
0
  int r_type;
5585
  /* TRUE if overflow occurred during the calculation of the
5586
     relocation value.  */
5587
0
  bool overflowed_p;
5588
  /* TRUE if this relocation refers to a MIPS16 function.  */
5589
0
  bool target_is_16_bit_code_p = false;
5590
0
  bool target_is_micromips_code_p = false;
5591
0
  struct mips_elf_link_hash_table *htab;
5592
0
  bfd *dynobj;
5593
0
  bool resolved_to_zero;
5594
5595
0
  dynobj = elf_hash_table (info)->dynobj;
5596
0
  htab = mips_elf_hash_table (info);
5597
0
  BFD_ASSERT (htab != NULL);
5598
5599
  /* Parse the relocation.  */
5600
0
  r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
5601
0
  r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
5602
0
  p = (input_section->output_section->vma
5603
0
       + input_section->output_offset
5604
0
       + relocation->r_offset);
5605
5606
  /* Assume that there will be no overflow.  */
5607
0
  overflowed_p = false;
5608
5609
  /* Figure out whether or not the symbol is local, and get the offset
5610
     used in the array of hash table entries.  */
5611
0
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5612
0
  local_p = mips_elf_local_relocation_p (input_bfd, relocation,
5613
0
           local_sections);
5614
0
  was_local_p = local_p;
5615
0
  if (! elf_bad_symtab (input_bfd))
5616
0
    extsymoff = symtab_hdr->sh_info;
5617
0
  else
5618
0
    {
5619
      /* The symbol table does not follow the rule that local symbols
5620
   must come before globals.  */
5621
0
      extsymoff = 0;
5622
0
    }
5623
5624
  /* Figure out the value of the symbol.  */
5625
0
  if (local_p)
5626
0
    {
5627
0
      bool micromips_p = MICROMIPS_P (abfd);
5628
0
      Elf_Internal_Sym *sym;
5629
5630
0
      sym = local_syms + r_symndx;
5631
0
      sec = local_sections[r_symndx];
5632
5633
0
      section_p = ELF_ST_TYPE (sym->st_info) == STT_SECTION;
5634
5635
0
      symbol = sec->output_section->vma + sec->output_offset;
5636
0
      if (!section_p || (sec->flags & SEC_MERGE))
5637
0
  symbol += sym->st_value;
5638
0
      if ((sec->flags & SEC_MERGE) && section_p)
5639
0
  {
5640
0
    addend = _bfd_elf_rel_local_sym (abfd, sym, &sec, addend);
5641
0
    addend -= symbol;
5642
0
    addend += sec->output_section->vma + sec->output_offset;
5643
0
  }
5644
5645
      /* MIPS16/microMIPS text labels should be treated as odd.  */
5646
0
      if (ELF_ST_IS_COMPRESSED (sym->st_other))
5647
0
  ++symbol;
5648
5649
      /* Record the name of this symbol, for our caller.  */
5650
0
      *namep = bfd_elf_string_from_elf_section (input_bfd,
5651
0
            symtab_hdr->sh_link,
5652
0
            sym->st_name);
5653
0
      if (*namep == NULL || **namep == '\0')
5654
0
  *namep = bfd_section_name (sec);
5655
5656
      /* For relocations against a section symbol and ones against no
5657
   symbol (absolute relocations) infer the ISA mode from the addend.  */
5658
0
      if (section_p || r_symndx == STN_UNDEF)
5659
0
  {
5660
0
    target_is_16_bit_code_p = (addend & 1) && !micromips_p;
5661
0
    target_is_micromips_code_p = (addend & 1) && micromips_p;
5662
0
  }
5663
      /* For relocations against an absolute symbol infer the ISA mode
5664
   from the value of the symbol plus addend.  */
5665
0
      else if (bfd_is_abs_section (sec))
5666
0
  {
5667
0
    target_is_16_bit_code_p = ((symbol + addend) & 1) && !micromips_p;
5668
0
    target_is_micromips_code_p = ((symbol + addend) & 1) && micromips_p;
5669
0
  }
5670
      /* Otherwise just use the regular symbol annotation available.  */
5671
0
      else
5672
0
  {
5673
0
    target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (sym->st_other);
5674
0
    target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (sym->st_other);
5675
0
  }
5676
0
    }
5677
0
  else
5678
0
    {
5679
      /* ??? Could we use RELOC_FOR_GLOBAL_SYMBOL here ?  */
5680
5681
      /* For global symbols we look up the symbol in the hash-table.  */
5682
0
      h = ((struct mips_elf_link_hash_entry *)
5683
0
     elf_sym_hashes (input_bfd) [r_symndx - extsymoff]);
5684
      /* Find the real hash-table entry for this symbol.  */
5685
0
      while (h->root.root.type == bfd_link_hash_indirect
5686
0
       || h->root.root.type == bfd_link_hash_warning)
5687
0
  h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
5688
5689
      /* Record the name of this symbol, for our caller.  */
5690
0
      *namep = h->root.root.root.string;
5691
5692
      /* See if this is the special _gp_disp symbol.  Note that such a
5693
   symbol must always be a global symbol.  */
5694
0
      if (strcmp (*namep, "_gp_disp") == 0
5695
0
    && ! NEWABI_P (input_bfd))
5696
0
  {
5697
    /* Relocations against _gp_disp are permitted only with
5698
       R_MIPS_HI16 and R_MIPS_LO16 relocations.  */
5699
0
    if (!hi16_reloc_p (r_type) && !lo16_reloc_p (r_type))
5700
0
      return bfd_reloc_notsupported;
5701
5702
0
    gp_disp_p = true;
5703
0
  }
5704
      /* See if this is the special _gp symbol.  Note that such a
5705
   symbol must always be a global symbol.  */
5706
0
      else if (strcmp (*namep, "__gnu_local_gp") == 0)
5707
0
  gnu_local_gp_p = true;
5708
5709
5710
      /* If this symbol is defined, calculate its address.  Note that
5711
   _gp_disp is a magic symbol, always implicitly defined by the
5712
   linker, so it's inappropriate to check to see whether or not
5713
   its defined.  */
5714
0
      else if ((h->root.root.type == bfd_link_hash_defined
5715
0
    || h->root.root.type == bfd_link_hash_defweak)
5716
0
         && h->root.root.u.def.section)
5717
0
  {
5718
0
    sec = h->root.root.u.def.section;
5719
0
    if (sec->output_section)
5720
0
      symbol = (h->root.root.u.def.value
5721
0
          + sec->output_section->vma
5722
0
          + sec->output_offset);
5723
0
    else
5724
0
      symbol = h->root.root.u.def.value;
5725
0
  }
5726
0
      else if (h->root.root.type == bfd_link_hash_undefweak)
5727
  /* We allow relocations against undefined weak symbols, giving
5728
     it the value zero, so that you can undefined weak functions
5729
     and check to see if they exist by looking at their
5730
     addresses.  */
5731
0
  symbol = 0;
5732
0
      else if (info->unresolved_syms_in_objects == RM_IGNORE
5733
0
         && ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
5734
0
  symbol = 0;
5735
0
      else if (strcmp (*namep, SGI_COMPAT (input_bfd)
5736
0
           ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING") == 0)
5737
0
  {
5738
    /* If this is a dynamic link, we should have created a
5739
       _DYNAMIC_LINK symbol or _DYNAMIC_LINKING(for normal mips) symbol
5740
       in _bfd_mips_elf_create_dynamic_sections.
5741
       Otherwise, we should define the symbol with a value of 0.
5742
       FIXME: It should probably get into the symbol table
5743
       somehow as well.  */
5744
0
    BFD_ASSERT (! bfd_link_pic (info));
5745
0
    BFD_ASSERT (bfd_get_section_by_name (abfd, ".dynamic") == NULL);
5746
0
    symbol = 0;
5747
0
  }
5748
0
      else if (ELF_MIPS_IS_OPTIONAL (h->root.other))
5749
0
  {
5750
    /* This is an optional symbol - an Irix specific extension to the
5751
       ELF spec.  Ignore it for now.
5752
       XXX - FIXME - there is more to the spec for OPTIONAL symbols
5753
       than simply ignoring them, but we do not handle this for now.
5754
       For information see the "64-bit ELF Object File Specification"
5755
       which is available from here:
5756
       http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf  */
5757
0
    symbol = 0;
5758
0
  }
5759
0
      else
5760
0
  {
5761
0
          bool reject_undefined
5762
0
      = ((info->unresolved_syms_in_objects == RM_DIAGNOSE
5763
0
    && !info->warn_unresolved_syms)
5764
0
         || ELF_ST_VISIBILITY (h->root.other) != STV_DEFAULT);
5765
5766
0
    info->callbacks->undefined_symbol
5767
0
      (info, h->root.root.root.string, input_bfd,
5768
0
       input_section, relocation->r_offset, reject_undefined);
5769
5770
0
    if (reject_undefined)
5771
0
      return bfd_reloc_undefined;
5772
5773
0
    symbol = 0;
5774
0
  }
5775
5776
0
      target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (h->root.other);
5777
0
      target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (h->root.other);
5778
0
    }
5779
5780
  /* If this is a reference to a 16-bit function with a stub, we need
5781
     to redirect the relocation to the stub unless:
5782
5783
     (a) the relocation is for a MIPS16 JAL;
5784
5785
     (b) the relocation is for a MIPS16 PIC call, and there are no
5786
   non-MIPS16 uses of the GOT slot; or
5787
5788
     (c) the section allows direct references to MIPS16 functions.  */
5789
0
  if (r_type != R_MIPS16_26
5790
0
      && !bfd_link_relocatable (info)
5791
0
      && ((h != NULL
5792
0
     && h->fn_stub != NULL
5793
0
     && (r_type != R_MIPS16_CALL16 || h->need_fn_stub))
5794
0
    || (local_p
5795
0
        && mips_elf_tdata (input_bfd)->local_stubs != NULL
5796
0
        && mips_elf_tdata (input_bfd)->local_stubs[r_symndx] != NULL))
5797
0
      && !section_allows_mips16_refs_p (input_section))
5798
0
    {
5799
      /* This is a 32- or 64-bit call to a 16-bit function.  We should
5800
   have already noticed that we were going to need the
5801
   stub.  */
5802
0
      if (local_p)
5803
0
  {
5804
0
    sec = mips_elf_tdata (input_bfd)->local_stubs[r_symndx];
5805
0
    value = 0;
5806
0
  }
5807
0
      else
5808
0
  {
5809
0
    BFD_ASSERT (h->need_fn_stub);
5810
0
    if (h->la25_stub)
5811
0
      {
5812
        /* If a LA25 header for the stub itself exists, point to the
5813
     prepended LUI/ADDIU sequence.  */
5814
0
        sec = h->la25_stub->stub_section;
5815
0
        value = h->la25_stub->offset;
5816
0
      }
5817
0
    else
5818
0
      {
5819
0
        sec = h->fn_stub;
5820
0
        value = 0;
5821
0
      }
5822
0
  }
5823
5824
0
      symbol = sec->output_section->vma + sec->output_offset + value;
5825
      /* The target is 16-bit, but the stub isn't.  */
5826
0
      target_is_16_bit_code_p = false;
5827
0
    }
5828
  /* If this is a MIPS16 call with a stub, that is made through the PLT or
5829
     to a standard MIPS function, we need to redirect the call to the stub.
5830
     Note that we specifically exclude R_MIPS16_CALL16 from this behavior;
5831
     indirect calls should use an indirect stub instead.  */
5832
0
  else if (r_type == R_MIPS16_26 && !bfd_link_relocatable (info)
5833
0
     && ((h != NULL && (h->call_stub != NULL || h->call_fp_stub != NULL))
5834
0
         || (local_p
5835
0
       && mips_elf_tdata (input_bfd)->local_call_stubs != NULL
5836
0
       && mips_elf_tdata (input_bfd)->local_call_stubs[r_symndx] != NULL))
5837
0
     && ((h != NULL && h->use_plt_entry) || !target_is_16_bit_code_p))
5838
0
    {
5839
0
      if (local_p)
5840
0
  sec = mips_elf_tdata (input_bfd)->local_call_stubs[r_symndx];
5841
0
      else
5842
0
  {
5843
    /* If both call_stub and call_fp_stub are defined, we can figure
5844
       out which one to use by checking which one appears in the input
5845
       file.  */
5846
0
    if (h->call_stub != NULL && h->call_fp_stub != NULL)
5847
0
      {
5848
0
        asection *o;
5849
5850
0
        sec = NULL;
5851
0
        for (o = input_bfd->sections; o != NULL; o = o->next)
5852
0
    {
5853
0
      if (CALL_FP_STUB_P (bfd_section_name (o)))
5854
0
        {
5855
0
          sec = h->call_fp_stub;
5856
0
          break;
5857
0
        }
5858
0
    }
5859
0
        if (sec == NULL)
5860
0
    sec = h->call_stub;
5861
0
      }
5862
0
    else if (h->call_stub != NULL)
5863
0
      sec = h->call_stub;
5864
0
    else
5865
0
      sec = h->call_fp_stub;
5866
0
  }
5867
5868
0
      BFD_ASSERT (sec->size > 0);
5869
0
      symbol = sec->output_section->vma + sec->output_offset;
5870
0
    }
5871
  /* If this is a direct call to a PIC function, redirect to the
5872
     non-PIC stub.  */
5873
0
  else if (h != NULL && h->la25_stub
5874
0
     && mips_elf_relocation_needs_la25_stub (input_bfd, r_type,
5875
0
               target_is_16_bit_code_p))
5876
0
    {
5877
0
  symbol = (h->la25_stub->stub_section->output_section->vma
5878
0
      + h->la25_stub->stub_section->output_offset
5879
0
      + h->la25_stub->offset);
5880
0
  if (ELF_ST_IS_MICROMIPS (h->root.other))
5881
0
    symbol |= 1;
5882
0
    }
5883
  /* For direct MIPS16 and microMIPS calls make sure the compressed PLT
5884
     entry is used if a standard PLT entry has also been made.  In this
5885
     case the symbol will have been set by mips_elf_set_plt_sym_value
5886
     to point to the standard PLT entry, so redirect to the compressed
5887
     one.  */
5888
0
  else if ((mips16_branch_reloc_p (r_type)
5889
0
      || micromips_branch_reloc_p (r_type))
5890
0
     && !bfd_link_relocatable (info)
5891
0
     && h != NULL
5892
0
     && h->use_plt_entry
5893
0
     && h->root.plt.plist->comp_offset != MINUS_ONE
5894
0
     && h->root.plt.plist->mips_offset != MINUS_ONE)
5895
0
    {
5896
0
      bool micromips_p = MICROMIPS_P (abfd);
5897
5898
0
      sec = htab->root.splt;
5899
0
      symbol = (sec->output_section->vma
5900
0
    + sec->output_offset
5901
0
    + htab->plt_header_size
5902
0
    + htab->plt_mips_offset
5903
0
    + h->root.plt.plist->comp_offset
5904
0
    + 1);
5905
5906
0
      target_is_16_bit_code_p = !micromips_p;
5907
0
      target_is_micromips_code_p = micromips_p;
5908
0
    }
5909
5910
  /* Make sure MIPS16 and microMIPS are not used together.  */
5911
0
  if ((mips16_branch_reloc_p (r_type) && target_is_micromips_code_p)
5912
0
      || (micromips_branch_reloc_p (r_type) && target_is_16_bit_code_p))
5913
0
   {
5914
0
      _bfd_error_handler
5915
0
  (_("MIPS16 and microMIPS functions cannot call each other"));
5916
0
      return bfd_reloc_notsupported;
5917
0
   }
5918
5919
  /* Calls from 16-bit code to 32-bit code and vice versa require the
5920
     mode change.  However, we can ignore calls to undefined weak symbols,
5921
     which should never be executed at runtime.  This exception is important
5922
     because the assembly writer may have "known" that any definition of the
5923
     symbol would be 16-bit code, and that direct jumps were therefore
5924
     acceptable.  */
5925
0
  *cross_mode_jump_p = (!bfd_link_relocatable (info)
5926
0
      && !(h && h->root.root.type == bfd_link_hash_undefweak)
5927
0
      && ((mips16_branch_reloc_p (r_type)
5928
0
           && !target_is_16_bit_code_p)
5929
0
          || (micromips_branch_reloc_p (r_type)
5930
0
        && !target_is_micromips_code_p)
5931
0
          || ((branch_reloc_p (r_type)
5932
0
         || r_type == R_MIPS_JALR)
5933
0
        && (target_is_16_bit_code_p
5934
0
            || target_is_micromips_code_p))));
5935
5936
0
  resolved_to_zero = (h != NULL
5937
0
          && UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->root));
5938
5939
0
  switch (r_type)
5940
0
    {
5941
0
    case R_MIPS16_CALL16:
5942
0
    case R_MIPS16_GOT16:
5943
0
    case R_MIPS_CALL16:
5944
0
    case R_MIPS_GOT16:
5945
0
    case R_MIPS_GOT_PAGE:
5946
0
    case R_MIPS_GOT_DISP:
5947
0
    case R_MIPS_GOT_LO16:
5948
0
    case R_MIPS_CALL_LO16:
5949
0
    case R_MICROMIPS_CALL16:
5950
0
    case R_MICROMIPS_GOT16:
5951
0
    case R_MICROMIPS_GOT_PAGE:
5952
0
    case R_MICROMIPS_GOT_DISP:
5953
0
    case R_MICROMIPS_GOT_LO16:
5954
0
    case R_MICROMIPS_CALL_LO16:
5955
0
      if (resolved_to_zero
5956
0
    && !bfd_link_relocatable (info)
5957
0
    && bfd_reloc_offset_in_range (howto, input_bfd, input_section,
5958
0
          relocation->r_offset)
5959
0
    && mips_elf_nullify_got_load (input_bfd, contents,
5960
0
          relocation, howto, true))
5961
0
  return bfd_reloc_continue;
5962
5963
      /* Fall through.  */
5964
0
    case R_MIPS_GOT_HI16:
5965
0
    case R_MIPS_CALL_HI16:
5966
0
    case R_MICROMIPS_GOT_HI16:
5967
0
    case R_MICROMIPS_CALL_HI16:
5968
0
      if (resolved_to_zero
5969
0
    && htab->use_absolute_zero
5970
0
    && bfd_link_pic (info))
5971
0
  {
5972
    /* Redirect to the special `__gnu_absolute_zero' symbol.  */
5973
0
    h = mips_elf_link_hash_lookup (htab, "__gnu_absolute_zero",
5974
0
           false, false, false);
5975
0
    BFD_ASSERT (h != NULL);
5976
0
  }
5977
0
      break;
5978
0
    }
5979
5980
0
  local_p = (h == NULL || mips_use_local_got_p (info, h));
5981
5982
0
  gp0 = _bfd_get_gp_value (input_bfd);
5983
0
  gp = _bfd_get_gp_value (abfd);
5984
0
  if (htab->got_info)
5985
0
    gp += mips_elf_adjust_gp (abfd, htab->got_info, input_bfd);
5986
5987
0
  if (gnu_local_gp_p)
5988
0
    symbol = gp;
5989
5990
  /* Global R_MIPS_GOT_PAGE/R_MICROMIPS_GOT_PAGE relocations are equivalent
5991
     to R_MIPS_GOT_DISP/R_MICROMIPS_GOT_DISP.  The addend is applied by the
5992
     corresponding R_MIPS_GOT_OFST/R_MICROMIPS_GOT_OFST.  */
5993
0
  if (got_page_reloc_p (r_type) && !local_p)
5994
0
    {
5995
0
      r_type = (micromips_reloc_p (r_type)
5996
0
    ? R_MICROMIPS_GOT_DISP : R_MIPS_GOT_DISP);
5997
0
      addend = 0;
5998
0
    }
5999
6000
  /* If we haven't already determined the GOT offset, and we're going
6001
     to need it, get it now.  */
6002
0
  switch (r_type)
6003
0
    {
6004
0
    case R_MIPS16_CALL16:
6005
0
    case R_MIPS16_GOT16:
6006
0
    case R_MIPS_CALL16:
6007
0
    case R_MIPS_GOT16:
6008
0
    case R_MIPS_GOT_DISP:
6009
0
    case R_MIPS_GOT_HI16:
6010
0
    case R_MIPS_CALL_HI16:
6011
0
    case R_MIPS_GOT_LO16:
6012
0
    case R_MIPS_CALL_LO16:
6013
0
    case R_MICROMIPS_CALL16:
6014
0
    case R_MICROMIPS_GOT16:
6015
0
    case R_MICROMIPS_GOT_DISP:
6016
0
    case R_MICROMIPS_GOT_HI16:
6017
0
    case R_MICROMIPS_CALL_HI16:
6018
0
    case R_MICROMIPS_GOT_LO16:
6019
0
    case R_MICROMIPS_CALL_LO16:
6020
0
    case R_MIPS_TLS_GD:
6021
0
    case R_MIPS_TLS_GOTTPREL:
6022
0
    case R_MIPS_TLS_LDM:
6023
0
    case R_MIPS16_TLS_GD:
6024
0
    case R_MIPS16_TLS_GOTTPREL:
6025
0
    case R_MIPS16_TLS_LDM:
6026
0
    case R_MICROMIPS_TLS_GD:
6027
0
    case R_MICROMIPS_TLS_GOTTPREL:
6028
0
    case R_MICROMIPS_TLS_LDM:
6029
      /* Find the index into the GOT where this value is located.  */
6030
0
      if (tls_ldm_reloc_p (r_type))
6031
0
  {
6032
0
    g = mips_elf_local_got_index (abfd, input_bfd, info,
6033
0
          0, 0, NULL, r_type);
6034
0
    if (g == MINUS_ONE)
6035
0
      return bfd_reloc_outofrange;
6036
0
  }
6037
0
      else if (!local_p)
6038
0
  {
6039
    /* On VxWorks, CALL relocations should refer to the .got.plt
6040
       entry, which is initialized to point at the PLT stub.  */
6041
0
    if (htab->root.target_os == is_vxworks
6042
0
        && (call_hi16_reloc_p (r_type)
6043
0
      || call_lo16_reloc_p (r_type)
6044
0
      || call16_reloc_p (r_type)))
6045
0
      {
6046
0
        BFD_ASSERT (addend == 0);
6047
0
        BFD_ASSERT (h->root.needs_plt);
6048
0
        g = mips_elf_gotplt_index (info, &h->root);
6049
0
      }
6050
0
    else
6051
0
      {
6052
0
        BFD_ASSERT (addend == 0);
6053
0
        g = mips_elf_global_got_index (abfd, info, input_bfd,
6054
0
               &h->root, r_type);
6055
0
        if (!TLS_RELOC_P (r_type)
6056
0
      && !elf_hash_table (info)->dynamic_sections_created)
6057
    /* This is a static link.  We must initialize the GOT entry.  */
6058
0
    MIPS_ELF_PUT_WORD (dynobj, symbol, htab->root.sgot->contents + g);
6059
0
      }
6060
0
  }
6061
0
      else if (htab->root.target_os != is_vxworks
6062
0
         && (call16_reloc_p (r_type) || got16_reloc_p (r_type)))
6063
  /* The calculation below does not involve "g".  */
6064
0
  break;
6065
0
      else
6066
0
  {
6067
0
    g = mips_elf_local_got_index (abfd, input_bfd, info,
6068
0
          symbol + addend, r_symndx, h, r_type);
6069
0
    if (g == MINUS_ONE)
6070
0
      return bfd_reloc_outofrange;
6071
0
  }
6072
6073
      /* Convert GOT indices to actual offsets.  */
6074
0
      g = mips_elf_got_offset_from_index (info, abfd, input_bfd, g);
6075
0
      break;
6076
0
    }
6077
6078
  /* Relocations against the VxWorks __GOTT_BASE__ and __GOTT_INDEX__
6079
     symbols are resolved by the loader.  Add them to .rela.dyn.  */
6080
0
  if (h != NULL && is_gott_symbol (info, &h->root))
6081
0
    {
6082
0
      Elf_Internal_Rela outrel;
6083
0
      bfd_byte *loc;
6084
0
      asection *s;
6085
6086
0
      s = mips_elf_rel_dyn_section (info, false);
6087
0
      loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
6088
6089
0
      outrel.r_offset = (input_section->output_section->vma
6090
0
       + input_section->output_offset
6091
0
       + relocation->r_offset);
6092
0
      outrel.r_info = ELF32_R_INFO (h->root.dynindx, r_type);
6093
0
      outrel.r_addend = addend;
6094
0
      bfd_elf32_swap_reloca_out (abfd, &outrel, loc);
6095
6096
      /* If we've written this relocation for a readonly section,
6097
   we need to set DF_TEXTREL again, so that we do not delete the
6098
   DT_TEXTREL tag.  */
6099
0
      if (MIPS_ELF_READONLY_SECTION (input_section))
6100
0
  info->flags |= DF_TEXTREL;
6101
6102
0
      *valuep = 0;
6103
0
      return bfd_reloc_ok;
6104
0
    }
6105
6106
  /* Figure out what kind of relocation is being performed.  */
6107
0
  switch (r_type)
6108
0
    {
6109
0
    case R_MIPS_NONE:
6110
0
      return bfd_reloc_continue;
6111
6112
0
    case R_MIPS_16:
6113
0
      if (howto->partial_inplace)
6114
0
  addend = _bfd_mips_elf_sign_extend (addend, 16);
6115
0
      value = symbol + addend;
6116
0
      overflowed_p = mips_elf_overflow_p (value, 16);
6117
0
      break;
6118
6119
0
    case R_MIPS_32:
6120
0
    case R_MIPS_REL32:
6121
0
    case R_MIPS_64:
6122
0
      if ((bfd_link_pic (info)
6123
0
     || (htab->root.dynamic_sections_created
6124
0
         && h != NULL
6125
0
         && h->root.def_dynamic
6126
0
         && !h->root.def_regular
6127
0
         && !h->has_static_relocs))
6128
0
    && r_symndx != STN_UNDEF
6129
0
    && (h == NULL
6130
0
        || h->root.root.type != bfd_link_hash_undefweak
6131
0
        || (ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT
6132
0
      && !resolved_to_zero))
6133
0
    && (input_section->flags & SEC_ALLOC) != 0)
6134
0
  {
6135
    /* If we're creating a shared library, then we can't know
6136
       where the symbol will end up.  So, we create a relocation
6137
       record in the output, and leave the job up to the dynamic
6138
       linker.  We must do the same for executable references to
6139
       shared library symbols, unless we've decided to use copy
6140
       relocs or PLTs instead.  */
6141
0
    value = addend;
6142
0
    if (!mips_elf_create_dynamic_relocation (abfd,
6143
0
               info,
6144
0
               relocation,
6145
0
               h,
6146
0
               sec,
6147
0
               symbol,
6148
0
               &value,
6149
0
               input_section))
6150
0
      return bfd_reloc_undefined;
6151
0
  }
6152
0
      else
6153
0
  {
6154
0
    if (r_type != R_MIPS_REL32)
6155
0
      value = symbol + addend;
6156
0
    else
6157
0
      value = addend;
6158
0
  }
6159
0
      value &= howto->dst_mask;
6160
0
      break;
6161
6162
0
    case R_MIPS_PC32:
6163
0
      value = symbol + addend - p;
6164
0
      value &= howto->dst_mask;
6165
0
      break;
6166
6167
0
    case R_MIPS16_26:
6168
      /* The calculation for R_MIPS16_26 is just the same as for an
6169
   R_MIPS_26.  It's only the storage of the relocated field into
6170
   the output file that's different.  That's handled in
6171
   mips_elf_perform_relocation.  So, we just fall through to the
6172
   R_MIPS_26 case here.  */
6173
0
    case R_MIPS_26:
6174
0
    case R_MICROMIPS_26_S1:
6175
0
      {
6176
0
  unsigned int shift;
6177
6178
  /* Shift is 2, unusually, for microMIPS JALX.  */
6179
0
  shift = (!*cross_mode_jump_p && r_type == R_MICROMIPS_26_S1) ? 1 : 2;
6180
6181
0
  if (howto->partial_inplace && !section_p)
6182
0
    value = _bfd_mips_elf_sign_extend (addend, 26 + shift);
6183
0
  else
6184
0
    value = addend;
6185
0
  value += symbol;
6186
6187
  /* Make sure the target of a jump is suitably aligned.  Bit 0 must
6188
     be the correct ISA mode selector except for weak undefined
6189
     symbols.  */
6190
0
  if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6191
0
      && (*cross_mode_jump_p
6192
0
    ? (value & 3) != (r_type == R_MIPS_26)
6193
0
    : (value & ((1 << shift) - 1)) != (r_type != R_MIPS_26)))
6194
0
    return bfd_reloc_outofrange;
6195
6196
0
  value >>= shift;
6197
0
  if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6198
0
    overflowed_p = (value >> 26) != ((p + 4) >> (26 + shift));
6199
0
  value &= howto->dst_mask;
6200
0
      }
6201
0
      break;
6202
6203
0
    case R_MIPS_TLS_DTPREL_HI16:
6204
0
    case R_MIPS16_TLS_DTPREL_HI16:
6205
0
    case R_MICROMIPS_TLS_DTPREL_HI16:
6206
0
      value = (mips_elf_high (addend + symbol - dtprel_base (info))
6207
0
         & howto->dst_mask);
6208
0
      break;
6209
6210
0
    case R_MIPS_TLS_DTPREL_LO16:
6211
0
    case R_MIPS_TLS_DTPREL32:
6212
0
    case R_MIPS_TLS_DTPREL64:
6213
0
    case R_MIPS16_TLS_DTPREL_LO16:
6214
0
    case R_MICROMIPS_TLS_DTPREL_LO16:
6215
0
      value = (symbol + addend - dtprel_base (info)) & howto->dst_mask;
6216
0
      break;
6217
6218
0
    case R_MIPS_TLS_TPREL_HI16:
6219
0
    case R_MIPS16_TLS_TPREL_HI16:
6220
0
    case R_MICROMIPS_TLS_TPREL_HI16:
6221
0
      value = (mips_elf_high (addend + symbol - tprel_base (info))
6222
0
         & howto->dst_mask);
6223
0
      break;
6224
6225
0
    case R_MIPS_TLS_TPREL_LO16:
6226
0
    case R_MIPS_TLS_TPREL32:
6227
0
    case R_MIPS_TLS_TPREL64:
6228
0
    case R_MIPS16_TLS_TPREL_LO16:
6229
0
    case R_MICROMIPS_TLS_TPREL_LO16:
6230
0
      value = (symbol + addend - tprel_base (info)) & howto->dst_mask;
6231
0
      break;
6232
6233
0
    case R_MIPS_HI16:
6234
0
    case R_MIPS16_HI16:
6235
0
    case R_MICROMIPS_HI16:
6236
0
      if (!gp_disp_p)
6237
0
  {
6238
0
    value = mips_elf_high (addend + symbol);
6239
0
    value &= howto->dst_mask;
6240
0
  }
6241
0
      else
6242
0
  {
6243
    /* For MIPS16 ABI code we generate this sequence
6244
    0: li      $v0,%hi(_gp_disp)
6245
    4: addiupc $v1,%lo(_gp_disp)
6246
    8: sll     $v0,16
6247
         12: addu    $v0,$v1
6248
         14: move    $gp,$v0
6249
       So the offsets of hi and lo relocs are the same, but the
6250
       base $pc is that used by the ADDIUPC instruction at $t9 + 4.
6251
       ADDIUPC clears the low two bits of the instruction address,
6252
       so the base is ($t9 + 4) & ~3.  */
6253
0
    if (r_type == R_MIPS16_HI16)
6254
0
      value = mips_elf_high (addend + gp - ((p + 4) & ~(bfd_vma) 0x3));
6255
    /* The microMIPS .cpload sequence uses the same assembly
6256
       instructions as the traditional psABI version, but the
6257
       incoming $t9 has the low bit set.  */
6258
0
    else if (r_type == R_MICROMIPS_HI16)
6259
0
      value = mips_elf_high (addend + gp - p - 1);
6260
0
    else
6261
0
      value = mips_elf_high (addend + gp - p);
6262
0
  }
6263
0
      break;
6264
6265
0
    case R_MIPS_LO16:
6266
0
    case R_MIPS16_LO16:
6267
0
    case R_MICROMIPS_LO16:
6268
0
    case R_MICROMIPS_HI0_LO16:
6269
0
      if (!gp_disp_p)
6270
0
  value = (symbol + addend) & howto->dst_mask;
6271
0
      else
6272
0
  {
6273
    /* See the comment for R_MIPS16_HI16 above for the reason
6274
       for this conditional.  */
6275
0
    if (r_type == R_MIPS16_LO16)
6276
0
      value = addend + gp - (p & ~(bfd_vma) 0x3);
6277
0
    else if (r_type == R_MICROMIPS_LO16
6278
0
       || r_type == R_MICROMIPS_HI0_LO16)
6279
0
      value = addend + gp - p + 3;
6280
0
    else
6281
0
      value = addend + gp - p + 4;
6282
    /* The MIPS ABI requires checking the R_MIPS_LO16 relocation
6283
       for overflow.  But, on, say, IRIX5, relocations against
6284
       _gp_disp are normally generated from the .cpload
6285
       pseudo-op.  It generates code that normally looks like
6286
       this:
6287
6288
         lui    $gp,%hi(_gp_disp)
6289
         addiu  $gp,$gp,%lo(_gp_disp)
6290
         addu   $gp,$gp,$t9
6291
6292
       Here $t9 holds the address of the function being called,
6293
       as required by the MIPS ELF ABI.  The R_MIPS_LO16
6294
       relocation can easily overflow in this situation, but the
6295
       R_MIPS_HI16 relocation will handle the overflow.
6296
       Therefore, we consider this a bug in the MIPS ABI, and do
6297
       not check for overflow here.  */
6298
0
  }
6299
0
      break;
6300
6301
0
    case R_MIPS_LITERAL:
6302
0
    case R_MICROMIPS_LITERAL:
6303
      /* Because we don't merge literal sections, we can handle this
6304
   just like R_MIPS_GPREL16.  In the long run, we should merge
6305
   shared literals, and then we will need to additional work
6306
   here.  */
6307
6308
      /* Fall through.  */
6309
6310
0
    case R_MIPS16_GPREL:
6311
      /* The R_MIPS16_GPREL performs the same calculation as
6312
   R_MIPS_GPREL16, but stores the relocated bits in a different
6313
   order.  We don't need to do anything special here; the
6314
   differences are handled in mips_elf_perform_relocation.  */
6315
0
    case R_MIPS_GPREL16:
6316
0
    case R_MICROMIPS_GPREL7_S2:
6317
0
    case R_MICROMIPS_GPREL16:
6318
0
      {
6319
0
  int bits = howto->bitsize + howto->rightshift;
6320
  /* Only sign-extend the addend if it was extracted from the
6321
     instruction.  If the addend was separate, leave it alone,
6322
     otherwise we may lose significant bits.  */
6323
0
  if (howto->partial_inplace)
6324
0
    addend = _bfd_mips_elf_sign_extend (addend, bits);
6325
0
  value = symbol + addend - gp;
6326
  /* If the symbol was local, any earlier relocatable links will
6327
     have adjusted its addend with the gp offset, so compensate
6328
     for that now.  Don't do it for symbols forced local in this
6329
     link, though, since they won't have had the gp offset applied
6330
     to them before.  */
6331
0
  if (was_local_p)
6332
0
    value += gp0;
6333
0
  if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6334
0
    overflowed_p = mips_elf_overflow_p (value, bits);
6335
0
      }
6336
0
      break;
6337
6338
0
    case R_MIPS16_GOT16:
6339
0
    case R_MIPS16_CALL16:
6340
0
    case R_MIPS_GOT16:
6341
0
    case R_MIPS_CALL16:
6342
0
    case R_MICROMIPS_GOT16:
6343
0
    case R_MICROMIPS_CALL16:
6344
      /* VxWorks does not have separate local and global semantics for
6345
   R_MIPS*_GOT16; every relocation evaluates to "G".  */
6346
0
      if (htab->root.target_os != is_vxworks && local_p)
6347
0
  {
6348
0
    value = mips_elf_got16_entry (abfd, input_bfd, info,
6349
0
          symbol + addend, !was_local_p);
6350
0
    if (value == MINUS_ONE)
6351
0
      return bfd_reloc_outofrange;
6352
0
    value
6353
0
      = mips_elf_got_offset_from_index (info, abfd, input_bfd, value);
6354
0
    overflowed_p = mips_elf_overflow_p (value, 16);
6355
0
    break;
6356
0
  }
6357
6358
      /* Fall through.  */
6359
6360
0
    case R_MIPS_TLS_GD:
6361
0
    case R_MIPS_TLS_GOTTPREL:
6362
0
    case R_MIPS_TLS_LDM:
6363
0
    case R_MIPS_GOT_DISP:
6364
0
    case R_MIPS16_TLS_GD:
6365
0
    case R_MIPS16_TLS_GOTTPREL:
6366
0
    case R_MIPS16_TLS_LDM:
6367
0
    case R_MICROMIPS_TLS_GD:
6368
0
    case R_MICROMIPS_TLS_GOTTPREL:
6369
0
    case R_MICROMIPS_TLS_LDM:
6370
0
    case R_MICROMIPS_GOT_DISP:
6371
0
      value = g;
6372
0
      overflowed_p = mips_elf_overflow_p (value, 16);
6373
0
      break;
6374
6375
0
    case R_MIPS_GPREL32:
6376
0
      value = (addend + symbol + gp0 - gp);
6377
0
      if (!save_addend)
6378
0
  value &= howto->dst_mask;
6379
0
      break;
6380
6381
0
    case R_MIPS_PC16:
6382
0
    case R_MIPS_GNU_REL16_S2:
6383
0
      if (howto->partial_inplace)
6384
0
  addend = _bfd_mips_elf_sign_extend (addend, 18);
6385
6386
      /* No need to exclude weak undefined symbols here as they resolve
6387
   to 0 and never set `*cross_mode_jump_p', so this alignment check
6388
   will never trigger for them.  */
6389
0
      if (*cross_mode_jump_p
6390
0
    ? ((symbol + addend) & 3) != 1
6391
0
    : ((symbol + addend) & 3) != 0)
6392
0
  return bfd_reloc_outofrange;
6393
6394
0
      value = symbol + addend - p;
6395
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6396
0
  overflowed_p = mips_elf_overflow_p (value, 18);
6397
0
      value >>= howto->rightshift;
6398
0
      value &= howto->dst_mask;
6399
0
      break;
6400
6401
0
    case R_MIPS16_PC16_S1:
6402
0
      if (howto->partial_inplace)
6403
0
  addend = _bfd_mips_elf_sign_extend (addend, 17);
6404
6405
0
      if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6406
0
    && (*cross_mode_jump_p
6407
0
        ? ((symbol + addend) & 3) != 0
6408
0
        : ((symbol + addend) & 1) == 0))
6409
0
  return bfd_reloc_outofrange;
6410
6411
0
      value = symbol + addend - p;
6412
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6413
0
  overflowed_p = mips_elf_overflow_p (value, 17);
6414
0
      value >>= howto->rightshift;
6415
0
      value &= howto->dst_mask;
6416
0
      break;
6417
6418
0
    case R_MIPS_PC21_S2:
6419
0
      if (howto->partial_inplace)
6420
0
  addend = _bfd_mips_elf_sign_extend (addend, 23);
6421
6422
0
      if ((symbol + addend) & 3)
6423
0
  return bfd_reloc_outofrange;
6424
6425
0
      value = symbol + addend - p;
6426
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6427
0
  overflowed_p = mips_elf_overflow_p (value, 23);
6428
0
      value >>= howto->rightshift;
6429
0
      value &= howto->dst_mask;
6430
0
      break;
6431
6432
0
    case R_MIPS_PC26_S2:
6433
0
      if (howto->partial_inplace)
6434
0
  addend = _bfd_mips_elf_sign_extend (addend, 28);
6435
6436
0
      if ((symbol + addend) & 3)
6437
0
  return bfd_reloc_outofrange;
6438
6439
0
      value = symbol + addend - p;
6440
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6441
0
  overflowed_p = mips_elf_overflow_p (value, 28);
6442
0
      value >>= howto->rightshift;
6443
0
      value &= howto->dst_mask;
6444
0
      break;
6445
6446
0
    case R_MIPS_PC18_S3:
6447
0
      if (howto->partial_inplace)
6448
0
  addend = _bfd_mips_elf_sign_extend (addend, 21);
6449
6450
0
      if ((symbol + addend) & 7)
6451
0
  return bfd_reloc_outofrange;
6452
6453
0
      value = symbol + addend - ((p | 7) ^ 7);
6454
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6455
0
  overflowed_p = mips_elf_overflow_p (value, 21);
6456
0
      value >>= howto->rightshift;
6457
0
      value &= howto->dst_mask;
6458
0
      break;
6459
6460
0
    case R_MIPS_PC19_S2:
6461
0
      if (howto->partial_inplace)
6462
0
  addend = _bfd_mips_elf_sign_extend (addend, 21);
6463
6464
0
      if ((symbol + addend) & 3)
6465
0
  return bfd_reloc_outofrange;
6466
6467
0
      value = symbol + addend - p;
6468
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6469
0
  overflowed_p = mips_elf_overflow_p (value, 21);
6470
0
      value >>= howto->rightshift;
6471
0
      value &= howto->dst_mask;
6472
0
      break;
6473
6474
0
    case R_MIPS_PCHI16:
6475
0
      value = mips_elf_high (symbol + addend - p);
6476
0
      value &= howto->dst_mask;
6477
0
      break;
6478
6479
0
    case R_MIPS_PCLO16:
6480
0
      if (howto->partial_inplace)
6481
0
  addend = _bfd_mips_elf_sign_extend (addend, 16);
6482
0
      value = symbol + addend - p;
6483
0
      value &= howto->dst_mask;
6484
0
      break;
6485
6486
0
    case R_MICROMIPS_PC7_S1:
6487
0
      if (howto->partial_inplace)
6488
0
  addend = _bfd_mips_elf_sign_extend (addend, 8);
6489
6490
0
      if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6491
0
    && (*cross_mode_jump_p
6492
0
        ? ((symbol + addend + 2) & 3) != 0
6493
0
        : ((symbol + addend + 2) & 1) == 0))
6494
0
  return bfd_reloc_outofrange;
6495
6496
0
      value = symbol + addend - p;
6497
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6498
0
  overflowed_p = mips_elf_overflow_p (value, 8);
6499
0
      value >>= howto->rightshift;
6500
0
      value &= howto->dst_mask;
6501
0
      break;
6502
6503
0
    case R_MICROMIPS_PC10_S1:
6504
0
      if (howto->partial_inplace)
6505
0
  addend = _bfd_mips_elf_sign_extend (addend, 11);
6506
6507
0
      if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6508
0
    && (*cross_mode_jump_p
6509
0
        ? ((symbol + addend + 2) & 3) != 0
6510
0
        : ((symbol + addend + 2) & 1) == 0))
6511
0
  return bfd_reloc_outofrange;
6512
6513
0
      value = symbol + addend - p;
6514
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6515
0
  overflowed_p = mips_elf_overflow_p (value, 11);
6516
0
      value >>= howto->rightshift;
6517
0
      value &= howto->dst_mask;
6518
0
      break;
6519
6520
0
    case R_MICROMIPS_PC16_S1:
6521
0
      if (howto->partial_inplace)
6522
0
  addend = _bfd_mips_elf_sign_extend (addend, 17);
6523
6524
0
      if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6525
0
    && (*cross_mode_jump_p
6526
0
        ? ((symbol + addend) & 3) != 0
6527
0
        : ((symbol + addend) & 1) == 0))
6528
0
  return bfd_reloc_outofrange;
6529
6530
0
      value = symbol + addend - p;
6531
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6532
0
  overflowed_p = mips_elf_overflow_p (value, 17);
6533
0
      value >>= howto->rightshift;
6534
0
      value &= howto->dst_mask;
6535
0
      break;
6536
6537
0
    case R_MICROMIPS_PC23_S2:
6538
0
      if (howto->partial_inplace)
6539
0
  addend = _bfd_mips_elf_sign_extend (addend, 25);
6540
0
      value = symbol + addend - ((p | 3) ^ 3);
6541
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6542
0
  overflowed_p = mips_elf_overflow_p (value, 25);
6543
0
      value >>= howto->rightshift;
6544
0
      value &= howto->dst_mask;
6545
0
      break;
6546
6547
0
    case R_MIPS_GOT_HI16:
6548
0
    case R_MIPS_CALL_HI16:
6549
0
    case R_MICROMIPS_GOT_HI16:
6550
0
    case R_MICROMIPS_CALL_HI16:
6551
      /* We're allowed to handle these two relocations identically.
6552
   The dynamic linker is allowed to handle the CALL relocations
6553
   differently by creating a lazy evaluation stub.  */
6554
0
      value = g;
6555
0
      value = mips_elf_high (value);
6556
0
      value &= howto->dst_mask;
6557
0
      break;
6558
6559
0
    case R_MIPS_GOT_LO16:
6560
0
    case R_MIPS_CALL_LO16:
6561
0
    case R_MICROMIPS_GOT_LO16:
6562
0
    case R_MICROMIPS_CALL_LO16:
6563
0
      value = g & howto->dst_mask;
6564
0
      break;
6565
6566
0
    case R_MIPS_GOT_PAGE:
6567
0
    case R_MICROMIPS_GOT_PAGE:
6568
0
      value = mips_elf_got_page (abfd, input_bfd, info, symbol + addend, NULL);
6569
0
      if (value == MINUS_ONE)
6570
0
  return bfd_reloc_outofrange;
6571
0
      value = mips_elf_got_offset_from_index (info, abfd, input_bfd, value);
6572
0
      overflowed_p = mips_elf_overflow_p (value, 16);
6573
0
      break;
6574
6575
0
    case R_MIPS_GOT_OFST:
6576
0
    case R_MICROMIPS_GOT_OFST:
6577
0
      if (local_p)
6578
0
  mips_elf_got_page (abfd, input_bfd, info, symbol + addend, &value);
6579
0
      else
6580
0
  value = addend;
6581
0
      overflowed_p = mips_elf_overflow_p (value, 16);
6582
0
      break;
6583
6584
0
    case R_MIPS_SUB:
6585
0
    case R_MICROMIPS_SUB:
6586
0
      value = symbol - addend;
6587
0
      value &= howto->dst_mask;
6588
0
      break;
6589
6590
0
    case R_MIPS_HIGHER:
6591
0
    case R_MICROMIPS_HIGHER:
6592
0
      value = mips_elf_higher (addend + symbol);
6593
0
      value &= howto->dst_mask;
6594
0
      break;
6595
6596
0
    case R_MIPS_HIGHEST:
6597
0
    case R_MICROMIPS_HIGHEST:
6598
0
      value = mips_elf_highest (addend + symbol);
6599
0
      value &= howto->dst_mask;
6600
0
      break;
6601
6602
0
    case R_MIPS_SCN_DISP:
6603
0
    case R_MICROMIPS_SCN_DISP:
6604
0
      value = symbol + addend - sec->output_offset;
6605
0
      value &= howto->dst_mask;
6606
0
      break;
6607
6608
0
    case R_MIPS_JALR:
6609
0
    case R_MICROMIPS_JALR:
6610
      /* This relocation is only a hint.  In some cases, we optimize
6611
   it into a bal instruction.  But we don't try to optimize
6612
   when the symbol does not resolve locally.  */
6613
0
      if (h != NULL && !SYMBOL_CALLS_LOCAL (info, &h->root))
6614
0
  return bfd_reloc_continue;
6615
      /* We can't optimize cross-mode jumps either.  */
6616
0
      if (*cross_mode_jump_p)
6617
0
  return bfd_reloc_continue;
6618
0
      value = symbol + addend;
6619
      /* Neither we can non-instruction-aligned targets.  */
6620
0
      if (r_type == R_MIPS_JALR ? (value & 3) != 0 : (value & 1) == 0)
6621
0
  return bfd_reloc_continue;
6622
0
      break;
6623
6624
0
    case R_MIPS_PJUMP:
6625
0
    case R_MIPS_GNU_VTINHERIT:
6626
0
    case R_MIPS_GNU_VTENTRY:
6627
      /* We don't do anything with these at present.  */
6628
0
      return bfd_reloc_continue;
6629
6630
0
    default:
6631
      /* An unrecognized relocation type.  */
6632
0
      return bfd_reloc_notsupported;
6633
0
    }
6634
6635
  /* Store the VALUE for our caller.  */
6636
0
  *valuep = value;
6637
0
  return overflowed_p ? bfd_reloc_overflow : bfd_reloc_ok;
6638
0
}
6639
6640
/* It has been determined that the result of the RELOCATION is the
6641
   VALUE.  Use HOWTO to place VALUE into the output file at the
6642
   appropriate position.  The SECTION is the section to which the
6643
   relocation applies.
6644
   CROSS_MODE_JUMP_P is true if the relocation field
6645
   is a MIPS16 or microMIPS jump to standard MIPS code, or vice versa.
6646
6647
   Returns FALSE if anything goes wrong.  */
6648
6649
static bool
6650
mips_elf_perform_relocation (struct bfd_link_info *info,
6651
           reloc_howto_type *howto,
6652
           const Elf_Internal_Rela *relocation,
6653
           bfd_vma value, bfd *input_bfd,
6654
           asection *input_section, bfd_byte *contents,
6655
           bool cross_mode_jump_p)
6656
0
{
6657
0
  bfd_vma x;
6658
0
  bfd_byte *location;
6659
0
  int r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
6660
6661
  /* Figure out where the relocation is occurring.  */
6662
0
  location = contents + relocation->r_offset;
6663
6664
0
  _bfd_mips_elf_reloc_unshuffle (input_bfd, r_type, false, location);
6665
6666
  /* Obtain the current value.  */
6667
0
  x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
6668
6669
  /* Clear the field we are setting.  */
6670
0
  x &= ~howto->dst_mask;
6671
6672
  /* Set the field.  */
6673
0
  x |= (value & howto->dst_mask);
6674
6675
  /* Detect incorrect JALX usage.  If required, turn JAL or BAL into JALX.  */
6676
0
  if (!cross_mode_jump_p && jal_reloc_p (r_type))
6677
0
    {
6678
0
      bfd_vma opcode = x >> 26;
6679
6680
0
      if (r_type == R_MIPS16_26 ? opcode == 0x7
6681
0
    : r_type == R_MICROMIPS_26_S1 ? opcode == 0x3c
6682
0
    : opcode == 0x1d)
6683
0
  {
6684
0
    info->callbacks->einfo
6685
0
      (_("%X%H: unsupported JALX to the same ISA mode\n"),
6686
0
       input_bfd, input_section, relocation->r_offset);
6687
0
    return true;
6688
0
  }
6689
0
    }
6690
0
  if (cross_mode_jump_p && jal_reloc_p (r_type))
6691
0
    {
6692
0
      bool ok;
6693
0
      bfd_vma opcode = x >> 26;
6694
0
      bfd_vma jalx_opcode;
6695
6696
      /* Check to see if the opcode is already JAL or JALX.  */
6697
0
      if (r_type == R_MIPS16_26)
6698
0
  {
6699
0
    ok = ((opcode == 0x6) || (opcode == 0x7));
6700
0
    jalx_opcode = 0x7;
6701
0
  }
6702
0
      else if (r_type == R_MICROMIPS_26_S1)
6703
0
  {
6704
0
    ok = ((opcode == 0x3d) || (opcode == 0x3c));
6705
0
    jalx_opcode = 0x3c;
6706
0
  }
6707
0
      else
6708
0
  {
6709
0
    ok = ((opcode == 0x3) || (opcode == 0x1d));
6710
0
    jalx_opcode = 0x1d;
6711
0
  }
6712
6713
      /* If the opcode is not JAL or JALX, there's a problem.  We cannot
6714
   convert J or JALS to JALX.  */
6715
0
      if (!ok)
6716
0
  {
6717
0
    info->callbacks->einfo
6718
0
      (_("%X%H: unsupported jump between ISA modes; "
6719
0
         "consider recompiling with interlinking enabled\n"),
6720
0
       input_bfd, input_section, relocation->r_offset);
6721
0
    return true;
6722
0
  }
6723
6724
      /* Make this the JALX opcode.  */
6725
0
      x = (x & ~(0x3fu << 26)) | (jalx_opcode << 26);
6726
0
    }
6727
0
  else if (cross_mode_jump_p && b_reloc_p (r_type))
6728
0
    {
6729
0
      bool ok = false;
6730
0
      bfd_vma opcode = x >> 16;
6731
0
      bfd_vma jalx_opcode = 0;
6732
0
      bfd_vma sign_bit = 0;
6733
0
      bfd_vma addr;
6734
0
      bfd_vma dest;
6735
6736
0
      if (r_type == R_MICROMIPS_PC16_S1)
6737
0
  {
6738
0
    ok = opcode == 0x4060;
6739
0
    jalx_opcode = 0x3c;
6740
0
    sign_bit = 0x10000;
6741
0
    value <<= 1;
6742
0
  }
6743
0
      else if (r_type == R_MIPS_PC16 || r_type == R_MIPS_GNU_REL16_S2)
6744
0
  {
6745
0
    ok = opcode == 0x411;
6746
0
    jalx_opcode = 0x1d;
6747
0
    sign_bit = 0x20000;
6748
0
    value <<= 2;
6749
0
  }
6750
6751
0
      if (ok && !bfd_link_pic (info))
6752
0
  {
6753
0
    addr = (input_section->output_section->vma
6754
0
      + input_section->output_offset
6755
0
      + relocation->r_offset
6756
0
      + 4);
6757
0
    dest = (addr
6758
0
      + (((value & ((sign_bit << 1) - 1)) ^ sign_bit) - sign_bit));
6759
6760
0
    if ((addr >> 28) << 28 != (dest >> 28) << 28)
6761
0
      {
6762
0
        info->callbacks->einfo
6763
0
    (_("%X%H: cannot convert branch between ISA modes "
6764
0
       "to JALX: relocation out of range\n"),
6765
0
     input_bfd, input_section, relocation->r_offset);
6766
0
        return true;
6767
0
      }
6768
6769
    /* Make this the JALX opcode.  */
6770
0
    x = ((dest >> 2) & 0x3ffffff) | jalx_opcode << 26;
6771
0
  }
6772
0
      else if (!mips_elf_hash_table (info)->ignore_branch_isa)
6773
0
  {
6774
0
    info->callbacks->einfo
6775
0
      (_("%X%H: unsupported branch between ISA modes\n"),
6776
0
       input_bfd, input_section, relocation->r_offset);
6777
0
    return true;
6778
0
  }
6779
0
    }
6780
6781
  /* Try converting JAL to BAL and J(AL)R to B(AL), if the target is in
6782
     range.  */
6783
0
  if (!bfd_link_relocatable (info)
6784
0
      && !cross_mode_jump_p
6785
0
      && ((JAL_TO_BAL_P (input_bfd)
6786
0
     && r_type == R_MIPS_26
6787
0
     && (x >> 26) == 0x3)     /* jal addr */
6788
0
    || (JALR_TO_BAL_P (input_bfd)
6789
0
        && r_type == R_MIPS_JALR
6790
0
        && x == 0x0320f809)   /* jalr t9 */
6791
0
    || (JR_TO_B_P (input_bfd)
6792
0
        && r_type == R_MIPS_JALR
6793
0
        && (x & ~1) == 0x03200008))) /* jr t9 / jalr zero, t9 */
6794
0
    {
6795
0
      bfd_vma addr;
6796
0
      bfd_vma dest;
6797
0
      bfd_signed_vma off;
6798
6799
0
      addr = (input_section->output_section->vma
6800
0
        + input_section->output_offset
6801
0
        + relocation->r_offset
6802
0
        + 4);
6803
0
      if (r_type == R_MIPS_26)
6804
0
  dest = (value << 2) | ((addr >> 28) << 28);
6805
0
      else
6806
0
  dest = value;
6807
0
      off = dest - addr;
6808
0
      if (off <= 0x1ffff && off >= -0x20000)
6809
0
  {
6810
0
    if ((x & ~1) == 0x03200008)   /* jr t9 / jalr zero, t9 */
6811
0
      x = 0x10000000 | (((bfd_vma) off >> 2) & 0xffff);   /* b addr */
6812
0
    else
6813
0
      x = 0x04110000 | (((bfd_vma) off >> 2) & 0xffff);   /* bal addr */
6814
0
  }
6815
0
    }
6816
6817
  /* Put the value into the output.  */
6818
0
  mips_elf_store_contents (howto, relocation, input_bfd, contents, x);
6819
6820
0
  _bfd_mips_elf_reloc_shuffle (input_bfd, r_type, !bfd_link_relocatable (info),
6821
0
             location);
6822
6823
0
  return true;
6824
0
}
6825

6826
/* Create a rel.dyn relocation for the dynamic linker to resolve.  REL
6827
   is the original relocation, which is now being transformed into a
6828
   dynamic relocation.  The ADDENDP is adjusted if necessary; the
6829
   caller should store the result in place of the original addend.  */
6830
6831
static bool
6832
mips_elf_create_dynamic_relocation (bfd *output_bfd,
6833
            struct bfd_link_info *info,
6834
            const Elf_Internal_Rela *rel,
6835
            struct mips_elf_link_hash_entry *h,
6836
            asection *sec, bfd_vma symbol,
6837
            bfd_vma *addendp, asection *input_section)
6838
0
{
6839
0
  Elf_Internal_Rela outrel[3];
6840
0
  asection *sreloc;
6841
0
  bfd *dynobj;
6842
0
  int r_type;
6843
0
  long indx;
6844
0
  bool defined_p;
6845
0
  struct mips_elf_link_hash_table *htab;
6846
6847
0
  htab = mips_elf_hash_table (info);
6848
0
  BFD_ASSERT (htab != NULL);
6849
6850
0
  r_type = ELF_R_TYPE (output_bfd, rel->r_info);
6851
0
  dynobj = elf_hash_table (info)->dynobj;
6852
0
  sreloc = mips_elf_rel_dyn_section (info, false);
6853
0
  BFD_ASSERT (sreloc != NULL);
6854
0
  BFD_ASSERT (sreloc->contents != NULL);
6855
0
  BFD_ASSERT (sreloc->reloc_count * MIPS_ELF_REL_SIZE (output_bfd)
6856
0
        < sreloc->size);
6857
6858
0
  outrel[0].r_offset =
6859
0
    _bfd_elf_section_offset (output_bfd, info, input_section, rel[0].r_offset);
6860
0
  if (ABI_64_P (output_bfd))
6861
0
    {
6862
0
      outrel[1].r_offset =
6863
0
  _bfd_elf_section_offset (output_bfd, info, input_section, rel[1].r_offset);
6864
0
      outrel[2].r_offset =
6865
0
  _bfd_elf_section_offset (output_bfd, info, input_section, rel[2].r_offset);
6866
0
    }
6867
6868
0
  if (outrel[0].r_offset == MINUS_ONE)
6869
    /* The relocation field has been deleted.  */
6870
0
    return true;
6871
6872
0
  if (outrel[0].r_offset == MINUS_TWO)
6873
0
    {
6874
      /* The relocation field has been converted into a relative value of
6875
   some sort.  Functions like _bfd_elf_write_section_eh_frame expect
6876
   the field to be fully relocated, so add in the symbol's value.  */
6877
0
      *addendp += symbol;
6878
0
      return true;
6879
0
    }
6880
6881
  /* We must now calculate the dynamic symbol table index to use
6882
     in the relocation.  */
6883
0
  if (h != NULL && ! SYMBOL_REFERENCES_LOCAL (info, &h->root))
6884
0
    {
6885
0
      BFD_ASSERT (htab->root.target_os == is_vxworks
6886
0
      || h->global_got_area != GGA_NONE);
6887
0
      indx = h->root.dynindx;
6888
0
      if (SGI_COMPAT (output_bfd))
6889
0
  defined_p = h->root.def_regular;
6890
0
      else
6891
  /* ??? glibc's ld.so just adds the final GOT entry to the
6892
     relocation field.  It therefore treats relocs against
6893
     defined symbols in the same way as relocs against
6894
     undefined symbols.  */
6895
0
  defined_p = false;
6896
0
    }
6897
0
  else
6898
0
    {
6899
0
      if (sec != NULL && bfd_is_abs_section (sec))
6900
0
  indx = 0;
6901
0
      else if (sec == NULL || sec->owner == NULL)
6902
0
  {
6903
0
    BFD_ASSERT (0);
6904
0
    bfd_set_error (bfd_error_bad_value);
6905
0
    return false;
6906
0
  }
6907
0
      else
6908
0
  {
6909
0
    indx = elf_section_data (sec->output_section)->dynindx;
6910
0
    if (indx == 0)
6911
0
      {
6912
0
        asection *osec = htab->root.text_index_section;
6913
0
        indx = elf_section_data (osec)->dynindx;
6914
0
      }
6915
0
    if (indx == 0)
6916
0
      abort ();
6917
0
  }
6918
6919
      /* Instead of generating a relocation using the section
6920
   symbol, we may as well make it a fully relative
6921
   relocation.  We want to avoid generating relocations to
6922
   local symbols because we used to generate them
6923
   incorrectly, without adding the original symbol value,
6924
   which is mandated by the ABI for section symbols.  In
6925
   order to give dynamic loaders and applications time to
6926
   phase out the incorrect use, we refrain from emitting
6927
   section-relative relocations.  It's not like they're
6928
   useful, after all.  This should be a bit more efficient
6929
   as well.  */
6930
      /* ??? Although this behavior is compatible with glibc's ld.so,
6931
   the ABI says that relocations against STN_UNDEF should have
6932
   a symbol value of 0.  Irix rld honors this, so relocations
6933
   against STN_UNDEF have no effect.  */
6934
0
      if (!SGI_COMPAT (output_bfd))
6935
0
  indx = 0;
6936
0
      defined_p = true;
6937
0
    }
6938
6939
  /* If the relocation was previously an absolute relocation and
6940
     this symbol will not be referred to by the relocation, we must
6941
     adjust it by the value we give it in the dynamic symbol table.
6942
     Otherwise leave the job up to the dynamic linker.  */
6943
0
  if (defined_p && r_type != R_MIPS_REL32)
6944
0
    *addendp += symbol;
6945
6946
0
  if (htab->root.target_os == is_vxworks)
6947
    /* VxWorks uses non-relative relocations for this.  */
6948
0
    outrel[0].r_info = ELF32_R_INFO (indx, R_MIPS_32);
6949
0
  else
6950
    /* The relocation is always an REL32 relocation because we don't
6951
       know where the shared library will wind up at load-time.  */
6952
0
    outrel[0].r_info = ELF_R_INFO (output_bfd, (unsigned long) indx,
6953
0
           R_MIPS_REL32);
6954
6955
  /* For strict adherence to the ABI specification, we should
6956
     generate a R_MIPS_64 relocation record by itself before the
6957
     _REL32/_64 record as well, such that the addend is read in as
6958
     a 64-bit value (REL32 is a 32-bit relocation, after all).
6959
     However, since none of the existing ELF64 MIPS dynamic
6960
     loaders seems to care, we don't waste space with these
6961
     artificial relocations.  If this turns out to not be true,
6962
     mips_elf_allocate_dynamic_relocation() should be tweaked so
6963
     as to make room for a pair of dynamic relocations per
6964
     invocation if ABI_64_P, and here we should generate an
6965
     additional relocation record with R_MIPS_64 by itself for a
6966
     NULL symbol before this relocation record.  */
6967
0
  outrel[1].r_info = ELF_R_INFO (output_bfd, 0,
6968
0
         ABI_64_P (output_bfd)
6969
0
         ? R_MIPS_64
6970
0
         : R_MIPS_NONE);
6971
0
  outrel[2].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_NONE);
6972
6973
  /* Adjust the output offset of the relocation to reference the
6974
     correct location in the output file.  */
6975
0
  outrel[0].r_offset += (input_section->output_section->vma
6976
0
       + input_section->output_offset);
6977
0
  outrel[1].r_offset += (input_section->output_section->vma
6978
0
       + input_section->output_offset);
6979
0
  outrel[2].r_offset += (input_section->output_section->vma
6980
0
       + input_section->output_offset);
6981
6982
  /* Put the relocation back out.  We have to use the special
6983
     relocation outputter in the 64-bit case since the 64-bit
6984
     relocation format is non-standard.  */
6985
0
  if (ABI_64_P (output_bfd))
6986
0
    {
6987
0
      (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
6988
0
  (output_bfd, &outrel[0],
6989
0
   (sreloc->contents
6990
0
    + sreloc->reloc_count * sizeof (Elf64_Mips_External_Rel)));
6991
0
    }
6992
0
  else if (htab->root.target_os == is_vxworks)
6993
0
    {
6994
      /* VxWorks uses RELA rather than REL dynamic relocations.  */
6995
0
      outrel[0].r_addend = *addendp;
6996
0
      bfd_elf32_swap_reloca_out
6997
0
  (output_bfd, &outrel[0],
6998
0
   (sreloc->contents
6999
0
    + sreloc->reloc_count * sizeof (Elf32_External_Rela)));
7000
0
    }
7001
0
  else
7002
0
    bfd_elf32_swap_reloc_out
7003
0
      (output_bfd, &outrel[0],
7004
0
       (sreloc->contents + sreloc->reloc_count * sizeof (Elf32_External_Rel)));
7005
7006
  /* We've now added another relocation.  */
7007
0
  ++sreloc->reloc_count;
7008
7009
  /* Make sure the output section is writable.  The dynamic linker
7010
     will be writing to it.  */
7011
0
  elf_section_data (input_section->output_section)->this_hdr.sh_flags
7012
0
    |= SHF_WRITE;
7013
7014
  /* On IRIX5, make an entry of compact relocation info.  */
7015
0
  if (IRIX_COMPAT (output_bfd) == ict_irix5)
7016
0
    {
7017
0
      asection *scpt = bfd_get_linker_section (dynobj, ".compact_rel");
7018
0
      bfd_byte *cr;
7019
7020
0
      if (scpt)
7021
0
  {
7022
0
    Elf32_crinfo cptrel;
7023
7024
0
    mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG);
7025
0
    cptrel.vaddr = (rel->r_offset
7026
0
        + input_section->output_section->vma
7027
0
        + input_section->output_offset);
7028
0
    if (r_type == R_MIPS_REL32)
7029
0
      mips_elf_set_cr_type (cptrel, CRT_MIPS_REL32);
7030
0
    else
7031
0
      mips_elf_set_cr_type (cptrel, CRT_MIPS_WORD);
7032
0
    mips_elf_set_cr_dist2to (cptrel, 0);
7033
0
    cptrel.konst = *addendp;
7034
7035
0
    cr = (scpt->contents
7036
0
    + sizeof (Elf32_External_compact_rel));
7037
0
    mips_elf_set_cr_relvaddr (cptrel, 0);
7038
0
    bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
7039
0
             ((Elf32_External_crinfo *) cr
7040
0
              + scpt->reloc_count));
7041
0
    ++scpt->reloc_count;
7042
0
  }
7043
0
    }
7044
7045
  /* If we've written this relocation for a readonly section,
7046
     we need to set DF_TEXTREL again, so that we do not delete the
7047
     DT_TEXTREL tag.  */
7048
0
  if (MIPS_ELF_READONLY_SECTION (input_section))
7049
0
    info->flags |= DF_TEXTREL;
7050
7051
0
  return true;
7052
0
}
7053

7054
/* Return the MACH for a MIPS e_flags value.  */
7055
7056
unsigned long
7057
_bfd_elf_mips_mach (flagword flags)
7058
8.30k
{
7059
8.30k
  switch (flags & EF_MIPS_MACH)
7060
8.30k
    {
7061
6
    case EF_MIPS_MACH_3900:
7062
6
      return bfd_mach_mips3900;
7063
7064
8
    case EF_MIPS_MACH_4010:
7065
8
      return bfd_mach_mips4010;
7066
7067
44
    case EF_MIPS_MACH_ALLEGREX:
7068
44
      return bfd_mach_mips_allegrex;
7069
7070
9
    case EF_MIPS_MACH_4100:
7071
9
      return bfd_mach_mips4100;
7072
7073
25
    case EF_MIPS_MACH_4111:
7074
25
      return bfd_mach_mips4111;
7075
7076
9
    case EF_MIPS_MACH_4120:
7077
9
      return bfd_mach_mips4120;
7078
7079
19
    case EF_MIPS_MACH_4650:
7080
19
      return bfd_mach_mips4650;
7081
7082
0
    case EF_MIPS_MACH_5400:
7083
0
      return bfd_mach_mips5400;
7084
7085
3
    case EF_MIPS_MACH_5500:
7086
3
      return bfd_mach_mips5500;
7087
7088
262
    case EF_MIPS_MACH_5900:
7089
262
      return bfd_mach_mips5900;
7090
7091
14
    case EF_MIPS_MACH_9000:
7092
14
      return bfd_mach_mips9000;
7093
7094
13
    case EF_MIPS_MACH_SB1:
7095
13
      return bfd_mach_mips_sb1;
7096
7097
0
    case EF_MIPS_MACH_LS2E:
7098
0
      return bfd_mach_mips_loongson_2e;
7099
7100
28
    case EF_MIPS_MACH_LS2F:
7101
28
      return bfd_mach_mips_loongson_2f;
7102
7103
8
    case EF_MIPS_MACH_GS464:
7104
8
      return bfd_mach_mips_gs464;
7105
7106
8
    case EF_MIPS_MACH_GS464E:
7107
8
      return bfd_mach_mips_gs464e;
7108
7109
31
    case EF_MIPS_MACH_GS264E:
7110
31
      return bfd_mach_mips_gs264e;
7111
7112
0
    case EF_MIPS_MACH_OCTEON3:
7113
0
      return bfd_mach_mips_octeon3;
7114
7115
20
    case EF_MIPS_MACH_OCTEON2:
7116
20
      return bfd_mach_mips_octeon2;
7117
7118
0
    case EF_MIPS_MACH_OCTEON:
7119
0
      return bfd_mach_mips_octeon;
7120
7121
8
    case EF_MIPS_MACH_XLR:
7122
8
      return bfd_mach_mips_xlr;
7123
7124
26
    case EF_MIPS_MACH_IAMR2:
7125
26
      return bfd_mach_mips_interaptiv_mr2;
7126
7127
7.76k
    default:
7128
7.76k
      switch (flags & EF_MIPS_ARCH)
7129
7.76k
  {
7130
571
  default:
7131
5.96k
  case EF_MIPS_ARCH_1:
7132
5.96k
    return bfd_mach_mips3000;
7133
7134
172
  case EF_MIPS_ARCH_2:
7135
172
    return bfd_mach_mips6000;
7136
7137
284
  case EF_MIPS_ARCH_3:
7138
284
    return bfd_mach_mips4000;
7139
7140
424
  case EF_MIPS_ARCH_4:
7141
424
    return bfd_mach_mips8000;
7142
7143
41
  case EF_MIPS_ARCH_5:
7144
41
    return bfd_mach_mips5;
7145
7146
93
  case EF_MIPS_ARCH_32:
7147
93
    return bfd_mach_mipsisa32;
7148
7149
75
  case EF_MIPS_ARCH_64:
7150
75
    return bfd_mach_mipsisa64;
7151
7152
52
  case EF_MIPS_ARCH_32R2:
7153
52
    return bfd_mach_mipsisa32r2;
7154
7155
41
  case EF_MIPS_ARCH_64R2:
7156
41
    return bfd_mach_mipsisa64r2;
7157
7158
468
  case EF_MIPS_ARCH_32R6:
7159
468
    return bfd_mach_mipsisa32r6;
7160
7161
154
  case EF_MIPS_ARCH_64R6:
7162
154
    return bfd_mach_mipsisa64r6;
7163
7.76k
  }
7164
8.30k
    }
7165
7166
0
  return 0;
7167
8.30k
}
7168
7169
/* Return printable name for ABI.  */
7170
7171
static inline char *
7172
elf_mips_abi_name (bfd *abfd)
7173
0
{
7174
0
  flagword flags;
7175
7176
0
  flags = elf_elfheader (abfd)->e_flags;
7177
0
  switch (flags & EF_MIPS_ABI)
7178
0
    {
7179
0
    case 0:
7180
0
      if (ABI_N32_P (abfd))
7181
0
  return "N32";
7182
0
      else if (ABI_64_P (abfd))
7183
0
  return "64";
7184
0
      else
7185
0
  return "none";
7186
0
    case EF_MIPS_ABI_O32:
7187
0
      return "O32";
7188
0
    case EF_MIPS_ABI_O64:
7189
0
      return "O64";
7190
0
    case EF_MIPS_ABI_EABI32:
7191
0
      return "EABI32";
7192
0
    case EF_MIPS_ABI_EABI64:
7193
0
      return "EABI64";
7194
0
    default:
7195
0
      return "unknown abi";
7196
0
    }
7197
0
}
7198

7199
/* MIPS ELF uses two common sections.  One is the usual one, and the
7200
   other is for small objects.  All the small objects are kept
7201
   together, and then referenced via the gp pointer, which yields
7202
   faster assembler code.  This is what we use for the small common
7203
   section.  This approach is copied from ecoff.c.  */
7204
static asection mips_elf_scom_section;
7205
static const asymbol mips_elf_scom_symbol =
7206
  GLOBAL_SYM_INIT (".scommon", &mips_elf_scom_section);
7207
static asection mips_elf_scom_section =
7208
  BFD_FAKE_SECTION (mips_elf_scom_section, &mips_elf_scom_symbol,
7209
        ".scommon", 0, SEC_IS_COMMON | SEC_SMALL_DATA);
7210
7211
/* MIPS ELF also uses an acommon section, which represents an
7212
   allocated common symbol which may be overridden by a
7213
   definition in a shared library.  */
7214
static asection mips_elf_acom_section;
7215
static const asymbol mips_elf_acom_symbol =
7216
  GLOBAL_SYM_INIT (".acommon", &mips_elf_acom_section);
7217
static asection mips_elf_acom_section =
7218
  BFD_FAKE_SECTION (mips_elf_acom_section, &mips_elf_acom_symbol,
7219
        ".acommon", 0, SEC_ALLOC);
7220
7221
/* This is used for both the 32-bit and the 64-bit ABI.  */
7222
7223
void
7224
_bfd_mips_elf_symbol_processing (bfd *abfd, asymbol *asym)
7225
8.96k
{
7226
8.96k
  elf_symbol_type *elfsym;
7227
7228
  /* Handle the special MIPS section numbers that a symbol may use.  */
7229
8.96k
  elfsym = (elf_symbol_type *) asym;
7230
8.96k
  switch (elfsym->internal_elf_sym.st_shndx)
7231
8.96k
    {
7232
23
    case SHN_MIPS_ACOMMON:
7233
      /* This section is used in a dynamically linked executable file.
7234
   It is an allocated common section.  The dynamic linker can
7235
   either resolve these symbols to something in a shared
7236
   library, or it can just leave them here.  For our purposes,
7237
   we can consider these symbols to be in a new section.  */
7238
23
      asym->section = &mips_elf_acom_section;
7239
23
      break;
7240
7241
21
    case SHN_COMMON:
7242
      /* Common symbols less than the GP size are automatically
7243
   treated as SHN_MIPS_SCOMMON symbols, with some exceptions.  */
7244
21
      if (asym->value > elf_gp_size (abfd)
7245
8
    || ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_TLS
7246
8
    || IRIX_COMPAT (abfd) == ict_irix6
7247
0
    || strcmp (asym->name, "__gnu_lto_slim") == 0)
7248
21
  break;
7249
      /* Fall through.  */
7250
14
    case SHN_MIPS_SCOMMON:
7251
14
      asym->section = &mips_elf_scom_section;
7252
14
      asym->value = elfsym->internal_elf_sym.st_size;
7253
14
      break;
7254
7255
4
    case SHN_MIPS_SUNDEFINED:
7256
4
      asym->section = bfd_und_section_ptr;
7257
4
      break;
7258
7259
4
    case SHN_MIPS_TEXT:
7260
4
      {
7261
4
  asection *section = bfd_get_section_by_name (abfd, ".text");
7262
7263
4
  if (section != NULL)
7264
1
    {
7265
1
      asym->section = section;
7266
      /* MIPS_TEXT is a bit special, the address is not an offset
7267
         to the base of the .text section.  So subtract the section
7268
         base address to make it an offset.  */
7269
1
      asym->value -= section->vma;
7270
1
    }
7271
4
      }
7272
4
      break;
7273
7274
28
    case SHN_MIPS_DATA:
7275
28
      {
7276
28
  asection *section = bfd_get_section_by_name (abfd, ".data");
7277
7278
28
  if (section != NULL)
7279
5
    {
7280
5
      asym->section = section;
7281
      /* MIPS_DATA is a bit special, the address is not an offset
7282
         to the base of the .data section.  So subtract the section
7283
         base address to make it an offset.  */
7284
5
      asym->value -= section->vma;
7285
5
    }
7286
28
      }
7287
28
      break;
7288
8.96k
    }
7289
7290
  /* If this is an odd-valued function symbol, assume it's a MIPS16
7291
     or microMIPS one.  */
7292
8.96k
  if (ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_FUNC
7293
388
      && (asym->value & 1) != 0)
7294
75
    {
7295
75
      asym->value--;
7296
75
      if (MICROMIPS_P (abfd))
7297
14
  elfsym->internal_elf_sym.st_other
7298
14
    = ELF_ST_SET_MICROMIPS (elfsym->internal_elf_sym.st_other);
7299
61
      else
7300
61
  elfsym->internal_elf_sym.st_other
7301
61
    = ELF_ST_SET_MIPS16 (elfsym->internal_elf_sym.st_other);
7302
75
    }
7303
8.96k
}
7304

7305
/* Implement elf_backend_eh_frame_address_size.  This differs from
7306
   the default in the way it handles EABI64.
7307
7308
   EABI64 was originally specified as an LP64 ABI, and that is what
7309
   -mabi=eabi normally gives on a 64-bit target.  However, gcc has
7310
   historically accepted the combination of -mabi=eabi and -mlong32,
7311
   and this ILP32 variation has become semi-official over time.
7312
   Both forms use elf32 and have pointer-sized FDE addresses.
7313
7314
   If an EABI object was generated by GCC 4.0 or above, it will have
7315
   an empty .gcc_compiled_longXX section, where XX is the size of longs
7316
   in bits.  Unfortunately, ILP32 objects generated by earlier compilers
7317
   have no special marking to distinguish them from LP64 objects.
7318
7319
   We don't want users of the official LP64 ABI to be punished for the
7320
   existence of the ILP32 variant, but at the same time, we don't want
7321
   to mistakenly interpret pre-4.0 ILP32 objects as being LP64 objects.
7322
   We therefore take the following approach:
7323
7324
      - If ABFD contains a .gcc_compiled_longXX section, use it to
7325
  determine the pointer size.
7326
7327
      - Otherwise check the type of the first relocation.  Assume that
7328
  the LP64 ABI is being used if the relocation is of type R_MIPS_64.
7329
7330
      - Otherwise punt.
7331
7332
   The second check is enough to detect LP64 objects generated by pre-4.0
7333
   compilers because, in the kind of output generated by those compilers,
7334
   the first relocation will be associated with either a CIE personality
7335
   routine or an FDE start address.  Furthermore, the compilers never
7336
   used a special (non-pointer) encoding for this ABI.
7337
7338
   Checking the relocation type should also be safe because there is no
7339
   reason to use R_MIPS_64 in an ILP32 object.  Pre-4.0 compilers never
7340
   did so.  */
7341
7342
unsigned int
7343
_bfd_mips_elf_eh_frame_address_size (bfd *abfd, const asection *sec)
7344
0
{
7345
0
  if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
7346
0
    return 8;
7347
0
  if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == EF_MIPS_ABI_EABI64)
7348
0
    {
7349
0
      bool long32_p, long64_p;
7350
7351
0
      long32_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long32") != 0;
7352
0
      long64_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long64") != 0;
7353
0
      if (long32_p && long64_p)
7354
0
  return 0;
7355
0
      if (long32_p)
7356
0
  return 4;
7357
0
      if (long64_p)
7358
0
  return 8;
7359
7360
0
      if (sec->reloc_count > 0)
7361
0
  {
7362
    /* Load the relocations for this section.  */
7363
0
    Elf_Internal_Rela *internal_relocs =
7364
0
      _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, true);
7365
0
    if (internal_relocs == NULL)
7366
0
      return 0;
7367
7368
0
    unsigned int size = 0;
7369
0
    if (ELF32_R_TYPE (internal_relocs[0].r_info) == R_MIPS_64)
7370
0
      size = 8;
7371
7372
0
    if (elf_section_data (sec)->relocs != internal_relocs)
7373
0
      free (internal_relocs);
7374
7375
0
    return size;
7376
0
  }
7377
7378
0
      return 0;
7379
0
    }
7380
0
  return 4;
7381
0
}
7382

7383
/* There appears to be a bug in the MIPSpro linker that causes GOT_DISP
7384
   relocations against two unnamed section symbols to resolve to the
7385
   same address.  For example, if we have code like:
7386
7387
  lw  $4,%got_disp(.data)($gp)
7388
  lw  $25,%got_disp(.text)($gp)
7389
  jalr  $25
7390
7391
   then the linker will resolve both relocations to .data and the program
7392
   will jump there rather than to .text.
7393
7394
   We can work around this problem by giving names to local section symbols.
7395
   This is also what the MIPSpro tools do.  */
7396
7397
bool
7398
_bfd_mips_elf_name_local_section_symbols (bfd *abfd)
7399
5
{
7400
5
  return elf_elfheader (abfd)->e_type == ET_REL && SGI_COMPAT (abfd);
7401
5
}
7402

7403
/* Work over a section just before writing it out.  This routine is
7404
   used by both the 32-bit and the 64-bit ABI.  FIXME: We recognize
7405
   sections that need the SHF_MIPS_GPREL flag by name; there has to be
7406
   a better way.  */
7407
7408
bool
7409
_bfd_mips_elf_section_processing (bfd *abfd, Elf_Internal_Shdr *hdr)
7410
224
{
7411
224
  if (hdr->sh_type == SHT_MIPS_REGINFO
7412
0
      && hdr->sh_size > 0)
7413
0
    {
7414
0
      bfd_byte buf[4];
7415
7416
0
      BFD_ASSERT (hdr->contents == NULL);
7417
7418
0
      if (hdr->sh_size != sizeof (Elf32_External_RegInfo))
7419
0
  {
7420
0
    _bfd_error_handler
7421
0
      (_("%pB: incorrect `.reginfo' section size; "
7422
0
         "expected %" PRIu64 ", got %" PRIu64),
7423
0
       abfd, (uint64_t) sizeof (Elf32_External_RegInfo),
7424
0
       (uint64_t) hdr->sh_size);
7425
0
    bfd_set_error (bfd_error_bad_value);
7426
0
    return false;
7427
0
  }
7428
7429
0
      if (bfd_seek (abfd,
7430
0
        hdr->sh_offset + sizeof (Elf32_External_RegInfo) - 4,
7431
0
        SEEK_SET) != 0)
7432
0
  return false;
7433
0
      H_PUT_32 (abfd, elf_gp (abfd), buf);
7434
0
      if (bfd_write (buf, 4, abfd) != 4)
7435
0
  return false;
7436
0
    }
7437
7438
224
  if (hdr->sh_type == SHT_MIPS_OPTIONS
7439
0
      && hdr->bfd_section != NULL
7440
0
      && mips_elf_section_data (hdr->bfd_section) != NULL
7441
0
      && mips_elf_section_data (hdr->bfd_section)->u.tdata != NULL)
7442
0
    {
7443
0
      bfd_byte *contents, *l, *lend;
7444
7445
      /* We stored the section contents in the tdata field in the
7446
   set_section_contents routine.  We save the section contents
7447
   so that we don't have to read them again.
7448
   At this point we know that elf_gp is set, so we can look
7449
   through the section contents to see if there is an
7450
   ODK_REGINFO structure.  */
7451
7452
0
      contents = mips_elf_section_data (hdr->bfd_section)->u.tdata;
7453
0
      l = contents;
7454
0
      lend = contents + hdr->sh_size;
7455
0
      while (l + sizeof (Elf_External_Options) <= lend)
7456
0
  {
7457
0
    Elf_Internal_Options intopt;
7458
7459
0
    bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
7460
0
          &intopt);
7461
0
    if (intopt.size < sizeof (Elf_External_Options))
7462
0
      {
7463
0
        _bfd_error_handler
7464
    /* xgettext:c-format */
7465
0
    (_("%pB: warning: bad `%s' option size %u smaller than"
7466
0
       " its header"),
7467
0
    abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd), intopt.size);
7468
0
        break;
7469
0
      }
7470
0
    if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
7471
0
      {
7472
0
        bfd_byte buf[8];
7473
7474
0
        if (bfd_seek (abfd,
7475
0
          (hdr->sh_offset
7476
0
           + (l - contents)
7477
0
           + sizeof (Elf_External_Options)
7478
0
           + (sizeof (Elf64_External_RegInfo) - 8)),
7479
0
           SEEK_SET) != 0)
7480
0
    return false;
7481
0
        H_PUT_64 (abfd, elf_gp (abfd), buf);
7482
0
        if (bfd_write (buf, 8, abfd) != 8)
7483
0
    return false;
7484
0
      }
7485
0
    else if (intopt.kind == ODK_REGINFO)
7486
0
      {
7487
0
        bfd_byte buf[4];
7488
7489
0
        if (bfd_seek (abfd,
7490
0
          (hdr->sh_offset
7491
0
           + (l - contents)
7492
0
           + sizeof (Elf_External_Options)
7493
0
           + (sizeof (Elf32_External_RegInfo) - 4)),
7494
0
          SEEK_SET) != 0)
7495
0
    return false;
7496
0
        H_PUT_32 (abfd, elf_gp (abfd), buf);
7497
0
        if (bfd_write (buf, 4, abfd) != 4)
7498
0
    return false;
7499
0
      }
7500
0
    l += intopt.size;
7501
0
  }
7502
0
    }
7503
7504
224
  if (hdr->bfd_section != NULL)
7505
127
    {
7506
127
      const char *name = bfd_section_name (hdr->bfd_section);
7507
7508
      /* .sbss is not handled specially here because the GNU/Linux
7509
   prelinker can convert .sbss from NOBITS to PROGBITS and
7510
   changing it back to NOBITS breaks the binary.  The entry in
7511
   _bfd_mips_elf_special_sections will ensure the correct flags
7512
   are set on .sbss if BFD creates it without reading it from an
7513
   input file, and without special handling here the flags set
7514
   on it in an input file will be followed.  */
7515
127
      if (strcmp (name, ".sdata") == 0
7516
127
    || strcmp (name, ".lit8") == 0
7517
127
    || strcmp (name, ".lit4") == 0)
7518
0
  hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
7519
127
      else if (strcmp (name, ".srdata") == 0)
7520
0
  hdr->sh_flags |= SHF_ALLOC | SHF_MIPS_GPREL;
7521
127
      else if (strcmp (name, ".compact_rel") == 0)
7522
0
  hdr->sh_flags = 0;
7523
127
      else if (strcmp (name, ".rtproc") == 0)
7524
0
  {
7525
0
    if (hdr->sh_addralign != 0 && hdr->sh_entsize == 0)
7526
0
      {
7527
0
        unsigned int adjust;
7528
7529
0
        adjust = hdr->sh_size % hdr->sh_addralign;
7530
0
        if (adjust != 0)
7531
0
    hdr->sh_size += hdr->sh_addralign - adjust;
7532
0
      }
7533
0
  }
7534
127
    }
7535
7536
224
  return true;
7537
224
}
7538
7539
/* Handle a MIPS specific section when reading an object file.  This
7540
   is called when elfcode.h finds a section with an unknown type.
7541
   This routine supports both the 32-bit and 64-bit ELF ABI.  */
7542
7543
bool
7544
_bfd_mips_elf_section_from_shdr (bfd *abfd,
7545
         Elf_Internal_Shdr *hdr,
7546
         const char *name,
7547
         int shindex)
7548
49.6k
{
7549
49.6k
  flagword flags = 0;
7550
7551
  /* There ought to be a place to keep ELF backend specific flags, but
7552
     at the moment there isn't one.  We just keep track of the
7553
     sections by their name, instead.  Fortunately, the ABI gives
7554
     suggested names for all the MIPS specific sections, so we will
7555
     probably get away with this.  */
7556
49.6k
  switch (hdr->sh_type)
7557
49.6k
    {
7558
70
    case SHT_MIPS_LIBLIST:
7559
70
      if (strcmp (name, ".liblist") != 0)
7560
70
  return false;
7561
0
      break;
7562
57
    case SHT_MIPS_MSYM:
7563
57
      if (strcmp (name, ".msym") != 0)
7564
57
  return false;
7565
0
      break;
7566
69
    case SHT_MIPS_CONFLICT:
7567
69
      if (strcmp (name, ".conflict") != 0)
7568
69
  return false;
7569
0
      break;
7570
72
    case SHT_MIPS_GPTAB:
7571
72
      if (! startswith (name, ".gptab."))
7572
61
  return false;
7573
11
      break;
7574
34
    case SHT_MIPS_UCODE:
7575
34
      if (strcmp (name, ".ucode") != 0)
7576
34
  return false;
7577
0
      break;
7578
55
    case SHT_MIPS_DEBUG:
7579
55
      if (strcmp (name, ".mdebug") != 0)
7580
38
  return false;
7581
17
      flags = SEC_DEBUGGING;
7582
17
      break;
7583
33
    case SHT_MIPS_REGINFO:
7584
33
      if (strcmp (name, ".reginfo") != 0
7585
0
    || hdr->sh_size != sizeof (Elf32_External_RegInfo))
7586
33
  return false;
7587
0
      flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
7588
0
      break;
7589
22
    case SHT_MIPS_IFACE:
7590
22
      if (strcmp (name, ".MIPS.interfaces") != 0)
7591
22
  return false;
7592
0
      break;
7593
77
    case SHT_MIPS_CONTENT:
7594
77
      if (! startswith (name, ".MIPS.content"))
7595
64
  return false;
7596
13
      break;
7597
275
    case SHT_MIPS_OPTIONS:
7598
275
      if (!MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
7599
101
  return false;
7600
174
      break;
7601
174
    case SHT_MIPS_ABIFLAGS:
7602
64
      if (!MIPS_ELF_ABIFLAGS_SECTION_NAME_P (name))
7603
64
  return false;
7604
0
      flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
7605
0
      break;
7606
283
    case SHT_MIPS_DWARF:
7607
283
      if (! startswith (name, ".debug_")
7608
257
         && ! startswith (name, ".gnu.debuglto_.debug_")
7609
243
         && ! startswith (name, ".zdebug_")
7610
231
         && ! startswith (name, ".gnu.debuglto_.zdebug_"))
7611
211
  return false;
7612
72
      break;
7613
72
    case SHT_MIPS_SYMBOL_LIB:
7614
21
      if (strcmp (name, ".MIPS.symlib") != 0)
7615
21
  return false;
7616
0
      break;
7617
60
    case SHT_MIPS_EVENTS:
7618
60
      if (! startswith (name, ".MIPS.events")
7619
50
    && ! startswith (name, ".MIPS.post_rel"))
7620
40
  return false;
7621
20
      break;
7622
41
    case SHT_MIPS_XHASH:
7623
41
      if (strcmp (name, ".MIPS.xhash") != 0)
7624
41
  return false;
7625
48.4k
    default:
7626
48.4k
      break;
7627
49.6k
    }
7628
7629
48.7k
  if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
7630
108
    return false;
7631
7632
48.6k
  if (hdr->sh_flags & SHF_MIPS_GPREL)
7633
10.7k
    flags |= SEC_SMALL_DATA;
7634
7635
48.6k
  if (flags)
7636
10.7k
    {
7637
10.7k
      if (!bfd_set_section_flags (hdr->bfd_section,
7638
10.7k
          (bfd_section_flags (hdr->bfd_section)
7639
10.7k
           | flags)))
7640
0
  return false;
7641
10.7k
    }
7642
7643
48.6k
  if (hdr->sh_type == SHT_MIPS_ABIFLAGS)
7644
0
    {
7645
0
      Elf_External_ABIFlags_v0 ext;
7646
7647
0
      if (! bfd_get_section_contents (abfd, hdr->bfd_section,
7648
0
              &ext, 0, sizeof ext))
7649
0
  return false;
7650
0
      bfd_mips_elf_swap_abiflags_v0_in (abfd, &ext,
7651
0
          &mips_elf_tdata (abfd)->abiflags);
7652
0
      if (mips_elf_tdata (abfd)->abiflags.version != 0)
7653
0
  return false;
7654
0
      mips_elf_tdata (abfd)->abiflags_valid = true;
7655
0
    }
7656
7657
  /* FIXME: We should record sh_info for a .gptab section.  */
7658
7659
  /* For a .reginfo section, set the gp value in the tdata information
7660
     from the contents of this section.  We need the gp value while
7661
     processing relocs, so we just get it now.  The .reginfo section
7662
     is not used in the 64-bit MIPS ELF ABI.  */
7663
48.6k
  if (hdr->sh_type == SHT_MIPS_REGINFO)
7664
0
    {
7665
0
      Elf32_External_RegInfo ext;
7666
0
      Elf32_RegInfo s;
7667
7668
0
      if (! bfd_get_section_contents (abfd, hdr->bfd_section,
7669
0
              &ext, 0, sizeof ext))
7670
0
  return false;
7671
0
      bfd_mips_elf32_swap_reginfo_in (abfd, &ext, &s);
7672
0
      elf_gp (abfd) = s.ri_gp_value;
7673
0
    }
7674
7675
  /* For a SHT_MIPS_OPTIONS section, look for a ODK_REGINFO entry, and
7676
     set the gp value based on what we find.  We may see both
7677
     SHT_MIPS_REGINFO and SHT_MIPS_OPTIONS/ODK_REGINFO; in that case,
7678
     they should agree.  */
7679
48.6k
  if (hdr->sh_type == SHT_MIPS_OPTIONS)
7680
174
    {
7681
174
      bfd_byte *contents, *l, *lend;
7682
7683
174
      if (!bfd_malloc_and_get_section (abfd, hdr->bfd_section, &contents))
7684
20
  {
7685
20
    free (contents);
7686
20
    return false;
7687
20
  }
7688
154
      l = contents;
7689
154
      lend = contents + hdr->sh_size;
7690
955
      while (l + sizeof (Elf_External_Options) <= lend)
7691
903
  {
7692
903
    Elf_Internal_Options intopt;
7693
7694
903
    bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
7695
903
          &intopt);
7696
903
    if (intopt.size < sizeof (Elf_External_Options))
7697
52
      {
7698
102
      bad_opt:
7699
102
        _bfd_error_handler
7700
    /* xgettext:c-format */
7701
102
    (_("%pB: warning: truncated `%s' option"),
7702
102
     abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd));
7703
102
        break;
7704
52
      }
7705
851
    if (intopt.kind == ODK_REGINFO)
7706
100
      {
7707
100
        if (ABI_64_P (abfd))
7708
100
    {
7709
100
      Elf64_Internal_RegInfo intreg;
7710
100
      size_t needed = (sizeof (Elf_External_Options)
7711
100
           + sizeof (Elf64_External_RegInfo));
7712
100
      if (intopt.size < needed || (size_t) (lend - l) < needed)
7713
50
        goto bad_opt;
7714
50
      bfd_mips_elf64_swap_reginfo_in
7715
50
        (abfd,
7716
50
         ((Elf64_External_RegInfo *)
7717
50
          (l + sizeof (Elf_External_Options))),
7718
50
         &intreg);
7719
50
      elf_gp (abfd) = intreg.ri_gp_value;
7720
50
    }
7721
0
        else
7722
0
    {
7723
0
      Elf32_RegInfo intreg;
7724
0
      size_t needed = (sizeof (Elf_External_Options)
7725
0
           + sizeof (Elf32_External_RegInfo));
7726
0
      if (intopt.size < needed || (size_t) (lend - l) < needed)
7727
0
        goto bad_opt;
7728
0
      bfd_mips_elf32_swap_reginfo_in
7729
0
        (abfd,
7730
0
         ((Elf32_External_RegInfo *)
7731
0
          (l + sizeof (Elf_External_Options))),
7732
0
         &intreg);
7733
0
      elf_gp (abfd) = intreg.ri_gp_value;
7734
0
    }
7735
100
      }
7736
801
    l += intopt.size;
7737
801
  }
7738
154
      free (contents);
7739
154
    }
7740
7741
48.6k
  return true;
7742
48.6k
}
7743
7744
/* Set the correct type for a MIPS ELF section.  We do this by the
7745
   section name, which is a hack, but ought to work.  This routine is
7746
   used by both the 32-bit and the 64-bit ABI.  */
7747
7748
bool
7749
_bfd_mips_elf_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
7750
130
{
7751
130
  const char *name = bfd_section_name (sec);
7752
7753
130
  if (strcmp (name, ".liblist") == 0)
7754
0
    {
7755
0
      hdr->sh_type = SHT_MIPS_LIBLIST;
7756
0
      hdr->sh_info = sec->size / sizeof (Elf32_Lib);
7757
      /* The sh_link field is set in final_write_processing.  */
7758
0
    }
7759
130
  else if (strcmp (name, ".conflict") == 0)
7760
0
    hdr->sh_type = SHT_MIPS_CONFLICT;
7761
130
  else if (startswith (name, ".gptab."))
7762
0
    {
7763
0
      hdr->sh_type = SHT_MIPS_GPTAB;
7764
0
      hdr->sh_entsize = sizeof (Elf32_External_gptab);
7765
      /* The sh_info field is set in final_write_processing.  */
7766
0
    }
7767
130
  else if (strcmp (name, ".ucode") == 0)
7768
0
    hdr->sh_type = SHT_MIPS_UCODE;
7769
130
  else if (strcmp (name, ".mdebug") == 0)
7770
0
    {
7771
0
      hdr->sh_type = SHT_MIPS_DEBUG;
7772
      /* In a shared object on IRIX 5.3, the .mdebug section has an
7773
   entsize of 0.  FIXME: Does this matter?  */
7774
0
      if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0)
7775
0
  hdr->sh_entsize = 0;
7776
0
      else
7777
0
  hdr->sh_entsize = 1;
7778
0
    }
7779
130
  else if (strcmp (name, ".reginfo") == 0)
7780
0
    {
7781
0
      hdr->sh_type = SHT_MIPS_REGINFO;
7782
      /* In a shared object on IRIX 5.3, the .reginfo section has an
7783
   entsize of 0x18.  FIXME: Does this matter?  */
7784
0
      if (SGI_COMPAT (abfd))
7785
0
  {
7786
0
    if ((abfd->flags & DYNAMIC) != 0)
7787
0
      hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
7788
0
    else
7789
0
      hdr->sh_entsize = 1;
7790
0
  }
7791
0
      else
7792
0
  hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
7793
0
    }
7794
130
  else if (SGI_COMPAT (abfd)
7795
111
     && (strcmp (name, ".hash") == 0
7796
111
         || strcmp (name, ".dynamic") == 0
7797
111
         || strcmp (name, ".dynstr") == 0))
7798
0
    {
7799
0
      if (SGI_COMPAT (abfd))
7800
0
  hdr->sh_entsize = 0;
7801
#if 0
7802
      /* This isn't how the IRIX6 linker behaves.  */
7803
      hdr->sh_info = SIZEOF_MIPS_DYNSYM_SECNAMES;
7804
#endif
7805
0
    }
7806
130
  else if (strcmp (name, ".got") == 0
7807
130
     || strcmp (name, ".srdata") == 0
7808
130
     || strcmp (name, ".sdata") == 0
7809
130
     || strcmp (name, ".sbss") == 0
7810
130
     || strcmp (name, ".lit4") == 0
7811
130
     || strcmp (name, ".lit8") == 0)
7812
0
    hdr->sh_flags |= SHF_MIPS_GPREL;
7813
130
  else if (strcmp (name, ".MIPS.interfaces") == 0)
7814
0
    {
7815
0
      hdr->sh_type = SHT_MIPS_IFACE;
7816
0
      hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7817
0
    }
7818
130
  else if (startswith (name, ".MIPS.content"))
7819
0
    {
7820
0
      hdr->sh_type = SHT_MIPS_CONTENT;
7821
0
      hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7822
      /* The sh_info field is set in final_write_processing.  */
7823
0
    }
7824
130
  else if (MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
7825
0
    {
7826
0
      hdr->sh_type = SHT_MIPS_OPTIONS;
7827
0
      hdr->sh_entsize = 1;
7828
0
      hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7829
0
    }
7830
130
  else if (startswith (name, ".MIPS.abiflags"))
7831
0
    {
7832
0
      hdr->sh_type = SHT_MIPS_ABIFLAGS;
7833
0
      hdr->sh_entsize = sizeof (Elf_External_ABIFlags_v0);
7834
0
    }
7835
130
  else if (startswith (name, ".debug_")
7836
126
     || startswith (name, ".gnu.debuglto_.debug_")
7837
126
     || startswith (name, ".zdebug_")
7838
126
     || startswith (name, ".gnu.debuglto_.zdebug_"))
7839
4
    {
7840
4
      hdr->sh_type = SHT_MIPS_DWARF;
7841
7842
      /* Irix facilities such as libexc expect a single .debug_frame
7843
   per executable, the system ones have NOSTRIP set and the linker
7844
   doesn't merge sections with different flags so ...  */
7845
4
      if (SGI_COMPAT (abfd) && startswith (name, ".debug_frame"))
7846
0
  hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7847
4
    }
7848
126
  else if (strcmp (name, ".MIPS.symlib") == 0)
7849
0
    {
7850
0
      hdr->sh_type = SHT_MIPS_SYMBOL_LIB;
7851
      /* The sh_link and sh_info fields are set in
7852
   final_write_processing.  */
7853
0
    }
7854
126
  else if (startswith (name, ".MIPS.events")
7855
126
     || startswith (name, ".MIPS.post_rel"))
7856
0
    {
7857
0
      hdr->sh_type = SHT_MIPS_EVENTS;
7858
0
      hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7859
      /* The sh_link field is set in final_write_processing.  */
7860
0
    }
7861
126
  else if (strcmp (name, ".msym") == 0)
7862
0
    {
7863
0
      hdr->sh_type = SHT_MIPS_MSYM;
7864
0
      hdr->sh_flags |= SHF_ALLOC;
7865
0
      hdr->sh_entsize = 8;
7866
0
    }
7867
126
  else if (strcmp (name, ".MIPS.xhash") == 0)
7868
0
    {
7869
0
      hdr->sh_type = SHT_MIPS_XHASH;
7870
0
      hdr->sh_flags |= SHF_ALLOC;
7871
0
      hdr->sh_entsize = get_elf_backend_data(abfd)->s->arch_size == 64 ? 0 : 4;
7872
0
    }
7873
7874
  /* The generic elf_fake_sections will set up REL_HDR using the default
7875
   kind of relocations.  We used to set up a second header for the
7876
   non-default kind of relocations here, but only NewABI would use
7877
   these, and the IRIX ld doesn't like resulting empty RELA sections.
7878
   Thus we create those header only on demand now.  */
7879
7880
130
  return true;
7881
130
}
7882
7883
/* Given a BFD section, try to locate the corresponding ELF section
7884
   index.  This is used by both the 32-bit and the 64-bit ABI.
7885
   Actually, it's not clear to me that the 64-bit ABI supports these,
7886
   but for non-PIC objects we will certainly want support for at least
7887
   the .scommon section.  */
7888
7889
bool
7890
_bfd_mips_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
7891
          asection *sec, int *retval)
7892
20
{
7893
20
  if (strcmp (bfd_section_name (sec), ".scommon") == 0)
7894
1
    {
7895
1
      *retval = SHN_MIPS_SCOMMON;
7896
1
      return true;
7897
1
    }
7898
19
  if (strcmp (bfd_section_name (sec), ".acommon") == 0)
7899
1
    {
7900
1
      *retval = SHN_MIPS_ACOMMON;
7901
1
      return true;
7902
1
    }
7903
18
  return false;
7904
19
}
7905

7906
/* Hook called by the linker routine which adds symbols from an object
7907
   file.  We must handle the special MIPS section numbers here.  */
7908
7909
bool
7910
_bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
7911
             Elf_Internal_Sym *sym, const char **namep,
7912
             flagword *flagsp ATTRIBUTE_UNUSED,
7913
             asection **secp, bfd_vma *valp)
7914
0
{
7915
0
  if (SGI_COMPAT (abfd)
7916
0
      && (abfd->flags & DYNAMIC) != 0
7917
0
      && strcmp (*namep, "_rld_new_interface") == 0)
7918
0
    {
7919
      /* Skip IRIX5 rld entry name.  */
7920
0
      *namep = NULL;
7921
0
      return true;
7922
0
    }
7923
7924
  /* Shared objects may have a dynamic symbol '_gp_disp' defined as
7925
     a SECTION *ABS*.  This causes ld to think it can resolve _gp_disp
7926
     by setting a DT_NEEDED for the shared object.  Since _gp_disp is
7927
     a magic symbol resolved by the linker, we ignore this bogus definition
7928
     of _gp_disp.  New ABI objects do not suffer from this problem so this
7929
     is not done for them. */
7930
0
  if (!NEWABI_P(abfd)
7931
0
      && (sym->st_shndx == SHN_ABS)
7932
0
      && (strcmp (*namep, "_gp_disp") == 0))
7933
0
    {
7934
0
      *namep = NULL;
7935
0
      return true;
7936
0
    }
7937
7938
0
  switch (sym->st_shndx)
7939
0
    {
7940
0
    case SHN_COMMON:
7941
      /* Common symbols less than the GP size are automatically
7942
   treated as SHN_MIPS_SCOMMON symbols, with some exceptions.  */
7943
0
      if (sym->st_size > elf_gp_size (abfd)
7944
0
    || ELF_ST_TYPE (sym->st_info) == STT_TLS
7945
0
    || IRIX_COMPAT (abfd) == ict_irix6
7946
0
    || strcmp (*namep, "__gnu_lto_slim") == 0)
7947
0
  break;
7948
      /* Fall through.  */
7949
0
    case SHN_MIPS_SCOMMON:
7950
0
      *secp = bfd_make_section_old_way (abfd, ".scommon");
7951
0
      (*secp)->flags |= SEC_IS_COMMON | SEC_SMALL_DATA;
7952
0
      *valp = sym->st_size;
7953
0
      break;
7954
7955
0
    case SHN_MIPS_TEXT:
7956
      /* This section is used in a shared object.  */
7957
0
      if (mips_elf_tdata (abfd)->elf_text_section == NULL)
7958
0
  {
7959
0
    asymbol *elf_text_symbol;
7960
0
    asection *elf_text_section;
7961
0
    size_t amt = sizeof (asection);
7962
7963
0
    elf_text_section = bfd_zalloc (abfd, amt);
7964
0
    if (elf_text_section == NULL)
7965
0
      return false;
7966
7967
0
    amt = sizeof (asymbol);
7968
0
    elf_text_symbol = bfd_zalloc (abfd, amt);
7969
0
    if (elf_text_symbol == NULL)
7970
0
      return false;
7971
7972
    /* Initialize the section.  */
7973
7974
0
    mips_elf_tdata (abfd)->elf_text_section = elf_text_section;
7975
7976
0
    elf_text_section->symbol = elf_text_symbol;
7977
0
    elf_text_section->name = ".text";
7978
0
    elf_text_section->flags = SEC_NO_FLAGS;
7979
0
    elf_text_section->output_section = NULL;
7980
0
    elf_text_section->owner = abfd;
7981
0
    elf_text_symbol->name = ".text";
7982
0
    elf_text_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
7983
0
    elf_text_symbol->section = elf_text_section;
7984
0
  }
7985
      /* This code used to do *secp = bfd_und_section_ptr if
7986
   bfd_link_pic (info).  I don't know why, and that doesn't make sense,
7987
   so I took it out.  */
7988
0
      *secp = mips_elf_tdata (abfd)->elf_text_section;
7989
0
      break;
7990
7991
0
    case SHN_MIPS_ACOMMON:
7992
      /* Fall through. XXX Can we treat this as allocated data?  */
7993
0
    case SHN_MIPS_DATA:
7994
      /* This section is used in a shared object.  */
7995
0
      if (mips_elf_tdata (abfd)->elf_data_section == NULL)
7996
0
  {
7997
0
    asymbol *elf_data_symbol;
7998
0
    asection *elf_data_section;
7999
0
    size_t amt = sizeof (asection);
8000
8001
0
    elf_data_section = bfd_zalloc (abfd, amt);
8002
0
    if (elf_data_section == NULL)
8003
0
      return false;
8004
8005
0
    amt = sizeof (asymbol);
8006
0
    elf_data_symbol = bfd_zalloc (abfd, amt);
8007
0
    if (elf_data_symbol == NULL)
8008
0
      return false;
8009
8010
    /* Initialize the section.  */
8011
8012
0
    mips_elf_tdata (abfd)->elf_data_section = elf_data_section;
8013
8014
0
    elf_data_section->symbol = elf_data_symbol;
8015
0
    elf_data_section->name = ".data";
8016
0
    elf_data_section->flags = SEC_NO_FLAGS;
8017
0
    elf_data_section->output_section = NULL;
8018
0
    elf_data_section->owner = abfd;
8019
0
    elf_data_symbol->name = ".data";
8020
0
    elf_data_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
8021
0
    elf_data_symbol->section = elf_data_section;
8022
0
  }
8023
      /* This code used to do *secp = bfd_und_section_ptr if
8024
   bfd_link_pic (info).  I don't know why, and that doesn't make sense,
8025
   so I took it out.  */
8026
0
      *secp = mips_elf_tdata (abfd)->elf_data_section;
8027
0
      break;
8028
8029
0
    case SHN_MIPS_SUNDEFINED:
8030
0
      *secp = bfd_und_section_ptr;
8031
0
      break;
8032
0
    }
8033
8034
0
  if (SGI_COMPAT (abfd)
8035
0
      && ! bfd_link_pic (info)
8036
0
      && info->output_bfd->xvec == abfd->xvec
8037
0
      && strcmp (*namep, "__rld_obj_head") == 0)
8038
0
    {
8039
0
      struct elf_link_hash_entry *h;
8040
0
      struct bfd_link_hash_entry *bh;
8041
8042
      /* Mark __rld_obj_head as dynamic.  */
8043
0
      bh = NULL;
8044
0
      if (! (_bfd_generic_link_add_one_symbol
8045
0
       (info, abfd, *namep, BSF_GLOBAL, *secp, *valp, NULL, false,
8046
0
        get_elf_backend_data (abfd)->collect, &bh)))
8047
0
  return false;
8048
8049
0
      h = (struct elf_link_hash_entry *) bh;
8050
0
      h->non_elf = 0;
8051
0
      h->def_regular = 1;
8052
0
      h->type = STT_OBJECT;
8053
8054
0
      if (! bfd_elf_link_record_dynamic_symbol (info, h))
8055
0
  return false;
8056
8057
0
      mips_elf_hash_table (info)->use_rld_obj_head = true;
8058
0
      mips_elf_hash_table (info)->rld_symbol = h;
8059
0
    }
8060
8061
  /* If this is a mips16 text symbol, add 1 to the value to make it
8062
     odd.  This will cause something like .word SYM to come up with
8063
     the right value when it is loaded into the PC.  */
8064
0
  if (ELF_ST_IS_COMPRESSED (sym->st_other))
8065
0
    ++*valp;
8066
8067
0
  return true;
8068
0
}
8069
8070
/* This hook function is called before the linker writes out a global
8071
   symbol.  We mark symbols as small common if appropriate.  This is
8072
   also where we undo the increment of the value for a mips16 symbol.  */
8073
8074
int
8075
_bfd_mips_elf_link_output_symbol_hook
8076
  (struct bfd_link_info *info ATTRIBUTE_UNUSED,
8077
   const char *name ATTRIBUTE_UNUSED, Elf_Internal_Sym *sym,
8078
   asection *input_sec, struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
8079
0
{
8080
  /* If we see a common symbol, which implies a relocatable link, then
8081
     if a symbol was small common in an input file, mark it as small
8082
     common in the output file.  */
8083
0
  if (sym->st_shndx == SHN_COMMON
8084
0
      && strcmp (input_sec->name, ".scommon") == 0)
8085
0
    sym->st_shndx = SHN_MIPS_SCOMMON;
8086
8087
0
  if (ELF_ST_IS_COMPRESSED (sym->st_other))
8088
0
    sym->st_value &= ~1;
8089
8090
0
  return 1;
8091
0
}
8092

8093
/* Functions for the dynamic linker.  */
8094
8095
/* Create dynamic sections when linking against a dynamic object.  */
8096
8097
bool
8098
_bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
8099
0
{
8100
0
  struct elf_link_hash_entry *h;
8101
0
  struct bfd_link_hash_entry *bh;
8102
0
  flagword flags;
8103
0
  register asection *s;
8104
0
  const char * const *namep;
8105
0
  struct mips_elf_link_hash_table *htab;
8106
8107
0
  htab = mips_elf_hash_table (info);
8108
0
  BFD_ASSERT (htab != NULL);
8109
8110
0
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
8111
0
     | SEC_LINKER_CREATED | SEC_READONLY);
8112
8113
  /* The psABI requires a read-only .dynamic section, but the VxWorks
8114
     EABI doesn't.  */
8115
0
  if (htab->root.target_os != is_vxworks)
8116
0
    {
8117
0
      s = bfd_get_linker_section (abfd, ".dynamic");
8118
0
      if (s != NULL)
8119
0
  {
8120
0
    if (!bfd_set_section_flags (s, flags))
8121
0
      return false;
8122
0
  }
8123
0
    }
8124
8125
  /* We need to create .got section.  */
8126
0
  if (!mips_elf_create_got_section (abfd, info))
8127
0
    return false;
8128
8129
0
  if (! mips_elf_rel_dyn_section (info, true))
8130
0
    return false;
8131
8132
  /* Create .stub section.  */
8133
0
  s = bfd_make_section_anyway_with_flags (abfd,
8134
0
            MIPS_ELF_STUB_SECTION_NAME (abfd),
8135
0
            flags | SEC_CODE);
8136
0
  if (s == NULL
8137
0
      || !bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd)))
8138
0
    return false;
8139
0
  htab->sstubs = s;
8140
8141
0
  if (!mips_elf_hash_table (info)->use_rld_obj_head
8142
0
      && bfd_link_executable (info)
8143
0
      && bfd_get_linker_section (abfd, ".rld_map") == NULL)
8144
0
    {
8145
0
      s = bfd_make_section_anyway_with_flags (abfd, ".rld_map",
8146
0
                flags &~ (flagword) SEC_READONLY);
8147
0
      if (s == NULL
8148
0
    || !bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd)))
8149
0
  return false;
8150
0
    }
8151
8152
  /* Create .MIPS.xhash section.  */
8153
0
  if (info->emit_gnu_hash)
8154
0
    s = bfd_make_section_anyway_with_flags (abfd, ".MIPS.xhash",
8155
0
              flags | SEC_READONLY);
8156
8157
  /* On IRIX5, we adjust add some additional symbols and change the
8158
     alignments of several sections.  There is no ABI documentation
8159
     indicating that this is necessary on IRIX6, nor any evidence that
8160
     the linker takes such action.  */
8161
0
  if (IRIX_COMPAT (abfd) == ict_irix5)
8162
0
    {
8163
0
      for (namep = mips_elf_dynsym_rtproc_names; *namep != NULL; namep++)
8164
0
  {
8165
0
    bh = NULL;
8166
0
    if (! (_bfd_generic_link_add_one_symbol
8167
0
     (info, abfd, *namep, BSF_GLOBAL, bfd_und_section_ptr, 0,
8168
0
      NULL, false, get_elf_backend_data (abfd)->collect, &bh)))
8169
0
      return false;
8170
8171
0
    h = (struct elf_link_hash_entry *) bh;
8172
0
    h->mark = 1;
8173
0
    h->non_elf = 0;
8174
0
    h->def_regular = 1;
8175
0
    h->type = STT_SECTION;
8176
8177
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
8178
0
      return false;
8179
0
  }
8180
8181
      /* We need to create a .compact_rel section.  */
8182
0
      if (SGI_COMPAT (abfd))
8183
0
  {
8184
0
    if (!mips_elf_create_compact_rel_section (abfd, info))
8185
0
      return false;
8186
0
  }
8187
8188
      /* Change alignments of some sections.  */
8189
0
      s = bfd_get_linker_section (abfd, ".hash");
8190
0
      if (s != NULL)
8191
0
  bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
8192
8193
0
      s = bfd_get_linker_section (abfd, ".dynsym");
8194
0
      if (s != NULL)
8195
0
  bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
8196
8197
0
      s = bfd_get_linker_section (abfd, ".dynstr");
8198
0
      if (s != NULL)
8199
0
  bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
8200
8201
      /* ??? */
8202
0
      s = bfd_get_section_by_name (abfd, ".reginfo");
8203
0
      if (s != NULL)
8204
0
  bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
8205
8206
0
      s = bfd_get_linker_section (abfd, ".dynamic");
8207
0
      if (s != NULL)
8208
0
  bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
8209
0
    }
8210
8211
0
  if (bfd_link_executable (info))
8212
0
    {
8213
0
      const char *name;
8214
8215
0
      name = SGI_COMPAT (abfd) ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING";
8216
0
      bh = NULL;
8217
0
      if (!(_bfd_generic_link_add_one_symbol
8218
0
      (info, abfd, name, BSF_GLOBAL, bfd_abs_section_ptr, 0,
8219
0
       NULL, false, get_elf_backend_data (abfd)->collect, &bh)))
8220
0
  return false;
8221
8222
0
      h = (struct elf_link_hash_entry *) bh;
8223
0
      h->non_elf = 0;
8224
0
      h->def_regular = 1;
8225
0
      h->type = STT_SECTION;
8226
8227
0
      if (! bfd_elf_link_record_dynamic_symbol (info, h))
8228
0
  return false;
8229
8230
0
      if (! mips_elf_hash_table (info)->use_rld_obj_head)
8231
0
  {
8232
    /* __rld_map is a four byte word located in the .data section
8233
       and is filled in by the rtld to contain a pointer to
8234
       the _r_debug structure. Its symbol value will be set in
8235
       _bfd_mips_elf_finish_dynamic_symbol.  */
8236
0
    s = bfd_get_linker_section (abfd, ".rld_map");
8237
0
    BFD_ASSERT (s != NULL);
8238
8239
0
    name = SGI_COMPAT (abfd) ? "__rld_map" : "__RLD_MAP";
8240
0
    bh = NULL;
8241
0
    if (!(_bfd_generic_link_add_one_symbol
8242
0
    (info, abfd, name, BSF_GLOBAL, s, 0, NULL, false,
8243
0
     get_elf_backend_data (abfd)->collect, &bh)))
8244
0
      return false;
8245
8246
0
    h = (struct elf_link_hash_entry *) bh;
8247
0
    h->non_elf = 0;
8248
0
    h->def_regular = 1;
8249
0
    h->type = STT_OBJECT;
8250
8251
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
8252
0
      return false;
8253
0
    mips_elf_hash_table (info)->rld_symbol = h;
8254
0
  }
8255
0
    }
8256
8257
  /* Create the .plt, .rel(a).plt, .dynbss and .rel(a).bss sections.
8258
     Also, on VxWorks, create the _PROCEDURE_LINKAGE_TABLE_ symbol.  */
8259
0
  if (!_bfd_elf_create_dynamic_sections (abfd, info))
8260
0
    return false;
8261
8262
  /* Do the usual VxWorks handling.  */
8263
0
  if (htab->root.target_os == is_vxworks
8264
0
      && !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
8265
0
    return false;
8266
8267
0
  return true;
8268
0
}
8269

8270
/* Return true if relocation REL against section SEC is a REL rather than
8271
   RELA relocation.  RELOCS is the first relocation in the section and
8272
   ABFD is the bfd that contains SEC.  */
8273
8274
static bool
8275
mips_elf_rel_relocation_p (bfd *abfd, asection *sec,
8276
         const Elf_Internal_Rela *relocs,
8277
         const Elf_Internal_Rela *rel)
8278
0
{
8279
0
  Elf_Internal_Shdr *rel_hdr;
8280
0
  elf_backend_data *bed;
8281
8282
  /* To determine which flavor of relocation this is, we depend on the
8283
     fact that the INPUT_SECTION's REL_HDR is read before RELA_HDR.  */
8284
0
  rel_hdr = elf_section_data (sec)->rel.hdr;
8285
0
  if (rel_hdr == NULL)
8286
0
    return false;
8287
0
  bed = get_elf_backend_data (abfd);
8288
0
  return ((size_t) (rel - relocs)
8289
0
    < NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel);
8290
0
}
8291
8292
/* Read the addend for REL relocation REL, which belongs to bfd ABFD.
8293
   HOWTO is the relocation's howto and CONTENTS points to the contents
8294
   of the section that REL is against.  */
8295
8296
static bfd_vma
8297
mips_elf_read_rel_addend (bfd *abfd, asection *sec,
8298
        const Elf_Internal_Rela *rel,
8299
        reloc_howto_type *howto, bfd_byte *contents)
8300
0
{
8301
0
  bfd_byte *location;
8302
0
  unsigned int r_type;
8303
0
  bfd_vma addend;
8304
0
  bfd_vma bytes;
8305
8306
0
  if (!bfd_reloc_offset_in_range (howto, abfd, sec, rel->r_offset))
8307
0
    return 0;
8308
8309
0
  r_type = ELF_R_TYPE (abfd, rel->r_info);
8310
0
  location = contents + rel->r_offset;
8311
8312
  /* Get the addend, which is stored in the input file.  */
8313
0
  _bfd_mips_elf_reloc_unshuffle (abfd, r_type, false, location);
8314
0
  bytes = mips_elf_obtain_contents (howto, rel, abfd, contents);
8315
0
  _bfd_mips_elf_reloc_shuffle (abfd, r_type, false, location);
8316
8317
0
  addend = bytes & howto->src_mask;
8318
8319
  /* Shift is 2, unusually, for microMIPS JALX.  Adjust the addend
8320
     accordingly.  */
8321
0
  if (r_type == R_MICROMIPS_26_S1 && (bytes >> 26) == 0x3c)
8322
0
    addend <<= 1;
8323
8324
0
  return addend;
8325
0
}
8326
8327
/* REL is a relocation in ABFD that needs a partnering LO16 relocation
8328
   and *ADDEND is the addend for REL itself.  Look for the LO16 relocation
8329
   and update *ADDEND with the final addend.  Return true on success
8330
   or false if the LO16 could not be found.  RELEND is the exclusive
8331
   upper bound on the relocations for REL's section.  */
8332
8333
static bool
8334
mips_elf_add_lo16_rel_addend (bfd *abfd,
8335
            asection *sec,
8336
            const Elf_Internal_Rela *rel,
8337
            const Elf_Internal_Rela *relend,
8338
            bfd_byte *contents, bfd_vma *addend)
8339
0
{
8340
0
  unsigned int r_type, lo16_type;
8341
0
  const Elf_Internal_Rela *lo16_relocation;
8342
0
  reloc_howto_type *lo16_howto;
8343
0
  bfd_vma l;
8344
8345
0
  r_type = ELF_R_TYPE (abfd, rel->r_info);
8346
0
  switch (r_type)
8347
0
    {
8348
0
    case R_MIPS_HI16:
8349
0
    case R_MIPS_GOT16:
8350
0
      lo16_type = R_MIPS_LO16;
8351
0
      break;
8352
0
    case R_MIPS_PCHI16:
8353
0
      lo16_type = R_MIPS_PCLO16;
8354
0
      break;
8355
0
    case R_MIPS_TLS_DTPREL_HI16:
8356
0
      lo16_type = R_MIPS_TLS_DTPREL_LO16;
8357
0
      break;
8358
0
    case R_MIPS_TLS_TPREL_HI16:
8359
0
      lo16_type = R_MIPS_TLS_TPREL_LO16;
8360
0
      break;
8361
0
    case R_MIPS16_HI16:
8362
0
    case R_MIPS16_GOT16:
8363
0
      lo16_type = R_MIPS16_LO16;
8364
0
      break;
8365
0
    case R_MIPS16_TLS_DTPREL_HI16:
8366
0
      lo16_type = R_MIPS16_TLS_DTPREL_LO16;
8367
0
      break;
8368
0
    case R_MIPS16_TLS_TPREL_HI16:
8369
0
      lo16_type = R_MIPS16_TLS_TPREL_LO16;
8370
0
      break;
8371
0
    case R_MICROMIPS_HI16:
8372
0
    case R_MICROMIPS_GOT16:
8373
0
      lo16_type = R_MICROMIPS_LO16;
8374
0
      break;
8375
0
    case R_MICROMIPS_TLS_DTPREL_HI16:
8376
0
      lo16_type = R_MICROMIPS_TLS_DTPREL_LO16;
8377
0
      break;
8378
0
    case R_MICROMIPS_TLS_TPREL_HI16:
8379
0
      lo16_type = R_MICROMIPS_TLS_TPREL_LO16;
8380
0
      break;
8381
0
    default:
8382
0
      abort ();
8383
0
    }
8384
8385
  /* The combined value is the sum of the HI16 addend, left-shifted by
8386
     sixteen bits, and the LO16 addend, sign extended.  (Usually, the
8387
     code does a `lui' of the HI16 value, and then an `addiu' of the
8388
     LO16 value.)  */
8389
0
  *addend <<= 16;
8390
8391
  /* Scan ahead to find a matching LO16 relocation.
8392
8393
     According to the MIPS ELF ABI, the R_MIPS_LO16 relocation must
8394
     be immediately following.  However, for the IRIX6 ABI, the next
8395
     relocation may be a composed relocation consisting of several
8396
     relocations for the same address.  In that case, the R_MIPS_LO16
8397
     relocation may occur as one of these.  We permit a similar
8398
     extension in general, as that is useful for GCC.
8399
8400
     In some cases GCC dead code elimination removes the LO16 but keeps
8401
     the corresponding HI16.  This is strictly speaking a violation of
8402
     the ABI but not immediately harmful.  */
8403
0
  lo16_relocation = mips_elf_next_relocation (abfd, lo16_type, rel, relend);
8404
0
  if (lo16_relocation == NULL)
8405
0
    return false;
8406
8407
  /* Obtain the addend kept there.  */
8408
0
  lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, lo16_type, false);
8409
0
  l = mips_elf_read_rel_addend (abfd, sec, lo16_relocation, lo16_howto,
8410
0
        contents);
8411
8412
0
  l <<= lo16_howto->rightshift;
8413
  /* For a PC-relative relocation the PCLO16 part of the addend
8414
     is relative to its PC and not ours, so we need to adjust it.  */
8415
0
  if (r_type == R_MIPS_PCHI16)
8416
0
    l = (l - (lo16_relocation->r_offset - rel->r_offset)) & 0xffff;
8417
0
  l = _bfd_mips_elf_sign_extend (l, 16);
8418
8419
0
  *addend += l;
8420
0
  return true;
8421
0
}
8422
8423
/* Try to read the contents of section SEC in bfd ABFD.  Return true and
8424
   store the contents in *CONTENTS on success.  Assume that *CONTENTS
8425
   already holds the contents if it is nonull on entry.  */
8426
8427
static bool
8428
mips_elf_get_section_contents (bfd *abfd, asection *sec, bfd_byte **contents)
8429
0
{
8430
0
  if (*contents)
8431
0
    return true;
8432
8433
  /* Get cached copy if it exists.  */
8434
0
  if (elf_section_data (sec)->this_hdr.contents != NULL)
8435
0
    {
8436
0
      *contents = elf_section_data (sec)->this_hdr.contents;
8437
0
      return true;
8438
0
    }
8439
8440
0
  return bfd_malloc_and_get_section (abfd, sec, contents);
8441
0
}
8442
8443
/* Make a new PLT record to keep internal data.  */
8444
8445
static struct plt_entry *
8446
mips_elf_make_plt_record (bfd *abfd)
8447
0
{
8448
0
  struct plt_entry *entry;
8449
8450
0
  entry = bfd_zalloc (abfd, sizeof (*entry));
8451
0
  if (entry == NULL)
8452
0
    return NULL;
8453
8454
0
  entry->stub_offset = MINUS_ONE;
8455
0
  entry->mips_offset = MINUS_ONE;
8456
0
  entry->comp_offset = MINUS_ONE;
8457
0
  entry->gotplt_index = MINUS_ONE;
8458
0
  return entry;
8459
0
}
8460
8461
/* Define the special `__gnu_absolute_zero' symbol.  We only need this
8462
   for PIC code, as otherwise there is no load-time relocation involved
8463
   and local GOT entries whose value is zero at static link time will
8464
   retain their value at load time.  */
8465
8466
static bool
8467
mips_elf_define_absolute_zero (bfd *abfd, struct bfd_link_info *info,
8468
             struct mips_elf_link_hash_table *htab,
8469
             unsigned int r_type)
8470
0
{
8471
0
  union
8472
0
    {
8473
0
      struct elf_link_hash_entry *eh;
8474
0
      struct bfd_link_hash_entry *bh;
8475
0
    }
8476
0
  hzero;
8477
8478
0
  BFD_ASSERT (!htab->use_absolute_zero);
8479
0
  BFD_ASSERT (bfd_link_pic (info));
8480
8481
0
  hzero.bh = NULL;
8482
0
  if (!_bfd_generic_link_add_one_symbol (info, abfd, "__gnu_absolute_zero",
8483
0
           BSF_GLOBAL, bfd_abs_section_ptr, 0,
8484
0
           NULL, false, false, &hzero.bh))
8485
0
    return false;
8486
8487
0
  BFD_ASSERT (hzero.bh != NULL);
8488
0
  hzero.eh->size = 0;
8489
0
  hzero.eh->type = STT_NOTYPE;
8490
0
  hzero.eh->other = STV_PROTECTED;
8491
0
  hzero.eh->def_regular = 1;
8492
0
  hzero.eh->non_elf = 0;
8493
8494
0
  if (!mips_elf_record_global_got_symbol (hzero.eh, abfd, info, true, r_type))
8495
0
    return false;
8496
8497
0
  htab->use_absolute_zero = true;
8498
8499
0
  return true;
8500
0
}
8501
8502
/* Look through the relocs for a section during the first phase, and
8503
   allocate space in the global offset table and record the need for
8504
   standard MIPS and compressed procedure linkage table entries.  */
8505
8506
bool
8507
_bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
8508
          asection *sec, const Elf_Internal_Rela *relocs)
8509
0
{
8510
0
  const char *name;
8511
0
  bfd *dynobj;
8512
0
  Elf_Internal_Shdr *symtab_hdr;
8513
0
  struct elf_link_hash_entry **sym_hashes;
8514
0
  size_t extsymoff;
8515
0
  const Elf_Internal_Rela *rel;
8516
0
  const Elf_Internal_Rela *rel_end;
8517
0
  asection *sreloc;
8518
0
  elf_backend_data *bed;
8519
0
  struct mips_elf_link_hash_table *htab;
8520
0
  bfd_byte *contents;
8521
0
  bfd_vma addend;
8522
0
  reloc_howto_type *howto;
8523
8524
0
  if (bfd_link_relocatable (info))
8525
0
    return true;
8526
8527
0
  htab = mips_elf_hash_table (info);
8528
0
  BFD_ASSERT (htab != NULL);
8529
8530
0
  dynobj = elf_hash_table (info)->dynobj;
8531
0
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8532
0
  sym_hashes = elf_sym_hashes (abfd);
8533
0
  extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
8534
8535
0
  bed = get_elf_backend_data (abfd);
8536
0
  rel_end = relocs + sec->reloc_count;
8537
8538
  /* Check for the mips16 stub sections.  */
8539
8540
0
  name = bfd_section_name (sec);
8541
0
  if (FN_STUB_P (name))
8542
0
    {
8543
0
      unsigned long r_symndx;
8544
8545
      /* Look at the relocation information to figure out which symbol
8546
   this is for.  */
8547
8548
0
      r_symndx = mips16_stub_symndx (bed, sec, relocs, rel_end);
8549
0
      if (r_symndx == 0)
8550
0
  {
8551
0
    _bfd_error_handler
8552
      /* xgettext:c-format */
8553
0
      (_("%pB: warning: cannot determine the target function for"
8554
0
         " stub section `%s'"),
8555
0
       abfd, name);
8556
0
    bfd_set_error (bfd_error_bad_value);
8557
0
    return false;
8558
0
  }
8559
8560
0
      if (r_symndx < extsymoff
8561
0
    || sym_hashes[r_symndx - extsymoff] == NULL)
8562
0
  {
8563
0
    asection *o;
8564
8565
    /* This stub is for a local symbol.  This stub will only be
8566
       needed if there is some relocation in this BFD, other
8567
       than a 16 bit function call, which refers to this symbol.  */
8568
0
    for (o = abfd->sections; o != NULL; o = o->next)
8569
0
      {
8570
0
        Elf_Internal_Rela *sec_relocs;
8571
0
        const Elf_Internal_Rela *r, *rend;
8572
8573
        /* We can ignore stub sections when looking for relocs.  */
8574
0
        if ((o->flags & SEC_RELOC) == 0
8575
0
      || o->reloc_count == 0
8576
0
      || section_allows_mips16_refs_p (o))
8577
0
    continue;
8578
8579
0
        sec_relocs
8580
0
    = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
8581
0
               info->keep_memory);
8582
0
        if (sec_relocs == NULL)
8583
0
    return false;
8584
8585
0
        rend = sec_relocs + o->reloc_count;
8586
0
        for (r = sec_relocs; r < rend; r++)
8587
0
    if (ELF_R_SYM (abfd, r->r_info) == r_symndx
8588
0
        && !mips16_call_reloc_p (ELF_R_TYPE (abfd, r->r_info)))
8589
0
      break;
8590
8591
0
        if (elf_section_data (o)->relocs != sec_relocs)
8592
0
    free (sec_relocs);
8593
8594
0
        if (r < rend)
8595
0
    break;
8596
0
      }
8597
8598
0
    if (o == NULL)
8599
0
      {
8600
        /* There is no non-call reloc for this stub, so we do
8601
     not need it.  Since this function is called before
8602
     the linker maps input sections to output sections, we
8603
     can easily discard it by setting the SEC_EXCLUDE
8604
     flag.  */
8605
0
        sec->flags |= SEC_EXCLUDE;
8606
0
        return true;
8607
0
      }
8608
8609
    /* Record this stub in an array of local symbol stubs for
8610
       this BFD.  */
8611
0
    if (mips_elf_tdata (abfd)->local_stubs == NULL)
8612
0
      {
8613
0
        unsigned long symcount;
8614
0
        asection **n;
8615
0
        bfd_size_type amt;
8616
8617
0
        if (elf_bad_symtab (abfd))
8618
0
    symcount = NUM_SHDR_ENTRIES (symtab_hdr);
8619
0
        else
8620
0
    symcount = symtab_hdr->sh_info;
8621
0
        amt = symcount * sizeof (asection *);
8622
0
        n = bfd_zalloc (abfd, amt);
8623
0
        if (n == NULL)
8624
0
    return false;
8625
0
        mips_elf_tdata (abfd)->local_stubs = n;
8626
0
      }
8627
8628
0
    sec->flags |= SEC_KEEP;
8629
0
    mips_elf_tdata (abfd)->local_stubs[r_symndx] = sec;
8630
8631
    /* We don't need to set mips16_stubs_seen in this case.
8632
       That flag is used to see whether we need to look through
8633
       the global symbol table for stubs.  We don't need to set
8634
       it here, because we just have a local stub.  */
8635
0
  }
8636
0
      else
8637
0
  {
8638
0
    struct mips_elf_link_hash_entry *h;
8639
8640
0
    h = ((struct mips_elf_link_hash_entry *)
8641
0
         sym_hashes[r_symndx - extsymoff]);
8642
8643
0
    while (h->root.root.type == bfd_link_hash_indirect
8644
0
     || h->root.root.type == bfd_link_hash_warning)
8645
0
      h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
8646
8647
    /* H is the symbol this stub is for.  */
8648
8649
    /* If we already have an appropriate stub for this function, we
8650
       don't need another one, so we can discard this one.  Since
8651
       this function is called before the linker maps input sections
8652
       to output sections, we can easily discard it by setting the
8653
       SEC_EXCLUDE flag.  */
8654
0
    if (h->fn_stub != NULL)
8655
0
      {
8656
0
        sec->flags |= SEC_EXCLUDE;
8657
0
        return true;
8658
0
      }
8659
8660
0
    sec->flags |= SEC_KEEP;
8661
0
    h->fn_stub = sec;
8662
0
    mips_elf_hash_table (info)->mips16_stubs_seen = true;
8663
0
  }
8664
0
    }
8665
0
  else if (CALL_STUB_P (name) || CALL_FP_STUB_P (name))
8666
0
    {
8667
0
      unsigned long r_symndx;
8668
0
      struct mips_elf_link_hash_entry *h;
8669
0
      asection **loc;
8670
8671
      /* Look at the relocation information to figure out which symbol
8672
   this is for.  */
8673
8674
0
      r_symndx = mips16_stub_symndx (bed, sec, relocs, rel_end);
8675
0
      if (r_symndx == 0)
8676
0
  {
8677
0
    _bfd_error_handler
8678
      /* xgettext:c-format */
8679
0
      (_("%pB: warning: cannot determine the target function for"
8680
0
         " stub section `%s'"),
8681
0
       abfd, name);
8682
0
    bfd_set_error (bfd_error_bad_value);
8683
0
    return false;
8684
0
  }
8685
8686
0
      if (r_symndx < extsymoff
8687
0
    || sym_hashes[r_symndx - extsymoff] == NULL)
8688
0
  {
8689
0
    asection *o;
8690
8691
    /* This stub is for a local symbol.  This stub will only be
8692
       needed if there is some relocation (R_MIPS16_26) in this BFD
8693
       that refers to this symbol.  */
8694
0
    for (o = abfd->sections; o != NULL; o = o->next)
8695
0
      {
8696
0
        Elf_Internal_Rela *sec_relocs;
8697
0
        const Elf_Internal_Rela *r, *rend;
8698
8699
        /* We can ignore stub sections when looking for relocs.  */
8700
0
        if ((o->flags & SEC_RELOC) == 0
8701
0
      || o->reloc_count == 0
8702
0
      || section_allows_mips16_refs_p (o))
8703
0
    continue;
8704
8705
0
        sec_relocs
8706
0
    = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
8707
0
               info->keep_memory);
8708
0
        if (sec_relocs == NULL)
8709
0
    return false;
8710
8711
0
        rend = sec_relocs + o->reloc_count;
8712
0
        for (r = sec_relocs; r < rend; r++)
8713
0
    if (ELF_R_SYM (abfd, r->r_info) == r_symndx
8714
0
        && ELF_R_TYPE (abfd, r->r_info) == R_MIPS16_26)
8715
0
        break;
8716
8717
0
        if (elf_section_data (o)->relocs != sec_relocs)
8718
0
    free (sec_relocs);
8719
8720
0
        if (r < rend)
8721
0
    break;
8722
0
      }
8723
8724
0
    if (o == NULL)
8725
0
      {
8726
        /* There is no non-call reloc for this stub, so we do
8727
     not need it.  Since this function is called before
8728
     the linker maps input sections to output sections, we
8729
     can easily discard it by setting the SEC_EXCLUDE
8730
     flag.  */
8731
0
        sec->flags |= SEC_EXCLUDE;
8732
0
        return true;
8733
0
      }
8734
8735
    /* Record this stub in an array of local symbol call_stubs for
8736
       this BFD.  */
8737
0
    if (mips_elf_tdata (abfd)->local_call_stubs == NULL)
8738
0
      {
8739
0
        unsigned long symcount;
8740
0
        asection **n;
8741
0
        bfd_size_type amt;
8742
8743
0
        if (elf_bad_symtab (abfd))
8744
0
    symcount = NUM_SHDR_ENTRIES (symtab_hdr);
8745
0
        else
8746
0
    symcount = symtab_hdr->sh_info;
8747
0
        amt = symcount * sizeof (asection *);
8748
0
        n = bfd_zalloc (abfd, amt);
8749
0
        if (n == NULL)
8750
0
    return false;
8751
0
        mips_elf_tdata (abfd)->local_call_stubs = n;
8752
0
      }
8753
8754
0
    sec->flags |= SEC_KEEP;
8755
0
    mips_elf_tdata (abfd)->local_call_stubs[r_symndx] = sec;
8756
8757
    /* We don't need to set mips16_stubs_seen in this case.
8758
       That flag is used to see whether we need to look through
8759
       the global symbol table for stubs.  We don't need to set
8760
       it here, because we just have a local stub.  */
8761
0
  }
8762
0
      else
8763
0
  {
8764
0
    h = ((struct mips_elf_link_hash_entry *)
8765
0
         sym_hashes[r_symndx - extsymoff]);
8766
8767
    /* H is the symbol this stub is for.  */
8768
8769
0
    if (CALL_FP_STUB_P (name))
8770
0
      loc = &h->call_fp_stub;
8771
0
    else
8772
0
      loc = &h->call_stub;
8773
8774
    /* If we already have an appropriate stub for this function, we
8775
       don't need another one, so we can discard this one.  Since
8776
       this function is called before the linker maps input sections
8777
       to output sections, we can easily discard it by setting the
8778
       SEC_EXCLUDE flag.  */
8779
0
    if (*loc != NULL)
8780
0
      {
8781
0
        sec->flags |= SEC_EXCLUDE;
8782
0
        return true;
8783
0
      }
8784
8785
0
    sec->flags |= SEC_KEEP;
8786
0
    *loc = sec;
8787
0
    mips_elf_hash_table (info)->mips16_stubs_seen = true;
8788
0
  }
8789
0
    }
8790
8791
0
  sreloc = NULL;
8792
0
  contents = NULL;
8793
0
  for (rel = relocs; rel < rel_end; ++rel)
8794
0
    {
8795
0
      unsigned long r_symndx;
8796
0
      unsigned int r_type;
8797
0
      struct elf_link_hash_entry *h;
8798
0
      bool can_make_dynamic_p;
8799
0
      bool call_reloc_p;
8800
0
      bool constrain_symbol_p;
8801
8802
0
      r_symndx = ELF_R_SYM (abfd, rel->r_info);
8803
0
      r_type = ELF_R_TYPE (abfd, rel->r_info);
8804
8805
0
      if (r_symndx < extsymoff)
8806
0
  h = NULL;
8807
0
      else if (r_symndx >= extsymoff + NUM_SHDR_ENTRIES (symtab_hdr))
8808
0
  {
8809
0
    _bfd_error_handler
8810
      /* xgettext:c-format */
8811
0
      (_("%pB: malformed reloc detected for section %s"),
8812
0
       abfd, name);
8813
0
    bfd_set_error (bfd_error_bad_value);
8814
0
    return false;
8815
0
  }
8816
0
      else
8817
0
  {
8818
0
    h = sym_hashes[r_symndx - extsymoff];
8819
0
    if (h != NULL)
8820
0
      {
8821
0
        while (h->root.type == bfd_link_hash_indirect
8822
0
         || h->root.type == bfd_link_hash_warning)
8823
0
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
8824
0
      }
8825
0
  }
8826
8827
      /* Set CAN_MAKE_DYNAMIC_P to true if we can convert this
8828
   relocation into a dynamic one.  */
8829
0
      can_make_dynamic_p = false;
8830
8831
      /* Set CALL_RELOC_P to true if the relocation is for a call,
8832
   and if pointer equality therefore doesn't matter.  */
8833
0
      call_reloc_p = false;
8834
8835
      /* Set CONSTRAIN_SYMBOL_P if we need to take the relocation
8836
   into account when deciding how to define the symbol.  */
8837
0
      constrain_symbol_p = true;
8838
8839
0
      switch (r_type)
8840
0
  {
8841
0
  case R_MIPS_CALL16:
8842
0
  case R_MIPS_CALL_HI16:
8843
0
  case R_MIPS_CALL_LO16:
8844
0
  case R_MIPS16_CALL16:
8845
0
  case R_MICROMIPS_CALL16:
8846
0
  case R_MICROMIPS_CALL_HI16:
8847
0
  case R_MICROMIPS_CALL_LO16:
8848
0
    call_reloc_p = true;
8849
    /* Fall through.  */
8850
8851
0
  case R_MIPS_GOT16:
8852
0
  case R_MIPS_GOT_LO16:
8853
0
  case R_MIPS_GOT_PAGE:
8854
0
  case R_MIPS_GOT_DISP:
8855
0
  case R_MIPS16_GOT16:
8856
0
  case R_MICROMIPS_GOT16:
8857
0
  case R_MICROMIPS_GOT_LO16:
8858
0
  case R_MICROMIPS_GOT_PAGE:
8859
0
  case R_MICROMIPS_GOT_DISP:
8860
    /* If we have a symbol that will resolve to zero at static link
8861
       time and it is used by a GOT relocation applied to code we
8862
       cannot relax to an immediate zero load, then we will be using
8863
       the special `__gnu_absolute_zero' symbol whose value is zero
8864
       at dynamic load time.  We ignore HI16-type GOT relocations at
8865
       this stage, because their handling will depend entirely on
8866
       the corresponding LO16-type GOT relocation.  */
8867
0
    if (!call_hi16_reloc_p (r_type)
8868
0
        && h != NULL
8869
0
        && bfd_link_pic (info)
8870
0
        && !htab->use_absolute_zero
8871
0
        && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
8872
0
      {
8873
0
        bool rel_reloc;
8874
8875
0
        if (!mips_elf_get_section_contents (abfd, sec, &contents))
8876
0
    return false;
8877
8878
0
        rel_reloc = mips_elf_rel_relocation_p (abfd, sec, relocs, rel);
8879
0
        howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, !rel_reloc);
8880
0
        if (bfd_reloc_offset_in_range (howto, abfd, sec, rel->r_offset))
8881
0
    if (!mips_elf_nullify_got_load (abfd, contents, rel, howto,
8882
0
            false))
8883
0
      if (!mips_elf_define_absolute_zero (abfd, info, htab,
8884
0
                  r_type))
8885
0
        return false;
8886
0
      }
8887
8888
    /* Fall through.  */
8889
0
  case R_MIPS_GOT_HI16:
8890
0
  case R_MIPS_GOT_OFST:
8891
0
  case R_MIPS_TLS_GOTTPREL:
8892
0
  case R_MIPS_TLS_GD:
8893
0
  case R_MIPS_TLS_LDM:
8894
0
  case R_MIPS16_TLS_GOTTPREL:
8895
0
  case R_MIPS16_TLS_GD:
8896
0
  case R_MIPS16_TLS_LDM:
8897
0
  case R_MICROMIPS_GOT_HI16:
8898
0
  case R_MICROMIPS_GOT_OFST:
8899
0
  case R_MICROMIPS_TLS_GOTTPREL:
8900
0
  case R_MICROMIPS_TLS_GD:
8901
0
  case R_MICROMIPS_TLS_LDM:
8902
0
    if (dynobj == NULL)
8903
0
      elf_hash_table (info)->dynobj = dynobj = abfd;
8904
0
    if (!mips_elf_create_got_section (dynobj, info))
8905
0
      return false;
8906
0
    if (htab->root.target_os == is_vxworks
8907
0
        && !bfd_link_pic (info))
8908
0
      {
8909
0
        _bfd_error_handler
8910
    /* xgettext:c-format */
8911
0
    (_("%pB: GOT reloc at %#" PRIx64 " not expected in executables"),
8912
0
     abfd, (uint64_t) rel->r_offset);
8913
0
        bfd_set_error (bfd_error_bad_value);
8914
0
        return false;
8915
0
      }
8916
0
    can_make_dynamic_p = true;
8917
0
    break;
8918
8919
0
  case R_MIPS_NONE:
8920
0
  case R_MIPS_JALR:
8921
0
  case R_MICROMIPS_JALR:
8922
    /* These relocations have empty fields and are purely there to
8923
       provide link information.  The symbol value doesn't matter.  */
8924
0
    constrain_symbol_p = false;
8925
0
    break;
8926
8927
0
  case R_MIPS_GPREL16:
8928
0
  case R_MIPS_GPREL32:
8929
0
  case R_MIPS16_GPREL:
8930
0
  case R_MICROMIPS_GPREL16:
8931
    /* GP-relative relocations always resolve to a definition in a
8932
       regular input file, ignoring the one-definition rule.  This is
8933
       important for the GP setup sequence in NewABI code, which
8934
       always resolves to a local function even if other relocations
8935
       against the symbol wouldn't.  */
8936
0
    constrain_symbol_p = false;
8937
0
    break;
8938
8939
0
  case R_MIPS_32:
8940
0
  case R_MIPS_REL32:
8941
0
  case R_MIPS_64:
8942
    /* In VxWorks executables, references to external symbols
8943
       must be handled using copy relocs or PLT entries; it is not
8944
       possible to convert this relocation into a dynamic one.
8945
8946
       For executables that use PLTs and copy-relocs, we have a
8947
       choice between converting the relocation into a dynamic
8948
       one or using copy relocations or PLT entries.  It is
8949
       usually better to do the former, unless the relocation is
8950
       against a read-only section.  */
8951
0
    if ((bfd_link_pic (info)
8952
0
         || (h != NULL
8953
0
       && htab->root.target_os != is_vxworks
8954
0
       && strcmp (h->root.root.string, "__gnu_local_gp") != 0
8955
0
       && !(!info->nocopyreloc
8956
0
      && !PIC_OBJECT_P (abfd)
8957
0
      && MIPS_ELF_READONLY_SECTION (sec))))
8958
0
        && (sec->flags & SEC_ALLOC) != 0)
8959
0
      {
8960
0
        can_make_dynamic_p = true;
8961
0
        if (dynobj == NULL)
8962
0
    elf_hash_table (info)->dynobj = dynobj = abfd;
8963
0
      }
8964
0
    break;
8965
8966
0
  case R_MIPS_26:
8967
0
  case R_MIPS_PC16:
8968
0
  case R_MIPS_PC21_S2:
8969
0
  case R_MIPS_PC26_S2:
8970
0
  case R_MIPS16_26:
8971
0
  case R_MIPS16_PC16_S1:
8972
0
  case R_MICROMIPS_26_S1:
8973
0
  case R_MICROMIPS_PC7_S1:
8974
0
  case R_MICROMIPS_PC10_S1:
8975
0
  case R_MICROMIPS_PC16_S1:
8976
0
  case R_MICROMIPS_PC23_S2:
8977
0
    call_reloc_p = true;
8978
0
    break;
8979
0
  }
8980
8981
0
      if (h)
8982
0
  {
8983
0
    if (constrain_symbol_p)
8984
0
      {
8985
0
        if (!can_make_dynamic_p)
8986
0
    ((struct mips_elf_link_hash_entry *) h)->has_static_relocs = 1;
8987
8988
0
        if (!call_reloc_p)
8989
0
    h->pointer_equality_needed = 1;
8990
8991
        /* We must not create a stub for a symbol that has
8992
     relocations related to taking the function's address.
8993
     This doesn't apply to VxWorks, where CALL relocs refer
8994
     to a .got.plt entry instead of a normal .got entry.  */
8995
0
        if (htab->root.target_os != is_vxworks
8996
0
      && (!can_make_dynamic_p || !call_reloc_p))
8997
0
    ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = true;
8998
0
      }
8999
9000
    /* Relocations against the special VxWorks __GOTT_BASE__ and
9001
       __GOTT_INDEX__ symbols must be left to the loader.  Allocate
9002
       room for them in .rela.dyn.  */
9003
0
    if (is_gott_symbol (info, h))
9004
0
      {
9005
0
        if (sreloc == NULL)
9006
0
    {
9007
0
      sreloc = mips_elf_rel_dyn_section (info, true);
9008
0
      if (sreloc == NULL)
9009
0
        return false;
9010
0
    }
9011
0
        mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
9012
0
        if (MIPS_ELF_READONLY_SECTION (sec))
9013
    /* We tell the dynamic linker that there are
9014
       relocations against the text segment.  */
9015
0
    info->flags |= DF_TEXTREL;
9016
0
      }
9017
0
  }
9018
0
      else if (call_lo16_reloc_p (r_type)
9019
0
         || got_lo16_reloc_p (r_type)
9020
0
         || got_disp_reloc_p (r_type)
9021
0
         || (got16_reloc_p (r_type)
9022
0
       && htab->root.target_os == is_vxworks))
9023
0
  {
9024
    /* We may need a local GOT entry for this relocation.  We
9025
       don't count R_MIPS_GOT_PAGE because we can estimate the
9026
       maximum number of pages needed by looking at the size of
9027
       the segment.  Similar comments apply to R_MIPS*_GOT16 and
9028
       R_MIPS*_CALL16, except on VxWorks, where GOT relocations
9029
       always evaluate to "G".  We don't count R_MIPS_GOT_HI16, or
9030
       R_MIPS_CALL_HI16 because these are always followed by an
9031
       R_MIPS_GOT_LO16 or R_MIPS_CALL_LO16.  */
9032
0
    if (!mips_elf_record_local_got_symbol (abfd, r_symndx,
9033
0
             rel->r_addend, info, r_type))
9034
0
      return false;
9035
0
  }
9036
9037
0
      if (h != NULL
9038
0
    && mips_elf_relocation_needs_la25_stub (abfd, r_type,
9039
0
              ELF_ST_IS_MIPS16 (h->other)))
9040
0
  ((struct mips_elf_link_hash_entry *) h)->has_nonpic_branches = true;
9041
9042
0
      switch (r_type)
9043
0
  {
9044
0
  case R_MIPS_CALL16:
9045
0
  case R_MIPS16_CALL16:
9046
0
  case R_MICROMIPS_CALL16:
9047
0
    if (h == NULL)
9048
0
      {
9049
0
        _bfd_error_handler
9050
    /* xgettext:c-format */
9051
0
    (_("%pB: CALL16 reloc at %#" PRIx64 " not against global symbol"),
9052
0
     abfd, (uint64_t) rel->r_offset);
9053
0
        bfd_set_error (bfd_error_bad_value);
9054
0
        return false;
9055
0
      }
9056
    /* Fall through.  */
9057
9058
0
  case R_MIPS_CALL_HI16:
9059
0
  case R_MIPS_CALL_LO16:
9060
0
  case R_MICROMIPS_CALL_HI16:
9061
0
  case R_MICROMIPS_CALL_LO16:
9062
0
    if (h != NULL)
9063
0
      {
9064
        /* Make sure there is room in the regular GOT to hold the
9065
     function's address.  We may eliminate it in favour of
9066
     a .got.plt entry later; see mips_elf_count_got_symbols.  */
9067
0
        if (!mips_elf_record_global_got_symbol (h, abfd, info, true,
9068
0
                  r_type))
9069
0
    return false;
9070
9071
        /* We need a stub, not a plt entry for the undefined
9072
     function.  But we record it as if it needs plt.  See
9073
     _bfd_elf_adjust_dynamic_symbol.  */
9074
0
        h->needs_plt = 1;
9075
0
        h->type = STT_FUNC;
9076
0
      }
9077
0
    break;
9078
9079
0
  case R_MIPS_GOT_PAGE:
9080
0
  case R_MICROMIPS_GOT_PAGE:
9081
0
  case R_MIPS16_GOT16:
9082
0
  case R_MIPS_GOT16:
9083
0
  case R_MIPS_GOT_HI16:
9084
0
  case R_MIPS_GOT_LO16:
9085
0
  case R_MICROMIPS_GOT16:
9086
0
  case R_MICROMIPS_GOT_HI16:
9087
0
  case R_MICROMIPS_GOT_LO16:
9088
0
    if (!h || got_page_reloc_p (r_type))
9089
0
      {
9090
        /* This relocation needs (or may need, if h != NULL) a
9091
     page entry in the GOT.  For R_MIPS_GOT_PAGE we do not
9092
     know for sure until we know whether the symbol is
9093
     preemptible.  */
9094
0
        if (mips_elf_rel_relocation_p (abfd, sec, relocs, rel))
9095
0
    {
9096
0
      if (!mips_elf_get_section_contents (abfd, sec, &contents))
9097
0
        return false;
9098
0
      howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, false);
9099
0
      addend = mips_elf_read_rel_addend (abfd, sec, rel,
9100
0
                 howto, contents);
9101
0
      if (got16_reloc_p (r_type))
9102
0
        mips_elf_add_lo16_rel_addend (abfd, sec, rel, rel_end,
9103
0
              contents, &addend);
9104
0
      else
9105
0
        addend <<= howto->rightshift;
9106
0
    }
9107
0
        else
9108
0
    addend = rel->r_addend;
9109
0
        if (!mips_elf_record_got_page_ref (info, abfd, r_symndx,
9110
0
             h, addend))
9111
0
    return false;
9112
9113
0
        if (h)
9114
0
    {
9115
0
      struct mips_elf_link_hash_entry *hmips =
9116
0
        (struct mips_elf_link_hash_entry *) h;
9117
9118
      /* This symbol is definitely not overridable.  */
9119
0
      if (hmips->root.def_regular
9120
0
          && ! (bfd_link_pic (info) && ! info->symbolic
9121
0
          && ! hmips->root.forced_local))
9122
0
        h = NULL;
9123
0
    }
9124
0
      }
9125
    /* If this is a global, overridable symbol, GOT_PAGE will
9126
       decay to GOT_DISP, so we'll need a GOT entry for it.  */
9127
    /* Fall through.  */
9128
9129
0
  case R_MIPS_GOT_DISP:
9130
0
  case R_MICROMIPS_GOT_DISP:
9131
0
    if (h && !mips_elf_record_global_got_symbol (h, abfd, info,
9132
0
                   false, r_type))
9133
0
      return false;
9134
0
    break;
9135
9136
0
  case R_MIPS_TLS_GOTTPREL:
9137
0
  case R_MIPS16_TLS_GOTTPREL:
9138
0
  case R_MICROMIPS_TLS_GOTTPREL:
9139
0
    if (bfd_link_pic (info))
9140
0
      info->flags |= DF_STATIC_TLS;
9141
    /* Fall through */
9142
9143
0
  case R_MIPS_TLS_LDM:
9144
0
  case R_MIPS16_TLS_LDM:
9145
0
  case R_MICROMIPS_TLS_LDM:
9146
0
    if (tls_ldm_reloc_p (r_type))
9147
0
      {
9148
0
        r_symndx = STN_UNDEF;
9149
0
        h = NULL;
9150
0
      }
9151
    /* Fall through */
9152
9153
0
  case R_MIPS_TLS_GD:
9154
0
  case R_MIPS16_TLS_GD:
9155
0
  case R_MICROMIPS_TLS_GD:
9156
    /* This symbol requires a global offset table entry, or two
9157
       for TLS GD relocations.  */
9158
0
    if (h != NULL)
9159
0
      {
9160
0
        if (!mips_elf_record_global_got_symbol (h, abfd, info,
9161
0
                  false, r_type))
9162
0
    return false;
9163
0
      }
9164
0
    else
9165
0
      {
9166
0
        if (!mips_elf_record_local_got_symbol (abfd, r_symndx,
9167
0
                 rel->r_addend,
9168
0
                 info, r_type))
9169
0
    return false;
9170
0
      }
9171
0
    break;
9172
9173
0
  case R_MIPS_32:
9174
0
  case R_MIPS_REL32:
9175
0
  case R_MIPS_64:
9176
    /* In VxWorks executables, references to external symbols
9177
       are handled using copy relocs or PLT stubs, so there's
9178
       no need to add a .rela.dyn entry for this relocation.  */
9179
0
    if (can_make_dynamic_p)
9180
0
      {
9181
0
        if (sreloc == NULL)
9182
0
    {
9183
0
      sreloc = mips_elf_rel_dyn_section (info, true);
9184
0
      if (sreloc == NULL)
9185
0
        return false;
9186
0
    }
9187
0
        if (bfd_link_pic (info) && h == NULL)
9188
0
    {
9189
      /* When creating a shared object, we must copy these
9190
         reloc types into the output file as R_MIPS_REL32
9191
         relocs.  Make room for this reloc in .rel(a).dyn.  */
9192
0
      mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
9193
0
      if (MIPS_ELF_READONLY_SECTION (sec))
9194
        /* We tell the dynamic linker that there are
9195
           relocations against the text segment.  */
9196
0
        info->flags |= DF_TEXTREL;
9197
0
    }
9198
0
        else
9199
0
    {
9200
0
      struct mips_elf_link_hash_entry *hmips;
9201
9202
      /* For a shared object, we must copy this relocation
9203
         unless the symbol turns out to be undefined and
9204
         weak with non-default visibility, in which case
9205
         it will be left as zero.
9206
9207
         We could elide R_MIPS_REL32 for locally binding symbols
9208
         in shared libraries, but do not yet do so.
9209
9210
         For an executable, we only need to copy this
9211
         reloc if the symbol is defined in a dynamic
9212
         object.  */
9213
0
      hmips = (struct mips_elf_link_hash_entry *) h;
9214
0
      ++hmips->possibly_dynamic_relocs;
9215
0
      if (MIPS_ELF_READONLY_SECTION (sec))
9216
        /* We need it to tell the dynamic linker if there
9217
           are relocations against the text segment.  */
9218
0
        hmips->readonly_reloc = true;
9219
0
    }
9220
0
      }
9221
9222
0
    if (SGI_COMPAT (abfd))
9223
0
      mips_elf_hash_table (info)->compact_rel_size +=
9224
0
        sizeof (Elf32_External_crinfo);
9225
0
    break;
9226
9227
0
  case R_MIPS_26:
9228
0
  case R_MIPS_GPREL16:
9229
0
  case R_MIPS_LITERAL:
9230
0
  case R_MIPS_GPREL32:
9231
0
  case R_MICROMIPS_26_S1:
9232
0
  case R_MICROMIPS_GPREL16:
9233
0
  case R_MICROMIPS_LITERAL:
9234
0
  case R_MICROMIPS_GPREL7_S2:
9235
0
    if (SGI_COMPAT (abfd))
9236
0
      mips_elf_hash_table (info)->compact_rel_size +=
9237
0
        sizeof (Elf32_External_crinfo);
9238
0
    break;
9239
9240
    /* This relocation describes the C++ object vtable hierarchy.
9241
       Reconstruct it for later use during GC.  */
9242
0
  case R_MIPS_GNU_VTINHERIT:
9243
0
    if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
9244
0
      return false;
9245
0
    break;
9246
9247
    /* This relocation describes which C++ vtable entries are actually
9248
       used.  Record for later use during GC.  */
9249
0
  case R_MIPS_GNU_VTENTRY:
9250
0
    if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
9251
0
      return false;
9252
0
    break;
9253
9254
0
  default:
9255
0
    break;
9256
0
  }
9257
9258
      /* Record the need for a PLT entry.  At this point we don't know
9259
   yet if we are going to create a PLT in the first place, but
9260
   we only record whether the relocation requires a standard MIPS
9261
   or a compressed code entry anyway.  If we don't make a PLT after
9262
   all, then we'll just ignore these arrangements.  Likewise if
9263
   a PLT entry is not created because the symbol is satisfied
9264
   locally.  */
9265
0
      if (h != NULL
9266
0
    && (branch_reloc_p (r_type)
9267
0
        || mips16_branch_reloc_p (r_type)
9268
0
        || micromips_branch_reloc_p (r_type))
9269
0
    && !SYMBOL_CALLS_LOCAL (info, h))
9270
0
  {
9271
0
    if (h->plt.plist == NULL)
9272
0
      h->plt.plist = mips_elf_make_plt_record (abfd);
9273
0
    if (h->plt.plist == NULL)
9274
0
      return false;
9275
9276
0
    if (branch_reloc_p (r_type))
9277
0
      h->plt.plist->need_mips = true;
9278
0
    else
9279
0
      h->plt.plist->need_comp = true;
9280
0
  }
9281
9282
      /* See if this reloc would need to refer to a MIPS16 hard-float stub,
9283
   if there is one.  We only need to handle global symbols here;
9284
   we decide whether to keep or delete stubs for local symbols
9285
   when processing the stub's relocations.  */
9286
0
      if (h != NULL
9287
0
    && !mips16_call_reloc_p (r_type)
9288
0
    && !section_allows_mips16_refs_p (sec))
9289
0
  {
9290
0
    struct mips_elf_link_hash_entry *mh;
9291
9292
0
    mh = (struct mips_elf_link_hash_entry *) h;
9293
0
    mh->need_fn_stub = true;
9294
0
  }
9295
9296
      /* Refuse some position-dependent relocations when creating a
9297
   shared library.  Do not refuse R_MIPS_32 / R_MIPS_64; they're
9298
   not PIC, but we can create dynamic relocations and the result
9299
   will be fine.  Also do not refuse R_MIPS_LO16, which can be
9300
   combined with R_MIPS_GOT16.  */
9301
0
      if (bfd_link_pic (info))
9302
0
  {
9303
0
    switch (r_type)
9304
0
      {
9305
0
      case R_MIPS_TLS_TPREL_HI16:
9306
0
      case R_MIPS16_TLS_TPREL_HI16:
9307
0
      case R_MICROMIPS_TLS_TPREL_HI16:
9308
0
      case R_MIPS_TLS_TPREL_LO16:
9309
0
      case R_MIPS16_TLS_TPREL_LO16:
9310
0
      case R_MICROMIPS_TLS_TPREL_LO16:
9311
        /* These are okay in PIE, but not in a shared library.  */
9312
0
        if (bfd_link_executable (info))
9313
0
    break;
9314
9315
        /* FALLTHROUGH */
9316
9317
0
      case R_MIPS16_HI16:
9318
0
      case R_MIPS_HI16:
9319
0
      case R_MIPS_HIGHER:
9320
0
      case R_MIPS_HIGHEST:
9321
0
      case R_MICROMIPS_HI16:
9322
0
      case R_MICROMIPS_HIGHER:
9323
0
      case R_MICROMIPS_HIGHEST:
9324
        /* Don't refuse a high part relocation if it's against
9325
     no symbol (e.g. part of a compound relocation).  */
9326
0
        if (r_symndx == STN_UNDEF)
9327
0
    break;
9328
9329
        /* Likewise an absolute symbol.  */
9330
0
        if (h != NULL && bfd_is_abs_symbol (&h->root))
9331
0
    break;
9332
9333
        /* R_MIPS_HI16 against _gp_disp is used for $gp setup,
9334
     and has a special meaning.  */
9335
0
        if (!NEWABI_P (abfd) && h != NULL
9336
0
      && strcmp (h->root.root.string, "_gp_disp") == 0)
9337
0
    break;
9338
9339
        /* Likewise __GOTT_BASE__ and __GOTT_INDEX__ on VxWorks.  */
9340
0
        if (is_gott_symbol (info, h))
9341
0
    break;
9342
9343
        /* FALLTHROUGH */
9344
9345
0
      case R_MIPS16_26:
9346
0
      case R_MIPS_26:
9347
0
      case R_MICROMIPS_26_S1:
9348
0
        howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, NEWABI_P (abfd));
9349
        /* An error for unsupported relocations is raised as part
9350
     of the above search, so we can skip the following.  */
9351
0
        if (howto != NULL)
9352
0
    info->callbacks->einfo
9353
      /* xgettext:c-format */
9354
0
      (_("%X%H: relocation %s against `%s' cannot be used"
9355
0
         " when making a shared object; recompile with -fPIC\n"),
9356
0
       abfd, sec, rel->r_offset, howto->name,
9357
0
       (h) ? h->root.root.string : "a local symbol");
9358
0
        break;
9359
0
      default:
9360
0
        break;
9361
0
      }
9362
0
  }
9363
0
    }
9364
9365
0
  return true;
9366
0
}
9367

9368
/* Allocate space for global sym dynamic relocs.  */
9369
9370
static bool
9371
allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
9372
0
{
9373
0
  struct bfd_link_info *info = inf;
9374
0
  bfd *dynobj;
9375
0
  struct mips_elf_link_hash_entry *hmips;
9376
0
  struct mips_elf_link_hash_table *htab;
9377
9378
0
  htab = mips_elf_hash_table (info);
9379
0
  BFD_ASSERT (htab != NULL);
9380
9381
0
  dynobj = elf_hash_table (info)->dynobj;
9382
0
  hmips = (struct mips_elf_link_hash_entry *) h;
9383
9384
  /* VxWorks executables are handled elsewhere; we only need to
9385
     allocate relocations in shared objects.  */
9386
0
  if (htab->root.target_os == is_vxworks && !bfd_link_pic (info))
9387
0
    return true;
9388
9389
  /* Ignore indirect symbols.  All relocations against such symbols
9390
     will be redirected to the target symbol.  */
9391
0
  if (h->root.type == bfd_link_hash_indirect)
9392
0
    return true;
9393
9394
  /* If this symbol is defined in a dynamic object, or we are creating
9395
     a shared library, we will need to copy any R_MIPS_32 or
9396
     R_MIPS_REL32 relocs against it into the output file.  */
9397
0
  if (! bfd_link_relocatable (info)
9398
0
      && hmips->possibly_dynamic_relocs != 0
9399
0
      && (h->root.type == bfd_link_hash_defweak
9400
0
    || (!h->def_regular && !ELF_COMMON_DEF_P (h))
9401
0
    || bfd_link_pic (info)))
9402
0
    {
9403
0
      bool do_copy = true;
9404
9405
0
      if (h->root.type == bfd_link_hash_undefweak)
9406
0
  {
9407
    /* Do not copy relocations for undefined weak symbols that
9408
       we are not going to export.  */
9409
0
    if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
9410
0
      do_copy = false;
9411
9412
    /* Make sure undefined weak symbols are output as a dynamic
9413
       symbol in PIEs.  */
9414
0
    else if (h->dynindx == -1 && !h->forced_local)
9415
0
      {
9416
0
        if (! bfd_elf_link_record_dynamic_symbol (info, h))
9417
0
    return false;
9418
0
      }
9419
0
  }
9420
9421
0
      if (do_copy)
9422
0
  {
9423
    /* Even though we don't directly need a GOT entry for this symbol,
9424
       the SVR4 psABI requires it to have a dynamic symbol table
9425
       index greater that DT_MIPS_GOTSYM if there are dynamic
9426
       relocations against it.
9427
9428
       VxWorks does not enforce the same mapping between the GOT
9429
       and the symbol table, so the same requirement does not
9430
       apply there.  */
9431
0
    if (htab->root.target_os != is_vxworks)
9432
0
      {
9433
0
        if (hmips->global_got_area > GGA_RELOC_ONLY)
9434
0
    hmips->global_got_area = GGA_RELOC_ONLY;
9435
0
        hmips->got_only_for_calls = false;
9436
0
      }
9437
9438
0
    mips_elf_allocate_dynamic_relocations
9439
0
      (dynobj, info, hmips->possibly_dynamic_relocs);
9440
0
    if (hmips->readonly_reloc)
9441
      /* We tell the dynamic linker that there are relocations
9442
         against the text segment.  */
9443
0
      info->flags |= DF_TEXTREL;
9444
0
  }
9445
0
    }
9446
9447
0
  return true;
9448
0
}
9449
9450
/* Adjust a symbol defined by a dynamic object and referenced by a
9451
   regular object.  The current definition is in some section of the
9452
   dynamic object, but we're not including those sections.  We have to
9453
   change the definition to something the rest of the link can
9454
   understand.  */
9455
9456
bool
9457
_bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
9458
             struct elf_link_hash_entry *h)
9459
0
{
9460
0
  bfd *dynobj;
9461
0
  struct mips_elf_link_hash_entry *hmips;
9462
0
  struct mips_elf_link_hash_table *htab;
9463
0
  asection *s, *srel;
9464
9465
0
  htab = mips_elf_hash_table (info);
9466
0
  BFD_ASSERT (htab != NULL);
9467
9468
0
  dynobj = elf_hash_table (info)->dynobj;
9469
0
  hmips = (struct mips_elf_link_hash_entry *) h;
9470
9471
  /* Make sure we know what is going on here.  */
9472
0
  if (dynobj == NULL
9473
0
      || (! h->needs_plt
9474
0
    && ! h->is_weakalias
9475
0
    && (! h->def_dynamic
9476
0
        || ! h->ref_regular
9477
0
        || h->def_regular)))
9478
0
    {
9479
0
      if (h->type == STT_GNU_IFUNC)
9480
0
  _bfd_error_handler (_("IFUNC symbol %s in dynamic symbol table - IFUNCS are not supported"),
9481
0
          h->root.root.string);
9482
0
      else
9483
0
  _bfd_error_handler (_("non-dynamic symbol %s in dynamic symbol table"),
9484
0
          h->root.root.string);
9485
0
      return true;
9486
0
    }
9487
9488
0
  hmips = (struct mips_elf_link_hash_entry *) h;
9489
9490
  /* If there are call relocations against an externally-defined symbol,
9491
     see whether we can create a MIPS lazy-binding stub for it.  We can
9492
     only do this if all references to the function are through call
9493
     relocations, and in that case, the traditional lazy-binding stubs
9494
     are much more efficient than PLT entries.
9495
9496
     Traditional stubs are only available on SVR4 psABI-based systems;
9497
     VxWorks always uses PLTs instead.  */
9498
0
  if (htab->root.target_os != is_vxworks
9499
0
      && h->needs_plt
9500
0
      && !hmips->no_fn_stub)
9501
0
    {
9502
0
      if (! elf_hash_table (info)->dynamic_sections_created)
9503
0
  return true;
9504
9505
      /* If this symbol is not defined in a regular file, then set
9506
   the symbol to the stub location.  This is required to make
9507
   function pointers compare as equal between the normal
9508
   executable and the shared library.  */
9509
0
      if (!h->def_regular
9510
0
    && !bfd_is_abs_section (htab->sstubs->output_section))
9511
0
  {
9512
0
    hmips->needs_lazy_stub = true;
9513
0
    htab->lazy_stub_count++;
9514
0
    return true;
9515
0
  }
9516
0
    }
9517
  /* As above, VxWorks requires PLT entries for externally-defined
9518
     functions that are only accessed through call relocations.
9519
9520
     Both VxWorks and non-VxWorks targets also need PLT entries if there
9521
     are static-only relocations against an externally-defined function.
9522
     This can technically occur for shared libraries if there are
9523
     branches to the symbol, although it is unlikely that this will be
9524
     used in practice due to the short ranges involved.  It can occur
9525
     for any relative or absolute relocation in executables; in that
9526
     case, the PLT entry becomes the function's canonical address.  */
9527
0
  else if (((h->needs_plt && !hmips->no_fn_stub)
9528
0
      || (h->type == STT_FUNC && hmips->has_static_relocs))
9529
0
     && htab->use_plts_and_copy_relocs
9530
0
     && !SYMBOL_CALLS_LOCAL (info, h)
9531
0
     && !(ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
9532
0
    && h->root.type == bfd_link_hash_undefweak))
9533
0
    {
9534
0
      bool micromips_p = MICROMIPS_P (info->output_bfd);
9535
0
      bool newabi_p = NEWABI_P (info->output_bfd);
9536
9537
      /* If this is the first symbol to need a PLT entry, then make some
9538
   basic setup.  Also work out PLT entry sizes.  We'll need them
9539
   for PLT offset calculations.  */
9540
0
      if (htab->plt_mips_offset + htab->plt_comp_offset == 0)
9541
0
  {
9542
0
    BFD_ASSERT (htab->root.sgotplt->size == 0);
9543
0
    BFD_ASSERT (htab->plt_got_index == 0);
9544
9545
    /* If we're using the PLT additions to the psABI, each PLT
9546
       entry is 16 bytes and the PLT0 entry is 32 bytes.
9547
       Encourage better cache usage by aligning.  We do this
9548
       lazily to avoid pessimizing traditional objects.  */
9549
0
    if (htab->root.target_os != is_vxworks
9550
0
        && !bfd_link_align_section (htab->root.splt, 5))
9551
0
      return false;
9552
9553
    /* Make sure that .got.plt is word-aligned.  We do this lazily
9554
       for the same reason as above.  */
9555
0
    if (!bfd_link_align_section (htab->root.sgotplt,
9556
0
               MIPS_ELF_LOG_FILE_ALIGN (dynobj)))
9557
0
      return false;
9558
9559
    /* On non-VxWorks targets, the first two entries in .got.plt
9560
       are reserved.  */
9561
0
    if (htab->root.target_os != is_vxworks)
9562
0
      htab->plt_got_index
9563
0
        += (get_elf_backend_data (dynobj)->got_header_size
9564
0
      / MIPS_ELF_GOT_SIZE (dynobj));
9565
9566
    /* On VxWorks, also allocate room for the header's
9567
       .rela.plt.unloaded entries.  */
9568
0
    if (htab->root.target_os == is_vxworks
9569
0
        && !bfd_link_pic (info))
9570
0
      htab->srelplt2->size += 2 * sizeof (Elf32_External_Rela);
9571
9572
    /* Now work out the sizes of individual PLT entries.  */
9573
0
    if (htab->root.target_os == is_vxworks
9574
0
        && bfd_link_pic (info))
9575
0
      htab->plt_mips_entry_size
9576
0
        = 4 * ARRAY_SIZE (mips_vxworks_shared_plt_entry);
9577
0
    else if (htab->root.target_os == is_vxworks)
9578
0
      htab->plt_mips_entry_size
9579
0
        = 4 * ARRAY_SIZE (mips_vxworks_exec_plt_entry);
9580
0
    else if (newabi_p)
9581
0
      htab->plt_mips_entry_size
9582
0
        = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9583
0
    else if (!micromips_p)
9584
0
      {
9585
0
        htab->plt_mips_entry_size
9586
0
    = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9587
0
        htab->plt_comp_entry_size
9588
0
    = 2 * ARRAY_SIZE (mips16_o32_exec_plt_entry);
9589
0
      }
9590
0
    else if (htab->insn32)
9591
0
      {
9592
0
        htab->plt_mips_entry_size
9593
0
    = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9594
0
        htab->plt_comp_entry_size
9595
0
    = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt_entry);
9596
0
      }
9597
0
    else
9598
0
      {
9599
0
        htab->plt_mips_entry_size
9600
0
    = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9601
0
        htab->plt_comp_entry_size
9602
0
    = 2 * ARRAY_SIZE (micromips_o32_exec_plt_entry);
9603
0
      }
9604
0
  }
9605
9606
0
      if (h->plt.plist == NULL)
9607
0
  h->plt.plist = mips_elf_make_plt_record (dynobj);
9608
0
      if (h->plt.plist == NULL)
9609
0
  return false;
9610
9611
      /* There are no defined MIPS16 or microMIPS PLT entries for VxWorks,
9612
   n32 or n64, so always use a standard entry there.
9613
9614
   If the symbol has a MIPS16 call stub and gets a PLT entry, then
9615
   all MIPS16 calls will go via that stub, and there is no benefit
9616
   to having a MIPS16 entry.  And in the case of call_stub a
9617
   standard entry actually has to be used as the stub ends with a J
9618
   instruction.  */
9619
0
      if (newabi_p
9620
0
    || htab->root.target_os == is_vxworks
9621
0
    || hmips->call_stub
9622
0
    || hmips->call_fp_stub)
9623
0
  {
9624
0
    h->plt.plist->need_mips = true;
9625
0
    h->plt.plist->need_comp = false;
9626
0
  }
9627
9628
      /* Otherwise, if there are no direct calls to the function, we
9629
   have a free choice of whether to use standard or compressed
9630
   entries.  Prefer microMIPS entries if the object is known to
9631
   contain microMIPS code, so that it becomes possible to create
9632
   pure microMIPS binaries.  Prefer standard entries otherwise,
9633
   because MIPS16 ones are no smaller and are usually slower.  */
9634
0
      if (!h->plt.plist->need_mips && !h->plt.plist->need_comp)
9635
0
  {
9636
0
    if (micromips_p)
9637
0
      h->plt.plist->need_comp = true;
9638
0
    else
9639
0
      h->plt.plist->need_mips = true;
9640
0
  }
9641
9642
0
      if (h->plt.plist->need_mips)
9643
0
  {
9644
0
    h->plt.plist->mips_offset = htab->plt_mips_offset;
9645
0
    htab->plt_mips_offset += htab->plt_mips_entry_size;
9646
0
  }
9647
0
      if (h->plt.plist->need_comp)
9648
0
  {
9649
0
    h->plt.plist->comp_offset = htab->plt_comp_offset;
9650
0
    htab->plt_comp_offset += htab->plt_comp_entry_size;
9651
0
  }
9652
9653
      /* Reserve the corresponding .got.plt entry now too.  */
9654
0
      h->plt.plist->gotplt_index = htab->plt_got_index++;
9655
9656
      /* If the output file has no definition of the symbol, set the
9657
   symbol's value to the address of the stub.  */
9658
0
      if (!bfd_link_pic (info) && !h->def_regular)
9659
0
  hmips->use_plt_entry = true;
9660
9661
      /* Make room for the R_MIPS_JUMP_SLOT relocation.  */
9662
0
      htab->root.srelplt->size += (htab->root.target_os == is_vxworks
9663
0
           ? MIPS_ELF_RELA_SIZE (dynobj)
9664
0
           : MIPS_ELF_REL_SIZE (dynobj));
9665
9666
      /* Make room for the .rela.plt.unloaded relocations.  */
9667
0
      if (htab->root.target_os == is_vxworks && !bfd_link_pic (info))
9668
0
  htab->srelplt2->size += 3 * sizeof (Elf32_External_Rela);
9669
9670
      /* All relocations against this symbol that could have been made
9671
   dynamic will now refer to the PLT entry instead.  */
9672
0
      hmips->possibly_dynamic_relocs = 0;
9673
9674
0
      return true;
9675
0
    }
9676
9677
  /* If this is a weak symbol, and there is a real definition, the
9678
     processor independent code will have arranged for us to see the
9679
     real definition first, and we can just use the same value.  */
9680
0
  if (h->is_weakalias)
9681
0
    {
9682
0
      struct elf_link_hash_entry *def = weakdef (h);
9683
0
      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
9684
0
      h->root.u.def.section = def->root.u.def.section;
9685
0
      h->root.u.def.value = def->root.u.def.value;
9686
0
      return true;
9687
0
    }
9688
9689
  /* Otherwise, there is nothing further to do for symbols defined
9690
     in regular objects.  */
9691
0
  if (h->def_regular)
9692
0
    return true;
9693
9694
  /* There's also nothing more to do if we'll convert all relocations
9695
     against this symbol into dynamic relocations.  */
9696
0
  if (!hmips->has_static_relocs)
9697
0
    return true;
9698
9699
  /* We're now relying on copy relocations.  Complain if we have
9700
     some that we can't convert.  */
9701
0
  if (!htab->use_plts_and_copy_relocs || bfd_link_pic (info))
9702
0
    {
9703
0
      _bfd_error_handler (_("non-dynamic relocations refer to "
9704
0
          "dynamic symbol %s"),
9705
0
        h->root.root.string);
9706
0
      bfd_set_error (bfd_error_bad_value);
9707
0
      return false;
9708
0
    }
9709
9710
  /* We must allocate the symbol in our .dynbss section, which will
9711
     become part of the .bss section of the executable.  There will be
9712
     an entry for this symbol in the .dynsym section.  The dynamic
9713
     object will contain position independent code, so all references
9714
     from the dynamic object to this symbol will go through the global
9715
     offset table.  The dynamic linker will use the .dynsym entry to
9716
     determine the address it must put in the global offset table, so
9717
     both the dynamic object and the regular object will refer to the
9718
     same memory location for the variable.  */
9719
9720
0
  if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
9721
0
    {
9722
0
      s = htab->root.sdynrelro;
9723
0
      srel = htab->root.sreldynrelro;
9724
0
    }
9725
0
  else
9726
0
    {
9727
0
      s = htab->root.sdynbss;
9728
0
      srel = htab->root.srelbss;
9729
0
    }
9730
0
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
9731
0
    {
9732
0
      if (htab->root.target_os == is_vxworks)
9733
0
  srel->size += sizeof (Elf32_External_Rela);
9734
0
      else
9735
0
  mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
9736
0
      h->needs_copy = 1;
9737
0
    }
9738
9739
  /* All relocations against this symbol that could have been made
9740
     dynamic will now refer to the local copy instead.  */
9741
0
  hmips->possibly_dynamic_relocs = 0;
9742
9743
0
  return _bfd_elf_adjust_dynamic_copy (info, h, s);
9744
0
}
9745

9746
/* If the link uses a GOT, lay it out and work out its size.  */
9747
9748
static bool
9749
mips_elf_lay_out_got (bfd *output_bfd, struct bfd_link_info *info)
9750
0
{
9751
0
  bfd *dynobj;
9752
0
  asection *s;
9753
0
  struct mips_got_info *g;
9754
0
  bfd_size_type loadable_size = 0;
9755
0
  bfd_size_type page_gotno;
9756
0
  bfd *ibfd;
9757
0
  struct mips_elf_traverse_got_arg tga;
9758
0
  struct mips_elf_link_hash_table *htab;
9759
9760
0
  htab = mips_elf_hash_table (info);
9761
0
  BFD_ASSERT (htab != NULL);
9762
9763
0
  s = htab->root.sgot;
9764
0
  if (s == NULL)
9765
0
    return true;
9766
9767
0
  dynobj = elf_hash_table (info)->dynobj;
9768
0
  g = htab->got_info;
9769
9770
  /* Allocate room for the reserved entries.  VxWorks always reserves
9771
     3 entries; other objects only reserve 2 entries.  */
9772
0
  BFD_ASSERT (g->assigned_low_gotno == 0);
9773
0
  if (htab->root.target_os == is_vxworks)
9774
0
    htab->reserved_gotno = 3;
9775
0
  else
9776
0
    htab->reserved_gotno = 2;
9777
0
  g->local_gotno += htab->reserved_gotno;
9778
0
  g->assigned_low_gotno = htab->reserved_gotno;
9779
9780
  /* Decide which symbols need to go in the global part of the GOT and
9781
     count the number of reloc-only GOT symbols.  */
9782
0
  mips_elf_link_hash_traverse (htab, mips_elf_count_got_symbols, info);
9783
9784
0
  if (!mips_elf_resolve_final_got_entries (info, g))
9785
0
    return false;
9786
9787
  /* Calculate the total loadable size of the output.  That
9788
     will give us the maximum number of GOT_PAGE entries
9789
     required.  */
9790
0
  for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
9791
0
    {
9792
0
      asection *subsection;
9793
9794
0
      for (subsection = ibfd->sections;
9795
0
     subsection;
9796
0
     subsection = subsection->next)
9797
0
  {
9798
0
    if ((subsection->flags & SEC_ALLOC) == 0)
9799
0
      continue;
9800
0
    loadable_size += ((subsection->size + 0xf)
9801
0
          &~ (bfd_size_type) 0xf);
9802
0
  }
9803
0
    }
9804
9805
0
  if (htab->root.target_os == is_vxworks)
9806
    /* There's no need to allocate page entries for VxWorks; R_MIPS*_GOT16
9807
       relocations against local symbols evaluate to "G", and the EABI does
9808
       not include R_MIPS_GOT_PAGE.  */
9809
0
    page_gotno = 0;
9810
0
  else
9811
    /* Assume there are two loadable segments consisting of contiguous
9812
       sections.  Is 5 enough?  */
9813
0
    page_gotno = (loadable_size >> 16) + 5;
9814
9815
  /* Choose the smaller of the two page estimates; both are intended to be
9816
     conservative.  */
9817
0
  if (page_gotno > g->page_gotno)
9818
0
    page_gotno = g->page_gotno;
9819
9820
0
  g->local_gotno += page_gotno;
9821
0
  g->assigned_high_gotno = g->local_gotno - 1;
9822
9823
0
  s->size += g->local_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
9824
0
  s->size += g->global_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
9825
0
  s->size += g->tls_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
9826
9827
  /* VxWorks does not support multiple GOTs.  It initializes $gp to
9828
     __GOTT_BASE__[__GOTT_INDEX__], the value of which is set by the
9829
     dynamic loader.  */
9830
0
  if (htab->root.target_os != is_vxworks
9831
0
      && s->size > MIPS_ELF_GOT_MAX_SIZE (info))
9832
0
    {
9833
0
      if (!mips_elf_multi_got (output_bfd, info, s, page_gotno))
9834
0
  return false;
9835
0
    }
9836
0
  else
9837
0
    {
9838
      /* Record that all bfds use G.  This also has the effect of freeing
9839
   the per-bfd GOTs, which we no longer need.  */
9840
0
      for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
9841
0
  if (mips_elf_bfd_got (ibfd, false))
9842
0
    mips_elf_replace_bfd_got (ibfd, g);
9843
0
      mips_elf_replace_bfd_got (output_bfd, g);
9844
9845
      /* Set up TLS entries.  */
9846
0
      g->tls_assigned_gotno = g->global_gotno + g->local_gotno;
9847
0
      tga.info = info;
9848
0
      tga.g = g;
9849
0
      tga.value = MIPS_ELF_GOT_SIZE (output_bfd);
9850
0
      htab_traverse (g->got_entries, mips_elf_initialize_tls_index, &tga);
9851
0
      if (!tga.g)
9852
0
  return false;
9853
0
      BFD_ASSERT (g->tls_assigned_gotno
9854
0
      == g->global_gotno + g->local_gotno + g->tls_gotno);
9855
9856
      /* Each VxWorks GOT entry needs an explicit relocation.  */
9857
0
      if (htab->root.target_os == is_vxworks && bfd_link_pic (info))
9858
0
  g->relocs += g->global_gotno + g->local_gotno - htab->reserved_gotno;
9859
9860
      /* Allocate room for the TLS relocations.  */
9861
0
      if (g->relocs)
9862
0
  mips_elf_allocate_dynamic_relocations (dynobj, info, g->relocs);
9863
0
    }
9864
9865
0
  return true;
9866
0
}
9867
9868
/* Estimate the size of the .MIPS.stubs section.  */
9869
9870
static void
9871
mips_elf_estimate_stub_size (bfd *output_bfd, struct bfd_link_info *info)
9872
0
{
9873
0
  struct mips_elf_link_hash_table *htab;
9874
0
  bfd_size_type dynsymcount;
9875
9876
0
  htab = mips_elf_hash_table (info);
9877
0
  BFD_ASSERT (htab != NULL);
9878
9879
0
  if (htab->lazy_stub_count == 0)
9880
0
    return;
9881
9882
  /* IRIX rld assumes that a function stub isn't at the end of the .text
9883
     section, so add a dummy entry to the end.  */
9884
0
  htab->lazy_stub_count++;
9885
9886
  /* Get a worst-case estimate of the number of dynamic symbols needed.
9887
     At this point, dynsymcount does not account for section symbols
9888
     and count_section_dynsyms may overestimate the number that will
9889
     be needed.  */
9890
0
  dynsymcount = (elf_hash_table (info)->dynsymcount
9891
0
     + count_section_dynsyms (output_bfd, info));
9892
9893
  /* Determine the size of one stub entry.  There's no disadvantage
9894
     from using microMIPS code here, so for the sake of pure-microMIPS
9895
     binaries we prefer it whenever there's any microMIPS code in
9896
     output produced at all.  This has a benefit of stubs being
9897
     shorter by 4 bytes each too, unless in the insn32 mode.  */
9898
0
  if (!MICROMIPS_P (output_bfd))
9899
0
    htab->function_stub_size = (dynsymcount > 0x10000
9900
0
        ? MIPS_FUNCTION_STUB_BIG_SIZE
9901
0
        : MIPS_FUNCTION_STUB_NORMAL_SIZE);
9902
0
  else if (htab->insn32)
9903
0
    htab->function_stub_size = (dynsymcount > 0x10000
9904
0
        ? MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE
9905
0
        : MICROMIPS_INSN32_FUNCTION_STUB_NORMAL_SIZE);
9906
0
  else
9907
0
    htab->function_stub_size = (dynsymcount > 0x10000
9908
0
        ? MICROMIPS_FUNCTION_STUB_BIG_SIZE
9909
0
        : MICROMIPS_FUNCTION_STUB_NORMAL_SIZE);
9910
9911
0
  htab->sstubs->size = htab->lazy_stub_count * htab->function_stub_size;
9912
0
}
9913
9914
/* A mips_elf_link_hash_traverse callback for which DATA points to a
9915
   mips_htab_traverse_info.  If H needs a traditional MIPS lazy-binding
9916
   stub, allocate an entry in the stubs section.  */
9917
9918
static bool
9919
mips_elf_allocate_lazy_stub (struct mips_elf_link_hash_entry *h, void *data)
9920
0
{
9921
0
  struct mips_htab_traverse_info *hti = data;
9922
0
  struct mips_elf_link_hash_table *htab;
9923
0
  struct bfd_link_info *info;
9924
0
  bfd *output_bfd;
9925
9926
0
  info = hti->info;
9927
0
  output_bfd = hti->output_bfd;
9928
0
  htab = mips_elf_hash_table (info);
9929
0
  BFD_ASSERT (htab != NULL);
9930
9931
0
  if (h->needs_lazy_stub)
9932
0
    {
9933
0
      bool micromips_p = MICROMIPS_P (output_bfd);
9934
0
      unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9935
0
      bfd_vma isa_bit = micromips_p;
9936
9937
0
      BFD_ASSERT (htab->root.dynobj != NULL);
9938
0
      if (h->root.plt.plist == NULL)
9939
0
  h->root.plt.plist = mips_elf_make_plt_record (htab->sstubs->owner);
9940
0
      if (h->root.plt.plist == NULL)
9941
0
  {
9942
0
    hti->error = true;
9943
0
    return false;
9944
0
  }
9945
0
      h->root.root.u.def.section = htab->sstubs;
9946
0
      h->root.root.u.def.value = htab->sstubs->size + isa_bit;
9947
0
      h->root.plt.plist->stub_offset = htab->sstubs->size;
9948
0
      h->root.other = other;
9949
0
      htab->sstubs->size += htab->function_stub_size;
9950
0
    }
9951
0
  return true;
9952
0
}
9953
9954
/* Allocate offsets in the stubs section to each symbol that needs one.
9955
   Set the final size of the .MIPS.stub section.  */
9956
9957
static bool
9958
mips_elf_lay_out_lazy_stubs (struct bfd_link_info *info)
9959
0
{
9960
0
  bfd *output_bfd = info->output_bfd;
9961
0
  bool micromips_p = MICROMIPS_P (output_bfd);
9962
0
  unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9963
0
  bfd_vma isa_bit = micromips_p;
9964
0
  struct mips_elf_link_hash_table *htab;
9965
0
  struct mips_htab_traverse_info hti;
9966
0
  struct elf_link_hash_entry *h;
9967
0
  bfd *dynobj;
9968
9969
0
  htab = mips_elf_hash_table (info);
9970
0
  BFD_ASSERT (htab != NULL);
9971
9972
0
  if (htab->lazy_stub_count == 0)
9973
0
    return true;
9974
9975
0
  htab->sstubs->size = 0;
9976
0
  hti.info = info;
9977
0
  hti.output_bfd = output_bfd;
9978
0
  hti.error = false;
9979
0
  mips_elf_link_hash_traverse (htab, mips_elf_allocate_lazy_stub, &hti);
9980
0
  if (hti.error)
9981
0
    return false;
9982
0
  htab->sstubs->size += htab->function_stub_size;
9983
0
  BFD_ASSERT (htab->sstubs->size
9984
0
        == htab->lazy_stub_count * htab->function_stub_size);
9985
9986
0
  dynobj = elf_hash_table (info)->dynobj;
9987
0
  BFD_ASSERT (dynobj != NULL);
9988
0
  h = _bfd_elf_define_linkage_sym (dynobj, info, htab->sstubs, "_MIPS_STUBS_");
9989
0
  if (h == NULL)
9990
0
    return false;
9991
0
  h->root.u.def.value = isa_bit;
9992
0
  h->other = other;
9993
0
  h->type = STT_FUNC;
9994
9995
0
  return true;
9996
0
}
9997
9998
/* A mips_elf_link_hash_traverse callback for which DATA points to a
9999
   bfd_link_info.  If H uses the address of a PLT entry as the value
10000
   of the symbol, then set the entry in the symbol table now.  Prefer
10001
   a standard MIPS PLT entry.  */
10002
10003
static bool
10004
mips_elf_set_plt_sym_value (struct mips_elf_link_hash_entry *h, void *data)
10005
0
{
10006
0
  struct bfd_link_info *info = data;
10007
0
  bool micromips_p = MICROMIPS_P (info->output_bfd);
10008
0
  struct mips_elf_link_hash_table *htab;
10009
0
  unsigned int other;
10010
0
  bfd_vma isa_bit;
10011
0
  bfd_vma val;
10012
10013
0
  htab = mips_elf_hash_table (info);
10014
0
  BFD_ASSERT (htab != NULL);
10015
10016
0
  if (h->use_plt_entry)
10017
0
    {
10018
0
      BFD_ASSERT (h->root.plt.plist != NULL);
10019
0
      BFD_ASSERT (h->root.plt.plist->mips_offset != MINUS_ONE
10020
0
      || h->root.plt.plist->comp_offset != MINUS_ONE);
10021
10022
0
      val = htab->plt_header_size;
10023
0
      if (h->root.plt.plist->mips_offset != MINUS_ONE)
10024
0
  {
10025
0
    isa_bit = 0;
10026
0
    val += h->root.plt.plist->mips_offset;
10027
0
    other = 0;
10028
0
  }
10029
0
      else
10030
0
  {
10031
0
    isa_bit = 1;
10032
0
    val += htab->plt_mips_offset + h->root.plt.plist->comp_offset;
10033
0
    other = micromips_p ? STO_MICROMIPS : STO_MIPS16;
10034
0
  }
10035
0
      val += isa_bit;
10036
      /* For VxWorks, point at the PLT load stub rather than the lazy
10037
   resolution stub; this stub will become the canonical function
10038
   address.  */
10039
0
      if (htab->root.target_os == is_vxworks)
10040
0
  val += 8;
10041
10042
0
      h->root.root.u.def.section = htab->root.splt;
10043
0
      h->root.root.u.def.value = val;
10044
0
      h->root.other = other;
10045
0
    }
10046
10047
0
  return true;
10048
0
}
10049
10050
/* Set the sizes of the dynamic sections, some mips non-dynamic sections,
10051
   and check for any mips16 stub sections that we can discard.  */
10052
10053
bool
10054
_bfd_mips_elf_late_size_sections (bfd *output_bfd,
10055
          struct bfd_link_info *info)
10056
0
{
10057
0
  bfd *dynobj;
10058
0
  asection *s, *sreldyn;
10059
0
  bool reltext;
10060
0
  struct mips_elf_link_hash_table *htab;
10061
0
  struct mips_htab_traverse_info hti;
10062
10063
0
  htab = mips_elf_hash_table (info);
10064
0
  BFD_ASSERT (htab != NULL);
10065
10066
  /* The .reginfo section has a fixed size.  */
10067
0
  s = bfd_get_section_by_name (output_bfd, ".reginfo");
10068
0
  if (s != NULL)
10069
0
    {
10070
0
      bfd_set_section_size (s, sizeof (Elf32_External_RegInfo));
10071
0
      s->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
10072
0
    }
10073
10074
  /* The .MIPS.abiflags section has a fixed size.  */
10075
0
  s = bfd_get_section_by_name (output_bfd, ".MIPS.abiflags");
10076
0
  if (s != NULL)
10077
0
    {
10078
0
      bfd_set_section_size (s, sizeof (Elf_External_ABIFlags_v0));
10079
0
      s->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
10080
0
    }
10081
10082
0
  hti.info = info;
10083
0
  hti.output_bfd = output_bfd;
10084
0
  hti.error = false;
10085
0
  mips_elf_link_hash_traverse (htab, mips_elf_check_symbols, &hti);
10086
0
  if (hti.error)
10087
0
    return false;
10088
10089
0
  dynobj = htab->root.dynobj;
10090
0
  if (dynobj == NULL)
10091
0
    return true;
10092
10093
0
  if (htab->root.dynamic_sections_created)
10094
0
    {
10095
      /* Set the contents of the .interp section to the interpreter.  */
10096
0
      if (bfd_link_executable (info) && !info->nointerp)
10097
0
  {
10098
0
    s = htab->root.interp;
10099
0
    BFD_ASSERT (s != NULL);
10100
0
    s->size
10101
0
      = strlen (ELF_DYNAMIC_INTERPRETER (output_bfd)) + 1;
10102
0
    s->contents
10103
0
      = (bfd_byte *) ELF_DYNAMIC_INTERPRETER (output_bfd);
10104
0
    s->alloced = 1;
10105
0
  }
10106
10107
      /* Figure out the size of the PLT header if we know that we
10108
   are using it.  For the sake of cache alignment always use
10109
   a standard header whenever any standard entries are present
10110
   even if microMIPS entries are present as well.  This also
10111
   lets the microMIPS header rely on the value of $v0 only set
10112
   by microMIPS entries, for a small size reduction.
10113
10114
   Set symbol table entry values for symbols that use the
10115
   address of their PLT entry now that we can calculate it.
10116
10117
   Also create the _PROCEDURE_LINKAGE_TABLE_ symbol if we
10118
   haven't already in _bfd_elf_create_dynamic_sections.  */
10119
0
      if (htab->root.splt && htab->plt_mips_offset + htab->plt_comp_offset != 0)
10120
0
  {
10121
0
    bool micromips_p = (MICROMIPS_P (output_bfd)
10122
0
             && !htab->plt_mips_offset);
10123
0
    unsigned int other = micromips_p ? STO_MICROMIPS : 0;
10124
0
    bfd_vma isa_bit = micromips_p;
10125
0
    struct elf_link_hash_entry *h;
10126
0
    bfd_vma size;
10127
10128
0
    BFD_ASSERT (htab->use_plts_and_copy_relocs);
10129
0
    BFD_ASSERT (htab->root.sgotplt->size == 0);
10130
0
    BFD_ASSERT (htab->root.splt->size == 0);
10131
10132
0
    if (htab->root.target_os == is_vxworks && bfd_link_pic (info))
10133
0
      size = 4 * ARRAY_SIZE (mips_vxworks_shared_plt0_entry);
10134
0
    else if (htab->root.target_os == is_vxworks)
10135
0
      size = 4 * ARRAY_SIZE (mips_vxworks_exec_plt0_entry);
10136
0
    else if (ABI_64_P (output_bfd))
10137
0
      size = 4 * ARRAY_SIZE (mips_n64_exec_plt0_entry);
10138
0
    else if (ABI_N32_P (output_bfd))
10139
0
      size = 4 * ARRAY_SIZE (mips_n32_exec_plt0_entry);
10140
0
    else if (!micromips_p)
10141
0
      size = 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry);
10142
0
    else if (htab->insn32)
10143
0
      size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry);
10144
0
    else
10145
0
      size = 2 * ARRAY_SIZE (micromips_o32_exec_plt0_entry);
10146
10147
0
    htab->plt_header_is_comp = micromips_p;
10148
0
    htab->plt_header_size = size;
10149
0
    htab->root.splt->size = (size
10150
0
           + htab->plt_mips_offset
10151
0
           + htab->plt_comp_offset);
10152
0
    htab->root.sgotplt->size = (htab->plt_got_index
10153
0
              * MIPS_ELF_GOT_SIZE (dynobj));
10154
10155
0
    mips_elf_link_hash_traverse (htab, mips_elf_set_plt_sym_value, info);
10156
10157
0
    if (htab->root.hplt == NULL)
10158
0
      {
10159
0
        h = _bfd_elf_define_linkage_sym (dynobj, info, htab->root.splt,
10160
0
                 "_PROCEDURE_LINKAGE_TABLE_");
10161
0
        htab->root.hplt = h;
10162
0
        if (h == NULL)
10163
0
    return false;
10164
0
      }
10165
10166
0
    h = htab->root.hplt;
10167
0
    h->root.u.def.value = isa_bit;
10168
0
    h->other = other;
10169
0
    h->type = STT_FUNC;
10170
0
  }
10171
0
    }
10172
10173
  /* Allocate space for global sym dynamic relocs.  */
10174
0
  elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
10175
10176
0
  mips_elf_estimate_stub_size (output_bfd, info);
10177
10178
0
  if (!mips_elf_lay_out_got (output_bfd, info))
10179
0
    return false;
10180
10181
0
  mips_elf_lay_out_lazy_stubs (info);
10182
10183
  /* The check_relocs and adjust_dynamic_symbol entry points have
10184
     determined the sizes of the various dynamic sections.  Allocate
10185
     memory for them.  */
10186
0
  reltext = false;
10187
0
  for (s = dynobj->sections; s != NULL; s = s->next)
10188
0
    {
10189
0
      const char *name;
10190
10191
      /* It's OK to base decisions on the section name, because none
10192
   of the dynobj section names depend upon the input files.  */
10193
0
      name = bfd_section_name (s);
10194
10195
0
      if ((s->flags & SEC_LINKER_CREATED) == 0)
10196
0
  continue;
10197
10198
0
      if (startswith (name, ".rel"))
10199
0
  {
10200
0
    if (s->size != 0)
10201
0
      {
10202
0
        const char *outname;
10203
0
        asection *target;
10204
10205
        /* If this relocation section applies to a read only
10206
     section, then we probably need a DT_TEXTREL entry.
10207
     If the relocation section is .rel(a).dyn, we always
10208
     assert a DT_TEXTREL entry rather than testing whether
10209
     there exists a relocation to a read only section or
10210
     not.  */
10211
0
        outname = bfd_section_name (s->output_section);
10212
0
        target = bfd_get_section_by_name (output_bfd, outname + 4);
10213
0
        if ((target != NULL
10214
0
       && (target->flags & SEC_READONLY) != 0
10215
0
       && (target->flags & SEC_ALLOC) != 0)
10216
0
      || strcmp (outname, MIPS_ELF_REL_DYN_NAME (info)) == 0)
10217
0
    reltext = true;
10218
10219
        /* We use the reloc_count field as a counter if we need
10220
     to copy relocs into the output file.  */
10221
0
        if (strcmp (name, MIPS_ELF_REL_DYN_NAME (info)) != 0)
10222
0
    s->reloc_count = 0;
10223
10224
        /* If combreloc is enabled, elf_link_sort_relocs() will
10225
     sort relocations, but in a different way than we do,
10226
     and before we're done creating relocations.  Also, it
10227
     will move them around between input sections'
10228
     relocation's contents, so our sorting would be
10229
     broken, so don't let it run.  */
10230
0
        info->combreloc = 0;
10231
0
      }
10232
0
  }
10233
0
      else if (bfd_link_executable (info)
10234
0
         && !htab->use_rld_obj_head
10235
0
         && startswith (name, ".rld_map"))
10236
0
  {
10237
    /* We add a room for __rld_map.  It will be filled in by the
10238
       rtld to contain a pointer to the _r_debug structure.  */
10239
0
    s->size += MIPS_ELF_RLD_MAP_SIZE (output_bfd);
10240
0
  }
10241
0
      else if (SGI_COMPAT (output_bfd)
10242
0
         && startswith (name, ".compact_rel"))
10243
0
  s->size += htab->compact_rel_size;
10244
0
      else if (s == htab->root.splt)
10245
0
  {
10246
    /* If the last PLT entry has a branch delay slot, allocate
10247
       room for an extra nop to fill the delay slot.  This is
10248
       for CPUs without load interlocking.  */
10249
0
    if (! LOAD_INTERLOCKS_P (output_bfd)
10250
0
        && htab->root.target_os != is_vxworks
10251
0
        && s->size > 0)
10252
0
      s->size += 4;
10253
0
  }
10254
0
      else if (! startswith (name, ".init")
10255
0
         && s != htab->root.sgot
10256
0
         && s != htab->root.sgotplt
10257
0
         && s != htab->sstubs
10258
0
         && s != htab->root.sdynbss
10259
0
         && s != htab->root.sdynrelro)
10260
0
  {
10261
    /* It's not one of our sections, so don't allocate space.  */
10262
0
    continue;
10263
0
  }
10264
10265
0
      if (s->size == 0)
10266
0
  {
10267
0
    s->flags |= SEC_EXCLUDE;
10268
0
    continue;
10269
0
  }
10270
10271
0
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
10272
0
  continue;
10273
10274
      /* Allocate memory for the section contents.  */
10275
0
      s->contents = bfd_zalloc (dynobj, s->size);
10276
0
      if (s->contents == NULL)
10277
0
  {
10278
0
    bfd_set_error (bfd_error_no_memory);
10279
0
    return false;
10280
0
  }
10281
0
      s->alloced = 1;
10282
0
    }
10283
10284
0
  if (htab->root.dynamic_sections_created)
10285
0
    {
10286
      /* Add some entries to the .dynamic section.  We fill in the
10287
   values later, in _bfd_mips_elf_finish_dynamic_sections, but we
10288
   must add the entries now so that we get the correct size for
10289
   the .dynamic section.  */
10290
10291
      /* SGI object has the equivalence of DT_DEBUG in the
10292
   DT_MIPS_RLD_MAP entry.  This must come first because glibc
10293
   only fills in DT_MIPS_RLD_MAP (not DT_DEBUG) and some tools
10294
   may only look at the first one they see.  */
10295
0
      if (!bfd_link_pic (info)
10296
0
    && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP, 0))
10297
0
  return false;
10298
10299
0
      if (bfd_link_executable (info)
10300
0
    && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP_REL, 0))
10301
0
  return false;
10302
10303
      /* The DT_DEBUG entry may be filled in by the dynamic linker and
10304
   used by the debugger.  */
10305
0
      if (bfd_link_executable (info)
10306
0
    && !SGI_COMPAT (output_bfd)
10307
0
    && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_DEBUG, 0))
10308
0
  return false;
10309
10310
0
      if (reltext
10311
0
    && (SGI_COMPAT (output_bfd)
10312
0
        || htab->root.target_os == is_vxworks))
10313
0
  info->flags |= DF_TEXTREL;
10314
10315
0
      if ((info->flags & DF_TEXTREL) != 0)
10316
0
  {
10317
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_TEXTREL, 0))
10318
0
      return false;
10319
10320
    /* Clear the DF_TEXTREL flag.  It will be set again if we
10321
       write out an actual text relocation; we may not, because
10322
       at this point we do not know whether e.g. any .eh_frame
10323
       absolute relocations have been converted to PC-relative.  */
10324
0
    info->flags &= ~DF_TEXTREL;
10325
0
  }
10326
10327
0
      if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTGOT, 0))
10328
0
  return false;
10329
10330
0
      sreldyn = mips_elf_rel_dyn_section (info, false);
10331
0
      if (htab->root.target_os == is_vxworks)
10332
0
  {
10333
    /* VxWorks uses .rela.dyn instead of .rel.dyn.  It does not
10334
       use any of the DT_MIPS_* tags.  */
10335
0
    if (sreldyn && sreldyn->size > 0)
10336
0
      {
10337
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELA, 0))
10338
0
    return false;
10339
10340
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELASZ, 0))
10341
0
    return false;
10342
10343
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELAENT, 0))
10344
0
    return false;
10345
0
      }
10346
0
  }
10347
0
      else
10348
0
  {
10349
0
    if (sreldyn && sreldyn->size > 0
10350
0
        && !bfd_is_abs_section (sreldyn->output_section))
10351
0
      {
10352
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_REL, 0))
10353
0
    return false;
10354
10355
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELSZ, 0))
10356
0
    return false;
10357
10358
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELENT, 0))
10359
0
    return false;
10360
0
      }
10361
10362
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_VERSION, 0))
10363
0
      return false;
10364
10365
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_FLAGS, 0))
10366
0
      return false;
10367
10368
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_BASE_ADDRESS, 0))
10369
0
      return false;
10370
10371
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_LOCAL_GOTNO, 0))
10372
0
      return false;
10373
10374
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_SYMTABNO, 0))
10375
0
      return false;
10376
10377
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_UNREFEXTNO, 0))
10378
0
      return false;
10379
10380
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_GOTSYM, 0))
10381
0
      return false;
10382
10383
0
    if (info->emit_gnu_hash
10384
0
        && ! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_XHASH, 0))
10385
0
      return false;
10386
10387
0
    if (IRIX_COMPAT (dynobj) == ict_irix5
10388
0
        && ! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_HIPAGENO, 0))
10389
0
      return false;
10390
10391
0
    if (IRIX_COMPAT (dynobj) == ict_irix6
10392
0
        && (bfd_get_section_by_name
10393
0
      (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (dynobj)))
10394
0
        && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_OPTIONS, 0))
10395
0
      return false;
10396
0
  }
10397
0
      if (htab->root.splt->size > 0)
10398
0
  {
10399
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTREL, 0))
10400
0
      return false;
10401
10402
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_JMPREL, 0))
10403
0
      return false;
10404
10405
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTRELSZ, 0))
10406
0
      return false;
10407
10408
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_PLTGOT, 0))
10409
0
      return false;
10410
0
  }
10411
0
      if (htab->root.target_os == is_vxworks
10412
0
    && !elf_vxworks_add_dynamic_entries (output_bfd, info))
10413
0
  return false;
10414
0
    }
10415
10416
0
  return true;
10417
0
}
10418

10419
/* REL is a relocation in INPUT_BFD that is being copied to OUTPUT_BFD.
10420
   Adjust its R_ADDEND field so that it is correct for the output file.
10421
   LOCAL_SYMS and LOCAL_SECTIONS are arrays of INPUT_BFD's local symbols
10422
   and sections respectively; both use symbol indexes.  */
10423
10424
static void
10425
mips_elf_adjust_addend (bfd *output_bfd, struct bfd_link_info *info,
10426
      bfd *input_bfd, Elf_Internal_Sym *local_syms,
10427
      asection **local_sections, Elf_Internal_Rela *rel)
10428
0
{
10429
0
  unsigned int r_type, r_symndx;
10430
0
  Elf_Internal_Sym *sym;
10431
0
  asection *sec;
10432
10433
0
  if (mips_elf_local_relocation_p (input_bfd, rel, local_sections))
10434
0
    {
10435
0
      r_type = ELF_R_TYPE (output_bfd, rel->r_info);
10436
0
      if (gprel16_reloc_p (r_type)
10437
0
    || r_type == R_MIPS_GPREL32
10438
0
    || literal_reloc_p (r_type))
10439
0
  {
10440
0
    rel->r_addend += _bfd_get_gp_value (input_bfd);
10441
0
    rel->r_addend -= _bfd_get_gp_value (output_bfd);
10442
0
  }
10443
10444
0
      r_symndx = ELF_R_SYM (output_bfd, rel->r_info);
10445
0
      sym = local_syms + r_symndx;
10446
10447
      /* Adjust REL's addend to account for section merging.  */
10448
0
      if (!bfd_link_relocatable (info))
10449
0
  {
10450
0
    sec = local_sections[r_symndx];
10451
0
    _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
10452
0
  }
10453
10454
      /* This would normally be done by the rela_normal code in elflink.c.  */
10455
0
      if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
10456
0
  rel->r_addend += local_sections[r_symndx]->output_offset;
10457
0
    }
10458
0
}
10459
10460
/* Handle relocations against symbols from removed linkonce sections,
10461
   or sections discarded by a linker script.  We use this wrapper around
10462
   RELOC_AGAINST_DISCARDED_SECTION to handle triplets of compound relocs
10463
   on 64-bit ELF targets.  In this case for any relocation handled, which
10464
   always be the first in a triplet, the remaining two have to be processed
10465
   together with the first, even if they are R_MIPS_NONE.  It is the symbol
10466
   index referred by the first reloc that applies to all the three and the
10467
   remaining two never refer to an object symbol.  And it is the final
10468
   relocation (the last non-null one) that determines the output field of
10469
   the whole relocation so retrieve the corresponding howto structure for
10470
   the relocatable field to be cleared by RELOC_AGAINST_DISCARDED_SECTION.
10471
10472
   Note that RELOC_AGAINST_DISCARDED_SECTION is a macro that uses "continue"
10473
   and therefore requires to be pasted in a loop.  It also defines a block
10474
   and does not protect any of its arguments, hence the extra brackets.  */
10475
10476
static void
10477
mips_reloc_against_discarded_section (bfd *output_bfd,
10478
              struct bfd_link_info *info,
10479
              bfd *input_bfd, asection *input_section,
10480
              Elf_Internal_Rela **rel,
10481
              const Elf_Internal_Rela **relend,
10482
              bool rel_reloc,
10483
              reloc_howto_type *howto,
10484
              bfd_byte *contents)
10485
0
{
10486
0
  elf_backend_data *bed = get_elf_backend_data (output_bfd);
10487
0
  int count = bed->s->int_rels_per_ext_rel;
10488
0
  unsigned int r_type;
10489
0
  int i;
10490
10491
0
  for (i = count - 1; i > 0; i--)
10492
0
    {
10493
0
      r_type = ELF_R_TYPE (output_bfd, (*rel)[i].r_info);
10494
0
      if (r_type != R_MIPS_NONE)
10495
0
  {
10496
0
    howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type, !rel_reloc);
10497
0
    break;
10498
0
  }
10499
0
    }
10500
0
  do
10501
0
    {
10502
0
       RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
10503
0
          (*rel), count, (*relend), R_MIPS_NONE,
10504
0
          howto, i, contents);
10505
0
    }
10506
0
  while (0);
10507
0
}
10508
10509
/* Relocate a MIPS ELF section.  */
10510
10511
int
10512
_bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
10513
        bfd *input_bfd, asection *input_section,
10514
        bfd_byte *contents, Elf_Internal_Rela *relocs,
10515
        Elf_Internal_Sym *local_syms,
10516
        asection **local_sections)
10517
0
{
10518
0
  Elf_Internal_Rela *rel;
10519
0
  const Elf_Internal_Rela *relend;
10520
0
  bfd_vma addend = 0;
10521
0
  bool use_saved_addend_p = false;
10522
10523
0
  relend = relocs + input_section->reloc_count;
10524
0
  for (rel = relocs; rel < relend; ++rel)
10525
0
    {
10526
0
      const char *name;
10527
0
      bfd_vma value = 0;
10528
0
      reloc_howto_type *howto;
10529
0
      bool cross_mode_jump_p = false;
10530
      /* TRUE if the relocation is a RELA relocation, rather than a
10531
   REL relocation.  */
10532
0
      bool rela_relocation_p = true;
10533
0
      unsigned int r_type = ELF_R_TYPE (output_bfd, rel->r_info);
10534
0
      const char *msg;
10535
0
      unsigned long r_symndx;
10536
0
      asection *sec;
10537
0
      Elf_Internal_Shdr *symtab_hdr;
10538
0
      struct elf_link_hash_entry *h;
10539
0
      bool rel_reloc;
10540
10541
0
      rel_reloc = mips_elf_rel_relocation_p (input_bfd, input_section,
10542
0
               relocs, rel);
10543
      /* Find the relocation howto for this relocation.  */
10544
0
      howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type, !rel_reloc);
10545
10546
0
      r_symndx = ELF_R_SYM (input_bfd, rel->r_info);
10547
0
      symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
10548
0
      if (mips_elf_local_relocation_p (input_bfd, rel, local_sections))
10549
0
  {
10550
0
    sec = local_sections[r_symndx];
10551
0
    h = NULL;
10552
0
  }
10553
0
      else
10554
0
  {
10555
0
    unsigned long extsymoff;
10556
10557
0
    extsymoff = 0;
10558
0
    if (!elf_bad_symtab (input_bfd))
10559
0
      extsymoff = symtab_hdr->sh_info;
10560
0
    h = elf_sym_hashes (input_bfd) [r_symndx - extsymoff];
10561
0
    while (h->root.type == bfd_link_hash_indirect
10562
0
     || h->root.type == bfd_link_hash_warning)
10563
0
      h = (struct elf_link_hash_entry *) h->root.u.i.link;
10564
10565
0
    sec = NULL;
10566
0
    if (h->root.type == bfd_link_hash_defined
10567
0
        || h->root.type == bfd_link_hash_defweak)
10568
0
      sec = h->root.u.def.section;
10569
0
  }
10570
10571
0
      if (sec != NULL && discarded_section (sec))
10572
0
  {
10573
0
    mips_reloc_against_discarded_section (output_bfd, info, input_bfd,
10574
0
            input_section, &rel, &relend,
10575
0
            rel_reloc, howto, contents);
10576
0
    continue;
10577
0
  }
10578
10579
0
      if (r_type == R_MIPS_64 && ! NEWABI_P (input_bfd))
10580
0
  {
10581
    /* Some 32-bit code uses R_MIPS_64.  In particular, people use
10582
       64-bit code, but make sure all their addresses are in the
10583
       lowermost or uppermost 32-bit section of the 64-bit address
10584
       space.  Thus, when they use an R_MIPS_64 they mean what is
10585
       usually meant by R_MIPS_32, with the exception that the
10586
       stored value is sign-extended to 64 bits.  */
10587
0
    howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, R_MIPS_32, false);
10588
10589
    /* On big-endian systems, we need to lie about the position
10590
       of the reloc.  */
10591
0
    if (bfd_big_endian (input_bfd))
10592
0
      rel->r_offset += 4;
10593
0
  }
10594
10595
0
      if (!use_saved_addend_p)
10596
0
  {
10597
    /* If these relocations were originally of the REL variety,
10598
       we must pull the addend out of the field that will be
10599
       relocated.  Otherwise, we simply use the contents of the
10600
       RELA relocation.  */
10601
0
    if (mips_elf_rel_relocation_p (input_bfd, input_section,
10602
0
           relocs, rel))
10603
0
      {
10604
0
        rela_relocation_p = false;
10605
0
        addend = mips_elf_read_rel_addend (input_bfd, input_section,
10606
0
             rel, howto, contents);
10607
0
        if (hi16_reloc_p (r_type)
10608
0
      || (got16_reloc_p (r_type)
10609
0
          && mips_elf_local_relocation_p (input_bfd, rel,
10610
0
                  local_sections))
10611
0
      || tls_hi16_reloc_p (r_type))
10612
0
    {
10613
0
      if (!mips_elf_add_lo16_rel_addend (input_bfd, input_section,
10614
0
                 rel, relend,
10615
0
                 contents, &addend))
10616
0
        {
10617
0
          if (h)
10618
0
      name = h->root.root.string;
10619
0
          else
10620
0
      name = bfd_elf_sym_name (input_bfd, symtab_hdr,
10621
0
             local_syms + r_symndx,
10622
0
             sec);
10623
          /* xgettext:c-format */
10624
0
          msg = bfd_asprintf (_("can't find matching LO16 reloc"
10625
0
              " against `%s' for %s at %#" PRIx64
10626
0
              " in section `%s'"),
10627
0
            name, howto->name,
10628
0
            (uint64_t) rel->r_offset,
10629
0
            input_section->name);
10630
0
          if (msg == NULL)
10631
0
      return false;
10632
0
          info->callbacks->warning
10633
0
      (info, msg, name, input_bfd, input_section,
10634
0
       rel->r_offset);
10635
0
        }
10636
0
    }
10637
0
        else
10638
0
    addend <<= howto->rightshift;
10639
0
      }
10640
0
    else
10641
0
      addend = rel->r_addend;
10642
0
    mips_elf_adjust_addend (output_bfd, info, input_bfd,
10643
0
          local_syms, local_sections, rel);
10644
0
  }
10645
10646
0
      if (bfd_link_relocatable (info))
10647
0
  {
10648
0
    if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd)
10649
0
        && bfd_big_endian (input_bfd))
10650
0
      rel->r_offset -= 4;
10651
10652
0
    if (!rela_relocation_p && rel->r_addend)
10653
0
      {
10654
0
        addend += rel->r_addend;
10655
0
        if (hi16_reloc_p (r_type)
10656
0
      || got16_reloc_p (r_type)
10657
0
      || tls_hi16_reloc_p (r_type))
10658
0
    addend = mips_elf_high (addend);
10659
0
        else if (r_type == R_MIPS_HIGHER)
10660
0
    addend = mips_elf_higher (addend);
10661
0
        else if (r_type == R_MIPS_HIGHEST)
10662
0
    addend = mips_elf_highest (addend);
10663
0
        else
10664
0
    addend >>= howto->rightshift;
10665
10666
        /* We use the source mask, rather than the destination
10667
     mask because the place to which we are writing will be
10668
     source of the addend in the final link.  */
10669
0
        addend &= howto->src_mask;
10670
10671
0
        if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
10672
    /* See the comment above about using R_MIPS_64 in the 32-bit
10673
       ABI.  Here, we need to update the addend.  It would be
10674
       possible to get away with just using the R_MIPS_32 reloc
10675
       but for endianness.  */
10676
0
    {
10677
0
      bfd_vma sign_bits;
10678
0
      bfd_vma low_bits;
10679
0
      bfd_vma high_bits;
10680
10681
0
      if (addend & ((bfd_vma) 1 << 31))
10682
0
#ifdef BFD64
10683
0
        sign_bits = ((bfd_vma) 1 << 32) - 1;
10684
#else
10685
        sign_bits = -1;
10686
#endif
10687
0
      else
10688
0
        sign_bits = 0;
10689
10690
      /* If we don't know that we have a 64-bit type,
10691
         do two separate stores.  */
10692
0
      if (bfd_big_endian (input_bfd))
10693
0
        {
10694
          /* Store the sign-bits (which are most significant)
10695
       first.  */
10696
0
          low_bits = sign_bits;
10697
0
          high_bits = addend;
10698
0
        }
10699
0
      else
10700
0
        {
10701
0
          low_bits = addend;
10702
0
          high_bits = sign_bits;
10703
0
        }
10704
0
      bfd_put_32 (input_bfd, low_bits,
10705
0
            contents + rel->r_offset);
10706
0
      bfd_put_32 (input_bfd, high_bits,
10707
0
            contents + rel->r_offset + 4);
10708
0
      continue;
10709
0
    }
10710
10711
0
        if (! mips_elf_perform_relocation (info, howto, rel, addend,
10712
0
             input_bfd, input_section,
10713
0
             contents, false))
10714
0
    return false;
10715
0
      }
10716
10717
    /* Go on to the next relocation.  */
10718
0
    continue;
10719
0
  }
10720
10721
      /* In the N32 and 64-bit ABIs there may be multiple consecutive
10722
   relocations for the same offset.  In that case we are
10723
   supposed to treat the output of each relocation as the addend
10724
   for the next.  */
10725
0
      if (rel + 1 < relend
10726
0
    && rel->r_offset == rel[1].r_offset
10727
0
    && ELF_R_TYPE (input_bfd, rel[1].r_info) != R_MIPS_NONE)
10728
0
  use_saved_addend_p = true;
10729
0
      else
10730
0
  use_saved_addend_p = false;
10731
10732
      /* Figure out what value we are supposed to relocate.  */
10733
0
      switch (mips_elf_calculate_relocation (output_bfd, input_bfd,
10734
0
               input_section, contents,
10735
0
               info, rel, addend, howto,
10736
0
               local_syms, local_sections,
10737
0
               &value, &name, &cross_mode_jump_p,
10738
0
               use_saved_addend_p))
10739
0
  {
10740
0
  case bfd_reloc_continue:
10741
    /* There's nothing to do.  */
10742
0
    continue;
10743
10744
0
  case bfd_reloc_undefined:
10745
    /* mips_elf_calculate_relocation already called the
10746
       undefined_symbol callback.  There's no real point in
10747
       trying to perform the relocation at this point, so we
10748
       just skip ahead to the next relocation.  */
10749
0
    continue;
10750
10751
0
  case bfd_reloc_notsupported:
10752
0
    msg = _("internal error: unsupported relocation error");
10753
0
    info->callbacks->warning
10754
0
      (info, msg, name, input_bfd, input_section, rel->r_offset);
10755
0
    return false;
10756
10757
0
  case bfd_reloc_overflow:
10758
0
    if (use_saved_addend_p)
10759
      /* Ignore overflow until we reach the last relocation for
10760
         a given location.  */
10761
0
      ;
10762
0
    else
10763
0
      {
10764
0
        struct mips_elf_link_hash_table *htab;
10765
10766
0
        htab = mips_elf_hash_table (info);
10767
0
        BFD_ASSERT (htab != NULL);
10768
0
        BFD_ASSERT (name != NULL);
10769
0
        if (!htab->small_data_overflow_reported
10770
0
      && (gprel16_reloc_p (howto->type)
10771
0
          || literal_reloc_p (howto->type)))
10772
0
    {
10773
0
      msg = _("small-data section too large;"
10774
0
        " lower small-data size limit (see option -G)");
10775
10776
0
      htab->small_data_overflow_reported = true;
10777
0
      (*info->callbacks->einfo) ("%P: %s\n", msg);
10778
0
    }
10779
0
        (*info->callbacks->reloc_overflow)
10780
0
    (info, NULL, name, howto->name, (bfd_vma) 0,
10781
0
     input_bfd, input_section, rel->r_offset);
10782
0
      }
10783
0
    break;
10784
10785
0
  case bfd_reloc_ok:
10786
0
    break;
10787
10788
0
  case bfd_reloc_outofrange:
10789
0
    msg = NULL;
10790
0
    if (jal_reloc_p (howto->type))
10791
0
      msg = (cross_mode_jump_p
10792
0
       ? _("cannot convert a jump to JALX "
10793
0
           "for a non-word-aligned address")
10794
0
       : (howto->type == R_MIPS16_26
10795
0
          ? _("jump to a non-word-aligned address")
10796
0
          : _("jump to a non-instruction-aligned address")));
10797
0
    else if (b_reloc_p (howto->type))
10798
0
      msg = (cross_mode_jump_p
10799
0
       ? _("cannot convert a branch to JALX "
10800
0
           "for a non-word-aligned address")
10801
0
       : _("branch to a non-instruction-aligned address"));
10802
0
    else if (aligned_pcrel_reloc_p (howto->type))
10803
0
      msg = _("PC-relative load from unaligned address");
10804
0
    if (msg)
10805
0
      {
10806
0
        info->callbacks->einfo
10807
0
    ("%X%H: %s\n", input_bfd, input_section, rel->r_offset, msg);
10808
0
        break;
10809
0
      }
10810
    /* Fall through.  */
10811
10812
0
  default:
10813
0
    abort ();
10814
0
    break;
10815
0
  }
10816
10817
      /* If we've got another relocation for the address, keep going
10818
   until we reach the last one.  */
10819
0
      if (use_saved_addend_p)
10820
0
  {
10821
0
    addend = value;
10822
0
    continue;
10823
0
  }
10824
10825
0
      if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
10826
  /* See the comment above about using R_MIPS_64 in the 32-bit
10827
     ABI.  Until now, we've been using the HOWTO for R_MIPS_32;
10828
     that calculated the right value.  Now, however, we
10829
     sign-extend the 32-bit result to 64-bits, and store it as a
10830
     64-bit value.  We are especially generous here in that we
10831
     go to extreme lengths to support this usage on systems with
10832
     only a 32-bit VMA.  */
10833
0
  {
10834
0
    bfd_vma sign_bits;
10835
0
    bfd_vma low_bits;
10836
0
    bfd_vma high_bits;
10837
10838
0
    if (value & ((bfd_vma) 1 << 31))
10839
0
#ifdef BFD64
10840
0
      sign_bits = ((bfd_vma) 1 << 32) - 1;
10841
#else
10842
      sign_bits = -1;
10843
#endif
10844
0
    else
10845
0
      sign_bits = 0;
10846
10847
    /* If we don't know that we have a 64-bit type,
10848
       do two separate stores.  */
10849
0
    if (bfd_big_endian (input_bfd))
10850
0
      {
10851
        /* Undo what we did above.  */
10852
0
        rel->r_offset -= 4;
10853
        /* Store the sign-bits (which are most significant)
10854
     first.  */
10855
0
        low_bits = sign_bits;
10856
0
        high_bits = value;
10857
0
      }
10858
0
    else
10859
0
      {
10860
0
        low_bits = value;
10861
0
        high_bits = sign_bits;
10862
0
      }
10863
0
    bfd_put_32 (input_bfd, low_bits,
10864
0
          contents + rel->r_offset);
10865
0
    bfd_put_32 (input_bfd, high_bits,
10866
0
          contents + rel->r_offset + 4);
10867
0
    continue;
10868
0
  }
10869
10870
      /* Actually perform the relocation.  */
10871
0
      if (! mips_elf_perform_relocation (info, howto, rel, value,
10872
0
           input_bfd, input_section,
10873
0
           contents, cross_mode_jump_p))
10874
0
  return false;
10875
0
    }
10876
10877
0
  return true;
10878
0
}
10879

10880
/* A function that iterates over each entry in la25_stubs and fills
10881
   in the code for each one.  DATA points to a mips_htab_traverse_info.  */
10882
10883
static int
10884
mips_elf_create_la25_stub (void **slot, void *data)
10885
0
{
10886
0
  struct mips_htab_traverse_info *hti;
10887
0
  struct mips_elf_link_hash_table *htab;
10888
0
  struct mips_elf_la25_stub *stub;
10889
0
  asection *s;
10890
0
  bfd_byte *loc;
10891
0
  bfd_vma offset, target, target_high, target_low;
10892
0
  bfd_vma branch_pc;
10893
0
  bfd_signed_vma pcrel_offset = 0;
10894
10895
0
  stub = (struct mips_elf_la25_stub *) *slot;
10896
0
  hti = (struct mips_htab_traverse_info *) data;
10897
0
  htab = mips_elf_hash_table (hti->info);
10898
0
  BFD_ASSERT (htab != NULL);
10899
10900
  /* Create the section contents, if we haven't already.  */
10901
0
  s = stub->stub_section;
10902
0
  loc = s->contents;
10903
0
  if (loc == NULL)
10904
0
    {
10905
0
      loc = bfd_malloc (s->size);
10906
0
      if (loc == NULL)
10907
0
  {
10908
0
    hti->error = true;
10909
0
    return false;
10910
0
  }
10911
0
      s->contents = loc;
10912
0
    }
10913
10914
  /* Work out where in the section this stub should go.  */
10915
0
  offset = stub->offset;
10916
10917
  /* We add 8 here to account for the LUI/ADDIU instructions
10918
     before the branch instruction.  This cannot be moved down to
10919
     where pcrel_offset is calculated as 's' is updated in
10920
     mips_elf_get_la25_target.  */
10921
0
  branch_pc = s->output_section->vma + s->output_offset + offset + 8;
10922
10923
  /* Work out the target address.  */
10924
0
  target = mips_elf_get_la25_target (stub, &s);
10925
0
  target += s->output_section->vma + s->output_offset;
10926
10927
0
  target_high = ((target + 0x8000) >> 16) & 0xffff;
10928
0
  target_low = (target & 0xffff);
10929
10930
  /* Calculate the PC of the compact branch instruction (for the case where
10931
     compact branches are used for either microMIPSR6 or MIPSR6 with
10932
     compact branches.  Add 4-bytes to account for BC using the PC of the
10933
     next instruction as the base.  */
10934
0
  pcrel_offset = target - (branch_pc + 4);
10935
10936
0
  if (stub->stub_section != htab->strampoline)
10937
0
    {
10938
      /* This is a simple LUI/ADDIU stub.  Zero out the beginning
10939
   of the section and write the two instructions at the end.  */
10940
0
      memset (loc, 0, offset);
10941
0
      loc += offset;
10942
0
      if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
10943
0
  {
10944
0
    bfd_put_micromips_32 (hti->output_bfd,
10945
0
        LA25_LUI_MICROMIPS (target_high),
10946
0
        loc);
10947
0
    bfd_put_micromips_32 (hti->output_bfd,
10948
0
        LA25_ADDIU_MICROMIPS (target_low),
10949
0
        loc + 4);
10950
0
  }
10951
0
      else
10952
0
  {
10953
0
    bfd_put_32 (hti->output_bfd, LA25_LUI (target_high), loc);
10954
0
    bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 4);
10955
0
  }
10956
0
    }
10957
0
  else
10958
0
    {
10959
      /* This is trampoline.  */
10960
0
      loc += offset;
10961
0
      if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
10962
0
  {
10963
0
    bfd_put_micromips_32 (hti->output_bfd,
10964
0
        LA25_LUI_MICROMIPS (target_high), loc);
10965
0
    bfd_put_micromips_32 (hti->output_bfd,
10966
0
        LA25_J_MICROMIPS (target), loc + 4);
10967
0
    bfd_put_micromips_32 (hti->output_bfd,
10968
0
        LA25_ADDIU_MICROMIPS (target_low), loc + 8);
10969
0
    bfd_put_32 (hti->output_bfd, 0, loc + 12);
10970
0
  }
10971
0
      else
10972
0
  {
10973
0
    bfd_put_32 (hti->output_bfd, LA25_LUI (target_high), loc);
10974
0
    if (MIPSR6_P (hti->output_bfd) && htab->compact_branches)
10975
0
      {
10976
0
        bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 4);
10977
0
        bfd_put_32 (hti->output_bfd, LA25_BC (pcrel_offset), loc + 8);
10978
0
      }
10979
0
    else
10980
0
      {
10981
0
        bfd_put_32 (hti->output_bfd, LA25_J (target), loc + 4);
10982
0
        bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 8);
10983
0
      }
10984
0
    bfd_put_32 (hti->output_bfd, 0, loc + 12);
10985
0
  }
10986
0
    }
10987
0
  return true;
10988
0
}
10989
10990
/* If NAME is one of the special IRIX6 symbols defined by the linker,
10991
   adjust it appropriately now.  */
10992
10993
static void
10994
mips_elf_irix6_finish_dynamic_symbol (bfd *abfd ATTRIBUTE_UNUSED,
10995
              const char *name, Elf_Internal_Sym *sym)
10996
0
{
10997
  /* The linker script takes care of providing names and values for
10998
     these, but we must place them into the right sections.  */
10999
0
  static const char* const text_section_symbols[] = {
11000
0
    "_ftext",
11001
0
    "_etext",
11002
0
    "__dso_displacement",
11003
0
    "__elf_header",
11004
0
    "__program_header_table",
11005
0
    NULL
11006
0
  };
11007
11008
0
  static const char* const data_section_symbols[] = {
11009
0
    "_fdata",
11010
0
    "_edata",
11011
0
    "_end",
11012
0
    "_fbss",
11013
0
    NULL
11014
0
  };
11015
11016
0
  const char* const *p;
11017
0
  int i;
11018
11019
0
  for (i = 0; i < 2; ++i)
11020
0
    for (p = (i == 0) ? text_section_symbols : data_section_symbols;
11021
0
   *p;
11022
0
   ++p)
11023
0
      if (strcmp (*p, name) == 0)
11024
0
  {
11025
    /* All of these symbols are given type STT_SECTION by the
11026
       IRIX6 linker.  */
11027
0
    sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11028
0
    sym->st_other = STO_PROTECTED;
11029
11030
    /* The IRIX linker puts these symbols in special sections.  */
11031
0
    if (i == 0)
11032
0
      sym->st_shndx = SHN_MIPS_TEXT;
11033
0
    else
11034
0
      sym->st_shndx = SHN_MIPS_DATA;
11035
11036
0
    break;
11037
0
  }
11038
0
}
11039
11040
/* Finish up dynamic symbol handling.  We set the contents of various
11041
   dynamic sections here.  */
11042
11043
bool
11044
_bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
11045
             struct bfd_link_info *info,
11046
             struct elf_link_hash_entry *h,
11047
             Elf_Internal_Sym *sym)
11048
0
{
11049
0
  bfd *dynobj;
11050
0
  asection *sgot;
11051
0
  struct mips_got_info *g, *gg;
11052
0
  const char *name;
11053
0
  int idx;
11054
0
  struct mips_elf_link_hash_table *htab;
11055
0
  struct mips_elf_link_hash_entry *hmips;
11056
11057
0
  htab = mips_elf_hash_table (info);
11058
0
  BFD_ASSERT (htab != NULL);
11059
0
  dynobj = elf_hash_table (info)->dynobj;
11060
0
  hmips = (struct mips_elf_link_hash_entry *) h;
11061
11062
0
  BFD_ASSERT (htab->root.target_os != is_vxworks);
11063
11064
0
  if (h->plt.plist != NULL
11065
0
      && (h->plt.plist->mips_offset != MINUS_ONE
11066
0
    || h->plt.plist->comp_offset != MINUS_ONE))
11067
0
    {
11068
      /* We've decided to create a PLT entry for this symbol.  */
11069
0
      bfd_byte *loc;
11070
0
      bfd_vma header_address, got_address;
11071
0
      bfd_vma got_address_high, got_address_low, load;
11072
0
      bfd_vma got_index;
11073
0
      bfd_vma isa_bit;
11074
11075
0
      got_index = h->plt.plist->gotplt_index;
11076
11077
0
      BFD_ASSERT (htab->use_plts_and_copy_relocs);
11078
0
      BFD_ASSERT (h->dynindx != -1);
11079
0
      BFD_ASSERT (htab->root.splt != NULL);
11080
0
      BFD_ASSERT (got_index != MINUS_ONE);
11081
0
      BFD_ASSERT (!h->def_regular);
11082
11083
      /* Calculate the address of the PLT header.  */
11084
0
      isa_bit = htab->plt_header_is_comp;
11085
0
      header_address = (htab->root.splt->output_section->vma
11086
0
      + htab->root.splt->output_offset + isa_bit);
11087
11088
      /* Calculate the address of the .got.plt entry.  */
11089
0
      got_address = (htab->root.sgotplt->output_section->vma
11090
0
         + htab->root.sgotplt->output_offset
11091
0
         + got_index * MIPS_ELF_GOT_SIZE (dynobj));
11092
11093
0
      got_address_high = ((got_address + 0x8000) >> 16) & 0xffff;
11094
0
      got_address_low = got_address & 0xffff;
11095
11096
      /* The PLT sequence is not safe for N64 if .got.plt entry's address
11097
   cannot be loaded in two instructions.  */
11098
0
      if (ABI_64_P (output_bfd)
11099
0
    && ((got_address + 0x80008000) & ~(bfd_vma) 0xffffffff) != 0)
11100
0
  {
11101
0
    _bfd_error_handler
11102
      /* xgettext:c-format */
11103
0
      (_("%pB: `%pA' entry VMA of %#" PRIx64 " outside the 32-bit range "
11104
0
         "supported; consider using `-Ttext-segment=...'"),
11105
0
       output_bfd,
11106
0
       htab->root.sgotplt->output_section,
11107
0
       (int64_t) got_address);
11108
0
    bfd_set_error (bfd_error_no_error);
11109
0
    return false;
11110
0
  }
11111
11112
      /* Initially point the .got.plt entry at the PLT header.  */
11113
0
      loc = (htab->root.sgotplt->contents
11114
0
       + got_index * MIPS_ELF_GOT_SIZE (dynobj));
11115
0
      if (ABI_64_P (output_bfd))
11116
0
  bfd_put_64 (output_bfd, header_address, loc);
11117
0
      else
11118
0
  bfd_put_32 (output_bfd, header_address, loc);
11119
11120
      /* Now handle the PLT itself.  First the standard entry (the order
11121
   does not matter, we just have to pick one).  */
11122
0
      if (h->plt.plist->mips_offset != MINUS_ONE)
11123
0
  {
11124
0
    const bfd_vma *plt_entry;
11125
0
    bfd_vma plt_offset;
11126
11127
0
    plt_offset = htab->plt_header_size + h->plt.plist->mips_offset;
11128
11129
0
    BFD_ASSERT (plt_offset <= htab->root.splt->size);
11130
11131
    /* Find out where the .plt entry should go.  */
11132
0
    loc = htab->root.splt->contents + plt_offset;
11133
11134
    /* Pick the load opcode.  */
11135
0
    load = MIPS_ELF_LOAD_WORD (output_bfd);
11136
11137
    /* Fill in the PLT entry itself.  */
11138
11139
0
    if (MIPSR6_P (output_bfd))
11140
0
      plt_entry = htab->compact_branches ? mipsr6_exec_plt_entry_compact
11141
0
                 : mipsr6_exec_plt_entry;
11142
0
    else
11143
0
      plt_entry = mips_exec_plt_entry;
11144
0
    bfd_put_32 (output_bfd, plt_entry[0] | got_address_high, loc);
11145
0
    bfd_put_32 (output_bfd, plt_entry[1] | got_address_low | load,
11146
0
          loc + 4);
11147
11148
0
    if (! LOAD_INTERLOCKS_P (output_bfd)
11149
0
        || (MIPSR6_P (output_bfd) && htab->compact_branches))
11150
0
      {
11151
0
        bfd_put_32 (output_bfd, plt_entry[2] | got_address_low, loc + 8);
11152
0
        bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
11153
0
      }
11154
0
    else
11155
0
      {
11156
0
        bfd_put_32 (output_bfd, plt_entry[3], loc + 8);
11157
0
        bfd_put_32 (output_bfd, plt_entry[2] | got_address_low,
11158
0
        loc + 12);
11159
0
      }
11160
0
  }
11161
11162
      /* Now the compressed entry.  They come after any standard ones.  */
11163
0
      if (h->plt.plist->comp_offset != MINUS_ONE)
11164
0
  {
11165
0
    bfd_vma plt_offset;
11166
11167
0
    plt_offset = (htab->plt_header_size + htab->plt_mips_offset
11168
0
      + h->plt.plist->comp_offset);
11169
11170
0
    BFD_ASSERT (plt_offset <= htab->root.splt->size);
11171
11172
    /* Find out where the .plt entry should go.  */
11173
0
    loc = htab->root.splt->contents + plt_offset;
11174
11175
    /* Fill in the PLT entry itself.  */
11176
0
    if (!MICROMIPS_P (output_bfd))
11177
0
      {
11178
0
        const bfd_vma *plt_entry = mips16_o32_exec_plt_entry;
11179
11180
0
        bfd_put_16 (output_bfd, plt_entry[0], loc);
11181
0
        bfd_put_16 (output_bfd, plt_entry[1], loc + 2);
11182
0
        bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11183
0
        bfd_put_16 (output_bfd, plt_entry[3], loc + 6);
11184
0
        bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11185
0
        bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
11186
0
        bfd_put_32 (output_bfd, got_address, loc + 12);
11187
0
      }
11188
0
    else if (htab->insn32)
11189
0
      {
11190
0
        const bfd_vma *plt_entry = micromips_insn32_o32_exec_plt_entry;
11191
11192
0
        bfd_put_16 (output_bfd, plt_entry[0], loc);
11193
0
        bfd_put_16 (output_bfd, got_address_high, loc + 2);
11194
0
        bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11195
0
        bfd_put_16 (output_bfd, got_address_low, loc + 6);
11196
0
        bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11197
0
        bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
11198
0
        bfd_put_16 (output_bfd, plt_entry[6], loc + 12);
11199
0
        bfd_put_16 (output_bfd, got_address_low, loc + 14);
11200
0
      }
11201
0
    else
11202
0
      {
11203
0
        const bfd_vma *plt_entry = micromips_o32_exec_plt_entry;
11204
0
        bfd_signed_vma gotpc_offset;
11205
0
        bfd_vma loc_address;
11206
11207
0
        BFD_ASSERT (got_address % 4 == 0);
11208
11209
0
        loc_address = (htab->root.splt->output_section->vma
11210
0
           + htab->root.splt->output_offset + plt_offset);
11211
0
        gotpc_offset = got_address - ((loc_address | 3) ^ 3);
11212
11213
        /* ADDIUPC has a span of +/-16MB, check we're in range.  */
11214
0
        if (gotpc_offset + 0x1000000 >= 0x2000000)
11215
0
    {
11216
0
      _bfd_error_handler
11217
        /* xgettext:c-format */
11218
0
        (_("%pB: `%pA' offset of %" PRId64 " from `%pA' "
11219
0
           "beyond the range of ADDIUPC"),
11220
0
         output_bfd,
11221
0
         htab->root.sgotplt->output_section,
11222
0
         (int64_t) gotpc_offset,
11223
0
         htab->root.splt->output_section);
11224
0
      bfd_set_error (bfd_error_no_error);
11225
0
      return false;
11226
0
    }
11227
0
        bfd_put_16 (output_bfd,
11228
0
        plt_entry[0] | ((gotpc_offset >> 18) & 0x7f), loc);
11229
0
        bfd_put_16 (output_bfd, (gotpc_offset >> 2) & 0xffff, loc + 2);
11230
0
        bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11231
0
        bfd_put_16 (output_bfd, plt_entry[3], loc + 6);
11232
0
        bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11233
0
        bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
11234
0
      }
11235
0
  }
11236
11237
      /* Emit an R_MIPS_JUMP_SLOT relocation against the .got.plt entry.  */
11238
0
      mips_elf_output_dynamic_relocation (output_bfd, htab->root.srelplt,
11239
0
            got_index - 2, h->dynindx,
11240
0
            R_MIPS_JUMP_SLOT, got_address);
11241
11242
      /* We distinguish between PLT entries and lazy-binding stubs by
11243
   giving the former an st_other value of STO_MIPS_PLT.  Set the
11244
   flag and leave the value if there are any relocations in the
11245
   binary where pointer equality matters.  */
11246
0
      sym->st_shndx = SHN_UNDEF;
11247
0
      if (h->pointer_equality_needed)
11248
0
  sym->st_other = ELF_ST_SET_MIPS_PLT (sym->st_other);
11249
0
      else
11250
0
  {
11251
0
    sym->st_value = 0;
11252
0
    sym->st_other = 0;
11253
0
  }
11254
0
    }
11255
11256
0
  if (h->plt.plist != NULL && h->plt.plist->stub_offset != MINUS_ONE)
11257
0
    {
11258
      /* We've decided to create a lazy-binding stub.  */
11259
0
      bool micromips_p = MICROMIPS_P (output_bfd);
11260
0
      unsigned int other = micromips_p ? STO_MICROMIPS : 0;
11261
0
      bfd_vma stub_size = htab->function_stub_size;
11262
0
      bfd_byte stub[MIPS_FUNCTION_STUB_BIG_SIZE];
11263
0
      bfd_vma isa_bit = micromips_p;
11264
0
      bfd_vma stub_big_size;
11265
11266
0
      if (!micromips_p)
11267
0
  stub_big_size = MIPS_FUNCTION_STUB_BIG_SIZE;
11268
0
      else if (htab->insn32)
11269
0
  stub_big_size = MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE;
11270
0
      else
11271
0
  stub_big_size = MICROMIPS_FUNCTION_STUB_BIG_SIZE;
11272
11273
      /* This symbol has a stub.  Set it up.  */
11274
11275
0
      BFD_ASSERT (h->dynindx != -1);
11276
11277
0
      BFD_ASSERT (stub_size == stub_big_size || h->dynindx <= 0xffff);
11278
11279
      /* Values up to 2^31 - 1 are allowed.  Larger values would cause
11280
   sign extension at runtime in the stub, resulting in a negative
11281
   index value.  */
11282
0
      if (h->dynindx & ~0x7fffffff)
11283
0
  {
11284
0
    _bfd_error_handler
11285
0
      (_("%pB: cannot handle more than %d dynamic symbols"),
11286
0
       output_bfd, 0x7fffffff);
11287
0
    bfd_set_error (bfd_error_bad_value);
11288
0
    return false;
11289
0
  }
11290
11291
      /* Fill the stub.  */
11292
0
      if (micromips_p)
11293
0
  {
11294
0
    idx = 0;
11295
0
    bfd_put_micromips_32 (output_bfd, STUB_LW_MICROMIPS (output_bfd),
11296
0
        stub + idx);
11297
0
    idx += 4;
11298
0
    if (htab->insn32)
11299
0
      {
11300
0
        bfd_put_micromips_32 (output_bfd,
11301
0
            STUB_MOVE32_MICROMIPS, stub + idx);
11302
0
        idx += 4;
11303
0
      }
11304
0
    else
11305
0
      {
11306
0
        bfd_put_16 (output_bfd, STUB_MOVE_MICROMIPS, stub + idx);
11307
0
        idx += 2;
11308
0
      }
11309
0
    if (stub_size == stub_big_size)
11310
0
      {
11311
0
        long dynindx_hi = (h->dynindx >> 16) & 0x7fff;
11312
11313
0
        bfd_put_micromips_32 (output_bfd,
11314
0
            STUB_LUI_MICROMIPS (dynindx_hi),
11315
0
            stub + idx);
11316
0
        idx += 4;
11317
0
      }
11318
0
    if (htab->insn32)
11319
0
      {
11320
0
        bfd_put_micromips_32 (output_bfd, STUB_JALR32_MICROMIPS,
11321
0
            stub + idx);
11322
0
        idx += 4;
11323
0
      }
11324
0
    else
11325
0
      {
11326
0
        bfd_put_16 (output_bfd, STUB_JALR_MICROMIPS, stub + idx);
11327
0
        idx += 2;
11328
0
      }
11329
11330
    /* If a large stub is not required and sign extension is not a
11331
       problem, then use legacy code in the stub.  */
11332
0
    if (stub_size == stub_big_size)
11333
0
      bfd_put_micromips_32 (output_bfd,
11334
0
          STUB_ORI_MICROMIPS (h->dynindx & 0xffff),
11335
0
          stub + idx);
11336
0
    else if (h->dynindx & ~0x7fff)
11337
0
      bfd_put_micromips_32 (output_bfd,
11338
0
          STUB_LI16U_MICROMIPS (h->dynindx & 0xffff),
11339
0
          stub + idx);
11340
0
    else
11341
0
      bfd_put_micromips_32 (output_bfd,
11342
0
          STUB_LI16S_MICROMIPS (output_bfd,
11343
0
              h->dynindx),
11344
0
          stub + idx);
11345
0
  }
11346
0
      else
11347
0
  {
11348
0
    idx = 0;
11349
0
    bfd_put_32 (output_bfd, STUB_LW (output_bfd), stub + idx);
11350
0
    idx += 4;
11351
0
    bfd_put_32 (output_bfd, STUB_MOVE, stub + idx);
11352
0
    idx += 4;
11353
0
    if (stub_size == stub_big_size)
11354
0
      {
11355
0
        bfd_put_32 (output_bfd, STUB_LUI ((h->dynindx >> 16) & 0x7fff),
11356
0
        stub + idx);
11357
0
        idx += 4;
11358
0
      }
11359
11360
0
    if (!(MIPSR6_P (output_bfd) && htab->compact_branches))
11361
0
      {
11362
0
        bfd_put_32 (output_bfd, STUB_JALR, stub + idx);
11363
0
        idx += 4;
11364
0
      }
11365
11366
    /* If a large stub is not required and sign extension is not a
11367
       problem, then use legacy code in the stub.  */
11368
0
    if (stub_size == stub_big_size)
11369
0
      bfd_put_32 (output_bfd, STUB_ORI (h->dynindx & 0xffff),
11370
0
      stub + idx);
11371
0
    else if (h->dynindx & ~0x7fff)
11372
0
      bfd_put_32 (output_bfd, STUB_LI16U (h->dynindx & 0xffff),
11373
0
      stub + idx);
11374
0
    else
11375
0
      bfd_put_32 (output_bfd, STUB_LI16S (output_bfd, h->dynindx),
11376
0
      stub + idx);
11377
0
    idx += 4;
11378
11379
0
    if (MIPSR6_P (output_bfd) && htab->compact_branches)
11380
0
      bfd_put_32 (output_bfd, STUB_JALRC, stub + idx);
11381
0
  }
11382
11383
0
      BFD_ASSERT (h->plt.plist->stub_offset <= htab->sstubs->size);
11384
0
      memcpy (htab->sstubs->contents + h->plt.plist->stub_offset,
11385
0
        stub, stub_size);
11386
11387
      /* Mark the symbol as undefined.  stub_offset != -1 occurs
11388
   only for the referenced symbol.  */
11389
0
      sym->st_shndx = SHN_UNDEF;
11390
11391
      /* The run-time linker uses the st_value field of the symbol
11392
   to reset the global offset table entry for this external
11393
   to its stub address when unlinking a shared object.  */
11394
0
      sym->st_value = (htab->sstubs->output_section->vma
11395
0
           + htab->sstubs->output_offset
11396
0
           + h->plt.plist->stub_offset
11397
0
           + isa_bit);
11398
0
      sym->st_other = other;
11399
0
    }
11400
11401
  /* If we have a MIPS16 function with a stub, the dynamic symbol must
11402
     refer to the stub, since only the stub uses the standard calling
11403
     conventions.  */
11404
0
  if (h->dynindx != -1 && hmips->fn_stub != NULL)
11405
0
    {
11406
0
      BFD_ASSERT (hmips->need_fn_stub);
11407
0
      sym->st_value = (hmips->fn_stub->output_section->vma
11408
0
           + hmips->fn_stub->output_offset);
11409
0
      sym->st_size = hmips->fn_stub->size;
11410
0
      sym->st_other = ELF_ST_VISIBILITY (sym->st_other);
11411
0
    }
11412
11413
0
  BFD_ASSERT (h->dynindx != -1
11414
0
        || h->forced_local);
11415
11416
0
  sgot = htab->root.sgot;
11417
0
  g = htab->got_info;
11418
0
  BFD_ASSERT (g != NULL);
11419
11420
  /* Run through the global symbol table, creating GOT entries for all
11421
     the symbols that need them.  */
11422
0
  if (hmips->global_got_area != GGA_NONE)
11423
0
    {
11424
0
      bfd_vma offset;
11425
0
      bfd_vma value;
11426
11427
0
      value = sym->st_value;
11428
0
      offset = mips_elf_primary_global_got_index (output_bfd, info, h);
11429
0
      MIPS_ELF_PUT_WORD (output_bfd, value, sgot->contents + offset);
11430
0
    }
11431
11432
0
  if (hmips->global_got_area != GGA_NONE && g->next)
11433
0
    {
11434
0
      struct mips_got_entry e, *p;
11435
0
      bfd_vma entry;
11436
0
      bfd_vma offset;
11437
11438
0
      gg = g;
11439
11440
0
      e.abfd = output_bfd;
11441
0
      e.symndx = -1;
11442
0
      e.d.h = hmips;
11443
0
      e.tls_type = GOT_TLS_NONE;
11444
11445
0
      for (g = g->next; g->next != gg; g = g->next)
11446
0
  {
11447
0
    if (g->got_entries
11448
0
        && (p = (struct mips_got_entry *) htab_find (g->got_entries,
11449
0
                 &e)))
11450
0
      {
11451
0
        offset = p->gotidx;
11452
0
        BFD_ASSERT (offset > 0 && offset < htab->root.sgot->size);
11453
0
        if (bfd_link_pic (info)
11454
0
      || (elf_hash_table (info)->dynamic_sections_created
11455
0
          && p->d.h != NULL
11456
0
          && p->d.h->root.def_dynamic
11457
0
          && !p->d.h->root.def_regular))
11458
0
    {
11459
      /* Create an R_MIPS_REL32 relocation for this entry.  Due to
11460
         the various compatibility problems, it's easier to mock
11461
         up an R_MIPS_32 or R_MIPS_64 relocation and leave
11462
         mips_elf_create_dynamic_relocation to calculate the
11463
         appropriate addend.  */
11464
0
      Elf_Internal_Rela rel[3];
11465
11466
0
      memset (rel, 0, sizeof (rel));
11467
0
      if (ABI_64_P (output_bfd))
11468
0
        rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_64);
11469
0
      else
11470
0
        rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_32);
11471
0
      rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
11472
11473
0
      entry = 0;
11474
0
      if (! (mips_elf_create_dynamic_relocation
11475
0
       (output_bfd, info, rel,
11476
0
        e.d.h, NULL, sym->st_value, &entry, sgot)))
11477
0
        return false;
11478
0
    }
11479
0
        else
11480
0
    entry = sym->st_value;
11481
0
        MIPS_ELF_PUT_WORD (output_bfd, entry, sgot->contents + offset);
11482
0
      }
11483
0
  }
11484
0
    }
11485
11486
  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
11487
0
  name = h->root.root.string;
11488
0
  if (h == elf_hash_table (info)->hdynamic
11489
0
      || h == elf_hash_table (info)->hgot)
11490
0
    sym->st_shndx = SHN_ABS;
11491
0
  else if (strcmp (name, "_DYNAMIC_LINK") == 0
11492
0
     || strcmp (name, "_DYNAMIC_LINKING") == 0)
11493
0
    {
11494
0
      sym->st_shndx = SHN_ABS;
11495
0
      sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11496
0
      sym->st_value = 1;
11497
0
    }
11498
0
  else if (SGI_COMPAT (output_bfd))
11499
0
    {
11500
0
      if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
11501
0
    || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
11502
0
  {
11503
0
    sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11504
0
    sym->st_other = STO_PROTECTED;
11505
0
    sym->st_value = 0;
11506
0
    sym->st_shndx = SHN_MIPS_DATA;
11507
0
  }
11508
0
      else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
11509
0
  {
11510
0
    sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11511
0
    sym->st_other = STO_PROTECTED;
11512
0
    sym->st_value = mips_elf_hash_table (info)->procedure_count;
11513
0
    sym->st_shndx = SHN_ABS;
11514
0
  }
11515
0
      else if (sym->st_shndx != SHN_UNDEF && sym->st_shndx != SHN_ABS)
11516
0
  {
11517
0
    if (h->type == STT_FUNC)
11518
0
      sym->st_shndx = SHN_MIPS_TEXT;
11519
0
    else if (h->type == STT_OBJECT)
11520
0
      sym->st_shndx = SHN_MIPS_DATA;
11521
0
  }
11522
0
    }
11523
11524
  /* Emit a copy reloc, if needed.  */
11525
0
  if (h->needs_copy)
11526
0
    {
11527
0
      asection *s;
11528
0
      bfd_vma symval;
11529
11530
0
      BFD_ASSERT (h->dynindx != -1);
11531
0
      BFD_ASSERT (htab->use_plts_and_copy_relocs);
11532
11533
0
      s = mips_elf_rel_dyn_section (info, false);
11534
0
      symval = (h->root.u.def.section->output_section->vma
11535
0
    + h->root.u.def.section->output_offset
11536
0
    + h->root.u.def.value);
11537
0
      mips_elf_output_dynamic_relocation (output_bfd, s, s->reloc_count++,
11538
0
            h->dynindx, R_MIPS_COPY, symval);
11539
0
    }
11540
11541
  /* Handle the IRIX6-specific symbols.  */
11542
0
  if (IRIX_COMPAT (output_bfd) == ict_irix6)
11543
0
    mips_elf_irix6_finish_dynamic_symbol (output_bfd, name, sym);
11544
11545
  /* Keep dynamic compressed symbols odd.  This allows the dynamic linker
11546
     to treat compressed symbols like any other.  */
11547
0
  if (ELF_ST_IS_MIPS16 (sym->st_other))
11548
0
    {
11549
0
      BFD_ASSERT (sym->st_value & 1);
11550
0
      sym->st_other -= STO_MIPS16;
11551
0
    }
11552
0
  else if (ELF_ST_IS_MICROMIPS (sym->st_other))
11553
0
    {
11554
0
      BFD_ASSERT (sym->st_value & 1);
11555
0
      sym->st_other -= STO_MICROMIPS;
11556
0
    }
11557
11558
0
  return true;
11559
0
}
11560
11561
/* Likewise, for VxWorks.  */
11562
11563
bool
11564
_bfd_mips_vxworks_finish_dynamic_symbol (bfd *output_bfd,
11565
           struct bfd_link_info *info,
11566
           struct elf_link_hash_entry *h,
11567
           Elf_Internal_Sym *sym)
11568
0
{
11569
0
  bfd *dynobj;
11570
0
  asection *sgot;
11571
0
  struct mips_got_info *g;
11572
0
  struct mips_elf_link_hash_table *htab;
11573
0
  struct mips_elf_link_hash_entry *hmips;
11574
11575
0
  htab = mips_elf_hash_table (info);
11576
0
  BFD_ASSERT (htab != NULL);
11577
0
  dynobj = elf_hash_table (info)->dynobj;
11578
0
  hmips = (struct mips_elf_link_hash_entry *) h;
11579
11580
0
  if (h->plt.plist != NULL && h->plt.plist->mips_offset != MINUS_ONE)
11581
0
    {
11582
0
      bfd_byte *loc;
11583
0
      bfd_vma plt_address, got_address, got_offset, branch_offset;
11584
0
      Elf_Internal_Rela rel;
11585
0
      static const bfd_vma *plt_entry;
11586
0
      bfd_vma gotplt_index;
11587
0
      bfd_vma plt_offset;
11588
11589
0
      plt_offset = htab->plt_header_size + h->plt.plist->mips_offset;
11590
0
      gotplt_index = h->plt.plist->gotplt_index;
11591
11592
0
      BFD_ASSERT (h->dynindx != -1);
11593
0
      BFD_ASSERT (htab->root.splt != NULL);
11594
0
      BFD_ASSERT (gotplt_index != MINUS_ONE);
11595
0
      BFD_ASSERT (plt_offset <= htab->root.splt->size);
11596
11597
      /* Calculate the address of the .plt entry.  */
11598
0
      plt_address = (htab->root.splt->output_section->vma
11599
0
         + htab->root.splt->output_offset
11600
0
         + plt_offset);
11601
11602
      /* Calculate the address of the .got.plt entry.  */
11603
0
      got_address = (htab->root.sgotplt->output_section->vma
11604
0
         + htab->root.sgotplt->output_offset
11605
0
         + gotplt_index * MIPS_ELF_GOT_SIZE (output_bfd));
11606
11607
      /* Calculate the offset of the .got.plt entry from
11608
   _GLOBAL_OFFSET_TABLE_.  */
11609
0
      got_offset = mips_elf_gotplt_index (info, h);
11610
11611
      /* Calculate the offset for the branch at the start of the PLT
11612
   entry.  The branch jumps to the beginning of .plt.  */
11613
0
      branch_offset = -(plt_offset / 4 + 1) & 0xffff;
11614
11615
      /* Fill in the initial value of the .got.plt entry.  */
11616
0
      bfd_put_32 (output_bfd, plt_address,
11617
0
      (htab->root.sgotplt->contents
11618
0
       + gotplt_index * MIPS_ELF_GOT_SIZE (output_bfd)));
11619
11620
      /* Find out where the .plt entry should go.  */
11621
0
      loc = htab->root.splt->contents + plt_offset;
11622
11623
0
      if (bfd_link_pic (info))
11624
0
  {
11625
0
    plt_entry = mips_vxworks_shared_plt_entry;
11626
0
    bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
11627
0
    bfd_put_32 (output_bfd, plt_entry[1] | gotplt_index, loc + 4);
11628
0
  }
11629
0
      else
11630
0
  {
11631
0
    bfd_vma got_address_high, got_address_low;
11632
11633
0
    plt_entry = mips_vxworks_exec_plt_entry;
11634
0
    got_address_high = ((got_address + 0x8000) >> 16) & 0xffff;
11635
0
    got_address_low = got_address & 0xffff;
11636
11637
0
    bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
11638
0
    bfd_put_32 (output_bfd, plt_entry[1] | gotplt_index, loc + 4);
11639
0
    bfd_put_32 (output_bfd, plt_entry[2] | got_address_high, loc + 8);
11640
0
    bfd_put_32 (output_bfd, plt_entry[3] | got_address_low, loc + 12);
11641
0
    bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11642
0
    bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11643
0
    bfd_put_32 (output_bfd, plt_entry[6], loc + 24);
11644
0
    bfd_put_32 (output_bfd, plt_entry[7], loc + 28);
11645
11646
0
    loc = (htab->srelplt2->contents
11647
0
     + (gotplt_index * 3 + 2) * sizeof (Elf32_External_Rela));
11648
11649
    /* Emit a relocation for the .got.plt entry.  */
11650
0
    rel.r_offset = got_address;
11651
0
    rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
11652
0
    rel.r_addend = plt_offset;
11653
0
    bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11654
11655
    /* Emit a relocation for the lui of %hi(<.got.plt slot>).  */
11656
0
    loc += sizeof (Elf32_External_Rela);
11657
0
    rel.r_offset = plt_address + 8;
11658
0
    rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11659
0
    rel.r_addend = got_offset;
11660
0
    bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11661
11662
    /* Emit a relocation for the addiu of %lo(<.got.plt slot>).  */
11663
0
    loc += sizeof (Elf32_External_Rela);
11664
0
    rel.r_offset += 4;
11665
0
    rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11666
0
    bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11667
0
  }
11668
11669
      /* Emit an R_MIPS_JUMP_SLOT relocation against the .got.plt entry.  */
11670
0
      loc = (htab->root.srelplt->contents
11671
0
       + gotplt_index * sizeof (Elf32_External_Rela));
11672
0
      rel.r_offset = got_address;
11673
0
      rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_JUMP_SLOT);
11674
0
      rel.r_addend = 0;
11675
0
      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11676
11677
0
      if (!h->def_regular)
11678
0
  sym->st_shndx = SHN_UNDEF;
11679
0
    }
11680
11681
0
  BFD_ASSERT (h->dynindx != -1 || h->forced_local);
11682
11683
0
  sgot = htab->root.sgot;
11684
0
  g = htab->got_info;
11685
0
  BFD_ASSERT (g != NULL);
11686
11687
  /* See if this symbol has an entry in the GOT.  */
11688
0
  if (hmips->global_got_area != GGA_NONE)
11689
0
    {
11690
0
      bfd_vma offset;
11691
0
      Elf_Internal_Rela outrel;
11692
0
      bfd_byte *loc;
11693
0
      asection *s;
11694
11695
      /* Install the symbol value in the GOT.   */
11696
0
      offset = mips_elf_primary_global_got_index (output_bfd, info, h);
11697
0
      MIPS_ELF_PUT_WORD (output_bfd, sym->st_value, sgot->contents + offset);
11698
11699
      /* Add a dynamic relocation for it.  */
11700
0
      s = mips_elf_rel_dyn_section (info, false);
11701
0
      loc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
11702
0
      outrel.r_offset = (sgot->output_section->vma
11703
0
       + sgot->output_offset
11704
0
       + offset);
11705
0
      outrel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_32);
11706
0
      outrel.r_addend = 0;
11707
0
      bfd_elf32_swap_reloca_out (dynobj, &outrel, loc);
11708
0
    }
11709
11710
  /* Emit a copy reloc, if needed.  */
11711
0
  if (h->needs_copy)
11712
0
    {
11713
0
      Elf_Internal_Rela rel;
11714
0
      asection *srel;
11715
0
      bfd_byte *loc;
11716
11717
0
      BFD_ASSERT (h->dynindx != -1);
11718
11719
0
      rel.r_offset = (h->root.u.def.section->output_section->vma
11720
0
          + h->root.u.def.section->output_offset
11721
0
          + h->root.u.def.value);
11722
0
      rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_COPY);
11723
0
      rel.r_addend = 0;
11724
0
      if (h->root.u.def.section == htab->root.sdynrelro)
11725
0
  srel = htab->root.sreldynrelro;
11726
0
      else
11727
0
  srel = htab->root.srelbss;
11728
0
      loc = srel->contents + srel->reloc_count * sizeof (Elf32_External_Rela);
11729
0
      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11730
0
      ++srel->reloc_count;
11731
0
    }
11732
11733
  /* If this is a mips16/microMIPS symbol, force the value to be even.  */
11734
0
  if (ELF_ST_IS_COMPRESSED (sym->st_other))
11735
0
    sym->st_value &= ~1;
11736
11737
0
  return true;
11738
0
}
11739
11740
/* Write out a plt0 entry to the beginning of .plt.  */
11741
11742
static bool
11743
mips_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
11744
0
{
11745
0
  bfd_byte *loc;
11746
0
  bfd_vma gotplt_value, gotplt_value_high, gotplt_value_low;
11747
0
  static const bfd_vma *plt_entry;
11748
0
  struct mips_elf_link_hash_table *htab;
11749
11750
0
  htab = mips_elf_hash_table (info);
11751
0
  BFD_ASSERT (htab != NULL);
11752
11753
0
  if (ABI_64_P (output_bfd))
11754
0
    plt_entry = (htab->compact_branches
11755
0
     ? mipsr6_n64_exec_plt0_entry_compact
11756
0
     : mips_n64_exec_plt0_entry);
11757
0
  else if (ABI_N32_P (output_bfd))
11758
0
    plt_entry = (htab->compact_branches
11759
0
     ? mipsr6_n32_exec_plt0_entry_compact
11760
0
     : mips_n32_exec_plt0_entry);
11761
0
  else if (!htab->plt_header_is_comp)
11762
0
    plt_entry = (htab->compact_branches
11763
0
     ? mipsr6_o32_exec_plt0_entry_compact
11764
0
     : mips_o32_exec_plt0_entry);
11765
0
  else if (htab->insn32)
11766
0
    plt_entry = micromips_insn32_o32_exec_plt0_entry;
11767
0
  else
11768
0
    plt_entry = micromips_o32_exec_plt0_entry;
11769
11770
  /* Calculate the value of .got.plt.  */
11771
0
  gotplt_value = (htab->root.sgotplt->output_section->vma
11772
0
      + htab->root.sgotplt->output_offset);
11773
0
  gotplt_value_high = ((gotplt_value + 0x8000) >> 16) & 0xffff;
11774
0
  gotplt_value_low = gotplt_value & 0xffff;
11775
11776
  /* The PLT sequence is not safe for N64 if .got.plt's address can
11777
     not be loaded in two instructions.  */
11778
0
  if (ABI_64_P (output_bfd)
11779
0
      && ((gotplt_value + 0x80008000) & ~(bfd_vma) 0xffffffff) != 0)
11780
0
    {
11781
0
      _bfd_error_handler
11782
  /* xgettext:c-format */
11783
0
  (_("%pB: `%pA' start VMA of %#" PRIx64 " outside the 32-bit range "
11784
0
     "supported; consider using `-Ttext-segment=...'"),
11785
0
   output_bfd,
11786
0
   htab->root.sgotplt->output_section,
11787
0
   (int64_t) gotplt_value);
11788
0
      bfd_set_error (bfd_error_no_error);
11789
0
      return false;
11790
0
    }
11791
11792
  /* Install the PLT header.  */
11793
0
  loc = htab->root.splt->contents;
11794
0
  if (plt_entry == micromips_o32_exec_plt0_entry)
11795
0
    {
11796
0
      bfd_vma gotpc_offset;
11797
0
      bfd_vma loc_address;
11798
0
      size_t i;
11799
11800
0
      BFD_ASSERT (gotplt_value % 4 == 0);
11801
11802
0
      loc_address = (htab->root.splt->output_section->vma
11803
0
         + htab->root.splt->output_offset);
11804
0
      gotpc_offset = gotplt_value - ((loc_address | 3) ^ 3);
11805
11806
      /* ADDIUPC has a span of +/-16MB, check we're in range.  */
11807
0
      if (gotpc_offset + 0x1000000 >= 0x2000000)
11808
0
  {
11809
0
    _bfd_error_handler
11810
      /* xgettext:c-format */
11811
0
      (_("%pB: `%pA' offset of %" PRId64 " from `%pA' "
11812
0
         "beyond the range of ADDIUPC"),
11813
0
       output_bfd,
11814
0
       htab->root.sgotplt->output_section,
11815
0
       (int64_t) gotpc_offset,
11816
0
       htab->root.splt->output_section);
11817
0
    bfd_set_error (bfd_error_no_error);
11818
0
    return false;
11819
0
  }
11820
0
      bfd_put_16 (output_bfd,
11821
0
      plt_entry[0] | ((gotpc_offset >> 18) & 0x7f), loc);
11822
0
      bfd_put_16 (output_bfd, (gotpc_offset >> 2) & 0xffff, loc + 2);
11823
0
      for (i = 2; i < ARRAY_SIZE (micromips_o32_exec_plt0_entry); i++)
11824
0
  bfd_put_16 (output_bfd, plt_entry[i], loc + (i * 2));
11825
0
    }
11826
0
  else if (plt_entry == micromips_insn32_o32_exec_plt0_entry)
11827
0
    {
11828
0
      size_t i;
11829
11830
0
      bfd_put_16 (output_bfd, plt_entry[0], loc);
11831
0
      bfd_put_16 (output_bfd, gotplt_value_high, loc + 2);
11832
0
      bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11833
0
      bfd_put_16 (output_bfd, gotplt_value_low, loc + 6);
11834
0
      bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11835
0
      bfd_put_16 (output_bfd, gotplt_value_low, loc + 10);
11836
0
      for (i = 6; i < ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry); i++)
11837
0
  bfd_put_16 (output_bfd, plt_entry[i], loc + (i * 2));
11838
0
    }
11839
0
  else
11840
0
    {
11841
0
      bfd_put_32 (output_bfd, plt_entry[0] | gotplt_value_high, loc);
11842
0
      bfd_put_32 (output_bfd, plt_entry[1] | gotplt_value_low, loc + 4);
11843
0
      bfd_put_32 (output_bfd, plt_entry[2] | gotplt_value_low, loc + 8);
11844
0
      bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
11845
0
      bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11846
0
      bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11847
0
      bfd_put_32 (output_bfd, plt_entry[6], loc + 24);
11848
0
      bfd_put_32 (output_bfd, plt_entry[7], loc + 28);
11849
0
    }
11850
11851
0
  return true;
11852
0
}
11853
11854
/* Install the PLT header for a VxWorks executable and finalize the
11855
   contents of .rela.plt.unloaded.  */
11856
11857
static void
11858
mips_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
11859
0
{
11860
0
  Elf_Internal_Rela rela;
11861
0
  bfd_byte *loc;
11862
0
  bfd_vma got_value, got_value_high, got_value_low, plt_address;
11863
0
  static const bfd_vma *plt_entry;
11864
0
  struct mips_elf_link_hash_table *htab;
11865
11866
0
  htab = mips_elf_hash_table (info);
11867
0
  BFD_ASSERT (htab != NULL);
11868
11869
0
  plt_entry = mips_vxworks_exec_plt0_entry;
11870
11871
  /* Calculate the value of _GLOBAL_OFFSET_TABLE_.  */
11872
0
  got_value = (htab->root.hgot->root.u.def.section->output_section->vma
11873
0
         + htab->root.hgot->root.u.def.section->output_offset
11874
0
         + htab->root.hgot->root.u.def.value);
11875
11876
0
  got_value_high = ((got_value + 0x8000) >> 16) & 0xffff;
11877
0
  got_value_low = got_value & 0xffff;
11878
11879
  /* Calculate the address of the PLT header.  */
11880
0
  plt_address = (htab->root.splt->output_section->vma
11881
0
     + htab->root.splt->output_offset);
11882
11883
  /* Install the PLT header.  */
11884
0
  loc = htab->root.splt->contents;
11885
0
  bfd_put_32 (output_bfd, plt_entry[0] | got_value_high, loc);
11886
0
  bfd_put_32 (output_bfd, plt_entry[1] | got_value_low, loc + 4);
11887
0
  bfd_put_32 (output_bfd, plt_entry[2], loc + 8);
11888
0
  bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
11889
0
  bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11890
0
  bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11891
11892
  /* Output the relocation for the lui of %hi(_GLOBAL_OFFSET_TABLE_).  */
11893
0
  loc = htab->srelplt2->contents;
11894
0
  rela.r_offset = plt_address;
11895
0
  rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11896
0
  rela.r_addend = 0;
11897
0
  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
11898
0
  loc += sizeof (Elf32_External_Rela);
11899
11900
  /* Output the relocation for the following addiu of
11901
     %lo(_GLOBAL_OFFSET_TABLE_).  */
11902
0
  rela.r_offset += 4;
11903
0
  rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11904
0
  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
11905
0
  loc += sizeof (Elf32_External_Rela);
11906
11907
  /* Fix up the remaining relocations.  They may have the wrong
11908
     symbol index for _G_O_T_ or _P_L_T_ depending on the order
11909
     in which symbols were output.  */
11910
0
  while (loc < htab->srelplt2->contents + htab->srelplt2->size)
11911
0
    {
11912
0
      Elf_Internal_Rela rel;
11913
11914
0
      bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11915
0
      rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
11916
0
      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11917
0
      loc += sizeof (Elf32_External_Rela);
11918
11919
0
      bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11920
0
      rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11921
0
      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11922
0
      loc += sizeof (Elf32_External_Rela);
11923
11924
0
      bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11925
0
      rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11926
0
      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11927
0
      loc += sizeof (Elf32_External_Rela);
11928
0
    }
11929
0
}
11930
11931
/* Install the PLT header for a VxWorks shared library.  */
11932
11933
static void
11934
mips_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info)
11935
0
{
11936
0
  unsigned int i;
11937
0
  struct mips_elf_link_hash_table *htab;
11938
11939
0
  htab = mips_elf_hash_table (info);
11940
0
  BFD_ASSERT (htab != NULL);
11941
11942
  /* We just need to copy the entry byte-by-byte.  */
11943
0
  for (i = 0; i < ARRAY_SIZE (mips_vxworks_shared_plt0_entry); i++)
11944
0
    bfd_put_32 (output_bfd, mips_vxworks_shared_plt0_entry[i],
11945
0
    htab->root.splt->contents + i * 4);
11946
0
}
11947
11948
/* Finish up the dynamic sections.  */
11949
11950
bool
11951
_bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
11952
               struct bfd_link_info *info,
11953
               bfd_byte *buf ATTRIBUTE_UNUSED)
11954
0
{
11955
0
  bfd *dynobj;
11956
0
  asection *sdyn;
11957
0
  asection *sgot;
11958
0
  struct mips_got_info *gg, *g;
11959
0
  struct mips_elf_link_hash_table *htab;
11960
11961
0
  htab = mips_elf_hash_table (info);
11962
0
  BFD_ASSERT (htab != NULL);
11963
11964
0
  dynobj = elf_hash_table (info)->dynobj;
11965
11966
0
  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
11967
11968
0
  sgot = htab->root.sgot;
11969
0
  gg = htab->got_info;
11970
11971
0
  if (elf_hash_table (info)->dynamic_sections_created)
11972
0
    {
11973
0
      bfd_byte *b;
11974
0
      int dyn_to_skip = 0, dyn_skipped = 0;
11975
11976
0
      BFD_ASSERT (sdyn != NULL);
11977
0
      BFD_ASSERT (gg != NULL);
11978
11979
0
      g = mips_elf_bfd_got (output_bfd, false);
11980
0
      BFD_ASSERT (g != NULL);
11981
11982
0
      for (b = sdyn->contents;
11983
0
     b < sdyn->contents + sdyn->size;
11984
0
     b += MIPS_ELF_DYN_SIZE (dynobj))
11985
0
  {
11986
0
    Elf_Internal_Dyn dyn;
11987
0
    const char *name;
11988
0
    size_t elemsize;
11989
0
    asection *s;
11990
0
    bool swap_out_p;
11991
11992
    /* Read in the current dynamic entry.  */
11993
0
    (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
11994
11995
    /* Assume that we're going to modify it and write it out.  */
11996
0
    swap_out_p = true;
11997
11998
0
    switch (dyn.d_tag)
11999
0
      {
12000
0
      case DT_RELENT:
12001
0
        dyn.d_un.d_val = MIPS_ELF_REL_SIZE (dynobj);
12002
0
        break;
12003
12004
0
      case DT_RELAENT:
12005
0
        BFD_ASSERT (htab->root.target_os == is_vxworks);
12006
0
        dyn.d_un.d_val = MIPS_ELF_RELA_SIZE (dynobj);
12007
0
        break;
12008
12009
0
      case DT_STRSZ:
12010
        /* Rewrite DT_STRSZ.  */
12011
0
        dyn.d_un.d_val =
12012
0
    _bfd_elf_strtab_size (elf_hash_table (info)->dynstr);
12013
0
        break;
12014
12015
0
      case DT_PLTGOT:
12016
0
        s = htab->root.sgot;
12017
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
12018
0
        break;
12019
12020
0
      case DT_MIPS_PLTGOT:
12021
0
        s = htab->root.sgotplt;
12022
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
12023
0
        break;
12024
12025
0
      case DT_MIPS_RLD_VERSION:
12026
0
        dyn.d_un.d_val = 1; /* XXX */
12027
0
        break;
12028
12029
0
      case DT_MIPS_FLAGS:
12030
0
        dyn.d_un.d_val = RHF_NOTPOT; /* XXX */
12031
0
        break;
12032
12033
0
      case DT_MIPS_TIME_STAMP:
12034
0
        {
12035
0
    time_t t;
12036
0
    time (&t);
12037
0
    dyn.d_un.d_val = t;
12038
0
        }
12039
0
        break;
12040
12041
0
      case DT_MIPS_ICHECKSUM:
12042
        /* XXX FIXME: */
12043
0
        swap_out_p = false;
12044
0
        break;
12045
12046
0
      case DT_MIPS_IVERSION:
12047
        /* XXX FIXME: */
12048
0
        swap_out_p = false;
12049
0
        break;
12050
12051
0
      case DT_MIPS_BASE_ADDRESS:
12052
0
        s = output_bfd->sections;
12053
0
        BFD_ASSERT (s != NULL);
12054
0
        dyn.d_un.d_ptr = s->vma & ~(bfd_vma) 0xffff;
12055
0
        break;
12056
12057
0
      case DT_MIPS_LOCAL_GOTNO:
12058
0
        dyn.d_un.d_val = g->local_gotno;
12059
0
        break;
12060
12061
0
      case DT_MIPS_UNREFEXTNO:
12062
        /* The index into the dynamic symbol table which is the
12063
     entry of the first external symbol that is not
12064
     referenced within the same object.  */
12065
0
        dyn.d_un.d_val = bfd_count_sections (output_bfd) + 1;
12066
0
        break;
12067
12068
0
      case DT_MIPS_GOTSYM:
12069
0
        if (htab->global_gotsym)
12070
0
    {
12071
0
      dyn.d_un.d_val = htab->global_gotsym->dynindx;
12072
0
      break;
12073
0
    }
12074
        /* In case if we don't have global got symbols we default
12075
     to setting DT_MIPS_GOTSYM to the same value as
12076
     DT_MIPS_SYMTABNO.  */
12077
        /* Fall through.  */
12078
12079
0
      case DT_MIPS_SYMTABNO:
12080
0
        name = ".dynsym";
12081
0
        elemsize = MIPS_ELF_SYM_SIZE (output_bfd);
12082
0
        s = bfd_get_linker_section (dynobj, name);
12083
12084
0
        if (s != NULL)
12085
0
    dyn.d_un.d_val = s->size / elemsize;
12086
0
        else
12087
0
    dyn.d_un.d_val = 0;
12088
0
        break;
12089
12090
0
      case DT_MIPS_HIPAGENO:
12091
0
        dyn.d_un.d_val = g->local_gotno - htab->reserved_gotno;
12092
0
        break;
12093
12094
0
      case DT_MIPS_RLD_MAP:
12095
0
        {
12096
0
    struct elf_link_hash_entry *h;
12097
0
    h = mips_elf_hash_table (info)->rld_symbol;
12098
0
    if (!h)
12099
0
      {
12100
0
        dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
12101
0
        swap_out_p = false;
12102
0
        break;
12103
0
      }
12104
0
    s = h->root.u.def.section;
12105
12106
    /* The MIPS_RLD_MAP tag stores the absolute address of the
12107
       debug pointer.  */
12108
0
    dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
12109
0
          + h->root.u.def.value);
12110
0
        }
12111
0
        break;
12112
12113
0
      case DT_MIPS_RLD_MAP_REL:
12114
0
        {
12115
0
    struct elf_link_hash_entry *h;
12116
0
    bfd_vma dt_addr, rld_addr;
12117
0
    h = mips_elf_hash_table (info)->rld_symbol;
12118
0
    if (!h)
12119
0
      {
12120
0
        dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
12121
0
        swap_out_p = false;
12122
0
        break;
12123
0
      }
12124
0
    s = h->root.u.def.section;
12125
12126
    /* The MIPS_RLD_MAP_REL tag stores the offset to the debug
12127
       pointer, relative to the address of the tag.  */
12128
0
    dt_addr = (sdyn->output_section->vma + sdyn->output_offset
12129
0
         + (b - sdyn->contents));
12130
0
    rld_addr = (s->output_section->vma + s->output_offset
12131
0
          + h->root.u.def.value);
12132
0
    dyn.d_un.d_ptr = rld_addr - dt_addr;
12133
0
        }
12134
0
        break;
12135
12136
0
      case DT_MIPS_OPTIONS:
12137
0
        s = (bfd_get_section_by_name
12138
0
       (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (output_bfd)));
12139
0
        dyn.d_un.d_ptr = s->vma;
12140
0
        break;
12141
12142
0
      case DT_PLTREL:
12143
0
        BFD_ASSERT (htab->use_plts_and_copy_relocs);
12144
0
        if (htab->root.target_os == is_vxworks)
12145
0
    dyn.d_un.d_val = DT_RELA;
12146
0
        else
12147
0
    dyn.d_un.d_val = DT_REL;
12148
0
        break;
12149
12150
0
      case DT_PLTRELSZ:
12151
0
        BFD_ASSERT (htab->use_plts_and_copy_relocs);
12152
0
        dyn.d_un.d_val = htab->root.srelplt->size;
12153
0
        break;
12154
12155
0
      case DT_JMPREL:
12156
0
        BFD_ASSERT (htab->use_plts_and_copy_relocs);
12157
0
        dyn.d_un.d_ptr = (htab->root.srelplt->output_section->vma
12158
0
        + htab->root.srelplt->output_offset);
12159
0
        break;
12160
12161
0
      case DT_TEXTREL:
12162
        /* If we didn't need any text relocations after all, delete
12163
     the dynamic tag.  */
12164
0
        if (!(info->flags & DF_TEXTREL))
12165
0
    {
12166
0
      dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
12167
0
      swap_out_p = false;
12168
0
    }
12169
0
        break;
12170
12171
0
      case DT_FLAGS:
12172
        /* If we didn't need any text relocations after all, clear
12173
     DF_TEXTREL from DT_FLAGS.  */
12174
0
        if (!(info->flags & DF_TEXTREL))
12175
0
    dyn.d_un.d_val &= ~DF_TEXTREL;
12176
0
        else
12177
0
    swap_out_p = false;
12178
0
        break;
12179
12180
0
      case DT_MIPS_XHASH:
12181
0
        name = ".MIPS.xhash";
12182
0
        s = bfd_get_linker_section (dynobj, name);
12183
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
12184
0
        break;
12185
12186
0
      default:
12187
0
        swap_out_p = false;
12188
0
        if (htab->root.target_os == is_vxworks
12189
0
      && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
12190
0
    swap_out_p = true;
12191
0
        break;
12192
0
      }
12193
12194
0
    if (swap_out_p || dyn_skipped)
12195
0
      (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
12196
0
        (dynobj, &dyn, b - dyn_skipped);
12197
12198
0
    if (dyn_to_skip)
12199
0
      {
12200
0
        dyn_skipped += dyn_to_skip;
12201
0
        dyn_to_skip = 0;
12202
0
      }
12203
0
  }
12204
12205
      /* Wipe out any trailing entries if we shifted down a dynamic tag.  */
12206
0
      if (dyn_skipped > 0)
12207
0
  memset (b - dyn_skipped, 0, dyn_skipped);
12208
0
    }
12209
12210
0
  if (sgot != NULL && sgot->size > 0
12211
0
      && !bfd_is_abs_section (sgot->output_section))
12212
0
    {
12213
0
      if (htab->root.target_os == is_vxworks)
12214
0
  {
12215
    /* The first entry of the global offset table points to the
12216
       ".dynamic" section.  The second is initialized by the
12217
       loader and contains the shared library identifier.
12218
       The third is also initialized by the loader and points
12219
       to the lazy resolution stub.  */
12220
0
    MIPS_ELF_PUT_WORD (output_bfd,
12221
0
           sdyn->output_offset + sdyn->output_section->vma,
12222
0
           sgot->contents);
12223
0
    MIPS_ELF_PUT_WORD (output_bfd, 0,
12224
0
           sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
12225
0
    MIPS_ELF_PUT_WORD (output_bfd, 0,
12226
0
           sgot->contents
12227
0
           + 2 * MIPS_ELF_GOT_SIZE (output_bfd));
12228
0
  }
12229
0
      else
12230
0
  {
12231
    /* The first entry of the global offset table will be filled at
12232
       runtime. The second entry will be used by some runtime loaders.
12233
       This isn't the case of IRIX rld.  */
12234
0
    MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0, sgot->contents);
12235
0
    MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
12236
0
           sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
12237
0
  }
12238
12239
0
      elf_section_data (sgot->output_section)->this_hdr.sh_entsize
12240
0
   = MIPS_ELF_GOT_SIZE (output_bfd);
12241
0
    }
12242
12243
  /* Generate dynamic relocations for the non-primary gots.  */
12244
0
  if (gg != NULL && gg->next)
12245
0
    {
12246
0
      Elf_Internal_Rela rel[3];
12247
0
      bfd_vma addend = 0;
12248
12249
0
      memset (rel, 0, sizeof (rel));
12250
0
      rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_REL32);
12251
12252
0
      for (g = gg->next; g->next != gg; g = g->next)
12253
0
  {
12254
0
    bfd_vma got_index = g->next->local_gotno + g->next->global_gotno
12255
0
      + g->next->tls_gotno;
12256
12257
0
    MIPS_ELF_PUT_WORD (output_bfd, 0, sgot->contents
12258
0
           + got_index++ * MIPS_ELF_GOT_SIZE (output_bfd));
12259
0
    MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
12260
0
           sgot->contents
12261
0
           + got_index++ * MIPS_ELF_GOT_SIZE (output_bfd));
12262
12263
0
    if (! bfd_link_pic (info))
12264
0
      continue;
12265
12266
0
    for (; got_index < g->local_gotno; got_index++)
12267
0
      {
12268
0
        if (got_index >= g->assigned_low_gotno
12269
0
      && got_index <= g->assigned_high_gotno)
12270
0
    continue;
12271
12272
0
        rel[0].r_offset = rel[1].r_offset = rel[2].r_offset
12273
0
    = got_index * MIPS_ELF_GOT_SIZE (output_bfd);
12274
0
        if (!(mips_elf_create_dynamic_relocation
12275
0
        (output_bfd, info, rel, NULL,
12276
0
         bfd_abs_section_ptr,
12277
0
         0, &addend, sgot)))
12278
0
    return false;
12279
0
        BFD_ASSERT (addend == 0);
12280
0
      }
12281
0
  }
12282
0
    }
12283
12284
  /* The generation of dynamic relocations for the non-primary gots
12285
     adds more dynamic relocations.  We cannot count them until
12286
     here.  */
12287
12288
0
  if (elf_hash_table (info)->dynamic_sections_created)
12289
0
    {
12290
0
      bfd_byte *b;
12291
0
      bool swap_out_p;
12292
12293
0
      BFD_ASSERT (sdyn != NULL);
12294
12295
0
      for (b = sdyn->contents;
12296
0
     b < sdyn->contents + sdyn->size;
12297
0
     b += MIPS_ELF_DYN_SIZE (dynobj))
12298
0
  {
12299
0
    Elf_Internal_Dyn dyn;
12300
0
    asection *s;
12301
12302
    /* Read in the current dynamic entry.  */
12303
0
    (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
12304
12305
    /* Assume that we're going to modify it and write it out.  */
12306
0
    swap_out_p = true;
12307
12308
0
    switch (dyn.d_tag)
12309
0
      {
12310
0
      case DT_RELSZ:
12311
        /* Reduce DT_RELSZ to account for any relocations we
12312
     decided not to make.  This is for the n64 irix rld,
12313
     which doesn't seem to apply any relocations if there
12314
     are trailing null entries.  */
12315
0
        s = mips_elf_rel_dyn_section (info, false);
12316
0
        dyn.d_un.d_val = (s->reloc_count
12317
0
        * (ABI_64_P (output_bfd)
12318
0
           ? sizeof (Elf64_Mips_External_Rel)
12319
0
           : sizeof (Elf32_External_Rel)));
12320
        /* Adjust the section size too.  Tools like the prelinker
12321
     can reasonably expect the values to the same.  */
12322
0
        BFD_ASSERT (!bfd_is_abs_section (s->output_section));
12323
0
        elf_section_data (s->output_section)->this_hdr.sh_size
12324
0
    = dyn.d_un.d_val;
12325
0
        break;
12326
12327
0
      default:
12328
0
        swap_out_p = false;
12329
0
        break;
12330
0
      }
12331
12332
0
    if (swap_out_p)
12333
0
      (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
12334
0
        (dynobj, &dyn, b);
12335
0
  }
12336
0
    }
12337
12338
0
  {
12339
0
    asection *s;
12340
0
    Elf32_compact_rel cpt;
12341
12342
0
    if (SGI_COMPAT (output_bfd))
12343
0
      {
12344
  /* Write .compact_rel section out.  */
12345
0
  s = bfd_get_linker_section (dynobj, ".compact_rel");
12346
0
  if (s != NULL)
12347
0
    {
12348
0
      cpt.id1 = 1;
12349
0
      cpt.num = s->reloc_count;
12350
0
      cpt.id2 = 2;
12351
0
      cpt.offset = (s->output_section->filepos
12352
0
        + sizeof (Elf32_External_compact_rel));
12353
0
      cpt.reserved0 = 0;
12354
0
      cpt.reserved1 = 0;
12355
0
      bfd_elf32_swap_compact_rel_out (output_bfd, &cpt,
12356
0
              ((Elf32_External_compact_rel *)
12357
0
               s->contents));
12358
12359
      /* Clean up a dummy stub function entry in .text.  */
12360
0
      if (htab->sstubs != NULL
12361
0
    && htab->sstubs->contents != NULL)
12362
0
        {
12363
0
    file_ptr dummy_offset;
12364
12365
0
    BFD_ASSERT (htab->sstubs->size >= htab->function_stub_size);
12366
0
    dummy_offset = htab->sstubs->size - htab->function_stub_size;
12367
0
    memset (htab->sstubs->contents + dummy_offset, 0,
12368
0
      htab->function_stub_size);
12369
0
        }
12370
0
    }
12371
0
      }
12372
12373
    /* The psABI says that the dynamic relocations must be sorted in
12374
       increasing order of r_symndx.  The VxWorks EABI doesn't require
12375
       this, and because the code below handles REL rather than RELA
12376
       relocations, using it for VxWorks would be outright harmful.  */
12377
0
    if (htab->root.target_os != is_vxworks)
12378
0
      {
12379
0
  s = mips_elf_rel_dyn_section (info, false);
12380
0
  if (s != NULL
12381
0
      && s->size > (bfd_vma)2 * MIPS_ELF_REL_SIZE (output_bfd))
12382
0
    {
12383
0
      reldyn_sorting_bfd = output_bfd;
12384
12385
0
      if (ABI_64_P (output_bfd))
12386
0
        qsort ((Elf64_External_Rel *) s->contents + 1,
12387
0
         s->reloc_count - 1, sizeof (Elf64_Mips_External_Rel),
12388
0
         sort_dynamic_relocs_64);
12389
0
      else
12390
0
        qsort ((Elf32_External_Rel *) s->contents + 1,
12391
0
         s->reloc_count - 1, sizeof (Elf32_External_Rel),
12392
0
         sort_dynamic_relocs);
12393
0
    }
12394
0
      }
12395
0
  }
12396
12397
0
  if (htab->root.splt && htab->root.splt->size > 0)
12398
0
    {
12399
0
      if (htab->root.target_os == is_vxworks)
12400
0
  {
12401
0
    if (bfd_link_pic (info))
12402
0
      mips_vxworks_finish_shared_plt (output_bfd, info);
12403
0
    else
12404
0
      mips_vxworks_finish_exec_plt (output_bfd, info);
12405
0
  }
12406
0
      else
12407
0
  {
12408
0
    BFD_ASSERT (!bfd_link_pic (info));
12409
0
    if (!mips_finish_exec_plt (output_bfd, info))
12410
0
      return false;
12411
0
  }
12412
0
    }
12413
0
  return true;
12414
0
}
12415
12416
12417
/* Set ABFD's EF_MIPS_ARCH and EF_MIPS_MACH flags.  */
12418
12419
static void
12420
mips_set_isa_flags (bfd *abfd)
12421
35
{
12422
35
  flagword val;
12423
12424
35
  switch (bfd_get_mach (abfd))
12425
35
    {
12426
0
    default:
12427
0
      if (ABI_N32_P (abfd) || ABI_64_P (abfd))
12428
0
        val = MIPS_DEFAULT_R6 ? EF_MIPS_ARCH_64R6 : EF_MIPS_ARCH_3;
12429
0
      else
12430
0
        val = MIPS_DEFAULT_R6 ? EF_MIPS_ARCH_32R6 : EF_MIPS_ARCH_1;
12431
0
      break;
12432
12433
6
    case bfd_mach_mips3000:
12434
6
      val = EF_MIPS_ARCH_1;
12435
6
      break;
12436
12437
0
    case bfd_mach_mips3900:
12438
0
      val = EF_MIPS_ARCH_1 | EF_MIPS_MACH_3900;
12439
0
      break;
12440
12441
15
    case bfd_mach_mips6000:
12442
15
      val = EF_MIPS_ARCH_2;
12443
15
      break;
12444
12445
0
    case bfd_mach_mips4010:
12446
0
      val = EF_MIPS_ARCH_2 | EF_MIPS_MACH_4010;
12447
0
      break;
12448
12449
0
    case bfd_mach_mips_allegrex:
12450
0
      val = EF_MIPS_ARCH_2 | EF_MIPS_MACH_ALLEGREX;
12451
0
      break;
12452
12453
1
    case bfd_mach_mips4000:
12454
1
    case bfd_mach_mips4300:
12455
1
    case bfd_mach_mips4400:
12456
1
    case bfd_mach_mips4600:
12457
1
      val = EF_MIPS_ARCH_3;
12458
1
      break;
12459
12460
0
    case bfd_mach_mips4100:
12461
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_4100;
12462
0
      break;
12463
12464
0
    case bfd_mach_mips4111:
12465
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_4111;
12466
0
      break;
12467
12468
0
    case bfd_mach_mips4120:
12469
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_4120;
12470
0
      break;
12471
12472
0
    case bfd_mach_mips4650:
12473
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_4650;
12474
0
      break;
12475
12476
0
    case bfd_mach_mips5400:
12477
0
      val = EF_MIPS_ARCH_4 | EF_MIPS_MACH_5400;
12478
0
      break;
12479
12480
0
    case bfd_mach_mips5500:
12481
0
      val = EF_MIPS_ARCH_4 | EF_MIPS_MACH_5500;
12482
0
      break;
12483
12484
0
    case bfd_mach_mips5900:
12485
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_5900;
12486
0
      break;
12487
12488
0
    case bfd_mach_mips9000:
12489
0
      val = EF_MIPS_ARCH_4 | EF_MIPS_MACH_9000;
12490
0
      break;
12491
12492
0
    case bfd_mach_mips5000:
12493
0
    case bfd_mach_mips7000:
12494
1
    case bfd_mach_mips8000:
12495
1
    case bfd_mach_mips10000:
12496
1
    case bfd_mach_mips12000:
12497
1
    case bfd_mach_mips14000:
12498
1
    case bfd_mach_mips16000:
12499
1
      val = EF_MIPS_ARCH_4;
12500
1
      break;
12501
12502
1
    case bfd_mach_mips5:
12503
1
      val = EF_MIPS_ARCH_5;
12504
1
      break;
12505
12506
0
    case bfd_mach_mips_loongson_2e:
12507
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_LS2E;
12508
0
      break;
12509
12510
0
    case bfd_mach_mips_loongson_2f:
12511
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_LS2F;
12512
0
      break;
12513
12514
0
    case bfd_mach_mips_sb1:
12515
0
      val = EF_MIPS_ARCH_64 | EF_MIPS_MACH_SB1;
12516
0
      break;
12517
12518
0
    case bfd_mach_mips_gs464:
12519
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_GS464;
12520
0
      break;
12521
12522
0
    case bfd_mach_mips_gs464e:
12523
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_GS464E;
12524
0
      break;
12525
12526
0
    case bfd_mach_mips_gs264e:
12527
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_GS264E;
12528
0
      break;
12529
12530
0
    case bfd_mach_mips_octeon:
12531
0
    case bfd_mach_mips_octeonp:
12532
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_OCTEON;
12533
0
      break;
12534
12535
0
    case bfd_mach_mips_octeon3:
12536
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_OCTEON3;
12537
0
      break;
12538
12539
0
    case bfd_mach_mips_xlr:
12540
0
      val = EF_MIPS_ARCH_64 | EF_MIPS_MACH_XLR;
12541
0
      break;
12542
12543
0
    case bfd_mach_mips_octeon2:
12544
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_OCTEON2;
12545
0
      break;
12546
12547
1
    case bfd_mach_mipsisa32:
12548
1
      val = EF_MIPS_ARCH_32;
12549
1
      break;
12550
12551
3
    case bfd_mach_mipsisa64:
12552
3
      val = EF_MIPS_ARCH_64;
12553
3
      break;
12554
12555
1
    case bfd_mach_mipsisa32r2:
12556
1
    case bfd_mach_mipsisa32r3:
12557
1
    case bfd_mach_mipsisa32r5:
12558
1
      val = EF_MIPS_ARCH_32R2;
12559
1
      break;
12560
12561
0
    case bfd_mach_mips_interaptiv_mr2:
12562
0
      val = EF_MIPS_ARCH_32R2 | EF_MIPS_MACH_IAMR2;
12563
0
      break;
12564
12565
3
    case bfd_mach_mipsisa64r2:
12566
3
    case bfd_mach_mipsisa64r3:
12567
3
    case bfd_mach_mipsisa64r5:
12568
3
      val = EF_MIPS_ARCH_64R2;
12569
3
      break;
12570
12571
2
    case bfd_mach_mipsisa32r6:
12572
2
      val = EF_MIPS_ARCH_32R6;
12573
2
      break;
12574
12575
1
    case bfd_mach_mipsisa64r6:
12576
1
      val = EF_MIPS_ARCH_64R6;
12577
1
      break;
12578
35
    }
12579
35
  elf_elfheader (abfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
12580
35
  elf_elfheader (abfd)->e_flags |= val;
12581
12582
35
}
12583
12584
12585
/* Whether to sort relocs output by ld -r or ld --emit-relocs, by r_offset.
12586
   Don't do so for code sections.  We want to keep ordering of HI16/LO16
12587
   as is.  On the other hand, elf-eh-frame.c processing requires .eh_frame
12588
   relocs to be sorted.  */
12589
12590
bool
12591
_bfd_mips_elf_sort_relocs_p (asection *sec)
12592
0
{
12593
0
  return (sec->flags & SEC_CODE) == 0;
12594
0
}
12595
12596
12597
/* The final processing done just before writing out a MIPS ELF object
12598
   file.  This gets the MIPS architecture right based on the machine
12599
   number.  This is used by both the 32-bit and the 64-bit ABI.  */
12600
12601
void
12602
_bfd_mips_final_write_processing (bfd *abfd)
12603
56
{
12604
56
  unsigned int i;
12605
56
  Elf_Internal_Shdr **hdrpp;
12606
56
  const char *name;
12607
56
  asection *sec;
12608
12609
  /* Keep the existing EF_MIPS_MACH and EF_MIPS_ARCH flags if the former
12610
     is nonzero.  This is for compatibility with old objects, which used
12611
     a combination of a 32-bit EF_MIPS_ARCH and a 64-bit EF_MIPS_MACH.  */
12612
56
  if ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == 0)
12613
35
    mips_set_isa_flags (abfd);
12614
12615
  /* Set the sh_info field for .gptab sections and other appropriate
12616
     info for each special section.  */
12617
56
  for (i = 1, hdrpp = elf_elfsections (abfd) + 1;
12618
261
       i < elf_numsections (abfd);
12619
205
       i++, hdrpp++)
12620
205
    {
12621
205
      switch ((*hdrpp)->sh_type)
12622
205
  {
12623
0
  case SHT_MIPS_MSYM:
12624
0
  case SHT_MIPS_LIBLIST:
12625
0
    sec = bfd_get_section_by_name (abfd, ".dynstr");
12626
0
    if (sec != NULL)
12627
0
      (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12628
0
    break;
12629
12630
0
  case SHT_MIPS_GPTAB:
12631
0
    BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
12632
0
    name = bfd_section_name ((*hdrpp)->bfd_section);
12633
0
    if (startswith (name, ".gptab."))
12634
0
      {
12635
0
        sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
12636
0
        if (sec != NULL)
12637
0
    (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
12638
0
      }
12639
0
    break;
12640
12641
0
  case SHT_MIPS_CONTENT:
12642
0
    BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
12643
0
    name = bfd_section_name ((*hdrpp)->bfd_section);
12644
0
    if (startswith (name, ".MIPS.content"))
12645
0
      {
12646
0
        sec = bfd_get_section_by_name (abfd,
12647
0
               name + sizeof ".MIPS.content" - 1);
12648
0
        if (sec != NULL)
12649
0
    (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12650
0
      }
12651
0
    break;
12652
12653
0
  case SHT_MIPS_SYMBOL_LIB:
12654
0
    sec = bfd_get_section_by_name (abfd, ".dynsym");
12655
0
    if (sec != NULL)
12656
0
      (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12657
0
    sec = bfd_get_section_by_name (abfd, ".liblist");
12658
0
    if (sec != NULL)
12659
0
      (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
12660
0
    break;
12661
12662
0
  case SHT_MIPS_EVENTS:
12663
0
    BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
12664
0
    name = bfd_section_name ((*hdrpp)->bfd_section);
12665
0
    if (startswith (name, ".MIPS.events"))
12666
0
      sec = bfd_get_section_by_name (abfd,
12667
0
             name + sizeof ".MIPS.events" - 1);
12668
0
    else if (startswith (name, ".MIPS.post_rel"))
12669
0
      sec = bfd_get_section_by_name (abfd,
12670
0
             name + sizeof ".MIPS.post_rel" - 1);
12671
0
    else
12672
0
      sec = NULL;
12673
0
    if (sec != NULL)
12674
0
      (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12675
0
    break;
12676
12677
0
  case SHT_MIPS_XHASH:
12678
0
    sec = bfd_get_section_by_name (abfd, ".dynsym");
12679
0
    if (sec != NULL)
12680
0
      (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12681
205
  }
12682
205
    }
12683
56
}
12684
12685
bool
12686
_bfd_mips_elf_final_write_processing (bfd *abfd)
12687
56
{
12688
56
  _bfd_mips_final_write_processing (abfd);
12689
56
  return _bfd_elf_final_write_processing (abfd);
12690
56
}
12691

12692
/* When creating an IRIX5 executable, we need REGINFO and RTPROC
12693
   segments.  */
12694
12695
int
12696
_bfd_mips_elf_additional_program_headers (bfd *abfd,
12697
            struct bfd_link_info *info ATTRIBUTE_UNUSED)
12698
0
{
12699
0
  asection *s;
12700
0
  int ret = 0;
12701
12702
  /* See if we need a PT_MIPS_REGINFO segment.  */
12703
0
  s = bfd_get_section_by_name (abfd, ".reginfo");
12704
0
  if (s && (s->flags & SEC_LOAD))
12705
0
    ++ret;
12706
12707
  /* See if we need a PT_MIPS_ABIFLAGS segment.  */
12708
0
  if (bfd_get_section_by_name (abfd, ".MIPS.abiflags"))
12709
0
    ++ret;
12710
12711
  /* See if we need a PT_MIPS_OPTIONS segment.  */
12712
0
  if (IRIX_COMPAT (abfd) == ict_irix6
12713
0
      && bfd_get_section_by_name (abfd,
12714
0
          MIPS_ELF_OPTIONS_SECTION_NAME (abfd)))
12715
0
    ++ret;
12716
12717
  /* See if we need a PT_MIPS_RTPROC segment.  */
12718
0
  if (IRIX_COMPAT (abfd) == ict_irix5
12719
0
      && bfd_get_section_by_name (abfd, ".dynamic")
12720
0
      && bfd_get_section_by_name (abfd, ".mdebug"))
12721
0
    ++ret;
12722
12723
  /* Allocate a PT_NULL header in dynamic objects.  See
12724
     _bfd_mips_elf_modify_segment_map for details.  */
12725
0
  if (!SGI_COMPAT (abfd)
12726
0
      && bfd_get_section_by_name (abfd, ".dynamic"))
12727
0
    ++ret;
12728
12729
0
  return ret;
12730
0
}
12731
12732
/* Modify the segment map for an IRIX5 executable.  */
12733
12734
bool
12735
_bfd_mips_elf_modify_segment_map (bfd *abfd,
12736
          struct bfd_link_info *info)
12737
44
{
12738
44
  asection *s;
12739
44
  struct elf_segment_map *m, **pm;
12740
44
  size_t amt;
12741
12742
  /* If there is a .reginfo section, we need a PT_MIPS_REGINFO
12743
     segment.  */
12744
44
  s = bfd_get_section_by_name (abfd, ".reginfo");
12745
44
  if (s != NULL && (s->flags & SEC_LOAD) != 0)
12746
0
    {
12747
0
      for (m = elf_seg_map (abfd); m != NULL; m = m->next)
12748
0
  if (m->p_type == PT_MIPS_REGINFO)
12749
0
    break;
12750
0
      if (m == NULL)
12751
0
  {
12752
0
    amt = sizeof *m;
12753
0
    m = bfd_zalloc (abfd, amt);
12754
0
    if (m == NULL)
12755
0
      return false;
12756
12757
0
    m->p_type = PT_MIPS_REGINFO;
12758
0
    m->count = 1;
12759
0
    m->sections[0] = s;
12760
12761
    /* We want to put it after the PHDR and INTERP segments.  */
12762
0
    pm = &elf_seg_map (abfd);
12763
0
    while (*pm != NULL
12764
0
     && ((*pm)->p_type == PT_PHDR
12765
0
         || (*pm)->p_type == PT_INTERP))
12766
0
      pm = &(*pm)->next;
12767
12768
0
    m->next = *pm;
12769
0
    *pm = m;
12770
0
  }
12771
0
    }
12772
12773
  /* If there is a .MIPS.abiflags section, we need a PT_MIPS_ABIFLAGS
12774
     segment.  */
12775
44
  s = bfd_get_section_by_name (abfd, ".MIPS.abiflags");
12776
44
  if (s != NULL && (s->flags & SEC_LOAD) != 0)
12777
0
    {
12778
0
      for (m = elf_seg_map (abfd); m != NULL; m = m->next)
12779
0
  if (m->p_type == PT_MIPS_ABIFLAGS)
12780
0
    break;
12781
0
      if (m == NULL)
12782
0
  {
12783
0
    amt = sizeof *m;
12784
0
    m = bfd_zalloc (abfd, amt);
12785
0
    if (m == NULL)
12786
0
      return false;
12787
12788
0
    m->p_type = PT_MIPS_ABIFLAGS;
12789
0
    m->count = 1;
12790
0
    m->sections[0] = s;
12791
12792
    /* We want to put it after the PHDR and INTERP segments.  */
12793
0
    pm = &elf_seg_map (abfd);
12794
0
    while (*pm != NULL
12795
0
     && ((*pm)->p_type == PT_PHDR
12796
0
         || (*pm)->p_type == PT_INTERP))
12797
0
      pm = &(*pm)->next;
12798
12799
0
    m->next = *pm;
12800
0
    *pm = m;
12801
0
  }
12802
0
    }
12803
12804
  /* For IRIX 6, we don't have .mdebug sections, nor does anything but
12805
     .dynamic end up in PT_DYNAMIC.  However, we do have to insert a
12806
     PT_MIPS_OPTIONS segment immediately following the program header
12807
     table.  */
12808
44
  if (NEWABI_P (abfd)
12809
      /* On non-IRIX6 new abi, we'll have already created a segment
12810
   for this section, so don't create another.  I'm not sure this
12811
   is not also the case for IRIX 6, but I can't test it right
12812
   now.  */
12813
37
      && IRIX_COMPAT (abfd) == ict_irix6)
12814
29
    {
12815
54
      for (s = abfd->sections; s; s = s->next)
12816
25
  if (elf_section_data (s)->this_hdr.sh_type == SHT_MIPS_OPTIONS)
12817
0
    break;
12818
12819
29
      if (s)
12820
0
  {
12821
0
    struct elf_segment_map *options_segment;
12822
12823
0
    pm = &elf_seg_map (abfd);
12824
0
    while (*pm != NULL
12825
0
     && ((*pm)->p_type == PT_PHDR
12826
0
         || (*pm)->p_type == PT_INTERP))
12827
0
      pm = &(*pm)->next;
12828
12829
0
    if (*pm == NULL || (*pm)->p_type != PT_MIPS_OPTIONS)
12830
0
      {
12831
0
        amt = sizeof (struct elf_segment_map);
12832
0
        options_segment = bfd_zalloc (abfd, amt);
12833
0
        options_segment->next = *pm;
12834
0
        options_segment->p_type = PT_MIPS_OPTIONS;
12835
0
        options_segment->p_flags = PF_R;
12836
0
        options_segment->p_flags_valid = true;
12837
0
        options_segment->count = 1;
12838
0
        options_segment->sections[0] = s;
12839
0
        *pm = options_segment;
12840
0
      }
12841
0
  }
12842
29
    }
12843
15
  else
12844
15
    {
12845
15
      if (IRIX_COMPAT (abfd) == ict_irix5)
12846
5
  {
12847
    /* If there are .dynamic and .mdebug sections, we make a room
12848
       for the RTPROC header.  FIXME: Rewrite without section names.  */
12849
5
    if (bfd_get_section_by_name (abfd, ".interp") == NULL
12850
5
        && bfd_get_section_by_name (abfd, ".dynamic") != NULL
12851
0
        && bfd_get_section_by_name (abfd, ".mdebug") != NULL)
12852
0
      {
12853
0
        for (m = elf_seg_map (abfd); m != NULL; m = m->next)
12854
0
    if (m->p_type == PT_MIPS_RTPROC)
12855
0
      break;
12856
0
        if (m == NULL)
12857
0
    {
12858
0
      amt = sizeof *m;
12859
0
      m = bfd_zalloc (abfd, amt);
12860
0
      if (m == NULL)
12861
0
        return false;
12862
12863
0
      m->p_type = PT_MIPS_RTPROC;
12864
12865
0
      s = bfd_get_section_by_name (abfd, ".rtproc");
12866
0
      if (s == NULL)
12867
0
        {
12868
0
          m->count = 0;
12869
0
          m->p_flags = 0;
12870
0
          m->p_flags_valid = 1;
12871
0
        }
12872
0
      else
12873
0
        {
12874
0
          m->count = 1;
12875
0
          m->sections[0] = s;
12876
0
        }
12877
12878
      /* We want to put it after the DYNAMIC segment.  */
12879
0
      pm = &elf_seg_map (abfd);
12880
0
      while (*pm != NULL && (*pm)->p_type != PT_DYNAMIC)
12881
0
        pm = &(*pm)->next;
12882
0
      if (*pm != NULL)
12883
0
        pm = &(*pm)->next;
12884
12885
0
      m->next = *pm;
12886
0
      *pm = m;
12887
0
    }
12888
0
      }
12889
5
  }
12890
      /* On IRIX5, the PT_DYNAMIC segment includes the .dynamic,
12891
   .dynstr, .dynsym, and .hash sections, and everything in
12892
   between.  We avoid any sections though ahead of .dynamic,
12893
   which needs to be first to be usable.  This can only ever
12894
   happen with a non-standard linker script.  */
12895
27
      for (pm = &elf_seg_map (abfd); *pm != NULL;
12896
15
     pm = &(*pm)->next)
12897
13
  if ((*pm)->p_type == PT_DYNAMIC)
12898
1
    break;
12899
15
      m = *pm;
12900
      /* GNU/Linux binaries do not need the extended PT_DYNAMIC section.
12901
   glibc's dynamic linker has traditionally derived the number of
12902
   tags from the p_filesz field, and sometimes allocates stack
12903
   arrays of that size.  An overly-big PT_DYNAMIC segment can
12904
   be actively harmful in such cases.  Making PT_DYNAMIC contain
12905
   other sections can also make life hard for the prelinker,
12906
   which might move one of the other sections to a different
12907
   PT_LOAD segment.  */
12908
15
      if (SGI_COMPAT (abfd)
12909
5
    && m != NULL
12910
1
    && m->count == 1
12911
0
    && strcmp (m->sections[0]->name, ".dynamic") == 0
12912
0
    && (m->sections[0]->flags & SEC_LOAD) != 0)
12913
0
  {
12914
0
    static const char *sec_names[] =
12915
0
    {
12916
0
      ".dynstr", ".dynsym", ".hash"
12917
0
    };
12918
0
    bfd_vma low, high;
12919
0
    unsigned int i, c;
12920
0
    struct elf_segment_map *n;
12921
12922
0
    low = m->sections[0]->vma;
12923
0
    high = low + m->sections[0]->size;
12924
0
    for (i = 0; i < sizeof sec_names / sizeof sec_names[0]; i++)
12925
0
      {
12926
0
        s = bfd_get_section_by_name (abfd, sec_names[i]);
12927
0
        if (s != NULL && (s->flags & SEC_LOAD) != 0)
12928
0
    {
12929
0
      bfd_size_type sz;
12930
12931
0
      if (low > s->vma)
12932
0
        continue;
12933
0
      sz = s->size;
12934
0
      if (high < s->vma + sz)
12935
0
        high = s->vma + sz;
12936
0
    }
12937
0
      }
12938
12939
0
    c = 0;
12940
0
    for (s = abfd->sections; s != NULL; s = s->next)
12941
0
      if ((s->flags & SEC_LOAD) != 0
12942
0
    && s->vma >= low
12943
0
    && s->vma + s->size <= high)
12944
0
        ++c;
12945
12946
0
    amt = sizeof *n - sizeof (asection *) + c * sizeof (asection *);
12947
0
    n = bfd_zalloc (abfd, amt);
12948
0
    if (n == NULL)
12949
0
      return false;
12950
0
    *n = *m;
12951
0
    n->count = c;
12952
12953
0
    i = 0;
12954
0
    for (s = abfd->sections; s != NULL; s = s->next)
12955
0
      {
12956
0
        if ((s->flags & SEC_LOAD) != 0
12957
0
      && s->vma >= low
12958
0
      && s->vma + s->size <= high)
12959
0
    {
12960
0
      n->sections[i] = s;
12961
0
      ++i;
12962
0
    }
12963
0
      }
12964
12965
0
    *pm = n;
12966
0
  }
12967
15
    }
12968
12969
  /* Allocate a spare program header in dynamic objects so that tools
12970
     like the prelinker can add an extra PT_LOAD entry.
12971
12972
     If the prelinker needs to make room for a new PT_LOAD entry, its
12973
     standard procedure is to move the first (read-only) sections into
12974
     the new (writable) segment.  However, the MIPS ABI requires
12975
     .dynamic to be in a read-only segment, and the section will often
12976
     start within sizeof (ElfNN_Phdr) bytes of the last program header.
12977
12978
     Although the prelinker could in principle move .dynamic to a
12979
     writable segment, it seems better to allocate a spare program
12980
     header instead, and avoid the need to move any sections.
12981
     There is a long tradition of allocating spare dynamic tags,
12982
     so allocating a spare program header seems like a natural
12983
     extension.
12984
12985
     If INFO is NULL, we may be copying an already prelinked binary
12986
     with objcopy or strip, so do not add this header.  */
12987
44
  if (info != NULL
12988
0
      && !SGI_COMPAT (abfd)
12989
0
      && bfd_get_section_by_name (abfd, ".dynamic"))
12990
0
    {
12991
0
      for (pm = &elf_seg_map (abfd); *pm != NULL; pm = &(*pm)->next)
12992
0
  if ((*pm)->p_type == PT_NULL)
12993
0
    break;
12994
0
      if (*pm == NULL)
12995
0
  {
12996
0
    m = bfd_zalloc (abfd, sizeof (*m));
12997
0
    if (m == NULL)
12998
0
      return false;
12999
13000
0
    m->p_type = PT_NULL;
13001
0
    *pm = m;
13002
0
  }
13003
0
    }
13004
13005
44
  return true;
13006
44
}
13007

13008
/* Return the section that should be marked against GC for a given
13009
   relocation.  */
13010
13011
asection *
13012
_bfd_mips_elf_gc_mark_hook (asection *sec,
13013
          struct bfd_link_info *info,
13014
          struct elf_reloc_cookie *cookie,
13015
          struct elf_link_hash_entry *h,
13016
          unsigned int symndx)
13017
0
{
13018
  /* ??? Do mips16 stub sections need to be handled special?  */
13019
13020
0
  if (h != NULL)
13021
0
    switch (ELF_R_TYPE (sec->owner, cookie->rel->r_info))
13022
0
      {
13023
0
      case R_MIPS_GNU_VTINHERIT:
13024
0
      case R_MIPS_GNU_VTENTRY:
13025
0
  return NULL;
13026
0
      }
13027
13028
0
  return _bfd_elf_gc_mark_hook (sec, info, cookie, h, symndx);
13029
0
}
13030
13031
/* Prevent .MIPS.abiflags from being discarded with --gc-sections.  */
13032
13033
bool
13034
_bfd_mips_elf_gc_mark_extra_sections (struct bfd_link_info *info,
13035
              elf_gc_mark_hook_fn gc_mark_hook)
13036
0
{
13037
0
  bfd *sub;
13038
13039
0
  _bfd_elf_gc_mark_extra_sections (info, gc_mark_hook);
13040
13041
0
  for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
13042
0
    {
13043
0
      asection *o;
13044
13045
0
      if (! is_mips_elf (sub))
13046
0
  continue;
13047
13048
0
      for (o = sub->sections; o != NULL; o = o->next)
13049
0
  if (!o->gc_mark
13050
0
      && MIPS_ELF_ABIFLAGS_SECTION_NAME_P (bfd_section_name (o)))
13051
0
    {
13052
0
      if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
13053
0
        return false;
13054
0
    }
13055
0
    }
13056
13057
0
  return true;
13058
0
}
13059

13060
/* Copy data from a MIPS ELF indirect symbol to its direct symbol,
13061
   hiding the old indirect symbol.  Process additional relocation
13062
   information.  Also called for weakdefs, in which case we just let
13063
   _bfd_elf_link_hash_copy_indirect copy the flags for us.  */
13064
13065
void
13066
_bfd_mips_elf_copy_indirect_symbol (struct bfd_link_info *info,
13067
            struct elf_link_hash_entry *dir,
13068
            struct elf_link_hash_entry *ind)
13069
0
{
13070
0
  struct mips_elf_link_hash_entry *dirmips, *indmips;
13071
13072
0
  _bfd_elf_link_hash_copy_indirect (info, dir, ind);
13073
13074
0
  dirmips = (struct mips_elf_link_hash_entry *) dir;
13075
0
  indmips = (struct mips_elf_link_hash_entry *) ind;
13076
  /* Any absolute non-dynamic relocations against an indirect or weak
13077
     definition will be against the target symbol.  */
13078
0
  if (indmips->has_static_relocs)
13079
0
    dirmips->has_static_relocs = true;
13080
13081
0
  if (ind->root.type != bfd_link_hash_indirect)
13082
0
    return;
13083
13084
0
  dirmips->possibly_dynamic_relocs += indmips->possibly_dynamic_relocs;
13085
0
  if (indmips->readonly_reloc)
13086
0
    dirmips->readonly_reloc = true;
13087
0
  if (indmips->no_fn_stub)
13088
0
    dirmips->no_fn_stub = true;
13089
0
  if (indmips->fn_stub)
13090
0
    {
13091
0
      dirmips->fn_stub = indmips->fn_stub;
13092
0
      indmips->fn_stub = NULL;
13093
0
    }
13094
0
  if (indmips->need_fn_stub)
13095
0
    {
13096
0
      dirmips->need_fn_stub = true;
13097
0
      indmips->need_fn_stub = false;
13098
0
    }
13099
0
  if (indmips->call_stub)
13100
0
    {
13101
0
      dirmips->call_stub = indmips->call_stub;
13102
0
      indmips->call_stub = NULL;
13103
0
    }
13104
0
  if (indmips->call_fp_stub)
13105
0
    {
13106
0
      dirmips->call_fp_stub = indmips->call_fp_stub;
13107
0
      indmips->call_fp_stub = NULL;
13108
0
    }
13109
0
  if (indmips->global_got_area < dirmips->global_got_area)
13110
0
    dirmips->global_got_area = indmips->global_got_area;
13111
0
  if (indmips->global_got_area < GGA_NONE)
13112
0
    indmips->global_got_area = GGA_NONE;
13113
0
  if (indmips->has_nonpic_branches)
13114
0
    dirmips->has_nonpic_branches = true;
13115
0
}
13116
13117
/* Take care of the special `__gnu_absolute_zero' symbol and ignore attempts
13118
   to hide it.  It has to remain global (it will also be protected) so as to
13119
   be assigned a global GOT entry, which will then remain unchanged at load
13120
   time.  */
13121
13122
void
13123
_bfd_mips_elf_hide_symbol (struct bfd_link_info *info,
13124
         struct elf_link_hash_entry *entry,
13125
         bool force_local)
13126
0
{
13127
0
  struct mips_elf_link_hash_table *htab;
13128
13129
0
  htab = mips_elf_hash_table (info);
13130
0
  BFD_ASSERT (htab != NULL);
13131
0
  if (htab->use_absolute_zero
13132
0
      && strcmp (entry->root.root.string, "__gnu_absolute_zero") == 0)
13133
0
    return;
13134
13135
0
  _bfd_elf_link_hash_hide_symbol (info, entry, force_local);
13136
0
}
13137

13138
0
#define PDR_SIZE 32
13139
13140
bool
13141
_bfd_mips_elf_discard_info (bfd *abfd, struct elf_reloc_cookie *cookie,
13142
          struct bfd_link_info *info)
13143
0
{
13144
0
  asection *o;
13145
0
  bool ret = false;
13146
0
  unsigned char *tdata;
13147
0
  size_t i, skip;
13148
13149
0
  o = bfd_get_section_by_name (abfd, ".pdr");
13150
0
  if (! o)
13151
0
    return false;
13152
0
  if (o->size == 0)
13153
0
    return false;
13154
0
  if (o->size % PDR_SIZE != 0)
13155
0
    return false;
13156
0
  if (o->output_section != NULL
13157
0
      && bfd_is_abs_section (o->output_section))
13158
0
    return false;
13159
13160
0
  tdata = bfd_zmalloc (o->size / PDR_SIZE);
13161
0
  if (! tdata)
13162
0
    return false;
13163
13164
0
  cookie->rels = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
13165
0
              info->keep_memory);
13166
0
  if (!cookie->rels)
13167
0
    {
13168
0
      free (tdata);
13169
0
      return false;
13170
0
    }
13171
13172
0
  cookie->rel = cookie->rels;
13173
0
  cookie->relend = cookie->rels + o->reloc_count;
13174
13175
0
  for (i = 0, skip = 0; i < o->size / PDR_SIZE; i ++)
13176
0
    {
13177
0
      if (bfd_elf_reloc_symbol_deleted_p (i * PDR_SIZE, cookie))
13178
0
  {
13179
0
    tdata[i] = 1;
13180
0
    skip ++;
13181
0
  }
13182
0
    }
13183
13184
0
  if (skip != 0)
13185
0
    {
13186
0
      mips_elf_section_data (o)->u.tdata = tdata;
13187
0
      if (o->rawsize == 0)
13188
0
  o->rawsize = o->size;
13189
0
      o->size -= skip * PDR_SIZE;
13190
0
      ret = true;
13191
0
    }
13192
0
  else
13193
0
    free (tdata);
13194
13195
0
  if (! info->keep_memory)
13196
0
    free (cookie->rels);
13197
13198
0
  return ret;
13199
0
}
13200
13201
bool
13202
_bfd_mips_elf_ignore_discarded_relocs (asection *sec)
13203
0
{
13204
0
  if (strcmp (sec->name, ".pdr") == 0)
13205
0
    return true;
13206
0
  return false;
13207
0
}
13208
13209
bool
13210
_bfd_mips_elf_write_section (bfd *output_bfd,
13211
           struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
13212
           asection *sec, bfd_byte *contents)
13213
0
{
13214
0
  bfd_byte *to, *from, *end;
13215
0
  int i;
13216
13217
0
  if (strcmp (sec->name, ".pdr") != 0)
13218
0
    return false;
13219
13220
0
  if (mips_elf_section_data (sec)->u.tdata == NULL)
13221
0
    return false;
13222
13223
0
  to = contents;
13224
0
  end = contents + sec->size;
13225
0
  for (from = contents, i = 0;
13226
0
       from < end;
13227
0
       from += PDR_SIZE, i++)
13228
0
    {
13229
0
      if ((mips_elf_section_data (sec)->u.tdata)[i] == 1)
13230
0
  continue;
13231
0
      if (to != from)
13232
0
  memcpy (to, from, PDR_SIZE);
13233
0
      to += PDR_SIZE;
13234
0
    }
13235
0
  bfd_set_section_contents (output_bfd, sec->output_section, contents,
13236
0
          sec->output_offset, sec->size);
13237
0
  return true;
13238
0
}
13239

13240
/* microMIPS code retains local labels for linker relaxation.  Omit them
13241
   from output by default for clarity.  */
13242
13243
bool
13244
_bfd_mips_elf_is_target_special_symbol (bfd *abfd, asymbol *sym)
13245
2.17k
{
13246
2.17k
  return _bfd_elf_is_local_label_name (abfd, sym->name);
13247
2.17k
}
13248
13249
/* Helper for `mips_elf_free_hi16_list'.  Resolve an orphan REL high-part
13250
   relocation according to HI.  Return TRUE if succeeded, otherwise FALSE.  */
13251
13252
static bool
13253
_bfd_mips_elf_orphan_shr16_reloc (bfd *abfd, asection *sec,
13254
          struct mips_hi16 *hi,
13255
          struct bfd_link_info *info)
13256
2
{
13257
2
  asymbol *symbol = *hi->rel.sym_ptr_ptr;
13258
2
  const char *name = hi->rel.howto->name;
13259
2
  char *error_message = NULL;
13260
2
  bfd_reloc_status_type r;
13261
13262
2
  r = _bfd_mips_elf_shr16_reloc (abfd, &hi->rel, symbol, hi->data,
13263
2
         sec, hi->output_bfd, &error_message);
13264
2
  if (r == bfd_reloc_ok)
13265
2
    {
13266
2
      if (info != NULL)
13267
2
  {
13268
    /* xgettext:c-format */
13269
2
    error_message = bfd_asprintf (_("can't find matching LO16 reloc"
13270
2
            " against `%s' for %s at %#" PRIx64
13271
2
            " in section `%s'"),
13272
2
          symbol->name, name,
13273
2
          (uint64_t) hi->rel.address, sec->name);
13274
2
    if (error_message == NULL)
13275
0
      return false;
13276
2
    info->callbacks->warning
13277
2
      (info, error_message, symbol->name, sec->owner, sec,
13278
2
       hi->rel.address);
13279
2
  }
13280
2
      return true;
13281
2
    }
13282
13283
0
  if (info != NULL)
13284
0
    _bfd_link_reloc_status_error (abfd, info, sec, &hi->rel, error_message, r);
13285
0
  else
13286
0
    _bfd_error_handler (_("%pB(%pA+%#" PRIx64 "): %s relocation error"),
13287
0
      abfd, sec, (uint64_t) hi->rel.address,
13288
0
      hi->rel.howto->name);
13289
0
  bfd_set_error (bfd_error_bad_value);
13290
0
  return false;
13291
2
}
13292
13293
/* Resolve any outstanding orphan REL high-part relocations if INSTALL
13294
   is TRUE, and release their occupied memory.  */
13295
13296
static bool
13297
mips_elf_free_hi16_list (bfd *abfd, asection *sec, bool install,
13298
       struct bfd_link_info *info)
13299
45.3k
{
13300
45.3k
  bfd_error_type error_tag = bfd_get_error ();
13301
45.3k
  struct _mips_elf_section_data *sdata;
13302
45.3k
  bool status = true;
13303
13304
45.3k
  BFD_ASSERT (is_mips_elf (abfd));
13305
45.3k
  sdata = mips_elf_section_data (sec);
13306
45.3k
  while (sdata->mips_hi16_list != NULL)
13307
2
    {
13308
2
      struct mips_hi16 *hi = sdata->mips_hi16_list;
13309
13310
2
      if (install)
13311
2
  status &= _bfd_mips_elf_orphan_shr16_reloc (abfd, sec, hi, info);
13312
2
      if (!status && error_tag == bfd_error_no_error)
13313
0
  error_tag = bfd_get_error ();
13314
13315
2
      sdata->mips_hi16_list = hi->next;
13316
2
      free (hi);
13317
2
    }
13318
13319
45.3k
  bfd_set_error (error_tag);
13320
45.3k
  return status;
13321
45.3k
}
13322
13323
/* Resolve any outstanding orphan REL high-part relocations before
13324
   calling the generic BFD handler.  */
13325
13326
bool
13327
_bfd_mips_elf_finalize_section_relocs (bfd *abfd, asection *asect,
13328
               arelent **location, unsigned int count)
13329
115
{
13330
115
  if (!mips_elf_free_hi16_list (abfd, asect, true, NULL))
13331
0
    return false;
13332
115
  return _bfd_generic_finalize_section_relocs (abfd, asect, location, count);
13333
115
}
13334
13335
bool
13336
_bfd_mips_elf_find_nearest_line (bfd *abfd, asymbol **symbols,
13337
         asection *section, bfd_vma offset,
13338
         const char **filename_ptr,
13339
         const char **functionname_ptr,
13340
         unsigned int *line_ptr,
13341
         unsigned int *discriminator_ptr)
13342
5.93k
{
13343
5.93k
  asection *msec;
13344
13345
5.93k
  if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
13346
5.93k
             filename_ptr, functionname_ptr,
13347
5.93k
             line_ptr, discriminator_ptr,
13348
5.93k
             dwarf_debug_sections,
13349
5.93k
             &elf_tdata (abfd)->dwarf2_find_line_info)
13350
5.93k
      == 1)
13351
0
    return true;
13352
13353
5.93k
  if (_bfd_dwarf1_find_nearest_line (abfd, symbols, section, offset,
13354
5.93k
             filename_ptr, functionname_ptr,
13355
5.93k
             line_ptr))
13356
0
    {
13357
0
      if (!*functionname_ptr)
13358
0
  _bfd_elf_find_function (abfd, symbols, section, offset,
13359
0
        *filename_ptr ? NULL : filename_ptr,
13360
0
        functionname_ptr);
13361
0
      return true;
13362
0
    }
13363
13364
5.93k
  msec = bfd_get_section_by_name (abfd, ".mdebug");
13365
5.93k
  if (msec != NULL)
13366
4.70k
    {
13367
4.70k
      flagword origflags;
13368
4.70k
      struct mips_elf_find_line *fi;
13369
4.70k
      const struct ecoff_debug_swap * const swap =
13370
4.70k
  get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
13371
13372
      /* If we are called during a link, mips_elf_final_link may have
13373
   cleared the SEC_HAS_CONTENTS field.  We force it back on here
13374
   if appropriate (which it normally will be).  */
13375
4.70k
      origflags = msec->flags;
13376
4.70k
      if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
13377
4.70k
  msec->flags |= SEC_HAS_CONTENTS;
13378
13379
4.70k
      fi = mips_elf_tdata (abfd)->find_line_info;
13380
4.70k
      if (fi == NULL)
13381
3.45k
  {
13382
3.45k
    bfd_size_type external_fdr_size;
13383
3.45k
    char *fraw_src;
13384
3.45k
    char *fraw_end;
13385
3.45k
    struct fdr *fdr_ptr;
13386
3.45k
    bfd_size_type amt = sizeof (struct mips_elf_find_line);
13387
13388
3.45k
    fi = bfd_zalloc (abfd, amt);
13389
3.45k
    if (fi == NULL)
13390
0
      {
13391
0
        msec->flags = origflags;
13392
0
        return false;
13393
0
      }
13394
13395
3.45k
    if (! _bfd_mips_elf_read_ecoff_info (abfd, msec, &fi->d))
13396
3.20k
      {
13397
3.20k
        msec->flags = origflags;
13398
3.20k
        return false;
13399
3.20k
      }
13400
13401
    /* Swap in the FDR information.  */
13402
248
    amt = fi->d.symbolic_header.ifdMax * sizeof (struct fdr);
13403
248
    fi->d.fdr = bfd_alloc (abfd, amt);
13404
248
    if (fi->d.fdr == NULL)
13405
0
      {
13406
0
        _bfd_ecoff_free_ecoff_debug_info (&fi->d);
13407
0
        msec->flags = origflags;
13408
0
        return false;
13409
0
      }
13410
248
    external_fdr_size = swap->external_fdr_size;
13411
248
    fdr_ptr = fi->d.fdr;
13412
248
    fraw_src = (char *) fi->d.external_fdr;
13413
248
    fraw_end = (fraw_src
13414
248
          + fi->d.symbolic_header.ifdMax * external_fdr_size);
13415
23.4k
    for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
13416
23.2k
      (*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr);
13417
13418
248
    mips_elf_tdata (abfd)->find_line_info = fi;
13419
248
  }
13420
13421
1.49k
      if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
13422
1.49k
          &fi->i, filename_ptr, functionname_ptr,
13423
1.49k
          line_ptr))
13424
946
  {
13425
946
    msec->flags = origflags;
13426
946
    return true;
13427
946
  }
13428
13429
550
      msec->flags = origflags;
13430
550
    }
13431
13432
  /* Fall back on the generic ELF find_nearest_line routine.  */
13433
13434
1.77k
  return _bfd_elf_find_nearest_line (abfd, symbols, section, offset,
13435
1.77k
             filename_ptr, functionname_ptr,
13436
1.77k
             line_ptr, discriminator_ptr);
13437
5.93k
}
13438
13439
bool
13440
_bfd_mips_elf_find_inliner_info (bfd *abfd,
13441
         const char **filename_ptr,
13442
         const char **functionname_ptr,
13443
         unsigned int *line_ptr)
13444
0
{
13445
0
  bool found;
13446
0
  found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
13447
0
           functionname_ptr, line_ptr,
13448
0
           & elf_tdata (abfd)->dwarf2_find_line_info);
13449
0
  return found;
13450
0
}
13451
13452

13453
/* When are writing out the .options or .MIPS.options section,
13454
   remember the bytes we are writing out, so that we can install the
13455
   GP value in the section_processing routine.  */
13456
13457
bool
13458
_bfd_mips_elf_set_section_contents (bfd *abfd, sec_ptr section,
13459
            const void *location,
13460
            file_ptr offset, bfd_size_type count)
13461
74
{
13462
74
  if (MIPS_ELF_OPTIONS_SECTION_NAME_P (section->name))
13463
0
    {
13464
0
      bfd_byte *c;
13465
13466
0
      if (elf_section_data (section) == NULL)
13467
0
  {
13468
0
    size_t amt = sizeof (struct bfd_elf_section_data);
13469
0
    section->used_by_bfd = bfd_zalloc (abfd, amt);
13470
0
    if (elf_section_data (section) == NULL)
13471
0
      return false;
13472
0
  }
13473
0
      c = mips_elf_section_data (section)->u.tdata;
13474
0
      if (c == NULL)
13475
0
  {
13476
0
    c = bfd_zalloc (abfd, section->size);
13477
0
    if (c == NULL)
13478
0
      return false;
13479
0
    mips_elf_section_data (section)->u.tdata = c;
13480
0
  }
13481
13482
0
      memcpy (c + offset, location, count);
13483
0
    }
13484
13485
74
  return _bfd_elf_set_section_contents (abfd, section, location, offset,
13486
74
          count);
13487
74
}
13488
13489
/* This is almost identical to bfd_generic_get_... except that some
13490
   MIPS relocations need to be handled specially.  Sigh.  */
13491
13492
bfd_byte *
13493
_bfd_elf_mips_get_relocated_section_contents
13494
  (bfd *abfd,
13495
   struct bfd_link_info *link_info,
13496
   struct bfd_link_order *link_order,
13497
   bfd_byte *data,
13498
   bool relocatable,
13499
   asymbol **symbols)
13500
237
{
13501
237
  bfd *input_bfd = link_order->u.indirect.section->owner;
13502
237
  asection *input_section = link_order->u.indirect.section;
13503
237
  long reloc_size;
13504
237
  arelent **reloc_vector;
13505
237
  long reloc_count = 0;
13506
237
  bool install = true;
13507
13508
237
  reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
13509
237
  if (reloc_size < 0)
13510
4
    return NULL;
13511
13512
  /* Read in the section.  */
13513
233
  bfd_byte *orig_data = data;
13514
233
  if (!bfd_get_full_section_contents (input_bfd, input_section, &data))
13515
2
    return NULL;
13516
13517
231
  if (data == NULL)
13518
2
    return NULL;
13519
13520
229
  if (reloc_size == 0)
13521
0
    return data;
13522
13523
229
  reloc_vector = (arelent **) bfd_malloc (reloc_size);
13524
229
  if (reloc_vector != NULL)
13525
229
    reloc_count = bfd_canonicalize_reloc (input_bfd, input_section,
13526
229
            reloc_vector, symbols);
13527
13528
229
  if (reloc_vector == NULL || reloc_count < 0)
13529
112
    {
13530
112
      install = false;
13531
112
      if (orig_data == NULL)
13532
2
  free (data);
13533
112
      data = NULL;
13534
112
      goto out;
13535
112
    }
13536
13537
117
  if (reloc_count > 0)
13538
101
    {
13539
101
      arelent **parent;
13540
      /* for mips */
13541
101
      int gp_found;
13542
101
      bfd_vma gp = 0x12345678;  /* initialize just to shut gcc up */
13543
13544
101
      {
13545
101
  struct bfd_hash_entry *h;
13546
101
  struct bfd_link_hash_entry *lh;
13547
  /* Skip all this stuff if we aren't mixing formats.  */
13548
101
  if (abfd && input_bfd
13549
101
      && abfd->xvec == input_bfd->xvec)
13550
101
    lh = 0;
13551
0
  else
13552
0
    {
13553
0
      h = bfd_hash_lookup (&link_info->hash->table, "_gp", false, false);
13554
0
      lh = (struct bfd_link_hash_entry *) h;
13555
0
    }
13556
101
      lookup:
13557
101
  if (lh)
13558
0
    {
13559
0
      switch (lh->type)
13560
0
        {
13561
0
        case bfd_link_hash_undefined:
13562
0
        case bfd_link_hash_undefweak:
13563
0
        case bfd_link_hash_common:
13564
0
    gp_found = 0;
13565
0
    break;
13566
0
        case bfd_link_hash_defined:
13567
0
        case bfd_link_hash_defweak:
13568
0
    gp_found = 1;
13569
0
    gp = lh->u.def.value;
13570
0
    break;
13571
0
        case bfd_link_hash_indirect:
13572
0
        case bfd_link_hash_warning:
13573
0
    lh = lh->u.i.link;
13574
    /* @@FIXME  ignoring warning for now */
13575
0
    goto lookup;
13576
0
        case bfd_link_hash_new:
13577
0
        default:
13578
0
    abort ();
13579
0
        }
13580
0
    }
13581
101
  else
13582
101
    gp_found = 0;
13583
101
      }
13584
      /* end mips */
13585
13586
517
      for (parent = reloc_vector; *parent != NULL; parent++)
13587
487
  {
13588
487
    char *error_message = NULL;
13589
487
    asymbol *symbol;
13590
487
    bfd_reloc_status_type r;
13591
13592
487
    symbol = *(*parent)->sym_ptr_ptr;
13593
    /* PR ld/19628: A specially crafted input file
13594
       can result in a NULL symbol pointer here.  */
13595
487
    if (symbol == NULL)
13596
0
      {
13597
0
        link_info->callbacks->einfo
13598
    /* xgettext:c-format */
13599
0
    (_("%X%P: %pB(%pA): error: relocation for offset %V has no value\n"),
13600
0
     abfd, input_section, (* parent)->address);
13601
0
        install = false;
13602
0
        goto out;
13603
0
      }
13604
13605
    /* Zap reloc field when the symbol is from a discarded
13606
       section, ignoring any addend.  Do the same when called
13607
       from bfd_simple_get_relocated_section_contents for
13608
       undefined symbols in debug sections.  This is to keep
13609
       debug info reasonably sane, in particular so that
13610
       DW_FORM_ref_addr to another file's .debug_info isn't
13611
       confused with an offset into the current file's
13612
       .debug_info.  */
13613
487
    if ((symbol->section != NULL && discarded_section (symbol->section))
13614
487
        || (symbol->section == bfd_und_section_ptr
13615
13
      && (input_section->flags & SEC_DEBUGGING) != 0
13616
9
      && link_info->input_bfds == link_info->output_bfd))
13617
9
      {
13618
9
        bfd_vma off;
13619
9
        static reloc_howto_type none_howto
13620
9
    = HOWTO (0, 0, 0, 0, false, 0, complain_overflow_dont, NULL,
13621
9
       "unused", false, 0, 0, false);
13622
13623
9
        off = ((*parent)->address
13624
9
         * bfd_octets_per_byte (input_bfd, input_section));
13625
9
        _bfd_clear_contents ((*parent)->howto, input_bfd,
13626
9
           input_section, data, off);
13627
9
        (*parent)->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
13628
9
        (*parent)->addend = 0;
13629
9
        (*parent)->howto = &none_howto;
13630
9
        r = bfd_reloc_ok;
13631
9
      }
13632
13633
    /* Specific to MIPS: Deal with relocation types that require
13634
       knowing the gp of the output bfd.  */
13635
13636
    /* If we've managed to find the gp and have a special
13637
       function for the relocation then go ahead, else default
13638
       to the generic handling.  */
13639
478
    else if (gp_found
13640
0
       && ((*parent)->howto->special_function
13641
0
           == _bfd_mips_elf32_gprel16_reloc))
13642
0
      r = _bfd_mips_elf_gprel16_with_gp (input_bfd, symbol, *parent,
13643
0
                 input_section, relocatable,
13644
0
                 data, gp);
13645
478
    else
13646
478
      r = bfd_perform_relocation (input_bfd,
13647
478
          *parent,
13648
478
          data,
13649
478
          input_section,
13650
478
          relocatable ? abfd : NULL,
13651
478
          &error_message);
13652
13653
487
    if (relocatable)
13654
0
      {
13655
0
        asection *os = input_section->output_section;
13656
13657
        /* A partial link, so keep the relocs.  */
13658
0
        os->orelocation[os->reloc_count] = *parent;
13659
0
        os->reloc_count++;
13660
0
      }
13661
13662
487
    if (r != bfd_reloc_ok)
13663
120
      {
13664
120
        _bfd_link_reloc_status_error (abfd, link_info, input_section,
13665
120
              *parent, error_message, r);
13666
120
        if (r == bfd_reloc_outofrange || r == bfd_reloc_notsupported)
13667
71
    {
13668
71
      install = false;
13669
71
      goto out;
13670
71
    }
13671
120
      }
13672
487
  }
13673
101
    }
13674
13675
229
 out:
13676
229
  mips_elf_free_hi16_list (input_bfd, input_section, install, link_info);
13677
229
  free (reloc_vector);
13678
229
  return data;
13679
117
}
13680

13681
static bool
13682
mips_elf_relax_delete_bytes (bfd *abfd,
13683
           asection *sec, bfd_vma addr, int count)
13684
0
{
13685
0
  Elf_Internal_Shdr *symtab_hdr;
13686
0
  unsigned int sec_shndx;
13687
0
  bfd_byte *contents;
13688
0
  Elf_Internal_Rela *irel, *irelend;
13689
0
  Elf_Internal_Sym *isym;
13690
0
  Elf_Internal_Sym *isymend;
13691
0
  struct elf_link_hash_entry **sym_hashes;
13692
0
  struct elf_link_hash_entry **end_hashes;
13693
0
  struct elf_link_hash_entry **start_hashes;
13694
0
  unsigned int symcount;
13695
13696
0
  sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
13697
0
  contents = elf_section_data (sec)->this_hdr.contents;
13698
13699
0
  irel = elf_section_data (sec)->relocs;
13700
0
  irelend = irel + sec->reloc_count;
13701
13702
  /* Actually delete the bytes.  */
13703
0
  memmove (contents + addr, contents + addr + count,
13704
0
     (size_t) (sec->size - addr - count));
13705
0
  sec->size -= count;
13706
13707
  /* Adjust all the relocs.  */
13708
0
  for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
13709
0
    {
13710
      /* Get the new reloc address.  */
13711
0
      if (irel->r_offset > addr)
13712
0
  irel->r_offset -= count;
13713
0
    }
13714
13715
0
  BFD_ASSERT (addr % 2 == 0);
13716
0
  BFD_ASSERT (count % 2 == 0);
13717
13718
  /* Adjust the local symbols defined in this section.  */
13719
0
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
13720
0
  isym = (Elf_Internal_Sym *) symtab_hdr->contents;
13721
0
  for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
13722
0
    if (isym->st_shndx == sec_shndx && isym->st_value > addr)
13723
0
      isym->st_value -= count;
13724
13725
  /* Now adjust the global symbols defined in this section.  */
13726
0
  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
13727
0
        - symtab_hdr->sh_info);
13728
0
  sym_hashes = start_hashes = elf_sym_hashes (abfd);
13729
0
  end_hashes = sym_hashes + symcount;
13730
13731
0
  for (; sym_hashes < end_hashes; sym_hashes++)
13732
0
    {
13733
0
      struct elf_link_hash_entry *sym_hash = *sym_hashes;
13734
13735
0
      if ((sym_hash->root.type == bfd_link_hash_defined
13736
0
     || sym_hash->root.type == bfd_link_hash_defweak)
13737
0
    && sym_hash->root.u.def.section == sec)
13738
0
  {
13739
0
    bfd_vma value = sym_hash->root.u.def.value;
13740
13741
0
    if (ELF_ST_IS_MICROMIPS (sym_hash->other))
13742
0
      value &= MINUS_TWO;
13743
0
    if (value > addr)
13744
0
      sym_hash->root.u.def.value -= count;
13745
0
  }
13746
0
    }
13747
13748
0
  return true;
13749
0
}
13750
13751
13752
/* Opcodes needed for microMIPS relaxation as found in
13753
   opcodes/micromips-opc.c.  */
13754
13755
struct opcode_descriptor {
13756
  unsigned long match;
13757
  unsigned long mask;
13758
};
13759
13760
/* The $ra register aka $31.  */
13761
13762
0
#define RA 31
13763
13764
/* 32-bit instruction format register fields.  */
13765
13766
0
#define OP32_SREG(opcode) (((opcode) >> 16) & 0x1f)
13767
0
#define OP32_TREG(opcode) (((opcode) >> 21) & 0x1f)
13768
13769
/* Check if a 5-bit register index can be abbreviated to 3 bits.  */
13770
13771
#define OP16_VALID_REG(r) \
13772
0
  ((2 <= (r) && (r) <= 7) || (16 <= (r) && (r) <= 17))
13773
13774
13775
/* 32-bit and 16-bit branches.  */
13776
13777
static const struct opcode_descriptor b_insns_32[] = {
13778
  { /* "b", "p",    */ 0x40400000, 0xffff0000 }, /* bgez 0 */
13779
  { /* "b", "p",    */ 0x94000000, 0xffff0000 }, /* beq 0, 0 */
13780
  { 0, 0 }  /* End marker for find_match().  */
13781
};
13782
13783
static const struct opcode_descriptor bc_insn_32 =
13784
  { /* "bc(1|2)(ft)", "N,p",  */ 0x42800000, 0xfec30000 };
13785
13786
static const struct opcode_descriptor bz_insn_32 =
13787
  { /* "b(g|l)(e|t)z", "s,p", */ 0x40000000, 0xff200000 };
13788
13789
static const struct opcode_descriptor bzal_insn_32 =
13790
  { /* "b(ge|lt)zal", "s,p",  */ 0x40200000, 0xffa00000 };
13791
13792
static const struct opcode_descriptor beq_insn_32 =
13793
  { /* "b(eq|ne)", "s,t,p", */ 0x94000000, 0xdc000000 };
13794
13795
static const struct opcode_descriptor b_insn_16 =
13796
  { /* "b", "mD",   */ 0xcc00,     0xfc00 };
13797
13798
static const struct opcode_descriptor bz_insn_16 =
13799
  { /* "b(eq|ne)z", "md,mE",  */ 0x8c00,     0xdc00 };
13800
13801
13802
/* 32-bit and 16-bit branch EQ and NE zero.  */
13803
13804
/* NOTE: All opcode tables have BEQ/BNE in the same order: first the
13805
   eq and second the ne.  This convention is used when replacing a
13806
   32-bit BEQ/BNE with the 16-bit version.  */
13807
13808
0
#define BZC32_REG_FIELD(r) (((r) & 0x1f) << 16)
13809
13810
static const struct opcode_descriptor bz_rs_insns_32[] = {
13811
  { /* "beqz",  "s,p",    */ 0x94000000, 0xffe00000 },
13812
  { /* "bnez",  "s,p",    */ 0xb4000000, 0xffe00000 },
13813
  { 0, 0 }  /* End marker for find_match().  */
13814
};
13815
13816
static const struct opcode_descriptor bz_rt_insns_32[] = {
13817
  { /* "beqz",  "t,p",    */ 0x94000000, 0xfc01f000 },
13818
  { /* "bnez",  "t,p",    */ 0xb4000000, 0xfc01f000 },
13819
  { 0, 0 }  /* End marker for find_match().  */
13820
};
13821
13822
static const struct opcode_descriptor bzc_insns_32[] = {
13823
  { /* "beqzc", "s,p",    */ 0x40e00000, 0xffe00000 },
13824
  { /* "bnezc", "s,p",    */ 0x40a00000, 0xffe00000 },
13825
  { 0, 0 }  /* End marker for find_match().  */
13826
};
13827
13828
static const struct opcode_descriptor bz_insns_16[] = {
13829
  { /* "beqz",  "md,mE",  */ 0x8c00,     0xfc00 },
13830
  { /* "bnez",  "md,mE",  */ 0xac00,     0xfc00 },
13831
  { 0, 0 }  /* End marker for find_match().  */
13832
};
13833
13834
/* Switch between a 5-bit register index and its 3-bit shorthand.  */
13835
13836
0
#define BZ16_REG(opcode) ((((((opcode) >> 7) & 7) + 0x1e) & 0xf) + 2)
13837
#define BZ16_REG_FIELD(r) (((r) & 7) << 7)
13838
13839
13840
/* 32-bit instructions with a delay slot.  */
13841
13842
static const struct opcode_descriptor jal_insn_32_bd16 =
13843
  { /* "jals",  "a",    */ 0x74000000, 0xfc000000 };
13844
13845
static const struct opcode_descriptor jal_insn_32_bd32 =
13846
  { /* "jal", "a",    */ 0xf4000000, 0xfc000000 };
13847
13848
static const struct opcode_descriptor jal_x_insn_32_bd32 =
13849
  { /* "jal[x]", "a",   */ 0xf0000000, 0xf8000000 };
13850
13851
static const struct opcode_descriptor j_insn_32 =
13852
  { /* "j", "a",    */ 0xd4000000, 0xfc000000 };
13853
13854
static const struct opcode_descriptor jalr_insn_32 =
13855
  { /* "jalr[.hb]", "t,s",  */ 0x00000f3c, 0xfc00efff };
13856
13857
/* This table can be compacted, because no opcode replacement is made.  */
13858
13859
static const struct opcode_descriptor ds_insns_32_bd16[] = {
13860
  { /* "jals",  "a",    */ 0x74000000, 0xfc000000 },
13861
13862
  { /* "jalrs[.hb]", "t,s", */ 0x00004f3c, 0xfc00efff },
13863
  { /* "b(ge|lt)zals", "s,p", */ 0x42200000, 0xffa00000 },
13864
13865
  { /* "b(g|l)(e|t)z", "s,p", */ 0x40000000, 0xff200000 },
13866
  { /* "b(eq|ne)", "s,t,p", */ 0x94000000, 0xdc000000 },
13867
  { /* "j", "a",    */ 0xd4000000, 0xfc000000 },
13868
  { 0, 0 }  /* End marker for find_match().  */
13869
};
13870
13871
/* This table can be compacted, because no opcode replacement is made.  */
13872
13873
static const struct opcode_descriptor ds_insns_32_bd32[] = {
13874
  { /* "jal[x]", "a",   */ 0xf0000000, 0xf8000000 },
13875
13876
  { /* "jalr[.hb]", "t,s",  */ 0x00000f3c, 0xfc00efff },
13877
  { /* "b(ge|lt)zal", "s,p",  */ 0x40200000, 0xffa00000 },
13878
  { 0, 0 }  /* End marker for find_match().  */
13879
};
13880
13881
13882
/* 16-bit instructions with a delay slot.  */
13883
13884
static const struct opcode_descriptor jalr_insn_16_bd16 =
13885
  { /* "jalrs", "my,mj",  */ 0x45e0,     0xffe0 };
13886
13887
static const struct opcode_descriptor jalr_insn_16_bd32 =
13888
  { /* "jalr",  "my,mj",  */ 0x45c0,     0xffe0 };
13889
13890
static const struct opcode_descriptor jr_insn_16 =
13891
  { /* "jr",  "mj",   */ 0x4580,     0xffe0 };
13892
13893
0
#define JR16_REG(opcode) ((opcode) & 0x1f)
13894
13895
/* This table can be compacted, because no opcode replacement is made.  */
13896
13897
static const struct opcode_descriptor ds_insns_16_bd16[] = {
13898
  { /* "jalrs", "my,mj",  */ 0x45e0,     0xffe0 },
13899
13900
  { /* "b", "mD",   */ 0xcc00,     0xfc00 },
13901
  { /* "b(eq|ne)z", "md,mE",  */ 0x8c00,     0xdc00 },
13902
  { /* "jr",  "mj",   */ 0x4580,     0xffe0 },
13903
  { 0, 0 }  /* End marker for find_match().  */
13904
};
13905
13906
13907
/* LUI instruction.  */
13908
13909
static const struct opcode_descriptor lui_insn =
13910
 { /* "lui",  "s,u",    */ 0x41a00000, 0xffe00000 };
13911
13912
13913
/* ADDIU instruction.  */
13914
13915
static const struct opcode_descriptor addiu_insn =
13916
  { /* "addiu", "t,r,j",  */ 0x30000000, 0xfc000000 };
13917
13918
static const struct opcode_descriptor addiupc_insn =
13919
  { /* "addiu", "mb,$pc,mQ",  */ 0x78000000, 0xfc000000 };
13920
13921
#define ADDIUPC_REG_FIELD(r) \
13922
0
  (((2 <= (r) && (r) <= 7) ? (r) : ((r) - 16)) << 23)
13923
13924
13925
/* Relaxable instructions in a JAL delay slot: MOVE.  */
13926
13927
/* The 16-bit move has rd in 9:5 and rs in 4:0.  The 32-bit moves
13928
   (ADDU, OR) have rd in 15:11 and rs in 10:16.  */
13929
#define MOVE32_RD(opcode) (((opcode) >> 11) & 0x1f)
13930
#define MOVE32_RS(opcode) (((opcode) >> 16) & 0x1f)
13931
13932
#define MOVE16_RD_FIELD(r) (((r) & 0x1f) << 5)
13933
#define MOVE16_RS_FIELD(r) (((r) & 0x1f)     )
13934
13935
static const struct opcode_descriptor move_insns_32[] = {
13936
  { /* "move",  "d,s",    */ 0x00000290, 0xffe007ff }, /* or   d,s,$0 */
13937
  { /* "move",  "d,s",    */ 0x00000150, 0xffe007ff }, /* addu d,s,$0 */
13938
  { 0, 0 }  /* End marker for find_match().  */
13939
};
13940
13941
static const struct opcode_descriptor move_insn_16 =
13942
  { /* "move",  "mp,mj",  */ 0x0c00,     0xfc00 };
13943
13944
13945
/* NOP instructions.  */
13946
13947
static const struct opcode_descriptor nop_insn_32 =
13948
  { /* "nop", "",   */ 0x00000000, 0xffffffff };
13949
13950
static const struct opcode_descriptor nop_insn_16 =
13951
  { /* "nop", "",   */ 0x0c00,     0xffff };
13952
13953
13954
/* Instruction match support.  */
13955
13956
0
#define MATCH(opcode, insn) ((opcode & insn.mask) == insn.match)
13957
13958
static int
13959
find_match (unsigned long opcode, const struct opcode_descriptor insn[])
13960
0
{
13961
0
  unsigned long indx;
13962
13963
0
  for (indx = 0; insn[indx].mask != 0; indx++)
13964
0
    if (MATCH (opcode, insn[indx]))
13965
0
      return indx;
13966
13967
0
  return -1;
13968
0
}
13969
13970
13971
/* Branch and delay slot decoding support.  */
13972
13973
/* If PTR points to what *might* be a 16-bit branch or jump, then
13974
   return the minimum length of its delay slot, otherwise return 0.
13975
   Non-zero results are not definitive as we might be checking against
13976
   the second half of another instruction.  */
13977
13978
static int
13979
check_br16_dslot (bfd *abfd, bfd_byte *ptr)
13980
0
{
13981
0
  unsigned long opcode;
13982
0
  int bdsize;
13983
13984
0
  opcode = bfd_get_16 (abfd, ptr);
13985
0
  if (MATCH (opcode, jalr_insn_16_bd32) != 0)
13986
    /* 16-bit branch/jump with a 32-bit delay slot.  */
13987
0
    bdsize = 4;
13988
0
  else if (MATCH (opcode, jalr_insn_16_bd16) != 0
13989
0
     || find_match (opcode, ds_insns_16_bd16) >= 0)
13990
    /* 16-bit branch/jump with a 16-bit delay slot.  */
13991
0
    bdsize = 2;
13992
0
  else
13993
    /* No delay slot.  */
13994
0
    bdsize = 0;
13995
13996
0
  return bdsize;
13997
0
}
13998
13999
/* If PTR points to what *might* be a 32-bit branch or jump, then
14000
   return the minimum length of its delay slot, otherwise return 0.
14001
   Non-zero results are not definitive as we might be checking against
14002
   the second half of another instruction.  */
14003
14004
static int
14005
check_br32_dslot (bfd *abfd, bfd_byte *ptr)
14006
0
{
14007
0
  unsigned long opcode;
14008
0
  int bdsize;
14009
14010
0
  opcode = bfd_get_micromips_32 (abfd, ptr);
14011
0
  if (find_match (opcode, ds_insns_32_bd32) >= 0)
14012
    /* 32-bit branch/jump with a 32-bit delay slot.  */
14013
0
    bdsize = 4;
14014
0
  else if (find_match (opcode, ds_insns_32_bd16) >= 0)
14015
    /* 32-bit branch/jump with a 16-bit delay slot.  */
14016
0
    bdsize = 2;
14017
0
  else
14018
    /* No delay slot.  */
14019
0
    bdsize = 0;
14020
14021
0
  return bdsize;
14022
0
}
14023
14024
/* If PTR points to a 16-bit branch or jump with a 32-bit delay slot
14025
   that doesn't fiddle with REG, then return TRUE, otherwise FALSE.  */
14026
14027
static bool
14028
check_br16 (bfd *abfd, bfd_byte *ptr, unsigned long reg)
14029
0
{
14030
0
  unsigned long opcode;
14031
14032
0
  opcode = bfd_get_16 (abfd, ptr);
14033
0
  if (MATCH (opcode, b_insn_16)
14034
            /* B16  */
14035
0
      || (MATCH (opcode, jr_insn_16) && reg != JR16_REG (opcode))
14036
            /* JR16  */
14037
0
      || (MATCH (opcode, bz_insn_16) && reg != BZ16_REG (opcode))
14038
            /* BEQZ16, BNEZ16  */
14039
0
      || (MATCH (opcode, jalr_insn_16_bd32)
14040
            /* JALR16  */
14041
0
    && reg != JR16_REG (opcode) && reg != RA))
14042
0
    return true;
14043
14044
0
  return false;
14045
0
}
14046
14047
/* If PTR points to a 32-bit branch or jump that doesn't fiddle with REG,
14048
   then return TRUE, otherwise FALSE.  */
14049
14050
static bool
14051
check_br32 (bfd *abfd, bfd_byte *ptr, unsigned long reg)
14052
0
{
14053
0
  unsigned long opcode;
14054
14055
0
  opcode = bfd_get_micromips_32 (abfd, ptr);
14056
0
  if (MATCH (opcode, j_insn_32)
14057
            /* J  */
14058
0
      || MATCH (opcode, bc_insn_32)
14059
            /* BC1F, BC1T, BC2F, BC2T  */
14060
0
      || (MATCH (opcode, jal_x_insn_32_bd32) && reg != RA)
14061
            /* JAL, JALX  */
14062
0
      || (MATCH (opcode, bz_insn_32) && reg != OP32_SREG (opcode))
14063
            /* BGEZ, BGTZ, BLEZ, BLTZ  */
14064
0
      || (MATCH (opcode, bzal_insn_32)
14065
            /* BGEZAL, BLTZAL  */
14066
0
    && reg != OP32_SREG (opcode) && reg != RA)
14067
0
      || ((MATCH (opcode, jalr_insn_32) || MATCH (opcode, beq_insn_32))
14068
            /* JALR, JALR.HB, BEQ, BNE  */
14069
0
    && reg != OP32_SREG (opcode) && reg != OP32_TREG (opcode)))
14070
0
    return true;
14071
14072
0
  return false;
14073
0
}
14074
14075
/* If the instruction encoding at PTR and relocations [INTERNAL_RELOCS,
14076
   IRELEND) at OFFSET indicate that there must be a compact branch there,
14077
   then return TRUE, otherwise FALSE.  */
14078
14079
static bool
14080
check_relocated_bzc (bfd *abfd, const bfd_byte *ptr, bfd_vma offset,
14081
         const Elf_Internal_Rela *internal_relocs,
14082
         const Elf_Internal_Rela *irelend)
14083
0
{
14084
0
  const Elf_Internal_Rela *irel;
14085
0
  unsigned long opcode;
14086
14087
0
  opcode = bfd_get_micromips_32 (abfd, ptr);
14088
0
  if (find_match (opcode, bzc_insns_32) < 0)
14089
0
    return false;
14090
14091
0
  for (irel = internal_relocs; irel < irelend; irel++)
14092
0
    if (irel->r_offset == offset
14093
0
  && ELF32_R_TYPE (irel->r_info) == R_MICROMIPS_PC16_S1)
14094
0
      return true;
14095
14096
0
  return false;
14097
0
}
14098
14099
/* Bitsize checking.  */
14100
#define IS_BITSIZE(val, N)            \
14101
0
  (((((val) & ((1ULL << (N)) - 1)) ^ (1ULL << ((N) - 1)))   \
14102
0
    - (1ULL << ((N) - 1))) == (val))
14103
14104

14105
bool
14106
_bfd_mips_elf_relax_section (bfd *abfd, asection *sec,
14107
           struct bfd_link_info *link_info,
14108
           bool *again)
14109
0
{
14110
0
  bool insn32 = mips_elf_hash_table (link_info)->insn32;
14111
0
  Elf_Internal_Shdr *symtab_hdr;
14112
0
  Elf_Internal_Rela *internal_relocs;
14113
0
  Elf_Internal_Rela *irel, *irelend;
14114
0
  bfd_byte *contents = NULL;
14115
0
  Elf_Internal_Sym *isymbuf = NULL;
14116
14117
  /* Assume nothing changes.  */
14118
0
  *again = false;
14119
14120
  /* We don't have to do anything for a relocatable link, if
14121
     this section does not have relocs, or if this is not a
14122
     code section.  */
14123
14124
0
  if (bfd_link_relocatable (link_info)
14125
0
      || sec->reloc_count == 0
14126
0
      || (sec->flags & SEC_RELOC) == 0
14127
0
      || (sec->flags & SEC_HAS_CONTENTS) == 0
14128
0
      || (sec->flags & SEC_CODE) == 0)
14129
0
    return true;
14130
14131
0
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
14132
14133
  /* Get a copy of the native relocations.  */
14134
0
  internal_relocs = (_bfd_elf_link_read_relocs
14135
0
         (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
14136
0
          link_info->keep_memory));
14137
0
  if (internal_relocs == NULL)
14138
0
    goto error_return;
14139
14140
  /* Walk through them looking for relaxing opportunities.  */
14141
0
  irelend = internal_relocs + sec->reloc_count;
14142
0
  for (irel = internal_relocs; irel < irelend; irel++)
14143
0
    {
14144
0
      unsigned long r_symndx = ELF32_R_SYM (irel->r_info);
14145
0
      unsigned int r_type = ELF32_R_TYPE (irel->r_info);
14146
0
      bool target_is_micromips_code_p;
14147
0
      unsigned long opcode;
14148
0
      bfd_vma symval;
14149
0
      bfd_vma pcrval;
14150
0
      bfd_byte *ptr;
14151
0
      int fndopc;
14152
14153
      /* The number of bytes to delete for relaxation and from where
14154
   to delete these bytes starting at irel->r_offset.  */
14155
0
      int delcnt = 0;
14156
0
      int deloff = 0;
14157
14158
      /* If this isn't something that can be relaxed, then ignore
14159
   this reloc.  */
14160
0
      if (r_type != R_MICROMIPS_HI16
14161
0
    && r_type != R_MICROMIPS_PC16_S1
14162
0
    && r_type != R_MICROMIPS_26_S1)
14163
0
  continue;
14164
14165
      /* Get the section contents if we haven't done so already.  */
14166
0
      if (contents == NULL)
14167
0
  {
14168
    /* Get cached copy if it exists.  */
14169
0
    if (elf_section_data (sec)->this_hdr.contents != NULL)
14170
0
      contents = elf_section_data (sec)->this_hdr.contents;
14171
    /* Go get them off disk.  */
14172
0
    else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
14173
0
      goto error_return;
14174
0
  }
14175
0
      ptr = contents + irel->r_offset;
14176
14177
      /* Read this BFD's local symbols if we haven't done so already.  */
14178
0
      if (isymbuf == NULL && symtab_hdr->sh_info != 0)
14179
0
  {
14180
0
    isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
14181
0
    if (isymbuf == NULL)
14182
0
      isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
14183
0
              symtab_hdr->sh_info, 0,
14184
0
              NULL, NULL, NULL);
14185
0
    if (isymbuf == NULL)
14186
0
      goto error_return;
14187
0
  }
14188
14189
      /* Get the value of the symbol referred to by the reloc.  */
14190
0
      if (r_symndx < symtab_hdr->sh_info)
14191
0
  {
14192
    /* A local symbol.  */
14193
0
    Elf_Internal_Sym *isym;
14194
0
    asection *sym_sec;
14195
14196
0
    isym = isymbuf + r_symndx;
14197
0
    if (isym->st_shndx == SHN_UNDEF)
14198
0
      sym_sec = bfd_und_section_ptr;
14199
0
    else if (isym->st_shndx == SHN_ABS)
14200
0
      sym_sec = bfd_abs_section_ptr;
14201
0
    else if (isym->st_shndx == SHN_COMMON)
14202
0
      sym_sec = bfd_com_section_ptr;
14203
0
    else
14204
0
      sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
14205
0
    symval = (isym->st_value
14206
0
        + sym_sec->output_section->vma
14207
0
        + sym_sec->output_offset);
14208
0
    target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (isym->st_other);
14209
0
  }
14210
0
      else
14211
0
  {
14212
0
    unsigned long indx;
14213
0
    struct elf_link_hash_entry *h;
14214
14215
    /* An external symbol.  */
14216
0
    indx = r_symndx - symtab_hdr->sh_info;
14217
0
    h = elf_sym_hashes (abfd)[indx];
14218
0
    BFD_ASSERT (h != NULL);
14219
14220
0
    if (h->root.type != bfd_link_hash_defined
14221
0
        && h->root.type != bfd_link_hash_defweak)
14222
      /* This appears to be a reference to an undefined
14223
         symbol.  Just ignore it -- it will be caught by the
14224
         regular reloc processing.  */
14225
0
      continue;
14226
14227
0
    symval = (h->root.u.def.value
14228
0
        + h->root.u.def.section->output_section->vma
14229
0
        + h->root.u.def.section->output_offset);
14230
0
    target_is_micromips_code_p = (!h->needs_plt
14231
0
          && ELF_ST_IS_MICROMIPS (h->other));
14232
0
  }
14233
14234
14235
      /* For simplicity of coding, we are going to modify the
14236
   section contents, the section relocs, and the BFD symbol
14237
   table.  We must tell the rest of the code not to free up this
14238
   information.  It would be possible to instead create a table
14239
   of changes which have to be made, as is done in coff-mips.c;
14240
   that would be more work, but would require less memory when
14241
   the linker is run.  */
14242
14243
      /* Only 32-bit instructions relaxed.  */
14244
0
      if (irel->r_offset + 4 > sec->size)
14245
0
  continue;
14246
14247
0
      opcode = bfd_get_micromips_32 (abfd, ptr);
14248
14249
      /* This is the pc-relative distance from the instruction the
14250
   relocation is applied to, to the symbol referred.  */
14251
0
      pcrval = (symval
14252
0
    - (sec->output_section->vma + sec->output_offset)
14253
0
    - irel->r_offset);
14254
14255
      /* R_MICROMIPS_HI16 / LUI relaxation to nil, performing relaxation
14256
   of corresponding R_MICROMIPS_LO16 to R_MICROMIPS_HI0_LO16 or
14257
   R_MICROMIPS_PC23_S2.  The R_MICROMIPS_PC23_S2 condition is
14258
14259
     (symval % 4 == 0 && IS_BITSIZE (pcrval, 25))
14260
14261
   where pcrval has first to be adjusted to apply against the LO16
14262
   location (we make the adjustment later on, when we have figured
14263
   out the offset).  */
14264
0
      if (r_type == R_MICROMIPS_HI16 && MATCH (opcode, lui_insn))
14265
0
  {
14266
0
    bool bzc = false;
14267
0
    unsigned long nextopc;
14268
0
    unsigned long reg;
14269
0
    bfd_vma offset;
14270
14271
    /* Give up if the previous reloc was a HI16 against this symbol
14272
       too.  */
14273
0
    if (irel > internal_relocs
14274
0
        && ELF32_R_TYPE (irel[-1].r_info) == R_MICROMIPS_HI16
14275
0
        && ELF32_R_SYM (irel[-1].r_info) == r_symndx)
14276
0
      continue;
14277
14278
    /* Or if the next reloc is not a LO16 against this symbol.  */
14279
0
    if (irel + 1 >= irelend
14280
0
        || ELF32_R_TYPE (irel[1].r_info) != R_MICROMIPS_LO16
14281
0
        || ELF32_R_SYM (irel[1].r_info) != r_symndx)
14282
0
      continue;
14283
14284
    /* Or if the second next reloc is a LO16 against this symbol too.  */
14285
0
    if (irel + 2 >= irelend
14286
0
        && ELF32_R_TYPE (irel[2].r_info) == R_MICROMIPS_LO16
14287
0
        && ELF32_R_SYM (irel[2].r_info) == r_symndx)
14288
0
      continue;
14289
14290
    /* See if the LUI instruction *might* be in a branch delay slot.
14291
       We check whether what looks like a 16-bit branch or jump is
14292
       actually an immediate argument to a compact branch, and let
14293
       it through if so.  */
14294
0
    if (irel->r_offset >= 2
14295
0
        && check_br16_dslot (abfd, ptr - 2)
14296
0
        && !(irel->r_offset >= 4
14297
0
       && (bzc = check_relocated_bzc (abfd,
14298
0
              ptr - 4, irel->r_offset - 4,
14299
0
              internal_relocs, irelend))))
14300
0
      continue;
14301
0
    if (irel->r_offset >= 4
14302
0
        && !bzc
14303
0
        && check_br32_dslot (abfd, ptr - 4))
14304
0
      continue;
14305
14306
0
    reg = OP32_SREG (opcode);
14307
14308
    /* We only relax adjacent instructions or ones separated with
14309
       a branch or jump that has a delay slot.  The branch or jump
14310
       must not fiddle with the register used to hold the address.
14311
       Subtract 4 for the LUI itself.  */
14312
0
    offset = irel[1].r_offset - irel[0].r_offset;
14313
0
    switch (offset - 4)
14314
0
      {
14315
0
      case 0:
14316
0
        break;
14317
0
      case 2:
14318
0
        if (check_br16 (abfd, ptr + 4, reg))
14319
0
    break;
14320
0
        continue;
14321
0
      case 4:
14322
0
        if (check_br32 (abfd, ptr + 4, reg))
14323
0
    break;
14324
0
        continue;
14325
0
      default:
14326
0
        continue;
14327
0
      }
14328
14329
0
    nextopc = bfd_get_micromips_32 (abfd, contents + irel[1].r_offset);
14330
14331
    /* Give up unless the same register is used with both
14332
       relocations.  */
14333
0
    if (OP32_SREG (nextopc) != reg)
14334
0
      continue;
14335
14336
    /* Now adjust pcrval, subtracting the offset to the LO16 reloc
14337
       and rounding up to take masking of the two LSBs into account.  */
14338
0
    pcrval = ((pcrval - offset + 3) | 3) ^ 3;
14339
14340
    /* R_MICROMIPS_LO16 relaxation to R_MICROMIPS_HI0_LO16.  */
14341
0
    if (IS_BITSIZE (symval, 16))
14342
0
      {
14343
        /* Fix the relocation's type.  */
14344
0
        irel[1].r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_HI0_LO16);
14345
14346
        /* Instructions using R_MICROMIPS_LO16 have the base or
14347
     source register in bits 20:16.  This register becomes $0
14348
     (zero) as the result of the R_MICROMIPS_HI16 being 0.  */
14349
0
        nextopc &= ~0x001f0000;
14350
0
        bfd_put_16 (abfd, (nextopc >> 16) & 0xffff,
14351
0
        contents + irel[1].r_offset);
14352
0
      }
14353
14354
    /* R_MICROMIPS_LO16 / ADDIU relaxation to R_MICROMIPS_PC23_S2.
14355
       We add 4 to take LUI deletion into account while checking
14356
       the PC-relative distance.  */
14357
0
    else if (symval % 4 == 0
14358
0
       && IS_BITSIZE (pcrval + 4, 25)
14359
0
       && MATCH (nextopc, addiu_insn)
14360
0
       && OP32_TREG (nextopc) == OP32_SREG (nextopc)
14361
0
       && OP16_VALID_REG (OP32_TREG (nextopc)))
14362
0
      {
14363
        /* Fix the relocation's type.  */
14364
0
        irel[1].r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC23_S2);
14365
14366
        /* Replace ADDIU with the ADDIUPC version.  */
14367
0
        nextopc = (addiupc_insn.match
14368
0
       | ADDIUPC_REG_FIELD (OP32_TREG (nextopc)));
14369
14370
0
        bfd_put_micromips_32 (abfd, nextopc,
14371
0
            contents + irel[1].r_offset);
14372
0
      }
14373
14374
    /* Can't do anything, give up, sigh...  */
14375
0
    else
14376
0
      continue;
14377
14378
    /* Fix the relocation's type.  */
14379
0
    irel->r_info = ELF32_R_INFO (r_symndx, R_MIPS_NONE);
14380
14381
    /* Delete the LUI instruction: 4 bytes at irel->r_offset.  */
14382
0
    delcnt = 4;
14383
0
    deloff = 0;
14384
0
  }
14385
14386
      /* Compact branch relaxation -- due to the multitude of macros
14387
   employed by the compiler/assembler, compact branches are not
14388
   always generated.  Obviously, this can/will be fixed elsewhere,
14389
   but there is no drawback in double checking it here.  */
14390
0
      else if (r_type == R_MICROMIPS_PC16_S1
14391
0
         && irel->r_offset + 5 < sec->size
14392
0
         && ((fndopc = find_match (opcode, bz_rs_insns_32)) >= 0
14393
0
       || (fndopc = find_match (opcode, bz_rt_insns_32)) >= 0)
14394
0
         && ((!insn32
14395
0
        && (delcnt = MATCH (bfd_get_16 (abfd, ptr + 4),
14396
0
          nop_insn_16) ? 2 : 0))
14397
0
       || (irel->r_offset + 7 < sec->size
14398
0
           && (delcnt = MATCH (bfd_get_micromips_32 (abfd,
14399
0
                 ptr + 4),
14400
0
             nop_insn_32) ? 4 : 0))))
14401
0
  {
14402
0
    unsigned long reg;
14403
14404
0
    reg = OP32_SREG (opcode) ? OP32_SREG (opcode) : OP32_TREG (opcode);
14405
14406
    /* Replace BEQZ/BNEZ with the compact version.  */
14407
0
    opcode = (bzc_insns_32[fndopc].match
14408
0
        | BZC32_REG_FIELD (reg)
14409
0
        | (opcode & 0xffff));   /* Addend value.  */
14410
14411
0
    bfd_put_micromips_32 (abfd, opcode, ptr);
14412
14413
    /* Delete the delay slot NOP: two or four bytes from
14414
       irel->offset + 4; delcnt has already been set above.  */
14415
0
    deloff = 4;
14416
0
  }
14417
14418
      /* R_MICROMIPS_PC16_S1 relaxation to R_MICROMIPS_PC10_S1.  We need
14419
   to check the distance from the next instruction, so subtract 2.  */
14420
0
      else if (!insn32
14421
0
         && r_type == R_MICROMIPS_PC16_S1
14422
0
         && IS_BITSIZE (pcrval - 2, 11)
14423
0
         && find_match (opcode, b_insns_32) >= 0)
14424
0
  {
14425
    /* Fix the relocation's type.  */
14426
0
    irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC10_S1);
14427
14428
    /* Replace the 32-bit opcode with a 16-bit opcode.  */
14429
0
    bfd_put_16 (abfd,
14430
0
          (b_insn_16.match
14431
0
           | (opcode & 0x3ff)),   /* Addend value.  */
14432
0
          ptr);
14433
14434
    /* Delete 2 bytes from irel->r_offset + 2.  */
14435
0
    delcnt = 2;
14436
0
    deloff = 2;
14437
0
  }
14438
14439
      /* R_MICROMIPS_PC16_S1 relaxation to R_MICROMIPS_PC7_S1.  We need
14440
   to check the distance from the next instruction, so subtract 2.  */
14441
0
      else if (!insn32
14442
0
         && r_type == R_MICROMIPS_PC16_S1
14443
0
         && IS_BITSIZE (pcrval - 2, 8)
14444
0
         && (((fndopc = find_match (opcode, bz_rs_insns_32)) >= 0
14445
0
        && OP16_VALID_REG (OP32_SREG (opcode)))
14446
0
       || ((fndopc = find_match (opcode, bz_rt_insns_32)) >= 0
14447
0
           && OP16_VALID_REG (OP32_TREG (opcode)))))
14448
0
  {
14449
0
    unsigned long reg;
14450
14451
0
    reg = OP32_SREG (opcode) ? OP32_SREG (opcode) : OP32_TREG (opcode);
14452
14453
    /* Fix the relocation's type.  */
14454
0
    irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC7_S1);
14455
14456
    /* Replace the 32-bit opcode with a 16-bit opcode.  */
14457
0
    bfd_put_16 (abfd,
14458
0
          (bz_insns_16[fndopc].match
14459
0
           | BZ16_REG_FIELD (reg)
14460
0
           | (opcode & 0x7f)),    /* Addend value.  */
14461
0
          ptr);
14462
14463
    /* Delete 2 bytes from irel->r_offset + 2.  */
14464
0
    delcnt = 2;
14465
0
    deloff = 2;
14466
0
  }
14467
14468
      /* R_MICROMIPS_26_S1 -- JAL to JALS relaxation for microMIPS targets.  */
14469
0
      else if (!insn32
14470
0
         && r_type == R_MICROMIPS_26_S1
14471
0
         && target_is_micromips_code_p
14472
0
         && irel->r_offset + 7 < sec->size
14473
0
         && MATCH (opcode, jal_insn_32_bd32))
14474
0
  {
14475
0
    unsigned long n32opc;
14476
0
    bool relaxed = false;
14477
14478
0
    n32opc = bfd_get_micromips_32 (abfd, ptr + 4);
14479
14480
0
    if (MATCH (n32opc, nop_insn_32))
14481
0
      {
14482
        /* Replace delay slot 32-bit NOP with a 16-bit NOP.  */
14483
0
        bfd_put_16 (abfd, nop_insn_16.match, ptr + 4);
14484
14485
0
        relaxed = true;
14486
0
      }
14487
0
    else if (find_match (n32opc, move_insns_32) >= 0)
14488
0
      {
14489
        /* Replace delay slot 32-bit MOVE with 16-bit MOVE.  */
14490
0
        bfd_put_16 (abfd,
14491
0
        (move_insn_16.match
14492
0
         | MOVE16_RD_FIELD (MOVE32_RD (n32opc))
14493
0
         | MOVE16_RS_FIELD (MOVE32_RS (n32opc))),
14494
0
        ptr + 4);
14495
14496
0
        relaxed = true;
14497
0
      }
14498
    /* Other 32-bit instructions relaxable to 16-bit
14499
       instructions will be handled here later.  */
14500
14501
0
    if (relaxed)
14502
0
      {
14503
        /* JAL with 32-bit delay slot that is changed to a JALS
14504
     with 16-bit delay slot.  */
14505
0
        bfd_put_micromips_32 (abfd, jal_insn_32_bd16.match, ptr);
14506
14507
        /* Delete 2 bytes from irel->r_offset + 6.  */
14508
0
        delcnt = 2;
14509
0
        deloff = 6;
14510
0
      }
14511
0
  }
14512
14513
0
      if (delcnt != 0)
14514
0
  {
14515
    /* Note that we've changed the relocs, section contents, etc.  */
14516
0
    elf_section_data (sec)->relocs = internal_relocs;
14517
0
    elf_section_data (sec)->this_hdr.contents = contents;
14518
0
    symtab_hdr->contents = (unsigned char *) isymbuf;
14519
14520
    /* Delete bytes depending on the delcnt and deloff.  */
14521
0
    if (!mips_elf_relax_delete_bytes (abfd, sec,
14522
0
              irel->r_offset + deloff, delcnt))
14523
0
      goto error_return;
14524
14525
    /* That will change things, so we should relax again.
14526
       Note that this is not required, and it may be slow.  */
14527
0
    *again = true;
14528
0
  }
14529
0
    }
14530
14531
0
  if (isymbuf != NULL
14532
0
      && symtab_hdr->contents != (unsigned char *) isymbuf)
14533
0
    {
14534
0
      if (! link_info->keep_memory)
14535
0
  free (isymbuf);
14536
0
      else
14537
0
  {
14538
    /* Cache the symbols for elf_link_input_bfd.  */
14539
0
    symtab_hdr->contents = (unsigned char *) isymbuf;
14540
0
  }
14541
0
    }
14542
14543
0
  if (contents != NULL
14544
0
      && elf_section_data (sec)->this_hdr.contents != contents)
14545
0
    {
14546
0
      if (! link_info->keep_memory)
14547
0
  free (contents);
14548
0
      else
14549
0
  {
14550
    /* Cache the section contents for elf_link_input_bfd.  */
14551
0
    elf_section_data (sec)->this_hdr.contents = contents;
14552
0
  }
14553
0
    }
14554
14555
0
  if (elf_section_data (sec)->relocs != internal_relocs)
14556
0
    free (internal_relocs);
14557
14558
0
  return true;
14559
14560
0
 error_return:
14561
0
  if (symtab_hdr->contents != (unsigned char *) isymbuf)
14562
0
    free (isymbuf);
14563
0
  if (elf_section_data (sec)->this_hdr.contents != contents)
14564
0
    free (contents);
14565
0
  if (elf_section_data (sec)->relocs != internal_relocs)
14566
0
    free (internal_relocs);
14567
14568
0
  return false;
14569
0
}
14570

14571
/* Create a MIPS ELF linker hash table.  */
14572
14573
struct bfd_link_hash_table *
14574
_bfd_mips_elf_link_hash_table_create (bfd *abfd)
14575
0
{
14576
0
  struct mips_elf_link_hash_table *ret;
14577
0
  size_t amt = sizeof (struct mips_elf_link_hash_table);
14578
14579
0
  ret = bfd_zmalloc (amt);
14580
0
  if (ret == NULL)
14581
0
    return NULL;
14582
14583
0
  if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
14584
0
              mips_elf_link_hash_newfunc,
14585
0
              sizeof (struct mips_elf_link_hash_entry)))
14586
0
    {
14587
0
      free (ret);
14588
0
      return NULL;
14589
0
    }
14590
0
  ret->root.init_plt_refcount.plist = NULL;
14591
0
  ret->root.init_plt_offset.plist = NULL;
14592
14593
0
  return &ret->root.root;
14594
0
}
14595
14596
/* Likewise, but indicate that the target is VxWorks.  */
14597
14598
struct bfd_link_hash_table *
14599
_bfd_mips_vxworks_link_hash_table_create (bfd *abfd)
14600
0
{
14601
0
  struct bfd_link_hash_table *ret;
14602
14603
0
  ret = _bfd_mips_elf_link_hash_table_create (abfd);
14604
0
  if (ret)
14605
0
    {
14606
0
      struct mips_elf_link_hash_table *htab;
14607
14608
0
      htab = (struct mips_elf_link_hash_table *) ret;
14609
0
      htab->use_plts_and_copy_relocs = true;
14610
0
    }
14611
0
  return ret;
14612
0
}
14613
14614
/* A function that the linker calls if we are allowed to use PLTs
14615
   and copy relocs.  */
14616
14617
void
14618
_bfd_mips_elf_use_plts_and_copy_relocs (struct bfd_link_info *info)
14619
0
{
14620
0
  mips_elf_hash_table (info)->use_plts_and_copy_relocs = true;
14621
0
}
14622
14623
/* A function that the linker calls to select between all or only
14624
   32-bit microMIPS instructions, and between making or ignoring
14625
   branch relocation checks for invalid transitions between ISA modes.
14626
   Also record whether we have been configured for a GNU target.  */
14627
14628
void
14629
_bfd_mips_elf_linker_flags (struct bfd_link_info *info, bool insn32,
14630
          bool ignore_branch_isa,
14631
          bool gnu_target)
14632
0
{
14633
0
  mips_elf_hash_table (info)->insn32 = insn32;
14634
0
  mips_elf_hash_table (info)->ignore_branch_isa = ignore_branch_isa;
14635
0
  mips_elf_hash_table (info)->gnu_target = gnu_target;
14636
0
}
14637
14638
/* A function that the linker calls to enable use of compact branches in
14639
   linker generated code for MIPSR6.  */
14640
14641
void
14642
_bfd_mips_elf_compact_branches (struct bfd_link_info *info, bool on)
14643
0
{
14644
0
  mips_elf_hash_table (info)->compact_branches = on;
14645
0
}
14646
14647

14648
/* Structure for saying that BFD machine EXTENSION extends BASE.  */
14649
14650
struct mips_mach_extension
14651
{
14652
  unsigned long extension, base;
14653
};
14654
14655
/* An array that maps 64-bit architectures to the corresponding 32-bit
14656
   architectures.  */
14657
static const struct mips_mach_extension mips_mach_32_64[] =
14658
{
14659
  { bfd_mach_mipsisa64r6, bfd_mach_mipsisa32r6 },
14660
  { bfd_mach_mipsisa64r5, bfd_mach_mipsisa32r5 },
14661
  { bfd_mach_mipsisa64r3, bfd_mach_mipsisa32r3 },
14662
  { bfd_mach_mipsisa64r2, bfd_mach_mipsisa32r2 },
14663
  { bfd_mach_mipsisa64,   bfd_mach_mipsisa32 }
14664
};
14665
14666
/* An array describing how BFD machines relate to one another.  The entries
14667
   are ordered topologically with MIPS I extensions listed last.  */
14668
14669
static const struct mips_mach_extension mips_mach_extensions[] =
14670
{
14671
  /* MIPS64r2 extensions.  */
14672
  { bfd_mach_mips_octeon3, bfd_mach_mips_octeon2 },
14673
  { bfd_mach_mips_octeon2, bfd_mach_mips_octeonp },
14674
  { bfd_mach_mips_octeonp, bfd_mach_mips_octeon },
14675
  { bfd_mach_mips_octeon, bfd_mach_mipsisa64r2 },
14676
  { bfd_mach_mips_gs264e, bfd_mach_mips_gs464e },
14677
  { bfd_mach_mips_gs464e, bfd_mach_mips_gs464 },
14678
  { bfd_mach_mips_gs464, bfd_mach_mipsisa64r2 },
14679
14680
  /* MIPS64 extensions.  */
14681
  { bfd_mach_mipsisa64r2, bfd_mach_mipsisa64 },
14682
  { bfd_mach_mips_sb1, bfd_mach_mipsisa64 },
14683
  { bfd_mach_mips_xlr, bfd_mach_mipsisa64 },
14684
14685
  /* MIPS V extensions.  */
14686
  { bfd_mach_mipsisa64, bfd_mach_mips5 },
14687
14688
  /* R10000 extensions.  */
14689
  { bfd_mach_mips12000, bfd_mach_mips10000 },
14690
  { bfd_mach_mips14000, bfd_mach_mips10000 },
14691
  { bfd_mach_mips16000, bfd_mach_mips10000 },
14692
14693
  /* R5000 extensions.  Note: the vr5500 ISA is an extension of the core
14694
     vr5400 ISA, but doesn't include the multimedia stuff.  It seems
14695
     better to allow vr5400 and vr5500 code to be merged anyway, since
14696
     many libraries will just use the core ISA.  Perhaps we could add
14697
     some sort of ASE flag if this ever proves a problem.  */
14698
  { bfd_mach_mips5500, bfd_mach_mips5400 },
14699
  { bfd_mach_mips5400, bfd_mach_mips5000 },
14700
14701
  /* MIPS IV extensions.  */
14702
  { bfd_mach_mips5, bfd_mach_mips8000 },
14703
  { bfd_mach_mips10000, bfd_mach_mips8000 },
14704
  { bfd_mach_mips5000, bfd_mach_mips8000 },
14705
  { bfd_mach_mips7000, bfd_mach_mips8000 },
14706
  { bfd_mach_mips9000, bfd_mach_mips8000 },
14707
14708
  /* VR4100 extensions.  */
14709
  { bfd_mach_mips4120, bfd_mach_mips4100 },
14710
  { bfd_mach_mips4111, bfd_mach_mips4100 },
14711
14712
  /* MIPS III extensions.  */
14713
  { bfd_mach_mips_loongson_2e, bfd_mach_mips4000 },
14714
  { bfd_mach_mips_loongson_2f, bfd_mach_mips4000 },
14715
  { bfd_mach_mips8000, bfd_mach_mips4000 },
14716
  { bfd_mach_mips4650, bfd_mach_mips4000 },
14717
  { bfd_mach_mips4600, bfd_mach_mips4000 },
14718
  { bfd_mach_mips4400, bfd_mach_mips4000 },
14719
  { bfd_mach_mips4300, bfd_mach_mips4000 },
14720
  { bfd_mach_mips4100, bfd_mach_mips4000 },
14721
  { bfd_mach_mips5900, bfd_mach_mips4000 },
14722
14723
  /* MIPS32r3 extensions.  */
14724
  { bfd_mach_mips_interaptiv_mr2, bfd_mach_mipsisa32r3 },
14725
14726
  /* MIPS32r2 extensions.  */
14727
  { bfd_mach_mipsisa32r3, bfd_mach_mipsisa32r2 },
14728
14729
  /* MIPS32 extensions.  */
14730
  { bfd_mach_mipsisa32r2, bfd_mach_mipsisa32 },
14731
14732
  /* MIPS II extensions.  */
14733
  { bfd_mach_mips4000, bfd_mach_mips6000 },
14734
  { bfd_mach_mipsisa32, bfd_mach_mips6000 },
14735
  { bfd_mach_mips4010, bfd_mach_mips6000 },
14736
  { bfd_mach_mips_allegrex, bfd_mach_mips6000 },
14737
14738
  /* MIPS I extensions.  */
14739
  { bfd_mach_mips6000, bfd_mach_mips3000 },
14740
  { bfd_mach_mips3900, bfd_mach_mips3000 }
14741
};
14742
14743
/* Return true if bfd machine EXTENSION is the same as BASE, or if
14744
   EXTENSION is the 64-bit equivalent of a 32-bit BASE.  */
14745
14746
static bool
14747
mips_mach_extends_32_64 (unsigned long base, unsigned long extension)
14748
0
{
14749
0
  size_t i;
14750
14751
0
  if (extension == base)
14752
0
    return true;
14753
14754
0
  for (i = 0; i < ARRAY_SIZE (mips_mach_32_64); i++)
14755
0
    if (extension == mips_mach_32_64[i].extension)
14756
0
      return base == mips_mach_32_64[i].base;
14757
14758
0
  return false;
14759
0
}
14760
14761
static bool
14762
mips_mach_extends_p (unsigned long base, unsigned long extension)
14763
0
{
14764
0
  size_t i;
14765
14766
0
  if (mips_mach_extends_32_64 (base, extension))
14767
0
    return true;
14768
14769
0
  for (i = 0; i < ARRAY_SIZE (mips_mach_extensions); i++)
14770
0
    if (extension == mips_mach_extensions[i].extension)
14771
0
      {
14772
0
  extension = mips_mach_extensions[i].base;
14773
0
  if (mips_mach_extends_32_64 (base, extension))
14774
0
    return true;
14775
0
      }
14776
14777
0
  return false;
14778
0
}
14779
14780
/* Return the BFD mach for each .MIPS.abiflags ISA Extension.  */
14781
14782
static unsigned long
14783
bfd_mips_isa_ext_mach (unsigned int isa_ext)
14784
0
{
14785
0
  switch (isa_ext)
14786
0
    {
14787
0
    case AFL_EXT_3900:       return bfd_mach_mips3900;
14788
0
    case AFL_EXT_4010:       return bfd_mach_mips4010;
14789
0
    case AFL_EXT_4100:       return bfd_mach_mips4100;
14790
0
    case AFL_EXT_4111:       return bfd_mach_mips4111;
14791
0
    case AFL_EXT_4120:       return bfd_mach_mips4120;
14792
0
    case AFL_EXT_4650:       return bfd_mach_mips4650;
14793
0
    case AFL_EXT_5400:       return bfd_mach_mips5400;
14794
0
    case AFL_EXT_5500:       return bfd_mach_mips5500;
14795
0
    case AFL_EXT_5900:       return bfd_mach_mips5900;
14796
0
    case AFL_EXT_10000:       return bfd_mach_mips10000;
14797
0
    case AFL_EXT_LOONGSON_2E: return bfd_mach_mips_loongson_2e;
14798
0
    case AFL_EXT_LOONGSON_2F: return bfd_mach_mips_loongson_2f;
14799
0
    case AFL_EXT_SB1:       return bfd_mach_mips_sb1;
14800
0
    case AFL_EXT_OCTEON:      return bfd_mach_mips_octeon;
14801
0
    case AFL_EXT_OCTEONP:     return bfd_mach_mips_octeonp;
14802
0
    case AFL_EXT_OCTEON2:     return bfd_mach_mips_octeon2;
14803
0
    case AFL_EXT_XLR:       return bfd_mach_mips_xlr;
14804
0
    default:          return bfd_mach_mips3000;
14805
0
    }
14806
0
}
14807
14808
/* Return the .MIPS.abiflags value representing each ISA Extension.  */
14809
14810
unsigned int
14811
bfd_mips_isa_ext (bfd *abfd)
14812
0
{
14813
0
  switch (bfd_get_mach (abfd))
14814
0
    {
14815
0
    case bfd_mach_mips3900:     return AFL_EXT_3900;
14816
0
    case bfd_mach_mips4010:     return AFL_EXT_4010;
14817
0
    case bfd_mach_mips4100:     return AFL_EXT_4100;
14818
0
    case bfd_mach_mips4111:     return AFL_EXT_4111;
14819
0
    case bfd_mach_mips4120:     return AFL_EXT_4120;
14820
0
    case bfd_mach_mips4650:     return AFL_EXT_4650;
14821
0
    case bfd_mach_mips5400:     return AFL_EXT_5400;
14822
0
    case bfd_mach_mips5500:     return AFL_EXT_5500;
14823
0
    case bfd_mach_mips5900:     return AFL_EXT_5900;
14824
0
    case bfd_mach_mips10000:     return AFL_EXT_10000;
14825
0
    case bfd_mach_mips_loongson_2e: return AFL_EXT_LOONGSON_2E;
14826
0
    case bfd_mach_mips_loongson_2f: return AFL_EXT_LOONGSON_2F;
14827
0
    case bfd_mach_mips_sb1:     return AFL_EXT_SB1;
14828
0
    case bfd_mach_mips_octeon:     return AFL_EXT_OCTEON;
14829
0
    case bfd_mach_mips_octeonp:     return AFL_EXT_OCTEONP;
14830
0
    case bfd_mach_mips_octeon3:     return AFL_EXT_OCTEON3;
14831
0
    case bfd_mach_mips_octeon2:     return AFL_EXT_OCTEON2;
14832
0
    case bfd_mach_mips_xlr:     return AFL_EXT_XLR;
14833
0
    case bfd_mach_mips_interaptiv_mr2:
14834
0
      return AFL_EXT_INTERAPTIV_MR2;
14835
0
    default:          return 0;
14836
0
    }
14837
0
}
14838
14839
/* Encode ISA level and revision as a single value.  */
14840
0
#define LEVEL_REV(LEV,REV) ((LEV) << 3 | (REV))
14841
14842
/* Decode a single value into level and revision.  */
14843
0
#define ISA_LEVEL(LEVREV)  ((LEVREV) >> 3)
14844
0
#define ISA_REV(LEVREV)    ((LEVREV) & 0x7)
14845
14846
/* Update the isa_level, isa_rev, isa_ext fields of abiflags.  */
14847
14848
static void
14849
update_mips_abiflags_isa (bfd *abfd, Elf_Internal_ABIFlags_v0 *abiflags)
14850
0
{
14851
0
  int new_isa = 0;
14852
0
  switch (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH)
14853
0
    {
14854
0
    case EF_MIPS_ARCH_1:    new_isa = LEVEL_REV (1, 0); break;
14855
0
    case EF_MIPS_ARCH_2:    new_isa = LEVEL_REV (2, 0); break;
14856
0
    case EF_MIPS_ARCH_3:    new_isa = LEVEL_REV (3, 0); break;
14857
0
    case EF_MIPS_ARCH_4:    new_isa = LEVEL_REV (4, 0); break;
14858
0
    case EF_MIPS_ARCH_5:    new_isa = LEVEL_REV (5, 0); break;
14859
0
    case EF_MIPS_ARCH_32:   new_isa = LEVEL_REV (32, 1); break;
14860
0
    case EF_MIPS_ARCH_32R2: new_isa = LEVEL_REV (32, 2); break;
14861
0
    case EF_MIPS_ARCH_32R6: new_isa = LEVEL_REV (32, 6); break;
14862
0
    case EF_MIPS_ARCH_64:   new_isa = LEVEL_REV (64, 1); break;
14863
0
    case EF_MIPS_ARCH_64R2: new_isa = LEVEL_REV (64, 2); break;
14864
0
    case EF_MIPS_ARCH_64R6: new_isa = LEVEL_REV (64, 6); break;
14865
0
    default:
14866
0
      _bfd_error_handler
14867
  /* xgettext:c-format */
14868
0
  (_("%pB: unknown architecture %s"),
14869
0
   abfd, bfd_printable_name (abfd));
14870
0
    }
14871
14872
0
  if (new_isa > LEVEL_REV (abiflags->isa_level, abiflags->isa_rev))
14873
0
    {
14874
0
      abiflags->isa_level = ISA_LEVEL (new_isa);
14875
0
      abiflags->isa_rev = ISA_REV (new_isa);
14876
0
    }
14877
14878
  /* Update the isa_ext if ABFD describes a further extension.  */
14879
0
  if (mips_mach_extends_p (bfd_mips_isa_ext_mach (abiflags->isa_ext),
14880
0
         bfd_get_mach (abfd)))
14881
0
    abiflags->isa_ext = bfd_mips_isa_ext (abfd);
14882
0
}
14883
14884
/* Return true if the given ELF header flags describe a 32-bit binary.  */
14885
14886
static bool
14887
mips_32bit_flags_p (flagword flags)
14888
0
{
14889
0
  return ((flags & EF_MIPS_32BITMODE) != 0
14890
0
    || (flags & EF_MIPS_ABI) == EF_MIPS_ABI_O32
14891
0
    || (flags & EF_MIPS_ABI) == EF_MIPS_ABI_EABI32
14892
0
    || (flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_1
14893
0
    || (flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_2
14894
0
    || (flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32
14895
0
    || (flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32R2
14896
0
    || (flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32R6);
14897
0
}
14898
14899
/* Infer the content of the ABI flags based on the elf header.  */
14900
14901
static void
14902
infer_mips_abiflags (bfd *abfd, Elf_Internal_ABIFlags_v0* abiflags)
14903
0
{
14904
0
  obj_attribute *in_attr;
14905
14906
0
  memset (abiflags, 0, sizeof (Elf_Internal_ABIFlags_v0));
14907
0
  update_mips_abiflags_isa (abfd, abiflags);
14908
14909
0
  if (mips_32bit_flags_p (elf_elfheader (abfd)->e_flags))
14910
0
    abiflags->gpr_size = AFL_REG_32;
14911
0
  else
14912
0
    abiflags->gpr_size = AFL_REG_64;
14913
14914
0
  abiflags->cpr1_size = AFL_REG_NONE;
14915
14916
0
  in_attr = elf_known_obj_attributes (abfd)[OBJ_ATTR_GNU];
14917
0
  abiflags->fp_abi = in_attr[Tag_GNU_MIPS_ABI_FP].i;
14918
14919
0
  if (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_SINGLE
14920
0
      || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_XX
14921
0
      || (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_DOUBLE
14922
0
    && abiflags->gpr_size == AFL_REG_32))
14923
0
    abiflags->cpr1_size = AFL_REG_32;
14924
0
  else if (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_DOUBLE
14925
0
     || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_64
14926
0
     || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_64A)
14927
0
    abiflags->cpr1_size = AFL_REG_64;
14928
14929
0
  abiflags->cpr2_size = AFL_REG_NONE;
14930
14931
0
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
14932
0
    abiflags->ases |= AFL_ASE_MDMX;
14933
0
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
14934
0
    abiflags->ases |= AFL_ASE_MIPS16;
14935
0
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
14936
0
    abiflags->ases |= AFL_ASE_MICROMIPS;
14937
14938
0
  if (abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_ANY
14939
0
      && abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_SOFT
14940
0
      && abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_64A
14941
0
      && abiflags->isa_level >= 32
14942
0
      && abiflags->ases != AFL_ASE_LOONGSON_EXT)
14943
0
    abiflags->flags1 |= AFL_FLAGS1_ODDSPREG;
14944
0
}
14945
14946
/* We need to use a special link routine to handle the .reginfo and
14947
   the .mdebug sections.  We need to merge all instances of these
14948
   sections together, not write them all out sequentially.  */
14949
14950
bool
14951
_bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
14952
0
{
14953
0
  asection *o;
14954
0
  struct bfd_link_order *p;
14955
0
  asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
14956
0
  asection *rtproc_sec, *abiflags_sec;
14957
0
  Elf32_RegInfo reginfo;
14958
0
  struct ecoff_debug_info debug;
14959
0
  struct mips_htab_traverse_info hti;
14960
0
  elf_backend_data *bed = get_elf_backend_data (abfd);
14961
0
  const struct ecoff_debug_swap *swap = bed->elf_backend_ecoff_debug_swap;
14962
0
  HDRR *symhdr = &debug.symbolic_header;
14963
0
  void *mdebug_handle = NULL;
14964
0
  asection *s;
14965
0
  EXTR esym;
14966
0
  unsigned int i;
14967
0
  bfd_size_type amt;
14968
0
  struct mips_elf_link_hash_table *htab;
14969
14970
0
  static const char * const secname[] =
14971
0
  {
14972
0
    ".text", ".init", ".fini", ".data",
14973
0
    ".rodata", ".sdata", ".sbss", ".bss"
14974
0
  };
14975
0
  static const int sc[] =
14976
0
  {
14977
0
    scText, scInit, scFini, scData,
14978
0
    scRData, scSData, scSBss, scBss
14979
0
  };
14980
14981
0
  htab = mips_elf_hash_table (info);
14982
0
  BFD_ASSERT (htab != NULL);
14983
14984
  /* Sort the dynamic symbols so that those with GOT entries come after
14985
     those without.  */
14986
0
  if (!mips_elf_sort_hash_table (abfd, info))
14987
0
    return false;
14988
14989
  /* Create any scheduled LA25 stubs.  */
14990
0
  hti.info = info;
14991
0
  hti.output_bfd = abfd;
14992
0
  hti.error = false;
14993
0
  htab_traverse (htab->la25_stubs, mips_elf_create_la25_stub, &hti);
14994
0
  if (hti.error)
14995
0
    return false;
14996
14997
  /* Get a value for the GP register.  */
14998
0
  if (elf_gp (abfd) == 0)
14999
0
    {
15000
0
      struct bfd_link_hash_entry *h;
15001
15002
0
      h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
15003
0
      if (h != NULL && h->type == bfd_link_hash_defined)
15004
0
  elf_gp (abfd) = (h->u.def.value
15005
0
       + h->u.def.section->output_section->vma
15006
0
       + h->u.def.section->output_offset);
15007
0
      else if (htab->root.target_os == is_vxworks
15008
0
         && (h = bfd_link_hash_lookup (info->hash,
15009
0
               "_GLOBAL_OFFSET_TABLE_",
15010
0
               false, false, true))
15011
0
         && h->type == bfd_link_hash_defined)
15012
0
  elf_gp (abfd) = (h->u.def.section->output_section->vma
15013
0
       + h->u.def.section->output_offset
15014
0
       + h->u.def.value);
15015
0
      else if (bfd_link_relocatable (info))
15016
0
  {
15017
0
    bfd_vma lo = MINUS_ONE;
15018
15019
    /* Find the GP-relative section with the lowest offset.  */
15020
0
    for (o = abfd->sections; o != NULL; o = o->next)
15021
0
      if (o->vma < lo
15022
0
    && (elf_section_data (o)->this_hdr.sh_flags & SHF_MIPS_GPREL))
15023
0
        lo = o->vma;
15024
15025
    /* And calculate GP relative to that.  */
15026
0
    elf_gp (abfd) = lo + ELF_MIPS_GP_OFFSET (info);
15027
0
  }
15028
0
      else
15029
0
  {
15030
    /* If the relocate_section function needs to do a reloc
15031
       involving the GP value, it should make a reloc_dangerous
15032
       callback to warn that GP is not defined.  */
15033
0
  }
15034
0
    }
15035
15036
  /* Go through the sections and collect the .reginfo and .mdebug
15037
     information.  */
15038
0
  abiflags_sec = NULL;
15039
0
  reginfo_sec = NULL;
15040
0
  mdebug_sec = NULL;
15041
0
  gptab_data_sec = NULL;
15042
0
  gptab_bss_sec = NULL;
15043
0
  for (o = abfd->sections; o != NULL; o = o->next)
15044
0
    {
15045
0
      if (strcmp (o->name, ".MIPS.abiflags") == 0)
15046
0
  {
15047
    /* We have found the .MIPS.abiflags section in the output file.
15048
       Look through all the link_orders comprising it and remove them.
15049
       The data is merged in _bfd_mips_elf_merge_private_bfd_data.  */
15050
0
    for (p = o->map_head.link_order; p != NULL; p = p->next)
15051
0
      {
15052
0
        asection *input_section;
15053
15054
0
        if (p->type != bfd_indirect_link_order)
15055
0
    {
15056
0
      if (p->type == bfd_data_link_order)
15057
0
        continue;
15058
0
      abort ();
15059
0
    }
15060
15061
0
        input_section = p->u.indirect.section;
15062
15063
        /* Hack: reset the SEC_HAS_CONTENTS flag so that
15064
     elf_link_input_bfd ignores this section.  */
15065
0
        input_section->flags &= ~SEC_HAS_CONTENTS;
15066
0
      }
15067
15068
    /* Size has been set in _bfd_mips_elf_late_size_sections.  */
15069
0
    BFD_ASSERT(o->size == sizeof (Elf_External_ABIFlags_v0));
15070
15071
    /* Skip this section later on (I don't think this currently
15072
       matters, but someday it might).  */
15073
0
    o->map_head.link_order = NULL;
15074
15075
0
    abiflags_sec = o;
15076
0
  }
15077
15078
0
      if (strcmp (o->name, ".reginfo") == 0)
15079
0
  {
15080
0
    memset (&reginfo, 0, sizeof reginfo);
15081
15082
    /* We have found the .reginfo section in the output file.
15083
       Look through all the link_orders comprising it and merge
15084
       the information together.  */
15085
0
    for (p = o->map_head.link_order; p != NULL; p = p->next)
15086
0
      {
15087
0
        asection *input_section;
15088
0
        bfd *input_bfd;
15089
0
        Elf32_External_RegInfo ext;
15090
0
        Elf32_RegInfo sub;
15091
0
        bfd_size_type sz;
15092
15093
0
        if (p->type != bfd_indirect_link_order)
15094
0
    {
15095
0
      if (p->type == bfd_data_link_order)
15096
0
        continue;
15097
0
      abort ();
15098
0
    }
15099
15100
0
        input_section = p->u.indirect.section;
15101
0
        input_bfd = input_section->owner;
15102
15103
0
        sz = (input_section->size < sizeof (ext)
15104
0
        ? input_section->size : sizeof (ext));
15105
0
        memset (&ext, 0, sizeof (ext));
15106
0
        if (! bfd_get_section_contents (input_bfd, input_section,
15107
0
                &ext, 0, sz))
15108
0
    return false;
15109
15110
0
        bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub);
15111
15112
0
        reginfo.ri_gprmask |= sub.ri_gprmask;
15113
0
        reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
15114
0
        reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
15115
0
        reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
15116
0
        reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
15117
15118
        /* ri_gp_value is set by the function
15119
     `_bfd_mips_elf_section_processing' when the section is
15120
     finally written out.  */
15121
15122
        /* Hack: reset the SEC_HAS_CONTENTS flag so that
15123
     elf_link_input_bfd ignores this section.  */
15124
0
        input_section->flags &= ~SEC_HAS_CONTENTS;
15125
0
      }
15126
15127
    /* Size has been set in _bfd_mips_elf_late_size_sections.  */
15128
0
    BFD_ASSERT(o->size == sizeof (Elf32_External_RegInfo));
15129
15130
    /* Skip this section later on (I don't think this currently
15131
       matters, but someday it might).  */
15132
0
    o->map_head.link_order = NULL;
15133
15134
0
    reginfo_sec = o;
15135
0
  }
15136
15137
0
      if (strcmp (o->name, ".mdebug") == 0)
15138
0
  {
15139
0
    struct extsym_info einfo;
15140
0
    bfd_vma last;
15141
15142
    /* We have found the .mdebug section in the output file.
15143
       Look through all the link_orders comprising it and merge
15144
       the information together.  */
15145
0
    symhdr->magic = swap->sym_magic;
15146
    /* FIXME: What should the version stamp be?  */
15147
0
    symhdr->vstamp = 0;
15148
0
    symhdr->ilineMax = 0;
15149
0
    symhdr->cbLine = 0;
15150
0
    symhdr->idnMax = 0;
15151
0
    symhdr->ipdMax = 0;
15152
0
    symhdr->isymMax = 0;
15153
0
    symhdr->ioptMax = 0;
15154
0
    symhdr->iauxMax = 0;
15155
0
    symhdr->issMax = 0;
15156
0
    symhdr->issExtMax = 0;
15157
0
    symhdr->ifdMax = 0;
15158
0
    symhdr->crfd = 0;
15159
0
    symhdr->iextMax = 0;
15160
15161
    /* We accumulate the debugging information itself in the
15162
       debug_info structure.  */
15163
0
    debug.alloc_syments = false;
15164
0
    debug.line = NULL;
15165
0
    debug.external_dnr = NULL;
15166
0
    debug.external_pdr = NULL;
15167
0
    debug.external_sym = NULL;
15168
0
    debug.external_opt = NULL;
15169
0
    debug.external_aux = NULL;
15170
0
    debug.ss = NULL;
15171
0
    debug.ssext = debug.ssext_end = NULL;
15172
0
    debug.external_fdr = NULL;
15173
0
    debug.external_rfd = NULL;
15174
0
    debug.external_ext = debug.external_ext_end = NULL;
15175
15176
0
    mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
15177
0
    if (mdebug_handle == NULL)
15178
0
      return false;
15179
15180
0
    esym.jmptbl = 0;
15181
0
    esym.cobol_main = 0;
15182
0
    esym.weakext = 0;
15183
0
    esym.reserved = 0;
15184
0
    esym.ifd = ifdNil;
15185
0
    esym.asym.iss = issNil;
15186
0
    esym.asym.st = stLocal;
15187
0
    esym.asym.reserved = 0;
15188
0
    esym.asym.index = indexNil;
15189
0
    last = 0;
15190
0
    for (i = 0; i < sizeof (secname) / sizeof (secname[0]); i++)
15191
0
      {
15192
0
        esym.asym.sc = sc[i];
15193
0
        s = bfd_get_section_by_name (abfd, secname[i]);
15194
0
        if (s != NULL)
15195
0
    {
15196
0
      esym.asym.value = s->vma;
15197
0
      last = s->vma + s->size;
15198
0
    }
15199
0
        else
15200
0
    esym.asym.value = last;
15201
0
        if (!bfd_ecoff_debug_one_external (abfd, &debug, swap,
15202
0
             secname[i], &esym))
15203
0
    return false;
15204
0
      }
15205
15206
0
    for (p = o->map_head.link_order; p != NULL; p = p->next)
15207
0
      {
15208
0
        asection *input_section;
15209
0
        bfd *input_bfd;
15210
0
        const struct ecoff_debug_swap *input_swap;
15211
0
        struct ecoff_debug_info input_debug;
15212
0
        char *eraw_src;
15213
0
        char *eraw_end;
15214
15215
0
        if (p->type != bfd_indirect_link_order)
15216
0
    {
15217
0
      if (p->type == bfd_data_link_order)
15218
0
        continue;
15219
0
      abort ();
15220
0
    }
15221
15222
0
        input_section = p->u.indirect.section;
15223
0
        input_bfd = input_section->owner;
15224
15225
0
        if (!is_mips_elf (input_bfd))
15226
0
    {
15227
      /* I don't know what a non MIPS ELF bfd would be
15228
         doing with a .mdebug section, but I don't really
15229
         want to deal with it.  */
15230
0
      continue;
15231
0
    }
15232
15233
0
        input_swap = (get_elf_backend_data (input_bfd)
15234
0
          ->elf_backend_ecoff_debug_swap);
15235
15236
0
        BFD_ASSERT (p->size == input_section->size);
15237
15238
        /* The ECOFF linking code expects that we have already
15239
     read in the debugging information and set up an
15240
     ecoff_debug_info structure, so we do that now.  */
15241
0
        if (! _bfd_mips_elf_read_ecoff_info (input_bfd, input_section,
15242
0
               &input_debug))
15243
0
    return false;
15244
15245
0
        if (! (bfd_ecoff_debug_accumulate
15246
0
         (mdebug_handle, abfd, &debug, swap, input_bfd,
15247
0
          &input_debug, input_swap, info)))
15248
0
    {
15249
0
      _bfd_ecoff_free_ecoff_debug_info (&input_debug);
15250
0
      return false;
15251
0
    }
15252
15253
        /* Loop through the external symbols.  For each one with
15254
     interesting information, try to find the symbol in
15255
     the linker global hash table and save the information
15256
     for the output external symbols.  */
15257
0
        eraw_src = input_debug.external_ext;
15258
0
        eraw_end = (eraw_src
15259
0
        + (input_debug.symbolic_header.iextMax
15260
0
           * input_swap->external_ext_size));
15261
0
        for (;
15262
0
       eraw_src < eraw_end;
15263
0
       eraw_src += input_swap->external_ext_size)
15264
0
    {
15265
0
      EXTR ext;
15266
0
      const char *name;
15267
0
      struct mips_elf_link_hash_entry *h;
15268
15269
0
      (*input_swap->swap_ext_in) (input_bfd, eraw_src, &ext);
15270
0
      if (ext.asym.sc == scNil
15271
0
          || ext.asym.sc == scUndefined
15272
0
          || ext.asym.sc == scSUndefined)
15273
0
        continue;
15274
15275
0
      name = input_debug.ssext + ext.asym.iss;
15276
0
      h = mips_elf_link_hash_lookup (mips_elf_hash_table (info),
15277
0
             name, false, false, true);
15278
0
      if (h == NULL || h->esym.ifd != -2)
15279
0
        continue;
15280
15281
0
      if (ext.ifd != -1)
15282
0
        {
15283
0
          BFD_ASSERT (ext.ifd
15284
0
          < input_debug.symbolic_header.ifdMax);
15285
0
          ext.ifd = input_debug.ifdmap[ext.ifd];
15286
0
        }
15287
15288
0
      h->esym = ext;
15289
0
    }
15290
15291
        /* Free up the information we just read.  */
15292
0
        _bfd_ecoff_free_ecoff_debug_info (&input_debug);
15293
15294
        /* Hack: reset the SEC_HAS_CONTENTS flag so that
15295
     elf_link_input_bfd ignores this section.  */
15296
0
        input_section->flags &= ~SEC_HAS_CONTENTS;
15297
0
      }
15298
15299
0
    if (SGI_COMPAT (abfd) && bfd_link_pic (info))
15300
0
      {
15301
        /* Create .rtproc section.  */
15302
0
        rtproc_sec = bfd_get_linker_section (abfd, ".rtproc");
15303
0
        if (rtproc_sec == NULL)
15304
0
    {
15305
0
      flagword flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
15306
0
            | SEC_LINKER_CREATED | SEC_READONLY);
15307
15308
0
      rtproc_sec = bfd_make_section_anyway_with_flags (abfd,
15309
0
                   ".rtproc",
15310
0
                   flags);
15311
0
      if (rtproc_sec == NULL
15312
0
          || !bfd_set_section_alignment (rtproc_sec, 4))
15313
0
        return false;
15314
0
    }
15315
15316
0
        if (! mips_elf_create_procedure_table (mdebug_handle, abfd,
15317
0
                 info, rtproc_sec,
15318
0
                 &debug))
15319
0
    return false;
15320
0
      }
15321
15322
    /* Build the external symbol information.  */
15323
0
    einfo.abfd = abfd;
15324
0
    einfo.info = info;
15325
0
    einfo.debug = &debug;
15326
0
    einfo.swap = swap;
15327
0
    einfo.failed = false;
15328
0
    mips_elf_link_hash_traverse (mips_elf_hash_table (info),
15329
0
               mips_elf_output_extsym, &einfo);
15330
0
    if (einfo.failed)
15331
0
      return false;
15332
15333
    /* Set the size of the .mdebug section.  */
15334
0
    o->size = bfd_ecoff_debug_size (abfd, &debug, swap);
15335
15336
    /* Skip this section later on (I don't think this currently
15337
       matters, but someday it might).  */
15338
0
    o->map_head.link_order = NULL;
15339
15340
0
    mdebug_sec = o;
15341
0
  }
15342
15343
0
      if (startswith (o->name, ".gptab."))
15344
0
  {
15345
0
    const char *subname;
15346
0
    unsigned int c;
15347
0
    Elf32_gptab *tab;
15348
0
    Elf32_External_gptab *ext_tab;
15349
0
    unsigned int j;
15350
15351
    /* The .gptab.sdata and .gptab.sbss sections hold
15352
       information describing how the small data area would
15353
       change depending upon the -G switch.  These sections
15354
       not used in executables files.  */
15355
0
    if (! bfd_link_relocatable (info))
15356
0
      {
15357
0
        for (p = o->map_head.link_order; p != NULL; p = p->next)
15358
0
    {
15359
0
      asection *input_section;
15360
15361
0
      if (p->type != bfd_indirect_link_order)
15362
0
        {
15363
0
          if (p->type == bfd_data_link_order)
15364
0
      continue;
15365
0
          abort ();
15366
0
        }
15367
15368
0
      input_section = p->u.indirect.section;
15369
15370
      /* Hack: reset the SEC_HAS_CONTENTS flag so that
15371
         elf_link_input_bfd ignores this section.  */
15372
0
      input_section->flags &= ~SEC_HAS_CONTENTS;
15373
0
    }
15374
15375
        /* Skip this section later on (I don't think this
15376
     currently matters, but someday it might).  */
15377
0
        o->map_head.link_order = NULL;
15378
15379
        /* Really remove the section.  */
15380
0
        bfd_section_list_remove (abfd, o);
15381
0
        --abfd->section_count;
15382
15383
0
        continue;
15384
0
      }
15385
15386
    /* There is one gptab for initialized data, and one for
15387
       uninitialized data.  */
15388
0
    if (strcmp (o->name, ".gptab.sdata") == 0)
15389
0
      gptab_data_sec = o;
15390
0
    else if (strcmp (o->name, ".gptab.sbss") == 0)
15391
0
      gptab_bss_sec = o;
15392
0
    else
15393
0
      {
15394
0
        _bfd_error_handler
15395
    /* xgettext:c-format */
15396
0
    (_("%pB: illegal section name `%pA'"), abfd, o);
15397
0
        bfd_set_error (bfd_error_nonrepresentable_section);
15398
0
        return false;
15399
0
      }
15400
15401
    /* The linker script always combines .gptab.data and
15402
       .gptab.sdata into .gptab.sdata, and likewise for
15403
       .gptab.bss and .gptab.sbss.  It is possible that there is
15404
       no .sdata or .sbss section in the output file, in which
15405
       case we must change the name of the output section.  */
15406
0
    subname = o->name + sizeof ".gptab" - 1;
15407
0
    if (bfd_get_section_by_name (abfd, subname) == NULL)
15408
0
      {
15409
0
        if (o == gptab_data_sec)
15410
0
    o->name = ".gptab.data";
15411
0
        else
15412
0
    o->name = ".gptab.bss";
15413
0
        subname = o->name + sizeof ".gptab" - 1;
15414
0
        BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
15415
0
      }
15416
15417
    /* Set up the first entry.  */
15418
0
    c = 1;
15419
0
    amt = c * sizeof (Elf32_gptab);
15420
0
    tab = bfd_malloc (amt);
15421
0
    if (tab == NULL)
15422
0
      return false;
15423
0
    tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
15424
0
    tab[0].gt_header.gt_unused = 0;
15425
15426
    /* Combine the input sections.  */
15427
0
    for (p = o->map_head.link_order; p != NULL; p = p->next)
15428
0
      {
15429
0
        asection *input_section;
15430
0
        bfd *input_bfd;
15431
0
        bfd_size_type size;
15432
0
        unsigned long last;
15433
0
        bfd_size_type gpentry;
15434
15435
0
        if (p->type != bfd_indirect_link_order)
15436
0
    {
15437
0
      if (p->type == bfd_data_link_order)
15438
0
        continue;
15439
0
      abort ();
15440
0
    }
15441
15442
0
        input_section = p->u.indirect.section;
15443
0
        input_bfd = input_section->owner;
15444
15445
        /* Combine the gptab entries for this input section one
15446
     by one.  We know that the input gptab entries are
15447
     sorted by ascending -G value.  */
15448
0
        size = input_section->size;
15449
0
        last = 0;
15450
0
        for (gpentry = sizeof (Elf32_External_gptab);
15451
0
       gpentry < size;
15452
0
       gpentry += sizeof (Elf32_External_gptab))
15453
0
    {
15454
0
      Elf32_External_gptab ext_gptab;
15455
0
      Elf32_gptab int_gptab;
15456
0
      unsigned long val;
15457
0
      unsigned long add;
15458
0
      bool exact;
15459
0
      unsigned int look;
15460
15461
0
      if (! (bfd_get_section_contents
15462
0
       (input_bfd, input_section, &ext_gptab, gpentry,
15463
0
        sizeof (Elf32_External_gptab))))
15464
0
        {
15465
0
          free (tab);
15466
0
          return false;
15467
0
        }
15468
15469
0
      bfd_mips_elf32_swap_gptab_in (input_bfd, &ext_gptab,
15470
0
            &int_gptab);
15471
0
      val = int_gptab.gt_entry.gt_g_value;
15472
0
      add = int_gptab.gt_entry.gt_bytes - last;
15473
15474
0
      exact = false;
15475
0
      for (look = 1; look < c; look++)
15476
0
        {
15477
0
          if (tab[look].gt_entry.gt_g_value >= val)
15478
0
      tab[look].gt_entry.gt_bytes += add;
15479
15480
0
          if (tab[look].gt_entry.gt_g_value == val)
15481
0
      exact = true;
15482
0
        }
15483
15484
0
      if (! exact)
15485
0
        {
15486
0
          Elf32_gptab *new_tab;
15487
0
          unsigned int max;
15488
15489
          /* We need a new table entry.  */
15490
0
          amt = (bfd_size_type) (c + 1) * sizeof (Elf32_gptab);
15491
0
          new_tab = bfd_realloc (tab, amt);
15492
0
          if (new_tab == NULL)
15493
0
      {
15494
0
        free (tab);
15495
0
        return false;
15496
0
      }
15497
0
          tab = new_tab;
15498
0
          tab[c].gt_entry.gt_g_value = val;
15499
0
          tab[c].gt_entry.gt_bytes = add;
15500
15501
          /* Merge in the size for the next smallest -G
15502
       value, since that will be implied by this new
15503
       value.  */
15504
0
          max = 0;
15505
0
          for (look = 1; look < c; look++)
15506
0
      {
15507
0
        if (tab[look].gt_entry.gt_g_value < val
15508
0
            && (max == 0
15509
0
          || (tab[look].gt_entry.gt_g_value
15510
0
              > tab[max].gt_entry.gt_g_value)))
15511
0
          max = look;
15512
0
      }
15513
0
          if (max != 0)
15514
0
      tab[c].gt_entry.gt_bytes +=
15515
0
        tab[max].gt_entry.gt_bytes;
15516
15517
0
          ++c;
15518
0
        }
15519
15520
0
      last = int_gptab.gt_entry.gt_bytes;
15521
0
    }
15522
15523
        /* Hack: reset the SEC_HAS_CONTENTS flag so that
15524
     elf_link_input_bfd ignores this section.  */
15525
0
        input_section->flags &= ~SEC_HAS_CONTENTS;
15526
0
      }
15527
15528
    /* The table must be sorted by -G value.  */
15529
0
    if (c > 2)
15530
0
      qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
15531
15532
    /* Swap out the table.  */
15533
0
    amt = (bfd_size_type) c * sizeof (Elf32_External_gptab);
15534
0
    ext_tab = bfd_alloc (abfd, amt);
15535
0
    if (ext_tab == NULL)
15536
0
      {
15537
0
        free (tab);
15538
0
        return false;
15539
0
      }
15540
15541
0
    for (j = 0; j < c; j++)
15542
0
      bfd_mips_elf32_swap_gptab_out (abfd, tab + j, ext_tab + j);
15543
0
    free (tab);
15544
15545
0
    o->size = c * sizeof (Elf32_External_gptab);
15546
0
    o->contents = (bfd_byte *) ext_tab;
15547
0
    o->alloced = 1;
15548
15549
    /* Skip this section later on (I don't think this currently
15550
       matters, but someday it might).  */
15551
0
    o->map_head.link_order = NULL;
15552
0
  }
15553
0
    }
15554
15555
  /* Invoke the regular ELF backend linker to do all the work.  */
15556
0
  if (!_bfd_elf_final_link (abfd, info))
15557
0
    return false;
15558
15559
  /* Now write out the computed sections.  */
15560
15561
0
  if (abiflags_sec != NULL)
15562
0
    {
15563
0
      Elf_External_ABIFlags_v0 ext;
15564
0
      Elf_Internal_ABIFlags_v0 *abiflags;
15565
15566
0
      abiflags = &mips_elf_tdata (abfd)->abiflags;
15567
15568
      /* Set up the abiflags if no valid input sections were found.  */
15569
0
      if (!mips_elf_tdata (abfd)->abiflags_valid)
15570
0
  {
15571
0
    infer_mips_abiflags (abfd, abiflags);
15572
0
    mips_elf_tdata (abfd)->abiflags_valid = true;
15573
0
  }
15574
0
      bfd_mips_elf_swap_abiflags_v0_out (abfd, abiflags, &ext);
15575
0
      if (! bfd_set_section_contents (abfd, abiflags_sec, &ext, 0, sizeof ext))
15576
0
  return false;
15577
0
    }
15578
15579
0
  if (reginfo_sec != NULL)
15580
0
    {
15581
0
      Elf32_External_RegInfo ext;
15582
15583
0
      bfd_mips_elf32_swap_reginfo_out (abfd, &reginfo, &ext);
15584
0
      if (! bfd_set_section_contents (abfd, reginfo_sec, &ext, 0, sizeof ext))
15585
0
  return false;
15586
0
    }
15587
15588
0
  if (mdebug_sec != NULL)
15589
0
    {
15590
0
      BFD_ASSERT (abfd->output_has_begun);
15591
0
      if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
15592
0
                 swap, info,
15593
0
                 mdebug_sec->filepos))
15594
0
  return false;
15595
15596
0
      bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
15597
0
    }
15598
15599
0
  if (gptab_data_sec != NULL)
15600
0
    {
15601
0
      if (! bfd_set_section_contents (abfd, gptab_data_sec,
15602
0
              gptab_data_sec->contents,
15603
0
              0, gptab_data_sec->size))
15604
0
  return false;
15605
0
    }
15606
15607
0
  if (gptab_bss_sec != NULL)
15608
0
    {
15609
0
      if (! bfd_set_section_contents (abfd, gptab_bss_sec,
15610
0
              gptab_bss_sec->contents,
15611
0
              0, gptab_bss_sec->size))
15612
0
  return false;
15613
0
    }
15614
15615
0
  if (SGI_COMPAT (abfd))
15616
0
    {
15617
0
      rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
15618
0
      if (rtproc_sec != NULL)
15619
0
  {
15620
0
    if (! bfd_set_section_contents (abfd, rtproc_sec,
15621
0
            rtproc_sec->contents,
15622
0
            0, rtproc_sec->size))
15623
0
      return false;
15624
0
  }
15625
0
    }
15626
15627
0
  return true;
15628
0
}
15629

15630
/* Merge object file header flags from IBFD into OBFD.  Raise an error
15631
   if there are conflicting settings.  */
15632
15633
static bool
15634
mips_elf_merge_obj_e_flags (bfd *ibfd, struct bfd_link_info *info)
15635
0
{
15636
0
  bfd *obfd = info->output_bfd;
15637
0
  struct mips_elf_obj_tdata *out_tdata = mips_elf_tdata (obfd);
15638
0
  flagword old_flags;
15639
0
  flagword new_flags;
15640
0
  bool ok;
15641
15642
0
  new_flags = elf_elfheader (ibfd)->e_flags;
15643
0
  elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_NOREORDER;
15644
0
  old_flags = elf_elfheader (obfd)->e_flags;
15645
15646
  /* Check flag compatibility.  */
15647
15648
0
  new_flags &= ~EF_MIPS_NOREORDER;
15649
0
  old_flags &= ~EF_MIPS_NOREORDER;
15650
15651
  /* Some IRIX 6 BSD-compatibility objects have this bit set.  It
15652
     doesn't seem to matter.  */
15653
0
  new_flags &= ~EF_MIPS_XGOT;
15654
0
  old_flags &= ~EF_MIPS_XGOT;
15655
15656
  /* MIPSpro generates ucode info in n64 objects.  Again, we should
15657
     just be able to ignore this.  */
15658
0
  new_flags &= ~EF_MIPS_UCODE;
15659
0
  old_flags &= ~EF_MIPS_UCODE;
15660
15661
  /* DSOs should only be linked with CPIC code.  */
15662
0
  if ((ibfd->flags & DYNAMIC) != 0)
15663
0
    new_flags |= EF_MIPS_PIC | EF_MIPS_CPIC;
15664
15665
0
  if (new_flags == old_flags)
15666
0
    return true;
15667
15668
0
  ok = true;
15669
15670
0
  if (((new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0)
15671
0
      != ((old_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0))
15672
0
    {
15673
0
      _bfd_error_handler
15674
0
  (_("%pB: warning: linking abicalls files with non-abicalls files"),
15675
0
   ibfd);
15676
0
      ok = true;
15677
0
    }
15678
15679
0
  if (new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC))
15680
0
    elf_elfheader (obfd)->e_flags |= EF_MIPS_CPIC;
15681
0
  if (! (new_flags & EF_MIPS_PIC))
15682
0
    elf_elfheader (obfd)->e_flags &= ~EF_MIPS_PIC;
15683
15684
0
  new_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
15685
0
  old_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
15686
15687
  /* Compare the ISAs.  */
15688
0
  if (mips_32bit_flags_p (old_flags) != mips_32bit_flags_p (new_flags))
15689
0
    {
15690
0
      _bfd_error_handler
15691
0
  (_("%pB: linking 32-bit code with 64-bit code"),
15692
0
   ibfd);
15693
0
      ok = false;
15694
0
    }
15695
0
  else if (!mips_mach_extends_p (bfd_get_mach (ibfd), bfd_get_mach (obfd)))
15696
0
    {
15697
      /* OBFD's ISA isn't the same as, or an extension of, IBFD's.  */
15698
0
      if (mips_mach_extends_p (bfd_get_mach (obfd), bfd_get_mach (ibfd)))
15699
0
  {
15700
    /* Copy the architecture info from IBFD to OBFD.  Also copy
15701
       the 32-bit flag (if set) so that we continue to recognise
15702
       OBFD as a 32-bit binary.  */
15703
0
    bfd_set_arch_info (obfd, bfd_get_arch_info (ibfd));
15704
0
    elf_elfheader (obfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
15705
0
    elf_elfheader (obfd)->e_flags
15706
0
      |= new_flags & (EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15707
15708
    /* Update the ABI flags isa_level, isa_rev, isa_ext fields.  */
15709
0
    update_mips_abiflags_isa (obfd, &out_tdata->abiflags);
15710
15711
    /* Copy across the ABI flags if OBFD doesn't use them
15712
       and if that was what caused us to treat IBFD as 32-bit.  */
15713
0
    if ((old_flags & EF_MIPS_ABI) == 0
15714
0
        && mips_32bit_flags_p (new_flags)
15715
0
        && !mips_32bit_flags_p (new_flags & ~EF_MIPS_ABI))
15716
0
      elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ABI;
15717
0
  }
15718
0
      else
15719
0
  {
15720
    /* The ISAs aren't compatible.  */
15721
0
    _bfd_error_handler
15722
      /* xgettext:c-format */
15723
0
      (_("%pB: linking %s module with previous %s modules"),
15724
0
       ibfd,
15725
0
       bfd_printable_name (ibfd),
15726
0
       bfd_printable_name (obfd));
15727
0
    ok = false;
15728
0
  }
15729
0
    }
15730
15731
0
  new_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15732
0
  old_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15733
15734
  /* Compare ABIs.  The 64-bit ABI does not use EF_MIPS_ABI.  But, it
15735
     does set EI_CLASS differently from any 32-bit ABI.  */
15736
0
  if ((new_flags & EF_MIPS_ABI) != (old_flags & EF_MIPS_ABI)
15737
0
      || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
15738
0
    != elf_elfheader (obfd)->e_ident[EI_CLASS]))
15739
0
    {
15740
      /* Only error if both are set (to different values).  */
15741
0
      if (((new_flags & EF_MIPS_ABI) && (old_flags & EF_MIPS_ABI))
15742
0
    || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
15743
0
        != elf_elfheader (obfd)->e_ident[EI_CLASS]))
15744
0
  {
15745
0
    _bfd_error_handler
15746
      /* xgettext:c-format */
15747
0
      (_("%pB: ABI mismatch: linking %s module with previous %s modules"),
15748
0
       ibfd,
15749
0
       elf_mips_abi_name (ibfd),
15750
0
       elf_mips_abi_name (obfd));
15751
0
    ok = false;
15752
0
  }
15753
0
      new_flags &= ~EF_MIPS_ABI;
15754
0
      old_flags &= ~EF_MIPS_ABI;
15755
0
    }
15756
15757
  /* Compare ASEs.  Forbid linking MIPS16 and microMIPS ASE modules together
15758
     and allow arbitrary mixing of the remaining ASEs (retain the union).  */
15759
0
  if ((new_flags & EF_MIPS_ARCH_ASE) != (old_flags & EF_MIPS_ARCH_ASE))
15760
0
    {
15761
0
      int old_micro = old_flags & EF_MIPS_ARCH_ASE_MICROMIPS;
15762
0
      int new_micro = new_flags & EF_MIPS_ARCH_ASE_MICROMIPS;
15763
0
      int old_m16 = old_flags & EF_MIPS_ARCH_ASE_M16;
15764
0
      int new_m16 = new_flags & EF_MIPS_ARCH_ASE_M16;
15765
0
      int micro_mis = old_m16 && new_micro;
15766
0
      int m16_mis = old_micro && new_m16;
15767
15768
0
      if (m16_mis || micro_mis)
15769
0
  {
15770
0
    _bfd_error_handler
15771
      /* xgettext:c-format */
15772
0
      (_("%pB: ASE mismatch: linking %s module with previous %s modules"),
15773
0
       ibfd,
15774
0
       m16_mis ? "MIPS16" : "microMIPS",
15775
0
       m16_mis ? "microMIPS" : "MIPS16");
15776
0
    ok = false;
15777
0
  }
15778
15779
0
      elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ARCH_ASE;
15780
15781
0
      new_flags &= ~ EF_MIPS_ARCH_ASE;
15782
0
      old_flags &= ~ EF_MIPS_ARCH_ASE;
15783
0
    }
15784
15785
  /* Compare NaN encodings.  */
15786
0
  if ((new_flags & EF_MIPS_NAN2008) != (old_flags & EF_MIPS_NAN2008))
15787
0
    {
15788
      /* xgettext:c-format */
15789
0
      _bfd_error_handler (_("%pB: linking %s module with previous %s modules"),
15790
0
        ibfd,
15791
0
        (new_flags & EF_MIPS_NAN2008
15792
0
         ? "-mnan=2008" : "-mnan=legacy"),
15793
0
        (old_flags & EF_MIPS_NAN2008
15794
0
         ? "-mnan=2008" : "-mnan=legacy"));
15795
0
      ok = false;
15796
0
      new_flags &= ~EF_MIPS_NAN2008;
15797
0
      old_flags &= ~EF_MIPS_NAN2008;
15798
0
    }
15799
15800
  /* Compare FP64 state.  */
15801
0
  if ((new_flags & EF_MIPS_FP64) != (old_flags & EF_MIPS_FP64))
15802
0
    {
15803
      /* xgettext:c-format */
15804
0
      _bfd_error_handler (_("%pB: linking %s module with previous %s modules"),
15805
0
        ibfd,
15806
0
        (new_flags & EF_MIPS_FP64
15807
0
         ? "-mfp64" : "-mfp32"),
15808
0
        (old_flags & EF_MIPS_FP64
15809
0
         ? "-mfp64" : "-mfp32"));
15810
0
      ok = false;
15811
0
      new_flags &= ~EF_MIPS_FP64;
15812
0
      old_flags &= ~EF_MIPS_FP64;
15813
0
    }
15814
15815
  /* Warn about any other mismatches */
15816
0
  if (new_flags != old_flags)
15817
0
    {
15818
      /* xgettext:c-format */
15819
0
      _bfd_error_handler
15820
0
  (_("%pB: uses different e_flags (%#x) fields than previous modules "
15821
0
     "(%#x)"),
15822
0
   ibfd, new_flags, old_flags);
15823
0
      ok = false;
15824
0
    }
15825
15826
0
  return ok;
15827
0
}
15828
15829
/* Merge object attributes from IBFD into OBFD.  Raise an error if
15830
   there are conflicting attributes.  */
15831
static bool
15832
mips_elf_merge_obj_attributes (bfd *ibfd, struct bfd_link_info *info)
15833
0
{
15834
0
  bfd *obfd = info->output_bfd;
15835
0
  obj_attribute *in_attr;
15836
0
  obj_attribute *out_attr;
15837
0
  bfd *abi_fp_bfd;
15838
0
  bfd *abi_msa_bfd;
15839
15840
0
  abi_fp_bfd = mips_elf_tdata (obfd)->abi_fp_bfd;
15841
0
  in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
15842
0
  if (!abi_fp_bfd && in_attr[Tag_GNU_MIPS_ABI_FP].i != Val_GNU_MIPS_ABI_FP_ANY)
15843
0
    mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
15844
15845
0
  abi_msa_bfd = mips_elf_tdata (obfd)->abi_msa_bfd;
15846
0
  if (!abi_msa_bfd
15847
0
      && in_attr[Tag_GNU_MIPS_ABI_MSA].i != Val_GNU_MIPS_ABI_MSA_ANY)
15848
0
    mips_elf_tdata (obfd)->abi_msa_bfd = ibfd;
15849
15850
0
  if (!elf_known_obj_attributes_proc (obfd)[0].i)
15851
0
    {
15852
      /* This is the first object.  Copy the attributes.  */
15853
0
      _bfd_elf_copy_obj_attributes (ibfd, obfd);
15854
15855
      /* Use the Tag_null value to indicate the attributes have been
15856
   initialized.  */
15857
0
      elf_known_obj_attributes_proc (obfd)[0].i = 1;
15858
15859
0
      return true;
15860
0
    }
15861
15862
  /* Check for conflicting Tag_GNU_MIPS_ABI_FP attributes and merge
15863
     non-conflicting ones.  */
15864
0
  out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
15865
0
  if (in_attr[Tag_GNU_MIPS_ABI_FP].i != out_attr[Tag_GNU_MIPS_ABI_FP].i)
15866
0
    {
15867
0
      int out_fp, in_fp;
15868
15869
0
      out_fp = out_attr[Tag_GNU_MIPS_ABI_FP].i;
15870
0
      in_fp = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15871
0
      out_attr[Tag_GNU_MIPS_ABI_FP].type = 1;
15872
0
      if (out_fp == Val_GNU_MIPS_ABI_FP_ANY)
15873
0
  out_attr[Tag_GNU_MIPS_ABI_FP].i = in_fp;
15874
0
      else if (out_fp == Val_GNU_MIPS_ABI_FP_XX
15875
0
         && (in_fp == Val_GNU_MIPS_ABI_FP_DOUBLE
15876
0
       || in_fp == Val_GNU_MIPS_ABI_FP_64
15877
0
       || in_fp == Val_GNU_MIPS_ABI_FP_64A))
15878
0
  {
15879
0
    mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
15880
0
    out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15881
0
  }
15882
0
      else if (in_fp == Val_GNU_MIPS_ABI_FP_XX
15883
0
         && (out_fp == Val_GNU_MIPS_ABI_FP_DOUBLE
15884
0
       || out_fp == Val_GNU_MIPS_ABI_FP_64
15885
0
       || out_fp == Val_GNU_MIPS_ABI_FP_64A))
15886
0
  /* Keep the current setting.  */;
15887
0
      else if (out_fp == Val_GNU_MIPS_ABI_FP_64A
15888
0
         && in_fp == Val_GNU_MIPS_ABI_FP_64)
15889
0
  {
15890
0
    mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
15891
0
    out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15892
0
  }
15893
0
      else if (in_fp == Val_GNU_MIPS_ABI_FP_64A
15894
0
         && out_fp == Val_GNU_MIPS_ABI_FP_64)
15895
0
  /* Keep the current setting.  */;
15896
0
      else if (in_fp != Val_GNU_MIPS_ABI_FP_ANY)
15897
0
  {
15898
0
    const char *out_string, *in_string;
15899
15900
0
    out_string = _bfd_mips_fp_abi_string (out_fp);
15901
0
    in_string = _bfd_mips_fp_abi_string (in_fp);
15902
    /* First warn about cases involving unrecognised ABIs.  */
15903
0
    if (!out_string && !in_string)
15904
      /* xgettext:c-format */
15905
0
      _bfd_error_handler
15906
0
        (_("warning: %pB uses unknown floating point ABI %d "
15907
0
     "(set by %pB), %pB uses unknown floating point ABI %d"),
15908
0
         obfd, out_fp, abi_fp_bfd, ibfd, in_fp);
15909
0
    else if (!out_string)
15910
0
      _bfd_error_handler
15911
        /* xgettext:c-format */
15912
0
        (_("warning: %pB uses unknown floating point ABI %d "
15913
0
     "(set by %pB), %pB uses %s"),
15914
0
         obfd, out_fp, abi_fp_bfd, ibfd, in_string);
15915
0
    else if (!in_string)
15916
0
      _bfd_error_handler
15917
        /* xgettext:c-format */
15918
0
        (_("warning: %pB uses %s (set by %pB), "
15919
0
     "%pB uses unknown floating point ABI %d"),
15920
0
         obfd, out_string, abi_fp_bfd, ibfd, in_fp);
15921
0
    else
15922
0
      {
15923
        /* If one of the bfds is soft-float, the other must be
15924
     hard-float.  The exact choice of hard-float ABI isn't
15925
     really relevant to the error message.  */
15926
0
        if (in_fp == Val_GNU_MIPS_ABI_FP_SOFT)
15927
0
    out_string = "-mhard-float";
15928
0
        else if (out_fp == Val_GNU_MIPS_ABI_FP_SOFT)
15929
0
    in_string = "-mhard-float";
15930
0
        _bfd_error_handler
15931
    /* xgettext:c-format */
15932
0
    (_("warning: %pB uses %s (set by %pB), %pB uses %s"),
15933
0
     obfd, out_string, abi_fp_bfd, ibfd, in_string);
15934
0
      }
15935
0
  }
15936
0
    }
15937
15938
  /* Check for conflicting Tag_GNU_MIPS_ABI_MSA attributes and merge
15939
     non-conflicting ones.  */
15940
0
  if (in_attr[Tag_GNU_MIPS_ABI_MSA].i != out_attr[Tag_GNU_MIPS_ABI_MSA].i)
15941
0
    {
15942
0
      out_attr[Tag_GNU_MIPS_ABI_MSA].type = 1;
15943
0
      if (out_attr[Tag_GNU_MIPS_ABI_MSA].i == Val_GNU_MIPS_ABI_MSA_ANY)
15944
0
  out_attr[Tag_GNU_MIPS_ABI_MSA].i = in_attr[Tag_GNU_MIPS_ABI_MSA].i;
15945
0
      else if (in_attr[Tag_GNU_MIPS_ABI_MSA].i != Val_GNU_MIPS_ABI_MSA_ANY)
15946
0
  switch (out_attr[Tag_GNU_MIPS_ABI_MSA].i)
15947
0
    {
15948
0
    case Val_GNU_MIPS_ABI_MSA_128:
15949
0
      _bfd_error_handler
15950
        /* xgettext:c-format */
15951
0
        (_("warning: %pB uses %s (set by %pB), "
15952
0
     "%pB uses unknown MSA ABI %d"),
15953
0
         obfd, "-mmsa", abi_msa_bfd,
15954
0
         ibfd, in_attr[Tag_GNU_MIPS_ABI_MSA].i);
15955
0
      break;
15956
15957
0
    default:
15958
0
      switch (in_attr[Tag_GNU_MIPS_ABI_MSA].i)
15959
0
        {
15960
0
        case Val_GNU_MIPS_ABI_MSA_128:
15961
0
    _bfd_error_handler
15962
      /* xgettext:c-format */
15963
0
      (_("warning: %pB uses unknown MSA ABI %d "
15964
0
         "(set by %pB), %pB uses %s"),
15965
0
         obfd, out_attr[Tag_GNU_MIPS_ABI_MSA].i,
15966
0
       abi_msa_bfd, ibfd, "-mmsa");
15967
0
      break;
15968
15969
0
        default:
15970
0
    _bfd_error_handler
15971
      /* xgettext:c-format */
15972
0
      (_("warning: %pB uses unknown MSA ABI %d "
15973
0
         "(set by %pB), %pB uses unknown MSA ABI %d"),
15974
0
       obfd, out_attr[Tag_GNU_MIPS_ABI_MSA].i,
15975
0
       abi_msa_bfd, ibfd, in_attr[Tag_GNU_MIPS_ABI_MSA].i);
15976
0
    break;
15977
0
        }
15978
0
    }
15979
0
    }
15980
15981
  /* Merge Tag_compatibility attributes and any common GNU ones.  */
15982
0
  return _bfd_elf_merge_object_attributes (ibfd, info);
15983
0
}
15984
15985
/* Merge object ABI flags from IBFD into OBFD.  Raise an error if
15986
   there are conflicting settings.  */
15987
15988
static bool
15989
mips_elf_merge_obj_abiflags (bfd *ibfd, bfd *obfd)
15990
0
{
15991
0
  obj_attribute *out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
15992
0
  struct mips_elf_obj_tdata *out_tdata = mips_elf_tdata (obfd);
15993
0
  struct mips_elf_obj_tdata *in_tdata = mips_elf_tdata (ibfd);
15994
15995
  /* Update the output abiflags fp_abi using the computed fp_abi.  */
15996
0
  out_tdata->abiflags.fp_abi = out_attr[Tag_GNU_MIPS_ABI_FP].i;
15997
15998
0
#define max(a, b) ((a) > (b) ? (a) : (b))
15999
  /* Merge abiflags.  */
16000
0
  out_tdata->abiflags.isa_level = max (out_tdata->abiflags.isa_level,
16001
0
               in_tdata->abiflags.isa_level);
16002
0
  out_tdata->abiflags.isa_rev = max (out_tdata->abiflags.isa_rev,
16003
0
             in_tdata->abiflags.isa_rev);
16004
0
  out_tdata->abiflags.gpr_size = max (out_tdata->abiflags.gpr_size,
16005
0
              in_tdata->abiflags.gpr_size);
16006
0
  out_tdata->abiflags.cpr1_size = max (out_tdata->abiflags.cpr1_size,
16007
0
               in_tdata->abiflags.cpr1_size);
16008
0
  out_tdata->abiflags.cpr2_size = max (out_tdata->abiflags.cpr2_size,
16009
0
               in_tdata->abiflags.cpr2_size);
16010
0
#undef max
16011
0
  out_tdata->abiflags.ases |= in_tdata->abiflags.ases;
16012
0
  out_tdata->abiflags.flags1 |= in_tdata->abiflags.flags1;
16013
16014
0
  return true;
16015
0
}
16016
16017
/* Merge backend specific data from an object file to the output
16018
   object file when linking.  */
16019
16020
bool
16021
_bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
16022
0
{
16023
0
  bfd *obfd = info->output_bfd;
16024
0
  struct mips_elf_obj_tdata *out_tdata;
16025
0
  struct mips_elf_obj_tdata *in_tdata;
16026
0
  bool null_input_bfd = true;
16027
0
  asection *sec;
16028
0
  bool ok;
16029
16030
  /* Check if we have the same endianness.  */
16031
0
  if (! _bfd_generic_verify_endian_match (ibfd, info))
16032
0
    {
16033
0
      _bfd_error_handler
16034
0
  (_("%pB: endianness incompatible with that of the selected emulation"),
16035
0
   ibfd);
16036
0
      return false;
16037
0
    }
16038
16039
0
  if (!is_mips_elf (ibfd))
16040
0
    return true;
16041
16042
0
  in_tdata = mips_elf_tdata (ibfd);
16043
0
  out_tdata = mips_elf_tdata (obfd);
16044
16045
0
  if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
16046
0
    {
16047
0
      _bfd_error_handler
16048
0
  (_("%pB: ABI is incompatible with that of the selected emulation"),
16049
0
   ibfd);
16050
0
      return false;
16051
0
    }
16052
16053
  /* Check to see if the input BFD actually contains any sections.  If not,
16054
     then it has no attributes, and its flags may not have been initialized
16055
     either, but it cannot actually cause any incompatibility.  */
16056
  /* FIXME: This excludes any input shared library from consideration.  */
16057
0
  for (sec = ibfd->sections; sec != NULL; sec = sec->next)
16058
0
    {
16059
      /* Ignore synthetic sections and empty .text, .data and .bss sections
16060
   which are automatically generated by gas.  Also ignore fake
16061
   (s)common sections, since merely defining a common symbol does
16062
   not affect compatibility.  */
16063
0
      if ((sec->flags & SEC_IS_COMMON) == 0
16064
0
    && strcmp (sec->name, ".reginfo")
16065
0
    && strcmp (sec->name, ".mdebug")
16066
0
    && (sec->size != 0
16067
0
        || (strcmp (sec->name, ".text")
16068
0
      && strcmp (sec->name, ".data")
16069
0
      && strcmp (sec->name, ".bss"))))
16070
0
  {
16071
0
    null_input_bfd = false;
16072
0
    break;
16073
0
  }
16074
0
    }
16075
0
  if (null_input_bfd)
16076
0
    return true;
16077
16078
  /* Populate abiflags using existing information.  */
16079
0
  if (in_tdata->abiflags_valid)
16080
0
    {
16081
0
      obj_attribute *in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
16082
0
      Elf_Internal_ABIFlags_v0 in_abiflags;
16083
0
      Elf_Internal_ABIFlags_v0 abiflags;
16084
16085
      /* Set up the FP ABI attribute from the abiflags if it is not already
16086
   set.  */
16087
0
      if (in_attr[Tag_GNU_MIPS_ABI_FP].i == Val_GNU_MIPS_ABI_FP_ANY)
16088
0
  in_attr[Tag_GNU_MIPS_ABI_FP].i = in_tdata->abiflags.fp_abi;
16089
16090
0
      infer_mips_abiflags (ibfd, &abiflags);
16091
0
      in_abiflags = in_tdata->abiflags;
16092
16093
      /* It is not possible to infer the correct ISA revision
16094
   for R3 or R5 so drop down to R2 for the checks.  */
16095
0
      if (in_abiflags.isa_rev == 3 || in_abiflags.isa_rev == 5)
16096
0
  in_abiflags.isa_rev = 2;
16097
16098
0
      if (LEVEL_REV (in_abiflags.isa_level, in_abiflags.isa_rev)
16099
0
    < LEVEL_REV (abiflags.isa_level, abiflags.isa_rev))
16100
0
  _bfd_error_handler
16101
0
    (_("%pB: warning: inconsistent ISA between e_flags and "
16102
0
       ".MIPS.abiflags"), ibfd);
16103
0
      if (abiflags.fp_abi != Val_GNU_MIPS_ABI_FP_ANY
16104
0
    && in_abiflags.fp_abi != abiflags.fp_abi)
16105
0
  _bfd_error_handler
16106
0
    (_("%pB: warning: inconsistent FP ABI between .gnu.attributes and "
16107
0
       ".MIPS.abiflags"), ibfd);
16108
0
      if ((in_abiflags.ases & abiflags.ases) != abiflags.ases)
16109
0
  _bfd_error_handler
16110
0
    (_("%pB: warning: inconsistent ASEs between e_flags and "
16111
0
       ".MIPS.abiflags"), ibfd);
16112
      /* The isa_ext is allowed to be an extension of what can be inferred
16113
   from e_flags.  */
16114
0
      if (!mips_mach_extends_p (bfd_mips_isa_ext_mach (abiflags.isa_ext),
16115
0
        bfd_mips_isa_ext_mach (in_abiflags.isa_ext)))
16116
0
  _bfd_error_handler
16117
0
    (_("%pB: warning: inconsistent ISA extensions between e_flags and "
16118
0
       ".MIPS.abiflags"), ibfd);
16119
0
      if (in_abiflags.flags2 != 0)
16120
0
  _bfd_error_handler
16121
0
    (_("%pB: warning: unexpected flag in the flags2 field of "
16122
0
       ".MIPS.abiflags (0x%lx)"), ibfd,
16123
0
     in_abiflags.flags2);
16124
0
    }
16125
0
  else
16126
0
    {
16127
0
      infer_mips_abiflags (ibfd, &in_tdata->abiflags);
16128
0
      in_tdata->abiflags_valid = true;
16129
0
    }
16130
16131
0
  if (!out_tdata->abiflags_valid)
16132
0
    {
16133
      /* Copy input abiflags if output abiflags are not already valid.  */
16134
0
      out_tdata->abiflags = in_tdata->abiflags;
16135
0
      out_tdata->abiflags_valid = true;
16136
0
    }
16137
16138
0
  if (! elf_flags_init (obfd))
16139
0
    {
16140
0
      elf_flags_init (obfd) = true;
16141
0
      elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
16142
0
      elf_elfheader (obfd)->e_ident[EI_CLASS]
16143
0
  = elf_elfheader (ibfd)->e_ident[EI_CLASS];
16144
16145
0
      if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
16146
0
    && (bfd_get_arch_info (obfd)->the_default
16147
0
        || mips_mach_extends_p (bfd_get_mach (obfd),
16148
0
              bfd_get_mach (ibfd))))
16149
0
  {
16150
0
    if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
16151
0
           bfd_get_mach (ibfd)))
16152
0
      return false;
16153
16154
    /* Update the ABI flags isa_level, isa_rev and isa_ext fields.  */
16155
0
    update_mips_abiflags_isa (obfd, &out_tdata->abiflags);
16156
0
  }
16157
16158
0
      ok = true;
16159
0
    }
16160
0
  else
16161
0
    ok = mips_elf_merge_obj_e_flags (ibfd, info);
16162
16163
0
  ok = mips_elf_merge_obj_attributes (ibfd, info) && ok;
16164
16165
0
  ok = mips_elf_merge_obj_abiflags (ibfd, obfd) && ok;
16166
16167
0
  if (!ok)
16168
0
    {
16169
0
      bfd_set_error (bfd_error_bad_value);
16170
0
      return false;
16171
0
    }
16172
16173
0
  return true;
16174
0
}
16175
16176
/* Function to keep MIPS specific file flags like as EF_MIPS_PIC.  */
16177
16178
bool
16179
_bfd_mips_elf_set_private_flags (bfd *abfd, flagword flags)
16180
0
{
16181
0
  BFD_ASSERT (!elf_flags_init (abfd)
16182
0
        || elf_elfheader (abfd)->e_flags == flags);
16183
16184
0
  elf_elfheader (abfd)->e_flags = flags;
16185
0
  elf_flags_init (abfd) = true;
16186
0
  return true;
16187
0
}
16188
16189
char *
16190
_bfd_mips_elf_get_target_dtag (bfd_vma dtag)
16191
45
{
16192
45
  switch (dtag)
16193
45
    {
16194
45
    default: return "";
16195
0
    case DT_MIPS_RLD_VERSION:
16196
0
      return "MIPS_RLD_VERSION";
16197
0
    case DT_MIPS_TIME_STAMP:
16198
0
      return "MIPS_TIME_STAMP";
16199
0
    case DT_MIPS_ICHECKSUM:
16200
0
      return "MIPS_ICHECKSUM";
16201
0
    case DT_MIPS_IVERSION:
16202
0
      return "MIPS_IVERSION";
16203
0
    case DT_MIPS_FLAGS:
16204
0
      return "MIPS_FLAGS";
16205
0
    case DT_MIPS_BASE_ADDRESS:
16206
0
      return "MIPS_BASE_ADDRESS";
16207
0
    case DT_MIPS_MSYM:
16208
0
      return "MIPS_MSYM";
16209
0
    case DT_MIPS_CONFLICT:
16210
0
      return "MIPS_CONFLICT";
16211
0
    case DT_MIPS_LIBLIST:
16212
0
      return "MIPS_LIBLIST";
16213
0
    case DT_MIPS_LOCAL_GOTNO:
16214
0
      return "MIPS_LOCAL_GOTNO";
16215
0
    case DT_MIPS_CONFLICTNO:
16216
0
      return "MIPS_CONFLICTNO";
16217
0
    case DT_MIPS_LIBLISTNO:
16218
0
      return "MIPS_LIBLISTNO";
16219
0
    case DT_MIPS_SYMTABNO:
16220
0
      return "MIPS_SYMTABNO";
16221
0
    case DT_MIPS_UNREFEXTNO:
16222
0
      return "MIPS_UNREFEXTNO";
16223
0
    case DT_MIPS_GOTSYM:
16224
0
      return "MIPS_GOTSYM";
16225
0
    case DT_MIPS_HIPAGENO:
16226
0
      return "MIPS_HIPAGENO";
16227
0
    case DT_MIPS_RLD_MAP:
16228
0
      return "MIPS_RLD_MAP";
16229
0
    case DT_MIPS_RLD_MAP_REL:
16230
0
      return "MIPS_RLD_MAP_REL";
16231
0
    case DT_MIPS_DELTA_CLASS:
16232
0
      return "MIPS_DELTA_CLASS";
16233
0
    case DT_MIPS_DELTA_CLASS_NO:
16234
0
      return "MIPS_DELTA_CLASS_NO";
16235
0
    case DT_MIPS_DELTA_INSTANCE:
16236
0
      return "MIPS_DELTA_INSTANCE";
16237
0
    case DT_MIPS_DELTA_INSTANCE_NO:
16238
0
      return "MIPS_DELTA_INSTANCE_NO";
16239
0
    case DT_MIPS_DELTA_RELOC:
16240
0
      return "MIPS_DELTA_RELOC";
16241
0
    case DT_MIPS_DELTA_RELOC_NO:
16242
0
      return "MIPS_DELTA_RELOC_NO";
16243
0
    case DT_MIPS_DELTA_SYM:
16244
0
      return "MIPS_DELTA_SYM";
16245
0
    case DT_MIPS_DELTA_SYM_NO:
16246
0
      return "MIPS_DELTA_SYM_NO";
16247
0
    case DT_MIPS_DELTA_CLASSSYM:
16248
0
      return "MIPS_DELTA_CLASSSYM";
16249
0
    case DT_MIPS_DELTA_CLASSSYM_NO:
16250
0
      return "MIPS_DELTA_CLASSSYM_NO";
16251
0
    case DT_MIPS_CXX_FLAGS:
16252
0
      return "MIPS_CXX_FLAGS";
16253
0
    case DT_MIPS_PIXIE_INIT:
16254
0
      return "MIPS_PIXIE_INIT";
16255
0
    case DT_MIPS_SYMBOL_LIB:
16256
0
      return "MIPS_SYMBOL_LIB";
16257
0
    case DT_MIPS_LOCALPAGE_GOTIDX:
16258
0
      return "MIPS_LOCALPAGE_GOTIDX";
16259
0
    case DT_MIPS_LOCAL_GOTIDX:
16260
0
      return "MIPS_LOCAL_GOTIDX";
16261
0
    case DT_MIPS_HIDDEN_GOTIDX:
16262
0
      return "MIPS_HIDDEN_GOTIDX";
16263
0
    case DT_MIPS_PROTECTED_GOTIDX:
16264
0
      return "MIPS_PROTECTED_GOT_IDX";
16265
0
    case DT_MIPS_OPTIONS:
16266
0
      return "MIPS_OPTIONS";
16267
0
    case DT_MIPS_INTERFACE:
16268
0
      return "MIPS_INTERFACE";
16269
0
    case DT_MIPS_DYNSTR_ALIGN:
16270
0
      return "DT_MIPS_DYNSTR_ALIGN";
16271
0
    case DT_MIPS_INTERFACE_SIZE:
16272
0
      return "DT_MIPS_INTERFACE_SIZE";
16273
0
    case DT_MIPS_RLD_TEXT_RESOLVE_ADDR:
16274
0
      return "DT_MIPS_RLD_TEXT_RESOLVE_ADDR";
16275
0
    case DT_MIPS_PERF_SUFFIX:
16276
0
      return "DT_MIPS_PERF_SUFFIX";
16277
0
    case DT_MIPS_COMPACT_SIZE:
16278
0
      return "DT_MIPS_COMPACT_SIZE";
16279
0
    case DT_MIPS_GP_VALUE:
16280
0
      return "DT_MIPS_GP_VALUE";
16281
0
    case DT_MIPS_AUX_DYNAMIC:
16282
0
      return "DT_MIPS_AUX_DYNAMIC";
16283
0
    case DT_MIPS_PLTGOT:
16284
0
      return "DT_MIPS_PLTGOT";
16285
0
    case DT_MIPS_RWPLT:
16286
0
      return "DT_MIPS_RWPLT";
16287
0
    case DT_MIPS_XHASH:
16288
0
      return "DT_MIPS_XHASH";
16289
45
    }
16290
45
}
16291
16292
/* Return the meaning of Tag_GNU_MIPS_ABI_FP value FP, or null if
16293
   not known.  */
16294
16295
const char *
16296
_bfd_mips_fp_abi_string (int fp)
16297
0
{
16298
0
  switch (fp)
16299
0
    {
16300
      /* These strings aren't translated because they're simply
16301
   option lists.  */
16302
0
    case Val_GNU_MIPS_ABI_FP_DOUBLE:
16303
0
      return "-mdouble-float";
16304
16305
0
    case Val_GNU_MIPS_ABI_FP_SINGLE:
16306
0
      return "-msingle-float";
16307
16308
0
    case Val_GNU_MIPS_ABI_FP_SOFT:
16309
0
      return "-msoft-float";
16310
16311
0
    case Val_GNU_MIPS_ABI_FP_OLD_64:
16312
0
      return _("-mips32r2 -mfp64 (12 callee-saved)");
16313
16314
0
    case Val_GNU_MIPS_ABI_FP_XX:
16315
0
      return "-mfpxx";
16316
16317
0
    case Val_GNU_MIPS_ABI_FP_64:
16318
0
      return "-mgp32 -mfp64";
16319
16320
0
    case Val_GNU_MIPS_ABI_FP_64A:
16321
0
      return "-mgp32 -mfp64 -mno-odd-spreg";
16322
16323
0
    default:
16324
0
      return 0;
16325
0
    }
16326
0
}
16327
16328
static void
16329
print_mips_ases (FILE *file, unsigned int mask)
16330
0
{
16331
0
  if (mask & AFL_ASE_DSP)
16332
0
    fputs ("\n\tDSP ASE", file);
16333
0
  if (mask & AFL_ASE_DSPR2)
16334
0
    fputs ("\n\tDSP R2 ASE", file);
16335
0
  if (mask & AFL_ASE_DSPR3)
16336
0
    fputs ("\n\tDSP R3 ASE", file);
16337
0
  if (mask & AFL_ASE_EVA)
16338
0
    fputs ("\n\tEnhanced VA Scheme", file);
16339
0
  if (mask & AFL_ASE_MCU)
16340
0
    fputs ("\n\tMCU (MicroController) ASE", file);
16341
0
  if (mask & AFL_ASE_MDMX)
16342
0
    fputs ("\n\tMDMX ASE", file);
16343
0
  if (mask & AFL_ASE_MIPS3D)
16344
0
    fputs ("\n\tMIPS-3D ASE", file);
16345
0
  if (mask & AFL_ASE_MT)
16346
0
    fputs ("\n\tMT ASE", file);
16347
0
  if (mask & AFL_ASE_SMARTMIPS)
16348
0
    fputs ("\n\tSmartMIPS ASE", file);
16349
0
  if (mask & AFL_ASE_VIRT)
16350
0
    fputs ("\n\tVZ ASE", file);
16351
0
  if (mask & AFL_ASE_MSA)
16352
0
    fputs ("\n\tMSA ASE", file);
16353
0
  if (mask & AFL_ASE_MIPS16)
16354
0
    fputs ("\n\tMIPS16 ASE", file);
16355
0
  if (mask & AFL_ASE_MICROMIPS)
16356
0
    fputs ("\n\tMICROMIPS ASE", file);
16357
0
  if (mask & AFL_ASE_XPA)
16358
0
    fputs ("\n\tXPA ASE", file);
16359
0
  if (mask & AFL_ASE_MIPS16E2)
16360
0
    fputs ("\n\tMIPS16e2 ASE", file);
16361
0
  if (mask & AFL_ASE_CRC)
16362
0
    fputs ("\n\tCRC ASE", file);
16363
0
  if (mask & AFL_ASE_GINV)
16364
0
    fputs ("\n\tGINV ASE", file);
16365
0
  if (mask & AFL_ASE_LOONGSON_MMI)
16366
0
    fputs ("\n\tLoongson MMI ASE", file);
16367
0
  if (mask & AFL_ASE_LOONGSON_CAM)
16368
0
    fputs ("\n\tLoongson CAM ASE", file);
16369
0
  if (mask & AFL_ASE_LOONGSON_EXT)
16370
0
    fputs ("\n\tLoongson EXT ASE", file);
16371
0
  if (mask & AFL_ASE_LOONGSON_EXT2)
16372
0
    fputs ("\n\tLoongson EXT2 ASE", file);
16373
0
  if (mask == 0)
16374
0
    fprintf (file, "\n\t%s", _("None"));
16375
0
  else if ((mask & ~AFL_ASE_MASK) != 0)
16376
0
    fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
16377
0
}
16378
16379
static void
16380
print_mips_isa_ext (FILE *file, unsigned int isa_ext)
16381
0
{
16382
0
  switch (isa_ext)
16383
0
    {
16384
0
    case 0:
16385
0
      fputs (_("None"), file);
16386
0
      break;
16387
0
    case AFL_EXT_XLR:
16388
0
      fputs ("RMI XLR", file);
16389
0
      break;
16390
0
    case AFL_EXT_OCTEON3:
16391
0
      fputs ("Cavium Networks Octeon3", file);
16392
0
      break;
16393
0
    case AFL_EXT_OCTEON2:
16394
0
      fputs ("Cavium Networks Octeon2", file);
16395
0
      break;
16396
0
    case AFL_EXT_OCTEONP:
16397
0
      fputs ("Cavium Networks OcteonP", file);
16398
0
      break;
16399
0
    case AFL_EXT_OCTEON:
16400
0
      fputs ("Cavium Networks Octeon", file);
16401
0
      break;
16402
0
    case AFL_EXT_5900:
16403
0
      fputs ("Toshiba R5900", file);
16404
0
      break;
16405
0
    case AFL_EXT_4650:
16406
0
      fputs ("MIPS R4650", file);
16407
0
      break;
16408
0
    case AFL_EXT_4010:
16409
0
      fputs ("LSI R4010", file);
16410
0
      break;
16411
0
    case AFL_EXT_4100:
16412
0
      fputs ("NEC VR4100", file);
16413
0
      break;
16414
0
    case AFL_EXT_3900:
16415
0
      fputs ("Toshiba R3900", file);
16416
0
      break;
16417
0
    case AFL_EXT_10000:
16418
0
      fputs ("MIPS R10000", file);
16419
0
      break;
16420
0
    case AFL_EXT_SB1:
16421
0
      fputs ("Broadcom SB-1", file);
16422
0
      break;
16423
0
    case AFL_EXT_4111:
16424
0
      fputs ("NEC VR4111/VR4181", file);
16425
0
      break;
16426
0
    case AFL_EXT_4120:
16427
0
      fputs ("NEC VR4120", file);
16428
0
      break;
16429
0
    case AFL_EXT_5400:
16430
0
      fputs ("NEC VR5400", file);
16431
0
      break;
16432
0
    case AFL_EXT_5500:
16433
0
      fputs ("NEC VR5500", file);
16434
0
      break;
16435
0
    case AFL_EXT_LOONGSON_2E:
16436
0
      fputs ("ST Microelectronics Loongson 2E", file);
16437
0
      break;
16438
0
    case AFL_EXT_LOONGSON_2F:
16439
0
      fputs ("ST Microelectronics Loongson 2F", file);
16440
0
      break;
16441
0
    case AFL_EXT_INTERAPTIV_MR2:
16442
0
      fputs ("Imagination interAptiv MR2", file);
16443
0
      break;
16444
0
    default:
16445
0
      fprintf (file, "%s (%d)", _("Unknown"), isa_ext);
16446
0
      break;
16447
0
    }
16448
0
}
16449
16450
static void
16451
print_mips_fp_abi_value (FILE *file, int val)
16452
0
{
16453
0
  switch (val)
16454
0
    {
16455
0
    case Val_GNU_MIPS_ABI_FP_ANY:
16456
0
      fprintf (file, _("Hard or soft float\n"));
16457
0
      break;
16458
0
    case Val_GNU_MIPS_ABI_FP_DOUBLE:
16459
0
      fprintf (file, _("Hard float (double precision)\n"));
16460
0
      break;
16461
0
    case Val_GNU_MIPS_ABI_FP_SINGLE:
16462
0
      fprintf (file, _("Hard float (single precision)\n"));
16463
0
      break;
16464
0
    case Val_GNU_MIPS_ABI_FP_SOFT:
16465
0
      fprintf (file, _("Soft float\n"));
16466
0
      break;
16467
0
    case Val_GNU_MIPS_ABI_FP_OLD_64:
16468
0
      fprintf (file, _("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
16469
0
      break;
16470
0
    case Val_GNU_MIPS_ABI_FP_XX:
16471
0
      fprintf (file, _("Hard float (32-bit CPU, Any FPU)\n"));
16472
0
      break;
16473
0
    case Val_GNU_MIPS_ABI_FP_64:
16474
0
      fprintf (file, _("Hard float (32-bit CPU, 64-bit FPU)\n"));
16475
0
      break;
16476
0
    case Val_GNU_MIPS_ABI_FP_64A:
16477
0
      fprintf (file, _("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
16478
0
      break;
16479
0
    default:
16480
0
      fprintf (file, "??? (%d)\n", val);
16481
0
      break;
16482
0
    }
16483
0
}
16484
16485
static int
16486
get_mips_reg_size (int reg_size)
16487
0
{
16488
0
  return (reg_size == AFL_REG_NONE) ? 0
16489
0
   : (reg_size == AFL_REG_32) ? 32
16490
0
   : (reg_size == AFL_REG_64) ? 64
16491
0
   : (reg_size == AFL_REG_128) ? 128
16492
0
   : -1;
16493
0
}
16494
16495
bool
16496
_bfd_mips_elf_print_private_bfd_data (bfd *abfd, void *ptr)
16497
324
{
16498
324
  FILE *file = ptr;
16499
16500
324
  BFD_ASSERT (abfd != NULL && ptr != NULL);
16501
16502
  /* Print normal ELF private data.  */
16503
324
  _bfd_elf_print_private_bfd_data (abfd, ptr);
16504
16505
  /* xgettext:c-format */
16506
324
  fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
16507
16508
324
  if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == EF_MIPS_ABI_O32)
16509
2
    fprintf (file, _(" [abi=O32]"));
16510
322
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == EF_MIPS_ABI_O64)
16511
1
    fprintf (file, _(" [abi=O64]"));
16512
321
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == EF_MIPS_ABI_EABI32)
16513
0
    fprintf (file, _(" [abi=EABI32]"));
16514
321
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == EF_MIPS_ABI_EABI64)
16515
0
    fprintf (file, _(" [abi=EABI64]"));
16516
321
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI))
16517
183
    fprintf (file, _(" [abi unknown]"));
16518
138
  else if (ABI_N32_P (abfd))
16519
32
    fprintf (file, _(" [abi=N32]"));
16520
106
  else if (ABI_64_P (abfd))
16521
55
    fprintf (file, _(" [abi=64]"));
16522
51
  else
16523
51
    fprintf (file, _(" [no abi set]"));
16524
16525
324
  if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_1)
16526
103
    fprintf (file, " [mips1]");
16527
221
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_2)
16528
0
    fprintf (file, " [mips2]");
16529
221
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_3)
16530
5
    fprintf (file, " [mips3]");
16531
216
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_4)
16532
1
    fprintf (file, " [mips4]");
16533
215
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_5)
16534
1
    fprintf (file, " [mips5]");
16535
214
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32)
16536
10
    fprintf (file, " [mips32]");
16537
204
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_64)
16538
5
    fprintf (file, " [mips64]");
16539
199
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32R2)
16540
89
    fprintf (file, " [mips32r2]");
16541
110
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_64R2)
16542
0
    fprintf (file, " [mips64r2]");
16543
110
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32R6)
16544
75
    fprintf (file, " [mips32r6]");
16545
35
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_64R6)
16546
25
    fprintf (file, " [mips64r6]");
16547
10
  else
16548
10
    fprintf (file, _(" [unknown ISA]"));
16549
16550
324
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
16551
125
    fprintf (file, " [mdmx]");
16552
16553
324
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
16554
40
    fprintf (file, " [mips16]");
16555
16556
324
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
16557
198
    fprintf (file, " [micromips]");
16558
16559
324
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_NAN2008)
16560
181
    fprintf (file, " [nan2008]");
16561
16562
324
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_FP64)
16563
186
    fprintf (file, " [old fp64]");
16564
16565
324
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_32BITMODE)
16566
147
    fprintf (file, " [32bitmode]");
16567
177
  else
16568
177
    fprintf (file, _(" [not 32bitmode]"));
16569
16570
324
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_NOREORDER)
16571
205
    fprintf (file, " [noreorder]");
16572
16573
324
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_PIC)
16574
20
    fprintf (file, " [PIC]");
16575
16576
324
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_CPIC)
16577
213
    fprintf (file, " [CPIC]");
16578
16579
324
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_XGOT)
16580
24
    fprintf (file, " [XGOT]");
16581
16582
324
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_UCODE)
16583
205
    fprintf (file, " [UCODE]");
16584
16585
324
  fputc ('\n', file);
16586
16587
324
  if (mips_elf_tdata (abfd)->abiflags_valid)
16588
0
    {
16589
0
      Elf_Internal_ABIFlags_v0 *abiflags = &mips_elf_tdata (abfd)->abiflags;
16590
0
      fprintf (file, "\nMIPS ABI Flags Version: %d\n", abiflags->version);
16591
0
      fprintf (file, "\nISA: MIPS%d", abiflags->isa_level);
16592
0
      if (abiflags->isa_rev > 1)
16593
0
  fprintf (file, "r%d", abiflags->isa_rev);
16594
0
      fprintf (file, "\nGPR size: %d",
16595
0
         get_mips_reg_size (abiflags->gpr_size));
16596
0
      fprintf (file, "\nCPR1 size: %d",
16597
0
         get_mips_reg_size (abiflags->cpr1_size));
16598
0
      fprintf (file, "\nCPR2 size: %d",
16599
0
         get_mips_reg_size (abiflags->cpr2_size));
16600
0
      fputs ("\nFP ABI: ", file);
16601
0
      print_mips_fp_abi_value (file, abiflags->fp_abi);
16602
0
      fputs ("ISA Extension: ", file);
16603
0
      print_mips_isa_ext (file, abiflags->isa_ext);
16604
0
      fputs ("\nASEs:", file);
16605
0
      print_mips_ases (file, abiflags->ases);
16606
0
      fprintf (file, "\nFLAGS 1: %8.8lx", abiflags->flags1);
16607
0
      fprintf (file, "\nFLAGS 2: %8.8lx", abiflags->flags2);
16608
0
      fputc ('\n', file);
16609
0
    }
16610
16611
324
  return true;
16612
324
}
16613
16614
const struct bfd_elf_special_section _bfd_mips_elf_special_sections[] =
16615
{
16616
  { STRING_COMMA_LEN (".lit4"),   0, SHT_PROGBITS,   SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16617
  { STRING_COMMA_LEN (".lit8"),   0, SHT_PROGBITS,   SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16618
  { STRING_COMMA_LEN (".mdebug"), 0, SHT_MIPS_DEBUG, 0 },
16619
  { STRING_COMMA_LEN (".sbss"),  -2, SHT_NOBITS,     SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16620
  { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS,   SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16621
  { STRING_COMMA_LEN (".ucode"),  0, SHT_MIPS_UCODE, 0 },
16622
  { STRING_COMMA_LEN (".MIPS.xhash"),  0, SHT_MIPS_XHASH,   SHF_ALLOC },
16623
  { NULL,         0,  0, 0,        0 }
16624
};
16625
16626
/* Merge non visibility st_other attributes.  Ensure that the
16627
   STO_OPTIONAL flag is copied into h->other, even if this is not a
16628
   definiton of the symbol.  */
16629
void
16630
_bfd_mips_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
16631
              unsigned int st_other,
16632
              bool definition,
16633
              bool dynamic ATTRIBUTE_UNUSED)
16634
0
{
16635
0
  if ((st_other & ~ELF_ST_VISIBILITY (-1)) != 0)
16636
0
    {
16637
0
      unsigned char other;
16638
16639
0
      other = (definition ? st_other : h->other);
16640
0
      other &= ~ELF_ST_VISIBILITY (-1);
16641
0
      h->other = other | ELF_ST_VISIBILITY (h->other);
16642
0
    }
16643
16644
0
  if (!definition
16645
0
      && ELF_MIPS_IS_OPTIONAL (st_other))
16646
0
    h->other |= STO_OPTIONAL;
16647
0
}
16648
16649
/* Decide whether an undefined symbol is special and can be ignored.
16650
   This is the case for OPTIONAL symbols on IRIX.  */
16651
bool
16652
_bfd_mips_elf_ignore_undef_symbol (struct elf_link_hash_entry *h)
16653
0
{
16654
0
  return ELF_MIPS_IS_OPTIONAL (h->other) != 0;
16655
0
}
16656
16657
bool
16658
_bfd_mips_elf_common_definition (Elf_Internal_Sym *sym)
16659
0
{
16660
0
  return (sym->st_shndx == SHN_COMMON
16661
0
    || sym->st_shndx == SHN_MIPS_ACOMMON
16662
0
    || sym->st_shndx == SHN_MIPS_SCOMMON);
16663
0
}
16664
16665
/* Return address for Ith PLT stub in section PLT, for relocation REL
16666
   or (bfd_vma) -1 if it should not be included.  */
16667
16668
bfd_vma
16669
_bfd_mips_elf_plt_sym_val (bfd_vma i, const asection *plt,
16670
         const arelent *rel ATTRIBUTE_UNUSED)
16671
0
{
16672
0
  return (plt->vma
16673
0
    + 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry)
16674
0
    + i * 4 * ARRAY_SIZE (mips_exec_plt_entry));
16675
0
}
16676
16677
/* Build a table of synthetic symbols to represent the PLT.  As with MIPS16
16678
   and microMIPS PLT slots we may have a many-to-one mapping between .plt
16679
   and .got.plt and also the slots may be of a different size each we walk
16680
   the PLT manually fetching instructions and matching them against known
16681
   patterns.  To make things easier standard MIPS slots, if any, always come
16682
   first.  As we don't create proper ELF symbols we use the UDATA.I member
16683
   of ASYMBOL to carry ISA annotation.  The encoding used is the same as
16684
   with the ST_OTHER member of the ELF symbol.  */
16685
16686
long
16687
_bfd_mips_elf_get_synthetic_symtab (bfd *abfd,
16688
            long symcount ATTRIBUTE_UNUSED,
16689
            asymbol **syms ATTRIBUTE_UNUSED,
16690
            long dynsymcount, asymbol **dynsyms,
16691
            asymbol **ret)
16692
41
{
16693
41
  static const char pltname[] = "_PROCEDURE_LINKAGE_TABLE_";
16694
41
  static const char microsuffix[] = "@micromipsplt";
16695
41
  static const char m16suffix[] = "@mips16plt";
16696
41
  static const char mipssuffix[] = "@plt";
16697
16698
41
  bool (*slurp_relocs) (bfd *, asection *, asymbol **, bool);
16699
41
  elf_backend_data *bed = get_elf_backend_data (abfd);
16700
41
  bool micromips_p = MICROMIPS_P (abfd);
16701
41
  Elf_Internal_Shdr *hdr;
16702
41
  bfd_byte *plt_data;
16703
41
  bfd_vma plt_offset;
16704
41
  unsigned int other;
16705
41
  bfd_vma entry_size;
16706
41
  bfd_vma plt0_size;
16707
41
  asection *relplt;
16708
41
  bfd_vma opcode;
16709
41
  asection *plt;
16710
41
  asymbol *send;
16711
41
  size_t size;
16712
41
  char *names;
16713
41
  long counti;
16714
41
  arelent *p;
16715
41
  asymbol *s;
16716
41
  char *nend;
16717
41
  long count;
16718
41
  long pi;
16719
41
  long i;
16720
41
  long n;
16721
16722
41
  *ret = NULL;
16723
16724
41
  if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0 || dynsymcount <= 0)
16725
41
    return 0;
16726
16727
0
  relplt = bfd_get_section_by_name (abfd, ".rel.plt");
16728
0
  if (relplt == NULL)
16729
0
    return 0;
16730
16731
0
  hdr = &elf_section_data (relplt)->this_hdr;
16732
0
  if (hdr->sh_link != elf_dynsymtab (abfd) || hdr->sh_type != SHT_REL)
16733
0
    return 0;
16734
16735
0
  plt = bfd_get_section_by_name (abfd, ".plt");
16736
0
  if (plt == NULL || (plt->flags & SEC_HAS_CONTENTS) == 0)
16737
0
    return 0;
16738
16739
0
  slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
16740
0
  if (!(*slurp_relocs) (abfd, relplt, dynsyms, true))
16741
0
    return -1;
16742
0
  p = relplt->relocation;
16743
16744
  /* Calculating the exact amount of space required for symbols would
16745
     require two passes over the PLT, so just pessimise assuming two
16746
     PLT slots per relocation.  */
16747
0
  count = NUM_SHDR_ENTRIES (hdr);
16748
0
  counti = count * bed->s->int_rels_per_ext_rel;
16749
0
  size = 2 * count * sizeof (asymbol);
16750
0
  size += count * (sizeof (mipssuffix) +
16751
0
       (micromips_p ? sizeof (microsuffix) : sizeof (m16suffix)));
16752
0
  for (pi = 0; pi < counti; pi += bed->s->int_rels_per_ext_rel)
16753
0
    size += 2 * strlen ((*p[pi].sym_ptr_ptr)->name);
16754
16755
  /* Add the size of "_PROCEDURE_LINKAGE_TABLE_" too.  */
16756
0
  size += sizeof (asymbol) + sizeof (pltname);
16757
16758
0
  if (!bfd_malloc_and_get_section (abfd, plt, &plt_data))
16759
0
    return -1;
16760
16761
0
  if (plt->size < 16)
16762
0
    return -1;
16763
16764
0
  s = *ret = bfd_malloc (size);
16765
0
  if (s == NULL)
16766
0
    return -1;
16767
0
  send = s + 2 * count + 1;
16768
16769
0
  names = (char *) send;
16770
0
  nend = (char *) s + size;
16771
0
  n = 0;
16772
16773
0
  opcode = bfd_get_micromips_32 (abfd, plt_data + 12);
16774
0
  if (opcode == 0x3302fffe)
16775
0
    {
16776
0
      if (!micromips_p)
16777
0
  return -1;
16778
0
      plt0_size = 2 * ARRAY_SIZE (micromips_o32_exec_plt0_entry);
16779
0
      other = STO_MICROMIPS;
16780
0
    }
16781
0
  else if (opcode == 0x0398c1d0)
16782
0
    {
16783
0
      if (!micromips_p)
16784
0
  return -1;
16785
0
      plt0_size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry);
16786
0
      other = STO_MICROMIPS;
16787
0
    }
16788
0
  else
16789
0
    {
16790
0
      plt0_size = 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry);
16791
0
      other = 0;
16792
0
    }
16793
16794
0
  s->the_bfd = abfd;
16795
0
  s->flags = BSF_SYNTHETIC | BSF_FUNCTION | BSF_LOCAL;
16796
0
  s->section = plt;
16797
0
  s->value = 0;
16798
0
  s->name = names;
16799
0
  s->udata.i = other;
16800
0
  memcpy (names, pltname, sizeof (pltname));
16801
0
  names += sizeof (pltname);
16802
0
  ++s, ++n;
16803
16804
0
  pi = 0;
16805
0
  for (plt_offset = plt0_size;
16806
0
       plt_offset + 8 <= plt->size && s < send;
16807
0
       plt_offset += entry_size)
16808
0
    {
16809
0
      bfd_vma gotplt_addr;
16810
0
      const char *suffix;
16811
0
      bfd_vma gotplt_hi;
16812
0
      bfd_vma gotplt_lo;
16813
0
      size_t suffixlen;
16814
16815
0
      opcode = bfd_get_micromips_32 (abfd, plt_data + plt_offset + 4);
16816
16817
      /* Check if the second word matches the expected MIPS16 instruction.  */
16818
0
      if (opcode == 0x651aeb00)
16819
0
  {
16820
0
    if (micromips_p)
16821
0
      return -1;
16822
    /* Truncated table???  */
16823
0
    if (plt_offset + 16 > plt->size)
16824
0
      break;
16825
0
    gotplt_addr = bfd_get_32 (abfd, plt_data + plt_offset + 12);
16826
0
    entry_size = 2 * ARRAY_SIZE (mips16_o32_exec_plt_entry);
16827
0
    suffixlen = sizeof (m16suffix);
16828
0
    suffix = m16suffix;
16829
0
    other = STO_MIPS16;
16830
0
  }
16831
      /* Likewise the expected microMIPS instruction (no insn32 mode).  */
16832
0
      else if (opcode == 0xff220000)
16833
0
  {
16834
0
    if (!micromips_p)
16835
0
      return -1;
16836
0
    gotplt_hi = bfd_get_16 (abfd, plt_data + plt_offset) & 0x7f;
16837
0
    gotplt_lo = bfd_get_16 (abfd, plt_data + plt_offset + 2) & 0xffff;
16838
0
    gotplt_hi = ((gotplt_hi ^ 0x40) - 0x40) << 18;
16839
0
    gotplt_lo <<= 2;
16840
0
    gotplt_addr = gotplt_hi + gotplt_lo;
16841
0
    gotplt_addr += ((plt->vma + plt_offset) | 3) ^ 3;
16842
0
    entry_size = 2 * ARRAY_SIZE (micromips_o32_exec_plt_entry);
16843
0
    suffixlen = sizeof (microsuffix);
16844
0
    suffix = microsuffix;
16845
0
    other = STO_MICROMIPS;
16846
0
  }
16847
      /* Likewise the expected microMIPS instruction (insn32 mode).  */
16848
0
      else if ((opcode & 0xffff0000) == 0xff2f0000)
16849
0
  {
16850
0
    gotplt_hi = bfd_get_16 (abfd, plt_data + plt_offset + 2) & 0xffff;
16851
0
    gotplt_lo = bfd_get_16 (abfd, plt_data + plt_offset + 6) & 0xffff;
16852
0
    gotplt_hi = ((gotplt_hi ^ 0x8000) - 0x8000) << 16;
16853
0
    gotplt_lo = (gotplt_lo ^ 0x8000) - 0x8000;
16854
0
    gotplt_addr = gotplt_hi + gotplt_lo;
16855
0
    entry_size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt_entry);
16856
0
    suffixlen = sizeof (microsuffix);
16857
0
    suffix = microsuffix;
16858
0
    other = STO_MICROMIPS;
16859
0
  }
16860
      /* Otherwise assume standard MIPS code.  */
16861
0
      else
16862
0
  {
16863
0
    gotplt_hi = bfd_get_32 (abfd, plt_data + plt_offset) & 0xffff;
16864
0
    gotplt_lo = bfd_get_32 (abfd, plt_data + plt_offset + 4) & 0xffff;
16865
0
    gotplt_hi = ((gotplt_hi ^ 0x8000) - 0x8000) << 16;
16866
0
    gotplt_lo = (gotplt_lo ^ 0x8000) - 0x8000;
16867
0
    gotplt_addr = gotplt_hi + gotplt_lo;
16868
0
    entry_size = 4 * ARRAY_SIZE (mips_exec_plt_entry);
16869
0
    suffixlen = sizeof (mipssuffix);
16870
0
    suffix = mipssuffix;
16871
0
    other = 0;
16872
0
  }
16873
      /* Truncated table???  */
16874
0
      if (plt_offset + entry_size > plt->size)
16875
0
  break;
16876
16877
0
      for (i = 0;
16878
0
     i < count && p[pi].address != gotplt_addr;
16879
0
     i++, pi = (pi + bed->s->int_rels_per_ext_rel) % counti);
16880
16881
0
      if (i < count)
16882
0
  {
16883
0
    size_t namelen;
16884
0
    size_t len;
16885
16886
0
    *s = **p[pi].sym_ptr_ptr;
16887
    /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set.  Since
16888
       we are defining a symbol, ensure one of them is set.  */
16889
0
    if ((s->flags & BSF_LOCAL) == 0)
16890
0
      s->flags |= BSF_GLOBAL;
16891
0
    s->flags |= BSF_SYNTHETIC;
16892
0
    s->section = plt;
16893
0
    s->value = plt_offset;
16894
0
    s->name = names;
16895
0
    s->udata.i = other;
16896
16897
0
    len = strlen ((*p[pi].sym_ptr_ptr)->name);
16898
0
    namelen = len + suffixlen;
16899
0
    if (names + namelen > nend)
16900
0
      break;
16901
16902
0
    memcpy (names, (*p[pi].sym_ptr_ptr)->name, len);
16903
0
    names += len;
16904
0
    memcpy (names, suffix, suffixlen);
16905
0
    names += suffixlen;
16906
16907
0
    ++s, ++n;
16908
0
    pi = (pi + bed->s->int_rels_per_ext_rel) % counti;
16909
0
  }
16910
0
    }
16911
16912
0
  free (plt_data);
16913
16914
0
  return n;
16915
0
}
16916
16917
/* Return the ABI flags associated with ABFD if available.  */
16918
16919
Elf_Internal_ABIFlags_v0 *
16920
bfd_mips_elf_get_abiflags (bfd *abfd)
16921
423k
{
16922
423k
  struct mips_elf_obj_tdata *tdata = mips_elf_tdata (abfd);
16923
16924
423k
  return tdata->abiflags_valid ? &tdata->abiflags : NULL;
16925
423k
}
16926
16927
/* MIPS libc ABI versions, used with the EI_ABIVERSION ELF file header
16928
   field.  Taken from `libc-abis.h' generated at GNU libc build time.
16929
   Using a MIPS_ prefix as other libc targets use different values.  */
16930
enum
16931
{
16932
  MIPS_LIBC_ABI_DEFAULT = 0,
16933
  MIPS_LIBC_ABI_MIPS_PLT,
16934
  MIPS_LIBC_ABI_UNIQUE,
16935
  MIPS_LIBC_ABI_MIPS_O32_FP64,
16936
  MIPS_LIBC_ABI_ABSOLUTE,
16937
  MIPS_LIBC_ABI_XHASH,
16938
  MIPS_LIBC_ABI_MAX
16939
};
16940
16941
bool
16942
_bfd_mips_init_file_header (bfd *abfd, struct bfd_link_info *link_info)
16943
67
{
16944
67
  struct mips_elf_link_hash_table *htab = NULL;
16945
67
  Elf_Internal_Ehdr *i_ehdrp;
16946
16947
67
  if (!_bfd_elf_init_file_header (abfd, link_info))
16948
0
    return false;
16949
16950
67
  i_ehdrp = elf_elfheader (abfd);
16951
67
  if (link_info)
16952
0
    {
16953
0
      htab = mips_elf_hash_table (link_info);
16954
0
      BFD_ASSERT (htab != NULL);
16955
0
    }
16956
16957
67
  if (htab != NULL
16958
0
      && htab->use_plts_and_copy_relocs
16959
0
      && htab->root.target_os != is_vxworks)
16960
0
    i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_MIPS_PLT;
16961
16962
67
  if (mips_elf_tdata (abfd)->abiflags.fp_abi == Val_GNU_MIPS_ABI_FP_64
16963
67
      || mips_elf_tdata (abfd)->abiflags.fp_abi == Val_GNU_MIPS_ABI_FP_64A)
16964
0
    i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_MIPS_O32_FP64;
16965
16966
  /* Mark that we need support for absolute symbols in the dynamic loader.  */
16967
67
  if (htab != NULL && htab->use_absolute_zero && htab->gnu_target)
16968
0
    i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_ABSOLUTE;
16969
16970
  /* Mark that we need support for .MIPS.xhash in the dynamic linker,
16971
     if it is the only hash section that will be created.  */
16972
67
  if (link_info && link_info->emit_gnu_hash && !link_info->emit_hash)
16973
0
    i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_XHASH;
16974
67
  return true;
16975
67
}
16976
16977
int
16978
_bfd_mips_elf_compact_eh_encoding
16979
  (struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
16980
0
{
16981
0
  return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
16982
0
}
16983
16984
/* Return the opcode for can't unwind.  */
16985
16986
int
16987
_bfd_mips_elf_cant_unwind_opcode
16988
  (struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
16989
0
{
16990
0
  return COMPACT_EH_CANT_UNWIND_OPCODE;
16991
0
}
16992
16993
/* Record a position XLAT_LOC in the xlat translation table, associated with
16994
   the hash entry H.  The entry in the translation table will later be
16995
   populated with the real symbol dynindx.  */
16996
16997
void
16998
_bfd_mips_elf_record_xhash_symbol (struct elf_link_hash_entry *h,
16999
           bfd_vma xlat_loc)
17000
0
{
17001
0
  struct mips_elf_link_hash_entry *hmips;
17002
17003
0
  hmips = (struct mips_elf_link_hash_entry *) h;
17004
0
  hmips->mipsxhash_loc = xlat_loc;
17005
0
}