Coverage Report

Created: 2026-04-04 08:16

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
41.6k
  ((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
484k
  ((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
378
  ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
823
824
/* Nonzero if ABFD is using NewABI conventions.  */
825
109
#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
112
  ((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
183
  (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
358
  (IRIX_COMPAT (abfd) != ict_none)
843
844
/* The name of the options section.  */
845
#define MIPS_ELF_OPTIONS_SECTION_NAME(abfd) \
846
109
  (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
604
  (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
50
  (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
235k
{
1378
235k
  return bfd_elf_allocate_object (abfd, sizeof (struct mips_elf_obj_tdata));
1379
235k
}
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
722k
{
1393
722k
  struct mips_elf_obj_tdata *tdata;
1394
1395
722k
  if ((bfd_get_format (abfd) == bfd_object
1396
719k
       || bfd_get_format (abfd) == bfd_core)
1397
3.73k
      && (tdata = mips_elf_tdata (abfd)) != NULL)
1398
3.73k
    {
1399
3.73k
      BFD_ASSERT (tdata->root.object_id == MIPS_ELF_DATA);
1400
44.9k
      for (asection *sec = abfd->sections; sec; sec = sec->next)
1401
41.2k
  mips_elf_free_hi16_list (abfd, sec, false, NULL);
1402
3.73k
      if (tdata->find_line_info != NULL)
1403
260
  _bfd_ecoff_free_ecoff_debug_info (&tdata->find_line_info->d);
1404
3.73k
    }
1405
722k
  return _bfd_elf_free_cached_info (abfd);
1406
722k
}
1407
1408
bool
1409
_bfd_mips_elf_new_section_hook (bfd *abfd, asection *sec)
1410
165k
{
1411
165k
  struct _mips_elf_section_data *sdata;
1412
1413
165k
  sdata = bfd_zalloc (abfd, sizeof (*sdata));
1414
165k
  if (sdata == NULL)
1415
0
    return false;
1416
165k
  sec->used_by_bfd = sdata;
1417
1418
165k
  return _bfd_elf_new_section_hook (abfd, sec);
1419
165k
}
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.98k
{
1428
3.98k
  HDRR *symhdr;
1429
3.98k
  const struct ecoff_debug_swap *swap;
1430
3.98k
  char *ext_hdr;
1431
1432
3.98k
  swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1433
3.98k
  memset (debug, 0, sizeof (*debug));
1434
1435
3.98k
  ext_hdr = bfd_malloc (swap->external_hdr_size);
1436
3.98k
  if (ext_hdr == NULL && swap->external_hdr_size != 0)
1437
0
    goto error_return;
1438
1439
3.98k
  if (! bfd_get_section_contents (abfd, section, ext_hdr, 0,
1440
3.98k
          swap->external_hdr_size))
1441
231
    goto error_return;
1442
1443
3.75k
  symhdr = &debug->symbolic_header;
1444
3.75k
  (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
1445
3.75k
  free (ext_hdr);
1446
3.75k
  ext_hdr = NULL;
1447
1448
  /* The symbolic header contains absolute file offsets and sizes to
1449
     read.  */
1450
3.75k
#define READ(ptr, offset, count, size)          \
1451
17.9k
  do                  \
1452
17.9k
    {                 \
1453
17.9k
      size_t amt;             \
1454
17.9k
      debug->ptr = NULL;            \
1455
17.9k
      if (symhdr->count == 0)           \
1456
17.9k
  break;               \
1457
17.9k
      if (_bfd_mul_overflow (size, symhdr->count, &amt))   \
1458
7.22k
  {               \
1459
0
    bfd_set_error (bfd_error_file_too_big);     \
1460
0
    goto error_return;            \
1461
0
  }                \
1462
7.22k
      if (bfd_seek (abfd, symhdr->offset, SEEK_SET) != 0)   \
1463
7.22k
  goto error_return;           \
1464
7.22k
      debug->ptr = _bfd_malloc_and_read (abfd, amt + 1, amt);   \
1465
5.97k
      if (debug->ptr == NULL)           \
1466
5.97k
  goto error_return;           \
1467
5.97k
      ((char *) debug->ptr)[amt] = 0;         \
1468
3.73k
    } while (0)
1469
1470
3.75k
  READ (line, cbLineOffset, cbLine, sizeof (unsigned char));
1471
2.42k
  READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size);
1472
2.08k
  READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size);
1473
1.88k
  READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size);
1474
1.71k
  READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size);
1475
1.52k
  READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext));
1476
1.34k
  READ (ss, cbSsOffset, issMax, sizeof (char));
1477
1.16k
  READ (ssext, cbSsExtOffset, issExtMax, sizeof (char));
1478
953
  READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size);
1479
658
  READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size);
1480
445
  READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size);
1481
260
#undef READ
1482
1483
260
  return true;
1484
1485
3.72k
 error_return:
1486
3.72k
  free (ext_hdr);
1487
3.72k
  _bfd_ecoff_free_ecoff_debug_info (debug);
1488
3.72k
  return false;
1489
445
}
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
863
{
2184
863
  switch (r_type)
2185
863
    {
2186
26
    case R_MIPS16_26:
2187
26
    case R_MIPS16_GPREL:
2188
58
    case R_MIPS16_GOT16:
2189
60
    case R_MIPS16_CALL16:
2190
60
    case R_MIPS16_HI16:
2191
76
    case R_MIPS16_LO16:
2192
76
    case R_MIPS16_TLS_GD:
2193
76
    case R_MIPS16_TLS_LDM:
2194
76
    case R_MIPS16_TLS_DTPREL_HI16:
2195
76
    case R_MIPS16_TLS_DTPREL_LO16:
2196
80
    case R_MIPS16_TLS_GOTTPREL:
2197
80
    case R_MIPS16_TLS_TPREL_HI16:
2198
80
    case R_MIPS16_TLS_TPREL_LO16:
2199
80
    case R_MIPS16_PC16_S1:
2200
80
      return true;
2201
2202
783
    default:
2203
783
      return false;
2204
863
    }
2205
863
}
2206
2207
/* Check if a microMIPS reloc.  */
2208
2209
static inline bool
2210
micromips_reloc_p (unsigned int r_type)
2211
911
{
2212
911
  return r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max;
2213
911
}
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
783
{
2223
783
  return (micromips_reloc_p (r_type)
2224
79
    && r_type != R_MICROMIPS_PC7_S1
2225
73
    && r_type != R_MICROMIPS_PC10_S1
2226
63
    && r_type != R_MICROMIPS_GPREL7_S2);
2227
783
}
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
863
{
2391
863
  return mips16_reloc_p (r_type) || micromips_reloc_shuffle_p (r_type);
2392
863
}
2393
2394
void
2395
_bfd_mips_elf_reloc_unshuffle (bfd *abfd, int r_type,
2396
             bool jal_shuffle, bfd_byte *data)
2397
426
{
2398
426
  bfd_vma first, second, val;
2399
2400
426
  if (!needs_shuffle (r_type))
2401
362
    return;
2402
2403
  /* Pick up the first and second halfwords of the instruction.  */
2404
64
  first = bfd_get_16 (abfd, data);
2405
64
  second = bfd_get_16 (abfd, data + 2);
2406
64
  if (micromips_reloc_p (r_type) || (r_type == R_MIPS16_26 && !jal_shuffle))
2407
37
    val = first << 16 | second;
2408
27
  else if (r_type != R_MIPS16_26)
2409
27
    val = (((first & 0xf800) << 16) | ((second & 0xffe0) << 11)
2410
27
     | ((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
64
  bfd_put_32 (abfd, val, data);
2415
64
}
2416
2417
void
2418
_bfd_mips_elf_reloc_shuffle (bfd *abfd, int r_type,
2419
           bool jal_shuffle, bfd_byte *data)
2420
426
{
2421
426
  bfd_vma first, second, val;
2422
2423
426
  if (!needs_shuffle (r_type))
2424
362
    return;
2425
2426
64
  val = bfd_get_32 (abfd, data);
2427
64
  if (micromips_reloc_p (r_type) || (r_type == R_MIPS16_26 && !jal_shuffle))
2428
37
    {
2429
37
      second = val & 0xffff;
2430
37
      first = val >> 16;
2431
37
    }
2432
27
  else if (r_type != R_MIPS16_26)
2433
27
    {
2434
27
      second = ((val >> 11) & 0xffe0) | (val & 0x1f);
2435
27
      first = ((val >> 16) & 0xf800) | ((val >> 11) & 0x1f) | (val & 0x7e0);
2436
27
    }
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
64
  bfd_put_16 (abfd, second, data + 2);
2444
64
  bfd_put_16 (abfd, first, data);
2445
64
}
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
502
{
2465
502
  if (check == check_inplace && !reloc_entry->howto->partial_inplace)
2466
0
    return true;
2467
502
  if (check == check_shuffle && !needs_shuffle (reloc_entry->howto->type))
2468
5
    return true;
2469
497
  return bfd_reloc_offset_in_range (reloc_entry->howto, abfd,
2470
497
            input_section, reloc_entry->address);
2471
502
}
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
28
{
2478
28
  bfd_vma relocation;
2479
28
  bfd_signed_vma val;
2480
28
  bfd_reloc_status_type status;
2481
2482
28
  if (bfd_is_com_section (symbol->section))
2483
2
    relocation = 0;
2484
26
  else
2485
26
    relocation = symbol->value;
2486
2487
28
  if (symbol->section->output_section != NULL)
2488
28
    {
2489
28
      relocation += symbol->section->output_section->vma;
2490
28
      relocation += symbol->section->output_offset;
2491
28
    }
2492
2493
  /* Set val to the offset into the section or symbol.  */
2494
28
  val = reloc_entry->addend;
2495
2496
28
  _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
28
  if (! relocatable
2502
0
      || (symbol->flags & BSF_SECTION_SYM) != 0)
2503
28
    val += relocation - gp;
2504
2505
28
  if (reloc_entry->howto->partial_inplace)
2506
5
    {
2507
5
      if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd, input_section,
2508
5
              reloc_entry->address))
2509
5
  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
23
  else
2518
23
    reloc_entry->addend = val;
2519
2520
23
  if (relocatable)
2521
0
    reloc_entry->address += input_section->output_offset;
2522
2523
23
  return bfd_reloc_ok;
2524
28
}
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
4
{
2541
4
  struct _mips_elf_section_data *sdata;
2542
4
  struct mips_hi16 *n;
2543
2544
4
  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2545
1
    return bfd_reloc_outofrange;
2546
2547
3
  n = bfd_malloc (sizeof *n);
2548
3
  if (n == NULL)
2549
0
    return bfd_reloc_outofrange;
2550
2551
3
  sdata = mips_elf_section_data (input_section);
2552
3
  n->next = sdata->mips_hi16_list;
2553
3
  n->data = data;
2554
3
  n->output_bfd = output_bfd;
2555
3
  n->rel = *reloc_entry;
2556
3
  sdata->mips_hi16_list = n;
2557
2558
3
  if (output_bfd != NULL)
2559
0
    reloc_entry->address += input_section->output_offset;
2560
2561
3
  return bfd_reloc_ok;
2562
3
}
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
1
{
2573
1
  if ((symbol->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
2574
1
      || bfd_is_und_section (bfd_asymbol_section (symbol))
2575
1
      || 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
1
  return _bfd_mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
2582
1
           input_section, output_bfd, error_message);
2583
1
}
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
7
{
2619
7
  bfd_vma vallo;
2620
7
  bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
2621
7
  struct _mips_elf_section_data *sdata;
2622
2623
7
  if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd, input_section,
2624
7
          reloc_entry->address))
2625
7
    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
490
{
2695
490
  bfd_signed_vma val;
2696
490
  bfd_reloc_status_type status;
2697
490
  bool relocatable;
2698
2699
490
  relocatable = (output_bfd != NULL);
2700
2701
490
  if (!_bfd_mips_reloc_offset_in_range (abfd, input_section, reloc_entry,
2702
490
          (relocatable
2703
490
           ? check_inplace : check_std)))
2704
75
    return bfd_reloc_outofrange;
2705
2706
  /* Build up the field adjustment in VAL.  */
2707
415
  val = 0;
2708
415
  if ((!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0)
2709
415
      && symbol->section->output_section != NULL)
2710
415
    {
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
415
      val += symbol->section->output_section->vma;
2715
415
      val += symbol->section->output_offset;
2716
415
    }
2717
2718
415
  if (!relocatable)
2719
415
    {
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
415
      val += symbol->value;
2723
415
      if (reloc_entry->howto->pc_relative)
2724
17
  {
2725
17
    val -= input_section->output_section->vma;
2726
17
    val -= input_section->output_offset;
2727
17
    val -= reloc_entry->address;
2728
17
  }
2729
415
    }
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
415
  if (relocatable && !reloc_entry->howto->partial_inplace)
2736
0
    reloc_entry->addend += val;
2737
415
  else
2738
415
    {
2739
415
      bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
2740
2741
      /* Add in the separate addend, if any.  */
2742
415
      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
415
      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
415
      _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, false,
2769
415
             location);
2770
415
      status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
2771
415
               location);
2772
415
      _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, false,
2773
415
           location);
2774
2775
415
      if (status != bfd_reloc_ok)
2776
24
  return status;
2777
415
    }
2778
2779
391
  if (relocatable)
2780
0
    reloc_entry->address += input_section->output_offset;
2781
2782
391
  return bfd_reloc_ok;
2783
415
}
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
55
{
2869
55
  in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
2870
55
  in->ri_pad = H_GET_32 (abfd, ex->ri_pad);
2871
55
  in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
2872
55
  in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
2873
55
  in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
2874
55
  in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
2875
55
  in->ri_gp_value = H_GET_64 (abfd, ex->ri_gp_value);
2876
55
}
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
1.16k
{
2897
1.16k
  in->kind = H_GET_8 (abfd, ex->kind);
2898
1.16k
  in->size = H_GET_8 (abfd, ex->size);
2899
1.16k
  in->section = H_GET_16 (abfd, ex->section);
2900
1.16k
  in->info = H_GET_32 (abfd, ex->info);
2901
1.16k
}
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
/* Return non-zero if the indicated VALUE has overflowed the maximum
5238
   range expressible by a signed number with the indicated number of
5239
   BITS.  */
5240
5241
static bool
5242
mips_elf_overflow_p (bfd_vma value, int bits)
5243
0
{
5244
0
  bfd_signed_vma svalue = (bfd_signed_vma) value;
5245
5246
0
  if (svalue > (1 << (bits - 1)) - 1)
5247
    /* The value is too big.  */
5248
0
    return true;
5249
0
  else if (svalue < -(1 << (bits - 1)))
5250
    /* The value is too small.  */
5251
0
    return true;
5252
5253
  /* All is well.  */
5254
0
  return false;
5255
0
}
5256
5257
/* Calculate the %high function.  */
5258
5259
static bfd_vma
5260
mips_elf_high (bfd_vma value)
5261
0
{
5262
0
  return ((value + (bfd_vma) 0x8000) >> 16) & 0xffff;
5263
0
}
5264
5265
/* Calculate the %higher function.  */
5266
5267
static bfd_vma
5268
mips_elf_higher (bfd_vma value ATTRIBUTE_UNUSED)
5269
0
{
5270
0
#ifdef BFD64
5271
0
  return ((value + (bfd_vma) 0x80008000) >> 32) & 0xffff;
5272
#else
5273
  abort ();
5274
  return MINUS_ONE;
5275
#endif
5276
0
}
5277
5278
/* Calculate the %highest function.  */
5279
5280
static bfd_vma
5281
mips_elf_highest (bfd_vma value ATTRIBUTE_UNUSED)
5282
0
{
5283
0
#ifdef BFD64
5284
0
  return ((value + (((bfd_vma) 0x8000 << 32) | 0x80008000)) >> 48) & 0xffff;
5285
#else
5286
  abort ();
5287
  return MINUS_ONE;
5288
#endif
5289
0
}
5290

5291
/* Create the .compact_rel section.  */
5292
5293
static bool
5294
mips_elf_create_compact_rel_section
5295
  (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
5296
0
{
5297
0
  flagword flags;
5298
0
  register asection *s;
5299
5300
0
  if (bfd_get_linker_section (abfd, ".compact_rel") == NULL)
5301
0
    {
5302
0
      flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED
5303
0
         | SEC_READONLY);
5304
5305
0
      s = bfd_make_section_anyway_with_flags (abfd, ".compact_rel", flags);
5306
0
      if (s == NULL
5307
0
    || !bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd)))
5308
0
  return false;
5309
5310
0
      s->size = sizeof (Elf32_External_compact_rel);
5311
0
    }
5312
5313
0
  return true;
5314
0
}
5315
5316
/* Create the .got section to hold the global offset table.  */
5317
5318
static bool
5319
mips_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
5320
0
{
5321
0
  flagword flags;
5322
0
  register asection *s;
5323
0
  struct elf_link_hash_entry *h;
5324
0
  struct bfd_link_hash_entry *bh;
5325
0
  struct mips_elf_link_hash_table *htab;
5326
5327
0
  htab = mips_elf_hash_table (info);
5328
0
  BFD_ASSERT (htab != NULL);
5329
5330
  /* This function may be called more than once.  */
5331
0
  if (htab->root.sgot)
5332
0
    return true;
5333
5334
0
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
5335
0
     | SEC_LINKER_CREATED);
5336
5337
  /* We have to use an alignment of 2**4 here because this is hardcoded
5338
     in the function stub generation and in the linker script.  */
5339
0
  s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
5340
0
  if (s == NULL
5341
0
      || !bfd_set_section_alignment (s, 4))
5342
0
    return false;
5343
0
  htab->root.sgot = s;
5344
5345
  /* Define the symbol _GLOBAL_OFFSET_TABLE_.  We don't do this in the
5346
     linker script because we don't want to define the symbol if we
5347
     are not creating a global offset table.  */
5348
0
  bh = NULL;
5349
0
  if (! (_bfd_generic_link_add_one_symbol
5350
0
   (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
5351
0
    0, NULL, false, get_elf_backend_data (abfd)->collect, &bh)))
5352
0
    return false;
5353
5354
0
  h = (struct elf_link_hash_entry *) bh;
5355
0
  h->non_elf = 0;
5356
0
  h->def_regular = 1;
5357
0
  h->type = STT_OBJECT;
5358
0
  h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
5359
0
  elf_hash_table (info)->hgot = h;
5360
5361
0
  if (bfd_link_pic (info)
5362
0
      && ! bfd_elf_link_record_dynamic_symbol (info, h))
5363
0
    return false;
5364
5365
0
  htab->got_info = mips_elf_create_got_info (abfd);
5366
0
  mips_elf_section_data (s)->elf.this_hdr.sh_flags
5367
0
    |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
5368
5369
  /* We also need a .got.plt section when generating PLTs.  */
5370
0
  s = bfd_make_section_anyway_with_flags (abfd, ".got.plt",
5371
0
            SEC_ALLOC | SEC_LOAD
5372
0
            | SEC_HAS_CONTENTS
5373
0
            | SEC_IN_MEMORY
5374
0
            | SEC_LINKER_CREATED);
5375
0
  if (s == NULL)
5376
0
    return false;
5377
0
  htab->root.sgotplt = s;
5378
5379
0
  return true;
5380
0
}
5381

5382
/* Return true if H refers to the special VxWorks __GOTT_BASE__ or
5383
   __GOTT_INDEX__ symbols.  These symbols are only special for
5384
   shared objects; they are not used in executables.  */
5385
5386
static bool
5387
is_gott_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h)
5388
0
{
5389
0
  return (mips_elf_hash_table (info)->root.target_os == is_vxworks
5390
0
    && bfd_link_pic (info)
5391
0
    && (strcmp (h->root.root.string, "__GOTT_BASE__") == 0
5392
0
        || strcmp (h->root.root.string, "__GOTT_INDEX__") == 0));
5393
0
}
5394
5395
/* Return TRUE if a relocation of type R_TYPE from INPUT_BFD might
5396
   require an la25 stub.  See also mips_elf_local_pic_function_p,
5397
   which determines whether the destination function ever requires a
5398
   stub.  */
5399
5400
static bool
5401
mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type,
5402
             bool target_is_16_bit_code_p)
5403
0
{
5404
  /* We specifically ignore branches and jumps from EF_PIC objects,
5405
     where the onus is on the compiler or programmer to perform any
5406
     necessary initialization of $25.  Sometimes such initialization
5407
     is unnecessary; for example, -mno-shared functions do not use
5408
     the incoming value of $25, and may therefore be called directly.  */
5409
0
  if (PIC_OBJECT_P (input_bfd))
5410
0
    return false;
5411
5412
0
  switch (r_type)
5413
0
    {
5414
0
    case R_MIPS_26:
5415
0
    case R_MIPS_PC16:
5416
0
    case R_MIPS_PC21_S2:
5417
0
    case R_MIPS_PC26_S2:
5418
0
    case R_MICROMIPS_26_S1:
5419
0
    case R_MICROMIPS_PC7_S1:
5420
0
    case R_MICROMIPS_PC10_S1:
5421
0
    case R_MICROMIPS_PC16_S1:
5422
0
    case R_MICROMIPS_PC23_S2:
5423
0
      return true;
5424
5425
0
    case R_MIPS16_26:
5426
0
      return !target_is_16_bit_code_p;
5427
5428
0
    default:
5429
0
      return false;
5430
0
    }
5431
0
}
5432

5433
/* Obtain the field relocated by RELOCATION.  */
5434
5435
static bfd_vma
5436
mips_elf_obtain_contents (reloc_howto_type *howto,
5437
        const Elf_Internal_Rela *relocation,
5438
        bfd *input_bfd, bfd_byte *contents)
5439
0
{
5440
0
  bfd_vma x = 0;
5441
0
  bfd_byte *location = contents + relocation->r_offset;
5442
0
  unsigned int size = bfd_get_reloc_size (howto);
5443
5444
  /* Obtain the bytes.  */
5445
0
  if (size != 0)
5446
0
    x = bfd_get (8 * size, input_bfd, location);
5447
5448
0
  return x;
5449
0
}
5450
5451
/* Store the field relocated by RELOCATION.  */
5452
5453
static void
5454
mips_elf_store_contents (reloc_howto_type *howto,
5455
       const Elf_Internal_Rela *relocation,
5456
       bfd *input_bfd, bfd_byte *contents, bfd_vma x)
5457
0
{
5458
0
  bfd_byte *location = contents + relocation->r_offset;
5459
0
  unsigned int size = bfd_get_reloc_size (howto);
5460
5461
  /* Put the value into the output.  */
5462
0
  if (size != 0)
5463
0
    bfd_put (8 * size, input_bfd, x, location);
5464
0
}
5465
5466
/* Try to patch a load from GOT instruction in CONTENTS pointed to by
5467
   RELOCATION described by HOWTO, with a move of 0 to the load target
5468
   register, returning TRUE if that is successful and FALSE otherwise.
5469
   If DOIT is FALSE, then only determine it patching is possible and
5470
   return status without actually changing CONTENTS.
5471
*/
5472
5473
static bool
5474
mips_elf_nullify_got_load (bfd *input_bfd, bfd_byte *contents,
5475
         const Elf_Internal_Rela *relocation,
5476
         reloc_howto_type *howto, bool doit)
5477
0
{
5478
0
  int r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
5479
0
  bfd_byte *location = contents + relocation->r_offset;
5480
0
  bool nullified = true;
5481
0
  bfd_vma x;
5482
5483
0
  _bfd_mips_elf_reloc_unshuffle (input_bfd, r_type, false, location);
5484
5485
  /* Obtain the current value.  */
5486
0
  x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
5487
5488
  /* Note that in the unshuffled MIPS16 encoding RX is at bits [21:19]
5489
     while RY is at bits [18:16] of the combined 32-bit instruction word.  */
5490
0
  if (mips16_reloc_p (r_type)
5491
0
      && (((x >> 22) & 0x3ff) == 0x3d3        /* LW */
5492
0
    || ((x >> 22) & 0x3ff) == 0x3c7))      /* LD */
5493
0
    x = (0x3cdU << 22) | (x & (7 << 16)) << 3;     /* LI */
5494
0
  else if (micromips_reloc_p (r_type)
5495
0
     && ((x >> 26) & 0x37) == 0x37)     /* LW/LD */
5496
0
    x = (0xc << 26) | (x & (0x1f << 21));     /* ADDIU */
5497
0
  else if (((x >> 26) & 0x3f) == 0x23        /* LW */
5498
0
     || ((x >> 26) & 0x3f) == 0x37)     /* LD */
5499
0
    x = (0x9 << 26) | (x & (0x1f << 16));     /* ADDIU */
5500
0
  else
5501
0
    nullified = false;
5502
5503
  /* Put the value into the output.  */
5504
0
  if (doit && nullified)
5505
0
    mips_elf_store_contents (howto, relocation, input_bfd, contents, x);
5506
5507
0
  _bfd_mips_elf_reloc_shuffle (input_bfd, r_type, false, location);
5508
5509
0
  return nullified;
5510
0
}
5511
5512
/* Calculate the value produced by the RELOCATION (which comes from
5513
   the INPUT_BFD).  The ADDEND is the addend to use for this
5514
   RELOCATION; RELOCATION->R_ADDEND is ignored.
5515
5516
   The result of the relocation calculation is stored in VALUEP.
5517
   On exit, set *CROSS_MODE_JUMP_P to true if the relocation field
5518
   is a MIPS16 or microMIPS jump to standard MIPS code, or vice versa.
5519
5520
   This function returns bfd_reloc_continue if the caller need take no
5521
   further action regarding this relocation, bfd_reloc_notsupported if
5522
   something goes dramatically wrong, bfd_reloc_overflow if an
5523
   overflow occurs, and bfd_reloc_ok to indicate success.  */
5524
5525
static bfd_reloc_status_type
5526
mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
5527
             asection *input_section, bfd_byte *contents,
5528
             struct bfd_link_info *info,
5529
             const Elf_Internal_Rela *relocation,
5530
             bfd_vma addend, reloc_howto_type *howto,
5531
             Elf_Internal_Sym *local_syms,
5532
             asection **local_sections, bfd_vma *valuep,
5533
             const char **namep,
5534
             bool *cross_mode_jump_p,
5535
             bool save_addend)
5536
0
{
5537
  /* The eventual value we will return.  */
5538
0
  bfd_vma value;
5539
  /* The address of the symbol against which the relocation is
5540
     occurring.  */
5541
0
  bfd_vma symbol = 0;
5542
  /* The final GP value to be used for the relocatable, executable, or
5543
     shared object file being produced.  */
5544
0
  bfd_vma gp;
5545
  /* The place (section offset or address) of the storage unit being
5546
     relocated.  */
5547
0
  bfd_vma p;
5548
  /* The value of GP used to create the relocatable object.  */
5549
0
  bfd_vma gp0;
5550
  /* The offset into the global offset table at which the address of
5551
     the relocation entry symbol, adjusted by the addend, resides
5552
     during execution.  */
5553
0
  bfd_vma g = MINUS_ONE;
5554
  /* The section in which the symbol referenced by the relocation is
5555
     located.  */
5556
0
  asection *sec = NULL;
5557
0
  struct mips_elf_link_hash_entry *h = NULL;
5558
  /* TRUE if the symbol referred to by this relocation is a local
5559
     symbol.  */
5560
0
  bool local_p, was_local_p;
5561
  /* TRUE if the symbol referred to by this relocation is a section
5562
     symbol.  */
5563
0
  bool section_p = false;
5564
  /* TRUE if the symbol referred to by this relocation is "_gp_disp".  */
5565
0
  bool gp_disp_p = false;
5566
  /* TRUE if the symbol referred to by this relocation is
5567
     "__gnu_local_gp".  */
5568
0
  bool gnu_local_gp_p = false;
5569
0
  Elf_Internal_Shdr *symtab_hdr;
5570
0
  size_t extsymoff;
5571
0
  unsigned long r_symndx;
5572
0
  int r_type;
5573
  /* TRUE if overflow occurred during the calculation of the
5574
     relocation value.  */
5575
0
  bool overflowed_p;
5576
  /* TRUE if this relocation refers to a MIPS16 function.  */
5577
0
  bool target_is_16_bit_code_p = false;
5578
0
  bool target_is_micromips_code_p = false;
5579
0
  struct mips_elf_link_hash_table *htab;
5580
0
  bfd *dynobj;
5581
0
  bool resolved_to_zero;
5582
5583
0
  dynobj = elf_hash_table (info)->dynobj;
5584
0
  htab = mips_elf_hash_table (info);
5585
0
  BFD_ASSERT (htab != NULL);
5586
5587
  /* Parse the relocation.  */
5588
0
  r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
5589
0
  r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
5590
0
  p = (input_section->output_section->vma
5591
0
       + input_section->output_offset
5592
0
       + relocation->r_offset);
5593
5594
  /* Assume that there will be no overflow.  */
5595
0
  overflowed_p = false;
5596
5597
  /* Figure out whether or not the symbol is local, and get the offset
5598
     used in the array of hash table entries.  */
5599
0
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5600
0
  local_p = mips_elf_local_relocation_p (input_bfd, relocation,
5601
0
           local_sections);
5602
0
  was_local_p = local_p;
5603
0
  if (! elf_bad_symtab (input_bfd))
5604
0
    extsymoff = symtab_hdr->sh_info;
5605
0
  else
5606
0
    {
5607
      /* The symbol table does not follow the rule that local symbols
5608
   must come before globals.  */
5609
0
      extsymoff = 0;
5610
0
    }
5611
5612
  /* Figure out the value of the symbol.  */
5613
0
  if (local_p)
5614
0
    {
5615
0
      bool micromips_p = MICROMIPS_P (abfd);
5616
0
      Elf_Internal_Sym *sym;
5617
5618
0
      sym = local_syms + r_symndx;
5619
0
      sec = local_sections[r_symndx];
5620
5621
0
      section_p = ELF_ST_TYPE (sym->st_info) == STT_SECTION;
5622
5623
0
      symbol = sec->output_section->vma + sec->output_offset;
5624
0
      if (!section_p || (sec->flags & SEC_MERGE))
5625
0
  symbol += sym->st_value;
5626
0
      if ((sec->flags & SEC_MERGE) && section_p)
5627
0
  {
5628
0
    addend = _bfd_elf_rel_local_sym (abfd, sym, &sec, addend);
5629
0
    addend -= symbol;
5630
0
    addend += sec->output_section->vma + sec->output_offset;
5631
0
  }
5632
5633
      /* MIPS16/microMIPS text labels should be treated as odd.  */
5634
0
      if (ELF_ST_IS_COMPRESSED (sym->st_other))
5635
0
  ++symbol;
5636
5637
      /* Record the name of this symbol, for our caller.  */
5638
0
      *namep = bfd_elf_string_from_elf_section (input_bfd,
5639
0
            symtab_hdr->sh_link,
5640
0
            sym->st_name);
5641
0
      if (*namep == NULL || **namep == '\0')
5642
0
  *namep = bfd_section_name (sec);
5643
5644
      /* For relocations against a section symbol and ones against no
5645
   symbol (absolute relocations) infer the ISA mode from the addend.  */
5646
0
      if (section_p || r_symndx == STN_UNDEF)
5647
0
  {
5648
0
    target_is_16_bit_code_p = (addend & 1) && !micromips_p;
5649
0
    target_is_micromips_code_p = (addend & 1) && micromips_p;
5650
0
  }
5651
      /* For relocations against an absolute symbol infer the ISA mode
5652
   from the value of the symbol plus addend.  */
5653
0
      else if (bfd_is_abs_section (sec))
5654
0
  {
5655
0
    target_is_16_bit_code_p = ((symbol + addend) & 1) && !micromips_p;
5656
0
    target_is_micromips_code_p = ((symbol + addend) & 1) && micromips_p;
5657
0
  }
5658
      /* Otherwise just use the regular symbol annotation available.  */
5659
0
      else
5660
0
  {
5661
0
    target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (sym->st_other);
5662
0
    target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (sym->st_other);
5663
0
  }
5664
0
    }
5665
0
  else
5666
0
    {
5667
      /* ??? Could we use RELOC_FOR_GLOBAL_SYMBOL here ?  */
5668
5669
      /* For global symbols we look up the symbol in the hash-table.  */
5670
0
      h = ((struct mips_elf_link_hash_entry *)
5671
0
     elf_sym_hashes (input_bfd) [r_symndx - extsymoff]);
5672
      /* Find the real hash-table entry for this symbol.  */
5673
0
      while (h->root.root.type == bfd_link_hash_indirect
5674
0
       || h->root.root.type == bfd_link_hash_warning)
5675
0
  h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
5676
5677
      /* Record the name of this symbol, for our caller.  */
5678
0
      *namep = h->root.root.root.string;
5679
5680
      /* See if this is the special _gp_disp symbol.  Note that such a
5681
   symbol must always be a global symbol.  */
5682
0
      if (strcmp (*namep, "_gp_disp") == 0
5683
0
    && ! NEWABI_P (input_bfd))
5684
0
  {
5685
    /* Relocations against _gp_disp are permitted only with
5686
       R_MIPS_HI16 and R_MIPS_LO16 relocations.  */
5687
0
    if (!hi16_reloc_p (r_type) && !lo16_reloc_p (r_type))
5688
0
      return bfd_reloc_notsupported;
5689
5690
0
    gp_disp_p = true;
5691
0
  }
5692
      /* See if this is the special _gp symbol.  Note that such a
5693
   symbol must always be a global symbol.  */
5694
0
      else if (strcmp (*namep, "__gnu_local_gp") == 0)
5695
0
  gnu_local_gp_p = true;
5696
5697
5698
      /* If this symbol is defined, calculate its address.  Note that
5699
   _gp_disp is a magic symbol, always implicitly defined by the
5700
   linker, so it's inappropriate to check to see whether or not
5701
   its defined.  */
5702
0
      else if ((h->root.root.type == bfd_link_hash_defined
5703
0
    || h->root.root.type == bfd_link_hash_defweak)
5704
0
         && h->root.root.u.def.section)
5705
0
  {
5706
0
    sec = h->root.root.u.def.section;
5707
0
    if (sec->output_section)
5708
0
      symbol = (h->root.root.u.def.value
5709
0
          + sec->output_section->vma
5710
0
          + sec->output_offset);
5711
0
    else
5712
0
      symbol = h->root.root.u.def.value;
5713
0
  }
5714
0
      else if (h->root.root.type == bfd_link_hash_undefweak)
5715
  /* We allow relocations against undefined weak symbols, giving
5716
     it the value zero, so that you can undefined weak functions
5717
     and check to see if they exist by looking at their
5718
     addresses.  */
5719
0
  symbol = 0;
5720
0
      else if (info->unresolved_syms_in_objects == RM_IGNORE
5721
0
         && ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
5722
0
  symbol = 0;
5723
0
      else if (strcmp (*namep, SGI_COMPAT (input_bfd)
5724
0
           ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING") == 0)
5725
0
  {
5726
    /* If this is a dynamic link, we should have created a
5727
       _DYNAMIC_LINK symbol or _DYNAMIC_LINKING(for normal mips) symbol
5728
       in _bfd_mips_elf_create_dynamic_sections.
5729
       Otherwise, we should define the symbol with a value of 0.
5730
       FIXME: It should probably get into the symbol table
5731
       somehow as well.  */
5732
0
    BFD_ASSERT (! bfd_link_pic (info));
5733
0
    BFD_ASSERT (bfd_get_section_by_name (abfd, ".dynamic") == NULL);
5734
0
    symbol = 0;
5735
0
  }
5736
0
      else if (ELF_MIPS_IS_OPTIONAL (h->root.other))
5737
0
  {
5738
    /* This is an optional symbol - an Irix specific extension to the
5739
       ELF spec.  Ignore it for now.
5740
       XXX - FIXME - there is more to the spec for OPTIONAL symbols
5741
       than simply ignoring them, but we do not handle this for now.
5742
       For information see the "64-bit ELF Object File Specification"
5743
       which is available from here:
5744
       http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf  */
5745
0
    symbol = 0;
5746
0
  }
5747
0
      else
5748
0
  {
5749
0
          bool reject_undefined
5750
0
      = ((info->unresolved_syms_in_objects == RM_DIAGNOSE
5751
0
    && !info->warn_unresolved_syms)
5752
0
         || ELF_ST_VISIBILITY (h->root.other) != STV_DEFAULT);
5753
5754
0
    info->callbacks->undefined_symbol
5755
0
      (info, h->root.root.root.string, input_bfd,
5756
0
       input_section, relocation->r_offset, reject_undefined);
5757
5758
0
    if (reject_undefined)
5759
0
      return bfd_reloc_undefined;
5760
5761
0
    symbol = 0;
5762
0
  }
5763
5764
0
      target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (h->root.other);
5765
0
      target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (h->root.other);
5766
0
    }
5767
5768
  /* If this is a reference to a 16-bit function with a stub, we need
5769
     to redirect the relocation to the stub unless:
5770
5771
     (a) the relocation is for a MIPS16 JAL;
5772
5773
     (b) the relocation is for a MIPS16 PIC call, and there are no
5774
   non-MIPS16 uses of the GOT slot; or
5775
5776
     (c) the section allows direct references to MIPS16 functions.  */
5777
0
  if (r_type != R_MIPS16_26
5778
0
      && !bfd_link_relocatable (info)
5779
0
      && ((h != NULL
5780
0
     && h->fn_stub != NULL
5781
0
     && (r_type != R_MIPS16_CALL16 || h->need_fn_stub))
5782
0
    || (local_p
5783
0
        && mips_elf_tdata (input_bfd)->local_stubs != NULL
5784
0
        && mips_elf_tdata (input_bfd)->local_stubs[r_symndx] != NULL))
5785
0
      && !section_allows_mips16_refs_p (input_section))
5786
0
    {
5787
      /* This is a 32- or 64-bit call to a 16-bit function.  We should
5788
   have already noticed that we were going to need the
5789
   stub.  */
5790
0
      if (local_p)
5791
0
  {
5792
0
    sec = mips_elf_tdata (input_bfd)->local_stubs[r_symndx];
5793
0
    value = 0;
5794
0
  }
5795
0
      else
5796
0
  {
5797
0
    BFD_ASSERT (h->need_fn_stub);
5798
0
    if (h->la25_stub)
5799
0
      {
5800
        /* If a LA25 header for the stub itself exists, point to the
5801
     prepended LUI/ADDIU sequence.  */
5802
0
        sec = h->la25_stub->stub_section;
5803
0
        value = h->la25_stub->offset;
5804
0
      }
5805
0
    else
5806
0
      {
5807
0
        sec = h->fn_stub;
5808
0
        value = 0;
5809
0
      }
5810
0
  }
5811
5812
0
      symbol = sec->output_section->vma + sec->output_offset + value;
5813
      /* The target is 16-bit, but the stub isn't.  */
5814
0
      target_is_16_bit_code_p = false;
5815
0
    }
5816
  /* If this is a MIPS16 call with a stub, that is made through the PLT or
5817
     to a standard MIPS function, we need to redirect the call to the stub.
5818
     Note that we specifically exclude R_MIPS16_CALL16 from this behavior;
5819
     indirect calls should use an indirect stub instead.  */
5820
0
  else if (r_type == R_MIPS16_26 && !bfd_link_relocatable (info)
5821
0
     && ((h != NULL && (h->call_stub != NULL || h->call_fp_stub != NULL))
5822
0
         || (local_p
5823
0
       && mips_elf_tdata (input_bfd)->local_call_stubs != NULL
5824
0
       && mips_elf_tdata (input_bfd)->local_call_stubs[r_symndx] != NULL))
5825
0
     && ((h != NULL && h->use_plt_entry) || !target_is_16_bit_code_p))
5826
0
    {
5827
0
      if (local_p)
5828
0
  sec = mips_elf_tdata (input_bfd)->local_call_stubs[r_symndx];
5829
0
      else
5830
0
  {
5831
    /* If both call_stub and call_fp_stub are defined, we can figure
5832
       out which one to use by checking which one appears in the input
5833
       file.  */
5834
0
    if (h->call_stub != NULL && h->call_fp_stub != NULL)
5835
0
      {
5836
0
        asection *o;
5837
5838
0
        sec = NULL;
5839
0
        for (o = input_bfd->sections; o != NULL; o = o->next)
5840
0
    {
5841
0
      if (CALL_FP_STUB_P (bfd_section_name (o)))
5842
0
        {
5843
0
          sec = h->call_fp_stub;
5844
0
          break;
5845
0
        }
5846
0
    }
5847
0
        if (sec == NULL)
5848
0
    sec = h->call_stub;
5849
0
      }
5850
0
    else if (h->call_stub != NULL)
5851
0
      sec = h->call_stub;
5852
0
    else
5853
0
      sec = h->call_fp_stub;
5854
0
  }
5855
5856
0
      BFD_ASSERT (sec->size > 0);
5857
0
      symbol = sec->output_section->vma + sec->output_offset;
5858
0
    }
5859
  /* If this is a direct call to a PIC function, redirect to the
5860
     non-PIC stub.  */
5861
0
  else if (h != NULL && h->la25_stub
5862
0
     && mips_elf_relocation_needs_la25_stub (input_bfd, r_type,
5863
0
               target_is_16_bit_code_p))
5864
0
    {
5865
0
  symbol = (h->la25_stub->stub_section->output_section->vma
5866
0
      + h->la25_stub->stub_section->output_offset
5867
0
      + h->la25_stub->offset);
5868
0
  if (ELF_ST_IS_MICROMIPS (h->root.other))
5869
0
    symbol |= 1;
5870
0
    }
5871
  /* For direct MIPS16 and microMIPS calls make sure the compressed PLT
5872
     entry is used if a standard PLT entry has also been made.  In this
5873
     case the symbol will have been set by mips_elf_set_plt_sym_value
5874
     to point to the standard PLT entry, so redirect to the compressed
5875
     one.  */
5876
0
  else if ((mips16_branch_reloc_p (r_type)
5877
0
      || micromips_branch_reloc_p (r_type))
5878
0
     && !bfd_link_relocatable (info)
5879
0
     && h != NULL
5880
0
     && h->use_plt_entry
5881
0
     && h->root.plt.plist->comp_offset != MINUS_ONE
5882
0
     && h->root.plt.plist->mips_offset != MINUS_ONE)
5883
0
    {
5884
0
      bool micromips_p = MICROMIPS_P (abfd);
5885
5886
0
      sec = htab->root.splt;
5887
0
      symbol = (sec->output_section->vma
5888
0
    + sec->output_offset
5889
0
    + htab->plt_header_size
5890
0
    + htab->plt_mips_offset
5891
0
    + h->root.plt.plist->comp_offset
5892
0
    + 1);
5893
5894
0
      target_is_16_bit_code_p = !micromips_p;
5895
0
      target_is_micromips_code_p = micromips_p;
5896
0
    }
5897
5898
  /* Make sure MIPS16 and microMIPS are not used together.  */
5899
0
  if ((mips16_branch_reloc_p (r_type) && target_is_micromips_code_p)
5900
0
      || (micromips_branch_reloc_p (r_type) && target_is_16_bit_code_p))
5901
0
   {
5902
0
      _bfd_error_handler
5903
0
  (_("MIPS16 and microMIPS functions cannot call each other"));
5904
0
      return bfd_reloc_notsupported;
5905
0
   }
5906
5907
  /* Calls from 16-bit code to 32-bit code and vice versa require the
5908
     mode change.  However, we can ignore calls to undefined weak symbols,
5909
     which should never be executed at runtime.  This exception is important
5910
     because the assembly writer may have "known" that any definition of the
5911
     symbol would be 16-bit code, and that direct jumps were therefore
5912
     acceptable.  */
5913
0
  *cross_mode_jump_p = (!bfd_link_relocatable (info)
5914
0
      && !(h && h->root.root.type == bfd_link_hash_undefweak)
5915
0
      && ((mips16_branch_reloc_p (r_type)
5916
0
           && !target_is_16_bit_code_p)
5917
0
          || (micromips_branch_reloc_p (r_type)
5918
0
        && !target_is_micromips_code_p)
5919
0
          || ((branch_reloc_p (r_type)
5920
0
         || r_type == R_MIPS_JALR)
5921
0
        && (target_is_16_bit_code_p
5922
0
            || target_is_micromips_code_p))));
5923
5924
0
  resolved_to_zero = (h != NULL
5925
0
          && UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->root));
5926
5927
0
  switch (r_type)
5928
0
    {
5929
0
    case R_MIPS16_CALL16:
5930
0
    case R_MIPS16_GOT16:
5931
0
    case R_MIPS_CALL16:
5932
0
    case R_MIPS_GOT16:
5933
0
    case R_MIPS_GOT_PAGE:
5934
0
    case R_MIPS_GOT_DISP:
5935
0
    case R_MIPS_GOT_LO16:
5936
0
    case R_MIPS_CALL_LO16:
5937
0
    case R_MICROMIPS_CALL16:
5938
0
    case R_MICROMIPS_GOT16:
5939
0
    case R_MICROMIPS_GOT_PAGE:
5940
0
    case R_MICROMIPS_GOT_DISP:
5941
0
    case R_MICROMIPS_GOT_LO16:
5942
0
    case R_MICROMIPS_CALL_LO16:
5943
0
      if (resolved_to_zero
5944
0
    && !bfd_link_relocatable (info)
5945
0
    && bfd_reloc_offset_in_range (howto, input_bfd, input_section,
5946
0
          relocation->r_offset)
5947
0
    && mips_elf_nullify_got_load (input_bfd, contents,
5948
0
          relocation, howto, true))
5949
0
  return bfd_reloc_continue;
5950
5951
      /* Fall through.  */
5952
0
    case R_MIPS_GOT_HI16:
5953
0
    case R_MIPS_CALL_HI16:
5954
0
    case R_MICROMIPS_GOT_HI16:
5955
0
    case R_MICROMIPS_CALL_HI16:
5956
0
      if (resolved_to_zero
5957
0
    && htab->use_absolute_zero
5958
0
    && bfd_link_pic (info))
5959
0
  {
5960
    /* Redirect to the special `__gnu_absolute_zero' symbol.  */
5961
0
    h = mips_elf_link_hash_lookup (htab, "__gnu_absolute_zero",
5962
0
           false, false, false);
5963
0
    BFD_ASSERT (h != NULL);
5964
0
  }
5965
0
      break;
5966
0
    }
5967
5968
0
  local_p = (h == NULL || mips_use_local_got_p (info, h));
5969
5970
0
  gp0 = _bfd_get_gp_value (input_bfd);
5971
0
  gp = _bfd_get_gp_value (abfd);
5972
0
  if (htab->got_info)
5973
0
    gp += mips_elf_adjust_gp (abfd, htab->got_info, input_bfd);
5974
5975
0
  if (gnu_local_gp_p)
5976
0
    symbol = gp;
5977
5978
  /* Global R_MIPS_GOT_PAGE/R_MICROMIPS_GOT_PAGE relocations are equivalent
5979
     to R_MIPS_GOT_DISP/R_MICROMIPS_GOT_DISP.  The addend is applied by the
5980
     corresponding R_MIPS_GOT_OFST/R_MICROMIPS_GOT_OFST.  */
5981
0
  if (got_page_reloc_p (r_type) && !local_p)
5982
0
    {
5983
0
      r_type = (micromips_reloc_p (r_type)
5984
0
    ? R_MICROMIPS_GOT_DISP : R_MIPS_GOT_DISP);
5985
0
      addend = 0;
5986
0
    }
5987
5988
  /* If we haven't already determined the GOT offset, and we're going
5989
     to need it, get it now.  */
5990
0
  switch (r_type)
5991
0
    {
5992
0
    case R_MIPS16_CALL16:
5993
0
    case R_MIPS16_GOT16:
5994
0
    case R_MIPS_CALL16:
5995
0
    case R_MIPS_GOT16:
5996
0
    case R_MIPS_GOT_DISP:
5997
0
    case R_MIPS_GOT_HI16:
5998
0
    case R_MIPS_CALL_HI16:
5999
0
    case R_MIPS_GOT_LO16:
6000
0
    case R_MIPS_CALL_LO16:
6001
0
    case R_MICROMIPS_CALL16:
6002
0
    case R_MICROMIPS_GOT16:
6003
0
    case R_MICROMIPS_GOT_DISP:
6004
0
    case R_MICROMIPS_GOT_HI16:
6005
0
    case R_MICROMIPS_CALL_HI16:
6006
0
    case R_MICROMIPS_GOT_LO16:
6007
0
    case R_MICROMIPS_CALL_LO16:
6008
0
    case R_MIPS_TLS_GD:
6009
0
    case R_MIPS_TLS_GOTTPREL:
6010
0
    case R_MIPS_TLS_LDM:
6011
0
    case R_MIPS16_TLS_GD:
6012
0
    case R_MIPS16_TLS_GOTTPREL:
6013
0
    case R_MIPS16_TLS_LDM:
6014
0
    case R_MICROMIPS_TLS_GD:
6015
0
    case R_MICROMIPS_TLS_GOTTPREL:
6016
0
    case R_MICROMIPS_TLS_LDM:
6017
      /* Find the index into the GOT where this value is located.  */
6018
0
      if (tls_ldm_reloc_p (r_type))
6019
0
  {
6020
0
    g = mips_elf_local_got_index (abfd, input_bfd, info,
6021
0
          0, 0, NULL, r_type);
6022
0
    if (g == MINUS_ONE)
6023
0
      return bfd_reloc_outofrange;
6024
0
  }
6025
0
      else if (!local_p)
6026
0
  {
6027
    /* On VxWorks, CALL relocations should refer to the .got.plt
6028
       entry, which is initialized to point at the PLT stub.  */
6029
0
    if (htab->root.target_os == is_vxworks
6030
0
        && (call_hi16_reloc_p (r_type)
6031
0
      || call_lo16_reloc_p (r_type)
6032
0
      || call16_reloc_p (r_type)))
6033
0
      {
6034
0
        BFD_ASSERT (addend == 0);
6035
0
        BFD_ASSERT (h->root.needs_plt);
6036
0
        g = mips_elf_gotplt_index (info, &h->root);
6037
0
      }
6038
0
    else
6039
0
      {
6040
0
        BFD_ASSERT (addend == 0);
6041
0
        g = mips_elf_global_got_index (abfd, info, input_bfd,
6042
0
               &h->root, r_type);
6043
0
        if (!TLS_RELOC_P (r_type)
6044
0
      && !elf_hash_table (info)->dynamic_sections_created)
6045
    /* This is a static link.  We must initialize the GOT entry.  */
6046
0
    MIPS_ELF_PUT_WORD (dynobj, symbol, htab->root.sgot->contents + g);
6047
0
      }
6048
0
  }
6049
0
      else if (htab->root.target_os != is_vxworks
6050
0
         && (call16_reloc_p (r_type) || got16_reloc_p (r_type)))
6051
  /* The calculation below does not involve "g".  */
6052
0
  break;
6053
0
      else
6054
0
  {
6055
0
    g = mips_elf_local_got_index (abfd, input_bfd, info,
6056
0
          symbol + addend, r_symndx, h, r_type);
6057
0
    if (g == MINUS_ONE)
6058
0
      return bfd_reloc_outofrange;
6059
0
  }
6060
6061
      /* Convert GOT indices to actual offsets.  */
6062
0
      g = mips_elf_got_offset_from_index (info, abfd, input_bfd, g);
6063
0
      break;
6064
0
    }
6065
6066
  /* Relocations against the VxWorks __GOTT_BASE__ and __GOTT_INDEX__
6067
     symbols are resolved by the loader.  Add them to .rela.dyn.  */
6068
0
  if (h != NULL && is_gott_symbol (info, &h->root))
6069
0
    {
6070
0
      Elf_Internal_Rela outrel;
6071
0
      bfd_byte *loc;
6072
0
      asection *s;
6073
6074
0
      s = mips_elf_rel_dyn_section (info, false);
6075
0
      loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
6076
6077
0
      outrel.r_offset = (input_section->output_section->vma
6078
0
       + input_section->output_offset
6079
0
       + relocation->r_offset);
6080
0
      outrel.r_info = ELF32_R_INFO (h->root.dynindx, r_type);
6081
0
      outrel.r_addend = addend;
6082
0
      bfd_elf32_swap_reloca_out (abfd, &outrel, loc);
6083
6084
      /* If we've written this relocation for a readonly section,
6085
   we need to set DF_TEXTREL again, so that we do not delete the
6086
   DT_TEXTREL tag.  */
6087
0
      if (MIPS_ELF_READONLY_SECTION (input_section))
6088
0
  info->flags |= DF_TEXTREL;
6089
6090
0
      *valuep = 0;
6091
0
      return bfd_reloc_ok;
6092
0
    }
6093
6094
  /* Figure out what kind of relocation is being performed.  */
6095
0
  switch (r_type)
6096
0
    {
6097
0
    case R_MIPS_NONE:
6098
0
      return bfd_reloc_continue;
6099
6100
0
    case R_MIPS_16:
6101
0
      if (howto->partial_inplace)
6102
0
  addend = _bfd_mips_elf_sign_extend (addend, 16);
6103
0
      value = symbol + addend;
6104
0
      overflowed_p = mips_elf_overflow_p (value, 16);
6105
0
      break;
6106
6107
0
    case R_MIPS_32:
6108
0
    case R_MIPS_REL32:
6109
0
    case R_MIPS_64:
6110
0
      if ((bfd_link_pic (info)
6111
0
     || (htab->root.dynamic_sections_created
6112
0
         && h != NULL
6113
0
         && h->root.def_dynamic
6114
0
         && !h->root.def_regular
6115
0
         && !h->has_static_relocs))
6116
0
    && r_symndx != STN_UNDEF
6117
0
    && (h == NULL
6118
0
        || h->root.root.type != bfd_link_hash_undefweak
6119
0
        || (ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT
6120
0
      && !resolved_to_zero))
6121
0
    && (input_section->flags & SEC_ALLOC) != 0)
6122
0
  {
6123
    /* If we're creating a shared library, then we can't know
6124
       where the symbol will end up.  So, we create a relocation
6125
       record in the output, and leave the job up to the dynamic
6126
       linker.  We must do the same for executable references to
6127
       shared library symbols, unless we've decided to use copy
6128
       relocs or PLTs instead.  */
6129
0
    value = addend;
6130
0
    if (!mips_elf_create_dynamic_relocation (abfd,
6131
0
               info,
6132
0
               relocation,
6133
0
               h,
6134
0
               sec,
6135
0
               symbol,
6136
0
               &value,
6137
0
               input_section))
6138
0
      return bfd_reloc_undefined;
6139
0
  }
6140
0
      else
6141
0
  {
6142
0
    if (r_type != R_MIPS_REL32)
6143
0
      value = symbol + addend;
6144
0
    else
6145
0
      value = addend;
6146
0
  }
6147
0
      value &= howto->dst_mask;
6148
0
      break;
6149
6150
0
    case R_MIPS_PC32:
6151
0
      value = symbol + addend - p;
6152
0
      value &= howto->dst_mask;
6153
0
      break;
6154
6155
0
    case R_MIPS16_26:
6156
      /* The calculation for R_MIPS16_26 is just the same as for an
6157
   R_MIPS_26.  It's only the storage of the relocated field into
6158
   the output file that's different.  That's handled in
6159
   mips_elf_perform_relocation.  So, we just fall through to the
6160
   R_MIPS_26 case here.  */
6161
0
    case R_MIPS_26:
6162
0
    case R_MICROMIPS_26_S1:
6163
0
      {
6164
0
  unsigned int shift;
6165
6166
  /* Shift is 2, unusually, for microMIPS JALX.  */
6167
0
  shift = (!*cross_mode_jump_p && r_type == R_MICROMIPS_26_S1) ? 1 : 2;
6168
6169
0
  if (howto->partial_inplace && !section_p)
6170
0
    value = _bfd_mips_elf_sign_extend (addend, 26 + shift);
6171
0
  else
6172
0
    value = addend;
6173
0
  value += symbol;
6174
6175
  /* Make sure the target of a jump is suitably aligned.  Bit 0 must
6176
     be the correct ISA mode selector except for weak undefined
6177
     symbols.  */
6178
0
  if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6179
0
      && (*cross_mode_jump_p
6180
0
    ? (value & 3) != (r_type == R_MIPS_26)
6181
0
    : (value & ((1 << shift) - 1)) != (r_type != R_MIPS_26)))
6182
0
    return bfd_reloc_outofrange;
6183
6184
0
  value >>= shift;
6185
0
  if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6186
0
    overflowed_p = (value >> 26) != ((p + 4) >> (26 + shift));
6187
0
  value &= howto->dst_mask;
6188
0
      }
6189
0
      break;
6190
6191
0
    case R_MIPS_TLS_DTPREL_HI16:
6192
0
    case R_MIPS16_TLS_DTPREL_HI16:
6193
0
    case R_MICROMIPS_TLS_DTPREL_HI16:
6194
0
      value = (mips_elf_high (addend + symbol - dtprel_base (info))
6195
0
         & howto->dst_mask);
6196
0
      break;
6197
6198
0
    case R_MIPS_TLS_DTPREL_LO16:
6199
0
    case R_MIPS_TLS_DTPREL32:
6200
0
    case R_MIPS_TLS_DTPREL64:
6201
0
    case R_MIPS16_TLS_DTPREL_LO16:
6202
0
    case R_MICROMIPS_TLS_DTPREL_LO16:
6203
0
      value = (symbol + addend - dtprel_base (info)) & howto->dst_mask;
6204
0
      break;
6205
6206
0
    case R_MIPS_TLS_TPREL_HI16:
6207
0
    case R_MIPS16_TLS_TPREL_HI16:
6208
0
    case R_MICROMIPS_TLS_TPREL_HI16:
6209
0
      value = (mips_elf_high (addend + symbol - tprel_base (info))
6210
0
         & howto->dst_mask);
6211
0
      break;
6212
6213
0
    case R_MIPS_TLS_TPREL_LO16:
6214
0
    case R_MIPS_TLS_TPREL32:
6215
0
    case R_MIPS_TLS_TPREL64:
6216
0
    case R_MIPS16_TLS_TPREL_LO16:
6217
0
    case R_MICROMIPS_TLS_TPREL_LO16:
6218
0
      value = (symbol + addend - tprel_base (info)) & howto->dst_mask;
6219
0
      break;
6220
6221
0
    case R_MIPS_HI16:
6222
0
    case R_MIPS16_HI16:
6223
0
    case R_MICROMIPS_HI16:
6224
0
      if (!gp_disp_p)
6225
0
  {
6226
0
    value = mips_elf_high (addend + symbol);
6227
0
    value &= howto->dst_mask;
6228
0
  }
6229
0
      else
6230
0
  {
6231
    /* For MIPS16 ABI code we generate this sequence
6232
    0: li      $v0,%hi(_gp_disp)
6233
    4: addiupc $v1,%lo(_gp_disp)
6234
    8: sll     $v0,16
6235
         12: addu    $v0,$v1
6236
         14: move    $gp,$v0
6237
       So the offsets of hi and lo relocs are the same, but the
6238
       base $pc is that used by the ADDIUPC instruction at $t9 + 4.
6239
       ADDIUPC clears the low two bits of the instruction address,
6240
       so the base is ($t9 + 4) & ~3.  */
6241
0
    if (r_type == R_MIPS16_HI16)
6242
0
      value = mips_elf_high (addend + gp - ((p + 4) & ~(bfd_vma) 0x3));
6243
    /* The microMIPS .cpload sequence uses the same assembly
6244
       instructions as the traditional psABI version, but the
6245
       incoming $t9 has the low bit set.  */
6246
0
    else if (r_type == R_MICROMIPS_HI16)
6247
0
      value = mips_elf_high (addend + gp - p - 1);
6248
0
    else
6249
0
      value = mips_elf_high (addend + gp - p);
6250
0
  }
6251
0
      break;
6252
6253
0
    case R_MIPS_LO16:
6254
0
    case R_MIPS16_LO16:
6255
0
    case R_MICROMIPS_LO16:
6256
0
    case R_MICROMIPS_HI0_LO16:
6257
0
      if (!gp_disp_p)
6258
0
  value = (symbol + addend) & howto->dst_mask;
6259
0
      else
6260
0
  {
6261
    /* See the comment for R_MIPS16_HI16 above for the reason
6262
       for this conditional.  */
6263
0
    if (r_type == R_MIPS16_LO16)
6264
0
      value = addend + gp - (p & ~(bfd_vma) 0x3);
6265
0
    else if (r_type == R_MICROMIPS_LO16
6266
0
       || r_type == R_MICROMIPS_HI0_LO16)
6267
0
      value = addend + gp - p + 3;
6268
0
    else
6269
0
      value = addend + gp - p + 4;
6270
    /* The MIPS ABI requires checking the R_MIPS_LO16 relocation
6271
       for overflow.  But, on, say, IRIX5, relocations against
6272
       _gp_disp are normally generated from the .cpload
6273
       pseudo-op.  It generates code that normally looks like
6274
       this:
6275
6276
         lui    $gp,%hi(_gp_disp)
6277
         addiu  $gp,$gp,%lo(_gp_disp)
6278
         addu   $gp,$gp,$t9
6279
6280
       Here $t9 holds the address of the function being called,
6281
       as required by the MIPS ELF ABI.  The R_MIPS_LO16
6282
       relocation can easily overflow in this situation, but the
6283
       R_MIPS_HI16 relocation will handle the overflow.
6284
       Therefore, we consider this a bug in the MIPS ABI, and do
6285
       not check for overflow here.  */
6286
0
  }
6287
0
      break;
6288
6289
0
    case R_MIPS_LITERAL:
6290
0
    case R_MICROMIPS_LITERAL:
6291
      /* Because we don't merge literal sections, we can handle this
6292
   just like R_MIPS_GPREL16.  In the long run, we should merge
6293
   shared literals, and then we will need to additional work
6294
   here.  */
6295
6296
      /* Fall through.  */
6297
6298
0
    case R_MIPS16_GPREL:
6299
      /* The R_MIPS16_GPREL performs the same calculation as
6300
   R_MIPS_GPREL16, but stores the relocated bits in a different
6301
   order.  We don't need to do anything special here; the
6302
   differences are handled in mips_elf_perform_relocation.  */
6303
0
    case R_MIPS_GPREL16:
6304
0
    case R_MICROMIPS_GPREL7_S2:
6305
0
    case R_MICROMIPS_GPREL16:
6306
0
      {
6307
0
  int bits = howto->bitsize + howto->rightshift;
6308
  /* Only sign-extend the addend if it was extracted from the
6309
     instruction.  If the addend was separate, leave it alone,
6310
     otherwise we may lose significant bits.  */
6311
0
  if (howto->partial_inplace)
6312
0
    addend = _bfd_mips_elf_sign_extend (addend, bits);
6313
0
  value = symbol + addend - gp;
6314
  /* If the symbol was local, any earlier relocatable links will
6315
     have adjusted its addend with the gp offset, so compensate
6316
     for that now.  Don't do it for symbols forced local in this
6317
     link, though, since they won't have had the gp offset applied
6318
     to them before.  */
6319
0
  if (was_local_p)
6320
0
    value += gp0;
6321
0
  if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6322
0
    overflowed_p = mips_elf_overflow_p (value, bits);
6323
0
      }
6324
0
      break;
6325
6326
0
    case R_MIPS16_GOT16:
6327
0
    case R_MIPS16_CALL16:
6328
0
    case R_MIPS_GOT16:
6329
0
    case R_MIPS_CALL16:
6330
0
    case R_MICROMIPS_GOT16:
6331
0
    case R_MICROMIPS_CALL16:
6332
      /* VxWorks does not have separate local and global semantics for
6333
   R_MIPS*_GOT16; every relocation evaluates to "G".  */
6334
0
      if (htab->root.target_os != is_vxworks && local_p)
6335
0
  {
6336
0
    value = mips_elf_got16_entry (abfd, input_bfd, info,
6337
0
          symbol + addend, !was_local_p);
6338
0
    if (value == MINUS_ONE)
6339
0
      return bfd_reloc_outofrange;
6340
0
    value
6341
0
      = mips_elf_got_offset_from_index (info, abfd, input_bfd, value);
6342
0
    overflowed_p = mips_elf_overflow_p (value, 16);
6343
0
    break;
6344
0
  }
6345
6346
      /* Fall through.  */
6347
6348
0
    case R_MIPS_TLS_GD:
6349
0
    case R_MIPS_TLS_GOTTPREL:
6350
0
    case R_MIPS_TLS_LDM:
6351
0
    case R_MIPS_GOT_DISP:
6352
0
    case R_MIPS16_TLS_GD:
6353
0
    case R_MIPS16_TLS_GOTTPREL:
6354
0
    case R_MIPS16_TLS_LDM:
6355
0
    case R_MICROMIPS_TLS_GD:
6356
0
    case R_MICROMIPS_TLS_GOTTPREL:
6357
0
    case R_MICROMIPS_TLS_LDM:
6358
0
    case R_MICROMIPS_GOT_DISP:
6359
0
      value = g;
6360
0
      overflowed_p = mips_elf_overflow_p (value, 16);
6361
0
      break;
6362
6363
0
    case R_MIPS_GPREL32:
6364
0
      value = (addend + symbol + gp0 - gp);
6365
0
      if (!save_addend)
6366
0
  value &= howto->dst_mask;
6367
0
      break;
6368
6369
0
    case R_MIPS_PC16:
6370
0
    case R_MIPS_GNU_REL16_S2:
6371
0
      if (howto->partial_inplace)
6372
0
  addend = _bfd_mips_elf_sign_extend (addend, 18);
6373
6374
      /* No need to exclude weak undefined symbols here as they resolve
6375
   to 0 and never set `*cross_mode_jump_p', so this alignment check
6376
   will never trigger for them.  */
6377
0
      if (*cross_mode_jump_p
6378
0
    ? ((symbol + addend) & 3) != 1
6379
0
    : ((symbol + addend) & 3) != 0)
6380
0
  return bfd_reloc_outofrange;
6381
6382
0
      value = symbol + addend - p;
6383
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6384
0
  overflowed_p = mips_elf_overflow_p (value, 18);
6385
0
      value >>= howto->rightshift;
6386
0
      value &= howto->dst_mask;
6387
0
      break;
6388
6389
0
    case R_MIPS16_PC16_S1:
6390
0
      if (howto->partial_inplace)
6391
0
  addend = _bfd_mips_elf_sign_extend (addend, 17);
6392
6393
0
      if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6394
0
    && (*cross_mode_jump_p
6395
0
        ? ((symbol + addend) & 3) != 0
6396
0
        : ((symbol + addend) & 1) == 0))
6397
0
  return bfd_reloc_outofrange;
6398
6399
0
      value = symbol + addend - p;
6400
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6401
0
  overflowed_p = mips_elf_overflow_p (value, 17);
6402
0
      value >>= howto->rightshift;
6403
0
      value &= howto->dst_mask;
6404
0
      break;
6405
6406
0
    case R_MIPS_PC21_S2:
6407
0
      if (howto->partial_inplace)
6408
0
  addend = _bfd_mips_elf_sign_extend (addend, 23);
6409
6410
0
      if ((symbol + addend) & 3)
6411
0
  return bfd_reloc_outofrange;
6412
6413
0
      value = symbol + addend - p;
6414
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6415
0
  overflowed_p = mips_elf_overflow_p (value, 23);
6416
0
      value >>= howto->rightshift;
6417
0
      value &= howto->dst_mask;
6418
0
      break;
6419
6420
0
    case R_MIPS_PC26_S2:
6421
0
      if (howto->partial_inplace)
6422
0
  addend = _bfd_mips_elf_sign_extend (addend, 28);
6423
6424
0
      if ((symbol + addend) & 3)
6425
0
  return bfd_reloc_outofrange;
6426
6427
0
      value = symbol + addend - p;
6428
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6429
0
  overflowed_p = mips_elf_overflow_p (value, 28);
6430
0
      value >>= howto->rightshift;
6431
0
      value &= howto->dst_mask;
6432
0
      break;
6433
6434
0
    case R_MIPS_PC18_S3:
6435
0
      if (howto->partial_inplace)
6436
0
  addend = _bfd_mips_elf_sign_extend (addend, 21);
6437
6438
0
      if ((symbol + addend) & 7)
6439
0
  return bfd_reloc_outofrange;
6440
6441
0
      value = symbol + addend - ((p | 7) ^ 7);
6442
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6443
0
  overflowed_p = mips_elf_overflow_p (value, 21);
6444
0
      value >>= howto->rightshift;
6445
0
      value &= howto->dst_mask;
6446
0
      break;
6447
6448
0
    case R_MIPS_PC19_S2:
6449
0
      if (howto->partial_inplace)
6450
0
  addend = _bfd_mips_elf_sign_extend (addend, 21);
6451
6452
0
      if ((symbol + addend) & 3)
6453
0
  return bfd_reloc_outofrange;
6454
6455
0
      value = symbol + addend - p;
6456
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6457
0
  overflowed_p = mips_elf_overflow_p (value, 21);
6458
0
      value >>= howto->rightshift;
6459
0
      value &= howto->dst_mask;
6460
0
      break;
6461
6462
0
    case R_MIPS_PCHI16:
6463
0
      value = mips_elf_high (symbol + addend - p);
6464
0
      value &= howto->dst_mask;
6465
0
      break;
6466
6467
0
    case R_MIPS_PCLO16:
6468
0
      if (howto->partial_inplace)
6469
0
  addend = _bfd_mips_elf_sign_extend (addend, 16);
6470
0
      value = symbol + addend - p;
6471
0
      value &= howto->dst_mask;
6472
0
      break;
6473
6474
0
    case R_MICROMIPS_PC7_S1:
6475
0
      if (howto->partial_inplace)
6476
0
  addend = _bfd_mips_elf_sign_extend (addend, 8);
6477
6478
0
      if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6479
0
    && (*cross_mode_jump_p
6480
0
        ? ((symbol + addend + 2) & 3) != 0
6481
0
        : ((symbol + addend + 2) & 1) == 0))
6482
0
  return bfd_reloc_outofrange;
6483
6484
0
      value = symbol + addend - p;
6485
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6486
0
  overflowed_p = mips_elf_overflow_p (value, 8);
6487
0
      value >>= howto->rightshift;
6488
0
      value &= howto->dst_mask;
6489
0
      break;
6490
6491
0
    case R_MICROMIPS_PC10_S1:
6492
0
      if (howto->partial_inplace)
6493
0
  addend = _bfd_mips_elf_sign_extend (addend, 11);
6494
6495
0
      if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6496
0
    && (*cross_mode_jump_p
6497
0
        ? ((symbol + addend + 2) & 3) != 0
6498
0
        : ((symbol + addend + 2) & 1) == 0))
6499
0
  return bfd_reloc_outofrange;
6500
6501
0
      value = symbol + addend - p;
6502
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6503
0
  overflowed_p = mips_elf_overflow_p (value, 11);
6504
0
      value >>= howto->rightshift;
6505
0
      value &= howto->dst_mask;
6506
0
      break;
6507
6508
0
    case R_MICROMIPS_PC16_S1:
6509
0
      if (howto->partial_inplace)
6510
0
  addend = _bfd_mips_elf_sign_extend (addend, 17);
6511
6512
0
      if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6513
0
    && (*cross_mode_jump_p
6514
0
        ? ((symbol + addend) & 3) != 0
6515
0
        : ((symbol + addend) & 1) == 0))
6516
0
  return bfd_reloc_outofrange;
6517
6518
0
      value = symbol + addend - p;
6519
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6520
0
  overflowed_p = mips_elf_overflow_p (value, 17);
6521
0
      value >>= howto->rightshift;
6522
0
      value &= howto->dst_mask;
6523
0
      break;
6524
6525
0
    case R_MICROMIPS_PC23_S2:
6526
0
      if (howto->partial_inplace)
6527
0
  addend = _bfd_mips_elf_sign_extend (addend, 25);
6528
0
      value = symbol + addend - ((p | 3) ^ 3);
6529
0
      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6530
0
  overflowed_p = mips_elf_overflow_p (value, 25);
6531
0
      value >>= howto->rightshift;
6532
0
      value &= howto->dst_mask;
6533
0
      break;
6534
6535
0
    case R_MIPS_GOT_HI16:
6536
0
    case R_MIPS_CALL_HI16:
6537
0
    case R_MICROMIPS_GOT_HI16:
6538
0
    case R_MICROMIPS_CALL_HI16:
6539
      /* We're allowed to handle these two relocations identically.
6540
   The dynamic linker is allowed to handle the CALL relocations
6541
   differently by creating a lazy evaluation stub.  */
6542
0
      value = g;
6543
0
      value = mips_elf_high (value);
6544
0
      value &= howto->dst_mask;
6545
0
      break;
6546
6547
0
    case R_MIPS_GOT_LO16:
6548
0
    case R_MIPS_CALL_LO16:
6549
0
    case R_MICROMIPS_GOT_LO16:
6550
0
    case R_MICROMIPS_CALL_LO16:
6551
0
      value = g & howto->dst_mask;
6552
0
      break;
6553
6554
0
    case R_MIPS_GOT_PAGE:
6555
0
    case R_MICROMIPS_GOT_PAGE:
6556
0
      value = mips_elf_got_page (abfd, input_bfd, info, symbol + addend, NULL);
6557
0
      if (value == MINUS_ONE)
6558
0
  return bfd_reloc_outofrange;
6559
0
      value = mips_elf_got_offset_from_index (info, abfd, input_bfd, value);
6560
0
      overflowed_p = mips_elf_overflow_p (value, 16);
6561
0
      break;
6562
6563
0
    case R_MIPS_GOT_OFST:
6564
0
    case R_MICROMIPS_GOT_OFST:
6565
0
      if (local_p)
6566
0
  mips_elf_got_page (abfd, input_bfd, info, symbol + addend, &value);
6567
0
      else
6568
0
  value = addend;
6569
0
      overflowed_p = mips_elf_overflow_p (value, 16);
6570
0
      break;
6571
6572
0
    case R_MIPS_SUB:
6573
0
    case R_MICROMIPS_SUB:
6574
0
      value = symbol - addend;
6575
0
      value &= howto->dst_mask;
6576
0
      break;
6577
6578
0
    case R_MIPS_HIGHER:
6579
0
    case R_MICROMIPS_HIGHER:
6580
0
      value = mips_elf_higher (addend + symbol);
6581
0
      value &= howto->dst_mask;
6582
0
      break;
6583
6584
0
    case R_MIPS_HIGHEST:
6585
0
    case R_MICROMIPS_HIGHEST:
6586
0
      value = mips_elf_highest (addend + symbol);
6587
0
      value &= howto->dst_mask;
6588
0
      break;
6589
6590
0
    case R_MIPS_SCN_DISP:
6591
0
    case R_MICROMIPS_SCN_DISP:
6592
0
      value = symbol + addend - sec->output_offset;
6593
0
      value &= howto->dst_mask;
6594
0
      break;
6595
6596
0
    case R_MIPS_JALR:
6597
0
    case R_MICROMIPS_JALR:
6598
      /* This relocation is only a hint.  In some cases, we optimize
6599
   it into a bal instruction.  But we don't try to optimize
6600
   when the symbol does not resolve locally.  */
6601
0
      if (h != NULL && !SYMBOL_CALLS_LOCAL (info, &h->root))
6602
0
  return bfd_reloc_continue;
6603
      /* We can't optimize cross-mode jumps either.  */
6604
0
      if (*cross_mode_jump_p)
6605
0
  return bfd_reloc_continue;
6606
0
      value = symbol + addend;
6607
      /* Neither we can non-instruction-aligned targets.  */
6608
0
      if (r_type == R_MIPS_JALR ? (value & 3) != 0 : (value & 1) == 0)
6609
0
  return bfd_reloc_continue;
6610
0
      break;
6611
6612
0
    case R_MIPS_PJUMP:
6613
0
    case R_MIPS_GNU_VTINHERIT:
6614
0
    case R_MIPS_GNU_VTENTRY:
6615
      /* We don't do anything with these at present.  */
6616
0
      return bfd_reloc_continue;
6617
6618
0
    default:
6619
      /* An unrecognized relocation type.  */
6620
0
      return bfd_reloc_notsupported;
6621
0
    }
6622
6623
  /* Store the VALUE for our caller.  */
6624
0
  *valuep = value;
6625
0
  return overflowed_p ? bfd_reloc_overflow : bfd_reloc_ok;
6626
0
}
6627
6628
/* It has been determined that the result of the RELOCATION is the
6629
   VALUE.  Use HOWTO to place VALUE into the output file at the
6630
   appropriate position.  The SECTION is the section to which the
6631
   relocation applies.
6632
   CROSS_MODE_JUMP_P is true if the relocation field
6633
   is a MIPS16 or microMIPS jump to standard MIPS code, or vice versa.
6634
6635
   Returns FALSE if anything goes wrong.  */
6636
6637
static bool
6638
mips_elf_perform_relocation (struct bfd_link_info *info,
6639
           reloc_howto_type *howto,
6640
           const Elf_Internal_Rela *relocation,
6641
           bfd_vma value, bfd *input_bfd,
6642
           asection *input_section, bfd_byte *contents,
6643
           bool cross_mode_jump_p)
6644
0
{
6645
0
  bfd_vma x;
6646
0
  bfd_byte *location;
6647
0
  int r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
6648
6649
  /* Figure out where the relocation is occurring.  */
6650
0
  location = contents + relocation->r_offset;
6651
6652
0
  _bfd_mips_elf_reloc_unshuffle (input_bfd, r_type, false, location);
6653
6654
  /* Obtain the current value.  */
6655
0
  x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
6656
6657
  /* Clear the field we are setting.  */
6658
0
  x &= ~howto->dst_mask;
6659
6660
  /* Set the field.  */
6661
0
  x |= (value & howto->dst_mask);
6662
6663
  /* Detect incorrect JALX usage.  If required, turn JAL or BAL into JALX.  */
6664
0
  if (!cross_mode_jump_p && jal_reloc_p (r_type))
6665
0
    {
6666
0
      bfd_vma opcode = x >> 26;
6667
6668
0
      if (r_type == R_MIPS16_26 ? opcode == 0x7
6669
0
    : r_type == R_MICROMIPS_26_S1 ? opcode == 0x3c
6670
0
    : opcode == 0x1d)
6671
0
  {
6672
0
    info->callbacks->einfo
6673
0
      (_("%X%H: unsupported JALX to the same ISA mode\n"),
6674
0
       input_bfd, input_section, relocation->r_offset);
6675
0
    return true;
6676
0
  }
6677
0
    }
6678
0
  if (cross_mode_jump_p && jal_reloc_p (r_type))
6679
0
    {
6680
0
      bool ok;
6681
0
      bfd_vma opcode = x >> 26;
6682
0
      bfd_vma jalx_opcode;
6683
6684
      /* Check to see if the opcode is already JAL or JALX.  */
6685
0
      if (r_type == R_MIPS16_26)
6686
0
  {
6687
0
    ok = ((opcode == 0x6) || (opcode == 0x7));
6688
0
    jalx_opcode = 0x7;
6689
0
  }
6690
0
      else if (r_type == R_MICROMIPS_26_S1)
6691
0
  {
6692
0
    ok = ((opcode == 0x3d) || (opcode == 0x3c));
6693
0
    jalx_opcode = 0x3c;
6694
0
  }
6695
0
      else
6696
0
  {
6697
0
    ok = ((opcode == 0x3) || (opcode == 0x1d));
6698
0
    jalx_opcode = 0x1d;
6699
0
  }
6700
6701
      /* If the opcode is not JAL or JALX, there's a problem.  We cannot
6702
   convert J or JALS to JALX.  */
6703
0
      if (!ok)
6704
0
  {
6705
0
    info->callbacks->einfo
6706
0
      (_("%X%H: unsupported jump between ISA modes; "
6707
0
         "consider recompiling with interlinking enabled\n"),
6708
0
       input_bfd, input_section, relocation->r_offset);
6709
0
    return true;
6710
0
  }
6711
6712
      /* Make this the JALX opcode.  */
6713
0
      x = (x & ~(0x3fu << 26)) | (jalx_opcode << 26);
6714
0
    }
6715
0
  else if (cross_mode_jump_p && b_reloc_p (r_type))
6716
0
    {
6717
0
      bool ok = false;
6718
0
      bfd_vma opcode = x >> 16;
6719
0
      bfd_vma jalx_opcode = 0;
6720
0
      bfd_vma sign_bit = 0;
6721
0
      bfd_vma addr;
6722
0
      bfd_vma dest;
6723
6724
0
      if (r_type == R_MICROMIPS_PC16_S1)
6725
0
  {
6726
0
    ok = opcode == 0x4060;
6727
0
    jalx_opcode = 0x3c;
6728
0
    sign_bit = 0x10000;
6729
0
    value <<= 1;
6730
0
  }
6731
0
      else if (r_type == R_MIPS_PC16 || r_type == R_MIPS_GNU_REL16_S2)
6732
0
  {
6733
0
    ok = opcode == 0x411;
6734
0
    jalx_opcode = 0x1d;
6735
0
    sign_bit = 0x20000;
6736
0
    value <<= 2;
6737
0
  }
6738
6739
0
      if (ok && !bfd_link_pic (info))
6740
0
  {
6741
0
    addr = (input_section->output_section->vma
6742
0
      + input_section->output_offset
6743
0
      + relocation->r_offset
6744
0
      + 4);
6745
0
    dest = (addr
6746
0
      + (((value & ((sign_bit << 1) - 1)) ^ sign_bit) - sign_bit));
6747
6748
0
    if ((addr >> 28) << 28 != (dest >> 28) << 28)
6749
0
      {
6750
0
        info->callbacks->einfo
6751
0
    (_("%X%H: cannot convert branch between ISA modes "
6752
0
       "to JALX: relocation out of range\n"),
6753
0
     input_bfd, input_section, relocation->r_offset);
6754
0
        return true;
6755
0
      }
6756
6757
    /* Make this the JALX opcode.  */
6758
0
    x = ((dest >> 2) & 0x3ffffff) | jalx_opcode << 26;
6759
0
  }
6760
0
      else if (!mips_elf_hash_table (info)->ignore_branch_isa)
6761
0
  {
6762
0
    info->callbacks->einfo
6763
0
      (_("%X%H: unsupported branch between ISA modes\n"),
6764
0
       input_bfd, input_section, relocation->r_offset);
6765
0
    return true;
6766
0
  }
6767
0
    }
6768
6769
  /* Try converting JAL to BAL and J(AL)R to B(AL), if the target is in
6770
     range.  */
6771
0
  if (!bfd_link_relocatable (info)
6772
0
      && !cross_mode_jump_p
6773
0
      && ((JAL_TO_BAL_P (input_bfd)
6774
0
     && r_type == R_MIPS_26
6775
0
     && (x >> 26) == 0x3)     /* jal addr */
6776
0
    || (JALR_TO_BAL_P (input_bfd)
6777
0
        && r_type == R_MIPS_JALR
6778
0
        && x == 0x0320f809)   /* jalr t9 */
6779
0
    || (JR_TO_B_P (input_bfd)
6780
0
        && r_type == R_MIPS_JALR
6781
0
        && (x & ~1) == 0x03200008))) /* jr t9 / jalr zero, t9 */
6782
0
    {
6783
0
      bfd_vma addr;
6784
0
      bfd_vma dest;
6785
0
      bfd_signed_vma off;
6786
6787
0
      addr = (input_section->output_section->vma
6788
0
        + input_section->output_offset
6789
0
        + relocation->r_offset
6790
0
        + 4);
6791
0
      if (r_type == R_MIPS_26)
6792
0
  dest = (value << 2) | ((addr >> 28) << 28);
6793
0
      else
6794
0
  dest = value;
6795
0
      off = dest - addr;
6796
0
      if (off <= 0x1ffff && off >= -0x20000)
6797
0
  {
6798
0
    if ((x & ~1) == 0x03200008)   /* jr t9 / jalr zero, t9 */
6799
0
      x = 0x10000000 | (((bfd_vma) off >> 2) & 0xffff);   /* b addr */
6800
0
    else
6801
0
      x = 0x04110000 | (((bfd_vma) off >> 2) & 0xffff);   /* bal addr */
6802
0
  }
6803
0
    }
6804
6805
  /* Put the value into the output.  */
6806
0
  mips_elf_store_contents (howto, relocation, input_bfd, contents, x);
6807
6808
0
  _bfd_mips_elf_reloc_shuffle (input_bfd, r_type, !bfd_link_relocatable (info),
6809
0
             location);
6810
6811
0
  return true;
6812
0
}
6813

6814
/* Create a rel.dyn relocation for the dynamic linker to resolve.  REL
6815
   is the original relocation, which is now being transformed into a
6816
   dynamic relocation.  The ADDENDP is adjusted if necessary; the
6817
   caller should store the result in place of the original addend.  */
6818
6819
static bool
6820
mips_elf_create_dynamic_relocation (bfd *output_bfd,
6821
            struct bfd_link_info *info,
6822
            const Elf_Internal_Rela *rel,
6823
            struct mips_elf_link_hash_entry *h,
6824
            asection *sec, bfd_vma symbol,
6825
            bfd_vma *addendp, asection *input_section)
6826
0
{
6827
0
  Elf_Internal_Rela outrel[3];
6828
0
  asection *sreloc;
6829
0
  bfd *dynobj;
6830
0
  int r_type;
6831
0
  long indx;
6832
0
  bool defined_p;
6833
0
  struct mips_elf_link_hash_table *htab;
6834
6835
0
  htab = mips_elf_hash_table (info);
6836
0
  BFD_ASSERT (htab != NULL);
6837
6838
0
  r_type = ELF_R_TYPE (output_bfd, rel->r_info);
6839
0
  dynobj = elf_hash_table (info)->dynobj;
6840
0
  sreloc = mips_elf_rel_dyn_section (info, false);
6841
0
  BFD_ASSERT (sreloc != NULL);
6842
0
  BFD_ASSERT (sreloc->contents != NULL);
6843
0
  BFD_ASSERT (sreloc->reloc_count * MIPS_ELF_REL_SIZE (output_bfd)
6844
0
        < sreloc->size);
6845
6846
0
  outrel[0].r_offset =
6847
0
    _bfd_elf_section_offset (output_bfd, info, input_section, rel[0].r_offset);
6848
0
  if (ABI_64_P (output_bfd))
6849
0
    {
6850
0
      outrel[1].r_offset =
6851
0
  _bfd_elf_section_offset (output_bfd, info, input_section, rel[1].r_offset);
6852
0
      outrel[2].r_offset =
6853
0
  _bfd_elf_section_offset (output_bfd, info, input_section, rel[2].r_offset);
6854
0
    }
6855
6856
0
  if (outrel[0].r_offset == MINUS_ONE)
6857
    /* The relocation field has been deleted.  */
6858
0
    return true;
6859
6860
0
  if (outrel[0].r_offset == MINUS_TWO)
6861
0
    {
6862
      /* The relocation field has been converted into a relative value of
6863
   some sort.  Functions like _bfd_elf_write_section_eh_frame expect
6864
   the field to be fully relocated, so add in the symbol's value.  */
6865
0
      *addendp += symbol;
6866
0
      return true;
6867
0
    }
6868
6869
  /* We must now calculate the dynamic symbol table index to use
6870
     in the relocation.  */
6871
0
  if (h != NULL && ! SYMBOL_REFERENCES_LOCAL (info, &h->root))
6872
0
    {
6873
0
      BFD_ASSERT (htab->root.target_os == is_vxworks
6874
0
      || h->global_got_area != GGA_NONE);
6875
0
      indx = h->root.dynindx;
6876
0
      if (SGI_COMPAT (output_bfd))
6877
0
  defined_p = h->root.def_regular;
6878
0
      else
6879
  /* ??? glibc's ld.so just adds the final GOT entry to the
6880
     relocation field.  It therefore treats relocs against
6881
     defined symbols in the same way as relocs against
6882
     undefined symbols.  */
6883
0
  defined_p = false;
6884
0
    }
6885
0
  else
6886
0
    {
6887
0
      if (sec != NULL && bfd_is_abs_section (sec))
6888
0
  indx = 0;
6889
0
      else if (sec == NULL || sec->owner == NULL)
6890
0
  {
6891
0
    BFD_ASSERT (0);
6892
0
    bfd_set_error (bfd_error_bad_value);
6893
0
    return false;
6894
0
  }
6895
0
      else
6896
0
  {
6897
0
    indx = elf_section_data (sec->output_section)->dynindx;
6898
0
    if (indx == 0)
6899
0
      {
6900
0
        asection *osec = htab->root.text_index_section;
6901
0
        indx = elf_section_data (osec)->dynindx;
6902
0
      }
6903
0
    if (indx == 0)
6904
0
      abort ();
6905
0
  }
6906
6907
      /* Instead of generating a relocation using the section
6908
   symbol, we may as well make it a fully relative
6909
   relocation.  We want to avoid generating relocations to
6910
   local symbols because we used to generate them
6911
   incorrectly, without adding the original symbol value,
6912
   which is mandated by the ABI for section symbols.  In
6913
   order to give dynamic loaders and applications time to
6914
   phase out the incorrect use, we refrain from emitting
6915
   section-relative relocations.  It's not like they're
6916
   useful, after all.  This should be a bit more efficient
6917
   as well.  */
6918
      /* ??? Although this behavior is compatible with glibc's ld.so,
6919
   the ABI says that relocations against STN_UNDEF should have
6920
   a symbol value of 0.  Irix rld honors this, so relocations
6921
   against STN_UNDEF have no effect.  */
6922
0
      if (!SGI_COMPAT (output_bfd))
6923
0
  indx = 0;
6924
0
      defined_p = true;
6925
0
    }
6926
6927
  /* If the relocation was previously an absolute relocation and
6928
     this symbol will not be referred to by the relocation, we must
6929
     adjust it by the value we give it in the dynamic symbol table.
6930
     Otherwise leave the job up to the dynamic linker.  */
6931
0
  if (defined_p && r_type != R_MIPS_REL32)
6932
0
    *addendp += symbol;
6933
6934
0
  if (htab->root.target_os == is_vxworks)
6935
    /* VxWorks uses non-relative relocations for this.  */
6936
0
    outrel[0].r_info = ELF32_R_INFO (indx, R_MIPS_32);
6937
0
  else
6938
    /* The relocation is always an REL32 relocation because we don't
6939
       know where the shared library will wind up at load-time.  */
6940
0
    outrel[0].r_info = ELF_R_INFO (output_bfd, (unsigned long) indx,
6941
0
           R_MIPS_REL32);
6942
6943
  /* For strict adherence to the ABI specification, we should
6944
     generate a R_MIPS_64 relocation record by itself before the
6945
     _REL32/_64 record as well, such that the addend is read in as
6946
     a 64-bit value (REL32 is a 32-bit relocation, after all).
6947
     However, since none of the existing ELF64 MIPS dynamic
6948
     loaders seems to care, we don't waste space with these
6949
     artificial relocations.  If this turns out to not be true,
6950
     mips_elf_allocate_dynamic_relocation() should be tweaked so
6951
     as to make room for a pair of dynamic relocations per
6952
     invocation if ABI_64_P, and here we should generate an
6953
     additional relocation record with R_MIPS_64 by itself for a
6954
     NULL symbol before this relocation record.  */
6955
0
  outrel[1].r_info = ELF_R_INFO (output_bfd, 0,
6956
0
         ABI_64_P (output_bfd)
6957
0
         ? R_MIPS_64
6958
0
         : R_MIPS_NONE);
6959
0
  outrel[2].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_NONE);
6960
6961
  /* Adjust the output offset of the relocation to reference the
6962
     correct location in the output file.  */
6963
0
  outrel[0].r_offset += (input_section->output_section->vma
6964
0
       + input_section->output_offset);
6965
0
  outrel[1].r_offset += (input_section->output_section->vma
6966
0
       + input_section->output_offset);
6967
0
  outrel[2].r_offset += (input_section->output_section->vma
6968
0
       + input_section->output_offset);
6969
6970
  /* Put the relocation back out.  We have to use the special
6971
     relocation outputter in the 64-bit case since the 64-bit
6972
     relocation format is non-standard.  */
6973
0
  if (ABI_64_P (output_bfd))
6974
0
    {
6975
0
      (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
6976
0
  (output_bfd, &outrel[0],
6977
0
   (sreloc->contents
6978
0
    + sreloc->reloc_count * sizeof (Elf64_Mips_External_Rel)));
6979
0
    }
6980
0
  else if (htab->root.target_os == is_vxworks)
6981
0
    {
6982
      /* VxWorks uses RELA rather than REL dynamic relocations.  */
6983
0
      outrel[0].r_addend = *addendp;
6984
0
      bfd_elf32_swap_reloca_out
6985
0
  (output_bfd, &outrel[0],
6986
0
   (sreloc->contents
6987
0
    + sreloc->reloc_count * sizeof (Elf32_External_Rela)));
6988
0
    }
6989
0
  else
6990
0
    bfd_elf32_swap_reloc_out
6991
0
      (output_bfd, &outrel[0],
6992
0
       (sreloc->contents + sreloc->reloc_count * sizeof (Elf32_External_Rel)));
6993
6994
  /* We've now added another relocation.  */
6995
0
  ++sreloc->reloc_count;
6996
6997
  /* Make sure the output section is writable.  The dynamic linker
6998
     will be writing to it.  */
6999
0
  elf_section_data (input_section->output_section)->this_hdr.sh_flags
7000
0
    |= SHF_WRITE;
7001
7002
  /* On IRIX5, make an entry of compact relocation info.  */
7003
0
  if (IRIX_COMPAT (output_bfd) == ict_irix5)
7004
0
    {
7005
0
      asection *scpt = bfd_get_linker_section (dynobj, ".compact_rel");
7006
0
      bfd_byte *cr;
7007
7008
0
      if (scpt)
7009
0
  {
7010
0
    Elf32_crinfo cptrel;
7011
7012
0
    mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG);
7013
0
    cptrel.vaddr = (rel->r_offset
7014
0
        + input_section->output_section->vma
7015
0
        + input_section->output_offset);
7016
0
    if (r_type == R_MIPS_REL32)
7017
0
      mips_elf_set_cr_type (cptrel, CRT_MIPS_REL32);
7018
0
    else
7019
0
      mips_elf_set_cr_type (cptrel, CRT_MIPS_WORD);
7020
0
    mips_elf_set_cr_dist2to (cptrel, 0);
7021
0
    cptrel.konst = *addendp;
7022
7023
0
    cr = (scpt->contents
7024
0
    + sizeof (Elf32_External_compact_rel));
7025
0
    mips_elf_set_cr_relvaddr (cptrel, 0);
7026
0
    bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
7027
0
             ((Elf32_External_crinfo *) cr
7028
0
              + scpt->reloc_count));
7029
0
    ++scpt->reloc_count;
7030
0
  }
7031
0
    }
7032
7033
  /* If we've written this relocation for a readonly section,
7034
     we need to set DF_TEXTREL again, so that we do not delete the
7035
     DT_TEXTREL tag.  */
7036
0
  if (MIPS_ELF_READONLY_SECTION (input_section))
7037
0
    info->flags |= DF_TEXTREL;
7038
7039
0
  return true;
7040
0
}
7041

7042
/* Return the MACH for a MIPS e_flags value.  */
7043
7044
unsigned long
7045
_bfd_elf_mips_mach (flagword flags)
7046
7.24k
{
7047
7.24k
  switch (flags & EF_MIPS_MACH)
7048
7.24k
    {
7049
9
    case EF_MIPS_MACH_3900:
7050
9
      return bfd_mach_mips3900;
7051
7052
0
    case EF_MIPS_MACH_4010:
7053
0
      return bfd_mach_mips4010;
7054
7055
11
    case EF_MIPS_MACH_ALLEGREX:
7056
11
      return bfd_mach_mips_allegrex;
7057
7058
9
    case EF_MIPS_MACH_4100:
7059
9
      return bfd_mach_mips4100;
7060
7061
0
    case EF_MIPS_MACH_4111:
7062
0
      return bfd_mach_mips4111;
7063
7064
18
    case EF_MIPS_MACH_4120:
7065
18
      return bfd_mach_mips4120;
7066
7067
28
    case EF_MIPS_MACH_4650:
7068
28
      return bfd_mach_mips4650;
7069
7070
0
    case EF_MIPS_MACH_5400:
7071
0
      return bfd_mach_mips5400;
7072
7073
3
    case EF_MIPS_MACH_5500:
7074
3
      return bfd_mach_mips5500;
7075
7076
197
    case EF_MIPS_MACH_5900:
7077
197
      return bfd_mach_mips5900;
7078
7079
9
    case EF_MIPS_MACH_9000:
7080
9
      return bfd_mach_mips9000;
7081
7082
16
    case EF_MIPS_MACH_SB1:
7083
16
      return bfd_mach_mips_sb1;
7084
7085
0
    case EF_MIPS_MACH_LS2E:
7086
0
      return bfd_mach_mips_loongson_2e;
7087
7088
4
    case EF_MIPS_MACH_LS2F:
7089
4
      return bfd_mach_mips_loongson_2f;
7090
7091
8
    case EF_MIPS_MACH_GS464:
7092
8
      return bfd_mach_mips_gs464;
7093
7094
0
    case EF_MIPS_MACH_GS464E:
7095
0
      return bfd_mach_mips_gs464e;
7096
7097
38
    case EF_MIPS_MACH_GS264E:
7098
38
      return bfd_mach_mips_gs264e;
7099
7100
5
    case EF_MIPS_MACH_OCTEON3:
7101
5
      return bfd_mach_mips_octeon3;
7102
7103
3
    case EF_MIPS_MACH_OCTEON2:
7104
3
      return bfd_mach_mips_octeon2;
7105
7106
0
    case EF_MIPS_MACH_OCTEON:
7107
0
      return bfd_mach_mips_octeon;
7108
7109
0
    case EF_MIPS_MACH_XLR:
7110
0
      return bfd_mach_mips_xlr;
7111
7112
3
    case EF_MIPS_MACH_IAMR2:
7113
3
      return bfd_mach_mips_interaptiv_mr2;
7114
7115
6.88k
    default:
7116
6.88k
      switch (flags & EF_MIPS_ARCH)
7117
6.88k
  {
7118
310
  default:
7119
5.51k
  case EF_MIPS_ARCH_1:
7120
5.51k
    return bfd_mach_mips3000;
7121
7122
148
  case EF_MIPS_ARCH_2:
7123
148
    return bfd_mach_mips6000;
7124
7125
150
  case EF_MIPS_ARCH_3:
7126
150
    return bfd_mach_mips4000;
7127
7128
391
  case EF_MIPS_ARCH_4:
7129
391
    return bfd_mach_mips8000;
7130
7131
14
  case EF_MIPS_ARCH_5:
7132
14
    return bfd_mach_mips5;
7133
7134
63
  case EF_MIPS_ARCH_32:
7135
63
    return bfd_mach_mipsisa32;
7136
7137
48
  case EF_MIPS_ARCH_64:
7138
48
    return bfd_mach_mipsisa64;
7139
7140
31
  case EF_MIPS_ARCH_32R2:
7141
31
    return bfd_mach_mipsisa32r2;
7142
7143
40
  case EF_MIPS_ARCH_64R2:
7144
40
    return bfd_mach_mipsisa64r2;
7145
7146
325
  case EF_MIPS_ARCH_32R6:
7147
325
    return bfd_mach_mipsisa32r6;
7148
7149
164
  case EF_MIPS_ARCH_64R6:
7150
164
    return bfd_mach_mipsisa64r6;
7151
6.88k
  }
7152
7.24k
    }
7153
7154
0
  return 0;
7155
7.24k
}
7156
7157
/* Return printable name for ABI.  */
7158
7159
static inline char *
7160
elf_mips_abi_name (bfd *abfd)
7161
0
{
7162
0
  flagword flags;
7163
7164
0
  flags = elf_elfheader (abfd)->e_flags;
7165
0
  switch (flags & EF_MIPS_ABI)
7166
0
    {
7167
0
    case 0:
7168
0
      if (ABI_N32_P (abfd))
7169
0
  return "N32";
7170
0
      else if (ABI_64_P (abfd))
7171
0
  return "64";
7172
0
      else
7173
0
  return "none";
7174
0
    case EF_MIPS_ABI_O32:
7175
0
      return "O32";
7176
0
    case EF_MIPS_ABI_O64:
7177
0
      return "O64";
7178
0
    case EF_MIPS_ABI_EABI32:
7179
0
      return "EABI32";
7180
0
    case EF_MIPS_ABI_EABI64:
7181
0
      return "EABI64";
7182
0
    default:
7183
0
      return "unknown abi";
7184
0
    }
7185
0
}
7186

7187
/* MIPS ELF uses two common sections.  One is the usual one, and the
7188
   other is for small objects.  All the small objects are kept
7189
   together, and then referenced via the gp pointer, which yields
7190
   faster assembler code.  This is what we use for the small common
7191
   section.  This approach is copied from ecoff.c.  */
7192
static asection mips_elf_scom_section;
7193
static const asymbol mips_elf_scom_symbol =
7194
  GLOBAL_SYM_INIT (".scommon", &mips_elf_scom_section);
7195
static asection mips_elf_scom_section =
7196
  BFD_FAKE_SECTION (mips_elf_scom_section, &mips_elf_scom_symbol,
7197
        ".scommon", 0, SEC_IS_COMMON | SEC_SMALL_DATA);
7198
7199
/* MIPS ELF also uses an acommon section, which represents an
7200
   allocated common symbol which may be overridden by a
7201
   definition in a shared library.  */
7202
static asection mips_elf_acom_section;
7203
static const asymbol mips_elf_acom_symbol =
7204
  GLOBAL_SYM_INIT (".acommon", &mips_elf_acom_section);
7205
static asection mips_elf_acom_section =
7206
  BFD_FAKE_SECTION (mips_elf_acom_section, &mips_elf_acom_symbol,
7207
        ".acommon", 0, SEC_ALLOC);
7208
7209
/* This is used for both the 32-bit and the 64-bit ABI.  */
7210
7211
void
7212
_bfd_mips_elf_symbol_processing (bfd *abfd, asymbol *asym)
7213
9.84k
{
7214
9.84k
  elf_symbol_type *elfsym;
7215
7216
  /* Handle the special MIPS section numbers that a symbol may use.  */
7217
9.84k
  elfsym = (elf_symbol_type *) asym;
7218
9.84k
  switch (elfsym->internal_elf_sym.st_shndx)
7219
9.84k
    {
7220
23
    case SHN_MIPS_ACOMMON:
7221
      /* This section is used in a dynamically linked executable file.
7222
   It is an allocated common section.  The dynamic linker can
7223
   either resolve these symbols to something in a shared
7224
   library, or it can just leave them here.  For our purposes,
7225
   we can consider these symbols to be in a new section.  */
7226
23
      asym->section = &mips_elf_acom_section;
7227
23
      break;
7228
7229
14
    case SHN_COMMON:
7230
      /* Common symbols less than the GP size are automatically
7231
   treated as SHN_MIPS_SCOMMON symbols, with some exceptions.  */
7232
14
      if (asym->value > elf_gp_size (abfd)
7233
4
    || ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_TLS
7234
4
    || IRIX_COMPAT (abfd) == ict_irix6
7235
0
    || strcmp (asym->name, "__gnu_lto_slim") == 0)
7236
14
  break;
7237
      /* Fall through.  */
7238
11
    case SHN_MIPS_SCOMMON:
7239
11
      asym->section = &mips_elf_scom_section;
7240
11
      asym->value = elfsym->internal_elf_sym.st_size;
7241
11
      break;
7242
7243
3
    case SHN_MIPS_SUNDEFINED:
7244
3
      asym->section = bfd_und_section_ptr;
7245
3
      break;
7246
7247
5
    case SHN_MIPS_TEXT:
7248
5
      {
7249
5
  asection *section = bfd_get_section_by_name (abfd, ".text");
7250
7251
5
  if (section != NULL)
7252
2
    {
7253
2
      asym->section = section;
7254
      /* MIPS_TEXT is a bit special, the address is not an offset
7255
         to the base of the .text section.  So subtract the section
7256
         base address to make it an offset.  */
7257
2
      asym->value -= section->vma;
7258
2
    }
7259
5
      }
7260
5
      break;
7261
7262
25
    case SHN_MIPS_DATA:
7263
25
      {
7264
25
  asection *section = bfd_get_section_by_name (abfd, ".data");
7265
7266
25
  if (section != NULL)
7267
5
    {
7268
5
      asym->section = section;
7269
      /* MIPS_DATA is a bit special, the address is not an offset
7270
         to the base of the .data section.  So subtract the section
7271
         base address to make it an offset.  */
7272
5
      asym->value -= section->vma;
7273
5
    }
7274
25
      }
7275
25
      break;
7276
9.84k
    }
7277
7278
  /* If this is an odd-valued function symbol, assume it's a MIPS16
7279
     or microMIPS one.  */
7280
9.84k
  if (ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_FUNC
7281
499
      && (asym->value & 1) != 0)
7282
64
    {
7283
64
      asym->value--;
7284
64
      if (MICROMIPS_P (abfd))
7285
9
  elfsym->internal_elf_sym.st_other
7286
9
    = ELF_ST_SET_MICROMIPS (elfsym->internal_elf_sym.st_other);
7287
55
      else
7288
55
  elfsym->internal_elf_sym.st_other
7289
55
    = ELF_ST_SET_MIPS16 (elfsym->internal_elf_sym.st_other);
7290
64
    }
7291
9.84k
}
7292

7293
/* Implement elf_backend_eh_frame_address_size.  This differs from
7294
   the default in the way it handles EABI64.
7295
7296
   EABI64 was originally specified as an LP64 ABI, and that is what
7297
   -mabi=eabi normally gives on a 64-bit target.  However, gcc has
7298
   historically accepted the combination of -mabi=eabi and -mlong32,
7299
   and this ILP32 variation has become semi-official over time.
7300
   Both forms use elf32 and have pointer-sized FDE addresses.
7301
7302
   If an EABI object was generated by GCC 4.0 or above, it will have
7303
   an empty .gcc_compiled_longXX section, where XX is the size of longs
7304
   in bits.  Unfortunately, ILP32 objects generated by earlier compilers
7305
   have no special marking to distinguish them from LP64 objects.
7306
7307
   We don't want users of the official LP64 ABI to be punished for the
7308
   existence of the ILP32 variant, but at the same time, we don't want
7309
   to mistakenly interpret pre-4.0 ILP32 objects as being LP64 objects.
7310
   We therefore take the following approach:
7311
7312
      - If ABFD contains a .gcc_compiled_longXX section, use it to
7313
  determine the pointer size.
7314
7315
      - Otherwise check the type of the first relocation.  Assume that
7316
  the LP64 ABI is being used if the relocation is of type R_MIPS_64.
7317
7318
      - Otherwise punt.
7319
7320
   The second check is enough to detect LP64 objects generated by pre-4.0
7321
   compilers because, in the kind of output generated by those compilers,
7322
   the first relocation will be associated with either a CIE personality
7323
   routine or an FDE start address.  Furthermore, the compilers never
7324
   used a special (non-pointer) encoding for this ABI.
7325
7326
   Checking the relocation type should also be safe because there is no
7327
   reason to use R_MIPS_64 in an ILP32 object.  Pre-4.0 compilers never
7328
   did so.  */
7329
7330
unsigned int
7331
_bfd_mips_elf_eh_frame_address_size (bfd *abfd, const asection *sec)
7332
0
{
7333
0
  if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
7334
0
    return 8;
7335
0
  if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == EF_MIPS_ABI_EABI64)
7336
0
    {
7337
0
      bool long32_p, long64_p;
7338
7339
0
      long32_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long32") != 0;
7340
0
      long64_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long64") != 0;
7341
0
      if (long32_p && long64_p)
7342
0
  return 0;
7343
0
      if (long32_p)
7344
0
  return 4;
7345
0
      if (long64_p)
7346
0
  return 8;
7347
7348
0
      if (sec->reloc_count > 0)
7349
0
  {
7350
    /* Load the relocations for this section.  */
7351
0
    Elf_Internal_Rela *internal_relocs =
7352
0
      _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, true);
7353
0
    if (internal_relocs == NULL)
7354
0
      return 0;
7355
7356
0
    unsigned int size = 0;
7357
0
    if (ELF32_R_TYPE (internal_relocs[0].r_info) == R_MIPS_64)
7358
0
      size = 8;
7359
7360
0
    if (elf_section_data (sec)->relocs != internal_relocs)
7361
0
      free (internal_relocs);
7362
7363
0
    return size;
7364
0
  }
7365
7366
0
      return 0;
7367
0
    }
7368
0
  return 4;
7369
0
}
7370

7371
/* There appears to be a bug in the MIPSpro linker that causes GOT_DISP
7372
   relocations against two unnamed section symbols to resolve to the
7373
   same address.  For example, if we have code like:
7374
7375
  lw  $4,%got_disp(.data)($gp)
7376
  lw  $25,%got_disp(.text)($gp)
7377
  jalr  $25
7378
7379
   then the linker will resolve both relocations to .data and the program
7380
   will jump there rather than to .text.
7381
7382
   We can work around this problem by giving names to local section symbols.
7383
   This is also what the MIPSpro tools do.  */
7384
7385
bool
7386
_bfd_mips_elf_name_local_section_symbols (bfd *abfd)
7387
10
{
7388
10
  return elf_elfheader (abfd)->e_type == ET_REL && SGI_COMPAT (abfd);
7389
10
}
7390

7391
/* Work over a section just before writing it out.  This routine is
7392
   used by both the 32-bit and the 64-bit ABI.  FIXME: We recognize
7393
   sections that need the SHF_MIPS_GPREL flag by name; there has to be
7394
   a better way.  */
7395
7396
bool
7397
_bfd_mips_elf_section_processing (bfd *abfd, Elf_Internal_Shdr *hdr)
7398
237
{
7399
237
  if (hdr->sh_type == SHT_MIPS_REGINFO
7400
0
      && hdr->sh_size > 0)
7401
0
    {
7402
0
      bfd_byte buf[4];
7403
7404
0
      BFD_ASSERT (hdr->contents == NULL);
7405
7406
0
      if (hdr->sh_size != sizeof (Elf32_External_RegInfo))
7407
0
  {
7408
0
    _bfd_error_handler
7409
0
      (_("%pB: incorrect `.reginfo' section size; "
7410
0
         "expected %" PRIu64 ", got %" PRIu64),
7411
0
       abfd, (uint64_t) sizeof (Elf32_External_RegInfo),
7412
0
       (uint64_t) hdr->sh_size);
7413
0
    bfd_set_error (bfd_error_bad_value);
7414
0
    return false;
7415
0
  }
7416
7417
0
      if (bfd_seek (abfd,
7418
0
        hdr->sh_offset + sizeof (Elf32_External_RegInfo) - 4,
7419
0
        SEEK_SET) != 0)
7420
0
  return false;
7421
0
      H_PUT_32 (abfd, elf_gp (abfd), buf);
7422
0
      if (bfd_write (buf, 4, abfd) != 4)
7423
0
  return false;
7424
0
    }
7425
7426
237
  if (hdr->sh_type == SHT_MIPS_OPTIONS
7427
0
      && hdr->bfd_section != NULL
7428
0
      && mips_elf_section_data (hdr->bfd_section) != NULL
7429
0
      && mips_elf_section_data (hdr->bfd_section)->u.tdata != NULL)
7430
0
    {
7431
0
      bfd_byte *contents, *l, *lend;
7432
7433
      /* We stored the section contents in the tdata field in the
7434
   set_section_contents routine.  We save the section contents
7435
   so that we don't have to read them again.
7436
   At this point we know that elf_gp is set, so we can look
7437
   through the section contents to see if there is an
7438
   ODK_REGINFO structure.  */
7439
7440
0
      contents = mips_elf_section_data (hdr->bfd_section)->u.tdata;
7441
0
      l = contents;
7442
0
      lend = contents + hdr->sh_size;
7443
0
      while (l + sizeof (Elf_External_Options) <= lend)
7444
0
  {
7445
0
    Elf_Internal_Options intopt;
7446
7447
0
    bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
7448
0
          &intopt);
7449
0
    if (intopt.size < sizeof (Elf_External_Options))
7450
0
      {
7451
0
        _bfd_error_handler
7452
    /* xgettext:c-format */
7453
0
    (_("%pB: warning: bad `%s' option size %u smaller than"
7454
0
       " its header"),
7455
0
    abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd), intopt.size);
7456
0
        break;
7457
0
      }
7458
0
    if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
7459
0
      {
7460
0
        bfd_byte buf[8];
7461
7462
0
        if (bfd_seek (abfd,
7463
0
          (hdr->sh_offset
7464
0
           + (l - contents)
7465
0
           + sizeof (Elf_External_Options)
7466
0
           + (sizeof (Elf64_External_RegInfo) - 8)),
7467
0
           SEEK_SET) != 0)
7468
0
    return false;
7469
0
        H_PUT_64 (abfd, elf_gp (abfd), buf);
7470
0
        if (bfd_write (buf, 8, abfd) != 8)
7471
0
    return false;
7472
0
      }
7473
0
    else if (intopt.kind == ODK_REGINFO)
7474
0
      {
7475
0
        bfd_byte buf[4];
7476
7477
0
        if (bfd_seek (abfd,
7478
0
          (hdr->sh_offset
7479
0
           + (l - contents)
7480
0
           + sizeof (Elf_External_Options)
7481
0
           + (sizeof (Elf32_External_RegInfo) - 4)),
7482
0
          SEEK_SET) != 0)
7483
0
    return false;
7484
0
        H_PUT_32 (abfd, elf_gp (abfd), buf);
7485
0
        if (bfd_write (buf, 4, abfd) != 4)
7486
0
    return false;
7487
0
      }
7488
0
    l += intopt.size;
7489
0
  }
7490
0
    }
7491
7492
237
  if (hdr->bfd_section != NULL)
7493
169
    {
7494
169
      const char *name = bfd_section_name (hdr->bfd_section);
7495
7496
      /* .sbss is not handled specially here because the GNU/Linux
7497
   prelinker can convert .sbss from NOBITS to PROGBITS and
7498
   changing it back to NOBITS breaks the binary.  The entry in
7499
   _bfd_mips_elf_special_sections will ensure the correct flags
7500
   are set on .sbss if BFD creates it without reading it from an
7501
   input file, and without special handling here the flags set
7502
   on it in an input file will be followed.  */
7503
169
      if (strcmp (name, ".sdata") == 0
7504
169
    || strcmp (name, ".lit8") == 0
7505
169
    || strcmp (name, ".lit4") == 0)
7506
0
  hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
7507
169
      else if (strcmp (name, ".srdata") == 0)
7508
0
  hdr->sh_flags |= SHF_ALLOC | SHF_MIPS_GPREL;
7509
169
      else if (strcmp (name, ".compact_rel") == 0)
7510
0
  hdr->sh_flags = 0;
7511
169
      else if (strcmp (name, ".rtproc") == 0)
7512
0
  {
7513
0
    if (hdr->sh_addralign != 0 && hdr->sh_entsize == 0)
7514
0
      {
7515
0
        unsigned int adjust;
7516
7517
0
        adjust = hdr->sh_size % hdr->sh_addralign;
7518
0
        if (adjust != 0)
7519
0
    hdr->sh_size += hdr->sh_addralign - adjust;
7520
0
      }
7521
0
  }
7522
169
    }
7523
7524
237
  return true;
7525
237
}
7526
7527
/* Handle a MIPS specific section when reading an object file.  This
7528
   is called when elfcode.h finds a section with an unknown type.
7529
   This routine supports both the 32-bit and 64-bit ELF ABI.  */
7530
7531
bool
7532
_bfd_mips_elf_section_from_shdr (bfd *abfd,
7533
         Elf_Internal_Shdr *hdr,
7534
         const char *name,
7535
         int shindex)
7536
47.7k
{
7537
47.7k
  flagword flags = 0;
7538
7539
  /* There ought to be a place to keep ELF backend specific flags, but
7540
     at the moment there isn't one.  We just keep track of the
7541
     sections by their name, instead.  Fortunately, the ABI gives
7542
     suggested names for all the MIPS specific sections, so we will
7543
     probably get away with this.  */
7544
47.7k
  switch (hdr->sh_type)
7545
47.7k
    {
7546
60
    case SHT_MIPS_LIBLIST:
7547
60
      if (strcmp (name, ".liblist") != 0)
7548
60
  return false;
7549
0
      break;
7550
53
    case SHT_MIPS_MSYM:
7551
53
      if (strcmp (name, ".msym") != 0)
7552
53
  return false;
7553
0
      break;
7554
48
    case SHT_MIPS_CONFLICT:
7555
48
      if (strcmp (name, ".conflict") != 0)
7556
48
  return false;
7557
0
      break;
7558
53
    case SHT_MIPS_GPTAB:
7559
53
      if (! startswith (name, ".gptab."))
7560
42
  return false;
7561
11
      break;
7562
39
    case SHT_MIPS_UCODE:
7563
39
      if (strcmp (name, ".ucode") != 0)
7564
39
  return false;
7565
0
      break;
7566
56
    case SHT_MIPS_DEBUG:
7567
56
      if (strcmp (name, ".mdebug") != 0)
7568
41
  return false;
7569
15
      flags = SEC_DEBUGGING;
7570
15
      break;
7571
26
    case SHT_MIPS_REGINFO:
7572
26
      if (strcmp (name, ".reginfo") != 0
7573
0
    || hdr->sh_size != sizeof (Elf32_External_RegInfo))
7574
26
  return false;
7575
0
      flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
7576
0
      break;
7577
24
    case SHT_MIPS_IFACE:
7578
24
      if (strcmp (name, ".MIPS.interfaces") != 0)
7579
24
  return false;
7580
0
      break;
7581
54
    case SHT_MIPS_CONTENT:
7582
54
      if (! startswith (name, ".MIPS.content"))
7583
43
  return false;
7584
11
      break;
7585
306
    case SHT_MIPS_OPTIONS:
7586
306
      if (!MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
7587
115
  return false;
7588
191
      break;
7589
191
    case SHT_MIPS_ABIFLAGS:
7590
50
      if (!MIPS_ELF_ABIFLAGS_SECTION_NAME_P (name))
7591
50
  return false;
7592
0
      flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
7593
0
      break;
7594
220
    case SHT_MIPS_DWARF:
7595
220
      if (! startswith (name, ".debug_")
7596
197
         && ! startswith (name, ".gnu.debuglto_.debug_")
7597
183
         && ! startswith (name, ".zdebug_")
7598
173
         && ! startswith (name, ".gnu.debuglto_.zdebug_"))
7599
153
  return false;
7600
67
      break;
7601
67
    case SHT_MIPS_SYMBOL_LIB:
7602
24
      if (strcmp (name, ".MIPS.symlib") != 0)
7603
24
  return false;
7604
0
      break;
7605
64
    case SHT_MIPS_EVENTS:
7606
64
      if (! startswith (name, ".MIPS.events")
7607
54
    && ! startswith (name, ".MIPS.post_rel"))
7608
44
  return false;
7609
20
      break;
7610
27
    case SHT_MIPS_XHASH:
7611
27
      if (strcmp (name, ".MIPS.xhash") != 0)
7612
27
  return false;
7613
46.6k
    default:
7614
46.6k
      break;
7615
47.7k
    }
7616
7617
46.9k
  if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
7618
71
    return false;
7619
7620
46.8k
  if (hdr->sh_flags & SHF_MIPS_GPREL)
7621
9.01k
    flags |= SEC_SMALL_DATA;
7622
7623
46.8k
  if (flags)
7624
9.02k
    {
7625
9.02k
      if (!bfd_set_section_flags (hdr->bfd_section,
7626
9.02k
          (bfd_section_flags (hdr->bfd_section)
7627
9.02k
           | flags)))
7628
0
  return false;
7629
9.02k
    }
7630
7631
46.8k
  if (hdr->sh_type == SHT_MIPS_ABIFLAGS)
7632
0
    {
7633
0
      Elf_External_ABIFlags_v0 ext;
7634
7635
0
      if (! bfd_get_section_contents (abfd, hdr->bfd_section,
7636
0
              &ext, 0, sizeof ext))
7637
0
  return false;
7638
0
      bfd_mips_elf_swap_abiflags_v0_in (abfd, &ext,
7639
0
          &mips_elf_tdata (abfd)->abiflags);
7640
0
      if (mips_elf_tdata (abfd)->abiflags.version != 0)
7641
0
  return false;
7642
0
      mips_elf_tdata (abfd)->abiflags_valid = true;
7643
0
    }
7644
7645
  /* FIXME: We should record sh_info for a .gptab section.  */
7646
7647
  /* For a .reginfo section, set the gp value in the tdata information
7648
     from the contents of this section.  We need the gp value while
7649
     processing relocs, so we just get it now.  The .reginfo section
7650
     is not used in the 64-bit MIPS ELF ABI.  */
7651
46.8k
  if (hdr->sh_type == SHT_MIPS_REGINFO)
7652
0
    {
7653
0
      Elf32_External_RegInfo ext;
7654
0
      Elf32_RegInfo s;
7655
7656
0
      if (! bfd_get_section_contents (abfd, hdr->bfd_section,
7657
0
              &ext, 0, sizeof ext))
7658
0
  return false;
7659
0
      bfd_mips_elf32_swap_reginfo_in (abfd, &ext, &s);
7660
0
      elf_gp (abfd) = s.ri_gp_value;
7661
0
    }
7662
7663
  /* For a SHT_MIPS_OPTIONS section, look for a ODK_REGINFO entry, and
7664
     set the gp value based on what we find.  We may see both
7665
     SHT_MIPS_REGINFO and SHT_MIPS_OPTIONS/ODK_REGINFO; in that case,
7666
     they should agree.  */
7667
46.8k
  if (hdr->sh_type == SHT_MIPS_OPTIONS)
7668
191
    {
7669
191
      bfd_byte *contents, *l, *lend;
7670
7671
191
      if (!bfd_malloc_and_get_section (abfd, hdr->bfd_section, &contents))
7672
22
  {
7673
22
    free (contents);
7674
22
    return false;
7675
22
  }
7676
169
      l = contents;
7677
169
      lend = contents + hdr->sh_size;
7678
1.22k
      while (l + sizeof (Elf_External_Options) <= lend)
7679
1.16k
  {
7680
1.16k
    Elf_Internal_Options intopt;
7681
7682
1.16k
    bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
7683
1.16k
          &intopt);
7684
1.16k
    if (intopt.size < sizeof (Elf_External_Options))
7685
59
      {
7686
109
      bad_opt:
7687
109
        _bfd_error_handler
7688
    /* xgettext:c-format */
7689
109
    (_("%pB: warning: truncated `%s' option"),
7690
109
     abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd));
7691
109
        break;
7692
59
      }
7693
1.10k
    if (intopt.kind == ODK_REGINFO)
7694
105
      {
7695
105
        if (ABI_64_P (abfd))
7696
105
    {
7697
105
      Elf64_Internal_RegInfo intreg;
7698
105
      size_t needed = (sizeof (Elf_External_Options)
7699
105
           + sizeof (Elf64_External_RegInfo));
7700
105
      if (intopt.size < needed || (size_t) (lend - l) < needed)
7701
50
        goto bad_opt;
7702
55
      bfd_mips_elf64_swap_reginfo_in
7703
55
        (abfd,
7704
55
         ((Elf64_External_RegInfo *)
7705
55
          (l + sizeof (Elf_External_Options))),
7706
55
         &intreg);
7707
55
      elf_gp (abfd) = intreg.ri_gp_value;
7708
55
    }
7709
0
        else
7710
0
    {
7711
0
      Elf32_RegInfo intreg;
7712
0
      size_t needed = (sizeof (Elf_External_Options)
7713
0
           + sizeof (Elf32_External_RegInfo));
7714
0
      if (intopt.size < needed || (size_t) (lend - l) < needed)
7715
0
        goto bad_opt;
7716
0
      bfd_mips_elf32_swap_reginfo_in
7717
0
        (abfd,
7718
0
         ((Elf32_External_RegInfo *)
7719
0
          (l + sizeof (Elf_External_Options))),
7720
0
         &intreg);
7721
0
      elf_gp (abfd) = intreg.ri_gp_value;
7722
0
    }
7723
105
      }
7724
1.05k
    l += intopt.size;
7725
1.05k
  }
7726
169
      free (contents);
7727
169
    }
7728
7729
46.8k
  return true;
7730
46.8k
}
7731
7732
/* Set the correct type for a MIPS ELF section.  We do this by the
7733
   section name, which is a hack, but ought to work.  This routine is
7734
   used by both the 32-bit and the 64-bit ABI.  */
7735
7736
bool
7737
_bfd_mips_elf_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
7738
169
{
7739
169
  const char *name = bfd_section_name (sec);
7740
7741
169
  if (strcmp (name, ".liblist") == 0)
7742
0
    {
7743
0
      hdr->sh_type = SHT_MIPS_LIBLIST;
7744
0
      hdr->sh_info = sec->size / sizeof (Elf32_Lib);
7745
      /* The sh_link field is set in final_write_processing.  */
7746
0
    }
7747
169
  else if (strcmp (name, ".conflict") == 0)
7748
0
    hdr->sh_type = SHT_MIPS_CONFLICT;
7749
169
  else if (startswith (name, ".gptab."))
7750
0
    {
7751
0
      hdr->sh_type = SHT_MIPS_GPTAB;
7752
0
      hdr->sh_entsize = sizeof (Elf32_External_gptab);
7753
      /* The sh_info field is set in final_write_processing.  */
7754
0
    }
7755
169
  else if (strcmp (name, ".ucode") == 0)
7756
0
    hdr->sh_type = SHT_MIPS_UCODE;
7757
169
  else if (strcmp (name, ".mdebug") == 0)
7758
0
    {
7759
0
      hdr->sh_type = SHT_MIPS_DEBUG;
7760
      /* In a shared object on IRIX 5.3, the .mdebug section has an
7761
   entsize of 0.  FIXME: Does this matter?  */
7762
0
      if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0)
7763
0
  hdr->sh_entsize = 0;
7764
0
      else
7765
0
  hdr->sh_entsize = 1;
7766
0
    }
7767
169
  else if (strcmp (name, ".reginfo") == 0)
7768
0
    {
7769
0
      hdr->sh_type = SHT_MIPS_REGINFO;
7770
      /* In a shared object on IRIX 5.3, the .reginfo section has an
7771
   entsize of 0x18.  FIXME: Does this matter?  */
7772
0
      if (SGI_COMPAT (abfd))
7773
0
  {
7774
0
    if ((abfd->flags & DYNAMIC) != 0)
7775
0
      hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
7776
0
    else
7777
0
      hdr->sh_entsize = 1;
7778
0
  }
7779
0
      else
7780
0
  hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
7781
0
    }
7782
169
  else if (SGI_COMPAT (abfd)
7783
169
     && (strcmp (name, ".hash") == 0
7784
169
         || strcmp (name, ".dynamic") == 0
7785
169
         || strcmp (name, ".dynstr") == 0))
7786
0
    {
7787
0
      if (SGI_COMPAT (abfd))
7788
0
  hdr->sh_entsize = 0;
7789
#if 0
7790
      /* This isn't how the IRIX6 linker behaves.  */
7791
      hdr->sh_info = SIZEOF_MIPS_DYNSYM_SECNAMES;
7792
#endif
7793
0
    }
7794
169
  else if (strcmp (name, ".got") == 0
7795
169
     || strcmp (name, ".srdata") == 0
7796
169
     || strcmp (name, ".sdata") == 0
7797
169
     || strcmp (name, ".sbss") == 0
7798
169
     || strcmp (name, ".lit4") == 0
7799
169
     || strcmp (name, ".lit8") == 0)
7800
0
    hdr->sh_flags |= SHF_MIPS_GPREL;
7801
169
  else if (strcmp (name, ".MIPS.interfaces") == 0)
7802
0
    {
7803
0
      hdr->sh_type = SHT_MIPS_IFACE;
7804
0
      hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7805
0
    }
7806
169
  else if (startswith (name, ".MIPS.content"))
7807
0
    {
7808
0
      hdr->sh_type = SHT_MIPS_CONTENT;
7809
0
      hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7810
      /* The sh_info field is set in final_write_processing.  */
7811
0
    }
7812
169
  else if (MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
7813
0
    {
7814
0
      hdr->sh_type = SHT_MIPS_OPTIONS;
7815
0
      hdr->sh_entsize = 1;
7816
0
      hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7817
0
    }
7818
169
  else if (startswith (name, ".MIPS.abiflags"))
7819
0
    {
7820
0
      hdr->sh_type = SHT_MIPS_ABIFLAGS;
7821
0
      hdr->sh_entsize = sizeof (Elf_External_ABIFlags_v0);
7822
0
    }
7823
169
  else if (startswith (name, ".debug_")
7824
169
     || startswith (name, ".gnu.debuglto_.debug_")
7825
169
     || startswith (name, ".zdebug_")
7826
169
     || startswith (name, ".gnu.debuglto_.zdebug_"))
7827
0
    {
7828
0
      hdr->sh_type = SHT_MIPS_DWARF;
7829
7830
      /* Irix facilities such as libexc expect a single .debug_frame
7831
   per executable, the system ones have NOSTRIP set and the linker
7832
   doesn't merge sections with different flags so ...  */
7833
0
      if (SGI_COMPAT (abfd) && startswith (name, ".debug_frame"))
7834
0
  hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7835
0
    }
7836
169
  else if (strcmp (name, ".MIPS.symlib") == 0)
7837
0
    {
7838
0
      hdr->sh_type = SHT_MIPS_SYMBOL_LIB;
7839
      /* The sh_link and sh_info fields are set in
7840
   final_write_processing.  */
7841
0
    }
7842
169
  else if (startswith (name, ".MIPS.events")
7843
169
     || startswith (name, ".MIPS.post_rel"))
7844
0
    {
7845
0
      hdr->sh_type = SHT_MIPS_EVENTS;
7846
0
      hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7847
      /* The sh_link field is set in final_write_processing.  */
7848
0
    }
7849
169
  else if (strcmp (name, ".msym") == 0)
7850
0
    {
7851
0
      hdr->sh_type = SHT_MIPS_MSYM;
7852
0
      hdr->sh_flags |= SHF_ALLOC;
7853
0
      hdr->sh_entsize = 8;
7854
0
    }
7855
169
  else if (strcmp (name, ".MIPS.xhash") == 0)
7856
0
    {
7857
0
      hdr->sh_type = SHT_MIPS_XHASH;
7858
0
      hdr->sh_flags |= SHF_ALLOC;
7859
0
      hdr->sh_entsize = get_elf_backend_data(abfd)->s->arch_size == 64 ? 0 : 4;
7860
0
    }
7861
7862
  /* The generic elf_fake_sections will set up REL_HDR using the default
7863
   kind of relocations.  We used to set up a second header for the
7864
   non-default kind of relocations here, but only NewABI would use
7865
   these, and the IRIX ld doesn't like resulting empty RELA sections.
7866
   Thus we create those header only on demand now.  */
7867
7868
169
  return true;
7869
169
}
7870
7871
/* Given a BFD section, try to locate the corresponding ELF section
7872
   index.  This is used by both the 32-bit and the 64-bit ABI.
7873
   Actually, it's not clear to me that the 64-bit ABI supports these,
7874
   but for non-PIC objects we will certainly want support for at least
7875
   the .scommon section.  */
7876
7877
bool
7878
_bfd_mips_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
7879
          asection *sec, int *retval)
7880
41
{
7881
41
  if (strcmp (bfd_section_name (sec), ".scommon") == 0)
7882
3
    {
7883
3
      *retval = SHN_MIPS_SCOMMON;
7884
3
      return true;
7885
3
    }
7886
38
  if (strcmp (bfd_section_name (sec), ".acommon") == 0)
7887
1
    {
7888
1
      *retval = SHN_MIPS_ACOMMON;
7889
1
      return true;
7890
1
    }
7891
37
  return false;
7892
38
}
7893

7894
/* Hook called by the linker routine which adds symbols from an object
7895
   file.  We must handle the special MIPS section numbers here.  */
7896
7897
bool
7898
_bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
7899
             Elf_Internal_Sym *sym, const char **namep,
7900
             flagword *flagsp ATTRIBUTE_UNUSED,
7901
             asection **secp, bfd_vma *valp)
7902
0
{
7903
0
  if (SGI_COMPAT (abfd)
7904
0
      && (abfd->flags & DYNAMIC) != 0
7905
0
      && strcmp (*namep, "_rld_new_interface") == 0)
7906
0
    {
7907
      /* Skip IRIX5 rld entry name.  */
7908
0
      *namep = NULL;
7909
0
      return true;
7910
0
    }
7911
7912
  /* Shared objects may have a dynamic symbol '_gp_disp' defined as
7913
     a SECTION *ABS*.  This causes ld to think it can resolve _gp_disp
7914
     by setting a DT_NEEDED for the shared object.  Since _gp_disp is
7915
     a magic symbol resolved by the linker, we ignore this bogus definition
7916
     of _gp_disp.  New ABI objects do not suffer from this problem so this
7917
     is not done for them. */
7918
0
  if (!NEWABI_P(abfd)
7919
0
      && (sym->st_shndx == SHN_ABS)
7920
0
      && (strcmp (*namep, "_gp_disp") == 0))
7921
0
    {
7922
0
      *namep = NULL;
7923
0
      return true;
7924
0
    }
7925
7926
0
  switch (sym->st_shndx)
7927
0
    {
7928
0
    case SHN_COMMON:
7929
      /* Common symbols less than the GP size are automatically
7930
   treated as SHN_MIPS_SCOMMON symbols, with some exceptions.  */
7931
0
      if (sym->st_size > elf_gp_size (abfd)
7932
0
    || ELF_ST_TYPE (sym->st_info) == STT_TLS
7933
0
    || IRIX_COMPAT (abfd) == ict_irix6
7934
0
    || strcmp (*namep, "__gnu_lto_slim") == 0)
7935
0
  break;
7936
      /* Fall through.  */
7937
0
    case SHN_MIPS_SCOMMON:
7938
0
      *secp = bfd_make_section_old_way (abfd, ".scommon");
7939
0
      (*secp)->flags |= SEC_IS_COMMON | SEC_SMALL_DATA;
7940
0
      *valp = sym->st_size;
7941
0
      break;
7942
7943
0
    case SHN_MIPS_TEXT:
7944
      /* This section is used in a shared object.  */
7945
0
      if (mips_elf_tdata (abfd)->elf_text_section == NULL)
7946
0
  {
7947
0
    asymbol *elf_text_symbol;
7948
0
    asection *elf_text_section;
7949
0
    size_t amt = sizeof (asection);
7950
7951
0
    elf_text_section = bfd_zalloc (abfd, amt);
7952
0
    if (elf_text_section == NULL)
7953
0
      return false;
7954
7955
0
    amt = sizeof (asymbol);
7956
0
    elf_text_symbol = bfd_zalloc (abfd, amt);
7957
0
    if (elf_text_symbol == NULL)
7958
0
      return false;
7959
7960
    /* Initialize the section.  */
7961
7962
0
    mips_elf_tdata (abfd)->elf_text_section = elf_text_section;
7963
7964
0
    elf_text_section->symbol = elf_text_symbol;
7965
0
    elf_text_section->name = ".text";
7966
0
    elf_text_section->flags = SEC_NO_FLAGS;
7967
0
    elf_text_section->output_section = NULL;
7968
0
    elf_text_section->owner = abfd;
7969
0
    elf_text_symbol->name = ".text";
7970
0
    elf_text_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
7971
0
    elf_text_symbol->section = elf_text_section;
7972
0
  }
7973
      /* This code used to do *secp = bfd_und_section_ptr if
7974
   bfd_link_pic (info).  I don't know why, and that doesn't make sense,
7975
   so I took it out.  */
7976
0
      *secp = mips_elf_tdata (abfd)->elf_text_section;
7977
0
      break;
7978
7979
0
    case SHN_MIPS_ACOMMON:
7980
      /* Fall through. XXX Can we treat this as allocated data?  */
7981
0
    case SHN_MIPS_DATA:
7982
      /* This section is used in a shared object.  */
7983
0
      if (mips_elf_tdata (abfd)->elf_data_section == NULL)
7984
0
  {
7985
0
    asymbol *elf_data_symbol;
7986
0
    asection *elf_data_section;
7987
0
    size_t amt = sizeof (asection);
7988
7989
0
    elf_data_section = bfd_zalloc (abfd, amt);
7990
0
    if (elf_data_section == NULL)
7991
0
      return false;
7992
7993
0
    amt = sizeof (asymbol);
7994
0
    elf_data_symbol = bfd_zalloc (abfd, amt);
7995
0
    if (elf_data_symbol == NULL)
7996
0
      return false;
7997
7998
    /* Initialize the section.  */
7999
8000
0
    mips_elf_tdata (abfd)->elf_data_section = elf_data_section;
8001
8002
0
    elf_data_section->symbol = elf_data_symbol;
8003
0
    elf_data_section->name = ".data";
8004
0
    elf_data_section->flags = SEC_NO_FLAGS;
8005
0
    elf_data_section->output_section = NULL;
8006
0
    elf_data_section->owner = abfd;
8007
0
    elf_data_symbol->name = ".data";
8008
0
    elf_data_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
8009
0
    elf_data_symbol->section = elf_data_section;
8010
0
  }
8011
      /* This code used to do *secp = bfd_und_section_ptr if
8012
   bfd_link_pic (info).  I don't know why, and that doesn't make sense,
8013
   so I took it out.  */
8014
0
      *secp = mips_elf_tdata (abfd)->elf_data_section;
8015
0
      break;
8016
8017
0
    case SHN_MIPS_SUNDEFINED:
8018
0
      *secp = bfd_und_section_ptr;
8019
0
      break;
8020
0
    }
8021
8022
0
  if (SGI_COMPAT (abfd)
8023
0
      && ! bfd_link_pic (info)
8024
0
      && info->output_bfd->xvec == abfd->xvec
8025
0
      && strcmp (*namep, "__rld_obj_head") == 0)
8026
0
    {
8027
0
      struct elf_link_hash_entry *h;
8028
0
      struct bfd_link_hash_entry *bh;
8029
8030
      /* Mark __rld_obj_head as dynamic.  */
8031
0
      bh = NULL;
8032
0
      if (! (_bfd_generic_link_add_one_symbol
8033
0
       (info, abfd, *namep, BSF_GLOBAL, *secp, *valp, NULL, false,
8034
0
        get_elf_backend_data (abfd)->collect, &bh)))
8035
0
  return false;
8036
8037
0
      h = (struct elf_link_hash_entry *) bh;
8038
0
      h->non_elf = 0;
8039
0
      h->def_regular = 1;
8040
0
      h->type = STT_OBJECT;
8041
8042
0
      if (! bfd_elf_link_record_dynamic_symbol (info, h))
8043
0
  return false;
8044
8045
0
      mips_elf_hash_table (info)->use_rld_obj_head = true;
8046
0
      mips_elf_hash_table (info)->rld_symbol = h;
8047
0
    }
8048
8049
  /* If this is a mips16 text symbol, add 1 to the value to make it
8050
     odd.  This will cause something like .word SYM to come up with
8051
     the right value when it is loaded into the PC.  */
8052
0
  if (ELF_ST_IS_COMPRESSED (sym->st_other))
8053
0
    ++*valp;
8054
8055
0
  return true;
8056
0
}
8057
8058
/* This hook function is called before the linker writes out a global
8059
   symbol.  We mark symbols as small common if appropriate.  This is
8060
   also where we undo the increment of the value for a mips16 symbol.  */
8061
8062
int
8063
_bfd_mips_elf_link_output_symbol_hook
8064
  (struct bfd_link_info *info ATTRIBUTE_UNUSED,
8065
   const char *name ATTRIBUTE_UNUSED, Elf_Internal_Sym *sym,
8066
   asection *input_sec, struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
8067
0
{
8068
  /* If we see a common symbol, which implies a relocatable link, then
8069
     if a symbol was small common in an input file, mark it as small
8070
     common in the output file.  */
8071
0
  if (sym->st_shndx == SHN_COMMON
8072
0
      && strcmp (input_sec->name, ".scommon") == 0)
8073
0
    sym->st_shndx = SHN_MIPS_SCOMMON;
8074
8075
0
  if (ELF_ST_IS_COMPRESSED (sym->st_other))
8076
0
    sym->st_value &= ~1;
8077
8078
0
  return 1;
8079
0
}
8080

8081
/* Functions for the dynamic linker.  */
8082
8083
/* Create dynamic sections when linking against a dynamic object.  */
8084
8085
bool
8086
_bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
8087
0
{
8088
0
  struct elf_link_hash_entry *h;
8089
0
  struct bfd_link_hash_entry *bh;
8090
0
  flagword flags;
8091
0
  register asection *s;
8092
0
  const char * const *namep;
8093
0
  struct mips_elf_link_hash_table *htab;
8094
8095
0
  htab = mips_elf_hash_table (info);
8096
0
  BFD_ASSERT (htab != NULL);
8097
8098
0
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
8099
0
     | SEC_LINKER_CREATED | SEC_READONLY);
8100
8101
  /* The psABI requires a read-only .dynamic section, but the VxWorks
8102
     EABI doesn't.  */
8103
0
  if (htab->root.target_os != is_vxworks)
8104
0
    {
8105
0
      s = bfd_get_linker_section (abfd, ".dynamic");
8106
0
      if (s != NULL)
8107
0
  {
8108
0
    if (!bfd_set_section_flags (s, flags))
8109
0
      return false;
8110
0
  }
8111
0
    }
8112
8113
  /* We need to create .got section.  */
8114
0
  if (!mips_elf_create_got_section (abfd, info))
8115
0
    return false;
8116
8117
0
  if (! mips_elf_rel_dyn_section (info, true))
8118
0
    return false;
8119
8120
  /* Create .stub section.  */
8121
0
  s = bfd_make_section_anyway_with_flags (abfd,
8122
0
            MIPS_ELF_STUB_SECTION_NAME (abfd),
8123
0
            flags | SEC_CODE);
8124
0
  if (s == NULL
8125
0
      || !bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd)))
8126
0
    return false;
8127
0
  htab->sstubs = s;
8128
8129
0
  if (!mips_elf_hash_table (info)->use_rld_obj_head
8130
0
      && bfd_link_executable (info)
8131
0
      && bfd_get_linker_section (abfd, ".rld_map") == NULL)
8132
0
    {
8133
0
      s = bfd_make_section_anyway_with_flags (abfd, ".rld_map",
8134
0
                flags &~ (flagword) SEC_READONLY);
8135
0
      if (s == NULL
8136
0
    || !bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd)))
8137
0
  return false;
8138
0
    }
8139
8140
  /* Create .MIPS.xhash section.  */
8141
0
  if (info->emit_gnu_hash)
8142
0
    s = bfd_make_section_anyway_with_flags (abfd, ".MIPS.xhash",
8143
0
              flags | SEC_READONLY);
8144
8145
  /* On IRIX5, we adjust add some additional symbols and change the
8146
     alignments of several sections.  There is no ABI documentation
8147
     indicating that this is necessary on IRIX6, nor any evidence that
8148
     the linker takes such action.  */
8149
0
  if (IRIX_COMPAT (abfd) == ict_irix5)
8150
0
    {
8151
0
      for (namep = mips_elf_dynsym_rtproc_names; *namep != NULL; namep++)
8152
0
  {
8153
0
    bh = NULL;
8154
0
    if (! (_bfd_generic_link_add_one_symbol
8155
0
     (info, abfd, *namep, BSF_GLOBAL, bfd_und_section_ptr, 0,
8156
0
      NULL, false, get_elf_backend_data (abfd)->collect, &bh)))
8157
0
      return false;
8158
8159
0
    h = (struct elf_link_hash_entry *) bh;
8160
0
    h->mark = 1;
8161
0
    h->non_elf = 0;
8162
0
    h->def_regular = 1;
8163
0
    h->type = STT_SECTION;
8164
8165
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
8166
0
      return false;
8167
0
  }
8168
8169
      /* We need to create a .compact_rel section.  */
8170
0
      if (SGI_COMPAT (abfd))
8171
0
  {
8172
0
    if (!mips_elf_create_compact_rel_section (abfd, info))
8173
0
      return false;
8174
0
  }
8175
8176
      /* Change alignments of some sections.  */
8177
0
      s = bfd_get_linker_section (abfd, ".hash");
8178
0
      if (s != NULL)
8179
0
  bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
8180
8181
0
      s = bfd_get_linker_section (abfd, ".dynsym");
8182
0
      if (s != NULL)
8183
0
  bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
8184
8185
0
      s = bfd_get_linker_section (abfd, ".dynstr");
8186
0
      if (s != NULL)
8187
0
  bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
8188
8189
      /* ??? */
8190
0
      s = bfd_get_section_by_name (abfd, ".reginfo");
8191
0
      if (s != NULL)
8192
0
  bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
8193
8194
0
      s = bfd_get_linker_section (abfd, ".dynamic");
8195
0
      if (s != NULL)
8196
0
  bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
8197
0
    }
8198
8199
0
  if (bfd_link_executable (info))
8200
0
    {
8201
0
      const char *name;
8202
8203
0
      name = SGI_COMPAT (abfd) ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING";
8204
0
      bh = NULL;
8205
0
      if (!(_bfd_generic_link_add_one_symbol
8206
0
      (info, abfd, name, BSF_GLOBAL, bfd_abs_section_ptr, 0,
8207
0
       NULL, false, get_elf_backend_data (abfd)->collect, &bh)))
8208
0
  return false;
8209
8210
0
      h = (struct elf_link_hash_entry *) bh;
8211
0
      h->non_elf = 0;
8212
0
      h->def_regular = 1;
8213
0
      h->type = STT_SECTION;
8214
8215
0
      if (! bfd_elf_link_record_dynamic_symbol (info, h))
8216
0
  return false;
8217
8218
0
      if (! mips_elf_hash_table (info)->use_rld_obj_head)
8219
0
  {
8220
    /* __rld_map is a four byte word located in the .data section
8221
       and is filled in by the rtld to contain a pointer to
8222
       the _r_debug structure. Its symbol value will be set in
8223
       _bfd_mips_elf_finish_dynamic_symbol.  */
8224
0
    s = bfd_get_linker_section (abfd, ".rld_map");
8225
0
    BFD_ASSERT (s != NULL);
8226
8227
0
    name = SGI_COMPAT (abfd) ? "__rld_map" : "__RLD_MAP";
8228
0
    bh = NULL;
8229
0
    if (!(_bfd_generic_link_add_one_symbol
8230
0
    (info, abfd, name, BSF_GLOBAL, s, 0, NULL, false,
8231
0
     get_elf_backend_data (abfd)->collect, &bh)))
8232
0
      return false;
8233
8234
0
    h = (struct elf_link_hash_entry *) bh;
8235
0
    h->non_elf = 0;
8236
0
    h->def_regular = 1;
8237
0
    h->type = STT_OBJECT;
8238
8239
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
8240
0
      return false;
8241
0
    mips_elf_hash_table (info)->rld_symbol = h;
8242
0
  }
8243
0
    }
8244
8245
  /* Create the .plt, .rel(a).plt, .dynbss and .rel(a).bss sections.
8246
     Also, on VxWorks, create the _PROCEDURE_LINKAGE_TABLE_ symbol.  */
8247
0
  if (!_bfd_elf_create_dynamic_sections (abfd, info))
8248
0
    return false;
8249
8250
0
#ifdef OBJ_MAYBE_ELF_VXWORKS
8251
  /* Do the usual VxWorks handling.  */
8252
0
  if (htab->root.target_os == is_vxworks
8253
0
      && !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
8254
0
    return false;
8255
0
#endif /* OBJ_MAYBE_ELF_VXWORKS */
8256
8257
0
  return true;
8258
0
}
8259

8260
/* Return true if relocation REL against section SEC is a REL rather than
8261
   RELA relocation.  RELOCS is the first relocation in the section and
8262
   ABFD is the bfd that contains SEC.  */
8263
8264
static bool
8265
mips_elf_rel_relocation_p (bfd *abfd, asection *sec,
8266
         const Elf_Internal_Rela *relocs,
8267
         const Elf_Internal_Rela *rel)
8268
0
{
8269
0
  Elf_Internal_Shdr *rel_hdr;
8270
0
  elf_backend_data *bed;
8271
8272
  /* To determine which flavor of relocation this is, we depend on the
8273
     fact that the INPUT_SECTION's REL_HDR is read before RELA_HDR.  */
8274
0
  rel_hdr = elf_section_data (sec)->rel.hdr;
8275
0
  if (rel_hdr == NULL)
8276
0
    return false;
8277
0
  bed = get_elf_backend_data (abfd);
8278
0
  return ((size_t) (rel - relocs)
8279
0
    < NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel);
8280
0
}
8281
8282
/* Read the addend for REL relocation REL, which belongs to bfd ABFD.
8283
   HOWTO is the relocation's howto and CONTENTS points to the contents
8284
   of the section that REL is against.  */
8285
8286
static bfd_vma
8287
mips_elf_read_rel_addend (bfd *abfd, asection *sec,
8288
        const Elf_Internal_Rela *rel,
8289
        reloc_howto_type *howto, bfd_byte *contents)
8290
0
{
8291
0
  bfd_byte *location;
8292
0
  unsigned int r_type;
8293
0
  bfd_vma addend;
8294
0
  bfd_vma bytes;
8295
8296
0
  if (!bfd_reloc_offset_in_range (howto, abfd, sec, rel->r_offset))
8297
0
    return 0;
8298
8299
0
  r_type = ELF_R_TYPE (abfd, rel->r_info);
8300
0
  location = contents + rel->r_offset;
8301
8302
  /* Get the addend, which is stored in the input file.  */
8303
0
  _bfd_mips_elf_reloc_unshuffle (abfd, r_type, false, location);
8304
0
  bytes = mips_elf_obtain_contents (howto, rel, abfd, contents);
8305
0
  _bfd_mips_elf_reloc_shuffle (abfd, r_type, false, location);
8306
8307
0
  addend = bytes & howto->src_mask;
8308
8309
  /* Shift is 2, unusually, for microMIPS JALX.  Adjust the addend
8310
     accordingly.  */
8311
0
  if (r_type == R_MICROMIPS_26_S1 && (bytes >> 26) == 0x3c)
8312
0
    addend <<= 1;
8313
8314
0
  return addend;
8315
0
}
8316
8317
/* REL is a relocation in ABFD that needs a partnering LO16 relocation
8318
   and *ADDEND is the addend for REL itself.  Look for the LO16 relocation
8319
   and update *ADDEND with the final addend.  Return true on success
8320
   or false if the LO16 could not be found.  RELEND is the exclusive
8321
   upper bound on the relocations for REL's section.  */
8322
8323
static bool
8324
mips_elf_add_lo16_rel_addend (bfd *abfd,
8325
            asection *sec,
8326
            const Elf_Internal_Rela *rel,
8327
            const Elf_Internal_Rela *relend,
8328
            bfd_byte *contents, bfd_vma *addend)
8329
0
{
8330
0
  unsigned int r_type, lo16_type;
8331
0
  const Elf_Internal_Rela *lo16_relocation;
8332
0
  reloc_howto_type *lo16_howto;
8333
0
  bfd_vma l;
8334
8335
0
  r_type = ELF_R_TYPE (abfd, rel->r_info);
8336
0
  switch (r_type)
8337
0
    {
8338
0
    case R_MIPS_HI16:
8339
0
    case R_MIPS_GOT16:
8340
0
      lo16_type = R_MIPS_LO16;
8341
0
      break;
8342
0
    case R_MIPS_PCHI16:
8343
0
      lo16_type = R_MIPS_PCLO16;
8344
0
      break;
8345
0
    case R_MIPS_TLS_DTPREL_HI16:
8346
0
      lo16_type = R_MIPS_TLS_DTPREL_LO16;
8347
0
      break;
8348
0
    case R_MIPS_TLS_TPREL_HI16:
8349
0
      lo16_type = R_MIPS_TLS_TPREL_LO16;
8350
0
      break;
8351
0
    case R_MIPS16_HI16:
8352
0
    case R_MIPS16_GOT16:
8353
0
      lo16_type = R_MIPS16_LO16;
8354
0
      break;
8355
0
    case R_MIPS16_TLS_DTPREL_HI16:
8356
0
      lo16_type = R_MIPS16_TLS_DTPREL_LO16;
8357
0
      break;
8358
0
    case R_MIPS16_TLS_TPREL_HI16:
8359
0
      lo16_type = R_MIPS16_TLS_TPREL_LO16;
8360
0
      break;
8361
0
    case R_MICROMIPS_HI16:
8362
0
    case R_MICROMIPS_GOT16:
8363
0
      lo16_type = R_MICROMIPS_LO16;
8364
0
      break;
8365
0
    case R_MICROMIPS_TLS_DTPREL_HI16:
8366
0
      lo16_type = R_MICROMIPS_TLS_DTPREL_LO16;
8367
0
      break;
8368
0
    case R_MICROMIPS_TLS_TPREL_HI16:
8369
0
      lo16_type = R_MICROMIPS_TLS_TPREL_LO16;
8370
0
      break;
8371
0
    default:
8372
0
      abort ();
8373
0
    }
8374
8375
  /* The combined value is the sum of the HI16 addend, left-shifted by
8376
     sixteen bits, and the LO16 addend, sign extended.  (Usually, the
8377
     code does a `lui' of the HI16 value, and then an `addiu' of the
8378
     LO16 value.)  */
8379
0
  *addend <<= 16;
8380
8381
  /* Scan ahead to find a matching LO16 relocation.
8382
8383
     According to the MIPS ELF ABI, the R_MIPS_LO16 relocation must
8384
     be immediately following.  However, for the IRIX6 ABI, the next
8385
     relocation may be a composed relocation consisting of several
8386
     relocations for the same address.  In that case, the R_MIPS_LO16
8387
     relocation may occur as one of these.  We permit a similar
8388
     extension in general, as that is useful for GCC.
8389
8390
     In some cases GCC dead code elimination removes the LO16 but keeps
8391
     the corresponding HI16.  This is strictly speaking a violation of
8392
     the ABI but not immediately harmful.  */
8393
0
  lo16_relocation = mips_elf_next_relocation (abfd, lo16_type, rel, relend);
8394
0
  if (lo16_relocation == NULL)
8395
0
    return false;
8396
8397
  /* Obtain the addend kept there.  */
8398
0
  lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, lo16_type, false);
8399
0
  l = mips_elf_read_rel_addend (abfd, sec, lo16_relocation, lo16_howto,
8400
0
        contents);
8401
8402
0
  l <<= lo16_howto->rightshift;
8403
  /* For a PC-relative relocation the PCLO16 part of the addend
8404
     is relative to its PC and not ours, so we need to adjust it.  */
8405
0
  if (r_type == R_MIPS_PCHI16)
8406
0
    l = (l - (lo16_relocation->r_offset - rel->r_offset)) & 0xffff;
8407
0
  l = _bfd_mips_elf_sign_extend (l, 16);
8408
8409
0
  *addend += l;
8410
0
  return true;
8411
0
}
8412
8413
/* Try to read the contents of section SEC in bfd ABFD.  Return true and
8414
   store the contents in *CONTENTS on success.  Assume that *CONTENTS
8415
   already holds the contents if it is nonull on entry.  */
8416
8417
static bool
8418
mips_elf_get_section_contents (bfd *abfd, asection *sec, bfd_byte **contents)
8419
0
{
8420
0
  if (*contents)
8421
0
    return true;
8422
8423
  /* Get cached copy if it exists.  */
8424
0
  if (elf_section_data (sec)->this_hdr.contents != NULL)
8425
0
    {
8426
0
      *contents = elf_section_data (sec)->this_hdr.contents;
8427
0
      return true;
8428
0
    }
8429
8430
0
  return bfd_malloc_and_get_section (abfd, sec, contents);
8431
0
}
8432
8433
/* Make a new PLT record to keep internal data.  */
8434
8435
static struct plt_entry *
8436
mips_elf_make_plt_record (bfd *abfd)
8437
0
{
8438
0
  struct plt_entry *entry;
8439
8440
0
  entry = bfd_zalloc (abfd, sizeof (*entry));
8441
0
  if (entry == NULL)
8442
0
    return NULL;
8443
8444
0
  entry->stub_offset = MINUS_ONE;
8445
0
  entry->mips_offset = MINUS_ONE;
8446
0
  entry->comp_offset = MINUS_ONE;
8447
0
  entry->gotplt_index = MINUS_ONE;
8448
0
  return entry;
8449
0
}
8450
8451
/* Define the special `__gnu_absolute_zero' symbol.  We only need this
8452
   for PIC code, as otherwise there is no load-time relocation involved
8453
   and local GOT entries whose value is zero at static link time will
8454
   retain their value at load time.  */
8455
8456
static bool
8457
mips_elf_define_absolute_zero (bfd *abfd, struct bfd_link_info *info,
8458
             struct mips_elf_link_hash_table *htab,
8459
             unsigned int r_type)
8460
0
{
8461
0
  union
8462
0
    {
8463
0
      struct elf_link_hash_entry *eh;
8464
0
      struct bfd_link_hash_entry *bh;
8465
0
    }
8466
0
  hzero;
8467
8468
0
  BFD_ASSERT (!htab->use_absolute_zero);
8469
0
  BFD_ASSERT (bfd_link_pic (info));
8470
8471
0
  hzero.bh = NULL;
8472
0
  if (!_bfd_generic_link_add_one_symbol (info, abfd, "__gnu_absolute_zero",
8473
0
           BSF_GLOBAL, bfd_abs_section_ptr, 0,
8474
0
           NULL, false, false, &hzero.bh))
8475
0
    return false;
8476
8477
0
  BFD_ASSERT (hzero.bh != NULL);
8478
0
  hzero.eh->size = 0;
8479
0
  hzero.eh->type = STT_NOTYPE;
8480
0
  hzero.eh->other = STV_PROTECTED;
8481
0
  hzero.eh->def_regular = 1;
8482
0
  hzero.eh->non_elf = 0;
8483
8484
0
  if (!mips_elf_record_global_got_symbol (hzero.eh, abfd, info, true, r_type))
8485
0
    return false;
8486
8487
0
  htab->use_absolute_zero = true;
8488
8489
0
  return true;
8490
0
}
8491
8492
/* Look through the relocs for a section during the first phase, and
8493
   allocate space in the global offset table and record the need for
8494
   standard MIPS and compressed procedure linkage table entries.  */
8495
8496
bool
8497
_bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
8498
          asection *sec, const Elf_Internal_Rela *relocs)
8499
0
{
8500
0
  const char *name;
8501
0
  bfd *dynobj;
8502
0
  Elf_Internal_Shdr *symtab_hdr;
8503
0
  struct elf_link_hash_entry **sym_hashes;
8504
0
  size_t extsymoff;
8505
0
  const Elf_Internal_Rela *rel;
8506
0
  const Elf_Internal_Rela *rel_end;
8507
0
  asection *sreloc;
8508
0
  elf_backend_data *bed;
8509
0
  struct mips_elf_link_hash_table *htab;
8510
0
  bfd_byte *contents;
8511
0
  bfd_vma addend;
8512
0
  reloc_howto_type *howto;
8513
8514
0
  if (bfd_link_relocatable (info))
8515
0
    return true;
8516
8517
0
  htab = mips_elf_hash_table (info);
8518
0
  BFD_ASSERT (htab != NULL);
8519
8520
0
  dynobj = elf_hash_table (info)->dynobj;
8521
0
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8522
0
  sym_hashes = elf_sym_hashes (abfd);
8523
0
  extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
8524
8525
0
  bed = get_elf_backend_data (abfd);
8526
0
  rel_end = relocs + sec->reloc_count;
8527
8528
  /* Check for the mips16 stub sections.  */
8529
8530
0
  name = bfd_section_name (sec);
8531
0
  if (FN_STUB_P (name))
8532
0
    {
8533
0
      unsigned long r_symndx;
8534
8535
      /* Look at the relocation information to figure out which symbol
8536
   this is for.  */
8537
8538
0
      r_symndx = mips16_stub_symndx (bed, sec, relocs, rel_end);
8539
0
      if (r_symndx == 0)
8540
0
  {
8541
0
    _bfd_error_handler
8542
      /* xgettext:c-format */
8543
0
      (_("%pB: warning: cannot determine the target function for"
8544
0
         " stub section `%s'"),
8545
0
       abfd, name);
8546
0
    bfd_set_error (bfd_error_bad_value);
8547
0
    return false;
8548
0
  }
8549
8550
0
      if (r_symndx < extsymoff
8551
0
    || sym_hashes[r_symndx - extsymoff] == NULL)
8552
0
  {
8553
0
    asection *o;
8554
8555
    /* This stub is for a local symbol.  This stub will only be
8556
       needed if there is some relocation in this BFD, other
8557
       than a 16 bit function call, which refers to this symbol.  */
8558
0
    for (o = abfd->sections; o != NULL; o = o->next)
8559
0
      {
8560
0
        Elf_Internal_Rela *sec_relocs;
8561
0
        const Elf_Internal_Rela *r, *rend;
8562
8563
        /* We can ignore stub sections when looking for relocs.  */
8564
0
        if ((o->flags & SEC_RELOC) == 0
8565
0
      || o->reloc_count == 0
8566
0
      || section_allows_mips16_refs_p (o))
8567
0
    continue;
8568
8569
0
        sec_relocs
8570
0
    = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
8571
0
               info->keep_memory);
8572
0
        if (sec_relocs == NULL)
8573
0
    return false;
8574
8575
0
        rend = sec_relocs + o->reloc_count;
8576
0
        for (r = sec_relocs; r < rend; r++)
8577
0
    if (ELF_R_SYM (abfd, r->r_info) == r_symndx
8578
0
        && !mips16_call_reloc_p (ELF_R_TYPE (abfd, r->r_info)))
8579
0
      break;
8580
8581
0
        if (elf_section_data (o)->relocs != sec_relocs)
8582
0
    free (sec_relocs);
8583
8584
0
        if (r < rend)
8585
0
    break;
8586
0
      }
8587
8588
0
    if (o == NULL)
8589
0
      {
8590
        /* There is no non-call reloc for this stub, so we do
8591
     not need it.  Since this function is called before
8592
     the linker maps input sections to output sections, we
8593
     can easily discard it by setting the SEC_EXCLUDE
8594
     flag.  */
8595
0
        sec->flags |= SEC_EXCLUDE;
8596
0
        return true;
8597
0
      }
8598
8599
    /* Record this stub in an array of local symbol stubs for
8600
       this BFD.  */
8601
0
    if (mips_elf_tdata (abfd)->local_stubs == NULL)
8602
0
      {
8603
0
        unsigned long symcount;
8604
0
        asection **n;
8605
0
        bfd_size_type amt;
8606
8607
0
        if (elf_bad_symtab (abfd))
8608
0
    symcount = NUM_SHDR_ENTRIES (symtab_hdr);
8609
0
        else
8610
0
    symcount = symtab_hdr->sh_info;
8611
0
        amt = symcount * sizeof (asection *);
8612
0
        n = bfd_zalloc (abfd, amt);
8613
0
        if (n == NULL)
8614
0
    return false;
8615
0
        mips_elf_tdata (abfd)->local_stubs = n;
8616
0
      }
8617
8618
0
    sec->flags |= SEC_KEEP;
8619
0
    mips_elf_tdata (abfd)->local_stubs[r_symndx] = sec;
8620
8621
    /* We don't need to set mips16_stubs_seen in this case.
8622
       That flag is used to see whether we need to look through
8623
       the global symbol table for stubs.  We don't need to set
8624
       it here, because we just have a local stub.  */
8625
0
  }
8626
0
      else
8627
0
  {
8628
0
    struct mips_elf_link_hash_entry *h;
8629
8630
0
    h = ((struct mips_elf_link_hash_entry *)
8631
0
         sym_hashes[r_symndx - extsymoff]);
8632
8633
0
    while (h->root.root.type == bfd_link_hash_indirect
8634
0
     || h->root.root.type == bfd_link_hash_warning)
8635
0
      h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
8636
8637
    /* H is the symbol this stub is for.  */
8638
8639
    /* If we already have an appropriate stub for this function, we
8640
       don't need another one, so we can discard this one.  Since
8641
       this function is called before the linker maps input sections
8642
       to output sections, we can easily discard it by setting the
8643
       SEC_EXCLUDE flag.  */
8644
0
    if (h->fn_stub != NULL)
8645
0
      {
8646
0
        sec->flags |= SEC_EXCLUDE;
8647
0
        return true;
8648
0
      }
8649
8650
0
    sec->flags |= SEC_KEEP;
8651
0
    h->fn_stub = sec;
8652
0
    mips_elf_hash_table (info)->mips16_stubs_seen = true;
8653
0
  }
8654
0
    }
8655
0
  else if (CALL_STUB_P (name) || CALL_FP_STUB_P (name))
8656
0
    {
8657
0
      unsigned long r_symndx;
8658
0
      struct mips_elf_link_hash_entry *h;
8659
0
      asection **loc;
8660
8661
      /* Look at the relocation information to figure out which symbol
8662
   this is for.  */
8663
8664
0
      r_symndx = mips16_stub_symndx (bed, sec, relocs, rel_end);
8665
0
      if (r_symndx == 0)
8666
0
  {
8667
0
    _bfd_error_handler
8668
      /* xgettext:c-format */
8669
0
      (_("%pB: warning: cannot determine the target function for"
8670
0
         " stub section `%s'"),
8671
0
       abfd, name);
8672
0
    bfd_set_error (bfd_error_bad_value);
8673
0
    return false;
8674
0
  }
8675
8676
0
      if (r_symndx < extsymoff
8677
0
    || sym_hashes[r_symndx - extsymoff] == NULL)
8678
0
  {
8679
0
    asection *o;
8680
8681
    /* This stub is for a local symbol.  This stub will only be
8682
       needed if there is some relocation (R_MIPS16_26) in this BFD
8683
       that refers to this symbol.  */
8684
0
    for (o = abfd->sections; o != NULL; o = o->next)
8685
0
      {
8686
0
        Elf_Internal_Rela *sec_relocs;
8687
0
        const Elf_Internal_Rela *r, *rend;
8688
8689
        /* We can ignore stub sections when looking for relocs.  */
8690
0
        if ((o->flags & SEC_RELOC) == 0
8691
0
      || o->reloc_count == 0
8692
0
      || section_allows_mips16_refs_p (o))
8693
0
    continue;
8694
8695
0
        sec_relocs
8696
0
    = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
8697
0
               info->keep_memory);
8698
0
        if (sec_relocs == NULL)
8699
0
    return false;
8700
8701
0
        rend = sec_relocs + o->reloc_count;
8702
0
        for (r = sec_relocs; r < rend; r++)
8703
0
    if (ELF_R_SYM (abfd, r->r_info) == r_symndx
8704
0
        && ELF_R_TYPE (abfd, r->r_info) == R_MIPS16_26)
8705
0
        break;
8706
8707
0
        if (elf_section_data (o)->relocs != sec_relocs)
8708
0
    free (sec_relocs);
8709
8710
0
        if (r < rend)
8711
0
    break;
8712
0
      }
8713
8714
0
    if (o == NULL)
8715
0
      {
8716
        /* There is no non-call reloc for this stub, so we do
8717
     not need it.  Since this function is called before
8718
     the linker maps input sections to output sections, we
8719
     can easily discard it by setting the SEC_EXCLUDE
8720
     flag.  */
8721
0
        sec->flags |= SEC_EXCLUDE;
8722
0
        return true;
8723
0
      }
8724
8725
    /* Record this stub in an array of local symbol call_stubs for
8726
       this BFD.  */
8727
0
    if (mips_elf_tdata (abfd)->local_call_stubs == NULL)
8728
0
      {
8729
0
        unsigned long symcount;
8730
0
        asection **n;
8731
0
        bfd_size_type amt;
8732
8733
0
        if (elf_bad_symtab (abfd))
8734
0
    symcount = NUM_SHDR_ENTRIES (symtab_hdr);
8735
0
        else
8736
0
    symcount = symtab_hdr->sh_info;
8737
0
        amt = symcount * sizeof (asection *);
8738
0
        n = bfd_zalloc (abfd, amt);
8739
0
        if (n == NULL)
8740
0
    return false;
8741
0
        mips_elf_tdata (abfd)->local_call_stubs = n;
8742
0
      }
8743
8744
0
    sec->flags |= SEC_KEEP;
8745
0
    mips_elf_tdata (abfd)->local_call_stubs[r_symndx] = sec;
8746
8747
    /* We don't need to set mips16_stubs_seen in this case.
8748
       That flag is used to see whether we need to look through
8749
       the global symbol table for stubs.  We don't need to set
8750
       it here, because we just have a local stub.  */
8751
0
  }
8752
0
      else
8753
0
  {
8754
0
    h = ((struct mips_elf_link_hash_entry *)
8755
0
         sym_hashes[r_symndx - extsymoff]);
8756
8757
    /* H is the symbol this stub is for.  */
8758
8759
0
    if (CALL_FP_STUB_P (name))
8760
0
      loc = &h->call_fp_stub;
8761
0
    else
8762
0
      loc = &h->call_stub;
8763
8764
    /* If we already have an appropriate stub for this function, we
8765
       don't need another one, so we can discard this one.  Since
8766
       this function is called before the linker maps input sections
8767
       to output sections, we can easily discard it by setting the
8768
       SEC_EXCLUDE flag.  */
8769
0
    if (*loc != NULL)
8770
0
      {
8771
0
        sec->flags |= SEC_EXCLUDE;
8772
0
        return true;
8773
0
      }
8774
8775
0
    sec->flags |= SEC_KEEP;
8776
0
    *loc = sec;
8777
0
    mips_elf_hash_table (info)->mips16_stubs_seen = true;
8778
0
  }
8779
0
    }
8780
8781
0
  sreloc = NULL;
8782
0
  contents = NULL;
8783
0
  for (rel = relocs; rel < rel_end; ++rel)
8784
0
    {
8785
0
      unsigned long r_symndx;
8786
0
      unsigned int r_type;
8787
0
      struct elf_link_hash_entry *h;
8788
0
      bool can_make_dynamic_p;
8789
0
      bool call_reloc_p;
8790
0
      bool constrain_symbol_p;
8791
8792
0
      r_symndx = ELF_R_SYM (abfd, rel->r_info);
8793
0
      r_type = ELF_R_TYPE (abfd, rel->r_info);
8794
8795
0
      if (r_symndx < extsymoff)
8796
0
  h = NULL;
8797
0
      else if (r_symndx >= extsymoff + NUM_SHDR_ENTRIES (symtab_hdr))
8798
0
  {
8799
0
    _bfd_error_handler
8800
      /* xgettext:c-format */
8801
0
      (_("%pB: malformed reloc detected for section %s"),
8802
0
       abfd, name);
8803
0
    bfd_set_error (bfd_error_bad_value);
8804
0
    return false;
8805
0
  }
8806
0
      else
8807
0
  {
8808
0
    h = sym_hashes[r_symndx - extsymoff];
8809
0
    if (h != NULL)
8810
0
      {
8811
0
        while (h->root.type == bfd_link_hash_indirect
8812
0
         || h->root.type == bfd_link_hash_warning)
8813
0
    h = (struct elf_link_hash_entry *) h->root.u.i.link;
8814
0
      }
8815
0
  }
8816
8817
      /* Set CAN_MAKE_DYNAMIC_P to true if we can convert this
8818
   relocation into a dynamic one.  */
8819
0
      can_make_dynamic_p = false;
8820
8821
      /* Set CALL_RELOC_P to true if the relocation is for a call,
8822
   and if pointer equality therefore doesn't matter.  */
8823
0
      call_reloc_p = false;
8824
8825
      /* Set CONSTRAIN_SYMBOL_P if we need to take the relocation
8826
   into account when deciding how to define the symbol.  */
8827
0
      constrain_symbol_p = true;
8828
8829
0
      switch (r_type)
8830
0
  {
8831
0
  case R_MIPS_CALL16:
8832
0
  case R_MIPS_CALL_HI16:
8833
0
  case R_MIPS_CALL_LO16:
8834
0
  case R_MIPS16_CALL16:
8835
0
  case R_MICROMIPS_CALL16:
8836
0
  case R_MICROMIPS_CALL_HI16:
8837
0
  case R_MICROMIPS_CALL_LO16:
8838
0
    call_reloc_p = true;
8839
    /* Fall through.  */
8840
8841
0
  case R_MIPS_GOT16:
8842
0
  case R_MIPS_GOT_LO16:
8843
0
  case R_MIPS_GOT_PAGE:
8844
0
  case R_MIPS_GOT_DISP:
8845
0
  case R_MIPS16_GOT16:
8846
0
  case R_MICROMIPS_GOT16:
8847
0
  case R_MICROMIPS_GOT_LO16:
8848
0
  case R_MICROMIPS_GOT_PAGE:
8849
0
  case R_MICROMIPS_GOT_DISP:
8850
    /* If we have a symbol that will resolve to zero at static link
8851
       time and it is used by a GOT relocation applied to code we
8852
       cannot relax to an immediate zero load, then we will be using
8853
       the special `__gnu_absolute_zero' symbol whose value is zero
8854
       at dynamic load time.  We ignore HI16-type GOT relocations at
8855
       this stage, because their handling will depend entirely on
8856
       the corresponding LO16-type GOT relocation.  */
8857
0
    if (!call_hi16_reloc_p (r_type)
8858
0
        && h != NULL
8859
0
        && bfd_link_pic (info)
8860
0
        && !htab->use_absolute_zero
8861
0
        && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
8862
0
      {
8863
0
        bool rel_reloc;
8864
8865
0
        if (!mips_elf_get_section_contents (abfd, sec, &contents))
8866
0
    return false;
8867
8868
0
        rel_reloc = mips_elf_rel_relocation_p (abfd, sec, relocs, rel);
8869
0
        howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, !rel_reloc);
8870
0
        if (bfd_reloc_offset_in_range (howto, abfd, sec, rel->r_offset))
8871
0
    if (!mips_elf_nullify_got_load (abfd, contents, rel, howto,
8872
0
            false))
8873
0
      if (!mips_elf_define_absolute_zero (abfd, info, htab,
8874
0
                  r_type))
8875
0
        return false;
8876
0
      }
8877
8878
    /* Fall through.  */
8879
0
  case R_MIPS_GOT_HI16:
8880
0
  case R_MIPS_GOT_OFST:
8881
0
  case R_MIPS_TLS_GOTTPREL:
8882
0
  case R_MIPS_TLS_GD:
8883
0
  case R_MIPS_TLS_LDM:
8884
0
  case R_MIPS16_TLS_GOTTPREL:
8885
0
  case R_MIPS16_TLS_GD:
8886
0
  case R_MIPS16_TLS_LDM:
8887
0
  case R_MICROMIPS_GOT_HI16:
8888
0
  case R_MICROMIPS_GOT_OFST:
8889
0
  case R_MICROMIPS_TLS_GOTTPREL:
8890
0
  case R_MICROMIPS_TLS_GD:
8891
0
  case R_MICROMIPS_TLS_LDM:
8892
0
    if (dynobj == NULL)
8893
0
      elf_hash_table (info)->dynobj = dynobj = abfd;
8894
0
    if (!mips_elf_create_got_section (dynobj, info))
8895
0
      return false;
8896
0
    if (htab->root.target_os == is_vxworks
8897
0
        && !bfd_link_pic (info))
8898
0
      {
8899
0
        _bfd_error_handler
8900
    /* xgettext:c-format */
8901
0
    (_("%pB: GOT reloc at %#" PRIx64 " not expected in executables"),
8902
0
     abfd, (uint64_t) rel->r_offset);
8903
0
        bfd_set_error (bfd_error_bad_value);
8904
0
        return false;
8905
0
      }
8906
0
    can_make_dynamic_p = true;
8907
0
    break;
8908
8909
0
  case R_MIPS_NONE:
8910
0
  case R_MIPS_JALR:
8911
0
  case R_MICROMIPS_JALR:
8912
    /* These relocations have empty fields and are purely there to
8913
       provide link information.  The symbol value doesn't matter.  */
8914
0
    constrain_symbol_p = false;
8915
0
    break;
8916
8917
0
  case R_MIPS_GPREL16:
8918
0
  case R_MIPS_GPREL32:
8919
0
  case R_MIPS16_GPREL:
8920
0
  case R_MICROMIPS_GPREL16:
8921
    /* GP-relative relocations always resolve to a definition in a
8922
       regular input file, ignoring the one-definition rule.  This is
8923
       important for the GP setup sequence in NewABI code, which
8924
       always resolves to a local function even if other relocations
8925
       against the symbol wouldn't.  */
8926
0
    constrain_symbol_p = false;
8927
0
    break;
8928
8929
0
  case R_MIPS_32:
8930
0
  case R_MIPS_REL32:
8931
0
  case R_MIPS_64:
8932
    /* In VxWorks executables, references to external symbols
8933
       must be handled using copy relocs or PLT entries; it is not
8934
       possible to convert this relocation into a dynamic one.
8935
8936
       For executables that use PLTs and copy-relocs, we have a
8937
       choice between converting the relocation into a dynamic
8938
       one or using copy relocations or PLT entries.  It is
8939
       usually better to do the former, unless the relocation is
8940
       against a read-only section.  */
8941
0
    if ((bfd_link_pic (info)
8942
0
         || (h != NULL
8943
0
       && htab->root.target_os != is_vxworks
8944
0
       && strcmp (h->root.root.string, "__gnu_local_gp") != 0
8945
0
       && !(!info->nocopyreloc
8946
0
      && !PIC_OBJECT_P (abfd)
8947
0
      && MIPS_ELF_READONLY_SECTION (sec))))
8948
0
        && (sec->flags & SEC_ALLOC) != 0)
8949
0
      {
8950
0
        can_make_dynamic_p = true;
8951
0
        if (dynobj == NULL)
8952
0
    elf_hash_table (info)->dynobj = dynobj = abfd;
8953
0
      }
8954
0
    break;
8955
8956
0
  case R_MIPS_26:
8957
0
  case R_MIPS_PC16:
8958
0
  case R_MIPS_PC21_S2:
8959
0
  case R_MIPS_PC26_S2:
8960
0
  case R_MIPS16_26:
8961
0
  case R_MIPS16_PC16_S1:
8962
0
  case R_MICROMIPS_26_S1:
8963
0
  case R_MICROMIPS_PC7_S1:
8964
0
  case R_MICROMIPS_PC10_S1:
8965
0
  case R_MICROMIPS_PC16_S1:
8966
0
  case R_MICROMIPS_PC23_S2:
8967
0
    call_reloc_p = true;
8968
0
    break;
8969
0
  }
8970
8971
0
      if (h)
8972
0
  {
8973
0
    if (constrain_symbol_p)
8974
0
      {
8975
0
        if (!can_make_dynamic_p)
8976
0
    ((struct mips_elf_link_hash_entry *) h)->has_static_relocs = 1;
8977
8978
0
        if (!call_reloc_p)
8979
0
    h->pointer_equality_needed = 1;
8980
8981
        /* We must not create a stub for a symbol that has
8982
     relocations related to taking the function's address.
8983
     This doesn't apply to VxWorks, where CALL relocs refer
8984
     to a .got.plt entry instead of a normal .got entry.  */
8985
0
        if (htab->root.target_os != is_vxworks
8986
0
      && (!can_make_dynamic_p || !call_reloc_p))
8987
0
    ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = true;
8988
0
      }
8989
8990
    /* Relocations against the special VxWorks __GOTT_BASE__ and
8991
       __GOTT_INDEX__ symbols must be left to the loader.  Allocate
8992
       room for them in .rela.dyn.  */
8993
0
    if (is_gott_symbol (info, h))
8994
0
      {
8995
0
        if (sreloc == NULL)
8996
0
    {
8997
0
      sreloc = mips_elf_rel_dyn_section (info, true);
8998
0
      if (sreloc == NULL)
8999
0
        return false;
9000
0
    }
9001
0
        mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
9002
0
        if (MIPS_ELF_READONLY_SECTION (sec))
9003
    /* We tell the dynamic linker that there are
9004
       relocations against the text segment.  */
9005
0
    info->flags |= DF_TEXTREL;
9006
0
      }
9007
0
  }
9008
0
      else if (call_lo16_reloc_p (r_type)
9009
0
         || got_lo16_reloc_p (r_type)
9010
0
         || got_disp_reloc_p (r_type)
9011
0
         || (got16_reloc_p (r_type)
9012
0
       && htab->root.target_os == is_vxworks))
9013
0
  {
9014
    /* We may need a local GOT entry for this relocation.  We
9015
       don't count R_MIPS_GOT_PAGE because we can estimate the
9016
       maximum number of pages needed by looking at the size of
9017
       the segment.  Similar comments apply to R_MIPS*_GOT16 and
9018
       R_MIPS*_CALL16, except on VxWorks, where GOT relocations
9019
       always evaluate to "G".  We don't count R_MIPS_GOT_HI16, or
9020
       R_MIPS_CALL_HI16 because these are always followed by an
9021
       R_MIPS_GOT_LO16 or R_MIPS_CALL_LO16.  */
9022
0
    if (!mips_elf_record_local_got_symbol (abfd, r_symndx,
9023
0
             rel->r_addend, info, r_type))
9024
0
      return false;
9025
0
  }
9026
9027
0
      if (h != NULL
9028
0
    && mips_elf_relocation_needs_la25_stub (abfd, r_type,
9029
0
              ELF_ST_IS_MIPS16 (h->other)))
9030
0
  ((struct mips_elf_link_hash_entry *) h)->has_nonpic_branches = true;
9031
9032
0
      switch (r_type)
9033
0
  {
9034
0
  case R_MIPS_CALL16:
9035
0
  case R_MIPS16_CALL16:
9036
0
  case R_MICROMIPS_CALL16:
9037
0
    if (h == NULL)
9038
0
      {
9039
0
        _bfd_error_handler
9040
    /* xgettext:c-format */
9041
0
    (_("%pB: CALL16 reloc at %#" PRIx64 " not against global symbol"),
9042
0
     abfd, (uint64_t) rel->r_offset);
9043
0
        bfd_set_error (bfd_error_bad_value);
9044
0
        return false;
9045
0
      }
9046
    /* Fall through.  */
9047
9048
0
  case R_MIPS_CALL_HI16:
9049
0
  case R_MIPS_CALL_LO16:
9050
0
  case R_MICROMIPS_CALL_HI16:
9051
0
  case R_MICROMIPS_CALL_LO16:
9052
0
    if (h != NULL)
9053
0
      {
9054
        /* Make sure there is room in the regular GOT to hold the
9055
     function's address.  We may eliminate it in favour of
9056
     a .got.plt entry later; see mips_elf_count_got_symbols.  */
9057
0
        if (!mips_elf_record_global_got_symbol (h, abfd, info, true,
9058
0
                  r_type))
9059
0
    return false;
9060
9061
        /* We need a stub, not a plt entry for the undefined
9062
     function.  But we record it as if it needs plt.  See
9063
     _bfd_elf_adjust_dynamic_symbol.  */
9064
0
        h->needs_plt = 1;
9065
0
        h->type = STT_FUNC;
9066
0
      }
9067
0
    break;
9068
9069
0
  case R_MIPS_GOT_PAGE:
9070
0
  case R_MICROMIPS_GOT_PAGE:
9071
0
  case R_MIPS16_GOT16:
9072
0
  case R_MIPS_GOT16:
9073
0
  case R_MIPS_GOT_HI16:
9074
0
  case R_MIPS_GOT_LO16:
9075
0
  case R_MICROMIPS_GOT16:
9076
0
  case R_MICROMIPS_GOT_HI16:
9077
0
  case R_MICROMIPS_GOT_LO16:
9078
0
    if (!h || got_page_reloc_p (r_type))
9079
0
      {
9080
        /* This relocation needs (or may need, if h != NULL) a
9081
     page entry in the GOT.  For R_MIPS_GOT_PAGE we do not
9082
     know for sure until we know whether the symbol is
9083
     preemptible.  */
9084
0
        if (mips_elf_rel_relocation_p (abfd, sec, relocs, rel))
9085
0
    {
9086
0
      if (!mips_elf_get_section_contents (abfd, sec, &contents))
9087
0
        return false;
9088
0
      howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, false);
9089
0
      addend = mips_elf_read_rel_addend (abfd, sec, rel,
9090
0
                 howto, contents);
9091
0
      if (got16_reloc_p (r_type))
9092
0
        mips_elf_add_lo16_rel_addend (abfd, sec, rel, rel_end,
9093
0
              contents, &addend);
9094
0
      else
9095
0
        addend <<= howto->rightshift;
9096
0
    }
9097
0
        else
9098
0
    addend = rel->r_addend;
9099
0
        if (!mips_elf_record_got_page_ref (info, abfd, r_symndx,
9100
0
             h, addend))
9101
0
    return false;
9102
9103
0
        if (h)
9104
0
    {
9105
0
      struct mips_elf_link_hash_entry *hmips =
9106
0
        (struct mips_elf_link_hash_entry *) h;
9107
9108
      /* This symbol is definitely not overridable.  */
9109
0
      if (hmips->root.def_regular
9110
0
          && ! (bfd_link_pic (info) && ! info->symbolic
9111
0
          && ! hmips->root.forced_local))
9112
0
        h = NULL;
9113
0
    }
9114
0
      }
9115
    /* If this is a global, overridable symbol, GOT_PAGE will
9116
       decay to GOT_DISP, so we'll need a GOT entry for it.  */
9117
    /* Fall through.  */
9118
9119
0
  case R_MIPS_GOT_DISP:
9120
0
  case R_MICROMIPS_GOT_DISP:
9121
0
    if (h && !mips_elf_record_global_got_symbol (h, abfd, info,
9122
0
                   false, r_type))
9123
0
      return false;
9124
0
    break;
9125
9126
0
  case R_MIPS_TLS_GOTTPREL:
9127
0
  case R_MIPS16_TLS_GOTTPREL:
9128
0
  case R_MICROMIPS_TLS_GOTTPREL:
9129
0
    if (bfd_link_pic (info))
9130
0
      info->flags |= DF_STATIC_TLS;
9131
    /* Fall through */
9132
9133
0
  case R_MIPS_TLS_LDM:
9134
0
  case R_MIPS16_TLS_LDM:
9135
0
  case R_MICROMIPS_TLS_LDM:
9136
0
    if (tls_ldm_reloc_p (r_type))
9137
0
      {
9138
0
        r_symndx = STN_UNDEF;
9139
0
        h = NULL;
9140
0
      }
9141
    /* Fall through */
9142
9143
0
  case R_MIPS_TLS_GD:
9144
0
  case R_MIPS16_TLS_GD:
9145
0
  case R_MICROMIPS_TLS_GD:
9146
    /* This symbol requires a global offset table entry, or two
9147
       for TLS GD relocations.  */
9148
0
    if (h != NULL)
9149
0
      {
9150
0
        if (!mips_elf_record_global_got_symbol (h, abfd, info,
9151
0
                  false, r_type))
9152
0
    return false;
9153
0
      }
9154
0
    else
9155
0
      {
9156
0
        if (!mips_elf_record_local_got_symbol (abfd, r_symndx,
9157
0
                 rel->r_addend,
9158
0
                 info, r_type))
9159
0
    return false;
9160
0
      }
9161
0
    break;
9162
9163
0
  case R_MIPS_32:
9164
0
  case R_MIPS_REL32:
9165
0
  case R_MIPS_64:
9166
    /* In VxWorks executables, references to external symbols
9167
       are handled using copy relocs or PLT stubs, so there's
9168
       no need to add a .rela.dyn entry for this relocation.  */
9169
0
    if (can_make_dynamic_p)
9170
0
      {
9171
0
        if (sreloc == NULL)
9172
0
    {
9173
0
      sreloc = mips_elf_rel_dyn_section (info, true);
9174
0
      if (sreloc == NULL)
9175
0
        return false;
9176
0
    }
9177
0
        if (bfd_link_pic (info) && h == NULL)
9178
0
    {
9179
      /* When creating a shared object, we must copy these
9180
         reloc types into the output file as R_MIPS_REL32
9181
         relocs.  Make room for this reloc in .rel(a).dyn.  */
9182
0
      mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
9183
0
      if (MIPS_ELF_READONLY_SECTION (sec))
9184
        /* We tell the dynamic linker that there are
9185
           relocations against the text segment.  */
9186
0
        info->flags |= DF_TEXTREL;
9187
0
    }
9188
0
        else
9189
0
    {
9190
0
      struct mips_elf_link_hash_entry *hmips;
9191
9192
      /* For a shared object, we must copy this relocation
9193
         unless the symbol turns out to be undefined and
9194
         weak with non-default visibility, in which case
9195
         it will be left as zero.
9196
9197
         We could elide R_MIPS_REL32 for locally binding symbols
9198
         in shared libraries, but do not yet do so.
9199
9200
         For an executable, we only need to copy this
9201
         reloc if the symbol is defined in a dynamic
9202
         object.  */
9203
0
      hmips = (struct mips_elf_link_hash_entry *) h;
9204
0
      ++hmips->possibly_dynamic_relocs;
9205
0
      if (MIPS_ELF_READONLY_SECTION (sec))
9206
        /* We need it to tell the dynamic linker if there
9207
           are relocations against the text segment.  */
9208
0
        hmips->readonly_reloc = true;
9209
0
    }
9210
0
      }
9211
9212
0
    if (SGI_COMPAT (abfd))
9213
0
      mips_elf_hash_table (info)->compact_rel_size +=
9214
0
        sizeof (Elf32_External_crinfo);
9215
0
    break;
9216
9217
0
  case R_MIPS_26:
9218
0
  case R_MIPS_GPREL16:
9219
0
  case R_MIPS_LITERAL:
9220
0
  case R_MIPS_GPREL32:
9221
0
  case R_MICROMIPS_26_S1:
9222
0
  case R_MICROMIPS_GPREL16:
9223
0
  case R_MICROMIPS_LITERAL:
9224
0
  case R_MICROMIPS_GPREL7_S2:
9225
0
    if (SGI_COMPAT (abfd))
9226
0
      mips_elf_hash_table (info)->compact_rel_size +=
9227
0
        sizeof (Elf32_External_crinfo);
9228
0
    break;
9229
9230
    /* This relocation describes the C++ object vtable hierarchy.
9231
       Reconstruct it for later use during GC.  */
9232
0
  case R_MIPS_GNU_VTINHERIT:
9233
0
    if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
9234
0
      return false;
9235
0
    break;
9236
9237
    /* This relocation describes which C++ vtable entries are actually
9238
       used.  Record for later use during GC.  */
9239
0
  case R_MIPS_GNU_VTENTRY:
9240
0
    if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
9241
0
      return false;
9242
0
    break;
9243
9244
0
  default:
9245
0
    break;
9246
0
  }
9247
9248
      /* Record the need for a PLT entry.  At this point we don't know
9249
   yet if we are going to create a PLT in the first place, but
9250
   we only record whether the relocation requires a standard MIPS
9251
   or a compressed code entry anyway.  If we don't make a PLT after
9252
   all, then we'll just ignore these arrangements.  Likewise if
9253
   a PLT entry is not created because the symbol is satisfied
9254
   locally.  */
9255
0
      if (h != NULL
9256
0
    && (branch_reloc_p (r_type)
9257
0
        || mips16_branch_reloc_p (r_type)
9258
0
        || micromips_branch_reloc_p (r_type))
9259
0
    && !SYMBOL_CALLS_LOCAL (info, h))
9260
0
  {
9261
0
    if (h->plt.plist == NULL)
9262
0
      h->plt.plist = mips_elf_make_plt_record (abfd);
9263
0
    if (h->plt.plist == NULL)
9264
0
      return false;
9265
9266
0
    if (branch_reloc_p (r_type))
9267
0
      h->plt.plist->need_mips = true;
9268
0
    else
9269
0
      h->plt.plist->need_comp = true;
9270
0
  }
9271
9272
      /* See if this reloc would need to refer to a MIPS16 hard-float stub,
9273
   if there is one.  We only need to handle global symbols here;
9274
   we decide whether to keep or delete stubs for local symbols
9275
   when processing the stub's relocations.  */
9276
0
      if (h != NULL
9277
0
    && !mips16_call_reloc_p (r_type)
9278
0
    && !section_allows_mips16_refs_p (sec))
9279
0
  {
9280
0
    struct mips_elf_link_hash_entry *mh;
9281
9282
0
    mh = (struct mips_elf_link_hash_entry *) h;
9283
0
    mh->need_fn_stub = true;
9284
0
  }
9285
9286
      /* Refuse some position-dependent relocations when creating a
9287
   shared library.  Do not refuse R_MIPS_32 / R_MIPS_64; they're
9288
   not PIC, but we can create dynamic relocations and the result
9289
   will be fine.  Also do not refuse R_MIPS_LO16, which can be
9290
   combined with R_MIPS_GOT16.  */
9291
0
      if (bfd_link_pic (info))
9292
0
  {
9293
0
    switch (r_type)
9294
0
      {
9295
0
      case R_MIPS_TLS_TPREL_HI16:
9296
0
      case R_MIPS16_TLS_TPREL_HI16:
9297
0
      case R_MICROMIPS_TLS_TPREL_HI16:
9298
0
      case R_MIPS_TLS_TPREL_LO16:
9299
0
      case R_MIPS16_TLS_TPREL_LO16:
9300
0
      case R_MICROMIPS_TLS_TPREL_LO16:
9301
        /* These are okay in PIE, but not in a shared library.  */
9302
0
        if (bfd_link_executable (info))
9303
0
    break;
9304
9305
        /* FALLTHROUGH */
9306
9307
0
      case R_MIPS16_HI16:
9308
0
      case R_MIPS_HI16:
9309
0
      case R_MIPS_HIGHER:
9310
0
      case R_MIPS_HIGHEST:
9311
0
      case R_MICROMIPS_HI16:
9312
0
      case R_MICROMIPS_HIGHER:
9313
0
      case R_MICROMIPS_HIGHEST:
9314
        /* Don't refuse a high part relocation if it's against
9315
     no symbol (e.g. part of a compound relocation).  */
9316
0
        if (r_symndx == STN_UNDEF)
9317
0
    break;
9318
9319
        /* Likewise an absolute symbol.  */
9320
0
        if (h != NULL && bfd_is_abs_symbol (&h->root))
9321
0
    break;
9322
9323
        /* R_MIPS_HI16 against _gp_disp is used for $gp setup,
9324
     and has a special meaning.  */
9325
0
        if (!NEWABI_P (abfd) && h != NULL
9326
0
      && strcmp (h->root.root.string, "_gp_disp") == 0)
9327
0
    break;
9328
9329
        /* Likewise __GOTT_BASE__ and __GOTT_INDEX__ on VxWorks.  */
9330
0
        if (is_gott_symbol (info, h))
9331
0
    break;
9332
9333
        /* FALLTHROUGH */
9334
9335
0
      case R_MIPS16_26:
9336
0
      case R_MIPS_26:
9337
0
      case R_MICROMIPS_26_S1:
9338
0
        howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, NEWABI_P (abfd));
9339
        /* An error for unsupported relocations is raised as part
9340
     of the above search, so we can skip the following.  */
9341
0
        if (howto != NULL)
9342
0
    info->callbacks->einfo
9343
      /* xgettext:c-format */
9344
0
      (_("%X%H: relocation %s against `%s' cannot be used"
9345
0
         " when making a shared object; recompile with -fPIC\n"),
9346
0
       abfd, sec, rel->r_offset, howto->name,
9347
0
       (h) ? h->root.root.string : "a local symbol");
9348
0
        break;
9349
0
      default:
9350
0
        break;
9351
0
      }
9352
0
  }
9353
0
    }
9354
9355
0
  return true;
9356
0
}
9357

9358
/* Allocate space for global sym dynamic relocs.  */
9359
9360
static bool
9361
allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
9362
0
{
9363
0
  struct bfd_link_info *info = inf;
9364
0
  bfd *dynobj;
9365
0
  struct mips_elf_link_hash_entry *hmips;
9366
0
  struct mips_elf_link_hash_table *htab;
9367
9368
0
  htab = mips_elf_hash_table (info);
9369
0
  BFD_ASSERT (htab != NULL);
9370
9371
0
  dynobj = elf_hash_table (info)->dynobj;
9372
0
  hmips = (struct mips_elf_link_hash_entry *) h;
9373
9374
  /* VxWorks executables are handled elsewhere; we only need to
9375
     allocate relocations in shared objects.  */
9376
0
  if (htab->root.target_os == is_vxworks && !bfd_link_pic (info))
9377
0
    return true;
9378
9379
  /* Ignore indirect symbols.  All relocations against such symbols
9380
     will be redirected to the target symbol.  */
9381
0
  if (h->root.type == bfd_link_hash_indirect)
9382
0
    return true;
9383
9384
  /* If this symbol is defined in a dynamic object, or we are creating
9385
     a shared library, we will need to copy any R_MIPS_32 or
9386
     R_MIPS_REL32 relocs against it into the output file.  */
9387
0
  if (! bfd_link_relocatable (info)
9388
0
      && hmips->possibly_dynamic_relocs != 0
9389
0
      && (h->root.type == bfd_link_hash_defweak
9390
0
    || (!h->def_regular && !ELF_COMMON_DEF_P (h))
9391
0
    || bfd_link_pic (info)))
9392
0
    {
9393
0
      bool do_copy = true;
9394
9395
0
      if (h->root.type == bfd_link_hash_undefweak)
9396
0
  {
9397
    /* Do not copy relocations for undefined weak symbols that
9398
       we are not going to export.  */
9399
0
    if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
9400
0
      do_copy = false;
9401
9402
    /* Make sure undefined weak symbols are output as a dynamic
9403
       symbol in PIEs.  */
9404
0
    else if (h->dynindx == -1 && !h->forced_local)
9405
0
      {
9406
0
        if (! bfd_elf_link_record_dynamic_symbol (info, h))
9407
0
    return false;
9408
0
      }
9409
0
  }
9410
9411
0
      if (do_copy)
9412
0
  {
9413
    /* Even though we don't directly need a GOT entry for this symbol,
9414
       the SVR4 psABI requires it to have a dynamic symbol table
9415
       index greater that DT_MIPS_GOTSYM if there are dynamic
9416
       relocations against it.
9417
9418
       VxWorks does not enforce the same mapping between the GOT
9419
       and the symbol table, so the same requirement does not
9420
       apply there.  */
9421
0
    if (htab->root.target_os != is_vxworks)
9422
0
      {
9423
0
        if (hmips->global_got_area > GGA_RELOC_ONLY)
9424
0
    hmips->global_got_area = GGA_RELOC_ONLY;
9425
0
        hmips->got_only_for_calls = false;
9426
0
      }
9427
9428
0
    mips_elf_allocate_dynamic_relocations
9429
0
      (dynobj, info, hmips->possibly_dynamic_relocs);
9430
0
    if (hmips->readonly_reloc)
9431
      /* We tell the dynamic linker that there are relocations
9432
         against the text segment.  */
9433
0
      info->flags |= DF_TEXTREL;
9434
0
  }
9435
0
    }
9436
9437
0
  return true;
9438
0
}
9439
9440
/* Adjust a symbol defined by a dynamic object and referenced by a
9441
   regular object.  The current definition is in some section of the
9442
   dynamic object, but we're not including those sections.  We have to
9443
   change the definition to something the rest of the link can
9444
   understand.  */
9445
9446
bool
9447
_bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
9448
             struct elf_link_hash_entry *h)
9449
0
{
9450
0
  bfd *dynobj;
9451
0
  struct mips_elf_link_hash_entry *hmips;
9452
0
  struct mips_elf_link_hash_table *htab;
9453
0
  asection *s, *srel;
9454
9455
0
  htab = mips_elf_hash_table (info);
9456
0
  BFD_ASSERT (htab != NULL);
9457
9458
0
  dynobj = elf_hash_table (info)->dynobj;
9459
0
  hmips = (struct mips_elf_link_hash_entry *) h;
9460
9461
  /* Make sure we know what is going on here.  */
9462
0
  if (dynobj == NULL
9463
0
      || (! h->needs_plt
9464
0
    && ! h->is_weakalias
9465
0
    && (! h->def_dynamic
9466
0
        || ! h->ref_regular
9467
0
        || h->def_regular)))
9468
0
    {
9469
0
      if (h->type == STT_GNU_IFUNC)
9470
0
  _bfd_error_handler (_("IFUNC symbol %s in dynamic symbol table - IFUNCS are not supported"),
9471
0
          h->root.root.string);
9472
0
      else
9473
0
  _bfd_error_handler (_("non-dynamic symbol %s in dynamic symbol table"),
9474
0
          h->root.root.string);
9475
0
      return true;
9476
0
    }
9477
9478
0
  hmips = (struct mips_elf_link_hash_entry *) h;
9479
9480
  /* If there are call relocations against an externally-defined symbol,
9481
     see whether we can create a MIPS lazy-binding stub for it.  We can
9482
     only do this if all references to the function are through call
9483
     relocations, and in that case, the traditional lazy-binding stubs
9484
     are much more efficient than PLT entries.
9485
9486
     Traditional stubs are only available on SVR4 psABI-based systems;
9487
     VxWorks always uses PLTs instead.  */
9488
0
  if (htab->root.target_os != is_vxworks
9489
0
      && h->needs_plt
9490
0
      && !hmips->no_fn_stub)
9491
0
    {
9492
0
      if (! elf_hash_table (info)->dynamic_sections_created)
9493
0
  return true;
9494
9495
      /* If this symbol is not defined in a regular file, then set
9496
   the symbol to the stub location.  This is required to make
9497
   function pointers compare as equal between the normal
9498
   executable and the shared library.  */
9499
0
      if (!h->def_regular
9500
0
    && !bfd_is_abs_section (htab->sstubs->output_section))
9501
0
  {
9502
0
    hmips->needs_lazy_stub = true;
9503
0
    htab->lazy_stub_count++;
9504
0
    return true;
9505
0
  }
9506
0
    }
9507
  /* As above, VxWorks requires PLT entries for externally-defined
9508
     functions that are only accessed through call relocations.
9509
9510
     Both VxWorks and non-VxWorks targets also need PLT entries if there
9511
     are static-only relocations against an externally-defined function.
9512
     This can technically occur for shared libraries if there are
9513
     branches to the symbol, although it is unlikely that this will be
9514
     used in practice due to the short ranges involved.  It can occur
9515
     for any relative or absolute relocation in executables; in that
9516
     case, the PLT entry becomes the function's canonical address.  */
9517
0
  else if (((h->needs_plt && !hmips->no_fn_stub)
9518
0
      || (h->type == STT_FUNC && hmips->has_static_relocs))
9519
0
     && htab->use_plts_and_copy_relocs
9520
0
     && !SYMBOL_CALLS_LOCAL (info, h)
9521
0
     && !(ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
9522
0
    && h->root.type == bfd_link_hash_undefweak))
9523
0
    {
9524
0
      bool micromips_p = MICROMIPS_P (info->output_bfd);
9525
0
      bool newabi_p = NEWABI_P (info->output_bfd);
9526
9527
      /* If this is the first symbol to need a PLT entry, then make some
9528
   basic setup.  Also work out PLT entry sizes.  We'll need them
9529
   for PLT offset calculations.  */
9530
0
      if (htab->plt_mips_offset + htab->plt_comp_offset == 0)
9531
0
  {
9532
0
    BFD_ASSERT (htab->root.sgotplt->size == 0);
9533
0
    BFD_ASSERT (htab->plt_got_index == 0);
9534
9535
    /* If we're using the PLT additions to the psABI, each PLT
9536
       entry is 16 bytes and the PLT0 entry is 32 bytes.
9537
       Encourage better cache usage by aligning.  We do this
9538
       lazily to avoid pessimizing traditional objects.  */
9539
0
    if (htab->root.target_os != is_vxworks
9540
0
        && !bfd_link_align_section (htab->root.splt, 5))
9541
0
      return false;
9542
9543
    /* Make sure that .got.plt is word-aligned.  We do this lazily
9544
       for the same reason as above.  */
9545
0
    if (!bfd_link_align_section (htab->root.sgotplt,
9546
0
               MIPS_ELF_LOG_FILE_ALIGN (dynobj)))
9547
0
      return false;
9548
9549
    /* On non-VxWorks targets, the first two entries in .got.plt
9550
       are reserved.  */
9551
0
    if (htab->root.target_os != is_vxworks)
9552
0
      htab->plt_got_index
9553
0
        += (get_elf_backend_data (dynobj)->got_header_size
9554
0
      / MIPS_ELF_GOT_SIZE (dynobj));
9555
9556
    /* On VxWorks, also allocate room for the header's
9557
       .rela.plt.unloaded entries.  */
9558
0
    if (htab->root.target_os == is_vxworks
9559
0
        && !bfd_link_pic (info))
9560
0
      htab->srelplt2->size += 2 * sizeof (Elf32_External_Rela);
9561
9562
    /* Now work out the sizes of individual PLT entries.  */
9563
0
    if (htab->root.target_os == is_vxworks
9564
0
        && bfd_link_pic (info))
9565
0
      htab->plt_mips_entry_size
9566
0
        = 4 * ARRAY_SIZE (mips_vxworks_shared_plt_entry);
9567
0
    else if (htab->root.target_os == is_vxworks)
9568
0
      htab->plt_mips_entry_size
9569
0
        = 4 * ARRAY_SIZE (mips_vxworks_exec_plt_entry);
9570
0
    else if (newabi_p)
9571
0
      htab->plt_mips_entry_size
9572
0
        = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9573
0
    else if (!micromips_p)
9574
0
      {
9575
0
        htab->plt_mips_entry_size
9576
0
    = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9577
0
        htab->plt_comp_entry_size
9578
0
    = 2 * ARRAY_SIZE (mips16_o32_exec_plt_entry);
9579
0
      }
9580
0
    else if (htab->insn32)
9581
0
      {
9582
0
        htab->plt_mips_entry_size
9583
0
    = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9584
0
        htab->plt_comp_entry_size
9585
0
    = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt_entry);
9586
0
      }
9587
0
    else
9588
0
      {
9589
0
        htab->plt_mips_entry_size
9590
0
    = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9591
0
        htab->plt_comp_entry_size
9592
0
    = 2 * ARRAY_SIZE (micromips_o32_exec_plt_entry);
9593
0
      }
9594
0
  }
9595
9596
0
      if (h->plt.plist == NULL)
9597
0
  h->plt.plist = mips_elf_make_plt_record (dynobj);
9598
0
      if (h->plt.plist == NULL)
9599
0
  return false;
9600
9601
      /* There are no defined MIPS16 or microMIPS PLT entries for VxWorks,
9602
   n32 or n64, so always use a standard entry there.
9603
9604
   If the symbol has a MIPS16 call stub and gets a PLT entry, then
9605
   all MIPS16 calls will go via that stub, and there is no benefit
9606
   to having a MIPS16 entry.  And in the case of call_stub a
9607
   standard entry actually has to be used as the stub ends with a J
9608
   instruction.  */
9609
0
      if (newabi_p
9610
0
    || htab->root.target_os == is_vxworks
9611
0
    || hmips->call_stub
9612
0
    || hmips->call_fp_stub)
9613
0
  {
9614
0
    h->plt.plist->need_mips = true;
9615
0
    h->plt.plist->need_comp = false;
9616
0
  }
9617
9618
      /* Otherwise, if there are no direct calls to the function, we
9619
   have a free choice of whether to use standard or compressed
9620
   entries.  Prefer microMIPS entries if the object is known to
9621
   contain microMIPS code, so that it becomes possible to create
9622
   pure microMIPS binaries.  Prefer standard entries otherwise,
9623
   because MIPS16 ones are no smaller and are usually slower.  */
9624
0
      if (!h->plt.plist->need_mips && !h->plt.plist->need_comp)
9625
0
  {
9626
0
    if (micromips_p)
9627
0
      h->plt.plist->need_comp = true;
9628
0
    else
9629
0
      h->plt.plist->need_mips = true;
9630
0
  }
9631
9632
0
      if (h->plt.plist->need_mips)
9633
0
  {
9634
0
    h->plt.plist->mips_offset = htab->plt_mips_offset;
9635
0
    htab->plt_mips_offset += htab->plt_mips_entry_size;
9636
0
  }
9637
0
      if (h->plt.plist->need_comp)
9638
0
  {
9639
0
    h->plt.plist->comp_offset = htab->plt_comp_offset;
9640
0
    htab->plt_comp_offset += htab->plt_comp_entry_size;
9641
0
  }
9642
9643
      /* Reserve the corresponding .got.plt entry now too.  */
9644
0
      h->plt.plist->gotplt_index = htab->plt_got_index++;
9645
9646
      /* If the output file has no definition of the symbol, set the
9647
   symbol's value to the address of the stub.  */
9648
0
      if (!bfd_link_pic (info) && !h->def_regular)
9649
0
  hmips->use_plt_entry = true;
9650
9651
      /* Make room for the R_MIPS_JUMP_SLOT relocation.  */
9652
0
      htab->root.srelplt->size += (htab->root.target_os == is_vxworks
9653
0
           ? MIPS_ELF_RELA_SIZE (dynobj)
9654
0
           : MIPS_ELF_REL_SIZE (dynobj));
9655
9656
      /* Make room for the .rela.plt.unloaded relocations.  */
9657
0
      if (htab->root.target_os == is_vxworks && !bfd_link_pic (info))
9658
0
  htab->srelplt2->size += 3 * sizeof (Elf32_External_Rela);
9659
9660
      /* All relocations against this symbol that could have been made
9661
   dynamic will now refer to the PLT entry instead.  */
9662
0
      hmips->possibly_dynamic_relocs = 0;
9663
9664
0
      return true;
9665
0
    }
9666
9667
  /* If this is a weak symbol, and there is a real definition, the
9668
     processor independent code will have arranged for us to see the
9669
     real definition first, and we can just use the same value.  */
9670
0
  if (h->is_weakalias)
9671
0
    {
9672
0
      struct elf_link_hash_entry *def = weakdef (h);
9673
0
      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
9674
0
      h->root.u.def.section = def->root.u.def.section;
9675
0
      h->root.u.def.value = def->root.u.def.value;
9676
0
      return true;
9677
0
    }
9678
9679
  /* Otherwise, there is nothing further to do for symbols defined
9680
     in regular objects.  */
9681
0
  if (h->def_regular)
9682
0
    return true;
9683
9684
  /* There's also nothing more to do if we'll convert all relocations
9685
     against this symbol into dynamic relocations.  */
9686
0
  if (!hmips->has_static_relocs)
9687
0
    return true;
9688
9689
  /* We're now relying on copy relocations.  Complain if we have
9690
     some that we can't convert.  */
9691
0
  if (!htab->use_plts_and_copy_relocs || bfd_link_pic (info))
9692
0
    {
9693
0
      _bfd_error_handler (_("non-dynamic relocations refer to "
9694
0
          "dynamic symbol %s"),
9695
0
        h->root.root.string);
9696
0
      bfd_set_error (bfd_error_bad_value);
9697
0
      return false;
9698
0
    }
9699
9700
  /* We must allocate the symbol in our .dynbss section, which will
9701
     become part of the .bss section of the executable.  There will be
9702
     an entry for this symbol in the .dynsym section.  The dynamic
9703
     object will contain position independent code, so all references
9704
     from the dynamic object to this symbol will go through the global
9705
     offset table.  The dynamic linker will use the .dynsym entry to
9706
     determine the address it must put in the global offset table, so
9707
     both the dynamic object and the regular object will refer to the
9708
     same memory location for the variable.  */
9709
9710
0
  if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
9711
0
    {
9712
0
      s = htab->root.sdynrelro;
9713
0
      srel = htab->root.sreldynrelro;
9714
0
    }
9715
0
  else
9716
0
    {
9717
0
      s = htab->root.sdynbss;
9718
0
      srel = htab->root.srelbss;
9719
0
    }
9720
0
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
9721
0
    {
9722
0
      if (htab->root.target_os == is_vxworks)
9723
0
  srel->size += sizeof (Elf32_External_Rela);
9724
0
      else
9725
0
  mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
9726
0
      h->needs_copy = 1;
9727
0
    }
9728
9729
  /* All relocations against this symbol that could have been made
9730
     dynamic will now refer to the local copy instead.  */
9731
0
  hmips->possibly_dynamic_relocs = 0;
9732
9733
0
  return _bfd_elf_adjust_dynamic_copy (info, h, s);
9734
0
}
9735

9736
/* If the link uses a GOT, lay it out and work out its size.  */
9737
9738
static bool
9739
mips_elf_lay_out_got (bfd *output_bfd, struct bfd_link_info *info)
9740
0
{
9741
0
  bfd *dynobj;
9742
0
  asection *s;
9743
0
  struct mips_got_info *g;
9744
0
  bfd_size_type loadable_size = 0;
9745
0
  bfd_size_type page_gotno;
9746
0
  bfd *ibfd;
9747
0
  struct mips_elf_traverse_got_arg tga;
9748
0
  struct mips_elf_link_hash_table *htab;
9749
9750
0
  htab = mips_elf_hash_table (info);
9751
0
  BFD_ASSERT (htab != NULL);
9752
9753
0
  s = htab->root.sgot;
9754
0
  if (s == NULL)
9755
0
    return true;
9756
9757
0
  dynobj = elf_hash_table (info)->dynobj;
9758
0
  g = htab->got_info;
9759
9760
  /* Allocate room for the reserved entries.  VxWorks always reserves
9761
     3 entries; other objects only reserve 2 entries.  */
9762
0
  BFD_ASSERT (g->assigned_low_gotno == 0);
9763
0
  if (htab->root.target_os == is_vxworks)
9764
0
    htab->reserved_gotno = 3;
9765
0
  else
9766
0
    htab->reserved_gotno = 2;
9767
0
  g->local_gotno += htab->reserved_gotno;
9768
0
  g->assigned_low_gotno = htab->reserved_gotno;
9769
9770
  /* Decide which symbols need to go in the global part of the GOT and
9771
     count the number of reloc-only GOT symbols.  */
9772
0
  mips_elf_link_hash_traverse (htab, mips_elf_count_got_symbols, info);
9773
9774
0
  if (!mips_elf_resolve_final_got_entries (info, g))
9775
0
    return false;
9776
9777
  /* Calculate the total loadable size of the output.  That
9778
     will give us the maximum number of GOT_PAGE entries
9779
     required.  */
9780
0
  for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
9781
0
    {
9782
0
      asection *subsection;
9783
9784
0
      for (subsection = ibfd->sections;
9785
0
     subsection;
9786
0
     subsection = subsection->next)
9787
0
  {
9788
0
    if ((subsection->flags & SEC_ALLOC) == 0)
9789
0
      continue;
9790
0
    loadable_size += ((subsection->size + 0xf)
9791
0
          &~ (bfd_size_type) 0xf);
9792
0
  }
9793
0
    }
9794
9795
0
  if (htab->root.target_os == is_vxworks)
9796
    /* There's no need to allocate page entries for VxWorks; R_MIPS*_GOT16
9797
       relocations against local symbols evaluate to "G", and the EABI does
9798
       not include R_MIPS_GOT_PAGE.  */
9799
0
    page_gotno = 0;
9800
0
  else
9801
    /* Assume there are two loadable segments consisting of contiguous
9802
       sections.  Is 5 enough?  */
9803
0
    page_gotno = (loadable_size >> 16) + 5;
9804
9805
  /* Choose the smaller of the two page estimates; both are intended to be
9806
     conservative.  */
9807
0
  if (page_gotno > g->page_gotno)
9808
0
    page_gotno = g->page_gotno;
9809
9810
0
  g->local_gotno += page_gotno;
9811
0
  g->assigned_high_gotno = g->local_gotno - 1;
9812
9813
0
  s->size += g->local_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
9814
0
  s->size += g->global_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
9815
0
  s->size += g->tls_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
9816
9817
  /* VxWorks does not support multiple GOTs.  It initializes $gp to
9818
     __GOTT_BASE__[__GOTT_INDEX__], the value of which is set by the
9819
     dynamic loader.  */
9820
0
  if (htab->root.target_os != is_vxworks
9821
0
      && s->size > MIPS_ELF_GOT_MAX_SIZE (info))
9822
0
    {
9823
0
      if (!mips_elf_multi_got (output_bfd, info, s, page_gotno))
9824
0
  return false;
9825
0
    }
9826
0
  else
9827
0
    {
9828
      /* Record that all bfds use G.  This also has the effect of freeing
9829
   the per-bfd GOTs, which we no longer need.  */
9830
0
      for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
9831
0
  if (mips_elf_bfd_got (ibfd, false))
9832
0
    mips_elf_replace_bfd_got (ibfd, g);
9833
0
      mips_elf_replace_bfd_got (output_bfd, g);
9834
9835
      /* Set up TLS entries.  */
9836
0
      g->tls_assigned_gotno = g->global_gotno + g->local_gotno;
9837
0
      tga.info = info;
9838
0
      tga.g = g;
9839
0
      tga.value = MIPS_ELF_GOT_SIZE (output_bfd);
9840
0
      htab_traverse (g->got_entries, mips_elf_initialize_tls_index, &tga);
9841
0
      if (!tga.g)
9842
0
  return false;
9843
0
      BFD_ASSERT (g->tls_assigned_gotno
9844
0
      == g->global_gotno + g->local_gotno + g->tls_gotno);
9845
9846
      /* Each VxWorks GOT entry needs an explicit relocation.  */
9847
0
      if (htab->root.target_os == is_vxworks && bfd_link_pic (info))
9848
0
  g->relocs += g->global_gotno + g->local_gotno - htab->reserved_gotno;
9849
9850
      /* Allocate room for the TLS relocations.  */
9851
0
      if (g->relocs)
9852
0
  mips_elf_allocate_dynamic_relocations (dynobj, info, g->relocs);
9853
0
    }
9854
9855
0
  return true;
9856
0
}
9857
9858
/* Estimate the size of the .MIPS.stubs section.  */
9859
9860
static void
9861
mips_elf_estimate_stub_size (bfd *output_bfd, struct bfd_link_info *info)
9862
0
{
9863
0
  struct mips_elf_link_hash_table *htab;
9864
0
  bfd_size_type dynsymcount;
9865
9866
0
  htab = mips_elf_hash_table (info);
9867
0
  BFD_ASSERT (htab != NULL);
9868
9869
0
  if (htab->lazy_stub_count == 0)
9870
0
    return;
9871
9872
  /* IRIX rld assumes that a function stub isn't at the end of the .text
9873
     section, so add a dummy entry to the end.  */
9874
0
  htab->lazy_stub_count++;
9875
9876
  /* Get a worst-case estimate of the number of dynamic symbols needed.
9877
     At this point, dynsymcount does not account for section symbols
9878
     and count_section_dynsyms may overestimate the number that will
9879
     be needed.  */
9880
0
  dynsymcount = (elf_hash_table (info)->dynsymcount
9881
0
     + count_section_dynsyms (output_bfd, info));
9882
9883
  /* Determine the size of one stub entry.  There's no disadvantage
9884
     from using microMIPS code here, so for the sake of pure-microMIPS
9885
     binaries we prefer it whenever there's any microMIPS code in
9886
     output produced at all.  This has a benefit of stubs being
9887
     shorter by 4 bytes each too, unless in the insn32 mode.  */
9888
0
  if (!MICROMIPS_P (output_bfd))
9889
0
    htab->function_stub_size = (dynsymcount > 0x10000
9890
0
        ? MIPS_FUNCTION_STUB_BIG_SIZE
9891
0
        : MIPS_FUNCTION_STUB_NORMAL_SIZE);
9892
0
  else if (htab->insn32)
9893
0
    htab->function_stub_size = (dynsymcount > 0x10000
9894
0
        ? MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE
9895
0
        : MICROMIPS_INSN32_FUNCTION_STUB_NORMAL_SIZE);
9896
0
  else
9897
0
    htab->function_stub_size = (dynsymcount > 0x10000
9898
0
        ? MICROMIPS_FUNCTION_STUB_BIG_SIZE
9899
0
        : MICROMIPS_FUNCTION_STUB_NORMAL_SIZE);
9900
9901
0
  htab->sstubs->size = htab->lazy_stub_count * htab->function_stub_size;
9902
0
}
9903
9904
/* A mips_elf_link_hash_traverse callback for which DATA points to a
9905
   mips_htab_traverse_info.  If H needs a traditional MIPS lazy-binding
9906
   stub, allocate an entry in the stubs section.  */
9907
9908
static bool
9909
mips_elf_allocate_lazy_stub (struct mips_elf_link_hash_entry *h, void *data)
9910
0
{
9911
0
  struct mips_htab_traverse_info *hti = data;
9912
0
  struct mips_elf_link_hash_table *htab;
9913
0
  struct bfd_link_info *info;
9914
0
  bfd *output_bfd;
9915
9916
0
  info = hti->info;
9917
0
  output_bfd = hti->output_bfd;
9918
0
  htab = mips_elf_hash_table (info);
9919
0
  BFD_ASSERT (htab != NULL);
9920
9921
0
  if (h->needs_lazy_stub)
9922
0
    {
9923
0
      bool micromips_p = MICROMIPS_P (output_bfd);
9924
0
      unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9925
0
      bfd_vma isa_bit = micromips_p;
9926
9927
0
      BFD_ASSERT (htab->root.dynobj != NULL);
9928
0
      if (h->root.plt.plist == NULL)
9929
0
  h->root.plt.plist = mips_elf_make_plt_record (htab->sstubs->owner);
9930
0
      if (h->root.plt.plist == NULL)
9931
0
  {
9932
0
    hti->error = true;
9933
0
    return false;
9934
0
  }
9935
0
      h->root.root.u.def.section = htab->sstubs;
9936
0
      h->root.root.u.def.value = htab->sstubs->size + isa_bit;
9937
0
      h->root.plt.plist->stub_offset = htab->sstubs->size;
9938
0
      h->root.other = other;
9939
0
      htab->sstubs->size += htab->function_stub_size;
9940
0
    }
9941
0
  return true;
9942
0
}
9943
9944
/* Allocate offsets in the stubs section to each symbol that needs one.
9945
   Set the final size of the .MIPS.stub section.  */
9946
9947
static bool
9948
mips_elf_lay_out_lazy_stubs (struct bfd_link_info *info)
9949
0
{
9950
0
  bfd *output_bfd = info->output_bfd;
9951
0
  bool micromips_p = MICROMIPS_P (output_bfd);
9952
0
  unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9953
0
  bfd_vma isa_bit = micromips_p;
9954
0
  struct mips_elf_link_hash_table *htab;
9955
0
  struct mips_htab_traverse_info hti;
9956
0
  struct elf_link_hash_entry *h;
9957
0
  bfd *dynobj;
9958
9959
0
  htab = mips_elf_hash_table (info);
9960
0
  BFD_ASSERT (htab != NULL);
9961
9962
0
  if (htab->lazy_stub_count == 0)
9963
0
    return true;
9964
9965
0
  htab->sstubs->size = 0;
9966
0
  hti.info = info;
9967
0
  hti.output_bfd = output_bfd;
9968
0
  hti.error = false;
9969
0
  mips_elf_link_hash_traverse (htab, mips_elf_allocate_lazy_stub, &hti);
9970
0
  if (hti.error)
9971
0
    return false;
9972
0
  htab->sstubs->size += htab->function_stub_size;
9973
0
  BFD_ASSERT (htab->sstubs->size
9974
0
        == htab->lazy_stub_count * htab->function_stub_size);
9975
9976
0
  dynobj = elf_hash_table (info)->dynobj;
9977
0
  BFD_ASSERT (dynobj != NULL);
9978
0
  h = _bfd_elf_define_linkage_sym (dynobj, info, htab->sstubs, "_MIPS_STUBS_");
9979
0
  if (h == NULL)
9980
0
    return false;
9981
0
  h->root.u.def.value = isa_bit;
9982
0
  h->other = other;
9983
0
  h->type = STT_FUNC;
9984
9985
0
  return true;
9986
0
}
9987
9988
/* A mips_elf_link_hash_traverse callback for which DATA points to a
9989
   bfd_link_info.  If H uses the address of a PLT entry as the value
9990
   of the symbol, then set the entry in the symbol table now.  Prefer
9991
   a standard MIPS PLT entry.  */
9992
9993
static bool
9994
mips_elf_set_plt_sym_value (struct mips_elf_link_hash_entry *h, void *data)
9995
0
{
9996
0
  struct bfd_link_info *info = data;
9997
0
  bool micromips_p = MICROMIPS_P (info->output_bfd);
9998
0
  struct mips_elf_link_hash_table *htab;
9999
0
  unsigned int other;
10000
0
  bfd_vma isa_bit;
10001
0
  bfd_vma val;
10002
10003
0
  htab = mips_elf_hash_table (info);
10004
0
  BFD_ASSERT (htab != NULL);
10005
10006
0
  if (h->use_plt_entry)
10007
0
    {
10008
0
      BFD_ASSERT (h->root.plt.plist != NULL);
10009
0
      BFD_ASSERT (h->root.plt.plist->mips_offset != MINUS_ONE
10010
0
      || h->root.plt.plist->comp_offset != MINUS_ONE);
10011
10012
0
      val = htab->plt_header_size;
10013
0
      if (h->root.plt.plist->mips_offset != MINUS_ONE)
10014
0
  {
10015
0
    isa_bit = 0;
10016
0
    val += h->root.plt.plist->mips_offset;
10017
0
    other = 0;
10018
0
  }
10019
0
      else
10020
0
  {
10021
0
    isa_bit = 1;
10022
0
    val += htab->plt_mips_offset + h->root.plt.plist->comp_offset;
10023
0
    other = micromips_p ? STO_MICROMIPS : STO_MIPS16;
10024
0
  }
10025
0
      val += isa_bit;
10026
      /* For VxWorks, point at the PLT load stub rather than the lazy
10027
   resolution stub; this stub will become the canonical function
10028
   address.  */
10029
0
      if (htab->root.target_os == is_vxworks)
10030
0
  val += 8;
10031
10032
0
      h->root.root.u.def.section = htab->root.splt;
10033
0
      h->root.root.u.def.value = val;
10034
0
      h->root.other = other;
10035
0
    }
10036
10037
0
  return true;
10038
0
}
10039
10040
/* Set the sizes of the dynamic sections, some mips non-dynamic sections,
10041
   and check for any mips16 stub sections that we can discard.  */
10042
10043
bool
10044
_bfd_mips_elf_late_size_sections (bfd *output_bfd,
10045
          struct bfd_link_info *info)
10046
0
{
10047
0
  bfd *dynobj;
10048
0
  asection *s, *sreldyn;
10049
0
  bool reltext;
10050
0
  struct mips_elf_link_hash_table *htab;
10051
0
  struct mips_htab_traverse_info hti;
10052
10053
0
  htab = mips_elf_hash_table (info);
10054
0
  BFD_ASSERT (htab != NULL);
10055
10056
  /* The .reginfo section has a fixed size.  */
10057
0
  s = bfd_get_section_by_name (output_bfd, ".reginfo");
10058
0
  if (s != NULL)
10059
0
    {
10060
0
      bfd_set_section_size (s, sizeof (Elf32_External_RegInfo));
10061
0
      s->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
10062
0
    }
10063
10064
  /* The .MIPS.abiflags section has a fixed size.  */
10065
0
  s = bfd_get_section_by_name (output_bfd, ".MIPS.abiflags");
10066
0
  if (s != NULL)
10067
0
    {
10068
0
      bfd_set_section_size (s, sizeof (Elf_External_ABIFlags_v0));
10069
0
      s->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
10070
0
    }
10071
10072
0
  hti.info = info;
10073
0
  hti.output_bfd = output_bfd;
10074
0
  hti.error = false;
10075
0
  mips_elf_link_hash_traverse (htab, mips_elf_check_symbols, &hti);
10076
0
  if (hti.error)
10077
0
    return false;
10078
10079
0
  dynobj = htab->root.dynobj;
10080
0
  if (dynobj == NULL)
10081
0
    return true;
10082
10083
0
  if (htab->root.dynamic_sections_created)
10084
0
    {
10085
      /* Set the contents of the .interp section to the interpreter.  */
10086
0
      if (bfd_link_executable (info) && !info->nointerp)
10087
0
  {
10088
0
    s = htab->root.interp;
10089
0
    BFD_ASSERT (s != NULL);
10090
0
    s->size
10091
0
      = strlen (ELF_DYNAMIC_INTERPRETER (output_bfd)) + 1;
10092
0
    s->contents
10093
0
      = (bfd_byte *) ELF_DYNAMIC_INTERPRETER (output_bfd);
10094
0
    s->alloced = 1;
10095
0
  }
10096
10097
      /* Figure out the size of the PLT header if we know that we
10098
   are using it.  For the sake of cache alignment always use
10099
   a standard header whenever any standard entries are present
10100
   even if microMIPS entries are present as well.  This also
10101
   lets the microMIPS header rely on the value of $v0 only set
10102
   by microMIPS entries, for a small size reduction.
10103
10104
   Set symbol table entry values for symbols that use the
10105
   address of their PLT entry now that we can calculate it.
10106
10107
   Also create the _PROCEDURE_LINKAGE_TABLE_ symbol if we
10108
   haven't already in _bfd_elf_create_dynamic_sections.  */
10109
0
      if (htab->root.splt && htab->plt_mips_offset + htab->plt_comp_offset != 0)
10110
0
  {
10111
0
    bool micromips_p = (MICROMIPS_P (output_bfd)
10112
0
             && !htab->plt_mips_offset);
10113
0
    unsigned int other = micromips_p ? STO_MICROMIPS : 0;
10114
0
    bfd_vma isa_bit = micromips_p;
10115
0
    struct elf_link_hash_entry *h;
10116
0
    bfd_vma size;
10117
10118
0
    BFD_ASSERT (htab->use_plts_and_copy_relocs);
10119
0
    BFD_ASSERT (htab->root.sgotplt->size == 0);
10120
0
    BFD_ASSERT (htab->root.splt->size == 0);
10121
10122
0
    if (htab->root.target_os == is_vxworks && bfd_link_pic (info))
10123
0
      size = 4 * ARRAY_SIZE (mips_vxworks_shared_plt0_entry);
10124
0
    else if (htab->root.target_os == is_vxworks)
10125
0
      size = 4 * ARRAY_SIZE (mips_vxworks_exec_plt0_entry);
10126
0
    else if (ABI_64_P (output_bfd))
10127
0
      size = 4 * ARRAY_SIZE (mips_n64_exec_plt0_entry);
10128
0
    else if (ABI_N32_P (output_bfd))
10129
0
      size = 4 * ARRAY_SIZE (mips_n32_exec_plt0_entry);
10130
0
    else if (!micromips_p)
10131
0
      size = 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry);
10132
0
    else if (htab->insn32)
10133
0
      size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry);
10134
0
    else
10135
0
      size = 2 * ARRAY_SIZE (micromips_o32_exec_plt0_entry);
10136
10137
0
    htab->plt_header_is_comp = micromips_p;
10138
0
    htab->plt_header_size = size;
10139
0
    htab->root.splt->size = (size
10140
0
           + htab->plt_mips_offset
10141
0
           + htab->plt_comp_offset);
10142
0
    htab->root.sgotplt->size = (htab->plt_got_index
10143
0
              * MIPS_ELF_GOT_SIZE (dynobj));
10144
10145
0
    mips_elf_link_hash_traverse (htab, mips_elf_set_plt_sym_value, info);
10146
10147
0
    if (htab->root.hplt == NULL)
10148
0
      {
10149
0
        h = _bfd_elf_define_linkage_sym (dynobj, info, htab->root.splt,
10150
0
                 "_PROCEDURE_LINKAGE_TABLE_");
10151
0
        htab->root.hplt = h;
10152
0
        if (h == NULL)
10153
0
    return false;
10154
0
      }
10155
10156
0
    h = htab->root.hplt;
10157
0
    h->root.u.def.value = isa_bit;
10158
0
    h->other = other;
10159
0
    h->type = STT_FUNC;
10160
0
  }
10161
0
    }
10162
10163
  /* Allocate space for global sym dynamic relocs.  */
10164
0
  elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
10165
10166
0
  mips_elf_estimate_stub_size (output_bfd, info);
10167
10168
0
  if (!mips_elf_lay_out_got (output_bfd, info))
10169
0
    return false;
10170
10171
0
  mips_elf_lay_out_lazy_stubs (info);
10172
10173
  /* The check_relocs and adjust_dynamic_symbol entry points have
10174
     determined the sizes of the various dynamic sections.  Allocate
10175
     memory for them.  */
10176
0
  reltext = false;
10177
0
  for (s = dynobj->sections; s != NULL; s = s->next)
10178
0
    {
10179
0
      const char *name;
10180
10181
      /* It's OK to base decisions on the section name, because none
10182
   of the dynobj section names depend upon the input files.  */
10183
0
      name = bfd_section_name (s);
10184
10185
0
      if ((s->flags & SEC_LINKER_CREATED) == 0)
10186
0
  continue;
10187
10188
0
      if (startswith (name, ".rel"))
10189
0
  {
10190
0
    if (s->size != 0)
10191
0
      {
10192
0
        const char *outname;
10193
0
        asection *target;
10194
10195
        /* If this relocation section applies to a read only
10196
     section, then we probably need a DT_TEXTREL entry.
10197
     If the relocation section is .rel(a).dyn, we always
10198
     assert a DT_TEXTREL entry rather than testing whether
10199
     there exists a relocation to a read only section or
10200
     not.  */
10201
0
        outname = bfd_section_name (s->output_section);
10202
0
        target = bfd_get_section_by_name (output_bfd, outname + 4);
10203
0
        if ((target != NULL
10204
0
       && (target->flags & SEC_READONLY) != 0
10205
0
       && (target->flags & SEC_ALLOC) != 0)
10206
0
      || strcmp (outname, MIPS_ELF_REL_DYN_NAME (info)) == 0)
10207
0
    reltext = true;
10208
10209
        /* We use the reloc_count field as a counter if we need
10210
     to copy relocs into the output file.  */
10211
0
        if (strcmp (name, MIPS_ELF_REL_DYN_NAME (info)) != 0)
10212
0
    s->reloc_count = 0;
10213
10214
        /* If combreloc is enabled, elf_link_sort_relocs() will
10215
     sort relocations, but in a different way than we do,
10216
     and before we're done creating relocations.  Also, it
10217
     will move them around between input sections'
10218
     relocation's contents, so our sorting would be
10219
     broken, so don't let it run.  */
10220
0
        info->combreloc = 0;
10221
0
      }
10222
0
  }
10223
0
      else if (bfd_link_executable (info)
10224
0
         && !htab->use_rld_obj_head
10225
0
         && startswith (name, ".rld_map"))
10226
0
  {
10227
    /* We add a room for __rld_map.  It will be filled in by the
10228
       rtld to contain a pointer to the _r_debug structure.  */
10229
0
    s->size += MIPS_ELF_RLD_MAP_SIZE (output_bfd);
10230
0
  }
10231
0
      else if (SGI_COMPAT (output_bfd)
10232
0
         && startswith (name, ".compact_rel"))
10233
0
  s->size += htab->compact_rel_size;
10234
0
      else if (s == htab->root.splt)
10235
0
  {
10236
    /* If the last PLT entry has a branch delay slot, allocate
10237
       room for an extra nop to fill the delay slot.  This is
10238
       for CPUs without load interlocking.  */
10239
0
    if (! LOAD_INTERLOCKS_P (output_bfd)
10240
0
        && htab->root.target_os != is_vxworks
10241
0
        && s->size > 0)
10242
0
      s->size += 4;
10243
0
  }
10244
0
      else if (! startswith (name, ".init")
10245
0
         && s != htab->root.sgot
10246
0
         && s != htab->root.sgotplt
10247
0
         && s != htab->sstubs
10248
0
         && s != htab->root.sdynbss
10249
0
         && s != htab->root.sdynrelro)
10250
0
  {
10251
    /* It's not one of our sections, so don't allocate space.  */
10252
0
    continue;
10253
0
  }
10254
10255
0
      if (s->size == 0)
10256
0
  {
10257
0
    s->flags |= SEC_EXCLUDE;
10258
0
    continue;
10259
0
  }
10260
10261
0
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
10262
0
  continue;
10263
10264
      /* Allocate memory for the section contents.  */
10265
0
      s->contents = bfd_zalloc (dynobj, s->size);
10266
0
      if (s->contents == NULL)
10267
0
  {
10268
0
    bfd_set_error (bfd_error_no_memory);
10269
0
    return false;
10270
0
  }
10271
0
      s->alloced = 1;
10272
0
    }
10273
10274
0
  if (htab->root.dynamic_sections_created)
10275
0
    {
10276
      /* Add some entries to the .dynamic section.  We fill in the
10277
   values later, in _bfd_mips_elf_finish_dynamic_sections, but we
10278
   must add the entries now so that we get the correct size for
10279
   the .dynamic section.  */
10280
10281
      /* SGI object has the equivalence of DT_DEBUG in the
10282
   DT_MIPS_RLD_MAP entry.  This must come first because glibc
10283
   only fills in DT_MIPS_RLD_MAP (not DT_DEBUG) and some tools
10284
   may only look at the first one they see.  */
10285
0
      if (!bfd_link_pic (info)
10286
0
    && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP, 0))
10287
0
  return false;
10288
10289
0
      if (bfd_link_executable (info)
10290
0
    && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP_REL, 0))
10291
0
  return false;
10292
10293
      /* The DT_DEBUG entry may be filled in by the dynamic linker and
10294
   used by the debugger.  */
10295
0
      if (bfd_link_executable (info)
10296
0
    && !SGI_COMPAT (output_bfd)
10297
0
    && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_DEBUG, 0))
10298
0
  return false;
10299
10300
0
      if (reltext
10301
0
    && (SGI_COMPAT (output_bfd)
10302
0
        || htab->root.target_os == is_vxworks))
10303
0
  info->flags |= DF_TEXTREL;
10304
10305
0
      if ((info->flags & DF_TEXTREL) != 0)
10306
0
  {
10307
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_TEXTREL, 0))
10308
0
      return false;
10309
10310
    /* Clear the DF_TEXTREL flag.  It will be set again if we
10311
       write out an actual text relocation; we may not, because
10312
       at this point we do not know whether e.g. any .eh_frame
10313
       absolute relocations have been converted to PC-relative.  */
10314
0
    info->flags &= ~DF_TEXTREL;
10315
0
  }
10316
10317
0
      if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTGOT, 0))
10318
0
  return false;
10319
10320
0
      sreldyn = mips_elf_rel_dyn_section (info, false);
10321
0
      if (htab->root.target_os == is_vxworks)
10322
0
  {
10323
    /* VxWorks uses .rela.dyn instead of .rel.dyn.  It does not
10324
       use any of the DT_MIPS_* tags.  */
10325
0
    if (sreldyn && sreldyn->size > 0)
10326
0
      {
10327
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELA, 0))
10328
0
    return false;
10329
10330
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELASZ, 0))
10331
0
    return false;
10332
10333
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELAENT, 0))
10334
0
    return false;
10335
0
      }
10336
0
  }
10337
0
      else
10338
0
  {
10339
0
    if (sreldyn && sreldyn->size > 0
10340
0
        && !bfd_is_abs_section (sreldyn->output_section))
10341
0
      {
10342
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_REL, 0))
10343
0
    return false;
10344
10345
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELSZ, 0))
10346
0
    return false;
10347
10348
0
        if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELENT, 0))
10349
0
    return false;
10350
0
      }
10351
10352
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_VERSION, 0))
10353
0
      return false;
10354
10355
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_FLAGS, 0))
10356
0
      return false;
10357
10358
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_BASE_ADDRESS, 0))
10359
0
      return false;
10360
10361
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_LOCAL_GOTNO, 0))
10362
0
      return false;
10363
10364
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_SYMTABNO, 0))
10365
0
      return false;
10366
10367
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_UNREFEXTNO, 0))
10368
0
      return false;
10369
10370
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_GOTSYM, 0))
10371
0
      return false;
10372
10373
0
    if (info->emit_gnu_hash
10374
0
        && ! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_XHASH, 0))
10375
0
      return false;
10376
10377
0
    if (IRIX_COMPAT (dynobj) == ict_irix5
10378
0
        && ! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_HIPAGENO, 0))
10379
0
      return false;
10380
10381
0
    if (IRIX_COMPAT (dynobj) == ict_irix6
10382
0
        && (bfd_get_section_by_name
10383
0
      (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (dynobj)))
10384
0
        && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_OPTIONS, 0))
10385
0
      return false;
10386
0
  }
10387
0
      if (htab->root.splt->size > 0)
10388
0
  {
10389
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTREL, 0))
10390
0
      return false;
10391
10392
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_JMPREL, 0))
10393
0
      return false;
10394
10395
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTRELSZ, 0))
10396
0
      return false;
10397
10398
0
    if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_PLTGOT, 0))
10399
0
      return false;
10400
0
  }
10401
0
#ifdef OBJ_MAYBE_ELF_VXWORKS
10402
0
      if (htab->root.target_os == is_vxworks
10403
0
    && !elf_vxworks_add_dynamic_entries (output_bfd, info))
10404
0
  return false;
10405
0
#endif /* OBJ_MAYBE_ELF_VXWORKS */
10406
0
    }
10407
10408
0
  return true;
10409
0
}
10410

10411
/* REL is a relocation in INPUT_BFD that is being copied to OUTPUT_BFD.
10412
   Adjust its R_ADDEND field so that it is correct for the output file.
10413
   LOCAL_SYMS and LOCAL_SECTIONS are arrays of INPUT_BFD's local symbols
10414
   and sections respectively; both use symbol indexes.  */
10415
10416
static void
10417
mips_elf_adjust_addend (bfd *output_bfd, struct bfd_link_info *info,
10418
      bfd *input_bfd, Elf_Internal_Sym *local_syms,
10419
      asection **local_sections, Elf_Internal_Rela *rel)
10420
0
{
10421
0
  unsigned int r_type, r_symndx;
10422
0
  Elf_Internal_Sym *sym;
10423
0
  asection *sec;
10424
10425
0
  if (mips_elf_local_relocation_p (input_bfd, rel, local_sections))
10426
0
    {
10427
0
      r_type = ELF_R_TYPE (output_bfd, rel->r_info);
10428
0
      if (gprel16_reloc_p (r_type)
10429
0
    || r_type == R_MIPS_GPREL32
10430
0
    || literal_reloc_p (r_type))
10431
0
  {
10432
0
    rel->r_addend += _bfd_get_gp_value (input_bfd);
10433
0
    rel->r_addend -= _bfd_get_gp_value (output_bfd);
10434
0
  }
10435
10436
0
      r_symndx = ELF_R_SYM (output_bfd, rel->r_info);
10437
0
      sym = local_syms + r_symndx;
10438
10439
      /* Adjust REL's addend to account for section merging.  */
10440
0
      if (!bfd_link_relocatable (info))
10441
0
  {
10442
0
    sec = local_sections[r_symndx];
10443
0
    _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
10444
0
  }
10445
10446
      /* This would normally be done by the rela_normal code in elflink.c.  */
10447
0
      if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
10448
0
  rel->r_addend += local_sections[r_symndx]->output_offset;
10449
0
    }
10450
0
}
10451
10452
/* Handle relocations against symbols from removed linkonce sections,
10453
   or sections discarded by a linker script.  We use this wrapper around
10454
   RELOC_AGAINST_DISCARDED_SECTION to handle triplets of compound relocs
10455
   on 64-bit ELF targets.  In this case for any relocation handled, which
10456
   always be the first in a triplet, the remaining two have to be processed
10457
   together with the first, even if they are R_MIPS_NONE.  It is the symbol
10458
   index referred by the first reloc that applies to all the three and the
10459
   remaining two never refer to an object symbol.  And it is the final
10460
   relocation (the last non-null one) that determines the output field of
10461
   the whole relocation so retrieve the corresponding howto structure for
10462
   the relocatable field to be cleared by RELOC_AGAINST_DISCARDED_SECTION.
10463
10464
   Note that RELOC_AGAINST_DISCARDED_SECTION is a macro that uses "continue"
10465
   and therefore requires to be pasted in a loop.  It also defines a block
10466
   and does not protect any of its arguments, hence the extra brackets.  */
10467
10468
static void
10469
mips_reloc_against_discarded_section (bfd *output_bfd,
10470
              struct bfd_link_info *info,
10471
              bfd *input_bfd, asection *input_section,
10472
              Elf_Internal_Rela **rel,
10473
              const Elf_Internal_Rela **relend,
10474
              bool rel_reloc,
10475
              reloc_howto_type *howto,
10476
              bfd_byte *contents)
10477
0
{
10478
0
  elf_backend_data *bed = get_elf_backend_data (output_bfd);
10479
0
  int count = bed->s->int_rels_per_ext_rel;
10480
0
  unsigned int r_type;
10481
0
  int i;
10482
10483
0
  for (i = count - 1; i > 0; i--)
10484
0
    {
10485
0
      r_type = ELF_R_TYPE (output_bfd, (*rel)[i].r_info);
10486
0
      if (r_type != R_MIPS_NONE)
10487
0
  {
10488
0
    howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type, !rel_reloc);
10489
0
    break;
10490
0
  }
10491
0
    }
10492
0
  do
10493
0
    {
10494
0
       RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
10495
0
          (*rel), count, (*relend), R_MIPS_NONE,
10496
0
          howto, i, contents);
10497
0
    }
10498
0
  while (0);
10499
0
}
10500
10501
/* Relocate a MIPS ELF section.  */
10502
10503
int
10504
_bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
10505
        bfd *input_bfd, asection *input_section,
10506
        bfd_byte *contents, Elf_Internal_Rela *relocs,
10507
        Elf_Internal_Sym *local_syms,
10508
        asection **local_sections)
10509
0
{
10510
0
  Elf_Internal_Rela *rel;
10511
0
  const Elf_Internal_Rela *relend;
10512
0
  bfd_vma addend = 0;
10513
0
  bool use_saved_addend_p = false;
10514
10515
0
  relend = relocs + input_section->reloc_count;
10516
0
  for (rel = relocs; rel < relend; ++rel)
10517
0
    {
10518
0
      const char *name;
10519
0
      bfd_vma value = 0;
10520
0
      reloc_howto_type *howto;
10521
0
      bool cross_mode_jump_p = false;
10522
      /* TRUE if the relocation is a RELA relocation, rather than a
10523
   REL relocation.  */
10524
0
      bool rela_relocation_p = true;
10525
0
      unsigned int r_type = ELF_R_TYPE (output_bfd, rel->r_info);
10526
0
      const char *msg;
10527
0
      unsigned long r_symndx;
10528
0
      asection *sec;
10529
0
      Elf_Internal_Shdr *symtab_hdr;
10530
0
      struct elf_link_hash_entry *h;
10531
0
      bool rel_reloc;
10532
10533
0
      rel_reloc = mips_elf_rel_relocation_p (input_bfd, input_section,
10534
0
               relocs, rel);
10535
      /* Find the relocation howto for this relocation.  */
10536
0
      howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type, !rel_reloc);
10537
10538
0
      r_symndx = ELF_R_SYM (input_bfd, rel->r_info);
10539
0
      symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
10540
0
      if (mips_elf_local_relocation_p (input_bfd, rel, local_sections))
10541
0
  {
10542
0
    sec = local_sections[r_symndx];
10543
0
    h = NULL;
10544
0
  }
10545
0
      else
10546
0
  {
10547
0
    unsigned long extsymoff;
10548
10549
0
    extsymoff = 0;
10550
0
    if (!elf_bad_symtab (input_bfd))
10551
0
      extsymoff = symtab_hdr->sh_info;
10552
0
    h = elf_sym_hashes (input_bfd) [r_symndx - extsymoff];
10553
0
    while (h->root.type == bfd_link_hash_indirect
10554
0
     || h->root.type == bfd_link_hash_warning)
10555
0
      h = (struct elf_link_hash_entry *) h->root.u.i.link;
10556
10557
0
    sec = NULL;
10558
0
    if (h->root.type == bfd_link_hash_defined
10559
0
        || h->root.type == bfd_link_hash_defweak)
10560
0
      sec = h->root.u.def.section;
10561
0
  }
10562
10563
0
      if (sec != NULL && discarded_section (sec))
10564
0
  {
10565
0
    mips_reloc_against_discarded_section (output_bfd, info, input_bfd,
10566
0
            input_section, &rel, &relend,
10567
0
            rel_reloc, howto, contents);
10568
0
    continue;
10569
0
  }
10570
10571
0
      if (r_type == R_MIPS_64 && ! NEWABI_P (input_bfd))
10572
0
  {
10573
    /* Some 32-bit code uses R_MIPS_64.  In particular, people use
10574
       64-bit code, but make sure all their addresses are in the
10575
       lowermost or uppermost 32-bit section of the 64-bit address
10576
       space.  Thus, when they use an R_MIPS_64 they mean what is
10577
       usually meant by R_MIPS_32, with the exception that the
10578
       stored value is sign-extended to 64 bits.  */
10579
0
    howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, R_MIPS_32, false);
10580
10581
    /* On big-endian systems, we need to lie about the position
10582
       of the reloc.  */
10583
0
    if (bfd_big_endian (input_bfd))
10584
0
      rel->r_offset += 4;
10585
0
  }
10586
10587
0
      if (!use_saved_addend_p)
10588
0
  {
10589
    /* If these relocations were originally of the REL variety,
10590
       we must pull the addend out of the field that will be
10591
       relocated.  Otherwise, we simply use the contents of the
10592
       RELA relocation.  */
10593
0
    if (mips_elf_rel_relocation_p (input_bfd, input_section,
10594
0
           relocs, rel))
10595
0
      {
10596
0
        rela_relocation_p = false;
10597
0
        addend = mips_elf_read_rel_addend (input_bfd, input_section,
10598
0
             rel, howto, contents);
10599
0
        if (hi16_reloc_p (r_type)
10600
0
      || (got16_reloc_p (r_type)
10601
0
          && mips_elf_local_relocation_p (input_bfd, rel,
10602
0
                  local_sections))
10603
0
      || tls_hi16_reloc_p (r_type))
10604
0
    {
10605
0
      if (!mips_elf_add_lo16_rel_addend (input_bfd, input_section,
10606
0
                 rel, relend,
10607
0
                 contents, &addend))
10608
0
        {
10609
0
          if (h)
10610
0
      name = h->root.root.string;
10611
0
          else
10612
0
      name = bfd_elf_sym_name (input_bfd, symtab_hdr,
10613
0
             local_syms + r_symndx,
10614
0
             sec);
10615
          /* xgettext:c-format */
10616
0
          msg = bfd_asprintf (_("can't find matching LO16 reloc"
10617
0
              " against `%s' for %s at %#" PRIx64
10618
0
              " in section `%s'"),
10619
0
            name, howto->name,
10620
0
            (uint64_t) rel->r_offset,
10621
0
            input_section->name);
10622
0
          if (msg == NULL)
10623
0
      return false;
10624
0
          info->callbacks->warning
10625
0
      (info, msg, name, input_bfd, input_section,
10626
0
       rel->r_offset);
10627
0
        }
10628
0
    }
10629
0
        else
10630
0
    addend <<= howto->rightshift;
10631
0
      }
10632
0
    else
10633
0
      addend = rel->r_addend;
10634
0
    mips_elf_adjust_addend (output_bfd, info, input_bfd,
10635
0
          local_syms, local_sections, rel);
10636
0
  }
10637
10638
0
      if (bfd_link_relocatable (info))
10639
0
  {
10640
0
    if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd)
10641
0
        && bfd_big_endian (input_bfd))
10642
0
      rel->r_offset -= 4;
10643
10644
0
    if (!rela_relocation_p && rel->r_addend)
10645
0
      {
10646
0
        addend += rel->r_addend;
10647
0
        if (hi16_reloc_p (r_type)
10648
0
      || got16_reloc_p (r_type)
10649
0
      || tls_hi16_reloc_p (r_type))
10650
0
    addend = mips_elf_high (addend);
10651
0
        else if (r_type == R_MIPS_HIGHER)
10652
0
    addend = mips_elf_higher (addend);
10653
0
        else if (r_type == R_MIPS_HIGHEST)
10654
0
    addend = mips_elf_highest (addend);
10655
0
        else
10656
0
    addend >>= howto->rightshift;
10657
10658
        /* We use the source mask, rather than the destination
10659
     mask because the place to which we are writing will be
10660
     source of the addend in the final link.  */
10661
0
        addend &= howto->src_mask;
10662
10663
0
        if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
10664
    /* See the comment above about using R_MIPS_64 in the 32-bit
10665
       ABI.  Here, we need to update the addend.  It would be
10666
       possible to get away with just using the R_MIPS_32 reloc
10667
       but for endianness.  */
10668
0
    {
10669
0
      bfd_vma sign_bits;
10670
0
      bfd_vma low_bits;
10671
0
      bfd_vma high_bits;
10672
10673
0
      if (addend & ((bfd_vma) 1 << 31))
10674
0
#ifdef BFD64
10675
0
        sign_bits = ((bfd_vma) 1 << 32) - 1;
10676
#else
10677
        sign_bits = -1;
10678
#endif
10679
0
      else
10680
0
        sign_bits = 0;
10681
10682
      /* If we don't know that we have a 64-bit type,
10683
         do two separate stores.  */
10684
0
      if (bfd_big_endian (input_bfd))
10685
0
        {
10686
          /* Store the sign-bits (which are most significant)
10687
       first.  */
10688
0
          low_bits = sign_bits;
10689
0
          high_bits = addend;
10690
0
        }
10691
0
      else
10692
0
        {
10693
0
          low_bits = addend;
10694
0
          high_bits = sign_bits;
10695
0
        }
10696
0
      bfd_put_32 (input_bfd, low_bits,
10697
0
            contents + rel->r_offset);
10698
0
      bfd_put_32 (input_bfd, high_bits,
10699
0
            contents + rel->r_offset + 4);
10700
0
      continue;
10701
0
    }
10702
10703
0
        if (! mips_elf_perform_relocation (info, howto, rel, addend,
10704
0
             input_bfd, input_section,
10705
0
             contents, false))
10706
0
    return false;
10707
0
      }
10708
10709
    /* Go on to the next relocation.  */
10710
0
    continue;
10711
0
  }
10712
10713
      /* In the N32 and 64-bit ABIs there may be multiple consecutive
10714
   relocations for the same offset.  In that case we are
10715
   supposed to treat the output of each relocation as the addend
10716
   for the next.  */
10717
0
      if (rel + 1 < relend
10718
0
    && rel->r_offset == rel[1].r_offset
10719
0
    && ELF_R_TYPE (input_bfd, rel[1].r_info) != R_MIPS_NONE)
10720
0
  use_saved_addend_p = true;
10721
0
      else
10722
0
  use_saved_addend_p = false;
10723
10724
      /* Figure out what value we are supposed to relocate.  */
10725
0
      switch (mips_elf_calculate_relocation (output_bfd, input_bfd,
10726
0
               input_section, contents,
10727
0
               info, rel, addend, howto,
10728
0
               local_syms, local_sections,
10729
0
               &value, &name, &cross_mode_jump_p,
10730
0
               use_saved_addend_p))
10731
0
  {
10732
0
  case bfd_reloc_continue:
10733
    /* There's nothing to do.  */
10734
0
    continue;
10735
10736
0
  case bfd_reloc_undefined:
10737
    /* mips_elf_calculate_relocation already called the
10738
       undefined_symbol callback.  There's no real point in
10739
       trying to perform the relocation at this point, so we
10740
       just skip ahead to the next relocation.  */
10741
0
    continue;
10742
10743
0
  case bfd_reloc_notsupported:
10744
0
    msg = _("internal error: unsupported relocation error");
10745
0
    info->callbacks->warning
10746
0
      (info, msg, name, input_bfd, input_section, rel->r_offset);
10747
0
    return false;
10748
10749
0
  case bfd_reloc_overflow:
10750
0
    if (use_saved_addend_p)
10751
      /* Ignore overflow until we reach the last relocation for
10752
         a given location.  */
10753
0
      ;
10754
0
    else
10755
0
      {
10756
0
        struct mips_elf_link_hash_table *htab;
10757
10758
0
        htab = mips_elf_hash_table (info);
10759
0
        BFD_ASSERT (htab != NULL);
10760
0
        BFD_ASSERT (name != NULL);
10761
0
        if (!htab->small_data_overflow_reported
10762
0
      && (gprel16_reloc_p (howto->type)
10763
0
          || literal_reloc_p (howto->type)))
10764
0
    {
10765
0
      msg = _("small-data section too large;"
10766
0
        " lower small-data size limit (see option -G)");
10767
10768
0
      htab->small_data_overflow_reported = true;
10769
0
      (*info->callbacks->einfo) ("%P: %s\n", msg);
10770
0
    }
10771
0
        (*info->callbacks->reloc_overflow)
10772
0
    (info, NULL, name, howto->name, (bfd_vma) 0,
10773
0
     input_bfd, input_section, rel->r_offset);
10774
0
      }
10775
0
    break;
10776
10777
0
  case bfd_reloc_ok:
10778
0
    break;
10779
10780
0
  case bfd_reloc_outofrange:
10781
0
    msg = NULL;
10782
0
    if (jal_reloc_p (howto->type))
10783
0
      msg = (cross_mode_jump_p
10784
0
       ? _("cannot convert a jump to JALX "
10785
0
           "for a non-word-aligned address")
10786
0
       : (howto->type == R_MIPS16_26
10787
0
          ? _("jump to a non-word-aligned address")
10788
0
          : _("jump to a non-instruction-aligned address")));
10789
0
    else if (b_reloc_p (howto->type))
10790
0
      msg = (cross_mode_jump_p
10791
0
       ? _("cannot convert a branch to JALX "
10792
0
           "for a non-word-aligned address")
10793
0
       : _("branch to a non-instruction-aligned address"));
10794
0
    else if (aligned_pcrel_reloc_p (howto->type))
10795
0
      msg = _("PC-relative load from unaligned address");
10796
0
    if (msg)
10797
0
      {
10798
0
        info->callbacks->einfo
10799
0
    ("%X%H: %s\n", input_bfd, input_section, rel->r_offset, msg);
10800
0
        break;
10801
0
      }
10802
    /* Fall through.  */
10803
10804
0
  default:
10805
0
    abort ();
10806
0
    break;
10807
0
  }
10808
10809
      /* If we've got another relocation for the address, keep going
10810
   until we reach the last one.  */
10811
0
      if (use_saved_addend_p)
10812
0
  {
10813
0
    addend = value;
10814
0
    continue;
10815
0
  }
10816
10817
0
      if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
10818
  /* See the comment above about using R_MIPS_64 in the 32-bit
10819
     ABI.  Until now, we've been using the HOWTO for R_MIPS_32;
10820
     that calculated the right value.  Now, however, we
10821
     sign-extend the 32-bit result to 64-bits, and store it as a
10822
     64-bit value.  We are especially generous here in that we
10823
     go to extreme lengths to support this usage on systems with
10824
     only a 32-bit VMA.  */
10825
0
  {
10826
0
    bfd_vma sign_bits;
10827
0
    bfd_vma low_bits;
10828
0
    bfd_vma high_bits;
10829
10830
0
    if (value & ((bfd_vma) 1 << 31))
10831
0
#ifdef BFD64
10832
0
      sign_bits = ((bfd_vma) 1 << 32) - 1;
10833
#else
10834
      sign_bits = -1;
10835
#endif
10836
0
    else
10837
0
      sign_bits = 0;
10838
10839
    /* If we don't know that we have a 64-bit type,
10840
       do two separate stores.  */
10841
0
    if (bfd_big_endian (input_bfd))
10842
0
      {
10843
        /* Undo what we did above.  */
10844
0
        rel->r_offset -= 4;
10845
        /* Store the sign-bits (which are most significant)
10846
     first.  */
10847
0
        low_bits = sign_bits;
10848
0
        high_bits = value;
10849
0
      }
10850
0
    else
10851
0
      {
10852
0
        low_bits = value;
10853
0
        high_bits = sign_bits;
10854
0
      }
10855
0
    bfd_put_32 (input_bfd, low_bits,
10856
0
          contents + rel->r_offset);
10857
0
    bfd_put_32 (input_bfd, high_bits,
10858
0
          contents + rel->r_offset + 4);
10859
0
    continue;
10860
0
  }
10861
10862
      /* Actually perform the relocation.  */
10863
0
      if (! mips_elf_perform_relocation (info, howto, rel, value,
10864
0
           input_bfd, input_section,
10865
0
           contents, cross_mode_jump_p))
10866
0
  return false;
10867
0
    }
10868
10869
0
  return true;
10870
0
}
10871

10872
/* A function that iterates over each entry in la25_stubs and fills
10873
   in the code for each one.  DATA points to a mips_htab_traverse_info.  */
10874
10875
static int
10876
mips_elf_create_la25_stub (void **slot, void *data)
10877
0
{
10878
0
  struct mips_htab_traverse_info *hti;
10879
0
  struct mips_elf_link_hash_table *htab;
10880
0
  struct mips_elf_la25_stub *stub;
10881
0
  asection *s;
10882
0
  bfd_byte *loc;
10883
0
  bfd_vma offset, target, target_high, target_low;
10884
0
  bfd_vma branch_pc;
10885
0
  bfd_signed_vma pcrel_offset = 0;
10886
10887
0
  stub = (struct mips_elf_la25_stub *) *slot;
10888
0
  hti = (struct mips_htab_traverse_info *) data;
10889
0
  htab = mips_elf_hash_table (hti->info);
10890
0
  BFD_ASSERT (htab != NULL);
10891
10892
  /* Create the section contents, if we haven't already.  */
10893
0
  s = stub->stub_section;
10894
0
  loc = s->contents;
10895
0
  if (loc == NULL)
10896
0
    {
10897
0
      loc = bfd_malloc (s->size);
10898
0
      if (loc == NULL)
10899
0
  {
10900
0
    hti->error = true;
10901
0
    return false;
10902
0
  }
10903
0
      s->contents = loc;
10904
0
    }
10905
10906
  /* Work out where in the section this stub should go.  */
10907
0
  offset = stub->offset;
10908
10909
  /* We add 8 here to account for the LUI/ADDIU instructions
10910
     before the branch instruction.  This cannot be moved down to
10911
     where pcrel_offset is calculated as 's' is updated in
10912
     mips_elf_get_la25_target.  */
10913
0
  branch_pc = s->output_section->vma + s->output_offset + offset + 8;
10914
10915
  /* Work out the target address.  */
10916
0
  target = mips_elf_get_la25_target (stub, &s);
10917
0
  target += s->output_section->vma + s->output_offset;
10918
10919
0
  target_high = ((target + 0x8000) >> 16) & 0xffff;
10920
0
  target_low = (target & 0xffff);
10921
10922
  /* Calculate the PC of the compact branch instruction (for the case where
10923
     compact branches are used for either microMIPSR6 or MIPSR6 with
10924
     compact branches.  Add 4-bytes to account for BC using the PC of the
10925
     next instruction as the base.  */
10926
0
  pcrel_offset = target - (branch_pc + 4);
10927
10928
0
  if (stub->stub_section != htab->strampoline)
10929
0
    {
10930
      /* This is a simple LUI/ADDIU stub.  Zero out the beginning
10931
   of the section and write the two instructions at the end.  */
10932
0
      memset (loc, 0, offset);
10933
0
      loc += offset;
10934
0
      if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
10935
0
  {
10936
0
    bfd_put_micromips_32 (hti->output_bfd,
10937
0
        LA25_LUI_MICROMIPS (target_high),
10938
0
        loc);
10939
0
    bfd_put_micromips_32 (hti->output_bfd,
10940
0
        LA25_ADDIU_MICROMIPS (target_low),
10941
0
        loc + 4);
10942
0
  }
10943
0
      else
10944
0
  {
10945
0
    bfd_put_32 (hti->output_bfd, LA25_LUI (target_high), loc);
10946
0
    bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 4);
10947
0
  }
10948
0
    }
10949
0
  else
10950
0
    {
10951
      /* This is trampoline.  */
10952
0
      loc += offset;
10953
0
      if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
10954
0
  {
10955
0
    bfd_put_micromips_32 (hti->output_bfd,
10956
0
        LA25_LUI_MICROMIPS (target_high), loc);
10957
0
    bfd_put_micromips_32 (hti->output_bfd,
10958
0
        LA25_J_MICROMIPS (target), loc + 4);
10959
0
    bfd_put_micromips_32 (hti->output_bfd,
10960
0
        LA25_ADDIU_MICROMIPS (target_low), loc + 8);
10961
0
    bfd_put_32 (hti->output_bfd, 0, loc + 12);
10962
0
  }
10963
0
      else
10964
0
  {
10965
0
    bfd_put_32 (hti->output_bfd, LA25_LUI (target_high), loc);
10966
0
    if (MIPSR6_P (hti->output_bfd) && htab->compact_branches)
10967
0
      {
10968
0
        bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 4);
10969
0
        bfd_put_32 (hti->output_bfd, LA25_BC (pcrel_offset), loc + 8);
10970
0
      }
10971
0
    else
10972
0
      {
10973
0
        bfd_put_32 (hti->output_bfd, LA25_J (target), loc + 4);
10974
0
        bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 8);
10975
0
      }
10976
0
    bfd_put_32 (hti->output_bfd, 0, loc + 12);
10977
0
  }
10978
0
    }
10979
0
  return true;
10980
0
}
10981
10982
/* If NAME is one of the special IRIX6 symbols defined by the linker,
10983
   adjust it appropriately now.  */
10984
10985
static void
10986
mips_elf_irix6_finish_dynamic_symbol (bfd *abfd ATTRIBUTE_UNUSED,
10987
              const char *name, Elf_Internal_Sym *sym)
10988
0
{
10989
  /* The linker script takes care of providing names and values for
10990
     these, but we must place them into the right sections.  */
10991
0
  static const char* const text_section_symbols[] = {
10992
0
    "_ftext",
10993
0
    "_etext",
10994
0
    "__dso_displacement",
10995
0
    "__elf_header",
10996
0
    "__program_header_table",
10997
0
    NULL
10998
0
  };
10999
11000
0
  static const char* const data_section_symbols[] = {
11001
0
    "_fdata",
11002
0
    "_edata",
11003
0
    "_end",
11004
0
    "_fbss",
11005
0
    NULL
11006
0
  };
11007
11008
0
  const char* const *p;
11009
0
  int i;
11010
11011
0
  for (i = 0; i < 2; ++i)
11012
0
    for (p = (i == 0) ? text_section_symbols : data_section_symbols;
11013
0
   *p;
11014
0
   ++p)
11015
0
      if (strcmp (*p, name) == 0)
11016
0
  {
11017
    /* All of these symbols are given type STT_SECTION by the
11018
       IRIX6 linker.  */
11019
0
    sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11020
0
    sym->st_other = STO_PROTECTED;
11021
11022
    /* The IRIX linker puts these symbols in special sections.  */
11023
0
    if (i == 0)
11024
0
      sym->st_shndx = SHN_MIPS_TEXT;
11025
0
    else
11026
0
      sym->st_shndx = SHN_MIPS_DATA;
11027
11028
0
    break;
11029
0
  }
11030
0
}
11031
11032
/* Finish up dynamic symbol handling.  We set the contents of various
11033
   dynamic sections here.  */
11034
11035
bool
11036
_bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
11037
             struct bfd_link_info *info,
11038
             struct elf_link_hash_entry *h,
11039
             Elf_Internal_Sym *sym)
11040
0
{
11041
0
  bfd *dynobj;
11042
0
  asection *sgot;
11043
0
  struct mips_got_info *g, *gg;
11044
0
  const char *name;
11045
0
  int idx;
11046
0
  struct mips_elf_link_hash_table *htab;
11047
0
  struct mips_elf_link_hash_entry *hmips;
11048
11049
0
  htab = mips_elf_hash_table (info);
11050
0
  BFD_ASSERT (htab != NULL);
11051
0
  dynobj = elf_hash_table (info)->dynobj;
11052
0
  hmips = (struct mips_elf_link_hash_entry *) h;
11053
11054
0
  BFD_ASSERT (htab->root.target_os != is_vxworks);
11055
11056
0
  if (h->plt.plist != NULL
11057
0
      && (h->plt.plist->mips_offset != MINUS_ONE
11058
0
    || h->plt.plist->comp_offset != MINUS_ONE))
11059
0
    {
11060
      /* We've decided to create a PLT entry for this symbol.  */
11061
0
      bfd_byte *loc;
11062
0
      bfd_vma header_address, got_address;
11063
0
      bfd_vma got_address_high, got_address_low, load;
11064
0
      bfd_vma got_index;
11065
0
      bfd_vma isa_bit;
11066
11067
0
      got_index = h->plt.plist->gotplt_index;
11068
11069
0
      BFD_ASSERT (htab->use_plts_and_copy_relocs);
11070
0
      BFD_ASSERT (h->dynindx != -1);
11071
0
      BFD_ASSERT (htab->root.splt != NULL);
11072
0
      BFD_ASSERT (got_index != MINUS_ONE);
11073
0
      BFD_ASSERT (!h->def_regular);
11074
11075
      /* Calculate the address of the PLT header.  */
11076
0
      isa_bit = htab->plt_header_is_comp;
11077
0
      header_address = (htab->root.splt->output_section->vma
11078
0
      + htab->root.splt->output_offset + isa_bit);
11079
11080
      /* Calculate the address of the .got.plt entry.  */
11081
0
      got_address = (htab->root.sgotplt->output_section->vma
11082
0
         + htab->root.sgotplt->output_offset
11083
0
         + got_index * MIPS_ELF_GOT_SIZE (dynobj));
11084
11085
0
      got_address_high = ((got_address + 0x8000) >> 16) & 0xffff;
11086
0
      got_address_low = got_address & 0xffff;
11087
11088
      /* The PLT sequence is not safe for N64 if .got.plt entry's address
11089
   cannot be loaded in two instructions.  */
11090
0
      if (ABI_64_P (output_bfd)
11091
0
    && ((got_address + 0x80008000) & ~(bfd_vma) 0xffffffff) != 0)
11092
0
  {
11093
0
    _bfd_error_handler
11094
      /* xgettext:c-format */
11095
0
      (_("%pB: `%pA' entry VMA of %#" PRIx64 " outside the 32-bit range "
11096
0
         "supported; consider using `-Ttext-segment=...'"),
11097
0
       output_bfd,
11098
0
       htab->root.sgotplt->output_section,
11099
0
       (int64_t) got_address);
11100
0
    bfd_set_error (bfd_error_no_error);
11101
0
    return false;
11102
0
  }
11103
11104
      /* Initially point the .got.plt entry at the PLT header.  */
11105
0
      loc = (htab->root.sgotplt->contents
11106
0
       + got_index * MIPS_ELF_GOT_SIZE (dynobj));
11107
0
      if (ABI_64_P (output_bfd))
11108
0
  bfd_put_64 (output_bfd, header_address, loc);
11109
0
      else
11110
0
  bfd_put_32 (output_bfd, header_address, loc);
11111
11112
      /* Now handle the PLT itself.  First the standard entry (the order
11113
   does not matter, we just have to pick one).  */
11114
0
      if (h->plt.plist->mips_offset != MINUS_ONE)
11115
0
  {
11116
0
    const bfd_vma *plt_entry;
11117
0
    bfd_vma plt_offset;
11118
11119
0
    plt_offset = htab->plt_header_size + h->plt.plist->mips_offset;
11120
11121
0
    BFD_ASSERT (plt_offset <= htab->root.splt->size);
11122
11123
    /* Find out where the .plt entry should go.  */
11124
0
    loc = htab->root.splt->contents + plt_offset;
11125
11126
    /* Pick the load opcode.  */
11127
0
    load = MIPS_ELF_LOAD_WORD (output_bfd);
11128
11129
    /* Fill in the PLT entry itself.  */
11130
11131
0
    if (MIPSR6_P (output_bfd))
11132
0
      plt_entry = htab->compact_branches ? mipsr6_exec_plt_entry_compact
11133
0
                 : mipsr6_exec_plt_entry;
11134
0
    else
11135
0
      plt_entry = mips_exec_plt_entry;
11136
0
    bfd_put_32 (output_bfd, plt_entry[0] | got_address_high, loc);
11137
0
    bfd_put_32 (output_bfd, plt_entry[1] | got_address_low | load,
11138
0
          loc + 4);
11139
11140
0
    if (! LOAD_INTERLOCKS_P (output_bfd)
11141
0
        || (MIPSR6_P (output_bfd) && htab->compact_branches))
11142
0
      {
11143
0
        bfd_put_32 (output_bfd, plt_entry[2] | got_address_low, loc + 8);
11144
0
        bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
11145
0
      }
11146
0
    else
11147
0
      {
11148
0
        bfd_put_32 (output_bfd, plt_entry[3], loc + 8);
11149
0
        bfd_put_32 (output_bfd, plt_entry[2] | got_address_low,
11150
0
        loc + 12);
11151
0
      }
11152
0
  }
11153
11154
      /* Now the compressed entry.  They come after any standard ones.  */
11155
0
      if (h->plt.plist->comp_offset != MINUS_ONE)
11156
0
  {
11157
0
    bfd_vma plt_offset;
11158
11159
0
    plt_offset = (htab->plt_header_size + htab->plt_mips_offset
11160
0
      + h->plt.plist->comp_offset);
11161
11162
0
    BFD_ASSERT (plt_offset <= htab->root.splt->size);
11163
11164
    /* Find out where the .plt entry should go.  */
11165
0
    loc = htab->root.splt->contents + plt_offset;
11166
11167
    /* Fill in the PLT entry itself.  */
11168
0
    if (!MICROMIPS_P (output_bfd))
11169
0
      {
11170
0
        const bfd_vma *plt_entry = mips16_o32_exec_plt_entry;
11171
11172
0
        bfd_put_16 (output_bfd, plt_entry[0], loc);
11173
0
        bfd_put_16 (output_bfd, plt_entry[1], loc + 2);
11174
0
        bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11175
0
        bfd_put_16 (output_bfd, plt_entry[3], loc + 6);
11176
0
        bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11177
0
        bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
11178
0
        bfd_put_32 (output_bfd, got_address, loc + 12);
11179
0
      }
11180
0
    else if (htab->insn32)
11181
0
      {
11182
0
        const bfd_vma *plt_entry = micromips_insn32_o32_exec_plt_entry;
11183
11184
0
        bfd_put_16 (output_bfd, plt_entry[0], loc);
11185
0
        bfd_put_16 (output_bfd, got_address_high, loc + 2);
11186
0
        bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11187
0
        bfd_put_16 (output_bfd, got_address_low, loc + 6);
11188
0
        bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11189
0
        bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
11190
0
        bfd_put_16 (output_bfd, plt_entry[6], loc + 12);
11191
0
        bfd_put_16 (output_bfd, got_address_low, loc + 14);
11192
0
      }
11193
0
    else
11194
0
      {
11195
0
        const bfd_vma *plt_entry = micromips_o32_exec_plt_entry;
11196
0
        bfd_signed_vma gotpc_offset;
11197
0
        bfd_vma loc_address;
11198
11199
0
        BFD_ASSERT (got_address % 4 == 0);
11200
11201
0
        loc_address = (htab->root.splt->output_section->vma
11202
0
           + htab->root.splt->output_offset + plt_offset);
11203
0
        gotpc_offset = got_address - ((loc_address | 3) ^ 3);
11204
11205
        /* ADDIUPC has a span of +/-16MB, check we're in range.  */
11206
0
        if (gotpc_offset + 0x1000000 >= 0x2000000)
11207
0
    {
11208
0
      _bfd_error_handler
11209
        /* xgettext:c-format */
11210
0
        (_("%pB: `%pA' offset of %" PRId64 " from `%pA' "
11211
0
           "beyond the range of ADDIUPC"),
11212
0
         output_bfd,
11213
0
         htab->root.sgotplt->output_section,
11214
0
         (int64_t) gotpc_offset,
11215
0
         htab->root.splt->output_section);
11216
0
      bfd_set_error (bfd_error_no_error);
11217
0
      return false;
11218
0
    }
11219
0
        bfd_put_16 (output_bfd,
11220
0
        plt_entry[0] | ((gotpc_offset >> 18) & 0x7f), loc);
11221
0
        bfd_put_16 (output_bfd, (gotpc_offset >> 2) & 0xffff, loc + 2);
11222
0
        bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11223
0
        bfd_put_16 (output_bfd, plt_entry[3], loc + 6);
11224
0
        bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11225
0
        bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
11226
0
      }
11227
0
  }
11228
11229
      /* Emit an R_MIPS_JUMP_SLOT relocation against the .got.plt entry.  */
11230
0
      mips_elf_output_dynamic_relocation (output_bfd, htab->root.srelplt,
11231
0
            got_index - 2, h->dynindx,
11232
0
            R_MIPS_JUMP_SLOT, got_address);
11233
11234
      /* We distinguish between PLT entries and lazy-binding stubs by
11235
   giving the former an st_other value of STO_MIPS_PLT.  Set the
11236
   flag and leave the value if there are any relocations in the
11237
   binary where pointer equality matters.  */
11238
0
      sym->st_shndx = SHN_UNDEF;
11239
0
      if (h->pointer_equality_needed)
11240
0
  sym->st_other = ELF_ST_SET_MIPS_PLT (sym->st_other);
11241
0
      else
11242
0
  {
11243
0
    sym->st_value = 0;
11244
0
    sym->st_other = 0;
11245
0
  }
11246
0
    }
11247
11248
0
  if (h->plt.plist != NULL && h->plt.plist->stub_offset != MINUS_ONE)
11249
0
    {
11250
      /* We've decided to create a lazy-binding stub.  */
11251
0
      bool micromips_p = MICROMIPS_P (output_bfd);
11252
0
      unsigned int other = micromips_p ? STO_MICROMIPS : 0;
11253
0
      bfd_vma stub_size = htab->function_stub_size;
11254
0
      bfd_byte stub[MIPS_FUNCTION_STUB_BIG_SIZE];
11255
0
      bfd_vma isa_bit = micromips_p;
11256
0
      bfd_vma stub_big_size;
11257
11258
0
      if (!micromips_p)
11259
0
  stub_big_size = MIPS_FUNCTION_STUB_BIG_SIZE;
11260
0
      else if (htab->insn32)
11261
0
  stub_big_size = MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE;
11262
0
      else
11263
0
  stub_big_size = MICROMIPS_FUNCTION_STUB_BIG_SIZE;
11264
11265
      /* This symbol has a stub.  Set it up.  */
11266
11267
0
      BFD_ASSERT (h->dynindx != -1);
11268
11269
0
      BFD_ASSERT (stub_size == stub_big_size || h->dynindx <= 0xffff);
11270
11271
      /* Values up to 2^31 - 1 are allowed.  Larger values would cause
11272
   sign extension at runtime in the stub, resulting in a negative
11273
   index value.  */
11274
0
      if (h->dynindx & ~0x7fffffff)
11275
0
  {
11276
0
    _bfd_error_handler
11277
0
      (_("%pB: cannot handle more than %d dynamic symbols"),
11278
0
       output_bfd, 0x7fffffff);
11279
0
    bfd_set_error (bfd_error_bad_value);
11280
0
    return false;
11281
0
  }
11282
11283
      /* Fill the stub.  */
11284
0
      if (micromips_p)
11285
0
  {
11286
0
    idx = 0;
11287
0
    bfd_put_micromips_32 (output_bfd, STUB_LW_MICROMIPS (output_bfd),
11288
0
        stub + idx);
11289
0
    idx += 4;
11290
0
    if (htab->insn32)
11291
0
      {
11292
0
        bfd_put_micromips_32 (output_bfd,
11293
0
            STUB_MOVE32_MICROMIPS, stub + idx);
11294
0
        idx += 4;
11295
0
      }
11296
0
    else
11297
0
      {
11298
0
        bfd_put_16 (output_bfd, STUB_MOVE_MICROMIPS, stub + idx);
11299
0
        idx += 2;
11300
0
      }
11301
0
    if (stub_size == stub_big_size)
11302
0
      {
11303
0
        long dynindx_hi = (h->dynindx >> 16) & 0x7fff;
11304
11305
0
        bfd_put_micromips_32 (output_bfd,
11306
0
            STUB_LUI_MICROMIPS (dynindx_hi),
11307
0
            stub + idx);
11308
0
        idx += 4;
11309
0
      }
11310
0
    if (htab->insn32)
11311
0
      {
11312
0
        bfd_put_micromips_32 (output_bfd, STUB_JALR32_MICROMIPS,
11313
0
            stub + idx);
11314
0
        idx += 4;
11315
0
      }
11316
0
    else
11317
0
      {
11318
0
        bfd_put_16 (output_bfd, STUB_JALR_MICROMIPS, stub + idx);
11319
0
        idx += 2;
11320
0
      }
11321
11322
    /* If a large stub is not required and sign extension is not a
11323
       problem, then use legacy code in the stub.  */
11324
0
    if (stub_size == stub_big_size)
11325
0
      bfd_put_micromips_32 (output_bfd,
11326
0
          STUB_ORI_MICROMIPS (h->dynindx & 0xffff),
11327
0
          stub + idx);
11328
0
    else if (h->dynindx & ~0x7fff)
11329
0
      bfd_put_micromips_32 (output_bfd,
11330
0
          STUB_LI16U_MICROMIPS (h->dynindx & 0xffff),
11331
0
          stub + idx);
11332
0
    else
11333
0
      bfd_put_micromips_32 (output_bfd,
11334
0
          STUB_LI16S_MICROMIPS (output_bfd,
11335
0
              h->dynindx),
11336
0
          stub + idx);
11337
0
  }
11338
0
      else
11339
0
  {
11340
0
    idx = 0;
11341
0
    bfd_put_32 (output_bfd, STUB_LW (output_bfd), stub + idx);
11342
0
    idx += 4;
11343
0
    bfd_put_32 (output_bfd, STUB_MOVE, stub + idx);
11344
0
    idx += 4;
11345
0
    if (stub_size == stub_big_size)
11346
0
      {
11347
0
        bfd_put_32 (output_bfd, STUB_LUI ((h->dynindx >> 16) & 0x7fff),
11348
0
        stub + idx);
11349
0
        idx += 4;
11350
0
      }
11351
11352
0
    if (!(MIPSR6_P (output_bfd) && htab->compact_branches))
11353
0
      {
11354
0
        bfd_put_32 (output_bfd, STUB_JALR, stub + idx);
11355
0
        idx += 4;
11356
0
      }
11357
11358
    /* If a large stub is not required and sign extension is not a
11359
       problem, then use legacy code in the stub.  */
11360
0
    if (stub_size == stub_big_size)
11361
0
      bfd_put_32 (output_bfd, STUB_ORI (h->dynindx & 0xffff),
11362
0
      stub + idx);
11363
0
    else if (h->dynindx & ~0x7fff)
11364
0
      bfd_put_32 (output_bfd, STUB_LI16U (h->dynindx & 0xffff),
11365
0
      stub + idx);
11366
0
    else
11367
0
      bfd_put_32 (output_bfd, STUB_LI16S (output_bfd, h->dynindx),
11368
0
      stub + idx);
11369
0
    idx += 4;
11370
11371
0
    if (MIPSR6_P (output_bfd) && htab->compact_branches)
11372
0
      bfd_put_32 (output_bfd, STUB_JALRC, stub + idx);
11373
0
  }
11374
11375
0
      BFD_ASSERT (h->plt.plist->stub_offset <= htab->sstubs->size);
11376
0
      memcpy (htab->sstubs->contents + h->plt.plist->stub_offset,
11377
0
        stub, stub_size);
11378
11379
      /* Mark the symbol as undefined.  stub_offset != -1 occurs
11380
   only for the referenced symbol.  */
11381
0
      sym->st_shndx = SHN_UNDEF;
11382
11383
      /* The run-time linker uses the st_value field of the symbol
11384
   to reset the global offset table entry for this external
11385
   to its stub address when unlinking a shared object.  */
11386
0
      sym->st_value = (htab->sstubs->output_section->vma
11387
0
           + htab->sstubs->output_offset
11388
0
           + h->plt.plist->stub_offset
11389
0
           + isa_bit);
11390
0
      sym->st_other = other;
11391
0
    }
11392
11393
  /* If we have a MIPS16 function with a stub, the dynamic symbol must
11394
     refer to the stub, since only the stub uses the standard calling
11395
     conventions.  */
11396
0
  if (h->dynindx != -1 && hmips->fn_stub != NULL)
11397
0
    {
11398
0
      BFD_ASSERT (hmips->need_fn_stub);
11399
0
      sym->st_value = (hmips->fn_stub->output_section->vma
11400
0
           + hmips->fn_stub->output_offset);
11401
0
      sym->st_size = hmips->fn_stub->size;
11402
0
      sym->st_other = ELF_ST_VISIBILITY (sym->st_other);
11403
0
    }
11404
11405
0
  BFD_ASSERT (h->dynindx != -1
11406
0
        || h->forced_local);
11407
11408
0
  sgot = htab->root.sgot;
11409
0
  g = htab->got_info;
11410
0
  BFD_ASSERT (g != NULL);
11411
11412
  /* Run through the global symbol table, creating GOT entries for all
11413
     the symbols that need them.  */
11414
0
  if (hmips->global_got_area != GGA_NONE)
11415
0
    {
11416
0
      bfd_vma offset;
11417
0
      bfd_vma value;
11418
11419
0
      value = sym->st_value;
11420
0
      offset = mips_elf_primary_global_got_index (output_bfd, info, h);
11421
0
      MIPS_ELF_PUT_WORD (output_bfd, value, sgot->contents + offset);
11422
0
    }
11423
11424
0
  if (hmips->global_got_area != GGA_NONE && g->next)
11425
0
    {
11426
0
      struct mips_got_entry e, *p;
11427
0
      bfd_vma entry;
11428
0
      bfd_vma offset;
11429
11430
0
      gg = g;
11431
11432
0
      e.abfd = output_bfd;
11433
0
      e.symndx = -1;
11434
0
      e.d.h = hmips;
11435
0
      e.tls_type = GOT_TLS_NONE;
11436
11437
0
      for (g = g->next; g->next != gg; g = g->next)
11438
0
  {
11439
0
    if (g->got_entries
11440
0
        && (p = (struct mips_got_entry *) htab_find (g->got_entries,
11441
0
                 &e)))
11442
0
      {
11443
0
        offset = p->gotidx;
11444
0
        BFD_ASSERT (offset > 0 && offset < htab->root.sgot->size);
11445
0
        if (bfd_link_pic (info)
11446
0
      || (elf_hash_table (info)->dynamic_sections_created
11447
0
          && p->d.h != NULL
11448
0
          && p->d.h->root.def_dynamic
11449
0
          && !p->d.h->root.def_regular))
11450
0
    {
11451
      /* Create an R_MIPS_REL32 relocation for this entry.  Due to
11452
         the various compatibility problems, it's easier to mock
11453
         up an R_MIPS_32 or R_MIPS_64 relocation and leave
11454
         mips_elf_create_dynamic_relocation to calculate the
11455
         appropriate addend.  */
11456
0
      Elf_Internal_Rela rel[3];
11457
11458
0
      memset (rel, 0, sizeof (rel));
11459
0
      if (ABI_64_P (output_bfd))
11460
0
        rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_64);
11461
0
      else
11462
0
        rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_32);
11463
0
      rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
11464
11465
0
      entry = 0;
11466
0
      if (! (mips_elf_create_dynamic_relocation
11467
0
       (output_bfd, info, rel,
11468
0
        e.d.h, NULL, sym->st_value, &entry, sgot)))
11469
0
        return false;
11470
0
    }
11471
0
        else
11472
0
    entry = sym->st_value;
11473
0
        MIPS_ELF_PUT_WORD (output_bfd, entry, sgot->contents + offset);
11474
0
      }
11475
0
  }
11476
0
    }
11477
11478
  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
11479
0
  name = h->root.root.string;
11480
0
  if (h == elf_hash_table (info)->hdynamic
11481
0
      || h == elf_hash_table (info)->hgot)
11482
0
    sym->st_shndx = SHN_ABS;
11483
0
  else if (strcmp (name, "_DYNAMIC_LINK") == 0
11484
0
     || strcmp (name, "_DYNAMIC_LINKING") == 0)
11485
0
    {
11486
0
      sym->st_shndx = SHN_ABS;
11487
0
      sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11488
0
      sym->st_value = 1;
11489
0
    }
11490
0
  else if (SGI_COMPAT (output_bfd))
11491
0
    {
11492
0
      if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
11493
0
    || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
11494
0
  {
11495
0
    sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11496
0
    sym->st_other = STO_PROTECTED;
11497
0
    sym->st_value = 0;
11498
0
    sym->st_shndx = SHN_MIPS_DATA;
11499
0
  }
11500
0
      else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
11501
0
  {
11502
0
    sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11503
0
    sym->st_other = STO_PROTECTED;
11504
0
    sym->st_value = mips_elf_hash_table (info)->procedure_count;
11505
0
    sym->st_shndx = SHN_ABS;
11506
0
  }
11507
0
      else if (sym->st_shndx != SHN_UNDEF && sym->st_shndx != SHN_ABS)
11508
0
  {
11509
0
    if (h->type == STT_FUNC)
11510
0
      sym->st_shndx = SHN_MIPS_TEXT;
11511
0
    else if (h->type == STT_OBJECT)
11512
0
      sym->st_shndx = SHN_MIPS_DATA;
11513
0
  }
11514
0
    }
11515
11516
  /* Emit a copy reloc, if needed.  */
11517
0
  if (h->needs_copy)
11518
0
    {
11519
0
      asection *s;
11520
0
      bfd_vma symval;
11521
11522
0
      BFD_ASSERT (h->dynindx != -1);
11523
0
      BFD_ASSERT (htab->use_plts_and_copy_relocs);
11524
11525
0
      s = mips_elf_rel_dyn_section (info, false);
11526
0
      symval = (h->root.u.def.section->output_section->vma
11527
0
    + h->root.u.def.section->output_offset
11528
0
    + h->root.u.def.value);
11529
0
      mips_elf_output_dynamic_relocation (output_bfd, s, s->reloc_count++,
11530
0
            h->dynindx, R_MIPS_COPY, symval);
11531
0
    }
11532
11533
  /* Handle the IRIX6-specific symbols.  */
11534
0
  if (IRIX_COMPAT (output_bfd) == ict_irix6)
11535
0
    mips_elf_irix6_finish_dynamic_symbol (output_bfd, name, sym);
11536
11537
  /* Keep dynamic compressed symbols odd.  This allows the dynamic linker
11538
     to treat compressed symbols like any other.  */
11539
0
  if (ELF_ST_IS_MIPS16 (sym->st_other))
11540
0
    {
11541
0
      BFD_ASSERT (sym->st_value & 1);
11542
0
      sym->st_other -= STO_MIPS16;
11543
0
    }
11544
0
  else if (ELF_ST_IS_MICROMIPS (sym->st_other))
11545
0
    {
11546
0
      BFD_ASSERT (sym->st_value & 1);
11547
0
      sym->st_other -= STO_MICROMIPS;
11548
0
    }
11549
11550
0
  return true;
11551
0
}
11552
11553
/* Likewise, for VxWorks.  */
11554
11555
bool
11556
_bfd_mips_vxworks_finish_dynamic_symbol (bfd *output_bfd,
11557
           struct bfd_link_info *info,
11558
           struct elf_link_hash_entry *h,
11559
           Elf_Internal_Sym *sym)
11560
0
{
11561
0
  bfd *dynobj;
11562
0
  asection *sgot;
11563
0
  struct mips_got_info *g;
11564
0
  struct mips_elf_link_hash_table *htab;
11565
0
  struct mips_elf_link_hash_entry *hmips;
11566
11567
0
  htab = mips_elf_hash_table (info);
11568
0
  BFD_ASSERT (htab != NULL);
11569
0
  dynobj = elf_hash_table (info)->dynobj;
11570
0
  hmips = (struct mips_elf_link_hash_entry *) h;
11571
11572
0
  if (h->plt.plist != NULL && h->plt.plist->mips_offset != MINUS_ONE)
11573
0
    {
11574
0
      bfd_byte *loc;
11575
0
      bfd_vma plt_address, got_address, got_offset, branch_offset;
11576
0
      Elf_Internal_Rela rel;
11577
0
      static const bfd_vma *plt_entry;
11578
0
      bfd_vma gotplt_index;
11579
0
      bfd_vma plt_offset;
11580
11581
0
      plt_offset = htab->plt_header_size + h->plt.plist->mips_offset;
11582
0
      gotplt_index = h->plt.plist->gotplt_index;
11583
11584
0
      BFD_ASSERT (h->dynindx != -1);
11585
0
      BFD_ASSERT (htab->root.splt != NULL);
11586
0
      BFD_ASSERT (gotplt_index != MINUS_ONE);
11587
0
      BFD_ASSERT (plt_offset <= htab->root.splt->size);
11588
11589
      /* Calculate the address of the .plt entry.  */
11590
0
      plt_address = (htab->root.splt->output_section->vma
11591
0
         + htab->root.splt->output_offset
11592
0
         + plt_offset);
11593
11594
      /* Calculate the address of the .got.plt entry.  */
11595
0
      got_address = (htab->root.sgotplt->output_section->vma
11596
0
         + htab->root.sgotplt->output_offset
11597
0
         + gotplt_index * MIPS_ELF_GOT_SIZE (output_bfd));
11598
11599
      /* Calculate the offset of the .got.plt entry from
11600
   _GLOBAL_OFFSET_TABLE_.  */
11601
0
      got_offset = mips_elf_gotplt_index (info, h);
11602
11603
      /* Calculate the offset for the branch at the start of the PLT
11604
   entry.  The branch jumps to the beginning of .plt.  */
11605
0
      branch_offset = -(plt_offset / 4 + 1) & 0xffff;
11606
11607
      /* Fill in the initial value of the .got.plt entry.  */
11608
0
      bfd_put_32 (output_bfd, plt_address,
11609
0
      (htab->root.sgotplt->contents
11610
0
       + gotplt_index * MIPS_ELF_GOT_SIZE (output_bfd)));
11611
11612
      /* Find out where the .plt entry should go.  */
11613
0
      loc = htab->root.splt->contents + plt_offset;
11614
11615
0
      if (bfd_link_pic (info))
11616
0
  {
11617
0
    plt_entry = mips_vxworks_shared_plt_entry;
11618
0
    bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
11619
0
    bfd_put_32 (output_bfd, plt_entry[1] | gotplt_index, loc + 4);
11620
0
  }
11621
0
      else
11622
0
  {
11623
0
    bfd_vma got_address_high, got_address_low;
11624
11625
0
    plt_entry = mips_vxworks_exec_plt_entry;
11626
0
    got_address_high = ((got_address + 0x8000) >> 16) & 0xffff;
11627
0
    got_address_low = got_address & 0xffff;
11628
11629
0
    bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
11630
0
    bfd_put_32 (output_bfd, plt_entry[1] | gotplt_index, loc + 4);
11631
0
    bfd_put_32 (output_bfd, plt_entry[2] | got_address_high, loc + 8);
11632
0
    bfd_put_32 (output_bfd, plt_entry[3] | got_address_low, loc + 12);
11633
0
    bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11634
0
    bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11635
0
    bfd_put_32 (output_bfd, plt_entry[6], loc + 24);
11636
0
    bfd_put_32 (output_bfd, plt_entry[7], loc + 28);
11637
11638
0
    loc = (htab->srelplt2->contents
11639
0
     + (gotplt_index * 3 + 2) * sizeof (Elf32_External_Rela));
11640
11641
    /* Emit a relocation for the .got.plt entry.  */
11642
0
    rel.r_offset = got_address;
11643
0
    rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
11644
0
    rel.r_addend = plt_offset;
11645
0
    bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11646
11647
    /* Emit a relocation for the lui of %hi(<.got.plt slot>).  */
11648
0
    loc += sizeof (Elf32_External_Rela);
11649
0
    rel.r_offset = plt_address + 8;
11650
0
    rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11651
0
    rel.r_addend = got_offset;
11652
0
    bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11653
11654
    /* Emit a relocation for the addiu of %lo(<.got.plt slot>).  */
11655
0
    loc += sizeof (Elf32_External_Rela);
11656
0
    rel.r_offset += 4;
11657
0
    rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11658
0
    bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11659
0
  }
11660
11661
      /* Emit an R_MIPS_JUMP_SLOT relocation against the .got.plt entry.  */
11662
0
      loc = (htab->root.srelplt->contents
11663
0
       + gotplt_index * sizeof (Elf32_External_Rela));
11664
0
      rel.r_offset = got_address;
11665
0
      rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_JUMP_SLOT);
11666
0
      rel.r_addend = 0;
11667
0
      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11668
11669
0
      if (!h->def_regular)
11670
0
  sym->st_shndx = SHN_UNDEF;
11671
0
    }
11672
11673
0
  BFD_ASSERT (h->dynindx != -1 || h->forced_local);
11674
11675
0
  sgot = htab->root.sgot;
11676
0
  g = htab->got_info;
11677
0
  BFD_ASSERT (g != NULL);
11678
11679
  /* See if this symbol has an entry in the GOT.  */
11680
0
  if (hmips->global_got_area != GGA_NONE)
11681
0
    {
11682
0
      bfd_vma offset;
11683
0
      Elf_Internal_Rela outrel;
11684
0
      bfd_byte *loc;
11685
0
      asection *s;
11686
11687
      /* Install the symbol value in the GOT.   */
11688
0
      offset = mips_elf_primary_global_got_index (output_bfd, info, h);
11689
0
      MIPS_ELF_PUT_WORD (output_bfd, sym->st_value, sgot->contents + offset);
11690
11691
      /* Add a dynamic relocation for it.  */
11692
0
      s = mips_elf_rel_dyn_section (info, false);
11693
0
      loc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
11694
0
      outrel.r_offset = (sgot->output_section->vma
11695
0
       + sgot->output_offset
11696
0
       + offset);
11697
0
      outrel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_32);
11698
0
      outrel.r_addend = 0;
11699
0
      bfd_elf32_swap_reloca_out (dynobj, &outrel, loc);
11700
0
    }
11701
11702
  /* Emit a copy reloc, if needed.  */
11703
0
  if (h->needs_copy)
11704
0
    {
11705
0
      Elf_Internal_Rela rel;
11706
0
      asection *srel;
11707
0
      bfd_byte *loc;
11708
11709
0
      BFD_ASSERT (h->dynindx != -1);
11710
11711
0
      rel.r_offset = (h->root.u.def.section->output_section->vma
11712
0
          + h->root.u.def.section->output_offset
11713
0
          + h->root.u.def.value);
11714
0
      rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_COPY);
11715
0
      rel.r_addend = 0;
11716
0
      if (h->root.u.def.section == htab->root.sdynrelro)
11717
0
  srel = htab->root.sreldynrelro;
11718
0
      else
11719
0
  srel = htab->root.srelbss;
11720
0
      loc = srel->contents + srel->reloc_count * sizeof (Elf32_External_Rela);
11721
0
      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11722
0
      ++srel->reloc_count;
11723
0
    }
11724
11725
  /* If this is a mips16/microMIPS symbol, force the value to be even.  */
11726
0
  if (ELF_ST_IS_COMPRESSED (sym->st_other))
11727
0
    sym->st_value &= ~1;
11728
11729
0
  return true;
11730
0
}
11731
11732
/* Write out a plt0 entry to the beginning of .plt.  */
11733
11734
static bool
11735
mips_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
11736
0
{
11737
0
  bfd_byte *loc;
11738
0
  bfd_vma gotplt_value, gotplt_value_high, gotplt_value_low;
11739
0
  static const bfd_vma *plt_entry;
11740
0
  struct mips_elf_link_hash_table *htab;
11741
11742
0
  htab = mips_elf_hash_table (info);
11743
0
  BFD_ASSERT (htab != NULL);
11744
11745
0
  if (ABI_64_P (output_bfd))
11746
0
    plt_entry = (htab->compact_branches
11747
0
     ? mipsr6_n64_exec_plt0_entry_compact
11748
0
     : mips_n64_exec_plt0_entry);
11749
0
  else if (ABI_N32_P (output_bfd))
11750
0
    plt_entry = (htab->compact_branches
11751
0
     ? mipsr6_n32_exec_plt0_entry_compact
11752
0
     : mips_n32_exec_plt0_entry);
11753
0
  else if (!htab->plt_header_is_comp)
11754
0
    plt_entry = (htab->compact_branches
11755
0
     ? mipsr6_o32_exec_plt0_entry_compact
11756
0
     : mips_o32_exec_plt0_entry);
11757
0
  else if (htab->insn32)
11758
0
    plt_entry = micromips_insn32_o32_exec_plt0_entry;
11759
0
  else
11760
0
    plt_entry = micromips_o32_exec_plt0_entry;
11761
11762
  /* Calculate the value of .got.plt.  */
11763
0
  gotplt_value = (htab->root.sgotplt->output_section->vma
11764
0
      + htab->root.sgotplt->output_offset);
11765
0
  gotplt_value_high = ((gotplt_value + 0x8000) >> 16) & 0xffff;
11766
0
  gotplt_value_low = gotplt_value & 0xffff;
11767
11768
  /* The PLT sequence is not safe for N64 if .got.plt's address can
11769
     not be loaded in two instructions.  */
11770
0
  if (ABI_64_P (output_bfd)
11771
0
      && ((gotplt_value + 0x80008000) & ~(bfd_vma) 0xffffffff) != 0)
11772
0
    {
11773
0
      _bfd_error_handler
11774
  /* xgettext:c-format */
11775
0
  (_("%pB: `%pA' start VMA of %#" PRIx64 " outside the 32-bit range "
11776
0
     "supported; consider using `-Ttext-segment=...'"),
11777
0
   output_bfd,
11778
0
   htab->root.sgotplt->output_section,
11779
0
   (int64_t) gotplt_value);
11780
0
      bfd_set_error (bfd_error_no_error);
11781
0
      return false;
11782
0
    }
11783
11784
  /* Install the PLT header.  */
11785
0
  loc = htab->root.splt->contents;
11786
0
  if (plt_entry == micromips_o32_exec_plt0_entry)
11787
0
    {
11788
0
      bfd_vma gotpc_offset;
11789
0
      bfd_vma loc_address;
11790
0
      size_t i;
11791
11792
0
      BFD_ASSERT (gotplt_value % 4 == 0);
11793
11794
0
      loc_address = (htab->root.splt->output_section->vma
11795
0
         + htab->root.splt->output_offset);
11796
0
      gotpc_offset = gotplt_value - ((loc_address | 3) ^ 3);
11797
11798
      /* ADDIUPC has a span of +/-16MB, check we're in range.  */
11799
0
      if (gotpc_offset + 0x1000000 >= 0x2000000)
11800
0
  {
11801
0
    _bfd_error_handler
11802
      /* xgettext:c-format */
11803
0
      (_("%pB: `%pA' offset of %" PRId64 " from `%pA' "
11804
0
         "beyond the range of ADDIUPC"),
11805
0
       output_bfd,
11806
0
       htab->root.sgotplt->output_section,
11807
0
       (int64_t) gotpc_offset,
11808
0
       htab->root.splt->output_section);
11809
0
    bfd_set_error (bfd_error_no_error);
11810
0
    return false;
11811
0
  }
11812
0
      bfd_put_16 (output_bfd,
11813
0
      plt_entry[0] | ((gotpc_offset >> 18) & 0x7f), loc);
11814
0
      bfd_put_16 (output_bfd, (gotpc_offset >> 2) & 0xffff, loc + 2);
11815
0
      for (i = 2; i < ARRAY_SIZE (micromips_o32_exec_plt0_entry); i++)
11816
0
  bfd_put_16 (output_bfd, plt_entry[i], loc + (i * 2));
11817
0
    }
11818
0
  else if (plt_entry == micromips_insn32_o32_exec_plt0_entry)
11819
0
    {
11820
0
      size_t i;
11821
11822
0
      bfd_put_16 (output_bfd, plt_entry[0], loc);
11823
0
      bfd_put_16 (output_bfd, gotplt_value_high, loc + 2);
11824
0
      bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11825
0
      bfd_put_16 (output_bfd, gotplt_value_low, loc + 6);
11826
0
      bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11827
0
      bfd_put_16 (output_bfd, gotplt_value_low, loc + 10);
11828
0
      for (i = 6; i < ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry); i++)
11829
0
  bfd_put_16 (output_bfd, plt_entry[i], loc + (i * 2));
11830
0
    }
11831
0
  else
11832
0
    {
11833
0
      bfd_put_32 (output_bfd, plt_entry[0] | gotplt_value_high, loc);
11834
0
      bfd_put_32 (output_bfd, plt_entry[1] | gotplt_value_low, loc + 4);
11835
0
      bfd_put_32 (output_bfd, plt_entry[2] | gotplt_value_low, loc + 8);
11836
0
      bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
11837
0
      bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11838
0
      bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11839
0
      bfd_put_32 (output_bfd, plt_entry[6], loc + 24);
11840
0
      bfd_put_32 (output_bfd, plt_entry[7], loc + 28);
11841
0
    }
11842
11843
0
  return true;
11844
0
}
11845
11846
/* Install the PLT header for a VxWorks executable and finalize the
11847
   contents of .rela.plt.unloaded.  */
11848
11849
static void
11850
mips_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
11851
0
{
11852
0
  Elf_Internal_Rela rela;
11853
0
  bfd_byte *loc;
11854
0
  bfd_vma got_value, got_value_high, got_value_low, plt_address;
11855
0
  static const bfd_vma *plt_entry;
11856
0
  struct mips_elf_link_hash_table *htab;
11857
11858
0
  htab = mips_elf_hash_table (info);
11859
0
  BFD_ASSERT (htab != NULL);
11860
11861
0
  plt_entry = mips_vxworks_exec_plt0_entry;
11862
11863
  /* Calculate the value of _GLOBAL_OFFSET_TABLE_.  */
11864
0
  got_value = (htab->root.hgot->root.u.def.section->output_section->vma
11865
0
         + htab->root.hgot->root.u.def.section->output_offset
11866
0
         + htab->root.hgot->root.u.def.value);
11867
11868
0
  got_value_high = ((got_value + 0x8000) >> 16) & 0xffff;
11869
0
  got_value_low = got_value & 0xffff;
11870
11871
  /* Calculate the address of the PLT header.  */
11872
0
  plt_address = (htab->root.splt->output_section->vma
11873
0
     + htab->root.splt->output_offset);
11874
11875
  /* Install the PLT header.  */
11876
0
  loc = htab->root.splt->contents;
11877
0
  bfd_put_32 (output_bfd, plt_entry[0] | got_value_high, loc);
11878
0
  bfd_put_32 (output_bfd, plt_entry[1] | got_value_low, loc + 4);
11879
0
  bfd_put_32 (output_bfd, plt_entry[2], loc + 8);
11880
0
  bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
11881
0
  bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11882
0
  bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11883
11884
  /* Output the relocation for the lui of %hi(_GLOBAL_OFFSET_TABLE_).  */
11885
0
  loc = htab->srelplt2->contents;
11886
0
  rela.r_offset = plt_address;
11887
0
  rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11888
0
  rela.r_addend = 0;
11889
0
  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
11890
0
  loc += sizeof (Elf32_External_Rela);
11891
11892
  /* Output the relocation for the following addiu of
11893
     %lo(_GLOBAL_OFFSET_TABLE_).  */
11894
0
  rela.r_offset += 4;
11895
0
  rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11896
0
  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
11897
0
  loc += sizeof (Elf32_External_Rela);
11898
11899
  /* Fix up the remaining relocations.  They may have the wrong
11900
     symbol index for _G_O_T_ or _P_L_T_ depending on the order
11901
     in which symbols were output.  */
11902
0
  while (loc < htab->srelplt2->contents + htab->srelplt2->size)
11903
0
    {
11904
0
      Elf_Internal_Rela rel;
11905
11906
0
      bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11907
0
      rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
11908
0
      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11909
0
      loc += sizeof (Elf32_External_Rela);
11910
11911
0
      bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11912
0
      rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11913
0
      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11914
0
      loc += sizeof (Elf32_External_Rela);
11915
11916
0
      bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11917
0
      rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11918
0
      bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11919
0
      loc += sizeof (Elf32_External_Rela);
11920
0
    }
11921
0
}
11922
11923
/* Install the PLT header for a VxWorks shared library.  */
11924
11925
static void
11926
mips_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info)
11927
0
{
11928
0
  unsigned int i;
11929
0
  struct mips_elf_link_hash_table *htab;
11930
11931
0
  htab = mips_elf_hash_table (info);
11932
0
  BFD_ASSERT (htab != NULL);
11933
11934
  /* We just need to copy the entry byte-by-byte.  */
11935
0
  for (i = 0; i < ARRAY_SIZE (mips_vxworks_shared_plt0_entry); i++)
11936
0
    bfd_put_32 (output_bfd, mips_vxworks_shared_plt0_entry[i],
11937
0
    htab->root.splt->contents + i * 4);
11938
0
}
11939
11940
/* Finish up the dynamic sections.  */
11941
11942
bool
11943
_bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
11944
               struct bfd_link_info *info,
11945
               bfd_byte *buf ATTRIBUTE_UNUSED)
11946
0
{
11947
0
  bfd *dynobj;
11948
0
  asection *sdyn;
11949
0
  asection *sgot;
11950
0
  struct mips_got_info *gg, *g;
11951
0
  struct mips_elf_link_hash_table *htab;
11952
11953
0
  htab = mips_elf_hash_table (info);
11954
0
  BFD_ASSERT (htab != NULL);
11955
11956
0
  dynobj = elf_hash_table (info)->dynobj;
11957
11958
0
  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
11959
11960
0
  sgot = htab->root.sgot;
11961
0
  gg = htab->got_info;
11962
11963
0
  if (elf_hash_table (info)->dynamic_sections_created)
11964
0
    {
11965
0
      bfd_byte *b;
11966
0
      int dyn_to_skip = 0, dyn_skipped = 0;
11967
11968
0
      BFD_ASSERT (sdyn != NULL);
11969
0
      BFD_ASSERT (gg != NULL);
11970
11971
0
      g = mips_elf_bfd_got (output_bfd, false);
11972
0
      BFD_ASSERT (g != NULL);
11973
11974
0
      for (b = sdyn->contents;
11975
0
     b < sdyn->contents + sdyn->size;
11976
0
     b += MIPS_ELF_DYN_SIZE (dynobj))
11977
0
  {
11978
0
    Elf_Internal_Dyn dyn;
11979
0
    const char *name;
11980
0
    size_t elemsize;
11981
0
    asection *s;
11982
0
    bool swap_out_p;
11983
11984
    /* Read in the current dynamic entry.  */
11985
0
    (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
11986
11987
    /* Assume that we're going to modify it and write it out.  */
11988
0
    swap_out_p = true;
11989
11990
0
    switch (dyn.d_tag)
11991
0
      {
11992
0
      case DT_RELENT:
11993
0
        dyn.d_un.d_val = MIPS_ELF_REL_SIZE (dynobj);
11994
0
        break;
11995
11996
0
      case DT_RELAENT:
11997
0
        BFD_ASSERT (htab->root.target_os == is_vxworks);
11998
0
        dyn.d_un.d_val = MIPS_ELF_RELA_SIZE (dynobj);
11999
0
        break;
12000
12001
0
      case DT_STRSZ:
12002
        /* Rewrite DT_STRSZ.  */
12003
0
        dyn.d_un.d_val =
12004
0
    _bfd_elf_strtab_size (elf_hash_table (info)->dynstr);
12005
0
        break;
12006
12007
0
      case DT_PLTGOT:
12008
0
        s = htab->root.sgot;
12009
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
12010
0
        break;
12011
12012
0
      case DT_MIPS_PLTGOT:
12013
0
        s = htab->root.sgotplt;
12014
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
12015
0
        break;
12016
12017
0
      case DT_MIPS_RLD_VERSION:
12018
0
        dyn.d_un.d_val = 1; /* XXX */
12019
0
        break;
12020
12021
0
      case DT_MIPS_FLAGS:
12022
0
        dyn.d_un.d_val = RHF_NOTPOT; /* XXX */
12023
0
        break;
12024
12025
0
      case DT_MIPS_TIME_STAMP:
12026
0
        {
12027
0
    time_t t;
12028
0
    time (&t);
12029
0
    dyn.d_un.d_val = t;
12030
0
        }
12031
0
        break;
12032
12033
0
      case DT_MIPS_ICHECKSUM:
12034
        /* XXX FIXME: */
12035
0
        swap_out_p = false;
12036
0
        break;
12037
12038
0
      case DT_MIPS_IVERSION:
12039
        /* XXX FIXME: */
12040
0
        swap_out_p = false;
12041
0
        break;
12042
12043
0
      case DT_MIPS_BASE_ADDRESS:
12044
0
        s = output_bfd->sections;
12045
0
        BFD_ASSERT (s != NULL);
12046
0
        dyn.d_un.d_ptr = s->vma & ~(bfd_vma) 0xffff;
12047
0
        break;
12048
12049
0
      case DT_MIPS_LOCAL_GOTNO:
12050
0
        dyn.d_un.d_val = g->local_gotno;
12051
0
        break;
12052
12053
0
      case DT_MIPS_UNREFEXTNO:
12054
        /* The index into the dynamic symbol table which is the
12055
     entry of the first external symbol that is not
12056
     referenced within the same object.  */
12057
0
        dyn.d_un.d_val = bfd_count_sections (output_bfd) + 1;
12058
0
        break;
12059
12060
0
      case DT_MIPS_GOTSYM:
12061
0
        if (htab->global_gotsym)
12062
0
    {
12063
0
      dyn.d_un.d_val = htab->global_gotsym->dynindx;
12064
0
      break;
12065
0
    }
12066
        /* In case if we don't have global got symbols we default
12067
     to setting DT_MIPS_GOTSYM to the same value as
12068
     DT_MIPS_SYMTABNO.  */
12069
        /* Fall through.  */
12070
12071
0
      case DT_MIPS_SYMTABNO:
12072
0
        name = ".dynsym";
12073
0
        elemsize = MIPS_ELF_SYM_SIZE (output_bfd);
12074
0
        s = bfd_get_linker_section (dynobj, name);
12075
12076
0
        if (s != NULL)
12077
0
    dyn.d_un.d_val = s->size / elemsize;
12078
0
        else
12079
0
    dyn.d_un.d_val = 0;
12080
0
        break;
12081
12082
0
      case DT_MIPS_HIPAGENO:
12083
0
        dyn.d_un.d_val = g->local_gotno - htab->reserved_gotno;
12084
0
        break;
12085
12086
0
      case DT_MIPS_RLD_MAP:
12087
0
        {
12088
0
    struct elf_link_hash_entry *h;
12089
0
    h = mips_elf_hash_table (info)->rld_symbol;
12090
0
    if (!h)
12091
0
      {
12092
0
        dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
12093
0
        swap_out_p = false;
12094
0
        break;
12095
0
      }
12096
0
    s = h->root.u.def.section;
12097
12098
    /* The MIPS_RLD_MAP tag stores the absolute address of the
12099
       debug pointer.  */
12100
0
    dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
12101
0
          + h->root.u.def.value);
12102
0
        }
12103
0
        break;
12104
12105
0
      case DT_MIPS_RLD_MAP_REL:
12106
0
        {
12107
0
    struct elf_link_hash_entry *h;
12108
0
    bfd_vma dt_addr, rld_addr;
12109
0
    h = mips_elf_hash_table (info)->rld_symbol;
12110
0
    if (!h)
12111
0
      {
12112
0
        dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
12113
0
        swap_out_p = false;
12114
0
        break;
12115
0
      }
12116
0
    s = h->root.u.def.section;
12117
12118
    /* The MIPS_RLD_MAP_REL tag stores the offset to the debug
12119
       pointer, relative to the address of the tag.  */
12120
0
    dt_addr = (sdyn->output_section->vma + sdyn->output_offset
12121
0
         + (b - sdyn->contents));
12122
0
    rld_addr = (s->output_section->vma + s->output_offset
12123
0
          + h->root.u.def.value);
12124
0
    dyn.d_un.d_ptr = rld_addr - dt_addr;
12125
0
        }
12126
0
        break;
12127
12128
0
      case DT_MIPS_OPTIONS:
12129
0
        s = (bfd_get_section_by_name
12130
0
       (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (output_bfd)));
12131
0
        dyn.d_un.d_ptr = s->vma;
12132
0
        break;
12133
12134
0
      case DT_PLTREL:
12135
0
        BFD_ASSERT (htab->use_plts_and_copy_relocs);
12136
0
        if (htab->root.target_os == is_vxworks)
12137
0
    dyn.d_un.d_val = DT_RELA;
12138
0
        else
12139
0
    dyn.d_un.d_val = DT_REL;
12140
0
        break;
12141
12142
0
      case DT_PLTRELSZ:
12143
0
        BFD_ASSERT (htab->use_plts_and_copy_relocs);
12144
0
        dyn.d_un.d_val = htab->root.srelplt->size;
12145
0
        break;
12146
12147
0
      case DT_JMPREL:
12148
0
        BFD_ASSERT (htab->use_plts_and_copy_relocs);
12149
0
        dyn.d_un.d_ptr = (htab->root.srelplt->output_section->vma
12150
0
        + htab->root.srelplt->output_offset);
12151
0
        break;
12152
12153
0
      case DT_TEXTREL:
12154
        /* If we didn't need any text relocations after all, delete
12155
     the dynamic tag.  */
12156
0
        if (!(info->flags & DF_TEXTREL))
12157
0
    {
12158
0
      dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
12159
0
      swap_out_p = false;
12160
0
    }
12161
0
        break;
12162
12163
0
      case DT_FLAGS:
12164
        /* If we didn't need any text relocations after all, clear
12165
     DF_TEXTREL from DT_FLAGS.  */
12166
0
        if (!(info->flags & DF_TEXTREL))
12167
0
    dyn.d_un.d_val &= ~DF_TEXTREL;
12168
0
        else
12169
0
    swap_out_p = false;
12170
0
        break;
12171
12172
0
      case DT_MIPS_XHASH:
12173
0
        name = ".MIPS.xhash";
12174
0
        s = bfd_get_linker_section (dynobj, name);
12175
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
12176
0
        break;
12177
12178
0
      default:
12179
0
        swap_out_p = false;
12180
0
#ifdef OBJ_MAYBE_ELF_VXWORKS
12181
0
        if (htab->root.target_os == is_vxworks
12182
0
      && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
12183
0
    swap_out_p = true;
12184
0
#endif /* OBJ_MAYBE_ELF_VXWORKS */
12185
0
        break;
12186
0
      }
12187
12188
0
    if (swap_out_p || dyn_skipped)
12189
0
      (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
12190
0
        (dynobj, &dyn, b - dyn_skipped);
12191
12192
0
    if (dyn_to_skip)
12193
0
      {
12194
0
        dyn_skipped += dyn_to_skip;
12195
0
        dyn_to_skip = 0;
12196
0
      }
12197
0
  }
12198
12199
      /* Wipe out any trailing entries if we shifted down a dynamic tag.  */
12200
0
      if (dyn_skipped > 0)
12201
0
  memset (b - dyn_skipped, 0, dyn_skipped);
12202
0
    }
12203
12204
0
  if (sgot != NULL && sgot->size > 0
12205
0
      && !bfd_is_abs_section (sgot->output_section))
12206
0
    {
12207
0
      if (htab->root.target_os == is_vxworks)
12208
0
  {
12209
    /* The first entry of the global offset table points to the
12210
       ".dynamic" section.  The second is initialized by the
12211
       loader and contains the shared library identifier.
12212
       The third is also initialized by the loader and points
12213
       to the lazy resolution stub.  */
12214
0
    MIPS_ELF_PUT_WORD (output_bfd,
12215
0
           sdyn->output_offset + sdyn->output_section->vma,
12216
0
           sgot->contents);
12217
0
    MIPS_ELF_PUT_WORD (output_bfd, 0,
12218
0
           sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
12219
0
    MIPS_ELF_PUT_WORD (output_bfd, 0,
12220
0
           sgot->contents
12221
0
           + 2 * MIPS_ELF_GOT_SIZE (output_bfd));
12222
0
  }
12223
0
      else
12224
0
  {
12225
    /* The first entry of the global offset table will be filled at
12226
       runtime. The second entry will be used by some runtime loaders.
12227
       This isn't the case of IRIX rld.  */
12228
0
    MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0, sgot->contents);
12229
0
    MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
12230
0
           sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
12231
0
  }
12232
12233
0
      elf_section_data (sgot->output_section)->this_hdr.sh_entsize
12234
0
   = MIPS_ELF_GOT_SIZE (output_bfd);
12235
0
    }
12236
12237
  /* Generate dynamic relocations for the non-primary gots.  */
12238
0
  if (gg != NULL && gg->next)
12239
0
    {
12240
0
      Elf_Internal_Rela rel[3];
12241
0
      bfd_vma addend = 0;
12242
12243
0
      memset (rel, 0, sizeof (rel));
12244
0
      rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_REL32);
12245
12246
0
      for (g = gg->next; g->next != gg; g = g->next)
12247
0
  {
12248
0
    bfd_vma got_index = g->next->local_gotno + g->next->global_gotno
12249
0
      + g->next->tls_gotno;
12250
12251
0
    MIPS_ELF_PUT_WORD (output_bfd, 0, sgot->contents
12252
0
           + got_index++ * MIPS_ELF_GOT_SIZE (output_bfd));
12253
0
    MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
12254
0
           sgot->contents
12255
0
           + got_index++ * MIPS_ELF_GOT_SIZE (output_bfd));
12256
12257
0
    if (! bfd_link_pic (info))
12258
0
      continue;
12259
12260
0
    for (; got_index < g->local_gotno; got_index++)
12261
0
      {
12262
0
        if (got_index >= g->assigned_low_gotno
12263
0
      && got_index <= g->assigned_high_gotno)
12264
0
    continue;
12265
12266
0
        rel[0].r_offset = rel[1].r_offset = rel[2].r_offset
12267
0
    = got_index * MIPS_ELF_GOT_SIZE (output_bfd);
12268
0
        if (!(mips_elf_create_dynamic_relocation
12269
0
        (output_bfd, info, rel, NULL,
12270
0
         bfd_abs_section_ptr,
12271
0
         0, &addend, sgot)))
12272
0
    return false;
12273
0
        BFD_ASSERT (addend == 0);
12274
0
      }
12275
0
  }
12276
0
    }
12277
12278
  /* The generation of dynamic relocations for the non-primary gots
12279
     adds more dynamic relocations.  We cannot count them until
12280
     here.  */
12281
12282
0
  if (elf_hash_table (info)->dynamic_sections_created)
12283
0
    {
12284
0
      bfd_byte *b;
12285
0
      bool swap_out_p;
12286
12287
0
      BFD_ASSERT (sdyn != NULL);
12288
12289
0
      for (b = sdyn->contents;
12290
0
     b < sdyn->contents + sdyn->size;
12291
0
     b += MIPS_ELF_DYN_SIZE (dynobj))
12292
0
  {
12293
0
    Elf_Internal_Dyn dyn;
12294
0
    asection *s;
12295
12296
    /* Read in the current dynamic entry.  */
12297
0
    (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
12298
12299
    /* Assume that we're going to modify it and write it out.  */
12300
0
    swap_out_p = true;
12301
12302
0
    switch (dyn.d_tag)
12303
0
      {
12304
0
      case DT_RELSZ:
12305
        /* Reduce DT_RELSZ to account for any relocations we
12306
     decided not to make.  This is for the n64 irix rld,
12307
     which doesn't seem to apply any relocations if there
12308
     are trailing null entries.  */
12309
0
        s = mips_elf_rel_dyn_section (info, false);
12310
0
        dyn.d_un.d_val = (s->reloc_count
12311
0
        * (ABI_64_P (output_bfd)
12312
0
           ? sizeof (Elf64_Mips_External_Rel)
12313
0
           : sizeof (Elf32_External_Rel)));
12314
        /* Adjust the section size too.  Tools like the prelinker
12315
     can reasonably expect the values to the same.  */
12316
0
        BFD_ASSERT (!bfd_is_abs_section (s->output_section));
12317
0
        elf_section_data (s->output_section)->this_hdr.sh_size
12318
0
    = dyn.d_un.d_val;
12319
0
        break;
12320
12321
0
      default:
12322
0
        swap_out_p = false;
12323
0
        break;
12324
0
      }
12325
12326
0
    if (swap_out_p)
12327
0
      (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
12328
0
        (dynobj, &dyn, b);
12329
0
  }
12330
0
    }
12331
12332
0
  {
12333
0
    asection *s;
12334
0
    Elf32_compact_rel cpt;
12335
12336
0
    if (SGI_COMPAT (output_bfd))
12337
0
      {
12338
  /* Write .compact_rel section out.  */
12339
0
  s = bfd_get_linker_section (dynobj, ".compact_rel");
12340
0
  if (s != NULL)
12341
0
    {
12342
0
      cpt.id1 = 1;
12343
0
      cpt.num = s->reloc_count;
12344
0
      cpt.id2 = 2;
12345
0
      cpt.offset = (s->output_section->filepos
12346
0
        + sizeof (Elf32_External_compact_rel));
12347
0
      cpt.reserved0 = 0;
12348
0
      cpt.reserved1 = 0;
12349
0
      bfd_elf32_swap_compact_rel_out (output_bfd, &cpt,
12350
0
              ((Elf32_External_compact_rel *)
12351
0
               s->contents));
12352
12353
      /* Clean up a dummy stub function entry in .text.  */
12354
0
      if (htab->sstubs != NULL
12355
0
    && htab->sstubs->contents != NULL)
12356
0
        {
12357
0
    file_ptr dummy_offset;
12358
12359
0
    BFD_ASSERT (htab->sstubs->size >= htab->function_stub_size);
12360
0
    dummy_offset = htab->sstubs->size - htab->function_stub_size;
12361
0
    memset (htab->sstubs->contents + dummy_offset, 0,
12362
0
      htab->function_stub_size);
12363
0
        }
12364
0
    }
12365
0
      }
12366
12367
    /* The psABI says that the dynamic relocations must be sorted in
12368
       increasing order of r_symndx.  The VxWorks EABI doesn't require
12369
       this, and because the code below handles REL rather than RELA
12370
       relocations, using it for VxWorks would be outright harmful.  */
12371
0
    if (htab->root.target_os != is_vxworks)
12372
0
      {
12373
0
  s = mips_elf_rel_dyn_section (info, false);
12374
0
  if (s != NULL
12375
0
      && s->size > (bfd_vma)2 * MIPS_ELF_REL_SIZE (output_bfd))
12376
0
    {
12377
0
      reldyn_sorting_bfd = output_bfd;
12378
12379
0
      if (ABI_64_P (output_bfd))
12380
0
        qsort ((Elf64_External_Rel *) s->contents + 1,
12381
0
         s->reloc_count - 1, sizeof (Elf64_Mips_External_Rel),
12382
0
         sort_dynamic_relocs_64);
12383
0
      else
12384
0
        qsort ((Elf32_External_Rel *) s->contents + 1,
12385
0
         s->reloc_count - 1, sizeof (Elf32_External_Rel),
12386
0
         sort_dynamic_relocs);
12387
0
    }
12388
0
      }
12389
0
  }
12390
12391
0
  if (htab->root.splt && htab->root.splt->size > 0)
12392
0
    {
12393
0
      if (htab->root.target_os == is_vxworks)
12394
0
  {
12395
0
    if (bfd_link_pic (info))
12396
0
      mips_vxworks_finish_shared_plt (output_bfd, info);
12397
0
    else
12398
0
      mips_vxworks_finish_exec_plt (output_bfd, info);
12399
0
  }
12400
0
      else
12401
0
  {
12402
0
    BFD_ASSERT (!bfd_link_pic (info));
12403
0
    if (!mips_finish_exec_plt (output_bfd, info))
12404
0
      return false;
12405
0
  }
12406
0
    }
12407
0
  return true;
12408
0
}
12409
12410
12411
/* Set ABFD's EF_MIPS_ARCH and EF_MIPS_MACH flags.  */
12412
12413
static void
12414
mips_set_isa_flags (bfd *abfd)
12415
22
{
12416
22
  flagword val;
12417
12418
22
  switch (bfd_get_mach (abfd))
12419
22
    {
12420
0
    default:
12421
0
      if (ABI_N32_P (abfd) || ABI_64_P (abfd))
12422
0
        val = MIPS_DEFAULT_R6 ? EF_MIPS_ARCH_64R6 : EF_MIPS_ARCH_3;
12423
0
      else
12424
0
        val = MIPS_DEFAULT_R6 ? EF_MIPS_ARCH_32R6 : EF_MIPS_ARCH_1;
12425
0
      break;
12426
12427
4
    case bfd_mach_mips3000:
12428
4
      val = EF_MIPS_ARCH_1;
12429
4
      break;
12430
12431
0
    case bfd_mach_mips3900:
12432
0
      val = EF_MIPS_ARCH_1 | EF_MIPS_MACH_3900;
12433
0
      break;
12434
12435
16
    case bfd_mach_mips6000:
12436
16
      val = EF_MIPS_ARCH_2;
12437
16
      break;
12438
12439
0
    case bfd_mach_mips4010:
12440
0
      val = EF_MIPS_ARCH_2 | EF_MIPS_MACH_4010;
12441
0
      break;
12442
12443
0
    case bfd_mach_mips_allegrex:
12444
0
      val = EF_MIPS_ARCH_2 | EF_MIPS_MACH_ALLEGREX;
12445
0
      break;
12446
12447
0
    case bfd_mach_mips4000:
12448
0
    case bfd_mach_mips4300:
12449
0
    case bfd_mach_mips4400:
12450
0
    case bfd_mach_mips4600:
12451
0
      val = EF_MIPS_ARCH_3;
12452
0
      break;
12453
12454
0
    case bfd_mach_mips4100:
12455
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_4100;
12456
0
      break;
12457
12458
0
    case bfd_mach_mips4111:
12459
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_4111;
12460
0
      break;
12461
12462
0
    case bfd_mach_mips4120:
12463
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_4120;
12464
0
      break;
12465
12466
0
    case bfd_mach_mips4650:
12467
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_4650;
12468
0
      break;
12469
12470
0
    case bfd_mach_mips5400:
12471
0
      val = EF_MIPS_ARCH_4 | EF_MIPS_MACH_5400;
12472
0
      break;
12473
12474
0
    case bfd_mach_mips5500:
12475
0
      val = EF_MIPS_ARCH_4 | EF_MIPS_MACH_5500;
12476
0
      break;
12477
12478
0
    case bfd_mach_mips5900:
12479
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_5900;
12480
0
      break;
12481
12482
0
    case bfd_mach_mips9000:
12483
0
      val = EF_MIPS_ARCH_4 | EF_MIPS_MACH_9000;
12484
0
      break;
12485
12486
0
    case bfd_mach_mips5000:
12487
0
    case bfd_mach_mips7000:
12488
0
    case bfd_mach_mips8000:
12489
0
    case bfd_mach_mips10000:
12490
0
    case bfd_mach_mips12000:
12491
0
    case bfd_mach_mips14000:
12492
0
    case bfd_mach_mips16000:
12493
0
      val = EF_MIPS_ARCH_4;
12494
0
      break;
12495
12496
0
    case bfd_mach_mips5:
12497
0
      val = EF_MIPS_ARCH_5;
12498
0
      break;
12499
12500
0
    case bfd_mach_mips_loongson_2e:
12501
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_LS2E;
12502
0
      break;
12503
12504
0
    case bfd_mach_mips_loongson_2f:
12505
0
      val = EF_MIPS_ARCH_3 | EF_MIPS_MACH_LS2F;
12506
0
      break;
12507
12508
0
    case bfd_mach_mips_sb1:
12509
0
      val = EF_MIPS_ARCH_64 | EF_MIPS_MACH_SB1;
12510
0
      break;
12511
12512
0
    case bfd_mach_mips_gs464:
12513
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_GS464;
12514
0
      break;
12515
12516
0
    case bfd_mach_mips_gs464e:
12517
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_GS464E;
12518
0
      break;
12519
12520
0
    case bfd_mach_mips_gs264e:
12521
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_GS264E;
12522
0
      break;
12523
12524
0
    case bfd_mach_mips_octeon:
12525
0
    case bfd_mach_mips_octeonp:
12526
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_OCTEON;
12527
0
      break;
12528
12529
0
    case bfd_mach_mips_octeon3:
12530
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_OCTEON3;
12531
0
      break;
12532
12533
0
    case bfd_mach_mips_xlr:
12534
0
      val = EF_MIPS_ARCH_64 | EF_MIPS_MACH_XLR;
12535
0
      break;
12536
12537
0
    case bfd_mach_mips_octeon2:
12538
0
      val = EF_MIPS_ARCH_64R2 | EF_MIPS_MACH_OCTEON2;
12539
0
      break;
12540
12541
0
    case bfd_mach_mipsisa32:
12542
0
      val = EF_MIPS_ARCH_32;
12543
0
      break;
12544
12545
0
    case bfd_mach_mipsisa64:
12546
0
      val = EF_MIPS_ARCH_64;
12547
0
      break;
12548
12549
0
    case bfd_mach_mipsisa32r2:
12550
0
    case bfd_mach_mipsisa32r3:
12551
0
    case bfd_mach_mipsisa32r5:
12552
0
      val = EF_MIPS_ARCH_32R2;
12553
0
      break;
12554
12555
0
    case bfd_mach_mips_interaptiv_mr2:
12556
0
      val = EF_MIPS_ARCH_32R2 | EF_MIPS_MACH_IAMR2;
12557
0
      break;
12558
12559
2
    case bfd_mach_mipsisa64r2:
12560
2
    case bfd_mach_mipsisa64r3:
12561
2
    case bfd_mach_mipsisa64r5:
12562
2
      val = EF_MIPS_ARCH_64R2;
12563
2
      break;
12564
12565
0
    case bfd_mach_mipsisa32r6:
12566
0
      val = EF_MIPS_ARCH_32R6;
12567
0
      break;
12568
12569
0
    case bfd_mach_mipsisa64r6:
12570
0
      val = EF_MIPS_ARCH_64R6;
12571
0
      break;
12572
22
    }
12573
22
  elf_elfheader (abfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
12574
22
  elf_elfheader (abfd)->e_flags |= val;
12575
12576
22
}
12577
12578
12579
/* Whether to sort relocs output by ld -r or ld --emit-relocs, by r_offset.
12580
   Don't do so for code sections.  We want to keep ordering of HI16/LO16
12581
   as is.  On the other hand, elf-eh-frame.c processing requires .eh_frame
12582
   relocs to be sorted.  */
12583
12584
bool
12585
_bfd_mips_elf_sort_relocs_p (asection *sec)
12586
0
{
12587
0
  return (sec->flags & SEC_CODE) == 0;
12588
0
}
12589
12590
12591
/* The final processing done just before writing out a MIPS ELF object
12592
   file.  This gets the MIPS architecture right based on the machine
12593
   number.  This is used by both the 32-bit and the 64-bit ABI.  */
12594
12595
void
12596
_bfd_mips_final_write_processing (bfd *abfd)
12597
22
{
12598
22
  unsigned int i;
12599
22
  Elf_Internal_Shdr **hdrpp;
12600
22
  const char *name;
12601
22
  asection *sec;
12602
12603
  /* Keep the existing EF_MIPS_MACH and EF_MIPS_ARCH flags if the former
12604
     is nonzero.  This is for compatibility with old objects, which used
12605
     a combination of a 32-bit EF_MIPS_ARCH and a 64-bit EF_MIPS_MACH.  */
12606
22
  if ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == 0)
12607
22
    mips_set_isa_flags (abfd);
12608
12609
  /* Set the sh_info field for .gptab sections and other appropriate
12610
     info for each special section.  */
12611
22
  for (i = 1, hdrpp = elf_elfsections (abfd) + 1;
12612
259
       i < elf_numsections (abfd);
12613
237
       i++, hdrpp++)
12614
237
    {
12615
237
      switch ((*hdrpp)->sh_type)
12616
237
  {
12617
0
  case SHT_MIPS_MSYM:
12618
0
  case SHT_MIPS_LIBLIST:
12619
0
    sec = bfd_get_section_by_name (abfd, ".dynstr");
12620
0
    if (sec != NULL)
12621
0
      (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12622
0
    break;
12623
12624
0
  case SHT_MIPS_GPTAB:
12625
0
    BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
12626
0
    name = bfd_section_name ((*hdrpp)->bfd_section);
12627
0
    if (startswith (name, ".gptab."))
12628
0
      {
12629
0
        sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
12630
0
        if (sec != NULL)
12631
0
    (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
12632
0
      }
12633
0
    break;
12634
12635
0
  case SHT_MIPS_CONTENT:
12636
0
    BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
12637
0
    name = bfd_section_name ((*hdrpp)->bfd_section);
12638
0
    if (startswith (name, ".MIPS.content"))
12639
0
      {
12640
0
        sec = bfd_get_section_by_name (abfd,
12641
0
               name + sizeof ".MIPS.content" - 1);
12642
0
        if (sec != NULL)
12643
0
    (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12644
0
      }
12645
0
    break;
12646
12647
0
  case SHT_MIPS_SYMBOL_LIB:
12648
0
    sec = bfd_get_section_by_name (abfd, ".dynsym");
12649
0
    if (sec != NULL)
12650
0
      (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12651
0
    sec = bfd_get_section_by_name (abfd, ".liblist");
12652
0
    if (sec != NULL)
12653
0
      (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
12654
0
    break;
12655
12656
0
  case SHT_MIPS_EVENTS:
12657
0
    BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
12658
0
    name = bfd_section_name ((*hdrpp)->bfd_section);
12659
0
    if (startswith (name, ".MIPS.events"))
12660
0
      sec = bfd_get_section_by_name (abfd,
12661
0
             name + sizeof ".MIPS.events" - 1);
12662
0
    else if (startswith (name, ".MIPS.post_rel"))
12663
0
      sec = bfd_get_section_by_name (abfd,
12664
0
             name + sizeof ".MIPS.post_rel" - 1);
12665
0
    else
12666
0
      sec = NULL;
12667
0
    if (sec != NULL)
12668
0
      (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12669
0
    break;
12670
12671
0
  case SHT_MIPS_XHASH:
12672
0
    sec = bfd_get_section_by_name (abfd, ".dynsym");
12673
0
    if (sec != NULL)
12674
0
      (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12675
237
  }
12676
237
    }
12677
22
}
12678
12679
bool
12680
_bfd_mips_elf_final_write_processing (bfd *abfd)
12681
22
{
12682
22
  _bfd_mips_final_write_processing (abfd);
12683
22
  return _bfd_elf_final_write_processing (abfd);
12684
22
}
12685

12686
/* When creating an IRIX5 executable, we need REGINFO and RTPROC
12687
   segments.  */
12688
12689
int
12690
_bfd_mips_elf_additional_program_headers (bfd *abfd,
12691
            struct bfd_link_info *info ATTRIBUTE_UNUSED)
12692
0
{
12693
0
  asection *s;
12694
0
  int ret = 0;
12695
12696
  /* See if we need a PT_MIPS_REGINFO segment.  */
12697
0
  s = bfd_get_section_by_name (abfd, ".reginfo");
12698
0
  if (s && (s->flags & SEC_LOAD))
12699
0
    ++ret;
12700
12701
  /* See if we need a PT_MIPS_ABIFLAGS segment.  */
12702
0
  if (bfd_get_section_by_name (abfd, ".MIPS.abiflags"))
12703
0
    ++ret;
12704
12705
  /* See if we need a PT_MIPS_OPTIONS segment.  */
12706
0
  if (IRIX_COMPAT (abfd) == ict_irix6
12707
0
      && bfd_get_section_by_name (abfd,
12708
0
          MIPS_ELF_OPTIONS_SECTION_NAME (abfd)))
12709
0
    ++ret;
12710
12711
  /* See if we need a PT_MIPS_RTPROC segment.  */
12712
0
  if (IRIX_COMPAT (abfd) == ict_irix5
12713
0
      && bfd_get_section_by_name (abfd, ".dynamic")
12714
0
      && bfd_get_section_by_name (abfd, ".mdebug"))
12715
0
    ++ret;
12716
12717
  /* Allocate a PT_NULL header in dynamic objects.  See
12718
     _bfd_mips_elf_modify_segment_map for details.  */
12719
0
  if (!SGI_COMPAT (abfd)
12720
0
      && bfd_get_section_by_name (abfd, ".dynamic"))
12721
0
    ++ret;
12722
12723
0
  return ret;
12724
0
}
12725
12726
/* Modify the segment map for an IRIX5 executable.  */
12727
12728
bool
12729
_bfd_mips_elf_modify_segment_map (bfd *abfd,
12730
          struct bfd_link_info *info)
12731
0
{
12732
0
  asection *s;
12733
0
  struct elf_segment_map *m, **pm;
12734
0
  size_t amt;
12735
12736
  /* If there is a .reginfo section, we need a PT_MIPS_REGINFO
12737
     segment.  */
12738
0
  s = bfd_get_section_by_name (abfd, ".reginfo");
12739
0
  if (s != NULL && (s->flags & SEC_LOAD) != 0)
12740
0
    {
12741
0
      for (m = elf_seg_map (abfd); m != NULL; m = m->next)
12742
0
  if (m->p_type == PT_MIPS_REGINFO)
12743
0
    break;
12744
0
      if (m == NULL)
12745
0
  {
12746
0
    amt = sizeof *m;
12747
0
    m = bfd_zalloc (abfd, amt);
12748
0
    if (m == NULL)
12749
0
      return false;
12750
12751
0
    m->p_type = PT_MIPS_REGINFO;
12752
0
    m->count = 1;
12753
0
    m->sections[0] = s;
12754
12755
    /* We want to put it after the PHDR and INTERP segments.  */
12756
0
    pm = &elf_seg_map (abfd);
12757
0
    while (*pm != NULL
12758
0
     && ((*pm)->p_type == PT_PHDR
12759
0
         || (*pm)->p_type == PT_INTERP))
12760
0
      pm = &(*pm)->next;
12761
12762
0
    m->next = *pm;
12763
0
    *pm = m;
12764
0
  }
12765
0
    }
12766
12767
  /* If there is a .MIPS.abiflags section, we need a PT_MIPS_ABIFLAGS
12768
     segment.  */
12769
0
  s = bfd_get_section_by_name (abfd, ".MIPS.abiflags");
12770
0
  if (s != NULL && (s->flags & SEC_LOAD) != 0)
12771
0
    {
12772
0
      for (m = elf_seg_map (abfd); m != NULL; m = m->next)
12773
0
  if (m->p_type == PT_MIPS_ABIFLAGS)
12774
0
    break;
12775
0
      if (m == NULL)
12776
0
  {
12777
0
    amt = sizeof *m;
12778
0
    m = bfd_zalloc (abfd, amt);
12779
0
    if (m == NULL)
12780
0
      return false;
12781
12782
0
    m->p_type = PT_MIPS_ABIFLAGS;
12783
0
    m->count = 1;
12784
0
    m->sections[0] = s;
12785
12786
    /* We want to put it after the PHDR and INTERP segments.  */
12787
0
    pm = &elf_seg_map (abfd);
12788
0
    while (*pm != NULL
12789
0
     && ((*pm)->p_type == PT_PHDR
12790
0
         || (*pm)->p_type == PT_INTERP))
12791
0
      pm = &(*pm)->next;
12792
12793
0
    m->next = *pm;
12794
0
    *pm = m;
12795
0
  }
12796
0
    }
12797
12798
  /* For IRIX 6, we don't have .mdebug sections, nor does anything but
12799
     .dynamic end up in PT_DYNAMIC.  However, we do have to insert a
12800
     PT_MIPS_OPTIONS segment immediately following the program header
12801
     table.  */
12802
0
  if (NEWABI_P (abfd)
12803
      /* On non-IRIX6 new abi, we'll have already created a segment
12804
   for this section, so don't create another.  I'm not sure this
12805
   is not also the case for IRIX 6, but I can't test it right
12806
   now.  */
12807
0
      && IRIX_COMPAT (abfd) == ict_irix6)
12808
0
    {
12809
0
      for (s = abfd->sections; s; s = s->next)
12810
0
  if (elf_section_data (s)->this_hdr.sh_type == SHT_MIPS_OPTIONS)
12811
0
    break;
12812
12813
0
      if (s)
12814
0
  {
12815
0
    struct elf_segment_map *options_segment;
12816
12817
0
    pm = &elf_seg_map (abfd);
12818
0
    while (*pm != NULL
12819
0
     && ((*pm)->p_type == PT_PHDR
12820
0
         || (*pm)->p_type == PT_INTERP))
12821
0
      pm = &(*pm)->next;
12822
12823
0
    if (*pm == NULL || (*pm)->p_type != PT_MIPS_OPTIONS)
12824
0
      {
12825
0
        amt = sizeof (struct elf_segment_map);
12826
0
        options_segment = bfd_zalloc (abfd, amt);
12827
0
        options_segment->next = *pm;
12828
0
        options_segment->p_type = PT_MIPS_OPTIONS;
12829
0
        options_segment->p_flags = PF_R;
12830
0
        options_segment->p_flags_valid = true;
12831
0
        options_segment->count = 1;
12832
0
        options_segment->sections[0] = s;
12833
0
        *pm = options_segment;
12834
0
      }
12835
0
  }
12836
0
    }
12837
0
  else
12838
0
    {
12839
0
      if (IRIX_COMPAT (abfd) == ict_irix5)
12840
0
  {
12841
    /* If there are .dynamic and .mdebug sections, we make a room
12842
       for the RTPROC header.  FIXME: Rewrite without section names.  */
12843
0
    if (bfd_get_section_by_name (abfd, ".interp") == NULL
12844
0
        && bfd_get_section_by_name (abfd, ".dynamic") != NULL
12845
0
        && bfd_get_section_by_name (abfd, ".mdebug") != NULL)
12846
0
      {
12847
0
        for (m = elf_seg_map (abfd); m != NULL; m = m->next)
12848
0
    if (m->p_type == PT_MIPS_RTPROC)
12849
0
      break;
12850
0
        if (m == NULL)
12851
0
    {
12852
0
      amt = sizeof *m;
12853
0
      m = bfd_zalloc (abfd, amt);
12854
0
      if (m == NULL)
12855
0
        return false;
12856
12857
0
      m->p_type = PT_MIPS_RTPROC;
12858
12859
0
      s = bfd_get_section_by_name (abfd, ".rtproc");
12860
0
      if (s == NULL)
12861
0
        {
12862
0
          m->count = 0;
12863
0
          m->p_flags = 0;
12864
0
          m->p_flags_valid = 1;
12865
0
        }
12866
0
      else
12867
0
        {
12868
0
          m->count = 1;
12869
0
          m->sections[0] = s;
12870
0
        }
12871
12872
      /* We want to put it after the DYNAMIC segment.  */
12873
0
      pm = &elf_seg_map (abfd);
12874
0
      while (*pm != NULL && (*pm)->p_type != PT_DYNAMIC)
12875
0
        pm = &(*pm)->next;
12876
0
      if (*pm != NULL)
12877
0
        pm = &(*pm)->next;
12878
12879
0
      m->next = *pm;
12880
0
      *pm = m;
12881
0
    }
12882
0
      }
12883
0
  }
12884
      /* On IRIX5, the PT_DYNAMIC segment includes the .dynamic,
12885
   .dynstr, .dynsym, and .hash sections, and everything in
12886
   between.  We avoid any sections though ahead of .dynamic,
12887
   which needs to be first to be usable.  This can only ever
12888
   happen with a non-standard linker script.  */
12889
0
      for (pm = &elf_seg_map (abfd); *pm != NULL;
12890
0
     pm = &(*pm)->next)
12891
0
  if ((*pm)->p_type == PT_DYNAMIC)
12892
0
    break;
12893
0
      m = *pm;
12894
      /* GNU/Linux binaries do not need the extended PT_DYNAMIC section.
12895
   glibc's dynamic linker has traditionally derived the number of
12896
   tags from the p_filesz field, and sometimes allocates stack
12897
   arrays of that size.  An overly-big PT_DYNAMIC segment can
12898
   be actively harmful in such cases.  Making PT_DYNAMIC contain
12899
   other sections can also make life hard for the prelinker,
12900
   which might move one of the other sections to a different
12901
   PT_LOAD segment.  */
12902
0
      if (SGI_COMPAT (abfd)
12903
0
    && m != NULL
12904
0
    && m->count == 1
12905
0
    && strcmp (m->sections[0]->name, ".dynamic") == 0
12906
0
    && (m->sections[0]->flags & SEC_LOAD) != 0)
12907
0
  {
12908
0
    static const char *sec_names[] =
12909
0
    {
12910
0
      ".dynstr", ".dynsym", ".hash"
12911
0
    };
12912
0
    bfd_vma low, high;
12913
0
    unsigned int i, c;
12914
0
    struct elf_segment_map *n;
12915
12916
0
    low = m->sections[0]->vma;
12917
0
    high = low + m->sections[0]->size;
12918
0
    for (i = 0; i < sizeof sec_names / sizeof sec_names[0]; i++)
12919
0
      {
12920
0
        s = bfd_get_section_by_name (abfd, sec_names[i]);
12921
0
        if (s != NULL && (s->flags & SEC_LOAD) != 0)
12922
0
    {
12923
0
      bfd_size_type sz;
12924
12925
0
      if (low > s->vma)
12926
0
        continue;
12927
0
      sz = s->size;
12928
0
      if (high < s->vma + sz)
12929
0
        high = s->vma + sz;
12930
0
    }
12931
0
      }
12932
12933
0
    c = 0;
12934
0
    for (s = abfd->sections; s != NULL; s = s->next)
12935
0
      if ((s->flags & SEC_LOAD) != 0
12936
0
    && s->vma >= low
12937
0
    && s->vma + s->size <= high)
12938
0
        ++c;
12939
12940
0
    amt = sizeof *n - sizeof (asection *) + c * sizeof (asection *);
12941
0
    n = bfd_zalloc (abfd, amt);
12942
0
    if (n == NULL)
12943
0
      return false;
12944
0
    *n = *m;
12945
0
    n->count = c;
12946
12947
0
    i = 0;
12948
0
    for (s = abfd->sections; s != NULL; s = s->next)
12949
0
      {
12950
0
        if ((s->flags & SEC_LOAD) != 0
12951
0
      && s->vma >= low
12952
0
      && s->vma + s->size <= high)
12953
0
    {
12954
0
      n->sections[i] = s;
12955
0
      ++i;
12956
0
    }
12957
0
      }
12958
12959
0
    *pm = n;
12960
0
  }
12961
0
    }
12962
12963
  /* Allocate a spare program header in dynamic objects so that tools
12964
     like the prelinker can add an extra PT_LOAD entry.
12965
12966
     If the prelinker needs to make room for a new PT_LOAD entry, its
12967
     standard procedure is to move the first (read-only) sections into
12968
     the new (writable) segment.  However, the MIPS ABI requires
12969
     .dynamic to be in a read-only segment, and the section will often
12970
     start within sizeof (ElfNN_Phdr) bytes of the last program header.
12971
12972
     Although the prelinker could in principle move .dynamic to a
12973
     writable segment, it seems better to allocate a spare program
12974
     header instead, and avoid the need to move any sections.
12975
     There is a long tradition of allocating spare dynamic tags,
12976
     so allocating a spare program header seems like a natural
12977
     extension.
12978
12979
     If INFO is NULL, we may be copying an already prelinked binary
12980
     with objcopy or strip, so do not add this header.  */
12981
0
  if (info != NULL
12982
0
      && !SGI_COMPAT (abfd)
12983
0
      && bfd_get_section_by_name (abfd, ".dynamic"))
12984
0
    {
12985
0
      for (pm = &elf_seg_map (abfd); *pm != NULL; pm = &(*pm)->next)
12986
0
  if ((*pm)->p_type == PT_NULL)
12987
0
    break;
12988
0
      if (*pm == NULL)
12989
0
  {
12990
0
    m = bfd_zalloc (abfd, sizeof (*m));
12991
0
    if (m == NULL)
12992
0
      return false;
12993
12994
0
    m->p_type = PT_NULL;
12995
0
    *pm = m;
12996
0
  }
12997
0
    }
12998
12999
0
  return true;
13000
0
}
13001

13002
/* Return the section that should be marked against GC for a given
13003
   relocation.  */
13004
13005
asection *
13006
_bfd_mips_elf_gc_mark_hook (asection *sec,
13007
          struct bfd_link_info *info,
13008
          struct elf_reloc_cookie *cookie,
13009
          struct elf_link_hash_entry *h,
13010
          unsigned int symndx)
13011
0
{
13012
  /* ??? Do mips16 stub sections need to be handled special?  */
13013
13014
0
  if (h != NULL)
13015
0
    switch (ELF_R_TYPE (sec->owner, cookie->rel->r_info))
13016
0
      {
13017
0
      case R_MIPS_GNU_VTINHERIT:
13018
0
      case R_MIPS_GNU_VTENTRY:
13019
0
  return NULL;
13020
0
      }
13021
13022
0
  return _bfd_elf_gc_mark_hook (sec, info, cookie, h, symndx);
13023
0
}
13024
13025
/* Prevent .MIPS.abiflags from being discarded with --gc-sections.  */
13026
13027
bool
13028
_bfd_mips_elf_gc_mark_extra_sections (struct bfd_link_info *info,
13029
              elf_gc_mark_hook_fn gc_mark_hook)
13030
0
{
13031
0
  bfd *sub;
13032
13033
0
  _bfd_elf_gc_mark_extra_sections (info, gc_mark_hook);
13034
13035
0
  for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
13036
0
    {
13037
0
      asection *o;
13038
13039
0
      if (! is_mips_elf (sub))
13040
0
  continue;
13041
13042
0
      for (o = sub->sections; o != NULL; o = o->next)
13043
0
  if (!o->gc_mark
13044
0
      && MIPS_ELF_ABIFLAGS_SECTION_NAME_P (bfd_section_name (o)))
13045
0
    {
13046
0
      if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
13047
0
        return false;
13048
0
    }
13049
0
    }
13050
13051
0
  return true;
13052
0
}
13053

13054
/* Copy data from a MIPS ELF indirect symbol to its direct symbol,
13055
   hiding the old indirect symbol.  Process additional relocation
13056
   information.  Also called for weakdefs, in which case we just let
13057
   _bfd_elf_link_hash_copy_indirect copy the flags for us.  */
13058
13059
void
13060
_bfd_mips_elf_copy_indirect_symbol (struct bfd_link_info *info,
13061
            struct elf_link_hash_entry *dir,
13062
            struct elf_link_hash_entry *ind)
13063
0
{
13064
0
  struct mips_elf_link_hash_entry *dirmips, *indmips;
13065
13066
0
  _bfd_elf_link_hash_copy_indirect (info, dir, ind);
13067
13068
0
  dirmips = (struct mips_elf_link_hash_entry *) dir;
13069
0
  indmips = (struct mips_elf_link_hash_entry *) ind;
13070
  /* Any absolute non-dynamic relocations against an indirect or weak
13071
     definition will be against the target symbol.  */
13072
0
  if (indmips->has_static_relocs)
13073
0
    dirmips->has_static_relocs = true;
13074
13075
0
  if (ind->root.type != bfd_link_hash_indirect)
13076
0
    return;
13077
13078
0
  dirmips->possibly_dynamic_relocs += indmips->possibly_dynamic_relocs;
13079
0
  if (indmips->readonly_reloc)
13080
0
    dirmips->readonly_reloc = true;
13081
0
  if (indmips->no_fn_stub)
13082
0
    dirmips->no_fn_stub = true;
13083
0
  if (indmips->fn_stub)
13084
0
    {
13085
0
      dirmips->fn_stub = indmips->fn_stub;
13086
0
      indmips->fn_stub = NULL;
13087
0
    }
13088
0
  if (indmips->need_fn_stub)
13089
0
    {
13090
0
      dirmips->need_fn_stub = true;
13091
0
      indmips->need_fn_stub = false;
13092
0
    }
13093
0
  if (indmips->call_stub)
13094
0
    {
13095
0
      dirmips->call_stub = indmips->call_stub;
13096
0
      indmips->call_stub = NULL;
13097
0
    }
13098
0
  if (indmips->call_fp_stub)
13099
0
    {
13100
0
      dirmips->call_fp_stub = indmips->call_fp_stub;
13101
0
      indmips->call_fp_stub = NULL;
13102
0
    }
13103
0
  if (indmips->global_got_area < dirmips->global_got_area)
13104
0
    dirmips->global_got_area = indmips->global_got_area;
13105
0
  if (indmips->global_got_area < GGA_NONE)
13106
0
    indmips->global_got_area = GGA_NONE;
13107
0
  if (indmips->has_nonpic_branches)
13108
0
    dirmips->has_nonpic_branches = true;
13109
0
}
13110
13111
/* Take care of the special `__gnu_absolute_zero' symbol and ignore attempts
13112
   to hide it.  It has to remain global (it will also be protected) so as to
13113
   be assigned a global GOT entry, which will then remain unchanged at load
13114
   time.  */
13115
13116
void
13117
_bfd_mips_elf_hide_symbol (struct bfd_link_info *info,
13118
         struct elf_link_hash_entry *entry,
13119
         bool force_local)
13120
0
{
13121
0
  struct mips_elf_link_hash_table *htab;
13122
13123
0
  htab = mips_elf_hash_table (info);
13124
0
  BFD_ASSERT (htab != NULL);
13125
0
  if (htab->use_absolute_zero
13126
0
      && strcmp (entry->root.root.string, "__gnu_absolute_zero") == 0)
13127
0
    return;
13128
13129
0
  _bfd_elf_link_hash_hide_symbol (info, entry, force_local);
13130
0
}
13131

13132
0
#define PDR_SIZE 32
13133
13134
bool
13135
_bfd_mips_elf_discard_info (bfd *abfd, struct elf_reloc_cookie *cookie,
13136
          struct bfd_link_info *info)
13137
0
{
13138
0
  asection *o;
13139
0
  bool ret = false;
13140
0
  unsigned char *tdata;
13141
0
  size_t i, skip;
13142
13143
0
  o = bfd_get_section_by_name (abfd, ".pdr");
13144
0
  if (! o)
13145
0
    return false;
13146
0
  if (o->size == 0)
13147
0
    return false;
13148
0
  if (o->size % PDR_SIZE != 0)
13149
0
    return false;
13150
0
  if (o->output_section != NULL
13151
0
      && bfd_is_abs_section (o->output_section))
13152
0
    return false;
13153
13154
0
  tdata = bfd_zmalloc (o->size / PDR_SIZE);
13155
0
  if (! tdata)
13156
0
    return false;
13157
13158
0
  cookie->rels = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
13159
0
              info->keep_memory);
13160
0
  if (!cookie->rels)
13161
0
    {
13162
0
      free (tdata);
13163
0
      return false;
13164
0
    }
13165
13166
0
  cookie->rel = cookie->rels;
13167
0
  cookie->relend = cookie->rels + o->reloc_count;
13168
13169
0
  for (i = 0, skip = 0; i < o->size / PDR_SIZE; i ++)
13170
0
    {
13171
0
      if (bfd_elf_reloc_symbol_deleted_p (i * PDR_SIZE, cookie))
13172
0
  {
13173
0
    tdata[i] = 1;
13174
0
    skip ++;
13175
0
  }
13176
0
    }
13177
13178
0
  if (skip != 0)
13179
0
    {
13180
0
      mips_elf_section_data (o)->u.tdata = tdata;
13181
0
      if (o->rawsize == 0)
13182
0
  o->rawsize = o->size;
13183
0
      o->size -= skip * PDR_SIZE;
13184
0
      ret = true;
13185
0
    }
13186
0
  else
13187
0
    free (tdata);
13188
13189
0
  if (! info->keep_memory)
13190
0
    free (cookie->rels);
13191
13192
0
  return ret;
13193
0
}
13194
13195
bool
13196
_bfd_mips_elf_ignore_discarded_relocs (asection *sec)
13197
0
{
13198
0
  if (strcmp (sec->name, ".pdr") == 0)
13199
0
    return true;
13200
0
  return false;
13201
0
}
13202
13203
bool
13204
_bfd_mips_elf_write_section (bfd *output_bfd,
13205
           struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
13206
           asection *sec, bfd_byte *contents)
13207
0
{
13208
0
  bfd_byte *to, *from, *end;
13209
0
  int i;
13210
13211
0
  if (strcmp (sec->name, ".pdr") != 0)
13212
0
    return false;
13213
13214
0
  if (mips_elf_section_data (sec)->u.tdata == NULL)
13215
0
    return false;
13216
13217
0
  to = contents;
13218
0
  end = contents + sec->size;
13219
0
  for (from = contents, i = 0;
13220
0
       from < end;
13221
0
       from += PDR_SIZE, i++)
13222
0
    {
13223
0
      if ((mips_elf_section_data (sec)->u.tdata)[i] == 1)
13224
0
  continue;
13225
0
      if (to != from)
13226
0
  memcpy (to, from, PDR_SIZE);
13227
0
      to += PDR_SIZE;
13228
0
    }
13229
0
  bfd_set_section_contents (output_bfd, sec->output_section, contents,
13230
0
          sec->output_offset, sec->size);
13231
0
  return true;
13232
0
}
13233

13234
/* microMIPS code retains local labels for linker relaxation.  Omit them
13235
   from output by default for clarity.  */
13236
13237
bool
13238
_bfd_mips_elf_is_target_special_symbol (bfd *abfd, asymbol *sym)
13239
2.80k
{
13240
2.80k
  return _bfd_elf_is_local_label_name (abfd, sym->name);
13241
2.80k
}
13242
13243
/* Helper for `mips_elf_free_hi16_list'.  Resolve an orphan REL high-part
13244
   relocation according to HI.  Return TRUE if succeeded, otherwise FALSE.  */
13245
13246
static bool
13247
_bfd_mips_elf_orphan_shr16_reloc (bfd *abfd, asection *sec,
13248
          struct mips_hi16 *hi,
13249
          struct bfd_link_info *info)
13250
2
{
13251
2
  asymbol *symbol = *hi->rel.sym_ptr_ptr;
13252
2
  const char *name = hi->rel.howto->name;
13253
2
  char *error_message = NULL;
13254
2
  bfd_reloc_status_type r;
13255
13256
2
  r = _bfd_mips_elf_shr16_reloc (abfd, &hi->rel, symbol, hi->data,
13257
2
         sec, hi->output_bfd, &error_message);
13258
2
  if (r == bfd_reloc_ok)
13259
2
    {
13260
2
      if (info != NULL)
13261
2
  {
13262
    /* xgettext:c-format */
13263
2
    error_message = bfd_asprintf (_("can't find matching LO16 reloc"
13264
2
            " against `%s' for %s at %#" PRIx64
13265
2
            " in section `%s'"),
13266
2
          symbol->name, name,
13267
2
          (uint64_t) hi->rel.address, sec->name);
13268
2
    if (error_message == NULL)
13269
0
      return false;
13270
2
    info->callbacks->warning
13271
2
      (info, error_message, symbol->name, sec->owner, sec,
13272
2
       hi->rel.address);
13273
2
  }
13274
2
      return true;
13275
2
    }
13276
13277
0
  if (info != NULL)
13278
0
    _bfd_link_reloc_status_error (abfd, info, sec, &hi->rel, error_message, r);
13279
0
  else
13280
0
    _bfd_error_handler (_("%pB(%pA+%#" PRIx64 "): %s relocation error"),
13281
0
      abfd, sec, (uint64_t) hi->rel.address,
13282
0
      hi->rel.howto->name);
13283
0
  bfd_set_error (bfd_error_bad_value);
13284
0
  return false;
13285
2
}
13286
13287
/* Resolve any outstanding orphan REL high-part relocations if INSTALL
13288
   is TRUE, and release their occupied memory.  */
13289
13290
static bool
13291
mips_elf_free_hi16_list (bfd *abfd, asection *sec, bool install,
13292
       struct bfd_link_info *info)
13293
41.6k
{
13294
41.6k
  bfd_error_type error_tag = bfd_get_error ();
13295
41.6k
  struct _mips_elf_section_data *sdata;
13296
41.6k
  bool status = true;
13297
13298
41.6k
  BFD_ASSERT (is_mips_elf (abfd));
13299
41.6k
  sdata = mips_elf_section_data (sec);
13300
41.6k
  while (sdata->mips_hi16_list != NULL)
13301
3
    {
13302
3
      struct mips_hi16 *hi = sdata->mips_hi16_list;
13303
13304
3
      if (install)
13305
2
  status &= _bfd_mips_elf_orphan_shr16_reloc (abfd, sec, hi, info);
13306
3
      if (!status && error_tag == bfd_error_no_error)
13307
0
  error_tag = bfd_get_error ();
13308
13309
3
      sdata->mips_hi16_list = hi->next;
13310
3
      free (hi);
13311
3
    }
13312
13313
41.6k
  bfd_set_error (error_tag);
13314
41.6k
  return status;
13315
41.6k
}
13316
13317
/* Resolve any outstanding orphan REL high-part relocations before
13318
   calling the generic BFD handler.  */
13319
13320
bool
13321
_bfd_mips_elf_finalize_section_relocs (bfd *abfd, asection *asect,
13322
               arelent **location, unsigned int count)
13323
156
{
13324
156
  if (!mips_elf_free_hi16_list (abfd, asect, true, NULL))
13325
0
    return false;
13326
156
  return _bfd_generic_finalize_section_relocs (abfd, asect, location, count);
13327
156
}
13328
13329
bool
13330
_bfd_mips_elf_find_nearest_line (bfd *abfd, asymbol **symbols,
13331
         asection *section, bfd_vma offset,
13332
         const char **filename_ptr,
13333
         const char **functionname_ptr,
13334
         unsigned int *line_ptr,
13335
         unsigned int *discriminator_ptr)
13336
6.77k
{
13337
6.77k
  asection *msec;
13338
13339
6.77k
  if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
13340
6.77k
             filename_ptr, functionname_ptr,
13341
6.77k
             line_ptr, discriminator_ptr,
13342
6.77k
             dwarf_debug_sections,
13343
6.77k
             &elf_tdata (abfd)->dwarf2_find_line_info)
13344
6.77k
      == 1)
13345
0
    return true;
13346
13347
6.77k
  if (_bfd_dwarf1_find_nearest_line (abfd, symbols, section, offset,
13348
6.77k
             filename_ptr, functionname_ptr,
13349
6.77k
             line_ptr))
13350
0
    {
13351
0
      if (!*functionname_ptr)
13352
0
  _bfd_elf_find_function (abfd, symbols, section, offset,
13353
0
        *filename_ptr ? NULL : filename_ptr,
13354
0
        functionname_ptr);
13355
0
      return true;
13356
0
    }
13357
13358
6.77k
  msec = bfd_get_section_by_name (abfd, ".mdebug");
13359
6.77k
  if (msec != NULL)
13360
5.38k
    {
13361
5.38k
      flagword origflags;
13362
5.38k
      struct mips_elf_find_line *fi;
13363
5.38k
      const struct ecoff_debug_swap * const swap =
13364
5.38k
  get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
13365
13366
      /* If we are called during a link, mips_elf_final_link may have
13367
   cleared the SEC_HAS_CONTENTS field.  We force it back on here
13368
   if appropriate (which it normally will be).  */
13369
5.38k
      origflags = msec->flags;
13370
5.38k
      if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
13371
5.34k
  msec->flags |= SEC_HAS_CONTENTS;
13372
13373
5.38k
      fi = mips_elf_tdata (abfd)->find_line_info;
13374
5.38k
      if (fi == NULL)
13375
3.98k
  {
13376
3.98k
    bfd_size_type external_fdr_size;
13377
3.98k
    char *fraw_src;
13378
3.98k
    char *fraw_end;
13379
3.98k
    struct fdr *fdr_ptr;
13380
3.98k
    bfd_size_type amt = sizeof (struct mips_elf_find_line);
13381
13382
3.98k
    fi = bfd_zalloc (abfd, amt);
13383
3.98k
    if (fi == NULL)
13384
0
      {
13385
0
        msec->flags = origflags;
13386
0
        return false;
13387
0
      }
13388
13389
3.98k
    if (! _bfd_mips_elf_read_ecoff_info (abfd, msec, &fi->d))
13390
3.72k
      {
13391
3.72k
        msec->flags = origflags;
13392
3.72k
        return false;
13393
3.72k
      }
13394
13395
    /* Swap in the FDR information.  */
13396
260
    amt = fi->d.symbolic_header.ifdMax * sizeof (struct fdr);
13397
260
    fi->d.fdr = bfd_alloc (abfd, amt);
13398
260
    if (fi->d.fdr == NULL)
13399
0
      {
13400
0
        _bfd_ecoff_free_ecoff_debug_info (&fi->d);
13401
0
        msec->flags = origflags;
13402
0
        return false;
13403
0
      }
13404
260
    external_fdr_size = swap->external_fdr_size;
13405
260
    fdr_ptr = fi->d.fdr;
13406
260
    fraw_src = (char *) fi->d.external_fdr;
13407
260
    fraw_end = (fraw_src
13408
260
          + fi->d.symbolic_header.ifdMax * external_fdr_size);
13409
24.8k
    for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
13410
24.5k
      (*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr);
13411
13412
260
    mips_elf_tdata (abfd)->find_line_info = fi;
13413
260
  }
13414
13415
1.66k
      if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
13416
1.66k
          &fi->i, filename_ptr, functionname_ptr,
13417
1.66k
          line_ptr))
13418
956
  {
13419
956
    msec->flags = origflags;
13420
956
    return true;
13421
956
  }
13422
13423
712
      msec->flags = origflags;
13424
712
    }
13425
13426
  /* Fall back on the generic ELF find_nearest_line routine.  */
13427
13428
2.09k
  return _bfd_elf_find_nearest_line (abfd, symbols, section, offset,
13429
2.09k
             filename_ptr, functionname_ptr,
13430
2.09k
             line_ptr, discriminator_ptr);
13431
6.77k
}
13432
13433
bool
13434
_bfd_mips_elf_find_inliner_info (bfd *abfd,
13435
         const char **filename_ptr,
13436
         const char **functionname_ptr,
13437
         unsigned int *line_ptr)
13438
0
{
13439
0
  bool found;
13440
0
  found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
13441
0
           functionname_ptr, line_ptr,
13442
0
           & elf_tdata (abfd)->dwarf2_find_line_info);
13443
0
  return found;
13444
0
}
13445
13446

13447
/* When are writing out the .options or .MIPS.options section,
13448
   remember the bytes we are writing out, so that we can install the
13449
   GP value in the section_processing routine.  */
13450
13451
bool
13452
_bfd_mips_elf_set_section_contents (bfd *abfd, sec_ptr section,
13453
            const void *location,
13454
            file_ptr offset, bfd_size_type count)
13455
129
{
13456
129
  if (MIPS_ELF_OPTIONS_SECTION_NAME_P (section->name))
13457
0
    {
13458
0
      bfd_byte *c;
13459
13460
0
      if (elf_section_data (section) == NULL)
13461
0
  {
13462
0
    size_t amt = sizeof (struct bfd_elf_section_data);
13463
0
    section->used_by_bfd = bfd_zalloc (abfd, amt);
13464
0
    if (elf_section_data (section) == NULL)
13465
0
      return false;
13466
0
  }
13467
0
      c = mips_elf_section_data (section)->u.tdata;
13468
0
      if (c == NULL)
13469
0
  {
13470
0
    c = bfd_zalloc (abfd, section->size);
13471
0
    if (c == NULL)
13472
0
      return false;
13473
0
    mips_elf_section_data (section)->u.tdata = c;
13474
0
  }
13475
13476
0
      memcpy (c + offset, location, count);
13477
0
    }
13478
13479
129
  return _bfd_elf_set_section_contents (abfd, section, location, offset,
13480
129
          count);
13481
129
}
13482
13483
/* This is almost identical to bfd_generic_get_... except that some
13484
   MIPS relocations need to be handled specially.  Sigh.  */
13485
13486
bfd_byte *
13487
_bfd_elf_mips_get_relocated_section_contents
13488
  (bfd *abfd,
13489
   struct bfd_link_info *link_info,
13490
   struct bfd_link_order *link_order,
13491
   bfd_byte *data,
13492
   bool relocatable,
13493
   asymbol **symbols)
13494
288
{
13495
288
  bfd *input_bfd = link_order->u.indirect.section->owner;
13496
288
  asection *input_section = link_order->u.indirect.section;
13497
288
  long reloc_size;
13498
288
  arelent **reloc_vector;
13499
288
  long reloc_count = 0;
13500
288
  bool install = true;
13501
13502
288
  reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
13503
288
  if (reloc_size < 0)
13504
7
    return NULL;
13505
13506
  /* Read in the section.  */
13507
281
  bfd_byte *orig_data = data;
13508
281
  if (!bfd_get_full_section_contents (input_bfd, input_section, &data))
13509
2
    return NULL;
13510
13511
279
  if (data == NULL)
13512
1
    return NULL;
13513
13514
278
  if (reloc_size == 0)
13515
0
    return data;
13516
13517
278
  reloc_vector = (arelent **) bfd_malloc (reloc_size);
13518
278
  if (reloc_vector != NULL)
13519
278
    reloc_count = bfd_canonicalize_reloc (input_bfd, input_section,
13520
278
            reloc_vector, symbols);
13521
13522
278
  if (reloc_vector == NULL || reloc_count < 0)
13523
133
    {
13524
133
      install = false;
13525
133
      if (orig_data == NULL)
13526
3
  free (data);
13527
133
      data = NULL;
13528
133
      goto out;
13529
133
    }
13530
13531
145
  if (reloc_count > 0)
13532
127
    {
13533
127
      arelent **parent;
13534
      /* for mips */
13535
127
      int gp_found;
13536
127
      bfd_vma gp = 0x12345678;  /* initialize just to shut gcc up */
13537
13538
127
      {
13539
127
  struct bfd_hash_entry *h;
13540
127
  struct bfd_link_hash_entry *lh;
13541
  /* Skip all this stuff if we aren't mixing formats.  */
13542
127
  if (abfd && input_bfd
13543
127
      && abfd->xvec == input_bfd->xvec)
13544
127
    lh = 0;
13545
0
  else
13546
0
    {
13547
0
      h = bfd_hash_lookup (&link_info->hash->table, "_gp", false, false);
13548
0
      lh = (struct bfd_link_hash_entry *) h;
13549
0
    }
13550
127
      lookup:
13551
127
  if (lh)
13552
0
    {
13553
0
      switch (lh->type)
13554
0
        {
13555
0
        case bfd_link_hash_undefined:
13556
0
        case bfd_link_hash_undefweak:
13557
0
        case bfd_link_hash_common:
13558
0
    gp_found = 0;
13559
0
    break;
13560
0
        case bfd_link_hash_defined:
13561
0
        case bfd_link_hash_defweak:
13562
0
    gp_found = 1;
13563
0
    gp = lh->u.def.value;
13564
0
    break;
13565
0
        case bfd_link_hash_indirect:
13566
0
        case bfd_link_hash_warning:
13567
0
    lh = lh->u.i.link;
13568
    /* @@FIXME  ignoring warning for now */
13569
0
    goto lookup;
13570
0
        case bfd_link_hash_new:
13571
0
        default:
13572
0
    abort ();
13573
0
        }
13574
0
    }
13575
127
  else
13576
127
    gp_found = 0;
13577
127
      }
13578
      /* end mips */
13579
13580
616
      for (parent = reloc_vector; *parent != NULL; parent++)
13581
578
  {
13582
578
    char *error_message = NULL;
13583
578
    asymbol *symbol;
13584
578
    bfd_reloc_status_type r;
13585
13586
578
    symbol = *(*parent)->sym_ptr_ptr;
13587
    /* PR ld/19628: A specially crafted input file
13588
       can result in a NULL symbol pointer here.  */
13589
578
    if (symbol == NULL)
13590
0
      {
13591
0
        link_info->callbacks->einfo
13592
    /* xgettext:c-format */
13593
0
    (_("%X%P: %pB(%pA): error: relocation for offset %V has no value\n"),
13594
0
     abfd, input_section, (* parent)->address);
13595
0
        install = false;
13596
0
        goto out;
13597
0
      }
13598
13599
    /* Zap reloc field when the symbol is from a discarded
13600
       section, ignoring any addend.  Do the same when called
13601
       from bfd_simple_get_relocated_section_contents for
13602
       undefined symbols in debug sections.  This is to keep
13603
       debug info reasonably sane, in particular so that
13604
       DW_FORM_ref_addr to another file's .debug_info isn't
13605
       confused with an offset into the current file's
13606
       .debug_info.  */
13607
578
    if ((symbol->section != NULL && discarded_section (symbol->section))
13608
578
        || (symbol->section == bfd_und_section_ptr
13609
12
      && (input_section->flags & SEC_DEBUGGING) != 0
13610
8
      && link_info->input_bfds == link_info->output_bfd))
13611
8
      {
13612
8
        bfd_vma off;
13613
8
        static reloc_howto_type none_howto
13614
8
    = HOWTO (0, 0, 0, 0, false, 0, complain_overflow_dont, NULL,
13615
8
       "unused", false, 0, 0, false);
13616
13617
8
        off = ((*parent)->address
13618
8
         * bfd_octets_per_byte (input_bfd, input_section));
13619
8
        _bfd_clear_contents ((*parent)->howto, input_bfd,
13620
8
           input_section, data, off);
13621
8
        (*parent)->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
13622
8
        (*parent)->addend = 0;
13623
8
        (*parent)->howto = &none_howto;
13624
8
        r = bfd_reloc_ok;
13625
8
      }
13626
13627
    /* Specific to MIPS: Deal with relocation types that require
13628
       knowing the gp of the output bfd.  */
13629
13630
    /* If we've managed to find the gp and have a special
13631
       function for the relocation then go ahead, else default
13632
       to the generic handling.  */
13633
570
    else if (gp_found
13634
0
       && ((*parent)->howto->special_function
13635
0
           == _bfd_mips_elf32_gprel16_reloc))
13636
0
      r = _bfd_mips_elf_gprel16_with_gp (input_bfd, symbol, *parent,
13637
0
                 input_section, relocatable,
13638
0
                 data, gp);
13639
570
    else
13640
570
      r = bfd_perform_relocation (input_bfd,
13641
570
          *parent,
13642
570
          data,
13643
570
          input_section,
13644
570
          relocatable ? abfd : NULL,
13645
570
          &error_message);
13646
13647
578
    if (relocatable)
13648
0
      {
13649
0
        asection *os = input_section->output_section;
13650
13651
        /* A partial link, so keep the relocs.  */
13652
0
        os->orelocation[os->reloc_count] = *parent;
13653
0
        os->reloc_count++;
13654
0
      }
13655
13656
578
    if (r != bfd_reloc_ok)
13657
146
      {
13658
146
        _bfd_link_reloc_status_error (abfd, link_info, input_section,
13659
146
              *parent, error_message, r);
13660
146
        if (r == bfd_reloc_outofrange || r == bfd_reloc_notsupported)
13661
89
    {
13662
89
      install = false;
13663
89
      goto out;
13664
89
    }
13665
146
      }
13666
578
  }
13667
127
    }
13668
13669
278
 out:
13670
278
  mips_elf_free_hi16_list (input_bfd, input_section, install, link_info);
13671
278
  free (reloc_vector);
13672
278
  return data;
13673
145
}
13674

13675
static bool
13676
mips_elf_relax_delete_bytes (bfd *abfd,
13677
           asection *sec, bfd_vma addr, int count)
13678
0
{
13679
0
  Elf_Internal_Shdr *symtab_hdr;
13680
0
  unsigned int sec_shndx;
13681
0
  bfd_byte *contents;
13682
0
  Elf_Internal_Rela *irel, *irelend;
13683
0
  Elf_Internal_Sym *isym;
13684
0
  Elf_Internal_Sym *isymend;
13685
0
  struct elf_link_hash_entry **sym_hashes;
13686
0
  struct elf_link_hash_entry **end_hashes;
13687
0
  struct elf_link_hash_entry **start_hashes;
13688
0
  unsigned int symcount;
13689
13690
0
  sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
13691
0
  contents = elf_section_data (sec)->this_hdr.contents;
13692
13693
0
  irel = elf_section_data (sec)->relocs;
13694
0
  irelend = irel + sec->reloc_count;
13695
13696
  /* Actually delete the bytes.  */
13697
0
  memmove (contents + addr, contents + addr + count,
13698
0
     (size_t) (sec->size - addr - count));
13699
0
  sec->size -= count;
13700
13701
  /* Adjust all the relocs.  */
13702
0
  for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
13703
0
    {
13704
      /* Get the new reloc address.  */
13705
0
      if (irel->r_offset > addr)
13706
0
  irel->r_offset -= count;
13707
0
    }
13708
13709
0
  BFD_ASSERT (addr % 2 == 0);
13710
0
  BFD_ASSERT (count % 2 == 0);
13711
13712
  /* Adjust the local symbols defined in this section.  */
13713
0
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
13714
0
  isym = (Elf_Internal_Sym *) symtab_hdr->contents;
13715
0
  for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
13716
0
    if (isym->st_shndx == sec_shndx && isym->st_value > addr)
13717
0
      isym->st_value -= count;
13718
13719
  /* Now adjust the global symbols defined in this section.  */
13720
0
  symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
13721
0
        - symtab_hdr->sh_info);
13722
0
  sym_hashes = start_hashes = elf_sym_hashes (abfd);
13723
0
  end_hashes = sym_hashes + symcount;
13724
13725
0
  for (; sym_hashes < end_hashes; sym_hashes++)
13726
0
    {
13727
0
      struct elf_link_hash_entry *sym_hash = *sym_hashes;
13728
13729
0
      if ((sym_hash->root.type == bfd_link_hash_defined
13730
0
     || sym_hash->root.type == bfd_link_hash_defweak)
13731
0
    && sym_hash->root.u.def.section == sec)
13732
0
  {
13733
0
    bfd_vma value = sym_hash->root.u.def.value;
13734
13735
0
    if (ELF_ST_IS_MICROMIPS (sym_hash->other))
13736
0
      value &= MINUS_TWO;
13737
0
    if (value > addr)
13738
0
      sym_hash->root.u.def.value -= count;
13739
0
  }
13740
0
    }
13741
13742
0
  return true;
13743
0
}
13744
13745
13746
/* Opcodes needed for microMIPS relaxation as found in
13747
   opcodes/micromips-opc.c.  */
13748
13749
struct opcode_descriptor {
13750
  unsigned long match;
13751
  unsigned long mask;
13752
};
13753
13754
/* The $ra register aka $31.  */
13755
13756
0
#define RA 31
13757
13758
/* 32-bit instruction format register fields.  */
13759
13760
0
#define OP32_SREG(opcode) (((opcode) >> 16) & 0x1f)
13761
0
#define OP32_TREG(opcode) (((opcode) >> 21) & 0x1f)
13762
13763
/* Check if a 5-bit register index can be abbreviated to 3 bits.  */
13764
13765
#define OP16_VALID_REG(r) \
13766
0
  ((2 <= (r) && (r) <= 7) || (16 <= (r) && (r) <= 17))
13767
13768
13769
/* 32-bit and 16-bit branches.  */
13770
13771
static const struct opcode_descriptor b_insns_32[] = {
13772
  { /* "b", "p",    */ 0x40400000, 0xffff0000 }, /* bgez 0 */
13773
  { /* "b", "p",    */ 0x94000000, 0xffff0000 }, /* beq 0, 0 */
13774
  { 0, 0 }  /* End marker for find_match().  */
13775
};
13776
13777
static const struct opcode_descriptor bc_insn_32 =
13778
  { /* "bc(1|2)(ft)", "N,p",  */ 0x42800000, 0xfec30000 };
13779
13780
static const struct opcode_descriptor bz_insn_32 =
13781
  { /* "b(g|l)(e|t)z", "s,p", */ 0x40000000, 0xff200000 };
13782
13783
static const struct opcode_descriptor bzal_insn_32 =
13784
  { /* "b(ge|lt)zal", "s,p",  */ 0x40200000, 0xffa00000 };
13785
13786
static const struct opcode_descriptor beq_insn_32 =
13787
  { /* "b(eq|ne)", "s,t,p", */ 0x94000000, 0xdc000000 };
13788
13789
static const struct opcode_descriptor b_insn_16 =
13790
  { /* "b", "mD",   */ 0xcc00,     0xfc00 };
13791
13792
static const struct opcode_descriptor bz_insn_16 =
13793
  { /* "b(eq|ne)z", "md,mE",  */ 0x8c00,     0xdc00 };
13794
13795
13796
/* 32-bit and 16-bit branch EQ and NE zero.  */
13797
13798
/* NOTE: All opcode tables have BEQ/BNE in the same order: first the
13799
   eq and second the ne.  This convention is used when replacing a
13800
   32-bit BEQ/BNE with the 16-bit version.  */
13801
13802
0
#define BZC32_REG_FIELD(r) (((r) & 0x1f) << 16)
13803
13804
static const struct opcode_descriptor bz_rs_insns_32[] = {
13805
  { /* "beqz",  "s,p",    */ 0x94000000, 0xffe00000 },
13806
  { /* "bnez",  "s,p",    */ 0xb4000000, 0xffe00000 },
13807
  { 0, 0 }  /* End marker for find_match().  */
13808
};
13809
13810
static const struct opcode_descriptor bz_rt_insns_32[] = {
13811
  { /* "beqz",  "t,p",    */ 0x94000000, 0xfc01f000 },
13812
  { /* "bnez",  "t,p",    */ 0xb4000000, 0xfc01f000 },
13813
  { 0, 0 }  /* End marker for find_match().  */
13814
};
13815
13816
static const struct opcode_descriptor bzc_insns_32[] = {
13817
  { /* "beqzc", "s,p",    */ 0x40e00000, 0xffe00000 },
13818
  { /* "bnezc", "s,p",    */ 0x40a00000, 0xffe00000 },
13819
  { 0, 0 }  /* End marker for find_match().  */
13820
};
13821
13822
static const struct opcode_descriptor bz_insns_16[] = {
13823
  { /* "beqz",  "md,mE",  */ 0x8c00,     0xfc00 },
13824
  { /* "bnez",  "md,mE",  */ 0xac00,     0xfc00 },
13825
  { 0, 0 }  /* End marker for find_match().  */
13826
};
13827
13828
/* Switch between a 5-bit register index and its 3-bit shorthand.  */
13829
13830
0
#define BZ16_REG(opcode) ((((((opcode) >> 7) & 7) + 0x1e) & 0xf) + 2)
13831
#define BZ16_REG_FIELD(r) (((r) & 7) << 7)
13832
13833
13834
/* 32-bit instructions with a delay slot.  */
13835
13836
static const struct opcode_descriptor jal_insn_32_bd16 =
13837
  { /* "jals",  "a",    */ 0x74000000, 0xfc000000 };
13838
13839
static const struct opcode_descriptor jal_insn_32_bd32 =
13840
  { /* "jal", "a",    */ 0xf4000000, 0xfc000000 };
13841
13842
static const struct opcode_descriptor jal_x_insn_32_bd32 =
13843
  { /* "jal[x]", "a",   */ 0xf0000000, 0xf8000000 };
13844
13845
static const struct opcode_descriptor j_insn_32 =
13846
  { /* "j", "a",    */ 0xd4000000, 0xfc000000 };
13847
13848
static const struct opcode_descriptor jalr_insn_32 =
13849
  { /* "jalr[.hb]", "t,s",  */ 0x00000f3c, 0xfc00efff };
13850
13851
/* This table can be compacted, because no opcode replacement is made.  */
13852
13853
static const struct opcode_descriptor ds_insns_32_bd16[] = {
13854
  { /* "jals",  "a",    */ 0x74000000, 0xfc000000 },
13855
13856
  { /* "jalrs[.hb]", "t,s", */ 0x00004f3c, 0xfc00efff },
13857
  { /* "b(ge|lt)zals", "s,p", */ 0x42200000, 0xffa00000 },
13858
13859
  { /* "b(g|l)(e|t)z", "s,p", */ 0x40000000, 0xff200000 },
13860
  { /* "b(eq|ne)", "s,t,p", */ 0x94000000, 0xdc000000 },
13861
  { /* "j", "a",    */ 0xd4000000, 0xfc000000 },
13862
  { 0, 0 }  /* End marker for find_match().  */
13863
};
13864
13865
/* This table can be compacted, because no opcode replacement is made.  */
13866
13867
static const struct opcode_descriptor ds_insns_32_bd32[] = {
13868
  { /* "jal[x]", "a",   */ 0xf0000000, 0xf8000000 },
13869
13870
  { /* "jalr[.hb]", "t,s",  */ 0x00000f3c, 0xfc00efff },
13871
  { /* "b(ge|lt)zal", "s,p",  */ 0x40200000, 0xffa00000 },
13872
  { 0, 0 }  /* End marker for find_match().  */
13873
};
13874
13875
13876
/* 16-bit instructions with a delay slot.  */
13877
13878
static const struct opcode_descriptor jalr_insn_16_bd16 =
13879
  { /* "jalrs", "my,mj",  */ 0x45e0,     0xffe0 };
13880
13881
static const struct opcode_descriptor jalr_insn_16_bd32 =
13882
  { /* "jalr",  "my,mj",  */ 0x45c0,     0xffe0 };
13883
13884
static const struct opcode_descriptor jr_insn_16 =
13885
  { /* "jr",  "mj",   */ 0x4580,     0xffe0 };
13886
13887
0
#define JR16_REG(opcode) ((opcode) & 0x1f)
13888
13889
/* This table can be compacted, because no opcode replacement is made.  */
13890
13891
static const struct opcode_descriptor ds_insns_16_bd16[] = {
13892
  { /* "jalrs", "my,mj",  */ 0x45e0,     0xffe0 },
13893
13894
  { /* "b", "mD",   */ 0xcc00,     0xfc00 },
13895
  { /* "b(eq|ne)z", "md,mE",  */ 0x8c00,     0xdc00 },
13896
  { /* "jr",  "mj",   */ 0x4580,     0xffe0 },
13897
  { 0, 0 }  /* End marker for find_match().  */
13898
};
13899
13900
13901
/* LUI instruction.  */
13902
13903
static const struct opcode_descriptor lui_insn =
13904
 { /* "lui",  "s,u",    */ 0x41a00000, 0xffe00000 };
13905
13906
13907
/* ADDIU instruction.  */
13908
13909
static const struct opcode_descriptor addiu_insn =
13910
  { /* "addiu", "t,r,j",  */ 0x30000000, 0xfc000000 };
13911
13912
static const struct opcode_descriptor addiupc_insn =
13913
  { /* "addiu", "mb,$pc,mQ",  */ 0x78000000, 0xfc000000 };
13914
13915
#define ADDIUPC_REG_FIELD(r) \
13916
0
  (((2 <= (r) && (r) <= 7) ? (r) : ((r) - 16)) << 23)
13917
13918
13919
/* Relaxable instructions in a JAL delay slot: MOVE.  */
13920
13921
/* The 16-bit move has rd in 9:5 and rs in 4:0.  The 32-bit moves
13922
   (ADDU, OR) have rd in 15:11 and rs in 10:16.  */
13923
#define MOVE32_RD(opcode) (((opcode) >> 11) & 0x1f)
13924
#define MOVE32_RS(opcode) (((opcode) >> 16) & 0x1f)
13925
13926
#define MOVE16_RD_FIELD(r) (((r) & 0x1f) << 5)
13927
#define MOVE16_RS_FIELD(r) (((r) & 0x1f)     )
13928
13929
static const struct opcode_descriptor move_insns_32[] = {
13930
  { /* "move",  "d,s",    */ 0x00000290, 0xffe007ff }, /* or   d,s,$0 */
13931
  { /* "move",  "d,s",    */ 0x00000150, 0xffe007ff }, /* addu d,s,$0 */
13932
  { 0, 0 }  /* End marker for find_match().  */
13933
};
13934
13935
static const struct opcode_descriptor move_insn_16 =
13936
  { /* "move",  "mp,mj",  */ 0x0c00,     0xfc00 };
13937
13938
13939
/* NOP instructions.  */
13940
13941
static const struct opcode_descriptor nop_insn_32 =
13942
  { /* "nop", "",   */ 0x00000000, 0xffffffff };
13943
13944
static const struct opcode_descriptor nop_insn_16 =
13945
  { /* "nop", "",   */ 0x0c00,     0xffff };
13946
13947
13948
/* Instruction match support.  */
13949
13950
0
#define MATCH(opcode, insn) ((opcode & insn.mask) == insn.match)
13951
13952
static int
13953
find_match (unsigned long opcode, const struct opcode_descriptor insn[])
13954
0
{
13955
0
  unsigned long indx;
13956
13957
0
  for (indx = 0; insn[indx].mask != 0; indx++)
13958
0
    if (MATCH (opcode, insn[indx]))
13959
0
      return indx;
13960
13961
0
  return -1;
13962
0
}
13963
13964
13965
/* Branch and delay slot decoding support.  */
13966
13967
/* If PTR points to what *might* be a 16-bit branch or jump, then
13968
   return the minimum length of its delay slot, otherwise return 0.
13969
   Non-zero results are not definitive as we might be checking against
13970
   the second half of another instruction.  */
13971
13972
static int
13973
check_br16_dslot (bfd *abfd, bfd_byte *ptr)
13974
0
{
13975
0
  unsigned long opcode;
13976
0
  int bdsize;
13977
13978
0
  opcode = bfd_get_16 (abfd, ptr);
13979
0
  if (MATCH (opcode, jalr_insn_16_bd32) != 0)
13980
    /* 16-bit branch/jump with a 32-bit delay slot.  */
13981
0
    bdsize = 4;
13982
0
  else if (MATCH (opcode, jalr_insn_16_bd16) != 0
13983
0
     || find_match (opcode, ds_insns_16_bd16) >= 0)
13984
    /* 16-bit branch/jump with a 16-bit delay slot.  */
13985
0
    bdsize = 2;
13986
0
  else
13987
    /* No delay slot.  */
13988
0
    bdsize = 0;
13989
13990
0
  return bdsize;
13991
0
}
13992
13993
/* If PTR points to what *might* be a 32-bit branch or jump, then
13994
   return the minimum length of its delay slot, otherwise return 0.
13995
   Non-zero results are not definitive as we might be checking against
13996
   the second half of another instruction.  */
13997
13998
static int
13999
check_br32_dslot (bfd *abfd, bfd_byte *ptr)
14000
0
{
14001
0
  unsigned long opcode;
14002
0
  int bdsize;
14003
14004
0
  opcode = bfd_get_micromips_32 (abfd, ptr);
14005
0
  if (find_match (opcode, ds_insns_32_bd32) >= 0)
14006
    /* 32-bit branch/jump with a 32-bit delay slot.  */
14007
0
    bdsize = 4;
14008
0
  else if (find_match (opcode, ds_insns_32_bd16) >= 0)
14009
    /* 32-bit branch/jump with a 16-bit delay slot.  */
14010
0
    bdsize = 2;
14011
0
  else
14012
    /* No delay slot.  */
14013
0
    bdsize = 0;
14014
14015
0
  return bdsize;
14016
0
}
14017
14018
/* If PTR points to a 16-bit branch or jump with a 32-bit delay slot
14019
   that doesn't fiddle with REG, then return TRUE, otherwise FALSE.  */
14020
14021
static bool
14022
check_br16 (bfd *abfd, bfd_byte *ptr, unsigned long reg)
14023
0
{
14024
0
  unsigned long opcode;
14025
14026
0
  opcode = bfd_get_16 (abfd, ptr);
14027
0
  if (MATCH (opcode, b_insn_16)
14028
            /* B16  */
14029
0
      || (MATCH (opcode, jr_insn_16) && reg != JR16_REG (opcode))
14030
            /* JR16  */
14031
0
      || (MATCH (opcode, bz_insn_16) && reg != BZ16_REG (opcode))
14032
            /* BEQZ16, BNEZ16  */
14033
0
      || (MATCH (opcode, jalr_insn_16_bd32)
14034
            /* JALR16  */
14035
0
    && reg != JR16_REG (opcode) && reg != RA))
14036
0
    return true;
14037
14038
0
  return false;
14039
0
}
14040
14041
/* If PTR points to a 32-bit branch or jump that doesn't fiddle with REG,
14042
   then return TRUE, otherwise FALSE.  */
14043
14044
static bool
14045
check_br32 (bfd *abfd, bfd_byte *ptr, unsigned long reg)
14046
0
{
14047
0
  unsigned long opcode;
14048
14049
0
  opcode = bfd_get_micromips_32 (abfd, ptr);
14050
0
  if (MATCH (opcode, j_insn_32)
14051
            /* J  */
14052
0
      || MATCH (opcode, bc_insn_32)
14053
            /* BC1F, BC1T, BC2F, BC2T  */
14054
0
      || (MATCH (opcode, jal_x_insn_32_bd32) && reg != RA)
14055
            /* JAL, JALX  */
14056
0
      || (MATCH (opcode, bz_insn_32) && reg != OP32_SREG (opcode))
14057
            /* BGEZ, BGTZ, BLEZ, BLTZ  */
14058
0
      || (MATCH (opcode, bzal_insn_32)
14059
            /* BGEZAL, BLTZAL  */
14060
0
    && reg != OP32_SREG (opcode) && reg != RA)
14061
0
      || ((MATCH (opcode, jalr_insn_32) || MATCH (opcode, beq_insn_32))
14062
            /* JALR, JALR.HB, BEQ, BNE  */
14063
0
    && reg != OP32_SREG (opcode) && reg != OP32_TREG (opcode)))
14064
0
    return true;
14065
14066
0
  return false;
14067
0
}
14068
14069
/* If the instruction encoding at PTR and relocations [INTERNAL_RELOCS,
14070
   IRELEND) at OFFSET indicate that there must be a compact branch there,
14071
   then return TRUE, otherwise FALSE.  */
14072
14073
static bool
14074
check_relocated_bzc (bfd *abfd, const bfd_byte *ptr, bfd_vma offset,
14075
         const Elf_Internal_Rela *internal_relocs,
14076
         const Elf_Internal_Rela *irelend)
14077
0
{
14078
0
  const Elf_Internal_Rela *irel;
14079
0
  unsigned long opcode;
14080
14081
0
  opcode = bfd_get_micromips_32 (abfd, ptr);
14082
0
  if (find_match (opcode, bzc_insns_32) < 0)
14083
0
    return false;
14084
14085
0
  for (irel = internal_relocs; irel < irelend; irel++)
14086
0
    if (irel->r_offset == offset
14087
0
  && ELF32_R_TYPE (irel->r_info) == R_MICROMIPS_PC16_S1)
14088
0
      return true;
14089
14090
0
  return false;
14091
0
}
14092
14093
/* Bitsize checking.  */
14094
#define IS_BITSIZE(val, N)            \
14095
0
  (((((val) & ((1ULL << (N)) - 1)) ^ (1ULL << ((N) - 1)))   \
14096
0
    - (1ULL << ((N) - 1))) == (val))
14097
14098

14099
bool
14100
_bfd_mips_elf_relax_section (bfd *abfd, asection *sec,
14101
           struct bfd_link_info *link_info,
14102
           bool *again)
14103
0
{
14104
0
  bool insn32 = mips_elf_hash_table (link_info)->insn32;
14105
0
  Elf_Internal_Shdr *symtab_hdr;
14106
0
  Elf_Internal_Rela *internal_relocs;
14107
0
  Elf_Internal_Rela *irel, *irelend;
14108
0
  bfd_byte *contents = NULL;
14109
0
  Elf_Internal_Sym *isymbuf = NULL;
14110
14111
  /* Assume nothing changes.  */
14112
0
  *again = false;
14113
14114
  /* We don't have to do anything for a relocatable link, if
14115
     this section does not have relocs, or if this is not a
14116
     code section.  */
14117
14118
0
  if (bfd_link_relocatable (link_info)
14119
0
      || sec->reloc_count == 0
14120
0
      || (sec->flags & SEC_RELOC) == 0
14121
0
      || (sec->flags & SEC_HAS_CONTENTS) == 0
14122
0
      || (sec->flags & SEC_CODE) == 0)
14123
0
    return true;
14124
14125
0
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
14126
14127
  /* Get a copy of the native relocations.  */
14128
0
  internal_relocs = (_bfd_elf_link_read_relocs
14129
0
         (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
14130
0
          link_info->keep_memory));
14131
0
  if (internal_relocs == NULL)
14132
0
    goto error_return;
14133
14134
  /* Walk through them looking for relaxing opportunities.  */
14135
0
  irelend = internal_relocs + sec->reloc_count;
14136
0
  for (irel = internal_relocs; irel < irelend; irel++)
14137
0
    {
14138
0
      unsigned long r_symndx = ELF32_R_SYM (irel->r_info);
14139
0
      unsigned int r_type = ELF32_R_TYPE (irel->r_info);
14140
0
      bool target_is_micromips_code_p;
14141
0
      unsigned long opcode;
14142
0
      bfd_vma symval;
14143
0
      bfd_vma pcrval;
14144
0
      bfd_byte *ptr;
14145
0
      int fndopc;
14146
14147
      /* The number of bytes to delete for relaxation and from where
14148
   to delete these bytes starting at irel->r_offset.  */
14149
0
      int delcnt = 0;
14150
0
      int deloff = 0;
14151
14152
      /* If this isn't something that can be relaxed, then ignore
14153
   this reloc.  */
14154
0
      if (r_type != R_MICROMIPS_HI16
14155
0
    && r_type != R_MICROMIPS_PC16_S1
14156
0
    && r_type != R_MICROMIPS_26_S1)
14157
0
  continue;
14158
14159
      /* Get the section contents if we haven't done so already.  */
14160
0
      if (contents == NULL)
14161
0
  {
14162
    /* Get cached copy if it exists.  */
14163
0
    if (elf_section_data (sec)->this_hdr.contents != NULL)
14164
0
      contents = elf_section_data (sec)->this_hdr.contents;
14165
    /* Go get them off disk.  */
14166
0
    else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
14167
0
      goto error_return;
14168
0
  }
14169
0
      ptr = contents + irel->r_offset;
14170
14171
      /* Read this BFD's local symbols if we haven't done so already.  */
14172
0
      if (isymbuf == NULL && symtab_hdr->sh_info != 0)
14173
0
  {
14174
0
    isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
14175
0
    if (isymbuf == NULL)
14176
0
      isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
14177
0
              symtab_hdr->sh_info, 0,
14178
0
              NULL, NULL, NULL);
14179
0
    if (isymbuf == NULL)
14180
0
      goto error_return;
14181
0
  }
14182
14183
      /* Get the value of the symbol referred to by the reloc.  */
14184
0
      if (r_symndx < symtab_hdr->sh_info)
14185
0
  {
14186
    /* A local symbol.  */
14187
0
    Elf_Internal_Sym *isym;
14188
0
    asection *sym_sec;
14189
14190
0
    isym = isymbuf + r_symndx;
14191
0
    if (isym->st_shndx == SHN_UNDEF)
14192
0
      sym_sec = bfd_und_section_ptr;
14193
0
    else if (isym->st_shndx == SHN_ABS)
14194
0
      sym_sec = bfd_abs_section_ptr;
14195
0
    else if (isym->st_shndx == SHN_COMMON)
14196
0
      sym_sec = bfd_com_section_ptr;
14197
0
    else
14198
0
      sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
14199
0
    symval = (isym->st_value
14200
0
        + sym_sec->output_section->vma
14201
0
        + sym_sec->output_offset);
14202
0
    target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (isym->st_other);
14203
0
  }
14204
0
      else
14205
0
  {
14206
0
    unsigned long indx;
14207
0
    struct elf_link_hash_entry *h;
14208
14209
    /* An external symbol.  */
14210
0
    indx = r_symndx - symtab_hdr->sh_info;
14211
0
    h = elf_sym_hashes (abfd)[indx];
14212
0
    BFD_ASSERT (h != NULL);
14213
14214
0
    if (h->root.type != bfd_link_hash_defined
14215
0
        && h->root.type != bfd_link_hash_defweak)
14216
      /* This appears to be a reference to an undefined
14217
         symbol.  Just ignore it -- it will be caught by the
14218
         regular reloc processing.  */
14219
0
      continue;
14220
14221
0
    symval = (h->root.u.def.value
14222
0
        + h->root.u.def.section->output_section->vma
14223
0
        + h->root.u.def.section->output_offset);
14224
0
    target_is_micromips_code_p = (!h->needs_plt
14225
0
          && ELF_ST_IS_MICROMIPS (h->other));
14226
0
  }
14227
14228
14229
      /* For simplicity of coding, we are going to modify the
14230
   section contents, the section relocs, and the BFD symbol
14231
   table.  We must tell the rest of the code not to free up this
14232
   information.  It would be possible to instead create a table
14233
   of changes which have to be made, as is done in coff-mips.c;
14234
   that would be more work, but would require less memory when
14235
   the linker is run.  */
14236
14237
      /* Only 32-bit instructions relaxed.  */
14238
0
      if (irel->r_offset + 4 > sec->size)
14239
0
  continue;
14240
14241
0
      opcode = bfd_get_micromips_32 (abfd, ptr);
14242
14243
      /* This is the pc-relative distance from the instruction the
14244
   relocation is applied to, to the symbol referred.  */
14245
0
      pcrval = (symval
14246
0
    - (sec->output_section->vma + sec->output_offset)
14247
0
    - irel->r_offset);
14248
14249
      /* R_MICROMIPS_HI16 / LUI relaxation to nil, performing relaxation
14250
   of corresponding R_MICROMIPS_LO16 to R_MICROMIPS_HI0_LO16 or
14251
   R_MICROMIPS_PC23_S2.  The R_MICROMIPS_PC23_S2 condition is
14252
14253
     (symval % 4 == 0 && IS_BITSIZE (pcrval, 25))
14254
14255
   where pcrval has first to be adjusted to apply against the LO16
14256
   location (we make the adjustment later on, when we have figured
14257
   out the offset).  */
14258
0
      if (r_type == R_MICROMIPS_HI16 && MATCH (opcode, lui_insn))
14259
0
  {
14260
0
    bool bzc = false;
14261
0
    unsigned long nextopc;
14262
0
    unsigned long reg;
14263
0
    bfd_vma offset;
14264
14265
    /* Give up if the previous reloc was a HI16 against this symbol
14266
       too.  */
14267
0
    if (irel > internal_relocs
14268
0
        && ELF32_R_TYPE (irel[-1].r_info) == R_MICROMIPS_HI16
14269
0
        && ELF32_R_SYM (irel[-1].r_info) == r_symndx)
14270
0
      continue;
14271
14272
    /* Or if the next reloc is not a LO16 against this symbol.  */
14273
0
    if (irel + 1 >= irelend
14274
0
        || ELF32_R_TYPE (irel[1].r_info) != R_MICROMIPS_LO16
14275
0
        || ELF32_R_SYM (irel[1].r_info) != r_symndx)
14276
0
      continue;
14277
14278
    /* Or if the second next reloc is a LO16 against this symbol too.  */
14279
0
    if (irel + 2 >= irelend
14280
0
        && ELF32_R_TYPE (irel[2].r_info) == R_MICROMIPS_LO16
14281
0
        && ELF32_R_SYM (irel[2].r_info) == r_symndx)
14282
0
      continue;
14283
14284
    /* See if the LUI instruction *might* be in a branch delay slot.
14285
       We check whether what looks like a 16-bit branch or jump is
14286
       actually an immediate argument to a compact branch, and let
14287
       it through if so.  */
14288
0
    if (irel->r_offset >= 2
14289
0
        && check_br16_dslot (abfd, ptr - 2)
14290
0
        && !(irel->r_offset >= 4
14291
0
       && (bzc = check_relocated_bzc (abfd,
14292
0
              ptr - 4, irel->r_offset - 4,
14293
0
              internal_relocs, irelend))))
14294
0
      continue;
14295
0
    if (irel->r_offset >= 4
14296
0
        && !bzc
14297
0
        && check_br32_dslot (abfd, ptr - 4))
14298
0
      continue;
14299
14300
0
    reg = OP32_SREG (opcode);
14301
14302
    /* We only relax adjacent instructions or ones separated with
14303
       a branch or jump that has a delay slot.  The branch or jump
14304
       must not fiddle with the register used to hold the address.
14305
       Subtract 4 for the LUI itself.  */
14306
0
    offset = irel[1].r_offset - irel[0].r_offset;
14307
0
    switch (offset - 4)
14308
0
      {
14309
0
      case 0:
14310
0
        break;
14311
0
      case 2:
14312
0
        if (check_br16 (abfd, ptr + 4, reg))
14313
0
    break;
14314
0
        continue;
14315
0
      case 4:
14316
0
        if (check_br32 (abfd, ptr + 4, reg))
14317
0
    break;
14318
0
        continue;
14319
0
      default:
14320
0
        continue;
14321
0
      }
14322
14323
0
    nextopc = bfd_get_micromips_32 (abfd, contents + irel[1].r_offset);
14324
14325
    /* Give up unless the same register is used with both
14326
       relocations.  */
14327
0
    if (OP32_SREG (nextopc) != reg)
14328
0
      continue;
14329
14330
    /* Now adjust pcrval, subtracting the offset to the LO16 reloc
14331
       and rounding up to take masking of the two LSBs into account.  */
14332
0
    pcrval = ((pcrval - offset + 3) | 3) ^ 3;
14333
14334
    /* R_MICROMIPS_LO16 relaxation to R_MICROMIPS_HI0_LO16.  */
14335
0
    if (IS_BITSIZE (symval, 16))
14336
0
      {
14337
        /* Fix the relocation's type.  */
14338
0
        irel[1].r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_HI0_LO16);
14339
14340
        /* Instructions using R_MICROMIPS_LO16 have the base or
14341
     source register in bits 20:16.  This register becomes $0
14342
     (zero) as the result of the R_MICROMIPS_HI16 being 0.  */
14343
0
        nextopc &= ~0x001f0000;
14344
0
        bfd_put_16 (abfd, (nextopc >> 16) & 0xffff,
14345
0
        contents + irel[1].r_offset);
14346
0
      }
14347
14348
    /* R_MICROMIPS_LO16 / ADDIU relaxation to R_MICROMIPS_PC23_S2.
14349
       We add 4 to take LUI deletion into account while checking
14350
       the PC-relative distance.  */
14351
0
    else if (symval % 4 == 0
14352
0
       && IS_BITSIZE (pcrval + 4, 25)
14353
0
       && MATCH (nextopc, addiu_insn)
14354
0
       && OP32_TREG (nextopc) == OP32_SREG (nextopc)
14355
0
       && OP16_VALID_REG (OP32_TREG (nextopc)))
14356
0
      {
14357
        /* Fix the relocation's type.  */
14358
0
        irel[1].r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC23_S2);
14359
14360
        /* Replace ADDIU with the ADDIUPC version.  */
14361
0
        nextopc = (addiupc_insn.match
14362
0
       | ADDIUPC_REG_FIELD (OP32_TREG (nextopc)));
14363
14364
0
        bfd_put_micromips_32 (abfd, nextopc,
14365
0
            contents + irel[1].r_offset);
14366
0
      }
14367
14368
    /* Can't do anything, give up, sigh...  */
14369
0
    else
14370
0
      continue;
14371
14372
    /* Fix the relocation's type.  */
14373
0
    irel->r_info = ELF32_R_INFO (r_symndx, R_MIPS_NONE);
14374
14375
    /* Delete the LUI instruction: 4 bytes at irel->r_offset.  */
14376
0
    delcnt = 4;
14377
0
    deloff = 0;
14378
0
  }
14379
14380
      /* Compact branch relaxation -- due to the multitude of macros
14381
   employed by the compiler/assembler, compact branches are not
14382
   always generated.  Obviously, this can/will be fixed elsewhere,
14383
   but there is no drawback in double checking it here.  */
14384
0
      else if (r_type == R_MICROMIPS_PC16_S1
14385
0
         && irel->r_offset + 5 < sec->size
14386
0
         && ((fndopc = find_match (opcode, bz_rs_insns_32)) >= 0
14387
0
       || (fndopc = find_match (opcode, bz_rt_insns_32)) >= 0)
14388
0
         && ((!insn32
14389
0
        && (delcnt = MATCH (bfd_get_16 (abfd, ptr + 4),
14390
0
          nop_insn_16) ? 2 : 0))
14391
0
       || (irel->r_offset + 7 < sec->size
14392
0
           && (delcnt = MATCH (bfd_get_micromips_32 (abfd,
14393
0
                 ptr + 4),
14394
0
             nop_insn_32) ? 4 : 0))))
14395
0
  {
14396
0
    unsigned long reg;
14397
14398
0
    reg = OP32_SREG (opcode) ? OP32_SREG (opcode) : OP32_TREG (opcode);
14399
14400
    /* Replace BEQZ/BNEZ with the compact version.  */
14401
0
    opcode = (bzc_insns_32[fndopc].match
14402
0
        | BZC32_REG_FIELD (reg)
14403
0
        | (opcode & 0xffff));   /* Addend value.  */
14404
14405
0
    bfd_put_micromips_32 (abfd, opcode, ptr);
14406
14407
    /* Delete the delay slot NOP: two or four bytes from
14408
       irel->offset + 4; delcnt has already been set above.  */
14409
0
    deloff = 4;
14410
0
  }
14411
14412
      /* R_MICROMIPS_PC16_S1 relaxation to R_MICROMIPS_PC10_S1.  We need
14413
   to check the distance from the next instruction, so subtract 2.  */
14414
0
      else if (!insn32
14415
0
         && r_type == R_MICROMIPS_PC16_S1
14416
0
         && IS_BITSIZE (pcrval - 2, 11)
14417
0
         && find_match (opcode, b_insns_32) >= 0)
14418
0
  {
14419
    /* Fix the relocation's type.  */
14420
0
    irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC10_S1);
14421
14422
    /* Replace the 32-bit opcode with a 16-bit opcode.  */
14423
0
    bfd_put_16 (abfd,
14424
0
          (b_insn_16.match
14425
0
           | (opcode & 0x3ff)),   /* Addend value.  */
14426
0
          ptr);
14427
14428
    /* Delete 2 bytes from irel->r_offset + 2.  */
14429
0
    delcnt = 2;
14430
0
    deloff = 2;
14431
0
  }
14432
14433
      /* R_MICROMIPS_PC16_S1 relaxation to R_MICROMIPS_PC7_S1.  We need
14434
   to check the distance from the next instruction, so subtract 2.  */
14435
0
      else if (!insn32
14436
0
         && r_type == R_MICROMIPS_PC16_S1
14437
0
         && IS_BITSIZE (pcrval - 2, 8)
14438
0
         && (((fndopc = find_match (opcode, bz_rs_insns_32)) >= 0
14439
0
        && OP16_VALID_REG (OP32_SREG (opcode)))
14440
0
       || ((fndopc = find_match (opcode, bz_rt_insns_32)) >= 0
14441
0
           && OP16_VALID_REG (OP32_TREG (opcode)))))
14442
0
  {
14443
0
    unsigned long reg;
14444
14445
0
    reg = OP32_SREG (opcode) ? OP32_SREG (opcode) : OP32_TREG (opcode);
14446
14447
    /* Fix the relocation's type.  */
14448
0
    irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC7_S1);
14449
14450
    /* Replace the 32-bit opcode with a 16-bit opcode.  */
14451
0
    bfd_put_16 (abfd,
14452
0
          (bz_insns_16[fndopc].match
14453
0
           | BZ16_REG_FIELD (reg)
14454
0
           | (opcode & 0x7f)),    /* Addend value.  */
14455
0
          ptr);
14456
14457
    /* Delete 2 bytes from irel->r_offset + 2.  */
14458
0
    delcnt = 2;
14459
0
    deloff = 2;
14460
0
  }
14461
14462
      /* R_MICROMIPS_26_S1 -- JAL to JALS relaxation for microMIPS targets.  */
14463
0
      else if (!insn32
14464
0
         && r_type == R_MICROMIPS_26_S1
14465
0
         && target_is_micromips_code_p
14466
0
         && irel->r_offset + 7 < sec->size
14467
0
         && MATCH (opcode, jal_insn_32_bd32))
14468
0
  {
14469
0
    unsigned long n32opc;
14470
0
    bool relaxed = false;
14471
14472
0
    n32opc = bfd_get_micromips_32 (abfd, ptr + 4);
14473
14474
0
    if (MATCH (n32opc, nop_insn_32))
14475
0
      {
14476
        /* Replace delay slot 32-bit NOP with a 16-bit NOP.  */
14477
0
        bfd_put_16 (abfd, nop_insn_16.match, ptr + 4);
14478
14479
0
        relaxed = true;
14480
0
      }
14481
0
    else if (find_match (n32opc, move_insns_32) >= 0)
14482
0
      {
14483
        /* Replace delay slot 32-bit MOVE with 16-bit MOVE.  */
14484
0
        bfd_put_16 (abfd,
14485
0
        (move_insn_16.match
14486
0
         | MOVE16_RD_FIELD (MOVE32_RD (n32opc))
14487
0
         | MOVE16_RS_FIELD (MOVE32_RS (n32opc))),
14488
0
        ptr + 4);
14489
14490
0
        relaxed = true;
14491
0
      }
14492
    /* Other 32-bit instructions relaxable to 16-bit
14493
       instructions will be handled here later.  */
14494
14495
0
    if (relaxed)
14496
0
      {
14497
        /* JAL with 32-bit delay slot that is changed to a JALS
14498
     with 16-bit delay slot.  */
14499
0
        bfd_put_micromips_32 (abfd, jal_insn_32_bd16.match, ptr);
14500
14501
        /* Delete 2 bytes from irel->r_offset + 6.  */
14502
0
        delcnt = 2;
14503
0
        deloff = 6;
14504
0
      }
14505
0
  }
14506
14507
0
      if (delcnt != 0)
14508
0
  {
14509
    /* Note that we've changed the relocs, section contents, etc.  */
14510
0
    elf_section_data (sec)->relocs = internal_relocs;
14511
0
    elf_section_data (sec)->this_hdr.contents = contents;
14512
0
    symtab_hdr->contents = (unsigned char *) isymbuf;
14513
14514
    /* Delete bytes depending on the delcnt and deloff.  */
14515
0
    if (!mips_elf_relax_delete_bytes (abfd, sec,
14516
0
              irel->r_offset + deloff, delcnt))
14517
0
      goto error_return;
14518
14519
    /* That will change things, so we should relax again.
14520
       Note that this is not required, and it may be slow.  */
14521
0
    *again = true;
14522
0
  }
14523
0
    }
14524
14525
0
  if (isymbuf != NULL
14526
0
      && symtab_hdr->contents != (unsigned char *) isymbuf)
14527
0
    {
14528
0
      if (! link_info->keep_memory)
14529
0
  free (isymbuf);
14530
0
      else
14531
0
  {
14532
    /* Cache the symbols for elf_link_input_bfd.  */
14533
0
    symtab_hdr->contents = (unsigned char *) isymbuf;
14534
0
  }
14535
0
    }
14536
14537
0
  if (contents != NULL
14538
0
      && elf_section_data (sec)->this_hdr.contents != contents)
14539
0
    {
14540
0
      if (! link_info->keep_memory)
14541
0
  free (contents);
14542
0
      else
14543
0
  {
14544
    /* Cache the section contents for elf_link_input_bfd.  */
14545
0
    elf_section_data (sec)->this_hdr.contents = contents;
14546
0
  }
14547
0
    }
14548
14549
0
  if (elf_section_data (sec)->relocs != internal_relocs)
14550
0
    free (internal_relocs);
14551
14552
0
  return true;
14553
14554
0
 error_return:
14555
0
  if (symtab_hdr->contents != (unsigned char *) isymbuf)
14556
0
    free (isymbuf);
14557
0
  if (elf_section_data (sec)->this_hdr.contents != contents)
14558
0
    free (contents);
14559
0
  if (elf_section_data (sec)->relocs != internal_relocs)
14560
0
    free (internal_relocs);
14561
14562
0
  return false;
14563
0
}
14564

14565
/* Create a MIPS ELF linker hash table.  */
14566
14567
struct bfd_link_hash_table *
14568
_bfd_mips_elf_link_hash_table_create (bfd *abfd)
14569
0
{
14570
0
  struct mips_elf_link_hash_table *ret;
14571
0
  size_t amt = sizeof (struct mips_elf_link_hash_table);
14572
14573
0
  ret = bfd_zmalloc (amt);
14574
0
  if (ret == NULL)
14575
0
    return NULL;
14576
14577
0
  if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
14578
0
              mips_elf_link_hash_newfunc,
14579
0
              sizeof (struct mips_elf_link_hash_entry)))
14580
0
    {
14581
0
      free (ret);
14582
0
      return NULL;
14583
0
    }
14584
0
  ret->root.init_plt_refcount.plist = NULL;
14585
0
  ret->root.init_plt_offset.plist = NULL;
14586
14587
0
  return &ret->root.root;
14588
0
}
14589
14590
/* Likewise, but indicate that the target is VxWorks.  */
14591
14592
struct bfd_link_hash_table *
14593
_bfd_mips_vxworks_link_hash_table_create (bfd *abfd)
14594
0
{
14595
0
  struct bfd_link_hash_table *ret;
14596
14597
0
  ret = _bfd_mips_elf_link_hash_table_create (abfd);
14598
0
  if (ret)
14599
0
    {
14600
0
      struct mips_elf_link_hash_table *htab;
14601
14602
0
      htab = (struct mips_elf_link_hash_table *) ret;
14603
0
      htab->use_plts_and_copy_relocs = true;
14604
0
    }
14605
0
  return ret;
14606
0
}
14607
14608
/* A function that the linker calls if we are allowed to use PLTs
14609
   and copy relocs.  */
14610
14611
void
14612
_bfd_mips_elf_use_plts_and_copy_relocs (struct bfd_link_info *info)
14613
0
{
14614
0
  mips_elf_hash_table (info)->use_plts_and_copy_relocs = true;
14615
0
}
14616
14617
/* A function that the linker calls to select between all or only
14618
   32-bit microMIPS instructions, and between making or ignoring
14619
   branch relocation checks for invalid transitions between ISA modes.
14620
   Also record whether we have been configured for a GNU target.  */
14621
14622
void
14623
_bfd_mips_elf_linker_flags (struct bfd_link_info *info, bool insn32,
14624
          bool ignore_branch_isa,
14625
          bool gnu_target)
14626
0
{
14627
0
  mips_elf_hash_table (info)->insn32 = insn32;
14628
0
  mips_elf_hash_table (info)->ignore_branch_isa = ignore_branch_isa;
14629
0
  mips_elf_hash_table (info)->gnu_target = gnu_target;
14630
0
}
14631
14632
/* A function that the linker calls to enable use of compact branches in
14633
   linker generated code for MIPSR6.  */
14634
14635
void
14636
_bfd_mips_elf_compact_branches (struct bfd_link_info *info, bool on)
14637
0
{
14638
0
  mips_elf_hash_table (info)->compact_branches = on;
14639
0
}
14640
14641

14642
/* Structure for saying that BFD machine EXTENSION extends BASE.  */
14643
14644
struct mips_mach_extension
14645
{
14646
  unsigned long extension, base;
14647
};
14648
14649
/* An array that maps 64-bit architectures to the corresponding 32-bit
14650
   architectures.  */
14651
static const struct mips_mach_extension mips_mach_32_64[] =
14652
{
14653
  { bfd_mach_mipsisa64r6, bfd_mach_mipsisa32r6 },
14654
  { bfd_mach_mipsisa64r5, bfd_mach_mipsisa32r5 },
14655
  { bfd_mach_mipsisa64r3, bfd_mach_mipsisa32r3 },
14656
  { bfd_mach_mipsisa64r2, bfd_mach_mipsisa32r2 },
14657
  { bfd_mach_mipsisa64,   bfd_mach_mipsisa32 }
14658
};
14659
14660
/* An array describing how BFD machines relate to one another.  The entries
14661
   are ordered topologically with MIPS I extensions listed last.  */
14662
14663
static const struct mips_mach_extension mips_mach_extensions[] =
14664
{
14665
  /* MIPS64r2 extensions.  */
14666
  { bfd_mach_mips_octeon3, bfd_mach_mips_octeon2 },
14667
  { bfd_mach_mips_octeon2, bfd_mach_mips_octeonp },
14668
  { bfd_mach_mips_octeonp, bfd_mach_mips_octeon },
14669
  { bfd_mach_mips_octeon, bfd_mach_mipsisa64r2 },
14670
  { bfd_mach_mips_gs264e, bfd_mach_mips_gs464e },
14671
  { bfd_mach_mips_gs464e, bfd_mach_mips_gs464 },
14672
  { bfd_mach_mips_gs464, bfd_mach_mipsisa64r2 },
14673
14674
  /* MIPS64 extensions.  */
14675
  { bfd_mach_mipsisa64r2, bfd_mach_mipsisa64 },
14676
  { bfd_mach_mips_sb1, bfd_mach_mipsisa64 },
14677
  { bfd_mach_mips_xlr, bfd_mach_mipsisa64 },
14678
14679
  /* MIPS V extensions.  */
14680
  { bfd_mach_mipsisa64, bfd_mach_mips5 },
14681
14682
  /* R10000 extensions.  */
14683
  { bfd_mach_mips12000, bfd_mach_mips10000 },
14684
  { bfd_mach_mips14000, bfd_mach_mips10000 },
14685
  { bfd_mach_mips16000, bfd_mach_mips10000 },
14686
14687
  /* R5000 extensions.  Note: the vr5500 ISA is an extension of the core
14688
     vr5400 ISA, but doesn't include the multimedia stuff.  It seems
14689
     better to allow vr5400 and vr5500 code to be merged anyway, since
14690
     many libraries will just use the core ISA.  Perhaps we could add
14691
     some sort of ASE flag if this ever proves a problem.  */
14692
  { bfd_mach_mips5500, bfd_mach_mips5400 },
14693
  { bfd_mach_mips5400, bfd_mach_mips5000 },
14694
14695
  /* MIPS IV extensions.  */
14696
  { bfd_mach_mips5, bfd_mach_mips8000 },
14697
  { bfd_mach_mips10000, bfd_mach_mips8000 },
14698
  { bfd_mach_mips5000, bfd_mach_mips8000 },
14699
  { bfd_mach_mips7000, bfd_mach_mips8000 },
14700
  { bfd_mach_mips9000, bfd_mach_mips8000 },
14701
14702
  /* VR4100 extensions.  */
14703
  { bfd_mach_mips4120, bfd_mach_mips4100 },
14704
  { bfd_mach_mips4111, bfd_mach_mips4100 },
14705
14706
  /* MIPS III extensions.  */
14707
  { bfd_mach_mips_loongson_2e, bfd_mach_mips4000 },
14708
  { bfd_mach_mips_loongson_2f, bfd_mach_mips4000 },
14709
  { bfd_mach_mips8000, bfd_mach_mips4000 },
14710
  { bfd_mach_mips4650, bfd_mach_mips4000 },
14711
  { bfd_mach_mips4600, bfd_mach_mips4000 },
14712
  { bfd_mach_mips4400, bfd_mach_mips4000 },
14713
  { bfd_mach_mips4300, bfd_mach_mips4000 },
14714
  { bfd_mach_mips4100, bfd_mach_mips4000 },
14715
  { bfd_mach_mips5900, bfd_mach_mips4000 },
14716
14717
  /* MIPS32r3 extensions.  */
14718
  { bfd_mach_mips_interaptiv_mr2, bfd_mach_mipsisa32r3 },
14719
14720
  /* MIPS32r2 extensions.  */
14721
  { bfd_mach_mipsisa32r3, bfd_mach_mipsisa32r2 },
14722
14723
  /* MIPS32 extensions.  */
14724
  { bfd_mach_mipsisa32r2, bfd_mach_mipsisa32 },
14725
14726
  /* MIPS II extensions.  */
14727
  { bfd_mach_mips4000, bfd_mach_mips6000 },
14728
  { bfd_mach_mipsisa32, bfd_mach_mips6000 },
14729
  { bfd_mach_mips4010, bfd_mach_mips6000 },
14730
  { bfd_mach_mips_allegrex, bfd_mach_mips6000 },
14731
14732
  /* MIPS I extensions.  */
14733
  { bfd_mach_mips6000, bfd_mach_mips3000 },
14734
  { bfd_mach_mips3900, bfd_mach_mips3000 }
14735
};
14736
14737
/* Return true if bfd machine EXTENSION is the same as BASE, or if
14738
   EXTENSION is the 64-bit equivalent of a 32-bit BASE.  */
14739
14740
static bool
14741
mips_mach_extends_32_64 (unsigned long base, unsigned long extension)
14742
0
{
14743
0
  size_t i;
14744
14745
0
  if (extension == base)
14746
0
    return true;
14747
14748
0
  for (i = 0; i < ARRAY_SIZE (mips_mach_32_64); i++)
14749
0
    if (extension == mips_mach_32_64[i].extension)
14750
0
      return base == mips_mach_32_64[i].base;
14751
14752
0
  return false;
14753
0
}
14754
14755
static bool
14756
mips_mach_extends_p (unsigned long base, unsigned long extension)
14757
0
{
14758
0
  size_t i;
14759
14760
0
  if (mips_mach_extends_32_64 (base, extension))
14761
0
    return true;
14762
14763
0
  for (i = 0; i < ARRAY_SIZE (mips_mach_extensions); i++)
14764
0
    if (extension == mips_mach_extensions[i].extension)
14765
0
      {
14766
0
  extension = mips_mach_extensions[i].base;
14767
0
  if (mips_mach_extends_32_64 (base, extension))
14768
0
    return true;
14769
0
      }
14770
14771
0
  return false;
14772
0
}
14773
14774
/* Return the BFD mach for each .MIPS.abiflags ISA Extension.  */
14775
14776
static unsigned long
14777
bfd_mips_isa_ext_mach (unsigned int isa_ext)
14778
0
{
14779
0
  switch (isa_ext)
14780
0
    {
14781
0
    case AFL_EXT_3900:       return bfd_mach_mips3900;
14782
0
    case AFL_EXT_4010:       return bfd_mach_mips4010;
14783
0
    case AFL_EXT_4100:       return bfd_mach_mips4100;
14784
0
    case AFL_EXT_4111:       return bfd_mach_mips4111;
14785
0
    case AFL_EXT_4120:       return bfd_mach_mips4120;
14786
0
    case AFL_EXT_4650:       return bfd_mach_mips4650;
14787
0
    case AFL_EXT_5400:       return bfd_mach_mips5400;
14788
0
    case AFL_EXT_5500:       return bfd_mach_mips5500;
14789
0
    case AFL_EXT_5900:       return bfd_mach_mips5900;
14790
0
    case AFL_EXT_10000:       return bfd_mach_mips10000;
14791
0
    case AFL_EXT_LOONGSON_2E: return bfd_mach_mips_loongson_2e;
14792
0
    case AFL_EXT_LOONGSON_2F: return bfd_mach_mips_loongson_2f;
14793
0
    case AFL_EXT_SB1:       return bfd_mach_mips_sb1;
14794
0
    case AFL_EXT_OCTEON:      return bfd_mach_mips_octeon;
14795
0
    case AFL_EXT_OCTEONP:     return bfd_mach_mips_octeonp;
14796
0
    case AFL_EXT_OCTEON2:     return bfd_mach_mips_octeon2;
14797
0
    case AFL_EXT_XLR:       return bfd_mach_mips_xlr;
14798
0
    default:          return bfd_mach_mips3000;
14799
0
    }
14800
0
}
14801
14802
/* Return the .MIPS.abiflags value representing each ISA Extension.  */
14803
14804
unsigned int
14805
bfd_mips_isa_ext (bfd *abfd)
14806
0
{
14807
0
  switch (bfd_get_mach (abfd))
14808
0
    {
14809
0
    case bfd_mach_mips3900:     return AFL_EXT_3900;
14810
0
    case bfd_mach_mips4010:     return AFL_EXT_4010;
14811
0
    case bfd_mach_mips4100:     return AFL_EXT_4100;
14812
0
    case bfd_mach_mips4111:     return AFL_EXT_4111;
14813
0
    case bfd_mach_mips4120:     return AFL_EXT_4120;
14814
0
    case bfd_mach_mips4650:     return AFL_EXT_4650;
14815
0
    case bfd_mach_mips5400:     return AFL_EXT_5400;
14816
0
    case bfd_mach_mips5500:     return AFL_EXT_5500;
14817
0
    case bfd_mach_mips5900:     return AFL_EXT_5900;
14818
0
    case bfd_mach_mips10000:     return AFL_EXT_10000;
14819
0
    case bfd_mach_mips_loongson_2e: return AFL_EXT_LOONGSON_2E;
14820
0
    case bfd_mach_mips_loongson_2f: return AFL_EXT_LOONGSON_2F;
14821
0
    case bfd_mach_mips_sb1:     return AFL_EXT_SB1;
14822
0
    case bfd_mach_mips_octeon:     return AFL_EXT_OCTEON;
14823
0
    case bfd_mach_mips_octeonp:     return AFL_EXT_OCTEONP;
14824
0
    case bfd_mach_mips_octeon3:     return AFL_EXT_OCTEON3;
14825
0
    case bfd_mach_mips_octeon2:     return AFL_EXT_OCTEON2;
14826
0
    case bfd_mach_mips_xlr:     return AFL_EXT_XLR;
14827
0
    case bfd_mach_mips_interaptiv_mr2:
14828
0
      return AFL_EXT_INTERAPTIV_MR2;
14829
0
    default:          return 0;
14830
0
    }
14831
0
}
14832
14833
/* Encode ISA level and revision as a single value.  */
14834
0
#define LEVEL_REV(LEV,REV) ((LEV) << 3 | (REV))
14835
14836
/* Decode a single value into level and revision.  */
14837
0
#define ISA_LEVEL(LEVREV)  ((LEVREV) >> 3)
14838
0
#define ISA_REV(LEVREV)    ((LEVREV) & 0x7)
14839
14840
/* Update the isa_level, isa_rev, isa_ext fields of abiflags.  */
14841
14842
static void
14843
update_mips_abiflags_isa (bfd *abfd, Elf_Internal_ABIFlags_v0 *abiflags)
14844
0
{
14845
0
  int new_isa = 0;
14846
0
  switch (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH)
14847
0
    {
14848
0
    case EF_MIPS_ARCH_1:    new_isa = LEVEL_REV (1, 0); break;
14849
0
    case EF_MIPS_ARCH_2:    new_isa = LEVEL_REV (2, 0); break;
14850
0
    case EF_MIPS_ARCH_3:    new_isa = LEVEL_REV (3, 0); break;
14851
0
    case EF_MIPS_ARCH_4:    new_isa = LEVEL_REV (4, 0); break;
14852
0
    case EF_MIPS_ARCH_5:    new_isa = LEVEL_REV (5, 0); break;
14853
0
    case EF_MIPS_ARCH_32:   new_isa = LEVEL_REV (32, 1); break;
14854
0
    case EF_MIPS_ARCH_32R2: new_isa = LEVEL_REV (32, 2); break;
14855
0
    case EF_MIPS_ARCH_32R6: new_isa = LEVEL_REV (32, 6); break;
14856
0
    case EF_MIPS_ARCH_64:   new_isa = LEVEL_REV (64, 1); break;
14857
0
    case EF_MIPS_ARCH_64R2: new_isa = LEVEL_REV (64, 2); break;
14858
0
    case EF_MIPS_ARCH_64R6: new_isa = LEVEL_REV (64, 6); break;
14859
0
    default:
14860
0
      _bfd_error_handler
14861
  /* xgettext:c-format */
14862
0
  (_("%pB: unknown architecture %s"),
14863
0
   abfd, bfd_printable_name (abfd));
14864
0
    }
14865
14866
0
  if (new_isa > LEVEL_REV (abiflags->isa_level, abiflags->isa_rev))
14867
0
    {
14868
0
      abiflags->isa_level = ISA_LEVEL (new_isa);
14869
0
      abiflags->isa_rev = ISA_REV (new_isa);
14870
0
    }
14871
14872
  /* Update the isa_ext if ABFD describes a further extension.  */
14873
0
  if (mips_mach_extends_p (bfd_mips_isa_ext_mach (abiflags->isa_ext),
14874
0
         bfd_get_mach (abfd)))
14875
0
    abiflags->isa_ext = bfd_mips_isa_ext (abfd);
14876
0
}
14877
14878
/* Return true if the given ELF header flags describe a 32-bit binary.  */
14879
14880
static bool
14881
mips_32bit_flags_p (flagword flags)
14882
0
{
14883
0
  return ((flags & EF_MIPS_32BITMODE) != 0
14884
0
    || (flags & EF_MIPS_ABI) == EF_MIPS_ABI_O32
14885
0
    || (flags & EF_MIPS_ABI) == EF_MIPS_ABI_EABI32
14886
0
    || (flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_1
14887
0
    || (flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_2
14888
0
    || (flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32
14889
0
    || (flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32R2
14890
0
    || (flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32R6);
14891
0
}
14892
14893
/* Infer the content of the ABI flags based on the elf header.  */
14894
14895
static void
14896
infer_mips_abiflags (bfd *abfd, Elf_Internal_ABIFlags_v0* abiflags)
14897
0
{
14898
0
  obj_attribute *in_attr;
14899
14900
0
  memset (abiflags, 0, sizeof (Elf_Internal_ABIFlags_v0));
14901
0
  update_mips_abiflags_isa (abfd, abiflags);
14902
14903
0
  if (mips_32bit_flags_p (elf_elfheader (abfd)->e_flags))
14904
0
    abiflags->gpr_size = AFL_REG_32;
14905
0
  else
14906
0
    abiflags->gpr_size = AFL_REG_64;
14907
14908
0
  abiflags->cpr1_size = AFL_REG_NONE;
14909
14910
0
  in_attr = elf_known_obj_attributes (abfd)[OBJ_ATTR_GNU];
14911
0
  abiflags->fp_abi = in_attr[Tag_GNU_MIPS_ABI_FP].i;
14912
14913
0
  if (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_SINGLE
14914
0
      || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_XX
14915
0
      || (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_DOUBLE
14916
0
    && abiflags->gpr_size == AFL_REG_32))
14917
0
    abiflags->cpr1_size = AFL_REG_32;
14918
0
  else if (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_DOUBLE
14919
0
     || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_64
14920
0
     || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_64A)
14921
0
    abiflags->cpr1_size = AFL_REG_64;
14922
14923
0
  abiflags->cpr2_size = AFL_REG_NONE;
14924
14925
0
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
14926
0
    abiflags->ases |= AFL_ASE_MDMX;
14927
0
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
14928
0
    abiflags->ases |= AFL_ASE_MIPS16;
14929
0
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
14930
0
    abiflags->ases |= AFL_ASE_MICROMIPS;
14931
14932
0
  if (abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_ANY
14933
0
      && abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_SOFT
14934
0
      && abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_64A
14935
0
      && abiflags->isa_level >= 32
14936
0
      && abiflags->ases != AFL_ASE_LOONGSON_EXT)
14937
0
    abiflags->flags1 |= AFL_FLAGS1_ODDSPREG;
14938
0
}
14939
14940
/* We need to use a special link routine to handle the .reginfo and
14941
   the .mdebug sections.  We need to merge all instances of these
14942
   sections together, not write them all out sequentially.  */
14943
14944
bool
14945
_bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
14946
0
{
14947
0
  asection *o;
14948
0
  struct bfd_link_order *p;
14949
0
  asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
14950
0
  asection *rtproc_sec, *abiflags_sec;
14951
0
  Elf32_RegInfo reginfo;
14952
0
  struct ecoff_debug_info debug;
14953
0
  struct mips_htab_traverse_info hti;
14954
0
  elf_backend_data *bed = get_elf_backend_data (abfd);
14955
0
  const struct ecoff_debug_swap *swap = bed->elf_backend_ecoff_debug_swap;
14956
0
  HDRR *symhdr = &debug.symbolic_header;
14957
0
  void *mdebug_handle = NULL;
14958
0
  asection *s;
14959
0
  EXTR esym;
14960
0
  unsigned int i;
14961
0
  bfd_size_type amt;
14962
0
  struct mips_elf_link_hash_table *htab;
14963
14964
0
  static const char * const secname[] =
14965
0
  {
14966
0
    ".text", ".init", ".fini", ".data",
14967
0
    ".rodata", ".sdata", ".sbss", ".bss"
14968
0
  };
14969
0
  static const int sc[] =
14970
0
  {
14971
0
    scText, scInit, scFini, scData,
14972
0
    scRData, scSData, scSBss, scBss
14973
0
  };
14974
14975
0
  htab = mips_elf_hash_table (info);
14976
0
  BFD_ASSERT (htab != NULL);
14977
14978
  /* Sort the dynamic symbols so that those with GOT entries come after
14979
     those without.  */
14980
0
  if (!mips_elf_sort_hash_table (abfd, info))
14981
0
    return false;
14982
14983
  /* Create any scheduled LA25 stubs.  */
14984
0
  hti.info = info;
14985
0
  hti.output_bfd = abfd;
14986
0
  hti.error = false;
14987
0
  htab_traverse (htab->la25_stubs, mips_elf_create_la25_stub, &hti);
14988
0
  if (hti.error)
14989
0
    return false;
14990
14991
  /* Get a value for the GP register.  */
14992
0
  if (elf_gp (abfd) == 0)
14993
0
    {
14994
0
      struct bfd_link_hash_entry *h;
14995
14996
0
      h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
14997
0
      if (h != NULL && h->type == bfd_link_hash_defined)
14998
0
  elf_gp (abfd) = (h->u.def.value
14999
0
       + h->u.def.section->output_section->vma
15000
0
       + h->u.def.section->output_offset);
15001
0
      else if (htab->root.target_os == is_vxworks
15002
0
         && (h = bfd_link_hash_lookup (info->hash,
15003
0
               "_GLOBAL_OFFSET_TABLE_",
15004
0
               false, false, true))
15005
0
         && h->type == bfd_link_hash_defined)
15006
0
  elf_gp (abfd) = (h->u.def.section->output_section->vma
15007
0
       + h->u.def.section->output_offset
15008
0
       + h->u.def.value);
15009
0
      else if (bfd_link_relocatable (info))
15010
0
  {
15011
0
    bfd_vma lo = MINUS_ONE;
15012
15013
    /* Find the GP-relative section with the lowest offset.  */
15014
0
    for (o = abfd->sections; o != NULL; o = o->next)
15015
0
      if (o->vma < lo
15016
0
    && (elf_section_data (o)->this_hdr.sh_flags & SHF_MIPS_GPREL))
15017
0
        lo = o->vma;
15018
15019
    /* And calculate GP relative to that.  */
15020
0
    elf_gp (abfd) = lo + ELF_MIPS_GP_OFFSET (info);
15021
0
  }
15022
0
      else
15023
0
  {
15024
    /* If the relocate_section function needs to do a reloc
15025
       involving the GP value, it should make a reloc_dangerous
15026
       callback to warn that GP is not defined.  */
15027
0
  }
15028
0
    }
15029
15030
  /* Go through the sections and collect the .reginfo and .mdebug
15031
     information.  */
15032
0
  abiflags_sec = NULL;
15033
0
  reginfo_sec = NULL;
15034
0
  mdebug_sec = NULL;
15035
0
  gptab_data_sec = NULL;
15036
0
  gptab_bss_sec = NULL;
15037
0
  for (o = abfd->sections; o != NULL; o = o->next)
15038
0
    {
15039
0
      if (strcmp (o->name, ".MIPS.abiflags") == 0)
15040
0
  {
15041
    /* We have found the .MIPS.abiflags section in the output file.
15042
       Look through all the link_orders comprising it and remove them.
15043
       The data is merged in _bfd_mips_elf_merge_private_bfd_data.  */
15044
0
    for (p = o->map_head.link_order; p != NULL; p = p->next)
15045
0
      {
15046
0
        asection *input_section;
15047
15048
0
        if (p->type != bfd_indirect_link_order)
15049
0
    {
15050
0
      if (p->type == bfd_data_link_order)
15051
0
        continue;
15052
0
      abort ();
15053
0
    }
15054
15055
0
        input_section = p->u.indirect.section;
15056
15057
        /* Hack: reset the SEC_HAS_CONTENTS flag so that
15058
     elf_link_input_bfd ignores this section.  */
15059
0
        input_section->flags &= ~SEC_HAS_CONTENTS;
15060
0
      }
15061
15062
    /* Size has been set in _bfd_mips_elf_late_size_sections.  */
15063
0
    BFD_ASSERT(o->size == sizeof (Elf_External_ABIFlags_v0));
15064
15065
    /* Skip this section later on (I don't think this currently
15066
       matters, but someday it might).  */
15067
0
    o->map_head.link_order = NULL;
15068
15069
0
    abiflags_sec = o;
15070
0
  }
15071
15072
0
      if (strcmp (o->name, ".reginfo") == 0)
15073
0
  {
15074
0
    memset (&reginfo, 0, sizeof reginfo);
15075
15076
    /* We have found the .reginfo section in the output file.
15077
       Look through all the link_orders comprising it and merge
15078
       the information together.  */
15079
0
    for (p = o->map_head.link_order; p != NULL; p = p->next)
15080
0
      {
15081
0
        asection *input_section;
15082
0
        bfd *input_bfd;
15083
0
        Elf32_External_RegInfo ext;
15084
0
        Elf32_RegInfo sub;
15085
0
        bfd_size_type sz;
15086
15087
0
        if (p->type != bfd_indirect_link_order)
15088
0
    {
15089
0
      if (p->type == bfd_data_link_order)
15090
0
        continue;
15091
0
      abort ();
15092
0
    }
15093
15094
0
        input_section = p->u.indirect.section;
15095
0
        input_bfd = input_section->owner;
15096
15097
0
        sz = (input_section->size < sizeof (ext)
15098
0
        ? input_section->size : sizeof (ext));
15099
0
        memset (&ext, 0, sizeof (ext));
15100
0
        if (! bfd_get_section_contents (input_bfd, input_section,
15101
0
                &ext, 0, sz))
15102
0
    return false;
15103
15104
0
        bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub);
15105
15106
0
        reginfo.ri_gprmask |= sub.ri_gprmask;
15107
0
        reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
15108
0
        reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
15109
0
        reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
15110
0
        reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
15111
15112
        /* ri_gp_value is set by the function
15113
     `_bfd_mips_elf_section_processing' when the section is
15114
     finally written out.  */
15115
15116
        /* Hack: reset the SEC_HAS_CONTENTS flag so that
15117
     elf_link_input_bfd ignores this section.  */
15118
0
        input_section->flags &= ~SEC_HAS_CONTENTS;
15119
0
      }
15120
15121
    /* Size has been set in _bfd_mips_elf_late_size_sections.  */
15122
0
    BFD_ASSERT(o->size == sizeof (Elf32_External_RegInfo));
15123
15124
    /* Skip this section later on (I don't think this currently
15125
       matters, but someday it might).  */
15126
0
    o->map_head.link_order = NULL;
15127
15128
0
    reginfo_sec = o;
15129
0
  }
15130
15131
0
      if (strcmp (o->name, ".mdebug") == 0)
15132
0
  {
15133
0
    struct extsym_info einfo;
15134
0
    bfd_vma last;
15135
15136
    /* We have found the .mdebug section in the output file.
15137
       Look through all the link_orders comprising it and merge
15138
       the information together.  */
15139
0
    symhdr->magic = swap->sym_magic;
15140
    /* FIXME: What should the version stamp be?  */
15141
0
    symhdr->vstamp = 0;
15142
0
    symhdr->ilineMax = 0;
15143
0
    symhdr->cbLine = 0;
15144
0
    symhdr->idnMax = 0;
15145
0
    symhdr->ipdMax = 0;
15146
0
    symhdr->isymMax = 0;
15147
0
    symhdr->ioptMax = 0;
15148
0
    symhdr->iauxMax = 0;
15149
0
    symhdr->issMax = 0;
15150
0
    symhdr->issExtMax = 0;
15151
0
    symhdr->ifdMax = 0;
15152
0
    symhdr->crfd = 0;
15153
0
    symhdr->iextMax = 0;
15154
15155
    /* We accumulate the debugging information itself in the
15156
       debug_info structure.  */
15157
0
    debug.alloc_syments = false;
15158
0
    debug.line = NULL;
15159
0
    debug.external_dnr = NULL;
15160
0
    debug.external_pdr = NULL;
15161
0
    debug.external_sym = NULL;
15162
0
    debug.external_opt = NULL;
15163
0
    debug.external_aux = NULL;
15164
0
    debug.ss = NULL;
15165
0
    debug.ssext = debug.ssext_end = NULL;
15166
0
    debug.external_fdr = NULL;
15167
0
    debug.external_rfd = NULL;
15168
0
    debug.external_ext = debug.external_ext_end = NULL;
15169
15170
0
    mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
15171
0
    if (mdebug_handle == NULL)
15172
0
      return false;
15173
15174
0
    esym.jmptbl = 0;
15175
0
    esym.cobol_main = 0;
15176
0
    esym.weakext = 0;
15177
0
    esym.reserved = 0;
15178
0
    esym.ifd = ifdNil;
15179
0
    esym.asym.iss = issNil;
15180
0
    esym.asym.st = stLocal;
15181
0
    esym.asym.reserved = 0;
15182
0
    esym.asym.index = indexNil;
15183
0
    last = 0;
15184
0
    for (i = 0; i < sizeof (secname) / sizeof (secname[0]); i++)
15185
0
      {
15186
0
        esym.asym.sc = sc[i];
15187
0
        s = bfd_get_section_by_name (abfd, secname[i]);
15188
0
        if (s != NULL)
15189
0
    {
15190
0
      esym.asym.value = s->vma;
15191
0
      last = s->vma + s->size;
15192
0
    }
15193
0
        else
15194
0
    esym.asym.value = last;
15195
0
        if (!bfd_ecoff_debug_one_external (abfd, &debug, swap,
15196
0
             secname[i], &esym))
15197
0
    return false;
15198
0
      }
15199
15200
0
    for (p = o->map_head.link_order; p != NULL; p = p->next)
15201
0
      {
15202
0
        asection *input_section;
15203
0
        bfd *input_bfd;
15204
0
        const struct ecoff_debug_swap *input_swap;
15205
0
        struct ecoff_debug_info input_debug;
15206
0
        char *eraw_src;
15207
0
        char *eraw_end;
15208
15209
0
        if (p->type != bfd_indirect_link_order)
15210
0
    {
15211
0
      if (p->type == bfd_data_link_order)
15212
0
        continue;
15213
0
      abort ();
15214
0
    }
15215
15216
0
        input_section = p->u.indirect.section;
15217
0
        input_bfd = input_section->owner;
15218
15219
0
        if (!is_mips_elf (input_bfd))
15220
0
    {
15221
      /* I don't know what a non MIPS ELF bfd would be
15222
         doing with a .mdebug section, but I don't really
15223
         want to deal with it.  */
15224
0
      continue;
15225
0
    }
15226
15227
0
        input_swap = (get_elf_backend_data (input_bfd)
15228
0
          ->elf_backend_ecoff_debug_swap);
15229
15230
0
        BFD_ASSERT (p->size == input_section->size);
15231
15232
        /* The ECOFF linking code expects that we have already
15233
     read in the debugging information and set up an
15234
     ecoff_debug_info structure, so we do that now.  */
15235
0
        if (! _bfd_mips_elf_read_ecoff_info (input_bfd, input_section,
15236
0
               &input_debug))
15237
0
    return false;
15238
15239
0
        if (! (bfd_ecoff_debug_accumulate
15240
0
         (mdebug_handle, abfd, &debug, swap, input_bfd,
15241
0
          &input_debug, input_swap, info)))
15242
0
    {
15243
0
      _bfd_ecoff_free_ecoff_debug_info (&input_debug);
15244
0
      return false;
15245
0
    }
15246
15247
        /* Loop through the external symbols.  For each one with
15248
     interesting information, try to find the symbol in
15249
     the linker global hash table and save the information
15250
     for the output external symbols.  */
15251
0
        eraw_src = input_debug.external_ext;
15252
0
        eraw_end = (eraw_src
15253
0
        + (input_debug.symbolic_header.iextMax
15254
0
           * input_swap->external_ext_size));
15255
0
        for (;
15256
0
       eraw_src < eraw_end;
15257
0
       eraw_src += input_swap->external_ext_size)
15258
0
    {
15259
0
      EXTR ext;
15260
0
      const char *name;
15261
0
      struct mips_elf_link_hash_entry *h;
15262
15263
0
      (*input_swap->swap_ext_in) (input_bfd, eraw_src, &ext);
15264
0
      if (ext.asym.sc == scNil
15265
0
          || ext.asym.sc == scUndefined
15266
0
          || ext.asym.sc == scSUndefined)
15267
0
        continue;
15268
15269
0
      name = input_debug.ssext + ext.asym.iss;
15270
0
      h = mips_elf_link_hash_lookup (mips_elf_hash_table (info),
15271
0
             name, false, false, true);
15272
0
      if (h == NULL || h->esym.ifd != -2)
15273
0
        continue;
15274
15275
0
      if (ext.ifd != -1)
15276
0
        {
15277
0
          BFD_ASSERT (ext.ifd
15278
0
          < input_debug.symbolic_header.ifdMax);
15279
0
          ext.ifd = input_debug.ifdmap[ext.ifd];
15280
0
        }
15281
15282
0
      h->esym = ext;
15283
0
    }
15284
15285
        /* Free up the information we just read.  */
15286
0
        _bfd_ecoff_free_ecoff_debug_info (&input_debug);
15287
15288
        /* Hack: reset the SEC_HAS_CONTENTS flag so that
15289
     elf_link_input_bfd ignores this section.  */
15290
0
        input_section->flags &= ~SEC_HAS_CONTENTS;
15291
0
      }
15292
15293
0
    if (SGI_COMPAT (abfd) && bfd_link_pic (info))
15294
0
      {
15295
        /* Create .rtproc section.  */
15296
0
        rtproc_sec = bfd_get_linker_section (abfd, ".rtproc");
15297
0
        if (rtproc_sec == NULL)
15298
0
    {
15299
0
      flagword flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
15300
0
            | SEC_LINKER_CREATED | SEC_READONLY);
15301
15302
0
      rtproc_sec = bfd_make_section_anyway_with_flags (abfd,
15303
0
                   ".rtproc",
15304
0
                   flags);
15305
0
      if (rtproc_sec == NULL
15306
0
          || !bfd_set_section_alignment (rtproc_sec, 4))
15307
0
        return false;
15308
0
    }
15309
15310
0
        if (! mips_elf_create_procedure_table (mdebug_handle, abfd,
15311
0
                 info, rtproc_sec,
15312
0
                 &debug))
15313
0
    return false;
15314
0
      }
15315
15316
    /* Build the external symbol information.  */
15317
0
    einfo.abfd = abfd;
15318
0
    einfo.info = info;
15319
0
    einfo.debug = &debug;
15320
0
    einfo.swap = swap;
15321
0
    einfo.failed = false;
15322
0
    mips_elf_link_hash_traverse (mips_elf_hash_table (info),
15323
0
               mips_elf_output_extsym, &einfo);
15324
0
    if (einfo.failed)
15325
0
      return false;
15326
15327
    /* Set the size of the .mdebug section.  */
15328
0
    o->size = bfd_ecoff_debug_size (abfd, &debug, swap);
15329
15330
    /* Skip this section later on (I don't think this currently
15331
       matters, but someday it might).  */
15332
0
    o->map_head.link_order = NULL;
15333
15334
0
    mdebug_sec = o;
15335
0
  }
15336
15337
0
      if (startswith (o->name, ".gptab."))
15338
0
  {
15339
0
    const char *subname;
15340
0
    unsigned int c;
15341
0
    Elf32_gptab *tab;
15342
0
    Elf32_External_gptab *ext_tab;
15343
0
    unsigned int j;
15344
15345
    /* The .gptab.sdata and .gptab.sbss sections hold
15346
       information describing how the small data area would
15347
       change depending upon the -G switch.  These sections
15348
       not used in executables files.  */
15349
0
    if (! bfd_link_relocatable (info))
15350
0
      {
15351
0
        for (p = o->map_head.link_order; p != NULL; p = p->next)
15352
0
    {
15353
0
      asection *input_section;
15354
15355
0
      if (p->type != bfd_indirect_link_order)
15356
0
        {
15357
0
          if (p->type == bfd_data_link_order)
15358
0
      continue;
15359
0
          abort ();
15360
0
        }
15361
15362
0
      input_section = p->u.indirect.section;
15363
15364
      /* Hack: reset the SEC_HAS_CONTENTS flag so that
15365
         elf_link_input_bfd ignores this section.  */
15366
0
      input_section->flags &= ~SEC_HAS_CONTENTS;
15367
0
    }
15368
15369
        /* Skip this section later on (I don't think this
15370
     currently matters, but someday it might).  */
15371
0
        o->map_head.link_order = NULL;
15372
15373
        /* Really remove the section.  */
15374
0
        bfd_section_list_remove (abfd, o);
15375
0
        --abfd->section_count;
15376
15377
0
        continue;
15378
0
      }
15379
15380
    /* There is one gptab for initialized data, and one for
15381
       uninitialized data.  */
15382
0
    if (strcmp (o->name, ".gptab.sdata") == 0)
15383
0
      gptab_data_sec = o;
15384
0
    else if (strcmp (o->name, ".gptab.sbss") == 0)
15385
0
      gptab_bss_sec = o;
15386
0
    else
15387
0
      {
15388
0
        _bfd_error_handler
15389
    /* xgettext:c-format */
15390
0
    (_("%pB: illegal section name `%pA'"), abfd, o);
15391
0
        bfd_set_error (bfd_error_nonrepresentable_section);
15392
0
        return false;
15393
0
      }
15394
15395
    /* The linker script always combines .gptab.data and
15396
       .gptab.sdata into .gptab.sdata, and likewise for
15397
       .gptab.bss and .gptab.sbss.  It is possible that there is
15398
       no .sdata or .sbss section in the output file, in which
15399
       case we must change the name of the output section.  */
15400
0
    subname = o->name + sizeof ".gptab" - 1;
15401
0
    if (bfd_get_section_by_name (abfd, subname) == NULL)
15402
0
      {
15403
0
        if (o == gptab_data_sec)
15404
0
    o->name = ".gptab.data";
15405
0
        else
15406
0
    o->name = ".gptab.bss";
15407
0
        subname = o->name + sizeof ".gptab" - 1;
15408
0
        BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
15409
0
      }
15410
15411
    /* Set up the first entry.  */
15412
0
    c = 1;
15413
0
    amt = c * sizeof (Elf32_gptab);
15414
0
    tab = bfd_malloc (amt);
15415
0
    if (tab == NULL)
15416
0
      return false;
15417
0
    tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
15418
0
    tab[0].gt_header.gt_unused = 0;
15419
15420
    /* Combine the input sections.  */
15421
0
    for (p = o->map_head.link_order; p != NULL; p = p->next)
15422
0
      {
15423
0
        asection *input_section;
15424
0
        bfd *input_bfd;
15425
0
        bfd_size_type size;
15426
0
        unsigned long last;
15427
0
        bfd_size_type gpentry;
15428
15429
0
        if (p->type != bfd_indirect_link_order)
15430
0
    {
15431
0
      if (p->type == bfd_data_link_order)
15432
0
        continue;
15433
0
      abort ();
15434
0
    }
15435
15436
0
        input_section = p->u.indirect.section;
15437
0
        input_bfd = input_section->owner;
15438
15439
        /* Combine the gptab entries for this input section one
15440
     by one.  We know that the input gptab entries are
15441
     sorted by ascending -G value.  */
15442
0
        size = input_section->size;
15443
0
        last = 0;
15444
0
        for (gpentry = sizeof (Elf32_External_gptab);
15445
0
       gpentry < size;
15446
0
       gpentry += sizeof (Elf32_External_gptab))
15447
0
    {
15448
0
      Elf32_External_gptab ext_gptab;
15449
0
      Elf32_gptab int_gptab;
15450
0
      unsigned long val;
15451
0
      unsigned long add;
15452
0
      bool exact;
15453
0
      unsigned int look;
15454
15455
0
      if (! (bfd_get_section_contents
15456
0
       (input_bfd, input_section, &ext_gptab, gpentry,
15457
0
        sizeof (Elf32_External_gptab))))
15458
0
        {
15459
0
          free (tab);
15460
0
          return false;
15461
0
        }
15462
15463
0
      bfd_mips_elf32_swap_gptab_in (input_bfd, &ext_gptab,
15464
0
            &int_gptab);
15465
0
      val = int_gptab.gt_entry.gt_g_value;
15466
0
      add = int_gptab.gt_entry.gt_bytes - last;
15467
15468
0
      exact = false;
15469
0
      for (look = 1; look < c; look++)
15470
0
        {
15471
0
          if (tab[look].gt_entry.gt_g_value >= val)
15472
0
      tab[look].gt_entry.gt_bytes += add;
15473
15474
0
          if (tab[look].gt_entry.gt_g_value == val)
15475
0
      exact = true;
15476
0
        }
15477
15478
0
      if (! exact)
15479
0
        {
15480
0
          Elf32_gptab *new_tab;
15481
0
          unsigned int max;
15482
15483
          /* We need a new table entry.  */
15484
0
          amt = (bfd_size_type) (c + 1) * sizeof (Elf32_gptab);
15485
0
          new_tab = bfd_realloc (tab, amt);
15486
0
          if (new_tab == NULL)
15487
0
      {
15488
0
        free (tab);
15489
0
        return false;
15490
0
      }
15491
0
          tab = new_tab;
15492
0
          tab[c].gt_entry.gt_g_value = val;
15493
0
          tab[c].gt_entry.gt_bytes = add;
15494
15495
          /* Merge in the size for the next smallest -G
15496
       value, since that will be implied by this new
15497
       value.  */
15498
0
          max = 0;
15499
0
          for (look = 1; look < c; look++)
15500
0
      {
15501
0
        if (tab[look].gt_entry.gt_g_value < val
15502
0
            && (max == 0
15503
0
          || (tab[look].gt_entry.gt_g_value
15504
0
              > tab[max].gt_entry.gt_g_value)))
15505
0
          max = look;
15506
0
      }
15507
0
          if (max != 0)
15508
0
      tab[c].gt_entry.gt_bytes +=
15509
0
        tab[max].gt_entry.gt_bytes;
15510
15511
0
          ++c;
15512
0
        }
15513
15514
0
      last = int_gptab.gt_entry.gt_bytes;
15515
0
    }
15516
15517
        /* Hack: reset the SEC_HAS_CONTENTS flag so that
15518
     elf_link_input_bfd ignores this section.  */
15519
0
        input_section->flags &= ~SEC_HAS_CONTENTS;
15520
0
      }
15521
15522
    /* The table must be sorted by -G value.  */
15523
0
    if (c > 2)
15524
0
      qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
15525
15526
    /* Swap out the table.  */
15527
0
    amt = (bfd_size_type) c * sizeof (Elf32_External_gptab);
15528
0
    ext_tab = bfd_alloc (abfd, amt);
15529
0
    if (ext_tab == NULL)
15530
0
      {
15531
0
        free (tab);
15532
0
        return false;
15533
0
      }
15534
15535
0
    for (j = 0; j < c; j++)
15536
0
      bfd_mips_elf32_swap_gptab_out (abfd, tab + j, ext_tab + j);
15537
0
    free (tab);
15538
15539
0
    o->size = c * sizeof (Elf32_External_gptab);
15540
0
    o->contents = (bfd_byte *) ext_tab;
15541
0
    o->alloced = 1;
15542
15543
    /* Skip this section later on (I don't think this currently
15544
       matters, but someday it might).  */
15545
0
    o->map_head.link_order = NULL;
15546
0
  }
15547
0
    }
15548
15549
  /* Invoke the regular ELF backend linker to do all the work.  */
15550
0
  if (!_bfd_elf_final_link (abfd, info))
15551
0
    return false;
15552
15553
  /* Now write out the computed sections.  */
15554
15555
0
  if (abiflags_sec != NULL)
15556
0
    {
15557
0
      Elf_External_ABIFlags_v0 ext;
15558
0
      Elf_Internal_ABIFlags_v0 *abiflags;
15559
15560
0
      abiflags = &mips_elf_tdata (abfd)->abiflags;
15561
15562
      /* Set up the abiflags if no valid input sections were found.  */
15563
0
      if (!mips_elf_tdata (abfd)->abiflags_valid)
15564
0
  {
15565
0
    infer_mips_abiflags (abfd, abiflags);
15566
0
    mips_elf_tdata (abfd)->abiflags_valid = true;
15567
0
  }
15568
0
      bfd_mips_elf_swap_abiflags_v0_out (abfd, abiflags, &ext);
15569
0
      if (! bfd_set_section_contents (abfd, abiflags_sec, &ext, 0, sizeof ext))
15570
0
  return false;
15571
0
    }
15572
15573
0
  if (reginfo_sec != NULL)
15574
0
    {
15575
0
      Elf32_External_RegInfo ext;
15576
15577
0
      bfd_mips_elf32_swap_reginfo_out (abfd, &reginfo, &ext);
15578
0
      if (! bfd_set_section_contents (abfd, reginfo_sec, &ext, 0, sizeof ext))
15579
0
  return false;
15580
0
    }
15581
15582
0
  if (mdebug_sec != NULL)
15583
0
    {
15584
0
      BFD_ASSERT (abfd->output_has_begun);
15585
0
      if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
15586
0
                 swap, info,
15587
0
                 mdebug_sec->filepos))
15588
0
  return false;
15589
15590
0
      bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
15591
0
    }
15592
15593
0
  if (gptab_data_sec != NULL)
15594
0
    {
15595
0
      if (! bfd_set_section_contents (abfd, gptab_data_sec,
15596
0
              gptab_data_sec->contents,
15597
0
              0, gptab_data_sec->size))
15598
0
  return false;
15599
0
    }
15600
15601
0
  if (gptab_bss_sec != NULL)
15602
0
    {
15603
0
      if (! bfd_set_section_contents (abfd, gptab_bss_sec,
15604
0
              gptab_bss_sec->contents,
15605
0
              0, gptab_bss_sec->size))
15606
0
  return false;
15607
0
    }
15608
15609
0
  if (SGI_COMPAT (abfd))
15610
0
    {
15611
0
      rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
15612
0
      if (rtproc_sec != NULL)
15613
0
  {
15614
0
    if (! bfd_set_section_contents (abfd, rtproc_sec,
15615
0
            rtproc_sec->contents,
15616
0
            0, rtproc_sec->size))
15617
0
      return false;
15618
0
  }
15619
0
    }
15620
15621
0
  return true;
15622
0
}
15623

15624
/* Merge object file header flags from IBFD into OBFD.  Raise an error
15625
   if there are conflicting settings.  */
15626
15627
static bool
15628
mips_elf_merge_obj_e_flags (bfd *ibfd, struct bfd_link_info *info)
15629
0
{
15630
0
  bfd *obfd = info->output_bfd;
15631
0
  struct mips_elf_obj_tdata *out_tdata = mips_elf_tdata (obfd);
15632
0
  flagword old_flags;
15633
0
  flagword new_flags;
15634
0
  bool ok;
15635
15636
0
  new_flags = elf_elfheader (ibfd)->e_flags;
15637
0
  elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_NOREORDER;
15638
0
  old_flags = elf_elfheader (obfd)->e_flags;
15639
15640
  /* Check flag compatibility.  */
15641
15642
0
  new_flags &= ~EF_MIPS_NOREORDER;
15643
0
  old_flags &= ~EF_MIPS_NOREORDER;
15644
15645
  /* Some IRIX 6 BSD-compatibility objects have this bit set.  It
15646
     doesn't seem to matter.  */
15647
0
  new_flags &= ~EF_MIPS_XGOT;
15648
0
  old_flags &= ~EF_MIPS_XGOT;
15649
15650
  /* MIPSpro generates ucode info in n64 objects.  Again, we should
15651
     just be able to ignore this.  */
15652
0
  new_flags &= ~EF_MIPS_UCODE;
15653
0
  old_flags &= ~EF_MIPS_UCODE;
15654
15655
  /* DSOs should only be linked with CPIC code.  */
15656
0
  if ((ibfd->flags & DYNAMIC) != 0)
15657
0
    new_flags |= EF_MIPS_PIC | EF_MIPS_CPIC;
15658
15659
0
  if (new_flags == old_flags)
15660
0
    return true;
15661
15662
0
  ok = true;
15663
15664
0
  if (((new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0)
15665
0
      != ((old_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0))
15666
0
    {
15667
0
      _bfd_error_handler
15668
0
  (_("%pB: warning: linking abicalls files with non-abicalls files"),
15669
0
   ibfd);
15670
0
      ok = true;
15671
0
    }
15672
15673
0
  if (new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC))
15674
0
    elf_elfheader (obfd)->e_flags |= EF_MIPS_CPIC;
15675
0
  if (! (new_flags & EF_MIPS_PIC))
15676
0
    elf_elfheader (obfd)->e_flags &= ~EF_MIPS_PIC;
15677
15678
0
  new_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
15679
0
  old_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
15680
15681
  /* Compare the ISAs.  */
15682
0
  if (mips_32bit_flags_p (old_flags) != mips_32bit_flags_p (new_flags))
15683
0
    {
15684
0
      _bfd_error_handler
15685
0
  (_("%pB: linking 32-bit code with 64-bit code"),
15686
0
   ibfd);
15687
0
      ok = false;
15688
0
    }
15689
0
  else if (!mips_mach_extends_p (bfd_get_mach (ibfd), bfd_get_mach (obfd)))
15690
0
    {
15691
      /* OBFD's ISA isn't the same as, or an extension of, IBFD's.  */
15692
0
      if (mips_mach_extends_p (bfd_get_mach (obfd), bfd_get_mach (ibfd)))
15693
0
  {
15694
    /* Copy the architecture info from IBFD to OBFD.  Also copy
15695
       the 32-bit flag (if set) so that we continue to recognise
15696
       OBFD as a 32-bit binary.  */
15697
0
    bfd_set_arch_info (obfd, bfd_get_arch_info (ibfd));
15698
0
    elf_elfheader (obfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
15699
0
    elf_elfheader (obfd)->e_flags
15700
0
      |= new_flags & (EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15701
15702
    /* Update the ABI flags isa_level, isa_rev, isa_ext fields.  */
15703
0
    update_mips_abiflags_isa (obfd, &out_tdata->abiflags);
15704
15705
    /* Copy across the ABI flags if OBFD doesn't use them
15706
       and if that was what caused us to treat IBFD as 32-bit.  */
15707
0
    if ((old_flags & EF_MIPS_ABI) == 0
15708
0
        && mips_32bit_flags_p (new_flags)
15709
0
        && !mips_32bit_flags_p (new_flags & ~EF_MIPS_ABI))
15710
0
      elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ABI;
15711
0
  }
15712
0
      else
15713
0
  {
15714
    /* The ISAs aren't compatible.  */
15715
0
    _bfd_error_handler
15716
      /* xgettext:c-format */
15717
0
      (_("%pB: linking %s module with previous %s modules"),
15718
0
       ibfd,
15719
0
       bfd_printable_name (ibfd),
15720
0
       bfd_printable_name (obfd));
15721
0
    ok = false;
15722
0
  }
15723
0
    }
15724
15725
0
  new_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15726
0
  old_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15727
15728
  /* Compare ABIs.  The 64-bit ABI does not use EF_MIPS_ABI.  But, it
15729
     does set EI_CLASS differently from any 32-bit ABI.  */
15730
0
  if ((new_flags & EF_MIPS_ABI) != (old_flags & EF_MIPS_ABI)
15731
0
      || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
15732
0
    != elf_elfheader (obfd)->e_ident[EI_CLASS]))
15733
0
    {
15734
      /* Only error if both are set (to different values).  */
15735
0
      if (((new_flags & EF_MIPS_ABI) && (old_flags & EF_MIPS_ABI))
15736
0
    || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
15737
0
        != elf_elfheader (obfd)->e_ident[EI_CLASS]))
15738
0
  {
15739
0
    _bfd_error_handler
15740
      /* xgettext:c-format */
15741
0
      (_("%pB: ABI mismatch: linking %s module with previous %s modules"),
15742
0
       ibfd,
15743
0
       elf_mips_abi_name (ibfd),
15744
0
       elf_mips_abi_name (obfd));
15745
0
    ok = false;
15746
0
  }
15747
0
      new_flags &= ~EF_MIPS_ABI;
15748
0
      old_flags &= ~EF_MIPS_ABI;
15749
0
    }
15750
15751
  /* Compare ASEs.  Forbid linking MIPS16 and microMIPS ASE modules together
15752
     and allow arbitrary mixing of the remaining ASEs (retain the union).  */
15753
0
  if ((new_flags & EF_MIPS_ARCH_ASE) != (old_flags & EF_MIPS_ARCH_ASE))
15754
0
    {
15755
0
      int old_micro = old_flags & EF_MIPS_ARCH_ASE_MICROMIPS;
15756
0
      int new_micro = new_flags & EF_MIPS_ARCH_ASE_MICROMIPS;
15757
0
      int old_m16 = old_flags & EF_MIPS_ARCH_ASE_M16;
15758
0
      int new_m16 = new_flags & EF_MIPS_ARCH_ASE_M16;
15759
0
      int micro_mis = old_m16 && new_micro;
15760
0
      int m16_mis = old_micro && new_m16;
15761
15762
0
      if (m16_mis || micro_mis)
15763
0
  {
15764
0
    _bfd_error_handler
15765
      /* xgettext:c-format */
15766
0
      (_("%pB: ASE mismatch: linking %s module with previous %s modules"),
15767
0
       ibfd,
15768
0
       m16_mis ? "MIPS16" : "microMIPS",
15769
0
       m16_mis ? "microMIPS" : "MIPS16");
15770
0
    ok = false;
15771
0
  }
15772
15773
0
      elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ARCH_ASE;
15774
15775
0
      new_flags &= ~ EF_MIPS_ARCH_ASE;
15776
0
      old_flags &= ~ EF_MIPS_ARCH_ASE;
15777
0
    }
15778
15779
  /* Compare NaN encodings.  */
15780
0
  if ((new_flags & EF_MIPS_NAN2008) != (old_flags & EF_MIPS_NAN2008))
15781
0
    {
15782
      /* xgettext:c-format */
15783
0
      _bfd_error_handler (_("%pB: linking %s module with previous %s modules"),
15784
0
        ibfd,
15785
0
        (new_flags & EF_MIPS_NAN2008
15786
0
         ? "-mnan=2008" : "-mnan=legacy"),
15787
0
        (old_flags & EF_MIPS_NAN2008
15788
0
         ? "-mnan=2008" : "-mnan=legacy"));
15789
0
      ok = false;
15790
0
      new_flags &= ~EF_MIPS_NAN2008;
15791
0
      old_flags &= ~EF_MIPS_NAN2008;
15792
0
    }
15793
15794
  /* Compare FP64 state.  */
15795
0
  if ((new_flags & EF_MIPS_FP64) != (old_flags & EF_MIPS_FP64))
15796
0
    {
15797
      /* xgettext:c-format */
15798
0
      _bfd_error_handler (_("%pB: linking %s module with previous %s modules"),
15799
0
        ibfd,
15800
0
        (new_flags & EF_MIPS_FP64
15801
0
         ? "-mfp64" : "-mfp32"),
15802
0
        (old_flags & EF_MIPS_FP64
15803
0
         ? "-mfp64" : "-mfp32"));
15804
0
      ok = false;
15805
0
      new_flags &= ~EF_MIPS_FP64;
15806
0
      old_flags &= ~EF_MIPS_FP64;
15807
0
    }
15808
15809
  /* Warn about any other mismatches */
15810
0
  if (new_flags != old_flags)
15811
0
    {
15812
      /* xgettext:c-format */
15813
0
      _bfd_error_handler
15814
0
  (_("%pB: uses different e_flags (%#x) fields than previous modules "
15815
0
     "(%#x)"),
15816
0
   ibfd, new_flags, old_flags);
15817
0
      ok = false;
15818
0
    }
15819
15820
0
  return ok;
15821
0
}
15822
15823
/* Merge object attributes from IBFD into OBFD.  Raise an error if
15824
   there are conflicting attributes.  */
15825
static bool
15826
mips_elf_merge_obj_attributes (bfd *ibfd, struct bfd_link_info *info)
15827
0
{
15828
0
  bfd *obfd = info->output_bfd;
15829
0
  obj_attribute *in_attr;
15830
0
  obj_attribute *out_attr;
15831
0
  bfd *abi_fp_bfd;
15832
0
  bfd *abi_msa_bfd;
15833
15834
0
  abi_fp_bfd = mips_elf_tdata (obfd)->abi_fp_bfd;
15835
0
  in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
15836
0
  if (!abi_fp_bfd && in_attr[Tag_GNU_MIPS_ABI_FP].i != Val_GNU_MIPS_ABI_FP_ANY)
15837
0
    mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
15838
15839
0
  abi_msa_bfd = mips_elf_tdata (obfd)->abi_msa_bfd;
15840
0
  if (!abi_msa_bfd
15841
0
      && in_attr[Tag_GNU_MIPS_ABI_MSA].i != Val_GNU_MIPS_ABI_MSA_ANY)
15842
0
    mips_elf_tdata (obfd)->abi_msa_bfd = ibfd;
15843
15844
0
  if (!elf_known_obj_attributes_proc (obfd)[0].i)
15845
0
    {
15846
      /* This is the first object.  Copy the attributes.  */
15847
0
      _bfd_elf_copy_obj_attributes (ibfd, obfd);
15848
15849
      /* Use the Tag_null value to indicate the attributes have been
15850
   initialized.  */
15851
0
      elf_known_obj_attributes_proc (obfd)[0].i = 1;
15852
15853
0
      return true;
15854
0
    }
15855
15856
  /* Check for conflicting Tag_GNU_MIPS_ABI_FP attributes and merge
15857
     non-conflicting ones.  */
15858
0
  out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
15859
0
  if (in_attr[Tag_GNU_MIPS_ABI_FP].i != out_attr[Tag_GNU_MIPS_ABI_FP].i)
15860
0
    {
15861
0
      int out_fp, in_fp;
15862
15863
0
      out_fp = out_attr[Tag_GNU_MIPS_ABI_FP].i;
15864
0
      in_fp = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15865
0
      out_attr[Tag_GNU_MIPS_ABI_FP].type = 1;
15866
0
      if (out_fp == Val_GNU_MIPS_ABI_FP_ANY)
15867
0
  out_attr[Tag_GNU_MIPS_ABI_FP].i = in_fp;
15868
0
      else if (out_fp == Val_GNU_MIPS_ABI_FP_XX
15869
0
         && (in_fp == Val_GNU_MIPS_ABI_FP_DOUBLE
15870
0
       || in_fp == Val_GNU_MIPS_ABI_FP_64
15871
0
       || in_fp == Val_GNU_MIPS_ABI_FP_64A))
15872
0
  {
15873
0
    mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
15874
0
    out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15875
0
  }
15876
0
      else if (in_fp == Val_GNU_MIPS_ABI_FP_XX
15877
0
         && (out_fp == Val_GNU_MIPS_ABI_FP_DOUBLE
15878
0
       || out_fp == Val_GNU_MIPS_ABI_FP_64
15879
0
       || out_fp == Val_GNU_MIPS_ABI_FP_64A))
15880
0
  /* Keep the current setting.  */;
15881
0
      else if (out_fp == Val_GNU_MIPS_ABI_FP_64A
15882
0
         && in_fp == Val_GNU_MIPS_ABI_FP_64)
15883
0
  {
15884
0
    mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
15885
0
    out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15886
0
  }
15887
0
      else if (in_fp == Val_GNU_MIPS_ABI_FP_64A
15888
0
         && out_fp == Val_GNU_MIPS_ABI_FP_64)
15889
0
  /* Keep the current setting.  */;
15890
0
      else if (in_fp != Val_GNU_MIPS_ABI_FP_ANY)
15891
0
  {
15892
0
    const char *out_string, *in_string;
15893
15894
0
    out_string = _bfd_mips_fp_abi_string (out_fp);
15895
0
    in_string = _bfd_mips_fp_abi_string (in_fp);
15896
    /* First warn about cases involving unrecognised ABIs.  */
15897
0
    if (!out_string && !in_string)
15898
      /* xgettext:c-format */
15899
0
      _bfd_error_handler
15900
0
        (_("warning: %pB uses unknown floating point ABI %d "
15901
0
     "(set by %pB), %pB uses unknown floating point ABI %d"),
15902
0
         obfd, out_fp, abi_fp_bfd, ibfd, in_fp);
15903
0
    else if (!out_string)
15904
0
      _bfd_error_handler
15905
        /* xgettext:c-format */
15906
0
        (_("warning: %pB uses unknown floating point ABI %d "
15907
0
     "(set by %pB), %pB uses %s"),
15908
0
         obfd, out_fp, abi_fp_bfd, ibfd, in_string);
15909
0
    else if (!in_string)
15910
0
      _bfd_error_handler
15911
        /* xgettext:c-format */
15912
0
        (_("warning: %pB uses %s (set by %pB), "
15913
0
     "%pB uses unknown floating point ABI %d"),
15914
0
         obfd, out_string, abi_fp_bfd, ibfd, in_fp);
15915
0
    else
15916
0
      {
15917
        /* If one of the bfds is soft-float, the other must be
15918
     hard-float.  The exact choice of hard-float ABI isn't
15919
     really relevant to the error message.  */
15920
0
        if (in_fp == Val_GNU_MIPS_ABI_FP_SOFT)
15921
0
    out_string = "-mhard-float";
15922
0
        else if (out_fp == Val_GNU_MIPS_ABI_FP_SOFT)
15923
0
    in_string = "-mhard-float";
15924
0
        _bfd_error_handler
15925
    /* xgettext:c-format */
15926
0
    (_("warning: %pB uses %s (set by %pB), %pB uses %s"),
15927
0
     obfd, out_string, abi_fp_bfd, ibfd, in_string);
15928
0
      }
15929
0
  }
15930
0
    }
15931
15932
  /* Check for conflicting Tag_GNU_MIPS_ABI_MSA attributes and merge
15933
     non-conflicting ones.  */
15934
0
  if (in_attr[Tag_GNU_MIPS_ABI_MSA].i != out_attr[Tag_GNU_MIPS_ABI_MSA].i)
15935
0
    {
15936
0
      out_attr[Tag_GNU_MIPS_ABI_MSA].type = 1;
15937
0
      if (out_attr[Tag_GNU_MIPS_ABI_MSA].i == Val_GNU_MIPS_ABI_MSA_ANY)
15938
0
  out_attr[Tag_GNU_MIPS_ABI_MSA].i = in_attr[Tag_GNU_MIPS_ABI_MSA].i;
15939
0
      else if (in_attr[Tag_GNU_MIPS_ABI_MSA].i != Val_GNU_MIPS_ABI_MSA_ANY)
15940
0
  switch (out_attr[Tag_GNU_MIPS_ABI_MSA].i)
15941
0
    {
15942
0
    case Val_GNU_MIPS_ABI_MSA_128:
15943
0
      _bfd_error_handler
15944
        /* xgettext:c-format */
15945
0
        (_("warning: %pB uses %s (set by %pB), "
15946
0
     "%pB uses unknown MSA ABI %d"),
15947
0
         obfd, "-mmsa", abi_msa_bfd,
15948
0
         ibfd, in_attr[Tag_GNU_MIPS_ABI_MSA].i);
15949
0
      break;
15950
15951
0
    default:
15952
0
      switch (in_attr[Tag_GNU_MIPS_ABI_MSA].i)
15953
0
        {
15954
0
        case Val_GNU_MIPS_ABI_MSA_128:
15955
0
    _bfd_error_handler
15956
      /* xgettext:c-format */
15957
0
      (_("warning: %pB uses unknown MSA ABI %d "
15958
0
         "(set by %pB), %pB uses %s"),
15959
0
         obfd, out_attr[Tag_GNU_MIPS_ABI_MSA].i,
15960
0
       abi_msa_bfd, ibfd, "-mmsa");
15961
0
      break;
15962
15963
0
        default:
15964
0
    _bfd_error_handler
15965
      /* xgettext:c-format */
15966
0
      (_("warning: %pB uses unknown MSA ABI %d "
15967
0
         "(set by %pB), %pB uses unknown MSA ABI %d"),
15968
0
       obfd, out_attr[Tag_GNU_MIPS_ABI_MSA].i,
15969
0
       abi_msa_bfd, ibfd, in_attr[Tag_GNU_MIPS_ABI_MSA].i);
15970
0
    break;
15971
0
        }
15972
0
    }
15973
0
    }
15974
15975
  /* Merge Tag_compatibility attributes and any common GNU ones.  */
15976
0
  return _bfd_elf_merge_object_attributes (ibfd, info);
15977
0
}
15978
15979
/* Merge object ABI flags from IBFD into OBFD.  Raise an error if
15980
   there are conflicting settings.  */
15981
15982
static bool
15983
mips_elf_merge_obj_abiflags (bfd *ibfd, bfd *obfd)
15984
0
{
15985
0
  obj_attribute *out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
15986
0
  struct mips_elf_obj_tdata *out_tdata = mips_elf_tdata (obfd);
15987
0
  struct mips_elf_obj_tdata *in_tdata = mips_elf_tdata (ibfd);
15988
15989
  /* Update the output abiflags fp_abi using the computed fp_abi.  */
15990
0
  out_tdata->abiflags.fp_abi = out_attr[Tag_GNU_MIPS_ABI_FP].i;
15991
15992
0
#define max(a, b) ((a) > (b) ? (a) : (b))
15993
  /* Merge abiflags.  */
15994
0
  out_tdata->abiflags.isa_level = max (out_tdata->abiflags.isa_level,
15995
0
               in_tdata->abiflags.isa_level);
15996
0
  out_tdata->abiflags.isa_rev = max (out_tdata->abiflags.isa_rev,
15997
0
             in_tdata->abiflags.isa_rev);
15998
0
  out_tdata->abiflags.gpr_size = max (out_tdata->abiflags.gpr_size,
15999
0
              in_tdata->abiflags.gpr_size);
16000
0
  out_tdata->abiflags.cpr1_size = max (out_tdata->abiflags.cpr1_size,
16001
0
               in_tdata->abiflags.cpr1_size);
16002
0
  out_tdata->abiflags.cpr2_size = max (out_tdata->abiflags.cpr2_size,
16003
0
               in_tdata->abiflags.cpr2_size);
16004
0
#undef max
16005
0
  out_tdata->abiflags.ases |= in_tdata->abiflags.ases;
16006
0
  out_tdata->abiflags.flags1 |= in_tdata->abiflags.flags1;
16007
16008
0
  return true;
16009
0
}
16010
16011
/* Merge backend specific data from an object file to the output
16012
   object file when linking.  */
16013
16014
bool
16015
_bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
16016
0
{
16017
0
  bfd *obfd = info->output_bfd;
16018
0
  struct mips_elf_obj_tdata *out_tdata;
16019
0
  struct mips_elf_obj_tdata *in_tdata;
16020
0
  bool null_input_bfd = true;
16021
0
  asection *sec;
16022
0
  bool ok;
16023
16024
  /* Check if we have the same endianness.  */
16025
0
  if (! _bfd_generic_verify_endian_match (ibfd, info))
16026
0
    {
16027
0
      _bfd_error_handler
16028
0
  (_("%pB: endianness incompatible with that of the selected emulation"),
16029
0
   ibfd);
16030
0
      return false;
16031
0
    }
16032
16033
0
  if (!is_mips_elf (ibfd))
16034
0
    return true;
16035
16036
0
  in_tdata = mips_elf_tdata (ibfd);
16037
0
  out_tdata = mips_elf_tdata (obfd);
16038
16039
0
  if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
16040
0
    {
16041
0
      _bfd_error_handler
16042
0
  (_("%pB: ABI is incompatible with that of the selected emulation"),
16043
0
   ibfd);
16044
0
      return false;
16045
0
    }
16046
16047
  /* Check to see if the input BFD actually contains any sections.  If not,
16048
     then it has no attributes, and its flags may not have been initialized
16049
     either, but it cannot actually cause any incompatibility.  */
16050
  /* FIXME: This excludes any input shared library from consideration.  */
16051
0
  for (sec = ibfd->sections; sec != NULL; sec = sec->next)
16052
0
    {
16053
      /* Ignore synthetic sections and empty .text, .data and .bss sections
16054
   which are automatically generated by gas.  Also ignore fake
16055
   (s)common sections, since merely defining a common symbol does
16056
   not affect compatibility.  */
16057
0
      if ((sec->flags & SEC_IS_COMMON) == 0
16058
0
    && strcmp (sec->name, ".reginfo")
16059
0
    && strcmp (sec->name, ".mdebug")
16060
0
    && (sec->size != 0
16061
0
        || (strcmp (sec->name, ".text")
16062
0
      && strcmp (sec->name, ".data")
16063
0
      && strcmp (sec->name, ".bss"))))
16064
0
  {
16065
0
    null_input_bfd = false;
16066
0
    break;
16067
0
  }
16068
0
    }
16069
0
  if (null_input_bfd)
16070
0
    return true;
16071
16072
  /* Populate abiflags using existing information.  */
16073
0
  if (in_tdata->abiflags_valid)
16074
0
    {
16075
0
      obj_attribute *in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
16076
0
      Elf_Internal_ABIFlags_v0 in_abiflags;
16077
0
      Elf_Internal_ABIFlags_v0 abiflags;
16078
16079
      /* Set up the FP ABI attribute from the abiflags if it is not already
16080
   set.  */
16081
0
      if (in_attr[Tag_GNU_MIPS_ABI_FP].i == Val_GNU_MIPS_ABI_FP_ANY)
16082
0
  in_attr[Tag_GNU_MIPS_ABI_FP].i = in_tdata->abiflags.fp_abi;
16083
16084
0
      infer_mips_abiflags (ibfd, &abiflags);
16085
0
      in_abiflags = in_tdata->abiflags;
16086
16087
      /* It is not possible to infer the correct ISA revision
16088
   for R3 or R5 so drop down to R2 for the checks.  */
16089
0
      if (in_abiflags.isa_rev == 3 || in_abiflags.isa_rev == 5)
16090
0
  in_abiflags.isa_rev = 2;
16091
16092
0
      if (LEVEL_REV (in_abiflags.isa_level, in_abiflags.isa_rev)
16093
0
    < LEVEL_REV (abiflags.isa_level, abiflags.isa_rev))
16094
0
  _bfd_error_handler
16095
0
    (_("%pB: warning: inconsistent ISA between e_flags and "
16096
0
       ".MIPS.abiflags"), ibfd);
16097
0
      if (abiflags.fp_abi != Val_GNU_MIPS_ABI_FP_ANY
16098
0
    && in_abiflags.fp_abi != abiflags.fp_abi)
16099
0
  _bfd_error_handler
16100
0
    (_("%pB: warning: inconsistent FP ABI between .gnu.attributes and "
16101
0
       ".MIPS.abiflags"), ibfd);
16102
0
      if ((in_abiflags.ases & abiflags.ases) != abiflags.ases)
16103
0
  _bfd_error_handler
16104
0
    (_("%pB: warning: inconsistent ASEs between e_flags and "
16105
0
       ".MIPS.abiflags"), ibfd);
16106
      /* The isa_ext is allowed to be an extension of what can be inferred
16107
   from e_flags.  */
16108
0
      if (!mips_mach_extends_p (bfd_mips_isa_ext_mach (abiflags.isa_ext),
16109
0
        bfd_mips_isa_ext_mach (in_abiflags.isa_ext)))
16110
0
  _bfd_error_handler
16111
0
    (_("%pB: warning: inconsistent ISA extensions between e_flags and "
16112
0
       ".MIPS.abiflags"), ibfd);
16113
0
      if (in_abiflags.flags2 != 0)
16114
0
  _bfd_error_handler
16115
0
    (_("%pB: warning: unexpected flag in the flags2 field of "
16116
0
       ".MIPS.abiflags (0x%lx)"), ibfd,
16117
0
     in_abiflags.flags2);
16118
0
    }
16119
0
  else
16120
0
    {
16121
0
      infer_mips_abiflags (ibfd, &in_tdata->abiflags);
16122
0
      in_tdata->abiflags_valid = true;
16123
0
    }
16124
16125
0
  if (!out_tdata->abiflags_valid)
16126
0
    {
16127
      /* Copy input abiflags if output abiflags are not already valid.  */
16128
0
      out_tdata->abiflags = in_tdata->abiflags;
16129
0
      out_tdata->abiflags_valid = true;
16130
0
    }
16131
16132
0
  if (! elf_flags_init (obfd))
16133
0
    {
16134
0
      elf_flags_init (obfd) = true;
16135
0
      elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
16136
0
      elf_elfheader (obfd)->e_ident[EI_CLASS]
16137
0
  = elf_elfheader (ibfd)->e_ident[EI_CLASS];
16138
16139
0
      if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
16140
0
    && (bfd_get_arch_info (obfd)->the_default
16141
0
        || mips_mach_extends_p (bfd_get_mach (obfd),
16142
0
              bfd_get_mach (ibfd))))
16143
0
  {
16144
0
    if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
16145
0
           bfd_get_mach (ibfd)))
16146
0
      return false;
16147
16148
    /* Update the ABI flags isa_level, isa_rev and isa_ext fields.  */
16149
0
    update_mips_abiflags_isa (obfd, &out_tdata->abiflags);
16150
0
  }
16151
16152
0
      ok = true;
16153
0
    }
16154
0
  else
16155
0
    ok = mips_elf_merge_obj_e_flags (ibfd, info);
16156
16157
0
  ok = mips_elf_merge_obj_attributes (ibfd, info) && ok;
16158
16159
0
  ok = mips_elf_merge_obj_abiflags (ibfd, obfd) && ok;
16160
16161
0
  if (!ok)
16162
0
    {
16163
0
      bfd_set_error (bfd_error_bad_value);
16164
0
      return false;
16165
0
    }
16166
16167
0
  return true;
16168
0
}
16169
16170
/* Function to keep MIPS specific file flags like as EF_MIPS_PIC.  */
16171
16172
bool
16173
_bfd_mips_elf_set_private_flags (bfd *abfd, flagword flags)
16174
0
{
16175
0
  BFD_ASSERT (!elf_flags_init (abfd)
16176
0
        || elf_elfheader (abfd)->e_flags == flags);
16177
16178
0
  elf_elfheader (abfd)->e_flags = flags;
16179
0
  elf_flags_init (abfd) = true;
16180
0
  return true;
16181
0
}
16182
16183
char *
16184
_bfd_mips_elf_get_target_dtag (bfd_vma dtag)
16185
75
{
16186
75
  switch (dtag)
16187
75
    {
16188
75
    default: return "";
16189
0
    case DT_MIPS_RLD_VERSION:
16190
0
      return "MIPS_RLD_VERSION";
16191
0
    case DT_MIPS_TIME_STAMP:
16192
0
      return "MIPS_TIME_STAMP";
16193
0
    case DT_MIPS_ICHECKSUM:
16194
0
      return "MIPS_ICHECKSUM";
16195
0
    case DT_MIPS_IVERSION:
16196
0
      return "MIPS_IVERSION";
16197
0
    case DT_MIPS_FLAGS:
16198
0
      return "MIPS_FLAGS";
16199
0
    case DT_MIPS_BASE_ADDRESS:
16200
0
      return "MIPS_BASE_ADDRESS";
16201
0
    case DT_MIPS_MSYM:
16202
0
      return "MIPS_MSYM";
16203
0
    case DT_MIPS_CONFLICT:
16204
0
      return "MIPS_CONFLICT";
16205
0
    case DT_MIPS_LIBLIST:
16206
0
      return "MIPS_LIBLIST";
16207
0
    case DT_MIPS_LOCAL_GOTNO:
16208
0
      return "MIPS_LOCAL_GOTNO";
16209
0
    case DT_MIPS_CONFLICTNO:
16210
0
      return "MIPS_CONFLICTNO";
16211
0
    case DT_MIPS_LIBLISTNO:
16212
0
      return "MIPS_LIBLISTNO";
16213
0
    case DT_MIPS_SYMTABNO:
16214
0
      return "MIPS_SYMTABNO";
16215
0
    case DT_MIPS_UNREFEXTNO:
16216
0
      return "MIPS_UNREFEXTNO";
16217
0
    case DT_MIPS_GOTSYM:
16218
0
      return "MIPS_GOTSYM";
16219
0
    case DT_MIPS_HIPAGENO:
16220
0
      return "MIPS_HIPAGENO";
16221
0
    case DT_MIPS_RLD_MAP:
16222
0
      return "MIPS_RLD_MAP";
16223
0
    case DT_MIPS_RLD_MAP_REL:
16224
0
      return "MIPS_RLD_MAP_REL";
16225
0
    case DT_MIPS_DELTA_CLASS:
16226
0
      return "MIPS_DELTA_CLASS";
16227
0
    case DT_MIPS_DELTA_CLASS_NO:
16228
0
      return "MIPS_DELTA_CLASS_NO";
16229
0
    case DT_MIPS_DELTA_INSTANCE:
16230
0
      return "MIPS_DELTA_INSTANCE";
16231
0
    case DT_MIPS_DELTA_INSTANCE_NO:
16232
0
      return "MIPS_DELTA_INSTANCE_NO";
16233
0
    case DT_MIPS_DELTA_RELOC:
16234
0
      return "MIPS_DELTA_RELOC";
16235
0
    case DT_MIPS_DELTA_RELOC_NO:
16236
0
      return "MIPS_DELTA_RELOC_NO";
16237
0
    case DT_MIPS_DELTA_SYM:
16238
0
      return "MIPS_DELTA_SYM";
16239
0
    case DT_MIPS_DELTA_SYM_NO:
16240
0
      return "MIPS_DELTA_SYM_NO";
16241
0
    case DT_MIPS_DELTA_CLASSSYM:
16242
0
      return "MIPS_DELTA_CLASSSYM";
16243
0
    case DT_MIPS_DELTA_CLASSSYM_NO:
16244
0
      return "MIPS_DELTA_CLASSSYM_NO";
16245
0
    case DT_MIPS_CXX_FLAGS:
16246
0
      return "MIPS_CXX_FLAGS";
16247
0
    case DT_MIPS_PIXIE_INIT:
16248
0
      return "MIPS_PIXIE_INIT";
16249
0
    case DT_MIPS_SYMBOL_LIB:
16250
0
      return "MIPS_SYMBOL_LIB";
16251
0
    case DT_MIPS_LOCALPAGE_GOTIDX:
16252
0
      return "MIPS_LOCALPAGE_GOTIDX";
16253
0
    case DT_MIPS_LOCAL_GOTIDX:
16254
0
      return "MIPS_LOCAL_GOTIDX";
16255
0
    case DT_MIPS_HIDDEN_GOTIDX:
16256
0
      return "MIPS_HIDDEN_GOTIDX";
16257
0
    case DT_MIPS_PROTECTED_GOTIDX:
16258
0
      return "MIPS_PROTECTED_GOT_IDX";
16259
0
    case DT_MIPS_OPTIONS:
16260
0
      return "MIPS_OPTIONS";
16261
0
    case DT_MIPS_INTERFACE:
16262
0
      return "MIPS_INTERFACE";
16263
0
    case DT_MIPS_DYNSTR_ALIGN:
16264
0
      return "DT_MIPS_DYNSTR_ALIGN";
16265
0
    case DT_MIPS_INTERFACE_SIZE:
16266
0
      return "DT_MIPS_INTERFACE_SIZE";
16267
0
    case DT_MIPS_RLD_TEXT_RESOLVE_ADDR:
16268
0
      return "DT_MIPS_RLD_TEXT_RESOLVE_ADDR";
16269
0
    case DT_MIPS_PERF_SUFFIX:
16270
0
      return "DT_MIPS_PERF_SUFFIX";
16271
0
    case DT_MIPS_COMPACT_SIZE:
16272
0
      return "DT_MIPS_COMPACT_SIZE";
16273
0
    case DT_MIPS_GP_VALUE:
16274
0
      return "DT_MIPS_GP_VALUE";
16275
0
    case DT_MIPS_AUX_DYNAMIC:
16276
0
      return "DT_MIPS_AUX_DYNAMIC";
16277
0
    case DT_MIPS_PLTGOT:
16278
0
      return "DT_MIPS_PLTGOT";
16279
0
    case DT_MIPS_RWPLT:
16280
0
      return "DT_MIPS_RWPLT";
16281
0
    case DT_MIPS_XHASH:
16282
0
      return "DT_MIPS_XHASH";
16283
75
    }
16284
75
}
16285
16286
/* Return the meaning of Tag_GNU_MIPS_ABI_FP value FP, or null if
16287
   not known.  */
16288
16289
const char *
16290
_bfd_mips_fp_abi_string (int fp)
16291
0
{
16292
0
  switch (fp)
16293
0
    {
16294
      /* These strings aren't translated because they're simply
16295
   option lists.  */
16296
0
    case Val_GNU_MIPS_ABI_FP_DOUBLE:
16297
0
      return "-mdouble-float";
16298
16299
0
    case Val_GNU_MIPS_ABI_FP_SINGLE:
16300
0
      return "-msingle-float";
16301
16302
0
    case Val_GNU_MIPS_ABI_FP_SOFT:
16303
0
      return "-msoft-float";
16304
16305
0
    case Val_GNU_MIPS_ABI_FP_OLD_64:
16306
0
      return _("-mips32r2 -mfp64 (12 callee-saved)");
16307
16308
0
    case Val_GNU_MIPS_ABI_FP_XX:
16309
0
      return "-mfpxx";
16310
16311
0
    case Val_GNU_MIPS_ABI_FP_64:
16312
0
      return "-mgp32 -mfp64";
16313
16314
0
    case Val_GNU_MIPS_ABI_FP_64A:
16315
0
      return "-mgp32 -mfp64 -mno-odd-spreg";
16316
16317
0
    default:
16318
0
      return 0;
16319
0
    }
16320
0
}
16321
16322
static void
16323
print_mips_ases (FILE *file, unsigned int mask)
16324
0
{
16325
0
  if (mask & AFL_ASE_DSP)
16326
0
    fputs ("\n\tDSP ASE", file);
16327
0
  if (mask & AFL_ASE_DSPR2)
16328
0
    fputs ("\n\tDSP R2 ASE", file);
16329
0
  if (mask & AFL_ASE_DSPR3)
16330
0
    fputs ("\n\tDSP R3 ASE", file);
16331
0
  if (mask & AFL_ASE_EVA)
16332
0
    fputs ("\n\tEnhanced VA Scheme", file);
16333
0
  if (mask & AFL_ASE_MCU)
16334
0
    fputs ("\n\tMCU (MicroController) ASE", file);
16335
0
  if (mask & AFL_ASE_MDMX)
16336
0
    fputs ("\n\tMDMX ASE", file);
16337
0
  if (mask & AFL_ASE_MIPS3D)
16338
0
    fputs ("\n\tMIPS-3D ASE", file);
16339
0
  if (mask & AFL_ASE_MT)
16340
0
    fputs ("\n\tMT ASE", file);
16341
0
  if (mask & AFL_ASE_SMARTMIPS)
16342
0
    fputs ("\n\tSmartMIPS ASE", file);
16343
0
  if (mask & AFL_ASE_VIRT)
16344
0
    fputs ("\n\tVZ ASE", file);
16345
0
  if (mask & AFL_ASE_MSA)
16346
0
    fputs ("\n\tMSA ASE", file);
16347
0
  if (mask & AFL_ASE_MIPS16)
16348
0
    fputs ("\n\tMIPS16 ASE", file);
16349
0
  if (mask & AFL_ASE_MICROMIPS)
16350
0
    fputs ("\n\tMICROMIPS ASE", file);
16351
0
  if (mask & AFL_ASE_XPA)
16352
0
    fputs ("\n\tXPA ASE", file);
16353
0
  if (mask & AFL_ASE_MIPS16E2)
16354
0
    fputs ("\n\tMIPS16e2 ASE", file);
16355
0
  if (mask & AFL_ASE_CRC)
16356
0
    fputs ("\n\tCRC ASE", file);
16357
0
  if (mask & AFL_ASE_GINV)
16358
0
    fputs ("\n\tGINV ASE", file);
16359
0
  if (mask & AFL_ASE_LOONGSON_MMI)
16360
0
    fputs ("\n\tLoongson MMI ASE", file);
16361
0
  if (mask & AFL_ASE_LOONGSON_CAM)
16362
0
    fputs ("\n\tLoongson CAM ASE", file);
16363
0
  if (mask & AFL_ASE_LOONGSON_EXT)
16364
0
    fputs ("\n\tLoongson EXT ASE", file);
16365
0
  if (mask & AFL_ASE_LOONGSON_EXT2)
16366
0
    fputs ("\n\tLoongson EXT2 ASE", file);
16367
0
  if (mask == 0)
16368
0
    fprintf (file, "\n\t%s", _("None"));
16369
0
  else if ((mask & ~AFL_ASE_MASK) != 0)
16370
0
    fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
16371
0
}
16372
16373
static void
16374
print_mips_isa_ext (FILE *file, unsigned int isa_ext)
16375
0
{
16376
0
  switch (isa_ext)
16377
0
    {
16378
0
    case 0:
16379
0
      fputs (_("None"), file);
16380
0
      break;
16381
0
    case AFL_EXT_XLR:
16382
0
      fputs ("RMI XLR", file);
16383
0
      break;
16384
0
    case AFL_EXT_OCTEON3:
16385
0
      fputs ("Cavium Networks Octeon3", file);
16386
0
      break;
16387
0
    case AFL_EXT_OCTEON2:
16388
0
      fputs ("Cavium Networks Octeon2", file);
16389
0
      break;
16390
0
    case AFL_EXT_OCTEONP:
16391
0
      fputs ("Cavium Networks OcteonP", file);
16392
0
      break;
16393
0
    case AFL_EXT_OCTEON:
16394
0
      fputs ("Cavium Networks Octeon", file);
16395
0
      break;
16396
0
    case AFL_EXT_5900:
16397
0
      fputs ("Toshiba R5900", file);
16398
0
      break;
16399
0
    case AFL_EXT_4650:
16400
0
      fputs ("MIPS R4650", file);
16401
0
      break;
16402
0
    case AFL_EXT_4010:
16403
0
      fputs ("LSI R4010", file);
16404
0
      break;
16405
0
    case AFL_EXT_4100:
16406
0
      fputs ("NEC VR4100", file);
16407
0
      break;
16408
0
    case AFL_EXT_3900:
16409
0
      fputs ("Toshiba R3900", file);
16410
0
      break;
16411
0
    case AFL_EXT_10000:
16412
0
      fputs ("MIPS R10000", file);
16413
0
      break;
16414
0
    case AFL_EXT_SB1:
16415
0
      fputs ("Broadcom SB-1", file);
16416
0
      break;
16417
0
    case AFL_EXT_4111:
16418
0
      fputs ("NEC VR4111/VR4181", file);
16419
0
      break;
16420
0
    case AFL_EXT_4120:
16421
0
      fputs ("NEC VR4120", file);
16422
0
      break;
16423
0
    case AFL_EXT_5400:
16424
0
      fputs ("NEC VR5400", file);
16425
0
      break;
16426
0
    case AFL_EXT_5500:
16427
0
      fputs ("NEC VR5500", file);
16428
0
      break;
16429
0
    case AFL_EXT_LOONGSON_2E:
16430
0
      fputs ("ST Microelectronics Loongson 2E", file);
16431
0
      break;
16432
0
    case AFL_EXT_LOONGSON_2F:
16433
0
      fputs ("ST Microelectronics Loongson 2F", file);
16434
0
      break;
16435
0
    case AFL_EXT_INTERAPTIV_MR2:
16436
0
      fputs ("Imagination interAptiv MR2", file);
16437
0
      break;
16438
0
    default:
16439
0
      fprintf (file, "%s (%d)", _("Unknown"), isa_ext);
16440
0
      break;
16441
0
    }
16442
0
}
16443
16444
static void
16445
print_mips_fp_abi_value (FILE *file, int val)
16446
0
{
16447
0
  switch (val)
16448
0
    {
16449
0
    case Val_GNU_MIPS_ABI_FP_ANY:
16450
0
      fprintf (file, _("Hard or soft float\n"));
16451
0
      break;
16452
0
    case Val_GNU_MIPS_ABI_FP_DOUBLE:
16453
0
      fprintf (file, _("Hard float (double precision)\n"));
16454
0
      break;
16455
0
    case Val_GNU_MIPS_ABI_FP_SINGLE:
16456
0
      fprintf (file, _("Hard float (single precision)\n"));
16457
0
      break;
16458
0
    case Val_GNU_MIPS_ABI_FP_SOFT:
16459
0
      fprintf (file, _("Soft float\n"));
16460
0
      break;
16461
0
    case Val_GNU_MIPS_ABI_FP_OLD_64:
16462
0
      fprintf (file, _("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
16463
0
      break;
16464
0
    case Val_GNU_MIPS_ABI_FP_XX:
16465
0
      fprintf (file, _("Hard float (32-bit CPU, Any FPU)\n"));
16466
0
      break;
16467
0
    case Val_GNU_MIPS_ABI_FP_64:
16468
0
      fprintf (file, _("Hard float (32-bit CPU, 64-bit FPU)\n"));
16469
0
      break;
16470
0
    case Val_GNU_MIPS_ABI_FP_64A:
16471
0
      fprintf (file, _("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
16472
0
      break;
16473
0
    default:
16474
0
      fprintf (file, "??? (%d)\n", val);
16475
0
      break;
16476
0
    }
16477
0
}
16478
16479
static int
16480
get_mips_reg_size (int reg_size)
16481
0
{
16482
0
  return (reg_size == AFL_REG_NONE) ? 0
16483
0
   : (reg_size == AFL_REG_32) ? 32
16484
0
   : (reg_size == AFL_REG_64) ? 64
16485
0
   : (reg_size == AFL_REG_128) ? 128
16486
0
   : -1;
16487
0
}
16488
16489
bool
16490
_bfd_mips_elf_print_private_bfd_data (bfd *abfd, void *ptr)
16491
320
{
16492
320
  FILE *file = ptr;
16493
16494
320
  BFD_ASSERT (abfd != NULL && ptr != NULL);
16495
16496
  /* Print normal ELF private data.  */
16497
320
  _bfd_elf_print_private_bfd_data (abfd, ptr);
16498
16499
  /* xgettext:c-format */
16500
320
  fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
16501
16502
320
  if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == EF_MIPS_ABI_O32)
16503
5
    fprintf (file, _(" [abi=O32]"));
16504
315
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == EF_MIPS_ABI_O64)
16505
1
    fprintf (file, _(" [abi=O64]"));
16506
314
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == EF_MIPS_ABI_EABI32)
16507
0
    fprintf (file, _(" [abi=EABI32]"));
16508
314
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == EF_MIPS_ABI_EABI64)
16509
0
    fprintf (file, _(" [abi=EABI64]"));
16510
314
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI))
16511
154
    fprintf (file, _(" [abi unknown]"));
16512
160
  else if (ABI_N32_P (abfd))
16513
43
    fprintf (file, _(" [abi=N32]"));
16514
117
  else if (ABI_64_P (abfd))
16515
58
    fprintf (file, _(" [abi=64]"));
16516
59
  else
16517
59
    fprintf (file, _(" [no abi set]"));
16518
16519
320
  if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_1)
16520
108
    fprintf (file, " [mips1]");
16521
212
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_2)
16522
0
    fprintf (file, " [mips2]");
16523
212
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_3)
16524
9
    fprintf (file, " [mips3]");
16525
203
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_4)
16526
0
    fprintf (file, " [mips4]");
16527
203
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_5)
16528
2
    fprintf (file, " [mips5]");
16529
201
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32)
16530
9
    fprintf (file, " [mips32]");
16531
192
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_64)
16532
5
    fprintf (file, " [mips64]");
16533
187
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32R2)
16534
72
    fprintf (file, " [mips32r2]");
16535
115
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_64R2)
16536
0
    fprintf (file, " [mips64r2]");
16537
115
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_32R6)
16538
69
    fprintf (file, " [mips32r6]");
16539
46
  else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == EF_MIPS_ARCH_64R6)
16540
35
    fprintf (file, " [mips64r6]");
16541
11
  else
16542
11
    fprintf (file, _(" [unknown ISA]"));
16543
16544
320
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
16545
104
    fprintf (file, " [mdmx]");
16546
16547
320
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
16548
52
    fprintf (file, " [mips16]");
16549
16550
320
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
16551
174
    fprintf (file, " [micromips]");
16552
16553
320
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_NAN2008)
16554
156
    fprintf (file, " [nan2008]");
16555
16556
320
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_FP64)
16557
159
    fprintf (file, " [old fp64]");
16558
16559
320
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_32BITMODE)
16560
150
    fprintf (file, " [32bitmode]");
16561
170
  else
16562
170
    fprintf (file, _(" [not 32bitmode]"));
16563
16564
320
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_NOREORDER)
16565
191
    fprintf (file, " [noreorder]");
16566
16567
320
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_PIC)
16568
20
    fprintf (file, " [PIC]");
16569
16570
320
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_CPIC)
16571
198
    fprintf (file, " [CPIC]");
16572
16573
320
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_XGOT)
16574
28
    fprintf (file, " [XGOT]");
16575
16576
320
  if (elf_elfheader (abfd)->e_flags & EF_MIPS_UCODE)
16577
191
    fprintf (file, " [UCODE]");
16578
16579
320
  fputc ('\n', file);
16580
16581
320
  if (mips_elf_tdata (abfd)->abiflags_valid)
16582
0
    {
16583
0
      Elf_Internal_ABIFlags_v0 *abiflags = &mips_elf_tdata (abfd)->abiflags;
16584
0
      fprintf (file, "\nMIPS ABI Flags Version: %d\n", abiflags->version);
16585
0
      fprintf (file, "\nISA: MIPS%d", abiflags->isa_level);
16586
0
      if (abiflags->isa_rev > 1)
16587
0
  fprintf (file, "r%d", abiflags->isa_rev);
16588
0
      fprintf (file, "\nGPR size: %d",
16589
0
         get_mips_reg_size (abiflags->gpr_size));
16590
0
      fprintf (file, "\nCPR1 size: %d",
16591
0
         get_mips_reg_size (abiflags->cpr1_size));
16592
0
      fprintf (file, "\nCPR2 size: %d",
16593
0
         get_mips_reg_size (abiflags->cpr2_size));
16594
0
      fputs ("\nFP ABI: ", file);
16595
0
      print_mips_fp_abi_value (file, abiflags->fp_abi);
16596
0
      fputs ("ISA Extension: ", file);
16597
0
      print_mips_isa_ext (file, abiflags->isa_ext);
16598
0
      fputs ("\nASEs:", file);
16599
0
      print_mips_ases (file, abiflags->ases);
16600
0
      fprintf (file, "\nFLAGS 1: %8.8lx", abiflags->flags1);
16601
0
      fprintf (file, "\nFLAGS 2: %8.8lx", abiflags->flags2);
16602
0
      fputc ('\n', file);
16603
0
    }
16604
16605
320
  return true;
16606
320
}
16607
16608
const struct bfd_elf_special_section _bfd_mips_elf_special_sections[] =
16609
{
16610
  { STRING_COMMA_LEN (".lit4"),   0, SHT_PROGBITS,   SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16611
  { STRING_COMMA_LEN (".lit8"),   0, SHT_PROGBITS,   SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16612
  { STRING_COMMA_LEN (".mdebug"), 0, SHT_MIPS_DEBUG, 0 },
16613
  { STRING_COMMA_LEN (".sbss"),  -2, SHT_NOBITS,     SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16614
  { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS,   SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16615
  { STRING_COMMA_LEN (".ucode"),  0, SHT_MIPS_UCODE, 0 },
16616
  { STRING_COMMA_LEN (".MIPS.xhash"),  0, SHT_MIPS_XHASH,   SHF_ALLOC },
16617
  { NULL,         0,  0, 0,        0 }
16618
};
16619
16620
/* Merge non visibility st_other attributes.  Ensure that the
16621
   STO_OPTIONAL flag is copied into h->other, even if this is not a
16622
   definiton of the symbol.  */
16623
void
16624
_bfd_mips_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
16625
              unsigned int st_other,
16626
              bool definition,
16627
              bool dynamic ATTRIBUTE_UNUSED)
16628
0
{
16629
0
  if ((st_other & ~ELF_ST_VISIBILITY (-1)) != 0)
16630
0
    {
16631
0
      unsigned char other;
16632
16633
0
      other = (definition ? st_other : h->other);
16634
0
      other &= ~ELF_ST_VISIBILITY (-1);
16635
0
      h->other = other | ELF_ST_VISIBILITY (h->other);
16636
0
    }
16637
16638
0
  if (!definition
16639
0
      && ELF_MIPS_IS_OPTIONAL (st_other))
16640
0
    h->other |= STO_OPTIONAL;
16641
0
}
16642
16643
/* Decide whether an undefined symbol is special and can be ignored.
16644
   This is the case for OPTIONAL symbols on IRIX.  */
16645
bool
16646
_bfd_mips_elf_ignore_undef_symbol (struct elf_link_hash_entry *h)
16647
0
{
16648
0
  return ELF_MIPS_IS_OPTIONAL (h->other) != 0;
16649
0
}
16650
16651
bool
16652
_bfd_mips_elf_common_definition (Elf_Internal_Sym *sym)
16653
0
{
16654
0
  return (sym->st_shndx == SHN_COMMON
16655
0
    || sym->st_shndx == SHN_MIPS_ACOMMON
16656
0
    || sym->st_shndx == SHN_MIPS_SCOMMON);
16657
0
}
16658
16659
/* Return address for Ith PLT stub in section PLT, for relocation REL
16660
   or (bfd_vma) -1 if it should not be included.  */
16661
16662
bfd_vma
16663
_bfd_mips_elf_plt_sym_val (bfd_vma i, const asection *plt,
16664
         const arelent *rel ATTRIBUTE_UNUSED)
16665
0
{
16666
0
  return (plt->vma
16667
0
    + 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry)
16668
0
    + i * 4 * ARRAY_SIZE (mips_exec_plt_entry));
16669
0
}
16670
16671
/* Build a table of synthetic symbols to represent the PLT.  As with MIPS16
16672
   and microMIPS PLT slots we may have a many-to-one mapping between .plt
16673
   and .got.plt and also the slots may be of a different size each we walk
16674
   the PLT manually fetching instructions and matching them against known
16675
   patterns.  To make things easier standard MIPS slots, if any, always come
16676
   first.  As we don't create proper ELF symbols we use the UDATA.I member
16677
   of ASYMBOL to carry ISA annotation.  The encoding used is the same as
16678
   with the ST_OTHER member of the ELF symbol.  */
16679
16680
long
16681
_bfd_mips_elf_get_synthetic_symtab (bfd *abfd,
16682
            long symcount ATTRIBUTE_UNUSED,
16683
            asymbol **syms ATTRIBUTE_UNUSED,
16684
            long dynsymcount, asymbol **dynsyms,
16685
            asymbol **ret)
16686
48
{
16687
48
  static const char pltname[] = "_PROCEDURE_LINKAGE_TABLE_";
16688
48
  static const char microsuffix[] = "@micromipsplt";
16689
48
  static const char m16suffix[] = "@mips16plt";
16690
48
  static const char mipssuffix[] = "@plt";
16691
16692
48
  bool (*slurp_relocs) (bfd *, asection *, asymbol **, bool);
16693
48
  elf_backend_data *bed = get_elf_backend_data (abfd);
16694
48
  bool micromips_p = MICROMIPS_P (abfd);
16695
48
  Elf_Internal_Shdr *hdr;
16696
48
  bfd_byte *plt_data;
16697
48
  bfd_vma plt_offset;
16698
48
  unsigned int other;
16699
48
  bfd_vma entry_size;
16700
48
  bfd_vma plt0_size;
16701
48
  asection *relplt;
16702
48
  bfd_vma opcode;
16703
48
  asection *plt;
16704
48
  asymbol *send;
16705
48
  size_t size;
16706
48
  char *names;
16707
48
  long counti;
16708
48
  arelent *p;
16709
48
  asymbol *s;
16710
48
  char *nend;
16711
48
  long count;
16712
48
  long pi;
16713
48
  long i;
16714
48
  long n;
16715
16716
48
  *ret = NULL;
16717
16718
48
  if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0 || dynsymcount <= 0)
16719
48
    return 0;
16720
16721
0
  relplt = bfd_get_section_by_name (abfd, ".rel.plt");
16722
0
  if (relplt == NULL)
16723
0
    return 0;
16724
16725
0
  hdr = &elf_section_data (relplt)->this_hdr;
16726
0
  if (hdr->sh_link != elf_dynsymtab (abfd) || hdr->sh_type != SHT_REL)
16727
0
    return 0;
16728
16729
0
  plt = bfd_get_section_by_name (abfd, ".plt");
16730
0
  if (plt == NULL || (plt->flags & SEC_HAS_CONTENTS) == 0)
16731
0
    return 0;
16732
16733
0
  slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
16734
0
  if (!(*slurp_relocs) (abfd, relplt, dynsyms, true))
16735
0
    return -1;
16736
0
  p = relplt->relocation;
16737
16738
  /* Calculating the exact amount of space required for symbols would
16739
     require two passes over the PLT, so just pessimise assuming two
16740
     PLT slots per relocation.  */
16741
0
  count = NUM_SHDR_ENTRIES (hdr);
16742
0
  counti = count * bed->s->int_rels_per_ext_rel;
16743
0
  size = 2 * count * sizeof (asymbol);
16744
0
  size += count * (sizeof (mipssuffix) +
16745
0
       (micromips_p ? sizeof (microsuffix) : sizeof (m16suffix)));
16746
0
  for (pi = 0; pi < counti; pi += bed->s->int_rels_per_ext_rel)
16747
0
    size += 2 * strlen ((*p[pi].sym_ptr_ptr)->name);
16748
16749
  /* Add the size of "_PROCEDURE_LINKAGE_TABLE_" too.  */
16750
0
  size += sizeof (asymbol) + sizeof (pltname);
16751
16752
0
  if (!bfd_malloc_and_get_section (abfd, plt, &plt_data))
16753
0
    return -1;
16754
16755
0
  if (plt->size < 16)
16756
0
    return -1;
16757
16758
0
  s = *ret = bfd_malloc (size);
16759
0
  if (s == NULL)
16760
0
    return -1;
16761
0
  send = s + 2 * count + 1;
16762
16763
0
  names = (char *) send;
16764
0
  nend = (char *) s + size;
16765
0
  n = 0;
16766
16767
0
  opcode = bfd_get_micromips_32 (abfd, plt_data + 12);
16768
0
  if (opcode == 0x3302fffe)
16769
0
    {
16770
0
      if (!micromips_p)
16771
0
  return -1;
16772
0
      plt0_size = 2 * ARRAY_SIZE (micromips_o32_exec_plt0_entry);
16773
0
      other = STO_MICROMIPS;
16774
0
    }
16775
0
  else if (opcode == 0x0398c1d0)
16776
0
    {
16777
0
      if (!micromips_p)
16778
0
  return -1;
16779
0
      plt0_size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry);
16780
0
      other = STO_MICROMIPS;
16781
0
    }
16782
0
  else
16783
0
    {
16784
0
      plt0_size = 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry);
16785
0
      other = 0;
16786
0
    }
16787
16788
0
  s->the_bfd = abfd;
16789
0
  s->flags = BSF_SYNTHETIC | BSF_FUNCTION | BSF_LOCAL;
16790
0
  s->section = plt;
16791
0
  s->value = 0;
16792
0
  s->name = names;
16793
0
  s->udata.i = other;
16794
0
  memcpy (names, pltname, sizeof (pltname));
16795
0
  names += sizeof (pltname);
16796
0
  ++s, ++n;
16797
16798
0
  pi = 0;
16799
0
  for (plt_offset = plt0_size;
16800
0
       plt_offset + 8 <= plt->size && s < send;
16801
0
       plt_offset += entry_size)
16802
0
    {
16803
0
      bfd_vma gotplt_addr;
16804
0
      const char *suffix;
16805
0
      bfd_vma gotplt_hi;
16806
0
      bfd_vma gotplt_lo;
16807
0
      size_t suffixlen;
16808
16809
0
      opcode = bfd_get_micromips_32 (abfd, plt_data + plt_offset + 4);
16810
16811
      /* Check if the second word matches the expected MIPS16 instruction.  */
16812
0
      if (opcode == 0x651aeb00)
16813
0
  {
16814
0
    if (micromips_p)
16815
0
      return -1;
16816
    /* Truncated table???  */
16817
0
    if (plt_offset + 16 > plt->size)
16818
0
      break;
16819
0
    gotplt_addr = bfd_get_32 (abfd, plt_data + plt_offset + 12);
16820
0
    entry_size = 2 * ARRAY_SIZE (mips16_o32_exec_plt_entry);
16821
0
    suffixlen = sizeof (m16suffix);
16822
0
    suffix = m16suffix;
16823
0
    other = STO_MIPS16;
16824
0
  }
16825
      /* Likewise the expected microMIPS instruction (no insn32 mode).  */
16826
0
      else if (opcode == 0xff220000)
16827
0
  {
16828
0
    if (!micromips_p)
16829
0
      return -1;
16830
0
    gotplt_hi = bfd_get_16 (abfd, plt_data + plt_offset) & 0x7f;
16831
0
    gotplt_lo = bfd_get_16 (abfd, plt_data + plt_offset + 2) & 0xffff;
16832
0
    gotplt_hi = ((gotplt_hi ^ 0x40) - 0x40) << 18;
16833
0
    gotplt_lo <<= 2;
16834
0
    gotplt_addr = gotplt_hi + gotplt_lo;
16835
0
    gotplt_addr += ((plt->vma + plt_offset) | 3) ^ 3;
16836
0
    entry_size = 2 * ARRAY_SIZE (micromips_o32_exec_plt_entry);
16837
0
    suffixlen = sizeof (microsuffix);
16838
0
    suffix = microsuffix;
16839
0
    other = STO_MICROMIPS;
16840
0
  }
16841
      /* Likewise the expected microMIPS instruction (insn32 mode).  */
16842
0
      else if ((opcode & 0xffff0000) == 0xff2f0000)
16843
0
  {
16844
0
    gotplt_hi = bfd_get_16 (abfd, plt_data + plt_offset + 2) & 0xffff;
16845
0
    gotplt_lo = bfd_get_16 (abfd, plt_data + plt_offset + 6) & 0xffff;
16846
0
    gotplt_hi = ((gotplt_hi ^ 0x8000) - 0x8000) << 16;
16847
0
    gotplt_lo = (gotplt_lo ^ 0x8000) - 0x8000;
16848
0
    gotplt_addr = gotplt_hi + gotplt_lo;
16849
0
    entry_size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt_entry);
16850
0
    suffixlen = sizeof (microsuffix);
16851
0
    suffix = microsuffix;
16852
0
    other = STO_MICROMIPS;
16853
0
  }
16854
      /* Otherwise assume standard MIPS code.  */
16855
0
      else
16856
0
  {
16857
0
    gotplt_hi = bfd_get_32 (abfd, plt_data + plt_offset) & 0xffff;
16858
0
    gotplt_lo = bfd_get_32 (abfd, plt_data + plt_offset + 4) & 0xffff;
16859
0
    gotplt_hi = ((gotplt_hi ^ 0x8000) - 0x8000) << 16;
16860
0
    gotplt_lo = (gotplt_lo ^ 0x8000) - 0x8000;
16861
0
    gotplt_addr = gotplt_hi + gotplt_lo;
16862
0
    entry_size = 4 * ARRAY_SIZE (mips_exec_plt_entry);
16863
0
    suffixlen = sizeof (mipssuffix);
16864
0
    suffix = mipssuffix;
16865
0
    other = 0;
16866
0
  }
16867
      /* Truncated table???  */
16868
0
      if (plt_offset + entry_size > plt->size)
16869
0
  break;
16870
16871
0
      for (i = 0;
16872
0
     i < count && p[pi].address != gotplt_addr;
16873
0
     i++, pi = (pi + bed->s->int_rels_per_ext_rel) % counti);
16874
16875
0
      if (i < count)
16876
0
  {
16877
0
    size_t namelen;
16878
0
    size_t len;
16879
16880
0
    *s = **p[pi].sym_ptr_ptr;
16881
    /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set.  Since
16882
       we are defining a symbol, ensure one of them is set.  */
16883
0
    if ((s->flags & BSF_LOCAL) == 0)
16884
0
      s->flags |= BSF_GLOBAL;
16885
0
    s->flags |= BSF_SYNTHETIC;
16886
0
    s->section = plt;
16887
0
    s->value = plt_offset;
16888
0
    s->name = names;
16889
0
    s->udata.i = other;
16890
16891
0
    len = strlen ((*p[pi].sym_ptr_ptr)->name);
16892
0
    namelen = len + suffixlen;
16893
0
    if (names + namelen > nend)
16894
0
      break;
16895
16896
0
    memcpy (names, (*p[pi].sym_ptr_ptr)->name, len);
16897
0
    names += len;
16898
0
    memcpy (names, suffix, suffixlen);
16899
0
    names += suffixlen;
16900
16901
0
    ++s, ++n;
16902
0
    pi = (pi + bed->s->int_rels_per_ext_rel) % counti;
16903
0
  }
16904
0
    }
16905
16906
0
  free (plt_data);
16907
16908
0
  return n;
16909
0
}
16910
16911
/* Return the ABI flags associated with ABFD if available.  */
16912
16913
Elf_Internal_ABIFlags_v0 *
16914
bfd_mips_elf_get_abiflags (bfd *abfd)
16915
474k
{
16916
474k
  struct mips_elf_obj_tdata *tdata = mips_elf_tdata (abfd);
16917
16918
474k
  return tdata->abiflags_valid ? &tdata->abiflags : NULL;
16919
474k
}
16920
16921
/* MIPS libc ABI versions, used with the EI_ABIVERSION ELF file header
16922
   field.  Taken from `libc-abis.h' generated at GNU libc build time.
16923
   Using a MIPS_ prefix as other libc targets use different values.  */
16924
enum
16925
{
16926
  MIPS_LIBC_ABI_DEFAULT = 0,
16927
  MIPS_LIBC_ABI_MIPS_PLT,
16928
  MIPS_LIBC_ABI_UNIQUE,
16929
  MIPS_LIBC_ABI_MIPS_O32_FP64,
16930
  MIPS_LIBC_ABI_ABSOLUTE,
16931
  MIPS_LIBC_ABI_XHASH,
16932
  MIPS_LIBC_ABI_MAX
16933
};
16934
16935
bool
16936
_bfd_mips_init_file_header (bfd *abfd, struct bfd_link_info *link_info)
16937
22
{
16938
22
  struct mips_elf_link_hash_table *htab = NULL;
16939
22
  Elf_Internal_Ehdr *i_ehdrp;
16940
16941
22
  if (!_bfd_elf_init_file_header (abfd, link_info))
16942
0
    return false;
16943
16944
22
  i_ehdrp = elf_elfheader (abfd);
16945
22
  if (link_info)
16946
0
    {
16947
0
      htab = mips_elf_hash_table (link_info);
16948
0
      BFD_ASSERT (htab != NULL);
16949
0
    }
16950
16951
22
  if (htab != NULL
16952
0
      && htab->use_plts_and_copy_relocs
16953
0
      && htab->root.target_os != is_vxworks)
16954
0
    i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_MIPS_PLT;
16955
16956
22
  if (mips_elf_tdata (abfd)->abiflags.fp_abi == Val_GNU_MIPS_ABI_FP_64
16957
22
      || mips_elf_tdata (abfd)->abiflags.fp_abi == Val_GNU_MIPS_ABI_FP_64A)
16958
0
    i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_MIPS_O32_FP64;
16959
16960
  /* Mark that we need support for absolute symbols in the dynamic loader.  */
16961
22
  if (htab != NULL && htab->use_absolute_zero && htab->gnu_target)
16962
0
    i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_ABSOLUTE;
16963
16964
  /* Mark that we need support for .MIPS.xhash in the dynamic linker,
16965
     if it is the only hash section that will be created.  */
16966
22
  if (link_info && link_info->emit_gnu_hash && !link_info->emit_hash)
16967
0
    i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_XHASH;
16968
22
  return true;
16969
22
}
16970
16971
int
16972
_bfd_mips_elf_compact_eh_encoding
16973
  (struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
16974
0
{
16975
0
  return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
16976
0
}
16977
16978
/* Return the opcode for can't unwind.  */
16979
16980
int
16981
_bfd_mips_elf_cant_unwind_opcode
16982
  (struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
16983
0
{
16984
0
  return COMPACT_EH_CANT_UNWIND_OPCODE;
16985
0
}
16986
16987
/* Record a position XLAT_LOC in the xlat translation table, associated with
16988
   the hash entry H.  The entry in the translation table will later be
16989
   populated with the real symbol dynindx.  */
16990
16991
void
16992
_bfd_mips_elf_record_xhash_symbol (struct elf_link_hash_entry *h,
16993
           bfd_vma xlat_loc)
16994
0
{
16995
0
  struct mips_elf_link_hash_entry *hmips;
16996
16997
0
  hmips = (struct mips_elf_link_hash_entry *) h;
16998
0
  hmips->mipsxhash_loc = xlat_loc;
16999
0
}