]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elfxx-mips.c
bfd_merge_private_bfd_data tidy
[thirdparty/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
1a0670f3
AM
11648 DT_MIPS_SYMTABNO. */
11649 /* Fall through. */
b49e97c9
TS
11650
11651 case DT_MIPS_SYMTABNO:
11652 name = ".dynsym";
11653 elemsize = MIPS_ELF_SYM_SIZE (output_bfd);
4ade44b7 11654 s = bfd_get_linker_section (dynobj, name);
b49e97c9 11655
131e2f8e
MF
11656 if (s != NULL)
11657 dyn.d_un.d_val = s->size / elemsize;
11658 else
11659 dyn.d_un.d_val = 0;
b49e97c9
TS
11660 break;
11661
11662 case DT_MIPS_HIPAGENO:
861fb55a 11663 dyn.d_un.d_val = g->local_gotno - htab->reserved_gotno;
b49e97c9
TS
11664 break;
11665
11666 case DT_MIPS_RLD_MAP:
b4082c70
DD
11667 {
11668 struct elf_link_hash_entry *h;
11669 h = mips_elf_hash_table (info)->rld_symbol;
11670 if (!h)
11671 {
11672 dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
11673 swap_out_p = FALSE;
11674 break;
11675 }
11676 s = h->root.u.def.section;
a5499fa4
MF
11677
11678 /* The MIPS_RLD_MAP tag stores the absolute address of the
11679 debug pointer. */
b4082c70
DD
11680 dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
11681 + h->root.u.def.value);
11682 }
b49e97c9
TS
11683 break;
11684
a5499fa4
MF
11685 case DT_MIPS_RLD_MAP_REL:
11686 {
11687 struct elf_link_hash_entry *h;
11688 bfd_vma dt_addr, rld_addr;
11689 h = mips_elf_hash_table (info)->rld_symbol;
11690 if (!h)
11691 {
11692 dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
11693 swap_out_p = FALSE;
11694 break;
11695 }
11696 s = h->root.u.def.section;
11697
11698 /* The MIPS_RLD_MAP_REL tag stores the offset to the debug
11699 pointer, relative to the address of the tag. */
11700 dt_addr = (sdyn->output_section->vma + sdyn->output_offset
d5cff5df 11701 + (b - sdyn->contents));
a5499fa4
MF
11702 rld_addr = (s->output_section->vma + s->output_offset
11703 + h->root.u.def.value);
11704 dyn.d_un.d_ptr = rld_addr - dt_addr;
11705 }
11706 break;
11707
b49e97c9
TS
11708 case DT_MIPS_OPTIONS:
11709 s = (bfd_get_section_by_name
11710 (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (output_bfd)));
11711 dyn.d_un.d_ptr = s->vma;
11712 break;
11713
0a44bf69
RS
11714 case DT_RELASZ:
11715 BFD_ASSERT (htab->is_vxworks);
11716 /* The count does not include the JUMP_SLOT relocations. */
11717 if (htab->srelplt)
11718 dyn.d_un.d_val -= htab->srelplt->size;
11719 break;
11720
11721 case DT_PLTREL:
861fb55a
DJ
11722 BFD_ASSERT (htab->use_plts_and_copy_relocs);
11723 if (htab->is_vxworks)
11724 dyn.d_un.d_val = DT_RELA;
11725 else
11726 dyn.d_un.d_val = DT_REL;
0a44bf69
RS
11727 break;
11728
11729 case DT_PLTRELSZ:
861fb55a 11730 BFD_ASSERT (htab->use_plts_and_copy_relocs);
0a44bf69
RS
11731 dyn.d_un.d_val = htab->srelplt->size;
11732 break;
11733
11734 case DT_JMPREL:
861fb55a
DJ
11735 BFD_ASSERT (htab->use_plts_and_copy_relocs);
11736 dyn.d_un.d_ptr = (htab->srelplt->output_section->vma
0a44bf69
RS
11737 + htab->srelplt->output_offset);
11738 break;
11739
943284cc
DJ
11740 case DT_TEXTREL:
11741 /* If we didn't need any text relocations after all, delete
11742 the dynamic tag. */
11743 if (!(info->flags & DF_TEXTREL))
11744 {
11745 dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
11746 swap_out_p = FALSE;
11747 }
11748 break;
11749
11750 case DT_FLAGS:
11751 /* If we didn't need any text relocations after all, clear
11752 DF_TEXTREL from DT_FLAGS. */
11753 if (!(info->flags & DF_TEXTREL))
11754 dyn.d_un.d_val &= ~DF_TEXTREL;
11755 else
11756 swap_out_p = FALSE;
11757 break;
11758
b49e97c9 11759 default:
b34976b6 11760 swap_out_p = FALSE;
7a2b07ff
NS
11761 if (htab->is_vxworks
11762 && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
11763 swap_out_p = TRUE;
b49e97c9
TS
11764 break;
11765 }
11766
943284cc 11767 if (swap_out_p || dyn_skipped)
b49e97c9 11768 (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
943284cc
DJ
11769 (dynobj, &dyn, b - dyn_skipped);
11770
11771 if (dyn_to_skip)
11772 {
11773 dyn_skipped += dyn_to_skip;
11774 dyn_to_skip = 0;
11775 }
b49e97c9 11776 }
943284cc
DJ
11777
11778 /* Wipe out any trailing entries if we shifted down a dynamic tag. */
11779 if (dyn_skipped > 0)
11780 memset (b - dyn_skipped, 0, dyn_skipped);
b49e97c9
TS
11781 }
11782
b55fd4d4
DJ
11783 if (sgot != NULL && sgot->size > 0
11784 && !bfd_is_abs_section (sgot->output_section))
b49e97c9 11785 {
0a44bf69
RS
11786 if (htab->is_vxworks)
11787 {
11788 /* The first entry of the global offset table points to the
11789 ".dynamic" section. The second is initialized by the
11790 loader and contains the shared library identifier.
11791 The third is also initialized by the loader and points
11792 to the lazy resolution stub. */
11793 MIPS_ELF_PUT_WORD (output_bfd,
11794 sdyn->output_offset + sdyn->output_section->vma,
11795 sgot->contents);
11796 MIPS_ELF_PUT_WORD (output_bfd, 0,
11797 sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
11798 MIPS_ELF_PUT_WORD (output_bfd, 0,
11799 sgot->contents
11800 + 2 * MIPS_ELF_GOT_SIZE (output_bfd));
11801 }
11802 else
11803 {
11804 /* The first entry of the global offset table will be filled at
11805 runtime. The second entry will be used by some runtime loaders.
11806 This isn't the case of IRIX rld. */
11807 MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0, sgot->contents);
51e38d68 11808 MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
0a44bf69
RS
11809 sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
11810 }
b49e97c9 11811
54938e2a
TS
11812 elf_section_data (sgot->output_section)->this_hdr.sh_entsize
11813 = MIPS_ELF_GOT_SIZE (output_bfd);
11814 }
b49e97c9 11815
f4416af6
AO
11816 /* Generate dynamic relocations for the non-primary gots. */
11817 if (gg != NULL && gg->next)
11818 {
11819 Elf_Internal_Rela rel[3];
11820 bfd_vma addend = 0;
11821
11822 memset (rel, 0, sizeof (rel));
11823 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_REL32);
11824
11825 for (g = gg->next; g->next != gg; g = g->next)
11826 {
91d6fa6a 11827 bfd_vma got_index = g->next->local_gotno + g->next->global_gotno
0f20cc35 11828 + g->next->tls_gotno;
f4416af6 11829
9719ad41 11830 MIPS_ELF_PUT_WORD (output_bfd, 0, sgot->contents
91d6fa6a 11831 + got_index++ * MIPS_ELF_GOT_SIZE (output_bfd));
51e38d68
RS
11832 MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
11833 sgot->contents
91d6fa6a 11834 + got_index++ * MIPS_ELF_GOT_SIZE (output_bfd));
f4416af6 11835
0e1862bb 11836 if (! bfd_link_pic (info))
f4416af6
AO
11837 continue;
11838
cb22ccf4 11839 for (; got_index < g->local_gotno; got_index++)
f4416af6 11840 {
cb22ccf4
KCY
11841 if (got_index >= g->assigned_low_gotno
11842 && got_index <= g->assigned_high_gotno)
11843 continue;
11844
f4416af6 11845 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset
cb22ccf4 11846 = got_index * MIPS_ELF_GOT_SIZE (output_bfd);
f4416af6
AO
11847 if (!(mips_elf_create_dynamic_relocation
11848 (output_bfd, info, rel, NULL,
11849 bfd_abs_section_ptr,
11850 0, &addend, sgot)))
11851 return FALSE;
11852 BFD_ASSERT (addend == 0);
11853 }
11854 }
11855 }
11856
3133ddbf
DJ
11857 /* The generation of dynamic relocations for the non-primary gots
11858 adds more dynamic relocations. We cannot count them until
11859 here. */
11860
11861 if (elf_hash_table (info)->dynamic_sections_created)
11862 {
11863 bfd_byte *b;
11864 bfd_boolean swap_out_p;
11865
11866 BFD_ASSERT (sdyn != NULL);
11867
11868 for (b = sdyn->contents;
11869 b < sdyn->contents + sdyn->size;
11870 b += MIPS_ELF_DYN_SIZE (dynobj))
11871 {
11872 Elf_Internal_Dyn dyn;
11873 asection *s;
11874
11875 /* Read in the current dynamic entry. */
11876 (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
11877
11878 /* Assume that we're going to modify it and write it out. */
11879 swap_out_p = TRUE;
11880
11881 switch (dyn.d_tag)
11882 {
11883 case DT_RELSZ:
11884 /* Reduce DT_RELSZ to account for any relocations we
11885 decided not to make. This is for the n64 irix rld,
11886 which doesn't seem to apply any relocations if there
11887 are trailing null entries. */
0a44bf69 11888 s = mips_elf_rel_dyn_section (info, FALSE);
3133ddbf
DJ
11889 dyn.d_un.d_val = (s->reloc_count
11890 * (ABI_64_P (output_bfd)
11891 ? sizeof (Elf64_Mips_External_Rel)
11892 : sizeof (Elf32_External_Rel)));
bcfdf036
RS
11893 /* Adjust the section size too. Tools like the prelinker
11894 can reasonably expect the values to the same. */
11895 elf_section_data (s->output_section)->this_hdr.sh_size
11896 = dyn.d_un.d_val;
3133ddbf
DJ
11897 break;
11898
11899 default:
11900 swap_out_p = FALSE;
11901 break;
11902 }
11903
11904 if (swap_out_p)
11905 (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
11906 (dynobj, &dyn, b);
11907 }
11908 }
11909
b49e97c9 11910 {
b49e97c9
TS
11911 asection *s;
11912 Elf32_compact_rel cpt;
11913
b49e97c9
TS
11914 if (SGI_COMPAT (output_bfd))
11915 {
11916 /* Write .compact_rel section out. */
3d4d4302 11917 s = bfd_get_linker_section (dynobj, ".compact_rel");
b49e97c9
TS
11918 if (s != NULL)
11919 {
11920 cpt.id1 = 1;
11921 cpt.num = s->reloc_count;
11922 cpt.id2 = 2;
11923 cpt.offset = (s->output_section->filepos
11924 + sizeof (Elf32_External_compact_rel));
11925 cpt.reserved0 = 0;
11926 cpt.reserved1 = 0;
11927 bfd_elf32_swap_compact_rel_out (output_bfd, &cpt,
11928 ((Elf32_External_compact_rel *)
11929 s->contents));
11930
11931 /* Clean up a dummy stub function entry in .text. */
4e41d0d7 11932 if (htab->sstubs != NULL)
b49e97c9
TS
11933 {
11934 file_ptr dummy_offset;
11935
4e41d0d7
RS
11936 BFD_ASSERT (htab->sstubs->size >= htab->function_stub_size);
11937 dummy_offset = htab->sstubs->size - htab->function_stub_size;
11938 memset (htab->sstubs->contents + dummy_offset, 0,
5108fc1b 11939 htab->function_stub_size);
b49e97c9
TS
11940 }
11941 }
11942 }
11943
0a44bf69
RS
11944 /* The psABI says that the dynamic relocations must be sorted in
11945 increasing order of r_symndx. The VxWorks EABI doesn't require
11946 this, and because the code below handles REL rather than RELA
11947 relocations, using it for VxWorks would be outright harmful. */
11948 if (!htab->is_vxworks)
b49e97c9 11949 {
0a44bf69
RS
11950 s = mips_elf_rel_dyn_section (info, FALSE);
11951 if (s != NULL
11952 && s->size > (bfd_vma)2 * MIPS_ELF_REL_SIZE (output_bfd))
11953 {
11954 reldyn_sorting_bfd = output_bfd;
b49e97c9 11955
0a44bf69
RS
11956 if (ABI_64_P (output_bfd))
11957 qsort ((Elf64_External_Rel *) s->contents + 1,
11958 s->reloc_count - 1, sizeof (Elf64_Mips_External_Rel),
11959 sort_dynamic_relocs_64);
11960 else
11961 qsort ((Elf32_External_Rel *) s->contents + 1,
11962 s->reloc_count - 1, sizeof (Elf32_External_Rel),
11963 sort_dynamic_relocs);
11964 }
b49e97c9 11965 }
b49e97c9
TS
11966 }
11967
861fb55a 11968 if (htab->splt && htab->splt->size > 0)
0a44bf69 11969 {
861fb55a
DJ
11970 if (htab->is_vxworks)
11971 {
0e1862bb 11972 if (bfd_link_pic (info))
861fb55a
DJ
11973 mips_vxworks_finish_shared_plt (output_bfd, info);
11974 else
11975 mips_vxworks_finish_exec_plt (output_bfd, info);
11976 }
0a44bf69 11977 else
861fb55a 11978 {
0e1862bb 11979 BFD_ASSERT (!bfd_link_pic (info));
1bbce132
MR
11980 if (!mips_finish_exec_plt (output_bfd, info))
11981 return FALSE;
861fb55a 11982 }
0a44bf69 11983 }
b34976b6 11984 return TRUE;
b49e97c9
TS
11985}
11986
b49e97c9 11987
64543e1a
RS
11988/* Set ABFD's EF_MIPS_ARCH and EF_MIPS_MACH flags. */
11989
11990static void
9719ad41 11991mips_set_isa_flags (bfd *abfd)
b49e97c9 11992{
64543e1a 11993 flagword val;
b49e97c9
TS
11994
11995 switch (bfd_get_mach (abfd))
11996 {
11997 default:
11998 case bfd_mach_mips3000:
11999 val = E_MIPS_ARCH_1;
12000 break;
12001
12002 case bfd_mach_mips3900:
12003 val = E_MIPS_ARCH_1 | E_MIPS_MACH_3900;
12004 break;
12005
12006 case bfd_mach_mips6000:
12007 val = E_MIPS_ARCH_2;
12008 break;
12009
12010 case bfd_mach_mips4000:
12011 case bfd_mach_mips4300:
12012 case bfd_mach_mips4400:
12013 case bfd_mach_mips4600:
12014 val = E_MIPS_ARCH_3;
12015 break;
12016
12017 case bfd_mach_mips4010:
12018 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4010;
12019 break;
12020
12021 case bfd_mach_mips4100:
12022 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4100;
12023 break;
12024
12025 case bfd_mach_mips4111:
12026 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4111;
12027 break;
12028
00707a0e
RS
12029 case bfd_mach_mips4120:
12030 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4120;
12031 break;
12032
b49e97c9
TS
12033 case bfd_mach_mips4650:
12034 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4650;
12035 break;
12036
00707a0e
RS
12037 case bfd_mach_mips5400:
12038 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5400;
12039 break;
12040
12041 case bfd_mach_mips5500:
12042 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5500;
12043 break;
12044
e407c74b
NC
12045 case bfd_mach_mips5900:
12046 val = E_MIPS_ARCH_3 | E_MIPS_MACH_5900;
12047 break;
12048
0d2e43ed
ILT
12049 case bfd_mach_mips9000:
12050 val = E_MIPS_ARCH_4 | E_MIPS_MACH_9000;
12051 break;
12052
b49e97c9 12053 case bfd_mach_mips5000:
5a7ea749 12054 case bfd_mach_mips7000:
b49e97c9
TS
12055 case bfd_mach_mips8000:
12056 case bfd_mach_mips10000:
12057 case bfd_mach_mips12000:
3aa3176b
TS
12058 case bfd_mach_mips14000:
12059 case bfd_mach_mips16000:
b49e97c9
TS
12060 val = E_MIPS_ARCH_4;
12061 break;
12062
12063 case bfd_mach_mips5:
12064 val = E_MIPS_ARCH_5;
12065 break;
12066
350cc38d
MS
12067 case bfd_mach_mips_loongson_2e:
12068 val = E_MIPS_ARCH_3 | E_MIPS_MACH_LS2E;
12069 break;
12070
12071 case bfd_mach_mips_loongson_2f:
12072 val = E_MIPS_ARCH_3 | E_MIPS_MACH_LS2F;
12073 break;
12074
b49e97c9
TS
12075 case bfd_mach_mips_sb1:
12076 val = E_MIPS_ARCH_64 | E_MIPS_MACH_SB1;
12077 break;
12078
d051516a 12079 case bfd_mach_mips_loongson_3a:
4ba154f5 12080 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_LS3A;
d051516a
NC
12081 break;
12082
6f179bd0 12083 case bfd_mach_mips_octeon:
dd6a37e7 12084 case bfd_mach_mips_octeonp:
6f179bd0
AN
12085 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_OCTEON;
12086 break;
12087
2c629856
N
12088 case bfd_mach_mips_octeon3:
12089 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_OCTEON3;
12090 break;
12091
52b6b6b9
JM
12092 case bfd_mach_mips_xlr:
12093 val = E_MIPS_ARCH_64 | E_MIPS_MACH_XLR;
12094 break;
12095
432233b3
AP
12096 case bfd_mach_mips_octeon2:
12097 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_OCTEON2;
12098 break;
12099
b49e97c9
TS
12100 case bfd_mach_mipsisa32:
12101 val = E_MIPS_ARCH_32;
12102 break;
12103
12104 case bfd_mach_mipsisa64:
12105 val = E_MIPS_ARCH_64;
af7ee8bf
CD
12106 break;
12107
12108 case bfd_mach_mipsisa32r2:
ae52f483
AB
12109 case bfd_mach_mipsisa32r3:
12110 case bfd_mach_mipsisa32r5:
af7ee8bf
CD
12111 val = E_MIPS_ARCH_32R2;
12112 break;
5f74bc13
CD
12113
12114 case bfd_mach_mipsisa64r2:
ae52f483
AB
12115 case bfd_mach_mipsisa64r3:
12116 case bfd_mach_mipsisa64r5:
5f74bc13
CD
12117 val = E_MIPS_ARCH_64R2;
12118 break;
7361da2c
AB
12119
12120 case bfd_mach_mipsisa32r6:
12121 val = E_MIPS_ARCH_32R6;
12122 break;
12123
12124 case bfd_mach_mipsisa64r6:
12125 val = E_MIPS_ARCH_64R6;
12126 break;
b49e97c9 12127 }
b49e97c9
TS
12128 elf_elfheader (abfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
12129 elf_elfheader (abfd)->e_flags |= val;
12130
64543e1a
RS
12131}
12132
12133
28dbcedc
AM
12134/* Whether to sort relocs output by ld -r or ld --emit-relocs, by r_offset.
12135 Don't do so for code sections. We want to keep ordering of HI16/LO16
12136 as is. On the other hand, elf-eh-frame.c processing requires .eh_frame
12137 relocs to be sorted. */
12138
12139bfd_boolean
12140_bfd_mips_elf_sort_relocs_p (asection *sec)
12141{
12142 return (sec->flags & SEC_CODE) == 0;
12143}
12144
12145
64543e1a
RS
12146/* The final processing done just before writing out a MIPS ELF object
12147 file. This gets the MIPS architecture right based on the machine
12148 number. This is used by both the 32-bit and the 64-bit ABI. */
12149
12150void
9719ad41
RS
12151_bfd_mips_elf_final_write_processing (bfd *abfd,
12152 bfd_boolean linker ATTRIBUTE_UNUSED)
64543e1a
RS
12153{
12154 unsigned int i;
12155 Elf_Internal_Shdr **hdrpp;
12156 const char *name;
12157 asection *sec;
12158
12159 /* Keep the existing EF_MIPS_MACH and EF_MIPS_ARCH flags if the former
12160 is nonzero. This is for compatibility with old objects, which used
12161 a combination of a 32-bit EF_MIPS_ARCH and a 64-bit EF_MIPS_MACH. */
12162 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == 0)
12163 mips_set_isa_flags (abfd);
12164
b49e97c9
TS
12165 /* Set the sh_info field for .gptab sections and other appropriate
12166 info for each special section. */
12167 for (i = 1, hdrpp = elf_elfsections (abfd) + 1;
12168 i < elf_numsections (abfd);
12169 i++, hdrpp++)
12170 {
12171 switch ((*hdrpp)->sh_type)
12172 {
12173 case SHT_MIPS_MSYM:
12174 case SHT_MIPS_LIBLIST:
12175 sec = bfd_get_section_by_name (abfd, ".dynstr");
12176 if (sec != NULL)
12177 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12178 break;
12179
12180 case SHT_MIPS_GPTAB:
12181 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
12182 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
12183 BFD_ASSERT (name != NULL
0112cd26 12184 && CONST_STRNEQ (name, ".gptab."));
b49e97c9
TS
12185 sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
12186 BFD_ASSERT (sec != NULL);
12187 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
12188 break;
12189
12190 case SHT_MIPS_CONTENT:
12191 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
12192 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
12193 BFD_ASSERT (name != NULL
0112cd26 12194 && CONST_STRNEQ (name, ".MIPS.content"));
b49e97c9
TS
12195 sec = bfd_get_section_by_name (abfd,
12196 name + sizeof ".MIPS.content" - 1);
12197 BFD_ASSERT (sec != NULL);
12198 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12199 break;
12200
12201 case SHT_MIPS_SYMBOL_LIB:
12202 sec = bfd_get_section_by_name (abfd, ".dynsym");
12203 if (sec != NULL)
12204 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12205 sec = bfd_get_section_by_name (abfd, ".liblist");
12206 if (sec != NULL)
12207 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
12208 break;
12209
12210 case SHT_MIPS_EVENTS:
12211 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
12212 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
12213 BFD_ASSERT (name != NULL);
0112cd26 12214 if (CONST_STRNEQ (name, ".MIPS.events"))
b49e97c9
TS
12215 sec = bfd_get_section_by_name (abfd,
12216 name + sizeof ".MIPS.events" - 1);
12217 else
12218 {
0112cd26 12219 BFD_ASSERT (CONST_STRNEQ (name, ".MIPS.post_rel"));
b49e97c9
TS
12220 sec = bfd_get_section_by_name (abfd,
12221 (name
12222 + sizeof ".MIPS.post_rel" - 1));
12223 }
12224 BFD_ASSERT (sec != NULL);
12225 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12226 break;
12227
12228 }
12229 }
12230}
12231\f
8dc1a139 12232/* When creating an IRIX5 executable, we need REGINFO and RTPROC
b49e97c9
TS
12233 segments. */
12234
12235int
a6b96beb
AM
12236_bfd_mips_elf_additional_program_headers (bfd *abfd,
12237 struct bfd_link_info *info ATTRIBUTE_UNUSED)
b49e97c9
TS
12238{
12239 asection *s;
12240 int ret = 0;
12241
12242 /* See if we need a PT_MIPS_REGINFO segment. */
12243 s = bfd_get_section_by_name (abfd, ".reginfo");
12244 if (s && (s->flags & SEC_LOAD))
12245 ++ret;
12246
351cdf24
MF
12247 /* See if we need a PT_MIPS_ABIFLAGS segment. */
12248 if (bfd_get_section_by_name (abfd, ".MIPS.abiflags"))
12249 ++ret;
12250
b49e97c9
TS
12251 /* See if we need a PT_MIPS_OPTIONS segment. */
12252 if (IRIX_COMPAT (abfd) == ict_irix6
12253 && bfd_get_section_by_name (abfd,
12254 MIPS_ELF_OPTIONS_SECTION_NAME (abfd)))
12255 ++ret;
12256
12257 /* See if we need a PT_MIPS_RTPROC segment. */
12258 if (IRIX_COMPAT (abfd) == ict_irix5
12259 && bfd_get_section_by_name (abfd, ".dynamic")
12260 && bfd_get_section_by_name (abfd, ".mdebug"))
12261 ++ret;
12262
98c904a8
RS
12263 /* Allocate a PT_NULL header in dynamic objects. See
12264 _bfd_mips_elf_modify_segment_map for details. */
12265 if (!SGI_COMPAT (abfd)
12266 && bfd_get_section_by_name (abfd, ".dynamic"))
12267 ++ret;
12268
b49e97c9
TS
12269 return ret;
12270}
12271
8dc1a139 12272/* Modify the segment map for an IRIX5 executable. */
b49e97c9 12273
b34976b6 12274bfd_boolean
9719ad41 12275_bfd_mips_elf_modify_segment_map (bfd *abfd,
7c8b76cc 12276 struct bfd_link_info *info)
b49e97c9
TS
12277{
12278 asection *s;
12279 struct elf_segment_map *m, **pm;
12280 bfd_size_type amt;
12281
12282 /* If there is a .reginfo section, we need a PT_MIPS_REGINFO
12283 segment. */
12284 s = bfd_get_section_by_name (abfd, ".reginfo");
12285 if (s != NULL && (s->flags & SEC_LOAD) != 0)
12286 {
12bd6957 12287 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
b49e97c9
TS
12288 if (m->p_type == PT_MIPS_REGINFO)
12289 break;
12290 if (m == NULL)
12291 {
12292 amt = sizeof *m;
9719ad41 12293 m = bfd_zalloc (abfd, amt);
b49e97c9 12294 if (m == NULL)
b34976b6 12295 return FALSE;
b49e97c9
TS
12296
12297 m->p_type = PT_MIPS_REGINFO;
12298 m->count = 1;
12299 m->sections[0] = s;
12300
12301 /* We want to put it after the PHDR and INTERP segments. */
12bd6957 12302 pm = &elf_seg_map (abfd);
b49e97c9
TS
12303 while (*pm != NULL
12304 && ((*pm)->p_type == PT_PHDR
12305 || (*pm)->p_type == PT_INTERP))
12306 pm = &(*pm)->next;
12307
12308 m->next = *pm;
12309 *pm = m;
12310 }
12311 }
12312
351cdf24
MF
12313 /* If there is a .MIPS.abiflags section, we need a PT_MIPS_ABIFLAGS
12314 segment. */
12315 s = bfd_get_section_by_name (abfd, ".MIPS.abiflags");
12316 if (s != NULL && (s->flags & SEC_LOAD) != 0)
12317 {
12318 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
12319 if (m->p_type == PT_MIPS_ABIFLAGS)
12320 break;
12321 if (m == NULL)
12322 {
12323 amt = sizeof *m;
12324 m = bfd_zalloc (abfd, amt);
12325 if (m == NULL)
12326 return FALSE;
12327
12328 m->p_type = PT_MIPS_ABIFLAGS;
12329 m->count = 1;
12330 m->sections[0] = s;
12331
12332 /* We want to put it after the PHDR and INTERP segments. */
12333 pm = &elf_seg_map (abfd);
12334 while (*pm != NULL
12335 && ((*pm)->p_type == PT_PHDR
12336 || (*pm)->p_type == PT_INTERP))
12337 pm = &(*pm)->next;
12338
12339 m->next = *pm;
12340 *pm = m;
12341 }
12342 }
12343
b49e97c9
TS
12344 /* For IRIX 6, we don't have .mdebug sections, nor does anything but
12345 .dynamic end up in PT_DYNAMIC. However, we do have to insert a
98a8deaf 12346 PT_MIPS_OPTIONS segment immediately following the program header
b49e97c9 12347 table. */
c1fd6598
AO
12348 if (NEWABI_P (abfd)
12349 /* On non-IRIX6 new abi, we'll have already created a segment
12350 for this section, so don't create another. I'm not sure this
12351 is not also the case for IRIX 6, but I can't test it right
12352 now. */
12353 && IRIX_COMPAT (abfd) == ict_irix6)
b49e97c9
TS
12354 {
12355 for (s = abfd->sections; s; s = s->next)
12356 if (elf_section_data (s)->this_hdr.sh_type == SHT_MIPS_OPTIONS)
12357 break;
12358
12359 if (s)
12360 {
12361 struct elf_segment_map *options_segment;
12362
12bd6957 12363 pm = &elf_seg_map (abfd);
98a8deaf
RS
12364 while (*pm != NULL
12365 && ((*pm)->p_type == PT_PHDR
12366 || (*pm)->p_type == PT_INTERP))
12367 pm = &(*pm)->next;
b49e97c9 12368
8ded5a0f
AM
12369 if (*pm == NULL || (*pm)->p_type != PT_MIPS_OPTIONS)
12370 {
12371 amt = sizeof (struct elf_segment_map);
12372 options_segment = bfd_zalloc (abfd, amt);
12373 options_segment->next = *pm;
12374 options_segment->p_type = PT_MIPS_OPTIONS;
12375 options_segment->p_flags = PF_R;
12376 options_segment->p_flags_valid = TRUE;
12377 options_segment->count = 1;
12378 options_segment->sections[0] = s;
12379 *pm = options_segment;
12380 }
b49e97c9
TS
12381 }
12382 }
12383 else
12384 {
12385 if (IRIX_COMPAT (abfd) == ict_irix5)
12386 {
12387 /* If there are .dynamic and .mdebug sections, we make a room
12388 for the RTPROC header. FIXME: Rewrite without section names. */
12389 if (bfd_get_section_by_name (abfd, ".interp") == NULL
12390 && bfd_get_section_by_name (abfd, ".dynamic") != NULL
12391 && bfd_get_section_by_name (abfd, ".mdebug") != NULL)
12392 {
12bd6957 12393 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
b49e97c9
TS
12394 if (m->p_type == PT_MIPS_RTPROC)
12395 break;
12396 if (m == NULL)
12397 {
12398 amt = sizeof *m;
9719ad41 12399 m = bfd_zalloc (abfd, amt);
b49e97c9 12400 if (m == NULL)
b34976b6 12401 return FALSE;
b49e97c9
TS
12402
12403 m->p_type = PT_MIPS_RTPROC;
12404
12405 s = bfd_get_section_by_name (abfd, ".rtproc");
12406 if (s == NULL)
12407 {
12408 m->count = 0;
12409 m->p_flags = 0;
12410 m->p_flags_valid = 1;
12411 }
12412 else
12413 {
12414 m->count = 1;
12415 m->sections[0] = s;
12416 }
12417
12418 /* We want to put it after the DYNAMIC segment. */
12bd6957 12419 pm = &elf_seg_map (abfd);
b49e97c9
TS
12420 while (*pm != NULL && (*pm)->p_type != PT_DYNAMIC)
12421 pm = &(*pm)->next;
12422 if (*pm != NULL)
12423 pm = &(*pm)->next;
12424
12425 m->next = *pm;
12426 *pm = m;
12427 }
12428 }
12429 }
8dc1a139 12430 /* On IRIX5, the PT_DYNAMIC segment includes the .dynamic,
b49e97c9
TS
12431 .dynstr, .dynsym, and .hash sections, and everything in
12432 between. */
12bd6957 12433 for (pm = &elf_seg_map (abfd); *pm != NULL;
b49e97c9
TS
12434 pm = &(*pm)->next)
12435 if ((*pm)->p_type == PT_DYNAMIC)
12436 break;
12437 m = *pm;
f6f62d6f
RS
12438 /* GNU/Linux binaries do not need the extended PT_DYNAMIC section.
12439 glibc's dynamic linker has traditionally derived the number of
12440 tags from the p_filesz field, and sometimes allocates stack
12441 arrays of that size. An overly-big PT_DYNAMIC segment can
12442 be actively harmful in such cases. Making PT_DYNAMIC contain
12443 other sections can also make life hard for the prelinker,
12444 which might move one of the other sections to a different
12445 PT_LOAD segment. */
12446 if (SGI_COMPAT (abfd)
12447 && m != NULL
12448 && m->count == 1
12449 && strcmp (m->sections[0]->name, ".dynamic") == 0)
b49e97c9
TS
12450 {
12451 static const char *sec_names[] =
12452 {
12453 ".dynamic", ".dynstr", ".dynsym", ".hash"
12454 };
12455 bfd_vma low, high;
12456 unsigned int i, c;
12457 struct elf_segment_map *n;
12458
792b4a53 12459 low = ~(bfd_vma) 0;
b49e97c9
TS
12460 high = 0;
12461 for (i = 0; i < sizeof sec_names / sizeof sec_names[0]; i++)
12462 {
12463 s = bfd_get_section_by_name (abfd, sec_names[i]);
12464 if (s != NULL && (s->flags & SEC_LOAD) != 0)
12465 {
12466 bfd_size_type sz;
12467
12468 if (low > s->vma)
12469 low = s->vma;
eea6121a 12470 sz = s->size;
b49e97c9
TS
12471 if (high < s->vma + sz)
12472 high = s->vma + sz;
12473 }
12474 }
12475
12476 c = 0;
12477 for (s = abfd->sections; s != NULL; s = s->next)
12478 if ((s->flags & SEC_LOAD) != 0
12479 && s->vma >= low
eea6121a 12480 && s->vma + s->size <= high)
b49e97c9
TS
12481 ++c;
12482
12483 amt = sizeof *n + (bfd_size_type) (c - 1) * sizeof (asection *);
9719ad41 12484 n = bfd_zalloc (abfd, amt);
b49e97c9 12485 if (n == NULL)
b34976b6 12486 return FALSE;
b49e97c9
TS
12487 *n = *m;
12488 n->count = c;
12489
12490 i = 0;
12491 for (s = abfd->sections; s != NULL; s = s->next)
12492 {
12493 if ((s->flags & SEC_LOAD) != 0
12494 && s->vma >= low
eea6121a 12495 && s->vma + s->size <= high)
b49e97c9
TS
12496 {
12497 n->sections[i] = s;
12498 ++i;
12499 }
12500 }
12501
12502 *pm = n;
12503 }
12504 }
12505
98c904a8
RS
12506 /* Allocate a spare program header in dynamic objects so that tools
12507 like the prelinker can add an extra PT_LOAD entry.
12508
12509 If the prelinker needs to make room for a new PT_LOAD entry, its
12510 standard procedure is to move the first (read-only) sections into
12511 the new (writable) segment. However, the MIPS ABI requires
12512 .dynamic to be in a read-only segment, and the section will often
12513 start within sizeof (ElfNN_Phdr) bytes of the last program header.
12514
12515 Although the prelinker could in principle move .dynamic to a
12516 writable segment, it seems better to allocate a spare program
12517 header instead, and avoid the need to move any sections.
12518 There is a long tradition of allocating spare dynamic tags,
12519 so allocating a spare program header seems like a natural
7c8b76cc
JM
12520 extension.
12521
12522 If INFO is NULL, we may be copying an already prelinked binary
12523 with objcopy or strip, so do not add this header. */
12524 if (info != NULL
12525 && !SGI_COMPAT (abfd)
98c904a8
RS
12526 && bfd_get_section_by_name (abfd, ".dynamic"))
12527 {
12bd6957 12528 for (pm = &elf_seg_map (abfd); *pm != NULL; pm = &(*pm)->next)
98c904a8
RS
12529 if ((*pm)->p_type == PT_NULL)
12530 break;
12531 if (*pm == NULL)
12532 {
12533 m = bfd_zalloc (abfd, sizeof (*m));
12534 if (m == NULL)
12535 return FALSE;
12536
12537 m->p_type = PT_NULL;
12538 *pm = m;
12539 }
12540 }
12541
b34976b6 12542 return TRUE;
b49e97c9
TS
12543}
12544\f
12545/* Return the section that should be marked against GC for a given
12546 relocation. */
12547
12548asection *
9719ad41 12549_bfd_mips_elf_gc_mark_hook (asection *sec,
07adf181 12550 struct bfd_link_info *info,
9719ad41
RS
12551 Elf_Internal_Rela *rel,
12552 struct elf_link_hash_entry *h,
12553 Elf_Internal_Sym *sym)
b49e97c9
TS
12554{
12555 /* ??? Do mips16 stub sections need to be handled special? */
12556
12557 if (h != NULL)
07adf181
AM
12558 switch (ELF_R_TYPE (sec->owner, rel->r_info))
12559 {
12560 case R_MIPS_GNU_VTINHERIT:
12561 case R_MIPS_GNU_VTENTRY:
12562 return NULL;
12563 }
b49e97c9 12564
07adf181 12565 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
b49e97c9
TS
12566}
12567
12568/* Update the got entry reference counts for the section being removed. */
12569
b34976b6 12570bfd_boolean
9719ad41
RS
12571_bfd_mips_elf_gc_sweep_hook (bfd *abfd ATTRIBUTE_UNUSED,
12572 struct bfd_link_info *info ATTRIBUTE_UNUSED,
12573 asection *sec ATTRIBUTE_UNUSED,
12574 const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED)
b49e97c9
TS
12575{
12576#if 0
12577 Elf_Internal_Shdr *symtab_hdr;
12578 struct elf_link_hash_entry **sym_hashes;
12579 bfd_signed_vma *local_got_refcounts;
12580 const Elf_Internal_Rela *rel, *relend;
12581 unsigned long r_symndx;
12582 struct elf_link_hash_entry *h;
12583
0e1862bb 12584 if (bfd_link_relocatable (info))
7dda2462
TG
12585 return TRUE;
12586
b49e97c9
TS
12587 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12588 sym_hashes = elf_sym_hashes (abfd);
12589 local_got_refcounts = elf_local_got_refcounts (abfd);
12590
12591 relend = relocs + sec->reloc_count;
12592 for (rel = relocs; rel < relend; rel++)
12593 switch (ELF_R_TYPE (abfd, rel->r_info))
12594 {
738e5348
RS
12595 case R_MIPS16_GOT16:
12596 case R_MIPS16_CALL16:
b49e97c9
TS
12597 case R_MIPS_GOT16:
12598 case R_MIPS_CALL16:
12599 case R_MIPS_CALL_HI16:
12600 case R_MIPS_CALL_LO16:
12601 case R_MIPS_GOT_HI16:
12602 case R_MIPS_GOT_LO16:
4a14403c
TS
12603 case R_MIPS_GOT_DISP:
12604 case R_MIPS_GOT_PAGE:
12605 case R_MIPS_GOT_OFST:
df58fc94
RS
12606 case R_MICROMIPS_GOT16:
12607 case R_MICROMIPS_CALL16:
12608 case R_MICROMIPS_CALL_HI16:
12609 case R_MICROMIPS_CALL_LO16:
12610 case R_MICROMIPS_GOT_HI16:
12611 case R_MICROMIPS_GOT_LO16:
12612 case R_MICROMIPS_GOT_DISP:
12613 case R_MICROMIPS_GOT_PAGE:
12614 case R_MICROMIPS_GOT_OFST:
b49e97c9
TS
12615 /* ??? It would seem that the existing MIPS code does no sort
12616 of reference counting or whatnot on its GOT and PLT entries,
12617 so it is not possible to garbage collect them at this time. */
12618 break;
12619
12620 default:
12621 break;
12622 }
12623#endif
12624
b34976b6 12625 return TRUE;
b49e97c9 12626}
351cdf24
MF
12627
12628/* Prevent .MIPS.abiflags from being discarded with --gc-sections. */
12629
12630bfd_boolean
12631_bfd_mips_elf_gc_mark_extra_sections (struct bfd_link_info *info,
12632 elf_gc_mark_hook_fn gc_mark_hook)
12633{
12634 bfd *sub;
12635
12636 _bfd_elf_gc_mark_extra_sections (info, gc_mark_hook);
12637
12638 for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
12639 {
12640 asection *o;
12641
12642 if (! is_mips_elf (sub))
12643 continue;
12644
12645 for (o = sub->sections; o != NULL; o = o->next)
12646 if (!o->gc_mark
12647 && MIPS_ELF_ABIFLAGS_SECTION_NAME_P
12648 (bfd_get_section_name (sub, o)))
12649 {
12650 if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
12651 return FALSE;
12652 }
12653 }
12654
12655 return TRUE;
12656}
b49e97c9
TS
12657\f
12658/* Copy data from a MIPS ELF indirect symbol to its direct symbol,
12659 hiding the old indirect symbol. Process additional relocation
12660 information. Also called for weakdefs, in which case we just let
12661 _bfd_elf_link_hash_copy_indirect copy the flags for us. */
12662
12663void
fcfa13d2 12664_bfd_mips_elf_copy_indirect_symbol (struct bfd_link_info *info,
9719ad41
RS
12665 struct elf_link_hash_entry *dir,
12666 struct elf_link_hash_entry *ind)
b49e97c9
TS
12667{
12668 struct mips_elf_link_hash_entry *dirmips, *indmips;
12669
fcfa13d2 12670 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
b49e97c9 12671
861fb55a
DJ
12672 dirmips = (struct mips_elf_link_hash_entry *) dir;
12673 indmips = (struct mips_elf_link_hash_entry *) ind;
12674 /* Any absolute non-dynamic relocations against an indirect or weak
12675 definition will be against the target symbol. */
12676 if (indmips->has_static_relocs)
12677 dirmips->has_static_relocs = TRUE;
12678
b49e97c9
TS
12679 if (ind->root.type != bfd_link_hash_indirect)
12680 return;
12681
b49e97c9
TS
12682 dirmips->possibly_dynamic_relocs += indmips->possibly_dynamic_relocs;
12683 if (indmips->readonly_reloc)
b34976b6 12684 dirmips->readonly_reloc = TRUE;
b49e97c9 12685 if (indmips->no_fn_stub)
b34976b6 12686 dirmips->no_fn_stub = TRUE;
61b0a4af
RS
12687 if (indmips->fn_stub)
12688 {
12689 dirmips->fn_stub = indmips->fn_stub;
12690 indmips->fn_stub = NULL;
12691 }
12692 if (indmips->need_fn_stub)
12693 {
12694 dirmips->need_fn_stub = TRUE;
12695 indmips->need_fn_stub = FALSE;
12696 }
12697 if (indmips->call_stub)
12698 {
12699 dirmips->call_stub = indmips->call_stub;
12700 indmips->call_stub = NULL;
12701 }
12702 if (indmips->call_fp_stub)
12703 {
12704 dirmips->call_fp_stub = indmips->call_fp_stub;
12705 indmips->call_fp_stub = NULL;
12706 }
634835ae
RS
12707 if (indmips->global_got_area < dirmips->global_got_area)
12708 dirmips->global_got_area = indmips->global_got_area;
12709 if (indmips->global_got_area < GGA_NONE)
12710 indmips->global_got_area = GGA_NONE;
861fb55a
DJ
12711 if (indmips->has_nonpic_branches)
12712 dirmips->has_nonpic_branches = TRUE;
b49e97c9 12713}
b49e97c9 12714\f
d01414a5
TS
12715#define PDR_SIZE 32
12716
b34976b6 12717bfd_boolean
9719ad41
RS
12718_bfd_mips_elf_discard_info (bfd *abfd, struct elf_reloc_cookie *cookie,
12719 struct bfd_link_info *info)
d01414a5
TS
12720{
12721 asection *o;
b34976b6 12722 bfd_boolean ret = FALSE;
d01414a5
TS
12723 unsigned char *tdata;
12724 size_t i, skip;
12725
12726 o = bfd_get_section_by_name (abfd, ".pdr");
12727 if (! o)
b34976b6 12728 return FALSE;
eea6121a 12729 if (o->size == 0)
b34976b6 12730 return FALSE;
eea6121a 12731 if (o->size % PDR_SIZE != 0)
b34976b6 12732 return FALSE;
d01414a5
TS
12733 if (o->output_section != NULL
12734 && bfd_is_abs_section (o->output_section))
b34976b6 12735 return FALSE;
d01414a5 12736
eea6121a 12737 tdata = bfd_zmalloc (o->size / PDR_SIZE);
d01414a5 12738 if (! tdata)
b34976b6 12739 return FALSE;
d01414a5 12740
9719ad41 12741 cookie->rels = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
45d6a902 12742 info->keep_memory);
d01414a5
TS
12743 if (!cookie->rels)
12744 {
12745 free (tdata);
b34976b6 12746 return FALSE;
d01414a5
TS
12747 }
12748
12749 cookie->rel = cookie->rels;
12750 cookie->relend = cookie->rels + o->reloc_count;
12751
eea6121a 12752 for (i = 0, skip = 0; i < o->size / PDR_SIZE; i ++)
d01414a5 12753 {
c152c796 12754 if (bfd_elf_reloc_symbol_deleted_p (i * PDR_SIZE, cookie))
d01414a5
TS
12755 {
12756 tdata[i] = 1;
12757 skip ++;
12758 }
12759 }
12760
12761 if (skip != 0)
12762 {
f0abc2a1 12763 mips_elf_section_data (o)->u.tdata = tdata;
e034b2cc
MR
12764 if (o->rawsize == 0)
12765 o->rawsize = o->size;
eea6121a 12766 o->size -= skip * PDR_SIZE;
b34976b6 12767 ret = TRUE;
d01414a5
TS
12768 }
12769 else
12770 free (tdata);
12771
12772 if (! info->keep_memory)
12773 free (cookie->rels);
12774
12775 return ret;
12776}
12777
b34976b6 12778bfd_boolean
9719ad41 12779_bfd_mips_elf_ignore_discarded_relocs (asection *sec)
53bfd6b4
MR
12780{
12781 if (strcmp (sec->name, ".pdr") == 0)
b34976b6
AM
12782 return TRUE;
12783 return FALSE;
53bfd6b4 12784}
d01414a5 12785
b34976b6 12786bfd_boolean
c7b8f16e
JB
12787_bfd_mips_elf_write_section (bfd *output_bfd,
12788 struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
12789 asection *sec, bfd_byte *contents)
d01414a5
TS
12790{
12791 bfd_byte *to, *from, *end;
12792 int i;
12793
12794 if (strcmp (sec->name, ".pdr") != 0)
b34976b6 12795 return FALSE;
d01414a5 12796
f0abc2a1 12797 if (mips_elf_section_data (sec)->u.tdata == NULL)
b34976b6 12798 return FALSE;
d01414a5
TS
12799
12800 to = contents;
eea6121a 12801 end = contents + sec->size;
d01414a5
TS
12802 for (from = contents, i = 0;
12803 from < end;
12804 from += PDR_SIZE, i++)
12805 {
f0abc2a1 12806 if ((mips_elf_section_data (sec)->u.tdata)[i] == 1)
d01414a5
TS
12807 continue;
12808 if (to != from)
12809 memcpy (to, from, PDR_SIZE);
12810 to += PDR_SIZE;
12811 }
12812 bfd_set_section_contents (output_bfd, sec->output_section, contents,
eea6121a 12813 sec->output_offset, sec->size);
b34976b6 12814 return TRUE;
d01414a5 12815}
53bfd6b4 12816\f
df58fc94
RS
12817/* microMIPS code retains local labels for linker relaxation. Omit them
12818 from output by default for clarity. */
12819
12820bfd_boolean
12821_bfd_mips_elf_is_target_special_symbol (bfd *abfd, asymbol *sym)
12822{
12823 return _bfd_elf_is_local_label_name (abfd, sym->name);
12824}
12825
b49e97c9
TS
12826/* MIPS ELF uses a special find_nearest_line routine in order the
12827 handle the ECOFF debugging information. */
12828
12829struct mips_elf_find_line
12830{
12831 struct ecoff_debug_info d;
12832 struct ecoff_find_line i;
12833};
12834
b34976b6 12835bfd_boolean
fb167eb2
AM
12836_bfd_mips_elf_find_nearest_line (bfd *abfd, asymbol **symbols,
12837 asection *section, bfd_vma offset,
9719ad41
RS
12838 const char **filename_ptr,
12839 const char **functionname_ptr,
fb167eb2
AM
12840 unsigned int *line_ptr,
12841 unsigned int *discriminator_ptr)
b49e97c9
TS
12842{
12843 asection *msec;
12844
fb167eb2 12845 if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
b49e97c9 12846 filename_ptr, functionname_ptr,
fb167eb2
AM
12847 line_ptr, discriminator_ptr,
12848 dwarf_debug_sections,
12849 ABI_64_P (abfd) ? 8 : 0,
12850 &elf_tdata (abfd)->dwarf2_find_line_info))
b34976b6 12851 return TRUE;
b49e97c9 12852
fb167eb2 12853 if (_bfd_dwarf1_find_nearest_line (abfd, symbols, section, offset,
b49e97c9 12854 filename_ptr, functionname_ptr,
fb167eb2 12855 line_ptr))
b34976b6 12856 return TRUE;
b49e97c9
TS
12857
12858 msec = bfd_get_section_by_name (abfd, ".mdebug");
12859 if (msec != NULL)
12860 {
12861 flagword origflags;
12862 struct mips_elf_find_line *fi;
12863 const struct ecoff_debug_swap * const swap =
12864 get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
12865
12866 /* If we are called during a link, mips_elf_final_link may have
12867 cleared the SEC_HAS_CONTENTS field. We force it back on here
12868 if appropriate (which it normally will be). */
12869 origflags = msec->flags;
12870 if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
12871 msec->flags |= SEC_HAS_CONTENTS;
12872
698600e4 12873 fi = mips_elf_tdata (abfd)->find_line_info;
b49e97c9
TS
12874 if (fi == NULL)
12875 {
12876 bfd_size_type external_fdr_size;
12877 char *fraw_src;
12878 char *fraw_end;
12879 struct fdr *fdr_ptr;
12880 bfd_size_type amt = sizeof (struct mips_elf_find_line);
12881
9719ad41 12882 fi = bfd_zalloc (abfd, amt);
b49e97c9
TS
12883 if (fi == NULL)
12884 {
12885 msec->flags = origflags;
b34976b6 12886 return FALSE;
b49e97c9
TS
12887 }
12888
12889 if (! _bfd_mips_elf_read_ecoff_info (abfd, msec, &fi->d))
12890 {
12891 msec->flags = origflags;
b34976b6 12892 return FALSE;
b49e97c9
TS
12893 }
12894
12895 /* Swap in the FDR information. */
12896 amt = fi->d.symbolic_header.ifdMax * sizeof (struct fdr);
9719ad41 12897 fi->d.fdr = bfd_alloc (abfd, amt);
b49e97c9
TS
12898 if (fi->d.fdr == NULL)
12899 {
12900 msec->flags = origflags;
b34976b6 12901 return FALSE;
b49e97c9
TS
12902 }
12903 external_fdr_size = swap->external_fdr_size;
12904 fdr_ptr = fi->d.fdr;
12905 fraw_src = (char *) fi->d.external_fdr;
12906 fraw_end = (fraw_src
12907 + fi->d.symbolic_header.ifdMax * external_fdr_size);
12908 for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
9719ad41 12909 (*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr);
b49e97c9 12910
698600e4 12911 mips_elf_tdata (abfd)->find_line_info = fi;
b49e97c9
TS
12912
12913 /* Note that we don't bother to ever free this information.
12914 find_nearest_line is either called all the time, as in
12915 objdump -l, so the information should be saved, or it is
12916 rarely called, as in ld error messages, so the memory
12917 wasted is unimportant. Still, it would probably be a
12918 good idea for free_cached_info to throw it away. */
12919 }
12920
12921 if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
12922 &fi->i, filename_ptr, functionname_ptr,
12923 line_ptr))
12924 {
12925 msec->flags = origflags;
b34976b6 12926 return TRUE;
b49e97c9
TS
12927 }
12928
12929 msec->flags = origflags;
12930 }
12931
12932 /* Fall back on the generic ELF find_nearest_line routine. */
12933
fb167eb2 12934 return _bfd_elf_find_nearest_line (abfd, symbols, section, offset,
b49e97c9 12935 filename_ptr, functionname_ptr,
fb167eb2 12936 line_ptr, discriminator_ptr);
b49e97c9 12937}
4ab527b0
FF
12938
12939bfd_boolean
12940_bfd_mips_elf_find_inliner_info (bfd *abfd,
12941 const char **filename_ptr,
12942 const char **functionname_ptr,
12943 unsigned int *line_ptr)
12944{
12945 bfd_boolean found;
12946 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
12947 functionname_ptr, line_ptr,
12948 & elf_tdata (abfd)->dwarf2_find_line_info);
12949 return found;
12950}
12951
b49e97c9
TS
12952\f
12953/* When are writing out the .options or .MIPS.options section,
12954 remember the bytes we are writing out, so that we can install the
12955 GP value in the section_processing routine. */
12956
b34976b6 12957bfd_boolean
9719ad41
RS
12958_bfd_mips_elf_set_section_contents (bfd *abfd, sec_ptr section,
12959 const void *location,
12960 file_ptr offset, bfd_size_type count)
b49e97c9 12961{
cc2e31b9 12962 if (MIPS_ELF_OPTIONS_SECTION_NAME_P (section->name))
b49e97c9
TS
12963 {
12964 bfd_byte *c;
12965
12966 if (elf_section_data (section) == NULL)
12967 {
12968 bfd_size_type amt = sizeof (struct bfd_elf_section_data);
9719ad41 12969 section->used_by_bfd = bfd_zalloc (abfd, amt);
b49e97c9 12970 if (elf_section_data (section) == NULL)
b34976b6 12971 return FALSE;
b49e97c9 12972 }
f0abc2a1 12973 c = mips_elf_section_data (section)->u.tdata;
b49e97c9
TS
12974 if (c == NULL)
12975 {
eea6121a 12976 c = bfd_zalloc (abfd, section->size);
b49e97c9 12977 if (c == NULL)
b34976b6 12978 return FALSE;
f0abc2a1 12979 mips_elf_section_data (section)->u.tdata = c;
b49e97c9
TS
12980 }
12981
9719ad41 12982 memcpy (c + offset, location, count);
b49e97c9
TS
12983 }
12984
12985 return _bfd_elf_set_section_contents (abfd, section, location, offset,
12986 count);
12987}
12988
12989/* This is almost identical to bfd_generic_get_... except that some
12990 MIPS relocations need to be handled specially. Sigh. */
12991
12992bfd_byte *
9719ad41
RS
12993_bfd_elf_mips_get_relocated_section_contents
12994 (bfd *abfd,
12995 struct bfd_link_info *link_info,
12996 struct bfd_link_order *link_order,
12997 bfd_byte *data,
12998 bfd_boolean relocatable,
12999 asymbol **symbols)
b49e97c9
TS
13000{
13001 /* Get enough memory to hold the stuff */
13002 bfd *input_bfd = link_order->u.indirect.section->owner;
13003 asection *input_section = link_order->u.indirect.section;
eea6121a 13004 bfd_size_type sz;
b49e97c9
TS
13005
13006 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
13007 arelent **reloc_vector = NULL;
13008 long reloc_count;
13009
13010 if (reloc_size < 0)
13011 goto error_return;
13012
9719ad41 13013 reloc_vector = bfd_malloc (reloc_size);
b49e97c9
TS
13014 if (reloc_vector == NULL && reloc_size != 0)
13015 goto error_return;
13016
13017 /* read in the section */
eea6121a
AM
13018 sz = input_section->rawsize ? input_section->rawsize : input_section->size;
13019 if (!bfd_get_section_contents (input_bfd, input_section, data, 0, sz))
b49e97c9
TS
13020 goto error_return;
13021
b49e97c9
TS
13022 reloc_count = bfd_canonicalize_reloc (input_bfd,
13023 input_section,
13024 reloc_vector,
13025 symbols);
13026 if (reloc_count < 0)
13027 goto error_return;
13028
13029 if (reloc_count > 0)
13030 {
13031 arelent **parent;
13032 /* for mips */
13033 int gp_found;
13034 bfd_vma gp = 0x12345678; /* initialize just to shut gcc up */
13035
13036 {
13037 struct bfd_hash_entry *h;
13038 struct bfd_link_hash_entry *lh;
13039 /* Skip all this stuff if we aren't mixing formats. */
13040 if (abfd && input_bfd
13041 && abfd->xvec == input_bfd->xvec)
13042 lh = 0;
13043 else
13044 {
b34976b6 13045 h = bfd_hash_lookup (&link_info->hash->table, "_gp", FALSE, FALSE);
b49e97c9
TS
13046 lh = (struct bfd_link_hash_entry *) h;
13047 }
13048 lookup:
13049 if (lh)
13050 {
13051 switch (lh->type)
13052 {
13053 case bfd_link_hash_undefined:
13054 case bfd_link_hash_undefweak:
13055 case bfd_link_hash_common:
13056 gp_found = 0;
13057 break;
13058 case bfd_link_hash_defined:
13059 case bfd_link_hash_defweak:
13060 gp_found = 1;
13061 gp = lh->u.def.value;
13062 break;
13063 case bfd_link_hash_indirect:
13064 case bfd_link_hash_warning:
13065 lh = lh->u.i.link;
13066 /* @@FIXME ignoring warning for now */
13067 goto lookup;
13068 case bfd_link_hash_new:
13069 default:
13070 abort ();
13071 }
13072 }
13073 else
13074 gp_found = 0;
13075 }
13076 /* end mips */
9719ad41 13077 for (parent = reloc_vector; *parent != NULL; parent++)
b49e97c9 13078 {
9719ad41 13079 char *error_message = NULL;
b49e97c9
TS
13080 bfd_reloc_status_type r;
13081
13082 /* Specific to MIPS: Deal with relocation types that require
13083 knowing the gp of the output bfd. */
13084 asymbol *sym = *(*parent)->sym_ptr_ptr;
b49e97c9 13085
8236346f
EC
13086 /* If we've managed to find the gp and have a special
13087 function for the relocation then go ahead, else default
13088 to the generic handling. */
13089 if (gp_found
13090 && (*parent)->howto->special_function
13091 == _bfd_mips_elf32_gprel16_reloc)
13092 r = _bfd_mips_elf_gprel16_with_gp (input_bfd, sym, *parent,
13093 input_section, relocatable,
13094 data, gp);
13095 else
86324f90 13096 r = bfd_perform_relocation (input_bfd, *parent, data,
8236346f
EC
13097 input_section,
13098 relocatable ? abfd : NULL,
13099 &error_message);
b49e97c9 13100
1049f94e 13101 if (relocatable)
b49e97c9
TS
13102 {
13103 asection *os = input_section->output_section;
13104
13105 /* A partial link, so keep the relocs */
13106 os->orelocation[os->reloc_count] = *parent;
13107 os->reloc_count++;
13108 }
13109
13110 if (r != bfd_reloc_ok)
13111 {
13112 switch (r)
13113 {
13114 case bfd_reloc_undefined:
1a72702b
AM
13115 (*link_info->callbacks->undefined_symbol)
13116 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13117 input_bfd, input_section, (*parent)->address, TRUE);
b49e97c9
TS
13118 break;
13119 case bfd_reloc_dangerous:
9719ad41 13120 BFD_ASSERT (error_message != NULL);
1a72702b
AM
13121 (*link_info->callbacks->reloc_dangerous)
13122 (link_info, error_message,
13123 input_bfd, input_section, (*parent)->address);
b49e97c9
TS
13124 break;
13125 case bfd_reloc_overflow:
1a72702b
AM
13126 (*link_info->callbacks->reloc_overflow)
13127 (link_info, NULL,
13128 bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13129 (*parent)->howto->name, (*parent)->addend,
13130 input_bfd, input_section, (*parent)->address);
b49e97c9
TS
13131 break;
13132 case bfd_reloc_outofrange:
13133 default:
13134 abort ();
13135 break;
13136 }
13137
13138 }
13139 }
13140 }
13141 if (reloc_vector != NULL)
13142 free (reloc_vector);
13143 return data;
13144
13145error_return:
13146 if (reloc_vector != NULL)
13147 free (reloc_vector);
13148 return NULL;
13149}
13150\f
df58fc94
RS
13151static bfd_boolean
13152mips_elf_relax_delete_bytes (bfd *abfd,
13153 asection *sec, bfd_vma addr, int count)
13154{
13155 Elf_Internal_Shdr *symtab_hdr;
13156 unsigned int sec_shndx;
13157 bfd_byte *contents;
13158 Elf_Internal_Rela *irel, *irelend;
13159 Elf_Internal_Sym *isym;
13160 Elf_Internal_Sym *isymend;
13161 struct elf_link_hash_entry **sym_hashes;
13162 struct elf_link_hash_entry **end_hashes;
13163 struct elf_link_hash_entry **start_hashes;
13164 unsigned int symcount;
13165
13166 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
13167 contents = elf_section_data (sec)->this_hdr.contents;
13168
13169 irel = elf_section_data (sec)->relocs;
13170 irelend = irel + sec->reloc_count;
13171
13172 /* Actually delete the bytes. */
13173 memmove (contents + addr, contents + addr + count,
13174 (size_t) (sec->size - addr - count));
13175 sec->size -= count;
13176
13177 /* Adjust all the relocs. */
13178 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
13179 {
13180 /* Get the new reloc address. */
13181 if (irel->r_offset > addr)
13182 irel->r_offset -= count;
13183 }
13184
13185 BFD_ASSERT (addr % 2 == 0);
13186 BFD_ASSERT (count % 2 == 0);
13187
13188 /* Adjust the local symbols defined in this section. */
13189 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
13190 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
13191 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
2309ddf2 13192 if (isym->st_shndx == sec_shndx && isym->st_value > addr)
df58fc94
RS
13193 isym->st_value -= count;
13194
13195 /* Now adjust the global symbols defined in this section. */
13196 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
13197 - symtab_hdr->sh_info);
13198 sym_hashes = start_hashes = elf_sym_hashes (abfd);
13199 end_hashes = sym_hashes + symcount;
13200
13201 for (; sym_hashes < end_hashes; sym_hashes++)
13202 {
13203 struct elf_link_hash_entry *sym_hash = *sym_hashes;
13204
13205 if ((sym_hash->root.type == bfd_link_hash_defined
13206 || sym_hash->root.type == bfd_link_hash_defweak)
13207 && sym_hash->root.u.def.section == sec)
13208 {
2309ddf2 13209 bfd_vma value = sym_hash->root.u.def.value;
df58fc94 13210
df58fc94
RS
13211 if (ELF_ST_IS_MICROMIPS (sym_hash->other))
13212 value &= MINUS_TWO;
13213 if (value > addr)
13214 sym_hash->root.u.def.value -= count;
13215 }
13216 }
13217
13218 return TRUE;
13219}
13220
13221
13222/* Opcodes needed for microMIPS relaxation as found in
13223 opcodes/micromips-opc.c. */
13224
13225struct opcode_descriptor {
13226 unsigned long match;
13227 unsigned long mask;
13228};
13229
13230/* The $ra register aka $31. */
13231
13232#define RA 31
13233
13234/* 32-bit instruction format register fields. */
13235
13236#define OP32_SREG(opcode) (((opcode) >> 16) & 0x1f)
13237#define OP32_TREG(opcode) (((opcode) >> 21) & 0x1f)
13238
13239/* Check if a 5-bit register index can be abbreviated to 3 bits. */
13240
13241#define OP16_VALID_REG(r) \
13242 ((2 <= (r) && (r) <= 7) || (16 <= (r) && (r) <= 17))
13243
13244
13245/* 32-bit and 16-bit branches. */
13246
13247static const struct opcode_descriptor b_insns_32[] = {
13248 { /* "b", "p", */ 0x40400000, 0xffff0000 }, /* bgez 0 */
13249 { /* "b", "p", */ 0x94000000, 0xffff0000 }, /* beq 0, 0 */
13250 { 0, 0 } /* End marker for find_match(). */
13251};
13252
13253static const struct opcode_descriptor bc_insn_32 =
13254 { /* "bc(1|2)(ft)", "N,p", */ 0x42800000, 0xfec30000 };
13255
13256static const struct opcode_descriptor bz_insn_32 =
13257 { /* "b(g|l)(e|t)z", "s,p", */ 0x40000000, 0xff200000 };
13258
13259static const struct opcode_descriptor bzal_insn_32 =
13260 { /* "b(ge|lt)zal", "s,p", */ 0x40200000, 0xffa00000 };
13261
13262static const struct opcode_descriptor beq_insn_32 =
13263 { /* "b(eq|ne)", "s,t,p", */ 0x94000000, 0xdc000000 };
13264
13265static const struct opcode_descriptor b_insn_16 =
13266 { /* "b", "mD", */ 0xcc00, 0xfc00 };
13267
13268static const struct opcode_descriptor bz_insn_16 =
c088dedf 13269 { /* "b(eq|ne)z", "md,mE", */ 0x8c00, 0xdc00 };
df58fc94
RS
13270
13271
13272/* 32-bit and 16-bit branch EQ and NE zero. */
13273
13274/* NOTE: All opcode tables have BEQ/BNE in the same order: first the
13275 eq and second the ne. This convention is used when replacing a
13276 32-bit BEQ/BNE with the 16-bit version. */
13277
13278#define BZC32_REG_FIELD(r) (((r) & 0x1f) << 16)
13279
13280static const struct opcode_descriptor bz_rs_insns_32[] = {
13281 { /* "beqz", "s,p", */ 0x94000000, 0xffe00000 },
13282 { /* "bnez", "s,p", */ 0xb4000000, 0xffe00000 },
13283 { 0, 0 } /* End marker for find_match(). */
13284};
13285
13286static const struct opcode_descriptor bz_rt_insns_32[] = {
13287 { /* "beqz", "t,p", */ 0x94000000, 0xfc01f000 },
13288 { /* "bnez", "t,p", */ 0xb4000000, 0xfc01f000 },
13289 { 0, 0 } /* End marker for find_match(). */
13290};
13291
13292static const struct opcode_descriptor bzc_insns_32[] = {
13293 { /* "beqzc", "s,p", */ 0x40e00000, 0xffe00000 },
13294 { /* "bnezc", "s,p", */ 0x40a00000, 0xffe00000 },
13295 { 0, 0 } /* End marker for find_match(). */
13296};
13297
13298static const struct opcode_descriptor bz_insns_16[] = {
13299 { /* "beqz", "md,mE", */ 0x8c00, 0xfc00 },
13300 { /* "bnez", "md,mE", */ 0xac00, 0xfc00 },
13301 { 0, 0 } /* End marker for find_match(). */
13302};
13303
13304/* Switch between a 5-bit register index and its 3-bit shorthand. */
13305
e67f83e5 13306#define BZ16_REG(opcode) ((((((opcode) >> 7) & 7) + 0x1e) & 0xf) + 2)
eb6b0cf4 13307#define BZ16_REG_FIELD(r) (((r) & 7) << 7)
df58fc94
RS
13308
13309
13310/* 32-bit instructions with a delay slot. */
13311
13312static const struct opcode_descriptor jal_insn_32_bd16 =
13313 { /* "jals", "a", */ 0x74000000, 0xfc000000 };
13314
13315static const struct opcode_descriptor jal_insn_32_bd32 =
13316 { /* "jal", "a", */ 0xf4000000, 0xfc000000 };
13317
13318static const struct opcode_descriptor jal_x_insn_32_bd32 =
13319 { /* "jal[x]", "a", */ 0xf0000000, 0xf8000000 };
13320
13321static const struct opcode_descriptor j_insn_32 =
13322 { /* "j", "a", */ 0xd4000000, 0xfc000000 };
13323
13324static const struct opcode_descriptor jalr_insn_32 =
13325 { /* "jalr[.hb]", "t,s", */ 0x00000f3c, 0xfc00efff };
13326
13327/* This table can be compacted, because no opcode replacement is made. */
13328
13329static const struct opcode_descriptor ds_insns_32_bd16[] = {
13330 { /* "jals", "a", */ 0x74000000, 0xfc000000 },
13331
13332 { /* "jalrs[.hb]", "t,s", */ 0x00004f3c, 0xfc00efff },
13333 { /* "b(ge|lt)zals", "s,p", */ 0x42200000, 0xffa00000 },
13334
13335 { /* "b(g|l)(e|t)z", "s,p", */ 0x40000000, 0xff200000 },
13336 { /* "b(eq|ne)", "s,t,p", */ 0x94000000, 0xdc000000 },
13337 { /* "j", "a", */ 0xd4000000, 0xfc000000 },
13338 { 0, 0 } /* End marker for find_match(). */
13339};
13340
13341/* This table can be compacted, because no opcode replacement is made. */
13342
13343static const struct opcode_descriptor ds_insns_32_bd32[] = {
13344 { /* "jal[x]", "a", */ 0xf0000000, 0xf8000000 },
13345
13346 { /* "jalr[.hb]", "t,s", */ 0x00000f3c, 0xfc00efff },
13347 { /* "b(ge|lt)zal", "s,p", */ 0x40200000, 0xffa00000 },
13348 { 0, 0 } /* End marker for find_match(). */
13349};
13350
13351
13352/* 16-bit instructions with a delay slot. */
13353
13354static const struct opcode_descriptor jalr_insn_16_bd16 =
13355 { /* "jalrs", "my,mj", */ 0x45e0, 0xffe0 };
13356
13357static const struct opcode_descriptor jalr_insn_16_bd32 =
13358 { /* "jalr", "my,mj", */ 0x45c0, 0xffe0 };
13359
13360static const struct opcode_descriptor jr_insn_16 =
13361 { /* "jr", "mj", */ 0x4580, 0xffe0 };
13362
13363#define JR16_REG(opcode) ((opcode) & 0x1f)
13364
13365/* This table can be compacted, because no opcode replacement is made. */
13366
13367static const struct opcode_descriptor ds_insns_16_bd16[] = {
13368 { /* "jalrs", "my,mj", */ 0x45e0, 0xffe0 },
13369
13370 { /* "b", "mD", */ 0xcc00, 0xfc00 },
13371 { /* "b(eq|ne)z", "md,mE", */ 0x8c00, 0xdc00 },
13372 { /* "jr", "mj", */ 0x4580, 0xffe0 },
13373 { 0, 0 } /* End marker for find_match(). */
13374};
13375
13376
13377/* LUI instruction. */
13378
13379static const struct opcode_descriptor lui_insn =
13380 { /* "lui", "s,u", */ 0x41a00000, 0xffe00000 };
13381
13382
13383/* ADDIU instruction. */
13384
13385static const struct opcode_descriptor addiu_insn =
13386 { /* "addiu", "t,r,j", */ 0x30000000, 0xfc000000 };
13387
13388static const struct opcode_descriptor addiupc_insn =
13389 { /* "addiu", "mb,$pc,mQ", */ 0x78000000, 0xfc000000 };
13390
13391#define ADDIUPC_REG_FIELD(r) \
13392 (((2 <= (r) && (r) <= 7) ? (r) : ((r) - 16)) << 23)
13393
13394
13395/* Relaxable instructions in a JAL delay slot: MOVE. */
13396
13397/* The 16-bit move has rd in 9:5 and rs in 4:0. The 32-bit moves
13398 (ADDU, OR) have rd in 15:11 and rs in 10:16. */
13399#define MOVE32_RD(opcode) (((opcode) >> 11) & 0x1f)
13400#define MOVE32_RS(opcode) (((opcode) >> 16) & 0x1f)
13401
13402#define MOVE16_RD_FIELD(r) (((r) & 0x1f) << 5)
13403#define MOVE16_RS_FIELD(r) (((r) & 0x1f) )
13404
13405static const struct opcode_descriptor move_insns_32[] = {
df58fc94 13406 { /* "move", "d,s", */ 0x00000290, 0xffe007ff }, /* or d,s,$0 */
40fc1451 13407 { /* "move", "d,s", */ 0x00000150, 0xffe007ff }, /* addu d,s,$0 */
df58fc94
RS
13408 { 0, 0 } /* End marker for find_match(). */
13409};
13410
13411static const struct opcode_descriptor move_insn_16 =
13412 { /* "move", "mp,mj", */ 0x0c00, 0xfc00 };
13413
13414
13415/* NOP instructions. */
13416
13417static const struct opcode_descriptor nop_insn_32 =
13418 { /* "nop", "", */ 0x00000000, 0xffffffff };
13419
13420static const struct opcode_descriptor nop_insn_16 =
13421 { /* "nop", "", */ 0x0c00, 0xffff };
13422
13423
13424/* Instruction match support. */
13425
13426#define MATCH(opcode, insn) ((opcode & insn.mask) == insn.match)
13427
13428static int
13429find_match (unsigned long opcode, const struct opcode_descriptor insn[])
13430{
13431 unsigned long indx;
13432
13433 for (indx = 0; insn[indx].mask != 0; indx++)
13434 if (MATCH (opcode, insn[indx]))
13435 return indx;
13436
13437 return -1;
13438}
13439
13440
13441/* Branch and delay slot decoding support. */
13442
13443/* If PTR points to what *might* be a 16-bit branch or jump, then
13444 return the minimum length of its delay slot, otherwise return 0.
13445 Non-zero results are not definitive as we might be checking against
13446 the second half of another instruction. */
13447
13448static int
13449check_br16_dslot (bfd *abfd, bfd_byte *ptr)
13450{
13451 unsigned long opcode;
13452 int bdsize;
13453
13454 opcode = bfd_get_16 (abfd, ptr);
13455 if (MATCH (opcode, jalr_insn_16_bd32) != 0)
13456 /* 16-bit branch/jump with a 32-bit delay slot. */
13457 bdsize = 4;
13458 else if (MATCH (opcode, jalr_insn_16_bd16) != 0
13459 || find_match (opcode, ds_insns_16_bd16) >= 0)
13460 /* 16-bit branch/jump with a 16-bit delay slot. */
13461 bdsize = 2;
13462 else
13463 /* No delay slot. */
13464 bdsize = 0;
13465
13466 return bdsize;
13467}
13468
13469/* If PTR points to what *might* be a 32-bit branch or jump, then
13470 return the minimum length of its delay slot, otherwise return 0.
13471 Non-zero results are not definitive as we might be checking against
13472 the second half of another instruction. */
13473
13474static int
13475check_br32_dslot (bfd *abfd, bfd_byte *ptr)
13476{
13477 unsigned long opcode;
13478 int bdsize;
13479
d21911ea 13480 opcode = bfd_get_micromips_32 (abfd, ptr);
df58fc94
RS
13481 if (find_match (opcode, ds_insns_32_bd32) >= 0)
13482 /* 32-bit branch/jump with a 32-bit delay slot. */
13483 bdsize = 4;
13484 else if (find_match (opcode, ds_insns_32_bd16) >= 0)
13485 /* 32-bit branch/jump with a 16-bit delay slot. */
13486 bdsize = 2;
13487 else
13488 /* No delay slot. */
13489 bdsize = 0;
13490
13491 return bdsize;
13492}
13493
13494/* If PTR points to a 16-bit branch or jump with a 32-bit delay slot
13495 that doesn't fiddle with REG, then return TRUE, otherwise FALSE. */
13496
13497static bfd_boolean
13498check_br16 (bfd *abfd, bfd_byte *ptr, unsigned long reg)
13499{
13500 unsigned long opcode;
13501
13502 opcode = bfd_get_16 (abfd, ptr);
13503 if (MATCH (opcode, b_insn_16)
13504 /* B16 */
13505 || (MATCH (opcode, jr_insn_16) && reg != JR16_REG (opcode))
13506 /* JR16 */
13507 || (MATCH (opcode, bz_insn_16) && reg != BZ16_REG (opcode))
13508 /* BEQZ16, BNEZ16 */
13509 || (MATCH (opcode, jalr_insn_16_bd32)
13510 /* JALR16 */
13511 && reg != JR16_REG (opcode) && reg != RA))
13512 return TRUE;
13513
13514 return FALSE;
13515}
13516
13517/* If PTR points to a 32-bit branch or jump that doesn't fiddle with REG,
13518 then return TRUE, otherwise FALSE. */
13519
f41e5fcc 13520static bfd_boolean
df58fc94
RS
13521check_br32 (bfd *abfd, bfd_byte *ptr, unsigned long reg)
13522{
13523 unsigned long opcode;
13524
d21911ea 13525 opcode = bfd_get_micromips_32 (abfd, ptr);
df58fc94
RS
13526 if (MATCH (opcode, j_insn_32)
13527 /* J */
13528 || MATCH (opcode, bc_insn_32)
13529 /* BC1F, BC1T, BC2F, BC2T */
13530 || (MATCH (opcode, jal_x_insn_32_bd32) && reg != RA)
13531 /* JAL, JALX */
13532 || (MATCH (opcode, bz_insn_32) && reg != OP32_SREG (opcode))
13533 /* BGEZ, BGTZ, BLEZ, BLTZ */
13534 || (MATCH (opcode, bzal_insn_32)
13535 /* BGEZAL, BLTZAL */
13536 && reg != OP32_SREG (opcode) && reg != RA)
13537 || ((MATCH (opcode, jalr_insn_32) || MATCH (opcode, beq_insn_32))
13538 /* JALR, JALR.HB, BEQ, BNE */
13539 && reg != OP32_SREG (opcode) && reg != OP32_TREG (opcode)))
13540 return TRUE;
13541
13542 return FALSE;
13543}
13544
80cab405
MR
13545/* If the instruction encoding at PTR and relocations [INTERNAL_RELOCS,
13546 IRELEND) at OFFSET indicate that there must be a compact branch there,
13547 then return TRUE, otherwise FALSE. */
df58fc94
RS
13548
13549static bfd_boolean
80cab405
MR
13550check_relocated_bzc (bfd *abfd, const bfd_byte *ptr, bfd_vma offset,
13551 const Elf_Internal_Rela *internal_relocs,
13552 const Elf_Internal_Rela *irelend)
df58fc94 13553{
80cab405
MR
13554 const Elf_Internal_Rela *irel;
13555 unsigned long opcode;
13556
d21911ea 13557 opcode = bfd_get_micromips_32 (abfd, ptr);
80cab405
MR
13558 if (find_match (opcode, bzc_insns_32) < 0)
13559 return FALSE;
df58fc94
RS
13560
13561 for (irel = internal_relocs; irel < irelend; irel++)
80cab405
MR
13562 if (irel->r_offset == offset
13563 && ELF32_R_TYPE (irel->r_info) == R_MICROMIPS_PC16_S1)
13564 return TRUE;
13565
df58fc94
RS
13566 return FALSE;
13567}
80cab405
MR
13568
13569/* Bitsize checking. */
13570#define IS_BITSIZE(val, N) \
13571 (((((val) & ((1ULL << (N)) - 1)) ^ (1ULL << ((N) - 1))) \
13572 - (1ULL << ((N) - 1))) == (val))
13573
df58fc94
RS
13574\f
13575bfd_boolean
13576_bfd_mips_elf_relax_section (bfd *abfd, asection *sec,
13577 struct bfd_link_info *link_info,
13578 bfd_boolean *again)
13579{
833794fc 13580 bfd_boolean insn32 = mips_elf_hash_table (link_info)->insn32;
df58fc94
RS
13581 Elf_Internal_Shdr *symtab_hdr;
13582 Elf_Internal_Rela *internal_relocs;
13583 Elf_Internal_Rela *irel, *irelend;
13584 bfd_byte *contents = NULL;
13585 Elf_Internal_Sym *isymbuf = NULL;
13586
13587 /* Assume nothing changes. */
13588 *again = FALSE;
13589
13590 /* We don't have to do anything for a relocatable link, if
13591 this section does not have relocs, or if this is not a
13592 code section. */
13593
0e1862bb 13594 if (bfd_link_relocatable (link_info)
df58fc94
RS
13595 || (sec->flags & SEC_RELOC) == 0
13596 || sec->reloc_count == 0
13597 || (sec->flags & SEC_CODE) == 0)
13598 return TRUE;
13599
13600 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
13601
13602 /* Get a copy of the native relocations. */
13603 internal_relocs = (_bfd_elf_link_read_relocs
2c3fc389 13604 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
df58fc94
RS
13605 link_info->keep_memory));
13606 if (internal_relocs == NULL)
13607 goto error_return;
13608
13609 /* Walk through them looking for relaxing opportunities. */
13610 irelend = internal_relocs + sec->reloc_count;
13611 for (irel = internal_relocs; irel < irelend; irel++)
13612 {
13613 unsigned long r_symndx = ELF32_R_SYM (irel->r_info);
13614 unsigned int r_type = ELF32_R_TYPE (irel->r_info);
13615 bfd_boolean target_is_micromips_code_p;
13616 unsigned long opcode;
13617 bfd_vma symval;
13618 bfd_vma pcrval;
2309ddf2 13619 bfd_byte *ptr;
df58fc94
RS
13620 int fndopc;
13621
13622 /* The number of bytes to delete for relaxation and from where
13623 to delete these bytes starting at irel->r_offset. */
13624 int delcnt = 0;
13625 int deloff = 0;
13626
13627 /* If this isn't something that can be relaxed, then ignore
13628 this reloc. */
13629 if (r_type != R_MICROMIPS_HI16
13630 && r_type != R_MICROMIPS_PC16_S1
2309ddf2 13631 && r_type != R_MICROMIPS_26_S1)
df58fc94
RS
13632 continue;
13633
13634 /* Get the section contents if we haven't done so already. */
13635 if (contents == NULL)
13636 {
13637 /* Get cached copy if it exists. */
13638 if (elf_section_data (sec)->this_hdr.contents != NULL)
13639 contents = elf_section_data (sec)->this_hdr.contents;
13640 /* Go get them off disk. */
13641 else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
13642 goto error_return;
13643 }
2309ddf2 13644 ptr = contents + irel->r_offset;
df58fc94
RS
13645
13646 /* Read this BFD's local symbols if we haven't done so already. */
13647 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
13648 {
13649 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
13650 if (isymbuf == NULL)
13651 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
13652 symtab_hdr->sh_info, 0,
13653 NULL, NULL, NULL);
13654 if (isymbuf == NULL)
13655 goto error_return;
13656 }
13657
13658 /* Get the value of the symbol referred to by the reloc. */
13659 if (r_symndx < symtab_hdr->sh_info)
13660 {
13661 /* A local symbol. */
13662 Elf_Internal_Sym *isym;
13663 asection *sym_sec;
13664
13665 isym = isymbuf + r_symndx;
13666 if (isym->st_shndx == SHN_UNDEF)
13667 sym_sec = bfd_und_section_ptr;
13668 else if (isym->st_shndx == SHN_ABS)
13669 sym_sec = bfd_abs_section_ptr;
13670 else if (isym->st_shndx == SHN_COMMON)
13671 sym_sec = bfd_com_section_ptr;
13672 else
13673 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
13674 symval = (isym->st_value
13675 + sym_sec->output_section->vma
13676 + sym_sec->output_offset);
13677 target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (isym->st_other);
13678 }
13679 else
13680 {
13681 unsigned long indx;
13682 struct elf_link_hash_entry *h;
13683
13684 /* An external symbol. */
13685 indx = r_symndx - symtab_hdr->sh_info;
13686 h = elf_sym_hashes (abfd)[indx];
13687 BFD_ASSERT (h != NULL);
13688
13689 if (h->root.type != bfd_link_hash_defined
13690 && h->root.type != bfd_link_hash_defweak)
13691 /* This appears to be a reference to an undefined
13692 symbol. Just ignore it -- it will be caught by the
13693 regular reloc processing. */
13694 continue;
13695
13696 symval = (h->root.u.def.value
13697 + h->root.u.def.section->output_section->vma
13698 + h->root.u.def.section->output_offset);
13699 target_is_micromips_code_p = (!h->needs_plt
13700 && ELF_ST_IS_MICROMIPS (h->other));
13701 }
13702
13703
13704 /* For simplicity of coding, we are going to modify the
13705 section contents, the section relocs, and the BFD symbol
13706 table. We must tell the rest of the code not to free up this
13707 information. It would be possible to instead create a table
13708 of changes which have to be made, as is done in coff-mips.c;
13709 that would be more work, but would require less memory when
13710 the linker is run. */
13711
13712 /* Only 32-bit instructions relaxed. */
13713 if (irel->r_offset + 4 > sec->size)
13714 continue;
13715
d21911ea 13716 opcode = bfd_get_micromips_32 (abfd, ptr);
df58fc94
RS
13717
13718 /* This is the pc-relative distance from the instruction the
13719 relocation is applied to, to the symbol referred. */
13720 pcrval = (symval
13721 - (sec->output_section->vma + sec->output_offset)
13722 - irel->r_offset);
13723
13724 /* R_MICROMIPS_HI16 / LUI relaxation to nil, performing relaxation
13725 of corresponding R_MICROMIPS_LO16 to R_MICROMIPS_HI0_LO16 or
13726 R_MICROMIPS_PC23_S2. The R_MICROMIPS_PC23_S2 condition is
13727
13728 (symval % 4 == 0 && IS_BITSIZE (pcrval, 25))
13729
13730 where pcrval has first to be adjusted to apply against the LO16
13731 location (we make the adjustment later on, when we have figured
13732 out the offset). */
13733 if (r_type == R_MICROMIPS_HI16 && MATCH (opcode, lui_insn))
13734 {
80cab405 13735 bfd_boolean bzc = FALSE;
df58fc94
RS
13736 unsigned long nextopc;
13737 unsigned long reg;
13738 bfd_vma offset;
13739
13740 /* Give up if the previous reloc was a HI16 against this symbol
13741 too. */
13742 if (irel > internal_relocs
13743 && ELF32_R_TYPE (irel[-1].r_info) == R_MICROMIPS_HI16
13744 && ELF32_R_SYM (irel[-1].r_info) == r_symndx)
13745 continue;
13746
13747 /* Or if the next reloc is not a LO16 against this symbol. */
13748 if (irel + 1 >= irelend
13749 || ELF32_R_TYPE (irel[1].r_info) != R_MICROMIPS_LO16
13750 || ELF32_R_SYM (irel[1].r_info) != r_symndx)
13751 continue;
13752
13753 /* Or if the second next reloc is a LO16 against this symbol too. */
13754 if (irel + 2 >= irelend
13755 && ELF32_R_TYPE (irel[2].r_info) == R_MICROMIPS_LO16
13756 && ELF32_R_SYM (irel[2].r_info) == r_symndx)
13757 continue;
13758
80cab405
MR
13759 /* See if the LUI instruction *might* be in a branch delay slot.
13760 We check whether what looks like a 16-bit branch or jump is
13761 actually an immediate argument to a compact branch, and let
13762 it through if so. */
df58fc94 13763 if (irel->r_offset >= 2
2309ddf2 13764 && check_br16_dslot (abfd, ptr - 2)
df58fc94 13765 && !(irel->r_offset >= 4
80cab405
MR
13766 && (bzc = check_relocated_bzc (abfd,
13767 ptr - 4, irel->r_offset - 4,
13768 internal_relocs, irelend))))
df58fc94
RS
13769 continue;
13770 if (irel->r_offset >= 4
80cab405 13771 && !bzc
2309ddf2 13772 && check_br32_dslot (abfd, ptr - 4))
df58fc94
RS
13773 continue;
13774
13775 reg = OP32_SREG (opcode);
13776
13777 /* We only relax adjacent instructions or ones separated with
13778 a branch or jump that has a delay slot. The branch or jump
13779 must not fiddle with the register used to hold the address.
13780 Subtract 4 for the LUI itself. */
13781 offset = irel[1].r_offset - irel[0].r_offset;
13782 switch (offset - 4)
13783 {
13784 case 0:
13785 break;
13786 case 2:
2309ddf2 13787 if (check_br16 (abfd, ptr + 4, reg))
df58fc94
RS
13788 break;
13789 continue;
13790 case 4:
2309ddf2 13791 if (check_br32 (abfd, ptr + 4, reg))
df58fc94
RS
13792 break;
13793 continue;
13794 default:
13795 continue;
13796 }
13797
d21911ea 13798 nextopc = bfd_get_micromips_32 (abfd, contents + irel[1].r_offset);
df58fc94
RS
13799
13800 /* Give up unless the same register is used with both
13801 relocations. */
13802 if (OP32_SREG (nextopc) != reg)
13803 continue;
13804
13805 /* Now adjust pcrval, subtracting the offset to the LO16 reloc
13806 and rounding up to take masking of the two LSBs into account. */
13807 pcrval = ((pcrval - offset + 3) | 3) ^ 3;
13808
13809 /* R_MICROMIPS_LO16 relaxation to R_MICROMIPS_HI0_LO16. */
13810 if (IS_BITSIZE (symval, 16))
13811 {
13812 /* Fix the relocation's type. */
13813 irel[1].r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_HI0_LO16);
13814
13815 /* Instructions using R_MICROMIPS_LO16 have the base or
13816 source register in bits 20:16. This register becomes $0
13817 (zero) as the result of the R_MICROMIPS_HI16 being 0. */
13818 nextopc &= ~0x001f0000;
13819 bfd_put_16 (abfd, (nextopc >> 16) & 0xffff,
13820 contents + irel[1].r_offset);
13821 }
13822
13823 /* R_MICROMIPS_LO16 / ADDIU relaxation to R_MICROMIPS_PC23_S2.
13824 We add 4 to take LUI deletion into account while checking
13825 the PC-relative distance. */
13826 else if (symval % 4 == 0
13827 && IS_BITSIZE (pcrval + 4, 25)
13828 && MATCH (nextopc, addiu_insn)
13829 && OP32_TREG (nextopc) == OP32_SREG (nextopc)
13830 && OP16_VALID_REG (OP32_TREG (nextopc)))
13831 {
13832 /* Fix the relocation's type. */
13833 irel[1].r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC23_S2);
13834
13835 /* Replace ADDIU with the ADDIUPC version. */
13836 nextopc = (addiupc_insn.match
13837 | ADDIUPC_REG_FIELD (OP32_TREG (nextopc)));
13838
d21911ea
MR
13839 bfd_put_micromips_32 (abfd, nextopc,
13840 contents + irel[1].r_offset);
df58fc94
RS
13841 }
13842
13843 /* Can't do anything, give up, sigh... */
13844 else
13845 continue;
13846
13847 /* Fix the relocation's type. */
13848 irel->r_info = ELF32_R_INFO (r_symndx, R_MIPS_NONE);
13849
13850 /* Delete the LUI instruction: 4 bytes at irel->r_offset. */
13851 delcnt = 4;
13852 deloff = 0;
13853 }
13854
13855 /* Compact branch relaxation -- due to the multitude of macros
13856 employed by the compiler/assembler, compact branches are not
13857 always generated. Obviously, this can/will be fixed elsewhere,
13858 but there is no drawback in double checking it here. */
13859 else if (r_type == R_MICROMIPS_PC16_S1
13860 && irel->r_offset + 5 < sec->size
13861 && ((fndopc = find_match (opcode, bz_rs_insns_32)) >= 0
13862 || (fndopc = find_match (opcode, bz_rt_insns_32)) >= 0)
833794fc
MR
13863 && ((!insn32
13864 && (delcnt = MATCH (bfd_get_16 (abfd, ptr + 4),
13865 nop_insn_16) ? 2 : 0))
13866 || (irel->r_offset + 7 < sec->size
13867 && (delcnt = MATCH (bfd_get_micromips_32 (abfd,
13868 ptr + 4),
13869 nop_insn_32) ? 4 : 0))))
df58fc94
RS
13870 {
13871 unsigned long reg;
13872
13873 reg = OP32_SREG (opcode) ? OP32_SREG (opcode) : OP32_TREG (opcode);
13874
13875 /* Replace BEQZ/BNEZ with the compact version. */
13876 opcode = (bzc_insns_32[fndopc].match
13877 | BZC32_REG_FIELD (reg)
13878 | (opcode & 0xffff)); /* Addend value. */
13879
d21911ea 13880 bfd_put_micromips_32 (abfd, opcode, ptr);
df58fc94 13881
833794fc
MR
13882 /* Delete the delay slot NOP: two or four bytes from
13883 irel->offset + 4; delcnt has already been set above. */
df58fc94
RS
13884 deloff = 4;
13885 }
13886
13887 /* R_MICROMIPS_PC16_S1 relaxation to R_MICROMIPS_PC10_S1. We need
13888 to check the distance from the next instruction, so subtract 2. */
833794fc
MR
13889 else if (!insn32
13890 && r_type == R_MICROMIPS_PC16_S1
df58fc94
RS
13891 && IS_BITSIZE (pcrval - 2, 11)
13892 && find_match (opcode, b_insns_32) >= 0)
13893 {
13894 /* Fix the relocation's type. */
13895 irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC10_S1);
13896
a8685210 13897 /* Replace the 32-bit opcode with a 16-bit opcode. */
df58fc94
RS
13898 bfd_put_16 (abfd,
13899 (b_insn_16.match
13900 | (opcode & 0x3ff)), /* Addend value. */
2309ddf2 13901 ptr);
df58fc94
RS
13902
13903 /* Delete 2 bytes from irel->r_offset + 2. */
13904 delcnt = 2;
13905 deloff = 2;
13906 }
13907
13908 /* R_MICROMIPS_PC16_S1 relaxation to R_MICROMIPS_PC7_S1. We need
13909 to check the distance from the next instruction, so subtract 2. */
833794fc
MR
13910 else if (!insn32
13911 && r_type == R_MICROMIPS_PC16_S1
df58fc94
RS
13912 && IS_BITSIZE (pcrval - 2, 8)
13913 && (((fndopc = find_match (opcode, bz_rs_insns_32)) >= 0
13914 && OP16_VALID_REG (OP32_SREG (opcode)))
13915 || ((fndopc = find_match (opcode, bz_rt_insns_32)) >= 0
13916 && OP16_VALID_REG (OP32_TREG (opcode)))))
13917 {
13918 unsigned long reg;
13919
13920 reg = OP32_SREG (opcode) ? OP32_SREG (opcode) : OP32_TREG (opcode);
13921
13922 /* Fix the relocation's type. */
13923 irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC7_S1);
13924
a8685210 13925 /* Replace the 32-bit opcode with a 16-bit opcode. */
df58fc94
RS
13926 bfd_put_16 (abfd,
13927 (bz_insns_16[fndopc].match
13928 | BZ16_REG_FIELD (reg)
13929 | (opcode & 0x7f)), /* Addend value. */
2309ddf2 13930 ptr);
df58fc94
RS
13931
13932 /* Delete 2 bytes from irel->r_offset + 2. */
13933 delcnt = 2;
13934 deloff = 2;
13935 }
13936
13937 /* R_MICROMIPS_26_S1 -- JAL to JALS relaxation for microMIPS targets. */
833794fc
MR
13938 else if (!insn32
13939 && r_type == R_MICROMIPS_26_S1
df58fc94
RS
13940 && target_is_micromips_code_p
13941 && irel->r_offset + 7 < sec->size
13942 && MATCH (opcode, jal_insn_32_bd32))
13943 {
13944 unsigned long n32opc;
13945 bfd_boolean relaxed = FALSE;
13946
d21911ea 13947 n32opc = bfd_get_micromips_32 (abfd, ptr + 4);
df58fc94
RS
13948
13949 if (MATCH (n32opc, nop_insn_32))
13950 {
13951 /* Replace delay slot 32-bit NOP with a 16-bit NOP. */
2309ddf2 13952 bfd_put_16 (abfd, nop_insn_16.match, ptr + 4);
df58fc94
RS
13953
13954 relaxed = TRUE;
13955 }
13956 else if (find_match (n32opc, move_insns_32) >= 0)
13957 {
13958 /* Replace delay slot 32-bit MOVE with 16-bit MOVE. */
13959 bfd_put_16 (abfd,
13960 (move_insn_16.match
13961 | MOVE16_RD_FIELD (MOVE32_RD (n32opc))
13962 | MOVE16_RS_FIELD (MOVE32_RS (n32opc))),
2309ddf2 13963 ptr + 4);
df58fc94
RS
13964
13965 relaxed = TRUE;
13966 }
13967 /* Other 32-bit instructions relaxable to 16-bit
13968 instructions will be handled here later. */
13969
13970 if (relaxed)
13971 {
13972 /* JAL with 32-bit delay slot that is changed to a JALS
13973 with 16-bit delay slot. */
d21911ea 13974 bfd_put_micromips_32 (abfd, jal_insn_32_bd16.match, ptr);
df58fc94
RS
13975
13976 /* Delete 2 bytes from irel->r_offset + 6. */
13977 delcnt = 2;
13978 deloff = 6;
13979 }
13980 }
13981
13982 if (delcnt != 0)
13983 {
13984 /* Note that we've changed the relocs, section contents, etc. */
13985 elf_section_data (sec)->relocs = internal_relocs;
13986 elf_section_data (sec)->this_hdr.contents = contents;
13987 symtab_hdr->contents = (unsigned char *) isymbuf;
13988
13989 /* Delete bytes depending on the delcnt and deloff. */
13990 if (!mips_elf_relax_delete_bytes (abfd, sec,
13991 irel->r_offset + deloff, delcnt))
13992 goto error_return;
13993
13994 /* That will change things, so we should relax again.
13995 Note that this is not required, and it may be slow. */
13996 *again = TRUE;
13997 }
13998 }
13999
14000 if (isymbuf != NULL
14001 && symtab_hdr->contents != (unsigned char *) isymbuf)
14002 {
14003 if (! link_info->keep_memory)
14004 free (isymbuf);
14005 else
14006 {
14007 /* Cache the symbols for elf_link_input_bfd. */
14008 symtab_hdr->contents = (unsigned char *) isymbuf;
14009 }
14010 }
14011
14012 if (contents != NULL
14013 && elf_section_data (sec)->this_hdr.contents != contents)
14014 {
14015 if (! link_info->keep_memory)
14016 free (contents);
14017 else
14018 {
14019 /* Cache the section contents for elf_link_input_bfd. */
14020 elf_section_data (sec)->this_hdr.contents = contents;
14021 }
14022 }
14023
14024 if (internal_relocs != NULL
14025 && elf_section_data (sec)->relocs != internal_relocs)
14026 free (internal_relocs);
14027
14028 return TRUE;
14029
14030 error_return:
14031 if (isymbuf != NULL
14032 && symtab_hdr->contents != (unsigned char *) isymbuf)
14033 free (isymbuf);
14034 if (contents != NULL
14035 && elf_section_data (sec)->this_hdr.contents != contents)
14036 free (contents);
14037 if (internal_relocs != NULL
14038 && elf_section_data (sec)->relocs != internal_relocs)
14039 free (internal_relocs);
14040
14041 return FALSE;
14042}
14043\f
b49e97c9
TS
14044/* Create a MIPS ELF linker hash table. */
14045
14046struct bfd_link_hash_table *
9719ad41 14047_bfd_mips_elf_link_hash_table_create (bfd *abfd)
b49e97c9
TS
14048{
14049 struct mips_elf_link_hash_table *ret;
14050 bfd_size_type amt = sizeof (struct mips_elf_link_hash_table);
14051
7bf52ea2 14052 ret = bfd_zmalloc (amt);
9719ad41 14053 if (ret == NULL)
b49e97c9
TS
14054 return NULL;
14055
66eb6687
AM
14056 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
14057 mips_elf_link_hash_newfunc,
4dfe6ac6
NC
14058 sizeof (struct mips_elf_link_hash_entry),
14059 MIPS_ELF_DATA))
b49e97c9 14060 {
e2d34d7d 14061 free (ret);
b49e97c9
TS
14062 return NULL;
14063 }
1bbce132
MR
14064 ret->root.init_plt_refcount.plist = NULL;
14065 ret->root.init_plt_offset.plist = NULL;
b49e97c9 14066
b49e97c9
TS
14067 return &ret->root.root;
14068}
0a44bf69
RS
14069
14070/* Likewise, but indicate that the target is VxWorks. */
14071
14072struct bfd_link_hash_table *
14073_bfd_mips_vxworks_link_hash_table_create (bfd *abfd)
14074{
14075 struct bfd_link_hash_table *ret;
14076
14077 ret = _bfd_mips_elf_link_hash_table_create (abfd);
14078 if (ret)
14079 {
14080 struct mips_elf_link_hash_table *htab;
14081
14082 htab = (struct mips_elf_link_hash_table *) ret;
861fb55a
DJ
14083 htab->use_plts_and_copy_relocs = TRUE;
14084 htab->is_vxworks = TRUE;
0a44bf69
RS
14085 }
14086 return ret;
14087}
861fb55a
DJ
14088
14089/* A function that the linker calls if we are allowed to use PLTs
14090 and copy relocs. */
14091
14092void
14093_bfd_mips_elf_use_plts_and_copy_relocs (struct bfd_link_info *info)
14094{
14095 mips_elf_hash_table (info)->use_plts_and_copy_relocs = TRUE;
14096}
833794fc
MR
14097
14098/* A function that the linker calls to select between all or only
14099 32-bit microMIPS instructions. */
14100
14101void
14102_bfd_mips_elf_insn32 (struct bfd_link_info *info, bfd_boolean on)
14103{
14104 mips_elf_hash_table (info)->insn32 = on;
14105}
b49e97c9 14106\f
c97c330b
MF
14107/* Structure for saying that BFD machine EXTENSION extends BASE. */
14108
14109struct mips_mach_extension
14110{
14111 unsigned long extension, base;
14112};
14113
14114
14115/* An array describing how BFD machines relate to one another. The entries
14116 are ordered topologically with MIPS I extensions listed last. */
14117
14118static const struct mips_mach_extension mips_mach_extensions[] =
14119{
14120 /* MIPS64r2 extensions. */
14121 { bfd_mach_mips_octeon3, bfd_mach_mips_octeon2 },
14122 { bfd_mach_mips_octeon2, bfd_mach_mips_octeonp },
14123 { bfd_mach_mips_octeonp, bfd_mach_mips_octeon },
14124 { bfd_mach_mips_octeon, bfd_mach_mipsisa64r2 },
14125 { bfd_mach_mips_loongson_3a, bfd_mach_mipsisa64r2 },
14126
14127 /* MIPS64 extensions. */
14128 { bfd_mach_mipsisa64r2, bfd_mach_mipsisa64 },
14129 { bfd_mach_mips_sb1, bfd_mach_mipsisa64 },
14130 { bfd_mach_mips_xlr, bfd_mach_mipsisa64 },
14131
14132 /* MIPS V extensions. */
14133 { bfd_mach_mipsisa64, bfd_mach_mips5 },
14134
14135 /* R10000 extensions. */
14136 { bfd_mach_mips12000, bfd_mach_mips10000 },
14137 { bfd_mach_mips14000, bfd_mach_mips10000 },
14138 { bfd_mach_mips16000, bfd_mach_mips10000 },
14139
14140 /* R5000 extensions. Note: the vr5500 ISA is an extension of the core
14141 vr5400 ISA, but doesn't include the multimedia stuff. It seems
14142 better to allow vr5400 and vr5500 code to be merged anyway, since
14143 many libraries will just use the core ISA. Perhaps we could add
14144 some sort of ASE flag if this ever proves a problem. */
14145 { bfd_mach_mips5500, bfd_mach_mips5400 },
14146 { bfd_mach_mips5400, bfd_mach_mips5000 },
14147
14148 /* MIPS IV extensions. */
14149 { bfd_mach_mips5, bfd_mach_mips8000 },
14150 { bfd_mach_mips10000, bfd_mach_mips8000 },
14151 { bfd_mach_mips5000, bfd_mach_mips8000 },
14152 { bfd_mach_mips7000, bfd_mach_mips8000 },
14153 { bfd_mach_mips9000, bfd_mach_mips8000 },
14154
14155 /* VR4100 extensions. */
14156 { bfd_mach_mips4120, bfd_mach_mips4100 },
14157 { bfd_mach_mips4111, bfd_mach_mips4100 },
14158
14159 /* MIPS III extensions. */
14160 { bfd_mach_mips_loongson_2e, bfd_mach_mips4000 },
14161 { bfd_mach_mips_loongson_2f, bfd_mach_mips4000 },
14162 { bfd_mach_mips8000, bfd_mach_mips4000 },
14163 { bfd_mach_mips4650, bfd_mach_mips4000 },
14164 { bfd_mach_mips4600, bfd_mach_mips4000 },
14165 { bfd_mach_mips4400, bfd_mach_mips4000 },
14166 { bfd_mach_mips4300, bfd_mach_mips4000 },
14167 { bfd_mach_mips4100, bfd_mach_mips4000 },
14168 { bfd_mach_mips4010, bfd_mach_mips4000 },
14169 { bfd_mach_mips5900, bfd_mach_mips4000 },
14170
14171 /* MIPS32 extensions. */
14172 { bfd_mach_mipsisa32r2, bfd_mach_mipsisa32 },
14173
14174 /* MIPS II extensions. */
14175 { bfd_mach_mips4000, bfd_mach_mips6000 },
14176 { bfd_mach_mipsisa32, bfd_mach_mips6000 },
14177
14178 /* MIPS I extensions. */
14179 { bfd_mach_mips6000, bfd_mach_mips3000 },
14180 { bfd_mach_mips3900, bfd_mach_mips3000 }
14181};
14182
14183/* Return true if bfd machine EXTENSION is an extension of machine BASE. */
14184
14185static bfd_boolean
14186mips_mach_extends_p (unsigned long base, unsigned long extension)
14187{
14188 size_t i;
14189
14190 if (extension == base)
14191 return TRUE;
14192
14193 if (base == bfd_mach_mipsisa32
14194 && mips_mach_extends_p (bfd_mach_mipsisa64, extension))
14195 return TRUE;
14196
14197 if (base == bfd_mach_mipsisa32r2
14198 && mips_mach_extends_p (bfd_mach_mipsisa64r2, extension))
14199 return TRUE;
14200
14201 for (i = 0; i < ARRAY_SIZE (mips_mach_extensions); i++)
14202 if (extension == mips_mach_extensions[i].extension)
14203 {
14204 extension = mips_mach_extensions[i].base;
14205 if (extension == base)
14206 return TRUE;
14207 }
14208
14209 return FALSE;
14210}
14211
14212/* Return the BFD mach for each .MIPS.abiflags ISA Extension. */
14213
14214static unsigned long
14215bfd_mips_isa_ext_mach (unsigned int isa_ext)
14216{
14217 switch (isa_ext)
14218 {
14219 case AFL_EXT_3900: return bfd_mach_mips3900;
14220 case AFL_EXT_4010: return bfd_mach_mips4010;
14221 case AFL_EXT_4100: return bfd_mach_mips4100;
14222 case AFL_EXT_4111: return bfd_mach_mips4111;
14223 case AFL_EXT_4120: return bfd_mach_mips4120;
14224 case AFL_EXT_4650: return bfd_mach_mips4650;
14225 case AFL_EXT_5400: return bfd_mach_mips5400;
14226 case AFL_EXT_5500: return bfd_mach_mips5500;
14227 case AFL_EXT_5900: return bfd_mach_mips5900;
14228 case AFL_EXT_10000: return bfd_mach_mips10000;
14229 case AFL_EXT_LOONGSON_2E: return bfd_mach_mips_loongson_2e;
14230 case AFL_EXT_LOONGSON_2F: return bfd_mach_mips_loongson_2f;
14231 case AFL_EXT_LOONGSON_3A: return bfd_mach_mips_loongson_3a;
14232 case AFL_EXT_SB1: return bfd_mach_mips_sb1;
14233 case AFL_EXT_OCTEON: return bfd_mach_mips_octeon;
14234 case AFL_EXT_OCTEONP: return bfd_mach_mips_octeonp;
14235 case AFL_EXT_OCTEON2: return bfd_mach_mips_octeon2;
14236 case AFL_EXT_XLR: return bfd_mach_mips_xlr;
14237 default: return bfd_mach_mips3000;
14238 }
14239}
14240
351cdf24
MF
14241/* Return the .MIPS.abiflags value representing each ISA Extension. */
14242
14243unsigned int
14244bfd_mips_isa_ext (bfd *abfd)
14245{
14246 switch (bfd_get_mach (abfd))
14247 {
c97c330b
MF
14248 case bfd_mach_mips3900: return AFL_EXT_3900;
14249 case bfd_mach_mips4010: return AFL_EXT_4010;
14250 case bfd_mach_mips4100: return AFL_EXT_4100;
14251 case bfd_mach_mips4111: return AFL_EXT_4111;
14252 case bfd_mach_mips4120: return AFL_EXT_4120;
14253 case bfd_mach_mips4650: return AFL_EXT_4650;
14254 case bfd_mach_mips5400: return AFL_EXT_5400;
14255 case bfd_mach_mips5500: return AFL_EXT_5500;
14256 case bfd_mach_mips5900: return AFL_EXT_5900;
14257 case bfd_mach_mips10000: return AFL_EXT_10000;
14258 case bfd_mach_mips_loongson_2e: return AFL_EXT_LOONGSON_2E;
14259 case bfd_mach_mips_loongson_2f: return AFL_EXT_LOONGSON_2F;
14260 case bfd_mach_mips_loongson_3a: return AFL_EXT_LOONGSON_3A;
14261 case bfd_mach_mips_sb1: return AFL_EXT_SB1;
14262 case bfd_mach_mips_octeon: return AFL_EXT_OCTEON;
14263 case bfd_mach_mips_octeonp: return AFL_EXT_OCTEONP;
14264 case bfd_mach_mips_octeon3: return AFL_EXT_OCTEON3;
14265 case bfd_mach_mips_octeon2: return AFL_EXT_OCTEON2;
14266 case bfd_mach_mips_xlr: return AFL_EXT_XLR;
14267 default: return 0;
14268 }
14269}
14270
14271/* Encode ISA level and revision as a single value. */
14272#define LEVEL_REV(LEV,REV) ((LEV) << 3 | (REV))
14273
14274/* Decode a single value into level and revision. */
14275#define ISA_LEVEL(LEVREV) ((LEVREV) >> 3)
14276#define ISA_REV(LEVREV) ((LEVREV) & 0x7)
351cdf24
MF
14277
14278/* Update the isa_level, isa_rev, isa_ext fields of abiflags. */
14279
14280static void
14281update_mips_abiflags_isa (bfd *abfd, Elf_Internal_ABIFlags_v0 *abiflags)
14282{
c97c330b 14283 int new_isa = 0;
351cdf24
MF
14284 switch (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH)
14285 {
c97c330b
MF
14286 case E_MIPS_ARCH_1: new_isa = LEVEL_REV (1, 0); break;
14287 case E_MIPS_ARCH_2: new_isa = LEVEL_REV (2, 0); break;
14288 case E_MIPS_ARCH_3: new_isa = LEVEL_REV (3, 0); break;
14289 case E_MIPS_ARCH_4: new_isa = LEVEL_REV (4, 0); break;
14290 case E_MIPS_ARCH_5: new_isa = LEVEL_REV (5, 0); break;
14291 case E_MIPS_ARCH_32: new_isa = LEVEL_REV (32, 1); break;
14292 case E_MIPS_ARCH_32R2: new_isa = LEVEL_REV (32, 2); break;
14293 case E_MIPS_ARCH_32R6: new_isa = LEVEL_REV (32, 6); break;
14294 case E_MIPS_ARCH_64: new_isa = LEVEL_REV (64, 1); break;
14295 case E_MIPS_ARCH_64R2: new_isa = LEVEL_REV (64, 2); break;
14296 case E_MIPS_ARCH_64R6: new_isa = LEVEL_REV (64, 6); break;
351cdf24 14297 default:
4eca0228 14298 _bfd_error_handler
351cdf24
MF
14299 (_("%B: Unknown architecture %s"),
14300 abfd, bfd_printable_name (abfd));
14301 }
14302
c97c330b
MF
14303 if (new_isa > LEVEL_REV (abiflags->isa_level, abiflags->isa_rev))
14304 {
14305 abiflags->isa_level = ISA_LEVEL (new_isa);
14306 abiflags->isa_rev = ISA_REV (new_isa);
14307 }
14308
14309 /* Update the isa_ext if ABFD describes a further extension. */
14310 if (mips_mach_extends_p (bfd_mips_isa_ext_mach (abiflags->isa_ext),
14311 bfd_get_mach (abfd)))
14312 abiflags->isa_ext = bfd_mips_isa_ext (abfd);
351cdf24
MF
14313}
14314
14315/* Return true if the given ELF header flags describe a 32-bit binary. */
14316
14317static bfd_boolean
14318mips_32bit_flags_p (flagword flags)
14319{
14320 return ((flags & EF_MIPS_32BITMODE) != 0
14321 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_O32
14322 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32
14323 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1
14324 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2
14325 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32
7361da2c
AB
14326 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2
14327 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R6);
351cdf24
MF
14328}
14329
14330/* Infer the content of the ABI flags based on the elf header. */
14331
14332static void
14333infer_mips_abiflags (bfd *abfd, Elf_Internal_ABIFlags_v0* abiflags)
14334{
14335 obj_attribute *in_attr;
14336
14337 memset (abiflags, 0, sizeof (Elf_Internal_ABIFlags_v0));
14338 update_mips_abiflags_isa (abfd, abiflags);
14339
14340 if (mips_32bit_flags_p (elf_elfheader (abfd)->e_flags))
14341 abiflags->gpr_size = AFL_REG_32;
14342 else
14343 abiflags->gpr_size = AFL_REG_64;
14344
14345 abiflags->cpr1_size = AFL_REG_NONE;
14346
14347 in_attr = elf_known_obj_attributes (abfd)[OBJ_ATTR_GNU];
14348 abiflags->fp_abi = in_attr[Tag_GNU_MIPS_ABI_FP].i;
14349
14350 if (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_SINGLE
14351 || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_XX
14352 || (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_DOUBLE
14353 && abiflags->gpr_size == AFL_REG_32))
14354 abiflags->cpr1_size = AFL_REG_32;
14355 else if (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_DOUBLE
14356 || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_64
14357 || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_64A)
14358 abiflags->cpr1_size = AFL_REG_64;
14359
14360 abiflags->cpr2_size = AFL_REG_NONE;
14361
14362 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
14363 abiflags->ases |= AFL_ASE_MDMX;
14364 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
14365 abiflags->ases |= AFL_ASE_MIPS16;
14366 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
14367 abiflags->ases |= AFL_ASE_MICROMIPS;
14368
14369 if (abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_ANY
14370 && abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_SOFT
14371 && abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_64A
14372 && abiflags->isa_level >= 32
14373 && abiflags->isa_ext != AFL_EXT_LOONGSON_3A)
14374 abiflags->flags1 |= AFL_FLAGS1_ODDSPREG;
14375}
14376
b49e97c9
TS
14377/* We need to use a special link routine to handle the .reginfo and
14378 the .mdebug sections. We need to merge all instances of these
14379 sections together, not write them all out sequentially. */
14380
b34976b6 14381bfd_boolean
9719ad41 14382_bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
b49e97c9 14383{
b49e97c9
TS
14384 asection *o;
14385 struct bfd_link_order *p;
14386 asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
351cdf24 14387 asection *rtproc_sec, *abiflags_sec;
b49e97c9
TS
14388 Elf32_RegInfo reginfo;
14389 struct ecoff_debug_info debug;
861fb55a 14390 struct mips_htab_traverse_info hti;
7a2a6943
NC
14391 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
14392 const struct ecoff_debug_swap *swap = bed->elf_backend_ecoff_debug_swap;
b49e97c9 14393 HDRR *symhdr = &debug.symbolic_header;
9719ad41 14394 void *mdebug_handle = NULL;
b49e97c9
TS
14395 asection *s;
14396 EXTR esym;
14397 unsigned int i;
14398 bfd_size_type amt;
0a44bf69 14399 struct mips_elf_link_hash_table *htab;
b49e97c9
TS
14400
14401 static const char * const secname[] =
14402 {
14403 ".text", ".init", ".fini", ".data",
14404 ".rodata", ".sdata", ".sbss", ".bss"
14405 };
14406 static const int sc[] =
14407 {
14408 scText, scInit, scFini, scData,
14409 scRData, scSData, scSBss, scBss
14410 };
14411
d4596a51
RS
14412 /* Sort the dynamic symbols so that those with GOT entries come after
14413 those without. */
0a44bf69 14414 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
14415 BFD_ASSERT (htab != NULL);
14416
d4596a51
RS
14417 if (!mips_elf_sort_hash_table (abfd, info))
14418 return FALSE;
b49e97c9 14419
861fb55a
DJ
14420 /* Create any scheduled LA25 stubs. */
14421 hti.info = info;
14422 hti.output_bfd = abfd;
14423 hti.error = FALSE;
14424 htab_traverse (htab->la25_stubs, mips_elf_create_la25_stub, &hti);
14425 if (hti.error)
14426 return FALSE;
14427
b49e97c9
TS
14428 /* Get a value for the GP register. */
14429 if (elf_gp (abfd) == 0)
14430 {
14431 struct bfd_link_hash_entry *h;
14432
b34976b6 14433 h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
9719ad41 14434 if (h != NULL && h->type == bfd_link_hash_defined)
b49e97c9
TS
14435 elf_gp (abfd) = (h->u.def.value
14436 + h->u.def.section->output_section->vma
14437 + h->u.def.section->output_offset);
0a44bf69
RS
14438 else if (htab->is_vxworks
14439 && (h = bfd_link_hash_lookup (info->hash,
14440 "_GLOBAL_OFFSET_TABLE_",
14441 FALSE, FALSE, TRUE))
14442 && h->type == bfd_link_hash_defined)
14443 elf_gp (abfd) = (h->u.def.section->output_section->vma
14444 + h->u.def.section->output_offset
14445 + h->u.def.value);
0e1862bb 14446 else if (bfd_link_relocatable (info))
b49e97c9
TS
14447 {
14448 bfd_vma lo = MINUS_ONE;
14449
14450 /* Find the GP-relative section with the lowest offset. */
9719ad41 14451 for (o = abfd->sections; o != NULL; o = o->next)
b49e97c9
TS
14452 if (o->vma < lo
14453 && (elf_section_data (o)->this_hdr.sh_flags & SHF_MIPS_GPREL))
14454 lo = o->vma;
14455
14456 /* And calculate GP relative to that. */
0a44bf69 14457 elf_gp (abfd) = lo + ELF_MIPS_GP_OFFSET (info);
b49e97c9
TS
14458 }
14459 else
14460 {
14461 /* If the relocate_section function needs to do a reloc
14462 involving the GP value, it should make a reloc_dangerous
14463 callback to warn that GP is not defined. */
14464 }
14465 }
14466
14467 /* Go through the sections and collect the .reginfo and .mdebug
14468 information. */
351cdf24 14469 abiflags_sec = NULL;
b49e97c9
TS
14470 reginfo_sec = NULL;
14471 mdebug_sec = NULL;
14472 gptab_data_sec = NULL;
14473 gptab_bss_sec = NULL;
9719ad41 14474 for (o = abfd->sections; o != NULL; o = o->next)
b49e97c9 14475 {
351cdf24
MF
14476 if (strcmp (o->name, ".MIPS.abiflags") == 0)
14477 {
14478 /* We have found the .MIPS.abiflags section in the output file.
14479 Look through all the link_orders comprising it and remove them.
14480 The data is merged in _bfd_mips_elf_merge_private_bfd_data. */
14481 for (p = o->map_head.link_order; p != NULL; p = p->next)
14482 {
14483 asection *input_section;
14484
14485 if (p->type != bfd_indirect_link_order)
14486 {
14487 if (p->type == bfd_data_link_order)
14488 continue;
14489 abort ();
14490 }
14491
14492 input_section = p->u.indirect.section;
14493
14494 /* Hack: reset the SEC_HAS_CONTENTS flag so that
14495 elf_link_input_bfd ignores this section. */
14496 input_section->flags &= ~SEC_HAS_CONTENTS;
14497 }
14498
14499 /* Size has been set in _bfd_mips_elf_always_size_sections. */
14500 BFD_ASSERT(o->size == sizeof (Elf_External_ABIFlags_v0));
14501
14502 /* Skip this section later on (I don't think this currently
14503 matters, but someday it might). */
14504 o->map_head.link_order = NULL;
14505
14506 abiflags_sec = o;
14507 }
14508
b49e97c9
TS
14509 if (strcmp (o->name, ".reginfo") == 0)
14510 {
14511 memset (&reginfo, 0, sizeof reginfo);
14512
14513 /* We have found the .reginfo section in the output file.
14514 Look through all the link_orders comprising it and merge
14515 the information together. */
8423293d 14516 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
14517 {
14518 asection *input_section;
14519 bfd *input_bfd;
14520 Elf32_External_RegInfo ext;
14521 Elf32_RegInfo sub;
14522
14523 if (p->type != bfd_indirect_link_order)
14524 {
14525 if (p->type == bfd_data_link_order)
14526 continue;
14527 abort ();
14528 }
14529
14530 input_section = p->u.indirect.section;
14531 input_bfd = input_section->owner;
14532
b49e97c9 14533 if (! bfd_get_section_contents (input_bfd, input_section,
9719ad41 14534 &ext, 0, sizeof ext))
b34976b6 14535 return FALSE;
b49e97c9
TS
14536
14537 bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub);
14538
14539 reginfo.ri_gprmask |= sub.ri_gprmask;
14540 reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
14541 reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
14542 reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
14543 reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
14544
14545 /* ri_gp_value is set by the function
14546 mips_elf32_section_processing when the section is
14547 finally written out. */
14548
14549 /* Hack: reset the SEC_HAS_CONTENTS flag so that
14550 elf_link_input_bfd ignores this section. */
14551 input_section->flags &= ~SEC_HAS_CONTENTS;
14552 }
14553
14554 /* Size has been set in _bfd_mips_elf_always_size_sections. */
eea6121a 14555 BFD_ASSERT(o->size == sizeof (Elf32_External_RegInfo));
b49e97c9
TS
14556
14557 /* Skip this section later on (I don't think this currently
14558 matters, but someday it might). */
8423293d 14559 o->map_head.link_order = NULL;
b49e97c9
TS
14560
14561 reginfo_sec = o;
14562 }
14563
14564 if (strcmp (o->name, ".mdebug") == 0)
14565 {
14566 struct extsym_info einfo;
14567 bfd_vma last;
14568
14569 /* We have found the .mdebug section in the output file.
14570 Look through all the link_orders comprising it and merge
14571 the information together. */
14572 symhdr->magic = swap->sym_magic;
14573 /* FIXME: What should the version stamp be? */
14574 symhdr->vstamp = 0;
14575 symhdr->ilineMax = 0;
14576 symhdr->cbLine = 0;
14577 symhdr->idnMax = 0;
14578 symhdr->ipdMax = 0;
14579 symhdr->isymMax = 0;
14580 symhdr->ioptMax = 0;
14581 symhdr->iauxMax = 0;
14582 symhdr->issMax = 0;
14583 symhdr->issExtMax = 0;
14584 symhdr->ifdMax = 0;
14585 symhdr->crfd = 0;
14586 symhdr->iextMax = 0;
14587
14588 /* We accumulate the debugging information itself in the
14589 debug_info structure. */
14590 debug.line = NULL;
14591 debug.external_dnr = NULL;
14592 debug.external_pdr = NULL;
14593 debug.external_sym = NULL;
14594 debug.external_opt = NULL;
14595 debug.external_aux = NULL;
14596 debug.ss = NULL;
14597 debug.ssext = debug.ssext_end = NULL;
14598 debug.external_fdr = NULL;
14599 debug.external_rfd = NULL;
14600 debug.external_ext = debug.external_ext_end = NULL;
14601
14602 mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
9719ad41 14603 if (mdebug_handle == NULL)
b34976b6 14604 return FALSE;
b49e97c9
TS
14605
14606 esym.jmptbl = 0;
14607 esym.cobol_main = 0;
14608 esym.weakext = 0;
14609 esym.reserved = 0;
14610 esym.ifd = ifdNil;
14611 esym.asym.iss = issNil;
14612 esym.asym.st = stLocal;
14613 esym.asym.reserved = 0;
14614 esym.asym.index = indexNil;
14615 last = 0;
14616 for (i = 0; i < sizeof (secname) / sizeof (secname[0]); i++)
14617 {
14618 esym.asym.sc = sc[i];
14619 s = bfd_get_section_by_name (abfd, secname[i]);
14620 if (s != NULL)
14621 {
14622 esym.asym.value = s->vma;
eea6121a 14623 last = s->vma + s->size;
b49e97c9
TS
14624 }
14625 else
14626 esym.asym.value = last;
14627 if (!bfd_ecoff_debug_one_external (abfd, &debug, swap,
14628 secname[i], &esym))
b34976b6 14629 return FALSE;
b49e97c9
TS
14630 }
14631
8423293d 14632 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
14633 {
14634 asection *input_section;
14635 bfd *input_bfd;
14636 const struct ecoff_debug_swap *input_swap;
14637 struct ecoff_debug_info input_debug;
14638 char *eraw_src;
14639 char *eraw_end;
14640
14641 if (p->type != bfd_indirect_link_order)
14642 {
14643 if (p->type == bfd_data_link_order)
14644 continue;
14645 abort ();
14646 }
14647
14648 input_section = p->u.indirect.section;
14649 input_bfd = input_section->owner;
14650
d5eaccd7 14651 if (!is_mips_elf (input_bfd))
b49e97c9
TS
14652 {
14653 /* I don't know what a non MIPS ELF bfd would be
14654 doing with a .mdebug section, but I don't really
14655 want to deal with it. */
14656 continue;
14657 }
14658
14659 input_swap = (get_elf_backend_data (input_bfd)
14660 ->elf_backend_ecoff_debug_swap);
14661
eea6121a 14662 BFD_ASSERT (p->size == input_section->size);
b49e97c9
TS
14663
14664 /* The ECOFF linking code expects that we have already
14665 read in the debugging information and set up an
14666 ecoff_debug_info structure, so we do that now. */
14667 if (! _bfd_mips_elf_read_ecoff_info (input_bfd, input_section,
14668 &input_debug))
b34976b6 14669 return FALSE;
b49e97c9
TS
14670
14671 if (! (bfd_ecoff_debug_accumulate
14672 (mdebug_handle, abfd, &debug, swap, input_bfd,
14673 &input_debug, input_swap, info)))
b34976b6 14674 return FALSE;
b49e97c9
TS
14675
14676 /* Loop through the external symbols. For each one with
14677 interesting information, try to find the symbol in
14678 the linker global hash table and save the information
14679 for the output external symbols. */
14680 eraw_src = input_debug.external_ext;
14681 eraw_end = (eraw_src
14682 + (input_debug.symbolic_header.iextMax
14683 * input_swap->external_ext_size));
14684 for (;
14685 eraw_src < eraw_end;
14686 eraw_src += input_swap->external_ext_size)
14687 {
14688 EXTR ext;
14689 const char *name;
14690 struct mips_elf_link_hash_entry *h;
14691
9719ad41 14692 (*input_swap->swap_ext_in) (input_bfd, eraw_src, &ext);
b49e97c9
TS
14693 if (ext.asym.sc == scNil
14694 || ext.asym.sc == scUndefined
14695 || ext.asym.sc == scSUndefined)
14696 continue;
14697
14698 name = input_debug.ssext + ext.asym.iss;
14699 h = mips_elf_link_hash_lookup (mips_elf_hash_table (info),
b34976b6 14700 name, FALSE, FALSE, TRUE);
b49e97c9
TS
14701 if (h == NULL || h->esym.ifd != -2)
14702 continue;
14703
14704 if (ext.ifd != -1)
14705 {
14706 BFD_ASSERT (ext.ifd
14707 < input_debug.symbolic_header.ifdMax);
14708 ext.ifd = input_debug.ifdmap[ext.ifd];
14709 }
14710
14711 h->esym = ext;
14712 }
14713
14714 /* Free up the information we just read. */
14715 free (input_debug.line);
14716 free (input_debug.external_dnr);
14717 free (input_debug.external_pdr);
14718 free (input_debug.external_sym);
14719 free (input_debug.external_opt);
14720 free (input_debug.external_aux);
14721 free (input_debug.ss);
14722 free (input_debug.ssext);
14723 free (input_debug.external_fdr);
14724 free (input_debug.external_rfd);
14725 free (input_debug.external_ext);
14726
14727 /* Hack: reset the SEC_HAS_CONTENTS flag so that
14728 elf_link_input_bfd ignores this section. */
14729 input_section->flags &= ~SEC_HAS_CONTENTS;
14730 }
14731
0e1862bb 14732 if (SGI_COMPAT (abfd) && bfd_link_pic (info))
b49e97c9
TS
14733 {
14734 /* Create .rtproc section. */
87e0a731 14735 rtproc_sec = bfd_get_linker_section (abfd, ".rtproc");
b49e97c9
TS
14736 if (rtproc_sec == NULL)
14737 {
14738 flagword flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
14739 | SEC_LINKER_CREATED | SEC_READONLY);
14740
87e0a731
AM
14741 rtproc_sec = bfd_make_section_anyway_with_flags (abfd,
14742 ".rtproc",
14743 flags);
b49e97c9 14744 if (rtproc_sec == NULL
b49e97c9 14745 || ! bfd_set_section_alignment (abfd, rtproc_sec, 4))
b34976b6 14746 return FALSE;
b49e97c9
TS
14747 }
14748
14749 if (! mips_elf_create_procedure_table (mdebug_handle, abfd,
14750 info, rtproc_sec,
14751 &debug))
b34976b6 14752 return FALSE;
b49e97c9
TS
14753 }
14754
14755 /* Build the external symbol information. */
14756 einfo.abfd = abfd;
14757 einfo.info = info;
14758 einfo.debug = &debug;
14759 einfo.swap = swap;
b34976b6 14760 einfo.failed = FALSE;
b49e97c9 14761 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
9719ad41 14762 mips_elf_output_extsym, &einfo);
b49e97c9 14763 if (einfo.failed)
b34976b6 14764 return FALSE;
b49e97c9
TS
14765
14766 /* Set the size of the .mdebug section. */
eea6121a 14767 o->size = bfd_ecoff_debug_size (abfd, &debug, swap);
b49e97c9
TS
14768
14769 /* Skip this section later on (I don't think this currently
14770 matters, but someday it might). */
8423293d 14771 o->map_head.link_order = NULL;
b49e97c9
TS
14772
14773 mdebug_sec = o;
14774 }
14775
0112cd26 14776 if (CONST_STRNEQ (o->name, ".gptab."))
b49e97c9
TS
14777 {
14778 const char *subname;
14779 unsigned int c;
14780 Elf32_gptab *tab;
14781 Elf32_External_gptab *ext_tab;
14782 unsigned int j;
14783
14784 /* The .gptab.sdata and .gptab.sbss sections hold
14785 information describing how the small data area would
14786 change depending upon the -G switch. These sections
14787 not used in executables files. */
0e1862bb 14788 if (! bfd_link_relocatable (info))
b49e97c9 14789 {
8423293d 14790 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
14791 {
14792 asection *input_section;
14793
14794 if (p->type != bfd_indirect_link_order)
14795 {
14796 if (p->type == bfd_data_link_order)
14797 continue;
14798 abort ();
14799 }
14800
14801 input_section = p->u.indirect.section;
14802
14803 /* Hack: reset the SEC_HAS_CONTENTS flag so that
14804 elf_link_input_bfd ignores this section. */
14805 input_section->flags &= ~SEC_HAS_CONTENTS;
14806 }
14807
14808 /* Skip this section later on (I don't think this
14809 currently matters, but someday it might). */
8423293d 14810 o->map_head.link_order = NULL;
b49e97c9
TS
14811
14812 /* Really remove the section. */
5daa8fe7 14813 bfd_section_list_remove (abfd, o);
b49e97c9
TS
14814 --abfd->section_count;
14815
14816 continue;
14817 }
14818
14819 /* There is one gptab for initialized data, and one for
14820 uninitialized data. */
14821 if (strcmp (o->name, ".gptab.sdata") == 0)
14822 gptab_data_sec = o;
14823 else if (strcmp (o->name, ".gptab.sbss") == 0)
14824 gptab_bss_sec = o;
14825 else
14826 {
4eca0228 14827 _bfd_error_handler
b49e97c9
TS
14828 (_("%s: illegal section name `%s'"),
14829 bfd_get_filename (abfd), o->name);
14830 bfd_set_error (bfd_error_nonrepresentable_section);
b34976b6 14831 return FALSE;
b49e97c9
TS
14832 }
14833
14834 /* The linker script always combines .gptab.data and
14835 .gptab.sdata into .gptab.sdata, and likewise for
14836 .gptab.bss and .gptab.sbss. It is possible that there is
14837 no .sdata or .sbss section in the output file, in which
14838 case we must change the name of the output section. */
14839 subname = o->name + sizeof ".gptab" - 1;
14840 if (bfd_get_section_by_name (abfd, subname) == NULL)
14841 {
14842 if (o == gptab_data_sec)
14843 o->name = ".gptab.data";
14844 else
14845 o->name = ".gptab.bss";
14846 subname = o->name + sizeof ".gptab" - 1;
14847 BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
14848 }
14849
14850 /* Set up the first entry. */
14851 c = 1;
14852 amt = c * sizeof (Elf32_gptab);
9719ad41 14853 tab = bfd_malloc (amt);
b49e97c9 14854 if (tab == NULL)
b34976b6 14855 return FALSE;
b49e97c9
TS
14856 tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
14857 tab[0].gt_header.gt_unused = 0;
14858
14859 /* Combine the input sections. */
8423293d 14860 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
14861 {
14862 asection *input_section;
14863 bfd *input_bfd;
14864 bfd_size_type size;
14865 unsigned long last;
14866 bfd_size_type gpentry;
14867
14868 if (p->type != bfd_indirect_link_order)
14869 {
14870 if (p->type == bfd_data_link_order)
14871 continue;
14872 abort ();
14873 }
14874
14875 input_section = p->u.indirect.section;
14876 input_bfd = input_section->owner;
14877
14878 /* Combine the gptab entries for this input section one
14879 by one. We know that the input gptab entries are
14880 sorted by ascending -G value. */
eea6121a 14881 size = input_section->size;
b49e97c9
TS
14882 last = 0;
14883 for (gpentry = sizeof (Elf32_External_gptab);
14884 gpentry < size;
14885 gpentry += sizeof (Elf32_External_gptab))
14886 {
14887 Elf32_External_gptab ext_gptab;
14888 Elf32_gptab int_gptab;
14889 unsigned long val;
14890 unsigned long add;
b34976b6 14891 bfd_boolean exact;
b49e97c9
TS
14892 unsigned int look;
14893
14894 if (! (bfd_get_section_contents
9719ad41
RS
14895 (input_bfd, input_section, &ext_gptab, gpentry,
14896 sizeof (Elf32_External_gptab))))
b49e97c9
TS
14897 {
14898 free (tab);
b34976b6 14899 return FALSE;
b49e97c9
TS
14900 }
14901
14902 bfd_mips_elf32_swap_gptab_in (input_bfd, &ext_gptab,
14903 &int_gptab);
14904 val = int_gptab.gt_entry.gt_g_value;
14905 add = int_gptab.gt_entry.gt_bytes - last;
14906
b34976b6 14907 exact = FALSE;
b49e97c9
TS
14908 for (look = 1; look < c; look++)
14909 {
14910 if (tab[look].gt_entry.gt_g_value >= val)
14911 tab[look].gt_entry.gt_bytes += add;
14912
14913 if (tab[look].gt_entry.gt_g_value == val)
b34976b6 14914 exact = TRUE;
b49e97c9
TS
14915 }
14916
14917 if (! exact)
14918 {
14919 Elf32_gptab *new_tab;
14920 unsigned int max;
14921
14922 /* We need a new table entry. */
14923 amt = (bfd_size_type) (c + 1) * sizeof (Elf32_gptab);
9719ad41 14924 new_tab = bfd_realloc (tab, amt);
b49e97c9
TS
14925 if (new_tab == NULL)
14926 {
14927 free (tab);
b34976b6 14928 return FALSE;
b49e97c9
TS
14929 }
14930 tab = new_tab;
14931 tab[c].gt_entry.gt_g_value = val;
14932 tab[c].gt_entry.gt_bytes = add;
14933
14934 /* Merge in the size for the next smallest -G
14935 value, since that will be implied by this new
14936 value. */
14937 max = 0;
14938 for (look = 1; look < c; look++)
14939 {
14940 if (tab[look].gt_entry.gt_g_value < val
14941 && (max == 0
14942 || (tab[look].gt_entry.gt_g_value
14943 > tab[max].gt_entry.gt_g_value)))
14944 max = look;
14945 }
14946 if (max != 0)
14947 tab[c].gt_entry.gt_bytes +=
14948 tab[max].gt_entry.gt_bytes;
14949
14950 ++c;
14951 }
14952
14953 last = int_gptab.gt_entry.gt_bytes;
14954 }
14955
14956 /* Hack: reset the SEC_HAS_CONTENTS flag so that
14957 elf_link_input_bfd ignores this section. */
14958 input_section->flags &= ~SEC_HAS_CONTENTS;
14959 }
14960
14961 /* The table must be sorted by -G value. */
14962 if (c > 2)
14963 qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
14964
14965 /* Swap out the table. */
14966 amt = (bfd_size_type) c * sizeof (Elf32_External_gptab);
9719ad41 14967 ext_tab = bfd_alloc (abfd, amt);
b49e97c9
TS
14968 if (ext_tab == NULL)
14969 {
14970 free (tab);
b34976b6 14971 return FALSE;
b49e97c9
TS
14972 }
14973
14974 for (j = 0; j < c; j++)
14975 bfd_mips_elf32_swap_gptab_out (abfd, tab + j, ext_tab + j);
14976 free (tab);
14977
eea6121a 14978 o->size = c * sizeof (Elf32_External_gptab);
b49e97c9
TS
14979 o->contents = (bfd_byte *) ext_tab;
14980
14981 /* Skip this section later on (I don't think this currently
14982 matters, but someday it might). */
8423293d 14983 o->map_head.link_order = NULL;
b49e97c9
TS
14984 }
14985 }
14986
14987 /* Invoke the regular ELF backend linker to do all the work. */
c152c796 14988 if (!bfd_elf_final_link (abfd, info))
b34976b6 14989 return FALSE;
b49e97c9
TS
14990
14991 /* Now write out the computed sections. */
14992
351cdf24
MF
14993 if (abiflags_sec != NULL)
14994 {
14995 Elf_External_ABIFlags_v0 ext;
14996 Elf_Internal_ABIFlags_v0 *abiflags;
14997
14998 abiflags = &mips_elf_tdata (abfd)->abiflags;
14999
15000 /* Set up the abiflags if no valid input sections were found. */
15001 if (!mips_elf_tdata (abfd)->abiflags_valid)
15002 {
15003 infer_mips_abiflags (abfd, abiflags);
15004 mips_elf_tdata (abfd)->abiflags_valid = TRUE;
15005 }
15006 bfd_mips_elf_swap_abiflags_v0_out (abfd, abiflags, &ext);
15007 if (! bfd_set_section_contents (abfd, abiflags_sec, &ext, 0, sizeof ext))
15008 return FALSE;
15009 }
15010
9719ad41 15011 if (reginfo_sec != NULL)
b49e97c9
TS
15012 {
15013 Elf32_External_RegInfo ext;
15014
15015 bfd_mips_elf32_swap_reginfo_out (abfd, &reginfo, &ext);
9719ad41 15016 if (! bfd_set_section_contents (abfd, reginfo_sec, &ext, 0, sizeof ext))
b34976b6 15017 return FALSE;
b49e97c9
TS
15018 }
15019
9719ad41 15020 if (mdebug_sec != NULL)
b49e97c9
TS
15021 {
15022 BFD_ASSERT (abfd->output_has_begun);
15023 if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
15024 swap, info,
15025 mdebug_sec->filepos))
b34976b6 15026 return FALSE;
b49e97c9
TS
15027
15028 bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
15029 }
15030
9719ad41 15031 if (gptab_data_sec != NULL)
b49e97c9
TS
15032 {
15033 if (! bfd_set_section_contents (abfd, gptab_data_sec,
15034 gptab_data_sec->contents,
eea6121a 15035 0, gptab_data_sec->size))
b34976b6 15036 return FALSE;
b49e97c9
TS
15037 }
15038
9719ad41 15039 if (gptab_bss_sec != NULL)
b49e97c9
TS
15040 {
15041 if (! bfd_set_section_contents (abfd, gptab_bss_sec,
15042 gptab_bss_sec->contents,
eea6121a 15043 0, gptab_bss_sec->size))
b34976b6 15044 return FALSE;
b49e97c9
TS
15045 }
15046
15047 if (SGI_COMPAT (abfd))
15048 {
15049 rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
15050 if (rtproc_sec != NULL)
15051 {
15052 if (! bfd_set_section_contents (abfd, rtproc_sec,
15053 rtproc_sec->contents,
eea6121a 15054 0, rtproc_sec->size))
b34976b6 15055 return FALSE;
b49e97c9
TS
15056 }
15057 }
15058
b34976b6 15059 return TRUE;
b49e97c9
TS
15060}
15061\f
b2e9744f
MR
15062/* Merge object file header flags from IBFD into OBFD. Raise an error
15063 if there are conflicting settings. */
15064
15065static bfd_boolean
15066mips_elf_merge_obj_e_flags (bfd *ibfd, bfd *obfd)
15067{
15068 struct mips_elf_obj_tdata *out_tdata = mips_elf_tdata (obfd);
15069 flagword old_flags;
15070 flagword new_flags;
15071 bfd_boolean ok;
15072
15073 new_flags = elf_elfheader (ibfd)->e_flags;
15074 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_NOREORDER;
15075 old_flags = elf_elfheader (obfd)->e_flags;
15076
15077 /* Check flag compatibility. */
15078
15079 new_flags &= ~EF_MIPS_NOREORDER;
15080 old_flags &= ~EF_MIPS_NOREORDER;
15081
15082 /* Some IRIX 6 BSD-compatibility objects have this bit set. It
15083 doesn't seem to matter. */
15084 new_flags &= ~EF_MIPS_XGOT;
15085 old_flags &= ~EF_MIPS_XGOT;
15086
15087 /* MIPSpro generates ucode info in n64 objects. Again, we should
15088 just be able to ignore this. */
15089 new_flags &= ~EF_MIPS_UCODE;
15090 old_flags &= ~EF_MIPS_UCODE;
15091
15092 /* DSOs should only be linked with CPIC code. */
15093 if ((ibfd->flags & DYNAMIC) != 0)
15094 new_flags |= EF_MIPS_PIC | EF_MIPS_CPIC;
15095
15096 if (new_flags == old_flags)
15097 return TRUE;
15098
15099 ok = TRUE;
15100
15101 if (((new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0)
15102 != ((old_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0))
15103 {
4eca0228 15104 _bfd_error_handler
b2e9744f
MR
15105 (_("%B: warning: linking abicalls files with non-abicalls files"),
15106 ibfd);
15107 ok = TRUE;
15108 }
15109
15110 if (new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC))
15111 elf_elfheader (obfd)->e_flags |= EF_MIPS_CPIC;
15112 if (! (new_flags & EF_MIPS_PIC))
15113 elf_elfheader (obfd)->e_flags &= ~EF_MIPS_PIC;
15114
15115 new_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
15116 old_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
15117
15118 /* Compare the ISAs. */
15119 if (mips_32bit_flags_p (old_flags) != mips_32bit_flags_p (new_flags))
15120 {
4eca0228 15121 _bfd_error_handler
b2e9744f
MR
15122 (_("%B: linking 32-bit code with 64-bit code"),
15123 ibfd);
15124 ok = FALSE;
15125 }
15126 else if (!mips_mach_extends_p (bfd_get_mach (ibfd), bfd_get_mach (obfd)))
15127 {
15128 /* OBFD's ISA isn't the same as, or an extension of, IBFD's. */
15129 if (mips_mach_extends_p (bfd_get_mach (obfd), bfd_get_mach (ibfd)))
15130 {
15131 /* Copy the architecture info from IBFD to OBFD. Also copy
15132 the 32-bit flag (if set) so that we continue to recognise
15133 OBFD as a 32-bit binary. */
15134 bfd_set_arch_info (obfd, bfd_get_arch_info (ibfd));
15135 elf_elfheader (obfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
15136 elf_elfheader (obfd)->e_flags
15137 |= new_flags & (EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15138
15139 /* Update the ABI flags isa_level, isa_rev, isa_ext fields. */
15140 update_mips_abiflags_isa (obfd, &out_tdata->abiflags);
15141
15142 /* Copy across the ABI flags if OBFD doesn't use them
15143 and if that was what caused us to treat IBFD as 32-bit. */
15144 if ((old_flags & EF_MIPS_ABI) == 0
15145 && mips_32bit_flags_p (new_flags)
15146 && !mips_32bit_flags_p (new_flags & ~EF_MIPS_ABI))
15147 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ABI;
15148 }
15149 else
15150 {
15151 /* The ISAs aren't compatible. */
4eca0228 15152 _bfd_error_handler
b2e9744f
MR
15153 (_("%B: linking %s module with previous %s modules"),
15154 ibfd,
15155 bfd_printable_name (ibfd),
15156 bfd_printable_name (obfd));
15157 ok = FALSE;
15158 }
15159 }
15160
15161 new_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15162 old_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15163
15164 /* Compare ABIs. The 64-bit ABI does not use EF_MIPS_ABI. But, it
15165 does set EI_CLASS differently from any 32-bit ABI. */
15166 if ((new_flags & EF_MIPS_ABI) != (old_flags & EF_MIPS_ABI)
15167 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
15168 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
15169 {
15170 /* Only error if both are set (to different values). */
15171 if (((new_flags & EF_MIPS_ABI) && (old_flags & EF_MIPS_ABI))
15172 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
15173 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
15174 {
4eca0228 15175 _bfd_error_handler
b2e9744f
MR
15176 (_("%B: ABI mismatch: linking %s module with previous %s modules"),
15177 ibfd,
15178 elf_mips_abi_name (ibfd),
15179 elf_mips_abi_name (obfd));
15180 ok = FALSE;
15181 }
15182 new_flags &= ~EF_MIPS_ABI;
15183 old_flags &= ~EF_MIPS_ABI;
15184 }
15185
15186 /* Compare ASEs. Forbid linking MIPS16 and microMIPS ASE modules together
15187 and allow arbitrary mixing of the remaining ASEs (retain the union). */
15188 if ((new_flags & EF_MIPS_ARCH_ASE) != (old_flags & EF_MIPS_ARCH_ASE))
15189 {
15190 int old_micro = old_flags & EF_MIPS_ARCH_ASE_MICROMIPS;
15191 int new_micro = new_flags & EF_MIPS_ARCH_ASE_MICROMIPS;
15192 int old_m16 = old_flags & EF_MIPS_ARCH_ASE_M16;
15193 int new_m16 = new_flags & EF_MIPS_ARCH_ASE_M16;
15194 int micro_mis = old_m16 && new_micro;
15195 int m16_mis = old_micro && new_m16;
15196
15197 if (m16_mis || micro_mis)
15198 {
4eca0228 15199 _bfd_error_handler
b2e9744f
MR
15200 (_("%B: ASE mismatch: linking %s module with previous %s modules"),
15201 ibfd,
15202 m16_mis ? "MIPS16" : "microMIPS",
15203 m16_mis ? "microMIPS" : "MIPS16");
15204 ok = FALSE;
15205 }
15206
15207 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ARCH_ASE;
15208
15209 new_flags &= ~ EF_MIPS_ARCH_ASE;
15210 old_flags &= ~ EF_MIPS_ARCH_ASE;
15211 }
15212
15213 /* Compare NaN encodings. */
15214 if ((new_flags & EF_MIPS_NAN2008) != (old_flags & EF_MIPS_NAN2008))
15215 {
15216 _bfd_error_handler (_("%B: linking %s module with previous %s modules"),
15217 ibfd,
15218 (new_flags & EF_MIPS_NAN2008
15219 ? "-mnan=2008" : "-mnan=legacy"),
15220 (old_flags & EF_MIPS_NAN2008
15221 ? "-mnan=2008" : "-mnan=legacy"));
15222 ok = FALSE;
15223 new_flags &= ~EF_MIPS_NAN2008;
15224 old_flags &= ~EF_MIPS_NAN2008;
15225 }
15226
15227 /* Compare FP64 state. */
15228 if ((new_flags & EF_MIPS_FP64) != (old_flags & EF_MIPS_FP64))
15229 {
15230 _bfd_error_handler (_("%B: linking %s module with previous %s modules"),
15231 ibfd,
15232 (new_flags & EF_MIPS_FP64
15233 ? "-mfp64" : "-mfp32"),
15234 (old_flags & EF_MIPS_FP64
15235 ? "-mfp64" : "-mfp32"));
15236 ok = FALSE;
15237 new_flags &= ~EF_MIPS_FP64;
15238 old_flags &= ~EF_MIPS_FP64;
15239 }
15240
15241 /* Warn about any other mismatches */
15242 if (new_flags != old_flags)
15243 {
4eca0228 15244 _bfd_error_handler
b2e9744f
MR
15245 (_("%B: uses different e_flags (0x%lx) fields than previous modules "
15246 "(0x%lx)"),
15247 ibfd, (unsigned long) new_flags,
15248 (unsigned long) old_flags);
15249 ok = FALSE;
15250 }
15251
15252 return ok;
15253}
15254
2cf19d5c
JM
15255/* Merge object attributes from IBFD into OBFD. Raise an error if
15256 there are conflicting attributes. */
15257static bfd_boolean
15258mips_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
15259{
15260 obj_attribute *in_attr;
15261 obj_attribute *out_attr;
6ae68ba3 15262 bfd *abi_fp_bfd;
b60bf9be 15263 bfd *abi_msa_bfd;
6ae68ba3
MR
15264
15265 abi_fp_bfd = mips_elf_tdata (obfd)->abi_fp_bfd;
15266 in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
d929bc19 15267 if (!abi_fp_bfd && in_attr[Tag_GNU_MIPS_ABI_FP].i != Val_GNU_MIPS_ABI_FP_ANY)
6ae68ba3 15268 mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
2cf19d5c 15269
b60bf9be
CF
15270 abi_msa_bfd = mips_elf_tdata (obfd)->abi_msa_bfd;
15271 if (!abi_msa_bfd
15272 && in_attr[Tag_GNU_MIPS_ABI_MSA].i != Val_GNU_MIPS_ABI_MSA_ANY)
15273 mips_elf_tdata (obfd)->abi_msa_bfd = ibfd;
15274
2cf19d5c
JM
15275 if (!elf_known_obj_attributes_proc (obfd)[0].i)
15276 {
15277 /* This is the first object. Copy the attributes. */
15278 _bfd_elf_copy_obj_attributes (ibfd, obfd);
15279
15280 /* Use the Tag_null value to indicate the attributes have been
15281 initialized. */
15282 elf_known_obj_attributes_proc (obfd)[0].i = 1;
15283
15284 return TRUE;
15285 }
15286
15287 /* Check for conflicting Tag_GNU_MIPS_ABI_FP attributes and merge
15288 non-conflicting ones. */
2cf19d5c
JM
15289 out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
15290 if (in_attr[Tag_GNU_MIPS_ABI_FP].i != out_attr[Tag_GNU_MIPS_ABI_FP].i)
15291 {
757a636f 15292 int out_fp, in_fp;
6ae68ba3 15293
757a636f
RS
15294 out_fp = out_attr[Tag_GNU_MIPS_ABI_FP].i;
15295 in_fp = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15296 out_attr[Tag_GNU_MIPS_ABI_FP].type = 1;
15297 if (out_fp == Val_GNU_MIPS_ABI_FP_ANY)
15298 out_attr[Tag_GNU_MIPS_ABI_FP].i = in_fp;
351cdf24
MF
15299 else if (out_fp == Val_GNU_MIPS_ABI_FP_XX
15300 && (in_fp == Val_GNU_MIPS_ABI_FP_DOUBLE
15301 || in_fp == Val_GNU_MIPS_ABI_FP_64
15302 || in_fp == Val_GNU_MIPS_ABI_FP_64A))
15303 {
15304 mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
15305 out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15306 }
15307 else if (in_fp == Val_GNU_MIPS_ABI_FP_XX
15308 && (out_fp == Val_GNU_MIPS_ABI_FP_DOUBLE
15309 || out_fp == Val_GNU_MIPS_ABI_FP_64
15310 || out_fp == Val_GNU_MIPS_ABI_FP_64A))
15311 /* Keep the current setting. */;
15312 else if (out_fp == Val_GNU_MIPS_ABI_FP_64A
15313 && in_fp == Val_GNU_MIPS_ABI_FP_64)
15314 {
15315 mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
15316 out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15317 }
15318 else if (in_fp == Val_GNU_MIPS_ABI_FP_64A
15319 && out_fp == Val_GNU_MIPS_ABI_FP_64)
15320 /* Keep the current setting. */;
757a636f
RS
15321 else if (in_fp != Val_GNU_MIPS_ABI_FP_ANY)
15322 {
15323 const char *out_string, *in_string;
6ae68ba3 15324
757a636f
RS
15325 out_string = _bfd_mips_fp_abi_string (out_fp);
15326 in_string = _bfd_mips_fp_abi_string (in_fp);
15327 /* First warn about cases involving unrecognised ABIs. */
15328 if (!out_string && !in_string)
15329 _bfd_error_handler
15330 (_("Warning: %B uses unknown floating point ABI %d "
15331 "(set by %B), %B uses unknown floating point ABI %d"),
15332 obfd, abi_fp_bfd, ibfd, out_fp, in_fp);
15333 else if (!out_string)
15334 _bfd_error_handler
15335 (_("Warning: %B uses unknown floating point ABI %d "
15336 "(set by %B), %B uses %s"),
15337 obfd, abi_fp_bfd, ibfd, out_fp, in_string);
15338 else if (!in_string)
15339 _bfd_error_handler
15340 (_("Warning: %B uses %s (set by %B), "
15341 "%B uses unknown floating point ABI %d"),
15342 obfd, abi_fp_bfd, ibfd, out_string, in_fp);
15343 else
15344 {
15345 /* If one of the bfds is soft-float, the other must be
15346 hard-float. The exact choice of hard-float ABI isn't
15347 really relevant to the error message. */
15348 if (in_fp == Val_GNU_MIPS_ABI_FP_SOFT)
15349 out_string = "-mhard-float";
15350 else if (out_fp == Val_GNU_MIPS_ABI_FP_SOFT)
15351 in_string = "-mhard-float";
15352 _bfd_error_handler
15353 (_("Warning: %B uses %s (set by %B), %B uses %s"),
15354 obfd, abi_fp_bfd, ibfd, out_string, in_string);
15355 }
15356 }
2cf19d5c
JM
15357 }
15358
b60bf9be
CF
15359 /* Check for conflicting Tag_GNU_MIPS_ABI_MSA attributes and merge
15360 non-conflicting ones. */
15361 if (in_attr[Tag_GNU_MIPS_ABI_MSA].i != out_attr[Tag_GNU_MIPS_ABI_MSA].i)
15362 {
15363 out_attr[Tag_GNU_MIPS_ABI_MSA].type = 1;
15364 if (out_attr[Tag_GNU_MIPS_ABI_MSA].i == Val_GNU_MIPS_ABI_MSA_ANY)
15365 out_attr[Tag_GNU_MIPS_ABI_MSA].i = in_attr[Tag_GNU_MIPS_ABI_MSA].i;
15366 else if (in_attr[Tag_GNU_MIPS_ABI_MSA].i != Val_GNU_MIPS_ABI_MSA_ANY)
15367 switch (out_attr[Tag_GNU_MIPS_ABI_MSA].i)
15368 {
15369 case Val_GNU_MIPS_ABI_MSA_128:
15370 _bfd_error_handler
15371 (_("Warning: %B uses %s (set by %B), "
15372 "%B uses unknown MSA ABI %d"),
15373 obfd, abi_msa_bfd, ibfd,
15374 "-mmsa", in_attr[Tag_GNU_MIPS_ABI_MSA].i);
15375 break;
15376
15377 default:
15378 switch (in_attr[Tag_GNU_MIPS_ABI_MSA].i)
15379 {
15380 case Val_GNU_MIPS_ABI_MSA_128:
15381 _bfd_error_handler
15382 (_("Warning: %B uses unknown MSA ABI %d "
15383 "(set by %B), %B uses %s"),
15384 obfd, abi_msa_bfd, ibfd,
15385 out_attr[Tag_GNU_MIPS_ABI_MSA].i, "-mmsa");
15386 break;
15387
15388 default:
15389 _bfd_error_handler
15390 (_("Warning: %B uses unknown MSA ABI %d "
15391 "(set by %B), %B uses unknown MSA ABI %d"),
15392 obfd, abi_msa_bfd, ibfd,
15393 out_attr[Tag_GNU_MIPS_ABI_MSA].i,
15394 in_attr[Tag_GNU_MIPS_ABI_MSA].i);
15395 break;
15396 }
15397 }
15398 }
15399
2cf19d5c 15400 /* Merge Tag_compatibility attributes and any common GNU ones. */
43d223b5 15401 return _bfd_elf_merge_object_attributes (ibfd, obfd);
2cf19d5c
JM
15402}
15403
a3dc0a7f
MR
15404/* Merge object ABI flags from IBFD into OBFD. Raise an error if
15405 there are conflicting settings. */
15406
15407static bfd_boolean
15408mips_elf_merge_obj_abiflags (bfd *ibfd, bfd *obfd)
15409{
15410 obj_attribute *out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
15411 struct mips_elf_obj_tdata *out_tdata = mips_elf_tdata (obfd);
15412 struct mips_elf_obj_tdata *in_tdata = mips_elf_tdata (ibfd);
15413
15414 /* Update the output abiflags fp_abi using the computed fp_abi. */
15415 out_tdata->abiflags.fp_abi = out_attr[Tag_GNU_MIPS_ABI_FP].i;
15416
15417#define max(a, b) ((a) > (b) ? (a) : (b))
15418 /* Merge abiflags. */
15419 out_tdata->abiflags.isa_level = max (out_tdata->abiflags.isa_level,
15420 in_tdata->abiflags.isa_level);
15421 out_tdata->abiflags.isa_rev = max (out_tdata->abiflags.isa_rev,
15422 in_tdata->abiflags.isa_rev);
15423 out_tdata->abiflags.gpr_size = max (out_tdata->abiflags.gpr_size,
15424 in_tdata->abiflags.gpr_size);
15425 out_tdata->abiflags.cpr1_size = max (out_tdata->abiflags.cpr1_size,
15426 in_tdata->abiflags.cpr1_size);
15427 out_tdata->abiflags.cpr2_size = max (out_tdata->abiflags.cpr2_size,
15428 in_tdata->abiflags.cpr2_size);
15429#undef max
15430 out_tdata->abiflags.ases |= in_tdata->abiflags.ases;
15431 out_tdata->abiflags.flags1 |= in_tdata->abiflags.flags1;
15432
15433 return TRUE;
15434}
15435
b49e97c9
TS
15436/* Merge backend specific data from an object file to the output
15437 object file when linking. */
15438
b34976b6 15439bfd_boolean
9719ad41 15440_bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
b49e97c9 15441{
cf8502c1
MR
15442 struct mips_elf_obj_tdata *out_tdata;
15443 struct mips_elf_obj_tdata *in_tdata;
b34976b6 15444 bfd_boolean null_input_bfd = TRUE;
b49e97c9 15445 asection *sec;
d537eeb5 15446 bfd_boolean ok;
b49e97c9 15447
58238693 15448 /* Check if we have the same endianness. */
82e51918 15449 if (! _bfd_generic_verify_endian_match (ibfd, obfd))
aa701218 15450 {
4eca0228 15451 _bfd_error_handler
d003868e
AM
15452 (_("%B: endianness incompatible with that of the selected emulation"),
15453 ibfd);
aa701218
AO
15454 return FALSE;
15455 }
b49e97c9 15456
d5eaccd7 15457 if (!is_mips_elf (ibfd) || !is_mips_elf (obfd))
b34976b6 15458 return TRUE;
b49e97c9 15459
cf8502c1
MR
15460 in_tdata = mips_elf_tdata (ibfd);
15461 out_tdata = mips_elf_tdata (obfd);
15462
aa701218
AO
15463 if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
15464 {
4eca0228 15465 _bfd_error_handler
d003868e
AM
15466 (_("%B: ABI is incompatible with that of the selected emulation"),
15467 ibfd);
aa701218
AO
15468 return FALSE;
15469 }
15470
23ba6f18
MR
15471 /* Check to see if the input BFD actually contains any sections. If not,
15472 then it has no attributes, and its flags may not have been initialized
15473 either, but it cannot actually cause any incompatibility. */
351cdf24
MF
15474 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
15475 {
15476 /* Ignore synthetic sections and empty .text, .data and .bss sections
15477 which are automatically generated by gas. Also ignore fake
15478 (s)common sections, since merely defining a common symbol does
15479 not affect compatibility. */
15480 if ((sec->flags & SEC_IS_COMMON) == 0
15481 && strcmp (sec->name, ".reginfo")
15482 && strcmp (sec->name, ".mdebug")
15483 && (sec->size != 0
15484 || (strcmp (sec->name, ".text")
15485 && strcmp (sec->name, ".data")
15486 && strcmp (sec->name, ".bss"))))
15487 {
15488 null_input_bfd = FALSE;
15489 break;
15490 }
15491 }
15492 if (null_input_bfd)
15493 return TRUE;
15494
28d45e28 15495 /* Populate abiflags using existing information. */
23ba6f18
MR
15496 if (in_tdata->abiflags_valid)
15497 {
15498 obj_attribute *in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
28d45e28
MR
15499 Elf_Internal_ABIFlags_v0 in_abiflags;
15500 Elf_Internal_ABIFlags_v0 abiflags;
15501
15502 /* Set up the FP ABI attribute from the abiflags if it is not already
15503 set. */
23ba6f18
MR
15504 if (in_attr[Tag_GNU_MIPS_ABI_FP].i == Val_GNU_MIPS_ABI_FP_ANY)
15505 in_attr[Tag_GNU_MIPS_ABI_FP].i = in_tdata->abiflags.fp_abi;
23ba6f18 15506
351cdf24 15507 infer_mips_abiflags (ibfd, &abiflags);
cf8502c1 15508 in_abiflags = in_tdata->abiflags;
351cdf24
MF
15509
15510 /* It is not possible to infer the correct ISA revision
15511 for R3 or R5 so drop down to R2 for the checks. */
15512 if (in_abiflags.isa_rev == 3 || in_abiflags.isa_rev == 5)
15513 in_abiflags.isa_rev = 2;
15514
c97c330b
MF
15515 if (LEVEL_REV (in_abiflags.isa_level, in_abiflags.isa_rev)
15516 < LEVEL_REV (abiflags.isa_level, abiflags.isa_rev))
4eca0228 15517 _bfd_error_handler
351cdf24
MF
15518 (_("%B: warning: Inconsistent ISA between e_flags and "
15519 ".MIPS.abiflags"), ibfd);
15520 if (abiflags.fp_abi != Val_GNU_MIPS_ABI_FP_ANY
15521 && in_abiflags.fp_abi != abiflags.fp_abi)
4eca0228 15522 _bfd_error_handler
dcb1c796 15523 (_("%B: warning: Inconsistent FP ABI between .gnu.attributes and "
351cdf24
MF
15524 ".MIPS.abiflags"), ibfd);
15525 if ((in_abiflags.ases & abiflags.ases) != abiflags.ases)
4eca0228 15526 _bfd_error_handler
351cdf24
MF
15527 (_("%B: warning: Inconsistent ASEs between e_flags and "
15528 ".MIPS.abiflags"), ibfd);
c97c330b
MF
15529 /* The isa_ext is allowed to be an extension of what can be inferred
15530 from e_flags. */
15531 if (!mips_mach_extends_p (bfd_mips_isa_ext_mach (abiflags.isa_ext),
15532 bfd_mips_isa_ext_mach (in_abiflags.isa_ext)))
4eca0228 15533 _bfd_error_handler
351cdf24
MF
15534 (_("%B: warning: Inconsistent ISA extensions between e_flags and "
15535 ".MIPS.abiflags"), ibfd);
15536 if (in_abiflags.flags2 != 0)
4eca0228 15537 _bfd_error_handler
351cdf24
MF
15538 (_("%B: warning: Unexpected flag in the flags2 field of "
15539 ".MIPS.abiflags (0x%lx)"), ibfd,
15540 (unsigned long) in_abiflags.flags2);
15541 }
28d45e28
MR
15542 else
15543 {
15544 infer_mips_abiflags (ibfd, &in_tdata->abiflags);
15545 in_tdata->abiflags_valid = TRUE;
15546 }
15547
cf8502c1 15548 if (!out_tdata->abiflags_valid)
351cdf24
MF
15549 {
15550 /* Copy input abiflags if output abiflags are not already valid. */
cf8502c1
MR
15551 out_tdata->abiflags = in_tdata->abiflags;
15552 out_tdata->abiflags_valid = TRUE;
351cdf24 15553 }
b49e97c9
TS
15554
15555 if (! elf_flags_init (obfd))
15556 {
b34976b6 15557 elf_flags_init (obfd) = TRUE;
351cdf24 15558 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
b49e97c9
TS
15559 elf_elfheader (obfd)->e_ident[EI_CLASS]
15560 = elf_elfheader (ibfd)->e_ident[EI_CLASS];
15561
15562 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
2907b861 15563 && (bfd_get_arch_info (obfd)->the_default
68ffbac6 15564 || mips_mach_extends_p (bfd_get_mach (obfd),
2907b861 15565 bfd_get_mach (ibfd))))
b49e97c9
TS
15566 {
15567 if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
15568 bfd_get_mach (ibfd)))
b34976b6 15569 return FALSE;
351cdf24
MF
15570
15571 /* Update the ABI flags isa_level, isa_rev and isa_ext fields. */
cf8502c1 15572 update_mips_abiflags_isa (obfd, &out_tdata->abiflags);
b49e97c9
TS
15573 }
15574
d537eeb5 15575 ok = TRUE;
b49e97c9 15576 }
d537eeb5
MR
15577 else
15578 ok = mips_elf_merge_obj_e_flags (ibfd, obfd);
15579
15580 ok = mips_elf_merge_obj_attributes (ibfd, obfd) && ok;
b49e97c9 15581
a3dc0a7f 15582 ok = mips_elf_merge_obj_abiflags (ibfd, obfd) && ok;
351cdf24 15583
d537eeb5 15584 if (!ok)
b49e97c9
TS
15585 {
15586 bfd_set_error (bfd_error_bad_value);
b34976b6 15587 return FALSE;
b49e97c9
TS
15588 }
15589
b34976b6 15590 return TRUE;
b49e97c9
TS
15591}
15592
15593/* Function to keep MIPS specific file flags like as EF_MIPS_PIC. */
15594
b34976b6 15595bfd_boolean
9719ad41 15596_bfd_mips_elf_set_private_flags (bfd *abfd, flagword flags)
b49e97c9
TS
15597{
15598 BFD_ASSERT (!elf_flags_init (abfd)
15599 || elf_elfheader (abfd)->e_flags == flags);
15600
15601 elf_elfheader (abfd)->e_flags = flags;
b34976b6
AM
15602 elf_flags_init (abfd) = TRUE;
15603 return TRUE;
b49e97c9
TS
15604}
15605
ad9563d6
CM
15606char *
15607_bfd_mips_elf_get_target_dtag (bfd_vma dtag)
15608{
15609 switch (dtag)
15610 {
15611 default: return "";
15612 case DT_MIPS_RLD_VERSION:
15613 return "MIPS_RLD_VERSION";
15614 case DT_MIPS_TIME_STAMP:
15615 return "MIPS_TIME_STAMP";
15616 case DT_MIPS_ICHECKSUM:
15617 return "MIPS_ICHECKSUM";
15618 case DT_MIPS_IVERSION:
15619 return "MIPS_IVERSION";
15620 case DT_MIPS_FLAGS:
15621 return "MIPS_FLAGS";
15622 case DT_MIPS_BASE_ADDRESS:
15623 return "MIPS_BASE_ADDRESS";
15624 case DT_MIPS_MSYM:
15625 return "MIPS_MSYM";
15626 case DT_MIPS_CONFLICT:
15627 return "MIPS_CONFLICT";
15628 case DT_MIPS_LIBLIST:
15629 return "MIPS_LIBLIST";
15630 case DT_MIPS_LOCAL_GOTNO:
15631 return "MIPS_LOCAL_GOTNO";
15632 case DT_MIPS_CONFLICTNO:
15633 return "MIPS_CONFLICTNO";
15634 case DT_MIPS_LIBLISTNO:
15635 return "MIPS_LIBLISTNO";
15636 case DT_MIPS_SYMTABNO:
15637 return "MIPS_SYMTABNO";
15638 case DT_MIPS_UNREFEXTNO:
15639 return "MIPS_UNREFEXTNO";
15640 case DT_MIPS_GOTSYM:
15641 return "MIPS_GOTSYM";
15642 case DT_MIPS_HIPAGENO:
15643 return "MIPS_HIPAGENO";
15644 case DT_MIPS_RLD_MAP:
15645 return "MIPS_RLD_MAP";
a5499fa4
MF
15646 case DT_MIPS_RLD_MAP_REL:
15647 return "MIPS_RLD_MAP_REL";
ad9563d6
CM
15648 case DT_MIPS_DELTA_CLASS:
15649 return "MIPS_DELTA_CLASS";
15650 case DT_MIPS_DELTA_CLASS_NO:
15651 return "MIPS_DELTA_CLASS_NO";
15652 case DT_MIPS_DELTA_INSTANCE:
15653 return "MIPS_DELTA_INSTANCE";
15654 case DT_MIPS_DELTA_INSTANCE_NO:
15655 return "MIPS_DELTA_INSTANCE_NO";
15656 case DT_MIPS_DELTA_RELOC:
15657 return "MIPS_DELTA_RELOC";
15658 case DT_MIPS_DELTA_RELOC_NO:
15659 return "MIPS_DELTA_RELOC_NO";
15660 case DT_MIPS_DELTA_SYM:
15661 return "MIPS_DELTA_SYM";
15662 case DT_MIPS_DELTA_SYM_NO:
15663 return "MIPS_DELTA_SYM_NO";
15664 case DT_MIPS_DELTA_CLASSSYM:
15665 return "MIPS_DELTA_CLASSSYM";
15666 case DT_MIPS_DELTA_CLASSSYM_NO:
15667 return "MIPS_DELTA_CLASSSYM_NO";
15668 case DT_MIPS_CXX_FLAGS:
15669 return "MIPS_CXX_FLAGS";
15670 case DT_MIPS_PIXIE_INIT:
15671 return "MIPS_PIXIE_INIT";
15672 case DT_MIPS_SYMBOL_LIB:
15673 return "MIPS_SYMBOL_LIB";
15674 case DT_MIPS_LOCALPAGE_GOTIDX:
15675 return "MIPS_LOCALPAGE_GOTIDX";
15676 case DT_MIPS_LOCAL_GOTIDX:
15677 return "MIPS_LOCAL_GOTIDX";
15678 case DT_MIPS_HIDDEN_GOTIDX:
15679 return "MIPS_HIDDEN_GOTIDX";
15680 case DT_MIPS_PROTECTED_GOTIDX:
15681 return "MIPS_PROTECTED_GOT_IDX";
15682 case DT_MIPS_OPTIONS:
15683 return "MIPS_OPTIONS";
15684 case DT_MIPS_INTERFACE:
15685 return "MIPS_INTERFACE";
15686 case DT_MIPS_DYNSTR_ALIGN:
15687 return "DT_MIPS_DYNSTR_ALIGN";
15688 case DT_MIPS_INTERFACE_SIZE:
15689 return "DT_MIPS_INTERFACE_SIZE";
15690 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR:
15691 return "DT_MIPS_RLD_TEXT_RESOLVE_ADDR";
15692 case DT_MIPS_PERF_SUFFIX:
15693 return "DT_MIPS_PERF_SUFFIX";
15694 case DT_MIPS_COMPACT_SIZE:
15695 return "DT_MIPS_COMPACT_SIZE";
15696 case DT_MIPS_GP_VALUE:
15697 return "DT_MIPS_GP_VALUE";
15698 case DT_MIPS_AUX_DYNAMIC:
15699 return "DT_MIPS_AUX_DYNAMIC";
861fb55a
DJ
15700 case DT_MIPS_PLTGOT:
15701 return "DT_MIPS_PLTGOT";
15702 case DT_MIPS_RWPLT:
15703 return "DT_MIPS_RWPLT";
ad9563d6
CM
15704 }
15705}
15706
757a636f
RS
15707/* Return the meaning of Tag_GNU_MIPS_ABI_FP value FP, or null if
15708 not known. */
15709
15710const char *
15711_bfd_mips_fp_abi_string (int fp)
15712{
15713 switch (fp)
15714 {
15715 /* These strings aren't translated because they're simply
15716 option lists. */
15717 case Val_GNU_MIPS_ABI_FP_DOUBLE:
15718 return "-mdouble-float";
15719
15720 case Val_GNU_MIPS_ABI_FP_SINGLE:
15721 return "-msingle-float";
15722
15723 case Val_GNU_MIPS_ABI_FP_SOFT:
15724 return "-msoft-float";
15725
351cdf24
MF
15726 case Val_GNU_MIPS_ABI_FP_OLD_64:
15727 return _("-mips32r2 -mfp64 (12 callee-saved)");
15728
15729 case Val_GNU_MIPS_ABI_FP_XX:
15730 return "-mfpxx";
15731
757a636f 15732 case Val_GNU_MIPS_ABI_FP_64:
351cdf24
MF
15733 return "-mgp32 -mfp64";
15734
15735 case Val_GNU_MIPS_ABI_FP_64A:
15736 return "-mgp32 -mfp64 -mno-odd-spreg";
757a636f
RS
15737
15738 default:
15739 return 0;
15740 }
15741}
15742
351cdf24
MF
15743static void
15744print_mips_ases (FILE *file, unsigned int mask)
15745{
15746 if (mask & AFL_ASE_DSP)
15747 fputs ("\n\tDSP ASE", file);
15748 if (mask & AFL_ASE_DSPR2)
15749 fputs ("\n\tDSP R2 ASE", file);
8f4f9071
MF
15750 if (mask & AFL_ASE_DSPR3)
15751 fputs ("\n\tDSP R3 ASE", file);
351cdf24
MF
15752 if (mask & AFL_ASE_EVA)
15753 fputs ("\n\tEnhanced VA Scheme", file);
15754 if (mask & AFL_ASE_MCU)
15755 fputs ("\n\tMCU (MicroController) ASE", file);
15756 if (mask & AFL_ASE_MDMX)
15757 fputs ("\n\tMDMX ASE", file);
15758 if (mask & AFL_ASE_MIPS3D)
15759 fputs ("\n\tMIPS-3D ASE", file);
15760 if (mask & AFL_ASE_MT)
15761 fputs ("\n\tMT ASE", file);
15762 if (mask & AFL_ASE_SMARTMIPS)
15763 fputs ("\n\tSmartMIPS ASE", file);
15764 if (mask & AFL_ASE_VIRT)
15765 fputs ("\n\tVZ ASE", file);
15766 if (mask & AFL_ASE_MSA)
15767 fputs ("\n\tMSA ASE", file);
15768 if (mask & AFL_ASE_MIPS16)
15769 fputs ("\n\tMIPS16 ASE", file);
15770 if (mask & AFL_ASE_MICROMIPS)
15771 fputs ("\n\tMICROMIPS ASE", file);
15772 if (mask & AFL_ASE_XPA)
15773 fputs ("\n\tXPA ASE", file);
15774 if (mask == 0)
15775 fprintf (file, "\n\t%s", _("None"));
00ac7aa0
MF
15776 else if ((mask & ~AFL_ASE_MASK) != 0)
15777 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
351cdf24
MF
15778}
15779
15780static void
15781print_mips_isa_ext (FILE *file, unsigned int isa_ext)
15782{
15783 switch (isa_ext)
15784 {
15785 case 0:
15786 fputs (_("None"), file);
15787 break;
15788 case AFL_EXT_XLR:
15789 fputs ("RMI XLR", file);
15790 break;
2c629856
N
15791 case AFL_EXT_OCTEON3:
15792 fputs ("Cavium Networks Octeon3", file);
15793 break;
351cdf24
MF
15794 case AFL_EXT_OCTEON2:
15795 fputs ("Cavium Networks Octeon2", file);
15796 break;
15797 case AFL_EXT_OCTEONP:
15798 fputs ("Cavium Networks OcteonP", file);
15799 break;
15800 case AFL_EXT_LOONGSON_3A:
15801 fputs ("Loongson 3A", file);
15802 break;
15803 case AFL_EXT_OCTEON:
15804 fputs ("Cavium Networks Octeon", file);
15805 break;
15806 case AFL_EXT_5900:
15807 fputs ("Toshiba R5900", file);
15808 break;
15809 case AFL_EXT_4650:
15810 fputs ("MIPS R4650", file);
15811 break;
15812 case AFL_EXT_4010:
15813 fputs ("LSI R4010", file);
15814 break;
15815 case AFL_EXT_4100:
15816 fputs ("NEC VR4100", file);
15817 break;
15818 case AFL_EXT_3900:
15819 fputs ("Toshiba R3900", file);
15820 break;
15821 case AFL_EXT_10000:
15822 fputs ("MIPS R10000", file);
15823 break;
15824 case AFL_EXT_SB1:
15825 fputs ("Broadcom SB-1", file);
15826 break;
15827 case AFL_EXT_4111:
15828 fputs ("NEC VR4111/VR4181", file);
15829 break;
15830 case AFL_EXT_4120:
15831 fputs ("NEC VR4120", file);
15832 break;
15833 case AFL_EXT_5400:
15834 fputs ("NEC VR5400", file);
15835 break;
15836 case AFL_EXT_5500:
15837 fputs ("NEC VR5500", file);
15838 break;
15839 case AFL_EXT_LOONGSON_2E:
15840 fputs ("ST Microelectronics Loongson 2E", file);
15841 break;
15842 case AFL_EXT_LOONGSON_2F:
15843 fputs ("ST Microelectronics Loongson 2F", file);
15844 break;
15845 default:
00ac7aa0 15846 fprintf (file, "%s (%d)", _("Unknown"), isa_ext);
351cdf24
MF
15847 break;
15848 }
15849}
15850
15851static void
15852print_mips_fp_abi_value (FILE *file, int val)
15853{
15854 switch (val)
15855 {
15856 case Val_GNU_MIPS_ABI_FP_ANY:
15857 fprintf (file, _("Hard or soft float\n"));
15858 break;
15859 case Val_GNU_MIPS_ABI_FP_DOUBLE:
15860 fprintf (file, _("Hard float (double precision)\n"));
15861 break;
15862 case Val_GNU_MIPS_ABI_FP_SINGLE:
15863 fprintf (file, _("Hard float (single precision)\n"));
15864 break;
15865 case Val_GNU_MIPS_ABI_FP_SOFT:
15866 fprintf (file, _("Soft float\n"));
15867 break;
15868 case Val_GNU_MIPS_ABI_FP_OLD_64:
15869 fprintf (file, _("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
15870 break;
15871 case Val_GNU_MIPS_ABI_FP_XX:
15872 fprintf (file, _("Hard float (32-bit CPU, Any FPU)\n"));
15873 break;
15874 case Val_GNU_MIPS_ABI_FP_64:
15875 fprintf (file, _("Hard float (32-bit CPU, 64-bit FPU)\n"));
15876 break;
15877 case Val_GNU_MIPS_ABI_FP_64A:
15878 fprintf (file, _("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
15879 break;
15880 default:
15881 fprintf (file, "??? (%d)\n", val);
15882 break;
15883 }
15884}
15885
15886static int
15887get_mips_reg_size (int reg_size)
15888{
15889 return (reg_size == AFL_REG_NONE) ? 0
15890 : (reg_size == AFL_REG_32) ? 32
15891 : (reg_size == AFL_REG_64) ? 64
15892 : (reg_size == AFL_REG_128) ? 128
15893 : -1;
15894}
15895
b34976b6 15896bfd_boolean
9719ad41 15897_bfd_mips_elf_print_private_bfd_data (bfd *abfd, void *ptr)
b49e97c9 15898{
9719ad41 15899 FILE *file = ptr;
b49e97c9
TS
15900
15901 BFD_ASSERT (abfd != NULL && ptr != NULL);
15902
15903 /* Print normal ELF private data. */
15904 _bfd_elf_print_private_bfd_data (abfd, ptr);
15905
15906 /* xgettext:c-format */
15907 fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
15908
15909 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O32)
15910 fprintf (file, _(" [abi=O32]"));
15911 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O64)
15912 fprintf (file, _(" [abi=O64]"));
15913 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32)
15914 fprintf (file, _(" [abi=EABI32]"));
15915 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64)
15916 fprintf (file, _(" [abi=EABI64]"));
15917 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI))
15918 fprintf (file, _(" [abi unknown]"));
15919 else if (ABI_N32_P (abfd))
15920 fprintf (file, _(" [abi=N32]"));
15921 else if (ABI_64_P (abfd))
15922 fprintf (file, _(" [abi=64]"));
15923 else
15924 fprintf (file, _(" [no abi set]"));
15925
15926 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
ae0d2616 15927 fprintf (file, " [mips1]");
b49e97c9 15928 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
ae0d2616 15929 fprintf (file, " [mips2]");
b49e97c9 15930 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
ae0d2616 15931 fprintf (file, " [mips3]");
b49e97c9 15932 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
ae0d2616 15933 fprintf (file, " [mips4]");
b49e97c9 15934 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_5)
ae0d2616 15935 fprintf (file, " [mips5]");
b49e97c9 15936 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
ae0d2616 15937 fprintf (file, " [mips32]");
b49e97c9 15938 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64)
ae0d2616 15939 fprintf (file, " [mips64]");
af7ee8bf 15940 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2)
ae0d2616 15941 fprintf (file, " [mips32r2]");
5f74bc13 15942 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64R2)
ae0d2616 15943 fprintf (file, " [mips64r2]");
7361da2c
AB
15944 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R6)
15945 fprintf (file, " [mips32r6]");
15946 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64R6)
15947 fprintf (file, " [mips64r6]");
b49e97c9
TS
15948 else
15949 fprintf (file, _(" [unknown ISA]"));
15950
40d32fc6 15951 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
ae0d2616 15952 fprintf (file, " [mdmx]");
40d32fc6
CD
15953
15954 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
ae0d2616 15955 fprintf (file, " [mips16]");
40d32fc6 15956
df58fc94
RS
15957 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
15958 fprintf (file, " [micromips]");
15959
ba92f887
MR
15960 if (elf_elfheader (abfd)->e_flags & EF_MIPS_NAN2008)
15961 fprintf (file, " [nan2008]");
15962
5baf5e34 15963 if (elf_elfheader (abfd)->e_flags & EF_MIPS_FP64)
351cdf24 15964 fprintf (file, " [old fp64]");
5baf5e34 15965
b49e97c9 15966 if (elf_elfheader (abfd)->e_flags & EF_MIPS_32BITMODE)
ae0d2616 15967 fprintf (file, " [32bitmode]");
b49e97c9
TS
15968 else
15969 fprintf (file, _(" [not 32bitmode]"));
15970
c0e3f241 15971 if (elf_elfheader (abfd)->e_flags & EF_MIPS_NOREORDER)
ae0d2616 15972 fprintf (file, " [noreorder]");
c0e3f241
CD
15973
15974 if (elf_elfheader (abfd)->e_flags & EF_MIPS_PIC)
ae0d2616 15975 fprintf (file, " [PIC]");
c0e3f241
CD
15976
15977 if (elf_elfheader (abfd)->e_flags & EF_MIPS_CPIC)
ae0d2616 15978 fprintf (file, " [CPIC]");
c0e3f241
CD
15979
15980 if (elf_elfheader (abfd)->e_flags & EF_MIPS_XGOT)
ae0d2616 15981 fprintf (file, " [XGOT]");
c0e3f241
CD
15982
15983 if (elf_elfheader (abfd)->e_flags & EF_MIPS_UCODE)
ae0d2616 15984 fprintf (file, " [UCODE]");
c0e3f241 15985
b49e97c9
TS
15986 fputc ('\n', file);
15987
351cdf24
MF
15988 if (mips_elf_tdata (abfd)->abiflags_valid)
15989 {
15990 Elf_Internal_ABIFlags_v0 *abiflags = &mips_elf_tdata (abfd)->abiflags;
15991 fprintf (file, "\nMIPS ABI Flags Version: %d\n", abiflags->version);
15992 fprintf (file, "\nISA: MIPS%d", abiflags->isa_level);
15993 if (abiflags->isa_rev > 1)
15994 fprintf (file, "r%d", abiflags->isa_rev);
15995 fprintf (file, "\nGPR size: %d",
15996 get_mips_reg_size (abiflags->gpr_size));
15997 fprintf (file, "\nCPR1 size: %d",
15998 get_mips_reg_size (abiflags->cpr1_size));
15999 fprintf (file, "\nCPR2 size: %d",
16000 get_mips_reg_size (abiflags->cpr2_size));
16001 fputs ("\nFP ABI: ", file);
16002 print_mips_fp_abi_value (file, abiflags->fp_abi);
16003 fputs ("ISA Extension: ", file);
16004 print_mips_isa_ext (file, abiflags->isa_ext);
16005 fputs ("\nASEs:", file);
16006 print_mips_ases (file, abiflags->ases);
16007 fprintf (file, "\nFLAGS 1: %8.8lx", abiflags->flags1);
16008 fprintf (file, "\nFLAGS 2: %8.8lx", abiflags->flags2);
16009 fputc ('\n', file);
16010 }
16011
b34976b6 16012 return TRUE;
b49e97c9 16013}
2f89ff8d 16014
b35d266b 16015const struct bfd_elf_special_section _bfd_mips_elf_special_sections[] =
2f89ff8d 16016{
0112cd26
NC
16017 { STRING_COMMA_LEN (".lit4"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16018 { STRING_COMMA_LEN (".lit8"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16019 { STRING_COMMA_LEN (".mdebug"), 0, SHT_MIPS_DEBUG, 0 },
16020 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16021 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16022 { STRING_COMMA_LEN (".ucode"), 0, SHT_MIPS_UCODE, 0 },
16023 { NULL, 0, 0, 0, 0 }
2f89ff8d 16024};
5e2b0d47 16025
8992f0d7
TS
16026/* Merge non visibility st_other attributes. Ensure that the
16027 STO_OPTIONAL flag is copied into h->other, even if this is not a
16028 definiton of the symbol. */
5e2b0d47
NC
16029void
16030_bfd_mips_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
16031 const Elf_Internal_Sym *isym,
16032 bfd_boolean definition,
16033 bfd_boolean dynamic ATTRIBUTE_UNUSED)
16034{
8992f0d7
TS
16035 if ((isym->st_other & ~ELF_ST_VISIBILITY (-1)) != 0)
16036 {
16037 unsigned char other;
16038
16039 other = (definition ? isym->st_other : h->other);
16040 other &= ~ELF_ST_VISIBILITY (-1);
16041 h->other = other | ELF_ST_VISIBILITY (h->other);
16042 }
16043
16044 if (!definition
5e2b0d47
NC
16045 && ELF_MIPS_IS_OPTIONAL (isym->st_other))
16046 h->other |= STO_OPTIONAL;
16047}
12ac1cf5
NC
16048
16049/* Decide whether an undefined symbol is special and can be ignored.
16050 This is the case for OPTIONAL symbols on IRIX. */
16051bfd_boolean
16052_bfd_mips_elf_ignore_undef_symbol (struct elf_link_hash_entry *h)
16053{
16054 return ELF_MIPS_IS_OPTIONAL (h->other) ? TRUE : FALSE;
16055}
e0764319
NC
16056
16057bfd_boolean
16058_bfd_mips_elf_common_definition (Elf_Internal_Sym *sym)
16059{
16060 return (sym->st_shndx == SHN_COMMON
16061 || sym->st_shndx == SHN_MIPS_ACOMMON
16062 || sym->st_shndx == SHN_MIPS_SCOMMON);
16063}
861fb55a
DJ
16064
16065/* Return address for Ith PLT stub in section PLT, for relocation REL
16066 or (bfd_vma) -1 if it should not be included. */
16067
16068bfd_vma
16069_bfd_mips_elf_plt_sym_val (bfd_vma i, const asection *plt,
16070 const arelent *rel ATTRIBUTE_UNUSED)
16071{
16072 return (plt->vma
16073 + 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry)
16074 + i * 4 * ARRAY_SIZE (mips_exec_plt_entry));
16075}
16076
1bbce132
MR
16077/* Build a table of synthetic symbols to represent the PLT. As with MIPS16
16078 and microMIPS PLT slots we may have a many-to-one mapping between .plt
16079 and .got.plt and also the slots may be of a different size each we walk
16080 the PLT manually fetching instructions and matching them against known
16081 patterns. To make things easier standard MIPS slots, if any, always come
16082 first. As we don't create proper ELF symbols we use the UDATA.I member
16083 of ASYMBOL to carry ISA annotation. The encoding used is the same as
16084 with the ST_OTHER member of the ELF symbol. */
16085
16086long
16087_bfd_mips_elf_get_synthetic_symtab (bfd *abfd,
16088 long symcount ATTRIBUTE_UNUSED,
16089 asymbol **syms ATTRIBUTE_UNUSED,
16090 long dynsymcount, asymbol **dynsyms,
16091 asymbol **ret)
16092{
16093 static const char pltname[] = "_PROCEDURE_LINKAGE_TABLE_";
16094 static const char microsuffix[] = "@micromipsplt";
16095 static const char m16suffix[] = "@mips16plt";
16096 static const char mipssuffix[] = "@plt";
16097
16098 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
16099 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
16100 bfd_boolean micromips_p = MICROMIPS_P (abfd);
16101 Elf_Internal_Shdr *hdr;
16102 bfd_byte *plt_data;
16103 bfd_vma plt_offset;
16104 unsigned int other;
16105 bfd_vma entry_size;
16106 bfd_vma plt0_size;
16107 asection *relplt;
16108 bfd_vma opcode;
16109 asection *plt;
16110 asymbol *send;
16111 size_t size;
16112 char *names;
16113 long counti;
16114 arelent *p;
16115 asymbol *s;
16116 char *nend;
16117 long count;
16118 long pi;
16119 long i;
16120 long n;
16121
16122 *ret = NULL;
16123
16124 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0 || dynsymcount <= 0)
16125 return 0;
16126
16127 relplt = bfd_get_section_by_name (abfd, ".rel.plt");
16128 if (relplt == NULL)
16129 return 0;
16130
16131 hdr = &elf_section_data (relplt)->this_hdr;
16132 if (hdr->sh_link != elf_dynsymtab (abfd) || hdr->sh_type != SHT_REL)
16133 return 0;
16134
16135 plt = bfd_get_section_by_name (abfd, ".plt");
16136 if (plt == NULL)
16137 return 0;
16138
16139 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
16140 if (!(*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
16141 return -1;
16142 p = relplt->relocation;
16143
16144 /* Calculating the exact amount of space required for symbols would
16145 require two passes over the PLT, so just pessimise assuming two
16146 PLT slots per relocation. */
16147 count = relplt->size / hdr->sh_entsize;
16148 counti = count * bed->s->int_rels_per_ext_rel;
16149 size = 2 * count * sizeof (asymbol);
16150 size += count * (sizeof (mipssuffix) +
16151 (micromips_p ? sizeof (microsuffix) : sizeof (m16suffix)));
16152 for (pi = 0; pi < counti; pi += bed->s->int_rels_per_ext_rel)
16153 size += 2 * strlen ((*p[pi].sym_ptr_ptr)->name);
16154
16155 /* Add the size of "_PROCEDURE_LINKAGE_TABLE_" too. */
16156 size += sizeof (asymbol) + sizeof (pltname);
16157
16158 if (!bfd_malloc_and_get_section (abfd, plt, &plt_data))
16159 return -1;
16160
16161 if (plt->size < 16)
16162 return -1;
16163
16164 s = *ret = bfd_malloc (size);
16165 if (s == NULL)
16166 return -1;
16167 send = s + 2 * count + 1;
16168
16169 names = (char *) send;
16170 nend = (char *) s + size;
16171 n = 0;
16172
16173 opcode = bfd_get_micromips_32 (abfd, plt_data + 12);
16174 if (opcode == 0x3302fffe)
16175 {
16176 if (!micromips_p)
16177 return -1;
16178 plt0_size = 2 * ARRAY_SIZE (micromips_o32_exec_plt0_entry);
16179 other = STO_MICROMIPS;
16180 }
833794fc
MR
16181 else if (opcode == 0x0398c1d0)
16182 {
16183 if (!micromips_p)
16184 return -1;
16185 plt0_size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry);
16186 other = STO_MICROMIPS;
16187 }
1bbce132
MR
16188 else
16189 {
16190 plt0_size = 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry);
16191 other = 0;
16192 }
16193
16194 s->the_bfd = abfd;
16195 s->flags = BSF_SYNTHETIC | BSF_FUNCTION | BSF_LOCAL;
16196 s->section = plt;
16197 s->value = 0;
16198 s->name = names;
16199 s->udata.i = other;
16200 memcpy (names, pltname, sizeof (pltname));
16201 names += sizeof (pltname);
16202 ++s, ++n;
16203
16204 pi = 0;
16205 for (plt_offset = plt0_size;
16206 plt_offset + 8 <= plt->size && s < send;
16207 plt_offset += entry_size)
16208 {
16209 bfd_vma gotplt_addr;
16210 const char *suffix;
16211 bfd_vma gotplt_hi;
16212 bfd_vma gotplt_lo;
16213 size_t suffixlen;
16214
16215 opcode = bfd_get_micromips_32 (abfd, plt_data + plt_offset + 4);
16216
16217 /* Check if the second word matches the expected MIPS16 instruction. */
16218 if (opcode == 0x651aeb00)
16219 {
16220 if (micromips_p)
16221 return -1;
16222 /* Truncated table??? */
16223 if (plt_offset + 16 > plt->size)
16224 break;
16225 gotplt_addr = bfd_get_32 (abfd, plt_data + plt_offset + 12);
16226 entry_size = 2 * ARRAY_SIZE (mips16_o32_exec_plt_entry);
16227 suffixlen = sizeof (m16suffix);
16228 suffix = m16suffix;
16229 other = STO_MIPS16;
16230 }
833794fc 16231 /* Likewise the expected microMIPS instruction (no insn32 mode). */
1bbce132
MR
16232 else if (opcode == 0xff220000)
16233 {
16234 if (!micromips_p)
16235 return -1;
16236 gotplt_hi = bfd_get_16 (abfd, plt_data + plt_offset) & 0x7f;
16237 gotplt_lo = bfd_get_16 (abfd, plt_data + plt_offset + 2) & 0xffff;
16238 gotplt_hi = ((gotplt_hi ^ 0x40) - 0x40) << 18;
16239 gotplt_lo <<= 2;
16240 gotplt_addr = gotplt_hi + gotplt_lo;
16241 gotplt_addr += ((plt->vma + plt_offset) | 3) ^ 3;
16242 entry_size = 2 * ARRAY_SIZE (micromips_o32_exec_plt_entry);
16243 suffixlen = sizeof (microsuffix);
16244 suffix = microsuffix;
16245 other = STO_MICROMIPS;
16246 }
833794fc
MR
16247 /* Likewise the expected microMIPS instruction (insn32 mode). */
16248 else if ((opcode & 0xffff0000) == 0xff2f0000)
16249 {
16250 gotplt_hi = bfd_get_16 (abfd, plt_data + plt_offset + 2) & 0xffff;
16251 gotplt_lo = bfd_get_16 (abfd, plt_data + plt_offset + 6) & 0xffff;
16252 gotplt_hi = ((gotplt_hi ^ 0x8000) - 0x8000) << 16;
16253 gotplt_lo = (gotplt_lo ^ 0x8000) - 0x8000;
16254 gotplt_addr = gotplt_hi + gotplt_lo;
16255 entry_size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt_entry);
16256 suffixlen = sizeof (microsuffix);
16257 suffix = microsuffix;
16258 other = STO_MICROMIPS;
16259 }
1bbce132
MR
16260 /* Otherwise assume standard MIPS code. */
16261 else
16262 {
16263 gotplt_hi = bfd_get_32 (abfd, plt_data + plt_offset) & 0xffff;
16264 gotplt_lo = bfd_get_32 (abfd, plt_data + plt_offset + 4) & 0xffff;
16265 gotplt_hi = ((gotplt_hi ^ 0x8000) - 0x8000) << 16;
16266 gotplt_lo = (gotplt_lo ^ 0x8000) - 0x8000;
16267 gotplt_addr = gotplt_hi + gotplt_lo;
16268 entry_size = 4 * ARRAY_SIZE (mips_exec_plt_entry);
16269 suffixlen = sizeof (mipssuffix);
16270 suffix = mipssuffix;
16271 other = 0;
16272 }
16273 /* Truncated table??? */
16274 if (plt_offset + entry_size > plt->size)
16275 break;
16276
16277 for (i = 0;
16278 i < count && p[pi].address != gotplt_addr;
16279 i++, pi = (pi + bed->s->int_rels_per_ext_rel) % counti);
16280
16281 if (i < count)
16282 {
16283 size_t namelen;
16284 size_t len;
16285
16286 *s = **p[pi].sym_ptr_ptr;
16287 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
16288 we are defining a symbol, ensure one of them is set. */
16289 if ((s->flags & BSF_LOCAL) == 0)
16290 s->flags |= BSF_GLOBAL;
16291 s->flags |= BSF_SYNTHETIC;
16292 s->section = plt;
16293 s->value = plt_offset;
16294 s->name = names;
16295 s->udata.i = other;
16296
16297 len = strlen ((*p[pi].sym_ptr_ptr)->name);
16298 namelen = len + suffixlen;
16299 if (names + namelen > nend)
16300 break;
16301
16302 memcpy (names, (*p[pi].sym_ptr_ptr)->name, len);
16303 names += len;
16304 memcpy (names, suffix, suffixlen);
16305 names += suffixlen;
16306
16307 ++s, ++n;
16308 pi = (pi + bed->s->int_rels_per_ext_rel) % counti;
16309 }
16310 }
16311
16312 free (plt_data);
16313
16314 return n;
16315}
16316
861fb55a
DJ
16317void
16318_bfd_mips_post_process_headers (bfd *abfd, struct bfd_link_info *link_info)
16319{
16320 struct mips_elf_link_hash_table *htab;
16321 Elf_Internal_Ehdr *i_ehdrp;
16322
16323 i_ehdrp = elf_elfheader (abfd);
16324 if (link_info)
16325 {
16326 htab = mips_elf_hash_table (link_info);
4dfe6ac6
NC
16327 BFD_ASSERT (htab != NULL);
16328
861fb55a
DJ
16329 if (htab->use_plts_and_copy_relocs && !htab->is_vxworks)
16330 i_ehdrp->e_ident[EI_ABIVERSION] = 1;
16331 }
0af03126
L
16332
16333 _bfd_elf_post_process_headers (abfd, link_info);
351cdf24
MF
16334
16335 if (mips_elf_tdata (abfd)->abiflags.fp_abi == Val_GNU_MIPS_ABI_FP_64
16336 || mips_elf_tdata (abfd)->abiflags.fp_abi == Val_GNU_MIPS_ABI_FP_64A)
16337 i_ehdrp->e_ident[EI_ABIVERSION] = 3;
17733f5b
FS
16338
16339 if (elf_stack_flags (abfd) && !(elf_stack_flags (abfd) & PF_X))
16340 i_ehdrp->e_ident[EI_ABIVERSION] = 5;
861fb55a 16341}
2f0c68f2
CM
16342
16343int
16344_bfd_mips_elf_compact_eh_encoding (struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
16345{
16346 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
16347}
16348
16349/* Return the opcode for can't unwind. */
16350
16351int
16352_bfd_mips_elf_cant_unwind_opcode (struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
16353{
16354 return COMPACT_EH_CANT_UNWIND_OPCODE;
16355}