objdump --no-addresses
[deliverable/binutils-gdb.git] / bfd / elfxx-mips.c
CommitLineData
b49e97c9 1/* MIPS-specific support for ELF
b3adc24a 2 Copyright (C) 1993-2020 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 35#include "elf-bfd.h"
0ba9378a 36#include "ecoff-bfd.h"
b49e97c9
TS
37#include "elfxx-mips.h"
38#include "elf/mips.h"
0a44bf69 39#include "elf-vxworks.h"
2f0c68f2 40#include "dwarf2.h"
b49e97c9
TS
41
42/* Get the ECOFF swapping routines. */
43#include "coff/sym.h"
44#include "coff/symconst.h"
45#include "coff/ecoff.h"
46#include "coff/mips.h"
47
b15e6682
AO
48#include "hashtab.h"
49
9ab066b4
RS
50/* Types of TLS GOT entry. */
51enum mips_got_tls_type {
52 GOT_TLS_NONE,
53 GOT_TLS_GD,
54 GOT_TLS_LDM,
55 GOT_TLS_IE
56};
57
ead49a57 58/* This structure is used to hold information about one GOT entry.
3dff0dd1
RS
59 There are four types of entry:
60
61 (1) an absolute address
62 requires: abfd == NULL
63 fields: d.address
64
65 (2) a SYMBOL + OFFSET address, where SYMBOL is local to an input bfd
66 requires: abfd != NULL, symndx >= 0, tls_type != GOT_TLS_LDM
67 fields: abfd, symndx, d.addend, tls_type
68
69 (3) a SYMBOL address, where SYMBOL is not local to an input bfd
70 requires: abfd != NULL, symndx == -1
71 fields: d.h, tls_type
72
73 (4) a TLS LDM slot
74 requires: abfd != NULL, symndx == 0, tls_type == GOT_TLS_LDM
75 fields: none; there's only one of these per GOT. */
b15e6682
AO
76struct mips_got_entry
77{
3dff0dd1 78 /* One input bfd that needs the GOT entry. */
b15e6682 79 bfd *abfd;
f4416af6
AO
80 /* The index of the symbol, as stored in the relocation r_info, if
81 we have a local symbol; -1 otherwise. */
82 long symndx;
83 union
84 {
85 /* If abfd == NULL, an address that must be stored in the got. */
86 bfd_vma address;
87 /* If abfd != NULL && symndx != -1, the addend of the relocation
88 that should be added to the symbol value. */
89 bfd_vma addend;
90 /* If abfd != NULL && symndx == -1, the hash table entry
3dff0dd1 91 corresponding to a symbol in the GOT. The symbol's entry
020d7251
RS
92 is in the local area if h->global_got_area is GGA_NONE,
93 otherwise it is in the global area. */
f4416af6
AO
94 struct mips_elf_link_hash_entry *h;
95 } d;
0f20cc35 96
9ab066b4
RS
97 /* The TLS type of this GOT entry. An LDM GOT entry will be a local
98 symbol entry with r_symndx == 0. */
0f20cc35
DJ
99 unsigned char tls_type;
100
9ab066b4
RS
101 /* True if we have filled in the GOT contents for a TLS entry,
102 and created the associated relocations. */
103 unsigned char tls_initialized;
104
b15e6682 105 /* The offset from the beginning of the .got section to the entry
f4416af6
AO
106 corresponding to this symbol+addend. If it's a global symbol
107 whose offset is yet to be decided, it's going to be -1. */
108 long gotidx;
b15e6682
AO
109};
110
13db6b44
RS
111/* This structure represents a GOT page reference from an input bfd.
112 Each instance represents a symbol + ADDEND, where the representation
113 of the symbol depends on whether it is local to the input bfd.
114 If it is, then SYMNDX >= 0, and the symbol has index SYMNDX in U.ABFD.
115 Otherwise, SYMNDX < 0 and U.H points to the symbol's hash table entry.
116
117 Page references with SYMNDX >= 0 always become page references
118 in the output. Page references with SYMNDX < 0 only become page
119 references if the symbol binds locally; in other cases, the page
120 reference decays to a global GOT reference. */
121struct mips_got_page_ref
122{
123 long symndx;
124 union
125 {
126 struct mips_elf_link_hash_entry *h;
127 bfd *abfd;
128 } u;
129 bfd_vma addend;
130};
131
c224138d
RS
132/* This structure describes a range of addends: [MIN_ADDEND, MAX_ADDEND].
133 The structures form a non-overlapping list that is sorted by increasing
134 MIN_ADDEND. */
135struct mips_got_page_range
136{
137 struct mips_got_page_range *next;
138 bfd_signed_vma min_addend;
139 bfd_signed_vma max_addend;
140};
141
142/* This structure describes the range of addends that are applied to page
13db6b44 143 relocations against a given section. */
c224138d
RS
144struct mips_got_page_entry
145{
13db6b44
RS
146 /* The section that these entries are based on. */
147 asection *sec;
c224138d
RS
148 /* The ranges for this page entry. */
149 struct mips_got_page_range *ranges;
150 /* The maximum number of page entries needed for RANGES. */
151 bfd_vma num_pages;
152};
153
f0abc2a1 154/* This structure is used to hold .got information when linking. */
b49e97c9
TS
155
156struct mips_got_info
157{
b49e97c9
TS
158 /* The number of global .got entries. */
159 unsigned int global_gotno;
23cc69b6
RS
160 /* The number of global .got entries that are in the GGA_RELOC_ONLY area. */
161 unsigned int reloc_only_gotno;
0f20cc35
DJ
162 /* The number of .got slots used for TLS. */
163 unsigned int tls_gotno;
164 /* The first unused TLS .got entry. Used only during
165 mips_elf_initialize_tls_index. */
166 unsigned int tls_assigned_gotno;
c224138d 167 /* The number of local .got entries, eventually including page entries. */
b49e97c9 168 unsigned int local_gotno;
c224138d
RS
169 /* The maximum number of page entries needed. */
170 unsigned int page_gotno;
ab361d49
RS
171 /* The number of relocations needed for the GOT entries. */
172 unsigned int relocs;
cb22ccf4
KCY
173 /* The first unused local .got entry. */
174 unsigned int assigned_low_gotno;
175 /* The last unused local .got entry. */
176 unsigned int assigned_high_gotno;
b15e6682
AO
177 /* A hash table holding members of the got. */
178 struct htab *got_entries;
13db6b44
RS
179 /* A hash table holding mips_got_page_ref structures. */
180 struct htab *got_page_refs;
c224138d
RS
181 /* A hash table of mips_got_page_entry structures. */
182 struct htab *got_page_entries;
f4416af6
AO
183 /* In multi-got links, a pointer to the next got (err, rather, most
184 of the time, it points to the previous got). */
185 struct mips_got_info *next;
186};
187
d7206569 188/* Structure passed when merging bfds' gots. */
f4416af6
AO
189
190struct mips_elf_got_per_bfd_arg
191{
f4416af6
AO
192 /* The output bfd. */
193 bfd *obfd;
194 /* The link information. */
195 struct bfd_link_info *info;
196 /* A pointer to the primary got, i.e., the one that's going to get
197 the implicit relocations from DT_MIPS_LOCAL_GOTNO and
198 DT_MIPS_GOTSYM. */
199 struct mips_got_info *primary;
200 /* A non-primary got we're trying to merge with other input bfd's
201 gots. */
202 struct mips_got_info *current;
203 /* The maximum number of got entries that can be addressed with a
204 16-bit offset. */
205 unsigned int max_count;
c224138d
RS
206 /* The maximum number of page entries needed by each got. */
207 unsigned int max_pages;
0f20cc35
DJ
208 /* The total number of global entries which will live in the
209 primary got and be automatically relocated. This includes
210 those not referenced by the primary GOT but included in
211 the "master" GOT. */
212 unsigned int global_count;
f4416af6
AO
213};
214
ab361d49
RS
215/* A structure used to pass information to htab_traverse callbacks
216 when laying out the GOT. */
f4416af6 217
ab361d49 218struct mips_elf_traverse_got_arg
f4416af6 219{
ab361d49 220 struct bfd_link_info *info;
f4416af6
AO
221 struct mips_got_info *g;
222 int value;
0f20cc35
DJ
223};
224
f0abc2a1
AM
225struct _mips_elf_section_data
226{
227 struct bfd_elf_section_data elf;
228 union
229 {
f0abc2a1
AM
230 bfd_byte *tdata;
231 } u;
232};
233
234#define mips_elf_section_data(sec) \
68bfbfcc 235 ((struct _mips_elf_section_data *) elf_section_data (sec))
f0abc2a1 236
d5eaccd7
RS
237#define is_mips_elf(bfd) \
238 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
239 && elf_tdata (bfd) != NULL \
4dfe6ac6 240 && elf_object_id (bfd) == MIPS_ELF_DATA)
d5eaccd7 241
634835ae
RS
242/* The ABI says that every symbol used by dynamic relocations must have
243 a global GOT entry. Among other things, this provides the dynamic
244 linker with a free, directly-indexed cache. The GOT can therefore
245 contain symbols that are not referenced by GOT relocations themselves
246 (in other words, it may have symbols that are not referenced by things
247 like R_MIPS_GOT16 and R_MIPS_GOT_PAGE).
248
249 GOT relocations are less likely to overflow if we put the associated
250 GOT entries towards the beginning. We therefore divide the global
251 GOT entries into two areas: "normal" and "reloc-only". Entries in
252 the first area can be used for both dynamic relocations and GP-relative
253 accesses, while those in the "reloc-only" area are for dynamic
254 relocations only.
255
256 These GGA_* ("Global GOT Area") values are organised so that lower
257 values are more general than higher values. Also, non-GGA_NONE
258 values are ordered by the position of the area in the GOT. */
259#define GGA_NORMAL 0
260#define GGA_RELOC_ONLY 1
261#define GGA_NONE 2
262
861fb55a
DJ
263/* Information about a non-PIC interface to a PIC function. There are
264 two ways of creating these interfaces. The first is to add:
265
266 lui $25,%hi(func)
267 addiu $25,$25,%lo(func)
268
269 immediately before a PIC function "func". The second is to add:
270
271 lui $25,%hi(func)
272 j func
273 addiu $25,$25,%lo(func)
274
275 to a separate trampoline section.
276
277 Stubs of the first kind go in a new section immediately before the
278 target function. Stubs of the second kind go in a single section
279 pointed to by the hash table's "strampoline" field. */
280struct mips_elf_la25_stub {
281 /* The generated section that contains this stub. */
282 asection *stub_section;
283
284 /* The offset of the stub from the start of STUB_SECTION. */
285 bfd_vma offset;
286
287 /* One symbol for the original function. Its location is available
288 in H->root.root.u.def. */
289 struct mips_elf_link_hash_entry *h;
290};
291
292/* Macros for populating a mips_elf_la25_stub. */
293
294#define LA25_LUI(VAL) (0x3c190000 | (VAL)) /* lui t9,VAL */
295#define LA25_J(VAL) (0x08000000 | (((VAL) >> 2) & 0x3ffffff)) /* j VAL */
3734320d 296#define LA25_BC(VAL) (0xc8000000 | (((VAL) >> 2) & 0x3ffffff)) /* bc VAL */
861fb55a 297#define LA25_ADDIU(VAL) (0x27390000 | (VAL)) /* addiu t9,t9,VAL */
d21911ea
MR
298#define LA25_LUI_MICROMIPS(VAL) \
299 (0x41b90000 | (VAL)) /* lui t9,VAL */
300#define LA25_J_MICROMIPS(VAL) \
301 (0xd4000000 | (((VAL) >> 1) & 0x3ffffff)) /* j VAL */
302#define LA25_ADDIU_MICROMIPS(VAL) \
303 (0x33390000 | (VAL)) /* addiu t9,t9,VAL */
861fb55a 304
b49e97c9
TS
305/* This structure is passed to mips_elf_sort_hash_table_f when sorting
306 the dynamic symbols. */
307
308struct mips_elf_hash_sort_data
309{
310 /* The symbol in the global GOT with the lowest dynamic symbol table
311 index. */
312 struct elf_link_hash_entry *low;
0f20cc35
DJ
313 /* The least dynamic symbol table index corresponding to a non-TLS
314 symbol with a GOT entry. */
55f8b9d2 315 bfd_size_type min_got_dynindx;
f4416af6
AO
316 /* The greatest dynamic symbol table index corresponding to a symbol
317 with a GOT entry that is not referenced (e.g., a dynamic symbol
9e4aeb93 318 with dynamic relocations pointing to it from non-primary GOTs). */
55f8b9d2 319 bfd_size_type max_unref_got_dynindx;
e17b0c35
MR
320 /* The greatest dynamic symbol table index corresponding to a local
321 symbol. */
322 bfd_size_type max_local_dynindx;
323 /* The greatest dynamic symbol table index corresponding to an external
b49e97c9 324 symbol without a GOT entry. */
55f8b9d2 325 bfd_size_type max_non_got_dynindx;
f16a9783
MS
326 /* If non-NULL, output BFD for .MIPS.xhash finalization. */
327 bfd *output_bfd;
328 /* If non-NULL, pointer to contents of .MIPS.xhash for filling in
329 real final dynindx. */
330 bfd_byte *mipsxhash;
b49e97c9
TS
331};
332
1bbce132
MR
333/* We make up to two PLT entries if needed, one for standard MIPS code
334 and one for compressed code, either a MIPS16 or microMIPS one. We
335 keep a separate record of traditional lazy-binding stubs, for easier
336 processing. */
337
338struct plt_entry
339{
340 /* Traditional SVR4 stub offset, or -1 if none. */
341 bfd_vma stub_offset;
342
343 /* Standard PLT entry offset, or -1 if none. */
344 bfd_vma mips_offset;
345
346 /* Compressed PLT entry offset, or -1 if none. */
347 bfd_vma comp_offset;
348
349 /* The corresponding .got.plt index, or -1 if none. */
350 bfd_vma gotplt_index;
351
352 /* Whether we need a standard PLT entry. */
353 unsigned int need_mips : 1;
354
355 /* Whether we need a compressed PLT entry. */
356 unsigned int need_comp : 1;
357};
358
b49e97c9
TS
359/* The MIPS ELF linker needs additional information for each symbol in
360 the global hash table. */
361
362struct mips_elf_link_hash_entry
363{
364 struct elf_link_hash_entry root;
365
366 /* External symbol information. */
367 EXTR esym;
368
861fb55a
DJ
369 /* The la25 stub we have created for ths symbol, if any. */
370 struct mips_elf_la25_stub *la25_stub;
371
b49e97c9
TS
372 /* Number of R_MIPS_32, R_MIPS_REL32, or R_MIPS_64 relocs against
373 this symbol. */
374 unsigned int possibly_dynamic_relocs;
375
b49e97c9
TS
376 /* If there is a stub that 32 bit functions should use to call this
377 16 bit function, this points to the section containing the stub. */
378 asection *fn_stub;
379
b49e97c9
TS
380 /* If there is a stub that 16 bit functions should use to call this
381 32 bit function, this points to the section containing the stub. */
382 asection *call_stub;
383
384 /* This is like the call_stub field, but it is used if the function
385 being called returns a floating point value. */
386 asection *call_fp_stub;
7c5fcef7 387
f16a9783
MS
388 /* If non-zero, location in .MIPS.xhash to write real final dynindx. */
389 bfd_vma mipsxhash_loc;
390
634835ae
RS
391 /* The highest GGA_* value that satisfies all references to this symbol. */
392 unsigned int global_got_area : 2;
393
6ccf4795
RS
394 /* True if all GOT relocations against this symbol are for calls. This is
395 a looser condition than no_fn_stub below, because there may be other
396 non-call non-GOT relocations against the symbol. */
397 unsigned int got_only_for_calls : 1;
398
71782a75
RS
399 /* True if one of the relocations described by possibly_dynamic_relocs
400 is against a readonly section. */
401 unsigned int readonly_reloc : 1;
402
861fb55a
DJ
403 /* True if there is a relocation against this symbol that must be
404 resolved by the static linker (in other words, if the relocation
405 cannot possibly be made dynamic). */
406 unsigned int has_static_relocs : 1;
407
71782a75
RS
408 /* True if we must not create a .MIPS.stubs entry for this symbol.
409 This is set, for example, if there are relocations related to
410 taking the function's address, i.e. any but R_MIPS_CALL*16 ones.
411 See "MIPS ABI Supplement, 3rd Edition", p. 4-20. */
412 unsigned int no_fn_stub : 1;
413
414 /* Whether we need the fn_stub; this is true if this symbol appears
415 in any relocs other than a 16 bit call. */
416 unsigned int need_fn_stub : 1;
417
861fb55a
DJ
418 /* True if this symbol is referenced by branch relocations from
419 any non-PIC input file. This is used to determine whether an
420 la25 stub is required. */
421 unsigned int has_nonpic_branches : 1;
33bb52fb
RS
422
423 /* Does this symbol need a traditional MIPS lazy-binding stub
424 (as opposed to a PLT entry)? */
425 unsigned int needs_lazy_stub : 1;
1bbce132
MR
426
427 /* Does this symbol resolve to a PLT entry? */
428 unsigned int use_plt_entry : 1;
b49e97c9
TS
429};
430
431/* MIPS ELF linker hash table. */
432
433struct mips_elf_link_hash_table
434{
435 struct elf_link_hash_table root;
861fb55a 436
b49e97c9
TS
437 /* The number of .rtproc entries. */
438 bfd_size_type procedure_count;
861fb55a 439
b49e97c9
TS
440 /* The size of the .compact_rel section (if SGI_COMPAT). */
441 bfd_size_type compact_rel_size;
861fb55a 442
e6aea42d
MR
443 /* This flag indicates that the value of DT_MIPS_RLD_MAP dynamic entry
444 is set to the address of __rld_obj_head as in IRIX5 and IRIX6. */
b34976b6 445 bfd_boolean use_rld_obj_head;
861fb55a 446
b4082c70
DD
447 /* The __rld_map or __rld_obj_head symbol. */
448 struct elf_link_hash_entry *rld_symbol;
861fb55a 449
b49e97c9 450 /* This is set if we see any mips16 stub sections. */
b34976b6 451 bfd_boolean mips16_stubs_seen;
861fb55a
DJ
452
453 /* True if we can generate copy relocs and PLTs. */
454 bfd_boolean use_plts_and_copy_relocs;
455
833794fc
MR
456 /* True if we can only use 32-bit microMIPS instructions. */
457 bfd_boolean insn32;
458
8b10b0b3
MR
459 /* True if we suppress checks for invalid branches between ISA modes. */
460 bfd_boolean ignore_branch_isa;
461
3734320d
MF
462 /* True if we are targetting R6 compact branches. */
463 bfd_boolean compact_branches;
464
0a44bf69
RS
465 /* True if we're generating code for VxWorks. */
466 bfd_boolean is_vxworks;
861fb55a 467
0e53d9da
AN
468 /* True if we already reported the small-data section overflow. */
469 bfd_boolean small_data_overflow_reported;
861fb55a 470
47275900
MR
471 /* True if we use the special `__gnu_absolute_zero' symbol. */
472 bfd_boolean use_absolute_zero;
473
474 /* True if we have been configured for a GNU target. */
475 bfd_boolean gnu_target;
476
0a44bf69
RS
477 /* Shortcuts to some dynamic sections, or NULL if they are not
478 being used. */
0a44bf69 479 asection *srelplt2;
4e41d0d7 480 asection *sstubs;
861fb55a 481
a8028dd0
RS
482 /* The master GOT information. */
483 struct mips_got_info *got_info;
861fb55a 484
d222d210
RS
485 /* The global symbol in the GOT with the lowest index in the dynamic
486 symbol table. */
487 struct elf_link_hash_entry *global_gotsym;
488
861fb55a 489 /* The size of the PLT header in bytes. */
0a44bf69 490 bfd_vma plt_header_size;
861fb55a 491
1bbce132
MR
492 /* The size of a standard PLT entry in bytes. */
493 bfd_vma plt_mips_entry_size;
494
495 /* The size of a compressed PLT entry in bytes. */
496 bfd_vma plt_comp_entry_size;
497
498 /* The offset of the next standard PLT entry to create. */
499 bfd_vma plt_mips_offset;
500
501 /* The offset of the next compressed PLT entry to create. */
502 bfd_vma plt_comp_offset;
503
504 /* The index of the next .got.plt entry to create. */
505 bfd_vma plt_got_index;
861fb55a 506
33bb52fb
RS
507 /* The number of functions that need a lazy-binding stub. */
508 bfd_vma lazy_stub_count;
861fb55a 509
5108fc1b
RS
510 /* The size of a function stub entry in bytes. */
511 bfd_vma function_stub_size;
861fb55a
DJ
512
513 /* The number of reserved entries at the beginning of the GOT. */
514 unsigned int reserved_gotno;
515
516 /* The section used for mips_elf_la25_stub trampolines.
517 See the comment above that structure for details. */
518 asection *strampoline;
519
520 /* A table of mips_elf_la25_stubs, indexed by (input_section, offset)
521 pairs. */
522 htab_t la25_stubs;
523
524 /* A function FN (NAME, IS, OS) that creates a new input section
525 called NAME and links it to output section OS. If IS is nonnull,
526 the new section should go immediately before it, otherwise it
527 should go at the (current) beginning of OS.
528
529 The function returns the new section on success, otherwise it
530 returns null. */
531 asection *(*add_stub_section) (const char *, asection *, asection *);
13db6b44
RS
532
533 /* Small local sym cache. */
534 struct sym_cache sym_cache;
1bbce132
MR
535
536 /* Is the PLT header compressed? */
537 unsigned int plt_header_is_comp : 1;
861fb55a
DJ
538};
539
4dfe6ac6
NC
540/* Get the MIPS ELF linker hash table from a link_info structure. */
541
542#define mips_elf_hash_table(p) \
543 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
544 == MIPS_ELF_DATA ? ((struct mips_elf_link_hash_table *) ((p)->hash)) : NULL)
545
861fb55a 546/* A structure used to communicate with htab_traverse callbacks. */
4dfe6ac6
NC
547struct mips_htab_traverse_info
548{
861fb55a
DJ
549 /* The usual link-wide information. */
550 struct bfd_link_info *info;
551 bfd *output_bfd;
552
553 /* Starts off FALSE and is set to TRUE if the link should be aborted. */
554 bfd_boolean error;
b49e97c9
TS
555};
556
6ae68ba3
MR
557/* MIPS ELF private object data. */
558
559struct mips_elf_obj_tdata
560{
561 /* Generic ELF private object data. */
562 struct elf_obj_tdata root;
563
564 /* Input BFD providing Tag_GNU_MIPS_ABI_FP attribute for output. */
565 bfd *abi_fp_bfd;
ee227692 566
b60bf9be
CF
567 /* Input BFD providing Tag_GNU_MIPS_ABI_MSA attribute for output. */
568 bfd *abi_msa_bfd;
569
351cdf24
MF
570 /* The abiflags for this object. */
571 Elf_Internal_ABIFlags_v0 abiflags;
572 bfd_boolean abiflags_valid;
573
ee227692
RS
574 /* The GOT requirements of input bfds. */
575 struct mips_got_info *got;
698600e4
AM
576
577 /* Used by _bfd_mips_elf_find_nearest_line. The structure could be
578 included directly in this one, but there's no point to wasting
579 the memory just for the infrequently called find_nearest_line. */
580 struct mips_elf_find_line *find_line_info;
581
582 /* An array of stub sections indexed by symbol number. */
583 asection **local_stubs;
584 asection **local_call_stubs;
585
586 /* The Irix 5 support uses two virtual sections, which represent
587 text/data symbols defined in dynamic objects. */
588 asymbol *elf_data_symbol;
589 asymbol *elf_text_symbol;
590 asection *elf_data_section;
591 asection *elf_text_section;
6ae68ba3
MR
592};
593
594/* Get MIPS ELF private object data from BFD's tdata. */
595
596#define mips_elf_tdata(bfd) \
597 ((struct mips_elf_obj_tdata *) (bfd)->tdata.any)
598
0f20cc35
DJ
599#define TLS_RELOC_P(r_type) \
600 (r_type == R_MIPS_TLS_DTPMOD32 \
601 || r_type == R_MIPS_TLS_DTPMOD64 \
602 || r_type == R_MIPS_TLS_DTPREL32 \
603 || r_type == R_MIPS_TLS_DTPREL64 \
604 || r_type == R_MIPS_TLS_GD \
605 || r_type == R_MIPS_TLS_LDM \
606 || r_type == R_MIPS_TLS_DTPREL_HI16 \
607 || r_type == R_MIPS_TLS_DTPREL_LO16 \
608 || r_type == R_MIPS_TLS_GOTTPREL \
609 || r_type == R_MIPS_TLS_TPREL32 \
610 || r_type == R_MIPS_TLS_TPREL64 \
611 || r_type == R_MIPS_TLS_TPREL_HI16 \
df58fc94 612 || r_type == R_MIPS_TLS_TPREL_LO16 \
d0f13682
CLT
613 || r_type == R_MIPS16_TLS_GD \
614 || r_type == R_MIPS16_TLS_LDM \
615 || r_type == R_MIPS16_TLS_DTPREL_HI16 \
616 || r_type == R_MIPS16_TLS_DTPREL_LO16 \
617 || r_type == R_MIPS16_TLS_GOTTPREL \
618 || r_type == R_MIPS16_TLS_TPREL_HI16 \
619 || r_type == R_MIPS16_TLS_TPREL_LO16 \
df58fc94
RS
620 || r_type == R_MICROMIPS_TLS_GD \
621 || r_type == R_MICROMIPS_TLS_LDM \
622 || r_type == R_MICROMIPS_TLS_DTPREL_HI16 \
623 || r_type == R_MICROMIPS_TLS_DTPREL_LO16 \
624 || r_type == R_MICROMIPS_TLS_GOTTPREL \
625 || r_type == R_MICROMIPS_TLS_TPREL_HI16 \
626 || r_type == R_MICROMIPS_TLS_TPREL_LO16)
0f20cc35 627
b49e97c9
TS
628/* Structure used to pass information to mips_elf_output_extsym. */
629
630struct extsym_info
631{
9e4aeb93
RS
632 bfd *abfd;
633 struct bfd_link_info *info;
b49e97c9
TS
634 struct ecoff_debug_info *debug;
635 const struct ecoff_debug_swap *swap;
b34976b6 636 bfd_boolean failed;
b49e97c9
TS
637};
638
8dc1a139 639/* The names of the runtime procedure table symbols used on IRIX5. */
b49e97c9
TS
640
641static const char * const mips_elf_dynsym_rtproc_names[] =
642{
643 "_procedure_table",
644 "_procedure_string_table",
645 "_procedure_table_size",
646 NULL
647};
648
649/* These structures are used to generate the .compact_rel section on
8dc1a139 650 IRIX5. */
b49e97c9
TS
651
652typedef struct
653{
654 unsigned long id1; /* Always one? */
655 unsigned long num; /* Number of compact relocation entries. */
656 unsigned long id2; /* Always two? */
657 unsigned long offset; /* The file offset of the first relocation. */
658 unsigned long reserved0; /* Zero? */
659 unsigned long reserved1; /* Zero? */
660} Elf32_compact_rel;
661
662typedef struct
663{
664 bfd_byte id1[4];
665 bfd_byte num[4];
666 bfd_byte id2[4];
667 bfd_byte offset[4];
668 bfd_byte reserved0[4];
669 bfd_byte reserved1[4];
670} Elf32_External_compact_rel;
671
672typedef struct
673{
674 unsigned int ctype : 1; /* 1: long 0: short format. See below. */
675 unsigned int rtype : 4; /* Relocation types. See below. */
676 unsigned int dist2to : 8;
677 unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
678 unsigned long konst; /* KONST field. See below. */
679 unsigned long vaddr; /* VADDR to be relocated. */
680} Elf32_crinfo;
681
682typedef struct
683{
684 unsigned int ctype : 1; /* 1: long 0: short format. See below. */
685 unsigned int rtype : 4; /* Relocation types. See below. */
686 unsigned int dist2to : 8;
687 unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
688 unsigned long konst; /* KONST field. See below. */
689} Elf32_crinfo2;
690
691typedef struct
692{
693 bfd_byte info[4];
694 bfd_byte konst[4];
695 bfd_byte vaddr[4];
696} Elf32_External_crinfo;
697
698typedef struct
699{
700 bfd_byte info[4];
701 bfd_byte konst[4];
702} Elf32_External_crinfo2;
703
704/* These are the constants used to swap the bitfields in a crinfo. */
705
706#define CRINFO_CTYPE (0x1)
707#define CRINFO_CTYPE_SH (31)
708#define CRINFO_RTYPE (0xf)
709#define CRINFO_RTYPE_SH (27)
710#define CRINFO_DIST2TO (0xff)
711#define CRINFO_DIST2TO_SH (19)
712#define CRINFO_RELVADDR (0x7ffff)
713#define CRINFO_RELVADDR_SH (0)
714
715/* A compact relocation info has long (3 words) or short (2 words)
716 formats. A short format doesn't have VADDR field and relvaddr
717 fields contains ((VADDR - vaddr of the previous entry) >> 2). */
718#define CRF_MIPS_LONG 1
719#define CRF_MIPS_SHORT 0
720
721/* There are 4 types of compact relocation at least. The value KONST
722 has different meaning for each type:
723
724 (type) (konst)
725 CT_MIPS_REL32 Address in data
726 CT_MIPS_WORD Address in word (XXX)
727 CT_MIPS_GPHI_LO GP - vaddr
728 CT_MIPS_JMPAD Address to jump
729 */
730
731#define CRT_MIPS_REL32 0xa
732#define CRT_MIPS_WORD 0xb
733#define CRT_MIPS_GPHI_LO 0xc
734#define CRT_MIPS_JMPAD 0xd
735
736#define mips_elf_set_cr_format(x,format) ((x).ctype = (format))
737#define mips_elf_set_cr_type(x,type) ((x).rtype = (type))
738#define mips_elf_set_cr_dist2to(x,v) ((x).dist2to = (v))
739#define mips_elf_set_cr_relvaddr(x,d) ((x).relvaddr = (d)<<2)
740\f
741/* The structure of the runtime procedure descriptor created by the
742 loader for use by the static exception system. */
743
744typedef struct runtime_pdr {
ae9a127f
NC
745 bfd_vma adr; /* Memory address of start of procedure. */
746 long regmask; /* Save register mask. */
747 long regoffset; /* Save register offset. */
748 long fregmask; /* Save floating point register mask. */
749 long fregoffset; /* Save floating point register offset. */
750 long frameoffset; /* Frame size. */
751 short framereg; /* Frame pointer register. */
752 short pcreg; /* Offset or reg of return pc. */
753 long irpss; /* Index into the runtime string table. */
b49e97c9 754 long reserved;
ae9a127f 755 struct exception_info *exception_info;/* Pointer to exception array. */
b49e97c9
TS
756} RPDR, *pRPDR;
757#define cbRPDR sizeof (RPDR)
758#define rpdNil ((pRPDR) 0)
759\f
b15e6682 760static struct mips_got_entry *mips_elf_create_local_got_entry
a8028dd0
RS
761 (bfd *, struct bfd_link_info *, bfd *, bfd_vma, unsigned long,
762 struct mips_elf_link_hash_entry *, int);
b34976b6 763static bfd_boolean mips_elf_sort_hash_table_f
9719ad41 764 (struct mips_elf_link_hash_entry *, void *);
9719ad41
RS
765static bfd_vma mips_elf_high
766 (bfd_vma);
b34976b6 767static bfd_boolean mips_elf_create_dynamic_relocation
9719ad41
RS
768 (bfd *, struct bfd_link_info *, const Elf_Internal_Rela *,
769 struct mips_elf_link_hash_entry *, asection *, bfd_vma,
770 bfd_vma *, asection *);
f4416af6 771static bfd_vma mips_elf_adjust_gp
9719ad41 772 (bfd *, struct mips_got_info *, bfd *);
f4416af6 773
b49e97c9
TS
774/* This will be used when we sort the dynamic relocation records. */
775static bfd *reldyn_sorting_bfd;
776
6d30f5b2
NC
777/* True if ABFD is for CPUs with load interlocking that include
778 non-MIPS1 CPUs and R3900. */
779#define LOAD_INTERLOCKS_P(abfd) \
780 ( ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) != E_MIPS_ARCH_1) \
781 || ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == E_MIPS_MACH_3900))
782
cd8d5a82
CF
783/* True if ABFD is for CPUs that are faster if JAL is converted to BAL.
784 This should be safe for all architectures. We enable this predicate
785 for RM9000 for now. */
786#define JAL_TO_BAL_P(abfd) \
787 ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == E_MIPS_MACH_9000)
788
789/* True if ABFD is for CPUs that are faster if JALR is converted to BAL.
790 This should be safe for all architectures. We enable this predicate for
791 all CPUs. */
792#define JALR_TO_BAL_P(abfd) 1
793
38a7df63
CF
794/* True if ABFD is for CPUs that are faster if JR is converted to B.
795 This should be safe for all architectures. We enable this predicate for
796 all CPUs. */
797#define JR_TO_B_P(abfd) 1
798
861fb55a
DJ
799/* True if ABFD is a PIC object. */
800#define PIC_OBJECT_P(abfd) \
801 ((elf_elfheader (abfd)->e_flags & EF_MIPS_PIC) != 0)
802
351cdf24
MF
803/* Nonzero if ABFD is using the O32 ABI. */
804#define ABI_O32_P(abfd) \
805 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O32)
806
b49e97c9 807/* Nonzero if ABFD is using the N32 ABI. */
b49e97c9
TS
808#define ABI_N32_P(abfd) \
809 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
810
4a14403c 811/* Nonzero if ABFD is using the N64 ABI. */
b49e97c9 812#define ABI_64_P(abfd) \
141ff970 813 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
b49e97c9 814
4a14403c
TS
815/* Nonzero if ABFD is using NewABI conventions. */
816#define NEWABI_P(abfd) (ABI_N32_P (abfd) || ABI_64_P (abfd))
817
e8faf7d1
MR
818/* Nonzero if ABFD has microMIPS code. */
819#define MICROMIPS_P(abfd) \
820 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS) != 0)
821
7361da2c
AB
822/* Nonzero if ABFD is MIPS R6. */
823#define MIPSR6_P(abfd) \
824 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R6 \
825 || (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64R6)
826
4a14403c 827/* The IRIX compatibility level we are striving for. */
b49e97c9
TS
828#define IRIX_COMPAT(abfd) \
829 (get_elf_backend_data (abfd)->elf_backend_mips_irix_compat (abfd))
830
b49e97c9
TS
831/* Whether we are trying to be compatible with IRIX at all. */
832#define SGI_COMPAT(abfd) \
833 (IRIX_COMPAT (abfd) != ict_none)
834
835/* The name of the options section. */
836#define MIPS_ELF_OPTIONS_SECTION_NAME(abfd) \
d80dcc6a 837 (NEWABI_P (abfd) ? ".MIPS.options" : ".options")
b49e97c9 838
cc2e31b9
RS
839/* True if NAME is the recognized name of any SHT_MIPS_OPTIONS section.
840 Some IRIX system files do not use MIPS_ELF_OPTIONS_SECTION_NAME. */
841#define MIPS_ELF_OPTIONS_SECTION_NAME_P(NAME) \
842 (strcmp (NAME, ".MIPS.options") == 0 || strcmp (NAME, ".options") == 0)
843
351cdf24
MF
844/* True if NAME is the recognized name of any SHT_MIPS_ABIFLAGS section. */
845#define MIPS_ELF_ABIFLAGS_SECTION_NAME_P(NAME) \
846 (strcmp (NAME, ".MIPS.abiflags") == 0)
847
943284cc
DJ
848/* Whether the section is readonly. */
849#define MIPS_ELF_READONLY_SECTION(sec) \
850 ((sec->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)) \
851 == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
852
b49e97c9 853/* The name of the stub section. */
ca07892d 854#define MIPS_ELF_STUB_SECTION_NAME(abfd) ".MIPS.stubs"
b49e97c9
TS
855
856/* The size of an external REL relocation. */
857#define MIPS_ELF_REL_SIZE(abfd) \
858 (get_elf_backend_data (abfd)->s->sizeof_rel)
859
0a44bf69
RS
860/* The size of an external RELA relocation. */
861#define MIPS_ELF_RELA_SIZE(abfd) \
862 (get_elf_backend_data (abfd)->s->sizeof_rela)
863
b49e97c9
TS
864/* The size of an external dynamic table entry. */
865#define MIPS_ELF_DYN_SIZE(abfd) \
866 (get_elf_backend_data (abfd)->s->sizeof_dyn)
867
868/* The size of a GOT entry. */
869#define MIPS_ELF_GOT_SIZE(abfd) \
870 (get_elf_backend_data (abfd)->s->arch_size / 8)
871
b4082c70
DD
872/* The size of the .rld_map section. */
873#define MIPS_ELF_RLD_MAP_SIZE(abfd) \
874 (get_elf_backend_data (abfd)->s->arch_size / 8)
875
b49e97c9
TS
876/* The size of a symbol-table entry. */
877#define MIPS_ELF_SYM_SIZE(abfd) \
878 (get_elf_backend_data (abfd)->s->sizeof_sym)
879
880/* The default alignment for sections, as a power of two. */
881#define MIPS_ELF_LOG_FILE_ALIGN(abfd) \
45d6a902 882 (get_elf_backend_data (abfd)->s->log_file_align)
b49e97c9
TS
883
884/* Get word-sized data. */
885#define MIPS_ELF_GET_WORD(abfd, ptr) \
886 (ABI_64_P (abfd) ? bfd_get_64 (abfd, ptr) : bfd_get_32 (abfd, ptr))
887
888/* Put out word-sized data. */
889#define MIPS_ELF_PUT_WORD(abfd, val, ptr) \
07d6d2b8
AM
890 (ABI_64_P (abfd) \
891 ? bfd_put_64 (abfd, val, ptr) \
b49e97c9
TS
892 : bfd_put_32 (abfd, val, ptr))
893
861fb55a
DJ
894/* The opcode for word-sized loads (LW or LD). */
895#define MIPS_ELF_LOAD_WORD(abfd) \
896 (ABI_64_P (abfd) ? 0xdc000000 : 0x8c000000)
897
b49e97c9 898/* Add a dynamic symbol table-entry. */
9719ad41 899#define MIPS_ELF_ADD_DYNAMIC_ENTRY(info, tag, val) \
5a580b3a 900 _bfd_elf_add_dynamic_entry (info, tag, val)
b49e97c9
TS
901
902#define MIPS_ELF_RTYPE_TO_HOWTO(abfd, rtype, rela) \
0aa13fee 903 (get_elf_backend_data (abfd)->elf_backend_mips_rtype_to_howto (abfd, rtype, rela))
b49e97c9 904
0a44bf69
RS
905/* The name of the dynamic relocation section. */
906#define MIPS_ELF_REL_DYN_NAME(INFO) \
907 (mips_elf_hash_table (INFO)->is_vxworks ? ".rela.dyn" : ".rel.dyn")
908
b49e97c9
TS
909/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
910 from smaller values. Start with zero, widen, *then* decrement. */
911#define MINUS_ONE (((bfd_vma)0) - 1)
c5ae1840 912#define MINUS_TWO (((bfd_vma)0) - 2)
b49e97c9 913
51e38d68
RS
914/* The value to write into got[1] for SVR4 targets, to identify it is
915 a GNU object. The dynamic linker can then use got[1] to store the
916 module pointer. */
917#define MIPS_ELF_GNU_GOT1_MASK(abfd) \
918 ((bfd_vma) 1 << (ABI_64_P (abfd) ? 63 : 31))
919
f4416af6 920/* The offset of $gp from the beginning of the .got section. */
0a44bf69
RS
921#define ELF_MIPS_GP_OFFSET(INFO) \
922 (mips_elf_hash_table (INFO)->is_vxworks ? 0x0 : 0x7ff0)
f4416af6
AO
923
924/* The maximum size of the GOT for it to be addressable using 16-bit
925 offsets from $gp. */
0a44bf69 926#define MIPS_ELF_GOT_MAX_SIZE(INFO) (ELF_MIPS_GP_OFFSET (INFO) + 0x7fff)
f4416af6 927
6a691779 928/* Instructions which appear in a stub. */
3d6746ca
DD
929#define STUB_LW(abfd) \
930 ((ABI_64_P (abfd) \
931 ? 0xdf998010 /* ld t9,0x8010(gp) */ \
07d6d2b8 932 : 0x8f998010)) /* lw t9,0x8010(gp) */
40fc1451 933#define STUB_MOVE 0x03e07825 /* or t7,ra,zero */
3d6746ca 934#define STUB_LUI(VAL) (0x3c180000 + (VAL)) /* lui t8,VAL */
a18a2a34 935#define STUB_JALR 0x0320f809 /* jalr ra,t9 */
3734320d 936#define STUB_JALRC 0xf8190000 /* jalrc ra,t9 */
5108fc1b
RS
937#define STUB_ORI(VAL) (0x37180000 + (VAL)) /* ori t8,t8,VAL */
938#define STUB_LI16U(VAL) (0x34180000 + (VAL)) /* ori t8,zero,VAL unsigned */
3d6746ca
DD
939#define STUB_LI16S(abfd, VAL) \
940 ((ABI_64_P (abfd) \
941 ? (0x64180000 + (VAL)) /* daddiu t8,zero,VAL sign extended */ \
942 : (0x24180000 + (VAL)))) /* addiu t8,zero,VAL sign extended */
943
1bbce132
MR
944/* Likewise for the microMIPS ASE. */
945#define STUB_LW_MICROMIPS(abfd) \
946 (ABI_64_P (abfd) \
947 ? 0xdf3c8010 /* ld t9,0x8010(gp) */ \
948 : 0xff3c8010) /* lw t9,0x8010(gp) */
949#define STUB_MOVE_MICROMIPS 0x0dff /* move t7,ra */
40fc1451 950#define STUB_MOVE32_MICROMIPS 0x001f7a90 /* or t7,ra,zero */
1bbce132
MR
951#define STUB_LUI_MICROMIPS(VAL) \
952 (0x41b80000 + (VAL)) /* lui t8,VAL */
953#define STUB_JALR_MICROMIPS 0x45d9 /* jalr t9 */
833794fc 954#define STUB_JALR32_MICROMIPS 0x03f90f3c /* jalr ra,t9 */
1bbce132
MR
955#define STUB_ORI_MICROMIPS(VAL) \
956 (0x53180000 + (VAL)) /* ori t8,t8,VAL */
957#define STUB_LI16U_MICROMIPS(VAL) \
958 (0x53000000 + (VAL)) /* ori t8,zero,VAL unsigned */
959#define STUB_LI16S_MICROMIPS(abfd, VAL) \
960 (ABI_64_P (abfd) \
961 ? 0x5f000000 + (VAL) /* daddiu t8,zero,VAL sign extended */ \
962 : 0x33000000 + (VAL)) /* addiu t8,zero,VAL sign extended */
963
5108fc1b
RS
964#define MIPS_FUNCTION_STUB_NORMAL_SIZE 16
965#define MIPS_FUNCTION_STUB_BIG_SIZE 20
1bbce132
MR
966#define MICROMIPS_FUNCTION_STUB_NORMAL_SIZE 12
967#define MICROMIPS_FUNCTION_STUB_BIG_SIZE 16
833794fc
MR
968#define MICROMIPS_INSN32_FUNCTION_STUB_NORMAL_SIZE 16
969#define MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE 20
b49e97c9
TS
970
971/* The name of the dynamic interpreter. This is put in the .interp
972 section. */
973
07d6d2b8
AM
974#define ELF_DYNAMIC_INTERPRETER(abfd) \
975 (ABI_N32_P (abfd) ? "/usr/lib32/libc.so.1" \
976 : ABI_64_P (abfd) ? "/usr/lib64/libc.so.1" \
b49e97c9
TS
977 : "/usr/lib/libc.so.1")
978
979#ifdef BFD64
ee6423ed
AO
980#define MNAME(bfd,pre,pos) \
981 (ABI_64_P (bfd) ? CONCAT4 (pre,64,_,pos) : CONCAT4 (pre,32,_,pos))
b49e97c9
TS
982#define ELF_R_SYM(bfd, i) \
983 (ABI_64_P (bfd) ? ELF64_R_SYM (i) : ELF32_R_SYM (i))
984#define ELF_R_TYPE(bfd, i) \
985 (ABI_64_P (bfd) ? ELF64_MIPS_R_TYPE (i) : ELF32_R_TYPE (i))
986#define ELF_R_INFO(bfd, s, t) \
987 (ABI_64_P (bfd) ? ELF64_R_INFO (s, t) : ELF32_R_INFO (s, t))
988#else
ee6423ed 989#define MNAME(bfd,pre,pos) CONCAT4 (pre,32,_,pos)
b49e97c9
TS
990#define ELF_R_SYM(bfd, i) \
991 (ELF32_R_SYM (i))
992#define ELF_R_TYPE(bfd, i) \
993 (ELF32_R_TYPE (i))
994#define ELF_R_INFO(bfd, s, t) \
995 (ELF32_R_INFO (s, t))
996#endif
997\f
998 /* The mips16 compiler uses a couple of special sections to handle
999 floating point arguments.
1000
1001 Section names that look like .mips16.fn.FNNAME contain stubs that
1002 copy floating point arguments from the fp regs to the gp regs and
1003 then jump to FNNAME. If any 32 bit function calls FNNAME, the
1004 call should be redirected to the stub instead. If no 32 bit
1005 function calls FNNAME, the stub should be discarded. We need to
1006 consider any reference to the function, not just a call, because
1007 if the address of the function is taken we will need the stub,
1008 since the address might be passed to a 32 bit function.
1009
1010 Section names that look like .mips16.call.FNNAME contain stubs
1011 that copy floating point arguments from the gp regs to the fp
1012 regs and then jump to FNNAME. If FNNAME is a 32 bit function,
1013 then any 16 bit function that calls FNNAME should be redirected
1014 to the stub instead. If FNNAME is not a 32 bit function, the
1015 stub should be discarded.
1016
1017 .mips16.call.fp.FNNAME sections are similar, but contain stubs
1018 which call FNNAME and then copy the return value from the fp regs
1019 to the gp regs. These stubs store the return value in $18 while
1020 calling FNNAME; any function which might call one of these stubs
1021 must arrange to save $18 around the call. (This case is not
1022 needed for 32 bit functions that call 16 bit functions, because
1023 16 bit functions always return floating point values in both
1024 $f0/$f1 and $2/$3.)
1025
1026 Note that in all cases FNNAME might be defined statically.
1027 Therefore, FNNAME is not used literally. Instead, the relocation
1028 information will indicate which symbol the section is for.
1029
1030 We record any stubs that we find in the symbol table. */
1031
1032#define FN_STUB ".mips16.fn."
1033#define CALL_STUB ".mips16.call."
1034#define CALL_FP_STUB ".mips16.call.fp."
b9d58d71
TS
1035
1036#define FN_STUB_P(name) CONST_STRNEQ (name, FN_STUB)
1037#define CALL_STUB_P(name) CONST_STRNEQ (name, CALL_STUB)
1038#define CALL_FP_STUB_P(name) CONST_STRNEQ (name, CALL_FP_STUB)
b49e97c9 1039\f
861fb55a 1040/* The format of the first PLT entry in an O32 executable. */
6d30f5b2
NC
1041static const bfd_vma mips_o32_exec_plt0_entry[] =
1042{
861fb55a
DJ
1043 0x3c1c0000, /* lui $28, %hi(&GOTPLT[0]) */
1044 0x8f990000, /* lw $25, %lo(&GOTPLT[0])($28) */
1045 0x279c0000, /* addiu $28, $28, %lo(&GOTPLT[0]) */
1046 0x031cc023, /* subu $24, $24, $28 */
40fc1451 1047 0x03e07825, /* or t7, ra, zero */
861fb55a
DJ
1048 0x0018c082, /* srl $24, $24, 2 */
1049 0x0320f809, /* jalr $25 */
1050 0x2718fffe /* subu $24, $24, 2 */
1051};
1052
3734320d
MF
1053/* The format of the first PLT entry in an O32 executable using compact
1054 jumps. */
1055static const bfd_vma mipsr6_o32_exec_plt0_entry_compact[] =
1056{
1057 0x3c1c0000, /* lui $28, %hi(&GOTPLT[0]) */
1058 0x8f990000, /* lw $25, %lo(&GOTPLT[0])($28) */
1059 0x279c0000, /* addiu $28, $28, %lo(&GOTPLT[0]) */
1060 0x031cc023, /* subu $24, $24, $28 */
1061 0x03e07821, /* move $15, $31 # 32-bit move (addu) */
1062 0x0018c082, /* srl $24, $24, 2 */
1063 0x2718fffe, /* subu $24, $24, 2 */
1064 0xf8190000 /* jalrc $25 */
1065};
1066
861fb55a
DJ
1067/* The format of the first PLT entry in an N32 executable. Different
1068 because gp ($28) is not available; we use t2 ($14) instead. */
6d30f5b2
NC
1069static const bfd_vma mips_n32_exec_plt0_entry[] =
1070{
861fb55a
DJ
1071 0x3c0e0000, /* lui $14, %hi(&GOTPLT[0]) */
1072 0x8dd90000, /* lw $25, %lo(&GOTPLT[0])($14) */
1073 0x25ce0000, /* addiu $14, $14, %lo(&GOTPLT[0]) */
1074 0x030ec023, /* subu $24, $24, $14 */
40fc1451 1075 0x03e07825, /* or t7, ra, zero */
861fb55a
DJ
1076 0x0018c082, /* srl $24, $24, 2 */
1077 0x0320f809, /* jalr $25 */
1078 0x2718fffe /* subu $24, $24, 2 */
1079};
1080
3734320d
MF
1081/* The format of the first PLT entry in an N32 executable using compact
1082 jumps. Different because gp ($28) is not available; we use t2 ($14)
1083 instead. */
1084static const bfd_vma mipsr6_n32_exec_plt0_entry_compact[] =
1085{
1086 0x3c0e0000, /* lui $14, %hi(&GOTPLT[0]) */
1087 0x8dd90000, /* lw $25, %lo(&GOTPLT[0])($14) */
1088 0x25ce0000, /* addiu $14, $14, %lo(&GOTPLT[0]) */
1089 0x030ec023, /* subu $24, $24, $14 */
1090 0x03e07821, /* move $15, $31 # 32-bit move (addu) */
1091 0x0018c082, /* srl $24, $24, 2 */
1092 0x2718fffe, /* subu $24, $24, 2 */
1093 0xf8190000 /* jalrc $25 */
1094};
1095
861fb55a
DJ
1096/* The format of the first PLT entry in an N64 executable. Different
1097 from N32 because of the increased size of GOT entries. */
6d30f5b2
NC
1098static const bfd_vma mips_n64_exec_plt0_entry[] =
1099{
861fb55a
DJ
1100 0x3c0e0000, /* lui $14, %hi(&GOTPLT[0]) */
1101 0xddd90000, /* ld $25, %lo(&GOTPLT[0])($14) */
1102 0x25ce0000, /* addiu $14, $14, %lo(&GOTPLT[0]) */
1103 0x030ec023, /* subu $24, $24, $14 */
40fc1451 1104 0x03e07825, /* or t7, ra, zero */
861fb55a
DJ
1105 0x0018c0c2, /* srl $24, $24, 3 */
1106 0x0320f809, /* jalr $25 */
1107 0x2718fffe /* subu $24, $24, 2 */
1108};
1109
3734320d
MF
1110/* The format of the first PLT entry in an N64 executable using compact
1111 jumps. Different from N32 because of the increased size of GOT
1112 entries. */
1113static const bfd_vma mipsr6_n64_exec_plt0_entry_compact[] =
1114{
1115 0x3c0e0000, /* lui $14, %hi(&GOTPLT[0]) */
1116 0xddd90000, /* ld $25, %lo(&GOTPLT[0])($14) */
1117 0x25ce0000, /* addiu $14, $14, %lo(&GOTPLT[0]) */
1118 0x030ec023, /* subu $24, $24, $14 */
1119 0x03e0782d, /* move $15, $31 # 64-bit move (daddu) */
1120 0x0018c0c2, /* srl $24, $24, 3 */
1121 0x2718fffe, /* subu $24, $24, 2 */
1122 0xf8190000 /* jalrc $25 */
1123};
1124
1125
1bbce132
MR
1126/* The format of the microMIPS first PLT entry in an O32 executable.
1127 We rely on v0 ($2) rather than t8 ($24) to contain the address
1128 of the GOTPLT entry handled, so this stub may only be used when
1129 all the subsequent PLT entries are microMIPS code too.
1130
1131 The trailing NOP is for alignment and correct disassembly only. */
1132static const bfd_vma micromips_o32_exec_plt0_entry[] =
1133{
1134 0x7980, 0x0000, /* addiupc $3, (&GOTPLT[0]) - . */
1135 0xff23, 0x0000, /* lw $25, 0($3) */
1136 0x0535, /* subu $2, $2, $3 */
1137 0x2525, /* srl $2, $2, 2 */
1138 0x3302, 0xfffe, /* subu $24, $2, 2 */
1139 0x0dff, /* move $15, $31 */
1140 0x45f9, /* jalrs $25 */
1141 0x0f83, /* move $28, $3 */
1142 0x0c00 /* nop */
1143};
1144
833794fc
MR
1145/* The format of the microMIPS first PLT entry in an O32 executable
1146 in the insn32 mode. */
1147static const bfd_vma micromips_insn32_o32_exec_plt0_entry[] =
1148{
1149 0x41bc, 0x0000, /* lui $28, %hi(&GOTPLT[0]) */
1150 0xff3c, 0x0000, /* lw $25, %lo(&GOTPLT[0])($28) */
1151 0x339c, 0x0000, /* addiu $28, $28, %lo(&GOTPLT[0]) */
1152 0x0398, 0xc1d0, /* subu $24, $24, $28 */
40fc1451 1153 0x001f, 0x7a90, /* or $15, $31, zero */
833794fc
MR
1154 0x0318, 0x1040, /* srl $24, $24, 2 */
1155 0x03f9, 0x0f3c, /* jalr $25 */
1156 0x3318, 0xfffe /* subu $24, $24, 2 */
1157};
1158
1bbce132 1159/* The format of subsequent standard PLT entries. */
6d30f5b2
NC
1160static const bfd_vma mips_exec_plt_entry[] =
1161{
861fb55a
DJ
1162 0x3c0f0000, /* lui $15, %hi(.got.plt entry) */
1163 0x01f90000, /* l[wd] $25, %lo(.got.plt entry)($15) */
1164 0x25f80000, /* addiu $24, $15, %lo(.got.plt entry) */
1165 0x03200008 /* jr $25 */
1166};
1167
7361da2c
AB
1168static const bfd_vma mipsr6_exec_plt_entry[] =
1169{
1170 0x3c0f0000, /* lui $15, %hi(.got.plt entry) */
1171 0x01f90000, /* l[wd] $25, %lo(.got.plt entry)($15) */
1172 0x25f80000, /* addiu $24, $15, %lo(.got.plt entry) */
1173 0x03200009 /* jr $25 */
1174};
1175
3734320d
MF
1176static const bfd_vma mipsr6_exec_plt_entry_compact[] =
1177{
1178 0x3c0f0000, /* lui $15, %hi(.got.plt entry) */
1179 0x01f90000, /* l[wd] $25, %lo(.got.plt entry)($15) */
1180 0x25f80000, /* addiu $24, $15, %lo(.got.plt entry) */
1181 0xd8190000 /* jic $25, 0 */
1182};
1183
1bbce132
MR
1184/* The format of subsequent MIPS16 o32 PLT entries. We use v0 ($2)
1185 and v1 ($3) as temporaries because t8 ($24) and t9 ($25) are not
1186 directly addressable. */
1187static const bfd_vma mips16_o32_exec_plt_entry[] =
1188{
1189 0xb203, /* lw $2, 12($pc) */
1190 0x9a60, /* lw $3, 0($2) */
1191 0x651a, /* move $24, $2 */
1192 0xeb00, /* jr $3 */
1193 0x653b, /* move $25, $3 */
1194 0x6500, /* nop */
1195 0x0000, 0x0000 /* .word (.got.plt entry) */
1196};
1197
1198/* The format of subsequent microMIPS o32 PLT entries. We use v0 ($2)
1199 as a temporary because t8 ($24) is not addressable with ADDIUPC. */
1200static const bfd_vma micromips_o32_exec_plt_entry[] =
1201{
1202 0x7900, 0x0000, /* addiupc $2, (.got.plt entry) - . */
1203 0xff22, 0x0000, /* lw $25, 0($2) */
1204 0x4599, /* jr $25 */
1205 0x0f02 /* move $24, $2 */
1206};
1207
833794fc
MR
1208/* The format of subsequent microMIPS o32 PLT entries in the insn32 mode. */
1209static const bfd_vma micromips_insn32_o32_exec_plt_entry[] =
1210{
1211 0x41af, 0x0000, /* lui $15, %hi(.got.plt entry) */
1212 0xff2f, 0x0000, /* lw $25, %lo(.got.plt entry)($15) */
1213 0x0019, 0x0f3c, /* jr $25 */
1214 0x330f, 0x0000 /* addiu $24, $15, %lo(.got.plt entry) */
1215};
1216
0a44bf69 1217/* The format of the first PLT entry in a VxWorks executable. */
6d30f5b2
NC
1218static const bfd_vma mips_vxworks_exec_plt0_entry[] =
1219{
0a44bf69
RS
1220 0x3c190000, /* lui t9, %hi(_GLOBAL_OFFSET_TABLE_) */
1221 0x27390000, /* addiu t9, t9, %lo(_GLOBAL_OFFSET_TABLE_) */
1222 0x8f390008, /* lw t9, 8(t9) */
1223 0x00000000, /* nop */
1224 0x03200008, /* jr t9 */
1225 0x00000000 /* nop */
1226};
1227
1228/* The format of subsequent PLT entries. */
6d30f5b2
NC
1229static const bfd_vma mips_vxworks_exec_plt_entry[] =
1230{
0a44bf69
RS
1231 0x10000000, /* b .PLT_resolver */
1232 0x24180000, /* li t8, <pltindex> */
1233 0x3c190000, /* lui t9, %hi(<.got.plt slot>) */
1234 0x27390000, /* addiu t9, t9, %lo(<.got.plt slot>) */
1235 0x8f390000, /* lw t9, 0(t9) */
1236 0x00000000, /* nop */
1237 0x03200008, /* jr t9 */
1238 0x00000000 /* nop */
1239};
1240
1241/* The format of the first PLT entry in a VxWorks shared object. */
6d30f5b2
NC
1242static const bfd_vma mips_vxworks_shared_plt0_entry[] =
1243{
0a44bf69
RS
1244 0x8f990008, /* lw t9, 8(gp) */
1245 0x00000000, /* nop */
1246 0x03200008, /* jr t9 */
1247 0x00000000, /* nop */
1248 0x00000000, /* nop */
1249 0x00000000 /* nop */
1250};
1251
1252/* The format of subsequent PLT entries. */
6d30f5b2
NC
1253static const bfd_vma mips_vxworks_shared_plt_entry[] =
1254{
0a44bf69
RS
1255 0x10000000, /* b .PLT_resolver */
1256 0x24180000 /* li t8, <pltindex> */
1257};
1258\f
d21911ea
MR
1259/* microMIPS 32-bit opcode helper installer. */
1260
1261static void
1262bfd_put_micromips_32 (const bfd *abfd, bfd_vma opcode, bfd_byte *ptr)
1263{
1264 bfd_put_16 (abfd, (opcode >> 16) & 0xffff, ptr);
07d6d2b8 1265 bfd_put_16 (abfd, opcode & 0xffff, ptr + 2);
d21911ea
MR
1266}
1267
1268/* microMIPS 32-bit opcode helper retriever. */
1269
1270static bfd_vma
1271bfd_get_micromips_32 (const bfd *abfd, const bfd_byte *ptr)
1272{
1273 return (bfd_get_16 (abfd, ptr) << 16) | bfd_get_16 (abfd, ptr + 2);
1274}
1275\f
b49e97c9
TS
1276/* Look up an entry in a MIPS ELF linker hash table. */
1277
1278#define mips_elf_link_hash_lookup(table, string, create, copy, follow) \
1279 ((struct mips_elf_link_hash_entry *) \
1280 elf_link_hash_lookup (&(table)->root, (string), (create), \
1281 (copy), (follow)))
1282
1283/* Traverse a MIPS ELF linker hash table. */
1284
1285#define mips_elf_link_hash_traverse(table, func, info) \
1286 (elf_link_hash_traverse \
1287 (&(table)->root, \
9719ad41 1288 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
b49e97c9
TS
1289 (info)))
1290
0f20cc35
DJ
1291/* Find the base offsets for thread-local storage in this object,
1292 for GD/LD and IE/LE respectively. */
1293
1294#define TP_OFFSET 0x7000
1295#define DTP_OFFSET 0x8000
1296
1297static bfd_vma
1298dtprel_base (struct bfd_link_info *info)
1299{
1300 /* If tls_sec is NULL, we should have signalled an error already. */
1301 if (elf_hash_table (info)->tls_sec == NULL)
1302 return 0;
1303 return elf_hash_table (info)->tls_sec->vma + DTP_OFFSET;
1304}
1305
1306static bfd_vma
1307tprel_base (struct bfd_link_info *info)
1308{
1309 /* If tls_sec is NULL, we should have signalled an error already. */
1310 if (elf_hash_table (info)->tls_sec == NULL)
1311 return 0;
1312 return elf_hash_table (info)->tls_sec->vma + TP_OFFSET;
1313}
1314
b49e97c9
TS
1315/* Create an entry in a MIPS ELF linker hash table. */
1316
1317static struct bfd_hash_entry *
9719ad41
RS
1318mips_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
1319 struct bfd_hash_table *table, const char *string)
b49e97c9
TS
1320{
1321 struct mips_elf_link_hash_entry *ret =
1322 (struct mips_elf_link_hash_entry *) entry;
1323
1324 /* Allocate the structure if it has not already been allocated by a
1325 subclass. */
9719ad41
RS
1326 if (ret == NULL)
1327 ret = bfd_hash_allocate (table, sizeof (struct mips_elf_link_hash_entry));
1328 if (ret == NULL)
b49e97c9
TS
1329 return (struct bfd_hash_entry *) ret;
1330
1331 /* Call the allocation method of the superclass. */
1332 ret = ((struct mips_elf_link_hash_entry *)
1333 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
1334 table, string));
9719ad41 1335 if (ret != NULL)
b49e97c9
TS
1336 {
1337 /* Set local fields. */
1338 memset (&ret->esym, 0, sizeof (EXTR));
1339 /* We use -2 as a marker to indicate that the information has
1340 not been set. -1 means there is no associated ifd. */
1341 ret->esym.ifd = -2;
861fb55a 1342 ret->la25_stub = 0;
b49e97c9 1343 ret->possibly_dynamic_relocs = 0;
b49e97c9 1344 ret->fn_stub = NULL;
b49e97c9
TS
1345 ret->call_stub = NULL;
1346 ret->call_fp_stub = NULL;
f16a9783 1347 ret->mipsxhash_loc = 0;
634835ae 1348 ret->global_got_area = GGA_NONE;
6ccf4795 1349 ret->got_only_for_calls = TRUE;
71782a75 1350 ret->readonly_reloc = FALSE;
861fb55a 1351 ret->has_static_relocs = FALSE;
71782a75
RS
1352 ret->no_fn_stub = FALSE;
1353 ret->need_fn_stub = FALSE;
861fb55a 1354 ret->has_nonpic_branches = FALSE;
33bb52fb 1355 ret->needs_lazy_stub = FALSE;
1bbce132 1356 ret->use_plt_entry = FALSE;
b49e97c9
TS
1357 }
1358
1359 return (struct bfd_hash_entry *) ret;
1360}
f0abc2a1 1361
6ae68ba3
MR
1362/* Allocate MIPS ELF private object data. */
1363
1364bfd_boolean
1365_bfd_mips_elf_mkobject (bfd *abfd)
1366{
1367 return bfd_elf_allocate_object (abfd, sizeof (struct mips_elf_obj_tdata),
1368 MIPS_ELF_DATA);
1369}
1370
f0abc2a1 1371bfd_boolean
9719ad41 1372_bfd_mips_elf_new_section_hook (bfd *abfd, asection *sec)
f0abc2a1 1373{
f592407e
AM
1374 if (!sec->used_by_bfd)
1375 {
1376 struct _mips_elf_section_data *sdata;
986f0783 1377 size_t amt = sizeof (*sdata);
f0abc2a1 1378
f592407e
AM
1379 sdata = bfd_zalloc (abfd, amt);
1380 if (sdata == NULL)
1381 return FALSE;
1382 sec->used_by_bfd = sdata;
1383 }
f0abc2a1
AM
1384
1385 return _bfd_elf_new_section_hook (abfd, sec);
1386}
b49e97c9
TS
1387\f
1388/* Read ECOFF debugging information from a .mdebug section into a
1389 ecoff_debug_info structure. */
1390
b34976b6 1391bfd_boolean
9719ad41
RS
1392_bfd_mips_elf_read_ecoff_info (bfd *abfd, asection *section,
1393 struct ecoff_debug_info *debug)
b49e97c9
TS
1394{
1395 HDRR *symhdr;
1396 const struct ecoff_debug_swap *swap;
9719ad41 1397 char *ext_hdr;
b49e97c9
TS
1398
1399 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1400 memset (debug, 0, sizeof (*debug));
1401
9719ad41 1402 ext_hdr = bfd_malloc (swap->external_hdr_size);
b49e97c9
TS
1403 if (ext_hdr == NULL && swap->external_hdr_size != 0)
1404 goto error_return;
1405
9719ad41 1406 if (! bfd_get_section_contents (abfd, section, ext_hdr, 0,
82e51918 1407 swap->external_hdr_size))
b49e97c9
TS
1408 goto error_return;
1409
1410 symhdr = &debug->symbolic_header;
1411 (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
1412
1413 /* The symbolic header contains absolute file offsets and sizes to
1414 read. */
1415#define READ(ptr, offset, count, size, type) \
1f4361a7 1416 do \
b49e97c9 1417 { \
1f4361a7
AM
1418 size_t amt; \
1419 debug->ptr = NULL; \
1420 if (symhdr->count == 0) \
1421 break; \
1422 if (_bfd_mul_overflow (size, symhdr->count, &amt)) \
1423 { \
1424 bfd_set_error (bfd_error_file_too_big); \
1425 goto error_return; \
1426 } \
2bb3687b 1427 if (bfd_seek (abfd, symhdr->offset, SEEK_SET) != 0) \
b49e97c9 1428 goto error_return; \
2bb3687b
AM
1429 debug->ptr = (type) _bfd_malloc_and_read (abfd, amt, amt); \
1430 if (debug->ptr == NULL) \
b49e97c9 1431 goto error_return; \
1f4361a7 1432 } while (0)
b49e97c9
TS
1433
1434 READ (line, cbLineOffset, cbLine, sizeof (unsigned char), unsigned char *);
9719ad41
RS
1435 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, void *);
1436 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, void *);
1437 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, void *);
1438 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, void *);
b49e97c9
TS
1439 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
1440 union aux_ext *);
1441 READ (ss, cbSsOffset, issMax, sizeof (char), char *);
1442 READ (ssext, cbSsExtOffset, issExtMax, sizeof (char), char *);
9719ad41
RS
1443 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, void *);
1444 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, void *);
1445 READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size, void *);
b49e97c9
TS
1446#undef READ
1447
1448 debug->fdr = NULL;
b49e97c9 1449
b34976b6 1450 return TRUE;
b49e97c9
TS
1451
1452 error_return:
1453 if (ext_hdr != NULL)
1454 free (ext_hdr);
1455 if (debug->line != NULL)
1456 free (debug->line);
1457 if (debug->external_dnr != NULL)
1458 free (debug->external_dnr);
1459 if (debug->external_pdr != NULL)
1460 free (debug->external_pdr);
1461 if (debug->external_sym != NULL)
1462 free (debug->external_sym);
1463 if (debug->external_opt != NULL)
1464 free (debug->external_opt);
1465 if (debug->external_aux != NULL)
1466 free (debug->external_aux);
1467 if (debug->ss != NULL)
1468 free (debug->ss);
1469 if (debug->ssext != NULL)
1470 free (debug->ssext);
1471 if (debug->external_fdr != NULL)
1472 free (debug->external_fdr);
1473 if (debug->external_rfd != NULL)
1474 free (debug->external_rfd);
1475 if (debug->external_ext != NULL)
1476 free (debug->external_ext);
b34976b6 1477 return FALSE;
b49e97c9
TS
1478}
1479\f
1480/* Swap RPDR (runtime procedure table entry) for output. */
1481
1482static void
9719ad41 1483ecoff_swap_rpdr_out (bfd *abfd, const RPDR *in, struct rpdr_ext *ex)
b49e97c9
TS
1484{
1485 H_PUT_S32 (abfd, in->adr, ex->p_adr);
1486 H_PUT_32 (abfd, in->regmask, ex->p_regmask);
1487 H_PUT_32 (abfd, in->regoffset, ex->p_regoffset);
1488 H_PUT_32 (abfd, in->fregmask, ex->p_fregmask);
1489 H_PUT_32 (abfd, in->fregoffset, ex->p_fregoffset);
1490 H_PUT_32 (abfd, in->frameoffset, ex->p_frameoffset);
1491
1492 H_PUT_16 (abfd, in->framereg, ex->p_framereg);
1493 H_PUT_16 (abfd, in->pcreg, ex->p_pcreg);
1494
1495 H_PUT_32 (abfd, in->irpss, ex->p_irpss);
b49e97c9
TS
1496}
1497
1498/* Create a runtime procedure table from the .mdebug section. */
1499
b34976b6 1500static bfd_boolean
9719ad41
RS
1501mips_elf_create_procedure_table (void *handle, bfd *abfd,
1502 struct bfd_link_info *info, asection *s,
1503 struct ecoff_debug_info *debug)
b49e97c9
TS
1504{
1505 const struct ecoff_debug_swap *swap;
1506 HDRR *hdr = &debug->symbolic_header;
1507 RPDR *rpdr, *rp;
1508 struct rpdr_ext *erp;
9719ad41 1509 void *rtproc;
b49e97c9
TS
1510 struct pdr_ext *epdr;
1511 struct sym_ext *esym;
1512 char *ss, **sv;
1513 char *str;
1514 bfd_size_type size;
1515 bfd_size_type count;
1516 unsigned long sindex;
1517 unsigned long i;
1518 PDR pdr;
1519 SYMR sym;
1520 const char *no_name_func = _("static procedure (no name)");
1521
1522 epdr = NULL;
1523 rpdr = NULL;
1524 esym = NULL;
1525 ss = NULL;
1526 sv = NULL;
1527
1528 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1529
1530 sindex = strlen (no_name_func) + 1;
1531 count = hdr->ipdMax;
1532 if (count > 0)
1533 {
1534 size = swap->external_pdr_size;
1535
9719ad41 1536 epdr = bfd_malloc (size * count);
b49e97c9
TS
1537 if (epdr == NULL)
1538 goto error_return;
1539
9719ad41 1540 if (! _bfd_ecoff_get_accumulated_pdr (handle, (bfd_byte *) epdr))
b49e97c9
TS
1541 goto error_return;
1542
1543 size = sizeof (RPDR);
9719ad41 1544 rp = rpdr = bfd_malloc (size * count);
b49e97c9
TS
1545 if (rpdr == NULL)
1546 goto error_return;
1547
1548 size = sizeof (char *);
9719ad41 1549 sv = bfd_malloc (size * count);
b49e97c9
TS
1550 if (sv == NULL)
1551 goto error_return;
1552
1553 count = hdr->isymMax;
1554 size = swap->external_sym_size;
9719ad41 1555 esym = bfd_malloc (size * count);
b49e97c9
TS
1556 if (esym == NULL)
1557 goto error_return;
1558
9719ad41 1559 if (! _bfd_ecoff_get_accumulated_sym (handle, (bfd_byte *) esym))
b49e97c9
TS
1560 goto error_return;
1561
1562 count = hdr->issMax;
9719ad41 1563 ss = bfd_malloc (count);
b49e97c9
TS
1564 if (ss == NULL)
1565 goto error_return;
f075ee0c 1566 if (! _bfd_ecoff_get_accumulated_ss (handle, (bfd_byte *) ss))
b49e97c9
TS
1567 goto error_return;
1568
1569 count = hdr->ipdMax;
1570 for (i = 0; i < (unsigned long) count; i++, rp++)
1571 {
9719ad41
RS
1572 (*swap->swap_pdr_in) (abfd, epdr + i, &pdr);
1573 (*swap->swap_sym_in) (abfd, &esym[pdr.isym], &sym);
b49e97c9
TS
1574 rp->adr = sym.value;
1575 rp->regmask = pdr.regmask;
1576 rp->regoffset = pdr.regoffset;
1577 rp->fregmask = pdr.fregmask;
1578 rp->fregoffset = pdr.fregoffset;
1579 rp->frameoffset = pdr.frameoffset;
1580 rp->framereg = pdr.framereg;
1581 rp->pcreg = pdr.pcreg;
1582 rp->irpss = sindex;
1583 sv[i] = ss + sym.iss;
1584 sindex += strlen (sv[i]) + 1;
1585 }
1586 }
1587
1588 size = sizeof (struct rpdr_ext) * (count + 2) + sindex;
1589 size = BFD_ALIGN (size, 16);
9719ad41 1590 rtproc = bfd_alloc (abfd, size);
b49e97c9
TS
1591 if (rtproc == NULL)
1592 {
1593 mips_elf_hash_table (info)->procedure_count = 0;
1594 goto error_return;
1595 }
1596
1597 mips_elf_hash_table (info)->procedure_count = count + 2;
1598
9719ad41 1599 erp = rtproc;
b49e97c9
TS
1600 memset (erp, 0, sizeof (struct rpdr_ext));
1601 erp++;
1602 str = (char *) rtproc + sizeof (struct rpdr_ext) * (count + 2);
1603 strcpy (str, no_name_func);
1604 str += strlen (no_name_func) + 1;
1605 for (i = 0; i < count; i++)
1606 {
1607 ecoff_swap_rpdr_out (abfd, rpdr + i, erp + i);
1608 strcpy (str, sv[i]);
1609 str += strlen (sv[i]) + 1;
1610 }
1611 H_PUT_S32 (abfd, -1, (erp + count)->p_adr);
1612
1613 /* Set the size and contents of .rtproc section. */
eea6121a 1614 s->size = size;
9719ad41 1615 s->contents = rtproc;
b49e97c9
TS
1616
1617 /* Skip this section later on (I don't think this currently
1618 matters, but someday it might). */
8423293d 1619 s->map_head.link_order = NULL;
b49e97c9
TS
1620
1621 if (epdr != NULL)
1622 free (epdr);
1623 if (rpdr != NULL)
1624 free (rpdr);
1625 if (esym != NULL)
1626 free (esym);
1627 if (ss != NULL)
1628 free (ss);
1629 if (sv != NULL)
1630 free (sv);
1631
b34976b6 1632 return TRUE;
b49e97c9
TS
1633
1634 error_return:
1635 if (epdr != NULL)
1636 free (epdr);
1637 if (rpdr != NULL)
1638 free (rpdr);
1639 if (esym != NULL)
1640 free (esym);
1641 if (ss != NULL)
1642 free (ss);
1643 if (sv != NULL)
1644 free (sv);
b34976b6 1645 return FALSE;
b49e97c9 1646}
738e5348 1647\f
861fb55a
DJ
1648/* We're going to create a stub for H. Create a symbol for the stub's
1649 value and size, to help make the disassembly easier to read. */
1650
1651static bfd_boolean
1652mips_elf_create_stub_symbol (struct bfd_link_info *info,
1653 struct mips_elf_link_hash_entry *h,
1654 const char *prefix, asection *s, bfd_vma value,
1655 bfd_vma size)
1656{
a848a227 1657 bfd_boolean micromips_p = ELF_ST_IS_MICROMIPS (h->root.other);
861fb55a
DJ
1658 struct bfd_link_hash_entry *bh;
1659 struct elf_link_hash_entry *elfh;
e1fa0163
NC
1660 char *name;
1661 bfd_boolean res;
861fb55a 1662
a848a227 1663 if (micromips_p)
df58fc94
RS
1664 value |= 1;
1665
861fb55a 1666 /* Create a new symbol. */
e1fa0163 1667 name = concat (prefix, h->root.root.root.string, NULL);
861fb55a 1668 bh = NULL;
e1fa0163
NC
1669 res = _bfd_generic_link_add_one_symbol (info, s->owner, name,
1670 BSF_LOCAL, s, value, NULL,
1671 TRUE, FALSE, &bh);
1672 free (name);
1673 if (! res)
861fb55a
DJ
1674 return FALSE;
1675
1676 /* Make it a local function. */
1677 elfh = (struct elf_link_hash_entry *) bh;
1678 elfh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
1679 elfh->size = size;
1680 elfh->forced_local = 1;
a848a227
MR
1681 if (micromips_p)
1682 elfh->other = ELF_ST_SET_MICROMIPS (elfh->other);
861fb55a
DJ
1683 return TRUE;
1684}
1685
738e5348
RS
1686/* We're about to redefine H. Create a symbol to represent H's
1687 current value and size, to help make the disassembly easier
1688 to read. */
1689
1690static bfd_boolean
1691mips_elf_create_shadow_symbol (struct bfd_link_info *info,
1692 struct mips_elf_link_hash_entry *h,
1693 const char *prefix)
1694{
1695 struct bfd_link_hash_entry *bh;
1696 struct elf_link_hash_entry *elfh;
e1fa0163 1697 char *name;
738e5348
RS
1698 asection *s;
1699 bfd_vma value;
e1fa0163 1700 bfd_boolean res;
738e5348
RS
1701
1702 /* Read the symbol's value. */
1703 BFD_ASSERT (h->root.root.type == bfd_link_hash_defined
1704 || h->root.root.type == bfd_link_hash_defweak);
1705 s = h->root.root.u.def.section;
1706 value = h->root.root.u.def.value;
1707
1708 /* Create a new symbol. */
e1fa0163 1709 name = concat (prefix, h->root.root.root.string, NULL);
738e5348 1710 bh = NULL;
e1fa0163
NC
1711 res = _bfd_generic_link_add_one_symbol (info, s->owner, name,
1712 BSF_LOCAL, s, value, NULL,
1713 TRUE, FALSE, &bh);
1714 free (name);
1715 if (! res)
738e5348
RS
1716 return FALSE;
1717
1718 /* Make it local and copy the other attributes from H. */
1719 elfh = (struct elf_link_hash_entry *) bh;
1720 elfh->type = ELF_ST_INFO (STB_LOCAL, ELF_ST_TYPE (h->root.type));
1721 elfh->other = h->root.other;
1722 elfh->size = h->root.size;
1723 elfh->forced_local = 1;
1724 return TRUE;
1725}
1726
1727/* Return TRUE if relocations in SECTION can refer directly to a MIPS16
1728 function rather than to a hard-float stub. */
1729
1730static bfd_boolean
1731section_allows_mips16_refs_p (asection *section)
1732{
1733 const char *name;
1734
fd361982 1735 name = bfd_section_name (section);
738e5348
RS
1736 return (FN_STUB_P (name)
1737 || CALL_STUB_P (name)
1738 || CALL_FP_STUB_P (name)
1739 || strcmp (name, ".pdr") == 0);
1740}
1741
1742/* [RELOCS, RELEND) are the relocations against SEC, which is a MIPS16
1743 stub section of some kind. Return the R_SYMNDX of the target
1744 function, or 0 if we can't decide which function that is. */
1745
1746static unsigned long
cb4437b8
MR
1747mips16_stub_symndx (const struct elf_backend_data *bed,
1748 asection *sec ATTRIBUTE_UNUSED,
502e814e 1749 const Elf_Internal_Rela *relocs,
738e5348
RS
1750 const Elf_Internal_Rela *relend)
1751{
cb4437b8 1752 int int_rels_per_ext_rel = bed->s->int_rels_per_ext_rel;
738e5348
RS
1753 const Elf_Internal_Rela *rel;
1754
cb4437b8
MR
1755 /* Trust the first R_MIPS_NONE relocation, if any, but not a subsequent
1756 one in a compound relocation. */
1757 for (rel = relocs; rel < relend; rel += int_rels_per_ext_rel)
738e5348
RS
1758 if (ELF_R_TYPE (sec->owner, rel->r_info) == R_MIPS_NONE)
1759 return ELF_R_SYM (sec->owner, rel->r_info);
1760
1761 /* Otherwise trust the first relocation, whatever its kind. This is
1762 the traditional behavior. */
1763 if (relocs < relend)
1764 return ELF_R_SYM (sec->owner, relocs->r_info);
1765
1766 return 0;
1767}
b49e97c9
TS
1768
1769/* Check the mips16 stubs for a particular symbol, and see if we can
1770 discard them. */
1771
861fb55a
DJ
1772static void
1773mips_elf_check_mips16_stubs (struct bfd_link_info *info,
1774 struct mips_elf_link_hash_entry *h)
b49e97c9 1775{
738e5348
RS
1776 /* Dynamic symbols must use the standard call interface, in case other
1777 objects try to call them. */
1778 if (h->fn_stub != NULL
1779 && h->root.dynindx != -1)
1780 {
1781 mips_elf_create_shadow_symbol (info, h, ".mips16.");
1782 h->need_fn_stub = TRUE;
1783 }
1784
b49e97c9
TS
1785 if (h->fn_stub != NULL
1786 && ! h->need_fn_stub)
1787 {
1788 /* We don't need the fn_stub; the only references to this symbol
07d6d2b8
AM
1789 are 16 bit calls. Clobber the size to 0 to prevent it from
1790 being included in the link. */
eea6121a 1791 h->fn_stub->size = 0;
b49e97c9
TS
1792 h->fn_stub->flags &= ~SEC_RELOC;
1793 h->fn_stub->reloc_count = 0;
1794 h->fn_stub->flags |= SEC_EXCLUDE;
ca9584fb 1795 h->fn_stub->output_section = bfd_abs_section_ptr;
b49e97c9
TS
1796 }
1797
1798 if (h->call_stub != NULL
30c09090 1799 && ELF_ST_IS_MIPS16 (h->root.other))
b49e97c9
TS
1800 {
1801 /* We don't need the call_stub; this is a 16 bit function, so
07d6d2b8
AM
1802 calls from other 16 bit functions are OK. Clobber the size
1803 to 0 to prevent it from being included in the link. */
eea6121a 1804 h->call_stub->size = 0;
b49e97c9
TS
1805 h->call_stub->flags &= ~SEC_RELOC;
1806 h->call_stub->reloc_count = 0;
1807 h->call_stub->flags |= SEC_EXCLUDE;
ca9584fb 1808 h->call_stub->output_section = bfd_abs_section_ptr;
b49e97c9
TS
1809 }
1810
1811 if (h->call_fp_stub != NULL
30c09090 1812 && ELF_ST_IS_MIPS16 (h->root.other))
b49e97c9
TS
1813 {
1814 /* We don't need the call_stub; this is a 16 bit function, so
07d6d2b8
AM
1815 calls from other 16 bit functions are OK. Clobber the size
1816 to 0 to prevent it from being included in the link. */
eea6121a 1817 h->call_fp_stub->size = 0;
b49e97c9
TS
1818 h->call_fp_stub->flags &= ~SEC_RELOC;
1819 h->call_fp_stub->reloc_count = 0;
1820 h->call_fp_stub->flags |= SEC_EXCLUDE;
ca9584fb 1821 h->call_fp_stub->output_section = bfd_abs_section_ptr;
b49e97c9 1822 }
861fb55a
DJ
1823}
1824
1825/* Hashtable callbacks for mips_elf_la25_stubs. */
1826
1827static hashval_t
1828mips_elf_la25_stub_hash (const void *entry_)
1829{
1830 const struct mips_elf_la25_stub *entry;
1831
1832 entry = (struct mips_elf_la25_stub *) entry_;
1833 return entry->h->root.root.u.def.section->id
1834 + entry->h->root.root.u.def.value;
1835}
1836
1837static int
1838mips_elf_la25_stub_eq (const void *entry1_, const void *entry2_)
1839{
1840 const struct mips_elf_la25_stub *entry1, *entry2;
1841
1842 entry1 = (struct mips_elf_la25_stub *) entry1_;
1843 entry2 = (struct mips_elf_la25_stub *) entry2_;
1844 return ((entry1->h->root.root.u.def.section
1845 == entry2->h->root.root.u.def.section)
1846 && (entry1->h->root.root.u.def.value
1847 == entry2->h->root.root.u.def.value));
1848}
1849
1850/* Called by the linker to set up the la25 stub-creation code. FN is
1851 the linker's implementation of add_stub_function. Return true on
1852 success. */
1853
1854bfd_boolean
1855_bfd_mips_elf_init_stubs (struct bfd_link_info *info,
1856 asection *(*fn) (const char *, asection *,
1857 asection *))
1858{
1859 struct mips_elf_link_hash_table *htab;
1860
1861 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
1862 if (htab == NULL)
1863 return FALSE;
1864
861fb55a
DJ
1865 htab->add_stub_section = fn;
1866 htab->la25_stubs = htab_try_create (1, mips_elf_la25_stub_hash,
1867 mips_elf_la25_stub_eq, NULL);
1868 if (htab->la25_stubs == NULL)
1869 return FALSE;
1870
1871 return TRUE;
1872}
1873
1874/* Return true if H is a locally-defined PIC function, in the sense
8f0c309a
CLT
1875 that it or its fn_stub might need $25 to be valid on entry.
1876 Note that MIPS16 functions set up $gp using PC-relative instructions,
1877 so they themselves never need $25 to be valid. Only non-MIPS16
1878 entry points are of interest here. */
861fb55a
DJ
1879
1880static bfd_boolean
1881mips_elf_local_pic_function_p (struct mips_elf_link_hash_entry *h)
1882{
1883 return ((h->root.root.type == bfd_link_hash_defined
1884 || h->root.root.type == bfd_link_hash_defweak)
1885 && h->root.def_regular
1886 && !bfd_is_abs_section (h->root.root.u.def.section)
f02cb058 1887 && !bfd_is_und_section (h->root.root.u.def.section)
8f0c309a
CLT
1888 && (!ELF_ST_IS_MIPS16 (h->root.other)
1889 || (h->fn_stub && h->need_fn_stub))
861fb55a
DJ
1890 && (PIC_OBJECT_P (h->root.root.u.def.section->owner)
1891 || ELF_ST_IS_MIPS_PIC (h->root.other)));
1892}
1893
8f0c309a
CLT
1894/* Set *SEC to the input section that contains the target of STUB.
1895 Return the offset of the target from the start of that section. */
1896
1897static bfd_vma
1898mips_elf_get_la25_target (struct mips_elf_la25_stub *stub,
1899 asection **sec)
1900{
1901 if (ELF_ST_IS_MIPS16 (stub->h->root.other))
1902 {
1903 BFD_ASSERT (stub->h->need_fn_stub);
1904 *sec = stub->h->fn_stub;
1905 return 0;
1906 }
1907 else
1908 {
1909 *sec = stub->h->root.root.u.def.section;
1910 return stub->h->root.root.u.def.value;
1911 }
1912}
1913
861fb55a
DJ
1914/* STUB describes an la25 stub that we have decided to implement
1915 by inserting an LUI/ADDIU pair before the target function.
1916 Create the section and redirect the function symbol to it. */
1917
1918static bfd_boolean
1919mips_elf_add_la25_intro (struct mips_elf_la25_stub *stub,
1920 struct bfd_link_info *info)
1921{
1922 struct mips_elf_link_hash_table *htab;
1923 char *name;
1924 asection *s, *input_section;
1925 unsigned int align;
1926
1927 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
1928 if (htab == NULL)
1929 return FALSE;
861fb55a
DJ
1930
1931 /* Create a unique name for the new section. */
1932 name = bfd_malloc (11 + sizeof (".text.stub."));
1933 if (name == NULL)
1934 return FALSE;
1935 sprintf (name, ".text.stub.%d", (int) htab_elements (htab->la25_stubs));
1936
1937 /* Create the section. */
8f0c309a 1938 mips_elf_get_la25_target (stub, &input_section);
861fb55a
DJ
1939 s = htab->add_stub_section (name, input_section,
1940 input_section->output_section);
1941 if (s == NULL)
1942 return FALSE;
1943
1944 /* Make sure that any padding goes before the stub. */
1945 align = input_section->alignment_power;
fd361982 1946 if (!bfd_set_section_alignment (s, align))
861fb55a
DJ
1947 return FALSE;
1948 if (align > 3)
1949 s->size = (1 << align) - 8;
1950
1951 /* Create a symbol for the stub. */
1952 mips_elf_create_stub_symbol (info, stub->h, ".pic.", s, s->size, 8);
1953 stub->stub_section = s;
1954 stub->offset = s->size;
1955
1956 /* Allocate room for it. */
1957 s->size += 8;
1958 return TRUE;
1959}
1960
1961/* STUB describes an la25 stub that we have decided to implement
1962 with a separate trampoline. Allocate room for it and redirect
1963 the function symbol to it. */
1964
1965static bfd_boolean
1966mips_elf_add_la25_trampoline (struct mips_elf_la25_stub *stub,
1967 struct bfd_link_info *info)
1968{
1969 struct mips_elf_link_hash_table *htab;
1970 asection *s;
1971
1972 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
1973 if (htab == NULL)
1974 return FALSE;
861fb55a
DJ
1975
1976 /* Create a trampoline section, if we haven't already. */
1977 s = htab->strampoline;
1978 if (s == NULL)
1979 {
1980 asection *input_section = stub->h->root.root.u.def.section;
1981 s = htab->add_stub_section (".text", NULL,
1982 input_section->output_section);
fd361982 1983 if (s == NULL || !bfd_set_section_alignment (s, 4))
861fb55a
DJ
1984 return FALSE;
1985 htab->strampoline = s;
1986 }
1987
1988 /* Create a symbol for the stub. */
1989 mips_elf_create_stub_symbol (info, stub->h, ".pic.", s, s->size, 16);
1990 stub->stub_section = s;
1991 stub->offset = s->size;
1992
1993 /* Allocate room for it. */
1994 s->size += 16;
1995 return TRUE;
1996}
1997
1998/* H describes a symbol that needs an la25 stub. Make sure that an
1999 appropriate stub exists and point H at it. */
2000
2001static bfd_boolean
2002mips_elf_add_la25_stub (struct bfd_link_info *info,
2003 struct mips_elf_link_hash_entry *h)
2004{
2005 struct mips_elf_link_hash_table *htab;
2006 struct mips_elf_la25_stub search, *stub;
2007 bfd_boolean use_trampoline_p;
2008 asection *s;
2009 bfd_vma value;
2010 void **slot;
2011
861fb55a
DJ
2012 /* Describe the stub we want. */
2013 search.stub_section = NULL;
2014 search.offset = 0;
2015 search.h = h;
2016
2017 /* See if we've already created an equivalent stub. */
2018 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
2019 if (htab == NULL)
2020 return FALSE;
2021
861fb55a
DJ
2022 slot = htab_find_slot (htab->la25_stubs, &search, INSERT);
2023 if (slot == NULL)
2024 return FALSE;
2025
2026 stub = (struct mips_elf_la25_stub *) *slot;
2027 if (stub != NULL)
2028 {
2029 /* We can reuse the existing stub. */
2030 h->la25_stub = stub;
2031 return TRUE;
2032 }
2033
2034 /* Create a permanent copy of ENTRY and add it to the hash table. */
2035 stub = bfd_malloc (sizeof (search));
2036 if (stub == NULL)
2037 return FALSE;
2038 *stub = search;
2039 *slot = stub;
2040
8f0c309a
CLT
2041 /* Prefer to use LUI/ADDIU stubs if the function is at the beginning
2042 of the section and if we would need no more than 2 nops. */
2043 value = mips_elf_get_la25_target (stub, &s);
fe152e64
MR
2044 if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
2045 value &= ~1;
8f0c309a
CLT
2046 use_trampoline_p = (value != 0 || s->alignment_power > 4);
2047
861fb55a
DJ
2048 h->la25_stub = stub;
2049 return (use_trampoline_p
2050 ? mips_elf_add_la25_trampoline (stub, info)
2051 : mips_elf_add_la25_intro (stub, info));
2052}
2053
2054/* A mips_elf_link_hash_traverse callback that is called before sizing
2055 sections. DATA points to a mips_htab_traverse_info structure. */
2056
2057static bfd_boolean
2058mips_elf_check_symbols (struct mips_elf_link_hash_entry *h, void *data)
2059{
2060 struct mips_htab_traverse_info *hti;
2061
2062 hti = (struct mips_htab_traverse_info *) data;
0e1862bb 2063 if (!bfd_link_relocatable (hti->info))
861fb55a 2064 mips_elf_check_mips16_stubs (hti->info, h);
b49e97c9 2065
861fb55a
DJ
2066 if (mips_elf_local_pic_function_p (h))
2067 {
ba85c43e
NC
2068 /* PR 12845: If H is in a section that has been garbage
2069 collected it will have its output section set to *ABS*. */
2070 if (bfd_is_abs_section (h->root.root.u.def.section->output_section))
2071 return TRUE;
2072
861fb55a
DJ
2073 /* H is a function that might need $25 to be valid on entry.
2074 If we're creating a non-PIC relocatable object, mark H as
2075 being PIC. If we're creating a non-relocatable object with
2076 non-PIC branches and jumps to H, make sure that H has an la25
2077 stub. */
0e1862bb 2078 if (bfd_link_relocatable (hti->info))
861fb55a
DJ
2079 {
2080 if (!PIC_OBJECT_P (hti->output_bfd))
2081 h->root.other = ELF_ST_SET_MIPS_PIC (h->root.other);
2082 }
2083 else if (h->has_nonpic_branches && !mips_elf_add_la25_stub (hti->info, h))
2084 {
2085 hti->error = TRUE;
2086 return FALSE;
2087 }
2088 }
b34976b6 2089 return TRUE;
b49e97c9
TS
2090}
2091\f
d6f16593
MR
2092/* R_MIPS16_26 is used for the mips16 jal and jalx instructions.
2093 Most mips16 instructions are 16 bits, but these instructions
2094 are 32 bits.
2095
2096 The format of these instructions is:
2097
2098 +--------------+--------------------------------+
2099 | JALX | X| Imm 20:16 | Imm 25:21 |
2100 +--------------+--------------------------------+
07d6d2b8 2101 | Immediate 15:0 |
d6f16593
MR
2102 +-----------------------------------------------+
2103
2104 JALX is the 5-bit value 00011. X is 0 for jal, 1 for jalx.
2105 Note that the immediate value in the first word is swapped.
2106
2107 When producing a relocatable object file, R_MIPS16_26 is
2108 handled mostly like R_MIPS_26. In particular, the addend is
2109 stored as a straight 26-bit value in a 32-bit instruction.
2110 (gas makes life simpler for itself by never adjusting a
2111 R_MIPS16_26 reloc to be against a section, so the addend is
2112 always zero). However, the 32 bit instruction is stored as 2
2113 16-bit values, rather than a single 32-bit value. In a
2114 big-endian file, the result is the same; in a little-endian
2115 file, the two 16-bit halves of the 32 bit value are swapped.
2116 This is so that a disassembler can recognize the jal
2117 instruction.
2118
2119 When doing a final link, R_MIPS16_26 is treated as a 32 bit
2120 instruction stored as two 16-bit values. The addend A is the
2121 contents of the targ26 field. The calculation is the same as
2122 R_MIPS_26. When storing the calculated value, reorder the
2123 immediate value as shown above, and don't forget to store the
2124 value as two 16-bit values.
2125
2126 To put it in MIPS ABI terms, the relocation field is T-targ26-16,
2127 defined as
2128
2129 big-endian:
2130 +--------+----------------------+
07d6d2b8
AM
2131 | | |
2132 | | targ26-16 |
2133 |31 26|25 0|
d6f16593
MR
2134 +--------+----------------------+
2135
2136 little-endian:
2137 +----------+------+-------------+
07d6d2b8
AM
2138 | | | |
2139 | sub1 | | sub2 |
2140 |0 9|10 15|16 31|
d6f16593
MR
2141 +----------+--------------------+
2142 where targ26-16 is sub1 followed by sub2 (i.e., the addend field A is
2143 ((sub1 << 16) | sub2)).
2144
2145 When producing a relocatable object file, the calculation is
2146 (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
2147 When producing a fully linked file, the calculation is
2148 let R = (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
2149 ((R & 0x1f0000) << 5) | ((R & 0x3e00000) >> 5) | (R & 0xffff)
2150
738e5348
RS
2151 The table below lists the other MIPS16 instruction relocations.
2152 Each one is calculated in the same way as the non-MIPS16 relocation
2153 given on the right, but using the extended MIPS16 layout of 16-bit
2154 immediate fields:
2155
2156 R_MIPS16_GPREL R_MIPS_GPREL16
2157 R_MIPS16_GOT16 R_MIPS_GOT16
2158 R_MIPS16_CALL16 R_MIPS_CALL16
2159 R_MIPS16_HI16 R_MIPS_HI16
2160 R_MIPS16_LO16 R_MIPS_LO16
2161
2162 A typical instruction will have a format like this:
d6f16593
MR
2163
2164 +--------------+--------------------------------+
2165 | EXTEND | Imm 10:5 | Imm 15:11 |
2166 +--------------+--------------------------------+
2167 | Major | rx | ry | Imm 4:0 |
2168 +--------------+--------------------------------+
2169
2170 EXTEND is the five bit value 11110. Major is the instruction
2171 opcode.
2172
738e5348
RS
2173 All we need to do here is shuffle the bits appropriately.
2174 As above, the two 16-bit halves must be swapped on a
c9775dde
MR
2175 little-endian system.
2176
2177 Finally R_MIPS16_PC16_S1 corresponds to R_MIPS_PC16, however the
2178 relocatable field is shifted by 1 rather than 2 and the same bit
2179 shuffling is done as with the relocations above. */
738e5348
RS
2180
2181static inline bfd_boolean
2182mips16_reloc_p (int r_type)
2183{
2184 switch (r_type)
2185 {
2186 case R_MIPS16_26:
2187 case R_MIPS16_GPREL:
2188 case R_MIPS16_GOT16:
2189 case R_MIPS16_CALL16:
2190 case R_MIPS16_HI16:
2191 case R_MIPS16_LO16:
d0f13682
CLT
2192 case R_MIPS16_TLS_GD:
2193 case R_MIPS16_TLS_LDM:
2194 case R_MIPS16_TLS_DTPREL_HI16:
2195 case R_MIPS16_TLS_DTPREL_LO16:
2196 case R_MIPS16_TLS_GOTTPREL:
2197 case R_MIPS16_TLS_TPREL_HI16:
2198 case R_MIPS16_TLS_TPREL_LO16:
c9775dde 2199 case R_MIPS16_PC16_S1:
738e5348
RS
2200 return TRUE;
2201
2202 default:
2203 return FALSE;
2204 }
2205}
2206
df58fc94
RS
2207/* Check if a microMIPS reloc. */
2208
2209static inline bfd_boolean
2210micromips_reloc_p (unsigned int r_type)
2211{
2212 return r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max;
2213}
2214
2215/* Similar to MIPS16, the two 16-bit halves in microMIPS must be swapped
2216 on a little-endian system. This does not apply to R_MICROMIPS_PC7_S1
2217 and R_MICROMIPS_PC10_S1 relocs that apply to 16-bit instructions. */
2218
2219static inline bfd_boolean
2220micromips_reloc_shuffle_p (unsigned int r_type)
2221{
2222 return (micromips_reloc_p (r_type)
2223 && r_type != R_MICROMIPS_PC7_S1
2224 && r_type != R_MICROMIPS_PC10_S1);
2225}
2226
738e5348
RS
2227static inline bfd_boolean
2228got16_reloc_p (int r_type)
2229{
df58fc94
RS
2230 return (r_type == R_MIPS_GOT16
2231 || r_type == R_MIPS16_GOT16
2232 || r_type == R_MICROMIPS_GOT16);
738e5348
RS
2233}
2234
2235static inline bfd_boolean
2236call16_reloc_p (int r_type)
2237{
df58fc94
RS
2238 return (r_type == R_MIPS_CALL16
2239 || r_type == R_MIPS16_CALL16
2240 || r_type == R_MICROMIPS_CALL16);
2241}
2242
2243static inline bfd_boolean
2244got_disp_reloc_p (unsigned int r_type)
2245{
2246 return r_type == R_MIPS_GOT_DISP || r_type == R_MICROMIPS_GOT_DISP;
2247}
2248
2249static inline bfd_boolean
2250got_page_reloc_p (unsigned int r_type)
2251{
2252 return r_type == R_MIPS_GOT_PAGE || r_type == R_MICROMIPS_GOT_PAGE;
2253}
2254
df58fc94
RS
2255static inline bfd_boolean
2256got_lo16_reloc_p (unsigned int r_type)
2257{
2258 return r_type == R_MIPS_GOT_LO16 || r_type == R_MICROMIPS_GOT_LO16;
2259}
2260
2261static inline bfd_boolean
2262call_hi16_reloc_p (unsigned int r_type)
2263{
2264 return r_type == R_MIPS_CALL_HI16 || r_type == R_MICROMIPS_CALL_HI16;
2265}
2266
2267static inline bfd_boolean
2268call_lo16_reloc_p (unsigned int r_type)
2269{
2270 return r_type == R_MIPS_CALL_LO16 || r_type == R_MICROMIPS_CALL_LO16;
738e5348
RS
2271}
2272
2273static inline bfd_boolean
2274hi16_reloc_p (int r_type)
2275{
df58fc94
RS
2276 return (r_type == R_MIPS_HI16
2277 || r_type == R_MIPS16_HI16
7361da2c
AB
2278 || r_type == R_MICROMIPS_HI16
2279 || r_type == R_MIPS_PCHI16);
738e5348 2280}
d6f16593 2281
738e5348
RS
2282static inline bfd_boolean
2283lo16_reloc_p (int r_type)
2284{
df58fc94
RS
2285 return (r_type == R_MIPS_LO16
2286 || r_type == R_MIPS16_LO16
7361da2c
AB
2287 || r_type == R_MICROMIPS_LO16
2288 || r_type == R_MIPS_PCLO16);
738e5348
RS
2289}
2290
2291static inline bfd_boolean
2292mips16_call_reloc_p (int r_type)
2293{
2294 return r_type == R_MIPS16_26 || r_type == R_MIPS16_CALL16;
2295}
d6f16593 2296
38a7df63
CF
2297static inline bfd_boolean
2298jal_reloc_p (int r_type)
2299{
df58fc94
RS
2300 return (r_type == R_MIPS_26
2301 || r_type == R_MIPS16_26
2302 || r_type == R_MICROMIPS_26_S1);
2303}
2304
99aefae6
MR
2305static inline bfd_boolean
2306b_reloc_p (int r_type)
2307{
2308 return (r_type == R_MIPS_PC26_S2
2309 || r_type == R_MIPS_PC21_S2
2310 || r_type == R_MIPS_PC16
c9775dde 2311 || r_type == R_MIPS_GNU_REL16_S2
9d862524
MR
2312 || r_type == R_MIPS16_PC16_S1
2313 || r_type == R_MICROMIPS_PC16_S1
2314 || r_type == R_MICROMIPS_PC10_S1
2315 || r_type == R_MICROMIPS_PC7_S1);
99aefae6
MR
2316}
2317
7361da2c
AB
2318static inline bfd_boolean
2319aligned_pcrel_reloc_p (int r_type)
2320{
2321 return (r_type == R_MIPS_PC18_S3
2322 || r_type == R_MIPS_PC19_S2);
2323}
2324
9d862524
MR
2325static inline bfd_boolean
2326branch_reloc_p (int r_type)
2327{
2328 return (r_type == R_MIPS_26
2329 || r_type == R_MIPS_PC26_S2
2330 || r_type == R_MIPS_PC21_S2
2331 || r_type == R_MIPS_PC16
2332 || r_type == R_MIPS_GNU_REL16_S2);
2333}
2334
c9775dde
MR
2335static inline bfd_boolean
2336mips16_branch_reloc_p (int r_type)
2337{
2338 return (r_type == R_MIPS16_26
2339 || r_type == R_MIPS16_PC16_S1);
2340}
2341
df58fc94
RS
2342static inline bfd_boolean
2343micromips_branch_reloc_p (int r_type)
2344{
2345 return (r_type == R_MICROMIPS_26_S1
2346 || r_type == R_MICROMIPS_PC16_S1
2347 || r_type == R_MICROMIPS_PC10_S1
2348 || r_type == R_MICROMIPS_PC7_S1);
2349}
2350
2351static inline bfd_boolean
2352tls_gd_reloc_p (unsigned int r_type)
2353{
d0f13682
CLT
2354 return (r_type == R_MIPS_TLS_GD
2355 || r_type == R_MIPS16_TLS_GD
2356 || r_type == R_MICROMIPS_TLS_GD);
df58fc94
RS
2357}
2358
2359static inline bfd_boolean
2360tls_ldm_reloc_p (unsigned int r_type)
2361{
d0f13682
CLT
2362 return (r_type == R_MIPS_TLS_LDM
2363 || r_type == R_MIPS16_TLS_LDM
2364 || r_type == R_MICROMIPS_TLS_LDM);
df58fc94
RS
2365}
2366
2367static inline bfd_boolean
2368tls_gottprel_reloc_p (unsigned int r_type)
2369{
d0f13682
CLT
2370 return (r_type == R_MIPS_TLS_GOTTPREL
2371 || r_type == R_MIPS16_TLS_GOTTPREL
2372 || r_type == R_MICROMIPS_TLS_GOTTPREL);
38a7df63
CF
2373}
2374
d6f16593 2375void
df58fc94
RS
2376_bfd_mips_elf_reloc_unshuffle (bfd *abfd, int r_type,
2377 bfd_boolean jal_shuffle, bfd_byte *data)
d6f16593 2378{
df58fc94 2379 bfd_vma first, second, val;
d6f16593 2380
df58fc94 2381 if (!mips16_reloc_p (r_type) && !micromips_reloc_shuffle_p (r_type))
d6f16593
MR
2382 return;
2383
df58fc94
RS
2384 /* Pick up the first and second halfwords of the instruction. */
2385 first = bfd_get_16 (abfd, data);
2386 second = bfd_get_16 (abfd, data + 2);
2387 if (micromips_reloc_p (r_type) || (r_type == R_MIPS16_26 && !jal_shuffle))
2388 val = first << 16 | second;
2389 else if (r_type != R_MIPS16_26)
2390 val = (((first & 0xf800) << 16) | ((second & 0xffe0) << 11)
2391 | ((first & 0x1f) << 11) | (first & 0x7e0) | (second & 0x1f));
d6f16593 2392 else
df58fc94
RS
2393 val = (((first & 0xfc00) << 16) | ((first & 0x3e0) << 11)
2394 | ((first & 0x1f) << 21) | second);
d6f16593
MR
2395 bfd_put_32 (abfd, val, data);
2396}
2397
2398void
df58fc94
RS
2399_bfd_mips_elf_reloc_shuffle (bfd *abfd, int r_type,
2400 bfd_boolean jal_shuffle, bfd_byte *data)
d6f16593 2401{
df58fc94 2402 bfd_vma first, second, val;
d6f16593 2403
df58fc94 2404 if (!mips16_reloc_p (r_type) && !micromips_reloc_shuffle_p (r_type))
d6f16593
MR
2405 return;
2406
2407 val = bfd_get_32 (abfd, data);
df58fc94 2408 if (micromips_reloc_p (r_type) || (r_type == R_MIPS16_26 && !jal_shuffle))
d6f16593 2409 {
df58fc94
RS
2410 second = val & 0xffff;
2411 first = val >> 16;
2412 }
2413 else if (r_type != R_MIPS16_26)
2414 {
2415 second = ((val >> 11) & 0xffe0) | (val & 0x1f);
2416 first = ((val >> 16) & 0xf800) | ((val >> 11) & 0x1f) | (val & 0x7e0);
d6f16593
MR
2417 }
2418 else
2419 {
df58fc94
RS
2420 second = val & 0xffff;
2421 first = ((val >> 16) & 0xfc00) | ((val >> 11) & 0x3e0)
2422 | ((val >> 21) & 0x1f);
d6f16593 2423 }
df58fc94
RS
2424 bfd_put_16 (abfd, second, data + 2);
2425 bfd_put_16 (abfd, first, data);
d6f16593
MR
2426}
2427
b49e97c9 2428bfd_reloc_status_type
9719ad41
RS
2429_bfd_mips_elf_gprel16_with_gp (bfd *abfd, asymbol *symbol,
2430 arelent *reloc_entry, asection *input_section,
2431 bfd_boolean relocatable, void *data, bfd_vma gp)
b49e97c9
TS
2432{
2433 bfd_vma relocation;
a7ebbfdf 2434 bfd_signed_vma val;
30ac9238 2435 bfd_reloc_status_type status;
b49e97c9
TS
2436
2437 if (bfd_is_com_section (symbol->section))
2438 relocation = 0;
2439 else
2440 relocation = symbol->value;
2441
2442 relocation += symbol->section->output_section->vma;
2443 relocation += symbol->section->output_offset;
2444
07515404 2445 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
b49e97c9
TS
2446 return bfd_reloc_outofrange;
2447
b49e97c9 2448 /* Set val to the offset into the section or symbol. */
a7ebbfdf
TS
2449 val = reloc_entry->addend;
2450
30ac9238 2451 _bfd_mips_elf_sign_extend (val, 16);
a7ebbfdf 2452
b49e97c9 2453 /* Adjust val for the final section location and GP value. If we
1049f94e 2454 are producing relocatable output, we don't want to do this for
b49e97c9 2455 an external symbol. */
1049f94e 2456 if (! relocatable
b49e97c9
TS
2457 || (symbol->flags & BSF_SECTION_SYM) != 0)
2458 val += relocation - gp;
2459
a7ebbfdf
TS
2460 if (reloc_entry->howto->partial_inplace)
2461 {
30ac9238
RS
2462 status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
2463 (bfd_byte *) data
2464 + reloc_entry->address);
2465 if (status != bfd_reloc_ok)
2466 return status;
a7ebbfdf
TS
2467 }
2468 else
2469 reloc_entry->addend = val;
b49e97c9 2470
1049f94e 2471 if (relocatable)
b49e97c9 2472 reloc_entry->address += input_section->output_offset;
30ac9238
RS
2473
2474 return bfd_reloc_ok;
2475}
2476
2477/* Used to store a REL high-part relocation such as R_MIPS_HI16 or
2478 R_MIPS_GOT16. REL is the relocation, INPUT_SECTION is the section
2479 that contains the relocation field and DATA points to the start of
2480 INPUT_SECTION. */
2481
2482struct mips_hi16
2483{
2484 struct mips_hi16 *next;
2485 bfd_byte *data;
2486 asection *input_section;
2487 arelent rel;
2488};
2489
2490/* FIXME: This should not be a static variable. */
2491
2492static struct mips_hi16 *mips_hi16_list;
2493
2494/* A howto special_function for REL *HI16 relocations. We can only
2495 calculate the correct value once we've seen the partnering
2496 *LO16 relocation, so just save the information for later.
2497
2498 The ABI requires that the *LO16 immediately follow the *HI16.
2499 However, as a GNU extension, we permit an arbitrary number of
2500 *HI16s to be associated with a single *LO16. This significantly
2501 simplies the relocation handling in gcc. */
2502
2503bfd_reloc_status_type
2504_bfd_mips_elf_hi16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2505 asymbol *symbol ATTRIBUTE_UNUSED, void *data,
2506 asection *input_section, bfd *output_bfd,
2507 char **error_message ATTRIBUTE_UNUSED)
2508{
2509 struct mips_hi16 *n;
2510
07515404 2511 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
30ac9238
RS
2512 return bfd_reloc_outofrange;
2513
2514 n = bfd_malloc (sizeof *n);
2515 if (n == NULL)
2516 return bfd_reloc_outofrange;
2517
2518 n->next = mips_hi16_list;
2519 n->data = data;
2520 n->input_section = input_section;
2521 n->rel = *reloc_entry;
2522 mips_hi16_list = n;
2523
2524 if (output_bfd != NULL)
2525 reloc_entry->address += input_section->output_offset;
2526
2527 return bfd_reloc_ok;
2528}
2529
738e5348 2530/* A howto special_function for REL R_MIPS*_GOT16 relocations. This is just
30ac9238
RS
2531 like any other 16-bit relocation when applied to global symbols, but is
2532 treated in the same as R_MIPS_HI16 when applied to local symbols. */
2533
2534bfd_reloc_status_type
2535_bfd_mips_elf_got16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2536 void *data, asection *input_section,
2537 bfd *output_bfd, char **error_message)
2538{
2539 if ((symbol->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
e6f7f6d1
AM
2540 || bfd_is_und_section (bfd_asymbol_section (symbol))
2541 || bfd_is_com_section (bfd_asymbol_section (symbol)))
30ac9238
RS
2542 /* The relocation is against a global symbol. */
2543 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2544 input_section, output_bfd,
2545 error_message);
2546
2547 return _bfd_mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
2548 input_section, output_bfd, error_message);
2549}
2550
2551/* A howto special_function for REL *LO16 relocations. The *LO16 itself
2552 is a straightforward 16 bit inplace relocation, but we must deal with
2553 any partnering high-part relocations as well. */
2554
2555bfd_reloc_status_type
2556_bfd_mips_elf_lo16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2557 void *data, asection *input_section,
2558 bfd *output_bfd, char **error_message)
2559{
2560 bfd_vma vallo;
d6f16593 2561 bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
30ac9238 2562
07515404 2563 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
30ac9238
RS
2564 return bfd_reloc_outofrange;
2565
df58fc94 2566 _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
d6f16593 2567 location);
df58fc94
RS
2568 vallo = bfd_get_32 (abfd, location);
2569 _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, FALSE,
2570 location);
d6f16593 2571
30ac9238
RS
2572 while (mips_hi16_list != NULL)
2573 {
2574 bfd_reloc_status_type ret;
2575 struct mips_hi16 *hi;
2576
2577 hi = mips_hi16_list;
2578
738e5348
RS
2579 /* R_MIPS*_GOT16 relocations are something of a special case. We
2580 want to install the addend in the same way as for a R_MIPS*_HI16
30ac9238
RS
2581 relocation (with a rightshift of 16). However, since GOT16
2582 relocations can also be used with global symbols, their howto
2583 has a rightshift of 0. */
2584 if (hi->rel.howto->type == R_MIPS_GOT16)
2585 hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MIPS_HI16, FALSE);
738e5348
RS
2586 else if (hi->rel.howto->type == R_MIPS16_GOT16)
2587 hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MIPS16_HI16, FALSE);
df58fc94
RS
2588 else if (hi->rel.howto->type == R_MICROMIPS_GOT16)
2589 hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MICROMIPS_HI16, FALSE);
30ac9238
RS
2590
2591 /* VALLO is a signed 16-bit number. Bias it by 0x8000 so that any
2592 carry or borrow will induce a change of +1 or -1 in the high part. */
2593 hi->rel.addend += (vallo + 0x8000) & 0xffff;
2594
30ac9238
RS
2595 ret = _bfd_mips_elf_generic_reloc (abfd, &hi->rel, symbol, hi->data,
2596 hi->input_section, output_bfd,
2597 error_message);
2598 if (ret != bfd_reloc_ok)
2599 return ret;
2600
2601 mips_hi16_list = hi->next;
2602 free (hi);
2603 }
2604
2605 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2606 input_section, output_bfd,
2607 error_message);
2608}
2609
2610/* A generic howto special_function. This calculates and installs the
2611 relocation itself, thus avoiding the oft-discussed problems in
2612 bfd_perform_relocation and bfd_install_relocation. */
2613
2614bfd_reloc_status_type
2615_bfd_mips_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2616 asymbol *symbol, void *data ATTRIBUTE_UNUSED,
2617 asection *input_section, bfd *output_bfd,
2618 char **error_message ATTRIBUTE_UNUSED)
2619{
2620 bfd_signed_vma val;
2621 bfd_reloc_status_type status;
2622 bfd_boolean relocatable;
2623
2624 relocatable = (output_bfd != NULL);
2625
07515404 2626 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
30ac9238
RS
2627 return bfd_reloc_outofrange;
2628
2629 /* Build up the field adjustment in VAL. */
2630 val = 0;
2631 if (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0)
2632 {
2633 /* Either we're calculating the final field value or we have a
2634 relocation against a section symbol. Add in the section's
2635 offset or address. */
2636 val += symbol->section->output_section->vma;
2637 val += symbol->section->output_offset;
2638 }
2639
2640 if (!relocatable)
2641 {
2642 /* We're calculating the final field value. Add in the symbol's value
2643 and, if pc-relative, subtract the address of the field itself. */
2644 val += symbol->value;
2645 if (reloc_entry->howto->pc_relative)
2646 {
2647 val -= input_section->output_section->vma;
2648 val -= input_section->output_offset;
2649 val -= reloc_entry->address;
2650 }
2651 }
2652
2653 /* VAL is now the final adjustment. If we're keeping this relocation
2654 in the output file, and if the relocation uses a separate addend,
2655 we just need to add VAL to that addend. Otherwise we need to add
2656 VAL to the relocation field itself. */
2657 if (relocatable && !reloc_entry->howto->partial_inplace)
2658 reloc_entry->addend += val;
2659 else
2660 {
d6f16593
MR
2661 bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
2662
30ac9238
RS
2663 /* Add in the separate addend, if any. */
2664 val += reloc_entry->addend;
2665
2666 /* Add VAL to the relocation field. */
df58fc94
RS
2667 _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
2668 location);
30ac9238 2669 status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
d6f16593 2670 location);
df58fc94
RS
2671 _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, FALSE,
2672 location);
d6f16593 2673
30ac9238
RS
2674 if (status != bfd_reloc_ok)
2675 return status;
2676 }
2677
2678 if (relocatable)
2679 reloc_entry->address += input_section->output_offset;
b49e97c9
TS
2680
2681 return bfd_reloc_ok;
2682}
2683\f
2684/* Swap an entry in a .gptab section. Note that these routines rely
2685 on the equivalence of the two elements of the union. */
2686
2687static void
9719ad41
RS
2688bfd_mips_elf32_swap_gptab_in (bfd *abfd, const Elf32_External_gptab *ex,
2689 Elf32_gptab *in)
b49e97c9
TS
2690{
2691 in->gt_entry.gt_g_value = H_GET_32 (abfd, ex->gt_entry.gt_g_value);
2692 in->gt_entry.gt_bytes = H_GET_32 (abfd, ex->gt_entry.gt_bytes);
2693}
2694
2695static void
9719ad41
RS
2696bfd_mips_elf32_swap_gptab_out (bfd *abfd, const Elf32_gptab *in,
2697 Elf32_External_gptab *ex)
b49e97c9
TS
2698{
2699 H_PUT_32 (abfd, in->gt_entry.gt_g_value, ex->gt_entry.gt_g_value);
2700 H_PUT_32 (abfd, in->gt_entry.gt_bytes, ex->gt_entry.gt_bytes);
2701}
2702
2703static void
9719ad41
RS
2704bfd_elf32_swap_compact_rel_out (bfd *abfd, const Elf32_compact_rel *in,
2705 Elf32_External_compact_rel *ex)
b49e97c9
TS
2706{
2707 H_PUT_32 (abfd, in->id1, ex->id1);
2708 H_PUT_32 (abfd, in->num, ex->num);
2709 H_PUT_32 (abfd, in->id2, ex->id2);
2710 H_PUT_32 (abfd, in->offset, ex->offset);
2711 H_PUT_32 (abfd, in->reserved0, ex->reserved0);
2712 H_PUT_32 (abfd, in->reserved1, ex->reserved1);
2713}
2714
2715static void
9719ad41
RS
2716bfd_elf32_swap_crinfo_out (bfd *abfd, const Elf32_crinfo *in,
2717 Elf32_External_crinfo *ex)
b49e97c9
TS
2718{
2719 unsigned long l;
2720
2721 l = (((in->ctype & CRINFO_CTYPE) << CRINFO_CTYPE_SH)
2722 | ((in->rtype & CRINFO_RTYPE) << CRINFO_RTYPE_SH)
2723 | ((in->dist2to & CRINFO_DIST2TO) << CRINFO_DIST2TO_SH)
2724 | ((in->relvaddr & CRINFO_RELVADDR) << CRINFO_RELVADDR_SH));
2725 H_PUT_32 (abfd, l, ex->info);
2726 H_PUT_32 (abfd, in->konst, ex->konst);
2727 H_PUT_32 (abfd, in->vaddr, ex->vaddr);
2728}
b49e97c9
TS
2729\f
2730/* A .reginfo section holds a single Elf32_RegInfo structure. These
2731 routines swap this structure in and out. They are used outside of
2732 BFD, so they are globally visible. */
2733
2734void
9719ad41
RS
2735bfd_mips_elf32_swap_reginfo_in (bfd *abfd, const Elf32_External_RegInfo *ex,
2736 Elf32_RegInfo *in)
b49e97c9
TS
2737{
2738 in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
2739 in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
2740 in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
2741 in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
2742 in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
2743 in->ri_gp_value = H_GET_32 (abfd, ex->ri_gp_value);
2744}
2745
2746void
9719ad41
RS
2747bfd_mips_elf32_swap_reginfo_out (bfd *abfd, const Elf32_RegInfo *in,
2748 Elf32_External_RegInfo *ex)
b49e97c9
TS
2749{
2750 H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
2751 H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
2752 H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
2753 H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
2754 H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
2755 H_PUT_32 (abfd, in->ri_gp_value, ex->ri_gp_value);
2756}
2757
2758/* In the 64 bit ABI, the .MIPS.options section holds register
2759 information in an Elf64_Reginfo structure. These routines swap
2760 them in and out. They are globally visible because they are used
2761 outside of BFD. These routines are here so that gas can call them
2762 without worrying about whether the 64 bit ABI has been included. */
2763
2764void
9719ad41
RS
2765bfd_mips_elf64_swap_reginfo_in (bfd *abfd, const Elf64_External_RegInfo *ex,
2766 Elf64_Internal_RegInfo *in)
b49e97c9
TS
2767{
2768 in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
2769 in->ri_pad = H_GET_32 (abfd, ex->ri_pad);
2770 in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
2771 in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
2772 in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
2773 in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
2774 in->ri_gp_value = H_GET_64 (abfd, ex->ri_gp_value);
2775}
2776
2777void
9719ad41
RS
2778bfd_mips_elf64_swap_reginfo_out (bfd *abfd, const Elf64_Internal_RegInfo *in,
2779 Elf64_External_RegInfo *ex)
b49e97c9
TS
2780{
2781 H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
2782 H_PUT_32 (abfd, in->ri_pad, ex->ri_pad);
2783 H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
2784 H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
2785 H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
2786 H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
2787 H_PUT_64 (abfd, in->ri_gp_value, ex->ri_gp_value);
2788}
2789
2790/* Swap in an options header. */
2791
2792void
9719ad41
RS
2793bfd_mips_elf_swap_options_in (bfd *abfd, const Elf_External_Options *ex,
2794 Elf_Internal_Options *in)
b49e97c9
TS
2795{
2796 in->kind = H_GET_8 (abfd, ex->kind);
2797 in->size = H_GET_8 (abfd, ex->size);
2798 in->section = H_GET_16 (abfd, ex->section);
2799 in->info = H_GET_32 (abfd, ex->info);
2800}
2801
2802/* Swap out an options header. */
2803
2804void
9719ad41
RS
2805bfd_mips_elf_swap_options_out (bfd *abfd, const Elf_Internal_Options *in,
2806 Elf_External_Options *ex)
b49e97c9
TS
2807{
2808 H_PUT_8 (abfd, in->kind, ex->kind);
2809 H_PUT_8 (abfd, in->size, ex->size);
2810 H_PUT_16 (abfd, in->section, ex->section);
2811 H_PUT_32 (abfd, in->info, ex->info);
2812}
351cdf24
MF
2813
2814/* Swap in an abiflags structure. */
2815
2816void
2817bfd_mips_elf_swap_abiflags_v0_in (bfd *abfd,
2818 const Elf_External_ABIFlags_v0 *ex,
2819 Elf_Internal_ABIFlags_v0 *in)
2820{
2821 in->version = H_GET_16 (abfd, ex->version);
2822 in->isa_level = H_GET_8 (abfd, ex->isa_level);
2823 in->isa_rev = H_GET_8 (abfd, ex->isa_rev);
2824 in->gpr_size = H_GET_8 (abfd, ex->gpr_size);
2825 in->cpr1_size = H_GET_8 (abfd, ex->cpr1_size);
2826 in->cpr2_size = H_GET_8 (abfd, ex->cpr2_size);
2827 in->fp_abi = H_GET_8 (abfd, ex->fp_abi);
2828 in->isa_ext = H_GET_32 (abfd, ex->isa_ext);
2829 in->ases = H_GET_32 (abfd, ex->ases);
2830 in->flags1 = H_GET_32 (abfd, ex->flags1);
2831 in->flags2 = H_GET_32 (abfd, ex->flags2);
2832}
2833
2834/* Swap out an abiflags structure. */
2835
2836void
2837bfd_mips_elf_swap_abiflags_v0_out (bfd *abfd,
2838 const Elf_Internal_ABIFlags_v0 *in,
2839 Elf_External_ABIFlags_v0 *ex)
2840{
2841 H_PUT_16 (abfd, in->version, ex->version);
2842 H_PUT_8 (abfd, in->isa_level, ex->isa_level);
2843 H_PUT_8 (abfd, in->isa_rev, ex->isa_rev);
2844 H_PUT_8 (abfd, in->gpr_size, ex->gpr_size);
2845 H_PUT_8 (abfd, in->cpr1_size, ex->cpr1_size);
2846 H_PUT_8 (abfd, in->cpr2_size, ex->cpr2_size);
2847 H_PUT_8 (abfd, in->fp_abi, ex->fp_abi);
2848 H_PUT_32 (abfd, in->isa_ext, ex->isa_ext);
2849 H_PUT_32 (abfd, in->ases, ex->ases);
2850 H_PUT_32 (abfd, in->flags1, ex->flags1);
2851 H_PUT_32 (abfd, in->flags2, ex->flags2);
2852}
b49e97c9
TS
2853\f
2854/* This function is called via qsort() to sort the dynamic relocation
2855 entries by increasing r_symndx value. */
2856
2857static int
9719ad41 2858sort_dynamic_relocs (const void *arg1, const void *arg2)
b49e97c9 2859{
947216bf
AM
2860 Elf_Internal_Rela int_reloc1;
2861 Elf_Internal_Rela int_reloc2;
6870500c 2862 int diff;
b49e97c9 2863
947216bf
AM
2864 bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg1, &int_reloc1);
2865 bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg2, &int_reloc2);
b49e97c9 2866
6870500c
RS
2867 diff = ELF32_R_SYM (int_reloc1.r_info) - ELF32_R_SYM (int_reloc2.r_info);
2868 if (diff != 0)
2869 return diff;
2870
2871 if (int_reloc1.r_offset < int_reloc2.r_offset)
2872 return -1;
2873 if (int_reloc1.r_offset > int_reloc2.r_offset)
2874 return 1;
2875 return 0;
b49e97c9
TS
2876}
2877
f4416af6
AO
2878/* Like sort_dynamic_relocs, but used for elf64 relocations. */
2879
2880static int
7e3102a7
AM
2881sort_dynamic_relocs_64 (const void *arg1 ATTRIBUTE_UNUSED,
2882 const void *arg2 ATTRIBUTE_UNUSED)
f4416af6 2883{
7e3102a7 2884#ifdef BFD64
f4416af6
AO
2885 Elf_Internal_Rela int_reloc1[3];
2886 Elf_Internal_Rela int_reloc2[3];
2887
2888 (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
2889 (reldyn_sorting_bfd, arg1, int_reloc1);
2890 (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
2891 (reldyn_sorting_bfd, arg2, int_reloc2);
2892
6870500c
RS
2893 if (ELF64_R_SYM (int_reloc1[0].r_info) < ELF64_R_SYM (int_reloc2[0].r_info))
2894 return -1;
2895 if (ELF64_R_SYM (int_reloc1[0].r_info) > ELF64_R_SYM (int_reloc2[0].r_info))
2896 return 1;
2897
2898 if (int_reloc1[0].r_offset < int_reloc2[0].r_offset)
2899 return -1;
2900 if (int_reloc1[0].r_offset > int_reloc2[0].r_offset)
2901 return 1;
2902 return 0;
7e3102a7
AM
2903#else
2904 abort ();
2905#endif
f4416af6
AO
2906}
2907
2908
b49e97c9
TS
2909/* This routine is used to write out ECOFF debugging external symbol
2910 information. It is called via mips_elf_link_hash_traverse. The
2911 ECOFF external symbol information must match the ELF external
2912 symbol information. Unfortunately, at this point we don't know
2913 whether a symbol is required by reloc information, so the two
2914 tables may wind up being different. We must sort out the external
2915 symbol information before we can set the final size of the .mdebug
2916 section, and we must set the size of the .mdebug section before we
2917 can relocate any sections, and we can't know which symbols are
2918 required by relocation until we relocate the sections.
2919 Fortunately, it is relatively unlikely that any symbol will be
2920 stripped but required by a reloc. In particular, it can not happen
2921 when generating a final executable. */
2922
b34976b6 2923static bfd_boolean
9719ad41 2924mips_elf_output_extsym (struct mips_elf_link_hash_entry *h, void *data)
b49e97c9 2925{
9719ad41 2926 struct extsym_info *einfo = data;
b34976b6 2927 bfd_boolean strip;
b49e97c9
TS
2928 asection *sec, *output_section;
2929
b49e97c9 2930 if (h->root.indx == -2)
b34976b6 2931 strip = FALSE;
f5385ebf 2932 else if ((h->root.def_dynamic
77cfaee6
AM
2933 || h->root.ref_dynamic
2934 || h->root.type == bfd_link_hash_new)
f5385ebf
AM
2935 && !h->root.def_regular
2936 && !h->root.ref_regular)
b34976b6 2937 strip = TRUE;
b49e97c9
TS
2938 else if (einfo->info->strip == strip_all
2939 || (einfo->info->strip == strip_some
2940 && bfd_hash_lookup (einfo->info->keep_hash,
2941 h->root.root.root.string,
b34976b6
AM
2942 FALSE, FALSE) == NULL))
2943 strip = TRUE;
b49e97c9 2944 else
b34976b6 2945 strip = FALSE;
b49e97c9
TS
2946
2947 if (strip)
b34976b6 2948 return TRUE;
b49e97c9
TS
2949
2950 if (h->esym.ifd == -2)
2951 {
2952 h->esym.jmptbl = 0;
2953 h->esym.cobol_main = 0;
2954 h->esym.weakext = 0;
2955 h->esym.reserved = 0;
2956 h->esym.ifd = ifdNil;
2957 h->esym.asym.value = 0;
2958 h->esym.asym.st = stGlobal;
2959
2960 if (h->root.root.type == bfd_link_hash_undefined
2961 || h->root.root.type == bfd_link_hash_undefweak)
2962 {
2963 const char *name;
2964
2965 /* Use undefined class. Also, set class and type for some
07d6d2b8 2966 special symbols. */
b49e97c9
TS
2967 name = h->root.root.root.string;
2968 if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
2969 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
2970 {
2971 h->esym.asym.sc = scData;
2972 h->esym.asym.st = stLabel;
2973 h->esym.asym.value = 0;
2974 }
2975 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
2976 {
2977 h->esym.asym.sc = scAbs;
2978 h->esym.asym.st = stLabel;
2979 h->esym.asym.value =
2980 mips_elf_hash_table (einfo->info)->procedure_count;
2981 }
b49e97c9
TS
2982 else
2983 h->esym.asym.sc = scUndefined;
2984 }
2985 else if (h->root.root.type != bfd_link_hash_defined
2986 && h->root.root.type != bfd_link_hash_defweak)
2987 h->esym.asym.sc = scAbs;
2988 else
2989 {
2990 const char *name;
2991
2992 sec = h->root.root.u.def.section;
2993 output_section = sec->output_section;
2994
2995 /* When making a shared library and symbol h is the one from
2996 the another shared library, OUTPUT_SECTION may be null. */
2997 if (output_section == NULL)
2998 h->esym.asym.sc = scUndefined;
2999 else
3000 {
fd361982 3001 name = bfd_section_name (output_section);
b49e97c9
TS
3002
3003 if (strcmp (name, ".text") == 0)
3004 h->esym.asym.sc = scText;
3005 else if (strcmp (name, ".data") == 0)
3006 h->esym.asym.sc = scData;
3007 else if (strcmp (name, ".sdata") == 0)
3008 h->esym.asym.sc = scSData;
3009 else if (strcmp (name, ".rodata") == 0
3010 || strcmp (name, ".rdata") == 0)
3011 h->esym.asym.sc = scRData;
3012 else if (strcmp (name, ".bss") == 0)
3013 h->esym.asym.sc = scBss;
3014 else if (strcmp (name, ".sbss") == 0)
3015 h->esym.asym.sc = scSBss;
3016 else if (strcmp (name, ".init") == 0)
3017 h->esym.asym.sc = scInit;
3018 else if (strcmp (name, ".fini") == 0)
3019 h->esym.asym.sc = scFini;
3020 else
3021 h->esym.asym.sc = scAbs;
3022 }
3023 }
3024
3025 h->esym.asym.reserved = 0;
3026 h->esym.asym.index = indexNil;
3027 }
3028
3029 if (h->root.root.type == bfd_link_hash_common)
3030 h->esym.asym.value = h->root.root.u.c.size;
3031 else if (h->root.root.type == bfd_link_hash_defined
3032 || h->root.root.type == bfd_link_hash_defweak)
3033 {
3034 if (h->esym.asym.sc == scCommon)
3035 h->esym.asym.sc = scBss;
3036 else if (h->esym.asym.sc == scSCommon)
3037 h->esym.asym.sc = scSBss;
3038
3039 sec = h->root.root.u.def.section;
3040 output_section = sec->output_section;
3041 if (output_section != NULL)
3042 h->esym.asym.value = (h->root.root.u.def.value
3043 + sec->output_offset
3044 + output_section->vma);
3045 else
3046 h->esym.asym.value = 0;
3047 }
33bb52fb 3048 else
b49e97c9
TS
3049 {
3050 struct mips_elf_link_hash_entry *hd = h;
b49e97c9
TS
3051
3052 while (hd->root.root.type == bfd_link_hash_indirect)
33bb52fb 3053 hd = (struct mips_elf_link_hash_entry *)h->root.root.u.i.link;
b49e97c9 3054
33bb52fb 3055 if (hd->needs_lazy_stub)
b49e97c9 3056 {
1bbce132
MR
3057 BFD_ASSERT (hd->root.plt.plist != NULL);
3058 BFD_ASSERT (hd->root.plt.plist->stub_offset != MINUS_ONE);
b49e97c9
TS
3059 /* Set type and value for a symbol with a function stub. */
3060 h->esym.asym.st = stProc;
3061 sec = hd->root.root.u.def.section;
3062 if (sec == NULL)
3063 h->esym.asym.value = 0;
3064 else
3065 {
3066 output_section = sec->output_section;
3067 if (output_section != NULL)
1bbce132 3068 h->esym.asym.value = (hd->root.plt.plist->stub_offset
b49e97c9
TS
3069 + sec->output_offset
3070 + output_section->vma);
3071 else
3072 h->esym.asym.value = 0;
3073 }
b49e97c9
TS
3074 }
3075 }
3076
3077 if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
3078 h->root.root.root.string,
3079 &h->esym))
3080 {
b34976b6
AM
3081 einfo->failed = TRUE;
3082 return FALSE;
b49e97c9
TS
3083 }
3084
b34976b6 3085 return TRUE;
b49e97c9
TS
3086}
3087
3088/* A comparison routine used to sort .gptab entries. */
3089
3090static int
9719ad41 3091gptab_compare (const void *p1, const void *p2)
b49e97c9 3092{
9719ad41
RS
3093 const Elf32_gptab *a1 = p1;
3094 const Elf32_gptab *a2 = p2;
b49e97c9
TS
3095
3096 return a1->gt_entry.gt_g_value - a2->gt_entry.gt_g_value;
3097}
3098\f
b15e6682 3099/* Functions to manage the got entry hash table. */
f4416af6
AO
3100
3101/* Use all 64 bits of a bfd_vma for the computation of a 32-bit
3102 hash number. */
3103
3104static INLINE hashval_t
9719ad41 3105mips_elf_hash_bfd_vma (bfd_vma addr)
f4416af6
AO
3106{
3107#ifdef BFD64
3108 return addr + (addr >> 32);
3109#else
3110 return addr;
3111#endif
3112}
3113
f4416af6 3114static hashval_t
d9bf376d 3115mips_elf_got_entry_hash (const void *entry_)
f4416af6
AO
3116{
3117 const struct mips_got_entry *entry = (struct mips_got_entry *)entry_;
3118
e641e783 3119 return (entry->symndx
9ab066b4
RS
3120 + ((entry->tls_type == GOT_TLS_LDM) << 18)
3121 + (entry->tls_type == GOT_TLS_LDM ? 0
e641e783
RS
3122 : !entry->abfd ? mips_elf_hash_bfd_vma (entry->d.address)
3123 : entry->symndx >= 0 ? (entry->abfd->id
3124 + mips_elf_hash_bfd_vma (entry->d.addend))
3125 : entry->d.h->root.root.root.hash));
f4416af6
AO
3126}
3127
3128static int
3dff0dd1 3129mips_elf_got_entry_eq (const void *entry1, const void *entry2)
f4416af6
AO
3130{
3131 const struct mips_got_entry *e1 = (struct mips_got_entry *)entry1;
3132 const struct mips_got_entry *e2 = (struct mips_got_entry *)entry2;
3133
e641e783 3134 return (e1->symndx == e2->symndx
9ab066b4
RS
3135 && e1->tls_type == e2->tls_type
3136 && (e1->tls_type == GOT_TLS_LDM ? TRUE
e641e783
RS
3137 : !e1->abfd ? !e2->abfd && e1->d.address == e2->d.address
3138 : e1->symndx >= 0 ? (e1->abfd == e2->abfd
3139 && e1->d.addend == e2->d.addend)
3140 : e2->abfd && e1->d.h == e2->d.h));
b15e6682 3141}
c224138d 3142
13db6b44
RS
3143static hashval_t
3144mips_got_page_ref_hash (const void *ref_)
3145{
3146 const struct mips_got_page_ref *ref;
3147
3148 ref = (const struct mips_got_page_ref *) ref_;
3149 return ((ref->symndx >= 0
3150 ? (hashval_t) (ref->u.abfd->id + ref->symndx)
3151 : ref->u.h->root.root.root.hash)
3152 + mips_elf_hash_bfd_vma (ref->addend));
3153}
3154
3155static int
3156mips_got_page_ref_eq (const void *ref1_, const void *ref2_)
3157{
3158 const struct mips_got_page_ref *ref1, *ref2;
3159
3160 ref1 = (const struct mips_got_page_ref *) ref1_;
3161 ref2 = (const struct mips_got_page_ref *) ref2_;
3162 return (ref1->symndx == ref2->symndx
3163 && (ref1->symndx < 0
3164 ? ref1->u.h == ref2->u.h
3165 : ref1->u.abfd == ref2->u.abfd)
3166 && ref1->addend == ref2->addend);
3167}
3168
c224138d
RS
3169static hashval_t
3170mips_got_page_entry_hash (const void *entry_)
3171{
3172 const struct mips_got_page_entry *entry;
3173
3174 entry = (const struct mips_got_page_entry *) entry_;
13db6b44 3175 return entry->sec->id;
c224138d
RS
3176}
3177
3178static int
3179mips_got_page_entry_eq (const void *entry1_, const void *entry2_)
3180{
3181 const struct mips_got_page_entry *entry1, *entry2;
3182
3183 entry1 = (const struct mips_got_page_entry *) entry1_;
3184 entry2 = (const struct mips_got_page_entry *) entry2_;
13db6b44 3185 return entry1->sec == entry2->sec;
c224138d 3186}
b15e6682 3187\f
3dff0dd1 3188/* Create and return a new mips_got_info structure. */
5334aa52
RS
3189
3190static struct mips_got_info *
3dff0dd1 3191mips_elf_create_got_info (bfd *abfd)
5334aa52
RS
3192{
3193 struct mips_got_info *g;
3194
3195 g = bfd_zalloc (abfd, sizeof (struct mips_got_info));
3196 if (g == NULL)
3197 return NULL;
3198
3dff0dd1
RS
3199 g->got_entries = htab_try_create (1, mips_elf_got_entry_hash,
3200 mips_elf_got_entry_eq, NULL);
5334aa52
RS
3201 if (g->got_entries == NULL)
3202 return NULL;
3203
13db6b44
RS
3204 g->got_page_refs = htab_try_create (1, mips_got_page_ref_hash,
3205 mips_got_page_ref_eq, NULL);
3206 if (g->got_page_refs == NULL)
5334aa52
RS
3207 return NULL;
3208
3209 return g;
3210}
3211
ee227692
RS
3212/* Return the GOT info for input bfd ABFD, trying to create a new one if
3213 CREATE_P and if ABFD doesn't already have a GOT. */
3214
3215static struct mips_got_info *
3216mips_elf_bfd_got (bfd *abfd, bfd_boolean create_p)
3217{
3218 struct mips_elf_obj_tdata *tdata;
3219
3220 if (!is_mips_elf (abfd))
3221 return NULL;
3222
3223 tdata = mips_elf_tdata (abfd);
3224 if (!tdata->got && create_p)
3dff0dd1 3225 tdata->got = mips_elf_create_got_info (abfd);
ee227692
RS
3226 return tdata->got;
3227}
3228
d7206569
RS
3229/* Record that ABFD should use output GOT G. */
3230
3231static void
3232mips_elf_replace_bfd_got (bfd *abfd, struct mips_got_info *g)
3233{
3234 struct mips_elf_obj_tdata *tdata;
3235
3236 BFD_ASSERT (is_mips_elf (abfd));
3237 tdata = mips_elf_tdata (abfd);
3238 if (tdata->got)
3239 {
3240 /* The GOT structure itself and the hash table entries are
3241 allocated to a bfd, but the hash tables aren't. */
3242 htab_delete (tdata->got->got_entries);
13db6b44
RS
3243 htab_delete (tdata->got->got_page_refs);
3244 if (tdata->got->got_page_entries)
3245 htab_delete (tdata->got->got_page_entries);
d7206569
RS
3246 }
3247 tdata->got = g;
3248}
3249
0a44bf69
RS
3250/* Return the dynamic relocation section. If it doesn't exist, try to
3251 create a new it if CREATE_P, otherwise return NULL. Also return NULL
3252 if creation fails. */
f4416af6
AO
3253
3254static asection *
0a44bf69 3255mips_elf_rel_dyn_section (struct bfd_link_info *info, bfd_boolean create_p)
f4416af6 3256{
0a44bf69 3257 const char *dname;
f4416af6 3258 asection *sreloc;
0a44bf69 3259 bfd *dynobj;
f4416af6 3260
0a44bf69
RS
3261 dname = MIPS_ELF_REL_DYN_NAME (info);
3262 dynobj = elf_hash_table (info)->dynobj;
3d4d4302 3263 sreloc = bfd_get_linker_section (dynobj, dname);
f4416af6
AO
3264 if (sreloc == NULL && create_p)
3265 {
3d4d4302
AM
3266 sreloc = bfd_make_section_anyway_with_flags (dynobj, dname,
3267 (SEC_ALLOC
3268 | SEC_LOAD
3269 | SEC_HAS_CONTENTS
3270 | SEC_IN_MEMORY
3271 | SEC_LINKER_CREATED
3272 | SEC_READONLY));
f4416af6 3273 if (sreloc == NULL
fd361982
AM
3274 || !bfd_set_section_alignment (sreloc,
3275 MIPS_ELF_LOG_FILE_ALIGN (dynobj)))
f4416af6
AO
3276 return NULL;
3277 }
3278 return sreloc;
3279}
3280
e641e783
RS
3281/* Return the GOT_TLS_* type required by relocation type R_TYPE. */
3282
3283static int
3284mips_elf_reloc_tls_type (unsigned int r_type)
3285{
3286 if (tls_gd_reloc_p (r_type))
3287 return GOT_TLS_GD;
3288
3289 if (tls_ldm_reloc_p (r_type))
3290 return GOT_TLS_LDM;
3291
3292 if (tls_gottprel_reloc_p (r_type))
3293 return GOT_TLS_IE;
3294
9ab066b4 3295 return GOT_TLS_NONE;
e641e783
RS
3296}
3297
3298/* Return the number of GOT slots needed for GOT TLS type TYPE. */
3299
3300static int
3301mips_tls_got_entries (unsigned int type)
3302{
3303 switch (type)
3304 {
3305 case GOT_TLS_GD:
3306 case GOT_TLS_LDM:
3307 return 2;
3308
3309 case GOT_TLS_IE:
3310 return 1;
3311
9ab066b4 3312 case GOT_TLS_NONE:
e641e783
RS
3313 return 0;
3314 }
3315 abort ();
3316}
3317
0f20cc35
DJ
3318/* Count the number of relocations needed for a TLS GOT entry, with
3319 access types from TLS_TYPE, and symbol H (or a local symbol if H
3320 is NULL). */
3321
3322static int
3323mips_tls_got_relocs (struct bfd_link_info *info, unsigned char tls_type,
3324 struct elf_link_hash_entry *h)
3325{
3326 int indx = 0;
0f20cc35
DJ
3327 bfd_boolean need_relocs = FALSE;
3328 bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
3329
1cb83cac
MR
3330 if (h != NULL
3331 && h->dynindx != -1
3332 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
3333 && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, h)))
0f20cc35
DJ
3334 indx = h->dynindx;
3335
9143e72c 3336 if ((bfd_link_dll (info) || indx != 0)
0f20cc35
DJ
3337 && (h == NULL
3338 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3339 || h->root.type != bfd_link_hash_undefweak))
3340 need_relocs = TRUE;
3341
3342 if (!need_relocs)
e641e783 3343 return 0;
0f20cc35 3344
9ab066b4 3345 switch (tls_type)
0f20cc35 3346 {
e641e783
RS
3347 case GOT_TLS_GD:
3348 return indx != 0 ? 2 : 1;
0f20cc35 3349
e641e783
RS
3350 case GOT_TLS_IE:
3351 return 1;
0f20cc35 3352
e641e783 3353 case GOT_TLS_LDM:
9143e72c 3354 return bfd_link_dll (info) ? 1 : 0;
0f20cc35 3355
e641e783
RS
3356 default:
3357 return 0;
3358 }
0f20cc35
DJ
3359}
3360
ab361d49
RS
3361/* Add the number of GOT entries and TLS relocations required by ENTRY
3362 to G. */
0f20cc35 3363
ab361d49
RS
3364static void
3365mips_elf_count_got_entry (struct bfd_link_info *info,
3366 struct mips_got_info *g,
3367 struct mips_got_entry *entry)
0f20cc35 3368{
9ab066b4 3369 if (entry->tls_type)
ab361d49 3370 {
9ab066b4
RS
3371 g->tls_gotno += mips_tls_got_entries (entry->tls_type);
3372 g->relocs += mips_tls_got_relocs (info, entry->tls_type,
ab361d49
RS
3373 entry->symndx < 0
3374 ? &entry->d.h->root : NULL);
3375 }
3376 else if (entry->symndx >= 0 || entry->d.h->global_got_area == GGA_NONE)
3377 g->local_gotno += 1;
3378 else
3379 g->global_gotno += 1;
0f20cc35
DJ
3380}
3381
0f20cc35
DJ
3382/* Output a simple dynamic relocation into SRELOC. */
3383
3384static void
3385mips_elf_output_dynamic_relocation (bfd *output_bfd,
3386 asection *sreloc,
861fb55a 3387 unsigned long reloc_index,
0f20cc35
DJ
3388 unsigned long indx,
3389 int r_type,
3390 bfd_vma offset)
3391{
3392 Elf_Internal_Rela rel[3];
3393
3394 memset (rel, 0, sizeof (rel));
3395
3396 rel[0].r_info = ELF_R_INFO (output_bfd, indx, r_type);
3397 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
3398
3399 if (ABI_64_P (output_bfd))
3400 {
3401 (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
3402 (output_bfd, &rel[0],
3403 (sreloc->contents
861fb55a 3404 + reloc_index * sizeof (Elf64_Mips_External_Rel)));
0f20cc35
DJ
3405 }
3406 else
3407 bfd_elf32_swap_reloc_out
3408 (output_bfd, &rel[0],
3409 (sreloc->contents
861fb55a 3410 + reloc_index * sizeof (Elf32_External_Rel)));
0f20cc35
DJ
3411}
3412
3413/* Initialize a set of TLS GOT entries for one symbol. */
3414
3415static void
9ab066b4
RS
3416mips_elf_initialize_tls_slots (bfd *abfd, struct bfd_link_info *info,
3417 struct mips_got_entry *entry,
0f20cc35
DJ
3418 struct mips_elf_link_hash_entry *h,
3419 bfd_vma value)
3420{
1cb83cac 3421 bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
23cc69b6 3422 struct mips_elf_link_hash_table *htab;
0f20cc35
DJ
3423 int indx;
3424 asection *sreloc, *sgot;
9ab066b4 3425 bfd_vma got_offset, got_offset2;
0f20cc35
DJ
3426 bfd_boolean need_relocs = FALSE;
3427
23cc69b6 3428 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3429 if (htab == NULL)
3430 return;
3431
ce558b89 3432 sgot = htab->root.sgot;
0f20cc35
DJ
3433
3434 indx = 0;
1cb83cac
MR
3435 if (h != NULL
3436 && h->root.dynindx != -1
3437 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), &h->root)
3438 && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, &h->root)))
3439 indx = h->root.dynindx;
0f20cc35 3440
9ab066b4 3441 if (entry->tls_initialized)
0f20cc35
DJ
3442 return;
3443
9143e72c 3444 if ((bfd_link_dll (info) || indx != 0)
0f20cc35
DJ
3445 && (h == NULL
3446 || ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT
3447 || h->root.type != bfd_link_hash_undefweak))
3448 need_relocs = TRUE;
3449
3450 /* MINUS_ONE means the symbol is not defined in this object. It may not
3451 be defined at all; assume that the value doesn't matter in that
3452 case. Otherwise complain if we would use the value. */
3453 BFD_ASSERT (value != MINUS_ONE || (indx != 0 && need_relocs)
3454 || h->root.root.type == bfd_link_hash_undefweak);
3455
3456 /* Emit necessary relocations. */
0a44bf69 3457 sreloc = mips_elf_rel_dyn_section (info, FALSE);
9ab066b4 3458 got_offset = entry->gotidx;
0f20cc35 3459
9ab066b4 3460 switch (entry->tls_type)
0f20cc35 3461 {
e641e783
RS
3462 case GOT_TLS_GD:
3463 /* General Dynamic. */
3464 got_offset2 = got_offset + MIPS_ELF_GOT_SIZE (abfd);
0f20cc35
DJ
3465
3466 if (need_relocs)
3467 {
3468 mips_elf_output_dynamic_relocation
861fb55a 3469 (abfd, sreloc, sreloc->reloc_count++, indx,
0f20cc35 3470 ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
e641e783 3471 sgot->output_offset + sgot->output_section->vma + got_offset);
0f20cc35
DJ
3472
3473 if (indx)
3474 mips_elf_output_dynamic_relocation
861fb55a 3475 (abfd, sreloc, sreloc->reloc_count++, indx,
0f20cc35 3476 ABI_64_P (abfd) ? R_MIPS_TLS_DTPREL64 : R_MIPS_TLS_DTPREL32,
e641e783 3477 sgot->output_offset + sgot->output_section->vma + got_offset2);
0f20cc35
DJ
3478 else
3479 MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
e641e783 3480 sgot->contents + got_offset2);
0f20cc35
DJ
3481 }
3482 else
3483 {
3484 MIPS_ELF_PUT_WORD (abfd, 1,
e641e783 3485 sgot->contents + got_offset);
0f20cc35 3486 MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
e641e783 3487 sgot->contents + got_offset2);
0f20cc35 3488 }
e641e783 3489 break;
0f20cc35 3490
e641e783
RS
3491 case GOT_TLS_IE:
3492 /* Initial Exec model. */
0f20cc35
DJ
3493 if (need_relocs)
3494 {
3495 if (indx == 0)
3496 MIPS_ELF_PUT_WORD (abfd, value - elf_hash_table (info)->tls_sec->vma,
e641e783 3497 sgot->contents + got_offset);
0f20cc35
DJ
3498 else
3499 MIPS_ELF_PUT_WORD (abfd, 0,
e641e783 3500 sgot->contents + got_offset);
0f20cc35
DJ
3501
3502 mips_elf_output_dynamic_relocation
861fb55a 3503 (abfd, sreloc, sreloc->reloc_count++, indx,
0f20cc35 3504 ABI_64_P (abfd) ? R_MIPS_TLS_TPREL64 : R_MIPS_TLS_TPREL32,
e641e783 3505 sgot->output_offset + sgot->output_section->vma + got_offset);
0f20cc35
DJ
3506 }
3507 else
3508 MIPS_ELF_PUT_WORD (abfd, value - tprel_base (info),
e641e783
RS
3509 sgot->contents + got_offset);
3510 break;
0f20cc35 3511
e641e783 3512 case GOT_TLS_LDM:
0f20cc35
DJ
3513 /* The initial offset is zero, and the LD offsets will include the
3514 bias by DTP_OFFSET. */
3515 MIPS_ELF_PUT_WORD (abfd, 0,
3516 sgot->contents + got_offset
3517 + MIPS_ELF_GOT_SIZE (abfd));
3518
9143e72c 3519 if (!bfd_link_dll (info))
0f20cc35
DJ
3520 MIPS_ELF_PUT_WORD (abfd, 1,
3521 sgot->contents + got_offset);
3522 else
3523 mips_elf_output_dynamic_relocation
861fb55a 3524 (abfd, sreloc, sreloc->reloc_count++, indx,
0f20cc35
DJ
3525 ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
3526 sgot->output_offset + sgot->output_section->vma + got_offset);
e641e783
RS
3527 break;
3528
3529 default:
3530 abort ();
0f20cc35
DJ
3531 }
3532
9ab066b4 3533 entry->tls_initialized = TRUE;
e641e783 3534}
0f20cc35 3535
0a44bf69
RS
3536/* Return the offset from _GLOBAL_OFFSET_TABLE_ of the .got.plt entry
3537 for global symbol H. .got.plt comes before the GOT, so the offset
3538 will be negative. */
3539
3540static bfd_vma
3541mips_elf_gotplt_index (struct bfd_link_info *info,
3542 struct elf_link_hash_entry *h)
3543{
1bbce132 3544 bfd_vma got_address, got_value;
0a44bf69
RS
3545 struct mips_elf_link_hash_table *htab;
3546
3547 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3548 BFD_ASSERT (htab != NULL);
3549
1bbce132
MR
3550 BFD_ASSERT (h->plt.plist != NULL);
3551 BFD_ASSERT (h->plt.plist->gotplt_index != MINUS_ONE);
0a44bf69
RS
3552
3553 /* Calculate the address of the associated .got.plt entry. */
ce558b89
AM
3554 got_address = (htab->root.sgotplt->output_section->vma
3555 + htab->root.sgotplt->output_offset
1bbce132
MR
3556 + (h->plt.plist->gotplt_index
3557 * MIPS_ELF_GOT_SIZE (info->output_bfd)));
0a44bf69
RS
3558
3559 /* Calculate the value of _GLOBAL_OFFSET_TABLE_. */
3560 got_value = (htab->root.hgot->root.u.def.section->output_section->vma
3561 + htab->root.hgot->root.u.def.section->output_offset
3562 + htab->root.hgot->root.u.def.value);
3563
3564 return got_address - got_value;
3565}
3566
5c18022e 3567/* Return the GOT offset for address VALUE. If there is not yet a GOT
0a44bf69
RS
3568 entry for this value, create one. If R_SYMNDX refers to a TLS symbol,
3569 create a TLS GOT entry instead. Return -1 if no satisfactory GOT
3570 offset can be found. */
b49e97c9
TS
3571
3572static bfd_vma
9719ad41 3573mips_elf_local_got_index (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
5c18022e 3574 bfd_vma value, unsigned long r_symndx,
0f20cc35 3575 struct mips_elf_link_hash_entry *h, int r_type)
b49e97c9 3576{
a8028dd0 3577 struct mips_elf_link_hash_table *htab;
b15e6682 3578 struct mips_got_entry *entry;
b49e97c9 3579
a8028dd0 3580 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3581 BFD_ASSERT (htab != NULL);
3582
a8028dd0
RS
3583 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, value,
3584 r_symndx, h, r_type);
0f20cc35 3585 if (!entry)
b15e6682 3586 return MINUS_ONE;
0f20cc35 3587
e641e783 3588 if (entry->tls_type)
9ab066b4
RS
3589 mips_elf_initialize_tls_slots (abfd, info, entry, h, value);
3590 return entry->gotidx;
b49e97c9
TS
3591}
3592
13fbec83 3593/* Return the GOT index of global symbol H in the primary GOT. */
b49e97c9
TS
3594
3595static bfd_vma
13fbec83
RS
3596mips_elf_primary_global_got_index (bfd *obfd, struct bfd_link_info *info,
3597 struct elf_link_hash_entry *h)
3598{
3599 struct mips_elf_link_hash_table *htab;
3600 long global_got_dynindx;
3601 struct mips_got_info *g;
3602 bfd_vma got_index;
3603
3604 htab = mips_elf_hash_table (info);
3605 BFD_ASSERT (htab != NULL);
3606
3607 global_got_dynindx = 0;
3608 if (htab->global_gotsym != NULL)
3609 global_got_dynindx = htab->global_gotsym->dynindx;
3610
3611 /* Once we determine the global GOT entry with the lowest dynamic
3612 symbol table index, we must put all dynamic symbols with greater
3613 indices into the primary GOT. That makes it easy to calculate the
3614 GOT offset. */
3615 BFD_ASSERT (h->dynindx >= global_got_dynindx);
3616 g = mips_elf_bfd_got (obfd, FALSE);
3617 got_index = ((h->dynindx - global_got_dynindx + g->local_gotno)
3618 * MIPS_ELF_GOT_SIZE (obfd));
ce558b89 3619 BFD_ASSERT (got_index < htab->root.sgot->size);
13fbec83
RS
3620
3621 return got_index;
3622}
3623
3624/* Return the GOT index for the global symbol indicated by H, which is
3625 referenced by a relocation of type R_TYPE in IBFD. */
3626
3627static bfd_vma
3628mips_elf_global_got_index (bfd *obfd, struct bfd_link_info *info, bfd *ibfd,
3629 struct elf_link_hash_entry *h, int r_type)
b49e97c9 3630{
a8028dd0 3631 struct mips_elf_link_hash_table *htab;
6c42ddb9
RS
3632 struct mips_got_info *g;
3633 struct mips_got_entry lookup, *entry;
3634 bfd_vma gotidx;
b49e97c9 3635
a8028dd0 3636 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3637 BFD_ASSERT (htab != NULL);
3638
6c42ddb9
RS
3639 g = mips_elf_bfd_got (ibfd, FALSE);
3640 BFD_ASSERT (g);
f4416af6 3641
6c42ddb9
RS
3642 lookup.tls_type = mips_elf_reloc_tls_type (r_type);
3643 if (!lookup.tls_type && g == mips_elf_bfd_got (obfd, FALSE))
3644 return mips_elf_primary_global_got_index (obfd, info, h);
f4416af6 3645
6c42ddb9
RS
3646 lookup.abfd = ibfd;
3647 lookup.symndx = -1;
3648 lookup.d.h = (struct mips_elf_link_hash_entry *) h;
3649 entry = htab_find (g->got_entries, &lookup);
3650 BFD_ASSERT (entry);
0f20cc35 3651
6c42ddb9 3652 gotidx = entry->gotidx;
ce558b89 3653 BFD_ASSERT (gotidx > 0 && gotidx < htab->root.sgot->size);
f4416af6 3654
6c42ddb9 3655 if (lookup.tls_type)
0f20cc35 3656 {
0f20cc35
DJ
3657 bfd_vma value = MINUS_ONE;
3658
3659 if ((h->root.type == bfd_link_hash_defined
3660 || h->root.type == bfd_link_hash_defweak)
3661 && h->root.u.def.section->output_section)
3662 value = (h->root.u.def.value
3663 + h->root.u.def.section->output_offset
3664 + h->root.u.def.section->output_section->vma);
3665
9ab066b4 3666 mips_elf_initialize_tls_slots (obfd, info, entry, lookup.d.h, value);
0f20cc35 3667 }
6c42ddb9 3668 return gotidx;
b49e97c9
TS
3669}
3670
5c18022e
RS
3671/* Find a GOT page entry that points to within 32KB of VALUE. These
3672 entries are supposed to be placed at small offsets in the GOT, i.e.,
3673 within 32KB of GP. Return the index of the GOT entry, or -1 if no
3674 entry could be created. If OFFSETP is nonnull, use it to return the
0a44bf69 3675 offset of the GOT entry from VALUE. */
b49e97c9
TS
3676
3677static bfd_vma
9719ad41 3678mips_elf_got_page (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
5c18022e 3679 bfd_vma value, bfd_vma *offsetp)
b49e97c9 3680{
91d6fa6a 3681 bfd_vma page, got_index;
b15e6682 3682 struct mips_got_entry *entry;
b49e97c9 3683
0a44bf69 3684 page = (value + 0x8000) & ~(bfd_vma) 0xffff;
a8028dd0
RS
3685 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, page, 0,
3686 NULL, R_MIPS_GOT_PAGE);
b49e97c9 3687
b15e6682
AO
3688 if (!entry)
3689 return MINUS_ONE;
143d77c5 3690
91d6fa6a 3691 got_index = entry->gotidx;
b49e97c9
TS
3692
3693 if (offsetp)
f4416af6 3694 *offsetp = value - entry->d.address;
b49e97c9 3695
91d6fa6a 3696 return got_index;
b49e97c9
TS
3697}
3698
738e5348 3699/* Find a local GOT entry for an R_MIPS*_GOT16 relocation against VALUE.
020d7251
RS
3700 EXTERNAL is true if the relocation was originally against a global
3701 symbol that binds locally. */
b49e97c9
TS
3702
3703static bfd_vma
9719ad41 3704mips_elf_got16_entry (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
5c18022e 3705 bfd_vma value, bfd_boolean external)
b49e97c9 3706{
b15e6682 3707 struct mips_got_entry *entry;
b49e97c9 3708
0a44bf69
RS
3709 /* GOT16 relocations against local symbols are followed by a LO16
3710 relocation; those against global symbols are not. Thus if the
3711 symbol was originally local, the GOT16 relocation should load the
3712 equivalent of %hi(VALUE), otherwise it should load VALUE itself. */
b49e97c9 3713 if (! external)
0a44bf69 3714 value = mips_elf_high (value) << 16;
b49e97c9 3715
738e5348
RS
3716 /* It doesn't matter whether the original relocation was R_MIPS_GOT16,
3717 R_MIPS16_GOT16, R_MIPS_CALL16, etc. The format of the entry is the
3718 same in all cases. */
a8028dd0
RS
3719 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, value, 0,
3720 NULL, R_MIPS_GOT16);
b15e6682
AO
3721 if (entry)
3722 return entry->gotidx;
3723 else
3724 return MINUS_ONE;
b49e97c9
TS
3725}
3726
3727/* Returns the offset for the entry at the INDEXth position
3728 in the GOT. */
3729
3730static bfd_vma
a8028dd0 3731mips_elf_got_offset_from_index (struct bfd_link_info *info, bfd *output_bfd,
91d6fa6a 3732 bfd *input_bfd, bfd_vma got_index)
b49e97c9 3733{
a8028dd0 3734 struct mips_elf_link_hash_table *htab;
b49e97c9
TS
3735 asection *sgot;
3736 bfd_vma gp;
3737
a8028dd0 3738 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3739 BFD_ASSERT (htab != NULL);
3740
ce558b89 3741 sgot = htab->root.sgot;
f4416af6 3742 gp = _bfd_get_gp_value (output_bfd)
a8028dd0 3743 + mips_elf_adjust_gp (output_bfd, htab->got_info, input_bfd);
143d77c5 3744
91d6fa6a 3745 return sgot->output_section->vma + sgot->output_offset + got_index - gp;
b49e97c9
TS
3746}
3747
0a44bf69
RS
3748/* Create and return a local GOT entry for VALUE, which was calculated
3749 from a symbol belonging to INPUT_SECTON. Return NULL if it could not
3750 be created. If R_SYMNDX refers to a TLS symbol, create a TLS entry
3751 instead. */
b49e97c9 3752
b15e6682 3753static struct mips_got_entry *
0a44bf69 3754mips_elf_create_local_got_entry (bfd *abfd, struct bfd_link_info *info,
a8028dd0 3755 bfd *ibfd, bfd_vma value,
5c18022e 3756 unsigned long r_symndx,
0f20cc35
DJ
3757 struct mips_elf_link_hash_entry *h,
3758 int r_type)
b49e97c9 3759{
ebc53538
RS
3760 struct mips_got_entry lookup, *entry;
3761 void **loc;
f4416af6 3762 struct mips_got_info *g;
0a44bf69 3763 struct mips_elf_link_hash_table *htab;
6c42ddb9 3764 bfd_vma gotidx;
0a44bf69
RS
3765
3766 htab = mips_elf_hash_table (info);
4dfe6ac6 3767 BFD_ASSERT (htab != NULL);
b15e6682 3768
d7206569 3769 g = mips_elf_bfd_got (ibfd, FALSE);
f4416af6
AO
3770 if (g == NULL)
3771 {
d7206569 3772 g = mips_elf_bfd_got (abfd, FALSE);
f4416af6
AO
3773 BFD_ASSERT (g != NULL);
3774 }
b15e6682 3775
020d7251
RS
3776 /* This function shouldn't be called for symbols that live in the global
3777 area of the GOT. */
3778 BFD_ASSERT (h == NULL || h->global_got_area == GGA_NONE);
0f20cc35 3779
ebc53538
RS
3780 lookup.tls_type = mips_elf_reloc_tls_type (r_type);
3781 if (lookup.tls_type)
3782 {
3783 lookup.abfd = ibfd;
df58fc94 3784 if (tls_ldm_reloc_p (r_type))
0f20cc35 3785 {
ebc53538
RS
3786 lookup.symndx = 0;
3787 lookup.d.addend = 0;
0f20cc35
DJ
3788 }
3789 else if (h == NULL)
3790 {
ebc53538
RS
3791 lookup.symndx = r_symndx;
3792 lookup.d.addend = 0;
0f20cc35
DJ
3793 }
3794 else
ebc53538
RS
3795 {
3796 lookup.symndx = -1;
3797 lookup.d.h = h;
3798 }
0f20cc35 3799
ebc53538
RS
3800 entry = (struct mips_got_entry *) htab_find (g->got_entries, &lookup);
3801 BFD_ASSERT (entry);
0f20cc35 3802
6c42ddb9 3803 gotidx = entry->gotidx;
ce558b89 3804 BFD_ASSERT (gotidx > 0 && gotidx < htab->root.sgot->size);
6c42ddb9 3805
ebc53538 3806 return entry;
0f20cc35
DJ
3807 }
3808
ebc53538
RS
3809 lookup.abfd = NULL;
3810 lookup.symndx = -1;
3811 lookup.d.address = value;
3812 loc = htab_find_slot (g->got_entries, &lookup, INSERT);
3813 if (!loc)
b15e6682 3814 return NULL;
143d77c5 3815
ebc53538
RS
3816 entry = (struct mips_got_entry *) *loc;
3817 if (entry)
3818 return entry;
b15e6682 3819
cb22ccf4 3820 if (g->assigned_low_gotno > g->assigned_high_gotno)
b49e97c9
TS
3821 {
3822 /* We didn't allocate enough space in the GOT. */
4eca0228 3823 _bfd_error_handler
b49e97c9
TS
3824 (_("not enough GOT space for local GOT entries"));
3825 bfd_set_error (bfd_error_bad_value);
b15e6682 3826 return NULL;
b49e97c9
TS
3827 }
3828
ebc53538
RS
3829 entry = (struct mips_got_entry *) bfd_alloc (abfd, sizeof (*entry));
3830 if (!entry)
3831 return NULL;
3832
cb22ccf4
KCY
3833 if (got16_reloc_p (r_type)
3834 || call16_reloc_p (r_type)
3835 || got_page_reloc_p (r_type)
3836 || got_disp_reloc_p (r_type))
3837 lookup.gotidx = MIPS_ELF_GOT_SIZE (abfd) * g->assigned_low_gotno++;
3838 else
3839 lookup.gotidx = MIPS_ELF_GOT_SIZE (abfd) * g->assigned_high_gotno--;
3840
ebc53538
RS
3841 *entry = lookup;
3842 *loc = entry;
3843
ce558b89 3844 MIPS_ELF_PUT_WORD (abfd, value, htab->root.sgot->contents + entry->gotidx);
b15e6682 3845
5c18022e 3846 /* These GOT entries need a dynamic relocation on VxWorks. */
0a44bf69
RS
3847 if (htab->is_vxworks)
3848 {
3849 Elf_Internal_Rela outrel;
5c18022e 3850 asection *s;
91d6fa6a 3851 bfd_byte *rloc;
0a44bf69 3852 bfd_vma got_address;
0a44bf69
RS
3853
3854 s = mips_elf_rel_dyn_section (info, FALSE);
ce558b89
AM
3855 got_address = (htab->root.sgot->output_section->vma
3856 + htab->root.sgot->output_offset
ebc53538 3857 + entry->gotidx);
0a44bf69 3858
91d6fa6a 3859 rloc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
0a44bf69 3860 outrel.r_offset = got_address;
5c18022e
RS
3861 outrel.r_info = ELF32_R_INFO (STN_UNDEF, R_MIPS_32);
3862 outrel.r_addend = value;
91d6fa6a 3863 bfd_elf32_swap_reloca_out (abfd, &outrel, rloc);
0a44bf69
RS
3864 }
3865
ebc53538 3866 return entry;
b49e97c9
TS
3867}
3868
d4596a51
RS
3869/* Return the number of dynamic section symbols required by OUTPUT_BFD.
3870 The number might be exact or a worst-case estimate, depending on how
3871 much information is available to elf_backend_omit_section_dynsym at
3872 the current linking stage. */
3873
3874static bfd_size_type
3875count_section_dynsyms (bfd *output_bfd, struct bfd_link_info *info)
3876{
3877 bfd_size_type count;
3878
3879 count = 0;
0e1862bb
L
3880 if (bfd_link_pic (info)
3881 || elf_hash_table (info)->is_relocatable_executable)
d4596a51
RS
3882 {
3883 asection *p;
3884 const struct elf_backend_data *bed;
3885
3886 bed = get_elf_backend_data (output_bfd);
3887 for (p = output_bfd->sections; p ; p = p->next)
3888 if ((p->flags & SEC_EXCLUDE) == 0
3889 && (p->flags & SEC_ALLOC) != 0
7f923b7f 3890 && elf_hash_table (info)->dynamic_relocs
d4596a51
RS
3891 && !(*bed->elf_backend_omit_section_dynsym) (output_bfd, info, p))
3892 ++count;
3893 }
3894 return count;
3895}
3896
b49e97c9 3897/* Sort the dynamic symbol table so that symbols that need GOT entries
d4596a51 3898 appear towards the end. */
b49e97c9 3899
b34976b6 3900static bfd_boolean
d4596a51 3901mips_elf_sort_hash_table (bfd *abfd, struct bfd_link_info *info)
b49e97c9 3902{
a8028dd0 3903 struct mips_elf_link_hash_table *htab;
b49e97c9
TS
3904 struct mips_elf_hash_sort_data hsd;
3905 struct mips_got_info *g;
b49e97c9 3906
a8028dd0 3907 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3908 BFD_ASSERT (htab != NULL);
3909
0f8c4b60 3910 if (htab->root.dynsymcount == 0)
17a80fa8
MR
3911 return TRUE;
3912
a8028dd0 3913 g = htab->got_info;
d4596a51
RS
3914 if (g == NULL)
3915 return TRUE;
f4416af6 3916
b49e97c9 3917 hsd.low = NULL;
23cc69b6
RS
3918 hsd.max_unref_got_dynindx
3919 = hsd.min_got_dynindx
0f8c4b60 3920 = (htab->root.dynsymcount - g->reloc_only_gotno);
e17b0c35
MR
3921 /* Add 1 to local symbol indices to account for the mandatory NULL entry
3922 at the head of the table; see `_bfd_elf_link_renumber_dynsyms'. */
3923 hsd.max_local_dynindx = count_section_dynsyms (abfd, info) + 1;
3924 hsd.max_non_got_dynindx = htab->root.local_dynsymcount + 1;
f16a9783
MS
3925 hsd.output_bfd = abfd;
3926 if (htab->root.dynobj != NULL
3927 && htab->root.dynamic_sections_created
3928 && info->emit_gnu_hash)
3929 {
3930 asection *s = bfd_get_linker_section (htab->root.dynobj, ".MIPS.xhash");
3931 BFD_ASSERT (s != NULL);
3932 hsd.mipsxhash = s->contents;
3933 BFD_ASSERT (hsd.mipsxhash != NULL);
3934 }
3935 else
3936 hsd.mipsxhash = NULL;
0f8c4b60 3937 mips_elf_link_hash_traverse (htab, mips_elf_sort_hash_table_f, &hsd);
b49e97c9
TS
3938
3939 /* There should have been enough room in the symbol table to
44c410de 3940 accommodate both the GOT and non-GOT symbols. */
e17b0c35 3941 BFD_ASSERT (hsd.max_local_dynindx <= htab->root.local_dynsymcount + 1);
b49e97c9 3942 BFD_ASSERT (hsd.max_non_got_dynindx <= hsd.min_got_dynindx);
55f8b9d2 3943 BFD_ASSERT (hsd.max_unref_got_dynindx == htab->root.dynsymcount);
0f8c4b60 3944 BFD_ASSERT (htab->root.dynsymcount - hsd.min_got_dynindx == g->global_gotno);
b49e97c9
TS
3945
3946 /* Now we know which dynamic symbol has the lowest dynamic symbol
3947 table index in the GOT. */
d222d210 3948 htab->global_gotsym = hsd.low;
b49e97c9 3949
b34976b6 3950 return TRUE;
b49e97c9
TS
3951}
3952
3953/* If H needs a GOT entry, assign it the highest available dynamic
3954 index. Otherwise, assign it the lowest available dynamic
3955 index. */
3956
b34976b6 3957static bfd_boolean
9719ad41 3958mips_elf_sort_hash_table_f (struct mips_elf_link_hash_entry *h, void *data)
b49e97c9 3959{
9719ad41 3960 struct mips_elf_hash_sort_data *hsd = data;
b49e97c9 3961
b49e97c9
TS
3962 /* Symbols without dynamic symbol table entries aren't interesting
3963 at all. */
3964 if (h->root.dynindx == -1)
b34976b6 3965 return TRUE;
b49e97c9 3966
634835ae 3967 switch (h->global_got_area)
f4416af6 3968 {
634835ae 3969 case GGA_NONE:
e17b0c35
MR
3970 if (h->root.forced_local)
3971 h->root.dynindx = hsd->max_local_dynindx++;
3972 else
3973 h->root.dynindx = hsd->max_non_got_dynindx++;
634835ae 3974 break;
0f20cc35 3975
634835ae 3976 case GGA_NORMAL:
b49e97c9
TS
3977 h->root.dynindx = --hsd->min_got_dynindx;
3978 hsd->low = (struct elf_link_hash_entry *) h;
634835ae
RS
3979 break;
3980
3981 case GGA_RELOC_ONLY:
634835ae
RS
3982 if (hsd->max_unref_got_dynindx == hsd->min_got_dynindx)
3983 hsd->low = (struct elf_link_hash_entry *) h;
3984 h->root.dynindx = hsd->max_unref_got_dynindx++;
3985 break;
b49e97c9
TS
3986 }
3987
f16a9783
MS
3988 /* Populate the .MIPS.xhash translation table entry with
3989 the symbol dynindx. */
3990 if (h->mipsxhash_loc != 0 && hsd->mipsxhash != NULL)
3991 bfd_put_32 (hsd->output_bfd, h->root.dynindx,
3992 hsd->mipsxhash + h->mipsxhash_loc);
3993
b34976b6 3994 return TRUE;
b49e97c9
TS
3995}
3996
ee227692
RS
3997/* Record that input bfd ABFD requires a GOT entry like *LOOKUP
3998 (which is owned by the caller and shouldn't be added to the
3999 hash table directly). */
4000
4001static bfd_boolean
4002mips_elf_record_got_entry (struct bfd_link_info *info, bfd *abfd,
4003 struct mips_got_entry *lookup)
4004{
4005 struct mips_elf_link_hash_table *htab;
4006 struct mips_got_entry *entry;
4007 struct mips_got_info *g;
4008 void **loc, **bfd_loc;
4009
4010 /* Make sure there's a slot for this entry in the master GOT. */
4011 htab = mips_elf_hash_table (info);
4012 g = htab->got_info;
4013 loc = htab_find_slot (g->got_entries, lookup, INSERT);
4014 if (!loc)
4015 return FALSE;
4016
4017 /* Populate the entry if it isn't already. */
4018 entry = (struct mips_got_entry *) *loc;
4019 if (!entry)
4020 {
4021 entry = (struct mips_got_entry *) bfd_alloc (abfd, sizeof (*entry));
4022 if (!entry)
4023 return FALSE;
4024
9ab066b4 4025 lookup->tls_initialized = FALSE;
ee227692
RS
4026 lookup->gotidx = -1;
4027 *entry = *lookup;
4028 *loc = entry;
4029 }
4030
4031 /* Reuse the same GOT entry for the BFD's GOT. */
4032 g = mips_elf_bfd_got (abfd, TRUE);
4033 if (!g)
4034 return FALSE;
4035
4036 bfd_loc = htab_find_slot (g->got_entries, lookup, INSERT);
4037 if (!bfd_loc)
4038 return FALSE;
4039
4040 if (!*bfd_loc)
4041 *bfd_loc = entry;
4042 return TRUE;
4043}
4044
e641e783
RS
4045/* ABFD has a GOT relocation of type R_TYPE against H. Reserve a GOT
4046 entry for it. FOR_CALL is true if the caller is only interested in
6ccf4795 4047 using the GOT entry for calls. */
b49e97c9 4048
b34976b6 4049static bfd_boolean
9719ad41
RS
4050mips_elf_record_global_got_symbol (struct elf_link_hash_entry *h,
4051 bfd *abfd, struct bfd_link_info *info,
e641e783 4052 bfd_boolean for_call, int r_type)
b49e97c9 4053{
a8028dd0 4054 struct mips_elf_link_hash_table *htab;
634835ae 4055 struct mips_elf_link_hash_entry *hmips;
ee227692
RS
4056 struct mips_got_entry entry;
4057 unsigned char tls_type;
a8028dd0
RS
4058
4059 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4060 BFD_ASSERT (htab != NULL);
4061
634835ae 4062 hmips = (struct mips_elf_link_hash_entry *) h;
6ccf4795
RS
4063 if (!for_call)
4064 hmips->got_only_for_calls = FALSE;
f4416af6 4065
b49e97c9
TS
4066 /* A global symbol in the GOT must also be in the dynamic symbol
4067 table. */
7c5fcef7
L
4068 if (h->dynindx == -1)
4069 {
4070 switch (ELF_ST_VISIBILITY (h->other))
4071 {
4072 case STV_INTERNAL:
4073 case STV_HIDDEN:
47275900 4074 _bfd_mips_elf_hide_symbol (info, h, TRUE);
7c5fcef7
L
4075 break;
4076 }
c152c796 4077 if (!bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 4078 return FALSE;
7c5fcef7 4079 }
b49e97c9 4080
ee227692 4081 tls_type = mips_elf_reloc_tls_type (r_type);
9ab066b4 4082 if (tls_type == GOT_TLS_NONE && hmips->global_got_area > GGA_NORMAL)
ee227692 4083 hmips->global_got_area = GGA_NORMAL;
86324f90 4084
f4416af6
AO
4085 entry.abfd = abfd;
4086 entry.symndx = -1;
4087 entry.d.h = (struct mips_elf_link_hash_entry *) h;
ee227692
RS
4088 entry.tls_type = tls_type;
4089 return mips_elf_record_got_entry (info, abfd, &entry);
b49e97c9 4090}
f4416af6 4091
e641e783
RS
4092/* ABFD has a GOT relocation of type R_TYPE against symbol SYMNDX + ADDEND,
4093 where SYMNDX is a local symbol. Reserve a GOT entry for it. */
f4416af6
AO
4094
4095static bfd_boolean
9719ad41 4096mips_elf_record_local_got_symbol (bfd *abfd, long symndx, bfd_vma addend,
e641e783 4097 struct bfd_link_info *info, int r_type)
f4416af6 4098{
a8028dd0
RS
4099 struct mips_elf_link_hash_table *htab;
4100 struct mips_got_info *g;
ee227692 4101 struct mips_got_entry entry;
f4416af6 4102
a8028dd0 4103 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4104 BFD_ASSERT (htab != NULL);
4105
a8028dd0
RS
4106 g = htab->got_info;
4107 BFD_ASSERT (g != NULL);
4108
f4416af6
AO
4109 entry.abfd = abfd;
4110 entry.symndx = symndx;
4111 entry.d.addend = addend;
e641e783 4112 entry.tls_type = mips_elf_reloc_tls_type (r_type);
ee227692 4113 return mips_elf_record_got_entry (info, abfd, &entry);
f4416af6 4114}
c224138d 4115
13db6b44
RS
4116/* Record that ABFD has a page relocation against SYMNDX + ADDEND.
4117 H is the symbol's hash table entry, or null if SYMNDX is local
4118 to ABFD. */
c224138d
RS
4119
4120static bfd_boolean
13db6b44
RS
4121mips_elf_record_got_page_ref (struct bfd_link_info *info, bfd *abfd,
4122 long symndx, struct elf_link_hash_entry *h,
4123 bfd_signed_vma addend)
c224138d 4124{
a8028dd0 4125 struct mips_elf_link_hash_table *htab;
ee227692 4126 struct mips_got_info *g1, *g2;
13db6b44 4127 struct mips_got_page_ref lookup, *entry;
ee227692 4128 void **loc, **bfd_loc;
c224138d 4129
a8028dd0 4130 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4131 BFD_ASSERT (htab != NULL);
4132
ee227692
RS
4133 g1 = htab->got_info;
4134 BFD_ASSERT (g1 != NULL);
a8028dd0 4135
13db6b44
RS
4136 if (h)
4137 {
4138 lookup.symndx = -1;
4139 lookup.u.h = (struct mips_elf_link_hash_entry *) h;
4140 }
4141 else
4142 {
4143 lookup.symndx = symndx;
4144 lookup.u.abfd = abfd;
4145 }
4146 lookup.addend = addend;
4147 loc = htab_find_slot (g1->got_page_refs, &lookup, INSERT);
c224138d
RS
4148 if (loc == NULL)
4149 return FALSE;
4150
13db6b44 4151 entry = (struct mips_got_page_ref *) *loc;
c224138d
RS
4152 if (!entry)
4153 {
4154 entry = bfd_alloc (abfd, sizeof (*entry));
4155 if (!entry)
4156 return FALSE;
4157
13db6b44 4158 *entry = lookup;
c224138d
RS
4159 *loc = entry;
4160 }
4161
ee227692
RS
4162 /* Add the same entry to the BFD's GOT. */
4163 g2 = mips_elf_bfd_got (abfd, TRUE);
4164 if (!g2)
4165 return FALSE;
4166
13db6b44 4167 bfd_loc = htab_find_slot (g2->got_page_refs, &lookup, INSERT);
ee227692
RS
4168 if (!bfd_loc)
4169 return FALSE;
4170
4171 if (!*bfd_loc)
4172 *bfd_loc = entry;
4173
c224138d
RS
4174 return TRUE;
4175}
33bb52fb
RS
4176
4177/* Add room for N relocations to the .rel(a).dyn section in ABFD. */
4178
4179static void
4180mips_elf_allocate_dynamic_relocations (bfd *abfd, struct bfd_link_info *info,
4181 unsigned int n)
4182{
4183 asection *s;
4184 struct mips_elf_link_hash_table *htab;
4185
4186 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4187 BFD_ASSERT (htab != NULL);
4188
33bb52fb
RS
4189 s = mips_elf_rel_dyn_section (info, FALSE);
4190 BFD_ASSERT (s != NULL);
4191
4192 if (htab->is_vxworks)
4193 s->size += n * MIPS_ELF_RELA_SIZE (abfd);
4194 else
4195 {
4196 if (s->size == 0)
4197 {
4198 /* Make room for a null element. */
4199 s->size += MIPS_ELF_REL_SIZE (abfd);
4200 ++s->reloc_count;
4201 }
4202 s->size += n * MIPS_ELF_REL_SIZE (abfd);
4203 }
4204}
4205\f
476366af
RS
4206/* A htab_traverse callback for GOT entries, with DATA pointing to a
4207 mips_elf_traverse_got_arg structure. Count the number of GOT
4208 entries and TLS relocs. Set DATA->value to true if we need
4209 to resolve indirect or warning symbols and then recreate the GOT. */
33bb52fb
RS
4210
4211static int
4212mips_elf_check_recreate_got (void **entryp, void *data)
4213{
4214 struct mips_got_entry *entry;
476366af 4215 struct mips_elf_traverse_got_arg *arg;
33bb52fb
RS
4216
4217 entry = (struct mips_got_entry *) *entryp;
476366af 4218 arg = (struct mips_elf_traverse_got_arg *) data;
33bb52fb
RS
4219 if (entry->abfd != NULL && entry->symndx == -1)
4220 {
4221 struct mips_elf_link_hash_entry *h;
4222
4223 h = entry->d.h;
4224 if (h->root.root.type == bfd_link_hash_indirect
4225 || h->root.root.type == bfd_link_hash_warning)
4226 {
476366af 4227 arg->value = TRUE;
33bb52fb
RS
4228 return 0;
4229 }
4230 }
476366af 4231 mips_elf_count_got_entry (arg->info, arg->g, entry);
33bb52fb
RS
4232 return 1;
4233}
4234
476366af
RS
4235/* A htab_traverse callback for GOT entries, with DATA pointing to a
4236 mips_elf_traverse_got_arg structure. Add all entries to DATA->g,
4237 converting entries for indirect and warning symbols into entries
4238 for the target symbol. Set DATA->g to null on error. */
33bb52fb
RS
4239
4240static int
4241mips_elf_recreate_got (void **entryp, void *data)
4242{
72e7511a 4243 struct mips_got_entry new_entry, *entry;
476366af 4244 struct mips_elf_traverse_got_arg *arg;
33bb52fb
RS
4245 void **slot;
4246
33bb52fb 4247 entry = (struct mips_got_entry *) *entryp;
476366af 4248 arg = (struct mips_elf_traverse_got_arg *) data;
72e7511a
RS
4249 if (entry->abfd != NULL
4250 && entry->symndx == -1
4251 && (entry->d.h->root.root.type == bfd_link_hash_indirect
4252 || entry->d.h->root.root.type == bfd_link_hash_warning))
33bb52fb
RS
4253 {
4254 struct mips_elf_link_hash_entry *h;
4255
72e7511a
RS
4256 new_entry = *entry;
4257 entry = &new_entry;
33bb52fb 4258 h = entry->d.h;
72e7511a 4259 do
634835ae
RS
4260 {
4261 BFD_ASSERT (h->global_got_area == GGA_NONE);
4262 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
4263 }
72e7511a
RS
4264 while (h->root.root.type == bfd_link_hash_indirect
4265 || h->root.root.type == bfd_link_hash_warning);
33bb52fb
RS
4266 entry->d.h = h;
4267 }
476366af 4268 slot = htab_find_slot (arg->g->got_entries, entry, INSERT);
33bb52fb
RS
4269 if (slot == NULL)
4270 {
476366af 4271 arg->g = NULL;
33bb52fb
RS
4272 return 0;
4273 }
4274 if (*slot == NULL)
72e7511a
RS
4275 {
4276 if (entry == &new_entry)
4277 {
4278 entry = bfd_alloc (entry->abfd, sizeof (*entry));
4279 if (!entry)
4280 {
476366af 4281 arg->g = NULL;
72e7511a
RS
4282 return 0;
4283 }
4284 *entry = new_entry;
4285 }
4286 *slot = entry;
476366af 4287 mips_elf_count_got_entry (arg->info, arg->g, entry);
72e7511a 4288 }
33bb52fb
RS
4289 return 1;
4290}
4291
13db6b44
RS
4292/* Return the maximum number of GOT page entries required for RANGE. */
4293
4294static bfd_vma
4295mips_elf_pages_for_range (const struct mips_got_page_range *range)
4296{
4297 return (range->max_addend - range->min_addend + 0x1ffff) >> 16;
4298}
4299
4300/* Record that G requires a page entry that can reach SEC + ADDEND. */
4301
4302static bfd_boolean
b75d42bc 4303mips_elf_record_got_page_entry (struct mips_elf_traverse_got_arg *arg,
13db6b44
RS
4304 asection *sec, bfd_signed_vma addend)
4305{
b75d42bc 4306 struct mips_got_info *g = arg->g;
13db6b44
RS
4307 struct mips_got_page_entry lookup, *entry;
4308 struct mips_got_page_range **range_ptr, *range;
4309 bfd_vma old_pages, new_pages;
4310 void **loc;
4311
4312 /* Find the mips_got_page_entry hash table entry for this section. */
4313 lookup.sec = sec;
4314 loc = htab_find_slot (g->got_page_entries, &lookup, INSERT);
4315 if (loc == NULL)
4316 return FALSE;
4317
4318 /* Create a mips_got_page_entry if this is the first time we've
4319 seen the section. */
4320 entry = (struct mips_got_page_entry *) *loc;
4321 if (!entry)
4322 {
b75d42bc 4323 entry = bfd_zalloc (arg->info->output_bfd, sizeof (*entry));
13db6b44
RS
4324 if (!entry)
4325 return FALSE;
4326
4327 entry->sec = sec;
4328 *loc = entry;
4329 }
4330
4331 /* Skip over ranges whose maximum extent cannot share a page entry
4332 with ADDEND. */
4333 range_ptr = &entry->ranges;
4334 while (*range_ptr && addend > (*range_ptr)->max_addend + 0xffff)
4335 range_ptr = &(*range_ptr)->next;
4336
4337 /* If we scanned to the end of the list, or found a range whose
4338 minimum extent cannot share a page entry with ADDEND, create
4339 a new singleton range. */
4340 range = *range_ptr;
4341 if (!range || addend < range->min_addend - 0xffff)
4342 {
b75d42bc 4343 range = bfd_zalloc (arg->info->output_bfd, sizeof (*range));
13db6b44
RS
4344 if (!range)
4345 return FALSE;
4346
4347 range->next = *range_ptr;
4348 range->min_addend = addend;
4349 range->max_addend = addend;
4350
4351 *range_ptr = range;
4352 entry->num_pages++;
4353 g->page_gotno++;
4354 return TRUE;
4355 }
4356
4357 /* Remember how many pages the old range contributed. */
4358 old_pages = mips_elf_pages_for_range (range);
4359
4360 /* Update the ranges. */
4361 if (addend < range->min_addend)
4362 range->min_addend = addend;
4363 else if (addend > range->max_addend)
4364 {
4365 if (range->next && addend >= range->next->min_addend - 0xffff)
4366 {
4367 old_pages += mips_elf_pages_for_range (range->next);
4368 range->max_addend = range->next->max_addend;
4369 range->next = range->next->next;
4370 }
4371 else
4372 range->max_addend = addend;
4373 }
4374
4375 /* Record any change in the total estimate. */
4376 new_pages = mips_elf_pages_for_range (range);
4377 if (old_pages != new_pages)
4378 {
4379 entry->num_pages += new_pages - old_pages;
4380 g->page_gotno += new_pages - old_pages;
4381 }
4382
4383 return TRUE;
4384}
4385
4386/* A htab_traverse callback for which *REFP points to a mips_got_page_ref
4387 and for which DATA points to a mips_elf_traverse_got_arg. Work out
4388 whether the page reference described by *REFP needs a GOT page entry,
4389 and record that entry in DATA->g if so. Set DATA->g to null on failure. */
4390
4391static bfd_boolean
4392mips_elf_resolve_got_page_ref (void **refp, void *data)
4393{
4394 struct mips_got_page_ref *ref;
4395 struct mips_elf_traverse_got_arg *arg;
4396 struct mips_elf_link_hash_table *htab;
4397 asection *sec;
4398 bfd_vma addend;
4399
4400 ref = (struct mips_got_page_ref *) *refp;
4401 arg = (struct mips_elf_traverse_got_arg *) data;
4402 htab = mips_elf_hash_table (arg->info);
4403
4404 if (ref->symndx < 0)
4405 {
4406 struct mips_elf_link_hash_entry *h;
4407
4408 /* Global GOT_PAGEs decay to GOT_DISP and so don't need page entries. */
4409 h = ref->u.h;
4410 if (!SYMBOL_REFERENCES_LOCAL (arg->info, &h->root))
4411 return 1;
4412
4413 /* Ignore undefined symbols; we'll issue an error later if
4414 appropriate. */
4415 if (!((h->root.root.type == bfd_link_hash_defined
4416 || h->root.root.type == bfd_link_hash_defweak)
4417 && h->root.root.u.def.section))
4418 return 1;
4419
4420 sec = h->root.root.u.def.section;
4421 addend = h->root.root.u.def.value + ref->addend;
4422 }
4423 else
4424 {
4425 Elf_Internal_Sym *isym;
4426
4427 /* Read in the symbol. */
4428 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ref->u.abfd,
4429 ref->symndx);
4430 if (isym == NULL)
4431 {
4432 arg->g = NULL;
4433 return 0;
4434 }
4435
4436 /* Get the associated input section. */
4437 sec = bfd_section_from_elf_index (ref->u.abfd, isym->st_shndx);
4438 if (sec == NULL)
4439 {
4440 arg->g = NULL;
4441 return 0;
4442 }
4443
4444 /* If this is a mergable section, work out the section and offset
4445 of the merged data. For section symbols, the addend specifies
4446 of the offset _of_ the first byte in the data, otherwise it
4447 specifies the offset _from_ the first byte. */
4448 if (sec->flags & SEC_MERGE)
4449 {
4450 void *secinfo;
4451
4452 secinfo = elf_section_data (sec)->sec_info;
4453 if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
4454 addend = _bfd_merged_section_offset (ref->u.abfd, &sec, secinfo,
4455 isym->st_value + ref->addend);
4456 else
4457 addend = _bfd_merged_section_offset (ref->u.abfd, &sec, secinfo,
4458 isym->st_value) + ref->addend;
4459 }
4460 else
4461 addend = isym->st_value + ref->addend;
4462 }
b75d42bc 4463 if (!mips_elf_record_got_page_entry (arg, sec, addend))
13db6b44
RS
4464 {
4465 arg->g = NULL;
4466 return 0;
4467 }
4468 return 1;
4469}
4470
33bb52fb 4471/* If any entries in G->got_entries are for indirect or warning symbols,
13db6b44
RS
4472 replace them with entries for the target symbol. Convert g->got_page_refs
4473 into got_page_entry structures and estimate the number of page entries
4474 that they require. */
33bb52fb
RS
4475
4476static bfd_boolean
476366af
RS
4477mips_elf_resolve_final_got_entries (struct bfd_link_info *info,
4478 struct mips_got_info *g)
33bb52fb 4479{
476366af
RS
4480 struct mips_elf_traverse_got_arg tga;
4481 struct mips_got_info oldg;
4482
4483 oldg = *g;
33bb52fb 4484
476366af
RS
4485 tga.info = info;
4486 tga.g = g;
4487 tga.value = FALSE;
4488 htab_traverse (g->got_entries, mips_elf_check_recreate_got, &tga);
4489 if (tga.value)
33bb52fb 4490 {
476366af
RS
4491 *g = oldg;
4492 g->got_entries = htab_create (htab_size (oldg.got_entries),
4493 mips_elf_got_entry_hash,
4494 mips_elf_got_entry_eq, NULL);
4495 if (!g->got_entries)
33bb52fb
RS
4496 return FALSE;
4497
476366af
RS
4498 htab_traverse (oldg.got_entries, mips_elf_recreate_got, &tga);
4499 if (!tga.g)
4500 return FALSE;
4501
4502 htab_delete (oldg.got_entries);
33bb52fb 4503 }
13db6b44
RS
4504
4505 g->got_page_entries = htab_try_create (1, mips_got_page_entry_hash,
4506 mips_got_page_entry_eq, NULL);
4507 if (g->got_page_entries == NULL)
4508 return FALSE;
4509
4510 tga.info = info;
4511 tga.g = g;
4512 htab_traverse (g->got_page_refs, mips_elf_resolve_got_page_ref, &tga);
4513
33bb52fb
RS
4514 return TRUE;
4515}
4516
c5d6fa44
RS
4517/* Return true if a GOT entry for H should live in the local rather than
4518 global GOT area. */
4519
4520static bfd_boolean
4521mips_use_local_got_p (struct bfd_link_info *info,
4522 struct mips_elf_link_hash_entry *h)
4523{
4524 /* Symbols that aren't in the dynamic symbol table must live in the
4525 local GOT. This includes symbols that are completely undefined
4526 and which therefore don't bind locally. We'll report undefined
4527 symbols later if appropriate. */
4528 if (h->root.dynindx == -1)
4529 return TRUE;
4530
47275900
MR
4531 /* Absolute symbols, if ever they need a GOT entry, cannot ever go
4532 to the local GOT, as they would be implicitly relocated by the
4533 base address by the dynamic loader. */
4534 if (bfd_is_abs_symbol (&h->root.root))
4535 return FALSE;
4536
c5d6fa44
RS
4537 /* Symbols that bind locally can (and in the case of forced-local
4538 symbols, must) live in the local GOT. */
4539 if (h->got_only_for_calls
4540 ? SYMBOL_CALLS_LOCAL (info, &h->root)
4541 : SYMBOL_REFERENCES_LOCAL (info, &h->root))
4542 return TRUE;
4543
4544 /* If this is an executable that must provide a definition of the symbol,
4545 either though PLTs or copy relocations, then that address should go in
4546 the local rather than global GOT. */
0e1862bb 4547 if (bfd_link_executable (info) && h->has_static_relocs)
c5d6fa44
RS
4548 return TRUE;
4549
4550 return FALSE;
4551}
4552
6c42ddb9
RS
4553/* A mips_elf_link_hash_traverse callback for which DATA points to the
4554 link_info structure. Decide whether the hash entry needs an entry in
4555 the global part of the primary GOT, setting global_got_area accordingly.
4556 Count the number of global symbols that are in the primary GOT only
4557 because they have relocations against them (reloc_only_gotno). */
33bb52fb
RS
4558
4559static int
d4596a51 4560mips_elf_count_got_symbols (struct mips_elf_link_hash_entry *h, void *data)
33bb52fb 4561{
020d7251 4562 struct bfd_link_info *info;
6ccf4795 4563 struct mips_elf_link_hash_table *htab;
33bb52fb
RS
4564 struct mips_got_info *g;
4565
020d7251 4566 info = (struct bfd_link_info *) data;
6ccf4795
RS
4567 htab = mips_elf_hash_table (info);
4568 g = htab->got_info;
d4596a51 4569 if (h->global_got_area != GGA_NONE)
33bb52fb 4570 {
020d7251 4571 /* Make a final decision about whether the symbol belongs in the
c5d6fa44
RS
4572 local or global GOT. */
4573 if (mips_use_local_got_p (info, h))
6c42ddb9
RS
4574 /* The symbol belongs in the local GOT. We no longer need this
4575 entry if it was only used for relocations; those relocations
4576 will be against the null or section symbol instead of H. */
4577 h->global_got_area = GGA_NONE;
6ccf4795
RS
4578 else if (htab->is_vxworks
4579 && h->got_only_for_calls
1bbce132 4580 && h->root.plt.plist->mips_offset != MINUS_ONE)
6ccf4795
RS
4581 /* On VxWorks, calls can refer directly to the .got.plt entry;
4582 they don't need entries in the regular GOT. .got.plt entries
4583 will be allocated by _bfd_mips_elf_adjust_dynamic_symbol. */
4584 h->global_got_area = GGA_NONE;
6c42ddb9 4585 else if (h->global_got_area == GGA_RELOC_ONLY)
23cc69b6 4586 {
6c42ddb9 4587 g->reloc_only_gotno++;
23cc69b6 4588 g->global_gotno++;
23cc69b6 4589 }
33bb52fb
RS
4590 }
4591 return 1;
4592}
f4416af6 4593\f
d7206569
RS
4594/* A htab_traverse callback for GOT entries. Add each one to the GOT
4595 given in mips_elf_traverse_got_arg DATA. Clear DATA->G on error. */
f4416af6
AO
4596
4597static int
d7206569 4598mips_elf_add_got_entry (void **entryp, void *data)
f4416af6 4599{
d7206569
RS
4600 struct mips_got_entry *entry;
4601 struct mips_elf_traverse_got_arg *arg;
4602 void **slot;
f4416af6 4603
d7206569
RS
4604 entry = (struct mips_got_entry *) *entryp;
4605 arg = (struct mips_elf_traverse_got_arg *) data;
4606 slot = htab_find_slot (arg->g->got_entries, entry, INSERT);
4607 if (!slot)
f4416af6 4608 {
d7206569
RS
4609 arg->g = NULL;
4610 return 0;
f4416af6 4611 }
d7206569 4612 if (!*slot)
c224138d 4613 {
d7206569
RS
4614 *slot = entry;
4615 mips_elf_count_got_entry (arg->info, arg->g, entry);
c224138d 4616 }
f4416af6
AO
4617 return 1;
4618}
4619
d7206569
RS
4620/* A htab_traverse callback for GOT page entries. Add each one to the GOT
4621 given in mips_elf_traverse_got_arg DATA. Clear DATA->G on error. */
c224138d
RS
4622
4623static int
d7206569 4624mips_elf_add_got_page_entry (void **entryp, void *data)
c224138d 4625{
d7206569
RS
4626 struct mips_got_page_entry *entry;
4627 struct mips_elf_traverse_got_arg *arg;
4628 void **slot;
c224138d 4629
d7206569
RS
4630 entry = (struct mips_got_page_entry *) *entryp;
4631 arg = (struct mips_elf_traverse_got_arg *) data;
4632 slot = htab_find_slot (arg->g->got_page_entries, entry, INSERT);
4633 if (!slot)
c224138d 4634 {
d7206569 4635 arg->g = NULL;
c224138d
RS
4636 return 0;
4637 }
d7206569
RS
4638 if (!*slot)
4639 {
4640 *slot = entry;
4641 arg->g->page_gotno += entry->num_pages;
4642 }
c224138d
RS
4643 return 1;
4644}
4645
d7206569
RS
4646/* Consider merging FROM, which is ABFD's GOT, into TO. Return -1 if
4647 this would lead to overflow, 1 if they were merged successfully,
4648 and 0 if a merge failed due to lack of memory. (These values are chosen
4649 so that nonnegative return values can be returned by a htab_traverse
4650 callback.) */
c224138d
RS
4651
4652static int
d7206569 4653mips_elf_merge_got_with (bfd *abfd, struct mips_got_info *from,
c224138d
RS
4654 struct mips_got_info *to,
4655 struct mips_elf_got_per_bfd_arg *arg)
4656{
d7206569 4657 struct mips_elf_traverse_got_arg tga;
c224138d
RS
4658 unsigned int estimate;
4659
4660 /* Work out how many page entries we would need for the combined GOT. */
4661 estimate = arg->max_pages;
4662 if (estimate >= from->page_gotno + to->page_gotno)
4663 estimate = from->page_gotno + to->page_gotno;
4664
e2ece73c 4665 /* And conservatively estimate how many local and TLS entries
c224138d 4666 would be needed. */
e2ece73c
RS
4667 estimate += from->local_gotno + to->local_gotno;
4668 estimate += from->tls_gotno + to->tls_gotno;
4669
17214937
RS
4670 /* If we're merging with the primary got, any TLS relocations will
4671 come after the full set of global entries. Otherwise estimate those
e2ece73c 4672 conservatively as well. */
17214937 4673 if (to == arg->primary && from->tls_gotno + to->tls_gotno)
e2ece73c
RS
4674 estimate += arg->global_count;
4675 else
4676 estimate += from->global_gotno + to->global_gotno;
c224138d
RS
4677
4678 /* Bail out if the combined GOT might be too big. */
4679 if (estimate > arg->max_count)
4680 return -1;
4681
c224138d 4682 /* Transfer the bfd's got information from FROM to TO. */
d7206569
RS
4683 tga.info = arg->info;
4684 tga.g = to;
4685 htab_traverse (from->got_entries, mips_elf_add_got_entry, &tga);
4686 if (!tga.g)
c224138d
RS
4687 return 0;
4688
d7206569
RS
4689 htab_traverse (from->got_page_entries, mips_elf_add_got_page_entry, &tga);
4690 if (!tga.g)
c224138d
RS
4691 return 0;
4692
d7206569 4693 mips_elf_replace_bfd_got (abfd, to);
c224138d
RS
4694 return 1;
4695}
4696
d7206569 4697/* Attempt to merge GOT G, which belongs to ABFD. Try to use as much
f4416af6
AO
4698 as possible of the primary got, since it doesn't require explicit
4699 dynamic relocations, but don't use bfds that would reference global
4700 symbols out of the addressable range. Failing the primary got,
4701 attempt to merge with the current got, or finish the current got
4702 and then make make the new got current. */
4703
d7206569
RS
4704static bfd_boolean
4705mips_elf_merge_got (bfd *abfd, struct mips_got_info *g,
4706 struct mips_elf_got_per_bfd_arg *arg)
f4416af6 4707{
c224138d
RS
4708 unsigned int estimate;
4709 int result;
4710
476366af 4711 if (!mips_elf_resolve_final_got_entries (arg->info, g))
d7206569
RS
4712 return FALSE;
4713
c224138d
RS
4714 /* Work out the number of page, local and TLS entries. */
4715 estimate = arg->max_pages;
4716 if (estimate > g->page_gotno)
4717 estimate = g->page_gotno;
4718 estimate += g->local_gotno + g->tls_gotno;
0f20cc35
DJ
4719
4720 /* We place TLS GOT entries after both locals and globals. The globals
4721 for the primary GOT may overflow the normal GOT size limit, so be
4722 sure not to merge a GOT which requires TLS with the primary GOT in that
4723 case. This doesn't affect non-primary GOTs. */
c224138d 4724 estimate += (g->tls_gotno > 0 ? arg->global_count : g->global_gotno);
143d77c5 4725
c224138d 4726 if (estimate <= arg->max_count)
f4416af6 4727 {
c224138d
RS
4728 /* If we don't have a primary GOT, use it as
4729 a starting point for the primary GOT. */
4730 if (!arg->primary)
4731 {
d7206569
RS
4732 arg->primary = g;
4733 return TRUE;
c224138d 4734 }
f4416af6 4735
c224138d 4736 /* Try merging with the primary GOT. */
d7206569 4737 result = mips_elf_merge_got_with (abfd, g, arg->primary, arg);
c224138d
RS
4738 if (result >= 0)
4739 return result;
f4416af6 4740 }
c224138d 4741
f4416af6 4742 /* If we can merge with the last-created got, do it. */
c224138d 4743 if (arg->current)
f4416af6 4744 {
d7206569 4745 result = mips_elf_merge_got_with (abfd, g, arg->current, arg);
c224138d
RS
4746 if (result >= 0)
4747 return result;
f4416af6 4748 }
c224138d 4749
f4416af6
AO
4750 /* Well, we couldn't merge, so create a new GOT. Don't check if it
4751 fits; if it turns out that it doesn't, we'll get relocation
4752 overflows anyway. */
c224138d
RS
4753 g->next = arg->current;
4754 arg->current = g;
0f20cc35 4755
d7206569 4756 return TRUE;
0f20cc35
DJ
4757}
4758
72e7511a
RS
4759/* ENTRYP is a hash table entry for a mips_got_entry. Set its gotidx
4760 to GOTIDX, duplicating the entry if it has already been assigned
4761 an index in a different GOT. */
4762
4763static bfd_boolean
4764mips_elf_set_gotidx (void **entryp, long gotidx)
4765{
4766 struct mips_got_entry *entry;
4767
4768 entry = (struct mips_got_entry *) *entryp;
4769 if (entry->gotidx > 0)
4770 {
4771 struct mips_got_entry *new_entry;
4772
4773 new_entry = bfd_alloc (entry->abfd, sizeof (*entry));
4774 if (!new_entry)
4775 return FALSE;
4776
4777 *new_entry = *entry;
4778 *entryp = new_entry;
4779 entry = new_entry;
4780 }
4781 entry->gotidx = gotidx;
4782 return TRUE;
4783}
4784
4785/* Set the TLS GOT index for the GOT entry in ENTRYP. DATA points to a
4786 mips_elf_traverse_got_arg in which DATA->value is the size of one
4787 GOT entry. Set DATA->g to null on failure. */
0f20cc35
DJ
4788
4789static int
72e7511a 4790mips_elf_initialize_tls_index (void **entryp, void *data)
0f20cc35 4791{
72e7511a
RS
4792 struct mips_got_entry *entry;
4793 struct mips_elf_traverse_got_arg *arg;
0f20cc35
DJ
4794
4795 /* We're only interested in TLS symbols. */
72e7511a 4796 entry = (struct mips_got_entry *) *entryp;
9ab066b4 4797 if (entry->tls_type == GOT_TLS_NONE)
0f20cc35
DJ
4798 return 1;
4799
72e7511a 4800 arg = (struct mips_elf_traverse_got_arg *) data;
6c42ddb9 4801 if (!mips_elf_set_gotidx (entryp, arg->value * arg->g->tls_assigned_gotno))
ead49a57 4802 {
6c42ddb9
RS
4803 arg->g = NULL;
4804 return 0;
f4416af6
AO
4805 }
4806
ead49a57 4807 /* Account for the entries we've just allocated. */
9ab066b4 4808 arg->g->tls_assigned_gotno += mips_tls_got_entries (entry->tls_type);
f4416af6
AO
4809 return 1;
4810}
4811
ab361d49
RS
4812/* A htab_traverse callback for GOT entries, where DATA points to a
4813 mips_elf_traverse_got_arg. Set the global_got_area of each global
4814 symbol to DATA->value. */
f4416af6 4815
f4416af6 4816static int
ab361d49 4817mips_elf_set_global_got_area (void **entryp, void *data)
f4416af6 4818{
ab361d49
RS
4819 struct mips_got_entry *entry;
4820 struct mips_elf_traverse_got_arg *arg;
f4416af6 4821
ab361d49
RS
4822 entry = (struct mips_got_entry *) *entryp;
4823 arg = (struct mips_elf_traverse_got_arg *) data;
4824 if (entry->abfd != NULL
4825 && entry->symndx == -1
4826 && entry->d.h->global_got_area != GGA_NONE)
4827 entry->d.h->global_got_area = arg->value;
4828 return 1;
4829}
4830
4831/* A htab_traverse callback for secondary GOT entries, where DATA points
4832 to a mips_elf_traverse_got_arg. Assign GOT indices to global entries
4833 and record the number of relocations they require. DATA->value is
72e7511a 4834 the size of one GOT entry. Set DATA->g to null on failure. */
ab361d49
RS
4835
4836static int
4837mips_elf_set_global_gotidx (void **entryp, void *data)
4838{
4839 struct mips_got_entry *entry;
4840 struct mips_elf_traverse_got_arg *arg;
0f20cc35 4841
ab361d49
RS
4842 entry = (struct mips_got_entry *) *entryp;
4843 arg = (struct mips_elf_traverse_got_arg *) data;
634835ae
RS
4844 if (entry->abfd != NULL
4845 && entry->symndx == -1
4846 && entry->d.h->global_got_area != GGA_NONE)
f4416af6 4847 {
cb22ccf4 4848 if (!mips_elf_set_gotidx (entryp, arg->value * arg->g->assigned_low_gotno))
72e7511a
RS
4849 {
4850 arg->g = NULL;
4851 return 0;
4852 }
cb22ccf4 4853 arg->g->assigned_low_gotno += 1;
72e7511a 4854
0e1862bb 4855 if (bfd_link_pic (arg->info)
ab361d49
RS
4856 || (elf_hash_table (arg->info)->dynamic_sections_created
4857 && entry->d.h->root.def_dynamic
4858 && !entry->d.h->root.def_regular))
4859 arg->g->relocs += 1;
f4416af6
AO
4860 }
4861
4862 return 1;
4863}
4864
33bb52fb
RS
4865/* A htab_traverse callback for GOT entries for which DATA is the
4866 bfd_link_info. Forbid any global symbols from having traditional
4867 lazy-binding stubs. */
4868
0626d451 4869static int
33bb52fb 4870mips_elf_forbid_lazy_stubs (void **entryp, void *data)
0626d451 4871{
33bb52fb
RS
4872 struct bfd_link_info *info;
4873 struct mips_elf_link_hash_table *htab;
4874 struct mips_got_entry *entry;
0626d451 4875
33bb52fb
RS
4876 entry = (struct mips_got_entry *) *entryp;
4877 info = (struct bfd_link_info *) data;
4878 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4879 BFD_ASSERT (htab != NULL);
4880
0626d451
RS
4881 if (entry->abfd != NULL
4882 && entry->symndx == -1
33bb52fb 4883 && entry->d.h->needs_lazy_stub)
f4416af6 4884 {
33bb52fb
RS
4885 entry->d.h->needs_lazy_stub = FALSE;
4886 htab->lazy_stub_count--;
f4416af6 4887 }
143d77c5 4888
f4416af6
AO
4889 return 1;
4890}
4891
f4416af6
AO
4892/* Return the offset of an input bfd IBFD's GOT from the beginning of
4893 the primary GOT. */
4894static bfd_vma
9719ad41 4895mips_elf_adjust_gp (bfd *abfd, struct mips_got_info *g, bfd *ibfd)
f4416af6 4896{
d7206569 4897 if (!g->next)
f4416af6
AO
4898 return 0;
4899
d7206569 4900 g = mips_elf_bfd_got (ibfd, FALSE);
f4416af6
AO
4901 if (! g)
4902 return 0;
4903
4904 BFD_ASSERT (g->next);
4905
4906 g = g->next;
143d77c5 4907
0f20cc35
DJ
4908 return (g->local_gotno + g->global_gotno + g->tls_gotno)
4909 * MIPS_ELF_GOT_SIZE (abfd);
f4416af6
AO
4910}
4911
4912/* Turn a single GOT that is too big for 16-bit addressing into
4913 a sequence of GOTs, each one 16-bit addressable. */
4914
4915static bfd_boolean
9719ad41 4916mips_elf_multi_got (bfd *abfd, struct bfd_link_info *info,
a8028dd0 4917 asection *got, bfd_size_type pages)
f4416af6 4918{
a8028dd0 4919 struct mips_elf_link_hash_table *htab;
f4416af6 4920 struct mips_elf_got_per_bfd_arg got_per_bfd_arg;
ab361d49 4921 struct mips_elf_traverse_got_arg tga;
a8028dd0 4922 struct mips_got_info *g, *gg;
33bb52fb 4923 unsigned int assign, needed_relocs;
d7206569 4924 bfd *dynobj, *ibfd;
f4416af6 4925
33bb52fb 4926 dynobj = elf_hash_table (info)->dynobj;
a8028dd0 4927 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4928 BFD_ASSERT (htab != NULL);
4929
a8028dd0 4930 g = htab->got_info;
f4416af6 4931
f4416af6
AO
4932 got_per_bfd_arg.obfd = abfd;
4933 got_per_bfd_arg.info = info;
f4416af6
AO
4934 got_per_bfd_arg.current = NULL;
4935 got_per_bfd_arg.primary = NULL;
0a44bf69 4936 got_per_bfd_arg.max_count = ((MIPS_ELF_GOT_MAX_SIZE (info)
f4416af6 4937 / MIPS_ELF_GOT_SIZE (abfd))
861fb55a 4938 - htab->reserved_gotno);
c224138d 4939 got_per_bfd_arg.max_pages = pages;
0f20cc35 4940 /* The number of globals that will be included in the primary GOT.
ab361d49 4941 See the calls to mips_elf_set_global_got_area below for more
0f20cc35
DJ
4942 information. */
4943 got_per_bfd_arg.global_count = g->global_gotno;
f4416af6
AO
4944
4945 /* Try to merge the GOTs of input bfds together, as long as they
4946 don't seem to exceed the maximum GOT size, choosing one of them
4947 to be the primary GOT. */
c72f2fb2 4948 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
d7206569
RS
4949 {
4950 gg = mips_elf_bfd_got (ibfd, FALSE);
4951 if (gg && !mips_elf_merge_got (ibfd, gg, &got_per_bfd_arg))
4952 return FALSE;
4953 }
f4416af6 4954
0f20cc35 4955 /* If we do not find any suitable primary GOT, create an empty one. */
f4416af6 4956 if (got_per_bfd_arg.primary == NULL)
3dff0dd1 4957 g->next = mips_elf_create_got_info (abfd);
f4416af6
AO
4958 else
4959 g->next = got_per_bfd_arg.primary;
4960 g->next->next = got_per_bfd_arg.current;
4961
4962 /* GG is now the master GOT, and G is the primary GOT. */
4963 gg = g;
4964 g = g->next;
4965
4966 /* Map the output bfd to the primary got. That's what we're going
4967 to use for bfds that use GOT16 or GOT_PAGE relocations that we
4968 didn't mark in check_relocs, and we want a quick way to find it.
4969 We can't just use gg->next because we're going to reverse the
4970 list. */
d7206569 4971 mips_elf_replace_bfd_got (abfd, g);
f4416af6 4972
634835ae
RS
4973 /* Every symbol that is referenced in a dynamic relocation must be
4974 present in the primary GOT, so arrange for them to appear after
4975 those that are actually referenced. */
23cc69b6 4976 gg->reloc_only_gotno = gg->global_gotno - g->global_gotno;
634835ae 4977 g->global_gotno = gg->global_gotno;
f4416af6 4978
ab361d49
RS
4979 tga.info = info;
4980 tga.value = GGA_RELOC_ONLY;
4981 htab_traverse (gg->got_entries, mips_elf_set_global_got_area, &tga);
4982 tga.value = GGA_NORMAL;
4983 htab_traverse (g->got_entries, mips_elf_set_global_got_area, &tga);
f4416af6
AO
4984
4985 /* Now go through the GOTs assigning them offset ranges.
cb22ccf4 4986 [assigned_low_gotno, local_gotno[ will be set to the range of local
f4416af6
AO
4987 entries in each GOT. We can then compute the end of a GOT by
4988 adding local_gotno to global_gotno. We reverse the list and make
4989 it circular since then we'll be able to quickly compute the
4990 beginning of a GOT, by computing the end of its predecessor. To
4991 avoid special cases for the primary GOT, while still preserving
4992 assertions that are valid for both single- and multi-got links,
4993 we arrange for the main got struct to have the right number of
4994 global entries, but set its local_gotno such that the initial
4995 offset of the primary GOT is zero. Remember that the primary GOT
4996 will become the last item in the circular linked list, so it
4997 points back to the master GOT. */
4998 gg->local_gotno = -g->global_gotno;
4999 gg->global_gotno = g->global_gotno;
0f20cc35 5000 gg->tls_gotno = 0;
f4416af6
AO
5001 assign = 0;
5002 gg->next = gg;
5003
5004 do
5005 {
5006 struct mips_got_info *gn;
5007
861fb55a 5008 assign += htab->reserved_gotno;
cb22ccf4 5009 g->assigned_low_gotno = assign;
c224138d
RS
5010 g->local_gotno += assign;
5011 g->local_gotno += (pages < g->page_gotno ? pages : g->page_gotno);
cb22ccf4 5012 g->assigned_high_gotno = g->local_gotno - 1;
0f20cc35
DJ
5013 assign = g->local_gotno + g->global_gotno + g->tls_gotno;
5014
ead49a57
RS
5015 /* Take g out of the direct list, and push it onto the reversed
5016 list that gg points to. g->next is guaranteed to be nonnull after
5017 this operation, as required by mips_elf_initialize_tls_index. */
5018 gn = g->next;
5019 g->next = gg->next;
5020 gg->next = g;
5021
0f20cc35
DJ
5022 /* Set up any TLS entries. We always place the TLS entries after
5023 all non-TLS entries. */
5024 g->tls_assigned_gotno = g->local_gotno + g->global_gotno;
72e7511a
RS
5025 tga.g = g;
5026 tga.value = MIPS_ELF_GOT_SIZE (abfd);
5027 htab_traverse (g->got_entries, mips_elf_initialize_tls_index, &tga);
5028 if (!tga.g)
5029 return FALSE;
1fd20d70 5030 BFD_ASSERT (g->tls_assigned_gotno == assign);
f4416af6 5031
ead49a57 5032 /* Move onto the next GOT. It will be a secondary GOT if nonull. */
f4416af6 5033 g = gn;
0626d451 5034
33bb52fb
RS
5035 /* Forbid global symbols in every non-primary GOT from having
5036 lazy-binding stubs. */
0626d451 5037 if (g)
33bb52fb 5038 htab_traverse (g->got_entries, mips_elf_forbid_lazy_stubs, info);
f4416af6
AO
5039 }
5040 while (g);
5041
59b08994 5042 got->size = assign * MIPS_ELF_GOT_SIZE (abfd);
33bb52fb
RS
5043
5044 needed_relocs = 0;
33bb52fb
RS
5045 for (g = gg->next; g && g->next != gg; g = g->next)
5046 {
5047 unsigned int save_assign;
5048
ab361d49
RS
5049 /* Assign offsets to global GOT entries and count how many
5050 relocations they need. */
cb22ccf4
KCY
5051 save_assign = g->assigned_low_gotno;
5052 g->assigned_low_gotno = g->local_gotno;
ab361d49
RS
5053 tga.info = info;
5054 tga.value = MIPS_ELF_GOT_SIZE (abfd);
5055 tga.g = g;
5056 htab_traverse (g->got_entries, mips_elf_set_global_gotidx, &tga);
72e7511a
RS
5057 if (!tga.g)
5058 return FALSE;
cb22ccf4
KCY
5059 BFD_ASSERT (g->assigned_low_gotno == g->local_gotno + g->global_gotno);
5060 g->assigned_low_gotno = save_assign;
72e7511a 5061
0e1862bb 5062 if (bfd_link_pic (info))
33bb52fb 5063 {
cb22ccf4
KCY
5064 g->relocs += g->local_gotno - g->assigned_low_gotno;
5065 BFD_ASSERT (g->assigned_low_gotno == g->next->local_gotno
33bb52fb
RS
5066 + g->next->global_gotno
5067 + g->next->tls_gotno
861fb55a 5068 + htab->reserved_gotno);
33bb52fb 5069 }
ab361d49 5070 needed_relocs += g->relocs;
33bb52fb 5071 }
ab361d49 5072 needed_relocs += g->relocs;
33bb52fb
RS
5073
5074 if (needed_relocs)
5075 mips_elf_allocate_dynamic_relocations (dynobj, info,
5076 needed_relocs);
143d77c5 5077
f4416af6
AO
5078 return TRUE;
5079}
143d77c5 5080
b49e97c9
TS
5081\f
5082/* Returns the first relocation of type r_type found, beginning with
5083 RELOCATION. RELEND is one-past-the-end of the relocation table. */
5084
5085static const Elf_Internal_Rela *
9719ad41
RS
5086mips_elf_next_relocation (bfd *abfd ATTRIBUTE_UNUSED, unsigned int r_type,
5087 const Elf_Internal_Rela *relocation,
5088 const Elf_Internal_Rela *relend)
b49e97c9 5089{
c000e262
TS
5090 unsigned long r_symndx = ELF_R_SYM (abfd, relocation->r_info);
5091
b49e97c9
TS
5092 while (relocation < relend)
5093 {
c000e262
TS
5094 if (ELF_R_TYPE (abfd, relocation->r_info) == r_type
5095 && ELF_R_SYM (abfd, relocation->r_info) == r_symndx)
b49e97c9
TS
5096 return relocation;
5097
5098 ++relocation;
5099 }
5100
5101 /* We didn't find it. */
b49e97c9
TS
5102 return NULL;
5103}
5104
020d7251 5105/* Return whether an input relocation is against a local symbol. */
b49e97c9 5106
b34976b6 5107static bfd_boolean
9719ad41
RS
5108mips_elf_local_relocation_p (bfd *input_bfd,
5109 const Elf_Internal_Rela *relocation,
020d7251 5110 asection **local_sections)
b49e97c9
TS
5111{
5112 unsigned long r_symndx;
5113 Elf_Internal_Shdr *symtab_hdr;
b49e97c9
TS
5114 size_t extsymoff;
5115
5116 r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
5117 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5118 extsymoff = (elf_bad_symtab (input_bfd)) ? 0 : symtab_hdr->sh_info;
5119
5120 if (r_symndx < extsymoff)
b34976b6 5121 return TRUE;
b49e97c9 5122 if (elf_bad_symtab (input_bfd) && local_sections[r_symndx] != NULL)
b34976b6 5123 return TRUE;
b49e97c9 5124
b34976b6 5125 return FALSE;
b49e97c9
TS
5126}
5127\f
5128/* Sign-extend VALUE, which has the indicated number of BITS. */
5129
a7ebbfdf 5130bfd_vma
9719ad41 5131_bfd_mips_elf_sign_extend (bfd_vma value, int bits)
b49e97c9
TS
5132{
5133 if (value & ((bfd_vma) 1 << (bits - 1)))
5134 /* VALUE is negative. */
5135 value |= ((bfd_vma) - 1) << bits;
5136
5137 return value;
5138}
5139
5140/* Return non-zero if the indicated VALUE has overflowed the maximum
4cc11e76 5141 range expressible by a signed number with the indicated number of
b49e97c9
TS
5142 BITS. */
5143
b34976b6 5144static bfd_boolean
9719ad41 5145mips_elf_overflow_p (bfd_vma value, int bits)
b49e97c9
TS
5146{
5147 bfd_signed_vma svalue = (bfd_signed_vma) value;
5148
5149 if (svalue > (1 << (bits - 1)) - 1)
5150 /* The value is too big. */
b34976b6 5151 return TRUE;
b49e97c9
TS
5152 else if (svalue < -(1 << (bits - 1)))
5153 /* The value is too small. */
b34976b6 5154 return TRUE;
b49e97c9
TS
5155
5156 /* All is well. */
b34976b6 5157 return FALSE;
b49e97c9
TS
5158}
5159
5160/* Calculate the %high function. */
5161
5162static bfd_vma
9719ad41 5163mips_elf_high (bfd_vma value)
b49e97c9
TS
5164{
5165 return ((value + (bfd_vma) 0x8000) >> 16) & 0xffff;
5166}
5167
5168/* Calculate the %higher function. */
5169
5170static bfd_vma
9719ad41 5171mips_elf_higher (bfd_vma value ATTRIBUTE_UNUSED)
b49e97c9
TS
5172{
5173#ifdef BFD64
5174 return ((value + (bfd_vma) 0x80008000) >> 32) & 0xffff;
5175#else
5176 abort ();
c5ae1840 5177 return MINUS_ONE;
b49e97c9
TS
5178#endif
5179}
5180
5181/* Calculate the %highest function. */
5182
5183static bfd_vma
9719ad41 5184mips_elf_highest (bfd_vma value ATTRIBUTE_UNUSED)
b49e97c9
TS
5185{
5186#ifdef BFD64
b15e6682 5187 return ((value + (((bfd_vma) 0x8000 << 32) | 0x80008000)) >> 48) & 0xffff;
b49e97c9
TS
5188#else
5189 abort ();
c5ae1840 5190 return MINUS_ONE;
b49e97c9
TS
5191#endif
5192}
5193\f
5194/* Create the .compact_rel section. */
5195
b34976b6 5196static bfd_boolean
9719ad41
RS
5197mips_elf_create_compact_rel_section
5198 (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
b49e97c9
TS
5199{
5200 flagword flags;
5201 register asection *s;
5202
3d4d4302 5203 if (bfd_get_linker_section (abfd, ".compact_rel") == NULL)
b49e97c9
TS
5204 {
5205 flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED
5206 | SEC_READONLY);
5207
3d4d4302 5208 s = bfd_make_section_anyway_with_flags (abfd, ".compact_rel", flags);
b49e97c9 5209 if (s == NULL
fd361982 5210 || !bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd)))
b34976b6 5211 return FALSE;
b49e97c9 5212
eea6121a 5213 s->size = sizeof (Elf32_External_compact_rel);
b49e97c9
TS
5214 }
5215
b34976b6 5216 return TRUE;
b49e97c9
TS
5217}
5218
5219/* Create the .got section to hold the global offset table. */
5220
b34976b6 5221static bfd_boolean
23cc69b6 5222mips_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
b49e97c9
TS
5223{
5224 flagword flags;
5225 register asection *s;
5226 struct elf_link_hash_entry *h;
14a793b2 5227 struct bfd_link_hash_entry *bh;
0a44bf69
RS
5228 struct mips_elf_link_hash_table *htab;
5229
5230 htab = mips_elf_hash_table (info);
4dfe6ac6 5231 BFD_ASSERT (htab != NULL);
b49e97c9
TS
5232
5233 /* This function may be called more than once. */
ce558b89 5234 if (htab->root.sgot)
23cc69b6 5235 return TRUE;
b49e97c9
TS
5236
5237 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
5238 | SEC_LINKER_CREATED);
5239
72b4917c
TS
5240 /* We have to use an alignment of 2**4 here because this is hardcoded
5241 in the function stub generation and in the linker script. */
87e0a731 5242 s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
b49e97c9 5243 if (s == NULL
fd361982 5244 || !bfd_set_section_alignment (s, 4))
b34976b6 5245 return FALSE;
ce558b89 5246 htab->root.sgot = s;
b49e97c9
TS
5247
5248 /* Define the symbol _GLOBAL_OFFSET_TABLE_. We don't do this in the
5249 linker script because we don't want to define the symbol if we
5250 are not creating a global offset table. */
14a793b2 5251 bh = NULL;
b49e97c9
TS
5252 if (! (_bfd_generic_link_add_one_symbol
5253 (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
9719ad41 5254 0, NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 5255 return FALSE;
14a793b2
AM
5256
5257 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
5258 h->non_elf = 0;
5259 h->def_regular = 1;
b49e97c9 5260 h->type = STT_OBJECT;
2f9efdfc 5261 h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
d329bcd1 5262 elf_hash_table (info)->hgot = h;
b49e97c9 5263
0e1862bb 5264 if (bfd_link_pic (info)
c152c796 5265 && ! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 5266 return FALSE;
b49e97c9 5267
3dff0dd1 5268 htab->got_info = mips_elf_create_got_info (abfd);
f0abc2a1 5269 mips_elf_section_data (s)->elf.this_hdr.sh_flags
b49e97c9
TS
5270 |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
5271
861fb55a 5272 /* We also need a .got.plt section when generating PLTs. */
87e0a731
AM
5273 s = bfd_make_section_anyway_with_flags (abfd, ".got.plt",
5274 SEC_ALLOC | SEC_LOAD
5275 | SEC_HAS_CONTENTS
5276 | SEC_IN_MEMORY
5277 | SEC_LINKER_CREATED);
861fb55a
DJ
5278 if (s == NULL)
5279 return FALSE;
ce558b89 5280 htab->root.sgotplt = s;
0a44bf69 5281
b34976b6 5282 return TRUE;
b49e97c9 5283}
b49e97c9 5284\f
0a44bf69
RS
5285/* Return true if H refers to the special VxWorks __GOTT_BASE__ or
5286 __GOTT_INDEX__ symbols. These symbols are only special for
5287 shared objects; they are not used in executables. */
5288
5289static bfd_boolean
5290is_gott_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h)
5291{
5292 return (mips_elf_hash_table (info)->is_vxworks
0e1862bb 5293 && bfd_link_pic (info)
0a44bf69
RS
5294 && (strcmp (h->root.root.string, "__GOTT_BASE__") == 0
5295 || strcmp (h->root.root.string, "__GOTT_INDEX__") == 0));
5296}
861fb55a
DJ
5297
5298/* Return TRUE if a relocation of type R_TYPE from INPUT_BFD might
5299 require an la25 stub. See also mips_elf_local_pic_function_p,
5300 which determines whether the destination function ever requires a
5301 stub. */
5302
5303static bfd_boolean
8f0c309a
CLT
5304mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type,
5305 bfd_boolean target_is_16_bit_code_p)
861fb55a
DJ
5306{
5307 /* We specifically ignore branches and jumps from EF_PIC objects,
5308 where the onus is on the compiler or programmer to perform any
5309 necessary initialization of $25. Sometimes such initialization
5310 is unnecessary; for example, -mno-shared functions do not use
5311 the incoming value of $25, and may therefore be called directly. */
5312 if (PIC_OBJECT_P (input_bfd))
5313 return FALSE;
5314
5315 switch (r_type)
5316 {
5317 case R_MIPS_26:
5318 case R_MIPS_PC16:
7361da2c
AB
5319 case R_MIPS_PC21_S2:
5320 case R_MIPS_PC26_S2:
df58fc94
RS
5321 case R_MICROMIPS_26_S1:
5322 case R_MICROMIPS_PC7_S1:
5323 case R_MICROMIPS_PC10_S1:
5324 case R_MICROMIPS_PC16_S1:
5325 case R_MICROMIPS_PC23_S2:
861fb55a
DJ
5326 return TRUE;
5327
8f0c309a
CLT
5328 case R_MIPS16_26:
5329 return !target_is_16_bit_code_p;
5330
861fb55a
DJ
5331 default:
5332 return FALSE;
5333 }
5334}
0a44bf69 5335\f
47275900
MR
5336/* Obtain the field relocated by RELOCATION. */
5337
5338static bfd_vma
5339mips_elf_obtain_contents (reloc_howto_type *howto,
5340 const Elf_Internal_Rela *relocation,
5341 bfd *input_bfd, bfd_byte *contents)
5342{
5343 bfd_vma x = 0;
5344 bfd_byte *location = contents + relocation->r_offset;
5345 unsigned int size = bfd_get_reloc_size (howto);
5346
5347 /* Obtain the bytes. */
5348 if (size != 0)
5349 x = bfd_get (8 * size, input_bfd, location);
5350
5351 return x;
5352}
5353
98e10ffa
MR
5354/* Store the field relocated by RELOCATION. */
5355
5356static void
5357mips_elf_store_contents (reloc_howto_type *howto,
5358 const Elf_Internal_Rela *relocation,
5359 bfd *input_bfd, bfd_byte *contents, bfd_vma x)
5360{
5361 bfd_byte *location = contents + relocation->r_offset;
5362 unsigned int size = bfd_get_reloc_size (howto);
5363
5364 /* Put the value into the output. */
5365 if (size != 0)
5366 bfd_put (8 * size, input_bfd, x, location);
5367}
5368
47275900
MR
5369/* Try to patch a load from GOT instruction in CONTENTS pointed to by
5370 RELOCATION described by HOWTO, with a move of 0 to the load target
5371 register, returning TRUE if that is successful and FALSE otherwise.
5372 If DOIT is FALSE, then only determine it patching is possible and
5373 return status without actually changing CONTENTS.
5374*/
5375
5376static bfd_boolean
5377mips_elf_nullify_got_load (bfd *input_bfd, bfd_byte *contents,
5378 const Elf_Internal_Rela *relocation,
5379 reloc_howto_type *howto, bfd_boolean doit)
5380{
5381 int r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
5382 bfd_byte *location = contents + relocation->r_offset;
5383 bfd_boolean nullified = TRUE;
5384 bfd_vma x;
5385
5386 _bfd_mips_elf_reloc_unshuffle (input_bfd, r_type, FALSE, location);
5387
5388 /* Obtain the current value. */
5389 x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
5390
5391 /* Note that in the unshuffled MIPS16 encoding RX is at bits [21:19]
5392 while RY is at bits [18:16] of the combined 32-bit instruction word. */
5393 if (mips16_reloc_p (r_type)
5394 && (((x >> 22) & 0x3ff) == 0x3d3 /* LW */
5395 || ((x >> 22) & 0x3ff) == 0x3c7)) /* LD */
5396 x = (0x3cd << 22) | (x & (7 << 16)) << 3; /* LI */
5397 else if (micromips_reloc_p (r_type)
5398 && ((x >> 26) & 0x37) == 0x37) /* LW/LD */
5399 x = (0xc << 26) | (x & (0x1f << 21)); /* ADDIU */
5400 else if (((x >> 26) & 0x3f) == 0x23 /* LW */
5401 || ((x >> 26) & 0x3f) == 0x37) /* LD */
5402 x = (0x9 << 26) | (x & (0x1f << 16)); /* ADDIU */
5403 else
5404 nullified = FALSE;
5405
5406 /* Put the value into the output. */
5407 if (doit && nullified)
5408 mips_elf_store_contents (howto, relocation, input_bfd, contents, x);
5409
5410 _bfd_mips_elf_reloc_shuffle (input_bfd, r_type, FALSE, location);
5411
5412 return nullified;
5413}
5414
b49e97c9
TS
5415/* Calculate the value produced by the RELOCATION (which comes from
5416 the INPUT_BFD). The ADDEND is the addend to use for this
5417 RELOCATION; RELOCATION->R_ADDEND is ignored.
5418
5419 The result of the relocation calculation is stored in VALUEP.
38a7df63 5420 On exit, set *CROSS_MODE_JUMP_P to true if the relocation field
df58fc94 5421 is a MIPS16 or microMIPS jump to standard MIPS code, or vice versa.
b49e97c9
TS
5422
5423 This function returns bfd_reloc_continue if the caller need take no
5424 further action regarding this relocation, bfd_reloc_notsupported if
5425 something goes dramatically wrong, bfd_reloc_overflow if an
5426 overflow occurs, and bfd_reloc_ok to indicate success. */
5427
5428static bfd_reloc_status_type
9719ad41 5429mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
47275900 5430 asection *input_section, bfd_byte *contents,
9719ad41
RS
5431 struct bfd_link_info *info,
5432 const Elf_Internal_Rela *relocation,
5433 bfd_vma addend, reloc_howto_type *howto,
5434 Elf_Internal_Sym *local_syms,
5435 asection **local_sections, bfd_vma *valuep,
38a7df63
CF
5436 const char **namep,
5437 bfd_boolean *cross_mode_jump_p,
9719ad41 5438 bfd_boolean save_addend)
b49e97c9
TS
5439{
5440 /* The eventual value we will return. */
5441 bfd_vma value;
5442 /* The address of the symbol against which the relocation is
5443 occurring. */
5444 bfd_vma symbol = 0;
5445 /* The final GP value to be used for the relocatable, executable, or
5446 shared object file being produced. */
0a61c8c2 5447 bfd_vma gp;
b49e97c9
TS
5448 /* The place (section offset or address) of the storage unit being
5449 relocated. */
5450 bfd_vma p;
5451 /* The value of GP used to create the relocatable object. */
0a61c8c2 5452 bfd_vma gp0;
b49e97c9
TS
5453 /* The offset into the global offset table at which the address of
5454 the relocation entry symbol, adjusted by the addend, resides
5455 during execution. */
5456 bfd_vma g = MINUS_ONE;
5457 /* The section in which the symbol referenced by the relocation is
5458 located. */
5459 asection *sec = NULL;
5460 struct mips_elf_link_hash_entry *h = NULL;
b34976b6 5461 /* TRUE if the symbol referred to by this relocation is a local
b49e97c9 5462 symbol. */
b34976b6 5463 bfd_boolean local_p, was_local_p;
77434823
MR
5464 /* TRUE if the symbol referred to by this relocation is a section
5465 symbol. */
5466 bfd_boolean section_p = FALSE;
b34976b6
AM
5467 /* TRUE if the symbol referred to by this relocation is "_gp_disp". */
5468 bfd_boolean gp_disp_p = FALSE;
bbe506e8
TS
5469 /* TRUE if the symbol referred to by this relocation is
5470 "__gnu_local_gp". */
5471 bfd_boolean gnu_local_gp_p = FALSE;
b49e97c9
TS
5472 Elf_Internal_Shdr *symtab_hdr;
5473 size_t extsymoff;
5474 unsigned long r_symndx;
5475 int r_type;
b34976b6 5476 /* TRUE if overflow occurred during the calculation of the
b49e97c9 5477 relocation value. */
b34976b6
AM
5478 bfd_boolean overflowed_p;
5479 /* TRUE if this relocation refers to a MIPS16 function. */
5480 bfd_boolean target_is_16_bit_code_p = FALSE;
df58fc94 5481 bfd_boolean target_is_micromips_code_p = FALSE;
0a44bf69
RS
5482 struct mips_elf_link_hash_table *htab;
5483 bfd *dynobj;
ad951203 5484 bfd_boolean resolved_to_zero;
0a44bf69
RS
5485
5486 dynobj = elf_hash_table (info)->dynobj;
5487 htab = mips_elf_hash_table (info);
4dfe6ac6 5488 BFD_ASSERT (htab != NULL);
b49e97c9
TS
5489
5490 /* Parse the relocation. */
5491 r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
5492 r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
5493 p = (input_section->output_section->vma
5494 + input_section->output_offset
5495 + relocation->r_offset);
5496
5497 /* Assume that there will be no overflow. */
b34976b6 5498 overflowed_p = FALSE;
b49e97c9
TS
5499
5500 /* Figure out whether or not the symbol is local, and get the offset
5501 used in the array of hash table entries. */
5502 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5503 local_p = mips_elf_local_relocation_p (input_bfd, relocation,
020d7251 5504 local_sections);
bce03d3d 5505 was_local_p = local_p;
b49e97c9
TS
5506 if (! elf_bad_symtab (input_bfd))
5507 extsymoff = symtab_hdr->sh_info;
5508 else
5509 {
5510 /* The symbol table does not follow the rule that local symbols
5511 must come before globals. */
5512 extsymoff = 0;
5513 }
5514
5515 /* Figure out the value of the symbol. */
5516 if (local_p)
5517 {
9d862524 5518 bfd_boolean micromips_p = MICROMIPS_P (abfd);
b49e97c9
TS
5519 Elf_Internal_Sym *sym;
5520
5521 sym = local_syms + r_symndx;
5522 sec = local_sections[r_symndx];
5523
77434823
MR
5524 section_p = ELF_ST_TYPE (sym->st_info) == STT_SECTION;
5525
b49e97c9 5526 symbol = sec->output_section->vma + sec->output_offset;
77434823 5527 if (!section_p || (sec->flags & SEC_MERGE))
b49e97c9 5528 symbol += sym->st_value;
77434823 5529 if ((sec->flags & SEC_MERGE) && section_p)
d4df96e6
L
5530 {
5531 addend = _bfd_elf_rel_local_sym (abfd, sym, &sec, addend);
5532 addend -= symbol;
5533 addend += sec->output_section->vma + sec->output_offset;
5534 }
b49e97c9 5535
df58fc94
RS
5536 /* MIPS16/microMIPS text labels should be treated as odd. */
5537 if (ELF_ST_IS_COMPRESSED (sym->st_other))
b49e97c9
TS
5538 ++symbol;
5539
5540 /* Record the name of this symbol, for our caller. */
5541 *namep = bfd_elf_string_from_elf_section (input_bfd,
5542 symtab_hdr->sh_link,
5543 sym->st_name);
ceab86af 5544 if (*namep == NULL || **namep == '\0')
fd361982 5545 *namep = bfd_section_name (sec);
b49e97c9 5546
9d862524 5547 /* For relocations against a section symbol and ones against no
07d6d2b8 5548 symbol (absolute relocations) infer the ISA mode from the addend. */
9d862524
MR
5549 if (section_p || r_symndx == STN_UNDEF)
5550 {
5551 target_is_16_bit_code_p = (addend & 1) && !micromips_p;
5552 target_is_micromips_code_p = (addend & 1) && micromips_p;
5553 }
5554 /* For relocations against an absolute symbol infer the ISA mode
07d6d2b8 5555 from the value of the symbol plus addend. */
9d862524
MR
5556 else if (bfd_is_abs_section (sec))
5557 {
5558 target_is_16_bit_code_p = ((symbol + addend) & 1) && !micromips_p;
5559 target_is_micromips_code_p = ((symbol + addend) & 1) && micromips_p;
5560 }
5561 /* Otherwise just use the regular symbol annotation available. */
5562 else
5563 {
5564 target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (sym->st_other);
5565 target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (sym->st_other);
5566 }
b49e97c9
TS
5567 }
5568 else
5569 {
560e09e9
NC
5570 /* ??? Could we use RELOC_FOR_GLOBAL_SYMBOL here ? */
5571
b49e97c9
TS
5572 /* For global symbols we look up the symbol in the hash-table. */
5573 h = ((struct mips_elf_link_hash_entry *)
5574 elf_sym_hashes (input_bfd) [r_symndx - extsymoff]);
5575 /* Find the real hash-table entry for this symbol. */
5576 while (h->root.root.type == bfd_link_hash_indirect
5577 || h->root.root.type == bfd_link_hash_warning)
5578 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
5579
5580 /* Record the name of this symbol, for our caller. */
5581 *namep = h->root.root.root.string;
5582
5583 /* See if this is the special _gp_disp symbol. Note that such a
5584 symbol must always be a global symbol. */
560e09e9 5585 if (strcmp (*namep, "_gp_disp") == 0
b49e97c9
TS
5586 && ! NEWABI_P (input_bfd))
5587 {
5588 /* Relocations against _gp_disp are permitted only with
5589 R_MIPS_HI16 and R_MIPS_LO16 relocations. */
738e5348 5590 if (!hi16_reloc_p (r_type) && !lo16_reloc_p (r_type))
b49e97c9
TS
5591 return bfd_reloc_notsupported;
5592
b34976b6 5593 gp_disp_p = TRUE;
b49e97c9 5594 }
bbe506e8
TS
5595 /* See if this is the special _gp symbol. Note that such a
5596 symbol must always be a global symbol. */
5597 else if (strcmp (*namep, "__gnu_local_gp") == 0)
5598 gnu_local_gp_p = TRUE;
5599
5600
b49e97c9
TS
5601 /* If this symbol is defined, calculate its address. Note that
5602 _gp_disp is a magic symbol, always implicitly defined by the
5603 linker, so it's inappropriate to check to see whether or not
5604 its defined. */
5605 else if ((h->root.root.type == bfd_link_hash_defined
5606 || h->root.root.type == bfd_link_hash_defweak)
5607 && h->root.root.u.def.section)
5608 {
5609 sec = h->root.root.u.def.section;
5610 if (sec->output_section)
5611 symbol = (h->root.root.u.def.value
5612 + sec->output_section->vma
5613 + sec->output_offset);
5614 else
5615 symbol = h->root.root.u.def.value;
5616 }
5617 else if (h->root.root.type == bfd_link_hash_undefweak)
5618 /* We allow relocations against undefined weak symbols, giving
5619 it the value zero, so that you can undefined weak functions
5620 and check to see if they exist by looking at their
5621 addresses. */
5622 symbol = 0;
59c2e50f 5623 else if (info->unresolved_syms_in_objects == RM_IGNORE
b49e97c9
TS
5624 && ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
5625 symbol = 0;
a4d0f181
TS
5626 else if (strcmp (*namep, SGI_COMPAT (input_bfd)
5627 ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING") == 0)
b49e97c9
TS
5628 {
5629 /* If this is a dynamic link, we should have created a
5630 _DYNAMIC_LINK symbol or _DYNAMIC_LINKING(for normal mips) symbol
de194d85 5631 in _bfd_mips_elf_create_dynamic_sections.
b49e97c9
TS
5632 Otherwise, we should define the symbol with a value of 0.
5633 FIXME: It should probably get into the symbol table
5634 somehow as well. */
0e1862bb 5635 BFD_ASSERT (! bfd_link_pic (info));
b49e97c9
TS
5636 BFD_ASSERT (bfd_get_section_by_name (abfd, ".dynamic") == NULL);
5637 symbol = 0;
5638 }
5e2b0d47
NC
5639 else if (ELF_MIPS_IS_OPTIONAL (h->root.other))
5640 {
5641 /* This is an optional symbol - an Irix specific extension to the
5642 ELF spec. Ignore it for now.
5643 XXX - FIXME - there is more to the spec for OPTIONAL symbols
5644 than simply ignoring them, but we do not handle this for now.
5645 For information see the "64-bit ELF Object File Specification"
5646 which is available from here:
5647 http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf */
5648 symbol = 0;
5649 }
b49e97c9
TS
5650 else
5651 {
dfb93f11
JC
5652 bfd_boolean reject_undefined
5653 = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
5654 || ELF_ST_VISIBILITY (h->root.other) != STV_DEFAULT);
5655
1a72702b
AM
5656 (*info->callbacks->undefined_symbol)
5657 (info, h->root.root.root.string, input_bfd,
dfb93f11
JC
5658 input_section, relocation->r_offset, reject_undefined);
5659
5660 if (reject_undefined)
5661 return bfd_reloc_undefined;
5662
5663 symbol = 0;
b49e97c9
TS
5664 }
5665
30c09090 5666 target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (h->root.other);
1bbce132 5667 target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (h->root.other);
b49e97c9
TS
5668 }
5669
738e5348
RS
5670 /* If this is a reference to a 16-bit function with a stub, we need
5671 to redirect the relocation to the stub unless:
5672
5673 (a) the relocation is for a MIPS16 JAL;
5674
5675 (b) the relocation is for a MIPS16 PIC call, and there are no
5676 non-MIPS16 uses of the GOT slot; or
5677
5678 (c) the section allows direct references to MIPS16 functions. */
5679 if (r_type != R_MIPS16_26
0e1862bb 5680 && !bfd_link_relocatable (info)
738e5348
RS
5681 && ((h != NULL
5682 && h->fn_stub != NULL
5683 && (r_type != R_MIPS16_CALL16 || h->need_fn_stub))
b9d58d71 5684 || (local_p
698600e4
AM
5685 && mips_elf_tdata (input_bfd)->local_stubs != NULL
5686 && mips_elf_tdata (input_bfd)->local_stubs[r_symndx] != NULL))
738e5348 5687 && !section_allows_mips16_refs_p (input_section))
b49e97c9
TS
5688 {
5689 /* This is a 32- or 64-bit call to a 16-bit function. We should
5690 have already noticed that we were going to need the
5691 stub. */
5692 if (local_p)
8f0c309a 5693 {
698600e4 5694 sec = mips_elf_tdata (input_bfd)->local_stubs[r_symndx];
8f0c309a
CLT
5695 value = 0;
5696 }
b49e97c9
TS
5697 else
5698 {
5699 BFD_ASSERT (h->need_fn_stub);
8f0c309a
CLT
5700 if (h->la25_stub)
5701 {
5702 /* If a LA25 header for the stub itself exists, point to the
5703 prepended LUI/ADDIU sequence. */
5704 sec = h->la25_stub->stub_section;
5705 value = h->la25_stub->offset;
5706 }
5707 else
5708 {
5709 sec = h->fn_stub;
5710 value = 0;
5711 }
b49e97c9
TS
5712 }
5713
8f0c309a 5714 symbol = sec->output_section->vma + sec->output_offset + value;
f38c2df5
TS
5715 /* The target is 16-bit, but the stub isn't. */
5716 target_is_16_bit_code_p = FALSE;
b49e97c9 5717 }
1bbce132
MR
5718 /* If this is a MIPS16 call with a stub, that is made through the PLT or
5719 to a standard MIPS function, we need to redirect the call to the stub.
5720 Note that we specifically exclude R_MIPS16_CALL16 from this behavior;
5721 indirect calls should use an indirect stub instead. */
0e1862bb 5722 else if (r_type == R_MIPS16_26 && !bfd_link_relocatable (info)
b314ec0e 5723 && ((h != NULL && (h->call_stub != NULL || h->call_fp_stub != NULL))
b9d58d71 5724 || (local_p
698600e4
AM
5725 && mips_elf_tdata (input_bfd)->local_call_stubs != NULL
5726 && mips_elf_tdata (input_bfd)->local_call_stubs[r_symndx] != NULL))
1bbce132 5727 && ((h != NULL && h->use_plt_entry) || !target_is_16_bit_code_p))
b49e97c9 5728 {
b9d58d71 5729 if (local_p)
698600e4 5730 sec = mips_elf_tdata (input_bfd)->local_call_stubs[r_symndx];
b9d58d71 5731 else
b49e97c9 5732 {
b9d58d71
TS
5733 /* If both call_stub and call_fp_stub are defined, we can figure
5734 out which one to use by checking which one appears in the input
5735 file. */
5736 if (h->call_stub != NULL && h->call_fp_stub != NULL)
b49e97c9 5737 {
b9d58d71 5738 asection *o;
68ffbac6 5739
b9d58d71
TS
5740 sec = NULL;
5741 for (o = input_bfd->sections; o != NULL; o = o->next)
b49e97c9 5742 {
fd361982 5743 if (CALL_FP_STUB_P (bfd_section_name (o)))
b9d58d71
TS
5744 {
5745 sec = h->call_fp_stub;
5746 break;
5747 }
b49e97c9 5748 }
b9d58d71
TS
5749 if (sec == NULL)
5750 sec = h->call_stub;
b49e97c9 5751 }
b9d58d71 5752 else if (h->call_stub != NULL)
b49e97c9 5753 sec = h->call_stub;
b9d58d71
TS
5754 else
5755 sec = h->call_fp_stub;
07d6d2b8 5756 }
b49e97c9 5757
eea6121a 5758 BFD_ASSERT (sec->size > 0);
b49e97c9
TS
5759 symbol = sec->output_section->vma + sec->output_offset;
5760 }
861fb55a
DJ
5761 /* If this is a direct call to a PIC function, redirect to the
5762 non-PIC stub. */
5763 else if (h != NULL && h->la25_stub
8f0c309a
CLT
5764 && mips_elf_relocation_needs_la25_stub (input_bfd, r_type,
5765 target_is_16_bit_code_p))
c7318def
MR
5766 {
5767 symbol = (h->la25_stub->stub_section->output_section->vma
5768 + h->la25_stub->stub_section->output_offset
5769 + h->la25_stub->offset);
5770 if (ELF_ST_IS_MICROMIPS (h->root.other))
5771 symbol |= 1;
5772 }
1bbce132
MR
5773 /* For direct MIPS16 and microMIPS calls make sure the compressed PLT
5774 entry is used if a standard PLT entry has also been made. In this
5775 case the symbol will have been set by mips_elf_set_plt_sym_value
5776 to point to the standard PLT entry, so redirect to the compressed
5777 one. */
54806ffa
MR
5778 else if ((mips16_branch_reloc_p (r_type)
5779 || micromips_branch_reloc_p (r_type))
0e1862bb 5780 && !bfd_link_relocatable (info)
1bbce132
MR
5781 && h != NULL
5782 && h->use_plt_entry
5783 && h->root.plt.plist->comp_offset != MINUS_ONE
5784 && h->root.plt.plist->mips_offset != MINUS_ONE)
5785 {
5786 bfd_boolean micromips_p = MICROMIPS_P (abfd);
5787
ce558b89 5788 sec = htab->root.splt;
1bbce132
MR
5789 symbol = (sec->output_section->vma
5790 + sec->output_offset
5791 + htab->plt_header_size
5792 + htab->plt_mips_offset
5793 + h->root.plt.plist->comp_offset
5794 + 1);
5795
5796 target_is_16_bit_code_p = !micromips_p;
5797 target_is_micromips_code_p = micromips_p;
5798 }
b49e97c9 5799
df58fc94 5800 /* Make sure MIPS16 and microMIPS are not used together. */
c9775dde 5801 if ((mips16_branch_reloc_p (r_type) && target_is_micromips_code_p)
df58fc94
RS
5802 || (micromips_branch_reloc_p (r_type) && target_is_16_bit_code_p))
5803 {
4eca0228 5804 _bfd_error_handler
df58fc94
RS
5805 (_("MIPS16 and microMIPS functions cannot call each other"));
5806 return bfd_reloc_notsupported;
5807 }
5808
b49e97c9 5809 /* Calls from 16-bit code to 32-bit code and vice versa require the
df58fc94
RS
5810 mode change. However, we can ignore calls to undefined weak symbols,
5811 which should never be executed at runtime. This exception is important
5812 because the assembly writer may have "known" that any definition of the
5813 symbol would be 16-bit code, and that direct jumps were therefore
5814 acceptable. */
0e1862bb 5815 *cross_mode_jump_p = (!bfd_link_relocatable (info)
df58fc94 5816 && !(h && h->root.root.type == bfd_link_hash_undefweak)
9d862524
MR
5817 && ((mips16_branch_reloc_p (r_type)
5818 && !target_is_16_bit_code_p)
5819 || (micromips_branch_reloc_p (r_type)
df58fc94 5820 && !target_is_micromips_code_p)
9d862524
MR
5821 || ((branch_reloc_p (r_type)
5822 || r_type == R_MIPS_JALR)
df58fc94
RS
5823 && (target_is_16_bit_code_p
5824 || target_is_micromips_code_p))));
b49e97c9 5825
47275900
MR
5826 resolved_to_zero = (h != NULL
5827 && UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->root));
5828
5829 switch (r_type)
5830 {
5831 case R_MIPS16_CALL16:
5832 case R_MIPS16_GOT16:
5833 case R_MIPS_CALL16:
5834 case R_MIPS_GOT16:
5835 case R_MIPS_GOT_PAGE:
5836 case R_MIPS_GOT_DISP:
5837 case R_MIPS_GOT_LO16:
5838 case R_MIPS_CALL_LO16:
5839 case R_MICROMIPS_CALL16:
5840 case R_MICROMIPS_GOT16:
5841 case R_MICROMIPS_GOT_PAGE:
5842 case R_MICROMIPS_GOT_DISP:
5843 case R_MICROMIPS_GOT_LO16:
5844 case R_MICROMIPS_CALL_LO16:
5845 if (resolved_to_zero
5846 && !bfd_link_relocatable (info)
5847 && mips_elf_nullify_got_load (input_bfd, contents,
5848 relocation, howto, TRUE))
5849 return bfd_reloc_continue;
5850
5851 /* Fall through. */
5852 case R_MIPS_GOT_HI16:
5853 case R_MIPS_CALL_HI16:
5854 case R_MICROMIPS_GOT_HI16:
5855 case R_MICROMIPS_CALL_HI16:
5856 if (resolved_to_zero
5857 && htab->use_absolute_zero
5858 && bfd_link_pic (info))
5859 {
5860 /* Redirect to the special `__gnu_absolute_zero' symbol. */
5861 h = mips_elf_link_hash_lookup (htab, "__gnu_absolute_zero",
5862 FALSE, FALSE, FALSE);
5863 BFD_ASSERT (h != NULL);
5864 }
5865 break;
5866 }
5867
c5d6fa44 5868 local_p = (h == NULL || mips_use_local_got_p (info, h));
b49e97c9 5869
0a61c8c2
RS
5870 gp0 = _bfd_get_gp_value (input_bfd);
5871 gp = _bfd_get_gp_value (abfd);
23cc69b6 5872 if (htab->got_info)
a8028dd0 5873 gp += mips_elf_adjust_gp (abfd, htab->got_info, input_bfd);
0a61c8c2
RS
5874
5875 if (gnu_local_gp_p)
5876 symbol = gp;
5877
df58fc94
RS
5878 /* Global R_MIPS_GOT_PAGE/R_MICROMIPS_GOT_PAGE relocations are equivalent
5879 to R_MIPS_GOT_DISP/R_MICROMIPS_GOT_DISP. The addend is applied by the
5880 corresponding R_MIPS_GOT_OFST/R_MICROMIPS_GOT_OFST. */
5881 if (got_page_reloc_p (r_type) && !local_p)
020d7251 5882 {
df58fc94
RS
5883 r_type = (micromips_reloc_p (r_type)
5884 ? R_MICROMIPS_GOT_DISP : R_MIPS_GOT_DISP);
020d7251
RS
5885 addend = 0;
5886 }
5887
e77760d2 5888 /* If we haven't already determined the GOT offset, and we're going
0a61c8c2 5889 to need it, get it now. */
b49e97c9
TS
5890 switch (r_type)
5891 {
738e5348
RS
5892 case R_MIPS16_CALL16:
5893 case R_MIPS16_GOT16:
b49e97c9
TS
5894 case R_MIPS_CALL16:
5895 case R_MIPS_GOT16:
5896 case R_MIPS_GOT_DISP:
5897 case R_MIPS_GOT_HI16:
5898 case R_MIPS_CALL_HI16:
5899 case R_MIPS_GOT_LO16:
5900 case R_MIPS_CALL_LO16:
df58fc94
RS
5901 case R_MICROMIPS_CALL16:
5902 case R_MICROMIPS_GOT16:
5903 case R_MICROMIPS_GOT_DISP:
5904 case R_MICROMIPS_GOT_HI16:
5905 case R_MICROMIPS_CALL_HI16:
5906 case R_MICROMIPS_GOT_LO16:
5907 case R_MICROMIPS_CALL_LO16:
0f20cc35
DJ
5908 case R_MIPS_TLS_GD:
5909 case R_MIPS_TLS_GOTTPREL:
5910 case R_MIPS_TLS_LDM:
d0f13682
CLT
5911 case R_MIPS16_TLS_GD:
5912 case R_MIPS16_TLS_GOTTPREL:
5913 case R_MIPS16_TLS_LDM:
df58fc94
RS
5914 case R_MICROMIPS_TLS_GD:
5915 case R_MICROMIPS_TLS_GOTTPREL:
5916 case R_MICROMIPS_TLS_LDM:
b49e97c9 5917 /* Find the index into the GOT where this value is located. */
df58fc94 5918 if (tls_ldm_reloc_p (r_type))
0f20cc35 5919 {
0a44bf69 5920 g = mips_elf_local_got_index (abfd, input_bfd, info,
5c18022e 5921 0, 0, NULL, r_type);
0f20cc35
DJ
5922 if (g == MINUS_ONE)
5923 return bfd_reloc_outofrange;
5924 }
5925 else if (!local_p)
b49e97c9 5926 {
0a44bf69
RS
5927 /* On VxWorks, CALL relocations should refer to the .got.plt
5928 entry, which is initialized to point at the PLT stub. */
5929 if (htab->is_vxworks
df58fc94
RS
5930 && (call_hi16_reloc_p (r_type)
5931 || call_lo16_reloc_p (r_type)
738e5348 5932 || call16_reloc_p (r_type)))
0a44bf69
RS
5933 {
5934 BFD_ASSERT (addend == 0);
5935 BFD_ASSERT (h->root.needs_plt);
5936 g = mips_elf_gotplt_index (info, &h->root);
5937 }
5938 else
b49e97c9 5939 {
020d7251 5940 BFD_ASSERT (addend == 0);
13fbec83
RS
5941 g = mips_elf_global_got_index (abfd, info, input_bfd,
5942 &h->root, r_type);
e641e783 5943 if (!TLS_RELOC_P (r_type)
020d7251
RS
5944 && !elf_hash_table (info)->dynamic_sections_created)
5945 /* This is a static link. We must initialize the GOT entry. */
ce558b89 5946 MIPS_ELF_PUT_WORD (dynobj, symbol, htab->root.sgot->contents + g);
b49e97c9
TS
5947 }
5948 }
0a44bf69 5949 else if (!htab->is_vxworks
738e5348 5950 && (call16_reloc_p (r_type) || got16_reloc_p (r_type)))
0a44bf69 5951 /* The calculation below does not involve "g". */
b49e97c9
TS
5952 break;
5953 else
5954 {
5c18022e 5955 g = mips_elf_local_got_index (abfd, input_bfd, info,
0a44bf69 5956 symbol + addend, r_symndx, h, r_type);
b49e97c9
TS
5957 if (g == MINUS_ONE)
5958 return bfd_reloc_outofrange;
5959 }
5960
5961 /* Convert GOT indices to actual offsets. */
a8028dd0 5962 g = mips_elf_got_offset_from_index (info, abfd, input_bfd, g);
b49e97c9 5963 break;
b49e97c9
TS
5964 }
5965
0a44bf69
RS
5966 /* Relocations against the VxWorks __GOTT_BASE__ and __GOTT_INDEX__
5967 symbols are resolved by the loader. Add them to .rela.dyn. */
5968 if (h != NULL && is_gott_symbol (info, &h->root))
5969 {
5970 Elf_Internal_Rela outrel;
5971 bfd_byte *loc;
5972 asection *s;
5973
5974 s = mips_elf_rel_dyn_section (info, FALSE);
5975 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
5976
5977 outrel.r_offset = (input_section->output_section->vma
5978 + input_section->output_offset
5979 + relocation->r_offset);
5980 outrel.r_info = ELF32_R_INFO (h->root.dynindx, r_type);
5981 outrel.r_addend = addend;
5982 bfd_elf32_swap_reloca_out (abfd, &outrel, loc);
9e3313ae
RS
5983
5984 /* If we've written this relocation for a readonly section,
5985 we need to set DF_TEXTREL again, so that we do not delete the
5986 DT_TEXTREL tag. */
5987 if (MIPS_ELF_READONLY_SECTION (input_section))
5988 info->flags |= DF_TEXTREL;
5989
0a44bf69
RS
5990 *valuep = 0;
5991 return bfd_reloc_ok;
5992 }
5993
b49e97c9
TS
5994 /* Figure out what kind of relocation is being performed. */
5995 switch (r_type)
5996 {
5997 case R_MIPS_NONE:
5998 return bfd_reloc_continue;
5999
6000 case R_MIPS_16:
c3eb94b4
MF
6001 if (howto->partial_inplace)
6002 addend = _bfd_mips_elf_sign_extend (addend, 16);
6003 value = symbol + addend;
b49e97c9
TS
6004 overflowed_p = mips_elf_overflow_p (value, 16);
6005 break;
6006
6007 case R_MIPS_32:
6008 case R_MIPS_REL32:
6009 case R_MIPS_64:
0e1862bb 6010 if ((bfd_link_pic (info)
861fb55a 6011 || (htab->root.dynamic_sections_created
b49e97c9 6012 && h != NULL
f5385ebf 6013 && h->root.def_dynamic
861fb55a
DJ
6014 && !h->root.def_regular
6015 && !h->has_static_relocs))
cf35638d 6016 && r_symndx != STN_UNDEF
9a59ad6b
DJ
6017 && (h == NULL
6018 || h->root.root.type != bfd_link_hash_undefweak
ad951203
L
6019 || (ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT
6020 && !resolved_to_zero))
b49e97c9
TS
6021 && (input_section->flags & SEC_ALLOC) != 0)
6022 {
861fb55a 6023 /* If we're creating a shared library, then we can't know
b49e97c9
TS
6024 where the symbol will end up. So, we create a relocation
6025 record in the output, and leave the job up to the dynamic
861fb55a
DJ
6026 linker. We must do the same for executable references to
6027 shared library symbols, unless we've decided to use copy
6028 relocs or PLTs instead. */
b49e97c9
TS
6029 value = addend;
6030 if (!mips_elf_create_dynamic_relocation (abfd,
6031 info,
6032 relocation,
6033 h,
6034 sec,
6035 symbol,
6036 &value,
6037 input_section))
6038 return bfd_reloc_undefined;
6039 }
6040 else
6041 {
6042 if (r_type != R_MIPS_REL32)
6043 value = symbol + addend;
6044 else
6045 value = addend;
6046 }
6047 value &= howto->dst_mask;
092dcd75
CD
6048 break;
6049
6050 case R_MIPS_PC32:
6051 value = symbol + addend - p;
6052 value &= howto->dst_mask;
b49e97c9
TS
6053 break;
6054
b49e97c9
TS
6055 case R_MIPS16_26:
6056 /* The calculation for R_MIPS16_26 is just the same as for an
6057 R_MIPS_26. It's only the storage of the relocated field into
6058 the output file that's different. That's handled in
6059 mips_elf_perform_relocation. So, we just fall through to the
6060 R_MIPS_26 case here. */
6061 case R_MIPS_26:
df58fc94
RS
6062 case R_MICROMIPS_26_S1:
6063 {
6064 unsigned int shift;
6065
df58fc94
RS
6066 /* Shift is 2, unusually, for microMIPS JALX. */
6067 shift = (!*cross_mode_jump_p && r_type == R_MICROMIPS_26_S1) ? 1 : 2;
6068
77434823 6069 if (howto->partial_inplace && !section_p)
df58fc94 6070 value = _bfd_mips_elf_sign_extend (addend, 26 + shift);
c3eb94b4
MF
6071 else
6072 value = addend;
bc27bb05
MR
6073 value += symbol;
6074
9d862524
MR
6075 /* Make sure the target of a jump is suitably aligned. Bit 0 must
6076 be the correct ISA mode selector except for weak undefined
6077 symbols. */
6078 if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6079 && (*cross_mode_jump_p
6080 ? (value & 3) != (r_type == R_MIPS_26)
07d6d2b8 6081 : (value & ((1 << shift) - 1)) != (r_type != R_MIPS_26)))
bc27bb05
MR
6082 return bfd_reloc_outofrange;
6083
6084 value >>= shift;
77434823 6085 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
df58fc94
RS
6086 overflowed_p = (value >> 26) != ((p + 4) >> (26 + shift));
6087 value &= howto->dst_mask;
6088 }
b49e97c9
TS
6089 break;
6090
0f20cc35 6091 case R_MIPS_TLS_DTPREL_HI16:
d0f13682 6092 case R_MIPS16_TLS_DTPREL_HI16:
df58fc94 6093 case R_MICROMIPS_TLS_DTPREL_HI16:
0f20cc35
DJ
6094 value = (mips_elf_high (addend + symbol - dtprel_base (info))
6095 & howto->dst_mask);
6096 break;
6097
6098 case R_MIPS_TLS_DTPREL_LO16:
741d6ea8
JM
6099 case R_MIPS_TLS_DTPREL32:
6100 case R_MIPS_TLS_DTPREL64:
d0f13682 6101 case R_MIPS16_TLS_DTPREL_LO16:
df58fc94 6102 case R_MICROMIPS_TLS_DTPREL_LO16:
0f20cc35
DJ
6103 value = (symbol + addend - dtprel_base (info)) & howto->dst_mask;
6104 break;
6105
6106 case R_MIPS_TLS_TPREL_HI16:
d0f13682 6107 case R_MIPS16_TLS_TPREL_HI16:
df58fc94 6108 case R_MICROMIPS_TLS_TPREL_HI16:
0f20cc35
DJ
6109 value = (mips_elf_high (addend + symbol - tprel_base (info))
6110 & howto->dst_mask);
6111 break;
6112
6113 case R_MIPS_TLS_TPREL_LO16:
d0f13682
CLT
6114 case R_MIPS_TLS_TPREL32:
6115 case R_MIPS_TLS_TPREL64:
6116 case R_MIPS16_TLS_TPREL_LO16:
df58fc94 6117 case R_MICROMIPS_TLS_TPREL_LO16:
0f20cc35
DJ
6118 value = (symbol + addend - tprel_base (info)) & howto->dst_mask;
6119 break;
6120
b49e97c9 6121 case R_MIPS_HI16:
d6f16593 6122 case R_MIPS16_HI16:
df58fc94 6123 case R_MICROMIPS_HI16:
b49e97c9
TS
6124 if (!gp_disp_p)
6125 {
6126 value = mips_elf_high (addend + symbol);
6127 value &= howto->dst_mask;
6128 }
6129 else
6130 {
d6f16593 6131 /* For MIPS16 ABI code we generate this sequence
07d6d2b8
AM
6132 0: li $v0,%hi(_gp_disp)
6133 4: addiupc $v1,%lo(_gp_disp)
6134 8: sll $v0,16
d6f16593
MR
6135 12: addu $v0,$v1
6136 14: move $gp,$v0
6137 So the offsets of hi and lo relocs are the same, but the
888b9c01
CLT
6138 base $pc is that used by the ADDIUPC instruction at $t9 + 4.
6139 ADDIUPC clears the low two bits of the instruction address,
6140 so the base is ($t9 + 4) & ~3. */
d6f16593 6141 if (r_type == R_MIPS16_HI16)
888b9c01 6142 value = mips_elf_high (addend + gp - ((p + 4) & ~(bfd_vma) 0x3));
df58fc94
RS
6143 /* The microMIPS .cpload sequence uses the same assembly
6144 instructions as the traditional psABI version, but the
6145 incoming $t9 has the low bit set. */
6146 else if (r_type == R_MICROMIPS_HI16)
6147 value = mips_elf_high (addend + gp - p - 1);
d6f16593
MR
6148 else
6149 value = mips_elf_high (addend + gp - p);
b49e97c9
TS
6150 }
6151 break;
6152
6153 case R_MIPS_LO16:
d6f16593 6154 case R_MIPS16_LO16:
df58fc94
RS
6155 case R_MICROMIPS_LO16:
6156 case R_MICROMIPS_HI0_LO16:
b49e97c9
TS
6157 if (!gp_disp_p)
6158 value = (symbol + addend) & howto->dst_mask;
6159 else
6160 {
d6f16593
MR
6161 /* See the comment for R_MIPS16_HI16 above for the reason
6162 for this conditional. */
6163 if (r_type == R_MIPS16_LO16)
888b9c01 6164 value = addend + gp - (p & ~(bfd_vma) 0x3);
df58fc94
RS
6165 else if (r_type == R_MICROMIPS_LO16
6166 || r_type == R_MICROMIPS_HI0_LO16)
6167 value = addend + gp - p + 3;
d6f16593
MR
6168 else
6169 value = addend + gp - p + 4;
b49e97c9 6170 /* The MIPS ABI requires checking the R_MIPS_LO16 relocation
8dc1a139 6171 for overflow. But, on, say, IRIX5, relocations against
b49e97c9
TS
6172 _gp_disp are normally generated from the .cpload
6173 pseudo-op. It generates code that normally looks like
6174 this:
6175
6176 lui $gp,%hi(_gp_disp)
6177 addiu $gp,$gp,%lo(_gp_disp)
6178 addu $gp,$gp,$t9
6179
6180 Here $t9 holds the address of the function being called,
6181 as required by the MIPS ELF ABI. The R_MIPS_LO16
6182 relocation can easily overflow in this situation, but the
6183 R_MIPS_HI16 relocation will handle the overflow.
6184 Therefore, we consider this a bug in the MIPS ABI, and do
6185 not check for overflow here. */
6186 }
6187 break;
6188
6189 case R_MIPS_LITERAL:
df58fc94 6190 case R_MICROMIPS_LITERAL:
b49e97c9
TS
6191 /* Because we don't merge literal sections, we can handle this
6192 just like R_MIPS_GPREL16. In the long run, we should merge
6193 shared literals, and then we will need to additional work
6194 here. */
6195
6196 /* Fall through. */
6197
6198 case R_MIPS16_GPREL:
6199 /* The R_MIPS16_GPREL performs the same calculation as
6200 R_MIPS_GPREL16, but stores the relocated bits in a different
6201 order. We don't need to do anything special here; the
6202 differences are handled in mips_elf_perform_relocation. */
6203 case R_MIPS_GPREL16:
df58fc94
RS
6204 case R_MICROMIPS_GPREL7_S2:
6205 case R_MICROMIPS_GPREL16:
bce03d3d
AO
6206 /* Only sign-extend the addend if it was extracted from the
6207 instruction. If the addend was separate, leave it alone,
6208 otherwise we may lose significant bits. */
6209 if (howto->partial_inplace)
a7ebbfdf 6210 addend = _bfd_mips_elf_sign_extend (addend, 16);
bce03d3d
AO
6211 value = symbol + addend - gp;
6212 /* If the symbol was local, any earlier relocatable links will
6213 have adjusted its addend with the gp offset, so compensate
6214 for that now. Don't do it for symbols forced local in this
6215 link, though, since they won't have had the gp offset applied
6216 to them before. */
6217 if (was_local_p)
6218 value += gp0;
538baf8b
AB
6219 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6220 overflowed_p = mips_elf_overflow_p (value, 16);
b49e97c9
TS
6221 break;
6222
738e5348
RS
6223 case R_MIPS16_GOT16:
6224 case R_MIPS16_CALL16:
b49e97c9
TS
6225 case R_MIPS_GOT16:
6226 case R_MIPS_CALL16:
df58fc94
RS
6227 case R_MICROMIPS_GOT16:
6228 case R_MICROMIPS_CALL16:
0a44bf69 6229 /* VxWorks does not have separate local and global semantics for
738e5348 6230 R_MIPS*_GOT16; every relocation evaluates to "G". */
0a44bf69 6231 if (!htab->is_vxworks && local_p)
b49e97c9 6232 {
5c18022e 6233 value = mips_elf_got16_entry (abfd, input_bfd, info,
020d7251 6234 symbol + addend, !was_local_p);
b49e97c9
TS
6235 if (value == MINUS_ONE)
6236 return bfd_reloc_outofrange;
6237 value
a8028dd0 6238 = mips_elf_got_offset_from_index (info, abfd, input_bfd, value);
b49e97c9
TS
6239 overflowed_p = mips_elf_overflow_p (value, 16);
6240 break;
6241 }
6242
6243 /* Fall through. */
6244
0f20cc35
DJ
6245 case R_MIPS_TLS_GD:
6246 case R_MIPS_TLS_GOTTPREL:
6247 case R_MIPS_TLS_LDM:
b49e97c9 6248 case R_MIPS_GOT_DISP:
d0f13682
CLT
6249 case R_MIPS16_TLS_GD:
6250 case R_MIPS16_TLS_GOTTPREL:
6251 case R_MIPS16_TLS_LDM:
df58fc94
RS
6252 case R_MICROMIPS_TLS_GD:
6253 case R_MICROMIPS_TLS_GOTTPREL:
6254 case R_MICROMIPS_TLS_LDM:
6255 case R_MICROMIPS_GOT_DISP:
b49e97c9
TS
6256 value = g;
6257 overflowed_p = mips_elf_overflow_p (value, 16);
6258 break;
6259
6260 case R_MIPS_GPREL32:
bce03d3d
AO
6261 value = (addend + symbol + gp0 - gp);
6262 if (!save_addend)
6263 value &= howto->dst_mask;
b49e97c9
TS
6264 break;
6265
6266 case R_MIPS_PC16:
bad36eac 6267 case R_MIPS_GNU_REL16_S2:
c3eb94b4
MF
6268 if (howto->partial_inplace)
6269 addend = _bfd_mips_elf_sign_extend (addend, 18);
6270
9d862524 6271 /* No need to exclude weak undefined symbols here as they resolve
07d6d2b8
AM
6272 to 0 and never set `*cross_mode_jump_p', so this alignment check
6273 will never trigger for them. */
9d862524
MR
6274 if (*cross_mode_jump_p
6275 ? ((symbol + addend) & 3) != 1
6276 : ((symbol + addend) & 3) != 0)
c3eb94b4
MF
6277 return bfd_reloc_outofrange;
6278
6279 value = symbol + addend - p;
538baf8b
AB
6280 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6281 overflowed_p = mips_elf_overflow_p (value, 18);
37caec6b
TS
6282 value >>= howto->rightshift;
6283 value &= howto->dst_mask;
b49e97c9
TS
6284 break;
6285
c9775dde
MR
6286 case R_MIPS16_PC16_S1:
6287 if (howto->partial_inplace)
6288 addend = _bfd_mips_elf_sign_extend (addend, 17);
6289
6290 if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
9d862524
MR
6291 && (*cross_mode_jump_p
6292 ? ((symbol + addend) & 3) != 0
6293 : ((symbol + addend) & 1) == 0))
c9775dde
MR
6294 return bfd_reloc_outofrange;
6295
6296 value = symbol + addend - p;
6297 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6298 overflowed_p = mips_elf_overflow_p (value, 17);
6299 value >>= howto->rightshift;
6300 value &= howto->dst_mask;
6301 break;
6302
7361da2c
AB
6303 case R_MIPS_PC21_S2:
6304 if (howto->partial_inplace)
6305 addend = _bfd_mips_elf_sign_extend (addend, 23);
6306
6307 if ((symbol + addend) & 3)
6308 return bfd_reloc_outofrange;
6309
6310 value = symbol + addend - p;
538baf8b
AB
6311 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6312 overflowed_p = mips_elf_overflow_p (value, 23);
7361da2c
AB
6313 value >>= howto->rightshift;
6314 value &= howto->dst_mask;
6315 break;
6316
6317 case R_MIPS_PC26_S2:
6318 if (howto->partial_inplace)
6319 addend = _bfd_mips_elf_sign_extend (addend, 28);
6320
6321 if ((symbol + addend) & 3)
6322 return bfd_reloc_outofrange;
6323
6324 value = symbol + addend - p;
538baf8b
AB
6325 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6326 overflowed_p = mips_elf_overflow_p (value, 28);
7361da2c
AB
6327 value >>= howto->rightshift;
6328 value &= howto->dst_mask;
6329 break;
6330
6331 case R_MIPS_PC18_S3:
6332 if (howto->partial_inplace)
6333 addend = _bfd_mips_elf_sign_extend (addend, 21);
6334
6335 if ((symbol + addend) & 7)
6336 return bfd_reloc_outofrange;
6337
6338 value = symbol + addend - ((p | 7) ^ 7);
538baf8b
AB
6339 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6340 overflowed_p = mips_elf_overflow_p (value, 21);
7361da2c
AB
6341 value >>= howto->rightshift;
6342 value &= howto->dst_mask;
6343 break;
6344
6345 case R_MIPS_PC19_S2:
6346 if (howto->partial_inplace)
6347 addend = _bfd_mips_elf_sign_extend (addend, 21);
6348
6349 if ((symbol + addend) & 3)
6350 return bfd_reloc_outofrange;
6351
6352 value = symbol + addend - p;
538baf8b
AB
6353 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6354 overflowed_p = mips_elf_overflow_p (value, 21);
7361da2c
AB
6355 value >>= howto->rightshift;
6356 value &= howto->dst_mask;
6357 break;
6358
6359 case R_MIPS_PCHI16:
6360 value = mips_elf_high (symbol + addend - p);
7361da2c
AB
6361 value &= howto->dst_mask;
6362 break;
6363
6364 case R_MIPS_PCLO16:
6365 if (howto->partial_inplace)
6366 addend = _bfd_mips_elf_sign_extend (addend, 16);
6367 value = symbol + addend - p;
6368 value &= howto->dst_mask;
6369 break;
6370
df58fc94 6371 case R_MICROMIPS_PC7_S1:
c3eb94b4
MF
6372 if (howto->partial_inplace)
6373 addend = _bfd_mips_elf_sign_extend (addend, 8);
9d862524
MR
6374
6375 if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6376 && (*cross_mode_jump_p
6377 ? ((symbol + addend + 2) & 3) != 0
6378 : ((symbol + addend + 2) & 1) == 0))
6379 return bfd_reloc_outofrange;
6380
c3eb94b4 6381 value = symbol + addend - p;
538baf8b
AB
6382 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6383 overflowed_p = mips_elf_overflow_p (value, 8);
df58fc94
RS
6384 value >>= howto->rightshift;
6385 value &= howto->dst_mask;
6386 break;
6387
6388 case R_MICROMIPS_PC10_S1:
c3eb94b4
MF
6389 if (howto->partial_inplace)
6390 addend = _bfd_mips_elf_sign_extend (addend, 11);
9d862524
MR
6391
6392 if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6393 && (*cross_mode_jump_p
6394 ? ((symbol + addend + 2) & 3) != 0
6395 : ((symbol + addend + 2) & 1) == 0))
6396 return bfd_reloc_outofrange;
6397
c3eb94b4 6398 value = symbol + addend - p;
538baf8b
AB
6399 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6400 overflowed_p = mips_elf_overflow_p (value, 11);
df58fc94
RS
6401 value >>= howto->rightshift;
6402 value &= howto->dst_mask;
6403 break;
6404
6405 case R_MICROMIPS_PC16_S1:
c3eb94b4
MF
6406 if (howto->partial_inplace)
6407 addend = _bfd_mips_elf_sign_extend (addend, 17);
9d862524
MR
6408
6409 if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6410 && (*cross_mode_jump_p
6411 ? ((symbol + addend) & 3) != 0
6412 : ((symbol + addend) & 1) == 0))
6413 return bfd_reloc_outofrange;
6414
c3eb94b4 6415 value = symbol + addend - p;
538baf8b
AB
6416 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6417 overflowed_p = mips_elf_overflow_p (value, 17);
df58fc94
RS
6418 value >>= howto->rightshift;
6419 value &= howto->dst_mask;
6420 break;
6421
6422 case R_MICROMIPS_PC23_S2:
c3eb94b4
MF
6423 if (howto->partial_inplace)
6424 addend = _bfd_mips_elf_sign_extend (addend, 25);
6425 value = symbol + addend - ((p | 3) ^ 3);
538baf8b
AB
6426 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6427 overflowed_p = mips_elf_overflow_p (value, 25);
df58fc94
RS
6428 value >>= howto->rightshift;
6429 value &= howto->dst_mask;
6430 break;
6431
b49e97c9
TS
6432 case R_MIPS_GOT_HI16:
6433 case R_MIPS_CALL_HI16:
df58fc94
RS
6434 case R_MICROMIPS_GOT_HI16:
6435 case R_MICROMIPS_CALL_HI16:
b49e97c9
TS
6436 /* We're allowed to handle these two relocations identically.
6437 The dynamic linker is allowed to handle the CALL relocations
6438 differently by creating a lazy evaluation stub. */
6439 value = g;
6440 value = mips_elf_high (value);
6441 value &= howto->dst_mask;
6442 break;
6443
6444 case R_MIPS_GOT_LO16:
6445 case R_MIPS_CALL_LO16:
df58fc94
RS
6446 case R_MICROMIPS_GOT_LO16:
6447 case R_MICROMIPS_CALL_LO16:
b49e97c9
TS
6448 value = g & howto->dst_mask;
6449 break;
6450
6451 case R_MIPS_GOT_PAGE:
df58fc94 6452 case R_MICROMIPS_GOT_PAGE:
5c18022e 6453 value = mips_elf_got_page (abfd, input_bfd, info, symbol + addend, NULL);
b49e97c9
TS
6454 if (value == MINUS_ONE)
6455 return bfd_reloc_outofrange;
a8028dd0 6456 value = mips_elf_got_offset_from_index (info, abfd, input_bfd, value);
b49e97c9
TS
6457 overflowed_p = mips_elf_overflow_p (value, 16);
6458 break;
6459
6460 case R_MIPS_GOT_OFST:
df58fc94 6461 case R_MICROMIPS_GOT_OFST:
93a2b7ae 6462 if (local_p)
5c18022e 6463 mips_elf_got_page (abfd, input_bfd, info, symbol + addend, &value);
0fdc1bf1
AO
6464 else
6465 value = addend;
b49e97c9
TS
6466 overflowed_p = mips_elf_overflow_p (value, 16);
6467 break;
6468
6469 case R_MIPS_SUB:
df58fc94 6470 case R_MICROMIPS_SUB:
b49e97c9
TS
6471 value = symbol - addend;
6472 value &= howto->dst_mask;
6473 break;
6474
6475 case R_MIPS_HIGHER:
df58fc94 6476 case R_MICROMIPS_HIGHER:
b49e97c9
TS
6477 value = mips_elf_higher (addend + symbol);
6478 value &= howto->dst_mask;
6479 break;
6480
6481 case R_MIPS_HIGHEST:
df58fc94 6482 case R_MICROMIPS_HIGHEST:
b49e97c9
TS
6483 value = mips_elf_highest (addend + symbol);
6484 value &= howto->dst_mask;
6485 break;
6486
6487 case R_MIPS_SCN_DISP:
df58fc94 6488 case R_MICROMIPS_SCN_DISP:
b49e97c9
TS
6489 value = symbol + addend - sec->output_offset;
6490 value &= howto->dst_mask;
6491 break;
6492
b49e97c9 6493 case R_MIPS_JALR:
df58fc94 6494 case R_MICROMIPS_JALR:
1367d393
ILT
6495 /* This relocation is only a hint. In some cases, we optimize
6496 it into a bal instruction. But we don't try to optimize
5bbc5ae7
AN
6497 when the symbol does not resolve locally. */
6498 if (h != NULL && !SYMBOL_CALLS_LOCAL (info, &h->root))
1367d393 6499 return bfd_reloc_continue;
c1556ecd
MR
6500 /* We can't optimize cross-mode jumps either. */
6501 if (*cross_mode_jump_p)
6502 return bfd_reloc_continue;
1367d393 6503 value = symbol + addend;
c1556ecd
MR
6504 /* Neither we can non-instruction-aligned targets. */
6505 if (r_type == R_MIPS_JALR ? (value & 3) != 0 : (value & 1) == 0)
6506 return bfd_reloc_continue;
1367d393 6507 break;
b49e97c9 6508
1367d393 6509 case R_MIPS_PJUMP:
b49e97c9
TS
6510 case R_MIPS_GNU_VTINHERIT:
6511 case R_MIPS_GNU_VTENTRY:
6512 /* We don't do anything with these at present. */
6513 return bfd_reloc_continue;
6514
6515 default:
6516 /* An unrecognized relocation type. */
6517 return bfd_reloc_notsupported;
6518 }
6519
6520 /* Store the VALUE for our caller. */
6521 *valuep = value;
6522 return overflowed_p ? bfd_reloc_overflow : bfd_reloc_ok;
6523}
6524
b49e97c9
TS
6525/* It has been determined that the result of the RELOCATION is the
6526 VALUE. Use HOWTO to place VALUE into the output file at the
6527 appropriate position. The SECTION is the section to which the
68ffbac6 6528 relocation applies.
38a7df63 6529 CROSS_MODE_JUMP_P is true if the relocation field
df58fc94 6530 is a MIPS16 or microMIPS jump to standard MIPS code, or vice versa.
b49e97c9 6531
b34976b6 6532 Returns FALSE if anything goes wrong. */
b49e97c9 6533
b34976b6 6534static bfd_boolean
9719ad41
RS
6535mips_elf_perform_relocation (struct bfd_link_info *info,
6536 reloc_howto_type *howto,
6537 const Elf_Internal_Rela *relocation,
6538 bfd_vma value, bfd *input_bfd,
6539 asection *input_section, bfd_byte *contents,
38a7df63 6540 bfd_boolean cross_mode_jump_p)
b49e97c9
TS
6541{
6542 bfd_vma x;
6543 bfd_byte *location;
6544 int r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
6545
6546 /* Figure out where the relocation is occurring. */
6547 location = contents + relocation->r_offset;
6548
df58fc94 6549 _bfd_mips_elf_reloc_unshuffle (input_bfd, r_type, FALSE, location);
d6f16593 6550
b49e97c9
TS
6551 /* Obtain the current value. */
6552 x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
6553
6554 /* Clear the field we are setting. */
6555 x &= ~howto->dst_mask;
6556
b49e97c9
TS
6557 /* Set the field. */
6558 x |= (value & howto->dst_mask);
6559
a6ebf616 6560 /* Detect incorrect JALX usage. If required, turn JAL or BAL into JALX. */
9d862524
MR
6561 if (!cross_mode_jump_p && jal_reloc_p (r_type))
6562 {
6563 bfd_vma opcode = x >> 26;
6564
6565 if (r_type == R_MIPS16_26 ? opcode == 0x7
6566 : r_type == R_MICROMIPS_26_S1 ? opcode == 0x3c
6567 : opcode == 0x1d)
6568 {
6569 info->callbacks->einfo
2c1c9679 6570 (_("%X%H: unsupported JALX to the same ISA mode\n"),
9d862524
MR
6571 input_bfd, input_section, relocation->r_offset);
6572 return TRUE;
6573 }
6574 }
38a7df63 6575 if (cross_mode_jump_p && jal_reloc_p (r_type))
b49e97c9 6576 {
b34976b6 6577 bfd_boolean ok;
b49e97c9
TS
6578 bfd_vma opcode = x >> 26;
6579 bfd_vma jalx_opcode;
6580
6581 /* Check to see if the opcode is already JAL or JALX. */
6582 if (r_type == R_MIPS16_26)
6583 {
6584 ok = ((opcode == 0x6) || (opcode == 0x7));
6585 jalx_opcode = 0x7;
6586 }
df58fc94
RS
6587 else if (r_type == R_MICROMIPS_26_S1)
6588 {
6589 ok = ((opcode == 0x3d) || (opcode == 0x3c));
6590 jalx_opcode = 0x3c;
6591 }
b49e97c9
TS
6592 else
6593 {
6594 ok = ((opcode == 0x3) || (opcode == 0x1d));
6595 jalx_opcode = 0x1d;
6596 }
6597
3bdf9505 6598 /* If the opcode is not JAL or JALX, there's a problem. We cannot
07d6d2b8 6599 convert J or JALS to JALX. */
b49e97c9
TS
6600 if (!ok)
6601 {
5f68df25 6602 info->callbacks->einfo
2c1c9679 6603 (_("%X%H: unsupported jump between ISA modes; "
5f68df25
MR
6604 "consider recompiling with interlinking enabled\n"),
6605 input_bfd, input_section, relocation->r_offset);
6606 return TRUE;
b49e97c9
TS
6607 }
6608
6609 /* Make this the JALX opcode. */
2365f8d7 6610 x = (x & ~(0x3fu << 26)) | (jalx_opcode << 26);
b49e97c9 6611 }
9d862524
MR
6612 else if (cross_mode_jump_p && b_reloc_p (r_type))
6613 {
a6ebf616
MR
6614 bfd_boolean ok = FALSE;
6615 bfd_vma opcode = x >> 16;
6616 bfd_vma jalx_opcode = 0;
70e65ca8 6617 bfd_vma sign_bit = 0;
a6ebf616
MR
6618 bfd_vma addr;
6619 bfd_vma dest;
6620
6621 if (r_type == R_MICROMIPS_PC16_S1)
6622 {
6623 ok = opcode == 0x4060;
6624 jalx_opcode = 0x3c;
70e65ca8 6625 sign_bit = 0x10000;
a6ebf616
MR
6626 value <<= 1;
6627 }
6628 else if (r_type == R_MIPS_PC16 || r_type == R_MIPS_GNU_REL16_S2)
6629 {
6630 ok = opcode == 0x411;
6631 jalx_opcode = 0x1d;
70e65ca8 6632 sign_bit = 0x20000;
a6ebf616
MR
6633 value <<= 2;
6634 }
6635
8b10b0b3 6636 if (ok && !bfd_link_pic (info))
a6ebf616 6637 {
8b10b0b3
MR
6638 addr = (input_section->output_section->vma
6639 + input_section->output_offset
6640 + relocation->r_offset
6641 + 4);
70e65ca8
MR
6642 dest = (addr
6643 + (((value & ((sign_bit << 1) - 1)) ^ sign_bit) - sign_bit));
a6ebf616 6644
8b10b0b3
MR
6645 if ((addr >> 28) << 28 != (dest >> 28) << 28)
6646 {
6647 info->callbacks->einfo
2c1c9679 6648 (_("%X%H: cannot convert branch between ISA modes "
8b10b0b3
MR
6649 "to JALX: relocation out of range\n"),
6650 input_bfd, input_section, relocation->r_offset);
6651 return TRUE;
6652 }
a6ebf616 6653
8b10b0b3
MR
6654 /* Make this the JALX opcode. */
6655 x = ((dest >> 2) & 0x3ffffff) | jalx_opcode << 26;
6656 }
6657 else if (!mips_elf_hash_table (info)->ignore_branch_isa)
a6ebf616
MR
6658 {
6659 info->callbacks->einfo
2c1c9679 6660 (_("%X%H: unsupported branch between ISA modes\n"),
a6ebf616
MR
6661 input_bfd, input_section, relocation->r_offset);
6662 return TRUE;
6663 }
9d862524 6664 }
b49e97c9 6665
38a7df63
CF
6666 /* Try converting JAL to BAL and J(AL)R to B(AL), if the target is in
6667 range. */
0e1862bb 6668 if (!bfd_link_relocatable (info)
38a7df63 6669 && !cross_mode_jump_p
cd8d5a82
CF
6670 && ((JAL_TO_BAL_P (input_bfd)
6671 && r_type == R_MIPS_26
0e392101 6672 && (x >> 26) == 0x3) /* jal addr */
cd8d5a82
CF
6673 || (JALR_TO_BAL_P (input_bfd)
6674 && r_type == R_MIPS_JALR
0e392101 6675 && x == 0x0320f809) /* jalr t9 */
38a7df63
CF
6676 || (JR_TO_B_P (input_bfd)
6677 && r_type == R_MIPS_JALR
0e392101 6678 && (x & ~1) == 0x03200008))) /* jr t9 / jalr zero, t9 */
1367d393
ILT
6679 {
6680 bfd_vma addr;
6681 bfd_vma dest;
6682 bfd_signed_vma off;
6683
6684 addr = (input_section->output_section->vma
6685 + input_section->output_offset
6686 + relocation->r_offset
6687 + 4);
6688 if (r_type == R_MIPS_26)
6689 dest = (value << 2) | ((addr >> 28) << 28);
6690 else
6691 dest = value;
6692 off = dest - addr;
6693 if (off <= 0x1ffff && off >= -0x20000)
38a7df63 6694 {
0e392101 6695 if ((x & ~1) == 0x03200008) /* jr t9 / jalr zero, t9 */
38a7df63
CF
6696 x = 0x10000000 | (((bfd_vma) off >> 2) & 0xffff); /* b addr */
6697 else
6698 x = 0x04110000 | (((bfd_vma) off >> 2) & 0xffff); /* bal addr */
6699 }
1367d393
ILT
6700 }
6701
b49e97c9 6702 /* Put the value into the output. */
98e10ffa 6703 mips_elf_store_contents (howto, relocation, input_bfd, contents, x);
d6f16593 6704
0e1862bb 6705 _bfd_mips_elf_reloc_shuffle (input_bfd, r_type, !bfd_link_relocatable (info),
df58fc94 6706 location);
d6f16593 6707
b34976b6 6708 return TRUE;
b49e97c9 6709}
b49e97c9 6710\f
b49e97c9
TS
6711/* Create a rel.dyn relocation for the dynamic linker to resolve. REL
6712 is the original relocation, which is now being transformed into a
6713 dynamic relocation. The ADDENDP is adjusted if necessary; the
6714 caller should store the result in place of the original addend. */
6715
b34976b6 6716static bfd_boolean
9719ad41
RS
6717mips_elf_create_dynamic_relocation (bfd *output_bfd,
6718 struct bfd_link_info *info,
6719 const Elf_Internal_Rela *rel,
6720 struct mips_elf_link_hash_entry *h,
6721 asection *sec, bfd_vma symbol,
6722 bfd_vma *addendp, asection *input_section)
b49e97c9 6723{
947216bf 6724 Elf_Internal_Rela outrel[3];
b49e97c9
TS
6725 asection *sreloc;
6726 bfd *dynobj;
6727 int r_type;
5d41f0b6
RS
6728 long indx;
6729 bfd_boolean defined_p;
0a44bf69 6730 struct mips_elf_link_hash_table *htab;
b49e97c9 6731
0a44bf69 6732 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
6733 BFD_ASSERT (htab != NULL);
6734
b49e97c9
TS
6735 r_type = ELF_R_TYPE (output_bfd, rel->r_info);
6736 dynobj = elf_hash_table (info)->dynobj;
0a44bf69 6737 sreloc = mips_elf_rel_dyn_section (info, FALSE);
b49e97c9
TS
6738 BFD_ASSERT (sreloc != NULL);
6739 BFD_ASSERT (sreloc->contents != NULL);
6740 BFD_ASSERT (sreloc->reloc_count * MIPS_ELF_REL_SIZE (output_bfd)
eea6121a 6741 < sreloc->size);
b49e97c9 6742
b49e97c9
TS
6743 outrel[0].r_offset =
6744 _bfd_elf_section_offset (output_bfd, info, input_section, rel[0].r_offset);
9ddf8309
TS
6745 if (ABI_64_P (output_bfd))
6746 {
6747 outrel[1].r_offset =
6748 _bfd_elf_section_offset (output_bfd, info, input_section, rel[1].r_offset);
6749 outrel[2].r_offset =
6750 _bfd_elf_section_offset (output_bfd, info, input_section, rel[2].r_offset);
6751 }
b49e97c9 6752
c5ae1840 6753 if (outrel[0].r_offset == MINUS_ONE)
0d591ff7 6754 /* The relocation field has been deleted. */
5d41f0b6
RS
6755 return TRUE;
6756
6757 if (outrel[0].r_offset == MINUS_TWO)
0d591ff7
RS
6758 {
6759 /* The relocation field has been converted into a relative value of
6760 some sort. Functions like _bfd_elf_write_section_eh_frame expect
6761 the field to be fully relocated, so add in the symbol's value. */
0d591ff7 6762 *addendp += symbol;
5d41f0b6 6763 return TRUE;
0d591ff7 6764 }
b49e97c9 6765
5d41f0b6
RS
6766 /* We must now calculate the dynamic symbol table index to use
6767 in the relocation. */
d4a77f3f 6768 if (h != NULL && ! SYMBOL_REFERENCES_LOCAL (info, &h->root))
5d41f0b6 6769 {
020d7251 6770 BFD_ASSERT (htab->is_vxworks || h->global_got_area != GGA_NONE);
5d41f0b6
RS
6771 indx = h->root.dynindx;
6772 if (SGI_COMPAT (output_bfd))
6773 defined_p = h->root.def_regular;
6774 else
6775 /* ??? glibc's ld.so just adds the final GOT entry to the
6776 relocation field. It therefore treats relocs against
6777 defined symbols in the same way as relocs against
6778 undefined symbols. */
6779 defined_p = FALSE;
6780 }
b49e97c9
TS
6781 else
6782 {
5d41f0b6
RS
6783 if (sec != NULL && bfd_is_abs_section (sec))
6784 indx = 0;
6785 else if (sec == NULL || sec->owner == NULL)
fdd07405 6786 {
5d41f0b6
RS
6787 bfd_set_error (bfd_error_bad_value);
6788 return FALSE;
b49e97c9
TS
6789 }
6790 else
6791 {
5d41f0b6 6792 indx = elf_section_data (sec->output_section)->dynindx;
74541ad4
AM
6793 if (indx == 0)
6794 {
6795 asection *osec = htab->root.text_index_section;
6796 indx = elf_section_data (osec)->dynindx;
6797 }
5d41f0b6
RS
6798 if (indx == 0)
6799 abort ();
b49e97c9
TS
6800 }
6801
5d41f0b6
RS
6802 /* Instead of generating a relocation using the section
6803 symbol, we may as well make it a fully relative
6804 relocation. We want to avoid generating relocations to
6805 local symbols because we used to generate them
6806 incorrectly, without adding the original symbol value,
6807 which is mandated by the ABI for section symbols. In
6808 order to give dynamic loaders and applications time to
6809 phase out the incorrect use, we refrain from emitting
6810 section-relative relocations. It's not like they're
6811 useful, after all. This should be a bit more efficient
6812 as well. */
6813 /* ??? Although this behavior is compatible with glibc's ld.so,
6814 the ABI says that relocations against STN_UNDEF should have
6815 a symbol value of 0. Irix rld honors this, so relocations
6816 against STN_UNDEF have no effect. */
6817 if (!SGI_COMPAT (output_bfd))
6818 indx = 0;
6819 defined_p = TRUE;
b49e97c9
TS
6820 }
6821
5d41f0b6
RS
6822 /* If the relocation was previously an absolute relocation and
6823 this symbol will not be referred to by the relocation, we must
6824 adjust it by the value we give it in the dynamic symbol table.
6825 Otherwise leave the job up to the dynamic linker. */
6826 if (defined_p && r_type != R_MIPS_REL32)
6827 *addendp += symbol;
6828
0a44bf69
RS
6829 if (htab->is_vxworks)
6830 /* VxWorks uses non-relative relocations for this. */
6831 outrel[0].r_info = ELF32_R_INFO (indx, R_MIPS_32);
6832 else
6833 /* The relocation is always an REL32 relocation because we don't
6834 know where the shared library will wind up at load-time. */
6835 outrel[0].r_info = ELF_R_INFO (output_bfd, (unsigned long) indx,
6836 R_MIPS_REL32);
6837
5d41f0b6
RS
6838 /* For strict adherence to the ABI specification, we should
6839 generate a R_MIPS_64 relocation record by itself before the
6840 _REL32/_64 record as well, such that the addend is read in as
6841 a 64-bit value (REL32 is a 32-bit relocation, after all).
6842 However, since none of the existing ELF64 MIPS dynamic
6843 loaders seems to care, we don't waste space with these
6844 artificial relocations. If this turns out to not be true,
6845 mips_elf_allocate_dynamic_relocation() should be tweaked so
6846 as to make room for a pair of dynamic relocations per
6847 invocation if ABI_64_P, and here we should generate an
6848 additional relocation record with R_MIPS_64 by itself for a
6849 NULL symbol before this relocation record. */
6850 outrel[1].r_info = ELF_R_INFO (output_bfd, 0,
6851 ABI_64_P (output_bfd)
6852 ? R_MIPS_64
6853 : R_MIPS_NONE);
6854 outrel[2].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_NONE);
6855
6856 /* Adjust the output offset of the relocation to reference the
6857 correct location in the output file. */
6858 outrel[0].r_offset += (input_section->output_section->vma
6859 + input_section->output_offset);
6860 outrel[1].r_offset += (input_section->output_section->vma
6861 + input_section->output_offset);
6862 outrel[2].r_offset += (input_section->output_section->vma
6863 + input_section->output_offset);
6864
b49e97c9
TS
6865 /* Put the relocation back out. We have to use the special
6866 relocation outputter in the 64-bit case since the 64-bit
6867 relocation format is non-standard. */
6868 if (ABI_64_P (output_bfd))
6869 {
6870 (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
6871 (output_bfd, &outrel[0],
6872 (sreloc->contents
6873 + sreloc->reloc_count * sizeof (Elf64_Mips_External_Rel)));
6874 }
0a44bf69
RS
6875 else if (htab->is_vxworks)
6876 {
6877 /* VxWorks uses RELA rather than REL dynamic relocations. */
6878 outrel[0].r_addend = *addendp;
6879 bfd_elf32_swap_reloca_out
6880 (output_bfd, &outrel[0],
6881 (sreloc->contents
6882 + sreloc->reloc_count * sizeof (Elf32_External_Rela)));
6883 }
b49e97c9 6884 else
947216bf
AM
6885 bfd_elf32_swap_reloc_out
6886 (output_bfd, &outrel[0],
6887 (sreloc->contents + sreloc->reloc_count * sizeof (Elf32_External_Rel)));
b49e97c9 6888
b49e97c9
TS
6889 /* We've now added another relocation. */
6890 ++sreloc->reloc_count;
6891
6892 /* Make sure the output section is writable. The dynamic linker
6893 will be writing to it. */
6894 elf_section_data (input_section->output_section)->this_hdr.sh_flags
6895 |= SHF_WRITE;
6896
6897 /* On IRIX5, make an entry of compact relocation info. */
5d41f0b6 6898 if (IRIX_COMPAT (output_bfd) == ict_irix5)
b49e97c9 6899 {
3d4d4302 6900 asection *scpt = bfd_get_linker_section (dynobj, ".compact_rel");
b49e97c9
TS
6901 bfd_byte *cr;
6902
6903 if (scpt)
6904 {
6905 Elf32_crinfo cptrel;
6906
6907 mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG);
6908 cptrel.vaddr = (rel->r_offset
6909 + input_section->output_section->vma
6910 + input_section->output_offset);
6911 if (r_type == R_MIPS_REL32)
6912 mips_elf_set_cr_type (cptrel, CRT_MIPS_REL32);
6913 else
6914 mips_elf_set_cr_type (cptrel, CRT_MIPS_WORD);
6915 mips_elf_set_cr_dist2to (cptrel, 0);
6916 cptrel.konst = *addendp;
6917
6918 cr = (scpt->contents
6919 + sizeof (Elf32_External_compact_rel));
abc0f8d0 6920 mips_elf_set_cr_relvaddr (cptrel, 0);
b49e97c9
TS
6921 bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
6922 ((Elf32_External_crinfo *) cr
6923 + scpt->reloc_count));
6924 ++scpt->reloc_count;
6925 }
6926 }
6927
943284cc
DJ
6928 /* If we've written this relocation for a readonly section,
6929 we need to set DF_TEXTREL again, so that we do not delete the
6930 DT_TEXTREL tag. */
6931 if (MIPS_ELF_READONLY_SECTION (input_section))
6932 info->flags |= DF_TEXTREL;
6933
b34976b6 6934 return TRUE;
b49e97c9
TS
6935}
6936\f
b49e97c9
TS
6937/* Return the MACH for a MIPS e_flags value. */
6938
6939unsigned long
9719ad41 6940_bfd_elf_mips_mach (flagword flags)
b49e97c9
TS
6941{
6942 switch (flags & EF_MIPS_MACH)
6943 {
6944 case E_MIPS_MACH_3900:
6945 return bfd_mach_mips3900;
6946
6947 case E_MIPS_MACH_4010:
6948 return bfd_mach_mips4010;
6949
6950 case E_MIPS_MACH_4100:
6951 return bfd_mach_mips4100;
6952
6953 case E_MIPS_MACH_4111:
6954 return bfd_mach_mips4111;
6955
00707a0e
RS
6956 case E_MIPS_MACH_4120:
6957 return bfd_mach_mips4120;
6958
b49e97c9
TS
6959 case E_MIPS_MACH_4650:
6960 return bfd_mach_mips4650;
6961
00707a0e
RS
6962 case E_MIPS_MACH_5400:
6963 return bfd_mach_mips5400;
6964
6965 case E_MIPS_MACH_5500:
6966 return bfd_mach_mips5500;
6967
e407c74b
NC
6968 case E_MIPS_MACH_5900:
6969 return bfd_mach_mips5900;
6970
0d2e43ed
ILT
6971 case E_MIPS_MACH_9000:
6972 return bfd_mach_mips9000;
6973
b49e97c9
TS
6974 case E_MIPS_MACH_SB1:
6975 return bfd_mach_mips_sb1;
6976
350cc38d
MS
6977 case E_MIPS_MACH_LS2E:
6978 return bfd_mach_mips_loongson_2e;
6979
6980 case E_MIPS_MACH_LS2F:
6981 return bfd_mach_mips_loongson_2f;
6982
ac8cb70f
CX
6983 case E_MIPS_MACH_GS464:
6984 return bfd_mach_mips_gs464;
fd503541 6985
bd782c07
CX
6986 case E_MIPS_MACH_GS464E:
6987 return bfd_mach_mips_gs464e;
6988
9108bc33
CX
6989 case E_MIPS_MACH_GS264E:
6990 return bfd_mach_mips_gs264e;
6991
2c629856
N
6992 case E_MIPS_MACH_OCTEON3:
6993 return bfd_mach_mips_octeon3;
6994
432233b3
AP
6995 case E_MIPS_MACH_OCTEON2:
6996 return bfd_mach_mips_octeon2;
6997
6f179bd0
AN
6998 case E_MIPS_MACH_OCTEON:
6999 return bfd_mach_mips_octeon;
7000
52b6b6b9
JM
7001 case E_MIPS_MACH_XLR:
7002 return bfd_mach_mips_xlr;
7003
38bf472a
MR
7004 case E_MIPS_MACH_IAMR2:
7005 return bfd_mach_mips_interaptiv_mr2;
7006
b49e97c9
TS
7007 default:
7008 switch (flags & EF_MIPS_ARCH)
7009 {
7010 default:
7011 case E_MIPS_ARCH_1:
7012 return bfd_mach_mips3000;
b49e97c9
TS
7013
7014 case E_MIPS_ARCH_2:
7015 return bfd_mach_mips6000;
b49e97c9
TS
7016
7017 case E_MIPS_ARCH_3:
7018 return bfd_mach_mips4000;
b49e97c9
TS
7019
7020 case E_MIPS_ARCH_4:
7021 return bfd_mach_mips8000;
b49e97c9
TS
7022
7023 case E_MIPS_ARCH_5:
7024 return bfd_mach_mips5;
b49e97c9
TS
7025
7026 case E_MIPS_ARCH_32:
7027 return bfd_mach_mipsisa32;
b49e97c9
TS
7028
7029 case E_MIPS_ARCH_64:
7030 return bfd_mach_mipsisa64;
af7ee8bf
CD
7031
7032 case E_MIPS_ARCH_32R2:
7033 return bfd_mach_mipsisa32r2;
5f74bc13
CD
7034
7035 case E_MIPS_ARCH_64R2:
7036 return bfd_mach_mipsisa64r2;
7361da2c
AB
7037
7038 case E_MIPS_ARCH_32R6:
7039 return bfd_mach_mipsisa32r6;
7040
7041 case E_MIPS_ARCH_64R6:
7042 return bfd_mach_mipsisa64r6;
b49e97c9
TS
7043 }
7044 }
7045
7046 return 0;
7047}
7048
7049/* Return printable name for ABI. */
7050
7051static INLINE char *
9719ad41 7052elf_mips_abi_name (bfd *abfd)
b49e97c9
TS
7053{
7054 flagword flags;
7055
7056 flags = elf_elfheader (abfd)->e_flags;
7057 switch (flags & EF_MIPS_ABI)
7058 {
7059 case 0:
7060 if (ABI_N32_P (abfd))
7061 return "N32";
7062 else if (ABI_64_P (abfd))
7063 return "64";
7064 else
7065 return "none";
7066 case E_MIPS_ABI_O32:
7067 return "O32";
7068 case E_MIPS_ABI_O64:
7069 return "O64";
7070 case E_MIPS_ABI_EABI32:
7071 return "EABI32";
7072 case E_MIPS_ABI_EABI64:
7073 return "EABI64";
7074 default:
7075 return "unknown abi";
7076 }
7077}
7078\f
7079/* MIPS ELF uses two common sections. One is the usual one, and the
7080 other is for small objects. All the small objects are kept
7081 together, and then referenced via the gp pointer, which yields
7082 faster assembler code. This is what we use for the small common
7083 section. This approach is copied from ecoff.c. */
7084static asection mips_elf_scom_section;
7085static asymbol mips_elf_scom_symbol;
7086static asymbol *mips_elf_scom_symbol_ptr;
7087
7088/* MIPS ELF also uses an acommon section, which represents an
7089 allocated common symbol which may be overridden by a
7090 definition in a shared library. */
7091static asection mips_elf_acom_section;
7092static asymbol mips_elf_acom_symbol;
7093static asymbol *mips_elf_acom_symbol_ptr;
7094
738e5348 7095/* This is used for both the 32-bit and the 64-bit ABI. */
b49e97c9
TS
7096
7097void
9719ad41 7098_bfd_mips_elf_symbol_processing (bfd *abfd, asymbol *asym)
b49e97c9
TS
7099{
7100 elf_symbol_type *elfsym;
7101
738e5348 7102 /* Handle the special MIPS section numbers that a symbol may use. */
b49e97c9
TS
7103 elfsym = (elf_symbol_type *) asym;
7104 switch (elfsym->internal_elf_sym.st_shndx)
7105 {
7106 case SHN_MIPS_ACOMMON:
7107 /* This section is used in a dynamically linked executable file.
7108 It is an allocated common section. The dynamic linker can
7109 either resolve these symbols to something in a shared
7110 library, or it can just leave them here. For our purposes,
7111 we can consider these symbols to be in a new section. */
7112 if (mips_elf_acom_section.name == NULL)
7113 {
7114 /* Initialize the acommon section. */
7115 mips_elf_acom_section.name = ".acommon";
7116 mips_elf_acom_section.flags = SEC_ALLOC;
7117 mips_elf_acom_section.output_section = &mips_elf_acom_section;
7118 mips_elf_acom_section.symbol = &mips_elf_acom_symbol;
7119 mips_elf_acom_section.symbol_ptr_ptr = &mips_elf_acom_symbol_ptr;
7120 mips_elf_acom_symbol.name = ".acommon";
7121 mips_elf_acom_symbol.flags = BSF_SECTION_SYM;
7122 mips_elf_acom_symbol.section = &mips_elf_acom_section;
7123 mips_elf_acom_symbol_ptr = &mips_elf_acom_symbol;
7124 }
7125 asym->section = &mips_elf_acom_section;
7126 break;
7127
7128 case SHN_COMMON:
7129 /* Common symbols less than the GP size are automatically
7130 treated as SHN_MIPS_SCOMMON symbols on IRIX5. */
7131 if (asym->value > elf_gp_size (abfd)
b59eed79 7132 || ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_TLS
b49e97c9
TS
7133 || IRIX_COMPAT (abfd) == ict_irix6)
7134 break;
7135 /* Fall through. */
7136 case SHN_MIPS_SCOMMON:
7137 if (mips_elf_scom_section.name == NULL)
7138 {
7139 /* Initialize the small common section. */
7140 mips_elf_scom_section.name = ".scommon";
7141 mips_elf_scom_section.flags = SEC_IS_COMMON;
7142 mips_elf_scom_section.output_section = &mips_elf_scom_section;
7143 mips_elf_scom_section.symbol = &mips_elf_scom_symbol;
7144 mips_elf_scom_section.symbol_ptr_ptr = &mips_elf_scom_symbol_ptr;
7145 mips_elf_scom_symbol.name = ".scommon";
7146 mips_elf_scom_symbol.flags = BSF_SECTION_SYM;
7147 mips_elf_scom_symbol.section = &mips_elf_scom_section;
7148 mips_elf_scom_symbol_ptr = &mips_elf_scom_symbol;
7149 }
7150 asym->section = &mips_elf_scom_section;
7151 asym->value = elfsym->internal_elf_sym.st_size;
7152 break;
7153
7154 case SHN_MIPS_SUNDEFINED:
7155 asym->section = bfd_und_section_ptr;
7156 break;
7157
b49e97c9 7158 case SHN_MIPS_TEXT:
00b4930b
TS
7159 {
7160 asection *section = bfd_get_section_by_name (abfd, ".text");
7161
00b4930b
TS
7162 if (section != NULL)
7163 {
7164 asym->section = section;
7165 /* MIPS_TEXT is a bit special, the address is not an offset
de194d85 7166 to the base of the .text section. So subtract the section
00b4930b
TS
7167 base address to make it an offset. */
7168 asym->value -= section->vma;
7169 }
7170 }
b49e97c9
TS
7171 break;
7172
7173 case SHN_MIPS_DATA:
00b4930b
TS
7174 {
7175 asection *section = bfd_get_section_by_name (abfd, ".data");
7176
00b4930b
TS
7177 if (section != NULL)
7178 {
7179 asym->section = section;
7180 /* MIPS_DATA is a bit special, the address is not an offset
de194d85 7181 to the base of the .data section. So subtract the section
00b4930b
TS
7182 base address to make it an offset. */
7183 asym->value -= section->vma;
7184 }
7185 }
b49e97c9 7186 break;
b49e97c9 7187 }
738e5348 7188
df58fc94
RS
7189 /* If this is an odd-valued function symbol, assume it's a MIPS16
7190 or microMIPS one. */
738e5348
RS
7191 if (ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_FUNC
7192 && (asym->value & 1) != 0)
7193 {
7194 asym->value--;
e8faf7d1 7195 if (MICROMIPS_P (abfd))
df58fc94
RS
7196 elfsym->internal_elf_sym.st_other
7197 = ELF_ST_SET_MICROMIPS (elfsym->internal_elf_sym.st_other);
7198 else
7199 elfsym->internal_elf_sym.st_other
7200 = ELF_ST_SET_MIPS16 (elfsym->internal_elf_sym.st_other);
738e5348 7201 }
b49e97c9
TS
7202}
7203\f
8c946ed5
RS
7204/* Implement elf_backend_eh_frame_address_size. This differs from
7205 the default in the way it handles EABI64.
7206
7207 EABI64 was originally specified as an LP64 ABI, and that is what
7208 -mabi=eabi normally gives on a 64-bit target. However, gcc has
7209 historically accepted the combination of -mabi=eabi and -mlong32,
7210 and this ILP32 variation has become semi-official over time.
7211 Both forms use elf32 and have pointer-sized FDE addresses.
7212
7213 If an EABI object was generated by GCC 4.0 or above, it will have
7214 an empty .gcc_compiled_longXX section, where XX is the size of longs
7215 in bits. Unfortunately, ILP32 objects generated by earlier compilers
7216 have no special marking to distinguish them from LP64 objects.
7217
7218 We don't want users of the official LP64 ABI to be punished for the
7219 existence of the ILP32 variant, but at the same time, we don't want
7220 to mistakenly interpret pre-4.0 ILP32 objects as being LP64 objects.
7221 We therefore take the following approach:
7222
7223 - If ABFD contains a .gcc_compiled_longXX section, use it to
07d6d2b8 7224 determine the pointer size.
8c946ed5
RS
7225
7226 - Otherwise check the type of the first relocation. Assume that
07d6d2b8 7227 the LP64 ABI is being used if the relocation is of type R_MIPS_64.
8c946ed5
RS
7228
7229 - Otherwise punt.
7230
7231 The second check is enough to detect LP64 objects generated by pre-4.0
7232 compilers because, in the kind of output generated by those compilers,
7233 the first relocation will be associated with either a CIE personality
7234 routine or an FDE start address. Furthermore, the compilers never
7235 used a special (non-pointer) encoding for this ABI.
7236
7237 Checking the relocation type should also be safe because there is no
7238 reason to use R_MIPS_64 in an ILP32 object. Pre-4.0 compilers never
7239 did so. */
7240
7241unsigned int
76c20d54 7242_bfd_mips_elf_eh_frame_address_size (bfd *abfd, const asection *sec)
8c946ed5
RS
7243{
7244 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
7245 return 8;
7246 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64)
7247 {
7248 bfd_boolean long32_p, long64_p;
7249
7250 long32_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long32") != 0;
7251 long64_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long64") != 0;
7252 if (long32_p && long64_p)
7253 return 0;
7254 if (long32_p)
7255 return 4;
7256 if (long64_p)
7257 return 8;
7258
7259 if (sec->reloc_count > 0
7260 && elf_section_data (sec)->relocs != NULL
7261 && (ELF32_R_TYPE (elf_section_data (sec)->relocs[0].r_info)
7262 == R_MIPS_64))
7263 return 8;
7264
7265 return 0;
7266 }
7267 return 4;
7268}
7269\f
174fd7f9
RS
7270/* There appears to be a bug in the MIPSpro linker that causes GOT_DISP
7271 relocations against two unnamed section symbols to resolve to the
7272 same address. For example, if we have code like:
7273
7274 lw $4,%got_disp(.data)($gp)
7275 lw $25,%got_disp(.text)($gp)
7276 jalr $25
7277
7278 then the linker will resolve both relocations to .data and the program
7279 will jump there rather than to .text.
7280
7281 We can work around this problem by giving names to local section symbols.
7282 This is also what the MIPSpro tools do. */
7283
7284bfd_boolean
7285_bfd_mips_elf_name_local_section_symbols (bfd *abfd)
7286{
7287 return SGI_COMPAT (abfd);
7288}
7289\f
b49e97c9
TS
7290/* Work over a section just before writing it out. This routine is
7291 used by both the 32-bit and the 64-bit ABI. FIXME: We recognize
7292 sections that need the SHF_MIPS_GPREL flag by name; there has to be
7293 a better way. */
7294
b34976b6 7295bfd_boolean
9719ad41 7296_bfd_mips_elf_section_processing (bfd *abfd, Elf_Internal_Shdr *hdr)
b49e97c9
TS
7297{
7298 if (hdr->sh_type == SHT_MIPS_REGINFO
7299 && hdr->sh_size > 0)
7300 {
7301 bfd_byte buf[4];
7302
b49e97c9
TS
7303 BFD_ASSERT (hdr->contents == NULL);
7304
2d6dda71
MR
7305 if (hdr->sh_size != sizeof (Elf32_External_RegInfo))
7306 {
7307 _bfd_error_handler
2c1c9679 7308 (_("%pB: incorrect `.reginfo' section size; "
2dcf00ce
AM
7309 "expected %" PRIu64 ", got %" PRIu64),
7310 abfd, (uint64_t) sizeof (Elf32_External_RegInfo),
7311 (uint64_t) hdr->sh_size);
2d6dda71
MR
7312 bfd_set_error (bfd_error_bad_value);
7313 return FALSE;
7314 }
7315
b49e97c9
TS
7316 if (bfd_seek (abfd,
7317 hdr->sh_offset + sizeof (Elf32_External_RegInfo) - 4,
7318 SEEK_SET) != 0)
b34976b6 7319 return FALSE;
b49e97c9 7320 H_PUT_32 (abfd, elf_gp (abfd), buf);
9719ad41 7321 if (bfd_bwrite (buf, 4, abfd) != 4)
b34976b6 7322 return FALSE;
b49e97c9
TS
7323 }
7324
7325 if (hdr->sh_type == SHT_MIPS_OPTIONS
7326 && hdr->bfd_section != NULL
f0abc2a1
AM
7327 && mips_elf_section_data (hdr->bfd_section) != NULL
7328 && mips_elf_section_data (hdr->bfd_section)->u.tdata != NULL)
b49e97c9
TS
7329 {
7330 bfd_byte *contents, *l, *lend;
7331
f0abc2a1
AM
7332 /* We stored the section contents in the tdata field in the
7333 set_section_contents routine. We save the section contents
7334 so that we don't have to read them again.
b49e97c9
TS
7335 At this point we know that elf_gp is set, so we can look
7336 through the section contents to see if there is an
7337 ODK_REGINFO structure. */
7338
f0abc2a1 7339 contents = mips_elf_section_data (hdr->bfd_section)->u.tdata;
b49e97c9
TS
7340 l = contents;
7341 lend = contents + hdr->sh_size;
7342 while (l + sizeof (Elf_External_Options) <= lend)
7343 {
7344 Elf_Internal_Options intopt;
7345
7346 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
7347 &intopt);
1bc8074d
MR
7348 if (intopt.size < sizeof (Elf_External_Options))
7349 {
4eca0228 7350 _bfd_error_handler
695344c0 7351 /* xgettext:c-format */
2c1c9679 7352 (_("%pB: warning: bad `%s' option size %u smaller than"
63a5468a 7353 " its header"),
1bc8074d
MR
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 bfd_byte buf[8];
7360
7361 if (bfd_seek (abfd,
7362 (hdr->sh_offset
7363 + (l - contents)
7364 + sizeof (Elf_External_Options)
7365 + (sizeof (Elf64_External_RegInfo) - 8)),
7366 SEEK_SET) != 0)
b34976b6 7367 return FALSE;
b49e97c9 7368 H_PUT_64 (abfd, elf_gp (abfd), buf);
9719ad41 7369 if (bfd_bwrite (buf, 8, abfd) != 8)
b34976b6 7370 return FALSE;
b49e97c9
TS
7371 }
7372 else if (intopt.kind == ODK_REGINFO)
7373 {
7374 bfd_byte buf[4];
7375
7376 if (bfd_seek (abfd,
7377 (hdr->sh_offset
7378 + (l - contents)
7379 + sizeof (Elf_External_Options)
7380 + (sizeof (Elf32_External_RegInfo) - 4)),
7381 SEEK_SET) != 0)
b34976b6 7382 return FALSE;
b49e97c9 7383 H_PUT_32 (abfd, elf_gp (abfd), buf);
9719ad41 7384 if (bfd_bwrite (buf, 4, abfd) != 4)
b34976b6 7385 return FALSE;
b49e97c9
TS
7386 }
7387 l += intopt.size;
7388 }
7389 }
7390
7391 if (hdr->bfd_section != NULL)
7392 {
fd361982 7393 const char *name = bfd_section_name (hdr->bfd_section);
b49e97c9 7394
2d0f9ad9
JM
7395 /* .sbss is not handled specially here because the GNU/Linux
7396 prelinker can convert .sbss from NOBITS to PROGBITS and
7397 changing it back to NOBITS breaks the binary. The entry in
7398 _bfd_mips_elf_special_sections will ensure the correct flags
7399 are set on .sbss if BFD creates it without reading it from an
7400 input file, and without special handling here the flags set
7401 on it in an input file will be followed. */
b49e97c9
TS
7402 if (strcmp (name, ".sdata") == 0
7403 || strcmp (name, ".lit8") == 0
7404 || strcmp (name, ".lit4") == 0)
fd6f9d17 7405 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
b49e97c9 7406 else if (strcmp (name, ".srdata") == 0)
fd6f9d17 7407 hdr->sh_flags |= SHF_ALLOC | SHF_MIPS_GPREL;
b49e97c9 7408 else if (strcmp (name, ".compact_rel") == 0)
fd6f9d17 7409 hdr->sh_flags = 0;
b49e97c9
TS
7410 else if (strcmp (name, ".rtproc") == 0)
7411 {
7412 if (hdr->sh_addralign != 0 && hdr->sh_entsize == 0)
7413 {
7414 unsigned int adjust;
7415
7416 adjust = hdr->sh_size % hdr->sh_addralign;
7417 if (adjust != 0)
7418 hdr->sh_size += hdr->sh_addralign - adjust;
7419 }
7420 }
7421 }
7422
b34976b6 7423 return TRUE;
b49e97c9
TS
7424}
7425
7426/* Handle a MIPS specific section when reading an object file. This
7427 is called when elfcode.h finds a section with an unknown type.
bf577467 7428 This routine supports both the 32-bit and 64-bit ELF ABI. */
b49e97c9 7429
b34976b6 7430bfd_boolean
6dc132d9
L
7431_bfd_mips_elf_section_from_shdr (bfd *abfd,
7432 Elf_Internal_Shdr *hdr,
7433 const char *name,
7434 int shindex)
b49e97c9
TS
7435{
7436 flagword flags = 0;
7437
7438 /* There ought to be a place to keep ELF backend specific flags, but
7439 at the moment there isn't one. We just keep track of the
7440 sections by their name, instead. Fortunately, the ABI gives
7441 suggested names for all the MIPS specific sections, so we will
7442 probably get away with this. */
7443 switch (hdr->sh_type)
7444 {
7445 case SHT_MIPS_LIBLIST:
7446 if (strcmp (name, ".liblist") != 0)
b34976b6 7447 return FALSE;
b49e97c9
TS
7448 break;
7449 case SHT_MIPS_MSYM:
7450 if (strcmp (name, ".msym") != 0)
b34976b6 7451 return FALSE;
b49e97c9
TS
7452 break;
7453 case SHT_MIPS_CONFLICT:
7454 if (strcmp (name, ".conflict") != 0)
b34976b6 7455 return FALSE;
b49e97c9
TS
7456 break;
7457 case SHT_MIPS_GPTAB:
0112cd26 7458 if (! CONST_STRNEQ (name, ".gptab."))
b34976b6 7459 return FALSE;
b49e97c9
TS
7460 break;
7461 case SHT_MIPS_UCODE:
7462 if (strcmp (name, ".ucode") != 0)
b34976b6 7463 return FALSE;
b49e97c9
TS
7464 break;
7465 case SHT_MIPS_DEBUG:
7466 if (strcmp (name, ".mdebug") != 0)
b34976b6 7467 return FALSE;
b49e97c9
TS
7468 flags = SEC_DEBUGGING;
7469 break;
7470 case SHT_MIPS_REGINFO:
7471 if (strcmp (name, ".reginfo") != 0
7472 || hdr->sh_size != sizeof (Elf32_External_RegInfo))
b34976b6 7473 return FALSE;
b49e97c9
TS
7474 flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
7475 break;
7476 case SHT_MIPS_IFACE:
7477 if (strcmp (name, ".MIPS.interfaces") != 0)
b34976b6 7478 return FALSE;
b49e97c9
TS
7479 break;
7480 case SHT_MIPS_CONTENT:
0112cd26 7481 if (! CONST_STRNEQ (name, ".MIPS.content"))
b34976b6 7482 return FALSE;
b49e97c9
TS
7483 break;
7484 case SHT_MIPS_OPTIONS:
cc2e31b9 7485 if (!MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
b34976b6 7486 return FALSE;
b49e97c9 7487 break;
351cdf24
MF
7488 case SHT_MIPS_ABIFLAGS:
7489 if (!MIPS_ELF_ABIFLAGS_SECTION_NAME_P (name))
7490 return FALSE;
7491 flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
7492 break;
b49e97c9 7493 case SHT_MIPS_DWARF:
1b315056 7494 if (! CONST_STRNEQ (name, ".debug_")
07d6d2b8 7495 && ! CONST_STRNEQ (name, ".zdebug_"))
b34976b6 7496 return FALSE;
b49e97c9
TS
7497 break;
7498 case SHT_MIPS_SYMBOL_LIB:
7499 if (strcmp (name, ".MIPS.symlib") != 0)
b34976b6 7500 return FALSE;
b49e97c9
TS
7501 break;
7502 case SHT_MIPS_EVENTS:
0112cd26
NC
7503 if (! CONST_STRNEQ (name, ".MIPS.events")
7504 && ! CONST_STRNEQ (name, ".MIPS.post_rel"))
b34976b6 7505 return FALSE;
b49e97c9 7506 break;
f16a9783
MS
7507 case SHT_MIPS_XHASH:
7508 if (strcmp (name, ".MIPS.xhash") != 0)
7509 return FALSE;
b49e97c9 7510 default:
cc2e31b9 7511 break;
b49e97c9
TS
7512 }
7513
6dc132d9 7514 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
b34976b6 7515 return FALSE;
b49e97c9 7516
bf577467
AM
7517 if (hdr->sh_flags & SHF_MIPS_GPREL)
7518 flags |= SEC_SMALL_DATA;
7519
b49e97c9
TS
7520 if (flags)
7521 {
fd361982
AM
7522 if (!bfd_set_section_flags (hdr->bfd_section,
7523 (bfd_section_flags (hdr->bfd_section)
7524 | flags)))
b34976b6 7525 return FALSE;
b49e97c9
TS
7526 }
7527
351cdf24
MF
7528 if (hdr->sh_type == SHT_MIPS_ABIFLAGS)
7529 {
7530 Elf_External_ABIFlags_v0 ext;
7531
7532 if (! bfd_get_section_contents (abfd, hdr->bfd_section,
7533 &ext, 0, sizeof ext))
7534 return FALSE;
7535 bfd_mips_elf_swap_abiflags_v0_in (abfd, &ext,
7536 &mips_elf_tdata (abfd)->abiflags);
7537 if (mips_elf_tdata (abfd)->abiflags.version != 0)
7538 return FALSE;
7539 mips_elf_tdata (abfd)->abiflags_valid = TRUE;
7540 }
7541
b49e97c9
TS
7542 /* FIXME: We should record sh_info for a .gptab section. */
7543
7544 /* For a .reginfo section, set the gp value in the tdata information
7545 from the contents of this section. We need the gp value while
7546 processing relocs, so we just get it now. The .reginfo section
7547 is not used in the 64-bit MIPS ELF ABI. */
7548 if (hdr->sh_type == SHT_MIPS_REGINFO)
7549 {
7550 Elf32_External_RegInfo ext;
7551 Elf32_RegInfo s;
7552
9719ad41
RS
7553 if (! bfd_get_section_contents (abfd, hdr->bfd_section,
7554 &ext, 0, sizeof ext))
b34976b6 7555 return FALSE;
b49e97c9
TS
7556 bfd_mips_elf32_swap_reginfo_in (abfd, &ext, &s);
7557 elf_gp (abfd) = s.ri_gp_value;
7558 }
7559
7560 /* For a SHT_MIPS_OPTIONS section, look for a ODK_REGINFO entry, and
7561 set the gp value based on what we find. We may see both
7562 SHT_MIPS_REGINFO and SHT_MIPS_OPTIONS/ODK_REGINFO; in that case,
7563 they should agree. */
7564 if (hdr->sh_type == SHT_MIPS_OPTIONS)
7565 {
7566 bfd_byte *contents, *l, *lend;
7567
9719ad41 7568 contents = bfd_malloc (hdr->sh_size);
b49e97c9 7569 if (contents == NULL)
b34976b6 7570 return FALSE;
b49e97c9 7571 if (! bfd_get_section_contents (abfd, hdr->bfd_section, contents,
9719ad41 7572 0, hdr->sh_size))
b49e97c9
TS
7573 {
7574 free (contents);
b34976b6 7575 return FALSE;
b49e97c9
TS
7576 }
7577 l = contents;
7578 lend = contents + hdr->sh_size;
7579 while (l + sizeof (Elf_External_Options) <= lend)
7580 {
7581 Elf_Internal_Options intopt;
7582
7583 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
7584 &intopt);
1bc8074d
MR
7585 if (intopt.size < sizeof (Elf_External_Options))
7586 {
4eca0228 7587 _bfd_error_handler
695344c0 7588 /* xgettext:c-format */
2c1c9679 7589 (_("%pB: warning: bad `%s' option size %u smaller than"
63a5468a 7590 " its header"),
1bc8074d
MR
7591 abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd), intopt.size);
7592 break;
7593 }
b49e97c9
TS
7594 if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
7595 {
7596 Elf64_Internal_RegInfo intreg;
7597
7598 bfd_mips_elf64_swap_reginfo_in
7599 (abfd,
7600 ((Elf64_External_RegInfo *)
7601 (l + sizeof (Elf_External_Options))),
7602 &intreg);
7603 elf_gp (abfd) = intreg.ri_gp_value;
7604 }
7605 else if (intopt.kind == ODK_REGINFO)
7606 {
7607 Elf32_RegInfo intreg;
7608
7609 bfd_mips_elf32_swap_reginfo_in
7610 (abfd,
7611 ((Elf32_External_RegInfo *)
7612 (l + sizeof (Elf_External_Options))),
7613 &intreg);
7614 elf_gp (abfd) = intreg.ri_gp_value;
7615 }
7616 l += intopt.size;
7617 }
7618 free (contents);
7619 }
7620
b34976b6 7621 return TRUE;
b49e97c9
TS
7622}
7623
7624/* Set the correct type for a MIPS ELF section. We do this by the
7625 section name, which is a hack, but ought to work. This routine is
7626 used by both the 32-bit and the 64-bit ABI. */
7627
b34976b6 7628bfd_boolean
9719ad41 7629_bfd_mips_elf_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
b49e97c9 7630{
fd361982 7631 const char *name = bfd_section_name (sec);
b49e97c9
TS
7632
7633 if (strcmp (name, ".liblist") == 0)
7634 {
7635 hdr->sh_type = SHT_MIPS_LIBLIST;
eea6121a 7636 hdr->sh_info = sec->size / sizeof (Elf32_Lib);
b49e97c9
TS
7637 /* The sh_link field is set in final_write_processing. */
7638 }
7639 else if (strcmp (name, ".conflict") == 0)
7640 hdr->sh_type = SHT_MIPS_CONFLICT;
0112cd26 7641 else if (CONST_STRNEQ (name, ".gptab."))
b49e97c9
TS
7642 {
7643 hdr->sh_type = SHT_MIPS_GPTAB;
7644 hdr->sh_entsize = sizeof (Elf32_External_gptab);
7645 /* The sh_info field is set in final_write_processing. */
7646 }
7647 else if (strcmp (name, ".ucode") == 0)
7648 hdr->sh_type = SHT_MIPS_UCODE;
7649 else if (strcmp (name, ".mdebug") == 0)
7650 {
7651 hdr->sh_type = SHT_MIPS_DEBUG;
8dc1a139 7652 /* In a shared object on IRIX 5.3, the .mdebug section has an
07d6d2b8 7653 entsize of 0. FIXME: Does this matter? */
b49e97c9
TS
7654 if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0)
7655 hdr->sh_entsize = 0;
7656 else
7657 hdr->sh_entsize = 1;
7658 }
7659 else if (strcmp (name, ".reginfo") == 0)
7660 {
7661 hdr->sh_type = SHT_MIPS_REGINFO;
8dc1a139 7662 /* In a shared object on IRIX 5.3, the .reginfo section has an
07d6d2b8 7663 entsize of 0x18. FIXME: Does this matter? */
b49e97c9
TS
7664 if (SGI_COMPAT (abfd))
7665 {
7666 if ((abfd->flags & DYNAMIC) != 0)
7667 hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
7668 else
7669 hdr->sh_entsize = 1;
7670 }
7671 else
7672 hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
7673 }
7674 else if (SGI_COMPAT (abfd)
7675 && (strcmp (name, ".hash") == 0
7676 || strcmp (name, ".dynamic") == 0
7677 || strcmp (name, ".dynstr") == 0))
7678 {
7679 if (SGI_COMPAT (abfd))
7680 hdr->sh_entsize = 0;
7681#if 0
8dc1a139 7682 /* This isn't how the IRIX6 linker behaves. */
b49e97c9
TS
7683 hdr->sh_info = SIZEOF_MIPS_DYNSYM_SECNAMES;
7684#endif
7685 }
7686 else if (strcmp (name, ".got") == 0
7687 || strcmp (name, ".srdata") == 0
7688 || strcmp (name, ".sdata") == 0
7689 || strcmp (name, ".sbss") == 0
7690 || strcmp (name, ".lit4") == 0
7691 || strcmp (name, ".lit8") == 0)
7692 hdr->sh_flags |= SHF_MIPS_GPREL;
7693 else if (strcmp (name, ".MIPS.interfaces") == 0)
7694 {
7695 hdr->sh_type = SHT_MIPS_IFACE;
7696 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7697 }
0112cd26 7698 else if (CONST_STRNEQ (name, ".MIPS.content"))
b49e97c9
TS
7699 {
7700 hdr->sh_type = SHT_MIPS_CONTENT;
7701 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7702 /* The sh_info field is set in final_write_processing. */
7703 }
cc2e31b9 7704 else if (MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
b49e97c9
TS
7705 {
7706 hdr->sh_type = SHT_MIPS_OPTIONS;
7707 hdr->sh_entsize = 1;
7708 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7709 }
351cdf24
MF
7710 else if (CONST_STRNEQ (name, ".MIPS.abiflags"))
7711 {
7712 hdr->sh_type = SHT_MIPS_ABIFLAGS;
7713 hdr->sh_entsize = sizeof (Elf_External_ABIFlags_v0);
7714 }
1b315056 7715 else if (CONST_STRNEQ (name, ".debug_")
07d6d2b8 7716 || CONST_STRNEQ (name, ".zdebug_"))
b5482f21
NC
7717 {
7718 hdr->sh_type = SHT_MIPS_DWARF;
7719
7720 /* Irix facilities such as libexc expect a single .debug_frame
7721 per executable, the system ones have NOSTRIP set and the linker
7722 doesn't merge sections with different flags so ... */
7723 if (SGI_COMPAT (abfd) && CONST_STRNEQ (name, ".debug_frame"))
7724 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7725 }
b49e97c9
TS
7726 else if (strcmp (name, ".MIPS.symlib") == 0)
7727 {
7728 hdr->sh_type = SHT_MIPS_SYMBOL_LIB;
7729 /* The sh_link and sh_info fields are set in
07d6d2b8 7730 final_write_processing. */
b49e97c9 7731 }
0112cd26
NC
7732 else if (CONST_STRNEQ (name, ".MIPS.events")
7733 || CONST_STRNEQ (name, ".MIPS.post_rel"))
b49e97c9
TS
7734 {
7735 hdr->sh_type = SHT_MIPS_EVENTS;
7736 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7737 /* The sh_link field is set in final_write_processing. */
7738 }
7739 else if (strcmp (name, ".msym") == 0)
7740 {
7741 hdr->sh_type = SHT_MIPS_MSYM;
7742 hdr->sh_flags |= SHF_ALLOC;
7743 hdr->sh_entsize = 8;
7744 }
f16a9783
MS
7745 else if (strcmp (name, ".MIPS.xhash") == 0)
7746 {
7747 hdr->sh_type = SHT_MIPS_XHASH;
7748 hdr->sh_flags |= SHF_ALLOC;
7749 hdr->sh_entsize = get_elf_backend_data(abfd)->s->arch_size == 64 ? 0 : 4;
7750 }
b49e97c9 7751
7a79a000
TS
7752 /* The generic elf_fake_sections will set up REL_HDR using the default
7753 kind of relocations. We used to set up a second header for the
7754 non-default kind of relocations here, but only NewABI would use
7755 these, and the IRIX ld doesn't like resulting empty RELA sections.
7756 Thus we create those header only on demand now. */
b49e97c9 7757
b34976b6 7758 return TRUE;
b49e97c9
TS
7759}
7760
7761/* Given a BFD section, try to locate the corresponding ELF section
7762 index. This is used by both the 32-bit and the 64-bit ABI.
7763 Actually, it's not clear to me that the 64-bit ABI supports these,
7764 but for non-PIC objects we will certainly want support for at least
7765 the .scommon section. */
7766
b34976b6 7767bfd_boolean
9719ad41
RS
7768_bfd_mips_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
7769 asection *sec, int *retval)
b49e97c9 7770{
fd361982 7771 if (strcmp (bfd_section_name (sec), ".scommon") == 0)
b49e97c9
TS
7772 {
7773 *retval = SHN_MIPS_SCOMMON;
b34976b6 7774 return TRUE;
b49e97c9 7775 }
fd361982 7776 if (strcmp (bfd_section_name (sec), ".acommon") == 0)
b49e97c9
TS
7777 {
7778 *retval = SHN_MIPS_ACOMMON;
b34976b6 7779 return TRUE;
b49e97c9 7780 }
b34976b6 7781 return FALSE;
b49e97c9
TS
7782}
7783\f
7784/* Hook called by the linker routine which adds symbols from an object
7785 file. We must handle the special MIPS section numbers here. */
7786
b34976b6 7787bfd_boolean
9719ad41 7788_bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
555cd476 7789 Elf_Internal_Sym *sym, const char **namep,
9719ad41
RS
7790 flagword *flagsp ATTRIBUTE_UNUSED,
7791 asection **secp, bfd_vma *valp)
b49e97c9
TS
7792{
7793 if (SGI_COMPAT (abfd)
7794 && (abfd->flags & DYNAMIC) != 0
7795 && strcmp (*namep, "_rld_new_interface") == 0)
7796 {
8dc1a139 7797 /* Skip IRIX5 rld entry name. */
b49e97c9 7798 *namep = NULL;
b34976b6 7799 return TRUE;
b49e97c9
TS
7800 }
7801
eedecc07
DD
7802 /* Shared objects may have a dynamic symbol '_gp_disp' defined as
7803 a SECTION *ABS*. This causes ld to think it can resolve _gp_disp
7804 by setting a DT_NEEDED for the shared object. Since _gp_disp is
7805 a magic symbol resolved by the linker, we ignore this bogus definition
7806 of _gp_disp. New ABI objects do not suffer from this problem so this
7807 is not done for them. */
7808 if (!NEWABI_P(abfd)
7809 && (sym->st_shndx == SHN_ABS)
7810 && (strcmp (*namep, "_gp_disp") == 0))
7811 {
7812 *namep = NULL;
7813 return TRUE;
7814 }
7815
b49e97c9
TS
7816 switch (sym->st_shndx)
7817 {
7818 case SHN_COMMON:
7819 /* Common symbols less than the GP size are automatically
7820 treated as SHN_MIPS_SCOMMON symbols. */
7821 if (sym->st_size > elf_gp_size (abfd)
b59eed79 7822 || ELF_ST_TYPE (sym->st_info) == STT_TLS
b49e97c9
TS
7823 || IRIX_COMPAT (abfd) == ict_irix6)
7824 break;
7825 /* Fall through. */
7826 case SHN_MIPS_SCOMMON:
7827 *secp = bfd_make_section_old_way (abfd, ".scommon");
7828 (*secp)->flags |= SEC_IS_COMMON;
7829 *valp = sym->st_size;
7830 break;
7831
7832 case SHN_MIPS_TEXT:
7833 /* This section is used in a shared object. */
698600e4 7834 if (mips_elf_tdata (abfd)->elf_text_section == NULL)
b49e97c9
TS
7835 {
7836 asymbol *elf_text_symbol;
7837 asection *elf_text_section;
986f0783 7838 size_t amt = sizeof (asection);
b49e97c9
TS
7839
7840 elf_text_section = bfd_zalloc (abfd, amt);
7841 if (elf_text_section == NULL)
b34976b6 7842 return FALSE;
b49e97c9
TS
7843
7844 amt = sizeof (asymbol);
7845 elf_text_symbol = bfd_zalloc (abfd, amt);
7846 if (elf_text_symbol == NULL)
b34976b6 7847 return FALSE;
b49e97c9
TS
7848
7849 /* Initialize the section. */
7850
698600e4
AM
7851 mips_elf_tdata (abfd)->elf_text_section = elf_text_section;
7852 mips_elf_tdata (abfd)->elf_text_symbol = elf_text_symbol;
b49e97c9
TS
7853
7854 elf_text_section->symbol = elf_text_symbol;
698600e4 7855 elf_text_section->symbol_ptr_ptr = &mips_elf_tdata (abfd)->elf_text_symbol;
b49e97c9
TS
7856
7857 elf_text_section->name = ".text";
7858 elf_text_section->flags = SEC_NO_FLAGS;
7859 elf_text_section->output_section = NULL;
7860 elf_text_section->owner = abfd;
7861 elf_text_symbol->name = ".text";
7862 elf_text_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
7863 elf_text_symbol->section = elf_text_section;
7864 }
7865 /* This code used to do *secp = bfd_und_section_ptr if
07d6d2b8
AM
7866 bfd_link_pic (info). I don't know why, and that doesn't make sense,
7867 so I took it out. */
698600e4 7868 *secp = mips_elf_tdata (abfd)->elf_text_section;
b49e97c9
TS
7869 break;
7870
7871 case SHN_MIPS_ACOMMON:
7872 /* Fall through. XXX Can we treat this as allocated data? */
7873 case SHN_MIPS_DATA:
7874 /* This section is used in a shared object. */
698600e4 7875 if (mips_elf_tdata (abfd)->elf_data_section == NULL)
b49e97c9
TS
7876 {
7877 asymbol *elf_data_symbol;
7878 asection *elf_data_section;
986f0783 7879 size_t amt = sizeof (asection);
b49e97c9
TS
7880
7881 elf_data_section = bfd_zalloc (abfd, amt);
7882 if (elf_data_section == NULL)
b34976b6 7883 return FALSE;
b49e97c9
TS
7884
7885 amt = sizeof (asymbol);
7886 elf_data_symbol = bfd_zalloc (abfd, amt);
7887 if (elf_data_symbol == NULL)
b34976b6 7888 return FALSE;
b49e97c9
TS
7889
7890 /* Initialize the section. */
7891
698600e4
AM
7892 mips_elf_tdata (abfd)->elf_data_section = elf_data_section;
7893 mips_elf_tdata (abfd)->elf_data_symbol = elf_data_symbol;
b49e97c9
TS
7894
7895 elf_data_section->symbol = elf_data_symbol;
698600e4 7896 elf_data_section->symbol_ptr_ptr = &mips_elf_tdata (abfd)->elf_data_symbol;
b49e97c9
TS
7897
7898 elf_data_section->name = ".data";
7899 elf_data_section->flags = SEC_NO_FLAGS;
7900 elf_data_section->output_section = NULL;
7901 elf_data_section->owner = abfd;
7902 elf_data_symbol->name = ".data";
7903 elf_data_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
7904 elf_data_symbol->section = elf_data_section;
7905 }
7906 /* This code used to do *secp = bfd_und_section_ptr if
07d6d2b8
AM
7907 bfd_link_pic (info). I don't know why, and that doesn't make sense,
7908 so I took it out. */
698600e4 7909 *secp = mips_elf_tdata (abfd)->elf_data_section;
b49e97c9
TS
7910 break;
7911
7912 case SHN_MIPS_SUNDEFINED:
7913 *secp = bfd_und_section_ptr;
7914 break;
7915 }
7916
7917 if (SGI_COMPAT (abfd)
0e1862bb 7918 && ! bfd_link_pic (info)
f13a99db 7919 && info->output_bfd->xvec == abfd->xvec
b49e97c9
TS
7920 && strcmp (*namep, "__rld_obj_head") == 0)
7921 {
7922 struct elf_link_hash_entry *h;
14a793b2 7923 struct bfd_link_hash_entry *bh;
b49e97c9
TS
7924
7925 /* Mark __rld_obj_head as dynamic. */
14a793b2 7926 bh = NULL;
b49e97c9 7927 if (! (_bfd_generic_link_add_one_symbol
9719ad41 7928 (info, abfd, *namep, BSF_GLOBAL, *secp, *valp, NULL, FALSE,
14a793b2 7929 get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 7930 return FALSE;
14a793b2
AM
7931
7932 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
7933 h->non_elf = 0;
7934 h->def_regular = 1;
b49e97c9
TS
7935 h->type = STT_OBJECT;
7936
c152c796 7937 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 7938 return FALSE;
b49e97c9 7939
b34976b6 7940 mips_elf_hash_table (info)->use_rld_obj_head = TRUE;
b4082c70 7941 mips_elf_hash_table (info)->rld_symbol = h;
b49e97c9
TS
7942 }
7943
7944 /* If this is a mips16 text symbol, add 1 to the value to make it
7945 odd. This will cause something like .word SYM to come up with
7946 the right value when it is loaded into the PC. */
df58fc94 7947 if (ELF_ST_IS_COMPRESSED (sym->st_other))
b49e97c9
TS
7948 ++*valp;
7949
b34976b6 7950 return TRUE;
b49e97c9
TS
7951}
7952
7953/* This hook function is called before the linker writes out a global
7954 symbol. We mark symbols as small common if appropriate. This is
7955 also where we undo the increment of the value for a mips16 symbol. */
7956
6e0b88f1 7957int
9719ad41
RS
7958_bfd_mips_elf_link_output_symbol_hook
7959 (struct bfd_link_info *info ATTRIBUTE_UNUSED,
7960 const char *name ATTRIBUTE_UNUSED, Elf_Internal_Sym *sym,
7961 asection *input_sec, struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
b49e97c9
TS
7962{
7963 /* If we see a common symbol, which implies a relocatable link, then
7964 if a symbol was small common in an input file, mark it as small
7965 common in the output file. */
7966 if (sym->st_shndx == SHN_COMMON
7967 && strcmp (input_sec->name, ".scommon") == 0)
7968 sym->st_shndx = SHN_MIPS_SCOMMON;
7969
df58fc94 7970 if (ELF_ST_IS_COMPRESSED (sym->st_other))
79cda7cf 7971 sym->st_value &= ~1;
b49e97c9 7972
6e0b88f1 7973 return 1;
b49e97c9
TS
7974}
7975\f
7976/* Functions for the dynamic linker. */
7977
7978/* Create dynamic sections when linking against a dynamic object. */
7979
b34976b6 7980bfd_boolean
9719ad41 7981_bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
b49e97c9
TS
7982{
7983 struct elf_link_hash_entry *h;
14a793b2 7984 struct bfd_link_hash_entry *bh;
b49e97c9
TS
7985 flagword flags;
7986 register asection *s;
7987 const char * const *namep;
0a44bf69 7988 struct mips_elf_link_hash_table *htab;
b49e97c9 7989
0a44bf69 7990 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
7991 BFD_ASSERT (htab != NULL);
7992
b49e97c9
TS
7993 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
7994 | SEC_LINKER_CREATED | SEC_READONLY);
7995
0a44bf69
RS
7996 /* The psABI requires a read-only .dynamic section, but the VxWorks
7997 EABI doesn't. */
7998 if (!htab->is_vxworks)
b49e97c9 7999 {
3d4d4302 8000 s = bfd_get_linker_section (abfd, ".dynamic");
0a44bf69
RS
8001 if (s != NULL)
8002 {
fd361982 8003 if (!bfd_set_section_flags (s, flags))
0a44bf69
RS
8004 return FALSE;
8005 }
b49e97c9
TS
8006 }
8007
8008 /* We need to create .got section. */
23cc69b6 8009 if (!mips_elf_create_got_section (abfd, info))
f4416af6
AO
8010 return FALSE;
8011
0a44bf69 8012 if (! mips_elf_rel_dyn_section (info, TRUE))
b34976b6 8013 return FALSE;
b49e97c9 8014
b49e97c9 8015 /* Create .stub section. */
3d4d4302
AM
8016 s = bfd_make_section_anyway_with_flags (abfd,
8017 MIPS_ELF_STUB_SECTION_NAME (abfd),
8018 flags | SEC_CODE);
4e41d0d7 8019 if (s == NULL
fd361982 8020 || !bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd)))
4e41d0d7
RS
8021 return FALSE;
8022 htab->sstubs = s;
b49e97c9 8023
e6aea42d 8024 if (!mips_elf_hash_table (info)->use_rld_obj_head
0e1862bb 8025 && bfd_link_executable (info)
3d4d4302 8026 && bfd_get_linker_section (abfd, ".rld_map") == NULL)
b49e97c9 8027 {
3d4d4302
AM
8028 s = bfd_make_section_anyway_with_flags (abfd, ".rld_map",
8029 flags &~ (flagword) SEC_READONLY);
b49e97c9 8030 if (s == NULL
fd361982 8031 || !bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd)))
b34976b6 8032 return FALSE;
b49e97c9
TS
8033 }
8034
f16a9783
MS
8035 /* Create .MIPS.xhash section. */
8036 if (info->emit_gnu_hash)
8037 s = bfd_make_section_anyway_with_flags (abfd, ".MIPS.xhash",
8038 flags | SEC_READONLY);
8039
b49e97c9
TS
8040 /* On IRIX5, we adjust add some additional symbols and change the
8041 alignments of several sections. There is no ABI documentation
8042 indicating that this is necessary on IRIX6, nor any evidence that
8043 the linker takes such action. */
8044 if (IRIX_COMPAT (abfd) == ict_irix5)
8045 {
8046 for (namep = mips_elf_dynsym_rtproc_names; *namep != NULL; namep++)
8047 {
14a793b2 8048 bh = NULL;
b49e97c9 8049 if (! (_bfd_generic_link_add_one_symbol
9719ad41
RS
8050 (info, abfd, *namep, BSF_GLOBAL, bfd_und_section_ptr, 0,
8051 NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 8052 return FALSE;
14a793b2
AM
8053
8054 h = (struct elf_link_hash_entry *) bh;
12f09816 8055 h->mark = 1;
f5385ebf
AM
8056 h->non_elf = 0;
8057 h->def_regular = 1;
b49e97c9
TS
8058 h->type = STT_SECTION;
8059
c152c796 8060 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 8061 return FALSE;
b49e97c9
TS
8062 }
8063
8064 /* We need to create a .compact_rel section. */
8065 if (SGI_COMPAT (abfd))
8066 {
8067 if (!mips_elf_create_compact_rel_section (abfd, info))
b34976b6 8068 return FALSE;
b49e97c9
TS
8069 }
8070
44c410de 8071 /* Change alignments of some sections. */
3d4d4302 8072 s = bfd_get_linker_section (abfd, ".hash");
b49e97c9 8073 if (s != NULL)
fd361982 8074 bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
a253d456 8075
3d4d4302 8076 s = bfd_get_linker_section (abfd, ".dynsym");
b49e97c9 8077 if (s != NULL)
fd361982 8078 bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
a253d456 8079
3d4d4302 8080 s = bfd_get_linker_section (abfd, ".dynstr");
b49e97c9 8081 if (s != NULL)
fd361982 8082 bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
a253d456 8083
3d4d4302 8084 /* ??? */
b49e97c9
TS
8085 s = bfd_get_section_by_name (abfd, ".reginfo");
8086 if (s != NULL)
fd361982 8087 bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
a253d456 8088
3d4d4302 8089 s = bfd_get_linker_section (abfd, ".dynamic");
b49e97c9 8090 if (s != NULL)
fd361982 8091 bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
b49e97c9
TS
8092 }
8093
0e1862bb 8094 if (bfd_link_executable (info))
b49e97c9 8095 {
14a793b2
AM
8096 const char *name;
8097
8098 name = SGI_COMPAT (abfd) ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING";
8099 bh = NULL;
8100 if (!(_bfd_generic_link_add_one_symbol
9719ad41
RS
8101 (info, abfd, name, BSF_GLOBAL, bfd_abs_section_ptr, 0,
8102 NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 8103 return FALSE;
14a793b2
AM
8104
8105 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
8106 h->non_elf = 0;
8107 h->def_regular = 1;
b49e97c9
TS
8108 h->type = STT_SECTION;
8109
c152c796 8110 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 8111 return FALSE;
b49e97c9
TS
8112
8113 if (! mips_elf_hash_table (info)->use_rld_obj_head)
8114 {
8115 /* __rld_map is a four byte word located in the .data section
8116 and is filled in by the rtld to contain a pointer to
8117 the _r_debug structure. Its symbol value will be set in
8118 _bfd_mips_elf_finish_dynamic_symbol. */
3d4d4302 8119 s = bfd_get_linker_section (abfd, ".rld_map");
0abfb97a 8120 BFD_ASSERT (s != NULL);
14a793b2 8121
0abfb97a
L
8122 name = SGI_COMPAT (abfd) ? "__rld_map" : "__RLD_MAP";
8123 bh = NULL;
8124 if (!(_bfd_generic_link_add_one_symbol
8125 (info, abfd, name, BSF_GLOBAL, s, 0, NULL, FALSE,
8126 get_elf_backend_data (abfd)->collect, &bh)))
8127 return FALSE;
b49e97c9 8128
0abfb97a
L
8129 h = (struct elf_link_hash_entry *) bh;
8130 h->non_elf = 0;
8131 h->def_regular = 1;
8132 h->type = STT_OBJECT;
8133
8134 if (! bfd_elf_link_record_dynamic_symbol (info, h))
8135 return FALSE;
b4082c70 8136 mips_elf_hash_table (info)->rld_symbol = h;
b49e97c9
TS
8137 }
8138 }
8139
861fb55a 8140 /* Create the .plt, .rel(a).plt, .dynbss and .rel(a).bss sections.
c164a95d 8141 Also, on VxWorks, create the _PROCEDURE_LINKAGE_TABLE_ symbol. */
861fb55a
DJ
8142 if (!_bfd_elf_create_dynamic_sections (abfd, info))
8143 return FALSE;
8144
1bbce132
MR
8145 /* Do the usual VxWorks handling. */
8146 if (htab->is_vxworks
8147 && !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
8148 return FALSE;
0a44bf69 8149
b34976b6 8150 return TRUE;
b49e97c9
TS
8151}
8152\f
c224138d
RS
8153/* Return true if relocation REL against section SEC is a REL rather than
8154 RELA relocation. RELOCS is the first relocation in the section and
8155 ABFD is the bfd that contains SEC. */
8156
8157static bfd_boolean
8158mips_elf_rel_relocation_p (bfd *abfd, asection *sec,
8159 const Elf_Internal_Rela *relocs,
8160 const Elf_Internal_Rela *rel)
8161{
8162 Elf_Internal_Shdr *rel_hdr;
8163 const struct elf_backend_data *bed;
8164
d4730f92
BS
8165 /* To determine which flavor of relocation this is, we depend on the
8166 fact that the INPUT_SECTION's REL_HDR is read before RELA_HDR. */
8167 rel_hdr = elf_section_data (sec)->rel.hdr;
8168 if (rel_hdr == NULL)
8169 return FALSE;
c224138d 8170 bed = get_elf_backend_data (abfd);
d4730f92
BS
8171 return ((size_t) (rel - relocs)
8172 < NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel);
c224138d
RS
8173}
8174
8175/* Read the addend for REL relocation REL, which belongs to bfd ABFD.
8176 HOWTO is the relocation's howto and CONTENTS points to the contents
8177 of the section that REL is against. */
8178
8179static bfd_vma
8180mips_elf_read_rel_addend (bfd *abfd, const Elf_Internal_Rela *rel,
8181 reloc_howto_type *howto, bfd_byte *contents)
8182{
8183 bfd_byte *location;
8184 unsigned int r_type;
8185 bfd_vma addend;
17c6c9d9 8186 bfd_vma bytes;
c224138d
RS
8187
8188 r_type = ELF_R_TYPE (abfd, rel->r_info);
8189 location = contents + rel->r_offset;
8190
8191 /* Get the addend, which is stored in the input file. */
df58fc94 8192 _bfd_mips_elf_reloc_unshuffle (abfd, r_type, FALSE, location);
17c6c9d9 8193 bytes = mips_elf_obtain_contents (howto, rel, abfd, contents);
df58fc94 8194 _bfd_mips_elf_reloc_shuffle (abfd, r_type, FALSE, location);
c224138d 8195
17c6c9d9
MR
8196 addend = bytes & howto->src_mask;
8197
8198 /* Shift is 2, unusually, for microMIPS JALX. Adjust the addend
8199 accordingly. */
8200 if (r_type == R_MICROMIPS_26_S1 && (bytes >> 26) == 0x3c)
8201 addend <<= 1;
8202
8203 return addend;
c224138d
RS
8204}
8205
8206/* REL is a relocation in ABFD that needs a partnering LO16 relocation
8207 and *ADDEND is the addend for REL itself. Look for the LO16 relocation
8208 and update *ADDEND with the final addend. Return true on success
8209 or false if the LO16 could not be found. RELEND is the exclusive
8210 upper bound on the relocations for REL's section. */
8211
8212static bfd_boolean
8213mips_elf_add_lo16_rel_addend (bfd *abfd,
8214 const Elf_Internal_Rela *rel,
8215 const Elf_Internal_Rela *relend,
8216 bfd_byte *contents, bfd_vma *addend)
8217{
8218 unsigned int r_type, lo16_type;
8219 const Elf_Internal_Rela *lo16_relocation;
8220 reloc_howto_type *lo16_howto;
8221 bfd_vma l;
8222
8223 r_type = ELF_R_TYPE (abfd, rel->r_info);
738e5348 8224 if (mips16_reloc_p (r_type))
c224138d 8225 lo16_type = R_MIPS16_LO16;
df58fc94
RS
8226 else if (micromips_reloc_p (r_type))
8227 lo16_type = R_MICROMIPS_LO16;
7361da2c
AB
8228 else if (r_type == R_MIPS_PCHI16)
8229 lo16_type = R_MIPS_PCLO16;
c224138d
RS
8230 else
8231 lo16_type = R_MIPS_LO16;
8232
8233 /* The combined value is the sum of the HI16 addend, left-shifted by
8234 sixteen bits, and the LO16 addend, sign extended. (Usually, the
8235 code does a `lui' of the HI16 value, and then an `addiu' of the
8236 LO16 value.)
8237
8238 Scan ahead to find a matching LO16 relocation.
8239
8240 According to the MIPS ELF ABI, the R_MIPS_LO16 relocation must
8241 be immediately following. However, for the IRIX6 ABI, the next
8242 relocation may be a composed relocation consisting of several
8243 relocations for the same address. In that case, the R_MIPS_LO16
8244 relocation may occur as one of these. We permit a similar
8245 extension in general, as that is useful for GCC.
8246
8247 In some cases GCC dead code elimination removes the LO16 but keeps
8248 the corresponding HI16. This is strictly speaking a violation of
8249 the ABI but not immediately harmful. */
8250 lo16_relocation = mips_elf_next_relocation (abfd, lo16_type, rel, relend);
8251 if (lo16_relocation == NULL)
8252 return FALSE;
8253
8254 /* Obtain the addend kept there. */
8255 lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, lo16_type, FALSE);
8256 l = mips_elf_read_rel_addend (abfd, lo16_relocation, lo16_howto, contents);
8257
8258 l <<= lo16_howto->rightshift;
8259 l = _bfd_mips_elf_sign_extend (l, 16);
8260
8261 *addend <<= 16;
8262 *addend += l;
8263 return TRUE;
8264}
8265
8266/* Try to read the contents of section SEC in bfd ABFD. Return true and
8267 store the contents in *CONTENTS on success. Assume that *CONTENTS
8268 already holds the contents if it is nonull on entry. */
8269
8270static bfd_boolean
8271mips_elf_get_section_contents (bfd *abfd, asection *sec, bfd_byte **contents)
8272{
8273 if (*contents)
8274 return TRUE;
8275
8276 /* Get cached copy if it exists. */
8277 if (elf_section_data (sec)->this_hdr.contents != NULL)
8278 {
8279 *contents = elf_section_data (sec)->this_hdr.contents;
8280 return TRUE;
8281 }
8282
8283 return bfd_malloc_and_get_section (abfd, sec, contents);
8284}
8285
1bbce132
MR
8286/* Make a new PLT record to keep internal data. */
8287
8288static struct plt_entry *
8289mips_elf_make_plt_record (bfd *abfd)
8290{
8291 struct plt_entry *entry;
8292
8293 entry = bfd_zalloc (abfd, sizeof (*entry));
8294 if (entry == NULL)
8295 return NULL;
8296
8297 entry->stub_offset = MINUS_ONE;
8298 entry->mips_offset = MINUS_ONE;
8299 entry->comp_offset = MINUS_ONE;
8300 entry->gotplt_index = MINUS_ONE;
8301 return entry;
8302}
8303
47275900
MR
8304/* Define the special `__gnu_absolute_zero' symbol. We only need this
8305 for PIC code, as otherwise there is no load-time relocation involved
8306 and local GOT entries whose value is zero at static link time will
8307 retain their value at load time. */
8308
8309static bfd_boolean
8310mips_elf_define_absolute_zero (bfd *abfd, struct bfd_link_info *info,
8311 struct mips_elf_link_hash_table *htab,
8312 unsigned int r_type)
8313{
8314 union
8315 {
8316 struct elf_link_hash_entry *eh;
8317 struct bfd_link_hash_entry *bh;
8318 }
8319 hzero;
8320
8321 BFD_ASSERT (!htab->use_absolute_zero);
8322 BFD_ASSERT (bfd_link_pic (info));
8323
8324 hzero.bh = NULL;
8325 if (!_bfd_generic_link_add_one_symbol (info, abfd, "__gnu_absolute_zero",
8326 BSF_GLOBAL, bfd_abs_section_ptr, 0,
8327 NULL, FALSE, FALSE, &hzero.bh))
8328 return FALSE;
8329
8330 BFD_ASSERT (hzero.bh != NULL);
8331 hzero.eh->size = 0;
8332 hzero.eh->type = STT_NOTYPE;
8333 hzero.eh->other = STV_PROTECTED;
8334 hzero.eh->def_regular = 1;
8335 hzero.eh->non_elf = 0;
8336
8337 if (!mips_elf_record_global_got_symbol (hzero.eh, abfd, info, TRUE, r_type))
8338 return FALSE;
8339
8340 htab->use_absolute_zero = TRUE;
8341
8342 return TRUE;
8343}
8344
b49e97c9 8345/* Look through the relocs for a section during the first phase, and
1bbce132
MR
8346 allocate space in the global offset table and record the need for
8347 standard MIPS and compressed procedure linkage table entries. */
b49e97c9 8348
b34976b6 8349bfd_boolean
9719ad41
RS
8350_bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
8351 asection *sec, const Elf_Internal_Rela *relocs)
b49e97c9
TS
8352{
8353 const char *name;
8354 bfd *dynobj;
8355 Elf_Internal_Shdr *symtab_hdr;
8356 struct elf_link_hash_entry **sym_hashes;
b49e97c9
TS
8357 size_t extsymoff;
8358 const Elf_Internal_Rela *rel;
8359 const Elf_Internal_Rela *rel_end;
b49e97c9 8360 asection *sreloc;
9c5bfbb7 8361 const struct elf_backend_data *bed;
0a44bf69 8362 struct mips_elf_link_hash_table *htab;
c224138d
RS
8363 bfd_byte *contents;
8364 bfd_vma addend;
8365 reloc_howto_type *howto;
b49e97c9 8366
0e1862bb 8367 if (bfd_link_relocatable (info))
b34976b6 8368 return TRUE;
b49e97c9 8369
0a44bf69 8370 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
8371 BFD_ASSERT (htab != NULL);
8372
b49e97c9
TS
8373 dynobj = elf_hash_table (info)->dynobj;
8374 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8375 sym_hashes = elf_sym_hashes (abfd);
8376 extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
8377
738e5348 8378 bed = get_elf_backend_data (abfd);
056bafd4 8379 rel_end = relocs + sec->reloc_count;
738e5348 8380
b49e97c9
TS
8381 /* Check for the mips16 stub sections. */
8382
fd361982 8383 name = bfd_section_name (sec);
b9d58d71 8384 if (FN_STUB_P (name))
b49e97c9
TS
8385 {
8386 unsigned long r_symndx;
8387
8388 /* Look at the relocation information to figure out which symbol
07d6d2b8 8389 this is for. */
b49e97c9 8390
cb4437b8 8391 r_symndx = mips16_stub_symndx (bed, sec, relocs, rel_end);
738e5348
RS
8392 if (r_symndx == 0)
8393 {
4eca0228 8394 _bfd_error_handler
695344c0 8395 /* xgettext:c-format */
2c1c9679 8396 (_("%pB: warning: cannot determine the target function for"
738e5348
RS
8397 " stub section `%s'"),
8398 abfd, name);
8399 bfd_set_error (bfd_error_bad_value);
8400 return FALSE;
8401 }
b49e97c9
TS
8402
8403 if (r_symndx < extsymoff
8404 || sym_hashes[r_symndx - extsymoff] == NULL)
8405 {
8406 asection *o;
8407
8408 /* This stub is for a local symbol. This stub will only be
07d6d2b8
AM
8409 needed if there is some relocation in this BFD, other
8410 than a 16 bit function call, which refers to this symbol. */
b49e97c9
TS
8411 for (o = abfd->sections; o != NULL; o = o->next)
8412 {
8413 Elf_Internal_Rela *sec_relocs;
8414 const Elf_Internal_Rela *r, *rend;
8415
8416 /* We can ignore stub sections when looking for relocs. */
8417 if ((o->flags & SEC_RELOC) == 0
8418 || o->reloc_count == 0
738e5348 8419 || section_allows_mips16_refs_p (o))
b49e97c9
TS
8420 continue;
8421
45d6a902 8422 sec_relocs
9719ad41 8423 = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
45d6a902 8424 info->keep_memory);
b49e97c9 8425 if (sec_relocs == NULL)
b34976b6 8426 return FALSE;
b49e97c9
TS
8427
8428 rend = sec_relocs + o->reloc_count;
8429 for (r = sec_relocs; r < rend; r++)
8430 if (ELF_R_SYM (abfd, r->r_info) == r_symndx
738e5348 8431 && !mips16_call_reloc_p (ELF_R_TYPE (abfd, r->r_info)))
b49e97c9
TS
8432 break;
8433
6cdc0ccc 8434 if (elf_section_data (o)->relocs != sec_relocs)
b49e97c9
TS
8435 free (sec_relocs);
8436
8437 if (r < rend)
8438 break;
8439 }
8440
8441 if (o == NULL)
8442 {
8443 /* There is no non-call reloc for this stub, so we do
07d6d2b8
AM
8444 not need it. Since this function is called before
8445 the linker maps input sections to output sections, we
8446 can easily discard it by setting the SEC_EXCLUDE
8447 flag. */
b49e97c9 8448 sec->flags |= SEC_EXCLUDE;
b34976b6 8449 return TRUE;
b49e97c9
TS
8450 }
8451
8452 /* Record this stub in an array of local symbol stubs for
07d6d2b8 8453 this BFD. */
698600e4 8454 if (mips_elf_tdata (abfd)->local_stubs == NULL)
b49e97c9
TS
8455 {
8456 unsigned long symcount;
8457 asection **n;
8458 bfd_size_type amt;
8459
8460 if (elf_bad_symtab (abfd))
8461 symcount = NUM_SHDR_ENTRIES (symtab_hdr);
8462 else
8463 symcount = symtab_hdr->sh_info;
8464 amt = symcount * sizeof (asection *);
9719ad41 8465 n = bfd_zalloc (abfd, amt);
b49e97c9 8466 if (n == NULL)
b34976b6 8467 return FALSE;
698600e4 8468 mips_elf_tdata (abfd)->local_stubs = n;
b49e97c9
TS
8469 }
8470
b9d58d71 8471 sec->flags |= SEC_KEEP;
698600e4 8472 mips_elf_tdata (abfd)->local_stubs[r_symndx] = sec;
b49e97c9
TS
8473
8474 /* We don't need to set mips16_stubs_seen in this case.
07d6d2b8
AM
8475 That flag is used to see whether we need to look through
8476 the global symbol table for stubs. We don't need to set
8477 it here, because we just have a local stub. */
b49e97c9
TS
8478 }
8479 else
8480 {
8481 struct mips_elf_link_hash_entry *h;
8482
8483 h = ((struct mips_elf_link_hash_entry *)
8484 sym_hashes[r_symndx - extsymoff]);
8485
973a3492
L
8486 while (h->root.root.type == bfd_link_hash_indirect
8487 || h->root.root.type == bfd_link_hash_warning)
8488 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
8489
b49e97c9
TS
8490 /* H is the symbol this stub is for. */
8491
b9d58d71
TS
8492 /* If we already have an appropriate stub for this function, we
8493 don't need another one, so we can discard this one. Since
8494 this function is called before the linker maps input sections
8495 to output sections, we can easily discard it by setting the
8496 SEC_EXCLUDE flag. */
8497 if (h->fn_stub != NULL)
8498 {
8499 sec->flags |= SEC_EXCLUDE;
8500 return TRUE;
8501 }
8502
8503 sec->flags |= SEC_KEEP;
b49e97c9 8504 h->fn_stub = sec;
b34976b6 8505 mips_elf_hash_table (info)->mips16_stubs_seen = TRUE;
b49e97c9
TS
8506 }
8507 }
b9d58d71 8508 else if (CALL_STUB_P (name) || CALL_FP_STUB_P (name))
b49e97c9
TS
8509 {
8510 unsigned long r_symndx;
8511 struct mips_elf_link_hash_entry *h;
8512 asection **loc;
8513
8514 /* Look at the relocation information to figure out which symbol
07d6d2b8 8515 this is for. */
b49e97c9 8516
cb4437b8 8517 r_symndx = mips16_stub_symndx (bed, sec, relocs, rel_end);
738e5348
RS
8518 if (r_symndx == 0)
8519 {
4eca0228 8520 _bfd_error_handler
695344c0 8521 /* xgettext:c-format */
2c1c9679 8522 (_("%pB: warning: cannot determine the target function for"
738e5348
RS
8523 " stub section `%s'"),
8524 abfd, name);
8525 bfd_set_error (bfd_error_bad_value);
8526 return FALSE;
8527 }
b49e97c9
TS
8528
8529 if (r_symndx < extsymoff
8530 || sym_hashes[r_symndx - extsymoff] == NULL)
8531 {
b9d58d71 8532 asection *o;
b49e97c9 8533
b9d58d71 8534 /* This stub is for a local symbol. This stub will only be
07d6d2b8
AM
8535 needed if there is some relocation (R_MIPS16_26) in this BFD
8536 that refers to this symbol. */
b9d58d71
TS
8537 for (o = abfd->sections; o != NULL; o = o->next)
8538 {
8539 Elf_Internal_Rela *sec_relocs;
8540 const Elf_Internal_Rela *r, *rend;
8541
8542 /* We can ignore stub sections when looking for relocs. */
8543 if ((o->flags & SEC_RELOC) == 0
8544 || o->reloc_count == 0
738e5348 8545 || section_allows_mips16_refs_p (o))
b9d58d71
TS
8546 continue;
8547
8548 sec_relocs
8549 = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
8550 info->keep_memory);
8551 if (sec_relocs == NULL)
8552 return FALSE;
8553
8554 rend = sec_relocs + o->reloc_count;
8555 for (r = sec_relocs; r < rend; r++)
8556 if (ELF_R_SYM (abfd, r->r_info) == r_symndx
8557 && ELF_R_TYPE (abfd, r->r_info) == R_MIPS16_26)
8558 break;
8559
8560 if (elf_section_data (o)->relocs != sec_relocs)
8561 free (sec_relocs);
8562
8563 if (r < rend)
8564 break;
8565 }
8566
8567 if (o == NULL)
8568 {
8569 /* There is no non-call reloc for this stub, so we do
07d6d2b8
AM
8570 not need it. Since this function is called before
8571 the linker maps input sections to output sections, we
8572 can easily discard it by setting the SEC_EXCLUDE
8573 flag. */
b9d58d71
TS
8574 sec->flags |= SEC_EXCLUDE;
8575 return TRUE;
8576 }
8577
8578 /* Record this stub in an array of local symbol call_stubs for
07d6d2b8 8579 this BFD. */
698600e4 8580 if (mips_elf_tdata (abfd)->local_call_stubs == NULL)
b9d58d71
TS
8581 {
8582 unsigned long symcount;
8583 asection **n;
8584 bfd_size_type amt;
8585
8586 if (elf_bad_symtab (abfd))
8587 symcount = NUM_SHDR_ENTRIES (symtab_hdr);
8588 else
8589 symcount = symtab_hdr->sh_info;
8590 amt = symcount * sizeof (asection *);
8591 n = bfd_zalloc (abfd, amt);
8592 if (n == NULL)
8593 return FALSE;
698600e4 8594 mips_elf_tdata (abfd)->local_call_stubs = n;
b9d58d71 8595 }
b49e97c9 8596
b9d58d71 8597 sec->flags |= SEC_KEEP;
698600e4 8598 mips_elf_tdata (abfd)->local_call_stubs[r_symndx] = sec;
b49e97c9 8599
b9d58d71 8600 /* We don't need to set mips16_stubs_seen in this case.
07d6d2b8
AM
8601 That flag is used to see whether we need to look through
8602 the global symbol table for stubs. We don't need to set
8603 it here, because we just have a local stub. */
b9d58d71 8604 }
b49e97c9 8605 else
b49e97c9 8606 {
b9d58d71
TS
8607 h = ((struct mips_elf_link_hash_entry *)
8608 sym_hashes[r_symndx - extsymoff]);
68ffbac6 8609
b9d58d71 8610 /* H is the symbol this stub is for. */
68ffbac6 8611
b9d58d71
TS
8612 if (CALL_FP_STUB_P (name))
8613 loc = &h->call_fp_stub;
8614 else
8615 loc = &h->call_stub;
68ffbac6 8616
b9d58d71
TS
8617 /* If we already have an appropriate stub for this function, we
8618 don't need another one, so we can discard this one. Since
8619 this function is called before the linker maps input sections
8620 to output sections, we can easily discard it by setting the
8621 SEC_EXCLUDE flag. */
8622 if (*loc != NULL)
8623 {
8624 sec->flags |= SEC_EXCLUDE;
8625 return TRUE;
8626 }
b49e97c9 8627
b9d58d71
TS
8628 sec->flags |= SEC_KEEP;
8629 *loc = sec;
8630 mips_elf_hash_table (info)->mips16_stubs_seen = TRUE;
8631 }
b49e97c9
TS
8632 }
8633
b49e97c9 8634 sreloc = NULL;
c224138d 8635 contents = NULL;
b49e97c9
TS
8636 for (rel = relocs; rel < rel_end; ++rel)
8637 {
8638 unsigned long r_symndx;
8639 unsigned int r_type;
8640 struct elf_link_hash_entry *h;
861fb55a 8641 bfd_boolean can_make_dynamic_p;
c5d6fa44
RS
8642 bfd_boolean call_reloc_p;
8643 bfd_boolean constrain_symbol_p;
b49e97c9
TS
8644
8645 r_symndx = ELF_R_SYM (abfd, rel->r_info);
8646 r_type = ELF_R_TYPE (abfd, rel->r_info);
8647
8648 if (r_symndx < extsymoff)
8649 h = NULL;
8650 else if (r_symndx >= extsymoff + NUM_SHDR_ENTRIES (symtab_hdr))
8651 {
4eca0228 8652 _bfd_error_handler
695344c0 8653 /* xgettext:c-format */
2c1c9679 8654 (_("%pB: malformed reloc detected for section %s"),
d003868e 8655 abfd, name);
b49e97c9 8656 bfd_set_error (bfd_error_bad_value);
b34976b6 8657 return FALSE;
b49e97c9
TS
8658 }
8659 else
8660 {
8661 h = sym_hashes[r_symndx - extsymoff];
81fbe831
AM
8662 if (h != NULL)
8663 {
8664 while (h->root.type == bfd_link_hash_indirect
8665 || h->root.type == bfd_link_hash_warning)
8666 h = (struct elf_link_hash_entry *) h->root.u.i.link;
81fbe831 8667 }
861fb55a 8668 }
b49e97c9 8669
861fb55a
DJ
8670 /* Set CAN_MAKE_DYNAMIC_P to true if we can convert this
8671 relocation into a dynamic one. */
8672 can_make_dynamic_p = FALSE;
c5d6fa44
RS
8673
8674 /* Set CALL_RELOC_P to true if the relocation is for a call,
8675 and if pointer equality therefore doesn't matter. */
8676 call_reloc_p = FALSE;
8677
8678 /* Set CONSTRAIN_SYMBOL_P if we need to take the relocation
8679 into account when deciding how to define the symbol.
8680 Relocations in nonallocatable sections such as .pdr and
8681 .debug* should have no effect. */
8682 constrain_symbol_p = ((sec->flags & SEC_ALLOC) != 0);
8683
861fb55a
DJ
8684 switch (r_type)
8685 {
861fb55a
DJ
8686 case R_MIPS_CALL16:
8687 case R_MIPS_CALL_HI16:
8688 case R_MIPS_CALL_LO16:
c5d6fa44
RS
8689 case R_MIPS16_CALL16:
8690 case R_MICROMIPS_CALL16:
8691 case R_MICROMIPS_CALL_HI16:
8692 case R_MICROMIPS_CALL_LO16:
8693 call_reloc_p = TRUE;
8694 /* Fall through. */
8695
8696 case R_MIPS_GOT16:
861fb55a
DJ
8697 case R_MIPS_GOT_LO16:
8698 case R_MIPS_GOT_PAGE:
861fb55a 8699 case R_MIPS_GOT_DISP:
47275900
MR
8700 case R_MIPS16_GOT16:
8701 case R_MICROMIPS_GOT16:
8702 case R_MICROMIPS_GOT_LO16:
8703 case R_MICROMIPS_GOT_PAGE:
8704 case R_MICROMIPS_GOT_DISP:
8705 /* If we have a symbol that will resolve to zero at static link
8706 time and it is used by a GOT relocation applied to code we
8707 cannot relax to an immediate zero load, then we will be using
8708 the special `__gnu_absolute_zero' symbol whose value is zero
8709 at dynamic load time. We ignore HI16-type GOT relocations at
8710 this stage, because their handling will depend entirely on
8711 the corresponding LO16-type GOT relocation. */
8712 if (!call_hi16_reloc_p (r_type)
8713 && h != NULL
8714 && bfd_link_pic (info)
8715 && !htab->use_absolute_zero
8716 && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
8717 {
8718 bfd_boolean rel_reloc;
8719
8720 if (!mips_elf_get_section_contents (abfd, sec, &contents))
8721 return FALSE;
8722
8723 rel_reloc = mips_elf_rel_relocation_p (abfd, sec, relocs, rel);
8724 howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, !rel_reloc);
8725
8726 if (!mips_elf_nullify_got_load (abfd, contents, rel, howto,
8727 FALSE))
8728 if (!mips_elf_define_absolute_zero (abfd, info, htab, r_type))
8729 return FALSE;
8730 }
8731
8732 /* Fall through. */
8733 case R_MIPS_GOT_HI16:
8734 case R_MIPS_GOT_OFST:
861fb55a
DJ
8735 case R_MIPS_TLS_GOTTPREL:
8736 case R_MIPS_TLS_GD:
8737 case R_MIPS_TLS_LDM:
d0f13682
CLT
8738 case R_MIPS16_TLS_GOTTPREL:
8739 case R_MIPS16_TLS_GD:
8740 case R_MIPS16_TLS_LDM:
df58fc94 8741 case R_MICROMIPS_GOT_HI16:
df58fc94 8742 case R_MICROMIPS_GOT_OFST:
df58fc94
RS
8743 case R_MICROMIPS_TLS_GOTTPREL:
8744 case R_MICROMIPS_TLS_GD:
8745 case R_MICROMIPS_TLS_LDM:
861fb55a
DJ
8746 if (dynobj == NULL)
8747 elf_hash_table (info)->dynobj = dynobj = abfd;
8748 if (!mips_elf_create_got_section (dynobj, info))
8749 return FALSE;
0e1862bb 8750 if (htab->is_vxworks && !bfd_link_pic (info))
b49e97c9 8751 {
4eca0228 8752 _bfd_error_handler
695344c0 8753 /* xgettext:c-format */
2dcf00ce
AM
8754 (_("%pB: GOT reloc at %#" PRIx64 " not expected in executables"),
8755 abfd, (uint64_t) rel->r_offset);
861fb55a
DJ
8756 bfd_set_error (bfd_error_bad_value);
8757 return FALSE;
b49e97c9 8758 }
c5d6fa44 8759 can_make_dynamic_p = TRUE;
861fb55a 8760 break;
b49e97c9 8761
c5d6fa44 8762 case R_MIPS_NONE:
99da6b5f 8763 case R_MIPS_JALR:
df58fc94 8764 case R_MICROMIPS_JALR:
c5d6fa44
RS
8765 /* These relocations have empty fields and are purely there to
8766 provide link information. The symbol value doesn't matter. */
8767 constrain_symbol_p = FALSE;
8768 break;
8769
8770 case R_MIPS_GPREL16:
8771 case R_MIPS_GPREL32:
8772 case R_MIPS16_GPREL:
8773 case R_MICROMIPS_GPREL16:
8774 /* GP-relative relocations always resolve to a definition in a
8775 regular input file, ignoring the one-definition rule. This is
8776 important for the GP setup sequence in NewABI code, which
8777 always resolves to a local function even if other relocations
8778 against the symbol wouldn't. */
8779 constrain_symbol_p = FALSE;
99da6b5f
AN
8780 break;
8781
861fb55a
DJ
8782 case R_MIPS_32:
8783 case R_MIPS_REL32:
8784 case R_MIPS_64:
8785 /* In VxWorks executables, references to external symbols
8786 must be handled using copy relocs or PLT entries; it is not
8787 possible to convert this relocation into a dynamic one.
8788
8789 For executables that use PLTs and copy-relocs, we have a
8790 choice between converting the relocation into a dynamic
8791 one or using copy relocations or PLT entries. It is
8792 usually better to do the former, unless the relocation is
8793 against a read-only section. */
0e1862bb 8794 if ((bfd_link_pic (info)
861fb55a
DJ
8795 || (h != NULL
8796 && !htab->is_vxworks
8797 && strcmp (h->root.root.string, "__gnu_local_gp") != 0
8798 && !(!info->nocopyreloc
8799 && !PIC_OBJECT_P (abfd)
8800 && MIPS_ELF_READONLY_SECTION (sec))))
8801 && (sec->flags & SEC_ALLOC) != 0)
b49e97c9 8802 {
861fb55a 8803 can_make_dynamic_p = TRUE;
b49e97c9
TS
8804 if (dynobj == NULL)
8805 elf_hash_table (info)->dynobj = dynobj = abfd;
861fb55a 8806 }
c5d6fa44 8807 break;
b49e97c9 8808
861fb55a
DJ
8809 case R_MIPS_26:
8810 case R_MIPS_PC16:
7361da2c
AB
8811 case R_MIPS_PC21_S2:
8812 case R_MIPS_PC26_S2:
861fb55a 8813 case R_MIPS16_26:
c9775dde 8814 case R_MIPS16_PC16_S1:
df58fc94
RS
8815 case R_MICROMIPS_26_S1:
8816 case R_MICROMIPS_PC7_S1:
8817 case R_MICROMIPS_PC10_S1:
8818 case R_MICROMIPS_PC16_S1:
8819 case R_MICROMIPS_PC23_S2:
c5d6fa44 8820 call_reloc_p = TRUE;
861fb55a 8821 break;
b49e97c9
TS
8822 }
8823
0a44bf69
RS
8824 if (h)
8825 {
c5d6fa44
RS
8826 if (constrain_symbol_p)
8827 {
8828 if (!can_make_dynamic_p)
8829 ((struct mips_elf_link_hash_entry *) h)->has_static_relocs = 1;
8830
8831 if (!call_reloc_p)
8832 h->pointer_equality_needed = 1;
8833
8834 /* We must not create a stub for a symbol that has
8835 relocations related to taking the function's address.
8836 This doesn't apply to VxWorks, where CALL relocs refer
8837 to a .got.plt entry instead of a normal .got entry. */
8838 if (!htab->is_vxworks && (!can_make_dynamic_p || !call_reloc_p))
8839 ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = TRUE;
8840 }
8841
0a44bf69
RS
8842 /* Relocations against the special VxWorks __GOTT_BASE__ and
8843 __GOTT_INDEX__ symbols must be left to the loader. Allocate
8844 room for them in .rela.dyn. */
8845 if (is_gott_symbol (info, h))
8846 {
8847 if (sreloc == NULL)
8848 {
8849 sreloc = mips_elf_rel_dyn_section (info, TRUE);
8850 if (sreloc == NULL)
8851 return FALSE;
8852 }
8853 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
9e3313ae
RS
8854 if (MIPS_ELF_READONLY_SECTION (sec))
8855 /* We tell the dynamic linker that there are
8856 relocations against the text segment. */
8857 info->flags |= DF_TEXTREL;
0a44bf69
RS
8858 }
8859 }
df58fc94
RS
8860 else if (call_lo16_reloc_p (r_type)
8861 || got_lo16_reloc_p (r_type)
8862 || got_disp_reloc_p (r_type)
738e5348 8863 || (got16_reloc_p (r_type) && htab->is_vxworks))
b49e97c9
TS
8864 {
8865 /* We may need a local GOT entry for this relocation. We
8866 don't count R_MIPS_GOT_PAGE because we can estimate the
8867 maximum number of pages needed by looking at the size of
738e5348
RS
8868 the segment. Similar comments apply to R_MIPS*_GOT16 and
8869 R_MIPS*_CALL16, except on VxWorks, where GOT relocations
0a44bf69 8870 always evaluate to "G". We don't count R_MIPS_GOT_HI16, or
b49e97c9 8871 R_MIPS_CALL_HI16 because these are always followed by an
b15e6682 8872 R_MIPS_GOT_LO16 or R_MIPS_CALL_LO16. */
a8028dd0 8873 if (!mips_elf_record_local_got_symbol (abfd, r_symndx,
e641e783 8874 rel->r_addend, info, r_type))
f4416af6 8875 return FALSE;
b49e97c9
TS
8876 }
8877
8f0c309a
CLT
8878 if (h != NULL
8879 && mips_elf_relocation_needs_la25_stub (abfd, r_type,
8880 ELF_ST_IS_MIPS16 (h->other)))
861fb55a
DJ
8881 ((struct mips_elf_link_hash_entry *) h)->has_nonpic_branches = TRUE;
8882
b49e97c9
TS
8883 switch (r_type)
8884 {
8885 case R_MIPS_CALL16:
738e5348 8886 case R_MIPS16_CALL16:
df58fc94 8887 case R_MICROMIPS_CALL16:
b49e97c9
TS
8888 if (h == NULL)
8889 {
4eca0228 8890 _bfd_error_handler
695344c0 8891 /* xgettext:c-format */
2dcf00ce
AM
8892 (_("%pB: CALL16 reloc at %#" PRIx64 " not against global symbol"),
8893 abfd, (uint64_t) rel->r_offset);
b49e97c9 8894 bfd_set_error (bfd_error_bad_value);
b34976b6 8895 return FALSE;
b49e97c9
TS
8896 }
8897 /* Fall through. */
8898
8899 case R_MIPS_CALL_HI16:
8900 case R_MIPS_CALL_LO16:
df58fc94
RS
8901 case R_MICROMIPS_CALL_HI16:
8902 case R_MICROMIPS_CALL_LO16:
b49e97c9
TS
8903 if (h != NULL)
8904 {
6ccf4795
RS
8905 /* Make sure there is room in the regular GOT to hold the
8906 function's address. We may eliminate it in favour of
8907 a .got.plt entry later; see mips_elf_count_got_symbols. */
e641e783
RS
8908 if (!mips_elf_record_global_got_symbol (h, abfd, info, TRUE,
8909 r_type))
b34976b6 8910 return FALSE;
b49e97c9
TS
8911
8912 /* We need a stub, not a plt entry for the undefined
8913 function. But we record it as if it needs plt. See
c152c796 8914 _bfd_elf_adjust_dynamic_symbol. */
f5385ebf 8915 h->needs_plt = 1;
b49e97c9
TS
8916 h->type = STT_FUNC;
8917 }
8918 break;
8919
0fdc1bf1 8920 case R_MIPS_GOT_PAGE:
df58fc94 8921 case R_MICROMIPS_GOT_PAGE:
738e5348 8922 case R_MIPS16_GOT16:
b49e97c9
TS
8923 case R_MIPS_GOT16:
8924 case R_MIPS_GOT_HI16:
8925 case R_MIPS_GOT_LO16:
df58fc94
RS
8926 case R_MICROMIPS_GOT16:
8927 case R_MICROMIPS_GOT_HI16:
8928 case R_MICROMIPS_GOT_LO16:
8929 if (!h || got_page_reloc_p (r_type))
c224138d 8930 {
3a3b6725
DJ
8931 /* This relocation needs (or may need, if h != NULL) a
8932 page entry in the GOT. For R_MIPS_GOT_PAGE we do not
8933 know for sure until we know whether the symbol is
8934 preemptible. */
c224138d
RS
8935 if (mips_elf_rel_relocation_p (abfd, sec, relocs, rel))
8936 {
8937 if (!mips_elf_get_section_contents (abfd, sec, &contents))
8938 return FALSE;
8939 howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, FALSE);
8940 addend = mips_elf_read_rel_addend (abfd, rel,
8941 howto, contents);
9684f078 8942 if (got16_reloc_p (r_type))
c224138d
RS
8943 mips_elf_add_lo16_rel_addend (abfd, rel, rel_end,
8944 contents, &addend);
8945 else
8946 addend <<= howto->rightshift;
8947 }
8948 else
8949 addend = rel->r_addend;
13db6b44
RS
8950 if (!mips_elf_record_got_page_ref (info, abfd, r_symndx,
8951 h, addend))
c224138d 8952 return FALSE;
13db6b44
RS
8953
8954 if (h)
8955 {
8956 struct mips_elf_link_hash_entry *hmips =
8957 (struct mips_elf_link_hash_entry *) h;
8958
8959 /* This symbol is definitely not overridable. */
8960 if (hmips->root.def_regular
0e1862bb 8961 && ! (bfd_link_pic (info) && ! info->symbolic
13db6b44
RS
8962 && ! hmips->root.forced_local))
8963 h = NULL;
8964 }
c224138d 8965 }
13db6b44
RS
8966 /* If this is a global, overridable symbol, GOT_PAGE will
8967 decay to GOT_DISP, so we'll need a GOT entry for it. */
c224138d
RS
8968 /* Fall through. */
8969
b49e97c9 8970 case R_MIPS_GOT_DISP:
df58fc94 8971 case R_MICROMIPS_GOT_DISP:
6ccf4795 8972 if (h && !mips_elf_record_global_got_symbol (h, abfd, info,
e641e783 8973 FALSE, r_type))
b34976b6 8974 return FALSE;
b49e97c9
TS
8975 break;
8976
0f20cc35 8977 case R_MIPS_TLS_GOTTPREL:
d0f13682 8978 case R_MIPS16_TLS_GOTTPREL:
df58fc94 8979 case R_MICROMIPS_TLS_GOTTPREL:
0e1862bb 8980 if (bfd_link_pic (info))
0f20cc35
DJ
8981 info->flags |= DF_STATIC_TLS;
8982 /* Fall through */
8983
8984 case R_MIPS_TLS_LDM:
d0f13682 8985 case R_MIPS16_TLS_LDM:
df58fc94
RS
8986 case R_MICROMIPS_TLS_LDM:
8987 if (tls_ldm_reloc_p (r_type))
0f20cc35 8988 {
cf35638d 8989 r_symndx = STN_UNDEF;
0f20cc35
DJ
8990 h = NULL;
8991 }
8992 /* Fall through */
8993
8994 case R_MIPS_TLS_GD:
d0f13682 8995 case R_MIPS16_TLS_GD:
df58fc94 8996 case R_MICROMIPS_TLS_GD:
0f20cc35
DJ
8997 /* This symbol requires a global offset table entry, or two
8998 for TLS GD relocations. */
e641e783
RS
8999 if (h != NULL)
9000 {
9001 if (!mips_elf_record_global_got_symbol (h, abfd, info,
9002 FALSE, r_type))
9003 return FALSE;
9004 }
9005 else
9006 {
9007 if (!mips_elf_record_local_got_symbol (abfd, r_symndx,
9008 rel->r_addend,
9009 info, r_type))
9010 return FALSE;
9011 }
0f20cc35
DJ
9012 break;
9013
b49e97c9
TS
9014 case R_MIPS_32:
9015 case R_MIPS_REL32:
9016 case R_MIPS_64:
0a44bf69
RS
9017 /* In VxWorks executables, references to external symbols
9018 are handled using copy relocs or PLT stubs, so there's
9019 no need to add a .rela.dyn entry for this relocation. */
861fb55a 9020 if (can_make_dynamic_p)
b49e97c9
TS
9021 {
9022 if (sreloc == NULL)
9023 {
0a44bf69 9024 sreloc = mips_elf_rel_dyn_section (info, TRUE);
b49e97c9 9025 if (sreloc == NULL)
f4416af6 9026 return FALSE;
b49e97c9 9027 }
0e1862bb 9028 if (bfd_link_pic (info) && h == NULL)
82f0cfbd
EC
9029 {
9030 /* When creating a shared object, we must copy these
9031 reloc types into the output file as R_MIPS_REL32
0a44bf69
RS
9032 relocs. Make room for this reloc in .rel(a).dyn. */
9033 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
943284cc 9034 if (MIPS_ELF_READONLY_SECTION (sec))
82f0cfbd
EC
9035 /* We tell the dynamic linker that there are
9036 relocations against the text segment. */
9037 info->flags |= DF_TEXTREL;
9038 }
b49e97c9
TS
9039 else
9040 {
9041 struct mips_elf_link_hash_entry *hmips;
82f0cfbd 9042
9a59ad6b
DJ
9043 /* For a shared object, we must copy this relocation
9044 unless the symbol turns out to be undefined and
9045 weak with non-default visibility, in which case
9046 it will be left as zero.
9047
9048 We could elide R_MIPS_REL32 for locally binding symbols
9049 in shared libraries, but do not yet do so.
9050
9051 For an executable, we only need to copy this
9052 reloc if the symbol is defined in a dynamic
9053 object. */
b49e97c9
TS
9054 hmips = (struct mips_elf_link_hash_entry *) h;
9055 ++hmips->possibly_dynamic_relocs;
943284cc 9056 if (MIPS_ELF_READONLY_SECTION (sec))
82f0cfbd
EC
9057 /* We need it to tell the dynamic linker if there
9058 are relocations against the text segment. */
9059 hmips->readonly_reloc = TRUE;
b49e97c9 9060 }
b49e97c9
TS
9061 }
9062
9063 if (SGI_COMPAT (abfd))
9064 mips_elf_hash_table (info)->compact_rel_size +=
9065 sizeof (Elf32_External_crinfo);
9066 break;
9067
9068 case R_MIPS_26:
9069 case R_MIPS_GPREL16:
9070 case R_MIPS_LITERAL:
9071 case R_MIPS_GPREL32:
df58fc94
RS
9072 case R_MICROMIPS_26_S1:
9073 case R_MICROMIPS_GPREL16:
9074 case R_MICROMIPS_LITERAL:
9075 case R_MICROMIPS_GPREL7_S2:
b49e97c9
TS
9076 if (SGI_COMPAT (abfd))
9077 mips_elf_hash_table (info)->compact_rel_size +=
9078 sizeof (Elf32_External_crinfo);
9079 break;
9080
9081 /* This relocation describes the C++ object vtable hierarchy.
9082 Reconstruct it for later use during GC. */
9083 case R_MIPS_GNU_VTINHERIT:
c152c796 9084 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 9085 return FALSE;
b49e97c9
TS
9086 break;
9087
9088 /* This relocation describes which C++ vtable entries are actually
9089 used. Record for later use during GC. */
9090 case R_MIPS_GNU_VTENTRY:
a0ea3a14 9091 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
b34976b6 9092 return FALSE;
b49e97c9
TS
9093 break;
9094
9095 default:
9096 break;
9097 }
9098
1bbce132 9099 /* Record the need for a PLT entry. At this point we don't know
07d6d2b8
AM
9100 yet if we are going to create a PLT in the first place, but
9101 we only record whether the relocation requires a standard MIPS
9102 or a compressed code entry anyway. If we don't make a PLT after
9103 all, then we'll just ignore these arrangements. Likewise if
9104 a PLT entry is not created because the symbol is satisfied
9105 locally. */
1bbce132 9106 if (h != NULL
54806ffa
MR
9107 && (branch_reloc_p (r_type)
9108 || mips16_branch_reloc_p (r_type)
9109 || micromips_branch_reloc_p (r_type))
1bbce132
MR
9110 && !SYMBOL_CALLS_LOCAL (info, h))
9111 {
9112 if (h->plt.plist == NULL)
9113 h->plt.plist = mips_elf_make_plt_record (abfd);
9114 if (h->plt.plist == NULL)
9115 return FALSE;
9116
54806ffa 9117 if (branch_reloc_p (r_type))
1bbce132
MR
9118 h->plt.plist->need_mips = TRUE;
9119 else
9120 h->plt.plist->need_comp = TRUE;
9121 }
9122
738e5348
RS
9123 /* See if this reloc would need to refer to a MIPS16 hard-float stub,
9124 if there is one. We only need to handle global symbols here;
9125 we decide whether to keep or delete stubs for local symbols
9126 when processing the stub's relocations. */
b49e97c9 9127 if (h != NULL
738e5348
RS
9128 && !mips16_call_reloc_p (r_type)
9129 && !section_allows_mips16_refs_p (sec))
b49e97c9
TS
9130 {
9131 struct mips_elf_link_hash_entry *mh;
9132
9133 mh = (struct mips_elf_link_hash_entry *) h;
b34976b6 9134 mh->need_fn_stub = TRUE;
b49e97c9 9135 }
861fb55a
DJ
9136
9137 /* Refuse some position-dependent relocations when creating a
9138 shared library. Do not refuse R_MIPS_32 / R_MIPS_64; they're
9139 not PIC, but we can create dynamic relocations and the result
9140 will be fine. Also do not refuse R_MIPS_LO16, which can be
9141 combined with R_MIPS_GOT16. */
0e1862bb 9142 if (bfd_link_pic (info))
861fb55a
DJ
9143 {
9144 switch (r_type)
9145 {
b474a202
FS
9146 case R_MIPS_TLS_TPREL_HI16:
9147 case R_MIPS16_TLS_TPREL_HI16:
9148 case R_MICROMIPS_TLS_TPREL_HI16:
9149 case R_MIPS_TLS_TPREL_LO16:
9150 case R_MIPS16_TLS_TPREL_LO16:
9151 case R_MICROMIPS_TLS_TPREL_LO16:
9152 /* These are okay in PIE, but not in a shared library. */
9153 if (bfd_link_executable (info))
9154 break;
9155
9156 /* FALLTHROUGH */
9157
861fb55a
DJ
9158 case R_MIPS16_HI16:
9159 case R_MIPS_HI16:
9160 case R_MIPS_HIGHER:
9161 case R_MIPS_HIGHEST:
df58fc94
RS
9162 case R_MICROMIPS_HI16:
9163 case R_MICROMIPS_HIGHER:
9164 case R_MICROMIPS_HIGHEST:
861fb55a
DJ
9165 /* Don't refuse a high part relocation if it's against
9166 no symbol (e.g. part of a compound relocation). */
cf35638d 9167 if (r_symndx == STN_UNDEF)
861fb55a
DJ
9168 break;
9169
3c7687b9 9170 /* Likewise an absolute symbol. */
304f09d0 9171 if (h != NULL && bfd_is_abs_symbol (&h->root))
3c7687b9
MR
9172 break;
9173
861fb55a
DJ
9174 /* R_MIPS_HI16 against _gp_disp is used for $gp setup,
9175 and has a special meaning. */
9176 if (!NEWABI_P (abfd) && h != NULL
9177 && strcmp (h->root.root.string, "_gp_disp") == 0)
9178 break;
9179
0fc1eb3c
RS
9180 /* Likewise __GOTT_BASE__ and __GOTT_INDEX__ on VxWorks. */
9181 if (is_gott_symbol (info, h))
9182 break;
9183
861fb55a
DJ
9184 /* FALLTHROUGH */
9185
9186 case R_MIPS16_26:
9187 case R_MIPS_26:
df58fc94 9188 case R_MICROMIPS_26_S1:
304f09d0
FS
9189 howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, NEWABI_P (abfd));
9190 /* An error for unsupported relocations is raised as part
9191 of the above search, so we can skip the following. */
9192 if (howto != NULL)
9193 info->callbacks->einfo
9194 /* xgettext:c-format */
9195 (_("%X%H: relocation %s against `%s' cannot be used"
9196 " when making a shared object; recompile with -fPIC\n"),
9197 abfd, sec, rel->r_offset, howto->name,
9198 (h) ? h->root.root.string : "a local symbol");
aff68bd0 9199 break;
861fb55a
DJ
9200 default:
9201 break;
9202 }
9203 }
b49e97c9
TS
9204 }
9205
b34976b6 9206 return TRUE;
b49e97c9
TS
9207}
9208\f
9a59ad6b
DJ
9209/* Allocate space for global sym dynamic relocs. */
9210
9211static bfd_boolean
9212allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
9213{
9214 struct bfd_link_info *info = inf;
9215 bfd *dynobj;
9216 struct mips_elf_link_hash_entry *hmips;
9217 struct mips_elf_link_hash_table *htab;
9218
9219 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9220 BFD_ASSERT (htab != NULL);
9221
9a59ad6b
DJ
9222 dynobj = elf_hash_table (info)->dynobj;
9223 hmips = (struct mips_elf_link_hash_entry *) h;
9224
9225 /* VxWorks executables are handled elsewhere; we only need to
9226 allocate relocations in shared objects. */
0e1862bb 9227 if (htab->is_vxworks && !bfd_link_pic (info))
9a59ad6b
DJ
9228 return TRUE;
9229
7686d77d
AM
9230 /* Ignore indirect symbols. All relocations against such symbols
9231 will be redirected to the target symbol. */
9232 if (h->root.type == bfd_link_hash_indirect)
63897e2c
RS
9233 return TRUE;
9234
9a59ad6b
DJ
9235 /* If this symbol is defined in a dynamic object, or we are creating
9236 a shared library, we will need to copy any R_MIPS_32 or
9237 R_MIPS_REL32 relocs against it into the output file. */
0e1862bb 9238 if (! bfd_link_relocatable (info)
9a59ad6b
DJ
9239 && hmips->possibly_dynamic_relocs != 0
9240 && (h->root.type == bfd_link_hash_defweak
625ef6dc 9241 || (!h->def_regular && !ELF_COMMON_DEF_P (h))
0e1862bb 9242 || bfd_link_pic (info)))
9a59ad6b
DJ
9243 {
9244 bfd_boolean do_copy = TRUE;
9245
9246 if (h->root.type == bfd_link_hash_undefweak)
9247 {
262e07d0
MR
9248 /* Do not copy relocations for undefined weak symbols that
9249 we are not going to export. */
9250 if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
9a59ad6b
DJ
9251 do_copy = FALSE;
9252
9253 /* Make sure undefined weak symbols are output as a dynamic
9254 symbol in PIEs. */
9255 else if (h->dynindx == -1 && !h->forced_local)
9256 {
9257 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9258 return FALSE;
9259 }
9260 }
9261
9262 if (do_copy)
9263 {
aff469fa 9264 /* Even though we don't directly need a GOT entry for this symbol,
f7ff1106
RS
9265 the SVR4 psABI requires it to have a dynamic symbol table
9266 index greater that DT_MIPS_GOTSYM if there are dynamic
9267 relocations against it.
9268
9269 VxWorks does not enforce the same mapping between the GOT
9270 and the symbol table, so the same requirement does not
9271 apply there. */
6ccf4795
RS
9272 if (!htab->is_vxworks)
9273 {
9274 if (hmips->global_got_area > GGA_RELOC_ONLY)
9275 hmips->global_got_area = GGA_RELOC_ONLY;
9276 hmips->got_only_for_calls = FALSE;
9277 }
aff469fa 9278
9a59ad6b
DJ
9279 mips_elf_allocate_dynamic_relocations
9280 (dynobj, info, hmips->possibly_dynamic_relocs);
9281 if (hmips->readonly_reloc)
9282 /* We tell the dynamic linker that there are relocations
9283 against the text segment. */
9284 info->flags |= DF_TEXTREL;
9285 }
9286 }
9287
9288 return TRUE;
9289}
9290
b49e97c9
TS
9291/* Adjust a symbol defined by a dynamic object and referenced by a
9292 regular object. The current definition is in some section of the
9293 dynamic object, but we're not including those sections. We have to
9294 change the definition to something the rest of the link can
9295 understand. */
9296
b34976b6 9297bfd_boolean
9719ad41
RS
9298_bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
9299 struct elf_link_hash_entry *h)
b49e97c9
TS
9300{
9301 bfd *dynobj;
9302 struct mips_elf_link_hash_entry *hmips;
5108fc1b 9303 struct mips_elf_link_hash_table *htab;
5474d94f 9304 asection *s, *srel;
b49e97c9 9305
5108fc1b 9306 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9307 BFD_ASSERT (htab != NULL);
9308
b49e97c9 9309 dynobj = elf_hash_table (info)->dynobj;
861fb55a 9310 hmips = (struct mips_elf_link_hash_entry *) h;
b49e97c9
TS
9311
9312 /* Make sure we know what is going on here. */
9313 BFD_ASSERT (dynobj != NULL
f5385ebf 9314 && (h->needs_plt
60d67dc8 9315 || h->is_weakalias
f5385ebf
AM
9316 || (h->def_dynamic
9317 && h->ref_regular
9318 && !h->def_regular)));
b49e97c9 9319
b49e97c9 9320 hmips = (struct mips_elf_link_hash_entry *) h;
b49e97c9 9321
861fb55a
DJ
9322 /* If there are call relocations against an externally-defined symbol,
9323 see whether we can create a MIPS lazy-binding stub for it. We can
9324 only do this if all references to the function are through call
9325 relocations, and in that case, the traditional lazy-binding stubs
9326 are much more efficient than PLT entries.
9327
9328 Traditional stubs are only available on SVR4 psABI-based systems;
9329 VxWorks always uses PLTs instead. */
9330 if (!htab->is_vxworks && h->needs_plt && !hmips->no_fn_stub)
b49e97c9
TS
9331 {
9332 if (! elf_hash_table (info)->dynamic_sections_created)
b34976b6 9333 return TRUE;
b49e97c9
TS
9334
9335 /* If this symbol is not defined in a regular file, then set
9336 the symbol to the stub location. This is required to make
9337 function pointers compare as equal between the normal
9338 executable and the shared library. */
4b8377e7
MR
9339 if (!h->def_regular
9340 && !bfd_is_abs_section (htab->sstubs->output_section))
b49e97c9 9341 {
33bb52fb
RS
9342 hmips->needs_lazy_stub = TRUE;
9343 htab->lazy_stub_count++;
b34976b6 9344 return TRUE;
b49e97c9
TS
9345 }
9346 }
861fb55a
DJ
9347 /* As above, VxWorks requires PLT entries for externally-defined
9348 functions that are only accessed through call relocations.
b49e97c9 9349
861fb55a
DJ
9350 Both VxWorks and non-VxWorks targets also need PLT entries if there
9351 are static-only relocations against an externally-defined function.
9352 This can technically occur for shared libraries if there are
9353 branches to the symbol, although it is unlikely that this will be
9354 used in practice due to the short ranges involved. It can occur
9355 for any relative or absolute relocation in executables; in that
9356 case, the PLT entry becomes the function's canonical address. */
9357 else if (((h->needs_plt && !hmips->no_fn_stub)
9358 || (h->type == STT_FUNC && hmips->has_static_relocs))
9359 && htab->use_plts_and_copy_relocs
9360 && !SYMBOL_CALLS_LOCAL (info, h)
9361 && !(ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
9362 && h->root.type == bfd_link_hash_undefweak))
b49e97c9 9363 {
1bbce132
MR
9364 bfd_boolean micromips_p = MICROMIPS_P (info->output_bfd);
9365 bfd_boolean newabi_p = NEWABI_P (info->output_bfd);
9366
9367 /* If this is the first symbol to need a PLT entry, then make some
07d6d2b8
AM
9368 basic setup. Also work out PLT entry sizes. We'll need them
9369 for PLT offset calculations. */
1bbce132 9370 if (htab->plt_mips_offset + htab->plt_comp_offset == 0)
861fb55a 9371 {
ce558b89 9372 BFD_ASSERT (htab->root.sgotplt->size == 0);
1bbce132 9373 BFD_ASSERT (htab->plt_got_index == 0);
0a44bf69 9374
861fb55a
DJ
9375 /* If we're using the PLT additions to the psABI, each PLT
9376 entry is 16 bytes and the PLT0 entry is 32 bytes.
9377 Encourage better cache usage by aligning. We do this
9378 lazily to avoid pessimizing traditional objects. */
9379 if (!htab->is_vxworks
fd361982 9380 && !bfd_set_section_alignment (htab->root.splt, 5))
861fb55a 9381 return FALSE;
0a44bf69 9382
861fb55a
DJ
9383 /* Make sure that .got.plt is word-aligned. We do this lazily
9384 for the same reason as above. */
fd361982 9385 if (!bfd_set_section_alignment (htab->root.sgotplt,
861fb55a
DJ
9386 MIPS_ELF_LOG_FILE_ALIGN (dynobj)))
9387 return FALSE;
0a44bf69 9388
861fb55a
DJ
9389 /* On non-VxWorks targets, the first two entries in .got.plt
9390 are reserved. */
9391 if (!htab->is_vxworks)
1bbce132
MR
9392 htab->plt_got_index
9393 += (get_elf_backend_data (dynobj)->got_header_size
9394 / MIPS_ELF_GOT_SIZE (dynobj));
0a44bf69 9395
861fb55a
DJ
9396 /* On VxWorks, also allocate room for the header's
9397 .rela.plt.unloaded entries. */
0e1862bb 9398 if (htab->is_vxworks && !bfd_link_pic (info))
0a44bf69 9399 htab->srelplt2->size += 2 * sizeof (Elf32_External_Rela);
1bbce132
MR
9400
9401 /* Now work out the sizes of individual PLT entries. */
0e1862bb 9402 if (htab->is_vxworks && bfd_link_pic (info))
1bbce132
MR
9403 htab->plt_mips_entry_size
9404 = 4 * ARRAY_SIZE (mips_vxworks_shared_plt_entry);
9405 else if (htab->is_vxworks)
9406 htab->plt_mips_entry_size
9407 = 4 * ARRAY_SIZE (mips_vxworks_exec_plt_entry);
9408 else if (newabi_p)
9409 htab->plt_mips_entry_size
9410 = 4 * ARRAY_SIZE (mips_exec_plt_entry);
833794fc 9411 else if (!micromips_p)
1bbce132
MR
9412 {
9413 htab->plt_mips_entry_size
9414 = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9415 htab->plt_comp_entry_size
833794fc
MR
9416 = 2 * ARRAY_SIZE (mips16_o32_exec_plt_entry);
9417 }
9418 else if (htab->insn32)
9419 {
9420 htab->plt_mips_entry_size
9421 = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9422 htab->plt_comp_entry_size
9423 = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt_entry);
1bbce132
MR
9424 }
9425 else
9426 {
9427 htab->plt_mips_entry_size
9428 = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9429 htab->plt_comp_entry_size
833794fc 9430 = 2 * ARRAY_SIZE (micromips_o32_exec_plt_entry);
1bbce132 9431 }
0a44bf69
RS
9432 }
9433
1bbce132
MR
9434 if (h->plt.plist == NULL)
9435 h->plt.plist = mips_elf_make_plt_record (dynobj);
9436 if (h->plt.plist == NULL)
9437 return FALSE;
9438
9439 /* There are no defined MIPS16 or microMIPS PLT entries for VxWorks,
07d6d2b8 9440 n32 or n64, so always use a standard entry there.
1bbce132 9441
07d6d2b8
AM
9442 If the symbol has a MIPS16 call stub and gets a PLT entry, then
9443 all MIPS16 calls will go via that stub, and there is no benefit
9444 to having a MIPS16 entry. And in the case of call_stub a
9445 standard entry actually has to be used as the stub ends with a J
9446 instruction. */
1bbce132
MR
9447 if (newabi_p
9448 || htab->is_vxworks
9449 || hmips->call_stub
9450 || hmips->call_fp_stub)
9451 {
9452 h->plt.plist->need_mips = TRUE;
9453 h->plt.plist->need_comp = FALSE;
9454 }
9455
9456 /* Otherwise, if there are no direct calls to the function, we
07d6d2b8
AM
9457 have a free choice of whether to use standard or compressed
9458 entries. Prefer microMIPS entries if the object is known to
9459 contain microMIPS code, so that it becomes possible to create
9460 pure microMIPS binaries. Prefer standard entries otherwise,
9461 because MIPS16 ones are no smaller and are usually slower. */
1bbce132
MR
9462 if (!h->plt.plist->need_mips && !h->plt.plist->need_comp)
9463 {
9464 if (micromips_p)
9465 h->plt.plist->need_comp = TRUE;
9466 else
9467 h->plt.plist->need_mips = TRUE;
9468 }
9469
9470 if (h->plt.plist->need_mips)
9471 {
9472 h->plt.plist->mips_offset = htab->plt_mips_offset;
9473 htab->plt_mips_offset += htab->plt_mips_entry_size;
9474 }
9475 if (h->plt.plist->need_comp)
9476 {
9477 h->plt.plist->comp_offset = htab->plt_comp_offset;
9478 htab->plt_comp_offset += htab->plt_comp_entry_size;
9479 }
9480
9481 /* Reserve the corresponding .got.plt entry now too. */
9482 h->plt.plist->gotplt_index = htab->plt_got_index++;
0a44bf69
RS
9483
9484 /* If the output file has no definition of the symbol, set the
861fb55a 9485 symbol's value to the address of the stub. */
0e1862bb 9486 if (!bfd_link_pic (info) && !h->def_regular)
1bbce132 9487 hmips->use_plt_entry = TRUE;
0a44bf69 9488
1bbce132 9489 /* Make room for the R_MIPS_JUMP_SLOT relocation. */
ce558b89
AM
9490 htab->root.srelplt->size += (htab->is_vxworks
9491 ? MIPS_ELF_RELA_SIZE (dynobj)
9492 : MIPS_ELF_REL_SIZE (dynobj));
0a44bf69
RS
9493
9494 /* Make room for the .rela.plt.unloaded relocations. */
0e1862bb 9495 if (htab->is_vxworks && !bfd_link_pic (info))
0a44bf69
RS
9496 htab->srelplt2->size += 3 * sizeof (Elf32_External_Rela);
9497
861fb55a
DJ
9498 /* All relocations against this symbol that could have been made
9499 dynamic will now refer to the PLT entry instead. */
9500 hmips->possibly_dynamic_relocs = 0;
0a44bf69 9501
0a44bf69
RS
9502 return TRUE;
9503 }
9504
9505 /* If this is a weak symbol, and there is a real definition, the
9506 processor independent code will have arranged for us to see the
9507 real definition first, and we can just use the same value. */
60d67dc8 9508 if (h->is_weakalias)
0a44bf69 9509 {
60d67dc8
AM
9510 struct elf_link_hash_entry *def = weakdef (h);
9511 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
9512 h->root.u.def.section = def->root.u.def.section;
9513 h->root.u.def.value = def->root.u.def.value;
0a44bf69
RS
9514 return TRUE;
9515 }
9516
861fb55a
DJ
9517 /* Otherwise, there is nothing further to do for symbols defined
9518 in regular objects. */
9519 if (h->def_regular)
0a44bf69
RS
9520 return TRUE;
9521
861fb55a
DJ
9522 /* There's also nothing more to do if we'll convert all relocations
9523 against this symbol into dynamic relocations. */
9524 if (!hmips->has_static_relocs)
9525 return TRUE;
9526
9527 /* We're now relying on copy relocations. Complain if we have
9528 some that we can't convert. */
0e1862bb 9529 if (!htab->use_plts_and_copy_relocs || bfd_link_pic (info))
861fb55a 9530 {
4eca0228
AM
9531 _bfd_error_handler (_("non-dynamic relocations refer to "
9532 "dynamic symbol %s"),
9533 h->root.root.string);
861fb55a
DJ
9534 bfd_set_error (bfd_error_bad_value);
9535 return FALSE;
9536 }
9537
0a44bf69
RS
9538 /* We must allocate the symbol in our .dynbss section, which will
9539 become part of the .bss section of the executable. There will be
9540 an entry for this symbol in the .dynsym section. The dynamic
9541 object will contain position independent code, so all references
9542 from the dynamic object to this symbol will go through the global
9543 offset table. The dynamic linker will use the .dynsym entry to
9544 determine the address it must put in the global offset table, so
9545 both the dynamic object and the regular object will refer to the
9546 same memory location for the variable. */
9547
5474d94f
AM
9548 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
9549 {
9550 s = htab->root.sdynrelro;
9551 srel = htab->root.sreldynrelro;
9552 }
9553 else
9554 {
9555 s = htab->root.sdynbss;
9556 srel = htab->root.srelbss;
9557 }
0a44bf69
RS
9558 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
9559 {
861fb55a 9560 if (htab->is_vxworks)
5474d94f 9561 srel->size += sizeof (Elf32_External_Rela);
861fb55a
DJ
9562 else
9563 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
0a44bf69
RS
9564 h->needs_copy = 1;
9565 }
9566
861fb55a
DJ
9567 /* All relocations against this symbol that could have been made
9568 dynamic will now refer to the local copy instead. */
9569 hmips->possibly_dynamic_relocs = 0;
9570
5474d94f 9571 return _bfd_elf_adjust_dynamic_copy (info, h, s);
0a44bf69 9572}
b49e97c9
TS
9573\f
9574/* This function is called after all the input files have been read,
9575 and the input sections have been assigned to output sections. We
9576 check for any mips16 stub sections that we can discard. */
9577
b34976b6 9578bfd_boolean
9719ad41
RS
9579_bfd_mips_elf_always_size_sections (bfd *output_bfd,
9580 struct bfd_link_info *info)
b49e97c9 9581{
351cdf24 9582 asection *sect;
0a44bf69 9583 struct mips_elf_link_hash_table *htab;
861fb55a 9584 struct mips_htab_traverse_info hti;
0a44bf69
RS
9585
9586 htab = mips_elf_hash_table (info);
4dfe6ac6 9587 BFD_ASSERT (htab != NULL);
f4416af6 9588
b49e97c9 9589 /* The .reginfo section has a fixed size. */
351cdf24
MF
9590 sect = bfd_get_section_by_name (output_bfd, ".reginfo");
9591 if (sect != NULL)
6798f8bf 9592 {
fd361982 9593 bfd_set_section_size (sect, sizeof (Elf32_External_RegInfo));
6798f8bf
MR
9594 sect->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
9595 }
351cdf24
MF
9596
9597 /* The .MIPS.abiflags section has a fixed size. */
9598 sect = bfd_get_section_by_name (output_bfd, ".MIPS.abiflags");
9599 if (sect != NULL)
6798f8bf 9600 {
fd361982 9601 bfd_set_section_size (sect, sizeof (Elf_External_ABIFlags_v0));
6798f8bf
MR
9602 sect->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
9603 }
b49e97c9 9604
861fb55a
DJ
9605 hti.info = info;
9606 hti.output_bfd = output_bfd;
9607 hti.error = FALSE;
9608 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
9609 mips_elf_check_symbols, &hti);
9610 if (hti.error)
9611 return FALSE;
f4416af6 9612
33bb52fb
RS
9613 return TRUE;
9614}
9615
9616/* If the link uses a GOT, lay it out and work out its size. */
9617
9618static bfd_boolean
9619mips_elf_lay_out_got (bfd *output_bfd, struct bfd_link_info *info)
9620{
9621 bfd *dynobj;
9622 asection *s;
9623 struct mips_got_info *g;
33bb52fb
RS
9624 bfd_size_type loadable_size = 0;
9625 bfd_size_type page_gotno;
d7206569 9626 bfd *ibfd;
ab361d49 9627 struct mips_elf_traverse_got_arg tga;
33bb52fb
RS
9628 struct mips_elf_link_hash_table *htab;
9629
9630 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9631 BFD_ASSERT (htab != NULL);
9632
ce558b89 9633 s = htab->root.sgot;
f4416af6 9634 if (s == NULL)
b34976b6 9635 return TRUE;
b49e97c9 9636
33bb52fb 9637 dynobj = elf_hash_table (info)->dynobj;
a8028dd0
RS
9638 g = htab->got_info;
9639
861fb55a
DJ
9640 /* Allocate room for the reserved entries. VxWorks always reserves
9641 3 entries; other objects only reserve 2 entries. */
cb22ccf4 9642 BFD_ASSERT (g->assigned_low_gotno == 0);
861fb55a
DJ
9643 if (htab->is_vxworks)
9644 htab->reserved_gotno = 3;
9645 else
9646 htab->reserved_gotno = 2;
9647 g->local_gotno += htab->reserved_gotno;
cb22ccf4 9648 g->assigned_low_gotno = htab->reserved_gotno;
861fb55a 9649
6c42ddb9
RS
9650 /* Decide which symbols need to go in the global part of the GOT and
9651 count the number of reloc-only GOT symbols. */
020d7251 9652 mips_elf_link_hash_traverse (htab, mips_elf_count_got_symbols, info);
f4416af6 9653
13db6b44
RS
9654 if (!mips_elf_resolve_final_got_entries (info, g))
9655 return FALSE;
9656
33bb52fb
RS
9657 /* Calculate the total loadable size of the output. That
9658 will give us the maximum number of GOT_PAGE entries
9659 required. */
c72f2fb2 9660 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
33bb52fb
RS
9661 {
9662 asection *subsection;
5108fc1b 9663
d7206569 9664 for (subsection = ibfd->sections;
33bb52fb
RS
9665 subsection;
9666 subsection = subsection->next)
9667 {
9668 if ((subsection->flags & SEC_ALLOC) == 0)
9669 continue;
9670 loadable_size += ((subsection->size + 0xf)
9671 &~ (bfd_size_type) 0xf);
9672 }
9673 }
f4416af6 9674
0a44bf69 9675 if (htab->is_vxworks)
738e5348 9676 /* There's no need to allocate page entries for VxWorks; R_MIPS*_GOT16
0a44bf69
RS
9677 relocations against local symbols evaluate to "G", and the EABI does
9678 not include R_MIPS_GOT_PAGE. */
c224138d 9679 page_gotno = 0;
0a44bf69
RS
9680 else
9681 /* Assume there are two loadable segments consisting of contiguous
9682 sections. Is 5 enough? */
c224138d
RS
9683 page_gotno = (loadable_size >> 16) + 5;
9684
13db6b44 9685 /* Choose the smaller of the two page estimates; both are intended to be
c224138d
RS
9686 conservative. */
9687 if (page_gotno > g->page_gotno)
9688 page_gotno = g->page_gotno;
f4416af6 9689
c224138d 9690 g->local_gotno += page_gotno;
cb22ccf4 9691 g->assigned_high_gotno = g->local_gotno - 1;
ab361d49 9692
ab361d49
RS
9693 s->size += g->local_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
9694 s->size += g->global_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
0f20cc35
DJ
9695 s->size += g->tls_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
9696
0a44bf69
RS
9697 /* VxWorks does not support multiple GOTs. It initializes $gp to
9698 __GOTT_BASE__[__GOTT_INDEX__], the value of which is set by the
9699 dynamic loader. */
57093f5e 9700 if (!htab->is_vxworks && s->size > MIPS_ELF_GOT_MAX_SIZE (info))
0f20cc35 9701 {
a8028dd0 9702 if (!mips_elf_multi_got (output_bfd, info, s, page_gotno))
0f20cc35
DJ
9703 return FALSE;
9704 }
9705 else
9706 {
d7206569
RS
9707 /* Record that all bfds use G. This also has the effect of freeing
9708 the per-bfd GOTs, which we no longer need. */
c72f2fb2 9709 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
d7206569
RS
9710 if (mips_elf_bfd_got (ibfd, FALSE))
9711 mips_elf_replace_bfd_got (ibfd, g);
9712 mips_elf_replace_bfd_got (output_bfd, g);
9713
33bb52fb 9714 /* Set up TLS entries. */
0f20cc35 9715 g->tls_assigned_gotno = g->global_gotno + g->local_gotno;
72e7511a
RS
9716 tga.info = info;
9717 tga.g = g;
9718 tga.value = MIPS_ELF_GOT_SIZE (output_bfd);
9719 htab_traverse (g->got_entries, mips_elf_initialize_tls_index, &tga);
9720 if (!tga.g)
9721 return FALSE;
1fd20d70
RS
9722 BFD_ASSERT (g->tls_assigned_gotno
9723 == g->global_gotno + g->local_gotno + g->tls_gotno);
33bb52fb 9724
57093f5e 9725 /* Each VxWorks GOT entry needs an explicit relocation. */
0e1862bb 9726 if (htab->is_vxworks && bfd_link_pic (info))
57093f5e
RS
9727 g->relocs += g->global_gotno + g->local_gotno - htab->reserved_gotno;
9728
33bb52fb 9729 /* Allocate room for the TLS relocations. */
ab361d49
RS
9730 if (g->relocs)
9731 mips_elf_allocate_dynamic_relocations (dynobj, info, g->relocs);
0f20cc35 9732 }
b49e97c9 9733
b34976b6 9734 return TRUE;
b49e97c9
TS
9735}
9736
33bb52fb
RS
9737/* Estimate the size of the .MIPS.stubs section. */
9738
9739static void
9740mips_elf_estimate_stub_size (bfd *output_bfd, struct bfd_link_info *info)
9741{
9742 struct mips_elf_link_hash_table *htab;
9743 bfd_size_type dynsymcount;
9744
9745 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9746 BFD_ASSERT (htab != NULL);
9747
33bb52fb
RS
9748 if (htab->lazy_stub_count == 0)
9749 return;
9750
9751 /* IRIX rld assumes that a function stub isn't at the end of the .text
9752 section, so add a dummy entry to the end. */
9753 htab->lazy_stub_count++;
9754
9755 /* Get a worst-case estimate of the number of dynamic symbols needed.
9756 At this point, dynsymcount does not account for section symbols
9757 and count_section_dynsyms may overestimate the number that will
9758 be needed. */
9759 dynsymcount = (elf_hash_table (info)->dynsymcount
9760 + count_section_dynsyms (output_bfd, info));
9761
1bbce132
MR
9762 /* Determine the size of one stub entry. There's no disadvantage
9763 from using microMIPS code here, so for the sake of pure-microMIPS
9764 binaries we prefer it whenever there's any microMIPS code in
9765 output produced at all. This has a benefit of stubs being
833794fc
MR
9766 shorter by 4 bytes each too, unless in the insn32 mode. */
9767 if (!MICROMIPS_P (output_bfd))
1bbce132
MR
9768 htab->function_stub_size = (dynsymcount > 0x10000
9769 ? MIPS_FUNCTION_STUB_BIG_SIZE
9770 : MIPS_FUNCTION_STUB_NORMAL_SIZE);
833794fc
MR
9771 else if (htab->insn32)
9772 htab->function_stub_size = (dynsymcount > 0x10000
9773 ? MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE
9774 : MICROMIPS_INSN32_FUNCTION_STUB_NORMAL_SIZE);
9775 else
9776 htab->function_stub_size = (dynsymcount > 0x10000
9777 ? MICROMIPS_FUNCTION_STUB_BIG_SIZE
9778 : MICROMIPS_FUNCTION_STUB_NORMAL_SIZE);
33bb52fb
RS
9779
9780 htab->sstubs->size = htab->lazy_stub_count * htab->function_stub_size;
9781}
9782
1bbce132
MR
9783/* A mips_elf_link_hash_traverse callback for which DATA points to a
9784 mips_htab_traverse_info. If H needs a traditional MIPS lazy-binding
9785 stub, allocate an entry in the stubs section. */
33bb52fb
RS
9786
9787static bfd_boolean
af924177 9788mips_elf_allocate_lazy_stub (struct mips_elf_link_hash_entry *h, void *data)
33bb52fb 9789{
1bbce132 9790 struct mips_htab_traverse_info *hti = data;
33bb52fb 9791 struct mips_elf_link_hash_table *htab;
1bbce132
MR
9792 struct bfd_link_info *info;
9793 bfd *output_bfd;
9794
9795 info = hti->info;
9796 output_bfd = hti->output_bfd;
9797 htab = mips_elf_hash_table (info);
9798 BFD_ASSERT (htab != NULL);
33bb52fb 9799
33bb52fb
RS
9800 if (h->needs_lazy_stub)
9801 {
1bbce132
MR
9802 bfd_boolean micromips_p = MICROMIPS_P (output_bfd);
9803 unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9804 bfd_vma isa_bit = micromips_p;
9805
9806 BFD_ASSERT (htab->root.dynobj != NULL);
9807 if (h->root.plt.plist == NULL)
9808 h->root.plt.plist = mips_elf_make_plt_record (htab->sstubs->owner);
9809 if (h->root.plt.plist == NULL)
9810 {
9811 hti->error = TRUE;
9812 return FALSE;
9813 }
33bb52fb 9814 h->root.root.u.def.section = htab->sstubs;
1bbce132
MR
9815 h->root.root.u.def.value = htab->sstubs->size + isa_bit;
9816 h->root.plt.plist->stub_offset = htab->sstubs->size;
9817 h->root.other = other;
33bb52fb
RS
9818 htab->sstubs->size += htab->function_stub_size;
9819 }
9820 return TRUE;
9821}
9822
9823/* Allocate offsets in the stubs section to each symbol that needs one.
9824 Set the final size of the .MIPS.stub section. */
9825
1bbce132 9826static bfd_boolean
33bb52fb
RS
9827mips_elf_lay_out_lazy_stubs (struct bfd_link_info *info)
9828{
1bbce132
MR
9829 bfd *output_bfd = info->output_bfd;
9830 bfd_boolean micromips_p = MICROMIPS_P (output_bfd);
9831 unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9832 bfd_vma isa_bit = micromips_p;
33bb52fb 9833 struct mips_elf_link_hash_table *htab;
1bbce132
MR
9834 struct mips_htab_traverse_info hti;
9835 struct elf_link_hash_entry *h;
9836 bfd *dynobj;
33bb52fb
RS
9837
9838 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9839 BFD_ASSERT (htab != NULL);
9840
33bb52fb 9841 if (htab->lazy_stub_count == 0)
1bbce132 9842 return TRUE;
33bb52fb
RS
9843
9844 htab->sstubs->size = 0;
1bbce132
MR
9845 hti.info = info;
9846 hti.output_bfd = output_bfd;
9847 hti.error = FALSE;
9848 mips_elf_link_hash_traverse (htab, mips_elf_allocate_lazy_stub, &hti);
9849 if (hti.error)
9850 return FALSE;
33bb52fb
RS
9851 htab->sstubs->size += htab->function_stub_size;
9852 BFD_ASSERT (htab->sstubs->size
9853 == htab->lazy_stub_count * htab->function_stub_size);
1bbce132
MR
9854
9855 dynobj = elf_hash_table (info)->dynobj;
9856 BFD_ASSERT (dynobj != NULL);
9857 h = _bfd_elf_define_linkage_sym (dynobj, info, htab->sstubs, "_MIPS_STUBS_");
9858 if (h == NULL)
9859 return FALSE;
9860 h->root.u.def.value = isa_bit;
9861 h->other = other;
9862 h->type = STT_FUNC;
9863
9864 return TRUE;
9865}
9866
9867/* A mips_elf_link_hash_traverse callback for which DATA points to a
9868 bfd_link_info. If H uses the address of a PLT entry as the value
9869 of the symbol, then set the entry in the symbol table now. Prefer
9870 a standard MIPS PLT entry. */
9871
9872static bfd_boolean
9873mips_elf_set_plt_sym_value (struct mips_elf_link_hash_entry *h, void *data)
9874{
9875 struct bfd_link_info *info = data;
9876 bfd_boolean micromips_p = MICROMIPS_P (info->output_bfd);
9877 struct mips_elf_link_hash_table *htab;
9878 unsigned int other;
9879 bfd_vma isa_bit;
9880 bfd_vma val;
9881
9882 htab = mips_elf_hash_table (info);
9883 BFD_ASSERT (htab != NULL);
9884
9885 if (h->use_plt_entry)
9886 {
9887 BFD_ASSERT (h->root.plt.plist != NULL);
9888 BFD_ASSERT (h->root.plt.plist->mips_offset != MINUS_ONE
9889 || h->root.plt.plist->comp_offset != MINUS_ONE);
9890
9891 val = htab->plt_header_size;
9892 if (h->root.plt.plist->mips_offset != MINUS_ONE)
9893 {
9894 isa_bit = 0;
9895 val += h->root.plt.plist->mips_offset;
9896 other = 0;
9897 }
9898 else
9899 {
9900 isa_bit = 1;
9901 val += htab->plt_mips_offset + h->root.plt.plist->comp_offset;
9902 other = micromips_p ? STO_MICROMIPS : STO_MIPS16;
9903 }
9904 val += isa_bit;
9905 /* For VxWorks, point at the PLT load stub rather than the lazy
07d6d2b8
AM
9906 resolution stub; this stub will become the canonical function
9907 address. */
1bbce132
MR
9908 if (htab->is_vxworks)
9909 val += 8;
9910
ce558b89 9911 h->root.root.u.def.section = htab->root.splt;
1bbce132
MR
9912 h->root.root.u.def.value = val;
9913 h->root.other = other;
9914 }
9915
9916 return TRUE;
33bb52fb
RS
9917}
9918
b49e97c9
TS
9919/* Set the sizes of the dynamic sections. */
9920
b34976b6 9921bfd_boolean
9719ad41
RS
9922_bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
9923 struct bfd_link_info *info)
b49e97c9
TS
9924{
9925 bfd *dynobj;
861fb55a 9926 asection *s, *sreldyn;
b34976b6 9927 bfd_boolean reltext;
0a44bf69 9928 struct mips_elf_link_hash_table *htab;
b49e97c9 9929
0a44bf69 9930 htab = mips_elf_hash_table (info);
4dfe6ac6 9931 BFD_ASSERT (htab != NULL);
b49e97c9
TS
9932 dynobj = elf_hash_table (info)->dynobj;
9933 BFD_ASSERT (dynobj != NULL);
9934
9935 if (elf_hash_table (info)->dynamic_sections_created)
9936 {
9937 /* Set the contents of the .interp section to the interpreter. */
9b8b325a 9938 if (bfd_link_executable (info) && !info->nointerp)
b49e97c9 9939 {
3d4d4302 9940 s = bfd_get_linker_section (dynobj, ".interp");
b49e97c9 9941 BFD_ASSERT (s != NULL);
eea6121a 9942 s->size
b49e97c9
TS
9943 = strlen (ELF_DYNAMIC_INTERPRETER (output_bfd)) + 1;
9944 s->contents
9945 = (bfd_byte *) ELF_DYNAMIC_INTERPRETER (output_bfd);
9946 }
861fb55a 9947
1bbce132 9948 /* Figure out the size of the PLT header if we know that we
07d6d2b8
AM
9949 are using it. For the sake of cache alignment always use
9950 a standard header whenever any standard entries are present
9951 even if microMIPS entries are present as well. This also
9952 lets the microMIPS header rely on the value of $v0 only set
9953 by microMIPS entries, for a small size reduction.
1bbce132 9954
07d6d2b8
AM
9955 Set symbol table entry values for symbols that use the
9956 address of their PLT entry now that we can calculate it.
1bbce132 9957
07d6d2b8
AM
9958 Also create the _PROCEDURE_LINKAGE_TABLE_ symbol if we
9959 haven't already in _bfd_elf_create_dynamic_sections. */
ce558b89 9960 if (htab->root.splt && htab->plt_mips_offset + htab->plt_comp_offset != 0)
861fb55a 9961 {
1bbce132
MR
9962 bfd_boolean micromips_p = (MICROMIPS_P (output_bfd)
9963 && !htab->plt_mips_offset);
9964 unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9965 bfd_vma isa_bit = micromips_p;
861fb55a 9966 struct elf_link_hash_entry *h;
1bbce132 9967 bfd_vma size;
861fb55a
DJ
9968
9969 BFD_ASSERT (htab->use_plts_and_copy_relocs);
ce558b89
AM
9970 BFD_ASSERT (htab->root.sgotplt->size == 0);
9971 BFD_ASSERT (htab->root.splt->size == 0);
1bbce132 9972
0e1862bb 9973 if (htab->is_vxworks && bfd_link_pic (info))
1bbce132
MR
9974 size = 4 * ARRAY_SIZE (mips_vxworks_shared_plt0_entry);
9975 else if (htab->is_vxworks)
9976 size = 4 * ARRAY_SIZE (mips_vxworks_exec_plt0_entry);
9977 else if (ABI_64_P (output_bfd))
9978 size = 4 * ARRAY_SIZE (mips_n64_exec_plt0_entry);
9979 else if (ABI_N32_P (output_bfd))
9980 size = 4 * ARRAY_SIZE (mips_n32_exec_plt0_entry);
9981 else if (!micromips_p)
9982 size = 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry);
833794fc
MR
9983 else if (htab->insn32)
9984 size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry);
1bbce132
MR
9985 else
9986 size = 2 * ARRAY_SIZE (micromips_o32_exec_plt0_entry);
861fb55a 9987
1bbce132
MR
9988 htab->plt_header_is_comp = micromips_p;
9989 htab->plt_header_size = size;
ce558b89
AM
9990 htab->root.splt->size = (size
9991 + htab->plt_mips_offset
9992 + htab->plt_comp_offset);
9993 htab->root.sgotplt->size = (htab->plt_got_index
9994 * MIPS_ELF_GOT_SIZE (dynobj));
1bbce132
MR
9995
9996 mips_elf_link_hash_traverse (htab, mips_elf_set_plt_sym_value, info);
9997
9998 if (htab->root.hplt == NULL)
9999 {
ce558b89 10000 h = _bfd_elf_define_linkage_sym (dynobj, info, htab->root.splt,
1bbce132
MR
10001 "_PROCEDURE_LINKAGE_TABLE_");
10002 htab->root.hplt = h;
10003 if (h == NULL)
10004 return FALSE;
10005 }
10006
10007 h = htab->root.hplt;
10008 h->root.u.def.value = isa_bit;
10009 h->other = other;
861fb55a
DJ
10010 h->type = STT_FUNC;
10011 }
10012 }
4e41d0d7 10013
9a59ad6b 10014 /* Allocate space for global sym dynamic relocs. */
2c3fc389 10015 elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
9a59ad6b 10016
33bb52fb
RS
10017 mips_elf_estimate_stub_size (output_bfd, info);
10018
10019 if (!mips_elf_lay_out_got (output_bfd, info))
10020 return FALSE;
10021
10022 mips_elf_lay_out_lazy_stubs (info);
10023
b49e97c9
TS
10024 /* The check_relocs and adjust_dynamic_symbol entry points have
10025 determined the sizes of the various dynamic sections. Allocate
10026 memory for them. */
b34976b6 10027 reltext = FALSE;
b49e97c9
TS
10028 for (s = dynobj->sections; s != NULL; s = s->next)
10029 {
10030 const char *name;
b49e97c9
TS
10031
10032 /* It's OK to base decisions on the section name, because none
10033 of the dynobj section names depend upon the input files. */
fd361982 10034 name = bfd_section_name (s);
b49e97c9
TS
10035
10036 if ((s->flags & SEC_LINKER_CREATED) == 0)
10037 continue;
10038
0112cd26 10039 if (CONST_STRNEQ (name, ".rel"))
b49e97c9 10040 {
c456f082 10041 if (s->size != 0)
b49e97c9
TS
10042 {
10043 const char *outname;
10044 asection *target;
10045
10046 /* If this relocation section applies to a read only
07d6d2b8
AM
10047 section, then we probably need a DT_TEXTREL entry.
10048 If the relocation section is .rel(a).dyn, we always
10049 assert a DT_TEXTREL entry rather than testing whether
10050 there exists a relocation to a read only section or
10051 not. */
fd361982 10052 outname = bfd_section_name (s->output_section);
b49e97c9
TS
10053 target = bfd_get_section_by_name (output_bfd, outname + 4);
10054 if ((target != NULL
10055 && (target->flags & SEC_READONLY) != 0
10056 && (target->flags & SEC_ALLOC) != 0)
0a44bf69 10057 || strcmp (outname, MIPS_ELF_REL_DYN_NAME (info)) == 0)
b34976b6 10058 reltext = TRUE;
b49e97c9
TS
10059
10060 /* We use the reloc_count field as a counter if we need
10061 to copy relocs into the output file. */
0a44bf69 10062 if (strcmp (name, MIPS_ELF_REL_DYN_NAME (info)) != 0)
b49e97c9 10063 s->reloc_count = 0;
f4416af6
AO
10064
10065 /* If combreloc is enabled, elf_link_sort_relocs() will
10066 sort relocations, but in a different way than we do,
10067 and before we're done creating relocations. Also, it
10068 will move them around between input sections'
10069 relocation's contents, so our sorting would be
10070 broken, so don't let it run. */
10071 info->combreloc = 0;
b49e97c9
TS
10072 }
10073 }
0e1862bb 10074 else if (bfd_link_executable (info)
b49e97c9 10075 && ! mips_elf_hash_table (info)->use_rld_obj_head
0112cd26 10076 && CONST_STRNEQ (name, ".rld_map"))
b49e97c9 10077 {
5108fc1b 10078 /* We add a room for __rld_map. It will be filled in by the
b49e97c9 10079 rtld to contain a pointer to the _r_debug structure. */
b4082c70 10080 s->size += MIPS_ELF_RLD_MAP_SIZE (output_bfd);
b49e97c9
TS
10081 }
10082 else if (SGI_COMPAT (output_bfd)
0112cd26 10083 && CONST_STRNEQ (name, ".compact_rel"))
eea6121a 10084 s->size += mips_elf_hash_table (info)->compact_rel_size;
ce558b89 10085 else if (s == htab->root.splt)
861fb55a
DJ
10086 {
10087 /* If the last PLT entry has a branch delay slot, allocate
6d30f5b2
NC
10088 room for an extra nop to fill the delay slot. This is
10089 for CPUs without load interlocking. */
10090 if (! LOAD_INTERLOCKS_P (output_bfd)
10091 && ! htab->is_vxworks && s->size > 0)
861fb55a
DJ
10092 s->size += 4;
10093 }
0112cd26 10094 else if (! CONST_STRNEQ (name, ".init")
ce558b89
AM
10095 && s != htab->root.sgot
10096 && s != htab->root.sgotplt
861fb55a 10097 && s != htab->sstubs
5474d94f
AM
10098 && s != htab->root.sdynbss
10099 && s != htab->root.sdynrelro)
b49e97c9
TS
10100 {
10101 /* It's not one of our sections, so don't allocate space. */
10102 continue;
10103 }
10104
c456f082 10105 if (s->size == 0)
b49e97c9 10106 {
8423293d 10107 s->flags |= SEC_EXCLUDE;
b49e97c9
TS
10108 continue;
10109 }
10110
c456f082
AM
10111 if ((s->flags & SEC_HAS_CONTENTS) == 0)
10112 continue;
10113
b49e97c9 10114 /* Allocate memory for the section contents. */
eea6121a 10115 s->contents = bfd_zalloc (dynobj, s->size);
c456f082 10116 if (s->contents == NULL)
b49e97c9
TS
10117 {
10118 bfd_set_error (bfd_error_no_memory);
b34976b6 10119 return FALSE;
b49e97c9
TS
10120 }
10121 }
10122
10123 if (elf_hash_table (info)->dynamic_sections_created)
10124 {
10125 /* Add some entries to the .dynamic section. We fill in the
10126 values later, in _bfd_mips_elf_finish_dynamic_sections, but we
10127 must add the entries now so that we get the correct size for
5750dcec 10128 the .dynamic section. */
af5978fb
RS
10129
10130 /* SGI object has the equivalence of DT_DEBUG in the
5750dcec 10131 DT_MIPS_RLD_MAP entry. This must come first because glibc
6e6be592
MR
10132 only fills in DT_MIPS_RLD_MAP (not DT_DEBUG) and some tools
10133 may only look at the first one they see. */
0e1862bb 10134 if (!bfd_link_pic (info)
af5978fb
RS
10135 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP, 0))
10136 return FALSE;
b49e97c9 10137
0e1862bb 10138 if (bfd_link_executable (info)
a5499fa4
MF
10139 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP_REL, 0))
10140 return FALSE;
10141
5750dcec
DJ
10142 /* The DT_DEBUG entry may be filled in by the dynamic linker and
10143 used by the debugger. */
0e1862bb 10144 if (bfd_link_executable (info)
5750dcec
DJ
10145 && !SGI_COMPAT (output_bfd)
10146 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_DEBUG, 0))
10147 return FALSE;
10148
0a44bf69 10149 if (reltext && (SGI_COMPAT (output_bfd) || htab->is_vxworks))
b49e97c9
TS
10150 info->flags |= DF_TEXTREL;
10151
10152 if ((info->flags & DF_TEXTREL) != 0)
10153 {
10154 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_TEXTREL, 0))
b34976b6 10155 return FALSE;
943284cc
DJ
10156
10157 /* Clear the DF_TEXTREL flag. It will be set again if we
10158 write out an actual text relocation; we may not, because
10159 at this point we do not know whether e.g. any .eh_frame
10160 absolute relocations have been converted to PC-relative. */
10161 info->flags &= ~DF_TEXTREL;
b49e97c9
TS
10162 }
10163
10164 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTGOT, 0))
b34976b6 10165 return FALSE;
b49e97c9 10166
861fb55a 10167 sreldyn = mips_elf_rel_dyn_section (info, FALSE);
0a44bf69 10168 if (htab->is_vxworks)
b49e97c9 10169 {
0a44bf69
RS
10170 /* VxWorks uses .rela.dyn instead of .rel.dyn. It does not
10171 use any of the DT_MIPS_* tags. */
861fb55a 10172 if (sreldyn && sreldyn->size > 0)
0a44bf69
RS
10173 {
10174 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELA, 0))
10175 return FALSE;
b49e97c9 10176
0a44bf69
RS
10177 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELASZ, 0))
10178 return FALSE;
b49e97c9 10179
0a44bf69
RS
10180 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELAENT, 0))
10181 return FALSE;
10182 }
b49e97c9 10183 }
0a44bf69
RS
10184 else
10185 {
db841b6f
MR
10186 if (sreldyn && sreldyn->size > 0
10187 && !bfd_is_abs_section (sreldyn->output_section))
0a44bf69
RS
10188 {
10189 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_REL, 0))
10190 return FALSE;
b49e97c9 10191
0a44bf69
RS
10192 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELSZ, 0))
10193 return FALSE;
b49e97c9 10194
0a44bf69
RS
10195 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELENT, 0))
10196 return FALSE;
10197 }
b49e97c9 10198
0a44bf69
RS
10199 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_VERSION, 0))
10200 return FALSE;
b49e97c9 10201
0a44bf69
RS
10202 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_FLAGS, 0))
10203 return FALSE;
b49e97c9 10204
0a44bf69
RS
10205 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_BASE_ADDRESS, 0))
10206 return FALSE;
b49e97c9 10207
0a44bf69
RS
10208 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_LOCAL_GOTNO, 0))
10209 return FALSE;
b49e97c9 10210
0a44bf69
RS
10211 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_SYMTABNO, 0))
10212 return FALSE;
b49e97c9 10213
0a44bf69
RS
10214 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_UNREFEXTNO, 0))
10215 return FALSE;
b49e97c9 10216
0a44bf69
RS
10217 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_GOTSYM, 0))
10218 return FALSE;
10219
f16a9783
MS
10220 if (info->emit_gnu_hash
10221 && ! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_XHASH, 0))
10222 return FALSE;
10223
0a44bf69
RS
10224 if (IRIX_COMPAT (dynobj) == ict_irix5
10225 && ! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_HIPAGENO, 0))
10226 return FALSE;
10227
10228 if (IRIX_COMPAT (dynobj) == ict_irix6
10229 && (bfd_get_section_by_name
af0edeb8 10230 (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (dynobj)))
0a44bf69
RS
10231 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_OPTIONS, 0))
10232 return FALSE;
10233 }
ce558b89 10234 if (htab->root.splt->size > 0)
861fb55a
DJ
10235 {
10236 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTREL, 0))
10237 return FALSE;
10238
10239 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_JMPREL, 0))
10240 return FALSE;
10241
10242 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTRELSZ, 0))
10243 return FALSE;
10244
10245 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_PLTGOT, 0))
10246 return FALSE;
10247 }
7a2b07ff
NS
10248 if (htab->is_vxworks
10249 && !elf_vxworks_add_dynamic_entries (output_bfd, info))
10250 return FALSE;
b49e97c9
TS
10251 }
10252
b34976b6 10253 return TRUE;
b49e97c9
TS
10254}
10255\f
81d43bff
RS
10256/* REL is a relocation in INPUT_BFD that is being copied to OUTPUT_BFD.
10257 Adjust its R_ADDEND field so that it is correct for the output file.
10258 LOCAL_SYMS and LOCAL_SECTIONS are arrays of INPUT_BFD's local symbols
10259 and sections respectively; both use symbol indexes. */
10260
10261static void
10262mips_elf_adjust_addend (bfd *output_bfd, struct bfd_link_info *info,
10263 bfd *input_bfd, Elf_Internal_Sym *local_syms,
10264 asection **local_sections, Elf_Internal_Rela *rel)
10265{
10266 unsigned int r_type, r_symndx;
10267 Elf_Internal_Sym *sym;
10268 asection *sec;
10269
020d7251 10270 if (mips_elf_local_relocation_p (input_bfd, rel, local_sections))
81d43bff
RS
10271 {
10272 r_type = ELF_R_TYPE (output_bfd, rel->r_info);
df58fc94 10273 if (gprel16_reloc_p (r_type)
81d43bff 10274 || r_type == R_MIPS_GPREL32
df58fc94 10275 || literal_reloc_p (r_type))
81d43bff
RS
10276 {
10277 rel->r_addend += _bfd_get_gp_value (input_bfd);
10278 rel->r_addend -= _bfd_get_gp_value (output_bfd);
10279 }
10280
10281 r_symndx = ELF_R_SYM (output_bfd, rel->r_info);
10282 sym = local_syms + r_symndx;
10283
10284 /* Adjust REL's addend to account for section merging. */
0e1862bb 10285 if (!bfd_link_relocatable (info))
81d43bff
RS
10286 {
10287 sec = local_sections[r_symndx];
10288 _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
10289 }
10290
10291 /* This would normally be done by the rela_normal code in elflink.c. */
10292 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
10293 rel->r_addend += local_sections[r_symndx]->output_offset;
10294 }
10295}
10296
545fd46b
MR
10297/* Handle relocations against symbols from removed linkonce sections,
10298 or sections discarded by a linker script. We use this wrapper around
10299 RELOC_AGAINST_DISCARDED_SECTION to handle triplets of compound relocs
10300 on 64-bit ELF targets. In this case for any relocation handled, which
10301 always be the first in a triplet, the remaining two have to be processed
10302 together with the first, even if they are R_MIPS_NONE. It is the symbol
10303 index referred by the first reloc that applies to all the three and the
10304 remaining two never refer to an object symbol. And it is the final
10305 relocation (the last non-null one) that determines the output field of
10306 the whole relocation so retrieve the corresponding howto structure for
10307 the relocatable field to be cleared by RELOC_AGAINST_DISCARDED_SECTION.
10308
10309 Note that RELOC_AGAINST_DISCARDED_SECTION is a macro that uses "continue"
10310 and therefore requires to be pasted in a loop. It also defines a block
10311 and does not protect any of its arguments, hence the extra brackets. */
10312
10313static void
10314mips_reloc_against_discarded_section (bfd *output_bfd,
10315 struct bfd_link_info *info,
10316 bfd *input_bfd, asection *input_section,
10317 Elf_Internal_Rela **rel,
10318 const Elf_Internal_Rela **relend,
10319 bfd_boolean rel_reloc,
10320 reloc_howto_type *howto,
10321 bfd_byte *contents)
10322{
10323 const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
10324 int count = bed->s->int_rels_per_ext_rel;
10325 unsigned int r_type;
10326 int i;
10327
10328 for (i = count - 1; i > 0; i--)
10329 {
10330 r_type = ELF_R_TYPE (output_bfd, (*rel)[i].r_info);
10331 if (r_type != R_MIPS_NONE)
10332 {
10333 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type, !rel_reloc);
10334 break;
10335 }
10336 }
10337 do
10338 {
10339 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
10340 (*rel), count, (*relend),
10341 howto, i, contents);
10342 }
10343 while (0);
10344}
10345
b49e97c9
TS
10346/* Relocate a MIPS ELF section. */
10347
b34976b6 10348bfd_boolean
9719ad41
RS
10349_bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
10350 bfd *input_bfd, asection *input_section,
10351 bfd_byte *contents, Elf_Internal_Rela *relocs,
10352 Elf_Internal_Sym *local_syms,
10353 asection **local_sections)
b49e97c9
TS
10354{
10355 Elf_Internal_Rela *rel;
10356 const Elf_Internal_Rela *relend;
10357 bfd_vma addend = 0;
b34976b6 10358 bfd_boolean use_saved_addend_p = FALSE;
b49e97c9 10359
056bafd4 10360 relend = relocs + input_section->reloc_count;
b49e97c9
TS
10361 for (rel = relocs; rel < relend; ++rel)
10362 {
10363 const char *name;
c9adbffe 10364 bfd_vma value = 0;
b49e97c9 10365 reloc_howto_type *howto;
ad3d9127 10366 bfd_boolean cross_mode_jump_p = FALSE;
b34976b6 10367 /* TRUE if the relocation is a RELA relocation, rather than a
07d6d2b8 10368 REL relocation. */
b34976b6 10369 bfd_boolean rela_relocation_p = TRUE;
b49e97c9 10370 unsigned int r_type = ELF_R_TYPE (output_bfd, rel->r_info);
9719ad41 10371 const char *msg;
ab96bf03
AM
10372 unsigned long r_symndx;
10373 asection *sec;
749b8d9d
L
10374 Elf_Internal_Shdr *symtab_hdr;
10375 struct elf_link_hash_entry *h;
d4730f92 10376 bfd_boolean rel_reloc;
b49e97c9 10377
d4730f92
BS
10378 rel_reloc = (NEWABI_P (input_bfd)
10379 && mips_elf_rel_relocation_p (input_bfd, input_section,
10380 relocs, rel));
b49e97c9 10381 /* Find the relocation howto for this relocation. */
d4730f92 10382 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type, !rel_reloc);
ab96bf03
AM
10383
10384 r_symndx = ELF_R_SYM (input_bfd, rel->r_info);
749b8d9d 10385 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
020d7251 10386 if (mips_elf_local_relocation_p (input_bfd, rel, local_sections))
749b8d9d
L
10387 {
10388 sec = local_sections[r_symndx];
10389 h = NULL;
10390 }
ab96bf03
AM
10391 else
10392 {
ab96bf03 10393 unsigned long extsymoff;
ab96bf03 10394
ab96bf03
AM
10395 extsymoff = 0;
10396 if (!elf_bad_symtab (input_bfd))
10397 extsymoff = symtab_hdr->sh_info;
10398 h = elf_sym_hashes (input_bfd) [r_symndx - extsymoff];
10399 while (h->root.type == bfd_link_hash_indirect
10400 || h->root.type == bfd_link_hash_warning)
10401 h = (struct elf_link_hash_entry *) h->root.u.i.link;
10402
10403 sec = NULL;
10404 if (h->root.type == bfd_link_hash_defined
10405 || h->root.type == bfd_link_hash_defweak)
10406 sec = h->root.u.def.section;
10407 }
10408
dbaa2011 10409 if (sec != NULL && discarded_section (sec))
545fd46b
MR
10410 {
10411 mips_reloc_against_discarded_section (output_bfd, info, input_bfd,
10412 input_section, &rel, &relend,
10413 rel_reloc, howto, contents);
10414 continue;
10415 }
ab96bf03 10416
4a14403c 10417 if (r_type == R_MIPS_64 && ! NEWABI_P (input_bfd))
b49e97c9
TS
10418 {
10419 /* Some 32-bit code uses R_MIPS_64. In particular, people use
10420 64-bit code, but make sure all their addresses are in the
10421 lowermost or uppermost 32-bit section of the 64-bit address
10422 space. Thus, when they use an R_MIPS_64 they mean what is
10423 usually meant by R_MIPS_32, with the exception that the
10424 stored value is sign-extended to 64 bits. */
b34976b6 10425 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, R_MIPS_32, FALSE);
b49e97c9
TS
10426
10427 /* On big-endian systems, we need to lie about the position
10428 of the reloc. */
10429 if (bfd_big_endian (input_bfd))
10430 rel->r_offset += 4;
10431 }
b49e97c9
TS
10432
10433 if (!use_saved_addend_p)
10434 {
b49e97c9
TS
10435 /* If these relocations were originally of the REL variety,
10436 we must pull the addend out of the field that will be
10437 relocated. Otherwise, we simply use the contents of the
c224138d
RS
10438 RELA relocation. */
10439 if (mips_elf_rel_relocation_p (input_bfd, input_section,
10440 relocs, rel))
b49e97c9 10441 {
b34976b6 10442 rela_relocation_p = FALSE;
c224138d
RS
10443 addend = mips_elf_read_rel_addend (input_bfd, rel,
10444 howto, contents);
738e5348
RS
10445 if (hi16_reloc_p (r_type)
10446 || (got16_reloc_p (r_type)
b49e97c9 10447 && mips_elf_local_relocation_p (input_bfd, rel,
020d7251 10448 local_sections)))
b49e97c9 10449 {
c224138d
RS
10450 if (!mips_elf_add_lo16_rel_addend (input_bfd, rel, relend,
10451 contents, &addend))
749b8d9d 10452 {
749b8d9d
L
10453 if (h)
10454 name = h->root.root.string;
10455 else
10456 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
10457 local_syms + r_symndx,
10458 sec);
4eca0228 10459 _bfd_error_handler
695344c0 10460 /* xgettext:c-format */
2c1c9679 10461 (_("%pB: can't find matching LO16 reloc against `%s'"
2dcf00ce 10462 " for %s at %#" PRIx64 " in section `%pA'"),
c08bb8dd 10463 input_bfd, name,
2dcf00ce 10464 howto->name, (uint64_t) rel->r_offset, input_section);
749b8d9d 10465 }
b49e97c9 10466 }
30ac9238
RS
10467 else
10468 addend <<= howto->rightshift;
b49e97c9
TS
10469 }
10470 else
10471 addend = rel->r_addend;
81d43bff
RS
10472 mips_elf_adjust_addend (output_bfd, info, input_bfd,
10473 local_syms, local_sections, rel);
b49e97c9
TS
10474 }
10475
0e1862bb 10476 if (bfd_link_relocatable (info))
b49e97c9 10477 {
4a14403c 10478 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd)
b49e97c9
TS
10479 && bfd_big_endian (input_bfd))
10480 rel->r_offset -= 4;
10481
81d43bff 10482 if (!rela_relocation_p && rel->r_addend)
5a659663 10483 {
81d43bff 10484 addend += rel->r_addend;
738e5348 10485 if (hi16_reloc_p (r_type) || got16_reloc_p (r_type))
5a659663
TS
10486 addend = mips_elf_high (addend);
10487 else if (r_type == R_MIPS_HIGHER)
10488 addend = mips_elf_higher (addend);
10489 else if (r_type == R_MIPS_HIGHEST)
10490 addend = mips_elf_highest (addend);
30ac9238
RS
10491 else
10492 addend >>= howto->rightshift;
b49e97c9 10493
30ac9238
RS
10494 /* We use the source mask, rather than the destination
10495 mask because the place to which we are writing will be
10496 source of the addend in the final link. */
b49e97c9
TS
10497 addend &= howto->src_mask;
10498
5a659663 10499 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
b49e97c9
TS
10500 /* See the comment above about using R_MIPS_64 in the 32-bit
10501 ABI. Here, we need to update the addend. It would be
10502 possible to get away with just using the R_MIPS_32 reloc
10503 but for endianness. */
10504 {
10505 bfd_vma sign_bits;
10506 bfd_vma low_bits;
10507 bfd_vma high_bits;
10508
10509 if (addend & ((bfd_vma) 1 << 31))
10510#ifdef BFD64
10511 sign_bits = ((bfd_vma) 1 << 32) - 1;
10512#else
10513 sign_bits = -1;
10514#endif
10515 else
10516 sign_bits = 0;
10517
10518 /* If we don't know that we have a 64-bit type,
10519 do two separate stores. */
10520 if (bfd_big_endian (input_bfd))
10521 {
10522 /* Store the sign-bits (which are most significant)
10523 first. */
10524 low_bits = sign_bits;
10525 high_bits = addend;
10526 }
10527 else
10528 {
10529 low_bits = addend;
10530 high_bits = sign_bits;
10531 }
10532 bfd_put_32 (input_bfd, low_bits,
10533 contents + rel->r_offset);
10534 bfd_put_32 (input_bfd, high_bits,
10535 contents + rel->r_offset + 4);
10536 continue;
10537 }
10538
10539 if (! mips_elf_perform_relocation (info, howto, rel, addend,
10540 input_bfd, input_section,
b34976b6
AM
10541 contents, FALSE))
10542 return FALSE;
b49e97c9
TS
10543 }
10544
10545 /* Go on to the next relocation. */
10546 continue;
10547 }
10548
10549 /* In the N32 and 64-bit ABIs there may be multiple consecutive
10550 relocations for the same offset. In that case we are
10551 supposed to treat the output of each relocation as the addend
10552 for the next. */
10553 if (rel + 1 < relend
10554 && rel->r_offset == rel[1].r_offset
10555 && ELF_R_TYPE (input_bfd, rel[1].r_info) != R_MIPS_NONE)
b34976b6 10556 use_saved_addend_p = TRUE;
b49e97c9 10557 else
b34976b6 10558 use_saved_addend_p = FALSE;
b49e97c9
TS
10559
10560 /* Figure out what value we are supposed to relocate. */
10561 switch (mips_elf_calculate_relocation (output_bfd, input_bfd,
47275900
MR
10562 input_section, contents,
10563 info, rel, addend, howto,
10564 local_syms, local_sections,
10565 &value, &name, &cross_mode_jump_p,
bce03d3d 10566 use_saved_addend_p))
b49e97c9
TS
10567 {
10568 case bfd_reloc_continue:
10569 /* There's nothing to do. */
10570 continue;
10571
10572 case bfd_reloc_undefined:
10573 /* mips_elf_calculate_relocation already called the
10574 undefined_symbol callback. There's no real point in
10575 trying to perform the relocation at this point, so we
10576 just skip ahead to the next relocation. */
10577 continue;
10578
10579 case bfd_reloc_notsupported:
10580 msg = _("internal error: unsupported relocation error");
10581 info->callbacks->warning
10582 (info, msg, name, input_bfd, input_section, rel->r_offset);
b34976b6 10583 return FALSE;
b49e97c9
TS
10584
10585 case bfd_reloc_overflow:
10586 if (use_saved_addend_p)
10587 /* Ignore overflow until we reach the last relocation for
10588 a given location. */
10589 ;
10590 else
10591 {
0e53d9da
AN
10592 struct mips_elf_link_hash_table *htab;
10593
10594 htab = mips_elf_hash_table (info);
4dfe6ac6 10595 BFD_ASSERT (htab != NULL);
b49e97c9 10596 BFD_ASSERT (name != NULL);
0e53d9da 10597 if (!htab->small_data_overflow_reported
9684f078 10598 && (gprel16_reloc_p (howto->type)
df58fc94 10599 || literal_reloc_p (howto->type)))
0e53d9da 10600 {
91d6fa6a
NC
10601 msg = _("small-data section exceeds 64KB;"
10602 " lower small-data size limit (see option -G)");
0e53d9da
AN
10603
10604 htab->small_data_overflow_reported = TRUE;
10605 (*info->callbacks->einfo) ("%P: %s\n", msg);
10606 }
1a72702b
AM
10607 (*info->callbacks->reloc_overflow)
10608 (info, NULL, name, howto->name, (bfd_vma) 0,
10609 input_bfd, input_section, rel->r_offset);
b49e97c9
TS
10610 }
10611 break;
10612
10613 case bfd_reloc_ok:
10614 break;
10615
df58fc94 10616 case bfd_reloc_outofrange:
7db9a74e 10617 msg = NULL;
df58fc94 10618 if (jal_reloc_p (howto->type))
9d862524 10619 msg = (cross_mode_jump_p
2c1c9679 10620 ? _("cannot convert a jump to JALX "
9d862524
MR
10621 "for a non-word-aligned address")
10622 : (howto->type == R_MIPS16_26
2c1c9679
AM
10623 ? _("jump to a non-word-aligned address")
10624 : _("jump to a non-instruction-aligned address")));
99aefae6 10625 else if (b_reloc_p (howto->type))
a6ebf616 10626 msg = (cross_mode_jump_p
2c1c9679 10627 ? _("cannot convert a branch to JALX "
a6ebf616 10628 "for a non-word-aligned address")
2c1c9679 10629 : _("branch to a non-instruction-aligned address"));
7db9a74e
MR
10630 else if (aligned_pcrel_reloc_p (howto->type))
10631 msg = _("PC-relative load from unaligned address");
10632 if (msg)
df58fc94 10633 {
de341542 10634 info->callbacks->einfo
ed53407e
MR
10635 ("%X%H: %s\n", input_bfd, input_section, rel->r_offset, msg);
10636 break;
7361da2c 10637 }
df58fc94
RS
10638 /* Fall through. */
10639
b49e97c9
TS
10640 default:
10641 abort ();
10642 break;
10643 }
10644
10645 /* If we've got another relocation for the address, keep going
10646 until we reach the last one. */
10647 if (use_saved_addend_p)
10648 {
10649 addend = value;
10650 continue;
10651 }
10652
4a14403c 10653 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
b49e97c9
TS
10654 /* See the comment above about using R_MIPS_64 in the 32-bit
10655 ABI. Until now, we've been using the HOWTO for R_MIPS_32;
10656 that calculated the right value. Now, however, we
10657 sign-extend the 32-bit result to 64-bits, and store it as a
10658 64-bit value. We are especially generous here in that we
10659 go to extreme lengths to support this usage on systems with
10660 only a 32-bit VMA. */
10661 {
10662 bfd_vma sign_bits;
10663 bfd_vma low_bits;
10664 bfd_vma high_bits;
10665
10666 if (value & ((bfd_vma) 1 << 31))
10667#ifdef BFD64
10668 sign_bits = ((bfd_vma) 1 << 32) - 1;
10669#else
10670 sign_bits = -1;
10671#endif
10672 else
10673 sign_bits = 0;
10674
10675 /* If we don't know that we have a 64-bit type,
10676 do two separate stores. */
10677 if (bfd_big_endian (input_bfd))
10678 {
10679 /* Undo what we did above. */
10680 rel->r_offset -= 4;
10681 /* Store the sign-bits (which are most significant)
10682 first. */
10683 low_bits = sign_bits;
10684 high_bits = value;
10685 }
10686 else
10687 {
10688 low_bits = value;
10689 high_bits = sign_bits;
10690 }
10691 bfd_put_32 (input_bfd, low_bits,
10692 contents + rel->r_offset);
10693 bfd_put_32 (input_bfd, high_bits,
10694 contents + rel->r_offset + 4);
10695 continue;
10696 }
10697
10698 /* Actually perform the relocation. */
10699 if (! mips_elf_perform_relocation (info, howto, rel, value,
10700 input_bfd, input_section,
38a7df63 10701 contents, cross_mode_jump_p))
b34976b6 10702 return FALSE;
b49e97c9
TS
10703 }
10704
b34976b6 10705 return TRUE;
b49e97c9
TS
10706}
10707\f
861fb55a
DJ
10708/* A function that iterates over each entry in la25_stubs and fills
10709 in the code for each one. DATA points to a mips_htab_traverse_info. */
10710
10711static int
10712mips_elf_create_la25_stub (void **slot, void *data)
10713{
10714 struct mips_htab_traverse_info *hti;
10715 struct mips_elf_link_hash_table *htab;
10716 struct mips_elf_la25_stub *stub;
10717 asection *s;
10718 bfd_byte *loc;
10719 bfd_vma offset, target, target_high, target_low;
3734320d
MF
10720 bfd_vma branch_pc;
10721 bfd_signed_vma pcrel_offset = 0;
861fb55a
DJ
10722
10723 stub = (struct mips_elf_la25_stub *) *slot;
10724 hti = (struct mips_htab_traverse_info *) data;
10725 htab = mips_elf_hash_table (hti->info);
4dfe6ac6 10726 BFD_ASSERT (htab != NULL);
861fb55a
DJ
10727
10728 /* Create the section contents, if we haven't already. */
10729 s = stub->stub_section;
10730 loc = s->contents;
10731 if (loc == NULL)
10732 {
10733 loc = bfd_malloc (s->size);
10734 if (loc == NULL)
10735 {
10736 hti->error = TRUE;
10737 return FALSE;
10738 }
10739 s->contents = loc;
10740 }
10741
10742 /* Work out where in the section this stub should go. */
10743 offset = stub->offset;
10744
3734320d
MF
10745 /* We add 8 here to account for the LUI/ADDIU instructions
10746 before the branch instruction. This cannot be moved down to
10747 where pcrel_offset is calculated as 's' is updated in
10748 mips_elf_get_la25_target. */
10749 branch_pc = s->output_section->vma + s->output_offset + offset + 8;
10750
861fb55a 10751 /* Work out the target address. */
8f0c309a
CLT
10752 target = mips_elf_get_la25_target (stub, &s);
10753 target += s->output_section->vma + s->output_offset;
10754
861fb55a
DJ
10755 target_high = ((target + 0x8000) >> 16) & 0xffff;
10756 target_low = (target & 0xffff);
10757
3734320d
MF
10758 /* Calculate the PC of the compact branch instruction (for the case where
10759 compact branches are used for either microMIPSR6 or MIPSR6 with
10760 compact branches. Add 4-bytes to account for BC using the PC of the
10761 next instruction as the base. */
10762 pcrel_offset = target - (branch_pc + 4);
10763
861fb55a
DJ
10764 if (stub->stub_section != htab->strampoline)
10765 {
df58fc94 10766 /* This is a simple LUI/ADDIU stub. Zero out the beginning
861fb55a
DJ
10767 of the section and write the two instructions at the end. */
10768 memset (loc, 0, offset);
10769 loc += offset;
df58fc94
RS
10770 if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
10771 {
d21911ea
MR
10772 bfd_put_micromips_32 (hti->output_bfd,
10773 LA25_LUI_MICROMIPS (target_high),
10774 loc);
10775 bfd_put_micromips_32 (hti->output_bfd,
10776 LA25_ADDIU_MICROMIPS (target_low),
10777 loc + 4);
df58fc94
RS
10778 }
10779 else
10780 {
10781 bfd_put_32 (hti->output_bfd, LA25_LUI (target_high), loc);
10782 bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 4);
10783 }
861fb55a
DJ
10784 }
10785 else
10786 {
10787 /* This is trampoline. */
10788 loc += offset;
df58fc94
RS
10789 if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
10790 {
d21911ea
MR
10791 bfd_put_micromips_32 (hti->output_bfd,
10792 LA25_LUI_MICROMIPS (target_high), loc);
10793 bfd_put_micromips_32 (hti->output_bfd,
10794 LA25_J_MICROMIPS (target), loc + 4);
10795 bfd_put_micromips_32 (hti->output_bfd,
10796 LA25_ADDIU_MICROMIPS (target_low), loc + 8);
df58fc94
RS
10797 bfd_put_32 (hti->output_bfd, 0, loc + 12);
10798 }
10799 else
10800 {
10801 bfd_put_32 (hti->output_bfd, LA25_LUI (target_high), loc);
3734320d
MF
10802 if (MIPSR6_P (hti->output_bfd) && htab->compact_branches)
10803 {
10804 bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 4);
10805 bfd_put_32 (hti->output_bfd, LA25_BC (pcrel_offset), loc + 8);
10806 }
10807 else
10808 {
10809 bfd_put_32 (hti->output_bfd, LA25_J (target), loc + 4);
10810 bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 8);
10811 }
df58fc94
RS
10812 bfd_put_32 (hti->output_bfd, 0, loc + 12);
10813 }
861fb55a
DJ
10814 }
10815 return TRUE;
10816}
10817
b49e97c9
TS
10818/* If NAME is one of the special IRIX6 symbols defined by the linker,
10819 adjust it appropriately now. */
10820
10821static void
9719ad41
RS
10822mips_elf_irix6_finish_dynamic_symbol (bfd *abfd ATTRIBUTE_UNUSED,
10823 const char *name, Elf_Internal_Sym *sym)
b49e97c9
TS
10824{
10825 /* The linker script takes care of providing names and values for
10826 these, but we must place them into the right sections. */
10827 static const char* const text_section_symbols[] = {
10828 "_ftext",
10829 "_etext",
10830 "__dso_displacement",
10831 "__elf_header",
10832 "__program_header_table",
10833 NULL
10834 };
10835
10836 static const char* const data_section_symbols[] = {
10837 "_fdata",
10838 "_edata",
10839 "_end",
10840 "_fbss",
10841 NULL
10842 };
10843
10844 const char* const *p;
10845 int i;
10846
10847 for (i = 0; i < 2; ++i)
10848 for (p = (i == 0) ? text_section_symbols : data_section_symbols;
10849 *p;
10850 ++p)
10851 if (strcmp (*p, name) == 0)
10852 {
10853 /* All of these symbols are given type STT_SECTION by the
10854 IRIX6 linker. */
10855 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
e10609d3 10856 sym->st_other = STO_PROTECTED;
b49e97c9
TS
10857
10858 /* The IRIX linker puts these symbols in special sections. */
10859 if (i == 0)
10860 sym->st_shndx = SHN_MIPS_TEXT;
10861 else
10862 sym->st_shndx = SHN_MIPS_DATA;
10863
10864 break;
10865 }
10866}
10867
10868/* Finish up dynamic symbol handling. We set the contents of various
10869 dynamic sections here. */
10870
b34976b6 10871bfd_boolean
9719ad41
RS
10872_bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
10873 struct bfd_link_info *info,
10874 struct elf_link_hash_entry *h,
10875 Elf_Internal_Sym *sym)
b49e97c9
TS
10876{
10877 bfd *dynobj;
b49e97c9 10878 asection *sgot;
f4416af6 10879 struct mips_got_info *g, *gg;
b49e97c9 10880 const char *name;
3d6746ca 10881 int idx;
5108fc1b 10882 struct mips_elf_link_hash_table *htab;
738e5348 10883 struct mips_elf_link_hash_entry *hmips;
b49e97c9 10884
5108fc1b 10885 htab = mips_elf_hash_table (info);
4dfe6ac6 10886 BFD_ASSERT (htab != NULL);
b49e97c9 10887 dynobj = elf_hash_table (info)->dynobj;
738e5348 10888 hmips = (struct mips_elf_link_hash_entry *) h;
b49e97c9 10889
861fb55a
DJ
10890 BFD_ASSERT (!htab->is_vxworks);
10891
1bbce132
MR
10892 if (h->plt.plist != NULL
10893 && (h->plt.plist->mips_offset != MINUS_ONE
10894 || h->plt.plist->comp_offset != MINUS_ONE))
861fb55a
DJ
10895 {
10896 /* We've decided to create a PLT entry for this symbol. */
10897 bfd_byte *loc;
1bbce132 10898 bfd_vma header_address, got_address;
861fb55a 10899 bfd_vma got_address_high, got_address_low, load;
1bbce132
MR
10900 bfd_vma got_index;
10901 bfd_vma isa_bit;
10902
10903 got_index = h->plt.plist->gotplt_index;
861fb55a
DJ
10904
10905 BFD_ASSERT (htab->use_plts_and_copy_relocs);
10906 BFD_ASSERT (h->dynindx != -1);
ce558b89 10907 BFD_ASSERT (htab->root.splt != NULL);
1bbce132 10908 BFD_ASSERT (got_index != MINUS_ONE);
861fb55a
DJ
10909 BFD_ASSERT (!h->def_regular);
10910
10911 /* Calculate the address of the PLT header. */
1bbce132 10912 isa_bit = htab->plt_header_is_comp;
ce558b89
AM
10913 header_address = (htab->root.splt->output_section->vma
10914 + htab->root.splt->output_offset + isa_bit);
861fb55a
DJ
10915
10916 /* Calculate the address of the .got.plt entry. */
ce558b89
AM
10917 got_address = (htab->root.sgotplt->output_section->vma
10918 + htab->root.sgotplt->output_offset
1bbce132
MR
10919 + got_index * MIPS_ELF_GOT_SIZE (dynobj));
10920
861fb55a
DJ
10921 got_address_high = ((got_address + 0x8000) >> 16) & 0xffff;
10922 got_address_low = got_address & 0xffff;
10923
789ff5b6
MR
10924 /* The PLT sequence is not safe for N64 if .got.plt entry's address
10925 cannot be loaded in two instructions. */
10926 if (ABI_64_P (output_bfd)
10927 && ((got_address + 0x80008000) & ~(bfd_vma) 0xffffffff) != 0)
10928 {
10929 _bfd_error_handler
10930 /* xgettext:c-format */
10931 (_("%pB: `%pA' entry VMA of %#" PRIx64 " outside the 32-bit range "
10932 "supported; consider using `-Ttext-segment=...'"),
10933 output_bfd,
10934 htab->root.sgotplt->output_section,
10935 (int64_t) got_address);
10936 bfd_set_error (bfd_error_no_error);
10937 return FALSE;
10938 }
10939
861fb55a 10940 /* Initially point the .got.plt entry at the PLT header. */
6a382bce
MR
10941 loc = (htab->root.sgotplt->contents
10942 + got_index * MIPS_ELF_GOT_SIZE (dynobj));
861fb55a
DJ
10943 if (ABI_64_P (output_bfd))
10944 bfd_put_64 (output_bfd, header_address, loc);
10945 else
10946 bfd_put_32 (output_bfd, header_address, loc);
10947
1bbce132 10948 /* Now handle the PLT itself. First the standard entry (the order
07d6d2b8 10949 does not matter, we just have to pick one). */
1bbce132
MR
10950 if (h->plt.plist->mips_offset != MINUS_ONE)
10951 {
10952 const bfd_vma *plt_entry;
10953 bfd_vma plt_offset;
861fb55a 10954
1bbce132 10955 plt_offset = htab->plt_header_size + h->plt.plist->mips_offset;
861fb55a 10956
ce558b89 10957 BFD_ASSERT (plt_offset <= htab->root.splt->size);
6d30f5b2 10958
1bbce132 10959 /* Find out where the .plt entry should go. */
ce558b89 10960 loc = htab->root.splt->contents + plt_offset;
1bbce132
MR
10961
10962 /* Pick the load opcode. */
10963 load = MIPS_ELF_LOAD_WORD (output_bfd);
10964
10965 /* Fill in the PLT entry itself. */
7361da2c
AB
10966
10967 if (MIPSR6_P (output_bfd))
3734320d
MF
10968 plt_entry = htab->compact_branches ? mipsr6_exec_plt_entry_compact
10969 : mipsr6_exec_plt_entry;
7361da2c
AB
10970 else
10971 plt_entry = mips_exec_plt_entry;
1bbce132
MR
10972 bfd_put_32 (output_bfd, plt_entry[0] | got_address_high, loc);
10973 bfd_put_32 (output_bfd, plt_entry[1] | got_address_low | load,
10974 loc + 4);
10975
3734320d
MF
10976 if (! LOAD_INTERLOCKS_P (output_bfd)
10977 || (MIPSR6_P (output_bfd) && htab->compact_branches))
1bbce132
MR
10978 {
10979 bfd_put_32 (output_bfd, plt_entry[2] | got_address_low, loc + 8);
10980 bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
10981 }
10982 else
10983 {
10984 bfd_put_32 (output_bfd, plt_entry[3], loc + 8);
10985 bfd_put_32 (output_bfd, plt_entry[2] | got_address_low,
10986 loc + 12);
10987 }
6d30f5b2 10988 }
1bbce132
MR
10989
10990 /* Now the compressed entry. They come after any standard ones. */
10991 if (h->plt.plist->comp_offset != MINUS_ONE)
6d30f5b2 10992 {
1bbce132
MR
10993 bfd_vma plt_offset;
10994
10995 plt_offset = (htab->plt_header_size + htab->plt_mips_offset
10996 + h->plt.plist->comp_offset);
10997
ce558b89 10998 BFD_ASSERT (plt_offset <= htab->root.splt->size);
1bbce132
MR
10999
11000 /* Find out where the .plt entry should go. */
ce558b89 11001 loc = htab->root.splt->contents + plt_offset;
1bbce132
MR
11002
11003 /* Fill in the PLT entry itself. */
833794fc
MR
11004 if (!MICROMIPS_P (output_bfd))
11005 {
11006 const bfd_vma *plt_entry = mips16_o32_exec_plt_entry;
11007
11008 bfd_put_16 (output_bfd, plt_entry[0], loc);
11009 bfd_put_16 (output_bfd, plt_entry[1], loc + 2);
11010 bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11011 bfd_put_16 (output_bfd, plt_entry[3], loc + 6);
11012 bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11013 bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
11014 bfd_put_32 (output_bfd, got_address, loc + 12);
11015 }
11016 else if (htab->insn32)
11017 {
11018 const bfd_vma *plt_entry = micromips_insn32_o32_exec_plt_entry;
11019
11020 bfd_put_16 (output_bfd, plt_entry[0], loc);
11021 bfd_put_16 (output_bfd, got_address_high, loc + 2);
11022 bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11023 bfd_put_16 (output_bfd, got_address_low, loc + 6);
11024 bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11025 bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
11026 bfd_put_16 (output_bfd, plt_entry[6], loc + 12);
11027 bfd_put_16 (output_bfd, got_address_low, loc + 14);
11028 }
11029 else
1bbce132
MR
11030 {
11031 const bfd_vma *plt_entry = micromips_o32_exec_plt_entry;
11032 bfd_signed_vma gotpc_offset;
11033 bfd_vma loc_address;
11034
11035 BFD_ASSERT (got_address % 4 == 0);
11036
ce558b89
AM
11037 loc_address = (htab->root.splt->output_section->vma
11038 + htab->root.splt->output_offset + plt_offset);
1bbce132
MR
11039 gotpc_offset = got_address - ((loc_address | 3) ^ 3);
11040
11041 /* ADDIUPC has a span of +/-16MB, check we're in range. */
11042 if (gotpc_offset + 0x1000000 >= 0x2000000)
11043 {
4eca0228 11044 _bfd_error_handler
695344c0 11045 /* xgettext:c-format */
2dcf00ce 11046 (_("%pB: `%pA' offset of %" PRId64 " from `%pA' "
1bbce132
MR
11047 "beyond the range of ADDIUPC"),
11048 output_bfd,
ce558b89 11049 htab->root.sgotplt->output_section,
2dcf00ce 11050 (int64_t) gotpc_offset,
c08bb8dd 11051 htab->root.splt->output_section);
1bbce132
MR
11052 bfd_set_error (bfd_error_no_error);
11053 return FALSE;
11054 }
11055 bfd_put_16 (output_bfd,
11056 plt_entry[0] | ((gotpc_offset >> 18) & 0x7f), loc);
11057 bfd_put_16 (output_bfd, (gotpc_offset >> 2) & 0xffff, loc + 2);
11058 bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11059 bfd_put_16 (output_bfd, plt_entry[3], loc + 6);
11060 bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11061 bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
11062 }
6d30f5b2 11063 }
861fb55a
DJ
11064
11065 /* Emit an R_MIPS_JUMP_SLOT relocation against the .got.plt entry. */
ce558b89 11066 mips_elf_output_dynamic_relocation (output_bfd, htab->root.srelplt,
1bbce132 11067 got_index - 2, h->dynindx,
861fb55a
DJ
11068 R_MIPS_JUMP_SLOT, got_address);
11069
11070 /* We distinguish between PLT entries and lazy-binding stubs by
11071 giving the former an st_other value of STO_MIPS_PLT. Set the
11072 flag and leave the value if there are any relocations in the
11073 binary where pointer equality matters. */
11074 sym->st_shndx = SHN_UNDEF;
11075 if (h->pointer_equality_needed)
1bbce132 11076 sym->st_other = ELF_ST_SET_MIPS_PLT (sym->st_other);
861fb55a 11077 else
1bbce132
MR
11078 {
11079 sym->st_value = 0;
11080 sym->st_other = 0;
11081 }
861fb55a 11082 }
1bbce132
MR
11083
11084 if (h->plt.plist != NULL && h->plt.plist->stub_offset != MINUS_ONE)
b49e97c9 11085 {
861fb55a 11086 /* We've decided to create a lazy-binding stub. */
1bbce132
MR
11087 bfd_boolean micromips_p = MICROMIPS_P (output_bfd);
11088 unsigned int other = micromips_p ? STO_MICROMIPS : 0;
11089 bfd_vma stub_size = htab->function_stub_size;
5108fc1b 11090 bfd_byte stub[MIPS_FUNCTION_STUB_BIG_SIZE];
1bbce132
MR
11091 bfd_vma isa_bit = micromips_p;
11092 bfd_vma stub_big_size;
11093
833794fc 11094 if (!micromips_p)
1bbce132 11095 stub_big_size = MIPS_FUNCTION_STUB_BIG_SIZE;
833794fc
MR
11096 else if (htab->insn32)
11097 stub_big_size = MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE;
11098 else
11099 stub_big_size = MICROMIPS_FUNCTION_STUB_BIG_SIZE;
b49e97c9
TS
11100
11101 /* This symbol has a stub. Set it up. */
11102
11103 BFD_ASSERT (h->dynindx != -1);
11104
1bbce132 11105 BFD_ASSERT (stub_size == stub_big_size || h->dynindx <= 0xffff);
3d6746ca
DD
11106
11107 /* Values up to 2^31 - 1 are allowed. Larger values would cause
5108fc1b
RS
11108 sign extension at runtime in the stub, resulting in a negative
11109 index value. */
11110 if (h->dynindx & ~0x7fffffff)
b34976b6 11111 return FALSE;
b49e97c9
TS
11112
11113 /* Fill the stub. */
1bbce132
MR
11114 if (micromips_p)
11115 {
11116 idx = 0;
11117 bfd_put_micromips_32 (output_bfd, STUB_LW_MICROMIPS (output_bfd),
11118 stub + idx);
11119 idx += 4;
833794fc
MR
11120 if (htab->insn32)
11121 {
11122 bfd_put_micromips_32 (output_bfd,
40fc1451 11123 STUB_MOVE32_MICROMIPS, stub + idx);
833794fc
MR
11124 idx += 4;
11125 }
11126 else
11127 {
11128 bfd_put_16 (output_bfd, STUB_MOVE_MICROMIPS, stub + idx);
11129 idx += 2;
11130 }
1bbce132
MR
11131 if (stub_size == stub_big_size)
11132 {
11133 long dynindx_hi = (h->dynindx >> 16) & 0x7fff;
11134
11135 bfd_put_micromips_32 (output_bfd,
11136 STUB_LUI_MICROMIPS (dynindx_hi),
11137 stub + idx);
11138 idx += 4;
11139 }
833794fc
MR
11140 if (htab->insn32)
11141 {
11142 bfd_put_micromips_32 (output_bfd, STUB_JALR32_MICROMIPS,
11143 stub + idx);
11144 idx += 4;
11145 }
11146 else
11147 {
11148 bfd_put_16 (output_bfd, STUB_JALR_MICROMIPS, stub + idx);
11149 idx += 2;
11150 }
1bbce132
MR
11151
11152 /* If a large stub is not required and sign extension is not a
11153 problem, then use legacy code in the stub. */
11154 if (stub_size == stub_big_size)
11155 bfd_put_micromips_32 (output_bfd,
11156 STUB_ORI_MICROMIPS (h->dynindx & 0xffff),
11157 stub + idx);
11158 else if (h->dynindx & ~0x7fff)
11159 bfd_put_micromips_32 (output_bfd,
11160 STUB_LI16U_MICROMIPS (h->dynindx & 0xffff),
11161 stub + idx);
11162 else
11163 bfd_put_micromips_32 (output_bfd,
11164 STUB_LI16S_MICROMIPS (output_bfd,
11165 h->dynindx),
11166 stub + idx);
11167 }
3d6746ca 11168 else
1bbce132
MR
11169 {
11170 idx = 0;
11171 bfd_put_32 (output_bfd, STUB_LW (output_bfd), stub + idx);
11172 idx += 4;
40fc1451 11173 bfd_put_32 (output_bfd, STUB_MOVE, stub + idx);
1bbce132
MR
11174 idx += 4;
11175 if (stub_size == stub_big_size)
11176 {
11177 bfd_put_32 (output_bfd, STUB_LUI ((h->dynindx >> 16) & 0x7fff),
11178 stub + idx);
11179 idx += 4;
11180 }
3734320d
MF
11181
11182 if (!(MIPSR6_P (output_bfd) && htab->compact_branches))
11183 {
11184 bfd_put_32 (output_bfd, STUB_JALR, stub + idx);
11185 idx += 4;
11186 }
1bbce132
MR
11187
11188 /* If a large stub is not required and sign extension is not a
11189 problem, then use legacy code in the stub. */
11190 if (stub_size == stub_big_size)
11191 bfd_put_32 (output_bfd, STUB_ORI (h->dynindx & 0xffff),
11192 stub + idx);
11193 else if (h->dynindx & ~0x7fff)
11194 bfd_put_32 (output_bfd, STUB_LI16U (h->dynindx & 0xffff),
11195 stub + idx);
11196 else
11197 bfd_put_32 (output_bfd, STUB_LI16S (output_bfd, h->dynindx),
11198 stub + idx);
3734320d
MF
11199 idx += 4;
11200
11201 if (MIPSR6_P (output_bfd) && htab->compact_branches)
11202 bfd_put_32 (output_bfd, STUB_JALRC, stub + idx);
1bbce132 11203 }
5108fc1b 11204
1bbce132
MR
11205 BFD_ASSERT (h->plt.plist->stub_offset <= htab->sstubs->size);
11206 memcpy (htab->sstubs->contents + h->plt.plist->stub_offset,
11207 stub, stub_size);
b49e97c9 11208
1bbce132 11209 /* Mark the symbol as undefined. stub_offset != -1 occurs
b49e97c9
TS
11210 only for the referenced symbol. */
11211 sym->st_shndx = SHN_UNDEF;
11212
11213 /* The run-time linker uses the st_value field of the symbol
11214 to reset the global offset table entry for this external
11215 to its stub address when unlinking a shared object. */
4e41d0d7
RS
11216 sym->st_value = (htab->sstubs->output_section->vma
11217 + htab->sstubs->output_offset
1bbce132
MR
11218 + h->plt.plist->stub_offset
11219 + isa_bit);
11220 sym->st_other = other;
b49e97c9
TS
11221 }
11222
738e5348
RS
11223 /* If we have a MIPS16 function with a stub, the dynamic symbol must
11224 refer to the stub, since only the stub uses the standard calling
11225 conventions. */
11226 if (h->dynindx != -1 && hmips->fn_stub != NULL)
11227 {
11228 BFD_ASSERT (hmips->need_fn_stub);
11229 sym->st_value = (hmips->fn_stub->output_section->vma
11230 + hmips->fn_stub->output_offset);
11231 sym->st_size = hmips->fn_stub->size;
11232 sym->st_other = ELF_ST_VISIBILITY (sym->st_other);
11233 }
11234
b49e97c9 11235 BFD_ASSERT (h->dynindx != -1
f5385ebf 11236 || h->forced_local);
b49e97c9 11237
ce558b89 11238 sgot = htab->root.sgot;
a8028dd0 11239 g = htab->got_info;
b49e97c9
TS
11240 BFD_ASSERT (g != NULL);
11241
11242 /* Run through the global symbol table, creating GOT entries for all
11243 the symbols that need them. */
020d7251 11244 if (hmips->global_got_area != GGA_NONE)
b49e97c9
TS
11245 {
11246 bfd_vma offset;
11247 bfd_vma value;
11248
6eaa6adc 11249 value = sym->st_value;
13fbec83 11250 offset = mips_elf_primary_global_got_index (output_bfd, info, h);
b49e97c9
TS
11251 MIPS_ELF_PUT_WORD (output_bfd, value, sgot->contents + offset);
11252 }
11253
e641e783 11254 if (hmips->global_got_area != GGA_NONE && g->next)
f4416af6
AO
11255 {
11256 struct mips_got_entry e, *p;
0626d451 11257 bfd_vma entry;
f4416af6 11258 bfd_vma offset;
f4416af6
AO
11259
11260 gg = g;
11261
11262 e.abfd = output_bfd;
11263 e.symndx = -1;
738e5348 11264 e.d.h = hmips;
9ab066b4 11265 e.tls_type = GOT_TLS_NONE;
143d77c5 11266
f4416af6
AO
11267 for (g = g->next; g->next != gg; g = g->next)
11268 {
11269 if (g->got_entries
11270 && (p = (struct mips_got_entry *) htab_find (g->got_entries,
11271 &e)))
11272 {
11273 offset = p->gotidx;
ce558b89 11274 BFD_ASSERT (offset > 0 && offset < htab->root.sgot->size);
0e1862bb 11275 if (bfd_link_pic (info)
0626d451
RS
11276 || (elf_hash_table (info)->dynamic_sections_created
11277 && p->d.h != NULL
f5385ebf
AM
11278 && p->d.h->root.def_dynamic
11279 && !p->d.h->root.def_regular))
0626d451
RS
11280 {
11281 /* Create an R_MIPS_REL32 relocation for this entry. Due to
11282 the various compatibility problems, it's easier to mock
11283 up an R_MIPS_32 or R_MIPS_64 relocation and leave
11284 mips_elf_create_dynamic_relocation to calculate the
11285 appropriate addend. */
11286 Elf_Internal_Rela rel[3];
11287
11288 memset (rel, 0, sizeof (rel));
11289 if (ABI_64_P (output_bfd))
11290 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_64);
11291 else
11292 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_32);
11293 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
11294
11295 entry = 0;
11296 if (! (mips_elf_create_dynamic_relocation
11297 (output_bfd, info, rel,
11298 e.d.h, NULL, sym->st_value, &entry, sgot)))
11299 return FALSE;
11300 }
11301 else
11302 entry = sym->st_value;
11303 MIPS_ELF_PUT_WORD (output_bfd, entry, sgot->contents + offset);
f4416af6
AO
11304 }
11305 }
11306 }
11307
b49e97c9
TS
11308 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
11309 name = h->root.root.string;
9637f6ef 11310 if (h == elf_hash_table (info)->hdynamic
22edb2f1 11311 || h == elf_hash_table (info)->hgot)
b49e97c9
TS
11312 sym->st_shndx = SHN_ABS;
11313 else if (strcmp (name, "_DYNAMIC_LINK") == 0
11314 || strcmp (name, "_DYNAMIC_LINKING") == 0)
11315 {
11316 sym->st_shndx = SHN_ABS;
11317 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11318 sym->st_value = 1;
11319 }
b49e97c9
TS
11320 else if (SGI_COMPAT (output_bfd))
11321 {
11322 if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
11323 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
11324 {
11325 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11326 sym->st_other = STO_PROTECTED;
11327 sym->st_value = 0;
11328 sym->st_shndx = SHN_MIPS_DATA;
11329 }
11330 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
11331 {
11332 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11333 sym->st_other = STO_PROTECTED;
11334 sym->st_value = mips_elf_hash_table (info)->procedure_count;
11335 sym->st_shndx = SHN_ABS;
11336 }
11337 else if (sym->st_shndx != SHN_UNDEF && sym->st_shndx != SHN_ABS)
11338 {
11339 if (h->type == STT_FUNC)
11340 sym->st_shndx = SHN_MIPS_TEXT;
11341 else if (h->type == STT_OBJECT)
11342 sym->st_shndx = SHN_MIPS_DATA;
11343 }
11344 }
11345
861fb55a
DJ
11346 /* Emit a copy reloc, if needed. */
11347 if (h->needs_copy)
11348 {
11349 asection *s;
11350 bfd_vma symval;
11351
11352 BFD_ASSERT (h->dynindx != -1);
11353 BFD_ASSERT (htab->use_plts_and_copy_relocs);
11354
11355 s = mips_elf_rel_dyn_section (info, FALSE);
11356 symval = (h->root.u.def.section->output_section->vma
11357 + h->root.u.def.section->output_offset
11358 + h->root.u.def.value);
11359 mips_elf_output_dynamic_relocation (output_bfd, s, s->reloc_count++,
11360 h->dynindx, R_MIPS_COPY, symval);
11361 }
11362
b49e97c9
TS
11363 /* Handle the IRIX6-specific symbols. */
11364 if (IRIX_COMPAT (output_bfd) == ict_irix6)
11365 mips_elf_irix6_finish_dynamic_symbol (output_bfd, name, sym);
11366
cbf8d970
MR
11367 /* Keep dynamic compressed symbols odd. This allows the dynamic linker
11368 to treat compressed symbols like any other. */
30c09090 11369 if (ELF_ST_IS_MIPS16 (sym->st_other))
738e5348
RS
11370 {
11371 BFD_ASSERT (sym->st_value & 1);
11372 sym->st_other -= STO_MIPS16;
11373 }
cbf8d970
MR
11374 else if (ELF_ST_IS_MICROMIPS (sym->st_other))
11375 {
11376 BFD_ASSERT (sym->st_value & 1);
11377 sym->st_other -= STO_MICROMIPS;
11378 }
b49e97c9 11379
b34976b6 11380 return TRUE;
b49e97c9
TS
11381}
11382
0a44bf69
RS
11383/* Likewise, for VxWorks. */
11384
11385bfd_boolean
11386_bfd_mips_vxworks_finish_dynamic_symbol (bfd *output_bfd,
11387 struct bfd_link_info *info,
11388 struct elf_link_hash_entry *h,
11389 Elf_Internal_Sym *sym)
11390{
11391 bfd *dynobj;
11392 asection *sgot;
11393 struct mips_got_info *g;
11394 struct mips_elf_link_hash_table *htab;
020d7251 11395 struct mips_elf_link_hash_entry *hmips;
0a44bf69
RS
11396
11397 htab = mips_elf_hash_table (info);
4dfe6ac6 11398 BFD_ASSERT (htab != NULL);
0a44bf69 11399 dynobj = elf_hash_table (info)->dynobj;
020d7251 11400 hmips = (struct mips_elf_link_hash_entry *) h;
0a44bf69 11401
1bbce132 11402 if (h->plt.plist != NULL && h->plt.plist->mips_offset != MINUS_ONE)
0a44bf69 11403 {
6d79d2ed 11404 bfd_byte *loc;
1bbce132 11405 bfd_vma plt_address, got_address, got_offset, branch_offset;
0a44bf69
RS
11406 Elf_Internal_Rela rel;
11407 static const bfd_vma *plt_entry;
1bbce132
MR
11408 bfd_vma gotplt_index;
11409 bfd_vma plt_offset;
11410
11411 plt_offset = htab->plt_header_size + h->plt.plist->mips_offset;
11412 gotplt_index = h->plt.plist->gotplt_index;
0a44bf69
RS
11413
11414 BFD_ASSERT (h->dynindx != -1);
ce558b89 11415 BFD_ASSERT (htab->root.splt != NULL);
1bbce132 11416 BFD_ASSERT (gotplt_index != MINUS_ONE);
ce558b89 11417 BFD_ASSERT (plt_offset <= htab->root.splt->size);
0a44bf69
RS
11418
11419 /* Calculate the address of the .plt entry. */
ce558b89
AM
11420 plt_address = (htab->root.splt->output_section->vma
11421 + htab->root.splt->output_offset
1bbce132 11422 + plt_offset);
0a44bf69
RS
11423
11424 /* Calculate the address of the .got.plt entry. */
ce558b89
AM
11425 got_address = (htab->root.sgotplt->output_section->vma
11426 + htab->root.sgotplt->output_offset
1bbce132 11427 + gotplt_index * MIPS_ELF_GOT_SIZE (output_bfd));
0a44bf69
RS
11428
11429 /* Calculate the offset of the .got.plt entry from
11430 _GLOBAL_OFFSET_TABLE_. */
11431 got_offset = mips_elf_gotplt_index (info, h);
11432
11433 /* Calculate the offset for the branch at the start of the PLT
11434 entry. The branch jumps to the beginning of .plt. */
1bbce132 11435 branch_offset = -(plt_offset / 4 + 1) & 0xffff;
0a44bf69
RS
11436
11437 /* Fill in the initial value of the .got.plt entry. */
11438 bfd_put_32 (output_bfd, plt_address,
ce558b89 11439 (htab->root.sgotplt->contents
1bbce132 11440 + gotplt_index * MIPS_ELF_GOT_SIZE (output_bfd)));
0a44bf69
RS
11441
11442 /* Find out where the .plt entry should go. */
ce558b89 11443 loc = htab->root.splt->contents + plt_offset;
0a44bf69 11444
0e1862bb 11445 if (bfd_link_pic (info))
0a44bf69
RS
11446 {
11447 plt_entry = mips_vxworks_shared_plt_entry;
11448 bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
1bbce132 11449 bfd_put_32 (output_bfd, plt_entry[1] | gotplt_index, loc + 4);
0a44bf69
RS
11450 }
11451 else
11452 {
11453 bfd_vma got_address_high, got_address_low;
11454
11455 plt_entry = mips_vxworks_exec_plt_entry;
11456 got_address_high = ((got_address + 0x8000) >> 16) & 0xffff;
11457 got_address_low = got_address & 0xffff;
11458
11459 bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
1bbce132 11460 bfd_put_32 (output_bfd, plt_entry[1] | gotplt_index, loc + 4);
0a44bf69
RS
11461 bfd_put_32 (output_bfd, plt_entry[2] | got_address_high, loc + 8);
11462 bfd_put_32 (output_bfd, plt_entry[3] | got_address_low, loc + 12);
11463 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11464 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11465 bfd_put_32 (output_bfd, plt_entry[6], loc + 24);
11466 bfd_put_32 (output_bfd, plt_entry[7], loc + 28);
11467
11468 loc = (htab->srelplt2->contents
1bbce132 11469 + (gotplt_index * 3 + 2) * sizeof (Elf32_External_Rela));
0a44bf69
RS
11470
11471 /* Emit a relocation for the .got.plt entry. */
11472 rel.r_offset = got_address;
11473 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
1bbce132 11474 rel.r_addend = plt_offset;
0a44bf69
RS
11475 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11476
11477 /* Emit a relocation for the lui of %hi(<.got.plt slot>). */
11478 loc += sizeof (Elf32_External_Rela);
11479 rel.r_offset = plt_address + 8;
11480 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11481 rel.r_addend = got_offset;
11482 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11483
11484 /* Emit a relocation for the addiu of %lo(<.got.plt slot>). */
11485 loc += sizeof (Elf32_External_Rela);
11486 rel.r_offset += 4;
11487 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11488 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11489 }
11490
11491 /* Emit an R_MIPS_JUMP_SLOT relocation against the .got.plt entry. */
ce558b89 11492 loc = (htab->root.srelplt->contents
1bbce132 11493 + gotplt_index * sizeof (Elf32_External_Rela));
0a44bf69
RS
11494 rel.r_offset = got_address;
11495 rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_JUMP_SLOT);
11496 rel.r_addend = 0;
11497 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11498
11499 if (!h->def_regular)
11500 sym->st_shndx = SHN_UNDEF;
11501 }
11502
11503 BFD_ASSERT (h->dynindx != -1 || h->forced_local);
11504
ce558b89 11505 sgot = htab->root.sgot;
a8028dd0 11506 g = htab->got_info;
0a44bf69
RS
11507 BFD_ASSERT (g != NULL);
11508
11509 /* See if this symbol has an entry in the GOT. */
020d7251 11510 if (hmips->global_got_area != GGA_NONE)
0a44bf69
RS
11511 {
11512 bfd_vma offset;
11513 Elf_Internal_Rela outrel;
11514 bfd_byte *loc;
11515 asection *s;
11516
11517 /* Install the symbol value in the GOT. */
13fbec83 11518 offset = mips_elf_primary_global_got_index (output_bfd, info, h);
0a44bf69
RS
11519 MIPS_ELF_PUT_WORD (output_bfd, sym->st_value, sgot->contents + offset);
11520
11521 /* Add a dynamic relocation for it. */
11522 s = mips_elf_rel_dyn_section (info, FALSE);
11523 loc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
11524 outrel.r_offset = (sgot->output_section->vma
11525 + sgot->output_offset
11526 + offset);
11527 outrel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_32);
11528 outrel.r_addend = 0;
11529 bfd_elf32_swap_reloca_out (dynobj, &outrel, loc);
11530 }
11531
11532 /* Emit a copy reloc, if needed. */
11533 if (h->needs_copy)
11534 {
11535 Elf_Internal_Rela rel;
5474d94f
AM
11536 asection *srel;
11537 bfd_byte *loc;
0a44bf69
RS
11538
11539 BFD_ASSERT (h->dynindx != -1);
11540
11541 rel.r_offset = (h->root.u.def.section->output_section->vma
11542 + h->root.u.def.section->output_offset
11543 + h->root.u.def.value);
11544 rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_COPY);
11545 rel.r_addend = 0;
afbf7e8e 11546 if (h->root.u.def.section == htab->root.sdynrelro)
5474d94f
AM
11547 srel = htab->root.sreldynrelro;
11548 else
11549 srel = htab->root.srelbss;
11550 loc = srel->contents + srel->reloc_count * sizeof (Elf32_External_Rela);
11551 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11552 ++srel->reloc_count;
0a44bf69
RS
11553 }
11554
df58fc94
RS
11555 /* If this is a mips16/microMIPS symbol, force the value to be even. */
11556 if (ELF_ST_IS_COMPRESSED (sym->st_other))
0a44bf69
RS
11557 sym->st_value &= ~1;
11558
11559 return TRUE;
11560}
11561
861fb55a
DJ
11562/* Write out a plt0 entry to the beginning of .plt. */
11563
1bbce132 11564static bfd_boolean
861fb55a
DJ
11565mips_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
11566{
11567 bfd_byte *loc;
11568 bfd_vma gotplt_value, gotplt_value_high, gotplt_value_low;
11569 static const bfd_vma *plt_entry;
11570 struct mips_elf_link_hash_table *htab;
11571
11572 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
11573 BFD_ASSERT (htab != NULL);
11574
861fb55a 11575 if (ABI_64_P (output_bfd))
3734320d
MF
11576 plt_entry = (htab->compact_branches
11577 ? mipsr6_n64_exec_plt0_entry_compact
11578 : mips_n64_exec_plt0_entry);
861fb55a 11579 else if (ABI_N32_P (output_bfd))
3734320d
MF
11580 plt_entry = (htab->compact_branches
11581 ? mipsr6_n32_exec_plt0_entry_compact
11582 : mips_n32_exec_plt0_entry);
833794fc 11583 else if (!htab->plt_header_is_comp)
3734320d
MF
11584 plt_entry = (htab->compact_branches
11585 ? mipsr6_o32_exec_plt0_entry_compact
11586 : mips_o32_exec_plt0_entry);
833794fc
MR
11587 else if (htab->insn32)
11588 plt_entry = micromips_insn32_o32_exec_plt0_entry;
11589 else
11590 plt_entry = micromips_o32_exec_plt0_entry;
861fb55a
DJ
11591
11592 /* Calculate the value of .got.plt. */
ce558b89
AM
11593 gotplt_value = (htab->root.sgotplt->output_section->vma
11594 + htab->root.sgotplt->output_offset);
861fb55a
DJ
11595 gotplt_value_high = ((gotplt_value + 0x8000) >> 16) & 0xffff;
11596 gotplt_value_low = gotplt_value & 0xffff;
11597
11598 /* The PLT sequence is not safe for N64 if .got.plt's address can
11599 not be loaded in two instructions. */
789ff5b6
MR
11600 if (ABI_64_P (output_bfd)
11601 && ((gotplt_value + 0x80008000) & ~(bfd_vma) 0xffffffff) != 0)
11602 {
11603 _bfd_error_handler
11604 /* xgettext:c-format */
11605 (_("%pB: `%pA' start VMA of %#" PRIx64 " outside the 32-bit range "
11606 "supported; consider using `-Ttext-segment=...'"),
11607 output_bfd,
11608 htab->root.sgotplt->output_section,
11609 (int64_t) gotplt_value);
11610 bfd_set_error (bfd_error_no_error);
11611 return FALSE;
11612 }
861fb55a
DJ
11613
11614 /* Install the PLT header. */
ce558b89 11615 loc = htab->root.splt->contents;
1bbce132
MR
11616 if (plt_entry == micromips_o32_exec_plt0_entry)
11617 {
11618 bfd_vma gotpc_offset;
11619 bfd_vma loc_address;
11620 size_t i;
11621
11622 BFD_ASSERT (gotplt_value % 4 == 0);
11623
ce558b89
AM
11624 loc_address = (htab->root.splt->output_section->vma
11625 + htab->root.splt->output_offset);
1bbce132
MR
11626 gotpc_offset = gotplt_value - ((loc_address | 3) ^ 3);
11627
11628 /* ADDIUPC has a span of +/-16MB, check we're in range. */
11629 if (gotpc_offset + 0x1000000 >= 0x2000000)
11630 {
4eca0228 11631 _bfd_error_handler
695344c0 11632 /* xgettext:c-format */
2dcf00ce
AM
11633 (_("%pB: `%pA' offset of %" PRId64 " from `%pA' "
11634 "beyond the range of ADDIUPC"),
1bbce132 11635 output_bfd,
ce558b89 11636 htab->root.sgotplt->output_section,
2dcf00ce 11637 (int64_t) gotpc_offset,
c08bb8dd 11638 htab->root.splt->output_section);
1bbce132
MR
11639 bfd_set_error (bfd_error_no_error);
11640 return FALSE;
11641 }
11642 bfd_put_16 (output_bfd,
11643 plt_entry[0] | ((gotpc_offset >> 18) & 0x7f), loc);
11644 bfd_put_16 (output_bfd, (gotpc_offset >> 2) & 0xffff, loc + 2);
11645 for (i = 2; i < ARRAY_SIZE (micromips_o32_exec_plt0_entry); i++)
11646 bfd_put_16 (output_bfd, plt_entry[i], loc + (i * 2));
11647 }
833794fc
MR
11648 else if (plt_entry == micromips_insn32_o32_exec_plt0_entry)
11649 {
11650 size_t i;
11651
11652 bfd_put_16 (output_bfd, plt_entry[0], loc);
11653 bfd_put_16 (output_bfd, gotplt_value_high, loc + 2);
11654 bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11655 bfd_put_16 (output_bfd, gotplt_value_low, loc + 6);
11656 bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11657 bfd_put_16 (output_bfd, gotplt_value_low, loc + 10);
11658 for (i = 6; i < ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry); i++)
11659 bfd_put_16 (output_bfd, plt_entry[i], loc + (i * 2));
11660 }
1bbce132
MR
11661 else
11662 {
11663 bfd_put_32 (output_bfd, plt_entry[0] | gotplt_value_high, loc);
11664 bfd_put_32 (output_bfd, plt_entry[1] | gotplt_value_low, loc + 4);
11665 bfd_put_32 (output_bfd, plt_entry[2] | gotplt_value_low, loc + 8);
11666 bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
11667 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11668 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11669 bfd_put_32 (output_bfd, plt_entry[6], loc + 24);
11670 bfd_put_32 (output_bfd, plt_entry[7], loc + 28);
11671 }
11672
11673 return TRUE;
861fb55a
DJ
11674}
11675
0a44bf69
RS
11676/* Install the PLT header for a VxWorks executable and finalize the
11677 contents of .rela.plt.unloaded. */
11678
11679static void
11680mips_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
11681{
11682 Elf_Internal_Rela rela;
11683 bfd_byte *loc;
11684 bfd_vma got_value, got_value_high, got_value_low, plt_address;
11685 static const bfd_vma *plt_entry;
11686 struct mips_elf_link_hash_table *htab;
11687
11688 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
11689 BFD_ASSERT (htab != NULL);
11690
0a44bf69
RS
11691 plt_entry = mips_vxworks_exec_plt0_entry;
11692
11693 /* Calculate the value of _GLOBAL_OFFSET_TABLE_. */
11694 got_value = (htab->root.hgot->root.u.def.section->output_section->vma
11695 + htab->root.hgot->root.u.def.section->output_offset
11696 + htab->root.hgot->root.u.def.value);
11697
11698 got_value_high = ((got_value + 0x8000) >> 16) & 0xffff;
11699 got_value_low = got_value & 0xffff;
11700
11701 /* Calculate the address of the PLT header. */
ce558b89
AM
11702 plt_address = (htab->root.splt->output_section->vma
11703 + htab->root.splt->output_offset);
0a44bf69
RS
11704
11705 /* Install the PLT header. */
ce558b89 11706 loc = htab->root.splt->contents;
0a44bf69
RS
11707 bfd_put_32 (output_bfd, plt_entry[0] | got_value_high, loc);
11708 bfd_put_32 (output_bfd, plt_entry[1] | got_value_low, loc + 4);
11709 bfd_put_32 (output_bfd, plt_entry[2], loc + 8);
11710 bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
11711 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11712 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11713
11714 /* Output the relocation for the lui of %hi(_GLOBAL_OFFSET_TABLE_). */
11715 loc = htab->srelplt2->contents;
11716 rela.r_offset = plt_address;
11717 rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11718 rela.r_addend = 0;
11719 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
11720 loc += sizeof (Elf32_External_Rela);
11721
11722 /* Output the relocation for the following addiu of
11723 %lo(_GLOBAL_OFFSET_TABLE_). */
11724 rela.r_offset += 4;
11725 rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11726 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
11727 loc += sizeof (Elf32_External_Rela);
11728
11729 /* Fix up the remaining relocations. They may have the wrong
11730 symbol index for _G_O_T_ or _P_L_T_ depending on the order
11731 in which symbols were output. */
11732 while (loc < htab->srelplt2->contents + htab->srelplt2->size)
11733 {
11734 Elf_Internal_Rela rel;
11735
11736 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11737 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
11738 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11739 loc += sizeof (Elf32_External_Rela);
11740
11741 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11742 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11743 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11744 loc += sizeof (Elf32_External_Rela);
11745
11746 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11747 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11748 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11749 loc += sizeof (Elf32_External_Rela);
11750 }
11751}
11752
11753/* Install the PLT header for a VxWorks shared library. */
11754
11755static void
11756mips_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info)
11757{
11758 unsigned int i;
11759 struct mips_elf_link_hash_table *htab;
11760
11761 htab = mips_elf_hash_table (info);
4dfe6ac6 11762 BFD_ASSERT (htab != NULL);
0a44bf69
RS
11763
11764 /* We just need to copy the entry byte-by-byte. */
11765 for (i = 0; i < ARRAY_SIZE (mips_vxworks_shared_plt0_entry); i++)
11766 bfd_put_32 (output_bfd, mips_vxworks_shared_plt0_entry[i],
ce558b89 11767 htab->root.splt->contents + i * 4);
0a44bf69
RS
11768}
11769
b49e97c9
TS
11770/* Finish up the dynamic sections. */
11771
b34976b6 11772bfd_boolean
9719ad41
RS
11773_bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
11774 struct bfd_link_info *info)
b49e97c9
TS
11775{
11776 bfd *dynobj;
11777 asection *sdyn;
11778 asection *sgot;
f4416af6 11779 struct mips_got_info *gg, *g;
0a44bf69 11780 struct mips_elf_link_hash_table *htab;
b49e97c9 11781
0a44bf69 11782 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
11783 BFD_ASSERT (htab != NULL);
11784
b49e97c9
TS
11785 dynobj = elf_hash_table (info)->dynobj;
11786
3d4d4302 11787 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
b49e97c9 11788
ce558b89 11789 sgot = htab->root.sgot;
23cc69b6 11790 gg = htab->got_info;
b49e97c9
TS
11791
11792 if (elf_hash_table (info)->dynamic_sections_created)
11793 {
11794 bfd_byte *b;
943284cc 11795 int dyn_to_skip = 0, dyn_skipped = 0;
b49e97c9
TS
11796
11797 BFD_ASSERT (sdyn != NULL);
23cc69b6
RS
11798 BFD_ASSERT (gg != NULL);
11799
d7206569 11800 g = mips_elf_bfd_got (output_bfd, FALSE);
b49e97c9
TS
11801 BFD_ASSERT (g != NULL);
11802
11803 for (b = sdyn->contents;
eea6121a 11804 b < sdyn->contents + sdyn->size;
b49e97c9
TS
11805 b += MIPS_ELF_DYN_SIZE (dynobj))
11806 {
11807 Elf_Internal_Dyn dyn;
11808 const char *name;
11809 size_t elemsize;
11810 asection *s;
b34976b6 11811 bfd_boolean swap_out_p;
b49e97c9
TS
11812
11813 /* Read in the current dynamic entry. */
11814 (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
11815
11816 /* Assume that we're going to modify it and write it out. */
b34976b6 11817 swap_out_p = TRUE;
b49e97c9
TS
11818
11819 switch (dyn.d_tag)
11820 {
11821 case DT_RELENT:
b49e97c9
TS
11822 dyn.d_un.d_val = MIPS_ELF_REL_SIZE (dynobj);
11823 break;
11824
0a44bf69
RS
11825 case DT_RELAENT:
11826 BFD_ASSERT (htab->is_vxworks);
11827 dyn.d_un.d_val = MIPS_ELF_RELA_SIZE (dynobj);
11828 break;
11829
b49e97c9
TS
11830 case DT_STRSZ:
11831 /* Rewrite DT_STRSZ. */
11832 dyn.d_un.d_val =
11833 _bfd_elf_strtab_size (elf_hash_table (info)->dynstr);
11834 break;
11835
11836 case DT_PLTGOT:
ce558b89 11837 s = htab->root.sgot;
861fb55a
DJ
11838 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
11839 break;
11840
11841 case DT_MIPS_PLTGOT:
ce558b89 11842 s = htab->root.sgotplt;
861fb55a 11843 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
b49e97c9
TS
11844 break;
11845
11846 case DT_MIPS_RLD_VERSION:
11847 dyn.d_un.d_val = 1; /* XXX */
11848 break;
11849
11850 case DT_MIPS_FLAGS:
11851 dyn.d_un.d_val = RHF_NOTPOT; /* XXX */
11852 break;
11853
b49e97c9 11854 case DT_MIPS_TIME_STAMP:
6edfbbad
DJ
11855 {
11856 time_t t;
11857 time (&t);
11858 dyn.d_un.d_val = t;
11859 }
b49e97c9
TS
11860 break;
11861
11862 case DT_MIPS_ICHECKSUM:
11863 /* XXX FIXME: */
b34976b6 11864 swap_out_p = FALSE;
b49e97c9
TS
11865 break;
11866
11867 case DT_MIPS_IVERSION:
11868 /* XXX FIXME: */
b34976b6 11869 swap_out_p = FALSE;
b49e97c9
TS
11870 break;
11871
11872 case DT_MIPS_BASE_ADDRESS:
11873 s = output_bfd->sections;
11874 BFD_ASSERT (s != NULL);
11875 dyn.d_un.d_ptr = s->vma & ~(bfd_vma) 0xffff;
11876 break;
11877
11878 case DT_MIPS_LOCAL_GOTNO:
11879 dyn.d_un.d_val = g->local_gotno;
11880 break;
11881
11882 case DT_MIPS_UNREFEXTNO:
11883 /* The index into the dynamic symbol table which is the
11884 entry of the first external symbol that is not
11885 referenced within the same object. */
11886 dyn.d_un.d_val = bfd_count_sections (output_bfd) + 1;
11887 break;
11888
11889 case DT_MIPS_GOTSYM:
d222d210 11890 if (htab->global_gotsym)
b49e97c9 11891 {
d222d210 11892 dyn.d_un.d_val = htab->global_gotsym->dynindx;
b49e97c9
TS
11893 break;
11894 }
11895 /* In case if we don't have global got symbols we default
11896 to setting DT_MIPS_GOTSYM to the same value as
1a0670f3
AM
11897 DT_MIPS_SYMTABNO. */
11898 /* Fall through. */
b49e97c9
TS
11899
11900 case DT_MIPS_SYMTABNO:
11901 name = ".dynsym";
11902 elemsize = MIPS_ELF_SYM_SIZE (output_bfd);
4ade44b7 11903 s = bfd_get_linker_section (dynobj, name);
b49e97c9 11904
131e2f8e
MF
11905 if (s != NULL)
11906 dyn.d_un.d_val = s->size / elemsize;
11907 else
11908 dyn.d_un.d_val = 0;
b49e97c9
TS
11909 break;
11910
11911 case DT_MIPS_HIPAGENO:
861fb55a 11912 dyn.d_un.d_val = g->local_gotno - htab->reserved_gotno;
b49e97c9
TS
11913 break;
11914
11915 case DT_MIPS_RLD_MAP:
b4082c70
DD
11916 {
11917 struct elf_link_hash_entry *h;
11918 h = mips_elf_hash_table (info)->rld_symbol;
11919 if (!h)
11920 {
11921 dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
11922 swap_out_p = FALSE;
11923 break;
11924 }
11925 s = h->root.u.def.section;
a5499fa4
MF
11926
11927 /* The MIPS_RLD_MAP tag stores the absolute address of the
11928 debug pointer. */
b4082c70
DD
11929 dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
11930 + h->root.u.def.value);
11931 }
b49e97c9
TS
11932 break;
11933
a5499fa4
MF
11934 case DT_MIPS_RLD_MAP_REL:
11935 {
11936 struct elf_link_hash_entry *h;
11937 bfd_vma dt_addr, rld_addr;
11938 h = mips_elf_hash_table (info)->rld_symbol;
11939 if (!h)
11940 {
11941 dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
11942 swap_out_p = FALSE;
11943 break;
11944 }
11945 s = h->root.u.def.section;
11946
11947 /* The MIPS_RLD_MAP_REL tag stores the offset to the debug
11948 pointer, relative to the address of the tag. */
11949 dt_addr = (sdyn->output_section->vma + sdyn->output_offset
d5cff5df 11950 + (b - sdyn->contents));
a5499fa4
MF
11951 rld_addr = (s->output_section->vma + s->output_offset
11952 + h->root.u.def.value);
11953 dyn.d_un.d_ptr = rld_addr - dt_addr;
11954 }
11955 break;
11956
b49e97c9
TS
11957 case DT_MIPS_OPTIONS:
11958 s = (bfd_get_section_by_name
11959 (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (output_bfd)));
11960 dyn.d_un.d_ptr = s->vma;
11961 break;
11962
0a44bf69 11963 case DT_PLTREL:
861fb55a
DJ
11964 BFD_ASSERT (htab->use_plts_and_copy_relocs);
11965 if (htab->is_vxworks)
11966 dyn.d_un.d_val = DT_RELA;
11967 else
11968 dyn.d_un.d_val = DT_REL;
0a44bf69
RS
11969 break;
11970
11971 case DT_PLTRELSZ:
861fb55a 11972 BFD_ASSERT (htab->use_plts_and_copy_relocs);
ce558b89 11973 dyn.d_un.d_val = htab->root.srelplt->size;
0a44bf69
RS
11974 break;
11975
11976 case DT_JMPREL:
861fb55a 11977 BFD_ASSERT (htab->use_plts_and_copy_relocs);
ce558b89
AM
11978 dyn.d_un.d_ptr = (htab->root.srelplt->output_section->vma
11979 + htab->root.srelplt->output_offset);
0a44bf69
RS
11980 break;
11981
943284cc
DJ
11982 case DT_TEXTREL:
11983 /* If we didn't need any text relocations after all, delete
11984 the dynamic tag. */
11985 if (!(info->flags & DF_TEXTREL))
11986 {
11987 dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
11988 swap_out_p = FALSE;
11989 }
11990 break;
11991
11992 case DT_FLAGS:
11993 /* If we didn't need any text relocations after all, clear
11994 DF_TEXTREL from DT_FLAGS. */
11995 if (!(info->flags & DF_TEXTREL))
11996 dyn.d_un.d_val &= ~DF_TEXTREL;
11997 else
11998 swap_out_p = FALSE;
11999 break;
12000
f16a9783
MS
12001 case DT_MIPS_XHASH:
12002 name = ".MIPS.xhash";
12003 s = bfd_get_linker_section (dynobj, name);
12004 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
12005 break;
12006
b49e97c9 12007 default:
b34976b6 12008 swap_out_p = FALSE;
7a2b07ff
NS
12009 if (htab->is_vxworks
12010 && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
12011 swap_out_p = TRUE;
b49e97c9
TS
12012 break;
12013 }
12014
943284cc 12015 if (swap_out_p || dyn_skipped)
b49e97c9 12016 (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
943284cc
DJ
12017 (dynobj, &dyn, b - dyn_skipped);
12018
12019 if (dyn_to_skip)
12020 {
12021 dyn_skipped += dyn_to_skip;
12022 dyn_to_skip = 0;
12023 }
b49e97c9 12024 }
943284cc
DJ
12025
12026 /* Wipe out any trailing entries if we shifted down a dynamic tag. */
12027 if (dyn_skipped > 0)
12028 memset (b - dyn_skipped, 0, dyn_skipped);
b49e97c9
TS
12029 }
12030
b55fd4d4
DJ
12031 if (sgot != NULL && sgot->size > 0
12032 && !bfd_is_abs_section (sgot->output_section))
b49e97c9 12033 {
0a44bf69
RS
12034 if (htab->is_vxworks)
12035 {
12036 /* The first entry of the global offset table points to the
12037 ".dynamic" section. The second is initialized by the
12038 loader and contains the shared library identifier.
12039 The third is also initialized by the loader and points
12040 to the lazy resolution stub. */
12041 MIPS_ELF_PUT_WORD (output_bfd,
12042 sdyn->output_offset + sdyn->output_section->vma,
12043 sgot->contents);
12044 MIPS_ELF_PUT_WORD (output_bfd, 0,
12045 sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
12046 MIPS_ELF_PUT_WORD (output_bfd, 0,
12047 sgot->contents
12048 + 2 * MIPS_ELF_GOT_SIZE (output_bfd));
12049 }
12050 else
12051 {
12052 /* The first entry of the global offset table will be filled at
12053 runtime. The second entry will be used by some runtime loaders.
12054 This isn't the case of IRIX rld. */
12055 MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0, sgot->contents);
51e38d68 12056 MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
0a44bf69
RS
12057 sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
12058 }
b49e97c9 12059
54938e2a
TS
12060 elf_section_data (sgot->output_section)->this_hdr.sh_entsize
12061 = MIPS_ELF_GOT_SIZE (output_bfd);
12062 }
b49e97c9 12063
f4416af6
AO
12064 /* Generate dynamic relocations for the non-primary gots. */
12065 if (gg != NULL && gg->next)
12066 {
12067 Elf_Internal_Rela rel[3];
12068 bfd_vma addend = 0;
12069
12070 memset (rel, 0, sizeof (rel));
12071 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_REL32);
12072
12073 for (g = gg->next; g->next != gg; g = g->next)
12074 {
91d6fa6a 12075 bfd_vma got_index = g->next->local_gotno + g->next->global_gotno
0f20cc35 12076 + g->next->tls_gotno;
f4416af6 12077
9719ad41 12078 MIPS_ELF_PUT_WORD (output_bfd, 0, sgot->contents
91d6fa6a 12079 + got_index++ * MIPS_ELF_GOT_SIZE (output_bfd));
51e38d68
RS
12080 MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
12081 sgot->contents
91d6fa6a 12082 + got_index++ * MIPS_ELF_GOT_SIZE (output_bfd));
f4416af6 12083
0e1862bb 12084 if (! bfd_link_pic (info))
f4416af6
AO
12085 continue;
12086
cb22ccf4 12087 for (; got_index < g->local_gotno; got_index++)
f4416af6 12088 {
cb22ccf4
KCY
12089 if (got_index >= g->assigned_low_gotno
12090 && got_index <= g->assigned_high_gotno)
12091 continue;
12092
f4416af6 12093 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset
cb22ccf4 12094 = got_index * MIPS_ELF_GOT_SIZE (output_bfd);
f4416af6
AO
12095 if (!(mips_elf_create_dynamic_relocation
12096 (output_bfd, info, rel, NULL,
12097 bfd_abs_section_ptr,
12098 0, &addend, sgot)))
12099 return FALSE;
12100 BFD_ASSERT (addend == 0);
12101 }
12102 }
12103 }
12104
3133ddbf
DJ
12105 /* The generation of dynamic relocations for the non-primary gots
12106 adds more dynamic relocations. We cannot count them until
12107 here. */
12108
12109 if (elf_hash_table (info)->dynamic_sections_created)
12110 {
12111 bfd_byte *b;
12112 bfd_boolean swap_out_p;
12113
12114 BFD_ASSERT (sdyn != NULL);
12115
12116 for (b = sdyn->contents;
12117 b < sdyn->contents + sdyn->size;
12118 b += MIPS_ELF_DYN_SIZE (dynobj))
12119 {
12120 Elf_Internal_Dyn dyn;
12121 asection *s;
12122
12123 /* Read in the current dynamic entry. */
12124 (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
12125
12126 /* Assume that we're going to modify it and write it out. */
12127 swap_out_p = TRUE;
12128
12129 switch (dyn.d_tag)
12130 {
12131 case DT_RELSZ:
12132 /* Reduce DT_RELSZ to account for any relocations we
12133 decided not to make. This is for the n64 irix rld,
12134 which doesn't seem to apply any relocations if there
12135 are trailing null entries. */
0a44bf69 12136 s = mips_elf_rel_dyn_section (info, FALSE);
3133ddbf
DJ
12137 dyn.d_un.d_val = (s->reloc_count
12138 * (ABI_64_P (output_bfd)
12139 ? sizeof (Elf64_Mips_External_Rel)
12140 : sizeof (Elf32_External_Rel)));
bcfdf036
RS
12141 /* Adjust the section size too. Tools like the prelinker
12142 can reasonably expect the values to the same. */
db841b6f 12143 BFD_ASSERT (!bfd_is_abs_section (s->output_section));
bcfdf036
RS
12144 elf_section_data (s->output_section)->this_hdr.sh_size
12145 = dyn.d_un.d_val;
3133ddbf
DJ
12146 break;
12147
12148 default:
12149 swap_out_p = FALSE;
12150 break;
12151 }
12152
12153 if (swap_out_p)
12154 (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
12155 (dynobj, &dyn, b);
12156 }
12157 }
12158
b49e97c9 12159 {
b49e97c9
TS
12160 asection *s;
12161 Elf32_compact_rel cpt;
12162
b49e97c9
TS
12163 if (SGI_COMPAT (output_bfd))
12164 {
12165 /* Write .compact_rel section out. */
3d4d4302 12166 s = bfd_get_linker_section (dynobj, ".compact_rel");
b49e97c9
TS
12167 if (s != NULL)
12168 {
12169 cpt.id1 = 1;
12170 cpt.num = s->reloc_count;
12171 cpt.id2 = 2;
12172 cpt.offset = (s->output_section->filepos
12173 + sizeof (Elf32_External_compact_rel));
12174 cpt.reserved0 = 0;
12175 cpt.reserved1 = 0;
12176 bfd_elf32_swap_compact_rel_out (output_bfd, &cpt,
12177 ((Elf32_External_compact_rel *)
12178 s->contents));
12179
12180 /* Clean up a dummy stub function entry in .text. */
4e41d0d7 12181 if (htab->sstubs != NULL)
b49e97c9
TS
12182 {
12183 file_ptr dummy_offset;
12184
4e41d0d7
RS
12185 BFD_ASSERT (htab->sstubs->size >= htab->function_stub_size);
12186 dummy_offset = htab->sstubs->size - htab->function_stub_size;
12187 memset (htab->sstubs->contents + dummy_offset, 0,
5108fc1b 12188 htab->function_stub_size);
b49e97c9
TS
12189 }
12190 }
12191 }
12192
0a44bf69
RS
12193 /* The psABI says that the dynamic relocations must be sorted in
12194 increasing order of r_symndx. The VxWorks EABI doesn't require
12195 this, and because the code below handles REL rather than RELA
12196 relocations, using it for VxWorks would be outright harmful. */
12197 if (!htab->is_vxworks)
b49e97c9 12198 {
0a44bf69
RS
12199 s = mips_elf_rel_dyn_section (info, FALSE);
12200 if (s != NULL
12201 && s->size > (bfd_vma)2 * MIPS_ELF_REL_SIZE (output_bfd))
12202 {
12203 reldyn_sorting_bfd = output_bfd;
b49e97c9 12204
0a44bf69
RS
12205 if (ABI_64_P (output_bfd))
12206 qsort ((Elf64_External_Rel *) s->contents + 1,
12207 s->reloc_count - 1, sizeof (Elf64_Mips_External_Rel),
12208 sort_dynamic_relocs_64);
12209 else
12210 qsort ((Elf32_External_Rel *) s->contents + 1,
12211 s->reloc_count - 1, sizeof (Elf32_External_Rel),
12212 sort_dynamic_relocs);
12213 }
b49e97c9 12214 }
b49e97c9
TS
12215 }
12216
ce558b89 12217 if (htab->root.splt && htab->root.splt->size > 0)
0a44bf69 12218 {
861fb55a
DJ
12219 if (htab->is_vxworks)
12220 {
0e1862bb 12221 if (bfd_link_pic (info))
861fb55a
DJ
12222 mips_vxworks_finish_shared_plt (output_bfd, info);
12223 else
12224 mips_vxworks_finish_exec_plt (output_bfd, info);
12225 }
0a44bf69 12226 else
861fb55a 12227 {
0e1862bb 12228 BFD_ASSERT (!bfd_link_pic (info));
1bbce132
MR
12229 if (!mips_finish_exec_plt (output_bfd, info))
12230 return FALSE;
861fb55a 12231 }
0a44bf69 12232 }
b34976b6 12233 return TRUE;
b49e97c9
TS
12234}
12235
b49e97c9 12236
64543e1a
RS
12237/* Set ABFD's EF_MIPS_ARCH and EF_MIPS_MACH flags. */
12238
12239static void
9719ad41 12240mips_set_isa_flags (bfd *abfd)
b49e97c9 12241{
64543e1a 12242 flagword val;
b49e97c9
TS
12243
12244 switch (bfd_get_mach (abfd))
12245 {
12246 default:
c7c860d2
YS
12247 if (ABI_N32_P (abfd) || ABI_64_P (abfd))
12248 val = E_MIPS_ARCH_3;
12249 else
12250 val = E_MIPS_ARCH_1;
12251 break;
12252
b49e97c9
TS
12253 case bfd_mach_mips3000:
12254 val = E_MIPS_ARCH_1;
12255 break;
12256
12257 case bfd_mach_mips3900:
12258 val = E_MIPS_ARCH_1 | E_MIPS_MACH_3900;
12259 break;
12260
12261 case bfd_mach_mips6000:
12262 val = E_MIPS_ARCH_2;
12263 break;
12264
b417536f
MR
12265 case bfd_mach_mips4010:
12266 val = E_MIPS_ARCH_2 | E_MIPS_MACH_4010;
12267 break;
12268
b49e97c9
TS
12269 case bfd_mach_mips4000:
12270 case bfd_mach_mips4300:
12271 case bfd_mach_mips4400:
12272 case bfd_mach_mips4600:
12273 val = E_MIPS_ARCH_3;
12274 break;
12275
b49e97c9
TS
12276 case bfd_mach_mips4100:
12277 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4100;
12278 break;
12279
12280 case bfd_mach_mips4111:
12281 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4111;
12282 break;
12283
00707a0e
RS
12284 case bfd_mach_mips4120:
12285 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4120;
12286 break;
12287
b49e97c9
TS
12288 case bfd_mach_mips4650:
12289 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4650;
12290 break;
12291
00707a0e
RS
12292 case bfd_mach_mips5400:
12293 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5400;
12294 break;
12295
12296 case bfd_mach_mips5500:
12297 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5500;
12298 break;
12299
e407c74b
NC
12300 case bfd_mach_mips5900:
12301 val = E_MIPS_ARCH_3 | E_MIPS_MACH_5900;
12302 break;
12303
0d2e43ed
ILT
12304 case bfd_mach_mips9000:
12305 val = E_MIPS_ARCH_4 | E_MIPS_MACH_9000;
12306 break;
12307
b49e97c9 12308 case bfd_mach_mips5000:
5a7ea749 12309 case bfd_mach_mips7000:
b49e97c9
TS
12310 case bfd_mach_mips8000:
12311 case bfd_mach_mips10000:
12312 case bfd_mach_mips12000:
3aa3176b
TS
12313 case bfd_mach_mips14000:
12314 case bfd_mach_mips16000:
b49e97c9
TS
12315 val = E_MIPS_ARCH_4;
12316 break;
12317
12318 case bfd_mach_mips5:
12319 val = E_MIPS_ARCH_5;
12320 break;
12321
350cc38d
MS
12322 case bfd_mach_mips_loongson_2e:
12323 val = E_MIPS_ARCH_3 | E_MIPS_MACH_LS2E;
12324 break;
12325
12326 case bfd_mach_mips_loongson_2f:
12327 val = E_MIPS_ARCH_3 | E_MIPS_MACH_LS2F;
12328 break;
12329
b49e97c9
TS
12330 case bfd_mach_mips_sb1:
12331 val = E_MIPS_ARCH_64 | E_MIPS_MACH_SB1;
12332 break;
12333
ac8cb70f
CX
12334 case bfd_mach_mips_gs464:
12335 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_GS464;
d051516a
NC
12336 break;
12337
bd782c07
CX
12338 case bfd_mach_mips_gs464e:
12339 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_GS464E;
12340 break;
12341
9108bc33
CX
12342 case bfd_mach_mips_gs264e:
12343 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_GS264E;
12344 break;
12345
6f179bd0 12346 case bfd_mach_mips_octeon:
dd6a37e7 12347 case bfd_mach_mips_octeonp:
6f179bd0
AN
12348 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_OCTEON;
12349 break;
12350
2c629856
N
12351 case bfd_mach_mips_octeon3:
12352 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_OCTEON3;
12353 break;
12354
52b6b6b9
JM
12355 case bfd_mach_mips_xlr:
12356 val = E_MIPS_ARCH_64 | E_MIPS_MACH_XLR;
12357 break;
12358
432233b3
AP
12359 case bfd_mach_mips_octeon2:
12360 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_OCTEON2;
12361 break;
12362
b49e97c9
TS
12363 case bfd_mach_mipsisa32:
12364 val = E_MIPS_ARCH_32;
12365 break;
12366
12367 case bfd_mach_mipsisa64:
12368 val = E_MIPS_ARCH_64;
af7ee8bf
CD
12369 break;
12370
12371 case bfd_mach_mipsisa32r2:
ae52f483
AB
12372 case bfd_mach_mipsisa32r3:
12373 case bfd_mach_mipsisa32r5:
af7ee8bf
CD
12374 val = E_MIPS_ARCH_32R2;
12375 break;
5f74bc13 12376
38bf472a
MR
12377 case bfd_mach_mips_interaptiv_mr2:
12378 val = E_MIPS_ARCH_32R2 | E_MIPS_MACH_IAMR2;
12379 break;
12380
5f74bc13 12381 case bfd_mach_mipsisa64r2:
ae52f483
AB
12382 case bfd_mach_mipsisa64r3:
12383 case bfd_mach_mipsisa64r5:
5f74bc13
CD
12384 val = E_MIPS_ARCH_64R2;
12385 break;
7361da2c
AB
12386
12387 case bfd_mach_mipsisa32r6:
12388 val = E_MIPS_ARCH_32R6;
12389 break;
12390
12391 case bfd_mach_mipsisa64r6:
12392 val = E_MIPS_ARCH_64R6;
12393 break;
b49e97c9 12394 }
b49e97c9
TS
12395 elf_elfheader (abfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
12396 elf_elfheader (abfd)->e_flags |= val;
12397
64543e1a
RS
12398}
12399
12400
28dbcedc
AM
12401/* Whether to sort relocs output by ld -r or ld --emit-relocs, by r_offset.
12402 Don't do so for code sections. We want to keep ordering of HI16/LO16
12403 as is. On the other hand, elf-eh-frame.c processing requires .eh_frame
12404 relocs to be sorted. */
12405
12406bfd_boolean
12407_bfd_mips_elf_sort_relocs_p (asection *sec)
12408{
12409 return (sec->flags & SEC_CODE) == 0;
12410}
12411
12412
64543e1a
RS
12413/* The final processing done just before writing out a MIPS ELF object
12414 file. This gets the MIPS architecture right based on the machine
12415 number. This is used by both the 32-bit and the 64-bit ABI. */
12416
12417void
cc364be6 12418_bfd_mips_final_write_processing (bfd *abfd)
64543e1a
RS
12419{
12420 unsigned int i;
12421 Elf_Internal_Shdr **hdrpp;
12422 const char *name;
12423 asection *sec;
12424
12425 /* Keep the existing EF_MIPS_MACH and EF_MIPS_ARCH flags if the former
12426 is nonzero. This is for compatibility with old objects, which used
12427 a combination of a 32-bit EF_MIPS_ARCH and a 64-bit EF_MIPS_MACH. */
12428 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == 0)
12429 mips_set_isa_flags (abfd);
12430
b49e97c9
TS
12431 /* Set the sh_info field for .gptab sections and other appropriate
12432 info for each special section. */
12433 for (i = 1, hdrpp = elf_elfsections (abfd) + 1;
12434 i < elf_numsections (abfd);
12435 i++, hdrpp++)
12436 {
12437 switch ((*hdrpp)->sh_type)
12438 {
12439 case SHT_MIPS_MSYM:
12440 case SHT_MIPS_LIBLIST:
12441 sec = bfd_get_section_by_name (abfd, ".dynstr");
12442 if (sec != NULL)
12443 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12444 break;
12445
12446 case SHT_MIPS_GPTAB:
12447 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
fd361982 12448 name = bfd_section_name ((*hdrpp)->bfd_section);
b49e97c9 12449 BFD_ASSERT (name != NULL
0112cd26 12450 && CONST_STRNEQ (name, ".gptab."));
b49e97c9
TS
12451 sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
12452 BFD_ASSERT (sec != NULL);
12453 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
12454 break;
12455
12456 case SHT_MIPS_CONTENT:
12457 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
fd361982 12458 name = bfd_section_name ((*hdrpp)->bfd_section);
b49e97c9 12459 BFD_ASSERT (name != NULL
0112cd26 12460 && CONST_STRNEQ (name, ".MIPS.content"));
b49e97c9
TS
12461 sec = bfd_get_section_by_name (abfd,
12462 name + sizeof ".MIPS.content" - 1);
12463 BFD_ASSERT (sec != NULL);
12464 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12465 break;
12466
12467 case SHT_MIPS_SYMBOL_LIB:
12468 sec = bfd_get_section_by_name (abfd, ".dynsym");
12469 if (sec != NULL)
12470 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12471 sec = bfd_get_section_by_name (abfd, ".liblist");
12472 if (sec != NULL)
12473 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
12474 break;
12475
12476 case SHT_MIPS_EVENTS:
12477 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
fd361982 12478 name = bfd_section_name ((*hdrpp)->bfd_section);
b49e97c9 12479 BFD_ASSERT (name != NULL);
0112cd26 12480 if (CONST_STRNEQ (name, ".MIPS.events"))
b49e97c9
TS
12481 sec = bfd_get_section_by_name (abfd,
12482 name + sizeof ".MIPS.events" - 1);
12483 else
12484 {
0112cd26 12485 BFD_ASSERT (CONST_STRNEQ (name, ".MIPS.post_rel"));
b49e97c9
TS
12486 sec = bfd_get_section_by_name (abfd,
12487 (name
12488 + sizeof ".MIPS.post_rel" - 1));
12489 }
12490 BFD_ASSERT (sec != NULL);
12491 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12492 break;
12493
f16a9783
MS
12494 case SHT_MIPS_XHASH:
12495 sec = bfd_get_section_by_name (abfd, ".dynsym");
12496 if (sec != NULL)
12497 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
b49e97c9
TS
12498 }
12499 }
12500}
06f44071 12501
cc364be6
AM
12502bfd_boolean
12503_bfd_mips_elf_final_write_processing (bfd *abfd)
06f44071 12504{
cc364be6
AM
12505 _bfd_mips_final_write_processing (abfd);
12506 return _bfd_elf_final_write_processing (abfd);
06f44071 12507}
b49e97c9 12508\f
8dc1a139 12509/* When creating an IRIX5 executable, we need REGINFO and RTPROC
b49e97c9
TS
12510 segments. */
12511
12512int
a6b96beb
AM
12513_bfd_mips_elf_additional_program_headers (bfd *abfd,
12514 struct bfd_link_info *info ATTRIBUTE_UNUSED)
b49e97c9
TS
12515{
12516 asection *s;
12517 int ret = 0;
12518
12519 /* See if we need a PT_MIPS_REGINFO segment. */
12520 s = bfd_get_section_by_name (abfd, ".reginfo");
12521 if (s && (s->flags & SEC_LOAD))
12522 ++ret;
12523
351cdf24
MF
12524 /* See if we need a PT_MIPS_ABIFLAGS segment. */
12525 if (bfd_get_section_by_name (abfd, ".MIPS.abiflags"))
12526 ++ret;
12527
b49e97c9
TS
12528 /* See if we need a PT_MIPS_OPTIONS segment. */
12529 if (IRIX_COMPAT (abfd) == ict_irix6
12530 && bfd_get_section_by_name (abfd,
12531 MIPS_ELF_OPTIONS_SECTION_NAME (abfd)))
12532 ++ret;
12533
12534 /* See if we need a PT_MIPS_RTPROC segment. */
12535 if (IRIX_COMPAT (abfd) == ict_irix5
12536 && bfd_get_section_by_name (abfd, ".dynamic")
12537 && bfd_get_section_by_name (abfd, ".mdebug"))
12538 ++ret;
12539
98c904a8
RS
12540 /* Allocate a PT_NULL header in dynamic objects. See
12541 _bfd_mips_elf_modify_segment_map for details. */
12542 if (!SGI_COMPAT (abfd)
12543 && bfd_get_section_by_name (abfd, ".dynamic"))
12544 ++ret;
12545
b49e97c9
TS
12546 return ret;
12547}
12548
8dc1a139 12549/* Modify the segment map for an IRIX5 executable. */
b49e97c9 12550
b34976b6 12551bfd_boolean
9719ad41 12552_bfd_mips_elf_modify_segment_map (bfd *abfd,
7c8b76cc 12553 struct bfd_link_info *info)
b49e97c9
TS
12554{
12555 asection *s;
12556 struct elf_segment_map *m, **pm;
986f0783 12557 size_t amt;
b49e97c9
TS
12558
12559 /* If there is a .reginfo section, we need a PT_MIPS_REGINFO
12560 segment. */
12561 s = bfd_get_section_by_name (abfd, ".reginfo");
12562 if (s != NULL && (s->flags & SEC_LOAD) != 0)
12563 {
12bd6957 12564 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
b49e97c9
TS
12565 if (m->p_type == PT_MIPS_REGINFO)
12566 break;
12567 if (m == NULL)
12568 {
12569 amt = sizeof *m;
9719ad41 12570 m = bfd_zalloc (abfd, amt);
b49e97c9 12571 if (m == NULL)
b34976b6 12572 return FALSE;
b49e97c9
TS
12573
12574 m->p_type = PT_MIPS_REGINFO;
12575 m->count = 1;
12576 m->sections[0] = s;
12577
12578 /* We want to put it after the PHDR and INTERP segments. */
12bd6957 12579 pm = &elf_seg_map (abfd);
b49e97c9
TS
12580 while (*pm != NULL
12581 && ((*pm)->p_type == PT_PHDR
12582 || (*pm)->p_type == PT_INTERP))
12583 pm = &(*pm)->next;
12584
12585 m->next = *pm;
12586 *pm = m;
12587 }
12588 }
12589
351cdf24
MF
12590 /* If there is a .MIPS.abiflags section, we need a PT_MIPS_ABIFLAGS
12591 segment. */
12592 s = bfd_get_section_by_name (abfd, ".MIPS.abiflags");
12593 if (s != NULL && (s->flags & SEC_LOAD) != 0)
12594 {
12595 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
12596 if (m->p_type == PT_MIPS_ABIFLAGS)
12597 break;
12598 if (m == NULL)
12599 {
12600 amt = sizeof *m;
12601 m = bfd_zalloc (abfd, amt);
12602 if (m == NULL)
12603 return FALSE;
12604
12605 m->p_type = PT_MIPS_ABIFLAGS;
12606 m->count = 1;
12607 m->sections[0] = s;
12608
12609 /* We want to put it after the PHDR and INTERP segments. */
12610 pm = &elf_seg_map (abfd);
12611 while (*pm != NULL
12612 && ((*pm)->p_type == PT_PHDR
12613 || (*pm)->p_type == PT_INTERP))
12614 pm = &(*pm)->next;
12615
12616 m->next = *pm;
12617 *pm = m;
12618 }
12619 }
12620
b49e97c9
TS
12621 /* For IRIX 6, we don't have .mdebug sections, nor does anything but
12622 .dynamic end up in PT_DYNAMIC. However, we do have to insert a
98a8deaf 12623 PT_MIPS_OPTIONS segment immediately following the program header
b49e97c9 12624 table. */
c1fd6598
AO
12625 if (NEWABI_P (abfd)
12626 /* On non-IRIX6 new abi, we'll have already created a segment
12627 for this section, so don't create another. I'm not sure this
12628 is not also the case for IRIX 6, but I can't test it right
12629 now. */
12630 && IRIX_COMPAT (abfd) == ict_irix6)
b49e97c9
TS
12631 {
12632 for (s = abfd->sections; s; s = s->next)
12633 if (elf_section_data (s)->this_hdr.sh_type == SHT_MIPS_OPTIONS)
12634 break;
12635
12636 if (s)
12637 {
12638 struct elf_segment_map *options_segment;
12639
12bd6957 12640 pm = &elf_seg_map (abfd);
98a8deaf
RS
12641 while (*pm != NULL
12642 && ((*pm)->p_type == PT_PHDR
12643 || (*pm)->p_type == PT_INTERP))
12644 pm = &(*pm)->next;
b49e97c9 12645
8ded5a0f
AM
12646 if (*pm == NULL || (*pm)->p_type != PT_MIPS_OPTIONS)
12647 {
12648 amt = sizeof (struct elf_segment_map);
12649 options_segment = bfd_zalloc (abfd, amt);
12650 options_segment->next = *pm;
12651 options_segment->p_type = PT_MIPS_OPTIONS;
12652 options_segment->p_flags = PF_R;
12653 options_segment->p_flags_valid = TRUE;
12654 options_segment->count = 1;
12655 options_segment->sections[0] = s;
12656 *pm = options_segment;
12657 }
b49e97c9
TS
12658 }
12659 }
12660 else
12661 {
12662 if (IRIX_COMPAT (abfd) == ict_irix5)
12663 {
12664 /* If there are .dynamic and .mdebug sections, we make a room
12665 for the RTPROC header. FIXME: Rewrite without section names. */
12666 if (bfd_get_section_by_name (abfd, ".interp") == NULL
12667 && bfd_get_section_by_name (abfd, ".dynamic") != NULL
12668 && bfd_get_section_by_name (abfd, ".mdebug") != NULL)
12669 {
12bd6957 12670 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
b49e97c9
TS
12671 if (m->p_type == PT_MIPS_RTPROC)
12672 break;
12673 if (m == NULL)
12674 {
12675 amt = sizeof *m;
9719ad41 12676 m = bfd_zalloc (abfd, amt);
b49e97c9 12677 if (m == NULL)
b34976b6 12678 return FALSE;
b49e97c9
TS
12679
12680 m->p_type = PT_MIPS_RTPROC;
12681
12682 s = bfd_get_section_by_name (abfd, ".rtproc");
12683 if (s == NULL)
12684 {
12685 m->count = 0;
12686 m->p_flags = 0;
12687 m->p_flags_valid = 1;
12688 }
12689 else
12690 {
12691 m->count = 1;
12692 m->sections[0] = s;
12693 }
12694
12695 /* We want to put it after the DYNAMIC segment. */
12bd6957 12696 pm = &elf_seg_map (abfd);
b49e97c9
TS
12697 while (*pm != NULL && (*pm)->p_type != PT_DYNAMIC)
12698 pm = &(*pm)->next;
12699 if (*pm != NULL)
12700 pm = &(*pm)->next;
12701
12702 m->next = *pm;
12703 *pm = m;
12704 }
12705 }
12706 }
8dc1a139 12707 /* On IRIX5, the PT_DYNAMIC segment includes the .dynamic,
b49e97c9
TS
12708 .dynstr, .dynsym, and .hash sections, and everything in
12709 between. */
12bd6957 12710 for (pm = &elf_seg_map (abfd); *pm != NULL;
b49e97c9
TS
12711 pm = &(*pm)->next)
12712 if ((*pm)->p_type == PT_DYNAMIC)
12713 break;
12714 m = *pm;
f6f62d6f
RS
12715 /* GNU/Linux binaries do not need the extended PT_DYNAMIC section.
12716 glibc's dynamic linker has traditionally derived the number of
12717 tags from the p_filesz field, and sometimes allocates stack
12718 arrays of that size. An overly-big PT_DYNAMIC segment can
12719 be actively harmful in such cases. Making PT_DYNAMIC contain
12720 other sections can also make life hard for the prelinker,
12721 which might move one of the other sections to a different
12722 PT_LOAD segment. */
12723 if (SGI_COMPAT (abfd)
12724 && m != NULL
12725 && m->count == 1
12726 && strcmp (m->sections[0]->name, ".dynamic") == 0)
b49e97c9
TS
12727 {
12728 static const char *sec_names[] =
12729 {
12730 ".dynamic", ".dynstr", ".dynsym", ".hash"
12731 };
12732 bfd_vma low, high;
12733 unsigned int i, c;
12734 struct elf_segment_map *n;
12735
792b4a53 12736 low = ~(bfd_vma) 0;
b49e97c9
TS
12737 high = 0;
12738 for (i = 0; i < sizeof sec_names / sizeof sec_names[0]; i++)
12739 {
12740 s = bfd_get_section_by_name (abfd, sec_names[i]);
12741 if (s != NULL && (s->flags & SEC_LOAD) != 0)
12742 {
12743 bfd_size_type sz;
12744
12745 if (low > s->vma)
12746 low = s->vma;
eea6121a 12747 sz = s->size;
b49e97c9
TS
12748 if (high < s->vma + sz)
12749 high = s->vma + sz;
12750 }
12751 }
12752
12753 c = 0;
12754 for (s = abfd->sections; s != NULL; s = s->next)
12755 if ((s->flags & SEC_LOAD) != 0
12756 && s->vma >= low
eea6121a 12757 && s->vma + s->size <= high)
b49e97c9
TS
12758 ++c;
12759
986f0783 12760 amt = sizeof *n - sizeof (asection *) + c * sizeof (asection *);
9719ad41 12761 n = bfd_zalloc (abfd, amt);
b49e97c9 12762 if (n == NULL)
b34976b6 12763 return FALSE;
b49e97c9
TS
12764 *n = *m;
12765 n->count = c;
12766
12767 i = 0;
12768 for (s = abfd->sections; s != NULL; s = s->next)
12769 {
12770 if ((s->flags & SEC_LOAD) != 0
12771 && s->vma >= low
eea6121a 12772 && s->vma + s->size <= high)
b49e97c9
TS
12773 {
12774 n->sections[i] = s;
12775 ++i;
12776 }
12777 }
12778
12779 *pm = n;
12780 }
12781 }
12782
98c904a8
RS
12783 /* Allocate a spare program header in dynamic objects so that tools
12784 like the prelinker can add an extra PT_LOAD entry.
12785
12786 If the prelinker needs to make room for a new PT_LOAD entry, its
12787 standard procedure is to move the first (read-only) sections into
12788 the new (writable) segment. However, the MIPS ABI requires
12789 .dynamic to be in a read-only segment, and the section will often
12790 start within sizeof (ElfNN_Phdr) bytes of the last program header.
12791
12792 Although the prelinker could in principle move .dynamic to a
12793 writable segment, it seems better to allocate a spare program
12794 header instead, and avoid the need to move any sections.
12795 There is a long tradition of allocating spare dynamic tags,
12796 so allocating a spare program header seems like a natural
7c8b76cc
JM
12797 extension.
12798
12799 If INFO is NULL, we may be copying an already prelinked binary
12800 with objcopy or strip, so do not add this header. */
12801 if (info != NULL
12802 && !SGI_COMPAT (abfd)
98c904a8
RS
12803 && bfd_get_section_by_name (abfd, ".dynamic"))
12804 {
12bd6957 12805 for (pm = &elf_seg_map (abfd); *pm != NULL; pm = &(*pm)->next)
98c904a8
RS
12806 if ((*pm)->p_type == PT_NULL)
12807 break;
12808 if (*pm == NULL)
12809 {
12810 m = bfd_zalloc (abfd, sizeof (*m));
12811 if (m == NULL)
12812 return FALSE;
12813
12814 m->p_type = PT_NULL;
12815 *pm = m;
12816 }
12817 }
12818
b34976b6 12819 return TRUE;
b49e97c9
TS
12820}
12821\f
12822/* Return the section that should be marked against GC for a given
12823 relocation. */
12824
12825asection *
9719ad41 12826_bfd_mips_elf_gc_mark_hook (asection *sec,
07adf181 12827 struct bfd_link_info *info,
9719ad41
RS
12828 Elf_Internal_Rela *rel,
12829 struct elf_link_hash_entry *h,
12830 Elf_Internal_Sym *sym)
b49e97c9
TS
12831{
12832 /* ??? Do mips16 stub sections need to be handled special? */
12833
12834 if (h != NULL)
07adf181
AM
12835 switch (ELF_R_TYPE (sec->owner, rel->r_info))
12836 {
12837 case R_MIPS_GNU_VTINHERIT:
12838 case R_MIPS_GNU_VTENTRY:
12839 return NULL;
12840 }
b49e97c9 12841
07adf181 12842 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
b49e97c9
TS
12843}
12844
351cdf24
MF
12845/* Prevent .MIPS.abiflags from being discarded with --gc-sections. */
12846
12847bfd_boolean
12848_bfd_mips_elf_gc_mark_extra_sections (struct bfd_link_info *info,
12849 elf_gc_mark_hook_fn gc_mark_hook)
12850{
12851 bfd *sub;
12852
12853 _bfd_elf_gc_mark_extra_sections (info, gc_mark_hook);
12854
12855 for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
12856 {
12857 asection *o;
12858
12859 if (! is_mips_elf (sub))
12860 continue;
12861
12862 for (o = sub->sections; o != NULL; o = o->next)
12863 if (!o->gc_mark
fd361982 12864 && MIPS_ELF_ABIFLAGS_SECTION_NAME_P (bfd_section_name (o)))
351cdf24
MF
12865 {
12866 if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
12867 return FALSE;
12868 }
12869 }
12870
12871 return TRUE;
12872}
b49e97c9
TS
12873\f
12874/* Copy data from a MIPS ELF indirect symbol to its direct symbol,
12875 hiding the old indirect symbol. Process additional relocation
12876 information. Also called for weakdefs, in which case we just let
12877 _bfd_elf_link_hash_copy_indirect copy the flags for us. */
12878
12879void
fcfa13d2 12880_bfd_mips_elf_copy_indirect_symbol (struct bfd_link_info *info,
9719ad41
RS
12881 struct elf_link_hash_entry *dir,
12882 struct elf_link_hash_entry *ind)
b49e97c9
TS
12883{
12884 struct mips_elf_link_hash_entry *dirmips, *indmips;
12885
fcfa13d2 12886 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
b49e97c9 12887
861fb55a
DJ
12888 dirmips = (struct mips_elf_link_hash_entry *) dir;
12889 indmips = (struct mips_elf_link_hash_entry *) ind;
12890 /* Any absolute non-dynamic relocations against an indirect or weak
12891 definition will be against the target symbol. */
12892 if (indmips->has_static_relocs)
12893 dirmips->has_static_relocs = TRUE;
12894
b49e97c9
TS
12895 if (ind->root.type != bfd_link_hash_indirect)
12896 return;
12897
b49e97c9
TS
12898 dirmips->possibly_dynamic_relocs += indmips->possibly_dynamic_relocs;
12899 if (indmips->readonly_reloc)
b34976b6 12900 dirmips->readonly_reloc = TRUE;
b49e97c9 12901 if (indmips->no_fn_stub)
b34976b6 12902 dirmips->no_fn_stub = TRUE;
61b0a4af
RS
12903 if (indmips->fn_stub)
12904 {
12905 dirmips->fn_stub = indmips->fn_stub;
12906 indmips->fn_stub = NULL;
12907 }
12908 if (indmips->need_fn_stub)
12909 {
12910 dirmips->need_fn_stub = TRUE;
12911 indmips->need_fn_stub = FALSE;
12912 }
12913 if (indmips->call_stub)
12914 {
12915 dirmips->call_stub = indmips->call_stub;
12916 indmips->call_stub = NULL;
12917 }
12918 if (indmips->call_fp_stub)
12919 {
12920 dirmips->call_fp_stub = indmips->call_fp_stub;
12921 indmips->call_fp_stub = NULL;
12922 }
634835ae
RS
12923 if (indmips->global_got_area < dirmips->global_got_area)
12924 dirmips->global_got_area = indmips->global_got_area;
12925 if (indmips->global_got_area < GGA_NONE)
12926 indmips->global_got_area = GGA_NONE;
861fb55a
DJ
12927 if (indmips->has_nonpic_branches)
12928 dirmips->has_nonpic_branches = TRUE;
b49e97c9 12929}
47275900
MR
12930
12931/* Take care of the special `__gnu_absolute_zero' symbol and ignore attempts
12932 to hide it. It has to remain global (it will also be protected) so as to
12933 be assigned a global GOT entry, which will then remain unchanged at load
12934 time. */
12935
12936void
12937_bfd_mips_elf_hide_symbol (struct bfd_link_info *info,
12938 struct elf_link_hash_entry *entry,
12939 bfd_boolean force_local)
12940{
12941 struct mips_elf_link_hash_table *htab;
12942
12943 htab = mips_elf_hash_table (info);
12944 BFD_ASSERT (htab != NULL);
12945 if (htab->use_absolute_zero
12946 && strcmp (entry->root.root.string, "__gnu_absolute_zero") == 0)
12947 return;
12948
12949 _bfd_elf_link_hash_hide_symbol (info, entry, force_local);
12950}
b49e97c9 12951\f
d01414a5
TS
12952#define PDR_SIZE 32
12953
b34976b6 12954bfd_boolean
9719ad41
RS
12955_bfd_mips_elf_discard_info (bfd *abfd, struct elf_reloc_cookie *cookie,
12956 struct bfd_link_info *info)
d01414a5
TS
12957{
12958 asection *o;
b34976b6 12959 bfd_boolean ret = FALSE;
d01414a5
TS
12960 unsigned char *tdata;
12961 size_t i, skip;
12962
12963 o = bfd_get_section_by_name (abfd, ".pdr");
12964 if (! o)
b34976b6 12965 return FALSE;
eea6121a 12966 if (o->size == 0)
b34976b6 12967 return FALSE;
eea6121a 12968 if (o->size % PDR_SIZE != 0)
b34976b6 12969 return FALSE;
d01414a5
TS
12970 if (o->output_section != NULL
12971 && bfd_is_abs_section (o->output_section))
b34976b6 12972 return FALSE;
d01414a5 12973
eea6121a 12974 tdata = bfd_zmalloc (o->size / PDR_SIZE);
d01414a5 12975 if (! tdata)
b34976b6 12976 return FALSE;
d01414a5 12977
9719ad41 12978 cookie->rels = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
45d6a902 12979 info->keep_memory);
d01414a5
TS
12980 if (!cookie->rels)
12981 {
12982 free (tdata);
b34976b6 12983 return FALSE;
d01414a5
TS
12984 }
12985
12986 cookie->rel = cookie->rels;
12987 cookie->relend = cookie->rels + o->reloc_count;
12988
eea6121a 12989 for (i = 0, skip = 0; i < o->size / PDR_SIZE; i ++)
d01414a5 12990 {
c152c796 12991 if (bfd_elf_reloc_symbol_deleted_p (i * PDR_SIZE, cookie))
d01414a5
TS
12992 {
12993 tdata[i] = 1;
12994 skip ++;
12995 }
12996 }
12997
12998 if (skip != 0)
12999 {
f0abc2a1 13000 mips_elf_section_data (o)->u.tdata = tdata;
e034b2cc
MR
13001 if (o->rawsize == 0)
13002 o->rawsize = o->size;
eea6121a 13003 o->size -= skip * PDR_SIZE;
b34976b6 13004 ret = TRUE;
d01414a5
TS
13005 }
13006 else
13007 free (tdata);
13008
13009 if (! info->keep_memory)
13010 free (cookie->rels);
13011
13012 return ret;
13013}
13014
b34976b6 13015bfd_boolean
9719ad41 13016_bfd_mips_elf_ignore_discarded_relocs (asection *sec)
53bfd6b4
MR
13017{
13018 if (strcmp (sec->name, ".pdr") == 0)
b34976b6
AM
13019 return TRUE;
13020 return FALSE;
53bfd6b4 13021}
d01414a5 13022
b34976b6 13023bfd_boolean
c7b8f16e
JB
13024_bfd_mips_elf_write_section (bfd *output_bfd,
13025 struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
07d6d2b8 13026 asection *sec, bfd_byte *contents)
d01414a5
TS
13027{
13028 bfd_byte *to, *from, *end;
13029 int i;
13030
13031 if (strcmp (sec->name, ".pdr") != 0)
b34976b6 13032 return FALSE;
d01414a5 13033
f0abc2a1 13034 if (mips_elf_section_data (sec)->u.tdata == NULL)
b34976b6 13035 return FALSE;
d01414a5
TS
13036
13037 to = contents;
eea6121a 13038 end = contents + sec->size;
d01414a5
TS
13039 for (from = contents, i = 0;
13040 from < end;
13041 from += PDR_SIZE, i++)
13042 {
f0abc2a1 13043 if ((mips_elf_section_data (sec)->u.tdata)[i] == 1)
d01414a5
TS
13044 continue;
13045 if (to != from)
13046 memcpy (to, from, PDR_SIZE);
13047 to += PDR_SIZE;
13048 }
13049 bfd_set_section_contents (output_bfd, sec->output_section, contents,
eea6121a 13050 sec->output_offset, sec->size);
b34976b6 13051 return TRUE;
d01414a5 13052}
53bfd6b4 13053\f
df58fc94
RS
13054/* microMIPS code retains local labels for linker relaxation. Omit them
13055 from output by default for clarity. */
13056
13057bfd_boolean
13058_bfd_mips_elf_is_target_special_symbol (bfd *abfd, asymbol *sym)
13059{
13060 return _bfd_elf_is_local_label_name (abfd, sym->name);
13061}
13062
b49e97c9
TS
13063/* MIPS ELF uses a special find_nearest_line routine in order the
13064 handle the ECOFF debugging information. */
13065
13066struct mips_elf_find_line
13067{
13068 struct ecoff_debug_info d;
13069 struct ecoff_find_line i;
13070};
13071
b34976b6 13072bfd_boolean
fb167eb2
AM
13073_bfd_mips_elf_find_nearest_line (bfd *abfd, asymbol **symbols,
13074 asection *section, bfd_vma offset,
9719ad41
RS
13075 const char **filename_ptr,
13076 const char **functionname_ptr,
fb167eb2
AM
13077 unsigned int *line_ptr,
13078 unsigned int *discriminator_ptr)
b49e97c9
TS
13079{
13080 asection *msec;
13081
fb167eb2 13082 if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
b49e97c9 13083 filename_ptr, functionname_ptr,
fb167eb2
AM
13084 line_ptr, discriminator_ptr,
13085 dwarf_debug_sections,
7f3bf384
AM
13086 &elf_tdata (abfd)->dwarf2_find_line_info)
13087 == 1)
e7679060 13088 return TRUE;
46d09186 13089
e7679060
AM
13090 if (_bfd_dwarf1_find_nearest_line (abfd, symbols, section, offset,
13091 filename_ptr, functionname_ptr,
13092 line_ptr))
13093 {
13094 if (!*functionname_ptr)
13095 _bfd_elf_find_function (abfd, symbols, section, offset,
13096 *filename_ptr ? NULL : filename_ptr,
13097 functionname_ptr);
46d09186
NC
13098 return TRUE;
13099 }
b49e97c9
TS
13100
13101 msec = bfd_get_section_by_name (abfd, ".mdebug");
13102 if (msec != NULL)
13103 {
13104 flagword origflags;
13105 struct mips_elf_find_line *fi;
13106 const struct ecoff_debug_swap * const swap =
13107 get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
13108
13109 /* If we are called during a link, mips_elf_final_link may have
13110 cleared the SEC_HAS_CONTENTS field. We force it back on here
13111 if appropriate (which it normally will be). */
13112 origflags = msec->flags;
13113 if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
13114 msec->flags |= SEC_HAS_CONTENTS;
13115
698600e4 13116 fi = mips_elf_tdata (abfd)->find_line_info;
b49e97c9
TS
13117 if (fi == NULL)
13118 {
13119 bfd_size_type external_fdr_size;
13120 char *fraw_src;
13121 char *fraw_end;
13122 struct fdr *fdr_ptr;
13123 bfd_size_type amt = sizeof (struct mips_elf_find_line);
13124
9719ad41 13125 fi = bfd_zalloc (abfd, amt);
b49e97c9
TS
13126 if (fi == NULL)
13127 {
13128 msec->flags = origflags;
b34976b6 13129 return FALSE;
b49e97c9
TS
13130 }
13131
13132 if (! _bfd_mips_elf_read_ecoff_info (abfd, msec, &fi->d))
13133 {
13134 msec->flags = origflags;
b34976b6 13135 return FALSE;
b49e97c9
TS
13136 }
13137
13138 /* Swap in the FDR information. */
13139 amt = fi->d.symbolic_header.ifdMax * sizeof (struct fdr);
9719ad41 13140 fi->d.fdr = bfd_alloc (abfd, amt);
b49e97c9
TS
13141 if (fi->d.fdr == NULL)
13142 {
13143 msec->flags = origflags;
b34976b6 13144 return FALSE;
b49e97c9
TS
13145 }
13146 external_fdr_size = swap->external_fdr_size;
13147 fdr_ptr = fi->d.fdr;
13148 fraw_src = (char *) fi->d.external_fdr;
13149 fraw_end = (fraw_src
13150 + fi->d.symbolic_header.ifdMax * external_fdr_size);
13151 for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
9719ad41 13152 (*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr);
b49e97c9 13153
698600e4 13154 mips_elf_tdata (abfd)->find_line_info = fi;
b49e97c9
TS
13155
13156 /* Note that we don't bother to ever free this information.
07d6d2b8
AM
13157 find_nearest_line is either called all the time, as in
13158 objdump -l, so the information should be saved, or it is
13159 rarely called, as in ld error messages, so the memory
13160 wasted is unimportant. Still, it would probably be a
13161 good idea for free_cached_info to throw it away. */
b49e97c9
TS
13162 }
13163
13164 if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
13165 &fi->i, filename_ptr, functionname_ptr,
13166 line_ptr))
13167 {
13168 msec->flags = origflags;
b34976b6 13169 return TRUE;
b49e97c9
TS
13170 }
13171
13172 msec->flags = origflags;
13173 }
13174
13175 /* Fall back on the generic ELF find_nearest_line routine. */
13176
fb167eb2 13177 return _bfd_elf_find_nearest_line (abfd, symbols, section, offset,
b49e97c9 13178 filename_ptr, functionname_ptr,
fb167eb2 13179 line_ptr, discriminator_ptr);
b49e97c9 13180}
4ab527b0
FF
13181
13182bfd_boolean
13183_bfd_mips_elf_find_inliner_info (bfd *abfd,
13184 const char **filename_ptr,
13185 const char **functionname_ptr,
13186 unsigned int *line_ptr)
13187{
13188 bfd_boolean found;
13189 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
13190 functionname_ptr, line_ptr,
13191 & elf_tdata (abfd)->dwarf2_find_line_info);
13192 return found;
13193}
13194
b49e97c9
TS
13195\f
13196/* When are writing out the .options or .MIPS.options section,
13197 remember the bytes we are writing out, so that we can install the
13198 GP value in the section_processing routine. */
13199
b34976b6 13200bfd_boolean
9719ad41
RS
13201_bfd_mips_elf_set_section_contents (bfd *abfd, sec_ptr section,
13202 const void *location,
13203 file_ptr offset, bfd_size_type count)
b49e97c9 13204{
cc2e31b9 13205 if (MIPS_ELF_OPTIONS_SECTION_NAME_P (section->name))
b49e97c9
TS
13206 {
13207 bfd_byte *c;
13208
13209 if (elf_section_data (section) == NULL)
13210 {
986f0783 13211 size_t amt = sizeof (struct bfd_elf_section_data);
9719ad41 13212 section->used_by_bfd = bfd_zalloc (abfd, amt);
b49e97c9 13213 if (elf_section_data (section) == NULL)
b34976b6 13214 return FALSE;
b49e97c9 13215 }
f0abc2a1 13216 c = mips_elf_section_data (section)->u.tdata;
b49e97c9
TS
13217 if (c == NULL)
13218 {
eea6121a 13219 c = bfd_zalloc (abfd, section->size);
b49e97c9 13220 if (c == NULL)
b34976b6 13221 return FALSE;
f0abc2a1 13222 mips_elf_section_data (section)->u.tdata = c;
b49e97c9
TS
13223 }
13224
9719ad41 13225 memcpy (c + offset, location, count);
b49e97c9
TS
13226 }
13227
13228 return _bfd_elf_set_section_contents (abfd, section, location, offset,
13229 count);
13230}
13231
13232/* This is almost identical to bfd_generic_get_... except that some
13233 MIPS relocations need to be handled specially. Sigh. */
13234
13235bfd_byte *
9719ad41
RS
13236_bfd_elf_mips_get_relocated_section_contents
13237 (bfd *abfd,
13238 struct bfd_link_info *link_info,
13239 struct bfd_link_order *link_order,
13240 bfd_byte *data,
13241 bfd_boolean relocatable,
13242 asymbol **symbols)
b49e97c9
TS
13243{
13244 /* Get enough memory to hold the stuff */
13245 bfd *input_bfd = link_order->u.indirect.section->owner;
13246 asection *input_section = link_order->u.indirect.section;
eea6121a 13247 bfd_size_type sz;
b49e97c9
TS
13248
13249 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
13250 arelent **reloc_vector = NULL;
13251 long reloc_count;
13252
13253 if (reloc_size < 0)
13254 goto error_return;
13255
9719ad41 13256 reloc_vector = bfd_malloc (reloc_size);
b49e97c9
TS
13257 if (reloc_vector == NULL && reloc_size != 0)
13258 goto error_return;
13259
13260 /* read in the section */
eea6121a
AM
13261 sz = input_section->rawsize ? input_section->rawsize : input_section->size;
13262 if (!bfd_get_section_contents (input_bfd, input_section, data, 0, sz))
b49e97c9
TS
13263 goto error_return;
13264
b49e97c9
TS
13265 reloc_count = bfd_canonicalize_reloc (input_bfd,
13266 input_section,
13267 reloc_vector,
13268 symbols);
13269 if (reloc_count < 0)
13270 goto error_return;
13271
13272 if (reloc_count > 0)
13273 {
13274 arelent **parent;
13275 /* for mips */
13276 int gp_found;
13277 bfd_vma gp = 0x12345678; /* initialize just to shut gcc up */
13278
13279 {
13280 struct bfd_hash_entry *h;
13281 struct bfd_link_hash_entry *lh;
13282 /* Skip all this stuff if we aren't mixing formats. */
13283 if (abfd && input_bfd
13284 && abfd->xvec == input_bfd->xvec)
13285 lh = 0;
13286 else
13287 {
b34976b6 13288 h = bfd_hash_lookup (&link_info->hash->table, "_gp", FALSE, FALSE);
b49e97c9
TS
13289 lh = (struct bfd_link_hash_entry *) h;
13290 }
13291 lookup:
13292 if (lh)
13293 {
13294 switch (lh->type)
13295 {
13296 case bfd_link_hash_undefined:
13297 case bfd_link_hash_undefweak:
13298 case bfd_link_hash_common:
13299 gp_found = 0;
13300 break;
13301 case bfd_link_hash_defined:
13302 case bfd_link_hash_defweak:
13303 gp_found = 1;
13304 gp = lh->u.def.value;
13305 break;
13306 case bfd_link_hash_indirect:
13307 case bfd_link_hash_warning:
13308 lh = lh->u.i.link;
13309 /* @@FIXME ignoring warning for now */
13310 goto lookup;
13311 case bfd_link_hash_new:
13312 default:
13313 abort ();
13314 }
13315 }
13316 else
13317 gp_found = 0;
13318 }
13319 /* end mips */
9719ad41 13320 for (parent = reloc_vector; *parent != NULL; parent++)
b49e97c9 13321 {
9719ad41 13322 char *error_message = NULL;
b49e97c9
TS
13323 bfd_reloc_status_type r;
13324
13325 /* Specific to MIPS: Deal with relocation types that require
13326 knowing the gp of the output bfd. */
13327 asymbol *sym = *(*parent)->sym_ptr_ptr;
b49e97c9 13328
8236346f
EC
13329 /* If we've managed to find the gp and have a special
13330 function for the relocation then go ahead, else default
13331 to the generic handling. */
13332 if (gp_found
13333 && (*parent)->howto->special_function
13334 == _bfd_mips_elf32_gprel16_reloc)
13335 r = _bfd_mips_elf_gprel16_with_gp (input_bfd, sym, *parent,
13336 input_section, relocatable,
13337 data, gp);
13338 else
86324f90 13339 r = bfd_perform_relocation (input_bfd, *parent, data,
8236346f
EC
13340 input_section,
13341 relocatable ? abfd : NULL,
13342 &error_message);
b49e97c9 13343
1049f94e 13344 if (relocatable)
b49e97c9
TS
13345 {
13346 asection *os = input_section->output_section;
13347
13348 /* A partial link, so keep the relocs */
13349 os->orelocation[os->reloc_count] = *parent;
13350 os->reloc_count++;
13351 }
13352
13353 if (r != bfd_reloc_ok)
13354 {
13355 switch (r)
13356 {
13357 case bfd_reloc_undefined:
1a72702b
AM
13358 (*link_info->callbacks->undefined_symbol)
13359 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13360 input_bfd, input_section, (*parent)->address, TRUE);
b49e97c9
TS
13361 break;
13362 case bfd_reloc_dangerous:
9719ad41 13363 BFD_ASSERT (error_message != NULL);
1a72702b
AM
13364 (*link_info->callbacks->reloc_dangerous)
13365 (link_info, error_message,
13366 input_bfd, input_section, (*parent)->address);
b49e97c9
TS
13367 break;
13368 case bfd_reloc_overflow:
1a72702b
AM
13369 (*link_info->callbacks->reloc_overflow)
13370 (link_info, NULL,
13371 bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13372 (*parent)->howto->name, (*parent)->addend,
13373 input_bfd, input_section, (*parent)->address);
b49e97c9
TS
13374 break;
13375 case bfd_reloc_outofrange:
13376 default:
13377 abort ();
13378 break;
13379 }
13380
13381 }
13382 }
13383 }
13384 if (reloc_vector != NULL)
13385 free (reloc_vector);
13386 return data;
13387
dc1e8a47 13388 error_return:
b49e97c9
TS
13389 if (reloc_vector != NULL)
13390 free (reloc_vector);
13391 return NULL;
13392}
13393\f
df58fc94
RS
13394static bfd_boolean
13395mips_elf_relax_delete_bytes (bfd *abfd,
13396 asection *sec, bfd_vma addr, int count)
13397{
13398 Elf_Internal_Shdr *symtab_hdr;
13399 unsigned int sec_shndx;
13400 bfd_byte *contents;
13401 Elf_Internal_Rela *irel, *irelend;
13402 Elf_Internal_Sym *isym;
13403 Elf_Internal_Sym *isymend;
13404 struct elf_link_hash_entry **sym_hashes;
13405 struct elf_link_hash_entry **end_hashes;
13406 struct elf_link_hash_entry **start_hashes;
13407 unsigned int symcount;
13408
13409 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
13410 contents = elf_section_data (sec)->this_hdr.contents;
13411
13412 irel = elf_section_data (sec)->relocs;
13413 irelend = irel + sec->reloc_count;
13414
13415 /* Actually delete the bytes. */
13416 memmove (contents + addr, contents + addr + count,
13417 (size_t) (sec->size - addr - count));
13418 sec->size -= count;
13419
13420 /* Adjust all the relocs. */
13421 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
13422 {
13423 /* Get the new reloc address. */
13424 if (irel->r_offset > addr)
13425 irel->r_offset -= count;
13426 }
13427
13428 BFD_ASSERT (addr % 2 == 0);
13429 BFD_ASSERT (count % 2 == 0);
13430
13431 /* Adjust the local symbols defined in this section. */
13432 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
13433 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
13434 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
2309ddf2 13435 if (isym->st_shndx == sec_shndx && isym->st_value > addr)
df58fc94
RS
13436 isym->st_value -= count;
13437
13438 /* Now adjust the global symbols defined in this section. */
13439 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
13440 - symtab_hdr->sh_info);
13441 sym_hashes = start_hashes = elf_sym_hashes (abfd);
13442 end_hashes = sym_hashes + symcount;
13443
13444 for (; sym_hashes < end_hashes; sym_hashes++)
13445 {
13446 struct elf_link_hash_entry *sym_hash = *sym_hashes;
13447
13448 if ((sym_hash->root.type == bfd_link_hash_defined
13449 || sym_hash->root.type == bfd_link_hash_defweak)
13450 && sym_hash->root.u.def.section == sec)
13451 {
2309ddf2 13452 bfd_vma value = sym_hash->root.u.def.value;
df58fc94 13453
df58fc94
RS
13454 if (ELF_ST_IS_MICROMIPS (sym_hash->other))
13455 value &= MINUS_TWO;
13456 if (value > addr)
13457 sym_hash->root.u.def.value -= count;
13458 }
13459 }
13460
13461 return TRUE;
13462}
13463
13464
13465/* Opcodes needed for microMIPS relaxation as found in
13466 opcodes/micromips-opc.c. */
13467
13468struct opcode_descriptor {
13469 unsigned long match;
13470 unsigned long mask;
13471};
13472
13473/* The $ra register aka $31. */
13474
13475#define RA 31
13476
13477/* 32-bit instruction format register fields. */
13478
13479#define OP32_SREG(opcode) (((opcode) >> 16) & 0x1f)
13480#define OP32_TREG(opcode) (((opcode) >> 21) & 0x1f)
13481
13482/* Check if a 5-bit register index can be abbreviated to 3 bits. */
13483
13484#define OP16_VALID_REG(r) \
13485 ((2 <= (r) && (r) <= 7) || (16 <= (r) && (r) <= 17))
13486
13487
13488/* 32-bit and 16-bit branches. */
13489
13490static const struct opcode_descriptor b_insns_32[] = {
13491 { /* "b", "p", */ 0x40400000, 0xffff0000 }, /* bgez 0 */
13492 { /* "b", "p", */ 0x94000000, 0xffff0000 }, /* beq 0, 0 */
13493 { 0, 0 } /* End marker for find_match(). */
13494};
13495
13496static const struct opcode_descriptor bc_insn_32 =
13497 { /* "bc(1|2)(ft)", "N,p", */ 0x42800000, 0xfec30000 };
13498
13499static const struct opcode_descriptor bz_insn_32 =
13500 { /* "b(g|l)(e|t)z", "s,p", */ 0x40000000, 0xff200000 };
13501
13502static const struct opcode_descriptor bzal_insn_32 =
13503 { /* "b(ge|lt)zal", "s,p", */ 0x40200000, 0xffa00000 };
13504
13505static const struct opcode_descriptor beq_insn_32 =
13506 { /* "b(eq|ne)", "s,t,p", */ 0x94000000, 0xdc000000 };
13507
13508static const struct opcode_descriptor b_insn_16 =
13509 { /* "b", "mD", */ 0xcc00, 0xfc00 };
13510
13511static const struct opcode_descriptor bz_insn_16 =
c088dedf 13512 { /* "b(eq|ne)z", "md,mE", */ 0x8c00, 0xdc00 };
df58fc94
RS
13513
13514
13515/* 32-bit and 16-bit branch EQ and NE zero. */
13516
13517/* NOTE: All opcode tables have BEQ/BNE in the same order: first the
13518 eq and second the ne. This convention is used when replacing a
13519 32-bit BEQ/BNE with the 16-bit version. */
13520
13521#define BZC32_REG_FIELD(r) (((r) & 0x1f) << 16)
13522
13523static const struct opcode_descriptor bz_rs_insns_32[] = {
13524 { /* "beqz", "s,p", */ 0x94000000, 0xffe00000 },
13525 { /* "bnez", "s,p", */ 0xb4000000, 0xffe00000 },
13526 { 0, 0 } /* End marker for find_match(). */
13527};
13528
13529static const struct opcode_descriptor bz_rt_insns_32[] = {
13530 { /* "beqz", "t,p", */ 0x94000000, 0xfc01f000 },
13531 { /* "bnez", "t,p", */ 0xb4000000, 0xfc01f000 },
13532 { 0, 0 } /* End marker for find_match(). */
13533};
13534
13535static const struct opcode_descriptor bzc_insns_32[] = {
13536 { /* "beqzc", "s,p", */ 0x40e00000, 0xffe00000 },
13537 { /* "bnezc", "s,p", */ 0x40a00000, 0xffe00000 },
13538 { 0, 0 } /* End marker for find_match(). */
13539};
13540
13541static const struct opcode_descriptor bz_insns_16[] = {
13542 { /* "beqz", "md,mE", */ 0x8c00, 0xfc00 },
13543 { /* "bnez", "md,mE", */ 0xac00, 0xfc00 },
13544 { 0, 0 } /* End marker for find_match(). */
13545};
13546
13547/* Switch between a 5-bit register index and its 3-bit shorthand. */
13548
e67f83e5 13549#define BZ16_REG(opcode) ((((((opcode) >> 7) & 7) + 0x1e) & 0xf) + 2)
eb6b0cf4 13550#define BZ16_REG_FIELD(r) (((r) & 7) << 7)
df58fc94
RS
13551
13552
13553/* 32-bit instructions with a delay slot. */
13554
13555static const struct opcode_descriptor jal_insn_32_bd16 =
13556 { /* "jals", "a", */ 0x74000000, 0xfc000000 };
13557
13558static const struct opcode_descriptor jal_insn_32_bd32 =
13559 { /* "jal", "a", */ 0xf4000000, 0xfc000000 };
13560
13561static const struct opcode_descriptor jal_x_insn_32_bd32 =
13562 { /* "jal[x]", "a", */ 0xf0000000, 0xf8000000 };
13563
13564static const struct opcode_descriptor j_insn_32 =
13565 { /* "j", "a", */ 0xd4000000, 0xfc000000 };
13566
13567static const struct opcode_descriptor jalr_insn_32 =
13568 { /* "jalr[.hb]", "t,s", */ 0x00000f3c, 0xfc00efff };
13569
13570/* This table can be compacted, because no opcode replacement is made. */
13571
13572static const struct opcode_descriptor ds_insns_32_bd16[] = {
13573 { /* "jals", "a", */ 0x74000000, 0xfc000000 },
13574
13575 { /* "jalrs[.hb]", "t,s", */ 0x00004f3c, 0xfc00efff },
13576 { /* "b(ge|lt)zals", "s,p", */ 0x42200000, 0xffa00000 },
13577
13578 { /* "b(g|l)(e|t)z", "s,p", */ 0x40000000, 0xff200000 },
13579 { /* "b(eq|ne)", "s,t,p", */ 0x94000000, 0xdc000000 },
13580 { /* "j", "a", */ 0xd4000000, 0xfc000000 },
13581 { 0, 0 } /* End marker for find_match(). */
13582};
13583
13584/* This table can be compacted, because no opcode replacement is made. */
13585
13586static const struct opcode_descriptor ds_insns_32_bd32[] = {
13587 { /* "jal[x]", "a", */ 0xf0000000, 0xf8000000 },
13588
13589 { /* "jalr[.hb]", "t,s", */ 0x00000f3c, 0xfc00efff },
13590 { /* "b(ge|lt)zal", "s,p", */ 0x40200000, 0xffa00000 },
13591 { 0, 0 } /* End marker for find_match(). */
13592};
13593
13594
13595/* 16-bit instructions with a delay slot. */
13596
13597static const struct opcode_descriptor jalr_insn_16_bd16 =
13598 { /* "jalrs", "my,mj", */ 0x45e0, 0xffe0 };
13599
13600static const struct opcode_descriptor jalr_insn_16_bd32 =
13601 { /* "jalr", "my,mj", */ 0x45c0, 0xffe0 };
13602
13603static const struct opcode_descriptor jr_insn_16 =
13604 { /* "jr", "mj", */ 0x4580, 0xffe0 };
13605
13606#define JR16_REG(opcode) ((opcode) & 0x1f)
13607
13608/* This table can be compacted, because no opcode replacement is made. */
13609
13610static const struct opcode_descriptor ds_insns_16_bd16[] = {
13611 { /* "jalrs", "my,mj", */ 0x45e0, 0xffe0 },
13612
13613 { /* "b", "mD", */ 0xcc00, 0xfc00 },
13614 { /* "b(eq|ne)z", "md,mE", */ 0x8c00, 0xdc00 },
13615 { /* "jr", "mj", */ 0x4580, 0xffe0 },
13616 { 0, 0 } /* End marker for find_match(). */
13617};
13618
13619
13620/* LUI instruction. */
13621
13622static const struct opcode_descriptor lui_insn =
13623 { /* "lui", "s,u", */ 0x41a00000, 0xffe00000 };
13624
13625
13626/* ADDIU instruction. */
13627
13628static const struct opcode_descriptor addiu_insn =
13629 { /* "addiu", "t,r,j", */ 0x30000000, 0xfc000000 };
13630
13631static const struct opcode_descriptor addiupc_insn =
13632 { /* "addiu", "mb,$pc,mQ", */ 0x78000000, 0xfc000000 };
13633
13634#define ADDIUPC_REG_FIELD(r) \
13635 (((2 <= (r) && (r) <= 7) ? (r) : ((r) - 16)) << 23)
13636
13637
13638/* Relaxable instructions in a JAL delay slot: MOVE. */
13639
13640/* The 16-bit move has rd in 9:5 and rs in 4:0. The 32-bit moves
13641 (ADDU, OR) have rd in 15:11 and rs in 10:16. */
13642#define MOVE32_RD(opcode) (((opcode) >> 11) & 0x1f)
13643#define MOVE32_RS(opcode) (((opcode) >> 16) & 0x1f)
13644
13645#define MOVE16_RD_FIELD(r) (((r) & 0x1f) << 5)
13646#define MOVE16_RS_FIELD(r) (((r) & 0x1f) )
13647
13648static const struct opcode_descriptor move_insns_32[] = {
df58fc94 13649 { /* "move", "d,s", */ 0x00000290, 0xffe007ff }, /* or d,s,$0 */
40fc1451 13650 { /* "move", "d,s", */ 0x00000150, 0xffe007ff }, /* addu d,s,$0 */
df58fc94
RS
13651 { 0, 0 } /* End marker for find_match(). */
13652};
13653
13654static const struct opcode_descriptor move_insn_16 =
13655 { /* "move", "mp,mj", */ 0x0c00, 0xfc00 };
13656
13657
13658/* NOP instructions. */
13659
13660static const struct opcode_descriptor nop_insn_32 =
13661 { /* "nop", "", */ 0x00000000, 0xffffffff };
13662
13663static const struct opcode_descriptor nop_insn_16 =
13664 { /* "nop", "", */ 0x0c00, 0xffff };
13665
13666
13667/* Instruction match support. */
13668
13669#define MATCH(opcode, insn) ((opcode & insn.mask) == insn.match)
13670
13671static int
13672find_match (unsigned long opcode, const struct opcode_descriptor insn[])
13673{
13674 unsigned long indx;
13675
13676 for (indx = 0; insn[indx].mask != 0; indx++)
13677 if (MATCH (opcode, insn[indx]))
13678 return indx;
13679
13680 return -1;
13681}
13682
13683
13684/* Branch and delay slot decoding support. */
13685
13686/* If PTR points to what *might* be a 16-bit branch or jump, then
13687 return the minimum length of its delay slot, otherwise return 0.
13688 Non-zero results are not definitive as we might be checking against
13689 the second half of another instruction. */
13690
13691static int
13692check_br16_dslot (bfd *abfd, bfd_byte *ptr)
13693{
13694 unsigned long opcode;
13695 int bdsize;
13696
13697 opcode = bfd_get_16 (abfd, ptr);
13698 if (MATCH (opcode, jalr_insn_16_bd32) != 0)
13699 /* 16-bit branch/jump with a 32-bit delay slot. */
13700 bdsize = 4;
13701 else if (MATCH (opcode, jalr_insn_16_bd16) != 0
13702 || find_match (opcode, ds_insns_16_bd16) >= 0)
13703 /* 16-bit branch/jump with a 16-bit delay slot. */
13704 bdsize = 2;
13705 else
13706 /* No delay slot. */
13707 bdsize = 0;
13708
13709 return bdsize;
13710}
13711
13712/* If PTR points to what *might* be a 32-bit branch or jump, then
13713 return the minimum length of its delay slot, otherwise return 0.
13714 Non-zero results are not definitive as we might be checking against
13715 the second half of another instruction. */
13716
13717static int
13718check_br32_dslot (bfd *abfd, bfd_byte *ptr)
13719{
13720 unsigned long opcode;
13721 int bdsize;
13722
d21911ea 13723 opcode = bfd_get_micromips_32 (abfd, ptr);
df58fc94
RS
13724 if (find_match (opcode, ds_insns_32_bd32) >= 0)
13725 /* 32-bit branch/jump with a 32-bit delay slot. */
13726 bdsize = 4;
13727 else if (find_match (opcode, ds_insns_32_bd16) >= 0)
13728 /* 32-bit branch/jump with a 16-bit delay slot. */
13729 bdsize = 2;
13730 else
13731 /* No delay slot. */
13732 bdsize = 0;
13733
13734 return bdsize;
13735}
13736
13737/* If PTR points to a 16-bit branch or jump with a 32-bit delay slot
13738 that doesn't fiddle with REG, then return TRUE, otherwise FALSE. */
13739
13740static bfd_boolean
13741check_br16 (bfd *abfd, bfd_byte *ptr, unsigned long reg)
13742{
13743 unsigned long opcode;
13744
13745 opcode = bfd_get_16 (abfd, ptr);
13746 if (MATCH (opcode, b_insn_16)
13747 /* B16 */
13748 || (MATCH (opcode, jr_insn_16) && reg != JR16_REG (opcode))
13749 /* JR16 */
13750 || (MATCH (opcode, bz_insn_16) && reg != BZ16_REG (opcode))
13751 /* BEQZ16, BNEZ16 */
13752 || (MATCH (opcode, jalr_insn_16_bd32)
13753 /* JALR16 */
13754 && reg != JR16_REG (opcode) && reg != RA))
13755 return TRUE;
13756
13757 return FALSE;
13758}
13759
13760/* If PTR points to a 32-bit branch or jump that doesn't fiddle with REG,
13761 then return TRUE, otherwise FALSE. */
13762
f41e5fcc 13763static bfd_boolean
df58fc94
RS
13764check_br32 (bfd *abfd, bfd_byte *ptr, unsigned long reg)
13765{
13766 unsigned long opcode;
13767
d21911ea 13768 opcode = bfd_get_micromips_32 (abfd, ptr);
df58fc94
RS
13769 if (MATCH (opcode, j_insn_32)
13770 /* J */
13771 || MATCH (opcode, bc_insn_32)
13772 /* BC1F, BC1T, BC2F, BC2T */
13773 || (MATCH (opcode, jal_x_insn_32_bd32) && reg != RA)
13774 /* JAL, JALX */
13775 || (MATCH (opcode, bz_insn_32) && reg != OP32_SREG (opcode))
13776 /* BGEZ, BGTZ, BLEZ, BLTZ */
13777 || (MATCH (opcode, bzal_insn_32)
13778 /* BGEZAL, BLTZAL */
13779 && reg != OP32_SREG (opcode) && reg != RA)
13780 || ((MATCH (opcode, jalr_insn_32) || MATCH (opcode, beq_insn_32))
13781 /* JALR, JALR.HB, BEQ, BNE */
13782 && reg != OP32_SREG (opcode) && reg != OP32_TREG (opcode)))
13783 return TRUE;
13784
13785 return FALSE;
13786}
13787
80cab405
MR
13788/* If the instruction encoding at PTR and relocations [INTERNAL_RELOCS,
13789 IRELEND) at OFFSET indicate that there must be a compact branch there,
13790 then return TRUE, otherwise FALSE. */
df58fc94
RS
13791
13792static bfd_boolean
80cab405
MR
13793check_relocated_bzc (bfd *abfd, const bfd_byte *ptr, bfd_vma offset,
13794 const Elf_Internal_Rela *internal_relocs,
13795 const Elf_Internal_Rela *irelend)
df58fc94 13796{
80cab405
MR
13797 const Elf_Internal_Rela *irel;
13798 unsigned long opcode;
13799
d21911ea 13800 opcode = bfd_get_micromips_32 (abfd, ptr);
80cab405
MR
13801 if (find_match (opcode, bzc_insns_32) < 0)
13802 return FALSE;
df58fc94
RS
13803
13804 for (irel = internal_relocs; irel < irelend; irel++)
80cab405
MR
13805 if (irel->r_offset == offset
13806 && ELF32_R_TYPE (irel->r_info) == R_MICROMIPS_PC16_S1)
13807 return TRUE;
13808
df58fc94
RS
13809 return FALSE;
13810}
80cab405
MR
13811
13812/* Bitsize checking. */
13813#define IS_BITSIZE(val, N) \
13814 (((((val) & ((1ULL << (N)) - 1)) ^ (1ULL << ((N) - 1))) \
13815 - (1ULL << ((N) - 1))) == (val))
13816
df58fc94
RS
13817\f
13818bfd_boolean
13819_bfd_mips_elf_relax_section (bfd *abfd, asection *sec,
13820 struct bfd_link_info *link_info,
13821 bfd_boolean *again)
13822{
833794fc 13823 bfd_boolean insn32 = mips_elf_hash_table (link_info)->insn32;
df58fc94
RS
13824 Elf_Internal_Shdr *symtab_hdr;
13825 Elf_Internal_Rela *internal_relocs;
13826 Elf_Internal_Rela *irel, *irelend;
13827 bfd_byte *contents = NULL;
13828 Elf_Internal_Sym *isymbuf = NULL;
13829
13830 /* Assume nothing changes. */
13831 *again = FALSE;
13832
13833 /* We don't have to do anything for a relocatable link, if
13834 this section does not have relocs, or if this is not a
13835 code section. */
13836
0e1862bb 13837 if (bfd_link_relocatable (link_info)
df58fc94
RS
13838 || (sec->flags & SEC_RELOC) == 0
13839 || sec->reloc_count == 0
13840 || (sec->flags & SEC_CODE) == 0)
13841 return TRUE;
13842
13843 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
13844
13845 /* Get a copy of the native relocations. */
13846 internal_relocs = (_bfd_elf_link_read_relocs
2c3fc389 13847 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
df58fc94
RS
13848 link_info->keep_memory));
13849 if (internal_relocs == NULL)
13850 goto error_return;
13851
13852 /* Walk through them looking for relaxing opportunities. */
13853 irelend = internal_relocs + sec->reloc_count;
13854 for (irel = internal_relocs; irel < irelend; irel++)
13855 {
13856 unsigned long r_symndx = ELF32_R_SYM (irel->r_info);
13857 unsigned int r_type = ELF32_R_TYPE (irel->r_info);
13858 bfd_boolean target_is_micromips_code_p;
13859 unsigned long opcode;
13860 bfd_vma symval;
13861 bfd_vma pcrval;
2309ddf2 13862 bfd_byte *ptr;
df58fc94
RS
13863 int fndopc;
13864
13865 /* The number of bytes to delete for relaxation and from where
07d6d2b8 13866 to delete these bytes starting at irel->r_offset. */
df58fc94
RS
13867 int delcnt = 0;
13868 int deloff = 0;
13869
13870 /* If this isn't something that can be relaxed, then ignore
07d6d2b8 13871 this reloc. */
df58fc94
RS
13872 if (r_type != R_MICROMIPS_HI16
13873 && r_type != R_MICROMIPS_PC16_S1
2309ddf2 13874 && r_type != R_MICROMIPS_26_S1)
df58fc94
RS
13875 continue;
13876
13877 /* Get the section contents if we haven't done so already. */
13878 if (contents == NULL)
13879 {
13880 /* Get cached copy if it exists. */
13881 if (elf_section_data (sec)->this_hdr.contents != NULL)
13882 contents = elf_section_data (sec)->this_hdr.contents;
13883 /* Go get them off disk. */
13884 else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
13885 goto error_return;
13886 }
2309ddf2 13887 ptr = contents + irel->r_offset;
df58fc94
RS
13888
13889 /* Read this BFD's local symbols if we haven't done so already. */
13890 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
13891 {
13892 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
13893 if (isymbuf == NULL)
13894 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
13895 symtab_hdr->sh_info, 0,
13896 NULL, NULL, NULL);
13897 if (isymbuf == NULL)
13898 goto error_return;
13899 }
13900
13901 /* Get the value of the symbol referred to by the reloc. */
13902 if (r_symndx < symtab_hdr->sh_info)
13903 {
13904 /* A local symbol. */
13905 Elf_Internal_Sym *isym;
13906 asection *sym_sec;
13907
13908 isym = isymbuf + r_symndx;
13909 if (isym->st_shndx == SHN_UNDEF)
13910 sym_sec = bfd_und_section_ptr;
13911 else if (isym->st_shndx == SHN_ABS)
13912 sym_sec = bfd_abs_section_ptr;
13913 else if (isym->st_shndx == SHN_COMMON)
13914 sym_sec = bfd_com_section_ptr;
13915 else
13916 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
13917 symval = (isym->st_value
13918 + sym_sec->output_section->vma
13919 + sym_sec->output_offset);
13920 target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (isym->st_other);
13921 }
13922 else
13923 {
13924 unsigned long indx;
13925 struct elf_link_hash_entry *h;
13926
13927 /* An external symbol. */
13928 indx = r_symndx - symtab_hdr->sh_info;
13929 h = elf_sym_hashes (abfd)[indx];
13930 BFD_ASSERT (h != NULL);
13931
13932 if (h->root.type != bfd_link_hash_defined
13933 && h->root.type != bfd_link_hash_defweak)
13934 /* This appears to be a reference to an undefined
13935 symbol. Just ignore it -- it will be caught by the
13936 regular reloc processing. */
13937 continue;
13938
13939 symval = (h->root.u.def.value
13940 + h->root.u.def.section->output_section->vma
13941 + h->root.u.def.section->output_offset);
13942 target_is_micromips_code_p = (!h->needs_plt
13943 && ELF_ST_IS_MICROMIPS (h->other));
13944 }
13945
13946
13947 /* For simplicity of coding, we are going to modify the
07d6d2b8
AM
13948 section contents, the section relocs, and the BFD symbol
13949 table. We must tell the rest of the code not to free up this
13950 information. It would be possible to instead create a table
13951 of changes which have to be made, as is done in coff-mips.c;
13952 that would be more work, but would require less memory when
13953 the linker is run. */
df58fc94
RS
13954
13955 /* Only 32-bit instructions relaxed. */
13956 if (irel->r_offset + 4 > sec->size)
13957 continue;
13958
d21911ea 13959 opcode = bfd_get_micromips_32 (abfd, ptr);
df58fc94
RS
13960
13961 /* This is the pc-relative distance from the instruction the
07d6d2b8 13962 relocation is applied to, to the symbol referred. */
df58fc94
RS
13963 pcrval = (symval
13964 - (sec->output_section->vma + sec->output_offset)
13965 - irel->r_offset);
13966
13967 /* R_MICROMIPS_HI16 / LUI relaxation to nil, performing relaxation
07d6d2b8
AM
13968 of corresponding R_MICROMIPS_LO16 to R_MICROMIPS_HI0_LO16 or
13969 R_MICROMIPS_PC23_S2. The R_MICROMIPS_PC23_S2 condition is
df58fc94 13970
07d6d2b8 13971 (symval % 4 == 0 && IS_BITSIZE (pcrval, 25))
df58fc94 13972
07d6d2b8
AM
13973 where pcrval has first to be adjusted to apply against the LO16
13974 location (we make the adjustment later on, when we have figured
13975 out the offset). */
df58fc94
RS
13976 if (r_type == R_MICROMIPS_HI16 && MATCH (opcode, lui_insn))
13977 {
80cab405 13978 bfd_boolean bzc = FALSE;
df58fc94
RS
13979 unsigned long nextopc;
13980 unsigned long reg;
13981 bfd_vma offset;
13982
13983 /* Give up if the previous reloc was a HI16 against this symbol
13984 too. */
13985 if (irel > internal_relocs
13986 && ELF32_R_TYPE (irel[-1].r_info) == R_MICROMIPS_HI16
13987 && ELF32_R_SYM (irel[-1].r_info) == r_symndx)
13988 continue;
13989
13990 /* Or if the next reloc is not a LO16 against this symbol. */
13991 if (irel + 1 >= irelend
13992 || ELF32_R_TYPE (irel[1].r_info) != R_MICROMIPS_LO16
13993 || ELF32_R_SYM (irel[1].r_info) != r_symndx)
13994 continue;
13995
13996 /* Or if the second next reloc is a LO16 against this symbol too. */
13997 if (irel + 2 >= irelend
13998 && ELF32_R_TYPE (irel[2].r_info) == R_MICROMIPS_LO16
13999 && ELF32_R_SYM (irel[2].r_info) == r_symndx)
14000 continue;
14001
80cab405
MR
14002 /* See if the LUI instruction *might* be in a branch delay slot.
14003 We check whether what looks like a 16-bit branch or jump is
14004 actually an immediate argument to a compact branch, and let
14005 it through if so. */
df58fc94 14006 if (irel->r_offset >= 2
2309ddf2 14007 && check_br16_dslot (abfd, ptr - 2)
df58fc94 14008 && !(irel->r_offset >= 4
80cab405
MR
14009 && (bzc = check_relocated_bzc (abfd,
14010 ptr - 4, irel->r_offset - 4,
14011 internal_relocs, irelend))))
df58fc94
RS
14012 continue;
14013 if (irel->r_offset >= 4
80cab405 14014 && !bzc
2309ddf2 14015 && check_br32_dslot (abfd, ptr - 4))
df58fc94
RS
14016 continue;
14017
14018 reg = OP32_SREG (opcode);
14019
14020 /* We only relax adjacent instructions or ones separated with
14021 a branch or jump that has a delay slot. The branch or jump
14022 must not fiddle with the register used to hold the address.
14023 Subtract 4 for the LUI itself. */
14024 offset = irel[1].r_offset - irel[0].r_offset;
14025 switch (offset - 4)
14026 {
14027 case 0:
14028 break;
14029 case 2:
2309ddf2 14030 if (check_br16 (abfd, ptr + 4, reg))
df58fc94
RS
14031 break;
14032 continue;
14033 case 4:
2309ddf2 14034 if (check_br32 (abfd, ptr + 4, reg))
df58fc94
RS
14035 break;
14036 continue;
14037 default:
14038 continue;
14039 }
14040
d21911ea 14041 nextopc = bfd_get_micromips_32 (abfd, contents + irel[1].r_offset);
df58fc94
RS
14042
14043 /* Give up unless the same register is used with both
14044 relocations. */
14045 if (OP32_SREG (nextopc) != reg)
14046 continue;
14047
14048 /* Now adjust pcrval, subtracting the offset to the LO16 reloc
14049 and rounding up to take masking of the two LSBs into account. */
14050 pcrval = ((pcrval - offset + 3) | 3) ^ 3;
14051
14052 /* R_MICROMIPS_LO16 relaxation to R_MICROMIPS_HI0_LO16. */
14053 if (IS_BITSIZE (symval, 16))
14054 {
14055 /* Fix the relocation's type. */
14056 irel[1].r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_HI0_LO16);
14057
14058 /* Instructions using R_MICROMIPS_LO16 have the base or
07d6d2b8
AM
14059 source register in bits 20:16. This register becomes $0
14060 (zero) as the result of the R_MICROMIPS_HI16 being 0. */
df58fc94
RS
14061 nextopc &= ~0x001f0000;
14062 bfd_put_16 (abfd, (nextopc >> 16) & 0xffff,
14063 contents + irel[1].r_offset);
14064 }
14065
14066 /* R_MICROMIPS_LO16 / ADDIU relaxation to R_MICROMIPS_PC23_S2.
14067 We add 4 to take LUI deletion into account while checking
14068 the PC-relative distance. */
14069 else if (symval % 4 == 0
14070 && IS_BITSIZE (pcrval + 4, 25)
14071 && MATCH (nextopc, addiu_insn)
14072 && OP32_TREG (nextopc) == OP32_SREG (nextopc)
14073 && OP16_VALID_REG (OP32_TREG (nextopc)))
14074 {
14075 /* Fix the relocation's type. */
14076 irel[1].r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC23_S2);
14077
14078 /* Replace ADDIU with the ADDIUPC version. */
14079 nextopc = (addiupc_insn.match
14080 | ADDIUPC_REG_FIELD (OP32_TREG (nextopc)));
14081
d21911ea
MR
14082 bfd_put_micromips_32 (abfd, nextopc,
14083 contents + irel[1].r_offset);
df58fc94
RS
14084 }
14085
14086 /* Can't do anything, give up, sigh... */
14087 else
14088 continue;
14089
14090 /* Fix the relocation's type. */
14091 irel->r_info = ELF32_R_INFO (r_symndx, R_MIPS_NONE);
14092
14093 /* Delete the LUI instruction: 4 bytes at irel->r_offset. */
14094 delcnt = 4;
14095 deloff = 0;
14096 }
14097
14098 /* Compact branch relaxation -- due to the multitude of macros
07d6d2b8
AM
14099 employed by the compiler/assembler, compact branches are not
14100 always generated. Obviously, this can/will be fixed elsewhere,
14101 but there is no drawback in double checking it here. */
df58fc94
RS
14102 else if (r_type == R_MICROMIPS_PC16_S1
14103 && irel->r_offset + 5 < sec->size
14104 && ((fndopc = find_match (opcode, bz_rs_insns_32)) >= 0
14105 || (fndopc = find_match (opcode, bz_rt_insns_32)) >= 0)
833794fc
MR
14106 && ((!insn32
14107 && (delcnt = MATCH (bfd_get_16 (abfd, ptr + 4),
14108 nop_insn_16) ? 2 : 0))
14109 || (irel->r_offset + 7 < sec->size
14110 && (delcnt = MATCH (bfd_get_micromips_32 (abfd,
14111 ptr + 4),
14112 nop_insn_32) ? 4 : 0))))
df58fc94
RS
14113 {
14114 unsigned long reg;
14115
14116 reg = OP32_SREG (opcode) ? OP32_SREG (opcode) : OP32_TREG (opcode);
14117
14118 /* Replace BEQZ/BNEZ with the compact version. */
14119 opcode = (bzc_insns_32[fndopc].match
14120 | BZC32_REG_FIELD (reg)
14121 | (opcode & 0xffff)); /* Addend value. */
14122
d21911ea 14123 bfd_put_micromips_32 (abfd, opcode, ptr);
df58fc94 14124
833794fc
MR
14125 /* Delete the delay slot NOP: two or four bytes from
14126 irel->offset + 4; delcnt has already been set above. */
df58fc94
RS
14127 deloff = 4;
14128 }
14129
14130 /* R_MICROMIPS_PC16_S1 relaxation to R_MICROMIPS_PC10_S1. We need
07d6d2b8 14131 to check the distance from the next instruction, so subtract 2. */
833794fc
MR
14132 else if (!insn32
14133 && r_type == R_MICROMIPS_PC16_S1
df58fc94
RS
14134 && IS_BITSIZE (pcrval - 2, 11)
14135 && find_match (opcode, b_insns_32) >= 0)
14136 {
14137 /* Fix the relocation's type. */
14138 irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC10_S1);
14139
a8685210 14140 /* Replace the 32-bit opcode with a 16-bit opcode. */
df58fc94
RS
14141 bfd_put_16 (abfd,
14142 (b_insn_16.match
14143 | (opcode & 0x3ff)), /* Addend value. */
2309ddf2 14144 ptr);
df58fc94
RS
14145
14146 /* Delete 2 bytes from irel->r_offset + 2. */
14147 delcnt = 2;
14148 deloff = 2;
14149 }
14150
14151 /* R_MICROMIPS_PC16_S1 relaxation to R_MICROMIPS_PC7_S1. We need
07d6d2b8 14152 to check the distance from the next instruction, so subtract 2. */
833794fc
MR
14153 else if (!insn32
14154 && r_type == R_MICROMIPS_PC16_S1
df58fc94
RS
14155 && IS_BITSIZE (pcrval - 2, 8)
14156 && (((fndopc = find_match (opcode, bz_rs_insns_32)) >= 0
14157 && OP16_VALID_REG (OP32_SREG (opcode)))
14158 || ((fndopc = find_match (opcode, bz_rt_insns_32)) >= 0
14159 && OP16_VALID_REG (OP32_TREG (opcode)))))
14160 {
14161 unsigned long reg;
14162
14163 reg = OP32_SREG (opcode) ? OP32_SREG (opcode) : OP32_TREG (opcode);
14164
14165 /* Fix the relocation's type. */
14166 irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC7_S1);
14167
a8685210 14168 /* Replace the 32-bit opcode with a 16-bit opcode. */
df58fc94
RS
14169 bfd_put_16 (abfd,
14170 (bz_insns_16[fndopc].match
14171 | BZ16_REG_FIELD (reg)
14172 | (opcode & 0x7f)), /* Addend value. */
2309ddf2 14173 ptr);
df58fc94
RS
14174
14175 /* Delete 2 bytes from irel->r_offset + 2. */
14176 delcnt = 2;
14177 deloff = 2;
14178 }
14179
14180 /* R_MICROMIPS_26_S1 -- JAL to JALS relaxation for microMIPS targets. */
833794fc
MR
14181 else if (!insn32
14182 && r_type == R_MICROMIPS_26_S1
df58fc94
RS
14183 && target_is_micromips_code_p
14184 && irel->r_offset + 7 < sec->size
14185 && MATCH (opcode, jal_insn_32_bd32))
14186 {
14187 unsigned long n32opc;
14188 bfd_boolean relaxed = FALSE;
14189
d21911ea 14190 n32opc = bfd_get_micromips_32 (abfd, ptr + 4);
df58fc94
RS
14191
14192 if (MATCH (n32opc, nop_insn_32))
14193 {
14194 /* Replace delay slot 32-bit NOP with a 16-bit NOP. */
2309ddf2 14195 bfd_put_16 (abfd, nop_insn_16.match, ptr + 4);
df58fc94
RS
14196
14197 relaxed = TRUE;
14198 }
14199 else if (find_match (n32opc, move_insns_32) >= 0)
14200 {
14201 /* Replace delay slot 32-bit MOVE with 16-bit MOVE. */
14202 bfd_put_16 (abfd,
14203 (move_insn_16.match
14204 | MOVE16_RD_FIELD (MOVE32_RD (n32opc))
14205 | MOVE16_RS_FIELD (MOVE32_RS (n32opc))),
2309ddf2 14206 ptr + 4);
df58fc94
RS
14207
14208 relaxed = TRUE;
14209 }
14210 /* Other 32-bit instructions relaxable to 16-bit
14211 instructions will be handled here later. */
14212
14213 if (relaxed)
14214 {
14215 /* JAL with 32-bit delay slot that is changed to a JALS
07d6d2b8 14216 with 16-bit delay slot. */
d21911ea 14217 bfd_put_micromips_32 (abfd, jal_insn_32_bd16.match, ptr);
df58fc94
RS
14218
14219 /* Delete 2 bytes from irel->r_offset + 6. */
14220 delcnt = 2;
14221 deloff = 6;
14222 }
14223 }
14224
14225 if (delcnt != 0)
14226 {
14227 /* Note that we've changed the relocs, section contents, etc. */
14228 elf_section_data (sec)->relocs = internal_relocs;
14229 elf_section_data (sec)->this_hdr.contents = contents;
14230 symtab_hdr->contents = (unsigned char *) isymbuf;
14231
14232 /* Delete bytes depending on the delcnt and deloff. */
14233 if (!mips_elf_relax_delete_bytes (abfd, sec,
14234 irel->r_offset + deloff, delcnt))
14235 goto error_return;
14236
14237 /* That will change things, so we should relax again.
14238 Note that this is not required, and it may be slow. */
14239 *again = TRUE;
14240 }
14241 }
14242
14243 if (isymbuf != NULL
14244 && symtab_hdr->contents != (unsigned char *) isymbuf)
14245 {
14246 if (! link_info->keep_memory)
14247 free (isymbuf);
14248 else
14249 {
14250 /* Cache the symbols for elf_link_input_bfd. */
14251 symtab_hdr->contents = (unsigned char *) isymbuf;
14252 }
14253 }
14254
14255 if (contents != NULL
14256 && elf_section_data (sec)->this_hdr.contents != contents)
14257 {
14258 if (! link_info->keep_memory)
14259 free (contents);
14260 else
14261 {
14262 /* Cache the section contents for elf_link_input_bfd. */
14263 elf_section_data (sec)->this_hdr.contents = contents;
14264 }
14265 }
14266
14267 if (internal_relocs != NULL
14268 && elf_section_data (sec)->relocs != internal_relocs)
14269 free (internal_relocs);
14270
14271 return TRUE;
14272
14273 error_return:
14274 if (isymbuf != NULL
14275 && symtab_hdr->contents != (unsigned char *) isymbuf)
14276 free (isymbuf);
14277 if (contents != NULL
14278 && elf_section_data (sec)->this_hdr.contents != contents)
14279 free (contents);
14280 if (internal_relocs != NULL
14281 && elf_section_data (sec)->relocs != internal_relocs)
14282 free (internal_relocs);
14283
14284 return FALSE;
14285}
14286\f
b49e97c9
TS
14287/* Create a MIPS ELF linker hash table. */
14288
14289struct bfd_link_hash_table *
9719ad41 14290_bfd_mips_elf_link_hash_table_create (bfd *abfd)
b49e97c9
TS
14291{
14292 struct mips_elf_link_hash_table *ret;
986f0783 14293 size_t amt = sizeof (struct mips_elf_link_hash_table);
b49e97c9 14294
7bf52ea2 14295 ret = bfd_zmalloc (amt);
9719ad41 14296 if (ret == NULL)
b49e97c9
TS
14297 return NULL;
14298
66eb6687
AM
14299 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
14300 mips_elf_link_hash_newfunc,
4dfe6ac6
NC
14301 sizeof (struct mips_elf_link_hash_entry),
14302 MIPS_ELF_DATA))
b49e97c9 14303 {
e2d34d7d 14304 free (ret);
b49e97c9
TS
14305 return NULL;
14306 }
1bbce132
MR
14307 ret->root.init_plt_refcount.plist = NULL;
14308 ret->root.init_plt_offset.plist = NULL;
b49e97c9 14309
b49e97c9
TS
14310 return &ret->root.root;
14311}
0a44bf69
RS
14312
14313/* Likewise, but indicate that the target is VxWorks. */
14314
14315struct bfd_link_hash_table *
14316_bfd_mips_vxworks_link_hash_table_create (bfd *abfd)
14317{
14318 struct bfd_link_hash_table *ret;
14319
14320 ret = _bfd_mips_elf_link_hash_table_create (abfd);
14321 if (ret)
14322 {
14323 struct mips_elf_link_hash_table *htab;
14324
14325 htab = (struct mips_elf_link_hash_table *) ret;
861fb55a
DJ
14326 htab->use_plts_and_copy_relocs = TRUE;
14327 htab->is_vxworks = TRUE;
0a44bf69
RS
14328 }
14329 return ret;
14330}
861fb55a
DJ
14331
14332/* A function that the linker calls if we are allowed to use PLTs
14333 and copy relocs. */
14334
14335void
14336_bfd_mips_elf_use_plts_and_copy_relocs (struct bfd_link_info *info)
14337{
14338 mips_elf_hash_table (info)->use_plts_and_copy_relocs = TRUE;
14339}
833794fc
MR
14340
14341/* A function that the linker calls to select between all or only
8b10b0b3 14342 32-bit microMIPS instructions, and between making or ignoring
47275900
MR
14343 branch relocation checks for invalid transitions between ISA modes.
14344 Also record whether we have been configured for a GNU target. */
833794fc
MR
14345
14346void
8b10b0b3 14347_bfd_mips_elf_linker_flags (struct bfd_link_info *info, bfd_boolean insn32,
47275900
MR
14348 bfd_boolean ignore_branch_isa,
14349 bfd_boolean gnu_target)
833794fc 14350{
8b10b0b3
MR
14351 mips_elf_hash_table (info)->insn32 = insn32;
14352 mips_elf_hash_table (info)->ignore_branch_isa = ignore_branch_isa;
47275900 14353 mips_elf_hash_table (info)->gnu_target = gnu_target;
833794fc 14354}
3734320d
MF
14355
14356/* A function that the linker calls to enable use of compact branches in
14357 linker generated code for MIPSR6. */
14358
14359void
14360_bfd_mips_elf_compact_branches (struct bfd_link_info *info, bfd_boolean on)
14361{
14362 mips_elf_hash_table (info)->compact_branches = on;
14363}
14364
b49e97c9 14365\f
c97c330b
MF
14366/* Structure for saying that BFD machine EXTENSION extends BASE. */
14367
14368struct mips_mach_extension
14369{
14370 unsigned long extension, base;
14371};
14372
14373
14374/* An array describing how BFD machines relate to one another. The entries
14375 are ordered topologically with MIPS I extensions listed last. */
14376
14377static const struct mips_mach_extension mips_mach_extensions[] =
14378{
14379 /* MIPS64r2 extensions. */
14380 { bfd_mach_mips_octeon3, bfd_mach_mips_octeon2 },
14381 { bfd_mach_mips_octeon2, bfd_mach_mips_octeonp },
14382 { bfd_mach_mips_octeonp, bfd_mach_mips_octeon },
14383 { bfd_mach_mips_octeon, bfd_mach_mipsisa64r2 },
9108bc33 14384 { bfd_mach_mips_gs264e, bfd_mach_mips_gs464e },
bd782c07 14385 { bfd_mach_mips_gs464e, bfd_mach_mips_gs464 },
ac8cb70f 14386 { bfd_mach_mips_gs464, bfd_mach_mipsisa64r2 },
c97c330b
MF
14387
14388 /* MIPS64 extensions. */
14389 { bfd_mach_mipsisa64r2, bfd_mach_mipsisa64 },
14390 { bfd_mach_mips_sb1, bfd_mach_mipsisa64 },
14391 { bfd_mach_mips_xlr, bfd_mach_mipsisa64 },
14392
14393 /* MIPS V extensions. */
14394 { bfd_mach_mipsisa64, bfd_mach_mips5 },
14395
14396 /* R10000 extensions. */
14397 { bfd_mach_mips12000, bfd_mach_mips10000 },
14398 { bfd_mach_mips14000, bfd_mach_mips10000 },
14399 { bfd_mach_mips16000, bfd_mach_mips10000 },
14400
14401 /* R5000 extensions. Note: the vr5500 ISA is an extension of the core
14402 vr5400 ISA, but doesn't include the multimedia stuff. It seems
14403 better to allow vr5400 and vr5500 code to be merged anyway, since
14404 many libraries will just use the core ISA. Perhaps we could add
14405 some sort of ASE flag if this ever proves a problem. */
14406 { bfd_mach_mips5500, bfd_mach_mips5400 },
14407 { bfd_mach_mips5400, bfd_mach_mips5000 },
14408
14409 /* MIPS IV extensions. */
14410 { bfd_mach_mips5, bfd_mach_mips8000 },
14411 { bfd_mach_mips10000, bfd_mach_mips8000 },
14412 { bfd_mach_mips5000, bfd_mach_mips8000 },
14413 { bfd_mach_mips7000, bfd_mach_mips8000 },
14414 { bfd_mach_mips9000, bfd_mach_mips8000 },
14415
14416 /* VR4100 extensions. */
14417 { bfd_mach_mips4120, bfd_mach_mips4100 },
14418 { bfd_mach_mips4111, bfd_mach_mips4100 },
14419
14420 /* MIPS III extensions. */
14421 { bfd_mach_mips_loongson_2e, bfd_mach_mips4000 },
14422 { bfd_mach_mips_loongson_2f, bfd_mach_mips4000 },
14423 { bfd_mach_mips8000, bfd_mach_mips4000 },
14424 { bfd_mach_mips4650, bfd_mach_mips4000 },
14425 { bfd_mach_mips4600, bfd_mach_mips4000 },
14426 { bfd_mach_mips4400, bfd_mach_mips4000 },
14427 { bfd_mach_mips4300, bfd_mach_mips4000 },
14428 { bfd_mach_mips4100, bfd_mach_mips4000 },
c97c330b
MF
14429 { bfd_mach_mips5900, bfd_mach_mips4000 },
14430
38bf472a
MR
14431 /* MIPS32r3 extensions. */
14432 { bfd_mach_mips_interaptiv_mr2, bfd_mach_mipsisa32r3 },
14433
14434 /* MIPS32r2 extensions. */
14435 { bfd_mach_mipsisa32r3, bfd_mach_mipsisa32r2 },
14436
c97c330b
MF
14437 /* MIPS32 extensions. */
14438 { bfd_mach_mipsisa32r2, bfd_mach_mipsisa32 },
14439
14440 /* MIPS II extensions. */
14441 { bfd_mach_mips4000, bfd_mach_mips6000 },
14442 { bfd_mach_mipsisa32, bfd_mach_mips6000 },
b417536f 14443 { bfd_mach_mips4010, bfd_mach_mips6000 },
c97c330b
MF
14444
14445 /* MIPS I extensions. */
14446 { bfd_mach_mips6000, bfd_mach_mips3000 },
14447 { bfd_mach_mips3900, bfd_mach_mips3000 }
14448};
14449
14450/* Return true if bfd machine EXTENSION is an extension of machine BASE. */
14451
14452static bfd_boolean
14453mips_mach_extends_p (unsigned long base, unsigned long extension)
14454{
14455 size_t i;
14456
14457 if (extension == base)
14458 return TRUE;
14459
14460 if (base == bfd_mach_mipsisa32
14461 && mips_mach_extends_p (bfd_mach_mipsisa64, extension))
14462 return TRUE;
14463
14464 if (base == bfd_mach_mipsisa32r2
14465 && mips_mach_extends_p (bfd_mach_mipsisa64r2, extension))
14466 return TRUE;
14467
14468 for (i = 0; i < ARRAY_SIZE (mips_mach_extensions); i++)
14469 if (extension == mips_mach_extensions[i].extension)
14470 {
14471 extension = mips_mach_extensions[i].base;
14472 if (extension == base)
14473 return TRUE;
14474 }
14475
14476 return FALSE;
14477}
14478
14479/* Return the BFD mach for each .MIPS.abiflags ISA Extension. */
14480
14481static unsigned long
14482bfd_mips_isa_ext_mach (unsigned int isa_ext)
14483{
14484 switch (isa_ext)
14485 {
07d6d2b8
AM
14486 case AFL_EXT_3900: return bfd_mach_mips3900;
14487 case AFL_EXT_4010: return bfd_mach_mips4010;
14488 case AFL_EXT_4100: return bfd_mach_mips4100;
14489 case AFL_EXT_4111: return bfd_mach_mips4111;
14490 case AFL_EXT_4120: return bfd_mach_mips4120;
14491 case AFL_EXT_4650: return bfd_mach_mips4650;
14492 case AFL_EXT_5400: return bfd_mach_mips5400;
14493 case AFL_EXT_5500: return bfd_mach_mips5500;
14494 case AFL_EXT_5900: return bfd_mach_mips5900;
14495 case AFL_EXT_10000: return bfd_mach_mips10000;
c97c330b
MF
14496 case AFL_EXT_LOONGSON_2E: return bfd_mach_mips_loongson_2e;
14497 case AFL_EXT_LOONGSON_2F: return bfd_mach_mips_loongson_2f;
07d6d2b8 14498 case AFL_EXT_SB1: return bfd_mach_mips_sb1;
c97c330b
MF
14499 case AFL_EXT_OCTEON: return bfd_mach_mips_octeon;
14500 case AFL_EXT_OCTEONP: return bfd_mach_mips_octeonp;
14501 case AFL_EXT_OCTEON2: return bfd_mach_mips_octeon2;
07d6d2b8
AM
14502 case AFL_EXT_XLR: return bfd_mach_mips_xlr;
14503 default: return bfd_mach_mips3000;
c97c330b
MF
14504 }
14505}
14506
351cdf24
MF
14507/* Return the .MIPS.abiflags value representing each ISA Extension. */
14508
14509unsigned int
14510bfd_mips_isa_ext (bfd *abfd)
14511{
14512 switch (bfd_get_mach (abfd))
14513 {
07d6d2b8
AM
14514 case bfd_mach_mips3900: return AFL_EXT_3900;
14515 case bfd_mach_mips4010: return AFL_EXT_4010;
14516 case bfd_mach_mips4100: return AFL_EXT_4100;
14517 case bfd_mach_mips4111: return AFL_EXT_4111;
14518 case bfd_mach_mips4120: return AFL_EXT_4120;
14519 case bfd_mach_mips4650: return AFL_EXT_4650;
14520 case bfd_mach_mips5400: return AFL_EXT_5400;
14521 case bfd_mach_mips5500: return AFL_EXT_5500;
14522 case bfd_mach_mips5900: return AFL_EXT_5900;
14523 case bfd_mach_mips10000: return AFL_EXT_10000;
c97c330b
MF
14524 case bfd_mach_mips_loongson_2e: return AFL_EXT_LOONGSON_2E;
14525 case bfd_mach_mips_loongson_2f: return AFL_EXT_LOONGSON_2F;
07d6d2b8
AM
14526 case bfd_mach_mips_sb1: return AFL_EXT_SB1;
14527 case bfd_mach_mips_octeon: return AFL_EXT_OCTEON;
14528 case bfd_mach_mips_octeonp: return AFL_EXT_OCTEONP;
14529 case bfd_mach_mips_octeon3: return AFL_EXT_OCTEON3;
14530 case bfd_mach_mips_octeon2: return AFL_EXT_OCTEON2;
14531 case bfd_mach_mips_xlr: return AFL_EXT_XLR;
38bf472a
MR
14532 case bfd_mach_mips_interaptiv_mr2:
14533 return AFL_EXT_INTERAPTIV_MR2;
07d6d2b8 14534 default: return 0;
c97c330b
MF
14535 }
14536}
14537
14538/* Encode ISA level and revision as a single value. */
14539#define LEVEL_REV(LEV,REV) ((LEV) << 3 | (REV))
14540
14541/* Decode a single value into level and revision. */
14542#define ISA_LEVEL(LEVREV) ((LEVREV) >> 3)
14543#define ISA_REV(LEVREV) ((LEVREV) & 0x7)
351cdf24
MF
14544
14545/* Update the isa_level, isa_rev, isa_ext fields of abiflags. */
14546
14547static void
14548update_mips_abiflags_isa (bfd *abfd, Elf_Internal_ABIFlags_v0 *abiflags)
14549{
c97c330b 14550 int new_isa = 0;
351cdf24
MF
14551 switch (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH)
14552 {
c97c330b
MF
14553 case E_MIPS_ARCH_1: new_isa = LEVEL_REV (1, 0); break;
14554 case E_MIPS_ARCH_2: new_isa = LEVEL_REV (2, 0); break;
14555 case E_MIPS_ARCH_3: new_isa = LEVEL_REV (3, 0); break;
14556 case E_MIPS_ARCH_4: new_isa = LEVEL_REV (4, 0); break;
14557 case E_MIPS_ARCH_5: new_isa = LEVEL_REV (5, 0); break;
14558 case E_MIPS_ARCH_32: new_isa = LEVEL_REV (32, 1); break;
14559 case E_MIPS_ARCH_32R2: new_isa = LEVEL_REV (32, 2); break;
14560 case E_MIPS_ARCH_32R6: new_isa = LEVEL_REV (32, 6); break;
14561 case E_MIPS_ARCH_64: new_isa = LEVEL_REV (64, 1); break;
14562 case E_MIPS_ARCH_64R2: new_isa = LEVEL_REV (64, 2); break;
14563 case E_MIPS_ARCH_64R6: new_isa = LEVEL_REV (64, 6); break;
351cdf24 14564 default:
4eca0228 14565 _bfd_error_handler
695344c0 14566 /* xgettext:c-format */
2c1c9679 14567 (_("%pB: unknown architecture %s"),
351cdf24
MF
14568 abfd, bfd_printable_name (abfd));
14569 }
14570
c97c330b
MF
14571 if (new_isa > LEVEL_REV (abiflags->isa_level, abiflags->isa_rev))
14572 {
14573 abiflags->isa_level = ISA_LEVEL (new_isa);
14574 abiflags->isa_rev = ISA_REV (new_isa);
14575 }
14576
14577 /* Update the isa_ext if ABFD describes a further extension. */
14578 if (mips_mach_extends_p (bfd_mips_isa_ext_mach (abiflags->isa_ext),
14579 bfd_get_mach (abfd)))
14580 abiflags->isa_ext = bfd_mips_isa_ext (abfd);
351cdf24
MF
14581}
14582
14583/* Return true if the given ELF header flags describe a 32-bit binary. */
14584
14585static bfd_boolean
14586mips_32bit_flags_p (flagword flags)
14587{
14588 return ((flags & EF_MIPS_32BITMODE) != 0
14589 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_O32
14590 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32
14591 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1
14592 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2
14593 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32
7361da2c
AB
14594 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2
14595 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R6);
351cdf24
MF
14596}
14597
14598/* Infer the content of the ABI flags based on the elf header. */
14599
14600static void
14601infer_mips_abiflags (bfd *abfd, Elf_Internal_ABIFlags_v0* abiflags)
14602{
14603 obj_attribute *in_attr;
14604
14605 memset (abiflags, 0, sizeof (Elf_Internal_ABIFlags_v0));
14606 update_mips_abiflags_isa (abfd, abiflags);
14607
14608 if (mips_32bit_flags_p (elf_elfheader (abfd)->e_flags))
14609 abiflags->gpr_size = AFL_REG_32;
14610 else
14611 abiflags->gpr_size = AFL_REG_64;
14612
14613 abiflags->cpr1_size = AFL_REG_NONE;
14614
14615 in_attr = elf_known_obj_attributes (abfd)[OBJ_ATTR_GNU];
14616 abiflags->fp_abi = in_attr[Tag_GNU_MIPS_ABI_FP].i;
14617
14618 if (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_SINGLE
14619 || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_XX
14620 || (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_DOUBLE
14621 && abiflags->gpr_size == AFL_REG_32))
14622 abiflags->cpr1_size = AFL_REG_32;
14623 else if (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_DOUBLE
14624 || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_64
14625 || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_64A)
14626 abiflags->cpr1_size = AFL_REG_64;
14627
14628 abiflags->cpr2_size = AFL_REG_NONE;
14629
14630 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
14631 abiflags->ases |= AFL_ASE_MDMX;
14632 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
14633 abiflags->ases |= AFL_ASE_MIPS16;
14634 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
14635 abiflags->ases |= AFL_ASE_MICROMIPS;
14636
14637 if (abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_ANY
14638 && abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_SOFT
14639 && abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_64A
14640 && abiflags->isa_level >= 32
bdc6c06e 14641 && abiflags->ases != AFL_ASE_LOONGSON_EXT)
351cdf24
MF
14642 abiflags->flags1 |= AFL_FLAGS1_ODDSPREG;
14643}
14644
b49e97c9
TS
14645/* We need to use a special link routine to handle the .reginfo and
14646 the .mdebug sections. We need to merge all instances of these
14647 sections together, not write them all out sequentially. */
14648
b34976b6 14649bfd_boolean
9719ad41 14650_bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
b49e97c9 14651{
b49e97c9
TS
14652 asection *o;
14653 struct bfd_link_order *p;
14654 asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
351cdf24 14655 asection *rtproc_sec, *abiflags_sec;
b49e97c9
TS
14656 Elf32_RegInfo reginfo;
14657 struct ecoff_debug_info debug;
861fb55a 14658 struct mips_htab_traverse_info hti;
7a2a6943
NC
14659 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
14660 const struct ecoff_debug_swap *swap = bed->elf_backend_ecoff_debug_swap;
b49e97c9 14661 HDRR *symhdr = &debug.symbolic_header;
9719ad41 14662 void *mdebug_handle = NULL;
b49e97c9
TS
14663 asection *s;
14664 EXTR esym;
14665 unsigned int i;
14666 bfd_size_type amt;
0a44bf69 14667 struct mips_elf_link_hash_table *htab;
b49e97c9
TS
14668
14669 static const char * const secname[] =
14670 {
14671 ".text", ".init", ".fini", ".data",
14672 ".rodata", ".sdata", ".sbss", ".bss"
14673 };
14674 static const int sc[] =
14675 {
14676 scText, scInit, scFini, scData,
14677 scRData, scSData, scSBss, scBss
14678 };
14679
0a44bf69 14680 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
14681 BFD_ASSERT (htab != NULL);
14682
64575f78
MR
14683 /* Sort the dynamic symbols so that those with GOT entries come after
14684 those without. */
d4596a51
RS
14685 if (!mips_elf_sort_hash_table (abfd, info))
14686 return FALSE;
b49e97c9 14687
861fb55a
DJ
14688 /* Create any scheduled LA25 stubs. */
14689 hti.info = info;
14690 hti.output_bfd = abfd;
14691 hti.error = FALSE;
14692 htab_traverse (htab->la25_stubs, mips_elf_create_la25_stub, &hti);
14693 if (hti.error)
14694 return FALSE;
14695
b49e97c9
TS
14696 /* Get a value for the GP register. */
14697 if (elf_gp (abfd) == 0)
14698 {
14699 struct bfd_link_hash_entry *h;
14700
b34976b6 14701 h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
9719ad41 14702 if (h != NULL && h->type == bfd_link_hash_defined)
b49e97c9
TS
14703 elf_gp (abfd) = (h->u.def.value
14704 + h->u.def.section->output_section->vma
14705 + h->u.def.section->output_offset);
0a44bf69
RS
14706 else if (htab->is_vxworks
14707 && (h = bfd_link_hash_lookup (info->hash,
14708 "_GLOBAL_OFFSET_TABLE_",
14709 FALSE, FALSE, TRUE))
14710 && h->type == bfd_link_hash_defined)
14711 elf_gp (abfd) = (h->u.def.section->output_section->vma
14712 + h->u.def.section->output_offset
14713 + h->u.def.value);
0e1862bb 14714 else if (bfd_link_relocatable (info))
b49e97c9
TS
14715 {
14716 bfd_vma lo = MINUS_ONE;
14717
14718 /* Find the GP-relative section with the lowest offset. */
9719ad41 14719 for (o = abfd->sections; o != NULL; o = o->next)
b49e97c9
TS
14720 if (o->vma < lo
14721 && (elf_section_data (o)->this_hdr.sh_flags & SHF_MIPS_GPREL))
14722 lo = o->vma;
14723
14724 /* And calculate GP relative to that. */
0a44bf69 14725 elf_gp (abfd) = lo + ELF_MIPS_GP_OFFSET (info);
b49e97c9
TS
14726 }
14727 else
14728 {
14729 /* If the relocate_section function needs to do a reloc
14730 involving the GP value, it should make a reloc_dangerous
14731 callback to warn that GP is not defined. */
14732 }
14733 }
14734
14735 /* Go through the sections and collect the .reginfo and .mdebug
14736 information. */
351cdf24 14737 abiflags_sec = NULL;
b49e97c9
TS
14738 reginfo_sec = NULL;
14739 mdebug_sec = NULL;
14740 gptab_data_sec = NULL;
14741 gptab_bss_sec = NULL;
9719ad41 14742 for (o = abfd->sections; o != NULL; o = o->next)
b49e97c9 14743 {
351cdf24
MF
14744 if (strcmp (o->name, ".MIPS.abiflags") == 0)
14745 {
14746 /* We have found the .MIPS.abiflags section in the output file.
14747 Look through all the link_orders comprising it and remove them.
14748 The data is merged in _bfd_mips_elf_merge_private_bfd_data. */
14749 for (p = o->map_head.link_order; p != NULL; p = p->next)
14750 {
14751 asection *input_section;
14752
14753 if (p->type != bfd_indirect_link_order)
14754 {
14755 if (p->type == bfd_data_link_order)
14756 continue;
14757 abort ();
14758 }
14759
14760 input_section = p->u.indirect.section;
14761
14762 /* Hack: reset the SEC_HAS_CONTENTS flag so that
14763 elf_link_input_bfd ignores this section. */
14764 input_section->flags &= ~SEC_HAS_CONTENTS;
14765 }
14766
14767 /* Size has been set in _bfd_mips_elf_always_size_sections. */
14768 BFD_ASSERT(o->size == sizeof (Elf_External_ABIFlags_v0));
14769
14770 /* Skip this section later on (I don't think this currently
14771 matters, but someday it might). */
14772 o->map_head.link_order = NULL;
14773
14774 abiflags_sec = o;
14775 }
14776
b49e97c9
TS
14777 if (strcmp (o->name, ".reginfo") == 0)
14778 {
14779 memset (&reginfo, 0, sizeof reginfo);
14780
14781 /* We have found the .reginfo section in the output file.
14782 Look through all the link_orders comprising it and merge
14783 the information together. */
8423293d 14784 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
14785 {
14786 asection *input_section;
14787 bfd *input_bfd;
14788 Elf32_External_RegInfo ext;
14789 Elf32_RegInfo sub;
6798f8bf 14790 bfd_size_type sz;
b49e97c9
TS
14791
14792 if (p->type != bfd_indirect_link_order)
14793 {
14794 if (p->type == bfd_data_link_order)
14795 continue;
14796 abort ();
14797 }
14798
14799 input_section = p->u.indirect.section;
14800 input_bfd = input_section->owner;
14801
6798f8bf
MR
14802 sz = (input_section->size < sizeof (ext)
14803 ? input_section->size : sizeof (ext));
14804 memset (&ext, 0, sizeof (ext));
b49e97c9 14805 if (! bfd_get_section_contents (input_bfd, input_section,
6798f8bf 14806 &ext, 0, sz))
b34976b6 14807 return FALSE;
b49e97c9
TS
14808
14809 bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub);
14810
14811 reginfo.ri_gprmask |= sub.ri_gprmask;
14812 reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
14813 reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
14814 reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
14815 reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
14816
14817 /* ri_gp_value is set by the function
1c5e4ee9 14818 `_bfd_mips_elf_section_processing' when the section is
b49e97c9
TS
14819 finally written out. */
14820
14821 /* Hack: reset the SEC_HAS_CONTENTS flag so that
14822 elf_link_input_bfd ignores this section. */
14823 input_section->flags &= ~SEC_HAS_CONTENTS;
14824 }
14825
14826 /* Size has been set in _bfd_mips_elf_always_size_sections. */
b248d650 14827 BFD_ASSERT(o->size == sizeof (Elf32_External_RegInfo));
b49e97c9
TS
14828
14829 /* Skip this section later on (I don't think this currently
14830 matters, but someday it might). */
8423293d 14831 o->map_head.link_order = NULL;
b49e97c9
TS
14832
14833 reginfo_sec = o;
14834 }
14835
14836 if (strcmp (o->name, ".mdebug") == 0)
14837 {
14838 struct extsym_info einfo;
14839 bfd_vma last;
14840
14841 /* We have found the .mdebug section in the output file.
14842 Look through all the link_orders comprising it and merge
14843 the information together. */
14844 symhdr->magic = swap->sym_magic;
14845 /* FIXME: What should the version stamp be? */
14846 symhdr->vstamp = 0;
14847 symhdr->ilineMax = 0;
14848 symhdr->cbLine = 0;
14849 symhdr->idnMax = 0;
14850 symhdr->ipdMax = 0;
14851 symhdr->isymMax = 0;
14852 symhdr->ioptMax = 0;
14853 symhdr->iauxMax = 0;
14854 symhdr->issMax = 0;
14855 symhdr->issExtMax = 0;
14856 symhdr->ifdMax = 0;
14857 symhdr->crfd = 0;
14858 symhdr->iextMax = 0;
14859
14860 /* We accumulate the debugging information itself in the
14861 debug_info structure. */
14862 debug.line = NULL;
14863 debug.external_dnr = NULL;
14864 debug.external_pdr = NULL;
14865 debug.external_sym = NULL;
14866 debug.external_opt = NULL;
14867 debug.external_aux = NULL;
14868 debug.ss = NULL;
14869 debug.ssext = debug.ssext_end = NULL;
14870 debug.external_fdr = NULL;
14871 debug.external_rfd = NULL;
14872 debug.external_ext = debug.external_ext_end = NULL;
14873
14874 mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
9719ad41 14875 if (mdebug_handle == NULL)
b34976b6 14876 return FALSE;
b49e97c9
TS
14877
14878 esym.jmptbl = 0;
14879 esym.cobol_main = 0;
14880 esym.weakext = 0;
14881 esym.reserved = 0;
14882 esym.ifd = ifdNil;
14883 esym.asym.iss = issNil;
14884 esym.asym.st = stLocal;
14885 esym.asym.reserved = 0;
14886 esym.asym.index = indexNil;
14887 last = 0;
14888 for (i = 0; i < sizeof (secname) / sizeof (secname[0]); i++)
14889 {
14890 esym.asym.sc = sc[i];
14891 s = bfd_get_section_by_name (abfd, secname[i]);
14892 if (s != NULL)
14893 {
14894 esym.asym.value = s->vma;
eea6121a 14895 last = s->vma + s->size;
b49e97c9
TS
14896 }
14897 else
14898 esym.asym.value = last;
14899 if (!bfd_ecoff_debug_one_external (abfd, &debug, swap,
14900 secname[i], &esym))
b34976b6 14901 return FALSE;
b49e97c9
TS
14902 }
14903
8423293d 14904 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
14905 {
14906 asection *input_section;
14907 bfd *input_bfd;
14908 const struct ecoff_debug_swap *input_swap;
14909 struct ecoff_debug_info input_debug;
14910 char *eraw_src;
14911 char *eraw_end;
14912
14913 if (p->type != bfd_indirect_link_order)
14914 {
14915 if (p->type == bfd_data_link_order)
14916 continue;
14917 abort ();
14918 }
14919
14920 input_section = p->u.indirect.section;
14921 input_bfd = input_section->owner;
14922
d5eaccd7 14923 if (!is_mips_elf (input_bfd))
b49e97c9
TS
14924 {
14925 /* I don't know what a non MIPS ELF bfd would be
14926 doing with a .mdebug section, but I don't really
14927 want to deal with it. */
14928 continue;
14929 }
14930
14931 input_swap = (get_elf_backend_data (input_bfd)
14932 ->elf_backend_ecoff_debug_swap);
14933
eea6121a 14934 BFD_ASSERT (p->size == input_section->size);
b49e97c9
TS
14935
14936 /* The ECOFF linking code expects that we have already
14937 read in the debugging information and set up an
14938 ecoff_debug_info structure, so we do that now. */
14939 if (! _bfd_mips_elf_read_ecoff_info (input_bfd, input_section,
14940 &input_debug))
b34976b6 14941 return FALSE;
b49e97c9
TS
14942
14943 if (! (bfd_ecoff_debug_accumulate
14944 (mdebug_handle, abfd, &debug, swap, input_bfd,
14945 &input_debug, input_swap, info)))
b34976b6 14946 return FALSE;
b49e97c9
TS
14947
14948 /* Loop through the external symbols. For each one with
14949 interesting information, try to find the symbol in
14950 the linker global hash table and save the information
14951 for the output external symbols. */
14952 eraw_src = input_debug.external_ext;
14953 eraw_end = (eraw_src
14954 + (input_debug.symbolic_header.iextMax
14955 * input_swap->external_ext_size));
14956 for (;
14957 eraw_src < eraw_end;
14958 eraw_src += input_swap->external_ext_size)
14959 {
14960 EXTR ext;
14961 const char *name;
14962 struct mips_elf_link_hash_entry *h;
14963
9719ad41 14964 (*input_swap->swap_ext_in) (input_bfd, eraw_src, &ext);
b49e97c9
TS
14965 if (ext.asym.sc == scNil
14966 || ext.asym.sc == scUndefined
14967 || ext.asym.sc == scSUndefined)
14968 continue;
14969
14970 name = input_debug.ssext + ext.asym.iss;
14971 h = mips_elf_link_hash_lookup (mips_elf_hash_table (info),
b34976b6 14972 name, FALSE, FALSE, TRUE);
b49e97c9
TS
14973 if (h == NULL || h->esym.ifd != -2)
14974 continue;
14975
14976 if (ext.ifd != -1)
14977 {
14978 BFD_ASSERT (ext.ifd
14979 < input_debug.symbolic_header.ifdMax);
14980 ext.ifd = input_debug.ifdmap[ext.ifd];
14981 }
14982
14983 h->esym = ext;
14984 }
14985
14986 /* Free up the information we just read. */
14987 free (input_debug.line);
14988 free (input_debug.external_dnr);
14989 free (input_debug.external_pdr);
14990 free (input_debug.external_sym);
14991 free (input_debug.external_opt);
14992 free (input_debug.external_aux);
14993 free (input_debug.ss);
14994 free (input_debug.ssext);
14995 free (input_debug.external_fdr);
14996 free (input_debug.external_rfd);
14997 free (input_debug.external_ext);
14998
14999 /* Hack: reset the SEC_HAS_CONTENTS flag so that
15000 elf_link_input_bfd ignores this section. */
15001 input_section->flags &= ~SEC_HAS_CONTENTS;
15002 }
15003
0e1862bb 15004 if (SGI_COMPAT (abfd) && bfd_link_pic (info))
b49e97c9
TS
15005 {
15006 /* Create .rtproc section. */
87e0a731 15007 rtproc_sec = bfd_get_linker_section (abfd, ".rtproc");
b49e97c9
TS
15008 if (rtproc_sec == NULL)
15009 {
15010 flagword flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
15011 | SEC_LINKER_CREATED | SEC_READONLY);
15012
87e0a731
AM
15013 rtproc_sec = bfd_make_section_anyway_with_flags (abfd,
15014 ".rtproc",
15015 flags);
b49e97c9 15016 if (rtproc_sec == NULL
fd361982 15017 || !bfd_set_section_alignment (rtproc_sec, 4))
b34976b6 15018 return FALSE;
b49e97c9
TS
15019 }
15020
15021 if (! mips_elf_create_procedure_table (mdebug_handle, abfd,
15022 info, rtproc_sec,
15023 &debug))
b34976b6 15024 return FALSE;
b49e97c9
TS
15025 }
15026
15027 /* Build the external symbol information. */
15028 einfo.abfd = abfd;
15029 einfo.info = info;
15030 einfo.debug = &debug;
15031 einfo.swap = swap;
b34976b6 15032 einfo.failed = FALSE;
b49e97c9 15033 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
9719ad41 15034 mips_elf_output_extsym, &einfo);
b49e97c9 15035 if (einfo.failed)
b34976b6 15036 return FALSE;
b49e97c9
TS
15037
15038 /* Set the size of the .mdebug section. */
eea6121a 15039 o->size = bfd_ecoff_debug_size (abfd, &debug, swap);
b49e97c9
TS
15040
15041 /* Skip this section later on (I don't think this currently
15042 matters, but someday it might). */
8423293d 15043 o->map_head.link_order = NULL;
b49e97c9
TS
15044
15045 mdebug_sec = o;
15046 }
15047
0112cd26 15048 if (CONST_STRNEQ (o->name, ".gptab."))
b49e97c9
TS
15049 {
15050 const char *subname;
15051 unsigned int c;
15052 Elf32_gptab *tab;
15053 Elf32_External_gptab *ext_tab;
15054 unsigned int j;
15055
15056 /* The .gptab.sdata and .gptab.sbss sections hold
15057 information describing how the small data area would
15058 change depending upon the -G switch. These sections
15059 not used in executables files. */
0e1862bb 15060 if (! bfd_link_relocatable (info))
b49e97c9 15061 {
8423293d 15062 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
15063 {
15064 asection *input_section;
15065
15066 if (p->type != bfd_indirect_link_order)
15067 {
15068 if (p->type == bfd_data_link_order)
15069 continue;
15070 abort ();
15071 }
15072
15073 input_section = p->u.indirect.section;
15074
15075 /* Hack: reset the SEC_HAS_CONTENTS flag so that
15076 elf_link_input_bfd ignores this section. */
15077 input_section->flags &= ~SEC_HAS_CONTENTS;
15078 }
15079
15080 /* Skip this section later on (I don't think this
15081 currently matters, but someday it might). */
8423293d 15082 o->map_head.link_order = NULL;
b49e97c9
TS
15083
15084 /* Really remove the section. */
5daa8fe7 15085 bfd_section_list_remove (abfd, o);
b49e97c9
TS
15086 --abfd->section_count;
15087
15088 continue;
15089 }
15090
15091 /* There is one gptab for initialized data, and one for
15092 uninitialized data. */
15093 if (strcmp (o->name, ".gptab.sdata") == 0)
15094 gptab_data_sec = o;
15095 else if (strcmp (o->name, ".gptab.sbss") == 0)
15096 gptab_bss_sec = o;
15097 else
15098 {
4eca0228 15099 _bfd_error_handler
695344c0 15100 /* xgettext:c-format */
871b3ab2 15101 (_("%pB: illegal section name `%pA'"), abfd, o);
b49e97c9 15102 bfd_set_error (bfd_error_nonrepresentable_section);
b34976b6 15103 return FALSE;
b49e97c9
TS
15104 }
15105
15106 /* The linker script always combines .gptab.data and
15107 .gptab.sdata into .gptab.sdata, and likewise for
15108 .gptab.bss and .gptab.sbss. It is possible that there is
15109 no .sdata or .sbss section in the output file, in which
15110 case we must change the name of the output section. */
15111 subname = o->name + sizeof ".gptab" - 1;
15112 if (bfd_get_section_by_name (abfd, subname) == NULL)
15113 {
15114 if (o == gptab_data_sec)
15115 o->name = ".gptab.data";
15116 else
15117 o->name = ".gptab.bss";
15118 subname = o->name + sizeof ".gptab" - 1;
15119 BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
15120 }
15121
15122 /* Set up the first entry. */
15123 c = 1;
15124 amt = c * sizeof (Elf32_gptab);
9719ad41 15125 tab = bfd_malloc (amt);
b49e97c9 15126 if (tab == NULL)
b34976b6 15127 return FALSE;
b49e97c9
TS
15128 tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
15129 tab[0].gt_header.gt_unused = 0;
15130
15131 /* Combine the input sections. */
8423293d 15132 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
15133 {
15134 asection *input_section;
15135 bfd *input_bfd;
15136 bfd_size_type size;
15137 unsigned long last;
15138 bfd_size_type gpentry;
15139
15140 if (p->type != bfd_indirect_link_order)
15141 {
15142 if (p->type == bfd_data_link_order)
15143 continue;
15144 abort ();
15145 }
15146
15147 input_section = p->u.indirect.section;
15148 input_bfd = input_section->owner;
15149
15150 /* Combine the gptab entries for this input section one
15151 by one. We know that the input gptab entries are
15152 sorted by ascending -G value. */
eea6121a 15153 size = input_section->size;
b49e97c9
TS
15154 last = 0;
15155 for (gpentry = sizeof (Elf32_External_gptab);
15156 gpentry < size;
15157 gpentry += sizeof (Elf32_External_gptab))
15158 {
15159 Elf32_External_gptab ext_gptab;
15160 Elf32_gptab int_gptab;
15161 unsigned long val;
15162 unsigned long add;
b34976b6 15163 bfd_boolean exact;
b49e97c9
TS
15164 unsigned int look;
15165
15166 if (! (bfd_get_section_contents
9719ad41
RS
15167 (input_bfd, input_section, &ext_gptab, gpentry,
15168 sizeof (Elf32_External_gptab))))
b49e97c9
TS
15169 {
15170 free (tab);
b34976b6 15171 return FALSE;
b49e97c9
TS
15172 }
15173
15174 bfd_mips_elf32_swap_gptab_in (input_bfd, &ext_gptab,
15175 &int_gptab);
15176 val = int_gptab.gt_entry.gt_g_value;
15177 add = int_gptab.gt_entry.gt_bytes - last;
15178
b34976b6 15179 exact = FALSE;
b49e97c9
TS
15180 for (look = 1; look < c; look++)
15181 {
15182 if (tab[look].gt_entry.gt_g_value >= val)
15183 tab[look].gt_entry.gt_bytes += add;
15184
15185 if (tab[look].gt_entry.gt_g_value == val)
b34976b6 15186 exact = TRUE;
b49e97c9
TS
15187 }
15188
15189 if (! exact)
15190 {
15191 Elf32_gptab *new_tab;
15192 unsigned int max;
15193
15194 /* We need a new table entry. */
15195 amt = (bfd_size_type) (c + 1) * sizeof (Elf32_gptab);
9719ad41 15196 new_tab = bfd_realloc (tab, amt);
b49e97c9
TS
15197 if (new_tab == NULL)
15198 {
15199 free (tab);
b34976b6 15200 return FALSE;
b49e97c9
TS
15201 }
15202 tab = new_tab;
15203 tab[c].gt_entry.gt_g_value = val;
15204 tab[c].gt_entry.gt_bytes = add;
15205
15206 /* Merge in the size for the next smallest -G
15207 value, since that will be implied by this new
15208 value. */
15209 max = 0;
15210 for (look = 1; look < c; look++)
15211 {
15212 if (tab[look].gt_entry.gt_g_value < val
15213 && (max == 0
15214 || (tab[look].gt_entry.gt_g_value
15215 > tab[max].gt_entry.gt_g_value)))
15216 max = look;
15217 }
15218 if (max != 0)
15219 tab[c].gt_entry.gt_bytes +=
15220 tab[max].gt_entry.gt_bytes;
15221
15222 ++c;
15223 }
15224
15225 last = int_gptab.gt_entry.gt_bytes;
15226 }
15227
15228 /* Hack: reset the SEC_HAS_CONTENTS flag so that
15229 elf_link_input_bfd ignores this section. */
15230 input_section->flags &= ~SEC_HAS_CONTENTS;
15231 }
15232
15233 /* The table must be sorted by -G value. */
15234 if (c > 2)
15235 qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
15236
15237 /* Swap out the table. */
15238 amt = (bfd_size_type) c * sizeof (Elf32_External_gptab);
9719ad41 15239 ext_tab = bfd_alloc (abfd, amt);
b49e97c9
TS
15240 if (ext_tab == NULL)
15241 {
15242 free (tab);
b34976b6 15243 return FALSE;
b49e97c9
TS
15244 }
15245
15246 for (j = 0; j < c; j++)
15247 bfd_mips_elf32_swap_gptab_out (abfd, tab + j, ext_tab + j);
15248 free (tab);
15249
eea6121a 15250 o->size = c * sizeof (Elf32_External_gptab);
b49e97c9
TS
15251 o->contents = (bfd_byte *) ext_tab;
15252
15253 /* Skip this section later on (I don't think this currently
15254 matters, but someday it might). */
8423293d 15255 o->map_head.link_order = NULL;
b49e97c9
TS
15256 }
15257 }
15258
15259 /* Invoke the regular ELF backend linker to do all the work. */
c152c796 15260 if (!bfd_elf_final_link (abfd, info))
b34976b6 15261 return FALSE;
b49e97c9
TS
15262
15263 /* Now write out the computed sections. */
15264
351cdf24
MF
15265 if (abiflags_sec != NULL)
15266 {
15267 Elf_External_ABIFlags_v0 ext;
15268 Elf_Internal_ABIFlags_v0 *abiflags;
15269
15270 abiflags = &mips_elf_tdata (abfd)->abiflags;
15271
15272 /* Set up the abiflags if no valid input sections were found. */
15273 if (!mips_elf_tdata (abfd)->abiflags_valid)
15274 {
15275 infer_mips_abiflags (abfd, abiflags);
15276 mips_elf_tdata (abfd)->abiflags_valid = TRUE;
15277 }
15278 bfd_mips_elf_swap_abiflags_v0_out (abfd, abiflags, &ext);
15279 if (! bfd_set_section_contents (abfd, abiflags_sec, &ext, 0, sizeof ext))
15280 return FALSE;
15281 }
15282
9719ad41 15283 if (reginfo_sec != NULL)
b49e97c9
TS
15284 {
15285 Elf32_External_RegInfo ext;
15286
15287 bfd_mips_elf32_swap_reginfo_out (abfd, &reginfo, &ext);
9719ad41 15288 if (! bfd_set_section_contents (abfd, reginfo_sec, &ext, 0, sizeof ext))
b34976b6 15289 return FALSE;
b49e97c9
TS
15290 }
15291
9719ad41 15292 if (mdebug_sec != NULL)
b49e97c9
TS
15293 {
15294 BFD_ASSERT (abfd->output_has_begun);
15295 if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
15296 swap, info,
15297 mdebug_sec->filepos))
b34976b6 15298 return FALSE;
b49e97c9
TS
15299
15300 bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
15301 }
15302
9719ad41 15303 if (gptab_data_sec != NULL)
b49e97c9
TS
15304 {
15305 if (! bfd_set_section_contents (abfd, gptab_data_sec,
15306 gptab_data_sec->contents,
eea6121a 15307 0, gptab_data_sec->size))
b34976b6 15308 return FALSE;
b49e97c9
TS
15309 }
15310
9719ad41 15311 if (gptab_bss_sec != NULL)
b49e97c9
TS
15312 {
15313 if (! bfd_set_section_contents (abfd, gptab_bss_sec,
15314 gptab_bss_sec->contents,
eea6121a 15315 0, gptab_bss_sec->size))
b34976b6 15316 return FALSE;
b49e97c9
TS
15317 }
15318
15319 if (SGI_COMPAT (abfd))
15320 {
15321 rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
15322 if (rtproc_sec != NULL)
15323 {
15324 if (! bfd_set_section_contents (abfd, rtproc_sec,
15325 rtproc_sec->contents,
eea6121a 15326 0, rtproc_sec->size))
b34976b6 15327 return FALSE;
b49e97c9
TS
15328 }
15329 }
15330
b34976b6 15331 return TRUE;
b49e97c9
TS
15332}
15333\f
b2e9744f
MR
15334/* Merge object file header flags from IBFD into OBFD. Raise an error
15335 if there are conflicting settings. */
15336
15337static bfd_boolean
50e03d47 15338mips_elf_merge_obj_e_flags (bfd *ibfd, struct bfd_link_info *info)
b2e9744f 15339{
50e03d47 15340 bfd *obfd = info->output_bfd;
b2e9744f
MR
15341 struct mips_elf_obj_tdata *out_tdata = mips_elf_tdata (obfd);
15342 flagword old_flags;
15343 flagword new_flags;
15344 bfd_boolean ok;
15345
15346 new_flags = elf_elfheader (ibfd)->e_flags;
15347 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_NOREORDER;
15348 old_flags = elf_elfheader (obfd)->e_flags;
15349
15350 /* Check flag compatibility. */
15351
15352 new_flags &= ~EF_MIPS_NOREORDER;
15353 old_flags &= ~EF_MIPS_NOREORDER;
15354
15355 /* Some IRIX 6 BSD-compatibility objects have this bit set. It
15356 doesn't seem to matter. */
15357 new_flags &= ~EF_MIPS_XGOT;
15358 old_flags &= ~EF_MIPS_XGOT;
15359
15360 /* MIPSpro generates ucode info in n64 objects. Again, we should
15361 just be able to ignore this. */
15362 new_flags &= ~EF_MIPS_UCODE;
15363 old_flags &= ~EF_MIPS_UCODE;
15364
15365 /* DSOs should only be linked with CPIC code. */
15366 if ((ibfd->flags & DYNAMIC) != 0)
15367 new_flags |= EF_MIPS_PIC | EF_MIPS_CPIC;
15368
15369 if (new_flags == old_flags)
15370 return TRUE;
15371
15372 ok = TRUE;
15373
15374 if (((new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0)
15375 != ((old_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0))
15376 {
4eca0228 15377 _bfd_error_handler
871b3ab2 15378 (_("%pB: warning: linking abicalls files with non-abicalls files"),
b2e9744f
MR
15379 ibfd);
15380 ok = TRUE;
15381 }
15382
15383 if (new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC))
15384 elf_elfheader (obfd)->e_flags |= EF_MIPS_CPIC;
15385 if (! (new_flags & EF_MIPS_PIC))
15386 elf_elfheader (obfd)->e_flags &= ~EF_MIPS_PIC;
15387
15388 new_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
15389 old_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
15390
15391 /* Compare the ISAs. */
15392 if (mips_32bit_flags_p (old_flags) != mips_32bit_flags_p (new_flags))
15393 {
4eca0228 15394 _bfd_error_handler
871b3ab2 15395 (_("%pB: linking 32-bit code with 64-bit code"),
b2e9744f
MR
15396 ibfd);
15397 ok = FALSE;
15398 }
15399 else if (!mips_mach_extends_p (bfd_get_mach (ibfd), bfd_get_mach (obfd)))
15400 {
15401 /* OBFD's ISA isn't the same as, or an extension of, IBFD's. */
15402 if (mips_mach_extends_p (bfd_get_mach (obfd), bfd_get_mach (ibfd)))
15403 {
15404 /* Copy the architecture info from IBFD to OBFD. Also copy
15405 the 32-bit flag (if set) so that we continue to recognise
15406 OBFD as a 32-bit binary. */
15407 bfd_set_arch_info (obfd, bfd_get_arch_info (ibfd));
15408 elf_elfheader (obfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
15409 elf_elfheader (obfd)->e_flags
15410 |= new_flags & (EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15411
15412 /* Update the ABI flags isa_level, isa_rev, isa_ext fields. */
15413 update_mips_abiflags_isa (obfd, &out_tdata->abiflags);
15414
15415 /* Copy across the ABI flags if OBFD doesn't use them
15416 and if that was what caused us to treat IBFD as 32-bit. */
15417 if ((old_flags & EF_MIPS_ABI) == 0
15418 && mips_32bit_flags_p (new_flags)
15419 && !mips_32bit_flags_p (new_flags & ~EF_MIPS_ABI))
15420 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ABI;
15421 }
15422 else
15423 {
15424 /* The ISAs aren't compatible. */
4eca0228 15425 _bfd_error_handler
695344c0 15426 /* xgettext:c-format */
871b3ab2 15427 (_("%pB: linking %s module with previous %s modules"),
b2e9744f
MR
15428 ibfd,
15429 bfd_printable_name (ibfd),
15430 bfd_printable_name (obfd));
15431 ok = FALSE;
15432 }
15433 }
15434
15435 new_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15436 old_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15437
15438 /* Compare ABIs. The 64-bit ABI does not use EF_MIPS_ABI. But, it
15439 does set EI_CLASS differently from any 32-bit ABI. */
15440 if ((new_flags & EF_MIPS_ABI) != (old_flags & EF_MIPS_ABI)
15441 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
15442 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
15443 {
15444 /* Only error if both are set (to different values). */
15445 if (((new_flags & EF_MIPS_ABI) && (old_flags & EF_MIPS_ABI))
15446 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
15447 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
15448 {
4eca0228 15449 _bfd_error_handler
695344c0 15450 /* xgettext:c-format */
871b3ab2 15451 (_("%pB: ABI mismatch: linking %s module with previous %s modules"),
b2e9744f
MR
15452 ibfd,
15453 elf_mips_abi_name (ibfd),
15454 elf_mips_abi_name (obfd));
15455 ok = FALSE;
15456 }
15457 new_flags &= ~EF_MIPS_ABI;
15458 old_flags &= ~EF_MIPS_ABI;
15459 }
15460
15461 /* Compare ASEs. Forbid linking MIPS16 and microMIPS ASE modules together
15462 and allow arbitrary mixing of the remaining ASEs (retain the union). */
15463 if ((new_flags & EF_MIPS_ARCH_ASE) != (old_flags & EF_MIPS_ARCH_ASE))
15464 {
15465 int old_micro = old_flags & EF_MIPS_ARCH_ASE_MICROMIPS;
15466 int new_micro = new_flags & EF_MIPS_ARCH_ASE_MICROMIPS;
15467 int old_m16 = old_flags & EF_MIPS_ARCH_ASE_M16;
15468 int new_m16 = new_flags & EF_MIPS_ARCH_ASE_M16;
15469 int micro_mis = old_m16 && new_micro;
15470 int m16_mis = old_micro && new_m16;
15471
15472 if (m16_mis || micro_mis)
15473 {
4eca0228 15474 _bfd_error_handler
695344c0 15475 /* xgettext:c-format */
871b3ab2 15476 (_("%pB: ASE mismatch: linking %s module with previous %s modules"),
b2e9744f
MR
15477 ibfd,
15478 m16_mis ? "MIPS16" : "microMIPS",
15479 m16_mis ? "microMIPS" : "MIPS16");
15480 ok = FALSE;
15481 }
15482
15483 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ARCH_ASE;
15484
15485 new_flags &= ~ EF_MIPS_ARCH_ASE;
15486 old_flags &= ~ EF_MIPS_ARCH_ASE;
15487 }
15488
15489 /* Compare NaN encodings. */
15490 if ((new_flags & EF_MIPS_NAN2008) != (old_flags & EF_MIPS_NAN2008))
15491 {
695344c0 15492 /* xgettext:c-format */
871b3ab2 15493 _bfd_error_handler (_("%pB: linking %s module with previous %s modules"),
b2e9744f
MR
15494 ibfd,
15495 (new_flags & EF_MIPS_NAN2008
15496 ? "-mnan=2008" : "-mnan=legacy"),
15497 (old_flags & EF_MIPS_NAN2008
15498 ? "-mnan=2008" : "-mnan=legacy"));
15499 ok = FALSE;
15500 new_flags &= ~EF_MIPS_NAN2008;
15501 old_flags &= ~EF_MIPS_NAN2008;
15502 }
15503
15504 /* Compare FP64 state. */
15505 if ((new_flags & EF_MIPS_FP64) != (old_flags & EF_MIPS_FP64))
15506 {
695344c0 15507 /* xgettext:c-format */
871b3ab2 15508 _bfd_error_handler (_("%pB: linking %s module with previous %s modules"),
b2e9744f
MR
15509 ibfd,
15510 (new_flags & EF_MIPS_FP64
15511 ? "-mfp64" : "-mfp32"),
15512 (old_flags & EF_MIPS_FP64
15513 ? "-mfp64" : "-mfp32"));
15514 ok = FALSE;
15515 new_flags &= ~EF_MIPS_FP64;
15516 old_flags &= ~EF_MIPS_FP64;
15517 }
15518
15519 /* Warn about any other mismatches */
15520 if (new_flags != old_flags)
15521 {
695344c0 15522 /* xgettext:c-format */
4eca0228 15523 _bfd_error_handler
871b3ab2 15524 (_("%pB: uses different e_flags (%#x) fields than previous modules "
d42c267e
AM
15525 "(%#x)"),
15526 ibfd, new_flags, old_flags);
b2e9744f
MR
15527 ok = FALSE;
15528 }
15529
15530 return ok;
15531}
15532
2cf19d5c
JM
15533/* Merge object attributes from IBFD into OBFD. Raise an error if
15534 there are conflicting attributes. */
15535static bfd_boolean
50e03d47 15536mips_elf_merge_obj_attributes (bfd *ibfd, struct bfd_link_info *info)
2cf19d5c 15537{
50e03d47 15538 bfd *obfd = info->output_bfd;
2cf19d5c
JM
15539 obj_attribute *in_attr;
15540 obj_attribute *out_attr;
6ae68ba3 15541 bfd *abi_fp_bfd;
b60bf9be 15542 bfd *abi_msa_bfd;
6ae68ba3
MR
15543
15544 abi_fp_bfd = mips_elf_tdata (obfd)->abi_fp_bfd;
15545 in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
d929bc19 15546 if (!abi_fp_bfd && in_attr[Tag_GNU_MIPS_ABI_FP].i != Val_GNU_MIPS_ABI_FP_ANY)
6ae68ba3 15547 mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
2cf19d5c 15548
b60bf9be
CF
15549 abi_msa_bfd = mips_elf_tdata (obfd)->abi_msa_bfd;
15550 if (!abi_msa_bfd
15551 && in_attr[Tag_GNU_MIPS_ABI_MSA].i != Val_GNU_MIPS_ABI_MSA_ANY)
15552 mips_elf_tdata (obfd)->abi_msa_bfd = ibfd;
15553
2cf19d5c
JM
15554 if (!elf_known_obj_attributes_proc (obfd)[0].i)
15555 {
15556 /* This is the first object. Copy the attributes. */
15557 _bfd_elf_copy_obj_attributes (ibfd, obfd);
15558
15559 /* Use the Tag_null value to indicate the attributes have been
15560 initialized. */
15561 elf_known_obj_attributes_proc (obfd)[0].i = 1;
15562
15563 return TRUE;
15564 }
15565
15566 /* Check for conflicting Tag_GNU_MIPS_ABI_FP attributes and merge
15567 non-conflicting ones. */
2cf19d5c
JM
15568 out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
15569 if (in_attr[Tag_GNU_MIPS_ABI_FP].i != out_attr[Tag_GNU_MIPS_ABI_FP].i)
15570 {
757a636f 15571 int out_fp, in_fp;
6ae68ba3 15572
757a636f
RS
15573 out_fp = out_attr[Tag_GNU_MIPS_ABI_FP].i;
15574 in_fp = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15575 out_attr[Tag_GNU_MIPS_ABI_FP].type = 1;
15576 if (out_fp == Val_GNU_MIPS_ABI_FP_ANY)
15577 out_attr[Tag_GNU_MIPS_ABI_FP].i = in_fp;
351cdf24
MF
15578 else if (out_fp == Val_GNU_MIPS_ABI_FP_XX
15579 && (in_fp == Val_GNU_MIPS_ABI_FP_DOUBLE
15580 || in_fp == Val_GNU_MIPS_ABI_FP_64
15581 || in_fp == Val_GNU_MIPS_ABI_FP_64A))
15582 {
15583 mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
15584 out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15585 }
15586 else if (in_fp == Val_GNU_MIPS_ABI_FP_XX
15587 && (out_fp == Val_GNU_MIPS_ABI_FP_DOUBLE
15588 || out_fp == Val_GNU_MIPS_ABI_FP_64
15589 || out_fp == Val_GNU_MIPS_ABI_FP_64A))
15590 /* Keep the current setting. */;
15591 else if (out_fp == Val_GNU_MIPS_ABI_FP_64A
15592 && in_fp == Val_GNU_MIPS_ABI_FP_64)
15593 {
15594 mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
15595 out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15596 }
15597 else if (in_fp == Val_GNU_MIPS_ABI_FP_64A
15598 && out_fp == Val_GNU_MIPS_ABI_FP_64)
15599 /* Keep the current setting. */;
757a636f
RS
15600 else if (in_fp != Val_GNU_MIPS_ABI_FP_ANY)
15601 {
15602 const char *out_string, *in_string;
6ae68ba3 15603
757a636f
RS
15604 out_string = _bfd_mips_fp_abi_string (out_fp);
15605 in_string = _bfd_mips_fp_abi_string (in_fp);
15606 /* First warn about cases involving unrecognised ABIs. */
15607 if (!out_string && !in_string)
695344c0 15608 /* xgettext:c-format */
757a636f 15609 _bfd_error_handler
2c1c9679 15610 (_("warning: %pB uses unknown floating point ABI %d "
871b3ab2 15611 "(set by %pB), %pB uses unknown floating point ABI %d"),
c08bb8dd 15612 obfd, out_fp, abi_fp_bfd, ibfd, in_fp);
757a636f
RS
15613 else if (!out_string)
15614 _bfd_error_handler
695344c0 15615 /* xgettext:c-format */
2c1c9679 15616 (_("warning: %pB uses unknown floating point ABI %d "
871b3ab2 15617 "(set by %pB), %pB uses %s"),
c08bb8dd 15618 obfd, out_fp, abi_fp_bfd, ibfd, in_string);
757a636f
RS
15619 else if (!in_string)
15620 _bfd_error_handler
695344c0 15621 /* xgettext:c-format */
2c1c9679 15622 (_("warning: %pB uses %s (set by %pB), "
871b3ab2 15623 "%pB uses unknown floating point ABI %d"),
c08bb8dd 15624 obfd, out_string, abi_fp_bfd, ibfd, in_fp);
757a636f
RS
15625 else
15626 {
15627 /* If one of the bfds is soft-float, the other must be
15628 hard-float. The exact choice of hard-float ABI isn't
15629 really relevant to the error message. */
15630 if (in_fp == Val_GNU_MIPS_ABI_FP_SOFT)
15631 out_string = "-mhard-float";
15632 else if (out_fp == Val_GNU_MIPS_ABI_FP_SOFT)
15633 in_string = "-mhard-float";
15634 _bfd_error_handler
695344c0 15635 /* xgettext:c-format */
2c1c9679 15636 (_("warning: %pB uses %s (set by %pB), %pB uses %s"),
c08bb8dd 15637 obfd, out_string, abi_fp_bfd, ibfd, in_string);
757a636f
RS
15638 }
15639 }
2cf19d5c
JM
15640 }
15641
b60bf9be
CF
15642 /* Check for conflicting Tag_GNU_MIPS_ABI_MSA attributes and merge
15643 non-conflicting ones. */
15644 if (in_attr[Tag_GNU_MIPS_ABI_MSA].i != out_attr[Tag_GNU_MIPS_ABI_MSA].i)
15645 {
15646 out_attr[Tag_GNU_MIPS_ABI_MSA].type = 1;
15647 if (out_attr[Tag_GNU_MIPS_ABI_MSA].i == Val_GNU_MIPS_ABI_MSA_ANY)
15648 out_attr[Tag_GNU_MIPS_ABI_MSA].i = in_attr[Tag_GNU_MIPS_ABI_MSA].i;
15649 else if (in_attr[Tag_GNU_MIPS_ABI_MSA].i != Val_GNU_MIPS_ABI_MSA_ANY)
15650 switch (out_attr[Tag_GNU_MIPS_ABI_MSA].i)
15651 {
15652 case Val_GNU_MIPS_ABI_MSA_128:
15653 _bfd_error_handler
695344c0 15654 /* xgettext:c-format */
2c1c9679 15655 (_("warning: %pB uses %s (set by %pB), "
871b3ab2 15656 "%pB uses unknown MSA ABI %d"),
c08bb8dd
AM
15657 obfd, "-mmsa", abi_msa_bfd,
15658 ibfd, in_attr[Tag_GNU_MIPS_ABI_MSA].i);
b60bf9be
CF
15659 break;
15660
15661 default:
15662 switch (in_attr[Tag_GNU_MIPS_ABI_MSA].i)
15663 {
15664 case Val_GNU_MIPS_ABI_MSA_128:
15665 _bfd_error_handler
695344c0 15666 /* xgettext:c-format */
2c1c9679 15667 (_("warning: %pB uses unknown MSA ABI %d "
871b3ab2 15668 "(set by %pB), %pB uses %s"),
c08bb8dd
AM
15669 obfd, out_attr[Tag_GNU_MIPS_ABI_MSA].i,
15670 abi_msa_bfd, ibfd, "-mmsa");
b60bf9be
CF
15671 break;
15672
15673 default:
15674 _bfd_error_handler
695344c0 15675 /* xgettext:c-format */
2c1c9679 15676 (_("warning: %pB uses unknown MSA ABI %d "
871b3ab2 15677 "(set by %pB), %pB uses unknown MSA ABI %d"),
c08bb8dd
AM
15678 obfd, out_attr[Tag_GNU_MIPS_ABI_MSA].i,
15679 abi_msa_bfd, ibfd, in_attr[Tag_GNU_MIPS_ABI_MSA].i);
b60bf9be
CF
15680 break;
15681 }
15682 }
15683 }
15684
2cf19d5c 15685 /* Merge Tag_compatibility attributes and any common GNU ones. */
50e03d47 15686 return _bfd_elf_merge_object_attributes (ibfd, info);
2cf19d5c
JM
15687}
15688
a3dc0a7f
MR
15689/* Merge object ABI flags from IBFD into OBFD. Raise an error if
15690 there are conflicting settings. */
15691
15692static bfd_boolean
15693mips_elf_merge_obj_abiflags (bfd *ibfd, bfd *obfd)
15694{
15695 obj_attribute *out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
15696 struct mips_elf_obj_tdata *out_tdata = mips_elf_tdata (obfd);
15697 struct mips_elf_obj_tdata *in_tdata = mips_elf_tdata (ibfd);
15698
15699 /* Update the output abiflags fp_abi using the computed fp_abi. */
15700 out_tdata->abiflags.fp_abi = out_attr[Tag_GNU_MIPS_ABI_FP].i;
15701
15702#define max(a, b) ((a) > (b) ? (a) : (b))
15703 /* Merge abiflags. */
15704 out_tdata->abiflags.isa_level = max (out_tdata->abiflags.isa_level,
15705 in_tdata->abiflags.isa_level);
15706 out_tdata->abiflags.isa_rev = max (out_tdata->abiflags.isa_rev,
15707 in_tdata->abiflags.isa_rev);
15708 out_tdata->abiflags.gpr_size = max (out_tdata->abiflags.gpr_size,
15709 in_tdata->abiflags.gpr_size);
15710 out_tdata->abiflags.cpr1_size = max (out_tdata->abiflags.cpr1_size,
15711 in_tdata->abiflags.cpr1_size);
15712 out_tdata->abiflags.cpr2_size = max (out_tdata->abiflags.cpr2_size,
15713 in_tdata->abiflags.cpr2_size);
15714#undef max
15715 out_tdata->abiflags.ases |= in_tdata->abiflags.ases;
15716 out_tdata->abiflags.flags1 |= in_tdata->abiflags.flags1;
15717
15718 return TRUE;
15719}
15720
b49e97c9
TS
15721/* Merge backend specific data from an object file to the output
15722 object file when linking. */
15723
b34976b6 15724bfd_boolean
50e03d47 15725_bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
b49e97c9 15726{
50e03d47 15727 bfd *obfd = info->output_bfd;
cf8502c1
MR
15728 struct mips_elf_obj_tdata *out_tdata;
15729 struct mips_elf_obj_tdata *in_tdata;
b34976b6 15730 bfd_boolean null_input_bfd = TRUE;
b49e97c9 15731 asection *sec;
d537eeb5 15732 bfd_boolean ok;
b49e97c9 15733
58238693 15734 /* Check if we have the same endianness. */
50e03d47 15735 if (! _bfd_generic_verify_endian_match (ibfd, info))
aa701218 15736 {
4eca0228 15737 _bfd_error_handler
871b3ab2 15738 (_("%pB: endianness incompatible with that of the selected emulation"),
d003868e 15739 ibfd);
aa701218
AO
15740 return FALSE;
15741 }
b49e97c9 15742
d5eaccd7 15743 if (!is_mips_elf (ibfd) || !is_mips_elf (obfd))
b34976b6 15744 return TRUE;
b49e97c9 15745
cf8502c1
MR
15746 in_tdata = mips_elf_tdata (ibfd);
15747 out_tdata = mips_elf_tdata (obfd);
15748
aa701218
AO
15749 if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
15750 {
4eca0228 15751 _bfd_error_handler
871b3ab2 15752 (_("%pB: ABI is incompatible with that of the selected emulation"),
d003868e 15753 ibfd);
aa701218
AO
15754 return FALSE;
15755 }
15756
23ba6f18
MR
15757 /* Check to see if the input BFD actually contains any sections. If not,
15758 then it has no attributes, and its flags may not have been initialized
15759 either, but it cannot actually cause any incompatibility. */
351cdf24
MF
15760 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
15761 {
15762 /* Ignore synthetic sections and empty .text, .data and .bss sections
15763 which are automatically generated by gas. Also ignore fake
15764 (s)common sections, since merely defining a common symbol does
15765 not affect compatibility. */
15766 if ((sec->flags & SEC_IS_COMMON) == 0
15767 && strcmp (sec->name, ".reginfo")
15768 && strcmp (sec->name, ".mdebug")
15769 && (sec->size != 0
15770 || (strcmp (sec->name, ".text")
15771 && strcmp (sec->name, ".data")
15772 && strcmp (sec->name, ".bss"))))
15773 {
15774 null_input_bfd = FALSE;
15775 break;
15776 }
15777 }
15778 if (null_input_bfd)
15779 return TRUE;
15780
28d45e28 15781 /* Populate abiflags using existing information. */
23ba6f18
MR
15782 if (in_tdata->abiflags_valid)
15783 {
15784 obj_attribute *in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
28d45e28
MR
15785 Elf_Internal_ABIFlags_v0 in_abiflags;
15786 Elf_Internal_ABIFlags_v0 abiflags;
15787
15788 /* Set up the FP ABI attribute from the abiflags if it is not already
07d6d2b8 15789 set. */
23ba6f18 15790 if (in_attr[Tag_GNU_MIPS_ABI_FP].i == Val_GNU_MIPS_ABI_FP_ANY)
07d6d2b8 15791 in_attr[Tag_GNU_MIPS_ABI_FP].i = in_tdata->abiflags.fp_abi;
23ba6f18 15792
351cdf24 15793 infer_mips_abiflags (ibfd, &abiflags);
cf8502c1 15794 in_abiflags = in_tdata->abiflags;
351cdf24
MF
15795
15796 /* It is not possible to infer the correct ISA revision
07d6d2b8 15797 for R3 or R5 so drop down to R2 for the checks. */
351cdf24
MF
15798 if (in_abiflags.isa_rev == 3 || in_abiflags.isa_rev == 5)
15799 in_abiflags.isa_rev = 2;
15800
c97c330b
MF
15801 if (LEVEL_REV (in_abiflags.isa_level, in_abiflags.isa_rev)
15802 < LEVEL_REV (abiflags.isa_level, abiflags.isa_rev))
4eca0228 15803 _bfd_error_handler
2c1c9679 15804 (_("%pB: warning: inconsistent ISA between e_flags and "
351cdf24
MF
15805 ".MIPS.abiflags"), ibfd);
15806 if (abiflags.fp_abi != Val_GNU_MIPS_ABI_FP_ANY
15807 && in_abiflags.fp_abi != abiflags.fp_abi)
4eca0228 15808 _bfd_error_handler
2c1c9679 15809 (_("%pB: warning: inconsistent FP ABI between .gnu.attributes and "
351cdf24
MF
15810 ".MIPS.abiflags"), ibfd);
15811 if ((in_abiflags.ases & abiflags.ases) != abiflags.ases)
4eca0228 15812 _bfd_error_handler
2c1c9679 15813 (_("%pB: warning: inconsistent ASEs between e_flags and "
351cdf24 15814 ".MIPS.abiflags"), ibfd);
c97c330b
MF
15815 /* The isa_ext is allowed to be an extension of what can be inferred
15816 from e_flags. */
15817 if (!mips_mach_extends_p (bfd_mips_isa_ext_mach (abiflags.isa_ext),
15818 bfd_mips_isa_ext_mach (in_abiflags.isa_ext)))
4eca0228 15819 _bfd_error_handler
2c1c9679 15820 (_("%pB: warning: inconsistent ISA extensions between e_flags and "
351cdf24
MF
15821 ".MIPS.abiflags"), ibfd);
15822 if (in_abiflags.flags2 != 0)
4eca0228 15823 _bfd_error_handler
2c1c9679 15824 (_("%pB: warning: unexpected flag in the flags2 field of "
351cdf24 15825 ".MIPS.abiflags (0x%lx)"), ibfd,
d42c267e 15826 in_abiflags.flags2);
351cdf24 15827 }
28d45e28
MR
15828 else
15829 {
15830 infer_mips_abiflags (ibfd, &in_tdata->abiflags);
15831 in_tdata->abiflags_valid = TRUE;
15832 }
15833
cf8502c1 15834 if (!out_tdata->abiflags_valid)
351cdf24
MF
15835 {
15836 /* Copy input abiflags if output abiflags are not already valid. */
cf8502c1
MR
15837 out_tdata->abiflags = in_tdata->abiflags;
15838 out_tdata->abiflags_valid = TRUE;
351cdf24 15839 }
b49e97c9
TS
15840
15841 if (! elf_flags_init (obfd))
15842 {
b34976b6 15843 elf_flags_init (obfd) = TRUE;
351cdf24 15844 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
b49e97c9
TS
15845 elf_elfheader (obfd)->e_ident[EI_CLASS]
15846 = elf_elfheader (ibfd)->e_ident[EI_CLASS];
15847
15848 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
2907b861 15849 && (bfd_get_arch_info (obfd)->the_default
68ffbac6 15850 || mips_mach_extends_p (bfd_get_mach (obfd),
2907b861 15851 bfd_get_mach (ibfd))))
b49e97c9
TS
15852 {
15853 if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
15854 bfd_get_mach (ibfd)))
b34976b6 15855 return FALSE;
351cdf24
MF
15856
15857 /* Update the ABI flags isa_level, isa_rev and isa_ext fields. */
cf8502c1 15858 update_mips_abiflags_isa (obfd, &out_tdata->abiflags);
b49e97c9
TS
15859 }
15860
d537eeb5 15861 ok = TRUE;
b49e97c9 15862 }
d537eeb5 15863 else
50e03d47 15864 ok = mips_elf_merge_obj_e_flags (ibfd, info);
d537eeb5 15865
50e03d47 15866 ok = mips_elf_merge_obj_attributes (ibfd, info) && ok;
b49e97c9 15867
a3dc0a7f 15868 ok = mips_elf_merge_obj_abiflags (ibfd, obfd) && ok;
351cdf24 15869
d537eeb5 15870 if (!ok)
b49e97c9
TS
15871 {
15872 bfd_set_error (bfd_error_bad_value);
b34976b6 15873 return FALSE;
b49e97c9
TS
15874 }
15875
b34976b6 15876 return TRUE;
b49e97c9
TS
15877}
15878
15879/* Function to keep MIPS specific file flags like as EF_MIPS_PIC. */
15880
b34976b6 15881bfd_boolean
9719ad41 15882_bfd_mips_elf_set_private_flags (bfd *abfd, flagword flags)
b49e97c9
TS
15883{
15884 BFD_ASSERT (!elf_flags_init (abfd)
15885 || elf_elfheader (abfd)->e_flags == flags);
15886
15887 elf_elfheader (abfd)->e_flags = flags;
b34976b6
AM
15888 elf_flags_init (abfd) = TRUE;
15889 return TRUE;
b49e97c9
TS
15890}
15891
ad9563d6
CM
15892char *
15893_bfd_mips_elf_get_target_dtag (bfd_vma dtag)
15894{
15895 switch (dtag)
15896 {
15897 default: return "";
15898 case DT_MIPS_RLD_VERSION:
15899 return "MIPS_RLD_VERSION";
15900 case DT_MIPS_TIME_STAMP:
15901 return "MIPS_TIME_STAMP";
15902 case DT_MIPS_ICHECKSUM:
15903 return "MIPS_ICHECKSUM";
15904 case DT_MIPS_IVERSION:
15905 return "MIPS_IVERSION";
15906 case DT_MIPS_FLAGS:
15907 return "MIPS_FLAGS";
15908 case DT_MIPS_BASE_ADDRESS:
15909 return "MIPS_BASE_ADDRESS";
15910 case DT_MIPS_MSYM:
15911 return "MIPS_MSYM";
15912 case DT_MIPS_CONFLICT:
15913 return "MIPS_CONFLICT";
15914 case DT_MIPS_LIBLIST:
15915 return "MIPS_LIBLIST";
15916 case DT_MIPS_LOCAL_GOTNO:
15917 return "MIPS_LOCAL_GOTNO";
15918 case DT_MIPS_CONFLICTNO:
15919 return "MIPS_CONFLICTNO";
15920 case DT_MIPS_LIBLISTNO:
15921 return "MIPS_LIBLISTNO";
15922 case DT_MIPS_SYMTABNO:
15923 return "MIPS_SYMTABNO";
15924 case DT_MIPS_UNREFEXTNO:
15925 return "MIPS_UNREFEXTNO";
15926 case DT_MIPS_GOTSYM:
15927 return "MIPS_GOTSYM";
15928 case DT_MIPS_HIPAGENO:
15929 return "MIPS_HIPAGENO";
15930 case DT_MIPS_RLD_MAP:
15931 return "MIPS_RLD_MAP";
a5499fa4
MF
15932 case DT_MIPS_RLD_MAP_REL:
15933 return "MIPS_RLD_MAP_REL";
ad9563d6
CM
15934 case DT_MIPS_DELTA_CLASS:
15935 return "MIPS_DELTA_CLASS";
15936 case DT_MIPS_DELTA_CLASS_NO:
15937 return "MIPS_DELTA_CLASS_NO";
15938 case DT_MIPS_DELTA_INSTANCE:
15939 return "MIPS_DELTA_INSTANCE";
15940 case DT_MIPS_DELTA_INSTANCE_NO:
15941 return "MIPS_DELTA_INSTANCE_NO";
15942 case DT_MIPS_DELTA_RELOC:
15943 return "MIPS_DELTA_RELOC";
15944 case DT_MIPS_DELTA_RELOC_NO:
15945 return "MIPS_DELTA_RELOC_NO";
15946 case DT_MIPS_DELTA_SYM:
15947 return "MIPS_DELTA_SYM";
15948 case DT_MIPS_DELTA_SYM_NO:
15949 return "MIPS_DELTA_SYM_NO";
15950 case DT_MIPS_DELTA_CLASSSYM:
15951 return "MIPS_DELTA_CLASSSYM";
15952 case DT_MIPS_DELTA_CLASSSYM_NO:
15953 return "MIPS_DELTA_CLASSSYM_NO";
15954 case DT_MIPS_CXX_FLAGS:
15955 return "MIPS_CXX_FLAGS";
15956 case DT_MIPS_PIXIE_INIT:
15957 return "MIPS_PIXIE_INIT";
15958 case DT_MIPS_SYMBOL_LIB:
15959 return "MIPS_SYMBOL_LIB";
15960 case DT_MIPS_LOCALPAGE_GOTIDX:
15961 return "MIPS_LOCALPAGE_GOTIDX";
15962 case DT_MIPS_LOCAL_GOTIDX:
15963 return "MIPS_LOCAL_GOTIDX";
15964 case DT_MIPS_HIDDEN_GOTIDX:
15965 return "MIPS_HIDDEN_GOTIDX";
15966 case DT_MIPS_PROTECTED_GOTIDX:
15967 return "MIPS_PROTECTED_GOT_IDX";
15968 case DT_MIPS_OPTIONS:
15969 return "MIPS_OPTIONS";
15970 case DT_MIPS_INTERFACE:
15971 return "MIPS_INTERFACE";
15972 case DT_MIPS_DYNSTR_ALIGN:
15973 return "DT_MIPS_DYNSTR_ALIGN";
15974 case DT_MIPS_INTERFACE_SIZE:
15975 return "DT_MIPS_INTERFACE_SIZE";
15976 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR:
15977 return "DT_MIPS_RLD_TEXT_RESOLVE_ADDR";
15978 case DT_MIPS_PERF_SUFFIX:
15979 return "DT_MIPS_PERF_SUFFIX";
15980 case DT_MIPS_COMPACT_SIZE:
15981 return "DT_MIPS_COMPACT_SIZE";
15982 case DT_MIPS_GP_VALUE:
15983 return "DT_MIPS_GP_VALUE";
15984 case DT_MIPS_AUX_DYNAMIC:
15985 return "DT_MIPS_AUX_DYNAMIC";
861fb55a
DJ
15986 case DT_MIPS_PLTGOT:
15987 return "DT_MIPS_PLTGOT";
15988 case DT_MIPS_RWPLT:
15989 return "DT_MIPS_RWPLT";
f16a9783
MS
15990 case DT_MIPS_XHASH:
15991 return "DT_MIPS_XHASH";
ad9563d6
CM
15992 }
15993}
15994
757a636f
RS
15995/* Return the meaning of Tag_GNU_MIPS_ABI_FP value FP, or null if
15996 not known. */
15997
15998const char *
15999_bfd_mips_fp_abi_string (int fp)
16000{
16001 switch (fp)
16002 {
16003 /* These strings aren't translated because they're simply
16004 option lists. */
16005 case Val_GNU_MIPS_ABI_FP_DOUBLE:
16006 return "-mdouble-float";
16007
16008 case Val_GNU_MIPS_ABI_FP_SINGLE:
16009 return "-msingle-float";
16010
16011 case Val_GNU_MIPS_ABI_FP_SOFT:
16012 return "-msoft-float";
16013
351cdf24
MF
16014 case Val_GNU_MIPS_ABI_FP_OLD_64:
16015 return _("-mips32r2 -mfp64 (12 callee-saved)");
16016
16017 case Val_GNU_MIPS_ABI_FP_XX:
16018 return "-mfpxx";
16019
757a636f 16020 case Val_GNU_MIPS_ABI_FP_64:
351cdf24
MF
16021 return "-mgp32 -mfp64";
16022
16023 case Val_GNU_MIPS_ABI_FP_64A:
16024 return "-mgp32 -mfp64 -mno-odd-spreg";
757a636f
RS
16025
16026 default:
16027 return 0;
16028 }
16029}
16030
351cdf24
MF
16031static void
16032print_mips_ases (FILE *file, unsigned int mask)
16033{
16034 if (mask & AFL_ASE_DSP)
16035 fputs ("\n\tDSP ASE", file);
16036 if (mask & AFL_ASE_DSPR2)
16037 fputs ("\n\tDSP R2 ASE", file);
8f4f9071
MF
16038 if (mask & AFL_ASE_DSPR3)
16039 fputs ("\n\tDSP R3 ASE", file);
351cdf24
MF
16040 if (mask & AFL_ASE_EVA)
16041 fputs ("\n\tEnhanced VA Scheme", file);
16042 if (mask & AFL_ASE_MCU)
16043 fputs ("\n\tMCU (MicroController) ASE", file);
16044 if (mask & AFL_ASE_MDMX)
16045 fputs ("\n\tMDMX ASE", file);
16046 if (mask & AFL_ASE_MIPS3D)
16047 fputs ("\n\tMIPS-3D ASE", file);
16048 if (mask & AFL_ASE_MT)
16049 fputs ("\n\tMT ASE", file);
16050 if (mask & AFL_ASE_SMARTMIPS)
16051 fputs ("\n\tSmartMIPS ASE", file);
16052 if (mask & AFL_ASE_VIRT)
16053 fputs ("\n\tVZ ASE", file);
16054 if (mask & AFL_ASE_MSA)
16055 fputs ("\n\tMSA ASE", file);
16056 if (mask & AFL_ASE_MIPS16)
16057 fputs ("\n\tMIPS16 ASE", file);
16058 if (mask & AFL_ASE_MICROMIPS)
16059 fputs ("\n\tMICROMIPS ASE", file);
16060 if (mask & AFL_ASE_XPA)
16061 fputs ("\n\tXPA ASE", file);
25499ac7
MR
16062 if (mask & AFL_ASE_MIPS16E2)
16063 fputs ("\n\tMIPS16e2 ASE", file);
730c3174
SE
16064 if (mask & AFL_ASE_CRC)
16065 fputs ("\n\tCRC ASE", file);
6f20c942
FS
16066 if (mask & AFL_ASE_GINV)
16067 fputs ("\n\tGINV ASE", file);
8095d2f7
CX
16068 if (mask & AFL_ASE_LOONGSON_MMI)
16069 fputs ("\n\tLoongson MMI ASE", file);
716c08de
CX
16070 if (mask & AFL_ASE_LOONGSON_CAM)
16071 fputs ("\n\tLoongson CAM ASE", file);
bdc6c06e
CX
16072 if (mask & AFL_ASE_LOONGSON_EXT)
16073 fputs ("\n\tLoongson EXT ASE", file);
a693765e
CX
16074 if (mask & AFL_ASE_LOONGSON_EXT2)
16075 fputs ("\n\tLoongson EXT2 ASE", file);
351cdf24
MF
16076 if (mask == 0)
16077 fprintf (file, "\n\t%s", _("None"));
00ac7aa0
MF
16078 else if ((mask & ~AFL_ASE_MASK) != 0)
16079 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
351cdf24
MF
16080}
16081
16082static void
16083print_mips_isa_ext (FILE *file, unsigned int isa_ext)
16084{
16085 switch (isa_ext)
16086 {
16087 case 0:
16088 fputs (_("None"), file);
16089 break;
16090 case AFL_EXT_XLR:
16091 fputs ("RMI XLR", file);
16092 break;
2c629856
N
16093 case AFL_EXT_OCTEON3:
16094 fputs ("Cavium Networks Octeon3", file);
16095 break;
351cdf24
MF
16096 case AFL_EXT_OCTEON2:
16097 fputs ("Cavium Networks Octeon2", file);
16098 break;
16099 case AFL_EXT_OCTEONP:
16100 fputs ("Cavium Networks OcteonP", file);
16101 break;
351cdf24
MF
16102 case AFL_EXT_OCTEON:
16103 fputs ("Cavium Networks Octeon", file);
16104 break;
16105 case AFL_EXT_5900:
16106 fputs ("Toshiba R5900", file);
16107 break;
16108 case AFL_EXT_4650:
16109 fputs ("MIPS R4650", file);
16110 break;
16111 case AFL_EXT_4010:
16112 fputs ("LSI R4010", file);
16113 break;
16114 case AFL_EXT_4100:
16115 fputs ("NEC VR4100", file);
16116 break;
16117 case AFL_EXT_3900:
16118 fputs ("Toshiba R3900", file);
16119 break;
16120 case AFL_EXT_10000:
16121 fputs ("MIPS R10000", file);
16122 break;
16123 case AFL_EXT_SB1:
16124 fputs ("Broadcom SB-1", file);
16125 break;
16126 case AFL_EXT_4111:
16127 fputs ("NEC VR4111/VR4181", file);
16128 break;
16129 case AFL_EXT_4120:
16130 fputs ("NEC VR4120", file);
16131 break;
16132 case AFL_EXT_5400:
16133 fputs ("NEC VR5400", file);
16134 break;
16135 case AFL_EXT_5500:
16136 fputs ("NEC VR5500", file);
16137 break;
16138 case AFL_EXT_LOONGSON_2E:
16139 fputs ("ST Microelectronics Loongson 2E", file);
16140 break;
16141 case AFL_EXT_LOONGSON_2F:
16142 fputs ("ST Microelectronics Loongson 2F", file);
16143 break;
38bf472a
MR
16144 case AFL_EXT_INTERAPTIV_MR2:
16145 fputs ("Imagination interAptiv MR2", file);
16146 break;
351cdf24 16147 default:
00ac7aa0 16148 fprintf (file, "%s (%d)", _("Unknown"), isa_ext);
351cdf24
MF
16149 break;
16150 }
16151}
16152
16153static void
16154print_mips_fp_abi_value (FILE *file, int val)
16155{
16156 switch (val)
16157 {
16158 case Val_GNU_MIPS_ABI_FP_ANY:
16159 fprintf (file, _("Hard or soft float\n"));
16160 break;
16161 case Val_GNU_MIPS_ABI_FP_DOUBLE:
16162 fprintf (file, _("Hard float (double precision)\n"));
16163 break;
16164 case Val_GNU_MIPS_ABI_FP_SINGLE:
16165 fprintf (file, _("Hard float (single precision)\n"));
16166 break;
16167 case Val_GNU_MIPS_ABI_FP_SOFT:
16168 fprintf (file, _("Soft float\n"));
16169 break;
16170 case Val_GNU_MIPS_ABI_FP_OLD_64:
16171 fprintf (file, _("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
16172 break;
16173 case Val_GNU_MIPS_ABI_FP_XX:
16174 fprintf (file, _("Hard float (32-bit CPU, Any FPU)\n"));
16175 break;
16176 case Val_GNU_MIPS_ABI_FP_64:
16177 fprintf (file, _("Hard float (32-bit CPU, 64-bit FPU)\n"));
16178 break;
16179 case Val_GNU_MIPS_ABI_FP_64A:
16180 fprintf (file, _("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
16181 break;
16182 default:
16183 fprintf (file, "??? (%d)\n", val);
16184 break;
16185 }
16186}
16187
16188static int
16189get_mips_reg_size (int reg_size)
16190{
16191 return (reg_size == AFL_REG_NONE) ? 0
16192 : (reg_size == AFL_REG_32) ? 32
16193 : (reg_size == AFL_REG_64) ? 64
16194 : (reg_size == AFL_REG_128) ? 128
16195 : -1;
16196}
16197
b34976b6 16198bfd_boolean
9719ad41 16199_bfd_mips_elf_print_private_bfd_data (bfd *abfd, void *ptr)
b49e97c9 16200{
9719ad41 16201 FILE *file = ptr;
b49e97c9
TS
16202
16203 BFD_ASSERT (abfd != NULL && ptr != NULL);
16204
16205 /* Print normal ELF private data. */
16206 _bfd_elf_print_private_bfd_data (abfd, ptr);
16207
16208 /* xgettext:c-format */
16209 fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
16210
16211 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O32)
16212 fprintf (file, _(" [abi=O32]"));
16213 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O64)
16214 fprintf (file, _(" [abi=O64]"));
16215 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32)
16216 fprintf (file, _(" [abi=EABI32]"));
16217 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64)
16218 fprintf (file, _(" [abi=EABI64]"));
16219 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI))
16220 fprintf (file, _(" [abi unknown]"));
16221 else if (ABI_N32_P (abfd))
16222 fprintf (file, _(" [abi=N32]"));
16223 else if (ABI_64_P (abfd))
16224 fprintf (file, _(" [abi=64]"));
16225 else
16226 fprintf (file, _(" [no abi set]"));
16227
16228 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
ae0d2616 16229 fprintf (file, " [mips1]");
b49e97c9 16230 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
ae0d2616 16231 fprintf (file, " [mips2]");
b49e97c9 16232 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
ae0d2616 16233 fprintf (file, " [mips3]");
b49e97c9 16234 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
ae0d2616 16235 fprintf (file, " [mips4]");
b49e97c9 16236 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_5)
ae0d2616 16237 fprintf (file, " [mips5]");
b49e97c9 16238 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
ae0d2616 16239 fprintf (file, " [mips32]");
b49e97c9 16240 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64)
ae0d2616 16241 fprintf (file, " [mips64]");
af7ee8bf 16242 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2)
ae0d2616 16243 fprintf (file, " [mips32r2]");
5f74bc13 16244 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64R2)
ae0d2616 16245 fprintf (file, " [mips64r2]");
7361da2c
AB
16246 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R6)
16247 fprintf (file, " [mips32r6]");
16248 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64R6)
16249 fprintf (file, " [mips64r6]");
b49e97c9
TS
16250 else
16251 fprintf (file, _(" [unknown ISA]"));
16252
40d32fc6 16253 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
ae0d2616 16254 fprintf (file, " [mdmx]");
40d32fc6
CD
16255
16256 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
ae0d2616 16257 fprintf (file, " [mips16]");
40d32fc6 16258
df58fc94
RS
16259 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
16260 fprintf (file, " [micromips]");
16261
ba92f887
MR
16262 if (elf_elfheader (abfd)->e_flags & EF_MIPS_NAN2008)
16263 fprintf (file, " [nan2008]");
16264
5baf5e34 16265 if (elf_elfheader (abfd)->e_flags & EF_MIPS_FP64)
351cdf24 16266 fprintf (file, " [old fp64]");
5baf5e34 16267
b49e97c9 16268 if (elf_elfheader (abfd)->e_flags & EF_MIPS_32BITMODE)
ae0d2616 16269 fprintf (file, " [32bitmode]");
b49e97c9
TS
16270 else
16271 fprintf (file, _(" [not 32bitmode]"));
16272
c0e3f241 16273 if (elf_elfheader (abfd)->e_flags & EF_MIPS_NOREORDER)
ae0d2616 16274 fprintf (file, " [noreorder]");
c0e3f241
CD
16275
16276 if (elf_elfheader (abfd)->e_flags & EF_MIPS_PIC)
ae0d2616 16277 fprintf (file, " [PIC]");
c0e3f241
CD
16278
16279 if (elf_elfheader (abfd)->e_flags & EF_MIPS_CPIC)
ae0d2616 16280 fprintf (file, " [CPIC]");
c0e3f241
CD
16281
16282 if (elf_elfheader (abfd)->e_flags & EF_MIPS_XGOT)
ae0d2616 16283 fprintf (file, " [XGOT]");
c0e3f241
CD
16284
16285 if (elf_elfheader (abfd)->e_flags & EF_MIPS_UCODE)
ae0d2616 16286 fprintf (file, " [UCODE]");
c0e3f241 16287
b49e97c9
TS
16288 fputc ('\n', file);
16289
351cdf24
MF
16290 if (mips_elf_tdata (abfd)->abiflags_valid)
16291 {
16292 Elf_Internal_ABIFlags_v0 *abiflags = &mips_elf_tdata (abfd)->abiflags;
16293 fprintf (file, "\nMIPS ABI Flags Version: %d\n", abiflags->version);
16294 fprintf (file, "\nISA: MIPS%d", abiflags->isa_level);
16295 if (abiflags->isa_rev > 1)
16296 fprintf (file, "r%d", abiflags->isa_rev);
16297 fprintf (file, "\nGPR size: %d",
16298 get_mips_reg_size (abiflags->gpr_size));
16299 fprintf (file, "\nCPR1 size: %d",
16300 get_mips_reg_size (abiflags->cpr1_size));
16301 fprintf (file, "\nCPR2 size: %d",
16302 get_mips_reg_size (abiflags->cpr2_size));
16303 fputs ("\nFP ABI: ", file);
16304 print_mips_fp_abi_value (file, abiflags->fp_abi);
16305 fputs ("ISA Extension: ", file);
16306 print_mips_isa_ext (file, abiflags->isa_ext);
16307 fputs ("\nASEs:", file);
16308 print_mips_ases (file, abiflags->ases);
16309 fprintf (file, "\nFLAGS 1: %8.8lx", abiflags->flags1);
16310 fprintf (file, "\nFLAGS 2: %8.8lx", abiflags->flags2);
16311 fputc ('\n', file);
16312 }
16313
b34976b6 16314 return TRUE;
b49e97c9 16315}
2f89ff8d 16316
b35d266b 16317const struct bfd_elf_special_section _bfd_mips_elf_special_sections[] =
2f89ff8d 16318{
07d6d2b8
AM
16319 { STRING_COMMA_LEN (".lit4"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16320 { STRING_COMMA_LEN (".lit8"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
0112cd26 16321 { STRING_COMMA_LEN (".mdebug"), 0, SHT_MIPS_DEBUG, 0 },
07d6d2b8 16322 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
0112cd26
NC
16323 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16324 { STRING_COMMA_LEN (".ucode"), 0, SHT_MIPS_UCODE, 0 },
f16a9783 16325 { STRING_COMMA_LEN (".MIPS.xhash"), 0, SHT_MIPS_XHASH, SHF_ALLOC },
07d6d2b8 16326 { NULL, 0, 0, 0, 0 }
2f89ff8d 16327};
5e2b0d47 16328
8992f0d7
TS
16329/* Merge non visibility st_other attributes. Ensure that the
16330 STO_OPTIONAL flag is copied into h->other, even if this is not a
16331 definiton of the symbol. */
5e2b0d47
NC
16332void
16333_bfd_mips_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
16334 const Elf_Internal_Sym *isym,
16335 bfd_boolean definition,
16336 bfd_boolean dynamic ATTRIBUTE_UNUSED)
16337{
8992f0d7
TS
16338 if ((isym->st_other & ~ELF_ST_VISIBILITY (-1)) != 0)
16339 {
16340 unsigned char other;
16341
16342 other = (definition ? isym->st_other : h->other);
16343 other &= ~ELF_ST_VISIBILITY (-1);
16344 h->other = other | ELF_ST_VISIBILITY (h->other);
16345 }
16346
16347 if (!definition
5e2b0d47
NC
16348 && ELF_MIPS_IS_OPTIONAL (isym->st_other))
16349 h->other |= STO_OPTIONAL;
16350}
12ac1cf5
NC
16351
16352/* Decide whether an undefined symbol is special and can be ignored.
16353 This is the case for OPTIONAL symbols on IRIX. */
16354bfd_boolean
16355_bfd_mips_elf_ignore_undef_symbol (struct elf_link_hash_entry *h)
16356{
16357 return ELF_MIPS_IS_OPTIONAL (h->other) ? TRUE : FALSE;
16358}
e0764319
NC
16359
16360bfd_boolean
16361_bfd_mips_elf_common_definition (Elf_Internal_Sym *sym)
16362{
16363 return (sym->st_shndx == SHN_COMMON
16364 || sym->st_shndx == SHN_MIPS_ACOMMON
16365 || sym->st_shndx == SHN_MIPS_SCOMMON);
16366}
861fb55a
DJ
16367
16368/* Return address for Ith PLT stub in section PLT, for relocation REL
16369 or (bfd_vma) -1 if it should not be included. */
16370
16371bfd_vma
16372_bfd_mips_elf_plt_sym_val (bfd_vma i, const asection *plt,
16373 const arelent *rel ATTRIBUTE_UNUSED)
16374{
16375 return (plt->vma
16376 + 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry)
16377 + i * 4 * ARRAY_SIZE (mips_exec_plt_entry));
16378}
16379
1bbce132
MR
16380/* Build a table of synthetic symbols to represent the PLT. As with MIPS16
16381 and microMIPS PLT slots we may have a many-to-one mapping between .plt
16382 and .got.plt and also the slots may be of a different size each we walk
16383 the PLT manually fetching instructions and matching them against known
16384 patterns. To make things easier standard MIPS slots, if any, always come
16385 first. As we don't create proper ELF symbols we use the UDATA.I member
16386 of ASYMBOL to carry ISA annotation. The encoding used is the same as
16387 with the ST_OTHER member of the ELF symbol. */
16388
16389long
16390_bfd_mips_elf_get_synthetic_symtab (bfd *abfd,
16391 long symcount ATTRIBUTE_UNUSED,
16392 asymbol **syms ATTRIBUTE_UNUSED,
16393 long dynsymcount, asymbol **dynsyms,
16394 asymbol **ret)
16395{
16396 static const char pltname[] = "_PROCEDURE_LINKAGE_TABLE_";
16397 static const char microsuffix[] = "@micromipsplt";
16398 static const char m16suffix[] = "@mips16plt";
16399 static const char mipssuffix[] = "@plt";
16400
16401 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
16402 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
16403 bfd_boolean micromips_p = MICROMIPS_P (abfd);
16404 Elf_Internal_Shdr *hdr;
16405 bfd_byte *plt_data;
16406 bfd_vma plt_offset;
16407 unsigned int other;
16408 bfd_vma entry_size;
16409 bfd_vma plt0_size;
16410 asection *relplt;
16411 bfd_vma opcode;
16412 asection *plt;
16413 asymbol *send;
16414 size_t size;
16415 char *names;
16416 long counti;
16417 arelent *p;
16418 asymbol *s;
16419 char *nend;
16420 long count;
16421 long pi;
16422 long i;
16423 long n;
16424
16425 *ret = NULL;
16426
16427 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0 || dynsymcount <= 0)
16428 return 0;
16429
16430 relplt = bfd_get_section_by_name (abfd, ".rel.plt");
16431 if (relplt == NULL)
16432 return 0;
16433
16434 hdr = &elf_section_data (relplt)->this_hdr;
16435 if (hdr->sh_link != elf_dynsymtab (abfd) || hdr->sh_type != SHT_REL)
16436 return 0;
16437
16438 plt = bfd_get_section_by_name (abfd, ".plt");
16439 if (plt == NULL)
16440 return 0;
16441
16442 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
16443 if (!(*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
16444 return -1;
16445 p = relplt->relocation;
16446
16447 /* Calculating the exact amount of space required for symbols would
16448 require two passes over the PLT, so just pessimise assuming two
16449 PLT slots per relocation. */
16450 count = relplt->size / hdr->sh_entsize;
16451 counti = count * bed->s->int_rels_per_ext_rel;
16452 size = 2 * count * sizeof (asymbol);
16453 size += count * (sizeof (mipssuffix) +
16454 (micromips_p ? sizeof (microsuffix) : sizeof (m16suffix)));
16455 for (pi = 0; pi < counti; pi += bed->s->int_rels_per_ext_rel)
16456 size += 2 * strlen ((*p[pi].sym_ptr_ptr)->name);
16457
16458 /* Add the size of "_PROCEDURE_LINKAGE_TABLE_" too. */
16459 size += sizeof (asymbol) + sizeof (pltname);
16460
16461 if (!bfd_malloc_and_get_section (abfd, plt, &plt_data))
16462 return -1;
16463
16464 if (plt->size < 16)
16465 return -1;
16466
16467 s = *ret = bfd_malloc (size);
16468 if (s == NULL)
16469 return -1;
16470 send = s + 2 * count + 1;
16471
16472 names = (char *) send;
16473 nend = (char *) s + size;
16474 n = 0;
16475
16476 opcode = bfd_get_micromips_32 (abfd, plt_data + 12);
16477 if (opcode == 0x3302fffe)
16478 {
16479 if (!micromips_p)
16480 return -1;
16481 plt0_size = 2 * ARRAY_SIZE (micromips_o32_exec_plt0_entry);
16482 other = STO_MICROMIPS;
16483 }
833794fc
MR
16484 else if (opcode == 0x0398c1d0)
16485 {
16486 if (!micromips_p)
16487 return -1;
16488 plt0_size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry);
16489 other = STO_MICROMIPS;
16490 }
1bbce132
MR
16491 else
16492 {
16493 plt0_size = 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry);
16494 other = 0;
16495 }
16496
16497 s->the_bfd = abfd;
16498 s->flags = BSF_SYNTHETIC | BSF_FUNCTION | BSF_LOCAL;
16499 s->section = plt;
16500 s->value = 0;
16501 s->name = names;
16502 s->udata.i = other;
16503 memcpy (names, pltname, sizeof (pltname));
16504 names += sizeof (pltname);
16505 ++s, ++n;
16506
16507 pi = 0;
16508 for (plt_offset = plt0_size;
16509 plt_offset + 8 <= plt->size && s < send;
16510 plt_offset += entry_size)
16511 {
16512 bfd_vma gotplt_addr;
16513 const char *suffix;
16514 bfd_vma gotplt_hi;
16515 bfd_vma gotplt_lo;
16516 size_t suffixlen;
16517
16518 opcode = bfd_get_micromips_32 (abfd, plt_data + plt_offset + 4);
16519
16520 /* Check if the second word matches the expected MIPS16 instruction. */
16521 if (opcode == 0x651aeb00)
16522 {
16523 if (micromips_p)
16524 return -1;
16525 /* Truncated table??? */
16526 if (plt_offset + 16 > plt->size)
16527 break;
16528 gotplt_addr = bfd_get_32 (abfd, plt_data + plt_offset + 12);
16529 entry_size = 2 * ARRAY_SIZE (mips16_o32_exec_plt_entry);
16530 suffixlen = sizeof (m16suffix);
16531 suffix = m16suffix;
16532 other = STO_MIPS16;
16533 }
833794fc 16534 /* Likewise the expected microMIPS instruction (no insn32 mode). */
1bbce132
MR
16535 else if (opcode == 0xff220000)
16536 {
16537 if (!micromips_p)
16538 return -1;
16539 gotplt_hi = bfd_get_16 (abfd, plt_data + plt_offset) & 0x7f;
16540 gotplt_lo = bfd_get_16 (abfd, plt_data + plt_offset + 2) & 0xffff;
16541 gotplt_hi = ((gotplt_hi ^ 0x40) - 0x40) << 18;
16542 gotplt_lo <<= 2;
16543 gotplt_addr = gotplt_hi + gotplt_lo;
16544 gotplt_addr += ((plt->vma + plt_offset) | 3) ^ 3;
16545 entry_size = 2 * ARRAY_SIZE (micromips_o32_exec_plt_entry);
16546 suffixlen = sizeof (microsuffix);
16547 suffix = microsuffix;
16548 other = STO_MICROMIPS;
16549 }
833794fc
MR
16550 /* Likewise the expected microMIPS instruction (insn32 mode). */
16551 else if ((opcode & 0xffff0000) == 0xff2f0000)
16552 {
16553 gotplt_hi = bfd_get_16 (abfd, plt_data + plt_offset + 2) & 0xffff;
16554 gotplt_lo = bfd_get_16 (abfd, plt_data + plt_offset + 6) & 0xffff;
16555 gotplt_hi = ((gotplt_hi ^ 0x8000) - 0x8000) << 16;
16556 gotplt_lo = (gotplt_lo ^ 0x8000) - 0x8000;
16557 gotplt_addr = gotplt_hi + gotplt_lo;
16558 entry_size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt_entry);
16559 suffixlen = sizeof (microsuffix);
16560 suffix = microsuffix;
16561 other = STO_MICROMIPS;
16562 }
1bbce132
MR
16563 /* Otherwise assume standard MIPS code. */
16564 else
16565 {
16566 gotplt_hi = bfd_get_32 (abfd, plt_data + plt_offset) & 0xffff;
16567 gotplt_lo = bfd_get_32 (abfd, plt_data + plt_offset + 4) & 0xffff;
16568 gotplt_hi = ((gotplt_hi ^ 0x8000) - 0x8000) << 16;
16569 gotplt_lo = (gotplt_lo ^ 0x8000) - 0x8000;
16570 gotplt_addr = gotplt_hi + gotplt_lo;
16571 entry_size = 4 * ARRAY_SIZE (mips_exec_plt_entry);
16572 suffixlen = sizeof (mipssuffix);
16573 suffix = mipssuffix;
16574 other = 0;
16575 }
16576 /* Truncated table??? */
16577 if (plt_offset + entry_size > plt->size)
16578 break;
16579
16580 for (i = 0;
16581 i < count && p[pi].address != gotplt_addr;
16582 i++, pi = (pi + bed->s->int_rels_per_ext_rel) % counti);
16583
16584 if (i < count)
16585 {
16586 size_t namelen;
16587 size_t len;
16588
16589 *s = **p[pi].sym_ptr_ptr;
16590 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
16591 we are defining a symbol, ensure one of them is set. */
16592 if ((s->flags & BSF_LOCAL) == 0)
16593 s->flags |= BSF_GLOBAL;
16594 s->flags |= BSF_SYNTHETIC;
16595 s->section = plt;
16596 s->value = plt_offset;
16597 s->name = names;
16598 s->udata.i = other;
16599
16600 len = strlen ((*p[pi].sym_ptr_ptr)->name);
16601 namelen = len + suffixlen;
16602 if (names + namelen > nend)
16603 break;
16604
16605 memcpy (names, (*p[pi].sym_ptr_ptr)->name, len);
16606 names += len;
16607 memcpy (names, suffix, suffixlen);
16608 names += suffixlen;
16609
16610 ++s, ++n;
16611 pi = (pi + bed->s->int_rels_per_ext_rel) % counti;
16612 }
16613 }
16614
16615 free (plt_data);
16616
16617 return n;
16618}
16619
5e7fc731
MR
16620/* Return the ABI flags associated with ABFD if available. */
16621
16622Elf_Internal_ABIFlags_v0 *
16623bfd_mips_elf_get_abiflags (bfd *abfd)
16624{
16625 struct mips_elf_obj_tdata *tdata = mips_elf_tdata (abfd);
16626
16627 return tdata->abiflags_valid ? &tdata->abiflags : NULL;
16628}
16629
bb29b84d
MR
16630/* MIPS libc ABI versions, used with the EI_ABIVERSION ELF file header
16631 field. Taken from `libc-abis.h' generated at GNU libc build time.
16632 Using a MIPS_ prefix as other libc targets use different values. */
16633enum
16634{
16635 MIPS_LIBC_ABI_DEFAULT = 0,
16636 MIPS_LIBC_ABI_MIPS_PLT,
16637 MIPS_LIBC_ABI_UNIQUE,
16638 MIPS_LIBC_ABI_MIPS_O32_FP64,
47275900 16639 MIPS_LIBC_ABI_ABSOLUTE,
f16a9783 16640 MIPS_LIBC_ABI_XHASH,
bb29b84d
MR
16641 MIPS_LIBC_ABI_MAX
16642};
16643
ed7e9d0b
AM
16644bfd_boolean
16645_bfd_mips_init_file_header (bfd *abfd, struct bfd_link_info *link_info)
861fb55a 16646{
47275900 16647 struct mips_elf_link_hash_table *htab = NULL;
861fb55a
DJ
16648 Elf_Internal_Ehdr *i_ehdrp;
16649
ed7e9d0b
AM
16650 if (!_bfd_elf_init_file_header (abfd, link_info))
16651 return FALSE;
16652
861fb55a
DJ
16653 i_ehdrp = elf_elfheader (abfd);
16654 if (link_info)
16655 {
16656 htab = mips_elf_hash_table (link_info);
4dfe6ac6 16657 BFD_ASSERT (htab != NULL);
861fb55a 16658 }
0af03126 16659
47275900
MR
16660 if (htab != NULL && htab->use_plts_and_copy_relocs && !htab->is_vxworks)
16661 i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_MIPS_PLT;
16662
351cdf24
MF
16663 if (mips_elf_tdata (abfd)->abiflags.fp_abi == Val_GNU_MIPS_ABI_FP_64
16664 || mips_elf_tdata (abfd)->abiflags.fp_abi == Val_GNU_MIPS_ABI_FP_64A)
bb29b84d 16665 i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_MIPS_O32_FP64;
334cd8a7 16666
47275900
MR
16667 /* Mark that we need support for absolute symbols in the dynamic loader. */
16668 if (htab != NULL && htab->use_absolute_zero && htab->gnu_target)
16669 i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_ABSOLUTE;
16670
f16a9783
MS
16671 /* Mark that we need support for .MIPS.xhash in the dynamic linker,
16672 if it is the only hash section that will be created. */
16673 if (link_info && link_info->emit_gnu_hash && !link_info->emit_hash)
16674 i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_XHASH;
ed7e9d0b 16675 return TRUE;
861fb55a 16676}
2f0c68f2
CM
16677
16678int
1ced1a5f
MR
16679_bfd_mips_elf_compact_eh_encoding
16680 (struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
2f0c68f2
CM
16681{
16682 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
16683}
16684
16685/* Return the opcode for can't unwind. */
16686
16687int
1ced1a5f
MR
16688_bfd_mips_elf_cant_unwind_opcode
16689 (struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
2f0c68f2
CM
16690{
16691 return COMPACT_EH_CANT_UNWIND_OPCODE;
16692}
f16a9783
MS
16693
16694/* Record a position XLAT_LOC in the xlat translation table, associated with
16695 the hash entry H. The entry in the translation table will later be
16696 populated with the real symbol dynindx. */
16697
16698void
16699_bfd_mips_elf_record_xhash_symbol (struct elf_link_hash_entry *h,
16700 bfd_vma xlat_loc)
16701{
16702 struct mips_elf_link_hash_entry *hmips;
16703
16704 hmips = (struct mips_elf_link_hash_entry *) h;
16705 hmips->mipsxhash_loc = xlat_loc;
16706}
This page took 2.529333 seconds and 4 git commands to generate.