]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elfxx-mips.c
[PATCH] fix windmc typedef bug
[thirdparty/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:
c9594989
AM
1453 free (ext_hdr);
1454 free (debug->line);
1455 free (debug->external_dnr);
1456 free (debug->external_pdr);
1457 free (debug->external_sym);
1458 free (debug->external_opt);
1459 free (debug->external_aux);
1460 free (debug->ss);
1461 free (debug->ssext);
1462 free (debug->external_fdr);
1463 free (debug->external_rfd);
1464 free (debug->external_ext);
b34976b6 1465 return FALSE;
b49e97c9
TS
1466}
1467\f
1468/* Swap RPDR (runtime procedure table entry) for output. */
1469
1470static void
9719ad41 1471ecoff_swap_rpdr_out (bfd *abfd, const RPDR *in, struct rpdr_ext *ex)
b49e97c9
TS
1472{
1473 H_PUT_S32 (abfd, in->adr, ex->p_adr);
1474 H_PUT_32 (abfd, in->regmask, ex->p_regmask);
1475 H_PUT_32 (abfd, in->regoffset, ex->p_regoffset);
1476 H_PUT_32 (abfd, in->fregmask, ex->p_fregmask);
1477 H_PUT_32 (abfd, in->fregoffset, ex->p_fregoffset);
1478 H_PUT_32 (abfd, in->frameoffset, ex->p_frameoffset);
1479
1480 H_PUT_16 (abfd, in->framereg, ex->p_framereg);
1481 H_PUT_16 (abfd, in->pcreg, ex->p_pcreg);
1482
1483 H_PUT_32 (abfd, in->irpss, ex->p_irpss);
b49e97c9
TS
1484}
1485
1486/* Create a runtime procedure table from the .mdebug section. */
1487
b34976b6 1488static bfd_boolean
9719ad41
RS
1489mips_elf_create_procedure_table (void *handle, bfd *abfd,
1490 struct bfd_link_info *info, asection *s,
1491 struct ecoff_debug_info *debug)
b49e97c9
TS
1492{
1493 const struct ecoff_debug_swap *swap;
1494 HDRR *hdr = &debug->symbolic_header;
1495 RPDR *rpdr, *rp;
1496 struct rpdr_ext *erp;
9719ad41 1497 void *rtproc;
b49e97c9
TS
1498 struct pdr_ext *epdr;
1499 struct sym_ext *esym;
1500 char *ss, **sv;
1501 char *str;
1502 bfd_size_type size;
1503 bfd_size_type count;
1504 unsigned long sindex;
1505 unsigned long i;
1506 PDR pdr;
1507 SYMR sym;
1508 const char *no_name_func = _("static procedure (no name)");
1509
1510 epdr = NULL;
1511 rpdr = NULL;
1512 esym = NULL;
1513 ss = NULL;
1514 sv = NULL;
1515
1516 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1517
1518 sindex = strlen (no_name_func) + 1;
1519 count = hdr->ipdMax;
1520 if (count > 0)
1521 {
1522 size = swap->external_pdr_size;
1523
9719ad41 1524 epdr = bfd_malloc (size * count);
b49e97c9
TS
1525 if (epdr == NULL)
1526 goto error_return;
1527
9719ad41 1528 if (! _bfd_ecoff_get_accumulated_pdr (handle, (bfd_byte *) epdr))
b49e97c9
TS
1529 goto error_return;
1530
1531 size = sizeof (RPDR);
9719ad41 1532 rp = rpdr = bfd_malloc (size * count);
b49e97c9
TS
1533 if (rpdr == NULL)
1534 goto error_return;
1535
1536 size = sizeof (char *);
9719ad41 1537 sv = bfd_malloc (size * count);
b49e97c9
TS
1538 if (sv == NULL)
1539 goto error_return;
1540
1541 count = hdr->isymMax;
1542 size = swap->external_sym_size;
9719ad41 1543 esym = bfd_malloc (size * count);
b49e97c9
TS
1544 if (esym == NULL)
1545 goto error_return;
1546
9719ad41 1547 if (! _bfd_ecoff_get_accumulated_sym (handle, (bfd_byte *) esym))
b49e97c9
TS
1548 goto error_return;
1549
1550 count = hdr->issMax;
9719ad41 1551 ss = bfd_malloc (count);
b49e97c9
TS
1552 if (ss == NULL)
1553 goto error_return;
f075ee0c 1554 if (! _bfd_ecoff_get_accumulated_ss (handle, (bfd_byte *) ss))
b49e97c9
TS
1555 goto error_return;
1556
1557 count = hdr->ipdMax;
1558 for (i = 0; i < (unsigned long) count; i++, rp++)
1559 {
9719ad41
RS
1560 (*swap->swap_pdr_in) (abfd, epdr + i, &pdr);
1561 (*swap->swap_sym_in) (abfd, &esym[pdr.isym], &sym);
b49e97c9
TS
1562 rp->adr = sym.value;
1563 rp->regmask = pdr.regmask;
1564 rp->regoffset = pdr.regoffset;
1565 rp->fregmask = pdr.fregmask;
1566 rp->fregoffset = pdr.fregoffset;
1567 rp->frameoffset = pdr.frameoffset;
1568 rp->framereg = pdr.framereg;
1569 rp->pcreg = pdr.pcreg;
1570 rp->irpss = sindex;
1571 sv[i] = ss + sym.iss;
1572 sindex += strlen (sv[i]) + 1;
1573 }
1574 }
1575
1576 size = sizeof (struct rpdr_ext) * (count + 2) + sindex;
1577 size = BFD_ALIGN (size, 16);
9719ad41 1578 rtproc = bfd_alloc (abfd, size);
b49e97c9
TS
1579 if (rtproc == NULL)
1580 {
1581 mips_elf_hash_table (info)->procedure_count = 0;
1582 goto error_return;
1583 }
1584
1585 mips_elf_hash_table (info)->procedure_count = count + 2;
1586
9719ad41 1587 erp = rtproc;
b49e97c9
TS
1588 memset (erp, 0, sizeof (struct rpdr_ext));
1589 erp++;
1590 str = (char *) rtproc + sizeof (struct rpdr_ext) * (count + 2);
1591 strcpy (str, no_name_func);
1592 str += strlen (no_name_func) + 1;
1593 for (i = 0; i < count; i++)
1594 {
1595 ecoff_swap_rpdr_out (abfd, rpdr + i, erp + i);
1596 strcpy (str, sv[i]);
1597 str += strlen (sv[i]) + 1;
1598 }
1599 H_PUT_S32 (abfd, -1, (erp + count)->p_adr);
1600
1601 /* Set the size and contents of .rtproc section. */
eea6121a 1602 s->size = size;
9719ad41 1603 s->contents = rtproc;
b49e97c9
TS
1604
1605 /* Skip this section later on (I don't think this currently
1606 matters, but someday it might). */
8423293d 1607 s->map_head.link_order = NULL;
b49e97c9 1608
c9594989
AM
1609 free (epdr);
1610 free (rpdr);
1611 free (esym);
1612 free (ss);
1613 free (sv);
b34976b6 1614 return TRUE;
b49e97c9
TS
1615
1616 error_return:
c9594989
AM
1617 free (epdr);
1618 free (rpdr);
1619 free (esym);
1620 free (ss);
1621 free (sv);
b34976b6 1622 return FALSE;
b49e97c9 1623}
738e5348 1624\f
861fb55a
DJ
1625/* We're going to create a stub for H. Create a symbol for the stub's
1626 value and size, to help make the disassembly easier to read. */
1627
1628static bfd_boolean
1629mips_elf_create_stub_symbol (struct bfd_link_info *info,
1630 struct mips_elf_link_hash_entry *h,
1631 const char *prefix, asection *s, bfd_vma value,
1632 bfd_vma size)
1633{
a848a227 1634 bfd_boolean micromips_p = ELF_ST_IS_MICROMIPS (h->root.other);
861fb55a
DJ
1635 struct bfd_link_hash_entry *bh;
1636 struct elf_link_hash_entry *elfh;
e1fa0163
NC
1637 char *name;
1638 bfd_boolean res;
861fb55a 1639
a848a227 1640 if (micromips_p)
df58fc94
RS
1641 value |= 1;
1642
861fb55a 1643 /* Create a new symbol. */
e1fa0163 1644 name = concat (prefix, h->root.root.root.string, NULL);
861fb55a 1645 bh = NULL;
e1fa0163
NC
1646 res = _bfd_generic_link_add_one_symbol (info, s->owner, name,
1647 BSF_LOCAL, s, value, NULL,
1648 TRUE, FALSE, &bh);
1649 free (name);
1650 if (! res)
861fb55a
DJ
1651 return FALSE;
1652
1653 /* Make it a local function. */
1654 elfh = (struct elf_link_hash_entry *) bh;
1655 elfh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
1656 elfh->size = size;
1657 elfh->forced_local = 1;
a848a227
MR
1658 if (micromips_p)
1659 elfh->other = ELF_ST_SET_MICROMIPS (elfh->other);
861fb55a
DJ
1660 return TRUE;
1661}
1662
738e5348
RS
1663/* We're about to redefine H. Create a symbol to represent H's
1664 current value and size, to help make the disassembly easier
1665 to read. */
1666
1667static bfd_boolean
1668mips_elf_create_shadow_symbol (struct bfd_link_info *info,
1669 struct mips_elf_link_hash_entry *h,
1670 const char *prefix)
1671{
1672 struct bfd_link_hash_entry *bh;
1673 struct elf_link_hash_entry *elfh;
e1fa0163 1674 char *name;
738e5348
RS
1675 asection *s;
1676 bfd_vma value;
e1fa0163 1677 bfd_boolean res;
738e5348
RS
1678
1679 /* Read the symbol's value. */
1680 BFD_ASSERT (h->root.root.type == bfd_link_hash_defined
1681 || h->root.root.type == bfd_link_hash_defweak);
1682 s = h->root.root.u.def.section;
1683 value = h->root.root.u.def.value;
1684
1685 /* Create a new symbol. */
e1fa0163 1686 name = concat (prefix, h->root.root.root.string, NULL);
738e5348 1687 bh = NULL;
e1fa0163
NC
1688 res = _bfd_generic_link_add_one_symbol (info, s->owner, name,
1689 BSF_LOCAL, s, value, NULL,
1690 TRUE, FALSE, &bh);
1691 free (name);
1692 if (! res)
738e5348
RS
1693 return FALSE;
1694
1695 /* Make it local and copy the other attributes from H. */
1696 elfh = (struct elf_link_hash_entry *) bh;
1697 elfh->type = ELF_ST_INFO (STB_LOCAL, ELF_ST_TYPE (h->root.type));
1698 elfh->other = h->root.other;
1699 elfh->size = h->root.size;
1700 elfh->forced_local = 1;
1701 return TRUE;
1702}
1703
1704/* Return TRUE if relocations in SECTION can refer directly to a MIPS16
1705 function rather than to a hard-float stub. */
1706
1707static bfd_boolean
1708section_allows_mips16_refs_p (asection *section)
1709{
1710 const char *name;
1711
fd361982 1712 name = bfd_section_name (section);
738e5348
RS
1713 return (FN_STUB_P (name)
1714 || CALL_STUB_P (name)
1715 || CALL_FP_STUB_P (name)
1716 || strcmp (name, ".pdr") == 0);
1717}
1718
1719/* [RELOCS, RELEND) are the relocations against SEC, which is a MIPS16
1720 stub section of some kind. Return the R_SYMNDX of the target
1721 function, or 0 if we can't decide which function that is. */
1722
1723static unsigned long
cb4437b8
MR
1724mips16_stub_symndx (const struct elf_backend_data *bed,
1725 asection *sec ATTRIBUTE_UNUSED,
502e814e 1726 const Elf_Internal_Rela *relocs,
738e5348
RS
1727 const Elf_Internal_Rela *relend)
1728{
cb4437b8 1729 int int_rels_per_ext_rel = bed->s->int_rels_per_ext_rel;
738e5348
RS
1730 const Elf_Internal_Rela *rel;
1731
cb4437b8
MR
1732 /* Trust the first R_MIPS_NONE relocation, if any, but not a subsequent
1733 one in a compound relocation. */
1734 for (rel = relocs; rel < relend; rel += int_rels_per_ext_rel)
738e5348
RS
1735 if (ELF_R_TYPE (sec->owner, rel->r_info) == R_MIPS_NONE)
1736 return ELF_R_SYM (sec->owner, rel->r_info);
1737
1738 /* Otherwise trust the first relocation, whatever its kind. This is
1739 the traditional behavior. */
1740 if (relocs < relend)
1741 return ELF_R_SYM (sec->owner, relocs->r_info);
1742
1743 return 0;
1744}
b49e97c9
TS
1745
1746/* Check the mips16 stubs for a particular symbol, and see if we can
1747 discard them. */
1748
861fb55a
DJ
1749static void
1750mips_elf_check_mips16_stubs (struct bfd_link_info *info,
1751 struct mips_elf_link_hash_entry *h)
b49e97c9 1752{
738e5348
RS
1753 /* Dynamic symbols must use the standard call interface, in case other
1754 objects try to call them. */
1755 if (h->fn_stub != NULL
1756 && h->root.dynindx != -1)
1757 {
1758 mips_elf_create_shadow_symbol (info, h, ".mips16.");
1759 h->need_fn_stub = TRUE;
1760 }
1761
b49e97c9
TS
1762 if (h->fn_stub != NULL
1763 && ! h->need_fn_stub)
1764 {
1765 /* We don't need the fn_stub; the only references to this symbol
07d6d2b8
AM
1766 are 16 bit calls. Clobber the size to 0 to prevent it from
1767 being included in the link. */
eea6121a 1768 h->fn_stub->size = 0;
b49e97c9
TS
1769 h->fn_stub->flags &= ~SEC_RELOC;
1770 h->fn_stub->reloc_count = 0;
1771 h->fn_stub->flags |= SEC_EXCLUDE;
ca9584fb 1772 h->fn_stub->output_section = bfd_abs_section_ptr;
b49e97c9
TS
1773 }
1774
1775 if (h->call_stub != NULL
30c09090 1776 && ELF_ST_IS_MIPS16 (h->root.other))
b49e97c9
TS
1777 {
1778 /* We don't need the call_stub; this is a 16 bit function, so
07d6d2b8
AM
1779 calls from other 16 bit functions are OK. Clobber the size
1780 to 0 to prevent it from being included in the link. */
eea6121a 1781 h->call_stub->size = 0;
b49e97c9
TS
1782 h->call_stub->flags &= ~SEC_RELOC;
1783 h->call_stub->reloc_count = 0;
1784 h->call_stub->flags |= SEC_EXCLUDE;
ca9584fb 1785 h->call_stub->output_section = bfd_abs_section_ptr;
b49e97c9
TS
1786 }
1787
1788 if (h->call_fp_stub != NULL
30c09090 1789 && ELF_ST_IS_MIPS16 (h->root.other))
b49e97c9
TS
1790 {
1791 /* We don't need the call_stub; this is a 16 bit function, so
07d6d2b8
AM
1792 calls from other 16 bit functions are OK. Clobber the size
1793 to 0 to prevent it from being included in the link. */
eea6121a 1794 h->call_fp_stub->size = 0;
b49e97c9
TS
1795 h->call_fp_stub->flags &= ~SEC_RELOC;
1796 h->call_fp_stub->reloc_count = 0;
1797 h->call_fp_stub->flags |= SEC_EXCLUDE;
ca9584fb 1798 h->call_fp_stub->output_section = bfd_abs_section_ptr;
b49e97c9 1799 }
861fb55a
DJ
1800}
1801
1802/* Hashtable callbacks for mips_elf_la25_stubs. */
1803
1804static hashval_t
1805mips_elf_la25_stub_hash (const void *entry_)
1806{
1807 const struct mips_elf_la25_stub *entry;
1808
1809 entry = (struct mips_elf_la25_stub *) entry_;
1810 return entry->h->root.root.u.def.section->id
1811 + entry->h->root.root.u.def.value;
1812}
1813
1814static int
1815mips_elf_la25_stub_eq (const void *entry1_, const void *entry2_)
1816{
1817 const struct mips_elf_la25_stub *entry1, *entry2;
1818
1819 entry1 = (struct mips_elf_la25_stub *) entry1_;
1820 entry2 = (struct mips_elf_la25_stub *) entry2_;
1821 return ((entry1->h->root.root.u.def.section
1822 == entry2->h->root.root.u.def.section)
1823 && (entry1->h->root.root.u.def.value
1824 == entry2->h->root.root.u.def.value));
1825}
1826
1827/* Called by the linker to set up the la25 stub-creation code. FN is
1828 the linker's implementation of add_stub_function. Return true on
1829 success. */
1830
1831bfd_boolean
1832_bfd_mips_elf_init_stubs (struct bfd_link_info *info,
1833 asection *(*fn) (const char *, asection *,
1834 asection *))
1835{
1836 struct mips_elf_link_hash_table *htab;
1837
1838 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
1839 if (htab == NULL)
1840 return FALSE;
1841
861fb55a
DJ
1842 htab->add_stub_section = fn;
1843 htab->la25_stubs = htab_try_create (1, mips_elf_la25_stub_hash,
1844 mips_elf_la25_stub_eq, NULL);
1845 if (htab->la25_stubs == NULL)
1846 return FALSE;
1847
1848 return TRUE;
1849}
1850
1851/* Return true if H is a locally-defined PIC function, in the sense
8f0c309a
CLT
1852 that it or its fn_stub might need $25 to be valid on entry.
1853 Note that MIPS16 functions set up $gp using PC-relative instructions,
1854 so they themselves never need $25 to be valid. Only non-MIPS16
1855 entry points are of interest here. */
861fb55a
DJ
1856
1857static bfd_boolean
1858mips_elf_local_pic_function_p (struct mips_elf_link_hash_entry *h)
1859{
1860 return ((h->root.root.type == bfd_link_hash_defined
1861 || h->root.root.type == bfd_link_hash_defweak)
1862 && h->root.def_regular
1863 && !bfd_is_abs_section (h->root.root.u.def.section)
f02cb058 1864 && !bfd_is_und_section (h->root.root.u.def.section)
8f0c309a
CLT
1865 && (!ELF_ST_IS_MIPS16 (h->root.other)
1866 || (h->fn_stub && h->need_fn_stub))
861fb55a
DJ
1867 && (PIC_OBJECT_P (h->root.root.u.def.section->owner)
1868 || ELF_ST_IS_MIPS_PIC (h->root.other)));
1869}
1870
8f0c309a
CLT
1871/* Set *SEC to the input section that contains the target of STUB.
1872 Return the offset of the target from the start of that section. */
1873
1874static bfd_vma
1875mips_elf_get_la25_target (struct mips_elf_la25_stub *stub,
1876 asection **sec)
1877{
1878 if (ELF_ST_IS_MIPS16 (stub->h->root.other))
1879 {
1880 BFD_ASSERT (stub->h->need_fn_stub);
1881 *sec = stub->h->fn_stub;
1882 return 0;
1883 }
1884 else
1885 {
1886 *sec = stub->h->root.root.u.def.section;
1887 return stub->h->root.root.u.def.value;
1888 }
1889}
1890
861fb55a
DJ
1891/* STUB describes an la25 stub that we have decided to implement
1892 by inserting an LUI/ADDIU pair before the target function.
1893 Create the section and redirect the function symbol to it. */
1894
1895static bfd_boolean
1896mips_elf_add_la25_intro (struct mips_elf_la25_stub *stub,
1897 struct bfd_link_info *info)
1898{
1899 struct mips_elf_link_hash_table *htab;
1900 char *name;
1901 asection *s, *input_section;
1902 unsigned int align;
1903
1904 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
1905 if (htab == NULL)
1906 return FALSE;
861fb55a
DJ
1907
1908 /* Create a unique name for the new section. */
1909 name = bfd_malloc (11 + sizeof (".text.stub."));
1910 if (name == NULL)
1911 return FALSE;
1912 sprintf (name, ".text.stub.%d", (int) htab_elements (htab->la25_stubs));
1913
1914 /* Create the section. */
8f0c309a 1915 mips_elf_get_la25_target (stub, &input_section);
861fb55a
DJ
1916 s = htab->add_stub_section (name, input_section,
1917 input_section->output_section);
1918 if (s == NULL)
1919 return FALSE;
1920
1921 /* Make sure that any padding goes before the stub. */
1922 align = input_section->alignment_power;
fd361982 1923 if (!bfd_set_section_alignment (s, align))
861fb55a
DJ
1924 return FALSE;
1925 if (align > 3)
1926 s->size = (1 << align) - 8;
1927
1928 /* Create a symbol for the stub. */
1929 mips_elf_create_stub_symbol (info, stub->h, ".pic.", s, s->size, 8);
1930 stub->stub_section = s;
1931 stub->offset = s->size;
1932
1933 /* Allocate room for it. */
1934 s->size += 8;
1935 return TRUE;
1936}
1937
1938/* STUB describes an la25 stub that we have decided to implement
1939 with a separate trampoline. Allocate room for it and redirect
1940 the function symbol to it. */
1941
1942static bfd_boolean
1943mips_elf_add_la25_trampoline (struct mips_elf_la25_stub *stub,
1944 struct bfd_link_info *info)
1945{
1946 struct mips_elf_link_hash_table *htab;
1947 asection *s;
1948
1949 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
1950 if (htab == NULL)
1951 return FALSE;
861fb55a
DJ
1952
1953 /* Create a trampoline section, if we haven't already. */
1954 s = htab->strampoline;
1955 if (s == NULL)
1956 {
1957 asection *input_section = stub->h->root.root.u.def.section;
1958 s = htab->add_stub_section (".text", NULL,
1959 input_section->output_section);
fd361982 1960 if (s == NULL || !bfd_set_section_alignment (s, 4))
861fb55a
DJ
1961 return FALSE;
1962 htab->strampoline = s;
1963 }
1964
1965 /* Create a symbol for the stub. */
1966 mips_elf_create_stub_symbol (info, stub->h, ".pic.", s, s->size, 16);
1967 stub->stub_section = s;
1968 stub->offset = s->size;
1969
1970 /* Allocate room for it. */
1971 s->size += 16;
1972 return TRUE;
1973}
1974
1975/* H describes a symbol that needs an la25 stub. Make sure that an
1976 appropriate stub exists and point H at it. */
1977
1978static bfd_boolean
1979mips_elf_add_la25_stub (struct bfd_link_info *info,
1980 struct mips_elf_link_hash_entry *h)
1981{
1982 struct mips_elf_link_hash_table *htab;
1983 struct mips_elf_la25_stub search, *stub;
1984 bfd_boolean use_trampoline_p;
1985 asection *s;
1986 bfd_vma value;
1987 void **slot;
1988
861fb55a
DJ
1989 /* Describe the stub we want. */
1990 search.stub_section = NULL;
1991 search.offset = 0;
1992 search.h = h;
1993
1994 /* See if we've already created an equivalent stub. */
1995 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
1996 if (htab == NULL)
1997 return FALSE;
1998
861fb55a
DJ
1999 slot = htab_find_slot (htab->la25_stubs, &search, INSERT);
2000 if (slot == NULL)
2001 return FALSE;
2002
2003 stub = (struct mips_elf_la25_stub *) *slot;
2004 if (stub != NULL)
2005 {
2006 /* We can reuse the existing stub. */
2007 h->la25_stub = stub;
2008 return TRUE;
2009 }
2010
2011 /* Create a permanent copy of ENTRY and add it to the hash table. */
2012 stub = bfd_malloc (sizeof (search));
2013 if (stub == NULL)
2014 return FALSE;
2015 *stub = search;
2016 *slot = stub;
2017
8f0c309a
CLT
2018 /* Prefer to use LUI/ADDIU stubs if the function is at the beginning
2019 of the section and if we would need no more than 2 nops. */
2020 value = mips_elf_get_la25_target (stub, &s);
fe152e64
MR
2021 if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
2022 value &= ~1;
8f0c309a
CLT
2023 use_trampoline_p = (value != 0 || s->alignment_power > 4);
2024
861fb55a
DJ
2025 h->la25_stub = stub;
2026 return (use_trampoline_p
2027 ? mips_elf_add_la25_trampoline (stub, info)
2028 : mips_elf_add_la25_intro (stub, info));
2029}
2030
2031/* A mips_elf_link_hash_traverse callback that is called before sizing
2032 sections. DATA points to a mips_htab_traverse_info structure. */
2033
2034static bfd_boolean
2035mips_elf_check_symbols (struct mips_elf_link_hash_entry *h, void *data)
2036{
2037 struct mips_htab_traverse_info *hti;
2038
2039 hti = (struct mips_htab_traverse_info *) data;
0e1862bb 2040 if (!bfd_link_relocatable (hti->info))
861fb55a 2041 mips_elf_check_mips16_stubs (hti->info, h);
b49e97c9 2042
861fb55a
DJ
2043 if (mips_elf_local_pic_function_p (h))
2044 {
ba85c43e
NC
2045 /* PR 12845: If H is in a section that has been garbage
2046 collected it will have its output section set to *ABS*. */
2047 if (bfd_is_abs_section (h->root.root.u.def.section->output_section))
2048 return TRUE;
2049
861fb55a
DJ
2050 /* H is a function that might need $25 to be valid on entry.
2051 If we're creating a non-PIC relocatable object, mark H as
2052 being PIC. If we're creating a non-relocatable object with
2053 non-PIC branches and jumps to H, make sure that H has an la25
2054 stub. */
0e1862bb 2055 if (bfd_link_relocatable (hti->info))
861fb55a
DJ
2056 {
2057 if (!PIC_OBJECT_P (hti->output_bfd))
2058 h->root.other = ELF_ST_SET_MIPS_PIC (h->root.other);
2059 }
2060 else if (h->has_nonpic_branches && !mips_elf_add_la25_stub (hti->info, h))
2061 {
2062 hti->error = TRUE;
2063 return FALSE;
2064 }
2065 }
b34976b6 2066 return TRUE;
b49e97c9
TS
2067}
2068\f
d6f16593
MR
2069/* R_MIPS16_26 is used for the mips16 jal and jalx instructions.
2070 Most mips16 instructions are 16 bits, but these instructions
2071 are 32 bits.
2072
2073 The format of these instructions is:
2074
2075 +--------------+--------------------------------+
2076 | JALX | X| Imm 20:16 | Imm 25:21 |
2077 +--------------+--------------------------------+
07d6d2b8 2078 | Immediate 15:0 |
d6f16593
MR
2079 +-----------------------------------------------+
2080
2081 JALX is the 5-bit value 00011. X is 0 for jal, 1 for jalx.
2082 Note that the immediate value in the first word is swapped.
2083
2084 When producing a relocatable object file, R_MIPS16_26 is
2085 handled mostly like R_MIPS_26. In particular, the addend is
2086 stored as a straight 26-bit value in a 32-bit instruction.
2087 (gas makes life simpler for itself by never adjusting a
2088 R_MIPS16_26 reloc to be against a section, so the addend is
2089 always zero). However, the 32 bit instruction is stored as 2
2090 16-bit values, rather than a single 32-bit value. In a
2091 big-endian file, the result is the same; in a little-endian
2092 file, the two 16-bit halves of the 32 bit value are swapped.
2093 This is so that a disassembler can recognize the jal
2094 instruction.
2095
2096 When doing a final link, R_MIPS16_26 is treated as a 32 bit
2097 instruction stored as two 16-bit values. The addend A is the
2098 contents of the targ26 field. The calculation is the same as
2099 R_MIPS_26. When storing the calculated value, reorder the
2100 immediate value as shown above, and don't forget to store the
2101 value as two 16-bit values.
2102
2103 To put it in MIPS ABI terms, the relocation field is T-targ26-16,
2104 defined as
2105
2106 big-endian:
2107 +--------+----------------------+
07d6d2b8
AM
2108 | | |
2109 | | targ26-16 |
2110 |31 26|25 0|
d6f16593
MR
2111 +--------+----------------------+
2112
2113 little-endian:
2114 +----------+------+-------------+
07d6d2b8
AM
2115 | | | |
2116 | sub1 | | sub2 |
2117 |0 9|10 15|16 31|
d6f16593
MR
2118 +----------+--------------------+
2119 where targ26-16 is sub1 followed by sub2 (i.e., the addend field A is
2120 ((sub1 << 16) | sub2)).
2121
2122 When producing a relocatable object file, the calculation is
2123 (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
2124 When producing a fully linked file, the calculation is
2125 let R = (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
2126 ((R & 0x1f0000) << 5) | ((R & 0x3e00000) >> 5) | (R & 0xffff)
2127
738e5348
RS
2128 The table below lists the other MIPS16 instruction relocations.
2129 Each one is calculated in the same way as the non-MIPS16 relocation
2130 given on the right, but using the extended MIPS16 layout of 16-bit
2131 immediate fields:
2132
2133 R_MIPS16_GPREL R_MIPS_GPREL16
2134 R_MIPS16_GOT16 R_MIPS_GOT16
2135 R_MIPS16_CALL16 R_MIPS_CALL16
2136 R_MIPS16_HI16 R_MIPS_HI16
2137 R_MIPS16_LO16 R_MIPS_LO16
2138
2139 A typical instruction will have a format like this:
d6f16593
MR
2140
2141 +--------------+--------------------------------+
2142 | EXTEND | Imm 10:5 | Imm 15:11 |
2143 +--------------+--------------------------------+
2144 | Major | rx | ry | Imm 4:0 |
2145 +--------------+--------------------------------+
2146
2147 EXTEND is the five bit value 11110. Major is the instruction
2148 opcode.
2149
738e5348
RS
2150 All we need to do here is shuffle the bits appropriately.
2151 As above, the two 16-bit halves must be swapped on a
c9775dde
MR
2152 little-endian system.
2153
2154 Finally R_MIPS16_PC16_S1 corresponds to R_MIPS_PC16, however the
2155 relocatable field is shifted by 1 rather than 2 and the same bit
2156 shuffling is done as with the relocations above. */
738e5348
RS
2157
2158static inline bfd_boolean
2159mips16_reloc_p (int r_type)
2160{
2161 switch (r_type)
2162 {
2163 case R_MIPS16_26:
2164 case R_MIPS16_GPREL:
2165 case R_MIPS16_GOT16:
2166 case R_MIPS16_CALL16:
2167 case R_MIPS16_HI16:
2168 case R_MIPS16_LO16:
d0f13682
CLT
2169 case R_MIPS16_TLS_GD:
2170 case R_MIPS16_TLS_LDM:
2171 case R_MIPS16_TLS_DTPREL_HI16:
2172 case R_MIPS16_TLS_DTPREL_LO16:
2173 case R_MIPS16_TLS_GOTTPREL:
2174 case R_MIPS16_TLS_TPREL_HI16:
2175 case R_MIPS16_TLS_TPREL_LO16:
c9775dde 2176 case R_MIPS16_PC16_S1:
738e5348
RS
2177 return TRUE;
2178
2179 default:
2180 return FALSE;
2181 }
2182}
2183
df58fc94
RS
2184/* Check if a microMIPS reloc. */
2185
2186static inline bfd_boolean
2187micromips_reloc_p (unsigned int r_type)
2188{
2189 return r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max;
2190}
2191
2192/* Similar to MIPS16, the two 16-bit halves in microMIPS must be swapped
2193 on a little-endian system. This does not apply to R_MICROMIPS_PC7_S1
2194 and R_MICROMIPS_PC10_S1 relocs that apply to 16-bit instructions. */
2195
2196static inline bfd_boolean
2197micromips_reloc_shuffle_p (unsigned int r_type)
2198{
2199 return (micromips_reloc_p (r_type)
2200 && r_type != R_MICROMIPS_PC7_S1
2201 && r_type != R_MICROMIPS_PC10_S1);
2202}
2203
738e5348
RS
2204static inline bfd_boolean
2205got16_reloc_p (int r_type)
2206{
df58fc94
RS
2207 return (r_type == R_MIPS_GOT16
2208 || r_type == R_MIPS16_GOT16
2209 || r_type == R_MICROMIPS_GOT16);
738e5348
RS
2210}
2211
2212static inline bfd_boolean
2213call16_reloc_p (int r_type)
2214{
df58fc94
RS
2215 return (r_type == R_MIPS_CALL16
2216 || r_type == R_MIPS16_CALL16
2217 || r_type == R_MICROMIPS_CALL16);
2218}
2219
2220static inline bfd_boolean
2221got_disp_reloc_p (unsigned int r_type)
2222{
2223 return r_type == R_MIPS_GOT_DISP || r_type == R_MICROMIPS_GOT_DISP;
2224}
2225
2226static inline bfd_boolean
2227got_page_reloc_p (unsigned int r_type)
2228{
2229 return r_type == R_MIPS_GOT_PAGE || r_type == R_MICROMIPS_GOT_PAGE;
2230}
2231
df58fc94
RS
2232static inline bfd_boolean
2233got_lo16_reloc_p (unsigned int r_type)
2234{
2235 return r_type == R_MIPS_GOT_LO16 || r_type == R_MICROMIPS_GOT_LO16;
2236}
2237
2238static inline bfd_boolean
2239call_hi16_reloc_p (unsigned int r_type)
2240{
2241 return r_type == R_MIPS_CALL_HI16 || r_type == R_MICROMIPS_CALL_HI16;
2242}
2243
2244static inline bfd_boolean
2245call_lo16_reloc_p (unsigned int r_type)
2246{
2247 return r_type == R_MIPS_CALL_LO16 || r_type == R_MICROMIPS_CALL_LO16;
738e5348
RS
2248}
2249
2250static inline bfd_boolean
2251hi16_reloc_p (int r_type)
2252{
df58fc94
RS
2253 return (r_type == R_MIPS_HI16
2254 || r_type == R_MIPS16_HI16
7361da2c
AB
2255 || r_type == R_MICROMIPS_HI16
2256 || r_type == R_MIPS_PCHI16);
738e5348 2257}
d6f16593 2258
738e5348
RS
2259static inline bfd_boolean
2260lo16_reloc_p (int r_type)
2261{
df58fc94
RS
2262 return (r_type == R_MIPS_LO16
2263 || r_type == R_MIPS16_LO16
7361da2c
AB
2264 || r_type == R_MICROMIPS_LO16
2265 || r_type == R_MIPS_PCLO16);
738e5348
RS
2266}
2267
2268static inline bfd_boolean
2269mips16_call_reloc_p (int r_type)
2270{
2271 return r_type == R_MIPS16_26 || r_type == R_MIPS16_CALL16;
2272}
d6f16593 2273
38a7df63
CF
2274static inline bfd_boolean
2275jal_reloc_p (int r_type)
2276{
df58fc94
RS
2277 return (r_type == R_MIPS_26
2278 || r_type == R_MIPS16_26
2279 || r_type == R_MICROMIPS_26_S1);
2280}
2281
99aefae6
MR
2282static inline bfd_boolean
2283b_reloc_p (int r_type)
2284{
2285 return (r_type == R_MIPS_PC26_S2
2286 || r_type == R_MIPS_PC21_S2
2287 || r_type == R_MIPS_PC16
c9775dde 2288 || r_type == R_MIPS_GNU_REL16_S2
9d862524
MR
2289 || r_type == R_MIPS16_PC16_S1
2290 || r_type == R_MICROMIPS_PC16_S1
2291 || r_type == R_MICROMIPS_PC10_S1
2292 || r_type == R_MICROMIPS_PC7_S1);
99aefae6
MR
2293}
2294
7361da2c
AB
2295static inline bfd_boolean
2296aligned_pcrel_reloc_p (int r_type)
2297{
2298 return (r_type == R_MIPS_PC18_S3
2299 || r_type == R_MIPS_PC19_S2);
2300}
2301
9d862524
MR
2302static inline bfd_boolean
2303branch_reloc_p (int r_type)
2304{
2305 return (r_type == R_MIPS_26
2306 || r_type == R_MIPS_PC26_S2
2307 || r_type == R_MIPS_PC21_S2
2308 || r_type == R_MIPS_PC16
2309 || r_type == R_MIPS_GNU_REL16_S2);
2310}
2311
c9775dde
MR
2312static inline bfd_boolean
2313mips16_branch_reloc_p (int r_type)
2314{
2315 return (r_type == R_MIPS16_26
2316 || r_type == R_MIPS16_PC16_S1);
2317}
2318
df58fc94
RS
2319static inline bfd_boolean
2320micromips_branch_reloc_p (int r_type)
2321{
2322 return (r_type == R_MICROMIPS_26_S1
2323 || r_type == R_MICROMIPS_PC16_S1
2324 || r_type == R_MICROMIPS_PC10_S1
2325 || r_type == R_MICROMIPS_PC7_S1);
2326}
2327
2328static inline bfd_boolean
2329tls_gd_reloc_p (unsigned int r_type)
2330{
d0f13682
CLT
2331 return (r_type == R_MIPS_TLS_GD
2332 || r_type == R_MIPS16_TLS_GD
2333 || r_type == R_MICROMIPS_TLS_GD);
df58fc94
RS
2334}
2335
2336static inline bfd_boolean
2337tls_ldm_reloc_p (unsigned int r_type)
2338{
d0f13682
CLT
2339 return (r_type == R_MIPS_TLS_LDM
2340 || r_type == R_MIPS16_TLS_LDM
2341 || r_type == R_MICROMIPS_TLS_LDM);
df58fc94
RS
2342}
2343
2344static inline bfd_boolean
2345tls_gottprel_reloc_p (unsigned int r_type)
2346{
d0f13682
CLT
2347 return (r_type == R_MIPS_TLS_GOTTPREL
2348 || r_type == R_MIPS16_TLS_GOTTPREL
2349 || r_type == R_MICROMIPS_TLS_GOTTPREL);
38a7df63
CF
2350}
2351
d6f16593 2352void
df58fc94
RS
2353_bfd_mips_elf_reloc_unshuffle (bfd *abfd, int r_type,
2354 bfd_boolean jal_shuffle, bfd_byte *data)
d6f16593 2355{
df58fc94 2356 bfd_vma first, second, val;
d6f16593 2357
df58fc94 2358 if (!mips16_reloc_p (r_type) && !micromips_reloc_shuffle_p (r_type))
d6f16593
MR
2359 return;
2360
df58fc94
RS
2361 /* Pick up the first and second halfwords of the instruction. */
2362 first = bfd_get_16 (abfd, data);
2363 second = bfd_get_16 (abfd, data + 2);
2364 if (micromips_reloc_p (r_type) || (r_type == R_MIPS16_26 && !jal_shuffle))
2365 val = first << 16 | second;
2366 else if (r_type != R_MIPS16_26)
2367 val = (((first & 0xf800) << 16) | ((second & 0xffe0) << 11)
2368 | ((first & 0x1f) << 11) | (first & 0x7e0) | (second & 0x1f));
d6f16593 2369 else
df58fc94
RS
2370 val = (((first & 0xfc00) << 16) | ((first & 0x3e0) << 11)
2371 | ((first & 0x1f) << 21) | second);
d6f16593
MR
2372 bfd_put_32 (abfd, val, data);
2373}
2374
2375void
df58fc94
RS
2376_bfd_mips_elf_reloc_shuffle (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
2384 val = bfd_get_32 (abfd, data);
df58fc94 2385 if (micromips_reloc_p (r_type) || (r_type == R_MIPS16_26 && !jal_shuffle))
d6f16593 2386 {
df58fc94
RS
2387 second = val & 0xffff;
2388 first = val >> 16;
2389 }
2390 else if (r_type != R_MIPS16_26)
2391 {
2392 second = ((val >> 11) & 0xffe0) | (val & 0x1f);
2393 first = ((val >> 16) & 0xf800) | ((val >> 11) & 0x1f) | (val & 0x7e0);
d6f16593
MR
2394 }
2395 else
2396 {
df58fc94
RS
2397 second = val & 0xffff;
2398 first = ((val >> 16) & 0xfc00) | ((val >> 11) & 0x3e0)
2399 | ((val >> 21) & 0x1f);
d6f16593 2400 }
df58fc94
RS
2401 bfd_put_16 (abfd, second, data + 2);
2402 bfd_put_16 (abfd, first, data);
d6f16593
MR
2403}
2404
b49e97c9 2405bfd_reloc_status_type
9719ad41
RS
2406_bfd_mips_elf_gprel16_with_gp (bfd *abfd, asymbol *symbol,
2407 arelent *reloc_entry, asection *input_section,
2408 bfd_boolean relocatable, void *data, bfd_vma gp)
b49e97c9
TS
2409{
2410 bfd_vma relocation;
a7ebbfdf 2411 bfd_signed_vma val;
30ac9238 2412 bfd_reloc_status_type status;
b49e97c9
TS
2413
2414 if (bfd_is_com_section (symbol->section))
2415 relocation = 0;
2416 else
2417 relocation = symbol->value;
2418
2419 relocation += symbol->section->output_section->vma;
2420 relocation += symbol->section->output_offset;
2421
07515404 2422 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
b49e97c9
TS
2423 return bfd_reloc_outofrange;
2424
b49e97c9 2425 /* Set val to the offset into the section or symbol. */
a7ebbfdf
TS
2426 val = reloc_entry->addend;
2427
30ac9238 2428 _bfd_mips_elf_sign_extend (val, 16);
a7ebbfdf 2429
b49e97c9 2430 /* Adjust val for the final section location and GP value. If we
1049f94e 2431 are producing relocatable output, we don't want to do this for
b49e97c9 2432 an external symbol. */
1049f94e 2433 if (! relocatable
b49e97c9
TS
2434 || (symbol->flags & BSF_SECTION_SYM) != 0)
2435 val += relocation - gp;
2436
a7ebbfdf
TS
2437 if (reloc_entry->howto->partial_inplace)
2438 {
30ac9238
RS
2439 status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
2440 (bfd_byte *) data
2441 + reloc_entry->address);
2442 if (status != bfd_reloc_ok)
2443 return status;
a7ebbfdf
TS
2444 }
2445 else
2446 reloc_entry->addend = val;
b49e97c9 2447
1049f94e 2448 if (relocatable)
b49e97c9 2449 reloc_entry->address += input_section->output_offset;
30ac9238
RS
2450
2451 return bfd_reloc_ok;
2452}
2453
2454/* Used to store a REL high-part relocation such as R_MIPS_HI16 or
2455 R_MIPS_GOT16. REL is the relocation, INPUT_SECTION is the section
2456 that contains the relocation field and DATA points to the start of
2457 INPUT_SECTION. */
2458
2459struct mips_hi16
2460{
2461 struct mips_hi16 *next;
2462 bfd_byte *data;
2463 asection *input_section;
2464 arelent rel;
2465};
2466
2467/* FIXME: This should not be a static variable. */
2468
2469static struct mips_hi16 *mips_hi16_list;
2470
2471/* A howto special_function for REL *HI16 relocations. We can only
2472 calculate the correct value once we've seen the partnering
2473 *LO16 relocation, so just save the information for later.
2474
2475 The ABI requires that the *LO16 immediately follow the *HI16.
2476 However, as a GNU extension, we permit an arbitrary number of
2477 *HI16s to be associated with a single *LO16. This significantly
2478 simplies the relocation handling in gcc. */
2479
2480bfd_reloc_status_type
2481_bfd_mips_elf_hi16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2482 asymbol *symbol ATTRIBUTE_UNUSED, void *data,
2483 asection *input_section, bfd *output_bfd,
2484 char **error_message ATTRIBUTE_UNUSED)
2485{
2486 struct mips_hi16 *n;
2487
07515404 2488 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
30ac9238
RS
2489 return bfd_reloc_outofrange;
2490
2491 n = bfd_malloc (sizeof *n);
2492 if (n == NULL)
2493 return bfd_reloc_outofrange;
2494
2495 n->next = mips_hi16_list;
2496 n->data = data;
2497 n->input_section = input_section;
2498 n->rel = *reloc_entry;
2499 mips_hi16_list = n;
2500
2501 if (output_bfd != NULL)
2502 reloc_entry->address += input_section->output_offset;
2503
2504 return bfd_reloc_ok;
2505}
2506
738e5348 2507/* A howto special_function for REL R_MIPS*_GOT16 relocations. This is just
30ac9238
RS
2508 like any other 16-bit relocation when applied to global symbols, but is
2509 treated in the same as R_MIPS_HI16 when applied to local symbols. */
2510
2511bfd_reloc_status_type
2512_bfd_mips_elf_got16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2513 void *data, asection *input_section,
2514 bfd *output_bfd, char **error_message)
2515{
2516 if ((symbol->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
e6f7f6d1
AM
2517 || bfd_is_und_section (bfd_asymbol_section (symbol))
2518 || bfd_is_com_section (bfd_asymbol_section (symbol)))
30ac9238
RS
2519 /* The relocation is against a global symbol. */
2520 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2521 input_section, output_bfd,
2522 error_message);
2523
2524 return _bfd_mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
2525 input_section, output_bfd, error_message);
2526}
2527
2528/* A howto special_function for REL *LO16 relocations. The *LO16 itself
2529 is a straightforward 16 bit inplace relocation, but we must deal with
2530 any partnering high-part relocations as well. */
2531
2532bfd_reloc_status_type
2533_bfd_mips_elf_lo16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2534 void *data, asection *input_section,
2535 bfd *output_bfd, char **error_message)
2536{
2537 bfd_vma vallo;
d6f16593 2538 bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
30ac9238 2539
07515404 2540 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
30ac9238
RS
2541 return bfd_reloc_outofrange;
2542
df58fc94 2543 _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
d6f16593 2544 location);
df58fc94
RS
2545 vallo = bfd_get_32 (abfd, location);
2546 _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, FALSE,
2547 location);
d6f16593 2548
30ac9238
RS
2549 while (mips_hi16_list != NULL)
2550 {
2551 bfd_reloc_status_type ret;
2552 struct mips_hi16 *hi;
2553
2554 hi = mips_hi16_list;
2555
738e5348
RS
2556 /* R_MIPS*_GOT16 relocations are something of a special case. We
2557 want to install the addend in the same way as for a R_MIPS*_HI16
30ac9238
RS
2558 relocation (with a rightshift of 16). However, since GOT16
2559 relocations can also be used with global symbols, their howto
2560 has a rightshift of 0. */
2561 if (hi->rel.howto->type == R_MIPS_GOT16)
2562 hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MIPS_HI16, FALSE);
738e5348
RS
2563 else if (hi->rel.howto->type == R_MIPS16_GOT16)
2564 hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MIPS16_HI16, FALSE);
df58fc94
RS
2565 else if (hi->rel.howto->type == R_MICROMIPS_GOT16)
2566 hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MICROMIPS_HI16, FALSE);
30ac9238
RS
2567
2568 /* VALLO is a signed 16-bit number. Bias it by 0x8000 so that any
2569 carry or borrow will induce a change of +1 or -1 in the high part. */
2570 hi->rel.addend += (vallo + 0x8000) & 0xffff;
2571
30ac9238
RS
2572 ret = _bfd_mips_elf_generic_reloc (abfd, &hi->rel, symbol, hi->data,
2573 hi->input_section, output_bfd,
2574 error_message);
2575 if (ret != bfd_reloc_ok)
2576 return ret;
2577
2578 mips_hi16_list = hi->next;
2579 free (hi);
2580 }
2581
2582 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2583 input_section, output_bfd,
2584 error_message);
2585}
2586
2587/* A generic howto special_function. This calculates and installs the
2588 relocation itself, thus avoiding the oft-discussed problems in
2589 bfd_perform_relocation and bfd_install_relocation. */
2590
2591bfd_reloc_status_type
2592_bfd_mips_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2593 asymbol *symbol, void *data ATTRIBUTE_UNUSED,
2594 asection *input_section, bfd *output_bfd,
2595 char **error_message ATTRIBUTE_UNUSED)
2596{
2597 bfd_signed_vma val;
2598 bfd_reloc_status_type status;
2599 bfd_boolean relocatable;
2600
2601 relocatable = (output_bfd != NULL);
2602
07515404 2603 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
30ac9238
RS
2604 return bfd_reloc_outofrange;
2605
2606 /* Build up the field adjustment in VAL. */
2607 val = 0;
2608 if (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0)
2609 {
2610 /* Either we're calculating the final field value or we have a
2611 relocation against a section symbol. Add in the section's
2612 offset or address. */
2613 val += symbol->section->output_section->vma;
2614 val += symbol->section->output_offset;
2615 }
2616
2617 if (!relocatable)
2618 {
2619 /* We're calculating the final field value. Add in the symbol's value
2620 and, if pc-relative, subtract the address of the field itself. */
2621 val += symbol->value;
2622 if (reloc_entry->howto->pc_relative)
2623 {
2624 val -= input_section->output_section->vma;
2625 val -= input_section->output_offset;
2626 val -= reloc_entry->address;
2627 }
2628 }
2629
2630 /* VAL is now the final adjustment. If we're keeping this relocation
2631 in the output file, and if the relocation uses a separate addend,
2632 we just need to add VAL to that addend. Otherwise we need to add
2633 VAL to the relocation field itself. */
2634 if (relocatable && !reloc_entry->howto->partial_inplace)
2635 reloc_entry->addend += val;
2636 else
2637 {
d6f16593
MR
2638 bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
2639
30ac9238
RS
2640 /* Add in the separate addend, if any. */
2641 val += reloc_entry->addend;
2642
2643 /* Add VAL to the relocation field. */
df58fc94
RS
2644 _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
2645 location);
30ac9238 2646 status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
d6f16593 2647 location);
df58fc94
RS
2648 _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, FALSE,
2649 location);
d6f16593 2650
30ac9238
RS
2651 if (status != bfd_reloc_ok)
2652 return status;
2653 }
2654
2655 if (relocatable)
2656 reloc_entry->address += input_section->output_offset;
b49e97c9
TS
2657
2658 return bfd_reloc_ok;
2659}
2660\f
2661/* Swap an entry in a .gptab section. Note that these routines rely
2662 on the equivalence of the two elements of the union. */
2663
2664static void
9719ad41
RS
2665bfd_mips_elf32_swap_gptab_in (bfd *abfd, const Elf32_External_gptab *ex,
2666 Elf32_gptab *in)
b49e97c9
TS
2667{
2668 in->gt_entry.gt_g_value = H_GET_32 (abfd, ex->gt_entry.gt_g_value);
2669 in->gt_entry.gt_bytes = H_GET_32 (abfd, ex->gt_entry.gt_bytes);
2670}
2671
2672static void
9719ad41
RS
2673bfd_mips_elf32_swap_gptab_out (bfd *abfd, const Elf32_gptab *in,
2674 Elf32_External_gptab *ex)
b49e97c9
TS
2675{
2676 H_PUT_32 (abfd, in->gt_entry.gt_g_value, ex->gt_entry.gt_g_value);
2677 H_PUT_32 (abfd, in->gt_entry.gt_bytes, ex->gt_entry.gt_bytes);
2678}
2679
2680static void
9719ad41
RS
2681bfd_elf32_swap_compact_rel_out (bfd *abfd, const Elf32_compact_rel *in,
2682 Elf32_External_compact_rel *ex)
b49e97c9
TS
2683{
2684 H_PUT_32 (abfd, in->id1, ex->id1);
2685 H_PUT_32 (abfd, in->num, ex->num);
2686 H_PUT_32 (abfd, in->id2, ex->id2);
2687 H_PUT_32 (abfd, in->offset, ex->offset);
2688 H_PUT_32 (abfd, in->reserved0, ex->reserved0);
2689 H_PUT_32 (abfd, in->reserved1, ex->reserved1);
2690}
2691
2692static void
9719ad41
RS
2693bfd_elf32_swap_crinfo_out (bfd *abfd, const Elf32_crinfo *in,
2694 Elf32_External_crinfo *ex)
b49e97c9
TS
2695{
2696 unsigned long l;
2697
2698 l = (((in->ctype & CRINFO_CTYPE) << CRINFO_CTYPE_SH)
2699 | ((in->rtype & CRINFO_RTYPE) << CRINFO_RTYPE_SH)
2700 | ((in->dist2to & CRINFO_DIST2TO) << CRINFO_DIST2TO_SH)
2701 | ((in->relvaddr & CRINFO_RELVADDR) << CRINFO_RELVADDR_SH));
2702 H_PUT_32 (abfd, l, ex->info);
2703 H_PUT_32 (abfd, in->konst, ex->konst);
2704 H_PUT_32 (abfd, in->vaddr, ex->vaddr);
2705}
b49e97c9
TS
2706\f
2707/* A .reginfo section holds a single Elf32_RegInfo structure. These
2708 routines swap this structure in and out. They are used outside of
2709 BFD, so they are globally visible. */
2710
2711void
9719ad41
RS
2712bfd_mips_elf32_swap_reginfo_in (bfd *abfd, const Elf32_External_RegInfo *ex,
2713 Elf32_RegInfo *in)
b49e97c9
TS
2714{
2715 in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
2716 in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
2717 in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
2718 in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
2719 in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
2720 in->ri_gp_value = H_GET_32 (abfd, ex->ri_gp_value);
2721}
2722
2723void
9719ad41
RS
2724bfd_mips_elf32_swap_reginfo_out (bfd *abfd, const Elf32_RegInfo *in,
2725 Elf32_External_RegInfo *ex)
b49e97c9
TS
2726{
2727 H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
2728 H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
2729 H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
2730 H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
2731 H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
2732 H_PUT_32 (abfd, in->ri_gp_value, ex->ri_gp_value);
2733}
2734
2735/* In the 64 bit ABI, the .MIPS.options section holds register
2736 information in an Elf64_Reginfo structure. These routines swap
2737 them in and out. They are globally visible because they are used
2738 outside of BFD. These routines are here so that gas can call them
2739 without worrying about whether the 64 bit ABI has been included. */
2740
2741void
9719ad41
RS
2742bfd_mips_elf64_swap_reginfo_in (bfd *abfd, const Elf64_External_RegInfo *ex,
2743 Elf64_Internal_RegInfo *in)
b49e97c9
TS
2744{
2745 in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
2746 in->ri_pad = H_GET_32 (abfd, ex->ri_pad);
2747 in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
2748 in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
2749 in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
2750 in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
2751 in->ri_gp_value = H_GET_64 (abfd, ex->ri_gp_value);
2752}
2753
2754void
9719ad41
RS
2755bfd_mips_elf64_swap_reginfo_out (bfd *abfd, const Elf64_Internal_RegInfo *in,
2756 Elf64_External_RegInfo *ex)
b49e97c9
TS
2757{
2758 H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
2759 H_PUT_32 (abfd, in->ri_pad, ex->ri_pad);
2760 H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
2761 H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
2762 H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
2763 H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
2764 H_PUT_64 (abfd, in->ri_gp_value, ex->ri_gp_value);
2765}
2766
2767/* Swap in an options header. */
2768
2769void
9719ad41
RS
2770bfd_mips_elf_swap_options_in (bfd *abfd, const Elf_External_Options *ex,
2771 Elf_Internal_Options *in)
b49e97c9
TS
2772{
2773 in->kind = H_GET_8 (abfd, ex->kind);
2774 in->size = H_GET_8 (abfd, ex->size);
2775 in->section = H_GET_16 (abfd, ex->section);
2776 in->info = H_GET_32 (abfd, ex->info);
2777}
2778
2779/* Swap out an options header. */
2780
2781void
9719ad41
RS
2782bfd_mips_elf_swap_options_out (bfd *abfd, const Elf_Internal_Options *in,
2783 Elf_External_Options *ex)
b49e97c9
TS
2784{
2785 H_PUT_8 (abfd, in->kind, ex->kind);
2786 H_PUT_8 (abfd, in->size, ex->size);
2787 H_PUT_16 (abfd, in->section, ex->section);
2788 H_PUT_32 (abfd, in->info, ex->info);
2789}
351cdf24
MF
2790
2791/* Swap in an abiflags structure. */
2792
2793void
2794bfd_mips_elf_swap_abiflags_v0_in (bfd *abfd,
2795 const Elf_External_ABIFlags_v0 *ex,
2796 Elf_Internal_ABIFlags_v0 *in)
2797{
2798 in->version = H_GET_16 (abfd, ex->version);
2799 in->isa_level = H_GET_8 (abfd, ex->isa_level);
2800 in->isa_rev = H_GET_8 (abfd, ex->isa_rev);
2801 in->gpr_size = H_GET_8 (abfd, ex->gpr_size);
2802 in->cpr1_size = H_GET_8 (abfd, ex->cpr1_size);
2803 in->cpr2_size = H_GET_8 (abfd, ex->cpr2_size);
2804 in->fp_abi = H_GET_8 (abfd, ex->fp_abi);
2805 in->isa_ext = H_GET_32 (abfd, ex->isa_ext);
2806 in->ases = H_GET_32 (abfd, ex->ases);
2807 in->flags1 = H_GET_32 (abfd, ex->flags1);
2808 in->flags2 = H_GET_32 (abfd, ex->flags2);
2809}
2810
2811/* Swap out an abiflags structure. */
2812
2813void
2814bfd_mips_elf_swap_abiflags_v0_out (bfd *abfd,
2815 const Elf_Internal_ABIFlags_v0 *in,
2816 Elf_External_ABIFlags_v0 *ex)
2817{
2818 H_PUT_16 (abfd, in->version, ex->version);
2819 H_PUT_8 (abfd, in->isa_level, ex->isa_level);
2820 H_PUT_8 (abfd, in->isa_rev, ex->isa_rev);
2821 H_PUT_8 (abfd, in->gpr_size, ex->gpr_size);
2822 H_PUT_8 (abfd, in->cpr1_size, ex->cpr1_size);
2823 H_PUT_8 (abfd, in->cpr2_size, ex->cpr2_size);
2824 H_PUT_8 (abfd, in->fp_abi, ex->fp_abi);
2825 H_PUT_32 (abfd, in->isa_ext, ex->isa_ext);
2826 H_PUT_32 (abfd, in->ases, ex->ases);
2827 H_PUT_32 (abfd, in->flags1, ex->flags1);
2828 H_PUT_32 (abfd, in->flags2, ex->flags2);
2829}
b49e97c9
TS
2830\f
2831/* This function is called via qsort() to sort the dynamic relocation
2832 entries by increasing r_symndx value. */
2833
2834static int
9719ad41 2835sort_dynamic_relocs (const void *arg1, const void *arg2)
b49e97c9 2836{
947216bf
AM
2837 Elf_Internal_Rela int_reloc1;
2838 Elf_Internal_Rela int_reloc2;
6870500c 2839 int diff;
b49e97c9 2840
947216bf
AM
2841 bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg1, &int_reloc1);
2842 bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg2, &int_reloc2);
b49e97c9 2843
6870500c
RS
2844 diff = ELF32_R_SYM (int_reloc1.r_info) - ELF32_R_SYM (int_reloc2.r_info);
2845 if (diff != 0)
2846 return diff;
2847
2848 if (int_reloc1.r_offset < int_reloc2.r_offset)
2849 return -1;
2850 if (int_reloc1.r_offset > int_reloc2.r_offset)
2851 return 1;
2852 return 0;
b49e97c9
TS
2853}
2854
f4416af6
AO
2855/* Like sort_dynamic_relocs, but used for elf64 relocations. */
2856
2857static int
7e3102a7
AM
2858sort_dynamic_relocs_64 (const void *arg1 ATTRIBUTE_UNUSED,
2859 const void *arg2 ATTRIBUTE_UNUSED)
f4416af6 2860{
7e3102a7 2861#ifdef BFD64
f4416af6
AO
2862 Elf_Internal_Rela int_reloc1[3];
2863 Elf_Internal_Rela int_reloc2[3];
2864
2865 (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
2866 (reldyn_sorting_bfd, arg1, int_reloc1);
2867 (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
2868 (reldyn_sorting_bfd, arg2, int_reloc2);
2869
6870500c
RS
2870 if (ELF64_R_SYM (int_reloc1[0].r_info) < ELF64_R_SYM (int_reloc2[0].r_info))
2871 return -1;
2872 if (ELF64_R_SYM (int_reloc1[0].r_info) > ELF64_R_SYM (int_reloc2[0].r_info))
2873 return 1;
2874
2875 if (int_reloc1[0].r_offset < int_reloc2[0].r_offset)
2876 return -1;
2877 if (int_reloc1[0].r_offset > int_reloc2[0].r_offset)
2878 return 1;
2879 return 0;
7e3102a7
AM
2880#else
2881 abort ();
2882#endif
f4416af6
AO
2883}
2884
2885
b49e97c9
TS
2886/* This routine is used to write out ECOFF debugging external symbol
2887 information. It is called via mips_elf_link_hash_traverse. The
2888 ECOFF external symbol information must match the ELF external
2889 symbol information. Unfortunately, at this point we don't know
2890 whether a symbol is required by reloc information, so the two
2891 tables may wind up being different. We must sort out the external
2892 symbol information before we can set the final size of the .mdebug
2893 section, and we must set the size of the .mdebug section before we
2894 can relocate any sections, and we can't know which symbols are
2895 required by relocation until we relocate the sections.
2896 Fortunately, it is relatively unlikely that any symbol will be
2897 stripped but required by a reloc. In particular, it can not happen
2898 when generating a final executable. */
2899
b34976b6 2900static bfd_boolean
9719ad41 2901mips_elf_output_extsym (struct mips_elf_link_hash_entry *h, void *data)
b49e97c9 2902{
9719ad41 2903 struct extsym_info *einfo = data;
b34976b6 2904 bfd_boolean strip;
b49e97c9
TS
2905 asection *sec, *output_section;
2906
b49e97c9 2907 if (h->root.indx == -2)
b34976b6 2908 strip = FALSE;
f5385ebf 2909 else if ((h->root.def_dynamic
77cfaee6
AM
2910 || h->root.ref_dynamic
2911 || h->root.type == bfd_link_hash_new)
f5385ebf
AM
2912 && !h->root.def_regular
2913 && !h->root.ref_regular)
b34976b6 2914 strip = TRUE;
b49e97c9
TS
2915 else if (einfo->info->strip == strip_all
2916 || (einfo->info->strip == strip_some
2917 && bfd_hash_lookup (einfo->info->keep_hash,
2918 h->root.root.root.string,
b34976b6
AM
2919 FALSE, FALSE) == NULL))
2920 strip = TRUE;
b49e97c9 2921 else
b34976b6 2922 strip = FALSE;
b49e97c9
TS
2923
2924 if (strip)
b34976b6 2925 return TRUE;
b49e97c9
TS
2926
2927 if (h->esym.ifd == -2)
2928 {
2929 h->esym.jmptbl = 0;
2930 h->esym.cobol_main = 0;
2931 h->esym.weakext = 0;
2932 h->esym.reserved = 0;
2933 h->esym.ifd = ifdNil;
2934 h->esym.asym.value = 0;
2935 h->esym.asym.st = stGlobal;
2936
2937 if (h->root.root.type == bfd_link_hash_undefined
2938 || h->root.root.type == bfd_link_hash_undefweak)
2939 {
2940 const char *name;
2941
2942 /* Use undefined class. Also, set class and type for some
07d6d2b8 2943 special symbols. */
b49e97c9
TS
2944 name = h->root.root.root.string;
2945 if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
2946 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
2947 {
2948 h->esym.asym.sc = scData;
2949 h->esym.asym.st = stLabel;
2950 h->esym.asym.value = 0;
2951 }
2952 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
2953 {
2954 h->esym.asym.sc = scAbs;
2955 h->esym.asym.st = stLabel;
2956 h->esym.asym.value =
2957 mips_elf_hash_table (einfo->info)->procedure_count;
2958 }
b49e97c9
TS
2959 else
2960 h->esym.asym.sc = scUndefined;
2961 }
2962 else if (h->root.root.type != bfd_link_hash_defined
2963 && h->root.root.type != bfd_link_hash_defweak)
2964 h->esym.asym.sc = scAbs;
2965 else
2966 {
2967 const char *name;
2968
2969 sec = h->root.root.u.def.section;
2970 output_section = sec->output_section;
2971
2972 /* When making a shared library and symbol h is the one from
2973 the another shared library, OUTPUT_SECTION may be null. */
2974 if (output_section == NULL)
2975 h->esym.asym.sc = scUndefined;
2976 else
2977 {
fd361982 2978 name = bfd_section_name (output_section);
b49e97c9
TS
2979
2980 if (strcmp (name, ".text") == 0)
2981 h->esym.asym.sc = scText;
2982 else if (strcmp (name, ".data") == 0)
2983 h->esym.asym.sc = scData;
2984 else if (strcmp (name, ".sdata") == 0)
2985 h->esym.asym.sc = scSData;
2986 else if (strcmp (name, ".rodata") == 0
2987 || strcmp (name, ".rdata") == 0)
2988 h->esym.asym.sc = scRData;
2989 else if (strcmp (name, ".bss") == 0)
2990 h->esym.asym.sc = scBss;
2991 else if (strcmp (name, ".sbss") == 0)
2992 h->esym.asym.sc = scSBss;
2993 else if (strcmp (name, ".init") == 0)
2994 h->esym.asym.sc = scInit;
2995 else if (strcmp (name, ".fini") == 0)
2996 h->esym.asym.sc = scFini;
2997 else
2998 h->esym.asym.sc = scAbs;
2999 }
3000 }
3001
3002 h->esym.asym.reserved = 0;
3003 h->esym.asym.index = indexNil;
3004 }
3005
3006 if (h->root.root.type == bfd_link_hash_common)
3007 h->esym.asym.value = h->root.root.u.c.size;
3008 else if (h->root.root.type == bfd_link_hash_defined
3009 || h->root.root.type == bfd_link_hash_defweak)
3010 {
3011 if (h->esym.asym.sc == scCommon)
3012 h->esym.asym.sc = scBss;
3013 else if (h->esym.asym.sc == scSCommon)
3014 h->esym.asym.sc = scSBss;
3015
3016 sec = h->root.root.u.def.section;
3017 output_section = sec->output_section;
3018 if (output_section != NULL)
3019 h->esym.asym.value = (h->root.root.u.def.value
3020 + sec->output_offset
3021 + output_section->vma);
3022 else
3023 h->esym.asym.value = 0;
3024 }
33bb52fb 3025 else
b49e97c9
TS
3026 {
3027 struct mips_elf_link_hash_entry *hd = h;
b49e97c9
TS
3028
3029 while (hd->root.root.type == bfd_link_hash_indirect)
33bb52fb 3030 hd = (struct mips_elf_link_hash_entry *)h->root.root.u.i.link;
b49e97c9 3031
33bb52fb 3032 if (hd->needs_lazy_stub)
b49e97c9 3033 {
1bbce132
MR
3034 BFD_ASSERT (hd->root.plt.plist != NULL);
3035 BFD_ASSERT (hd->root.plt.plist->stub_offset != MINUS_ONE);
b49e97c9
TS
3036 /* Set type and value for a symbol with a function stub. */
3037 h->esym.asym.st = stProc;
3038 sec = hd->root.root.u.def.section;
3039 if (sec == NULL)
3040 h->esym.asym.value = 0;
3041 else
3042 {
3043 output_section = sec->output_section;
3044 if (output_section != NULL)
1bbce132 3045 h->esym.asym.value = (hd->root.plt.plist->stub_offset
b49e97c9
TS
3046 + sec->output_offset
3047 + output_section->vma);
3048 else
3049 h->esym.asym.value = 0;
3050 }
b49e97c9
TS
3051 }
3052 }
3053
3054 if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
3055 h->root.root.root.string,
3056 &h->esym))
3057 {
b34976b6
AM
3058 einfo->failed = TRUE;
3059 return FALSE;
b49e97c9
TS
3060 }
3061
b34976b6 3062 return TRUE;
b49e97c9
TS
3063}
3064
3065/* A comparison routine used to sort .gptab entries. */
3066
3067static int
9719ad41 3068gptab_compare (const void *p1, const void *p2)
b49e97c9 3069{
9719ad41
RS
3070 const Elf32_gptab *a1 = p1;
3071 const Elf32_gptab *a2 = p2;
b49e97c9
TS
3072
3073 return a1->gt_entry.gt_g_value - a2->gt_entry.gt_g_value;
3074}
3075\f
b15e6682 3076/* Functions to manage the got entry hash table. */
f4416af6
AO
3077
3078/* Use all 64 bits of a bfd_vma for the computation of a 32-bit
3079 hash number. */
3080
3081static INLINE hashval_t
9719ad41 3082mips_elf_hash_bfd_vma (bfd_vma addr)
f4416af6
AO
3083{
3084#ifdef BFD64
3085 return addr + (addr >> 32);
3086#else
3087 return addr;
3088#endif
3089}
3090
f4416af6 3091static hashval_t
d9bf376d 3092mips_elf_got_entry_hash (const void *entry_)
f4416af6
AO
3093{
3094 const struct mips_got_entry *entry = (struct mips_got_entry *)entry_;
3095
e641e783 3096 return (entry->symndx
9ab066b4
RS
3097 + ((entry->tls_type == GOT_TLS_LDM) << 18)
3098 + (entry->tls_type == GOT_TLS_LDM ? 0
e641e783
RS
3099 : !entry->abfd ? mips_elf_hash_bfd_vma (entry->d.address)
3100 : entry->symndx >= 0 ? (entry->abfd->id
3101 + mips_elf_hash_bfd_vma (entry->d.addend))
3102 : entry->d.h->root.root.root.hash));
f4416af6
AO
3103}
3104
3105static int
3dff0dd1 3106mips_elf_got_entry_eq (const void *entry1, const void *entry2)
f4416af6
AO
3107{
3108 const struct mips_got_entry *e1 = (struct mips_got_entry *)entry1;
3109 const struct mips_got_entry *e2 = (struct mips_got_entry *)entry2;
3110
e641e783 3111 return (e1->symndx == e2->symndx
9ab066b4
RS
3112 && e1->tls_type == e2->tls_type
3113 && (e1->tls_type == GOT_TLS_LDM ? TRUE
e641e783
RS
3114 : !e1->abfd ? !e2->abfd && e1->d.address == e2->d.address
3115 : e1->symndx >= 0 ? (e1->abfd == e2->abfd
3116 && e1->d.addend == e2->d.addend)
3117 : e2->abfd && e1->d.h == e2->d.h));
b15e6682 3118}
c224138d 3119
13db6b44
RS
3120static hashval_t
3121mips_got_page_ref_hash (const void *ref_)
3122{
3123 const struct mips_got_page_ref *ref;
3124
3125 ref = (const struct mips_got_page_ref *) ref_;
3126 return ((ref->symndx >= 0
3127 ? (hashval_t) (ref->u.abfd->id + ref->symndx)
3128 : ref->u.h->root.root.root.hash)
3129 + mips_elf_hash_bfd_vma (ref->addend));
3130}
3131
3132static int
3133mips_got_page_ref_eq (const void *ref1_, const void *ref2_)
3134{
3135 const struct mips_got_page_ref *ref1, *ref2;
3136
3137 ref1 = (const struct mips_got_page_ref *) ref1_;
3138 ref2 = (const struct mips_got_page_ref *) ref2_;
3139 return (ref1->symndx == ref2->symndx
3140 && (ref1->symndx < 0
3141 ? ref1->u.h == ref2->u.h
3142 : ref1->u.abfd == ref2->u.abfd)
3143 && ref1->addend == ref2->addend);
3144}
3145
c224138d
RS
3146static hashval_t
3147mips_got_page_entry_hash (const void *entry_)
3148{
3149 const struct mips_got_page_entry *entry;
3150
3151 entry = (const struct mips_got_page_entry *) entry_;
13db6b44 3152 return entry->sec->id;
c224138d
RS
3153}
3154
3155static int
3156mips_got_page_entry_eq (const void *entry1_, const void *entry2_)
3157{
3158 const struct mips_got_page_entry *entry1, *entry2;
3159
3160 entry1 = (const struct mips_got_page_entry *) entry1_;
3161 entry2 = (const struct mips_got_page_entry *) entry2_;
13db6b44 3162 return entry1->sec == entry2->sec;
c224138d 3163}
b15e6682 3164\f
3dff0dd1 3165/* Create and return a new mips_got_info structure. */
5334aa52
RS
3166
3167static struct mips_got_info *
3dff0dd1 3168mips_elf_create_got_info (bfd *abfd)
5334aa52
RS
3169{
3170 struct mips_got_info *g;
3171
3172 g = bfd_zalloc (abfd, sizeof (struct mips_got_info));
3173 if (g == NULL)
3174 return NULL;
3175
3dff0dd1
RS
3176 g->got_entries = htab_try_create (1, mips_elf_got_entry_hash,
3177 mips_elf_got_entry_eq, NULL);
5334aa52
RS
3178 if (g->got_entries == NULL)
3179 return NULL;
3180
13db6b44
RS
3181 g->got_page_refs = htab_try_create (1, mips_got_page_ref_hash,
3182 mips_got_page_ref_eq, NULL);
3183 if (g->got_page_refs == NULL)
5334aa52
RS
3184 return NULL;
3185
3186 return g;
3187}
3188
ee227692
RS
3189/* Return the GOT info for input bfd ABFD, trying to create a new one if
3190 CREATE_P and if ABFD doesn't already have a GOT. */
3191
3192static struct mips_got_info *
3193mips_elf_bfd_got (bfd *abfd, bfd_boolean create_p)
3194{
3195 struct mips_elf_obj_tdata *tdata;
3196
3197 if (!is_mips_elf (abfd))
3198 return NULL;
3199
3200 tdata = mips_elf_tdata (abfd);
3201 if (!tdata->got && create_p)
3dff0dd1 3202 tdata->got = mips_elf_create_got_info (abfd);
ee227692
RS
3203 return tdata->got;
3204}
3205
d7206569
RS
3206/* Record that ABFD should use output GOT G. */
3207
3208static void
3209mips_elf_replace_bfd_got (bfd *abfd, struct mips_got_info *g)
3210{
3211 struct mips_elf_obj_tdata *tdata;
3212
3213 BFD_ASSERT (is_mips_elf (abfd));
3214 tdata = mips_elf_tdata (abfd);
3215 if (tdata->got)
3216 {
3217 /* The GOT structure itself and the hash table entries are
3218 allocated to a bfd, but the hash tables aren't. */
3219 htab_delete (tdata->got->got_entries);
13db6b44
RS
3220 htab_delete (tdata->got->got_page_refs);
3221 if (tdata->got->got_page_entries)
3222 htab_delete (tdata->got->got_page_entries);
d7206569
RS
3223 }
3224 tdata->got = g;
3225}
3226
0a44bf69
RS
3227/* Return the dynamic relocation section. If it doesn't exist, try to
3228 create a new it if CREATE_P, otherwise return NULL. Also return NULL
3229 if creation fails. */
f4416af6
AO
3230
3231static asection *
0a44bf69 3232mips_elf_rel_dyn_section (struct bfd_link_info *info, bfd_boolean create_p)
f4416af6 3233{
0a44bf69 3234 const char *dname;
f4416af6 3235 asection *sreloc;
0a44bf69 3236 bfd *dynobj;
f4416af6 3237
0a44bf69
RS
3238 dname = MIPS_ELF_REL_DYN_NAME (info);
3239 dynobj = elf_hash_table (info)->dynobj;
3d4d4302 3240 sreloc = bfd_get_linker_section (dynobj, dname);
f4416af6
AO
3241 if (sreloc == NULL && create_p)
3242 {
3d4d4302
AM
3243 sreloc = bfd_make_section_anyway_with_flags (dynobj, dname,
3244 (SEC_ALLOC
3245 | SEC_LOAD
3246 | SEC_HAS_CONTENTS
3247 | SEC_IN_MEMORY
3248 | SEC_LINKER_CREATED
3249 | SEC_READONLY));
f4416af6 3250 if (sreloc == NULL
fd361982
AM
3251 || !bfd_set_section_alignment (sreloc,
3252 MIPS_ELF_LOG_FILE_ALIGN (dynobj)))
f4416af6
AO
3253 return NULL;
3254 }
3255 return sreloc;
3256}
3257
e641e783
RS
3258/* Return the GOT_TLS_* type required by relocation type R_TYPE. */
3259
3260static int
3261mips_elf_reloc_tls_type (unsigned int r_type)
3262{
3263 if (tls_gd_reloc_p (r_type))
3264 return GOT_TLS_GD;
3265
3266 if (tls_ldm_reloc_p (r_type))
3267 return GOT_TLS_LDM;
3268
3269 if (tls_gottprel_reloc_p (r_type))
3270 return GOT_TLS_IE;
3271
9ab066b4 3272 return GOT_TLS_NONE;
e641e783
RS
3273}
3274
3275/* Return the number of GOT slots needed for GOT TLS type TYPE. */
3276
3277static int
3278mips_tls_got_entries (unsigned int type)
3279{
3280 switch (type)
3281 {
3282 case GOT_TLS_GD:
3283 case GOT_TLS_LDM:
3284 return 2;
3285
3286 case GOT_TLS_IE:
3287 return 1;
3288
9ab066b4 3289 case GOT_TLS_NONE:
e641e783
RS
3290 return 0;
3291 }
3292 abort ();
3293}
3294
0f20cc35
DJ
3295/* Count the number of relocations needed for a TLS GOT entry, with
3296 access types from TLS_TYPE, and symbol H (or a local symbol if H
3297 is NULL). */
3298
3299static int
3300mips_tls_got_relocs (struct bfd_link_info *info, unsigned char tls_type,
3301 struct elf_link_hash_entry *h)
3302{
3303 int indx = 0;
0f20cc35
DJ
3304 bfd_boolean need_relocs = FALSE;
3305 bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
3306
1cb83cac
MR
3307 if (h != NULL
3308 && h->dynindx != -1
3309 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
3310 && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, h)))
0f20cc35
DJ
3311 indx = h->dynindx;
3312
9143e72c 3313 if ((bfd_link_dll (info) || indx != 0)
0f20cc35
DJ
3314 && (h == NULL
3315 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3316 || h->root.type != bfd_link_hash_undefweak))
3317 need_relocs = TRUE;
3318
3319 if (!need_relocs)
e641e783 3320 return 0;
0f20cc35 3321
9ab066b4 3322 switch (tls_type)
0f20cc35 3323 {
e641e783
RS
3324 case GOT_TLS_GD:
3325 return indx != 0 ? 2 : 1;
0f20cc35 3326
e641e783
RS
3327 case GOT_TLS_IE:
3328 return 1;
0f20cc35 3329
e641e783 3330 case GOT_TLS_LDM:
9143e72c 3331 return bfd_link_dll (info) ? 1 : 0;
0f20cc35 3332
e641e783
RS
3333 default:
3334 return 0;
3335 }
0f20cc35
DJ
3336}
3337
ab361d49
RS
3338/* Add the number of GOT entries and TLS relocations required by ENTRY
3339 to G. */
0f20cc35 3340
ab361d49
RS
3341static void
3342mips_elf_count_got_entry (struct bfd_link_info *info,
3343 struct mips_got_info *g,
3344 struct mips_got_entry *entry)
0f20cc35 3345{
9ab066b4 3346 if (entry->tls_type)
ab361d49 3347 {
9ab066b4
RS
3348 g->tls_gotno += mips_tls_got_entries (entry->tls_type);
3349 g->relocs += mips_tls_got_relocs (info, entry->tls_type,
ab361d49
RS
3350 entry->symndx < 0
3351 ? &entry->d.h->root : NULL);
3352 }
3353 else if (entry->symndx >= 0 || entry->d.h->global_got_area == GGA_NONE)
3354 g->local_gotno += 1;
3355 else
3356 g->global_gotno += 1;
0f20cc35
DJ
3357}
3358
0f20cc35
DJ
3359/* Output a simple dynamic relocation into SRELOC. */
3360
3361static void
3362mips_elf_output_dynamic_relocation (bfd *output_bfd,
3363 asection *sreloc,
861fb55a 3364 unsigned long reloc_index,
0f20cc35
DJ
3365 unsigned long indx,
3366 int r_type,
3367 bfd_vma offset)
3368{
3369 Elf_Internal_Rela rel[3];
3370
3371 memset (rel, 0, sizeof (rel));
3372
3373 rel[0].r_info = ELF_R_INFO (output_bfd, indx, r_type);
3374 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
3375
3376 if (ABI_64_P (output_bfd))
3377 {
3378 (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
3379 (output_bfd, &rel[0],
3380 (sreloc->contents
861fb55a 3381 + reloc_index * sizeof (Elf64_Mips_External_Rel)));
0f20cc35
DJ
3382 }
3383 else
3384 bfd_elf32_swap_reloc_out
3385 (output_bfd, &rel[0],
3386 (sreloc->contents
861fb55a 3387 + reloc_index * sizeof (Elf32_External_Rel)));
0f20cc35
DJ
3388}
3389
3390/* Initialize a set of TLS GOT entries for one symbol. */
3391
3392static void
9ab066b4
RS
3393mips_elf_initialize_tls_slots (bfd *abfd, struct bfd_link_info *info,
3394 struct mips_got_entry *entry,
0f20cc35
DJ
3395 struct mips_elf_link_hash_entry *h,
3396 bfd_vma value)
3397{
1cb83cac 3398 bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
23cc69b6 3399 struct mips_elf_link_hash_table *htab;
0f20cc35
DJ
3400 int indx;
3401 asection *sreloc, *sgot;
9ab066b4 3402 bfd_vma got_offset, got_offset2;
0f20cc35
DJ
3403 bfd_boolean need_relocs = FALSE;
3404
23cc69b6 3405 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3406 if (htab == NULL)
3407 return;
3408
ce558b89 3409 sgot = htab->root.sgot;
0f20cc35
DJ
3410
3411 indx = 0;
1cb83cac
MR
3412 if (h != NULL
3413 && h->root.dynindx != -1
3414 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), &h->root)
3415 && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL (info, &h->root)))
3416 indx = h->root.dynindx;
0f20cc35 3417
9ab066b4 3418 if (entry->tls_initialized)
0f20cc35
DJ
3419 return;
3420
9143e72c 3421 if ((bfd_link_dll (info) || indx != 0)
0f20cc35
DJ
3422 && (h == NULL
3423 || ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT
3424 || h->root.type != bfd_link_hash_undefweak))
3425 need_relocs = TRUE;
3426
3427 /* MINUS_ONE means the symbol is not defined in this object. It may not
3428 be defined at all; assume that the value doesn't matter in that
3429 case. Otherwise complain if we would use the value. */
3430 BFD_ASSERT (value != MINUS_ONE || (indx != 0 && need_relocs)
3431 || h->root.root.type == bfd_link_hash_undefweak);
3432
3433 /* Emit necessary relocations. */
0a44bf69 3434 sreloc = mips_elf_rel_dyn_section (info, FALSE);
9ab066b4 3435 got_offset = entry->gotidx;
0f20cc35 3436
9ab066b4 3437 switch (entry->tls_type)
0f20cc35 3438 {
e641e783
RS
3439 case GOT_TLS_GD:
3440 /* General Dynamic. */
3441 got_offset2 = got_offset + MIPS_ELF_GOT_SIZE (abfd);
0f20cc35
DJ
3442
3443 if (need_relocs)
3444 {
3445 mips_elf_output_dynamic_relocation
861fb55a 3446 (abfd, sreloc, sreloc->reloc_count++, indx,
0f20cc35 3447 ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
e641e783 3448 sgot->output_offset + sgot->output_section->vma + got_offset);
0f20cc35
DJ
3449
3450 if (indx)
3451 mips_elf_output_dynamic_relocation
861fb55a 3452 (abfd, sreloc, sreloc->reloc_count++, indx,
0f20cc35 3453 ABI_64_P (abfd) ? R_MIPS_TLS_DTPREL64 : R_MIPS_TLS_DTPREL32,
e641e783 3454 sgot->output_offset + sgot->output_section->vma + got_offset2);
0f20cc35
DJ
3455 else
3456 MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
e641e783 3457 sgot->contents + got_offset2);
0f20cc35
DJ
3458 }
3459 else
3460 {
3461 MIPS_ELF_PUT_WORD (abfd, 1,
e641e783 3462 sgot->contents + got_offset);
0f20cc35 3463 MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
e641e783 3464 sgot->contents + got_offset2);
0f20cc35 3465 }
e641e783 3466 break;
0f20cc35 3467
e641e783
RS
3468 case GOT_TLS_IE:
3469 /* Initial Exec model. */
0f20cc35
DJ
3470 if (need_relocs)
3471 {
3472 if (indx == 0)
3473 MIPS_ELF_PUT_WORD (abfd, value - elf_hash_table (info)->tls_sec->vma,
e641e783 3474 sgot->contents + got_offset);
0f20cc35
DJ
3475 else
3476 MIPS_ELF_PUT_WORD (abfd, 0,
e641e783 3477 sgot->contents + got_offset);
0f20cc35
DJ
3478
3479 mips_elf_output_dynamic_relocation
861fb55a 3480 (abfd, sreloc, sreloc->reloc_count++, indx,
0f20cc35 3481 ABI_64_P (abfd) ? R_MIPS_TLS_TPREL64 : R_MIPS_TLS_TPREL32,
e641e783 3482 sgot->output_offset + sgot->output_section->vma + got_offset);
0f20cc35
DJ
3483 }
3484 else
3485 MIPS_ELF_PUT_WORD (abfd, value - tprel_base (info),
e641e783
RS
3486 sgot->contents + got_offset);
3487 break;
0f20cc35 3488
e641e783 3489 case GOT_TLS_LDM:
0f20cc35
DJ
3490 /* The initial offset is zero, and the LD offsets will include the
3491 bias by DTP_OFFSET. */
3492 MIPS_ELF_PUT_WORD (abfd, 0,
3493 sgot->contents + got_offset
3494 + MIPS_ELF_GOT_SIZE (abfd));
3495
9143e72c 3496 if (!bfd_link_dll (info))
0f20cc35
DJ
3497 MIPS_ELF_PUT_WORD (abfd, 1,
3498 sgot->contents + got_offset);
3499 else
3500 mips_elf_output_dynamic_relocation
861fb55a 3501 (abfd, sreloc, sreloc->reloc_count++, indx,
0f20cc35
DJ
3502 ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
3503 sgot->output_offset + sgot->output_section->vma + got_offset);
e641e783
RS
3504 break;
3505
3506 default:
3507 abort ();
0f20cc35
DJ
3508 }
3509
9ab066b4 3510 entry->tls_initialized = TRUE;
e641e783 3511}
0f20cc35 3512
0a44bf69
RS
3513/* Return the offset from _GLOBAL_OFFSET_TABLE_ of the .got.plt entry
3514 for global symbol H. .got.plt comes before the GOT, so the offset
3515 will be negative. */
3516
3517static bfd_vma
3518mips_elf_gotplt_index (struct bfd_link_info *info,
3519 struct elf_link_hash_entry *h)
3520{
1bbce132 3521 bfd_vma got_address, got_value;
0a44bf69
RS
3522 struct mips_elf_link_hash_table *htab;
3523
3524 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3525 BFD_ASSERT (htab != NULL);
3526
1bbce132
MR
3527 BFD_ASSERT (h->plt.plist != NULL);
3528 BFD_ASSERT (h->plt.plist->gotplt_index != MINUS_ONE);
0a44bf69
RS
3529
3530 /* Calculate the address of the associated .got.plt entry. */
ce558b89
AM
3531 got_address = (htab->root.sgotplt->output_section->vma
3532 + htab->root.sgotplt->output_offset
1bbce132
MR
3533 + (h->plt.plist->gotplt_index
3534 * MIPS_ELF_GOT_SIZE (info->output_bfd)));
0a44bf69
RS
3535
3536 /* Calculate the value of _GLOBAL_OFFSET_TABLE_. */
3537 got_value = (htab->root.hgot->root.u.def.section->output_section->vma
3538 + htab->root.hgot->root.u.def.section->output_offset
3539 + htab->root.hgot->root.u.def.value);
3540
3541 return got_address - got_value;
3542}
3543
5c18022e 3544/* Return the GOT offset for address VALUE. If there is not yet a GOT
0a44bf69
RS
3545 entry for this value, create one. If R_SYMNDX refers to a TLS symbol,
3546 create a TLS GOT entry instead. Return -1 if no satisfactory GOT
3547 offset can be found. */
b49e97c9
TS
3548
3549static bfd_vma
9719ad41 3550mips_elf_local_got_index (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
5c18022e 3551 bfd_vma value, unsigned long r_symndx,
0f20cc35 3552 struct mips_elf_link_hash_entry *h, int r_type)
b49e97c9 3553{
a8028dd0 3554 struct mips_elf_link_hash_table *htab;
b15e6682 3555 struct mips_got_entry *entry;
b49e97c9 3556
a8028dd0 3557 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3558 BFD_ASSERT (htab != NULL);
3559
a8028dd0
RS
3560 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, value,
3561 r_symndx, h, r_type);
0f20cc35 3562 if (!entry)
b15e6682 3563 return MINUS_ONE;
0f20cc35 3564
e641e783 3565 if (entry->tls_type)
9ab066b4
RS
3566 mips_elf_initialize_tls_slots (abfd, info, entry, h, value);
3567 return entry->gotidx;
b49e97c9
TS
3568}
3569
13fbec83 3570/* Return the GOT index of global symbol H in the primary GOT. */
b49e97c9
TS
3571
3572static bfd_vma
13fbec83
RS
3573mips_elf_primary_global_got_index (bfd *obfd, struct bfd_link_info *info,
3574 struct elf_link_hash_entry *h)
3575{
3576 struct mips_elf_link_hash_table *htab;
3577 long global_got_dynindx;
3578 struct mips_got_info *g;
3579 bfd_vma got_index;
3580
3581 htab = mips_elf_hash_table (info);
3582 BFD_ASSERT (htab != NULL);
3583
3584 global_got_dynindx = 0;
3585 if (htab->global_gotsym != NULL)
3586 global_got_dynindx = htab->global_gotsym->dynindx;
3587
3588 /* Once we determine the global GOT entry with the lowest dynamic
3589 symbol table index, we must put all dynamic symbols with greater
3590 indices into the primary GOT. That makes it easy to calculate the
3591 GOT offset. */
3592 BFD_ASSERT (h->dynindx >= global_got_dynindx);
3593 g = mips_elf_bfd_got (obfd, FALSE);
3594 got_index = ((h->dynindx - global_got_dynindx + g->local_gotno)
3595 * MIPS_ELF_GOT_SIZE (obfd));
ce558b89 3596 BFD_ASSERT (got_index < htab->root.sgot->size);
13fbec83
RS
3597
3598 return got_index;
3599}
3600
3601/* Return the GOT index for the global symbol indicated by H, which is
3602 referenced by a relocation of type R_TYPE in IBFD. */
3603
3604static bfd_vma
3605mips_elf_global_got_index (bfd *obfd, struct bfd_link_info *info, bfd *ibfd,
3606 struct elf_link_hash_entry *h, int r_type)
b49e97c9 3607{
a8028dd0 3608 struct mips_elf_link_hash_table *htab;
6c42ddb9
RS
3609 struct mips_got_info *g;
3610 struct mips_got_entry lookup, *entry;
3611 bfd_vma gotidx;
b49e97c9 3612
a8028dd0 3613 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3614 BFD_ASSERT (htab != NULL);
3615
6c42ddb9
RS
3616 g = mips_elf_bfd_got (ibfd, FALSE);
3617 BFD_ASSERT (g);
f4416af6 3618
6c42ddb9
RS
3619 lookup.tls_type = mips_elf_reloc_tls_type (r_type);
3620 if (!lookup.tls_type && g == mips_elf_bfd_got (obfd, FALSE))
3621 return mips_elf_primary_global_got_index (obfd, info, h);
f4416af6 3622
6c42ddb9
RS
3623 lookup.abfd = ibfd;
3624 lookup.symndx = -1;
3625 lookup.d.h = (struct mips_elf_link_hash_entry *) h;
3626 entry = htab_find (g->got_entries, &lookup);
3627 BFD_ASSERT (entry);
0f20cc35 3628
6c42ddb9 3629 gotidx = entry->gotidx;
ce558b89 3630 BFD_ASSERT (gotidx > 0 && gotidx < htab->root.sgot->size);
f4416af6 3631
6c42ddb9 3632 if (lookup.tls_type)
0f20cc35 3633 {
0f20cc35
DJ
3634 bfd_vma value = MINUS_ONE;
3635
3636 if ((h->root.type == bfd_link_hash_defined
3637 || h->root.type == bfd_link_hash_defweak)
3638 && h->root.u.def.section->output_section)
3639 value = (h->root.u.def.value
3640 + h->root.u.def.section->output_offset
3641 + h->root.u.def.section->output_section->vma);
3642
9ab066b4 3643 mips_elf_initialize_tls_slots (obfd, info, entry, lookup.d.h, value);
0f20cc35 3644 }
6c42ddb9 3645 return gotidx;
b49e97c9
TS
3646}
3647
5c18022e
RS
3648/* Find a GOT page entry that points to within 32KB of VALUE. These
3649 entries are supposed to be placed at small offsets in the GOT, i.e.,
3650 within 32KB of GP. Return the index of the GOT entry, or -1 if no
3651 entry could be created. If OFFSETP is nonnull, use it to return the
0a44bf69 3652 offset of the GOT entry from VALUE. */
b49e97c9
TS
3653
3654static bfd_vma
9719ad41 3655mips_elf_got_page (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
5c18022e 3656 bfd_vma value, bfd_vma *offsetp)
b49e97c9 3657{
91d6fa6a 3658 bfd_vma page, got_index;
b15e6682 3659 struct mips_got_entry *entry;
b49e97c9 3660
0a44bf69 3661 page = (value + 0x8000) & ~(bfd_vma) 0xffff;
a8028dd0
RS
3662 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, page, 0,
3663 NULL, R_MIPS_GOT_PAGE);
b49e97c9 3664
b15e6682
AO
3665 if (!entry)
3666 return MINUS_ONE;
143d77c5 3667
91d6fa6a 3668 got_index = entry->gotidx;
b49e97c9
TS
3669
3670 if (offsetp)
f4416af6 3671 *offsetp = value - entry->d.address;
b49e97c9 3672
91d6fa6a 3673 return got_index;
b49e97c9
TS
3674}
3675
738e5348 3676/* Find a local GOT entry for an R_MIPS*_GOT16 relocation against VALUE.
020d7251
RS
3677 EXTERNAL is true if the relocation was originally against a global
3678 symbol that binds locally. */
b49e97c9
TS
3679
3680static bfd_vma
9719ad41 3681mips_elf_got16_entry (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
5c18022e 3682 bfd_vma value, bfd_boolean external)
b49e97c9 3683{
b15e6682 3684 struct mips_got_entry *entry;
b49e97c9 3685
0a44bf69
RS
3686 /* GOT16 relocations against local symbols are followed by a LO16
3687 relocation; those against global symbols are not. Thus if the
3688 symbol was originally local, the GOT16 relocation should load the
3689 equivalent of %hi(VALUE), otherwise it should load VALUE itself. */
b49e97c9 3690 if (! external)
0a44bf69 3691 value = mips_elf_high (value) << 16;
b49e97c9 3692
738e5348
RS
3693 /* It doesn't matter whether the original relocation was R_MIPS_GOT16,
3694 R_MIPS16_GOT16, R_MIPS_CALL16, etc. The format of the entry is the
3695 same in all cases. */
a8028dd0
RS
3696 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, value, 0,
3697 NULL, R_MIPS_GOT16);
b15e6682
AO
3698 if (entry)
3699 return entry->gotidx;
3700 else
3701 return MINUS_ONE;
b49e97c9
TS
3702}
3703
3704/* Returns the offset for the entry at the INDEXth position
3705 in the GOT. */
3706
3707static bfd_vma
a8028dd0 3708mips_elf_got_offset_from_index (struct bfd_link_info *info, bfd *output_bfd,
91d6fa6a 3709 bfd *input_bfd, bfd_vma got_index)
b49e97c9 3710{
a8028dd0 3711 struct mips_elf_link_hash_table *htab;
b49e97c9
TS
3712 asection *sgot;
3713 bfd_vma gp;
3714
a8028dd0 3715 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3716 BFD_ASSERT (htab != NULL);
3717
ce558b89 3718 sgot = htab->root.sgot;
f4416af6 3719 gp = _bfd_get_gp_value (output_bfd)
a8028dd0 3720 + mips_elf_adjust_gp (output_bfd, htab->got_info, input_bfd);
143d77c5 3721
91d6fa6a 3722 return sgot->output_section->vma + sgot->output_offset + got_index - gp;
b49e97c9
TS
3723}
3724
0a44bf69
RS
3725/* Create and return a local GOT entry for VALUE, which was calculated
3726 from a symbol belonging to INPUT_SECTON. Return NULL if it could not
3727 be created. If R_SYMNDX refers to a TLS symbol, create a TLS entry
3728 instead. */
b49e97c9 3729
b15e6682 3730static struct mips_got_entry *
0a44bf69 3731mips_elf_create_local_got_entry (bfd *abfd, struct bfd_link_info *info,
a8028dd0 3732 bfd *ibfd, bfd_vma value,
5c18022e 3733 unsigned long r_symndx,
0f20cc35
DJ
3734 struct mips_elf_link_hash_entry *h,
3735 int r_type)
b49e97c9 3736{
ebc53538
RS
3737 struct mips_got_entry lookup, *entry;
3738 void **loc;
f4416af6 3739 struct mips_got_info *g;
0a44bf69 3740 struct mips_elf_link_hash_table *htab;
6c42ddb9 3741 bfd_vma gotidx;
0a44bf69
RS
3742
3743 htab = mips_elf_hash_table (info);
4dfe6ac6 3744 BFD_ASSERT (htab != NULL);
b15e6682 3745
d7206569 3746 g = mips_elf_bfd_got (ibfd, FALSE);
f4416af6
AO
3747 if (g == NULL)
3748 {
d7206569 3749 g = mips_elf_bfd_got (abfd, FALSE);
f4416af6
AO
3750 BFD_ASSERT (g != NULL);
3751 }
b15e6682 3752
020d7251
RS
3753 /* This function shouldn't be called for symbols that live in the global
3754 area of the GOT. */
3755 BFD_ASSERT (h == NULL || h->global_got_area == GGA_NONE);
0f20cc35 3756
ebc53538
RS
3757 lookup.tls_type = mips_elf_reloc_tls_type (r_type);
3758 if (lookup.tls_type)
3759 {
3760 lookup.abfd = ibfd;
df58fc94 3761 if (tls_ldm_reloc_p (r_type))
0f20cc35 3762 {
ebc53538
RS
3763 lookup.symndx = 0;
3764 lookup.d.addend = 0;
0f20cc35
DJ
3765 }
3766 else if (h == NULL)
3767 {
ebc53538
RS
3768 lookup.symndx = r_symndx;
3769 lookup.d.addend = 0;
0f20cc35
DJ
3770 }
3771 else
ebc53538
RS
3772 {
3773 lookup.symndx = -1;
3774 lookup.d.h = h;
3775 }
0f20cc35 3776
ebc53538
RS
3777 entry = (struct mips_got_entry *) htab_find (g->got_entries, &lookup);
3778 BFD_ASSERT (entry);
0f20cc35 3779
6c42ddb9 3780 gotidx = entry->gotidx;
ce558b89 3781 BFD_ASSERT (gotidx > 0 && gotidx < htab->root.sgot->size);
6c42ddb9 3782
ebc53538 3783 return entry;
0f20cc35
DJ
3784 }
3785
ebc53538
RS
3786 lookup.abfd = NULL;
3787 lookup.symndx = -1;
3788 lookup.d.address = value;
3789 loc = htab_find_slot (g->got_entries, &lookup, INSERT);
3790 if (!loc)
b15e6682 3791 return NULL;
143d77c5 3792
ebc53538
RS
3793 entry = (struct mips_got_entry *) *loc;
3794 if (entry)
3795 return entry;
b15e6682 3796
cb22ccf4 3797 if (g->assigned_low_gotno > g->assigned_high_gotno)
b49e97c9
TS
3798 {
3799 /* We didn't allocate enough space in the GOT. */
4eca0228 3800 _bfd_error_handler
b49e97c9
TS
3801 (_("not enough GOT space for local GOT entries"));
3802 bfd_set_error (bfd_error_bad_value);
b15e6682 3803 return NULL;
b49e97c9
TS
3804 }
3805
ebc53538
RS
3806 entry = (struct mips_got_entry *) bfd_alloc (abfd, sizeof (*entry));
3807 if (!entry)
3808 return NULL;
3809
cb22ccf4
KCY
3810 if (got16_reloc_p (r_type)
3811 || call16_reloc_p (r_type)
3812 || got_page_reloc_p (r_type)
3813 || got_disp_reloc_p (r_type))
3814 lookup.gotidx = MIPS_ELF_GOT_SIZE (abfd) * g->assigned_low_gotno++;
3815 else
3816 lookup.gotidx = MIPS_ELF_GOT_SIZE (abfd) * g->assigned_high_gotno--;
3817
ebc53538
RS
3818 *entry = lookup;
3819 *loc = entry;
3820
ce558b89 3821 MIPS_ELF_PUT_WORD (abfd, value, htab->root.sgot->contents + entry->gotidx);
b15e6682 3822
5c18022e 3823 /* These GOT entries need a dynamic relocation on VxWorks. */
0a44bf69
RS
3824 if (htab->is_vxworks)
3825 {
3826 Elf_Internal_Rela outrel;
5c18022e 3827 asection *s;
91d6fa6a 3828 bfd_byte *rloc;
0a44bf69 3829 bfd_vma got_address;
0a44bf69
RS
3830
3831 s = mips_elf_rel_dyn_section (info, FALSE);
ce558b89
AM
3832 got_address = (htab->root.sgot->output_section->vma
3833 + htab->root.sgot->output_offset
ebc53538 3834 + entry->gotidx);
0a44bf69 3835
91d6fa6a 3836 rloc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
0a44bf69 3837 outrel.r_offset = got_address;
5c18022e
RS
3838 outrel.r_info = ELF32_R_INFO (STN_UNDEF, R_MIPS_32);
3839 outrel.r_addend = value;
91d6fa6a 3840 bfd_elf32_swap_reloca_out (abfd, &outrel, rloc);
0a44bf69
RS
3841 }
3842
ebc53538 3843 return entry;
b49e97c9
TS
3844}
3845
d4596a51
RS
3846/* Return the number of dynamic section symbols required by OUTPUT_BFD.
3847 The number might be exact or a worst-case estimate, depending on how
3848 much information is available to elf_backend_omit_section_dynsym at
3849 the current linking stage. */
3850
3851static bfd_size_type
3852count_section_dynsyms (bfd *output_bfd, struct bfd_link_info *info)
3853{
3854 bfd_size_type count;
3855
3856 count = 0;
0e1862bb
L
3857 if (bfd_link_pic (info)
3858 || elf_hash_table (info)->is_relocatable_executable)
d4596a51
RS
3859 {
3860 asection *p;
3861 const struct elf_backend_data *bed;
3862
3863 bed = get_elf_backend_data (output_bfd);
3864 for (p = output_bfd->sections; p ; p = p->next)
3865 if ((p->flags & SEC_EXCLUDE) == 0
3866 && (p->flags & SEC_ALLOC) != 0
7f923b7f 3867 && elf_hash_table (info)->dynamic_relocs
d4596a51
RS
3868 && !(*bed->elf_backend_omit_section_dynsym) (output_bfd, info, p))
3869 ++count;
3870 }
3871 return count;
3872}
3873
b49e97c9 3874/* Sort the dynamic symbol table so that symbols that need GOT entries
d4596a51 3875 appear towards the end. */
b49e97c9 3876
b34976b6 3877static bfd_boolean
d4596a51 3878mips_elf_sort_hash_table (bfd *abfd, struct bfd_link_info *info)
b49e97c9 3879{
a8028dd0 3880 struct mips_elf_link_hash_table *htab;
b49e97c9
TS
3881 struct mips_elf_hash_sort_data hsd;
3882 struct mips_got_info *g;
b49e97c9 3883
a8028dd0 3884 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3885 BFD_ASSERT (htab != NULL);
3886
0f8c4b60 3887 if (htab->root.dynsymcount == 0)
17a80fa8
MR
3888 return TRUE;
3889
a8028dd0 3890 g = htab->got_info;
d4596a51
RS
3891 if (g == NULL)
3892 return TRUE;
f4416af6 3893
b49e97c9 3894 hsd.low = NULL;
23cc69b6
RS
3895 hsd.max_unref_got_dynindx
3896 = hsd.min_got_dynindx
0f8c4b60 3897 = (htab->root.dynsymcount - g->reloc_only_gotno);
e17b0c35
MR
3898 /* Add 1 to local symbol indices to account for the mandatory NULL entry
3899 at the head of the table; see `_bfd_elf_link_renumber_dynsyms'. */
3900 hsd.max_local_dynindx = count_section_dynsyms (abfd, info) + 1;
3901 hsd.max_non_got_dynindx = htab->root.local_dynsymcount + 1;
f16a9783
MS
3902 hsd.output_bfd = abfd;
3903 if (htab->root.dynobj != NULL
3904 && htab->root.dynamic_sections_created
3905 && info->emit_gnu_hash)
3906 {
3907 asection *s = bfd_get_linker_section (htab->root.dynobj, ".MIPS.xhash");
3908 BFD_ASSERT (s != NULL);
3909 hsd.mipsxhash = s->contents;
3910 BFD_ASSERT (hsd.mipsxhash != NULL);
3911 }
3912 else
3913 hsd.mipsxhash = NULL;
0f8c4b60 3914 mips_elf_link_hash_traverse (htab, mips_elf_sort_hash_table_f, &hsd);
b49e97c9
TS
3915
3916 /* There should have been enough room in the symbol table to
44c410de 3917 accommodate both the GOT and non-GOT symbols. */
e17b0c35 3918 BFD_ASSERT (hsd.max_local_dynindx <= htab->root.local_dynsymcount + 1);
b49e97c9 3919 BFD_ASSERT (hsd.max_non_got_dynindx <= hsd.min_got_dynindx);
55f8b9d2 3920 BFD_ASSERT (hsd.max_unref_got_dynindx == htab->root.dynsymcount);
0f8c4b60 3921 BFD_ASSERT (htab->root.dynsymcount - hsd.min_got_dynindx == g->global_gotno);
b49e97c9
TS
3922
3923 /* Now we know which dynamic symbol has the lowest dynamic symbol
3924 table index in the GOT. */
d222d210 3925 htab->global_gotsym = hsd.low;
b49e97c9 3926
b34976b6 3927 return TRUE;
b49e97c9
TS
3928}
3929
3930/* If H needs a GOT entry, assign it the highest available dynamic
3931 index. Otherwise, assign it the lowest available dynamic
3932 index. */
3933
b34976b6 3934static bfd_boolean
9719ad41 3935mips_elf_sort_hash_table_f (struct mips_elf_link_hash_entry *h, void *data)
b49e97c9 3936{
9719ad41 3937 struct mips_elf_hash_sort_data *hsd = data;
b49e97c9 3938
b49e97c9
TS
3939 /* Symbols without dynamic symbol table entries aren't interesting
3940 at all. */
3941 if (h->root.dynindx == -1)
b34976b6 3942 return TRUE;
b49e97c9 3943
634835ae 3944 switch (h->global_got_area)
f4416af6 3945 {
634835ae 3946 case GGA_NONE:
e17b0c35
MR
3947 if (h->root.forced_local)
3948 h->root.dynindx = hsd->max_local_dynindx++;
3949 else
3950 h->root.dynindx = hsd->max_non_got_dynindx++;
634835ae 3951 break;
0f20cc35 3952
634835ae 3953 case GGA_NORMAL:
b49e97c9
TS
3954 h->root.dynindx = --hsd->min_got_dynindx;
3955 hsd->low = (struct elf_link_hash_entry *) h;
634835ae
RS
3956 break;
3957
3958 case GGA_RELOC_ONLY:
634835ae
RS
3959 if (hsd->max_unref_got_dynindx == hsd->min_got_dynindx)
3960 hsd->low = (struct elf_link_hash_entry *) h;
3961 h->root.dynindx = hsd->max_unref_got_dynindx++;
3962 break;
b49e97c9
TS
3963 }
3964
f16a9783
MS
3965 /* Populate the .MIPS.xhash translation table entry with
3966 the symbol dynindx. */
3967 if (h->mipsxhash_loc != 0 && hsd->mipsxhash != NULL)
3968 bfd_put_32 (hsd->output_bfd, h->root.dynindx,
3969 hsd->mipsxhash + h->mipsxhash_loc);
3970
b34976b6 3971 return TRUE;
b49e97c9
TS
3972}
3973
ee227692
RS
3974/* Record that input bfd ABFD requires a GOT entry like *LOOKUP
3975 (which is owned by the caller and shouldn't be added to the
3976 hash table directly). */
3977
3978static bfd_boolean
3979mips_elf_record_got_entry (struct bfd_link_info *info, bfd *abfd,
3980 struct mips_got_entry *lookup)
3981{
3982 struct mips_elf_link_hash_table *htab;
3983 struct mips_got_entry *entry;
3984 struct mips_got_info *g;
3985 void **loc, **bfd_loc;
3986
3987 /* Make sure there's a slot for this entry in the master GOT. */
3988 htab = mips_elf_hash_table (info);
3989 g = htab->got_info;
3990 loc = htab_find_slot (g->got_entries, lookup, INSERT);
3991 if (!loc)
3992 return FALSE;
3993
3994 /* Populate the entry if it isn't already. */
3995 entry = (struct mips_got_entry *) *loc;
3996 if (!entry)
3997 {
3998 entry = (struct mips_got_entry *) bfd_alloc (abfd, sizeof (*entry));
3999 if (!entry)
4000 return FALSE;
4001
9ab066b4 4002 lookup->tls_initialized = FALSE;
ee227692
RS
4003 lookup->gotidx = -1;
4004 *entry = *lookup;
4005 *loc = entry;
4006 }
4007
4008 /* Reuse the same GOT entry for the BFD's GOT. */
4009 g = mips_elf_bfd_got (abfd, TRUE);
4010 if (!g)
4011 return FALSE;
4012
4013 bfd_loc = htab_find_slot (g->got_entries, lookup, INSERT);
4014 if (!bfd_loc)
4015 return FALSE;
4016
4017 if (!*bfd_loc)
4018 *bfd_loc = entry;
4019 return TRUE;
4020}
4021
e641e783
RS
4022/* ABFD has a GOT relocation of type R_TYPE against H. Reserve a GOT
4023 entry for it. FOR_CALL is true if the caller is only interested in
6ccf4795 4024 using the GOT entry for calls. */
b49e97c9 4025
b34976b6 4026static bfd_boolean
9719ad41
RS
4027mips_elf_record_global_got_symbol (struct elf_link_hash_entry *h,
4028 bfd *abfd, struct bfd_link_info *info,
e641e783 4029 bfd_boolean for_call, int r_type)
b49e97c9 4030{
a8028dd0 4031 struct mips_elf_link_hash_table *htab;
634835ae 4032 struct mips_elf_link_hash_entry *hmips;
ee227692
RS
4033 struct mips_got_entry entry;
4034 unsigned char tls_type;
a8028dd0
RS
4035
4036 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4037 BFD_ASSERT (htab != NULL);
4038
634835ae 4039 hmips = (struct mips_elf_link_hash_entry *) h;
6ccf4795
RS
4040 if (!for_call)
4041 hmips->got_only_for_calls = FALSE;
f4416af6 4042
b49e97c9
TS
4043 /* A global symbol in the GOT must also be in the dynamic symbol
4044 table. */
7c5fcef7
L
4045 if (h->dynindx == -1)
4046 {
4047 switch (ELF_ST_VISIBILITY (h->other))
4048 {
4049 case STV_INTERNAL:
4050 case STV_HIDDEN:
47275900 4051 _bfd_mips_elf_hide_symbol (info, h, TRUE);
7c5fcef7
L
4052 break;
4053 }
c152c796 4054 if (!bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 4055 return FALSE;
7c5fcef7 4056 }
b49e97c9 4057
ee227692 4058 tls_type = mips_elf_reloc_tls_type (r_type);
9ab066b4 4059 if (tls_type == GOT_TLS_NONE && hmips->global_got_area > GGA_NORMAL)
ee227692 4060 hmips->global_got_area = GGA_NORMAL;
86324f90 4061
f4416af6
AO
4062 entry.abfd = abfd;
4063 entry.symndx = -1;
4064 entry.d.h = (struct mips_elf_link_hash_entry *) h;
ee227692
RS
4065 entry.tls_type = tls_type;
4066 return mips_elf_record_got_entry (info, abfd, &entry);
b49e97c9 4067}
f4416af6 4068
e641e783
RS
4069/* ABFD has a GOT relocation of type R_TYPE against symbol SYMNDX + ADDEND,
4070 where SYMNDX is a local symbol. Reserve a GOT entry for it. */
f4416af6
AO
4071
4072static bfd_boolean
9719ad41 4073mips_elf_record_local_got_symbol (bfd *abfd, long symndx, bfd_vma addend,
e641e783 4074 struct bfd_link_info *info, int r_type)
f4416af6 4075{
a8028dd0
RS
4076 struct mips_elf_link_hash_table *htab;
4077 struct mips_got_info *g;
ee227692 4078 struct mips_got_entry entry;
f4416af6 4079
a8028dd0 4080 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4081 BFD_ASSERT (htab != NULL);
4082
a8028dd0
RS
4083 g = htab->got_info;
4084 BFD_ASSERT (g != NULL);
4085
f4416af6
AO
4086 entry.abfd = abfd;
4087 entry.symndx = symndx;
4088 entry.d.addend = addend;
e641e783 4089 entry.tls_type = mips_elf_reloc_tls_type (r_type);
ee227692 4090 return mips_elf_record_got_entry (info, abfd, &entry);
f4416af6 4091}
c224138d 4092
13db6b44
RS
4093/* Record that ABFD has a page relocation against SYMNDX + ADDEND.
4094 H is the symbol's hash table entry, or null if SYMNDX is local
4095 to ABFD. */
c224138d
RS
4096
4097static bfd_boolean
13db6b44
RS
4098mips_elf_record_got_page_ref (struct bfd_link_info *info, bfd *abfd,
4099 long symndx, struct elf_link_hash_entry *h,
4100 bfd_signed_vma addend)
c224138d 4101{
a8028dd0 4102 struct mips_elf_link_hash_table *htab;
ee227692 4103 struct mips_got_info *g1, *g2;
13db6b44 4104 struct mips_got_page_ref lookup, *entry;
ee227692 4105 void **loc, **bfd_loc;
c224138d 4106
a8028dd0 4107 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4108 BFD_ASSERT (htab != NULL);
4109
ee227692
RS
4110 g1 = htab->got_info;
4111 BFD_ASSERT (g1 != NULL);
a8028dd0 4112
13db6b44
RS
4113 if (h)
4114 {
4115 lookup.symndx = -1;
4116 lookup.u.h = (struct mips_elf_link_hash_entry *) h;
4117 }
4118 else
4119 {
4120 lookup.symndx = symndx;
4121 lookup.u.abfd = abfd;
4122 }
4123 lookup.addend = addend;
4124 loc = htab_find_slot (g1->got_page_refs, &lookup, INSERT);
c224138d
RS
4125 if (loc == NULL)
4126 return FALSE;
4127
13db6b44 4128 entry = (struct mips_got_page_ref *) *loc;
c224138d
RS
4129 if (!entry)
4130 {
4131 entry = bfd_alloc (abfd, sizeof (*entry));
4132 if (!entry)
4133 return FALSE;
4134
13db6b44 4135 *entry = lookup;
c224138d
RS
4136 *loc = entry;
4137 }
4138
ee227692
RS
4139 /* Add the same entry to the BFD's GOT. */
4140 g2 = mips_elf_bfd_got (abfd, TRUE);
4141 if (!g2)
4142 return FALSE;
4143
13db6b44 4144 bfd_loc = htab_find_slot (g2->got_page_refs, &lookup, INSERT);
ee227692
RS
4145 if (!bfd_loc)
4146 return FALSE;
4147
4148 if (!*bfd_loc)
4149 *bfd_loc = entry;
4150
c224138d
RS
4151 return TRUE;
4152}
33bb52fb
RS
4153
4154/* Add room for N relocations to the .rel(a).dyn section in ABFD. */
4155
4156static void
4157mips_elf_allocate_dynamic_relocations (bfd *abfd, struct bfd_link_info *info,
4158 unsigned int n)
4159{
4160 asection *s;
4161 struct mips_elf_link_hash_table *htab;
4162
4163 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4164 BFD_ASSERT (htab != NULL);
4165
33bb52fb
RS
4166 s = mips_elf_rel_dyn_section (info, FALSE);
4167 BFD_ASSERT (s != NULL);
4168
4169 if (htab->is_vxworks)
4170 s->size += n * MIPS_ELF_RELA_SIZE (abfd);
4171 else
4172 {
4173 if (s->size == 0)
4174 {
4175 /* Make room for a null element. */
4176 s->size += MIPS_ELF_REL_SIZE (abfd);
4177 ++s->reloc_count;
4178 }
4179 s->size += n * MIPS_ELF_REL_SIZE (abfd);
4180 }
4181}
4182\f
476366af
RS
4183/* A htab_traverse callback for GOT entries, with DATA pointing to a
4184 mips_elf_traverse_got_arg structure. Count the number of GOT
4185 entries and TLS relocs. Set DATA->value to true if we need
4186 to resolve indirect or warning symbols and then recreate the GOT. */
33bb52fb
RS
4187
4188static int
4189mips_elf_check_recreate_got (void **entryp, void *data)
4190{
4191 struct mips_got_entry *entry;
476366af 4192 struct mips_elf_traverse_got_arg *arg;
33bb52fb
RS
4193
4194 entry = (struct mips_got_entry *) *entryp;
476366af 4195 arg = (struct mips_elf_traverse_got_arg *) data;
33bb52fb
RS
4196 if (entry->abfd != NULL && entry->symndx == -1)
4197 {
4198 struct mips_elf_link_hash_entry *h;
4199
4200 h = entry->d.h;
4201 if (h->root.root.type == bfd_link_hash_indirect
4202 || h->root.root.type == bfd_link_hash_warning)
4203 {
476366af 4204 arg->value = TRUE;
33bb52fb
RS
4205 return 0;
4206 }
4207 }
476366af 4208 mips_elf_count_got_entry (arg->info, arg->g, entry);
33bb52fb
RS
4209 return 1;
4210}
4211
476366af
RS
4212/* A htab_traverse callback for GOT entries, with DATA pointing to a
4213 mips_elf_traverse_got_arg structure. Add all entries to DATA->g,
4214 converting entries for indirect and warning symbols into entries
4215 for the target symbol. Set DATA->g to null on error. */
33bb52fb
RS
4216
4217static int
4218mips_elf_recreate_got (void **entryp, void *data)
4219{
72e7511a 4220 struct mips_got_entry new_entry, *entry;
476366af 4221 struct mips_elf_traverse_got_arg *arg;
33bb52fb
RS
4222 void **slot;
4223
33bb52fb 4224 entry = (struct mips_got_entry *) *entryp;
476366af 4225 arg = (struct mips_elf_traverse_got_arg *) data;
72e7511a
RS
4226 if (entry->abfd != NULL
4227 && entry->symndx == -1
4228 && (entry->d.h->root.root.type == bfd_link_hash_indirect
4229 || entry->d.h->root.root.type == bfd_link_hash_warning))
33bb52fb
RS
4230 {
4231 struct mips_elf_link_hash_entry *h;
4232
72e7511a
RS
4233 new_entry = *entry;
4234 entry = &new_entry;
33bb52fb 4235 h = entry->d.h;
72e7511a 4236 do
634835ae
RS
4237 {
4238 BFD_ASSERT (h->global_got_area == GGA_NONE);
4239 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
4240 }
72e7511a
RS
4241 while (h->root.root.type == bfd_link_hash_indirect
4242 || h->root.root.type == bfd_link_hash_warning);
33bb52fb
RS
4243 entry->d.h = h;
4244 }
476366af 4245 slot = htab_find_slot (arg->g->got_entries, entry, INSERT);
33bb52fb
RS
4246 if (slot == NULL)
4247 {
476366af 4248 arg->g = NULL;
33bb52fb
RS
4249 return 0;
4250 }
4251 if (*slot == NULL)
72e7511a
RS
4252 {
4253 if (entry == &new_entry)
4254 {
4255 entry = bfd_alloc (entry->abfd, sizeof (*entry));
4256 if (!entry)
4257 {
476366af 4258 arg->g = NULL;
72e7511a
RS
4259 return 0;
4260 }
4261 *entry = new_entry;
4262 }
4263 *slot = entry;
476366af 4264 mips_elf_count_got_entry (arg->info, arg->g, entry);
72e7511a 4265 }
33bb52fb
RS
4266 return 1;
4267}
4268
13db6b44
RS
4269/* Return the maximum number of GOT page entries required for RANGE. */
4270
4271static bfd_vma
4272mips_elf_pages_for_range (const struct mips_got_page_range *range)
4273{
4274 return (range->max_addend - range->min_addend + 0x1ffff) >> 16;
4275}
4276
4277/* Record that G requires a page entry that can reach SEC + ADDEND. */
4278
4279static bfd_boolean
b75d42bc 4280mips_elf_record_got_page_entry (struct mips_elf_traverse_got_arg *arg,
13db6b44
RS
4281 asection *sec, bfd_signed_vma addend)
4282{
b75d42bc 4283 struct mips_got_info *g = arg->g;
13db6b44
RS
4284 struct mips_got_page_entry lookup, *entry;
4285 struct mips_got_page_range **range_ptr, *range;
4286 bfd_vma old_pages, new_pages;
4287 void **loc;
4288
4289 /* Find the mips_got_page_entry hash table entry for this section. */
4290 lookup.sec = sec;
4291 loc = htab_find_slot (g->got_page_entries, &lookup, INSERT);
4292 if (loc == NULL)
4293 return FALSE;
4294
4295 /* Create a mips_got_page_entry if this is the first time we've
4296 seen the section. */
4297 entry = (struct mips_got_page_entry *) *loc;
4298 if (!entry)
4299 {
b75d42bc 4300 entry = bfd_zalloc (arg->info->output_bfd, sizeof (*entry));
13db6b44
RS
4301 if (!entry)
4302 return FALSE;
4303
4304 entry->sec = sec;
4305 *loc = entry;
4306 }
4307
4308 /* Skip over ranges whose maximum extent cannot share a page entry
4309 with ADDEND. */
4310 range_ptr = &entry->ranges;
4311 while (*range_ptr && addend > (*range_ptr)->max_addend + 0xffff)
4312 range_ptr = &(*range_ptr)->next;
4313
4314 /* If we scanned to the end of the list, or found a range whose
4315 minimum extent cannot share a page entry with ADDEND, create
4316 a new singleton range. */
4317 range = *range_ptr;
4318 if (!range || addend < range->min_addend - 0xffff)
4319 {
b75d42bc 4320 range = bfd_zalloc (arg->info->output_bfd, sizeof (*range));
13db6b44
RS
4321 if (!range)
4322 return FALSE;
4323
4324 range->next = *range_ptr;
4325 range->min_addend = addend;
4326 range->max_addend = addend;
4327
4328 *range_ptr = range;
4329 entry->num_pages++;
4330 g->page_gotno++;
4331 return TRUE;
4332 }
4333
4334 /* Remember how many pages the old range contributed. */
4335 old_pages = mips_elf_pages_for_range (range);
4336
4337 /* Update the ranges. */
4338 if (addend < range->min_addend)
4339 range->min_addend = addend;
4340 else if (addend > range->max_addend)
4341 {
4342 if (range->next && addend >= range->next->min_addend - 0xffff)
4343 {
4344 old_pages += mips_elf_pages_for_range (range->next);
4345 range->max_addend = range->next->max_addend;
4346 range->next = range->next->next;
4347 }
4348 else
4349 range->max_addend = addend;
4350 }
4351
4352 /* Record any change in the total estimate. */
4353 new_pages = mips_elf_pages_for_range (range);
4354 if (old_pages != new_pages)
4355 {
4356 entry->num_pages += new_pages - old_pages;
4357 g->page_gotno += new_pages - old_pages;
4358 }
4359
4360 return TRUE;
4361}
4362
4363/* A htab_traverse callback for which *REFP points to a mips_got_page_ref
4364 and for which DATA points to a mips_elf_traverse_got_arg. Work out
4365 whether the page reference described by *REFP needs a GOT page entry,
4366 and record that entry in DATA->g if so. Set DATA->g to null on failure. */
4367
4368static bfd_boolean
4369mips_elf_resolve_got_page_ref (void **refp, void *data)
4370{
4371 struct mips_got_page_ref *ref;
4372 struct mips_elf_traverse_got_arg *arg;
4373 struct mips_elf_link_hash_table *htab;
4374 asection *sec;
4375 bfd_vma addend;
4376
4377 ref = (struct mips_got_page_ref *) *refp;
4378 arg = (struct mips_elf_traverse_got_arg *) data;
4379 htab = mips_elf_hash_table (arg->info);
4380
4381 if (ref->symndx < 0)
4382 {
4383 struct mips_elf_link_hash_entry *h;
4384
4385 /* Global GOT_PAGEs decay to GOT_DISP and so don't need page entries. */
4386 h = ref->u.h;
4387 if (!SYMBOL_REFERENCES_LOCAL (arg->info, &h->root))
4388 return 1;
4389
4390 /* Ignore undefined symbols; we'll issue an error later if
4391 appropriate. */
4392 if (!((h->root.root.type == bfd_link_hash_defined
4393 || h->root.root.type == bfd_link_hash_defweak)
4394 && h->root.root.u.def.section))
4395 return 1;
4396
4397 sec = h->root.root.u.def.section;
4398 addend = h->root.root.u.def.value + ref->addend;
4399 }
4400 else
4401 {
4402 Elf_Internal_Sym *isym;
4403
4404 /* Read in the symbol. */
4405 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ref->u.abfd,
4406 ref->symndx);
4407 if (isym == NULL)
4408 {
4409 arg->g = NULL;
4410 return 0;
4411 }
4412
4413 /* Get the associated input section. */
4414 sec = bfd_section_from_elf_index (ref->u.abfd, isym->st_shndx);
4415 if (sec == NULL)
4416 {
4417 arg->g = NULL;
4418 return 0;
4419 }
4420
4421 /* If this is a mergable section, work out the section and offset
4422 of the merged data. For section symbols, the addend specifies
4423 of the offset _of_ the first byte in the data, otherwise it
4424 specifies the offset _from_ the first byte. */
4425 if (sec->flags & SEC_MERGE)
4426 {
4427 void *secinfo;
4428
4429 secinfo = elf_section_data (sec)->sec_info;
4430 if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
4431 addend = _bfd_merged_section_offset (ref->u.abfd, &sec, secinfo,
4432 isym->st_value + ref->addend);
4433 else
4434 addend = _bfd_merged_section_offset (ref->u.abfd, &sec, secinfo,
4435 isym->st_value) + ref->addend;
4436 }
4437 else
4438 addend = isym->st_value + ref->addend;
4439 }
b75d42bc 4440 if (!mips_elf_record_got_page_entry (arg, sec, addend))
13db6b44
RS
4441 {
4442 arg->g = NULL;
4443 return 0;
4444 }
4445 return 1;
4446}
4447
33bb52fb 4448/* If any entries in G->got_entries are for indirect or warning symbols,
13db6b44
RS
4449 replace them with entries for the target symbol. Convert g->got_page_refs
4450 into got_page_entry structures and estimate the number of page entries
4451 that they require. */
33bb52fb
RS
4452
4453static bfd_boolean
476366af
RS
4454mips_elf_resolve_final_got_entries (struct bfd_link_info *info,
4455 struct mips_got_info *g)
33bb52fb 4456{
476366af
RS
4457 struct mips_elf_traverse_got_arg tga;
4458 struct mips_got_info oldg;
4459
4460 oldg = *g;
33bb52fb 4461
476366af
RS
4462 tga.info = info;
4463 tga.g = g;
4464 tga.value = FALSE;
4465 htab_traverse (g->got_entries, mips_elf_check_recreate_got, &tga);
4466 if (tga.value)
33bb52fb 4467 {
476366af
RS
4468 *g = oldg;
4469 g->got_entries = htab_create (htab_size (oldg.got_entries),
4470 mips_elf_got_entry_hash,
4471 mips_elf_got_entry_eq, NULL);
4472 if (!g->got_entries)
33bb52fb
RS
4473 return FALSE;
4474
476366af
RS
4475 htab_traverse (oldg.got_entries, mips_elf_recreate_got, &tga);
4476 if (!tga.g)
4477 return FALSE;
4478
4479 htab_delete (oldg.got_entries);
33bb52fb 4480 }
13db6b44
RS
4481
4482 g->got_page_entries = htab_try_create (1, mips_got_page_entry_hash,
4483 mips_got_page_entry_eq, NULL);
4484 if (g->got_page_entries == NULL)
4485 return FALSE;
4486
4487 tga.info = info;
4488 tga.g = g;
4489 htab_traverse (g->got_page_refs, mips_elf_resolve_got_page_ref, &tga);
4490
33bb52fb
RS
4491 return TRUE;
4492}
4493
c5d6fa44
RS
4494/* Return true if a GOT entry for H should live in the local rather than
4495 global GOT area. */
4496
4497static bfd_boolean
4498mips_use_local_got_p (struct bfd_link_info *info,
4499 struct mips_elf_link_hash_entry *h)
4500{
4501 /* Symbols that aren't in the dynamic symbol table must live in the
4502 local GOT. This includes symbols that are completely undefined
4503 and which therefore don't bind locally. We'll report undefined
4504 symbols later if appropriate. */
4505 if (h->root.dynindx == -1)
4506 return TRUE;
4507
47275900
MR
4508 /* Absolute symbols, if ever they need a GOT entry, cannot ever go
4509 to the local GOT, as they would be implicitly relocated by the
4510 base address by the dynamic loader. */
4511 if (bfd_is_abs_symbol (&h->root.root))
4512 return FALSE;
4513
c5d6fa44
RS
4514 /* Symbols that bind locally can (and in the case of forced-local
4515 symbols, must) live in the local GOT. */
4516 if (h->got_only_for_calls
4517 ? SYMBOL_CALLS_LOCAL (info, &h->root)
4518 : SYMBOL_REFERENCES_LOCAL (info, &h->root))
4519 return TRUE;
4520
4521 /* If this is an executable that must provide a definition of the symbol,
4522 either though PLTs or copy relocations, then that address should go in
4523 the local rather than global GOT. */
0e1862bb 4524 if (bfd_link_executable (info) && h->has_static_relocs)
c5d6fa44
RS
4525 return TRUE;
4526
4527 return FALSE;
4528}
4529
6c42ddb9
RS
4530/* A mips_elf_link_hash_traverse callback for which DATA points to the
4531 link_info structure. Decide whether the hash entry needs an entry in
4532 the global part of the primary GOT, setting global_got_area accordingly.
4533 Count the number of global symbols that are in the primary GOT only
4534 because they have relocations against them (reloc_only_gotno). */
33bb52fb
RS
4535
4536static int
d4596a51 4537mips_elf_count_got_symbols (struct mips_elf_link_hash_entry *h, void *data)
33bb52fb 4538{
020d7251 4539 struct bfd_link_info *info;
6ccf4795 4540 struct mips_elf_link_hash_table *htab;
33bb52fb
RS
4541 struct mips_got_info *g;
4542
020d7251 4543 info = (struct bfd_link_info *) data;
6ccf4795
RS
4544 htab = mips_elf_hash_table (info);
4545 g = htab->got_info;
d4596a51 4546 if (h->global_got_area != GGA_NONE)
33bb52fb 4547 {
020d7251 4548 /* Make a final decision about whether the symbol belongs in the
c5d6fa44
RS
4549 local or global GOT. */
4550 if (mips_use_local_got_p (info, h))
6c42ddb9
RS
4551 /* The symbol belongs in the local GOT. We no longer need this
4552 entry if it was only used for relocations; those relocations
4553 will be against the null or section symbol instead of H. */
4554 h->global_got_area = GGA_NONE;
6ccf4795
RS
4555 else if (htab->is_vxworks
4556 && h->got_only_for_calls
1bbce132 4557 && h->root.plt.plist->mips_offset != MINUS_ONE)
6ccf4795
RS
4558 /* On VxWorks, calls can refer directly to the .got.plt entry;
4559 they don't need entries in the regular GOT. .got.plt entries
4560 will be allocated by _bfd_mips_elf_adjust_dynamic_symbol. */
4561 h->global_got_area = GGA_NONE;
6c42ddb9 4562 else if (h->global_got_area == GGA_RELOC_ONLY)
23cc69b6 4563 {
6c42ddb9 4564 g->reloc_only_gotno++;
23cc69b6 4565 g->global_gotno++;
23cc69b6 4566 }
33bb52fb
RS
4567 }
4568 return 1;
4569}
f4416af6 4570\f
d7206569
RS
4571/* A htab_traverse callback for GOT entries. Add each one to the GOT
4572 given in mips_elf_traverse_got_arg DATA. Clear DATA->G on error. */
f4416af6
AO
4573
4574static int
d7206569 4575mips_elf_add_got_entry (void **entryp, void *data)
f4416af6 4576{
d7206569
RS
4577 struct mips_got_entry *entry;
4578 struct mips_elf_traverse_got_arg *arg;
4579 void **slot;
f4416af6 4580
d7206569
RS
4581 entry = (struct mips_got_entry *) *entryp;
4582 arg = (struct mips_elf_traverse_got_arg *) data;
4583 slot = htab_find_slot (arg->g->got_entries, entry, INSERT);
4584 if (!slot)
f4416af6 4585 {
d7206569
RS
4586 arg->g = NULL;
4587 return 0;
f4416af6 4588 }
d7206569 4589 if (!*slot)
c224138d 4590 {
d7206569
RS
4591 *slot = entry;
4592 mips_elf_count_got_entry (arg->info, arg->g, entry);
c224138d 4593 }
f4416af6
AO
4594 return 1;
4595}
4596
d7206569
RS
4597/* A htab_traverse callback for GOT page entries. Add each one to the GOT
4598 given in mips_elf_traverse_got_arg DATA. Clear DATA->G on error. */
c224138d
RS
4599
4600static int
d7206569 4601mips_elf_add_got_page_entry (void **entryp, void *data)
c224138d 4602{
d7206569
RS
4603 struct mips_got_page_entry *entry;
4604 struct mips_elf_traverse_got_arg *arg;
4605 void **slot;
c224138d 4606
d7206569
RS
4607 entry = (struct mips_got_page_entry *) *entryp;
4608 arg = (struct mips_elf_traverse_got_arg *) data;
4609 slot = htab_find_slot (arg->g->got_page_entries, entry, INSERT);
4610 if (!slot)
c224138d 4611 {
d7206569 4612 arg->g = NULL;
c224138d
RS
4613 return 0;
4614 }
d7206569
RS
4615 if (!*slot)
4616 {
4617 *slot = entry;
4618 arg->g->page_gotno += entry->num_pages;
4619 }
c224138d
RS
4620 return 1;
4621}
4622
d7206569
RS
4623/* Consider merging FROM, which is ABFD's GOT, into TO. Return -1 if
4624 this would lead to overflow, 1 if they were merged successfully,
4625 and 0 if a merge failed due to lack of memory. (These values are chosen
4626 so that nonnegative return values can be returned by a htab_traverse
4627 callback.) */
c224138d
RS
4628
4629static int
d7206569 4630mips_elf_merge_got_with (bfd *abfd, struct mips_got_info *from,
c224138d
RS
4631 struct mips_got_info *to,
4632 struct mips_elf_got_per_bfd_arg *arg)
4633{
d7206569 4634 struct mips_elf_traverse_got_arg tga;
c224138d
RS
4635 unsigned int estimate;
4636
4637 /* Work out how many page entries we would need for the combined GOT. */
4638 estimate = arg->max_pages;
4639 if (estimate >= from->page_gotno + to->page_gotno)
4640 estimate = from->page_gotno + to->page_gotno;
4641
e2ece73c 4642 /* And conservatively estimate how many local and TLS entries
c224138d 4643 would be needed. */
e2ece73c
RS
4644 estimate += from->local_gotno + to->local_gotno;
4645 estimate += from->tls_gotno + to->tls_gotno;
4646
17214937
RS
4647 /* If we're merging with the primary got, any TLS relocations will
4648 come after the full set of global entries. Otherwise estimate those
e2ece73c 4649 conservatively as well. */
17214937 4650 if (to == arg->primary && from->tls_gotno + to->tls_gotno)
e2ece73c
RS
4651 estimate += arg->global_count;
4652 else
4653 estimate += from->global_gotno + to->global_gotno;
c224138d
RS
4654
4655 /* Bail out if the combined GOT might be too big. */
4656 if (estimate > arg->max_count)
4657 return -1;
4658
c224138d 4659 /* Transfer the bfd's got information from FROM to TO. */
d7206569
RS
4660 tga.info = arg->info;
4661 tga.g = to;
4662 htab_traverse (from->got_entries, mips_elf_add_got_entry, &tga);
4663 if (!tga.g)
c224138d
RS
4664 return 0;
4665
d7206569
RS
4666 htab_traverse (from->got_page_entries, mips_elf_add_got_page_entry, &tga);
4667 if (!tga.g)
c224138d
RS
4668 return 0;
4669
d7206569 4670 mips_elf_replace_bfd_got (abfd, to);
c224138d
RS
4671 return 1;
4672}
4673
d7206569 4674/* Attempt to merge GOT G, which belongs to ABFD. Try to use as much
f4416af6
AO
4675 as possible of the primary got, since it doesn't require explicit
4676 dynamic relocations, but don't use bfds that would reference global
4677 symbols out of the addressable range. Failing the primary got,
4678 attempt to merge with the current got, or finish the current got
4679 and then make make the new got current. */
4680
d7206569
RS
4681static bfd_boolean
4682mips_elf_merge_got (bfd *abfd, struct mips_got_info *g,
4683 struct mips_elf_got_per_bfd_arg *arg)
f4416af6 4684{
c224138d
RS
4685 unsigned int estimate;
4686 int result;
4687
476366af 4688 if (!mips_elf_resolve_final_got_entries (arg->info, g))
d7206569
RS
4689 return FALSE;
4690
c224138d
RS
4691 /* Work out the number of page, local and TLS entries. */
4692 estimate = arg->max_pages;
4693 if (estimate > g->page_gotno)
4694 estimate = g->page_gotno;
4695 estimate += g->local_gotno + g->tls_gotno;
0f20cc35
DJ
4696
4697 /* We place TLS GOT entries after both locals and globals. The globals
4698 for the primary GOT may overflow the normal GOT size limit, so be
4699 sure not to merge a GOT which requires TLS with the primary GOT in that
4700 case. This doesn't affect non-primary GOTs. */
c224138d 4701 estimate += (g->tls_gotno > 0 ? arg->global_count : g->global_gotno);
143d77c5 4702
c224138d 4703 if (estimate <= arg->max_count)
f4416af6 4704 {
c224138d
RS
4705 /* If we don't have a primary GOT, use it as
4706 a starting point for the primary GOT. */
4707 if (!arg->primary)
4708 {
d7206569
RS
4709 arg->primary = g;
4710 return TRUE;
c224138d 4711 }
f4416af6 4712
c224138d 4713 /* Try merging with the primary GOT. */
d7206569 4714 result = mips_elf_merge_got_with (abfd, g, arg->primary, arg);
c224138d
RS
4715 if (result >= 0)
4716 return result;
f4416af6 4717 }
c224138d 4718
f4416af6 4719 /* If we can merge with the last-created got, do it. */
c224138d 4720 if (arg->current)
f4416af6 4721 {
d7206569 4722 result = mips_elf_merge_got_with (abfd, g, arg->current, arg);
c224138d
RS
4723 if (result >= 0)
4724 return result;
f4416af6 4725 }
c224138d 4726
f4416af6
AO
4727 /* Well, we couldn't merge, so create a new GOT. Don't check if it
4728 fits; if it turns out that it doesn't, we'll get relocation
4729 overflows anyway. */
c224138d
RS
4730 g->next = arg->current;
4731 arg->current = g;
0f20cc35 4732
d7206569 4733 return TRUE;
0f20cc35
DJ
4734}
4735
72e7511a
RS
4736/* ENTRYP is a hash table entry for a mips_got_entry. Set its gotidx
4737 to GOTIDX, duplicating the entry if it has already been assigned
4738 an index in a different GOT. */
4739
4740static bfd_boolean
4741mips_elf_set_gotidx (void **entryp, long gotidx)
4742{
4743 struct mips_got_entry *entry;
4744
4745 entry = (struct mips_got_entry *) *entryp;
4746 if (entry->gotidx > 0)
4747 {
4748 struct mips_got_entry *new_entry;
4749
4750 new_entry = bfd_alloc (entry->abfd, sizeof (*entry));
4751 if (!new_entry)
4752 return FALSE;
4753
4754 *new_entry = *entry;
4755 *entryp = new_entry;
4756 entry = new_entry;
4757 }
4758 entry->gotidx = gotidx;
4759 return TRUE;
4760}
4761
4762/* Set the TLS GOT index for the GOT entry in ENTRYP. DATA points to a
4763 mips_elf_traverse_got_arg in which DATA->value is the size of one
4764 GOT entry. Set DATA->g to null on failure. */
0f20cc35
DJ
4765
4766static int
72e7511a 4767mips_elf_initialize_tls_index (void **entryp, void *data)
0f20cc35 4768{
72e7511a
RS
4769 struct mips_got_entry *entry;
4770 struct mips_elf_traverse_got_arg *arg;
0f20cc35
DJ
4771
4772 /* We're only interested in TLS symbols. */
72e7511a 4773 entry = (struct mips_got_entry *) *entryp;
9ab066b4 4774 if (entry->tls_type == GOT_TLS_NONE)
0f20cc35
DJ
4775 return 1;
4776
72e7511a 4777 arg = (struct mips_elf_traverse_got_arg *) data;
6c42ddb9 4778 if (!mips_elf_set_gotidx (entryp, arg->value * arg->g->tls_assigned_gotno))
ead49a57 4779 {
6c42ddb9
RS
4780 arg->g = NULL;
4781 return 0;
f4416af6
AO
4782 }
4783
ead49a57 4784 /* Account for the entries we've just allocated. */
9ab066b4 4785 arg->g->tls_assigned_gotno += mips_tls_got_entries (entry->tls_type);
f4416af6
AO
4786 return 1;
4787}
4788
ab361d49
RS
4789/* A htab_traverse callback for GOT entries, where DATA points to a
4790 mips_elf_traverse_got_arg. Set the global_got_area of each global
4791 symbol to DATA->value. */
f4416af6 4792
f4416af6 4793static int
ab361d49 4794mips_elf_set_global_got_area (void **entryp, void *data)
f4416af6 4795{
ab361d49
RS
4796 struct mips_got_entry *entry;
4797 struct mips_elf_traverse_got_arg *arg;
f4416af6 4798
ab361d49
RS
4799 entry = (struct mips_got_entry *) *entryp;
4800 arg = (struct mips_elf_traverse_got_arg *) data;
4801 if (entry->abfd != NULL
4802 && entry->symndx == -1
4803 && entry->d.h->global_got_area != GGA_NONE)
4804 entry->d.h->global_got_area = arg->value;
4805 return 1;
4806}
4807
4808/* A htab_traverse callback for secondary GOT entries, where DATA points
4809 to a mips_elf_traverse_got_arg. Assign GOT indices to global entries
4810 and record the number of relocations they require. DATA->value is
72e7511a 4811 the size of one GOT entry. Set DATA->g to null on failure. */
ab361d49
RS
4812
4813static int
4814mips_elf_set_global_gotidx (void **entryp, void *data)
4815{
4816 struct mips_got_entry *entry;
4817 struct mips_elf_traverse_got_arg *arg;
0f20cc35 4818
ab361d49
RS
4819 entry = (struct mips_got_entry *) *entryp;
4820 arg = (struct mips_elf_traverse_got_arg *) data;
634835ae
RS
4821 if (entry->abfd != NULL
4822 && entry->symndx == -1
4823 && entry->d.h->global_got_area != GGA_NONE)
f4416af6 4824 {
cb22ccf4 4825 if (!mips_elf_set_gotidx (entryp, arg->value * arg->g->assigned_low_gotno))
72e7511a
RS
4826 {
4827 arg->g = NULL;
4828 return 0;
4829 }
cb22ccf4 4830 arg->g->assigned_low_gotno += 1;
72e7511a 4831
0e1862bb 4832 if (bfd_link_pic (arg->info)
ab361d49
RS
4833 || (elf_hash_table (arg->info)->dynamic_sections_created
4834 && entry->d.h->root.def_dynamic
4835 && !entry->d.h->root.def_regular))
4836 arg->g->relocs += 1;
f4416af6
AO
4837 }
4838
4839 return 1;
4840}
4841
33bb52fb
RS
4842/* A htab_traverse callback for GOT entries for which DATA is the
4843 bfd_link_info. Forbid any global symbols from having traditional
4844 lazy-binding stubs. */
4845
0626d451 4846static int
33bb52fb 4847mips_elf_forbid_lazy_stubs (void **entryp, void *data)
0626d451 4848{
33bb52fb
RS
4849 struct bfd_link_info *info;
4850 struct mips_elf_link_hash_table *htab;
4851 struct mips_got_entry *entry;
0626d451 4852
33bb52fb
RS
4853 entry = (struct mips_got_entry *) *entryp;
4854 info = (struct bfd_link_info *) data;
4855 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4856 BFD_ASSERT (htab != NULL);
4857
0626d451
RS
4858 if (entry->abfd != NULL
4859 && entry->symndx == -1
33bb52fb 4860 && entry->d.h->needs_lazy_stub)
f4416af6 4861 {
33bb52fb
RS
4862 entry->d.h->needs_lazy_stub = FALSE;
4863 htab->lazy_stub_count--;
f4416af6 4864 }
143d77c5 4865
f4416af6
AO
4866 return 1;
4867}
4868
f4416af6
AO
4869/* Return the offset of an input bfd IBFD's GOT from the beginning of
4870 the primary GOT. */
4871static bfd_vma
9719ad41 4872mips_elf_adjust_gp (bfd *abfd, struct mips_got_info *g, bfd *ibfd)
f4416af6 4873{
d7206569 4874 if (!g->next)
f4416af6
AO
4875 return 0;
4876
d7206569 4877 g = mips_elf_bfd_got (ibfd, FALSE);
f4416af6
AO
4878 if (! g)
4879 return 0;
4880
4881 BFD_ASSERT (g->next);
4882
4883 g = g->next;
143d77c5 4884
0f20cc35
DJ
4885 return (g->local_gotno + g->global_gotno + g->tls_gotno)
4886 * MIPS_ELF_GOT_SIZE (abfd);
f4416af6
AO
4887}
4888
4889/* Turn a single GOT that is too big for 16-bit addressing into
4890 a sequence of GOTs, each one 16-bit addressable. */
4891
4892static bfd_boolean
9719ad41 4893mips_elf_multi_got (bfd *abfd, struct bfd_link_info *info,
a8028dd0 4894 asection *got, bfd_size_type pages)
f4416af6 4895{
a8028dd0 4896 struct mips_elf_link_hash_table *htab;
f4416af6 4897 struct mips_elf_got_per_bfd_arg got_per_bfd_arg;
ab361d49 4898 struct mips_elf_traverse_got_arg tga;
a8028dd0 4899 struct mips_got_info *g, *gg;
33bb52fb 4900 unsigned int assign, needed_relocs;
d7206569 4901 bfd *dynobj, *ibfd;
f4416af6 4902
33bb52fb 4903 dynobj = elf_hash_table (info)->dynobj;
a8028dd0 4904 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4905 BFD_ASSERT (htab != NULL);
4906
a8028dd0 4907 g = htab->got_info;
f4416af6 4908
f4416af6
AO
4909 got_per_bfd_arg.obfd = abfd;
4910 got_per_bfd_arg.info = info;
f4416af6
AO
4911 got_per_bfd_arg.current = NULL;
4912 got_per_bfd_arg.primary = NULL;
0a44bf69 4913 got_per_bfd_arg.max_count = ((MIPS_ELF_GOT_MAX_SIZE (info)
f4416af6 4914 / MIPS_ELF_GOT_SIZE (abfd))
861fb55a 4915 - htab->reserved_gotno);
c224138d 4916 got_per_bfd_arg.max_pages = pages;
0f20cc35 4917 /* The number of globals that will be included in the primary GOT.
ab361d49 4918 See the calls to mips_elf_set_global_got_area below for more
0f20cc35
DJ
4919 information. */
4920 got_per_bfd_arg.global_count = g->global_gotno;
f4416af6
AO
4921
4922 /* Try to merge the GOTs of input bfds together, as long as they
4923 don't seem to exceed the maximum GOT size, choosing one of them
4924 to be the primary GOT. */
c72f2fb2 4925 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
d7206569
RS
4926 {
4927 gg = mips_elf_bfd_got (ibfd, FALSE);
4928 if (gg && !mips_elf_merge_got (ibfd, gg, &got_per_bfd_arg))
4929 return FALSE;
4930 }
f4416af6 4931
0f20cc35 4932 /* If we do not find any suitable primary GOT, create an empty one. */
f4416af6 4933 if (got_per_bfd_arg.primary == NULL)
3dff0dd1 4934 g->next = mips_elf_create_got_info (abfd);
f4416af6
AO
4935 else
4936 g->next = got_per_bfd_arg.primary;
4937 g->next->next = got_per_bfd_arg.current;
4938
4939 /* GG is now the master GOT, and G is the primary GOT. */
4940 gg = g;
4941 g = g->next;
4942
4943 /* Map the output bfd to the primary got. That's what we're going
4944 to use for bfds that use GOT16 or GOT_PAGE relocations that we
4945 didn't mark in check_relocs, and we want a quick way to find it.
4946 We can't just use gg->next because we're going to reverse the
4947 list. */
d7206569 4948 mips_elf_replace_bfd_got (abfd, g);
f4416af6 4949
634835ae
RS
4950 /* Every symbol that is referenced in a dynamic relocation must be
4951 present in the primary GOT, so arrange for them to appear after
4952 those that are actually referenced. */
23cc69b6 4953 gg->reloc_only_gotno = gg->global_gotno - g->global_gotno;
634835ae 4954 g->global_gotno = gg->global_gotno;
f4416af6 4955
ab361d49
RS
4956 tga.info = info;
4957 tga.value = GGA_RELOC_ONLY;
4958 htab_traverse (gg->got_entries, mips_elf_set_global_got_area, &tga);
4959 tga.value = GGA_NORMAL;
4960 htab_traverse (g->got_entries, mips_elf_set_global_got_area, &tga);
f4416af6
AO
4961
4962 /* Now go through the GOTs assigning them offset ranges.
cb22ccf4 4963 [assigned_low_gotno, local_gotno[ will be set to the range of local
f4416af6
AO
4964 entries in each GOT. We can then compute the end of a GOT by
4965 adding local_gotno to global_gotno. We reverse the list and make
4966 it circular since then we'll be able to quickly compute the
4967 beginning of a GOT, by computing the end of its predecessor. To
4968 avoid special cases for the primary GOT, while still preserving
4969 assertions that are valid for both single- and multi-got links,
4970 we arrange for the main got struct to have the right number of
4971 global entries, but set its local_gotno such that the initial
4972 offset of the primary GOT is zero. Remember that the primary GOT
4973 will become the last item in the circular linked list, so it
4974 points back to the master GOT. */
4975 gg->local_gotno = -g->global_gotno;
4976 gg->global_gotno = g->global_gotno;
0f20cc35 4977 gg->tls_gotno = 0;
f4416af6
AO
4978 assign = 0;
4979 gg->next = gg;
4980
4981 do
4982 {
4983 struct mips_got_info *gn;
4984
861fb55a 4985 assign += htab->reserved_gotno;
cb22ccf4 4986 g->assigned_low_gotno = assign;
c224138d
RS
4987 g->local_gotno += assign;
4988 g->local_gotno += (pages < g->page_gotno ? pages : g->page_gotno);
cb22ccf4 4989 g->assigned_high_gotno = g->local_gotno - 1;
0f20cc35
DJ
4990 assign = g->local_gotno + g->global_gotno + g->tls_gotno;
4991
ead49a57
RS
4992 /* Take g out of the direct list, and push it onto the reversed
4993 list that gg points to. g->next is guaranteed to be nonnull after
4994 this operation, as required by mips_elf_initialize_tls_index. */
4995 gn = g->next;
4996 g->next = gg->next;
4997 gg->next = g;
4998
0f20cc35
DJ
4999 /* Set up any TLS entries. We always place the TLS entries after
5000 all non-TLS entries. */
5001 g->tls_assigned_gotno = g->local_gotno + g->global_gotno;
72e7511a
RS
5002 tga.g = g;
5003 tga.value = MIPS_ELF_GOT_SIZE (abfd);
5004 htab_traverse (g->got_entries, mips_elf_initialize_tls_index, &tga);
5005 if (!tga.g)
5006 return FALSE;
1fd20d70 5007 BFD_ASSERT (g->tls_assigned_gotno == assign);
f4416af6 5008
ead49a57 5009 /* Move onto the next GOT. It will be a secondary GOT if nonull. */
f4416af6 5010 g = gn;
0626d451 5011
33bb52fb
RS
5012 /* Forbid global symbols in every non-primary GOT from having
5013 lazy-binding stubs. */
0626d451 5014 if (g)
33bb52fb 5015 htab_traverse (g->got_entries, mips_elf_forbid_lazy_stubs, info);
f4416af6
AO
5016 }
5017 while (g);
5018
59b08994 5019 got->size = assign * MIPS_ELF_GOT_SIZE (abfd);
33bb52fb
RS
5020
5021 needed_relocs = 0;
33bb52fb
RS
5022 for (g = gg->next; g && g->next != gg; g = g->next)
5023 {
5024 unsigned int save_assign;
5025
ab361d49
RS
5026 /* Assign offsets to global GOT entries and count how many
5027 relocations they need. */
cb22ccf4
KCY
5028 save_assign = g->assigned_low_gotno;
5029 g->assigned_low_gotno = g->local_gotno;
ab361d49
RS
5030 tga.info = info;
5031 tga.value = MIPS_ELF_GOT_SIZE (abfd);
5032 tga.g = g;
5033 htab_traverse (g->got_entries, mips_elf_set_global_gotidx, &tga);
72e7511a
RS
5034 if (!tga.g)
5035 return FALSE;
cb22ccf4
KCY
5036 BFD_ASSERT (g->assigned_low_gotno == g->local_gotno + g->global_gotno);
5037 g->assigned_low_gotno = save_assign;
72e7511a 5038
0e1862bb 5039 if (bfd_link_pic (info))
33bb52fb 5040 {
cb22ccf4
KCY
5041 g->relocs += g->local_gotno - g->assigned_low_gotno;
5042 BFD_ASSERT (g->assigned_low_gotno == g->next->local_gotno
33bb52fb
RS
5043 + g->next->global_gotno
5044 + g->next->tls_gotno
861fb55a 5045 + htab->reserved_gotno);
33bb52fb 5046 }
ab361d49 5047 needed_relocs += g->relocs;
33bb52fb 5048 }
ab361d49 5049 needed_relocs += g->relocs;
33bb52fb
RS
5050
5051 if (needed_relocs)
5052 mips_elf_allocate_dynamic_relocations (dynobj, info,
5053 needed_relocs);
143d77c5 5054
f4416af6
AO
5055 return TRUE;
5056}
143d77c5 5057
b49e97c9
TS
5058\f
5059/* Returns the first relocation of type r_type found, beginning with
5060 RELOCATION. RELEND is one-past-the-end of the relocation table. */
5061
5062static const Elf_Internal_Rela *
9719ad41
RS
5063mips_elf_next_relocation (bfd *abfd ATTRIBUTE_UNUSED, unsigned int r_type,
5064 const Elf_Internal_Rela *relocation,
5065 const Elf_Internal_Rela *relend)
b49e97c9 5066{
c000e262
TS
5067 unsigned long r_symndx = ELF_R_SYM (abfd, relocation->r_info);
5068
b49e97c9
TS
5069 while (relocation < relend)
5070 {
c000e262
TS
5071 if (ELF_R_TYPE (abfd, relocation->r_info) == r_type
5072 && ELF_R_SYM (abfd, relocation->r_info) == r_symndx)
b49e97c9
TS
5073 return relocation;
5074
5075 ++relocation;
5076 }
5077
5078 /* We didn't find it. */
b49e97c9
TS
5079 return NULL;
5080}
5081
020d7251 5082/* Return whether an input relocation is against a local symbol. */
b49e97c9 5083
b34976b6 5084static bfd_boolean
9719ad41
RS
5085mips_elf_local_relocation_p (bfd *input_bfd,
5086 const Elf_Internal_Rela *relocation,
020d7251 5087 asection **local_sections)
b49e97c9
TS
5088{
5089 unsigned long r_symndx;
5090 Elf_Internal_Shdr *symtab_hdr;
b49e97c9
TS
5091 size_t extsymoff;
5092
5093 r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
5094 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5095 extsymoff = (elf_bad_symtab (input_bfd)) ? 0 : symtab_hdr->sh_info;
5096
5097 if (r_symndx < extsymoff)
b34976b6 5098 return TRUE;
b49e97c9 5099 if (elf_bad_symtab (input_bfd) && local_sections[r_symndx] != NULL)
b34976b6 5100 return TRUE;
b49e97c9 5101
b34976b6 5102 return FALSE;
b49e97c9
TS
5103}
5104\f
5105/* Sign-extend VALUE, which has the indicated number of BITS. */
5106
a7ebbfdf 5107bfd_vma
9719ad41 5108_bfd_mips_elf_sign_extend (bfd_vma value, int bits)
b49e97c9
TS
5109{
5110 if (value & ((bfd_vma) 1 << (bits - 1)))
5111 /* VALUE is negative. */
5112 value |= ((bfd_vma) - 1) << bits;
5113
5114 return value;
5115}
5116
5117/* Return non-zero if the indicated VALUE has overflowed the maximum
4cc11e76 5118 range expressible by a signed number with the indicated number of
b49e97c9
TS
5119 BITS. */
5120
b34976b6 5121static bfd_boolean
9719ad41 5122mips_elf_overflow_p (bfd_vma value, int bits)
b49e97c9
TS
5123{
5124 bfd_signed_vma svalue = (bfd_signed_vma) value;
5125
5126 if (svalue > (1 << (bits - 1)) - 1)
5127 /* The value is too big. */
b34976b6 5128 return TRUE;
b49e97c9
TS
5129 else if (svalue < -(1 << (bits - 1)))
5130 /* The value is too small. */
b34976b6 5131 return TRUE;
b49e97c9
TS
5132
5133 /* All is well. */
b34976b6 5134 return FALSE;
b49e97c9
TS
5135}
5136
5137/* Calculate the %high function. */
5138
5139static bfd_vma
9719ad41 5140mips_elf_high (bfd_vma value)
b49e97c9
TS
5141{
5142 return ((value + (bfd_vma) 0x8000) >> 16) & 0xffff;
5143}
5144
5145/* Calculate the %higher function. */
5146
5147static bfd_vma
9719ad41 5148mips_elf_higher (bfd_vma value ATTRIBUTE_UNUSED)
b49e97c9
TS
5149{
5150#ifdef BFD64
5151 return ((value + (bfd_vma) 0x80008000) >> 32) & 0xffff;
5152#else
5153 abort ();
c5ae1840 5154 return MINUS_ONE;
b49e97c9
TS
5155#endif
5156}
5157
5158/* Calculate the %highest function. */
5159
5160static bfd_vma
9719ad41 5161mips_elf_highest (bfd_vma value ATTRIBUTE_UNUSED)
b49e97c9
TS
5162{
5163#ifdef BFD64
b15e6682 5164 return ((value + (((bfd_vma) 0x8000 << 32) | 0x80008000)) >> 48) & 0xffff;
b49e97c9
TS
5165#else
5166 abort ();
c5ae1840 5167 return MINUS_ONE;
b49e97c9
TS
5168#endif
5169}
5170\f
5171/* Create the .compact_rel section. */
5172
b34976b6 5173static bfd_boolean
9719ad41
RS
5174mips_elf_create_compact_rel_section
5175 (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
b49e97c9
TS
5176{
5177 flagword flags;
5178 register asection *s;
5179
3d4d4302 5180 if (bfd_get_linker_section (abfd, ".compact_rel") == NULL)
b49e97c9
TS
5181 {
5182 flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED
5183 | SEC_READONLY);
5184
3d4d4302 5185 s = bfd_make_section_anyway_with_flags (abfd, ".compact_rel", flags);
b49e97c9 5186 if (s == NULL
fd361982 5187 || !bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd)))
b34976b6 5188 return FALSE;
b49e97c9 5189
eea6121a 5190 s->size = sizeof (Elf32_External_compact_rel);
b49e97c9
TS
5191 }
5192
b34976b6 5193 return TRUE;
b49e97c9
TS
5194}
5195
5196/* Create the .got section to hold the global offset table. */
5197
b34976b6 5198static bfd_boolean
23cc69b6 5199mips_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
b49e97c9
TS
5200{
5201 flagword flags;
5202 register asection *s;
5203 struct elf_link_hash_entry *h;
14a793b2 5204 struct bfd_link_hash_entry *bh;
0a44bf69
RS
5205 struct mips_elf_link_hash_table *htab;
5206
5207 htab = mips_elf_hash_table (info);
4dfe6ac6 5208 BFD_ASSERT (htab != NULL);
b49e97c9
TS
5209
5210 /* This function may be called more than once. */
ce558b89 5211 if (htab->root.sgot)
23cc69b6 5212 return TRUE;
b49e97c9
TS
5213
5214 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
5215 | SEC_LINKER_CREATED);
5216
72b4917c
TS
5217 /* We have to use an alignment of 2**4 here because this is hardcoded
5218 in the function stub generation and in the linker script. */
87e0a731 5219 s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
b49e97c9 5220 if (s == NULL
fd361982 5221 || !bfd_set_section_alignment (s, 4))
b34976b6 5222 return FALSE;
ce558b89 5223 htab->root.sgot = s;
b49e97c9
TS
5224
5225 /* Define the symbol _GLOBAL_OFFSET_TABLE_. We don't do this in the
5226 linker script because we don't want to define the symbol if we
5227 are not creating a global offset table. */
14a793b2 5228 bh = NULL;
b49e97c9
TS
5229 if (! (_bfd_generic_link_add_one_symbol
5230 (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
9719ad41 5231 0, NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 5232 return FALSE;
14a793b2
AM
5233
5234 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
5235 h->non_elf = 0;
5236 h->def_regular = 1;
b49e97c9 5237 h->type = STT_OBJECT;
2f9efdfc 5238 h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
d329bcd1 5239 elf_hash_table (info)->hgot = h;
b49e97c9 5240
0e1862bb 5241 if (bfd_link_pic (info)
c152c796 5242 && ! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 5243 return FALSE;
b49e97c9 5244
3dff0dd1 5245 htab->got_info = mips_elf_create_got_info (abfd);
f0abc2a1 5246 mips_elf_section_data (s)->elf.this_hdr.sh_flags
b49e97c9
TS
5247 |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
5248
861fb55a 5249 /* We also need a .got.plt section when generating PLTs. */
87e0a731
AM
5250 s = bfd_make_section_anyway_with_flags (abfd, ".got.plt",
5251 SEC_ALLOC | SEC_LOAD
5252 | SEC_HAS_CONTENTS
5253 | SEC_IN_MEMORY
5254 | SEC_LINKER_CREATED);
861fb55a
DJ
5255 if (s == NULL)
5256 return FALSE;
ce558b89 5257 htab->root.sgotplt = s;
0a44bf69 5258
b34976b6 5259 return TRUE;
b49e97c9 5260}
b49e97c9 5261\f
0a44bf69
RS
5262/* Return true if H refers to the special VxWorks __GOTT_BASE__ or
5263 __GOTT_INDEX__ symbols. These symbols are only special for
5264 shared objects; they are not used in executables. */
5265
5266static bfd_boolean
5267is_gott_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h)
5268{
5269 return (mips_elf_hash_table (info)->is_vxworks
0e1862bb 5270 && bfd_link_pic (info)
0a44bf69
RS
5271 && (strcmp (h->root.root.string, "__GOTT_BASE__") == 0
5272 || strcmp (h->root.root.string, "__GOTT_INDEX__") == 0));
5273}
861fb55a
DJ
5274
5275/* Return TRUE if a relocation of type R_TYPE from INPUT_BFD might
5276 require an la25 stub. See also mips_elf_local_pic_function_p,
5277 which determines whether the destination function ever requires a
5278 stub. */
5279
5280static bfd_boolean
8f0c309a
CLT
5281mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type,
5282 bfd_boolean target_is_16_bit_code_p)
861fb55a
DJ
5283{
5284 /* We specifically ignore branches and jumps from EF_PIC objects,
5285 where the onus is on the compiler or programmer to perform any
5286 necessary initialization of $25. Sometimes such initialization
5287 is unnecessary; for example, -mno-shared functions do not use
5288 the incoming value of $25, and may therefore be called directly. */
5289 if (PIC_OBJECT_P (input_bfd))
5290 return FALSE;
5291
5292 switch (r_type)
5293 {
5294 case R_MIPS_26:
5295 case R_MIPS_PC16:
7361da2c
AB
5296 case R_MIPS_PC21_S2:
5297 case R_MIPS_PC26_S2:
df58fc94
RS
5298 case R_MICROMIPS_26_S1:
5299 case R_MICROMIPS_PC7_S1:
5300 case R_MICROMIPS_PC10_S1:
5301 case R_MICROMIPS_PC16_S1:
5302 case R_MICROMIPS_PC23_S2:
861fb55a
DJ
5303 return TRUE;
5304
8f0c309a
CLT
5305 case R_MIPS16_26:
5306 return !target_is_16_bit_code_p;
5307
861fb55a
DJ
5308 default:
5309 return FALSE;
5310 }
5311}
0a44bf69 5312\f
47275900
MR
5313/* Obtain the field relocated by RELOCATION. */
5314
5315static bfd_vma
5316mips_elf_obtain_contents (reloc_howto_type *howto,
5317 const Elf_Internal_Rela *relocation,
5318 bfd *input_bfd, bfd_byte *contents)
5319{
5320 bfd_vma x = 0;
5321 bfd_byte *location = contents + relocation->r_offset;
5322 unsigned int size = bfd_get_reloc_size (howto);
5323
5324 /* Obtain the bytes. */
5325 if (size != 0)
5326 x = bfd_get (8 * size, input_bfd, location);
5327
5328 return x;
5329}
5330
98e10ffa
MR
5331/* Store the field relocated by RELOCATION. */
5332
5333static void
5334mips_elf_store_contents (reloc_howto_type *howto,
5335 const Elf_Internal_Rela *relocation,
5336 bfd *input_bfd, bfd_byte *contents, bfd_vma x)
5337{
5338 bfd_byte *location = contents + relocation->r_offset;
5339 unsigned int size = bfd_get_reloc_size (howto);
5340
5341 /* Put the value into the output. */
5342 if (size != 0)
5343 bfd_put (8 * size, input_bfd, x, location);
5344}
5345
47275900
MR
5346/* Try to patch a load from GOT instruction in CONTENTS pointed to by
5347 RELOCATION described by HOWTO, with a move of 0 to the load target
5348 register, returning TRUE if that is successful and FALSE otherwise.
5349 If DOIT is FALSE, then only determine it patching is possible and
5350 return status without actually changing CONTENTS.
5351*/
5352
5353static bfd_boolean
5354mips_elf_nullify_got_load (bfd *input_bfd, bfd_byte *contents,
5355 const Elf_Internal_Rela *relocation,
5356 reloc_howto_type *howto, bfd_boolean doit)
5357{
5358 int r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
5359 bfd_byte *location = contents + relocation->r_offset;
5360 bfd_boolean nullified = TRUE;
5361 bfd_vma x;
5362
5363 _bfd_mips_elf_reloc_unshuffle (input_bfd, r_type, FALSE, location);
5364
5365 /* Obtain the current value. */
5366 x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
5367
5368 /* Note that in the unshuffled MIPS16 encoding RX is at bits [21:19]
5369 while RY is at bits [18:16] of the combined 32-bit instruction word. */
5370 if (mips16_reloc_p (r_type)
5371 && (((x >> 22) & 0x3ff) == 0x3d3 /* LW */
5372 || ((x >> 22) & 0x3ff) == 0x3c7)) /* LD */
5373 x = (0x3cd << 22) | (x & (7 << 16)) << 3; /* LI */
5374 else if (micromips_reloc_p (r_type)
5375 && ((x >> 26) & 0x37) == 0x37) /* LW/LD */
5376 x = (0xc << 26) | (x & (0x1f << 21)); /* ADDIU */
5377 else if (((x >> 26) & 0x3f) == 0x23 /* LW */
5378 || ((x >> 26) & 0x3f) == 0x37) /* LD */
5379 x = (0x9 << 26) | (x & (0x1f << 16)); /* ADDIU */
5380 else
5381 nullified = FALSE;
5382
5383 /* Put the value into the output. */
5384 if (doit && nullified)
5385 mips_elf_store_contents (howto, relocation, input_bfd, contents, x);
5386
5387 _bfd_mips_elf_reloc_shuffle (input_bfd, r_type, FALSE, location);
5388
5389 return nullified;
5390}
5391
b49e97c9
TS
5392/* Calculate the value produced by the RELOCATION (which comes from
5393 the INPUT_BFD). The ADDEND is the addend to use for this
5394 RELOCATION; RELOCATION->R_ADDEND is ignored.
5395
5396 The result of the relocation calculation is stored in VALUEP.
38a7df63 5397 On exit, set *CROSS_MODE_JUMP_P to true if the relocation field
df58fc94 5398 is a MIPS16 or microMIPS jump to standard MIPS code, or vice versa.
b49e97c9
TS
5399
5400 This function returns bfd_reloc_continue if the caller need take no
5401 further action regarding this relocation, bfd_reloc_notsupported if
5402 something goes dramatically wrong, bfd_reloc_overflow if an
5403 overflow occurs, and bfd_reloc_ok to indicate success. */
5404
5405static bfd_reloc_status_type
9719ad41 5406mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
47275900 5407 asection *input_section, bfd_byte *contents,
9719ad41
RS
5408 struct bfd_link_info *info,
5409 const Elf_Internal_Rela *relocation,
5410 bfd_vma addend, reloc_howto_type *howto,
5411 Elf_Internal_Sym *local_syms,
5412 asection **local_sections, bfd_vma *valuep,
38a7df63
CF
5413 const char **namep,
5414 bfd_boolean *cross_mode_jump_p,
9719ad41 5415 bfd_boolean save_addend)
b49e97c9
TS
5416{
5417 /* The eventual value we will return. */
5418 bfd_vma value;
5419 /* The address of the symbol against which the relocation is
5420 occurring. */
5421 bfd_vma symbol = 0;
5422 /* The final GP value to be used for the relocatable, executable, or
5423 shared object file being produced. */
0a61c8c2 5424 bfd_vma gp;
b49e97c9
TS
5425 /* The place (section offset or address) of the storage unit being
5426 relocated. */
5427 bfd_vma p;
5428 /* The value of GP used to create the relocatable object. */
0a61c8c2 5429 bfd_vma gp0;
b49e97c9
TS
5430 /* The offset into the global offset table at which the address of
5431 the relocation entry symbol, adjusted by the addend, resides
5432 during execution. */
5433 bfd_vma g = MINUS_ONE;
5434 /* The section in which the symbol referenced by the relocation is
5435 located. */
5436 asection *sec = NULL;
5437 struct mips_elf_link_hash_entry *h = NULL;
b34976b6 5438 /* TRUE if the symbol referred to by this relocation is a local
b49e97c9 5439 symbol. */
b34976b6 5440 bfd_boolean local_p, was_local_p;
77434823
MR
5441 /* TRUE if the symbol referred to by this relocation is a section
5442 symbol. */
5443 bfd_boolean section_p = FALSE;
b34976b6
AM
5444 /* TRUE if the symbol referred to by this relocation is "_gp_disp". */
5445 bfd_boolean gp_disp_p = FALSE;
bbe506e8
TS
5446 /* TRUE if the symbol referred to by this relocation is
5447 "__gnu_local_gp". */
5448 bfd_boolean gnu_local_gp_p = FALSE;
b49e97c9
TS
5449 Elf_Internal_Shdr *symtab_hdr;
5450 size_t extsymoff;
5451 unsigned long r_symndx;
5452 int r_type;
b34976b6 5453 /* TRUE if overflow occurred during the calculation of the
b49e97c9 5454 relocation value. */
b34976b6
AM
5455 bfd_boolean overflowed_p;
5456 /* TRUE if this relocation refers to a MIPS16 function. */
5457 bfd_boolean target_is_16_bit_code_p = FALSE;
df58fc94 5458 bfd_boolean target_is_micromips_code_p = FALSE;
0a44bf69
RS
5459 struct mips_elf_link_hash_table *htab;
5460 bfd *dynobj;
ad951203 5461 bfd_boolean resolved_to_zero;
0a44bf69
RS
5462
5463 dynobj = elf_hash_table (info)->dynobj;
5464 htab = mips_elf_hash_table (info);
4dfe6ac6 5465 BFD_ASSERT (htab != NULL);
b49e97c9
TS
5466
5467 /* Parse the relocation. */
5468 r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
5469 r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
5470 p = (input_section->output_section->vma
5471 + input_section->output_offset
5472 + relocation->r_offset);
5473
5474 /* Assume that there will be no overflow. */
b34976b6 5475 overflowed_p = FALSE;
b49e97c9
TS
5476
5477 /* Figure out whether or not the symbol is local, and get the offset
5478 used in the array of hash table entries. */
5479 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5480 local_p = mips_elf_local_relocation_p (input_bfd, relocation,
020d7251 5481 local_sections);
bce03d3d 5482 was_local_p = local_p;
b49e97c9
TS
5483 if (! elf_bad_symtab (input_bfd))
5484 extsymoff = symtab_hdr->sh_info;
5485 else
5486 {
5487 /* The symbol table does not follow the rule that local symbols
5488 must come before globals. */
5489 extsymoff = 0;
5490 }
5491
5492 /* Figure out the value of the symbol. */
5493 if (local_p)
5494 {
9d862524 5495 bfd_boolean micromips_p = MICROMIPS_P (abfd);
b49e97c9
TS
5496 Elf_Internal_Sym *sym;
5497
5498 sym = local_syms + r_symndx;
5499 sec = local_sections[r_symndx];
5500
77434823
MR
5501 section_p = ELF_ST_TYPE (sym->st_info) == STT_SECTION;
5502
b49e97c9 5503 symbol = sec->output_section->vma + sec->output_offset;
77434823 5504 if (!section_p || (sec->flags & SEC_MERGE))
b49e97c9 5505 symbol += sym->st_value;
77434823 5506 if ((sec->flags & SEC_MERGE) && section_p)
d4df96e6
L
5507 {
5508 addend = _bfd_elf_rel_local_sym (abfd, sym, &sec, addend);
5509 addend -= symbol;
5510 addend += sec->output_section->vma + sec->output_offset;
5511 }
b49e97c9 5512
df58fc94
RS
5513 /* MIPS16/microMIPS text labels should be treated as odd. */
5514 if (ELF_ST_IS_COMPRESSED (sym->st_other))
b49e97c9
TS
5515 ++symbol;
5516
5517 /* Record the name of this symbol, for our caller. */
5518 *namep = bfd_elf_string_from_elf_section (input_bfd,
5519 symtab_hdr->sh_link,
5520 sym->st_name);
ceab86af 5521 if (*namep == NULL || **namep == '\0')
fd361982 5522 *namep = bfd_section_name (sec);
b49e97c9 5523
9d862524 5524 /* For relocations against a section symbol and ones against no
07d6d2b8 5525 symbol (absolute relocations) infer the ISA mode from the addend. */
9d862524
MR
5526 if (section_p || r_symndx == STN_UNDEF)
5527 {
5528 target_is_16_bit_code_p = (addend & 1) && !micromips_p;
5529 target_is_micromips_code_p = (addend & 1) && micromips_p;
5530 }
5531 /* For relocations against an absolute symbol infer the ISA mode
07d6d2b8 5532 from the value of the symbol plus addend. */
9d862524
MR
5533 else if (bfd_is_abs_section (sec))
5534 {
5535 target_is_16_bit_code_p = ((symbol + addend) & 1) && !micromips_p;
5536 target_is_micromips_code_p = ((symbol + addend) & 1) && micromips_p;
5537 }
5538 /* Otherwise just use the regular symbol annotation available. */
5539 else
5540 {
5541 target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (sym->st_other);
5542 target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (sym->st_other);
5543 }
b49e97c9
TS
5544 }
5545 else
5546 {
560e09e9
NC
5547 /* ??? Could we use RELOC_FOR_GLOBAL_SYMBOL here ? */
5548
b49e97c9
TS
5549 /* For global symbols we look up the symbol in the hash-table. */
5550 h = ((struct mips_elf_link_hash_entry *)
5551 elf_sym_hashes (input_bfd) [r_symndx - extsymoff]);
5552 /* Find the real hash-table entry for this symbol. */
5553 while (h->root.root.type == bfd_link_hash_indirect
5554 || h->root.root.type == bfd_link_hash_warning)
5555 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
5556
5557 /* Record the name of this symbol, for our caller. */
5558 *namep = h->root.root.root.string;
5559
5560 /* See if this is the special _gp_disp symbol. Note that such a
5561 symbol must always be a global symbol. */
560e09e9 5562 if (strcmp (*namep, "_gp_disp") == 0
b49e97c9
TS
5563 && ! NEWABI_P (input_bfd))
5564 {
5565 /* Relocations against _gp_disp are permitted only with
5566 R_MIPS_HI16 and R_MIPS_LO16 relocations. */
738e5348 5567 if (!hi16_reloc_p (r_type) && !lo16_reloc_p (r_type))
b49e97c9
TS
5568 return bfd_reloc_notsupported;
5569
b34976b6 5570 gp_disp_p = TRUE;
b49e97c9 5571 }
bbe506e8
TS
5572 /* See if this is the special _gp symbol. Note that such a
5573 symbol must always be a global symbol. */
5574 else if (strcmp (*namep, "__gnu_local_gp") == 0)
5575 gnu_local_gp_p = TRUE;
5576
5577
b49e97c9
TS
5578 /* If this symbol is defined, calculate its address. Note that
5579 _gp_disp is a magic symbol, always implicitly defined by the
5580 linker, so it's inappropriate to check to see whether or not
5581 its defined. */
5582 else if ((h->root.root.type == bfd_link_hash_defined
5583 || h->root.root.type == bfd_link_hash_defweak)
5584 && h->root.root.u.def.section)
5585 {
5586 sec = h->root.root.u.def.section;
5587 if (sec->output_section)
5588 symbol = (h->root.root.u.def.value
5589 + sec->output_section->vma
5590 + sec->output_offset);
5591 else
5592 symbol = h->root.root.u.def.value;
5593 }
5594 else if (h->root.root.type == bfd_link_hash_undefweak)
5595 /* We allow relocations against undefined weak symbols, giving
5596 it the value zero, so that you can undefined weak functions
5597 and check to see if they exist by looking at their
5598 addresses. */
5599 symbol = 0;
59c2e50f 5600 else if (info->unresolved_syms_in_objects == RM_IGNORE
b49e97c9
TS
5601 && ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
5602 symbol = 0;
a4d0f181
TS
5603 else if (strcmp (*namep, SGI_COMPAT (input_bfd)
5604 ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING") == 0)
b49e97c9
TS
5605 {
5606 /* If this is a dynamic link, we should have created a
5607 _DYNAMIC_LINK symbol or _DYNAMIC_LINKING(for normal mips) symbol
de194d85 5608 in _bfd_mips_elf_create_dynamic_sections.
b49e97c9
TS
5609 Otherwise, we should define the symbol with a value of 0.
5610 FIXME: It should probably get into the symbol table
5611 somehow as well. */
0e1862bb 5612 BFD_ASSERT (! bfd_link_pic (info));
b49e97c9
TS
5613 BFD_ASSERT (bfd_get_section_by_name (abfd, ".dynamic") == NULL);
5614 symbol = 0;
5615 }
5e2b0d47
NC
5616 else if (ELF_MIPS_IS_OPTIONAL (h->root.other))
5617 {
5618 /* This is an optional symbol - an Irix specific extension to the
5619 ELF spec. Ignore it for now.
5620 XXX - FIXME - there is more to the spec for OPTIONAL symbols
5621 than simply ignoring them, but we do not handle this for now.
5622 For information see the "64-bit ELF Object File Specification"
5623 which is available from here:
5624 http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf */
5625 symbol = 0;
5626 }
b49e97c9
TS
5627 else
5628 {
95a51568
FS
5629 bfd_boolean reject_undefined
5630 = (info->unresolved_syms_in_objects == RM_DIAGNOSE
5631 && !info->warn_unresolved_syms)
5632 || ELF_ST_VISIBILITY (h->root.other) != STV_DEFAULT;
dfb93f11 5633
95a51568 5634 info->callbacks->undefined_symbol
1a72702b 5635 (info, h->root.root.root.string, input_bfd,
dfb93f11
JC
5636 input_section, relocation->r_offset, reject_undefined);
5637
5638 if (reject_undefined)
5639 return bfd_reloc_undefined;
5640
5641 symbol = 0;
b49e97c9
TS
5642 }
5643
30c09090 5644 target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (h->root.other);
1bbce132 5645 target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (h->root.other);
b49e97c9
TS
5646 }
5647
738e5348
RS
5648 /* If this is a reference to a 16-bit function with a stub, we need
5649 to redirect the relocation to the stub unless:
5650
5651 (a) the relocation is for a MIPS16 JAL;
5652
5653 (b) the relocation is for a MIPS16 PIC call, and there are no
5654 non-MIPS16 uses of the GOT slot; or
5655
5656 (c) the section allows direct references to MIPS16 functions. */
5657 if (r_type != R_MIPS16_26
0e1862bb 5658 && !bfd_link_relocatable (info)
738e5348
RS
5659 && ((h != NULL
5660 && h->fn_stub != NULL
5661 && (r_type != R_MIPS16_CALL16 || h->need_fn_stub))
b9d58d71 5662 || (local_p
698600e4
AM
5663 && mips_elf_tdata (input_bfd)->local_stubs != NULL
5664 && mips_elf_tdata (input_bfd)->local_stubs[r_symndx] != NULL))
738e5348 5665 && !section_allows_mips16_refs_p (input_section))
b49e97c9
TS
5666 {
5667 /* This is a 32- or 64-bit call to a 16-bit function. We should
5668 have already noticed that we were going to need the
5669 stub. */
5670 if (local_p)
8f0c309a 5671 {
698600e4 5672 sec = mips_elf_tdata (input_bfd)->local_stubs[r_symndx];
8f0c309a
CLT
5673 value = 0;
5674 }
b49e97c9
TS
5675 else
5676 {
5677 BFD_ASSERT (h->need_fn_stub);
8f0c309a
CLT
5678 if (h->la25_stub)
5679 {
5680 /* If a LA25 header for the stub itself exists, point to the
5681 prepended LUI/ADDIU sequence. */
5682 sec = h->la25_stub->stub_section;
5683 value = h->la25_stub->offset;
5684 }
5685 else
5686 {
5687 sec = h->fn_stub;
5688 value = 0;
5689 }
b49e97c9
TS
5690 }
5691
8f0c309a 5692 symbol = sec->output_section->vma + sec->output_offset + value;
f38c2df5
TS
5693 /* The target is 16-bit, but the stub isn't. */
5694 target_is_16_bit_code_p = FALSE;
b49e97c9 5695 }
1bbce132
MR
5696 /* If this is a MIPS16 call with a stub, that is made through the PLT or
5697 to a standard MIPS function, we need to redirect the call to the stub.
5698 Note that we specifically exclude R_MIPS16_CALL16 from this behavior;
5699 indirect calls should use an indirect stub instead. */
0e1862bb 5700 else if (r_type == R_MIPS16_26 && !bfd_link_relocatable (info)
b314ec0e 5701 && ((h != NULL && (h->call_stub != NULL || h->call_fp_stub != NULL))
b9d58d71 5702 || (local_p
698600e4
AM
5703 && mips_elf_tdata (input_bfd)->local_call_stubs != NULL
5704 && mips_elf_tdata (input_bfd)->local_call_stubs[r_symndx] != NULL))
1bbce132 5705 && ((h != NULL && h->use_plt_entry) || !target_is_16_bit_code_p))
b49e97c9 5706 {
b9d58d71 5707 if (local_p)
698600e4 5708 sec = mips_elf_tdata (input_bfd)->local_call_stubs[r_symndx];
b9d58d71 5709 else
b49e97c9 5710 {
b9d58d71
TS
5711 /* If both call_stub and call_fp_stub are defined, we can figure
5712 out which one to use by checking which one appears in the input
5713 file. */
5714 if (h->call_stub != NULL && h->call_fp_stub != NULL)
b49e97c9 5715 {
b9d58d71 5716 asection *o;
68ffbac6 5717
b9d58d71
TS
5718 sec = NULL;
5719 for (o = input_bfd->sections; o != NULL; o = o->next)
b49e97c9 5720 {
fd361982 5721 if (CALL_FP_STUB_P (bfd_section_name (o)))
b9d58d71
TS
5722 {
5723 sec = h->call_fp_stub;
5724 break;
5725 }
b49e97c9 5726 }
b9d58d71
TS
5727 if (sec == NULL)
5728 sec = h->call_stub;
b49e97c9 5729 }
b9d58d71 5730 else if (h->call_stub != NULL)
b49e97c9 5731 sec = h->call_stub;
b9d58d71
TS
5732 else
5733 sec = h->call_fp_stub;
07d6d2b8 5734 }
b49e97c9 5735
eea6121a 5736 BFD_ASSERT (sec->size > 0);
b49e97c9
TS
5737 symbol = sec->output_section->vma + sec->output_offset;
5738 }
861fb55a
DJ
5739 /* If this is a direct call to a PIC function, redirect to the
5740 non-PIC stub. */
5741 else if (h != NULL && h->la25_stub
8f0c309a
CLT
5742 && mips_elf_relocation_needs_la25_stub (input_bfd, r_type,
5743 target_is_16_bit_code_p))
c7318def
MR
5744 {
5745 symbol = (h->la25_stub->stub_section->output_section->vma
5746 + h->la25_stub->stub_section->output_offset
5747 + h->la25_stub->offset);
5748 if (ELF_ST_IS_MICROMIPS (h->root.other))
5749 symbol |= 1;
5750 }
1bbce132
MR
5751 /* For direct MIPS16 and microMIPS calls make sure the compressed PLT
5752 entry is used if a standard PLT entry has also been made. In this
5753 case the symbol will have been set by mips_elf_set_plt_sym_value
5754 to point to the standard PLT entry, so redirect to the compressed
5755 one. */
54806ffa
MR
5756 else if ((mips16_branch_reloc_p (r_type)
5757 || micromips_branch_reloc_p (r_type))
0e1862bb 5758 && !bfd_link_relocatable (info)
1bbce132
MR
5759 && h != NULL
5760 && h->use_plt_entry
5761 && h->root.plt.plist->comp_offset != MINUS_ONE
5762 && h->root.plt.plist->mips_offset != MINUS_ONE)
5763 {
5764 bfd_boolean micromips_p = MICROMIPS_P (abfd);
5765
ce558b89 5766 sec = htab->root.splt;
1bbce132
MR
5767 symbol = (sec->output_section->vma
5768 + sec->output_offset
5769 + htab->plt_header_size
5770 + htab->plt_mips_offset
5771 + h->root.plt.plist->comp_offset
5772 + 1);
5773
5774 target_is_16_bit_code_p = !micromips_p;
5775 target_is_micromips_code_p = micromips_p;
5776 }
b49e97c9 5777
df58fc94 5778 /* Make sure MIPS16 and microMIPS are not used together. */
c9775dde 5779 if ((mips16_branch_reloc_p (r_type) && target_is_micromips_code_p)
df58fc94
RS
5780 || (micromips_branch_reloc_p (r_type) && target_is_16_bit_code_p))
5781 {
4eca0228 5782 _bfd_error_handler
df58fc94
RS
5783 (_("MIPS16 and microMIPS functions cannot call each other"));
5784 return bfd_reloc_notsupported;
5785 }
5786
b49e97c9 5787 /* Calls from 16-bit code to 32-bit code and vice versa require the
df58fc94
RS
5788 mode change. However, we can ignore calls to undefined weak symbols,
5789 which should never be executed at runtime. This exception is important
5790 because the assembly writer may have "known" that any definition of the
5791 symbol would be 16-bit code, and that direct jumps were therefore
5792 acceptable. */
0e1862bb 5793 *cross_mode_jump_p = (!bfd_link_relocatable (info)
df58fc94 5794 && !(h && h->root.root.type == bfd_link_hash_undefweak)
9d862524
MR
5795 && ((mips16_branch_reloc_p (r_type)
5796 && !target_is_16_bit_code_p)
5797 || (micromips_branch_reloc_p (r_type)
df58fc94 5798 && !target_is_micromips_code_p)
9d862524
MR
5799 || ((branch_reloc_p (r_type)
5800 || r_type == R_MIPS_JALR)
df58fc94
RS
5801 && (target_is_16_bit_code_p
5802 || target_is_micromips_code_p))));
b49e97c9 5803
47275900
MR
5804 resolved_to_zero = (h != NULL
5805 && UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->root));
5806
5807 switch (r_type)
5808 {
5809 case R_MIPS16_CALL16:
5810 case R_MIPS16_GOT16:
5811 case R_MIPS_CALL16:
5812 case R_MIPS_GOT16:
5813 case R_MIPS_GOT_PAGE:
5814 case R_MIPS_GOT_DISP:
5815 case R_MIPS_GOT_LO16:
5816 case R_MIPS_CALL_LO16:
5817 case R_MICROMIPS_CALL16:
5818 case R_MICROMIPS_GOT16:
5819 case R_MICROMIPS_GOT_PAGE:
5820 case R_MICROMIPS_GOT_DISP:
5821 case R_MICROMIPS_GOT_LO16:
5822 case R_MICROMIPS_CALL_LO16:
5823 if (resolved_to_zero
5824 && !bfd_link_relocatable (info)
5825 && mips_elf_nullify_got_load (input_bfd, contents,
5826 relocation, howto, TRUE))
5827 return bfd_reloc_continue;
5828
5829 /* Fall through. */
5830 case R_MIPS_GOT_HI16:
5831 case R_MIPS_CALL_HI16:
5832 case R_MICROMIPS_GOT_HI16:
5833 case R_MICROMIPS_CALL_HI16:
5834 if (resolved_to_zero
5835 && htab->use_absolute_zero
5836 && bfd_link_pic (info))
5837 {
5838 /* Redirect to the special `__gnu_absolute_zero' symbol. */
5839 h = mips_elf_link_hash_lookup (htab, "__gnu_absolute_zero",
5840 FALSE, FALSE, FALSE);
5841 BFD_ASSERT (h != NULL);
5842 }
5843 break;
5844 }
5845
c5d6fa44 5846 local_p = (h == NULL || mips_use_local_got_p (info, h));
b49e97c9 5847
0a61c8c2
RS
5848 gp0 = _bfd_get_gp_value (input_bfd);
5849 gp = _bfd_get_gp_value (abfd);
23cc69b6 5850 if (htab->got_info)
a8028dd0 5851 gp += mips_elf_adjust_gp (abfd, htab->got_info, input_bfd);
0a61c8c2
RS
5852
5853 if (gnu_local_gp_p)
5854 symbol = gp;
5855
df58fc94
RS
5856 /* Global R_MIPS_GOT_PAGE/R_MICROMIPS_GOT_PAGE relocations are equivalent
5857 to R_MIPS_GOT_DISP/R_MICROMIPS_GOT_DISP. The addend is applied by the
5858 corresponding R_MIPS_GOT_OFST/R_MICROMIPS_GOT_OFST. */
5859 if (got_page_reloc_p (r_type) && !local_p)
020d7251 5860 {
df58fc94
RS
5861 r_type = (micromips_reloc_p (r_type)
5862 ? R_MICROMIPS_GOT_DISP : R_MIPS_GOT_DISP);
020d7251
RS
5863 addend = 0;
5864 }
5865
e77760d2 5866 /* If we haven't already determined the GOT offset, and we're going
0a61c8c2 5867 to need it, get it now. */
b49e97c9
TS
5868 switch (r_type)
5869 {
738e5348
RS
5870 case R_MIPS16_CALL16:
5871 case R_MIPS16_GOT16:
b49e97c9
TS
5872 case R_MIPS_CALL16:
5873 case R_MIPS_GOT16:
5874 case R_MIPS_GOT_DISP:
5875 case R_MIPS_GOT_HI16:
5876 case R_MIPS_CALL_HI16:
5877 case R_MIPS_GOT_LO16:
5878 case R_MIPS_CALL_LO16:
df58fc94
RS
5879 case R_MICROMIPS_CALL16:
5880 case R_MICROMIPS_GOT16:
5881 case R_MICROMIPS_GOT_DISP:
5882 case R_MICROMIPS_GOT_HI16:
5883 case R_MICROMIPS_CALL_HI16:
5884 case R_MICROMIPS_GOT_LO16:
5885 case R_MICROMIPS_CALL_LO16:
0f20cc35
DJ
5886 case R_MIPS_TLS_GD:
5887 case R_MIPS_TLS_GOTTPREL:
5888 case R_MIPS_TLS_LDM:
d0f13682
CLT
5889 case R_MIPS16_TLS_GD:
5890 case R_MIPS16_TLS_GOTTPREL:
5891 case R_MIPS16_TLS_LDM:
df58fc94
RS
5892 case R_MICROMIPS_TLS_GD:
5893 case R_MICROMIPS_TLS_GOTTPREL:
5894 case R_MICROMIPS_TLS_LDM:
b49e97c9 5895 /* Find the index into the GOT where this value is located. */
df58fc94 5896 if (tls_ldm_reloc_p (r_type))
0f20cc35 5897 {
0a44bf69 5898 g = mips_elf_local_got_index (abfd, input_bfd, info,
5c18022e 5899 0, 0, NULL, r_type);
0f20cc35
DJ
5900 if (g == MINUS_ONE)
5901 return bfd_reloc_outofrange;
5902 }
5903 else if (!local_p)
b49e97c9 5904 {
0a44bf69
RS
5905 /* On VxWorks, CALL relocations should refer to the .got.plt
5906 entry, which is initialized to point at the PLT stub. */
5907 if (htab->is_vxworks
df58fc94
RS
5908 && (call_hi16_reloc_p (r_type)
5909 || call_lo16_reloc_p (r_type)
738e5348 5910 || call16_reloc_p (r_type)))
0a44bf69
RS
5911 {
5912 BFD_ASSERT (addend == 0);
5913 BFD_ASSERT (h->root.needs_plt);
5914 g = mips_elf_gotplt_index (info, &h->root);
5915 }
5916 else
b49e97c9 5917 {
020d7251 5918 BFD_ASSERT (addend == 0);
13fbec83
RS
5919 g = mips_elf_global_got_index (abfd, info, input_bfd,
5920 &h->root, r_type);
e641e783 5921 if (!TLS_RELOC_P (r_type)
020d7251
RS
5922 && !elf_hash_table (info)->dynamic_sections_created)
5923 /* This is a static link. We must initialize the GOT entry. */
ce558b89 5924 MIPS_ELF_PUT_WORD (dynobj, symbol, htab->root.sgot->contents + g);
b49e97c9
TS
5925 }
5926 }
0a44bf69 5927 else if (!htab->is_vxworks
738e5348 5928 && (call16_reloc_p (r_type) || got16_reloc_p (r_type)))
0a44bf69 5929 /* The calculation below does not involve "g". */
b49e97c9
TS
5930 break;
5931 else
5932 {
5c18022e 5933 g = mips_elf_local_got_index (abfd, input_bfd, info,
0a44bf69 5934 symbol + addend, r_symndx, h, r_type);
b49e97c9
TS
5935 if (g == MINUS_ONE)
5936 return bfd_reloc_outofrange;
5937 }
5938
5939 /* Convert GOT indices to actual offsets. */
a8028dd0 5940 g = mips_elf_got_offset_from_index (info, abfd, input_bfd, g);
b49e97c9 5941 break;
b49e97c9
TS
5942 }
5943
0a44bf69
RS
5944 /* Relocations against the VxWorks __GOTT_BASE__ and __GOTT_INDEX__
5945 symbols are resolved by the loader. Add them to .rela.dyn. */
5946 if (h != NULL && is_gott_symbol (info, &h->root))
5947 {
5948 Elf_Internal_Rela outrel;
5949 bfd_byte *loc;
5950 asection *s;
5951
5952 s = mips_elf_rel_dyn_section (info, FALSE);
5953 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
5954
5955 outrel.r_offset = (input_section->output_section->vma
5956 + input_section->output_offset
5957 + relocation->r_offset);
5958 outrel.r_info = ELF32_R_INFO (h->root.dynindx, r_type);
5959 outrel.r_addend = addend;
5960 bfd_elf32_swap_reloca_out (abfd, &outrel, loc);
9e3313ae
RS
5961
5962 /* If we've written this relocation for a readonly section,
5963 we need to set DF_TEXTREL again, so that we do not delete the
5964 DT_TEXTREL tag. */
5965 if (MIPS_ELF_READONLY_SECTION (input_section))
5966 info->flags |= DF_TEXTREL;
5967
0a44bf69
RS
5968 *valuep = 0;
5969 return bfd_reloc_ok;
5970 }
5971
b49e97c9
TS
5972 /* Figure out what kind of relocation is being performed. */
5973 switch (r_type)
5974 {
5975 case R_MIPS_NONE:
5976 return bfd_reloc_continue;
5977
5978 case R_MIPS_16:
c3eb94b4
MF
5979 if (howto->partial_inplace)
5980 addend = _bfd_mips_elf_sign_extend (addend, 16);
5981 value = symbol + addend;
b49e97c9
TS
5982 overflowed_p = mips_elf_overflow_p (value, 16);
5983 break;
5984
5985 case R_MIPS_32:
5986 case R_MIPS_REL32:
5987 case R_MIPS_64:
0e1862bb 5988 if ((bfd_link_pic (info)
861fb55a 5989 || (htab->root.dynamic_sections_created
b49e97c9 5990 && h != NULL
f5385ebf 5991 && h->root.def_dynamic
861fb55a
DJ
5992 && !h->root.def_regular
5993 && !h->has_static_relocs))
cf35638d 5994 && r_symndx != STN_UNDEF
9a59ad6b
DJ
5995 && (h == NULL
5996 || h->root.root.type != bfd_link_hash_undefweak
ad951203
L
5997 || (ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT
5998 && !resolved_to_zero))
b49e97c9
TS
5999 && (input_section->flags & SEC_ALLOC) != 0)
6000 {
861fb55a 6001 /* If we're creating a shared library, then we can't know
b49e97c9
TS
6002 where the symbol will end up. So, we create a relocation
6003 record in the output, and leave the job up to the dynamic
861fb55a
DJ
6004 linker. We must do the same for executable references to
6005 shared library symbols, unless we've decided to use copy
6006 relocs or PLTs instead. */
b49e97c9
TS
6007 value = addend;
6008 if (!mips_elf_create_dynamic_relocation (abfd,
6009 info,
6010 relocation,
6011 h,
6012 sec,
6013 symbol,
6014 &value,
6015 input_section))
6016 return bfd_reloc_undefined;
6017 }
6018 else
6019 {
6020 if (r_type != R_MIPS_REL32)
6021 value = symbol + addend;
6022 else
6023 value = addend;
6024 }
6025 value &= howto->dst_mask;
092dcd75
CD
6026 break;
6027
6028 case R_MIPS_PC32:
6029 value = symbol + addend - p;
6030 value &= howto->dst_mask;
b49e97c9
TS
6031 break;
6032
b49e97c9
TS
6033 case R_MIPS16_26:
6034 /* The calculation for R_MIPS16_26 is just the same as for an
6035 R_MIPS_26. It's only the storage of the relocated field into
6036 the output file that's different. That's handled in
6037 mips_elf_perform_relocation. So, we just fall through to the
6038 R_MIPS_26 case here. */
6039 case R_MIPS_26:
df58fc94
RS
6040 case R_MICROMIPS_26_S1:
6041 {
6042 unsigned int shift;
6043
df58fc94
RS
6044 /* Shift is 2, unusually, for microMIPS JALX. */
6045 shift = (!*cross_mode_jump_p && r_type == R_MICROMIPS_26_S1) ? 1 : 2;
6046
77434823 6047 if (howto->partial_inplace && !section_p)
df58fc94 6048 value = _bfd_mips_elf_sign_extend (addend, 26 + shift);
c3eb94b4
MF
6049 else
6050 value = addend;
bc27bb05
MR
6051 value += symbol;
6052
9d862524
MR
6053 /* Make sure the target of a jump is suitably aligned. Bit 0 must
6054 be the correct ISA mode selector except for weak undefined
6055 symbols. */
6056 if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6057 && (*cross_mode_jump_p
6058 ? (value & 3) != (r_type == R_MIPS_26)
07d6d2b8 6059 : (value & ((1 << shift) - 1)) != (r_type != R_MIPS_26)))
bc27bb05
MR
6060 return bfd_reloc_outofrange;
6061
6062 value >>= shift;
77434823 6063 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
df58fc94
RS
6064 overflowed_p = (value >> 26) != ((p + 4) >> (26 + shift));
6065 value &= howto->dst_mask;
6066 }
b49e97c9
TS
6067 break;
6068
0f20cc35 6069 case R_MIPS_TLS_DTPREL_HI16:
d0f13682 6070 case R_MIPS16_TLS_DTPREL_HI16:
df58fc94 6071 case R_MICROMIPS_TLS_DTPREL_HI16:
0f20cc35
DJ
6072 value = (mips_elf_high (addend + symbol - dtprel_base (info))
6073 & howto->dst_mask);
6074 break;
6075
6076 case R_MIPS_TLS_DTPREL_LO16:
741d6ea8
JM
6077 case R_MIPS_TLS_DTPREL32:
6078 case R_MIPS_TLS_DTPREL64:
d0f13682 6079 case R_MIPS16_TLS_DTPREL_LO16:
df58fc94 6080 case R_MICROMIPS_TLS_DTPREL_LO16:
0f20cc35
DJ
6081 value = (symbol + addend - dtprel_base (info)) & howto->dst_mask;
6082 break;
6083
6084 case R_MIPS_TLS_TPREL_HI16:
d0f13682 6085 case R_MIPS16_TLS_TPREL_HI16:
df58fc94 6086 case R_MICROMIPS_TLS_TPREL_HI16:
0f20cc35
DJ
6087 value = (mips_elf_high (addend + symbol - tprel_base (info))
6088 & howto->dst_mask);
6089 break;
6090
6091 case R_MIPS_TLS_TPREL_LO16:
d0f13682
CLT
6092 case R_MIPS_TLS_TPREL32:
6093 case R_MIPS_TLS_TPREL64:
6094 case R_MIPS16_TLS_TPREL_LO16:
df58fc94 6095 case R_MICROMIPS_TLS_TPREL_LO16:
0f20cc35
DJ
6096 value = (symbol + addend - tprel_base (info)) & howto->dst_mask;
6097 break;
6098
b49e97c9 6099 case R_MIPS_HI16:
d6f16593 6100 case R_MIPS16_HI16:
df58fc94 6101 case R_MICROMIPS_HI16:
b49e97c9
TS
6102 if (!gp_disp_p)
6103 {
6104 value = mips_elf_high (addend + symbol);
6105 value &= howto->dst_mask;
6106 }
6107 else
6108 {
d6f16593 6109 /* For MIPS16 ABI code we generate this sequence
07d6d2b8
AM
6110 0: li $v0,%hi(_gp_disp)
6111 4: addiupc $v1,%lo(_gp_disp)
6112 8: sll $v0,16
d6f16593
MR
6113 12: addu $v0,$v1
6114 14: move $gp,$v0
6115 So the offsets of hi and lo relocs are the same, but the
888b9c01
CLT
6116 base $pc is that used by the ADDIUPC instruction at $t9 + 4.
6117 ADDIUPC clears the low two bits of the instruction address,
6118 so the base is ($t9 + 4) & ~3. */
d6f16593 6119 if (r_type == R_MIPS16_HI16)
888b9c01 6120 value = mips_elf_high (addend + gp - ((p + 4) & ~(bfd_vma) 0x3));
df58fc94
RS
6121 /* The microMIPS .cpload sequence uses the same assembly
6122 instructions as the traditional psABI version, but the
6123 incoming $t9 has the low bit set. */
6124 else if (r_type == R_MICROMIPS_HI16)
6125 value = mips_elf_high (addend + gp - p - 1);
d6f16593
MR
6126 else
6127 value = mips_elf_high (addend + gp - p);
b49e97c9
TS
6128 }
6129 break;
6130
6131 case R_MIPS_LO16:
d6f16593 6132 case R_MIPS16_LO16:
df58fc94
RS
6133 case R_MICROMIPS_LO16:
6134 case R_MICROMIPS_HI0_LO16:
b49e97c9
TS
6135 if (!gp_disp_p)
6136 value = (symbol + addend) & howto->dst_mask;
6137 else
6138 {
d6f16593
MR
6139 /* See the comment for R_MIPS16_HI16 above for the reason
6140 for this conditional. */
6141 if (r_type == R_MIPS16_LO16)
888b9c01 6142 value = addend + gp - (p & ~(bfd_vma) 0x3);
df58fc94
RS
6143 else if (r_type == R_MICROMIPS_LO16
6144 || r_type == R_MICROMIPS_HI0_LO16)
6145 value = addend + gp - p + 3;
d6f16593
MR
6146 else
6147 value = addend + gp - p + 4;
b49e97c9 6148 /* The MIPS ABI requires checking the R_MIPS_LO16 relocation
8dc1a139 6149 for overflow. But, on, say, IRIX5, relocations against
b49e97c9
TS
6150 _gp_disp are normally generated from the .cpload
6151 pseudo-op. It generates code that normally looks like
6152 this:
6153
6154 lui $gp,%hi(_gp_disp)
6155 addiu $gp,$gp,%lo(_gp_disp)
6156 addu $gp,$gp,$t9
6157
6158 Here $t9 holds the address of the function being called,
6159 as required by the MIPS ELF ABI. The R_MIPS_LO16
6160 relocation can easily overflow in this situation, but the
6161 R_MIPS_HI16 relocation will handle the overflow.
6162 Therefore, we consider this a bug in the MIPS ABI, and do
6163 not check for overflow here. */
6164 }
6165 break;
6166
6167 case R_MIPS_LITERAL:
df58fc94 6168 case R_MICROMIPS_LITERAL:
b49e97c9
TS
6169 /* Because we don't merge literal sections, we can handle this
6170 just like R_MIPS_GPREL16. In the long run, we should merge
6171 shared literals, and then we will need to additional work
6172 here. */
6173
6174 /* Fall through. */
6175
6176 case R_MIPS16_GPREL:
6177 /* The R_MIPS16_GPREL performs the same calculation as
6178 R_MIPS_GPREL16, but stores the relocated bits in a different
6179 order. We don't need to do anything special here; the
6180 differences are handled in mips_elf_perform_relocation. */
6181 case R_MIPS_GPREL16:
df58fc94
RS
6182 case R_MICROMIPS_GPREL7_S2:
6183 case R_MICROMIPS_GPREL16:
bce03d3d
AO
6184 /* Only sign-extend the addend if it was extracted from the
6185 instruction. If the addend was separate, leave it alone,
6186 otherwise we may lose significant bits. */
6187 if (howto->partial_inplace)
a7ebbfdf 6188 addend = _bfd_mips_elf_sign_extend (addend, 16);
bce03d3d
AO
6189 value = symbol + addend - gp;
6190 /* If the symbol was local, any earlier relocatable links will
6191 have adjusted its addend with the gp offset, so compensate
6192 for that now. Don't do it for symbols forced local in this
6193 link, though, since they won't have had the gp offset applied
6194 to them before. */
6195 if (was_local_p)
6196 value += gp0;
538baf8b
AB
6197 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6198 overflowed_p = mips_elf_overflow_p (value, 16);
b49e97c9
TS
6199 break;
6200
738e5348
RS
6201 case R_MIPS16_GOT16:
6202 case R_MIPS16_CALL16:
b49e97c9
TS
6203 case R_MIPS_GOT16:
6204 case R_MIPS_CALL16:
df58fc94
RS
6205 case R_MICROMIPS_GOT16:
6206 case R_MICROMIPS_CALL16:
0a44bf69 6207 /* VxWorks does not have separate local and global semantics for
738e5348 6208 R_MIPS*_GOT16; every relocation evaluates to "G". */
0a44bf69 6209 if (!htab->is_vxworks && local_p)
b49e97c9 6210 {
5c18022e 6211 value = mips_elf_got16_entry (abfd, input_bfd, info,
020d7251 6212 symbol + addend, !was_local_p);
b49e97c9
TS
6213 if (value == MINUS_ONE)
6214 return bfd_reloc_outofrange;
6215 value
a8028dd0 6216 = mips_elf_got_offset_from_index (info, abfd, input_bfd, value);
b49e97c9
TS
6217 overflowed_p = mips_elf_overflow_p (value, 16);
6218 break;
6219 }
6220
6221 /* Fall through. */
6222
0f20cc35
DJ
6223 case R_MIPS_TLS_GD:
6224 case R_MIPS_TLS_GOTTPREL:
6225 case R_MIPS_TLS_LDM:
b49e97c9 6226 case R_MIPS_GOT_DISP:
d0f13682
CLT
6227 case R_MIPS16_TLS_GD:
6228 case R_MIPS16_TLS_GOTTPREL:
6229 case R_MIPS16_TLS_LDM:
df58fc94
RS
6230 case R_MICROMIPS_TLS_GD:
6231 case R_MICROMIPS_TLS_GOTTPREL:
6232 case R_MICROMIPS_TLS_LDM:
6233 case R_MICROMIPS_GOT_DISP:
b49e97c9
TS
6234 value = g;
6235 overflowed_p = mips_elf_overflow_p (value, 16);
6236 break;
6237
6238 case R_MIPS_GPREL32:
bce03d3d
AO
6239 value = (addend + symbol + gp0 - gp);
6240 if (!save_addend)
6241 value &= howto->dst_mask;
b49e97c9
TS
6242 break;
6243
6244 case R_MIPS_PC16:
bad36eac 6245 case R_MIPS_GNU_REL16_S2:
c3eb94b4
MF
6246 if (howto->partial_inplace)
6247 addend = _bfd_mips_elf_sign_extend (addend, 18);
6248
9d862524 6249 /* No need to exclude weak undefined symbols here as they resolve
07d6d2b8
AM
6250 to 0 and never set `*cross_mode_jump_p', so this alignment check
6251 will never trigger for them. */
9d862524
MR
6252 if (*cross_mode_jump_p
6253 ? ((symbol + addend) & 3) != 1
6254 : ((symbol + addend) & 3) != 0)
c3eb94b4
MF
6255 return bfd_reloc_outofrange;
6256
6257 value = symbol + addend - p;
538baf8b
AB
6258 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6259 overflowed_p = mips_elf_overflow_p (value, 18);
37caec6b
TS
6260 value >>= howto->rightshift;
6261 value &= howto->dst_mask;
b49e97c9
TS
6262 break;
6263
c9775dde
MR
6264 case R_MIPS16_PC16_S1:
6265 if (howto->partial_inplace)
6266 addend = _bfd_mips_elf_sign_extend (addend, 17);
6267
6268 if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
9d862524
MR
6269 && (*cross_mode_jump_p
6270 ? ((symbol + addend) & 3) != 0
6271 : ((symbol + addend) & 1) == 0))
c9775dde
MR
6272 return bfd_reloc_outofrange;
6273
6274 value = symbol + addend - p;
6275 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6276 overflowed_p = mips_elf_overflow_p (value, 17);
6277 value >>= howto->rightshift;
6278 value &= howto->dst_mask;
6279 break;
6280
7361da2c
AB
6281 case R_MIPS_PC21_S2:
6282 if (howto->partial_inplace)
6283 addend = _bfd_mips_elf_sign_extend (addend, 23);
6284
6285 if ((symbol + addend) & 3)
6286 return bfd_reloc_outofrange;
6287
6288 value = symbol + addend - p;
538baf8b
AB
6289 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6290 overflowed_p = mips_elf_overflow_p (value, 23);
7361da2c
AB
6291 value >>= howto->rightshift;
6292 value &= howto->dst_mask;
6293 break;
6294
6295 case R_MIPS_PC26_S2:
6296 if (howto->partial_inplace)
6297 addend = _bfd_mips_elf_sign_extend (addend, 28);
6298
6299 if ((symbol + addend) & 3)
6300 return bfd_reloc_outofrange;
6301
6302 value = symbol + addend - p;
538baf8b
AB
6303 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6304 overflowed_p = mips_elf_overflow_p (value, 28);
7361da2c
AB
6305 value >>= howto->rightshift;
6306 value &= howto->dst_mask;
6307 break;
6308
6309 case R_MIPS_PC18_S3:
6310 if (howto->partial_inplace)
6311 addend = _bfd_mips_elf_sign_extend (addend, 21);
6312
6313 if ((symbol + addend) & 7)
6314 return bfd_reloc_outofrange;
6315
6316 value = symbol + addend - ((p | 7) ^ 7);
538baf8b
AB
6317 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6318 overflowed_p = mips_elf_overflow_p (value, 21);
7361da2c
AB
6319 value >>= howto->rightshift;
6320 value &= howto->dst_mask;
6321 break;
6322
6323 case R_MIPS_PC19_S2:
6324 if (howto->partial_inplace)
6325 addend = _bfd_mips_elf_sign_extend (addend, 21);
6326
6327 if ((symbol + addend) & 3)
6328 return bfd_reloc_outofrange;
6329
6330 value = symbol + addend - p;
538baf8b
AB
6331 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6332 overflowed_p = mips_elf_overflow_p (value, 21);
7361da2c
AB
6333 value >>= howto->rightshift;
6334 value &= howto->dst_mask;
6335 break;
6336
6337 case R_MIPS_PCHI16:
6338 value = mips_elf_high (symbol + addend - p);
7361da2c
AB
6339 value &= howto->dst_mask;
6340 break;
6341
6342 case R_MIPS_PCLO16:
6343 if (howto->partial_inplace)
6344 addend = _bfd_mips_elf_sign_extend (addend, 16);
6345 value = symbol + addend - p;
6346 value &= howto->dst_mask;
6347 break;
6348
df58fc94 6349 case R_MICROMIPS_PC7_S1:
c3eb94b4
MF
6350 if (howto->partial_inplace)
6351 addend = _bfd_mips_elf_sign_extend (addend, 8);
9d862524
MR
6352
6353 if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6354 && (*cross_mode_jump_p
6355 ? ((symbol + addend + 2) & 3) != 0
6356 : ((symbol + addend + 2) & 1) == 0))
6357 return bfd_reloc_outofrange;
6358
c3eb94b4 6359 value = symbol + addend - p;
538baf8b
AB
6360 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6361 overflowed_p = mips_elf_overflow_p (value, 8);
df58fc94
RS
6362 value >>= howto->rightshift;
6363 value &= howto->dst_mask;
6364 break;
6365
6366 case R_MICROMIPS_PC10_S1:
c3eb94b4
MF
6367 if (howto->partial_inplace)
6368 addend = _bfd_mips_elf_sign_extend (addend, 11);
9d862524
MR
6369
6370 if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6371 && (*cross_mode_jump_p
6372 ? ((symbol + addend + 2) & 3) != 0
6373 : ((symbol + addend + 2) & 1) == 0))
6374 return bfd_reloc_outofrange;
6375
c3eb94b4 6376 value = symbol + addend - p;
538baf8b
AB
6377 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6378 overflowed_p = mips_elf_overflow_p (value, 11);
df58fc94
RS
6379 value >>= howto->rightshift;
6380 value &= howto->dst_mask;
6381 break;
6382
6383 case R_MICROMIPS_PC16_S1:
c3eb94b4
MF
6384 if (howto->partial_inplace)
6385 addend = _bfd_mips_elf_sign_extend (addend, 17);
9d862524
MR
6386
6387 if ((was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6388 && (*cross_mode_jump_p
6389 ? ((symbol + addend) & 3) != 0
6390 : ((symbol + addend) & 1) == 0))
6391 return bfd_reloc_outofrange;
6392
c3eb94b4 6393 value = symbol + addend - p;
538baf8b
AB
6394 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6395 overflowed_p = mips_elf_overflow_p (value, 17);
df58fc94
RS
6396 value >>= howto->rightshift;
6397 value &= howto->dst_mask;
6398 break;
6399
6400 case R_MICROMIPS_PC23_S2:
c3eb94b4
MF
6401 if (howto->partial_inplace)
6402 addend = _bfd_mips_elf_sign_extend (addend, 25);
6403 value = symbol + addend - ((p | 3) ^ 3);
538baf8b
AB
6404 if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
6405 overflowed_p = mips_elf_overflow_p (value, 25);
df58fc94
RS
6406 value >>= howto->rightshift;
6407 value &= howto->dst_mask;
6408 break;
6409
b49e97c9
TS
6410 case R_MIPS_GOT_HI16:
6411 case R_MIPS_CALL_HI16:
df58fc94
RS
6412 case R_MICROMIPS_GOT_HI16:
6413 case R_MICROMIPS_CALL_HI16:
b49e97c9
TS
6414 /* We're allowed to handle these two relocations identically.
6415 The dynamic linker is allowed to handle the CALL relocations
6416 differently by creating a lazy evaluation stub. */
6417 value = g;
6418 value = mips_elf_high (value);
6419 value &= howto->dst_mask;
6420 break;
6421
6422 case R_MIPS_GOT_LO16:
6423 case R_MIPS_CALL_LO16:
df58fc94
RS
6424 case R_MICROMIPS_GOT_LO16:
6425 case R_MICROMIPS_CALL_LO16:
b49e97c9
TS
6426 value = g & howto->dst_mask;
6427 break;
6428
6429 case R_MIPS_GOT_PAGE:
df58fc94 6430 case R_MICROMIPS_GOT_PAGE:
5c18022e 6431 value = mips_elf_got_page (abfd, input_bfd, info, symbol + addend, NULL);
b49e97c9
TS
6432 if (value == MINUS_ONE)
6433 return bfd_reloc_outofrange;
a8028dd0 6434 value = mips_elf_got_offset_from_index (info, abfd, input_bfd, value);
b49e97c9
TS
6435 overflowed_p = mips_elf_overflow_p (value, 16);
6436 break;
6437
6438 case R_MIPS_GOT_OFST:
df58fc94 6439 case R_MICROMIPS_GOT_OFST:
93a2b7ae 6440 if (local_p)
5c18022e 6441 mips_elf_got_page (abfd, input_bfd, info, symbol + addend, &value);
0fdc1bf1
AO
6442 else
6443 value = addend;
b49e97c9
TS
6444 overflowed_p = mips_elf_overflow_p (value, 16);
6445 break;
6446
6447 case R_MIPS_SUB:
df58fc94 6448 case R_MICROMIPS_SUB:
b49e97c9
TS
6449 value = symbol - addend;
6450 value &= howto->dst_mask;
6451 break;
6452
6453 case R_MIPS_HIGHER:
df58fc94 6454 case R_MICROMIPS_HIGHER:
b49e97c9
TS
6455 value = mips_elf_higher (addend + symbol);
6456 value &= howto->dst_mask;
6457 break;
6458
6459 case R_MIPS_HIGHEST:
df58fc94 6460 case R_MICROMIPS_HIGHEST:
b49e97c9
TS
6461 value = mips_elf_highest (addend + symbol);
6462 value &= howto->dst_mask;
6463 break;
6464
6465 case R_MIPS_SCN_DISP:
df58fc94 6466 case R_MICROMIPS_SCN_DISP:
b49e97c9
TS
6467 value = symbol + addend - sec->output_offset;
6468 value &= howto->dst_mask;
6469 break;
6470
b49e97c9 6471 case R_MIPS_JALR:
df58fc94 6472 case R_MICROMIPS_JALR:
1367d393
ILT
6473 /* This relocation is only a hint. In some cases, we optimize
6474 it into a bal instruction. But we don't try to optimize
5bbc5ae7
AN
6475 when the symbol does not resolve locally. */
6476 if (h != NULL && !SYMBOL_CALLS_LOCAL (info, &h->root))
1367d393 6477 return bfd_reloc_continue;
c1556ecd
MR
6478 /* We can't optimize cross-mode jumps either. */
6479 if (*cross_mode_jump_p)
6480 return bfd_reloc_continue;
1367d393 6481 value = symbol + addend;
c1556ecd
MR
6482 /* Neither we can non-instruction-aligned targets. */
6483 if (r_type == R_MIPS_JALR ? (value & 3) != 0 : (value & 1) == 0)
6484 return bfd_reloc_continue;
1367d393 6485 break;
b49e97c9 6486
1367d393 6487 case R_MIPS_PJUMP:
b49e97c9
TS
6488 case R_MIPS_GNU_VTINHERIT:
6489 case R_MIPS_GNU_VTENTRY:
6490 /* We don't do anything with these at present. */
6491 return bfd_reloc_continue;
6492
6493 default:
6494 /* An unrecognized relocation type. */
6495 return bfd_reloc_notsupported;
6496 }
6497
6498 /* Store the VALUE for our caller. */
6499 *valuep = value;
6500 return overflowed_p ? bfd_reloc_overflow : bfd_reloc_ok;
6501}
6502
b49e97c9
TS
6503/* It has been determined that the result of the RELOCATION is the
6504 VALUE. Use HOWTO to place VALUE into the output file at the
6505 appropriate position. The SECTION is the section to which the
68ffbac6 6506 relocation applies.
38a7df63 6507 CROSS_MODE_JUMP_P is true if the relocation field
df58fc94 6508 is a MIPS16 or microMIPS jump to standard MIPS code, or vice versa.
b49e97c9 6509
b34976b6 6510 Returns FALSE if anything goes wrong. */
b49e97c9 6511
b34976b6 6512static bfd_boolean
9719ad41
RS
6513mips_elf_perform_relocation (struct bfd_link_info *info,
6514 reloc_howto_type *howto,
6515 const Elf_Internal_Rela *relocation,
6516 bfd_vma value, bfd *input_bfd,
6517 asection *input_section, bfd_byte *contents,
38a7df63 6518 bfd_boolean cross_mode_jump_p)
b49e97c9
TS
6519{
6520 bfd_vma x;
6521 bfd_byte *location;
6522 int r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
6523
6524 /* Figure out where the relocation is occurring. */
6525 location = contents + relocation->r_offset;
6526
df58fc94 6527 _bfd_mips_elf_reloc_unshuffle (input_bfd, r_type, FALSE, location);
d6f16593 6528
b49e97c9
TS
6529 /* Obtain the current value. */
6530 x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
6531
6532 /* Clear the field we are setting. */
6533 x &= ~howto->dst_mask;
6534
b49e97c9
TS
6535 /* Set the field. */
6536 x |= (value & howto->dst_mask);
6537
a6ebf616 6538 /* Detect incorrect JALX usage. If required, turn JAL or BAL into JALX. */
9d862524
MR
6539 if (!cross_mode_jump_p && jal_reloc_p (r_type))
6540 {
6541 bfd_vma opcode = x >> 26;
6542
6543 if (r_type == R_MIPS16_26 ? opcode == 0x7
6544 : r_type == R_MICROMIPS_26_S1 ? opcode == 0x3c
6545 : opcode == 0x1d)
6546 {
6547 info->callbacks->einfo
2c1c9679 6548 (_("%X%H: unsupported JALX to the same ISA mode\n"),
9d862524
MR
6549 input_bfd, input_section, relocation->r_offset);
6550 return TRUE;
6551 }
6552 }
38a7df63 6553 if (cross_mode_jump_p && jal_reloc_p (r_type))
b49e97c9 6554 {
b34976b6 6555 bfd_boolean ok;
b49e97c9
TS
6556 bfd_vma opcode = x >> 26;
6557 bfd_vma jalx_opcode;
6558
6559 /* Check to see if the opcode is already JAL or JALX. */
6560 if (r_type == R_MIPS16_26)
6561 {
6562 ok = ((opcode == 0x6) || (opcode == 0x7));
6563 jalx_opcode = 0x7;
6564 }
df58fc94
RS
6565 else if (r_type == R_MICROMIPS_26_S1)
6566 {
6567 ok = ((opcode == 0x3d) || (opcode == 0x3c));
6568 jalx_opcode = 0x3c;
6569 }
b49e97c9
TS
6570 else
6571 {
6572 ok = ((opcode == 0x3) || (opcode == 0x1d));
6573 jalx_opcode = 0x1d;
6574 }
6575
3bdf9505 6576 /* If the opcode is not JAL or JALX, there's a problem. We cannot
07d6d2b8 6577 convert J or JALS to JALX. */
b49e97c9
TS
6578 if (!ok)
6579 {
5f68df25 6580 info->callbacks->einfo
2c1c9679 6581 (_("%X%H: unsupported jump between ISA modes; "
5f68df25
MR
6582 "consider recompiling with interlinking enabled\n"),
6583 input_bfd, input_section, relocation->r_offset);
6584 return TRUE;
b49e97c9
TS
6585 }
6586
6587 /* Make this the JALX opcode. */
2365f8d7 6588 x = (x & ~(0x3fu << 26)) | (jalx_opcode << 26);
b49e97c9 6589 }
9d862524
MR
6590 else if (cross_mode_jump_p && b_reloc_p (r_type))
6591 {
a6ebf616
MR
6592 bfd_boolean ok = FALSE;
6593 bfd_vma opcode = x >> 16;
6594 bfd_vma jalx_opcode = 0;
70e65ca8 6595 bfd_vma sign_bit = 0;
a6ebf616
MR
6596 bfd_vma addr;
6597 bfd_vma dest;
6598
6599 if (r_type == R_MICROMIPS_PC16_S1)
6600 {
6601 ok = opcode == 0x4060;
6602 jalx_opcode = 0x3c;
70e65ca8 6603 sign_bit = 0x10000;
a6ebf616
MR
6604 value <<= 1;
6605 }
6606 else if (r_type == R_MIPS_PC16 || r_type == R_MIPS_GNU_REL16_S2)
6607 {
6608 ok = opcode == 0x411;
6609 jalx_opcode = 0x1d;
70e65ca8 6610 sign_bit = 0x20000;
a6ebf616
MR
6611 value <<= 2;
6612 }
6613
8b10b0b3 6614 if (ok && !bfd_link_pic (info))
a6ebf616 6615 {
8b10b0b3
MR
6616 addr = (input_section->output_section->vma
6617 + input_section->output_offset
6618 + relocation->r_offset
6619 + 4);
70e65ca8
MR
6620 dest = (addr
6621 + (((value & ((sign_bit << 1) - 1)) ^ sign_bit) - sign_bit));
a6ebf616 6622
8b10b0b3
MR
6623 if ((addr >> 28) << 28 != (dest >> 28) << 28)
6624 {
6625 info->callbacks->einfo
2c1c9679 6626 (_("%X%H: cannot convert branch between ISA modes "
8b10b0b3
MR
6627 "to JALX: relocation out of range\n"),
6628 input_bfd, input_section, relocation->r_offset);
6629 return TRUE;
6630 }
a6ebf616 6631
8b10b0b3
MR
6632 /* Make this the JALX opcode. */
6633 x = ((dest >> 2) & 0x3ffffff) | jalx_opcode << 26;
6634 }
6635 else if (!mips_elf_hash_table (info)->ignore_branch_isa)
a6ebf616
MR
6636 {
6637 info->callbacks->einfo
2c1c9679 6638 (_("%X%H: unsupported branch between ISA modes\n"),
a6ebf616
MR
6639 input_bfd, input_section, relocation->r_offset);
6640 return TRUE;
6641 }
9d862524 6642 }
b49e97c9 6643
38a7df63
CF
6644 /* Try converting JAL to BAL and J(AL)R to B(AL), if the target is in
6645 range. */
0e1862bb 6646 if (!bfd_link_relocatable (info)
38a7df63 6647 && !cross_mode_jump_p
cd8d5a82
CF
6648 && ((JAL_TO_BAL_P (input_bfd)
6649 && r_type == R_MIPS_26
0e392101 6650 && (x >> 26) == 0x3) /* jal addr */
cd8d5a82
CF
6651 || (JALR_TO_BAL_P (input_bfd)
6652 && r_type == R_MIPS_JALR
0e392101 6653 && x == 0x0320f809) /* jalr t9 */
38a7df63
CF
6654 || (JR_TO_B_P (input_bfd)
6655 && r_type == R_MIPS_JALR
0e392101 6656 && (x & ~1) == 0x03200008))) /* jr t9 / jalr zero, t9 */
1367d393
ILT
6657 {
6658 bfd_vma addr;
6659 bfd_vma dest;
6660 bfd_signed_vma off;
6661
6662 addr = (input_section->output_section->vma
6663 + input_section->output_offset
6664 + relocation->r_offset
6665 + 4);
6666 if (r_type == R_MIPS_26)
6667 dest = (value << 2) | ((addr >> 28) << 28);
6668 else
6669 dest = value;
6670 off = dest - addr;
6671 if (off <= 0x1ffff && off >= -0x20000)
38a7df63 6672 {
0e392101 6673 if ((x & ~1) == 0x03200008) /* jr t9 / jalr zero, t9 */
38a7df63
CF
6674 x = 0x10000000 | (((bfd_vma) off >> 2) & 0xffff); /* b addr */
6675 else
6676 x = 0x04110000 | (((bfd_vma) off >> 2) & 0xffff); /* bal addr */
6677 }
1367d393
ILT
6678 }
6679
b49e97c9 6680 /* Put the value into the output. */
98e10ffa 6681 mips_elf_store_contents (howto, relocation, input_bfd, contents, x);
d6f16593 6682
0e1862bb 6683 _bfd_mips_elf_reloc_shuffle (input_bfd, r_type, !bfd_link_relocatable (info),
df58fc94 6684 location);
d6f16593 6685
b34976b6 6686 return TRUE;
b49e97c9 6687}
b49e97c9 6688\f
b49e97c9
TS
6689/* Create a rel.dyn relocation for the dynamic linker to resolve. REL
6690 is the original relocation, which is now being transformed into a
6691 dynamic relocation. The ADDENDP is adjusted if necessary; the
6692 caller should store the result in place of the original addend. */
6693
b34976b6 6694static bfd_boolean
9719ad41
RS
6695mips_elf_create_dynamic_relocation (bfd *output_bfd,
6696 struct bfd_link_info *info,
6697 const Elf_Internal_Rela *rel,
6698 struct mips_elf_link_hash_entry *h,
6699 asection *sec, bfd_vma symbol,
6700 bfd_vma *addendp, asection *input_section)
b49e97c9 6701{
947216bf 6702 Elf_Internal_Rela outrel[3];
b49e97c9
TS
6703 asection *sreloc;
6704 bfd *dynobj;
6705 int r_type;
5d41f0b6
RS
6706 long indx;
6707 bfd_boolean defined_p;
0a44bf69 6708 struct mips_elf_link_hash_table *htab;
b49e97c9 6709
0a44bf69 6710 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
6711 BFD_ASSERT (htab != NULL);
6712
b49e97c9
TS
6713 r_type = ELF_R_TYPE (output_bfd, rel->r_info);
6714 dynobj = elf_hash_table (info)->dynobj;
0a44bf69 6715 sreloc = mips_elf_rel_dyn_section (info, FALSE);
b49e97c9
TS
6716 BFD_ASSERT (sreloc != NULL);
6717 BFD_ASSERT (sreloc->contents != NULL);
6718 BFD_ASSERT (sreloc->reloc_count * MIPS_ELF_REL_SIZE (output_bfd)
eea6121a 6719 < sreloc->size);
b49e97c9 6720
b49e97c9
TS
6721 outrel[0].r_offset =
6722 _bfd_elf_section_offset (output_bfd, info, input_section, rel[0].r_offset);
9ddf8309
TS
6723 if (ABI_64_P (output_bfd))
6724 {
6725 outrel[1].r_offset =
6726 _bfd_elf_section_offset (output_bfd, info, input_section, rel[1].r_offset);
6727 outrel[2].r_offset =
6728 _bfd_elf_section_offset (output_bfd, info, input_section, rel[2].r_offset);
6729 }
b49e97c9 6730
c5ae1840 6731 if (outrel[0].r_offset == MINUS_ONE)
0d591ff7 6732 /* The relocation field has been deleted. */
5d41f0b6
RS
6733 return TRUE;
6734
6735 if (outrel[0].r_offset == MINUS_TWO)
0d591ff7
RS
6736 {
6737 /* The relocation field has been converted into a relative value of
6738 some sort. Functions like _bfd_elf_write_section_eh_frame expect
6739 the field to be fully relocated, so add in the symbol's value. */
0d591ff7 6740 *addendp += symbol;
5d41f0b6 6741 return TRUE;
0d591ff7 6742 }
b49e97c9 6743
5d41f0b6
RS
6744 /* We must now calculate the dynamic symbol table index to use
6745 in the relocation. */
d4a77f3f 6746 if (h != NULL && ! SYMBOL_REFERENCES_LOCAL (info, &h->root))
5d41f0b6 6747 {
020d7251 6748 BFD_ASSERT (htab->is_vxworks || h->global_got_area != GGA_NONE);
5d41f0b6
RS
6749 indx = h->root.dynindx;
6750 if (SGI_COMPAT (output_bfd))
6751 defined_p = h->root.def_regular;
6752 else
6753 /* ??? glibc's ld.so just adds the final GOT entry to the
6754 relocation field. It therefore treats relocs against
6755 defined symbols in the same way as relocs against
6756 undefined symbols. */
6757 defined_p = FALSE;
6758 }
b49e97c9
TS
6759 else
6760 {
5d41f0b6
RS
6761 if (sec != NULL && bfd_is_abs_section (sec))
6762 indx = 0;
6763 else if (sec == NULL || sec->owner == NULL)
fdd07405 6764 {
5d41f0b6
RS
6765 bfd_set_error (bfd_error_bad_value);
6766 return FALSE;
b49e97c9
TS
6767 }
6768 else
6769 {
5d41f0b6 6770 indx = elf_section_data (sec->output_section)->dynindx;
74541ad4
AM
6771 if (indx == 0)
6772 {
6773 asection *osec = htab->root.text_index_section;
6774 indx = elf_section_data (osec)->dynindx;
6775 }
5d41f0b6
RS
6776 if (indx == 0)
6777 abort ();
b49e97c9
TS
6778 }
6779
5d41f0b6
RS
6780 /* Instead of generating a relocation using the section
6781 symbol, we may as well make it a fully relative
6782 relocation. We want to avoid generating relocations to
6783 local symbols because we used to generate them
6784 incorrectly, without adding the original symbol value,
6785 which is mandated by the ABI for section symbols. In
6786 order to give dynamic loaders and applications time to
6787 phase out the incorrect use, we refrain from emitting
6788 section-relative relocations. It's not like they're
6789 useful, after all. This should be a bit more efficient
6790 as well. */
6791 /* ??? Although this behavior is compatible with glibc's ld.so,
6792 the ABI says that relocations against STN_UNDEF should have
6793 a symbol value of 0. Irix rld honors this, so relocations
6794 against STN_UNDEF have no effect. */
6795 if (!SGI_COMPAT (output_bfd))
6796 indx = 0;
6797 defined_p = TRUE;
b49e97c9
TS
6798 }
6799
5d41f0b6
RS
6800 /* If the relocation was previously an absolute relocation and
6801 this symbol will not be referred to by the relocation, we must
6802 adjust it by the value we give it in the dynamic symbol table.
6803 Otherwise leave the job up to the dynamic linker. */
6804 if (defined_p && r_type != R_MIPS_REL32)
6805 *addendp += symbol;
6806
0a44bf69
RS
6807 if (htab->is_vxworks)
6808 /* VxWorks uses non-relative relocations for this. */
6809 outrel[0].r_info = ELF32_R_INFO (indx, R_MIPS_32);
6810 else
6811 /* The relocation is always an REL32 relocation because we don't
6812 know where the shared library will wind up at load-time. */
6813 outrel[0].r_info = ELF_R_INFO (output_bfd, (unsigned long) indx,
6814 R_MIPS_REL32);
6815
5d41f0b6
RS
6816 /* For strict adherence to the ABI specification, we should
6817 generate a R_MIPS_64 relocation record by itself before the
6818 _REL32/_64 record as well, such that the addend is read in as
6819 a 64-bit value (REL32 is a 32-bit relocation, after all).
6820 However, since none of the existing ELF64 MIPS dynamic
6821 loaders seems to care, we don't waste space with these
6822 artificial relocations. If this turns out to not be true,
6823 mips_elf_allocate_dynamic_relocation() should be tweaked so
6824 as to make room for a pair of dynamic relocations per
6825 invocation if ABI_64_P, and here we should generate an
6826 additional relocation record with R_MIPS_64 by itself for a
6827 NULL symbol before this relocation record. */
6828 outrel[1].r_info = ELF_R_INFO (output_bfd, 0,
6829 ABI_64_P (output_bfd)
6830 ? R_MIPS_64
6831 : R_MIPS_NONE);
6832 outrel[2].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_NONE);
6833
6834 /* Adjust the output offset of the relocation to reference the
6835 correct location in the output file. */
6836 outrel[0].r_offset += (input_section->output_section->vma
6837 + input_section->output_offset);
6838 outrel[1].r_offset += (input_section->output_section->vma
6839 + input_section->output_offset);
6840 outrel[2].r_offset += (input_section->output_section->vma
6841 + input_section->output_offset);
6842
b49e97c9
TS
6843 /* Put the relocation back out. We have to use the special
6844 relocation outputter in the 64-bit case since the 64-bit
6845 relocation format is non-standard. */
6846 if (ABI_64_P (output_bfd))
6847 {
6848 (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
6849 (output_bfd, &outrel[0],
6850 (sreloc->contents
6851 + sreloc->reloc_count * sizeof (Elf64_Mips_External_Rel)));
6852 }
0a44bf69
RS
6853 else if (htab->is_vxworks)
6854 {
6855 /* VxWorks uses RELA rather than REL dynamic relocations. */
6856 outrel[0].r_addend = *addendp;
6857 bfd_elf32_swap_reloca_out
6858 (output_bfd, &outrel[0],
6859 (sreloc->contents
6860 + sreloc->reloc_count * sizeof (Elf32_External_Rela)));
6861 }
b49e97c9 6862 else
947216bf
AM
6863 bfd_elf32_swap_reloc_out
6864 (output_bfd, &outrel[0],
6865 (sreloc->contents + sreloc->reloc_count * sizeof (Elf32_External_Rel)));
b49e97c9 6866
b49e97c9
TS
6867 /* We've now added another relocation. */
6868 ++sreloc->reloc_count;
6869
6870 /* Make sure the output section is writable. The dynamic linker
6871 will be writing to it. */
6872 elf_section_data (input_section->output_section)->this_hdr.sh_flags
6873 |= SHF_WRITE;
6874
6875 /* On IRIX5, make an entry of compact relocation info. */
5d41f0b6 6876 if (IRIX_COMPAT (output_bfd) == ict_irix5)
b49e97c9 6877 {
3d4d4302 6878 asection *scpt = bfd_get_linker_section (dynobj, ".compact_rel");
b49e97c9
TS
6879 bfd_byte *cr;
6880
6881 if (scpt)
6882 {
6883 Elf32_crinfo cptrel;
6884
6885 mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG);
6886 cptrel.vaddr = (rel->r_offset
6887 + input_section->output_section->vma
6888 + input_section->output_offset);
6889 if (r_type == R_MIPS_REL32)
6890 mips_elf_set_cr_type (cptrel, CRT_MIPS_REL32);
6891 else
6892 mips_elf_set_cr_type (cptrel, CRT_MIPS_WORD);
6893 mips_elf_set_cr_dist2to (cptrel, 0);
6894 cptrel.konst = *addendp;
6895
6896 cr = (scpt->contents
6897 + sizeof (Elf32_External_compact_rel));
abc0f8d0 6898 mips_elf_set_cr_relvaddr (cptrel, 0);
b49e97c9
TS
6899 bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
6900 ((Elf32_External_crinfo *) cr
6901 + scpt->reloc_count));
6902 ++scpt->reloc_count;
6903 }
6904 }
6905
943284cc
DJ
6906 /* If we've written this relocation for a readonly section,
6907 we need to set DF_TEXTREL again, so that we do not delete the
6908 DT_TEXTREL tag. */
6909 if (MIPS_ELF_READONLY_SECTION (input_section))
6910 info->flags |= DF_TEXTREL;
6911
b34976b6 6912 return TRUE;
b49e97c9
TS
6913}
6914\f
b49e97c9
TS
6915/* Return the MACH for a MIPS e_flags value. */
6916
6917unsigned long
9719ad41 6918_bfd_elf_mips_mach (flagword flags)
b49e97c9
TS
6919{
6920 switch (flags & EF_MIPS_MACH)
6921 {
6922 case E_MIPS_MACH_3900:
6923 return bfd_mach_mips3900;
6924
6925 case E_MIPS_MACH_4010:
6926 return bfd_mach_mips4010;
6927
6928 case E_MIPS_MACH_4100:
6929 return bfd_mach_mips4100;
6930
6931 case E_MIPS_MACH_4111:
6932 return bfd_mach_mips4111;
6933
00707a0e
RS
6934 case E_MIPS_MACH_4120:
6935 return bfd_mach_mips4120;
6936
b49e97c9
TS
6937 case E_MIPS_MACH_4650:
6938 return bfd_mach_mips4650;
6939
00707a0e
RS
6940 case E_MIPS_MACH_5400:
6941 return bfd_mach_mips5400;
6942
6943 case E_MIPS_MACH_5500:
6944 return bfd_mach_mips5500;
6945
e407c74b
NC
6946 case E_MIPS_MACH_5900:
6947 return bfd_mach_mips5900;
6948
0d2e43ed
ILT
6949 case E_MIPS_MACH_9000:
6950 return bfd_mach_mips9000;
6951
b49e97c9
TS
6952 case E_MIPS_MACH_SB1:
6953 return bfd_mach_mips_sb1;
6954
350cc38d
MS
6955 case E_MIPS_MACH_LS2E:
6956 return bfd_mach_mips_loongson_2e;
6957
6958 case E_MIPS_MACH_LS2F:
6959 return bfd_mach_mips_loongson_2f;
6960
ac8cb70f
CX
6961 case E_MIPS_MACH_GS464:
6962 return bfd_mach_mips_gs464;
fd503541 6963
bd782c07
CX
6964 case E_MIPS_MACH_GS464E:
6965 return bfd_mach_mips_gs464e;
6966
9108bc33
CX
6967 case E_MIPS_MACH_GS264E:
6968 return bfd_mach_mips_gs264e;
6969
2c629856
N
6970 case E_MIPS_MACH_OCTEON3:
6971 return bfd_mach_mips_octeon3;
6972
432233b3
AP
6973 case E_MIPS_MACH_OCTEON2:
6974 return bfd_mach_mips_octeon2;
6975
6f179bd0
AN
6976 case E_MIPS_MACH_OCTEON:
6977 return bfd_mach_mips_octeon;
6978
52b6b6b9
JM
6979 case E_MIPS_MACH_XLR:
6980 return bfd_mach_mips_xlr;
6981
38bf472a
MR
6982 case E_MIPS_MACH_IAMR2:
6983 return bfd_mach_mips_interaptiv_mr2;
6984
b49e97c9
TS
6985 default:
6986 switch (flags & EF_MIPS_ARCH)
6987 {
6988 default:
6989 case E_MIPS_ARCH_1:
6990 return bfd_mach_mips3000;
b49e97c9
TS
6991
6992 case E_MIPS_ARCH_2:
6993 return bfd_mach_mips6000;
b49e97c9
TS
6994
6995 case E_MIPS_ARCH_3:
6996 return bfd_mach_mips4000;
b49e97c9
TS
6997
6998 case E_MIPS_ARCH_4:
6999 return bfd_mach_mips8000;
b49e97c9
TS
7000
7001 case E_MIPS_ARCH_5:
7002 return bfd_mach_mips5;
b49e97c9
TS
7003
7004 case E_MIPS_ARCH_32:
7005 return bfd_mach_mipsisa32;
b49e97c9
TS
7006
7007 case E_MIPS_ARCH_64:
7008 return bfd_mach_mipsisa64;
af7ee8bf
CD
7009
7010 case E_MIPS_ARCH_32R2:
7011 return bfd_mach_mipsisa32r2;
5f74bc13
CD
7012
7013 case E_MIPS_ARCH_64R2:
7014 return bfd_mach_mipsisa64r2;
7361da2c
AB
7015
7016 case E_MIPS_ARCH_32R6:
7017 return bfd_mach_mipsisa32r6;
7018
7019 case E_MIPS_ARCH_64R6:
7020 return bfd_mach_mipsisa64r6;
b49e97c9
TS
7021 }
7022 }
7023
7024 return 0;
7025}
7026
7027/* Return printable name for ABI. */
7028
7029static INLINE char *
9719ad41 7030elf_mips_abi_name (bfd *abfd)
b49e97c9
TS
7031{
7032 flagword flags;
7033
7034 flags = elf_elfheader (abfd)->e_flags;
7035 switch (flags & EF_MIPS_ABI)
7036 {
7037 case 0:
7038 if (ABI_N32_P (abfd))
7039 return "N32";
7040 else if (ABI_64_P (abfd))
7041 return "64";
7042 else
7043 return "none";
7044 case E_MIPS_ABI_O32:
7045 return "O32";
7046 case E_MIPS_ABI_O64:
7047 return "O64";
7048 case E_MIPS_ABI_EABI32:
7049 return "EABI32";
7050 case E_MIPS_ABI_EABI64:
7051 return "EABI64";
7052 default:
7053 return "unknown abi";
7054 }
7055}
7056\f
7057/* MIPS ELF uses two common sections. One is the usual one, and the
7058 other is for small objects. All the small objects are kept
7059 together, and then referenced via the gp pointer, which yields
7060 faster assembler code. This is what we use for the small common
7061 section. This approach is copied from ecoff.c. */
7062static asection mips_elf_scom_section;
7063static asymbol mips_elf_scom_symbol;
7064static asymbol *mips_elf_scom_symbol_ptr;
7065
7066/* MIPS ELF also uses an acommon section, which represents an
7067 allocated common symbol which may be overridden by a
7068 definition in a shared library. */
7069static asection mips_elf_acom_section;
7070static asymbol mips_elf_acom_symbol;
7071static asymbol *mips_elf_acom_symbol_ptr;
7072
738e5348 7073/* This is used for both the 32-bit and the 64-bit ABI. */
b49e97c9
TS
7074
7075void
9719ad41 7076_bfd_mips_elf_symbol_processing (bfd *abfd, asymbol *asym)
b49e97c9
TS
7077{
7078 elf_symbol_type *elfsym;
7079
738e5348 7080 /* Handle the special MIPS section numbers that a symbol may use. */
b49e97c9
TS
7081 elfsym = (elf_symbol_type *) asym;
7082 switch (elfsym->internal_elf_sym.st_shndx)
7083 {
7084 case SHN_MIPS_ACOMMON:
7085 /* This section is used in a dynamically linked executable file.
7086 It is an allocated common section. The dynamic linker can
7087 either resolve these symbols to something in a shared
7088 library, or it can just leave them here. For our purposes,
7089 we can consider these symbols to be in a new section. */
7090 if (mips_elf_acom_section.name == NULL)
7091 {
7092 /* Initialize the acommon section. */
7093 mips_elf_acom_section.name = ".acommon";
7094 mips_elf_acom_section.flags = SEC_ALLOC;
7095 mips_elf_acom_section.output_section = &mips_elf_acom_section;
7096 mips_elf_acom_section.symbol = &mips_elf_acom_symbol;
7097 mips_elf_acom_section.symbol_ptr_ptr = &mips_elf_acom_symbol_ptr;
7098 mips_elf_acom_symbol.name = ".acommon";
7099 mips_elf_acom_symbol.flags = BSF_SECTION_SYM;
7100 mips_elf_acom_symbol.section = &mips_elf_acom_section;
7101 mips_elf_acom_symbol_ptr = &mips_elf_acom_symbol;
7102 }
7103 asym->section = &mips_elf_acom_section;
7104 break;
7105
7106 case SHN_COMMON:
7107 /* Common symbols less than the GP size are automatically
7108 treated as SHN_MIPS_SCOMMON symbols on IRIX5. */
7109 if (asym->value > elf_gp_size (abfd)
b59eed79 7110 || ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_TLS
b49e97c9
TS
7111 || IRIX_COMPAT (abfd) == ict_irix6)
7112 break;
7113 /* Fall through. */
7114 case SHN_MIPS_SCOMMON:
7115 if (mips_elf_scom_section.name == NULL)
7116 {
7117 /* Initialize the small common section. */
7118 mips_elf_scom_section.name = ".scommon";
7119 mips_elf_scom_section.flags = SEC_IS_COMMON;
7120 mips_elf_scom_section.output_section = &mips_elf_scom_section;
7121 mips_elf_scom_section.symbol = &mips_elf_scom_symbol;
7122 mips_elf_scom_section.symbol_ptr_ptr = &mips_elf_scom_symbol_ptr;
7123 mips_elf_scom_symbol.name = ".scommon";
7124 mips_elf_scom_symbol.flags = BSF_SECTION_SYM;
7125 mips_elf_scom_symbol.section = &mips_elf_scom_section;
7126 mips_elf_scom_symbol_ptr = &mips_elf_scom_symbol;
7127 }
7128 asym->section = &mips_elf_scom_section;
7129 asym->value = elfsym->internal_elf_sym.st_size;
7130 break;
7131
7132 case SHN_MIPS_SUNDEFINED:
7133 asym->section = bfd_und_section_ptr;
7134 break;
7135
b49e97c9 7136 case SHN_MIPS_TEXT:
00b4930b
TS
7137 {
7138 asection *section = bfd_get_section_by_name (abfd, ".text");
7139
00b4930b
TS
7140 if (section != NULL)
7141 {
7142 asym->section = section;
7143 /* MIPS_TEXT is a bit special, the address is not an offset
de194d85 7144 to the base of the .text section. So subtract the section
00b4930b
TS
7145 base address to make it an offset. */
7146 asym->value -= section->vma;
7147 }
7148 }
b49e97c9
TS
7149 break;
7150
7151 case SHN_MIPS_DATA:
00b4930b
TS
7152 {
7153 asection *section = bfd_get_section_by_name (abfd, ".data");
7154
00b4930b
TS
7155 if (section != NULL)
7156 {
7157 asym->section = section;
7158 /* MIPS_DATA is a bit special, the address is not an offset
de194d85 7159 to the base of the .data section. So subtract the section
00b4930b
TS
7160 base address to make it an offset. */
7161 asym->value -= section->vma;
7162 }
7163 }
b49e97c9 7164 break;
b49e97c9 7165 }
738e5348 7166
df58fc94
RS
7167 /* If this is an odd-valued function symbol, assume it's a MIPS16
7168 or microMIPS one. */
738e5348
RS
7169 if (ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_FUNC
7170 && (asym->value & 1) != 0)
7171 {
7172 asym->value--;
e8faf7d1 7173 if (MICROMIPS_P (abfd))
df58fc94
RS
7174 elfsym->internal_elf_sym.st_other
7175 = ELF_ST_SET_MICROMIPS (elfsym->internal_elf_sym.st_other);
7176 else
7177 elfsym->internal_elf_sym.st_other
7178 = ELF_ST_SET_MIPS16 (elfsym->internal_elf_sym.st_other);
738e5348 7179 }
b49e97c9
TS
7180}
7181\f
8c946ed5
RS
7182/* Implement elf_backend_eh_frame_address_size. This differs from
7183 the default in the way it handles EABI64.
7184
7185 EABI64 was originally specified as an LP64 ABI, and that is what
7186 -mabi=eabi normally gives on a 64-bit target. However, gcc has
7187 historically accepted the combination of -mabi=eabi and -mlong32,
7188 and this ILP32 variation has become semi-official over time.
7189 Both forms use elf32 and have pointer-sized FDE addresses.
7190
7191 If an EABI object was generated by GCC 4.0 or above, it will have
7192 an empty .gcc_compiled_longXX section, where XX is the size of longs
7193 in bits. Unfortunately, ILP32 objects generated by earlier compilers
7194 have no special marking to distinguish them from LP64 objects.
7195
7196 We don't want users of the official LP64 ABI to be punished for the
7197 existence of the ILP32 variant, but at the same time, we don't want
7198 to mistakenly interpret pre-4.0 ILP32 objects as being LP64 objects.
7199 We therefore take the following approach:
7200
7201 - If ABFD contains a .gcc_compiled_longXX section, use it to
07d6d2b8 7202 determine the pointer size.
8c946ed5
RS
7203
7204 - Otherwise check the type of the first relocation. Assume that
07d6d2b8 7205 the LP64 ABI is being used if the relocation is of type R_MIPS_64.
8c946ed5
RS
7206
7207 - Otherwise punt.
7208
7209 The second check is enough to detect LP64 objects generated by pre-4.0
7210 compilers because, in the kind of output generated by those compilers,
7211 the first relocation will be associated with either a CIE personality
7212 routine or an FDE start address. Furthermore, the compilers never
7213 used a special (non-pointer) encoding for this ABI.
7214
7215 Checking the relocation type should also be safe because there is no
7216 reason to use R_MIPS_64 in an ILP32 object. Pre-4.0 compilers never
7217 did so. */
7218
7219unsigned int
76c20d54 7220_bfd_mips_elf_eh_frame_address_size (bfd *abfd, const asection *sec)
8c946ed5
RS
7221{
7222 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
7223 return 8;
7224 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64)
7225 {
7226 bfd_boolean long32_p, long64_p;
7227
7228 long32_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long32") != 0;
7229 long64_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long64") != 0;
7230 if (long32_p && long64_p)
7231 return 0;
7232 if (long32_p)
7233 return 4;
7234 if (long64_p)
7235 return 8;
7236
7237 if (sec->reloc_count > 0
7238 && elf_section_data (sec)->relocs != NULL
7239 && (ELF32_R_TYPE (elf_section_data (sec)->relocs[0].r_info)
7240 == R_MIPS_64))
7241 return 8;
7242
7243 return 0;
7244 }
7245 return 4;
7246}
7247\f
174fd7f9
RS
7248/* There appears to be a bug in the MIPSpro linker that causes GOT_DISP
7249 relocations against two unnamed section symbols to resolve to the
7250 same address. For example, if we have code like:
7251
7252 lw $4,%got_disp(.data)($gp)
7253 lw $25,%got_disp(.text)($gp)
7254 jalr $25
7255
7256 then the linker will resolve both relocations to .data and the program
7257 will jump there rather than to .text.
7258
7259 We can work around this problem by giving names to local section symbols.
7260 This is also what the MIPSpro tools do. */
7261
7262bfd_boolean
7263_bfd_mips_elf_name_local_section_symbols (bfd *abfd)
7264{
7265 return SGI_COMPAT (abfd);
7266}
7267\f
b49e97c9
TS
7268/* Work over a section just before writing it out. This routine is
7269 used by both the 32-bit and the 64-bit ABI. FIXME: We recognize
7270 sections that need the SHF_MIPS_GPREL flag by name; there has to be
7271 a better way. */
7272
b34976b6 7273bfd_boolean
9719ad41 7274_bfd_mips_elf_section_processing (bfd *abfd, Elf_Internal_Shdr *hdr)
b49e97c9
TS
7275{
7276 if (hdr->sh_type == SHT_MIPS_REGINFO
7277 && hdr->sh_size > 0)
7278 {
7279 bfd_byte buf[4];
7280
b49e97c9
TS
7281 BFD_ASSERT (hdr->contents == NULL);
7282
2d6dda71
MR
7283 if (hdr->sh_size != sizeof (Elf32_External_RegInfo))
7284 {
7285 _bfd_error_handler
2c1c9679 7286 (_("%pB: incorrect `.reginfo' section size; "
2dcf00ce
AM
7287 "expected %" PRIu64 ", got %" PRIu64),
7288 abfd, (uint64_t) sizeof (Elf32_External_RegInfo),
7289 (uint64_t) hdr->sh_size);
2d6dda71
MR
7290 bfd_set_error (bfd_error_bad_value);
7291 return FALSE;
7292 }
7293
b49e97c9
TS
7294 if (bfd_seek (abfd,
7295 hdr->sh_offset + sizeof (Elf32_External_RegInfo) - 4,
7296 SEEK_SET) != 0)
b34976b6 7297 return FALSE;
b49e97c9 7298 H_PUT_32 (abfd, elf_gp (abfd), buf);
9719ad41 7299 if (bfd_bwrite (buf, 4, abfd) != 4)
b34976b6 7300 return FALSE;
b49e97c9
TS
7301 }
7302
7303 if (hdr->sh_type == SHT_MIPS_OPTIONS
7304 && hdr->bfd_section != NULL
f0abc2a1
AM
7305 && mips_elf_section_data (hdr->bfd_section) != NULL
7306 && mips_elf_section_data (hdr->bfd_section)->u.tdata != NULL)
b49e97c9
TS
7307 {
7308 bfd_byte *contents, *l, *lend;
7309
f0abc2a1
AM
7310 /* We stored the section contents in the tdata field in the
7311 set_section_contents routine. We save the section contents
7312 so that we don't have to read them again.
b49e97c9
TS
7313 At this point we know that elf_gp is set, so we can look
7314 through the section contents to see if there is an
7315 ODK_REGINFO structure. */
7316
f0abc2a1 7317 contents = mips_elf_section_data (hdr->bfd_section)->u.tdata;
b49e97c9
TS
7318 l = contents;
7319 lend = contents + hdr->sh_size;
7320 while (l + sizeof (Elf_External_Options) <= lend)
7321 {
7322 Elf_Internal_Options intopt;
7323
7324 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
7325 &intopt);
1bc8074d
MR
7326 if (intopt.size < sizeof (Elf_External_Options))
7327 {
4eca0228 7328 _bfd_error_handler
695344c0 7329 /* xgettext:c-format */
2c1c9679 7330 (_("%pB: warning: bad `%s' option size %u smaller than"
63a5468a 7331 " its header"),
1bc8074d
MR
7332 abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd), intopt.size);
7333 break;
7334 }
b49e97c9
TS
7335 if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
7336 {
7337 bfd_byte buf[8];
7338
7339 if (bfd_seek (abfd,
7340 (hdr->sh_offset
7341 + (l - contents)
7342 + sizeof (Elf_External_Options)
7343 + (sizeof (Elf64_External_RegInfo) - 8)),
7344 SEEK_SET) != 0)
b34976b6 7345 return FALSE;
b49e97c9 7346 H_PUT_64 (abfd, elf_gp (abfd), buf);
9719ad41 7347 if (bfd_bwrite (buf, 8, abfd) != 8)
b34976b6 7348 return FALSE;
b49e97c9
TS
7349 }
7350 else if (intopt.kind == ODK_REGINFO)
7351 {
7352 bfd_byte buf[4];
7353
7354 if (bfd_seek (abfd,
7355 (hdr->sh_offset
7356 + (l - contents)
7357 + sizeof (Elf_External_Options)
7358 + (sizeof (Elf32_External_RegInfo) - 4)),
7359 SEEK_SET) != 0)
b34976b6 7360 return FALSE;
b49e97c9 7361 H_PUT_32 (abfd, elf_gp (abfd), buf);
9719ad41 7362 if (bfd_bwrite (buf, 4, abfd) != 4)
b34976b6 7363 return FALSE;
b49e97c9
TS
7364 }
7365 l += intopt.size;
7366 }
7367 }
7368
7369 if (hdr->bfd_section != NULL)
7370 {
fd361982 7371 const char *name = bfd_section_name (hdr->bfd_section);
b49e97c9 7372
2d0f9ad9
JM
7373 /* .sbss is not handled specially here because the GNU/Linux
7374 prelinker can convert .sbss from NOBITS to PROGBITS and
7375 changing it back to NOBITS breaks the binary. The entry in
7376 _bfd_mips_elf_special_sections will ensure the correct flags
7377 are set on .sbss if BFD creates it without reading it from an
7378 input file, and without special handling here the flags set
7379 on it in an input file will be followed. */
b49e97c9
TS
7380 if (strcmp (name, ".sdata") == 0
7381 || strcmp (name, ".lit8") == 0
7382 || strcmp (name, ".lit4") == 0)
fd6f9d17 7383 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
b49e97c9 7384 else if (strcmp (name, ".srdata") == 0)
fd6f9d17 7385 hdr->sh_flags |= SHF_ALLOC | SHF_MIPS_GPREL;
b49e97c9 7386 else if (strcmp (name, ".compact_rel") == 0)
fd6f9d17 7387 hdr->sh_flags = 0;
b49e97c9
TS
7388 else if (strcmp (name, ".rtproc") == 0)
7389 {
7390 if (hdr->sh_addralign != 0 && hdr->sh_entsize == 0)
7391 {
7392 unsigned int adjust;
7393
7394 adjust = hdr->sh_size % hdr->sh_addralign;
7395 if (adjust != 0)
7396 hdr->sh_size += hdr->sh_addralign - adjust;
7397 }
7398 }
7399 }
7400
b34976b6 7401 return TRUE;
b49e97c9
TS
7402}
7403
7404/* Handle a MIPS specific section when reading an object file. This
7405 is called when elfcode.h finds a section with an unknown type.
bf577467 7406 This routine supports both the 32-bit and 64-bit ELF ABI. */
b49e97c9 7407
b34976b6 7408bfd_boolean
6dc132d9
L
7409_bfd_mips_elf_section_from_shdr (bfd *abfd,
7410 Elf_Internal_Shdr *hdr,
7411 const char *name,
7412 int shindex)
b49e97c9
TS
7413{
7414 flagword flags = 0;
7415
7416 /* There ought to be a place to keep ELF backend specific flags, but
7417 at the moment there isn't one. We just keep track of the
7418 sections by their name, instead. Fortunately, the ABI gives
7419 suggested names for all the MIPS specific sections, so we will
7420 probably get away with this. */
7421 switch (hdr->sh_type)
7422 {
7423 case SHT_MIPS_LIBLIST:
7424 if (strcmp (name, ".liblist") != 0)
b34976b6 7425 return FALSE;
b49e97c9
TS
7426 break;
7427 case SHT_MIPS_MSYM:
7428 if (strcmp (name, ".msym") != 0)
b34976b6 7429 return FALSE;
b49e97c9
TS
7430 break;
7431 case SHT_MIPS_CONFLICT:
7432 if (strcmp (name, ".conflict") != 0)
b34976b6 7433 return FALSE;
b49e97c9
TS
7434 break;
7435 case SHT_MIPS_GPTAB:
0112cd26 7436 if (! CONST_STRNEQ (name, ".gptab."))
b34976b6 7437 return FALSE;
b49e97c9
TS
7438 break;
7439 case SHT_MIPS_UCODE:
7440 if (strcmp (name, ".ucode") != 0)
b34976b6 7441 return FALSE;
b49e97c9
TS
7442 break;
7443 case SHT_MIPS_DEBUG:
7444 if (strcmp (name, ".mdebug") != 0)
b34976b6 7445 return FALSE;
b49e97c9
TS
7446 flags = SEC_DEBUGGING;
7447 break;
7448 case SHT_MIPS_REGINFO:
7449 if (strcmp (name, ".reginfo") != 0
7450 || hdr->sh_size != sizeof (Elf32_External_RegInfo))
b34976b6 7451 return FALSE;
b49e97c9
TS
7452 flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
7453 break;
7454 case SHT_MIPS_IFACE:
7455 if (strcmp (name, ".MIPS.interfaces") != 0)
b34976b6 7456 return FALSE;
b49e97c9
TS
7457 break;
7458 case SHT_MIPS_CONTENT:
0112cd26 7459 if (! CONST_STRNEQ (name, ".MIPS.content"))
b34976b6 7460 return FALSE;
b49e97c9
TS
7461 break;
7462 case SHT_MIPS_OPTIONS:
cc2e31b9 7463 if (!MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
b34976b6 7464 return FALSE;
b49e97c9 7465 break;
351cdf24
MF
7466 case SHT_MIPS_ABIFLAGS:
7467 if (!MIPS_ELF_ABIFLAGS_SECTION_NAME_P (name))
7468 return FALSE;
7469 flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
7470 break;
b49e97c9 7471 case SHT_MIPS_DWARF:
1b315056 7472 if (! CONST_STRNEQ (name, ".debug_")
07d6d2b8 7473 && ! CONST_STRNEQ (name, ".zdebug_"))
b34976b6 7474 return FALSE;
b49e97c9
TS
7475 break;
7476 case SHT_MIPS_SYMBOL_LIB:
7477 if (strcmp (name, ".MIPS.symlib") != 0)
b34976b6 7478 return FALSE;
b49e97c9
TS
7479 break;
7480 case SHT_MIPS_EVENTS:
0112cd26
NC
7481 if (! CONST_STRNEQ (name, ".MIPS.events")
7482 && ! CONST_STRNEQ (name, ".MIPS.post_rel"))
b34976b6 7483 return FALSE;
b49e97c9 7484 break;
f16a9783
MS
7485 case SHT_MIPS_XHASH:
7486 if (strcmp (name, ".MIPS.xhash") != 0)
7487 return FALSE;
b49e97c9 7488 default:
cc2e31b9 7489 break;
b49e97c9
TS
7490 }
7491
6dc132d9 7492 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
b34976b6 7493 return FALSE;
b49e97c9 7494
bf577467
AM
7495 if (hdr->sh_flags & SHF_MIPS_GPREL)
7496 flags |= SEC_SMALL_DATA;
7497
b49e97c9
TS
7498 if (flags)
7499 {
fd361982
AM
7500 if (!bfd_set_section_flags (hdr->bfd_section,
7501 (bfd_section_flags (hdr->bfd_section)
7502 | flags)))
b34976b6 7503 return FALSE;
b49e97c9
TS
7504 }
7505
351cdf24
MF
7506 if (hdr->sh_type == SHT_MIPS_ABIFLAGS)
7507 {
7508 Elf_External_ABIFlags_v0 ext;
7509
7510 if (! bfd_get_section_contents (abfd, hdr->bfd_section,
7511 &ext, 0, sizeof ext))
7512 return FALSE;
7513 bfd_mips_elf_swap_abiflags_v0_in (abfd, &ext,
7514 &mips_elf_tdata (abfd)->abiflags);
7515 if (mips_elf_tdata (abfd)->abiflags.version != 0)
7516 return FALSE;
7517 mips_elf_tdata (abfd)->abiflags_valid = TRUE;
7518 }
7519
b49e97c9
TS
7520 /* FIXME: We should record sh_info for a .gptab section. */
7521
7522 /* For a .reginfo section, set the gp value in the tdata information
7523 from the contents of this section. We need the gp value while
7524 processing relocs, so we just get it now. The .reginfo section
7525 is not used in the 64-bit MIPS ELF ABI. */
7526 if (hdr->sh_type == SHT_MIPS_REGINFO)
7527 {
7528 Elf32_External_RegInfo ext;
7529 Elf32_RegInfo s;
7530
9719ad41
RS
7531 if (! bfd_get_section_contents (abfd, hdr->bfd_section,
7532 &ext, 0, sizeof ext))
b34976b6 7533 return FALSE;
b49e97c9
TS
7534 bfd_mips_elf32_swap_reginfo_in (abfd, &ext, &s);
7535 elf_gp (abfd) = s.ri_gp_value;
7536 }
7537
7538 /* For a SHT_MIPS_OPTIONS section, look for a ODK_REGINFO entry, and
7539 set the gp value based on what we find. We may see both
7540 SHT_MIPS_REGINFO and SHT_MIPS_OPTIONS/ODK_REGINFO; in that case,
7541 they should agree. */
7542 if (hdr->sh_type == SHT_MIPS_OPTIONS)
7543 {
7544 bfd_byte *contents, *l, *lend;
7545
9719ad41 7546 contents = bfd_malloc (hdr->sh_size);
b49e97c9 7547 if (contents == NULL)
b34976b6 7548 return FALSE;
b49e97c9 7549 if (! bfd_get_section_contents (abfd, hdr->bfd_section, contents,
9719ad41 7550 0, hdr->sh_size))
b49e97c9
TS
7551 {
7552 free (contents);
b34976b6 7553 return FALSE;
b49e97c9
TS
7554 }
7555 l = contents;
7556 lend = contents + hdr->sh_size;
7557 while (l + sizeof (Elf_External_Options) <= lend)
7558 {
7559 Elf_Internal_Options intopt;
7560
7561 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
7562 &intopt);
1bc8074d
MR
7563 if (intopt.size < sizeof (Elf_External_Options))
7564 {
4eca0228 7565 _bfd_error_handler
695344c0 7566 /* xgettext:c-format */
2c1c9679 7567 (_("%pB: warning: bad `%s' option size %u smaller than"
63a5468a 7568 " its header"),
1bc8074d
MR
7569 abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd), intopt.size);
7570 break;
7571 }
b49e97c9
TS
7572 if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
7573 {
7574 Elf64_Internal_RegInfo intreg;
7575
7576 bfd_mips_elf64_swap_reginfo_in
7577 (abfd,
7578 ((Elf64_External_RegInfo *)
7579 (l + sizeof (Elf_External_Options))),
7580 &intreg);
7581 elf_gp (abfd) = intreg.ri_gp_value;
7582 }
7583 else if (intopt.kind == ODK_REGINFO)
7584 {
7585 Elf32_RegInfo intreg;
7586
7587 bfd_mips_elf32_swap_reginfo_in
7588 (abfd,
7589 ((Elf32_External_RegInfo *)
7590 (l + sizeof (Elf_External_Options))),
7591 &intreg);
7592 elf_gp (abfd) = intreg.ri_gp_value;
7593 }
7594 l += intopt.size;
7595 }
7596 free (contents);
7597 }
7598
b34976b6 7599 return TRUE;
b49e97c9
TS
7600}
7601
7602/* Set the correct type for a MIPS ELF section. We do this by the
7603 section name, which is a hack, but ought to work. This routine is
7604 used by both the 32-bit and the 64-bit ABI. */
7605
b34976b6 7606bfd_boolean
9719ad41 7607_bfd_mips_elf_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
b49e97c9 7608{
fd361982 7609 const char *name = bfd_section_name (sec);
b49e97c9
TS
7610
7611 if (strcmp (name, ".liblist") == 0)
7612 {
7613 hdr->sh_type = SHT_MIPS_LIBLIST;
eea6121a 7614 hdr->sh_info = sec->size / sizeof (Elf32_Lib);
b49e97c9
TS
7615 /* The sh_link field is set in final_write_processing. */
7616 }
7617 else if (strcmp (name, ".conflict") == 0)
7618 hdr->sh_type = SHT_MIPS_CONFLICT;
0112cd26 7619 else if (CONST_STRNEQ (name, ".gptab."))
b49e97c9
TS
7620 {
7621 hdr->sh_type = SHT_MIPS_GPTAB;
7622 hdr->sh_entsize = sizeof (Elf32_External_gptab);
7623 /* The sh_info field is set in final_write_processing. */
7624 }
7625 else if (strcmp (name, ".ucode") == 0)
7626 hdr->sh_type = SHT_MIPS_UCODE;
7627 else if (strcmp (name, ".mdebug") == 0)
7628 {
7629 hdr->sh_type = SHT_MIPS_DEBUG;
8dc1a139 7630 /* In a shared object on IRIX 5.3, the .mdebug section has an
07d6d2b8 7631 entsize of 0. FIXME: Does this matter? */
b49e97c9
TS
7632 if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0)
7633 hdr->sh_entsize = 0;
7634 else
7635 hdr->sh_entsize = 1;
7636 }
7637 else if (strcmp (name, ".reginfo") == 0)
7638 {
7639 hdr->sh_type = SHT_MIPS_REGINFO;
8dc1a139 7640 /* In a shared object on IRIX 5.3, the .reginfo section has an
07d6d2b8 7641 entsize of 0x18. FIXME: Does this matter? */
b49e97c9
TS
7642 if (SGI_COMPAT (abfd))
7643 {
7644 if ((abfd->flags & DYNAMIC) != 0)
7645 hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
7646 else
7647 hdr->sh_entsize = 1;
7648 }
7649 else
7650 hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
7651 }
7652 else if (SGI_COMPAT (abfd)
7653 && (strcmp (name, ".hash") == 0
7654 || strcmp (name, ".dynamic") == 0
7655 || strcmp (name, ".dynstr") == 0))
7656 {
7657 if (SGI_COMPAT (abfd))
7658 hdr->sh_entsize = 0;
7659#if 0
8dc1a139 7660 /* This isn't how the IRIX6 linker behaves. */
b49e97c9
TS
7661 hdr->sh_info = SIZEOF_MIPS_DYNSYM_SECNAMES;
7662#endif
7663 }
7664 else if (strcmp (name, ".got") == 0
7665 || strcmp (name, ".srdata") == 0
7666 || strcmp (name, ".sdata") == 0
7667 || strcmp (name, ".sbss") == 0
7668 || strcmp (name, ".lit4") == 0
7669 || strcmp (name, ".lit8") == 0)
7670 hdr->sh_flags |= SHF_MIPS_GPREL;
7671 else if (strcmp (name, ".MIPS.interfaces") == 0)
7672 {
7673 hdr->sh_type = SHT_MIPS_IFACE;
7674 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7675 }
0112cd26 7676 else if (CONST_STRNEQ (name, ".MIPS.content"))
b49e97c9
TS
7677 {
7678 hdr->sh_type = SHT_MIPS_CONTENT;
7679 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7680 /* The sh_info field is set in final_write_processing. */
7681 }
cc2e31b9 7682 else if (MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
b49e97c9
TS
7683 {
7684 hdr->sh_type = SHT_MIPS_OPTIONS;
7685 hdr->sh_entsize = 1;
7686 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7687 }
351cdf24
MF
7688 else if (CONST_STRNEQ (name, ".MIPS.abiflags"))
7689 {
7690 hdr->sh_type = SHT_MIPS_ABIFLAGS;
7691 hdr->sh_entsize = sizeof (Elf_External_ABIFlags_v0);
7692 }
1b315056 7693 else if (CONST_STRNEQ (name, ".debug_")
07d6d2b8 7694 || CONST_STRNEQ (name, ".zdebug_"))
b5482f21
NC
7695 {
7696 hdr->sh_type = SHT_MIPS_DWARF;
7697
7698 /* Irix facilities such as libexc expect a single .debug_frame
7699 per executable, the system ones have NOSTRIP set and the linker
7700 doesn't merge sections with different flags so ... */
7701 if (SGI_COMPAT (abfd) && CONST_STRNEQ (name, ".debug_frame"))
7702 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7703 }
b49e97c9
TS
7704 else if (strcmp (name, ".MIPS.symlib") == 0)
7705 {
7706 hdr->sh_type = SHT_MIPS_SYMBOL_LIB;
7707 /* The sh_link and sh_info fields are set in
07d6d2b8 7708 final_write_processing. */
b49e97c9 7709 }
0112cd26
NC
7710 else if (CONST_STRNEQ (name, ".MIPS.events")
7711 || CONST_STRNEQ (name, ".MIPS.post_rel"))
b49e97c9
TS
7712 {
7713 hdr->sh_type = SHT_MIPS_EVENTS;
7714 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7715 /* The sh_link field is set in final_write_processing. */
7716 }
7717 else if (strcmp (name, ".msym") == 0)
7718 {
7719 hdr->sh_type = SHT_MIPS_MSYM;
7720 hdr->sh_flags |= SHF_ALLOC;
7721 hdr->sh_entsize = 8;
7722 }
f16a9783
MS
7723 else if (strcmp (name, ".MIPS.xhash") == 0)
7724 {
7725 hdr->sh_type = SHT_MIPS_XHASH;
7726 hdr->sh_flags |= SHF_ALLOC;
7727 hdr->sh_entsize = get_elf_backend_data(abfd)->s->arch_size == 64 ? 0 : 4;
7728 }
b49e97c9 7729
7a79a000
TS
7730 /* The generic elf_fake_sections will set up REL_HDR using the default
7731 kind of relocations. We used to set up a second header for the
7732 non-default kind of relocations here, but only NewABI would use
7733 these, and the IRIX ld doesn't like resulting empty RELA sections.
7734 Thus we create those header only on demand now. */
b49e97c9 7735
b34976b6 7736 return TRUE;
b49e97c9
TS
7737}
7738
7739/* Given a BFD section, try to locate the corresponding ELF section
7740 index. This is used by both the 32-bit and the 64-bit ABI.
7741 Actually, it's not clear to me that the 64-bit ABI supports these,
7742 but for non-PIC objects we will certainly want support for at least
7743 the .scommon section. */
7744
b34976b6 7745bfd_boolean
9719ad41
RS
7746_bfd_mips_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
7747 asection *sec, int *retval)
b49e97c9 7748{
fd361982 7749 if (strcmp (bfd_section_name (sec), ".scommon") == 0)
b49e97c9
TS
7750 {
7751 *retval = SHN_MIPS_SCOMMON;
b34976b6 7752 return TRUE;
b49e97c9 7753 }
fd361982 7754 if (strcmp (bfd_section_name (sec), ".acommon") == 0)
b49e97c9
TS
7755 {
7756 *retval = SHN_MIPS_ACOMMON;
b34976b6 7757 return TRUE;
b49e97c9 7758 }
b34976b6 7759 return FALSE;
b49e97c9
TS
7760}
7761\f
7762/* Hook called by the linker routine which adds symbols from an object
7763 file. We must handle the special MIPS section numbers here. */
7764
b34976b6 7765bfd_boolean
9719ad41 7766_bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
555cd476 7767 Elf_Internal_Sym *sym, const char **namep,
9719ad41
RS
7768 flagword *flagsp ATTRIBUTE_UNUSED,
7769 asection **secp, bfd_vma *valp)
b49e97c9
TS
7770{
7771 if (SGI_COMPAT (abfd)
7772 && (abfd->flags & DYNAMIC) != 0
7773 && strcmp (*namep, "_rld_new_interface") == 0)
7774 {
8dc1a139 7775 /* Skip IRIX5 rld entry name. */
b49e97c9 7776 *namep = NULL;
b34976b6 7777 return TRUE;
b49e97c9
TS
7778 }
7779
eedecc07
DD
7780 /* Shared objects may have a dynamic symbol '_gp_disp' defined as
7781 a SECTION *ABS*. This causes ld to think it can resolve _gp_disp
7782 by setting a DT_NEEDED for the shared object. Since _gp_disp is
7783 a magic symbol resolved by the linker, we ignore this bogus definition
7784 of _gp_disp. New ABI objects do not suffer from this problem so this
7785 is not done for them. */
7786 if (!NEWABI_P(abfd)
7787 && (sym->st_shndx == SHN_ABS)
7788 && (strcmp (*namep, "_gp_disp") == 0))
7789 {
7790 *namep = NULL;
7791 return TRUE;
7792 }
7793
b49e97c9
TS
7794 switch (sym->st_shndx)
7795 {
7796 case SHN_COMMON:
7797 /* Common symbols less than the GP size are automatically
7798 treated as SHN_MIPS_SCOMMON symbols. */
7799 if (sym->st_size > elf_gp_size (abfd)
b59eed79 7800 || ELF_ST_TYPE (sym->st_info) == STT_TLS
b49e97c9
TS
7801 || IRIX_COMPAT (abfd) == ict_irix6)
7802 break;
7803 /* Fall through. */
7804 case SHN_MIPS_SCOMMON:
7805 *secp = bfd_make_section_old_way (abfd, ".scommon");
7806 (*secp)->flags |= SEC_IS_COMMON;
7807 *valp = sym->st_size;
7808 break;
7809
7810 case SHN_MIPS_TEXT:
7811 /* This section is used in a shared object. */
698600e4 7812 if (mips_elf_tdata (abfd)->elf_text_section == NULL)
b49e97c9
TS
7813 {
7814 asymbol *elf_text_symbol;
7815 asection *elf_text_section;
986f0783 7816 size_t amt = sizeof (asection);
b49e97c9
TS
7817
7818 elf_text_section = bfd_zalloc (abfd, amt);
7819 if (elf_text_section == NULL)
b34976b6 7820 return FALSE;
b49e97c9
TS
7821
7822 amt = sizeof (asymbol);
7823 elf_text_symbol = bfd_zalloc (abfd, amt);
7824 if (elf_text_symbol == NULL)
b34976b6 7825 return FALSE;
b49e97c9
TS
7826
7827 /* Initialize the section. */
7828
698600e4
AM
7829 mips_elf_tdata (abfd)->elf_text_section = elf_text_section;
7830 mips_elf_tdata (abfd)->elf_text_symbol = elf_text_symbol;
b49e97c9
TS
7831
7832 elf_text_section->symbol = elf_text_symbol;
698600e4 7833 elf_text_section->symbol_ptr_ptr = &mips_elf_tdata (abfd)->elf_text_symbol;
b49e97c9
TS
7834
7835 elf_text_section->name = ".text";
7836 elf_text_section->flags = SEC_NO_FLAGS;
7837 elf_text_section->output_section = NULL;
7838 elf_text_section->owner = abfd;
7839 elf_text_symbol->name = ".text";
7840 elf_text_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
7841 elf_text_symbol->section = elf_text_section;
7842 }
7843 /* This code used to do *secp = bfd_und_section_ptr if
07d6d2b8
AM
7844 bfd_link_pic (info). I don't know why, and that doesn't make sense,
7845 so I took it out. */
698600e4 7846 *secp = mips_elf_tdata (abfd)->elf_text_section;
b49e97c9
TS
7847 break;
7848
7849 case SHN_MIPS_ACOMMON:
7850 /* Fall through. XXX Can we treat this as allocated data? */
7851 case SHN_MIPS_DATA:
7852 /* This section is used in a shared object. */
698600e4 7853 if (mips_elf_tdata (abfd)->elf_data_section == NULL)
b49e97c9
TS
7854 {
7855 asymbol *elf_data_symbol;
7856 asection *elf_data_section;
986f0783 7857 size_t amt = sizeof (asection);
b49e97c9
TS
7858
7859 elf_data_section = bfd_zalloc (abfd, amt);
7860 if (elf_data_section == NULL)
b34976b6 7861 return FALSE;
b49e97c9
TS
7862
7863 amt = sizeof (asymbol);
7864 elf_data_symbol = bfd_zalloc (abfd, amt);
7865 if (elf_data_symbol == NULL)
b34976b6 7866 return FALSE;
b49e97c9
TS
7867
7868 /* Initialize the section. */
7869
698600e4
AM
7870 mips_elf_tdata (abfd)->elf_data_section = elf_data_section;
7871 mips_elf_tdata (abfd)->elf_data_symbol = elf_data_symbol;
b49e97c9
TS
7872
7873 elf_data_section->symbol = elf_data_symbol;
698600e4 7874 elf_data_section->symbol_ptr_ptr = &mips_elf_tdata (abfd)->elf_data_symbol;
b49e97c9
TS
7875
7876 elf_data_section->name = ".data";
7877 elf_data_section->flags = SEC_NO_FLAGS;
7878 elf_data_section->output_section = NULL;
7879 elf_data_section->owner = abfd;
7880 elf_data_symbol->name = ".data";
7881 elf_data_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
7882 elf_data_symbol->section = elf_data_section;
7883 }
7884 /* This code used to do *secp = bfd_und_section_ptr if
07d6d2b8
AM
7885 bfd_link_pic (info). I don't know why, and that doesn't make sense,
7886 so I took it out. */
698600e4 7887 *secp = mips_elf_tdata (abfd)->elf_data_section;
b49e97c9
TS
7888 break;
7889
7890 case SHN_MIPS_SUNDEFINED:
7891 *secp = bfd_und_section_ptr;
7892 break;
7893 }
7894
7895 if (SGI_COMPAT (abfd)
0e1862bb 7896 && ! bfd_link_pic (info)
f13a99db 7897 && info->output_bfd->xvec == abfd->xvec
b49e97c9
TS
7898 && strcmp (*namep, "__rld_obj_head") == 0)
7899 {
7900 struct elf_link_hash_entry *h;
14a793b2 7901 struct bfd_link_hash_entry *bh;
b49e97c9
TS
7902
7903 /* Mark __rld_obj_head as dynamic. */
14a793b2 7904 bh = NULL;
b49e97c9 7905 if (! (_bfd_generic_link_add_one_symbol
9719ad41 7906 (info, abfd, *namep, BSF_GLOBAL, *secp, *valp, NULL, FALSE,
14a793b2 7907 get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 7908 return FALSE;
14a793b2
AM
7909
7910 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
7911 h->non_elf = 0;
7912 h->def_regular = 1;
b49e97c9
TS
7913 h->type = STT_OBJECT;
7914
c152c796 7915 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 7916 return FALSE;
b49e97c9 7917
b34976b6 7918 mips_elf_hash_table (info)->use_rld_obj_head = TRUE;
b4082c70 7919 mips_elf_hash_table (info)->rld_symbol = h;
b49e97c9
TS
7920 }
7921
7922 /* If this is a mips16 text symbol, add 1 to the value to make it
7923 odd. This will cause something like .word SYM to come up with
7924 the right value when it is loaded into the PC. */
df58fc94 7925 if (ELF_ST_IS_COMPRESSED (sym->st_other))
b49e97c9
TS
7926 ++*valp;
7927
b34976b6 7928 return TRUE;
b49e97c9
TS
7929}
7930
7931/* This hook function is called before the linker writes out a global
7932 symbol. We mark symbols as small common if appropriate. This is
7933 also where we undo the increment of the value for a mips16 symbol. */
7934
6e0b88f1 7935int
9719ad41
RS
7936_bfd_mips_elf_link_output_symbol_hook
7937 (struct bfd_link_info *info ATTRIBUTE_UNUSED,
7938 const char *name ATTRIBUTE_UNUSED, Elf_Internal_Sym *sym,
7939 asection *input_sec, struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
b49e97c9
TS
7940{
7941 /* If we see a common symbol, which implies a relocatable link, then
7942 if a symbol was small common in an input file, mark it as small
7943 common in the output file. */
7944 if (sym->st_shndx == SHN_COMMON
7945 && strcmp (input_sec->name, ".scommon") == 0)
7946 sym->st_shndx = SHN_MIPS_SCOMMON;
7947
df58fc94 7948 if (ELF_ST_IS_COMPRESSED (sym->st_other))
79cda7cf 7949 sym->st_value &= ~1;
b49e97c9 7950
6e0b88f1 7951 return 1;
b49e97c9
TS
7952}
7953\f
7954/* Functions for the dynamic linker. */
7955
7956/* Create dynamic sections when linking against a dynamic object. */
7957
b34976b6 7958bfd_boolean
9719ad41 7959_bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
b49e97c9
TS
7960{
7961 struct elf_link_hash_entry *h;
14a793b2 7962 struct bfd_link_hash_entry *bh;
b49e97c9
TS
7963 flagword flags;
7964 register asection *s;
7965 const char * const *namep;
0a44bf69 7966 struct mips_elf_link_hash_table *htab;
b49e97c9 7967
0a44bf69 7968 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
7969 BFD_ASSERT (htab != NULL);
7970
b49e97c9
TS
7971 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
7972 | SEC_LINKER_CREATED | SEC_READONLY);
7973
0a44bf69
RS
7974 /* The psABI requires a read-only .dynamic section, but the VxWorks
7975 EABI doesn't. */
7976 if (!htab->is_vxworks)
b49e97c9 7977 {
3d4d4302 7978 s = bfd_get_linker_section (abfd, ".dynamic");
0a44bf69
RS
7979 if (s != NULL)
7980 {
fd361982 7981 if (!bfd_set_section_flags (s, flags))
0a44bf69
RS
7982 return FALSE;
7983 }
b49e97c9
TS
7984 }
7985
7986 /* We need to create .got section. */
23cc69b6 7987 if (!mips_elf_create_got_section (abfd, info))
f4416af6
AO
7988 return FALSE;
7989
0a44bf69 7990 if (! mips_elf_rel_dyn_section (info, TRUE))
b34976b6 7991 return FALSE;
b49e97c9 7992
b49e97c9 7993 /* Create .stub section. */
3d4d4302
AM
7994 s = bfd_make_section_anyway_with_flags (abfd,
7995 MIPS_ELF_STUB_SECTION_NAME (abfd),
7996 flags | SEC_CODE);
4e41d0d7 7997 if (s == NULL
fd361982 7998 || !bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd)))
4e41d0d7
RS
7999 return FALSE;
8000 htab->sstubs = s;
b49e97c9 8001
e6aea42d 8002 if (!mips_elf_hash_table (info)->use_rld_obj_head
0e1862bb 8003 && bfd_link_executable (info)
3d4d4302 8004 && bfd_get_linker_section (abfd, ".rld_map") == NULL)
b49e97c9 8005 {
3d4d4302
AM
8006 s = bfd_make_section_anyway_with_flags (abfd, ".rld_map",
8007 flags &~ (flagword) SEC_READONLY);
b49e97c9 8008 if (s == NULL
fd361982 8009 || !bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd)))
b34976b6 8010 return FALSE;
b49e97c9
TS
8011 }
8012
f16a9783
MS
8013 /* Create .MIPS.xhash section. */
8014 if (info->emit_gnu_hash)
8015 s = bfd_make_section_anyway_with_flags (abfd, ".MIPS.xhash",
8016 flags | SEC_READONLY);
8017
b49e97c9
TS
8018 /* On IRIX5, we adjust add some additional symbols and change the
8019 alignments of several sections. There is no ABI documentation
8020 indicating that this is necessary on IRIX6, nor any evidence that
8021 the linker takes such action. */
8022 if (IRIX_COMPAT (abfd) == ict_irix5)
8023 {
8024 for (namep = mips_elf_dynsym_rtproc_names; *namep != NULL; namep++)
8025 {
14a793b2 8026 bh = NULL;
b49e97c9 8027 if (! (_bfd_generic_link_add_one_symbol
9719ad41
RS
8028 (info, abfd, *namep, BSF_GLOBAL, bfd_und_section_ptr, 0,
8029 NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 8030 return FALSE;
14a793b2
AM
8031
8032 h = (struct elf_link_hash_entry *) bh;
12f09816 8033 h->mark = 1;
f5385ebf
AM
8034 h->non_elf = 0;
8035 h->def_regular = 1;
b49e97c9
TS
8036 h->type = STT_SECTION;
8037
c152c796 8038 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 8039 return FALSE;
b49e97c9
TS
8040 }
8041
8042 /* We need to create a .compact_rel section. */
8043 if (SGI_COMPAT (abfd))
8044 {
8045 if (!mips_elf_create_compact_rel_section (abfd, info))
b34976b6 8046 return FALSE;
b49e97c9
TS
8047 }
8048
44c410de 8049 /* Change alignments of some sections. */
3d4d4302 8050 s = bfd_get_linker_section (abfd, ".hash");
b49e97c9 8051 if (s != NULL)
fd361982 8052 bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
a253d456 8053
3d4d4302 8054 s = bfd_get_linker_section (abfd, ".dynsym");
b49e97c9 8055 if (s != NULL)
fd361982 8056 bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
a253d456 8057
3d4d4302 8058 s = bfd_get_linker_section (abfd, ".dynstr");
b49e97c9 8059 if (s != NULL)
fd361982 8060 bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
a253d456 8061
3d4d4302 8062 /* ??? */
b49e97c9
TS
8063 s = bfd_get_section_by_name (abfd, ".reginfo");
8064 if (s != NULL)
fd361982 8065 bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
a253d456 8066
3d4d4302 8067 s = bfd_get_linker_section (abfd, ".dynamic");
b49e97c9 8068 if (s != NULL)
fd361982 8069 bfd_set_section_alignment (s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
b49e97c9
TS
8070 }
8071
0e1862bb 8072 if (bfd_link_executable (info))
b49e97c9 8073 {
14a793b2
AM
8074 const char *name;
8075
8076 name = SGI_COMPAT (abfd) ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING";
8077 bh = NULL;
8078 if (!(_bfd_generic_link_add_one_symbol
9719ad41
RS
8079 (info, abfd, name, BSF_GLOBAL, bfd_abs_section_ptr, 0,
8080 NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 8081 return FALSE;
14a793b2
AM
8082
8083 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
8084 h->non_elf = 0;
8085 h->def_regular = 1;
b49e97c9
TS
8086 h->type = STT_SECTION;
8087
c152c796 8088 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 8089 return FALSE;
b49e97c9
TS
8090
8091 if (! mips_elf_hash_table (info)->use_rld_obj_head)
8092 {
8093 /* __rld_map is a four byte word located in the .data section
8094 and is filled in by the rtld to contain a pointer to
8095 the _r_debug structure. Its symbol value will be set in
8096 _bfd_mips_elf_finish_dynamic_symbol. */
3d4d4302 8097 s = bfd_get_linker_section (abfd, ".rld_map");
0abfb97a 8098 BFD_ASSERT (s != NULL);
14a793b2 8099
0abfb97a
L
8100 name = SGI_COMPAT (abfd) ? "__rld_map" : "__RLD_MAP";
8101 bh = NULL;
8102 if (!(_bfd_generic_link_add_one_symbol
8103 (info, abfd, name, BSF_GLOBAL, s, 0, NULL, FALSE,
8104 get_elf_backend_data (abfd)->collect, &bh)))
8105 return FALSE;
b49e97c9 8106
0abfb97a
L
8107 h = (struct elf_link_hash_entry *) bh;
8108 h->non_elf = 0;
8109 h->def_regular = 1;
8110 h->type = STT_OBJECT;
8111
8112 if (! bfd_elf_link_record_dynamic_symbol (info, h))
8113 return FALSE;
b4082c70 8114 mips_elf_hash_table (info)->rld_symbol = h;
b49e97c9
TS
8115 }
8116 }
8117
861fb55a 8118 /* Create the .plt, .rel(a).plt, .dynbss and .rel(a).bss sections.
c164a95d 8119 Also, on VxWorks, create the _PROCEDURE_LINKAGE_TABLE_ symbol. */
861fb55a
DJ
8120 if (!_bfd_elf_create_dynamic_sections (abfd, info))
8121 return FALSE;
8122
1bbce132
MR
8123 /* Do the usual VxWorks handling. */
8124 if (htab->is_vxworks
8125 && !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
8126 return FALSE;
0a44bf69 8127
b34976b6 8128 return TRUE;
b49e97c9
TS
8129}
8130\f
c224138d
RS
8131/* Return true if relocation REL against section SEC is a REL rather than
8132 RELA relocation. RELOCS is the first relocation in the section and
8133 ABFD is the bfd that contains SEC. */
8134
8135static bfd_boolean
8136mips_elf_rel_relocation_p (bfd *abfd, asection *sec,
8137 const Elf_Internal_Rela *relocs,
8138 const Elf_Internal_Rela *rel)
8139{
8140 Elf_Internal_Shdr *rel_hdr;
8141 const struct elf_backend_data *bed;
8142
d4730f92
BS
8143 /* To determine which flavor of relocation this is, we depend on the
8144 fact that the INPUT_SECTION's REL_HDR is read before RELA_HDR. */
8145 rel_hdr = elf_section_data (sec)->rel.hdr;
8146 if (rel_hdr == NULL)
8147 return FALSE;
c224138d 8148 bed = get_elf_backend_data (abfd);
d4730f92
BS
8149 return ((size_t) (rel - relocs)
8150 < NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel);
c224138d
RS
8151}
8152
8153/* Read the addend for REL relocation REL, which belongs to bfd ABFD.
8154 HOWTO is the relocation's howto and CONTENTS points to the contents
8155 of the section that REL is against. */
8156
8157static bfd_vma
8158mips_elf_read_rel_addend (bfd *abfd, const Elf_Internal_Rela *rel,
8159 reloc_howto_type *howto, bfd_byte *contents)
8160{
8161 bfd_byte *location;
8162 unsigned int r_type;
8163 bfd_vma addend;
17c6c9d9 8164 bfd_vma bytes;
c224138d
RS
8165
8166 r_type = ELF_R_TYPE (abfd, rel->r_info);
8167 location = contents + rel->r_offset;
8168
8169 /* Get the addend, which is stored in the input file. */
df58fc94 8170 _bfd_mips_elf_reloc_unshuffle (abfd, r_type, FALSE, location);
17c6c9d9 8171 bytes = mips_elf_obtain_contents (howto, rel, abfd, contents);
df58fc94 8172 _bfd_mips_elf_reloc_shuffle (abfd, r_type, FALSE, location);
c224138d 8173
17c6c9d9
MR
8174 addend = bytes & howto->src_mask;
8175
8176 /* Shift is 2, unusually, for microMIPS JALX. Adjust the addend
8177 accordingly. */
8178 if (r_type == R_MICROMIPS_26_S1 && (bytes >> 26) == 0x3c)
8179 addend <<= 1;
8180
8181 return addend;
c224138d
RS
8182}
8183
8184/* REL is a relocation in ABFD that needs a partnering LO16 relocation
8185 and *ADDEND is the addend for REL itself. Look for the LO16 relocation
8186 and update *ADDEND with the final addend. Return true on success
8187 or false if the LO16 could not be found. RELEND is the exclusive
8188 upper bound on the relocations for REL's section. */
8189
8190static bfd_boolean
8191mips_elf_add_lo16_rel_addend (bfd *abfd,
8192 const Elf_Internal_Rela *rel,
8193 const Elf_Internal_Rela *relend,
8194 bfd_byte *contents, bfd_vma *addend)
8195{
8196 unsigned int r_type, lo16_type;
8197 const Elf_Internal_Rela *lo16_relocation;
8198 reloc_howto_type *lo16_howto;
8199 bfd_vma l;
8200
8201 r_type = ELF_R_TYPE (abfd, rel->r_info);
738e5348 8202 if (mips16_reloc_p (r_type))
c224138d 8203 lo16_type = R_MIPS16_LO16;
df58fc94
RS
8204 else if (micromips_reloc_p (r_type))
8205 lo16_type = R_MICROMIPS_LO16;
7361da2c
AB
8206 else if (r_type == R_MIPS_PCHI16)
8207 lo16_type = R_MIPS_PCLO16;
c224138d
RS
8208 else
8209 lo16_type = R_MIPS_LO16;
8210
8211 /* The combined value is the sum of the HI16 addend, left-shifted by
8212 sixteen bits, and the LO16 addend, sign extended. (Usually, the
8213 code does a `lui' of the HI16 value, and then an `addiu' of the
8214 LO16 value.)
8215
8216 Scan ahead to find a matching LO16 relocation.
8217
8218 According to the MIPS ELF ABI, the R_MIPS_LO16 relocation must
8219 be immediately following. However, for the IRIX6 ABI, the next
8220 relocation may be a composed relocation consisting of several
8221 relocations for the same address. In that case, the R_MIPS_LO16
8222 relocation may occur as one of these. We permit a similar
8223 extension in general, as that is useful for GCC.
8224
8225 In some cases GCC dead code elimination removes the LO16 but keeps
8226 the corresponding HI16. This is strictly speaking a violation of
8227 the ABI but not immediately harmful. */
8228 lo16_relocation = mips_elf_next_relocation (abfd, lo16_type, rel, relend);
8229 if (lo16_relocation == NULL)
8230 return FALSE;
8231
8232 /* Obtain the addend kept there. */
8233 lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, lo16_type, FALSE);
8234 l = mips_elf_read_rel_addend (abfd, lo16_relocation, lo16_howto, contents);
8235
8236 l <<= lo16_howto->rightshift;
8237 l = _bfd_mips_elf_sign_extend (l, 16);
8238
8239 *addend <<= 16;
8240 *addend += l;
8241 return TRUE;
8242}
8243
8244/* Try to read the contents of section SEC in bfd ABFD. Return true and
8245 store the contents in *CONTENTS on success. Assume that *CONTENTS
8246 already holds the contents if it is nonull on entry. */
8247
8248static bfd_boolean
8249mips_elf_get_section_contents (bfd *abfd, asection *sec, bfd_byte **contents)
8250{
8251 if (*contents)
8252 return TRUE;
8253
8254 /* Get cached copy if it exists. */
8255 if (elf_section_data (sec)->this_hdr.contents != NULL)
8256 {
8257 *contents = elf_section_data (sec)->this_hdr.contents;
8258 return TRUE;
8259 }
8260
8261 return bfd_malloc_and_get_section (abfd, sec, contents);
8262}
8263
1bbce132
MR
8264/* Make a new PLT record to keep internal data. */
8265
8266static struct plt_entry *
8267mips_elf_make_plt_record (bfd *abfd)
8268{
8269 struct plt_entry *entry;
8270
8271 entry = bfd_zalloc (abfd, sizeof (*entry));
8272 if (entry == NULL)
8273 return NULL;
8274
8275 entry->stub_offset = MINUS_ONE;
8276 entry->mips_offset = MINUS_ONE;
8277 entry->comp_offset = MINUS_ONE;
8278 entry->gotplt_index = MINUS_ONE;
8279 return entry;
8280}
8281
47275900
MR
8282/* Define the special `__gnu_absolute_zero' symbol. We only need this
8283 for PIC code, as otherwise there is no load-time relocation involved
8284 and local GOT entries whose value is zero at static link time will
8285 retain their value at load time. */
8286
8287static bfd_boolean
8288mips_elf_define_absolute_zero (bfd *abfd, struct bfd_link_info *info,
8289 struct mips_elf_link_hash_table *htab,
8290 unsigned int r_type)
8291{
8292 union
8293 {
8294 struct elf_link_hash_entry *eh;
8295 struct bfd_link_hash_entry *bh;
8296 }
8297 hzero;
8298
8299 BFD_ASSERT (!htab->use_absolute_zero);
8300 BFD_ASSERT (bfd_link_pic (info));
8301
8302 hzero.bh = NULL;
8303 if (!_bfd_generic_link_add_one_symbol (info, abfd, "__gnu_absolute_zero",
8304 BSF_GLOBAL, bfd_abs_section_ptr, 0,
8305 NULL, FALSE, FALSE, &hzero.bh))
8306 return FALSE;
8307
8308 BFD_ASSERT (hzero.bh != NULL);
8309 hzero.eh->size = 0;
8310 hzero.eh->type = STT_NOTYPE;
8311 hzero.eh->other = STV_PROTECTED;
8312 hzero.eh->def_regular = 1;
8313 hzero.eh->non_elf = 0;
8314
8315 if (!mips_elf_record_global_got_symbol (hzero.eh, abfd, info, TRUE, r_type))
8316 return FALSE;
8317
8318 htab->use_absolute_zero = TRUE;
8319
8320 return TRUE;
8321}
8322
b49e97c9 8323/* Look through the relocs for a section during the first phase, and
1bbce132
MR
8324 allocate space in the global offset table and record the need for
8325 standard MIPS and compressed procedure linkage table entries. */
b49e97c9 8326
b34976b6 8327bfd_boolean
9719ad41
RS
8328_bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
8329 asection *sec, const Elf_Internal_Rela *relocs)
b49e97c9
TS
8330{
8331 const char *name;
8332 bfd *dynobj;
8333 Elf_Internal_Shdr *symtab_hdr;
8334 struct elf_link_hash_entry **sym_hashes;
b49e97c9
TS
8335 size_t extsymoff;
8336 const Elf_Internal_Rela *rel;
8337 const Elf_Internal_Rela *rel_end;
b49e97c9 8338 asection *sreloc;
9c5bfbb7 8339 const struct elf_backend_data *bed;
0a44bf69 8340 struct mips_elf_link_hash_table *htab;
c224138d
RS
8341 bfd_byte *contents;
8342 bfd_vma addend;
8343 reloc_howto_type *howto;
b49e97c9 8344
0e1862bb 8345 if (bfd_link_relocatable (info))
b34976b6 8346 return TRUE;
b49e97c9 8347
0a44bf69 8348 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
8349 BFD_ASSERT (htab != NULL);
8350
b49e97c9
TS
8351 dynobj = elf_hash_table (info)->dynobj;
8352 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8353 sym_hashes = elf_sym_hashes (abfd);
8354 extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
8355
738e5348 8356 bed = get_elf_backend_data (abfd);
056bafd4 8357 rel_end = relocs + sec->reloc_count;
738e5348 8358
b49e97c9
TS
8359 /* Check for the mips16 stub sections. */
8360
fd361982 8361 name = bfd_section_name (sec);
b9d58d71 8362 if (FN_STUB_P (name))
b49e97c9
TS
8363 {
8364 unsigned long r_symndx;
8365
8366 /* Look at the relocation information to figure out which symbol
07d6d2b8 8367 this is for. */
b49e97c9 8368
cb4437b8 8369 r_symndx = mips16_stub_symndx (bed, sec, relocs, rel_end);
738e5348
RS
8370 if (r_symndx == 0)
8371 {
4eca0228 8372 _bfd_error_handler
695344c0 8373 /* xgettext:c-format */
2c1c9679 8374 (_("%pB: warning: cannot determine the target function for"
738e5348
RS
8375 " stub section `%s'"),
8376 abfd, name);
8377 bfd_set_error (bfd_error_bad_value);
8378 return FALSE;
8379 }
b49e97c9
TS
8380
8381 if (r_symndx < extsymoff
8382 || sym_hashes[r_symndx - extsymoff] == NULL)
8383 {
8384 asection *o;
8385
8386 /* This stub is for a local symbol. This stub will only be
07d6d2b8
AM
8387 needed if there is some relocation in this BFD, other
8388 than a 16 bit function call, which refers to this symbol. */
b49e97c9
TS
8389 for (o = abfd->sections; o != NULL; o = o->next)
8390 {
8391 Elf_Internal_Rela *sec_relocs;
8392 const Elf_Internal_Rela *r, *rend;
8393
8394 /* We can ignore stub sections when looking for relocs. */
8395 if ((o->flags & SEC_RELOC) == 0
8396 || o->reloc_count == 0
738e5348 8397 || section_allows_mips16_refs_p (o))
b49e97c9
TS
8398 continue;
8399
45d6a902 8400 sec_relocs
9719ad41 8401 = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
45d6a902 8402 info->keep_memory);
b49e97c9 8403 if (sec_relocs == NULL)
b34976b6 8404 return FALSE;
b49e97c9
TS
8405
8406 rend = sec_relocs + o->reloc_count;
8407 for (r = sec_relocs; r < rend; r++)
8408 if (ELF_R_SYM (abfd, r->r_info) == r_symndx
738e5348 8409 && !mips16_call_reloc_p (ELF_R_TYPE (abfd, r->r_info)))
b49e97c9
TS
8410 break;
8411
6cdc0ccc 8412 if (elf_section_data (o)->relocs != sec_relocs)
b49e97c9
TS
8413 free (sec_relocs);
8414
8415 if (r < rend)
8416 break;
8417 }
8418
8419 if (o == NULL)
8420 {
8421 /* There is no non-call reloc for this stub, so we do
07d6d2b8
AM
8422 not need it. Since this function is called before
8423 the linker maps input sections to output sections, we
8424 can easily discard it by setting the SEC_EXCLUDE
8425 flag. */
b49e97c9 8426 sec->flags |= SEC_EXCLUDE;
b34976b6 8427 return TRUE;
b49e97c9
TS
8428 }
8429
8430 /* Record this stub in an array of local symbol stubs for
07d6d2b8 8431 this BFD. */
698600e4 8432 if (mips_elf_tdata (abfd)->local_stubs == NULL)
b49e97c9
TS
8433 {
8434 unsigned long symcount;
8435 asection **n;
8436 bfd_size_type amt;
8437
8438 if (elf_bad_symtab (abfd))
8439 symcount = NUM_SHDR_ENTRIES (symtab_hdr);
8440 else
8441 symcount = symtab_hdr->sh_info;
8442 amt = symcount * sizeof (asection *);
9719ad41 8443 n = bfd_zalloc (abfd, amt);
b49e97c9 8444 if (n == NULL)
b34976b6 8445 return FALSE;
698600e4 8446 mips_elf_tdata (abfd)->local_stubs = n;
b49e97c9
TS
8447 }
8448
b9d58d71 8449 sec->flags |= SEC_KEEP;
698600e4 8450 mips_elf_tdata (abfd)->local_stubs[r_symndx] = sec;
b49e97c9
TS
8451
8452 /* We don't need to set mips16_stubs_seen in this case.
07d6d2b8
AM
8453 That flag is used to see whether we need to look through
8454 the global symbol table for stubs. We don't need to set
8455 it here, because we just have a local stub. */
b49e97c9
TS
8456 }
8457 else
8458 {
8459 struct mips_elf_link_hash_entry *h;
8460
8461 h = ((struct mips_elf_link_hash_entry *)
8462 sym_hashes[r_symndx - extsymoff]);
8463
973a3492
L
8464 while (h->root.root.type == bfd_link_hash_indirect
8465 || h->root.root.type == bfd_link_hash_warning)
8466 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
8467
b49e97c9
TS
8468 /* H is the symbol this stub is for. */
8469
b9d58d71
TS
8470 /* If we already have an appropriate stub for this function, we
8471 don't need another one, so we can discard this one. Since
8472 this function is called before the linker maps input sections
8473 to output sections, we can easily discard it by setting the
8474 SEC_EXCLUDE flag. */
8475 if (h->fn_stub != NULL)
8476 {
8477 sec->flags |= SEC_EXCLUDE;
8478 return TRUE;
8479 }
8480
8481 sec->flags |= SEC_KEEP;
b49e97c9 8482 h->fn_stub = sec;
b34976b6 8483 mips_elf_hash_table (info)->mips16_stubs_seen = TRUE;
b49e97c9
TS
8484 }
8485 }
b9d58d71 8486 else if (CALL_STUB_P (name) || CALL_FP_STUB_P (name))
b49e97c9
TS
8487 {
8488 unsigned long r_symndx;
8489 struct mips_elf_link_hash_entry *h;
8490 asection **loc;
8491
8492 /* Look at the relocation information to figure out which symbol
07d6d2b8 8493 this is for. */
b49e97c9 8494
cb4437b8 8495 r_symndx = mips16_stub_symndx (bed, sec, relocs, rel_end);
738e5348
RS
8496 if (r_symndx == 0)
8497 {
4eca0228 8498 _bfd_error_handler
695344c0 8499 /* xgettext:c-format */
2c1c9679 8500 (_("%pB: warning: cannot determine the target function for"
738e5348
RS
8501 " stub section `%s'"),
8502 abfd, name);
8503 bfd_set_error (bfd_error_bad_value);
8504 return FALSE;
8505 }
b49e97c9
TS
8506
8507 if (r_symndx < extsymoff
8508 || sym_hashes[r_symndx - extsymoff] == NULL)
8509 {
b9d58d71 8510 asection *o;
b49e97c9 8511
b9d58d71 8512 /* This stub is for a local symbol. This stub will only be
07d6d2b8
AM
8513 needed if there is some relocation (R_MIPS16_26) in this BFD
8514 that refers to this symbol. */
b9d58d71
TS
8515 for (o = abfd->sections; o != NULL; o = o->next)
8516 {
8517 Elf_Internal_Rela *sec_relocs;
8518 const Elf_Internal_Rela *r, *rend;
8519
8520 /* We can ignore stub sections when looking for relocs. */
8521 if ((o->flags & SEC_RELOC) == 0
8522 || o->reloc_count == 0
738e5348 8523 || section_allows_mips16_refs_p (o))
b9d58d71
TS
8524 continue;
8525
8526 sec_relocs
8527 = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
8528 info->keep_memory);
8529 if (sec_relocs == NULL)
8530 return FALSE;
8531
8532 rend = sec_relocs + o->reloc_count;
8533 for (r = sec_relocs; r < rend; r++)
8534 if (ELF_R_SYM (abfd, r->r_info) == r_symndx
8535 && ELF_R_TYPE (abfd, r->r_info) == R_MIPS16_26)
8536 break;
8537
8538 if (elf_section_data (o)->relocs != sec_relocs)
8539 free (sec_relocs);
8540
8541 if (r < rend)
8542 break;
8543 }
8544
8545 if (o == NULL)
8546 {
8547 /* There is no non-call reloc for this stub, so we do
07d6d2b8
AM
8548 not need it. Since this function is called before
8549 the linker maps input sections to output sections, we
8550 can easily discard it by setting the SEC_EXCLUDE
8551 flag. */
b9d58d71
TS
8552 sec->flags |= SEC_EXCLUDE;
8553 return TRUE;
8554 }
8555
8556 /* Record this stub in an array of local symbol call_stubs for
07d6d2b8 8557 this BFD. */
698600e4 8558 if (mips_elf_tdata (abfd)->local_call_stubs == NULL)
b9d58d71
TS
8559 {
8560 unsigned long symcount;
8561 asection **n;
8562 bfd_size_type amt;
8563
8564 if (elf_bad_symtab (abfd))
8565 symcount = NUM_SHDR_ENTRIES (symtab_hdr);
8566 else
8567 symcount = symtab_hdr->sh_info;
8568 amt = symcount * sizeof (asection *);
8569 n = bfd_zalloc (abfd, amt);
8570 if (n == NULL)
8571 return FALSE;
698600e4 8572 mips_elf_tdata (abfd)->local_call_stubs = n;
b9d58d71 8573 }
b49e97c9 8574
b9d58d71 8575 sec->flags |= SEC_KEEP;
698600e4 8576 mips_elf_tdata (abfd)->local_call_stubs[r_symndx] = sec;
b49e97c9 8577
b9d58d71 8578 /* We don't need to set mips16_stubs_seen in this case.
07d6d2b8
AM
8579 That flag is used to see whether we need to look through
8580 the global symbol table for stubs. We don't need to set
8581 it here, because we just have a local stub. */
b9d58d71 8582 }
b49e97c9 8583 else
b49e97c9 8584 {
b9d58d71
TS
8585 h = ((struct mips_elf_link_hash_entry *)
8586 sym_hashes[r_symndx - extsymoff]);
68ffbac6 8587
b9d58d71 8588 /* H is the symbol this stub is for. */
68ffbac6 8589
b9d58d71
TS
8590 if (CALL_FP_STUB_P (name))
8591 loc = &h->call_fp_stub;
8592 else
8593 loc = &h->call_stub;
68ffbac6 8594
b9d58d71
TS
8595 /* If we already have an appropriate stub for this function, we
8596 don't need another one, so we can discard this one. Since
8597 this function is called before the linker maps input sections
8598 to output sections, we can easily discard it by setting the
8599 SEC_EXCLUDE flag. */
8600 if (*loc != NULL)
8601 {
8602 sec->flags |= SEC_EXCLUDE;
8603 return TRUE;
8604 }
b49e97c9 8605
b9d58d71
TS
8606 sec->flags |= SEC_KEEP;
8607 *loc = sec;
8608 mips_elf_hash_table (info)->mips16_stubs_seen = TRUE;
8609 }
b49e97c9
TS
8610 }
8611
b49e97c9 8612 sreloc = NULL;
c224138d 8613 contents = NULL;
b49e97c9
TS
8614 for (rel = relocs; rel < rel_end; ++rel)
8615 {
8616 unsigned long r_symndx;
8617 unsigned int r_type;
8618 struct elf_link_hash_entry *h;
861fb55a 8619 bfd_boolean can_make_dynamic_p;
c5d6fa44
RS
8620 bfd_boolean call_reloc_p;
8621 bfd_boolean constrain_symbol_p;
b49e97c9
TS
8622
8623 r_symndx = ELF_R_SYM (abfd, rel->r_info);
8624 r_type = ELF_R_TYPE (abfd, rel->r_info);
8625
8626 if (r_symndx < extsymoff)
8627 h = NULL;
8628 else if (r_symndx >= extsymoff + NUM_SHDR_ENTRIES (symtab_hdr))
8629 {
4eca0228 8630 _bfd_error_handler
695344c0 8631 /* xgettext:c-format */
2c1c9679 8632 (_("%pB: malformed reloc detected for section %s"),
d003868e 8633 abfd, name);
b49e97c9 8634 bfd_set_error (bfd_error_bad_value);
b34976b6 8635 return FALSE;
b49e97c9
TS
8636 }
8637 else
8638 {
8639 h = sym_hashes[r_symndx - extsymoff];
81fbe831
AM
8640 if (h != NULL)
8641 {
8642 while (h->root.type == bfd_link_hash_indirect
8643 || h->root.type == bfd_link_hash_warning)
8644 h = (struct elf_link_hash_entry *) h->root.u.i.link;
81fbe831 8645 }
861fb55a 8646 }
b49e97c9 8647
861fb55a
DJ
8648 /* Set CAN_MAKE_DYNAMIC_P to true if we can convert this
8649 relocation into a dynamic one. */
8650 can_make_dynamic_p = FALSE;
c5d6fa44
RS
8651
8652 /* Set CALL_RELOC_P to true if the relocation is for a call,
8653 and if pointer equality therefore doesn't matter. */
8654 call_reloc_p = FALSE;
8655
8656 /* Set CONSTRAIN_SYMBOL_P if we need to take the relocation
8657 into account when deciding how to define the symbol.
8658 Relocations in nonallocatable sections such as .pdr and
8659 .debug* should have no effect. */
8660 constrain_symbol_p = ((sec->flags & SEC_ALLOC) != 0);
8661
861fb55a
DJ
8662 switch (r_type)
8663 {
861fb55a
DJ
8664 case R_MIPS_CALL16:
8665 case R_MIPS_CALL_HI16:
8666 case R_MIPS_CALL_LO16:
c5d6fa44
RS
8667 case R_MIPS16_CALL16:
8668 case R_MICROMIPS_CALL16:
8669 case R_MICROMIPS_CALL_HI16:
8670 case R_MICROMIPS_CALL_LO16:
8671 call_reloc_p = TRUE;
8672 /* Fall through. */
8673
8674 case R_MIPS_GOT16:
861fb55a
DJ
8675 case R_MIPS_GOT_LO16:
8676 case R_MIPS_GOT_PAGE:
861fb55a 8677 case R_MIPS_GOT_DISP:
47275900
MR
8678 case R_MIPS16_GOT16:
8679 case R_MICROMIPS_GOT16:
8680 case R_MICROMIPS_GOT_LO16:
8681 case R_MICROMIPS_GOT_PAGE:
8682 case R_MICROMIPS_GOT_DISP:
8683 /* If we have a symbol that will resolve to zero at static link
8684 time and it is used by a GOT relocation applied to code we
8685 cannot relax to an immediate zero load, then we will be using
8686 the special `__gnu_absolute_zero' symbol whose value is zero
8687 at dynamic load time. We ignore HI16-type GOT relocations at
8688 this stage, because their handling will depend entirely on
8689 the corresponding LO16-type GOT relocation. */
8690 if (!call_hi16_reloc_p (r_type)
8691 && h != NULL
8692 && bfd_link_pic (info)
8693 && !htab->use_absolute_zero
8694 && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
8695 {
8696 bfd_boolean rel_reloc;
8697
8698 if (!mips_elf_get_section_contents (abfd, sec, &contents))
8699 return FALSE;
8700
8701 rel_reloc = mips_elf_rel_relocation_p (abfd, sec, relocs, rel);
8702 howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, !rel_reloc);
8703
8704 if (!mips_elf_nullify_got_load (abfd, contents, rel, howto,
8705 FALSE))
8706 if (!mips_elf_define_absolute_zero (abfd, info, htab, r_type))
8707 return FALSE;
8708 }
8709
8710 /* Fall through. */
8711 case R_MIPS_GOT_HI16:
8712 case R_MIPS_GOT_OFST:
861fb55a
DJ
8713 case R_MIPS_TLS_GOTTPREL:
8714 case R_MIPS_TLS_GD:
8715 case R_MIPS_TLS_LDM:
d0f13682
CLT
8716 case R_MIPS16_TLS_GOTTPREL:
8717 case R_MIPS16_TLS_GD:
8718 case R_MIPS16_TLS_LDM:
df58fc94 8719 case R_MICROMIPS_GOT_HI16:
df58fc94 8720 case R_MICROMIPS_GOT_OFST:
df58fc94
RS
8721 case R_MICROMIPS_TLS_GOTTPREL:
8722 case R_MICROMIPS_TLS_GD:
8723 case R_MICROMIPS_TLS_LDM:
861fb55a
DJ
8724 if (dynobj == NULL)
8725 elf_hash_table (info)->dynobj = dynobj = abfd;
8726 if (!mips_elf_create_got_section (dynobj, info))
8727 return FALSE;
0e1862bb 8728 if (htab->is_vxworks && !bfd_link_pic (info))
b49e97c9 8729 {
4eca0228 8730 _bfd_error_handler
695344c0 8731 /* xgettext:c-format */
2dcf00ce
AM
8732 (_("%pB: GOT reloc at %#" PRIx64 " not expected in executables"),
8733 abfd, (uint64_t) rel->r_offset);
861fb55a
DJ
8734 bfd_set_error (bfd_error_bad_value);
8735 return FALSE;
b49e97c9 8736 }
c5d6fa44 8737 can_make_dynamic_p = TRUE;
861fb55a 8738 break;
b49e97c9 8739
c5d6fa44 8740 case R_MIPS_NONE:
99da6b5f 8741 case R_MIPS_JALR:
df58fc94 8742 case R_MICROMIPS_JALR:
c5d6fa44
RS
8743 /* These relocations have empty fields and are purely there to
8744 provide link information. The symbol value doesn't matter. */
8745 constrain_symbol_p = FALSE;
8746 break;
8747
8748 case R_MIPS_GPREL16:
8749 case R_MIPS_GPREL32:
8750 case R_MIPS16_GPREL:
8751 case R_MICROMIPS_GPREL16:
8752 /* GP-relative relocations always resolve to a definition in a
8753 regular input file, ignoring the one-definition rule. This is
8754 important for the GP setup sequence in NewABI code, which
8755 always resolves to a local function even if other relocations
8756 against the symbol wouldn't. */
8757 constrain_symbol_p = FALSE;
99da6b5f
AN
8758 break;
8759
861fb55a
DJ
8760 case R_MIPS_32:
8761 case R_MIPS_REL32:
8762 case R_MIPS_64:
8763 /* In VxWorks executables, references to external symbols
8764 must be handled using copy relocs or PLT entries; it is not
8765 possible to convert this relocation into a dynamic one.
8766
8767 For executables that use PLTs and copy-relocs, we have a
8768 choice between converting the relocation into a dynamic
8769 one or using copy relocations or PLT entries. It is
8770 usually better to do the former, unless the relocation is
8771 against a read-only section. */
0e1862bb 8772 if ((bfd_link_pic (info)
861fb55a
DJ
8773 || (h != NULL
8774 && !htab->is_vxworks
8775 && strcmp (h->root.root.string, "__gnu_local_gp") != 0
8776 && !(!info->nocopyreloc
8777 && !PIC_OBJECT_P (abfd)
8778 && MIPS_ELF_READONLY_SECTION (sec))))
8779 && (sec->flags & SEC_ALLOC) != 0)
b49e97c9 8780 {
861fb55a 8781 can_make_dynamic_p = TRUE;
b49e97c9
TS
8782 if (dynobj == NULL)
8783 elf_hash_table (info)->dynobj = dynobj = abfd;
861fb55a 8784 }
c5d6fa44 8785 break;
b49e97c9 8786
861fb55a
DJ
8787 case R_MIPS_26:
8788 case R_MIPS_PC16:
7361da2c
AB
8789 case R_MIPS_PC21_S2:
8790 case R_MIPS_PC26_S2:
861fb55a 8791 case R_MIPS16_26:
c9775dde 8792 case R_MIPS16_PC16_S1:
df58fc94
RS
8793 case R_MICROMIPS_26_S1:
8794 case R_MICROMIPS_PC7_S1:
8795 case R_MICROMIPS_PC10_S1:
8796 case R_MICROMIPS_PC16_S1:
8797 case R_MICROMIPS_PC23_S2:
c5d6fa44 8798 call_reloc_p = TRUE;
861fb55a 8799 break;
b49e97c9
TS
8800 }
8801
0a44bf69
RS
8802 if (h)
8803 {
c5d6fa44
RS
8804 if (constrain_symbol_p)
8805 {
8806 if (!can_make_dynamic_p)
8807 ((struct mips_elf_link_hash_entry *) h)->has_static_relocs = 1;
8808
8809 if (!call_reloc_p)
8810 h->pointer_equality_needed = 1;
8811
8812 /* We must not create a stub for a symbol that has
8813 relocations related to taking the function's address.
8814 This doesn't apply to VxWorks, where CALL relocs refer
8815 to a .got.plt entry instead of a normal .got entry. */
8816 if (!htab->is_vxworks && (!can_make_dynamic_p || !call_reloc_p))
8817 ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = TRUE;
8818 }
8819
0a44bf69
RS
8820 /* Relocations against the special VxWorks __GOTT_BASE__ and
8821 __GOTT_INDEX__ symbols must be left to the loader. Allocate
8822 room for them in .rela.dyn. */
8823 if (is_gott_symbol (info, h))
8824 {
8825 if (sreloc == NULL)
8826 {
8827 sreloc = mips_elf_rel_dyn_section (info, TRUE);
8828 if (sreloc == NULL)
8829 return FALSE;
8830 }
8831 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
9e3313ae
RS
8832 if (MIPS_ELF_READONLY_SECTION (sec))
8833 /* We tell the dynamic linker that there are
8834 relocations against the text segment. */
8835 info->flags |= DF_TEXTREL;
0a44bf69
RS
8836 }
8837 }
df58fc94
RS
8838 else if (call_lo16_reloc_p (r_type)
8839 || got_lo16_reloc_p (r_type)
8840 || got_disp_reloc_p (r_type)
738e5348 8841 || (got16_reloc_p (r_type) && htab->is_vxworks))
b49e97c9
TS
8842 {
8843 /* We may need a local GOT entry for this relocation. We
8844 don't count R_MIPS_GOT_PAGE because we can estimate the
8845 maximum number of pages needed by looking at the size of
738e5348
RS
8846 the segment. Similar comments apply to R_MIPS*_GOT16 and
8847 R_MIPS*_CALL16, except on VxWorks, where GOT relocations
0a44bf69 8848 always evaluate to "G". We don't count R_MIPS_GOT_HI16, or
b49e97c9 8849 R_MIPS_CALL_HI16 because these are always followed by an
b15e6682 8850 R_MIPS_GOT_LO16 or R_MIPS_CALL_LO16. */
a8028dd0 8851 if (!mips_elf_record_local_got_symbol (abfd, r_symndx,
e641e783 8852 rel->r_addend, info, r_type))
f4416af6 8853 return FALSE;
b49e97c9
TS
8854 }
8855
8f0c309a
CLT
8856 if (h != NULL
8857 && mips_elf_relocation_needs_la25_stub (abfd, r_type,
8858 ELF_ST_IS_MIPS16 (h->other)))
861fb55a
DJ
8859 ((struct mips_elf_link_hash_entry *) h)->has_nonpic_branches = TRUE;
8860
b49e97c9
TS
8861 switch (r_type)
8862 {
8863 case R_MIPS_CALL16:
738e5348 8864 case R_MIPS16_CALL16:
df58fc94 8865 case R_MICROMIPS_CALL16:
b49e97c9
TS
8866 if (h == NULL)
8867 {
4eca0228 8868 _bfd_error_handler
695344c0 8869 /* xgettext:c-format */
2dcf00ce
AM
8870 (_("%pB: CALL16 reloc at %#" PRIx64 " not against global symbol"),
8871 abfd, (uint64_t) rel->r_offset);
b49e97c9 8872 bfd_set_error (bfd_error_bad_value);
b34976b6 8873 return FALSE;
b49e97c9
TS
8874 }
8875 /* Fall through. */
8876
8877 case R_MIPS_CALL_HI16:
8878 case R_MIPS_CALL_LO16:
df58fc94
RS
8879 case R_MICROMIPS_CALL_HI16:
8880 case R_MICROMIPS_CALL_LO16:
b49e97c9
TS
8881 if (h != NULL)
8882 {
6ccf4795
RS
8883 /* Make sure there is room in the regular GOT to hold the
8884 function's address. We may eliminate it in favour of
8885 a .got.plt entry later; see mips_elf_count_got_symbols. */
e641e783
RS
8886 if (!mips_elf_record_global_got_symbol (h, abfd, info, TRUE,
8887 r_type))
b34976b6 8888 return FALSE;
b49e97c9
TS
8889
8890 /* We need a stub, not a plt entry for the undefined
8891 function. But we record it as if it needs plt. See
c152c796 8892 _bfd_elf_adjust_dynamic_symbol. */
f5385ebf 8893 h->needs_plt = 1;
b49e97c9
TS
8894 h->type = STT_FUNC;
8895 }
8896 break;
8897
0fdc1bf1 8898 case R_MIPS_GOT_PAGE:
df58fc94 8899 case R_MICROMIPS_GOT_PAGE:
738e5348 8900 case R_MIPS16_GOT16:
b49e97c9
TS
8901 case R_MIPS_GOT16:
8902 case R_MIPS_GOT_HI16:
8903 case R_MIPS_GOT_LO16:
df58fc94
RS
8904 case R_MICROMIPS_GOT16:
8905 case R_MICROMIPS_GOT_HI16:
8906 case R_MICROMIPS_GOT_LO16:
8907 if (!h || got_page_reloc_p (r_type))
c224138d 8908 {
3a3b6725
DJ
8909 /* This relocation needs (or may need, if h != NULL) a
8910 page entry in the GOT. For R_MIPS_GOT_PAGE we do not
8911 know for sure until we know whether the symbol is
8912 preemptible. */
c224138d
RS
8913 if (mips_elf_rel_relocation_p (abfd, sec, relocs, rel))
8914 {
8915 if (!mips_elf_get_section_contents (abfd, sec, &contents))
8916 return FALSE;
8917 howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, FALSE);
8918 addend = mips_elf_read_rel_addend (abfd, rel,
8919 howto, contents);
9684f078 8920 if (got16_reloc_p (r_type))
c224138d
RS
8921 mips_elf_add_lo16_rel_addend (abfd, rel, rel_end,
8922 contents, &addend);
8923 else
8924 addend <<= howto->rightshift;
8925 }
8926 else
8927 addend = rel->r_addend;
13db6b44
RS
8928 if (!mips_elf_record_got_page_ref (info, abfd, r_symndx,
8929 h, addend))
c224138d 8930 return FALSE;
13db6b44
RS
8931
8932 if (h)
8933 {
8934 struct mips_elf_link_hash_entry *hmips =
8935 (struct mips_elf_link_hash_entry *) h;
8936
8937 /* This symbol is definitely not overridable. */
8938 if (hmips->root.def_regular
0e1862bb 8939 && ! (bfd_link_pic (info) && ! info->symbolic
13db6b44
RS
8940 && ! hmips->root.forced_local))
8941 h = NULL;
8942 }
c224138d 8943 }
13db6b44
RS
8944 /* If this is a global, overridable symbol, GOT_PAGE will
8945 decay to GOT_DISP, so we'll need a GOT entry for it. */
c224138d
RS
8946 /* Fall through. */
8947
b49e97c9 8948 case R_MIPS_GOT_DISP:
df58fc94 8949 case R_MICROMIPS_GOT_DISP:
6ccf4795 8950 if (h && !mips_elf_record_global_got_symbol (h, abfd, info,
e641e783 8951 FALSE, r_type))
b34976b6 8952 return FALSE;
b49e97c9
TS
8953 break;
8954
0f20cc35 8955 case R_MIPS_TLS_GOTTPREL:
d0f13682 8956 case R_MIPS16_TLS_GOTTPREL:
df58fc94 8957 case R_MICROMIPS_TLS_GOTTPREL:
0e1862bb 8958 if (bfd_link_pic (info))
0f20cc35
DJ
8959 info->flags |= DF_STATIC_TLS;
8960 /* Fall through */
8961
8962 case R_MIPS_TLS_LDM:
d0f13682 8963 case R_MIPS16_TLS_LDM:
df58fc94
RS
8964 case R_MICROMIPS_TLS_LDM:
8965 if (tls_ldm_reloc_p (r_type))
0f20cc35 8966 {
cf35638d 8967 r_symndx = STN_UNDEF;
0f20cc35
DJ
8968 h = NULL;
8969 }
8970 /* Fall through */
8971
8972 case R_MIPS_TLS_GD:
d0f13682 8973 case R_MIPS16_TLS_GD:
df58fc94 8974 case R_MICROMIPS_TLS_GD:
0f20cc35
DJ
8975 /* This symbol requires a global offset table entry, or two
8976 for TLS GD relocations. */
e641e783
RS
8977 if (h != NULL)
8978 {
8979 if (!mips_elf_record_global_got_symbol (h, abfd, info,
8980 FALSE, r_type))
8981 return FALSE;
8982 }
8983 else
8984 {
8985 if (!mips_elf_record_local_got_symbol (abfd, r_symndx,
8986 rel->r_addend,
8987 info, r_type))
8988 return FALSE;
8989 }
0f20cc35
DJ
8990 break;
8991
b49e97c9
TS
8992 case R_MIPS_32:
8993 case R_MIPS_REL32:
8994 case R_MIPS_64:
0a44bf69
RS
8995 /* In VxWorks executables, references to external symbols
8996 are handled using copy relocs or PLT stubs, so there's
8997 no need to add a .rela.dyn entry for this relocation. */
861fb55a 8998 if (can_make_dynamic_p)
b49e97c9
TS
8999 {
9000 if (sreloc == NULL)
9001 {
0a44bf69 9002 sreloc = mips_elf_rel_dyn_section (info, TRUE);
b49e97c9 9003 if (sreloc == NULL)
f4416af6 9004 return FALSE;
b49e97c9 9005 }
0e1862bb 9006 if (bfd_link_pic (info) && h == NULL)
82f0cfbd
EC
9007 {
9008 /* When creating a shared object, we must copy these
9009 reloc types into the output file as R_MIPS_REL32
0a44bf69
RS
9010 relocs. Make room for this reloc in .rel(a).dyn. */
9011 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
943284cc 9012 if (MIPS_ELF_READONLY_SECTION (sec))
82f0cfbd
EC
9013 /* We tell the dynamic linker that there are
9014 relocations against the text segment. */
9015 info->flags |= DF_TEXTREL;
9016 }
b49e97c9
TS
9017 else
9018 {
9019 struct mips_elf_link_hash_entry *hmips;
82f0cfbd 9020
9a59ad6b
DJ
9021 /* For a shared object, we must copy this relocation
9022 unless the symbol turns out to be undefined and
9023 weak with non-default visibility, in which case
9024 it will be left as zero.
9025
9026 We could elide R_MIPS_REL32 for locally binding symbols
9027 in shared libraries, but do not yet do so.
9028
9029 For an executable, we only need to copy this
9030 reloc if the symbol is defined in a dynamic
9031 object. */
b49e97c9
TS
9032 hmips = (struct mips_elf_link_hash_entry *) h;
9033 ++hmips->possibly_dynamic_relocs;
943284cc 9034 if (MIPS_ELF_READONLY_SECTION (sec))
82f0cfbd
EC
9035 /* We need it to tell the dynamic linker if there
9036 are relocations against the text segment. */
9037 hmips->readonly_reloc = TRUE;
b49e97c9 9038 }
b49e97c9
TS
9039 }
9040
9041 if (SGI_COMPAT (abfd))
9042 mips_elf_hash_table (info)->compact_rel_size +=
9043 sizeof (Elf32_External_crinfo);
9044 break;
9045
9046 case R_MIPS_26:
9047 case R_MIPS_GPREL16:
9048 case R_MIPS_LITERAL:
9049 case R_MIPS_GPREL32:
df58fc94
RS
9050 case R_MICROMIPS_26_S1:
9051 case R_MICROMIPS_GPREL16:
9052 case R_MICROMIPS_LITERAL:
9053 case R_MICROMIPS_GPREL7_S2:
b49e97c9
TS
9054 if (SGI_COMPAT (abfd))
9055 mips_elf_hash_table (info)->compact_rel_size +=
9056 sizeof (Elf32_External_crinfo);
9057 break;
9058
9059 /* This relocation describes the C++ object vtable hierarchy.
9060 Reconstruct it for later use during GC. */
9061 case R_MIPS_GNU_VTINHERIT:
c152c796 9062 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 9063 return FALSE;
b49e97c9
TS
9064 break;
9065
9066 /* This relocation describes which C++ vtable entries are actually
9067 used. Record for later use during GC. */
9068 case R_MIPS_GNU_VTENTRY:
a0ea3a14 9069 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
b34976b6 9070 return FALSE;
b49e97c9
TS
9071 break;
9072
9073 default:
9074 break;
9075 }
9076
1bbce132 9077 /* Record the need for a PLT entry. At this point we don't know
07d6d2b8
AM
9078 yet if we are going to create a PLT in the first place, but
9079 we only record whether the relocation requires a standard MIPS
9080 or a compressed code entry anyway. If we don't make a PLT after
9081 all, then we'll just ignore these arrangements. Likewise if
9082 a PLT entry is not created because the symbol is satisfied
9083 locally. */
1bbce132 9084 if (h != NULL
54806ffa
MR
9085 && (branch_reloc_p (r_type)
9086 || mips16_branch_reloc_p (r_type)
9087 || micromips_branch_reloc_p (r_type))
1bbce132
MR
9088 && !SYMBOL_CALLS_LOCAL (info, h))
9089 {
9090 if (h->plt.plist == NULL)
9091 h->plt.plist = mips_elf_make_plt_record (abfd);
9092 if (h->plt.plist == NULL)
9093 return FALSE;
9094
54806ffa 9095 if (branch_reloc_p (r_type))
1bbce132
MR
9096 h->plt.plist->need_mips = TRUE;
9097 else
9098 h->plt.plist->need_comp = TRUE;
9099 }
9100
738e5348
RS
9101 /* See if this reloc would need to refer to a MIPS16 hard-float stub,
9102 if there is one. We only need to handle global symbols here;
9103 we decide whether to keep or delete stubs for local symbols
9104 when processing the stub's relocations. */
b49e97c9 9105 if (h != NULL
738e5348
RS
9106 && !mips16_call_reloc_p (r_type)
9107 && !section_allows_mips16_refs_p (sec))
b49e97c9
TS
9108 {
9109 struct mips_elf_link_hash_entry *mh;
9110
9111 mh = (struct mips_elf_link_hash_entry *) h;
b34976b6 9112 mh->need_fn_stub = TRUE;
b49e97c9 9113 }
861fb55a
DJ
9114
9115 /* Refuse some position-dependent relocations when creating a
9116 shared library. Do not refuse R_MIPS_32 / R_MIPS_64; they're
9117 not PIC, but we can create dynamic relocations and the result
9118 will be fine. Also do not refuse R_MIPS_LO16, which can be
9119 combined with R_MIPS_GOT16. */
0e1862bb 9120 if (bfd_link_pic (info))
861fb55a
DJ
9121 {
9122 switch (r_type)
9123 {
b474a202
FS
9124 case R_MIPS_TLS_TPREL_HI16:
9125 case R_MIPS16_TLS_TPREL_HI16:
9126 case R_MICROMIPS_TLS_TPREL_HI16:
9127 case R_MIPS_TLS_TPREL_LO16:
9128 case R_MIPS16_TLS_TPREL_LO16:
9129 case R_MICROMIPS_TLS_TPREL_LO16:
9130 /* These are okay in PIE, but not in a shared library. */
9131 if (bfd_link_executable (info))
9132 break;
9133
9134 /* FALLTHROUGH */
9135
861fb55a
DJ
9136 case R_MIPS16_HI16:
9137 case R_MIPS_HI16:
9138 case R_MIPS_HIGHER:
9139 case R_MIPS_HIGHEST:
df58fc94
RS
9140 case R_MICROMIPS_HI16:
9141 case R_MICROMIPS_HIGHER:
9142 case R_MICROMIPS_HIGHEST:
861fb55a
DJ
9143 /* Don't refuse a high part relocation if it's against
9144 no symbol (e.g. part of a compound relocation). */
cf35638d 9145 if (r_symndx == STN_UNDEF)
861fb55a
DJ
9146 break;
9147
3c7687b9 9148 /* Likewise an absolute symbol. */
304f09d0 9149 if (h != NULL && bfd_is_abs_symbol (&h->root))
3c7687b9
MR
9150 break;
9151
861fb55a
DJ
9152 /* R_MIPS_HI16 against _gp_disp is used for $gp setup,
9153 and has a special meaning. */
9154 if (!NEWABI_P (abfd) && h != NULL
9155 && strcmp (h->root.root.string, "_gp_disp") == 0)
9156 break;
9157
0fc1eb3c
RS
9158 /* Likewise __GOTT_BASE__ and __GOTT_INDEX__ on VxWorks. */
9159 if (is_gott_symbol (info, h))
9160 break;
9161
861fb55a
DJ
9162 /* FALLTHROUGH */
9163
9164 case R_MIPS16_26:
9165 case R_MIPS_26:
df58fc94 9166 case R_MICROMIPS_26_S1:
304f09d0
FS
9167 howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, NEWABI_P (abfd));
9168 /* An error for unsupported relocations is raised as part
9169 of the above search, so we can skip the following. */
9170 if (howto != NULL)
9171 info->callbacks->einfo
9172 /* xgettext:c-format */
9173 (_("%X%H: relocation %s against `%s' cannot be used"
9174 " when making a shared object; recompile with -fPIC\n"),
9175 abfd, sec, rel->r_offset, howto->name,
9176 (h) ? h->root.root.string : "a local symbol");
aff68bd0 9177 break;
861fb55a
DJ
9178 default:
9179 break;
9180 }
9181 }
b49e97c9
TS
9182 }
9183
b34976b6 9184 return TRUE;
b49e97c9
TS
9185}
9186\f
9a59ad6b
DJ
9187/* Allocate space for global sym dynamic relocs. */
9188
9189static bfd_boolean
9190allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
9191{
9192 struct bfd_link_info *info = inf;
9193 bfd *dynobj;
9194 struct mips_elf_link_hash_entry *hmips;
9195 struct mips_elf_link_hash_table *htab;
9196
9197 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9198 BFD_ASSERT (htab != NULL);
9199
9a59ad6b
DJ
9200 dynobj = elf_hash_table (info)->dynobj;
9201 hmips = (struct mips_elf_link_hash_entry *) h;
9202
9203 /* VxWorks executables are handled elsewhere; we only need to
9204 allocate relocations in shared objects. */
0e1862bb 9205 if (htab->is_vxworks && !bfd_link_pic (info))
9a59ad6b
DJ
9206 return TRUE;
9207
7686d77d
AM
9208 /* Ignore indirect symbols. All relocations against such symbols
9209 will be redirected to the target symbol. */
9210 if (h->root.type == bfd_link_hash_indirect)
63897e2c
RS
9211 return TRUE;
9212
9a59ad6b
DJ
9213 /* If this symbol is defined in a dynamic object, or we are creating
9214 a shared library, we will need to copy any R_MIPS_32 or
9215 R_MIPS_REL32 relocs against it into the output file. */
0e1862bb 9216 if (! bfd_link_relocatable (info)
9a59ad6b
DJ
9217 && hmips->possibly_dynamic_relocs != 0
9218 && (h->root.type == bfd_link_hash_defweak
625ef6dc 9219 || (!h->def_regular && !ELF_COMMON_DEF_P (h))
0e1862bb 9220 || bfd_link_pic (info)))
9a59ad6b
DJ
9221 {
9222 bfd_boolean do_copy = TRUE;
9223
9224 if (h->root.type == bfd_link_hash_undefweak)
9225 {
262e07d0
MR
9226 /* Do not copy relocations for undefined weak symbols that
9227 we are not going to export. */
9228 if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
9a59ad6b
DJ
9229 do_copy = FALSE;
9230
9231 /* Make sure undefined weak symbols are output as a dynamic
9232 symbol in PIEs. */
9233 else if (h->dynindx == -1 && !h->forced_local)
9234 {
9235 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9236 return FALSE;
9237 }
9238 }
9239
9240 if (do_copy)
9241 {
aff469fa 9242 /* Even though we don't directly need a GOT entry for this symbol,
f7ff1106
RS
9243 the SVR4 psABI requires it to have a dynamic symbol table
9244 index greater that DT_MIPS_GOTSYM if there are dynamic
9245 relocations against it.
9246
9247 VxWorks does not enforce the same mapping between the GOT
9248 and the symbol table, so the same requirement does not
9249 apply there. */
6ccf4795
RS
9250 if (!htab->is_vxworks)
9251 {
9252 if (hmips->global_got_area > GGA_RELOC_ONLY)
9253 hmips->global_got_area = GGA_RELOC_ONLY;
9254 hmips->got_only_for_calls = FALSE;
9255 }
aff469fa 9256
9a59ad6b
DJ
9257 mips_elf_allocate_dynamic_relocations
9258 (dynobj, info, hmips->possibly_dynamic_relocs);
9259 if (hmips->readonly_reloc)
9260 /* We tell the dynamic linker that there are relocations
9261 against the text segment. */
9262 info->flags |= DF_TEXTREL;
9263 }
9264 }
9265
9266 return TRUE;
9267}
9268
b49e97c9
TS
9269/* Adjust a symbol defined by a dynamic object and referenced by a
9270 regular object. The current definition is in some section of the
9271 dynamic object, but we're not including those sections. We have to
9272 change the definition to something the rest of the link can
9273 understand. */
9274
b34976b6 9275bfd_boolean
9719ad41
RS
9276_bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
9277 struct elf_link_hash_entry *h)
b49e97c9
TS
9278{
9279 bfd *dynobj;
9280 struct mips_elf_link_hash_entry *hmips;
5108fc1b 9281 struct mips_elf_link_hash_table *htab;
5474d94f 9282 asection *s, *srel;
b49e97c9 9283
5108fc1b 9284 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9285 BFD_ASSERT (htab != NULL);
9286
b49e97c9 9287 dynobj = elf_hash_table (info)->dynobj;
861fb55a 9288 hmips = (struct mips_elf_link_hash_entry *) h;
b49e97c9
TS
9289
9290 /* Make sure we know what is going on here. */
8e4979ac
NC
9291 if (dynobj == NULL
9292 || (! h->needs_plt
9293 && ! h->is_weakalias
9294 && (! h->def_dynamic
9295 || ! h->ref_regular
9296 || h->def_regular)))
9297 {
9298 if (h->type == STT_GNU_IFUNC)
9299 _bfd_error_handler (_("IFUNC symbol %s in dynamic symbol table - IFUNCS are not supported"),
9300 h->root.root.string);
9301 else
9302 _bfd_error_handler (_("non-dynamic symbol %s in dynamic symbol table"),
9303 h->root.root.string);
9304 return TRUE;
9305 }
b49e97c9 9306
b49e97c9 9307 hmips = (struct mips_elf_link_hash_entry *) h;
b49e97c9 9308
861fb55a
DJ
9309 /* If there are call relocations against an externally-defined symbol,
9310 see whether we can create a MIPS lazy-binding stub for it. We can
9311 only do this if all references to the function are through call
9312 relocations, and in that case, the traditional lazy-binding stubs
9313 are much more efficient than PLT entries.
9314
9315 Traditional stubs are only available on SVR4 psABI-based systems;
9316 VxWorks always uses PLTs instead. */
9317 if (!htab->is_vxworks && h->needs_plt && !hmips->no_fn_stub)
b49e97c9
TS
9318 {
9319 if (! elf_hash_table (info)->dynamic_sections_created)
b34976b6 9320 return TRUE;
b49e97c9
TS
9321
9322 /* If this symbol is not defined in a regular file, then set
9323 the symbol to the stub location. This is required to make
9324 function pointers compare as equal between the normal
9325 executable and the shared library. */
4b8377e7
MR
9326 if (!h->def_regular
9327 && !bfd_is_abs_section (htab->sstubs->output_section))
b49e97c9 9328 {
33bb52fb
RS
9329 hmips->needs_lazy_stub = TRUE;
9330 htab->lazy_stub_count++;
b34976b6 9331 return TRUE;
b49e97c9
TS
9332 }
9333 }
861fb55a
DJ
9334 /* As above, VxWorks requires PLT entries for externally-defined
9335 functions that are only accessed through call relocations.
b49e97c9 9336
861fb55a
DJ
9337 Both VxWorks and non-VxWorks targets also need PLT entries if there
9338 are static-only relocations against an externally-defined function.
9339 This can technically occur for shared libraries if there are
9340 branches to the symbol, although it is unlikely that this will be
9341 used in practice due to the short ranges involved. It can occur
9342 for any relative or absolute relocation in executables; in that
9343 case, the PLT entry becomes the function's canonical address. */
9344 else if (((h->needs_plt && !hmips->no_fn_stub)
9345 || (h->type == STT_FUNC && hmips->has_static_relocs))
9346 && htab->use_plts_and_copy_relocs
9347 && !SYMBOL_CALLS_LOCAL (info, h)
9348 && !(ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
9349 && h->root.type == bfd_link_hash_undefweak))
b49e97c9 9350 {
1bbce132
MR
9351 bfd_boolean micromips_p = MICROMIPS_P (info->output_bfd);
9352 bfd_boolean newabi_p = NEWABI_P (info->output_bfd);
9353
9354 /* If this is the first symbol to need a PLT entry, then make some
07d6d2b8
AM
9355 basic setup. Also work out PLT entry sizes. We'll need them
9356 for PLT offset calculations. */
1bbce132 9357 if (htab->plt_mips_offset + htab->plt_comp_offset == 0)
861fb55a 9358 {
ce558b89 9359 BFD_ASSERT (htab->root.sgotplt->size == 0);
1bbce132 9360 BFD_ASSERT (htab->plt_got_index == 0);
0a44bf69 9361
861fb55a
DJ
9362 /* If we're using the PLT additions to the psABI, each PLT
9363 entry is 16 bytes and the PLT0 entry is 32 bytes.
9364 Encourage better cache usage by aligning. We do this
9365 lazily to avoid pessimizing traditional objects. */
9366 if (!htab->is_vxworks
fd361982 9367 && !bfd_set_section_alignment (htab->root.splt, 5))
861fb55a 9368 return FALSE;
0a44bf69 9369
861fb55a
DJ
9370 /* Make sure that .got.plt is word-aligned. We do this lazily
9371 for the same reason as above. */
fd361982 9372 if (!bfd_set_section_alignment (htab->root.sgotplt,
861fb55a
DJ
9373 MIPS_ELF_LOG_FILE_ALIGN (dynobj)))
9374 return FALSE;
0a44bf69 9375
861fb55a
DJ
9376 /* On non-VxWorks targets, the first two entries in .got.plt
9377 are reserved. */
9378 if (!htab->is_vxworks)
1bbce132
MR
9379 htab->plt_got_index
9380 += (get_elf_backend_data (dynobj)->got_header_size
9381 / MIPS_ELF_GOT_SIZE (dynobj));
0a44bf69 9382
861fb55a
DJ
9383 /* On VxWorks, also allocate room for the header's
9384 .rela.plt.unloaded entries. */
0e1862bb 9385 if (htab->is_vxworks && !bfd_link_pic (info))
0a44bf69 9386 htab->srelplt2->size += 2 * sizeof (Elf32_External_Rela);
1bbce132
MR
9387
9388 /* Now work out the sizes of individual PLT entries. */
0e1862bb 9389 if (htab->is_vxworks && bfd_link_pic (info))
1bbce132
MR
9390 htab->plt_mips_entry_size
9391 = 4 * ARRAY_SIZE (mips_vxworks_shared_plt_entry);
9392 else if (htab->is_vxworks)
9393 htab->plt_mips_entry_size
9394 = 4 * ARRAY_SIZE (mips_vxworks_exec_plt_entry);
9395 else if (newabi_p)
9396 htab->plt_mips_entry_size
9397 = 4 * ARRAY_SIZE (mips_exec_plt_entry);
833794fc 9398 else if (!micromips_p)
1bbce132
MR
9399 {
9400 htab->plt_mips_entry_size
9401 = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9402 htab->plt_comp_entry_size
833794fc
MR
9403 = 2 * ARRAY_SIZE (mips16_o32_exec_plt_entry);
9404 }
9405 else if (htab->insn32)
9406 {
9407 htab->plt_mips_entry_size
9408 = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9409 htab->plt_comp_entry_size
9410 = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt_entry);
1bbce132
MR
9411 }
9412 else
9413 {
9414 htab->plt_mips_entry_size
9415 = 4 * ARRAY_SIZE (mips_exec_plt_entry);
9416 htab->plt_comp_entry_size
833794fc 9417 = 2 * ARRAY_SIZE (micromips_o32_exec_plt_entry);
1bbce132 9418 }
0a44bf69
RS
9419 }
9420
1bbce132
MR
9421 if (h->plt.plist == NULL)
9422 h->plt.plist = mips_elf_make_plt_record (dynobj);
9423 if (h->plt.plist == NULL)
9424 return FALSE;
9425
9426 /* There are no defined MIPS16 or microMIPS PLT entries for VxWorks,
07d6d2b8 9427 n32 or n64, so always use a standard entry there.
1bbce132 9428
07d6d2b8
AM
9429 If the symbol has a MIPS16 call stub and gets a PLT entry, then
9430 all MIPS16 calls will go via that stub, and there is no benefit
9431 to having a MIPS16 entry. And in the case of call_stub a
9432 standard entry actually has to be used as the stub ends with a J
9433 instruction. */
1bbce132
MR
9434 if (newabi_p
9435 || htab->is_vxworks
9436 || hmips->call_stub
9437 || hmips->call_fp_stub)
9438 {
9439 h->plt.plist->need_mips = TRUE;
9440 h->plt.plist->need_comp = FALSE;
9441 }
9442
9443 /* Otherwise, if there are no direct calls to the function, we
07d6d2b8
AM
9444 have a free choice of whether to use standard or compressed
9445 entries. Prefer microMIPS entries if the object is known to
9446 contain microMIPS code, so that it becomes possible to create
9447 pure microMIPS binaries. Prefer standard entries otherwise,
9448 because MIPS16 ones are no smaller and are usually slower. */
1bbce132
MR
9449 if (!h->plt.plist->need_mips && !h->plt.plist->need_comp)
9450 {
9451 if (micromips_p)
9452 h->plt.plist->need_comp = TRUE;
9453 else
9454 h->plt.plist->need_mips = TRUE;
9455 }
9456
9457 if (h->plt.plist->need_mips)
9458 {
9459 h->plt.plist->mips_offset = htab->plt_mips_offset;
9460 htab->plt_mips_offset += htab->plt_mips_entry_size;
9461 }
9462 if (h->plt.plist->need_comp)
9463 {
9464 h->plt.plist->comp_offset = htab->plt_comp_offset;
9465 htab->plt_comp_offset += htab->plt_comp_entry_size;
9466 }
9467
9468 /* Reserve the corresponding .got.plt entry now too. */
9469 h->plt.plist->gotplt_index = htab->plt_got_index++;
0a44bf69
RS
9470
9471 /* If the output file has no definition of the symbol, set the
861fb55a 9472 symbol's value to the address of the stub. */
0e1862bb 9473 if (!bfd_link_pic (info) && !h->def_regular)
1bbce132 9474 hmips->use_plt_entry = TRUE;
0a44bf69 9475
1bbce132 9476 /* Make room for the R_MIPS_JUMP_SLOT relocation. */
ce558b89
AM
9477 htab->root.srelplt->size += (htab->is_vxworks
9478 ? MIPS_ELF_RELA_SIZE (dynobj)
9479 : MIPS_ELF_REL_SIZE (dynobj));
0a44bf69
RS
9480
9481 /* Make room for the .rela.plt.unloaded relocations. */
0e1862bb 9482 if (htab->is_vxworks && !bfd_link_pic (info))
0a44bf69
RS
9483 htab->srelplt2->size += 3 * sizeof (Elf32_External_Rela);
9484
861fb55a
DJ
9485 /* All relocations against this symbol that could have been made
9486 dynamic will now refer to the PLT entry instead. */
9487 hmips->possibly_dynamic_relocs = 0;
0a44bf69 9488
0a44bf69
RS
9489 return TRUE;
9490 }
9491
9492 /* If this is a weak symbol, and there is a real definition, the
9493 processor independent code will have arranged for us to see the
9494 real definition first, and we can just use the same value. */
60d67dc8 9495 if (h->is_weakalias)
0a44bf69 9496 {
60d67dc8
AM
9497 struct elf_link_hash_entry *def = weakdef (h);
9498 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
9499 h->root.u.def.section = def->root.u.def.section;
9500 h->root.u.def.value = def->root.u.def.value;
0a44bf69
RS
9501 return TRUE;
9502 }
9503
861fb55a
DJ
9504 /* Otherwise, there is nothing further to do for symbols defined
9505 in regular objects. */
9506 if (h->def_regular)
0a44bf69
RS
9507 return TRUE;
9508
861fb55a
DJ
9509 /* There's also nothing more to do if we'll convert all relocations
9510 against this symbol into dynamic relocations. */
9511 if (!hmips->has_static_relocs)
9512 return TRUE;
9513
9514 /* We're now relying on copy relocations. Complain if we have
9515 some that we can't convert. */
0e1862bb 9516 if (!htab->use_plts_and_copy_relocs || bfd_link_pic (info))
861fb55a 9517 {
4eca0228
AM
9518 _bfd_error_handler (_("non-dynamic relocations refer to "
9519 "dynamic symbol %s"),
9520 h->root.root.string);
861fb55a
DJ
9521 bfd_set_error (bfd_error_bad_value);
9522 return FALSE;
9523 }
9524
0a44bf69
RS
9525 /* We must allocate the symbol in our .dynbss section, which will
9526 become part of the .bss section of the executable. There will be
9527 an entry for this symbol in the .dynsym section. The dynamic
9528 object will contain position independent code, so all references
9529 from the dynamic object to this symbol will go through the global
9530 offset table. The dynamic linker will use the .dynsym entry to
9531 determine the address it must put in the global offset table, so
9532 both the dynamic object and the regular object will refer to the
9533 same memory location for the variable. */
9534
5474d94f
AM
9535 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
9536 {
9537 s = htab->root.sdynrelro;
9538 srel = htab->root.sreldynrelro;
9539 }
9540 else
9541 {
9542 s = htab->root.sdynbss;
9543 srel = htab->root.srelbss;
9544 }
0a44bf69
RS
9545 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
9546 {
861fb55a 9547 if (htab->is_vxworks)
5474d94f 9548 srel->size += sizeof (Elf32_External_Rela);
861fb55a
DJ
9549 else
9550 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
0a44bf69
RS
9551 h->needs_copy = 1;
9552 }
9553
861fb55a
DJ
9554 /* All relocations against this symbol that could have been made
9555 dynamic will now refer to the local copy instead. */
9556 hmips->possibly_dynamic_relocs = 0;
9557
5474d94f 9558 return _bfd_elf_adjust_dynamic_copy (info, h, s);
0a44bf69 9559}
b49e97c9
TS
9560\f
9561/* This function is called after all the input files have been read,
9562 and the input sections have been assigned to output sections. We
9563 check for any mips16 stub sections that we can discard. */
9564
b34976b6 9565bfd_boolean
9719ad41
RS
9566_bfd_mips_elf_always_size_sections (bfd *output_bfd,
9567 struct bfd_link_info *info)
b49e97c9 9568{
351cdf24 9569 asection *sect;
0a44bf69 9570 struct mips_elf_link_hash_table *htab;
861fb55a 9571 struct mips_htab_traverse_info hti;
0a44bf69
RS
9572
9573 htab = mips_elf_hash_table (info);
4dfe6ac6 9574 BFD_ASSERT (htab != NULL);
f4416af6 9575
b49e97c9 9576 /* The .reginfo section has a fixed size. */
351cdf24
MF
9577 sect = bfd_get_section_by_name (output_bfd, ".reginfo");
9578 if (sect != NULL)
6798f8bf 9579 {
fd361982 9580 bfd_set_section_size (sect, sizeof (Elf32_External_RegInfo));
6798f8bf
MR
9581 sect->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
9582 }
351cdf24
MF
9583
9584 /* The .MIPS.abiflags section has a fixed size. */
9585 sect = bfd_get_section_by_name (output_bfd, ".MIPS.abiflags");
9586 if (sect != NULL)
6798f8bf 9587 {
fd361982 9588 bfd_set_section_size (sect, sizeof (Elf_External_ABIFlags_v0));
6798f8bf
MR
9589 sect->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
9590 }
b49e97c9 9591
861fb55a
DJ
9592 hti.info = info;
9593 hti.output_bfd = output_bfd;
9594 hti.error = FALSE;
9595 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
9596 mips_elf_check_symbols, &hti);
9597 if (hti.error)
9598 return FALSE;
f4416af6 9599
33bb52fb
RS
9600 return TRUE;
9601}
9602
9603/* If the link uses a GOT, lay it out and work out its size. */
9604
9605static bfd_boolean
9606mips_elf_lay_out_got (bfd *output_bfd, struct bfd_link_info *info)
9607{
9608 bfd *dynobj;
9609 asection *s;
9610 struct mips_got_info *g;
33bb52fb
RS
9611 bfd_size_type loadable_size = 0;
9612 bfd_size_type page_gotno;
d7206569 9613 bfd *ibfd;
ab361d49 9614 struct mips_elf_traverse_got_arg tga;
33bb52fb
RS
9615 struct mips_elf_link_hash_table *htab;
9616
9617 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9618 BFD_ASSERT (htab != NULL);
9619
ce558b89 9620 s = htab->root.sgot;
f4416af6 9621 if (s == NULL)
b34976b6 9622 return TRUE;
b49e97c9 9623
33bb52fb 9624 dynobj = elf_hash_table (info)->dynobj;
a8028dd0
RS
9625 g = htab->got_info;
9626
861fb55a
DJ
9627 /* Allocate room for the reserved entries. VxWorks always reserves
9628 3 entries; other objects only reserve 2 entries. */
cb22ccf4 9629 BFD_ASSERT (g->assigned_low_gotno == 0);
861fb55a
DJ
9630 if (htab->is_vxworks)
9631 htab->reserved_gotno = 3;
9632 else
9633 htab->reserved_gotno = 2;
9634 g->local_gotno += htab->reserved_gotno;
cb22ccf4 9635 g->assigned_low_gotno = htab->reserved_gotno;
861fb55a 9636
6c42ddb9
RS
9637 /* Decide which symbols need to go in the global part of the GOT and
9638 count the number of reloc-only GOT symbols. */
020d7251 9639 mips_elf_link_hash_traverse (htab, mips_elf_count_got_symbols, info);
f4416af6 9640
13db6b44
RS
9641 if (!mips_elf_resolve_final_got_entries (info, g))
9642 return FALSE;
9643
33bb52fb
RS
9644 /* Calculate the total loadable size of the output. That
9645 will give us the maximum number of GOT_PAGE entries
9646 required. */
c72f2fb2 9647 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
33bb52fb
RS
9648 {
9649 asection *subsection;
5108fc1b 9650
d7206569 9651 for (subsection = ibfd->sections;
33bb52fb
RS
9652 subsection;
9653 subsection = subsection->next)
9654 {
9655 if ((subsection->flags & SEC_ALLOC) == 0)
9656 continue;
9657 loadable_size += ((subsection->size + 0xf)
9658 &~ (bfd_size_type) 0xf);
9659 }
9660 }
f4416af6 9661
0a44bf69 9662 if (htab->is_vxworks)
738e5348 9663 /* There's no need to allocate page entries for VxWorks; R_MIPS*_GOT16
0a44bf69
RS
9664 relocations against local symbols evaluate to "G", and the EABI does
9665 not include R_MIPS_GOT_PAGE. */
c224138d 9666 page_gotno = 0;
0a44bf69
RS
9667 else
9668 /* Assume there are two loadable segments consisting of contiguous
9669 sections. Is 5 enough? */
c224138d
RS
9670 page_gotno = (loadable_size >> 16) + 5;
9671
13db6b44 9672 /* Choose the smaller of the two page estimates; both are intended to be
c224138d
RS
9673 conservative. */
9674 if (page_gotno > g->page_gotno)
9675 page_gotno = g->page_gotno;
f4416af6 9676
c224138d 9677 g->local_gotno += page_gotno;
cb22ccf4 9678 g->assigned_high_gotno = g->local_gotno - 1;
ab361d49 9679
ab361d49
RS
9680 s->size += g->local_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
9681 s->size += g->global_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
0f20cc35
DJ
9682 s->size += g->tls_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
9683
0a44bf69
RS
9684 /* VxWorks does not support multiple GOTs. It initializes $gp to
9685 __GOTT_BASE__[__GOTT_INDEX__], the value of which is set by the
9686 dynamic loader. */
57093f5e 9687 if (!htab->is_vxworks && s->size > MIPS_ELF_GOT_MAX_SIZE (info))
0f20cc35 9688 {
a8028dd0 9689 if (!mips_elf_multi_got (output_bfd, info, s, page_gotno))
0f20cc35
DJ
9690 return FALSE;
9691 }
9692 else
9693 {
d7206569
RS
9694 /* Record that all bfds use G. This also has the effect of freeing
9695 the per-bfd GOTs, which we no longer need. */
c72f2fb2 9696 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
d7206569
RS
9697 if (mips_elf_bfd_got (ibfd, FALSE))
9698 mips_elf_replace_bfd_got (ibfd, g);
9699 mips_elf_replace_bfd_got (output_bfd, g);
9700
33bb52fb 9701 /* Set up TLS entries. */
0f20cc35 9702 g->tls_assigned_gotno = g->global_gotno + g->local_gotno;
72e7511a
RS
9703 tga.info = info;
9704 tga.g = g;
9705 tga.value = MIPS_ELF_GOT_SIZE (output_bfd);
9706 htab_traverse (g->got_entries, mips_elf_initialize_tls_index, &tga);
9707 if (!tga.g)
9708 return FALSE;
1fd20d70
RS
9709 BFD_ASSERT (g->tls_assigned_gotno
9710 == g->global_gotno + g->local_gotno + g->tls_gotno);
33bb52fb 9711
57093f5e 9712 /* Each VxWorks GOT entry needs an explicit relocation. */
0e1862bb 9713 if (htab->is_vxworks && bfd_link_pic (info))
57093f5e
RS
9714 g->relocs += g->global_gotno + g->local_gotno - htab->reserved_gotno;
9715
33bb52fb 9716 /* Allocate room for the TLS relocations. */
ab361d49
RS
9717 if (g->relocs)
9718 mips_elf_allocate_dynamic_relocations (dynobj, info, g->relocs);
0f20cc35 9719 }
b49e97c9 9720
b34976b6 9721 return TRUE;
b49e97c9
TS
9722}
9723
33bb52fb
RS
9724/* Estimate the size of the .MIPS.stubs section. */
9725
9726static void
9727mips_elf_estimate_stub_size (bfd *output_bfd, struct bfd_link_info *info)
9728{
9729 struct mips_elf_link_hash_table *htab;
9730 bfd_size_type dynsymcount;
9731
9732 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9733 BFD_ASSERT (htab != NULL);
9734
33bb52fb
RS
9735 if (htab->lazy_stub_count == 0)
9736 return;
9737
9738 /* IRIX rld assumes that a function stub isn't at the end of the .text
9739 section, so add a dummy entry to the end. */
9740 htab->lazy_stub_count++;
9741
9742 /* Get a worst-case estimate of the number of dynamic symbols needed.
9743 At this point, dynsymcount does not account for section symbols
9744 and count_section_dynsyms may overestimate the number that will
9745 be needed. */
9746 dynsymcount = (elf_hash_table (info)->dynsymcount
9747 + count_section_dynsyms (output_bfd, info));
9748
1bbce132
MR
9749 /* Determine the size of one stub entry. There's no disadvantage
9750 from using microMIPS code here, so for the sake of pure-microMIPS
9751 binaries we prefer it whenever there's any microMIPS code in
9752 output produced at all. This has a benefit of stubs being
833794fc
MR
9753 shorter by 4 bytes each too, unless in the insn32 mode. */
9754 if (!MICROMIPS_P (output_bfd))
1bbce132
MR
9755 htab->function_stub_size = (dynsymcount > 0x10000
9756 ? MIPS_FUNCTION_STUB_BIG_SIZE
9757 : MIPS_FUNCTION_STUB_NORMAL_SIZE);
833794fc
MR
9758 else if (htab->insn32)
9759 htab->function_stub_size = (dynsymcount > 0x10000
9760 ? MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE
9761 : MICROMIPS_INSN32_FUNCTION_STUB_NORMAL_SIZE);
9762 else
9763 htab->function_stub_size = (dynsymcount > 0x10000
9764 ? MICROMIPS_FUNCTION_STUB_BIG_SIZE
9765 : MICROMIPS_FUNCTION_STUB_NORMAL_SIZE);
33bb52fb
RS
9766
9767 htab->sstubs->size = htab->lazy_stub_count * htab->function_stub_size;
9768}
9769
1bbce132
MR
9770/* A mips_elf_link_hash_traverse callback for which DATA points to a
9771 mips_htab_traverse_info. If H needs a traditional MIPS lazy-binding
9772 stub, allocate an entry in the stubs section. */
33bb52fb
RS
9773
9774static bfd_boolean
af924177 9775mips_elf_allocate_lazy_stub (struct mips_elf_link_hash_entry *h, void *data)
33bb52fb 9776{
1bbce132 9777 struct mips_htab_traverse_info *hti = data;
33bb52fb 9778 struct mips_elf_link_hash_table *htab;
1bbce132
MR
9779 struct bfd_link_info *info;
9780 bfd *output_bfd;
9781
9782 info = hti->info;
9783 output_bfd = hti->output_bfd;
9784 htab = mips_elf_hash_table (info);
9785 BFD_ASSERT (htab != NULL);
33bb52fb 9786
33bb52fb
RS
9787 if (h->needs_lazy_stub)
9788 {
1bbce132
MR
9789 bfd_boolean micromips_p = MICROMIPS_P (output_bfd);
9790 unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9791 bfd_vma isa_bit = micromips_p;
9792
9793 BFD_ASSERT (htab->root.dynobj != NULL);
9794 if (h->root.plt.plist == NULL)
9795 h->root.plt.plist = mips_elf_make_plt_record (htab->sstubs->owner);
9796 if (h->root.plt.plist == NULL)
9797 {
9798 hti->error = TRUE;
9799 return FALSE;
9800 }
33bb52fb 9801 h->root.root.u.def.section = htab->sstubs;
1bbce132
MR
9802 h->root.root.u.def.value = htab->sstubs->size + isa_bit;
9803 h->root.plt.plist->stub_offset = htab->sstubs->size;
9804 h->root.other = other;
33bb52fb
RS
9805 htab->sstubs->size += htab->function_stub_size;
9806 }
9807 return TRUE;
9808}
9809
9810/* Allocate offsets in the stubs section to each symbol that needs one.
9811 Set the final size of the .MIPS.stub section. */
9812
1bbce132 9813static bfd_boolean
33bb52fb
RS
9814mips_elf_lay_out_lazy_stubs (struct bfd_link_info *info)
9815{
1bbce132
MR
9816 bfd *output_bfd = info->output_bfd;
9817 bfd_boolean micromips_p = MICROMIPS_P (output_bfd);
9818 unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9819 bfd_vma isa_bit = micromips_p;
33bb52fb 9820 struct mips_elf_link_hash_table *htab;
1bbce132
MR
9821 struct mips_htab_traverse_info hti;
9822 struct elf_link_hash_entry *h;
9823 bfd *dynobj;
33bb52fb
RS
9824
9825 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9826 BFD_ASSERT (htab != NULL);
9827
33bb52fb 9828 if (htab->lazy_stub_count == 0)
1bbce132 9829 return TRUE;
33bb52fb
RS
9830
9831 htab->sstubs->size = 0;
1bbce132
MR
9832 hti.info = info;
9833 hti.output_bfd = output_bfd;
9834 hti.error = FALSE;
9835 mips_elf_link_hash_traverse (htab, mips_elf_allocate_lazy_stub, &hti);
9836 if (hti.error)
9837 return FALSE;
33bb52fb
RS
9838 htab->sstubs->size += htab->function_stub_size;
9839 BFD_ASSERT (htab->sstubs->size
9840 == htab->lazy_stub_count * htab->function_stub_size);
1bbce132
MR
9841
9842 dynobj = elf_hash_table (info)->dynobj;
9843 BFD_ASSERT (dynobj != NULL);
9844 h = _bfd_elf_define_linkage_sym (dynobj, info, htab->sstubs, "_MIPS_STUBS_");
9845 if (h == NULL)
9846 return FALSE;
9847 h->root.u.def.value = isa_bit;
9848 h->other = other;
9849 h->type = STT_FUNC;
9850
9851 return TRUE;
9852}
9853
9854/* A mips_elf_link_hash_traverse callback for which DATA points to a
9855 bfd_link_info. If H uses the address of a PLT entry as the value
9856 of the symbol, then set the entry in the symbol table now. Prefer
9857 a standard MIPS PLT entry. */
9858
9859static bfd_boolean
9860mips_elf_set_plt_sym_value (struct mips_elf_link_hash_entry *h, void *data)
9861{
9862 struct bfd_link_info *info = data;
9863 bfd_boolean micromips_p = MICROMIPS_P (info->output_bfd);
9864 struct mips_elf_link_hash_table *htab;
9865 unsigned int other;
9866 bfd_vma isa_bit;
9867 bfd_vma val;
9868
9869 htab = mips_elf_hash_table (info);
9870 BFD_ASSERT (htab != NULL);
9871
9872 if (h->use_plt_entry)
9873 {
9874 BFD_ASSERT (h->root.plt.plist != NULL);
9875 BFD_ASSERT (h->root.plt.plist->mips_offset != MINUS_ONE
9876 || h->root.plt.plist->comp_offset != MINUS_ONE);
9877
9878 val = htab->plt_header_size;
9879 if (h->root.plt.plist->mips_offset != MINUS_ONE)
9880 {
9881 isa_bit = 0;
9882 val += h->root.plt.plist->mips_offset;
9883 other = 0;
9884 }
9885 else
9886 {
9887 isa_bit = 1;
9888 val += htab->plt_mips_offset + h->root.plt.plist->comp_offset;
9889 other = micromips_p ? STO_MICROMIPS : STO_MIPS16;
9890 }
9891 val += isa_bit;
9892 /* For VxWorks, point at the PLT load stub rather than the lazy
07d6d2b8
AM
9893 resolution stub; this stub will become the canonical function
9894 address. */
1bbce132
MR
9895 if (htab->is_vxworks)
9896 val += 8;
9897
ce558b89 9898 h->root.root.u.def.section = htab->root.splt;
1bbce132
MR
9899 h->root.root.u.def.value = val;
9900 h->root.other = other;
9901 }
9902
9903 return TRUE;
33bb52fb
RS
9904}
9905
b49e97c9
TS
9906/* Set the sizes of the dynamic sections. */
9907
b34976b6 9908bfd_boolean
9719ad41
RS
9909_bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
9910 struct bfd_link_info *info)
b49e97c9
TS
9911{
9912 bfd *dynobj;
861fb55a 9913 asection *s, *sreldyn;
b34976b6 9914 bfd_boolean reltext;
0a44bf69 9915 struct mips_elf_link_hash_table *htab;
b49e97c9 9916
0a44bf69 9917 htab = mips_elf_hash_table (info);
4dfe6ac6 9918 BFD_ASSERT (htab != NULL);
b49e97c9
TS
9919 dynobj = elf_hash_table (info)->dynobj;
9920 BFD_ASSERT (dynobj != NULL);
9921
9922 if (elf_hash_table (info)->dynamic_sections_created)
9923 {
9924 /* Set the contents of the .interp section to the interpreter. */
9b8b325a 9925 if (bfd_link_executable (info) && !info->nointerp)
b49e97c9 9926 {
3d4d4302 9927 s = bfd_get_linker_section (dynobj, ".interp");
b49e97c9 9928 BFD_ASSERT (s != NULL);
eea6121a 9929 s->size
b49e97c9
TS
9930 = strlen (ELF_DYNAMIC_INTERPRETER (output_bfd)) + 1;
9931 s->contents
9932 = (bfd_byte *) ELF_DYNAMIC_INTERPRETER (output_bfd);
9933 }
861fb55a 9934
1bbce132 9935 /* Figure out the size of the PLT header if we know that we
07d6d2b8
AM
9936 are using it. For the sake of cache alignment always use
9937 a standard header whenever any standard entries are present
9938 even if microMIPS entries are present as well. This also
9939 lets the microMIPS header rely on the value of $v0 only set
9940 by microMIPS entries, for a small size reduction.
1bbce132 9941
07d6d2b8
AM
9942 Set symbol table entry values for symbols that use the
9943 address of their PLT entry now that we can calculate it.
1bbce132 9944
07d6d2b8
AM
9945 Also create the _PROCEDURE_LINKAGE_TABLE_ symbol if we
9946 haven't already in _bfd_elf_create_dynamic_sections. */
ce558b89 9947 if (htab->root.splt && htab->plt_mips_offset + htab->plt_comp_offset != 0)
861fb55a 9948 {
1bbce132
MR
9949 bfd_boolean micromips_p = (MICROMIPS_P (output_bfd)
9950 && !htab->plt_mips_offset);
9951 unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9952 bfd_vma isa_bit = micromips_p;
861fb55a 9953 struct elf_link_hash_entry *h;
1bbce132 9954 bfd_vma size;
861fb55a
DJ
9955
9956 BFD_ASSERT (htab->use_plts_and_copy_relocs);
ce558b89
AM
9957 BFD_ASSERT (htab->root.sgotplt->size == 0);
9958 BFD_ASSERT (htab->root.splt->size == 0);
1bbce132 9959
0e1862bb 9960 if (htab->is_vxworks && bfd_link_pic (info))
1bbce132
MR
9961 size = 4 * ARRAY_SIZE (mips_vxworks_shared_plt0_entry);
9962 else if (htab->is_vxworks)
9963 size = 4 * ARRAY_SIZE (mips_vxworks_exec_plt0_entry);
9964 else if (ABI_64_P (output_bfd))
9965 size = 4 * ARRAY_SIZE (mips_n64_exec_plt0_entry);
9966 else if (ABI_N32_P (output_bfd))
9967 size = 4 * ARRAY_SIZE (mips_n32_exec_plt0_entry);
9968 else if (!micromips_p)
9969 size = 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry);
833794fc
MR
9970 else if (htab->insn32)
9971 size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry);
1bbce132
MR
9972 else
9973 size = 2 * ARRAY_SIZE (micromips_o32_exec_plt0_entry);
861fb55a 9974
1bbce132
MR
9975 htab->plt_header_is_comp = micromips_p;
9976 htab->plt_header_size = size;
ce558b89
AM
9977 htab->root.splt->size = (size
9978 + htab->plt_mips_offset
9979 + htab->plt_comp_offset);
9980 htab->root.sgotplt->size = (htab->plt_got_index
9981 * MIPS_ELF_GOT_SIZE (dynobj));
1bbce132
MR
9982
9983 mips_elf_link_hash_traverse (htab, mips_elf_set_plt_sym_value, info);
9984
9985 if (htab->root.hplt == NULL)
9986 {
ce558b89 9987 h = _bfd_elf_define_linkage_sym (dynobj, info, htab->root.splt,
1bbce132
MR
9988 "_PROCEDURE_LINKAGE_TABLE_");
9989 htab->root.hplt = h;
9990 if (h == NULL)
9991 return FALSE;
9992 }
9993
9994 h = htab->root.hplt;
9995 h->root.u.def.value = isa_bit;
9996 h->other = other;
861fb55a
DJ
9997 h->type = STT_FUNC;
9998 }
9999 }
4e41d0d7 10000
9a59ad6b 10001 /* Allocate space for global sym dynamic relocs. */
2c3fc389 10002 elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
9a59ad6b 10003
33bb52fb
RS
10004 mips_elf_estimate_stub_size (output_bfd, info);
10005
10006 if (!mips_elf_lay_out_got (output_bfd, info))
10007 return FALSE;
10008
10009 mips_elf_lay_out_lazy_stubs (info);
10010
b49e97c9
TS
10011 /* The check_relocs and adjust_dynamic_symbol entry points have
10012 determined the sizes of the various dynamic sections. Allocate
10013 memory for them. */
b34976b6 10014 reltext = FALSE;
b49e97c9
TS
10015 for (s = dynobj->sections; s != NULL; s = s->next)
10016 {
10017 const char *name;
b49e97c9
TS
10018
10019 /* It's OK to base decisions on the section name, because none
10020 of the dynobj section names depend upon the input files. */
fd361982 10021 name = bfd_section_name (s);
b49e97c9
TS
10022
10023 if ((s->flags & SEC_LINKER_CREATED) == 0)
10024 continue;
10025
0112cd26 10026 if (CONST_STRNEQ (name, ".rel"))
b49e97c9 10027 {
c456f082 10028 if (s->size != 0)
b49e97c9
TS
10029 {
10030 const char *outname;
10031 asection *target;
10032
10033 /* If this relocation section applies to a read only
07d6d2b8
AM
10034 section, then we probably need a DT_TEXTREL entry.
10035 If the relocation section is .rel(a).dyn, we always
10036 assert a DT_TEXTREL entry rather than testing whether
10037 there exists a relocation to a read only section or
10038 not. */
fd361982 10039 outname = bfd_section_name (s->output_section);
b49e97c9
TS
10040 target = bfd_get_section_by_name (output_bfd, outname + 4);
10041 if ((target != NULL
10042 && (target->flags & SEC_READONLY) != 0
10043 && (target->flags & SEC_ALLOC) != 0)
0a44bf69 10044 || strcmp (outname, MIPS_ELF_REL_DYN_NAME (info)) == 0)
b34976b6 10045 reltext = TRUE;
b49e97c9
TS
10046
10047 /* We use the reloc_count field as a counter if we need
10048 to copy relocs into the output file. */
0a44bf69 10049 if (strcmp (name, MIPS_ELF_REL_DYN_NAME (info)) != 0)
b49e97c9 10050 s->reloc_count = 0;
f4416af6
AO
10051
10052 /* If combreloc is enabled, elf_link_sort_relocs() will
10053 sort relocations, but in a different way than we do,
10054 and before we're done creating relocations. Also, it
10055 will move them around between input sections'
10056 relocation's contents, so our sorting would be
10057 broken, so don't let it run. */
10058 info->combreloc = 0;
b49e97c9
TS
10059 }
10060 }
0e1862bb 10061 else if (bfd_link_executable (info)
b49e97c9 10062 && ! mips_elf_hash_table (info)->use_rld_obj_head
0112cd26 10063 && CONST_STRNEQ (name, ".rld_map"))
b49e97c9 10064 {
5108fc1b 10065 /* We add a room for __rld_map. It will be filled in by the
b49e97c9 10066 rtld to contain a pointer to the _r_debug structure. */
b4082c70 10067 s->size += MIPS_ELF_RLD_MAP_SIZE (output_bfd);
b49e97c9
TS
10068 }
10069 else if (SGI_COMPAT (output_bfd)
0112cd26 10070 && CONST_STRNEQ (name, ".compact_rel"))
eea6121a 10071 s->size += mips_elf_hash_table (info)->compact_rel_size;
ce558b89 10072 else if (s == htab->root.splt)
861fb55a
DJ
10073 {
10074 /* If the last PLT entry has a branch delay slot, allocate
6d30f5b2
NC
10075 room for an extra nop to fill the delay slot. This is
10076 for CPUs without load interlocking. */
10077 if (! LOAD_INTERLOCKS_P (output_bfd)
10078 && ! htab->is_vxworks && s->size > 0)
861fb55a
DJ
10079 s->size += 4;
10080 }
0112cd26 10081 else if (! CONST_STRNEQ (name, ".init")
ce558b89
AM
10082 && s != htab->root.sgot
10083 && s != htab->root.sgotplt
861fb55a 10084 && s != htab->sstubs
5474d94f
AM
10085 && s != htab->root.sdynbss
10086 && s != htab->root.sdynrelro)
b49e97c9
TS
10087 {
10088 /* It's not one of our sections, so don't allocate space. */
10089 continue;
10090 }
10091
c456f082 10092 if (s->size == 0)
b49e97c9 10093 {
8423293d 10094 s->flags |= SEC_EXCLUDE;
b49e97c9
TS
10095 continue;
10096 }
10097
c456f082
AM
10098 if ((s->flags & SEC_HAS_CONTENTS) == 0)
10099 continue;
10100
b49e97c9 10101 /* Allocate memory for the section contents. */
eea6121a 10102 s->contents = bfd_zalloc (dynobj, s->size);
c456f082 10103 if (s->contents == NULL)
b49e97c9
TS
10104 {
10105 bfd_set_error (bfd_error_no_memory);
b34976b6 10106 return FALSE;
b49e97c9
TS
10107 }
10108 }
10109
10110 if (elf_hash_table (info)->dynamic_sections_created)
10111 {
10112 /* Add some entries to the .dynamic section. We fill in the
10113 values later, in _bfd_mips_elf_finish_dynamic_sections, but we
10114 must add the entries now so that we get the correct size for
5750dcec 10115 the .dynamic section. */
af5978fb
RS
10116
10117 /* SGI object has the equivalence of DT_DEBUG in the
5750dcec 10118 DT_MIPS_RLD_MAP entry. This must come first because glibc
6e6be592
MR
10119 only fills in DT_MIPS_RLD_MAP (not DT_DEBUG) and some tools
10120 may only look at the first one they see. */
0e1862bb 10121 if (!bfd_link_pic (info)
af5978fb
RS
10122 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP, 0))
10123 return FALSE;
b49e97c9 10124
0e1862bb 10125 if (bfd_link_executable (info)
a5499fa4
MF
10126 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP_REL, 0))
10127 return FALSE;
10128
5750dcec
DJ
10129 /* The DT_DEBUG entry may be filled in by the dynamic linker and
10130 used by the debugger. */
0e1862bb 10131 if (bfd_link_executable (info)
5750dcec
DJ
10132 && !SGI_COMPAT (output_bfd)
10133 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_DEBUG, 0))
10134 return FALSE;
10135
0a44bf69 10136 if (reltext && (SGI_COMPAT (output_bfd) || htab->is_vxworks))
b49e97c9
TS
10137 info->flags |= DF_TEXTREL;
10138
10139 if ((info->flags & DF_TEXTREL) != 0)
10140 {
10141 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_TEXTREL, 0))
b34976b6 10142 return FALSE;
943284cc
DJ
10143
10144 /* Clear the DF_TEXTREL flag. It will be set again if we
10145 write out an actual text relocation; we may not, because
10146 at this point we do not know whether e.g. any .eh_frame
10147 absolute relocations have been converted to PC-relative. */
10148 info->flags &= ~DF_TEXTREL;
b49e97c9
TS
10149 }
10150
10151 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTGOT, 0))
b34976b6 10152 return FALSE;
b49e97c9 10153
861fb55a 10154 sreldyn = mips_elf_rel_dyn_section (info, FALSE);
0a44bf69 10155 if (htab->is_vxworks)
b49e97c9 10156 {
0a44bf69
RS
10157 /* VxWorks uses .rela.dyn instead of .rel.dyn. It does not
10158 use any of the DT_MIPS_* tags. */
861fb55a 10159 if (sreldyn && sreldyn->size > 0)
0a44bf69
RS
10160 {
10161 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELA, 0))
10162 return FALSE;
b49e97c9 10163
0a44bf69
RS
10164 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELASZ, 0))
10165 return FALSE;
b49e97c9 10166
0a44bf69
RS
10167 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELAENT, 0))
10168 return FALSE;
10169 }
b49e97c9 10170 }
0a44bf69
RS
10171 else
10172 {
db841b6f
MR
10173 if (sreldyn && sreldyn->size > 0
10174 && !bfd_is_abs_section (sreldyn->output_section))
0a44bf69
RS
10175 {
10176 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_REL, 0))
10177 return FALSE;
b49e97c9 10178
0a44bf69
RS
10179 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELSZ, 0))
10180 return FALSE;
b49e97c9 10181
0a44bf69
RS
10182 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELENT, 0))
10183 return FALSE;
10184 }
b49e97c9 10185
0a44bf69
RS
10186 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_VERSION, 0))
10187 return FALSE;
b49e97c9 10188
0a44bf69
RS
10189 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_FLAGS, 0))
10190 return FALSE;
b49e97c9 10191
0a44bf69
RS
10192 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_BASE_ADDRESS, 0))
10193 return FALSE;
b49e97c9 10194
0a44bf69
RS
10195 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_LOCAL_GOTNO, 0))
10196 return FALSE;
b49e97c9 10197
0a44bf69
RS
10198 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_SYMTABNO, 0))
10199 return FALSE;
b49e97c9 10200
0a44bf69
RS
10201 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_UNREFEXTNO, 0))
10202 return FALSE;
b49e97c9 10203
0a44bf69
RS
10204 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_GOTSYM, 0))
10205 return FALSE;
10206
f16a9783
MS
10207 if (info->emit_gnu_hash
10208 && ! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_XHASH, 0))
10209 return FALSE;
10210
0a44bf69
RS
10211 if (IRIX_COMPAT (dynobj) == ict_irix5
10212 && ! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_HIPAGENO, 0))
10213 return FALSE;
10214
10215 if (IRIX_COMPAT (dynobj) == ict_irix6
10216 && (bfd_get_section_by_name
af0edeb8 10217 (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (dynobj)))
0a44bf69
RS
10218 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_OPTIONS, 0))
10219 return FALSE;
10220 }
ce558b89 10221 if (htab->root.splt->size > 0)
861fb55a
DJ
10222 {
10223 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTREL, 0))
10224 return FALSE;
10225
10226 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_JMPREL, 0))
10227 return FALSE;
10228
10229 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTRELSZ, 0))
10230 return FALSE;
10231
10232 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_PLTGOT, 0))
10233 return FALSE;
10234 }
7a2b07ff
NS
10235 if (htab->is_vxworks
10236 && !elf_vxworks_add_dynamic_entries (output_bfd, info))
10237 return FALSE;
b49e97c9
TS
10238 }
10239
b34976b6 10240 return TRUE;
b49e97c9
TS
10241}
10242\f
81d43bff
RS
10243/* REL is a relocation in INPUT_BFD that is being copied to OUTPUT_BFD.
10244 Adjust its R_ADDEND field so that it is correct for the output file.
10245 LOCAL_SYMS and LOCAL_SECTIONS are arrays of INPUT_BFD's local symbols
10246 and sections respectively; both use symbol indexes. */
10247
10248static void
10249mips_elf_adjust_addend (bfd *output_bfd, struct bfd_link_info *info,
10250 bfd *input_bfd, Elf_Internal_Sym *local_syms,
10251 asection **local_sections, Elf_Internal_Rela *rel)
10252{
10253 unsigned int r_type, r_symndx;
10254 Elf_Internal_Sym *sym;
10255 asection *sec;
10256
020d7251 10257 if (mips_elf_local_relocation_p (input_bfd, rel, local_sections))
81d43bff
RS
10258 {
10259 r_type = ELF_R_TYPE (output_bfd, rel->r_info);
df58fc94 10260 if (gprel16_reloc_p (r_type)
81d43bff 10261 || r_type == R_MIPS_GPREL32
df58fc94 10262 || literal_reloc_p (r_type))
81d43bff
RS
10263 {
10264 rel->r_addend += _bfd_get_gp_value (input_bfd);
10265 rel->r_addend -= _bfd_get_gp_value (output_bfd);
10266 }
10267
10268 r_symndx = ELF_R_SYM (output_bfd, rel->r_info);
10269 sym = local_syms + r_symndx;
10270
10271 /* Adjust REL's addend to account for section merging. */
0e1862bb 10272 if (!bfd_link_relocatable (info))
81d43bff
RS
10273 {
10274 sec = local_sections[r_symndx];
10275 _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
10276 }
10277
10278 /* This would normally be done by the rela_normal code in elflink.c. */
10279 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
10280 rel->r_addend += local_sections[r_symndx]->output_offset;
10281 }
10282}
10283
545fd46b
MR
10284/* Handle relocations against symbols from removed linkonce sections,
10285 or sections discarded by a linker script. We use this wrapper around
10286 RELOC_AGAINST_DISCARDED_SECTION to handle triplets of compound relocs
10287 on 64-bit ELF targets. In this case for any relocation handled, which
10288 always be the first in a triplet, the remaining two have to be processed
10289 together with the first, even if they are R_MIPS_NONE. It is the symbol
10290 index referred by the first reloc that applies to all the three and the
10291 remaining two never refer to an object symbol. And it is the final
10292 relocation (the last non-null one) that determines the output field of
10293 the whole relocation so retrieve the corresponding howto structure for
10294 the relocatable field to be cleared by RELOC_AGAINST_DISCARDED_SECTION.
10295
10296 Note that RELOC_AGAINST_DISCARDED_SECTION is a macro that uses "continue"
10297 and therefore requires to be pasted in a loop. It also defines a block
10298 and does not protect any of its arguments, hence the extra brackets. */
10299
10300static void
10301mips_reloc_against_discarded_section (bfd *output_bfd,
10302 struct bfd_link_info *info,
10303 bfd *input_bfd, asection *input_section,
10304 Elf_Internal_Rela **rel,
10305 const Elf_Internal_Rela **relend,
10306 bfd_boolean rel_reloc,
10307 reloc_howto_type *howto,
10308 bfd_byte *contents)
10309{
10310 const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
10311 int count = bed->s->int_rels_per_ext_rel;
10312 unsigned int r_type;
10313 int i;
10314
10315 for (i = count - 1; i > 0; i--)
10316 {
10317 r_type = ELF_R_TYPE (output_bfd, (*rel)[i].r_info);
10318 if (r_type != R_MIPS_NONE)
10319 {
10320 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type, !rel_reloc);
10321 break;
10322 }
10323 }
10324 do
10325 {
10326 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
10327 (*rel), count, (*relend),
10328 howto, i, contents);
10329 }
10330 while (0);
10331}
10332
b49e97c9
TS
10333/* Relocate a MIPS ELF section. */
10334
b34976b6 10335bfd_boolean
9719ad41
RS
10336_bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
10337 bfd *input_bfd, asection *input_section,
10338 bfd_byte *contents, Elf_Internal_Rela *relocs,
10339 Elf_Internal_Sym *local_syms,
10340 asection **local_sections)
b49e97c9
TS
10341{
10342 Elf_Internal_Rela *rel;
10343 const Elf_Internal_Rela *relend;
10344 bfd_vma addend = 0;
b34976b6 10345 bfd_boolean use_saved_addend_p = FALSE;
b49e97c9 10346
056bafd4 10347 relend = relocs + input_section->reloc_count;
b49e97c9
TS
10348 for (rel = relocs; rel < relend; ++rel)
10349 {
10350 const char *name;
c9adbffe 10351 bfd_vma value = 0;
b49e97c9 10352 reloc_howto_type *howto;
ad3d9127 10353 bfd_boolean cross_mode_jump_p = FALSE;
b34976b6 10354 /* TRUE if the relocation is a RELA relocation, rather than a
07d6d2b8 10355 REL relocation. */
b34976b6 10356 bfd_boolean rela_relocation_p = TRUE;
b49e97c9 10357 unsigned int r_type = ELF_R_TYPE (output_bfd, rel->r_info);
9719ad41 10358 const char *msg;
ab96bf03
AM
10359 unsigned long r_symndx;
10360 asection *sec;
749b8d9d
L
10361 Elf_Internal_Shdr *symtab_hdr;
10362 struct elf_link_hash_entry *h;
d4730f92 10363 bfd_boolean rel_reloc;
b49e97c9 10364
d4730f92
BS
10365 rel_reloc = (NEWABI_P (input_bfd)
10366 && mips_elf_rel_relocation_p (input_bfd, input_section,
10367 relocs, rel));
b49e97c9 10368 /* Find the relocation howto for this relocation. */
d4730f92 10369 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type, !rel_reloc);
ab96bf03
AM
10370
10371 r_symndx = ELF_R_SYM (input_bfd, rel->r_info);
749b8d9d 10372 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
020d7251 10373 if (mips_elf_local_relocation_p (input_bfd, rel, local_sections))
749b8d9d
L
10374 {
10375 sec = local_sections[r_symndx];
10376 h = NULL;
10377 }
ab96bf03
AM
10378 else
10379 {
ab96bf03 10380 unsigned long extsymoff;
ab96bf03 10381
ab96bf03
AM
10382 extsymoff = 0;
10383 if (!elf_bad_symtab (input_bfd))
10384 extsymoff = symtab_hdr->sh_info;
10385 h = elf_sym_hashes (input_bfd) [r_symndx - extsymoff];
10386 while (h->root.type == bfd_link_hash_indirect
10387 || h->root.type == bfd_link_hash_warning)
10388 h = (struct elf_link_hash_entry *) h->root.u.i.link;
10389
10390 sec = NULL;
10391 if (h->root.type == bfd_link_hash_defined
10392 || h->root.type == bfd_link_hash_defweak)
10393 sec = h->root.u.def.section;
10394 }
10395
dbaa2011 10396 if (sec != NULL && discarded_section (sec))
545fd46b
MR
10397 {
10398 mips_reloc_against_discarded_section (output_bfd, info, input_bfd,
10399 input_section, &rel, &relend,
10400 rel_reloc, howto, contents);
10401 continue;
10402 }
ab96bf03 10403
4a14403c 10404 if (r_type == R_MIPS_64 && ! NEWABI_P (input_bfd))
b49e97c9
TS
10405 {
10406 /* Some 32-bit code uses R_MIPS_64. In particular, people use
10407 64-bit code, but make sure all their addresses are in the
10408 lowermost or uppermost 32-bit section of the 64-bit address
10409 space. Thus, when they use an R_MIPS_64 they mean what is
10410 usually meant by R_MIPS_32, with the exception that the
10411 stored value is sign-extended to 64 bits. */
b34976b6 10412 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, R_MIPS_32, FALSE);
b49e97c9
TS
10413
10414 /* On big-endian systems, we need to lie about the position
10415 of the reloc. */
10416 if (bfd_big_endian (input_bfd))
10417 rel->r_offset += 4;
10418 }
b49e97c9
TS
10419
10420 if (!use_saved_addend_p)
10421 {
b49e97c9
TS
10422 /* If these relocations were originally of the REL variety,
10423 we must pull the addend out of the field that will be
10424 relocated. Otherwise, we simply use the contents of the
c224138d
RS
10425 RELA relocation. */
10426 if (mips_elf_rel_relocation_p (input_bfd, input_section,
10427 relocs, rel))
b49e97c9 10428 {
b34976b6 10429 rela_relocation_p = FALSE;
c224138d
RS
10430 addend = mips_elf_read_rel_addend (input_bfd, rel,
10431 howto, contents);
738e5348
RS
10432 if (hi16_reloc_p (r_type)
10433 || (got16_reloc_p (r_type)
b49e97c9 10434 && mips_elf_local_relocation_p (input_bfd, rel,
020d7251 10435 local_sections)))
b49e97c9 10436 {
c224138d
RS
10437 if (!mips_elf_add_lo16_rel_addend (input_bfd, rel, relend,
10438 contents, &addend))
749b8d9d 10439 {
749b8d9d
L
10440 if (h)
10441 name = h->root.root.string;
10442 else
10443 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
10444 local_syms + r_symndx,
10445 sec);
4eca0228 10446 _bfd_error_handler
695344c0 10447 /* xgettext:c-format */
2c1c9679 10448 (_("%pB: can't find matching LO16 reloc against `%s'"
2dcf00ce 10449 " for %s at %#" PRIx64 " in section `%pA'"),
c08bb8dd 10450 input_bfd, name,
2dcf00ce 10451 howto->name, (uint64_t) rel->r_offset, input_section);
749b8d9d 10452 }
b49e97c9 10453 }
30ac9238
RS
10454 else
10455 addend <<= howto->rightshift;
b49e97c9
TS
10456 }
10457 else
10458 addend = rel->r_addend;
81d43bff
RS
10459 mips_elf_adjust_addend (output_bfd, info, input_bfd,
10460 local_syms, local_sections, rel);
b49e97c9
TS
10461 }
10462
0e1862bb 10463 if (bfd_link_relocatable (info))
b49e97c9 10464 {
4a14403c 10465 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd)
b49e97c9
TS
10466 && bfd_big_endian (input_bfd))
10467 rel->r_offset -= 4;
10468
81d43bff 10469 if (!rela_relocation_p && rel->r_addend)
5a659663 10470 {
81d43bff 10471 addend += rel->r_addend;
738e5348 10472 if (hi16_reloc_p (r_type) || got16_reloc_p (r_type))
5a659663
TS
10473 addend = mips_elf_high (addend);
10474 else if (r_type == R_MIPS_HIGHER)
10475 addend = mips_elf_higher (addend);
10476 else if (r_type == R_MIPS_HIGHEST)
10477 addend = mips_elf_highest (addend);
30ac9238
RS
10478 else
10479 addend >>= howto->rightshift;
b49e97c9 10480
30ac9238
RS
10481 /* We use the source mask, rather than the destination
10482 mask because the place to which we are writing will be
10483 source of the addend in the final link. */
b49e97c9
TS
10484 addend &= howto->src_mask;
10485
5a659663 10486 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
b49e97c9
TS
10487 /* See the comment above about using R_MIPS_64 in the 32-bit
10488 ABI. Here, we need to update the addend. It would be
10489 possible to get away with just using the R_MIPS_32 reloc
10490 but for endianness. */
10491 {
10492 bfd_vma sign_bits;
10493 bfd_vma low_bits;
10494 bfd_vma high_bits;
10495
10496 if (addend & ((bfd_vma) 1 << 31))
10497#ifdef BFD64
10498 sign_bits = ((bfd_vma) 1 << 32) - 1;
10499#else
10500 sign_bits = -1;
10501#endif
10502 else
10503 sign_bits = 0;
10504
10505 /* If we don't know that we have a 64-bit type,
10506 do two separate stores. */
10507 if (bfd_big_endian (input_bfd))
10508 {
10509 /* Store the sign-bits (which are most significant)
10510 first. */
10511 low_bits = sign_bits;
10512 high_bits = addend;
10513 }
10514 else
10515 {
10516 low_bits = addend;
10517 high_bits = sign_bits;
10518 }
10519 bfd_put_32 (input_bfd, low_bits,
10520 contents + rel->r_offset);
10521 bfd_put_32 (input_bfd, high_bits,
10522 contents + rel->r_offset + 4);
10523 continue;
10524 }
10525
10526 if (! mips_elf_perform_relocation (info, howto, rel, addend,
10527 input_bfd, input_section,
b34976b6
AM
10528 contents, FALSE))
10529 return FALSE;
b49e97c9
TS
10530 }
10531
10532 /* Go on to the next relocation. */
10533 continue;
10534 }
10535
10536 /* In the N32 and 64-bit ABIs there may be multiple consecutive
10537 relocations for the same offset. In that case we are
10538 supposed to treat the output of each relocation as the addend
10539 for the next. */
10540 if (rel + 1 < relend
10541 && rel->r_offset == rel[1].r_offset
10542 && ELF_R_TYPE (input_bfd, rel[1].r_info) != R_MIPS_NONE)
b34976b6 10543 use_saved_addend_p = TRUE;
b49e97c9 10544 else
b34976b6 10545 use_saved_addend_p = FALSE;
b49e97c9
TS
10546
10547 /* Figure out what value we are supposed to relocate. */
10548 switch (mips_elf_calculate_relocation (output_bfd, input_bfd,
47275900
MR
10549 input_section, contents,
10550 info, rel, addend, howto,
10551 local_syms, local_sections,
10552 &value, &name, &cross_mode_jump_p,
bce03d3d 10553 use_saved_addend_p))
b49e97c9
TS
10554 {
10555 case bfd_reloc_continue:
10556 /* There's nothing to do. */
10557 continue;
10558
10559 case bfd_reloc_undefined:
10560 /* mips_elf_calculate_relocation already called the
10561 undefined_symbol callback. There's no real point in
10562 trying to perform the relocation at this point, so we
10563 just skip ahead to the next relocation. */
10564 continue;
10565
10566 case bfd_reloc_notsupported:
10567 msg = _("internal error: unsupported relocation error");
10568 info->callbacks->warning
10569 (info, msg, name, input_bfd, input_section, rel->r_offset);
b34976b6 10570 return FALSE;
b49e97c9
TS
10571
10572 case bfd_reloc_overflow:
10573 if (use_saved_addend_p)
10574 /* Ignore overflow until we reach the last relocation for
10575 a given location. */
10576 ;
10577 else
10578 {
0e53d9da
AN
10579 struct mips_elf_link_hash_table *htab;
10580
10581 htab = mips_elf_hash_table (info);
4dfe6ac6 10582 BFD_ASSERT (htab != NULL);
b49e97c9 10583 BFD_ASSERT (name != NULL);
0e53d9da 10584 if (!htab->small_data_overflow_reported
9684f078 10585 && (gprel16_reloc_p (howto->type)
df58fc94 10586 || literal_reloc_p (howto->type)))
0e53d9da 10587 {
91d6fa6a
NC
10588 msg = _("small-data section exceeds 64KB;"
10589 " lower small-data size limit (see option -G)");
0e53d9da
AN
10590
10591 htab->small_data_overflow_reported = TRUE;
10592 (*info->callbacks->einfo) ("%P: %s\n", msg);
10593 }
1a72702b
AM
10594 (*info->callbacks->reloc_overflow)
10595 (info, NULL, name, howto->name, (bfd_vma) 0,
10596 input_bfd, input_section, rel->r_offset);
b49e97c9
TS
10597 }
10598 break;
10599
10600 case bfd_reloc_ok:
10601 break;
10602
df58fc94 10603 case bfd_reloc_outofrange:
7db9a74e 10604 msg = NULL;
df58fc94 10605 if (jal_reloc_p (howto->type))
9d862524 10606 msg = (cross_mode_jump_p
2c1c9679 10607 ? _("cannot convert a jump to JALX "
9d862524
MR
10608 "for a non-word-aligned address")
10609 : (howto->type == R_MIPS16_26
2c1c9679
AM
10610 ? _("jump to a non-word-aligned address")
10611 : _("jump to a non-instruction-aligned address")));
99aefae6 10612 else if (b_reloc_p (howto->type))
a6ebf616 10613 msg = (cross_mode_jump_p
2c1c9679 10614 ? _("cannot convert a branch to JALX "
a6ebf616 10615 "for a non-word-aligned address")
2c1c9679 10616 : _("branch to a non-instruction-aligned address"));
7db9a74e
MR
10617 else if (aligned_pcrel_reloc_p (howto->type))
10618 msg = _("PC-relative load from unaligned address");
10619 if (msg)
df58fc94 10620 {
de341542 10621 info->callbacks->einfo
ed53407e
MR
10622 ("%X%H: %s\n", input_bfd, input_section, rel->r_offset, msg);
10623 break;
7361da2c 10624 }
df58fc94
RS
10625 /* Fall through. */
10626
b49e97c9
TS
10627 default:
10628 abort ();
10629 break;
10630 }
10631
10632 /* If we've got another relocation for the address, keep going
10633 until we reach the last one. */
10634 if (use_saved_addend_p)
10635 {
10636 addend = value;
10637 continue;
10638 }
10639
4a14403c 10640 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
b49e97c9
TS
10641 /* See the comment above about using R_MIPS_64 in the 32-bit
10642 ABI. Until now, we've been using the HOWTO for R_MIPS_32;
10643 that calculated the right value. Now, however, we
10644 sign-extend the 32-bit result to 64-bits, and store it as a
10645 64-bit value. We are especially generous here in that we
10646 go to extreme lengths to support this usage on systems with
10647 only a 32-bit VMA. */
10648 {
10649 bfd_vma sign_bits;
10650 bfd_vma low_bits;
10651 bfd_vma high_bits;
10652
10653 if (value & ((bfd_vma) 1 << 31))
10654#ifdef BFD64
10655 sign_bits = ((bfd_vma) 1 << 32) - 1;
10656#else
10657 sign_bits = -1;
10658#endif
10659 else
10660 sign_bits = 0;
10661
10662 /* If we don't know that we have a 64-bit type,
10663 do two separate stores. */
10664 if (bfd_big_endian (input_bfd))
10665 {
10666 /* Undo what we did above. */
10667 rel->r_offset -= 4;
10668 /* Store the sign-bits (which are most significant)
10669 first. */
10670 low_bits = sign_bits;
10671 high_bits = value;
10672 }
10673 else
10674 {
10675 low_bits = value;
10676 high_bits = sign_bits;
10677 }
10678 bfd_put_32 (input_bfd, low_bits,
10679 contents + rel->r_offset);
10680 bfd_put_32 (input_bfd, high_bits,
10681 contents + rel->r_offset + 4);
10682 continue;
10683 }
10684
10685 /* Actually perform the relocation. */
10686 if (! mips_elf_perform_relocation (info, howto, rel, value,
10687 input_bfd, input_section,
38a7df63 10688 contents, cross_mode_jump_p))
b34976b6 10689 return FALSE;
b49e97c9
TS
10690 }
10691
b34976b6 10692 return TRUE;
b49e97c9
TS
10693}
10694\f
861fb55a
DJ
10695/* A function that iterates over each entry in la25_stubs and fills
10696 in the code for each one. DATA points to a mips_htab_traverse_info. */
10697
10698static int
10699mips_elf_create_la25_stub (void **slot, void *data)
10700{
10701 struct mips_htab_traverse_info *hti;
10702 struct mips_elf_link_hash_table *htab;
10703 struct mips_elf_la25_stub *stub;
10704 asection *s;
10705 bfd_byte *loc;
10706 bfd_vma offset, target, target_high, target_low;
3734320d
MF
10707 bfd_vma branch_pc;
10708 bfd_signed_vma pcrel_offset = 0;
861fb55a
DJ
10709
10710 stub = (struct mips_elf_la25_stub *) *slot;
10711 hti = (struct mips_htab_traverse_info *) data;
10712 htab = mips_elf_hash_table (hti->info);
4dfe6ac6 10713 BFD_ASSERT (htab != NULL);
861fb55a
DJ
10714
10715 /* Create the section contents, if we haven't already. */
10716 s = stub->stub_section;
10717 loc = s->contents;
10718 if (loc == NULL)
10719 {
10720 loc = bfd_malloc (s->size);
10721 if (loc == NULL)
10722 {
10723 hti->error = TRUE;
10724 return FALSE;
10725 }
10726 s->contents = loc;
10727 }
10728
10729 /* Work out where in the section this stub should go. */
10730 offset = stub->offset;
10731
3734320d
MF
10732 /* We add 8 here to account for the LUI/ADDIU instructions
10733 before the branch instruction. This cannot be moved down to
10734 where pcrel_offset is calculated as 's' is updated in
10735 mips_elf_get_la25_target. */
10736 branch_pc = s->output_section->vma + s->output_offset + offset + 8;
10737
861fb55a 10738 /* Work out the target address. */
8f0c309a
CLT
10739 target = mips_elf_get_la25_target (stub, &s);
10740 target += s->output_section->vma + s->output_offset;
10741
861fb55a
DJ
10742 target_high = ((target + 0x8000) >> 16) & 0xffff;
10743 target_low = (target & 0xffff);
10744
3734320d
MF
10745 /* Calculate the PC of the compact branch instruction (for the case where
10746 compact branches are used for either microMIPSR6 or MIPSR6 with
10747 compact branches. Add 4-bytes to account for BC using the PC of the
10748 next instruction as the base. */
10749 pcrel_offset = target - (branch_pc + 4);
10750
861fb55a
DJ
10751 if (stub->stub_section != htab->strampoline)
10752 {
df58fc94 10753 /* This is a simple LUI/ADDIU stub. Zero out the beginning
861fb55a
DJ
10754 of the section and write the two instructions at the end. */
10755 memset (loc, 0, offset);
10756 loc += offset;
df58fc94
RS
10757 if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
10758 {
d21911ea
MR
10759 bfd_put_micromips_32 (hti->output_bfd,
10760 LA25_LUI_MICROMIPS (target_high),
10761 loc);
10762 bfd_put_micromips_32 (hti->output_bfd,
10763 LA25_ADDIU_MICROMIPS (target_low),
10764 loc + 4);
df58fc94
RS
10765 }
10766 else
10767 {
10768 bfd_put_32 (hti->output_bfd, LA25_LUI (target_high), loc);
10769 bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 4);
10770 }
861fb55a
DJ
10771 }
10772 else
10773 {
10774 /* This is trampoline. */
10775 loc += offset;
df58fc94
RS
10776 if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
10777 {
d21911ea
MR
10778 bfd_put_micromips_32 (hti->output_bfd,
10779 LA25_LUI_MICROMIPS (target_high), loc);
10780 bfd_put_micromips_32 (hti->output_bfd,
10781 LA25_J_MICROMIPS (target), loc + 4);
10782 bfd_put_micromips_32 (hti->output_bfd,
10783 LA25_ADDIU_MICROMIPS (target_low), loc + 8);
df58fc94
RS
10784 bfd_put_32 (hti->output_bfd, 0, loc + 12);
10785 }
10786 else
10787 {
10788 bfd_put_32 (hti->output_bfd, LA25_LUI (target_high), loc);
3734320d
MF
10789 if (MIPSR6_P (hti->output_bfd) && htab->compact_branches)
10790 {
10791 bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 4);
10792 bfd_put_32 (hti->output_bfd, LA25_BC (pcrel_offset), loc + 8);
10793 }
10794 else
10795 {
10796 bfd_put_32 (hti->output_bfd, LA25_J (target), loc + 4);
10797 bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 8);
10798 }
df58fc94
RS
10799 bfd_put_32 (hti->output_bfd, 0, loc + 12);
10800 }
861fb55a
DJ
10801 }
10802 return TRUE;
10803}
10804
b49e97c9
TS
10805/* If NAME is one of the special IRIX6 symbols defined by the linker,
10806 adjust it appropriately now. */
10807
10808static void
9719ad41
RS
10809mips_elf_irix6_finish_dynamic_symbol (bfd *abfd ATTRIBUTE_UNUSED,
10810 const char *name, Elf_Internal_Sym *sym)
b49e97c9
TS
10811{
10812 /* The linker script takes care of providing names and values for
10813 these, but we must place them into the right sections. */
10814 static const char* const text_section_symbols[] = {
10815 "_ftext",
10816 "_etext",
10817 "__dso_displacement",
10818 "__elf_header",
10819 "__program_header_table",
10820 NULL
10821 };
10822
10823 static const char* const data_section_symbols[] = {
10824 "_fdata",
10825 "_edata",
10826 "_end",
10827 "_fbss",
10828 NULL
10829 };
10830
10831 const char* const *p;
10832 int i;
10833
10834 for (i = 0; i < 2; ++i)
10835 for (p = (i == 0) ? text_section_symbols : data_section_symbols;
10836 *p;
10837 ++p)
10838 if (strcmp (*p, name) == 0)
10839 {
10840 /* All of these symbols are given type STT_SECTION by the
10841 IRIX6 linker. */
10842 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
e10609d3 10843 sym->st_other = STO_PROTECTED;
b49e97c9
TS
10844
10845 /* The IRIX linker puts these symbols in special sections. */
10846 if (i == 0)
10847 sym->st_shndx = SHN_MIPS_TEXT;
10848 else
10849 sym->st_shndx = SHN_MIPS_DATA;
10850
10851 break;
10852 }
10853}
10854
10855/* Finish up dynamic symbol handling. We set the contents of various
10856 dynamic sections here. */
10857
b34976b6 10858bfd_boolean
9719ad41
RS
10859_bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
10860 struct bfd_link_info *info,
10861 struct elf_link_hash_entry *h,
10862 Elf_Internal_Sym *sym)
b49e97c9
TS
10863{
10864 bfd *dynobj;
b49e97c9 10865 asection *sgot;
f4416af6 10866 struct mips_got_info *g, *gg;
b49e97c9 10867 const char *name;
3d6746ca 10868 int idx;
5108fc1b 10869 struct mips_elf_link_hash_table *htab;
738e5348 10870 struct mips_elf_link_hash_entry *hmips;
b49e97c9 10871
5108fc1b 10872 htab = mips_elf_hash_table (info);
4dfe6ac6 10873 BFD_ASSERT (htab != NULL);
b49e97c9 10874 dynobj = elf_hash_table (info)->dynobj;
738e5348 10875 hmips = (struct mips_elf_link_hash_entry *) h;
b49e97c9 10876
861fb55a
DJ
10877 BFD_ASSERT (!htab->is_vxworks);
10878
1bbce132
MR
10879 if (h->plt.plist != NULL
10880 && (h->plt.plist->mips_offset != MINUS_ONE
10881 || h->plt.plist->comp_offset != MINUS_ONE))
861fb55a
DJ
10882 {
10883 /* We've decided to create a PLT entry for this symbol. */
10884 bfd_byte *loc;
1bbce132 10885 bfd_vma header_address, got_address;
861fb55a 10886 bfd_vma got_address_high, got_address_low, load;
1bbce132
MR
10887 bfd_vma got_index;
10888 bfd_vma isa_bit;
10889
10890 got_index = h->plt.plist->gotplt_index;
861fb55a
DJ
10891
10892 BFD_ASSERT (htab->use_plts_and_copy_relocs);
10893 BFD_ASSERT (h->dynindx != -1);
ce558b89 10894 BFD_ASSERT (htab->root.splt != NULL);
1bbce132 10895 BFD_ASSERT (got_index != MINUS_ONE);
861fb55a
DJ
10896 BFD_ASSERT (!h->def_regular);
10897
10898 /* Calculate the address of the PLT header. */
1bbce132 10899 isa_bit = htab->plt_header_is_comp;
ce558b89
AM
10900 header_address = (htab->root.splt->output_section->vma
10901 + htab->root.splt->output_offset + isa_bit);
861fb55a
DJ
10902
10903 /* Calculate the address of the .got.plt entry. */
ce558b89
AM
10904 got_address = (htab->root.sgotplt->output_section->vma
10905 + htab->root.sgotplt->output_offset
1bbce132
MR
10906 + got_index * MIPS_ELF_GOT_SIZE (dynobj));
10907
861fb55a
DJ
10908 got_address_high = ((got_address + 0x8000) >> 16) & 0xffff;
10909 got_address_low = got_address & 0xffff;
10910
789ff5b6
MR
10911 /* The PLT sequence is not safe for N64 if .got.plt entry's address
10912 cannot be loaded in two instructions. */
10913 if (ABI_64_P (output_bfd)
10914 && ((got_address + 0x80008000) & ~(bfd_vma) 0xffffffff) != 0)
10915 {
10916 _bfd_error_handler
10917 /* xgettext:c-format */
10918 (_("%pB: `%pA' entry VMA of %#" PRIx64 " outside the 32-bit range "
10919 "supported; consider using `-Ttext-segment=...'"),
10920 output_bfd,
10921 htab->root.sgotplt->output_section,
10922 (int64_t) got_address);
10923 bfd_set_error (bfd_error_no_error);
10924 return FALSE;
10925 }
10926
861fb55a 10927 /* Initially point the .got.plt entry at the PLT header. */
6a382bce
MR
10928 loc = (htab->root.sgotplt->contents
10929 + got_index * MIPS_ELF_GOT_SIZE (dynobj));
861fb55a
DJ
10930 if (ABI_64_P (output_bfd))
10931 bfd_put_64 (output_bfd, header_address, loc);
10932 else
10933 bfd_put_32 (output_bfd, header_address, loc);
10934
1bbce132 10935 /* Now handle the PLT itself. First the standard entry (the order
07d6d2b8 10936 does not matter, we just have to pick one). */
1bbce132
MR
10937 if (h->plt.plist->mips_offset != MINUS_ONE)
10938 {
10939 const bfd_vma *plt_entry;
10940 bfd_vma plt_offset;
861fb55a 10941
1bbce132 10942 plt_offset = htab->plt_header_size + h->plt.plist->mips_offset;
861fb55a 10943
ce558b89 10944 BFD_ASSERT (plt_offset <= htab->root.splt->size);
6d30f5b2 10945
1bbce132 10946 /* Find out where the .plt entry should go. */
ce558b89 10947 loc = htab->root.splt->contents + plt_offset;
1bbce132
MR
10948
10949 /* Pick the load opcode. */
10950 load = MIPS_ELF_LOAD_WORD (output_bfd);
10951
10952 /* Fill in the PLT entry itself. */
7361da2c
AB
10953
10954 if (MIPSR6_P (output_bfd))
3734320d
MF
10955 plt_entry = htab->compact_branches ? mipsr6_exec_plt_entry_compact
10956 : mipsr6_exec_plt_entry;
7361da2c
AB
10957 else
10958 plt_entry = mips_exec_plt_entry;
1bbce132
MR
10959 bfd_put_32 (output_bfd, plt_entry[0] | got_address_high, loc);
10960 bfd_put_32 (output_bfd, plt_entry[1] | got_address_low | load,
10961 loc + 4);
10962
3734320d
MF
10963 if (! LOAD_INTERLOCKS_P (output_bfd)
10964 || (MIPSR6_P (output_bfd) && htab->compact_branches))
1bbce132
MR
10965 {
10966 bfd_put_32 (output_bfd, plt_entry[2] | got_address_low, loc + 8);
10967 bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
10968 }
10969 else
10970 {
10971 bfd_put_32 (output_bfd, plt_entry[3], loc + 8);
10972 bfd_put_32 (output_bfd, plt_entry[2] | got_address_low,
10973 loc + 12);
10974 }
6d30f5b2 10975 }
1bbce132
MR
10976
10977 /* Now the compressed entry. They come after any standard ones. */
10978 if (h->plt.plist->comp_offset != MINUS_ONE)
6d30f5b2 10979 {
1bbce132
MR
10980 bfd_vma plt_offset;
10981
10982 plt_offset = (htab->plt_header_size + htab->plt_mips_offset
10983 + h->plt.plist->comp_offset);
10984
ce558b89 10985 BFD_ASSERT (plt_offset <= htab->root.splt->size);
1bbce132
MR
10986
10987 /* Find out where the .plt entry should go. */
ce558b89 10988 loc = htab->root.splt->contents + plt_offset;
1bbce132
MR
10989
10990 /* Fill in the PLT entry itself. */
833794fc
MR
10991 if (!MICROMIPS_P (output_bfd))
10992 {
10993 const bfd_vma *plt_entry = mips16_o32_exec_plt_entry;
10994
10995 bfd_put_16 (output_bfd, plt_entry[0], loc);
10996 bfd_put_16 (output_bfd, plt_entry[1], loc + 2);
10997 bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
10998 bfd_put_16 (output_bfd, plt_entry[3], loc + 6);
10999 bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11000 bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
11001 bfd_put_32 (output_bfd, got_address, loc + 12);
11002 }
11003 else if (htab->insn32)
11004 {
11005 const bfd_vma *plt_entry = micromips_insn32_o32_exec_plt_entry;
11006
11007 bfd_put_16 (output_bfd, plt_entry[0], loc);
11008 bfd_put_16 (output_bfd, got_address_high, loc + 2);
11009 bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11010 bfd_put_16 (output_bfd, got_address_low, loc + 6);
11011 bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11012 bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
11013 bfd_put_16 (output_bfd, plt_entry[6], loc + 12);
11014 bfd_put_16 (output_bfd, got_address_low, loc + 14);
11015 }
11016 else
1bbce132
MR
11017 {
11018 const bfd_vma *plt_entry = micromips_o32_exec_plt_entry;
11019 bfd_signed_vma gotpc_offset;
11020 bfd_vma loc_address;
11021
11022 BFD_ASSERT (got_address % 4 == 0);
11023
ce558b89
AM
11024 loc_address = (htab->root.splt->output_section->vma
11025 + htab->root.splt->output_offset + plt_offset);
1bbce132
MR
11026 gotpc_offset = got_address - ((loc_address | 3) ^ 3);
11027
11028 /* ADDIUPC has a span of +/-16MB, check we're in range. */
11029 if (gotpc_offset + 0x1000000 >= 0x2000000)
11030 {
4eca0228 11031 _bfd_error_handler
695344c0 11032 /* xgettext:c-format */
2dcf00ce 11033 (_("%pB: `%pA' offset of %" PRId64 " from `%pA' "
1bbce132
MR
11034 "beyond the range of ADDIUPC"),
11035 output_bfd,
ce558b89 11036 htab->root.sgotplt->output_section,
2dcf00ce 11037 (int64_t) gotpc_offset,
c08bb8dd 11038 htab->root.splt->output_section);
1bbce132
MR
11039 bfd_set_error (bfd_error_no_error);
11040 return FALSE;
11041 }
11042 bfd_put_16 (output_bfd,
11043 plt_entry[0] | ((gotpc_offset >> 18) & 0x7f), loc);
11044 bfd_put_16 (output_bfd, (gotpc_offset >> 2) & 0xffff, loc + 2);
11045 bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11046 bfd_put_16 (output_bfd, plt_entry[3], loc + 6);
11047 bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11048 bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
11049 }
6d30f5b2 11050 }
861fb55a
DJ
11051
11052 /* Emit an R_MIPS_JUMP_SLOT relocation against the .got.plt entry. */
ce558b89 11053 mips_elf_output_dynamic_relocation (output_bfd, htab->root.srelplt,
1bbce132 11054 got_index - 2, h->dynindx,
861fb55a
DJ
11055 R_MIPS_JUMP_SLOT, got_address);
11056
11057 /* We distinguish between PLT entries and lazy-binding stubs by
11058 giving the former an st_other value of STO_MIPS_PLT. Set the
11059 flag and leave the value if there are any relocations in the
11060 binary where pointer equality matters. */
11061 sym->st_shndx = SHN_UNDEF;
11062 if (h->pointer_equality_needed)
1bbce132 11063 sym->st_other = ELF_ST_SET_MIPS_PLT (sym->st_other);
861fb55a 11064 else
1bbce132
MR
11065 {
11066 sym->st_value = 0;
11067 sym->st_other = 0;
11068 }
861fb55a 11069 }
1bbce132
MR
11070
11071 if (h->plt.plist != NULL && h->plt.plist->stub_offset != MINUS_ONE)
b49e97c9 11072 {
861fb55a 11073 /* We've decided to create a lazy-binding stub. */
1bbce132
MR
11074 bfd_boolean micromips_p = MICROMIPS_P (output_bfd);
11075 unsigned int other = micromips_p ? STO_MICROMIPS : 0;
11076 bfd_vma stub_size = htab->function_stub_size;
5108fc1b 11077 bfd_byte stub[MIPS_FUNCTION_STUB_BIG_SIZE];
1bbce132
MR
11078 bfd_vma isa_bit = micromips_p;
11079 bfd_vma stub_big_size;
11080
833794fc 11081 if (!micromips_p)
1bbce132 11082 stub_big_size = MIPS_FUNCTION_STUB_BIG_SIZE;
833794fc
MR
11083 else if (htab->insn32)
11084 stub_big_size = MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE;
11085 else
11086 stub_big_size = MICROMIPS_FUNCTION_STUB_BIG_SIZE;
b49e97c9
TS
11087
11088 /* This symbol has a stub. Set it up. */
11089
11090 BFD_ASSERT (h->dynindx != -1);
11091
1bbce132 11092 BFD_ASSERT (stub_size == stub_big_size || h->dynindx <= 0xffff);
3d6746ca
DD
11093
11094 /* Values up to 2^31 - 1 are allowed. Larger values would cause
5108fc1b
RS
11095 sign extension at runtime in the stub, resulting in a negative
11096 index value. */
11097 if (h->dynindx & ~0x7fffffff)
b34976b6 11098 return FALSE;
b49e97c9
TS
11099
11100 /* Fill the stub. */
1bbce132
MR
11101 if (micromips_p)
11102 {
11103 idx = 0;
11104 bfd_put_micromips_32 (output_bfd, STUB_LW_MICROMIPS (output_bfd),
11105 stub + idx);
11106 idx += 4;
833794fc
MR
11107 if (htab->insn32)
11108 {
11109 bfd_put_micromips_32 (output_bfd,
40fc1451 11110 STUB_MOVE32_MICROMIPS, stub + idx);
833794fc
MR
11111 idx += 4;
11112 }
11113 else
11114 {
11115 bfd_put_16 (output_bfd, STUB_MOVE_MICROMIPS, stub + idx);
11116 idx += 2;
11117 }
1bbce132
MR
11118 if (stub_size == stub_big_size)
11119 {
11120 long dynindx_hi = (h->dynindx >> 16) & 0x7fff;
11121
11122 bfd_put_micromips_32 (output_bfd,
11123 STUB_LUI_MICROMIPS (dynindx_hi),
11124 stub + idx);
11125 idx += 4;
11126 }
833794fc
MR
11127 if (htab->insn32)
11128 {
11129 bfd_put_micromips_32 (output_bfd, STUB_JALR32_MICROMIPS,
11130 stub + idx);
11131 idx += 4;
11132 }
11133 else
11134 {
11135 bfd_put_16 (output_bfd, STUB_JALR_MICROMIPS, stub + idx);
11136 idx += 2;
11137 }
1bbce132
MR
11138
11139 /* If a large stub is not required and sign extension is not a
11140 problem, then use legacy code in the stub. */
11141 if (stub_size == stub_big_size)
11142 bfd_put_micromips_32 (output_bfd,
11143 STUB_ORI_MICROMIPS (h->dynindx & 0xffff),
11144 stub + idx);
11145 else if (h->dynindx & ~0x7fff)
11146 bfd_put_micromips_32 (output_bfd,
11147 STUB_LI16U_MICROMIPS (h->dynindx & 0xffff),
11148 stub + idx);
11149 else
11150 bfd_put_micromips_32 (output_bfd,
11151 STUB_LI16S_MICROMIPS (output_bfd,
11152 h->dynindx),
11153 stub + idx);
11154 }
3d6746ca 11155 else
1bbce132
MR
11156 {
11157 idx = 0;
11158 bfd_put_32 (output_bfd, STUB_LW (output_bfd), stub + idx);
11159 idx += 4;
40fc1451 11160 bfd_put_32 (output_bfd, STUB_MOVE, stub + idx);
1bbce132
MR
11161 idx += 4;
11162 if (stub_size == stub_big_size)
11163 {
11164 bfd_put_32 (output_bfd, STUB_LUI ((h->dynindx >> 16) & 0x7fff),
11165 stub + idx);
11166 idx += 4;
11167 }
3734320d
MF
11168
11169 if (!(MIPSR6_P (output_bfd) && htab->compact_branches))
11170 {
11171 bfd_put_32 (output_bfd, STUB_JALR, stub + idx);
11172 idx += 4;
11173 }
1bbce132
MR
11174
11175 /* If a large stub is not required and sign extension is not a
11176 problem, then use legacy code in the stub. */
11177 if (stub_size == stub_big_size)
11178 bfd_put_32 (output_bfd, STUB_ORI (h->dynindx & 0xffff),
11179 stub + idx);
11180 else if (h->dynindx & ~0x7fff)
11181 bfd_put_32 (output_bfd, STUB_LI16U (h->dynindx & 0xffff),
11182 stub + idx);
11183 else
11184 bfd_put_32 (output_bfd, STUB_LI16S (output_bfd, h->dynindx),
11185 stub + idx);
3734320d
MF
11186 idx += 4;
11187
11188 if (MIPSR6_P (output_bfd) && htab->compact_branches)
11189 bfd_put_32 (output_bfd, STUB_JALRC, stub + idx);
1bbce132 11190 }
5108fc1b 11191
1bbce132
MR
11192 BFD_ASSERT (h->plt.plist->stub_offset <= htab->sstubs->size);
11193 memcpy (htab->sstubs->contents + h->plt.plist->stub_offset,
11194 stub, stub_size);
b49e97c9 11195
1bbce132 11196 /* Mark the symbol as undefined. stub_offset != -1 occurs
b49e97c9
TS
11197 only for the referenced symbol. */
11198 sym->st_shndx = SHN_UNDEF;
11199
11200 /* The run-time linker uses the st_value field of the symbol
11201 to reset the global offset table entry for this external
11202 to its stub address when unlinking a shared object. */
4e41d0d7
RS
11203 sym->st_value = (htab->sstubs->output_section->vma
11204 + htab->sstubs->output_offset
1bbce132
MR
11205 + h->plt.plist->stub_offset
11206 + isa_bit);
11207 sym->st_other = other;
b49e97c9
TS
11208 }
11209
738e5348
RS
11210 /* If we have a MIPS16 function with a stub, the dynamic symbol must
11211 refer to the stub, since only the stub uses the standard calling
11212 conventions. */
11213 if (h->dynindx != -1 && hmips->fn_stub != NULL)
11214 {
11215 BFD_ASSERT (hmips->need_fn_stub);
11216 sym->st_value = (hmips->fn_stub->output_section->vma
11217 + hmips->fn_stub->output_offset);
11218 sym->st_size = hmips->fn_stub->size;
11219 sym->st_other = ELF_ST_VISIBILITY (sym->st_other);
11220 }
11221
b49e97c9 11222 BFD_ASSERT (h->dynindx != -1
f5385ebf 11223 || h->forced_local);
b49e97c9 11224
ce558b89 11225 sgot = htab->root.sgot;
a8028dd0 11226 g = htab->got_info;
b49e97c9
TS
11227 BFD_ASSERT (g != NULL);
11228
11229 /* Run through the global symbol table, creating GOT entries for all
11230 the symbols that need them. */
020d7251 11231 if (hmips->global_got_area != GGA_NONE)
b49e97c9
TS
11232 {
11233 bfd_vma offset;
11234 bfd_vma value;
11235
6eaa6adc 11236 value = sym->st_value;
13fbec83 11237 offset = mips_elf_primary_global_got_index (output_bfd, info, h);
b49e97c9
TS
11238 MIPS_ELF_PUT_WORD (output_bfd, value, sgot->contents + offset);
11239 }
11240
e641e783 11241 if (hmips->global_got_area != GGA_NONE && g->next)
f4416af6
AO
11242 {
11243 struct mips_got_entry e, *p;
0626d451 11244 bfd_vma entry;
f4416af6 11245 bfd_vma offset;
f4416af6
AO
11246
11247 gg = g;
11248
11249 e.abfd = output_bfd;
11250 e.symndx = -1;
738e5348 11251 e.d.h = hmips;
9ab066b4 11252 e.tls_type = GOT_TLS_NONE;
143d77c5 11253
f4416af6
AO
11254 for (g = g->next; g->next != gg; g = g->next)
11255 {
11256 if (g->got_entries
11257 && (p = (struct mips_got_entry *) htab_find (g->got_entries,
11258 &e)))
11259 {
11260 offset = p->gotidx;
ce558b89 11261 BFD_ASSERT (offset > 0 && offset < htab->root.sgot->size);
0e1862bb 11262 if (bfd_link_pic (info)
0626d451
RS
11263 || (elf_hash_table (info)->dynamic_sections_created
11264 && p->d.h != NULL
f5385ebf
AM
11265 && p->d.h->root.def_dynamic
11266 && !p->d.h->root.def_regular))
0626d451
RS
11267 {
11268 /* Create an R_MIPS_REL32 relocation for this entry. Due to
11269 the various compatibility problems, it's easier to mock
11270 up an R_MIPS_32 or R_MIPS_64 relocation and leave
11271 mips_elf_create_dynamic_relocation to calculate the
11272 appropriate addend. */
11273 Elf_Internal_Rela rel[3];
11274
11275 memset (rel, 0, sizeof (rel));
11276 if (ABI_64_P (output_bfd))
11277 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_64);
11278 else
11279 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_32);
11280 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
11281
11282 entry = 0;
11283 if (! (mips_elf_create_dynamic_relocation
11284 (output_bfd, info, rel,
11285 e.d.h, NULL, sym->st_value, &entry, sgot)))
11286 return FALSE;
11287 }
11288 else
11289 entry = sym->st_value;
11290 MIPS_ELF_PUT_WORD (output_bfd, entry, sgot->contents + offset);
f4416af6
AO
11291 }
11292 }
11293 }
11294
b49e97c9
TS
11295 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
11296 name = h->root.root.string;
9637f6ef 11297 if (h == elf_hash_table (info)->hdynamic
22edb2f1 11298 || h == elf_hash_table (info)->hgot)
b49e97c9
TS
11299 sym->st_shndx = SHN_ABS;
11300 else if (strcmp (name, "_DYNAMIC_LINK") == 0
11301 || strcmp (name, "_DYNAMIC_LINKING") == 0)
11302 {
11303 sym->st_shndx = SHN_ABS;
11304 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11305 sym->st_value = 1;
11306 }
b49e97c9
TS
11307 else if (SGI_COMPAT (output_bfd))
11308 {
11309 if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
11310 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
11311 {
11312 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11313 sym->st_other = STO_PROTECTED;
11314 sym->st_value = 0;
11315 sym->st_shndx = SHN_MIPS_DATA;
11316 }
11317 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
11318 {
11319 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
11320 sym->st_other = STO_PROTECTED;
11321 sym->st_value = mips_elf_hash_table (info)->procedure_count;
11322 sym->st_shndx = SHN_ABS;
11323 }
11324 else if (sym->st_shndx != SHN_UNDEF && sym->st_shndx != SHN_ABS)
11325 {
11326 if (h->type == STT_FUNC)
11327 sym->st_shndx = SHN_MIPS_TEXT;
11328 else if (h->type == STT_OBJECT)
11329 sym->st_shndx = SHN_MIPS_DATA;
11330 }
11331 }
11332
861fb55a
DJ
11333 /* Emit a copy reloc, if needed. */
11334 if (h->needs_copy)
11335 {
11336 asection *s;
11337 bfd_vma symval;
11338
11339 BFD_ASSERT (h->dynindx != -1);
11340 BFD_ASSERT (htab->use_plts_and_copy_relocs);
11341
11342 s = mips_elf_rel_dyn_section (info, FALSE);
11343 symval = (h->root.u.def.section->output_section->vma
11344 + h->root.u.def.section->output_offset
11345 + h->root.u.def.value);
11346 mips_elf_output_dynamic_relocation (output_bfd, s, s->reloc_count++,
11347 h->dynindx, R_MIPS_COPY, symval);
11348 }
11349
b49e97c9
TS
11350 /* Handle the IRIX6-specific symbols. */
11351 if (IRIX_COMPAT (output_bfd) == ict_irix6)
11352 mips_elf_irix6_finish_dynamic_symbol (output_bfd, name, sym);
11353
cbf8d970
MR
11354 /* Keep dynamic compressed symbols odd. This allows the dynamic linker
11355 to treat compressed symbols like any other. */
30c09090 11356 if (ELF_ST_IS_MIPS16 (sym->st_other))
738e5348
RS
11357 {
11358 BFD_ASSERT (sym->st_value & 1);
11359 sym->st_other -= STO_MIPS16;
11360 }
cbf8d970
MR
11361 else if (ELF_ST_IS_MICROMIPS (sym->st_other))
11362 {
11363 BFD_ASSERT (sym->st_value & 1);
11364 sym->st_other -= STO_MICROMIPS;
11365 }
b49e97c9 11366
b34976b6 11367 return TRUE;
b49e97c9
TS
11368}
11369
0a44bf69
RS
11370/* Likewise, for VxWorks. */
11371
11372bfd_boolean
11373_bfd_mips_vxworks_finish_dynamic_symbol (bfd *output_bfd,
11374 struct bfd_link_info *info,
11375 struct elf_link_hash_entry *h,
11376 Elf_Internal_Sym *sym)
11377{
11378 bfd *dynobj;
11379 asection *sgot;
11380 struct mips_got_info *g;
11381 struct mips_elf_link_hash_table *htab;
020d7251 11382 struct mips_elf_link_hash_entry *hmips;
0a44bf69
RS
11383
11384 htab = mips_elf_hash_table (info);
4dfe6ac6 11385 BFD_ASSERT (htab != NULL);
0a44bf69 11386 dynobj = elf_hash_table (info)->dynobj;
020d7251 11387 hmips = (struct mips_elf_link_hash_entry *) h;
0a44bf69 11388
1bbce132 11389 if (h->plt.plist != NULL && h->plt.plist->mips_offset != MINUS_ONE)
0a44bf69 11390 {
6d79d2ed 11391 bfd_byte *loc;
1bbce132 11392 bfd_vma plt_address, got_address, got_offset, branch_offset;
0a44bf69
RS
11393 Elf_Internal_Rela rel;
11394 static const bfd_vma *plt_entry;
1bbce132
MR
11395 bfd_vma gotplt_index;
11396 bfd_vma plt_offset;
11397
11398 plt_offset = htab->plt_header_size + h->plt.plist->mips_offset;
11399 gotplt_index = h->plt.plist->gotplt_index;
0a44bf69
RS
11400
11401 BFD_ASSERT (h->dynindx != -1);
ce558b89 11402 BFD_ASSERT (htab->root.splt != NULL);
1bbce132 11403 BFD_ASSERT (gotplt_index != MINUS_ONE);
ce558b89 11404 BFD_ASSERT (plt_offset <= htab->root.splt->size);
0a44bf69
RS
11405
11406 /* Calculate the address of the .plt entry. */
ce558b89
AM
11407 plt_address = (htab->root.splt->output_section->vma
11408 + htab->root.splt->output_offset
1bbce132 11409 + plt_offset);
0a44bf69
RS
11410
11411 /* Calculate the address of the .got.plt entry. */
ce558b89
AM
11412 got_address = (htab->root.sgotplt->output_section->vma
11413 + htab->root.sgotplt->output_offset
1bbce132 11414 + gotplt_index * MIPS_ELF_GOT_SIZE (output_bfd));
0a44bf69
RS
11415
11416 /* Calculate the offset of the .got.plt entry from
11417 _GLOBAL_OFFSET_TABLE_. */
11418 got_offset = mips_elf_gotplt_index (info, h);
11419
11420 /* Calculate the offset for the branch at the start of the PLT
11421 entry. The branch jumps to the beginning of .plt. */
1bbce132 11422 branch_offset = -(plt_offset / 4 + 1) & 0xffff;
0a44bf69
RS
11423
11424 /* Fill in the initial value of the .got.plt entry. */
11425 bfd_put_32 (output_bfd, plt_address,
ce558b89 11426 (htab->root.sgotplt->contents
1bbce132 11427 + gotplt_index * MIPS_ELF_GOT_SIZE (output_bfd)));
0a44bf69
RS
11428
11429 /* Find out where the .plt entry should go. */
ce558b89 11430 loc = htab->root.splt->contents + plt_offset;
0a44bf69 11431
0e1862bb 11432 if (bfd_link_pic (info))
0a44bf69
RS
11433 {
11434 plt_entry = mips_vxworks_shared_plt_entry;
11435 bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
1bbce132 11436 bfd_put_32 (output_bfd, plt_entry[1] | gotplt_index, loc + 4);
0a44bf69
RS
11437 }
11438 else
11439 {
11440 bfd_vma got_address_high, got_address_low;
11441
11442 plt_entry = mips_vxworks_exec_plt_entry;
11443 got_address_high = ((got_address + 0x8000) >> 16) & 0xffff;
11444 got_address_low = got_address & 0xffff;
11445
11446 bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
1bbce132 11447 bfd_put_32 (output_bfd, plt_entry[1] | gotplt_index, loc + 4);
0a44bf69
RS
11448 bfd_put_32 (output_bfd, plt_entry[2] | got_address_high, loc + 8);
11449 bfd_put_32 (output_bfd, plt_entry[3] | got_address_low, loc + 12);
11450 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11451 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11452 bfd_put_32 (output_bfd, plt_entry[6], loc + 24);
11453 bfd_put_32 (output_bfd, plt_entry[7], loc + 28);
11454
11455 loc = (htab->srelplt2->contents
1bbce132 11456 + (gotplt_index * 3 + 2) * sizeof (Elf32_External_Rela));
0a44bf69
RS
11457
11458 /* Emit a relocation for the .got.plt entry. */
11459 rel.r_offset = got_address;
11460 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
1bbce132 11461 rel.r_addend = plt_offset;
0a44bf69
RS
11462 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11463
11464 /* Emit a relocation for the lui of %hi(<.got.plt slot>). */
11465 loc += sizeof (Elf32_External_Rela);
11466 rel.r_offset = plt_address + 8;
11467 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11468 rel.r_addend = got_offset;
11469 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11470
11471 /* Emit a relocation for the addiu of %lo(<.got.plt slot>). */
11472 loc += sizeof (Elf32_External_Rela);
11473 rel.r_offset += 4;
11474 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11475 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11476 }
11477
11478 /* Emit an R_MIPS_JUMP_SLOT relocation against the .got.plt entry. */
ce558b89 11479 loc = (htab->root.srelplt->contents
1bbce132 11480 + gotplt_index * sizeof (Elf32_External_Rela));
0a44bf69
RS
11481 rel.r_offset = got_address;
11482 rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_JUMP_SLOT);
11483 rel.r_addend = 0;
11484 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11485
11486 if (!h->def_regular)
11487 sym->st_shndx = SHN_UNDEF;
11488 }
11489
11490 BFD_ASSERT (h->dynindx != -1 || h->forced_local);
11491
ce558b89 11492 sgot = htab->root.sgot;
a8028dd0 11493 g = htab->got_info;
0a44bf69
RS
11494 BFD_ASSERT (g != NULL);
11495
11496 /* See if this symbol has an entry in the GOT. */
020d7251 11497 if (hmips->global_got_area != GGA_NONE)
0a44bf69
RS
11498 {
11499 bfd_vma offset;
11500 Elf_Internal_Rela outrel;
11501 bfd_byte *loc;
11502 asection *s;
11503
11504 /* Install the symbol value in the GOT. */
13fbec83 11505 offset = mips_elf_primary_global_got_index (output_bfd, info, h);
0a44bf69
RS
11506 MIPS_ELF_PUT_WORD (output_bfd, sym->st_value, sgot->contents + offset);
11507
11508 /* Add a dynamic relocation for it. */
11509 s = mips_elf_rel_dyn_section (info, FALSE);
11510 loc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
11511 outrel.r_offset = (sgot->output_section->vma
11512 + sgot->output_offset
11513 + offset);
11514 outrel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_32);
11515 outrel.r_addend = 0;
11516 bfd_elf32_swap_reloca_out (dynobj, &outrel, loc);
11517 }
11518
11519 /* Emit a copy reloc, if needed. */
11520 if (h->needs_copy)
11521 {
11522 Elf_Internal_Rela rel;
5474d94f
AM
11523 asection *srel;
11524 bfd_byte *loc;
0a44bf69
RS
11525
11526 BFD_ASSERT (h->dynindx != -1);
11527
11528 rel.r_offset = (h->root.u.def.section->output_section->vma
11529 + h->root.u.def.section->output_offset
11530 + h->root.u.def.value);
11531 rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_COPY);
11532 rel.r_addend = 0;
afbf7e8e 11533 if (h->root.u.def.section == htab->root.sdynrelro)
5474d94f
AM
11534 srel = htab->root.sreldynrelro;
11535 else
11536 srel = htab->root.srelbss;
11537 loc = srel->contents + srel->reloc_count * sizeof (Elf32_External_Rela);
11538 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11539 ++srel->reloc_count;
0a44bf69
RS
11540 }
11541
df58fc94
RS
11542 /* If this is a mips16/microMIPS symbol, force the value to be even. */
11543 if (ELF_ST_IS_COMPRESSED (sym->st_other))
0a44bf69
RS
11544 sym->st_value &= ~1;
11545
11546 return TRUE;
11547}
11548
861fb55a
DJ
11549/* Write out a plt0 entry to the beginning of .plt. */
11550
1bbce132 11551static bfd_boolean
861fb55a
DJ
11552mips_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
11553{
11554 bfd_byte *loc;
11555 bfd_vma gotplt_value, gotplt_value_high, gotplt_value_low;
11556 static const bfd_vma *plt_entry;
11557 struct mips_elf_link_hash_table *htab;
11558
11559 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
11560 BFD_ASSERT (htab != NULL);
11561
861fb55a 11562 if (ABI_64_P (output_bfd))
3734320d
MF
11563 plt_entry = (htab->compact_branches
11564 ? mipsr6_n64_exec_plt0_entry_compact
11565 : mips_n64_exec_plt0_entry);
861fb55a 11566 else if (ABI_N32_P (output_bfd))
3734320d
MF
11567 plt_entry = (htab->compact_branches
11568 ? mipsr6_n32_exec_plt0_entry_compact
11569 : mips_n32_exec_plt0_entry);
833794fc 11570 else if (!htab->plt_header_is_comp)
3734320d
MF
11571 plt_entry = (htab->compact_branches
11572 ? mipsr6_o32_exec_plt0_entry_compact
11573 : mips_o32_exec_plt0_entry);
833794fc
MR
11574 else if (htab->insn32)
11575 plt_entry = micromips_insn32_o32_exec_plt0_entry;
11576 else
11577 plt_entry = micromips_o32_exec_plt0_entry;
861fb55a
DJ
11578
11579 /* Calculate the value of .got.plt. */
ce558b89
AM
11580 gotplt_value = (htab->root.sgotplt->output_section->vma
11581 + htab->root.sgotplt->output_offset);
861fb55a
DJ
11582 gotplt_value_high = ((gotplt_value + 0x8000) >> 16) & 0xffff;
11583 gotplt_value_low = gotplt_value & 0xffff;
11584
11585 /* The PLT sequence is not safe for N64 if .got.plt's address can
11586 not be loaded in two instructions. */
789ff5b6
MR
11587 if (ABI_64_P (output_bfd)
11588 && ((gotplt_value + 0x80008000) & ~(bfd_vma) 0xffffffff) != 0)
11589 {
11590 _bfd_error_handler
11591 /* xgettext:c-format */
11592 (_("%pB: `%pA' start VMA of %#" PRIx64 " outside the 32-bit range "
11593 "supported; consider using `-Ttext-segment=...'"),
11594 output_bfd,
11595 htab->root.sgotplt->output_section,
11596 (int64_t) gotplt_value);
11597 bfd_set_error (bfd_error_no_error);
11598 return FALSE;
11599 }
861fb55a
DJ
11600
11601 /* Install the PLT header. */
ce558b89 11602 loc = htab->root.splt->contents;
1bbce132
MR
11603 if (plt_entry == micromips_o32_exec_plt0_entry)
11604 {
11605 bfd_vma gotpc_offset;
11606 bfd_vma loc_address;
11607 size_t i;
11608
11609 BFD_ASSERT (gotplt_value % 4 == 0);
11610
ce558b89
AM
11611 loc_address = (htab->root.splt->output_section->vma
11612 + htab->root.splt->output_offset);
1bbce132
MR
11613 gotpc_offset = gotplt_value - ((loc_address | 3) ^ 3);
11614
11615 /* ADDIUPC has a span of +/-16MB, check we're in range. */
11616 if (gotpc_offset + 0x1000000 >= 0x2000000)
11617 {
4eca0228 11618 _bfd_error_handler
695344c0 11619 /* xgettext:c-format */
2dcf00ce
AM
11620 (_("%pB: `%pA' offset of %" PRId64 " from `%pA' "
11621 "beyond the range of ADDIUPC"),
1bbce132 11622 output_bfd,
ce558b89 11623 htab->root.sgotplt->output_section,
2dcf00ce 11624 (int64_t) gotpc_offset,
c08bb8dd 11625 htab->root.splt->output_section);
1bbce132
MR
11626 bfd_set_error (bfd_error_no_error);
11627 return FALSE;
11628 }
11629 bfd_put_16 (output_bfd,
11630 plt_entry[0] | ((gotpc_offset >> 18) & 0x7f), loc);
11631 bfd_put_16 (output_bfd, (gotpc_offset >> 2) & 0xffff, loc + 2);
11632 for (i = 2; i < ARRAY_SIZE (micromips_o32_exec_plt0_entry); i++)
11633 bfd_put_16 (output_bfd, plt_entry[i], loc + (i * 2));
11634 }
833794fc
MR
11635 else if (plt_entry == micromips_insn32_o32_exec_plt0_entry)
11636 {
11637 size_t i;
11638
11639 bfd_put_16 (output_bfd, plt_entry[0], loc);
11640 bfd_put_16 (output_bfd, gotplt_value_high, loc + 2);
11641 bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
11642 bfd_put_16 (output_bfd, gotplt_value_low, loc + 6);
11643 bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
11644 bfd_put_16 (output_bfd, gotplt_value_low, loc + 10);
11645 for (i = 6; i < ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry); i++)
11646 bfd_put_16 (output_bfd, plt_entry[i], loc + (i * 2));
11647 }
1bbce132
MR
11648 else
11649 {
11650 bfd_put_32 (output_bfd, plt_entry[0] | gotplt_value_high, loc);
11651 bfd_put_32 (output_bfd, plt_entry[1] | gotplt_value_low, loc + 4);
11652 bfd_put_32 (output_bfd, plt_entry[2] | gotplt_value_low, loc + 8);
11653 bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
11654 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11655 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11656 bfd_put_32 (output_bfd, plt_entry[6], loc + 24);
11657 bfd_put_32 (output_bfd, plt_entry[7], loc + 28);
11658 }
11659
11660 return TRUE;
861fb55a
DJ
11661}
11662
0a44bf69
RS
11663/* Install the PLT header for a VxWorks executable and finalize the
11664 contents of .rela.plt.unloaded. */
11665
11666static void
11667mips_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
11668{
11669 Elf_Internal_Rela rela;
11670 bfd_byte *loc;
11671 bfd_vma got_value, got_value_high, got_value_low, plt_address;
11672 static const bfd_vma *plt_entry;
11673 struct mips_elf_link_hash_table *htab;
11674
11675 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
11676 BFD_ASSERT (htab != NULL);
11677
0a44bf69
RS
11678 plt_entry = mips_vxworks_exec_plt0_entry;
11679
11680 /* Calculate the value of _GLOBAL_OFFSET_TABLE_. */
11681 got_value = (htab->root.hgot->root.u.def.section->output_section->vma
11682 + htab->root.hgot->root.u.def.section->output_offset
11683 + htab->root.hgot->root.u.def.value);
11684
11685 got_value_high = ((got_value + 0x8000) >> 16) & 0xffff;
11686 got_value_low = got_value & 0xffff;
11687
11688 /* Calculate the address of the PLT header. */
ce558b89
AM
11689 plt_address = (htab->root.splt->output_section->vma
11690 + htab->root.splt->output_offset);
0a44bf69
RS
11691
11692 /* Install the PLT header. */
ce558b89 11693 loc = htab->root.splt->contents;
0a44bf69
RS
11694 bfd_put_32 (output_bfd, plt_entry[0] | got_value_high, loc);
11695 bfd_put_32 (output_bfd, plt_entry[1] | got_value_low, loc + 4);
11696 bfd_put_32 (output_bfd, plt_entry[2], loc + 8);
11697 bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
11698 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11699 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11700
11701 /* Output the relocation for the lui of %hi(_GLOBAL_OFFSET_TABLE_). */
11702 loc = htab->srelplt2->contents;
11703 rela.r_offset = plt_address;
11704 rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11705 rela.r_addend = 0;
11706 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
11707 loc += sizeof (Elf32_External_Rela);
11708
11709 /* Output the relocation for the following addiu of
11710 %lo(_GLOBAL_OFFSET_TABLE_). */
11711 rela.r_offset += 4;
11712 rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11713 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
11714 loc += sizeof (Elf32_External_Rela);
11715
11716 /* Fix up the remaining relocations. They may have the wrong
11717 symbol index for _G_O_T_ or _P_L_T_ depending on the order
11718 in which symbols were output. */
11719 while (loc < htab->srelplt2->contents + htab->srelplt2->size)
11720 {
11721 Elf_Internal_Rela rel;
11722
11723 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11724 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
11725 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11726 loc += sizeof (Elf32_External_Rela);
11727
11728 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11729 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11730 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11731 loc += sizeof (Elf32_External_Rela);
11732
11733 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11734 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11735 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11736 loc += sizeof (Elf32_External_Rela);
11737 }
11738}
11739
11740/* Install the PLT header for a VxWorks shared library. */
11741
11742static void
11743mips_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info)
11744{
11745 unsigned int i;
11746 struct mips_elf_link_hash_table *htab;
11747
11748 htab = mips_elf_hash_table (info);
4dfe6ac6 11749 BFD_ASSERT (htab != NULL);
0a44bf69
RS
11750
11751 /* We just need to copy the entry byte-by-byte. */
11752 for (i = 0; i < ARRAY_SIZE (mips_vxworks_shared_plt0_entry); i++)
11753 bfd_put_32 (output_bfd, mips_vxworks_shared_plt0_entry[i],
ce558b89 11754 htab->root.splt->contents + i * 4);
0a44bf69
RS
11755}
11756
b49e97c9
TS
11757/* Finish up the dynamic sections. */
11758
b34976b6 11759bfd_boolean
9719ad41
RS
11760_bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
11761 struct bfd_link_info *info)
b49e97c9
TS
11762{
11763 bfd *dynobj;
11764 asection *sdyn;
11765 asection *sgot;
f4416af6 11766 struct mips_got_info *gg, *g;
0a44bf69 11767 struct mips_elf_link_hash_table *htab;
b49e97c9 11768
0a44bf69 11769 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
11770 BFD_ASSERT (htab != NULL);
11771
b49e97c9
TS
11772 dynobj = elf_hash_table (info)->dynobj;
11773
3d4d4302 11774 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
b49e97c9 11775
ce558b89 11776 sgot = htab->root.sgot;
23cc69b6 11777 gg = htab->got_info;
b49e97c9
TS
11778
11779 if (elf_hash_table (info)->dynamic_sections_created)
11780 {
11781 bfd_byte *b;
943284cc 11782 int dyn_to_skip = 0, dyn_skipped = 0;
b49e97c9
TS
11783
11784 BFD_ASSERT (sdyn != NULL);
23cc69b6
RS
11785 BFD_ASSERT (gg != NULL);
11786
d7206569 11787 g = mips_elf_bfd_got (output_bfd, FALSE);
b49e97c9
TS
11788 BFD_ASSERT (g != NULL);
11789
11790 for (b = sdyn->contents;
eea6121a 11791 b < sdyn->contents + sdyn->size;
b49e97c9
TS
11792 b += MIPS_ELF_DYN_SIZE (dynobj))
11793 {
11794 Elf_Internal_Dyn dyn;
11795 const char *name;
11796 size_t elemsize;
11797 asection *s;
b34976b6 11798 bfd_boolean swap_out_p;
b49e97c9
TS
11799
11800 /* Read in the current dynamic entry. */
11801 (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
11802
11803 /* Assume that we're going to modify it and write it out. */
b34976b6 11804 swap_out_p = TRUE;
b49e97c9
TS
11805
11806 switch (dyn.d_tag)
11807 {
11808 case DT_RELENT:
b49e97c9
TS
11809 dyn.d_un.d_val = MIPS_ELF_REL_SIZE (dynobj);
11810 break;
11811
0a44bf69
RS
11812 case DT_RELAENT:
11813 BFD_ASSERT (htab->is_vxworks);
11814 dyn.d_un.d_val = MIPS_ELF_RELA_SIZE (dynobj);
11815 break;
11816
b49e97c9
TS
11817 case DT_STRSZ:
11818 /* Rewrite DT_STRSZ. */
11819 dyn.d_un.d_val =
11820 _bfd_elf_strtab_size (elf_hash_table (info)->dynstr);
11821 break;
11822
11823 case DT_PLTGOT:
ce558b89 11824 s = htab->root.sgot;
861fb55a
DJ
11825 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
11826 break;
11827
11828 case DT_MIPS_PLTGOT:
ce558b89 11829 s = htab->root.sgotplt;
861fb55a 11830 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
b49e97c9
TS
11831 break;
11832
11833 case DT_MIPS_RLD_VERSION:
11834 dyn.d_un.d_val = 1; /* XXX */
11835 break;
11836
11837 case DT_MIPS_FLAGS:
11838 dyn.d_un.d_val = RHF_NOTPOT; /* XXX */
11839 break;
11840
b49e97c9 11841 case DT_MIPS_TIME_STAMP:
6edfbbad
DJ
11842 {
11843 time_t t;
11844 time (&t);
11845 dyn.d_un.d_val = t;
11846 }
b49e97c9
TS
11847 break;
11848
11849 case DT_MIPS_ICHECKSUM:
11850 /* XXX FIXME: */
b34976b6 11851 swap_out_p = FALSE;
b49e97c9
TS
11852 break;
11853
11854 case DT_MIPS_IVERSION:
11855 /* XXX FIXME: */
b34976b6 11856 swap_out_p = FALSE;
b49e97c9
TS
11857 break;
11858
11859 case DT_MIPS_BASE_ADDRESS:
11860 s = output_bfd->sections;
11861 BFD_ASSERT (s != NULL);
11862 dyn.d_un.d_ptr = s->vma & ~(bfd_vma) 0xffff;
11863 break;
11864
11865 case DT_MIPS_LOCAL_GOTNO:
11866 dyn.d_un.d_val = g->local_gotno;
11867 break;
11868
11869 case DT_MIPS_UNREFEXTNO:
11870 /* The index into the dynamic symbol table which is the
11871 entry of the first external symbol that is not
11872 referenced within the same object. */
11873 dyn.d_un.d_val = bfd_count_sections (output_bfd) + 1;
11874 break;
11875
11876 case DT_MIPS_GOTSYM:
d222d210 11877 if (htab->global_gotsym)
b49e97c9 11878 {
d222d210 11879 dyn.d_un.d_val = htab->global_gotsym->dynindx;
b49e97c9
TS
11880 break;
11881 }
11882 /* In case if we don't have global got symbols we default
11883 to setting DT_MIPS_GOTSYM to the same value as
1a0670f3
AM
11884 DT_MIPS_SYMTABNO. */
11885 /* Fall through. */
b49e97c9
TS
11886
11887 case DT_MIPS_SYMTABNO:
11888 name = ".dynsym";
11889 elemsize = MIPS_ELF_SYM_SIZE (output_bfd);
4ade44b7 11890 s = bfd_get_linker_section (dynobj, name);
b49e97c9 11891
131e2f8e
MF
11892 if (s != NULL)
11893 dyn.d_un.d_val = s->size / elemsize;
11894 else
11895 dyn.d_un.d_val = 0;
b49e97c9
TS
11896 break;
11897
11898 case DT_MIPS_HIPAGENO:
861fb55a 11899 dyn.d_un.d_val = g->local_gotno - htab->reserved_gotno;
b49e97c9
TS
11900 break;
11901
11902 case DT_MIPS_RLD_MAP:
b4082c70
DD
11903 {
11904 struct elf_link_hash_entry *h;
11905 h = mips_elf_hash_table (info)->rld_symbol;
11906 if (!h)
11907 {
11908 dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
11909 swap_out_p = FALSE;
11910 break;
11911 }
11912 s = h->root.u.def.section;
a5499fa4
MF
11913
11914 /* The MIPS_RLD_MAP tag stores the absolute address of the
11915 debug pointer. */
b4082c70
DD
11916 dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
11917 + h->root.u.def.value);
11918 }
b49e97c9
TS
11919 break;
11920
a5499fa4
MF
11921 case DT_MIPS_RLD_MAP_REL:
11922 {
11923 struct elf_link_hash_entry *h;
11924 bfd_vma dt_addr, rld_addr;
11925 h = mips_elf_hash_table (info)->rld_symbol;
11926 if (!h)
11927 {
11928 dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
11929 swap_out_p = FALSE;
11930 break;
11931 }
11932 s = h->root.u.def.section;
11933
11934 /* The MIPS_RLD_MAP_REL tag stores the offset to the debug
11935 pointer, relative to the address of the tag. */
11936 dt_addr = (sdyn->output_section->vma + sdyn->output_offset
d5cff5df 11937 + (b - sdyn->contents));
a5499fa4
MF
11938 rld_addr = (s->output_section->vma + s->output_offset
11939 + h->root.u.def.value);
11940 dyn.d_un.d_ptr = rld_addr - dt_addr;
11941 }
11942 break;
11943
b49e97c9
TS
11944 case DT_MIPS_OPTIONS:
11945 s = (bfd_get_section_by_name
11946 (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (output_bfd)));
11947 dyn.d_un.d_ptr = s->vma;
11948 break;
11949
0a44bf69 11950 case DT_PLTREL:
861fb55a
DJ
11951 BFD_ASSERT (htab->use_plts_and_copy_relocs);
11952 if (htab->is_vxworks)
11953 dyn.d_un.d_val = DT_RELA;
11954 else
11955 dyn.d_un.d_val = DT_REL;
0a44bf69
RS
11956 break;
11957
11958 case DT_PLTRELSZ:
861fb55a 11959 BFD_ASSERT (htab->use_plts_and_copy_relocs);
ce558b89 11960 dyn.d_un.d_val = htab->root.srelplt->size;
0a44bf69
RS
11961 break;
11962
11963 case DT_JMPREL:
861fb55a 11964 BFD_ASSERT (htab->use_plts_and_copy_relocs);
ce558b89
AM
11965 dyn.d_un.d_ptr = (htab->root.srelplt->output_section->vma
11966 + htab->root.srelplt->output_offset);
0a44bf69
RS
11967 break;
11968
943284cc
DJ
11969 case DT_TEXTREL:
11970 /* If we didn't need any text relocations after all, delete
11971 the dynamic tag. */
11972 if (!(info->flags & DF_TEXTREL))
11973 {
11974 dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
11975 swap_out_p = FALSE;
11976 }
11977 break;
11978
11979 case DT_FLAGS:
11980 /* If we didn't need any text relocations after all, clear
11981 DF_TEXTREL from DT_FLAGS. */
11982 if (!(info->flags & DF_TEXTREL))
11983 dyn.d_un.d_val &= ~DF_TEXTREL;
11984 else
11985 swap_out_p = FALSE;
11986 break;
11987
f16a9783
MS
11988 case DT_MIPS_XHASH:
11989 name = ".MIPS.xhash";
11990 s = bfd_get_linker_section (dynobj, name);
11991 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
11992 break;
11993
b49e97c9 11994 default:
b34976b6 11995 swap_out_p = FALSE;
7a2b07ff
NS
11996 if (htab->is_vxworks
11997 && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
11998 swap_out_p = TRUE;
b49e97c9
TS
11999 break;
12000 }
12001
943284cc 12002 if (swap_out_p || dyn_skipped)
b49e97c9 12003 (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
943284cc
DJ
12004 (dynobj, &dyn, b - dyn_skipped);
12005
12006 if (dyn_to_skip)
12007 {
12008 dyn_skipped += dyn_to_skip;
12009 dyn_to_skip = 0;
12010 }
b49e97c9 12011 }
943284cc
DJ
12012
12013 /* Wipe out any trailing entries if we shifted down a dynamic tag. */
12014 if (dyn_skipped > 0)
12015 memset (b - dyn_skipped, 0, dyn_skipped);
b49e97c9
TS
12016 }
12017
b55fd4d4
DJ
12018 if (sgot != NULL && sgot->size > 0
12019 && !bfd_is_abs_section (sgot->output_section))
b49e97c9 12020 {
0a44bf69
RS
12021 if (htab->is_vxworks)
12022 {
12023 /* The first entry of the global offset table points to the
12024 ".dynamic" section. The second is initialized by the
12025 loader and contains the shared library identifier.
12026 The third is also initialized by the loader and points
12027 to the lazy resolution stub. */
12028 MIPS_ELF_PUT_WORD (output_bfd,
12029 sdyn->output_offset + sdyn->output_section->vma,
12030 sgot->contents);
12031 MIPS_ELF_PUT_WORD (output_bfd, 0,
12032 sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
12033 MIPS_ELF_PUT_WORD (output_bfd, 0,
12034 sgot->contents
12035 + 2 * MIPS_ELF_GOT_SIZE (output_bfd));
12036 }
12037 else
12038 {
12039 /* The first entry of the global offset table will be filled at
12040 runtime. The second entry will be used by some runtime loaders.
12041 This isn't the case of IRIX rld. */
12042 MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0, sgot->contents);
51e38d68 12043 MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
0a44bf69
RS
12044 sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
12045 }
b49e97c9 12046
54938e2a
TS
12047 elf_section_data (sgot->output_section)->this_hdr.sh_entsize
12048 = MIPS_ELF_GOT_SIZE (output_bfd);
12049 }
b49e97c9 12050
f4416af6
AO
12051 /* Generate dynamic relocations for the non-primary gots. */
12052 if (gg != NULL && gg->next)
12053 {
12054 Elf_Internal_Rela rel[3];
12055 bfd_vma addend = 0;
12056
12057 memset (rel, 0, sizeof (rel));
12058 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_REL32);
12059
12060 for (g = gg->next; g->next != gg; g = g->next)
12061 {
91d6fa6a 12062 bfd_vma got_index = g->next->local_gotno + g->next->global_gotno
0f20cc35 12063 + g->next->tls_gotno;
f4416af6 12064
9719ad41 12065 MIPS_ELF_PUT_WORD (output_bfd, 0, sgot->contents
91d6fa6a 12066 + got_index++ * MIPS_ELF_GOT_SIZE (output_bfd));
51e38d68
RS
12067 MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
12068 sgot->contents
91d6fa6a 12069 + got_index++ * MIPS_ELF_GOT_SIZE (output_bfd));
f4416af6 12070
0e1862bb 12071 if (! bfd_link_pic (info))
f4416af6
AO
12072 continue;
12073
cb22ccf4 12074 for (; got_index < g->local_gotno; got_index++)
f4416af6 12075 {
cb22ccf4
KCY
12076 if (got_index >= g->assigned_low_gotno
12077 && got_index <= g->assigned_high_gotno)
12078 continue;
12079
f4416af6 12080 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset
cb22ccf4 12081 = got_index * MIPS_ELF_GOT_SIZE (output_bfd);
f4416af6
AO
12082 if (!(mips_elf_create_dynamic_relocation
12083 (output_bfd, info, rel, NULL,
12084 bfd_abs_section_ptr,
12085 0, &addend, sgot)))
12086 return FALSE;
12087 BFD_ASSERT (addend == 0);
12088 }
12089 }
12090 }
12091
3133ddbf
DJ
12092 /* The generation of dynamic relocations for the non-primary gots
12093 adds more dynamic relocations. We cannot count them until
12094 here. */
12095
12096 if (elf_hash_table (info)->dynamic_sections_created)
12097 {
12098 bfd_byte *b;
12099 bfd_boolean swap_out_p;
12100
12101 BFD_ASSERT (sdyn != NULL);
12102
12103 for (b = sdyn->contents;
12104 b < sdyn->contents + sdyn->size;
12105 b += MIPS_ELF_DYN_SIZE (dynobj))
12106 {
12107 Elf_Internal_Dyn dyn;
12108 asection *s;
12109
12110 /* Read in the current dynamic entry. */
12111 (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
12112
12113 /* Assume that we're going to modify it and write it out. */
12114 swap_out_p = TRUE;
12115
12116 switch (dyn.d_tag)
12117 {
12118 case DT_RELSZ:
12119 /* Reduce DT_RELSZ to account for any relocations we
12120 decided not to make. This is for the n64 irix rld,
12121 which doesn't seem to apply any relocations if there
12122 are trailing null entries. */
0a44bf69 12123 s = mips_elf_rel_dyn_section (info, FALSE);
3133ddbf
DJ
12124 dyn.d_un.d_val = (s->reloc_count
12125 * (ABI_64_P (output_bfd)
12126 ? sizeof (Elf64_Mips_External_Rel)
12127 : sizeof (Elf32_External_Rel)));
bcfdf036
RS
12128 /* Adjust the section size too. Tools like the prelinker
12129 can reasonably expect the values to the same. */
db841b6f 12130 BFD_ASSERT (!bfd_is_abs_section (s->output_section));
bcfdf036
RS
12131 elf_section_data (s->output_section)->this_hdr.sh_size
12132 = dyn.d_un.d_val;
3133ddbf
DJ
12133 break;
12134
12135 default:
12136 swap_out_p = FALSE;
12137 break;
12138 }
12139
12140 if (swap_out_p)
12141 (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
12142 (dynobj, &dyn, b);
12143 }
12144 }
12145
b49e97c9 12146 {
b49e97c9
TS
12147 asection *s;
12148 Elf32_compact_rel cpt;
12149
b49e97c9
TS
12150 if (SGI_COMPAT (output_bfd))
12151 {
12152 /* Write .compact_rel section out. */
3d4d4302 12153 s = bfd_get_linker_section (dynobj, ".compact_rel");
b49e97c9
TS
12154 if (s != NULL)
12155 {
12156 cpt.id1 = 1;
12157 cpt.num = s->reloc_count;
12158 cpt.id2 = 2;
12159 cpt.offset = (s->output_section->filepos
12160 + sizeof (Elf32_External_compact_rel));
12161 cpt.reserved0 = 0;
12162 cpt.reserved1 = 0;
12163 bfd_elf32_swap_compact_rel_out (output_bfd, &cpt,
12164 ((Elf32_External_compact_rel *)
12165 s->contents));
12166
12167 /* Clean up a dummy stub function entry in .text. */
4e41d0d7 12168 if (htab->sstubs != NULL)
b49e97c9
TS
12169 {
12170 file_ptr dummy_offset;
12171
4e41d0d7
RS
12172 BFD_ASSERT (htab->sstubs->size >= htab->function_stub_size);
12173 dummy_offset = htab->sstubs->size - htab->function_stub_size;
12174 memset (htab->sstubs->contents + dummy_offset, 0,
5108fc1b 12175 htab->function_stub_size);
b49e97c9
TS
12176 }
12177 }
12178 }
12179
0a44bf69
RS
12180 /* The psABI says that the dynamic relocations must be sorted in
12181 increasing order of r_symndx. The VxWorks EABI doesn't require
12182 this, and because the code below handles REL rather than RELA
12183 relocations, using it for VxWorks would be outright harmful. */
12184 if (!htab->is_vxworks)
b49e97c9 12185 {
0a44bf69
RS
12186 s = mips_elf_rel_dyn_section (info, FALSE);
12187 if (s != NULL
12188 && s->size > (bfd_vma)2 * MIPS_ELF_REL_SIZE (output_bfd))
12189 {
12190 reldyn_sorting_bfd = output_bfd;
b49e97c9 12191
0a44bf69
RS
12192 if (ABI_64_P (output_bfd))
12193 qsort ((Elf64_External_Rel *) s->contents + 1,
12194 s->reloc_count - 1, sizeof (Elf64_Mips_External_Rel),
12195 sort_dynamic_relocs_64);
12196 else
12197 qsort ((Elf32_External_Rel *) s->contents + 1,
12198 s->reloc_count - 1, sizeof (Elf32_External_Rel),
12199 sort_dynamic_relocs);
12200 }
b49e97c9 12201 }
b49e97c9
TS
12202 }
12203
ce558b89 12204 if (htab->root.splt && htab->root.splt->size > 0)
0a44bf69 12205 {
861fb55a
DJ
12206 if (htab->is_vxworks)
12207 {
0e1862bb 12208 if (bfd_link_pic (info))
861fb55a
DJ
12209 mips_vxworks_finish_shared_plt (output_bfd, info);
12210 else
12211 mips_vxworks_finish_exec_plt (output_bfd, info);
12212 }
0a44bf69 12213 else
861fb55a 12214 {
0e1862bb 12215 BFD_ASSERT (!bfd_link_pic (info));
1bbce132
MR
12216 if (!mips_finish_exec_plt (output_bfd, info))
12217 return FALSE;
861fb55a 12218 }
0a44bf69 12219 }
b34976b6 12220 return TRUE;
b49e97c9
TS
12221}
12222
b49e97c9 12223
64543e1a
RS
12224/* Set ABFD's EF_MIPS_ARCH and EF_MIPS_MACH flags. */
12225
12226static void
9719ad41 12227mips_set_isa_flags (bfd *abfd)
b49e97c9 12228{
64543e1a 12229 flagword val;
b49e97c9
TS
12230
12231 switch (bfd_get_mach (abfd))
12232 {
12233 default:
c7c860d2
YS
12234 if (ABI_N32_P (abfd) || ABI_64_P (abfd))
12235 val = E_MIPS_ARCH_3;
12236 else
12237 val = E_MIPS_ARCH_1;
12238 break;
12239
b49e97c9
TS
12240 case bfd_mach_mips3000:
12241 val = E_MIPS_ARCH_1;
12242 break;
12243
12244 case bfd_mach_mips3900:
12245 val = E_MIPS_ARCH_1 | E_MIPS_MACH_3900;
12246 break;
12247
12248 case bfd_mach_mips6000:
12249 val = E_MIPS_ARCH_2;
12250 break;
12251
b417536f
MR
12252 case bfd_mach_mips4010:
12253 val = E_MIPS_ARCH_2 | E_MIPS_MACH_4010;
12254 break;
12255
b49e97c9
TS
12256 case bfd_mach_mips4000:
12257 case bfd_mach_mips4300:
12258 case bfd_mach_mips4400:
12259 case bfd_mach_mips4600:
12260 val = E_MIPS_ARCH_3;
12261 break;
12262
b49e97c9
TS
12263 case bfd_mach_mips4100:
12264 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4100;
12265 break;
12266
12267 case bfd_mach_mips4111:
12268 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4111;
12269 break;
12270
00707a0e
RS
12271 case bfd_mach_mips4120:
12272 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4120;
12273 break;
12274
b49e97c9
TS
12275 case bfd_mach_mips4650:
12276 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4650;
12277 break;
12278
00707a0e
RS
12279 case bfd_mach_mips5400:
12280 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5400;
12281 break;
12282
12283 case bfd_mach_mips5500:
12284 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5500;
12285 break;
12286
e407c74b
NC
12287 case bfd_mach_mips5900:
12288 val = E_MIPS_ARCH_3 | E_MIPS_MACH_5900;
12289 break;
12290
0d2e43ed
ILT
12291 case bfd_mach_mips9000:
12292 val = E_MIPS_ARCH_4 | E_MIPS_MACH_9000;
12293 break;
12294
b49e97c9 12295 case bfd_mach_mips5000:
5a7ea749 12296 case bfd_mach_mips7000:
b49e97c9
TS
12297 case bfd_mach_mips8000:
12298 case bfd_mach_mips10000:
12299 case bfd_mach_mips12000:
3aa3176b
TS
12300 case bfd_mach_mips14000:
12301 case bfd_mach_mips16000:
b49e97c9
TS
12302 val = E_MIPS_ARCH_4;
12303 break;
12304
12305 case bfd_mach_mips5:
12306 val = E_MIPS_ARCH_5;
12307 break;
12308
350cc38d
MS
12309 case bfd_mach_mips_loongson_2e:
12310 val = E_MIPS_ARCH_3 | E_MIPS_MACH_LS2E;
12311 break;
12312
12313 case bfd_mach_mips_loongson_2f:
12314 val = E_MIPS_ARCH_3 | E_MIPS_MACH_LS2F;
12315 break;
12316
b49e97c9
TS
12317 case bfd_mach_mips_sb1:
12318 val = E_MIPS_ARCH_64 | E_MIPS_MACH_SB1;
12319 break;
12320
ac8cb70f
CX
12321 case bfd_mach_mips_gs464:
12322 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_GS464;
d051516a
NC
12323 break;
12324
bd782c07
CX
12325 case bfd_mach_mips_gs464e:
12326 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_GS464E;
12327 break;
12328
9108bc33
CX
12329 case bfd_mach_mips_gs264e:
12330 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_GS264E;
12331 break;
12332
6f179bd0 12333 case bfd_mach_mips_octeon:
dd6a37e7 12334 case bfd_mach_mips_octeonp:
6f179bd0
AN
12335 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_OCTEON;
12336 break;
12337
2c629856
N
12338 case bfd_mach_mips_octeon3:
12339 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_OCTEON3;
12340 break;
12341
52b6b6b9
JM
12342 case bfd_mach_mips_xlr:
12343 val = E_MIPS_ARCH_64 | E_MIPS_MACH_XLR;
12344 break;
12345
432233b3
AP
12346 case bfd_mach_mips_octeon2:
12347 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_OCTEON2;
12348 break;
12349
b49e97c9
TS
12350 case bfd_mach_mipsisa32:
12351 val = E_MIPS_ARCH_32;
12352 break;
12353
12354 case bfd_mach_mipsisa64:
12355 val = E_MIPS_ARCH_64;
af7ee8bf
CD
12356 break;
12357
12358 case bfd_mach_mipsisa32r2:
ae52f483
AB
12359 case bfd_mach_mipsisa32r3:
12360 case bfd_mach_mipsisa32r5:
af7ee8bf
CD
12361 val = E_MIPS_ARCH_32R2;
12362 break;
5f74bc13 12363
38bf472a
MR
12364 case bfd_mach_mips_interaptiv_mr2:
12365 val = E_MIPS_ARCH_32R2 | E_MIPS_MACH_IAMR2;
12366 break;
12367
5f74bc13 12368 case bfd_mach_mipsisa64r2:
ae52f483
AB
12369 case bfd_mach_mipsisa64r3:
12370 case bfd_mach_mipsisa64r5:
5f74bc13
CD
12371 val = E_MIPS_ARCH_64R2;
12372 break;
7361da2c
AB
12373
12374 case bfd_mach_mipsisa32r6:
12375 val = E_MIPS_ARCH_32R6;
12376 break;
12377
12378 case bfd_mach_mipsisa64r6:
12379 val = E_MIPS_ARCH_64R6;
12380 break;
b49e97c9 12381 }
b49e97c9
TS
12382 elf_elfheader (abfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
12383 elf_elfheader (abfd)->e_flags |= val;
12384
64543e1a
RS
12385}
12386
12387
28dbcedc
AM
12388/* Whether to sort relocs output by ld -r or ld --emit-relocs, by r_offset.
12389 Don't do so for code sections. We want to keep ordering of HI16/LO16
12390 as is. On the other hand, elf-eh-frame.c processing requires .eh_frame
12391 relocs to be sorted. */
12392
12393bfd_boolean
12394_bfd_mips_elf_sort_relocs_p (asection *sec)
12395{
12396 return (sec->flags & SEC_CODE) == 0;
12397}
12398
12399
64543e1a
RS
12400/* The final processing done just before writing out a MIPS ELF object
12401 file. This gets the MIPS architecture right based on the machine
12402 number. This is used by both the 32-bit and the 64-bit ABI. */
12403
12404void
cc364be6 12405_bfd_mips_final_write_processing (bfd *abfd)
64543e1a
RS
12406{
12407 unsigned int i;
12408 Elf_Internal_Shdr **hdrpp;
12409 const char *name;
12410 asection *sec;
12411
12412 /* Keep the existing EF_MIPS_MACH and EF_MIPS_ARCH flags if the former
12413 is nonzero. This is for compatibility with old objects, which used
12414 a combination of a 32-bit EF_MIPS_ARCH and a 64-bit EF_MIPS_MACH. */
12415 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == 0)
12416 mips_set_isa_flags (abfd);
12417
b49e97c9
TS
12418 /* Set the sh_info field for .gptab sections and other appropriate
12419 info for each special section. */
12420 for (i = 1, hdrpp = elf_elfsections (abfd) + 1;
12421 i < elf_numsections (abfd);
12422 i++, hdrpp++)
12423 {
12424 switch ((*hdrpp)->sh_type)
12425 {
12426 case SHT_MIPS_MSYM:
12427 case SHT_MIPS_LIBLIST:
12428 sec = bfd_get_section_by_name (abfd, ".dynstr");
12429 if (sec != NULL)
12430 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12431 break;
12432
12433 case SHT_MIPS_GPTAB:
12434 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
fd361982 12435 name = bfd_section_name ((*hdrpp)->bfd_section);
b49e97c9 12436 BFD_ASSERT (name != NULL
0112cd26 12437 && CONST_STRNEQ (name, ".gptab."));
b49e97c9
TS
12438 sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
12439 BFD_ASSERT (sec != NULL);
12440 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
12441 break;
12442
12443 case SHT_MIPS_CONTENT:
12444 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
fd361982 12445 name = bfd_section_name ((*hdrpp)->bfd_section);
b49e97c9 12446 BFD_ASSERT (name != NULL
0112cd26 12447 && CONST_STRNEQ (name, ".MIPS.content"));
b49e97c9
TS
12448 sec = bfd_get_section_by_name (abfd,
12449 name + sizeof ".MIPS.content" - 1);
12450 BFD_ASSERT (sec != NULL);
12451 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12452 break;
12453
12454 case SHT_MIPS_SYMBOL_LIB:
12455 sec = bfd_get_section_by_name (abfd, ".dynsym");
12456 if (sec != NULL)
12457 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12458 sec = bfd_get_section_by_name (abfd, ".liblist");
12459 if (sec != NULL)
12460 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
12461 break;
12462
12463 case SHT_MIPS_EVENTS:
12464 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
fd361982 12465 name = bfd_section_name ((*hdrpp)->bfd_section);
b49e97c9 12466 BFD_ASSERT (name != NULL);
0112cd26 12467 if (CONST_STRNEQ (name, ".MIPS.events"))
b49e97c9
TS
12468 sec = bfd_get_section_by_name (abfd,
12469 name + sizeof ".MIPS.events" - 1);
12470 else
12471 {
0112cd26 12472 BFD_ASSERT (CONST_STRNEQ (name, ".MIPS.post_rel"));
b49e97c9
TS
12473 sec = bfd_get_section_by_name (abfd,
12474 (name
12475 + sizeof ".MIPS.post_rel" - 1));
12476 }
12477 BFD_ASSERT (sec != NULL);
12478 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
12479 break;
12480
f16a9783
MS
12481 case SHT_MIPS_XHASH:
12482 sec = bfd_get_section_by_name (abfd, ".dynsym");
12483 if (sec != NULL)
12484 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
b49e97c9
TS
12485 }
12486 }
12487}
06f44071 12488
cc364be6
AM
12489bfd_boolean
12490_bfd_mips_elf_final_write_processing (bfd *abfd)
06f44071 12491{
cc364be6
AM
12492 _bfd_mips_final_write_processing (abfd);
12493 return _bfd_elf_final_write_processing (abfd);
06f44071 12494}
b49e97c9 12495\f
8dc1a139 12496/* When creating an IRIX5 executable, we need REGINFO and RTPROC
b49e97c9
TS
12497 segments. */
12498
12499int
a6b96beb
AM
12500_bfd_mips_elf_additional_program_headers (bfd *abfd,
12501 struct bfd_link_info *info ATTRIBUTE_UNUSED)
b49e97c9
TS
12502{
12503 asection *s;
12504 int ret = 0;
12505
12506 /* See if we need a PT_MIPS_REGINFO segment. */
12507 s = bfd_get_section_by_name (abfd, ".reginfo");
12508 if (s && (s->flags & SEC_LOAD))
12509 ++ret;
12510
351cdf24
MF
12511 /* See if we need a PT_MIPS_ABIFLAGS segment. */
12512 if (bfd_get_section_by_name (abfd, ".MIPS.abiflags"))
12513 ++ret;
12514
b49e97c9
TS
12515 /* See if we need a PT_MIPS_OPTIONS segment. */
12516 if (IRIX_COMPAT (abfd) == ict_irix6
12517 && bfd_get_section_by_name (abfd,
12518 MIPS_ELF_OPTIONS_SECTION_NAME (abfd)))
12519 ++ret;
12520
12521 /* See if we need a PT_MIPS_RTPROC segment. */
12522 if (IRIX_COMPAT (abfd) == ict_irix5
12523 && bfd_get_section_by_name (abfd, ".dynamic")
12524 && bfd_get_section_by_name (abfd, ".mdebug"))
12525 ++ret;
12526
98c904a8
RS
12527 /* Allocate a PT_NULL header in dynamic objects. See
12528 _bfd_mips_elf_modify_segment_map for details. */
12529 if (!SGI_COMPAT (abfd)
12530 && bfd_get_section_by_name (abfd, ".dynamic"))
12531 ++ret;
12532
b49e97c9
TS
12533 return ret;
12534}
12535
8dc1a139 12536/* Modify the segment map for an IRIX5 executable. */
b49e97c9 12537
b34976b6 12538bfd_boolean
9719ad41 12539_bfd_mips_elf_modify_segment_map (bfd *abfd,
7c8b76cc 12540 struct bfd_link_info *info)
b49e97c9
TS
12541{
12542 asection *s;
12543 struct elf_segment_map *m, **pm;
986f0783 12544 size_t amt;
b49e97c9
TS
12545
12546 /* If there is a .reginfo section, we need a PT_MIPS_REGINFO
12547 segment. */
12548 s = bfd_get_section_by_name (abfd, ".reginfo");
12549 if (s != NULL && (s->flags & SEC_LOAD) != 0)
12550 {
12bd6957 12551 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
b49e97c9
TS
12552 if (m->p_type == PT_MIPS_REGINFO)
12553 break;
12554 if (m == NULL)
12555 {
12556 amt = sizeof *m;
9719ad41 12557 m = bfd_zalloc (abfd, amt);
b49e97c9 12558 if (m == NULL)
b34976b6 12559 return FALSE;
b49e97c9
TS
12560
12561 m->p_type = PT_MIPS_REGINFO;
12562 m->count = 1;
12563 m->sections[0] = s;
12564
12565 /* We want to put it after the PHDR and INTERP segments. */
12bd6957 12566 pm = &elf_seg_map (abfd);
b49e97c9
TS
12567 while (*pm != NULL
12568 && ((*pm)->p_type == PT_PHDR
12569 || (*pm)->p_type == PT_INTERP))
12570 pm = &(*pm)->next;
12571
12572 m->next = *pm;
12573 *pm = m;
12574 }
12575 }
12576
351cdf24
MF
12577 /* If there is a .MIPS.abiflags section, we need a PT_MIPS_ABIFLAGS
12578 segment. */
12579 s = bfd_get_section_by_name (abfd, ".MIPS.abiflags");
12580 if (s != NULL && (s->flags & SEC_LOAD) != 0)
12581 {
12582 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
12583 if (m->p_type == PT_MIPS_ABIFLAGS)
12584 break;
12585 if (m == NULL)
12586 {
12587 amt = sizeof *m;
12588 m = bfd_zalloc (abfd, amt);
12589 if (m == NULL)
12590 return FALSE;
12591
12592 m->p_type = PT_MIPS_ABIFLAGS;
12593 m->count = 1;
12594 m->sections[0] = s;
12595
12596 /* We want to put it after the PHDR and INTERP segments. */
12597 pm = &elf_seg_map (abfd);
12598 while (*pm != NULL
12599 && ((*pm)->p_type == PT_PHDR
12600 || (*pm)->p_type == PT_INTERP))
12601 pm = &(*pm)->next;
12602
12603 m->next = *pm;
12604 *pm = m;
12605 }
12606 }
12607
b49e97c9
TS
12608 /* For IRIX 6, we don't have .mdebug sections, nor does anything but
12609 .dynamic end up in PT_DYNAMIC. However, we do have to insert a
98a8deaf 12610 PT_MIPS_OPTIONS segment immediately following the program header
b49e97c9 12611 table. */
c1fd6598
AO
12612 if (NEWABI_P (abfd)
12613 /* On non-IRIX6 new abi, we'll have already created a segment
12614 for this section, so don't create another. I'm not sure this
12615 is not also the case for IRIX 6, but I can't test it right
12616 now. */
12617 && IRIX_COMPAT (abfd) == ict_irix6)
b49e97c9
TS
12618 {
12619 for (s = abfd->sections; s; s = s->next)
12620 if (elf_section_data (s)->this_hdr.sh_type == SHT_MIPS_OPTIONS)
12621 break;
12622
12623 if (s)
12624 {
12625 struct elf_segment_map *options_segment;
12626
12bd6957 12627 pm = &elf_seg_map (abfd);
98a8deaf
RS
12628 while (*pm != NULL
12629 && ((*pm)->p_type == PT_PHDR
12630 || (*pm)->p_type == PT_INTERP))
12631 pm = &(*pm)->next;
b49e97c9 12632
8ded5a0f
AM
12633 if (*pm == NULL || (*pm)->p_type != PT_MIPS_OPTIONS)
12634 {
12635 amt = sizeof (struct elf_segment_map);
12636 options_segment = bfd_zalloc (abfd, amt);
12637 options_segment->next = *pm;
12638 options_segment->p_type = PT_MIPS_OPTIONS;
12639 options_segment->p_flags = PF_R;
12640 options_segment->p_flags_valid = TRUE;
12641 options_segment->count = 1;
12642 options_segment->sections[0] = s;
12643 *pm = options_segment;
12644 }
b49e97c9
TS
12645 }
12646 }
12647 else
12648 {
12649 if (IRIX_COMPAT (abfd) == ict_irix5)
12650 {
12651 /* If there are .dynamic and .mdebug sections, we make a room
12652 for the RTPROC header. FIXME: Rewrite without section names. */
12653 if (bfd_get_section_by_name (abfd, ".interp") == NULL
12654 && bfd_get_section_by_name (abfd, ".dynamic") != NULL
12655 && bfd_get_section_by_name (abfd, ".mdebug") != NULL)
12656 {
12bd6957 12657 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
b49e97c9
TS
12658 if (m->p_type == PT_MIPS_RTPROC)
12659 break;
12660 if (m == NULL)
12661 {
12662 amt = sizeof *m;
9719ad41 12663 m = bfd_zalloc (abfd, amt);
b49e97c9 12664 if (m == NULL)
b34976b6 12665 return FALSE;
b49e97c9
TS
12666
12667 m->p_type = PT_MIPS_RTPROC;
12668
12669 s = bfd_get_section_by_name (abfd, ".rtproc");
12670 if (s == NULL)
12671 {
12672 m->count = 0;
12673 m->p_flags = 0;
12674 m->p_flags_valid = 1;
12675 }
12676 else
12677 {
12678 m->count = 1;
12679 m->sections[0] = s;
12680 }
12681
12682 /* We want to put it after the DYNAMIC segment. */
12bd6957 12683 pm = &elf_seg_map (abfd);
b49e97c9
TS
12684 while (*pm != NULL && (*pm)->p_type != PT_DYNAMIC)
12685 pm = &(*pm)->next;
12686 if (*pm != NULL)
12687 pm = &(*pm)->next;
12688
12689 m->next = *pm;
12690 *pm = m;
12691 }
12692 }
12693 }
8dc1a139 12694 /* On IRIX5, the PT_DYNAMIC segment includes the .dynamic,
b49e97c9
TS
12695 .dynstr, .dynsym, and .hash sections, and everything in
12696 between. */
12bd6957 12697 for (pm = &elf_seg_map (abfd); *pm != NULL;
b49e97c9
TS
12698 pm = &(*pm)->next)
12699 if ((*pm)->p_type == PT_DYNAMIC)
12700 break;
12701 m = *pm;
f6f62d6f
RS
12702 /* GNU/Linux binaries do not need the extended PT_DYNAMIC section.
12703 glibc's dynamic linker has traditionally derived the number of
12704 tags from the p_filesz field, and sometimes allocates stack
12705 arrays of that size. An overly-big PT_DYNAMIC segment can
12706 be actively harmful in such cases. Making PT_DYNAMIC contain
12707 other sections can also make life hard for the prelinker,
12708 which might move one of the other sections to a different
12709 PT_LOAD segment. */
12710 if (SGI_COMPAT (abfd)
12711 && m != NULL
12712 && m->count == 1
12713 && strcmp (m->sections[0]->name, ".dynamic") == 0)
b49e97c9
TS
12714 {
12715 static const char *sec_names[] =
12716 {
12717 ".dynamic", ".dynstr", ".dynsym", ".hash"
12718 };
12719 bfd_vma low, high;
12720 unsigned int i, c;
12721 struct elf_segment_map *n;
12722
792b4a53 12723 low = ~(bfd_vma) 0;
b49e97c9
TS
12724 high = 0;
12725 for (i = 0; i < sizeof sec_names / sizeof sec_names[0]; i++)
12726 {
12727 s = bfd_get_section_by_name (abfd, sec_names[i]);
12728 if (s != NULL && (s->flags & SEC_LOAD) != 0)
12729 {
12730 bfd_size_type sz;
12731
12732 if (low > s->vma)
12733 low = s->vma;
eea6121a 12734 sz = s->size;
b49e97c9
TS
12735 if (high < s->vma + sz)
12736 high = s->vma + sz;
12737 }
12738 }
12739
12740 c = 0;
12741 for (s = abfd->sections; s != NULL; s = s->next)
12742 if ((s->flags & SEC_LOAD) != 0
12743 && s->vma >= low
eea6121a 12744 && s->vma + s->size <= high)
b49e97c9
TS
12745 ++c;
12746
986f0783 12747 amt = sizeof *n - sizeof (asection *) + c * sizeof (asection *);
9719ad41 12748 n = bfd_zalloc (abfd, amt);
b49e97c9 12749 if (n == NULL)
b34976b6 12750 return FALSE;
b49e97c9
TS
12751 *n = *m;
12752 n->count = c;
12753
12754 i = 0;
12755 for (s = abfd->sections; s != NULL; s = s->next)
12756 {
12757 if ((s->flags & SEC_LOAD) != 0
12758 && s->vma >= low
eea6121a 12759 && s->vma + s->size <= high)
b49e97c9
TS
12760 {
12761 n->sections[i] = s;
12762 ++i;
12763 }
12764 }
12765
12766 *pm = n;
12767 }
12768 }
12769
98c904a8
RS
12770 /* Allocate a spare program header in dynamic objects so that tools
12771 like the prelinker can add an extra PT_LOAD entry.
12772
12773 If the prelinker needs to make room for a new PT_LOAD entry, its
12774 standard procedure is to move the first (read-only) sections into
12775 the new (writable) segment. However, the MIPS ABI requires
12776 .dynamic to be in a read-only segment, and the section will often
12777 start within sizeof (ElfNN_Phdr) bytes of the last program header.
12778
12779 Although the prelinker could in principle move .dynamic to a
12780 writable segment, it seems better to allocate a spare program
12781 header instead, and avoid the need to move any sections.
12782 There is a long tradition of allocating spare dynamic tags,
12783 so allocating a spare program header seems like a natural
7c8b76cc
JM
12784 extension.
12785
12786 If INFO is NULL, we may be copying an already prelinked binary
12787 with objcopy or strip, so do not add this header. */
12788 if (info != NULL
12789 && !SGI_COMPAT (abfd)
98c904a8
RS
12790 && bfd_get_section_by_name (abfd, ".dynamic"))
12791 {
12bd6957 12792 for (pm = &elf_seg_map (abfd); *pm != NULL; pm = &(*pm)->next)
98c904a8
RS
12793 if ((*pm)->p_type == PT_NULL)
12794 break;
12795 if (*pm == NULL)
12796 {
12797 m = bfd_zalloc (abfd, sizeof (*m));
12798 if (m == NULL)
12799 return FALSE;
12800
12801 m->p_type = PT_NULL;
12802 *pm = m;
12803 }
12804 }
12805
b34976b6 12806 return TRUE;
b49e97c9
TS
12807}
12808\f
12809/* Return the section that should be marked against GC for a given
12810 relocation. */
12811
12812asection *
9719ad41 12813_bfd_mips_elf_gc_mark_hook (asection *sec,
07adf181 12814 struct bfd_link_info *info,
9719ad41
RS
12815 Elf_Internal_Rela *rel,
12816 struct elf_link_hash_entry *h,
12817 Elf_Internal_Sym *sym)
b49e97c9
TS
12818{
12819 /* ??? Do mips16 stub sections need to be handled special? */
12820
12821 if (h != NULL)
07adf181
AM
12822 switch (ELF_R_TYPE (sec->owner, rel->r_info))
12823 {
12824 case R_MIPS_GNU_VTINHERIT:
12825 case R_MIPS_GNU_VTENTRY:
12826 return NULL;
12827 }
b49e97c9 12828
07adf181 12829 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
b49e97c9
TS
12830}
12831
351cdf24
MF
12832/* Prevent .MIPS.abiflags from being discarded with --gc-sections. */
12833
12834bfd_boolean
12835_bfd_mips_elf_gc_mark_extra_sections (struct bfd_link_info *info,
12836 elf_gc_mark_hook_fn gc_mark_hook)
12837{
12838 bfd *sub;
12839
12840 _bfd_elf_gc_mark_extra_sections (info, gc_mark_hook);
12841
12842 for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
12843 {
12844 asection *o;
12845
12846 if (! is_mips_elf (sub))
12847 continue;
12848
12849 for (o = sub->sections; o != NULL; o = o->next)
12850 if (!o->gc_mark
fd361982 12851 && MIPS_ELF_ABIFLAGS_SECTION_NAME_P (bfd_section_name (o)))
351cdf24
MF
12852 {
12853 if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
12854 return FALSE;
12855 }
12856 }
12857
12858 return TRUE;
12859}
b49e97c9
TS
12860\f
12861/* Copy data from a MIPS ELF indirect symbol to its direct symbol,
12862 hiding the old indirect symbol. Process additional relocation
12863 information. Also called for weakdefs, in which case we just let
12864 _bfd_elf_link_hash_copy_indirect copy the flags for us. */
12865
12866void
fcfa13d2 12867_bfd_mips_elf_copy_indirect_symbol (struct bfd_link_info *info,
9719ad41
RS
12868 struct elf_link_hash_entry *dir,
12869 struct elf_link_hash_entry *ind)
b49e97c9
TS
12870{
12871 struct mips_elf_link_hash_entry *dirmips, *indmips;
12872
fcfa13d2 12873 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
b49e97c9 12874
861fb55a
DJ
12875 dirmips = (struct mips_elf_link_hash_entry *) dir;
12876 indmips = (struct mips_elf_link_hash_entry *) ind;
12877 /* Any absolute non-dynamic relocations against an indirect or weak
12878 definition will be against the target symbol. */
12879 if (indmips->has_static_relocs)
12880 dirmips->has_static_relocs = TRUE;
12881
b49e97c9
TS
12882 if (ind->root.type != bfd_link_hash_indirect)
12883 return;
12884
b49e97c9
TS
12885 dirmips->possibly_dynamic_relocs += indmips->possibly_dynamic_relocs;
12886 if (indmips->readonly_reloc)
b34976b6 12887 dirmips->readonly_reloc = TRUE;
b49e97c9 12888 if (indmips->no_fn_stub)
b34976b6 12889 dirmips->no_fn_stub = TRUE;
61b0a4af
RS
12890 if (indmips->fn_stub)
12891 {
12892 dirmips->fn_stub = indmips->fn_stub;
12893 indmips->fn_stub = NULL;
12894 }
12895 if (indmips->need_fn_stub)
12896 {
12897 dirmips->need_fn_stub = TRUE;
12898 indmips->need_fn_stub = FALSE;
12899 }
12900 if (indmips->call_stub)
12901 {
12902 dirmips->call_stub = indmips->call_stub;
12903 indmips->call_stub = NULL;
12904 }
12905 if (indmips->call_fp_stub)
12906 {
12907 dirmips->call_fp_stub = indmips->call_fp_stub;
12908 indmips->call_fp_stub = NULL;
12909 }
634835ae
RS
12910 if (indmips->global_got_area < dirmips->global_got_area)
12911 dirmips->global_got_area = indmips->global_got_area;
12912 if (indmips->global_got_area < GGA_NONE)
12913 indmips->global_got_area = GGA_NONE;
861fb55a
DJ
12914 if (indmips->has_nonpic_branches)
12915 dirmips->has_nonpic_branches = TRUE;
b49e97c9 12916}
47275900
MR
12917
12918/* Take care of the special `__gnu_absolute_zero' symbol and ignore attempts
12919 to hide it. It has to remain global (it will also be protected) so as to
12920 be assigned a global GOT entry, which will then remain unchanged at load
12921 time. */
12922
12923void
12924_bfd_mips_elf_hide_symbol (struct bfd_link_info *info,
12925 struct elf_link_hash_entry *entry,
12926 bfd_boolean force_local)
12927{
12928 struct mips_elf_link_hash_table *htab;
12929
12930 htab = mips_elf_hash_table (info);
12931 BFD_ASSERT (htab != NULL);
12932 if (htab->use_absolute_zero
12933 && strcmp (entry->root.root.string, "__gnu_absolute_zero") == 0)
12934 return;
12935
12936 _bfd_elf_link_hash_hide_symbol (info, entry, force_local);
12937}
b49e97c9 12938\f
d01414a5
TS
12939#define PDR_SIZE 32
12940
b34976b6 12941bfd_boolean
9719ad41
RS
12942_bfd_mips_elf_discard_info (bfd *abfd, struct elf_reloc_cookie *cookie,
12943 struct bfd_link_info *info)
d01414a5
TS
12944{
12945 asection *o;
b34976b6 12946 bfd_boolean ret = FALSE;
d01414a5
TS
12947 unsigned char *tdata;
12948 size_t i, skip;
12949
12950 o = bfd_get_section_by_name (abfd, ".pdr");
12951 if (! o)
b34976b6 12952 return FALSE;
eea6121a 12953 if (o->size == 0)
b34976b6 12954 return FALSE;
eea6121a 12955 if (o->size % PDR_SIZE != 0)
b34976b6 12956 return FALSE;
d01414a5
TS
12957 if (o->output_section != NULL
12958 && bfd_is_abs_section (o->output_section))
b34976b6 12959 return FALSE;
d01414a5 12960
eea6121a 12961 tdata = bfd_zmalloc (o->size / PDR_SIZE);
d01414a5 12962 if (! tdata)
b34976b6 12963 return FALSE;
d01414a5 12964
9719ad41 12965 cookie->rels = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
45d6a902 12966 info->keep_memory);
d01414a5
TS
12967 if (!cookie->rels)
12968 {
12969 free (tdata);
b34976b6 12970 return FALSE;
d01414a5
TS
12971 }
12972
12973 cookie->rel = cookie->rels;
12974 cookie->relend = cookie->rels + o->reloc_count;
12975
eea6121a 12976 for (i = 0, skip = 0; i < o->size / PDR_SIZE; i ++)
d01414a5 12977 {
c152c796 12978 if (bfd_elf_reloc_symbol_deleted_p (i * PDR_SIZE, cookie))
d01414a5
TS
12979 {
12980 tdata[i] = 1;
12981 skip ++;
12982 }
12983 }
12984
12985 if (skip != 0)
12986 {
f0abc2a1 12987 mips_elf_section_data (o)->u.tdata = tdata;
e034b2cc
MR
12988 if (o->rawsize == 0)
12989 o->rawsize = o->size;
eea6121a 12990 o->size -= skip * PDR_SIZE;
b34976b6 12991 ret = TRUE;
d01414a5
TS
12992 }
12993 else
12994 free (tdata);
12995
12996 if (! info->keep_memory)
12997 free (cookie->rels);
12998
12999 return ret;
13000}
13001
b34976b6 13002bfd_boolean
9719ad41 13003_bfd_mips_elf_ignore_discarded_relocs (asection *sec)
53bfd6b4
MR
13004{
13005 if (strcmp (sec->name, ".pdr") == 0)
b34976b6
AM
13006 return TRUE;
13007 return FALSE;
53bfd6b4 13008}
d01414a5 13009
b34976b6 13010bfd_boolean
c7b8f16e
JB
13011_bfd_mips_elf_write_section (bfd *output_bfd,
13012 struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
07d6d2b8 13013 asection *sec, bfd_byte *contents)
d01414a5
TS
13014{
13015 bfd_byte *to, *from, *end;
13016 int i;
13017
13018 if (strcmp (sec->name, ".pdr") != 0)
b34976b6 13019 return FALSE;
d01414a5 13020
f0abc2a1 13021 if (mips_elf_section_data (sec)->u.tdata == NULL)
b34976b6 13022 return FALSE;
d01414a5
TS
13023
13024 to = contents;
eea6121a 13025 end = contents + sec->size;
d01414a5
TS
13026 for (from = contents, i = 0;
13027 from < end;
13028 from += PDR_SIZE, i++)
13029 {
f0abc2a1 13030 if ((mips_elf_section_data (sec)->u.tdata)[i] == 1)
d01414a5
TS
13031 continue;
13032 if (to != from)
13033 memcpy (to, from, PDR_SIZE);
13034 to += PDR_SIZE;
13035 }
13036 bfd_set_section_contents (output_bfd, sec->output_section, contents,
eea6121a 13037 sec->output_offset, sec->size);
b34976b6 13038 return TRUE;
d01414a5 13039}
53bfd6b4 13040\f
df58fc94
RS
13041/* microMIPS code retains local labels for linker relaxation. Omit them
13042 from output by default for clarity. */
13043
13044bfd_boolean
13045_bfd_mips_elf_is_target_special_symbol (bfd *abfd, asymbol *sym)
13046{
13047 return _bfd_elf_is_local_label_name (abfd, sym->name);
13048}
13049
b49e97c9
TS
13050/* MIPS ELF uses a special find_nearest_line routine in order the
13051 handle the ECOFF debugging information. */
13052
13053struct mips_elf_find_line
13054{
13055 struct ecoff_debug_info d;
13056 struct ecoff_find_line i;
13057};
13058
b34976b6 13059bfd_boolean
fb167eb2
AM
13060_bfd_mips_elf_find_nearest_line (bfd *abfd, asymbol **symbols,
13061 asection *section, bfd_vma offset,
9719ad41
RS
13062 const char **filename_ptr,
13063 const char **functionname_ptr,
fb167eb2
AM
13064 unsigned int *line_ptr,
13065 unsigned int *discriminator_ptr)
b49e97c9
TS
13066{
13067 asection *msec;
13068
fb167eb2 13069 if (_bfd_dwarf2_find_nearest_line (abfd, symbols, NULL, section, offset,
b49e97c9 13070 filename_ptr, functionname_ptr,
fb167eb2
AM
13071 line_ptr, discriminator_ptr,
13072 dwarf_debug_sections,
7f3bf384
AM
13073 &elf_tdata (abfd)->dwarf2_find_line_info)
13074 == 1)
e7679060 13075 return TRUE;
46d09186 13076
e7679060
AM
13077 if (_bfd_dwarf1_find_nearest_line (abfd, symbols, section, offset,
13078 filename_ptr, functionname_ptr,
13079 line_ptr))
13080 {
13081 if (!*functionname_ptr)
13082 _bfd_elf_find_function (abfd, symbols, section, offset,
13083 *filename_ptr ? NULL : filename_ptr,
13084 functionname_ptr);
46d09186
NC
13085 return TRUE;
13086 }
b49e97c9
TS
13087
13088 msec = bfd_get_section_by_name (abfd, ".mdebug");
13089 if (msec != NULL)
13090 {
13091 flagword origflags;
13092 struct mips_elf_find_line *fi;
13093 const struct ecoff_debug_swap * const swap =
13094 get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
13095
13096 /* If we are called during a link, mips_elf_final_link may have
13097 cleared the SEC_HAS_CONTENTS field. We force it back on here
13098 if appropriate (which it normally will be). */
13099 origflags = msec->flags;
13100 if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
13101 msec->flags |= SEC_HAS_CONTENTS;
13102
698600e4 13103 fi = mips_elf_tdata (abfd)->find_line_info;
b49e97c9
TS
13104 if (fi == NULL)
13105 {
13106 bfd_size_type external_fdr_size;
13107 char *fraw_src;
13108 char *fraw_end;
13109 struct fdr *fdr_ptr;
13110 bfd_size_type amt = sizeof (struct mips_elf_find_line);
13111
9719ad41 13112 fi = bfd_zalloc (abfd, amt);
b49e97c9
TS
13113 if (fi == NULL)
13114 {
13115 msec->flags = origflags;
b34976b6 13116 return FALSE;
b49e97c9
TS
13117 }
13118
13119 if (! _bfd_mips_elf_read_ecoff_info (abfd, msec, &fi->d))
13120 {
13121 msec->flags = origflags;
b34976b6 13122 return FALSE;
b49e97c9
TS
13123 }
13124
13125 /* Swap in the FDR information. */
13126 amt = fi->d.symbolic_header.ifdMax * sizeof (struct fdr);
9719ad41 13127 fi->d.fdr = bfd_alloc (abfd, amt);
b49e97c9
TS
13128 if (fi->d.fdr == NULL)
13129 {
13130 msec->flags = origflags;
b34976b6 13131 return FALSE;
b49e97c9
TS
13132 }
13133 external_fdr_size = swap->external_fdr_size;
13134 fdr_ptr = fi->d.fdr;
13135 fraw_src = (char *) fi->d.external_fdr;
13136 fraw_end = (fraw_src
13137 + fi->d.symbolic_header.ifdMax * external_fdr_size);
13138 for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
9719ad41 13139 (*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr);
b49e97c9 13140
698600e4 13141 mips_elf_tdata (abfd)->find_line_info = fi;
b49e97c9
TS
13142
13143 /* Note that we don't bother to ever free this information.
07d6d2b8
AM
13144 find_nearest_line is either called all the time, as in
13145 objdump -l, so the information should be saved, or it is
13146 rarely called, as in ld error messages, so the memory
13147 wasted is unimportant. Still, it would probably be a
13148 good idea for free_cached_info to throw it away. */
b49e97c9
TS
13149 }
13150
13151 if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
13152 &fi->i, filename_ptr, functionname_ptr,
13153 line_ptr))
13154 {
13155 msec->flags = origflags;
b34976b6 13156 return TRUE;
b49e97c9
TS
13157 }
13158
13159 msec->flags = origflags;
13160 }
13161
13162 /* Fall back on the generic ELF find_nearest_line routine. */
13163
fb167eb2 13164 return _bfd_elf_find_nearest_line (abfd, symbols, section, offset,
b49e97c9 13165 filename_ptr, functionname_ptr,
fb167eb2 13166 line_ptr, discriminator_ptr);
b49e97c9 13167}
4ab527b0
FF
13168
13169bfd_boolean
13170_bfd_mips_elf_find_inliner_info (bfd *abfd,
13171 const char **filename_ptr,
13172 const char **functionname_ptr,
13173 unsigned int *line_ptr)
13174{
13175 bfd_boolean found;
13176 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
13177 functionname_ptr, line_ptr,
13178 & elf_tdata (abfd)->dwarf2_find_line_info);
13179 return found;
13180}
13181
b49e97c9
TS
13182\f
13183/* When are writing out the .options or .MIPS.options section,
13184 remember the bytes we are writing out, so that we can install the
13185 GP value in the section_processing routine. */
13186
b34976b6 13187bfd_boolean
9719ad41
RS
13188_bfd_mips_elf_set_section_contents (bfd *abfd, sec_ptr section,
13189 const void *location,
13190 file_ptr offset, bfd_size_type count)
b49e97c9 13191{
cc2e31b9 13192 if (MIPS_ELF_OPTIONS_SECTION_NAME_P (section->name))
b49e97c9
TS
13193 {
13194 bfd_byte *c;
13195
13196 if (elf_section_data (section) == NULL)
13197 {
986f0783 13198 size_t amt = sizeof (struct bfd_elf_section_data);
9719ad41 13199 section->used_by_bfd = bfd_zalloc (abfd, amt);
b49e97c9 13200 if (elf_section_data (section) == NULL)
b34976b6 13201 return FALSE;
b49e97c9 13202 }
f0abc2a1 13203 c = mips_elf_section_data (section)->u.tdata;
b49e97c9
TS
13204 if (c == NULL)
13205 {
eea6121a 13206 c = bfd_zalloc (abfd, section->size);
b49e97c9 13207 if (c == NULL)
b34976b6 13208 return FALSE;
f0abc2a1 13209 mips_elf_section_data (section)->u.tdata = c;
b49e97c9
TS
13210 }
13211
9719ad41 13212 memcpy (c + offset, location, count);
b49e97c9
TS
13213 }
13214
13215 return _bfd_elf_set_section_contents (abfd, section, location, offset,
13216 count);
13217}
13218
13219/* This is almost identical to bfd_generic_get_... except that some
13220 MIPS relocations need to be handled specially. Sigh. */
13221
13222bfd_byte *
9719ad41
RS
13223_bfd_elf_mips_get_relocated_section_contents
13224 (bfd *abfd,
13225 struct bfd_link_info *link_info,
13226 struct bfd_link_order *link_order,
13227 bfd_byte *data,
13228 bfd_boolean relocatable,
13229 asymbol **symbols)
b49e97c9
TS
13230{
13231 /* Get enough memory to hold the stuff */
13232 bfd *input_bfd = link_order->u.indirect.section->owner;
13233 asection *input_section = link_order->u.indirect.section;
eea6121a 13234 bfd_size_type sz;
b49e97c9
TS
13235
13236 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
13237 arelent **reloc_vector = NULL;
13238 long reloc_count;
13239
13240 if (reloc_size < 0)
13241 goto error_return;
13242
9719ad41 13243 reloc_vector = bfd_malloc (reloc_size);
b49e97c9
TS
13244 if (reloc_vector == NULL && reloc_size != 0)
13245 goto error_return;
13246
13247 /* read in the section */
eea6121a
AM
13248 sz = input_section->rawsize ? input_section->rawsize : input_section->size;
13249 if (!bfd_get_section_contents (input_bfd, input_section, data, 0, sz))
b49e97c9
TS
13250 goto error_return;
13251
b49e97c9
TS
13252 reloc_count = bfd_canonicalize_reloc (input_bfd,
13253 input_section,
13254 reloc_vector,
13255 symbols);
13256 if (reloc_count < 0)
13257 goto error_return;
13258
13259 if (reloc_count > 0)
13260 {
13261 arelent **parent;
13262 /* for mips */
13263 int gp_found;
13264 bfd_vma gp = 0x12345678; /* initialize just to shut gcc up */
13265
13266 {
13267 struct bfd_hash_entry *h;
13268 struct bfd_link_hash_entry *lh;
13269 /* Skip all this stuff if we aren't mixing formats. */
13270 if (abfd && input_bfd
13271 && abfd->xvec == input_bfd->xvec)
13272 lh = 0;
13273 else
13274 {
b34976b6 13275 h = bfd_hash_lookup (&link_info->hash->table, "_gp", FALSE, FALSE);
b49e97c9
TS
13276 lh = (struct bfd_link_hash_entry *) h;
13277 }
13278 lookup:
13279 if (lh)
13280 {
13281 switch (lh->type)
13282 {
13283 case bfd_link_hash_undefined:
13284 case bfd_link_hash_undefweak:
13285 case bfd_link_hash_common:
13286 gp_found = 0;
13287 break;
13288 case bfd_link_hash_defined:
13289 case bfd_link_hash_defweak:
13290 gp_found = 1;
13291 gp = lh->u.def.value;
13292 break;
13293 case bfd_link_hash_indirect:
13294 case bfd_link_hash_warning:
13295 lh = lh->u.i.link;
13296 /* @@FIXME ignoring warning for now */
13297 goto lookup;
13298 case bfd_link_hash_new:
13299 default:
13300 abort ();
13301 }
13302 }
13303 else
13304 gp_found = 0;
13305 }
13306 /* end mips */
9719ad41 13307 for (parent = reloc_vector; *parent != NULL; parent++)
b49e97c9 13308 {
9719ad41 13309 char *error_message = NULL;
b49e97c9
TS
13310 bfd_reloc_status_type r;
13311
13312 /* Specific to MIPS: Deal with relocation types that require
13313 knowing the gp of the output bfd. */
13314 asymbol *sym = *(*parent)->sym_ptr_ptr;
b49e97c9 13315
8236346f
EC
13316 /* If we've managed to find the gp and have a special
13317 function for the relocation then go ahead, else default
13318 to the generic handling. */
13319 if (gp_found
13320 && (*parent)->howto->special_function
13321 == _bfd_mips_elf32_gprel16_reloc)
13322 r = _bfd_mips_elf_gprel16_with_gp (input_bfd, sym, *parent,
13323 input_section, relocatable,
13324 data, gp);
13325 else
86324f90 13326 r = bfd_perform_relocation (input_bfd, *parent, data,
8236346f
EC
13327 input_section,
13328 relocatable ? abfd : NULL,
13329 &error_message);
b49e97c9 13330
1049f94e 13331 if (relocatable)
b49e97c9
TS
13332 {
13333 asection *os = input_section->output_section;
13334
13335 /* A partial link, so keep the relocs */
13336 os->orelocation[os->reloc_count] = *parent;
13337 os->reloc_count++;
13338 }
13339
13340 if (r != bfd_reloc_ok)
13341 {
13342 switch (r)
13343 {
13344 case bfd_reloc_undefined:
1a72702b
AM
13345 (*link_info->callbacks->undefined_symbol)
13346 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13347 input_bfd, input_section, (*parent)->address, TRUE);
b49e97c9
TS
13348 break;
13349 case bfd_reloc_dangerous:
9719ad41 13350 BFD_ASSERT (error_message != NULL);
1a72702b
AM
13351 (*link_info->callbacks->reloc_dangerous)
13352 (link_info, error_message,
13353 input_bfd, input_section, (*parent)->address);
b49e97c9
TS
13354 break;
13355 case bfd_reloc_overflow:
1a72702b
AM
13356 (*link_info->callbacks->reloc_overflow)
13357 (link_info, NULL,
13358 bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
13359 (*parent)->howto->name, (*parent)->addend,
13360 input_bfd, input_section, (*parent)->address);
b49e97c9
TS
13361 break;
13362 case bfd_reloc_outofrange:
13363 default:
13364 abort ();
13365 break;
13366 }
13367
13368 }
13369 }
13370 }
c9594989 13371 free (reloc_vector);
b49e97c9
TS
13372 return data;
13373
dc1e8a47 13374 error_return:
c9594989 13375 free (reloc_vector);
b49e97c9
TS
13376 return NULL;
13377}
13378\f
df58fc94
RS
13379static bfd_boolean
13380mips_elf_relax_delete_bytes (bfd *abfd,
13381 asection *sec, bfd_vma addr, int count)
13382{
13383 Elf_Internal_Shdr *symtab_hdr;
13384 unsigned int sec_shndx;
13385 bfd_byte *contents;
13386 Elf_Internal_Rela *irel, *irelend;
13387 Elf_Internal_Sym *isym;
13388 Elf_Internal_Sym *isymend;
13389 struct elf_link_hash_entry **sym_hashes;
13390 struct elf_link_hash_entry **end_hashes;
13391 struct elf_link_hash_entry **start_hashes;
13392 unsigned int symcount;
13393
13394 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
13395 contents = elf_section_data (sec)->this_hdr.contents;
13396
13397 irel = elf_section_data (sec)->relocs;
13398 irelend = irel + sec->reloc_count;
13399
13400 /* Actually delete the bytes. */
13401 memmove (contents + addr, contents + addr + count,
13402 (size_t) (sec->size - addr - count));
13403 sec->size -= count;
13404
13405 /* Adjust all the relocs. */
13406 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
13407 {
13408 /* Get the new reloc address. */
13409 if (irel->r_offset > addr)
13410 irel->r_offset -= count;
13411 }
13412
13413 BFD_ASSERT (addr % 2 == 0);
13414 BFD_ASSERT (count % 2 == 0);
13415
13416 /* Adjust the local symbols defined in this section. */
13417 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
13418 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
13419 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
2309ddf2 13420 if (isym->st_shndx == sec_shndx && isym->st_value > addr)
df58fc94
RS
13421 isym->st_value -= count;
13422
13423 /* Now adjust the global symbols defined in this section. */
13424 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
13425 - symtab_hdr->sh_info);
13426 sym_hashes = start_hashes = elf_sym_hashes (abfd);
13427 end_hashes = sym_hashes + symcount;
13428
13429 for (; sym_hashes < end_hashes; sym_hashes++)
13430 {
13431 struct elf_link_hash_entry *sym_hash = *sym_hashes;
13432
13433 if ((sym_hash->root.type == bfd_link_hash_defined
13434 || sym_hash->root.type == bfd_link_hash_defweak)
13435 && sym_hash->root.u.def.section == sec)
13436 {
2309ddf2 13437 bfd_vma value = sym_hash->root.u.def.value;
df58fc94 13438
df58fc94
RS
13439 if (ELF_ST_IS_MICROMIPS (sym_hash->other))
13440 value &= MINUS_TWO;
13441 if (value > addr)
13442 sym_hash->root.u.def.value -= count;
13443 }
13444 }
13445
13446 return TRUE;
13447}
13448
13449
13450/* Opcodes needed for microMIPS relaxation as found in
13451 opcodes/micromips-opc.c. */
13452
13453struct opcode_descriptor {
13454 unsigned long match;
13455 unsigned long mask;
13456};
13457
13458/* The $ra register aka $31. */
13459
13460#define RA 31
13461
13462/* 32-bit instruction format register fields. */
13463
13464#define OP32_SREG(opcode) (((opcode) >> 16) & 0x1f)
13465#define OP32_TREG(opcode) (((opcode) >> 21) & 0x1f)
13466
13467/* Check if a 5-bit register index can be abbreviated to 3 bits. */
13468
13469#define OP16_VALID_REG(r) \
13470 ((2 <= (r) && (r) <= 7) || (16 <= (r) && (r) <= 17))
13471
13472
13473/* 32-bit and 16-bit branches. */
13474
13475static const struct opcode_descriptor b_insns_32[] = {
13476 { /* "b", "p", */ 0x40400000, 0xffff0000 }, /* bgez 0 */
13477 { /* "b", "p", */ 0x94000000, 0xffff0000 }, /* beq 0, 0 */
13478 { 0, 0 } /* End marker for find_match(). */
13479};
13480
13481static const struct opcode_descriptor bc_insn_32 =
13482 { /* "bc(1|2)(ft)", "N,p", */ 0x42800000, 0xfec30000 };
13483
13484static const struct opcode_descriptor bz_insn_32 =
13485 { /* "b(g|l)(e|t)z", "s,p", */ 0x40000000, 0xff200000 };
13486
13487static const struct opcode_descriptor bzal_insn_32 =
13488 { /* "b(ge|lt)zal", "s,p", */ 0x40200000, 0xffa00000 };
13489
13490static const struct opcode_descriptor beq_insn_32 =
13491 { /* "b(eq|ne)", "s,t,p", */ 0x94000000, 0xdc000000 };
13492
13493static const struct opcode_descriptor b_insn_16 =
13494 { /* "b", "mD", */ 0xcc00, 0xfc00 };
13495
13496static const struct opcode_descriptor bz_insn_16 =
c088dedf 13497 { /* "b(eq|ne)z", "md,mE", */ 0x8c00, 0xdc00 };
df58fc94
RS
13498
13499
13500/* 32-bit and 16-bit branch EQ and NE zero. */
13501
13502/* NOTE: All opcode tables have BEQ/BNE in the same order: first the
13503 eq and second the ne. This convention is used when replacing a
13504 32-bit BEQ/BNE with the 16-bit version. */
13505
13506#define BZC32_REG_FIELD(r) (((r) & 0x1f) << 16)
13507
13508static const struct opcode_descriptor bz_rs_insns_32[] = {
13509 { /* "beqz", "s,p", */ 0x94000000, 0xffe00000 },
13510 { /* "bnez", "s,p", */ 0xb4000000, 0xffe00000 },
13511 { 0, 0 } /* End marker for find_match(). */
13512};
13513
13514static const struct opcode_descriptor bz_rt_insns_32[] = {
13515 { /* "beqz", "t,p", */ 0x94000000, 0xfc01f000 },
13516 { /* "bnez", "t,p", */ 0xb4000000, 0xfc01f000 },
13517 { 0, 0 } /* End marker for find_match(). */
13518};
13519
13520static const struct opcode_descriptor bzc_insns_32[] = {
13521 { /* "beqzc", "s,p", */ 0x40e00000, 0xffe00000 },
13522 { /* "bnezc", "s,p", */ 0x40a00000, 0xffe00000 },
13523 { 0, 0 } /* End marker for find_match(). */
13524};
13525
13526static const struct opcode_descriptor bz_insns_16[] = {
13527 { /* "beqz", "md,mE", */ 0x8c00, 0xfc00 },
13528 { /* "bnez", "md,mE", */ 0xac00, 0xfc00 },
13529 { 0, 0 } /* End marker for find_match(). */
13530};
13531
13532/* Switch between a 5-bit register index and its 3-bit shorthand. */
13533
e67f83e5 13534#define BZ16_REG(opcode) ((((((opcode) >> 7) & 7) + 0x1e) & 0xf) + 2)
eb6b0cf4 13535#define BZ16_REG_FIELD(r) (((r) & 7) << 7)
df58fc94
RS
13536
13537
13538/* 32-bit instructions with a delay slot. */
13539
13540static const struct opcode_descriptor jal_insn_32_bd16 =
13541 { /* "jals", "a", */ 0x74000000, 0xfc000000 };
13542
13543static const struct opcode_descriptor jal_insn_32_bd32 =
13544 { /* "jal", "a", */ 0xf4000000, 0xfc000000 };
13545
13546static const struct opcode_descriptor jal_x_insn_32_bd32 =
13547 { /* "jal[x]", "a", */ 0xf0000000, 0xf8000000 };
13548
13549static const struct opcode_descriptor j_insn_32 =
13550 { /* "j", "a", */ 0xd4000000, 0xfc000000 };
13551
13552static const struct opcode_descriptor jalr_insn_32 =
13553 { /* "jalr[.hb]", "t,s", */ 0x00000f3c, 0xfc00efff };
13554
13555/* This table can be compacted, because no opcode replacement is made. */
13556
13557static const struct opcode_descriptor ds_insns_32_bd16[] = {
13558 { /* "jals", "a", */ 0x74000000, 0xfc000000 },
13559
13560 { /* "jalrs[.hb]", "t,s", */ 0x00004f3c, 0xfc00efff },
13561 { /* "b(ge|lt)zals", "s,p", */ 0x42200000, 0xffa00000 },
13562
13563 { /* "b(g|l)(e|t)z", "s,p", */ 0x40000000, 0xff200000 },
13564 { /* "b(eq|ne)", "s,t,p", */ 0x94000000, 0xdc000000 },
13565 { /* "j", "a", */ 0xd4000000, 0xfc000000 },
13566 { 0, 0 } /* End marker for find_match(). */
13567};
13568
13569/* This table can be compacted, because no opcode replacement is made. */
13570
13571static const struct opcode_descriptor ds_insns_32_bd32[] = {
13572 { /* "jal[x]", "a", */ 0xf0000000, 0xf8000000 },
13573
13574 { /* "jalr[.hb]", "t,s", */ 0x00000f3c, 0xfc00efff },
13575 { /* "b(ge|lt)zal", "s,p", */ 0x40200000, 0xffa00000 },
13576 { 0, 0 } /* End marker for find_match(). */
13577};
13578
13579
13580/* 16-bit instructions with a delay slot. */
13581
13582static const struct opcode_descriptor jalr_insn_16_bd16 =
13583 { /* "jalrs", "my,mj", */ 0x45e0, 0xffe0 };
13584
13585static const struct opcode_descriptor jalr_insn_16_bd32 =
13586 { /* "jalr", "my,mj", */ 0x45c0, 0xffe0 };
13587
13588static const struct opcode_descriptor jr_insn_16 =
13589 { /* "jr", "mj", */ 0x4580, 0xffe0 };
13590
13591#define JR16_REG(opcode) ((opcode) & 0x1f)
13592
13593/* This table can be compacted, because no opcode replacement is made. */
13594
13595static const struct opcode_descriptor ds_insns_16_bd16[] = {
13596 { /* "jalrs", "my,mj", */ 0x45e0, 0xffe0 },
13597
13598 { /* "b", "mD", */ 0xcc00, 0xfc00 },
13599 { /* "b(eq|ne)z", "md,mE", */ 0x8c00, 0xdc00 },
13600 { /* "jr", "mj", */ 0x4580, 0xffe0 },
13601 { 0, 0 } /* End marker for find_match(). */
13602};
13603
13604
13605/* LUI instruction. */
13606
13607static const struct opcode_descriptor lui_insn =
13608 { /* "lui", "s,u", */ 0x41a00000, 0xffe00000 };
13609
13610
13611/* ADDIU instruction. */
13612
13613static const struct opcode_descriptor addiu_insn =
13614 { /* "addiu", "t,r,j", */ 0x30000000, 0xfc000000 };
13615
13616static const struct opcode_descriptor addiupc_insn =
13617 { /* "addiu", "mb,$pc,mQ", */ 0x78000000, 0xfc000000 };
13618
13619#define ADDIUPC_REG_FIELD(r) \
13620 (((2 <= (r) && (r) <= 7) ? (r) : ((r) - 16)) << 23)
13621
13622
13623/* Relaxable instructions in a JAL delay slot: MOVE. */
13624
13625/* The 16-bit move has rd in 9:5 and rs in 4:0. The 32-bit moves
13626 (ADDU, OR) have rd in 15:11 and rs in 10:16. */
13627#define MOVE32_RD(opcode) (((opcode) >> 11) & 0x1f)
13628#define MOVE32_RS(opcode) (((opcode) >> 16) & 0x1f)
13629
13630#define MOVE16_RD_FIELD(r) (((r) & 0x1f) << 5)
13631#define MOVE16_RS_FIELD(r) (((r) & 0x1f) )
13632
13633static const struct opcode_descriptor move_insns_32[] = {
df58fc94 13634 { /* "move", "d,s", */ 0x00000290, 0xffe007ff }, /* or d,s,$0 */
40fc1451 13635 { /* "move", "d,s", */ 0x00000150, 0xffe007ff }, /* addu d,s,$0 */
df58fc94
RS
13636 { 0, 0 } /* End marker for find_match(). */
13637};
13638
13639static const struct opcode_descriptor move_insn_16 =
13640 { /* "move", "mp,mj", */ 0x0c00, 0xfc00 };
13641
13642
13643/* NOP instructions. */
13644
13645static const struct opcode_descriptor nop_insn_32 =
13646 { /* "nop", "", */ 0x00000000, 0xffffffff };
13647
13648static const struct opcode_descriptor nop_insn_16 =
13649 { /* "nop", "", */ 0x0c00, 0xffff };
13650
13651
13652/* Instruction match support. */
13653
13654#define MATCH(opcode, insn) ((opcode & insn.mask) == insn.match)
13655
13656static int
13657find_match (unsigned long opcode, const struct opcode_descriptor insn[])
13658{
13659 unsigned long indx;
13660
13661 for (indx = 0; insn[indx].mask != 0; indx++)
13662 if (MATCH (opcode, insn[indx]))
13663 return indx;
13664
13665 return -1;
13666}
13667
13668
13669/* Branch and delay slot decoding support. */
13670
13671/* If PTR points to what *might* be a 16-bit branch or jump, then
13672 return the minimum length of its delay slot, otherwise return 0.
13673 Non-zero results are not definitive as we might be checking against
13674 the second half of another instruction. */
13675
13676static int
13677check_br16_dslot (bfd *abfd, bfd_byte *ptr)
13678{
13679 unsigned long opcode;
13680 int bdsize;
13681
13682 opcode = bfd_get_16 (abfd, ptr);
13683 if (MATCH (opcode, jalr_insn_16_bd32) != 0)
13684 /* 16-bit branch/jump with a 32-bit delay slot. */
13685 bdsize = 4;
13686 else if (MATCH (opcode, jalr_insn_16_bd16) != 0
13687 || find_match (opcode, ds_insns_16_bd16) >= 0)
13688 /* 16-bit branch/jump with a 16-bit delay slot. */
13689 bdsize = 2;
13690 else
13691 /* No delay slot. */
13692 bdsize = 0;
13693
13694 return bdsize;
13695}
13696
13697/* If PTR points to what *might* be a 32-bit branch or jump, then
13698 return the minimum length of its delay slot, otherwise return 0.
13699 Non-zero results are not definitive as we might be checking against
13700 the second half of another instruction. */
13701
13702static int
13703check_br32_dslot (bfd *abfd, bfd_byte *ptr)
13704{
13705 unsigned long opcode;
13706 int bdsize;
13707
d21911ea 13708 opcode = bfd_get_micromips_32 (abfd, ptr);
df58fc94
RS
13709 if (find_match (opcode, ds_insns_32_bd32) >= 0)
13710 /* 32-bit branch/jump with a 32-bit delay slot. */
13711 bdsize = 4;
13712 else if (find_match (opcode, ds_insns_32_bd16) >= 0)
13713 /* 32-bit branch/jump with a 16-bit delay slot. */
13714 bdsize = 2;
13715 else
13716 /* No delay slot. */
13717 bdsize = 0;
13718
13719 return bdsize;
13720}
13721
13722/* If PTR points to a 16-bit branch or jump with a 32-bit delay slot
13723 that doesn't fiddle with REG, then return TRUE, otherwise FALSE. */
13724
13725static bfd_boolean
13726check_br16 (bfd *abfd, bfd_byte *ptr, unsigned long reg)
13727{
13728 unsigned long opcode;
13729
13730 opcode = bfd_get_16 (abfd, ptr);
13731 if (MATCH (opcode, b_insn_16)
13732 /* B16 */
13733 || (MATCH (opcode, jr_insn_16) && reg != JR16_REG (opcode))
13734 /* JR16 */
13735 || (MATCH (opcode, bz_insn_16) && reg != BZ16_REG (opcode))
13736 /* BEQZ16, BNEZ16 */
13737 || (MATCH (opcode, jalr_insn_16_bd32)
13738 /* JALR16 */
13739 && reg != JR16_REG (opcode) && reg != RA))
13740 return TRUE;
13741
13742 return FALSE;
13743}
13744
13745/* If PTR points to a 32-bit branch or jump that doesn't fiddle with REG,
13746 then return TRUE, otherwise FALSE. */
13747
f41e5fcc 13748static bfd_boolean
df58fc94
RS
13749check_br32 (bfd *abfd, bfd_byte *ptr, unsigned long reg)
13750{
13751 unsigned long opcode;
13752
d21911ea 13753 opcode = bfd_get_micromips_32 (abfd, ptr);
df58fc94
RS
13754 if (MATCH (opcode, j_insn_32)
13755 /* J */
13756 || MATCH (opcode, bc_insn_32)
13757 /* BC1F, BC1T, BC2F, BC2T */
13758 || (MATCH (opcode, jal_x_insn_32_bd32) && reg != RA)
13759 /* JAL, JALX */
13760 || (MATCH (opcode, bz_insn_32) && reg != OP32_SREG (opcode))
13761 /* BGEZ, BGTZ, BLEZ, BLTZ */
13762 || (MATCH (opcode, bzal_insn_32)
13763 /* BGEZAL, BLTZAL */
13764 && reg != OP32_SREG (opcode) && reg != RA)
13765 || ((MATCH (opcode, jalr_insn_32) || MATCH (opcode, beq_insn_32))
13766 /* JALR, JALR.HB, BEQ, BNE */
13767 && reg != OP32_SREG (opcode) && reg != OP32_TREG (opcode)))
13768 return TRUE;
13769
13770 return FALSE;
13771}
13772
80cab405
MR
13773/* If the instruction encoding at PTR and relocations [INTERNAL_RELOCS,
13774 IRELEND) at OFFSET indicate that there must be a compact branch there,
13775 then return TRUE, otherwise FALSE. */
df58fc94
RS
13776
13777static bfd_boolean
80cab405
MR
13778check_relocated_bzc (bfd *abfd, const bfd_byte *ptr, bfd_vma offset,
13779 const Elf_Internal_Rela *internal_relocs,
13780 const Elf_Internal_Rela *irelend)
df58fc94 13781{
80cab405
MR
13782 const Elf_Internal_Rela *irel;
13783 unsigned long opcode;
13784
d21911ea 13785 opcode = bfd_get_micromips_32 (abfd, ptr);
80cab405
MR
13786 if (find_match (opcode, bzc_insns_32) < 0)
13787 return FALSE;
df58fc94
RS
13788
13789 for (irel = internal_relocs; irel < irelend; irel++)
80cab405
MR
13790 if (irel->r_offset == offset
13791 && ELF32_R_TYPE (irel->r_info) == R_MICROMIPS_PC16_S1)
13792 return TRUE;
13793
df58fc94
RS
13794 return FALSE;
13795}
80cab405
MR
13796
13797/* Bitsize checking. */
13798#define IS_BITSIZE(val, N) \
13799 (((((val) & ((1ULL << (N)) - 1)) ^ (1ULL << ((N) - 1))) \
13800 - (1ULL << ((N) - 1))) == (val))
13801
df58fc94
RS
13802\f
13803bfd_boolean
13804_bfd_mips_elf_relax_section (bfd *abfd, asection *sec,
13805 struct bfd_link_info *link_info,
13806 bfd_boolean *again)
13807{
833794fc 13808 bfd_boolean insn32 = mips_elf_hash_table (link_info)->insn32;
df58fc94
RS
13809 Elf_Internal_Shdr *symtab_hdr;
13810 Elf_Internal_Rela *internal_relocs;
13811 Elf_Internal_Rela *irel, *irelend;
13812 bfd_byte *contents = NULL;
13813 Elf_Internal_Sym *isymbuf = NULL;
13814
13815 /* Assume nothing changes. */
13816 *again = FALSE;
13817
13818 /* We don't have to do anything for a relocatable link, if
13819 this section does not have relocs, or if this is not a
13820 code section. */
13821
0e1862bb 13822 if (bfd_link_relocatable (link_info)
df58fc94
RS
13823 || (sec->flags & SEC_RELOC) == 0
13824 || sec->reloc_count == 0
13825 || (sec->flags & SEC_CODE) == 0)
13826 return TRUE;
13827
13828 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
13829
13830 /* Get a copy of the native relocations. */
13831 internal_relocs = (_bfd_elf_link_read_relocs
2c3fc389 13832 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
df58fc94
RS
13833 link_info->keep_memory));
13834 if (internal_relocs == NULL)
13835 goto error_return;
13836
13837 /* Walk through them looking for relaxing opportunities. */
13838 irelend = internal_relocs + sec->reloc_count;
13839 for (irel = internal_relocs; irel < irelend; irel++)
13840 {
13841 unsigned long r_symndx = ELF32_R_SYM (irel->r_info);
13842 unsigned int r_type = ELF32_R_TYPE (irel->r_info);
13843 bfd_boolean target_is_micromips_code_p;
13844 unsigned long opcode;
13845 bfd_vma symval;
13846 bfd_vma pcrval;
2309ddf2 13847 bfd_byte *ptr;
df58fc94
RS
13848 int fndopc;
13849
13850 /* The number of bytes to delete for relaxation and from where
07d6d2b8 13851 to delete these bytes starting at irel->r_offset. */
df58fc94
RS
13852 int delcnt = 0;
13853 int deloff = 0;
13854
13855 /* If this isn't something that can be relaxed, then ignore
07d6d2b8 13856 this reloc. */
df58fc94
RS
13857 if (r_type != R_MICROMIPS_HI16
13858 && r_type != R_MICROMIPS_PC16_S1
2309ddf2 13859 && r_type != R_MICROMIPS_26_S1)
df58fc94
RS
13860 continue;
13861
13862 /* Get the section contents if we haven't done so already. */
13863 if (contents == NULL)
13864 {
13865 /* Get cached copy if it exists. */
13866 if (elf_section_data (sec)->this_hdr.contents != NULL)
13867 contents = elf_section_data (sec)->this_hdr.contents;
13868 /* Go get them off disk. */
13869 else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
13870 goto error_return;
13871 }
2309ddf2 13872 ptr = contents + irel->r_offset;
df58fc94
RS
13873
13874 /* Read this BFD's local symbols if we haven't done so already. */
13875 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
13876 {
13877 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
13878 if (isymbuf == NULL)
13879 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
13880 symtab_hdr->sh_info, 0,
13881 NULL, NULL, NULL);
13882 if (isymbuf == NULL)
13883 goto error_return;
13884 }
13885
13886 /* Get the value of the symbol referred to by the reloc. */
13887 if (r_symndx < symtab_hdr->sh_info)
13888 {
13889 /* A local symbol. */
13890 Elf_Internal_Sym *isym;
13891 asection *sym_sec;
13892
13893 isym = isymbuf + r_symndx;
13894 if (isym->st_shndx == SHN_UNDEF)
13895 sym_sec = bfd_und_section_ptr;
13896 else if (isym->st_shndx == SHN_ABS)
13897 sym_sec = bfd_abs_section_ptr;
13898 else if (isym->st_shndx == SHN_COMMON)
13899 sym_sec = bfd_com_section_ptr;
13900 else
13901 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
13902 symval = (isym->st_value
13903 + sym_sec->output_section->vma
13904 + sym_sec->output_offset);
13905 target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (isym->st_other);
13906 }
13907 else
13908 {
13909 unsigned long indx;
13910 struct elf_link_hash_entry *h;
13911
13912 /* An external symbol. */
13913 indx = r_symndx - symtab_hdr->sh_info;
13914 h = elf_sym_hashes (abfd)[indx];
13915 BFD_ASSERT (h != NULL);
13916
13917 if (h->root.type != bfd_link_hash_defined
13918 && h->root.type != bfd_link_hash_defweak)
13919 /* This appears to be a reference to an undefined
13920 symbol. Just ignore it -- it will be caught by the
13921 regular reloc processing. */
13922 continue;
13923
13924 symval = (h->root.u.def.value
13925 + h->root.u.def.section->output_section->vma
13926 + h->root.u.def.section->output_offset);
13927 target_is_micromips_code_p = (!h->needs_plt
13928 && ELF_ST_IS_MICROMIPS (h->other));
13929 }
13930
13931
13932 /* For simplicity of coding, we are going to modify the
07d6d2b8
AM
13933 section contents, the section relocs, and the BFD symbol
13934 table. We must tell the rest of the code not to free up this
13935 information. It would be possible to instead create a table
13936 of changes which have to be made, as is done in coff-mips.c;
13937 that would be more work, but would require less memory when
13938 the linker is run. */
df58fc94
RS
13939
13940 /* Only 32-bit instructions relaxed. */
13941 if (irel->r_offset + 4 > sec->size)
13942 continue;
13943
d21911ea 13944 opcode = bfd_get_micromips_32 (abfd, ptr);
df58fc94
RS
13945
13946 /* This is the pc-relative distance from the instruction the
07d6d2b8 13947 relocation is applied to, to the symbol referred. */
df58fc94
RS
13948 pcrval = (symval
13949 - (sec->output_section->vma + sec->output_offset)
13950 - irel->r_offset);
13951
13952 /* R_MICROMIPS_HI16 / LUI relaxation to nil, performing relaxation
07d6d2b8
AM
13953 of corresponding R_MICROMIPS_LO16 to R_MICROMIPS_HI0_LO16 or
13954 R_MICROMIPS_PC23_S2. The R_MICROMIPS_PC23_S2 condition is
df58fc94 13955
07d6d2b8 13956 (symval % 4 == 0 && IS_BITSIZE (pcrval, 25))
df58fc94 13957
07d6d2b8
AM
13958 where pcrval has first to be adjusted to apply against the LO16
13959 location (we make the adjustment later on, when we have figured
13960 out the offset). */
df58fc94
RS
13961 if (r_type == R_MICROMIPS_HI16 && MATCH (opcode, lui_insn))
13962 {
80cab405 13963 bfd_boolean bzc = FALSE;
df58fc94
RS
13964 unsigned long nextopc;
13965 unsigned long reg;
13966 bfd_vma offset;
13967
13968 /* Give up if the previous reloc was a HI16 against this symbol
13969 too. */
13970 if (irel > internal_relocs
13971 && ELF32_R_TYPE (irel[-1].r_info) == R_MICROMIPS_HI16
13972 && ELF32_R_SYM (irel[-1].r_info) == r_symndx)
13973 continue;
13974
13975 /* Or if the next reloc is not a LO16 against this symbol. */
13976 if (irel + 1 >= irelend
13977 || ELF32_R_TYPE (irel[1].r_info) != R_MICROMIPS_LO16
13978 || ELF32_R_SYM (irel[1].r_info) != r_symndx)
13979 continue;
13980
13981 /* Or if the second next reloc is a LO16 against this symbol too. */
13982 if (irel + 2 >= irelend
13983 && ELF32_R_TYPE (irel[2].r_info) == R_MICROMIPS_LO16
13984 && ELF32_R_SYM (irel[2].r_info) == r_symndx)
13985 continue;
13986
80cab405
MR
13987 /* See if the LUI instruction *might* be in a branch delay slot.
13988 We check whether what looks like a 16-bit branch or jump is
13989 actually an immediate argument to a compact branch, and let
13990 it through if so. */
df58fc94 13991 if (irel->r_offset >= 2
2309ddf2 13992 && check_br16_dslot (abfd, ptr - 2)
df58fc94 13993 && !(irel->r_offset >= 4
80cab405
MR
13994 && (bzc = check_relocated_bzc (abfd,
13995 ptr - 4, irel->r_offset - 4,
13996 internal_relocs, irelend))))
df58fc94
RS
13997 continue;
13998 if (irel->r_offset >= 4
80cab405 13999 && !bzc
2309ddf2 14000 && check_br32_dslot (abfd, ptr - 4))
df58fc94
RS
14001 continue;
14002
14003 reg = OP32_SREG (opcode);
14004
14005 /* We only relax adjacent instructions or ones separated with
14006 a branch or jump that has a delay slot. The branch or jump
14007 must not fiddle with the register used to hold the address.
14008 Subtract 4 for the LUI itself. */
14009 offset = irel[1].r_offset - irel[0].r_offset;
14010 switch (offset - 4)
14011 {
14012 case 0:
14013 break;
14014 case 2:
2309ddf2 14015 if (check_br16 (abfd, ptr + 4, reg))
df58fc94
RS
14016 break;
14017 continue;
14018 case 4:
2309ddf2 14019 if (check_br32 (abfd, ptr + 4, reg))
df58fc94
RS
14020 break;
14021 continue;
14022 default:
14023 continue;
14024 }
14025
d21911ea 14026 nextopc = bfd_get_micromips_32 (abfd, contents + irel[1].r_offset);
df58fc94
RS
14027
14028 /* Give up unless the same register is used with both
14029 relocations. */
14030 if (OP32_SREG (nextopc) != reg)
14031 continue;
14032
14033 /* Now adjust pcrval, subtracting the offset to the LO16 reloc
14034 and rounding up to take masking of the two LSBs into account. */
14035 pcrval = ((pcrval - offset + 3) | 3) ^ 3;
14036
14037 /* R_MICROMIPS_LO16 relaxation to R_MICROMIPS_HI0_LO16. */
14038 if (IS_BITSIZE (symval, 16))
14039 {
14040 /* Fix the relocation's type. */
14041 irel[1].r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_HI0_LO16);
14042
14043 /* Instructions using R_MICROMIPS_LO16 have the base or
07d6d2b8
AM
14044 source register in bits 20:16. This register becomes $0
14045 (zero) as the result of the R_MICROMIPS_HI16 being 0. */
df58fc94
RS
14046 nextopc &= ~0x001f0000;
14047 bfd_put_16 (abfd, (nextopc >> 16) & 0xffff,
14048 contents + irel[1].r_offset);
14049 }
14050
14051 /* R_MICROMIPS_LO16 / ADDIU relaxation to R_MICROMIPS_PC23_S2.
14052 We add 4 to take LUI deletion into account while checking
14053 the PC-relative distance. */
14054 else if (symval % 4 == 0
14055 && IS_BITSIZE (pcrval + 4, 25)
14056 && MATCH (nextopc, addiu_insn)
14057 && OP32_TREG (nextopc) == OP32_SREG (nextopc)
14058 && OP16_VALID_REG (OP32_TREG (nextopc)))
14059 {
14060 /* Fix the relocation's type. */
14061 irel[1].r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC23_S2);
14062
14063 /* Replace ADDIU with the ADDIUPC version. */
14064 nextopc = (addiupc_insn.match
14065 | ADDIUPC_REG_FIELD (OP32_TREG (nextopc)));
14066
d21911ea
MR
14067 bfd_put_micromips_32 (abfd, nextopc,
14068 contents + irel[1].r_offset);
df58fc94
RS
14069 }
14070
14071 /* Can't do anything, give up, sigh... */
14072 else
14073 continue;
14074
14075 /* Fix the relocation's type. */
14076 irel->r_info = ELF32_R_INFO (r_symndx, R_MIPS_NONE);
14077
14078 /* Delete the LUI instruction: 4 bytes at irel->r_offset. */
14079 delcnt = 4;
14080 deloff = 0;
14081 }
14082
14083 /* Compact branch relaxation -- due to the multitude of macros
07d6d2b8
AM
14084 employed by the compiler/assembler, compact branches are not
14085 always generated. Obviously, this can/will be fixed elsewhere,
14086 but there is no drawback in double checking it here. */
df58fc94
RS
14087 else if (r_type == R_MICROMIPS_PC16_S1
14088 && irel->r_offset + 5 < sec->size
14089 && ((fndopc = find_match (opcode, bz_rs_insns_32)) >= 0
14090 || (fndopc = find_match (opcode, bz_rt_insns_32)) >= 0)
833794fc
MR
14091 && ((!insn32
14092 && (delcnt = MATCH (bfd_get_16 (abfd, ptr + 4),
14093 nop_insn_16) ? 2 : 0))
14094 || (irel->r_offset + 7 < sec->size
14095 && (delcnt = MATCH (bfd_get_micromips_32 (abfd,
14096 ptr + 4),
14097 nop_insn_32) ? 4 : 0))))
df58fc94
RS
14098 {
14099 unsigned long reg;
14100
14101 reg = OP32_SREG (opcode) ? OP32_SREG (opcode) : OP32_TREG (opcode);
14102
14103 /* Replace BEQZ/BNEZ with the compact version. */
14104 opcode = (bzc_insns_32[fndopc].match
14105 | BZC32_REG_FIELD (reg)
14106 | (opcode & 0xffff)); /* Addend value. */
14107
d21911ea 14108 bfd_put_micromips_32 (abfd, opcode, ptr);
df58fc94 14109
833794fc
MR
14110 /* Delete the delay slot NOP: two or four bytes from
14111 irel->offset + 4; delcnt has already been set above. */
df58fc94
RS
14112 deloff = 4;
14113 }
14114
14115 /* R_MICROMIPS_PC16_S1 relaxation to R_MICROMIPS_PC10_S1. We need
07d6d2b8 14116 to check the distance from the next instruction, so subtract 2. */
833794fc
MR
14117 else if (!insn32
14118 && r_type == R_MICROMIPS_PC16_S1
df58fc94
RS
14119 && IS_BITSIZE (pcrval - 2, 11)
14120 && find_match (opcode, b_insns_32) >= 0)
14121 {
14122 /* Fix the relocation's type. */
14123 irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC10_S1);
14124
a8685210 14125 /* Replace the 32-bit opcode with a 16-bit opcode. */
df58fc94
RS
14126 bfd_put_16 (abfd,
14127 (b_insn_16.match
14128 | (opcode & 0x3ff)), /* Addend value. */
2309ddf2 14129 ptr);
df58fc94
RS
14130
14131 /* Delete 2 bytes from irel->r_offset + 2. */
14132 delcnt = 2;
14133 deloff = 2;
14134 }
14135
14136 /* R_MICROMIPS_PC16_S1 relaxation to R_MICROMIPS_PC7_S1. We need
07d6d2b8 14137 to check the distance from the next instruction, so subtract 2. */
833794fc
MR
14138 else if (!insn32
14139 && r_type == R_MICROMIPS_PC16_S1
df58fc94
RS
14140 && IS_BITSIZE (pcrval - 2, 8)
14141 && (((fndopc = find_match (opcode, bz_rs_insns_32)) >= 0
14142 && OP16_VALID_REG (OP32_SREG (opcode)))
14143 || ((fndopc = find_match (opcode, bz_rt_insns_32)) >= 0
14144 && OP16_VALID_REG (OP32_TREG (opcode)))))
14145 {
14146 unsigned long reg;
14147
14148 reg = OP32_SREG (opcode) ? OP32_SREG (opcode) : OP32_TREG (opcode);
14149
14150 /* Fix the relocation's type. */
14151 irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC7_S1);
14152
a8685210 14153 /* Replace the 32-bit opcode with a 16-bit opcode. */
df58fc94
RS
14154 bfd_put_16 (abfd,
14155 (bz_insns_16[fndopc].match
14156 | BZ16_REG_FIELD (reg)
14157 | (opcode & 0x7f)), /* Addend value. */
2309ddf2 14158 ptr);
df58fc94
RS
14159
14160 /* Delete 2 bytes from irel->r_offset + 2. */
14161 delcnt = 2;
14162 deloff = 2;
14163 }
14164
14165 /* R_MICROMIPS_26_S1 -- JAL to JALS relaxation for microMIPS targets. */
833794fc
MR
14166 else if (!insn32
14167 && r_type == R_MICROMIPS_26_S1
df58fc94
RS
14168 && target_is_micromips_code_p
14169 && irel->r_offset + 7 < sec->size
14170 && MATCH (opcode, jal_insn_32_bd32))
14171 {
14172 unsigned long n32opc;
14173 bfd_boolean relaxed = FALSE;
14174
d21911ea 14175 n32opc = bfd_get_micromips_32 (abfd, ptr + 4);
df58fc94
RS
14176
14177 if (MATCH (n32opc, nop_insn_32))
14178 {
14179 /* Replace delay slot 32-bit NOP with a 16-bit NOP. */
2309ddf2 14180 bfd_put_16 (abfd, nop_insn_16.match, ptr + 4);
df58fc94
RS
14181
14182 relaxed = TRUE;
14183 }
14184 else if (find_match (n32opc, move_insns_32) >= 0)
14185 {
14186 /* Replace delay slot 32-bit MOVE with 16-bit MOVE. */
14187 bfd_put_16 (abfd,
14188 (move_insn_16.match
14189 | MOVE16_RD_FIELD (MOVE32_RD (n32opc))
14190 | MOVE16_RS_FIELD (MOVE32_RS (n32opc))),
2309ddf2 14191 ptr + 4);
df58fc94
RS
14192
14193 relaxed = TRUE;
14194 }
14195 /* Other 32-bit instructions relaxable to 16-bit
14196 instructions will be handled here later. */
14197
14198 if (relaxed)
14199 {
14200 /* JAL with 32-bit delay slot that is changed to a JALS
07d6d2b8 14201 with 16-bit delay slot. */
d21911ea 14202 bfd_put_micromips_32 (abfd, jal_insn_32_bd16.match, ptr);
df58fc94
RS
14203
14204 /* Delete 2 bytes from irel->r_offset + 6. */
14205 delcnt = 2;
14206 deloff = 6;
14207 }
14208 }
14209
14210 if (delcnt != 0)
14211 {
14212 /* Note that we've changed the relocs, section contents, etc. */
14213 elf_section_data (sec)->relocs = internal_relocs;
14214 elf_section_data (sec)->this_hdr.contents = contents;
14215 symtab_hdr->contents = (unsigned char *) isymbuf;
14216
14217 /* Delete bytes depending on the delcnt and deloff. */
14218 if (!mips_elf_relax_delete_bytes (abfd, sec,
14219 irel->r_offset + deloff, delcnt))
14220 goto error_return;
14221
14222 /* That will change things, so we should relax again.
14223 Note that this is not required, and it may be slow. */
14224 *again = TRUE;
14225 }
14226 }
14227
14228 if (isymbuf != NULL
14229 && symtab_hdr->contents != (unsigned char *) isymbuf)
14230 {
14231 if (! link_info->keep_memory)
14232 free (isymbuf);
14233 else
14234 {
14235 /* Cache the symbols for elf_link_input_bfd. */
14236 symtab_hdr->contents = (unsigned char *) isymbuf;
14237 }
14238 }
14239
14240 if (contents != NULL
14241 && elf_section_data (sec)->this_hdr.contents != contents)
14242 {
14243 if (! link_info->keep_memory)
14244 free (contents);
14245 else
14246 {
14247 /* Cache the section contents for elf_link_input_bfd. */
14248 elf_section_data (sec)->this_hdr.contents = contents;
14249 }
14250 }
14251
c9594989 14252 if (elf_section_data (sec)->relocs != internal_relocs)
df58fc94
RS
14253 free (internal_relocs);
14254
14255 return TRUE;
14256
14257 error_return:
c9594989 14258 if (symtab_hdr->contents != (unsigned char *) isymbuf)
df58fc94 14259 free (isymbuf);
c9594989 14260 if (elf_section_data (sec)->this_hdr.contents != contents)
df58fc94 14261 free (contents);
c9594989 14262 if (elf_section_data (sec)->relocs != internal_relocs)
df58fc94
RS
14263 free (internal_relocs);
14264
14265 return FALSE;
14266}
14267\f
b49e97c9
TS
14268/* Create a MIPS ELF linker hash table. */
14269
14270struct bfd_link_hash_table *
9719ad41 14271_bfd_mips_elf_link_hash_table_create (bfd *abfd)
b49e97c9
TS
14272{
14273 struct mips_elf_link_hash_table *ret;
986f0783 14274 size_t amt = sizeof (struct mips_elf_link_hash_table);
b49e97c9 14275
7bf52ea2 14276 ret = bfd_zmalloc (amt);
9719ad41 14277 if (ret == NULL)
b49e97c9
TS
14278 return NULL;
14279
66eb6687
AM
14280 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
14281 mips_elf_link_hash_newfunc,
4dfe6ac6
NC
14282 sizeof (struct mips_elf_link_hash_entry),
14283 MIPS_ELF_DATA))
b49e97c9 14284 {
e2d34d7d 14285 free (ret);
b49e97c9
TS
14286 return NULL;
14287 }
1bbce132
MR
14288 ret->root.init_plt_refcount.plist = NULL;
14289 ret->root.init_plt_offset.plist = NULL;
b49e97c9 14290
b49e97c9
TS
14291 return &ret->root.root;
14292}
0a44bf69
RS
14293
14294/* Likewise, but indicate that the target is VxWorks. */
14295
14296struct bfd_link_hash_table *
14297_bfd_mips_vxworks_link_hash_table_create (bfd *abfd)
14298{
14299 struct bfd_link_hash_table *ret;
14300
14301 ret = _bfd_mips_elf_link_hash_table_create (abfd);
14302 if (ret)
14303 {
14304 struct mips_elf_link_hash_table *htab;
14305
14306 htab = (struct mips_elf_link_hash_table *) ret;
861fb55a
DJ
14307 htab->use_plts_and_copy_relocs = TRUE;
14308 htab->is_vxworks = TRUE;
0a44bf69
RS
14309 }
14310 return ret;
14311}
861fb55a
DJ
14312
14313/* A function that the linker calls if we are allowed to use PLTs
14314 and copy relocs. */
14315
14316void
14317_bfd_mips_elf_use_plts_and_copy_relocs (struct bfd_link_info *info)
14318{
14319 mips_elf_hash_table (info)->use_plts_and_copy_relocs = TRUE;
14320}
833794fc
MR
14321
14322/* A function that the linker calls to select between all or only
8b10b0b3 14323 32-bit microMIPS instructions, and between making or ignoring
47275900
MR
14324 branch relocation checks for invalid transitions between ISA modes.
14325 Also record whether we have been configured for a GNU target. */
833794fc
MR
14326
14327void
8b10b0b3 14328_bfd_mips_elf_linker_flags (struct bfd_link_info *info, bfd_boolean insn32,
47275900
MR
14329 bfd_boolean ignore_branch_isa,
14330 bfd_boolean gnu_target)
833794fc 14331{
8b10b0b3
MR
14332 mips_elf_hash_table (info)->insn32 = insn32;
14333 mips_elf_hash_table (info)->ignore_branch_isa = ignore_branch_isa;
47275900 14334 mips_elf_hash_table (info)->gnu_target = gnu_target;
833794fc 14335}
3734320d
MF
14336
14337/* A function that the linker calls to enable use of compact branches in
14338 linker generated code for MIPSR6. */
14339
14340void
14341_bfd_mips_elf_compact_branches (struct bfd_link_info *info, bfd_boolean on)
14342{
14343 mips_elf_hash_table (info)->compact_branches = on;
14344}
14345
b49e97c9 14346\f
c97c330b
MF
14347/* Structure for saying that BFD machine EXTENSION extends BASE. */
14348
14349struct mips_mach_extension
14350{
14351 unsigned long extension, base;
14352};
14353
14354
14355/* An array describing how BFD machines relate to one another. The entries
14356 are ordered topologically with MIPS I extensions listed last. */
14357
14358static const struct mips_mach_extension mips_mach_extensions[] =
14359{
14360 /* MIPS64r2 extensions. */
14361 { bfd_mach_mips_octeon3, bfd_mach_mips_octeon2 },
14362 { bfd_mach_mips_octeon2, bfd_mach_mips_octeonp },
14363 { bfd_mach_mips_octeonp, bfd_mach_mips_octeon },
14364 { bfd_mach_mips_octeon, bfd_mach_mipsisa64r2 },
9108bc33 14365 { bfd_mach_mips_gs264e, bfd_mach_mips_gs464e },
bd782c07 14366 { bfd_mach_mips_gs464e, bfd_mach_mips_gs464 },
ac8cb70f 14367 { bfd_mach_mips_gs464, bfd_mach_mipsisa64r2 },
c97c330b
MF
14368
14369 /* MIPS64 extensions. */
14370 { bfd_mach_mipsisa64r2, bfd_mach_mipsisa64 },
14371 { bfd_mach_mips_sb1, bfd_mach_mipsisa64 },
14372 { bfd_mach_mips_xlr, bfd_mach_mipsisa64 },
14373
14374 /* MIPS V extensions. */
14375 { bfd_mach_mipsisa64, bfd_mach_mips5 },
14376
14377 /* R10000 extensions. */
14378 { bfd_mach_mips12000, bfd_mach_mips10000 },
14379 { bfd_mach_mips14000, bfd_mach_mips10000 },
14380 { bfd_mach_mips16000, bfd_mach_mips10000 },
14381
14382 /* R5000 extensions. Note: the vr5500 ISA is an extension of the core
14383 vr5400 ISA, but doesn't include the multimedia stuff. It seems
14384 better to allow vr5400 and vr5500 code to be merged anyway, since
14385 many libraries will just use the core ISA. Perhaps we could add
14386 some sort of ASE flag if this ever proves a problem. */
14387 { bfd_mach_mips5500, bfd_mach_mips5400 },
14388 { bfd_mach_mips5400, bfd_mach_mips5000 },
14389
14390 /* MIPS IV extensions. */
14391 { bfd_mach_mips5, bfd_mach_mips8000 },
14392 { bfd_mach_mips10000, bfd_mach_mips8000 },
14393 { bfd_mach_mips5000, bfd_mach_mips8000 },
14394 { bfd_mach_mips7000, bfd_mach_mips8000 },
14395 { bfd_mach_mips9000, bfd_mach_mips8000 },
14396
14397 /* VR4100 extensions. */
14398 { bfd_mach_mips4120, bfd_mach_mips4100 },
14399 { bfd_mach_mips4111, bfd_mach_mips4100 },
14400
14401 /* MIPS III extensions. */
14402 { bfd_mach_mips_loongson_2e, bfd_mach_mips4000 },
14403 { bfd_mach_mips_loongson_2f, bfd_mach_mips4000 },
14404 { bfd_mach_mips8000, bfd_mach_mips4000 },
14405 { bfd_mach_mips4650, bfd_mach_mips4000 },
14406 { bfd_mach_mips4600, bfd_mach_mips4000 },
14407 { bfd_mach_mips4400, bfd_mach_mips4000 },
14408 { bfd_mach_mips4300, bfd_mach_mips4000 },
14409 { bfd_mach_mips4100, bfd_mach_mips4000 },
c97c330b
MF
14410 { bfd_mach_mips5900, bfd_mach_mips4000 },
14411
38bf472a
MR
14412 /* MIPS32r3 extensions. */
14413 { bfd_mach_mips_interaptiv_mr2, bfd_mach_mipsisa32r3 },
14414
14415 /* MIPS32r2 extensions. */
14416 { bfd_mach_mipsisa32r3, bfd_mach_mipsisa32r2 },
14417
c97c330b
MF
14418 /* MIPS32 extensions. */
14419 { bfd_mach_mipsisa32r2, bfd_mach_mipsisa32 },
14420
14421 /* MIPS II extensions. */
14422 { bfd_mach_mips4000, bfd_mach_mips6000 },
14423 { bfd_mach_mipsisa32, bfd_mach_mips6000 },
b417536f 14424 { bfd_mach_mips4010, bfd_mach_mips6000 },
c97c330b
MF
14425
14426 /* MIPS I extensions. */
14427 { bfd_mach_mips6000, bfd_mach_mips3000 },
14428 { bfd_mach_mips3900, bfd_mach_mips3000 }
14429};
14430
14431/* Return true if bfd machine EXTENSION is an extension of machine BASE. */
14432
14433static bfd_boolean
14434mips_mach_extends_p (unsigned long base, unsigned long extension)
14435{
14436 size_t i;
14437
14438 if (extension == base)
14439 return TRUE;
14440
14441 if (base == bfd_mach_mipsisa32
14442 && mips_mach_extends_p (bfd_mach_mipsisa64, extension))
14443 return TRUE;
14444
14445 if (base == bfd_mach_mipsisa32r2
14446 && mips_mach_extends_p (bfd_mach_mipsisa64r2, extension))
14447 return TRUE;
14448
14449 for (i = 0; i < ARRAY_SIZE (mips_mach_extensions); i++)
14450 if (extension == mips_mach_extensions[i].extension)
14451 {
14452 extension = mips_mach_extensions[i].base;
14453 if (extension == base)
14454 return TRUE;
14455 }
14456
14457 return FALSE;
14458}
14459
14460/* Return the BFD mach for each .MIPS.abiflags ISA Extension. */
14461
14462static unsigned long
14463bfd_mips_isa_ext_mach (unsigned int isa_ext)
14464{
14465 switch (isa_ext)
14466 {
07d6d2b8
AM
14467 case AFL_EXT_3900: return bfd_mach_mips3900;
14468 case AFL_EXT_4010: return bfd_mach_mips4010;
14469 case AFL_EXT_4100: return bfd_mach_mips4100;
14470 case AFL_EXT_4111: return bfd_mach_mips4111;
14471 case AFL_EXT_4120: return bfd_mach_mips4120;
14472 case AFL_EXT_4650: return bfd_mach_mips4650;
14473 case AFL_EXT_5400: return bfd_mach_mips5400;
14474 case AFL_EXT_5500: return bfd_mach_mips5500;
14475 case AFL_EXT_5900: return bfd_mach_mips5900;
14476 case AFL_EXT_10000: return bfd_mach_mips10000;
c97c330b
MF
14477 case AFL_EXT_LOONGSON_2E: return bfd_mach_mips_loongson_2e;
14478 case AFL_EXT_LOONGSON_2F: return bfd_mach_mips_loongson_2f;
07d6d2b8 14479 case AFL_EXT_SB1: return bfd_mach_mips_sb1;
c97c330b
MF
14480 case AFL_EXT_OCTEON: return bfd_mach_mips_octeon;
14481 case AFL_EXT_OCTEONP: return bfd_mach_mips_octeonp;
14482 case AFL_EXT_OCTEON2: return bfd_mach_mips_octeon2;
07d6d2b8
AM
14483 case AFL_EXT_XLR: return bfd_mach_mips_xlr;
14484 default: return bfd_mach_mips3000;
c97c330b
MF
14485 }
14486}
14487
351cdf24
MF
14488/* Return the .MIPS.abiflags value representing each ISA Extension. */
14489
14490unsigned int
14491bfd_mips_isa_ext (bfd *abfd)
14492{
14493 switch (bfd_get_mach (abfd))
14494 {
07d6d2b8
AM
14495 case bfd_mach_mips3900: return AFL_EXT_3900;
14496 case bfd_mach_mips4010: return AFL_EXT_4010;
14497 case bfd_mach_mips4100: return AFL_EXT_4100;
14498 case bfd_mach_mips4111: return AFL_EXT_4111;
14499 case bfd_mach_mips4120: return AFL_EXT_4120;
14500 case bfd_mach_mips4650: return AFL_EXT_4650;
14501 case bfd_mach_mips5400: return AFL_EXT_5400;
14502 case bfd_mach_mips5500: return AFL_EXT_5500;
14503 case bfd_mach_mips5900: return AFL_EXT_5900;
14504 case bfd_mach_mips10000: return AFL_EXT_10000;
c97c330b
MF
14505 case bfd_mach_mips_loongson_2e: return AFL_EXT_LOONGSON_2E;
14506 case bfd_mach_mips_loongson_2f: return AFL_EXT_LOONGSON_2F;
07d6d2b8
AM
14507 case bfd_mach_mips_sb1: return AFL_EXT_SB1;
14508 case bfd_mach_mips_octeon: return AFL_EXT_OCTEON;
14509 case bfd_mach_mips_octeonp: return AFL_EXT_OCTEONP;
14510 case bfd_mach_mips_octeon3: return AFL_EXT_OCTEON3;
14511 case bfd_mach_mips_octeon2: return AFL_EXT_OCTEON2;
14512 case bfd_mach_mips_xlr: return AFL_EXT_XLR;
38bf472a
MR
14513 case bfd_mach_mips_interaptiv_mr2:
14514 return AFL_EXT_INTERAPTIV_MR2;
07d6d2b8 14515 default: return 0;
c97c330b
MF
14516 }
14517}
14518
14519/* Encode ISA level and revision as a single value. */
14520#define LEVEL_REV(LEV,REV) ((LEV) << 3 | (REV))
14521
14522/* Decode a single value into level and revision. */
14523#define ISA_LEVEL(LEVREV) ((LEVREV) >> 3)
14524#define ISA_REV(LEVREV) ((LEVREV) & 0x7)
351cdf24
MF
14525
14526/* Update the isa_level, isa_rev, isa_ext fields of abiflags. */
14527
14528static void
14529update_mips_abiflags_isa (bfd *abfd, Elf_Internal_ABIFlags_v0 *abiflags)
14530{
c97c330b 14531 int new_isa = 0;
351cdf24
MF
14532 switch (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH)
14533 {
c97c330b
MF
14534 case E_MIPS_ARCH_1: new_isa = LEVEL_REV (1, 0); break;
14535 case E_MIPS_ARCH_2: new_isa = LEVEL_REV (2, 0); break;
14536 case E_MIPS_ARCH_3: new_isa = LEVEL_REV (3, 0); break;
14537 case E_MIPS_ARCH_4: new_isa = LEVEL_REV (4, 0); break;
14538 case E_MIPS_ARCH_5: new_isa = LEVEL_REV (5, 0); break;
14539 case E_MIPS_ARCH_32: new_isa = LEVEL_REV (32, 1); break;
14540 case E_MIPS_ARCH_32R2: new_isa = LEVEL_REV (32, 2); break;
14541 case E_MIPS_ARCH_32R6: new_isa = LEVEL_REV (32, 6); break;
14542 case E_MIPS_ARCH_64: new_isa = LEVEL_REV (64, 1); break;
14543 case E_MIPS_ARCH_64R2: new_isa = LEVEL_REV (64, 2); break;
14544 case E_MIPS_ARCH_64R6: new_isa = LEVEL_REV (64, 6); break;
351cdf24 14545 default:
4eca0228 14546 _bfd_error_handler
695344c0 14547 /* xgettext:c-format */
2c1c9679 14548 (_("%pB: unknown architecture %s"),
351cdf24
MF
14549 abfd, bfd_printable_name (abfd));
14550 }
14551
c97c330b
MF
14552 if (new_isa > LEVEL_REV (abiflags->isa_level, abiflags->isa_rev))
14553 {
14554 abiflags->isa_level = ISA_LEVEL (new_isa);
14555 abiflags->isa_rev = ISA_REV (new_isa);
14556 }
14557
14558 /* Update the isa_ext if ABFD describes a further extension. */
14559 if (mips_mach_extends_p (bfd_mips_isa_ext_mach (abiflags->isa_ext),
14560 bfd_get_mach (abfd)))
14561 abiflags->isa_ext = bfd_mips_isa_ext (abfd);
351cdf24
MF
14562}
14563
14564/* Return true if the given ELF header flags describe a 32-bit binary. */
14565
14566static bfd_boolean
14567mips_32bit_flags_p (flagword flags)
14568{
14569 return ((flags & EF_MIPS_32BITMODE) != 0
14570 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_O32
14571 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32
14572 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1
14573 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2
14574 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32
7361da2c
AB
14575 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2
14576 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R6);
351cdf24
MF
14577}
14578
14579/* Infer the content of the ABI flags based on the elf header. */
14580
14581static void
14582infer_mips_abiflags (bfd *abfd, Elf_Internal_ABIFlags_v0* abiflags)
14583{
14584 obj_attribute *in_attr;
14585
14586 memset (abiflags, 0, sizeof (Elf_Internal_ABIFlags_v0));
14587 update_mips_abiflags_isa (abfd, abiflags);
14588
14589 if (mips_32bit_flags_p (elf_elfheader (abfd)->e_flags))
14590 abiflags->gpr_size = AFL_REG_32;
14591 else
14592 abiflags->gpr_size = AFL_REG_64;
14593
14594 abiflags->cpr1_size = AFL_REG_NONE;
14595
14596 in_attr = elf_known_obj_attributes (abfd)[OBJ_ATTR_GNU];
14597 abiflags->fp_abi = in_attr[Tag_GNU_MIPS_ABI_FP].i;
14598
14599 if (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_SINGLE
14600 || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_XX
14601 || (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_DOUBLE
14602 && abiflags->gpr_size == AFL_REG_32))
14603 abiflags->cpr1_size = AFL_REG_32;
14604 else if (abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_DOUBLE
14605 || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_64
14606 || abiflags->fp_abi == Val_GNU_MIPS_ABI_FP_64A)
14607 abiflags->cpr1_size = AFL_REG_64;
14608
14609 abiflags->cpr2_size = AFL_REG_NONE;
14610
14611 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
14612 abiflags->ases |= AFL_ASE_MDMX;
14613 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
14614 abiflags->ases |= AFL_ASE_MIPS16;
14615 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
14616 abiflags->ases |= AFL_ASE_MICROMIPS;
14617
14618 if (abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_ANY
14619 && abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_SOFT
14620 && abiflags->fp_abi != Val_GNU_MIPS_ABI_FP_64A
14621 && abiflags->isa_level >= 32
bdc6c06e 14622 && abiflags->ases != AFL_ASE_LOONGSON_EXT)
351cdf24
MF
14623 abiflags->flags1 |= AFL_FLAGS1_ODDSPREG;
14624}
14625
b49e97c9
TS
14626/* We need to use a special link routine to handle the .reginfo and
14627 the .mdebug sections. We need to merge all instances of these
14628 sections together, not write them all out sequentially. */
14629
b34976b6 14630bfd_boolean
9719ad41 14631_bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
b49e97c9 14632{
b49e97c9
TS
14633 asection *o;
14634 struct bfd_link_order *p;
14635 asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
351cdf24 14636 asection *rtproc_sec, *abiflags_sec;
b49e97c9
TS
14637 Elf32_RegInfo reginfo;
14638 struct ecoff_debug_info debug;
861fb55a 14639 struct mips_htab_traverse_info hti;
7a2a6943
NC
14640 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
14641 const struct ecoff_debug_swap *swap = bed->elf_backend_ecoff_debug_swap;
b49e97c9 14642 HDRR *symhdr = &debug.symbolic_header;
9719ad41 14643 void *mdebug_handle = NULL;
b49e97c9
TS
14644 asection *s;
14645 EXTR esym;
14646 unsigned int i;
14647 bfd_size_type amt;
0a44bf69 14648 struct mips_elf_link_hash_table *htab;
b49e97c9
TS
14649
14650 static const char * const secname[] =
14651 {
14652 ".text", ".init", ".fini", ".data",
14653 ".rodata", ".sdata", ".sbss", ".bss"
14654 };
14655 static const int sc[] =
14656 {
14657 scText, scInit, scFini, scData,
14658 scRData, scSData, scSBss, scBss
14659 };
14660
0a44bf69 14661 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
14662 BFD_ASSERT (htab != NULL);
14663
64575f78
MR
14664 /* Sort the dynamic symbols so that those with GOT entries come after
14665 those without. */
d4596a51
RS
14666 if (!mips_elf_sort_hash_table (abfd, info))
14667 return FALSE;
b49e97c9 14668
861fb55a
DJ
14669 /* Create any scheduled LA25 stubs. */
14670 hti.info = info;
14671 hti.output_bfd = abfd;
14672 hti.error = FALSE;
14673 htab_traverse (htab->la25_stubs, mips_elf_create_la25_stub, &hti);
14674 if (hti.error)
14675 return FALSE;
14676
b49e97c9
TS
14677 /* Get a value for the GP register. */
14678 if (elf_gp (abfd) == 0)
14679 {
14680 struct bfd_link_hash_entry *h;
14681
b34976b6 14682 h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
9719ad41 14683 if (h != NULL && h->type == bfd_link_hash_defined)
b49e97c9
TS
14684 elf_gp (abfd) = (h->u.def.value
14685 + h->u.def.section->output_section->vma
14686 + h->u.def.section->output_offset);
0a44bf69
RS
14687 else if (htab->is_vxworks
14688 && (h = bfd_link_hash_lookup (info->hash,
14689 "_GLOBAL_OFFSET_TABLE_",
14690 FALSE, FALSE, TRUE))
14691 && h->type == bfd_link_hash_defined)
14692 elf_gp (abfd) = (h->u.def.section->output_section->vma
14693 + h->u.def.section->output_offset
14694 + h->u.def.value);
0e1862bb 14695 else if (bfd_link_relocatable (info))
b49e97c9
TS
14696 {
14697 bfd_vma lo = MINUS_ONE;
14698
14699 /* Find the GP-relative section with the lowest offset. */
9719ad41 14700 for (o = abfd->sections; o != NULL; o = o->next)
b49e97c9
TS
14701 if (o->vma < lo
14702 && (elf_section_data (o)->this_hdr.sh_flags & SHF_MIPS_GPREL))
14703 lo = o->vma;
14704
14705 /* And calculate GP relative to that. */
0a44bf69 14706 elf_gp (abfd) = lo + ELF_MIPS_GP_OFFSET (info);
b49e97c9
TS
14707 }
14708 else
14709 {
14710 /* If the relocate_section function needs to do a reloc
14711 involving the GP value, it should make a reloc_dangerous
14712 callback to warn that GP is not defined. */
14713 }
14714 }
14715
14716 /* Go through the sections and collect the .reginfo and .mdebug
14717 information. */
351cdf24 14718 abiflags_sec = NULL;
b49e97c9
TS
14719 reginfo_sec = NULL;
14720 mdebug_sec = NULL;
14721 gptab_data_sec = NULL;
14722 gptab_bss_sec = NULL;
9719ad41 14723 for (o = abfd->sections; o != NULL; o = o->next)
b49e97c9 14724 {
351cdf24
MF
14725 if (strcmp (o->name, ".MIPS.abiflags") == 0)
14726 {
14727 /* We have found the .MIPS.abiflags section in the output file.
14728 Look through all the link_orders comprising it and remove them.
14729 The data is merged in _bfd_mips_elf_merge_private_bfd_data. */
14730 for (p = o->map_head.link_order; p != NULL; p = p->next)
14731 {
14732 asection *input_section;
14733
14734 if (p->type != bfd_indirect_link_order)
14735 {
14736 if (p->type == bfd_data_link_order)
14737 continue;
14738 abort ();
14739 }
14740
14741 input_section = p->u.indirect.section;
14742
14743 /* Hack: reset the SEC_HAS_CONTENTS flag so that
14744 elf_link_input_bfd ignores this section. */
14745 input_section->flags &= ~SEC_HAS_CONTENTS;
14746 }
14747
14748 /* Size has been set in _bfd_mips_elf_always_size_sections. */
14749 BFD_ASSERT(o->size == sizeof (Elf_External_ABIFlags_v0));
14750
14751 /* Skip this section later on (I don't think this currently
14752 matters, but someday it might). */
14753 o->map_head.link_order = NULL;
14754
14755 abiflags_sec = o;
14756 }
14757
b49e97c9
TS
14758 if (strcmp (o->name, ".reginfo") == 0)
14759 {
14760 memset (&reginfo, 0, sizeof reginfo);
14761
14762 /* We have found the .reginfo section in the output file.
14763 Look through all the link_orders comprising it and merge
14764 the information together. */
8423293d 14765 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
14766 {
14767 asection *input_section;
14768 bfd *input_bfd;
14769 Elf32_External_RegInfo ext;
14770 Elf32_RegInfo sub;
6798f8bf 14771 bfd_size_type sz;
b49e97c9
TS
14772
14773 if (p->type != bfd_indirect_link_order)
14774 {
14775 if (p->type == bfd_data_link_order)
14776 continue;
14777 abort ();
14778 }
14779
14780 input_section = p->u.indirect.section;
14781 input_bfd = input_section->owner;
14782
6798f8bf
MR
14783 sz = (input_section->size < sizeof (ext)
14784 ? input_section->size : sizeof (ext));
14785 memset (&ext, 0, sizeof (ext));
b49e97c9 14786 if (! bfd_get_section_contents (input_bfd, input_section,
6798f8bf 14787 &ext, 0, sz))
b34976b6 14788 return FALSE;
b49e97c9
TS
14789
14790 bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub);
14791
14792 reginfo.ri_gprmask |= sub.ri_gprmask;
14793 reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
14794 reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
14795 reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
14796 reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
14797
14798 /* ri_gp_value is set by the function
1c5e4ee9 14799 `_bfd_mips_elf_section_processing' when the section is
b49e97c9
TS
14800 finally written out. */
14801
14802 /* Hack: reset the SEC_HAS_CONTENTS flag so that
14803 elf_link_input_bfd ignores this section. */
14804 input_section->flags &= ~SEC_HAS_CONTENTS;
14805 }
14806
14807 /* Size has been set in _bfd_mips_elf_always_size_sections. */
b248d650 14808 BFD_ASSERT(o->size == sizeof (Elf32_External_RegInfo));
b49e97c9
TS
14809
14810 /* Skip this section later on (I don't think this currently
14811 matters, but someday it might). */
8423293d 14812 o->map_head.link_order = NULL;
b49e97c9
TS
14813
14814 reginfo_sec = o;
14815 }
14816
14817 if (strcmp (o->name, ".mdebug") == 0)
14818 {
14819 struct extsym_info einfo;
14820 bfd_vma last;
14821
14822 /* We have found the .mdebug section in the output file.
14823 Look through all the link_orders comprising it and merge
14824 the information together. */
14825 symhdr->magic = swap->sym_magic;
14826 /* FIXME: What should the version stamp be? */
14827 symhdr->vstamp = 0;
14828 symhdr->ilineMax = 0;
14829 symhdr->cbLine = 0;
14830 symhdr->idnMax = 0;
14831 symhdr->ipdMax = 0;
14832 symhdr->isymMax = 0;
14833 symhdr->ioptMax = 0;
14834 symhdr->iauxMax = 0;
14835 symhdr->issMax = 0;
14836 symhdr->issExtMax = 0;
14837 symhdr->ifdMax = 0;
14838 symhdr->crfd = 0;
14839 symhdr->iextMax = 0;
14840
14841 /* We accumulate the debugging information itself in the
14842 debug_info structure. */
14843 debug.line = NULL;
14844 debug.external_dnr = NULL;
14845 debug.external_pdr = NULL;
14846 debug.external_sym = NULL;
14847 debug.external_opt = NULL;
14848 debug.external_aux = NULL;
14849 debug.ss = NULL;
14850 debug.ssext = debug.ssext_end = NULL;
14851 debug.external_fdr = NULL;
14852 debug.external_rfd = NULL;
14853 debug.external_ext = debug.external_ext_end = NULL;
14854
14855 mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
9719ad41 14856 if (mdebug_handle == NULL)
b34976b6 14857 return FALSE;
b49e97c9
TS
14858
14859 esym.jmptbl = 0;
14860 esym.cobol_main = 0;
14861 esym.weakext = 0;
14862 esym.reserved = 0;
14863 esym.ifd = ifdNil;
14864 esym.asym.iss = issNil;
14865 esym.asym.st = stLocal;
14866 esym.asym.reserved = 0;
14867 esym.asym.index = indexNil;
14868 last = 0;
14869 for (i = 0; i < sizeof (secname) / sizeof (secname[0]); i++)
14870 {
14871 esym.asym.sc = sc[i];
14872 s = bfd_get_section_by_name (abfd, secname[i]);
14873 if (s != NULL)
14874 {
14875 esym.asym.value = s->vma;
eea6121a 14876 last = s->vma + s->size;
b49e97c9
TS
14877 }
14878 else
14879 esym.asym.value = last;
14880 if (!bfd_ecoff_debug_one_external (abfd, &debug, swap,
14881 secname[i], &esym))
b34976b6 14882 return FALSE;
b49e97c9
TS
14883 }
14884
8423293d 14885 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
14886 {
14887 asection *input_section;
14888 bfd *input_bfd;
14889 const struct ecoff_debug_swap *input_swap;
14890 struct ecoff_debug_info input_debug;
14891 char *eraw_src;
14892 char *eraw_end;
14893
14894 if (p->type != bfd_indirect_link_order)
14895 {
14896 if (p->type == bfd_data_link_order)
14897 continue;
14898 abort ();
14899 }
14900
14901 input_section = p->u.indirect.section;
14902 input_bfd = input_section->owner;
14903
d5eaccd7 14904 if (!is_mips_elf (input_bfd))
b49e97c9
TS
14905 {
14906 /* I don't know what a non MIPS ELF bfd would be
14907 doing with a .mdebug section, but I don't really
14908 want to deal with it. */
14909 continue;
14910 }
14911
14912 input_swap = (get_elf_backend_data (input_bfd)
14913 ->elf_backend_ecoff_debug_swap);
14914
eea6121a 14915 BFD_ASSERT (p->size == input_section->size);
b49e97c9
TS
14916
14917 /* The ECOFF linking code expects that we have already
14918 read in the debugging information and set up an
14919 ecoff_debug_info structure, so we do that now. */
14920 if (! _bfd_mips_elf_read_ecoff_info (input_bfd, input_section,
14921 &input_debug))
b34976b6 14922 return FALSE;
b49e97c9
TS
14923
14924 if (! (bfd_ecoff_debug_accumulate
14925 (mdebug_handle, abfd, &debug, swap, input_bfd,
14926 &input_debug, input_swap, info)))
b34976b6 14927 return FALSE;
b49e97c9
TS
14928
14929 /* Loop through the external symbols. For each one with
14930 interesting information, try to find the symbol in
14931 the linker global hash table and save the information
14932 for the output external symbols. */
14933 eraw_src = input_debug.external_ext;
14934 eraw_end = (eraw_src
14935 + (input_debug.symbolic_header.iextMax
14936 * input_swap->external_ext_size));
14937 for (;
14938 eraw_src < eraw_end;
14939 eraw_src += input_swap->external_ext_size)
14940 {
14941 EXTR ext;
14942 const char *name;
14943 struct mips_elf_link_hash_entry *h;
14944
9719ad41 14945 (*input_swap->swap_ext_in) (input_bfd, eraw_src, &ext);
b49e97c9
TS
14946 if (ext.asym.sc == scNil
14947 || ext.asym.sc == scUndefined
14948 || ext.asym.sc == scSUndefined)
14949 continue;
14950
14951 name = input_debug.ssext + ext.asym.iss;
14952 h = mips_elf_link_hash_lookup (mips_elf_hash_table (info),
b34976b6 14953 name, FALSE, FALSE, TRUE);
b49e97c9
TS
14954 if (h == NULL || h->esym.ifd != -2)
14955 continue;
14956
14957 if (ext.ifd != -1)
14958 {
14959 BFD_ASSERT (ext.ifd
14960 < input_debug.symbolic_header.ifdMax);
14961 ext.ifd = input_debug.ifdmap[ext.ifd];
14962 }
14963
14964 h->esym = ext;
14965 }
14966
14967 /* Free up the information we just read. */
14968 free (input_debug.line);
14969 free (input_debug.external_dnr);
14970 free (input_debug.external_pdr);
14971 free (input_debug.external_sym);
14972 free (input_debug.external_opt);
14973 free (input_debug.external_aux);
14974 free (input_debug.ss);
14975 free (input_debug.ssext);
14976 free (input_debug.external_fdr);
14977 free (input_debug.external_rfd);
14978 free (input_debug.external_ext);
14979
14980 /* Hack: reset the SEC_HAS_CONTENTS flag so that
14981 elf_link_input_bfd ignores this section. */
14982 input_section->flags &= ~SEC_HAS_CONTENTS;
14983 }
14984
0e1862bb 14985 if (SGI_COMPAT (abfd) && bfd_link_pic (info))
b49e97c9
TS
14986 {
14987 /* Create .rtproc section. */
87e0a731 14988 rtproc_sec = bfd_get_linker_section (abfd, ".rtproc");
b49e97c9
TS
14989 if (rtproc_sec == NULL)
14990 {
14991 flagword flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
14992 | SEC_LINKER_CREATED | SEC_READONLY);
14993
87e0a731
AM
14994 rtproc_sec = bfd_make_section_anyway_with_flags (abfd,
14995 ".rtproc",
14996 flags);
b49e97c9 14997 if (rtproc_sec == NULL
fd361982 14998 || !bfd_set_section_alignment (rtproc_sec, 4))
b34976b6 14999 return FALSE;
b49e97c9
TS
15000 }
15001
15002 if (! mips_elf_create_procedure_table (mdebug_handle, abfd,
15003 info, rtproc_sec,
15004 &debug))
b34976b6 15005 return FALSE;
b49e97c9
TS
15006 }
15007
15008 /* Build the external symbol information. */
15009 einfo.abfd = abfd;
15010 einfo.info = info;
15011 einfo.debug = &debug;
15012 einfo.swap = swap;
b34976b6 15013 einfo.failed = FALSE;
b49e97c9 15014 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
9719ad41 15015 mips_elf_output_extsym, &einfo);
b49e97c9 15016 if (einfo.failed)
b34976b6 15017 return FALSE;
b49e97c9
TS
15018
15019 /* Set the size of the .mdebug section. */
eea6121a 15020 o->size = bfd_ecoff_debug_size (abfd, &debug, swap);
b49e97c9
TS
15021
15022 /* Skip this section later on (I don't think this currently
15023 matters, but someday it might). */
8423293d 15024 o->map_head.link_order = NULL;
b49e97c9
TS
15025
15026 mdebug_sec = o;
15027 }
15028
0112cd26 15029 if (CONST_STRNEQ (o->name, ".gptab."))
b49e97c9
TS
15030 {
15031 const char *subname;
15032 unsigned int c;
15033 Elf32_gptab *tab;
15034 Elf32_External_gptab *ext_tab;
15035 unsigned int j;
15036
15037 /* The .gptab.sdata and .gptab.sbss sections hold
15038 information describing how the small data area would
15039 change depending upon the -G switch. These sections
15040 not used in executables files. */
0e1862bb 15041 if (! bfd_link_relocatable (info))
b49e97c9 15042 {
8423293d 15043 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
15044 {
15045 asection *input_section;
15046
15047 if (p->type != bfd_indirect_link_order)
15048 {
15049 if (p->type == bfd_data_link_order)
15050 continue;
15051 abort ();
15052 }
15053
15054 input_section = p->u.indirect.section;
15055
15056 /* Hack: reset the SEC_HAS_CONTENTS flag so that
15057 elf_link_input_bfd ignores this section. */
15058 input_section->flags &= ~SEC_HAS_CONTENTS;
15059 }
15060
15061 /* Skip this section later on (I don't think this
15062 currently matters, but someday it might). */
8423293d 15063 o->map_head.link_order = NULL;
b49e97c9
TS
15064
15065 /* Really remove the section. */
5daa8fe7 15066 bfd_section_list_remove (abfd, o);
b49e97c9
TS
15067 --abfd->section_count;
15068
15069 continue;
15070 }
15071
15072 /* There is one gptab for initialized data, and one for
15073 uninitialized data. */
15074 if (strcmp (o->name, ".gptab.sdata") == 0)
15075 gptab_data_sec = o;
15076 else if (strcmp (o->name, ".gptab.sbss") == 0)
15077 gptab_bss_sec = o;
15078 else
15079 {
4eca0228 15080 _bfd_error_handler
695344c0 15081 /* xgettext:c-format */
871b3ab2 15082 (_("%pB: illegal section name `%pA'"), abfd, o);
b49e97c9 15083 bfd_set_error (bfd_error_nonrepresentable_section);
b34976b6 15084 return FALSE;
b49e97c9
TS
15085 }
15086
15087 /* The linker script always combines .gptab.data and
15088 .gptab.sdata into .gptab.sdata, and likewise for
15089 .gptab.bss and .gptab.sbss. It is possible that there is
15090 no .sdata or .sbss section in the output file, in which
15091 case we must change the name of the output section. */
15092 subname = o->name + sizeof ".gptab" - 1;
15093 if (bfd_get_section_by_name (abfd, subname) == NULL)
15094 {
15095 if (o == gptab_data_sec)
15096 o->name = ".gptab.data";
15097 else
15098 o->name = ".gptab.bss";
15099 subname = o->name + sizeof ".gptab" - 1;
15100 BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
15101 }
15102
15103 /* Set up the first entry. */
15104 c = 1;
15105 amt = c * sizeof (Elf32_gptab);
9719ad41 15106 tab = bfd_malloc (amt);
b49e97c9 15107 if (tab == NULL)
b34976b6 15108 return FALSE;
b49e97c9
TS
15109 tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
15110 tab[0].gt_header.gt_unused = 0;
15111
15112 /* Combine the input sections. */
8423293d 15113 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
15114 {
15115 asection *input_section;
15116 bfd *input_bfd;
15117 bfd_size_type size;
15118 unsigned long last;
15119 bfd_size_type gpentry;
15120
15121 if (p->type != bfd_indirect_link_order)
15122 {
15123 if (p->type == bfd_data_link_order)
15124 continue;
15125 abort ();
15126 }
15127
15128 input_section = p->u.indirect.section;
15129 input_bfd = input_section->owner;
15130
15131 /* Combine the gptab entries for this input section one
15132 by one. We know that the input gptab entries are
15133 sorted by ascending -G value. */
eea6121a 15134 size = input_section->size;
b49e97c9
TS
15135 last = 0;
15136 for (gpentry = sizeof (Elf32_External_gptab);
15137 gpentry < size;
15138 gpentry += sizeof (Elf32_External_gptab))
15139 {
15140 Elf32_External_gptab ext_gptab;
15141 Elf32_gptab int_gptab;
15142 unsigned long val;
15143 unsigned long add;
b34976b6 15144 bfd_boolean exact;
b49e97c9
TS
15145 unsigned int look;
15146
15147 if (! (bfd_get_section_contents
9719ad41
RS
15148 (input_bfd, input_section, &ext_gptab, gpentry,
15149 sizeof (Elf32_External_gptab))))
b49e97c9
TS
15150 {
15151 free (tab);
b34976b6 15152 return FALSE;
b49e97c9
TS
15153 }
15154
15155 bfd_mips_elf32_swap_gptab_in (input_bfd, &ext_gptab,
15156 &int_gptab);
15157 val = int_gptab.gt_entry.gt_g_value;
15158 add = int_gptab.gt_entry.gt_bytes - last;
15159
b34976b6 15160 exact = FALSE;
b49e97c9
TS
15161 for (look = 1; look < c; look++)
15162 {
15163 if (tab[look].gt_entry.gt_g_value >= val)
15164 tab[look].gt_entry.gt_bytes += add;
15165
15166 if (tab[look].gt_entry.gt_g_value == val)
b34976b6 15167 exact = TRUE;
b49e97c9
TS
15168 }
15169
15170 if (! exact)
15171 {
15172 Elf32_gptab *new_tab;
15173 unsigned int max;
15174
15175 /* We need a new table entry. */
15176 amt = (bfd_size_type) (c + 1) * sizeof (Elf32_gptab);
9719ad41 15177 new_tab = bfd_realloc (tab, amt);
b49e97c9
TS
15178 if (new_tab == NULL)
15179 {
15180 free (tab);
b34976b6 15181 return FALSE;
b49e97c9
TS
15182 }
15183 tab = new_tab;
15184 tab[c].gt_entry.gt_g_value = val;
15185 tab[c].gt_entry.gt_bytes = add;
15186
15187 /* Merge in the size for the next smallest -G
15188 value, since that will be implied by this new
15189 value. */
15190 max = 0;
15191 for (look = 1; look < c; look++)
15192 {
15193 if (tab[look].gt_entry.gt_g_value < val
15194 && (max == 0
15195 || (tab[look].gt_entry.gt_g_value
15196 > tab[max].gt_entry.gt_g_value)))
15197 max = look;
15198 }
15199 if (max != 0)
15200 tab[c].gt_entry.gt_bytes +=
15201 tab[max].gt_entry.gt_bytes;
15202
15203 ++c;
15204 }
15205
15206 last = int_gptab.gt_entry.gt_bytes;
15207 }
15208
15209 /* Hack: reset the SEC_HAS_CONTENTS flag so that
15210 elf_link_input_bfd ignores this section. */
15211 input_section->flags &= ~SEC_HAS_CONTENTS;
15212 }
15213
15214 /* The table must be sorted by -G value. */
15215 if (c > 2)
15216 qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
15217
15218 /* Swap out the table. */
15219 amt = (bfd_size_type) c * sizeof (Elf32_External_gptab);
9719ad41 15220 ext_tab = bfd_alloc (abfd, amt);
b49e97c9
TS
15221 if (ext_tab == NULL)
15222 {
15223 free (tab);
b34976b6 15224 return FALSE;
b49e97c9
TS
15225 }
15226
15227 for (j = 0; j < c; j++)
15228 bfd_mips_elf32_swap_gptab_out (abfd, tab + j, ext_tab + j);
15229 free (tab);
15230
eea6121a 15231 o->size = c * sizeof (Elf32_External_gptab);
b49e97c9
TS
15232 o->contents = (bfd_byte *) ext_tab;
15233
15234 /* Skip this section later on (I don't think this currently
15235 matters, but someday it might). */
8423293d 15236 o->map_head.link_order = NULL;
b49e97c9
TS
15237 }
15238 }
15239
15240 /* Invoke the regular ELF backend linker to do all the work. */
c152c796 15241 if (!bfd_elf_final_link (abfd, info))
b34976b6 15242 return FALSE;
b49e97c9
TS
15243
15244 /* Now write out the computed sections. */
15245
351cdf24
MF
15246 if (abiflags_sec != NULL)
15247 {
15248 Elf_External_ABIFlags_v0 ext;
15249 Elf_Internal_ABIFlags_v0 *abiflags;
15250
15251 abiflags = &mips_elf_tdata (abfd)->abiflags;
15252
15253 /* Set up the abiflags if no valid input sections were found. */
15254 if (!mips_elf_tdata (abfd)->abiflags_valid)
15255 {
15256 infer_mips_abiflags (abfd, abiflags);
15257 mips_elf_tdata (abfd)->abiflags_valid = TRUE;
15258 }
15259 bfd_mips_elf_swap_abiflags_v0_out (abfd, abiflags, &ext);
15260 if (! bfd_set_section_contents (abfd, abiflags_sec, &ext, 0, sizeof ext))
15261 return FALSE;
15262 }
15263
9719ad41 15264 if (reginfo_sec != NULL)
b49e97c9
TS
15265 {
15266 Elf32_External_RegInfo ext;
15267
15268 bfd_mips_elf32_swap_reginfo_out (abfd, &reginfo, &ext);
9719ad41 15269 if (! bfd_set_section_contents (abfd, reginfo_sec, &ext, 0, sizeof ext))
b34976b6 15270 return FALSE;
b49e97c9
TS
15271 }
15272
9719ad41 15273 if (mdebug_sec != NULL)
b49e97c9
TS
15274 {
15275 BFD_ASSERT (abfd->output_has_begun);
15276 if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
15277 swap, info,
15278 mdebug_sec->filepos))
b34976b6 15279 return FALSE;
b49e97c9
TS
15280
15281 bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
15282 }
15283
9719ad41 15284 if (gptab_data_sec != NULL)
b49e97c9
TS
15285 {
15286 if (! bfd_set_section_contents (abfd, gptab_data_sec,
15287 gptab_data_sec->contents,
eea6121a 15288 0, gptab_data_sec->size))
b34976b6 15289 return FALSE;
b49e97c9
TS
15290 }
15291
9719ad41 15292 if (gptab_bss_sec != NULL)
b49e97c9
TS
15293 {
15294 if (! bfd_set_section_contents (abfd, gptab_bss_sec,
15295 gptab_bss_sec->contents,
eea6121a 15296 0, gptab_bss_sec->size))
b34976b6 15297 return FALSE;
b49e97c9
TS
15298 }
15299
15300 if (SGI_COMPAT (abfd))
15301 {
15302 rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
15303 if (rtproc_sec != NULL)
15304 {
15305 if (! bfd_set_section_contents (abfd, rtproc_sec,
15306 rtproc_sec->contents,
eea6121a 15307 0, rtproc_sec->size))
b34976b6 15308 return FALSE;
b49e97c9
TS
15309 }
15310 }
15311
b34976b6 15312 return TRUE;
b49e97c9
TS
15313}
15314\f
b2e9744f
MR
15315/* Merge object file header flags from IBFD into OBFD. Raise an error
15316 if there are conflicting settings. */
15317
15318static bfd_boolean
50e03d47 15319mips_elf_merge_obj_e_flags (bfd *ibfd, struct bfd_link_info *info)
b2e9744f 15320{
50e03d47 15321 bfd *obfd = info->output_bfd;
b2e9744f
MR
15322 struct mips_elf_obj_tdata *out_tdata = mips_elf_tdata (obfd);
15323 flagword old_flags;
15324 flagword new_flags;
15325 bfd_boolean ok;
15326
15327 new_flags = elf_elfheader (ibfd)->e_flags;
15328 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_NOREORDER;
15329 old_flags = elf_elfheader (obfd)->e_flags;
15330
15331 /* Check flag compatibility. */
15332
15333 new_flags &= ~EF_MIPS_NOREORDER;
15334 old_flags &= ~EF_MIPS_NOREORDER;
15335
15336 /* Some IRIX 6 BSD-compatibility objects have this bit set. It
15337 doesn't seem to matter. */
15338 new_flags &= ~EF_MIPS_XGOT;
15339 old_flags &= ~EF_MIPS_XGOT;
15340
15341 /* MIPSpro generates ucode info in n64 objects. Again, we should
15342 just be able to ignore this. */
15343 new_flags &= ~EF_MIPS_UCODE;
15344 old_flags &= ~EF_MIPS_UCODE;
15345
15346 /* DSOs should only be linked with CPIC code. */
15347 if ((ibfd->flags & DYNAMIC) != 0)
15348 new_flags |= EF_MIPS_PIC | EF_MIPS_CPIC;
15349
15350 if (new_flags == old_flags)
15351 return TRUE;
15352
15353 ok = TRUE;
15354
15355 if (((new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0)
15356 != ((old_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0))
15357 {
4eca0228 15358 _bfd_error_handler
871b3ab2 15359 (_("%pB: warning: linking abicalls files with non-abicalls files"),
b2e9744f
MR
15360 ibfd);
15361 ok = TRUE;
15362 }
15363
15364 if (new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC))
15365 elf_elfheader (obfd)->e_flags |= EF_MIPS_CPIC;
15366 if (! (new_flags & EF_MIPS_PIC))
15367 elf_elfheader (obfd)->e_flags &= ~EF_MIPS_PIC;
15368
15369 new_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
15370 old_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
15371
15372 /* Compare the ISAs. */
15373 if (mips_32bit_flags_p (old_flags) != mips_32bit_flags_p (new_flags))
15374 {
4eca0228 15375 _bfd_error_handler
871b3ab2 15376 (_("%pB: linking 32-bit code with 64-bit code"),
b2e9744f
MR
15377 ibfd);
15378 ok = FALSE;
15379 }
15380 else if (!mips_mach_extends_p (bfd_get_mach (ibfd), bfd_get_mach (obfd)))
15381 {
15382 /* OBFD's ISA isn't the same as, or an extension of, IBFD's. */
15383 if (mips_mach_extends_p (bfd_get_mach (obfd), bfd_get_mach (ibfd)))
15384 {
15385 /* Copy the architecture info from IBFD to OBFD. Also copy
15386 the 32-bit flag (if set) so that we continue to recognise
15387 OBFD as a 32-bit binary. */
15388 bfd_set_arch_info (obfd, bfd_get_arch_info (ibfd));
15389 elf_elfheader (obfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
15390 elf_elfheader (obfd)->e_flags
15391 |= new_flags & (EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15392
15393 /* Update the ABI flags isa_level, isa_rev, isa_ext fields. */
15394 update_mips_abiflags_isa (obfd, &out_tdata->abiflags);
15395
15396 /* Copy across the ABI flags if OBFD doesn't use them
15397 and if that was what caused us to treat IBFD as 32-bit. */
15398 if ((old_flags & EF_MIPS_ABI) == 0
15399 && mips_32bit_flags_p (new_flags)
15400 && !mips_32bit_flags_p (new_flags & ~EF_MIPS_ABI))
15401 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ABI;
15402 }
15403 else
15404 {
15405 /* The ISAs aren't compatible. */
4eca0228 15406 _bfd_error_handler
695344c0 15407 /* xgettext:c-format */
871b3ab2 15408 (_("%pB: linking %s module with previous %s modules"),
b2e9744f
MR
15409 ibfd,
15410 bfd_printable_name (ibfd),
15411 bfd_printable_name (obfd));
15412 ok = FALSE;
15413 }
15414 }
15415
15416 new_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15417 old_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
15418
15419 /* Compare ABIs. The 64-bit ABI does not use EF_MIPS_ABI. But, it
15420 does set EI_CLASS differently from any 32-bit ABI. */
15421 if ((new_flags & EF_MIPS_ABI) != (old_flags & EF_MIPS_ABI)
15422 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
15423 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
15424 {
15425 /* Only error if both are set (to different values). */
15426 if (((new_flags & EF_MIPS_ABI) && (old_flags & EF_MIPS_ABI))
15427 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
15428 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
15429 {
4eca0228 15430 _bfd_error_handler
695344c0 15431 /* xgettext:c-format */
871b3ab2 15432 (_("%pB: ABI mismatch: linking %s module with previous %s modules"),
b2e9744f
MR
15433 ibfd,
15434 elf_mips_abi_name (ibfd),
15435 elf_mips_abi_name (obfd));
15436 ok = FALSE;
15437 }
15438 new_flags &= ~EF_MIPS_ABI;
15439 old_flags &= ~EF_MIPS_ABI;
15440 }
15441
15442 /* Compare ASEs. Forbid linking MIPS16 and microMIPS ASE modules together
15443 and allow arbitrary mixing of the remaining ASEs (retain the union). */
15444 if ((new_flags & EF_MIPS_ARCH_ASE) != (old_flags & EF_MIPS_ARCH_ASE))
15445 {
15446 int old_micro = old_flags & EF_MIPS_ARCH_ASE_MICROMIPS;
15447 int new_micro = new_flags & EF_MIPS_ARCH_ASE_MICROMIPS;
15448 int old_m16 = old_flags & EF_MIPS_ARCH_ASE_M16;
15449 int new_m16 = new_flags & EF_MIPS_ARCH_ASE_M16;
15450 int micro_mis = old_m16 && new_micro;
15451 int m16_mis = old_micro && new_m16;
15452
15453 if (m16_mis || micro_mis)
15454 {
4eca0228 15455 _bfd_error_handler
695344c0 15456 /* xgettext:c-format */
871b3ab2 15457 (_("%pB: ASE mismatch: linking %s module with previous %s modules"),
b2e9744f
MR
15458 ibfd,
15459 m16_mis ? "MIPS16" : "microMIPS",
15460 m16_mis ? "microMIPS" : "MIPS16");
15461 ok = FALSE;
15462 }
15463
15464 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ARCH_ASE;
15465
15466 new_flags &= ~ EF_MIPS_ARCH_ASE;
15467 old_flags &= ~ EF_MIPS_ARCH_ASE;
15468 }
15469
15470 /* Compare NaN encodings. */
15471 if ((new_flags & EF_MIPS_NAN2008) != (old_flags & EF_MIPS_NAN2008))
15472 {
695344c0 15473 /* xgettext:c-format */
871b3ab2 15474 _bfd_error_handler (_("%pB: linking %s module with previous %s modules"),
b2e9744f
MR
15475 ibfd,
15476 (new_flags & EF_MIPS_NAN2008
15477 ? "-mnan=2008" : "-mnan=legacy"),
15478 (old_flags & EF_MIPS_NAN2008
15479 ? "-mnan=2008" : "-mnan=legacy"));
15480 ok = FALSE;
15481 new_flags &= ~EF_MIPS_NAN2008;
15482 old_flags &= ~EF_MIPS_NAN2008;
15483 }
15484
15485 /* Compare FP64 state. */
15486 if ((new_flags & EF_MIPS_FP64) != (old_flags & EF_MIPS_FP64))
15487 {
695344c0 15488 /* xgettext:c-format */
871b3ab2 15489 _bfd_error_handler (_("%pB: linking %s module with previous %s modules"),
b2e9744f
MR
15490 ibfd,
15491 (new_flags & EF_MIPS_FP64
15492 ? "-mfp64" : "-mfp32"),
15493 (old_flags & EF_MIPS_FP64
15494 ? "-mfp64" : "-mfp32"));
15495 ok = FALSE;
15496 new_flags &= ~EF_MIPS_FP64;
15497 old_flags &= ~EF_MIPS_FP64;
15498 }
15499
15500 /* Warn about any other mismatches */
15501 if (new_flags != old_flags)
15502 {
695344c0 15503 /* xgettext:c-format */
4eca0228 15504 _bfd_error_handler
871b3ab2 15505 (_("%pB: uses different e_flags (%#x) fields than previous modules "
d42c267e
AM
15506 "(%#x)"),
15507 ibfd, new_flags, old_flags);
b2e9744f
MR
15508 ok = FALSE;
15509 }
15510
15511 return ok;
15512}
15513
2cf19d5c
JM
15514/* Merge object attributes from IBFD into OBFD. Raise an error if
15515 there are conflicting attributes. */
15516static bfd_boolean
50e03d47 15517mips_elf_merge_obj_attributes (bfd *ibfd, struct bfd_link_info *info)
2cf19d5c 15518{
50e03d47 15519 bfd *obfd = info->output_bfd;
2cf19d5c
JM
15520 obj_attribute *in_attr;
15521 obj_attribute *out_attr;
6ae68ba3 15522 bfd *abi_fp_bfd;
b60bf9be 15523 bfd *abi_msa_bfd;
6ae68ba3
MR
15524
15525 abi_fp_bfd = mips_elf_tdata (obfd)->abi_fp_bfd;
15526 in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
d929bc19 15527 if (!abi_fp_bfd && in_attr[Tag_GNU_MIPS_ABI_FP].i != Val_GNU_MIPS_ABI_FP_ANY)
6ae68ba3 15528 mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
2cf19d5c 15529
b60bf9be
CF
15530 abi_msa_bfd = mips_elf_tdata (obfd)->abi_msa_bfd;
15531 if (!abi_msa_bfd
15532 && in_attr[Tag_GNU_MIPS_ABI_MSA].i != Val_GNU_MIPS_ABI_MSA_ANY)
15533 mips_elf_tdata (obfd)->abi_msa_bfd = ibfd;
15534
2cf19d5c
JM
15535 if (!elf_known_obj_attributes_proc (obfd)[0].i)
15536 {
15537 /* This is the first object. Copy the attributes. */
15538 _bfd_elf_copy_obj_attributes (ibfd, obfd);
15539
15540 /* Use the Tag_null value to indicate the attributes have been
15541 initialized. */
15542 elf_known_obj_attributes_proc (obfd)[0].i = 1;
15543
15544 return TRUE;
15545 }
15546
15547 /* Check for conflicting Tag_GNU_MIPS_ABI_FP attributes and merge
15548 non-conflicting ones. */
2cf19d5c
JM
15549 out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
15550 if (in_attr[Tag_GNU_MIPS_ABI_FP].i != out_attr[Tag_GNU_MIPS_ABI_FP].i)
15551 {
757a636f 15552 int out_fp, in_fp;
6ae68ba3 15553
757a636f
RS
15554 out_fp = out_attr[Tag_GNU_MIPS_ABI_FP].i;
15555 in_fp = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15556 out_attr[Tag_GNU_MIPS_ABI_FP].type = 1;
15557 if (out_fp == Val_GNU_MIPS_ABI_FP_ANY)
15558 out_attr[Tag_GNU_MIPS_ABI_FP].i = in_fp;
351cdf24
MF
15559 else if (out_fp == Val_GNU_MIPS_ABI_FP_XX
15560 && (in_fp == Val_GNU_MIPS_ABI_FP_DOUBLE
15561 || in_fp == Val_GNU_MIPS_ABI_FP_64
15562 || in_fp == Val_GNU_MIPS_ABI_FP_64A))
15563 {
15564 mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
15565 out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15566 }
15567 else if (in_fp == Val_GNU_MIPS_ABI_FP_XX
15568 && (out_fp == Val_GNU_MIPS_ABI_FP_DOUBLE
15569 || out_fp == Val_GNU_MIPS_ABI_FP_64
15570 || out_fp == Val_GNU_MIPS_ABI_FP_64A))
15571 /* Keep the current setting. */;
15572 else if (out_fp == Val_GNU_MIPS_ABI_FP_64A
15573 && in_fp == Val_GNU_MIPS_ABI_FP_64)
15574 {
15575 mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
15576 out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
15577 }
15578 else if (in_fp == Val_GNU_MIPS_ABI_FP_64A
15579 && out_fp == Val_GNU_MIPS_ABI_FP_64)
15580 /* Keep the current setting. */;
757a636f
RS
15581 else if (in_fp != Val_GNU_MIPS_ABI_FP_ANY)
15582 {
15583 const char *out_string, *in_string;
6ae68ba3 15584
757a636f
RS
15585 out_string = _bfd_mips_fp_abi_string (out_fp);
15586 in_string = _bfd_mips_fp_abi_string (in_fp);
15587 /* First warn about cases involving unrecognised ABIs. */
15588 if (!out_string && !in_string)
695344c0 15589 /* xgettext:c-format */
757a636f 15590 _bfd_error_handler
2c1c9679 15591 (_("warning: %pB uses unknown floating point ABI %d "
871b3ab2 15592 "(set by %pB), %pB uses unknown floating point ABI %d"),
c08bb8dd 15593 obfd, out_fp, abi_fp_bfd, ibfd, in_fp);
757a636f
RS
15594 else if (!out_string)
15595 _bfd_error_handler
695344c0 15596 /* xgettext:c-format */
2c1c9679 15597 (_("warning: %pB uses unknown floating point ABI %d "
871b3ab2 15598 "(set by %pB), %pB uses %s"),
c08bb8dd 15599 obfd, out_fp, abi_fp_bfd, ibfd, in_string);
757a636f
RS
15600 else if (!in_string)
15601 _bfd_error_handler
695344c0 15602 /* xgettext:c-format */
2c1c9679 15603 (_("warning: %pB uses %s (set by %pB), "
871b3ab2 15604 "%pB uses unknown floating point ABI %d"),
c08bb8dd 15605 obfd, out_string, abi_fp_bfd, ibfd, in_fp);
757a636f
RS
15606 else
15607 {
15608 /* If one of the bfds is soft-float, the other must be
15609 hard-float. The exact choice of hard-float ABI isn't
15610 really relevant to the error message. */
15611 if (in_fp == Val_GNU_MIPS_ABI_FP_SOFT)
15612 out_string = "-mhard-float";
15613 else if (out_fp == Val_GNU_MIPS_ABI_FP_SOFT)
15614 in_string = "-mhard-float";
15615 _bfd_error_handler
695344c0 15616 /* xgettext:c-format */
2c1c9679 15617 (_("warning: %pB uses %s (set by %pB), %pB uses %s"),
c08bb8dd 15618 obfd, out_string, abi_fp_bfd, ibfd, in_string);
757a636f
RS
15619 }
15620 }
2cf19d5c
JM
15621 }
15622
b60bf9be
CF
15623 /* Check for conflicting Tag_GNU_MIPS_ABI_MSA attributes and merge
15624 non-conflicting ones. */
15625 if (in_attr[Tag_GNU_MIPS_ABI_MSA].i != out_attr[Tag_GNU_MIPS_ABI_MSA].i)
15626 {
15627 out_attr[Tag_GNU_MIPS_ABI_MSA].type = 1;
15628 if (out_attr[Tag_GNU_MIPS_ABI_MSA].i == Val_GNU_MIPS_ABI_MSA_ANY)
15629 out_attr[Tag_GNU_MIPS_ABI_MSA].i = in_attr[Tag_GNU_MIPS_ABI_MSA].i;
15630 else if (in_attr[Tag_GNU_MIPS_ABI_MSA].i != Val_GNU_MIPS_ABI_MSA_ANY)
15631 switch (out_attr[Tag_GNU_MIPS_ABI_MSA].i)
15632 {
15633 case Val_GNU_MIPS_ABI_MSA_128:
15634 _bfd_error_handler
695344c0 15635 /* xgettext:c-format */
2c1c9679 15636 (_("warning: %pB uses %s (set by %pB), "
871b3ab2 15637 "%pB uses unknown MSA ABI %d"),
c08bb8dd
AM
15638 obfd, "-mmsa", abi_msa_bfd,
15639 ibfd, in_attr[Tag_GNU_MIPS_ABI_MSA].i);
b60bf9be
CF
15640 break;
15641
15642 default:
15643 switch (in_attr[Tag_GNU_MIPS_ABI_MSA].i)
15644 {
15645 case Val_GNU_MIPS_ABI_MSA_128:
15646 _bfd_error_handler
695344c0 15647 /* xgettext:c-format */
2c1c9679 15648 (_("warning: %pB uses unknown MSA ABI %d "
871b3ab2 15649 "(set by %pB), %pB uses %s"),
c08bb8dd
AM
15650 obfd, out_attr[Tag_GNU_MIPS_ABI_MSA].i,
15651 abi_msa_bfd, ibfd, "-mmsa");
b60bf9be
CF
15652 break;
15653
15654 default:
15655 _bfd_error_handler
695344c0 15656 /* xgettext:c-format */
2c1c9679 15657 (_("warning: %pB uses unknown MSA ABI %d "
871b3ab2 15658 "(set by %pB), %pB uses unknown MSA ABI %d"),
c08bb8dd
AM
15659 obfd, out_attr[Tag_GNU_MIPS_ABI_MSA].i,
15660 abi_msa_bfd, ibfd, in_attr[Tag_GNU_MIPS_ABI_MSA].i);
b60bf9be
CF
15661 break;
15662 }
15663 }
15664 }
15665
2cf19d5c 15666 /* Merge Tag_compatibility attributes and any common GNU ones. */
50e03d47 15667 return _bfd_elf_merge_object_attributes (ibfd, info);
2cf19d5c
JM
15668}
15669
a3dc0a7f
MR
15670/* Merge object ABI flags from IBFD into OBFD. Raise an error if
15671 there are conflicting settings. */
15672
15673static bfd_boolean
15674mips_elf_merge_obj_abiflags (bfd *ibfd, bfd *obfd)
15675{
15676 obj_attribute *out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
15677 struct mips_elf_obj_tdata *out_tdata = mips_elf_tdata (obfd);
15678 struct mips_elf_obj_tdata *in_tdata = mips_elf_tdata (ibfd);
15679
15680 /* Update the output abiflags fp_abi using the computed fp_abi. */
15681 out_tdata->abiflags.fp_abi = out_attr[Tag_GNU_MIPS_ABI_FP].i;
15682
15683#define max(a, b) ((a) > (b) ? (a) : (b))
15684 /* Merge abiflags. */
15685 out_tdata->abiflags.isa_level = max (out_tdata->abiflags.isa_level,
15686 in_tdata->abiflags.isa_level);
15687 out_tdata->abiflags.isa_rev = max (out_tdata->abiflags.isa_rev,
15688 in_tdata->abiflags.isa_rev);
15689 out_tdata->abiflags.gpr_size = max (out_tdata->abiflags.gpr_size,
15690 in_tdata->abiflags.gpr_size);
15691 out_tdata->abiflags.cpr1_size = max (out_tdata->abiflags.cpr1_size,
15692 in_tdata->abiflags.cpr1_size);
15693 out_tdata->abiflags.cpr2_size = max (out_tdata->abiflags.cpr2_size,
15694 in_tdata->abiflags.cpr2_size);
15695#undef max
15696 out_tdata->abiflags.ases |= in_tdata->abiflags.ases;
15697 out_tdata->abiflags.flags1 |= in_tdata->abiflags.flags1;
15698
15699 return TRUE;
15700}
15701
b49e97c9
TS
15702/* Merge backend specific data from an object file to the output
15703 object file when linking. */
15704
b34976b6 15705bfd_boolean
50e03d47 15706_bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
b49e97c9 15707{
50e03d47 15708 bfd *obfd = info->output_bfd;
cf8502c1
MR
15709 struct mips_elf_obj_tdata *out_tdata;
15710 struct mips_elf_obj_tdata *in_tdata;
b34976b6 15711 bfd_boolean null_input_bfd = TRUE;
b49e97c9 15712 asection *sec;
d537eeb5 15713 bfd_boolean ok;
b49e97c9 15714
58238693 15715 /* Check if we have the same endianness. */
50e03d47 15716 if (! _bfd_generic_verify_endian_match (ibfd, info))
aa701218 15717 {
4eca0228 15718 _bfd_error_handler
871b3ab2 15719 (_("%pB: endianness incompatible with that of the selected emulation"),
d003868e 15720 ibfd);
aa701218
AO
15721 return FALSE;
15722 }
b49e97c9 15723
d5eaccd7 15724 if (!is_mips_elf (ibfd) || !is_mips_elf (obfd))
b34976b6 15725 return TRUE;
b49e97c9 15726
cf8502c1
MR
15727 in_tdata = mips_elf_tdata (ibfd);
15728 out_tdata = mips_elf_tdata (obfd);
15729
aa701218
AO
15730 if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
15731 {
4eca0228 15732 _bfd_error_handler
871b3ab2 15733 (_("%pB: ABI is incompatible with that of the selected emulation"),
d003868e 15734 ibfd);
aa701218
AO
15735 return FALSE;
15736 }
15737
23ba6f18
MR
15738 /* Check to see if the input BFD actually contains any sections. If not,
15739 then it has no attributes, and its flags may not have been initialized
15740 either, but it cannot actually cause any incompatibility. */
6b728d32 15741 /* FIXME: This excludes any input shared library from consideration. */
351cdf24
MF
15742 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
15743 {
15744 /* Ignore synthetic sections and empty .text, .data and .bss sections
15745 which are automatically generated by gas. Also ignore fake
15746 (s)common sections, since merely defining a common symbol does
15747 not affect compatibility. */
15748 if ((sec->flags & SEC_IS_COMMON) == 0
15749 && strcmp (sec->name, ".reginfo")
15750 && strcmp (sec->name, ".mdebug")
15751 && (sec->size != 0
15752 || (strcmp (sec->name, ".text")
15753 && strcmp (sec->name, ".data")
15754 && strcmp (sec->name, ".bss"))))
15755 {
15756 null_input_bfd = FALSE;
15757 break;
15758 }
15759 }
15760 if (null_input_bfd)
15761 return TRUE;
15762
28d45e28 15763 /* Populate abiflags using existing information. */
23ba6f18
MR
15764 if (in_tdata->abiflags_valid)
15765 {
15766 obj_attribute *in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
28d45e28
MR
15767 Elf_Internal_ABIFlags_v0 in_abiflags;
15768 Elf_Internal_ABIFlags_v0 abiflags;
15769
15770 /* Set up the FP ABI attribute from the abiflags if it is not already
07d6d2b8 15771 set. */
23ba6f18 15772 if (in_attr[Tag_GNU_MIPS_ABI_FP].i == Val_GNU_MIPS_ABI_FP_ANY)
07d6d2b8 15773 in_attr[Tag_GNU_MIPS_ABI_FP].i = in_tdata->abiflags.fp_abi;
23ba6f18 15774
351cdf24 15775 infer_mips_abiflags (ibfd, &abiflags);
cf8502c1 15776 in_abiflags = in_tdata->abiflags;
351cdf24
MF
15777
15778 /* It is not possible to infer the correct ISA revision
07d6d2b8 15779 for R3 or R5 so drop down to R2 for the checks. */
351cdf24
MF
15780 if (in_abiflags.isa_rev == 3 || in_abiflags.isa_rev == 5)
15781 in_abiflags.isa_rev = 2;
15782
c97c330b
MF
15783 if (LEVEL_REV (in_abiflags.isa_level, in_abiflags.isa_rev)
15784 < LEVEL_REV (abiflags.isa_level, abiflags.isa_rev))
4eca0228 15785 _bfd_error_handler
2c1c9679 15786 (_("%pB: warning: inconsistent ISA between e_flags and "
351cdf24
MF
15787 ".MIPS.abiflags"), ibfd);
15788 if (abiflags.fp_abi != Val_GNU_MIPS_ABI_FP_ANY
15789 && in_abiflags.fp_abi != abiflags.fp_abi)
4eca0228 15790 _bfd_error_handler
2c1c9679 15791 (_("%pB: warning: inconsistent FP ABI between .gnu.attributes and "
351cdf24
MF
15792 ".MIPS.abiflags"), ibfd);
15793 if ((in_abiflags.ases & abiflags.ases) != abiflags.ases)
4eca0228 15794 _bfd_error_handler
2c1c9679 15795 (_("%pB: warning: inconsistent ASEs between e_flags and "
351cdf24 15796 ".MIPS.abiflags"), ibfd);
c97c330b
MF
15797 /* The isa_ext is allowed to be an extension of what can be inferred
15798 from e_flags. */
15799 if (!mips_mach_extends_p (bfd_mips_isa_ext_mach (abiflags.isa_ext),
15800 bfd_mips_isa_ext_mach (in_abiflags.isa_ext)))
4eca0228 15801 _bfd_error_handler
2c1c9679 15802 (_("%pB: warning: inconsistent ISA extensions between e_flags and "
351cdf24
MF
15803 ".MIPS.abiflags"), ibfd);
15804 if (in_abiflags.flags2 != 0)
4eca0228 15805 _bfd_error_handler
2c1c9679 15806 (_("%pB: warning: unexpected flag in the flags2 field of "
351cdf24 15807 ".MIPS.abiflags (0x%lx)"), ibfd,
d42c267e 15808 in_abiflags.flags2);
351cdf24 15809 }
28d45e28
MR
15810 else
15811 {
15812 infer_mips_abiflags (ibfd, &in_tdata->abiflags);
15813 in_tdata->abiflags_valid = TRUE;
15814 }
15815
cf8502c1 15816 if (!out_tdata->abiflags_valid)
351cdf24
MF
15817 {
15818 /* Copy input abiflags if output abiflags are not already valid. */
cf8502c1
MR
15819 out_tdata->abiflags = in_tdata->abiflags;
15820 out_tdata->abiflags_valid = TRUE;
351cdf24 15821 }
b49e97c9
TS
15822
15823 if (! elf_flags_init (obfd))
15824 {
b34976b6 15825 elf_flags_init (obfd) = TRUE;
351cdf24 15826 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
b49e97c9
TS
15827 elf_elfheader (obfd)->e_ident[EI_CLASS]
15828 = elf_elfheader (ibfd)->e_ident[EI_CLASS];
15829
15830 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
2907b861 15831 && (bfd_get_arch_info (obfd)->the_default
68ffbac6 15832 || mips_mach_extends_p (bfd_get_mach (obfd),
2907b861 15833 bfd_get_mach (ibfd))))
b49e97c9
TS
15834 {
15835 if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
15836 bfd_get_mach (ibfd)))
b34976b6 15837 return FALSE;
351cdf24
MF
15838
15839 /* Update the ABI flags isa_level, isa_rev and isa_ext fields. */
cf8502c1 15840 update_mips_abiflags_isa (obfd, &out_tdata->abiflags);
b49e97c9
TS
15841 }
15842
d537eeb5 15843 ok = TRUE;
b49e97c9 15844 }
d537eeb5 15845 else
50e03d47 15846 ok = mips_elf_merge_obj_e_flags (ibfd, info);
d537eeb5 15847
50e03d47 15848 ok = mips_elf_merge_obj_attributes (ibfd, info) && ok;
b49e97c9 15849
a3dc0a7f 15850 ok = mips_elf_merge_obj_abiflags (ibfd, obfd) && ok;
351cdf24 15851
d537eeb5 15852 if (!ok)
b49e97c9
TS
15853 {
15854 bfd_set_error (bfd_error_bad_value);
b34976b6 15855 return FALSE;
b49e97c9
TS
15856 }
15857
b34976b6 15858 return TRUE;
b49e97c9
TS
15859}
15860
15861/* Function to keep MIPS specific file flags like as EF_MIPS_PIC. */
15862
b34976b6 15863bfd_boolean
9719ad41 15864_bfd_mips_elf_set_private_flags (bfd *abfd, flagword flags)
b49e97c9
TS
15865{
15866 BFD_ASSERT (!elf_flags_init (abfd)
15867 || elf_elfheader (abfd)->e_flags == flags);
15868
15869 elf_elfheader (abfd)->e_flags = flags;
b34976b6
AM
15870 elf_flags_init (abfd) = TRUE;
15871 return TRUE;
b49e97c9
TS
15872}
15873
ad9563d6
CM
15874char *
15875_bfd_mips_elf_get_target_dtag (bfd_vma dtag)
15876{
15877 switch (dtag)
15878 {
15879 default: return "";
15880 case DT_MIPS_RLD_VERSION:
15881 return "MIPS_RLD_VERSION";
15882 case DT_MIPS_TIME_STAMP:
15883 return "MIPS_TIME_STAMP";
15884 case DT_MIPS_ICHECKSUM:
15885 return "MIPS_ICHECKSUM";
15886 case DT_MIPS_IVERSION:
15887 return "MIPS_IVERSION";
15888 case DT_MIPS_FLAGS:
15889 return "MIPS_FLAGS";
15890 case DT_MIPS_BASE_ADDRESS:
15891 return "MIPS_BASE_ADDRESS";
15892 case DT_MIPS_MSYM:
15893 return "MIPS_MSYM";
15894 case DT_MIPS_CONFLICT:
15895 return "MIPS_CONFLICT";
15896 case DT_MIPS_LIBLIST:
15897 return "MIPS_LIBLIST";
15898 case DT_MIPS_LOCAL_GOTNO:
15899 return "MIPS_LOCAL_GOTNO";
15900 case DT_MIPS_CONFLICTNO:
15901 return "MIPS_CONFLICTNO";
15902 case DT_MIPS_LIBLISTNO:
15903 return "MIPS_LIBLISTNO";
15904 case DT_MIPS_SYMTABNO:
15905 return "MIPS_SYMTABNO";
15906 case DT_MIPS_UNREFEXTNO:
15907 return "MIPS_UNREFEXTNO";
15908 case DT_MIPS_GOTSYM:
15909 return "MIPS_GOTSYM";
15910 case DT_MIPS_HIPAGENO:
15911 return "MIPS_HIPAGENO";
15912 case DT_MIPS_RLD_MAP:
15913 return "MIPS_RLD_MAP";
a5499fa4
MF
15914 case DT_MIPS_RLD_MAP_REL:
15915 return "MIPS_RLD_MAP_REL";
ad9563d6
CM
15916 case DT_MIPS_DELTA_CLASS:
15917 return "MIPS_DELTA_CLASS";
15918 case DT_MIPS_DELTA_CLASS_NO:
15919 return "MIPS_DELTA_CLASS_NO";
15920 case DT_MIPS_DELTA_INSTANCE:
15921 return "MIPS_DELTA_INSTANCE";
15922 case DT_MIPS_DELTA_INSTANCE_NO:
15923 return "MIPS_DELTA_INSTANCE_NO";
15924 case DT_MIPS_DELTA_RELOC:
15925 return "MIPS_DELTA_RELOC";
15926 case DT_MIPS_DELTA_RELOC_NO:
15927 return "MIPS_DELTA_RELOC_NO";
15928 case DT_MIPS_DELTA_SYM:
15929 return "MIPS_DELTA_SYM";
15930 case DT_MIPS_DELTA_SYM_NO:
15931 return "MIPS_DELTA_SYM_NO";
15932 case DT_MIPS_DELTA_CLASSSYM:
15933 return "MIPS_DELTA_CLASSSYM";
15934 case DT_MIPS_DELTA_CLASSSYM_NO:
15935 return "MIPS_DELTA_CLASSSYM_NO";
15936 case DT_MIPS_CXX_FLAGS:
15937 return "MIPS_CXX_FLAGS";
15938 case DT_MIPS_PIXIE_INIT:
15939 return "MIPS_PIXIE_INIT";
15940 case DT_MIPS_SYMBOL_LIB:
15941 return "MIPS_SYMBOL_LIB";
15942 case DT_MIPS_LOCALPAGE_GOTIDX:
15943 return "MIPS_LOCALPAGE_GOTIDX";
15944 case DT_MIPS_LOCAL_GOTIDX:
15945 return "MIPS_LOCAL_GOTIDX";
15946 case DT_MIPS_HIDDEN_GOTIDX:
15947 return "MIPS_HIDDEN_GOTIDX";
15948 case DT_MIPS_PROTECTED_GOTIDX:
15949 return "MIPS_PROTECTED_GOT_IDX";
15950 case DT_MIPS_OPTIONS:
15951 return "MIPS_OPTIONS";
15952 case DT_MIPS_INTERFACE:
15953 return "MIPS_INTERFACE";
15954 case DT_MIPS_DYNSTR_ALIGN:
15955 return "DT_MIPS_DYNSTR_ALIGN";
15956 case DT_MIPS_INTERFACE_SIZE:
15957 return "DT_MIPS_INTERFACE_SIZE";
15958 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR:
15959 return "DT_MIPS_RLD_TEXT_RESOLVE_ADDR";
15960 case DT_MIPS_PERF_SUFFIX:
15961 return "DT_MIPS_PERF_SUFFIX";
15962 case DT_MIPS_COMPACT_SIZE:
15963 return "DT_MIPS_COMPACT_SIZE";
15964 case DT_MIPS_GP_VALUE:
15965 return "DT_MIPS_GP_VALUE";
15966 case DT_MIPS_AUX_DYNAMIC:
15967 return "DT_MIPS_AUX_DYNAMIC";
861fb55a
DJ
15968 case DT_MIPS_PLTGOT:
15969 return "DT_MIPS_PLTGOT";
15970 case DT_MIPS_RWPLT:
15971 return "DT_MIPS_RWPLT";
f16a9783
MS
15972 case DT_MIPS_XHASH:
15973 return "DT_MIPS_XHASH";
ad9563d6
CM
15974 }
15975}
15976
757a636f
RS
15977/* Return the meaning of Tag_GNU_MIPS_ABI_FP value FP, or null if
15978 not known. */
15979
15980const char *
15981_bfd_mips_fp_abi_string (int fp)
15982{
15983 switch (fp)
15984 {
15985 /* These strings aren't translated because they're simply
15986 option lists. */
15987 case Val_GNU_MIPS_ABI_FP_DOUBLE:
15988 return "-mdouble-float";
15989
15990 case Val_GNU_MIPS_ABI_FP_SINGLE:
15991 return "-msingle-float";
15992
15993 case Val_GNU_MIPS_ABI_FP_SOFT:
15994 return "-msoft-float";
15995
351cdf24
MF
15996 case Val_GNU_MIPS_ABI_FP_OLD_64:
15997 return _("-mips32r2 -mfp64 (12 callee-saved)");
15998
15999 case Val_GNU_MIPS_ABI_FP_XX:
16000 return "-mfpxx";
16001
757a636f 16002 case Val_GNU_MIPS_ABI_FP_64:
351cdf24
MF
16003 return "-mgp32 -mfp64";
16004
16005 case Val_GNU_MIPS_ABI_FP_64A:
16006 return "-mgp32 -mfp64 -mno-odd-spreg";
757a636f
RS
16007
16008 default:
16009 return 0;
16010 }
16011}
16012
351cdf24
MF
16013static void
16014print_mips_ases (FILE *file, unsigned int mask)
16015{
16016 if (mask & AFL_ASE_DSP)
16017 fputs ("\n\tDSP ASE", file);
16018 if (mask & AFL_ASE_DSPR2)
16019 fputs ("\n\tDSP R2 ASE", file);
8f4f9071
MF
16020 if (mask & AFL_ASE_DSPR3)
16021 fputs ("\n\tDSP R3 ASE", file);
351cdf24
MF
16022 if (mask & AFL_ASE_EVA)
16023 fputs ("\n\tEnhanced VA Scheme", file);
16024 if (mask & AFL_ASE_MCU)
16025 fputs ("\n\tMCU (MicroController) ASE", file);
16026 if (mask & AFL_ASE_MDMX)
16027 fputs ("\n\tMDMX ASE", file);
16028 if (mask & AFL_ASE_MIPS3D)
16029 fputs ("\n\tMIPS-3D ASE", file);
16030 if (mask & AFL_ASE_MT)
16031 fputs ("\n\tMT ASE", file);
16032 if (mask & AFL_ASE_SMARTMIPS)
16033 fputs ("\n\tSmartMIPS ASE", file);
16034 if (mask & AFL_ASE_VIRT)
16035 fputs ("\n\tVZ ASE", file);
16036 if (mask & AFL_ASE_MSA)
16037 fputs ("\n\tMSA ASE", file);
16038 if (mask & AFL_ASE_MIPS16)
16039 fputs ("\n\tMIPS16 ASE", file);
16040 if (mask & AFL_ASE_MICROMIPS)
16041 fputs ("\n\tMICROMIPS ASE", file);
16042 if (mask & AFL_ASE_XPA)
16043 fputs ("\n\tXPA ASE", file);
25499ac7
MR
16044 if (mask & AFL_ASE_MIPS16E2)
16045 fputs ("\n\tMIPS16e2 ASE", file);
730c3174
SE
16046 if (mask & AFL_ASE_CRC)
16047 fputs ("\n\tCRC ASE", file);
6f20c942
FS
16048 if (mask & AFL_ASE_GINV)
16049 fputs ("\n\tGINV ASE", file);
8095d2f7
CX
16050 if (mask & AFL_ASE_LOONGSON_MMI)
16051 fputs ("\n\tLoongson MMI ASE", file);
716c08de
CX
16052 if (mask & AFL_ASE_LOONGSON_CAM)
16053 fputs ("\n\tLoongson CAM ASE", file);
bdc6c06e
CX
16054 if (mask & AFL_ASE_LOONGSON_EXT)
16055 fputs ("\n\tLoongson EXT ASE", file);
a693765e
CX
16056 if (mask & AFL_ASE_LOONGSON_EXT2)
16057 fputs ("\n\tLoongson EXT2 ASE", file);
351cdf24
MF
16058 if (mask == 0)
16059 fprintf (file, "\n\t%s", _("None"));
00ac7aa0
MF
16060 else if ((mask & ~AFL_ASE_MASK) != 0)
16061 fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
351cdf24
MF
16062}
16063
16064static void
16065print_mips_isa_ext (FILE *file, unsigned int isa_ext)
16066{
16067 switch (isa_ext)
16068 {
16069 case 0:
16070 fputs (_("None"), file);
16071 break;
16072 case AFL_EXT_XLR:
16073 fputs ("RMI XLR", file);
16074 break;
2c629856
N
16075 case AFL_EXT_OCTEON3:
16076 fputs ("Cavium Networks Octeon3", file);
16077 break;
351cdf24
MF
16078 case AFL_EXT_OCTEON2:
16079 fputs ("Cavium Networks Octeon2", file);
16080 break;
16081 case AFL_EXT_OCTEONP:
16082 fputs ("Cavium Networks OcteonP", file);
16083 break;
351cdf24
MF
16084 case AFL_EXT_OCTEON:
16085 fputs ("Cavium Networks Octeon", file);
16086 break;
16087 case AFL_EXT_5900:
16088 fputs ("Toshiba R5900", file);
16089 break;
16090 case AFL_EXT_4650:
16091 fputs ("MIPS R4650", file);
16092 break;
16093 case AFL_EXT_4010:
16094 fputs ("LSI R4010", file);
16095 break;
16096 case AFL_EXT_4100:
16097 fputs ("NEC VR4100", file);
16098 break;
16099 case AFL_EXT_3900:
16100 fputs ("Toshiba R3900", file);
16101 break;
16102 case AFL_EXT_10000:
16103 fputs ("MIPS R10000", file);
16104 break;
16105 case AFL_EXT_SB1:
16106 fputs ("Broadcom SB-1", file);
16107 break;
16108 case AFL_EXT_4111:
16109 fputs ("NEC VR4111/VR4181", file);
16110 break;
16111 case AFL_EXT_4120:
16112 fputs ("NEC VR4120", file);
16113 break;
16114 case AFL_EXT_5400:
16115 fputs ("NEC VR5400", file);
16116 break;
16117 case AFL_EXT_5500:
16118 fputs ("NEC VR5500", file);
16119 break;
16120 case AFL_EXT_LOONGSON_2E:
16121 fputs ("ST Microelectronics Loongson 2E", file);
16122 break;
16123 case AFL_EXT_LOONGSON_2F:
16124 fputs ("ST Microelectronics Loongson 2F", file);
16125 break;
38bf472a
MR
16126 case AFL_EXT_INTERAPTIV_MR2:
16127 fputs ("Imagination interAptiv MR2", file);
16128 break;
351cdf24 16129 default:
00ac7aa0 16130 fprintf (file, "%s (%d)", _("Unknown"), isa_ext);
351cdf24
MF
16131 break;
16132 }
16133}
16134
16135static void
16136print_mips_fp_abi_value (FILE *file, int val)
16137{
16138 switch (val)
16139 {
16140 case Val_GNU_MIPS_ABI_FP_ANY:
16141 fprintf (file, _("Hard or soft float\n"));
16142 break;
16143 case Val_GNU_MIPS_ABI_FP_DOUBLE:
16144 fprintf (file, _("Hard float (double precision)\n"));
16145 break;
16146 case Val_GNU_MIPS_ABI_FP_SINGLE:
16147 fprintf (file, _("Hard float (single precision)\n"));
16148 break;
16149 case Val_GNU_MIPS_ABI_FP_SOFT:
16150 fprintf (file, _("Soft float\n"));
16151 break;
16152 case Val_GNU_MIPS_ABI_FP_OLD_64:
16153 fprintf (file, _("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
16154 break;
16155 case Val_GNU_MIPS_ABI_FP_XX:
16156 fprintf (file, _("Hard float (32-bit CPU, Any FPU)\n"));
16157 break;
16158 case Val_GNU_MIPS_ABI_FP_64:
16159 fprintf (file, _("Hard float (32-bit CPU, 64-bit FPU)\n"));
16160 break;
16161 case Val_GNU_MIPS_ABI_FP_64A:
16162 fprintf (file, _("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
16163 break;
16164 default:
16165 fprintf (file, "??? (%d)\n", val);
16166 break;
16167 }
16168}
16169
16170static int
16171get_mips_reg_size (int reg_size)
16172{
16173 return (reg_size == AFL_REG_NONE) ? 0
16174 : (reg_size == AFL_REG_32) ? 32
16175 : (reg_size == AFL_REG_64) ? 64
16176 : (reg_size == AFL_REG_128) ? 128
16177 : -1;
16178}
16179
b34976b6 16180bfd_boolean
9719ad41 16181_bfd_mips_elf_print_private_bfd_data (bfd *abfd, void *ptr)
b49e97c9 16182{
9719ad41 16183 FILE *file = ptr;
b49e97c9
TS
16184
16185 BFD_ASSERT (abfd != NULL && ptr != NULL);
16186
16187 /* Print normal ELF private data. */
16188 _bfd_elf_print_private_bfd_data (abfd, ptr);
16189
16190 /* xgettext:c-format */
16191 fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
16192
16193 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O32)
16194 fprintf (file, _(" [abi=O32]"));
16195 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O64)
16196 fprintf (file, _(" [abi=O64]"));
16197 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32)
16198 fprintf (file, _(" [abi=EABI32]"));
16199 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64)
16200 fprintf (file, _(" [abi=EABI64]"));
16201 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI))
16202 fprintf (file, _(" [abi unknown]"));
16203 else if (ABI_N32_P (abfd))
16204 fprintf (file, _(" [abi=N32]"));
16205 else if (ABI_64_P (abfd))
16206 fprintf (file, _(" [abi=64]"));
16207 else
16208 fprintf (file, _(" [no abi set]"));
16209
16210 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
ae0d2616 16211 fprintf (file, " [mips1]");
b49e97c9 16212 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
ae0d2616 16213 fprintf (file, " [mips2]");
b49e97c9 16214 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
ae0d2616 16215 fprintf (file, " [mips3]");
b49e97c9 16216 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
ae0d2616 16217 fprintf (file, " [mips4]");
b49e97c9 16218 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_5)
ae0d2616 16219 fprintf (file, " [mips5]");
b49e97c9 16220 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
ae0d2616 16221 fprintf (file, " [mips32]");
b49e97c9 16222 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64)
ae0d2616 16223 fprintf (file, " [mips64]");
af7ee8bf 16224 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2)
ae0d2616 16225 fprintf (file, " [mips32r2]");
5f74bc13 16226 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64R2)
ae0d2616 16227 fprintf (file, " [mips64r2]");
7361da2c
AB
16228 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R6)
16229 fprintf (file, " [mips32r6]");
16230 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64R6)
16231 fprintf (file, " [mips64r6]");
b49e97c9
TS
16232 else
16233 fprintf (file, _(" [unknown ISA]"));
16234
40d32fc6 16235 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
ae0d2616 16236 fprintf (file, " [mdmx]");
40d32fc6
CD
16237
16238 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
ae0d2616 16239 fprintf (file, " [mips16]");
40d32fc6 16240
df58fc94
RS
16241 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
16242 fprintf (file, " [micromips]");
16243
ba92f887
MR
16244 if (elf_elfheader (abfd)->e_flags & EF_MIPS_NAN2008)
16245 fprintf (file, " [nan2008]");
16246
5baf5e34 16247 if (elf_elfheader (abfd)->e_flags & EF_MIPS_FP64)
351cdf24 16248 fprintf (file, " [old fp64]");
5baf5e34 16249
b49e97c9 16250 if (elf_elfheader (abfd)->e_flags & EF_MIPS_32BITMODE)
ae0d2616 16251 fprintf (file, " [32bitmode]");
b49e97c9
TS
16252 else
16253 fprintf (file, _(" [not 32bitmode]"));
16254
c0e3f241 16255 if (elf_elfheader (abfd)->e_flags & EF_MIPS_NOREORDER)
ae0d2616 16256 fprintf (file, " [noreorder]");
c0e3f241
CD
16257
16258 if (elf_elfheader (abfd)->e_flags & EF_MIPS_PIC)
ae0d2616 16259 fprintf (file, " [PIC]");
c0e3f241
CD
16260
16261 if (elf_elfheader (abfd)->e_flags & EF_MIPS_CPIC)
ae0d2616 16262 fprintf (file, " [CPIC]");
c0e3f241
CD
16263
16264 if (elf_elfheader (abfd)->e_flags & EF_MIPS_XGOT)
ae0d2616 16265 fprintf (file, " [XGOT]");
c0e3f241
CD
16266
16267 if (elf_elfheader (abfd)->e_flags & EF_MIPS_UCODE)
ae0d2616 16268 fprintf (file, " [UCODE]");
c0e3f241 16269
b49e97c9
TS
16270 fputc ('\n', file);
16271
351cdf24
MF
16272 if (mips_elf_tdata (abfd)->abiflags_valid)
16273 {
16274 Elf_Internal_ABIFlags_v0 *abiflags = &mips_elf_tdata (abfd)->abiflags;
16275 fprintf (file, "\nMIPS ABI Flags Version: %d\n", abiflags->version);
16276 fprintf (file, "\nISA: MIPS%d", abiflags->isa_level);
16277 if (abiflags->isa_rev > 1)
16278 fprintf (file, "r%d", abiflags->isa_rev);
16279 fprintf (file, "\nGPR size: %d",
16280 get_mips_reg_size (abiflags->gpr_size));
16281 fprintf (file, "\nCPR1 size: %d",
16282 get_mips_reg_size (abiflags->cpr1_size));
16283 fprintf (file, "\nCPR2 size: %d",
16284 get_mips_reg_size (abiflags->cpr2_size));
16285 fputs ("\nFP ABI: ", file);
16286 print_mips_fp_abi_value (file, abiflags->fp_abi);
16287 fputs ("ISA Extension: ", file);
16288 print_mips_isa_ext (file, abiflags->isa_ext);
16289 fputs ("\nASEs:", file);
16290 print_mips_ases (file, abiflags->ases);
16291 fprintf (file, "\nFLAGS 1: %8.8lx", abiflags->flags1);
16292 fprintf (file, "\nFLAGS 2: %8.8lx", abiflags->flags2);
16293 fputc ('\n', file);
16294 }
16295
b34976b6 16296 return TRUE;
b49e97c9 16297}
2f89ff8d 16298
b35d266b 16299const struct bfd_elf_special_section _bfd_mips_elf_special_sections[] =
2f89ff8d 16300{
07d6d2b8
AM
16301 { STRING_COMMA_LEN (".lit4"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16302 { STRING_COMMA_LEN (".lit8"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
0112cd26 16303 { STRING_COMMA_LEN (".mdebug"), 0, SHT_MIPS_DEBUG, 0 },
07d6d2b8 16304 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
0112cd26
NC
16305 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
16306 { STRING_COMMA_LEN (".ucode"), 0, SHT_MIPS_UCODE, 0 },
f16a9783 16307 { STRING_COMMA_LEN (".MIPS.xhash"), 0, SHT_MIPS_XHASH, SHF_ALLOC },
07d6d2b8 16308 { NULL, 0, 0, 0, 0 }
2f89ff8d 16309};
5e2b0d47 16310
8992f0d7
TS
16311/* Merge non visibility st_other attributes. Ensure that the
16312 STO_OPTIONAL flag is copied into h->other, even if this is not a
16313 definiton of the symbol. */
5e2b0d47
NC
16314void
16315_bfd_mips_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
16316 const Elf_Internal_Sym *isym,
16317 bfd_boolean definition,
16318 bfd_boolean dynamic ATTRIBUTE_UNUSED)
16319{
8992f0d7
TS
16320 if ((isym->st_other & ~ELF_ST_VISIBILITY (-1)) != 0)
16321 {
16322 unsigned char other;
16323
16324 other = (definition ? isym->st_other : h->other);
16325 other &= ~ELF_ST_VISIBILITY (-1);
16326 h->other = other | ELF_ST_VISIBILITY (h->other);
16327 }
16328
16329 if (!definition
5e2b0d47
NC
16330 && ELF_MIPS_IS_OPTIONAL (isym->st_other))
16331 h->other |= STO_OPTIONAL;
16332}
12ac1cf5
NC
16333
16334/* Decide whether an undefined symbol is special and can be ignored.
16335 This is the case for OPTIONAL symbols on IRIX. */
16336bfd_boolean
16337_bfd_mips_elf_ignore_undef_symbol (struct elf_link_hash_entry *h)
16338{
16339 return ELF_MIPS_IS_OPTIONAL (h->other) ? TRUE : FALSE;
16340}
e0764319
NC
16341
16342bfd_boolean
16343_bfd_mips_elf_common_definition (Elf_Internal_Sym *sym)
16344{
16345 return (sym->st_shndx == SHN_COMMON
16346 || sym->st_shndx == SHN_MIPS_ACOMMON
16347 || sym->st_shndx == SHN_MIPS_SCOMMON);
16348}
861fb55a
DJ
16349
16350/* Return address for Ith PLT stub in section PLT, for relocation REL
16351 or (bfd_vma) -1 if it should not be included. */
16352
16353bfd_vma
16354_bfd_mips_elf_plt_sym_val (bfd_vma i, const asection *plt,
16355 const arelent *rel ATTRIBUTE_UNUSED)
16356{
16357 return (plt->vma
16358 + 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry)
16359 + i * 4 * ARRAY_SIZE (mips_exec_plt_entry));
16360}
16361
1bbce132
MR
16362/* Build a table of synthetic symbols to represent the PLT. As with MIPS16
16363 and microMIPS PLT slots we may have a many-to-one mapping between .plt
16364 and .got.plt and also the slots may be of a different size each we walk
16365 the PLT manually fetching instructions and matching them against known
16366 patterns. To make things easier standard MIPS slots, if any, always come
16367 first. As we don't create proper ELF symbols we use the UDATA.I member
16368 of ASYMBOL to carry ISA annotation. The encoding used is the same as
16369 with the ST_OTHER member of the ELF symbol. */
16370
16371long
16372_bfd_mips_elf_get_synthetic_symtab (bfd *abfd,
16373 long symcount ATTRIBUTE_UNUSED,
16374 asymbol **syms ATTRIBUTE_UNUSED,
16375 long dynsymcount, asymbol **dynsyms,
16376 asymbol **ret)
16377{
16378 static const char pltname[] = "_PROCEDURE_LINKAGE_TABLE_";
16379 static const char microsuffix[] = "@micromipsplt";
16380 static const char m16suffix[] = "@mips16plt";
16381 static const char mipssuffix[] = "@plt";
16382
16383 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
16384 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
16385 bfd_boolean micromips_p = MICROMIPS_P (abfd);
16386 Elf_Internal_Shdr *hdr;
16387 bfd_byte *plt_data;
16388 bfd_vma plt_offset;
16389 unsigned int other;
16390 bfd_vma entry_size;
16391 bfd_vma plt0_size;
16392 asection *relplt;
16393 bfd_vma opcode;
16394 asection *plt;
16395 asymbol *send;
16396 size_t size;
16397 char *names;
16398 long counti;
16399 arelent *p;
16400 asymbol *s;
16401 char *nend;
16402 long count;
16403 long pi;
16404 long i;
16405 long n;
16406
16407 *ret = NULL;
16408
16409 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0 || dynsymcount <= 0)
16410 return 0;
16411
16412 relplt = bfd_get_section_by_name (abfd, ".rel.plt");
16413 if (relplt == NULL)
16414 return 0;
16415
16416 hdr = &elf_section_data (relplt)->this_hdr;
16417 if (hdr->sh_link != elf_dynsymtab (abfd) || hdr->sh_type != SHT_REL)
16418 return 0;
16419
16420 plt = bfd_get_section_by_name (abfd, ".plt");
16421 if (plt == NULL)
16422 return 0;
16423
16424 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
16425 if (!(*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
16426 return -1;
16427 p = relplt->relocation;
16428
16429 /* Calculating the exact amount of space required for symbols would
16430 require two passes over the PLT, so just pessimise assuming two
16431 PLT slots per relocation. */
16432 count = relplt->size / hdr->sh_entsize;
16433 counti = count * bed->s->int_rels_per_ext_rel;
16434 size = 2 * count * sizeof (asymbol);
16435 size += count * (sizeof (mipssuffix) +
16436 (micromips_p ? sizeof (microsuffix) : sizeof (m16suffix)));
16437 for (pi = 0; pi < counti; pi += bed->s->int_rels_per_ext_rel)
16438 size += 2 * strlen ((*p[pi].sym_ptr_ptr)->name);
16439
16440 /* Add the size of "_PROCEDURE_LINKAGE_TABLE_" too. */
16441 size += sizeof (asymbol) + sizeof (pltname);
16442
16443 if (!bfd_malloc_and_get_section (abfd, plt, &plt_data))
16444 return -1;
16445
16446 if (plt->size < 16)
16447 return -1;
16448
16449 s = *ret = bfd_malloc (size);
16450 if (s == NULL)
16451 return -1;
16452 send = s + 2 * count + 1;
16453
16454 names = (char *) send;
16455 nend = (char *) s + size;
16456 n = 0;
16457
16458 opcode = bfd_get_micromips_32 (abfd, plt_data + 12);
16459 if (opcode == 0x3302fffe)
16460 {
16461 if (!micromips_p)
16462 return -1;
16463 plt0_size = 2 * ARRAY_SIZE (micromips_o32_exec_plt0_entry);
16464 other = STO_MICROMIPS;
16465 }
833794fc
MR
16466 else if (opcode == 0x0398c1d0)
16467 {
16468 if (!micromips_p)
16469 return -1;
16470 plt0_size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry);
16471 other = STO_MICROMIPS;
16472 }
1bbce132
MR
16473 else
16474 {
16475 plt0_size = 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry);
16476 other = 0;
16477 }
16478
16479 s->the_bfd = abfd;
16480 s->flags = BSF_SYNTHETIC | BSF_FUNCTION | BSF_LOCAL;
16481 s->section = plt;
16482 s->value = 0;
16483 s->name = names;
16484 s->udata.i = other;
16485 memcpy (names, pltname, sizeof (pltname));
16486 names += sizeof (pltname);
16487 ++s, ++n;
16488
16489 pi = 0;
16490 for (plt_offset = plt0_size;
16491 plt_offset + 8 <= plt->size && s < send;
16492 plt_offset += entry_size)
16493 {
16494 bfd_vma gotplt_addr;
16495 const char *suffix;
16496 bfd_vma gotplt_hi;
16497 bfd_vma gotplt_lo;
16498 size_t suffixlen;
16499
16500 opcode = bfd_get_micromips_32 (abfd, plt_data + plt_offset + 4);
16501
16502 /* Check if the second word matches the expected MIPS16 instruction. */
16503 if (opcode == 0x651aeb00)
16504 {
16505 if (micromips_p)
16506 return -1;
16507 /* Truncated table??? */
16508 if (plt_offset + 16 > plt->size)
16509 break;
16510 gotplt_addr = bfd_get_32 (abfd, plt_data + plt_offset + 12);
16511 entry_size = 2 * ARRAY_SIZE (mips16_o32_exec_plt_entry);
16512 suffixlen = sizeof (m16suffix);
16513 suffix = m16suffix;
16514 other = STO_MIPS16;
16515 }
833794fc 16516 /* Likewise the expected microMIPS instruction (no insn32 mode). */
1bbce132
MR
16517 else if (opcode == 0xff220000)
16518 {
16519 if (!micromips_p)
16520 return -1;
16521 gotplt_hi = bfd_get_16 (abfd, plt_data + plt_offset) & 0x7f;
16522 gotplt_lo = bfd_get_16 (abfd, plt_data + plt_offset + 2) & 0xffff;
16523 gotplt_hi = ((gotplt_hi ^ 0x40) - 0x40) << 18;
16524 gotplt_lo <<= 2;
16525 gotplt_addr = gotplt_hi + gotplt_lo;
16526 gotplt_addr += ((plt->vma + plt_offset) | 3) ^ 3;
16527 entry_size = 2 * ARRAY_SIZE (micromips_o32_exec_plt_entry);
16528 suffixlen = sizeof (microsuffix);
16529 suffix = microsuffix;
16530 other = STO_MICROMIPS;
16531 }
833794fc
MR
16532 /* Likewise the expected microMIPS instruction (insn32 mode). */
16533 else if ((opcode & 0xffff0000) == 0xff2f0000)
16534 {
16535 gotplt_hi = bfd_get_16 (abfd, plt_data + plt_offset + 2) & 0xffff;
16536 gotplt_lo = bfd_get_16 (abfd, plt_data + plt_offset + 6) & 0xffff;
16537 gotplt_hi = ((gotplt_hi ^ 0x8000) - 0x8000) << 16;
16538 gotplt_lo = (gotplt_lo ^ 0x8000) - 0x8000;
16539 gotplt_addr = gotplt_hi + gotplt_lo;
16540 entry_size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt_entry);
16541 suffixlen = sizeof (microsuffix);
16542 suffix = microsuffix;
16543 other = STO_MICROMIPS;
16544 }
1bbce132
MR
16545 /* Otherwise assume standard MIPS code. */
16546 else
16547 {
16548 gotplt_hi = bfd_get_32 (abfd, plt_data + plt_offset) & 0xffff;
16549 gotplt_lo = bfd_get_32 (abfd, plt_data + plt_offset + 4) & 0xffff;
16550 gotplt_hi = ((gotplt_hi ^ 0x8000) - 0x8000) << 16;
16551 gotplt_lo = (gotplt_lo ^ 0x8000) - 0x8000;
16552 gotplt_addr = gotplt_hi + gotplt_lo;
16553 entry_size = 4 * ARRAY_SIZE (mips_exec_plt_entry);
16554 suffixlen = sizeof (mipssuffix);
16555 suffix = mipssuffix;
16556 other = 0;
16557 }
16558 /* Truncated table??? */
16559 if (plt_offset + entry_size > plt->size)
16560 break;
16561
16562 for (i = 0;
16563 i < count && p[pi].address != gotplt_addr;
16564 i++, pi = (pi + bed->s->int_rels_per_ext_rel) % counti);
16565
16566 if (i < count)
16567 {
16568 size_t namelen;
16569 size_t len;
16570
16571 *s = **p[pi].sym_ptr_ptr;
16572 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
16573 we are defining a symbol, ensure one of them is set. */
16574 if ((s->flags & BSF_LOCAL) == 0)
16575 s->flags |= BSF_GLOBAL;
16576 s->flags |= BSF_SYNTHETIC;
16577 s->section = plt;
16578 s->value = plt_offset;
16579 s->name = names;
16580 s->udata.i = other;
16581
16582 len = strlen ((*p[pi].sym_ptr_ptr)->name);
16583 namelen = len + suffixlen;
16584 if (names + namelen > nend)
16585 break;
16586
16587 memcpy (names, (*p[pi].sym_ptr_ptr)->name, len);
16588 names += len;
16589 memcpy (names, suffix, suffixlen);
16590 names += suffixlen;
16591
16592 ++s, ++n;
16593 pi = (pi + bed->s->int_rels_per_ext_rel) % counti;
16594 }
16595 }
16596
16597 free (plt_data);
16598
16599 return n;
16600}
16601
5e7fc731
MR
16602/* Return the ABI flags associated with ABFD if available. */
16603
16604Elf_Internal_ABIFlags_v0 *
16605bfd_mips_elf_get_abiflags (bfd *abfd)
16606{
16607 struct mips_elf_obj_tdata *tdata = mips_elf_tdata (abfd);
16608
16609 return tdata->abiflags_valid ? &tdata->abiflags : NULL;
16610}
16611
bb29b84d
MR
16612/* MIPS libc ABI versions, used with the EI_ABIVERSION ELF file header
16613 field. Taken from `libc-abis.h' generated at GNU libc build time.
16614 Using a MIPS_ prefix as other libc targets use different values. */
16615enum
16616{
16617 MIPS_LIBC_ABI_DEFAULT = 0,
16618 MIPS_LIBC_ABI_MIPS_PLT,
16619 MIPS_LIBC_ABI_UNIQUE,
16620 MIPS_LIBC_ABI_MIPS_O32_FP64,
47275900 16621 MIPS_LIBC_ABI_ABSOLUTE,
f16a9783 16622 MIPS_LIBC_ABI_XHASH,
bb29b84d
MR
16623 MIPS_LIBC_ABI_MAX
16624};
16625
ed7e9d0b
AM
16626bfd_boolean
16627_bfd_mips_init_file_header (bfd *abfd, struct bfd_link_info *link_info)
861fb55a 16628{
47275900 16629 struct mips_elf_link_hash_table *htab = NULL;
861fb55a
DJ
16630 Elf_Internal_Ehdr *i_ehdrp;
16631
ed7e9d0b
AM
16632 if (!_bfd_elf_init_file_header (abfd, link_info))
16633 return FALSE;
16634
861fb55a
DJ
16635 i_ehdrp = elf_elfheader (abfd);
16636 if (link_info)
16637 {
16638 htab = mips_elf_hash_table (link_info);
4dfe6ac6 16639 BFD_ASSERT (htab != NULL);
861fb55a 16640 }
0af03126 16641
47275900
MR
16642 if (htab != NULL && htab->use_plts_and_copy_relocs && !htab->is_vxworks)
16643 i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_MIPS_PLT;
16644
351cdf24
MF
16645 if (mips_elf_tdata (abfd)->abiflags.fp_abi == Val_GNU_MIPS_ABI_FP_64
16646 || mips_elf_tdata (abfd)->abiflags.fp_abi == Val_GNU_MIPS_ABI_FP_64A)
bb29b84d 16647 i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_MIPS_O32_FP64;
334cd8a7 16648
47275900
MR
16649 /* Mark that we need support for absolute symbols in the dynamic loader. */
16650 if (htab != NULL && htab->use_absolute_zero && htab->gnu_target)
16651 i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_ABSOLUTE;
16652
f16a9783
MS
16653 /* Mark that we need support for .MIPS.xhash in the dynamic linker,
16654 if it is the only hash section that will be created. */
16655 if (link_info && link_info->emit_gnu_hash && !link_info->emit_hash)
16656 i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_XHASH;
ed7e9d0b 16657 return TRUE;
861fb55a 16658}
2f0c68f2
CM
16659
16660int
1ced1a5f
MR
16661_bfd_mips_elf_compact_eh_encoding
16662 (struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
2f0c68f2
CM
16663{
16664 return DW_EH_PE_pcrel | DW_EH_PE_sdata4;
16665}
16666
16667/* Return the opcode for can't unwind. */
16668
16669int
1ced1a5f
MR
16670_bfd_mips_elf_cant_unwind_opcode
16671 (struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
2f0c68f2
CM
16672{
16673 return COMPACT_EH_CANT_UNWIND_OPCODE;
16674}
f16a9783
MS
16675
16676/* Record a position XLAT_LOC in the xlat translation table, associated with
16677 the hash entry H. The entry in the translation table will later be
16678 populated with the real symbol dynindx. */
16679
16680void
16681_bfd_mips_elf_record_xhash_symbol (struct elf_link_hash_entry *h,
16682 bfd_vma xlat_loc)
16683{
16684 struct mips_elf_link_hash_entry *hmips;
16685
16686 hmips = (struct mips_elf_link_hash_entry *) h;
16687 hmips->mipsxhash_loc = xlat_loc;
16688}