Remove syntactic sugar
[deliverable/binutils-gdb.git] / bfd / elfxx-mips.c
CommitLineData
b49e97c9 1/* MIPS-specific support for ELF
6f2750fe 2 Copyright (C) 1993-2016 Free Software Foundation, Inc.
b49e97c9
TS
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
ae9a127f 11 This file is part of BFD, the Binary File Descriptor library.
b49e97c9 12
ae9a127f
NC
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
cd123cb7 15 the Free Software Foundation; either version 3 of the License, or
ae9a127f 16 (at your option) any later version.
b49e97c9 17
ae9a127f
NC
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.
b49e97c9 22
ae9a127f
NC
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
cd123cb7
NC
25 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
26 MA 02110-1301, USA. */
27
b49e97c9
TS
28
29/* This file handles functionality common to the different MIPS ABI's. */
30
b49e97c9 31#include "sysdep.h"
3db64b00 32#include "bfd.h"
b49e97c9 33#include "libbfd.h"
64543e1a 34#include "libiberty.h"
b49e97c9
TS
35#include "elf-bfd.h"
36#include "elfxx-mips.h"
37#include "elf/mips.h"
0a44bf69 38#include "elf-vxworks.h"
2f0c68f2 39#include "dwarf2.h"
b49e97c9
TS
40
41/* Get the ECOFF swapping routines. */
42#include "coff/sym.h"
43#include "coff/symconst.h"
44#include "coff/ecoff.h"
45#include "coff/mips.h"
46
b15e6682
AO
47#include "hashtab.h"
48
9ab066b4
RS
49/* Types of TLS GOT entry. */
50enum mips_got_tls_type {
51 GOT_TLS_NONE,
52 GOT_TLS_GD,
53 GOT_TLS_LDM,
54 GOT_TLS_IE
55};
56
ead49a57 57/* This structure is used to hold information about one GOT entry.
3dff0dd1
RS
58 There are four types of entry:
59
60 (1) an absolute address
61 requires: abfd == NULL
62 fields: d.address
63
64 (2) a SYMBOL + OFFSET address, where SYMBOL is local to an input bfd
65 requires: abfd != NULL, symndx >= 0, tls_type != GOT_TLS_LDM
66 fields: abfd, symndx, d.addend, tls_type
67
68 (3) a SYMBOL address, where SYMBOL is not local to an input bfd
69 requires: abfd != NULL, symndx == -1
70 fields: d.h, tls_type
71
72 (4) a TLS LDM slot
73 requires: abfd != NULL, symndx == 0, tls_type == GOT_TLS_LDM
74 fields: none; there's only one of these per GOT. */
b15e6682
AO
75struct mips_got_entry
76{
3dff0dd1 77 /* One input bfd that needs the GOT entry. */
b15e6682 78 bfd *abfd;
f4416af6
AO
79 /* The index of the symbol, as stored in the relocation r_info, if
80 we have a local symbol; -1 otherwise. */
81 long symndx;
82 union
83 {
84 /* If abfd == NULL, an address that must be stored in the got. */
85 bfd_vma address;
86 /* If abfd != NULL && symndx != -1, the addend of the relocation
87 that should be added to the symbol value. */
88 bfd_vma addend;
89 /* If abfd != NULL && symndx == -1, the hash table entry
3dff0dd1 90 corresponding to a symbol in the GOT. The symbol's entry
020d7251
RS
91 is in the local area if h->global_got_area is GGA_NONE,
92 otherwise it is in the global area. */
f4416af6
AO
93 struct mips_elf_link_hash_entry *h;
94 } d;
0f20cc35 95
9ab066b4
RS
96 /* The TLS type of this GOT entry. An LDM GOT entry will be a local
97 symbol entry with r_symndx == 0. */
0f20cc35
DJ
98 unsigned char tls_type;
99
9ab066b4
RS
100 /* True if we have filled in the GOT contents for a TLS entry,
101 and created the associated relocations. */
102 unsigned char tls_initialized;
103
b15e6682 104 /* The offset from the beginning of the .got section to the entry
f4416af6
AO
105 corresponding to this symbol+addend. If it's a global symbol
106 whose offset is yet to be decided, it's going to be -1. */
107 long gotidx;
b15e6682
AO
108};
109
13db6b44
RS
110/* This structure represents a GOT page reference from an input bfd.
111 Each instance represents a symbol + ADDEND, where the representation
112 of the symbol depends on whether it is local to the input bfd.
113 If it is, then SYMNDX >= 0, and the symbol has index SYMNDX in U.ABFD.
114 Otherwise, SYMNDX < 0 and U.H points to the symbol's hash table entry.
115
116 Page references with SYMNDX >= 0 always become page references
117 in the output. Page references with SYMNDX < 0 only become page
118 references if the symbol binds locally; in other cases, the page
119 reference decays to a global GOT reference. */
120struct mips_got_page_ref
121{
122 long symndx;
123 union
124 {
125 struct mips_elf_link_hash_entry *h;
126 bfd *abfd;
127 } u;
128 bfd_vma addend;
129};
130
c224138d
RS
131/* This structure describes a range of addends: [MIN_ADDEND, MAX_ADDEND].
132 The structures form a non-overlapping list that is sorted by increasing
133 MIN_ADDEND. */
134struct mips_got_page_range
135{
136 struct mips_got_page_range *next;
137 bfd_signed_vma min_addend;
138 bfd_signed_vma max_addend;
139};
140
141/* This structure describes the range of addends that are applied to page
13db6b44 142 relocations against a given section. */
c224138d
RS
143struct mips_got_page_entry
144{
13db6b44
RS
145 /* The section that these entries are based on. */
146 asection *sec;
c224138d
RS
147 /* The ranges for this page entry. */
148 struct mips_got_page_range *ranges;
149 /* The maximum number of page entries needed for RANGES. */
150 bfd_vma num_pages;
151};
152
f0abc2a1 153/* This structure is used to hold .got information when linking. */
b49e97c9
TS
154
155struct mips_got_info
156{
b49e97c9
TS
157 /* The number of global .got entries. */
158 unsigned int global_gotno;
23cc69b6
RS
159 /* The number of global .got entries that are in the GGA_RELOC_ONLY area. */
160 unsigned int reloc_only_gotno;
0f20cc35
DJ
161 /* The number of .got slots used for TLS. */
162 unsigned int tls_gotno;
163 /* The first unused TLS .got entry. Used only during
164 mips_elf_initialize_tls_index. */
165 unsigned int tls_assigned_gotno;
c224138d 166 /* The number of local .got entries, eventually including page entries. */
b49e97c9 167 unsigned int local_gotno;
c224138d
RS
168 /* The maximum number of page entries needed. */
169 unsigned int page_gotno;
ab361d49
RS
170 /* The number of relocations needed for the GOT entries. */
171 unsigned int relocs;
cb22ccf4
KCY
172 /* The first unused local .got entry. */
173 unsigned int assigned_low_gotno;
174 /* The last unused local .got entry. */
175 unsigned int assigned_high_gotno;
b15e6682
AO
176 /* A hash table holding members of the got. */
177 struct htab *got_entries;
13db6b44
RS
178 /* A hash table holding mips_got_page_ref structures. */
179 struct htab *got_page_refs;
c224138d
RS
180 /* A hash table of mips_got_page_entry structures. */
181 struct htab *got_page_entries;
f4416af6
AO
182 /* In multi-got links, a pointer to the next got (err, rather, most
183 of the time, it points to the previous got). */
184 struct mips_got_info *next;
185};
186
d7206569 187/* Structure passed when merging bfds' gots. */
f4416af6
AO
188
189struct mips_elf_got_per_bfd_arg
190{
f4416af6
AO
191 /* The output bfd. */
192 bfd *obfd;
193 /* The link information. */
194 struct bfd_link_info *info;
195 /* A pointer to the primary got, i.e., the one that's going to get
196 the implicit relocations from DT_MIPS_LOCAL_GOTNO and
197 DT_MIPS_GOTSYM. */
198 struct mips_got_info *primary;
199 /* A non-primary got we're trying to merge with other input bfd's
200 gots. */
201 struct mips_got_info *current;
202 /* The maximum number of got entries that can be addressed with a
203 16-bit offset. */
204 unsigned int max_count;
c224138d
RS
205 /* The maximum number of page entries needed by each got. */
206 unsigned int max_pages;
0f20cc35
DJ
207 /* The total number of global entries which will live in the
208 primary got and be automatically relocated. This includes
209 those not referenced by the primary GOT but included in
210 the "master" GOT. */
211 unsigned int global_count;
f4416af6
AO
212};
213
ab361d49
RS
214/* A structure used to pass information to htab_traverse callbacks
215 when laying out the GOT. */
f4416af6 216
ab361d49 217struct mips_elf_traverse_got_arg
f4416af6 218{
ab361d49 219 struct bfd_link_info *info;
f4416af6
AO
220 struct mips_got_info *g;
221 int value;
0f20cc35
DJ
222};
223
f0abc2a1
AM
224struct _mips_elf_section_data
225{
226 struct bfd_elf_section_data elf;
227 union
228 {
f0abc2a1
AM
229 bfd_byte *tdata;
230 } u;
231};
232
233#define mips_elf_section_data(sec) \
68bfbfcc 234 ((struct _mips_elf_section_data *) elf_section_data (sec))
f0abc2a1 235
d5eaccd7
RS
236#define is_mips_elf(bfd) \
237 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
238 && elf_tdata (bfd) != NULL \
4dfe6ac6 239 && elf_object_id (bfd) == MIPS_ELF_DATA)
d5eaccd7 240
634835ae
RS
241/* The ABI says that every symbol used by dynamic relocations must have
242 a global GOT entry. Among other things, this provides the dynamic
243 linker with a free, directly-indexed cache. The GOT can therefore
244 contain symbols that are not referenced by GOT relocations themselves
245 (in other words, it may have symbols that are not referenced by things
246 like R_MIPS_GOT16 and R_MIPS_GOT_PAGE).
247
248 GOT relocations are less likely to overflow if we put the associated
249 GOT entries towards the beginning. We therefore divide the global
250 GOT entries into two areas: "normal" and "reloc-only". Entries in
251 the first area can be used for both dynamic relocations and GP-relative
252 accesses, while those in the "reloc-only" area are for dynamic
253 relocations only.
254
255 These GGA_* ("Global GOT Area") values are organised so that lower
256 values are more general than higher values. Also, non-GGA_NONE
257 values are ordered by the position of the area in the GOT. */
258#define GGA_NORMAL 0
259#define GGA_RELOC_ONLY 1
260#define GGA_NONE 2
261
861fb55a
DJ
262/* Information about a non-PIC interface to a PIC function. There are
263 two ways of creating these interfaces. The first is to add:
264
265 lui $25,%hi(func)
266 addiu $25,$25,%lo(func)
267
268 immediately before a PIC function "func". The second is to add:
269
270 lui $25,%hi(func)
271 j func
272 addiu $25,$25,%lo(func)
273
274 to a separate trampoline section.
275
276 Stubs of the first kind go in a new section immediately before the
277 target function. Stubs of the second kind go in a single section
278 pointed to by the hash table's "strampoline" field. */
279struct mips_elf_la25_stub {
280 /* The generated section that contains this stub. */
281 asection *stub_section;
282
283 /* The offset of the stub from the start of STUB_SECTION. */
284 bfd_vma offset;
285
286 /* One symbol for the original function. Its location is available
287 in H->root.root.u.def. */
288 struct mips_elf_link_hash_entry *h;
289};
290
291/* Macros for populating a mips_elf_la25_stub. */
292
293#define LA25_LUI(VAL) (0x3c190000 | (VAL)) /* lui t9,VAL */
294#define LA25_J(VAL) (0x08000000 | (((VAL) >> 2) & 0x3ffffff)) /* j VAL */
295#define LA25_ADDIU(VAL) (0x27390000 | (VAL)) /* addiu t9,t9,VAL */
d21911ea
MR
296#define LA25_LUI_MICROMIPS(VAL) \
297 (0x41b90000 | (VAL)) /* lui t9,VAL */
298#define LA25_J_MICROMIPS(VAL) \
299 (0xd4000000 | (((VAL) >> 1) & 0x3ffffff)) /* j VAL */
300#define LA25_ADDIU_MICROMIPS(VAL) \
301 (0x33390000 | (VAL)) /* addiu t9,t9,VAL */
861fb55a 302
b49e97c9
TS
303/* This structure is passed to mips_elf_sort_hash_table_f when sorting
304 the dynamic symbols. */
305
306struct mips_elf_hash_sort_data
307{
308 /* The symbol in the global GOT with the lowest dynamic symbol table
309 index. */
310 struct elf_link_hash_entry *low;
0f20cc35
DJ
311 /* The least dynamic symbol table index corresponding to a non-TLS
312 symbol with a GOT entry. */
b49e97c9 313 long min_got_dynindx;
f4416af6
AO
314 /* The greatest dynamic symbol table index corresponding to a symbol
315 with a GOT entry that is not referenced (e.g., a dynamic symbol
9e4aeb93 316 with dynamic relocations pointing to it from non-primary GOTs). */
f4416af6 317 long max_unref_got_dynindx;
b49e97c9
TS
318 /* The greatest dynamic symbol table index not corresponding to a
319 symbol without a GOT entry. */
320 long max_non_got_dynindx;
321};
322
1bbce132
MR
323/* We make up to two PLT entries if needed, one for standard MIPS code
324 and one for compressed code, either a MIPS16 or microMIPS one. We
325 keep a separate record of traditional lazy-binding stubs, for easier
326 processing. */
327
328struct plt_entry
329{
330 /* Traditional SVR4 stub offset, or -1 if none. */
331 bfd_vma stub_offset;
332
333 /* Standard PLT entry offset, or -1 if none. */
334 bfd_vma mips_offset;
335
336 /* Compressed PLT entry offset, or -1 if none. */
337 bfd_vma comp_offset;
338
339 /* The corresponding .got.plt index, or -1 if none. */
340 bfd_vma gotplt_index;
341
342 /* Whether we need a standard PLT entry. */
343 unsigned int need_mips : 1;
344
345 /* Whether we need a compressed PLT entry. */
346 unsigned int need_comp : 1;
347};
348
b49e97c9
TS
349/* The MIPS ELF linker needs additional information for each symbol in
350 the global hash table. */
351
352struct mips_elf_link_hash_entry
353{
354 struct elf_link_hash_entry root;
355
356 /* External symbol information. */
357 EXTR esym;
358
861fb55a
DJ
359 /* The la25 stub we have created for ths symbol, if any. */
360 struct mips_elf_la25_stub *la25_stub;
361
b49e97c9
TS
362 /* Number of R_MIPS_32, R_MIPS_REL32, or R_MIPS_64 relocs against
363 this symbol. */
364 unsigned int possibly_dynamic_relocs;
365
b49e97c9
TS
366 /* If there is a stub that 32 bit functions should use to call this
367 16 bit function, this points to the section containing the stub. */
368 asection *fn_stub;
369
b49e97c9
TS
370 /* If there is a stub that 16 bit functions should use to call this
371 32 bit function, this points to the section containing the stub. */
372 asection *call_stub;
373
374 /* This is like the call_stub field, but it is used if the function
375 being called returns a floating point value. */
376 asection *call_fp_stub;
7c5fcef7 377
634835ae
RS
378 /* The highest GGA_* value that satisfies all references to this symbol. */
379 unsigned int global_got_area : 2;
380
6ccf4795
RS
381 /* True if all GOT relocations against this symbol are for calls. This is
382 a looser condition than no_fn_stub below, because there may be other
383 non-call non-GOT relocations against the symbol. */
384 unsigned int got_only_for_calls : 1;
385
71782a75
RS
386 /* True if one of the relocations described by possibly_dynamic_relocs
387 is against a readonly section. */
388 unsigned int readonly_reloc : 1;
389
861fb55a
DJ
390 /* True if there is a relocation against this symbol that must be
391 resolved by the static linker (in other words, if the relocation
392 cannot possibly be made dynamic). */
393 unsigned int has_static_relocs : 1;
394
71782a75
RS
395 /* True if we must not create a .MIPS.stubs entry for this symbol.
396 This is set, for example, if there are relocations related to
397 taking the function's address, i.e. any but R_MIPS_CALL*16 ones.
398 See "MIPS ABI Supplement, 3rd Edition", p. 4-20. */
399 unsigned int no_fn_stub : 1;
400
401 /* Whether we need the fn_stub; this is true if this symbol appears
402 in any relocs other than a 16 bit call. */
403 unsigned int need_fn_stub : 1;
404
861fb55a
DJ
405 /* True if this symbol is referenced by branch relocations from
406 any non-PIC input file. This is used to determine whether an
407 la25 stub is required. */
408 unsigned int has_nonpic_branches : 1;
33bb52fb
RS
409
410 /* Does this symbol need a traditional MIPS lazy-binding stub
411 (as opposed to a PLT entry)? */
412 unsigned int needs_lazy_stub : 1;
1bbce132
MR
413
414 /* Does this symbol resolve to a PLT entry? */
415 unsigned int use_plt_entry : 1;
b49e97c9
TS
416};
417
418/* MIPS ELF linker hash table. */
419
420struct mips_elf_link_hash_table
421{
422 struct elf_link_hash_table root;
861fb55a 423
b49e97c9
TS
424 /* The number of .rtproc entries. */
425 bfd_size_type procedure_count;
861fb55a 426
b49e97c9
TS
427 /* The size of the .compact_rel section (if SGI_COMPAT). */
428 bfd_size_type compact_rel_size;
861fb55a 429
e6aea42d
MR
430 /* This flag indicates that the value of DT_MIPS_RLD_MAP dynamic entry
431 is set to the address of __rld_obj_head as in IRIX5 and IRIX6. */
b34976b6 432 bfd_boolean use_rld_obj_head;
861fb55a 433
b4082c70
DD
434 /* The __rld_map or __rld_obj_head symbol. */
435 struct elf_link_hash_entry *rld_symbol;
861fb55a 436
b49e97c9 437 /* This is set if we see any mips16 stub sections. */
b34976b6 438 bfd_boolean mips16_stubs_seen;
861fb55a
DJ
439
440 /* True if we can generate copy relocs and PLTs. */
441 bfd_boolean use_plts_and_copy_relocs;
442
833794fc
MR
443 /* True if we can only use 32-bit microMIPS instructions. */
444 bfd_boolean insn32;
445
0a44bf69
RS
446 /* True if we're generating code for VxWorks. */
447 bfd_boolean is_vxworks;
861fb55a 448
0e53d9da
AN
449 /* True if we already reported the small-data section overflow. */
450 bfd_boolean small_data_overflow_reported;
861fb55a 451
0a44bf69
RS
452 /* Shortcuts to some dynamic sections, or NULL if they are not
453 being used. */
454 asection *srelbss;
455 asection *sdynbss;
456 asection *srelplt;
457 asection *srelplt2;
458 asection *sgotplt;
459 asection *splt;
4e41d0d7 460 asection *sstubs;
a8028dd0 461 asection *sgot;
861fb55a 462
a8028dd0
RS
463 /* The master GOT information. */
464 struct mips_got_info *got_info;
861fb55a 465
d222d210
RS
466 /* The global symbol in the GOT with the lowest index in the dynamic
467 symbol table. */
468 struct elf_link_hash_entry *global_gotsym;
469
861fb55a 470 /* The size of the PLT header in bytes. */
0a44bf69 471 bfd_vma plt_header_size;
861fb55a 472
1bbce132
MR
473 /* The size of a standard PLT entry in bytes. */
474 bfd_vma plt_mips_entry_size;
475
476 /* The size of a compressed PLT entry in bytes. */
477 bfd_vma plt_comp_entry_size;
478
479 /* The offset of the next standard PLT entry to create. */
480 bfd_vma plt_mips_offset;
481
482 /* The offset of the next compressed PLT entry to create. */
483 bfd_vma plt_comp_offset;
484
485 /* The index of the next .got.plt entry to create. */
486 bfd_vma plt_got_index;
861fb55a 487
33bb52fb
RS
488 /* The number of functions that need a lazy-binding stub. */
489 bfd_vma lazy_stub_count;
861fb55a 490
5108fc1b
RS
491 /* The size of a function stub entry in bytes. */
492 bfd_vma function_stub_size;
861fb55a
DJ
493
494 /* The number of reserved entries at the beginning of the GOT. */
495 unsigned int reserved_gotno;
496
497 /* The section used for mips_elf_la25_stub trampolines.
498 See the comment above that structure for details. */
499 asection *strampoline;
500
501 /* A table of mips_elf_la25_stubs, indexed by (input_section, offset)
502 pairs. */
503 htab_t la25_stubs;
504
505 /* A function FN (NAME, IS, OS) that creates a new input section
506 called NAME and links it to output section OS. If IS is nonnull,
507 the new section should go immediately before it, otherwise it
508 should go at the (current) beginning of OS.
509
510 The function returns the new section on success, otherwise it
511 returns null. */
512 asection *(*add_stub_section) (const char *, asection *, asection *);
13db6b44
RS
513
514 /* Small local sym cache. */
515 struct sym_cache sym_cache;
1bbce132
MR
516
517 /* Is the PLT header compressed? */
518 unsigned int plt_header_is_comp : 1;
861fb55a
DJ
519};
520
4dfe6ac6
NC
521/* Get the MIPS ELF linker hash table from a link_info structure. */
522
523#define mips_elf_hash_table(p) \
524 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
525 == MIPS_ELF_DATA ? ((struct mips_elf_link_hash_table *) ((p)->hash)) : NULL)
526
861fb55a 527/* A structure used to communicate with htab_traverse callbacks. */
4dfe6ac6
NC
528struct mips_htab_traverse_info
529{
861fb55a
DJ
530 /* The usual link-wide information. */
531 struct bfd_link_info *info;
532 bfd *output_bfd;
533
534 /* Starts off FALSE and is set to TRUE if the link should be aborted. */
535 bfd_boolean error;
b49e97c9
TS
536};
537
6ae68ba3
MR
538/* MIPS ELF private object data. */
539
540struct mips_elf_obj_tdata
541{
542 /* Generic ELF private object data. */
543 struct elf_obj_tdata root;
544
545 /* Input BFD providing Tag_GNU_MIPS_ABI_FP attribute for output. */
546 bfd *abi_fp_bfd;
ee227692 547
b60bf9be
CF
548 /* Input BFD providing Tag_GNU_MIPS_ABI_MSA attribute for output. */
549 bfd *abi_msa_bfd;
550
351cdf24
MF
551 /* The abiflags for this object. */
552 Elf_Internal_ABIFlags_v0 abiflags;
553 bfd_boolean abiflags_valid;
554
ee227692
RS
555 /* The GOT requirements of input bfds. */
556 struct mips_got_info *got;
698600e4
AM
557
558 /* Used by _bfd_mips_elf_find_nearest_line. The structure could be
559 included directly in this one, but there's no point to wasting
560 the memory just for the infrequently called find_nearest_line. */
561 struct mips_elf_find_line *find_line_info;
562
563 /* An array of stub sections indexed by symbol number. */
564 asection **local_stubs;
565 asection **local_call_stubs;
566
567 /* The Irix 5 support uses two virtual sections, which represent
568 text/data symbols defined in dynamic objects. */
569 asymbol *elf_data_symbol;
570 asymbol *elf_text_symbol;
571 asection *elf_data_section;
572 asection *elf_text_section;
6ae68ba3
MR
573};
574
575/* Get MIPS ELF private object data from BFD's tdata. */
576
577#define mips_elf_tdata(bfd) \
578 ((struct mips_elf_obj_tdata *) (bfd)->tdata.any)
579
0f20cc35
DJ
580#define TLS_RELOC_P(r_type) \
581 (r_type == R_MIPS_TLS_DTPMOD32 \
582 || r_type == R_MIPS_TLS_DTPMOD64 \
583 || r_type == R_MIPS_TLS_DTPREL32 \
584 || r_type == R_MIPS_TLS_DTPREL64 \
585 || r_type == R_MIPS_TLS_GD \
586 || r_type == R_MIPS_TLS_LDM \
587 || r_type == R_MIPS_TLS_DTPREL_HI16 \
588 || r_type == R_MIPS_TLS_DTPREL_LO16 \
589 || r_type == R_MIPS_TLS_GOTTPREL \
590 || r_type == R_MIPS_TLS_TPREL32 \
591 || r_type == R_MIPS_TLS_TPREL64 \
592 || r_type == R_MIPS_TLS_TPREL_HI16 \
df58fc94 593 || r_type == R_MIPS_TLS_TPREL_LO16 \
d0f13682
CLT
594 || r_type == R_MIPS16_TLS_GD \
595 || r_type == R_MIPS16_TLS_LDM \
596 || r_type == R_MIPS16_TLS_DTPREL_HI16 \
597 || r_type == R_MIPS16_TLS_DTPREL_LO16 \
598 || r_type == R_MIPS16_TLS_GOTTPREL \
599 || r_type == R_MIPS16_TLS_TPREL_HI16 \
600 || r_type == R_MIPS16_TLS_TPREL_LO16 \
df58fc94
RS
601 || r_type == R_MICROMIPS_TLS_GD \
602 || r_type == R_MICROMIPS_TLS_LDM \
603 || r_type == R_MICROMIPS_TLS_DTPREL_HI16 \
604 || r_type == R_MICROMIPS_TLS_DTPREL_LO16 \
605 || r_type == R_MICROMIPS_TLS_GOTTPREL \
606 || r_type == R_MICROMIPS_TLS_TPREL_HI16 \
607 || r_type == R_MICROMIPS_TLS_TPREL_LO16)
0f20cc35 608
b49e97c9
TS
609/* Structure used to pass information to mips_elf_output_extsym. */
610
611struct extsym_info
612{
9e4aeb93
RS
613 bfd *abfd;
614 struct bfd_link_info *info;
b49e97c9
TS
615 struct ecoff_debug_info *debug;
616 const struct ecoff_debug_swap *swap;
b34976b6 617 bfd_boolean failed;
b49e97c9
TS
618};
619
8dc1a139 620/* The names of the runtime procedure table symbols used on IRIX5. */
b49e97c9
TS
621
622static const char * const mips_elf_dynsym_rtproc_names[] =
623{
624 "_procedure_table",
625 "_procedure_string_table",
626 "_procedure_table_size",
627 NULL
628};
629
630/* These structures are used to generate the .compact_rel section on
8dc1a139 631 IRIX5. */
b49e97c9
TS
632
633typedef struct
634{
635 unsigned long id1; /* Always one? */
636 unsigned long num; /* Number of compact relocation entries. */
637 unsigned long id2; /* Always two? */
638 unsigned long offset; /* The file offset of the first relocation. */
639 unsigned long reserved0; /* Zero? */
640 unsigned long reserved1; /* Zero? */
641} Elf32_compact_rel;
642
643typedef struct
644{
645 bfd_byte id1[4];
646 bfd_byte num[4];
647 bfd_byte id2[4];
648 bfd_byte offset[4];
649 bfd_byte reserved0[4];
650 bfd_byte reserved1[4];
651} Elf32_External_compact_rel;
652
653typedef struct
654{
655 unsigned int ctype : 1; /* 1: long 0: short format. See below. */
656 unsigned int rtype : 4; /* Relocation types. See below. */
657 unsigned int dist2to : 8;
658 unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
659 unsigned long konst; /* KONST field. See below. */
660 unsigned long vaddr; /* VADDR to be relocated. */
661} Elf32_crinfo;
662
663typedef struct
664{
665 unsigned int ctype : 1; /* 1: long 0: short format. See below. */
666 unsigned int rtype : 4; /* Relocation types. See below. */
667 unsigned int dist2to : 8;
668 unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
669 unsigned long konst; /* KONST field. See below. */
670} Elf32_crinfo2;
671
672typedef struct
673{
674 bfd_byte info[4];
675 bfd_byte konst[4];
676 bfd_byte vaddr[4];
677} Elf32_External_crinfo;
678
679typedef struct
680{
681 bfd_byte info[4];
682 bfd_byte konst[4];
683} Elf32_External_crinfo2;
684
685/* These are the constants used to swap the bitfields in a crinfo. */
686
687#define CRINFO_CTYPE (0x1)
688#define CRINFO_CTYPE_SH (31)
689#define CRINFO_RTYPE (0xf)
690#define CRINFO_RTYPE_SH (27)
691#define CRINFO_DIST2TO (0xff)
692#define CRINFO_DIST2TO_SH (19)
693#define CRINFO_RELVADDR (0x7ffff)
694#define CRINFO_RELVADDR_SH (0)
695
696/* A compact relocation info has long (3 words) or short (2 words)
697 formats. A short format doesn't have VADDR field and relvaddr
698 fields contains ((VADDR - vaddr of the previous entry) >> 2). */
699#define CRF_MIPS_LONG 1
700#define CRF_MIPS_SHORT 0
701
702/* There are 4 types of compact relocation at least. The value KONST
703 has different meaning for each type:
704
705 (type) (konst)
706 CT_MIPS_REL32 Address in data
707 CT_MIPS_WORD Address in word (XXX)
708 CT_MIPS_GPHI_LO GP - vaddr
709 CT_MIPS_JMPAD Address to jump
710 */
711
712#define CRT_MIPS_REL32 0xa
713#define CRT_MIPS_WORD 0xb
714#define CRT_MIPS_GPHI_LO 0xc
715#define CRT_MIPS_JMPAD 0xd
716
717#define mips_elf_set_cr_format(x,format) ((x).ctype = (format))
718#define mips_elf_set_cr_type(x,type) ((x).rtype = (type))
719#define mips_elf_set_cr_dist2to(x,v) ((x).dist2to = (v))
720#define mips_elf_set_cr_relvaddr(x,d) ((x).relvaddr = (d)<<2)
721\f
722/* The structure of the runtime procedure descriptor created by the
723 loader for use by the static exception system. */
724
725typedef struct runtime_pdr {
ae9a127f
NC
726 bfd_vma adr; /* Memory address of start of procedure. */
727 long regmask; /* Save register mask. */
728 long regoffset; /* Save register offset. */
729 long fregmask; /* Save floating point register mask. */
730 long fregoffset; /* Save floating point register offset. */
731 long frameoffset; /* Frame size. */
732 short framereg; /* Frame pointer register. */
733 short pcreg; /* Offset or reg of return pc. */
734 long irpss; /* Index into the runtime string table. */
b49e97c9 735 long reserved;
ae9a127f 736 struct exception_info *exception_info;/* Pointer to exception array. */
b49e97c9
TS
737} RPDR, *pRPDR;
738#define cbRPDR sizeof (RPDR)
739#define rpdNil ((pRPDR) 0)
740\f
b15e6682 741static struct mips_got_entry *mips_elf_create_local_got_entry
a8028dd0
RS
742 (bfd *, struct bfd_link_info *, bfd *, bfd_vma, unsigned long,
743 struct mips_elf_link_hash_entry *, int);
b34976b6 744static bfd_boolean mips_elf_sort_hash_table_f
9719ad41 745 (struct mips_elf_link_hash_entry *, void *);
9719ad41
RS
746static bfd_vma mips_elf_high
747 (bfd_vma);
b34976b6 748static bfd_boolean mips_elf_create_dynamic_relocation
9719ad41
RS
749 (bfd *, struct bfd_link_info *, const Elf_Internal_Rela *,
750 struct mips_elf_link_hash_entry *, asection *, bfd_vma,
751 bfd_vma *, asection *);
f4416af6 752static bfd_vma mips_elf_adjust_gp
9719ad41 753 (bfd *, struct mips_got_info *, bfd *);
f4416af6 754
b49e97c9
TS
755/* This will be used when we sort the dynamic relocation records. */
756static bfd *reldyn_sorting_bfd;
757
6d30f5b2
NC
758/* True if ABFD is for CPUs with load interlocking that include
759 non-MIPS1 CPUs and R3900. */
760#define LOAD_INTERLOCKS_P(abfd) \
761 ( ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) != E_MIPS_ARCH_1) \
762 || ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == E_MIPS_MACH_3900))
763
cd8d5a82
CF
764/* True if ABFD is for CPUs that are faster if JAL is converted to BAL.
765 This should be safe for all architectures. We enable this predicate
766 for RM9000 for now. */
767#define JAL_TO_BAL_P(abfd) \
768 ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == E_MIPS_MACH_9000)
769
770/* True if ABFD is for CPUs that are faster if JALR is converted to BAL.
771 This should be safe for all architectures. We enable this predicate for
772 all CPUs. */
773#define JALR_TO_BAL_P(abfd) 1
774
38a7df63
CF
775/* True if ABFD is for CPUs that are faster if JR is converted to B.
776 This should be safe for all architectures. We enable this predicate for
777 all CPUs. */
778#define JR_TO_B_P(abfd) 1
779
861fb55a
DJ
780/* True if ABFD is a PIC object. */
781#define PIC_OBJECT_P(abfd) \
782 ((elf_elfheader (abfd)->e_flags & EF_MIPS_PIC) != 0)
783
351cdf24
MF
784/* Nonzero if ABFD is using the O32 ABI. */
785#define ABI_O32_P(abfd) \
786 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O32)
787
b49e97c9 788/* Nonzero if ABFD is using the N32 ABI. */
b49e97c9
TS
789#define ABI_N32_P(abfd) \
790 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
791
4a14403c 792/* Nonzero if ABFD is using the N64 ABI. */
b49e97c9 793#define ABI_64_P(abfd) \
141ff970 794 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
b49e97c9 795
4a14403c
TS
796/* Nonzero if ABFD is using NewABI conventions. */
797#define NEWABI_P(abfd) (ABI_N32_P (abfd) || ABI_64_P (abfd))
798
e8faf7d1
MR
799/* Nonzero if ABFD has microMIPS code. */
800#define MICROMIPS_P(abfd) \
801 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS) != 0)
802
7361da2c
AB
803/* Nonzero if ABFD is MIPS R6. */
804#define MIPSR6_P(abfd) \
805 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R6 \
806 || (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64R6)
807
4a14403c 808/* The IRIX compatibility level we are striving for. */
b49e97c9
TS
809#define IRIX_COMPAT(abfd) \
810 (get_elf_backend_data (abfd)->elf_backend_mips_irix_compat (abfd))
811
b49e97c9
TS
812/* Whether we are trying to be compatible with IRIX at all. */
813#define SGI_COMPAT(abfd) \
814 (IRIX_COMPAT (abfd) != ict_none)
815
816/* The name of the options section. */
817#define MIPS_ELF_OPTIONS_SECTION_NAME(abfd) \
d80dcc6a 818 (NEWABI_P (abfd) ? ".MIPS.options" : ".options")
b49e97c9 819
cc2e31b9
RS
820/* True if NAME is the recognized name of any SHT_MIPS_OPTIONS section.
821 Some IRIX system files do not use MIPS_ELF_OPTIONS_SECTION_NAME. */
822#define MIPS_ELF_OPTIONS_SECTION_NAME_P(NAME) \
823 (strcmp (NAME, ".MIPS.options") == 0 || strcmp (NAME, ".options") == 0)
824
351cdf24
MF
825/* True if NAME is the recognized name of any SHT_MIPS_ABIFLAGS section. */
826#define MIPS_ELF_ABIFLAGS_SECTION_NAME_P(NAME) \
827 (strcmp (NAME, ".MIPS.abiflags") == 0)
828
943284cc
DJ
829/* Whether the section is readonly. */
830#define MIPS_ELF_READONLY_SECTION(sec) \
831 ((sec->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)) \
832 == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
833
b49e97c9 834/* The name of the stub section. */
ca07892d 835#define MIPS_ELF_STUB_SECTION_NAME(abfd) ".MIPS.stubs"
b49e97c9
TS
836
837/* The size of an external REL relocation. */
838#define MIPS_ELF_REL_SIZE(abfd) \
839 (get_elf_backend_data (abfd)->s->sizeof_rel)
840
0a44bf69
RS
841/* The size of an external RELA relocation. */
842#define MIPS_ELF_RELA_SIZE(abfd) \
843 (get_elf_backend_data (abfd)->s->sizeof_rela)
844
b49e97c9
TS
845/* The size of an external dynamic table entry. */
846#define MIPS_ELF_DYN_SIZE(abfd) \
847 (get_elf_backend_data (abfd)->s->sizeof_dyn)
848
849/* The size of a GOT entry. */
850#define MIPS_ELF_GOT_SIZE(abfd) \
851 (get_elf_backend_data (abfd)->s->arch_size / 8)
852
b4082c70
DD
853/* The size of the .rld_map section. */
854#define MIPS_ELF_RLD_MAP_SIZE(abfd) \
855 (get_elf_backend_data (abfd)->s->arch_size / 8)
856
b49e97c9
TS
857/* The size of a symbol-table entry. */
858#define MIPS_ELF_SYM_SIZE(abfd) \
859 (get_elf_backend_data (abfd)->s->sizeof_sym)
860
861/* The default alignment for sections, as a power of two. */
862#define MIPS_ELF_LOG_FILE_ALIGN(abfd) \
45d6a902 863 (get_elf_backend_data (abfd)->s->log_file_align)
b49e97c9
TS
864
865/* Get word-sized data. */
866#define MIPS_ELF_GET_WORD(abfd, ptr) \
867 (ABI_64_P (abfd) ? bfd_get_64 (abfd, ptr) : bfd_get_32 (abfd, ptr))
868
869/* Put out word-sized data. */
870#define MIPS_ELF_PUT_WORD(abfd, val, ptr) \
871 (ABI_64_P (abfd) \
872 ? bfd_put_64 (abfd, val, ptr) \
873 : bfd_put_32 (abfd, val, ptr))
874
861fb55a
DJ
875/* The opcode for word-sized loads (LW or LD). */
876#define MIPS_ELF_LOAD_WORD(abfd) \
877 (ABI_64_P (abfd) ? 0xdc000000 : 0x8c000000)
878
b49e97c9 879/* Add a dynamic symbol table-entry. */
9719ad41 880#define MIPS_ELF_ADD_DYNAMIC_ENTRY(info, tag, val) \
5a580b3a 881 _bfd_elf_add_dynamic_entry (info, tag, val)
b49e97c9
TS
882
883#define MIPS_ELF_RTYPE_TO_HOWTO(abfd, rtype, rela) \
884 (get_elf_backend_data (abfd)->elf_backend_mips_rtype_to_howto (rtype, rela))
885
0a44bf69
RS
886/* The name of the dynamic relocation section. */
887#define MIPS_ELF_REL_DYN_NAME(INFO) \
888 (mips_elf_hash_table (INFO)->is_vxworks ? ".rela.dyn" : ".rel.dyn")
889
b49e97c9
TS
890/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
891 from smaller values. Start with zero, widen, *then* decrement. */
892#define MINUS_ONE (((bfd_vma)0) - 1)
c5ae1840 893#define MINUS_TWO (((bfd_vma)0) - 2)
b49e97c9 894
51e38d68
RS
895/* The value to write into got[1] for SVR4 targets, to identify it is
896 a GNU object. The dynamic linker can then use got[1] to store the
897 module pointer. */
898#define MIPS_ELF_GNU_GOT1_MASK(abfd) \
899 ((bfd_vma) 1 << (ABI_64_P (abfd) ? 63 : 31))
900
f4416af6 901/* The offset of $gp from the beginning of the .got section. */
0a44bf69
RS
902#define ELF_MIPS_GP_OFFSET(INFO) \
903 (mips_elf_hash_table (INFO)->is_vxworks ? 0x0 : 0x7ff0)
f4416af6
AO
904
905/* The maximum size of the GOT for it to be addressable using 16-bit
906 offsets from $gp. */
0a44bf69 907#define MIPS_ELF_GOT_MAX_SIZE(INFO) (ELF_MIPS_GP_OFFSET (INFO) + 0x7fff)
f4416af6 908
6a691779 909/* Instructions which appear in a stub. */
3d6746ca
DD
910#define STUB_LW(abfd) \
911 ((ABI_64_P (abfd) \
912 ? 0xdf998010 /* ld t9,0x8010(gp) */ \
913 : 0x8f998010)) /* lw t9,0x8010(gp) */
40fc1451 914#define STUB_MOVE 0x03e07825 /* or t7,ra,zero */
3d6746ca
DD
915#define STUB_LUI(VAL) (0x3c180000 + (VAL)) /* lui t8,VAL */
916#define STUB_JALR 0x0320f809 /* jalr t9,ra */
5108fc1b
RS
917#define STUB_ORI(VAL) (0x37180000 + (VAL)) /* ori t8,t8,VAL */
918#define STUB_LI16U(VAL) (0x34180000 + (VAL)) /* ori t8,zero,VAL unsigned */
3d6746ca
DD
919#define STUB_LI16S(abfd, VAL) \
920 ((ABI_64_P (abfd) \
921 ? (0x64180000 + (VAL)) /* daddiu t8,zero,VAL sign extended */ \
922 : (0x24180000 + (VAL)))) /* addiu t8,zero,VAL sign extended */
923
1bbce132
MR
924/* Likewise for the microMIPS ASE. */
925#define STUB_LW_MICROMIPS(abfd) \
926 (ABI_64_P (abfd) \
927 ? 0xdf3c8010 /* ld t9,0x8010(gp) */ \
928 : 0xff3c8010) /* lw t9,0x8010(gp) */
929#define STUB_MOVE_MICROMIPS 0x0dff /* move t7,ra */
40fc1451 930#define STUB_MOVE32_MICROMIPS 0x001f7a90 /* or t7,ra,zero */
1bbce132
MR
931#define STUB_LUI_MICROMIPS(VAL) \
932 (0x41b80000 + (VAL)) /* lui t8,VAL */
933#define STUB_JALR_MICROMIPS 0x45d9 /* jalr t9 */
833794fc 934#define STUB_JALR32_MICROMIPS 0x03f90f3c /* jalr ra,t9 */
1bbce132
MR
935#define STUB_ORI_MICROMIPS(VAL) \
936 (0x53180000 + (VAL)) /* ori t8,t8,VAL */
937#define STUB_LI16U_MICROMIPS(VAL) \
938 (0x53000000 + (VAL)) /* ori t8,zero,VAL unsigned */
939#define STUB_LI16S_MICROMIPS(abfd, VAL) \
940 (ABI_64_P (abfd) \
941 ? 0x5f000000 + (VAL) /* daddiu t8,zero,VAL sign extended */ \
942 : 0x33000000 + (VAL)) /* addiu t8,zero,VAL sign extended */
943
5108fc1b
RS
944#define MIPS_FUNCTION_STUB_NORMAL_SIZE 16
945#define MIPS_FUNCTION_STUB_BIG_SIZE 20
1bbce132
MR
946#define MICROMIPS_FUNCTION_STUB_NORMAL_SIZE 12
947#define MICROMIPS_FUNCTION_STUB_BIG_SIZE 16
833794fc
MR
948#define MICROMIPS_INSN32_FUNCTION_STUB_NORMAL_SIZE 16
949#define MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE 20
b49e97c9
TS
950
951/* The name of the dynamic interpreter. This is put in the .interp
952 section. */
953
954#define ELF_DYNAMIC_INTERPRETER(abfd) \
955 (ABI_N32_P (abfd) ? "/usr/lib32/libc.so.1" \
956 : ABI_64_P (abfd) ? "/usr/lib64/libc.so.1" \
957 : "/usr/lib/libc.so.1")
958
959#ifdef BFD64
ee6423ed
AO
960#define MNAME(bfd,pre,pos) \
961 (ABI_64_P (bfd) ? CONCAT4 (pre,64,_,pos) : CONCAT4 (pre,32,_,pos))
b49e97c9
TS
962#define ELF_R_SYM(bfd, i) \
963 (ABI_64_P (bfd) ? ELF64_R_SYM (i) : ELF32_R_SYM (i))
964#define ELF_R_TYPE(bfd, i) \
965 (ABI_64_P (bfd) ? ELF64_MIPS_R_TYPE (i) : ELF32_R_TYPE (i))
966#define ELF_R_INFO(bfd, s, t) \
967 (ABI_64_P (bfd) ? ELF64_R_INFO (s, t) : ELF32_R_INFO (s, t))
968#else
ee6423ed 969#define MNAME(bfd,pre,pos) CONCAT4 (pre,32,_,pos)
b49e97c9
TS
970#define ELF_R_SYM(bfd, i) \
971 (ELF32_R_SYM (i))
972#define ELF_R_TYPE(bfd, i) \
973 (ELF32_R_TYPE (i))
974#define ELF_R_INFO(bfd, s, t) \
975 (ELF32_R_INFO (s, t))
976#endif
977\f
978 /* The mips16 compiler uses a couple of special sections to handle
979 floating point arguments.
980
981 Section names that look like .mips16.fn.FNNAME contain stubs that
982 copy floating point arguments from the fp regs to the gp regs and
983 then jump to FNNAME. If any 32 bit function calls FNNAME, the
984 call should be redirected to the stub instead. If no 32 bit
985 function calls FNNAME, the stub should be discarded. We need to
986 consider any reference to the function, not just a call, because
987 if the address of the function is taken we will need the stub,
988 since the address might be passed to a 32 bit function.
989
990 Section names that look like .mips16.call.FNNAME contain stubs
991 that copy floating point arguments from the gp regs to the fp
992 regs and then jump to FNNAME. If FNNAME is a 32 bit function,
993 then any 16 bit function that calls FNNAME should be redirected
994 to the stub instead. If FNNAME is not a 32 bit function, the
995 stub should be discarded.
996
997 .mips16.call.fp.FNNAME sections are similar, but contain stubs
998 which call FNNAME and then copy the return value from the fp regs
999 to the gp regs. These stubs store the return value in $18 while
1000 calling FNNAME; any function which might call one of these stubs
1001 must arrange to save $18 around the call. (This case is not
1002 needed for 32 bit functions that call 16 bit functions, because
1003 16 bit functions always return floating point values in both
1004 $f0/$f1 and $2/$3.)
1005
1006 Note that in all cases FNNAME might be defined statically.
1007 Therefore, FNNAME is not used literally. Instead, the relocation
1008 information will indicate which symbol the section is for.
1009
1010 We record any stubs that we find in the symbol table. */
1011
1012#define FN_STUB ".mips16.fn."
1013#define CALL_STUB ".mips16.call."
1014#define CALL_FP_STUB ".mips16.call.fp."
b9d58d71
TS
1015
1016#define FN_STUB_P(name) CONST_STRNEQ (name, FN_STUB)
1017#define CALL_STUB_P(name) CONST_STRNEQ (name, CALL_STUB)
1018#define CALL_FP_STUB_P(name) CONST_STRNEQ (name, CALL_FP_STUB)
b49e97c9 1019\f
861fb55a 1020/* The format of the first PLT entry in an O32 executable. */
6d30f5b2
NC
1021static const bfd_vma mips_o32_exec_plt0_entry[] =
1022{
861fb55a
DJ
1023 0x3c1c0000, /* lui $28, %hi(&GOTPLT[0]) */
1024 0x8f990000, /* lw $25, %lo(&GOTPLT[0])($28) */
1025 0x279c0000, /* addiu $28, $28, %lo(&GOTPLT[0]) */
1026 0x031cc023, /* subu $24, $24, $28 */
40fc1451 1027 0x03e07825, /* or t7, ra, zero */
861fb55a
DJ
1028 0x0018c082, /* srl $24, $24, 2 */
1029 0x0320f809, /* jalr $25 */
1030 0x2718fffe /* subu $24, $24, 2 */
1031};
1032
1033/* The format of the first PLT entry in an N32 executable. Different
1034 because gp ($28) is not available; we use t2 ($14) instead. */
6d30f5b2
NC
1035static const bfd_vma mips_n32_exec_plt0_entry[] =
1036{
861fb55a
DJ
1037 0x3c0e0000, /* lui $14, %hi(&GOTPLT[0]) */
1038 0x8dd90000, /* lw $25, %lo(&GOTPLT[0])($14) */
1039 0x25ce0000, /* addiu $14, $14, %lo(&GOTPLT[0]) */
1040 0x030ec023, /* subu $24, $24, $14 */
40fc1451 1041 0x03e07825, /* or t7, ra, zero */
861fb55a
DJ
1042 0x0018c082, /* srl $24, $24, 2 */
1043 0x0320f809, /* jalr $25 */
1044 0x2718fffe /* subu $24, $24, 2 */
1045};
1046
1047/* The format of the first PLT entry in an N64 executable. Different
1048 from N32 because of the increased size of GOT entries. */
6d30f5b2
NC
1049static const bfd_vma mips_n64_exec_plt0_entry[] =
1050{
861fb55a
DJ
1051 0x3c0e0000, /* lui $14, %hi(&GOTPLT[0]) */
1052 0xddd90000, /* ld $25, %lo(&GOTPLT[0])($14) */
1053 0x25ce0000, /* addiu $14, $14, %lo(&GOTPLT[0]) */
1054 0x030ec023, /* subu $24, $24, $14 */
40fc1451 1055 0x03e07825, /* or t7, ra, zero */
861fb55a
DJ
1056 0x0018c0c2, /* srl $24, $24, 3 */
1057 0x0320f809, /* jalr $25 */
1058 0x2718fffe /* subu $24, $24, 2 */
1059};
1060
1bbce132
MR
1061/* The format of the microMIPS first PLT entry in an O32 executable.
1062 We rely on v0 ($2) rather than t8 ($24) to contain the address
1063 of the GOTPLT entry handled, so this stub may only be used when
1064 all the subsequent PLT entries are microMIPS code too.
1065
1066 The trailing NOP is for alignment and correct disassembly only. */
1067static const bfd_vma micromips_o32_exec_plt0_entry[] =
1068{
1069 0x7980, 0x0000, /* addiupc $3, (&GOTPLT[0]) - . */
1070 0xff23, 0x0000, /* lw $25, 0($3) */
1071 0x0535, /* subu $2, $2, $3 */
1072 0x2525, /* srl $2, $2, 2 */
1073 0x3302, 0xfffe, /* subu $24, $2, 2 */
1074 0x0dff, /* move $15, $31 */
1075 0x45f9, /* jalrs $25 */
1076 0x0f83, /* move $28, $3 */
1077 0x0c00 /* nop */
1078};
1079
833794fc
MR
1080/* The format of the microMIPS first PLT entry in an O32 executable
1081 in the insn32 mode. */
1082static const bfd_vma micromips_insn32_o32_exec_plt0_entry[] =
1083{
1084 0x41bc, 0x0000, /* lui $28, %hi(&GOTPLT[0]) */
1085 0xff3c, 0x0000, /* lw $25, %lo(&GOTPLT[0])($28) */
1086 0x339c, 0x0000, /* addiu $28, $28, %lo(&GOTPLT[0]) */
1087 0x0398, 0xc1d0, /* subu $24, $24, $28 */
40fc1451 1088 0x001f, 0x7a90, /* or $15, $31, zero */
833794fc
MR
1089 0x0318, 0x1040, /* srl $24, $24, 2 */
1090 0x03f9, 0x0f3c, /* jalr $25 */
1091 0x3318, 0xfffe /* subu $24, $24, 2 */
1092};
1093
1bbce132 1094/* The format of subsequent standard PLT entries. */
6d30f5b2
NC
1095static const bfd_vma mips_exec_plt_entry[] =
1096{
861fb55a
DJ
1097 0x3c0f0000, /* lui $15, %hi(.got.plt entry) */
1098 0x01f90000, /* l[wd] $25, %lo(.got.plt entry)($15) */
1099 0x25f80000, /* addiu $24, $15, %lo(.got.plt entry) */
1100 0x03200008 /* jr $25 */
1101};
1102
7361da2c
AB
1103/* In the following PLT entry the JR and ADDIU instructions will
1104 be swapped in _bfd_mips_elf_finish_dynamic_symbol because
1105 LOAD_INTERLOCKS_P will be true for MIPS R6. */
1106static const bfd_vma mipsr6_exec_plt_entry[] =
1107{
1108 0x3c0f0000, /* lui $15, %hi(.got.plt entry) */
1109 0x01f90000, /* l[wd] $25, %lo(.got.plt entry)($15) */
1110 0x25f80000, /* addiu $24, $15, %lo(.got.plt entry) */
1111 0x03200009 /* jr $25 */
1112};
1113
1bbce132
MR
1114/* The format of subsequent MIPS16 o32 PLT entries. We use v0 ($2)
1115 and v1 ($3) as temporaries because t8 ($24) and t9 ($25) are not
1116 directly addressable. */
1117static const bfd_vma mips16_o32_exec_plt_entry[] =
1118{
1119 0xb203, /* lw $2, 12($pc) */
1120 0x9a60, /* lw $3, 0($2) */
1121 0x651a, /* move $24, $2 */
1122 0xeb00, /* jr $3 */
1123 0x653b, /* move $25, $3 */
1124 0x6500, /* nop */
1125 0x0000, 0x0000 /* .word (.got.plt entry) */
1126};
1127
1128/* The format of subsequent microMIPS o32 PLT entries. We use v0 ($2)
1129 as a temporary because t8 ($24) is not addressable with ADDIUPC. */
1130static const bfd_vma micromips_o32_exec_plt_entry[] =
1131{
1132 0x7900, 0x0000, /* addiupc $2, (.got.plt entry) - . */
1133 0xff22, 0x0000, /* lw $25, 0($2) */
1134 0x4599, /* jr $25 */
1135 0x0f02 /* move $24, $2 */
1136};
1137
833794fc
MR
1138/* The format of subsequent microMIPS o32 PLT entries in the insn32 mode. */
1139static const bfd_vma micromips_insn32_o32_exec_plt_entry[] =
1140{
1141 0x41af, 0x0000, /* lui $15, %hi(.got.plt entry) */
1142 0xff2f, 0x0000, /* lw $25, %lo(.got.plt entry)($15) */
1143 0x0019, 0x0f3c, /* jr $25 */
1144 0x330f, 0x0000 /* addiu $24, $15, %lo(.got.plt entry) */
1145};
1146
0a44bf69 1147/* The format of the first PLT entry in a VxWorks executable. */
6d30f5b2
NC
1148static const bfd_vma mips_vxworks_exec_plt0_entry[] =
1149{
0a44bf69
RS
1150 0x3c190000, /* lui t9, %hi(_GLOBAL_OFFSET_TABLE_) */
1151 0x27390000, /* addiu t9, t9, %lo(_GLOBAL_OFFSET_TABLE_) */
1152 0x8f390008, /* lw t9, 8(t9) */
1153 0x00000000, /* nop */
1154 0x03200008, /* jr t9 */
1155 0x00000000 /* nop */
1156};
1157
1158/* The format of subsequent PLT entries. */
6d30f5b2
NC
1159static const bfd_vma mips_vxworks_exec_plt_entry[] =
1160{
0a44bf69
RS
1161 0x10000000, /* b .PLT_resolver */
1162 0x24180000, /* li t8, <pltindex> */
1163 0x3c190000, /* lui t9, %hi(<.got.plt slot>) */
1164 0x27390000, /* addiu t9, t9, %lo(<.got.plt slot>) */
1165 0x8f390000, /* lw t9, 0(t9) */
1166 0x00000000, /* nop */
1167 0x03200008, /* jr t9 */
1168 0x00000000 /* nop */
1169};
1170
1171/* The format of the first PLT entry in a VxWorks shared object. */
6d30f5b2
NC
1172static const bfd_vma mips_vxworks_shared_plt0_entry[] =
1173{
0a44bf69
RS
1174 0x8f990008, /* lw t9, 8(gp) */
1175 0x00000000, /* nop */
1176 0x03200008, /* jr t9 */
1177 0x00000000, /* nop */
1178 0x00000000, /* nop */
1179 0x00000000 /* nop */
1180};
1181
1182/* The format of subsequent PLT entries. */
6d30f5b2
NC
1183static const bfd_vma mips_vxworks_shared_plt_entry[] =
1184{
0a44bf69
RS
1185 0x10000000, /* b .PLT_resolver */
1186 0x24180000 /* li t8, <pltindex> */
1187};
1188\f
d21911ea
MR
1189/* microMIPS 32-bit opcode helper installer. */
1190
1191static void
1192bfd_put_micromips_32 (const bfd *abfd, bfd_vma opcode, bfd_byte *ptr)
1193{
1194 bfd_put_16 (abfd, (opcode >> 16) & 0xffff, ptr);
1195 bfd_put_16 (abfd, opcode & 0xffff, ptr + 2);
1196}
1197
1198/* microMIPS 32-bit opcode helper retriever. */
1199
1200static bfd_vma
1201bfd_get_micromips_32 (const bfd *abfd, const bfd_byte *ptr)
1202{
1203 return (bfd_get_16 (abfd, ptr) << 16) | bfd_get_16 (abfd, ptr + 2);
1204}
1205\f
b49e97c9
TS
1206/* Look up an entry in a MIPS ELF linker hash table. */
1207
1208#define mips_elf_link_hash_lookup(table, string, create, copy, follow) \
1209 ((struct mips_elf_link_hash_entry *) \
1210 elf_link_hash_lookup (&(table)->root, (string), (create), \
1211 (copy), (follow)))
1212
1213/* Traverse a MIPS ELF linker hash table. */
1214
1215#define mips_elf_link_hash_traverse(table, func, info) \
1216 (elf_link_hash_traverse \
1217 (&(table)->root, \
9719ad41 1218 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
b49e97c9
TS
1219 (info)))
1220
0f20cc35
DJ
1221/* Find the base offsets for thread-local storage in this object,
1222 for GD/LD and IE/LE respectively. */
1223
1224#define TP_OFFSET 0x7000
1225#define DTP_OFFSET 0x8000
1226
1227static bfd_vma
1228dtprel_base (struct bfd_link_info *info)
1229{
1230 /* If tls_sec is NULL, we should have signalled an error already. */
1231 if (elf_hash_table (info)->tls_sec == NULL)
1232 return 0;
1233 return elf_hash_table (info)->tls_sec->vma + DTP_OFFSET;
1234}
1235
1236static bfd_vma
1237tprel_base (struct bfd_link_info *info)
1238{
1239 /* If tls_sec is NULL, we should have signalled an error already. */
1240 if (elf_hash_table (info)->tls_sec == NULL)
1241 return 0;
1242 return elf_hash_table (info)->tls_sec->vma + TP_OFFSET;
1243}
1244
b49e97c9
TS
1245/* Create an entry in a MIPS ELF linker hash table. */
1246
1247static struct bfd_hash_entry *
9719ad41
RS
1248mips_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
1249 struct bfd_hash_table *table, const char *string)
b49e97c9
TS
1250{
1251 struct mips_elf_link_hash_entry *ret =
1252 (struct mips_elf_link_hash_entry *) entry;
1253
1254 /* Allocate the structure if it has not already been allocated by a
1255 subclass. */
9719ad41
RS
1256 if (ret == NULL)
1257 ret = bfd_hash_allocate (table, sizeof (struct mips_elf_link_hash_entry));
1258 if (ret == NULL)
b49e97c9
TS
1259 return (struct bfd_hash_entry *) ret;
1260
1261 /* Call the allocation method of the superclass. */
1262 ret = ((struct mips_elf_link_hash_entry *)
1263 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
1264 table, string));
9719ad41 1265 if (ret != NULL)
b49e97c9
TS
1266 {
1267 /* Set local fields. */
1268 memset (&ret->esym, 0, sizeof (EXTR));
1269 /* We use -2 as a marker to indicate that the information has
1270 not been set. -1 means there is no associated ifd. */
1271 ret->esym.ifd = -2;
861fb55a 1272 ret->la25_stub = 0;
b49e97c9 1273 ret->possibly_dynamic_relocs = 0;
b49e97c9 1274 ret->fn_stub = NULL;
b49e97c9
TS
1275 ret->call_stub = NULL;
1276 ret->call_fp_stub = NULL;
634835ae 1277 ret->global_got_area = GGA_NONE;
6ccf4795 1278 ret->got_only_for_calls = TRUE;
71782a75 1279 ret->readonly_reloc = FALSE;
861fb55a 1280 ret->has_static_relocs = FALSE;
71782a75
RS
1281 ret->no_fn_stub = FALSE;
1282 ret->need_fn_stub = FALSE;
861fb55a 1283 ret->has_nonpic_branches = FALSE;
33bb52fb 1284 ret->needs_lazy_stub = FALSE;
1bbce132 1285 ret->use_plt_entry = FALSE;
b49e97c9
TS
1286 }
1287
1288 return (struct bfd_hash_entry *) ret;
1289}
f0abc2a1 1290
6ae68ba3
MR
1291/* Allocate MIPS ELF private object data. */
1292
1293bfd_boolean
1294_bfd_mips_elf_mkobject (bfd *abfd)
1295{
1296 return bfd_elf_allocate_object (abfd, sizeof (struct mips_elf_obj_tdata),
1297 MIPS_ELF_DATA);
1298}
1299
f0abc2a1 1300bfd_boolean
9719ad41 1301_bfd_mips_elf_new_section_hook (bfd *abfd, asection *sec)
f0abc2a1 1302{
f592407e
AM
1303 if (!sec->used_by_bfd)
1304 {
1305 struct _mips_elf_section_data *sdata;
1306 bfd_size_type amt = sizeof (*sdata);
f0abc2a1 1307
f592407e
AM
1308 sdata = bfd_zalloc (abfd, amt);
1309 if (sdata == NULL)
1310 return FALSE;
1311 sec->used_by_bfd = sdata;
1312 }
f0abc2a1
AM
1313
1314 return _bfd_elf_new_section_hook (abfd, sec);
1315}
b49e97c9
TS
1316\f
1317/* Read ECOFF debugging information from a .mdebug section into a
1318 ecoff_debug_info structure. */
1319
b34976b6 1320bfd_boolean
9719ad41
RS
1321_bfd_mips_elf_read_ecoff_info (bfd *abfd, asection *section,
1322 struct ecoff_debug_info *debug)
b49e97c9
TS
1323{
1324 HDRR *symhdr;
1325 const struct ecoff_debug_swap *swap;
9719ad41 1326 char *ext_hdr;
b49e97c9
TS
1327
1328 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1329 memset (debug, 0, sizeof (*debug));
1330
9719ad41 1331 ext_hdr = bfd_malloc (swap->external_hdr_size);
b49e97c9
TS
1332 if (ext_hdr == NULL && swap->external_hdr_size != 0)
1333 goto error_return;
1334
9719ad41 1335 if (! bfd_get_section_contents (abfd, section, ext_hdr, 0,
82e51918 1336 swap->external_hdr_size))
b49e97c9
TS
1337 goto error_return;
1338
1339 symhdr = &debug->symbolic_header;
1340 (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
1341
1342 /* The symbolic header contains absolute file offsets and sizes to
1343 read. */
1344#define READ(ptr, offset, count, size, type) \
1345 if (symhdr->count == 0) \
1346 debug->ptr = NULL; \
1347 else \
1348 { \
1349 bfd_size_type amt = (bfd_size_type) size * symhdr->count; \
9719ad41 1350 debug->ptr = bfd_malloc (amt); \
b49e97c9
TS
1351 if (debug->ptr == NULL) \
1352 goto error_return; \
9719ad41 1353 if (bfd_seek (abfd, symhdr->offset, SEEK_SET) != 0 \
b49e97c9
TS
1354 || bfd_bread (debug->ptr, amt, abfd) != amt) \
1355 goto error_return; \
1356 }
1357
1358 READ (line, cbLineOffset, cbLine, sizeof (unsigned char), unsigned char *);
9719ad41
RS
1359 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, void *);
1360 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, void *);
1361 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, void *);
1362 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, void *);
b49e97c9
TS
1363 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
1364 union aux_ext *);
1365 READ (ss, cbSsOffset, issMax, sizeof (char), char *);
1366 READ (ssext, cbSsExtOffset, issExtMax, sizeof (char), char *);
9719ad41
RS
1367 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, void *);
1368 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, void *);
1369 READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size, void *);
b49e97c9
TS
1370#undef READ
1371
1372 debug->fdr = NULL;
b49e97c9 1373
b34976b6 1374 return TRUE;
b49e97c9
TS
1375
1376 error_return:
1377 if (ext_hdr != NULL)
1378 free (ext_hdr);
1379 if (debug->line != NULL)
1380 free (debug->line);
1381 if (debug->external_dnr != NULL)
1382 free (debug->external_dnr);
1383 if (debug->external_pdr != NULL)
1384 free (debug->external_pdr);
1385 if (debug->external_sym != NULL)
1386 free (debug->external_sym);
1387 if (debug->external_opt != NULL)
1388 free (debug->external_opt);
1389 if (debug->external_aux != NULL)
1390 free (debug->external_aux);
1391 if (debug->ss != NULL)
1392 free (debug->ss);
1393 if (debug->ssext != NULL)
1394 free (debug->ssext);
1395 if (debug->external_fdr != NULL)
1396 free (debug->external_fdr);
1397 if (debug->external_rfd != NULL)
1398 free (debug->external_rfd);
1399 if (debug->external_ext != NULL)
1400 free (debug->external_ext);
b34976b6 1401 return FALSE;
b49e97c9
TS
1402}
1403\f
1404/* Swap RPDR (runtime procedure table entry) for output. */
1405
1406static void
9719ad41 1407ecoff_swap_rpdr_out (bfd *abfd, const RPDR *in, struct rpdr_ext *ex)
b49e97c9
TS
1408{
1409 H_PUT_S32 (abfd, in->adr, ex->p_adr);
1410 H_PUT_32 (abfd, in->regmask, ex->p_regmask);
1411 H_PUT_32 (abfd, in->regoffset, ex->p_regoffset);
1412 H_PUT_32 (abfd, in->fregmask, ex->p_fregmask);
1413 H_PUT_32 (abfd, in->fregoffset, ex->p_fregoffset);
1414 H_PUT_32 (abfd, in->frameoffset, ex->p_frameoffset);
1415
1416 H_PUT_16 (abfd, in->framereg, ex->p_framereg);
1417 H_PUT_16 (abfd, in->pcreg, ex->p_pcreg);
1418
1419 H_PUT_32 (abfd, in->irpss, ex->p_irpss);
b49e97c9
TS
1420}
1421
1422/* Create a runtime procedure table from the .mdebug section. */
1423
b34976b6 1424static bfd_boolean
9719ad41
RS
1425mips_elf_create_procedure_table (void *handle, bfd *abfd,
1426 struct bfd_link_info *info, asection *s,
1427 struct ecoff_debug_info *debug)
b49e97c9
TS
1428{
1429 const struct ecoff_debug_swap *swap;
1430 HDRR *hdr = &debug->symbolic_header;
1431 RPDR *rpdr, *rp;
1432 struct rpdr_ext *erp;
9719ad41 1433 void *rtproc;
b49e97c9
TS
1434 struct pdr_ext *epdr;
1435 struct sym_ext *esym;
1436 char *ss, **sv;
1437 char *str;
1438 bfd_size_type size;
1439 bfd_size_type count;
1440 unsigned long sindex;
1441 unsigned long i;
1442 PDR pdr;
1443 SYMR sym;
1444 const char *no_name_func = _("static procedure (no name)");
1445
1446 epdr = NULL;
1447 rpdr = NULL;
1448 esym = NULL;
1449 ss = NULL;
1450 sv = NULL;
1451
1452 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1453
1454 sindex = strlen (no_name_func) + 1;
1455 count = hdr->ipdMax;
1456 if (count > 0)
1457 {
1458 size = swap->external_pdr_size;
1459
9719ad41 1460 epdr = bfd_malloc (size * count);
b49e97c9
TS
1461 if (epdr == NULL)
1462 goto error_return;
1463
9719ad41 1464 if (! _bfd_ecoff_get_accumulated_pdr (handle, (bfd_byte *) epdr))
b49e97c9
TS
1465 goto error_return;
1466
1467 size = sizeof (RPDR);
9719ad41 1468 rp = rpdr = bfd_malloc (size * count);
b49e97c9
TS
1469 if (rpdr == NULL)
1470 goto error_return;
1471
1472 size = sizeof (char *);
9719ad41 1473 sv = bfd_malloc (size * count);
b49e97c9
TS
1474 if (sv == NULL)
1475 goto error_return;
1476
1477 count = hdr->isymMax;
1478 size = swap->external_sym_size;
9719ad41 1479 esym = bfd_malloc (size * count);
b49e97c9
TS
1480 if (esym == NULL)
1481 goto error_return;
1482
9719ad41 1483 if (! _bfd_ecoff_get_accumulated_sym (handle, (bfd_byte *) esym))
b49e97c9
TS
1484 goto error_return;
1485
1486 count = hdr->issMax;
9719ad41 1487 ss = bfd_malloc (count);
b49e97c9
TS
1488 if (ss == NULL)
1489 goto error_return;
f075ee0c 1490 if (! _bfd_ecoff_get_accumulated_ss (handle, (bfd_byte *) ss))
b49e97c9
TS
1491 goto error_return;
1492
1493 count = hdr->ipdMax;
1494 for (i = 0; i < (unsigned long) count; i++, rp++)
1495 {
9719ad41
RS
1496 (*swap->swap_pdr_in) (abfd, epdr + i, &pdr);
1497 (*swap->swap_sym_in) (abfd, &esym[pdr.isym], &sym);
b49e97c9
TS
1498 rp->adr = sym.value;
1499 rp->regmask = pdr.regmask;
1500 rp->regoffset = pdr.regoffset;
1501 rp->fregmask = pdr.fregmask;
1502 rp->fregoffset = pdr.fregoffset;
1503 rp->frameoffset = pdr.frameoffset;
1504 rp->framereg = pdr.framereg;
1505 rp->pcreg = pdr.pcreg;
1506 rp->irpss = sindex;
1507 sv[i] = ss + sym.iss;
1508 sindex += strlen (sv[i]) + 1;
1509 }
1510 }
1511
1512 size = sizeof (struct rpdr_ext) * (count + 2) + sindex;
1513 size = BFD_ALIGN (size, 16);
9719ad41 1514 rtproc = bfd_alloc (abfd, size);
b49e97c9
TS
1515 if (rtproc == NULL)
1516 {
1517 mips_elf_hash_table (info)->procedure_count = 0;
1518 goto error_return;
1519 }
1520
1521 mips_elf_hash_table (info)->procedure_count = count + 2;
1522
9719ad41 1523 erp = rtproc;
b49e97c9
TS
1524 memset (erp, 0, sizeof (struct rpdr_ext));
1525 erp++;
1526 str = (char *) rtproc + sizeof (struct rpdr_ext) * (count + 2);
1527 strcpy (str, no_name_func);
1528 str += strlen (no_name_func) + 1;
1529 for (i = 0; i < count; i++)
1530 {
1531 ecoff_swap_rpdr_out (abfd, rpdr + i, erp + i);
1532 strcpy (str, sv[i]);
1533 str += strlen (sv[i]) + 1;
1534 }
1535 H_PUT_S32 (abfd, -1, (erp + count)->p_adr);
1536
1537 /* Set the size and contents of .rtproc section. */
eea6121a 1538 s->size = size;
9719ad41 1539 s->contents = rtproc;
b49e97c9
TS
1540
1541 /* Skip this section later on (I don't think this currently
1542 matters, but someday it might). */
8423293d 1543 s->map_head.link_order = NULL;
b49e97c9
TS
1544
1545 if (epdr != NULL)
1546 free (epdr);
1547 if (rpdr != NULL)
1548 free (rpdr);
1549 if (esym != NULL)
1550 free (esym);
1551 if (ss != NULL)
1552 free (ss);
1553 if (sv != NULL)
1554 free (sv);
1555
b34976b6 1556 return TRUE;
b49e97c9
TS
1557
1558 error_return:
1559 if (epdr != NULL)
1560 free (epdr);
1561 if (rpdr != NULL)
1562 free (rpdr);
1563 if (esym != NULL)
1564 free (esym);
1565 if (ss != NULL)
1566 free (ss);
1567 if (sv != NULL)
1568 free (sv);
b34976b6 1569 return FALSE;
b49e97c9 1570}
738e5348 1571\f
861fb55a
DJ
1572/* We're going to create a stub for H. Create a symbol for the stub's
1573 value and size, to help make the disassembly easier to read. */
1574
1575static bfd_boolean
1576mips_elf_create_stub_symbol (struct bfd_link_info *info,
1577 struct mips_elf_link_hash_entry *h,
1578 const char *prefix, asection *s, bfd_vma value,
1579 bfd_vma size)
1580{
a848a227 1581 bfd_boolean micromips_p = ELF_ST_IS_MICROMIPS (h->root.other);
861fb55a
DJ
1582 struct bfd_link_hash_entry *bh;
1583 struct elf_link_hash_entry *elfh;
e1fa0163
NC
1584 char *name;
1585 bfd_boolean res;
861fb55a 1586
a848a227 1587 if (micromips_p)
df58fc94
RS
1588 value |= 1;
1589
861fb55a 1590 /* Create a new symbol. */
e1fa0163 1591 name = concat (prefix, h->root.root.root.string, NULL);
861fb55a 1592 bh = NULL;
e1fa0163
NC
1593 res = _bfd_generic_link_add_one_symbol (info, s->owner, name,
1594 BSF_LOCAL, s, value, NULL,
1595 TRUE, FALSE, &bh);
1596 free (name);
1597 if (! res)
861fb55a
DJ
1598 return FALSE;
1599
1600 /* Make it a local function. */
1601 elfh = (struct elf_link_hash_entry *) bh;
1602 elfh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
1603 elfh->size = size;
1604 elfh->forced_local = 1;
a848a227
MR
1605 if (micromips_p)
1606 elfh->other = ELF_ST_SET_MICROMIPS (elfh->other);
861fb55a
DJ
1607 return TRUE;
1608}
1609
738e5348
RS
1610/* We're about to redefine H. Create a symbol to represent H's
1611 current value and size, to help make the disassembly easier
1612 to read. */
1613
1614static bfd_boolean
1615mips_elf_create_shadow_symbol (struct bfd_link_info *info,
1616 struct mips_elf_link_hash_entry *h,
1617 const char *prefix)
1618{
1619 struct bfd_link_hash_entry *bh;
1620 struct elf_link_hash_entry *elfh;
e1fa0163 1621 char *name;
738e5348
RS
1622 asection *s;
1623 bfd_vma value;
e1fa0163 1624 bfd_boolean res;
738e5348
RS
1625
1626 /* Read the symbol's value. */
1627 BFD_ASSERT (h->root.root.type == bfd_link_hash_defined
1628 || h->root.root.type == bfd_link_hash_defweak);
1629 s = h->root.root.u.def.section;
1630 value = h->root.root.u.def.value;
1631
1632 /* Create a new symbol. */
e1fa0163 1633 name = concat (prefix, h->root.root.root.string, NULL);
738e5348 1634 bh = NULL;
e1fa0163
NC
1635 res = _bfd_generic_link_add_one_symbol (info, s->owner, name,
1636 BSF_LOCAL, s, value, NULL,
1637 TRUE, FALSE, &bh);
1638 free (name);
1639 if (! res)
738e5348
RS
1640 return FALSE;
1641
1642 /* Make it local and copy the other attributes from H. */
1643 elfh = (struct elf_link_hash_entry *) bh;
1644 elfh->type = ELF_ST_INFO (STB_LOCAL, ELF_ST_TYPE (h->root.type));
1645 elfh->other = h->root.other;
1646 elfh->size = h->root.size;
1647 elfh->forced_local = 1;
1648 return TRUE;
1649}
1650
1651/* Return TRUE if relocations in SECTION can refer directly to a MIPS16
1652 function rather than to a hard-float stub. */
1653
1654static bfd_boolean
1655section_allows_mips16_refs_p (asection *section)
1656{
1657 const char *name;
1658
1659 name = bfd_get_section_name (section->owner, section);
1660 return (FN_STUB_P (name)
1661 || CALL_STUB_P (name)
1662 || CALL_FP_STUB_P (name)
1663 || strcmp (name, ".pdr") == 0);
1664}
1665
1666/* [RELOCS, RELEND) are the relocations against SEC, which is a MIPS16
1667 stub section of some kind. Return the R_SYMNDX of the target
1668 function, or 0 if we can't decide which function that is. */
1669
1670static unsigned long
cb4437b8
MR
1671mips16_stub_symndx (const struct elf_backend_data *bed,
1672 asection *sec ATTRIBUTE_UNUSED,
502e814e 1673 const Elf_Internal_Rela *relocs,
738e5348
RS
1674 const Elf_Internal_Rela *relend)
1675{
cb4437b8 1676 int int_rels_per_ext_rel = bed->s->int_rels_per_ext_rel;
738e5348
RS
1677 const Elf_Internal_Rela *rel;
1678
cb4437b8
MR
1679 /* Trust the first R_MIPS_NONE relocation, if any, but not a subsequent
1680 one in a compound relocation. */
1681 for (rel = relocs; rel < relend; rel += int_rels_per_ext_rel)
738e5348
RS
1682 if (ELF_R_TYPE (sec->owner, rel->r_info) == R_MIPS_NONE)
1683 return ELF_R_SYM (sec->owner, rel->r_info);
1684
1685 /* Otherwise trust the first relocation, whatever its kind. This is
1686 the traditional behavior. */
1687 if (relocs < relend)
1688 return ELF_R_SYM (sec->owner, relocs->r_info);
1689
1690 return 0;
1691}
b49e97c9
TS
1692
1693/* Check the mips16 stubs for a particular symbol, and see if we can
1694 discard them. */
1695
861fb55a
DJ
1696static void
1697mips_elf_check_mips16_stubs (struct bfd_link_info *info,
1698 struct mips_elf_link_hash_entry *h)
b49e97c9 1699{
738e5348
RS
1700 /* Dynamic symbols must use the standard call interface, in case other
1701 objects try to call them. */
1702 if (h->fn_stub != NULL
1703 && h->root.dynindx != -1)
1704 {
1705 mips_elf_create_shadow_symbol (info, h, ".mips16.");
1706 h->need_fn_stub = TRUE;
1707 }
1708
b49e97c9
TS
1709 if (h->fn_stub != NULL
1710 && ! h->need_fn_stub)
1711 {
1712 /* We don't need the fn_stub; the only references to this symbol
1713 are 16 bit calls. Clobber the size to 0 to prevent it from
1714 being included in the link. */
eea6121a 1715 h->fn_stub->size = 0;
b49e97c9
TS
1716 h->fn_stub->flags &= ~SEC_RELOC;
1717 h->fn_stub->reloc_count = 0;
1718 h->fn_stub->flags |= SEC_EXCLUDE;
ca9584fb 1719 h->fn_stub->output_section = bfd_abs_section_ptr;
b49e97c9
TS
1720 }
1721
1722 if (h->call_stub != NULL
30c09090 1723 && ELF_ST_IS_MIPS16 (h->root.other))
b49e97c9
TS
1724 {
1725 /* We don't need the call_stub; this is a 16 bit function, so
1726 calls from other 16 bit functions are OK. Clobber the size
1727 to 0 to prevent it from being included in the link. */
eea6121a 1728 h->call_stub->size = 0;
b49e97c9
TS
1729 h->call_stub->flags &= ~SEC_RELOC;
1730 h->call_stub->reloc_count = 0;
1731 h->call_stub->flags |= SEC_EXCLUDE;
ca9584fb 1732 h->call_stub->output_section = bfd_abs_section_ptr;
b49e97c9
TS
1733 }
1734
1735 if (h->call_fp_stub != NULL
30c09090 1736 && ELF_ST_IS_MIPS16 (h->root.other))
b49e97c9
TS
1737 {
1738 /* We don't need the call_stub; this is a 16 bit function, so
1739 calls from other 16 bit functions are OK. Clobber the size
1740 to 0 to prevent it from being included in the link. */
eea6121a 1741 h->call_fp_stub->size = 0;
b49e97c9
TS
1742 h->call_fp_stub->flags &= ~SEC_RELOC;
1743 h->call_fp_stub->reloc_count = 0;
1744 h->call_fp_stub->flags |= SEC_EXCLUDE;
ca9584fb 1745 h->call_fp_stub->output_section = bfd_abs_section_ptr;
b49e97c9 1746 }
861fb55a
DJ
1747}
1748
1749/* Hashtable callbacks for mips_elf_la25_stubs. */
1750
1751static hashval_t
1752mips_elf_la25_stub_hash (const void *entry_)
1753{
1754 const struct mips_elf_la25_stub *entry;
1755
1756 entry = (struct mips_elf_la25_stub *) entry_;
1757 return entry->h->root.root.u.def.section->id
1758 + entry->h->root.root.u.def.value;
1759}
1760
1761static int
1762mips_elf_la25_stub_eq (const void *entry1_, const void *entry2_)
1763{
1764 const struct mips_elf_la25_stub *entry1, *entry2;
1765
1766 entry1 = (struct mips_elf_la25_stub *) entry1_;
1767 entry2 = (struct mips_elf_la25_stub *) entry2_;
1768 return ((entry1->h->root.root.u.def.section
1769 == entry2->h->root.root.u.def.section)
1770 && (entry1->h->root.root.u.def.value
1771 == entry2->h->root.root.u.def.value));
1772}
1773
1774/* Called by the linker to set up the la25 stub-creation code. FN is
1775 the linker's implementation of add_stub_function. Return true on
1776 success. */
1777
1778bfd_boolean
1779_bfd_mips_elf_init_stubs (struct bfd_link_info *info,
1780 asection *(*fn) (const char *, asection *,
1781 asection *))
1782{
1783 struct mips_elf_link_hash_table *htab;
1784
1785 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
1786 if (htab == NULL)
1787 return FALSE;
1788
861fb55a
DJ
1789 htab->add_stub_section = fn;
1790 htab->la25_stubs = htab_try_create (1, mips_elf_la25_stub_hash,
1791 mips_elf_la25_stub_eq, NULL);
1792 if (htab->la25_stubs == NULL)
1793 return FALSE;
1794
1795 return TRUE;
1796}
1797
1798/* Return true if H is a locally-defined PIC function, in the sense
8f0c309a
CLT
1799 that it or its fn_stub might need $25 to be valid on entry.
1800 Note that MIPS16 functions set up $gp using PC-relative instructions,
1801 so they themselves never need $25 to be valid. Only non-MIPS16
1802 entry points are of interest here. */
861fb55a
DJ
1803
1804static bfd_boolean
1805mips_elf_local_pic_function_p (struct mips_elf_link_hash_entry *h)
1806{
1807 return ((h->root.root.type == bfd_link_hash_defined
1808 || h->root.root.type == bfd_link_hash_defweak)
1809 && h->root.def_regular
1810 && !bfd_is_abs_section (h->root.root.u.def.section)
8f0c309a
CLT
1811 && (!ELF_ST_IS_MIPS16 (h->root.other)
1812 || (h->fn_stub && h->need_fn_stub))
861fb55a
DJ
1813 && (PIC_OBJECT_P (h->root.root.u.def.section->owner)
1814 || ELF_ST_IS_MIPS_PIC (h->root.other)));
1815}
1816
8f0c309a
CLT
1817/* Set *SEC to the input section that contains the target of STUB.
1818 Return the offset of the target from the start of that section. */
1819
1820static bfd_vma
1821mips_elf_get_la25_target (struct mips_elf_la25_stub *stub,
1822 asection **sec)
1823{
1824 if (ELF_ST_IS_MIPS16 (stub->h->root.other))
1825 {
1826 BFD_ASSERT (stub->h->need_fn_stub);
1827 *sec = stub->h->fn_stub;
1828 return 0;
1829 }
1830 else
1831 {
1832 *sec = stub->h->root.root.u.def.section;
1833 return stub->h->root.root.u.def.value;
1834 }
1835}
1836
861fb55a
DJ
1837/* STUB describes an la25 stub that we have decided to implement
1838 by inserting an LUI/ADDIU pair before the target function.
1839 Create the section and redirect the function symbol to it. */
1840
1841static bfd_boolean
1842mips_elf_add_la25_intro (struct mips_elf_la25_stub *stub,
1843 struct bfd_link_info *info)
1844{
1845 struct mips_elf_link_hash_table *htab;
1846 char *name;
1847 asection *s, *input_section;
1848 unsigned int align;
1849
1850 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
1851 if (htab == NULL)
1852 return FALSE;
861fb55a
DJ
1853
1854 /* Create a unique name for the new section. */
1855 name = bfd_malloc (11 + sizeof (".text.stub."));
1856 if (name == NULL)
1857 return FALSE;
1858 sprintf (name, ".text.stub.%d", (int) htab_elements (htab->la25_stubs));
1859
1860 /* Create the section. */
8f0c309a 1861 mips_elf_get_la25_target (stub, &input_section);
861fb55a
DJ
1862 s = htab->add_stub_section (name, input_section,
1863 input_section->output_section);
1864 if (s == NULL)
1865 return FALSE;
1866
1867 /* Make sure that any padding goes before the stub. */
1868 align = input_section->alignment_power;
1869 if (!bfd_set_section_alignment (s->owner, s, align))
1870 return FALSE;
1871 if (align > 3)
1872 s->size = (1 << align) - 8;
1873
1874 /* Create a symbol for the stub. */
1875 mips_elf_create_stub_symbol (info, stub->h, ".pic.", s, s->size, 8);
1876 stub->stub_section = s;
1877 stub->offset = s->size;
1878
1879 /* Allocate room for it. */
1880 s->size += 8;
1881 return TRUE;
1882}
1883
1884/* STUB describes an la25 stub that we have decided to implement
1885 with a separate trampoline. Allocate room for it and redirect
1886 the function symbol to it. */
1887
1888static bfd_boolean
1889mips_elf_add_la25_trampoline (struct mips_elf_la25_stub *stub,
1890 struct bfd_link_info *info)
1891{
1892 struct mips_elf_link_hash_table *htab;
1893 asection *s;
1894
1895 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
1896 if (htab == NULL)
1897 return FALSE;
861fb55a
DJ
1898
1899 /* Create a trampoline section, if we haven't already. */
1900 s = htab->strampoline;
1901 if (s == NULL)
1902 {
1903 asection *input_section = stub->h->root.root.u.def.section;
1904 s = htab->add_stub_section (".text", NULL,
1905 input_section->output_section);
1906 if (s == NULL || !bfd_set_section_alignment (s->owner, s, 4))
1907 return FALSE;
1908 htab->strampoline = s;
1909 }
1910
1911 /* Create a symbol for the stub. */
1912 mips_elf_create_stub_symbol (info, stub->h, ".pic.", s, s->size, 16);
1913 stub->stub_section = s;
1914 stub->offset = s->size;
1915
1916 /* Allocate room for it. */
1917 s->size += 16;
1918 return TRUE;
1919}
1920
1921/* H describes a symbol that needs an la25 stub. Make sure that an
1922 appropriate stub exists and point H at it. */
1923
1924static bfd_boolean
1925mips_elf_add_la25_stub (struct bfd_link_info *info,
1926 struct mips_elf_link_hash_entry *h)
1927{
1928 struct mips_elf_link_hash_table *htab;
1929 struct mips_elf_la25_stub search, *stub;
1930 bfd_boolean use_trampoline_p;
1931 asection *s;
1932 bfd_vma value;
1933 void **slot;
1934
861fb55a
DJ
1935 /* Describe the stub we want. */
1936 search.stub_section = NULL;
1937 search.offset = 0;
1938 search.h = h;
1939
1940 /* See if we've already created an equivalent stub. */
1941 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
1942 if (htab == NULL)
1943 return FALSE;
1944
861fb55a
DJ
1945 slot = htab_find_slot (htab->la25_stubs, &search, INSERT);
1946 if (slot == NULL)
1947 return FALSE;
1948
1949 stub = (struct mips_elf_la25_stub *) *slot;
1950 if (stub != NULL)
1951 {
1952 /* We can reuse the existing stub. */
1953 h->la25_stub = stub;
1954 return TRUE;
1955 }
1956
1957 /* Create a permanent copy of ENTRY and add it to the hash table. */
1958 stub = bfd_malloc (sizeof (search));
1959 if (stub == NULL)
1960 return FALSE;
1961 *stub = search;
1962 *slot = stub;
1963
8f0c309a
CLT
1964 /* Prefer to use LUI/ADDIU stubs if the function is at the beginning
1965 of the section and if we would need no more than 2 nops. */
1966 value = mips_elf_get_la25_target (stub, &s);
fe152e64
MR
1967 if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
1968 value &= ~1;
8f0c309a
CLT
1969 use_trampoline_p = (value != 0 || s->alignment_power > 4);
1970
861fb55a
DJ
1971 h->la25_stub = stub;
1972 return (use_trampoline_p
1973 ? mips_elf_add_la25_trampoline (stub, info)
1974 : mips_elf_add_la25_intro (stub, info));
1975}
1976
1977/* A mips_elf_link_hash_traverse callback that is called before sizing
1978 sections. DATA points to a mips_htab_traverse_info structure. */
1979
1980static bfd_boolean
1981mips_elf_check_symbols (struct mips_elf_link_hash_entry *h, void *data)
1982{
1983 struct mips_htab_traverse_info *hti;
1984
1985 hti = (struct mips_htab_traverse_info *) data;
0e1862bb 1986 if (!bfd_link_relocatable (hti->info))
861fb55a 1987 mips_elf_check_mips16_stubs (hti->info, h);
b49e97c9 1988
861fb55a
DJ
1989 if (mips_elf_local_pic_function_p (h))
1990 {
ba85c43e
NC
1991 /* PR 12845: If H is in a section that has been garbage
1992 collected it will have its output section set to *ABS*. */
1993 if (bfd_is_abs_section (h->root.root.u.def.section->output_section))
1994 return TRUE;
1995
861fb55a
DJ
1996 /* H is a function that might need $25 to be valid on entry.
1997 If we're creating a non-PIC relocatable object, mark H as
1998 being PIC. If we're creating a non-relocatable object with
1999 non-PIC branches and jumps to H, make sure that H has an la25
2000 stub. */
0e1862bb 2001 if (bfd_link_relocatable (hti->info))
861fb55a
DJ
2002 {
2003 if (!PIC_OBJECT_P (hti->output_bfd))
2004 h->root.other = ELF_ST_SET_MIPS_PIC (h->root.other);
2005 }
2006 else if (h->has_nonpic_branches && !mips_elf_add_la25_stub (hti->info, h))
2007 {
2008 hti->error = TRUE;
2009 return FALSE;
2010 }
2011 }
b34976b6 2012 return TRUE;
b49e97c9
TS
2013}
2014\f
d6f16593
MR
2015/* R_MIPS16_26 is used for the mips16 jal and jalx instructions.
2016 Most mips16 instructions are 16 bits, but these instructions
2017 are 32 bits.
2018
2019 The format of these instructions is:
2020
2021 +--------------+--------------------------------+
2022 | JALX | X| Imm 20:16 | Imm 25:21 |
2023 +--------------+--------------------------------+
2024 | Immediate 15:0 |
2025 +-----------------------------------------------+
2026
2027 JALX is the 5-bit value 00011. X is 0 for jal, 1 for jalx.
2028 Note that the immediate value in the first word is swapped.
2029
2030 When producing a relocatable object file, R_MIPS16_26 is
2031 handled mostly like R_MIPS_26. In particular, the addend is
2032 stored as a straight 26-bit value in a 32-bit instruction.
2033 (gas makes life simpler for itself by never adjusting a
2034 R_MIPS16_26 reloc to be against a section, so the addend is
2035 always zero). However, the 32 bit instruction is stored as 2
2036 16-bit values, rather than a single 32-bit value. In a
2037 big-endian file, the result is the same; in a little-endian
2038 file, the two 16-bit halves of the 32 bit value are swapped.
2039 This is so that a disassembler can recognize the jal
2040 instruction.
2041
2042 When doing a final link, R_MIPS16_26 is treated as a 32 bit
2043 instruction stored as two 16-bit values. The addend A is the
2044 contents of the targ26 field. The calculation is the same as
2045 R_MIPS_26. When storing the calculated value, reorder the
2046 immediate value as shown above, and don't forget to store the
2047 value as two 16-bit values.
2048
2049 To put it in MIPS ABI terms, the relocation field is T-targ26-16,
2050 defined as
2051
2052 big-endian:
2053 +--------+----------------------+
2054 | | |
2055 | | targ26-16 |
2056 |31 26|25 0|
2057 +--------+----------------------+
2058
2059 little-endian:
2060 +----------+------+-------------+
2061 | | | |
2062 | sub1 | | sub2 |
2063 |0 9|10 15|16 31|
2064 +----------+--------------------+
2065 where targ26-16 is sub1 followed by sub2 (i.e., the addend field A is
2066 ((sub1 << 16) | sub2)).
2067
2068 When producing a relocatable object file, the calculation is
2069 (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
2070 When producing a fully linked file, the calculation is
2071 let R = (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
2072 ((R & 0x1f0000) << 5) | ((R & 0x3e00000) >> 5) | (R & 0xffff)
2073
738e5348
RS
2074 The table below lists the other MIPS16 instruction relocations.
2075 Each one is calculated in the same way as the non-MIPS16 relocation
2076 given on the right, but using the extended MIPS16 layout of 16-bit
2077 immediate fields:
2078
2079 R_MIPS16_GPREL R_MIPS_GPREL16
2080 R_MIPS16_GOT16 R_MIPS_GOT16
2081 R_MIPS16_CALL16 R_MIPS_CALL16
2082 R_MIPS16_HI16 R_MIPS_HI16
2083 R_MIPS16_LO16 R_MIPS_LO16
2084
2085 A typical instruction will have a format like this:
d6f16593
MR
2086
2087 +--------------+--------------------------------+
2088 | EXTEND | Imm 10:5 | Imm 15:11 |
2089 +--------------+--------------------------------+
2090 | Major | rx | ry | Imm 4:0 |
2091 +--------------+--------------------------------+
2092
2093 EXTEND is the five bit value 11110. Major is the instruction
2094 opcode.
2095
738e5348
RS
2096 All we need to do here is shuffle the bits appropriately.
2097 As above, the two 16-bit halves must be swapped on a
c9775dde
MR
2098 little-endian system.
2099
2100 Finally R_MIPS16_PC16_S1 corresponds to R_MIPS_PC16, however the
2101 relocatable field is shifted by 1 rather than 2 and the same bit
2102 shuffling is done as with the relocations above. */
738e5348
RS
2103
2104static inline bfd_boolean
2105mips16_reloc_p (int r_type)
2106{
2107 switch (r_type)
2108 {
2109 case R_MIPS16_26:
2110 case R_MIPS16_GPREL:
2111 case R_MIPS16_GOT16:
2112 case R_MIPS16_CALL16:
2113 case R_MIPS16_HI16:
2114 case R_MIPS16_LO16:
d0f13682
CLT
2115 case R_MIPS16_TLS_GD:
2116 case R_MIPS16_TLS_LDM:
2117 case R_MIPS16_TLS_DTPREL_HI16:
2118 case R_MIPS16_TLS_DTPREL_LO16:
2119 case R_MIPS16_TLS_GOTTPREL:
2120 case R_MIPS16_TLS_TPREL_HI16:
2121 case R_MIPS16_TLS_TPREL_LO16:
c9775dde 2122 case R_MIPS16_PC16_S1:
738e5348
RS
2123 return TRUE;
2124
2125 default:
2126 return FALSE;
2127 }
2128}
2129
df58fc94
RS
2130/* Check if a microMIPS reloc. */
2131
2132static inline bfd_boolean
2133micromips_reloc_p (unsigned int r_type)
2134{
2135 return r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max;
2136}
2137
2138/* Similar to MIPS16, the two 16-bit halves in microMIPS must be swapped
2139 on a little-endian system. This does not apply to R_MICROMIPS_PC7_S1
2140 and R_MICROMIPS_PC10_S1 relocs that apply to 16-bit instructions. */
2141
2142static inline bfd_boolean
2143micromips_reloc_shuffle_p (unsigned int r_type)
2144{
2145 return (micromips_reloc_p (r_type)
2146 && r_type != R_MICROMIPS_PC7_S1
2147 && r_type != R_MICROMIPS_PC10_S1);
2148}
2149
738e5348
RS
2150static inline bfd_boolean
2151got16_reloc_p (int r_type)
2152{
df58fc94
RS
2153 return (r_type == R_MIPS_GOT16
2154 || r_type == R_MIPS16_GOT16
2155 || r_type == R_MICROMIPS_GOT16);
738e5348
RS
2156}
2157
2158static inline bfd_boolean
2159call16_reloc_p (int r_type)
2160{
df58fc94
RS
2161 return (r_type == R_MIPS_CALL16
2162 || r_type == R_MIPS16_CALL16
2163 || r_type == R_MICROMIPS_CALL16);
2164}
2165
2166static inline bfd_boolean
2167got_disp_reloc_p (unsigned int r_type)
2168{
2169 return r_type == R_MIPS_GOT_DISP || r_type == R_MICROMIPS_GOT_DISP;
2170}
2171
2172static inline bfd_boolean
2173got_page_reloc_p (unsigned int r_type)
2174{
2175 return r_type == R_MIPS_GOT_PAGE || r_type == R_MICROMIPS_GOT_PAGE;
2176}
2177
df58fc94
RS
2178static inline bfd_boolean
2179got_lo16_reloc_p (unsigned int r_type)
2180{
2181 return r_type == R_MIPS_GOT_LO16 || r_type == R_MICROMIPS_GOT_LO16;
2182}
2183
2184static inline bfd_boolean
2185call_hi16_reloc_p (unsigned int r_type)
2186{
2187 return r_type == R_MIPS_CALL_HI16 || r_type == R_MICROMIPS_CALL_HI16;
2188}
2189
2190static inline bfd_boolean
2191call_lo16_reloc_p (unsigned int r_type)
2192{
2193 return r_type == R_MIPS_CALL_LO16 || r_type == R_MICROMIPS_CALL_LO16;
738e5348
RS
2194}
2195
2196static inline bfd_boolean
2197hi16_reloc_p (int r_type)
2198{
df58fc94
RS
2199 return (r_type == R_MIPS_HI16
2200 || r_type == R_MIPS16_HI16
7361da2c
AB
2201 || r_type == R_MICROMIPS_HI16
2202 || r_type == R_MIPS_PCHI16);
738e5348 2203}
d6f16593 2204
738e5348
RS
2205static inline bfd_boolean
2206lo16_reloc_p (int r_type)
2207{
df58fc94
RS
2208 return (r_type == R_MIPS_LO16
2209 || r_type == R_MIPS16_LO16
7361da2c
AB
2210 || r_type == R_MICROMIPS_LO16
2211 || r_type == R_MIPS_PCLO16);
738e5348
RS
2212}
2213
2214static inline bfd_boolean
2215mips16_call_reloc_p (int r_type)
2216{
2217 return r_type == R_MIPS16_26 || r_type == R_MIPS16_CALL16;
2218}
d6f16593 2219
38a7df63
CF
2220static inline bfd_boolean
2221jal_reloc_p (int r_type)
2222{
df58fc94
RS
2223 return (r_type == R_MIPS_26
2224 || r_type == R_MIPS16_26
2225 || r_type == R_MICROMIPS_26_S1);
2226}
2227
99aefae6
MR
2228static inline bfd_boolean
2229b_reloc_p (int r_type)
2230{
2231 return (r_type == R_MIPS_PC26_S2
2232 || r_type == R_MIPS_PC21_S2
2233 || r_type == R_MIPS_PC16
c9775dde 2234 || r_type == R_MIPS_GNU_REL16_S2
9d862524
MR
2235 || r_type == R_MIPS16_PC16_S1
2236 || r_type == R_MICROMIPS_PC16_S1
2237 || r_type == R_MICROMIPS_PC10_S1
2238 || r_type == R_MICROMIPS_PC7_S1);
99aefae6
MR
2239}
2240
7361da2c
AB
2241static inline bfd_boolean
2242aligned_pcrel_reloc_p (int r_type)
2243{
2244 return (r_type == R_MIPS_PC18_S3
2245 || r_type == R_MIPS_PC19_S2);
2246}
2247
9d862524
MR
2248static inline bfd_boolean
2249branch_reloc_p (int r_type)
2250{
2251 return (r_type == R_MIPS_26
2252 || r_type == R_MIPS_PC26_S2
2253 || r_type == R_MIPS_PC21_S2
2254 || r_type == R_MIPS_PC16
2255 || r_type == R_MIPS_GNU_REL16_S2);
2256}
2257
c9775dde
MR
2258static inline bfd_boolean
2259mips16_branch_reloc_p (int r_type)
2260{
2261 return (r_type == R_MIPS16_26
2262 || r_type == R_MIPS16_PC16_S1);
2263}
2264
df58fc94
RS
2265static inline bfd_boolean
2266micromips_branch_reloc_p (int r_type)
2267{
2268 return (r_type == R_MICROMIPS_26_S1
2269 || r_type == R_MICROMIPS_PC16_S1
2270 || r_type == R_MICROMIPS_PC10_S1
2271 || r_type == R_MICROMIPS_PC7_S1);
2272}
2273
2274static inline bfd_boolean
2275tls_gd_reloc_p (unsigned int r_type)
2276{
d0f13682
CLT
2277 return (r_type == R_MIPS_TLS_GD
2278 || r_type == R_MIPS16_TLS_GD
2279 || r_type == R_MICROMIPS_TLS_GD);
df58fc94
RS
2280}
2281
2282static inline bfd_boolean
2283tls_ldm_reloc_p (unsigned int r_type)
2284{
d0f13682
CLT
2285 return (r_type == R_MIPS_TLS_LDM
2286 || r_type == R_MIPS16_TLS_LDM
2287 || r_type == R_MICROMIPS_TLS_LDM);
df58fc94
RS
2288}
2289
2290static inline bfd_boolean
2291tls_gottprel_reloc_p (unsigned int r_type)
2292{
d0f13682
CLT
2293 return (r_type == R_MIPS_TLS_GOTTPREL
2294 || r_type == R_MIPS16_TLS_GOTTPREL
2295 || r_type == R_MICROMIPS_TLS_GOTTPREL);
38a7df63
CF
2296}
2297
d6f16593 2298void
df58fc94
RS
2299_bfd_mips_elf_reloc_unshuffle (bfd *abfd, int r_type,
2300 bfd_boolean jal_shuffle, bfd_byte *data)
d6f16593 2301{
df58fc94 2302 bfd_vma first, second, val;
d6f16593 2303
df58fc94 2304 if (!mips16_reloc_p (r_type) && !micromips_reloc_shuffle_p (r_type))
d6f16593
MR
2305 return;
2306
df58fc94
RS
2307 /* Pick up the first and second halfwords of the instruction. */
2308 first = bfd_get_16 (abfd, data);
2309 second = bfd_get_16 (abfd, data + 2);
2310 if (micromips_reloc_p (r_type) || (r_type == R_MIPS16_26 && !jal_shuffle))
2311 val = first << 16 | second;
2312 else if (r_type != R_MIPS16_26)
2313 val = (((first & 0xf800) << 16) | ((second & 0xffe0) << 11)
2314 | ((first & 0x1f) << 11) | (first & 0x7e0) | (second & 0x1f));
d6f16593 2315 else
df58fc94
RS
2316 val = (((first & 0xfc00) << 16) | ((first & 0x3e0) << 11)
2317 | ((first & 0x1f) << 21) | second);
d6f16593
MR
2318 bfd_put_32 (abfd, val, data);
2319}
2320
2321void
df58fc94
RS
2322_bfd_mips_elf_reloc_shuffle (bfd *abfd, int r_type,
2323 bfd_boolean jal_shuffle, bfd_byte *data)
d6f16593 2324{
df58fc94 2325 bfd_vma first, second, val;
d6f16593 2326
df58fc94 2327 if (!mips16_reloc_p (r_type) && !micromips_reloc_shuffle_p (r_type))
d6f16593
MR
2328 return;
2329
2330 val = bfd_get_32 (abfd, data);
df58fc94 2331 if (micromips_reloc_p (r_type) || (r_type == R_MIPS16_26 && !jal_shuffle))
d6f16593 2332 {
df58fc94
RS
2333 second = val & 0xffff;
2334 first = val >> 16;
2335 }
2336 else if (r_type != R_MIPS16_26)
2337 {
2338 second = ((val >> 11) & 0xffe0) | (val & 0x1f);
2339 first = ((val >> 16) & 0xf800) | ((val >> 11) & 0x1f) | (val & 0x7e0);
d6f16593
MR
2340 }
2341 else
2342 {
df58fc94
RS
2343 second = val & 0xffff;
2344 first = ((val >> 16) & 0xfc00) | ((val >> 11) & 0x3e0)
2345 | ((val >> 21) & 0x1f);
d6f16593 2346 }
df58fc94
RS
2347 bfd_put_16 (abfd, second, data + 2);
2348 bfd_put_16 (abfd, first, data);
d6f16593
MR
2349}
2350
b49e97c9 2351bfd_reloc_status_type
9719ad41
RS
2352_bfd_mips_elf_gprel16_with_gp (bfd *abfd, asymbol *symbol,
2353 arelent *reloc_entry, asection *input_section,
2354 bfd_boolean relocatable, void *data, bfd_vma gp)
b49e97c9
TS
2355{
2356 bfd_vma relocation;
a7ebbfdf 2357 bfd_signed_vma val;
30ac9238 2358 bfd_reloc_status_type status;
b49e97c9
TS
2359
2360 if (bfd_is_com_section (symbol->section))
2361 relocation = 0;
2362 else
2363 relocation = symbol->value;
2364
2365 relocation += symbol->section->output_section->vma;
2366 relocation += symbol->section->output_offset;
2367
07515404 2368 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
b49e97c9
TS
2369 return bfd_reloc_outofrange;
2370
b49e97c9 2371 /* Set val to the offset into the section or symbol. */
a7ebbfdf
TS
2372 val = reloc_entry->addend;
2373
30ac9238 2374 _bfd_mips_elf_sign_extend (val, 16);
a7ebbfdf 2375
b49e97c9 2376 /* Adjust val for the final section location and GP value. If we
1049f94e 2377 are producing relocatable output, we don't want to do this for
b49e97c9 2378 an external symbol. */
1049f94e 2379 if (! relocatable
b49e97c9
TS
2380 || (symbol->flags & BSF_SECTION_SYM) != 0)
2381 val += relocation - gp;
2382
a7ebbfdf
TS
2383 if (reloc_entry->howto->partial_inplace)
2384 {
30ac9238
RS
2385 status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
2386 (bfd_byte *) data
2387 + reloc_entry->address);
2388 if (status != bfd_reloc_ok)
2389 return status;
a7ebbfdf
TS
2390 }
2391 else
2392 reloc_entry->addend = val;
b49e97c9 2393
1049f94e 2394 if (relocatable)
b49e97c9 2395 reloc_entry->address += input_section->output_offset;
30ac9238
RS
2396
2397 return bfd_reloc_ok;
2398}
2399
2400/* Used to store a REL high-part relocation such as R_MIPS_HI16 or
2401 R_MIPS_GOT16. REL is the relocation, INPUT_SECTION is the section
2402 that contains the relocation field and DATA points to the start of
2403 INPUT_SECTION. */
2404
2405struct mips_hi16
2406{
2407 struct mips_hi16 *next;
2408 bfd_byte *data;
2409 asection *input_section;
2410 arelent rel;
2411};
2412
2413/* FIXME: This should not be a static variable. */
2414
2415static struct mips_hi16 *mips_hi16_list;
2416
2417/* A howto special_function for REL *HI16 relocations. We can only
2418 calculate the correct value once we've seen the partnering
2419 *LO16 relocation, so just save the information for later.
2420
2421 The ABI requires that the *LO16 immediately follow the *HI16.
2422 However, as a GNU extension, we permit an arbitrary number of
2423 *HI16s to be associated with a single *LO16. This significantly
2424 simplies the relocation handling in gcc. */
2425
2426bfd_reloc_status_type
2427_bfd_mips_elf_hi16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2428 asymbol *symbol ATTRIBUTE_UNUSED, void *data,
2429 asection *input_section, bfd *output_bfd,
2430 char **error_message ATTRIBUTE_UNUSED)
2431{
2432 struct mips_hi16 *n;
2433
07515404 2434 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
30ac9238
RS
2435 return bfd_reloc_outofrange;
2436
2437 n = bfd_malloc (sizeof *n);
2438 if (n == NULL)
2439 return bfd_reloc_outofrange;
2440
2441 n->next = mips_hi16_list;
2442 n->data = data;
2443 n->input_section = input_section;
2444 n->rel = *reloc_entry;
2445 mips_hi16_list = n;
2446
2447 if (output_bfd != NULL)
2448 reloc_entry->address += input_section->output_offset;
2449
2450 return bfd_reloc_ok;
2451}
2452
738e5348 2453/* A howto special_function for REL R_MIPS*_GOT16 relocations. This is just
30ac9238
RS
2454 like any other 16-bit relocation when applied to global symbols, but is
2455 treated in the same as R_MIPS_HI16 when applied to local symbols. */
2456
2457bfd_reloc_status_type
2458_bfd_mips_elf_got16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2459 void *data, asection *input_section,
2460 bfd *output_bfd, char **error_message)
2461{
2462 if ((symbol->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
2463 || bfd_is_und_section (bfd_get_section (symbol))
2464 || bfd_is_com_section (bfd_get_section (symbol)))
2465 /* The relocation is against a global symbol. */
2466 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2467 input_section, output_bfd,
2468 error_message);
2469
2470 return _bfd_mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
2471 input_section, output_bfd, error_message);
2472}
2473
2474/* A howto special_function for REL *LO16 relocations. The *LO16 itself
2475 is a straightforward 16 bit inplace relocation, but we must deal with
2476 any partnering high-part relocations as well. */
2477
2478bfd_reloc_status_type
2479_bfd_mips_elf_lo16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2480 void *data, asection *input_section,
2481 bfd *output_bfd, char **error_message)
2482{
2483 bfd_vma vallo;
d6f16593 2484 bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
30ac9238 2485
07515404 2486 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
30ac9238
RS
2487 return bfd_reloc_outofrange;
2488
df58fc94 2489 _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
d6f16593 2490 location);
df58fc94
RS
2491 vallo = bfd_get_32 (abfd, location);
2492 _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, FALSE,
2493 location);
d6f16593 2494
30ac9238
RS
2495 while (mips_hi16_list != NULL)
2496 {
2497 bfd_reloc_status_type ret;
2498 struct mips_hi16 *hi;
2499
2500 hi = mips_hi16_list;
2501
738e5348
RS
2502 /* R_MIPS*_GOT16 relocations are something of a special case. We
2503 want to install the addend in the same way as for a R_MIPS*_HI16
30ac9238
RS
2504 relocation (with a rightshift of 16). However, since GOT16
2505 relocations can also be used with global symbols, their howto
2506 has a rightshift of 0. */
2507 if (hi->rel.howto->type == R_MIPS_GOT16)
2508 hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MIPS_HI16, FALSE);
738e5348
RS
2509 else if (hi->rel.howto->type == R_MIPS16_GOT16)
2510 hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MIPS16_HI16, FALSE);
df58fc94
RS
2511 else if (hi->rel.howto->type == R_MICROMIPS_GOT16)
2512 hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MICROMIPS_HI16, FALSE);
30ac9238
RS
2513
2514 /* VALLO is a signed 16-bit number. Bias it by 0x8000 so that any
2515 carry or borrow will induce a change of +1 or -1 in the high part. */
2516 hi->rel.addend += (vallo + 0x8000) & 0xffff;
2517
30ac9238
RS
2518 ret = _bfd_mips_elf_generic_reloc (abfd, &hi->rel, symbol, hi->data,
2519 hi->input_section, output_bfd,
2520 error_message);
2521 if (ret != bfd_reloc_ok)
2522 return ret;
2523
2524 mips_hi16_list = hi->next;
2525 free (hi);
2526 }
2527
2528 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2529 input_section, output_bfd,
2530 error_message);
2531}
2532
2533/* A generic howto special_function. This calculates and installs the
2534 relocation itself, thus avoiding the oft-discussed problems in
2535 bfd_perform_relocation and bfd_install_relocation. */
2536
2537bfd_reloc_status_type
2538_bfd_mips_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2539 asymbol *symbol, void *data ATTRIBUTE_UNUSED,
2540 asection *input_section, bfd *output_bfd,
2541 char **error_message ATTRIBUTE_UNUSED)
2542{
2543 bfd_signed_vma val;
2544 bfd_reloc_status_type status;
2545 bfd_boolean relocatable;
2546
2547 relocatable = (output_bfd != NULL);
2548
07515404 2549 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
30ac9238
RS
2550 return bfd_reloc_outofrange;
2551
2552 /* Build up the field adjustment in VAL. */
2553 val = 0;
2554 if (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0)
2555 {
2556 /* Either we're calculating the final field value or we have a
2557 relocation against a section symbol. Add in the section's
2558 offset or address. */
2559 val += symbol->section->output_section->vma;
2560 val += symbol->section->output_offset;
2561 }
2562
2563 if (!relocatable)
2564 {
2565 /* We're calculating the final field value. Add in the symbol's value
2566 and, if pc-relative, subtract the address of the field itself. */
2567 val += symbol->value;
2568 if (reloc_entry->howto->pc_relative)
2569 {
2570 val -= input_section->output_section->vma;
2571 val -= input_section->output_offset;
2572 val -= reloc_entry->address;
2573 }
2574 }
2575
2576 /* VAL is now the final adjustment. If we're keeping this relocation
2577 in the output file, and if the relocation uses a separate addend,
2578 we just need to add VAL to that addend. Otherwise we need to add
2579 VAL to the relocation field itself. */
2580 if (relocatable && !reloc_entry->howto->partial_inplace)
2581 reloc_entry->addend += val;
2582 else
2583 {
d6f16593
MR
2584 bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
2585
30ac9238
RS
2586 /* Add in the separate addend, if any. */
2587 val += reloc_entry->addend;
2588
2589 /* Add VAL to the relocation field. */
df58fc94
RS
2590 _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
2591 location);
30ac9238 2592 status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
d6f16593 2593 location);
df58fc94
RS
2594 _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, FALSE,
2595 location);
d6f16593 2596
30ac9238
RS
2597 if (status != bfd_reloc_ok)
2598 return status;
2599 }
2600
2601 if (relocatable)
2602 reloc_entry->address += input_section->output_offset;
b49e97c9
TS
2603
2604 return bfd_reloc_ok;
2605}
2606\f
2607/* Swap an entry in a .gptab section. Note that these routines rely
2608 on the equivalence of the two elements of the union. */
2609
2610static void
9719ad41
RS
2611bfd_mips_elf32_swap_gptab_in (bfd *abfd, const Elf32_External_gptab *ex,
2612 Elf32_gptab *in)
b49e97c9
TS
2613{
2614 in->gt_entry.gt_g_value = H_GET_32 (abfd, ex->gt_entry.gt_g_value);
2615 in->gt_entry.gt_bytes = H_GET_32 (abfd, ex->gt_entry.gt_bytes);
2616}
2617
2618static void
9719ad41
RS
2619bfd_mips_elf32_swap_gptab_out (bfd *abfd, const Elf32_gptab *in,
2620 Elf32_External_gptab *ex)
b49e97c9
TS
2621{
2622 H_PUT_32 (abfd, in->gt_entry.gt_g_value, ex->gt_entry.gt_g_value);
2623 H_PUT_32 (abfd, in->gt_entry.gt_bytes, ex->gt_entry.gt_bytes);
2624}
2625
2626static void
9719ad41
RS
2627bfd_elf32_swap_compact_rel_out (bfd *abfd, const Elf32_compact_rel *in,
2628 Elf32_External_compact_rel *ex)
b49e97c9
TS
2629{
2630 H_PUT_32 (abfd, in->id1, ex->id1);
2631 H_PUT_32 (abfd, in->num, ex->num);
2632 H_PUT_32 (abfd, in->id2, ex->id2);
2633 H_PUT_32 (abfd, in->offset, ex->offset);
2634 H_PUT_32 (abfd, in->reserved0, ex->reserved0);
2635 H_PUT_32 (abfd, in->reserved1, ex->reserved1);
2636}
2637
2638static void
9719ad41
RS
2639bfd_elf32_swap_crinfo_out (bfd *abfd, const Elf32_crinfo *in,
2640 Elf32_External_crinfo *ex)
b49e97c9
TS
2641{
2642 unsigned long l;
2643
2644 l = (((in->ctype & CRINFO_CTYPE) << CRINFO_CTYPE_SH)
2645 | ((in->rtype & CRINFO_RTYPE) << CRINFO_RTYPE_SH)
2646 | ((in->dist2to & CRINFO_DIST2TO) << CRINFO_DIST2TO_SH)
2647 | ((in->relvaddr & CRINFO_RELVADDR) << CRINFO_RELVADDR_SH));
2648 H_PUT_32 (abfd, l, ex->info);
2649 H_PUT_32 (abfd, in->konst, ex->konst);
2650 H_PUT_32 (abfd, in->vaddr, ex->vaddr);
2651}
b49e97c9
TS
2652\f
2653/* A .reginfo section holds a single Elf32_RegInfo structure. These
2654 routines swap this structure in and out. They are used outside of
2655 BFD, so they are globally visible. */
2656
2657void
9719ad41
RS
2658bfd_mips_elf32_swap_reginfo_in (bfd *abfd, const Elf32_External_RegInfo *ex,
2659 Elf32_RegInfo *in)
b49e97c9
TS
2660{
2661 in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
2662 in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
2663 in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
2664 in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
2665 in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
2666 in->ri_gp_value = H_GET_32 (abfd, ex->ri_gp_value);
2667}
2668
2669void
9719ad41
RS
2670bfd_mips_elf32_swap_reginfo_out (bfd *abfd, const Elf32_RegInfo *in,
2671 Elf32_External_RegInfo *ex)
b49e97c9
TS
2672{
2673 H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
2674 H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
2675 H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
2676 H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
2677 H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
2678 H_PUT_32 (abfd, in->ri_gp_value, ex->ri_gp_value);
2679}
2680
2681/* In the 64 bit ABI, the .MIPS.options section holds register
2682 information in an Elf64_Reginfo structure. These routines swap
2683 them in and out. They are globally visible because they are used
2684 outside of BFD. These routines are here so that gas can call them
2685 without worrying about whether the 64 bit ABI has been included. */
2686
2687void
9719ad41
RS
2688bfd_mips_elf64_swap_reginfo_in (bfd *abfd, const Elf64_External_RegInfo *ex,
2689 Elf64_Internal_RegInfo *in)
b49e97c9
TS
2690{
2691 in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
2692 in->ri_pad = H_GET_32 (abfd, ex->ri_pad);
2693 in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
2694 in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
2695 in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
2696 in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
2697 in->ri_gp_value = H_GET_64 (abfd, ex->ri_gp_value);
2698}
2699
2700void
9719ad41
RS
2701bfd_mips_elf64_swap_reginfo_out (bfd *abfd, const Elf64_Internal_RegInfo *in,
2702 Elf64_External_RegInfo *ex)
b49e97c9
TS
2703{
2704 H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
2705 H_PUT_32 (abfd, in->ri_pad, ex->ri_pad);
2706 H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
2707 H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
2708 H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
2709 H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
2710 H_PUT_64 (abfd, in->ri_gp_value, ex->ri_gp_value);
2711}
2712
2713/* Swap in an options header. */
2714
2715void
9719ad41
RS
2716bfd_mips_elf_swap_options_in (bfd *abfd, const Elf_External_Options *ex,
2717 Elf_Internal_Options *in)
b49e97c9
TS
2718{
2719 in->kind = H_GET_8 (abfd, ex->kind);
2720 in->size = H_GET_8 (abfd, ex->size);
2721 in->section = H_GET_16 (abfd, ex->section);
2722 in->info = H_GET_32 (abfd, ex->info);
2723}
2724
2725/* Swap out an options header. */
2726
2727void
9719ad41
RS
2728bfd_mips_elf_swap_options_out (bfd *abfd, const Elf_Internal_Options *in,
2729 Elf_External_Options *ex)
b49e97c9
TS
2730{
2731 H_PUT_8 (abfd, in->kind, ex->kind);
2732 H_PUT_8 (abfd, in->size, ex->size);
2733 H_PUT_16 (abfd, in->section, ex->section);
2734 H_PUT_32 (abfd, in->info, ex->info);
2735}
351cdf24
MF
2736
2737/* Swap in an abiflags structure. */
2738
2739void
2740bfd_mips_elf_swap_abiflags_v0_in (bfd *abfd,
2741 const Elf_External_ABIFlags_v0 *ex,
2742 Elf_Internal_ABIFlags_v0 *in)
2743{
2744 in->version = H_GET_16 (abfd, ex->version);
2745 in->isa_level = H_GET_8 (abfd, ex->isa_level);
2746 in->isa_rev = H_GET_8 (abfd, ex->isa_rev);
2747 in->gpr_size = H_GET_8 (abfd, ex->gpr_size);
2748 in->cpr1_size = H_GET_8 (abfd, ex->cpr1_size);
2749 in->cpr2_size = H_GET_8 (abfd, ex->cpr2_size);
2750 in->fp_abi = H_GET_8 (abfd, ex->fp_abi);
2751 in->isa_ext = H_GET_32 (abfd, ex->isa_ext);
2752 in->ases = H_GET_32 (abfd, ex->ases);
2753 in->flags1 = H_GET_32 (abfd, ex->flags1);
2754 in->flags2 = H_GET_32 (abfd, ex->flags2);
2755}
2756
2757/* Swap out an abiflags structure. */
2758
2759void
2760bfd_mips_elf_swap_abiflags_v0_out (bfd *abfd,
2761 const Elf_Internal_ABIFlags_v0 *in,
2762 Elf_External_ABIFlags_v0 *ex)
2763{
2764 H_PUT_16 (abfd, in->version, ex->version);
2765 H_PUT_8 (abfd, in->isa_level, ex->isa_level);
2766 H_PUT_8 (abfd, in->isa_rev, ex->isa_rev);
2767 H_PUT_8 (abfd, in->gpr_size, ex->gpr_size);
2768 H_PUT_8 (abfd, in->cpr1_size, ex->cpr1_size);
2769 H_PUT_8 (abfd, in->cpr2_size, ex->cpr2_size);
2770 H_PUT_8 (abfd, in->fp_abi, ex->fp_abi);
2771 H_PUT_32 (abfd, in->isa_ext, ex->isa_ext);
2772 H_PUT_32 (abfd, in->ases, ex->ases);
2773 H_PUT_32 (abfd, in->flags1, ex->flags1);
2774 H_PUT_32 (abfd, in->flags2, ex->flags2);
2775}
b49e97c9
TS
2776\f
2777/* This function is called via qsort() to sort the dynamic relocation
2778 entries by increasing r_symndx value. */
2779
2780static int
9719ad41 2781sort_dynamic_relocs (const void *arg1, const void *arg2)
b49e97c9 2782{
947216bf
AM
2783 Elf_Internal_Rela int_reloc1;
2784 Elf_Internal_Rela int_reloc2;
6870500c 2785 int diff;
b49e97c9 2786
947216bf
AM
2787 bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg1, &int_reloc1);
2788 bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg2, &int_reloc2);
b49e97c9 2789
6870500c
RS
2790 diff = ELF32_R_SYM (int_reloc1.r_info) - ELF32_R_SYM (int_reloc2.r_info);
2791 if (diff != 0)
2792 return diff;
2793
2794 if (int_reloc1.r_offset < int_reloc2.r_offset)
2795 return -1;
2796 if (int_reloc1.r_offset > int_reloc2.r_offset)
2797 return 1;
2798 return 0;
b49e97c9
TS
2799}
2800
f4416af6
AO
2801/* Like sort_dynamic_relocs, but used for elf64 relocations. */
2802
2803static int
7e3102a7
AM
2804sort_dynamic_relocs_64 (const void *arg1 ATTRIBUTE_UNUSED,
2805 const void *arg2 ATTRIBUTE_UNUSED)
f4416af6 2806{
7e3102a7 2807#ifdef BFD64
f4416af6
AO
2808 Elf_Internal_Rela int_reloc1[3];
2809 Elf_Internal_Rela int_reloc2[3];
2810
2811 (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
2812 (reldyn_sorting_bfd, arg1, int_reloc1);
2813 (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
2814 (reldyn_sorting_bfd, arg2, int_reloc2);
2815
6870500c
RS
2816 if (ELF64_R_SYM (int_reloc1[0].r_info) < ELF64_R_SYM (int_reloc2[0].r_info))
2817 return -1;
2818 if (ELF64_R_SYM (int_reloc1[0].r_info) > ELF64_R_SYM (int_reloc2[0].r_info))
2819 return 1;
2820
2821 if (int_reloc1[0].r_offset < int_reloc2[0].r_offset)
2822 return -1;
2823 if (int_reloc1[0].r_offset > int_reloc2[0].r_offset)
2824 return 1;
2825 return 0;
7e3102a7
AM
2826#else
2827 abort ();
2828#endif
f4416af6
AO
2829}
2830
2831
b49e97c9
TS
2832/* This routine is used to write out ECOFF debugging external symbol
2833 information. It is called via mips_elf_link_hash_traverse. The
2834 ECOFF external symbol information must match the ELF external
2835 symbol information. Unfortunately, at this point we don't know
2836 whether a symbol is required by reloc information, so the two
2837 tables may wind up being different. We must sort out the external
2838 symbol information before we can set the final size of the .mdebug
2839 section, and we must set the size of the .mdebug section before we
2840 can relocate any sections, and we can't know which symbols are
2841 required by relocation until we relocate the sections.
2842 Fortunately, it is relatively unlikely that any symbol will be
2843 stripped but required by a reloc. In particular, it can not happen
2844 when generating a final executable. */
2845
b34976b6 2846static bfd_boolean
9719ad41 2847mips_elf_output_extsym (struct mips_elf_link_hash_entry *h, void *data)
b49e97c9 2848{
9719ad41 2849 struct extsym_info *einfo = data;
b34976b6 2850 bfd_boolean strip;
b49e97c9
TS
2851 asection *sec, *output_section;
2852
b49e97c9 2853 if (h->root.indx == -2)
b34976b6 2854 strip = FALSE;
f5385ebf 2855 else if ((h->root.def_dynamic
77cfaee6
AM
2856 || h->root.ref_dynamic
2857 || h->root.type == bfd_link_hash_new)
f5385ebf
AM
2858 && !h->root.def_regular
2859 && !h->root.ref_regular)
b34976b6 2860 strip = TRUE;
b49e97c9
TS
2861 else if (einfo->info->strip == strip_all
2862 || (einfo->info->strip == strip_some
2863 && bfd_hash_lookup (einfo->info->keep_hash,
2864 h->root.root.root.string,
b34976b6
AM
2865 FALSE, FALSE) == NULL))
2866 strip = TRUE;
b49e97c9 2867 else
b34976b6 2868 strip = FALSE;
b49e97c9
TS
2869
2870 if (strip)
b34976b6 2871 return TRUE;
b49e97c9
TS
2872
2873 if (h->esym.ifd == -2)
2874 {
2875 h->esym.jmptbl = 0;
2876 h->esym.cobol_main = 0;
2877 h->esym.weakext = 0;
2878 h->esym.reserved = 0;
2879 h->esym.ifd = ifdNil;
2880 h->esym.asym.value = 0;
2881 h->esym.asym.st = stGlobal;
2882
2883 if (h->root.root.type == bfd_link_hash_undefined
2884 || h->root.root.type == bfd_link_hash_undefweak)
2885 {
2886 const char *name;
2887
2888 /* Use undefined class. Also, set class and type for some
2889 special symbols. */
2890 name = h->root.root.root.string;
2891 if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
2892 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
2893 {
2894 h->esym.asym.sc = scData;
2895 h->esym.asym.st = stLabel;
2896 h->esym.asym.value = 0;
2897 }
2898 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
2899 {
2900 h->esym.asym.sc = scAbs;
2901 h->esym.asym.st = stLabel;
2902 h->esym.asym.value =
2903 mips_elf_hash_table (einfo->info)->procedure_count;
2904 }
4a14403c 2905 else if (strcmp (name, "_gp_disp") == 0 && ! NEWABI_P (einfo->abfd))
b49e97c9
TS
2906 {
2907 h->esym.asym.sc = scAbs;
2908 h->esym.asym.st = stLabel;
2909 h->esym.asym.value = elf_gp (einfo->abfd);
2910 }
2911 else
2912 h->esym.asym.sc = scUndefined;
2913 }
2914 else if (h->root.root.type != bfd_link_hash_defined
2915 && h->root.root.type != bfd_link_hash_defweak)
2916 h->esym.asym.sc = scAbs;
2917 else
2918 {
2919 const char *name;
2920
2921 sec = h->root.root.u.def.section;
2922 output_section = sec->output_section;
2923
2924 /* When making a shared library and symbol h is the one from
2925 the another shared library, OUTPUT_SECTION may be null. */
2926 if (output_section == NULL)
2927 h->esym.asym.sc = scUndefined;
2928 else
2929 {
2930 name = bfd_section_name (output_section->owner, output_section);
2931
2932 if (strcmp (name, ".text") == 0)
2933 h->esym.asym.sc = scText;
2934 else if (strcmp (name, ".data") == 0)
2935 h->esym.asym.sc = scData;
2936 else if (strcmp (name, ".sdata") == 0)
2937 h->esym.asym.sc = scSData;
2938 else if (strcmp (name, ".rodata") == 0
2939 || strcmp (name, ".rdata") == 0)
2940 h->esym.asym.sc = scRData;
2941 else if (strcmp (name, ".bss") == 0)
2942 h->esym.asym.sc = scBss;
2943 else if (strcmp (name, ".sbss") == 0)
2944 h->esym.asym.sc = scSBss;
2945 else if (strcmp (name, ".init") == 0)
2946 h->esym.asym.sc = scInit;
2947 else if (strcmp (name, ".fini") == 0)
2948 h->esym.asym.sc = scFini;
2949 else
2950 h->esym.asym.sc = scAbs;
2951 }
2952 }
2953
2954 h->esym.asym.reserved = 0;
2955 h->esym.asym.index = indexNil;
2956 }
2957
2958 if (h->root.root.type == bfd_link_hash_common)
2959 h->esym.asym.value = h->root.root.u.c.size;
2960 else if (h->root.root.type == bfd_link_hash_defined
2961 || h->root.root.type == bfd_link_hash_defweak)
2962 {
2963 if (h->esym.asym.sc == scCommon)
2964 h->esym.asym.sc = scBss;
2965 else if (h->esym.asym.sc == scSCommon)
2966 h->esym.asym.sc = scSBss;
2967
2968 sec = h->root.root.u.def.section;
2969 output_section = sec->output_section;
2970 if (output_section != NULL)
2971 h->esym.asym.value = (h->root.root.u.def.value
2972 + sec->output_offset
2973 + output_section->vma);
2974 else
2975 h->esym.asym.value = 0;
2976 }
33bb52fb 2977 else
b49e97c9
TS
2978 {
2979 struct mips_elf_link_hash_entry *hd = h;
b49e97c9
TS
2980
2981 while (hd->root.root.type == bfd_link_hash_indirect)
33bb52fb 2982 hd = (struct mips_elf_link_hash_entry *)h->root.root.u.i.link;
b49e97c9 2983
33bb52fb 2984 if (hd->needs_lazy_stub)
b49e97c9 2985 {
1bbce132
MR
2986 BFD_ASSERT (hd->root.plt.plist != NULL);
2987 BFD_ASSERT (hd->root.plt.plist->stub_offset != MINUS_ONE);
b49e97c9
TS
2988 /* Set type and value for a symbol with a function stub. */
2989 h->esym.asym.st = stProc;
2990 sec = hd->root.root.u.def.section;
2991 if (sec == NULL)
2992 h->esym.asym.value = 0;
2993 else
2994 {
2995 output_section = sec->output_section;
2996 if (output_section != NULL)
1bbce132 2997 h->esym.asym.value = (hd->root.plt.plist->stub_offset
b49e97c9
TS
2998 + sec->output_offset
2999 + output_section->vma);
3000 else
3001 h->esym.asym.value = 0;
3002 }
b49e97c9
TS
3003 }
3004 }
3005
3006 if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
3007 h->root.root.root.string,
3008 &h->esym))
3009 {
b34976b6
AM
3010 einfo->failed = TRUE;
3011 return FALSE;
b49e97c9
TS
3012 }
3013
b34976b6 3014 return TRUE;
b49e97c9
TS
3015}
3016
3017/* A comparison routine used to sort .gptab entries. */
3018
3019static int
9719ad41 3020gptab_compare (const void *p1, const void *p2)
b49e97c9 3021{
9719ad41
RS
3022 const Elf32_gptab *a1 = p1;
3023 const Elf32_gptab *a2 = p2;
b49e97c9
TS
3024
3025 return a1->gt_entry.gt_g_value - a2->gt_entry.gt_g_value;
3026}
3027\f
b15e6682 3028/* Functions to manage the got entry hash table. */
f4416af6
AO
3029
3030/* Use all 64 bits of a bfd_vma for the computation of a 32-bit
3031 hash number. */
3032
3033static INLINE hashval_t
9719ad41 3034mips_elf_hash_bfd_vma (bfd_vma addr)
f4416af6
AO
3035{
3036#ifdef BFD64
3037 return addr + (addr >> 32);
3038#else
3039 return addr;
3040#endif
3041}
3042
f4416af6 3043static hashval_t
d9bf376d 3044mips_elf_got_entry_hash (const void *entry_)
f4416af6
AO
3045{
3046 const struct mips_got_entry *entry = (struct mips_got_entry *)entry_;
3047
e641e783 3048 return (entry->symndx
9ab066b4
RS
3049 + ((entry->tls_type == GOT_TLS_LDM) << 18)
3050 + (entry->tls_type == GOT_TLS_LDM ? 0
e641e783
RS
3051 : !entry->abfd ? mips_elf_hash_bfd_vma (entry->d.address)
3052 : entry->symndx >= 0 ? (entry->abfd->id
3053 + mips_elf_hash_bfd_vma (entry->d.addend))
3054 : entry->d.h->root.root.root.hash));
f4416af6
AO
3055}
3056
3057static int
3dff0dd1 3058mips_elf_got_entry_eq (const void *entry1, const void *entry2)
f4416af6
AO
3059{
3060 const struct mips_got_entry *e1 = (struct mips_got_entry *)entry1;
3061 const struct mips_got_entry *e2 = (struct mips_got_entry *)entry2;
3062
e641e783 3063 return (e1->symndx == e2->symndx
9ab066b4
RS
3064 && e1->tls_type == e2->tls_type
3065 && (e1->tls_type == GOT_TLS_LDM ? TRUE
e641e783
RS
3066 : !e1->abfd ? !e2->abfd && e1->d.address == e2->d.address
3067 : e1->symndx >= 0 ? (e1->abfd == e2->abfd
3068 && e1->d.addend == e2->d.addend)
3069 : e2->abfd && e1->d.h == e2->d.h));
b15e6682 3070}
c224138d 3071
13db6b44
RS
3072static hashval_t
3073mips_got_page_ref_hash (const void *ref_)
3074{
3075 const struct mips_got_page_ref *ref;
3076
3077 ref = (const struct mips_got_page_ref *) ref_;
3078 return ((ref->symndx >= 0
3079 ? (hashval_t) (ref->u.abfd->id + ref->symndx)
3080 : ref->u.h->root.root.root.hash)
3081 + mips_elf_hash_bfd_vma (ref->addend));
3082}
3083
3084static int
3085mips_got_page_ref_eq (const void *ref1_, const void *ref2_)
3086{
3087 const struct mips_got_page_ref *ref1, *ref2;
3088
3089 ref1 = (const struct mips_got_page_ref *) ref1_;
3090 ref2 = (const struct mips_got_page_ref *) ref2_;
3091 return (ref1->symndx == ref2->symndx
3092 && (ref1->symndx < 0
3093 ? ref1->u.h == ref2->u.h
3094 : ref1->u.abfd == ref2->u.abfd)
3095 && ref1->addend == ref2->addend);
3096}
3097
c224138d
RS
3098static hashval_t
3099mips_got_page_entry_hash (const void *entry_)
3100{
3101 const struct mips_got_page_entry *entry;
3102
3103 entry = (const struct mips_got_page_entry *) entry_;
13db6b44 3104 return entry->sec->id;
c224138d
RS
3105}
3106
3107static int
3108mips_got_page_entry_eq (const void *entry1_, const void *entry2_)
3109{
3110 const struct mips_got_page_entry *entry1, *entry2;
3111
3112 entry1 = (const struct mips_got_page_entry *) entry1_;
3113 entry2 = (const struct mips_got_page_entry *) entry2_;
13db6b44 3114 return entry1->sec == entry2->sec;
c224138d 3115}
b15e6682 3116\f
3dff0dd1 3117/* Create and return a new mips_got_info structure. */
5334aa52
RS
3118
3119static struct mips_got_info *
3dff0dd1 3120mips_elf_create_got_info (bfd *abfd)
5334aa52
RS
3121{
3122 struct mips_got_info *g;
3123
3124 g = bfd_zalloc (abfd, sizeof (struct mips_got_info));
3125 if (g == NULL)
3126 return NULL;
3127
3dff0dd1
RS
3128 g->got_entries = htab_try_create (1, mips_elf_got_entry_hash,
3129 mips_elf_got_entry_eq, NULL);
5334aa52
RS
3130 if (g->got_entries == NULL)
3131 return NULL;
3132
13db6b44
RS
3133 g->got_page_refs = htab_try_create (1, mips_got_page_ref_hash,
3134 mips_got_page_ref_eq, NULL);
3135 if (g->got_page_refs == NULL)
5334aa52
RS
3136 return NULL;
3137
3138 return g;
3139}
3140
ee227692
RS
3141/* Return the GOT info for input bfd ABFD, trying to create a new one if
3142 CREATE_P and if ABFD doesn't already have a GOT. */
3143
3144static struct mips_got_info *
3145mips_elf_bfd_got (bfd *abfd, bfd_boolean create_p)
3146{
3147 struct mips_elf_obj_tdata *tdata;
3148
3149 if (!is_mips_elf (abfd))
3150 return NULL;
3151
3152 tdata = mips_elf_tdata (abfd);
3153 if (!tdata->got && create_p)
3dff0dd1 3154 tdata->got = mips_elf_create_got_info (abfd);
ee227692
RS
3155 return tdata->got;
3156}
3157
d7206569
RS
3158/* Record that ABFD should use output GOT G. */
3159
3160static void
3161mips_elf_replace_bfd_got (bfd *abfd, struct mips_got_info *g)
3162{
3163 struct mips_elf_obj_tdata *tdata;
3164
3165 BFD_ASSERT (is_mips_elf (abfd));
3166 tdata = mips_elf_tdata (abfd);
3167 if (tdata->got)
3168 {
3169 /* The GOT structure itself and the hash table entries are
3170 allocated to a bfd, but the hash tables aren't. */
3171 htab_delete (tdata->got->got_entries);
13db6b44
RS
3172 htab_delete (tdata->got->got_page_refs);
3173 if (tdata->got->got_page_entries)
3174 htab_delete (tdata->got->got_page_entries);
d7206569
RS
3175 }
3176 tdata->got = g;
3177}
3178
0a44bf69
RS
3179/* Return the dynamic relocation section. If it doesn't exist, try to
3180 create a new it if CREATE_P, otherwise return NULL. Also return NULL
3181 if creation fails. */
f4416af6
AO
3182
3183static asection *
0a44bf69 3184mips_elf_rel_dyn_section (struct bfd_link_info *info, bfd_boolean create_p)
f4416af6 3185{
0a44bf69 3186 const char *dname;
f4416af6 3187 asection *sreloc;
0a44bf69 3188 bfd *dynobj;
f4416af6 3189
0a44bf69
RS
3190 dname = MIPS_ELF_REL_DYN_NAME (info);
3191 dynobj = elf_hash_table (info)->dynobj;
3d4d4302 3192 sreloc = bfd_get_linker_section (dynobj, dname);
f4416af6
AO
3193 if (sreloc == NULL && create_p)
3194 {
3d4d4302
AM
3195 sreloc = bfd_make_section_anyway_with_flags (dynobj, dname,
3196 (SEC_ALLOC
3197 | SEC_LOAD
3198 | SEC_HAS_CONTENTS
3199 | SEC_IN_MEMORY
3200 | SEC_LINKER_CREATED
3201 | SEC_READONLY));
f4416af6 3202 if (sreloc == NULL
f4416af6 3203 || ! bfd_set_section_alignment (dynobj, sreloc,
d80dcc6a 3204 MIPS_ELF_LOG_FILE_ALIGN (dynobj)))
f4416af6
AO
3205 return NULL;
3206 }
3207 return sreloc;
3208}
3209
e641e783
RS
3210/* Return the GOT_TLS_* type required by relocation type R_TYPE. */
3211
3212static int
3213mips_elf_reloc_tls_type (unsigned int r_type)
3214{
3215 if (tls_gd_reloc_p (r_type))
3216 return GOT_TLS_GD;
3217
3218 if (tls_ldm_reloc_p (r_type))
3219 return GOT_TLS_LDM;
3220
3221 if (tls_gottprel_reloc_p (r_type))
3222 return GOT_TLS_IE;
3223
9ab066b4 3224 return GOT_TLS_NONE;
e641e783
RS
3225}
3226
3227/* Return the number of GOT slots needed for GOT TLS type TYPE. */
3228
3229static int
3230mips_tls_got_entries (unsigned int type)
3231{
3232 switch (type)
3233 {
3234 case GOT_TLS_GD:
3235 case GOT_TLS_LDM:
3236 return 2;
3237
3238 case GOT_TLS_IE:
3239 return 1;
3240
9ab066b4 3241 case GOT_TLS_NONE:
e641e783
RS
3242 return 0;
3243 }
3244 abort ();
3245}
3246
0f20cc35
DJ
3247/* Count the number of relocations needed for a TLS GOT entry, with
3248 access types from TLS_TYPE, and symbol H (or a local symbol if H
3249 is NULL). */
3250
3251static int
3252mips_tls_got_relocs (struct bfd_link_info *info, unsigned char tls_type,
3253 struct elf_link_hash_entry *h)
3254{
3255 int indx = 0;
0f20cc35
DJ
3256 bfd_boolean need_relocs = FALSE;
3257 bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
3258
0e1862bb
L
3259 if (h && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
3260 && (!bfd_link_pic (info) || !SYMBOL_REFERENCES_LOCAL (info, h)))
0f20cc35
DJ
3261 indx = h->dynindx;
3262
0e1862bb 3263 if ((bfd_link_pic (info) || indx != 0)
0f20cc35
DJ
3264 && (h == NULL
3265 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3266 || h->root.type != bfd_link_hash_undefweak))
3267 need_relocs = TRUE;
3268
3269 if (!need_relocs)
e641e783 3270 return 0;
0f20cc35 3271
9ab066b4 3272 switch (tls_type)
0f20cc35 3273 {
e641e783
RS
3274 case GOT_TLS_GD:
3275 return indx != 0 ? 2 : 1;
0f20cc35 3276
e641e783
RS
3277 case GOT_TLS_IE:
3278 return 1;
0f20cc35 3279
e641e783 3280 case GOT_TLS_LDM:
0e1862bb 3281 return bfd_link_pic (info) ? 1 : 0;
0f20cc35 3282
e641e783
RS
3283 default:
3284 return 0;
3285 }
0f20cc35
DJ
3286}
3287
ab361d49
RS
3288/* Add the number of GOT entries and TLS relocations required by ENTRY
3289 to G. */
0f20cc35 3290
ab361d49
RS
3291static void
3292mips_elf_count_got_entry (struct bfd_link_info *info,
3293 struct mips_got_info *g,
3294 struct mips_got_entry *entry)
0f20cc35 3295{
9ab066b4 3296 if (entry->tls_type)
ab361d49 3297 {
9ab066b4
RS
3298 g->tls_gotno += mips_tls_got_entries (entry->tls_type);
3299 g->relocs += mips_tls_got_relocs (info, entry->tls_type,
ab361d49
RS
3300 entry->symndx < 0
3301 ? &entry->d.h->root : NULL);
3302 }
3303 else if (entry->symndx >= 0 || entry->d.h->global_got_area == GGA_NONE)
3304 g->local_gotno += 1;
3305 else
3306 g->global_gotno += 1;
0f20cc35
DJ
3307}
3308
0f20cc35
DJ
3309/* Output a simple dynamic relocation into SRELOC. */
3310
3311static void
3312mips_elf_output_dynamic_relocation (bfd *output_bfd,
3313 asection *sreloc,
861fb55a 3314 unsigned long reloc_index,
0f20cc35
DJ
3315 unsigned long indx,
3316 int r_type,
3317 bfd_vma offset)
3318{
3319 Elf_Internal_Rela rel[3];
3320
3321 memset (rel, 0, sizeof (rel));
3322
3323 rel[0].r_info = ELF_R_INFO (output_bfd, indx, r_type);
3324 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
3325
3326 if (ABI_64_P (output_bfd))
3327 {
3328 (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
3329 (output_bfd, &rel[0],
3330 (sreloc->contents
861fb55a 3331 + reloc_index * sizeof (Elf64_Mips_External_Rel)));
0f20cc35
DJ
3332 }
3333 else
3334 bfd_elf32_swap_reloc_out
3335 (output_bfd, &rel[0],
3336 (sreloc->contents
861fb55a 3337 + reloc_index * sizeof (Elf32_External_Rel)));
0f20cc35
DJ
3338}
3339
3340/* Initialize a set of TLS GOT entries for one symbol. */
3341
3342static void
9ab066b4
RS
3343mips_elf_initialize_tls_slots (bfd *abfd, struct bfd_link_info *info,
3344 struct mips_got_entry *entry,
0f20cc35
DJ
3345 struct mips_elf_link_hash_entry *h,
3346 bfd_vma value)
3347{
23cc69b6 3348 struct mips_elf_link_hash_table *htab;
0f20cc35
DJ
3349 int indx;
3350 asection *sreloc, *sgot;
9ab066b4 3351 bfd_vma got_offset, got_offset2;
0f20cc35
DJ
3352 bfd_boolean need_relocs = FALSE;
3353
23cc69b6 3354 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3355 if (htab == NULL)
3356 return;
3357
23cc69b6 3358 sgot = htab->sgot;
0f20cc35
DJ
3359
3360 indx = 0;
3361 if (h != NULL)
3362 {
3363 bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
3364
0e1862bb
L
3365 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info),
3366 &h->root)
3367 && (!bfd_link_pic (info)
3368 || !SYMBOL_REFERENCES_LOCAL (info, &h->root)))
0f20cc35
DJ
3369 indx = h->root.dynindx;
3370 }
3371
9ab066b4 3372 if (entry->tls_initialized)
0f20cc35
DJ
3373 return;
3374
0e1862bb 3375 if ((bfd_link_pic (info) || indx != 0)
0f20cc35
DJ
3376 && (h == NULL
3377 || ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT
3378 || h->root.type != bfd_link_hash_undefweak))
3379 need_relocs = TRUE;
3380
3381 /* MINUS_ONE means the symbol is not defined in this object. It may not
3382 be defined at all; assume that the value doesn't matter in that
3383 case. Otherwise complain if we would use the value. */
3384 BFD_ASSERT (value != MINUS_ONE || (indx != 0 && need_relocs)
3385 || h->root.root.type == bfd_link_hash_undefweak);
3386
3387 /* Emit necessary relocations. */
0a44bf69 3388 sreloc = mips_elf_rel_dyn_section (info, FALSE);
9ab066b4 3389 got_offset = entry->gotidx;
0f20cc35 3390
9ab066b4 3391 switch (entry->tls_type)
0f20cc35 3392 {
e641e783
RS
3393 case GOT_TLS_GD:
3394 /* General Dynamic. */
3395 got_offset2 = got_offset + MIPS_ELF_GOT_SIZE (abfd);
0f20cc35
DJ
3396
3397 if (need_relocs)
3398 {
3399 mips_elf_output_dynamic_relocation
861fb55a 3400 (abfd, sreloc, sreloc->reloc_count++, indx,
0f20cc35 3401 ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
e641e783 3402 sgot->output_offset + sgot->output_section->vma + got_offset);
0f20cc35
DJ
3403
3404 if (indx)
3405 mips_elf_output_dynamic_relocation
861fb55a 3406 (abfd, sreloc, sreloc->reloc_count++, indx,
0f20cc35 3407 ABI_64_P (abfd) ? R_MIPS_TLS_DTPREL64 : R_MIPS_TLS_DTPREL32,
e641e783 3408 sgot->output_offset + sgot->output_section->vma + got_offset2);
0f20cc35
DJ
3409 else
3410 MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
e641e783 3411 sgot->contents + got_offset2);
0f20cc35
DJ
3412 }
3413 else
3414 {
3415 MIPS_ELF_PUT_WORD (abfd, 1,
e641e783 3416 sgot->contents + got_offset);
0f20cc35 3417 MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
e641e783 3418 sgot->contents + got_offset2);
0f20cc35 3419 }
e641e783 3420 break;
0f20cc35 3421
e641e783
RS
3422 case GOT_TLS_IE:
3423 /* Initial Exec model. */
0f20cc35
DJ
3424 if (need_relocs)
3425 {
3426 if (indx == 0)
3427 MIPS_ELF_PUT_WORD (abfd, value - elf_hash_table (info)->tls_sec->vma,
e641e783 3428 sgot->contents + got_offset);
0f20cc35
DJ
3429 else
3430 MIPS_ELF_PUT_WORD (abfd, 0,
e641e783 3431 sgot->contents + got_offset);
0f20cc35
DJ
3432
3433 mips_elf_output_dynamic_relocation
861fb55a 3434 (abfd, sreloc, sreloc->reloc_count++, indx,
0f20cc35 3435 ABI_64_P (abfd) ? R_MIPS_TLS_TPREL64 : R_MIPS_TLS_TPREL32,
e641e783 3436 sgot->output_offset + sgot->output_section->vma + got_offset);
0f20cc35
DJ
3437 }
3438 else
3439 MIPS_ELF_PUT_WORD (abfd, value - tprel_base (info),
e641e783
RS
3440 sgot->contents + got_offset);
3441 break;
0f20cc35 3442
e641e783 3443 case GOT_TLS_LDM:
0f20cc35
DJ
3444 /* The initial offset is zero, and the LD offsets will include the
3445 bias by DTP_OFFSET. */
3446 MIPS_ELF_PUT_WORD (abfd, 0,
3447 sgot->contents + got_offset
3448 + MIPS_ELF_GOT_SIZE (abfd));
3449
0e1862bb 3450 if (!bfd_link_pic (info))
0f20cc35
DJ
3451 MIPS_ELF_PUT_WORD (abfd, 1,
3452 sgot->contents + got_offset);
3453 else
3454 mips_elf_output_dynamic_relocation
861fb55a 3455 (abfd, sreloc, sreloc->reloc_count++, indx,
0f20cc35
DJ
3456 ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
3457 sgot->output_offset + sgot->output_section->vma + got_offset);
e641e783
RS
3458 break;
3459
3460 default:
3461 abort ();
0f20cc35
DJ
3462 }
3463
9ab066b4 3464 entry->tls_initialized = TRUE;
e641e783 3465}
0f20cc35 3466
0a44bf69
RS
3467/* Return the offset from _GLOBAL_OFFSET_TABLE_ of the .got.plt entry
3468 for global symbol H. .got.plt comes before the GOT, so the offset
3469 will be negative. */
3470
3471static bfd_vma
3472mips_elf_gotplt_index (struct bfd_link_info *info,
3473 struct elf_link_hash_entry *h)
3474{
1bbce132 3475 bfd_vma got_address, got_value;
0a44bf69
RS
3476 struct mips_elf_link_hash_table *htab;
3477
3478 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3479 BFD_ASSERT (htab != NULL);
3480
1bbce132
MR
3481 BFD_ASSERT (h->plt.plist != NULL);
3482 BFD_ASSERT (h->plt.plist->gotplt_index != MINUS_ONE);
0a44bf69
RS
3483
3484 /* Calculate the address of the associated .got.plt entry. */
3485 got_address = (htab->sgotplt->output_section->vma
3486 + htab->sgotplt->output_offset
1bbce132
MR
3487 + (h->plt.plist->gotplt_index
3488 * MIPS_ELF_GOT_SIZE (info->output_bfd)));
0a44bf69
RS
3489
3490 /* Calculate the value of _GLOBAL_OFFSET_TABLE_. */
3491 got_value = (htab->root.hgot->root.u.def.section->output_section->vma
3492 + htab->root.hgot->root.u.def.section->output_offset
3493 + htab->root.hgot->root.u.def.value);
3494
3495 return got_address - got_value;
3496}
3497
5c18022e 3498/* Return the GOT offset for address VALUE. If there is not yet a GOT
0a44bf69
RS
3499 entry for this value, create one. If R_SYMNDX refers to a TLS symbol,
3500 create a TLS GOT entry instead. Return -1 if no satisfactory GOT
3501 offset can be found. */
b49e97c9
TS
3502
3503static bfd_vma
9719ad41 3504mips_elf_local_got_index (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
5c18022e 3505 bfd_vma value, unsigned long r_symndx,
0f20cc35 3506 struct mips_elf_link_hash_entry *h, int r_type)
b49e97c9 3507{
a8028dd0 3508 struct mips_elf_link_hash_table *htab;
b15e6682 3509 struct mips_got_entry *entry;
b49e97c9 3510
a8028dd0 3511 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3512 BFD_ASSERT (htab != NULL);
3513
a8028dd0
RS
3514 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, value,
3515 r_symndx, h, r_type);
0f20cc35 3516 if (!entry)
b15e6682 3517 return MINUS_ONE;
0f20cc35 3518
e641e783 3519 if (entry->tls_type)
9ab066b4
RS
3520 mips_elf_initialize_tls_slots (abfd, info, entry, h, value);
3521 return entry->gotidx;
b49e97c9
TS
3522}
3523
13fbec83 3524/* Return the GOT index of global symbol H in the primary GOT. */
b49e97c9
TS
3525
3526static bfd_vma
13fbec83
RS
3527mips_elf_primary_global_got_index (bfd *obfd, struct bfd_link_info *info,
3528 struct elf_link_hash_entry *h)
3529{
3530 struct mips_elf_link_hash_table *htab;
3531 long global_got_dynindx;
3532 struct mips_got_info *g;
3533 bfd_vma got_index;
3534
3535 htab = mips_elf_hash_table (info);
3536 BFD_ASSERT (htab != NULL);
3537
3538 global_got_dynindx = 0;
3539 if (htab->global_gotsym != NULL)
3540 global_got_dynindx = htab->global_gotsym->dynindx;
3541
3542 /* Once we determine the global GOT entry with the lowest dynamic
3543 symbol table index, we must put all dynamic symbols with greater
3544 indices into the primary GOT. That makes it easy to calculate the
3545 GOT offset. */
3546 BFD_ASSERT (h->dynindx >= global_got_dynindx);
3547 g = mips_elf_bfd_got (obfd, FALSE);
3548 got_index = ((h->dynindx - global_got_dynindx + g->local_gotno)
3549 * MIPS_ELF_GOT_SIZE (obfd));
3550 BFD_ASSERT (got_index < htab->sgot->size);
3551
3552 return got_index;
3553}
3554
3555/* Return the GOT index for the global symbol indicated by H, which is
3556 referenced by a relocation of type R_TYPE in IBFD. */
3557
3558static bfd_vma
3559mips_elf_global_got_index (bfd *obfd, struct bfd_link_info *info, bfd *ibfd,
3560 struct elf_link_hash_entry *h, int r_type)
b49e97c9 3561{
a8028dd0 3562 struct mips_elf_link_hash_table *htab;
6c42ddb9
RS
3563 struct mips_got_info *g;
3564 struct mips_got_entry lookup, *entry;
3565 bfd_vma gotidx;
b49e97c9 3566
a8028dd0 3567 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3568 BFD_ASSERT (htab != NULL);
3569
6c42ddb9
RS
3570 g = mips_elf_bfd_got (ibfd, FALSE);
3571 BFD_ASSERT (g);
f4416af6 3572
6c42ddb9
RS
3573 lookup.tls_type = mips_elf_reloc_tls_type (r_type);
3574 if (!lookup.tls_type && g == mips_elf_bfd_got (obfd, FALSE))
3575 return mips_elf_primary_global_got_index (obfd, info, h);
f4416af6 3576
6c42ddb9
RS
3577 lookup.abfd = ibfd;
3578 lookup.symndx = -1;
3579 lookup.d.h = (struct mips_elf_link_hash_entry *) h;
3580 entry = htab_find (g->got_entries, &lookup);
3581 BFD_ASSERT (entry);
0f20cc35 3582
6c42ddb9
RS
3583 gotidx = entry->gotidx;
3584 BFD_ASSERT (gotidx > 0 && gotidx < htab->sgot->size);
f4416af6 3585
6c42ddb9 3586 if (lookup.tls_type)
0f20cc35 3587 {
0f20cc35
DJ
3588 bfd_vma value = MINUS_ONE;
3589
3590 if ((h->root.type == bfd_link_hash_defined
3591 || h->root.type == bfd_link_hash_defweak)
3592 && h->root.u.def.section->output_section)
3593 value = (h->root.u.def.value
3594 + h->root.u.def.section->output_offset
3595 + h->root.u.def.section->output_section->vma);
3596
9ab066b4 3597 mips_elf_initialize_tls_slots (obfd, info, entry, lookup.d.h, value);
0f20cc35 3598 }
6c42ddb9 3599 return gotidx;
b49e97c9
TS
3600}
3601
5c18022e
RS
3602/* Find a GOT page entry that points to within 32KB of VALUE. These
3603 entries are supposed to be placed at small offsets in the GOT, i.e.,
3604 within 32KB of GP. Return the index of the GOT entry, or -1 if no
3605 entry could be created. If OFFSETP is nonnull, use it to return the
0a44bf69 3606 offset of the GOT entry from VALUE. */
b49e97c9
TS
3607
3608static bfd_vma
9719ad41 3609mips_elf_got_page (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
5c18022e 3610 bfd_vma value, bfd_vma *offsetp)
b49e97c9 3611{
91d6fa6a 3612 bfd_vma page, got_index;
b15e6682 3613 struct mips_got_entry *entry;
b49e97c9 3614
0a44bf69 3615 page = (value + 0x8000) & ~(bfd_vma) 0xffff;
a8028dd0
RS
3616 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, page, 0,
3617 NULL, R_MIPS_GOT_PAGE);
b49e97c9 3618
b15e6682
AO
3619 if (!entry)
3620 return MINUS_ONE;
143d77c5 3621
91d6fa6a 3622 got_index = entry->gotidx;
b49e97c9
TS
3623
3624 if (offsetp)
f4416af6 3625 *offsetp = value - entry->d.address;
b49e97c9 3626
91d6fa6a 3627 return got_index;
b49e97c9
TS
3628}
3629
738e5348 3630/* Find a local GOT entry for an R_MIPS*_GOT16 relocation against VALUE.
020d7251
RS
3631 EXTERNAL is true if the relocation was originally against a global
3632 symbol that binds locally. */
b49e97c9
TS
3633
3634static bfd_vma
9719ad41 3635mips_elf_got16_entry (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
5c18022e 3636 bfd_vma value, bfd_boolean external)
b49e97c9 3637{
b15e6682 3638 struct mips_got_entry *entry;
b49e97c9 3639
0a44bf69
RS
3640 /* GOT16 relocations against local symbols are followed by a LO16
3641 relocation; those against global symbols are not. Thus if the
3642 symbol was originally local, the GOT16 relocation should load the
3643 equivalent of %hi(VALUE), otherwise it should load VALUE itself. */
b49e97c9 3644 if (! external)
0a44bf69 3645 value = mips_elf_high (value) << 16;
b49e97c9 3646
738e5348
RS
3647 /* It doesn't matter whether the original relocation was R_MIPS_GOT16,
3648 R_MIPS16_GOT16, R_MIPS_CALL16, etc. The format of the entry is the
3649 same in all cases. */
a8028dd0
RS
3650 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, value, 0,
3651 NULL, R_MIPS_GOT16);
b15e6682
AO
3652 if (entry)
3653 return entry->gotidx;
3654 else
3655 return MINUS_ONE;
b49e97c9
TS
3656}
3657
3658/* Returns the offset for the entry at the INDEXth position
3659 in the GOT. */
3660
3661static bfd_vma
a8028dd0 3662mips_elf_got_offset_from_index (struct bfd_link_info *info, bfd *output_bfd,
91d6fa6a 3663 bfd *input_bfd, bfd_vma got_index)
b49e97c9 3664{
a8028dd0 3665 struct mips_elf_link_hash_table *htab;
b49e97c9
TS
3666 asection *sgot;
3667 bfd_vma gp;
3668
a8028dd0 3669 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3670 BFD_ASSERT (htab != NULL);
3671
a8028dd0 3672 sgot = htab->sgot;
f4416af6 3673 gp = _bfd_get_gp_value (output_bfd)
a8028dd0 3674 + mips_elf_adjust_gp (output_bfd, htab->got_info, input_bfd);
143d77c5 3675
91d6fa6a 3676 return sgot->output_section->vma + sgot->output_offset + got_index - gp;
b49e97c9
TS
3677}
3678
0a44bf69
RS
3679/* Create and return a local GOT entry for VALUE, which was calculated
3680 from a symbol belonging to INPUT_SECTON. Return NULL if it could not
3681 be created. If R_SYMNDX refers to a TLS symbol, create a TLS entry
3682 instead. */
b49e97c9 3683
b15e6682 3684static struct mips_got_entry *
0a44bf69 3685mips_elf_create_local_got_entry (bfd *abfd, struct bfd_link_info *info,
a8028dd0 3686 bfd *ibfd, bfd_vma value,
5c18022e 3687 unsigned long r_symndx,
0f20cc35
DJ
3688 struct mips_elf_link_hash_entry *h,
3689 int r_type)
b49e97c9 3690{
ebc53538
RS
3691 struct mips_got_entry lookup, *entry;
3692 void **loc;
f4416af6 3693 struct mips_got_info *g;
0a44bf69 3694 struct mips_elf_link_hash_table *htab;
6c42ddb9 3695 bfd_vma gotidx;
0a44bf69
RS
3696
3697 htab = mips_elf_hash_table (info);
4dfe6ac6 3698 BFD_ASSERT (htab != NULL);
b15e6682 3699
d7206569 3700 g = mips_elf_bfd_got (ibfd, FALSE);
f4416af6
AO
3701 if (g == NULL)
3702 {
d7206569 3703 g = mips_elf_bfd_got (abfd, FALSE);
f4416af6
AO
3704 BFD_ASSERT (g != NULL);
3705 }
b15e6682 3706
020d7251
RS
3707 /* This function shouldn't be called for symbols that live in the global
3708 area of the GOT. */
3709 BFD_ASSERT (h == NULL || h->global_got_area == GGA_NONE);
0f20cc35 3710
ebc53538
RS
3711 lookup.tls_type = mips_elf_reloc_tls_type (r_type);
3712 if (lookup.tls_type)
3713 {
3714 lookup.abfd = ibfd;
df58fc94 3715 if (tls_ldm_reloc_p (r_type))
0f20cc35 3716 {
ebc53538
RS
3717 lookup.symndx = 0;
3718 lookup.d.addend = 0;
0f20cc35
DJ
3719 }
3720 else if (h == NULL)
3721 {
ebc53538
RS
3722 lookup.symndx = r_symndx;
3723 lookup.d.addend = 0;
0f20cc35
DJ
3724 }
3725 else
ebc53538
RS
3726 {
3727 lookup.symndx = -1;
3728 lookup.d.h = h;
3729 }
0f20cc35 3730
ebc53538
RS
3731 entry = (struct mips_got_entry *) htab_find (g->got_entries, &lookup);
3732 BFD_ASSERT (entry);
0f20cc35 3733
6c42ddb9
RS
3734 gotidx = entry->gotidx;
3735 BFD_ASSERT (gotidx > 0 && gotidx < htab->sgot->size);
3736
ebc53538 3737 return entry;
0f20cc35
DJ
3738 }
3739
ebc53538
RS
3740 lookup.abfd = NULL;
3741 lookup.symndx = -1;
3742 lookup.d.address = value;
3743 loc = htab_find_slot (g->got_entries, &lookup, INSERT);
3744 if (!loc)
b15e6682 3745 return NULL;
143d77c5 3746
ebc53538
RS
3747 entry = (struct mips_got_entry *) *loc;
3748 if (entry)
3749 return entry;
b15e6682 3750
cb22ccf4 3751 if (g->assigned_low_gotno > g->assigned_high_gotno)
b49e97c9
TS
3752 {
3753 /* We didn't allocate enough space in the GOT. */
4eca0228 3754 _bfd_error_handler
b49e97c9
TS
3755 (_("not enough GOT space for local GOT entries"));
3756 bfd_set_error (bfd_error_bad_value);
b15e6682 3757 return NULL;
b49e97c9
TS
3758 }
3759
ebc53538
RS
3760 entry = (struct mips_got_entry *) bfd_alloc (abfd, sizeof (*entry));
3761 if (!entry)
3762 return NULL;
3763
cb22ccf4
KCY
3764 if (got16_reloc_p (r_type)
3765 || call16_reloc_p (r_type)
3766 || got_page_reloc_p (r_type)
3767 || got_disp_reloc_p (r_type))
3768 lookup.gotidx = MIPS_ELF_GOT_SIZE (abfd) * g->assigned_low_gotno++;
3769 else
3770 lookup.gotidx = MIPS_ELF_GOT_SIZE (abfd) * g->assigned_high_gotno--;
3771
ebc53538
RS
3772 *entry = lookup;
3773 *loc = entry;
3774
3775 MIPS_ELF_PUT_WORD (abfd, value, htab->sgot->contents + entry->gotidx);
b15e6682 3776
5c18022e 3777 /* These GOT entries need a dynamic relocation on VxWorks. */
0a44bf69
RS
3778 if (htab->is_vxworks)
3779 {
3780 Elf_Internal_Rela outrel;
5c18022e 3781 asection *s;
91d6fa6a 3782 bfd_byte *rloc;
0a44bf69 3783 bfd_vma got_address;
0a44bf69
RS
3784
3785 s = mips_elf_rel_dyn_section (info, FALSE);
a8028dd0
RS
3786 got_address = (htab->sgot->output_section->vma
3787 + htab->sgot->output_offset
ebc53538 3788 + entry->gotidx);
0a44bf69 3789
91d6fa6a 3790 rloc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
0a44bf69 3791 outrel.r_offset = got_address;
5c18022e
RS
3792 outrel.r_info = ELF32_R_INFO (STN_UNDEF, R_MIPS_32);
3793 outrel.r_addend = value;
91d6fa6a 3794 bfd_elf32_swap_reloca_out (abfd, &outrel, rloc);
0a44bf69
RS
3795 }
3796
ebc53538 3797 return entry;
b49e97c9
TS
3798}
3799
d4596a51
RS
3800/* Return the number of dynamic section symbols required by OUTPUT_BFD.
3801 The number might be exact or a worst-case estimate, depending on how
3802 much information is available to elf_backend_omit_section_dynsym at
3803 the current linking stage. */
3804
3805static bfd_size_type
3806count_section_dynsyms (bfd *output_bfd, struct bfd_link_info *info)
3807{
3808 bfd_size_type count;
3809
3810 count = 0;
0e1862bb
L
3811 if (bfd_link_pic (info)
3812 || elf_hash_table (info)->is_relocatable_executable)
d4596a51
RS
3813 {
3814 asection *p;
3815 const struct elf_backend_data *bed;
3816
3817 bed = get_elf_backend_data (output_bfd);
3818 for (p = output_bfd->sections; p ; p = p->next)
3819 if ((p->flags & SEC_EXCLUDE) == 0
3820 && (p->flags & SEC_ALLOC) != 0
3821 && !(*bed->elf_backend_omit_section_dynsym) (output_bfd, info, p))
3822 ++count;
3823 }
3824 return count;
3825}
3826
b49e97c9 3827/* Sort the dynamic symbol table so that symbols that need GOT entries
d4596a51 3828 appear towards the end. */
b49e97c9 3829
b34976b6 3830static bfd_boolean
d4596a51 3831mips_elf_sort_hash_table (bfd *abfd, struct bfd_link_info *info)
b49e97c9 3832{
a8028dd0 3833 struct mips_elf_link_hash_table *htab;
b49e97c9
TS
3834 struct mips_elf_hash_sort_data hsd;
3835 struct mips_got_info *g;
b49e97c9 3836
d4596a51
RS
3837 if (elf_hash_table (info)->dynsymcount == 0)
3838 return TRUE;
3839
a8028dd0 3840 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3841 BFD_ASSERT (htab != NULL);
3842
a8028dd0 3843 g = htab->got_info;
d4596a51
RS
3844 if (g == NULL)
3845 return TRUE;
f4416af6 3846
b49e97c9 3847 hsd.low = NULL;
23cc69b6
RS
3848 hsd.max_unref_got_dynindx
3849 = hsd.min_got_dynindx
3850 = (elf_hash_table (info)->dynsymcount - g->reloc_only_gotno);
d4596a51 3851 hsd.max_non_got_dynindx = count_section_dynsyms (abfd, info) + 1;
b49e97c9
TS
3852 mips_elf_link_hash_traverse (((struct mips_elf_link_hash_table *)
3853 elf_hash_table (info)),
3854 mips_elf_sort_hash_table_f,
3855 &hsd);
3856
3857 /* There should have been enough room in the symbol table to
44c410de 3858 accommodate both the GOT and non-GOT symbols. */
b49e97c9 3859 BFD_ASSERT (hsd.max_non_got_dynindx <= hsd.min_got_dynindx);
d4596a51
RS
3860 BFD_ASSERT ((unsigned long) hsd.max_unref_got_dynindx
3861 == elf_hash_table (info)->dynsymcount);
3862 BFD_ASSERT (elf_hash_table (info)->dynsymcount - hsd.min_got_dynindx
3863 == g->global_gotno);
b49e97c9
TS
3864
3865 /* Now we know which dynamic symbol has the lowest dynamic symbol
3866 table index in the GOT. */
d222d210 3867 htab->global_gotsym = hsd.low;
b49e97c9 3868
b34976b6 3869 return TRUE;
b49e97c9
TS
3870}
3871
3872/* If H needs a GOT entry, assign it the highest available dynamic
3873 index. Otherwise, assign it the lowest available dynamic
3874 index. */
3875
b34976b6 3876static bfd_boolean
9719ad41 3877mips_elf_sort_hash_table_f (struct mips_elf_link_hash_entry *h, void *data)
b49e97c9 3878{
9719ad41 3879 struct mips_elf_hash_sort_data *hsd = data;
b49e97c9 3880
b49e97c9
TS
3881 /* Symbols without dynamic symbol table entries aren't interesting
3882 at all. */
3883 if (h->root.dynindx == -1)
b34976b6 3884 return TRUE;
b49e97c9 3885
634835ae 3886 switch (h->global_got_area)
f4416af6 3887 {
634835ae
RS
3888 case GGA_NONE:
3889 h->root.dynindx = hsd->max_non_got_dynindx++;
3890 break;
0f20cc35 3891
634835ae 3892 case GGA_NORMAL:
b49e97c9
TS
3893 h->root.dynindx = --hsd->min_got_dynindx;
3894 hsd->low = (struct elf_link_hash_entry *) h;
634835ae
RS
3895 break;
3896
3897 case GGA_RELOC_ONLY:
634835ae
RS
3898 if (hsd->max_unref_got_dynindx == hsd->min_got_dynindx)
3899 hsd->low = (struct elf_link_hash_entry *) h;
3900 h->root.dynindx = hsd->max_unref_got_dynindx++;
3901 break;
b49e97c9
TS
3902 }
3903
b34976b6 3904 return TRUE;
b49e97c9
TS
3905}
3906
ee227692
RS
3907/* Record that input bfd ABFD requires a GOT entry like *LOOKUP
3908 (which is owned by the caller and shouldn't be added to the
3909 hash table directly). */
3910
3911static bfd_boolean
3912mips_elf_record_got_entry (struct bfd_link_info *info, bfd *abfd,
3913 struct mips_got_entry *lookup)
3914{
3915 struct mips_elf_link_hash_table *htab;
3916 struct mips_got_entry *entry;
3917 struct mips_got_info *g;
3918 void **loc, **bfd_loc;
3919
3920 /* Make sure there's a slot for this entry in the master GOT. */
3921 htab = mips_elf_hash_table (info);
3922 g = htab->got_info;
3923 loc = htab_find_slot (g->got_entries, lookup, INSERT);
3924 if (!loc)
3925 return FALSE;
3926
3927 /* Populate the entry if it isn't already. */
3928 entry = (struct mips_got_entry *) *loc;
3929 if (!entry)
3930 {
3931 entry = (struct mips_got_entry *) bfd_alloc (abfd, sizeof (*entry));
3932 if (!entry)
3933 return FALSE;
3934
9ab066b4 3935 lookup->tls_initialized = FALSE;
ee227692
RS
3936 lookup->gotidx = -1;
3937 *entry = *lookup;
3938 *loc = entry;
3939 }
3940
3941 /* Reuse the same GOT entry for the BFD's GOT. */
3942 g = mips_elf_bfd_got (abfd, TRUE);
3943 if (!g)
3944 return FALSE;
3945
3946 bfd_loc = htab_find_slot (g->got_entries, lookup, INSERT);
3947 if (!bfd_loc)
3948 return FALSE;
3949
3950 if (!*bfd_loc)
3951 *bfd_loc = entry;
3952 return TRUE;
3953}
3954
e641e783
RS
3955/* ABFD has a GOT relocation of type R_TYPE against H. Reserve a GOT
3956 entry for it. FOR_CALL is true if the caller is only interested in
6ccf4795 3957 using the GOT entry for calls. */
b49e97c9 3958
b34976b6 3959static bfd_boolean
9719ad41
RS
3960mips_elf_record_global_got_symbol (struct elf_link_hash_entry *h,
3961 bfd *abfd, struct bfd_link_info *info,
e641e783 3962 bfd_boolean for_call, int r_type)
b49e97c9 3963{
a8028dd0 3964 struct mips_elf_link_hash_table *htab;
634835ae 3965 struct mips_elf_link_hash_entry *hmips;
ee227692
RS
3966 struct mips_got_entry entry;
3967 unsigned char tls_type;
a8028dd0
RS
3968
3969 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3970 BFD_ASSERT (htab != NULL);
3971
634835ae 3972 hmips = (struct mips_elf_link_hash_entry *) h;
6ccf4795
RS
3973 if (!for_call)
3974 hmips->got_only_for_calls = FALSE;
f4416af6 3975
b49e97c9
TS
3976 /* A global symbol in the GOT must also be in the dynamic symbol
3977 table. */
7c5fcef7
L
3978 if (h->dynindx == -1)
3979 {
3980 switch (ELF_ST_VISIBILITY (h->other))
3981 {
3982 case STV_INTERNAL:
3983 case STV_HIDDEN:
33bb52fb 3984 _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
7c5fcef7
L
3985 break;
3986 }
c152c796 3987 if (!bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 3988 return FALSE;
7c5fcef7 3989 }
b49e97c9 3990
ee227692 3991 tls_type = mips_elf_reloc_tls_type (r_type);
9ab066b4 3992 if (tls_type == GOT_TLS_NONE && hmips->global_got_area > GGA_NORMAL)
ee227692 3993 hmips->global_got_area = GGA_NORMAL;
86324f90 3994
f4416af6
AO
3995 entry.abfd = abfd;
3996 entry.symndx = -1;
3997 entry.d.h = (struct mips_elf_link_hash_entry *) h;
ee227692
RS
3998 entry.tls_type = tls_type;
3999 return mips_elf_record_got_entry (info, abfd, &entry);
b49e97c9 4000}
f4416af6 4001
e641e783
RS
4002/* ABFD has a GOT relocation of type R_TYPE against symbol SYMNDX + ADDEND,
4003 where SYMNDX is a local symbol. Reserve a GOT entry for it. */
f4416af6
AO
4004
4005static bfd_boolean
9719ad41 4006mips_elf_record_local_got_symbol (bfd *abfd, long symndx, bfd_vma addend,
e641e783 4007 struct bfd_link_info *info, int r_type)
f4416af6 4008{
a8028dd0
RS
4009 struct mips_elf_link_hash_table *htab;
4010 struct mips_got_info *g;
ee227692 4011 struct mips_got_entry entry;
f4416af6 4012
a8028dd0 4013 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4014 BFD_ASSERT (htab != NULL);
4015
a8028dd0
RS
4016 g = htab->got_info;
4017 BFD_ASSERT (g != NULL);
4018
f4416af6
AO
4019 entry.abfd = abfd;
4020 entry.symndx = symndx;
4021 entry.d.addend = addend;
e641e783 4022 entry.tls_type = mips_elf_reloc_tls_type (r_type);
ee227692 4023 return mips_elf_record_got_entry (info, abfd, &entry);
f4416af6 4024}
c224138d 4025
13db6b44
RS
4026/* Record that ABFD has a page relocation against SYMNDX + ADDEND.
4027 H is the symbol's hash table entry, or null if SYMNDX is local
4028 to ABFD. */
c224138d
RS
4029
4030static bfd_boolean
13db6b44
RS
4031mips_elf_record_got_page_ref (struct bfd_link_info *info, bfd *abfd,
4032 long symndx, struct elf_link_hash_entry *h,
4033 bfd_signed_vma addend)
c224138d 4034{
a8028dd0 4035 struct mips_elf_link_hash_table *htab;
ee227692 4036 struct mips_got_info *g1, *g2;
13db6b44 4037 struct mips_got_page_ref lookup, *entry;
ee227692 4038 void **loc, **bfd_loc;
c224138d 4039
a8028dd0 4040 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4041 BFD_ASSERT (htab != NULL);
4042
ee227692
RS
4043 g1 = htab->got_info;
4044 BFD_ASSERT (g1 != NULL);
a8028dd0 4045
13db6b44
RS
4046 if (h)
4047 {
4048 lookup.symndx = -1;
4049 lookup.u.h = (struct mips_elf_link_hash_entry *) h;
4050 }
4051 else
4052 {
4053 lookup.symndx = symndx;
4054 lookup.u.abfd = abfd;
4055 }
4056 lookup.addend = addend;
4057 loc = htab_find_slot (g1->got_page_refs, &lookup, INSERT);
c224138d
RS
4058 if (loc == NULL)
4059 return FALSE;
4060
13db6b44 4061 entry = (struct mips_got_page_ref *) *loc;
c224138d
RS
4062 if (!entry)
4063 {
4064 entry = bfd_alloc (abfd, sizeof (*entry));
4065 if (!entry)
4066 return FALSE;
4067
13db6b44 4068 *entry = lookup;
c224138d
RS
4069 *loc = entry;
4070 }
4071
ee227692
RS
4072 /* Add the same entry to the BFD's GOT. */
4073 g2 = mips_elf_bfd_got (abfd, TRUE);
4074 if (!g2)
4075 return FALSE;
4076
13db6b44 4077 bfd_loc = htab_find_slot (g2->got_page_refs, &lookup, INSERT);
ee227692
RS
4078 if (!bfd_loc)
4079 return FALSE;
4080
4081 if (!*bfd_loc)
4082 *bfd_loc = entry;
4083
c224138d
RS
4084 return TRUE;
4085}
33bb52fb
RS
4086
4087/* Add room for N relocations to the .rel(a).dyn section in ABFD. */
4088
4089static void
4090mips_elf_allocate_dynamic_relocations (bfd *abfd, struct bfd_link_info *info,
4091 unsigned int n)
4092{
4093 asection *s;
4094 struct mips_elf_link_hash_table *htab;
4095
4096 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4097 BFD_ASSERT (htab != NULL);
4098
33bb52fb
RS
4099 s = mips_elf_rel_dyn_section (info, FALSE);
4100 BFD_ASSERT (s != NULL);
4101
4102 if (htab->is_vxworks)
4103 s->size += n * MIPS_ELF_RELA_SIZE (abfd);
4104 else
4105 {
4106 if (s->size == 0)
4107 {
4108 /* Make room for a null element. */
4109 s->size += MIPS_ELF_REL_SIZE (abfd);
4110 ++s->reloc_count;
4111 }
4112 s->size += n * MIPS_ELF_REL_SIZE (abfd);
4113 }
4114}
4115\f
476366af
RS
4116/* A htab_traverse callback for GOT entries, with DATA pointing to a
4117 mips_elf_traverse_got_arg structure. Count the number of GOT
4118 entries and TLS relocs. Set DATA->value to true if we need
4119 to resolve indirect or warning symbols and then recreate the GOT. */
33bb52fb
RS
4120
4121static int
4122mips_elf_check_recreate_got (void **entryp, void *data)
4123{
4124 struct mips_got_entry *entry;
476366af 4125 struct mips_elf_traverse_got_arg *arg;
33bb52fb
RS
4126
4127 entry = (struct mips_got_entry *) *entryp;
476366af 4128 arg = (struct mips_elf_traverse_got_arg *) data;
33bb52fb
RS
4129 if (entry->abfd != NULL && entry->symndx == -1)
4130 {
4131 struct mips_elf_link_hash_entry *h;
4132
4133 h = entry->d.h;
4134 if (h->root.root.type == bfd_link_hash_indirect
4135 || h->root.root.type == bfd_link_hash_warning)
4136 {
476366af 4137 arg->value = TRUE;
33bb52fb
RS
4138 return 0;
4139 }
4140 }
476366af 4141 mips_elf_count_got_entry (arg->info, arg->g, entry);
33bb52fb
RS
4142 return 1;
4143}
4144
476366af
RS
4145/* A htab_traverse callback for GOT entries, with DATA pointing to a
4146 mips_elf_traverse_got_arg structure. Add all entries to DATA->g,
4147 converting entries for indirect and warning symbols into entries
4148 for the target symbol. Set DATA->g to null on error. */
33bb52fb
RS
4149
4150static int
4151mips_elf_recreate_got (void **entryp, void *data)
4152{
72e7511a 4153 struct mips_got_entry new_entry, *entry;
476366af 4154 struct mips_elf_traverse_got_arg *arg;
33bb52fb
RS
4155 void **slot;
4156
33bb52fb 4157 entry = (struct mips_got_entry *) *entryp;
476366af 4158 arg = (struct mips_elf_traverse_got_arg *) data;
72e7511a
RS
4159 if (entry->abfd != NULL
4160 && entry->symndx == -1
4161 && (entry->d.h->root.root.type == bfd_link_hash_indirect
4162 || entry->d.h->root.root.type == bfd_link_hash_warning))
33bb52fb
RS
4163 {
4164 struct mips_elf_link_hash_entry *h;
4165
72e7511a
RS
4166 new_entry = *entry;
4167 entry = &new_entry;
33bb52fb 4168 h = entry->d.h;
72e7511a 4169 do
634835ae
RS
4170 {
4171 BFD_ASSERT (h->global_got_area == GGA_NONE);
4172 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
4173 }
72e7511a
RS
4174 while (h->root.root.type == bfd_link_hash_indirect
4175 || h->root.root.type == bfd_link_hash_warning);
33bb52fb
RS
4176 entry->d.h = h;
4177 }
476366af 4178 slot = htab_find_slot (arg->g->got_entries, entry, INSERT);
33bb52fb
RS
4179 if (slot == NULL)
4180 {
476366af 4181 arg->g = NULL;
33bb52fb
RS
4182 return 0;
4183 }
4184 if (*slot == NULL)
72e7511a
RS
4185 {
4186 if (entry == &new_entry)
4187 {
4188 entry = bfd_alloc (entry->abfd, sizeof (*entry));
4189 if (!entry)
4190 {
476366af 4191 arg->g = NULL;
72e7511a
RS
4192 return 0;
4193 }
4194 *entry = new_entry;
4195 }
4196 *slot = entry;
476366af 4197 mips_elf_count_got_entry (arg->info, arg->g, entry);
72e7511a 4198 }
33bb52fb
RS
4199 return 1;
4200}
4201
13db6b44
RS
4202/* Return the maximum number of GOT page entries required for RANGE. */
4203
4204static bfd_vma
4205mips_elf_pages_for_range (const struct mips_got_page_range *range)
4206{
4207 return (range->max_addend - range->min_addend + 0x1ffff) >> 16;
4208}
4209
4210/* Record that G requires a page entry that can reach SEC + ADDEND. */
4211
4212static bfd_boolean
b75d42bc 4213mips_elf_record_got_page_entry (struct mips_elf_traverse_got_arg *arg,
13db6b44
RS
4214 asection *sec, bfd_signed_vma addend)
4215{
b75d42bc 4216 struct mips_got_info *g = arg->g;
13db6b44
RS
4217 struct mips_got_page_entry lookup, *entry;
4218 struct mips_got_page_range **range_ptr, *range;
4219 bfd_vma old_pages, new_pages;
4220 void **loc;
4221
4222 /* Find the mips_got_page_entry hash table entry for this section. */
4223 lookup.sec = sec;
4224 loc = htab_find_slot (g->got_page_entries, &lookup, INSERT);
4225 if (loc == NULL)
4226 return FALSE;
4227
4228 /* Create a mips_got_page_entry if this is the first time we've
4229 seen the section. */
4230 entry = (struct mips_got_page_entry *) *loc;
4231 if (!entry)
4232 {
b75d42bc 4233 entry = bfd_zalloc (arg->info->output_bfd, sizeof (*entry));
13db6b44
RS
4234 if (!entry)
4235 return FALSE;
4236
4237 entry->sec = sec;
4238 *loc = entry;
4239 }
4240
4241 /* Skip over ranges whose maximum extent cannot share a page entry
4242 with ADDEND. */
4243 range_ptr = &entry->ranges;
4244 while (*range_ptr && addend > (*range_ptr)->max_addend + 0xffff)
4245 range_ptr = &(*range_ptr)->next;
4246
4247 /* If we scanned to the end of the list, or found a range whose
4248 minimum extent cannot share a page entry with ADDEND, create
4249 a new singleton range. */
4250 range = *range_ptr;
4251 if (!range || addend < range->min_addend - 0xffff)
4252 {
b75d42bc 4253 range = bfd_zalloc (arg->info->output_bfd, sizeof (*range));
13db6b44
RS
4254 if (!range)
4255 return FALSE;
4256
4257 range->next = *range_ptr;
4258 range->min_addend = addend;
4259 range->max_addend = addend;
4260
4261 *range_ptr = range;
4262 entry->num_pages++;
4263 g->page_gotno++;
4264 return TRUE;
4265 }
4266
4267 /* Remember how many pages the old range contributed. */
4268 old_pages = mips_elf_pages_for_range (range);
4269
4270 /* Update the ranges. */
4271 if (addend < range->min_addend)
4272 range->min_addend = addend;
4273 else if (addend > range->max_addend)
4274 {
4275 if (range->next && addend >= range->next->min_addend - 0xffff)
4276 {
4277 old_pages += mips_elf_pages_for_range (range->next);
4278 range->max_addend = range->next->max_addend;
4279 range->next = range->next->next;
4280 }
4281 else
4282 range->max_addend = addend;
4283 }
4284
4285 /* Record any change in the total estimate. */
4286 new_pages = mips_elf_pages_for_range (range);
4287 if (old_pages != new_pages)
4288 {
4289 entry->num_pages += new_pages - old_pages;
4290 g->page_gotno += new_pages - old_pages;
4291 }
4292
4293 return TRUE;
4294}
4295
4296/* A htab_traverse callback for which *REFP points to a mips_got_page_ref
4297 and for which DATA points to a mips_elf_traverse_got_arg. Work out
4298 whether the page reference described by *REFP needs a GOT page entry,
4299 and record that entry in DATA->g if so. Set DATA->g to null on failure. */
4300
4301static bfd_boolean
4302mips_elf_resolve_got_page_ref (void **refp, void *data)
4303{
4304 struct mips_got_page_ref *ref;
4305 struct mips_elf_traverse_got_arg *arg;
4306 struct mips_elf_link_hash_table *htab;
4307 asection *sec;
4308 bfd_vma addend;
4309
4310 ref = (struct mips_got_page_ref *) *refp;
4311 arg = (struct mips_elf_traverse_got_arg *) data;
4312 htab = mips_elf_hash_table (arg->info);
4313
4314 if (ref->symndx < 0)
4315 {
4316 struct mips_elf_link_hash_entry *h;
4317
4318 /* Global GOT_PAGEs decay to GOT_DISP and so don't need page entries. */
4319 h = ref->u.h;
4320 if (!SYMBOL_REFERENCES_LOCAL (arg->info, &h->root))
4321 return 1;
4322
4323 /* Ignore undefined symbols; we'll issue an error later if
4324 appropriate. */
4325 if (!((h->root.root.type == bfd_link_hash_defined
4326 || h->root.root.type == bfd_link_hash_defweak)
4327 && h->root.root.u.def.section))
4328 return 1;
4329
4330 sec = h->root.root.u.def.section;
4331 addend = h->root.root.u.def.value + ref->addend;
4332 }
4333 else
4334 {
4335 Elf_Internal_Sym *isym;
4336
4337 /* Read in the symbol. */
4338 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ref->u.abfd,
4339 ref->symndx);
4340 if (isym == NULL)
4341 {
4342 arg->g = NULL;
4343 return 0;
4344 }
4345
4346 /* Get the associated input section. */
4347 sec = bfd_section_from_elf_index (ref->u.abfd, isym->st_shndx);
4348 if (sec == NULL)
4349 {
4350 arg->g = NULL;
4351 return 0;
4352 }
4353
4354 /* If this is a mergable section, work out the section and offset
4355 of the merged data. For section symbols, the addend specifies
4356 of the offset _of_ the first byte in the data, otherwise it
4357 specifies the offset _from_ the first byte. */
4358 if (sec->flags & SEC_MERGE)
4359 {
4360 void *secinfo;
4361
4362 secinfo = elf_section_data (sec)->sec_info;
4363 if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
4364 addend = _bfd_merged_section_offset (ref->u.abfd, &sec, secinfo,
4365 isym->st_value + ref->addend);
4366 else
4367 addend = _bfd_merged_section_offset (ref->u.abfd, &sec, secinfo,
4368 isym->st_value) + ref->addend;
4369 }
4370 else
4371 addend = isym->st_value + ref->addend;
4372 }
b75d42bc 4373 if (!mips_elf_record_got_page_entry (arg, sec, addend))
13db6b44
RS
4374 {
4375 arg->g = NULL;
4376 return 0;
4377 }
4378 return 1;
4379}
4380
33bb52fb 4381/* If any entries in G->got_entries are for indirect or warning symbols,
13db6b44
RS
4382 replace them with entries for the target symbol. Convert g->got_page_refs
4383 into got_page_entry structures and estimate the number of page entries
4384 that they require. */
33bb52fb
RS
4385
4386static bfd_boolean
476366af
RS
4387mips_elf_resolve_final_got_entries (struct bfd_link_info *info,
4388 struct mips_got_info *g)
33bb52fb 4389{
476366af
RS
4390 struct mips_elf_traverse_got_arg tga;
4391 struct mips_got_info oldg;
4392
4393 oldg = *g;
33bb52fb 4394
476366af
RS
4395 tga.info = info;
4396 tga.g = g;
4397 tga.value = FALSE;
4398 htab_traverse (g->got_entries, mips_elf_check_recreate_got, &tga);
4399 if (tga.value)
33bb52fb 4400 {
476366af
RS
4401 *g = oldg;
4402 g->got_entries = htab_create (htab_size (oldg.got_entries),
4403 mips_elf_got_entry_hash,
4404 mips_elf_got_entry_eq, NULL);
4405 if (!g->got_entries)
33bb52fb
RS
4406 return FALSE;
4407
476366af
RS
4408 htab_traverse (oldg.got_entries, mips_elf_recreate_got, &tga);
4409 if (!tga.g)
4410 return FALSE;
4411
4412 htab_delete (oldg.got_entries);
33bb52fb 4413 }
13db6b44
RS
4414
4415 g->got_page_entries = htab_try_create (1, mips_got_page_entry_hash,
4416 mips_got_page_entry_eq, NULL);
4417 if (g->got_page_entries == NULL)
4418 return FALSE;
4419
4420 tga.info = info;
4421 tga.g = g;
4422 htab_traverse (g->got_page_refs, mips_elf_resolve_got_page_ref, &tga);
4423
33bb52fb
RS
4424 return TRUE;
4425}
4426
c5d6fa44
RS
4427/* Return true if a GOT entry for H should live in the local rather than
4428 global GOT area. */
4429
4430static bfd_boolean
4431mips_use_local_got_p (struct bfd_link_info *info,
4432 struct mips_elf_link_hash_entry *h)
4433{
4434 /* Symbols that aren't in the dynamic symbol table must live in the
4435 local GOT. This includes symbols that are completely undefined
4436 and which therefore don't bind locally. We'll report undefined
4437 symbols later if appropriate. */
4438 if (h->root.dynindx == -1)
4439 return TRUE;
4440
4441 /* Symbols that bind locally can (and in the case of forced-local
4442 symbols, must) live in the local GOT. */
4443 if (h->got_only_for_calls
4444 ? SYMBOL_CALLS_LOCAL (info, &h->root)
4445 : SYMBOL_REFERENCES_LOCAL (info, &h->root))
4446 return TRUE;
4447
4448 /* If this is an executable that must provide a definition of the symbol,
4449 either though PLTs or copy relocations, then that address should go in
4450 the local rather than global GOT. */
0e1862bb 4451 if (bfd_link_executable (info) && h->has_static_relocs)
c5d6fa44
RS
4452 return TRUE;
4453
4454 return FALSE;
4455}
4456
6c42ddb9
RS
4457/* A mips_elf_link_hash_traverse callback for which DATA points to the
4458 link_info structure. Decide whether the hash entry needs an entry in
4459 the global part of the primary GOT, setting global_got_area accordingly.
4460 Count the number of global symbols that are in the primary GOT only
4461 because they have relocations against them (reloc_only_gotno). */
33bb52fb
RS
4462
4463static int
d4596a51 4464mips_elf_count_got_symbols (struct mips_elf_link_hash_entry *h, void *data)
33bb52fb 4465{
020d7251 4466 struct bfd_link_info *info;
6ccf4795 4467 struct mips_elf_link_hash_table *htab;
33bb52fb
RS
4468 struct mips_got_info *g;
4469
020d7251 4470 info = (struct bfd_link_info *) data;
6ccf4795
RS
4471 htab = mips_elf_hash_table (info);
4472 g = htab->got_info;
d4596a51 4473 if (h->global_got_area != GGA_NONE)
33bb52fb 4474 {
020d7251 4475 /* Make a final decision about whether the symbol belongs in the
c5d6fa44
RS
4476 local or global GOT. */
4477 if (mips_use_local_got_p (info, h))
6c42ddb9
RS
4478 /* The symbol belongs in the local GOT. We no longer need this
4479 entry if it was only used for relocations; those relocations
4480 will be against the null or section symbol instead of H. */
4481 h->global_got_area = GGA_NONE;
6ccf4795
RS
4482 else if (htab->is_vxworks
4483 && h->got_only_for_calls
1bbce132 4484 && h->root.plt.plist->mips_offset != MINUS_ONE)
6ccf4795
RS
4485 /* On VxWorks, calls can refer directly to the .got.plt entry;
4486 they don't need entries in the regular GOT. .got.plt entries
4487 will be allocated by _bfd_mips_elf_adjust_dynamic_symbol. */
4488 h->global_got_area = GGA_NONE;
6c42ddb9 4489 else if (h->global_got_area == GGA_RELOC_ONLY)
23cc69b6 4490 {
6c42ddb9 4491 g->reloc_only_gotno++;
23cc69b6 4492 g->global_gotno++;
23cc69b6 4493 }
33bb52fb
RS
4494 }
4495 return 1;
4496}
f4416af6 4497\f
d7206569
RS
4498/* A htab_traverse callback for GOT entries. Add each one to the GOT
4499 given in mips_elf_traverse_got_arg DATA. Clear DATA->G on error. */
f4416af6
AO
4500
4501static int
d7206569 4502mips_elf_add_got_entry (void **entryp, void *data)
f4416af6 4503{
d7206569
RS
4504 struct mips_got_entry *entry;
4505 struct mips_elf_traverse_got_arg *arg;
4506 void **slot;
f4416af6 4507
d7206569
RS
4508 entry = (struct mips_got_entry *) *entryp;
4509 arg = (struct mips_elf_traverse_got_arg *) data;
4510 slot = htab_find_slot (arg->g->got_entries, entry, INSERT);
4511 if (!slot)
f4416af6 4512 {
d7206569
RS
4513 arg->g = NULL;
4514 return 0;
f4416af6 4515 }
d7206569 4516 if (!*slot)
c224138d 4517 {
d7206569
RS
4518 *slot = entry;
4519 mips_elf_count_got_entry (arg->info, arg->g, entry);
c224138d 4520 }
f4416af6
AO
4521 return 1;
4522}
4523
d7206569
RS
4524/* A htab_traverse callback for GOT page entries. Add each one to the GOT
4525 given in mips_elf_traverse_got_arg DATA. Clear DATA->G on error. */
c224138d
RS
4526
4527static int
d7206569 4528mips_elf_add_got_page_entry (void **entryp, void *data)
c224138d 4529{
d7206569
RS
4530 struct mips_got_page_entry *entry;
4531 struct mips_elf_traverse_got_arg *arg;
4532 void **slot;
c224138d 4533
d7206569
RS
4534 entry = (struct mips_got_page_entry *) *entryp;
4535 arg = (struct mips_elf_traverse_got_arg *) data;
4536 slot = htab_find_slot (arg->g->got_page_entries, entry, INSERT);
4537 if (!slot)
c224138d 4538 {
d7206569 4539 arg->g = NULL;
c224138d
RS
4540 return 0;
4541 }
d7206569
RS
4542 if (!*slot)
4543 {
4544 *slot = entry;
4545 arg->g->page_gotno += entry->num_pages;
4546 }
c224138d
RS
4547 return 1;
4548}
4549
d7206569
RS
4550/* Consider merging FROM, which is ABFD's GOT, into TO. Return -1 if
4551 this would lead to overflow, 1 if they were merged successfully,
4552 and 0 if a merge failed due to lack of memory. (These values are chosen
4553 so that nonnegative return values can be returned by a htab_traverse
4554 callback.) */
c224138d
RS
4555
4556static int
d7206569 4557mips_elf_merge_got_with (bfd *abfd, struct mips_got_info *from,
c224138d
RS
4558 struct mips_got_info *to,
4559 struct mips_elf_got_per_bfd_arg *arg)
4560{
d7206569 4561 struct mips_elf_traverse_got_arg tga;
c224138d
RS
4562 unsigned int estimate;
4563
4564 /* Work out how many page entries we would need for the combined GOT. */
4565 estimate = arg->max_pages;
4566 if (estimate >= from->page_gotno + to->page_gotno)
4567 estimate = from->page_gotno + to->page_gotno;
4568
e2ece73c 4569 /* And conservatively estimate how many local and TLS entries
c224138d 4570 would be needed. */
e2ece73c
RS
4571 estimate += from->local_gotno + to->local_gotno;
4572 estimate += from->tls_gotno + to->tls_gotno;
4573
17214937
RS
4574 /* If we're merging with the primary got, any TLS relocations will
4575 come after the full set of global entries. Otherwise estimate those
e2ece73c 4576 conservatively as well. */
17214937 4577 if (to == arg->primary && from->tls_gotno + to->tls_gotno)
e2ece73c
RS
4578 estimate += arg->global_count;
4579 else
4580 estimate += from->global_gotno + to->global_gotno;
c224138d
RS
4581
4582 /* Bail out if the combined GOT might be too big. */
4583 if (estimate > arg->max_count)
4584 return -1;
4585
c224138d 4586 /* Transfer the bfd's got information from FROM to TO. */
d7206569
RS
4587 tga.info = arg->info;
4588 tga.g = to;
4589 htab_traverse (from->got_entries, mips_elf_add_got_entry, &tga);
4590 if (!tga.g)
c224138d
RS
4591 return 0;
4592
d7206569
RS
4593 htab_traverse (from->got_page_entries, mips_elf_add_got_page_entry, &tga);
4594 if (!tga.g)
c224138d
RS
4595 return 0;
4596
d7206569 4597 mips_elf_replace_bfd_got (abfd, to);
c224138d
RS
4598 return 1;
4599}
4600
d7206569 4601/* Attempt to merge GOT G, which belongs to ABFD. Try to use as much
f4416af6
AO
4602 as possible of the primary got, since it doesn't require explicit
4603 dynamic relocations, but don't use bfds that would reference global
4604 symbols out of the addressable range. Failing the primary got,
4605 attempt to merge with the current got, or finish the current got
4606 and then make make the new got current. */
4607
d7206569
RS
4608static bfd_boolean
4609mips_elf_merge_got (bfd *abfd, struct mips_got_info *g,
4610 struct mips_elf_got_per_bfd_arg *arg)
f4416af6 4611{
c224138d
RS
4612 unsigned int estimate;
4613 int result;
4614
476366af 4615 if (!mips_elf_resolve_final_got_entries (arg->info, g))
d7206569
RS
4616 return FALSE;
4617
c224138d
RS
4618 /* Work out the number of page, local and TLS entries. */
4619 estimate = arg->max_pages;
4620 if (estimate > g->page_gotno)
4621 estimate = g->page_gotno;
4622 estimate += g->local_gotno + g->tls_gotno;
0f20cc35
DJ
4623
4624 /* We place TLS GOT entries after both locals and globals. The globals
4625 for the primary GOT may overflow the normal GOT size limit, so be
4626 sure not to merge a GOT which requires TLS with the primary GOT in that
4627 case. This doesn't affect non-primary GOTs. */
c224138d 4628 estimate += (g->tls_gotno > 0 ? arg->global_count : g->global_gotno);
143d77c5 4629
c224138d 4630 if (estimate <= arg->max_count)
f4416af6 4631 {
c224138d
RS
4632 /* If we don't have a primary GOT, use it as
4633 a starting point for the primary GOT. */
4634 if (!arg->primary)
4635 {
d7206569
RS
4636 arg->primary = g;
4637 return TRUE;
c224138d 4638 }
f4416af6 4639
c224138d 4640 /* Try merging with the primary GOT. */
d7206569 4641 result = mips_elf_merge_got_with (abfd, g, arg->primary, arg);
c224138d
RS
4642 if (result >= 0)
4643 return result;
f4416af6 4644 }
c224138d 4645
f4416af6 4646 /* If we can merge with the last-created got, do it. */
c224138d 4647 if (arg->current)
f4416af6 4648 {
d7206569 4649 result = mips_elf_merge_got_with (abfd, g, arg->current, arg);
c224138d
RS
4650 if (result >= 0)
4651 return result;
f4416af6 4652 }
c224138d 4653
f4416af6
AO
4654 /* Well, we couldn't merge, so create a new GOT. Don't check if it
4655 fits; if it turns out that it doesn't, we'll get relocation
4656 overflows anyway. */
c224138d
RS
4657 g->next = arg->current;
4658 arg->current = g;
0f20cc35 4659
d7206569 4660 return TRUE;
0f20cc35
DJ
4661}
4662
72e7511a
RS
4663/* ENTRYP is a hash table entry for a mips_got_entry. Set its gotidx
4664 to GOTIDX, duplicating the entry if it has already been assigned
4665 an index in a different GOT. */
4666
4667static bfd_boolean
4668mips_elf_set_gotidx (void **entryp, long gotidx)
4669{
4670 struct mips_got_entry *entry;
4671
4672 entry = (struct mips_got_entry *) *entryp;
4673 if (entry->gotidx > 0)
4674 {
4675 struct mips_got_entry *new_entry;
4676
4677 new_entry = bfd_alloc (entry->abfd, sizeof (*entry));
4678 if (!new_entry)
4679 return FALSE;
4680
4681 *new_entry = *entry;
4682 *entryp = new_entry;
4683 entry = new_entry;
4684 }
4685 entry->gotidx = gotidx;
4686 return TRUE;
4687}
4688
4689/* Set the TLS GOT index for the GOT entry in ENTRYP. DATA points to a
4690 mips_elf_traverse_got_arg in which DATA->value is the size of one
4691 GOT entry. Set DATA->g to null on failure. */
0f20cc35
DJ
4692
4693static int
72e7511a 4694mips_elf_initialize_tls_index (void **entryp, void *data)
0f20cc35 4695{
72e7511a
RS
4696 struct mips_got_entry *entry;
4697 struct mips_elf_traverse_got_arg *arg;
0f20cc35
DJ
4698
4699 /* We're only interested in TLS symbols. */
72e7511a 4700 entry = (struct mips_got_entry *) *entryp;
9ab066b4 4701 if (entry->tls_type == GOT_TLS_NONE)
0f20cc35
DJ
4702 return 1;
4703
72e7511a 4704 arg = (struct mips_elf_traverse_got_arg *) data;
6c42ddb9 4705 if (!mips_elf_set_gotidx (entryp, arg->value * arg->g->tls_assigned_gotno))
ead49a57 4706 {
6c42ddb9
RS
4707 arg->g = NULL;
4708 return 0;
f4416af6
AO
4709 }
4710
ead49a57 4711 /* Account for the entries we've just allocated. */
9ab066b4 4712 arg->g->tls_assigned_gotno += mips_tls_got_entries (entry->tls_type);
f4416af6
AO
4713 return 1;
4714}
4715
ab361d49
RS
4716/* A htab_traverse callback for GOT entries, where DATA points to a
4717 mips_elf_traverse_got_arg. Set the global_got_area of each global
4718 symbol to DATA->value. */
f4416af6 4719
f4416af6 4720static int
ab361d49 4721mips_elf_set_global_got_area (void **entryp, void *data)
f4416af6 4722{
ab361d49
RS
4723 struct mips_got_entry *entry;
4724 struct mips_elf_traverse_got_arg *arg;
f4416af6 4725
ab361d49
RS
4726 entry = (struct mips_got_entry *) *entryp;
4727 arg = (struct mips_elf_traverse_got_arg *) data;
4728 if (entry->abfd != NULL
4729 && entry->symndx == -1
4730 && entry->d.h->global_got_area != GGA_NONE)
4731 entry->d.h->global_got_area = arg->value;
4732 return 1;
4733}
4734
4735/* A htab_traverse callback for secondary GOT entries, where DATA points
4736 to a mips_elf_traverse_got_arg. Assign GOT indices to global entries
4737 and record the number of relocations they require. DATA->value is
72e7511a 4738 the size of one GOT entry. Set DATA->g to null on failure. */
ab361d49
RS
4739
4740static int
4741mips_elf_set_global_gotidx (void **entryp, void *data)
4742{
4743 struct mips_got_entry *entry;
4744 struct mips_elf_traverse_got_arg *arg;
0f20cc35 4745
ab361d49
RS
4746 entry = (struct mips_got_entry *) *entryp;
4747 arg = (struct mips_elf_traverse_got_arg *) data;
634835ae
RS
4748 if (entry->abfd != NULL
4749 && entry->symndx == -1
4750 && entry->d.h->global_got_area != GGA_NONE)
f4416af6 4751 {
cb22ccf4 4752 if (!mips_elf_set_gotidx (entryp, arg->value * arg->g->assigned_low_gotno))
72e7511a
RS
4753 {
4754 arg->g = NULL;
4755 return 0;
4756 }
cb22ccf4 4757 arg->g->assigned_low_gotno += 1;
72e7511a 4758
0e1862bb 4759 if (bfd_link_pic (arg->info)
ab361d49
RS
4760 || (elf_hash_table (arg->info)->dynamic_sections_created
4761 && entry->d.h->root.def_dynamic
4762 && !entry->d.h->root.def_regular))
4763 arg->g->relocs += 1;
f4416af6
AO
4764 }
4765
4766 return 1;
4767}
4768
33bb52fb
RS
4769/* A htab_traverse callback for GOT entries for which DATA is the
4770 bfd_link_info. Forbid any global symbols from having traditional
4771 lazy-binding stubs. */
4772
0626d451 4773static int
33bb52fb 4774mips_elf_forbid_lazy_stubs (void **entryp, void *data)
0626d451 4775{
33bb52fb
RS
4776 struct bfd_link_info *info;
4777 struct mips_elf_link_hash_table *htab;
4778 struct mips_got_entry *entry;
0626d451 4779
33bb52fb
RS
4780 entry = (struct mips_got_entry *) *entryp;
4781 info = (struct bfd_link_info *) data;
4782 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4783 BFD_ASSERT (htab != NULL);
4784
0626d451
RS
4785 if (entry->abfd != NULL
4786 && entry->symndx == -1
33bb52fb 4787 && entry->d.h->needs_lazy_stub)
f4416af6 4788 {
33bb52fb
RS
4789 entry->d.h->needs_lazy_stub = FALSE;
4790 htab->lazy_stub_count--;
f4416af6 4791 }
143d77c5 4792
f4416af6
AO
4793 return 1;
4794}
4795
f4416af6
AO
4796/* Return the offset of an input bfd IBFD's GOT from the beginning of
4797 the primary GOT. */
4798static bfd_vma
9719ad41 4799mips_elf_adjust_gp (bfd *abfd, struct mips_got_info *g, bfd *ibfd)
f4416af6 4800{
d7206569 4801 if (!g->next)
f4416af6
AO
4802 return 0;
4803
d7206569 4804 g = mips_elf_bfd_got (ibfd, FALSE);
f4416af6
AO
4805 if (! g)
4806 return 0;
4807
4808 BFD_ASSERT (g->next);
4809
4810 g = g->next;
143d77c5 4811
0f20cc35
DJ
4812 return (g->local_gotno + g->global_gotno + g->tls_gotno)
4813 * MIPS_ELF_GOT_SIZE (abfd);
f4416af6
AO
4814}
4815
4816/* Turn a single GOT that is too big for 16-bit addressing into
4817 a sequence of GOTs, each one 16-bit addressable. */
4818
4819static bfd_boolean
9719ad41 4820mips_elf_multi_got (bfd *abfd, struct bfd_link_info *info,
a8028dd0 4821 asection *got, bfd_size_type pages)
f4416af6 4822{
a8028dd0 4823 struct mips_elf_link_hash_table *htab;
f4416af6 4824 struct mips_elf_got_per_bfd_arg got_per_bfd_arg;
ab361d49 4825 struct mips_elf_traverse_got_arg tga;
a8028dd0 4826 struct mips_got_info *g, *gg;
33bb52fb 4827 unsigned int assign, needed_relocs;
d7206569 4828 bfd *dynobj, *ibfd;
f4416af6 4829
33bb52fb 4830 dynobj = elf_hash_table (info)->dynobj;
a8028dd0 4831 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4832 BFD_ASSERT (htab != NULL);
4833
a8028dd0 4834 g = htab->got_info;
f4416af6 4835
f4416af6
AO
4836 got_per_bfd_arg.obfd = abfd;
4837 got_per_bfd_arg.info = info;
f4416af6
AO
4838 got_per_bfd_arg.current = NULL;
4839 got_per_bfd_arg.primary = NULL;
0a44bf69 4840 got_per_bfd_arg.max_count = ((MIPS_ELF_GOT_MAX_SIZE (info)
f4416af6 4841 / MIPS_ELF_GOT_SIZE (abfd))
861fb55a 4842 - htab->reserved_gotno);
c224138d 4843 got_per_bfd_arg.max_pages = pages;
0f20cc35 4844 /* The number of globals that will be included in the primary GOT.
ab361d49 4845 See the calls to mips_elf_set_global_got_area below for more
0f20cc35
DJ
4846 information. */
4847 got_per_bfd_arg.global_count = g->global_gotno;
f4416af6
AO
4848
4849 /* Try to merge the GOTs of input bfds together, as long as they
4850 don't seem to exceed the maximum GOT size, choosing one of them
4851 to be the primary GOT. */
c72f2fb2 4852 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
d7206569
RS
4853 {
4854 gg = mips_elf_bfd_got (ibfd, FALSE);
4855 if (gg && !mips_elf_merge_got (ibfd, gg, &got_per_bfd_arg))
4856 return FALSE;
4857 }
f4416af6 4858
0f20cc35 4859 /* If we do not find any suitable primary GOT, create an empty one. */
f4416af6 4860 if (got_per_bfd_arg.primary == NULL)
3dff0dd1 4861 g->next = mips_elf_create_got_info (abfd);
f4416af6
AO
4862 else
4863 g->next = got_per_bfd_arg.primary;
4864 g->next->next = got_per_bfd_arg.current;
4865
4866 /* GG is now the master GOT, and G is the primary GOT. */
4867 gg = g;
4868 g = g->next;
4869
4870 /* Map the output bfd to the primary got. That's what we're going
4871 to use for bfds that use GOT16 or GOT_PAGE relocations that we
4872 didn't mark in check_relocs, and we want a quick way to find it.
4873 We can't just use gg->next because we're going to reverse the
4874 list. */
d7206569 4875 mips_elf_replace_bfd_got (abfd, g);
f4416af6 4876
634835ae
RS
4877 /* Every symbol that is referenced in a dynamic relocation must be
4878 present in the primary GOT, so arrange for them to appear after
4879 those that are actually referenced. */
23cc69b6 4880 gg->reloc_only_gotno = gg->global_gotno - g->global_gotno;
634835ae 4881 g->global_gotno = gg->global_gotno;
f4416af6 4882
ab361d49
RS
4883 tga.info = info;
4884 tga.value = GGA_RELOC_ONLY;
4885 htab_traverse (gg->got_entries, mips_elf_set_global_got_area, &tga);
4886 tga.value = GGA_NORMAL;
4887 htab_traverse (g->got_entries, mips_elf_set_global_got_area, &tga);
f4416af6
AO
4888
4889 /* Now go through the GOTs assigning them offset ranges.
cb22ccf4 4890 [assigned_low_gotno, local_gotno[ will be set to the range of local
f4416af6
AO
4891 entries in each GOT. We can then compute the end of a GOT by
4892 adding local_gotno to global_gotno. We reverse the list and make
4893 it circular since then we'll be able to quickly compute the
4894 beginning of a GOT, by computing the end of its predecessor. To
4895 avoid special cases for the primary GOT, while still preserving
4896 assertions that are valid for both single- and multi-got links,
4897 we arrange for the main got struct to have the right number of
4898 global entries, but set its local_gotno such that the initial
4899 offset of the primary GOT is zero. Remember that the primary GOT
4900 will become the last item in the circular linked list, so it
4901 points back to the master GOT. */
4902 gg->local_gotno = -g->global_gotno;
4903 gg->global_gotno = g->global_gotno;
0f20cc35 4904 gg->tls_gotno = 0;
f4416af6
AO
4905 assign = 0;
4906 gg->next = gg;
4907
4908 do
4909 {
4910 struct mips_got_info *gn;
4911
861fb55a 4912 assign += htab->reserved_gotno;
cb22ccf4 4913 g->assigned_low_gotno = assign;
c224138d
RS
4914 g->local_gotno += assign;
4915 g->local_gotno += (pages < g->page_gotno ? pages : g->page_gotno);
cb22ccf4 4916 g->assigned_high_gotno = g->local_gotno - 1;
0f20cc35
DJ
4917 assign = g->local_gotno + g->global_gotno + g->tls_gotno;
4918
ead49a57
RS
4919 /* Take g out of the direct list, and push it onto the reversed
4920 list that gg points to. g->next is guaranteed to be nonnull after
4921 this operation, as required by mips_elf_initialize_tls_index. */
4922 gn = g->next;
4923 g->next = gg->next;
4924 gg->next = g;
4925
0f20cc35
DJ
4926 /* Set up any TLS entries. We always place the TLS entries after
4927 all non-TLS entries. */
4928 g->tls_assigned_gotno = g->local_gotno + g->global_gotno;
72e7511a
RS
4929 tga.g = g;
4930 tga.value = MIPS_ELF_GOT_SIZE (abfd);
4931 htab_traverse (g->got_entries, mips_elf_initialize_tls_index, &tga);
4932 if (!tga.g)
4933 return FALSE;
1fd20d70 4934 BFD_ASSERT (g->tls_assigned_gotno == assign);
f4416af6 4935
ead49a57 4936 /* Move onto the next GOT. It will be a secondary GOT if nonull. */
f4416af6 4937 g = gn;
0626d451 4938
33bb52fb
RS
4939 /* Forbid global symbols in every non-primary GOT from having
4940 lazy-binding stubs. */
0626d451 4941 if (g)
33bb52fb 4942 htab_traverse (g->got_entries, mips_elf_forbid_lazy_stubs, info);
f4416af6
AO
4943 }
4944 while (g);
4945
59b08994 4946 got->size = assign * MIPS_ELF_GOT_SIZE (abfd);
33bb52fb
RS
4947
4948 needed_relocs = 0;
33bb52fb
RS
4949 for (g = gg->next; g && g->next != gg; g = g->next)
4950 {
4951 unsigned int save_assign;
4952
ab361d49
RS
4953 /* Assign offsets to global GOT entries and count how many
4954 relocations they need. */
cb22ccf4
KCY
4955 save_assign = g->assigned_low_gotno;
4956 g->assigned_low_gotno = g->local_gotno;
ab361d49
RS
4957 tga.info = info;
4958 tga.value = MIPS_ELF_GOT_SIZE (abfd);
4959 tga.g = g;
4960 htab_traverse (g->got_entries, mips_elf_set_global_gotidx, &tga);
72e7511a
RS
4961 if (!tga.g)
4962 return FALSE;
cb22ccf4
KCY
4963 BFD_ASSERT (g->assigned_low_gotno == g->local_gotno + g->global_gotno);
4964 g->assigned_low_gotno = save_assign;
72e7511a 4965
0e1862bb 4966 if (bfd_link_pic (info))
33bb52fb 4967 {
cb22ccf4
KCY
4968 g->relocs += g->local_gotno - g->assigned_low_gotno;
4969 BFD_ASSERT (g->assigned_low_gotno == g->next->local_gotno
33bb52fb
RS
4970 + g->next->global_gotno
4971 + g->next->tls_gotno
861fb55a 4972 + htab->reserved_gotno);
33bb52fb 4973 }
ab361d49 4974 needed_relocs += g->relocs;
33bb52fb 4975 }
ab361d49 4976 needed_relocs += g->relocs;
33bb52fb
RS
4977
4978 if (needed_relocs)
4979 mips_elf_allocate_dynamic_relocations (dynobj, info,
4980 needed_relocs);
143d77c5 4981
f4416af6
AO
4982 return TRUE;
4983}
143d77c5 4984
b49e97c9
TS
4985\f
4986/* Returns the first relocation of type r_type found, beginning with
4987 RELOCATION. RELEND is one-past-the-end of the relocation table. */
4988
4989static const Elf_Internal_Rela *
9719ad41
RS
4990mips_elf_next_relocation (bfd *abfd ATTRIBUTE_UNUSED, unsigned int r_type,
4991 const Elf_Internal_Rela *relocation,
4992 const Elf_Internal_Rela *relend)
b49e97c9 4993{
c000e262
TS
4994 unsigned long r_symndx = ELF_R_SYM (abfd, relocation->r_info);
4995
b49e97c9
TS
4996 while (relocation < relend)
4997 {
c000e262
TS
4998 if (ELF_R_TYPE (abfd, relocation->r_info) == r_type
4999 && ELF_R_SYM (abfd, relocation->r_info) == r_symndx)
b49e97c9
TS
5000 return relocation;
5001
5002 ++relocation;
5003 }
5004
5005 /* We didn't find it. */
b49e97c9
TS
5006 return NULL;
5007}
5008
020d7251 5009/* Return whether an input relocation is against a local symbol. */
b49e97c9 5010
b34976b6 5011static bfd_boolean
9719ad41
RS
5012mips_elf_local_relocation_p (bfd *input_bfd,
5013 const Elf_Internal_Rela *relocation,
020d7251 5014 asection **local_sections)
b49e97c9
TS
5015{
5016 unsigned long r_symndx;
5017 Elf_Internal_Shdr *symtab_hdr;
b49e97c9
TS
5018 size_t extsymoff;
5019
5020 r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
5021 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5022 extsymoff = (elf_bad_symtab (input_bfd)) ? 0 : symtab_hdr->sh_info;
5023
5024 if (r_symndx < extsymoff)
b34976b6 5025 return TRUE;
b49e97c9 5026 if (elf_bad_symtab (input_bfd) && local_sections[r_symndx] != NULL)
b34976b6 5027 return TRUE;
b49e97c9 5028
b34976b6 5029 return FALSE;
b49e97c9
TS
5030}
5031\f
5032/* Sign-extend VALUE, which has the indicated number of BITS. */
5033
a7ebbfdf 5034bfd_vma
9719ad41 5035_bfd_mips_elf_sign_extend (bfd_vma value, int bits)
b49e97c9
TS
5036{
5037 if (value & ((bfd_vma) 1 << (bits - 1)))
5038 /* VALUE is negative. */
5039 value |= ((bfd_vma) - 1) << bits;
5040
5041 return value;
5042}
5043
5044/* Return non-zero if the indicated VALUE has overflowed the maximum
4cc11e76 5045 range expressible by a signed number with the indicated number of
b49e97c9
TS
5046 BITS. */
5047
b34976b6 5048static bfd_boolean
9719ad41 5049mips_elf_overflow_p (bfd_vma value, int bits)
b49e97c9
TS
5050{
5051 bfd_signed_vma svalue = (bfd_signed_vma) value;
5052
5053 if (svalue > (1 << (bits - 1)) - 1)
5054 /* The value is too big. */
b34976b6 5055 return TRUE;
b49e97c9
TS
5056 else if (svalue < -(1 << (bits - 1)))
5057 /* The value is too small. */
b34976b6 5058 return TRUE;
b49e97c9
TS
5059
5060 /* All is well. */
b34976b6 5061 return FALSE;
b49e97c9
TS
5062}
5063
5064/* Calculate the %high function. */
5065
5066static bfd_vma
9719ad41 5067mips_elf_high (bfd_vma value)
b49e97c9
TS
5068{
5069 return ((value + (bfd_vma) 0x8000) >> 16) & 0xffff;
5070}
5071
5072/* Calculate the %higher function. */
5073
5074static bfd_vma
9719ad41 5075mips_elf_higher (bfd_vma value ATTRIBUTE_UNUSED)
b49e97c9
TS
5076{
5077#ifdef BFD64
5078 return ((value + (bfd_vma) 0x80008000) >> 32) & 0xffff;
5079#else
5080 abort ();
c5ae1840 5081 return MINUS_ONE;
b49e97c9
TS
5082#endif
5083}
5084
5085/* Calculate the %highest function. */
5086
5087static bfd_vma
9719ad41 5088mips_elf_highest (bfd_vma value ATTRIBUTE_UNUSED)
b49e97c9
TS
5089{
5090#ifdef BFD64
b15e6682 5091 return ((value + (((bfd_vma) 0x8000 << 32) | 0x80008000)) >> 48) & 0xffff;
b49e97c9
TS
5092#else
5093 abort ();
c5ae1840 5094 return MINUS_ONE;
b49e97c9
TS
5095#endif
5096}
5097\f
5098/* Create the .compact_rel section. */
5099
b34976b6 5100static bfd_boolean
9719ad41
RS
5101mips_elf_create_compact_rel_section
5102 (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
b49e97c9
TS
5103{
5104 flagword flags;
5105 register asection *s;
5106
3d4d4302 5107 if (bfd_get_linker_section (abfd, ".compact_rel") == NULL)
b49e97c9
TS
5108 {
5109 flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED
5110 | SEC_READONLY);
5111
3d4d4302 5112 s = bfd_make_section_anyway_with_flags (abfd, ".compact_rel", flags);
b49e97c9 5113 if (s == NULL
b49e97c9
TS
5114 || ! bfd_set_section_alignment (abfd, s,
5115 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
b34976b6 5116 return FALSE;
b49e97c9 5117
eea6121a 5118 s->size = sizeof (Elf32_External_compact_rel);
b49e97c9
TS
5119 }
5120
b34976b6 5121 return TRUE;
b49e97c9
TS
5122}
5123
5124/* Create the .got section to hold the global offset table. */
5125
b34976b6 5126static bfd_boolean
23cc69b6 5127mips_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
b49e97c9
TS
5128{
5129 flagword flags;
5130 register asection *s;
5131 struct elf_link_hash_entry *h;
14a793b2 5132 struct bfd_link_hash_entry *bh;
0a44bf69
RS
5133 struct mips_elf_link_hash_table *htab;
5134
5135 htab = mips_elf_hash_table (info);
4dfe6ac6 5136 BFD_ASSERT (htab != NULL);
b49e97c9
TS
5137
5138 /* This function may be called more than once. */
23cc69b6
RS
5139 if (htab->sgot)
5140 return TRUE;
b49e97c9
TS
5141
5142 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
5143 | SEC_LINKER_CREATED);
5144
72b4917c
TS
5145 /* We have to use an alignment of 2**4 here because this is hardcoded
5146 in the function stub generation and in the linker script. */
87e0a731 5147 s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
b49e97c9 5148 if (s == NULL
72b4917c 5149 || ! bfd_set_section_alignment (abfd, s, 4))
b34976b6 5150 return FALSE;
a8028dd0 5151 htab->sgot = s;
b49e97c9
TS
5152
5153 /* Define the symbol _GLOBAL_OFFSET_TABLE_. We don't do this in the
5154 linker script because we don't want to define the symbol if we
5155 are not creating a global offset table. */
14a793b2 5156 bh = NULL;
b49e97c9
TS
5157 if (! (_bfd_generic_link_add_one_symbol
5158 (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
9719ad41 5159 0, NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 5160 return FALSE;
14a793b2
AM
5161
5162 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
5163 h->non_elf = 0;
5164 h->def_regular = 1;
b49e97c9 5165 h->type = STT_OBJECT;
2f9efdfc 5166 h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
d329bcd1 5167 elf_hash_table (info)->hgot = h;
b49e97c9 5168
0e1862bb 5169 if (bfd_link_pic (info)
c152c796 5170 && ! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 5171 return FALSE;
b49e97c9 5172
3dff0dd1 5173 htab->got_info = mips_elf_create_got_info (abfd);
f0abc2a1 5174 mips_elf_section_data (s)->elf.this_hdr.sh_flags
b49e97c9
TS
5175 |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
5176
861fb55a 5177 /* We also need a .got.plt section when generating PLTs. */
87e0a731
AM
5178 s = bfd_make_section_anyway_with_flags (abfd, ".got.plt",
5179 SEC_ALLOC | SEC_LOAD
5180 | SEC_HAS_CONTENTS
5181 | SEC_IN_MEMORY
5182 | SEC_LINKER_CREATED);
861fb55a
DJ
5183 if (s == NULL)
5184 return FALSE;
5185 htab->sgotplt = s;
0a44bf69 5186
b34976b6 5187 return TRUE;
b49e97c9 5188}
b49e97c9 5189\f
0a44bf69
RS
5190/* Return true if H refers to the special VxWorks __GOTT_BASE__ or
5191 __GOTT_INDEX__ symbols. These symbols are only special for
5192 shared objects; they are not used in executables. */
5193
5194static bfd_boolean
5195is_gott_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h)
5196{
5197 return (mips_elf_hash_table (info)->is_vxworks
0e1862bb 5198 && bfd_link_pic (info)
0a44bf69
RS
5199 && (strcmp (h->root.root.string, "__GOTT_BASE__") == 0
5200 || strcmp (h->root.root.string, "__GOTT_INDEX__") == 0));
5201}
861fb55a
DJ
5202
5203/* Return TRUE if a relocation of type R_TYPE from INPUT_BFD might
5204 require an la25 stub. See also mips_elf_local_pic_function_p,
5205 which determines whether the destination function ever requires a
5206 stub. */
5207
5208static bfd_boolean
8f0c309a
CLT
5209mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type,
5210 bfd_boolean target_is_16_bit_code_p)
861fb55a
DJ
5211{
5212 /* We specifically ignore branches and jumps from EF_PIC objects,
5213 where the onus is on the compiler or programmer to perform any
5214 necessary initialization of $25. Sometimes such initialization
5215 is unnecessary; for example, -mno-shared functions do not use
5216 the incoming value of $25, and may therefore be called directly. */
5217 if (PIC_OBJECT_P (input_bfd))
5218 return FALSE;
5219
5220 switch (r_type)
5221 {
5222 case R_MIPS_26:
5223 case R_MIPS_PC16:
7361da2c
AB
5224 case R_MIPS_PC21_S2:
5225 case R_MIPS_PC26_S2:
df58fc94
RS
5226 case R_MICROMIPS_26_S1:
5227 case R_MICROMIPS_PC7_S1:
5228 case R_MICROMIPS_PC10_S1:
5229 case R_MICROMIPS_PC16_S1:
5230 case R_MICROMIPS_PC23_S2:
861fb55a
DJ
5231 return TRUE;
5232
8f0c309a
CLT
5233 case R_MIPS16_26:
5234 return !target_is_16_bit_code_p;
5235
861fb55a
DJ
5236 default:
5237 return FALSE;
5238 }
5239}
0a44bf69 5240\f
b49e97c9
TS
5241/* Calculate the value produced by the RELOCATION (which comes from
5242 the INPUT_BFD). The ADDEND is the addend to use for this
5243 RELOCATION; RELOCATION->R_ADDEND is ignored.
5244
5245 The result of the relocation calculation is stored in VALUEP.
38a7df63 5246 On exit, set *CROSS_MODE_JUMP_P to true if the relocation field
df58fc94 5247 is a MIPS16 or microMIPS jump to standard MIPS code, or vice versa.
b49e97c9
TS
5248
5249 This function returns bfd_reloc_continue if the caller need take no
5250 further action regarding this relocation, bfd_reloc_notsupported if
5251 something goes dramatically wrong, bfd_reloc_overflow if an
5252 overflow occurs, and bfd_reloc_ok to indicate success. */
5253
5254static bfd_reloc_status_type
9719ad41
RS
5255mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
5256 asection *input_section,
5257 struct bfd_link_info *info,
5258 const Elf_Internal_Rela *relocation,
5259 bfd_vma addend, reloc_howto_type *howto,
5260 Elf_Internal_Sym *local_syms,
5261 asection **local_sections, bfd_vma *valuep,
38a7df63
CF
5262 const char **namep,
5263 bfd_boolean *cross_mode_jump_p,
9719ad41 5264 bfd_boolean save_addend)
b49e97c9
TS
5265{
5266 /* The eventual value we will return. */
5267 bfd_vma value;
5268 /* The address of the symbol against which the relocation is
5269 occurring. */
5270 bfd_vma symbol = 0;
5271 /* The final GP value to be used for the relocatable, executable, or
5272 shared object file being produced. */
0a61c8c2 5273 bfd_vma gp;
b49e97c9
TS
5274 /* The place (section offset or address) of the storage unit being
5275 relocated. */
5276 bfd_vma p;
5277 /* The value of GP used to create the relocatable object. */
0a61c8c2 5278 bfd_vma gp0;
b49e97c9
TS
5279 /* The offset into the global offset table at which the address of
5280 the relocation entry symbol, adjusted by the addend, resides
5281 during execution. */
5282 bfd_vma g = MINUS_ONE;
5283 /* The section in which the symbol referenced by the relocation is
5284 located. */
5285 asection *sec = NULL;
5286 struct mips_elf_link_hash_entry *h = NULL;
b34976b6 5287 /* TRUE if the symbol referred to by this relocation is a local
b49e97c9 5288 symbol. */
b34976b6 5289 bfd_boolean local_p, was_local_p;
77434823
MR
5290 /* TRUE if the symbol referred to by this relocation is a section
5291 symbol. */
5292 bfd_boolean section_p = FALSE;
b34976b6
AM
5293 /* TRUE if the symbol referred to by this relocation is "_gp_disp". */
5294 bfd_boolean gp_disp_p = FALSE;
bbe506e8
TS
5295 /* TRUE if the symbol referred to by this relocation is
5296 "__gnu_local_gp". */
5297 bfd_boolean gnu_local_gp_p = FALSE;
b49e97c9
TS
5298 Elf_Internal_Shdr *symtab_hdr;
5299 size_t extsymoff;
5300 unsigned long r_symndx;
5301 int r_type;
b34976b6 5302 /* TRUE if overflow occurred during the calculation of the
b49e97c9 5303 relocation value. */
b34976b6
AM
5304 bfd_boolean overflowed_p;
5305 /* TRUE if this relocation refers to a MIPS16 function. */
5306 bfd_boolean target_is_16_bit_code_p = FALSE;
df58fc94 5307 bfd_boolean target_is_micromips_code_p = FALSE;
0a44bf69
RS
5308 struct mips_elf_link_hash_table *htab;
5309 bfd *dynobj;
5310
5311 dynobj = elf_hash_table (info)->dynobj;
5312 htab = mips_elf_hash_table (info);
4dfe6ac6 5313 BFD_ASSERT (htab != NULL);
b49e97c9
TS
5314
5315 /* Parse the relocation. */
5316 r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
5317 r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
5318 p = (input_section->output_section->vma
5319 + input_section->output_offset
5320 + relocation->r_offset);
5321
5322 /* Assume that there will be no overflow. */
b34976b6 5323 overflowed_p = FALSE;
b49e97c9
TS
5324
5325 /* Figure out whether or not the symbol is local, and get the offset
5326 used in the array of hash table entries. */
5327 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5328 local_p = mips_elf_local_relocation_p (input_bfd, relocation,
020d7251 5329 local_sections);
bce03d3d 5330 was_local_p = local_p;
b49e97c9
TS
5331 if (! elf_bad_symtab (input_bfd))
5332 extsymoff = symtab_hdr->sh_info;
5333 else
5334 {
5335 /* The symbol table does not follow the rule that local symbols
5336 must come before globals. */
5337 extsymoff = 0;
5338 }
5339
5340 /* Figure out the value of the symbol. */
5341 if (local_p)
5342 {
9d862524 5343 bfd_boolean micromips_p = MICROMIPS_P (abfd);
b49e97c9
TS
5344 Elf_Internal_Sym *sym;
5345
5346 sym = local_syms + r_symndx;
5347 sec = local_sections[r_symndx];
5348
77434823
MR
5349 section_p = ELF_ST_TYPE (sym->st_info) == STT_SECTION;
5350
b49e97c9 5351 symbol = sec->output_section->vma + sec->output_offset;
77434823 5352 if (!section_p || (sec->flags & SEC_MERGE))
b49e97c9 5353 symbol += sym->st_value;
77434823 5354 if ((sec->flags & SEC_MERGE) && section_p)
d4df96e6
L
5355 {
5356 addend = _bfd_elf_rel_local_sym (abfd, sym, &sec, addend);
5357 addend -= symbol;
5358 addend += sec->output_section->vma + sec->output_offset;
5359 }
b49e97c9 5360
df58fc94
RS
5361 /* MIPS16/microMIPS text labels should be treated as odd. */
5362 if (ELF_ST_IS_COMPRESSED (sym->st_other))
b49e97c9
TS
5363 ++symbol;
5364
5365 /* Record the name of this symbol, for our caller. */
5366 *namep = bfd_elf_string_from_elf_section (input_bfd,
5367 symtab_hdr->sh_link,
5368 sym->st_name);
ceab86af 5369 if (*namep == NULL || **namep == '\0')
b49e97c9
TS
5370 *namep = bfd_section_name (input_bfd, sec);
5371
9d862524
MR
5372 /* For relocations against a section symbol and ones against no
5373 symbol (absolute relocations) infer the ISA mode from the addend. */
5374 if (section_p || r_symndx == STN_UNDEF)
5375 {
5376 target_is_16_bit_code_p = (addend & 1) && !micromips_p;
5377 target_is_micromips_code_p = (addend & 1) && micromips_p;
5378 }
5379 /* For relocations against an absolute symbol infer the ISA mode
5380 from the value of the symbol plus addend. */
5381 else if (bfd_is_abs_section (sec))
5382 {
5383 target_is_16_bit_code_p = ((symbol + addend) & 1) && !micromips_p;
5384 target_is_micromips_code_p = ((symbol + addend) & 1) && micromips_p;
5385 }
5386 /* Otherwise just use the regular symbol annotation available. */
5387 else
5388 {
5389 target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (sym->st_other);
5390 target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (sym->st_other);
5391 }
b49e97c9
TS
5392 }
5393 else
5394 {
560e09e9
NC
5395 /* ??? Could we use RELOC_FOR_GLOBAL_SYMBOL here ? */
5396
b49e97c9
TS
5397 /* For global symbols we look up the symbol in the hash-table. */
5398 h = ((struct mips_elf_link_hash_entry *)
5399 elf_sym_hashes (input_bfd) [r_symndx - extsymoff]);
5400 /* Find the real hash-table entry for this symbol. */
5401 while (h->root.root.type == bfd_link_hash_indirect
5402 || h->root.root.type == bfd_link_hash_warning)
5403 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
5404
5405 /* Record the name of this symbol, for our caller. */
5406 *namep = h->root.root.root.string;
5407
5408 /* See if this is the special _gp_disp symbol. Note that such a
5409 symbol must always be a global symbol. */
560e09e9 5410 if (strcmp (*namep, "_gp_disp") == 0
b49e97c9
TS
5411 && ! NEWABI_P (input_bfd))
5412 {
5413 /* Relocations against _gp_disp are permitted only with
5414 R_MIPS_HI16 and R_MIPS_LO16 relocations. */
738e5348 5415 if (!hi16_reloc_p (r_type) && !lo16_reloc_p (r_type))
b49e97c9
TS
5416 return bfd_reloc_notsupported;
5417
b34976b6 5418 gp_disp_p = TRUE;
b49e97c9 5419 }
bbe506e8
TS
5420 /* See if this is the special _gp symbol. Note that such a
5421 symbol must always be a global symbol. */
5422 else if (strcmp (*namep, "__gnu_local_gp") == 0)
5423 gnu_local_gp_p = TRUE;
5424
5425
b49e97c9
TS
5426 /* If this symbol is defined, calculate its address. Note that
5427 _gp_disp is a magic symbol, always implicitly defined by the
5428 linker, so it's inappropriate to check to see whether or not
5429 its defined. */
5430 else if ((h->root.root.type == bfd_link_hash_defined
5431 || h->root.root.type == bfd_link_hash_defweak)
5432 && h->root.root.u.def.section)
5433 {
5434 sec = h->root.root.u.def.section;
5435 if (sec->output_section)
5436 symbol = (h->root.root.u.def.value
5437 + sec->output_section->vma
5438 + sec->output_offset);
5439 else
5440 symbol = h->root.root.u.def.value;
5441 }
5442 else if (h->root.root.type == bfd_link_hash_undefweak)
5443 /* We allow relocations against undefined weak symbols, giving
5444 it the value zero, so that you can undefined weak functions
5445 and check to see if they exist by looking at their
5446 addresses. */
5447 symbol = 0;
59c2e50f 5448 else if (info->unresolved_syms_in_objects == RM_IGNORE
b49e97c9
TS
5449 && ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
5450 symbol = 0;
a4d0f181
TS
5451 else if (strcmp (*namep, SGI_COMPAT (input_bfd)
5452 ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING") == 0)
b49e97c9
TS
5453 {
5454 /* If this is a dynamic link, we should have created a
5455 _DYNAMIC_LINK symbol or _DYNAMIC_LINKING(for normal mips) symbol
5456 in in _bfd_mips_elf_create_dynamic_sections.
5457 Otherwise, we should define the symbol with a value of 0.
5458 FIXME: It should probably get into the symbol table
5459 somehow as well. */
0e1862bb 5460 BFD_ASSERT (! bfd_link_pic (info));
b49e97c9
TS
5461 BFD_ASSERT (bfd_get_section_by_name (abfd, ".dynamic") == NULL);
5462 symbol = 0;
5463 }
5e2b0d47
NC
5464 else if (ELF_MIPS_IS_OPTIONAL (h->root.other))
5465 {
5466 /* This is an optional symbol - an Irix specific extension to the
5467 ELF spec. Ignore it for now.
5468 XXX - FIXME - there is more to the spec for OPTIONAL symbols
5469 than simply ignoring them, but we do not handle this for now.
5470 For information see the "64-bit ELF Object File Specification"
5471 which is available from here:
5472 http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf */
5473 symbol = 0;
5474 }
b49e97c9
TS
5475 else
5476 {
1a72702b
AM
5477 (*info->callbacks->undefined_symbol)
5478 (info, h->root.root.root.string, input_bfd,
5479 input_section, relocation->r_offset,
5480 (info->unresolved_syms_in_objects == RM_GENERATE_ERROR)
5481 || ELF_ST_VISIBILITY (h->root.other));
5482 return bfd_reloc_undefined;
b49e97c9
TS
5483 }
5484
30c09090 5485 target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (h->root.other);
1bbce132 5486 target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (h->root.other);
b49e97c9
TS
5487 }
5488
738e5348
RS
5489 /* If this is a reference to a 16-bit function with a stub, we need
5490 to redirect the relocation to the stub unless:
5491
5492 (a) the relocation is for a MIPS16 JAL;
5493
5494 (b) the relocation is for a MIPS16 PIC call, and there are no
5495 non-MIPS16 uses of the GOT slot; or
5496
5497 (c) the section allows direct references to MIPS16 functions. */
5498 if (r_type != R_MIPS16_26
0e1862bb 5499 && !bfd_link_relocatable (info)
738e5348
RS
5500 && ((h != NULL
5501 && h->fn_stub != NULL
5502 && (r_type != R_MIPS16_CALL16 || h->need_fn_stub))
b9d58d71 5503 || (local_p
698600e4
AM
5504 && mips_elf_tdata (input_bfd)->local_stubs != NULL
5505 && mips_elf_tdata (input_bfd)->local_stubs[r_symndx] != NULL))
738e5348 5506 && !section_allows_mips16_refs_p (input_section))
b49e97c9
TS
5507 {
5508 /* This is a 32- or 64-bit call to a 16-bit function. We should
5509 have already noticed that we were going to need the
5510 stub. */
5511 if (local_p)
8f0c309a 5512 {
698600e4 5513 sec = mips_elf_tdata (input_bfd)->local_stubs[r_symndx];
8f0c309a
CLT
5514 value = 0;
5515 }
b49e97c9
TS
5516 else
5517 {
5518 BFD_ASSERT (h->need_fn_stub);
8f0c309a
CLT
5519 if (h->la25_stub)
5520 {
5521 /* If a LA25 header for the stub itself exists, point to the
5522 prepended LUI/ADDIU sequence. */
5523 sec = h->la25_stub->stub_section;
5524 value = h->la25_stub->offset;
5525 }
5526 else
5527 {
5528 sec = h->fn_stub;
5529 value = 0;
5530 }
b49e97c9
TS
5531 }
5532
8f0c309a 5533 symbol = sec->output_section->vma + sec->output_offset + value;
f38c2df5
TS
5534 /* The target is 16-bit, but the stub isn't. */
5535 target_is_16_bit_code_p = FALSE;
b49e97c9 5536 }
1bbce132
MR
5537 /* If this is a MIPS16 call with a stub, that is made through the PLT or
5538 to a standard MIPS function, we need to redirect the call to the stub.
5539 Note that we specifically exclude R_MIPS16_CALL16 from this behavior;
5540 indirect calls should use an indirect stub instead. */
0e1862bb 5541 else if (r_type == R_MIPS16_26 && !bfd_link_relocatable (info)
b314ec0e 5542 && ((h != NULL && (h->call_stub != NULL || h->call_fp_stub != NULL))
b9d58d71 5543 || (local_p
698600e4
AM
5544 && mips_elf_tdata (input_bfd)->local_call_stubs != NULL
5545 && mips_elf_tdata (input_bfd)->local_call_stubs[r_symndx] != NULL))
1bbce132 5546 && ((h != NULL && h->use_plt_entry) || !target_is_16_bit_code_p))
b49e97c9 5547 {
b9d58d71 5548 if (local_p)
698600e4 5549 sec = mips_elf_tdata (input_bfd)->local_call_stubs[r_symndx];
b9d58d71 5550 else
b49e97c9 5551 {
b9d58d71
TS
5552 /* If both call_stub and call_fp_stub are defined, we can figure
5553 out which one to use by checking which one appears in the input
5554 file. */
5555 if (h->call_stub != NULL && h->call_fp_stub != NULL)
b49e97c9 5556 {
b9d58d71 5557 asection *o;
68ffbac6 5558
b9d58d71
TS
5559 sec = NULL;
5560 for (o = input_bfd->sections; o != NULL; o = o->next)
b49e97c9 5561 {
b9d58d71
TS
5562 if (CALL_FP_STUB_P (bfd_get_section_name (input_bfd, o)))
5563 {
5564 sec = h->call_fp_stub;
5565 break;
5566 }
b49e97c9 5567 }
b9d58d71
TS
5568 if (sec == NULL)
5569 sec = h->call_stub;
b49e97c9 5570 }
b9d58d71 5571 else if (h->call_stub != NULL)
b49e97c9 5572 sec = h->call_stub;
b9d58d71
TS
5573 else
5574 sec = h->call_fp_stub;
5575 }
b49e97c9 5576
eea6121a 5577 BFD_ASSERT (sec->size > 0);
b49e97c9
TS
5578 symbol = sec->output_section->vma + sec->output_offset;
5579 }
861fb55a
DJ
5580 /* If this is a direct call to a PIC function, redirect to the
5581 non-PIC stub. */
5582 else if (h != NULL && h->la25_stub
8f0c309a
CLT
5583 && mips_elf_relocation_needs_la25_stub (input_bfd, r_type,
5584 target_is_16_bit_code_p))
c7318def
MR
5585 {
5586 symbol = (h->la25_stub->stub_section->output_section->vma
5587 + h->la25_stub->stub_section->output_offset
5588 + h->la25_stub->offset);
5589 if (ELF_ST_IS_MICROMIPS (h->root.other))
5590 symbol |= 1;
5591 }
1bbce132
MR
5592 /* For direct MIPS16 and microMIPS calls make sure the compressed PLT
5593 entry is used if a standard PLT entry has also been made. In this
5594 case the symbol will have been set by mips_elf_set_plt_sym_value
5595 to point to the standard PLT entry, so redirect to the compressed
5596 one. */
54806ffa
MR
5597 else if ((mips16_branch_reloc_p (r_type)
5598 || micromips_branch_reloc_p (r_type))
0e1862bb 5599 && !bfd_link_relocatable (info)
1bbce132
MR
5600 && h != NULL
5601 && h->use_plt_entry
5602 && h->root.plt.plist->comp_offset != MINUS_ONE
5603 && h->root.plt.plist->mips_offset != MINUS_ONE)
5604 {
5605 bfd_boolean micromips_p = MICROMIPS_P (abfd);
5606
5607 sec = htab->splt;
5608 symbol = (sec->output_section->vma
5609 + sec->output_offset
5610 + htab->plt_header_size
5611 + htab->plt_mips_offset
5612 + h->root.plt.plist->comp_offset
5613 + 1);
5614
5615 target_is_16_bit_code_p = !micromips_p;
5616 target_is_micromips_code_p = micromips_p;
5617 }
b49e97c9 5618
df58fc94 5619 /* Make sure MIPS16 and microMIPS are not used together. */
c9775dde 5620 if ((mips16_branch_reloc_p (r_type) && target_is_micromips_code_p)
df58fc94
RS
5621 || (micromips_branch_reloc_p (r_type) && target_is_16_bit_code_p))
5622 {
4eca0228 5623 _bfd_error_handler
df58fc94
RS
5624 (_("MIPS16 and microMIPS functions cannot call each other"));
5625 return bfd_reloc_notsupported;
5626 }
5627
b49e97c9 5628 /* Calls from 16-bit code to 32-bit code and vice versa require the
df58fc94
RS
5629 mode change. However, we can ignore calls to undefined weak symbols,
5630 which should never be executed at runtime. This exception is important
5631 because the assembly writer may have "known" that any definition of the
5632 symbol would be 16-bit code, and that direct jumps were therefore
5633 acceptable. */
0e1862bb 5634 *cross_mode_jump_p = (!bfd_link_relocatable (info)
df58fc94 5635 && !(h && h->root.root.type == bfd_link_hash_undefweak)
9d862524
MR
5636 && ((mips16_branch_reloc_p (r_type)
5637 && !target_is_16_bit_code_p)
5638 || (micromips_branch_reloc_p (r_type)
df58fc94 5639 && !target_is_micromips_code_p)
9d862524
MR
5640 || ((branch_reloc_p (r_type)
5641 || r_type == R_MIPS_JALR)
df58fc94
RS
5642 && (target_is_16_bit_code_p
5643 || target_is_micromips_code_p))));
b49e97c9 5644
c5d6fa44 5645 local_p = (h == NULL || mips_use_local_got_p (info, h));
b49e97c9 5646
0a61c8c2
RS
5647 gp0 = _bfd_get_gp_value (input_bfd);
5648 gp = _bfd_get_gp_value (abfd);
23cc69b6 5649 if (htab->got_info)
a8028dd0 5650 gp += mips_elf_adjust_gp (abfd, htab->got_info, input_bfd);
0a61c8c2
RS
5651
5652 if (gnu_local_gp_p)
5653 symbol = gp;
5654
df58fc94
RS
5655 /* Global R_MIPS_GOT_PAGE/R_MICROMIPS_GOT_PAGE relocations are equivalent
5656 to R_MIPS_GOT_DISP/R_MICROMIPS_GOT_DISP. The addend is applied by the
5657 corresponding R_MIPS_GOT_OFST/R_MICROMIPS_GOT_OFST. */
5658 if (got_page_reloc_p (r_type) && !local_p)
020d7251 5659 {
df58fc94
RS
5660 r_type = (micromips_reloc_p (r_type)
5661 ? R_MICROMIPS_GOT_DISP : R_MIPS_GOT_DISP);
020d7251
RS
5662 addend = 0;
5663 }
5664
e77760d2 5665 /* If we haven't already determined the GOT offset, and we're going
0a61c8c2 5666 to need it, get it now. */
b49e97c9
TS
5667 switch (r_type)
5668 {
738e5348
RS
5669 case R_MIPS16_CALL16:
5670 case R_MIPS16_GOT16:
b49e97c9
TS
5671 case R_MIPS_CALL16:
5672 case R_MIPS_GOT16:
5673 case R_MIPS_GOT_DISP:
5674 case R_MIPS_GOT_HI16:
5675 case R_MIPS_CALL_HI16:
5676 case R_MIPS_GOT_LO16:
5677 case R_MIPS_CALL_LO16:
df58fc94
RS
5678 case R_MICROMIPS_CALL16:
5679 case R_MICROMIPS_GOT16:
5680 case R_MICROMIPS_GOT_DISP:
5681 case R_MICROMIPS_GOT_HI16:
5682 case R_MICROMIPS_CALL_HI16:
5683 case R_MICROMIPS_GOT_LO16:
5684 case R_MICROMIPS_CALL_LO16:
0f20cc35
DJ
5685 case R_MIPS_TLS_GD:
5686 case R_MIPS_TLS_GOTTPREL:
5687 case R_MIPS_TLS_LDM:
d0f13682
CLT
5688 case R_MIPS16_TLS_GD:
5689 case R_MIPS16_TLS_GOTTPREL:
5690 case R_MIPS16_TLS_LDM:
df58fc94
RS
5691 case R_MICROMIPS_TLS_GD:
5692 case R_MICROMIPS_TLS_GOTTPREL:
5693 case R_MICROMIPS_TLS_LDM:
b49e97c9 5694 /* Find the index into the GOT where this value is located. */
df58fc94 5695 if (tls_ldm_reloc_p (r_type))
0f20cc35 5696 {
0a44bf69 5697 g = mips_elf_local_got_index (abfd, input_bfd, info,
5c18022e 5698 0, 0, NULL, r_type);
0f20cc35
DJ
5699 if (g == MINUS_ONE)
5700 return bfd_reloc_outofrange;
5701 }
5702 else if (!local_p)
b49e97c9 5703 {
0a44bf69
RS
5704 /* On VxWorks, CALL relocations should refer to the .got.plt
5705 entry, which is initialized to point at the PLT stub. */
5706 if (htab->is_vxworks
df58fc94
RS
5707 && (call_hi16_reloc_p (r_type)
5708 || call_lo16_reloc_p (r_type)
738e5348 5709 || call16_reloc_p (r_type)))
0a44bf69
RS
5710 {
5711 BFD_ASSERT (addend == 0);
5712 BFD_ASSERT (h->root.needs_plt);
5713 g = mips_elf_gotplt_index (info, &h->root);
5714 }
5715 else
b49e97c9 5716 {
020d7251 5717 BFD_ASSERT (addend == 0);
13fbec83
RS
5718 g = mips_elf_global_got_index (abfd, info, input_bfd,
5719 &h->root, r_type);
e641e783 5720 if (!TLS_RELOC_P (r_type)
020d7251
RS
5721 && !elf_hash_table (info)->dynamic_sections_created)
5722 /* This is a static link. We must initialize the GOT entry. */
a8028dd0 5723 MIPS_ELF_PUT_WORD (dynobj, symbol, htab->sgot->contents + g);
b49e97c9
TS
5724 }
5725 }
0a44bf69 5726 else if (!htab->is_vxworks
738e5348 5727 && (call16_reloc_p (r_type) || got16_reloc_p (r_type)))
0a44bf69 5728 /* The calculation below does not involve "g". */
b49e97c9
TS
5729 break;
5730 else
5731 {
5c18022e 5732 g = mips_elf_local_got_index (abfd, input_bfd, info,
0a44bf69 5733 symbol + addend, r_symndx, h, r_type);
b49e97c9
TS
5734 if (g == MINUS_ONE)
5735 return bfd_reloc_outofrange;
5736 }
5737
5738 /* Convert GOT indices to actual offsets. */
a8028dd0 5739 g = mips_elf_got_offset_from_index (info, abfd, input_bfd, g);
b49e97c9 5740 break;
b49e97c9
TS
5741 }
5742
0a44bf69
RS
5743 /* Relocations against the VxWorks __GOTT_BASE__ and __GOTT_INDEX__
5744 symbols are resolved by the loader. Add them to .rela.dyn. */
5745 if (h != NULL && is_gott_symbol (info, &h->root))
5746 {
5747 Elf_Internal_Rela outrel;
5748 bfd_byte *loc;
5749 asection *s;
5750
5751 s = mips_elf_rel_dyn_section (info, FALSE);
5752 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
5753
5754 outrel.r_offset = (input_section->output_section->vma
5755 + input_section->output_offset
5756 + relocation->r_offset);
5757 outrel.r_info = ELF32_R_INFO (h->root.dynindx, r_type);
5758 outrel.r_addend = addend;
5759 bfd_elf32_swap_reloca_out (abfd, &outrel, loc);
9e3313ae
RS
5760
5761 /* If we've written this relocation for a readonly section,
5762 we need to set DF_TEXTREL again, so that we do not delete the
5763 DT_TEXTREL tag. */
5764 if (MIPS_ELF_READONLY_SECTION (input_section))
5765 info->flags |= DF_TEXTREL;
5766
0a44bf69
RS
5767 *valuep = 0;
5768 return bfd_reloc_ok;
5769 }
5770
b49e97c9
TS
5771 /* Figure out what kind of relocation is being performed. */
5772 switch (r_type)
5773 {
5774 case R_MIPS_NONE:
5775 return bfd_reloc_continue;
5776
5777 case R_MIPS_16:
c3eb94b4
MF
5778 if (howto->partial_inplace)
5779 addend = _bfd_mips_elf_sign_extend (addend, 16);
5780 value = symbol + addend;
b49e97c9
TS
5781 overflowed_p = mips_elf_overflow_p (value, 16);
5782 break;
5783
5784 case R_MIPS_32:
5785 case R_MIPS_REL32:
5786 case R_MIPS_64:
0e1862bb 5787 if ((bfd_link_pic (info)
861fb55a 5788 || (htab->root.dynamic_sections_created
b49e97c9 5789 && h != NULL
f5385ebf 5790 && h->root.def_dynamic
861fb55a
DJ
5791 && !h->root.def_regular
5792 && !h->has_static_relocs))
cf35638d 5793 && r_symndx != STN_UNDEF
9a59ad6b
DJ
5794 && (h == NULL
5795 || h->root.root.type != bfd_link_hash_undefweak
5796 || ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
b49e97c9
TS
5797 && (input_section->flags & SEC_ALLOC) != 0)
5798 {
861fb55a 5799 /* If we're creating a shared library, then we can't know
b49e97c9
TS
5800 where the symbol will end up. So, we create a relocation
5801 record in the output, and leave the job up to the dynamic
861fb55a
DJ
5802 linker. We must do the same for executable references to
5803 shared library symbols, unless we've decided to use copy
5804 relocs or PLTs instead. */
b49e97c9
TS
5805 value = addend;
5806 if (!mips_elf_create_dynamic_relocation (abfd,
5807 info,
5808 relocation,
5809 h,
5810 sec,
5811 symbol,
5812 &value,
5813 input_section))
5814 return bfd_reloc_undefined;
5815 }
5816 else
5817 {
5818 if (r_type != R_MIPS_REL32)
5819 value = symbol + addend;
5820 else
5821 value = addend;
5822 }
5823 value &= howto->dst_mask;
092dcd75
CD
5824 break;
5825
5826 case R_MIPS_PC32:
5827 value = symbol + addend - p;
5828 value &= howto->dst_mask;
b49e97c9
TS
5829 break;
5830
b49e97c9
TS
5831 case R_MIPS16_26:
5832 /* The calculation for R_MIPS16_26 is just the same as for an
5833 R_MIPS_26. It's only the storage of the relocated field into
5834 the output file that's different. That's handled in
5835 mips_elf_perform_relocation. So, we just fall through to the
5836 R_MIPS_26 case here. */
5837 case R_MIPS_26:
df58fc94
RS
5838 case R_MICROMIPS_26_S1:
5839 {
5840 unsigned int shift;
5841
df58fc94
RS
5842 /* Shift is 2, unusually, for microMIPS JALX. */
5843 shift = (!*cross_mode_jump_p && r_type == R_MICROMIPS_26_S1) ? 1 : 2;
5844
77434823 5845 if (howto->partial_inplace && !section_p)
df58fc94 5846 value = _bfd_mips_elf_sign_extend (addend, 26 + shift);
c3eb94b4
MF
5847 else
5848 value = addend;
bc27bb05
MR
5849 value += symbol;
5850
9d862524
MR
5851 /* Make sure the target of a jump is suitably aligned. Bit 0 must
5852 be the correct ISA mode selector except for weak undefined
5853 symbols. */
5854 if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
5855 && (*cross_mode_jump_p
5856 ? (value & 3) != (r_type == R_MIPS_26)
5857 : (value & ((1 << shift) - 1)) != (r_type != R_MIPS_26)))
bc27bb05
MR
5858 return bfd_reloc_outofrange;
5859
5860 value >>= shift;
77434823 5861 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
df58fc94
RS
5862 overflowed_p = (value >> 26) != ((p + 4) >> (26 + shift));
5863 value &= howto->dst_mask;
5864 }
b49e97c9
TS
5865 break;
5866
0f20cc35 5867 case R_MIPS_TLS_DTPREL_HI16:
d0f13682 5868 case R_MIPS16_TLS_DTPREL_HI16:
df58fc94 5869 case R_MICROMIPS_TLS_DTPREL_HI16:
0f20cc35
DJ
5870 value = (mips_elf_high (addend + symbol - dtprel_base (info))
5871 & howto->dst_mask);
5872 break;
5873
5874 case R_MIPS_TLS_DTPREL_LO16:
741d6ea8
JM
5875 case R_MIPS_TLS_DTPREL32:
5876 case R_MIPS_TLS_DTPREL64:
d0f13682 5877 case R_MIPS16_TLS_DTPREL_LO16:
df58fc94 5878 case R_MICROMIPS_TLS_DTPREL_LO16:
0f20cc35
DJ
5879 value = (symbol + addend - dtprel_base (info)) & howto->dst_mask;
5880 break;
5881
5882 case R_MIPS_TLS_TPREL_HI16:
d0f13682 5883 case R_MIPS16_TLS_TPREL_HI16:
df58fc94 5884 case R_MICROMIPS_TLS_TPREL_HI16:
0f20cc35
DJ
5885 value = (mips_elf_high (addend + symbol - tprel_base (info))
5886 & howto->dst_mask);
5887 break;
5888
5889 case R_MIPS_TLS_TPREL_LO16:
d0f13682
CLT
5890 case R_MIPS_TLS_TPREL32:
5891 case R_MIPS_TLS_TPREL64:
5892 case R_MIPS16_TLS_TPREL_LO16:
df58fc94 5893 case R_MICROMIPS_TLS_TPREL_LO16:
0f20cc35
DJ
5894 value = (symbol + addend - tprel_base (info)) & howto->dst_mask;
5895 break;
5896
b49e97c9 5897 case R_MIPS_HI16:
d6f16593 5898 case R_MIPS16_HI16:
df58fc94 5899 case R_MICROMIPS_HI16:
b49e97c9
TS
5900 if (!gp_disp_p)
5901 {
5902 value = mips_elf_high (addend + symbol);
5903 value &= howto->dst_mask;
5904 }
5905 else
5906 {
d6f16593
MR
5907 /* For MIPS16 ABI code we generate this sequence
5908 0: li $v0,%hi(_gp_disp)
5909 4: addiupc $v1,%lo(_gp_disp)
5910 8: sll $v0,16
5911 12: addu $v0,$v1
5912 14: move $gp,$v0
5913 So the offsets of hi and lo relocs are the same, but the
888b9c01
CLT
5914 base $pc is that used by the ADDIUPC instruction at $t9 + 4.
5915 ADDIUPC clears the low two bits of the instruction address,
5916 so the base is ($t9 + 4) & ~3. */
d6f16593 5917 if (r_type == R_MIPS16_HI16)
888b9c01 5918 value = mips_elf_high (addend + gp - ((p + 4) & ~(bfd_vma) 0x3));
df58fc94
RS
5919 /* The microMIPS .cpload sequence uses the same assembly
5920 instructions as the traditional psABI version, but the
5921 incoming $t9 has the low bit set. */
5922 else if (r_type == R_MICROMIPS_HI16)
5923 value = mips_elf_high (addend + gp - p - 1);
d6f16593
MR
5924 else
5925 value = mips_elf_high (addend + gp - p);
b49e97c9
TS
5926 overflowed_p = mips_elf_overflow_p (value, 16);
5927 }
5928 break;
5929
5930 case R_MIPS_LO16:
d6f16593 5931 case R_MIPS16_LO16:
df58fc94
RS
5932 case R_MICROMIPS_LO16:
5933 case R_MICROMIPS_HI0_LO16:
b49e97c9
TS
5934 if (!gp_disp_p)
5935 value = (symbol + addend) & howto->dst_mask;
5936 else
5937 {
d6f16593
MR
5938 /* See the comment for R_MIPS16_HI16 above for the reason
5939 for this conditional. */
5940 if (r_type == R_MIPS16_LO16)
888b9c01 5941 value = addend + gp - (p & ~(bfd_vma) 0x3);
df58fc94
RS
5942 else if (r_type == R_MICROMIPS_LO16
5943 || r_type == R_MICROMIPS_HI0_LO16)
5944 value = addend + gp - p + 3;
d6f16593
MR
5945 else
5946 value = addend + gp - p + 4;
b49e97c9 5947 /* The MIPS ABI requires checking the R_MIPS_LO16 relocation
8dc1a139 5948 for overflow. But, on, say, IRIX5, relocations against
b49e97c9
TS
5949 _gp_disp are normally generated from the .cpload
5950 pseudo-op. It generates code that normally looks like
5951 this:
5952
5953 lui $gp,%hi(_gp_disp)
5954 addiu $gp,$gp,%lo(_gp_disp)
5955 addu $gp,$gp,$t9
5956
5957 Here $t9 holds the address of the function being called,
5958 as required by the MIPS ELF ABI. The R_MIPS_LO16
5959 relocation can easily overflow in this situation, but the
5960 R_MIPS_HI16 relocation will handle the overflow.
5961 Therefore, we consider this a bug in the MIPS ABI, and do
5962 not check for overflow here. */
5963 }
5964 break;
5965
5966 case R_MIPS_LITERAL:
df58fc94 5967 case R_MICROMIPS_LITERAL:
b49e97c9
TS
5968 /* Because we don't merge literal sections, we can handle this
5969 just like R_MIPS_GPREL16. In the long run, we should merge
5970 shared literals, and then we will need to additional work
5971 here. */
5972
5973 /* Fall through. */
5974
5975 case R_MIPS16_GPREL:
5976 /* The R_MIPS16_GPREL performs the same calculation as
5977 R_MIPS_GPREL16, but stores the relocated bits in a different
5978 order. We don't need to do anything special here; the
5979 differences are handled in mips_elf_perform_relocation. */
5980 case R_MIPS_GPREL16:
df58fc94
RS
5981 case R_MICROMIPS_GPREL7_S2:
5982 case R_MICROMIPS_GPREL16:
bce03d3d
AO
5983 /* Only sign-extend the addend if it was extracted from the
5984 instruction. If the addend was separate, leave it alone,
5985 otherwise we may lose significant bits. */
5986 if (howto->partial_inplace)
a7ebbfdf 5987 addend = _bfd_mips_elf_sign_extend (addend, 16);
bce03d3d
AO
5988 value = symbol + addend - gp;
5989 /* If the symbol was local, any earlier relocatable links will
5990 have adjusted its addend with the gp offset, so compensate
5991 for that now. Don't do it for symbols forced local in this
5992 link, though, since they won't have had the gp offset applied
5993 to them before. */
5994 if (was_local_p)
5995 value += gp0;
538baf8b
AB
5996 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
5997 overflowed_p = mips_elf_overflow_p (value, 16);
b49e97c9
TS
5998 break;
5999
738e5348
RS
6000 case R_MIPS16_GOT16:
6001 case R_MIPS16_CALL16:
b49e97c9
TS
6002 case R_MIPS_GOT16:
6003 case R_MIPS_CALL16:
df58fc94
RS
6004 case R_MICROMIPS_GOT16:
6005 case R_MICROMIPS_CALL16:
0a44bf69 6006 /* VxWorks does not have separate local and global semantics for
738e5348 6007 R_MIPS*_GOT16; every relocation evaluates to "G". */
0a44bf69 6008 if (!htab->is_vxworks && local_p)
b49e97c9 6009 {
5c18022e 6010 value = mips_elf_got16_entry (abfd, input_bfd, info,
020d7251 6011 symbol + addend, !was_local_p);
b49e97c9
TS
6012 if (value == MINUS_ONE)
6013 return bfd_reloc_outofrange;
6014 value
a8028dd0 6015 = mips_elf_got_offset_from_index (info, abfd, input_bfd, value);
b49e97c9
TS
6016 overflowed_p = mips_elf_overflow_p (value, 16);
6017 break;
6018 }
6019
6020 /* Fall through. */
6021
0f20cc35
DJ
6022 case R_MIPS_TLS_GD:
6023 case R_MIPS_TLS_GOTTPREL:
6024 case R_MIPS_TLS_LDM:
b49e97c9 6025 case R_MIPS_GOT_DISP:
d0f13682
CLT
6026 case R_MIPS16_TLS_GD:
6027 case R_MIPS16_TLS_GOTTPREL:
6028 case R_MIPS16_TLS_LDM:
df58fc94
RS
6029 case R_MICROMIPS_TLS_GD:
6030 case R_MICROMIPS_TLS_GOTTPREL:
6031 case R_MICROMIPS_TLS_LDM:
6032 case R_MICROMIPS_GOT_DISP:
b49e97c9
TS
6033 value = g;
6034 overflowed_p = mips_elf_overflow_p (value, 16);
6035 break;
6036
6037 case R_MIPS_GPREL32:
bce03d3d
AO
6038 value = (addend + symbol + gp0 - gp);
6039 if (!save_addend)
6040 value &= howto->dst_mask;
b49e97c9
TS
6041 break;
6042
6043 case R_MIPS_PC16:
bad36eac 6044 case R_MIPS_GNU_REL16_S2:
c3eb94b4
MF
6045 if (howto->partial_inplace)
6046 addend = _bfd_mips_elf_sign_extend (addend, 18);
6047
9d862524
MR
6048 /* No need to exclude weak undefined symbols here as they resolve
6049 to 0 and never set `*cross_mode_jump_p', so this alignment check
6050 will never trigger for them. */
6051 if (*cross_mode_jump_p
6052 ? ((symbol + addend) & 3) != 1
6053 : ((symbol + addend) & 3) != 0)
c3eb94b4
MF
6054 return bfd_reloc_outofrange;
6055
6056 value = symbol + addend - p;
538baf8b
AB
6057 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6058 overflowed_p = mips_elf_overflow_p (value, 18);
37caec6b
TS
6059 value >>= howto->rightshift;
6060 value &= howto->dst_mask;
b49e97c9
TS
6061 break;
6062
c9775dde
MR
6063 case R_MIPS16_PC16_S1:
6064 if (howto->partial_inplace)
6065 addend = _bfd_mips_elf_sign_extend (addend, 17);
6066
6067 if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
9d862524
MR
6068 && (*cross_mode_jump_p
6069 ? ((symbol + addend) & 3) != 0
6070 : ((symbol + addend) & 1) == 0))
c9775dde
MR
6071 return bfd_reloc_outofrange;
6072
6073 value = symbol + addend - p;
6074 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6075 overflowed_p = mips_elf_overflow_p (value, 17);
6076 value >>= howto->rightshift;
6077 value &= howto->dst_mask;
6078 break;
6079
7361da2c
AB
6080 case R_MIPS_PC21_S2:
6081 if (howto->partial_inplace)
6082 addend = _bfd_mips_elf_sign_extend (addend, 23);
6083
6084 if ((symbol + addend) & 3)
6085 return bfd_reloc_outofrange;
6086
6087 value = symbol + addend - p;
538baf8b
AB
6088 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6089 overflowed_p = mips_elf_overflow_p (value, 23);
7361da2c
AB
6090 value >>= howto->rightshift;
6091 value &= howto->dst_mask;
6092 break;
6093
6094 case R_MIPS_PC26_S2:
6095 if (howto->partial_inplace)
6096 addend = _bfd_mips_elf_sign_extend (addend, 28);
6097
6098 if ((symbol + addend) & 3)
6099 return bfd_reloc_outofrange;
6100
6101 value = symbol + addend - p;
538baf8b
AB
6102 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6103 overflowed_p = mips_elf_overflow_p (value, 28);
7361da2c
AB
6104 value >>= howto->rightshift;
6105 value &= howto->dst_mask;
6106 break;
6107
6108 case R_MIPS_PC18_S3:
6109 if (howto->partial_inplace)
6110 addend = _bfd_mips_elf_sign_extend (addend, 21);
6111
6112 if ((symbol + addend) & 7)
6113 return bfd_reloc_outofrange;
6114
6115 value = symbol + addend - ((p | 7) ^ 7);
538baf8b
AB
6116 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6117 overflowed_p = mips_elf_overflow_p (value, 21);
7361da2c
AB
6118 value >>= howto->rightshift;
6119 value &= howto->dst_mask;
6120 break;
6121
6122 case R_MIPS_PC19_S2:
6123 if (howto->partial_inplace)
6124 addend = _bfd_mips_elf_sign_extend (addend, 21);
6125
6126 if ((symbol + addend) & 3)
6127 return bfd_reloc_outofrange;
6128
6129 value = symbol + addend - p;
538baf8b
AB
6130 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6131 overflowed_p = mips_elf_overflow_p (value, 21);
7361da2c
AB
6132 value >>= howto->rightshift;
6133 value &= howto->dst_mask;
6134 break;
6135
6136 case R_MIPS_PCHI16:
6137 value = mips_elf_high (symbol + addend - p);
538baf8b
AB
6138 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6139 overflowed_p = mips_elf_overflow_p (value, 16);
7361da2c
AB
6140 value &= howto->dst_mask;
6141 break;
6142
6143 case R_MIPS_PCLO16:
6144 if (howto->partial_inplace)
6145 addend = _bfd_mips_elf_sign_extend (addend, 16);
6146 value = symbol + addend - p;
6147 value &= howto->dst_mask;
6148 break;
6149
df58fc94 6150 case R_MICROMIPS_PC7_S1:
c3eb94b4
MF
6151 if (howto->partial_inplace)
6152 addend = _bfd_mips_elf_sign_extend (addend, 8);
9d862524
MR
6153
6154 if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6155 && (*cross_mode_jump_p
6156 ? ((symbol + addend + 2) & 3) != 0
6157 : ((symbol + addend + 2) & 1) == 0))
6158 return bfd_reloc_outofrange;
6159
c3eb94b4 6160 value = symbol + addend - p;
538baf8b
AB
6161 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6162 overflowed_p = mips_elf_overflow_p (value, 8);
df58fc94
RS
6163 value >>= howto->rightshift;
6164 value &= howto->dst_mask;
6165 break;
6166
6167 case R_MICROMIPS_PC10_S1:
c3eb94b4
MF
6168 if (howto->partial_inplace)
6169 addend = _bfd_mips_elf_sign_extend (addend, 11);
9d862524
MR
6170
6171 if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6172 && (*cross_mode_jump_p
6173 ? ((symbol + addend + 2) & 3) != 0
6174 : ((symbol + addend + 2) & 1) == 0))
6175 return bfd_reloc_outofrange;
6176
c3eb94b4 6177 value = symbol + addend - p;
538baf8b
AB
6178 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6179 overflowed_p = mips_elf_overflow_p (value, 11);
df58fc94
RS
6180 value >>= howto->rightshift;
6181 value &= howto->dst_mask;
6182 break;
6183
6184 case R_MICROMIPS_PC16_S1:
c3eb94b4
MF
6185 if (howto->partial_inplace)
6186 addend = _bfd_mips_elf_sign_extend (addend, 17);
9d862524
MR
6187
6188 if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6189 && (*cross_mode_jump_p
6190 ? ((symbol + addend) & 3) != 0
6191 : ((symbol + addend) & 1) == 0))
6192 return bfd_reloc_outofrange;
6193
c3eb94b4 6194 value = symbol + addend - p;
538baf8b
AB
6195 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6196 overflowed_p = mips_elf_overflow_p (value, 17);
df58fc94
RS
6197 value >>= howto->rightshift;
6198 value &= howto->dst_mask;
6199 break;
6200
6201 case R_MICROMIPS_PC23_S2:
c3eb94b4
MF
6202 if (howto->partial_inplace)
6203 addend = _bfd_mips_elf_sign_extend (addend, 25);
6204 value = symbol + addend - ((p | 3) ^ 3);
538baf8b
AB
6205 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6206 overflowed_p = mips_elf_overflow_p (value, 25);
df58fc94
RS
6207 value >>= howto->rightshift;
6208 value &= howto->dst_mask;
6209 break;
6210
b49e97c9
TS
6211 case R_MIPS_GOT_HI16:
6212 case R_MIPS_CALL_HI16:
df58fc94
RS
6213 case R_MICROMIPS_GOT_HI16:
6214 case R_MICROMIPS_CALL_HI16:
b49e97c9
TS
6215 /* We're allowed to handle these two relocations identically.
6216 The dynamic linker is allowed to handle the CALL relocations
6217 differently by creating a lazy evaluation stub. */
6218 value = g;
6219 value = mips_elf_high (value);
6220 value &= howto->dst_mask;
6221 break;
6222
6223 case R_MIPS_GOT_LO16:
6224 case R_MIPS_CALL_LO16:
df58fc94
RS
6225 case R_MICROMIPS_GOT_LO16:
6226 case R_MICROMIPS_CALL_LO16:
b49e97c9
TS
6227 value = g & howto->dst_mask;
6228 break;
6229
6230 case R_MIPS_GOT_PAGE:
df58fc94 6231 case R_MICROMIPS_GOT_PAGE:
5c18022e 6232 value = mips_elf_got_page (abfd, input_bfd, info, symbol + addend, NULL);
b49e97c9
TS
6233 if (value == MINUS_ONE)
6234 return bfd_reloc_outofrange;
a8028dd0 6235 value = mips_elf_got_offset_from_index (info, abfd, input_bfd, value);
b49e97c9
TS
6236 overflowed_p = mips_elf_overflow_p (value, 16);
6237 break;
6238
6239 case R_MIPS_GOT_OFST:
df58fc94 6240 case R_MICROMIPS_GOT_OFST:
93a2b7ae 6241 if (local_p)
5c18022e 6242 mips_elf_got_page (abfd, input_bfd, info, symbol + addend, &value);
0fdc1bf1
AO
6243 else
6244 value = addend;
b49e97c9
TS
6245 overflowed_p = mips_elf_overflow_p (value, 16);
6246 break;
6247
6248 case R_MIPS_SUB:
df58fc94 6249 case R_MICROMIPS_SUB:
b49e97c9
TS
6250 value = symbol - addend;
6251 value &= howto->dst_mask;
6252 break;
6253
6254 case R_MIPS_HIGHER:
df58fc94 6255 case R_MICROMIPS_HIGHER:
b49e97c9
TS
6256 value = mips_elf_higher (addend + symbol);
6257 value &= howto->dst_mask;
6258 break;
6259
6260 case R_MIPS_HIGHEST:
df58fc94 6261 case R_MICROMIPS_HIGHEST:
b49e97c9
TS
6262 value = mips_elf_highest (addend + symbol);
6263 value &= howto->dst_mask;
6264 break;
6265
6266 case R_MIPS_SCN_DISP:
df58fc94 6267 case R_MICROMIPS_SCN_DISP:
b49e97c9
TS
6268 value = symbol + addend - sec->output_offset;
6269 value &= howto->dst_mask;
6270 break;
6271
b49e97c9 6272 case R_MIPS_JALR:
df58fc94 6273 case R_MICROMIPS_JALR:
1367d393
ILT
6274 /* This relocation is only a hint. In some cases, we optimize
6275 it into a bal instruction. But we don't try to optimize
5bbc5ae7
AN
6276 when the symbol does not resolve locally. */
6277 if (h != NULL && !SYMBOL_CALLS_LOCAL (info, &h->root))
1367d393
ILT
6278 return bfd_reloc_continue;
6279 value = symbol + addend;
6280 break;
b49e97c9 6281
1367d393 6282 case R_MIPS_PJUMP:
b49e97c9
TS
6283 case R_MIPS_GNU_VTINHERIT:
6284 case R_MIPS_GNU_VTENTRY:
6285 /* We don't do anything with these at present. */
6286 return bfd_reloc_continue;
6287
6288 default:
6289 /* An unrecognized relocation type. */
6290 return bfd_reloc_notsupported;
6291 }
6292
6293 /* Store the VALUE for our caller. */
6294 *valuep = value;
6295 return overflowed_p ? bfd_reloc_overflow : bfd_reloc_ok;
6296}
6297
6298/* Obtain the field relocated by RELOCATION. */
6299
6300static bfd_vma
9719ad41
RS
6301mips_elf_obtain_contents (reloc_howto_type *howto,
6302 const Elf_Internal_Rela *relocation,
6303 bfd *input_bfd, bfd_byte *contents)
b49e97c9 6304{
6346d5ca 6305 bfd_vma x = 0;
b49e97c9 6306 bfd_byte *location = contents + relocation->r_offset;
6346d5ca 6307 unsigned int size = bfd_get_reloc_size (howto);
b49e97c9
TS
6308
6309 /* Obtain the bytes. */
6346d5ca
AM
6310 if (size != 0)
6311 x = bfd_get (8 * size, input_bfd, location);
b49e97c9 6312
b49e97c9
TS
6313 return x;
6314}
6315
6316/* It has been determined that the result of the RELOCATION is the
6317 VALUE. Use HOWTO to place VALUE into the output file at the
6318 appropriate position. The SECTION is the section to which the
68ffbac6 6319 relocation applies.
38a7df63 6320 CROSS_MODE_JUMP_P is true if the relocation field
df58fc94 6321 is a MIPS16 or microMIPS jump to standard MIPS code, or vice versa.
b49e97c9 6322
b34976b6 6323 Returns FALSE if anything goes wrong. */
b49e97c9 6324
b34976b6 6325static bfd_boolean
9719ad41
RS
6326mips_elf_perform_relocation (struct bfd_link_info *info,
6327 reloc_howto_type *howto,
6328 const Elf_Internal_Rela *relocation,
6329 bfd_vma value, bfd *input_bfd,
6330 asection *input_section, bfd_byte *contents,
38a7df63 6331 bfd_boolean cross_mode_jump_p)
b49e97c9
TS
6332{
6333 bfd_vma x;
6334 bfd_byte *location;
6335 int r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
6346d5ca 6336 unsigned int size;
b49e97c9
TS
6337
6338 /* Figure out where the relocation is occurring. */
6339 location = contents + relocation->r_offset;
6340
df58fc94 6341 _bfd_mips_elf_reloc_unshuffle (input_bfd, r_type, FALSE, location);
d6f16593 6342
b49e97c9
TS
6343 /* Obtain the current value. */
6344 x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
6345
6346 /* Clear the field we are setting. */
6347 x &= ~howto->dst_mask;
6348
b49e97c9
TS
6349 /* Set the field. */
6350 x |= (value & howto->dst_mask);
6351
a6ebf616 6352 /* Detect incorrect JALX usage. If required, turn JAL or BAL into JALX. */
9d862524
MR
6353 if (!cross_mode_jump_p && jal_reloc_p (r_type))
6354 {
6355 bfd_vma opcode = x >> 26;
6356
6357 if (r_type == R_MIPS16_26 ? opcode == 0x7
6358 : r_type == R_MICROMIPS_26_S1 ? opcode == 0x3c
6359 : opcode == 0x1d)
6360 {
6361 info->callbacks->einfo
6362 (_("%X%H: Unsupported JALX to the same ISA mode\n"),
6363 input_bfd, input_section, relocation->r_offset);
6364 return TRUE;
6365 }
6366 }
38a7df63 6367 if (cross_mode_jump_p && jal_reloc_p (r_type))
b49e97c9 6368 {
b34976b6 6369 bfd_boolean ok;
b49e97c9
TS
6370 bfd_vma opcode = x >> 26;
6371 bfd_vma jalx_opcode;
6372
6373 /* Check to see if the opcode is already JAL or JALX. */
6374 if (r_type == R_MIPS16_26)
6375 {
6376 ok = ((opcode == 0x6) || (opcode == 0x7));
6377 jalx_opcode = 0x7;
6378 }
df58fc94
RS
6379 else if (r_type == R_MICROMIPS_26_S1)
6380 {
6381 ok = ((opcode == 0x3d) || (opcode == 0x3c));
6382 jalx_opcode = 0x3c;
6383 }
b49e97c9
TS
6384 else
6385 {
6386 ok = ((opcode == 0x3) || (opcode == 0x1d));
6387 jalx_opcode = 0x1d;
6388 }
6389
3bdf9505
MR
6390 /* If the opcode is not JAL or JALX, there's a problem. We cannot
6391 convert J or JALS to JALX. */
b49e97c9
TS
6392 if (!ok)
6393 {
5f68df25
MR
6394 info->callbacks->einfo
6395 (_("%X%H: Unsupported jump between ISA modes; "
6396 "consider recompiling with interlinking enabled\n"),
6397 input_bfd, input_section, relocation->r_offset);
6398 return TRUE;
b49e97c9
TS
6399 }
6400
6401 /* Make this the JALX opcode. */
6402 x = (x & ~(0x3f << 26)) | (jalx_opcode << 26);
6403 }
9d862524
MR
6404 else if (cross_mode_jump_p && b_reloc_p (r_type))
6405 {
a6ebf616
MR
6406 bfd_boolean ok = FALSE;
6407 bfd_vma opcode = x >> 16;
6408 bfd_vma jalx_opcode = 0;
6409 bfd_vma addr;
6410 bfd_vma dest;
6411
6412 if (r_type == R_MICROMIPS_PC16_S1)
6413 {
6414 ok = opcode == 0x4060;
6415 jalx_opcode = 0x3c;
6416 value <<= 1;
6417 }
6418 else if (r_type == R_MIPS_PC16 || r_type == R_MIPS_GNU_REL16_S2)
6419 {
6420 ok = opcode == 0x411;
6421 jalx_opcode = 0x1d;
6422 value <<= 2;
6423 }
6424
6425 if (bfd_link_pic (info) || !ok)
6426 {
6427 info->callbacks->einfo
6428 (_("%X%H: Unsupported branch between ISA modes\n"),
6429 input_bfd, input_section, relocation->r_offset);
6430 return TRUE;
6431 }
6432
6433 addr = (input_section->output_section->vma
6434 + input_section->output_offset
6435 + relocation->r_offset
6436 + 4);
6437 dest = addr + (((value & 0x3ffff) ^ 0x20000) - 0x20000);
6438
6439 if ((addr >> 28) << 28 != (dest >> 28) << 28)
6440 {
6441 info->callbacks->einfo
6442 (_("%X%H: Cannot convert branch between ISA modes "
6443 "to JALX: relocation out of range\n"),
6444 input_bfd, input_section, relocation->r_offset);
6445 return TRUE;
6446 }
6447
6448 /* Make this the JALX opcode. */
6449 x = ((dest >> 2) & 0x3ffffff) | jalx_opcode << 26;
9d862524 6450 }
b49e97c9 6451
38a7df63
CF
6452 /* Try converting JAL to BAL and J(AL)R to B(AL), if the target is in
6453 range. */
0e1862bb 6454 if (!bfd_link_relocatable (info)
38a7df63 6455 && !cross_mode_jump_p
cd8d5a82
CF
6456 && ((JAL_TO_BAL_P (input_bfd)
6457 && r_type == R_MIPS_26
6458 && (x >> 26) == 0x3) /* jal addr */
6459 || (JALR_TO_BAL_P (input_bfd)
6460 && r_type == R_MIPS_JALR
38a7df63
CF
6461 && x == 0x0320f809) /* jalr t9 */
6462 || (JR_TO_B_P (input_bfd)
6463 && r_type == R_MIPS_JALR
6464 && x == 0x03200008))) /* jr t9 */
1367d393
ILT
6465 {
6466 bfd_vma addr;
6467 bfd_vma dest;
6468 bfd_signed_vma off;
6469
6470 addr = (input_section->output_section->vma
6471 + input_section->output_offset
6472 + relocation->r_offset
6473 + 4);
6474 if (r_type == R_MIPS_26)
6475 dest = (value << 2) | ((addr >> 28) << 28);
6476 else
6477 dest = value;
6478 off = dest - addr;
6479 if (off <= 0x1ffff && off >= -0x20000)
38a7df63
CF
6480 {
6481 if (x == 0x03200008) /* jr t9 */
6482 x = 0x10000000 | (((bfd_vma) off >> 2) & 0xffff); /* b addr */
6483 else
6484 x = 0x04110000 | (((bfd_vma) off >> 2) & 0xffff); /* bal addr */
6485 }
1367d393
ILT
6486 }
6487
b49e97c9 6488 /* Put the value into the output. */
6346d5ca
AM
6489 size = bfd_get_reloc_size (howto);
6490 if (size != 0)
6491 bfd_put (8 * size, input_bfd, x, location);
d6f16593 6492
0e1862bb 6493 _bfd_mips_elf_reloc_shuffle (input_bfd, r_type, !bfd_link_relocatable (info),
df58fc94 6494 location);
d6f16593 6495
b34976b6 6496 return TRUE;
b49e97c9 6497}
b49e97c9 6498\f
b49e97c9
TS
6499/* Create a rel.dyn relocation for the dynamic linker to resolve. REL
6500 is the original relocation, which is now being transformed into a
6501 dynamic relocation. The ADDENDP is adjusted if necessary; the
6502 caller should store the result in place of the original addend. */
6503
b34976b6 6504static bfd_boolean
9719ad41
RS
6505mips_elf_create_dynamic_relocation (bfd *output_bfd,
6506 struct bfd_link_info *info,
6507 const Elf_Internal_Rela *rel,
6508 struct mips_elf_link_hash_entry *h,
6509 asection *sec, bfd_vma symbol,
6510 bfd_vma *addendp, asection *input_section)
b49e97c9 6511{
947216bf 6512 Elf_Internal_Rela outrel[3];
b49e97c9
TS
6513 asection *sreloc;
6514 bfd *dynobj;
6515 int r_type;
5d41f0b6
RS
6516 long indx;
6517 bfd_boolean defined_p;
0a44bf69 6518 struct mips_elf_link_hash_table *htab;
b49e97c9 6519
0a44bf69 6520 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
6521 BFD_ASSERT (htab != NULL);
6522
b49e97c9
TS
6523 r_type = ELF_R_TYPE (output_bfd, rel->r_info);
6524 dynobj = elf_hash_table (info)->dynobj;
0a44bf69 6525 sreloc = mips_elf_rel_dyn_section (info, FALSE);
b49e97c9
TS
6526 BFD_ASSERT (sreloc != NULL);
6527 BFD_ASSERT (sreloc->contents != NULL);
6528 BFD_ASSERT (sreloc->reloc_count * MIPS_ELF_REL_SIZE (output_bfd)
eea6121a 6529 < sreloc->size);
b49e97c9 6530
b49e97c9
TS
6531 outrel[0].r_offset =
6532 _bfd_elf_section_offset (output_bfd, info, input_section, rel[0].r_offset);
9ddf8309
TS
6533 if (ABI_64_P (output_bfd))
6534 {
6535 outrel[1].r_offset =
6536 _bfd_elf_section_offset (output_bfd, info, input_section, rel[1].r_offset);
6537 outrel[2].r_offset =
6538 _bfd_elf_section_offset (output_bfd, info, input_section, rel[2].r_offset);
6539 }
b49e97c9 6540
c5ae1840 6541 if (outrel[0].r_offset == MINUS_ONE)
0d591ff7 6542 /* The relocation field has been deleted. */
5d41f0b6
RS
6543 return TRUE;
6544
6545 if (outrel[0].r_offset == MINUS_TWO)
0d591ff7
RS
6546 {
6547 /* The relocation field has been converted into a relative value of
6548 some sort. Functions like _bfd_elf_write_section_eh_frame expect
6549 the field to be fully relocated, so add in the symbol's value. */
0d591ff7 6550 *addendp += symbol;
5d41f0b6 6551 return TRUE;
0d591ff7 6552 }
b49e97c9 6553
5d41f0b6
RS
6554 /* We must now calculate the dynamic symbol table index to use
6555 in the relocation. */
d4a77f3f 6556 if (h != NULL && ! SYMBOL_REFERENCES_LOCAL (info, &h->root))
5d41f0b6 6557 {
020d7251 6558 BFD_ASSERT (htab->is_vxworks || h->global_got_area != GGA_NONE);
5d41f0b6
RS
6559 indx = h->root.dynindx;
6560 if (SGI_COMPAT (output_bfd))
6561 defined_p = h->root.def_regular;
6562 else
6563 /* ??? glibc's ld.so just adds the final GOT entry to the
6564 relocation field. It therefore treats relocs against
6565 defined symbols in the same way as relocs against
6566 undefined symbols. */
6567 defined_p = FALSE;
6568 }
b49e97c9
TS
6569 else
6570 {
5d41f0b6
RS
6571 if (sec != NULL && bfd_is_abs_section (sec))
6572 indx = 0;
6573 else if (sec == NULL || sec->owner == NULL)
fdd07405 6574 {
5d41f0b6
RS
6575 bfd_set_error (bfd_error_bad_value);
6576 return FALSE;
b49e97c9
TS
6577 }
6578 else
6579 {
5d41f0b6 6580 indx = elf_section_data (sec->output_section)->dynindx;
74541ad4
AM
6581 if (indx == 0)
6582 {
6583 asection *osec = htab->root.text_index_section;
6584 indx = elf_section_data (osec)->dynindx;
6585 }
5d41f0b6
RS
6586 if (indx == 0)
6587 abort ();
b49e97c9
TS
6588 }
6589
5d41f0b6
RS
6590 /* Instead of generating a relocation using the section
6591 symbol, we may as well make it a fully relative
6592 relocation. We want to avoid generating relocations to
6593 local symbols because we used to generate them
6594 incorrectly, without adding the original symbol value,
6595 which is mandated by the ABI for section symbols. In
6596 order to give dynamic loaders and applications time to
6597 phase out the incorrect use, we refrain from emitting
6598 section-relative relocations. It's not like they're
6599 useful, after all. This should be a bit more efficient
6600 as well. */
6601 /* ??? Although this behavior is compatible with glibc's ld.so,
6602 the ABI says that relocations against STN_UNDEF should have
6603 a symbol value of 0. Irix rld honors this, so relocations
6604 against STN_UNDEF have no effect. */
6605 if (!SGI_COMPAT (output_bfd))
6606 indx = 0;
6607 defined_p = TRUE;
b49e97c9
TS
6608 }
6609
5d41f0b6
RS
6610 /* If the relocation was previously an absolute relocation and
6611 this symbol will not be referred to by the relocation, we must
6612 adjust it by the value we give it in the dynamic symbol table.
6613 Otherwise leave the job up to the dynamic linker. */
6614 if (defined_p && r_type != R_MIPS_REL32)
6615 *addendp += symbol;
6616
0a44bf69
RS
6617 if (htab->is_vxworks)
6618 /* VxWorks uses non-relative relocations for this. */
6619 outrel[0].r_info = ELF32_R_INFO (indx, R_MIPS_32);
6620 else
6621 /* The relocation is always an REL32 relocation because we don't
6622 know where the shared library will wind up at load-time. */
6623 outrel[0].r_info = ELF_R_INFO (output_bfd, (unsigned long) indx,
6624 R_MIPS_REL32);
6625
5d41f0b6
RS
6626 /* For strict adherence to the ABI specification, we should
6627 generate a R_MIPS_64 relocation record by itself before the
6628 _REL32/_64 record as well, such that the addend is read in as
6629 a 64-bit value (REL32 is a 32-bit relocation, after all).
6630 However, since none of the existing ELF64 MIPS dynamic
6631 loaders seems to care, we don't waste space with these
6632 artificial relocations. If this turns out to not be true,
6633 mips_elf_allocate_dynamic_relocation() should be tweaked so
6634 as to make room for a pair of dynamic relocations per
6635 invocation if ABI_64_P, and here we should generate an
6636 additional relocation record with R_MIPS_64 by itself for a
6637 NULL symbol before this relocation record. */
6638 outrel[1].r_info = ELF_R_INFO (output_bfd, 0,
6639 ABI_64_P (output_bfd)
6640 ? R_MIPS_64
6641 : R_MIPS_NONE);
6642 outrel[2].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_NONE);
6643
6644 /* Adjust the output offset of the relocation to reference the
6645 correct location in the output file. */
6646 outrel[0].r_offset += (input_section->output_section->vma
6647 + input_section->output_offset);
6648 outrel[1].r_offset += (input_section->output_section->vma
6649 + input_section->output_offset);
6650 outrel[2].r_offset += (input_section->output_section->vma
6651 + input_section->output_offset);
6652
b49e97c9
TS
6653 /* Put the relocation back out. We have to use the special
6654 relocation outputter in the 64-bit case since the 64-bit
6655 relocation format is non-standard. */
6656 if (ABI_64_P (output_bfd))
6657 {
6658 (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
6659 (output_bfd, &outrel[0],
6660 (sreloc->contents
6661 + sreloc->reloc_count * sizeof (Elf64_Mips_External_Rel)));
6662 }
0a44bf69
RS
6663 else if (htab->is_vxworks)
6664 {
6665 /* VxWorks uses RELA rather than REL dynamic relocations. */
6666 outrel[0].r_addend = *addendp;
6667 bfd_elf32_swap_reloca_out
6668 (output_bfd, &outrel[0],
6669 (sreloc->contents
6670 + sreloc->reloc_count * sizeof (Elf32_External_Rela)));
6671 }
b49e97c9 6672 else
947216bf
AM
6673 bfd_elf32_swap_reloc_out
6674 (output_bfd, &outrel[0],
6675 (sreloc->contents + sreloc->reloc_count * sizeof (Elf32_External_Rel)));
b49e97c9 6676
b49e97c9
TS
6677 /* We've now added another relocation. */
6678 ++sreloc->reloc_count;
6679
6680 /* Make sure the output section is writable. The dynamic linker
6681 will be writing to it. */
6682 elf_section_data (input_section->output_section)->this_hdr.sh_flags
6683 |= SHF_WRITE;
6684
6685 /* On IRIX5, make an entry of compact relocation info. */
5d41f0b6 6686 if (IRIX_COMPAT (output_bfd) == ict_irix5)
b49e97c9 6687 {
3d4d4302 6688 asection *scpt = bfd_get_linker_section (dynobj, ".compact_rel");
b49e97c9
TS
6689 bfd_byte *cr;
6690
6691 if (scpt)
6692 {
6693 Elf32_crinfo cptrel;
6694
6695 mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG);
6696 cptrel.vaddr = (rel->r_offset
6697 + input_section->output_section->vma
6698 + input_section->output_offset);
6699 if (r_type == R_MIPS_REL32)
6700 mips_elf_set_cr_type (cptrel, CRT_MIPS_REL32);
6701 else
6702 mips_elf_set_cr_type (cptrel, CRT_MIPS_WORD);
6703 mips_elf_set_cr_dist2to (cptrel, 0);
6704 cptrel.konst = *addendp;
6705
6706 cr = (scpt->contents
6707 + sizeof (Elf32_External_compact_rel));
abc0f8d0 6708 mips_elf_set_cr_relvaddr (cptrel, 0);
b49e97c9
TS
6709 bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
6710 ((Elf32_External_crinfo *) cr
6711 + scpt->reloc_count));
6712 ++scpt->reloc_count;
6713 }
6714 }
6715
943284cc
DJ
6716 /* If we've written this relocation for a readonly section,
6717 we need to set DF_TEXTREL again, so that we do not delete the
6718 DT_TEXTREL tag. */
6719 if (MIPS_ELF_READONLY_SECTION (input_section))
6720 info->flags |= DF_TEXTREL;
6721
b34976b6 6722 return TRUE;
b49e97c9
TS
6723}
6724\f
b49e97c9
TS
6725/* Return the MACH for a MIPS e_flags value. */
6726
6727unsigned long
9719ad41 6728_bfd_elf_mips_mach (flagword flags)
b49e97c9
TS
6729{
6730 switch (flags & EF_MIPS_MACH)
6731 {
6732 case E_MIPS_MACH_3900:
6733 return bfd_mach_mips3900;
6734
6735 case E_MIPS_MACH_4010:
6736 return bfd_mach_mips4010;
6737
6738 case E_MIPS_MACH_4100:
6739 return bfd_mach_mips4100;
6740
6741 case E_MIPS_MACH_4111:
6742 return bfd_mach_mips4111;
6743
00707a0e
RS
6744 case E_MIPS_MACH_4120:
6745 return bfd_mach_mips4120;
6746
b49e97c9
TS
6747 case E_MIPS_MACH_4650:
6748 return bfd_mach_mips4650;
6749
00707a0e
RS
6750 case E_MIPS_MACH_5400:
6751 return bfd_mach_mips5400;
6752
6753 case E_MIPS_MACH_5500:
6754 return bfd_mach_mips5500;
6755
e407c74b
NC
6756 case E_MIPS_MACH_5900:
6757 return bfd_mach_mips5900;
6758
0d2e43ed
ILT
6759 case E_MIPS_MACH_9000:
6760 return bfd_mach_mips9000;
6761
b49e97c9
TS
6762 case E_MIPS_MACH_SB1:
6763 return bfd_mach_mips_sb1;
6764
350cc38d
MS
6765 case E_MIPS_MACH_LS2E:
6766 return bfd_mach_mips_loongson_2e;
6767
6768 case E_MIPS_MACH_LS2F:
6769 return bfd_mach_mips_loongson_2f;
6770
fd503541
NC
6771 case E_MIPS_MACH_LS3A:
6772 return bfd_mach_mips_loongson_3a;
6773
2c629856
N
6774 case E_MIPS_MACH_OCTEON3:
6775 return bfd_mach_mips_octeon3;
6776
432233b3
AP
6777 case E_MIPS_MACH_OCTEON2:
6778 return bfd_mach_mips_octeon2;
6779
6f179bd0
AN
6780 case E_MIPS_MACH_OCTEON:
6781 return bfd_mach_mips_octeon;
6782
52b6b6b9
JM
6783 case E_MIPS_MACH_XLR:
6784 return bfd_mach_mips_xlr;
6785
b49e97c9
TS
6786 default:
6787 switch (flags & EF_MIPS_ARCH)
6788 {
6789 default:
6790 case E_MIPS_ARCH_1:
6791 return bfd_mach_mips3000;
b49e97c9
TS
6792
6793 case E_MIPS_ARCH_2:
6794 return bfd_mach_mips6000;
b49e97c9
TS
6795
6796 case E_MIPS_ARCH_3:
6797 return bfd_mach_mips4000;
b49e97c9
TS
6798
6799 case E_MIPS_ARCH_4:
6800 return bfd_mach_mips8000;
b49e97c9
TS
6801
6802 case E_MIPS_ARCH_5:
6803 return bfd_mach_mips5;
b49e97c9
TS
6804
6805 case E_MIPS_ARCH_32:
6806 return bfd_mach_mipsisa32;
b49e97c9
TS
6807
6808 case E_MIPS_ARCH_64:
6809 return bfd_mach_mipsisa64;
af7ee8bf
CD
6810
6811 case E_MIPS_ARCH_32R2:
6812 return bfd_mach_mipsisa32r2;
5f74bc13
CD
6813
6814 case E_MIPS_ARCH_64R2:
6815 return bfd_mach_mipsisa64r2;
7361da2c
AB
6816
6817 case E_MIPS_ARCH_32R6:
6818 return bfd_mach_mipsisa32r6;
6819
6820 case E_MIPS_ARCH_64R6:
6821 return bfd_mach_mipsisa64r6;
b49e97c9
TS
6822 }
6823 }
6824
6825 return 0;
6826}
6827
6828/* Return printable name for ABI. */
6829
6830static INLINE char *
9719ad41 6831elf_mips_abi_name (bfd *abfd)
b49e97c9
TS
6832{
6833 flagword flags;
6834
6835 flags = elf_elfheader (abfd)->e_flags;
6836 switch (flags & EF_MIPS_ABI)
6837 {
6838 case 0:
6839 if (ABI_N32_P (abfd))
6840 return "N32";
6841 else if (ABI_64_P (abfd))
6842 return "64";
6843 else
6844 return "none";
6845 case E_MIPS_ABI_O32:
6846 return "O32";
6847 case E_MIPS_ABI_O64:
6848 return "O64";
6849 case E_MIPS_ABI_EABI32:
6850 return "EABI32";
6851 case E_MIPS_ABI_EABI64:
6852 return "EABI64";
6853 default:
6854 return "unknown abi";
6855 }
6856}
6857\f
6858/* MIPS ELF uses two common sections. One is the usual one, and the
6859 other is for small objects. All the small objects are kept
6860 together, and then referenced via the gp pointer, which yields
6861 faster assembler code. This is what we use for the small common
6862 section. This approach is copied from ecoff.c. */
6863static asection mips_elf_scom_section;
6864static asymbol mips_elf_scom_symbol;
6865static asymbol *mips_elf_scom_symbol_ptr;
6866
6867/* MIPS ELF also uses an acommon section, which represents an
6868 allocated common symbol which may be overridden by a
6869 definition in a shared library. */
6870static asection mips_elf_acom_section;
6871static asymbol mips_elf_acom_symbol;
6872static asymbol *mips_elf_acom_symbol_ptr;
6873
738e5348 6874/* This is used for both the 32-bit and the 64-bit ABI. */
b49e97c9
TS
6875
6876void
9719ad41 6877_bfd_mips_elf_symbol_processing (bfd *abfd, asymbol *asym)
b49e97c9
TS
6878{
6879 elf_symbol_type *elfsym;
6880
738e5348 6881 /* Handle the special MIPS section numbers that a symbol may use. */
b49e97c9
TS
6882 elfsym = (elf_symbol_type *) asym;
6883 switch (elfsym->internal_elf_sym.st_shndx)
6884 {
6885 case SHN_MIPS_ACOMMON:
6886 /* This section is used in a dynamically linked executable file.
6887 It is an allocated common section. The dynamic linker can
6888 either resolve these symbols to something in a shared
6889 library, or it can just leave them here. For our purposes,
6890 we can consider these symbols to be in a new section. */
6891 if (mips_elf_acom_section.name == NULL)
6892 {
6893 /* Initialize the acommon section. */
6894 mips_elf_acom_section.name = ".acommon";
6895 mips_elf_acom_section.flags = SEC_ALLOC;
6896 mips_elf_acom_section.output_section = &mips_elf_acom_section;
6897 mips_elf_acom_section.symbol = &mips_elf_acom_symbol;
6898 mips_elf_acom_section.symbol_ptr_ptr = &mips_elf_acom_symbol_ptr;
6899 mips_elf_acom_symbol.name = ".acommon";
6900 mips_elf_acom_symbol.flags = BSF_SECTION_SYM;
6901 mips_elf_acom_symbol.section = &mips_elf_acom_section;
6902 mips_elf_acom_symbol_ptr = &mips_elf_acom_symbol;
6903 }
6904 asym->section = &mips_elf_acom_section;
6905 break;
6906
6907 case SHN_COMMON:
6908 /* Common symbols less than the GP size are automatically
6909 treated as SHN_MIPS_SCOMMON symbols on IRIX5. */
6910 if (asym->value > elf_gp_size (abfd)
b59eed79 6911 || ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_TLS
b49e97c9
TS
6912 || IRIX_COMPAT (abfd) == ict_irix6)
6913 break;
6914 /* Fall through. */
6915 case SHN_MIPS_SCOMMON:
6916 if (mips_elf_scom_section.name == NULL)
6917 {
6918 /* Initialize the small common section. */
6919 mips_elf_scom_section.name = ".scommon";
6920 mips_elf_scom_section.flags = SEC_IS_COMMON;
6921 mips_elf_scom_section.output_section = &mips_elf_scom_section;
6922 mips_elf_scom_section.symbol = &mips_elf_scom_symbol;
6923 mips_elf_scom_section.symbol_ptr_ptr = &mips_elf_scom_symbol_ptr;
6924 mips_elf_scom_symbol.name = ".scommon";
6925 mips_elf_scom_symbol.flags = BSF_SECTION_SYM;
6926 mips_elf_scom_symbol.section = &mips_elf_scom_section;
6927 mips_elf_scom_symbol_ptr = &mips_elf_scom_symbol;
6928 }
6929 asym->section = &mips_elf_scom_section;
6930 asym->value = elfsym->internal_elf_sym.st_size;
6931 break;
6932
6933 case SHN_MIPS_SUNDEFINED:
6934 asym->section = bfd_und_section_ptr;
6935 break;
6936
b49e97c9 6937 case SHN_MIPS_TEXT:
00b4930b
TS
6938 {
6939 asection *section = bfd_get_section_by_name (abfd, ".text");
6940
00b4930b
TS
6941 if (section != NULL)
6942 {
6943 asym->section = section;
6944 /* MIPS_TEXT is a bit special, the address is not an offset
6945 to the base of the .text section. So substract the section
6946 base address to make it an offset. */
6947 asym->value -= section->vma;
6948 }
6949 }
b49e97c9
TS
6950 break;
6951
6952 case SHN_MIPS_DATA:
00b4930b
TS
6953 {
6954 asection *section = bfd_get_section_by_name (abfd, ".data");
6955
00b4930b
TS
6956 if (section != NULL)
6957 {
6958 asym->section = section;
6959 /* MIPS_DATA is a bit special, the address is not an offset
6960 to the base of the .data section. So substract the section
6961 base address to make it an offset. */
6962 asym->value -= section->vma;
6963 }
6964 }
b49e97c9 6965 break;
b49e97c9 6966 }
738e5348 6967
df58fc94
RS
6968 /* If this is an odd-valued function symbol, assume it's a MIPS16
6969 or microMIPS one. */
738e5348
RS
6970 if (ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_FUNC
6971 && (asym->value & 1) != 0)
6972 {
6973 asym->value--;
e8faf7d1 6974 if (MICROMIPS_P (abfd))
df58fc94
RS
6975 elfsym->internal_elf_sym.st_other
6976 = ELF_ST_SET_MICROMIPS (elfsym->internal_elf_sym.st_other);
6977 else
6978 elfsym->internal_elf_sym.st_other
6979 = ELF_ST_SET_MIPS16 (elfsym->internal_elf_sym.st_other);
738e5348 6980 }
b49e97c9
TS
6981}
6982\f
8c946ed5
RS
6983/* Implement elf_backend_eh_frame_address_size. This differs from
6984 the default in the way it handles EABI64.
6985
6986 EABI64 was originally specified as an LP64 ABI, and that is what
6987 -mabi=eabi normally gives on a 64-bit target. However, gcc has
6988 historically accepted the combination of -mabi=eabi and -mlong32,
6989 and this ILP32 variation has become semi-official over time.
6990 Both forms use elf32 and have pointer-sized FDE addresses.
6991
6992 If an EABI object was generated by GCC 4.0 or above, it will have
6993 an empty .gcc_compiled_longXX section, where XX is the size of longs
6994 in bits. Unfortunately, ILP32 objects generated by earlier compilers
6995 have no special marking to distinguish them from LP64 objects.
6996
6997 We don't want users of the official LP64 ABI to be punished for the
6998 existence of the ILP32 variant, but at the same time, we don't want
6999 to mistakenly interpret pre-4.0 ILP32 objects as being LP64 objects.
7000 We therefore take the following approach:
7001
7002 - If ABFD contains a .gcc_compiled_longXX section, use it to
7003 determine the pointer size.
7004
7005 - Otherwise check the type of the first relocation. Assume that
7006 the LP64 ABI is being used if the relocation is of type R_MIPS_64.
7007
7008 - Otherwise punt.
7009
7010 The second check is enough to detect LP64 objects generated by pre-4.0
7011 compilers because, in the kind of output generated by those compilers,
7012 the first relocation will be associated with either a CIE personality
7013 routine or an FDE start address. Furthermore, the compilers never
7014 used a special (non-pointer) encoding for this ABI.
7015
7016 Checking the relocation type should also be safe because there is no
7017 reason to use R_MIPS_64 in an ILP32 object. Pre-4.0 compilers never
7018 did so. */
7019
7020unsigned int
7021_bfd_mips_elf_eh_frame_address_size (bfd *abfd, asection *sec)
7022{
7023 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
7024 return 8;
7025 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64)
7026 {
7027 bfd_boolean long32_p, long64_p;
7028
7029 long32_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long32") != 0;
7030 long64_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long64") != 0;
7031 if (long32_p && long64_p)
7032 return 0;
7033 if (long32_p)
7034 return 4;
7035 if (long64_p)
7036 return 8;
7037
7038 if (sec->reloc_count > 0
7039 && elf_section_data (sec)->relocs != NULL
7040 && (ELF32_R_TYPE (elf_section_data (sec)->relocs[0].r_info)
7041 == R_MIPS_64))
7042 return 8;
7043
7044 return 0;
7045 }
7046 return 4;
7047}
7048\f
174fd7f9
RS
7049/* There appears to be a bug in the MIPSpro linker that causes GOT_DISP
7050 relocations against two unnamed section symbols to resolve to the
7051 same address. For example, if we have code like:
7052
7053 lw $4,%got_disp(.data)($gp)
7054 lw $25,%got_disp(.text)($gp)
7055 jalr $25
7056
7057 then the linker will resolve both relocations to .data and the program
7058 will jump there rather than to .text.
7059
7060 We can work around this problem by giving names to local section symbols.
7061 This is also what the MIPSpro tools do. */
7062
7063bfd_boolean
7064_bfd_mips_elf_name_local_section_symbols (bfd *abfd)
7065{
7066 return SGI_COMPAT (abfd);
7067}
7068\f
b49e97c9
TS
7069/* Work over a section just before writing it out. This routine is
7070 used by both the 32-bit and the 64-bit ABI. FIXME: We recognize
7071 sections that need the SHF_MIPS_GPREL flag by name; there has to be
7072 a better way. */
7073
b34976b6 7074bfd_boolean
9719ad41 7075_bfd_mips_elf_section_processing (bfd *abfd, Elf_Internal_Shdr *hdr)
b49e97c9
TS
7076{
7077 if (hdr->sh_type == SHT_MIPS_REGINFO
7078 && hdr->sh_size > 0)
7079 {
7080 bfd_byte buf[4];
7081
7082 BFD_ASSERT (hdr->sh_size == sizeof (Elf32_External_RegInfo));
7083 BFD_ASSERT (hdr->contents == NULL);
7084
7085 if (bfd_seek (abfd,
7086 hdr->sh_offset + sizeof (Elf32_External_RegInfo) - 4,
7087 SEEK_SET) != 0)
b34976b6 7088 return FALSE;
b49e97c9 7089 H_PUT_32 (abfd, elf_gp (abfd), buf);
9719ad41 7090 if (bfd_bwrite (buf, 4, abfd) != 4)
b34976b6 7091 return FALSE;
b49e97c9
TS
7092 }
7093
7094 if (hdr->sh_type == SHT_MIPS_OPTIONS
7095 && hdr->bfd_section != NULL
f0abc2a1
AM
7096 && mips_elf_section_data (hdr->bfd_section) != NULL
7097 && mips_elf_section_data (hdr->bfd_section)->u.tdata != NULL)
b49e97c9
TS
7098 {
7099 bfd_byte *contents, *l, *lend;
7100
f0abc2a1
AM
7101 /* We stored the section contents in the tdata field in the
7102 set_section_contents routine. We save the section contents
7103 so that we don't have to read them again.
b49e97c9
TS
7104 At this point we know that elf_gp is set, so we can look
7105 through the section contents to see if there is an
7106 ODK_REGINFO structure. */
7107
f0abc2a1 7108 contents = mips_elf_section_data (hdr->bfd_section)->u.tdata;
b49e97c9
TS
7109 l = contents;
7110 lend = contents + hdr->sh_size;
7111 while (l + sizeof (Elf_External_Options) <= lend)
7112 {
7113 Elf_Internal_Options intopt;
7114
7115 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
7116 &intopt);
1bc8074d
MR
7117 if (intopt.size < sizeof (Elf_External_Options))
7118 {
4eca0228 7119 _bfd_error_handler
1bc8074d
MR
7120 (_("%B: Warning: bad `%s' option size %u smaller than its header"),
7121 abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd), intopt.size);
7122 break;
7123 }
b49e97c9
TS
7124 if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
7125 {
7126 bfd_byte buf[8];
7127
7128 if (bfd_seek (abfd,
7129 (hdr->sh_offset
7130 + (l - contents)
7131 + sizeof (Elf_External_Options)
7132 + (sizeof (Elf64_External_RegInfo) - 8)),
7133 SEEK_SET) != 0)
b34976b6 7134 return FALSE;
b49e97c9 7135 H_PUT_64 (abfd, elf_gp (abfd), buf);
9719ad41 7136 if (bfd_bwrite (buf, 8, abfd) != 8)
b34976b6 7137 return FALSE;
b49e97c9
TS
7138 }
7139 else if (intopt.kind == ODK_REGINFO)
7140 {
7141 bfd_byte buf[4];
7142
7143 if (bfd_seek (abfd,
7144 (hdr->sh_offset
7145 + (l - contents)
7146 + sizeof (Elf_External_Options)
7147 + (sizeof (Elf32_External_RegInfo) - 4)),
7148 SEEK_SET) != 0)
b34976b6 7149 return FALSE;
b49e97c9 7150 H_PUT_32 (abfd, elf_gp (abfd), buf);
9719ad41 7151 if (bfd_bwrite (buf, 4, abfd) != 4)
b34976b6 7152 return FALSE;
b49e97c9
TS
7153 }
7154 l += intopt.size;
7155 }
7156 }
7157
7158 if (hdr->bfd_section != NULL)
7159 {
7160 const char *name = bfd_get_section_name (abfd, hdr->bfd_section);
7161
2d0f9ad9
JM
7162 /* .sbss is not handled specially here because the GNU/Linux
7163 prelinker can convert .sbss from NOBITS to PROGBITS and
7164 changing it back to NOBITS breaks the binary. The entry in
7165 _bfd_mips_elf_special_sections will ensure the correct flags
7166 are set on .sbss if BFD creates it without reading it from an
7167 input file, and without special handling here the flags set
7168 on it in an input file will be followed. */
b49e97c9
TS
7169 if (strcmp (name, ".sdata") == 0
7170 || strcmp (name, ".lit8") == 0
7171 || strcmp (name, ".lit4") == 0)
fd6f9d17 7172 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
b49e97c9 7173 else if (strcmp (name, ".srdata") == 0)
fd6f9d17 7174 hdr->sh_flags |= SHF_ALLOC | SHF_MIPS_GPREL;
b49e97c9 7175 else if (strcmp (name, ".compact_rel") == 0)
fd6f9d17 7176 hdr->sh_flags = 0;
b49e97c9
TS
7177 else if (strcmp (name, ".rtproc") == 0)
7178 {
7179 if (hdr->sh_addralign != 0 && hdr->sh_entsize == 0)
7180 {
7181 unsigned int adjust;
7182
7183 adjust = hdr->sh_size % hdr->sh_addralign;
7184 if (adjust != 0)
7185 hdr->sh_size += hdr->sh_addralign - adjust;
7186 }
7187 }
7188 }
7189
b34976b6 7190 return TRUE;
b49e97c9
TS
7191}
7192
7193/* Handle a MIPS specific section when reading an object file. This
7194 is called when elfcode.h finds a section with an unknown type.
7195 This routine supports both the 32-bit and 64-bit ELF ABI.
7196
7197 FIXME: We need to handle the SHF_MIPS_GPREL flag, but I'm not sure
7198 how to. */
7199
b34976b6 7200bfd_boolean
6dc132d9
L
7201_bfd_mips_elf_section_from_shdr (bfd *abfd,
7202 Elf_Internal_Shdr *hdr,
7203 const char *name,
7204 int shindex)
b49e97c9
TS
7205{
7206 flagword flags = 0;
7207
7208 /* There ought to be a place to keep ELF backend specific flags, but
7209 at the moment there isn't one. We just keep track of the
7210 sections by their name, instead. Fortunately, the ABI gives
7211 suggested names for all the MIPS specific sections, so we will
7212 probably get away with this. */
7213 switch (hdr->sh_type)
7214 {
7215 case SHT_MIPS_LIBLIST:
7216 if (strcmp (name, ".liblist") != 0)
b34976b6 7217 return FALSE;
b49e97c9
TS
7218 break;
7219 case SHT_MIPS_MSYM:
7220 if (strcmp (name, ".msym") != 0)
b34976b6 7221 return FALSE;
b49e97c9
TS
7222 break;
7223 case SHT_MIPS_CONFLICT:
7224 if (strcmp (name, ".conflict") != 0)
b34976b6 7225 return FALSE;
b49e97c9
TS
7226 break;
7227 case SHT_MIPS_GPTAB:
0112cd26 7228 if (! CONST_STRNEQ (name, ".gptab."))
b34976b6 7229 return FALSE;
b49e97c9
TS
7230 break;
7231 case SHT_MIPS_UCODE:
7232 if (strcmp (name, ".ucode") != 0)
b34976b6 7233 return FALSE;
b49e97c9
TS
7234 break;
7235 case SHT_MIPS_DEBUG:
7236 if (strcmp (name, ".mdebug") != 0)
b34976b6 7237 return FALSE;
b49e97c9
TS
7238 flags = SEC_DEBUGGING;
7239 break;
7240 case SHT_MIPS_REGINFO:
7241 if (strcmp (name, ".reginfo") != 0
7242 || hdr->sh_size != sizeof (Elf32_External_RegInfo))
b34976b6 7243 return FALSE;
b49e97c9
TS
7244 flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
7245 break;
7246 case SHT_MIPS_IFACE:
7247 if (strcmp (name, ".MIPS.interfaces") != 0)
b34976b6 7248 return FALSE;
b49e97c9
TS
7249 break;
7250 case SHT_MIPS_CONTENT:
0112cd26 7251 if (! CONST_STRNEQ (name, ".MIPS.content"))
b34976b6 7252 return FALSE;
b49e97c9
TS
7253 break;
7254 case SHT_MIPS_OPTIONS:
cc2e31b9 7255 if (!MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
b34976b6 7256 return FALSE;
b49e97c9 7257 break;
351cdf24
MF
7258 case SHT_MIPS_ABIFLAGS:
7259 if (!MIPS_ELF_ABIFLAGS_SECTION_NAME_P (name))
7260 return FALSE;
7261 flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
7262 break;
b49e97c9 7263 case SHT_MIPS_DWARF:
1b315056 7264 if (! CONST_STRNEQ (name, ".debug_")
355d10dc 7265 && ! CONST_STRNEQ (name, ".zdebug_"))
b34976b6 7266 return FALSE;
b49e97c9
TS
7267 break;
7268 case SHT_MIPS_SYMBOL_LIB:
7269 if (strcmp (name, ".MIPS.symlib") != 0)
b34976b6 7270 return FALSE;
b49e97c9
TS
7271 break;
7272 case SHT_MIPS_EVENTS:
0112cd26
NC
7273 if (! CONST_STRNEQ (name, ".MIPS.events")
7274 && ! CONST_STRNEQ (name, ".MIPS.post_rel"))
b34976b6 7275 return FALSE;
b49e97c9
TS
7276 break;
7277 default:
cc2e31b9 7278 break;
b49e97c9
TS
7279 }
7280
6dc132d9 7281 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
b34976b6 7282 return FALSE;
b49e97c9
TS
7283
7284 if (flags)
7285 {
7286 if (! bfd_set_section_flags (abfd, hdr->bfd_section,
7287 (bfd_get_section_flags (abfd,
7288 hdr->bfd_section)
7289 | flags)))
b34976b6 7290 return FALSE;
b49e97c9
TS
7291 }
7292
351cdf24
MF
7293 if (hdr->sh_type == SHT_MIPS_ABIFLAGS)
7294 {
7295 Elf_External_ABIFlags_v0 ext;
7296
7297 if (! bfd_get_section_contents (abfd, hdr->bfd_section,
7298 &ext, 0, sizeof ext))
7299 return FALSE;
7300 bfd_mips_elf_swap_abiflags_v0_in (abfd, &ext,
7301 &mips_elf_tdata (abfd)->abiflags);
7302 if (mips_elf_tdata (abfd)->abiflags.version != 0)
7303 return FALSE;
7304 mips_elf_tdata (abfd)->abiflags_valid = TRUE;
7305 }
7306
b49e97c9
TS
7307 /* FIXME: We should record sh_info for a .gptab section. */
7308
7309 /* For a .reginfo section, set the gp value in the tdata information
7310 from the contents of this section. We need the gp value while
7311 processing relocs, so we just get it now. The .reginfo section
7312 is not used in the 64-bit MIPS ELF ABI. */
7313 if (hdr->sh_type == SHT_MIPS_REGINFO)
7314 {
7315 Elf32_External_RegInfo ext;
7316 Elf32_RegInfo s;
7317
9719ad41
RS
7318 if (! bfd_get_section_contents (abfd, hdr->bfd_section,
7319 &ext, 0, sizeof ext))
b34976b6 7320 return FALSE;
b49e97c9
TS
7321 bfd_mips_elf32_swap_reginfo_in (abfd, &ext, &s);
7322 elf_gp (abfd) = s.ri_gp_value;
7323 }
7324
7325 /* For a SHT_MIPS_OPTIONS section, look for a ODK_REGINFO entry, and
7326 set the gp value based on what we find. We may see both
7327 SHT_MIPS_REGINFO and SHT_MIPS_OPTIONS/ODK_REGINFO; in that case,
7328 they should agree. */
7329 if (hdr->sh_type == SHT_MIPS_OPTIONS)
7330 {
7331 bfd_byte *contents, *l, *lend;
7332
9719ad41 7333 contents = bfd_malloc (hdr->sh_size);
b49e97c9 7334 if (contents == NULL)
b34976b6 7335 return FALSE;
b49e97c9 7336 if (! bfd_get_section_contents (abfd, hdr->bfd_section, contents,
9719ad41 7337 0, hdr->sh_size))
b49e97c9
TS
7338 {
7339 free (contents);
b34976b6 7340 return FALSE;
b49e97c9
TS
7341 }
7342 l = contents;
7343 lend = contents + hdr->sh_size;
7344 while (l + sizeof (Elf_External_Options) <= lend)
7345 {
7346 Elf_Internal_Options intopt;
7347
7348 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
7349 &intopt);
1bc8074d
MR
7350 if (intopt.size < sizeof (Elf_External_Options))
7351 {
4eca0228 7352 _bfd_error_handler
1bc8074d
MR
7353 (_("%B: Warning: bad `%s' option size %u smaller than its header"),
7354 abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd), intopt.size);
7355 break;
7356 }
b49e97c9
TS
7357 if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
7358 {
7359 Elf64_Internal_RegInfo intreg;
7360
7361 bfd_mips_elf64_swap_reginfo_in
7362 (abfd,
7363 ((Elf64_External_RegInfo *)
7364 (l + sizeof (Elf_External_Options))),
7365 &intreg);
7366 elf_gp (abfd) = intreg.ri_gp_value;
7367 }
7368 else if (intopt.kind == ODK_REGINFO)
7369 {
7370 Elf32_RegInfo intreg;
7371
7372 bfd_mips_elf32_swap_reginfo_in
7373 (abfd,
7374 ((Elf32_External_RegInfo *)
7375 (l + sizeof (Elf_External_Options))),
7376 &intreg);
7377 elf_gp (abfd) = intreg.ri_gp_value;
7378 }
7379 l += intopt.size;
7380 }
7381 free (contents);
7382 }
7383
b34976b6 7384 return TRUE;
b49e97c9
TS
7385}
7386
7387/* Set the correct type for a MIPS ELF section. We do this by the
7388 section name, which is a hack, but ought to work. This routine is
7389 used by both the 32-bit and the 64-bit ABI. */
7390
b34976b6 7391bfd_boolean
9719ad41 7392_bfd_mips_elf_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
b49e97c9 7393{
0414f35b 7394 const char *name = bfd_get_section_name (abfd, sec);
b49e97c9
TS
7395
7396 if (strcmp (name, ".liblist") == 0)
7397 {
7398 hdr->sh_type = SHT_MIPS_LIBLIST;
eea6121a 7399 hdr->sh_info = sec->size / sizeof (Elf32_Lib);
b49e97c9
TS
7400 /* The sh_link field is set in final_write_processing. */
7401 }
7402 else if (strcmp (name, ".conflict") == 0)
7403 hdr->sh_type = SHT_MIPS_CONFLICT;
0112cd26 7404 else if (CONST_STRNEQ (name, ".gptab."))
b49e97c9
TS
7405 {
7406 hdr->sh_type = SHT_MIPS_GPTAB;
7407 hdr->sh_entsize = sizeof (Elf32_External_gptab);
7408 /* The sh_info field is set in final_write_processing. */
7409 }
7410 else if (strcmp (name, ".ucode") == 0)
7411 hdr->sh_type = SHT_MIPS_UCODE;
7412 else if (strcmp (name, ".mdebug") == 0)
7413 {
7414 hdr->sh_type = SHT_MIPS_DEBUG;
8dc1a139 7415 /* In a shared object on IRIX 5.3, the .mdebug section has an
b49e97c9
TS
7416 entsize of 0. FIXME: Does this matter? */
7417 if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0)
7418 hdr->sh_entsize = 0;
7419 else
7420 hdr->sh_entsize = 1;
7421 }
7422 else if (strcmp (name, ".reginfo") == 0)
7423 {
7424 hdr->sh_type = SHT_MIPS_REGINFO;
8dc1a139 7425 /* In a shared object on IRIX 5.3, the .reginfo section has an
b49e97c9
TS
7426 entsize of 0x18. FIXME: Does this matter? */
7427 if (SGI_COMPAT (abfd))
7428 {
7429 if ((abfd->flags & DYNAMIC) != 0)
7430 hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
7431 else
7432 hdr->sh_entsize = 1;
7433 }
7434 else
7435 hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
7436 }
7437 else if (SGI_COMPAT (abfd)
7438 && (strcmp (name, ".hash") == 0
7439 || strcmp (name, ".dynamic") == 0
7440 || strcmp (name, ".dynstr") == 0))
7441 {
7442 if (SGI_COMPAT (abfd))
7443 hdr->sh_entsize = 0;
7444#if 0
8dc1a139 7445 /* This isn't how the IRIX6 linker behaves. */
b49e97c9
TS
7446 hdr->sh_info = SIZEOF_MIPS_DYNSYM_SECNAMES;
7447#endif
7448 }
7449 else if (strcmp (name, ".got") == 0
7450 || strcmp (name, ".srdata") == 0
7451 || strcmp (name, ".sdata") == 0
7452 || strcmp (name, ".sbss") == 0
7453 || strcmp (name, ".lit4") == 0
7454 || strcmp (name, ".lit8") == 0)
7455 hdr->sh_flags |= SHF_MIPS_GPREL;
7456 else if (strcmp (name, ".MIPS.interfaces") == 0)
7457 {
7458 hdr->sh_type = SHT_MIPS_IFACE;
7459 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7460 }
0112cd26 7461 else if (CONST_STRNEQ (name, ".MIPS.content"))
b49e97c9
TS
7462 {
7463 hdr->sh_type = SHT_MIPS_CONTENT;
7464 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7465 /* The sh_info field is set in final_write_processing. */
7466 }
cc2e31b9 7467 else if (MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
b49e97c9
TS
7468 {
7469 hdr->sh_type = SHT_MIPS_OPTIONS;
7470 hdr->sh_entsize = 1;
7471 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7472 }
351cdf24
MF
7473 else if (CONST_STRNEQ (name, ".MIPS.abiflags"))
7474 {
7475 hdr->sh_type = SHT_MIPS_ABIFLAGS;
7476 hdr->sh_entsize = sizeof (Elf_External_ABIFlags_v0);
7477 }
1b315056
CS
7478 else if (CONST_STRNEQ (name, ".debug_")
7479 || CONST_STRNEQ (name, ".zdebug_"))
b5482f21
NC
7480 {
7481 hdr->sh_type = SHT_MIPS_DWARF;
7482
7483 /* Irix facilities such as libexc expect a single .debug_frame
7484 per executable, the system ones have NOSTRIP set and the linker
7485 doesn't merge sections with different flags so ... */
7486 if (SGI_COMPAT (abfd) && CONST_STRNEQ (name, ".debug_frame"))
7487 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7488 }
b49e97c9
TS
7489 else if (strcmp (name, ".MIPS.symlib") == 0)
7490 {
7491 hdr->sh_type = SHT_MIPS_SYMBOL_LIB;
7492 /* The sh_link and sh_info fields are set in
7493 final_write_processing. */
7494 }
0112cd26
NC
7495 else if (CONST_STRNEQ (name, ".MIPS.events")
7496 || CONST_STRNEQ (name, ".MIPS.post_rel"))
b49e97c9
TS
7497 {
7498 hdr->sh_type = SHT_MIPS_EVENTS;
7499 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7500 /* The sh_link field is set in final_write_processing. */
7501 }
7502 else if (strcmp (name, ".msym") == 0)
7503 {
7504 hdr->sh_type = SHT_MIPS_MSYM;
7505 hdr->sh_flags |= SHF_ALLOC;
7506 hdr->sh_entsize = 8;
7507 }
7508
7a79a000
TS
7509 /* The generic elf_fake_sections will set up REL_HDR using the default
7510 kind of relocations. We used to set up a second header for the
7511 non-default kind of relocations here, but only NewABI would use
7512 these, and the IRIX ld doesn't like resulting empty RELA sections.
7513 Thus we create those header only on demand now. */
b49e97c9 7514
b34976b6 7515 return TRUE;
b49e97c9
TS
7516}
7517
7518/* Given a BFD section, try to locate the corresponding ELF section
7519 index. This is used by both the 32-bit and the 64-bit ABI.
7520 Actually, it's not clear to me that the 64-bit ABI supports these,
7521 but for non-PIC objects we will certainly want support for at least
7522 the .scommon section. */
7523
b34976b6 7524bfd_boolean
9719ad41
RS
7525_bfd_mips_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
7526 asection *sec, int *retval)
b49e97c9
TS
7527{
7528 if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
7529 {
7530 *retval = SHN_MIPS_SCOMMON;
b34976b6 7531 return TRUE;
b49e97c9
TS
7532 }
7533 if (strcmp (bfd_get_section_name (abfd, sec), ".acommon") == 0)
7534 {
7535 *retval = SHN_MIPS_ACOMMON;
b34976b6 7536 return TRUE;
b49e97c9 7537 }
b34976b6 7538 return FALSE;
b49e97c9
TS
7539}
7540\f
7541/* Hook called by the linker routine which adds symbols from an object
7542 file. We must handle the special MIPS section numbers here. */
7543
b34976b6 7544bfd_boolean
9719ad41 7545_bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
555cd476 7546 Elf_Internal_Sym *sym, const char **namep,
9719ad41
RS
7547 flagword *flagsp ATTRIBUTE_UNUSED,
7548 asection **secp, bfd_vma *valp)
b49e97c9
TS
7549{
7550 if (SGI_COMPAT (abfd)
7551 && (abfd->flags & DYNAMIC) != 0
7552 && strcmp (*namep, "_rld_new_interface") == 0)
7553 {
8dc1a139 7554 /* Skip IRIX5 rld entry name. */
b49e97c9 7555 *namep = NULL;
b34976b6 7556 return TRUE;
b49e97c9
TS
7557 }
7558
eedecc07
DD
7559 /* Shared objects may have a dynamic symbol '_gp_disp' defined as
7560 a SECTION *ABS*. This causes ld to think it can resolve _gp_disp
7561 by setting a DT_NEEDED for the shared object. Since _gp_disp is
7562 a magic symbol resolved by the linker, we ignore this bogus definition
7563 of _gp_disp. New ABI objects do not suffer from this problem so this
7564 is not done for them. */
7565 if (!NEWABI_P(abfd)
7566 && (sym->st_shndx == SHN_ABS)
7567 && (strcmp (*namep, "_gp_disp") == 0))
7568 {
7569 *namep = NULL;
7570 return TRUE;
7571 }
7572
b49e97c9
TS
7573 switch (sym->st_shndx)
7574 {
7575 case SHN_COMMON:
7576 /* Common symbols less than the GP size are automatically
7577 treated as SHN_MIPS_SCOMMON symbols. */
7578 if (sym->st_size > elf_gp_size (abfd)
b59eed79 7579 || ELF_ST_TYPE (sym->st_info) == STT_TLS
b49e97c9
TS
7580 || IRIX_COMPAT (abfd) == ict_irix6)
7581 break;
7582 /* Fall through. */
7583 case SHN_MIPS_SCOMMON:
7584 *secp = bfd_make_section_old_way (abfd, ".scommon");
7585 (*secp)->flags |= SEC_IS_COMMON;
7586 *valp = sym->st_size;
7587 break;
7588
7589 case SHN_MIPS_TEXT:
7590 /* This section is used in a shared object. */
698600e4 7591 if (mips_elf_tdata (abfd)->elf_text_section == NULL)
b49e97c9
TS
7592 {
7593 asymbol *elf_text_symbol;
7594 asection *elf_text_section;
7595 bfd_size_type amt = sizeof (asection);
7596
7597 elf_text_section = bfd_zalloc (abfd, amt);
7598 if (elf_text_section == NULL)
b34976b6 7599 return FALSE;
b49e97c9
TS
7600
7601 amt = sizeof (asymbol);
7602 elf_text_symbol = bfd_zalloc (abfd, amt);
7603 if (elf_text_symbol == NULL)
b34976b6 7604 return FALSE;
b49e97c9
TS
7605
7606 /* Initialize the section. */
7607
698600e4
AM
7608 mips_elf_tdata (abfd)->elf_text_section = elf_text_section;
7609 mips_elf_tdata (abfd)->elf_text_symbol = elf_text_symbol;
b49e97c9
TS
7610
7611 elf_text_section->symbol = elf_text_symbol;
698600e4 7612 elf_text_section->symbol_ptr_ptr = &mips_elf_tdata (abfd)->elf_text_symbol;
b49e97c9
TS
7613
7614 elf_text_section->name = ".text";
7615 elf_text_section->flags = SEC_NO_FLAGS;
7616 elf_text_section->output_section = NULL;
7617 elf_text_section->owner = abfd;
7618 elf_text_symbol->name = ".text";
7619 elf_text_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
7620 elf_text_symbol->section = elf_text_section;
7621 }
7622 /* This code used to do *secp = bfd_und_section_ptr if
0e1862bb 7623 bfd_link_pic (info). I don't know why, and that doesn't make sense,
b49e97c9 7624 so I took it out. */
698600e4 7625 *secp = mips_elf_tdata (abfd)->elf_text_section;
b49e97c9
TS
7626 break;
7627
7628 case SHN_MIPS_ACOMMON:
7629 /* Fall through. XXX Can we treat this as allocated data? */
7630 case SHN_MIPS_DATA:
7631 /* This section is used in a shared object. */
698600e4 7632 if (mips_elf_tdata (abfd)->elf_data_section == NULL)
b49e97c9
TS
7633 {
7634 asymbol *elf_data_symbol;
7635 asection *elf_data_section;
7636 bfd_size_type amt = sizeof (asection);
7637
7638 elf_data_section = bfd_zalloc (abfd, amt);
7639 if (elf_data_section == NULL)
b34976b6 7640 return FALSE;
b49e97c9
TS
7641
7642 amt = sizeof (asymbol);
7643 elf_data_symbol = bfd_zalloc (abfd, amt);
7644 if (elf_data_symbol == NULL)
b34976b6 7645 return FALSE;
b49e97c9
TS
7646
7647 /* Initialize the section. */
7648
698600e4
AM
7649 mips_elf_tdata (abfd)->elf_data_section = elf_data_section;
7650 mips_elf_tdata (abfd)->elf_data_symbol = elf_data_symbol;
b49e97c9
TS
7651
7652 elf_data_section->symbol = elf_data_symbol;
698600e4 7653 elf_data_section->symbol_ptr_ptr = &mips_elf_tdata (abfd)->elf_data_symbol;
b49e97c9
TS
7654
7655 elf_data_section->name = ".data";
7656 elf_data_section->flags = SEC_NO_FLAGS;
7657 elf_data_section->output_section = NULL;
7658 elf_data_section->owner = abfd;
7659 elf_data_symbol->name = ".data";
7660 elf_data_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
7661 elf_data_symbol->section = elf_data_section;
7662 }
7663 /* This code used to do *secp = bfd_und_section_ptr if
0e1862bb 7664 bfd_link_pic (info). I don't know why, and that doesn't make sense,
b49e97c9 7665 so I took it out. */
698600e4 7666 *secp = mips_elf_tdata (abfd)->elf_data_section;
b49e97c9
TS
7667 break;
7668
7669 case SHN_MIPS_SUNDEFINED:
7670 *secp = bfd_und_section_ptr;
7671 break;
7672 }
7673
7674 if (SGI_COMPAT (abfd)
0e1862bb 7675 && ! bfd_link_pic (info)
f13a99db 7676 && info->output_bfd->xvec == abfd->xvec
b49e97c9
TS
7677 && strcmp (*namep, "__rld_obj_head") == 0)
7678 {
7679 struct elf_link_hash_entry *h;
14a793b2 7680 struct bfd_link_hash_entry *bh;
b49e97c9
TS
7681
7682 /* Mark __rld_obj_head as dynamic. */
14a793b2 7683 bh = NULL;
b49e97c9 7684 if (! (_bfd_generic_link_add_one_symbol
9719ad41 7685 (info, abfd, *namep, BSF_GLOBAL, *secp, *valp, NULL, FALSE,
14a793b2 7686 get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 7687 return FALSE;
14a793b2
AM
7688
7689 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
7690 h->non_elf = 0;
7691 h->def_regular = 1;
b49e97c9
TS
7692 h->type = STT_OBJECT;
7693
c152c796 7694 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 7695 return FALSE;
b49e97c9 7696
b34976b6 7697 mips_elf_hash_table (info)->use_rld_obj_head = TRUE;
b4082c70 7698 mips_elf_hash_table (info)->rld_symbol = h;
b49e97c9
TS
7699 }
7700
7701 /* If this is a mips16 text symbol, add 1 to the value to make it
7702 odd. This will cause something like .word SYM to come up with
7703 the right value when it is loaded into the PC. */
df58fc94 7704 if (ELF_ST_IS_COMPRESSED (sym->st_other))
b49e97c9
TS
7705 ++*valp;
7706
b34976b6 7707 return TRUE;
b49e97c9
TS
7708}
7709
7710/* This hook function is called before the linker writes out a global
7711 symbol. We mark symbols as small common if appropriate. This is
7712 also where we undo the increment of the value for a mips16 symbol. */
7713
6e0b88f1 7714int
9719ad41
RS
7715_bfd_mips_elf_link_output_symbol_hook
7716 (struct bfd_link_info *info ATTRIBUTE_UNUSED,
7717 const char *name ATTRIBUTE_UNUSED, Elf_Internal_Sym *sym,
7718 asection *input_sec, struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
b49e97c9
TS
7719{
7720 /* If we see a common symbol, which implies a relocatable link, then
7721 if a symbol was small common in an input file, mark it as small
7722 common in the output file. */
7723 if (sym->st_shndx == SHN_COMMON
7724 && strcmp (input_sec->name, ".scommon") == 0)
7725 sym->st_shndx = SHN_MIPS_SCOMMON;
7726
df58fc94 7727 if (ELF_ST_IS_COMPRESSED (sym->st_other))
79cda7cf 7728 sym->st_value &= ~1;
b49e97c9 7729
6e0b88f1 7730 return 1;
b49e97c9
TS
7731}
7732\f
7733/* Functions for the dynamic linker. */
7734
7735/* Create dynamic sections when linking against a dynamic object. */
7736
b34976b6 7737bfd_boolean
9719ad41 7738_bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
b49e97c9
TS
7739{
7740 struct elf_link_hash_entry *h;
14a793b2 7741 struct bfd_link_hash_entry *bh;
b49e97c9
TS
7742 flagword flags;
7743 register asection *s;
7744 const char * const *namep;
0a44bf69 7745 struct mips_elf_link_hash_table *htab;
b49e97c9 7746
0a44bf69 7747 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
7748 BFD_ASSERT (htab != NULL);
7749
b49e97c9
TS
7750 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
7751 | SEC_LINKER_CREATED | SEC_READONLY);
7752
0a44bf69
RS
7753 /* The psABI requires a read-only .dynamic section, but the VxWorks
7754 EABI doesn't. */
7755 if (!htab->is_vxworks)
b49e97c9 7756 {
3d4d4302 7757 s = bfd_get_linker_section (abfd, ".dynamic");
0a44bf69
RS
7758 if (s != NULL)
7759 {
7760 if (! bfd_set_section_flags (abfd, s, flags))
7761 return FALSE;
7762 }
b49e97c9
TS
7763 }
7764
7765 /* We need to create .got section. */
23cc69b6 7766 if (!mips_elf_create_got_section (abfd, info))
f4416af6
AO
7767 return FALSE;
7768
0a44bf69 7769 if (! mips_elf_rel_dyn_section (info, TRUE))
b34976b6 7770 return FALSE;
b49e97c9 7771
b49e97c9 7772 /* Create .stub section. */
3d4d4302
AM
7773 s = bfd_make_section_anyway_with_flags (abfd,
7774 MIPS_ELF_STUB_SECTION_NAME (abfd),
7775 flags | SEC_CODE);
4e41d0d7
RS
7776 if (s == NULL
7777 || ! bfd_set_section_alignment (abfd, s,
7778 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
7779 return FALSE;
7780 htab->sstubs = s;
b49e97c9 7781
e6aea42d 7782 if (!mips_elf_hash_table (info)->use_rld_obj_head
0e1862bb 7783 && bfd_link_executable (info)
3d4d4302 7784 && bfd_get_linker_section (abfd, ".rld_map") == NULL)
b49e97c9 7785 {
3d4d4302
AM
7786 s = bfd_make_section_anyway_with_flags (abfd, ".rld_map",
7787 flags &~ (flagword) SEC_READONLY);
b49e97c9 7788 if (s == NULL
b49e97c9
TS
7789 || ! bfd_set_section_alignment (abfd, s,
7790 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
b34976b6 7791 return FALSE;
b49e97c9
TS
7792 }
7793
7794 /* On IRIX5, we adjust add some additional symbols and change the
7795 alignments of several sections. There is no ABI documentation
7796 indicating that this is necessary on IRIX6, nor any evidence that
7797 the linker takes such action. */
7798 if (IRIX_COMPAT (abfd) == ict_irix5)
7799 {
7800 for (namep = mips_elf_dynsym_rtproc_names; *namep != NULL; namep++)
7801 {
14a793b2 7802 bh = NULL;
b49e97c9 7803 if (! (_bfd_generic_link_add_one_symbol
9719ad41
RS
7804 (info, abfd, *namep, BSF_GLOBAL, bfd_und_section_ptr, 0,
7805 NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 7806 return FALSE;
14a793b2
AM
7807
7808 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
7809 h->non_elf = 0;
7810 h->def_regular = 1;
b49e97c9
TS
7811 h->type = STT_SECTION;
7812
c152c796 7813 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 7814 return FALSE;
b49e97c9
TS
7815 }
7816
7817 /* We need to create a .compact_rel section. */
7818 if (SGI_COMPAT (abfd))
7819 {
7820 if (!mips_elf_create_compact_rel_section (abfd, info))
b34976b6 7821 return FALSE;
b49e97c9
TS
7822 }
7823
44c410de 7824 /* Change alignments of some sections. */
3d4d4302 7825 s = bfd_get_linker_section (abfd, ".hash");
b49e97c9 7826 if (s != NULL)
a253d456
NC
7827 (void) bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
7828
3d4d4302 7829 s = bfd_get_linker_section (abfd, ".dynsym");
b49e97c9 7830 if (s != NULL)
a253d456
NC
7831 (void) bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
7832
3d4d4302 7833 s = bfd_get_linker_section (abfd, ".dynstr");
b49e97c9 7834 if (s != NULL)
a253d456
NC
7835 (void) bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
7836
3d4d4302 7837 /* ??? */
b49e97c9
TS
7838 s = bfd_get_section_by_name (abfd, ".reginfo");
7839 if (s != NULL)
a253d456
NC
7840 (void) bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
7841
3d4d4302 7842 s = bfd_get_linker_section (abfd, ".dynamic");
b49e97c9 7843 if (s != NULL)
a253d456 7844 (void) bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
b49e97c9
TS
7845 }
7846
0e1862bb 7847 if (bfd_link_executable (info))
b49e97c9 7848 {
14a793b2
AM
7849 const char *name;
7850
7851 name = SGI_COMPAT (abfd) ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING";
7852 bh = NULL;
7853 if (!(_bfd_generic_link_add_one_symbol
9719ad41
RS
7854 (info, abfd, name, BSF_GLOBAL, bfd_abs_section_ptr, 0,
7855 NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 7856 return FALSE;
14a793b2
AM
7857
7858 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
7859 h->non_elf = 0;
7860 h->def_regular = 1;
b49e97c9
TS
7861 h->type = STT_SECTION;
7862
c152c796 7863 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 7864 return FALSE;
b49e97c9
TS
7865
7866 if (! mips_elf_hash_table (info)->use_rld_obj_head)
7867 {
7868 /* __rld_map is a four byte word located in the .data section
7869 and is filled in by the rtld to contain a pointer to
7870 the _r_debug structure. Its symbol value will be set in
7871 _bfd_mips_elf_finish_dynamic_symbol. */
3d4d4302 7872 s = bfd_get_linker_section (abfd, ".rld_map");
0abfb97a 7873 BFD_ASSERT (s != NULL);
14a793b2 7874
0abfb97a
L
7875 name = SGI_COMPAT (abfd) ? "__rld_map" : "__RLD_MAP";
7876 bh = NULL;
7877 if (!(_bfd_generic_link_add_one_symbol
7878 (info, abfd, name, BSF_GLOBAL, s, 0, NULL, FALSE,
7879 get_elf_backend_data (abfd)->collect, &bh)))
7880 return FALSE;
b49e97c9 7881
0abfb97a
L
7882 h = (struct elf_link_hash_entry *) bh;
7883 h->non_elf = 0;
7884 h->def_regular = 1;
7885 h->type = STT_OBJECT;
7886
7887 if (! bfd_elf_link_record_dynamic_symbol (info, h))
7888 return FALSE;
b4082c70 7889 mips_elf_hash_table (info)->rld_symbol = h;
b49e97c9
TS
7890 }
7891 }
7892
861fb55a 7893 /* Create the .plt, .rel(a).plt, .dynbss and .rel(a).bss sections.
c164a95d 7894 Also, on VxWorks, create the _PROCEDURE_LINKAGE_TABLE_ symbol. */
861fb55a
DJ
7895 if (!_bfd_elf_create_dynamic_sections (abfd, info))
7896 return FALSE;
7897
7898 /* Cache the sections created above. */
3d4d4302
AM
7899 htab->splt = bfd_get_linker_section (abfd, ".plt");
7900 htab->sdynbss = bfd_get_linker_section (abfd, ".dynbss");
0a44bf69
RS
7901 if (htab->is_vxworks)
7902 {
3d4d4302
AM
7903 htab->srelbss = bfd_get_linker_section (abfd, ".rela.bss");
7904 htab->srelplt = bfd_get_linker_section (abfd, ".rela.plt");
861fb55a
DJ
7905 }
7906 else
3d4d4302 7907 htab->srelplt = bfd_get_linker_section (abfd, ".rel.plt");
861fb55a 7908 if (!htab->sdynbss
0e1862bb 7909 || (htab->is_vxworks && !htab->srelbss && !bfd_link_pic (info))
861fb55a
DJ
7910 || !htab->srelplt
7911 || !htab->splt)
7912 abort ();
0a44bf69 7913
1bbce132
MR
7914 /* Do the usual VxWorks handling. */
7915 if (htab->is_vxworks
7916 && !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
7917 return FALSE;
0a44bf69 7918
b34976b6 7919 return TRUE;
b49e97c9
TS
7920}
7921\f
c224138d
RS
7922/* Return true if relocation REL against section SEC is a REL rather than
7923 RELA relocation. RELOCS is the first relocation in the section and
7924 ABFD is the bfd that contains SEC. */
7925
7926static bfd_boolean
7927mips_elf_rel_relocation_p (bfd *abfd, asection *sec,
7928 const Elf_Internal_Rela *relocs,
7929 const Elf_Internal_Rela *rel)
7930{
7931 Elf_Internal_Shdr *rel_hdr;
7932 const struct elf_backend_data *bed;
7933
d4730f92
BS
7934 /* To determine which flavor of relocation this is, we depend on the
7935 fact that the INPUT_SECTION's REL_HDR is read before RELA_HDR. */
7936 rel_hdr = elf_section_data (sec)->rel.hdr;
7937 if (rel_hdr == NULL)
7938 return FALSE;
c224138d 7939 bed = get_elf_backend_data (abfd);
d4730f92
BS
7940 return ((size_t) (rel - relocs)
7941 < NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel);
c224138d
RS
7942}
7943
7944/* Read the addend for REL relocation REL, which belongs to bfd ABFD.
7945 HOWTO is the relocation's howto and CONTENTS points to the contents
7946 of the section that REL is against. */
7947
7948static bfd_vma
7949mips_elf_read_rel_addend (bfd *abfd, const Elf_Internal_Rela *rel,
7950 reloc_howto_type *howto, bfd_byte *contents)
7951{
7952 bfd_byte *location;
7953 unsigned int r_type;
7954 bfd_vma addend;
17c6c9d9 7955 bfd_vma bytes;
c224138d
RS
7956
7957 r_type = ELF_R_TYPE (abfd, rel->r_info);
7958 location = contents + rel->r_offset;
7959
7960 /* Get the addend, which is stored in the input file. */
df58fc94 7961 _bfd_mips_elf_reloc_unshuffle (abfd, r_type, FALSE, location);
17c6c9d9 7962 bytes = mips_elf_obtain_contents (howto, rel, abfd, contents);
df58fc94 7963 _bfd_mips_elf_reloc_shuffle (abfd, r_type, FALSE, location);
c224138d 7964
17c6c9d9
MR
7965 addend = bytes & howto->src_mask;
7966
7967 /* Shift is 2, unusually, for microMIPS JALX. Adjust the addend
7968 accordingly. */
7969 if (r_type == R_MICROMIPS_26_S1 && (bytes >> 26) == 0x3c)
7970 addend <<= 1;
7971
7972 return addend;
c224138d
RS
7973}
7974
7975/* REL is a relocation in ABFD that needs a partnering LO16 relocation
7976 and *ADDEND is the addend for REL itself. Look for the LO16 relocation
7977 and update *ADDEND with the final addend. Return true on success
7978 or false if the LO16 could not be found. RELEND is the exclusive
7979 upper bound on the relocations for REL's section. */
7980
7981static bfd_boolean
7982mips_elf_add_lo16_rel_addend (bfd *abfd,
7983 const Elf_Internal_Rela *rel,
7984 const Elf_Internal_Rela *relend,
7985 bfd_byte *contents, bfd_vma *addend)
7986{
7987 unsigned int r_type, lo16_type;
7988 const Elf_Internal_Rela *lo16_relocation;
7989 reloc_howto_type *lo16_howto;
7990 bfd_vma l;
7991
7992 r_type = ELF_R_TYPE (abfd, rel->r_info);
738e5348 7993 if (mips16_reloc_p (r_type))
c224138d 7994 lo16_type = R_MIPS16_LO16;
df58fc94
RS
7995 else if (micromips_reloc_p (r_type))
7996 lo16_type = R_MICROMIPS_LO16;
7361da2c
AB
7997 else if (r_type == R_MIPS_PCHI16)
7998 lo16_type = R_MIPS_PCLO16;
c224138d
RS
7999 else
8000 lo16_type = R_MIPS_LO16;
8001
8002 /* The combined value is the sum of the HI16 addend, left-shifted by
8003 sixteen bits, and the LO16 addend, sign extended. (Usually, the
8004 code does a `lui' of the HI16 value, and then an `addiu' of the
8005 LO16 value.)
8006
8007 Scan ahead to find a matching LO16 relocation.
8008
8009 According to the MIPS ELF ABI, the R_MIPS_LO16 relocation must
8010 be immediately following. However, for the IRIX6 ABI, the next
8011 relocation may be a composed relocation consisting of several
8012 relocations for the same address. In that case, the R_MIPS_LO16
8013 relocation may occur as one of these. We permit a similar
8014 extension in general, as that is useful for GCC.
8015
8016 In some cases GCC dead code elimination removes the LO16 but keeps
8017 the corresponding HI16. This is strictly speaking a violation of
8018 the ABI but not immediately harmful. */
8019 lo16_relocation = mips_elf_next_relocation (abfd, lo16_type, rel, relend);
8020 if (lo16_relocation == NULL)
8021 return FALSE;
8022
8023 /* Obtain the addend kept there. */
8024 lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, lo16_type, FALSE);
8025 l = mips_elf_read_rel_addend (abfd, lo16_relocation, lo16_howto, contents);
8026
8027 l <<= lo16_howto->rightshift;
8028 l = _bfd_mips_elf_sign_extend (l, 16);
8029
8030 *addend <<= 16;
8031 *addend += l;
8032 return TRUE;
8033}
8034
8035/* Try to read the contents of section SEC in bfd ABFD. Return true and
8036 store the contents in *CONTENTS on success. Assume that *CONTENTS
8037 already holds the contents if it is nonull on entry. */
8038
8039static bfd_boolean
8040mips_elf_get_section_contents (bfd *abfd, asection *sec, bfd_byte **contents)
8041{
8042 if (*contents)
8043 return TRUE;
8044
8045 /* Get cached copy if it exists. */
8046 if (elf_section_data (sec)->this_hdr.contents != NULL)
8047 {
8048 *contents = elf_section_data (sec)->this_hdr.contents;
8049 return TRUE;
8050 }
8051
8052 return bfd_malloc_and_get_section (abfd, sec, contents);
8053}
8054
1bbce132
MR
8055/* Make a new PLT record to keep internal data. */
8056
8057static struct plt_entry *
8058mips_elf_make_plt_record (bfd *abfd)
8059{
8060 struct plt_entry *entry;
8061
8062 entry = bfd_zalloc (abfd, sizeof (*entry));
8063 if (entry == NULL)
8064 return NULL;
8065
8066 entry->stub_offset = MINUS_ONE;
8067 entry->mips_offset = MINUS_ONE;
8068 entry->comp_offset = MINUS_ONE;
8069 entry->gotplt_index = MINUS_ONE;
8070 return entry;
8071}
8072
b49e97c9 8073/* Look through the relocs for a section during the first phase, and
1bbce132
MR
8074 allocate space in the global offset table and record the need for
8075 standard MIPS and compressed procedure linkage table entries. */
b49e97c9 8076
b34976b6 8077bfd_boolean
9719ad41
RS
8078_bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
8079 asection *sec, const Elf_Internal_Rela *relocs)
b49e97c9
TS
8080{
8081 const char *name;
8082 bfd *dynobj;
8083 Elf_Internal_Shdr *symtab_hdr;
8084 struct elf_link_hash_entry **sym_hashes;
b49e97c9
TS
8085 size_t extsymoff;
8086 const Elf_Internal_Rela *rel;
8087 const Elf_Internal_Rela *rel_end;
b49e97c9 8088 asection *sreloc;
9c5bfbb7 8089 const struct elf_backend_data *bed;
0a44bf69 8090 struct mips_elf_link_hash_table *htab;
c224138d
RS
8091 bfd_byte *contents;
8092 bfd_vma addend;
8093 reloc_howto_type *howto;
b49e97c9 8094
0e1862bb 8095 if (bfd_link_relocatable (info))
b34976b6 8096 return TRUE;
b49e97c9 8097
0a44bf69 8098 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
8099 BFD_ASSERT (htab != NULL);
8100
b49e97c9
TS
8101 dynobj = elf_hash_table (info)->dynobj;
8102 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8103 sym_hashes = elf_sym_hashes (abfd);
8104 extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
8105
738e5348
RS
8106 bed = get_elf_backend_data (abfd);
8107 rel_end = relocs + sec->reloc_count * bed->s->int_rels_per_ext_rel;
8108
b49e97c9
TS
8109 /* Check for the mips16 stub sections. */
8110
8111 name = bfd_get_section_name (abfd, sec);
b9d58d71 8112 if (FN_STUB_P (name))
b49e97c9
TS
8113 {
8114 unsigned long r_symndx;
8115
8116 /* Look at the relocation information to figure out which symbol
8117 this is for. */
8118
cb4437b8 8119 r_symndx = mips16_stub_symndx (bed, sec, relocs, rel_end);
738e5348
RS
8120 if (r_symndx == 0)
8121 {
4eca0228 8122 _bfd_error_handler
738e5348
RS
8123 (_("%B: Warning: cannot determine the target function for"
8124 " stub section `%s'"),
8125 abfd, name);
8126 bfd_set_error (bfd_error_bad_value);
8127 return FALSE;
8128 }
b49e97c9
TS
8129
8130 if (r_symndx < extsymoff
8131 || sym_hashes[r_symndx - extsymoff] == NULL)
8132 {
8133 asection *o;
8134
8135 /* This stub is for a local symbol. This stub will only be
8136 needed if there is some relocation in this BFD, other
8137 than a 16 bit function call, which refers to this symbol. */
8138 for (o = abfd->sections; o != NULL; o = o->next)
8139 {
8140 Elf_Internal_Rela *sec_relocs;
8141 const Elf_Internal_Rela *r, *rend;
8142
8143 /* We can ignore stub sections when looking for relocs. */
8144 if ((o->flags & SEC_RELOC) == 0
8145 || o->reloc_count == 0
738e5348 8146 || section_allows_mips16_refs_p (o))
b49e97c9
TS
8147 continue;
8148
45d6a902 8149 sec_relocs
9719ad41 8150 = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
45d6a902 8151 info->keep_memory);
b49e97c9 8152 if (sec_relocs == NULL)
b34976b6 8153 return FALSE;
b49e97c9
TS
8154
8155 rend = sec_relocs + o->reloc_count;
8156 for (r = sec_relocs; r < rend; r++)
8157 if (ELF_R_SYM (abfd, r->r_info) == r_symndx
738e5348 8158 && !mips16_call_reloc_p (ELF_R_TYPE (abfd, r->r_info)))
b49e97c9
TS
8159 break;
8160
6cdc0ccc 8161 if (elf_section_data (o)->relocs != sec_relocs)
b49e97c9
TS
8162 free (sec_relocs);
8163
8164 if (r < rend)
8165 break;
8166 }
8167
8168 if (o == NULL)
8169 {
8170 /* There is no non-call reloc for this stub, so we do
8171 not need it. Since this function is called before
8172 the linker maps input sections to output sections, we
8173 can easily discard it by setting the SEC_EXCLUDE
8174 flag. */
8175 sec->flags |= SEC_EXCLUDE;
b34976b6 8176 return TRUE;
b49e97c9
TS
8177 }
8178
8179 /* Record this stub in an array of local symbol stubs for
8180 this BFD. */
698600e4 8181 if (mips_elf_tdata (abfd)->local_stubs == NULL)
b49e97c9
TS
8182 {
8183 unsigned long symcount;
8184 asection **n;
8185 bfd_size_type amt;
8186
8187 if (elf_bad_symtab (abfd))
8188 symcount = NUM_SHDR_ENTRIES (symtab_hdr);
8189 else
8190 symcount = symtab_hdr->sh_info;
8191 amt = symcount * sizeof (asection *);
9719ad41 8192 n = bfd_zalloc (abfd, amt);
b49e97c9 8193 if (n == NULL)
b34976b6 8194 return FALSE;
698600e4 8195 mips_elf_tdata (abfd)->local_stubs = n;
b49e97c9
TS
8196 }
8197
b9d58d71 8198 sec->flags |= SEC_KEEP;
698600e4 8199 mips_elf_tdata (abfd)->local_stubs[r_symndx] = sec;
b49e97c9
TS
8200
8201 /* We don't need to set mips16_stubs_seen in this case.
8202 That flag is used to see whether we need to look through
8203 the global symbol table for stubs. We don't need to set
8204 it here, because we just have a local stub. */
8205 }
8206 else
8207 {
8208 struct mips_elf_link_hash_entry *h;
8209
8210 h = ((struct mips_elf_link_hash_entry *)
8211 sym_hashes[r_symndx - extsymoff]);
8212
973a3492
L
8213 while (h->root.root.type == bfd_link_hash_indirect
8214 || h->root.root.type == bfd_link_hash_warning)
8215 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
8216
b49e97c9
TS
8217 /* H is the symbol this stub is for. */
8218
b9d58d71
TS
8219 /* If we already have an appropriate stub for this function, we
8220 don't need another one, so we can discard this one. Since
8221 this function is called before the linker maps input sections
8222 to output sections, we can easily discard it by setting the
8223 SEC_EXCLUDE flag. */
8224 if (h->fn_stub != NULL)
8225 {
8226 sec->flags |= SEC_EXCLUDE;
8227 return TRUE;
8228 }
8229
8230 sec->flags |= SEC_KEEP;
b49e97c9 8231 h->fn_stub = sec;
b34976b6 8232 mips_elf_hash_table (info)->mips16_stubs_seen = TRUE;
b49e97c9
TS
8233 }
8234 }
b9d58d71 8235 else if (CALL_STUB_P (name) || CALL_FP_STUB_P (name))
b49e97c9
TS
8236 {
8237 unsigned long r_symndx;
8238 struct mips_elf_link_hash_entry *h;
8239 asection **loc;
8240
8241 /* Look at the relocation information to figure out which symbol
8242 this is for. */
8243
cb4437b8 8244 r_symndx = mips16_stub_symndx (bed, sec, relocs, rel_end);
738e5348
RS
8245 if (r_symndx == 0)
8246 {
4eca0228 8247 _bfd_error_handler
738e5348
RS
8248 (_("%B: Warning: cannot determine the target function for"
8249 " stub section `%s'"),
8250 abfd, name);
8251 bfd_set_error (bfd_error_bad_value);
8252 return FALSE;
8253 }
b49e97c9
TS
8254
8255 if (r_symndx < extsymoff
8256 || sym_hashes[r_symndx - extsymoff] == NULL)
8257 {
b9d58d71 8258 asection *o;
b49e97c9 8259
b9d58d71
TS
8260 /* This stub is for a local symbol. This stub will only be
8261 needed if there is some relocation (R_MIPS16_26) in this BFD
8262 that refers to this symbol. */
8263 for (o = abfd->sections; o != NULL; o = o->next)
8264 {
8265 Elf_Internal_Rela *sec_relocs;
8266 const Elf_Internal_Rela *r, *rend;
8267
8268 /* We can ignore stub sections when looking for relocs. */
8269 if ((o->flags & SEC_RELOC) == 0
8270 || o->reloc_count == 0
738e5348 8271 || section_allows_mips16_refs_p (o))
b9d58d71
TS
8272 continue;
8273
8274 sec_relocs
8275 = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
8276 info->keep_memory);
8277 if (sec_relocs == NULL)
8278 return FALSE;
8279
8280 rend = sec_relocs + o->reloc_count;
8281 for (r = sec_relocs; r < rend; r++)
8282 if (ELF_R_SYM (abfd, r->r_info) == r_symndx
8283 && ELF_R_TYPE (abfd, r->r_info) == R_MIPS16_26)
8284 break;
8285
8286 if (elf_section_data (o)->relocs != sec_relocs)
8287 free (sec_relocs);
8288
8289 if (r < rend)
8290 break;
8291 }
8292
8293 if (o == NULL)
8294 {
8295 /* There is no non-call reloc for this stub, so we do
8296 not need it. Since this function is called before
8297 the linker maps input sections to output sections, we
8298 can easily discard it by setting the SEC_EXCLUDE
8299 flag. */
8300 sec->flags |= SEC_EXCLUDE;
8301 return TRUE;
8302 }
8303
8304 /* Record this stub in an array of local symbol call_stubs for
8305 this BFD. */
698600e4 8306 if (mips_elf_tdata (abfd)->local_call_stubs == NULL)
b9d58d71
TS
8307 {
8308 unsigned long symcount;
8309 asection **n;
8310 bfd_size_type amt;
8311
8312 if (elf_bad_symtab (abfd))
8313 symcount = NUM_SHDR_ENTRIES (symtab_hdr);
8314 else
8315 symcount = symtab_hdr->sh_info;
8316 amt = symcount * sizeof (asection *);
8317 n = bfd_zalloc (abfd, amt);
8318 if (n == NULL)
8319 return FALSE;
698600e4 8320 mips_elf_tdata (abfd)->local_call_stubs = n;
b9d58d71 8321 }
b49e97c9 8322
b9d58d71 8323 sec->flags |= SEC_KEEP;
698600e4 8324 mips_elf_tdata (abfd)->local_call_stubs[r_symndx] = sec;
b49e97c9 8325
b9d58d71
TS
8326 /* We don't need to set mips16_stubs_seen in this case.
8327 That flag is used to see whether we need to look through
8328 the global symbol table for stubs. We don't need to set
8329 it here, because we just have a local stub. */
8330 }
b49e97c9 8331 else
b49e97c9 8332 {
b9d58d71
TS
8333 h = ((struct mips_elf_link_hash_entry *)
8334 sym_hashes[r_symndx - extsymoff]);
68ffbac6 8335
b9d58d71 8336 /* H is the symbol this stub is for. */
68ffbac6 8337
b9d58d71
TS
8338 if (CALL_FP_STUB_P (name))
8339 loc = &h->call_fp_stub;
8340 else
8341 loc = &h->call_stub;
68ffbac6 8342
b9d58d71
TS
8343 /* If we already have an appropriate stub for this function, we
8344 don't need another one, so we can discard this one. Since
8345 this function is called before the linker maps input sections
8346 to output sections, we can easily discard it by setting the
8347 SEC_EXCLUDE flag. */
8348 if (*loc != NULL)
8349 {
8350 sec->flags |= SEC_EXCLUDE;
8351 return TRUE;
8352 }
b49e97c9 8353
b9d58d71
TS
8354 sec->flags |= SEC_KEEP;
8355 *loc = sec;
8356 mips_elf_hash_table (info)->mips16_stubs_seen = TRUE;
8357 }
b49e97c9
TS
8358 }
8359
b49e97c9 8360 sreloc = NULL;
c224138d 8361 contents = NULL;
b49e97c9
TS
8362 for (rel = relocs; rel < rel_end; ++rel)
8363 {
8364 unsigned long r_symndx;
8365 unsigned int r_type;
8366 struct elf_link_hash_entry *h;
861fb55a 8367 bfd_boolean can_make_dynamic_p;
c5d6fa44
RS
8368 bfd_boolean call_reloc_p;
8369 bfd_boolean constrain_symbol_p;
b49e97c9
TS
8370
8371 r_symndx = ELF_R_SYM (abfd, rel->r_info);
8372 r_type = ELF_R_TYPE (abfd, rel->r_info);
8373
8374 if (r_symndx < extsymoff)
8375 h = NULL;
8376 else if (r_symndx >= extsymoff + NUM_SHDR_ENTRIES (symtab_hdr))
8377 {
4eca0228 8378 _bfd_error_handler
d003868e
AM
8379 (_("%B: Malformed reloc detected for section %s"),
8380 abfd, name);
b49e97c9 8381 bfd_set_error (bfd_error_bad_value);
b34976b6 8382 return FALSE;
b49e97c9
TS
8383 }
8384 else
8385 {
8386 h = sym_hashes[r_symndx - extsymoff];
81fbe831
AM
8387 if (h != NULL)
8388 {
8389 while (h->root.type == bfd_link_hash_indirect
8390 || h->root.type == bfd_link_hash_warning)
8391 h = (struct elf_link_hash_entry *) h->root.u.i.link;
8392
8393 /* PR15323, ref flags aren't set for references in the
8394 same object. */
8395 h->root.non_ir_ref = 1;
8396 }
861fb55a 8397 }
b49e97c9 8398
861fb55a
DJ
8399 /* Set CAN_MAKE_DYNAMIC_P to true if we can convert this
8400 relocation into a dynamic one. */
8401 can_make_dynamic_p = FALSE;
c5d6fa44
RS
8402
8403 /* Set CALL_RELOC_P to true if the relocation is for a call,
8404 and if pointer equality therefore doesn't matter. */
8405 call_reloc_p = FALSE;
8406
8407 /* Set CONSTRAIN_SYMBOL_P if we need to take the relocation
8408 into account when deciding how to define the symbol.
8409 Relocations in nonallocatable sections such as .pdr and
8410 .debug* should have no effect. */
8411 constrain_symbol_p = ((sec->flags & SEC_ALLOC) != 0);
8412
861fb55a
DJ
8413 switch (r_type)
8414 {
861fb55a
DJ
8415 case R_MIPS_CALL16:
8416 case R_MIPS_CALL_HI16:
8417 case R_MIPS_CALL_LO16:
c5d6fa44
RS
8418 case R_MIPS16_CALL16:
8419 case R_MICROMIPS_CALL16:
8420 case R_MICROMIPS_CALL_HI16:
8421 case R_MICROMIPS_CALL_LO16:
8422 call_reloc_p = TRUE;
8423 /* Fall through. */
8424
8425 case R_MIPS_GOT16:
861fb55a
DJ
8426 case R_MIPS_GOT_HI16:
8427 case R_MIPS_GOT_LO16:
8428 case R_MIPS_GOT_PAGE:
8429 case R_MIPS_GOT_OFST:
8430 case R_MIPS_GOT_DISP:
8431 case R_MIPS_TLS_GOTTPREL:
8432 case R_MIPS_TLS_GD:
8433 case R_MIPS_TLS_LDM:
d0f13682 8434 case R_MIPS16_GOT16:
d0f13682
CLT
8435 case R_MIPS16_TLS_GOTTPREL:
8436 case R_MIPS16_TLS_GD:
8437 case R_MIPS16_TLS_LDM:
df58fc94 8438 case R_MICROMIPS_GOT16:
df58fc94
RS
8439 case R_MICROMIPS_GOT_HI16:
8440 case R_MICROMIPS_GOT_LO16:
8441 case R_MICROMIPS_GOT_PAGE:
8442 case R_MICROMIPS_GOT_OFST:
8443 case R_MICROMIPS_GOT_DISP:
8444 case R_MICROMIPS_TLS_GOTTPREL:
8445 case R_MICROMIPS_TLS_GD:
8446 case R_MICROMIPS_TLS_LDM:
861fb55a
DJ
8447 if (dynobj == NULL)
8448 elf_hash_table (info)->dynobj = dynobj = abfd;
8449 if (!mips_elf_create_got_section (dynobj, info))
8450 return FALSE;
0e1862bb 8451 if (htab->is_vxworks && !bfd_link_pic (info))
b49e97c9 8452 {
4eca0228 8453 _bfd_error_handler
861fb55a
DJ
8454 (_("%B: GOT reloc at 0x%lx not expected in executables"),
8455 abfd, (unsigned long) rel->r_offset);
8456 bfd_set_error (bfd_error_bad_value);
8457 return FALSE;
b49e97c9 8458 }
c5d6fa44 8459 can_make_dynamic_p = TRUE;
861fb55a 8460 break;
b49e97c9 8461
c5d6fa44 8462 case R_MIPS_NONE:
99da6b5f 8463 case R_MIPS_JALR:
df58fc94 8464 case R_MICROMIPS_JALR:
c5d6fa44
RS
8465 /* These relocations have empty fields and are purely there to
8466 provide link information. The symbol value doesn't matter. */
8467 constrain_symbol_p = FALSE;
8468 break;
8469
8470 case R_MIPS_GPREL16:
8471 case R_MIPS_GPREL32:
8472 case R_MIPS16_GPREL:
8473 case R_MICROMIPS_GPREL16:
8474 /* GP-relative relocations always resolve to a definition in a
8475 regular input file, ignoring the one-definition rule. This is
8476 important for the GP setup sequence in NewABI code, which
8477 always resolves to a local function even if other relocations
8478 against the symbol wouldn't. */
8479 constrain_symbol_p = FALSE;
99da6b5f
AN
8480 break;
8481
861fb55a
DJ
8482 case R_MIPS_32:
8483 case R_MIPS_REL32:
8484 case R_MIPS_64:
8485 /* In VxWorks executables, references to external symbols
8486 must be handled using copy relocs or PLT entries; it is not
8487 possible to convert this relocation into a dynamic one.
8488
8489 For executables that use PLTs and copy-relocs, we have a
8490 choice between converting the relocation into a dynamic
8491 one or using copy relocations or PLT entries. It is
8492 usually better to do the former, unless the relocation is
8493 against a read-only section. */
0e1862bb 8494 if ((bfd_link_pic (info)
861fb55a
DJ
8495 || (h != NULL
8496 && !htab->is_vxworks
8497 && strcmp (h->root.root.string, "__gnu_local_gp") != 0
8498 && !(!info->nocopyreloc
8499 && !PIC_OBJECT_P (abfd)
8500 && MIPS_ELF_READONLY_SECTION (sec))))
8501 && (sec->flags & SEC_ALLOC) != 0)
b49e97c9 8502 {
861fb55a 8503 can_make_dynamic_p = TRUE;
b49e97c9
TS
8504 if (dynobj == NULL)
8505 elf_hash_table (info)->dynobj = dynobj = abfd;
861fb55a 8506 }
c5d6fa44 8507 break;
b49e97c9 8508
861fb55a
DJ
8509 case R_MIPS_26:
8510 case R_MIPS_PC16:
7361da2c
AB
8511 case R_MIPS_PC21_S2:
8512 case R_MIPS_PC26_S2:
861fb55a 8513 case R_MIPS16_26:
c9775dde 8514 case R_MIPS16_PC16_S1:
df58fc94
RS
8515 case R_MICROMIPS_26_S1:
8516 case R_MICROMIPS_PC7_S1:
8517 case R_MICROMIPS_PC10_S1:
8518 case R_MICROMIPS_PC16_S1:
8519 case R_MICROMIPS_PC23_S2:
c5d6fa44 8520 call_reloc_p = TRUE;
861fb55a 8521 break;
b49e97c9
TS
8522 }
8523
0a44bf69
RS
8524 if (h)
8525 {
c5d6fa44
RS
8526 if (constrain_symbol_p)
8527 {
8528 if (!can_make_dynamic_p)
8529 ((struct mips_elf_link_hash_entry *) h)->has_static_relocs = 1;
8530
8531 if (!call_reloc_p)
8532 h->pointer_equality_needed = 1;
8533
8534 /* We must not create a stub for a symbol that has
8535 relocations related to taking the function's address.
8536 This doesn't apply to VxWorks, where CALL relocs refer
8537 to a .got.plt entry instead of a normal .got entry. */
8538 if (!htab->is_vxworks && (!can_make_dynamic_p || !call_reloc_p))
8539 ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = TRUE;
8540 }
8541
0a44bf69
RS
8542 /* Relocations against the special VxWorks __GOTT_BASE__ and
8543 __GOTT_INDEX__ symbols must be left to the loader. Allocate
8544 room for them in .rela.dyn. */
8545 if (is_gott_symbol (info, h))
8546 {
8547 if (sreloc == NULL)
8548 {
8549 sreloc = mips_elf_rel_dyn_section (info, TRUE);
8550 if (sreloc == NULL)
8551 return FALSE;
8552 }
8553 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
9e3313ae
RS
8554 if (MIPS_ELF_READONLY_SECTION (sec))
8555 /* We tell the dynamic linker that there are
8556 relocations against the text segment. */
8557 info->flags |= DF_TEXTREL;
0a44bf69
RS
8558 }
8559 }
df58fc94
RS
8560 else if (call_lo16_reloc_p (r_type)
8561 || got_lo16_reloc_p (r_type)
8562 || got_disp_reloc_p (r_type)
738e5348 8563 || (got16_reloc_p (r_type) && htab->is_vxworks))
b49e97c9
TS
8564 {
8565 /* We may need a local GOT entry for this relocation. We
8566 don't count R_MIPS_GOT_PAGE because we can estimate the
8567 maximum number of pages needed by looking at the size of
738e5348
RS
8568 the segment. Similar comments apply to R_MIPS*_GOT16 and
8569 R_MIPS*_CALL16, except on VxWorks, where GOT relocations
0a44bf69 8570 always evaluate to "G". We don't count R_MIPS_GOT_HI16, or
b49e97c9 8571 R_MIPS_CALL_HI16 because these are always followed by an
b15e6682 8572 R_MIPS_GOT_LO16 or R_MIPS_CALL_LO16. */
a8028dd0 8573 if (!mips_elf_record_local_got_symbol (abfd, r_symndx,
e641e783 8574 rel->r_addend, info, r_type))
f4416af6 8575 return FALSE;
b49e97c9
TS
8576 }
8577
8f0c309a
CLT
8578 if (h != NULL
8579 && mips_elf_relocation_needs_la25_stub (abfd, r_type,
8580 ELF_ST_IS_MIPS16 (h->other)))
861fb55a
DJ
8581 ((struct mips_elf_link_hash_entry *) h)->has_nonpic_branches = TRUE;
8582
b49e97c9
TS
8583 switch (r_type)
8584 {
8585 case R_MIPS_CALL16:
738e5348 8586 case R_MIPS16_CALL16:
df58fc94 8587 case R_MICROMIPS_CALL16:
b49e97c9
TS
8588 if (h == NULL)
8589 {
4eca0228 8590 _bfd_error_handler
d003868e
AM
8591 (_("%B: CALL16 reloc at 0x%lx not against global symbol"),
8592 abfd, (unsigned long) rel->r_offset);
b49e97c9 8593 bfd_set_error (bfd_error_bad_value);
b34976b6 8594 return FALSE;
b49e97c9
TS
8595 }
8596 /* Fall through. */
8597
8598 case R_MIPS_CALL_HI16:
8599 case R_MIPS_CALL_LO16:
df58fc94
RS
8600 case R_MICROMIPS_CALL_HI16:
8601 case R_MICROMIPS_CALL_LO16:
b49e97c9
TS
8602 if (h != NULL)
8603 {
6ccf4795
RS
8604 /* Make sure there is room in the regular GOT to hold the
8605 function's address. We may eliminate it in favour of
8606 a .got.plt entry later; see mips_elf_count_got_symbols. */
e641e783
RS
8607 if (!mips_elf_record_global_got_symbol (h, abfd, info, TRUE,
8608 r_type))
b34976b6 8609 return FALSE;
b49e97c9
TS
8610
8611 /* We need a stub, not a plt entry for the undefined
8612 function. But we record it as if it needs plt. See
c152c796 8613 _bfd_elf_adjust_dynamic_symbol. */
f5385ebf 8614 h->needs_plt = 1;
b49e97c9
TS
8615 h->type = STT_FUNC;
8616 }
8617 break;
8618
0fdc1bf1 8619 case R_MIPS_GOT_PAGE:
df58fc94 8620 case R_MICROMIPS_GOT_PAGE:
738e5348 8621 case R_MIPS16_GOT16:
b49e97c9
TS
8622 case R_MIPS_GOT16:
8623 case R_MIPS_GOT_HI16:
8624 case R_MIPS_GOT_LO16:
df58fc94
RS
8625 case R_MICROMIPS_GOT16:
8626 case R_MICROMIPS_GOT_HI16:
8627 case R_MICROMIPS_GOT_LO16:
8628 if (!h || got_page_reloc_p (r_type))
c224138d 8629 {
3a3b6725
DJ
8630 /* This relocation needs (or may need, if h != NULL) a
8631 page entry in the GOT. For R_MIPS_GOT_PAGE we do not
8632 know for sure until we know whether the symbol is
8633 preemptible. */
c224138d
RS
8634 if (mips_elf_rel_relocation_p (abfd, sec, relocs, rel))
8635 {
8636 if (!mips_elf_get_section_contents (abfd, sec, &contents))
8637 return FALSE;
8638 howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, FALSE);
8639 addend = mips_elf_read_rel_addend (abfd, rel,
8640 howto, contents);
9684f078 8641 if (got16_reloc_p (r_type))
c224138d
RS
8642 mips_elf_add_lo16_rel_addend (abfd, rel, rel_end,
8643 contents, &addend);
8644 else
8645 addend <<= howto->rightshift;
8646 }
8647 else
8648 addend = rel->r_addend;
13db6b44
RS
8649 if (!mips_elf_record_got_page_ref (info, abfd, r_symndx,
8650 h, addend))
c224138d 8651 return FALSE;
13db6b44
RS
8652
8653 if (h)
8654 {
8655 struct mips_elf_link_hash_entry *hmips =
8656 (struct mips_elf_link_hash_entry *) h;
8657
8658 /* This symbol is definitely not overridable. */
8659 if (hmips->root.def_regular
0e1862bb 8660 && ! (bfd_link_pic (info) && ! info->symbolic
13db6b44
RS
8661 && ! hmips->root.forced_local))
8662 h = NULL;
8663 }
c224138d 8664 }
13db6b44
RS
8665 /* If this is a global, overridable symbol, GOT_PAGE will
8666 decay to GOT_DISP, so we'll need a GOT entry for it. */
c224138d
RS
8667 /* Fall through. */
8668
b49e97c9 8669 case R_MIPS_GOT_DISP:
df58fc94 8670 case R_MICROMIPS_GOT_DISP:
6ccf4795 8671 if (h && !mips_elf_record_global_got_symbol (h, abfd, info,
e641e783 8672 FALSE, r_type))
b34976b6 8673 return FALSE;
b49e97c9
TS
8674 break;
8675
0f20cc35 8676 case R_MIPS_TLS_GOTTPREL:
d0f13682 8677 case R_MIPS16_TLS_GOTTPREL:
df58fc94 8678 case R_MICROMIPS_TLS_GOTTPREL:
0e1862bb 8679 if (bfd_link_pic (info))
0f20cc35
DJ
8680 info->flags |= DF_STATIC_TLS;
8681 /* Fall through */
8682
8683 case R_MIPS_TLS_LDM:
d0f13682 8684 case R_MIPS16_TLS_LDM:
df58fc94
RS
8685 case R_MICROMIPS_TLS_LDM:
8686 if (tls_ldm_reloc_p (r_type))
0f20cc35 8687 {
cf35638d 8688 r_symndx = STN_UNDEF;
0f20cc35
DJ
8689 h = NULL;
8690 }
8691 /* Fall through */
8692
8693 case R_MIPS_TLS_GD:
d0f13682 8694 case R_MIPS16_TLS_GD:
df58fc94 8695 case R_MICROMIPS_TLS_GD:
0f20cc35
DJ
8696 /* This symbol requires a global offset table entry, or two
8697 for TLS GD relocations. */
e641e783
RS
8698 if (h != NULL)
8699 {
8700 if (!mips_elf_record_global_got_symbol (h, abfd, info,
8701 FALSE, r_type))
8702 return FALSE;
8703 }
8704 else
8705 {
8706 if (!mips_elf_record_local_got_symbol (abfd, r_symndx,
8707 rel->r_addend,
8708 info, r_type))
8709 return FALSE;
8710 }
0f20cc35
DJ
8711 break;
8712
b49e97c9
TS
8713 case R_MIPS_32:
8714 case R_MIPS_REL32:
8715 case R_MIPS_64:
0a44bf69
RS
8716 /* In VxWorks executables, references to external symbols
8717 are handled using copy relocs or PLT stubs, so there's
8718 no need to add a .rela.dyn entry for this relocation. */
861fb55a 8719 if (can_make_dynamic_p)
b49e97c9
TS
8720 {
8721 if (sreloc == NULL)
8722 {
0a44bf69 8723 sreloc = mips_elf_rel_dyn_section (info, TRUE);
b49e97c9 8724 if (sreloc == NULL)
f4416af6 8725 return FALSE;
b49e97c9 8726 }
0e1862bb 8727 if (bfd_link_pic (info) && h == NULL)
82f0cfbd
EC
8728 {
8729 /* When creating a shared object, we must copy these
8730 reloc types into the output file as R_MIPS_REL32
0a44bf69
RS
8731 relocs. Make room for this reloc in .rel(a).dyn. */
8732 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
943284cc 8733 if (MIPS_ELF_READONLY_SECTION (sec))
82f0cfbd
EC
8734 /* We tell the dynamic linker that there are
8735 relocations against the text segment. */
8736 info->flags |= DF_TEXTREL;
8737 }
b49e97c9
TS
8738 else
8739 {
8740 struct mips_elf_link_hash_entry *hmips;
82f0cfbd 8741
9a59ad6b
DJ
8742 /* For a shared object, we must copy this relocation
8743 unless the symbol turns out to be undefined and
8744 weak with non-default visibility, in which case
8745 it will be left as zero.
8746
8747 We could elide R_MIPS_REL32 for locally binding symbols
8748 in shared libraries, but do not yet do so.
8749
8750 For an executable, we only need to copy this
8751 reloc if the symbol is defined in a dynamic
8752 object. */
b49e97c9
TS
8753 hmips = (struct mips_elf_link_hash_entry *) h;
8754 ++hmips->possibly_dynamic_relocs;
943284cc 8755 if (MIPS_ELF_READONLY_SECTION (sec))
82f0cfbd
EC
8756 /* We need it to tell the dynamic linker if there
8757 are relocations against the text segment. */
8758 hmips->readonly_reloc = TRUE;
b49e97c9 8759 }
b49e97c9
TS
8760 }
8761
8762 if (SGI_COMPAT (abfd))
8763 mips_elf_hash_table (info)->compact_rel_size +=
8764 sizeof (Elf32_External_crinfo);
8765 break;
8766
8767 case R_MIPS_26:
8768 case R_MIPS_GPREL16:
8769 case R_MIPS_LITERAL:
8770 case R_MIPS_GPREL32:
df58fc94
RS
8771 case R_MICROMIPS_26_S1:
8772 case R_MICROMIPS_GPREL16:
8773 case R_MICROMIPS_LITERAL:
8774 case R_MICROMIPS_GPREL7_S2:
b49e97c9
TS
8775 if (SGI_COMPAT (abfd))
8776 mips_elf_hash_table (info)->compact_rel_size +=
8777 sizeof (Elf32_External_crinfo);
8778 break;
8779
8780 /* This relocation describes the C++ object vtable hierarchy.
8781 Reconstruct it for later use during GC. */
8782 case R_MIPS_GNU_VTINHERIT:
c152c796 8783 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 8784 return FALSE;
b49e97c9
TS
8785 break;
8786
8787 /* This relocation describes which C++ vtable entries are actually
8788 used. Record for later use during GC. */
8789 case R_MIPS_GNU_VTENTRY:
d17e0c6e
JB
8790 BFD_ASSERT (h != NULL);
8791 if (h != NULL
8792 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
b34976b6 8793 return FALSE;
b49e97c9
TS
8794 break;
8795
8796 default:
8797 break;
8798 }
8799
1bbce132
MR
8800 /* Record the need for a PLT entry. At this point we don't know
8801 yet if we are going to create a PLT in the first place, but
8802 we only record whether the relocation requires a standard MIPS
8803 or a compressed code entry anyway. If we don't make a PLT after
8804 all, then we'll just ignore these arrangements. Likewise if
8805 a PLT entry is not created because the symbol is satisfied
8806 locally. */
8807 if (h != NULL
54806ffa
MR
8808 && (branch_reloc_p (r_type)
8809 || mips16_branch_reloc_p (r_type)
8810 || micromips_branch_reloc_p (r_type))
1bbce132
MR
8811 && !SYMBOL_CALLS_LOCAL (info, h))
8812 {
8813 if (h->plt.plist == NULL)
8814 h->plt.plist = mips_elf_make_plt_record (abfd);
8815 if (h->plt.plist == NULL)
8816 return FALSE;
8817
54806ffa 8818 if (branch_reloc_p (r_type))
1bbce132
MR
8819 h->plt.plist->need_mips = TRUE;
8820 else
8821 h->plt.plist->need_comp = TRUE;
8822 }
8823
738e5348
RS
8824 /* See if this reloc would need to refer to a MIPS16 hard-float stub,
8825 if there is one. We only need to handle global symbols here;
8826 we decide whether to keep or delete stubs for local symbols
8827 when processing the stub's relocations. */
b49e97c9 8828 if (h != NULL
738e5348
RS
8829 && !mips16_call_reloc_p (r_type)
8830 && !section_allows_mips16_refs_p (sec))
b49e97c9
TS
8831 {
8832 struct mips_elf_link_hash_entry *mh;
8833
8834 mh = (struct mips_elf_link_hash_entry *) h;
b34976b6 8835 mh->need_fn_stub = TRUE;
b49e97c9 8836 }
861fb55a
DJ
8837
8838 /* Refuse some position-dependent relocations when creating a
8839 shared library. Do not refuse R_MIPS_32 / R_MIPS_64; they're
8840 not PIC, but we can create dynamic relocations and the result
8841 will be fine. Also do not refuse R_MIPS_LO16, which can be
8842 combined with R_MIPS_GOT16. */
0e1862bb 8843 if (bfd_link_pic (info))
861fb55a
DJ
8844 {
8845 switch (r_type)
8846 {
8847 case R_MIPS16_HI16:
8848 case R_MIPS_HI16:
8849 case R_MIPS_HIGHER:
8850 case R_MIPS_HIGHEST:
df58fc94
RS
8851 case R_MICROMIPS_HI16:
8852 case R_MICROMIPS_HIGHER:
8853 case R_MICROMIPS_HIGHEST:
861fb55a
DJ
8854 /* Don't refuse a high part relocation if it's against
8855 no symbol (e.g. part of a compound relocation). */
cf35638d 8856 if (r_symndx == STN_UNDEF)
861fb55a
DJ
8857 break;
8858
8859 /* R_MIPS_HI16 against _gp_disp is used for $gp setup,
8860 and has a special meaning. */
8861 if (!NEWABI_P (abfd) && h != NULL
8862 && strcmp (h->root.root.string, "_gp_disp") == 0)
8863 break;
8864
0fc1eb3c
RS
8865 /* Likewise __GOTT_BASE__ and __GOTT_INDEX__ on VxWorks. */
8866 if (is_gott_symbol (info, h))
8867 break;
8868
861fb55a
DJ
8869 /* FALLTHROUGH */
8870
8871 case R_MIPS16_26:
8872 case R_MIPS_26:
df58fc94 8873 case R_MICROMIPS_26_S1:
861fb55a 8874 howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, FALSE);
4eca0228 8875 _bfd_error_handler
861fb55a
DJ
8876 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
8877 abfd, howto->name,
8878 (h) ? h->root.root.string : "a local symbol");
8879 bfd_set_error (bfd_error_bad_value);
8880 return FALSE;
8881 default:
8882 break;
8883 }
8884 }
b49e97c9
TS
8885 }
8886
b34976b6 8887 return TRUE;
b49e97c9
TS
8888}
8889\f
d0647110 8890bfd_boolean
9719ad41
RS
8891_bfd_mips_relax_section (bfd *abfd, asection *sec,
8892 struct bfd_link_info *link_info,
8893 bfd_boolean *again)
d0647110
AO
8894{
8895 Elf_Internal_Rela *internal_relocs;
8896 Elf_Internal_Rela *irel, *irelend;
8897 Elf_Internal_Shdr *symtab_hdr;
8898 bfd_byte *contents = NULL;
d0647110
AO
8899 size_t extsymoff;
8900 bfd_boolean changed_contents = FALSE;
8901 bfd_vma sec_start = sec->output_section->vma + sec->output_offset;
8902 Elf_Internal_Sym *isymbuf = NULL;
8903
8904 /* We are not currently changing any sizes, so only one pass. */
8905 *again = FALSE;
8906
0e1862bb 8907 if (bfd_link_relocatable (link_info))
d0647110
AO
8908 return TRUE;
8909
9719ad41 8910 internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
45d6a902 8911 link_info->keep_memory);
d0647110
AO
8912 if (internal_relocs == NULL)
8913 return TRUE;
8914
8915 irelend = internal_relocs + sec->reloc_count
8916 * get_elf_backend_data (abfd)->s->int_rels_per_ext_rel;
8917 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8918 extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
8919
8920 for (irel = internal_relocs; irel < irelend; irel++)
8921 {
8922 bfd_vma symval;
8923 bfd_signed_vma sym_offset;
8924 unsigned int r_type;
8925 unsigned long r_symndx;
8926 asection *sym_sec;
8927 unsigned long instruction;
8928
8929 /* Turn jalr into bgezal, and jr into beq, if they're marked
8930 with a JALR relocation, that indicate where they jump to.
8931 This saves some pipeline bubbles. */
8932 r_type = ELF_R_TYPE (abfd, irel->r_info);
8933 if (r_type != R_MIPS_JALR)
8934 continue;
8935
8936 r_symndx = ELF_R_SYM (abfd, irel->r_info);
8937 /* Compute the address of the jump target. */
8938 if (r_symndx >= extsymoff)
8939 {
8940 struct mips_elf_link_hash_entry *h
8941 = ((struct mips_elf_link_hash_entry *)
8942 elf_sym_hashes (abfd) [r_symndx - extsymoff]);
8943
8944 while (h->root.root.type == bfd_link_hash_indirect
8945 || h->root.root.type == bfd_link_hash_warning)
8946 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
143d77c5 8947
d0647110
AO
8948 /* If a symbol is undefined, or if it may be overridden,
8949 skip it. */
8950 if (! ((h->root.root.type == bfd_link_hash_defined
8951 || h->root.root.type == bfd_link_hash_defweak)
8952 && h->root.root.u.def.section)
0e1862bb 8953 || (bfd_link_pic (link_info) && ! link_info->symbolic
f5385ebf 8954 && !h->root.forced_local))
d0647110
AO
8955 continue;
8956
8957 sym_sec = h->root.root.u.def.section;
8958 if (sym_sec->output_section)
8959 symval = (h->root.root.u.def.value
8960 + sym_sec->output_section->vma
8961 + sym_sec->output_offset);
8962 else
8963 symval = h->root.root.u.def.value;
8964 }
8965 else
8966 {
8967 Elf_Internal_Sym *isym;
8968
8969 /* Read this BFD's symbols if we haven't done so already. */
8970 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
8971 {
8972 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
8973 if (isymbuf == NULL)
8974 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
8975 symtab_hdr->sh_info, 0,
8976 NULL, NULL, NULL);
8977 if (isymbuf == NULL)
8978 goto relax_return;
8979 }
8980
8981 isym = isymbuf + r_symndx;
8982 if (isym->st_shndx == SHN_UNDEF)
8983 continue;
8984 else if (isym->st_shndx == SHN_ABS)
8985 sym_sec = bfd_abs_section_ptr;
8986 else if (isym->st_shndx == SHN_COMMON)
8987 sym_sec = bfd_com_section_ptr;
8988 else
8989 sym_sec
8990 = bfd_section_from_elf_index (abfd, isym->st_shndx);
8991 symval = isym->st_value
8992 + sym_sec->output_section->vma
8993 + sym_sec->output_offset;
8994 }
8995
8996 /* Compute branch offset, from delay slot of the jump to the
8997 branch target. */
8998 sym_offset = (symval + irel->r_addend)
8999 - (sec_start + irel->r_offset + 4);
9000
9001 /* Branch offset must be properly aligned. */
9002 if ((sym_offset & 3) != 0)
9003 continue;
9004
9005 sym_offset >>= 2;
9006
9007 /* Check that it's in range. */
9008 if (sym_offset < -0x8000 || sym_offset >= 0x8000)
9009 continue;
143d77c5 9010
d0647110 9011 /* Get the section contents if we haven't done so already. */
c224138d
RS
9012 if (!mips_elf_get_section_contents (abfd, sec, &contents))
9013 goto relax_return;
d0647110
AO
9014
9015 instruction = bfd_get_32 (abfd, contents + irel->r_offset);
9016
9017 /* If it was jalr <reg>, turn it into bgezal $zero, <target>. */
9018 if ((instruction & 0xfc1fffff) == 0x0000f809)
9019 instruction = 0x04110000;
9020 /* If it was jr <reg>, turn it into b <target>. */
9021 else if ((instruction & 0xfc1fffff) == 0x00000008)
9022 instruction = 0x10000000;
9023 else
9024 continue;
9025
9026 instruction |= (sym_offset & 0xffff);
9027 bfd_put_32 (abfd, instruction, contents + irel->r_offset);
9028 changed_contents = TRUE;
9029 }
9030
9031 if (contents != NULL
9032 && elf_section_data (sec)->this_hdr.contents != contents)
9033 {
9034 if (!changed_contents && !link_info->keep_memory)
9035 free (contents);
9036 else
9037 {
9038 /* Cache the section contents for elf_link_input_bfd. */
9039 elf_section_data (sec)->this_hdr.contents = contents;
9040 }
9041 }
9042 return TRUE;
9043
143d77c5 9044 relax_return:
eea6121a
AM
9045 if (contents != NULL
9046 && elf_section_data (sec)->this_hdr.contents != contents)
9047 free (contents);
d0647110
AO
9048 return FALSE;
9049}
9050\f
9a59ad6b
DJ
9051/* Allocate space for global sym dynamic relocs. */
9052
9053static bfd_boolean
9054allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
9055{
9056 struct bfd_link_info *info = inf;
9057 bfd *dynobj;
9058 struct mips_elf_link_hash_entry *hmips;
9059 struct mips_elf_link_hash_table *htab;
9060
9061 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9062 BFD_ASSERT (htab != NULL);
9063
9a59ad6b
DJ
9064 dynobj = elf_hash_table (info)->dynobj;
9065 hmips = (struct mips_elf_link_hash_entry *) h;
9066
9067 /* VxWorks executables are handled elsewhere; we only need to
9068 allocate relocations in shared objects. */
0e1862bb 9069 if (htab->is_vxworks && !bfd_link_pic (info))
9a59ad6b
DJ
9070 return TRUE;
9071
7686d77d
AM
9072 /* Ignore indirect symbols. All relocations against such symbols
9073 will be redirected to the target symbol. */
9074 if (h->root.type == bfd_link_hash_indirect)
63897e2c
RS
9075 return TRUE;
9076
9a59ad6b
DJ
9077 /* If this symbol is defined in a dynamic object, or we are creating
9078 a shared library, we will need to copy any R_MIPS_32 or
9079 R_MIPS_REL32 relocs against it into the output file. */
0e1862bb 9080 if (! bfd_link_relocatable (info)
9a59ad6b
DJ
9081 && hmips->possibly_dynamic_relocs != 0
9082 && (h->root.type == bfd_link_hash_defweak
625ef6dc 9083 || (!h->def_regular && !ELF_COMMON_DEF_P (h))
0e1862bb 9084 || bfd_link_pic (info)))
9a59ad6b
DJ
9085 {
9086 bfd_boolean do_copy = TRUE;
9087
9088 if (h->root.type == bfd_link_hash_undefweak)
9089 {
9090 /* Do not copy relocations for undefined weak symbols with
9091 non-default visibility. */
9092 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9093 do_copy = FALSE;
9094
9095 /* Make sure undefined weak symbols are output as a dynamic
9096 symbol in PIEs. */
9097 else if (h->dynindx == -1 && !h->forced_local)
9098 {
9099 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9100 return FALSE;
9101 }
9102 }
9103
9104 if (do_copy)
9105 {
aff469fa 9106 /* Even though we don't directly need a GOT entry for this symbol,
f7ff1106
RS
9107 the SVR4 psABI requires it to have a dynamic symbol table
9108 index greater that DT_MIPS_GOTSYM if there are dynamic
9109 relocations against it.
9110
9111 VxWorks does not enforce the same mapping between the GOT
9112 and the symbol table, so the same requirement does not
9113 apply there. */
6ccf4795
RS
9114 if (!htab->is_vxworks)
9115 {
9116 if (hmips->global_got_area > GGA_RELOC_ONLY)
9117 hmips->global_got_area = GGA_RELOC_ONLY;
9118 hmips->got_only_for_calls = FALSE;
9119 }
aff469fa 9120
9a59ad6b
DJ
9121 mips_elf_allocate_dynamic_relocations
9122 (dynobj, info, hmips->possibly_dynamic_relocs);
9123 if (hmips->readonly_reloc)
9124 /* We tell the dynamic linker that there are relocations
9125 against the text segment. */
9126 info->flags |= DF_TEXTREL;
9127 }
9128 }
9129
9130 return TRUE;
9131}
9132
b49e97c9
TS
9133/* Adjust a symbol defined by a dynamic object and referenced by a
9134 regular object. The current definition is in some section of the
9135 dynamic object, but we're not including those sections. We have to
9136 change the definition to something the rest of the link can
9137 understand. */
9138
b34976b6 9139bfd_boolean
9719ad41
RS
9140_bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
9141 struct elf_link_hash_entry *h)
b49e97c9
TS
9142{
9143 bfd *dynobj;
9144 struct mips_elf_link_hash_entry *hmips;
5108fc1b 9145 struct mips_elf_link_hash_table *htab;
b49e97c9 9146
5108fc1b 9147 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9148 BFD_ASSERT (htab != NULL);
9149
b49e97c9 9150 dynobj = elf_hash_table (info)->dynobj;
861fb55a 9151 hmips = (struct mips_elf_link_hash_entry *) h;
b49e97c9
TS
9152
9153 /* Make sure we know what is going on here. */
9154 BFD_ASSERT (dynobj != NULL
f5385ebf 9155 && (h->needs_plt
f6e332e6 9156 || h->u.weakdef != NULL
f5385ebf
AM
9157 || (h->def_dynamic
9158 && h->ref_regular
9159 && !h->def_regular)));
b49e97c9 9160
b49e97c9 9161 hmips = (struct mips_elf_link_hash_entry *) h;
b49e97c9 9162
861fb55a
DJ
9163 /* If there are call relocations against an externally-defined symbol,
9164 see whether we can create a MIPS lazy-binding stub for it. We can
9165 only do this if all references to the function are through call
9166 relocations, and in that case, the traditional lazy-binding stubs
9167 are much more efficient than PLT entries.
9168
9169 Traditional stubs are only available on SVR4 psABI-based systems;
9170 VxWorks always uses PLTs instead. */
9171 if (!htab->is_vxworks && h->needs_plt && !hmips->no_fn_stub)
b49e97c9
TS
9172 {
9173 if (! elf_hash_table (info)->dynamic_sections_created)
b34976b6 9174 return TRUE;
b49e97c9
TS
9175
9176 /* If this symbol is not defined in a regular file, then set
9177 the symbol to the stub location. This is required to make
9178 function pointers compare as equal between the normal
9179 executable and the shared library. */
f5385ebf 9180 if (!h->def_regular)
b49e97c9 9181 {
33bb52fb
RS
9182 hmips->needs_lazy_stub = TRUE;
9183 htab->lazy_stub_count++;
b34976b6 9184 return TRUE;
b49e97c9
TS
9185 }
9186 }
861fb55a
DJ
9187 /* As above, VxWorks requires PLT entries for externally-defined
9188 functions that are only accessed through call relocations.
b49e97c9 9189
861fb55a
DJ
9190 Both VxWorks and non-VxWorks targets also need PLT entries if there
9191 are static-only relocations against an externally-defined function.
9192 This can technically occur for shared libraries if there are
9193 branches to the symbol, although it is unlikely that this will be
9194 used in practice due to the short ranges involved. It can occur
9195 for any relative or absolute relocation in executables; in that
9196 case, the PLT entry becomes the function's canonical address. */
9197 else if (((h->needs_plt && !hmips->no_fn_stub)
9198 || (h->type == STT_FUNC && hmips->has_static_relocs))
9199 && htab->use_plts_and_copy_relocs
9200 && !SYMBOL_CALLS_LOCAL (info, h)
9201 && !(ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
9202 && h->root.type == bfd_link_hash_undefweak))
b49e97c9 9203 {
1bbce132
MR
9204 bfd_boolean micromips_p = MICROMIPS_P (info->output_bfd);
9205 bfd_boolean newabi_p = NEWABI_P (info->output_bfd);
9206
9207 /* If this is the first symbol to need a PLT entry, then make some
9208 basic setup. Also work out PLT entry sizes. We'll need them
9209 for PLT offset calculations. */
9210 if (htab->plt_mips_offset + htab->plt_comp_offset == 0)
861fb55a
DJ
9211 {
9212 BFD_ASSERT (htab->sgotplt->size == 0);
1bbce132 9213 BFD_ASSERT (htab->plt_got_index == 0);
0a44bf69 9214
861fb55a
DJ
9215 /* If we're using the PLT additions to the psABI, each PLT
9216 entry is 16 bytes and the PLT0 entry is 32 bytes.
9217 Encourage better cache usage by aligning. We do this
9218 lazily to avoid pessimizing traditional objects. */
9219 if (!htab->is_vxworks
9220 && !bfd_set_section_alignment (dynobj, htab->splt, 5))
9221 return FALSE;
0a44bf69 9222
861fb55a
DJ
9223 /* Make sure that .got.plt is word-aligned. We do this lazily
9224 for the same reason as above. */
9225 if (!bfd_set_section_alignment (dynobj, htab->sgotplt,
9226 MIPS_ELF_LOG_FILE_ALIGN (dynobj)))
9227 return FALSE;
0a44bf69 9228
861fb55a
DJ
9229 /* On non-VxWorks targets, the first two entries in .got.plt
9230 are reserved. */
9231 if (!htab->is_vxworks)
1bbce132
MR
9232 htab->plt_got_index
9233 += (get_elf_backend_data (dynobj)->got_header_size
9234 / MIPS_ELF_GOT_SIZE (dynobj));
0a44bf69 9235
861fb55a
DJ
9236 /* On VxWorks, also allocate room for the header's
9237 .rela.plt.unloaded entries. */
0e1862bb 9238 if (htab->is_vxworks && !bfd_link_pic (info))
0a44bf69 9239 htab->srelplt2->size += 2 * sizeof (Elf32_External_Rela);
1bbce132
MR
9240
9241 /* Now work out the sizes of individual PLT entries. */
0e1862bb 9242 if (htab->is_vxworks && bfd_link_pic (info))
1bbce132
MR
9243 htab->plt_mips_entry_size
9244 = 4 * ARRAY_SIZE (mips_vxworks_shared_plt_entry);
9245 else if (htab->is_vxworks)
9246 htab->plt_mips_entry_size
9247 = 4 * ARRAY_SIZE (mips_vxworks_exec_plt_entry);
9248 else if (newabi_p)
9249 htab->plt_mips_entry_size
9250 = 4 * ARRAY_SIZE (mips_exec_plt_entry);
833794fc 9251 else if (!micromips_p)
1bbce132
MR
9252 {
9253 htab->plt_mips_entry_size
9254 = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9255 htab->plt_comp_entry_size
833794fc
MR
9256 = 2 * ARRAY_SIZE (mips16_o32_exec_plt_entry);
9257 }
9258 else if (htab->insn32)
9259 {
9260 htab->plt_mips_entry_size
9261 = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9262 htab->plt_comp_entry_size
9263 = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt_entry);
1bbce132
MR
9264 }
9265 else
9266 {
9267 htab->plt_mips_entry_size
9268 = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9269 htab->plt_comp_entry_size
833794fc 9270 = 2 * ARRAY_SIZE (micromips_o32_exec_plt_entry);
1bbce132 9271 }
0a44bf69
RS
9272 }
9273
1bbce132
MR
9274 if (h->plt.plist == NULL)
9275 h->plt.plist = mips_elf_make_plt_record (dynobj);
9276 if (h->plt.plist == NULL)
9277 return FALSE;
9278
9279 /* There are no defined MIPS16 or microMIPS PLT entries for VxWorks,
9280 n32 or n64, so always use a standard entry there.
9281
9282 If the symbol has a MIPS16 call stub and gets a PLT entry, then
9283 all MIPS16 calls will go via that stub, and there is no benefit
9284 to having a MIPS16 entry. And in the case of call_stub a
9285 standard entry actually has to be used as the stub ends with a J
9286 instruction. */
9287 if (newabi_p
9288 || htab->is_vxworks
9289 || hmips->call_stub
9290 || hmips->call_fp_stub)
9291 {
9292 h->plt.plist->need_mips = TRUE;
9293 h->plt.plist->need_comp = FALSE;
9294 }
9295
9296 /* Otherwise, if there are no direct calls to the function, we
9297 have a free choice of whether to use standard or compressed
9298 entries. Prefer microMIPS entries if the object is known to
9299 contain microMIPS code, so that it becomes possible to create
9300 pure microMIPS binaries. Prefer standard entries otherwise,
9301 because MIPS16 ones are no smaller and are usually slower. */
9302 if (!h->plt.plist->need_mips && !h->plt.plist->need_comp)
9303 {
9304 if (micromips_p)
9305 h->plt.plist->need_comp = TRUE;
9306 else
9307 h->plt.plist->need_mips = TRUE;
9308 }
9309
9310 if (h->plt.plist->need_mips)
9311 {
9312 h->plt.plist->mips_offset = htab->plt_mips_offset;
9313 htab->plt_mips_offset += htab->plt_mips_entry_size;
9314 }
9315 if (h->plt.plist->need_comp)
9316 {
9317 h->plt.plist->comp_offset = htab->plt_comp_offset;
9318 htab->plt_comp_offset += htab->plt_comp_entry_size;
9319 }
9320
9321 /* Reserve the corresponding .got.plt entry now too. */
9322 h->plt.plist->gotplt_index = htab->plt_got_index++;
0a44bf69
RS
9323
9324 /* If the output file has no definition of the symbol, set the
861fb55a 9325 symbol's value to the address of the stub. */
0e1862bb 9326 if (!bfd_link_pic (info) && !h->def_regular)
1bbce132 9327 hmips->use_plt_entry = TRUE;
0a44bf69 9328
1bbce132 9329 /* Make room for the R_MIPS_JUMP_SLOT relocation. */
861fb55a
DJ
9330 htab->srelplt->size += (htab->is_vxworks
9331 ? MIPS_ELF_RELA_SIZE (dynobj)
9332 : MIPS_ELF_REL_SIZE (dynobj));
0a44bf69
RS
9333
9334 /* Make room for the .rela.plt.unloaded relocations. */
0e1862bb 9335 if (htab->is_vxworks && !bfd_link_pic (info))
0a44bf69
RS
9336 htab->srelplt2->size += 3 * sizeof (Elf32_External_Rela);
9337
861fb55a
DJ
9338 /* All relocations against this symbol that could have been made
9339 dynamic will now refer to the PLT entry instead. */
9340 hmips->possibly_dynamic_relocs = 0;
0a44bf69 9341
0a44bf69
RS
9342 return TRUE;
9343 }
9344
9345 /* If this is a weak symbol, and there is a real definition, the
9346 processor independent code will have arranged for us to see the
9347 real definition first, and we can just use the same value. */
9348 if (h->u.weakdef != NULL)
9349 {
9350 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
9351 || h->u.weakdef->root.type == bfd_link_hash_defweak);
9352 h->root.u.def.section = h->u.weakdef->root.u.def.section;
9353 h->root.u.def.value = h->u.weakdef->root.u.def.value;
9354 return TRUE;
9355 }
9356
861fb55a
DJ
9357 /* Otherwise, there is nothing further to do for symbols defined
9358 in regular objects. */
9359 if (h->def_regular)
0a44bf69
RS
9360 return TRUE;
9361
861fb55a
DJ
9362 /* There's also nothing more to do if we'll convert all relocations
9363 against this symbol into dynamic relocations. */
9364 if (!hmips->has_static_relocs)
9365 return TRUE;
9366
9367 /* We're now relying on copy relocations. Complain if we have
9368 some that we can't convert. */
0e1862bb 9369 if (!htab->use_plts_and_copy_relocs || bfd_link_pic (info))
861fb55a 9370 {
4eca0228
AM
9371 _bfd_error_handler (_("non-dynamic relocations refer to "
9372 "dynamic symbol %s"),
9373 h->root.root.string);
861fb55a
DJ
9374 bfd_set_error (bfd_error_bad_value);
9375 return FALSE;
9376 }
9377
0a44bf69
RS
9378 /* We must allocate the symbol in our .dynbss section, which will
9379 become part of the .bss section of the executable. There will be
9380 an entry for this symbol in the .dynsym section. The dynamic
9381 object will contain position independent code, so all references
9382 from the dynamic object to this symbol will go through the global
9383 offset table. The dynamic linker will use the .dynsym entry to
9384 determine the address it must put in the global offset table, so
9385 both the dynamic object and the regular object will refer to the
9386 same memory location for the variable. */
9387
9388 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
9389 {
861fb55a
DJ
9390 if (htab->is_vxworks)
9391 htab->srelbss->size += sizeof (Elf32_External_Rela);
9392 else
9393 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
0a44bf69
RS
9394 h->needs_copy = 1;
9395 }
9396
861fb55a
DJ
9397 /* All relocations against this symbol that could have been made
9398 dynamic will now refer to the local copy instead. */
9399 hmips->possibly_dynamic_relocs = 0;
9400
6cabe1ea 9401 return _bfd_elf_adjust_dynamic_copy (info, h, htab->sdynbss);
0a44bf69 9402}
b49e97c9
TS
9403\f
9404/* This function is called after all the input files have been read,
9405 and the input sections have been assigned to output sections. We
9406 check for any mips16 stub sections that we can discard. */
9407
b34976b6 9408bfd_boolean
9719ad41
RS
9409_bfd_mips_elf_always_size_sections (bfd *output_bfd,
9410 struct bfd_link_info *info)
b49e97c9 9411{
351cdf24 9412 asection *sect;
0a44bf69 9413 struct mips_elf_link_hash_table *htab;
861fb55a 9414 struct mips_htab_traverse_info hti;
0a44bf69
RS
9415
9416 htab = mips_elf_hash_table (info);
4dfe6ac6 9417 BFD_ASSERT (htab != NULL);
f4416af6 9418
b49e97c9 9419 /* The .reginfo section has a fixed size. */
351cdf24
MF
9420 sect = bfd_get_section_by_name (output_bfd, ".reginfo");
9421 if (sect != NULL)
9422 bfd_set_section_size (output_bfd, sect, sizeof (Elf32_External_RegInfo));
9423
9424 /* The .MIPS.abiflags section has a fixed size. */
9425 sect = bfd_get_section_by_name (output_bfd, ".MIPS.abiflags");
9426 if (sect != NULL)
9427 bfd_set_section_size (output_bfd, sect, sizeof (Elf_External_ABIFlags_v0));
b49e97c9 9428
861fb55a
DJ
9429 hti.info = info;
9430 hti.output_bfd = output_bfd;
9431 hti.error = FALSE;
9432 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
9433 mips_elf_check_symbols, &hti);
9434 if (hti.error)
9435 return FALSE;
f4416af6 9436
33bb52fb
RS
9437 return TRUE;
9438}
9439
9440/* If the link uses a GOT, lay it out and work out its size. */
9441
9442static bfd_boolean
9443mips_elf_lay_out_got (bfd *output_bfd, struct bfd_link_info *info)
9444{
9445 bfd *dynobj;
9446 asection *s;
9447 struct mips_got_info *g;
33bb52fb
RS
9448 bfd_size_type loadable_size = 0;
9449 bfd_size_type page_gotno;
d7206569 9450 bfd *ibfd;
ab361d49 9451 struct mips_elf_traverse_got_arg tga;
33bb52fb
RS
9452 struct mips_elf_link_hash_table *htab;
9453
9454 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9455 BFD_ASSERT (htab != NULL);
9456
a8028dd0 9457 s = htab->sgot;
f4416af6 9458 if (s == NULL)
b34976b6 9459 return TRUE;
b49e97c9 9460
33bb52fb 9461 dynobj = elf_hash_table (info)->dynobj;
a8028dd0
RS
9462 g = htab->got_info;
9463
861fb55a
DJ
9464 /* Allocate room for the reserved entries. VxWorks always reserves
9465 3 entries; other objects only reserve 2 entries. */
cb22ccf4 9466 BFD_ASSERT (g->assigned_low_gotno == 0);
861fb55a
DJ
9467 if (htab->is_vxworks)
9468 htab->reserved_gotno = 3;
9469 else
9470 htab->reserved_gotno = 2;
9471 g->local_gotno += htab->reserved_gotno;
cb22ccf4 9472 g->assigned_low_gotno = htab->reserved_gotno;
861fb55a 9473
6c42ddb9
RS
9474 /* Decide which symbols need to go in the global part of the GOT and
9475 count the number of reloc-only GOT symbols. */
020d7251 9476 mips_elf_link_hash_traverse (htab, mips_elf_count_got_symbols, info);
f4416af6 9477
13db6b44
RS
9478 if (!mips_elf_resolve_final_got_entries (info, g))
9479 return FALSE;
9480
33bb52fb
RS
9481 /* Calculate the total loadable size of the output. That
9482 will give us the maximum number of GOT_PAGE entries
9483 required. */
c72f2fb2 9484 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
33bb52fb
RS
9485 {
9486 asection *subsection;
5108fc1b 9487
d7206569 9488 for (subsection = ibfd->sections;
33bb52fb
RS
9489 subsection;
9490 subsection = subsection->next)
9491 {
9492 if ((subsection->flags & SEC_ALLOC) == 0)
9493 continue;
9494 loadable_size += ((subsection->size + 0xf)
9495 &~ (bfd_size_type) 0xf);
9496 }
9497 }
f4416af6 9498
0a44bf69 9499 if (htab->is_vxworks)
738e5348 9500 /* There's no need to allocate page entries for VxWorks; R_MIPS*_GOT16
0a44bf69
RS
9501 relocations against local symbols evaluate to "G", and the EABI does
9502 not include R_MIPS_GOT_PAGE. */
c224138d 9503 page_gotno = 0;
0a44bf69
RS
9504 else
9505 /* Assume there are two loadable segments consisting of contiguous
9506 sections. Is 5 enough? */
c224138d
RS
9507 page_gotno = (loadable_size >> 16) + 5;
9508
13db6b44 9509 /* Choose the smaller of the two page estimates; both are intended to be
c224138d
RS
9510 conservative. */
9511 if (page_gotno > g->page_gotno)
9512 page_gotno = g->page_gotno;
f4416af6 9513
c224138d 9514 g->local_gotno += page_gotno;
cb22ccf4 9515 g->assigned_high_gotno = g->local_gotno - 1;
ab361d49 9516
ab361d49
RS
9517 s->size += g->local_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
9518 s->size += g->global_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
0f20cc35
DJ
9519 s->size += g->tls_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
9520
0a44bf69
RS
9521 /* VxWorks does not support multiple GOTs. It initializes $gp to
9522 __GOTT_BASE__[__GOTT_INDEX__], the value of which is set by the
9523 dynamic loader. */
57093f5e 9524 if (!htab->is_vxworks && s->size > MIPS_ELF_GOT_MAX_SIZE (info))
0f20cc35 9525 {
a8028dd0 9526 if (!mips_elf_multi_got (output_bfd, info, s, page_gotno))
0f20cc35
DJ
9527 return FALSE;
9528 }
9529 else
9530 {
d7206569
RS
9531 /* Record that all bfds use G. This also has the effect of freeing
9532 the per-bfd GOTs, which we no longer need. */
c72f2fb2 9533 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
d7206569
RS
9534 if (mips_elf_bfd_got (ibfd, FALSE))
9535 mips_elf_replace_bfd_got (ibfd, g);
9536 mips_elf_replace_bfd_got (output_bfd, g);
9537
33bb52fb 9538 /* Set up TLS entries. */
0f20cc35 9539 g->tls_assigned_gotno = g->global_gotno + g->local_gotno;
72e7511a
RS
9540 tga.info = info;
9541 tga.g = g;
9542 tga.value = MIPS_ELF_GOT_SIZE (output_bfd);
9543 htab_traverse (g->got_entries, mips_elf_initialize_tls_index, &tga);
9544 if (!tga.g)
9545 return FALSE;
1fd20d70
RS
9546 BFD_ASSERT (g->tls_assigned_gotno
9547 == g->global_gotno + g->local_gotno + g->tls_gotno);
33bb52fb 9548
57093f5e 9549 /* Each VxWorks GOT entry needs an explicit relocation. */
0e1862bb 9550 if (htab->is_vxworks && bfd_link_pic (info))
57093f5e
RS
9551 g->relocs += g->global_gotno + g->local_gotno - htab->reserved_gotno;
9552
33bb52fb 9553 /* Allocate room for the TLS relocations. */
ab361d49
RS
9554 if (g->relocs)
9555 mips_elf_allocate_dynamic_relocations (dynobj, info, g->relocs);
0f20cc35 9556 }
b49e97c9 9557
b34976b6 9558 return TRUE;
b49e97c9
TS
9559}
9560
33bb52fb
RS
9561/* Estimate the size of the .MIPS.stubs section. */
9562
9563static void
9564mips_elf_estimate_stub_size (bfd *output_bfd, struct bfd_link_info *info)
9565{
9566 struct mips_elf_link_hash_table *htab;
9567 bfd_size_type dynsymcount;
9568
9569 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9570 BFD_ASSERT (htab != NULL);
9571
33bb52fb
RS
9572 if (htab->lazy_stub_count == 0)
9573 return;
9574
9575 /* IRIX rld assumes that a function stub isn't at the end of the .text
9576 section, so add a dummy entry to the end. */
9577 htab->lazy_stub_count++;
9578
9579 /* Get a worst-case estimate of the number of dynamic symbols needed.
9580 At this point, dynsymcount does not account for section symbols
9581 and count_section_dynsyms may overestimate the number that will
9582 be needed. */
9583 dynsymcount = (elf_hash_table (info)->dynsymcount
9584 + count_section_dynsyms (output_bfd, info));
9585
1bbce132
MR
9586 /* Determine the size of one stub entry. There's no disadvantage
9587 from using microMIPS code here, so for the sake of pure-microMIPS
9588 binaries we prefer it whenever there's any microMIPS code in
9589 output produced at all. This has a benefit of stubs being
833794fc
MR
9590 shorter by 4 bytes each too, unless in the insn32 mode. */
9591 if (!MICROMIPS_P (output_bfd))
1bbce132
MR
9592 htab->function_stub_size = (dynsymcount > 0x10000
9593 ? MIPS_FUNCTION_STUB_BIG_SIZE
9594 : MIPS_FUNCTION_STUB_NORMAL_SIZE);
833794fc
MR
9595 else if (htab->insn32)
9596 htab->function_stub_size = (dynsymcount > 0x10000
9597 ? MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE
9598 : MICROMIPS_INSN32_FUNCTION_STUB_NORMAL_SIZE);
9599 else
9600 htab->function_stub_size = (dynsymcount > 0x10000
9601 ? MICROMIPS_FUNCTION_STUB_BIG_SIZE
9602 : MICROMIPS_FUNCTION_STUB_NORMAL_SIZE);
33bb52fb
RS
9603
9604 htab->sstubs->size = htab->lazy_stub_count * htab->function_stub_size;
9605}
9606
1bbce132
MR
9607/* A mips_elf_link_hash_traverse callback for which DATA points to a
9608 mips_htab_traverse_info. If H needs a traditional MIPS lazy-binding
9609 stub, allocate an entry in the stubs section. */
33bb52fb
RS
9610
9611static bfd_boolean
af924177 9612mips_elf_allocate_lazy_stub (struct mips_elf_link_hash_entry *h, void *data)
33bb52fb 9613{
1bbce132 9614 struct mips_htab_traverse_info *hti = data;
33bb52fb 9615 struct mips_elf_link_hash_table *htab;
1bbce132
MR
9616 struct bfd_link_info *info;
9617 bfd *output_bfd;
9618
9619 info = hti->info;
9620 output_bfd = hti->output_bfd;
9621 htab = mips_elf_hash_table (info);
9622 BFD_ASSERT (htab != NULL);
33bb52fb 9623
33bb52fb
RS
9624 if (h->needs_lazy_stub)
9625 {
1bbce132
MR
9626 bfd_boolean micromips_p = MICROMIPS_P (output_bfd);
9627 unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9628 bfd_vma isa_bit = micromips_p;
9629
9630 BFD_ASSERT (htab->root.dynobj != NULL);
9631 if (h->root.plt.plist == NULL)
9632 h->root.plt.plist = mips_elf_make_plt_record (htab->sstubs->owner);
9633 if (h->root.plt.plist == NULL)
9634 {
9635 hti->error = TRUE;
9636 return FALSE;
9637 }
33bb52fb 9638 h->root.root.u.def.section = htab->sstubs;
1bbce132
MR
9639 h->root.root.u.def.value = htab->sstubs->size + isa_bit;
9640 h->root.plt.plist->stub_offset = htab->sstubs->size;
9641 h->root.other = other;
33bb52fb
RS
9642 htab->sstubs->size += htab->function_stub_size;
9643 }
9644 return TRUE;
9645}
9646
9647/* Allocate offsets in the stubs section to each symbol that needs one.
9648 Set the final size of the .MIPS.stub section. */
9649
1bbce132 9650static bfd_boolean
33bb52fb
RS
9651mips_elf_lay_out_lazy_stubs (struct bfd_link_info *info)
9652{
1bbce132
MR
9653 bfd *output_bfd = info->output_bfd;
9654 bfd_boolean micromips_p = MICROMIPS_P (output_bfd);
9655 unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9656 bfd_vma isa_bit = micromips_p;
33bb52fb 9657 struct mips_elf_link_hash_table *htab;
1bbce132
MR
9658 struct mips_htab_traverse_info hti;
9659 struct elf_link_hash_entry *h;
9660 bfd *dynobj;
33bb52fb
RS
9661
9662 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9663 BFD_ASSERT (htab != NULL);
9664
33bb52fb 9665 if (htab->lazy_stub_count == 0)
1bbce132 9666 return TRUE;
33bb52fb
RS
9667
9668 htab->sstubs->size = 0;
1bbce132
MR
9669 hti.info = info;
9670 hti.output_bfd = output_bfd;
9671 hti.error = FALSE;
9672 mips_elf_link_hash_traverse (htab, mips_elf_allocate_lazy_stub, &hti);
9673 if (hti.error)
9674 return FALSE;
33bb52fb
RS
9675 htab->sstubs->size += htab->function_stub_size;
9676 BFD_ASSERT (htab->sstubs->size
9677 == htab->lazy_stub_count * htab->function_stub_size);
1bbce132
MR
9678
9679 dynobj = elf_hash_table (info)->dynobj;
9680 BFD_ASSERT (dynobj != NULL);
9681 h = _bfd_elf_define_linkage_sym (dynobj, info, htab->sstubs, "_MIPS_STUBS_");
9682 if (h == NULL)
9683 return FALSE;
9684 h->root.u.def.value = isa_bit;
9685 h->other = other;
9686 h->type = STT_FUNC;
9687
9688 return TRUE;
9689}
9690
9691/* A mips_elf_link_hash_traverse callback for which DATA points to a
9692 bfd_link_info. If H uses the address of a PLT entry as the value
9693 of the symbol, then set the entry in the symbol table now. Prefer
9694 a standard MIPS PLT entry. */
9695
9696static bfd_boolean
9697mips_elf_set_plt_sym_value (struct mips_elf_link_hash_entry *h, void *data)
9698{
9699 struct bfd_link_info *info = data;
9700 bfd_boolean micromips_p = MICROMIPS_P (info->output_bfd);
9701 struct mips_elf_link_hash_table *htab;
9702 unsigned int other;
9703 bfd_vma isa_bit;
9704 bfd_vma val;
9705
9706 htab = mips_elf_hash_table (info);
9707 BFD_ASSERT (htab != NULL);
9708
9709 if (h->use_plt_entry)
9710 {
9711 BFD_ASSERT (h->root.plt.plist != NULL);
9712 BFD_ASSERT (h->root.plt.plist->mips_offset != MINUS_ONE
9713 || h->root.plt.plist->comp_offset != MINUS_ONE);
9714
9715 val = htab->plt_header_size;
9716 if (h->root.plt.plist->mips_offset != MINUS_ONE)
9717 {
9718 isa_bit = 0;
9719 val += h->root.plt.plist->mips_offset;
9720 other = 0;
9721 }
9722 else
9723 {
9724 isa_bit = 1;
9725 val += htab->plt_mips_offset + h->root.plt.plist->comp_offset;
9726 other = micromips_p ? STO_MICROMIPS : STO_MIPS16;
9727 }
9728 val += isa_bit;
9729 /* For VxWorks, point at the PLT load stub rather than the lazy
9730 resolution stub; this stub will become the canonical function
9731 address. */
9732 if (htab->is_vxworks)
9733 val += 8;
9734
9735 h->root.root.u.def.section = htab->splt;
9736 h->root.root.u.def.value = val;
9737 h->root.other = other;
9738 }
9739
9740 return TRUE;
33bb52fb
RS
9741}
9742
b49e97c9
TS
9743/* Set the sizes of the dynamic sections. */
9744
b34976b6 9745bfd_boolean
9719ad41
RS
9746_bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
9747 struct bfd_link_info *info)
b49e97c9
TS
9748{
9749 bfd *dynobj;
861fb55a 9750 asection *s, *sreldyn;
b34976b6 9751 bfd_boolean reltext;
0a44bf69 9752 struct mips_elf_link_hash_table *htab;
b49e97c9 9753
0a44bf69 9754 htab = mips_elf_hash_table (info);
4dfe6ac6 9755 BFD_ASSERT (htab != NULL);
b49e97c9
TS
9756 dynobj = elf_hash_table (info)->dynobj;
9757 BFD_ASSERT (dynobj != NULL);
9758
9759 if (elf_hash_table (info)->dynamic_sections_created)
9760 {
9761 /* Set the contents of the .interp section to the interpreter. */
9b8b325a 9762 if (bfd_link_executable (info) && !info->nointerp)
b49e97c9 9763 {
3d4d4302 9764 s = bfd_get_linker_section (dynobj, ".interp");
b49e97c9 9765 BFD_ASSERT (s != NULL);
eea6121a 9766 s->size
b49e97c9
TS
9767 = strlen (ELF_DYNAMIC_INTERPRETER (output_bfd)) + 1;
9768 s->contents
9769 = (bfd_byte *) ELF_DYNAMIC_INTERPRETER (output_bfd);
9770 }
861fb55a 9771
1bbce132
MR
9772 /* Figure out the size of the PLT header if we know that we
9773 are using it. For the sake of cache alignment always use
9774 a standard header whenever any standard entries are present
9775 even if microMIPS entries are present as well. This also
9776 lets the microMIPS header rely on the value of $v0 only set
9777 by microMIPS entries, for a small size reduction.
9778
9779 Set symbol table entry values for symbols that use the
9780 address of their PLT entry now that we can calculate it.
9781
9782 Also create the _PROCEDURE_LINKAGE_TABLE_ symbol if we
9783 haven't already in _bfd_elf_create_dynamic_sections. */
9784 if (htab->splt && htab->plt_mips_offset + htab->plt_comp_offset != 0)
861fb55a 9785 {
1bbce132
MR
9786 bfd_boolean micromips_p = (MICROMIPS_P (output_bfd)
9787 && !htab->plt_mips_offset);
9788 unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9789 bfd_vma isa_bit = micromips_p;
861fb55a 9790 struct elf_link_hash_entry *h;
1bbce132 9791 bfd_vma size;
861fb55a
DJ
9792
9793 BFD_ASSERT (htab->use_plts_and_copy_relocs);
1bbce132
MR
9794 BFD_ASSERT (htab->sgotplt->size == 0);
9795 BFD_ASSERT (htab->splt->size == 0);
9796
0e1862bb 9797 if (htab->is_vxworks && bfd_link_pic (info))
1bbce132
MR
9798 size = 4 * ARRAY_SIZE (mips_vxworks_shared_plt0_entry);
9799 else if (htab->is_vxworks)
9800 size = 4 * ARRAY_SIZE (mips_vxworks_exec_plt0_entry);
9801 else if (ABI_64_P (output_bfd))
9802 size = 4 * ARRAY_SIZE (mips_n64_exec_plt0_entry);
9803 else if (ABI_N32_P (output_bfd))
9804 size = 4 * ARRAY_SIZE (mips_n32_exec_plt0_entry);
9805 else if (!micromips_p)
9806 size = 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry);
833794fc
MR
9807 else if (htab->insn32)
9808 size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry);
1bbce132
MR
9809 else
9810 size = 2 * ARRAY_SIZE (micromips_o32_exec_plt0_entry);
861fb55a 9811
1bbce132
MR
9812 htab->plt_header_is_comp = micromips_p;
9813 htab->plt_header_size = size;
9814 htab->splt->size = (size
9815 + htab->plt_mips_offset
9816 + htab->plt_comp_offset);
9817 htab->sgotplt->size = (htab->plt_got_index
9818 * MIPS_ELF_GOT_SIZE (dynobj));
9819
9820 mips_elf_link_hash_traverse (htab, mips_elf_set_plt_sym_value, info);
9821
9822 if (htab->root.hplt == NULL)
9823 {
9824 h = _bfd_elf_define_linkage_sym (dynobj, info, htab->splt,
9825 "_PROCEDURE_LINKAGE_TABLE_");
9826 htab->root.hplt = h;
9827 if (h == NULL)
9828 return FALSE;
9829 }
9830
9831 h = htab->root.hplt;
9832 h->root.u.def.value = isa_bit;
9833 h->other = other;
861fb55a
DJ
9834 h->type = STT_FUNC;
9835 }
9836 }
4e41d0d7 9837
9a59ad6b 9838 /* Allocate space for global sym dynamic relocs. */
2c3fc389 9839 elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
9a59ad6b 9840
33bb52fb
RS
9841 mips_elf_estimate_stub_size (output_bfd, info);
9842
9843 if (!mips_elf_lay_out_got (output_bfd, info))
9844 return FALSE;
9845
9846 mips_elf_lay_out_lazy_stubs (info);
9847
b49e97c9
TS
9848 /* The check_relocs and adjust_dynamic_symbol entry points have
9849 determined the sizes of the various dynamic sections. Allocate
9850 memory for them. */
b34976b6 9851 reltext = FALSE;
b49e97c9
TS
9852 for (s = dynobj->sections; s != NULL; s = s->next)
9853 {
9854 const char *name;
b49e97c9
TS
9855
9856 /* It's OK to base decisions on the section name, because none
9857 of the dynobj section names depend upon the input files. */
9858 name = bfd_get_section_name (dynobj, s);
9859
9860 if ((s->flags & SEC_LINKER_CREATED) == 0)
9861 continue;
9862
0112cd26 9863 if (CONST_STRNEQ (name, ".rel"))
b49e97c9 9864 {
c456f082 9865 if (s->size != 0)
b49e97c9
TS
9866 {
9867 const char *outname;
9868 asection *target;
9869
9870 /* If this relocation section applies to a read only
9871 section, then we probably need a DT_TEXTREL entry.
0a44bf69 9872 If the relocation section is .rel(a).dyn, we always
b49e97c9
TS
9873 assert a DT_TEXTREL entry rather than testing whether
9874 there exists a relocation to a read only section or
9875 not. */
9876 outname = bfd_get_section_name (output_bfd,
9877 s->output_section);
9878 target = bfd_get_section_by_name (output_bfd, outname + 4);
9879 if ((target != NULL
9880 && (target->flags & SEC_READONLY) != 0
9881 && (target->flags & SEC_ALLOC) != 0)
0a44bf69 9882 || strcmp (outname, MIPS_ELF_REL_DYN_NAME (info)) == 0)
b34976b6 9883 reltext = TRUE;
b49e97c9
TS
9884
9885 /* We use the reloc_count field as a counter if we need
9886 to copy relocs into the output file. */
0a44bf69 9887 if (strcmp (name, MIPS_ELF_REL_DYN_NAME (info)) != 0)
b49e97c9 9888 s->reloc_count = 0;
f4416af6
AO
9889
9890 /* If combreloc is enabled, elf_link_sort_relocs() will
9891 sort relocations, but in a different way than we do,
9892 and before we're done creating relocations. Also, it
9893 will move them around between input sections'
9894 relocation's contents, so our sorting would be
9895 broken, so don't let it run. */
9896 info->combreloc = 0;
b49e97c9
TS
9897 }
9898 }
0e1862bb 9899 else if (bfd_link_executable (info)
b49e97c9 9900 && ! mips_elf_hash_table (info)->use_rld_obj_head
0112cd26 9901 && CONST_STRNEQ (name, ".rld_map"))
b49e97c9 9902 {
5108fc1b 9903 /* We add a room for __rld_map. It will be filled in by the
b49e97c9 9904 rtld to contain a pointer to the _r_debug structure. */
b4082c70 9905 s->size += MIPS_ELF_RLD_MAP_SIZE (output_bfd);
b49e97c9
TS
9906 }
9907 else if (SGI_COMPAT (output_bfd)
0112cd26 9908 && CONST_STRNEQ (name, ".compact_rel"))
eea6121a 9909 s->size += mips_elf_hash_table (info)->compact_rel_size;
861fb55a
DJ
9910 else if (s == htab->splt)
9911 {
9912 /* If the last PLT entry has a branch delay slot, allocate
6d30f5b2
NC
9913 room for an extra nop to fill the delay slot. This is
9914 for CPUs without load interlocking. */
9915 if (! LOAD_INTERLOCKS_P (output_bfd)
9916 && ! htab->is_vxworks && s->size > 0)
861fb55a
DJ
9917 s->size += 4;
9918 }
0112cd26 9919 else if (! CONST_STRNEQ (name, ".init")
33bb52fb 9920 && s != htab->sgot
0a44bf69 9921 && s != htab->sgotplt
861fb55a
DJ
9922 && s != htab->sstubs
9923 && s != htab->sdynbss)
b49e97c9
TS
9924 {
9925 /* It's not one of our sections, so don't allocate space. */
9926 continue;
9927 }
9928
c456f082 9929 if (s->size == 0)
b49e97c9 9930 {
8423293d 9931 s->flags |= SEC_EXCLUDE;
b49e97c9
TS
9932 continue;
9933 }
9934
c456f082
AM
9935 if ((s->flags & SEC_HAS_CONTENTS) == 0)
9936 continue;
9937
b49e97c9 9938 /* Allocate memory for the section contents. */
eea6121a 9939 s->contents = bfd_zalloc (dynobj, s->size);
c456f082 9940 if (s->contents == NULL)
b49e97c9
TS
9941 {
9942 bfd_set_error (bfd_error_no_memory);
b34976b6 9943 return FALSE;
b49e97c9
TS
9944 }
9945 }
9946
9947 if (elf_hash_table (info)->dynamic_sections_created)
9948 {
9949 /* Add some entries to the .dynamic section. We fill in the
9950 values later, in _bfd_mips_elf_finish_dynamic_sections, but we
9951 must add the entries now so that we get the correct size for
5750dcec 9952 the .dynamic section. */
af5978fb
RS
9953
9954 /* SGI object has the equivalence of DT_DEBUG in the
5750dcec 9955 DT_MIPS_RLD_MAP entry. This must come first because glibc
6e6be592
MR
9956 only fills in DT_MIPS_RLD_MAP (not DT_DEBUG) and some tools
9957 may only look at the first one they see. */
0e1862bb 9958 if (!bfd_link_pic (info)
af5978fb
RS
9959 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP, 0))
9960 return FALSE;
b49e97c9 9961
0e1862bb 9962 if (bfd_link_executable (info)
a5499fa4
MF
9963 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP_REL, 0))
9964 return FALSE;
9965
5750dcec
DJ
9966 /* The DT_DEBUG entry may be filled in by the dynamic linker and
9967 used by the debugger. */
0e1862bb 9968 if (bfd_link_executable (info)
5750dcec
DJ
9969 && !SGI_COMPAT (output_bfd)
9970 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_DEBUG, 0))
9971 return FALSE;
9972
0a44bf69 9973 if (reltext && (SGI_COMPAT (output_bfd) || htab->is_vxworks))
b49e97c9
TS
9974 info->flags |= DF_TEXTREL;
9975
9976 if ((info->flags & DF_TEXTREL) != 0)
9977 {
9978 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_TEXTREL, 0))
b34976b6 9979 return FALSE;
943284cc
DJ
9980
9981 /* Clear the DF_TEXTREL flag. It will be set again if we
9982 write out an actual text relocation; we may not, because
9983 at this point we do not know whether e.g. any .eh_frame
9984 absolute relocations have been converted to PC-relative. */
9985 info->flags &= ~DF_TEXTREL;
b49e97c9
TS
9986 }
9987
9988 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTGOT, 0))
b34976b6 9989 return FALSE;
b49e97c9 9990
861fb55a 9991 sreldyn = mips_elf_rel_dyn_section (info, FALSE);
0a44bf69 9992 if (htab->is_vxworks)
b49e97c9 9993 {
0a44bf69
RS
9994 /* VxWorks uses .rela.dyn instead of .rel.dyn. It does not
9995 use any of the DT_MIPS_* tags. */
861fb55a 9996 if (sreldyn && sreldyn->size > 0)
0a44bf69
RS
9997 {
9998 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELA, 0))
9999 return FALSE;
b49e97c9 10000
0a44bf69
RS
10001 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELASZ, 0))
10002 return FALSE;
b49e97c9 10003
0a44bf69
RS
10004 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELAENT, 0))
10005 return FALSE;
10006 }
b49e97c9 10007 }
0a44bf69
RS
10008 else
10009 {
861fb55a 10010 if (sreldyn && sreldyn->size > 0)
0a44bf69
RS
10011 {
10012 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_REL, 0))
10013 return FALSE;
b49e97c9 10014
0a44bf69
RS
10015 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELSZ, 0))
10016 return FALSE;
b49e97c9 10017
0a44bf69
RS
10018 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELENT, 0))
10019 return FALSE;
10020 }
b49e97c9 10021
0a44bf69
RS
10022 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_VERSION, 0))
10023 return FALSE;
b49e97c9 10024
0a44bf69
RS
10025 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_FLAGS, 0))
10026 return FALSE;
b49e97c9 10027
0a44bf69
RS
10028 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_BASE_ADDRESS, 0))
10029 return FALSE;
b49e97c9 10030
0a44bf69
RS
10031 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_LOCAL_GOTNO, 0))
10032 return FALSE;
b49e97c9 10033
0a44bf69
RS
10034 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_SYMTABNO, 0))
10035 return FALSE;
b49e97c9 10036
0a44bf69
RS
10037 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_UNREFEXTNO, 0))
10038 return FALSE;
b49e97c9 10039
0a44bf69
RS
10040 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_GOTSYM, 0))
10041 return FALSE;
10042
10043 if (IRIX_COMPAT (dynobj) == ict_irix5
10044 && ! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_HIPAGENO, 0))
10045 return FALSE;
10046
10047 if (IRIX_COMPAT (dynobj) == ict_irix6
10048 && (bfd_get_section_by_name
af0edeb8 10049 (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (dynobj)))
0a44bf69
RS
10050 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_OPTIONS, 0))
10051 return FALSE;
10052 }
861fb55a
DJ
10053 if (htab->splt->size > 0)
10054 {
10055 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTREL, 0))
10056 return FALSE;
10057
10058 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_JMPREL, 0))
10059 return FALSE;
10060
10061 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTRELSZ, 0))
10062 return FALSE;
10063
10064 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_PLTGOT, 0))
10065 return FALSE;
10066 }
7a2b07ff
NS
10067 if (htab->is_vxworks
10068 && !elf_vxworks_add_dynamic_entries (output_bfd, info))
10069 return FALSE;
b49e97c9
TS
10070 }
10071
b34976b6 10072 return TRUE;
b49e97c9
TS
10073}
10074\f
81d43bff
RS
10075/* REL is a relocation in INPUT_BFD that is being copied to OUTPUT_BFD.
10076 Adjust its R_ADDEND field so that it is correct for the output file.
10077 LOCAL_SYMS and LOCAL_SECTIONS are arrays of INPUT_BFD's local symbols
10078 and sections respectively; both use symbol indexes. */
10079
10080static void
10081mips_elf_adjust_addend (bfd *output_bfd, struct bfd_link_info *info,
10082 bfd *input_bfd, Elf_Internal_Sym *local_syms,
10083 asection **local_sections, Elf_Internal_Rela *rel)
10084{
10085 unsigned int r_type, r_symndx;
10086 Elf_Internal_Sym *sym;
10087 asection *sec;
10088
020d7251 10089 if (mips_elf_local_relocation_p (input_bfd, rel, local_sections))
81d43bff
RS
10090 {
10091 r_type = ELF_R_TYPE (output_bfd, rel->r_info);
df58fc94 10092 if (gprel16_reloc_p (r_type)
81d43bff 10093 || r_type == R_MIPS_GPREL32
df58fc94 10094 || literal_reloc_p (r_type))
81d43bff
RS
10095 {
10096 rel->r_addend += _bfd_get_gp_value (input_bfd);
10097 rel->r_addend -= _bfd_get_gp_value (output_bfd);
10098 }
10099
10100 r_symndx = ELF_R_SYM (output_bfd, rel->r_info);
10101 sym = local_syms + r_symndx;
10102
10103 /* Adjust REL's addend to account for section merging. */
0e1862bb 10104 if (!bfd_link_relocatable (info))
81d43bff
RS
10105 {
10106 sec = local_sections[r_symndx];
10107 _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
10108 }
10109
10110 /* This would normally be done by the rela_normal code in elflink.c. */
10111 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
10112 rel->r_addend += local_sections[r_symndx]->output_offset;
10113 }
10114}
10115
545fd46b
MR
10116/* Handle relocations against symbols from removed linkonce sections,
10117 or sections discarded by a linker script. We use this wrapper around
10118 RELOC_AGAINST_DISCARDED_SECTION to handle triplets of compound relocs
10119 on 64-bit ELF targets. In this case for any relocation handled, which
10120 always be the first in a triplet, the remaining two have to be processed
10121 together with the first, even if they are R_MIPS_NONE. It is the symbol
10122 index referred by the first reloc that applies to all the three and the
10123 remaining two never refer to an object symbol. And it is the final
10124 relocation (the last non-null one) that determines the output field of
10125 the whole relocation so retrieve the corresponding howto structure for
10126 the relocatable field to be cleared by RELOC_AGAINST_DISCARDED_SECTION.
10127
10128 Note that RELOC_AGAINST_DISCARDED_SECTION is a macro that uses "continue"
10129 and therefore requires to be pasted in a loop. It also defines a block
10130 and does not protect any of its arguments, hence the extra brackets. */
10131
10132static void
10133mips_reloc_against_discarded_section (bfd *output_bfd,
10134 struct bfd_link_info *info,
10135 bfd *input_bfd, asection *input_section,
10136 Elf_Internal_Rela **rel,
10137 const Elf_Internal_Rela **relend,
10138 bfd_boolean rel_reloc,
10139 reloc_howto_type *howto,
10140 bfd_byte *contents)
10141{
10142 const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
10143 int count = bed->s->int_rels_per_ext_rel;
10144 unsigned int r_type;
10145 int i;
10146
10147 for (i = count - 1; i > 0; i--)
10148 {
10149 r_type = ELF_R_TYPE (output_bfd, (*rel)[i].r_info);
10150 if (r_type != R_MIPS_NONE)
10151 {
10152 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type, !rel_reloc);
10153 break;
10154 }
10155 }
10156 do
10157 {
10158 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
10159 (*rel), count, (*relend),
10160 howto, i, contents);
10161 }
10162 while (0);
10163}
10164
b49e97c9
TS
10165/* Relocate a MIPS ELF section. */
10166
b34976b6 10167bfd_boolean
9719ad41
RS
10168_bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
10169 bfd *input_bfd, asection *input_section,
10170 bfd_byte *contents, Elf_Internal_Rela *relocs,
10171 Elf_Internal_Sym *local_syms,
10172 asection **local_sections)
b49e97c9
TS
10173{
10174 Elf_Internal_Rela *rel;
10175 const Elf_Internal_Rela *relend;
10176 bfd_vma addend = 0;
b34976b6 10177 bfd_boolean use_saved_addend_p = FALSE;
9c5bfbb7 10178 const struct elf_backend_data *bed;
b49e97c9
TS
10179
10180 bed = get_elf_backend_data (output_bfd);
10181 relend = relocs + input_section->reloc_count * bed->s->int_rels_per_ext_rel;
10182 for (rel = relocs; rel < relend; ++rel)
10183 {
10184 const char *name;
c9adbffe 10185 bfd_vma value = 0;
b49e97c9 10186 reloc_howto_type *howto;
ad3d9127 10187 bfd_boolean cross_mode_jump_p = FALSE;
b34976b6 10188 /* TRUE if the relocation is a RELA relocation, rather than a
b49e97c9 10189 REL relocation. */
b34976b6 10190 bfd_boolean rela_relocation_p = TRUE;
b49e97c9 10191 unsigned int r_type = ELF_R_TYPE (output_bfd, rel->r_info);
9719ad41 10192 const char *msg;
ab96bf03
AM
10193 unsigned long r_symndx;
10194 asection *sec;
749b8d9d
L
10195 Elf_Internal_Shdr *symtab_hdr;
10196 struct elf_link_hash_entry *h;
d4730f92 10197 bfd_boolean rel_reloc;
b49e97c9 10198
d4730f92
BS
10199 rel_reloc = (NEWABI_P (input_bfd)
10200 && mips_elf_rel_relocation_p (input_bfd, input_section,
10201 relocs, rel));
b49e97c9 10202 /* Find the relocation howto for this relocation. */
d4730f92 10203 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type, !rel_reloc);
ab96bf03
AM
10204
10205 r_symndx = ELF_R_SYM (input_bfd, rel->r_info);
749b8d9d 10206 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
020d7251 10207 if (mips_elf_local_relocation_p (input_bfd, rel, local_sections))
749b8d9d
L
10208 {
10209 sec = local_sections[r_symndx];
10210 h = NULL;
10211 }
ab96bf03
AM
10212 else
10213 {
ab96bf03 10214 unsigned long extsymoff;
ab96bf03 10215
ab96bf03
AM
10216 extsymoff = 0;
10217 if (!elf_bad_symtab (input_bfd))
10218 extsymoff = symtab_hdr->sh_info;
10219 h = elf_sym_hashes (input_bfd) [r_symndx - extsymoff];
10220 while (h->root.type == bfd_link_hash_indirect
10221 || h->root.type == bfd_link_hash_warning)
10222 h = (struct elf_link_hash_entry *) h->root.u.i.link;
10223
10224 sec = NULL;
10225 if (h->root.type == bfd_link_hash_defined
10226 || h->root.type == bfd_link_hash_defweak)
10227 sec = h->root.u.def.section;
10228 }
10229
dbaa2011 10230 if (sec != NULL && discarded_section (sec))
545fd46b
MR
10231 {
10232 mips_reloc_against_discarded_section (output_bfd, info, input_bfd,
10233 input_section, &rel, &relend,
10234 rel_reloc, howto, contents);
10235 continue;
10236 }
ab96bf03 10237
4a14403c 10238 if (r_type == R_MIPS_64 && ! NEWABI_P (input_bfd))
b49e97c9
TS
10239 {
10240 /* Some 32-bit code uses R_MIPS_64. In particular, people use
10241 64-bit code, but make sure all their addresses are in the
10242 lowermost or uppermost 32-bit section of the 64-bit address
10243 space. Thus, when they use an R_MIPS_64 they mean what is
10244 usually meant by R_MIPS_32, with the exception that the
10245 stored value is sign-extended to 64 bits. */
b34976b6 10246 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, R_MIPS_32, FALSE);
b49e97c9
TS
10247
10248 /* On big-endian systems, we need to lie about the position
10249 of the reloc. */
10250 if (bfd_big_endian (input_bfd))
10251 rel->r_offset += 4;
10252 }
b49e97c9
TS
10253
10254 if (!use_saved_addend_p)
10255 {
b49e97c9
TS
10256 /* If these relocations were originally of the REL variety,
10257 we must pull the addend out of the field that will be
10258 relocated. Otherwise, we simply use the contents of the
c224138d
RS
10259 RELA relocation. */
10260 if (mips_elf_rel_relocation_p (input_bfd, input_section,
10261 relocs, rel))
b49e97c9 10262 {
b34976b6 10263 rela_relocation_p = FALSE;
c224138d
RS
10264 addend = mips_elf_read_rel_addend (input_bfd, rel,
10265 howto, contents);
738e5348
RS
10266 if (hi16_reloc_p (r_type)
10267 || (got16_reloc_p (r_type)
b49e97c9 10268 && mips_elf_local_relocation_p (input_bfd, rel,
020d7251 10269 local_sections)))
b49e97c9 10270 {
c224138d
RS
10271 if (!mips_elf_add_lo16_rel_addend (input_bfd, rel, relend,
10272 contents, &addend))
749b8d9d 10273 {
749b8d9d
L
10274 if (h)
10275 name = h->root.root.string;
10276 else
10277 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
10278 local_syms + r_symndx,
10279 sec);
4eca0228 10280 _bfd_error_handler
749b8d9d
L
10281 (_("%B: Can't find matching LO16 reloc against `%s' for %s at 0x%lx in section `%A'"),
10282 input_bfd, input_section, name, howto->name,
10283 rel->r_offset);
749b8d9d 10284 }
b49e97c9 10285 }
30ac9238
RS
10286 else
10287 addend <<= howto->rightshift;
b49e97c9
TS
10288 }
10289 else
10290 addend = rel->r_addend;
81d43bff
RS
10291 mips_elf_adjust_addend (output_bfd, info, input_bfd,
10292 local_syms, local_sections, rel);
b49e97c9
TS
10293 }
10294
0e1862bb 10295 if (bfd_link_relocatable (info))
b49e97c9 10296 {
4a14403c 10297 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd)
b49e97c9
TS
10298 && bfd_big_endian (input_bfd))
10299 rel->r_offset -= 4;
10300
81d43bff 10301 if (!rela_relocation_p && rel->r_addend)
5a659663 10302 {
81d43bff 10303 addend += rel->r_addend;
738e5348 10304 if (hi16_reloc_p (r_type) || got16_reloc_p (r_type))
5a659663
TS
10305 addend = mips_elf_high (addend);
10306 else if (r_type == R_MIPS_HIGHER)
10307 addend = mips_elf_higher (addend);
10308 else if (r_type == R_MIPS_HIGHEST)
10309 addend = mips_elf_highest (addend);
30ac9238
RS
10310 else
10311 addend >>= howto->rightshift;
b49e97c9 10312
30ac9238
RS
10313 /* We use the source mask, rather than the destination
10314 mask because the place to which we are writing will be
10315 source of the addend in the final link. */
b49e97c9
TS
10316 addend &= howto->src_mask;
10317
5a659663 10318 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
b49e97c9
TS
10319 /* See the comment above about using R_MIPS_64 in the 32-bit
10320 ABI. Here, we need to update the addend. It would be
10321 possible to get away with just using the R_MIPS_32 reloc
10322 but for endianness. */
10323 {
10324 bfd_vma sign_bits;
10325 bfd_vma low_bits;
10326 bfd_vma high_bits;
10327
10328 if (addend & ((bfd_vma) 1 << 31))
10329#ifdef BFD64
10330 sign_bits = ((bfd_vma) 1 << 32) - 1;
10331#else
10332 sign_bits = -1;
10333#endif
10334 else
10335 sign_bits = 0;
10336
10337 /* If we don't know that we have a 64-bit type,
10338 do two separate stores. */
10339 if (bfd_big_endian (input_bfd))
10340 {
10341 /* Store the sign-bits (which are most significant)
10342 first. */
10343 low_bits = sign_bits;
10344 high_bits = addend;
10345 }
10346 else
10347 {
10348 low_bits = addend;
10349 high_bits = sign_bits;
10350 }
10351 bfd_put_32 (input_bfd, low_bits,
10352 contents + rel->r_offset);
10353 bfd_put_32 (input_bfd, high_bits,
10354 contents + rel->r_offset + 4);
10355 continue;
10356 }
10357
10358 if (! mips_elf_perform_relocation (info, howto, rel, addend,
10359 input_bfd, input_section,
b34976b6
AM
10360 contents, FALSE))
10361 return FALSE;
b49e97c9
TS
10362 }
10363
10364 /* Go on to the next relocation. */
10365 continue;
10366 }
10367
10368 /* In the N32 and 64-bit ABIs there may be multiple consecutive
10369 relocations for the same offset. In that case we are
10370 supposed to treat the output of each relocation as the addend
10371 for the next. */
10372 if (rel + 1 < relend
10373 && rel->r_offset == rel[1].r_offset
10374 && ELF_R_TYPE (input_bfd, rel[1].r_info) != R_MIPS_NONE)
b34976b6 10375 use_saved_addend_p = TRUE;
b49e97c9 10376 else
b34976b6 10377 use_saved_addend_p = FALSE;
b49e97c9
TS
10378
10379 /* Figure out what value we are supposed to relocate. */
10380 switch (mips_elf_calculate_relocation (output_bfd, input_bfd,
10381 input_section, info, rel,
10382 addend, howto, local_syms,
10383 local_sections, &value,
38a7df63 10384 &name, &cross_mode_jump_p,
bce03d3d 10385 use_saved_addend_p))
b49e97c9
TS
10386 {
10387 case bfd_reloc_continue:
10388 /* There's nothing to do. */
10389 continue;
10390
10391 case bfd_reloc_undefined:
10392 /* mips_elf_calculate_relocation already called the
10393 undefined_symbol callback. There's no real point in
10394 trying to perform the relocation at this point, so we
10395 just skip ahead to the next relocation. */
10396 continue;
10397
10398 case bfd_reloc_notsupported:
10399 msg = _("internal error: unsupported relocation error");
10400 info->callbacks->warning
10401 (info, msg, name, input_bfd, input_section, rel->r_offset);
b34976b6 10402 return FALSE;
b49e97c9
TS
10403
10404 case bfd_reloc_overflow:
10405 if (use_saved_addend_p)
10406 /* Ignore overflow until we reach the last relocation for
10407 a given location. */
10408 ;
10409 else
10410 {
0e53d9da
AN
10411 struct mips_elf_link_hash_table *htab;
10412
10413 htab = mips_elf_hash_table (info);
4dfe6ac6 10414 BFD_ASSERT (htab != NULL);
b49e97c9 10415 BFD_ASSERT (name != NULL);
0e53d9da 10416 if (!htab->small_data_overflow_reported
9684f078 10417 && (gprel16_reloc_p (howto->type)
df58fc94 10418 || literal_reloc_p (howto->type)))
0e53d9da 10419 {
91d6fa6a
NC
10420 msg = _("small-data section exceeds 64KB;"
10421 " lower small-data size limit (see option -G)");
0e53d9da
AN
10422
10423 htab->small_data_overflow_reported = TRUE;
10424 (*info->callbacks->einfo) ("%P: %s\n", msg);
10425 }
1a72702b
AM
10426 (*info->callbacks->reloc_overflow)
10427 (info, NULL, name, howto->name, (bfd_vma) 0,
10428 input_bfd, input_section, rel->r_offset);
b49e97c9
TS
10429 }
10430 break;
10431
10432 case bfd_reloc_ok:
10433 break;
10434
df58fc94 10435 case bfd_reloc_outofrange:
7db9a74e 10436 msg = NULL;
df58fc94 10437 if (jal_reloc_p (howto->type))
9d862524
MR
10438 msg = (cross_mode_jump_p
10439 ? _("Cannot convert a jump to JALX "
10440 "for a non-word-aligned address")
10441 : (howto->type == R_MIPS16_26
10442 ? _("Jump to a non-word-aligned address")
10443 : _("Jump to a non-instruction-aligned address")));
99aefae6 10444 else if (b_reloc_p (howto->type))
a6ebf616
MR
10445 msg = (cross_mode_jump_p
10446 ? _("Cannot convert a branch to JALX "
10447 "for a non-word-aligned address")
10448 : _("Branch to a non-instruction-aligned address"));
7db9a74e
MR
10449 else if (aligned_pcrel_reloc_p (howto->type))
10450 msg = _("PC-relative load from unaligned address");
10451 if (msg)
df58fc94 10452 {
de341542 10453 info->callbacks->einfo
ed53407e
MR
10454 ("%X%H: %s\n", input_bfd, input_section, rel->r_offset, msg);
10455 break;
7361da2c 10456 }
df58fc94
RS
10457 /* Fall through. */
10458
b49e97c9
TS
10459 default:
10460 abort ();
10461 break;
10462 }
10463
10464 /* If we've got another relocation for the address, keep going
10465 until we reach the last one. */
10466 if (use_saved_addend_p)
10467 {
10468 addend = value;
10469 continue;
10470 }
10471
4a14403c 10472 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
b49e97c9
TS
10473 /* See the comment above about using R_MIPS_64 in the 32-bit
10474 ABI. Until now, we've been using the HOWTO for R_MIPS_32;
10475 that calculated the right value. Now, however, we
10476 sign-extend the 32-bit result to 64-bits, and store it as a
10477 64-bit value. We are especially generous here in that we
10478 go to extreme lengths to support this usage on systems with
10479 only a 32-bit VMA. */
10480 {
10481 bfd_vma sign_bits;
10482 bfd_vma low_bits;
10483 bfd_vma high_bits;
10484
10485 if (value & ((bfd_vma) 1 << 31))
10486#ifdef BFD64
10487 sign_bits = ((bfd_vma) 1 << 32) - 1;
10488#else
10489 sign_bits = -1;
10490#endif
10491 else
10492 sign_bits = 0;
10493
10494 /* If we don't know that we have a 64-bit type,
10495 do two separate stores. */
10496 if (bfd_big_endian (input_bfd))
10497 {
10498 /* Undo what we did above. */
10499 rel->r_offset -= 4;
10500 /* Store the sign-bits (which are most significant)
10501 first. */
10502 low_bits = sign_bits;
10503 high_bits = value;
10504 }
10505 else
10506 {
10507 low_bits = value;
10508 high_bits = sign_bits;
10509 }
10510 bfd_put_32 (input_bfd, low_bits,
10511 contents + rel->r_offset);
10512 bfd_put_32 (input_bfd, high_bits,
10513 contents + rel->r_offset + 4);
10514 continue;
10515 }
10516
10517 /* Actually perform the relocation. */
10518 if (! mips_elf_perform_relocation (info, howto, rel, value,
10519 input_bfd, input_section,
38a7df63 10520 contents, cross_mode_jump_p))
b34976b6 10521 return FALSE;
b49e97c9
TS
10522 }
10523
b34976b6 10524 return TRUE;
b49e97c9
TS
10525}
10526\f
861fb55a
DJ
10527/* A function that iterates over each entry in la25_stubs and fills
10528 in the code for each one. DATA points to a mips_htab_traverse_info. */
10529
10530static int
10531mips_elf_create_la25_stub (void **slot, void *data)
10532{
10533 struct mips_htab_traverse_info *hti;
10534 struct mips_elf_link_hash_table *htab;
10535 struct mips_elf_la25_stub *stub;
10536 asection *s;
10537 bfd_byte *loc;
10538 bfd_vma offset, target, target_high, target_low;
10539
10540 stub = (struct mips_elf_la25_stub *) *slot;
10541 hti = (struct mips_htab_traverse_info *) data;
10542 htab = mips_elf_hash_table (hti->info);
4dfe6ac6 10543 BFD_ASSERT (htab != NULL);
861fb55a
DJ
10544
10545 /* Create the section contents, if we haven't already. */
10546 s = stub->stub_section;
10547 loc = s->contents;
10548 if (loc == NULL)
10549 {
10550 loc = bfd_malloc (s->size);
10551 if (loc == NULL)
10552 {
10553 hti->error = TRUE;
10554 return FALSE;
10555 }
10556 s->contents = loc;
10557 }
10558
10559 /* Work out where in the section this stub should go. */
10560 offset = stub->offset;
10561
10562 /* Work out the target address. */
8f0c309a
CLT
10563 target = mips_elf_get_la25_target (stub, &s);
10564 target += s->output_section->vma + s->output_offset;
10565
861fb55a
DJ
10566 target_high = ((target + 0x8000) >> 16) & 0xffff;
10567 target_low = (target & 0xffff);
10568
10569 if (stub->stub_section != htab->strampoline)
10570 {
df58fc94 10571 /* This is a simple LUI/ADDIU stub. Zero out the beginning
861fb55a
DJ
10572 of the section and write the two instructions at the end. */
10573 memset (loc, 0, offset);
10574 loc += offset;
df58fc94
RS
10575 if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
10576 {
d21911ea
MR
10577 bfd_put_micromips_32 (hti->output_bfd,
10578 LA25_LUI_MICROMIPS (target_high),
10579 loc);
10580 bfd_put_micromips_32 (hti->output_bfd,
10581 LA25_ADDIU_MICROMIPS (target_low),
10582 loc + 4);
df58fc94
RS
10583 }
10584 else
10585 {
10586 bfd_put_32 (hti->output_bfd, LA25_LUI (target_high), loc);
10587 bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 4);
10588 }
861fb55a
DJ
10589 }
10590 else
10591 {
10592 /* This is trampoline. */
10593 loc += offset;
df58fc94
RS
10594 if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
10595 {
d21911ea
MR
10596 bfd_put_micromips_32 (hti->output_bfd,
10597 LA25_LUI_MICROMIPS (target_high), loc);
10598 bfd_put_micromips_32 (hti->output_bfd,
10599 LA25_J_MICROMIPS (target), loc + 4);
10600 bfd_put_micromips_32 (hti->output_bfd,
10601 LA25_ADDIU_MICROMIPS (target_low), loc + 8);
df58fc94
RS
10602 bfd_put_32 (hti->output_bfd, 0, loc + 12);
10603 }
10604 else
10605 {
10606 bfd_put_32 (hti->output_bfd, LA25_LUI (target_high), loc);
10607 bfd_put_32 (hti->output_bfd, LA25_J (target), loc + 4);
10608 bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 8);
10609 bfd_put_32 (hti->output_bfd, 0, loc + 12);
10610 }
861fb55a
DJ
10611 }
10612 return TRUE;
10613}
10614
b49e97c9
TS
10615/* If NAME is one of the special IRIX6 symbols defined by the linker,
10616 adjust it appropriately now. */
10617
10618static void
9719ad41
RS
10619mips_elf_irix6_finish_dynamic_symbol (bfd *abfd ATTRIBUTE_UNUSED,
10620 const char *name, Elf_Internal_Sym *sym)
b49e97c9
TS
10621{
10622 /* The linker script takes care of providing names and values for
10623 these, but we must place them into the right sections. */
10624 static const char* const text_section_symbols[] = {
10625 "_ftext",
10626 "_etext",
10627 "__dso_displacement",
10628 "__elf_header",
10629 "__program_header_table",
10630 NULL
10631 };
10632
10633 static const char* const data_section_symbols[] = {
10634 "_fdata",
10635 "_edata",
10636 "_end",
10637 "_fbss",
10638 NULL
10639 };
10640
10641 const char* const *p;
10642 int i;
10643
10644 for (i = 0; i < 2; ++i)
10645 for (p = (i == 0) ? text_section_symbols : data_section_symbols;
10646 *p;
10647 ++p)
10648 if (strcmp (*p, name) == 0)
10649 {
10650 /* All of these symbols are given type STT_SECTION by the
10651 IRIX6 linker. */
10652 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
e10609d3 10653 sym->st_other = STO_PROTECTED;
b49e97c9
TS
10654
10655 /* The IRIX linker puts these symbols in special sections. */
10656 if (i == 0)
10657 sym->st_shndx = SHN_MIPS_TEXT;
10658 else
10659 sym->st_shndx = SHN_MIPS_DATA;
10660
10661 break;
10662 }
10663}
10664
10665/* Finish up dynamic symbol handling. We set the contents of various
10666 dynamic sections here. */
10667
b34976b6 10668bfd_boolean
9719ad41
RS
10669_bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
10670 struct bfd_link_info *info,
10671 struct elf_link_hash_entry *h,
10672 Elf_Internal_Sym *sym)
b49e97c9
TS
10673{
10674 bfd *dynobj;
b49e97c9 10675 asection *sgot;
f4416af6 10676 struct mips_got_info *g, *gg;
b49e97c9 10677 const char *name;
3d6746ca 10678 int idx;
5108fc1b 10679 struct mips_elf_link_hash_table *htab;
738e5348 10680 struct mips_elf_link_hash_entry *hmips;
b49e97c9 10681
5108fc1b 10682 htab = mips_elf_hash_table (info);
4dfe6ac6 10683 BFD_ASSERT (htab != NULL);
b49e97c9 10684 dynobj = elf_hash_table (info)->dynobj;
738e5348 10685 hmips = (struct mips_elf_link_hash_entry *) h;
b49e97c9 10686
861fb55a
DJ
10687 BFD_ASSERT (!htab->is_vxworks);
10688
1bbce132
MR
10689 if (h->plt.plist != NULL
10690 && (h->plt.plist->mips_offset != MINUS_ONE
10691 || h->plt.plist->comp_offset != MINUS_ONE))
861fb55a
DJ
10692 {
10693 /* We've decided to create a PLT entry for this symbol. */
10694 bfd_byte *loc;
1bbce132 10695 bfd_vma header_address, got_address;
861fb55a 10696 bfd_vma got_address_high, got_address_low, load;
1bbce132
MR
10697 bfd_vma got_index;
10698 bfd_vma isa_bit;
10699
10700 got_index = h->plt.plist->gotplt_index;
861fb55a
DJ
10701
10702 BFD_ASSERT (htab->use_plts_and_copy_relocs);
10703 BFD_ASSERT (h->dynindx != -1);
10704 BFD_ASSERT (htab->splt != NULL);
1bbce132 10705 BFD_ASSERT (got_index != MINUS_ONE);
861fb55a
DJ
10706 BFD_ASSERT (!h->def_regular);
10707
10708 /* Calculate the address of the PLT header. */
1bbce132 10709 isa_bit = htab->plt_header_is_comp;
861fb55a 10710 header_address = (htab->splt->output_section->vma
1bbce132 10711 + htab->splt->output_offset + isa_bit);
861fb55a
DJ
10712
10713 /* Calculate the address of the .got.plt entry. */
10714 got_address = (htab->sgotplt->output_section->vma
10715 + htab->sgotplt->output_offset
1bbce132
MR
10716 + got_index * MIPS_ELF_GOT_SIZE (dynobj));
10717
861fb55a
DJ
10718 got_address_high = ((got_address + 0x8000) >> 16) & 0xffff;
10719 got_address_low = got_address & 0xffff;
10720
10721 /* Initially point the .got.plt entry at the PLT header. */
1bbce132 10722 loc = (htab->sgotplt->contents + got_index * MIPS_ELF_GOT_SIZE (dynobj));
861fb55a
DJ
10723 if (ABI_64_P (output_bfd))
10724 bfd_put_64 (output_bfd, header_address, loc);
10725 else
10726 bfd_put_32 (output_bfd, header_address, loc);
10727
1bbce132
MR
10728 /* Now handle the PLT itself. First the standard entry (the order
10729 does not matter, we just have to pick one). */
10730 if (h->plt.plist->mips_offset != MINUS_ONE)
10731 {
10732 const bfd_vma *plt_entry;
10733 bfd_vma plt_offset;
861fb55a 10734
1bbce132 10735 plt_offset = htab->plt_header_size + h->plt.plist->mips_offset;
861fb55a 10736
1bbce132 10737 BFD_ASSERT (plt_offset <= htab->splt->size);
6d30f5b2 10738
1bbce132
MR
10739 /* Find out where the .plt entry should go. */
10740 loc = htab->splt->contents + plt_offset;
10741
10742 /* Pick the load opcode. */
10743 load = MIPS_ELF_LOAD_WORD (output_bfd);
10744
10745 /* Fill in the PLT entry itself. */
7361da2c
AB
10746
10747 if (MIPSR6_P (output_bfd))
10748 plt_entry = mipsr6_exec_plt_entry;
10749 else
10750 plt_entry = mips_exec_plt_entry;
1bbce132
MR
10751 bfd_put_32 (output_bfd, plt_entry[0] | got_address_high, loc);
10752 bfd_put_32 (output_bfd, plt_entry[1] | got_address_low | load,
10753 loc + 4);
10754
10755 if (! LOAD_INTERLOCKS_P (output_bfd))
10756 {
10757 bfd_put_32 (output_bfd, plt_entry[2] | got_address_low, loc + 8);
10758 bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
10759 }
10760 else
10761 {
10762 bfd_put_32 (output_bfd, plt_entry[3], loc + 8);
10763 bfd_put_32 (output_bfd, plt_entry[2] | got_address_low,
10764 loc + 12);
10765 }
6d30f5b2 10766 }
1bbce132
MR
10767
10768 /* Now the compressed entry. They come after any standard ones. */
10769 if (h->plt.plist->comp_offset != MINUS_ONE)
6d30f5b2 10770 {
1bbce132
MR
10771 bfd_vma plt_offset;
10772
10773 plt_offset = (htab->plt_header_size + htab->plt_mips_offset
10774 + h->plt.plist->comp_offset);
10775
10776 BFD_ASSERT (plt_offset <= htab->splt->size);
10777
10778 /* Find out where the .plt entry should go. */
10779 loc = htab->splt->contents + plt_offset;
10780
10781 /* Fill in the PLT entry itself. */
833794fc
MR
10782 if (!MICROMIPS_P (output_bfd))
10783 {
10784 const bfd_vma *plt_entry = mips16_o32_exec_plt_entry;
10785
10786 bfd_put_16 (output_bfd, plt_entry[0], loc);
10787 bfd_put_16 (output_bfd, plt_entry[1], loc + 2);
10788 bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
10789 bfd_put_16 (output_bfd, plt_entry[3], loc + 6);
10790 bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
10791 bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
10792 bfd_put_32 (output_bfd, got_address, loc + 12);
10793 }
10794 else if (htab->insn32)
10795 {
10796 const bfd_vma *plt_entry = micromips_insn32_o32_exec_plt_entry;
10797
10798 bfd_put_16 (output_bfd, plt_entry[0], loc);
10799 bfd_put_16 (output_bfd, got_address_high, loc + 2);
10800 bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
10801 bfd_put_16 (output_bfd, got_address_low, loc + 6);
10802 bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
10803 bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
10804 bfd_put_16 (output_bfd, plt_entry[6], loc + 12);
10805 bfd_put_16 (output_bfd, got_address_low, loc + 14);
10806 }
10807 else
1bbce132
MR
10808 {
10809 const bfd_vma *plt_entry = micromips_o32_exec_plt_entry;
10810 bfd_signed_vma gotpc_offset;
10811 bfd_vma loc_address;
10812
10813 BFD_ASSERT (got_address % 4 == 0);
10814
10815 loc_address = (htab->splt->output_section->vma
10816 + htab->splt->output_offset + plt_offset);
10817 gotpc_offset = got_address - ((loc_address | 3) ^ 3);
10818
10819 /* ADDIUPC has a span of +/-16MB, check we're in range. */
10820 if (gotpc_offset + 0x1000000 >= 0x2000000)
10821 {
4eca0228 10822 _bfd_error_handler
1bbce132
MR
10823 (_("%B: `%A' offset of %ld from `%A' "
10824 "beyond the range of ADDIUPC"),
10825 output_bfd,
10826 htab->sgotplt->output_section,
10827 htab->splt->output_section,
10828 (long) gotpc_offset);
10829 bfd_set_error (bfd_error_no_error);
10830 return FALSE;
10831 }
10832 bfd_put_16 (output_bfd,
10833 plt_entry[0] | ((gotpc_offset >> 18) & 0x7f), loc);
10834 bfd_put_16 (output_bfd, (gotpc_offset >> 2) & 0xffff, loc + 2);
10835 bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
10836 bfd_put_16 (output_bfd, plt_entry[3], loc + 6);
10837 bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
10838 bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
10839 }
6d30f5b2 10840 }
861fb55a
DJ
10841
10842 /* Emit an R_MIPS_JUMP_SLOT relocation against the .got.plt entry. */
10843 mips_elf_output_dynamic_relocation (output_bfd, htab->srelplt,
1bbce132 10844 got_index - 2, h->dynindx,
861fb55a
DJ
10845 R_MIPS_JUMP_SLOT, got_address);
10846
10847 /* We distinguish between PLT entries and lazy-binding stubs by
10848 giving the former an st_other value of STO_MIPS_PLT. Set the
10849 flag and leave the value if there are any relocations in the
10850 binary where pointer equality matters. */
10851 sym->st_shndx = SHN_UNDEF;
10852 if (h->pointer_equality_needed)
1bbce132 10853 sym->st_other = ELF_ST_SET_MIPS_PLT (sym->st_other);
861fb55a 10854 else
1bbce132
MR
10855 {
10856 sym->st_value = 0;
10857 sym->st_other = 0;
10858 }
861fb55a 10859 }
1bbce132
MR
10860
10861 if (h->plt.plist != NULL && h->plt.plist->stub_offset != MINUS_ONE)
b49e97c9 10862 {
861fb55a 10863 /* We've decided to create a lazy-binding stub. */
1bbce132
MR
10864 bfd_boolean micromips_p = MICROMIPS_P (output_bfd);
10865 unsigned int other = micromips_p ? STO_MICROMIPS : 0;
10866 bfd_vma stub_size = htab->function_stub_size;
5108fc1b 10867 bfd_byte stub[MIPS_FUNCTION_STUB_BIG_SIZE];
1bbce132
MR
10868 bfd_vma isa_bit = micromips_p;
10869 bfd_vma stub_big_size;
10870
833794fc 10871 if (!micromips_p)
1bbce132 10872 stub_big_size = MIPS_FUNCTION_STUB_BIG_SIZE;
833794fc
MR
10873 else if (htab->insn32)
10874 stub_big_size = MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE;
10875 else
10876 stub_big_size = MICROMIPS_FUNCTION_STUB_BIG_SIZE;
b49e97c9
TS
10877
10878 /* This symbol has a stub. Set it up. */
10879
10880 BFD_ASSERT (h->dynindx != -1);
10881
1bbce132 10882 BFD_ASSERT (stub_size == stub_big_size || h->dynindx <= 0xffff);
3d6746ca
DD
10883
10884 /* Values up to 2^31 - 1 are allowed. Larger values would cause
5108fc1b
RS
10885 sign extension at runtime in the stub, resulting in a negative
10886 index value. */
10887 if (h->dynindx & ~0x7fffffff)
b34976b6 10888 return FALSE;
b49e97c9
TS
10889
10890 /* Fill the stub. */
1bbce132
MR
10891 if (micromips_p)
10892 {
10893 idx = 0;
10894 bfd_put_micromips_32 (output_bfd, STUB_LW_MICROMIPS (output_bfd),
10895 stub + idx);
10896 idx += 4;
833794fc
MR
10897 if (htab->insn32)
10898 {
10899 bfd_put_micromips_32 (output_bfd,
40fc1451 10900 STUB_MOVE32_MICROMIPS, stub + idx);
833794fc
MR
10901 idx += 4;
10902 }
10903 else
10904 {
10905 bfd_put_16 (output_bfd, STUB_MOVE_MICROMIPS, stub + idx);
10906 idx += 2;
10907 }
1bbce132
MR
10908 if (stub_size == stub_big_size)
10909 {
10910 long dynindx_hi = (h->dynindx >> 16) & 0x7fff;
10911
10912 bfd_put_micromips_32 (output_bfd,
10913 STUB_LUI_MICROMIPS (dynindx_hi),
10914 stub + idx);
10915 idx += 4;
10916 }
833794fc
MR
10917 if (htab->insn32)
10918 {
10919 bfd_put_micromips_32 (output_bfd, STUB_JALR32_MICROMIPS,
10920 stub + idx);
10921 idx += 4;
10922 }
10923 else
10924 {
10925 bfd_put_16 (output_bfd, STUB_JALR_MICROMIPS, stub + idx);
10926 idx += 2;
10927 }
1bbce132
MR
10928
10929 /* If a large stub is not required and sign extension is not a
10930 problem, then use legacy code in the stub. */
10931 if (stub_size == stub_big_size)
10932 bfd_put_micromips_32 (output_bfd,
10933 STUB_ORI_MICROMIPS (h->dynindx & 0xffff),
10934 stub + idx);
10935 else if (h->dynindx & ~0x7fff)
10936 bfd_put_micromips_32 (output_bfd,
10937 STUB_LI16U_MICROMIPS (h->dynindx & 0xffff),
10938 stub + idx);
10939 else
10940 bfd_put_micromips_32 (output_bfd,
10941 STUB_LI16S_MICROMIPS (output_bfd,
10942 h->dynindx),
10943 stub + idx);
10944 }
3d6746ca 10945 else
1bbce132
MR
10946 {
10947 idx = 0;
10948 bfd_put_32 (output_bfd, STUB_LW (output_bfd), stub + idx);
10949 idx += 4;
40fc1451 10950 bfd_put_32 (output_bfd, STUB_MOVE, stub + idx);
1bbce132
MR
10951 idx += 4;
10952 if (stub_size == stub_big_size)
10953 {
10954 bfd_put_32 (output_bfd, STUB_LUI ((h->dynindx >> 16) & 0x7fff),
10955 stub + idx);
10956 idx += 4;
10957 }
10958 bfd_put_32 (output_bfd, STUB_JALR, stub + idx);
10959 idx += 4;
10960
10961 /* If a large stub is not required and sign extension is not a
10962 problem, then use legacy code in the stub. */
10963 if (stub_size == stub_big_size)
10964 bfd_put_32 (output_bfd, STUB_ORI (h->dynindx & 0xffff),
10965 stub + idx);
10966 else if (h->dynindx & ~0x7fff)
10967 bfd_put_32 (output_bfd, STUB_LI16U (h->dynindx & 0xffff),
10968 stub + idx);
10969 else
10970 bfd_put_32 (output_bfd, STUB_LI16S (output_bfd, h->dynindx),
10971 stub + idx);
10972 }
5108fc1b 10973
1bbce132
MR
10974 BFD_ASSERT (h->plt.plist->stub_offset <= htab->sstubs->size);
10975 memcpy (htab->sstubs->contents + h->plt.plist->stub_offset,
10976 stub, stub_size);
b49e97c9 10977
1bbce132 10978 /* Mark the symbol as undefined. stub_offset != -1 occurs
b49e97c9
TS
10979 only for the referenced symbol. */
10980 sym->st_shndx = SHN_UNDEF;
10981
10982 /* The run-time linker uses the st_value field of the symbol
10983 to reset the global offset table entry for this external
10984 to its stub address when unlinking a shared object. */
4e41d0d7
RS
10985 sym->st_value = (htab->sstubs->output_section->vma
10986 + htab->sstubs->output_offset
1bbce132
MR
10987 + h->plt.plist->stub_offset
10988 + isa_bit);
10989 sym->st_other = other;
b49e97c9
TS
10990 }
10991
738e5348
RS
10992 /* If we have a MIPS16 function with a stub, the dynamic symbol must
10993 refer to the stub, since only the stub uses the standard calling
10994 conventions. */
10995 if (h->dynindx != -1 && hmips->fn_stub != NULL)
10996 {
10997 BFD_ASSERT (hmips->need_fn_stub);
10998 sym->st_value = (hmips->fn_stub->output_section->vma
10999 + hmips->fn_stub->output_offset);
11000 sym->st_size = hmips->fn_stub->size;
11001 sym->st_other = ELF_ST_VISIBILITY (sym->st_other);
11002 }
11003
b49e97c9 11004 BFD_ASSERT (h->dynindx != -1
f5385ebf 11005 || h->forced_local);
b49e97c9 11006
23cc69b6 11007 sgot = htab->sgot;
a8028dd0 11008 g = htab->got_info;
b49e97c9
TS
11009 BFD_ASSERT (g != NULL);
11010
11011 /* Run through the global symbol table, creating GOT entries for all
11012 the symbols that need them. */
020d7251 11013 if (hmips->global_got_area != GGA_NONE)
b49e97c9
TS
11014 {
11015 bfd_vma offset;
11016 bfd_vma value;
11017
6eaa6adc 11018 value = sym->st_value;
13fbec83 11019 offset = mips_elf_primary_global_got_index (output_bfd, info, h);
b49e97c9
TS
11020 MIPS_ELF_PUT_WORD (output_bfd, value, sgot->contents + offset);
11021 }
11022
e641e783 11023 if (hmips->global_got_area != GGA_NONE && g->next)
f4416af6
AO
11024 {
11025 struct mips_got_entry e, *p;
0626d451 11026 bfd_vma entry;
f4416af6 11027 bfd_vma offset;
f4416af6
AO
11028
11029 gg = g;
11030
11031 e.abfd = output_bfd;
11032 e.symndx = -1;
738e5348 11033 e.d.h = hmips;
9ab066b4 11034 e.tls_type = GOT_TLS_NONE;
143d77c5 11035
f4416af6
AO
11036 for (g = g->next; g->next != gg; g = g->next)
11037 {
11038 if (g->got_entries
11039 && (p = (struct mips_got_entry *) htab_find (g->got_entries,
11040 &e)))
11041 {
11042 offset = p->gotidx;
6c42ddb9 11043 BFD_ASSERT (offset > 0 && offset < htab->sgot->size);
0e1862bb 11044 if (bfd_link_pic (info)
0626d451
RS
11045 || (elf_hash_table (info)->dynamic_sections_created
11046 && p->d.h != NULL
f5385ebf
AM
11047 && p->d.h->root.def_dynamic
11048 && !p->d.h->root.def_regular))
0626d451
RS
11049 {
11050 /* Create an R_MIPS_REL32 relocation for this entry. Due to
11051 the various compatibility problems, it's easier to mock
11052 up an R_MIPS_32 or R_MIPS_64 relocation and leave
11053 mips_elf_create_dynamic_relocation to calculate the
11054 appropriate addend. */
11055 Elf_Internal_Rela rel[3];
11056
11057 memset (rel, 0, sizeof (rel));
11058 if (ABI_64_P (output_bfd))
11059 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_64);
11060 else
11061 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_32);
11062 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
11063
11064 entry = 0;
11065 if (! (mips_elf_create_dynamic_relocation
11066 (output_bfd, info, rel,
11067 e.d.h, NULL, sym->st_value, &entry, sgot)))
11068 return FALSE;
11069 }
11070 else
11071 entry = sym->st_value;
11072 MIPS_ELF_PUT_WORD (output_bfd, entry, sgot->contents + offset);
f4416af6
AO
11073 }
11074 }
11075 }
11076
b49e97c9
TS
11077 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
11078 name = h->root.root.string;
9637f6ef 11079 if (h == elf_hash_table (info)->hdynamic
22edb2f1 11080 || h == elf_hash_table (info)->hgot)
b49e97c9
TS
11081 sym->st_shndx = SHN_ABS;
11082 else if (strcmp (name, "_DYNAMIC_LINK") == 0
11083 || strcmp (name, "_DYNAMIC_LINKING") == 0)
11084 {
11085 sym->st_shndx = SHN_ABS;
11086 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11087 sym->st_value = 1;
11088 }
4a14403c 11089 else if (strcmp (name, "_gp_disp") == 0 && ! NEWABI_P (output_bfd))
b49e97c9
TS
11090 {
11091 sym->st_shndx = SHN_ABS;
11092 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11093 sym->st_value = elf_gp (output_bfd);
11094 }
11095 else if (SGI_COMPAT (output_bfd))
11096 {
11097 if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
11098 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
11099 {
11100 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11101 sym->st_other = STO_PROTECTED;
11102 sym->st_value = 0;
11103 sym->st_shndx = SHN_MIPS_DATA;
11104 }
11105 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
11106 {
11107 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11108 sym->st_other = STO_PROTECTED;
11109 sym->st_value = mips_elf_hash_table (info)->procedure_count;
11110 sym->st_shndx = SHN_ABS;
11111 }
11112 else if (sym->st_shndx != SHN_UNDEF && sym->st_shndx != SHN_ABS)
11113 {
11114 if (h->type == STT_FUNC)
11115 sym->st_shndx = SHN_MIPS_TEXT;
11116 else if (h->type == STT_OBJECT)
11117 sym->st_shndx = SHN_MIPS_DATA;
11118 }
11119 }
11120
861fb55a
DJ
11121 /* Emit a copy reloc, if needed. */
11122 if (h->needs_copy)
11123 {
11124 asection *s;
11125 bfd_vma symval;
11126
11127 BFD_ASSERT (h->dynindx != -1);
11128 BFD_ASSERT (htab->use_plts_and_copy_relocs);
11129
11130 s = mips_elf_rel_dyn_section (info, FALSE);
11131 symval = (h->root.u.def.section->output_section->vma
11132 + h->root.u.def.section->output_offset
11133 + h->root.u.def.value);
11134 mips_elf_output_dynamic_relocation (output_bfd, s, s->reloc_count++,
11135 h->dynindx, R_MIPS_COPY, symval);
11136 }
11137
b49e97c9
TS
11138 /* Handle the IRIX6-specific symbols. */
11139 if (IRIX_COMPAT (output_bfd) == ict_irix6)
11140 mips_elf_irix6_finish_dynamic_symbol (output_bfd, name, sym);
11141
cbf8d970
MR
11142 /* Keep dynamic compressed symbols odd. This allows the dynamic linker
11143 to treat compressed symbols like any other. */
30c09090 11144 if (ELF_ST_IS_MIPS16 (sym->st_other))
738e5348
RS
11145 {
11146 BFD_ASSERT (sym->st_value & 1);
11147 sym->st_other -= STO_MIPS16;
11148 }
cbf8d970
MR
11149 else if (ELF_ST_IS_MICROMIPS (sym->st_other))
11150 {
11151 BFD_ASSERT (sym->st_value & 1);
11152 sym->st_other -= STO_MICROMIPS;
11153 }
b49e97c9 11154
b34976b6 11155 return TRUE;
b49e97c9
TS
11156}
11157
0a44bf69
RS
11158/* Likewise, for VxWorks. */
11159
11160bfd_boolean
11161_bfd_mips_vxworks_finish_dynamic_symbol (bfd *output_bfd,
11162 struct bfd_link_info *info,
11163 struct elf_link_hash_entry *h,
11164 Elf_Internal_Sym *sym)
11165{
11166 bfd *dynobj;
11167 asection *sgot;
11168 struct mips_got_info *g;
11169 struct mips_elf_link_hash_table *htab;
020d7251 11170 struct mips_elf_link_hash_entry *hmips;
0a44bf69
RS
11171
11172 htab = mips_elf_hash_table (info);
4dfe6ac6 11173 BFD_ASSERT (htab != NULL);
0a44bf69 11174 dynobj = elf_hash_table (info)->dynobj;
020d7251 11175 hmips = (struct mips_elf_link_hash_entry *) h;
0a44bf69 11176
1bbce132 11177 if (h->plt.plist != NULL && h->plt.plist->mips_offset != MINUS_ONE)
0a44bf69 11178 {
6d79d2ed 11179 bfd_byte *loc;
1bbce132 11180 bfd_vma plt_address, got_address, got_offset, branch_offset;
0a44bf69
RS
11181 Elf_Internal_Rela rel;
11182 static const bfd_vma *plt_entry;
1bbce132
MR
11183 bfd_vma gotplt_index;
11184 bfd_vma plt_offset;
11185
11186 plt_offset = htab->plt_header_size + h->plt.plist->mips_offset;
11187 gotplt_index = h->plt.plist->gotplt_index;
0a44bf69
RS
11188
11189 BFD_ASSERT (h->dynindx != -1);
11190 BFD_ASSERT (htab->splt != NULL);
1bbce132
MR
11191 BFD_ASSERT (gotplt_index != MINUS_ONE);
11192 BFD_ASSERT (plt_offset <= htab->splt->size);
0a44bf69
RS
11193
11194 /* Calculate the address of the .plt entry. */
11195 plt_address = (htab->splt->output_section->vma
11196 + htab->splt->output_offset
1bbce132 11197 + plt_offset);
0a44bf69
RS
11198
11199 /* Calculate the address of the .got.plt entry. */
11200 got_address = (htab->sgotplt->output_section->vma
11201 + htab->sgotplt->output_offset
1bbce132 11202 + gotplt_index * MIPS_ELF_GOT_SIZE (output_bfd));
0a44bf69
RS
11203
11204 /* Calculate the offset of the .got.plt entry from
11205 _GLOBAL_OFFSET_TABLE_. */
11206 got_offset = mips_elf_gotplt_index (info, h);
11207
11208 /* Calculate the offset for the branch at the start of the PLT
11209 entry. The branch jumps to the beginning of .plt. */
1bbce132 11210 branch_offset = -(plt_offset / 4 + 1) & 0xffff;
0a44bf69
RS
11211
11212 /* Fill in the initial value of the .got.plt entry. */
11213 bfd_put_32 (output_bfd, plt_address,
1bbce132
MR
11214 (htab->sgotplt->contents
11215 + gotplt_index * MIPS_ELF_GOT_SIZE (output_bfd)));
0a44bf69
RS
11216
11217 /* Find out where the .plt entry should go. */
1bbce132 11218 loc = htab->splt->contents + plt_offset;
0a44bf69 11219
0e1862bb 11220 if (bfd_link_pic (info))
0a44bf69
RS
11221 {
11222 plt_entry = mips_vxworks_shared_plt_entry;
11223 bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
1bbce132 11224 bfd_put_32 (output_bfd, plt_entry[1] | gotplt_index, loc + 4);
0a44bf69
RS
11225 }
11226 else
11227 {
11228 bfd_vma got_address_high, got_address_low;
11229
11230 plt_entry = mips_vxworks_exec_plt_entry;
11231 got_address_high = ((got_address + 0x8000) >> 16) & 0xffff;
11232 got_address_low = got_address & 0xffff;
11233
11234 bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
1bbce132 11235 bfd_put_32 (output_bfd, plt_entry[1] | gotplt_index, loc + 4);
0a44bf69
RS
11236 bfd_put_32 (output_bfd, plt_entry[2] | got_address_high, loc + 8);
11237 bfd_put_32 (output_bfd, plt_entry[3] | got_address_low, loc + 12);
11238 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11239 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11240 bfd_put_32 (output_bfd, plt_entry[6], loc + 24);
11241 bfd_put_32 (output_bfd, plt_entry[7], loc + 28);
11242
11243 loc = (htab->srelplt2->contents
1bbce132 11244 + (gotplt_index * 3 + 2) * sizeof (Elf32_External_Rela));
0a44bf69
RS
11245
11246 /* Emit a relocation for the .got.plt entry. */
11247 rel.r_offset = got_address;
11248 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
1bbce132 11249 rel.r_addend = plt_offset;
0a44bf69
RS
11250 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11251
11252 /* Emit a relocation for the lui of %hi(<.got.plt slot>). */
11253 loc += sizeof (Elf32_External_Rela);
11254 rel.r_offset = plt_address + 8;
11255 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11256 rel.r_addend = got_offset;
11257 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11258
11259 /* Emit a relocation for the addiu of %lo(<.got.plt slot>). */
11260 loc += sizeof (Elf32_External_Rela);
11261 rel.r_offset += 4;
11262 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11263 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11264 }
11265
11266 /* Emit an R_MIPS_JUMP_SLOT relocation against the .got.plt entry. */
1bbce132
MR
11267 loc = (htab->srelplt->contents
11268 + gotplt_index * sizeof (Elf32_External_Rela));
0a44bf69
RS
11269 rel.r_offset = got_address;
11270 rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_JUMP_SLOT);
11271 rel.r_addend = 0;
11272 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11273
11274 if (!h->def_regular)
11275 sym->st_shndx = SHN_UNDEF;
11276 }
11277
11278 BFD_ASSERT (h->dynindx != -1 || h->forced_local);
11279
23cc69b6 11280 sgot = htab->sgot;
a8028dd0 11281 g = htab->got_info;
0a44bf69
RS
11282 BFD_ASSERT (g != NULL);
11283
11284 /* See if this symbol has an entry in the GOT. */
020d7251 11285 if (hmips->global_got_area != GGA_NONE)
0a44bf69
RS
11286 {
11287 bfd_vma offset;
11288 Elf_Internal_Rela outrel;
11289 bfd_byte *loc;
11290 asection *s;
11291
11292 /* Install the symbol value in the GOT. */
13fbec83 11293 offset = mips_elf_primary_global_got_index (output_bfd, info, h);
0a44bf69
RS
11294 MIPS_ELF_PUT_WORD (output_bfd, sym->st_value, sgot->contents + offset);
11295
11296 /* Add a dynamic relocation for it. */
11297 s = mips_elf_rel_dyn_section (info, FALSE);
11298 loc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
11299 outrel.r_offset = (sgot->output_section->vma
11300 + sgot->output_offset
11301 + offset);
11302 outrel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_32);
11303 outrel.r_addend = 0;
11304 bfd_elf32_swap_reloca_out (dynobj, &outrel, loc);
11305 }
11306
11307 /* Emit a copy reloc, if needed. */
11308 if (h->needs_copy)
11309 {
11310 Elf_Internal_Rela rel;
11311
11312 BFD_ASSERT (h->dynindx != -1);
11313
11314 rel.r_offset = (h->root.u.def.section->output_section->vma
11315 + h->root.u.def.section->output_offset
11316 + h->root.u.def.value);
11317 rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_COPY);
11318 rel.r_addend = 0;
11319 bfd_elf32_swap_reloca_out (output_bfd, &rel,
11320 htab->srelbss->contents
11321 + (htab->srelbss->reloc_count
11322 * sizeof (Elf32_External_Rela)));
11323 ++htab->srelbss->reloc_count;
11324 }
11325
df58fc94
RS
11326 /* If this is a mips16/microMIPS symbol, force the value to be even. */
11327 if (ELF_ST_IS_COMPRESSED (sym->st_other))
0a44bf69
RS
11328 sym->st_value &= ~1;
11329
11330 return TRUE;
11331}
11332
861fb55a
DJ
11333/* Write out a plt0 entry to the beginning of .plt. */
11334
1bbce132 11335static bfd_boolean
861fb55a
DJ
11336mips_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
11337{
11338 bfd_byte *loc;
11339 bfd_vma gotplt_value, gotplt_value_high, gotplt_value_low;
11340 static const bfd_vma *plt_entry;
11341 struct mips_elf_link_hash_table *htab;
11342
11343 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
11344 BFD_ASSERT (htab != NULL);
11345
861fb55a
DJ
11346 if (ABI_64_P (output_bfd))
11347 plt_entry = mips_n64_exec_plt0_entry;
11348 else if (ABI_N32_P (output_bfd))
11349 plt_entry = mips_n32_exec_plt0_entry;
833794fc 11350 else if (!htab->plt_header_is_comp)
861fb55a 11351 plt_entry = mips_o32_exec_plt0_entry;
833794fc
MR
11352 else if (htab->insn32)
11353 plt_entry = micromips_insn32_o32_exec_plt0_entry;
11354 else
11355 plt_entry = micromips_o32_exec_plt0_entry;
861fb55a
DJ
11356
11357 /* Calculate the value of .got.plt. */
11358 gotplt_value = (htab->sgotplt->output_section->vma
11359 + htab->sgotplt->output_offset);
11360 gotplt_value_high = ((gotplt_value + 0x8000) >> 16) & 0xffff;
11361 gotplt_value_low = gotplt_value & 0xffff;
11362
11363 /* The PLT sequence is not safe for N64 if .got.plt's address can
11364 not be loaded in two instructions. */
11365 BFD_ASSERT ((gotplt_value & ~(bfd_vma) 0x7fffffff) == 0
11366 || ~(gotplt_value | 0x7fffffff) == 0);
11367
11368 /* Install the PLT header. */
11369 loc = htab->splt->contents;
1bbce132
MR
11370 if (plt_entry == micromips_o32_exec_plt0_entry)
11371 {
11372 bfd_vma gotpc_offset;
11373 bfd_vma loc_address;
11374 size_t i;
11375
11376 BFD_ASSERT (gotplt_value % 4 == 0);
11377
11378 loc_address = (htab->splt->output_section->vma
11379 + htab->splt->output_offset);
11380 gotpc_offset = gotplt_value - ((loc_address | 3) ^ 3);
11381
11382 /* ADDIUPC has a span of +/-16MB, check we're in range. */
11383 if (gotpc_offset + 0x1000000 >= 0x2000000)
11384 {
4eca0228 11385 _bfd_error_handler
1bbce132
MR
11386 (_("%B: `%A' offset of %ld from `%A' beyond the range of ADDIUPC"),
11387 output_bfd,
11388 htab->sgotplt->output_section,
11389 htab->splt->output_section,
11390 (long) gotpc_offset);
11391 bfd_set_error (bfd_error_no_error);
11392 return FALSE;
11393 }
11394 bfd_put_16 (output_bfd,
11395 plt_entry[0] | ((gotpc_offset >> 18) & 0x7f), loc);
11396 bfd_put_16 (output_bfd, (gotpc_offset >> 2) & 0xffff, loc + 2);
11397 for (i = 2; i < ARRAY_SIZE (micromips_o32_exec_plt0_entry); i++)
11398 bfd_put_16 (output_bfd, plt_entry[i], loc + (i * 2));
11399 }
833794fc
MR
11400 else if (plt_entry == micromips_insn32_o32_exec_plt0_entry)
11401 {
11402 size_t i;
11403
11404 bfd_put_16 (output_bfd, plt_entry[0], loc);
11405 bfd_put_16 (output_bfd, gotplt_value_high, loc + 2);
11406 bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11407 bfd_put_16 (output_bfd, gotplt_value_low, loc + 6);
11408 bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11409 bfd_put_16 (output_bfd, gotplt_value_low, loc + 10);
11410 for (i = 6; i < ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry); i++)
11411 bfd_put_16 (output_bfd, plt_entry[i], loc + (i * 2));
11412 }
1bbce132
MR
11413 else
11414 {
11415 bfd_put_32 (output_bfd, plt_entry[0] | gotplt_value_high, loc);
11416 bfd_put_32 (output_bfd, plt_entry[1] | gotplt_value_low, loc + 4);
11417 bfd_put_32 (output_bfd, plt_entry[2] | gotplt_value_low, loc + 8);
11418 bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
11419 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11420 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11421 bfd_put_32 (output_bfd, plt_entry[6], loc + 24);
11422 bfd_put_32 (output_bfd, plt_entry[7], loc + 28);
11423 }
11424
11425 return TRUE;
861fb55a
DJ
11426}
11427
0a44bf69
RS
11428/* Install the PLT header for a VxWorks executable and finalize the
11429 contents of .rela.plt.unloaded. */
11430
11431static void
11432mips_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
11433{
11434 Elf_Internal_Rela rela;
11435 bfd_byte *loc;
11436 bfd_vma got_value, got_value_high, got_value_low, plt_address;
11437 static const bfd_vma *plt_entry;
11438 struct mips_elf_link_hash_table *htab;
11439
11440 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
11441 BFD_ASSERT (htab != NULL);
11442
0a44bf69
RS
11443 plt_entry = mips_vxworks_exec_plt0_entry;
11444
11445 /* Calculate the value of _GLOBAL_OFFSET_TABLE_. */
11446 got_value = (htab->root.hgot->root.u.def.section->output_section->vma
11447 + htab->root.hgot->root.u.def.section->output_offset
11448 + htab->root.hgot->root.u.def.value);
11449
11450 got_value_high = ((got_value + 0x8000) >> 16) & 0xffff;
11451 got_value_low = got_value & 0xffff;
11452
11453 /* Calculate the address of the PLT header. */
11454 plt_address = htab->splt->output_section->vma + htab->splt->output_offset;
11455
11456 /* Install the PLT header. */
11457 loc = htab->splt->contents;
11458 bfd_put_32 (output_bfd, plt_entry[0] | got_value_high, loc);
11459 bfd_put_32 (output_bfd, plt_entry[1] | got_value_low, loc + 4);
11460 bfd_put_32 (output_bfd, plt_entry[2], loc + 8);
11461 bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
11462 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11463 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11464
11465 /* Output the relocation for the lui of %hi(_GLOBAL_OFFSET_TABLE_). */
11466 loc = htab->srelplt2->contents;
11467 rela.r_offset = plt_address;
11468 rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11469 rela.r_addend = 0;
11470 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
11471 loc += sizeof (Elf32_External_Rela);
11472
11473 /* Output the relocation for the following addiu of
11474 %lo(_GLOBAL_OFFSET_TABLE_). */
11475 rela.r_offset += 4;
11476 rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11477 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
11478 loc += sizeof (Elf32_External_Rela);
11479
11480 /* Fix up the remaining relocations. They may have the wrong
11481 symbol index for _G_O_T_ or _P_L_T_ depending on the order
11482 in which symbols were output. */
11483 while (loc < htab->srelplt2->contents + htab->srelplt2->size)
11484 {
11485 Elf_Internal_Rela rel;
11486
11487 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11488 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
11489 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11490 loc += sizeof (Elf32_External_Rela);
11491
11492 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11493 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11494 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11495 loc += sizeof (Elf32_External_Rela);
11496
11497 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11498 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11499 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11500 loc += sizeof (Elf32_External_Rela);
11501 }
11502}
11503
11504/* Install the PLT header for a VxWorks shared library. */
11505
11506static void
11507mips_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info)
11508{
11509 unsigned int i;
11510 struct mips_elf_link_hash_table *htab;
11511
11512 htab = mips_elf_hash_table (info);
4dfe6ac6 11513 BFD_ASSERT (htab != NULL);
0a44bf69
RS
11514
11515 /* We just need to copy the entry byte-by-byte. */
11516 for (i = 0; i < ARRAY_SIZE (mips_vxworks_shared_plt0_entry); i++)
11517 bfd_put_32 (output_bfd, mips_vxworks_shared_plt0_entry[i],
11518 htab->splt->contents + i * 4);
11519}
11520
b49e97c9
TS
11521/* Finish up the dynamic sections. */
11522
b34976b6 11523bfd_boolean
9719ad41
RS
11524_bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
11525 struct bfd_link_info *info)
b49e97c9
TS
11526{
11527 bfd *dynobj;
11528 asection *sdyn;
11529 asection *sgot;
f4416af6 11530 struct mips_got_info *gg, *g;
0a44bf69 11531 struct mips_elf_link_hash_table *htab;
b49e97c9 11532
0a44bf69 11533 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
11534 BFD_ASSERT (htab != NULL);
11535
b49e97c9
TS
11536 dynobj = elf_hash_table (info)->dynobj;
11537
3d4d4302 11538 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
b49e97c9 11539
23cc69b6
RS
11540 sgot = htab->sgot;
11541 gg = htab->got_info;
b49e97c9
TS
11542
11543 if (elf_hash_table (info)->dynamic_sections_created)
11544 {
11545 bfd_byte *b;
943284cc 11546 int dyn_to_skip = 0, dyn_skipped = 0;
b49e97c9
TS
11547
11548 BFD_ASSERT (sdyn != NULL);
23cc69b6
RS
11549 BFD_ASSERT (gg != NULL);
11550
d7206569 11551 g = mips_elf_bfd_got (output_bfd, FALSE);
b49e97c9
TS
11552 BFD_ASSERT (g != NULL);
11553
11554 for (b = sdyn->contents;
eea6121a 11555 b < sdyn->contents + sdyn->size;
b49e97c9
TS
11556 b += MIPS_ELF_DYN_SIZE (dynobj))
11557 {
11558 Elf_Internal_Dyn dyn;
11559 const char *name;
11560 size_t elemsize;
11561 asection *s;
b34976b6 11562 bfd_boolean swap_out_p;
b49e97c9
TS
11563
11564 /* Read in the current dynamic entry. */
11565 (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
11566
11567 /* Assume that we're going to modify it and write it out. */
b34976b6 11568 swap_out_p = TRUE;
b49e97c9
TS
11569
11570 switch (dyn.d_tag)
11571 {
11572 case DT_RELENT:
b49e97c9
TS
11573 dyn.d_un.d_val = MIPS_ELF_REL_SIZE (dynobj);
11574 break;
11575
0a44bf69
RS
11576 case DT_RELAENT:
11577 BFD_ASSERT (htab->is_vxworks);
11578 dyn.d_un.d_val = MIPS_ELF_RELA_SIZE (dynobj);
11579 break;
11580
b49e97c9
TS
11581 case DT_STRSZ:
11582 /* Rewrite DT_STRSZ. */
11583 dyn.d_un.d_val =
11584 _bfd_elf_strtab_size (elf_hash_table (info)->dynstr);
11585 break;
11586
11587 case DT_PLTGOT:
861fb55a
DJ
11588 s = htab->sgot;
11589 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
11590 break;
11591
11592 case DT_MIPS_PLTGOT:
11593 s = htab->sgotplt;
11594 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
b49e97c9
TS
11595 break;
11596
11597 case DT_MIPS_RLD_VERSION:
11598 dyn.d_un.d_val = 1; /* XXX */
11599 break;
11600
11601 case DT_MIPS_FLAGS:
11602 dyn.d_un.d_val = RHF_NOTPOT; /* XXX */
11603 break;
11604
b49e97c9 11605 case DT_MIPS_TIME_STAMP:
6edfbbad
DJ
11606 {
11607 time_t t;
11608 time (&t);
11609 dyn.d_un.d_val = t;
11610 }
b49e97c9
TS
11611 break;
11612
11613 case DT_MIPS_ICHECKSUM:
11614 /* XXX FIXME: */
b34976b6 11615 swap_out_p = FALSE;
b49e97c9
TS
11616 break;
11617
11618 case DT_MIPS_IVERSION:
11619 /* XXX FIXME: */
b34976b6 11620 swap_out_p = FALSE;
b49e97c9
TS
11621 break;
11622
11623 case DT_MIPS_BASE_ADDRESS:
11624 s = output_bfd->sections;
11625 BFD_ASSERT (s != NULL);
11626 dyn.d_un.d_ptr = s->vma & ~(bfd_vma) 0xffff;
11627 break;
11628
11629 case DT_MIPS_LOCAL_GOTNO:
11630 dyn.d_un.d_val = g->local_gotno;
11631 break;
11632
11633 case DT_MIPS_UNREFEXTNO:
11634 /* The index into the dynamic symbol table which is the
11635 entry of the first external symbol that is not
11636 referenced within the same object. */
11637 dyn.d_un.d_val = bfd_count_sections (output_bfd) + 1;
11638 break;
11639
11640 case DT_MIPS_GOTSYM:
d222d210 11641 if (htab->global_gotsym)
b49e97c9 11642 {
d222d210 11643 dyn.d_un.d_val = htab->global_gotsym->dynindx;
b49e97c9
TS
11644 break;
11645 }
11646 /* In case if we don't have global got symbols we default
11647 to setting DT_MIPS_GOTSYM to the same value as
11648 DT_MIPS_SYMTABNO, so we just fall through. */
11649
11650 case DT_MIPS_SYMTABNO:
11651 name = ".dynsym";
11652 elemsize = MIPS_ELF_SYM_SIZE (output_bfd);
4ade44b7 11653 s = bfd_get_linker_section (dynobj, name);
b49e97c9 11654
131e2f8e
MF
11655 if (s != NULL)
11656 dyn.d_un.d_val = s->size / elemsize;
11657 else
11658 dyn.d_un.d_val = 0;
b49e97c9
TS
11659 break;
11660
11661 case DT_MIPS_HIPAGENO:
861fb55a 11662 dyn.d_un.d_val = g->local_gotno - htab->reserved_gotno;
b49e97c9
TS
11663 break;
11664
11665 case DT_MIPS_RLD_MAP:
b4082c70
DD
11666 {
11667 struct elf_link_hash_entry *h;
11668 h = mips_elf_hash_table (info)->rld_symbol;
11669 if (!h)
11670 {
11671 dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
11672 swap_out_p = FALSE;
11673 break;
11674 }
11675 s = h->root.u.def.section;
a5499fa4
MF
11676
11677 /* The MIPS_RLD_MAP tag stores the absolute address of the
11678 debug pointer. */
b4082c70
DD
11679 dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
11680 + h->root.u.def.value);
11681 }
b49e97c9
TS
11682 break;
11683
a5499fa4
MF
11684 case DT_MIPS_RLD_MAP_REL:
11685 {
11686 struct elf_link_hash_entry *h;
11687 bfd_vma dt_addr, rld_addr;
11688 h = mips_elf_hash_table (info)->rld_symbol;
11689 if (!h)
11690 {
11691 dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
11692 swap_out_p = FALSE;
11693 break;
11694 }
11695 s = h->root.u.def.section;
11696
11697 /* The MIPS_RLD_MAP_REL tag stores the offset to the debug
11698 pointer, relative to the address of the tag. */
11699 dt_addr = (sdyn->output_section->vma + sdyn->output_offset
d5cff5df 11700 + (b - sdyn->contents));
a5499fa4
MF
11701 rld_addr = (s->output_section->vma + s->output_offset
11702 + h->root.u.def.value);
11703 dyn.d_un.d_ptr = rld_addr - dt_addr;
11704 }
11705 break;
11706
b49e97c9
TS
11707 case DT_MIPS_OPTIONS:
11708 s = (bfd_get_section_by_name
11709 (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (output_bfd)));
11710 dyn.d_un.d_ptr = s->vma;
11711 break;
11712
0a44bf69
RS
11713 case DT_RELASZ:
11714 BFD_ASSERT (htab->is_vxworks);
11715 /* The count does not include the JUMP_SLOT relocations. */
11716 if (htab->srelplt)
11717 dyn.d_un.d_val -= htab->srelplt->size;
11718 break;
11719
11720 case DT_PLTREL:
861fb55a
DJ
11721 BFD_ASSERT (htab->use_plts_and_copy_relocs);
11722 if (htab->is_vxworks)
11723 dyn.d_un.d_val = DT_RELA;
11724 else
11725 dyn.d_un.d_val = DT_REL;
0a44bf69
RS
11726 break;
11727
11728 case DT_PLTRELSZ:
861fb55a 11729 BFD_ASSERT (htab->use_plts_and_copy_relocs);
0a44bf69
RS
11730 dyn.d_un.d_val = htab->srelplt->size;
11731 break;
11732
11733 case DT_JMPREL:
861fb55a
DJ
11734 BFD_ASSERT (htab->use_plts_and_copy_relocs);
11735 dyn.d_un.d_ptr = (htab->srelplt->output_section->vma
0a44bf69
RS
11736 + htab->srelplt->output_offset);
11737 break;
11738
943284cc
DJ
11739 case DT_TEXTREL:
11740 /* If we didn't need any text relocations after all, delete
11741 the dynamic tag. */
11742 if (!(info->flags & DF_TEXTREL))
11743 {
11744 dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
11745 swap_out_p = FALSE;
11746 }
11747 break;
11748
11749 case DT_FLAGS:
11750 /* If we didn't need any text relocations after all, clear
11751 DF_TEXTREL from DT_FLAGS. */
11752 if (!(info->flags & DF_TEXTREL))
11753 dyn.d_un.d_val &= ~DF_TEXTREL;
11754 else
11755 swap_out_p = FALSE;
11756 break;
11757
b49e97c9 11758 default:
b34976b6 11759 swap_out_p = FALSE;
7a2b07ff
NS
11760 if (htab->is_vxworks
11761 && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
11762 swap_out_p = TRUE;
b49e97c9
TS
11763 break;
11764 }
11765
943284cc 11766 if (swap_out_p || dyn_skipped)
b49e97c9 11767 (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
943284cc
DJ
11768 (dynobj, &dyn, b - dyn_skipped);
11769
11770 if (dyn_to_skip)
11771 {
11772 dyn_skipped += dyn_to_skip;
11773 dyn_to_skip = 0;
11774 }
b49e97c9 11775 }
943284cc
DJ
11776
11777 /* Wipe out any trailing entries if we shifted down a dynamic tag. */
11778 if (dyn_skipped > 0)
11779 memset (b - dyn_skipped, 0, dyn_skipped);
b49e97c9
TS
11780 }
11781
b55fd4d4
DJ
11782 if (sgot != NULL && sgot->size > 0
11783 && !bfd_is_abs_section (sgot->output_section))
b49e97c9 11784 {
0a44bf69
RS
11785 if (htab->is_vxworks)
11786 {
11787 /* The first entry of the global offset table points to the
11788 ".dynamic" section. The second is initialized by the
11789 loader and contains the shared library identifier.
11790 The third is also initialized by the loader and points
11791 to the lazy resolution stub. */
11792 MIPS_ELF_PUT_WORD (output_bfd,
11793 sdyn->output_offset + sdyn->output_section->vma,
11794 sgot->contents);
11795 MIPS_ELF_PUT_WORD (output_bfd, 0,
11796 sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
11797 MIPS_ELF_PUT_WORD (output_bfd, 0,
11798 sgot->contents
11799 + 2 * MIPS_ELF_GOT_SIZE (output_bfd));
11800 }
11801 else
11802 {
11803 /* The first entry of the global offset table will be filled at
11804 runtime. The second entry will be used by some runtime loaders.
11805 This isn't the case of IRIX rld. */
11806 MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0, sgot->contents);
51e38d68 11807 MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
0a44bf69
RS
11808 sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
11809 }
b49e97c9 11810
54938e2a
TS
11811 elf_section_data (sgot->output_section)->this_hdr.sh_entsize
11812 = MIPS_ELF_GOT_SIZE (output_bfd);
11813 }
b49e97c9 11814
f4416af6
AO
11815 /* Generate dynamic relocations for the non-primary gots. */
11816 if (gg != NULL && gg->next)
11817 {
11818 Elf_Internal_Rela rel[3];
11819 bfd_vma addend = 0;
11820
11821 memset (rel, 0, sizeof (rel));
11822 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_REL32);
11823
11824 for (g = gg->next; g->next != gg; g = g->next)
11825 {
91d6fa6a 11826 bfd_vma got_index = g->next->local_gotno + g->next->global_gotno
0f20cc35 11827 + g->next->tls_gotno;
f4416af6 11828
9719ad41 11829 MIPS_ELF_PUT_WORD (output_bfd, 0, sgot->contents
91d6fa6a 11830 + got_index++ * MIPS_ELF_GOT_SIZE (output_bfd));
51e38d68
RS
11831 MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
11832 sgot->contents
91d6fa6a 11833 + got_index++ * MIPS_ELF_GOT_SIZE (output_bfd));
f4416af6 11834
0e1862bb 11835 if (! bfd_link_pic (info))
f4416af6
AO
11836 continue;
11837
cb22ccf4 11838 for (; got_index < g->local_gotno; got_index++)
f4416af6 11839 {
cb22ccf4
KCY
11840 if (got_index >= g->assigned_low_gotno
11841 && got_index <= g->assigned_high_gotno)
11842 continue;
11843
f4416af6 11844 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset
cb22ccf4 11845 = got_index * MIPS_ELF_GOT_SIZE (output_bfd);
f4416af6
AO
11846 if (!(mips_elf_create_dynamic_relocation
11847 (output_bfd, info, rel, NULL,
11848 bfd_abs_section_ptr,
11849 0, &addend, sgot)))
11850 return FALSE;
11851 BFD_ASSERT (addend == 0);
11852 }
11853 }
11854 }
11855
3133ddbf
DJ
11856 /* The generation of dynamic relocations for the non-primary gots
11857 adds more dynamic relocations. We cannot count them until
11858 here. */
11859
11860 if (elf_hash_table (info)->dynamic_sections_created)
11861 {
11862 bfd_byte *b;
11863 bfd_boolean swap_out_p;
11864
11865 BFD_ASSERT (sdyn != NULL);
11866
11867 for (b = sdyn->contents;
11868 b < sdyn->contents + sdyn->size;
11869 b += MIPS_ELF_DYN_SIZE (dynobj))
11870 {
11871 Elf_Internal_Dyn dyn;
11872 asection *s;
11873
11874 /* Read in the current dynamic entry. */
11875 (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
11876
11877 /* Assume that we're going to modify it and write it out. */
11878 swap_out_p = TRUE;
11879
11880 switch (dyn.d_tag)
11881 {
11882 case DT_RELSZ:
11883 /* Reduce DT_RELSZ to account for any relocations we
11884 decided not to make. This is for the n64 irix rld,
11885 which doesn't seem to apply any relocations if there
11886 are trailing null entries. */
0a44bf69 11887 s = mips_elf_rel_dyn_section (info, FALSE);
3133ddbf
DJ
11888 dyn.d_un.d_val = (s->reloc_count
11889 * (ABI_64_P (output_bfd)
11890 ? sizeof (Elf64_Mips_External_Rel)
11891 : sizeof (Elf32_External_Rel)));
bcfdf036
RS
11892 /* Adjust the section size too. Tools like the prelinker
11893 can reasonably expect the values to the same. */
11894 elf_section_data (s->output_section)->this_hdr.sh_size
11895 = dyn.d_un.d_val;
3133ddbf
DJ
11896 break;
11897
11898 default:
11899 swap_out_p = FALSE;
11900 break;
11901 }
11902
11903 if (swap_out_p)
11904 (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
11905 (dynobj, &dyn, b);
11906 }
11907 }
11908
b49e97c9 11909 {
b49e97c9
TS
11910 asection *s;
11911 Elf32_compact_rel cpt;
11912
b49e97c9
TS
11913 if (SGI_COMPAT (output_bfd))
11914 {
11915 /* Write .compact_rel section out. */
3d4d4302 11916 s = bfd_get_linker_section (dynobj, ".compact_rel");
b49e97c9
TS
11917 if (s != NULL)
11918 {
11919 cpt.id1 = 1;
11920 cpt.num = s->reloc_count;
11921 cpt.id2 = 2;
11922 cpt.offset = (s->output_section->filepos
11923 + sizeof (Elf32_External_compact_rel));
11924 cpt.reserved0 = 0;
11925 cpt.reserved1 = 0;
11926 bfd_elf32_swap_compact_rel_out (output_bfd, &cpt,
11927 ((Elf32_External_compact_rel *)
11928 s->contents));
11929
11930 /* Clean up a dummy stub function entry in .text. */
4e41d0d7 11931 if (htab->sstubs != NULL)
b49e97c9
TS
11932 {
11933 file_ptr dummy_offset;
11934
4e41d0d7
RS
11935 BFD_ASSERT (htab->sstubs->size >= htab->function_stub_size);
11936 dummy_offset = htab->sstubs->size - htab->function_stub_size;
11937 memset (htab->sstubs->contents + dummy_offset, 0,
5108fc1b 11938 htab->function_stub_size);
b49e97c9
TS
11939 }
11940 }
11941 }
11942
0a44bf69
RS
11943 /* The psABI says that the dynamic relocations must be sorted in
11944 increasing order of r_symndx. The VxWorks EABI doesn't require
11945 this, and because the code below handles REL rather than RELA
11946 relocations, using it for VxWorks would be outright harmful. */
11947 if (!htab->is_vxworks)
b49e97c9 11948 {
0a44bf69
RS
11949 s = mips_elf_rel_dyn_section (info, FALSE);
11950 if (s != NULL
11951 && s->size > (bfd_vma)2 * MIPS_ELF_REL_SIZE (output_bfd))
11952 {
11953 reldyn_sorting_bfd = output_bfd;
b49e97c9 11954
0a44bf69
RS
11955 if (ABI_64_P (output_bfd))
11956 qsort ((Elf64_External_Rel *) s->contents + 1,
11957 s->reloc_count - 1, sizeof (Elf64_Mips_External_Rel),
11958 sort_dynamic_relocs_64);
11959 else
11960 qsort ((Elf32_External_Rel *) s->contents + 1,
11961 s->reloc_count - 1, sizeof (Elf32_External_Rel),
11962 sort_dynamic_relocs);
11963 }
b49e97c9 11964 }
b49e97c9
TS
11965 }
11966
861fb55a 11967 if (htab->splt && htab->splt->size > 0)
0a44bf69 11968 {
861fb55a
DJ
11969 if (htab->is_vxworks)
11970 {
0e1862bb 11971 if (bfd_link_pic (info))
861fb55a
DJ
11972 mips_vxworks_finish_shared_plt (output_bfd, info);
11973 else
11974 mips_vxworks_finish_exec_plt (output_bfd, info);
11975 }
0a44bf69 11976 else
861fb55a 11977 {
0e1862bb 11978 BFD_ASSERT (!bfd_link_pic (info));
1bbce132
MR
11979 if (!mips_finish_exec_plt (output_bfd, info))
11980 return FALSE;
861fb55a 11981 }
0a44bf69 11982 }
b34976b6 11983 return TRUE;
b49e97c9
TS
11984}
11985
b49e97c9 11986
64543e1a
RS
11987/* Set ABFD's EF_MIPS_ARCH and EF_MIPS_MACH flags. */
11988
11989static void
9719ad41 11990mips_set_isa_flags (bfd *abfd)
b49e97c9 11991{
64543e1a 11992 flagword val;
b49e97c9
TS
11993
11994 switch (bfd_get_mach (abfd))
11995 {
11996 default:
11997 case bfd_mach_mips3000:
11998 val = E_MIPS_ARCH_1;
11999 break;
12000
12001 case bfd_mach_mips3900:
12002 val = E_MIPS_ARCH_1 | E_MIPS_MACH_3900;
12003 break;
12004
12005 case bfd_mach_mips6000:
12006 val = E_MIPS_ARCH_2;
12007 break;
12008
12009 case bfd_mach_mips4000:
12010 case bfd_mach_mips4300:
12011 case bfd_mach_mips4400:
12012 case bfd_mach_mips4600:
12013 val = E_MIPS_ARCH_3;
12014 break;
12015
12016 case bfd_mach_mips4010:
12017 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4010;
12018 break;
12019
12020 case bfd_mach_mips4100:
12021 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4100;
12022 break;
12023
12024 case bfd_mach_mips4111:
12025 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4111;
12026 break;
12027
00707a0e
RS
12028 case bfd_mach_mips4120:
12029 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4120;
12030 break;
12031
b49e97c9
TS
12032 case bfd_mach_mips4650:
12033 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4650;
12034 break;
12035
00707a0e
RS
12036 case bfd_mach_mips5400:
12037 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5400;
12038 break;
12039
12040 case bfd_mach_mips5500:
12041 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5500;
12042 break;
12043
e407c74b
NC
12044 case bfd_mach_mips5900:
12045 val = E_MIPS_ARCH_3 | E_MIPS_MACH_5900;
12046 break;
12047
0d2e43ed
ILT
12048 case bfd_mach_mips9000:
12049 val = E_MIPS_ARCH_4 | E_MIPS_MACH_9000;
12050 break;
12051
b49e97c9 12052 case bfd_mach_mips5000:
5a7ea749 12053 case bfd_mach_mips7000:
b49e97c9
TS
12054 case bfd_mach_mips8000:
12055 case bfd_mach_mips10000:
12056 case bfd_mach_mips12000:
3aa3176b
TS
12057 case bfd_mach_mips14000:
12058 case bfd_mach_mips16000:
b49e97c9
TS
12059 val = E_MIPS_ARCH_4;
12060 break;
12061
12062 case bfd_mach_mips5:
12063 val = E_MIPS_ARCH_5;
12064 break;
12065
350cc38d
MS
12066 case bfd_mach_mips_loongson_2e:
12067 val = E_MIPS_ARCH_3 | E_MIPS_MACH_LS2E;
12068 break;
12069
12070 case bfd_mach_mips_loongson_2f:
12071 val = E_MIPS_ARCH_3 | E_MIPS_MACH_LS2F;
12072 break;
12073
b49e97c9
TS
12074 case bfd_mach_mips_sb1:
12075 val = E_MIPS_ARCH_64 | E_MIPS_MACH_SB1;
12076 break;
12077
d051516a 12078 case bfd_mach_mips_loongson_3a:
4ba154f5 12079 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_LS3A;
d051516a
NC
12080 break;
12081
6f179bd0 12082 case bfd_mach_mips_octeon:
dd6a37e7 12083 case bfd_mach_mips_octeonp:
6f179bd0
AN
12084 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_OCTEON;
12085 break;
12086
2c629856
N
12087 case bfd_mach_mips_octeon3:
12088 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_OCTEON3;
12089 break;
12090
52b6b6b9
JM
12091 case bfd_mach_mips_xlr:
12092 val = E_MIPS_ARCH_64 | E_MIPS_MACH_XLR;
12093 break;
12094
432233b3
AP
12095 case bfd_mach_mips_octeon2:
12096 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_OCTEON2;
12097 break;
12098
b49e97c9
TS
12099 case bfd_mach_mipsisa32:
12100 val = E_MIPS_ARCH_32;
12101 break;
12102
12103 case bfd_mach_mipsisa64:
12104 val = E_MIPS_ARCH_64;
af7ee8bf
CD
12105 break;
12106
12107 case bfd_mach_mipsisa32r2:
ae52f483
AB
12108 case bfd_mach_mipsisa32r3:
12109 case bfd_mach_mipsisa32r5:
af7ee8bf
CD
12110 val = E_MIPS_ARCH_32R2;
12111 break;
5f74bc13
CD
12112
12113 case bfd_mach_mipsisa64r2:
ae52f483
AB
12114 case bfd_mach_mipsisa64r3:
12115 case bfd_mach_mipsisa64r5:
5f74bc13
CD
12116 val = E_MIPS_ARCH_64R2;
12117 break;
7361da2c
AB
12118
12119 case bfd_mach_mipsisa32r6:
12120 val = E_MIPS_ARCH_32R6;
12121 break;
12122
12123 case bfd_mach_mipsisa64r6:
12124 val = E_MIPS_ARCH_64R6;
12125 break;
b49e97c9 12126 }
b49e97c9
TS
12127 elf_elfheader (abfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
12128 elf_elfheader (abfd)->e_flags |= val;
12129
64543e1a
RS
12130}
12131
12132
28dbcedc
AM
12133/* Whether to sort relocs output by ld -r or ld --emit-relocs, by r_offset.
12134 Don't do so for code sections. We want to keep ordering of HI16/LO16
12135 as is. On the other hand, elf-eh-frame.c processing requires .eh_frame
12136 relocs to be sorted. */
12137
12138bfd_boolean
12139_bfd_mips_elf_sort_relocs_p (asection *sec)
12140{
12141 return (sec->flags & SEC_CODE) == 0;
12142}
12143
12144
64543e1a
RS
12145/* The final processing done just before writing out a MIPS ELF object
12146 file. This gets the MIPS architecture right based on the machine
12147 number. This is used by both the 32-bit and the 64-bit ABI. */
12148
12149void
9719ad41
RS
12150_bfd_mips_elf_final_write_processing (bfd *abfd,
12151 bfd_boolean linker ATTRIBUTE_UNUSED)
64543e1a
RS
12152{
12153 unsigned int i;
12154 Elf_Internal_Shdr **hdrpp;
12155 const char *name;
12156 asection *sec;
12157
12158 /* Keep the existing EF_MIPS_MACH and EF_MIPS_ARCH flags if the former
12159 is nonzero. This is for compatibility with old objects, which used
12160 a combination of a 32-bit EF_MIPS_ARCH and a 64-bit EF_MIPS_MACH. */
12161 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == 0)
12162 mips_set_isa_flags (abfd);
12163
b49e97c9
TS
12164 /* Set the sh_info field for .gptab sections and other appropriate
12165 info for each special section. */
12166 for (i = 1, hdrpp = elf_elfsections (abfd) + 1;
12167 i < elf_numsections (abfd);
12168 i++, hdrpp++)
12169 {
12170 switch ((*hdrpp)->sh_type)
12171 {
12172 case SHT_MIPS_MSYM:
12173 case SHT_MIPS_LIBLIST:
12174 sec = bfd_get_section_by_name (abfd, ".dynstr");
12175 if (sec != NULL)
12176 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12177 break;
12178
12179 case SHT_MIPS_GPTAB:
12180 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
12181 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
12182 BFD_ASSERT (name != NULL
0112cd26 12183 && CONST_STRNEQ (name, ".gptab."));
b49e97c9
TS
12184 sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
12185 BFD_ASSERT (sec != NULL);
12186 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
12187 break;
12188
12189 case SHT_MIPS_CONTENT:
12190 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
12191 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
12192 BFD_ASSERT (name != NULL
0112cd26 12193 && CONST_STRNEQ (name, ".MIPS.content"));
b49e97c9
TS
12194 sec = bfd_get_section_by_name (abfd,
12195 name + sizeof ".MIPS.content" - 1);
12196 BFD_ASSERT (sec != NULL);
12197 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12198 break;
12199
12200 case SHT_MIPS_SYMBOL_LIB:
12201 sec = bfd_get_section_by_name (abfd, ".dynsym");
12202 if (sec != NULL)
12203 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12204 sec = bfd_get_section_by_name (abfd, ".liblist");
12205 if (sec != NULL)
12206 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
12207 break;
12208
12209 case SHT_MIPS_EVENTS:
12210 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
12211 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
12212 BFD_ASSERT (name != NULL);
0112cd26 12213 if (CONST_STRNEQ (name, ".MIPS.events"))
b49e97c9
TS
12214 sec = bfd_get_section_by_name (abfd,
12215 name + sizeof ".MIPS.events" - 1);
12216 else
12217 {
0112cd26 12218 BFD_ASSERT (CONST_STRNEQ (name, ".MIPS.post_rel"));
b49e97c9
TS
12219 sec = bfd_get_section_by_name (abfd,
12220 (name
12221 + sizeof ".MIPS.post_rel" - 1));
12222 }
12223 BFD_ASSERT (sec != NULL);
12224 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12225 break;
12226
12227 }
12228 }
12229}
12230\f
8dc1a139 12231/* When creating an IRIX5 executable, we need REGINFO and RTPROC
b49e97c9
TS
12232 segments. */
12233
12234int
a6b96beb
AM
12235_bfd_mips_elf_additional_program_headers (bfd *abfd,
12236 struct bfd_link_info *info ATTRIBUTE_UNUSED)
b49e97c9
TS
12237{
12238 asection *s;
12239 int ret = 0;
12240
12241 /* See if we need a PT_MIPS_REGINFO segment. */
12242 s = bfd_get_section_by_name (abfd, ".reginfo");
12243 if (s && (s->flags & SEC_LOAD))
12244 ++ret;
12245
351cdf24
MF
12246 /* See if we need a PT_MIPS_ABIFLAGS segment. */
12247 if (bfd_get_section_by_name (abfd, ".MIPS.abiflags"))
12248 ++ret;
12249
b49e97c9
TS
12250 /* See if we need a PT_MIPS_OPTIONS segment. */
12251 if (IRIX_COMPAT (abfd) == ict_irix6
12252 && bfd_get_section_by_name (abfd,
12253 MIPS_ELF_OPTIONS_SECTION_NAME (abfd)))
12254 ++ret;
12255
12256 /* See if we need a PT_MIPS_RTPROC segment. */
12257 if (IRIX_COMPAT (abfd) == ict_irix5
12258 && bfd_get_section_by_name (abfd, ".dynamic")
12259 && bfd_get_section_by_name (abfd, ".mdebug"))
12260 ++ret;
12261
98c904a8
RS
12262 /* Allocate a PT_NULL header in dynamic objects. See
12263 _bfd_mips_elf_modify_segment_map for details. */
12264 if (!SGI_COMPAT (abfd)
12265 && bfd_get_section_by_name (abfd, ".dynamic"))
12266 ++ret;
12267
b49e97c9
TS
12268 return ret;
12269}
12270
8dc1a139 12271/* Modify the segment map for an IRIX5 executable. */
b49e97c9 12272
b34976b6 12273bfd_boolean
9719ad41 12274_bfd_mips_elf_modify_segment_map (bfd *abfd,
7c8b76cc 12275 struct bfd_link_info *info)
b49e97c9
TS
12276{
12277 asection *s;
12278 struct elf_segment_map *m, **pm;
12279 bfd_size_type amt;
12280
12281 /* If there is a .reginfo section, we need a PT_MIPS_REGINFO
12282 segment. */
12283 s = bfd_get_section_by_name (abfd, ".reginfo");
12284 if (s != NULL && (s->flags & SEC_LOAD) != 0)
12285 {
12bd6957 12286 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
b49e97c9
TS
12287 if (m->p_type == PT_MIPS_REGINFO)
12288 break;
12289 if (m == NULL)
12290 {
12291 amt = sizeof *m;
9719ad41 12292 m = bfd_zalloc (abfd, amt);
b49e97c9 12293 if (m == NULL)
b34976b6 12294 return FALSE;
b49e97c9
TS
12295
12296 m->p_type = PT_MIPS_REGINFO;
12297 m->count = 1;
12298 m->sections[0] = s;
12299
12300 /* We want to put it after the PHDR and INTERP segments. */
12bd6957 12301 pm = &elf_seg_map (abfd);
b49e97c9
TS
12302 while (*pm != NULL
12303 && ((*pm)->p_type == PT_PHDR
12304 || (*pm)->p_type == PT_INTERP))
12305 pm = &(*pm)->next;
12306
12307 m->next = *pm;
12308 *pm = m;
12309 }
12310 }
12311
351cdf24
MF
12312 /* If there is a .MIPS.abiflags section, we need a PT_MIPS_ABIFLAGS
12313 segment. */
12314 s = bfd_get_section_by_name (abfd, ".MIPS.abiflags");
12315 if (s != NULL && (s->flags & SEC_LOAD) != 0)
12316 {
12317 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
12318 if (m->p_type == PT_MIPS_ABIFLAGS)
12319 break;
12320 if (m == NULL)
12321 {
12322 amt = sizeof *m;
12323 m = bfd_zalloc (abfd, amt);
12324 if (m == NULL)
12325 return FALSE;
12326
12327 m->p_type = PT_MIPS_ABIFLAGS;
12328 m->count = 1;
12329 m->sections[0] = s;
12330
12331 /* We want to put it after the PHDR and INTERP segments. */
12332 pm = &elf_seg_map (abfd);
12333 while (*pm != NULL
12334 && ((*pm)->p_type == PT_PHDR
12335 || (*pm)->p_type == PT_INTERP))
12336 pm = &(*pm)->next;
12337
12338 m->next = *pm;
12339 *pm = m;
12340 }
12341 }
12342
b49e97c9
TS
12343 /* For IRIX 6, we don't have .mdebug sections, nor does anything but
12344 .dynamic end up in PT_DYNAMIC. However, we do have to insert a
98a8deaf 12345 PT_MIPS_OPTIONS segment immediately following the program header
b49e97c9 12346 table. */
c1fd6598
AO
12347 if (NEWABI_P (abfd)
12348 /* On non-IRIX6 new abi, we'll have already created a segment
12349 for this section, so don't create another. I'm not sure this
12350 is not also the case for IRIX 6, but I can't test it right
12351 now. */
12352 && IRIX_COMPAT (abfd) == ict_irix6)
b49e97c9
TS
12353 {
12354 for (s = abfd->sections; s; s = s->next)
12355 if (elf_section_data (s)->this_hdr.sh_type == SHT_MIPS_OPTIONS)
12356 break;
12357
12358 if (s)
12359 {
12360 struct elf_segment_map *options_segment;
12361
12bd6957 12362 pm = &elf_seg_map (abfd);
98a8deaf
RS
12363 while (*pm != NULL
12364 && ((*pm)->p_type == PT_PHDR
12365 || (*pm)->p_type == PT_INTERP))
12366 pm = &(*pm)->next;
b49e97c9 12367
8ded5a0f
AM
12368 if (*pm == NULL || (*pm)->p_type != PT_MIPS_OPTIONS)
12369 {
12370 amt = sizeof (struct elf_segment_map);
12371 options_segment = bfd_zalloc (abfd, amt);
12372 options_segment->next = *pm;
12373 options_segment->p_type = PT_MIPS_OPTIONS;
12374 options_segment->p_flags = PF_R;
12375 options_segment->p_flags_valid = TRUE;
12376 options_segment->count = 1;
12377 options_segment->sections[0] = s;
12378 *pm = options_segment;
12379 }
b49e97c9
TS
12380 }
12381 }
12382 else
12383 {
12384 if (IRIX_COMPAT (abfd) == ict_irix5)
12385 {
12386 /* If there are .dynamic and .mdebug sections, we make a room
12387 for the RTPROC header. FIXME: Rewrite without section names. */
12388 if (bfd_get_section_by_name (abfd, ".interp") == NULL
12389 && bfd_get_section_by_name (abfd, ".dynamic") != NULL
12390 && bfd_get_section_by_name (abfd, ".mdebug") != NULL)
12391 {
12bd6957 12392 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
b49e97c9
TS
12393 if (m->p_type == PT_MIPS_RTPROC)
12394 break;
12395 if (m == NULL)
12396 {
12397 amt = sizeof *m;
9719ad41 12398 m = bfd_zalloc (abfd, amt);
b49e97c9 12399 if (m == NULL)
b34976b6 12400 return FALSE;
b49e97c9
TS
12401
12402 m->p_type = PT_MIPS_RTPROC;
12403
12404 s = bfd_get_section_by_name (abfd, ".rtproc");
12405 if (s == NULL)
12406 {
12407 m->count = 0;
12408 m->p_flags = 0;
12409 m->p_flags_valid = 1;
12410 }
12411 else
12412 {
12413 m->count = 1;
12414 m->sections[0] = s;
12415 }
12416
12417 /* We want to put it after the DYNAMIC segment. */
12bd6957 12418 pm = &elf_seg_map (abfd);
b49e97c9
TS
12419 while (*pm != NULL && (*pm)->p_type != PT_DYNAMIC)
12420 pm = &(*pm)->next;
12421 if (*pm != NULL)
12422 pm = &(*pm)->next;
12423
12424 m->next = *pm;
12425 *pm = m;
12426 }
12427 }
12428 }
8dc1a139 12429 /* On IRIX5, the PT_DYNAMIC segment includes the .dynamic,
b49e97c9
TS
12430 .dynstr, .dynsym, and .hash sections, and everything in
12431 between. */
12bd6957 12432 for (pm = &elf_seg_map (abfd); *pm != NULL;
b49e97c9
TS
12433 pm = &(*pm)->next)
12434 if ((*pm)->p_type == PT_DYNAMIC)
12435 break;
12436 m = *pm;
f6f62d6f
RS
12437 /* GNU/Linux binaries do not need the extended PT_DYNAMIC section.
12438 glibc's dynamic linker has traditionally derived the number of
12439 tags from the p_filesz field, and sometimes allocates stack
12440 arrays of that size. An overly-big PT_DYNAMIC segment can
12441 be actively harmful in such cases. Making PT_DYNAMIC contain
12442 other sections can also make life hard for the prelinker,
12443 which might move one of the other sections to a different
12444 PT_LOAD segment. */
12445 if (SGI_COMPAT (abfd)
12446 && m != NULL
12447 && m->count == 1
12448 && strcmp (m->sections[0]->name, ".dynamic") == 0)
b49e97c9
TS
12449 {
12450 static const char *sec_names[] =
12451 {
12452 ".dynamic", ".dynstr", ".dynsym", ".hash"
12453 };
12454 bfd_vma low, high;
12455 unsigned int i, c;
12456 struct elf_segment_map *n;
12457
792b4a53 12458 low = ~(bfd_vma) 0;
b49e97c9
TS
12459 high = 0;
12460 for (i = 0; i < sizeof sec_names / sizeof sec_names[0]; i++)
12461 {
12462 s = bfd_get_section_by_name (abfd, sec_names[i]);
12463 if (s != NULL && (s->flags & SEC_LOAD) != 0)
12464 {
12465 bfd_size_type sz;
12466
12467 if (low > s->vma)
12468 low = s->vma;
eea6121a 12469 sz = s->size;
b49e97c9
TS
12470 if (high < s->vma + sz)
12471 high = s->vma + sz;
12472 }
12473 }
12474
12475 c = 0;
12476 for (s = abfd->sections; s != NULL; s = s->next)
12477 if ((s->flags & SEC_LOAD) != 0
12478 && s->vma >= low
eea6121a 12479 && s->vma + s->size <= high)
b49e97c9
TS
12480 ++c;
12481
12482 amt = sizeof *n + (bfd_size_type) (c - 1) * sizeof (asection *);
9719ad41 12483 n = bfd_zalloc (abfd, amt);
b49e97c9 12484 if (n == NULL)
b34976b6 12485 return FALSE;
b49e97c9
TS
12486 *n = *m;
12487 n->count = c;
12488
12489 i = 0;
12490 for (s = abfd->sections; s != NULL; s = s->next)
12491 {
12492 if ((s->flags & SEC_LOAD) != 0
12493 && s->vma >= low
eea6121a 12494 && s->vma + s->size <= high)
b49e97c9
TS
12495 {
12496 n->sections[i] = s;
12497 ++i;
12498 }
12499 }
12500
12501 *pm = n;
12502 }
12503 }
12504
98c904a8
RS
12505 /* Allocate a spare program header in dynamic objects so that tools
12506 like the prelinker can add an extra PT_LOAD entry.
12507
12508 If the prelinker needs to make room for a new PT_LOAD entry, its
12509 standard procedure is to move the first (read-only) sections into
12510 the new (writable) segment. However, the MIPS ABI requires
12511 .dynamic to be in a read-only segment, and the section will often
12512 start within sizeof (ElfNN_Phdr) bytes of the last program header.
12513
12514 Although the prelinker could in principle move .dynamic to a
12515 writable segment, it seems better to allocate a spare program
12516 header instead, and avoid the need to move any sections.
12517 There is a long tradition of allocating spare dynamic tags,
12518 so allocating a spare program header seems like a natural
7c8b76cc
JM
12519 extension.
12520
12521 If INFO is NULL, we may be copying an already prelinked binary
12522 with objcopy or strip, so do not add this header. */
12523 if (info != NULL
12524 && !SGI_COMPAT (abfd)
98c904a8
RS
12525 && bfd_get_section_by_name (abfd, ".dynamic"))
12526 {
12bd6957 12527 for (pm = &elf_seg_map (abfd); *pm != NULL; pm = &(*pm)->next)
98c904a8
RS
12528 if ((*pm)->p_type == PT_NULL)
12529 break;
12530 if (*pm == NULL)
12531 {
12532 m = bfd_zalloc (abfd, sizeof (*m));
12533 if (m == NULL)
12534 return FALSE;
12535
12536 m->p_type = PT_NULL;
12537 *pm = m;
12538 }
12539 }
12540
b34976b6 12541 return TRUE;
b49e97c9
TS
12542}
12543\f
12544/* Return the section that should be marked against GC for a given
12545 relocation. */
12546
12547asection *
9719ad41 12548_bfd_mips_elf_gc_mark_hook (asection *sec,
07adf181 12549 struct bfd_link_info *info,
9719ad41
RS
12550 Elf_Internal_Rela *rel,
12551 struct elf_link_hash_entry *h,
12552 Elf_Internal_Sym *sym)
b49e97c9
TS
12553{
12554 /* ??? Do mips16 stub sections need to be handled special? */
12555
12556 if (h != NULL)
07adf181
AM
12557 switch (ELF_R_TYPE (sec->owner, rel->r_info))
12558 {
12559 case R_MIPS_GNU_VTINHERIT:
12560 case R_MIPS_GNU_VTENTRY:
12561 return NULL;
12562 }
b49e97c9 12563
07adf181 12564 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
b49e97c9
TS
12565}
12566
12567/* Update the got entry reference counts for the section being removed. */
12568
b34976b6 12569bfd_boolean
9719ad41
RS
12570_bfd_mips_elf_gc_sweep_hook (bfd *abfd ATTRIBUTE_UNUSED,
12571 struct bfd_link_info *info ATTRIBUTE_UNUSED,
12572 asection *sec ATTRIBUTE_UNUSED,
12573 const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED)
b49e97c9
TS
12574{
12575#if 0
12576 Elf_Internal_Shdr *symtab_hdr;
12577 struct elf_link_hash_entry **sym_hashes;
12578 bfd_signed_vma *local_got_refcounts;
12579 const Elf_Internal_Rela *rel, *relend;
12580 unsigned long r_symndx;
12581 struct elf_link_hash_entry *h;
12582
0e1862bb 12583 if (bfd_link_relocatable (info))
7dda2462
TG
12584 return TRUE;
12585
b49e97c9
TS
12586 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12587 sym_hashes = elf_sym_hashes (abfd);
12588 local_got_refcounts = elf_local_got_refcounts (abfd);
12589
12590 relend = relocs + sec->reloc_count;
12591 for (rel = relocs; rel < relend; rel++)
12592 switch (ELF_R_TYPE (abfd, rel->r_info))
12593 {
738e5348
RS
12594 case R_MIPS16_GOT16:
12595 case R_MIPS16_CALL16:
b49e97c9
TS
12596 case R_MIPS_GOT16:
12597 case R_MIPS_CALL16:
12598 case R_MIPS_CALL_HI16:
12599 case R_MIPS_CALL_LO16:
12600 case R_MIPS_GOT_HI16:
12601 case R_MIPS_GOT_LO16:
4a14403c
TS
12602 case R_MIPS_GOT_DISP:
12603 case R_MIPS_GOT_PAGE:
12604 case R_MIPS_GOT_OFST:
df58fc94
RS
12605 case R_MICROMIPS_GOT16:
12606 case R_MICROMIPS_CALL16:
12607 case R_MICROMIPS_CALL_HI16:
12608 case R_MICROMIPS_CALL_LO16:
12609 case R_MICROMIPS_GOT_HI16:
12610 case R_MICROMIPS_GOT_LO16:
12611 case R_MICROMIPS_GOT_DISP:
12612 case R_MICROMIPS_GOT_PAGE:
12613 case R_MICROMIPS_GOT_OFST:
b49e97c9
TS
12614 /* ??? It would seem that the existing MIPS code does no sort
12615 of reference counting or whatnot on its GOT and PLT entries,
12616 so it is not possible to garbage collect them at this time. */
12617 break;
12618
12619 default:
12620 break;
12621 }
12622#endif
12623
b34976b6 12624 return TRUE;
b49e97c9 12625}
351cdf24
MF
12626
12627/* Prevent .MIPS.abiflags from being discarded with --gc-sections. */
12628
12629bfd_boolean
12630_bfd_mips_elf_gc_mark_extra_sections (struct bfd_link_info *info,
12631 elf_gc_mark_hook_fn gc_mark_hook)
12632{
12633 bfd *sub;
12634
12635 _bfd_elf_gc_mark_extra_sections (info, gc_mark_hook);
12636
12637 for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
12638 {
12639 asection *o;
12640
12641 if (! is_mips_elf (sub))
12642 continue;
12643
12644 for (o = sub->sections; o != NULL; o = o->next)
12645 if (!o->gc_mark
12646 && MIPS_ELF_ABIFLAGS_SECTION_NAME_P
12647 (bfd_get_section_name (sub, o)))
12648 {
12649 if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
12650 return FALSE;
12651 }
12652 }
12653
12654 return TRUE;
12655}
b49e97c9
TS
12656\f
12657/* Copy data from a MIPS ELF indirect symbol to its direct symbol,
12658 hiding the old indirect symbol. Process additional relocation
12659 information. Also called for weakdefs, in which case we just let
12660 _bfd_elf_link_hash_copy_indirect copy the flags for us. */
12661
12662void
fcfa13d2 12663_bfd_mips_elf_copy_indirect_symbol (struct bfd_link_info *info,
9719ad41
RS
12664 struct elf_link_hash_entry *dir,
12665 struct elf_link_hash_entry *ind)
b49e97c9
TS
12666{
12667 struct mips_elf_link_hash_entry *dirmips, *indmips;
12668
fcfa13d2 12669 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
b49e97c9 12670
861fb55a
DJ
12671 dirmips = (struct mips_elf_link_hash_entry *) dir;
12672 indmips = (struct mips_elf_link_hash_entry *) ind;
12673 /* Any absolute non-dynamic relocations against an indirect or weak
12674 definition will be against the target symbol. */
12675 if (indmips->has_static_relocs)
12676 dirmips->has_static_relocs = TRUE;
12677
b49e97c9
TS
12678 if (ind->root.type != bfd_link_hash_indirect)
12679 return;
12680
b49e97c9
TS
12681 dirmips->possibly_dynamic_relocs += indmips->possibly_dynamic_relocs;
12682 if (indmips->readonly_reloc)
b34976b6 12683 dirmips->readonly_reloc = TRUE;
b49e97c9 12684 if (indmips->no_fn_stub)
b34976b6 12685 dirmips->no_fn_stub = TRUE;
61b0a4af
RS
12686 if (indmips->fn_stub)
12687 {
12688 dirmips->fn_stub = indmips->fn_stub;
12689 indmips->fn_stub = NULL;
12690 }
12691 if (indmips->need_fn_stub)
12692 {
12693 dirmips->need_fn_stub = TRUE;
12694 indmips->need_fn_stub = FALSE;
12695 }
12696 if (indmips->call_stub)
12697 {
12698 dirmips->call_stub = indmips->call_stub;
12699 indmips->call_stub = NULL;
12700 }
12701 if (indmips->call_fp_stub)
12702 {
12703 dirmips->call_fp_stub = indmips->call_fp_stub;
12704 indmips->call_fp_stub = NULL;
12705 }
634835ae
RS
12706 if (indmips->global_got_area < dirmips->global_got_area)
12707 dirmips->global_got_area = indmips->global_got_area;
12708 if (indmips->global_got_area < GGA_NONE)
12709 indmips->global_got_area = GGA_NONE;
861fb55a
DJ
12710 if (indmips->has_nonpic_branches)
12711 dirmips->has_nonpic_branches = TRUE;
b49e97c9 12712}
b49e97c9 12713\f
d01414a5
TS
12714#define PDR_SIZE 32
12715
b34976b6 12716bfd_boolean
9719ad41
RS
12717_bfd_mips_elf_discard_info (bfd *abfd, struct elf_reloc_cookie *cookie,
12718 struct bfd_link_info *info)
d01414a5
TS
12719{
12720 asection *o;
b34976b6 12721 bfd_boolean ret = FALSE;
d01414a5
TS
12722 unsigned char *tdata;
12723 size_t i, skip;
12724
12725 o = bfd_get_section_by_name (abfd, ".pdr");
12726 if (! o)
b34976b6 12727 return FALSE;
eea6121a 12728 if (o->size == 0)
b34976b6 12729 return FALSE;
eea6121a 12730 if (o->size % PDR_SIZE != 0)
b34976b6 12731 return FALSE;
d01414a5
TS
12732 if (o->output_section != NULL
12733 && bfd_is_abs_section (o->output_section))
b34976b6 12734 return FALSE;
d01414a5 12735
eea6121a 12736 tdata = bfd_zmalloc (o->size / PDR_SIZE);
d01414a5 12737 if (! tdata)
b34976b6 12738 return FALSE;
d01414a5 12739
9719ad41 12740 cookie->rels = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
45d6a902 12741 info->keep_memory);
d01414a5
TS
12742 if (!cookie->rels)
12743 {
12744 free (tdata);
b34976b6 12745 return FALSE;
d01414a5
TS
12746 }
12747
12748 cookie->rel = cookie->rels;
12749 cookie->relend = cookie->rels + o->reloc_count;
12750
eea6121a 12751 for (i = 0, skip = 0; i < o->size / PDR_SIZE; i ++)
d01414a5 12752 {
c152c796 12753 if (bfd_elf_reloc_symbol_deleted_p (i * PDR_SIZE, cookie))
d01414a5
TS
12754 {
12755 tdata[i] = 1;
12756 skip ++;
12757 }
12758 }
12759
12760 if (skip != 0)
12761 {
f0abc2a1 12762 mips_elf_section_data (o)->u.tdata = tdata;
e034b2cc
MR
12763 if (o->rawsize == 0)
12764 o->rawsize = o->size;
eea6121a 12765 o->size -= skip * PDR_SIZE;
b34976b6 12766 ret = TRUE;
d01414a5
TS
12767 }
12768 else
12769 free (tdata);
12770
12771 if (! info->keep_memory)
12772 free (cookie->rels);
12773
12774 return ret;
12775}
12776
b34976b6 12777bfd_boolean
9719ad41 12778_bfd_mips_elf_ignore_discarded_relocs (asection *sec)
53bfd6b4
MR
12779{
12780 if (strcmp (sec->name, ".pdr") == 0)
b34976b6
AM
12781 return TRUE;
12782 return FALSE;
53bfd6b4 12783}
d01414a5 12784
b34976b6 12785bfd_boolean
c7b8f16e
JB
12786_bfd_mips_elf_write_section (bfd *output_bfd,
12787 struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
12788 asection *sec, bfd_byte *contents)
d01414a5
TS
12789{
12790 bfd_byte *to, *from, *end;
12791 int i;
12792
12793 if (strcmp (sec->name, ".pdr") != 0)
b34976b6 12794 return FALSE;
d01414a5 12795
f0abc2a1 12796 if (mips_elf_section_data (sec)->u.tdata == NULL)
b34976b6 12797 return FALSE;
d01414a5
TS
12798
12799 to = contents;
eea6121a 12800 end = contents + sec->size;
d01414a5
TS
12801 for (from = contents, i = 0;
12802 from < end;
12803 from += PDR_SIZE, i++)
12804 {
f0abc2a1 12805 if ((mips_elf_section_data (sec)->u.tdata)[i] == 1)
d01414a5
TS
12806 continue;
12807 if (to != from)
12808 memcpy (to, from, PDR_SIZE);
12809 to += PDR_SIZE;
12810 }
12811 bfd_set_section_contents (output_bfd, sec->output_section, contents,
eea6121a 12812 sec->output_offset, sec->size);
b34976b6 12813 return TRUE;
d01414a5 12814}
53bfd6b4 12815\f
df58fc94
RS
12816/* microMIPS code retains local labels for linker relaxation. Omit them
12817 from output by default for clarity. */
12818
12819bfd_boolean
12820_bfd_mips_elf_is_target_special_symbol (bfd *abfd, asymbol *sym)
12821{
12822 return _bfd_elf_is_local_label_name (abfd, sym->name);
12823}
12824
b49e97c9
TS
12825/* MIPS ELF uses a special find_nearest_line routine in order the
12826 handle the ECOFF debugging information. */
12827
12828struct mips_elf_find_line
12829{
12830 struct ecoff_debug_info d;
12831 struct ecoff_find_line i;
12832};
12833
b34976b6 12834bfd_boolean
fb167eb2
AM
12835_bfd_mips_elf_find_nearest_line (bfd *abfd, asymbol **symbols,
12836 asection *section, bfd_vma offset,
9719ad41
RS
12837 const char **filename_ptr,
12838 const char **functionname_ptr,
fb167eb2
AM
12839 unsigned int *line_ptr,
12840 unsigned int *discriminator_ptr)
b49e97c9
TS
12841{
12842 asection *msec;
12843
fb167eb2 12844 if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
b49e97c9 12845 filename_ptr, functionname_ptr,
fb167eb2
AM
12846 line_ptr, discriminator_ptr,
12847 dwarf_debug_sections,
12848 ABI_64_P (abfd) ? 8 : 0,
12849 &elf_tdata (abfd)->dwarf2_find_line_info))
b34976b6 12850 return TRUE;
b49e97c9 12851
fb167eb2 12852 if (_bfd_dwarf1_find_nearest_line (abfd, symbols, section, offset,
b49e97c9 12853 filename_ptr, functionname_ptr,
fb167eb2 12854 line_ptr))
b34976b6 12855 return TRUE;
b49e97c9
TS
12856
12857 msec = bfd_get_section_by_name (abfd, ".mdebug");
12858 if (msec != NULL)
12859 {
12860 flagword origflags;
12861 struct mips_elf_find_line *fi;
12862 const struct ecoff_debug_swap * const swap =
12863 get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
12864
12865 /* If we are called during a link, mips_elf_final_link may have
12866 cleared the SEC_HAS_CONTENTS field. We force it back on here
12867 if appropriate (which it normally will be). */
12868 origflags = msec->flags;
12869 if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
12870 msec->flags |= SEC_HAS_CONTENTS;
12871
698600e4 12872 fi = mips_elf_tdata (abfd)->find_line_info;
b49e97c9
TS
12873 if (fi == NULL)
12874 {
12875 bfd_size_type external_fdr_size;
12876 char *fraw_src;
12877 char *fraw_end;
12878 struct fdr *fdr_ptr;
12879 bfd_size_type amt = sizeof (struct mips_elf_find_line);
12880
9719ad41 12881 fi = bfd_zalloc (abfd, amt);
b49e97c9
TS
12882 if (fi == NULL)
12883 {
12884 msec->flags = origflags;
b34976b6 12885 return FALSE;
b49e97c9
TS
12886 }
12887
12888 if (! _bfd_mips_elf_read_ecoff_info (abfd, msec, &fi->d))
12889 {
12890 msec->flags = origflags;
b34976b6 12891 return FALSE;
b49e97c9
TS
12892 }
12893
12894 /* Swap in the FDR information. */
12895 amt = fi->d.symbolic_header.ifdMax * sizeof (struct fdr);
9719ad41 12896 fi->d.fdr = bfd_alloc (abfd, amt);
b49e97c9
TS
12897 if (fi->d.fdr == NULL)
12898 {
12899 msec->flags = origflags;
b34976b6 12900 return FALSE;
b49e97c9
TS
12901 }
12902 external_fdr_size = swap->external_fdr_size;
12903 fdr_ptr = fi->d.fdr;
12904 fraw_src = (char *) fi->d.external_fdr;
12905 fraw_end = (fraw_src
12906 + fi->d.symbolic_header.ifdMax * external_fdr_size);
12907 for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
9719ad41 12908 (*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr);
b49e97c9 12909
698600e4 12910 mips_elf_tdata (abfd)->find_line_info = fi;
b49e97c9
TS
12911
12912 /* Note that we don't bother to ever free this information.
12913 find_nearest_line is either called all the time, as in
12914 objdump -l, so the information should be saved, or it is
12915 rarely called, as in ld error messages, so the memory
12916 wasted is unimportant. Still, it would probably be a
12917 good idea for free_cached_info to throw it away. */
12918 }
12919
12920 if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
12921 &fi->i, filename_ptr, functionname_ptr,
12922 line_ptr))
12923 {
12924 msec->flags = origflags;
b34976b6 12925 return TRUE;
b49e97c9
TS
12926 }
12927
12928 msec->flags = origflags;
12929 }
12930
12931 /* Fall back on the generic ELF find_nearest_line routine. */
12932
fb167eb2 12933 return _bfd_elf_find_nearest_line (abfd, symbols, section, offset,
b49e97c9 12934 filename_ptr, functionname_ptr,
fb167eb2 12935 line_ptr, discriminator_ptr);
b49e97c9 12936}
4ab527b0
FF
12937
12938bfd_boolean
12939_bfd_mips_elf_find_inliner_info (bfd *abfd,
12940 const char **filename_ptr,
12941 const char **functionname_ptr,
12942 unsigned int *line_ptr)
12943{
12944 bfd_boolean found;
12945 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
12946 functionname_ptr, line_ptr,
12947 & elf_tdata (abfd)->dwarf2_find_line_info);
12948 return found;
12949}
12950
b49e97c9
TS
12951\f
12952/* When are writing out the .options or .MIPS.options section,
12953 remember the bytes we are writing out, so that we can install the
12954 GP value in the section_processing routine. */
12955
b34976b6 12956bfd_boolean
9719ad41
RS
12957_bfd_mips_elf_set_section_contents (bfd *abfd, sec_ptr section,
12958 const void *location,
12959 file_ptr offset, bfd_size_type count)
b49e97c9 12960{
cc2e31b9 12961 if (MIPS_ELF_OPTIONS_SECTION_NAME_P (section->name))
b49e97c9
TS
12962 {
12963 bfd_byte *c;
12964
12965 if (elf_section_data (section) == NULL)
12966 {
12967 bfd_size_type amt = sizeof (struct bfd_elf_section_data);
9719ad41 12968 section->used_by_bfd = bfd_zalloc (abfd, amt);
b49e97c9 12969 if (elf_section_data (section) == NULL)
b34976b6 12970 return FALSE;
b49e97c9 12971 }
f0abc2a1 12972 c = mips_elf_section_data (section)->u.tdata;
b49e97c9
TS
12973 if (c == NULL)
12974 {
eea6121a 12975 c = bfd_zalloc (abfd, section->size);
b49e97c9 12976 if (c == NULL)
b34976b6 12977 return FALSE;
f0abc2a1 12978 mips_elf_section_data (section)->u.tdata = c;
b49e97c9
TS
12979 }
12980
9719ad41 12981 memcpy (c + offset, location, count);
b49e97c9
TS
12982 }
12983
12984 return _bfd_elf_set_section_contents (abfd, section, location, offset,
12985 count);
12986}
12987
12988/* This is almost identical to bfd_generic_get_... except that some
12989 MIPS relocations need to be handled specially. Sigh. */
12990
12991bfd_byte *
9719ad41
RS
12992_bfd_elf_mips_get_relocated_section_contents
12993 (bfd *abfd,
12994 struct bfd_link_info *link_info,
12995 struct bfd_link_order *link_order,
12996 bfd_byte *data,
12997 bfd_boolean relocatable,
12998 asymbol **symbols)
b49e97c9
TS
12999{
13000 /* Get enough memory to hold the stuff */
13001 bfd *input_bfd = link_order->u.indirect.section->owner;
13002 asection *input_section = link_order->u.indirect.section;
eea6121a 13003 bfd_size_type sz;
b49e97c9
TS
13004
13005 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
13006 arelent **reloc_vector = NULL;
13007 long reloc_count;
13008
13009 if (reloc_size < 0)
13010 goto error_return;
13011
9719ad41 13012 reloc_vector = bfd_malloc (reloc_size);
b49e97c9
TS
13013 if (reloc_vector == NULL && reloc_size != 0)
13014 goto error_return;
13015
13016 /* read in the section */
eea6121a
AM
13017 sz = input_section->rawsize ? input_section->rawsize : input_section->size;
13018 if (!bfd_get_section_contents (input_bfd, input_section, data, 0, sz))
b49e97c9
TS
13019 goto error_return;
13020
b49e97c9
TS
13021 reloc_count = bfd_canonicalize_reloc (input_bfd,
13022 input_section,
13023 reloc_vector,
13024 symbols);
13025 if (reloc_count < 0)
13026 goto error_return;
13027
13028 if (reloc_count > 0)
13029 {
13030 arelent **parent;
13031 /* for mips */
13032 int gp_found;
13033 bfd_vma gp = 0x12345678; /* initialize just to shut gcc up */
13034
13035 {
13036 struct bfd_hash_entry *h;
13037 struct bfd_link_hash_entry *lh;
13038 /* Skip all this stuff if we aren't mixing formats. */
13039 if (abfd && input_bfd
13040 && abfd->xvec == input_bfd->xvec)
13041 lh = 0;
13042 else
13043 {
b34976b6 13044 h = bfd_hash_lookup (&link_info->hash->table, "_gp", FALSE, FALSE);
b49e97c9
TS
13045 lh = (struct bfd_link_hash_entry *) h;
13046 }
13047 lookup:
13048 if (lh)
13049 {
13050 switch (lh->type)
13051 {
13052 case bfd_link_hash_undefined:
13053 case bfd_link_hash_undefweak:
13054 case bfd_link_hash_common:
13055 gp_found = 0;
13056 break;
13057 case bfd_link_hash_defined:
13058 case bfd_link_hash_defweak:
13059 gp_found = 1;
13060 gp = lh->u.def.value;
13061 break;
13062 case bfd_link_hash_indirect:
13063 case bfd_link_hash_warning:
13064 lh = lh->u.i.link;
13065 /* @@FIXME ignoring warning for now */
13066 goto lookup;
13067 case bfd_link_hash_new:
13068 default:
13069 abort ();
13070 }
13071 }
13072 else
13073 gp_found = 0;
13074 }
13075 /* end mips */
9719ad41 13076 for (parent = reloc_vector; *parent != NULL; parent++)
b49e97c9 13077 {
9719ad41 13078 char *error_message = NULL;
b49e97c9
TS
13079 bfd_reloc_status_type r;
13080
13081 /* Specific to MIPS: Deal with relocation types that require
13082 knowing the gp of the output bfd. */
13083 asymbol *sym = *(*parent)->sym_ptr_ptr;
b49e97c9 13084
8236346f
EC
13085 /* If we've managed to find the gp and have a special
13086 function for the relocation then go ahead, else default
13087 to the generic handling. */
13088 if (gp_found
13089 && (*parent)->howto->special_function
13090 == _bfd_mips_elf32_gprel16_reloc)
13091 r = _bfd_mips_elf_gprel16_with_gp (input_bfd, sym, *parent,
13092 input_section, relocatable,
13093 data, gp);
13094 else
86324f90 13095 r = bfd_perform_relocation (input_bfd, *parent, data,
8236346f
EC
13096 input_section,
13097 relocatable ? abfd : NULL,
13098 &error_message);
b49e97c9 13099
1049f94e 13100 if (relocatable)
b49e97c9
TS
13101 {
13102 asection *os = input_section->output_section;
13103
13104 /* A partial link, so keep the relocs */
13105 os->orelocation[os->reloc_count] = *parent;
13106 os->reloc_count++;
13107 }
13108
13109 if (r != bfd_reloc_ok)
13110 {
13111 switch (r)
13112 {
13113 case bfd_reloc_undefined:
1a72702b
AM
13114 (*link_info->callbacks->undefined_symbol)
13115 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13116 input_bfd, input_section, (*parent)->address, TRUE);
b49e97c9
TS
13117 break;
13118 case bfd_reloc_dangerous:
9719ad41 13119 BFD_ASSERT (error_message != NULL);
1a72702b
AM
13120 (*link_info->callbacks->reloc_dangerous)
13121 (link_info, error_message,
13122 input_bfd, input_section, (*parent)->address);
b49e97c9
TS
13123 break;
13124 case bfd_reloc_overflow:
1a72702b
AM
13125 (*link_info->callbacks->reloc_overflow)
13126 (link_info, NULL,
13127 bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13128 (*parent)->howto->name, (*parent)->addend,
13129 input_bfd, input_section, (*parent)->address);
b49e97c9
TS
13130 break;
13131 case bfd_reloc_outofrange:
13132 default:
13133 abort ();
13134 break;
13135 }
13136
13137 }
13138 }
13139 }
13140 if (reloc_vector != NULL)
13141 free (reloc_vector);
13142 return data;
13143
13144error_return:
13145 if (reloc_vector != NULL)
13146 free (reloc_vector);
13147 return NULL;
13148}
13149\f
df58fc94
RS
13150static bfd_boolean
13151mips_elf_relax_delete_bytes (bfd *abfd,
13152 asection *sec, bfd_vma addr, int count)
13153{
13154 Elf_Internal_Shdr *symtab_hdr;
13155 unsigned int sec_shndx;
13156 bfd_byte *contents;
13157 Elf_Internal_Rela *irel, *irelend;
13158 Elf_Internal_Sym *isym;
13159 Elf_Internal_Sym *isymend;
13160 struct elf_link_hash_entry **sym_hashes;
13161 struct elf_link_hash_entry **end_hashes;
13162 struct elf_link_hash_entry **start_hashes;
13163 unsigned int symcount;
13164
13165 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
13166 contents = elf_section_data (sec)->this_hdr.contents;
13167
13168 irel = elf_section_data (sec)->relocs;
13169 irelend = irel + sec->reloc_count;
13170
13171 /* Actually delete the bytes. */
13172 memmove (contents + addr, contents + addr + count,
13173 (size_t) (sec->size - addr - count));
13174 sec->size -= count;
13175
13176 /* Adjust all the relocs. */
13177 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
13178 {
13179 /* Get the new reloc address. */
13180 if (irel->r_offset > addr)
13181 irel->r_offset -= count;
13182 }
13183
13184 BFD_ASSERT (addr % 2 == 0);
13185 BFD_ASSERT (count % 2 == 0);
13186
13187 /* Adjust the local symbols defined in this section. */
13188 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
13189 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
13190 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
2309ddf2 13191 if (isym->st_shndx == sec_shndx && isym->st_value > addr)
df58fc94
RS
13192 isym->st_value -= count;
13193
13194 /* Now adjust the global symbols defined in this section. */
13195 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
13196 - symtab_hdr->sh_info);
13197 sym_hashes = start_hashes = elf_sym_hashes (abfd);
13198 end_hashes = sym_hashes + symcount;
13199
13200 for (; sym_hashes < end_hashes; sym_hashes++)
13201 {
13202 struct elf_link_hash_entry *sym_hash = *sym_hashes;
13203
13204 if ((sym_hash->root.type == bfd_link_hash_defined
13205 || sym_hash->root.type == bfd_link_hash_defweak)
13206 && sym_hash->root.u.def.section == sec)
13207 {
2309ddf2 13208 bfd_vma value = sym_hash->root.u.def.value;
df58fc94 13209
df58fc94
RS
13210 if (ELF_ST_IS_MICROMIPS (sym_hash->other))
13211 value &= MINUS_TWO;
13212 if (value > addr)
13213 sym_hash->root.u.def.value -= count;
13214 }
13215 }
13216
13217 return TRUE;
13218}
13219
13220
13221/* Opcodes needed for microMIPS relaxation as found in
13222 opcodes/micromips-opc.c. */
13223
13224struct opcode_descriptor {
13225 unsigned long match;
13226 unsigned long mask;
13227};
13228
13229/* The $ra register aka $31. */
13230
13231#define RA 31
13232
13233/* 32-bit instruction format register fields. */
13234
13235#define OP32_SREG(opcode) (((opcode) >> 16) & 0x1f)
13236#define OP32_TREG(opcode) (((opcode) >> 21) & 0x1f)
13237
13238/* Check if a 5-bit register index can be abbreviated to 3 bits. */
13239
13240#define OP16_VALID_REG(r) \
13241 ((2 <= (r) && (r) <= 7) || (16 <= (r) && (r) <= 17))
13242
13243
13244/* 32-bit and 16-bit branches. */
13245
13246static const struct opcode_descriptor b_insns_32[] = {
13247 { /* "b", "p", */ 0x40400000, 0xffff0000 }, /* bgez 0 */
13248 { /* "b", "p", */ 0x94000000, 0xffff0000 }, /* beq 0, 0 */
13249 { 0, 0 } /* End marker for find_match(). */
13250};
13251
13252static const struct opcode_descriptor bc_insn_32 =
13253 { /* "bc(1|2)(ft)", "N,p", */ 0x42800000, 0xfec30000 };
13254
13255static const struct opcode_descriptor bz_insn_32 =
13256 { /* "b(g|l)(e|t)z", "s,p", */ 0x40000000, 0xff200000 };
13257
13258static const struct opcode_descriptor bzal_insn_32 =
13259 { /* "b(ge|lt)zal", "s,p", */ 0x40200000, 0xffa00000 };
13260
13261static const struct opcode_descriptor beq_insn_32 =
13262 { /* "b(eq|ne)", "s,t,p", */ 0x94000000, 0xdc000000 };
13263
13264static const struct opcode_descriptor b_insn_16 =
13265 { /* "b", "mD", */ 0xcc00, 0xfc00 };
13266
13267static const struct opcode_descriptor bz_insn_16 =
c088dedf 13268 { /* "b(eq|ne)z", "md,mE", */ 0x8c00, 0xdc00 };
df58fc94
RS
13269
13270
13271/* 32-bit and 16-bit branch EQ and NE zero. */
13272
13273/* NOTE: All opcode tables have BEQ/BNE in the same order: first the
13274 eq and second the ne. This convention is used when replacing a
13275 32-bit BEQ/BNE with the 16-bit version. */
13276
13277#define BZC32_REG_FIELD(r) (((r) & 0x1f) << 16)
13278
13279static const struct opcode_descriptor bz_rs_insns_32[] = {
13280 { /* "beqz", "s,p", */ 0x94000000, 0xffe00000 },
13281 { /* "bnez", "s,p", */ 0xb4000000, 0xffe00000 },
13282 { 0, 0 } /* End marker for find_match(). */
13283};
13284
13285static const struct opcode_descriptor bz_rt_insns_32[] = {
13286 { /* "beqz", "t,p", */ 0x94000000, 0xfc01f000 },
13287 { /* "bnez", "t,p", */ 0xb4000000, 0xfc01f000 },
13288 { 0, 0 } /* End marker for find_match(). */
13289};
13290
13291static const struct opcode_descriptor bzc_insns_32[] = {
13292 { /* "beqzc", "s,p", */ 0x40e00000, 0xffe00000 },
13293 { /* "bnezc", "s,p", */ 0x40a00000, 0xffe00000 },
13294 { 0, 0 } /* End marker for find_match(). */
13295};
13296
13297static const struct opcode_descriptor bz_insns_16[] = {
13298 { /* "beqz", "md,mE", */ 0x8c00, 0xfc00 },
13299 { /* "bnez", "md,mE", */ 0xac00, 0xfc00 },
13300 { 0, 0 } /* End marker for find_match(). */
13301};
13302
13303/* Switch between a 5-bit register index and its 3-bit shorthand. */
13304
e67f83e5 13305#define BZ16_REG(opcode) ((((((opcode) >> 7) & 7) + 0x1e) & 0xf) + 2)
eb6b0cf4 13306#define BZ16_REG_FIELD(r) (((r) & 7) << 7)
df58fc94
RS
13307
13308
13309/* 32-bit instructions with a delay slot. */
13310
13311static const struct opcode_descriptor jal_insn_32_bd16 =
13312 { /* "jals", "a", */ 0x74000000, 0xfc000000 };
13313
13314static const struct opcode_descriptor jal_insn_32_bd32 =
13315 { /* "jal", "a", */ 0xf4000000, 0xfc000000 };
13316
13317static const struct opcode_descriptor jal_x_insn_32_bd32 =
13318 { /* "jal[x]", "a", */ 0xf0000000, 0xf8000000 };
13319
13320static const struct opcode_descriptor j_insn_32 =
13321 { /* "j", "a", */ 0xd4000000, 0xfc000000 };
13322
13323static const struct opcode_descriptor jalr_insn_32 =
13324 { /* "jalr[.hb]", "t,s", */ 0x00000f3c, 0xfc00efff };
13325
13326/* This table can be compacted, because no opcode replacement is made. */
13327
13328static const struct opcode_descriptor ds_insns_32_bd16[] = {
13329 { /* "jals", "a", */ 0x74000000, 0xfc000000 },
13330
13331 { /* "jalrs[.hb]", "t,s", */ 0x00004f3c, 0xfc00efff },
13332 { /* "b(ge|lt)zals", "s,p", */ 0x42200000, 0xffa00000 },
13333
13334 { /* "b(g|l)(e|t)z", "s,p", */ 0x40000000, 0xff200000 },
13335 { /* "b(eq|ne)", "s,t,p", */ 0x94000000, 0xdc000000 },
13336 { /* "j", "a", */ 0xd4000000, 0xfc000000 },
13337 { 0, 0 } /* End marker for find_match(). */
13338};
13339
13340/* This table can be compacted, because no opcode replacement is made. */
13341
13342static const struct opcode_descriptor ds_insns_32_bd32[] = {
13343 { /* "jal[x]", "a", */ 0xf0000000, 0xf8000000 },
13344
13345 { /* "jalr[.hb]", "t,s", */ 0x00000f3c, 0xfc00efff },
13346 { /* "b(ge|lt)zal", "s,p", */ 0x40200000, 0xffa00000 },
13347 { 0, 0 } /* End marker for find_match(). */
13348};
13349
13350
13351/* 16-bit instructions with a delay slot. */
13352
13353static const struct opcode_descriptor jalr_insn_16_bd16 =
13354 { /* "jalrs", "my,mj", */ 0x45e0, 0xffe0 };
13355
13356static const struct opcode_descriptor jalr_insn_16_bd32 =
13357 { /* "jalr", "my,mj", */ 0x45c0, 0xffe0 };
13358
13359static const struct opcode_descriptor jr_insn_16 =
13360 { /* "jr", "mj", */ 0x4580, 0xffe0 };
13361
13362#define JR16_REG(opcode) ((opcode) & 0x1f)
13363
13364/* This table can be compacted, because no opcode replacement is made. */
13365
13366static const struct opcode_descriptor ds_insns_16_bd16[] = {
13367 { /* "jalrs", "my,mj", */ 0x45e0, 0xffe0 },
13368
13369 { /* "b", "mD", */ 0xcc00, 0xfc00 },
13370 { /* "b(eq|ne)z", "md,mE", */ 0x8c00, 0xdc00 },
13371 { /* "jr", "mj", */ 0x4580, 0xffe0 },
13372 { 0, 0 } /* End marker for find_match(). */
13373};
13374
13375
13376/* LUI instruction. */
13377
13378static const struct opcode_descriptor lui_insn =
13379 { /* "lui", "s,u", */ 0x41a00000, 0xffe00000 };
13380
13381
13382/* ADDIU instruction. */
13383
13384static const struct opcode_descriptor addiu_insn =
13385 { /* "addiu", "t,r,j", */ 0x30000000, 0xfc000000 };
13386
13387static const struct opcode_descriptor addiupc_insn =
13388 { /* "addiu", "mb,$pc,mQ", */ 0x78000000, 0xfc000000 };
13389
13390#define ADDIUPC_REG_FIELD(r) \
13391 (((2 <= (r) && (r) <= 7) ? (r) : ((r) - 16)) << 23)
13392
13393
13394/* Relaxable instructions in a JAL delay slot: MOVE. */
13395
13396/* The 16-bit move has rd in 9:5 and rs in 4:0. The 32-bit moves
13397 (ADDU, OR) have rd in 15:11 and rs in 10:16. */
13398#define MOVE32_RD(opcode) (((opcode) >> 11) & 0x1f)
13399#define MOVE32_RS(opcode) (((opcode) >> 16) & 0x1f)
13400
13401#define MOVE16_RD_FIELD(r) (((r) & 0x1f) << 5)
13402#define MOVE16_RS_FIELD(r) (((r) & 0x1f) )
13403
13404static const struct opcode_descriptor move_insns_32[] = {
df58fc94 13405 { /* "move", "d,s", */ 0x00000290, 0xffe007ff }, /* or d,s,$0 */
40fc1451 13406 { /* "move", "d,s", */ 0x00000150, 0xffe007ff }, /* addu d,s,$0 */
df58fc94
RS
13407 { 0, 0 } /* End marker for find_match(). */
13408};
13409
13410static const struct opcode_descriptor move_insn_16 =
13411 { /* "move", "mp,mj", */ 0x0c00, 0xfc00 };
13412
13413
13414/* NOP instructions. */
13415
13416static const struct opcode_descriptor nop_insn_32 =
13417 { /* "nop", "", */ 0x00000000, 0xffffffff };
13418
13419static const struct opcode_descriptor nop_insn_16 =
13420 { /* "nop", "", */ 0x0c00, 0xffff };
13421
13422
13423/* Instruction match support. */
13424
13425#define MATCH(opcode, insn) ((opcode & insn.mask) == insn.match)
13426
13427static int
13428find_match (unsigned long opcode, const struct opcode_descriptor insn[])
13429{
13430 unsigned long indx;
13431
13432 for (indx = 0; insn[indx].mask != 0; indx++)
13433 if (MATCH (opcode, insn[indx]))
13434 return indx;
13435
13436 return -1;
13437}
13438
13439
13440/* Branch and delay slot decoding support. */
13441
13442/* If PTR points to what *might* be a 16-bit branch or jump, then
13443 return the minimum length of its delay slot, otherwise return 0.
13444 Non-zero results are not definitive as we might be checking against
13445 the second half of another instruction. */
13446
13447static int
13448check_br16_dslot (bfd *abfd, bfd_byte *ptr)
13449{
13450 unsigned long opcode;
13451 int bdsize;
13452
13453 opcode = bfd_get_16 (abfd, ptr);
13454 if (MATCH (opcode, jalr_insn_16_bd32) != 0)
13455 /* 16-bit branch/jump with a 32-bit delay slot. */
13456 bdsize = 4;
13457 else if (MATCH (opcode, jalr_insn_16_bd16) != 0
13458 || find_match (opcode, ds_insns_16_bd16) >= 0)
13459 /* 16-bit branch/jump with a 16-bit delay slot. */
13460 bdsize = 2;
13461 else
13462 /* No delay slot. */
13463 bdsize = 0;
13464
13465 return bdsize;
13466}
13467
13468/* If PTR points to what *might* be a 32-bit branch or jump, then
13469 return the minimum length of its delay slot, otherwise return 0.
13470 Non-zero results are not definitive as we might be checking against
13471 the second half of another instruction. */
13472
13473static int
13474check_br32_dslot (bfd *abfd, bfd_byte *ptr)
13475{
13476 unsigned long opcode;
13477 int bdsize;
13478
d21911ea 13479 opcode = bfd_get_micromips_32 (abfd, ptr);
df58fc94
RS
13480 if (find_match (opcode, ds_insns_32_bd32) >= 0)
13481 /* 32-bit branch/jump with a 32-bit delay slot. */
13482 bdsize = 4;
13483 else if (find_match (opcode, ds_insns_32_bd16) >= 0)
13484 /* 32-bit branch/jump with a 16-bit delay slot. */
13485 bdsize = 2;
13486 else
13487 /* No delay slot. */
13488 bdsize = 0;
13489
13490 return bdsize;
13491}
13492
13493/* If PTR points to a 16-bit branch or jump with a 32-bit delay slot
13494 that doesn't fiddle with REG, then return TRUE, otherwise FALSE. */
13495
13496static bfd_boolean
13497check_br16 (bfd *abfd, bfd_byte *ptr, unsigned long reg)
13498{
13499 unsigned long opcode;
13500
13501 opcode = bfd_get_16 (abfd, ptr);
13502 if (MATCH (opcode, b_insn_16)
13503 /* B16 */
13504 || (MATCH (opcode, jr_insn_16) && reg != JR16_REG (opcode))
13505 /* JR16 */
13506 || (MATCH (opcode, bz_insn_16) && reg != BZ16_REG (opcode))
13507 /* BEQZ16, BNEZ16 */
13508 || (MATCH (opcode, jalr_insn_16_bd32)
13509 /* JALR16 */
13510 && reg != JR16_REG (opcode) && reg != RA))
13511 return TRUE;
13512
13513 return FALSE;
13514}
13515
13516/* If PTR points to a 32-bit branch or jump that doesn't fiddle with REG,
13517 then return TRUE, otherwise FALSE. */
13518
f41e5fcc 13519static bfd_boolean
df58fc94
RS
13520check_br32 (bfd *abfd, bfd_byte *ptr, unsigned long reg)
13521{
13522 unsigned long opcode;
13523
d21911ea 13524 opcode = bfd_get_micromips_32 (abfd, ptr);
df58fc94
RS
13525 if (MATCH (opcode, j_insn_32)
13526 /* J */
13527 || MATCH (opcode, bc_insn_32)
13528 /* BC1F, BC1T, BC2F, BC2T */
13529 || (MATCH (opcode, jal_x_insn_32_bd32) && reg != RA)
13530 /* JAL, JALX */
13531 || (MATCH (opcode, bz_insn_32) && reg != OP32_SREG (opcode))
13532 /* BGEZ, BGTZ, BLEZ, BLTZ */
13533 || (MATCH (opcode, bzal_insn_32)
13534 /* BGEZAL, BLTZAL */
13535 && reg != OP32_SREG (opcode) && reg != RA)
13536 || ((MATCH (opcode, jalr_insn_32) || MATCH (opcode, beq_insn_32))
13537 /* JALR, JALR.HB, BEQ, BNE */
13538 && reg != OP32_SREG (opcode) && reg != OP32_TREG (opcode)))
13539 return TRUE;
13540
13541 return FALSE;
13542}
13543
80cab405
MR
13544/* If the instruction encoding at PTR and relocations [INTERNAL_RELOCS,
13545 IRELEND) at OFFSET indicate that there must be a compact branch there,
13546 then return TRUE, otherwise FALSE. */
df58fc94
RS
13547
13548static bfd_boolean
80cab405
MR
13549check_relocated_bzc (bfd *abfd, const bfd_byte *ptr, bfd_vma offset,
13550 const Elf_Internal_Rela *internal_relocs,
13551 const Elf_Internal_Rela *irelend)
df58fc94 13552{
80cab405
MR
13553 const Elf_Internal_Rela *irel;
13554 unsigned long opcode;
13555
d21911ea 13556 opcode = bfd_get_micromips_32 (abfd, ptr);
80cab405
MR
13557 if (find_match (opcode, bzc_insns_32) < 0)
13558 return FALSE;
df58fc94
RS
13559
13560 for (irel = internal_relocs; irel < irelend; irel++)
80cab405
MR
13561 if (irel->r_offset == offset
13562 && ELF32_R_TYPE (irel->r_info) == R_MICROMIPS_PC16_S1)
13563 return TRUE;
13564
df58fc94
RS
13565 return FALSE;
13566}
80cab405
MR
13567
13568/* Bitsize checking. */
13569#define IS_BITSIZE(val, N) \
13570 (((((val) & ((1ULL << (N)) - 1)) ^ (1ULL << ((N) - 1))) \
13571 - (1ULL << ((N) - 1))) == (val))
13572
df58fc94
RS
13573\f
13574bfd_boolean
13575_bfd_mips_elf_relax_section (bfd *abfd, asection *sec,
13576 struct bfd_link_info *link_info,
13577 bfd_boolean *again)
13578{
833794fc 13579 bfd_boolean insn32 = mips_elf_hash_table (link_info)->insn32;
df58fc94
RS
13580 Elf_Internal_Shdr *symtab_hdr;
13581 Elf_Internal_Rela *internal_relocs;
13582 Elf_Internal_Rela *irel, *irelend;
13583 bfd_byte *contents = NULL;
13584 Elf_Internal_Sym *isymbuf = NULL;
13585
13586 /* Assume nothing changes. */
13587 *again = FALSE;
13588
13589 /* We don't have to do anything for a relocatable link, if
13590 this section does not have relocs, or if this is not a
13591 code section. */
13592
0e1862bb 13593 if (bfd_link_relocatable (link_info)
df58fc94
RS
13594 || (sec->flags & SEC_RELOC) == 0
13595 || sec->reloc_count == 0
13596 || (sec->flags & SEC_CODE) == 0)
13597 return TRUE;
13598
13599 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
13600
13601 /* Get a copy of the native relocations. */
13602 internal_relocs = (_bfd_elf_link_read_relocs
2c3fc389 13603 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
df58fc94
RS
13604 link_info->keep_memory));
13605 if (internal_relocs == NULL)
13606 goto error_return;
13607
13608 /* Walk through them looking for relaxing opportunities. */
13609 irelend = internal_relocs + sec->reloc_count;
13610 for (irel = internal_relocs; irel < irelend; irel++)
13611 {
13612 unsigned long r_symndx = ELF32_R_SYM (irel->r_info);
13613 unsigned int r_type = ELF32_R_TYPE (irel->r_info);
13614 bfd_boolean target_is_micromips_code_p;
13615 unsigned long opcode;
13616 bfd_vma symval;
13617 bfd_vma pcrval;
2309ddf2 13618 bfd_byte *ptr;
df58fc94
RS
13619 int fndopc;
13620
13621 /* The number of bytes to delete for relaxation and from where
13622 to delete these bytes starting at irel->r_offset. */
13623 int delcnt = 0;
13624 int deloff = 0;
13625
13626 /* If this isn't something that can be relaxed, then ignore
13627 this reloc. */
13628 if (r_type != R_MICROMIPS_HI16
13629 && r_type != R_MICROMIPS_PC16_S1
2309ddf2 13630 && r_type != R_MICROMIPS_26_S1)
df58fc94
RS
13631 continue;
13632
13633 /* Get the section contents if we haven't done so already. */
13634 if (contents == NULL)
13635 {
13636 /* Get cached copy if it exists. */
13637 if (elf_section_data (sec)->this_hdr.contents != NULL)
13638 contents = elf_section_data (sec)->this_hdr.contents;
13639 /* Go get them off disk. */
13640 else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
13641 goto error_return;
13642 }
2309ddf2 13643 ptr = contents + irel->r_offset;
df58fc94
RS
13644
13645 /* Read this BFD's local symbols if we haven't done so already. */
13646 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
13647 {
13648 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
13649 if (isymbuf == NULL)
13650 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
13651 symtab_hdr->sh_info, 0,
13652 NULL, NULL, NULL);
13653 if (isymbuf == NULL)
13654 goto error_return;
13655 }
13656
13657 /* Get the value of the symbol referred to by the reloc. */
13658 if (r_symndx < symtab_hdr->sh_info)
13659 {
13660 /* A local symbol. */
13661 Elf_Internal_Sym *isym;
13662 asection *sym_sec;
13663
13664 isym = isymbuf + r_symndx;
13665 if (isym->st_shndx == SHN_UNDEF)
13666 sym_sec = bfd_und_section_ptr;
13667 else if (isym->st_shndx == SHN_ABS)
13668 sym_sec = bfd_abs_section_ptr;
13669 else if (isym->st_shndx == SHN_COMMON)
13670 sym_sec = bfd_com_section_ptr;
13671 else
13672 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
13673 symval = (isym->st_value
13674 + sym_sec->output_section->vma
13675 + sym_sec->output_offset);
13676 target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (isym->st_other);
13677 }
13678 else
13679 {
13680 unsigned long indx;
13681 struct elf_link_hash_entry *h;
13682
13683 /* An external symbol. */
13684 indx = r_symndx - symtab_hdr->sh_info;
13685 h = elf_sym_hashes (abfd)[indx];
13686 BFD_ASSERT (h != NULL);
13687
13688 if (h->root.type != bfd_link_hash_defined
13689 && h->root.type != bfd_link_hash_defweak)
13690 /* This appears to be a reference to an undefined
13691 symbol. Just ignore it -- it will be caught by the
13692 regular reloc processing. */
13693 continue;
13694
13695 symval = (h->root.u.def.value
13696 + h->root.u.def.section->output_section->vma
13697 + h->root.u.def.section->output_offset);
13698 target_is_micromips_code_p = (!h->needs_plt
13699 && ELF_ST_IS_MICROMIPS (h->other));
13700 }
13701
13702
13703 /* For simplicity of coding, we are going to modify the
13704 section contents, the section relocs, and the BFD symbol
13705 table. We must tell the rest of the code not to free up this
13706 information. It would be possible to instead create a table
13707 of changes which have to be made, as is done in coff-mips.c;
13708 that would be more work, but would require less memory when
13709 the linker is run. */
13710
13711 /* Only 32-bit instructions relaxed. */
13712 if (irel->r_offset + 4 > sec->size)
13713 continue;
13714
d21911ea 13715 opcode = bfd_get_micromips_32 (abfd, ptr);
df58fc94
RS
13716
13717 /* This is the pc-relative distance from the instruction the
13718 relocation is applied to, to the symbol referred. */
13719 pcrval = (symval
13720 - (sec->output_section->vma + sec->output_offset)
13721 - irel->r_offset);
13722
13723 /* R_MICROMIPS_HI16 / LUI relaxation to nil, performing relaxation
13724 of corresponding R_MICROMIPS_LO16 to R_MICROMIPS_HI0_LO16 or
13725 R_MICROMIPS_PC23_S2. The R_MICROMIPS_PC23_S2 condition is
13726
13727 (symval % 4 == 0 && IS_BITSIZE (pcrval, 25))
13728
13729 where pcrval has first to be adjusted to apply against the LO16
13730 location (we make the adjustment later on, when we have figured
13731 out the offset). */
13732 if (r_type == R_MICROMIPS_HI16 && MATCH (opcode, lui_insn))
13733 {
80cab405 13734 bfd_boolean bzc = FALSE;
df58fc94
RS
13735 unsigned long nextopc;
13736 unsigned long reg;
13737 bfd_vma offset;
13738
13739 /* Give up if the previous reloc was a HI16 against this symbol
13740 too. */
13741 if (irel > internal_relocs
13742 && ELF32_R_TYPE (irel[-1].r_info) == R_MICROMIPS_HI16
13743 && ELF32_R_SYM (irel[-1].r_info) == r_symndx)
13744 continue;
13745
13746 /* Or if the next reloc is not a LO16 against this symbol. */
13747 if (irel + 1 >= irelend
13748 || ELF32_R_TYPE (irel[1].r_info) != R_MICROMIPS_LO16
13749 || ELF32_R_SYM (irel[1].r_info) != r_symndx)
13750 continue;
13751
13752 /* Or if the second next reloc is a LO16 against this symbol too. */
13753 if (irel + 2 >= irelend
13754 && ELF32_R_TYPE (irel[2].r_info) == R_MICROMIPS_LO16
13755 && ELF32_R_SYM (irel[2].r_info) == r_symndx)
13756 continue;
13757
80cab405
MR
13758 /* See if the LUI instruction *might* be in a branch delay slot.
13759 We check whether what looks like a 16-bit branch or jump is
13760 actually an immediate argument to a compact branch, and let
13761 it through if so. */
df58fc94 13762 if (irel->r_offset >= 2
2309ddf2 13763 && check_br16_dslot (abfd, ptr - 2)
df58fc94 13764 && !(irel->r_offset >= 4
80cab405
MR
13765 && (bzc = check_relocated_bzc (abfd,
13766 ptr - 4, irel->r_offset - 4,
13767 internal_relocs, irelend))))
df58fc94
RS
13768 continue;
13769 if (irel->r_offset >= 4
80cab405 13770 && !bzc
2309ddf2 13771 && check_br32_dslot (abfd, ptr - 4))
df58fc94
RS
13772 continue;
13773
13774 reg = OP32_SREG (opcode);
13775
13776 /* We only relax adjacent instructions or ones separated with
13777 a branch or jump that has a delay slot. The branch or jump
13778 must not fiddle with the register used to hold the address.
13779 Subtract 4 for the LUI itself. */
13780 offset = irel[1].r_offset - irel[0].r_offset;
13781 switch (offset - 4)
13782 {
13783 case 0:
13784 break;
13785 case 2:
2309ddf2 13786 if (check_br16 (abfd, ptr + 4, reg))
df58fc94
RS
13787 break;
13788 continue;
13789 case 4:
2309ddf2 13790 if (check_br32 (abfd, ptr + 4, reg))
df58fc94
RS
13791 break;
13792 continue;
13793 default:
13794 continue;
13795 }
13796
d21911ea 13797 nextopc = bfd_get_micromips_32 (abfd, contents + irel[1].r_offset);
df58fc94
RS
13798
13799 /* Give up unless the same register is used with both
13800 relocations. */
13801 if (OP32_SREG (nextopc) != reg)
13802 continue;
13803
13804 /* Now adjust pcrval, subtracting the offset to the LO16 reloc
13805 and rounding up to take masking of the two LSBs into account. */
13806 pcrval = ((pcrval - offset + 3) | 3) ^ 3;
13807
13808 /* R_MICROMIPS_LO16 relaxation to R_MICROMIPS_HI0_LO16. */
13809 if (IS_BITSIZE (symval, 16))
13810 {
13811 /* Fix the relocation's type. */
13812 irel[1].r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_HI0_LO16);
13813
13814 /* Instructions using R_MICROMIPS_LO16 have the base or
13815 source register in bits 20:16. This register becomes $0
13816 (zero) as the result of the R_MICROMIPS_HI16 being 0. */
13817 nextopc &= ~0x001f0000;
13818 bfd_put_16 (abfd, (nextopc >> 16) & 0xffff,
13819 contents + irel[1].r_offset);
13820 }
13821
13822 /* R_MICROMIPS_LO16 / ADDIU relaxation to R_MICROMIPS_PC23_S2.
13823 We add 4 to take LUI deletion into account while checking
13824 the PC-relative distance. */
13825 else if (symval % 4 == 0
13826 && IS_BITSIZE (pcrval + 4, 25)
13827 && MATCH (nextopc, addiu_insn)
13828 && OP32_TREG (nextopc) == OP32_SREG (nextopc)
13829 && OP16_VALID_REG (OP32_TREG (nextopc)))
13830 {
13831 /* Fix the relocation's type. */
13832 irel[1].r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC23_S2);
13833
13834 /* Replace ADDIU with the ADDIUPC version. */
13835 nextopc = (addiupc_insn.match
13836 | ADDIUPC_REG_FIELD (OP32_TREG (nextopc)));
13837
d21911ea
MR
13838 bfd_put_micromips_32 (abfd, nextopc,
13839 contents + irel[1].r_offset);
df58fc94
RS
13840 }
13841
13842 /* Can't do anything, give up, sigh... */
13843 else
13844 continue;
13845
13846 /* Fix the relocation's type. */
13847 irel->r_info = ELF32_R_INFO (r_symndx, R_MIPS_NONE);
13848
13849 /* Delete the LUI instruction: 4 bytes at irel->r_offset. */
13850 delcnt = 4;
13851 deloff = 0;
13852 }
13853
13854 /* Compact branch relaxation -- due to the multitude of macros
13855 employed by the compiler/assembler, compact branches are not
13856 always generated. Obviously, this can/will be fixed elsewhere,
13857 but there is no drawback in double checking it here. */
13858 else if (r_type == R_MICROMIPS_PC16_S1
13859 && irel->r_offset + 5 < sec->size
13860 && ((fndopc = find_match (opcode, bz_rs_insns_32)) >= 0
13861 || (fndopc = find_match (opcode, bz_rt_insns_32)) >= 0)
833794fc
MR
13862 && ((!insn32
13863 && (delcnt = MATCH (bfd_get_16 (abfd, ptr + 4),
13864 nop_insn_16) ? 2 : 0))
13865 || (irel->r_offset + 7 < sec->size
13866 && (delcnt = MATCH (bfd_get_micromips_32 (abfd,
13867 ptr + 4),
13868 nop_insn_32) ? 4 : 0))))
df58fc94
RS
13869 {
13870 unsigned long reg;
13871
13872 reg = OP32_SREG (opcode) ? OP32_SREG (opcode) : OP32_TREG (opcode);
13873
13874 /* Replace BEQZ/BNEZ with the compact version. */
13875 opcode = (bzc_insns_32[fndopc].match
13876 | BZC32_REG_FIELD (reg)
13877 | (opcode & 0xffff)); /* Addend value. */
13878
d21911ea 13879 bfd_put_micromips_32 (abfd, opcode, ptr);
df58fc94 13880
833794fc
MR
13881 /* Delete the delay slot NOP: two or four bytes from
13882 irel->offset + 4; delcnt has already been set above. */
df58fc94
RS
13883 deloff = 4;
13884 }
13885
13886 /* R_MICROMIPS_PC16_S1 relaxation to R_MICROMIPS_PC10_S1. We need
13887 to check the distance from the next instruction, so subtract 2. */
833794fc
MR
13888 else if (!insn32
13889 && r_type == R_MICROMIPS_PC16_S1
df58fc94
RS
13890 && IS_BITSIZE (pcrval - 2, 11)
13891 && find_match (opcode, b_insns_32) >= 0)
13892 {
13893 /* Fix the relocation's type. */
13894 irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC10_S1);
13895
a8685210 13896 /* Replace the 32-bit opcode with a 16-bit opcode. */
df58fc94
RS
13897 bfd_put_16 (abfd,
13898 (b_insn_16.match
13899 | (opcode & 0x3ff)), /* Addend value. */
2309ddf2 13900 ptr);
df58fc94
RS
13901
13902 /* Delete 2 bytes from irel->r_offset + 2. */
13903 delcnt = 2;
13904 deloff = 2;
13905 }
13906
13907 /* R_MICROMIPS_PC16_S1 relaxation to R_MICROMIPS_PC7_S1. We need
13908 to check the distance from the next instruction, so subtract 2. */
833794fc
MR
13909 else if (!insn32
13910 && r_type == R_MICROMIPS_PC16_S1
df58fc94
RS
13911 && IS_BITSIZE (pcrval - 2, 8)
13912 && (((fndopc = find_match (opcode, bz_rs_insns_32)) >= 0
13913 && OP16_VALID_REG (OP32_SREG (opcode)))
13914 || ((fndopc = find_match (opcode, bz_rt_insns_32)) >= 0
13915 && OP16_VALID_REG (OP32_TREG (opcode)))))
13916 {
13917 unsigned long reg;
13918
13919 reg = OP32_SREG (opcode) ? OP32_SREG (opcode) : OP32_TREG (opcode);
13920
13921 /* Fix the relocation's type. */
13922 irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC7_S1);
13923
a8685210 13924 /* Replace the 32-bit opcode with a 16-bit opcode. */
df58fc94
RS
13925 bfd_put_16 (abfd,
13926 (bz_insns_16[fndopc].match
13927 | BZ16_REG_FIELD (reg)
13928 | (opcode & 0x7f)), /* Addend value. */
2309ddf2 13929 ptr);
df58fc94
RS
13930
13931 /* Delete 2 bytes from irel->r_offset + 2. */
13932 delcnt = 2;
13933 deloff = 2;
13934 }
13935
13936 /* R_MICROMIPS_26_S1 -- JAL to JALS relaxation for microMIPS targets. */
833794fc
MR
13937 else if (!insn32
13938 && r_type == R_MICROMIPS_26_S1
df58fc94
RS
13939 && target_is_micromips_code_p
13940 && irel->r_offset + 7 < sec->size
13941 && MATCH (opcode, jal_insn_32_bd32))
13942 {
13943 unsigned long n32opc;
13944 bfd_boolean relaxed = FALSE;
13945
d21911ea 13946 n32opc = bfd_get_micromips_32 (abfd, ptr + 4);
df58fc94
RS
13947
13948 if (MATCH (n32opc, nop_insn_32))
13949 {
13950 /* Replace delay slot 32-bit NOP with a 16-bit NOP. */
2309ddf2 13951 bfd_put_16 (abfd, nop_insn_16.match, ptr + 4);
df58fc94
RS
13952
13953 relaxed = TRUE;
13954 }
13955 else if (find_match (n32opc, move_insns_32) >= 0)
13956 {
13957 /* Replace delay slot 32-bit MOVE with 16-bit MOVE. */
13958 bfd_put_16 (abfd,
13959 (move_insn_16.match
13960 | MOVE16_RD_FIELD (MOVE32_RD (n32opc))
13961 | MOVE16_RS_FIELD (MOVE32_RS (n32opc))),
2309ddf2 13962 ptr + 4);
df58fc94
RS
13963
13964 relaxed = TRUE;
13965 }
13966 /* Other 32-bit instructions relaxable to 16-bit
13967 instructions will be handled here later. */
13968
13969 if (relaxed)
13970 {
13971 /* JAL with 32-bit delay slot that is changed to a JALS
13972 with 16-bit delay slot. */
d21911ea 13973 bfd_put_micromips_32 (abfd, jal_insn_32_bd16.match, ptr);
df58fc94
RS
13974
13975 /* Delete 2 bytes from irel->r_offset + 6. */
13976 delcnt = 2;
13977 deloff = 6;
13978 }
13979 }
13980
13981 if (delcnt != 0)
13982 {
13983 /* Note that we've changed the relocs, section contents, etc. */
13984 elf_section_data (sec)->relocs = internal_relocs;
13985 elf_section_data (sec)->this_hdr.contents = contents;
13986 symtab_hdr->contents = (unsigned char *) isymbuf;
13987
13988 /* Delete bytes depending on the delcnt and deloff. */
13989 if (!mips_elf_relax_delete_bytes (abfd, sec,
13990 irel->r_offset + deloff, delcnt))
13991 goto error_return;
13992
13993 /* That will change things, so we should relax again.
13994 Note that this is not required, and it may be slow. */
13995 *again = TRUE;
13996 }
13997 }
13998
13999 if (isymbuf != NULL
14000 && symtab_hdr->contents != (unsigned char *) isymbuf)
14001 {
14002 if (! link_info->keep_memory)
14003 free (isymbuf);
14004 else
14005 {
14006 /* Cache the symbols for elf_link_input_bfd. */
14007 symtab_hdr->contents = (unsigned char *) isymbuf;
14008 }
14009 }
14010
14011 if (contents != NULL
14012 && elf_section_data (sec)->this_hdr.contents != contents)
14013 {
14014 if (! link_info->keep_memory)
14015 free (contents);
14016 else
14017 {
14018 /* Cache the section contents for elf_link_input_bfd. */
14019 elf_section_data (sec)->this_hdr.contents = contents;
14020 }
14021 }
14022
14023 if (internal_relocs != NULL
14024 && elf_section_data (sec)->relocs != internal_relocs)
14025 free (internal_relocs);
14026
14027 return TRUE;
14028
14029 error_return:
14030 if (isymbuf != NULL
14031 && symtab_hdr->contents != (unsigned char *) isymbuf)
14032 free (isymbuf);
14033 if (contents != NULL
14034 && elf_section_data (sec)->this_hdr.contents != contents)
14035 free (contents);
14036 if (internal_relocs != NULL
14037 && elf_section_data (sec)->relocs != internal_relocs)
14038 free (internal_relocs);
14039
14040 return FALSE;
14041}
14042\f
b49e97c9
TS
14043/* Create a MIPS ELF linker hash table. */
14044
14045struct bfd_link_hash_table *
9719ad41 14046_bfd_mips_elf_link_hash_table_create (bfd *abfd)
b49e97c9
TS
14047{
14048 struct mips_elf_link_hash_table *ret;
14049 bfd_size_type amt = sizeof (struct mips_elf_link_hash_table);
14050
7bf52ea2 14051 ret = bfd_zmalloc (amt);
9719ad41 14052 if (ret == NULL)
b49e97c9
TS
14053 return NULL;
14054
66eb6687
AM
14055 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
14056 mips_elf_link_hash_newfunc,
4dfe6ac6
NC
14057 sizeof (struct mips_elf_link_hash_entry),
14058 MIPS_ELF_DATA))
b49e97c9 14059 {
e2d34d7d 14060 free (ret);
b49e97c9
TS
14061 return NULL;
14062 }
1bbce132
MR
14063 ret->root.init_plt_refcount.plist = NULL;
14064 ret->root.init_plt_offset.plist = NULL;
b49e97c9 14065
b49e97c9
TS
14066 return &ret->root.root;
14067}
0a44bf69
RS
14068
14069/* Likewise, but indicate that the target is VxWorks. */
14070
14071struct bfd_link_hash_table *
14072_bfd_mips_vxworks_link_hash_table_create (bfd *abfd)
14073{
14074 struct bfd_link_hash_table *ret;
14075
14076 ret = _bfd_mips_elf_link_hash_table_create (abfd);
14077 if (ret)
14078 {
14079 struct mips_elf_link_hash_table *htab;
14080
14081 htab = (struct mips_elf_link_hash_table *) ret;
861fb55a
DJ
14082 htab->use_plts_and_copy_relocs = TRUE;
14083 htab->is_vxworks = TRUE;
0a44bf69
RS
14084 }
14085 return ret;
14086}
861fb55a
DJ
14087
14088/* A function that the linker calls if we are allowed to use PLTs
14089 and copy relocs. */
14090
14091void
14092_bfd_mips_elf_use_plts_and_copy_relocs (struct bfd_link_info *info)
14093{
14094 mips_elf_hash_table (info)->use_plts_and_copy_relocs = TRUE;
14095}
833794fc
MR
14096
14097/* A function that the linker calls to select between all or only
14098 32-bit microMIPS instructions. */
14099
14100void
14101_bfd_mips_elf_insn32 (struct bfd_link_info *info, bfd_boolean on)
14102{
14103 mips_elf_hash_table (info)->insn32 = on;
14104}
b49e97c9 14105\f
c97c330b
MF
14106/* Structure for saying that BFD machine EXTENSION extends BASE. */
14107
14108struct mips_mach_extension
14109{
14110 unsigned long extension, base;
14111};
14112
14113
14114/* An array describing how BFD machines relate to one another. The entries
14115 are ordered topologically with MIPS I extensions listed last. */
14116
14117static const struct mips_mach_extension mips_mach_extensions[] =
14118{
14119 /* MIPS64r2 extensions. */
14120 { bfd_mach_mips_octeon3, bfd_mach_mips_octeon2 },
14121 { bfd_mach_mips_octeon2, bfd_mach_mips_octeonp },
14122 { bfd_mach_mips_octeonp, bfd_mach_mips_octeon },
14123 { bfd_mach_mips_octeon, bfd_mach_mipsisa64r2 },
14124 { bfd_mach_mips_loongson_3a, bfd_mach_mipsisa64r2 },
14125
14126 /* MIPS64 extensions. */
14127 { bfd_mach_mipsisa64r2, bfd_mach_mipsisa64 },
14128 { bfd_mach_mips_sb1, bfd_mach_mipsisa64 },
14129 { bfd_mach_mips_xlr, bfd_mach_mipsisa64 },
14130
14131 /* MIPS V extensions. */
14132 { bfd_mach_mipsisa64, bfd_mach_mips5 },
14133
14134 /* R10000 extensions. */
14135 { bfd_mach_mips12000, bfd_mach_mips10000 },
14136 { bfd_mach_mips14000, bfd_mach_mips10000 },
14137 { bfd_mach_mips16000, bfd_mach_mips10000 },
14138
14139 /* R5000 extensions. Note: the vr5500 ISA is an extension of the core
14140 vr5400 ISA, but doesn't include the multimedia stuff. It seems
14141 better to allow vr5400 and vr5500 code to be merged anyway, since
14142 many libraries will just use the core ISA. Perhaps we could add
14143 some sort of ASE flag if this ever proves a problem. */
14144 { bfd_mach_mips5500, bfd_mach_mips5400 },
14145 { bfd_mach_mips5400, bfd_mach_mips5000 },
14146
14147 /* MIPS IV extensions. */
14148 { bfd_mach_mips5, bfd_mach_mips8000 },
14149 { bfd_mach_mips10000, bfd_mach_mips8000 },
14150 { bfd_mach_mips5000, bfd_mach_mips8000 },
14151 { bfd_mach_mips7000, bfd_mach_mips8000 },
14152 { bfd_mach_mips9000, bfd_mach_mips8000 },
14153
14154 /* VR4100 extensions. */
14155 { bfd_mach_mips4120, bfd_mach_mips4100 },
14156 { bfd_mach_mips4111, bfd_mach_mips4100 },
14157
14158 /* MIPS III extensions. */
14159 { bfd_mach_mips_loongson_2e, bfd_mach_mips4000 },
14160 { bfd_mach_mips_loongson_2f, bfd_mach_mips4000 },
14161 { bfd_mach_mips8000, bfd_mach_mips4000 },
14162 { bfd_mach_mips4650, bfd_mach_mips4000 },
14163 { bfd_mach_mips4600, bfd_mach_mips4000 },
14164 { bfd_mach_mips4400, bfd_mach_mips4000 },
14165 { bfd_mach_mips4300, bfd_mach_mips4000 },
14166 { bfd_mach_mips4100, bfd_mach_mips4000 },
14167 { bfd_mach_mips4010, bfd_mach_mips4000 },
14168 { bfd_mach_mips5900, bfd_mach_mips4000 },
14169
14170 /* MIPS32 extensions. */
14171 { bfd_mach_mipsisa32r2, bfd_mach_mipsisa32 },
14172
14173 /* MIPS II extensions. */
14174 { bfd_mach_mips4000, bfd_mach_mips6000 },
14175 { bfd_mach_mipsisa32, bfd_mach_mips6000 },
14176
14177 /* MIPS I extensions. */
14178 { bfd_mach_mips6000, bfd_mach_mips3000 },
14179 { bfd_mach_mips3900, bfd_mach_mips3000 }
14180};
14181
14182/* Return true if bfd machine EXTENSION is an extension of machine BASE. */
14183
14184static bfd_boolean
14185mips_mach_extends_p (unsigned long base, unsigned long extension)
14186{
14187 size_t i;
14188
14189 if (extension == base)
14190 return TRUE;
14191
14192 if (base == bfd_mach_mipsisa32
14193 && mips_mach_extends_p (bfd_mach_mipsisa64, extension))
14194 return TRUE;
14195
14196 if (base == bfd_mach_mipsisa32r2
14197 && mips_mach_extends_p (bfd_mach_mipsisa64r2, extension))
14198 return TRUE;
14199
14200 for (i = 0; i < ARRAY_SIZE (mips_mach_extensions); i++)
14201 if (extension == mips_mach_extensions[i].extension)
14202 {
14203 extension = mips_mach_extensions[i].base;
14204 if (extension == base)
14205 return TRUE;
14206 }
14207
14208 return FALSE;
14209}
14210
14211/* Return the BFD mach for each .MIPS.abiflags ISA Extension. */
14212
14213static unsigned long
14214bfd_mips_isa_ext_mach (unsigned int isa_ext)
14215{
14216 switch (isa_ext)
14217 {
14218 case AFL_EXT_3900: return bfd_mach_mips3900;
14219 case AFL_EXT_4010: return bfd_mach_mips4010;
14220 case AFL_EXT_4100: return bfd_mach_mips4100;
14221 case AFL_EXT_4111: return bfd_mach_mips4111;
14222 case AFL_EXT_4120: return bfd_mach_mips4120;
14223 case AFL_EXT_4650: return bfd_mach_mips4650;
14224 case AFL_EXT_5400: return bfd_mach_mips5400;
14225 case AFL_EXT_5500: return bfd_mach_mips5500;
14226 case AFL_EXT_5900: return bfd_mach_mips5900;
14227 case AFL_EXT_10000: return bfd_mach_mips10000;
14228 case AFL_EXT_LOONGSON_2E: return bfd_mach_mips_loongson_2e;
14229 case AFL_EXT_LOONGSON_2F: return bfd_mach_mips_loongson_2f;
14230 case AFL_EXT_LOONGSON_3A: return bfd_mach_mips_loongson_3a;
14231 case AFL_EXT_SB1: return bfd_mach_mips_sb1;
14232 case AFL_EXT_OCTEON: return bfd_mach_mips_octeon;
14233 case AFL_EXT_OCTEONP: return bfd_mach_mips_octeonp;
14234 case AFL_EXT_OCTEON2: return bfd_mach_mips_octeon2;
14235 case AFL_EXT_XLR: return bfd_mach_mips_xlr;
14236 default: return bfd_mach_mips3000;
14237 }
14238}
14239
351cdf24
MF
14240/* Return the .MIPS.abiflags value representing each ISA Extension. */
14241
14242unsigned int
14243bfd_mips_isa_ext (bfd *abfd)
14244{
14245 switch (bfd_get_mach (abfd))
14246 {
c97c330b
MF
14247 case bfd_mach_mips3900: return AFL_EXT_3900;
14248 case bfd_mach_mips4010: return AFL_EXT_4010;
14249 case bfd_mach_mips4100: return AFL_EXT_4100;
14250 case bfd_mach_mips4111: return AFL_EXT_4111;
14251 case bfd_mach_mips4120: return AFL_EXT_4120;
14252 case bfd_mach_mips4650: return AFL_EXT_4650;
14253 case bfd_mach_mips5400: return AFL_EXT_5400;
14254 case bfd_mach_mips5500: return AFL_EXT_5500;
14255 case bfd_mach_mips5900: return AFL_EXT_5900;
14256 case bfd_mach_mips10000: return AFL_EXT_10000;
14257 case bfd_mach_mips_loongson_2e: return AFL_EXT_LOONGSON_2E;
14258 case bfd_mach_mips_loongson_2f: return AFL_EXT_LOONGSON_2F;
14259 case bfd_mach_mips_loongson_3a: return AFL_EXT_LOONGSON_3A;
14260 case bfd_mach_mips_sb1: return AFL_EXT_SB1;
14261 case bfd_mach_mips_octeon: return AFL_EXT_OCTEON;
14262 case bfd_mach_mips_octeonp: return AFL_EXT_OCTEONP;
14263 case bfd_mach_mips_octeon3: return AFL_EXT_OCTEON3;
14264 case bfd_mach_mips_octeon2: return AFL_EXT_OCTEON2;
14265 case bfd_mach_mips_xlr: return AFL_EXT_XLR;
14266 default: return 0;
14267 }
14268}
14269
14270/* Encode ISA level and revision as a single value. */
14271#define LEVEL_REV(LEV,REV) ((LEV) << 3 | (REV))
14272
14273/* Decode a single value into level and revision. */
14274#define ISA_LEVEL(LEVREV) ((LEVREV) >> 3)
14275#define ISA_REV(LEVREV) ((LEVREV) & 0x7)
351cdf24
MF
14276
14277/* Update the isa_level, isa_rev, isa_ext fields of abiflags. */
14278
14279static void
14280update_mips_abiflags_isa (bfd *abfd, Elf_Internal_ABIFlags_v0 *abiflags)
14281{
c97c330b 14282 int new_isa = 0;
351cdf24
MF
14283 switch (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH)
14284 {
c97c330b
MF
14285 case E_MIPS_ARCH_1: new_isa = LEVEL_REV (1, 0); break;
14286 case E_MIPS_ARCH_2: new_isa = LEVEL_REV (2, 0); break;
14287 case E_MIPS_ARCH_3: new_isa = LEVEL_REV (3, 0); break;
14288 case E_MIPS_ARCH_4: new_isa = LEVEL_REV (4, 0); break;
14289 case E_MIPS_ARCH_5: new_isa = LEVEL_REV (5, 0); break;
14290 case E_MIPS_ARCH_32: new_isa = LEVEL_REV (32, 1); break;
14291 case E_MIPS_ARCH_32R2: new_isa = LEVEL_REV (32, 2); break;
14292 case E_MIPS_ARCH_32R6: new_isa = LEVEL_REV (32, 6); break;
14293 case E_MIPS_ARCH_64: new_isa = LEVEL_REV (64, 1); break;
14294 case E_MIPS_ARCH_64R2: new_isa = LEVEL_REV (64, 2); break;
14295 case E_MIPS_ARCH_64R6: new_isa = LEVEL_REV (64, 6); break;
351cdf24 14296 default:
4eca0228 14297 _bfd_error_handler
351cdf24
MF
14298 (_("%B: Unknown architecture %s"),
14299 abfd, bfd_printable_name (abfd));
14300 }
14301
c97c330b
MF
14302 if (new_isa > LEVEL_REV (abiflags->isa_level, abiflags->isa_rev))
14303 {
14304 abiflags->isa_level = ISA_LEVEL (new_isa);
14305 abiflags->isa_rev = ISA_REV (new_isa);
14306 }
14307
14308 /* Update the isa_ext if ABFD describes a further extension. */
14309 if (mips_mach_extends_p (bfd_mips_isa_ext_mach (abiflags->isa_ext),
14310 bfd_get_mach (abfd)))
14311 abiflags->isa_ext = bfd_mips_isa_ext (abfd);
351cdf24
MF
14312}
14313
14314/* Return true if the given ELF header flags describe a 32-bit binary. */
14315
14316static bfd_boolean
14317mips_32bit_flags_p (flagword flags)
14318{
14319 return ((flags & EF_MIPS_32BITMODE) != 0
14320 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_O32
14321 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32
14322 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1
14323 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2
14324 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32
7361da2c
AB
14325 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2
14326 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R6);
351cdf24
MF
14327}
14328
14329/* Infer the content of the ABI flags based on the elf header. */
14330
14331static void
14332infer_mips_abiflags (bfd *abfd, Elf_Internal_ABIFlags_v0* abiflags)
14333{
14334 obj_attribute *in_attr;
14335
14336 memset (abiflags, 0, sizeof (Elf_Internal_ABIFlags_v0));
14337 update_mips_abiflags_isa (abfd, abiflags);
14338
14339 if (mips_32bit_flags_p (elf_elfheader (abfd)->e_flags))
14340 abiflags->gpr_size = AFL_REG_32;
14341 else
14342 abiflags->gpr_size = AFL_REG_64;
14343
14344 abiflags->cpr1_size = AFL_REG_NONE;
14345
14346 in_attr = elf_known_obj_attributes (abfd)[OBJ_ATTR_GNU];
14347 abiflags->fp_abi = in_attr[Tag_GNU_MIPS_ABI_FP].i;
14348
14349 if (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_SINGLE
14350 || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_XX
14351 || (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_DOUBLE
14352 && abiflags->gpr_size == AFL_REG_32))
14353 abiflags->cpr1_size = AFL_REG_32;
14354 else if (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_DOUBLE
14355 || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_64
14356 || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_64A)
14357 abiflags->cpr1_size = AFL_REG_64;
14358
14359 abiflags->cpr2_size = AFL_REG_NONE;
14360
14361 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
14362 abiflags->ases |= AFL_ASE_MDMX;
14363 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
14364 abiflags->ases |= AFL_ASE_MIPS16;
14365 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
14366 abiflags->ases |= AFL_ASE_MICROMIPS;
14367
14368 if (abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_ANY
14369 && abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_SOFT
14370 && abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_64A
14371 && abiflags->isa_level >= 32
14372 && abiflags->isa_ext != AFL_EXT_LOONGSON_3A)
14373 abiflags->flags1 |= AFL_FLAGS1_ODDSPREG;
14374}
14375
b49e97c9
TS
14376/* We need to use a special link routine to handle the .reginfo and
14377 the .mdebug sections. We need to merge all instances of these
14378 sections together, not write them all out sequentially. */
14379
b34976b6 14380bfd_boolean
9719ad41 14381_bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
b49e97c9 14382{
b49e97c9
TS
14383 asection *o;
14384 struct bfd_link_order *p;
14385 asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
351cdf24 14386 asection *rtproc_sec, *abiflags_sec;
b49e97c9
TS
14387 Elf32_RegInfo reginfo;
14388 struct ecoff_debug_info debug;
861fb55a 14389 struct mips_htab_traverse_info hti;
7a2a6943
NC
14390 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
14391 const struct ecoff_debug_swap *swap = bed->elf_backend_ecoff_debug_swap;
b49e97c9 14392 HDRR *symhdr = &debug.symbolic_header;
9719ad41 14393 void *mdebug_handle = NULL;
b49e97c9
TS
14394 asection *s;
14395 EXTR esym;
14396 unsigned int i;
14397 bfd_size_type amt;
0a44bf69 14398 struct mips_elf_link_hash_table *htab;
b49e97c9
TS
14399
14400 static const char * const secname[] =
14401 {
14402 ".text", ".init", ".fini", ".data",
14403 ".rodata", ".sdata", ".sbss", ".bss"
14404 };
14405 static const int sc[] =
14406 {
14407 scText, scInit, scFini, scData,
14408 scRData, scSData, scSBss, scBss
14409 };
14410
d4596a51
RS
14411 /* Sort the dynamic symbols so that those with GOT entries come after
14412 those without. */
0a44bf69 14413 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
14414 BFD_ASSERT (htab != NULL);
14415
d4596a51
RS
14416 if (!mips_elf_sort_hash_table (abfd, info))
14417 return FALSE;
b49e97c9 14418
861fb55a
DJ
14419 /* Create any scheduled LA25 stubs. */
14420 hti.info = info;
14421 hti.output_bfd = abfd;
14422 hti.error = FALSE;
14423 htab_traverse (htab->la25_stubs, mips_elf_create_la25_stub, &hti);
14424 if (hti.error)
14425 return FALSE;
14426
b49e97c9
TS
14427 /* Get a value for the GP register. */
14428 if (elf_gp (abfd) == 0)
14429 {
14430 struct bfd_link_hash_entry *h;
14431
b34976b6 14432 h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
9719ad41 14433 if (h != NULL && h->type == bfd_link_hash_defined)
b49e97c9
TS
14434 elf_gp (abfd) = (h->u.def.value
14435 + h->u.def.section->output_section->vma
14436 + h->u.def.section->output_offset);
0a44bf69
RS
14437 else if (htab->is_vxworks
14438 && (h = bfd_link_hash_lookup (info->hash,
14439 "_GLOBAL_OFFSET_TABLE_",
14440 FALSE, FALSE, TRUE))
14441 && h->type == bfd_link_hash_defined)
14442 elf_gp (abfd) = (h->u.def.section->output_section->vma
14443 + h->u.def.section->output_offset
14444 + h->u.def.value);
0e1862bb 14445 else if (bfd_link_relocatable (info))
b49e97c9
TS
14446 {
14447 bfd_vma lo = MINUS_ONE;
14448
14449 /* Find the GP-relative section with the lowest offset. */
9719ad41 14450 for (o = abfd->sections; o != NULL; o = o->next)
b49e97c9
TS
14451 if (o->vma < lo
14452 && (elf_section_data (o)->this_hdr.sh_flags & SHF_MIPS_GPREL))
14453 lo = o->vma;
14454
14455 /* And calculate GP relative to that. */
0a44bf69 14456 elf_gp (abfd) = lo + ELF_MIPS_GP_OFFSET (info);
b49e97c9
TS
14457 }
14458 else
14459 {
14460 /* If the relocate_section function needs to do a reloc
14461 involving the GP value, it should make a reloc_dangerous
14462 callback to warn that GP is not defined. */
14463 }
14464 }
14465
14466 /* Go through the sections and collect the .reginfo and .mdebug
14467 information. */
351cdf24 14468 abiflags_sec = NULL;
b49e97c9
TS
14469 reginfo_sec = NULL;
14470 mdebug_sec = NULL;
14471 gptab_data_sec = NULL;
14472 gptab_bss_sec = NULL;
9719ad41 14473 for (o = abfd->sections; o != NULL; o = o->next)
b49e97c9 14474 {
351cdf24
MF
14475 if (strcmp (o->name, ".MIPS.abiflags") == 0)
14476 {
14477 /* We have found the .MIPS.abiflags section in the output file.
14478 Look through all the link_orders comprising it and remove them.
14479 The data is merged in _bfd_mips_elf_merge_private_bfd_data. */
14480 for (p = o->map_head.link_order; p != NULL; p = p->next)
14481 {
14482 asection *input_section;
14483
14484 if (p->type != bfd_indirect_link_order)
14485 {
14486 if (p->type == bfd_data_link_order)
14487 continue;
14488 abort ();
14489 }
14490
14491 input_section = p->u.indirect.section;
14492
14493 /* Hack: reset the SEC_HAS_CONTENTS flag so that
14494 elf_link_input_bfd ignores this section. */
14495 input_section->flags &= ~SEC_HAS_CONTENTS;
14496 }
14497
14498 /* Size has been set in _bfd_mips_elf_always_size_sections. */
14499 BFD_ASSERT(o->size == sizeof (Elf_External_ABIFlags_v0));
14500
14501 /* Skip this section later on (I don't think this currently
14502 matters, but someday it might). */
14503 o->map_head.link_order = NULL;
14504
14505 abiflags_sec = o;
14506 }
14507
b49e97c9
TS
14508 if (strcmp (o->name, ".reginfo") == 0)
14509 {
14510 memset (&reginfo, 0, sizeof reginfo);
14511
14512 /* We have found the .reginfo section in the output file.
14513 Look through all the link_orders comprising it and merge
14514 the information together. */
8423293d 14515 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
14516 {
14517 asection *input_section;
14518 bfd *input_bfd;
14519 Elf32_External_RegInfo ext;
14520 Elf32_RegInfo sub;
14521
14522 if (p->type != bfd_indirect_link_order)
14523 {
14524 if (p->type == bfd_data_link_order)
14525 continue;
14526 abort ();
14527 }
14528
14529 input_section = p->u.indirect.section;
14530 input_bfd = input_section->owner;
14531
b49e97c9 14532 if (! bfd_get_section_contents (input_bfd, input_section,
9719ad41 14533 &ext, 0, sizeof ext))
b34976b6 14534 return FALSE;
b49e97c9
TS
14535
14536 bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub);
14537
14538 reginfo.ri_gprmask |= sub.ri_gprmask;
14539 reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
14540 reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
14541 reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
14542 reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
14543
14544 /* ri_gp_value is set by the function
14545 mips_elf32_section_processing when the section is
14546 finally written out. */
14547
14548 /* Hack: reset the SEC_HAS_CONTENTS flag so that
14549 elf_link_input_bfd ignores this section. */
14550 input_section->flags &= ~SEC_HAS_CONTENTS;
14551 }
14552
14553 /* Size has been set in _bfd_mips_elf_always_size_sections. */
eea6121a 14554 BFD_ASSERT(o->size == sizeof (Elf32_External_RegInfo));
b49e97c9
TS
14555
14556 /* Skip this section later on (I don't think this currently
14557 matters, but someday it might). */
8423293d 14558 o->map_head.link_order = NULL;
b49e97c9
TS
14559
14560 reginfo_sec = o;
14561 }
14562
14563 if (strcmp (o->name, ".mdebug") == 0)
14564 {
14565 struct extsym_info einfo;
14566 bfd_vma last;
14567
14568 /* We have found the .mdebug section in the output file.
14569 Look through all the link_orders comprising it and merge
14570 the information together. */
14571 symhdr->magic = swap->sym_magic;
14572 /* FIXME: What should the version stamp be? */
14573 symhdr->vstamp = 0;
14574 symhdr->ilineMax = 0;
14575 symhdr->cbLine = 0;
14576 symhdr->idnMax = 0;
14577 symhdr->ipdMax = 0;
14578 symhdr->isymMax = 0;
14579 symhdr->ioptMax = 0;
14580 symhdr->iauxMax = 0;
14581 symhdr->issMax = 0;
14582 symhdr->issExtMax = 0;
14583 symhdr->ifdMax = 0;
14584 symhdr->crfd = 0;
14585 symhdr->iextMax = 0;
14586
14587 /* We accumulate the debugging information itself in the
14588 debug_info structure. */
14589 debug.line = NULL;
14590 debug.external_dnr = NULL;
14591 debug.external_pdr = NULL;
14592 debug.external_sym = NULL;
14593 debug.external_opt = NULL;
14594 debug.external_aux = NULL;
14595 debug.ss = NULL;
14596 debug.ssext = debug.ssext_end = NULL;
14597 debug.external_fdr = NULL;
14598 debug.external_rfd = NULL;
14599 debug.external_ext = debug.external_ext_end = NULL;
14600
14601 mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
9719ad41 14602 if (mdebug_handle == NULL)
b34976b6 14603 return FALSE;
b49e97c9
TS
14604
14605 esym.jmptbl = 0;
14606 esym.cobol_main = 0;
14607 esym.weakext = 0;
14608 esym.reserved = 0;
14609 esym.ifd = ifdNil;
14610 esym.asym.iss = issNil;
14611 esym.asym.st = stLocal;
14612 esym.asym.reserved = 0;
14613 esym.asym.index = indexNil;
14614 last = 0;
14615 for (i = 0; i < sizeof (secname) / sizeof (secname[0]); i++)
14616 {
14617 esym.asym.sc = sc[i];
14618 s = bfd_get_section_by_name (abfd, secname[i]);
14619 if (s != NULL)
14620 {
14621 esym.asym.value = s->vma;
eea6121a 14622 last = s->vma + s->size;
b49e97c9
TS
14623 }
14624 else
14625 esym.asym.value = last;
14626 if (!bfd_ecoff_debug_one_external (abfd, &debug, swap,
14627 secname[i], &esym))
b34976b6 14628 return FALSE;
b49e97c9
TS
14629 }
14630
8423293d 14631 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
14632 {
14633 asection *input_section;
14634 bfd *input_bfd;
14635 const struct ecoff_debug_swap *input_swap;
14636 struct ecoff_debug_info input_debug;
14637 char *eraw_src;
14638 char *eraw_end;
14639
14640 if (p->type != bfd_indirect_link_order)
14641 {
14642 if (p->type == bfd_data_link_order)
14643 continue;
14644 abort ();
14645 }
14646
14647 input_section = p->u.indirect.section;
14648 input_bfd = input_section->owner;
14649
d5eaccd7 14650 if (!is_mips_elf (input_bfd))
b49e97c9
TS
14651 {
14652 /* I don't know what a non MIPS ELF bfd would be
14653 doing with a .mdebug section, but I don't really
14654 want to deal with it. */
14655 continue;
14656 }
14657
14658 input_swap = (get_elf_backend_data (input_bfd)
14659 ->elf_backend_ecoff_debug_swap);
14660
eea6121a 14661 BFD_ASSERT (p->size == input_section->size);
b49e97c9
TS
14662
14663 /* The ECOFF linking code expects that we have already
14664 read in the debugging information and set up an
14665 ecoff_debug_info structure, so we do that now. */
14666 if (! _bfd_mips_elf_read_ecoff_info (input_bfd, input_section,
14667 &input_debug))
b34976b6 14668 return FALSE;
b49e97c9
TS
14669
14670 if (! (bfd_ecoff_debug_accumulate
14671 (mdebug_handle, abfd, &debug, swap, input_bfd,
14672 &input_debug, input_swap, info)))
b34976b6 14673 return FALSE;
b49e97c9
TS
14674
14675 /* Loop through the external symbols. For each one with
14676 interesting information, try to find the symbol in
14677 the linker global hash table and save the information
14678 for the output external symbols. */
14679 eraw_src = input_debug.external_ext;
14680 eraw_end = (eraw_src
14681 + (input_debug.symbolic_header.iextMax
14682 * input_swap->external_ext_size));
14683 for (;
14684 eraw_src < eraw_end;
14685 eraw_src += input_swap->external_ext_size)
14686 {
14687 EXTR ext;
14688 const char *name;
14689 struct mips_elf_link_hash_entry *h;
14690
9719ad41 14691 (*input_swap->swap_ext_in) (input_bfd, eraw_src, &ext);
b49e97c9
TS
14692 if (ext.asym.sc == scNil
14693 || ext.asym.sc == scUndefined
14694 || ext.asym.sc == scSUndefined)
14695 continue;
14696
14697 name = input_debug.ssext + ext.asym.iss;
14698 h = mips_elf_link_hash_lookup (mips_elf_hash_table (info),
b34976b6 14699 name, FALSE, FALSE, TRUE);
b49e97c9
TS
14700 if (h == NULL || h->esym.ifd != -2)
14701 continue;
14702
14703 if (ext.ifd != -1)
14704 {
14705 BFD_ASSERT (ext.ifd
14706 < input_debug.symbolic_header.ifdMax);
14707 ext.ifd = input_debug.ifdmap[ext.ifd];
14708 }
14709
14710 h->esym = ext;
14711 }
14712
14713 /* Free up the information we just read. */
14714 free (input_debug.line);
14715 free (input_debug.external_dnr);
14716 free (input_debug.external_pdr);
14717 free (input_debug.external_sym);
14718 free (input_debug.external_opt);
14719 free (input_debug.external_aux);
14720 free (input_debug.ss);
14721 free (input_debug.ssext);
14722 free (input_debug.external_fdr);
14723 free (input_debug.external_rfd);
14724 free (input_debug.external_ext);
14725
14726 /* Hack: reset the SEC_HAS_CONTENTS flag so that
14727 elf_link_input_bfd ignores this section. */
14728 input_section->flags &= ~SEC_HAS_CONTENTS;
14729 }
14730
0e1862bb 14731 if (SGI_COMPAT (abfd) && bfd_link_pic (info))
b49e97c9
TS
14732 {
14733 /* Create .rtproc section. */
87e0a731 14734 rtproc_sec = bfd_get_linker_section (abfd, ".rtproc");
b49e97c9
TS
14735 if (rtproc_sec == NULL)
14736 {
14737 flagword flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
14738 | SEC_LINKER_CREATED | SEC_READONLY);
14739
87e0a731
AM
14740 rtproc_sec = bfd_make_section_anyway_with_flags (abfd,
14741 ".rtproc",
14742 flags);
b49e97c9 14743 if (rtproc_sec == NULL
b49e97c9 14744 || ! bfd_set_section_alignment (abfd, rtproc_sec, 4))
b34976b6 14745 return FALSE;
b49e97c9
TS
14746 }
14747
14748 if (! mips_elf_create_procedure_table (mdebug_handle, abfd,
14749 info, rtproc_sec,
14750 &debug))
b34976b6 14751 return FALSE;
b49e97c9
TS
14752 }
14753
14754 /* Build the external symbol information. */
14755 einfo.abfd = abfd;
14756 einfo.info = info;
14757 einfo.debug = &debug;
14758 einfo.swap = swap;
b34976b6 14759 einfo.failed = FALSE;
b49e97c9 14760 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
9719ad41 14761 mips_elf_output_extsym, &einfo);
b49e97c9 14762 if (einfo.failed)
b34976b6 14763 return FALSE;
b49e97c9
TS
14764
14765 /* Set the size of the .mdebug section. */
eea6121a 14766 o->size = bfd_ecoff_debug_size (abfd, &debug, swap);
b49e97c9
TS
14767
14768 /* Skip this section later on (I don't think this currently
14769 matters, but someday it might). */
8423293d 14770 o->map_head.link_order = NULL;
b49e97c9
TS
14771
14772 mdebug_sec = o;
14773 }
14774
0112cd26 14775 if (CONST_STRNEQ (o->name, ".gptab."))
b49e97c9
TS
14776 {
14777 const char *subname;
14778 unsigned int c;
14779 Elf32_gptab *tab;
14780 Elf32_External_gptab *ext_tab;
14781 unsigned int j;
14782
14783 /* The .gptab.sdata and .gptab.sbss sections hold
14784 information describing how the small data area would
14785 change depending upon the -G switch. These sections
14786 not used in executables files. */
0e1862bb 14787 if (! bfd_link_relocatable (info))
b49e97c9 14788 {
8423293d 14789 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
14790 {
14791 asection *input_section;
14792
14793 if (p->type != bfd_indirect_link_order)
14794 {
14795 if (p->type == bfd_data_link_order)
14796 continue;
14797 abort ();
14798 }
14799
14800 input_section = p->u.indirect.section;
14801
14802 /* Hack: reset the SEC_HAS_CONTENTS flag so that
14803 elf_link_input_bfd ignores this section. */
14804 input_section->flags &= ~SEC_HAS_CONTENTS;
14805 }
14806
14807 /* Skip this section later on (I don't think this
14808 currently matters, but someday it might). */
8423293d 14809 o->map_head.link_order = NULL;
b49e97c9
TS
14810
14811 /* Really remove the section. */
5daa8fe7 14812 bfd_section_list_remove (abfd, o);
b49e97c9
TS
14813 --abfd->section_count;
14814
14815 continue;
14816 }
14817
14818 /* There is one gptab for initialized data, and one for
14819 uninitialized data. */
14820 if (strcmp (o->name, ".gptab.sdata") == 0)
14821 gptab_data_sec = o;
14822 else if (strcmp (o->name, ".gptab.sbss") == 0)
14823 gptab_bss_sec = o;
14824 else
14825 {
4eca0228 14826 _bfd_error_handler
b49e97c9
TS
14827 (_("%s: illegal section name `%s'"),
14828 bfd_get_filename (abfd), o->name);
14829 bfd_set_error (bfd_error_nonrepresentable_section);
b34976b6 14830 return FALSE;
b49e97c9
TS
14831 }
14832
14833 /* The linker script always combines .gptab.data and
14834 .gptab.sdata into .gptab.sdata, and likewise for
14835 .gptab.bss and .gptab.sbss. It is possible that there is
14836 no .sdata or .sbss section in the output file, in which
14837 case we must change the name of the output section. */
14838 subname = o->name + sizeof ".gptab" - 1;
14839 if (bfd_get_section_by_name (abfd, subname) == NULL)
14840 {
14841 if (o == gptab_data_sec)
14842 o->name = ".gptab.data";
14843 else
14844 o->name = ".gptab.bss";
14845 subname = o->name + sizeof ".gptab" - 1;
14846 BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
14847 }
14848
14849 /* Set up the first entry. */
14850 c = 1;
14851 amt = c * sizeof (Elf32_gptab);
9719ad41 14852 tab = bfd_malloc (amt);
b49e97c9 14853 if (tab == NULL)
b34976b6 14854 return FALSE;
b49e97c9
TS
14855 tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
14856 tab[0].gt_header.gt_unused = 0;
14857
14858 /* Combine the input sections. */
8423293d 14859 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
14860 {
14861 asection *input_section;
14862 bfd *input_bfd;
14863 bfd_size_type size;
14864 unsigned long last;
14865 bfd_size_type gpentry;
14866
14867 if (p->type != bfd_indirect_link_order)
14868 {
14869 if (p->type == bfd_data_link_order)
14870 continue;
14871 abort ();
14872 }
14873
14874 input_section = p->u.indirect.section;
14875 input_bfd = input_section->owner;
14876
14877 /* Combine the gptab entries for this input section one
14878 by one. We know that the input gptab entries are
14879 sorted by ascending -G value. */
eea6121a 14880 size = input_section->size;
b49e97c9
TS
14881 last = 0;
14882 for (gpentry = sizeof (Elf32_External_gptab);
14883 gpentry < size;
14884 gpentry += sizeof (Elf32_External_gptab))
14885 {
14886 Elf32_External_gptab ext_gptab;
14887 Elf32_gptab int_gptab;
14888 unsigned long val;
14889 unsigned long add;
b34976b6 14890 bfd_boolean exact;
b49e97c9
TS
14891 unsigned int look;
14892
14893 if (! (bfd_get_section_contents
9719ad41
RS
14894 (input_bfd, input_section, &ext_gptab, gpentry,
14895 sizeof (Elf32_External_gptab))))
b49e97c9
TS
14896 {
14897 free (tab);
b34976b6 14898 return FALSE;
b49e97c9
TS
14899 }
14900
14901 bfd_mips_elf32_swap_gptab_in (input_bfd, &ext_gptab,
14902 &int_gptab);
14903 val = int_gptab.gt_entry.gt_g_value;
14904 add = int_gptab.gt_entry.gt_bytes - last;
14905
b34976b6 14906 exact = FALSE;
b49e97c9
TS
14907 for (look = 1; look < c; look++)
14908 {
14909 if (tab[look].gt_entry.gt_g_value >= val)
14910 tab[look].gt_entry.gt_bytes += add;
14911
14912 if (tab[look].gt_entry.gt_g_value == val)
b34976b6 14913 exact = TRUE;
b49e97c9
TS
14914 }
14915
14916 if (! exact)
14917 {
14918 Elf32_gptab *new_tab;
14919 unsigned int max;
14920
14921 /* We need a new table entry. */
14922 amt = (bfd_size_type) (c + 1) * sizeof (Elf32_gptab);
9719ad41 14923 new_tab = bfd_realloc (tab, amt);
b49e97c9
TS
14924 if (new_tab == NULL)
14925 {
14926 free (tab);
b34976b6 14927 return FALSE;
b49e97c9
TS
14928 }
14929 tab = new_tab;
14930 tab[c].gt_entry.gt_g_value = val;
14931 tab[c].gt_entry.gt_bytes = add;
14932
14933 /* Merge in the size for the next smallest -G
14934 value, since that will be implied by this new
14935 value. */
14936 max = 0;
14937 for (look = 1; look < c; look++)
14938 {
14939 if (tab[look].gt_entry.gt_g_value < val
14940 && (max == 0
14941 || (tab[look].gt_entry.gt_g_value
14942 > tab[max].gt_entry.gt_g_value)))
14943 max = look;
14944 }
14945 if (max != 0)
14946 tab[c].gt_entry.gt_bytes +=
14947 tab[max].gt_entry.gt_bytes;
14948
14949 ++c;
14950 }
14951
14952 last = int_gptab.gt_entry.gt_bytes;
14953 }
14954
14955 /* Hack: reset the SEC_HAS_CONTENTS flag so that
14956 elf_link_input_bfd ignores this section. */
14957 input_section->flags &= ~SEC_HAS_CONTENTS;
14958 }
14959
14960 /* The table must be sorted by -G value. */
14961 if (c > 2)
14962 qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
14963
14964 /* Swap out the table. */
14965 amt = (bfd_size_type) c * sizeof (Elf32_External_gptab);
9719ad41 14966 ext_tab = bfd_alloc (abfd, amt);
b49e97c9
TS
14967 if (ext_tab == NULL)
14968 {
14969 free (tab);
b34976b6 14970 return FALSE;
b49e97c9
TS
14971 }
14972
14973 for (j = 0; j < c; j++)
14974 bfd_mips_elf32_swap_gptab_out (abfd, tab + j, ext_tab + j);
14975 free (tab);
14976
eea6121a 14977 o->size = c * sizeof (Elf32_External_gptab);
b49e97c9
TS
14978 o->contents = (bfd_byte *) ext_tab;
14979
14980 /* Skip this section later on (I don't think this currently
14981 matters, but someday it might). */
8423293d 14982 o->map_head.link_order = NULL;
b49e97c9
TS
14983 }
14984 }
14985
14986 /* Invoke the regular ELF backend linker to do all the work. */
c152c796 14987 if (!bfd_elf_final_link (abfd, info))
b34976b6 14988 return FALSE;
b49e97c9
TS
14989
14990 /* Now write out the computed sections. */
14991
351cdf24
MF
14992 if (abiflags_sec != NULL)
14993 {
14994 Elf_External_ABIFlags_v0 ext;
14995 Elf_Internal_ABIFlags_v0 *abiflags;
14996
14997 abiflags = &mips_elf_tdata (abfd)->abiflags;
14998
14999 /* Set up the abiflags if no valid input sections were found. */
15000 if (!mips_elf_tdata (abfd)->abiflags_valid)
15001 {
15002 infer_mips_abiflags (abfd, abiflags);
15003 mips_elf_tdata (abfd)->abiflags_valid = TRUE;
15004 }
15005 bfd_mips_elf_swap_abiflags_v0_out (abfd, abiflags, &ext);
15006 if (! bfd_set_section_contents (abfd, abiflags_sec, &ext, 0, sizeof ext))
15007 return FALSE;
15008 }
15009
9719ad41 15010 if (reginfo_sec != NULL)
b49e97c9
TS
15011 {
15012 Elf32_External_RegInfo ext;
15013
15014 bfd_mips_elf32_swap_reginfo_out (abfd, &reginfo, &ext);
9719ad41 15015 if (! bfd_set_section_contents (abfd, reginfo_sec, &ext, 0, sizeof ext))
b34976b6 15016 return FALSE;
b49e97c9
TS
15017 }
15018
9719ad41 15019 if (mdebug_sec != NULL)
b49e97c9
TS
15020 {
15021 BFD_ASSERT (abfd->output_has_begun);
15022 if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
15023 swap, info,
15024 mdebug_sec->filepos))
b34976b6 15025 return FALSE;
b49e97c9
TS
15026
15027 bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
15028 }
15029
9719ad41 15030 if (gptab_data_sec != NULL)
b49e97c9
TS
15031 {
15032 if (! bfd_set_section_contents (abfd, gptab_data_sec,
15033 gptab_data_sec->contents,
eea6121a 15034 0, gptab_data_sec->size))
b34976b6 15035 return FALSE;
b49e97c9
TS
15036 }
15037
9719ad41 15038 if (gptab_bss_sec != NULL)
b49e97c9
TS
15039 {
15040 if (! bfd_set_section_contents (abfd, gptab_bss_sec,
15041 gptab_bss_sec->contents,
eea6121a 15042 0, gptab_bss_sec->size))
b34976b6 15043 return FALSE;
b49e97c9
TS
15044 }
15045
15046 if (SGI_COMPAT (abfd))
15047 {
15048 rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
15049 if (rtproc_sec != NULL)
15050 {
15051 if (! bfd_set_section_contents (abfd, rtproc_sec,
15052 rtproc_sec->contents,
eea6121a 15053 0, rtproc_sec->size))
b34976b6 15054 return FALSE;
b49e97c9
TS
15055 }
15056 }
15057
b34976b6 15058 return TRUE;
b49e97c9
TS
15059}
15060\f
b2e9744f
MR
15061/* Merge object file header flags from IBFD into OBFD. Raise an error
15062 if there are conflicting settings. */
15063
15064static bfd_boolean
15065mips_elf_merge_obj_e_flags (bfd *ibfd, bfd *obfd)
15066{
15067 struct mips_elf_obj_tdata *out_tdata = mips_elf_tdata (obfd);
15068 flagword old_flags;
15069 flagword new_flags;
15070 bfd_boolean ok;
15071
15072 new_flags = elf_elfheader (ibfd)->e_flags;
15073 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_NOREORDER;
15074 old_flags = elf_elfheader (obfd)->e_flags;
15075
15076 /* Check flag compatibility. */
15077
15078 new_flags &= ~EF_MIPS_NOREORDER;
15079 old_flags &= ~EF_MIPS_NOREORDER;
15080
15081 /* Some IRIX 6 BSD-compatibility objects have this bit set. It
15082 doesn't seem to matter. */
15083 new_flags &= ~EF_MIPS_XGOT;
15084 old_flags &= ~EF_MIPS_XGOT;
15085
15086 /* MIPSpro generates ucode info in n64 objects. Again, we should
15087 just be able to ignore this. */
15088 new_flags &= ~EF_MIPS_UCODE;
15089 old_flags &= ~EF_MIPS_UCODE;
15090
15091 /* DSOs should only be linked with CPIC code. */
15092 if ((ibfd->flags & DYNAMIC) != 0)
15093 new_flags |= EF_MIPS_PIC | EF_MIPS_CPIC;
15094
15095 if (new_flags == old_flags)
15096 return TRUE;
15097
15098 ok = TRUE;
15099
15100 if (((new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0)
15101 != ((old_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0))
15102 {
4eca0228 15103 _bfd_error_handler
b2e9744f
MR
15104 (_("%B: warning: linking abicalls files with non-abicalls files"),
15105 ibfd);
15106 ok = TRUE;
15107 }
15108
15109 if (new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC))
15110 elf_elfheader (obfd)->e_flags |= EF_MIPS_CPIC;
15111 if (! (new_flags & EF_MIPS_PIC))
15112 elf_elfheader (obfd)->e_flags &= ~EF_MIPS_PIC;
15113
15114 new_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
15115 old_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
15116
15117 /* Compare the ISAs. */
15118 if (mips_32bit_flags_p (old_flags) != mips_32bit_flags_p (new_flags))
15119 {
4eca0228 15120 _bfd_error_handler
b2e9744f
MR
15121 (_("%B: linking 32-bit code with 64-bit code"),
15122 ibfd);
15123 ok = FALSE;
15124 }
15125 else if (!mips_mach_extends_p (bfd_get_mach (ibfd), bfd_get_mach (obfd)))
15126 {
15127 /* OBFD's ISA isn't the same as, or an extension of, IBFD's. */
15128 if (mips_mach_extends_p (bfd_get_mach (obfd), bfd_get_mach (ibfd)))
15129 {
15130 /* Copy the architecture info from IBFD to OBFD. Also copy
15131 the 32-bit flag (if set) so that we continue to recognise
15132 OBFD as a 32-bit binary. */
15133 bfd_set_arch_info (obfd, bfd_get_arch_info (ibfd));
15134 elf_elfheader (obfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
15135 elf_elfheader (obfd)->e_flags
15136 |= new_flags & (EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15137
15138 /* Update the ABI flags isa_level, isa_rev, isa_ext fields. */
15139 update_mips_abiflags_isa (obfd, &out_tdata->abiflags);
15140
15141 /* Copy across the ABI flags if OBFD doesn't use them
15142 and if that was what caused us to treat IBFD as 32-bit. */
15143 if ((old_flags & EF_MIPS_ABI) == 0
15144 && mips_32bit_flags_p (new_flags)
15145 && !mips_32bit_flags_p (new_flags & ~EF_MIPS_ABI))
15146 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ABI;
15147 }
15148 else
15149 {
15150 /* The ISAs aren't compatible. */
4eca0228 15151 _bfd_error_handler
b2e9744f
MR
15152 (_("%B: linking %s module with previous %s modules"),
15153 ibfd,
15154 bfd_printable_name (ibfd),
15155 bfd_printable_name (obfd));
15156 ok = FALSE;
15157 }
15158 }
15159
15160 new_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15161 old_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15162
15163 /* Compare ABIs. The 64-bit ABI does not use EF_MIPS_ABI. But, it
15164 does set EI_CLASS differently from any 32-bit ABI. */
15165 if ((new_flags & EF_MIPS_ABI) != (old_flags & EF_MIPS_ABI)
15166 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
15167 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
15168 {
15169 /* Only error if both are set (to different values). */
15170 if (((new_flags & EF_MIPS_ABI) && (old_flags & EF_MIPS_ABI))
15171 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
15172 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
15173 {
4eca0228 15174 _bfd_error_handler
b2e9744f
MR
15175 (_("%B: ABI mismatch: linking %s module with previous %s modules"),
15176 ibfd,
15177 elf_mips_abi_name (ibfd),
15178 elf_mips_abi_name (obfd));
15179 ok = FALSE;
15180 }
15181 new_flags &= ~EF_MIPS_ABI;
15182 old_flags &= ~EF_MIPS_ABI;
15183 }
15184
15185 /* Compare ASEs. Forbid linking MIPS16 and microMIPS ASE modules together
15186 and allow arbitrary mixing of the remaining ASEs (retain the union). */
15187 if ((new_flags & EF_MIPS_ARCH_ASE) != (old_flags & EF_MIPS_ARCH_ASE))
15188 {
15189 int old_micro = old_flags & EF_MIPS_ARCH_ASE_MICROMIPS;
15190 int new_micro = new_flags & EF_MIPS_ARCH_ASE_MICROMIPS;
15191 int old_m16 = old_flags & EF_MIPS_ARCH_ASE_M16;
15192 int new_m16 = new_flags & EF_MIPS_ARCH_ASE_M16;
15193 int micro_mis = old_m16 && new_micro;
15194 int m16_mis = old_micro && new_m16;
15195
15196 if (m16_mis || micro_mis)
15197 {
4eca0228 15198 _bfd_error_handler
b2e9744f
MR
15199 (_("%B: ASE mismatch: linking %s module with previous %s modules"),
15200 ibfd,
15201 m16_mis ? "MIPS16" : "microMIPS",
15202 m16_mis ? "microMIPS" : "MIPS16");
15203 ok = FALSE;
15204 }
15205
15206 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ARCH_ASE;
15207
15208 new_flags &= ~ EF_MIPS_ARCH_ASE;
15209 old_flags &= ~ EF_MIPS_ARCH_ASE;
15210 }
15211
15212 /* Compare NaN encodings. */
15213 if ((new_flags & EF_MIPS_NAN2008) != (old_flags & EF_MIPS_NAN2008))
15214 {
15215 _bfd_error_handler (_("%B: linking %s module with previous %s modules"),
15216 ibfd,
15217 (new_flags & EF_MIPS_NAN2008
15218 ? "-mnan=2008" : "-mnan=legacy"),
15219 (old_flags & EF_MIPS_NAN2008
15220 ? "-mnan=2008" : "-mnan=legacy"));
15221 ok = FALSE;
15222 new_flags &= ~EF_MIPS_NAN2008;
15223 old_flags &= ~EF_MIPS_NAN2008;
15224 }
15225
15226 /* Compare FP64 state. */
15227 if ((new_flags & EF_MIPS_FP64) != (old_flags & EF_MIPS_FP64))
15228 {
15229 _bfd_error_handler (_("%B: linking %s module with previous %s modules"),
15230 ibfd,
15231 (new_flags & EF_MIPS_FP64
15232 ? "-mfp64" : "-mfp32"),
15233 (old_flags & EF_MIPS_FP64
15234 ? "-mfp64" : "-mfp32"));
15235 ok = FALSE;
15236 new_flags &= ~EF_MIPS_FP64;
15237 old_flags &= ~EF_MIPS_FP64;
15238 }
15239
15240 /* Warn about any other mismatches */
15241 if (new_flags != old_flags)
15242 {
4eca0228 15243 _bfd_error_handler
b2e9744f
MR
15244 (_("%B: uses different e_flags (0x%lx) fields than previous modules "
15245 "(0x%lx)"),
15246 ibfd, (unsigned long) new_flags,
15247 (unsigned long) old_flags);
15248 ok = FALSE;
15249 }
15250
15251 return ok;
15252}
15253
2cf19d5c
JM
15254/* Merge object attributes from IBFD into OBFD. Raise an error if
15255 there are conflicting attributes. */
15256static bfd_boolean
15257mips_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
15258{
15259 obj_attribute *in_attr;
15260 obj_attribute *out_attr;
6ae68ba3 15261 bfd *abi_fp_bfd;
b60bf9be 15262 bfd *abi_msa_bfd;
6ae68ba3
MR
15263
15264 abi_fp_bfd = mips_elf_tdata (obfd)->abi_fp_bfd;
15265 in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
d929bc19 15266 if (!abi_fp_bfd && in_attr[Tag_GNU_MIPS_ABI_FP].i != Val_GNU_MIPS_ABI_FP_ANY)
6ae68ba3 15267 mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
2cf19d5c 15268
b60bf9be
CF
15269 abi_msa_bfd = mips_elf_tdata (obfd)->abi_msa_bfd;
15270 if (!abi_msa_bfd
15271 && in_attr[Tag_GNU_MIPS_ABI_MSA].i != Val_GNU_MIPS_ABI_MSA_ANY)
15272 mips_elf_tdata (obfd)->abi_msa_bfd = ibfd;
15273
2cf19d5c
JM
15274 if (!elf_known_obj_attributes_proc (obfd)[0].i)
15275 {
15276 /* This is the first object. Copy the attributes. */
15277 _bfd_elf_copy_obj_attributes (ibfd, obfd);
15278
15279 /* Use the Tag_null value to indicate the attributes have been
15280 initialized. */
15281 elf_known_obj_attributes_proc (obfd)[0].i = 1;
15282
15283 return TRUE;
15284 }
15285
15286 /* Check for conflicting Tag_GNU_MIPS_ABI_FP attributes and merge
15287 non-conflicting ones. */
2cf19d5c
JM
15288 out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
15289 if (in_attr[Tag_GNU_MIPS_ABI_FP].i != out_attr[Tag_GNU_MIPS_ABI_FP].i)
15290 {
757a636f 15291 int out_fp, in_fp;
6ae68ba3 15292
757a636f
RS
15293 out_fp = out_attr[Tag_GNU_MIPS_ABI_FP].i;
15294 in_fp = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15295 out_attr[Tag_GNU_MIPS_ABI_FP].type = 1;
15296 if (out_fp == Val_GNU_MIPS_ABI_FP_ANY)
15297 out_attr[Tag_GNU_MIPS_ABI_FP].i = in_fp;
351cdf24
MF
15298 else if (out_fp == Val_GNU_MIPS_ABI_FP_XX
15299 && (in_fp == Val_GNU_MIPS_ABI_FP_DOUBLE
15300 || in_fp == Val_GNU_MIPS_ABI_FP_64
15301 || in_fp == Val_GNU_MIPS_ABI_FP_64A))
15302 {
15303 mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
15304 out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15305 }
15306 else if (in_fp == Val_GNU_MIPS_ABI_FP_XX
15307 && (out_fp == Val_GNU_MIPS_ABI_FP_DOUBLE
15308 || out_fp == Val_GNU_MIPS_ABI_FP_64
15309 || out_fp == Val_GNU_MIPS_ABI_FP_64A))
15310 /* Keep the current setting. */;
15311 else if (out_fp == Val_GNU_MIPS_ABI_FP_64A
15312 && in_fp == Val_GNU_MIPS_ABI_FP_64)
15313 {
15314 mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
15315 out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15316 }
15317 else if (in_fp == Val_GNU_MIPS_ABI_FP_64A
15318 && out_fp == Val_GNU_MIPS_ABI_FP_64)
15319 /* Keep the current setting. */;
757a636f
RS
15320 else if (in_fp != Val_GNU_MIPS_ABI_FP_ANY)
15321 {
15322 const char *out_string, *in_string;
6ae68ba3 15323
757a636f
RS
15324 out_string = _bfd_mips_fp_abi_string (out_fp);
15325 in_string = _bfd_mips_fp_abi_string (in_fp);
15326 /* First warn about cases involving unrecognised ABIs. */
15327 if (!out_string && !in_string)
15328 _bfd_error_handler
15329 (_("Warning: %B uses unknown floating point ABI %d "
15330 "(set by %B), %B uses unknown floating point ABI %d"),
15331 obfd, abi_fp_bfd, ibfd, out_fp, in_fp);
15332 else if (!out_string)
15333 _bfd_error_handler
15334 (_("Warning: %B uses unknown floating point ABI %d "
15335 "(set by %B), %B uses %s"),
15336 obfd, abi_fp_bfd, ibfd, out_fp, in_string);
15337 else if (!in_string)
15338 _bfd_error_handler
15339 (_("Warning: %B uses %s (set by %B), "
15340 "%B uses unknown floating point ABI %d"),
15341 obfd, abi_fp_bfd, ibfd, out_string, in_fp);
15342 else
15343 {
15344 /* If one of the bfds is soft-float, the other must be
15345 hard-float. The exact choice of hard-float ABI isn't
15346 really relevant to the error message. */
15347 if (in_fp == Val_GNU_MIPS_ABI_FP_SOFT)
15348 out_string = "-mhard-float";
15349 else if (out_fp == Val_GNU_MIPS_ABI_FP_SOFT)
15350 in_string = "-mhard-float";
15351 _bfd_error_handler
15352 (_("Warning: %B uses %s (set by %B), %B uses %s"),
15353 obfd, abi_fp_bfd, ibfd, out_string, in_string);
15354 }
15355 }
2cf19d5c
JM
15356 }
15357
b60bf9be
CF
15358 /* Check for conflicting Tag_GNU_MIPS_ABI_MSA attributes and merge
15359 non-conflicting ones. */
15360 if (in_attr[Tag_GNU_MIPS_ABI_MSA].i != out_attr[Tag_GNU_MIPS_ABI_MSA].i)
15361 {
15362 out_attr[Tag_GNU_MIPS_ABI_MSA].type = 1;
15363 if (out_attr[Tag_GNU_MIPS_ABI_MSA].i == Val_GNU_MIPS_ABI_MSA_ANY)
15364 out_attr[Tag_GNU_MIPS_ABI_MSA].i = in_attr[Tag_GNU_MIPS_ABI_MSA].i;
15365 else if (in_attr[Tag_GNU_MIPS_ABI_MSA].i != Val_GNU_MIPS_ABI_MSA_ANY)
15366 switch (out_attr[Tag_GNU_MIPS_ABI_MSA].i)
15367 {
15368 case Val_GNU_MIPS_ABI_MSA_128:
15369 _bfd_error_handler
15370 (_("Warning: %B uses %s (set by %B), "
15371 "%B uses unknown MSA ABI %d"),
15372 obfd, abi_msa_bfd, ibfd,
15373 "-mmsa", in_attr[Tag_GNU_MIPS_ABI_MSA].i);
15374 break;
15375
15376 default:
15377 switch (in_attr[Tag_GNU_MIPS_ABI_MSA].i)
15378 {
15379 case Val_GNU_MIPS_ABI_MSA_128:
15380 _bfd_error_handler
15381 (_("Warning: %B uses unknown MSA ABI %d "
15382 "(set by %B), %B uses %s"),
15383 obfd, abi_msa_bfd, ibfd,
15384 out_attr[Tag_GNU_MIPS_ABI_MSA].i, "-mmsa");
15385 break;
15386
15387 default:
15388 _bfd_error_handler
15389 (_("Warning: %B uses unknown MSA ABI %d "
15390 "(set by %B), %B uses unknown MSA ABI %d"),
15391 obfd, abi_msa_bfd, ibfd,
15392 out_attr[Tag_GNU_MIPS_ABI_MSA].i,
15393 in_attr[Tag_GNU_MIPS_ABI_MSA].i);
15394 break;
15395 }
15396 }
15397 }
15398
2cf19d5c 15399 /* Merge Tag_compatibility attributes and any common GNU ones. */
43d223b5 15400 return _bfd_elf_merge_object_attributes (ibfd, obfd);
2cf19d5c
JM
15401}
15402
a3dc0a7f
MR
15403/* Merge object ABI flags from IBFD into OBFD. Raise an error if
15404 there are conflicting settings. */
15405
15406static bfd_boolean
15407mips_elf_merge_obj_abiflags (bfd *ibfd, bfd *obfd)
15408{
15409 obj_attribute *out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
15410 struct mips_elf_obj_tdata *out_tdata = mips_elf_tdata (obfd);
15411 struct mips_elf_obj_tdata *in_tdata = mips_elf_tdata (ibfd);
15412
15413 /* Update the output abiflags fp_abi using the computed fp_abi. */
15414 out_tdata->abiflags.fp_abi = out_attr[Tag_GNU_MIPS_ABI_FP].i;
15415
15416#define max(a, b) ((a) > (b) ? (a) : (b))
15417 /* Merge abiflags. */
15418 out_tdata->abiflags.isa_level = max (out_tdata->abiflags.isa_level,
15419 in_tdata->abiflags.isa_level);
15420 out_tdata->abiflags.isa_rev = max (out_tdata->abiflags.isa_rev,
15421 in_tdata->abiflags.isa_rev);
15422 out_tdata->abiflags.gpr_size = max (out_tdata->abiflags.gpr_size,
15423 in_tdata->abiflags.gpr_size);
15424 out_tdata->abiflags.cpr1_size = max (out_tdata->abiflags.cpr1_size,
15425 in_tdata->abiflags.cpr1_size);
15426 out_tdata->abiflags.cpr2_size = max (out_tdata->abiflags.cpr2_size,
15427 in_tdata->abiflags.cpr2_size);
15428#undef max
15429 out_tdata->abiflags.ases |= in_tdata->abiflags.ases;
15430 out_tdata->abiflags.flags1 |= in_tdata->abiflags.flags1;
15431
15432 return TRUE;
15433}
15434
b49e97c9
TS
15435/* Merge backend specific data from an object file to the output
15436 object file when linking. */
15437
b34976b6 15438bfd_boolean
9719ad41 15439_bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
b49e97c9 15440{
cf8502c1
MR
15441 struct mips_elf_obj_tdata *out_tdata;
15442 struct mips_elf_obj_tdata *in_tdata;
b34976b6 15443 bfd_boolean null_input_bfd = TRUE;
b49e97c9 15444 asection *sec;
d537eeb5 15445 bfd_boolean ok;
b49e97c9 15446
58238693 15447 /* Check if we have the same endianness. */
82e51918 15448 if (! _bfd_generic_verify_endian_match (ibfd, obfd))
aa701218 15449 {
4eca0228 15450 _bfd_error_handler
d003868e
AM
15451 (_("%B: endianness incompatible with that of the selected emulation"),
15452 ibfd);
aa701218
AO
15453 return FALSE;
15454 }
b49e97c9 15455
d5eaccd7 15456 if (!is_mips_elf (ibfd) || !is_mips_elf (obfd))
b34976b6 15457 return TRUE;
b49e97c9 15458
cf8502c1
MR
15459 in_tdata = mips_elf_tdata (ibfd);
15460 out_tdata = mips_elf_tdata (obfd);
15461
aa701218
AO
15462 if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
15463 {
4eca0228 15464 _bfd_error_handler
d003868e
AM
15465 (_("%B: ABI is incompatible with that of the selected emulation"),
15466 ibfd);
aa701218
AO
15467 return FALSE;
15468 }
15469
23ba6f18
MR
15470 /* Check to see if the input BFD actually contains any sections. If not,
15471 then it has no attributes, and its flags may not have been initialized
15472 either, but it cannot actually cause any incompatibility. */
351cdf24
MF
15473 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
15474 {
15475 /* Ignore synthetic sections and empty .text, .data and .bss sections
15476 which are automatically generated by gas. Also ignore fake
15477 (s)common sections, since merely defining a common symbol does
15478 not affect compatibility. */
15479 if ((sec->flags & SEC_IS_COMMON) == 0
15480 && strcmp (sec->name, ".reginfo")
15481 && strcmp (sec->name, ".mdebug")
15482 && (sec->size != 0
15483 || (strcmp (sec->name, ".text")
15484 && strcmp (sec->name, ".data")
15485 && strcmp (sec->name, ".bss"))))
15486 {
15487 null_input_bfd = FALSE;
15488 break;
15489 }
15490 }
15491 if (null_input_bfd)
15492 return TRUE;
15493
28d45e28 15494 /* Populate abiflags using existing information. */
23ba6f18
MR
15495 if (in_tdata->abiflags_valid)
15496 {
15497 obj_attribute *in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
28d45e28
MR
15498 Elf_Internal_ABIFlags_v0 in_abiflags;
15499 Elf_Internal_ABIFlags_v0 abiflags;
15500
15501 /* Set up the FP ABI attribute from the abiflags if it is not already
15502 set. */
23ba6f18
MR
15503 if (in_attr[Tag_GNU_MIPS_ABI_FP].i == Val_GNU_MIPS_ABI_FP_ANY)
15504 in_attr[Tag_GNU_MIPS_ABI_FP].i = in_tdata->abiflags.fp_abi;
23ba6f18 15505
351cdf24 15506 infer_mips_abiflags (ibfd, &abiflags);
cf8502c1 15507 in_abiflags = in_tdata->abiflags;
351cdf24
MF
15508
15509 /* It is not possible to infer the correct ISA revision
15510 for R3 or R5 so drop down to R2 for the checks. */
15511 if (in_abiflags.isa_rev == 3 || in_abiflags.isa_rev == 5)
15512 in_abiflags.isa_rev = 2;
15513
c97c330b
MF
15514 if (LEVEL_REV (in_abiflags.isa_level, in_abiflags.isa_rev)
15515 < LEVEL_REV (abiflags.isa_level, abiflags.isa_rev))
4eca0228 15516 _bfd_error_handler
351cdf24
MF
15517 (_("%B: warning: Inconsistent ISA between e_flags and "
15518 ".MIPS.abiflags"), ibfd);
15519 if (abiflags.fp_abi != Val_GNU_MIPS_ABI_FP_ANY
15520 && in_abiflags.fp_abi != abiflags.fp_abi)
4eca0228 15521 _bfd_error_handler
dcb1c796 15522 (_("%B: warning: Inconsistent FP ABI between .gnu.attributes and "
351cdf24
MF
15523 ".MIPS.abiflags"), ibfd);
15524 if ((in_abiflags.ases & abiflags.ases) != abiflags.ases)
4eca0228 15525 _bfd_error_handler
351cdf24
MF
15526 (_("%B: warning: Inconsistent ASEs between e_flags and "
15527 ".MIPS.abiflags"), ibfd);
c97c330b
MF
15528 /* The isa_ext is allowed to be an extension of what can be inferred
15529 from e_flags. */
15530 if (!mips_mach_extends_p (bfd_mips_isa_ext_mach (abiflags.isa_ext),
15531 bfd_mips_isa_ext_mach (in_abiflags.isa_ext)))
4eca0228 15532 _bfd_error_handler
351cdf24
MF
15533 (_("%B: warning: Inconsistent ISA extensions between e_flags and "
15534 ".MIPS.abiflags"), ibfd);
15535 if (in_abiflags.flags2 != 0)
4eca0228 15536 _bfd_error_handler
351cdf24
MF
15537 (_("%B: warning: Unexpected flag in the flags2 field of "
15538 ".MIPS.abiflags (0x%lx)"), ibfd,
15539 (unsigned long) in_abiflags.flags2);
15540 }
28d45e28
MR
15541 else
15542 {
15543 infer_mips_abiflags (ibfd, &in_tdata->abiflags);
15544 in_tdata->abiflags_valid = TRUE;
15545 }
15546
cf8502c1 15547 if (!out_tdata->abiflags_valid)
351cdf24
MF
15548 {
15549 /* Copy input abiflags if output abiflags are not already valid. */
cf8502c1
MR
15550 out_tdata->abiflags = in_tdata->abiflags;
15551 out_tdata->abiflags_valid = TRUE;
351cdf24 15552 }
b49e97c9
TS
15553
15554 if (! elf_flags_init (obfd))
15555 {
b34976b6 15556 elf_flags_init (obfd) = TRUE;
351cdf24 15557 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
b49e97c9
TS
15558 elf_elfheader (obfd)->e_ident[EI_CLASS]
15559 = elf_elfheader (ibfd)->e_ident[EI_CLASS];
15560
15561 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
2907b861 15562 && (bfd_get_arch_info (obfd)->the_default
68ffbac6 15563 || mips_mach_extends_p (bfd_get_mach (obfd),
2907b861 15564 bfd_get_mach (ibfd))))
b49e97c9
TS
15565 {
15566 if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
15567 bfd_get_mach (ibfd)))
b34976b6 15568 return FALSE;
351cdf24
MF
15569
15570 /* Update the ABI flags isa_level, isa_rev and isa_ext fields. */
cf8502c1 15571 update_mips_abiflags_isa (obfd, &out_tdata->abiflags);
b49e97c9
TS
15572 }
15573
d537eeb5 15574 ok = TRUE;
b49e97c9 15575 }
d537eeb5
MR
15576 else
15577 ok = mips_elf_merge_obj_e_flags (ibfd, obfd);
15578
15579 ok = mips_elf_merge_obj_attributes (ibfd, obfd) && ok;
b49e97c9 15580
a3dc0a7f 15581 ok = mips_elf_merge_obj_abiflags (ibfd, obfd) && ok;
351cdf24 15582
d537eeb5 15583 if (!ok)
b49e97c9
TS
15584 {
15585 bfd_set_error (bfd_error_bad_value);
b34976b6 15586 return FALSE;
b49e97c9
TS
15587 }
15588
b34976b6 15589 return TRUE;
b49e97c9
TS
15590}
15591
15592/* Function to keep MIPS specific file flags like as EF_MIPS_PIC. */
15593
b34976b6 15594bfd_boolean
9719ad41 15595_bfd_mips_elf_set_private_flags (bfd *abfd, flagword flags)
b49e97c9
TS
15596{
15597 BFD_ASSERT (!elf_flags_init (abfd)
15598 || elf_elfheader (abfd)->e_flags == flags);
15599
15600 elf_elfheader (abfd)->e_flags = flags;
b34976b6
AM
15601 elf_flags_init (abfd) = TRUE;
15602 return TRUE;
b49e97c9
TS
15603}
15604
ad9563d6
CM
15605char *
15606_bfd_mips_elf_get_target_dtag (bfd_vma dtag)
15607{
15608 switch (dtag)
15609 {
15610 default: return "";
15611 case DT_MIPS_RLD_VERSION:
15612 return "MIPS_RLD_VERSION";
15613 case DT_MIPS_TIME_STAMP:
15614 return "MIPS_TIME_STAMP";
15615 case DT_MIPS_ICHECKSUM:
15616 return "MIPS_ICHECKSUM";
15617 case DT_MIPS_IVERSION:
15618 return "MIPS_IVERSION";
15619 case DT_MIPS_FLAGS:
15620 return "MIPS_FLAGS";
15621 case DT_MIPS_BASE_ADDRESS:
15622 return "MIPS_BASE_ADDRESS";
15623 case DT_MIPS_MSYM:
15624 return "MIPS_MSYM";
15625 case DT_MIPS_CONFLICT:
15626 return "MIPS_CONFLICT";
15627 case DT_MIPS_LIBLIST:
15628 return "MIPS_LIBLIST";
15629 case DT_MIPS_LOCAL_GOTNO:
15630 return "MIPS_LOCAL_GOTNO";
15631 case DT_MIPS_CONFLICTNO:
15632 return "MIPS_CONFLICTNO";
15633 case DT_MIPS_LIBLISTNO:
15634 return "MIPS_LIBLISTNO";
15635 case DT_MIPS_SYMTABNO:
15636 return "MIPS_SYMTABNO";
15637 case DT_MIPS_UNREFEXTNO:
15638 return "MIPS_UNREFEXTNO";
15639 case DT_MIPS_GOTSYM:
15640 return "MIPS_GOTSYM";
15641 case DT_MIPS_HIPAGENO:
15642 return "MIPS_HIPAGENO";
15643 case DT_MIPS_RLD_MAP:
15644 return "MIPS_RLD_MAP";
a5499fa4
MF
15645 case DT_MIPS_RLD_MAP_REL:
15646 return "MIPS_RLD_MAP_REL";
ad9563d6
CM
15647 case DT_MIPS_DELTA_CLASS:
15648 return "MIPS_DELTA_CLASS";
15649 case DT_MIPS_DELTA_CLASS_NO:
15650 return "MIPS_DELTA_CLASS_NO";
15651 case DT_MIPS_DELTA_INSTANCE:
15652 return "MIPS_DELTA_INSTANCE";
15653 case DT_MIPS_DELTA_INSTANCE_NO:
15654 return "MIPS_DELTA_INSTANCE_NO";
15655 case DT_MIPS_DELTA_RELOC:
15656 return "MIPS_DELTA_RELOC";
15657 case DT_MIPS_DELTA_RELOC_NO:
15658 return "MIPS_DELTA_RELOC_NO";
15659 case DT_MIPS_DELTA_SYM:
15660 return "MIPS_DELTA_SYM";
15661 case DT_MIPS_DELTA_SYM_NO:
15662 return "MIPS_DELTA_SYM_NO";
15663 case DT_MIPS_DELTA_CLASSSYM:
15664 return "MIPS_DELTA_CLASSSYM";
15665 case DT_MIPS_DELTA_CLASSSYM_NO:
15666 return "MIPS_DELTA_CLASSSYM_NO";
15667 case DT_MIPS_CXX_FLAGS:
15668 return "MIPS_CXX_FLAGS";
15669 case DT_MIPS_PIXIE_INIT:
15670 return "MIPS_PIXIE_INIT";
15671 case DT_MIPS_SYMBOL_LIB:
15672 return "MIPS_SYMBOL_LIB";
15673 case DT_MIPS_LOCALPAGE_GOTIDX:
15674 return "MIPS_LOCALPAGE_GOTIDX";
15675 case DT_MIPS_LOCAL_GOTIDX:
15676 return "MIPS_LOCAL_GOTIDX";
15677 case DT_MIPS_HIDDEN_GOTIDX:
15678 return "MIPS_HIDDEN_GOTIDX";
15679 case DT_MIPS_PROTECTED_GOTIDX:
15680 return "MIPS_PROTECTED_GOT_IDX";
15681 case DT_MIPS_OPTIONS:
15682 return "MIPS_OPTIONS";
15683 case DT_MIPS_INTERFACE:
15684 return "MIPS_INTERFACE";
15685 case DT_MIPS_DYNSTR_ALIGN:
15686 return "DT_MIPS_DYNSTR_ALIGN";
15687 case DT_MIPS_INTERFACE_SIZE:
15688 return "DT_MIPS_INTERFACE_SIZE";
15689 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR:
15690 return "DT_MIPS_RLD_TEXT_RESOLVE_ADDR";
15691 case DT_MIPS_PERF_SUFFIX:
15692 return "DT_MIPS_PERF_SUFFIX";
15693 case DT_MIPS_COMPACT_SIZE:
15694 return "DT_MIPS_COMPACT_SIZE";
15695 case DT_MIPS_GP_VALUE:
15696 return "DT_MIPS_GP_VALUE";
15697 case DT_MIPS_AUX_DYNAMIC:
15698 return "DT_MIPS_AUX_DYNAMIC";
861fb55a
DJ
15699 case DT_MIPS_PLTGOT:
15700 return "DT_MIPS_PLTGOT";
15701 case DT_MIPS_RWPLT:
15702 return "DT_MIPS_RWPLT";
ad9563d6
CM
15703 }
15704}
15705
757a636f
RS
15706/* Return the meaning of Tag_GNU_MIPS_ABI_FP value FP, or null if
15707 not known. */
15708
15709const char *
15710_bfd_mips_fp_abi_string (int fp)
15711{
15712 switch (fp)
15713 {
15714 /* These strings aren't translated because they're simply
15715 option lists. */
15716 case Val_GNU_MIPS_ABI_FP_DOUBLE:
15717 return "-mdouble-float";
15718
15719 case Val_GNU_MIPS_ABI_FP_SINGLE:
15720 return "-msingle-float";
15721
15722 case Val_GNU_MIPS_ABI_FP_SOFT:
15723 return "-msoft-float";
15724
351cdf24
MF
15725 case Val_GNU_MIPS_ABI_FP_OLD_64:
15726 return _("-mips32r2 -mfp64 (12 callee-saved)");
15727
15728 case Val_GNU_MIPS_ABI_FP_XX:
15729 return "-mfpxx";
15730
757a636f 15731 case Val_GNU_MIPS_ABI_FP_64:
351cdf24
MF
15732 return "-mgp32 -mfp64";
15733
15734 case Val_GNU_MIPS_ABI_FP_64A:
15735 return "-mgp32 -mfp64 -mno-odd-spreg";
757a636f
RS
15736
15737 default:
15738 return 0;
15739 }
15740}
15741
351cdf24
MF
15742static void
15743print_mips_ases (FILE *file, unsigned int mask)
15744{
15745 if (mask & AFL_ASE_DSP)
15746 fputs ("\n\tDSP ASE", file);
15747 if (mask & AFL_ASE_DSPR2)
15748 fputs ("\n\tDSP R2 ASE", file);
8f4f9071
MF
15749 if (mask & AFL_ASE_DSPR3)
15750 fputs ("\n\tDSP R3 ASE", file);
351cdf24
MF
15751 if (mask & AFL_ASE_EVA)
15752 fputs ("\n\tEnhanced VA Scheme", file);
15753 if (mask & AFL_ASE_MCU)
15754 fputs ("\n\tMCU (MicroController) ASE", file);
15755 if (mask & AFL_ASE_MDMX)
15756 fputs ("\n\tMDMX ASE", file);
15757 if (mask & AFL_ASE_MIPS3D)
15758 fputs ("\n\tMIPS-3D ASE", file);
15759 if (mask & AFL_ASE_MT)
15760 fputs ("\n\tMT ASE", file);
15761 if (mask & AFL_ASE_SMARTMIPS)
15762 fputs ("\n\tSmartMIPS ASE", file);
15763 if (mask & AFL_ASE_VIRT)
15764 fputs ("\n\tVZ ASE", file);
15765 if (mask & AFL_ASE_MSA)
15766 fputs ("\n\tMSA ASE", file);
15767 if (mask & AFL_ASE_MIPS16)
15768 fputs ("\n\tMIPS16 ASE", file);
15769 if (mask & AFL_ASE_MICROMIPS)
15770 fputs ("\n\tMICROMIPS ASE", file);
15771 if (mask & AFL_ASE_XPA)
15772 fputs ("\n\tXPA ASE", file);
15773 if (mask == 0)
15774 fprintf (file, "\n\t%s", _("None"));
00ac7aa0
MF
15775 else if ((mask & ~AFL_ASE_MASK) != 0)
15776 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
351cdf24
MF
15777}
15778
15779static void
15780print_mips_isa_ext (FILE *file, unsigned int isa_ext)
15781{
15782 switch (isa_ext)
15783 {
15784 case 0:
15785 fputs (_("None"), file);
15786 break;
15787 case AFL_EXT_XLR:
15788 fputs ("RMI XLR", file);
15789 break;
2c629856
N
15790 case AFL_EXT_OCTEON3:
15791 fputs ("Cavium Networks Octeon3", file);
15792 break;
351cdf24
MF
15793 case AFL_EXT_OCTEON2:
15794 fputs ("Cavium Networks Octeon2", file);
15795 break;
15796 case AFL_EXT_OCTEONP:
15797 fputs ("Cavium Networks OcteonP", file);
15798 break;
15799 case AFL_EXT_LOONGSON_3A:
15800 fputs ("Loongson 3A", file);
15801 break;
15802 case AFL_EXT_OCTEON:
15803 fputs ("Cavium Networks Octeon", file);
15804 break;
15805 case AFL_EXT_5900:
15806 fputs ("Toshiba R5900", file);
15807 break;
15808 case AFL_EXT_4650:
15809 fputs ("MIPS R4650", file);
15810 break;
15811 case AFL_EXT_4010:
15812 fputs ("LSI R4010", file);
15813 break;
15814 case AFL_EXT_4100:
15815 fputs ("NEC VR4100", file);
15816 break;
15817 case AFL_EXT_3900:
15818 fputs ("Toshiba R3900", file);
15819 break;
15820 case AFL_EXT_10000:
15821 fputs ("MIPS R10000", file);
15822 break;
15823 case AFL_EXT_SB1:
15824 fputs ("Broadcom SB-1", file);
15825 break;
15826 case AFL_EXT_4111:
15827 fputs ("NEC VR4111/VR4181", file);
15828 break;
15829 case AFL_EXT_4120:
15830 fputs ("NEC VR4120", file);
15831 break;
15832 case AFL_EXT_5400:
15833 fputs ("NEC VR5400", file);
15834 break;
15835 case AFL_EXT_5500:
15836 fputs ("NEC VR5500", file);
15837 break;
15838 case AFL_EXT_LOONGSON_2E:
15839 fputs ("ST Microelectronics Loongson 2E", file);
15840 break;
15841 case AFL_EXT_LOONGSON_2F:
15842 fputs ("ST Microelectronics Loongson 2F", file);
15843 break;
15844 default:
00ac7aa0 15845 fprintf (file, "%s (%d)", _("Unknown"), isa_ext);
351cdf24
MF
15846 break;
15847 }
15848}
15849
15850static void
15851print_mips_fp_abi_value (FILE *file, int val)
15852{
15853 switch (val)
15854 {
15855 case Val_GNU_MIPS_ABI_FP_ANY:
15856 fprintf (file, _("Hard or soft float\n"));
15857 break;
15858 case Val_GNU_MIPS_ABI_FP_DOUBLE:
15859 fprintf (file, _("Hard float (double precision)\n"));
15860 break;
15861 case Val_GNU_MIPS_ABI_FP_SINGLE:
15862 fprintf (file, _("Hard float (single precision)\n"));
15863 break;
15864 case Val_GNU_MIPS_ABI_FP_SOFT:
15865 fprintf (file, _("Soft float\n"));
15866 break;
15867 case Val_GNU_MIPS_ABI_FP_OLD_64:
15868 fprintf (file, _("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
15869 break;
15870 case Val_GNU_MIPS_ABI_FP_XX:
15871 fprintf (file, _("Hard float (32-bit CPU, Any FPU)\n"));
15872 break;
15873 case Val_GNU_MIPS_ABI_FP_64:
15874 fprintf (file, _("Hard float (32-bit CPU, 64-bit FPU)\n"));
15875 break;
15876 case Val_GNU_MIPS_ABI_FP_64A:
15877 fprintf (file, _("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
15878 break;
15879 default:
15880 fprintf (file, "??? (%d)\n", val);
15881 break;
15882 }
15883}
15884
15885static int
15886get_mips_reg_size (int reg_size)
15887{
15888 return (reg_size == AFL_REG_NONE) ? 0
15889 : (reg_size == AFL_REG_32) ? 32
15890 : (reg_size == AFL_REG_64) ? 64
15891 : (reg_size == AFL_REG_128) ? 128
15892 : -1;
15893}
15894
b34976b6 15895bfd_boolean
9719ad41 15896_bfd_mips_elf_print_private_bfd_data (bfd *abfd, void *ptr)
b49e97c9 15897{
9719ad41 15898 FILE *file = ptr;
b49e97c9
TS
15899
15900 BFD_ASSERT (abfd != NULL && ptr != NULL);
15901
15902 /* Print normal ELF private data. */
15903 _bfd_elf_print_private_bfd_data (abfd, ptr);
15904
15905 /* xgettext:c-format */
15906 fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
15907
15908 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O32)
15909 fprintf (file, _(" [abi=O32]"));
15910 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O64)
15911 fprintf (file, _(" [abi=O64]"));
15912 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32)
15913 fprintf (file, _(" [abi=EABI32]"));
15914 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64)
15915 fprintf (file, _(" [abi=EABI64]"));
15916 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI))
15917 fprintf (file, _(" [abi unknown]"));
15918 else if (ABI_N32_P (abfd))
15919 fprintf (file, _(" [abi=N32]"));
15920 else if (ABI_64_P (abfd))
15921 fprintf (file, _(" [abi=64]"));
15922 else
15923 fprintf (file, _(" [no abi set]"));
15924
15925 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
ae0d2616 15926 fprintf (file, " [mips1]");
b49e97c9 15927 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
ae0d2616 15928 fprintf (file, " [mips2]");
b49e97c9 15929 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
ae0d2616 15930 fprintf (file, " [mips3]");
b49e97c9 15931 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
ae0d2616 15932 fprintf (file, " [mips4]");
b49e97c9 15933 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_5)
ae0d2616 15934 fprintf (file, " [mips5]");
b49e97c9 15935 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
ae0d2616 15936 fprintf (file, " [mips32]");
b49e97c9 15937 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64)
ae0d2616 15938 fprintf (file, " [mips64]");
af7ee8bf 15939 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2)
ae0d2616 15940 fprintf (file, " [mips32r2]");
5f74bc13 15941 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64R2)
ae0d2616 15942 fprintf (file, " [mips64r2]");
7361da2c
AB
15943 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R6)
15944 fprintf (file, " [mips32r6]");
15945 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64R6)
15946 fprintf (file, " [mips64r6]");
b49e97c9
TS
15947 else
15948 fprintf (file, _(" [unknown ISA]"));
15949
40d32fc6 15950 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
ae0d2616 15951 fprintf (file, " [mdmx]");
40d32fc6
CD
15952
15953 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
ae0d2616 15954 fprintf (file, " [mips16]");
40d32fc6 15955
df58fc94
RS
15956 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
15957 fprintf (file, " [micromips]");
15958
ba92f887
MR
15959 if (elf_elfheader (abfd)->e_flags & EF_MIPS_NAN2008)
15960 fprintf (file, " [nan2008]");
15961
5baf5e34 15962 if (elf_elfheader (abfd)->e_flags & EF_MIPS_FP64)
351cdf24 15963 fprintf (file, " [old fp64]");
5baf5e34 15964
b49e97c9 15965 if (elf_elfheader (abfd)->e_flags & EF_MIPS_32BITMODE)
ae0d2616 15966 fprintf (file, " [32bitmode]");
b49e97c9
TS
15967 else
15968 fprintf (file, _(" [not 32bitmode]"));
15969
c0e3f241 15970 if (elf_elfheader (abfd)->e_flags & EF_MIPS_NOREORDER)
ae0d2616 15971 fprintf (file, " [noreorder]");
c0e3f241
CD
15972
15973 if (elf_elfheader (abfd)->e_flags & EF_MIPS_PIC)
ae0d2616 15974 fprintf (file, " [PIC]");
c0e3f241
CD
15975
15976 if (elf_elfheader (abfd)->e_flags & EF_MIPS_CPIC)
ae0d2616 15977 fprintf (file, " [CPIC]");
c0e3f241
CD
15978
15979 if (elf_elfheader (abfd)->e_flags & EF_MIPS_XGOT)
ae0d2616 15980 fprintf (file, " [XGOT]");
c0e3f241
CD
15981
15982 if (elf_elfheader (abfd)->e_flags & EF_MIPS_UCODE)
ae0d2616 15983 fprintf (file, " [UCODE]");
c0e3f241 15984
b49e97c9
TS
15985 fputc ('\n', file);
15986
351cdf24
MF
15987 if (mips_elf_tdata (abfd)->abiflags_valid)
15988 {
15989 Elf_Internal_ABIFlags_v0 *abiflags = &mips_elf_tdata (abfd)->abiflags;
15990 fprintf (file, "\nMIPS ABI Flags Version: %d\n", abiflags->version);
15991 fprintf (file, "\nISA: MIPS%d", abiflags->isa_level);
15992 if (abiflags->isa_rev > 1)
15993 fprintf (file, "r%d", abiflags->isa_rev);
15994 fprintf (file, "\nGPR size: %d",
15995 get_mips_reg_size (abiflags->gpr_size));
15996 fprintf (file, "\nCPR1 size: %d",
15997 get_mips_reg_size (abiflags->cpr1_size));
15998 fprintf (file, "\nCPR2 size: %d",
15999 get_mips_reg_size (abiflags->cpr2_size));
16000 fputs ("\nFP ABI: ", file);
16001 print_mips_fp_abi_value (file, abiflags->fp_abi);
16002 fputs ("ISA Extension: ", file);
16003 print_mips_isa_ext (file, abiflags->isa_ext);
16004 fputs ("\nASEs:", file);
16005 print_mips_ases (file, abiflags->ases);
16006 fprintf (file, "\nFLAGS 1: %8.8lx", abiflags->flags1);
16007 fprintf (file, "\nFLAGS 2: %8.8lx", abiflags->flags2);
16008 fputc ('\n', file);
16009 }
16010
b34976b6 16011 return TRUE;
b49e97c9 16012}
2f89ff8d 16013
b35d266b 16014const struct bfd_elf_special_section _bfd_mips_elf_special_sections[] =
2f89ff8d 16015{
0112cd26
NC
16016 { STRING_COMMA_LEN (".lit4"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16017 { STRING_COMMA_LEN (".lit8"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16018 { STRING_COMMA_LEN (".mdebug"), 0, SHT_MIPS_DEBUG, 0 },
16019 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16020 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16021 { STRING_COMMA_LEN (".ucode"), 0, SHT_MIPS_UCODE, 0 },
16022 { NULL, 0, 0, 0, 0 }
2f89ff8d 16023};
5e2b0d47 16024
8992f0d7
TS
16025/* Merge non visibility st_other attributes. Ensure that the
16026 STO_OPTIONAL flag is copied into h->other, even if this is not a
16027 definiton of the symbol. */
5e2b0d47
NC
16028void
16029_bfd_mips_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
16030 const Elf_Internal_Sym *isym,
16031 bfd_boolean definition,
16032 bfd_boolean dynamic ATTRIBUTE_UNUSED)
16033{
8992f0d7
TS
16034 if ((isym->st_other & ~ELF_ST_VISIBILITY (-1)) != 0)
16035 {
16036 unsigned char other;
16037
16038 other = (definition ? isym->st_other : h->other);
16039 other &= ~ELF_ST_VISIBILITY (-1);
16040 h->other = other | ELF_ST_VISIBILITY (h->other);
16041 }
16042
16043 if (!definition
5e2b0d47
NC
16044 && ELF_MIPS_IS_OPTIONAL (isym->st_other))
16045 h->other |= STO_OPTIONAL;
16046}
12ac1cf5
NC
16047
16048/* Decide whether an undefined symbol is special and can be ignored.
16049 This is the case for OPTIONAL symbols on IRIX. */
16050bfd_boolean
16051_bfd_mips_elf_ignore_undef_symbol (struct elf_link_hash_entry *h)
16052{
16053 return ELF_MIPS_IS_OPTIONAL (h->other) ? TRUE : FALSE;
16054}
e0764319
NC
16055
16056bfd_boolean
16057_bfd_mips_elf_common_definition (Elf_Internal_Sym *sym)
16058{
16059 return (sym->st_shndx == SHN_COMMON
16060 || sym->st_shndx == SHN_MIPS_ACOMMON
16061 || sym->st_shndx == SHN_MIPS_SCOMMON);
16062}
861fb55a
DJ
16063
16064/* Return address for Ith PLT stub in section PLT, for relocation REL
16065 or (bfd_vma) -1 if it should not be included. */
16066
16067bfd_vma
16068_bfd_mips_elf_plt_sym_val (bfd_vma i, const asection *plt,
16069 const arelent *rel ATTRIBUTE_UNUSED)
16070{
16071 return (plt->vma
16072 + 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry)
16073 + i * 4 * ARRAY_SIZE (mips_exec_plt_entry));
16074}
16075
1bbce132
MR
16076/* Build a table of synthetic symbols to represent the PLT. As with MIPS16
16077 and microMIPS PLT slots we may have a many-to-one mapping between .plt
16078 and .got.plt and also the slots may be of a different size each we walk
16079 the PLT manually fetching instructions and matching them against known
16080 patterns. To make things easier standard MIPS slots, if any, always come
16081 first. As we don't create proper ELF symbols we use the UDATA.I member
16082 of ASYMBOL to carry ISA annotation. The encoding used is the same as
16083 with the ST_OTHER member of the ELF symbol. */
16084
16085long
16086_bfd_mips_elf_get_synthetic_symtab (bfd *abfd,
16087 long symcount ATTRIBUTE_UNUSED,
16088 asymbol **syms ATTRIBUTE_UNUSED,
16089 long dynsymcount, asymbol **dynsyms,
16090 asymbol **ret)
16091{
16092 static const char pltname[] = "_PROCEDURE_LINKAGE_TABLE_";
16093 static const char microsuffix[] = "@micromipsplt";
16094 static const char m16suffix[] = "@mips16plt";
16095 static const char mipssuffix[] = "@plt";
16096
16097 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
16098 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
16099 bfd_boolean micromips_p = MICROMIPS_P (abfd);
16100 Elf_Internal_Shdr *hdr;
16101 bfd_byte *plt_data;
16102 bfd_vma plt_offset;
16103 unsigned int other;
16104 bfd_vma entry_size;
16105 bfd_vma plt0_size;
16106 asection *relplt;
16107 bfd_vma opcode;
16108 asection *plt;
16109 asymbol *send;
16110 size_t size;
16111 char *names;
16112 long counti;
16113 arelent *p;
16114 asymbol *s;
16115 char *nend;
16116 long count;
16117 long pi;
16118 long i;
16119 long n;
16120
16121 *ret = NULL;
16122
16123 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0 || dynsymcount <= 0)
16124 return 0;
16125
16126 relplt = bfd_get_section_by_name (abfd, ".rel.plt");
16127 if (relplt == NULL)
16128 return 0;
16129
16130 hdr = &elf_section_data (relplt)->this_hdr;
16131 if (hdr->sh_link != elf_dynsymtab (abfd) || hdr->sh_type != SHT_REL)
16132 return 0;
16133
16134 plt = bfd_get_section_by_name (abfd, ".plt");
16135 if (plt == NULL)
16136 return 0;
16137
16138 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
16139 if (!(*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
16140 return -1;
16141 p = relplt->relocation;
16142
16143 /* Calculating the exact amount of space required for symbols would
16144 require two passes over the PLT, so just pessimise assuming two
16145 PLT slots per relocation. */
16146 count = relplt->size / hdr->sh_entsize;
16147 counti = count * bed->s->int_rels_per_ext_rel;
16148 size = 2 * count * sizeof (asymbol);
16149 size += count * (sizeof (mipssuffix) +
16150 (micromips_p ? sizeof (microsuffix) : sizeof (m16suffix)));
16151 for (pi = 0; pi < counti; pi += bed->s->int_rels_per_ext_rel)
16152 size += 2 * strlen ((*p[pi].sym_ptr_ptr)->name);
16153
16154 /* Add the size of "_PROCEDURE_LINKAGE_TABLE_" too. */
16155 size += sizeof (asymbol) + sizeof (pltname);
16156
16157 if (!bfd_malloc_and_get_section (abfd, plt, &plt_data))
16158 return -1;
16159
16160 if (plt->size < 16)
16161 return -1;
16162
16163 s = *ret = bfd_malloc (size);
16164 if (s == NULL)
16165 return -1;
16166 send = s + 2 * count + 1;
16167
16168 names = (char *) send;
16169 nend = (char *) s + size;
16170 n = 0;
16171
16172 opcode = bfd_get_micromips_32 (abfd, plt_data + 12);
16173 if (opcode == 0x3302fffe)
16174 {
16175 if (!micromips_p)
16176 return -1;
16177 plt0_size = 2 * ARRAY_SIZE (micromips_o32_exec_plt0_entry);
16178 other = STO_MICROMIPS;
16179 }
833794fc
MR
16180 else if (opcode == 0x0398c1d0)
16181 {
16182 if (!micromips_p)
16183 return -1;
16184 plt0_size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry);
16185 other = STO_MICROMIPS;
16186 }
1bbce132
MR
16187 else
16188 {
16189 plt0_size = 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry);
16190 other = 0;
16191 }
16192
16193 s->the_bfd = abfd;
16194 s->flags = BSF_SYNTHETIC | BSF_FUNCTION | BSF_LOCAL;
16195 s->section = plt;
16196 s->value = 0;
16197 s->name = names;
16198 s->udata.i = other;
16199 memcpy (names, pltname, sizeof (pltname));
16200 names += sizeof (pltname);
16201 ++s, ++n;
16202
16203 pi = 0;
16204 for (plt_offset = plt0_size;
16205 plt_offset + 8 <= plt->size && s < send;
16206 plt_offset += entry_size)
16207 {
16208 bfd_vma gotplt_addr;
16209 const char *suffix;
16210 bfd_vma gotplt_hi;
16211 bfd_vma gotplt_lo;
16212 size_t suffixlen;
16213
16214 opcode = bfd_get_micromips_32 (abfd, plt_data + plt_offset + 4);
16215
16216 /* Check if the second word matches the expected MIPS16 instruction. */
16217 if (opcode == 0x651aeb00)
16218 {
16219 if (micromips_p)
16220 return -1;
16221 /* Truncated table??? */
16222 if (plt_offset + 16 > plt->size)
16223 break;
16224 gotplt_addr = bfd_get_32 (abfd, plt_data + plt_offset + 12);
16225 entry_size = 2 * ARRAY_SIZE (mips16_o32_exec_plt_entry);
16226 suffixlen = sizeof (m16suffix);
16227 suffix = m16suffix;
16228 other = STO_MIPS16;
16229 }
833794fc 16230 /* Likewise the expected microMIPS instruction (no insn32 mode). */
1bbce132
MR
16231 else if (opcode == 0xff220000)
16232 {
16233 if (!micromips_p)
16234 return -1;
16235 gotplt_hi = bfd_get_16 (abfd, plt_data + plt_offset) & 0x7f;
16236 gotplt_lo = bfd_get_16 (abfd, plt_data + plt_offset + 2) & 0xffff;
16237 gotplt_hi = ((gotplt_hi ^ 0x40) - 0x40) << 18;
16238 gotplt_lo <<= 2;
16239 gotplt_addr = gotplt_hi + gotplt_lo;
16240 gotplt_addr += ((plt->vma + plt_offset) | 3) ^ 3;
16241 entry_size = 2 * ARRAY_SIZE (micromips_o32_exec_plt_entry);
16242 suffixlen = sizeof (microsuffix);
16243 suffix = microsuffix;
16244 other = STO_MICROMIPS;
16245 }
833794fc
MR
16246 /* Likewise the expected microMIPS instruction (insn32 mode). */
16247 else if ((opcode & 0xffff0000) == 0xff2f0000)
16248 {
16249 gotplt_hi = bfd_get_16 (abfd, plt_data + plt_offset + 2) & 0xffff;
16250 gotplt_lo = bfd_get_16 (abfd, plt_data + plt_offset + 6) & 0xffff;
16251 gotplt_hi = ((gotplt_hi ^ 0x8000) - 0x8000) << 16;
16252 gotplt_lo = (gotplt_lo ^ 0x8000) - 0x8000;
16253 gotplt_addr = gotplt_hi + gotplt_lo;
16254 entry_size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt_entry);
16255 suffixlen = sizeof (microsuffix);
16256 suffix = microsuffix;
16257 other = STO_MICROMIPS;
16258 }
1bbce132
MR
16259 /* Otherwise assume standard MIPS code. */
16260 else
16261 {
16262 gotplt_hi = bfd_get_32 (abfd, plt_data + plt_offset) & 0xffff;
16263 gotplt_lo = bfd_get_32 (abfd, plt_data + plt_offset + 4) & 0xffff;
16264 gotplt_hi = ((gotplt_hi ^ 0x8000) - 0x8000) << 16;
16265 gotplt_lo = (gotplt_lo ^ 0x8000) - 0x8000;
16266 gotplt_addr = gotplt_hi + gotplt_lo;
16267 entry_size = 4 * ARRAY_SIZE (mips_exec_plt_entry);
16268 suffixlen = sizeof (mipssuffix);
16269 suffix = mipssuffix;
16270 other = 0;
16271 }
16272 /* Truncated table??? */
16273 if (plt_offset + entry_size > plt->size)
16274 break;
16275
16276 for (i = 0;
16277 i < count && p[pi].address != gotplt_addr;
16278 i++, pi = (pi + bed->s->int_rels_per_ext_rel) % counti);
16279
16280 if (i < count)
16281 {
16282 size_t namelen;
16283 size_t len;
16284
16285 *s = **p[pi].sym_ptr_ptr;
16286 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
16287 we are defining a symbol, ensure one of them is set. */
16288 if ((s->flags & BSF_LOCAL) == 0)
16289 s->flags |= BSF_GLOBAL;
16290 s->flags |= BSF_SYNTHETIC;
16291 s->section = plt;
16292 s->value = plt_offset;
16293 s->name = names;
16294 s->udata.i = other;
16295
16296 len = strlen ((*p[pi].sym_ptr_ptr)->name);
16297 namelen = len + suffixlen;
16298 if (names + namelen > nend)
16299 break;
16300
16301 memcpy (names, (*p[pi].sym_ptr_ptr)->name, len);
16302 names += len;
16303 memcpy (names, suffix, suffixlen);
16304 names += suffixlen;
16305
16306 ++s, ++n;
16307 pi = (pi + bed->s->int_rels_per_ext_rel) % counti;
16308 }
16309 }
16310
16311 free (plt_data);
16312
16313 return n;
16314}
16315
861fb55a
DJ
16316void
16317_bfd_mips_post_process_headers (bfd *abfd, struct bfd_link_info *link_info)
16318{
16319 struct mips_elf_link_hash_table *htab;
16320 Elf_Internal_Ehdr *i_ehdrp;
16321
16322 i_ehdrp = elf_elfheader (abfd);
16323 if (link_info)
16324 {
16325 htab = mips_elf_hash_table (link_info);
4dfe6ac6
NC
16326 BFD_ASSERT (htab != NULL);
16327
861fb55a
DJ
16328 if (htab->use_plts_and_copy_relocs && !htab->is_vxworks)
16329 i_ehdrp->e_ident[EI_ABIVERSION] = 1;
16330 }
0af03126
L
16331
16332 _bfd_elf_post_process_headers (abfd, link_info);
351cdf24
MF
16333
16334 if (mips_elf_tdata (abfd)->abiflags.fp_abi == Val_GNU_MIPS_ABI_FP_64
16335 || mips_elf_tdata (abfd)->abiflags.fp_abi == Val_GNU_MIPS_ABI_FP_64A)
16336 i_ehdrp->e_ident[EI_ABIVERSION] = 3;
17733f5b
FS
16337
16338 if (elf_stack_flags (abfd) && !(elf_stack_flags (abfd) & PF_X))
16339 i_ehdrp->e_ident[EI_ABIVERSION] = 5;
861fb55a 16340}
2f0c68f2
CM
16341
16342int
16343_bfd_mips_elf_compact_eh_encoding (struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
16344{
16345 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
16346}
16347
16348/* Return the opcode for can't unwind. */
16349
16350int
16351_bfd_mips_elf_cant_unwind_opcode (struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
16352{
16353 return COMPACT_EH_CANT_UNWIND_OPCODE;
16354}
This page took 2.098884 seconds and 4 git commands to generate.