]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elfxx-mips.c
Delete unused ada-exp.y:string_to_operator
[thirdparty/binutils-gdb.git] / bfd / elfxx-mips.c
CommitLineData
b49e97c9 1/* MIPS-specific support for ELF
a253d456 2 Copyright 1993-2013 Free Software Foundation, Inc.
b49e97c9
TS
3
4 Most of the information added by Ian Lance Taylor, Cygnus Support,
5 <ian@cygnus.com>.
6 N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
7 <mark@codesourcery.com>
8 Traditional MIPS targets support added by Koundinya.K, Dansk Data
9 Elektronik & Operations Research Group. <kk@ddeorg.soft.net>
10
ae9a127f 11 This file is part of BFD, the Binary File Descriptor library.
b49e97c9 12
ae9a127f
NC
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
cd123cb7 15 the Free Software Foundation; either version 3 of the License, or
ae9a127f 16 (at your option) any later version.
b49e97c9 17
ae9a127f
NC
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
b49e97c9 22
ae9a127f
NC
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
cd123cb7
NC
25 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
26 MA 02110-1301, USA. */
27
b49e97c9
TS
28
29/* This file handles functionality common to the different MIPS ABI's. */
30
b49e97c9 31#include "sysdep.h"
3db64b00 32#include "bfd.h"
b49e97c9 33#include "libbfd.h"
64543e1a 34#include "libiberty.h"
b49e97c9
TS
35#include "elf-bfd.h"
36#include "elfxx-mips.h"
37#include "elf/mips.h"
0a44bf69 38#include "elf-vxworks.h"
b49e97c9
TS
39
40/* Get the ECOFF swapping routines. */
41#include "coff/sym.h"
42#include "coff/symconst.h"
43#include "coff/ecoff.h"
44#include "coff/mips.h"
45
b15e6682
AO
46#include "hashtab.h"
47
9ab066b4
RS
48/* Types of TLS GOT entry. */
49enum mips_got_tls_type {
50 GOT_TLS_NONE,
51 GOT_TLS_GD,
52 GOT_TLS_LDM,
53 GOT_TLS_IE
54};
55
ead49a57 56/* This structure is used to hold information about one GOT entry.
3dff0dd1
RS
57 There are four types of entry:
58
59 (1) an absolute address
60 requires: abfd == NULL
61 fields: d.address
62
63 (2) a SYMBOL + OFFSET address, where SYMBOL is local to an input bfd
64 requires: abfd != NULL, symndx >= 0, tls_type != GOT_TLS_LDM
65 fields: abfd, symndx, d.addend, tls_type
66
67 (3) a SYMBOL address, where SYMBOL is not local to an input bfd
68 requires: abfd != NULL, symndx == -1
69 fields: d.h, tls_type
70
71 (4) a TLS LDM slot
72 requires: abfd != NULL, symndx == 0, tls_type == GOT_TLS_LDM
73 fields: none; there's only one of these per GOT. */
b15e6682
AO
74struct mips_got_entry
75{
3dff0dd1 76 /* One input bfd that needs the GOT entry. */
b15e6682 77 bfd *abfd;
f4416af6
AO
78 /* The index of the symbol, as stored in the relocation r_info, if
79 we have a local symbol; -1 otherwise. */
80 long symndx;
81 union
82 {
83 /* If abfd == NULL, an address that must be stored in the got. */
84 bfd_vma address;
85 /* If abfd != NULL && symndx != -1, the addend of the relocation
86 that should be added to the symbol value. */
87 bfd_vma addend;
88 /* If abfd != NULL && symndx == -1, the hash table entry
3dff0dd1 89 corresponding to a symbol in the GOT. The symbol's entry
020d7251
RS
90 is in the local area if h->global_got_area is GGA_NONE,
91 otherwise it is in the global area. */
f4416af6
AO
92 struct mips_elf_link_hash_entry *h;
93 } d;
0f20cc35 94
9ab066b4
RS
95 /* The TLS type of this GOT entry. An LDM GOT entry will be a local
96 symbol entry with r_symndx == 0. */
0f20cc35
DJ
97 unsigned char tls_type;
98
9ab066b4
RS
99 /* True if we have filled in the GOT contents for a TLS entry,
100 and created the associated relocations. */
101 unsigned char tls_initialized;
102
b15e6682 103 /* The offset from the beginning of the .got section to the entry
f4416af6
AO
104 corresponding to this symbol+addend. If it's a global symbol
105 whose offset is yet to be decided, it's going to be -1. */
106 long gotidx;
b15e6682
AO
107};
108
13db6b44
RS
109/* This structure represents a GOT page reference from an input bfd.
110 Each instance represents a symbol + ADDEND, where the representation
111 of the symbol depends on whether it is local to the input bfd.
112 If it is, then SYMNDX >= 0, and the symbol has index SYMNDX in U.ABFD.
113 Otherwise, SYMNDX < 0 and U.H points to the symbol's hash table entry.
114
115 Page references with SYMNDX >= 0 always become page references
116 in the output. Page references with SYMNDX < 0 only become page
117 references if the symbol binds locally; in other cases, the page
118 reference decays to a global GOT reference. */
119struct mips_got_page_ref
120{
121 long symndx;
122 union
123 {
124 struct mips_elf_link_hash_entry *h;
125 bfd *abfd;
126 } u;
127 bfd_vma addend;
128};
129
c224138d
RS
130/* This structure describes a range of addends: [MIN_ADDEND, MAX_ADDEND].
131 The structures form a non-overlapping list that is sorted by increasing
132 MIN_ADDEND. */
133struct mips_got_page_range
134{
135 struct mips_got_page_range *next;
136 bfd_signed_vma min_addend;
137 bfd_signed_vma max_addend;
138};
139
140/* This structure describes the range of addends that are applied to page
13db6b44 141 relocations against a given section. */
c224138d
RS
142struct mips_got_page_entry
143{
13db6b44
RS
144 /* The section that these entries are based on. */
145 asection *sec;
c224138d
RS
146 /* The ranges for this page entry. */
147 struct mips_got_page_range *ranges;
148 /* The maximum number of page entries needed for RANGES. */
149 bfd_vma num_pages;
150};
151
f0abc2a1 152/* This structure is used to hold .got information when linking. */
b49e97c9
TS
153
154struct mips_got_info
155{
b49e97c9
TS
156 /* The number of global .got entries. */
157 unsigned int global_gotno;
23cc69b6
RS
158 /* The number of global .got entries that are in the GGA_RELOC_ONLY area. */
159 unsigned int reloc_only_gotno;
0f20cc35
DJ
160 /* The number of .got slots used for TLS. */
161 unsigned int tls_gotno;
162 /* The first unused TLS .got entry. Used only during
163 mips_elf_initialize_tls_index. */
164 unsigned int tls_assigned_gotno;
c224138d 165 /* The number of local .got entries, eventually including page entries. */
b49e97c9 166 unsigned int local_gotno;
c224138d
RS
167 /* The maximum number of page entries needed. */
168 unsigned int page_gotno;
ab361d49
RS
169 /* The number of relocations needed for the GOT entries. */
170 unsigned int relocs;
b49e97c9
TS
171 /* The number of local .got entries we have used. */
172 unsigned int assigned_gotno;
b15e6682
AO
173 /* A hash table holding members of the got. */
174 struct htab *got_entries;
13db6b44
RS
175 /* A hash table holding mips_got_page_ref structures. */
176 struct htab *got_page_refs;
c224138d
RS
177 /* A hash table of mips_got_page_entry structures. */
178 struct htab *got_page_entries;
f4416af6
AO
179 /* In multi-got links, a pointer to the next got (err, rather, most
180 of the time, it points to the previous got). */
181 struct mips_got_info *next;
182};
183
d7206569 184/* Structure passed when merging bfds' gots. */
f4416af6
AO
185
186struct mips_elf_got_per_bfd_arg
187{
f4416af6
AO
188 /* The output bfd. */
189 bfd *obfd;
190 /* The link information. */
191 struct bfd_link_info *info;
192 /* A pointer to the primary got, i.e., the one that's going to get
193 the implicit relocations from DT_MIPS_LOCAL_GOTNO and
194 DT_MIPS_GOTSYM. */
195 struct mips_got_info *primary;
196 /* A non-primary got we're trying to merge with other input bfd's
197 gots. */
198 struct mips_got_info *current;
199 /* The maximum number of got entries that can be addressed with a
200 16-bit offset. */
201 unsigned int max_count;
c224138d
RS
202 /* The maximum number of page entries needed by each got. */
203 unsigned int max_pages;
0f20cc35
DJ
204 /* The total number of global entries which will live in the
205 primary got and be automatically relocated. This includes
206 those not referenced by the primary GOT but included in
207 the "master" GOT. */
208 unsigned int global_count;
f4416af6
AO
209};
210
ab361d49
RS
211/* A structure used to pass information to htab_traverse callbacks
212 when laying out the GOT. */
f4416af6 213
ab361d49 214struct mips_elf_traverse_got_arg
f4416af6 215{
ab361d49 216 struct bfd_link_info *info;
f4416af6
AO
217 struct mips_got_info *g;
218 int value;
0f20cc35
DJ
219};
220
f0abc2a1
AM
221struct _mips_elf_section_data
222{
223 struct bfd_elf_section_data elf;
224 union
225 {
f0abc2a1
AM
226 bfd_byte *tdata;
227 } u;
228};
229
230#define mips_elf_section_data(sec) \
68bfbfcc 231 ((struct _mips_elf_section_data *) elf_section_data (sec))
f0abc2a1 232
d5eaccd7
RS
233#define is_mips_elf(bfd) \
234 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
235 && elf_tdata (bfd) != NULL \
4dfe6ac6 236 && elf_object_id (bfd) == MIPS_ELF_DATA)
d5eaccd7 237
634835ae
RS
238/* The ABI says that every symbol used by dynamic relocations must have
239 a global GOT entry. Among other things, this provides the dynamic
240 linker with a free, directly-indexed cache. The GOT can therefore
241 contain symbols that are not referenced by GOT relocations themselves
242 (in other words, it may have symbols that are not referenced by things
243 like R_MIPS_GOT16 and R_MIPS_GOT_PAGE).
244
245 GOT relocations are less likely to overflow if we put the associated
246 GOT entries towards the beginning. We therefore divide the global
247 GOT entries into two areas: "normal" and "reloc-only". Entries in
248 the first area can be used for both dynamic relocations and GP-relative
249 accesses, while those in the "reloc-only" area are for dynamic
250 relocations only.
251
252 These GGA_* ("Global GOT Area") values are organised so that lower
253 values are more general than higher values. Also, non-GGA_NONE
254 values are ordered by the position of the area in the GOT. */
255#define GGA_NORMAL 0
256#define GGA_RELOC_ONLY 1
257#define GGA_NONE 2
258
861fb55a
DJ
259/* Information about a non-PIC interface to a PIC function. There are
260 two ways of creating these interfaces. The first is to add:
261
262 lui $25,%hi(func)
263 addiu $25,$25,%lo(func)
264
265 immediately before a PIC function "func". The second is to add:
266
267 lui $25,%hi(func)
268 j func
269 addiu $25,$25,%lo(func)
270
271 to a separate trampoline section.
272
273 Stubs of the first kind go in a new section immediately before the
274 target function. Stubs of the second kind go in a single section
275 pointed to by the hash table's "strampoline" field. */
276struct mips_elf_la25_stub {
277 /* The generated section that contains this stub. */
278 asection *stub_section;
279
280 /* The offset of the stub from the start of STUB_SECTION. */
281 bfd_vma offset;
282
283 /* One symbol for the original function. Its location is available
284 in H->root.root.u.def. */
285 struct mips_elf_link_hash_entry *h;
286};
287
288/* Macros for populating a mips_elf_la25_stub. */
289
290#define LA25_LUI(VAL) (0x3c190000 | (VAL)) /* lui t9,VAL */
291#define LA25_J(VAL) (0x08000000 | (((VAL) >> 2) & 0x3ffffff)) /* j VAL */
292#define LA25_ADDIU(VAL) (0x27390000 | (VAL)) /* addiu t9,t9,VAL */
d21911ea
MR
293#define LA25_LUI_MICROMIPS(VAL) \
294 (0x41b90000 | (VAL)) /* lui t9,VAL */
295#define LA25_J_MICROMIPS(VAL) \
296 (0xd4000000 | (((VAL) >> 1) & 0x3ffffff)) /* j VAL */
297#define LA25_ADDIU_MICROMIPS(VAL) \
298 (0x33390000 | (VAL)) /* addiu t9,t9,VAL */
861fb55a 299
b49e97c9
TS
300/* This structure is passed to mips_elf_sort_hash_table_f when sorting
301 the dynamic symbols. */
302
303struct mips_elf_hash_sort_data
304{
305 /* The symbol in the global GOT with the lowest dynamic symbol table
306 index. */
307 struct elf_link_hash_entry *low;
0f20cc35
DJ
308 /* The least dynamic symbol table index corresponding to a non-TLS
309 symbol with a GOT entry. */
b49e97c9 310 long min_got_dynindx;
f4416af6
AO
311 /* The greatest dynamic symbol table index corresponding to a symbol
312 with a GOT entry that is not referenced (e.g., a dynamic symbol
9e4aeb93 313 with dynamic relocations pointing to it from non-primary GOTs). */
f4416af6 314 long max_unref_got_dynindx;
b49e97c9
TS
315 /* The greatest dynamic symbol table index not corresponding to a
316 symbol without a GOT entry. */
317 long max_non_got_dynindx;
318};
319
1bbce132
MR
320/* We make up to two PLT entries if needed, one for standard MIPS code
321 and one for compressed code, either a MIPS16 or microMIPS one. We
322 keep a separate record of traditional lazy-binding stubs, for easier
323 processing. */
324
325struct plt_entry
326{
327 /* Traditional SVR4 stub offset, or -1 if none. */
328 bfd_vma stub_offset;
329
330 /* Standard PLT entry offset, or -1 if none. */
331 bfd_vma mips_offset;
332
333 /* Compressed PLT entry offset, or -1 if none. */
334 bfd_vma comp_offset;
335
336 /* The corresponding .got.plt index, or -1 if none. */
337 bfd_vma gotplt_index;
338
339 /* Whether we need a standard PLT entry. */
340 unsigned int need_mips : 1;
341
342 /* Whether we need a compressed PLT entry. */
343 unsigned int need_comp : 1;
344};
345
b49e97c9
TS
346/* The MIPS ELF linker needs additional information for each symbol in
347 the global hash table. */
348
349struct mips_elf_link_hash_entry
350{
351 struct elf_link_hash_entry root;
352
353 /* External symbol information. */
354 EXTR esym;
355
861fb55a
DJ
356 /* The la25 stub we have created for ths symbol, if any. */
357 struct mips_elf_la25_stub *la25_stub;
358
b49e97c9
TS
359 /* Number of R_MIPS_32, R_MIPS_REL32, or R_MIPS_64 relocs against
360 this symbol. */
361 unsigned int possibly_dynamic_relocs;
362
b49e97c9
TS
363 /* If there is a stub that 32 bit functions should use to call this
364 16 bit function, this points to the section containing the stub. */
365 asection *fn_stub;
366
b49e97c9
TS
367 /* If there is a stub that 16 bit functions should use to call this
368 32 bit function, this points to the section containing the stub. */
369 asection *call_stub;
370
371 /* This is like the call_stub field, but it is used if the function
372 being called returns a floating point value. */
373 asection *call_fp_stub;
7c5fcef7 374
634835ae
RS
375 /* The highest GGA_* value that satisfies all references to this symbol. */
376 unsigned int global_got_area : 2;
377
6ccf4795
RS
378 /* True if all GOT relocations against this symbol are for calls. This is
379 a looser condition than no_fn_stub below, because there may be other
380 non-call non-GOT relocations against the symbol. */
381 unsigned int got_only_for_calls : 1;
382
71782a75
RS
383 /* True if one of the relocations described by possibly_dynamic_relocs
384 is against a readonly section. */
385 unsigned int readonly_reloc : 1;
386
861fb55a
DJ
387 /* True if there is a relocation against this symbol that must be
388 resolved by the static linker (in other words, if the relocation
389 cannot possibly be made dynamic). */
390 unsigned int has_static_relocs : 1;
391
71782a75
RS
392 /* True if we must not create a .MIPS.stubs entry for this symbol.
393 This is set, for example, if there are relocations related to
394 taking the function's address, i.e. any but R_MIPS_CALL*16 ones.
395 See "MIPS ABI Supplement, 3rd Edition", p. 4-20. */
396 unsigned int no_fn_stub : 1;
397
398 /* Whether we need the fn_stub; this is true if this symbol appears
399 in any relocs other than a 16 bit call. */
400 unsigned int need_fn_stub : 1;
401
861fb55a
DJ
402 /* True if this symbol is referenced by branch relocations from
403 any non-PIC input file. This is used to determine whether an
404 la25 stub is required. */
405 unsigned int has_nonpic_branches : 1;
33bb52fb
RS
406
407 /* Does this symbol need a traditional MIPS lazy-binding stub
408 (as opposed to a PLT entry)? */
409 unsigned int needs_lazy_stub : 1;
1bbce132
MR
410
411 /* Does this symbol resolve to a PLT entry? */
412 unsigned int use_plt_entry : 1;
b49e97c9
TS
413};
414
415/* MIPS ELF linker hash table. */
416
417struct mips_elf_link_hash_table
418{
419 struct elf_link_hash_table root;
861fb55a 420
b49e97c9
TS
421 /* The number of .rtproc entries. */
422 bfd_size_type procedure_count;
861fb55a 423
b49e97c9
TS
424 /* The size of the .compact_rel section (if SGI_COMPAT). */
425 bfd_size_type compact_rel_size;
861fb55a 426
e6aea42d
MR
427 /* This flag indicates that the value of DT_MIPS_RLD_MAP dynamic entry
428 is set to the address of __rld_obj_head as in IRIX5 and IRIX6. */
b34976b6 429 bfd_boolean use_rld_obj_head;
861fb55a 430
b4082c70
DD
431 /* The __rld_map or __rld_obj_head symbol. */
432 struct elf_link_hash_entry *rld_symbol;
861fb55a 433
b49e97c9 434 /* This is set if we see any mips16 stub sections. */
b34976b6 435 bfd_boolean mips16_stubs_seen;
861fb55a
DJ
436
437 /* True if we can generate copy relocs and PLTs. */
438 bfd_boolean use_plts_and_copy_relocs;
439
833794fc
MR
440 /* True if we can only use 32-bit microMIPS instructions. */
441 bfd_boolean insn32;
442
0a44bf69
RS
443 /* True if we're generating code for VxWorks. */
444 bfd_boolean is_vxworks;
861fb55a 445
0e53d9da
AN
446 /* True if we already reported the small-data section overflow. */
447 bfd_boolean small_data_overflow_reported;
861fb55a 448
0a44bf69
RS
449 /* Shortcuts to some dynamic sections, or NULL if they are not
450 being used. */
451 asection *srelbss;
452 asection *sdynbss;
453 asection *srelplt;
454 asection *srelplt2;
455 asection *sgotplt;
456 asection *splt;
4e41d0d7 457 asection *sstubs;
a8028dd0 458 asection *sgot;
861fb55a 459
a8028dd0
RS
460 /* The master GOT information. */
461 struct mips_got_info *got_info;
861fb55a 462
d222d210
RS
463 /* The global symbol in the GOT with the lowest index in the dynamic
464 symbol table. */
465 struct elf_link_hash_entry *global_gotsym;
466
861fb55a 467 /* The size of the PLT header in bytes. */
0a44bf69 468 bfd_vma plt_header_size;
861fb55a 469
1bbce132
MR
470 /* The size of a standard PLT entry in bytes. */
471 bfd_vma plt_mips_entry_size;
472
473 /* The size of a compressed PLT entry in bytes. */
474 bfd_vma plt_comp_entry_size;
475
476 /* The offset of the next standard PLT entry to create. */
477 bfd_vma plt_mips_offset;
478
479 /* The offset of the next compressed PLT entry to create. */
480 bfd_vma plt_comp_offset;
481
482 /* The index of the next .got.plt entry to create. */
483 bfd_vma plt_got_index;
861fb55a 484
33bb52fb
RS
485 /* The number of functions that need a lazy-binding stub. */
486 bfd_vma lazy_stub_count;
861fb55a 487
5108fc1b
RS
488 /* The size of a function stub entry in bytes. */
489 bfd_vma function_stub_size;
861fb55a
DJ
490
491 /* The number of reserved entries at the beginning of the GOT. */
492 unsigned int reserved_gotno;
493
494 /* The section used for mips_elf_la25_stub trampolines.
495 See the comment above that structure for details. */
496 asection *strampoline;
497
498 /* A table of mips_elf_la25_stubs, indexed by (input_section, offset)
499 pairs. */
500 htab_t la25_stubs;
501
502 /* A function FN (NAME, IS, OS) that creates a new input section
503 called NAME and links it to output section OS. If IS is nonnull,
504 the new section should go immediately before it, otherwise it
505 should go at the (current) beginning of OS.
506
507 The function returns the new section on success, otherwise it
508 returns null. */
509 asection *(*add_stub_section) (const char *, asection *, asection *);
13db6b44
RS
510
511 /* Small local sym cache. */
512 struct sym_cache sym_cache;
1bbce132
MR
513
514 /* Is the PLT header compressed? */
515 unsigned int plt_header_is_comp : 1;
861fb55a
DJ
516};
517
4dfe6ac6
NC
518/* Get the MIPS ELF linker hash table from a link_info structure. */
519
520#define mips_elf_hash_table(p) \
521 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
522 == MIPS_ELF_DATA ? ((struct mips_elf_link_hash_table *) ((p)->hash)) : NULL)
523
861fb55a 524/* A structure used to communicate with htab_traverse callbacks. */
4dfe6ac6
NC
525struct mips_htab_traverse_info
526{
861fb55a
DJ
527 /* The usual link-wide information. */
528 struct bfd_link_info *info;
529 bfd *output_bfd;
530
531 /* Starts off FALSE and is set to TRUE if the link should be aborted. */
532 bfd_boolean error;
b49e97c9
TS
533};
534
6ae68ba3
MR
535/* MIPS ELF private object data. */
536
537struct mips_elf_obj_tdata
538{
539 /* Generic ELF private object data. */
540 struct elf_obj_tdata root;
541
542 /* Input BFD providing Tag_GNU_MIPS_ABI_FP attribute for output. */
543 bfd *abi_fp_bfd;
ee227692
RS
544
545 /* The GOT requirements of input bfds. */
546 struct mips_got_info *got;
698600e4
AM
547
548 /* Used by _bfd_mips_elf_find_nearest_line. The structure could be
549 included directly in this one, but there's no point to wasting
550 the memory just for the infrequently called find_nearest_line. */
551 struct mips_elf_find_line *find_line_info;
552
553 /* An array of stub sections indexed by symbol number. */
554 asection **local_stubs;
555 asection **local_call_stubs;
556
557 /* The Irix 5 support uses two virtual sections, which represent
558 text/data symbols defined in dynamic objects. */
559 asymbol *elf_data_symbol;
560 asymbol *elf_text_symbol;
561 asection *elf_data_section;
562 asection *elf_text_section;
6ae68ba3
MR
563};
564
565/* Get MIPS ELF private object data from BFD's tdata. */
566
567#define mips_elf_tdata(bfd) \
568 ((struct mips_elf_obj_tdata *) (bfd)->tdata.any)
569
0f20cc35
DJ
570#define TLS_RELOC_P(r_type) \
571 (r_type == R_MIPS_TLS_DTPMOD32 \
572 || r_type == R_MIPS_TLS_DTPMOD64 \
573 || r_type == R_MIPS_TLS_DTPREL32 \
574 || r_type == R_MIPS_TLS_DTPREL64 \
575 || r_type == R_MIPS_TLS_GD \
576 || r_type == R_MIPS_TLS_LDM \
577 || r_type == R_MIPS_TLS_DTPREL_HI16 \
578 || r_type == R_MIPS_TLS_DTPREL_LO16 \
579 || r_type == R_MIPS_TLS_GOTTPREL \
580 || r_type == R_MIPS_TLS_TPREL32 \
581 || r_type == R_MIPS_TLS_TPREL64 \
582 || r_type == R_MIPS_TLS_TPREL_HI16 \
df58fc94 583 || r_type == R_MIPS_TLS_TPREL_LO16 \
d0f13682
CLT
584 || r_type == R_MIPS16_TLS_GD \
585 || r_type == R_MIPS16_TLS_LDM \
586 || r_type == R_MIPS16_TLS_DTPREL_HI16 \
587 || r_type == R_MIPS16_TLS_DTPREL_LO16 \
588 || r_type == R_MIPS16_TLS_GOTTPREL \
589 || r_type == R_MIPS16_TLS_TPREL_HI16 \
590 || r_type == R_MIPS16_TLS_TPREL_LO16 \
df58fc94
RS
591 || r_type == R_MICROMIPS_TLS_GD \
592 || r_type == R_MICROMIPS_TLS_LDM \
593 || r_type == R_MICROMIPS_TLS_DTPREL_HI16 \
594 || r_type == R_MICROMIPS_TLS_DTPREL_LO16 \
595 || r_type == R_MICROMIPS_TLS_GOTTPREL \
596 || r_type == R_MICROMIPS_TLS_TPREL_HI16 \
597 || r_type == R_MICROMIPS_TLS_TPREL_LO16)
0f20cc35 598
b49e97c9
TS
599/* Structure used to pass information to mips_elf_output_extsym. */
600
601struct extsym_info
602{
9e4aeb93
RS
603 bfd *abfd;
604 struct bfd_link_info *info;
b49e97c9
TS
605 struct ecoff_debug_info *debug;
606 const struct ecoff_debug_swap *swap;
b34976b6 607 bfd_boolean failed;
b49e97c9
TS
608};
609
8dc1a139 610/* The names of the runtime procedure table symbols used on IRIX5. */
b49e97c9
TS
611
612static const char * const mips_elf_dynsym_rtproc_names[] =
613{
614 "_procedure_table",
615 "_procedure_string_table",
616 "_procedure_table_size",
617 NULL
618};
619
620/* These structures are used to generate the .compact_rel section on
8dc1a139 621 IRIX5. */
b49e97c9
TS
622
623typedef struct
624{
625 unsigned long id1; /* Always one? */
626 unsigned long num; /* Number of compact relocation entries. */
627 unsigned long id2; /* Always two? */
628 unsigned long offset; /* The file offset of the first relocation. */
629 unsigned long reserved0; /* Zero? */
630 unsigned long reserved1; /* Zero? */
631} Elf32_compact_rel;
632
633typedef struct
634{
635 bfd_byte id1[4];
636 bfd_byte num[4];
637 bfd_byte id2[4];
638 bfd_byte offset[4];
639 bfd_byte reserved0[4];
640 bfd_byte reserved1[4];
641} Elf32_External_compact_rel;
642
643typedef struct
644{
645 unsigned int ctype : 1; /* 1: long 0: short format. See below. */
646 unsigned int rtype : 4; /* Relocation types. See below. */
647 unsigned int dist2to : 8;
648 unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
649 unsigned long konst; /* KONST field. See below. */
650 unsigned long vaddr; /* VADDR to be relocated. */
651} Elf32_crinfo;
652
653typedef struct
654{
655 unsigned int ctype : 1; /* 1: long 0: short format. See below. */
656 unsigned int rtype : 4; /* Relocation types. See below. */
657 unsigned int dist2to : 8;
658 unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
659 unsigned long konst; /* KONST field. See below. */
660} Elf32_crinfo2;
661
662typedef struct
663{
664 bfd_byte info[4];
665 bfd_byte konst[4];
666 bfd_byte vaddr[4];
667} Elf32_External_crinfo;
668
669typedef struct
670{
671 bfd_byte info[4];
672 bfd_byte konst[4];
673} Elf32_External_crinfo2;
674
675/* These are the constants used to swap the bitfields in a crinfo. */
676
677#define CRINFO_CTYPE (0x1)
678#define CRINFO_CTYPE_SH (31)
679#define CRINFO_RTYPE (0xf)
680#define CRINFO_RTYPE_SH (27)
681#define CRINFO_DIST2TO (0xff)
682#define CRINFO_DIST2TO_SH (19)
683#define CRINFO_RELVADDR (0x7ffff)
684#define CRINFO_RELVADDR_SH (0)
685
686/* A compact relocation info has long (3 words) or short (2 words)
687 formats. A short format doesn't have VADDR field and relvaddr
688 fields contains ((VADDR - vaddr of the previous entry) >> 2). */
689#define CRF_MIPS_LONG 1
690#define CRF_MIPS_SHORT 0
691
692/* There are 4 types of compact relocation at least. The value KONST
693 has different meaning for each type:
694
695 (type) (konst)
696 CT_MIPS_REL32 Address in data
697 CT_MIPS_WORD Address in word (XXX)
698 CT_MIPS_GPHI_LO GP - vaddr
699 CT_MIPS_JMPAD Address to jump
700 */
701
702#define CRT_MIPS_REL32 0xa
703#define CRT_MIPS_WORD 0xb
704#define CRT_MIPS_GPHI_LO 0xc
705#define CRT_MIPS_JMPAD 0xd
706
707#define mips_elf_set_cr_format(x,format) ((x).ctype = (format))
708#define mips_elf_set_cr_type(x,type) ((x).rtype = (type))
709#define mips_elf_set_cr_dist2to(x,v) ((x).dist2to = (v))
710#define mips_elf_set_cr_relvaddr(x,d) ((x).relvaddr = (d)<<2)
711\f
712/* The structure of the runtime procedure descriptor created by the
713 loader for use by the static exception system. */
714
715typedef struct runtime_pdr {
ae9a127f
NC
716 bfd_vma adr; /* Memory address of start of procedure. */
717 long regmask; /* Save register mask. */
718 long regoffset; /* Save register offset. */
719 long fregmask; /* Save floating point register mask. */
720 long fregoffset; /* Save floating point register offset. */
721 long frameoffset; /* Frame size. */
722 short framereg; /* Frame pointer register. */
723 short pcreg; /* Offset or reg of return pc. */
724 long irpss; /* Index into the runtime string table. */
b49e97c9 725 long reserved;
ae9a127f 726 struct exception_info *exception_info;/* Pointer to exception array. */
b49e97c9
TS
727} RPDR, *pRPDR;
728#define cbRPDR sizeof (RPDR)
729#define rpdNil ((pRPDR) 0)
730\f
b15e6682 731static struct mips_got_entry *mips_elf_create_local_got_entry
a8028dd0
RS
732 (bfd *, struct bfd_link_info *, bfd *, bfd_vma, unsigned long,
733 struct mips_elf_link_hash_entry *, int);
b34976b6 734static bfd_boolean mips_elf_sort_hash_table_f
9719ad41 735 (struct mips_elf_link_hash_entry *, void *);
9719ad41
RS
736static bfd_vma mips_elf_high
737 (bfd_vma);
b34976b6 738static bfd_boolean mips_elf_create_dynamic_relocation
9719ad41
RS
739 (bfd *, struct bfd_link_info *, const Elf_Internal_Rela *,
740 struct mips_elf_link_hash_entry *, asection *, bfd_vma,
741 bfd_vma *, asection *);
f4416af6 742static bfd_vma mips_elf_adjust_gp
9719ad41 743 (bfd *, struct mips_got_info *, bfd *);
f4416af6 744
b49e97c9
TS
745/* This will be used when we sort the dynamic relocation records. */
746static bfd *reldyn_sorting_bfd;
747
6d30f5b2
NC
748/* True if ABFD is for CPUs with load interlocking that include
749 non-MIPS1 CPUs and R3900. */
750#define LOAD_INTERLOCKS_P(abfd) \
751 ( ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) != E_MIPS_ARCH_1) \
752 || ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == E_MIPS_MACH_3900))
753
cd8d5a82
CF
754/* True if ABFD is for CPUs that are faster if JAL is converted to BAL.
755 This should be safe for all architectures. We enable this predicate
756 for RM9000 for now. */
757#define JAL_TO_BAL_P(abfd) \
758 ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == E_MIPS_MACH_9000)
759
760/* True if ABFD is for CPUs that are faster if JALR is converted to BAL.
761 This should be safe for all architectures. We enable this predicate for
762 all CPUs. */
763#define JALR_TO_BAL_P(abfd) 1
764
38a7df63
CF
765/* True if ABFD is for CPUs that are faster if JR is converted to B.
766 This should be safe for all architectures. We enable this predicate for
767 all CPUs. */
768#define JR_TO_B_P(abfd) 1
769
861fb55a
DJ
770/* True if ABFD is a PIC object. */
771#define PIC_OBJECT_P(abfd) \
772 ((elf_elfheader (abfd)->e_flags & EF_MIPS_PIC) != 0)
773
b49e97c9 774/* Nonzero if ABFD is using the N32 ABI. */
b49e97c9
TS
775#define ABI_N32_P(abfd) \
776 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
777
4a14403c 778/* Nonzero if ABFD is using the N64 ABI. */
b49e97c9 779#define ABI_64_P(abfd) \
141ff970 780 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
b49e97c9 781
4a14403c
TS
782/* Nonzero if ABFD is using NewABI conventions. */
783#define NEWABI_P(abfd) (ABI_N32_P (abfd) || ABI_64_P (abfd))
784
e8faf7d1
MR
785/* Nonzero if ABFD has microMIPS code. */
786#define MICROMIPS_P(abfd) \
787 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS) != 0)
788
4a14403c 789/* The IRIX compatibility level we are striving for. */
b49e97c9
TS
790#define IRIX_COMPAT(abfd) \
791 (get_elf_backend_data (abfd)->elf_backend_mips_irix_compat (abfd))
792
b49e97c9
TS
793/* Whether we are trying to be compatible with IRIX at all. */
794#define SGI_COMPAT(abfd) \
795 (IRIX_COMPAT (abfd) != ict_none)
796
797/* The name of the options section. */
798#define MIPS_ELF_OPTIONS_SECTION_NAME(abfd) \
d80dcc6a 799 (NEWABI_P (abfd) ? ".MIPS.options" : ".options")
b49e97c9 800
cc2e31b9
RS
801/* True if NAME is the recognized name of any SHT_MIPS_OPTIONS section.
802 Some IRIX system files do not use MIPS_ELF_OPTIONS_SECTION_NAME. */
803#define MIPS_ELF_OPTIONS_SECTION_NAME_P(NAME) \
804 (strcmp (NAME, ".MIPS.options") == 0 || strcmp (NAME, ".options") == 0)
805
943284cc
DJ
806/* Whether the section is readonly. */
807#define MIPS_ELF_READONLY_SECTION(sec) \
808 ((sec->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)) \
809 == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
810
b49e97c9 811/* The name of the stub section. */
ca07892d 812#define MIPS_ELF_STUB_SECTION_NAME(abfd) ".MIPS.stubs"
b49e97c9
TS
813
814/* The size of an external REL relocation. */
815#define MIPS_ELF_REL_SIZE(abfd) \
816 (get_elf_backend_data (abfd)->s->sizeof_rel)
817
0a44bf69
RS
818/* The size of an external RELA relocation. */
819#define MIPS_ELF_RELA_SIZE(abfd) \
820 (get_elf_backend_data (abfd)->s->sizeof_rela)
821
b49e97c9
TS
822/* The size of an external dynamic table entry. */
823#define MIPS_ELF_DYN_SIZE(abfd) \
824 (get_elf_backend_data (abfd)->s->sizeof_dyn)
825
826/* The size of a GOT entry. */
827#define MIPS_ELF_GOT_SIZE(abfd) \
828 (get_elf_backend_data (abfd)->s->arch_size / 8)
829
b4082c70
DD
830/* The size of the .rld_map section. */
831#define MIPS_ELF_RLD_MAP_SIZE(abfd) \
832 (get_elf_backend_data (abfd)->s->arch_size / 8)
833
b49e97c9
TS
834/* The size of a symbol-table entry. */
835#define MIPS_ELF_SYM_SIZE(abfd) \
836 (get_elf_backend_data (abfd)->s->sizeof_sym)
837
838/* The default alignment for sections, as a power of two. */
839#define MIPS_ELF_LOG_FILE_ALIGN(abfd) \
45d6a902 840 (get_elf_backend_data (abfd)->s->log_file_align)
b49e97c9
TS
841
842/* Get word-sized data. */
843#define MIPS_ELF_GET_WORD(abfd, ptr) \
844 (ABI_64_P (abfd) ? bfd_get_64 (abfd, ptr) : bfd_get_32 (abfd, ptr))
845
846/* Put out word-sized data. */
847#define MIPS_ELF_PUT_WORD(abfd, val, ptr) \
848 (ABI_64_P (abfd) \
849 ? bfd_put_64 (abfd, val, ptr) \
850 : bfd_put_32 (abfd, val, ptr))
851
861fb55a
DJ
852/* The opcode for word-sized loads (LW or LD). */
853#define MIPS_ELF_LOAD_WORD(abfd) \
854 (ABI_64_P (abfd) ? 0xdc000000 : 0x8c000000)
855
b49e97c9 856/* Add a dynamic symbol table-entry. */
9719ad41 857#define MIPS_ELF_ADD_DYNAMIC_ENTRY(info, tag, val) \
5a580b3a 858 _bfd_elf_add_dynamic_entry (info, tag, val)
b49e97c9
TS
859
860#define MIPS_ELF_RTYPE_TO_HOWTO(abfd, rtype, rela) \
861 (get_elf_backend_data (abfd)->elf_backend_mips_rtype_to_howto (rtype, rela))
862
0a44bf69
RS
863/* The name of the dynamic relocation section. */
864#define MIPS_ELF_REL_DYN_NAME(INFO) \
865 (mips_elf_hash_table (INFO)->is_vxworks ? ".rela.dyn" : ".rel.dyn")
866
b49e97c9
TS
867/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
868 from smaller values. Start with zero, widen, *then* decrement. */
869#define MINUS_ONE (((bfd_vma)0) - 1)
c5ae1840 870#define MINUS_TWO (((bfd_vma)0) - 2)
b49e97c9 871
51e38d68
RS
872/* The value to write into got[1] for SVR4 targets, to identify it is
873 a GNU object. The dynamic linker can then use got[1] to store the
874 module pointer. */
875#define MIPS_ELF_GNU_GOT1_MASK(abfd) \
876 ((bfd_vma) 1 << (ABI_64_P (abfd) ? 63 : 31))
877
f4416af6 878/* The offset of $gp from the beginning of the .got section. */
0a44bf69
RS
879#define ELF_MIPS_GP_OFFSET(INFO) \
880 (mips_elf_hash_table (INFO)->is_vxworks ? 0x0 : 0x7ff0)
f4416af6
AO
881
882/* The maximum size of the GOT for it to be addressable using 16-bit
883 offsets from $gp. */
0a44bf69 884#define MIPS_ELF_GOT_MAX_SIZE(INFO) (ELF_MIPS_GP_OFFSET (INFO) + 0x7fff)
f4416af6 885
6a691779 886/* Instructions which appear in a stub. */
3d6746ca
DD
887#define STUB_LW(abfd) \
888 ((ABI_64_P (abfd) \
889 ? 0xdf998010 /* ld t9,0x8010(gp) */ \
890 : 0x8f998010)) /* lw t9,0x8010(gp) */
891#define STUB_MOVE(abfd) \
892 ((ABI_64_P (abfd) \
893 ? 0x03e0782d /* daddu t7,ra */ \
894 : 0x03e07821)) /* addu t7,ra */
895#define STUB_LUI(VAL) (0x3c180000 + (VAL)) /* lui t8,VAL */
896#define STUB_JALR 0x0320f809 /* jalr t9,ra */
5108fc1b
RS
897#define STUB_ORI(VAL) (0x37180000 + (VAL)) /* ori t8,t8,VAL */
898#define STUB_LI16U(VAL) (0x34180000 + (VAL)) /* ori t8,zero,VAL unsigned */
3d6746ca
DD
899#define STUB_LI16S(abfd, VAL) \
900 ((ABI_64_P (abfd) \
901 ? (0x64180000 + (VAL)) /* daddiu t8,zero,VAL sign extended */ \
902 : (0x24180000 + (VAL)))) /* addiu t8,zero,VAL sign extended */
903
1bbce132
MR
904/* Likewise for the microMIPS ASE. */
905#define STUB_LW_MICROMIPS(abfd) \
906 (ABI_64_P (abfd) \
907 ? 0xdf3c8010 /* ld t9,0x8010(gp) */ \
908 : 0xff3c8010) /* lw t9,0x8010(gp) */
909#define STUB_MOVE_MICROMIPS 0x0dff /* move t7,ra */
833794fc
MR
910#define STUB_MOVE32_MICROMIPS(abfd) \
911 (ABI_64_P (abfd) \
912 ? 0x581f7950 /* daddu t7,ra,zero */ \
913 : 0x001f7950) /* addu t7,ra,zero */
1bbce132
MR
914#define STUB_LUI_MICROMIPS(VAL) \
915 (0x41b80000 + (VAL)) /* lui t8,VAL */
916#define STUB_JALR_MICROMIPS 0x45d9 /* jalr t9 */
833794fc 917#define STUB_JALR32_MICROMIPS 0x03f90f3c /* jalr ra,t9 */
1bbce132
MR
918#define STUB_ORI_MICROMIPS(VAL) \
919 (0x53180000 + (VAL)) /* ori t8,t8,VAL */
920#define STUB_LI16U_MICROMIPS(VAL) \
921 (0x53000000 + (VAL)) /* ori t8,zero,VAL unsigned */
922#define STUB_LI16S_MICROMIPS(abfd, VAL) \
923 (ABI_64_P (abfd) \
924 ? 0x5f000000 + (VAL) /* daddiu t8,zero,VAL sign extended */ \
925 : 0x33000000 + (VAL)) /* addiu t8,zero,VAL sign extended */
926
5108fc1b
RS
927#define MIPS_FUNCTION_STUB_NORMAL_SIZE 16
928#define MIPS_FUNCTION_STUB_BIG_SIZE 20
1bbce132
MR
929#define MICROMIPS_FUNCTION_STUB_NORMAL_SIZE 12
930#define MICROMIPS_FUNCTION_STUB_BIG_SIZE 16
833794fc
MR
931#define MICROMIPS_INSN32_FUNCTION_STUB_NORMAL_SIZE 16
932#define MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE 20
b49e97c9
TS
933
934/* The name of the dynamic interpreter. This is put in the .interp
935 section. */
936
937#define ELF_DYNAMIC_INTERPRETER(abfd) \
938 (ABI_N32_P (abfd) ? "/usr/lib32/libc.so.1" \
939 : ABI_64_P (abfd) ? "/usr/lib64/libc.so.1" \
940 : "/usr/lib/libc.so.1")
941
942#ifdef BFD64
ee6423ed
AO
943#define MNAME(bfd,pre,pos) \
944 (ABI_64_P (bfd) ? CONCAT4 (pre,64,_,pos) : CONCAT4 (pre,32,_,pos))
b49e97c9
TS
945#define ELF_R_SYM(bfd, i) \
946 (ABI_64_P (bfd) ? ELF64_R_SYM (i) : ELF32_R_SYM (i))
947#define ELF_R_TYPE(bfd, i) \
948 (ABI_64_P (bfd) ? ELF64_MIPS_R_TYPE (i) : ELF32_R_TYPE (i))
949#define ELF_R_INFO(bfd, s, t) \
950 (ABI_64_P (bfd) ? ELF64_R_INFO (s, t) : ELF32_R_INFO (s, t))
951#else
ee6423ed 952#define MNAME(bfd,pre,pos) CONCAT4 (pre,32,_,pos)
b49e97c9
TS
953#define ELF_R_SYM(bfd, i) \
954 (ELF32_R_SYM (i))
955#define ELF_R_TYPE(bfd, i) \
956 (ELF32_R_TYPE (i))
957#define ELF_R_INFO(bfd, s, t) \
958 (ELF32_R_INFO (s, t))
959#endif
960\f
961 /* The mips16 compiler uses a couple of special sections to handle
962 floating point arguments.
963
964 Section names that look like .mips16.fn.FNNAME contain stubs that
965 copy floating point arguments from the fp regs to the gp regs and
966 then jump to FNNAME. If any 32 bit function calls FNNAME, the
967 call should be redirected to the stub instead. If no 32 bit
968 function calls FNNAME, the stub should be discarded. We need to
969 consider any reference to the function, not just a call, because
970 if the address of the function is taken we will need the stub,
971 since the address might be passed to a 32 bit function.
972
973 Section names that look like .mips16.call.FNNAME contain stubs
974 that copy floating point arguments from the gp regs to the fp
975 regs and then jump to FNNAME. If FNNAME is a 32 bit function,
976 then any 16 bit function that calls FNNAME should be redirected
977 to the stub instead. If FNNAME is not a 32 bit function, the
978 stub should be discarded.
979
980 .mips16.call.fp.FNNAME sections are similar, but contain stubs
981 which call FNNAME and then copy the return value from the fp regs
982 to the gp regs. These stubs store the return value in $18 while
983 calling FNNAME; any function which might call one of these stubs
984 must arrange to save $18 around the call. (This case is not
985 needed for 32 bit functions that call 16 bit functions, because
986 16 bit functions always return floating point values in both
987 $f0/$f1 and $2/$3.)
988
989 Note that in all cases FNNAME might be defined statically.
990 Therefore, FNNAME is not used literally. Instead, the relocation
991 information will indicate which symbol the section is for.
992
993 We record any stubs that we find in the symbol table. */
994
995#define FN_STUB ".mips16.fn."
996#define CALL_STUB ".mips16.call."
997#define CALL_FP_STUB ".mips16.call.fp."
b9d58d71
TS
998
999#define FN_STUB_P(name) CONST_STRNEQ (name, FN_STUB)
1000#define CALL_STUB_P(name) CONST_STRNEQ (name, CALL_STUB)
1001#define CALL_FP_STUB_P(name) CONST_STRNEQ (name, CALL_FP_STUB)
b49e97c9 1002\f
861fb55a 1003/* The format of the first PLT entry in an O32 executable. */
6d30f5b2
NC
1004static const bfd_vma mips_o32_exec_plt0_entry[] =
1005{
861fb55a
DJ
1006 0x3c1c0000, /* lui $28, %hi(&GOTPLT[0]) */
1007 0x8f990000, /* lw $25, %lo(&GOTPLT[0])($28) */
1008 0x279c0000, /* addiu $28, $28, %lo(&GOTPLT[0]) */
1009 0x031cc023, /* subu $24, $24, $28 */
81f5d455 1010 0x03e07821, /* move $15, $31 # 32-bit move (addu) */
861fb55a
DJ
1011 0x0018c082, /* srl $24, $24, 2 */
1012 0x0320f809, /* jalr $25 */
1013 0x2718fffe /* subu $24, $24, 2 */
1014};
1015
1016/* The format of the first PLT entry in an N32 executable. Different
1017 because gp ($28) is not available; we use t2 ($14) instead. */
6d30f5b2
NC
1018static const bfd_vma mips_n32_exec_plt0_entry[] =
1019{
861fb55a
DJ
1020 0x3c0e0000, /* lui $14, %hi(&GOTPLT[0]) */
1021 0x8dd90000, /* lw $25, %lo(&GOTPLT[0])($14) */
1022 0x25ce0000, /* addiu $14, $14, %lo(&GOTPLT[0]) */
1023 0x030ec023, /* subu $24, $24, $14 */
81f5d455 1024 0x03e07821, /* move $15, $31 # 32-bit move (addu) */
861fb55a
DJ
1025 0x0018c082, /* srl $24, $24, 2 */
1026 0x0320f809, /* jalr $25 */
1027 0x2718fffe /* subu $24, $24, 2 */
1028};
1029
1030/* The format of the first PLT entry in an N64 executable. Different
1031 from N32 because of the increased size of GOT entries. */
6d30f5b2
NC
1032static const bfd_vma mips_n64_exec_plt0_entry[] =
1033{
861fb55a
DJ
1034 0x3c0e0000, /* lui $14, %hi(&GOTPLT[0]) */
1035 0xddd90000, /* ld $25, %lo(&GOTPLT[0])($14) */
1036 0x25ce0000, /* addiu $14, $14, %lo(&GOTPLT[0]) */
1037 0x030ec023, /* subu $24, $24, $14 */
81f5d455 1038 0x03e0782d, /* move $15, $31 # 64-bit move (daddu) */
861fb55a
DJ
1039 0x0018c0c2, /* srl $24, $24, 3 */
1040 0x0320f809, /* jalr $25 */
1041 0x2718fffe /* subu $24, $24, 2 */
1042};
1043
1bbce132
MR
1044/* The format of the microMIPS first PLT entry in an O32 executable.
1045 We rely on v0 ($2) rather than t8 ($24) to contain the address
1046 of the GOTPLT entry handled, so this stub may only be used when
1047 all the subsequent PLT entries are microMIPS code too.
1048
1049 The trailing NOP is for alignment and correct disassembly only. */
1050static const bfd_vma micromips_o32_exec_plt0_entry[] =
1051{
1052 0x7980, 0x0000, /* addiupc $3, (&GOTPLT[0]) - . */
1053 0xff23, 0x0000, /* lw $25, 0($3) */
1054 0x0535, /* subu $2, $2, $3 */
1055 0x2525, /* srl $2, $2, 2 */
1056 0x3302, 0xfffe, /* subu $24, $2, 2 */
1057 0x0dff, /* move $15, $31 */
1058 0x45f9, /* jalrs $25 */
1059 0x0f83, /* move $28, $3 */
1060 0x0c00 /* nop */
1061};
1062
833794fc
MR
1063/* The format of the microMIPS first PLT entry in an O32 executable
1064 in the insn32 mode. */
1065static const bfd_vma micromips_insn32_o32_exec_plt0_entry[] =
1066{
1067 0x41bc, 0x0000, /* lui $28, %hi(&GOTPLT[0]) */
1068 0xff3c, 0x0000, /* lw $25, %lo(&GOTPLT[0])($28) */
1069 0x339c, 0x0000, /* addiu $28, $28, %lo(&GOTPLT[0]) */
1070 0x0398, 0xc1d0, /* subu $24, $24, $28 */
1071 0x001f, 0x7950, /* move $15, $31 */
1072 0x0318, 0x1040, /* srl $24, $24, 2 */
1073 0x03f9, 0x0f3c, /* jalr $25 */
1074 0x3318, 0xfffe /* subu $24, $24, 2 */
1075};
1076
1bbce132 1077/* The format of subsequent standard PLT entries. */
6d30f5b2
NC
1078static const bfd_vma mips_exec_plt_entry[] =
1079{
861fb55a
DJ
1080 0x3c0f0000, /* lui $15, %hi(.got.plt entry) */
1081 0x01f90000, /* l[wd] $25, %lo(.got.plt entry)($15) */
1082 0x25f80000, /* addiu $24, $15, %lo(.got.plt entry) */
1083 0x03200008 /* jr $25 */
1084};
1085
1bbce132
MR
1086/* The format of subsequent MIPS16 o32 PLT entries. We use v0 ($2)
1087 and v1 ($3) as temporaries because t8 ($24) and t9 ($25) are not
1088 directly addressable. */
1089static const bfd_vma mips16_o32_exec_plt_entry[] =
1090{
1091 0xb203, /* lw $2, 12($pc) */
1092 0x9a60, /* lw $3, 0($2) */
1093 0x651a, /* move $24, $2 */
1094 0xeb00, /* jr $3 */
1095 0x653b, /* move $25, $3 */
1096 0x6500, /* nop */
1097 0x0000, 0x0000 /* .word (.got.plt entry) */
1098};
1099
1100/* The format of subsequent microMIPS o32 PLT entries. We use v0 ($2)
1101 as a temporary because t8 ($24) is not addressable with ADDIUPC. */
1102static const bfd_vma micromips_o32_exec_plt_entry[] =
1103{
1104 0x7900, 0x0000, /* addiupc $2, (.got.plt entry) - . */
1105 0xff22, 0x0000, /* lw $25, 0($2) */
1106 0x4599, /* jr $25 */
1107 0x0f02 /* move $24, $2 */
1108};
1109
833794fc
MR
1110/* The format of subsequent microMIPS o32 PLT entries in the insn32 mode. */
1111static const bfd_vma micromips_insn32_o32_exec_plt_entry[] =
1112{
1113 0x41af, 0x0000, /* lui $15, %hi(.got.plt entry) */
1114 0xff2f, 0x0000, /* lw $25, %lo(.got.plt entry)($15) */
1115 0x0019, 0x0f3c, /* jr $25 */
1116 0x330f, 0x0000 /* addiu $24, $15, %lo(.got.plt entry) */
1117};
1118
0a44bf69 1119/* The format of the first PLT entry in a VxWorks executable. */
6d30f5b2
NC
1120static const bfd_vma mips_vxworks_exec_plt0_entry[] =
1121{
0a44bf69
RS
1122 0x3c190000, /* lui t9, %hi(_GLOBAL_OFFSET_TABLE_) */
1123 0x27390000, /* addiu t9, t9, %lo(_GLOBAL_OFFSET_TABLE_) */
1124 0x8f390008, /* lw t9, 8(t9) */
1125 0x00000000, /* nop */
1126 0x03200008, /* jr t9 */
1127 0x00000000 /* nop */
1128};
1129
1130/* The format of subsequent PLT entries. */
6d30f5b2
NC
1131static const bfd_vma mips_vxworks_exec_plt_entry[] =
1132{
0a44bf69
RS
1133 0x10000000, /* b .PLT_resolver */
1134 0x24180000, /* li t8, <pltindex> */
1135 0x3c190000, /* lui t9, %hi(<.got.plt slot>) */
1136 0x27390000, /* addiu t9, t9, %lo(<.got.plt slot>) */
1137 0x8f390000, /* lw t9, 0(t9) */
1138 0x00000000, /* nop */
1139 0x03200008, /* jr t9 */
1140 0x00000000 /* nop */
1141};
1142
1143/* The format of the first PLT entry in a VxWorks shared object. */
6d30f5b2
NC
1144static const bfd_vma mips_vxworks_shared_plt0_entry[] =
1145{
0a44bf69
RS
1146 0x8f990008, /* lw t9, 8(gp) */
1147 0x00000000, /* nop */
1148 0x03200008, /* jr t9 */
1149 0x00000000, /* nop */
1150 0x00000000, /* nop */
1151 0x00000000 /* nop */
1152};
1153
1154/* The format of subsequent PLT entries. */
6d30f5b2
NC
1155static const bfd_vma mips_vxworks_shared_plt_entry[] =
1156{
0a44bf69
RS
1157 0x10000000, /* b .PLT_resolver */
1158 0x24180000 /* li t8, <pltindex> */
1159};
1160\f
d21911ea
MR
1161/* microMIPS 32-bit opcode helper installer. */
1162
1163static void
1164bfd_put_micromips_32 (const bfd *abfd, bfd_vma opcode, bfd_byte *ptr)
1165{
1166 bfd_put_16 (abfd, (opcode >> 16) & 0xffff, ptr);
1167 bfd_put_16 (abfd, opcode & 0xffff, ptr + 2);
1168}
1169
1170/* microMIPS 32-bit opcode helper retriever. */
1171
1172static bfd_vma
1173bfd_get_micromips_32 (const bfd *abfd, const bfd_byte *ptr)
1174{
1175 return (bfd_get_16 (abfd, ptr) << 16) | bfd_get_16 (abfd, ptr + 2);
1176}
1177\f
b49e97c9
TS
1178/* Look up an entry in a MIPS ELF linker hash table. */
1179
1180#define mips_elf_link_hash_lookup(table, string, create, copy, follow) \
1181 ((struct mips_elf_link_hash_entry *) \
1182 elf_link_hash_lookup (&(table)->root, (string), (create), \
1183 (copy), (follow)))
1184
1185/* Traverse a MIPS ELF linker hash table. */
1186
1187#define mips_elf_link_hash_traverse(table, func, info) \
1188 (elf_link_hash_traverse \
1189 (&(table)->root, \
9719ad41 1190 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
b49e97c9
TS
1191 (info)))
1192
0f20cc35
DJ
1193/* Find the base offsets for thread-local storage in this object,
1194 for GD/LD and IE/LE respectively. */
1195
1196#define TP_OFFSET 0x7000
1197#define DTP_OFFSET 0x8000
1198
1199static bfd_vma
1200dtprel_base (struct bfd_link_info *info)
1201{
1202 /* If tls_sec is NULL, we should have signalled an error already. */
1203 if (elf_hash_table (info)->tls_sec == NULL)
1204 return 0;
1205 return elf_hash_table (info)->tls_sec->vma + DTP_OFFSET;
1206}
1207
1208static bfd_vma
1209tprel_base (struct bfd_link_info *info)
1210{
1211 /* If tls_sec is NULL, we should have signalled an error already. */
1212 if (elf_hash_table (info)->tls_sec == NULL)
1213 return 0;
1214 return elf_hash_table (info)->tls_sec->vma + TP_OFFSET;
1215}
1216
b49e97c9
TS
1217/* Create an entry in a MIPS ELF linker hash table. */
1218
1219static struct bfd_hash_entry *
9719ad41
RS
1220mips_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
1221 struct bfd_hash_table *table, const char *string)
b49e97c9
TS
1222{
1223 struct mips_elf_link_hash_entry *ret =
1224 (struct mips_elf_link_hash_entry *) entry;
1225
1226 /* Allocate the structure if it has not already been allocated by a
1227 subclass. */
9719ad41
RS
1228 if (ret == NULL)
1229 ret = bfd_hash_allocate (table, sizeof (struct mips_elf_link_hash_entry));
1230 if (ret == NULL)
b49e97c9
TS
1231 return (struct bfd_hash_entry *) ret;
1232
1233 /* Call the allocation method of the superclass. */
1234 ret = ((struct mips_elf_link_hash_entry *)
1235 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
1236 table, string));
9719ad41 1237 if (ret != NULL)
b49e97c9
TS
1238 {
1239 /* Set local fields. */
1240 memset (&ret->esym, 0, sizeof (EXTR));
1241 /* We use -2 as a marker to indicate that the information has
1242 not been set. -1 means there is no associated ifd. */
1243 ret->esym.ifd = -2;
861fb55a 1244 ret->la25_stub = 0;
b49e97c9 1245 ret->possibly_dynamic_relocs = 0;
b49e97c9 1246 ret->fn_stub = NULL;
b49e97c9
TS
1247 ret->call_stub = NULL;
1248 ret->call_fp_stub = NULL;
634835ae 1249 ret->global_got_area = GGA_NONE;
6ccf4795 1250 ret->got_only_for_calls = TRUE;
71782a75 1251 ret->readonly_reloc = FALSE;
861fb55a 1252 ret->has_static_relocs = FALSE;
71782a75
RS
1253 ret->no_fn_stub = FALSE;
1254 ret->need_fn_stub = FALSE;
861fb55a 1255 ret->has_nonpic_branches = FALSE;
33bb52fb 1256 ret->needs_lazy_stub = FALSE;
1bbce132 1257 ret->use_plt_entry = FALSE;
b49e97c9
TS
1258 }
1259
1260 return (struct bfd_hash_entry *) ret;
1261}
f0abc2a1 1262
6ae68ba3
MR
1263/* Allocate MIPS ELF private object data. */
1264
1265bfd_boolean
1266_bfd_mips_elf_mkobject (bfd *abfd)
1267{
1268 return bfd_elf_allocate_object (abfd, sizeof (struct mips_elf_obj_tdata),
1269 MIPS_ELF_DATA);
1270}
1271
f0abc2a1 1272bfd_boolean
9719ad41 1273_bfd_mips_elf_new_section_hook (bfd *abfd, asection *sec)
f0abc2a1 1274{
f592407e
AM
1275 if (!sec->used_by_bfd)
1276 {
1277 struct _mips_elf_section_data *sdata;
1278 bfd_size_type amt = sizeof (*sdata);
f0abc2a1 1279
f592407e
AM
1280 sdata = bfd_zalloc (abfd, amt);
1281 if (sdata == NULL)
1282 return FALSE;
1283 sec->used_by_bfd = sdata;
1284 }
f0abc2a1
AM
1285
1286 return _bfd_elf_new_section_hook (abfd, sec);
1287}
b49e97c9
TS
1288\f
1289/* Read ECOFF debugging information from a .mdebug section into a
1290 ecoff_debug_info structure. */
1291
b34976b6 1292bfd_boolean
9719ad41
RS
1293_bfd_mips_elf_read_ecoff_info (bfd *abfd, asection *section,
1294 struct ecoff_debug_info *debug)
b49e97c9
TS
1295{
1296 HDRR *symhdr;
1297 const struct ecoff_debug_swap *swap;
9719ad41 1298 char *ext_hdr;
b49e97c9
TS
1299
1300 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1301 memset (debug, 0, sizeof (*debug));
1302
9719ad41 1303 ext_hdr = bfd_malloc (swap->external_hdr_size);
b49e97c9
TS
1304 if (ext_hdr == NULL && swap->external_hdr_size != 0)
1305 goto error_return;
1306
9719ad41 1307 if (! bfd_get_section_contents (abfd, section, ext_hdr, 0,
82e51918 1308 swap->external_hdr_size))
b49e97c9
TS
1309 goto error_return;
1310
1311 symhdr = &debug->symbolic_header;
1312 (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
1313
1314 /* The symbolic header contains absolute file offsets and sizes to
1315 read. */
1316#define READ(ptr, offset, count, size, type) \
1317 if (symhdr->count == 0) \
1318 debug->ptr = NULL; \
1319 else \
1320 { \
1321 bfd_size_type amt = (bfd_size_type) size * symhdr->count; \
9719ad41 1322 debug->ptr = bfd_malloc (amt); \
b49e97c9
TS
1323 if (debug->ptr == NULL) \
1324 goto error_return; \
9719ad41 1325 if (bfd_seek (abfd, symhdr->offset, SEEK_SET) != 0 \
b49e97c9
TS
1326 || bfd_bread (debug->ptr, amt, abfd) != amt) \
1327 goto error_return; \
1328 }
1329
1330 READ (line, cbLineOffset, cbLine, sizeof (unsigned char), unsigned char *);
9719ad41
RS
1331 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, void *);
1332 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, void *);
1333 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, void *);
1334 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, void *);
b49e97c9
TS
1335 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
1336 union aux_ext *);
1337 READ (ss, cbSsOffset, issMax, sizeof (char), char *);
1338 READ (ssext, cbSsExtOffset, issExtMax, sizeof (char), char *);
9719ad41
RS
1339 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, void *);
1340 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, void *);
1341 READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size, void *);
b49e97c9
TS
1342#undef READ
1343
1344 debug->fdr = NULL;
b49e97c9 1345
b34976b6 1346 return TRUE;
b49e97c9
TS
1347
1348 error_return:
1349 if (ext_hdr != NULL)
1350 free (ext_hdr);
1351 if (debug->line != NULL)
1352 free (debug->line);
1353 if (debug->external_dnr != NULL)
1354 free (debug->external_dnr);
1355 if (debug->external_pdr != NULL)
1356 free (debug->external_pdr);
1357 if (debug->external_sym != NULL)
1358 free (debug->external_sym);
1359 if (debug->external_opt != NULL)
1360 free (debug->external_opt);
1361 if (debug->external_aux != NULL)
1362 free (debug->external_aux);
1363 if (debug->ss != NULL)
1364 free (debug->ss);
1365 if (debug->ssext != NULL)
1366 free (debug->ssext);
1367 if (debug->external_fdr != NULL)
1368 free (debug->external_fdr);
1369 if (debug->external_rfd != NULL)
1370 free (debug->external_rfd);
1371 if (debug->external_ext != NULL)
1372 free (debug->external_ext);
b34976b6 1373 return FALSE;
b49e97c9
TS
1374}
1375\f
1376/* Swap RPDR (runtime procedure table entry) for output. */
1377
1378static void
9719ad41 1379ecoff_swap_rpdr_out (bfd *abfd, const RPDR *in, struct rpdr_ext *ex)
b49e97c9
TS
1380{
1381 H_PUT_S32 (abfd, in->adr, ex->p_adr);
1382 H_PUT_32 (abfd, in->regmask, ex->p_regmask);
1383 H_PUT_32 (abfd, in->regoffset, ex->p_regoffset);
1384 H_PUT_32 (abfd, in->fregmask, ex->p_fregmask);
1385 H_PUT_32 (abfd, in->fregoffset, ex->p_fregoffset);
1386 H_PUT_32 (abfd, in->frameoffset, ex->p_frameoffset);
1387
1388 H_PUT_16 (abfd, in->framereg, ex->p_framereg);
1389 H_PUT_16 (abfd, in->pcreg, ex->p_pcreg);
1390
1391 H_PUT_32 (abfd, in->irpss, ex->p_irpss);
b49e97c9
TS
1392}
1393
1394/* Create a runtime procedure table from the .mdebug section. */
1395
b34976b6 1396static bfd_boolean
9719ad41
RS
1397mips_elf_create_procedure_table (void *handle, bfd *abfd,
1398 struct bfd_link_info *info, asection *s,
1399 struct ecoff_debug_info *debug)
b49e97c9
TS
1400{
1401 const struct ecoff_debug_swap *swap;
1402 HDRR *hdr = &debug->symbolic_header;
1403 RPDR *rpdr, *rp;
1404 struct rpdr_ext *erp;
9719ad41 1405 void *rtproc;
b49e97c9
TS
1406 struct pdr_ext *epdr;
1407 struct sym_ext *esym;
1408 char *ss, **sv;
1409 char *str;
1410 bfd_size_type size;
1411 bfd_size_type count;
1412 unsigned long sindex;
1413 unsigned long i;
1414 PDR pdr;
1415 SYMR sym;
1416 const char *no_name_func = _("static procedure (no name)");
1417
1418 epdr = NULL;
1419 rpdr = NULL;
1420 esym = NULL;
1421 ss = NULL;
1422 sv = NULL;
1423
1424 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1425
1426 sindex = strlen (no_name_func) + 1;
1427 count = hdr->ipdMax;
1428 if (count > 0)
1429 {
1430 size = swap->external_pdr_size;
1431
9719ad41 1432 epdr = bfd_malloc (size * count);
b49e97c9
TS
1433 if (epdr == NULL)
1434 goto error_return;
1435
9719ad41 1436 if (! _bfd_ecoff_get_accumulated_pdr (handle, (bfd_byte *) epdr))
b49e97c9
TS
1437 goto error_return;
1438
1439 size = sizeof (RPDR);
9719ad41 1440 rp = rpdr = bfd_malloc (size * count);
b49e97c9
TS
1441 if (rpdr == NULL)
1442 goto error_return;
1443
1444 size = sizeof (char *);
9719ad41 1445 sv = bfd_malloc (size * count);
b49e97c9
TS
1446 if (sv == NULL)
1447 goto error_return;
1448
1449 count = hdr->isymMax;
1450 size = swap->external_sym_size;
9719ad41 1451 esym = bfd_malloc (size * count);
b49e97c9
TS
1452 if (esym == NULL)
1453 goto error_return;
1454
9719ad41 1455 if (! _bfd_ecoff_get_accumulated_sym (handle, (bfd_byte *) esym))
b49e97c9
TS
1456 goto error_return;
1457
1458 count = hdr->issMax;
9719ad41 1459 ss = bfd_malloc (count);
b49e97c9
TS
1460 if (ss == NULL)
1461 goto error_return;
f075ee0c 1462 if (! _bfd_ecoff_get_accumulated_ss (handle, (bfd_byte *) ss))
b49e97c9
TS
1463 goto error_return;
1464
1465 count = hdr->ipdMax;
1466 for (i = 0; i < (unsigned long) count; i++, rp++)
1467 {
9719ad41
RS
1468 (*swap->swap_pdr_in) (abfd, epdr + i, &pdr);
1469 (*swap->swap_sym_in) (abfd, &esym[pdr.isym], &sym);
b49e97c9
TS
1470 rp->adr = sym.value;
1471 rp->regmask = pdr.regmask;
1472 rp->regoffset = pdr.regoffset;
1473 rp->fregmask = pdr.fregmask;
1474 rp->fregoffset = pdr.fregoffset;
1475 rp->frameoffset = pdr.frameoffset;
1476 rp->framereg = pdr.framereg;
1477 rp->pcreg = pdr.pcreg;
1478 rp->irpss = sindex;
1479 sv[i] = ss + sym.iss;
1480 sindex += strlen (sv[i]) + 1;
1481 }
1482 }
1483
1484 size = sizeof (struct rpdr_ext) * (count + 2) + sindex;
1485 size = BFD_ALIGN (size, 16);
9719ad41 1486 rtproc = bfd_alloc (abfd, size);
b49e97c9
TS
1487 if (rtproc == NULL)
1488 {
1489 mips_elf_hash_table (info)->procedure_count = 0;
1490 goto error_return;
1491 }
1492
1493 mips_elf_hash_table (info)->procedure_count = count + 2;
1494
9719ad41 1495 erp = rtproc;
b49e97c9
TS
1496 memset (erp, 0, sizeof (struct rpdr_ext));
1497 erp++;
1498 str = (char *) rtproc + sizeof (struct rpdr_ext) * (count + 2);
1499 strcpy (str, no_name_func);
1500 str += strlen (no_name_func) + 1;
1501 for (i = 0; i < count; i++)
1502 {
1503 ecoff_swap_rpdr_out (abfd, rpdr + i, erp + i);
1504 strcpy (str, sv[i]);
1505 str += strlen (sv[i]) + 1;
1506 }
1507 H_PUT_S32 (abfd, -1, (erp + count)->p_adr);
1508
1509 /* Set the size and contents of .rtproc section. */
eea6121a 1510 s->size = size;
9719ad41 1511 s->contents = rtproc;
b49e97c9
TS
1512
1513 /* Skip this section later on (I don't think this currently
1514 matters, but someday it might). */
8423293d 1515 s->map_head.link_order = NULL;
b49e97c9
TS
1516
1517 if (epdr != NULL)
1518 free (epdr);
1519 if (rpdr != NULL)
1520 free (rpdr);
1521 if (esym != NULL)
1522 free (esym);
1523 if (ss != NULL)
1524 free (ss);
1525 if (sv != NULL)
1526 free (sv);
1527
b34976b6 1528 return TRUE;
b49e97c9
TS
1529
1530 error_return:
1531 if (epdr != NULL)
1532 free (epdr);
1533 if (rpdr != NULL)
1534 free (rpdr);
1535 if (esym != NULL)
1536 free (esym);
1537 if (ss != NULL)
1538 free (ss);
1539 if (sv != NULL)
1540 free (sv);
b34976b6 1541 return FALSE;
b49e97c9 1542}
738e5348 1543\f
861fb55a
DJ
1544/* We're going to create a stub for H. Create a symbol for the stub's
1545 value and size, to help make the disassembly easier to read. */
1546
1547static bfd_boolean
1548mips_elf_create_stub_symbol (struct bfd_link_info *info,
1549 struct mips_elf_link_hash_entry *h,
1550 const char *prefix, asection *s, bfd_vma value,
1551 bfd_vma size)
1552{
1553 struct bfd_link_hash_entry *bh;
1554 struct elf_link_hash_entry *elfh;
1555 const char *name;
1556
df58fc94
RS
1557 if (ELF_ST_IS_MICROMIPS (h->root.other))
1558 value |= 1;
1559
861fb55a
DJ
1560 /* Create a new symbol. */
1561 name = ACONCAT ((prefix, h->root.root.root.string, NULL));
1562 bh = NULL;
1563 if (!_bfd_generic_link_add_one_symbol (info, s->owner, name,
1564 BSF_LOCAL, s, value, NULL,
1565 TRUE, FALSE, &bh))
1566 return FALSE;
1567
1568 /* Make it a local function. */
1569 elfh = (struct elf_link_hash_entry *) bh;
1570 elfh->type = ELF_ST_INFO (STB_LOCAL, STT_FUNC);
1571 elfh->size = size;
1572 elfh->forced_local = 1;
1573 return TRUE;
1574}
1575
738e5348
RS
1576/* We're about to redefine H. Create a symbol to represent H's
1577 current value and size, to help make the disassembly easier
1578 to read. */
1579
1580static bfd_boolean
1581mips_elf_create_shadow_symbol (struct bfd_link_info *info,
1582 struct mips_elf_link_hash_entry *h,
1583 const char *prefix)
1584{
1585 struct bfd_link_hash_entry *bh;
1586 struct elf_link_hash_entry *elfh;
1587 const char *name;
1588 asection *s;
1589 bfd_vma value;
1590
1591 /* Read the symbol's value. */
1592 BFD_ASSERT (h->root.root.type == bfd_link_hash_defined
1593 || h->root.root.type == bfd_link_hash_defweak);
1594 s = h->root.root.u.def.section;
1595 value = h->root.root.u.def.value;
1596
1597 /* Create a new symbol. */
1598 name = ACONCAT ((prefix, h->root.root.root.string, NULL));
1599 bh = NULL;
1600 if (!_bfd_generic_link_add_one_symbol (info, s->owner, name,
1601 BSF_LOCAL, s, value, NULL,
1602 TRUE, FALSE, &bh))
1603 return FALSE;
1604
1605 /* Make it local and copy the other attributes from H. */
1606 elfh = (struct elf_link_hash_entry *) bh;
1607 elfh->type = ELF_ST_INFO (STB_LOCAL, ELF_ST_TYPE (h->root.type));
1608 elfh->other = h->root.other;
1609 elfh->size = h->root.size;
1610 elfh->forced_local = 1;
1611 return TRUE;
1612}
1613
1614/* Return TRUE if relocations in SECTION can refer directly to a MIPS16
1615 function rather than to a hard-float stub. */
1616
1617static bfd_boolean
1618section_allows_mips16_refs_p (asection *section)
1619{
1620 const char *name;
1621
1622 name = bfd_get_section_name (section->owner, section);
1623 return (FN_STUB_P (name)
1624 || CALL_STUB_P (name)
1625 || CALL_FP_STUB_P (name)
1626 || strcmp (name, ".pdr") == 0);
1627}
1628
1629/* [RELOCS, RELEND) are the relocations against SEC, which is a MIPS16
1630 stub section of some kind. Return the R_SYMNDX of the target
1631 function, or 0 if we can't decide which function that is. */
1632
1633static unsigned long
cb4437b8
MR
1634mips16_stub_symndx (const struct elf_backend_data *bed,
1635 asection *sec ATTRIBUTE_UNUSED,
502e814e 1636 const Elf_Internal_Rela *relocs,
738e5348
RS
1637 const Elf_Internal_Rela *relend)
1638{
cb4437b8 1639 int int_rels_per_ext_rel = bed->s->int_rels_per_ext_rel;
738e5348
RS
1640 const Elf_Internal_Rela *rel;
1641
cb4437b8
MR
1642 /* Trust the first R_MIPS_NONE relocation, if any, but not a subsequent
1643 one in a compound relocation. */
1644 for (rel = relocs; rel < relend; rel += int_rels_per_ext_rel)
738e5348
RS
1645 if (ELF_R_TYPE (sec->owner, rel->r_info) == R_MIPS_NONE)
1646 return ELF_R_SYM (sec->owner, rel->r_info);
1647
1648 /* Otherwise trust the first relocation, whatever its kind. This is
1649 the traditional behavior. */
1650 if (relocs < relend)
1651 return ELF_R_SYM (sec->owner, relocs->r_info);
1652
1653 return 0;
1654}
b49e97c9
TS
1655
1656/* Check the mips16 stubs for a particular symbol, and see if we can
1657 discard them. */
1658
861fb55a
DJ
1659static void
1660mips_elf_check_mips16_stubs (struct bfd_link_info *info,
1661 struct mips_elf_link_hash_entry *h)
b49e97c9 1662{
738e5348
RS
1663 /* Dynamic symbols must use the standard call interface, in case other
1664 objects try to call them. */
1665 if (h->fn_stub != NULL
1666 && h->root.dynindx != -1)
1667 {
1668 mips_elf_create_shadow_symbol (info, h, ".mips16.");
1669 h->need_fn_stub = TRUE;
1670 }
1671
b49e97c9
TS
1672 if (h->fn_stub != NULL
1673 && ! h->need_fn_stub)
1674 {
1675 /* We don't need the fn_stub; the only references to this symbol
1676 are 16 bit calls. Clobber the size to 0 to prevent it from
1677 being included in the link. */
eea6121a 1678 h->fn_stub->size = 0;
b49e97c9
TS
1679 h->fn_stub->flags &= ~SEC_RELOC;
1680 h->fn_stub->reloc_count = 0;
1681 h->fn_stub->flags |= SEC_EXCLUDE;
1682 }
1683
1684 if (h->call_stub != NULL
30c09090 1685 && ELF_ST_IS_MIPS16 (h->root.other))
b49e97c9
TS
1686 {
1687 /* We don't need the call_stub; this is a 16 bit function, so
1688 calls from other 16 bit functions are OK. Clobber the size
1689 to 0 to prevent it from being included in the link. */
eea6121a 1690 h->call_stub->size = 0;
b49e97c9
TS
1691 h->call_stub->flags &= ~SEC_RELOC;
1692 h->call_stub->reloc_count = 0;
1693 h->call_stub->flags |= SEC_EXCLUDE;
1694 }
1695
1696 if (h->call_fp_stub != NULL
30c09090 1697 && ELF_ST_IS_MIPS16 (h->root.other))
b49e97c9
TS
1698 {
1699 /* We don't need the call_stub; this is a 16 bit function, so
1700 calls from other 16 bit functions are OK. Clobber the size
1701 to 0 to prevent it from being included in the link. */
eea6121a 1702 h->call_fp_stub->size = 0;
b49e97c9
TS
1703 h->call_fp_stub->flags &= ~SEC_RELOC;
1704 h->call_fp_stub->reloc_count = 0;
1705 h->call_fp_stub->flags |= SEC_EXCLUDE;
1706 }
861fb55a
DJ
1707}
1708
1709/* Hashtable callbacks for mips_elf_la25_stubs. */
1710
1711static hashval_t
1712mips_elf_la25_stub_hash (const void *entry_)
1713{
1714 const struct mips_elf_la25_stub *entry;
1715
1716 entry = (struct mips_elf_la25_stub *) entry_;
1717 return entry->h->root.root.u.def.section->id
1718 + entry->h->root.root.u.def.value;
1719}
1720
1721static int
1722mips_elf_la25_stub_eq (const void *entry1_, const void *entry2_)
1723{
1724 const struct mips_elf_la25_stub *entry1, *entry2;
1725
1726 entry1 = (struct mips_elf_la25_stub *) entry1_;
1727 entry2 = (struct mips_elf_la25_stub *) entry2_;
1728 return ((entry1->h->root.root.u.def.section
1729 == entry2->h->root.root.u.def.section)
1730 && (entry1->h->root.root.u.def.value
1731 == entry2->h->root.root.u.def.value));
1732}
1733
1734/* Called by the linker to set up the la25 stub-creation code. FN is
1735 the linker's implementation of add_stub_function. Return true on
1736 success. */
1737
1738bfd_boolean
1739_bfd_mips_elf_init_stubs (struct bfd_link_info *info,
1740 asection *(*fn) (const char *, asection *,
1741 asection *))
1742{
1743 struct mips_elf_link_hash_table *htab;
1744
1745 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
1746 if (htab == NULL)
1747 return FALSE;
1748
861fb55a
DJ
1749 htab->add_stub_section = fn;
1750 htab->la25_stubs = htab_try_create (1, mips_elf_la25_stub_hash,
1751 mips_elf_la25_stub_eq, NULL);
1752 if (htab->la25_stubs == NULL)
1753 return FALSE;
1754
1755 return TRUE;
1756}
1757
1758/* Return true if H is a locally-defined PIC function, in the sense
8f0c309a
CLT
1759 that it or its fn_stub might need $25 to be valid on entry.
1760 Note that MIPS16 functions set up $gp using PC-relative instructions,
1761 so they themselves never need $25 to be valid. Only non-MIPS16
1762 entry points are of interest here. */
861fb55a
DJ
1763
1764static bfd_boolean
1765mips_elf_local_pic_function_p (struct mips_elf_link_hash_entry *h)
1766{
1767 return ((h->root.root.type == bfd_link_hash_defined
1768 || h->root.root.type == bfd_link_hash_defweak)
1769 && h->root.def_regular
1770 && !bfd_is_abs_section (h->root.root.u.def.section)
8f0c309a
CLT
1771 && (!ELF_ST_IS_MIPS16 (h->root.other)
1772 || (h->fn_stub && h->need_fn_stub))
861fb55a
DJ
1773 && (PIC_OBJECT_P (h->root.root.u.def.section->owner)
1774 || ELF_ST_IS_MIPS_PIC (h->root.other)));
1775}
1776
8f0c309a
CLT
1777/* Set *SEC to the input section that contains the target of STUB.
1778 Return the offset of the target from the start of that section. */
1779
1780static bfd_vma
1781mips_elf_get_la25_target (struct mips_elf_la25_stub *stub,
1782 asection **sec)
1783{
1784 if (ELF_ST_IS_MIPS16 (stub->h->root.other))
1785 {
1786 BFD_ASSERT (stub->h->need_fn_stub);
1787 *sec = stub->h->fn_stub;
1788 return 0;
1789 }
1790 else
1791 {
1792 *sec = stub->h->root.root.u.def.section;
1793 return stub->h->root.root.u.def.value;
1794 }
1795}
1796
861fb55a
DJ
1797/* STUB describes an la25 stub that we have decided to implement
1798 by inserting an LUI/ADDIU pair before the target function.
1799 Create the section and redirect the function symbol to it. */
1800
1801static bfd_boolean
1802mips_elf_add_la25_intro (struct mips_elf_la25_stub *stub,
1803 struct bfd_link_info *info)
1804{
1805 struct mips_elf_link_hash_table *htab;
1806 char *name;
1807 asection *s, *input_section;
1808 unsigned int align;
1809
1810 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
1811 if (htab == NULL)
1812 return FALSE;
861fb55a
DJ
1813
1814 /* Create a unique name for the new section. */
1815 name = bfd_malloc (11 + sizeof (".text.stub."));
1816 if (name == NULL)
1817 return FALSE;
1818 sprintf (name, ".text.stub.%d", (int) htab_elements (htab->la25_stubs));
1819
1820 /* Create the section. */
8f0c309a 1821 mips_elf_get_la25_target (stub, &input_section);
861fb55a
DJ
1822 s = htab->add_stub_section (name, input_section,
1823 input_section->output_section);
1824 if (s == NULL)
1825 return FALSE;
1826
1827 /* Make sure that any padding goes before the stub. */
1828 align = input_section->alignment_power;
1829 if (!bfd_set_section_alignment (s->owner, s, align))
1830 return FALSE;
1831 if (align > 3)
1832 s->size = (1 << align) - 8;
1833
1834 /* Create a symbol for the stub. */
1835 mips_elf_create_stub_symbol (info, stub->h, ".pic.", s, s->size, 8);
1836 stub->stub_section = s;
1837 stub->offset = s->size;
1838
1839 /* Allocate room for it. */
1840 s->size += 8;
1841 return TRUE;
1842}
1843
1844/* STUB describes an la25 stub that we have decided to implement
1845 with a separate trampoline. Allocate room for it and redirect
1846 the function symbol to it. */
1847
1848static bfd_boolean
1849mips_elf_add_la25_trampoline (struct mips_elf_la25_stub *stub,
1850 struct bfd_link_info *info)
1851{
1852 struct mips_elf_link_hash_table *htab;
1853 asection *s;
1854
1855 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
1856 if (htab == NULL)
1857 return FALSE;
861fb55a
DJ
1858
1859 /* Create a trampoline section, if we haven't already. */
1860 s = htab->strampoline;
1861 if (s == NULL)
1862 {
1863 asection *input_section = stub->h->root.root.u.def.section;
1864 s = htab->add_stub_section (".text", NULL,
1865 input_section->output_section);
1866 if (s == NULL || !bfd_set_section_alignment (s->owner, s, 4))
1867 return FALSE;
1868 htab->strampoline = s;
1869 }
1870
1871 /* Create a symbol for the stub. */
1872 mips_elf_create_stub_symbol (info, stub->h, ".pic.", s, s->size, 16);
1873 stub->stub_section = s;
1874 stub->offset = s->size;
1875
1876 /* Allocate room for it. */
1877 s->size += 16;
1878 return TRUE;
1879}
1880
1881/* H describes a symbol that needs an la25 stub. Make sure that an
1882 appropriate stub exists and point H at it. */
1883
1884static bfd_boolean
1885mips_elf_add_la25_stub (struct bfd_link_info *info,
1886 struct mips_elf_link_hash_entry *h)
1887{
1888 struct mips_elf_link_hash_table *htab;
1889 struct mips_elf_la25_stub search, *stub;
1890 bfd_boolean use_trampoline_p;
1891 asection *s;
1892 bfd_vma value;
1893 void **slot;
1894
861fb55a
DJ
1895 /* Describe the stub we want. */
1896 search.stub_section = NULL;
1897 search.offset = 0;
1898 search.h = h;
1899
1900 /* See if we've already created an equivalent stub. */
1901 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
1902 if (htab == NULL)
1903 return FALSE;
1904
861fb55a
DJ
1905 slot = htab_find_slot (htab->la25_stubs, &search, INSERT);
1906 if (slot == NULL)
1907 return FALSE;
1908
1909 stub = (struct mips_elf_la25_stub *) *slot;
1910 if (stub != NULL)
1911 {
1912 /* We can reuse the existing stub. */
1913 h->la25_stub = stub;
1914 return TRUE;
1915 }
1916
1917 /* Create a permanent copy of ENTRY and add it to the hash table. */
1918 stub = bfd_malloc (sizeof (search));
1919 if (stub == NULL)
1920 return FALSE;
1921 *stub = search;
1922 *slot = stub;
1923
8f0c309a
CLT
1924 /* Prefer to use LUI/ADDIU stubs if the function is at the beginning
1925 of the section and if we would need no more than 2 nops. */
1926 value = mips_elf_get_la25_target (stub, &s);
1927 use_trampoline_p = (value != 0 || s->alignment_power > 4);
1928
861fb55a
DJ
1929 h->la25_stub = stub;
1930 return (use_trampoline_p
1931 ? mips_elf_add_la25_trampoline (stub, info)
1932 : mips_elf_add_la25_intro (stub, info));
1933}
1934
1935/* A mips_elf_link_hash_traverse callback that is called before sizing
1936 sections. DATA points to a mips_htab_traverse_info structure. */
1937
1938static bfd_boolean
1939mips_elf_check_symbols (struct mips_elf_link_hash_entry *h, void *data)
1940{
1941 struct mips_htab_traverse_info *hti;
1942
1943 hti = (struct mips_htab_traverse_info *) data;
861fb55a
DJ
1944 if (!hti->info->relocatable)
1945 mips_elf_check_mips16_stubs (hti->info, h);
b49e97c9 1946
861fb55a
DJ
1947 if (mips_elf_local_pic_function_p (h))
1948 {
ba85c43e
NC
1949 /* PR 12845: If H is in a section that has been garbage
1950 collected it will have its output section set to *ABS*. */
1951 if (bfd_is_abs_section (h->root.root.u.def.section->output_section))
1952 return TRUE;
1953
861fb55a
DJ
1954 /* H is a function that might need $25 to be valid on entry.
1955 If we're creating a non-PIC relocatable object, mark H as
1956 being PIC. If we're creating a non-relocatable object with
1957 non-PIC branches and jumps to H, make sure that H has an la25
1958 stub. */
1959 if (hti->info->relocatable)
1960 {
1961 if (!PIC_OBJECT_P (hti->output_bfd))
1962 h->root.other = ELF_ST_SET_MIPS_PIC (h->root.other);
1963 }
1964 else if (h->has_nonpic_branches && !mips_elf_add_la25_stub (hti->info, h))
1965 {
1966 hti->error = TRUE;
1967 return FALSE;
1968 }
1969 }
b34976b6 1970 return TRUE;
b49e97c9
TS
1971}
1972\f
d6f16593
MR
1973/* R_MIPS16_26 is used for the mips16 jal and jalx instructions.
1974 Most mips16 instructions are 16 bits, but these instructions
1975 are 32 bits.
1976
1977 The format of these instructions is:
1978
1979 +--------------+--------------------------------+
1980 | JALX | X| Imm 20:16 | Imm 25:21 |
1981 +--------------+--------------------------------+
1982 | Immediate 15:0 |
1983 +-----------------------------------------------+
1984
1985 JALX is the 5-bit value 00011. X is 0 for jal, 1 for jalx.
1986 Note that the immediate value in the first word is swapped.
1987
1988 When producing a relocatable object file, R_MIPS16_26 is
1989 handled mostly like R_MIPS_26. In particular, the addend is
1990 stored as a straight 26-bit value in a 32-bit instruction.
1991 (gas makes life simpler for itself by never adjusting a
1992 R_MIPS16_26 reloc to be against a section, so the addend is
1993 always zero). However, the 32 bit instruction is stored as 2
1994 16-bit values, rather than a single 32-bit value. In a
1995 big-endian file, the result is the same; in a little-endian
1996 file, the two 16-bit halves of the 32 bit value are swapped.
1997 This is so that a disassembler can recognize the jal
1998 instruction.
1999
2000 When doing a final link, R_MIPS16_26 is treated as a 32 bit
2001 instruction stored as two 16-bit values. The addend A is the
2002 contents of the targ26 field. The calculation is the same as
2003 R_MIPS_26. When storing the calculated value, reorder the
2004 immediate value as shown above, and don't forget to store the
2005 value as two 16-bit values.
2006
2007 To put it in MIPS ABI terms, the relocation field is T-targ26-16,
2008 defined as
2009
2010 big-endian:
2011 +--------+----------------------+
2012 | | |
2013 | | targ26-16 |
2014 |31 26|25 0|
2015 +--------+----------------------+
2016
2017 little-endian:
2018 +----------+------+-------------+
2019 | | | |
2020 | sub1 | | sub2 |
2021 |0 9|10 15|16 31|
2022 +----------+--------------------+
2023 where targ26-16 is sub1 followed by sub2 (i.e., the addend field A is
2024 ((sub1 << 16) | sub2)).
2025
2026 When producing a relocatable object file, the calculation is
2027 (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
2028 When producing a fully linked file, the calculation is
2029 let R = (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
2030 ((R & 0x1f0000) << 5) | ((R & 0x3e00000) >> 5) | (R & 0xffff)
2031
738e5348
RS
2032 The table below lists the other MIPS16 instruction relocations.
2033 Each one is calculated in the same way as the non-MIPS16 relocation
2034 given on the right, but using the extended MIPS16 layout of 16-bit
2035 immediate fields:
2036
2037 R_MIPS16_GPREL R_MIPS_GPREL16
2038 R_MIPS16_GOT16 R_MIPS_GOT16
2039 R_MIPS16_CALL16 R_MIPS_CALL16
2040 R_MIPS16_HI16 R_MIPS_HI16
2041 R_MIPS16_LO16 R_MIPS_LO16
2042
2043 A typical instruction will have a format like this:
d6f16593
MR
2044
2045 +--------------+--------------------------------+
2046 | EXTEND | Imm 10:5 | Imm 15:11 |
2047 +--------------+--------------------------------+
2048 | Major | rx | ry | Imm 4:0 |
2049 +--------------+--------------------------------+
2050
2051 EXTEND is the five bit value 11110. Major is the instruction
2052 opcode.
2053
738e5348
RS
2054 All we need to do here is shuffle the bits appropriately.
2055 As above, the two 16-bit halves must be swapped on a
2056 little-endian system. */
2057
2058static inline bfd_boolean
2059mips16_reloc_p (int r_type)
2060{
2061 switch (r_type)
2062 {
2063 case R_MIPS16_26:
2064 case R_MIPS16_GPREL:
2065 case R_MIPS16_GOT16:
2066 case R_MIPS16_CALL16:
2067 case R_MIPS16_HI16:
2068 case R_MIPS16_LO16:
d0f13682
CLT
2069 case R_MIPS16_TLS_GD:
2070 case R_MIPS16_TLS_LDM:
2071 case R_MIPS16_TLS_DTPREL_HI16:
2072 case R_MIPS16_TLS_DTPREL_LO16:
2073 case R_MIPS16_TLS_GOTTPREL:
2074 case R_MIPS16_TLS_TPREL_HI16:
2075 case R_MIPS16_TLS_TPREL_LO16:
738e5348
RS
2076 return TRUE;
2077
2078 default:
2079 return FALSE;
2080 }
2081}
2082
df58fc94
RS
2083/* Check if a microMIPS reloc. */
2084
2085static inline bfd_boolean
2086micromips_reloc_p (unsigned int r_type)
2087{
2088 return r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max;
2089}
2090
2091/* Similar to MIPS16, the two 16-bit halves in microMIPS must be swapped
2092 on a little-endian system. This does not apply to R_MICROMIPS_PC7_S1
2093 and R_MICROMIPS_PC10_S1 relocs that apply to 16-bit instructions. */
2094
2095static inline bfd_boolean
2096micromips_reloc_shuffle_p (unsigned int r_type)
2097{
2098 return (micromips_reloc_p (r_type)
2099 && r_type != R_MICROMIPS_PC7_S1
2100 && r_type != R_MICROMIPS_PC10_S1);
2101}
2102
738e5348
RS
2103static inline bfd_boolean
2104got16_reloc_p (int r_type)
2105{
df58fc94
RS
2106 return (r_type == R_MIPS_GOT16
2107 || r_type == R_MIPS16_GOT16
2108 || r_type == R_MICROMIPS_GOT16);
738e5348
RS
2109}
2110
2111static inline bfd_boolean
2112call16_reloc_p (int r_type)
2113{
df58fc94
RS
2114 return (r_type == R_MIPS_CALL16
2115 || r_type == R_MIPS16_CALL16
2116 || r_type == R_MICROMIPS_CALL16);
2117}
2118
2119static inline bfd_boolean
2120got_disp_reloc_p (unsigned int r_type)
2121{
2122 return r_type == R_MIPS_GOT_DISP || r_type == R_MICROMIPS_GOT_DISP;
2123}
2124
2125static inline bfd_boolean
2126got_page_reloc_p (unsigned int r_type)
2127{
2128 return r_type == R_MIPS_GOT_PAGE || r_type == R_MICROMIPS_GOT_PAGE;
2129}
2130
2131static inline bfd_boolean
2132got_ofst_reloc_p (unsigned int r_type)
2133{
2134 return r_type == R_MIPS_GOT_OFST || r_type == R_MICROMIPS_GOT_OFST;
2135}
2136
2137static inline bfd_boolean
2138got_hi16_reloc_p (unsigned int r_type)
2139{
2140 return r_type == R_MIPS_GOT_HI16 || r_type == R_MICROMIPS_GOT_HI16;
2141}
2142
2143static inline bfd_boolean
2144got_lo16_reloc_p (unsigned int r_type)
2145{
2146 return r_type == R_MIPS_GOT_LO16 || r_type == R_MICROMIPS_GOT_LO16;
2147}
2148
2149static inline bfd_boolean
2150call_hi16_reloc_p (unsigned int r_type)
2151{
2152 return r_type == R_MIPS_CALL_HI16 || r_type == R_MICROMIPS_CALL_HI16;
2153}
2154
2155static inline bfd_boolean
2156call_lo16_reloc_p (unsigned int r_type)
2157{
2158 return r_type == R_MIPS_CALL_LO16 || r_type == R_MICROMIPS_CALL_LO16;
738e5348
RS
2159}
2160
2161static inline bfd_boolean
2162hi16_reloc_p (int r_type)
2163{
df58fc94
RS
2164 return (r_type == R_MIPS_HI16
2165 || r_type == R_MIPS16_HI16
2166 || r_type == R_MICROMIPS_HI16);
738e5348 2167}
d6f16593 2168
738e5348
RS
2169static inline bfd_boolean
2170lo16_reloc_p (int r_type)
2171{
df58fc94
RS
2172 return (r_type == R_MIPS_LO16
2173 || r_type == R_MIPS16_LO16
2174 || r_type == R_MICROMIPS_LO16);
738e5348
RS
2175}
2176
2177static inline bfd_boolean
2178mips16_call_reloc_p (int r_type)
2179{
2180 return r_type == R_MIPS16_26 || r_type == R_MIPS16_CALL16;
2181}
d6f16593 2182
38a7df63
CF
2183static inline bfd_boolean
2184jal_reloc_p (int r_type)
2185{
df58fc94
RS
2186 return (r_type == R_MIPS_26
2187 || r_type == R_MIPS16_26
2188 || r_type == R_MICROMIPS_26_S1);
2189}
2190
2191static inline bfd_boolean
2192micromips_branch_reloc_p (int r_type)
2193{
2194 return (r_type == R_MICROMIPS_26_S1
2195 || r_type == R_MICROMIPS_PC16_S1
2196 || r_type == R_MICROMIPS_PC10_S1
2197 || r_type == R_MICROMIPS_PC7_S1);
2198}
2199
2200static inline bfd_boolean
2201tls_gd_reloc_p (unsigned int r_type)
2202{
d0f13682
CLT
2203 return (r_type == R_MIPS_TLS_GD
2204 || r_type == R_MIPS16_TLS_GD
2205 || r_type == R_MICROMIPS_TLS_GD);
df58fc94
RS
2206}
2207
2208static inline bfd_boolean
2209tls_ldm_reloc_p (unsigned int r_type)
2210{
d0f13682
CLT
2211 return (r_type == R_MIPS_TLS_LDM
2212 || r_type == R_MIPS16_TLS_LDM
2213 || r_type == R_MICROMIPS_TLS_LDM);
df58fc94
RS
2214}
2215
2216static inline bfd_boolean
2217tls_gottprel_reloc_p (unsigned int r_type)
2218{
d0f13682
CLT
2219 return (r_type == R_MIPS_TLS_GOTTPREL
2220 || r_type == R_MIPS16_TLS_GOTTPREL
2221 || r_type == R_MICROMIPS_TLS_GOTTPREL);
38a7df63
CF
2222}
2223
d6f16593 2224void
df58fc94
RS
2225_bfd_mips_elf_reloc_unshuffle (bfd *abfd, int r_type,
2226 bfd_boolean jal_shuffle, bfd_byte *data)
d6f16593 2227{
df58fc94 2228 bfd_vma first, second, val;
d6f16593 2229
df58fc94 2230 if (!mips16_reloc_p (r_type) && !micromips_reloc_shuffle_p (r_type))
d6f16593
MR
2231 return;
2232
df58fc94
RS
2233 /* Pick up the first and second halfwords of the instruction. */
2234 first = bfd_get_16 (abfd, data);
2235 second = bfd_get_16 (abfd, data + 2);
2236 if (micromips_reloc_p (r_type) || (r_type == R_MIPS16_26 && !jal_shuffle))
2237 val = first << 16 | second;
2238 else if (r_type != R_MIPS16_26)
2239 val = (((first & 0xf800) << 16) | ((second & 0xffe0) << 11)
2240 | ((first & 0x1f) << 11) | (first & 0x7e0) | (second & 0x1f));
d6f16593 2241 else
df58fc94
RS
2242 val = (((first & 0xfc00) << 16) | ((first & 0x3e0) << 11)
2243 | ((first & 0x1f) << 21) | second);
d6f16593
MR
2244 bfd_put_32 (abfd, val, data);
2245}
2246
2247void
df58fc94
RS
2248_bfd_mips_elf_reloc_shuffle (bfd *abfd, int r_type,
2249 bfd_boolean jal_shuffle, bfd_byte *data)
d6f16593 2250{
df58fc94 2251 bfd_vma first, second, val;
d6f16593 2252
df58fc94 2253 if (!mips16_reloc_p (r_type) && !micromips_reloc_shuffle_p (r_type))
d6f16593
MR
2254 return;
2255
2256 val = bfd_get_32 (abfd, data);
df58fc94 2257 if (micromips_reloc_p (r_type) || (r_type == R_MIPS16_26 && !jal_shuffle))
d6f16593 2258 {
df58fc94
RS
2259 second = val & 0xffff;
2260 first = val >> 16;
2261 }
2262 else if (r_type != R_MIPS16_26)
2263 {
2264 second = ((val >> 11) & 0xffe0) | (val & 0x1f);
2265 first = ((val >> 16) & 0xf800) | ((val >> 11) & 0x1f) | (val & 0x7e0);
d6f16593
MR
2266 }
2267 else
2268 {
df58fc94
RS
2269 second = val & 0xffff;
2270 first = ((val >> 16) & 0xfc00) | ((val >> 11) & 0x3e0)
2271 | ((val >> 21) & 0x1f);
d6f16593 2272 }
df58fc94
RS
2273 bfd_put_16 (abfd, second, data + 2);
2274 bfd_put_16 (abfd, first, data);
d6f16593
MR
2275}
2276
b49e97c9 2277bfd_reloc_status_type
9719ad41
RS
2278_bfd_mips_elf_gprel16_with_gp (bfd *abfd, asymbol *symbol,
2279 arelent *reloc_entry, asection *input_section,
2280 bfd_boolean relocatable, void *data, bfd_vma gp)
b49e97c9
TS
2281{
2282 bfd_vma relocation;
a7ebbfdf 2283 bfd_signed_vma val;
30ac9238 2284 bfd_reloc_status_type status;
b49e97c9
TS
2285
2286 if (bfd_is_com_section (symbol->section))
2287 relocation = 0;
2288 else
2289 relocation = symbol->value;
2290
2291 relocation += symbol->section->output_section->vma;
2292 relocation += symbol->section->output_offset;
2293
07515404 2294 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
b49e97c9
TS
2295 return bfd_reloc_outofrange;
2296
b49e97c9 2297 /* Set val to the offset into the section or symbol. */
a7ebbfdf
TS
2298 val = reloc_entry->addend;
2299
30ac9238 2300 _bfd_mips_elf_sign_extend (val, 16);
a7ebbfdf 2301
b49e97c9 2302 /* Adjust val for the final section location and GP value. If we
1049f94e 2303 are producing relocatable output, we don't want to do this for
b49e97c9 2304 an external symbol. */
1049f94e 2305 if (! relocatable
b49e97c9
TS
2306 || (symbol->flags & BSF_SECTION_SYM) != 0)
2307 val += relocation - gp;
2308
a7ebbfdf
TS
2309 if (reloc_entry->howto->partial_inplace)
2310 {
30ac9238
RS
2311 status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
2312 (bfd_byte *) data
2313 + reloc_entry->address);
2314 if (status != bfd_reloc_ok)
2315 return status;
a7ebbfdf
TS
2316 }
2317 else
2318 reloc_entry->addend = val;
b49e97c9 2319
1049f94e 2320 if (relocatable)
b49e97c9 2321 reloc_entry->address += input_section->output_offset;
30ac9238
RS
2322
2323 return bfd_reloc_ok;
2324}
2325
2326/* Used to store a REL high-part relocation such as R_MIPS_HI16 or
2327 R_MIPS_GOT16. REL is the relocation, INPUT_SECTION is the section
2328 that contains the relocation field and DATA points to the start of
2329 INPUT_SECTION. */
2330
2331struct mips_hi16
2332{
2333 struct mips_hi16 *next;
2334 bfd_byte *data;
2335 asection *input_section;
2336 arelent rel;
2337};
2338
2339/* FIXME: This should not be a static variable. */
2340
2341static struct mips_hi16 *mips_hi16_list;
2342
2343/* A howto special_function for REL *HI16 relocations. We can only
2344 calculate the correct value once we've seen the partnering
2345 *LO16 relocation, so just save the information for later.
2346
2347 The ABI requires that the *LO16 immediately follow the *HI16.
2348 However, as a GNU extension, we permit an arbitrary number of
2349 *HI16s to be associated with a single *LO16. This significantly
2350 simplies the relocation handling in gcc. */
2351
2352bfd_reloc_status_type
2353_bfd_mips_elf_hi16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2354 asymbol *symbol ATTRIBUTE_UNUSED, void *data,
2355 asection *input_section, bfd *output_bfd,
2356 char **error_message ATTRIBUTE_UNUSED)
2357{
2358 struct mips_hi16 *n;
2359
07515404 2360 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
30ac9238
RS
2361 return bfd_reloc_outofrange;
2362
2363 n = bfd_malloc (sizeof *n);
2364 if (n == NULL)
2365 return bfd_reloc_outofrange;
2366
2367 n->next = mips_hi16_list;
2368 n->data = data;
2369 n->input_section = input_section;
2370 n->rel = *reloc_entry;
2371 mips_hi16_list = n;
2372
2373 if (output_bfd != NULL)
2374 reloc_entry->address += input_section->output_offset;
2375
2376 return bfd_reloc_ok;
2377}
2378
738e5348 2379/* A howto special_function for REL R_MIPS*_GOT16 relocations. This is just
30ac9238
RS
2380 like any other 16-bit relocation when applied to global symbols, but is
2381 treated in the same as R_MIPS_HI16 when applied to local symbols. */
2382
2383bfd_reloc_status_type
2384_bfd_mips_elf_got16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2385 void *data, asection *input_section,
2386 bfd *output_bfd, char **error_message)
2387{
2388 if ((symbol->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
2389 || bfd_is_und_section (bfd_get_section (symbol))
2390 || bfd_is_com_section (bfd_get_section (symbol)))
2391 /* The relocation is against a global symbol. */
2392 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2393 input_section, output_bfd,
2394 error_message);
2395
2396 return _bfd_mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
2397 input_section, output_bfd, error_message);
2398}
2399
2400/* A howto special_function for REL *LO16 relocations. The *LO16 itself
2401 is a straightforward 16 bit inplace relocation, but we must deal with
2402 any partnering high-part relocations as well. */
2403
2404bfd_reloc_status_type
2405_bfd_mips_elf_lo16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2406 void *data, asection *input_section,
2407 bfd *output_bfd, char **error_message)
2408{
2409 bfd_vma vallo;
d6f16593 2410 bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
30ac9238 2411
07515404 2412 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
30ac9238
RS
2413 return bfd_reloc_outofrange;
2414
df58fc94 2415 _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
d6f16593 2416 location);
df58fc94
RS
2417 vallo = bfd_get_32 (abfd, location);
2418 _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, FALSE,
2419 location);
d6f16593 2420
30ac9238
RS
2421 while (mips_hi16_list != NULL)
2422 {
2423 bfd_reloc_status_type ret;
2424 struct mips_hi16 *hi;
2425
2426 hi = mips_hi16_list;
2427
738e5348
RS
2428 /* R_MIPS*_GOT16 relocations are something of a special case. We
2429 want to install the addend in the same way as for a R_MIPS*_HI16
30ac9238
RS
2430 relocation (with a rightshift of 16). However, since GOT16
2431 relocations can also be used with global symbols, their howto
2432 has a rightshift of 0. */
2433 if (hi->rel.howto->type == R_MIPS_GOT16)
2434 hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MIPS_HI16, FALSE);
738e5348
RS
2435 else if (hi->rel.howto->type == R_MIPS16_GOT16)
2436 hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MIPS16_HI16, FALSE);
df58fc94
RS
2437 else if (hi->rel.howto->type == R_MICROMIPS_GOT16)
2438 hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MICROMIPS_HI16, FALSE);
30ac9238
RS
2439
2440 /* VALLO is a signed 16-bit number. Bias it by 0x8000 so that any
2441 carry or borrow will induce a change of +1 or -1 in the high part. */
2442 hi->rel.addend += (vallo + 0x8000) & 0xffff;
2443
30ac9238
RS
2444 ret = _bfd_mips_elf_generic_reloc (abfd, &hi->rel, symbol, hi->data,
2445 hi->input_section, output_bfd,
2446 error_message);
2447 if (ret != bfd_reloc_ok)
2448 return ret;
2449
2450 mips_hi16_list = hi->next;
2451 free (hi);
2452 }
2453
2454 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2455 input_section, output_bfd,
2456 error_message);
2457}
2458
2459/* A generic howto special_function. This calculates and installs the
2460 relocation itself, thus avoiding the oft-discussed problems in
2461 bfd_perform_relocation and bfd_install_relocation. */
2462
2463bfd_reloc_status_type
2464_bfd_mips_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2465 asymbol *symbol, void *data ATTRIBUTE_UNUSED,
2466 asection *input_section, bfd *output_bfd,
2467 char **error_message ATTRIBUTE_UNUSED)
2468{
2469 bfd_signed_vma val;
2470 bfd_reloc_status_type status;
2471 bfd_boolean relocatable;
2472
2473 relocatable = (output_bfd != NULL);
2474
07515404 2475 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
30ac9238
RS
2476 return bfd_reloc_outofrange;
2477
2478 /* Build up the field adjustment in VAL. */
2479 val = 0;
2480 if (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0)
2481 {
2482 /* Either we're calculating the final field value or we have a
2483 relocation against a section symbol. Add in the section's
2484 offset or address. */
2485 val += symbol->section->output_section->vma;
2486 val += symbol->section->output_offset;
2487 }
2488
2489 if (!relocatable)
2490 {
2491 /* We're calculating the final field value. Add in the symbol's value
2492 and, if pc-relative, subtract the address of the field itself. */
2493 val += symbol->value;
2494 if (reloc_entry->howto->pc_relative)
2495 {
2496 val -= input_section->output_section->vma;
2497 val -= input_section->output_offset;
2498 val -= reloc_entry->address;
2499 }
2500 }
2501
2502 /* VAL is now the final adjustment. If we're keeping this relocation
2503 in the output file, and if the relocation uses a separate addend,
2504 we just need to add VAL to that addend. Otherwise we need to add
2505 VAL to the relocation field itself. */
2506 if (relocatable && !reloc_entry->howto->partial_inplace)
2507 reloc_entry->addend += val;
2508 else
2509 {
d6f16593
MR
2510 bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
2511
30ac9238
RS
2512 /* Add in the separate addend, if any. */
2513 val += reloc_entry->addend;
2514
2515 /* Add VAL to the relocation field. */
df58fc94
RS
2516 _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
2517 location);
30ac9238 2518 status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
d6f16593 2519 location);
df58fc94
RS
2520 _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, FALSE,
2521 location);
d6f16593 2522
30ac9238
RS
2523 if (status != bfd_reloc_ok)
2524 return status;
2525 }
2526
2527 if (relocatable)
2528 reloc_entry->address += input_section->output_offset;
b49e97c9
TS
2529
2530 return bfd_reloc_ok;
2531}
2532\f
2533/* Swap an entry in a .gptab section. Note that these routines rely
2534 on the equivalence of the two elements of the union. */
2535
2536static void
9719ad41
RS
2537bfd_mips_elf32_swap_gptab_in (bfd *abfd, const Elf32_External_gptab *ex,
2538 Elf32_gptab *in)
b49e97c9
TS
2539{
2540 in->gt_entry.gt_g_value = H_GET_32 (abfd, ex->gt_entry.gt_g_value);
2541 in->gt_entry.gt_bytes = H_GET_32 (abfd, ex->gt_entry.gt_bytes);
2542}
2543
2544static void
9719ad41
RS
2545bfd_mips_elf32_swap_gptab_out (bfd *abfd, const Elf32_gptab *in,
2546 Elf32_External_gptab *ex)
b49e97c9
TS
2547{
2548 H_PUT_32 (abfd, in->gt_entry.gt_g_value, ex->gt_entry.gt_g_value);
2549 H_PUT_32 (abfd, in->gt_entry.gt_bytes, ex->gt_entry.gt_bytes);
2550}
2551
2552static void
9719ad41
RS
2553bfd_elf32_swap_compact_rel_out (bfd *abfd, const Elf32_compact_rel *in,
2554 Elf32_External_compact_rel *ex)
b49e97c9
TS
2555{
2556 H_PUT_32 (abfd, in->id1, ex->id1);
2557 H_PUT_32 (abfd, in->num, ex->num);
2558 H_PUT_32 (abfd, in->id2, ex->id2);
2559 H_PUT_32 (abfd, in->offset, ex->offset);
2560 H_PUT_32 (abfd, in->reserved0, ex->reserved0);
2561 H_PUT_32 (abfd, in->reserved1, ex->reserved1);
2562}
2563
2564static void
9719ad41
RS
2565bfd_elf32_swap_crinfo_out (bfd *abfd, const Elf32_crinfo *in,
2566 Elf32_External_crinfo *ex)
b49e97c9
TS
2567{
2568 unsigned long l;
2569
2570 l = (((in->ctype & CRINFO_CTYPE) << CRINFO_CTYPE_SH)
2571 | ((in->rtype & CRINFO_RTYPE) << CRINFO_RTYPE_SH)
2572 | ((in->dist2to & CRINFO_DIST2TO) << CRINFO_DIST2TO_SH)
2573 | ((in->relvaddr & CRINFO_RELVADDR) << CRINFO_RELVADDR_SH));
2574 H_PUT_32 (abfd, l, ex->info);
2575 H_PUT_32 (abfd, in->konst, ex->konst);
2576 H_PUT_32 (abfd, in->vaddr, ex->vaddr);
2577}
b49e97c9
TS
2578\f
2579/* A .reginfo section holds a single Elf32_RegInfo structure. These
2580 routines swap this structure in and out. They are used outside of
2581 BFD, so they are globally visible. */
2582
2583void
9719ad41
RS
2584bfd_mips_elf32_swap_reginfo_in (bfd *abfd, const Elf32_External_RegInfo *ex,
2585 Elf32_RegInfo *in)
b49e97c9
TS
2586{
2587 in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
2588 in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
2589 in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
2590 in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
2591 in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
2592 in->ri_gp_value = H_GET_32 (abfd, ex->ri_gp_value);
2593}
2594
2595void
9719ad41
RS
2596bfd_mips_elf32_swap_reginfo_out (bfd *abfd, const Elf32_RegInfo *in,
2597 Elf32_External_RegInfo *ex)
b49e97c9
TS
2598{
2599 H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
2600 H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
2601 H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
2602 H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
2603 H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
2604 H_PUT_32 (abfd, in->ri_gp_value, ex->ri_gp_value);
2605}
2606
2607/* In the 64 bit ABI, the .MIPS.options section holds register
2608 information in an Elf64_Reginfo structure. These routines swap
2609 them in and out. They are globally visible because they are used
2610 outside of BFD. These routines are here so that gas can call them
2611 without worrying about whether the 64 bit ABI has been included. */
2612
2613void
9719ad41
RS
2614bfd_mips_elf64_swap_reginfo_in (bfd *abfd, const Elf64_External_RegInfo *ex,
2615 Elf64_Internal_RegInfo *in)
b49e97c9
TS
2616{
2617 in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
2618 in->ri_pad = H_GET_32 (abfd, ex->ri_pad);
2619 in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
2620 in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
2621 in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
2622 in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
2623 in->ri_gp_value = H_GET_64 (abfd, ex->ri_gp_value);
2624}
2625
2626void
9719ad41
RS
2627bfd_mips_elf64_swap_reginfo_out (bfd *abfd, const Elf64_Internal_RegInfo *in,
2628 Elf64_External_RegInfo *ex)
b49e97c9
TS
2629{
2630 H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
2631 H_PUT_32 (abfd, in->ri_pad, ex->ri_pad);
2632 H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
2633 H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
2634 H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
2635 H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
2636 H_PUT_64 (abfd, in->ri_gp_value, ex->ri_gp_value);
2637}
2638
2639/* Swap in an options header. */
2640
2641void
9719ad41
RS
2642bfd_mips_elf_swap_options_in (bfd *abfd, const Elf_External_Options *ex,
2643 Elf_Internal_Options *in)
b49e97c9
TS
2644{
2645 in->kind = H_GET_8 (abfd, ex->kind);
2646 in->size = H_GET_8 (abfd, ex->size);
2647 in->section = H_GET_16 (abfd, ex->section);
2648 in->info = H_GET_32 (abfd, ex->info);
2649}
2650
2651/* Swap out an options header. */
2652
2653void
9719ad41
RS
2654bfd_mips_elf_swap_options_out (bfd *abfd, const Elf_Internal_Options *in,
2655 Elf_External_Options *ex)
b49e97c9
TS
2656{
2657 H_PUT_8 (abfd, in->kind, ex->kind);
2658 H_PUT_8 (abfd, in->size, ex->size);
2659 H_PUT_16 (abfd, in->section, ex->section);
2660 H_PUT_32 (abfd, in->info, ex->info);
2661}
2662\f
2663/* This function is called via qsort() to sort the dynamic relocation
2664 entries by increasing r_symndx value. */
2665
2666static int
9719ad41 2667sort_dynamic_relocs (const void *arg1, const void *arg2)
b49e97c9 2668{
947216bf
AM
2669 Elf_Internal_Rela int_reloc1;
2670 Elf_Internal_Rela int_reloc2;
6870500c 2671 int diff;
b49e97c9 2672
947216bf
AM
2673 bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg1, &int_reloc1);
2674 bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg2, &int_reloc2);
b49e97c9 2675
6870500c
RS
2676 diff = ELF32_R_SYM (int_reloc1.r_info) - ELF32_R_SYM (int_reloc2.r_info);
2677 if (diff != 0)
2678 return diff;
2679
2680 if (int_reloc1.r_offset < int_reloc2.r_offset)
2681 return -1;
2682 if (int_reloc1.r_offset > int_reloc2.r_offset)
2683 return 1;
2684 return 0;
b49e97c9
TS
2685}
2686
f4416af6
AO
2687/* Like sort_dynamic_relocs, but used for elf64 relocations. */
2688
2689static int
7e3102a7
AM
2690sort_dynamic_relocs_64 (const void *arg1 ATTRIBUTE_UNUSED,
2691 const void *arg2 ATTRIBUTE_UNUSED)
f4416af6 2692{
7e3102a7 2693#ifdef BFD64
f4416af6
AO
2694 Elf_Internal_Rela int_reloc1[3];
2695 Elf_Internal_Rela int_reloc2[3];
2696
2697 (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
2698 (reldyn_sorting_bfd, arg1, int_reloc1);
2699 (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
2700 (reldyn_sorting_bfd, arg2, int_reloc2);
2701
6870500c
RS
2702 if (ELF64_R_SYM (int_reloc1[0].r_info) < ELF64_R_SYM (int_reloc2[0].r_info))
2703 return -1;
2704 if (ELF64_R_SYM (int_reloc1[0].r_info) > ELF64_R_SYM (int_reloc2[0].r_info))
2705 return 1;
2706
2707 if (int_reloc1[0].r_offset < int_reloc2[0].r_offset)
2708 return -1;
2709 if (int_reloc1[0].r_offset > int_reloc2[0].r_offset)
2710 return 1;
2711 return 0;
7e3102a7
AM
2712#else
2713 abort ();
2714#endif
f4416af6
AO
2715}
2716
2717
b49e97c9
TS
2718/* This routine is used to write out ECOFF debugging external symbol
2719 information. It is called via mips_elf_link_hash_traverse. The
2720 ECOFF external symbol information must match the ELF external
2721 symbol information. Unfortunately, at this point we don't know
2722 whether a symbol is required by reloc information, so the two
2723 tables may wind up being different. We must sort out the external
2724 symbol information before we can set the final size of the .mdebug
2725 section, and we must set the size of the .mdebug section before we
2726 can relocate any sections, and we can't know which symbols are
2727 required by relocation until we relocate the sections.
2728 Fortunately, it is relatively unlikely that any symbol will be
2729 stripped but required by a reloc. In particular, it can not happen
2730 when generating a final executable. */
2731
b34976b6 2732static bfd_boolean
9719ad41 2733mips_elf_output_extsym (struct mips_elf_link_hash_entry *h, void *data)
b49e97c9 2734{
9719ad41 2735 struct extsym_info *einfo = data;
b34976b6 2736 bfd_boolean strip;
b49e97c9
TS
2737 asection *sec, *output_section;
2738
b49e97c9 2739 if (h->root.indx == -2)
b34976b6 2740 strip = FALSE;
f5385ebf 2741 else if ((h->root.def_dynamic
77cfaee6
AM
2742 || h->root.ref_dynamic
2743 || h->root.type == bfd_link_hash_new)
f5385ebf
AM
2744 && !h->root.def_regular
2745 && !h->root.ref_regular)
b34976b6 2746 strip = TRUE;
b49e97c9
TS
2747 else if (einfo->info->strip == strip_all
2748 || (einfo->info->strip == strip_some
2749 && bfd_hash_lookup (einfo->info->keep_hash,
2750 h->root.root.root.string,
b34976b6
AM
2751 FALSE, FALSE) == NULL))
2752 strip = TRUE;
b49e97c9 2753 else
b34976b6 2754 strip = FALSE;
b49e97c9
TS
2755
2756 if (strip)
b34976b6 2757 return TRUE;
b49e97c9
TS
2758
2759 if (h->esym.ifd == -2)
2760 {
2761 h->esym.jmptbl = 0;
2762 h->esym.cobol_main = 0;
2763 h->esym.weakext = 0;
2764 h->esym.reserved = 0;
2765 h->esym.ifd = ifdNil;
2766 h->esym.asym.value = 0;
2767 h->esym.asym.st = stGlobal;
2768
2769 if (h->root.root.type == bfd_link_hash_undefined
2770 || h->root.root.type == bfd_link_hash_undefweak)
2771 {
2772 const char *name;
2773
2774 /* Use undefined class. Also, set class and type for some
2775 special symbols. */
2776 name = h->root.root.root.string;
2777 if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
2778 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
2779 {
2780 h->esym.asym.sc = scData;
2781 h->esym.asym.st = stLabel;
2782 h->esym.asym.value = 0;
2783 }
2784 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
2785 {
2786 h->esym.asym.sc = scAbs;
2787 h->esym.asym.st = stLabel;
2788 h->esym.asym.value =
2789 mips_elf_hash_table (einfo->info)->procedure_count;
2790 }
4a14403c 2791 else if (strcmp (name, "_gp_disp") == 0 && ! NEWABI_P (einfo->abfd))
b49e97c9
TS
2792 {
2793 h->esym.asym.sc = scAbs;
2794 h->esym.asym.st = stLabel;
2795 h->esym.asym.value = elf_gp (einfo->abfd);
2796 }
2797 else
2798 h->esym.asym.sc = scUndefined;
2799 }
2800 else if (h->root.root.type != bfd_link_hash_defined
2801 && h->root.root.type != bfd_link_hash_defweak)
2802 h->esym.asym.sc = scAbs;
2803 else
2804 {
2805 const char *name;
2806
2807 sec = h->root.root.u.def.section;
2808 output_section = sec->output_section;
2809
2810 /* When making a shared library and symbol h is the one from
2811 the another shared library, OUTPUT_SECTION may be null. */
2812 if (output_section == NULL)
2813 h->esym.asym.sc = scUndefined;
2814 else
2815 {
2816 name = bfd_section_name (output_section->owner, output_section);
2817
2818 if (strcmp (name, ".text") == 0)
2819 h->esym.asym.sc = scText;
2820 else if (strcmp (name, ".data") == 0)
2821 h->esym.asym.sc = scData;
2822 else if (strcmp (name, ".sdata") == 0)
2823 h->esym.asym.sc = scSData;
2824 else if (strcmp (name, ".rodata") == 0
2825 || strcmp (name, ".rdata") == 0)
2826 h->esym.asym.sc = scRData;
2827 else if (strcmp (name, ".bss") == 0)
2828 h->esym.asym.sc = scBss;
2829 else if (strcmp (name, ".sbss") == 0)
2830 h->esym.asym.sc = scSBss;
2831 else if (strcmp (name, ".init") == 0)
2832 h->esym.asym.sc = scInit;
2833 else if (strcmp (name, ".fini") == 0)
2834 h->esym.asym.sc = scFini;
2835 else
2836 h->esym.asym.sc = scAbs;
2837 }
2838 }
2839
2840 h->esym.asym.reserved = 0;
2841 h->esym.asym.index = indexNil;
2842 }
2843
2844 if (h->root.root.type == bfd_link_hash_common)
2845 h->esym.asym.value = h->root.root.u.c.size;
2846 else if (h->root.root.type == bfd_link_hash_defined
2847 || h->root.root.type == bfd_link_hash_defweak)
2848 {
2849 if (h->esym.asym.sc == scCommon)
2850 h->esym.asym.sc = scBss;
2851 else if (h->esym.asym.sc == scSCommon)
2852 h->esym.asym.sc = scSBss;
2853
2854 sec = h->root.root.u.def.section;
2855 output_section = sec->output_section;
2856 if (output_section != NULL)
2857 h->esym.asym.value = (h->root.root.u.def.value
2858 + sec->output_offset
2859 + output_section->vma);
2860 else
2861 h->esym.asym.value = 0;
2862 }
33bb52fb 2863 else
b49e97c9
TS
2864 {
2865 struct mips_elf_link_hash_entry *hd = h;
b49e97c9
TS
2866
2867 while (hd->root.root.type == bfd_link_hash_indirect)
33bb52fb 2868 hd = (struct mips_elf_link_hash_entry *)h->root.root.u.i.link;
b49e97c9 2869
33bb52fb 2870 if (hd->needs_lazy_stub)
b49e97c9 2871 {
1bbce132
MR
2872 BFD_ASSERT (hd->root.plt.plist != NULL);
2873 BFD_ASSERT (hd->root.plt.plist->stub_offset != MINUS_ONE);
b49e97c9
TS
2874 /* Set type and value for a symbol with a function stub. */
2875 h->esym.asym.st = stProc;
2876 sec = hd->root.root.u.def.section;
2877 if (sec == NULL)
2878 h->esym.asym.value = 0;
2879 else
2880 {
2881 output_section = sec->output_section;
2882 if (output_section != NULL)
1bbce132 2883 h->esym.asym.value = (hd->root.plt.plist->stub_offset
b49e97c9
TS
2884 + sec->output_offset
2885 + output_section->vma);
2886 else
2887 h->esym.asym.value = 0;
2888 }
b49e97c9
TS
2889 }
2890 }
2891
2892 if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
2893 h->root.root.root.string,
2894 &h->esym))
2895 {
b34976b6
AM
2896 einfo->failed = TRUE;
2897 return FALSE;
b49e97c9
TS
2898 }
2899
b34976b6 2900 return TRUE;
b49e97c9
TS
2901}
2902
2903/* A comparison routine used to sort .gptab entries. */
2904
2905static int
9719ad41 2906gptab_compare (const void *p1, const void *p2)
b49e97c9 2907{
9719ad41
RS
2908 const Elf32_gptab *a1 = p1;
2909 const Elf32_gptab *a2 = p2;
b49e97c9
TS
2910
2911 return a1->gt_entry.gt_g_value - a2->gt_entry.gt_g_value;
2912}
2913\f
b15e6682 2914/* Functions to manage the got entry hash table. */
f4416af6
AO
2915
2916/* Use all 64 bits of a bfd_vma for the computation of a 32-bit
2917 hash number. */
2918
2919static INLINE hashval_t
9719ad41 2920mips_elf_hash_bfd_vma (bfd_vma addr)
f4416af6
AO
2921{
2922#ifdef BFD64
2923 return addr + (addr >> 32);
2924#else
2925 return addr;
2926#endif
2927}
2928
f4416af6 2929static hashval_t
d9bf376d 2930mips_elf_got_entry_hash (const void *entry_)
f4416af6
AO
2931{
2932 const struct mips_got_entry *entry = (struct mips_got_entry *)entry_;
2933
e641e783 2934 return (entry->symndx
9ab066b4
RS
2935 + ((entry->tls_type == GOT_TLS_LDM) << 18)
2936 + (entry->tls_type == GOT_TLS_LDM ? 0
e641e783
RS
2937 : !entry->abfd ? mips_elf_hash_bfd_vma (entry->d.address)
2938 : entry->symndx >= 0 ? (entry->abfd->id
2939 + mips_elf_hash_bfd_vma (entry->d.addend))
2940 : entry->d.h->root.root.root.hash));
f4416af6
AO
2941}
2942
2943static int
3dff0dd1 2944mips_elf_got_entry_eq (const void *entry1, const void *entry2)
f4416af6
AO
2945{
2946 const struct mips_got_entry *e1 = (struct mips_got_entry *)entry1;
2947 const struct mips_got_entry *e2 = (struct mips_got_entry *)entry2;
2948
e641e783 2949 return (e1->symndx == e2->symndx
9ab066b4
RS
2950 && e1->tls_type == e2->tls_type
2951 && (e1->tls_type == GOT_TLS_LDM ? TRUE
e641e783
RS
2952 : !e1->abfd ? !e2->abfd && e1->d.address == e2->d.address
2953 : e1->symndx >= 0 ? (e1->abfd == e2->abfd
2954 && e1->d.addend == e2->d.addend)
2955 : e2->abfd && e1->d.h == e2->d.h));
b15e6682 2956}
c224138d 2957
13db6b44
RS
2958static hashval_t
2959mips_got_page_ref_hash (const void *ref_)
2960{
2961 const struct mips_got_page_ref *ref;
2962
2963 ref = (const struct mips_got_page_ref *) ref_;
2964 return ((ref->symndx >= 0
2965 ? (hashval_t) (ref->u.abfd->id + ref->symndx)
2966 : ref->u.h->root.root.root.hash)
2967 + mips_elf_hash_bfd_vma (ref->addend));
2968}
2969
2970static int
2971mips_got_page_ref_eq (const void *ref1_, const void *ref2_)
2972{
2973 const struct mips_got_page_ref *ref1, *ref2;
2974
2975 ref1 = (const struct mips_got_page_ref *) ref1_;
2976 ref2 = (const struct mips_got_page_ref *) ref2_;
2977 return (ref1->symndx == ref2->symndx
2978 && (ref1->symndx < 0
2979 ? ref1->u.h == ref2->u.h
2980 : ref1->u.abfd == ref2->u.abfd)
2981 && ref1->addend == ref2->addend);
2982}
2983
c224138d
RS
2984static hashval_t
2985mips_got_page_entry_hash (const void *entry_)
2986{
2987 const struct mips_got_page_entry *entry;
2988
2989 entry = (const struct mips_got_page_entry *) entry_;
13db6b44 2990 return entry->sec->id;
c224138d
RS
2991}
2992
2993static int
2994mips_got_page_entry_eq (const void *entry1_, const void *entry2_)
2995{
2996 const struct mips_got_page_entry *entry1, *entry2;
2997
2998 entry1 = (const struct mips_got_page_entry *) entry1_;
2999 entry2 = (const struct mips_got_page_entry *) entry2_;
13db6b44 3000 return entry1->sec == entry2->sec;
c224138d 3001}
b15e6682 3002\f
3dff0dd1 3003/* Create and return a new mips_got_info structure. */
5334aa52
RS
3004
3005static struct mips_got_info *
3dff0dd1 3006mips_elf_create_got_info (bfd *abfd)
5334aa52
RS
3007{
3008 struct mips_got_info *g;
3009
3010 g = bfd_zalloc (abfd, sizeof (struct mips_got_info));
3011 if (g == NULL)
3012 return NULL;
3013
3dff0dd1
RS
3014 g->got_entries = htab_try_create (1, mips_elf_got_entry_hash,
3015 mips_elf_got_entry_eq, NULL);
5334aa52
RS
3016 if (g->got_entries == NULL)
3017 return NULL;
3018
13db6b44
RS
3019 g->got_page_refs = htab_try_create (1, mips_got_page_ref_hash,
3020 mips_got_page_ref_eq, NULL);
3021 if (g->got_page_refs == NULL)
5334aa52
RS
3022 return NULL;
3023
3024 return g;
3025}
3026
ee227692
RS
3027/* Return the GOT info for input bfd ABFD, trying to create a new one if
3028 CREATE_P and if ABFD doesn't already have a GOT. */
3029
3030static struct mips_got_info *
3031mips_elf_bfd_got (bfd *abfd, bfd_boolean create_p)
3032{
3033 struct mips_elf_obj_tdata *tdata;
3034
3035 if (!is_mips_elf (abfd))
3036 return NULL;
3037
3038 tdata = mips_elf_tdata (abfd);
3039 if (!tdata->got && create_p)
3dff0dd1 3040 tdata->got = mips_elf_create_got_info (abfd);
ee227692
RS
3041 return tdata->got;
3042}
3043
d7206569
RS
3044/* Record that ABFD should use output GOT G. */
3045
3046static void
3047mips_elf_replace_bfd_got (bfd *abfd, struct mips_got_info *g)
3048{
3049 struct mips_elf_obj_tdata *tdata;
3050
3051 BFD_ASSERT (is_mips_elf (abfd));
3052 tdata = mips_elf_tdata (abfd);
3053 if (tdata->got)
3054 {
3055 /* The GOT structure itself and the hash table entries are
3056 allocated to a bfd, but the hash tables aren't. */
3057 htab_delete (tdata->got->got_entries);
13db6b44
RS
3058 htab_delete (tdata->got->got_page_refs);
3059 if (tdata->got->got_page_entries)
3060 htab_delete (tdata->got->got_page_entries);
d7206569
RS
3061 }
3062 tdata->got = g;
3063}
3064
0a44bf69
RS
3065/* Return the dynamic relocation section. If it doesn't exist, try to
3066 create a new it if CREATE_P, otherwise return NULL. Also return NULL
3067 if creation fails. */
f4416af6
AO
3068
3069static asection *
0a44bf69 3070mips_elf_rel_dyn_section (struct bfd_link_info *info, bfd_boolean create_p)
f4416af6 3071{
0a44bf69 3072 const char *dname;
f4416af6 3073 asection *sreloc;
0a44bf69 3074 bfd *dynobj;
f4416af6 3075
0a44bf69
RS
3076 dname = MIPS_ELF_REL_DYN_NAME (info);
3077 dynobj = elf_hash_table (info)->dynobj;
3d4d4302 3078 sreloc = bfd_get_linker_section (dynobj, dname);
f4416af6
AO
3079 if (sreloc == NULL && create_p)
3080 {
3d4d4302
AM
3081 sreloc = bfd_make_section_anyway_with_flags (dynobj, dname,
3082 (SEC_ALLOC
3083 | SEC_LOAD
3084 | SEC_HAS_CONTENTS
3085 | SEC_IN_MEMORY
3086 | SEC_LINKER_CREATED
3087 | SEC_READONLY));
f4416af6 3088 if (sreloc == NULL
f4416af6 3089 || ! bfd_set_section_alignment (dynobj, sreloc,
d80dcc6a 3090 MIPS_ELF_LOG_FILE_ALIGN (dynobj)))
f4416af6
AO
3091 return NULL;
3092 }
3093 return sreloc;
3094}
3095
e641e783
RS
3096/* Return the GOT_TLS_* type required by relocation type R_TYPE. */
3097
3098static int
3099mips_elf_reloc_tls_type (unsigned int r_type)
3100{
3101 if (tls_gd_reloc_p (r_type))
3102 return GOT_TLS_GD;
3103
3104 if (tls_ldm_reloc_p (r_type))
3105 return GOT_TLS_LDM;
3106
3107 if (tls_gottprel_reloc_p (r_type))
3108 return GOT_TLS_IE;
3109
9ab066b4 3110 return GOT_TLS_NONE;
e641e783
RS
3111}
3112
3113/* Return the number of GOT slots needed for GOT TLS type TYPE. */
3114
3115static int
3116mips_tls_got_entries (unsigned int type)
3117{
3118 switch (type)
3119 {
3120 case GOT_TLS_GD:
3121 case GOT_TLS_LDM:
3122 return 2;
3123
3124 case GOT_TLS_IE:
3125 return 1;
3126
9ab066b4 3127 case GOT_TLS_NONE:
e641e783
RS
3128 return 0;
3129 }
3130 abort ();
3131}
3132
0f20cc35
DJ
3133/* Count the number of relocations needed for a TLS GOT entry, with
3134 access types from TLS_TYPE, and symbol H (or a local symbol if H
3135 is NULL). */
3136
3137static int
3138mips_tls_got_relocs (struct bfd_link_info *info, unsigned char tls_type,
3139 struct elf_link_hash_entry *h)
3140{
3141 int indx = 0;
0f20cc35
DJ
3142 bfd_boolean need_relocs = FALSE;
3143 bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
3144
3145 if (h && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3146 && (!info->shared || !SYMBOL_REFERENCES_LOCAL (info, h)))
3147 indx = h->dynindx;
3148
3149 if ((info->shared || indx != 0)
3150 && (h == NULL
3151 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3152 || h->root.type != bfd_link_hash_undefweak))
3153 need_relocs = TRUE;
3154
3155 if (!need_relocs)
e641e783 3156 return 0;
0f20cc35 3157
9ab066b4 3158 switch (tls_type)
0f20cc35 3159 {
e641e783
RS
3160 case GOT_TLS_GD:
3161 return indx != 0 ? 2 : 1;
0f20cc35 3162
e641e783
RS
3163 case GOT_TLS_IE:
3164 return 1;
0f20cc35 3165
e641e783
RS
3166 case GOT_TLS_LDM:
3167 return info->shared ? 1 : 0;
0f20cc35 3168
e641e783
RS
3169 default:
3170 return 0;
3171 }
0f20cc35
DJ
3172}
3173
ab361d49
RS
3174/* Add the number of GOT entries and TLS relocations required by ENTRY
3175 to G. */
0f20cc35 3176
ab361d49
RS
3177static void
3178mips_elf_count_got_entry (struct bfd_link_info *info,
3179 struct mips_got_info *g,
3180 struct mips_got_entry *entry)
0f20cc35 3181{
9ab066b4 3182 if (entry->tls_type)
ab361d49 3183 {
9ab066b4
RS
3184 g->tls_gotno += mips_tls_got_entries (entry->tls_type);
3185 g->relocs += mips_tls_got_relocs (info, entry->tls_type,
ab361d49
RS
3186 entry->symndx < 0
3187 ? &entry->d.h->root : NULL);
3188 }
3189 else if (entry->symndx >= 0 || entry->d.h->global_got_area == GGA_NONE)
3190 g->local_gotno += 1;
3191 else
3192 g->global_gotno += 1;
0f20cc35
DJ
3193}
3194
0f20cc35
DJ
3195/* Output a simple dynamic relocation into SRELOC. */
3196
3197static void
3198mips_elf_output_dynamic_relocation (bfd *output_bfd,
3199 asection *sreloc,
861fb55a 3200 unsigned long reloc_index,
0f20cc35
DJ
3201 unsigned long indx,
3202 int r_type,
3203 bfd_vma offset)
3204{
3205 Elf_Internal_Rela rel[3];
3206
3207 memset (rel, 0, sizeof (rel));
3208
3209 rel[0].r_info = ELF_R_INFO (output_bfd, indx, r_type);
3210 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
3211
3212 if (ABI_64_P (output_bfd))
3213 {
3214 (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
3215 (output_bfd, &rel[0],
3216 (sreloc->contents
861fb55a 3217 + reloc_index * sizeof (Elf64_Mips_External_Rel)));
0f20cc35
DJ
3218 }
3219 else
3220 bfd_elf32_swap_reloc_out
3221 (output_bfd, &rel[0],
3222 (sreloc->contents
861fb55a 3223 + reloc_index * sizeof (Elf32_External_Rel)));
0f20cc35
DJ
3224}
3225
3226/* Initialize a set of TLS GOT entries for one symbol. */
3227
3228static void
9ab066b4
RS
3229mips_elf_initialize_tls_slots (bfd *abfd, struct bfd_link_info *info,
3230 struct mips_got_entry *entry,
0f20cc35
DJ
3231 struct mips_elf_link_hash_entry *h,
3232 bfd_vma value)
3233{
23cc69b6 3234 struct mips_elf_link_hash_table *htab;
0f20cc35
DJ
3235 int indx;
3236 asection *sreloc, *sgot;
9ab066b4 3237 bfd_vma got_offset, got_offset2;
0f20cc35
DJ
3238 bfd_boolean need_relocs = FALSE;
3239
23cc69b6 3240 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3241 if (htab == NULL)
3242 return;
3243
23cc69b6 3244 sgot = htab->sgot;
0f20cc35
DJ
3245
3246 indx = 0;
3247 if (h != NULL)
3248 {
3249 bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
3250
3251 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, &h->root)
3252 && (!info->shared || !SYMBOL_REFERENCES_LOCAL (info, &h->root)))
3253 indx = h->root.dynindx;
3254 }
3255
9ab066b4 3256 if (entry->tls_initialized)
0f20cc35
DJ
3257 return;
3258
3259 if ((info->shared || indx != 0)
3260 && (h == NULL
3261 || ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT
3262 || h->root.type != bfd_link_hash_undefweak))
3263 need_relocs = TRUE;
3264
3265 /* MINUS_ONE means the symbol is not defined in this object. It may not
3266 be defined at all; assume that the value doesn't matter in that
3267 case. Otherwise complain if we would use the value. */
3268 BFD_ASSERT (value != MINUS_ONE || (indx != 0 && need_relocs)
3269 || h->root.root.type == bfd_link_hash_undefweak);
3270
3271 /* Emit necessary relocations. */
0a44bf69 3272 sreloc = mips_elf_rel_dyn_section (info, FALSE);
9ab066b4 3273 got_offset = entry->gotidx;
0f20cc35 3274
9ab066b4 3275 switch (entry->tls_type)
0f20cc35 3276 {
e641e783
RS
3277 case GOT_TLS_GD:
3278 /* General Dynamic. */
3279 got_offset2 = got_offset + MIPS_ELF_GOT_SIZE (abfd);
0f20cc35
DJ
3280
3281 if (need_relocs)
3282 {
3283 mips_elf_output_dynamic_relocation
861fb55a 3284 (abfd, sreloc, sreloc->reloc_count++, indx,
0f20cc35 3285 ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
e641e783 3286 sgot->output_offset + sgot->output_section->vma + got_offset);
0f20cc35
DJ
3287
3288 if (indx)
3289 mips_elf_output_dynamic_relocation
861fb55a 3290 (abfd, sreloc, sreloc->reloc_count++, indx,
0f20cc35 3291 ABI_64_P (abfd) ? R_MIPS_TLS_DTPREL64 : R_MIPS_TLS_DTPREL32,
e641e783 3292 sgot->output_offset + sgot->output_section->vma + got_offset2);
0f20cc35
DJ
3293 else
3294 MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
e641e783 3295 sgot->contents + got_offset2);
0f20cc35
DJ
3296 }
3297 else
3298 {
3299 MIPS_ELF_PUT_WORD (abfd, 1,
e641e783 3300 sgot->contents + got_offset);
0f20cc35 3301 MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
e641e783 3302 sgot->contents + got_offset2);
0f20cc35 3303 }
e641e783 3304 break;
0f20cc35 3305
e641e783
RS
3306 case GOT_TLS_IE:
3307 /* Initial Exec model. */
0f20cc35
DJ
3308 if (need_relocs)
3309 {
3310 if (indx == 0)
3311 MIPS_ELF_PUT_WORD (abfd, value - elf_hash_table (info)->tls_sec->vma,
e641e783 3312 sgot->contents + got_offset);
0f20cc35
DJ
3313 else
3314 MIPS_ELF_PUT_WORD (abfd, 0,
e641e783 3315 sgot->contents + got_offset);
0f20cc35
DJ
3316
3317 mips_elf_output_dynamic_relocation
861fb55a 3318 (abfd, sreloc, sreloc->reloc_count++, indx,
0f20cc35 3319 ABI_64_P (abfd) ? R_MIPS_TLS_TPREL64 : R_MIPS_TLS_TPREL32,
e641e783 3320 sgot->output_offset + sgot->output_section->vma + got_offset);
0f20cc35
DJ
3321 }
3322 else
3323 MIPS_ELF_PUT_WORD (abfd, value - tprel_base (info),
e641e783
RS
3324 sgot->contents + got_offset);
3325 break;
0f20cc35 3326
e641e783 3327 case GOT_TLS_LDM:
0f20cc35
DJ
3328 /* The initial offset is zero, and the LD offsets will include the
3329 bias by DTP_OFFSET. */
3330 MIPS_ELF_PUT_WORD (abfd, 0,
3331 sgot->contents + got_offset
3332 + MIPS_ELF_GOT_SIZE (abfd));
3333
3334 if (!info->shared)
3335 MIPS_ELF_PUT_WORD (abfd, 1,
3336 sgot->contents + got_offset);
3337 else
3338 mips_elf_output_dynamic_relocation
861fb55a 3339 (abfd, sreloc, sreloc->reloc_count++, indx,
0f20cc35
DJ
3340 ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
3341 sgot->output_offset + sgot->output_section->vma + got_offset);
e641e783
RS
3342 break;
3343
3344 default:
3345 abort ();
0f20cc35
DJ
3346 }
3347
9ab066b4 3348 entry->tls_initialized = TRUE;
e641e783 3349}
0f20cc35 3350
0a44bf69
RS
3351/* Return the offset from _GLOBAL_OFFSET_TABLE_ of the .got.plt entry
3352 for global symbol H. .got.plt comes before the GOT, so the offset
3353 will be negative. */
3354
3355static bfd_vma
3356mips_elf_gotplt_index (struct bfd_link_info *info,
3357 struct elf_link_hash_entry *h)
3358{
1bbce132 3359 bfd_vma got_address, got_value;
0a44bf69
RS
3360 struct mips_elf_link_hash_table *htab;
3361
3362 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3363 BFD_ASSERT (htab != NULL);
3364
1bbce132
MR
3365 BFD_ASSERT (h->plt.plist != NULL);
3366 BFD_ASSERT (h->plt.plist->gotplt_index != MINUS_ONE);
0a44bf69
RS
3367
3368 /* Calculate the address of the associated .got.plt entry. */
3369 got_address = (htab->sgotplt->output_section->vma
3370 + htab->sgotplt->output_offset
1bbce132
MR
3371 + (h->plt.plist->gotplt_index
3372 * MIPS_ELF_GOT_SIZE (info->output_bfd)));
0a44bf69
RS
3373
3374 /* Calculate the value of _GLOBAL_OFFSET_TABLE_. */
3375 got_value = (htab->root.hgot->root.u.def.section->output_section->vma
3376 + htab->root.hgot->root.u.def.section->output_offset
3377 + htab->root.hgot->root.u.def.value);
3378
3379 return got_address - got_value;
3380}
3381
5c18022e 3382/* Return the GOT offset for address VALUE. If there is not yet a GOT
0a44bf69
RS
3383 entry for this value, create one. If R_SYMNDX refers to a TLS symbol,
3384 create a TLS GOT entry instead. Return -1 if no satisfactory GOT
3385 offset can be found. */
b49e97c9
TS
3386
3387static bfd_vma
9719ad41 3388mips_elf_local_got_index (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
5c18022e 3389 bfd_vma value, unsigned long r_symndx,
0f20cc35 3390 struct mips_elf_link_hash_entry *h, int r_type)
b49e97c9 3391{
a8028dd0 3392 struct mips_elf_link_hash_table *htab;
b15e6682 3393 struct mips_got_entry *entry;
b49e97c9 3394
a8028dd0 3395 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3396 BFD_ASSERT (htab != NULL);
3397
a8028dd0
RS
3398 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, value,
3399 r_symndx, h, r_type);
0f20cc35 3400 if (!entry)
b15e6682 3401 return MINUS_ONE;
0f20cc35 3402
e641e783 3403 if (entry->tls_type)
9ab066b4
RS
3404 mips_elf_initialize_tls_slots (abfd, info, entry, h, value);
3405 return entry->gotidx;
b49e97c9
TS
3406}
3407
13fbec83 3408/* Return the GOT index of global symbol H in the primary GOT. */
b49e97c9
TS
3409
3410static bfd_vma
13fbec83
RS
3411mips_elf_primary_global_got_index (bfd *obfd, struct bfd_link_info *info,
3412 struct elf_link_hash_entry *h)
3413{
3414 struct mips_elf_link_hash_table *htab;
3415 long global_got_dynindx;
3416 struct mips_got_info *g;
3417 bfd_vma got_index;
3418
3419 htab = mips_elf_hash_table (info);
3420 BFD_ASSERT (htab != NULL);
3421
3422 global_got_dynindx = 0;
3423 if (htab->global_gotsym != NULL)
3424 global_got_dynindx = htab->global_gotsym->dynindx;
3425
3426 /* Once we determine the global GOT entry with the lowest dynamic
3427 symbol table index, we must put all dynamic symbols with greater
3428 indices into the primary GOT. That makes it easy to calculate the
3429 GOT offset. */
3430 BFD_ASSERT (h->dynindx >= global_got_dynindx);
3431 g = mips_elf_bfd_got (obfd, FALSE);
3432 got_index = ((h->dynindx - global_got_dynindx + g->local_gotno)
3433 * MIPS_ELF_GOT_SIZE (obfd));
3434 BFD_ASSERT (got_index < htab->sgot->size);
3435
3436 return got_index;
3437}
3438
3439/* Return the GOT index for the global symbol indicated by H, which is
3440 referenced by a relocation of type R_TYPE in IBFD. */
3441
3442static bfd_vma
3443mips_elf_global_got_index (bfd *obfd, struct bfd_link_info *info, bfd *ibfd,
3444 struct elf_link_hash_entry *h, int r_type)
b49e97c9 3445{
a8028dd0 3446 struct mips_elf_link_hash_table *htab;
6c42ddb9
RS
3447 struct mips_got_info *g;
3448 struct mips_got_entry lookup, *entry;
3449 bfd_vma gotidx;
b49e97c9 3450
a8028dd0 3451 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3452 BFD_ASSERT (htab != NULL);
3453
6c42ddb9
RS
3454 g = mips_elf_bfd_got (ibfd, FALSE);
3455 BFD_ASSERT (g);
f4416af6 3456
6c42ddb9
RS
3457 lookup.tls_type = mips_elf_reloc_tls_type (r_type);
3458 if (!lookup.tls_type && g == mips_elf_bfd_got (obfd, FALSE))
3459 return mips_elf_primary_global_got_index (obfd, info, h);
f4416af6 3460
6c42ddb9
RS
3461 lookup.abfd = ibfd;
3462 lookup.symndx = -1;
3463 lookup.d.h = (struct mips_elf_link_hash_entry *) h;
3464 entry = htab_find (g->got_entries, &lookup);
3465 BFD_ASSERT (entry);
0f20cc35 3466
6c42ddb9
RS
3467 gotidx = entry->gotidx;
3468 BFD_ASSERT (gotidx > 0 && gotidx < htab->sgot->size);
f4416af6 3469
6c42ddb9 3470 if (lookup.tls_type)
0f20cc35 3471 {
0f20cc35
DJ
3472 bfd_vma value = MINUS_ONE;
3473
3474 if ((h->root.type == bfd_link_hash_defined
3475 || h->root.type == bfd_link_hash_defweak)
3476 && h->root.u.def.section->output_section)
3477 value = (h->root.u.def.value
3478 + h->root.u.def.section->output_offset
3479 + h->root.u.def.section->output_section->vma);
3480
9ab066b4 3481 mips_elf_initialize_tls_slots (obfd, info, entry, lookup.d.h, value);
0f20cc35 3482 }
6c42ddb9 3483 return gotidx;
b49e97c9
TS
3484}
3485
5c18022e
RS
3486/* Find a GOT page entry that points to within 32KB of VALUE. These
3487 entries are supposed to be placed at small offsets in the GOT, i.e.,
3488 within 32KB of GP. Return the index of the GOT entry, or -1 if no
3489 entry could be created. If OFFSETP is nonnull, use it to return the
0a44bf69 3490 offset of the GOT entry from VALUE. */
b49e97c9
TS
3491
3492static bfd_vma
9719ad41 3493mips_elf_got_page (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
5c18022e 3494 bfd_vma value, bfd_vma *offsetp)
b49e97c9 3495{
91d6fa6a 3496 bfd_vma page, got_index;
b15e6682 3497 struct mips_got_entry *entry;
b49e97c9 3498
0a44bf69 3499 page = (value + 0x8000) & ~(bfd_vma) 0xffff;
a8028dd0
RS
3500 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, page, 0,
3501 NULL, R_MIPS_GOT_PAGE);
b49e97c9 3502
b15e6682
AO
3503 if (!entry)
3504 return MINUS_ONE;
143d77c5 3505
91d6fa6a 3506 got_index = entry->gotidx;
b49e97c9
TS
3507
3508 if (offsetp)
f4416af6 3509 *offsetp = value - entry->d.address;
b49e97c9 3510
91d6fa6a 3511 return got_index;
b49e97c9
TS
3512}
3513
738e5348 3514/* Find a local GOT entry for an R_MIPS*_GOT16 relocation against VALUE.
020d7251
RS
3515 EXTERNAL is true if the relocation was originally against a global
3516 symbol that binds locally. */
b49e97c9
TS
3517
3518static bfd_vma
9719ad41 3519mips_elf_got16_entry (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
5c18022e 3520 bfd_vma value, bfd_boolean external)
b49e97c9 3521{
b15e6682 3522 struct mips_got_entry *entry;
b49e97c9 3523
0a44bf69
RS
3524 /* GOT16 relocations against local symbols are followed by a LO16
3525 relocation; those against global symbols are not. Thus if the
3526 symbol was originally local, the GOT16 relocation should load the
3527 equivalent of %hi(VALUE), otherwise it should load VALUE itself. */
b49e97c9 3528 if (! external)
0a44bf69 3529 value = mips_elf_high (value) << 16;
b49e97c9 3530
738e5348
RS
3531 /* It doesn't matter whether the original relocation was R_MIPS_GOT16,
3532 R_MIPS16_GOT16, R_MIPS_CALL16, etc. The format of the entry is the
3533 same in all cases. */
a8028dd0
RS
3534 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, value, 0,
3535 NULL, R_MIPS_GOT16);
b15e6682
AO
3536 if (entry)
3537 return entry->gotidx;
3538 else
3539 return MINUS_ONE;
b49e97c9
TS
3540}
3541
3542/* Returns the offset for the entry at the INDEXth position
3543 in the GOT. */
3544
3545static bfd_vma
a8028dd0 3546mips_elf_got_offset_from_index (struct bfd_link_info *info, bfd *output_bfd,
91d6fa6a 3547 bfd *input_bfd, bfd_vma got_index)
b49e97c9 3548{
a8028dd0 3549 struct mips_elf_link_hash_table *htab;
b49e97c9
TS
3550 asection *sgot;
3551 bfd_vma gp;
3552
a8028dd0 3553 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3554 BFD_ASSERT (htab != NULL);
3555
a8028dd0 3556 sgot = htab->sgot;
f4416af6 3557 gp = _bfd_get_gp_value (output_bfd)
a8028dd0 3558 + mips_elf_adjust_gp (output_bfd, htab->got_info, input_bfd);
143d77c5 3559
91d6fa6a 3560 return sgot->output_section->vma + sgot->output_offset + got_index - gp;
b49e97c9
TS
3561}
3562
0a44bf69
RS
3563/* Create and return a local GOT entry for VALUE, which was calculated
3564 from a symbol belonging to INPUT_SECTON. Return NULL if it could not
3565 be created. If R_SYMNDX refers to a TLS symbol, create a TLS entry
3566 instead. */
b49e97c9 3567
b15e6682 3568static struct mips_got_entry *
0a44bf69 3569mips_elf_create_local_got_entry (bfd *abfd, struct bfd_link_info *info,
a8028dd0 3570 bfd *ibfd, bfd_vma value,
5c18022e 3571 unsigned long r_symndx,
0f20cc35
DJ
3572 struct mips_elf_link_hash_entry *h,
3573 int r_type)
b49e97c9 3574{
ebc53538
RS
3575 struct mips_got_entry lookup, *entry;
3576 void **loc;
f4416af6 3577 struct mips_got_info *g;
0a44bf69 3578 struct mips_elf_link_hash_table *htab;
6c42ddb9 3579 bfd_vma gotidx;
0a44bf69
RS
3580
3581 htab = mips_elf_hash_table (info);
4dfe6ac6 3582 BFD_ASSERT (htab != NULL);
b15e6682 3583
d7206569 3584 g = mips_elf_bfd_got (ibfd, FALSE);
f4416af6
AO
3585 if (g == NULL)
3586 {
d7206569 3587 g = mips_elf_bfd_got (abfd, FALSE);
f4416af6
AO
3588 BFD_ASSERT (g != NULL);
3589 }
b15e6682 3590
020d7251
RS
3591 /* This function shouldn't be called for symbols that live in the global
3592 area of the GOT. */
3593 BFD_ASSERT (h == NULL || h->global_got_area == GGA_NONE);
0f20cc35 3594
ebc53538
RS
3595 lookup.tls_type = mips_elf_reloc_tls_type (r_type);
3596 if (lookup.tls_type)
3597 {
3598 lookup.abfd = ibfd;
df58fc94 3599 if (tls_ldm_reloc_p (r_type))
0f20cc35 3600 {
ebc53538
RS
3601 lookup.symndx = 0;
3602 lookup.d.addend = 0;
0f20cc35
DJ
3603 }
3604 else if (h == NULL)
3605 {
ebc53538
RS
3606 lookup.symndx = r_symndx;
3607 lookup.d.addend = 0;
0f20cc35
DJ
3608 }
3609 else
ebc53538
RS
3610 {
3611 lookup.symndx = -1;
3612 lookup.d.h = h;
3613 }
0f20cc35 3614
ebc53538
RS
3615 entry = (struct mips_got_entry *) htab_find (g->got_entries, &lookup);
3616 BFD_ASSERT (entry);
0f20cc35 3617
6c42ddb9
RS
3618 gotidx = entry->gotidx;
3619 BFD_ASSERT (gotidx > 0 && gotidx < htab->sgot->size);
3620
ebc53538 3621 return entry;
0f20cc35
DJ
3622 }
3623
ebc53538
RS
3624 lookup.abfd = NULL;
3625 lookup.symndx = -1;
3626 lookup.d.address = value;
3627 loc = htab_find_slot (g->got_entries, &lookup, INSERT);
3628 if (!loc)
b15e6682 3629 return NULL;
143d77c5 3630
ebc53538
RS
3631 entry = (struct mips_got_entry *) *loc;
3632 if (entry)
3633 return entry;
b15e6682 3634
ebc53538 3635 if (g->assigned_gotno >= g->local_gotno)
b49e97c9
TS
3636 {
3637 /* We didn't allocate enough space in the GOT. */
3638 (*_bfd_error_handler)
3639 (_("not enough GOT space for local GOT entries"));
3640 bfd_set_error (bfd_error_bad_value);
b15e6682 3641 return NULL;
b49e97c9
TS
3642 }
3643
ebc53538
RS
3644 entry = (struct mips_got_entry *) bfd_alloc (abfd, sizeof (*entry));
3645 if (!entry)
3646 return NULL;
3647
3648 lookup.gotidx = MIPS_ELF_GOT_SIZE (abfd) * g->assigned_gotno++;
3649 *entry = lookup;
3650 *loc = entry;
3651
3652 MIPS_ELF_PUT_WORD (abfd, value, htab->sgot->contents + entry->gotidx);
b15e6682 3653
5c18022e 3654 /* These GOT entries need a dynamic relocation on VxWorks. */
0a44bf69
RS
3655 if (htab->is_vxworks)
3656 {
3657 Elf_Internal_Rela outrel;
5c18022e 3658 asection *s;
91d6fa6a 3659 bfd_byte *rloc;
0a44bf69 3660 bfd_vma got_address;
0a44bf69
RS
3661
3662 s = mips_elf_rel_dyn_section (info, FALSE);
a8028dd0
RS
3663 got_address = (htab->sgot->output_section->vma
3664 + htab->sgot->output_offset
ebc53538 3665 + entry->gotidx);
0a44bf69 3666
91d6fa6a 3667 rloc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
0a44bf69 3668 outrel.r_offset = got_address;
5c18022e
RS
3669 outrel.r_info = ELF32_R_INFO (STN_UNDEF, R_MIPS_32);
3670 outrel.r_addend = value;
91d6fa6a 3671 bfd_elf32_swap_reloca_out (abfd, &outrel, rloc);
0a44bf69
RS
3672 }
3673
ebc53538 3674 return entry;
b49e97c9
TS
3675}
3676
d4596a51
RS
3677/* Return the number of dynamic section symbols required by OUTPUT_BFD.
3678 The number might be exact or a worst-case estimate, depending on how
3679 much information is available to elf_backend_omit_section_dynsym at
3680 the current linking stage. */
3681
3682static bfd_size_type
3683count_section_dynsyms (bfd *output_bfd, struct bfd_link_info *info)
3684{
3685 bfd_size_type count;
3686
3687 count = 0;
3688 if (info->shared || elf_hash_table (info)->is_relocatable_executable)
3689 {
3690 asection *p;
3691 const struct elf_backend_data *bed;
3692
3693 bed = get_elf_backend_data (output_bfd);
3694 for (p = output_bfd->sections; p ; p = p->next)
3695 if ((p->flags & SEC_EXCLUDE) == 0
3696 && (p->flags & SEC_ALLOC) != 0
3697 && !(*bed->elf_backend_omit_section_dynsym) (output_bfd, info, p))
3698 ++count;
3699 }
3700 return count;
3701}
3702
b49e97c9 3703/* Sort the dynamic symbol table so that symbols that need GOT entries
d4596a51 3704 appear towards the end. */
b49e97c9 3705
b34976b6 3706static bfd_boolean
d4596a51 3707mips_elf_sort_hash_table (bfd *abfd, struct bfd_link_info *info)
b49e97c9 3708{
a8028dd0 3709 struct mips_elf_link_hash_table *htab;
b49e97c9
TS
3710 struct mips_elf_hash_sort_data hsd;
3711 struct mips_got_info *g;
b49e97c9 3712
d4596a51
RS
3713 if (elf_hash_table (info)->dynsymcount == 0)
3714 return TRUE;
3715
a8028dd0 3716 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3717 BFD_ASSERT (htab != NULL);
3718
a8028dd0 3719 g = htab->got_info;
d4596a51
RS
3720 if (g == NULL)
3721 return TRUE;
f4416af6 3722
b49e97c9 3723 hsd.low = NULL;
23cc69b6
RS
3724 hsd.max_unref_got_dynindx
3725 = hsd.min_got_dynindx
3726 = (elf_hash_table (info)->dynsymcount - g->reloc_only_gotno);
d4596a51 3727 hsd.max_non_got_dynindx = count_section_dynsyms (abfd, info) + 1;
b49e97c9
TS
3728 mips_elf_link_hash_traverse (((struct mips_elf_link_hash_table *)
3729 elf_hash_table (info)),
3730 mips_elf_sort_hash_table_f,
3731 &hsd);
3732
3733 /* There should have been enough room in the symbol table to
44c410de 3734 accommodate both the GOT and non-GOT symbols. */
b49e97c9 3735 BFD_ASSERT (hsd.max_non_got_dynindx <= hsd.min_got_dynindx);
d4596a51
RS
3736 BFD_ASSERT ((unsigned long) hsd.max_unref_got_dynindx
3737 == elf_hash_table (info)->dynsymcount);
3738 BFD_ASSERT (elf_hash_table (info)->dynsymcount - hsd.min_got_dynindx
3739 == g->global_gotno);
b49e97c9
TS
3740
3741 /* Now we know which dynamic symbol has the lowest dynamic symbol
3742 table index in the GOT. */
d222d210 3743 htab->global_gotsym = hsd.low;
b49e97c9 3744
b34976b6 3745 return TRUE;
b49e97c9
TS
3746}
3747
3748/* If H needs a GOT entry, assign it the highest available dynamic
3749 index. Otherwise, assign it the lowest available dynamic
3750 index. */
3751
b34976b6 3752static bfd_boolean
9719ad41 3753mips_elf_sort_hash_table_f (struct mips_elf_link_hash_entry *h, void *data)
b49e97c9 3754{
9719ad41 3755 struct mips_elf_hash_sort_data *hsd = data;
b49e97c9 3756
b49e97c9
TS
3757 /* Symbols without dynamic symbol table entries aren't interesting
3758 at all. */
3759 if (h->root.dynindx == -1)
b34976b6 3760 return TRUE;
b49e97c9 3761
634835ae 3762 switch (h->global_got_area)
f4416af6 3763 {
634835ae
RS
3764 case GGA_NONE:
3765 h->root.dynindx = hsd->max_non_got_dynindx++;
3766 break;
0f20cc35 3767
634835ae 3768 case GGA_NORMAL:
b49e97c9
TS
3769 h->root.dynindx = --hsd->min_got_dynindx;
3770 hsd->low = (struct elf_link_hash_entry *) h;
634835ae
RS
3771 break;
3772
3773 case GGA_RELOC_ONLY:
634835ae
RS
3774 if (hsd->max_unref_got_dynindx == hsd->min_got_dynindx)
3775 hsd->low = (struct elf_link_hash_entry *) h;
3776 h->root.dynindx = hsd->max_unref_got_dynindx++;
3777 break;
b49e97c9
TS
3778 }
3779
b34976b6 3780 return TRUE;
b49e97c9
TS
3781}
3782
ee227692
RS
3783/* Record that input bfd ABFD requires a GOT entry like *LOOKUP
3784 (which is owned by the caller and shouldn't be added to the
3785 hash table directly). */
3786
3787static bfd_boolean
3788mips_elf_record_got_entry (struct bfd_link_info *info, bfd *abfd,
3789 struct mips_got_entry *lookup)
3790{
3791 struct mips_elf_link_hash_table *htab;
3792 struct mips_got_entry *entry;
3793 struct mips_got_info *g;
3794 void **loc, **bfd_loc;
3795
3796 /* Make sure there's a slot for this entry in the master GOT. */
3797 htab = mips_elf_hash_table (info);
3798 g = htab->got_info;
3799 loc = htab_find_slot (g->got_entries, lookup, INSERT);
3800 if (!loc)
3801 return FALSE;
3802
3803 /* Populate the entry if it isn't already. */
3804 entry = (struct mips_got_entry *) *loc;
3805 if (!entry)
3806 {
3807 entry = (struct mips_got_entry *) bfd_alloc (abfd, sizeof (*entry));
3808 if (!entry)
3809 return FALSE;
3810
9ab066b4 3811 lookup->tls_initialized = FALSE;
ee227692
RS
3812 lookup->gotidx = -1;
3813 *entry = *lookup;
3814 *loc = entry;
3815 }
3816
3817 /* Reuse the same GOT entry for the BFD's GOT. */
3818 g = mips_elf_bfd_got (abfd, TRUE);
3819 if (!g)
3820 return FALSE;
3821
3822 bfd_loc = htab_find_slot (g->got_entries, lookup, INSERT);
3823 if (!bfd_loc)
3824 return FALSE;
3825
3826 if (!*bfd_loc)
3827 *bfd_loc = entry;
3828 return TRUE;
3829}
3830
e641e783
RS
3831/* ABFD has a GOT relocation of type R_TYPE against H. Reserve a GOT
3832 entry for it. FOR_CALL is true if the caller is only interested in
6ccf4795 3833 using the GOT entry for calls. */
b49e97c9 3834
b34976b6 3835static bfd_boolean
9719ad41
RS
3836mips_elf_record_global_got_symbol (struct elf_link_hash_entry *h,
3837 bfd *abfd, struct bfd_link_info *info,
e641e783 3838 bfd_boolean for_call, int r_type)
b49e97c9 3839{
a8028dd0 3840 struct mips_elf_link_hash_table *htab;
634835ae 3841 struct mips_elf_link_hash_entry *hmips;
ee227692
RS
3842 struct mips_got_entry entry;
3843 unsigned char tls_type;
a8028dd0
RS
3844
3845 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3846 BFD_ASSERT (htab != NULL);
3847
634835ae 3848 hmips = (struct mips_elf_link_hash_entry *) h;
6ccf4795
RS
3849 if (!for_call)
3850 hmips->got_only_for_calls = FALSE;
f4416af6 3851
b49e97c9
TS
3852 /* A global symbol in the GOT must also be in the dynamic symbol
3853 table. */
7c5fcef7
L
3854 if (h->dynindx == -1)
3855 {
3856 switch (ELF_ST_VISIBILITY (h->other))
3857 {
3858 case STV_INTERNAL:
3859 case STV_HIDDEN:
33bb52fb 3860 _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
7c5fcef7
L
3861 break;
3862 }
c152c796 3863 if (!bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 3864 return FALSE;
7c5fcef7 3865 }
b49e97c9 3866
ee227692 3867 tls_type = mips_elf_reloc_tls_type (r_type);
9ab066b4 3868 if (tls_type == GOT_TLS_NONE && hmips->global_got_area > GGA_NORMAL)
ee227692 3869 hmips->global_got_area = GGA_NORMAL;
86324f90 3870
f4416af6
AO
3871 entry.abfd = abfd;
3872 entry.symndx = -1;
3873 entry.d.h = (struct mips_elf_link_hash_entry *) h;
ee227692
RS
3874 entry.tls_type = tls_type;
3875 return mips_elf_record_got_entry (info, abfd, &entry);
b49e97c9 3876}
f4416af6 3877
e641e783
RS
3878/* ABFD has a GOT relocation of type R_TYPE against symbol SYMNDX + ADDEND,
3879 where SYMNDX is a local symbol. Reserve a GOT entry for it. */
f4416af6
AO
3880
3881static bfd_boolean
9719ad41 3882mips_elf_record_local_got_symbol (bfd *abfd, long symndx, bfd_vma addend,
e641e783 3883 struct bfd_link_info *info, int r_type)
f4416af6 3884{
a8028dd0
RS
3885 struct mips_elf_link_hash_table *htab;
3886 struct mips_got_info *g;
ee227692 3887 struct mips_got_entry entry;
f4416af6 3888
a8028dd0 3889 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3890 BFD_ASSERT (htab != NULL);
3891
a8028dd0
RS
3892 g = htab->got_info;
3893 BFD_ASSERT (g != NULL);
3894
f4416af6
AO
3895 entry.abfd = abfd;
3896 entry.symndx = symndx;
3897 entry.d.addend = addend;
e641e783 3898 entry.tls_type = mips_elf_reloc_tls_type (r_type);
ee227692 3899 return mips_elf_record_got_entry (info, abfd, &entry);
f4416af6 3900}
c224138d 3901
13db6b44
RS
3902/* Record that ABFD has a page relocation against SYMNDX + ADDEND.
3903 H is the symbol's hash table entry, or null if SYMNDX is local
3904 to ABFD. */
c224138d
RS
3905
3906static bfd_boolean
13db6b44
RS
3907mips_elf_record_got_page_ref (struct bfd_link_info *info, bfd *abfd,
3908 long symndx, struct elf_link_hash_entry *h,
3909 bfd_signed_vma addend)
c224138d 3910{
a8028dd0 3911 struct mips_elf_link_hash_table *htab;
ee227692 3912 struct mips_got_info *g1, *g2;
13db6b44 3913 struct mips_got_page_ref lookup, *entry;
ee227692 3914 void **loc, **bfd_loc;
c224138d 3915
a8028dd0 3916 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3917 BFD_ASSERT (htab != NULL);
3918
ee227692
RS
3919 g1 = htab->got_info;
3920 BFD_ASSERT (g1 != NULL);
a8028dd0 3921
13db6b44
RS
3922 if (h)
3923 {
3924 lookup.symndx = -1;
3925 lookup.u.h = (struct mips_elf_link_hash_entry *) h;
3926 }
3927 else
3928 {
3929 lookup.symndx = symndx;
3930 lookup.u.abfd = abfd;
3931 }
3932 lookup.addend = addend;
3933 loc = htab_find_slot (g1->got_page_refs, &lookup, INSERT);
c224138d
RS
3934 if (loc == NULL)
3935 return FALSE;
3936
13db6b44 3937 entry = (struct mips_got_page_ref *) *loc;
c224138d
RS
3938 if (!entry)
3939 {
3940 entry = bfd_alloc (abfd, sizeof (*entry));
3941 if (!entry)
3942 return FALSE;
3943
13db6b44 3944 *entry = lookup;
c224138d
RS
3945 *loc = entry;
3946 }
3947
ee227692
RS
3948 /* Add the same entry to the BFD's GOT. */
3949 g2 = mips_elf_bfd_got (abfd, TRUE);
3950 if (!g2)
3951 return FALSE;
3952
13db6b44 3953 bfd_loc = htab_find_slot (g2->got_page_refs, &lookup, INSERT);
ee227692
RS
3954 if (!bfd_loc)
3955 return FALSE;
3956
3957 if (!*bfd_loc)
3958 *bfd_loc = entry;
3959
c224138d
RS
3960 return TRUE;
3961}
33bb52fb
RS
3962
3963/* Add room for N relocations to the .rel(a).dyn section in ABFD. */
3964
3965static void
3966mips_elf_allocate_dynamic_relocations (bfd *abfd, struct bfd_link_info *info,
3967 unsigned int n)
3968{
3969 asection *s;
3970 struct mips_elf_link_hash_table *htab;
3971
3972 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
3973 BFD_ASSERT (htab != NULL);
3974
33bb52fb
RS
3975 s = mips_elf_rel_dyn_section (info, FALSE);
3976 BFD_ASSERT (s != NULL);
3977
3978 if (htab->is_vxworks)
3979 s->size += n * MIPS_ELF_RELA_SIZE (abfd);
3980 else
3981 {
3982 if (s->size == 0)
3983 {
3984 /* Make room for a null element. */
3985 s->size += MIPS_ELF_REL_SIZE (abfd);
3986 ++s->reloc_count;
3987 }
3988 s->size += n * MIPS_ELF_REL_SIZE (abfd);
3989 }
3990}
3991\f
476366af
RS
3992/* A htab_traverse callback for GOT entries, with DATA pointing to a
3993 mips_elf_traverse_got_arg structure. Count the number of GOT
3994 entries and TLS relocs. Set DATA->value to true if we need
3995 to resolve indirect or warning symbols and then recreate the GOT. */
33bb52fb
RS
3996
3997static int
3998mips_elf_check_recreate_got (void **entryp, void *data)
3999{
4000 struct mips_got_entry *entry;
476366af 4001 struct mips_elf_traverse_got_arg *arg;
33bb52fb
RS
4002
4003 entry = (struct mips_got_entry *) *entryp;
476366af 4004 arg = (struct mips_elf_traverse_got_arg *) data;
33bb52fb
RS
4005 if (entry->abfd != NULL && entry->symndx == -1)
4006 {
4007 struct mips_elf_link_hash_entry *h;
4008
4009 h = entry->d.h;
4010 if (h->root.root.type == bfd_link_hash_indirect
4011 || h->root.root.type == bfd_link_hash_warning)
4012 {
476366af 4013 arg->value = TRUE;
33bb52fb
RS
4014 return 0;
4015 }
4016 }
476366af 4017 mips_elf_count_got_entry (arg->info, arg->g, entry);
33bb52fb
RS
4018 return 1;
4019}
4020
476366af
RS
4021/* A htab_traverse callback for GOT entries, with DATA pointing to a
4022 mips_elf_traverse_got_arg structure. Add all entries to DATA->g,
4023 converting entries for indirect and warning symbols into entries
4024 for the target symbol. Set DATA->g to null on error. */
33bb52fb
RS
4025
4026static int
4027mips_elf_recreate_got (void **entryp, void *data)
4028{
72e7511a 4029 struct mips_got_entry new_entry, *entry;
476366af 4030 struct mips_elf_traverse_got_arg *arg;
33bb52fb
RS
4031 void **slot;
4032
33bb52fb 4033 entry = (struct mips_got_entry *) *entryp;
476366af 4034 arg = (struct mips_elf_traverse_got_arg *) data;
72e7511a
RS
4035 if (entry->abfd != NULL
4036 && entry->symndx == -1
4037 && (entry->d.h->root.root.type == bfd_link_hash_indirect
4038 || entry->d.h->root.root.type == bfd_link_hash_warning))
33bb52fb
RS
4039 {
4040 struct mips_elf_link_hash_entry *h;
4041
72e7511a
RS
4042 new_entry = *entry;
4043 entry = &new_entry;
33bb52fb 4044 h = entry->d.h;
72e7511a 4045 do
634835ae
RS
4046 {
4047 BFD_ASSERT (h->global_got_area == GGA_NONE);
4048 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
4049 }
72e7511a
RS
4050 while (h->root.root.type == bfd_link_hash_indirect
4051 || h->root.root.type == bfd_link_hash_warning);
33bb52fb
RS
4052 entry->d.h = h;
4053 }
476366af 4054 slot = htab_find_slot (arg->g->got_entries, entry, INSERT);
33bb52fb
RS
4055 if (slot == NULL)
4056 {
476366af 4057 arg->g = NULL;
33bb52fb
RS
4058 return 0;
4059 }
4060 if (*slot == NULL)
72e7511a
RS
4061 {
4062 if (entry == &new_entry)
4063 {
4064 entry = bfd_alloc (entry->abfd, sizeof (*entry));
4065 if (!entry)
4066 {
476366af 4067 arg->g = NULL;
72e7511a
RS
4068 return 0;
4069 }
4070 *entry = new_entry;
4071 }
4072 *slot = entry;
476366af 4073 mips_elf_count_got_entry (arg->info, arg->g, entry);
72e7511a 4074 }
33bb52fb
RS
4075 return 1;
4076}
4077
13db6b44
RS
4078/* Return the maximum number of GOT page entries required for RANGE. */
4079
4080static bfd_vma
4081mips_elf_pages_for_range (const struct mips_got_page_range *range)
4082{
4083 return (range->max_addend - range->min_addend + 0x1ffff) >> 16;
4084}
4085
4086/* Record that G requires a page entry that can reach SEC + ADDEND. */
4087
4088static bfd_boolean
4089mips_elf_record_got_page_entry (struct mips_got_info *g,
4090 asection *sec, bfd_signed_vma addend)
4091{
4092 struct mips_got_page_entry lookup, *entry;
4093 struct mips_got_page_range **range_ptr, *range;
4094 bfd_vma old_pages, new_pages;
4095 void **loc;
4096
4097 /* Find the mips_got_page_entry hash table entry for this section. */
4098 lookup.sec = sec;
4099 loc = htab_find_slot (g->got_page_entries, &lookup, INSERT);
4100 if (loc == NULL)
4101 return FALSE;
4102
4103 /* Create a mips_got_page_entry if this is the first time we've
4104 seen the section. */
4105 entry = (struct mips_got_page_entry *) *loc;
4106 if (!entry)
4107 {
4108 entry = bfd_zalloc (sec->owner, sizeof (*entry));
4109 if (!entry)
4110 return FALSE;
4111
4112 entry->sec = sec;
4113 *loc = entry;
4114 }
4115
4116 /* Skip over ranges whose maximum extent cannot share a page entry
4117 with ADDEND. */
4118 range_ptr = &entry->ranges;
4119 while (*range_ptr && addend > (*range_ptr)->max_addend + 0xffff)
4120 range_ptr = &(*range_ptr)->next;
4121
4122 /* If we scanned to the end of the list, or found a range whose
4123 minimum extent cannot share a page entry with ADDEND, create
4124 a new singleton range. */
4125 range = *range_ptr;
4126 if (!range || addend < range->min_addend - 0xffff)
4127 {
4128 range = bfd_zalloc (sec->owner, sizeof (*range));
4129 if (!range)
4130 return FALSE;
4131
4132 range->next = *range_ptr;
4133 range->min_addend = addend;
4134 range->max_addend = addend;
4135
4136 *range_ptr = range;
4137 entry->num_pages++;
4138 g->page_gotno++;
4139 return TRUE;
4140 }
4141
4142 /* Remember how many pages the old range contributed. */
4143 old_pages = mips_elf_pages_for_range (range);
4144
4145 /* Update the ranges. */
4146 if (addend < range->min_addend)
4147 range->min_addend = addend;
4148 else if (addend > range->max_addend)
4149 {
4150 if (range->next && addend >= range->next->min_addend - 0xffff)
4151 {
4152 old_pages += mips_elf_pages_for_range (range->next);
4153 range->max_addend = range->next->max_addend;
4154 range->next = range->next->next;
4155 }
4156 else
4157 range->max_addend = addend;
4158 }
4159
4160 /* Record any change in the total estimate. */
4161 new_pages = mips_elf_pages_for_range (range);
4162 if (old_pages != new_pages)
4163 {
4164 entry->num_pages += new_pages - old_pages;
4165 g->page_gotno += new_pages - old_pages;
4166 }
4167
4168 return TRUE;
4169}
4170
4171/* A htab_traverse callback for which *REFP points to a mips_got_page_ref
4172 and for which DATA points to a mips_elf_traverse_got_arg. Work out
4173 whether the page reference described by *REFP needs a GOT page entry,
4174 and record that entry in DATA->g if so. Set DATA->g to null on failure. */
4175
4176static bfd_boolean
4177mips_elf_resolve_got_page_ref (void **refp, void *data)
4178{
4179 struct mips_got_page_ref *ref;
4180 struct mips_elf_traverse_got_arg *arg;
4181 struct mips_elf_link_hash_table *htab;
4182 asection *sec;
4183 bfd_vma addend;
4184
4185 ref = (struct mips_got_page_ref *) *refp;
4186 arg = (struct mips_elf_traverse_got_arg *) data;
4187 htab = mips_elf_hash_table (arg->info);
4188
4189 if (ref->symndx < 0)
4190 {
4191 struct mips_elf_link_hash_entry *h;
4192
4193 /* Global GOT_PAGEs decay to GOT_DISP and so don't need page entries. */
4194 h = ref->u.h;
4195 if (!SYMBOL_REFERENCES_LOCAL (arg->info, &h->root))
4196 return 1;
4197
4198 /* Ignore undefined symbols; we'll issue an error later if
4199 appropriate. */
4200 if (!((h->root.root.type == bfd_link_hash_defined
4201 || h->root.root.type == bfd_link_hash_defweak)
4202 && h->root.root.u.def.section))
4203 return 1;
4204
4205 sec = h->root.root.u.def.section;
4206 addend = h->root.root.u.def.value + ref->addend;
4207 }
4208 else
4209 {
4210 Elf_Internal_Sym *isym;
4211
4212 /* Read in the symbol. */
4213 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ref->u.abfd,
4214 ref->symndx);
4215 if (isym == NULL)
4216 {
4217 arg->g = NULL;
4218 return 0;
4219 }
4220
4221 /* Get the associated input section. */
4222 sec = bfd_section_from_elf_index (ref->u.abfd, isym->st_shndx);
4223 if (sec == NULL)
4224 {
4225 arg->g = NULL;
4226 return 0;
4227 }
4228
4229 /* If this is a mergable section, work out the section and offset
4230 of the merged data. For section symbols, the addend specifies
4231 of the offset _of_ the first byte in the data, otherwise it
4232 specifies the offset _from_ the first byte. */
4233 if (sec->flags & SEC_MERGE)
4234 {
4235 void *secinfo;
4236
4237 secinfo = elf_section_data (sec)->sec_info;
4238 if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
4239 addend = _bfd_merged_section_offset (ref->u.abfd, &sec, secinfo,
4240 isym->st_value + ref->addend);
4241 else
4242 addend = _bfd_merged_section_offset (ref->u.abfd, &sec, secinfo,
4243 isym->st_value) + ref->addend;
4244 }
4245 else
4246 addend = isym->st_value + ref->addend;
4247 }
4248 if (!mips_elf_record_got_page_entry (arg->g, sec, addend))
4249 {
4250 arg->g = NULL;
4251 return 0;
4252 }
4253 return 1;
4254}
4255
33bb52fb 4256/* If any entries in G->got_entries are for indirect or warning symbols,
13db6b44
RS
4257 replace them with entries for the target symbol. Convert g->got_page_refs
4258 into got_page_entry structures and estimate the number of page entries
4259 that they require. */
33bb52fb
RS
4260
4261static bfd_boolean
476366af
RS
4262mips_elf_resolve_final_got_entries (struct bfd_link_info *info,
4263 struct mips_got_info *g)
33bb52fb 4264{
476366af
RS
4265 struct mips_elf_traverse_got_arg tga;
4266 struct mips_got_info oldg;
4267
4268 oldg = *g;
33bb52fb 4269
476366af
RS
4270 tga.info = info;
4271 tga.g = g;
4272 tga.value = FALSE;
4273 htab_traverse (g->got_entries, mips_elf_check_recreate_got, &tga);
4274 if (tga.value)
33bb52fb 4275 {
476366af
RS
4276 *g = oldg;
4277 g->got_entries = htab_create (htab_size (oldg.got_entries),
4278 mips_elf_got_entry_hash,
4279 mips_elf_got_entry_eq, NULL);
4280 if (!g->got_entries)
33bb52fb
RS
4281 return FALSE;
4282
476366af
RS
4283 htab_traverse (oldg.got_entries, mips_elf_recreate_got, &tga);
4284 if (!tga.g)
4285 return FALSE;
4286
4287 htab_delete (oldg.got_entries);
33bb52fb 4288 }
13db6b44
RS
4289
4290 g->got_page_entries = htab_try_create (1, mips_got_page_entry_hash,
4291 mips_got_page_entry_eq, NULL);
4292 if (g->got_page_entries == NULL)
4293 return FALSE;
4294
4295 tga.info = info;
4296 tga.g = g;
4297 htab_traverse (g->got_page_refs, mips_elf_resolve_got_page_ref, &tga);
4298
33bb52fb
RS
4299 return TRUE;
4300}
4301
6c42ddb9
RS
4302/* A mips_elf_link_hash_traverse callback for which DATA points to the
4303 link_info structure. Decide whether the hash entry needs an entry in
4304 the global part of the primary GOT, setting global_got_area accordingly.
4305 Count the number of global symbols that are in the primary GOT only
4306 because they have relocations against them (reloc_only_gotno). */
33bb52fb
RS
4307
4308static int
d4596a51 4309mips_elf_count_got_symbols (struct mips_elf_link_hash_entry *h, void *data)
33bb52fb 4310{
020d7251 4311 struct bfd_link_info *info;
6ccf4795 4312 struct mips_elf_link_hash_table *htab;
33bb52fb
RS
4313 struct mips_got_info *g;
4314
020d7251 4315 info = (struct bfd_link_info *) data;
6ccf4795
RS
4316 htab = mips_elf_hash_table (info);
4317 g = htab->got_info;
d4596a51 4318 if (h->global_got_area != GGA_NONE)
33bb52fb 4319 {
020d7251
RS
4320 /* Make a final decision about whether the symbol belongs in the
4321 local or global GOT. Symbols that bind locally can (and in the
4322 case of forced-local symbols, must) live in the local GOT.
4323 Those that are aren't in the dynamic symbol table must also
4324 live in the local GOT.
4325
4326 Note that the former condition does not always imply the
4327 latter: symbols do not bind locally if they are completely
4328 undefined. We'll report undefined symbols later if appropriate. */
6ccf4795
RS
4329 if (h->root.dynindx == -1
4330 || (h->got_only_for_calls
4331 ? SYMBOL_CALLS_LOCAL (info, &h->root)
4332 : SYMBOL_REFERENCES_LOCAL (info, &h->root)))
6c42ddb9
RS
4333 /* The symbol belongs in the local GOT. We no longer need this
4334 entry if it was only used for relocations; those relocations
4335 will be against the null or section symbol instead of H. */
4336 h->global_got_area = GGA_NONE;
6ccf4795
RS
4337 else if (htab->is_vxworks
4338 && h->got_only_for_calls
1bbce132 4339 && h->root.plt.plist->mips_offset != MINUS_ONE)
6ccf4795
RS
4340 /* On VxWorks, calls can refer directly to the .got.plt entry;
4341 they don't need entries in the regular GOT. .got.plt entries
4342 will be allocated by _bfd_mips_elf_adjust_dynamic_symbol. */
4343 h->global_got_area = GGA_NONE;
6c42ddb9 4344 else if (h->global_got_area == GGA_RELOC_ONLY)
23cc69b6 4345 {
6c42ddb9 4346 g->reloc_only_gotno++;
23cc69b6 4347 g->global_gotno++;
23cc69b6 4348 }
33bb52fb
RS
4349 }
4350 return 1;
4351}
f4416af6 4352\f
d7206569
RS
4353/* A htab_traverse callback for GOT entries. Add each one to the GOT
4354 given in mips_elf_traverse_got_arg DATA. Clear DATA->G on error. */
f4416af6
AO
4355
4356static int
d7206569 4357mips_elf_add_got_entry (void **entryp, void *data)
f4416af6 4358{
d7206569
RS
4359 struct mips_got_entry *entry;
4360 struct mips_elf_traverse_got_arg *arg;
4361 void **slot;
f4416af6 4362
d7206569
RS
4363 entry = (struct mips_got_entry *) *entryp;
4364 arg = (struct mips_elf_traverse_got_arg *) data;
4365 slot = htab_find_slot (arg->g->got_entries, entry, INSERT);
4366 if (!slot)
f4416af6 4367 {
d7206569
RS
4368 arg->g = NULL;
4369 return 0;
f4416af6 4370 }
d7206569 4371 if (!*slot)
c224138d 4372 {
d7206569
RS
4373 *slot = entry;
4374 mips_elf_count_got_entry (arg->info, arg->g, entry);
c224138d 4375 }
f4416af6
AO
4376 return 1;
4377}
4378
d7206569
RS
4379/* A htab_traverse callback for GOT page entries. Add each one to the GOT
4380 given in mips_elf_traverse_got_arg DATA. Clear DATA->G on error. */
c224138d
RS
4381
4382static int
d7206569 4383mips_elf_add_got_page_entry (void **entryp, void *data)
c224138d 4384{
d7206569
RS
4385 struct mips_got_page_entry *entry;
4386 struct mips_elf_traverse_got_arg *arg;
4387 void **slot;
c224138d 4388
d7206569
RS
4389 entry = (struct mips_got_page_entry *) *entryp;
4390 arg = (struct mips_elf_traverse_got_arg *) data;
4391 slot = htab_find_slot (arg->g->got_page_entries, entry, INSERT);
4392 if (!slot)
c224138d 4393 {
d7206569 4394 arg->g = NULL;
c224138d
RS
4395 return 0;
4396 }
d7206569
RS
4397 if (!*slot)
4398 {
4399 *slot = entry;
4400 arg->g->page_gotno += entry->num_pages;
4401 }
c224138d
RS
4402 return 1;
4403}
4404
d7206569
RS
4405/* Consider merging FROM, which is ABFD's GOT, into TO. Return -1 if
4406 this would lead to overflow, 1 if they were merged successfully,
4407 and 0 if a merge failed due to lack of memory. (These values are chosen
4408 so that nonnegative return values can be returned by a htab_traverse
4409 callback.) */
c224138d
RS
4410
4411static int
d7206569 4412mips_elf_merge_got_with (bfd *abfd, struct mips_got_info *from,
c224138d
RS
4413 struct mips_got_info *to,
4414 struct mips_elf_got_per_bfd_arg *arg)
4415{
d7206569 4416 struct mips_elf_traverse_got_arg tga;
c224138d
RS
4417 unsigned int estimate;
4418
4419 /* Work out how many page entries we would need for the combined GOT. */
4420 estimate = arg->max_pages;
4421 if (estimate >= from->page_gotno + to->page_gotno)
4422 estimate = from->page_gotno + to->page_gotno;
4423
e2ece73c 4424 /* And conservatively estimate how many local and TLS entries
c224138d 4425 would be needed. */
e2ece73c
RS
4426 estimate += from->local_gotno + to->local_gotno;
4427 estimate += from->tls_gotno + to->tls_gotno;
4428
17214937
RS
4429 /* If we're merging with the primary got, any TLS relocations will
4430 come after the full set of global entries. Otherwise estimate those
e2ece73c 4431 conservatively as well. */
17214937 4432 if (to == arg->primary && from->tls_gotno + to->tls_gotno)
e2ece73c
RS
4433 estimate += arg->global_count;
4434 else
4435 estimate += from->global_gotno + to->global_gotno;
c224138d
RS
4436
4437 /* Bail out if the combined GOT might be too big. */
4438 if (estimate > arg->max_count)
4439 return -1;
4440
c224138d 4441 /* Transfer the bfd's got information from FROM to TO. */
d7206569
RS
4442 tga.info = arg->info;
4443 tga.g = to;
4444 htab_traverse (from->got_entries, mips_elf_add_got_entry, &tga);
4445 if (!tga.g)
c224138d
RS
4446 return 0;
4447
d7206569
RS
4448 htab_traverse (from->got_page_entries, mips_elf_add_got_page_entry, &tga);
4449 if (!tga.g)
c224138d
RS
4450 return 0;
4451
d7206569 4452 mips_elf_replace_bfd_got (abfd, to);
c224138d
RS
4453 return 1;
4454}
4455
d7206569 4456/* Attempt to merge GOT G, which belongs to ABFD. Try to use as much
f4416af6
AO
4457 as possible of the primary got, since it doesn't require explicit
4458 dynamic relocations, but don't use bfds that would reference global
4459 symbols out of the addressable range. Failing the primary got,
4460 attempt to merge with the current got, or finish the current got
4461 and then make make the new got current. */
4462
d7206569
RS
4463static bfd_boolean
4464mips_elf_merge_got (bfd *abfd, struct mips_got_info *g,
4465 struct mips_elf_got_per_bfd_arg *arg)
f4416af6 4466{
c224138d
RS
4467 unsigned int estimate;
4468 int result;
4469
476366af 4470 if (!mips_elf_resolve_final_got_entries (arg->info, g))
d7206569
RS
4471 return FALSE;
4472
c224138d
RS
4473 /* Work out the number of page, local and TLS entries. */
4474 estimate = arg->max_pages;
4475 if (estimate > g->page_gotno)
4476 estimate = g->page_gotno;
4477 estimate += g->local_gotno + g->tls_gotno;
0f20cc35
DJ
4478
4479 /* We place TLS GOT entries after both locals and globals. The globals
4480 for the primary GOT may overflow the normal GOT size limit, so be
4481 sure not to merge a GOT which requires TLS with the primary GOT in that
4482 case. This doesn't affect non-primary GOTs. */
c224138d 4483 estimate += (g->tls_gotno > 0 ? arg->global_count : g->global_gotno);
143d77c5 4484
c224138d 4485 if (estimate <= arg->max_count)
f4416af6 4486 {
c224138d
RS
4487 /* If we don't have a primary GOT, use it as
4488 a starting point for the primary GOT. */
4489 if (!arg->primary)
4490 {
d7206569
RS
4491 arg->primary = g;
4492 return TRUE;
c224138d 4493 }
f4416af6 4494
c224138d 4495 /* Try merging with the primary GOT. */
d7206569 4496 result = mips_elf_merge_got_with (abfd, g, arg->primary, arg);
c224138d
RS
4497 if (result >= 0)
4498 return result;
f4416af6 4499 }
c224138d 4500
f4416af6 4501 /* If we can merge with the last-created got, do it. */
c224138d 4502 if (arg->current)
f4416af6 4503 {
d7206569 4504 result = mips_elf_merge_got_with (abfd, g, arg->current, arg);
c224138d
RS
4505 if (result >= 0)
4506 return result;
f4416af6 4507 }
c224138d 4508
f4416af6
AO
4509 /* Well, we couldn't merge, so create a new GOT. Don't check if it
4510 fits; if it turns out that it doesn't, we'll get relocation
4511 overflows anyway. */
c224138d
RS
4512 g->next = arg->current;
4513 arg->current = g;
0f20cc35 4514
d7206569 4515 return TRUE;
0f20cc35
DJ
4516}
4517
72e7511a
RS
4518/* ENTRYP is a hash table entry for a mips_got_entry. Set its gotidx
4519 to GOTIDX, duplicating the entry if it has already been assigned
4520 an index in a different GOT. */
4521
4522static bfd_boolean
4523mips_elf_set_gotidx (void **entryp, long gotidx)
4524{
4525 struct mips_got_entry *entry;
4526
4527 entry = (struct mips_got_entry *) *entryp;
4528 if (entry->gotidx > 0)
4529 {
4530 struct mips_got_entry *new_entry;
4531
4532 new_entry = bfd_alloc (entry->abfd, sizeof (*entry));
4533 if (!new_entry)
4534 return FALSE;
4535
4536 *new_entry = *entry;
4537 *entryp = new_entry;
4538 entry = new_entry;
4539 }
4540 entry->gotidx = gotidx;
4541 return TRUE;
4542}
4543
4544/* Set the TLS GOT index for the GOT entry in ENTRYP. DATA points to a
4545 mips_elf_traverse_got_arg in which DATA->value is the size of one
4546 GOT entry. Set DATA->g to null on failure. */
0f20cc35
DJ
4547
4548static int
72e7511a 4549mips_elf_initialize_tls_index (void **entryp, void *data)
0f20cc35 4550{
72e7511a
RS
4551 struct mips_got_entry *entry;
4552 struct mips_elf_traverse_got_arg *arg;
0f20cc35
DJ
4553
4554 /* We're only interested in TLS symbols. */
72e7511a 4555 entry = (struct mips_got_entry *) *entryp;
9ab066b4 4556 if (entry->tls_type == GOT_TLS_NONE)
0f20cc35
DJ
4557 return 1;
4558
72e7511a 4559 arg = (struct mips_elf_traverse_got_arg *) data;
6c42ddb9 4560 if (!mips_elf_set_gotidx (entryp, arg->value * arg->g->tls_assigned_gotno))
ead49a57 4561 {
6c42ddb9
RS
4562 arg->g = NULL;
4563 return 0;
f4416af6
AO
4564 }
4565
ead49a57 4566 /* Account for the entries we've just allocated. */
9ab066b4 4567 arg->g->tls_assigned_gotno += mips_tls_got_entries (entry->tls_type);
f4416af6
AO
4568 return 1;
4569}
4570
ab361d49
RS
4571/* A htab_traverse callback for GOT entries, where DATA points to a
4572 mips_elf_traverse_got_arg. Set the global_got_area of each global
4573 symbol to DATA->value. */
f4416af6 4574
f4416af6 4575static int
ab361d49 4576mips_elf_set_global_got_area (void **entryp, void *data)
f4416af6 4577{
ab361d49
RS
4578 struct mips_got_entry *entry;
4579 struct mips_elf_traverse_got_arg *arg;
f4416af6 4580
ab361d49
RS
4581 entry = (struct mips_got_entry *) *entryp;
4582 arg = (struct mips_elf_traverse_got_arg *) data;
4583 if (entry->abfd != NULL
4584 && entry->symndx == -1
4585 && entry->d.h->global_got_area != GGA_NONE)
4586 entry->d.h->global_got_area = arg->value;
4587 return 1;
4588}
4589
4590/* A htab_traverse callback for secondary GOT entries, where DATA points
4591 to a mips_elf_traverse_got_arg. Assign GOT indices to global entries
4592 and record the number of relocations they require. DATA->value is
72e7511a 4593 the size of one GOT entry. Set DATA->g to null on failure. */
ab361d49
RS
4594
4595static int
4596mips_elf_set_global_gotidx (void **entryp, void *data)
4597{
4598 struct mips_got_entry *entry;
4599 struct mips_elf_traverse_got_arg *arg;
0f20cc35 4600
ab361d49
RS
4601 entry = (struct mips_got_entry *) *entryp;
4602 arg = (struct mips_elf_traverse_got_arg *) data;
634835ae
RS
4603 if (entry->abfd != NULL
4604 && entry->symndx == -1
4605 && entry->d.h->global_got_area != GGA_NONE)
f4416af6 4606 {
72e7511a
RS
4607 if (!mips_elf_set_gotidx (entryp, arg->value * arg->g->assigned_gotno))
4608 {
4609 arg->g = NULL;
4610 return 0;
4611 }
4612 arg->g->assigned_gotno += 1;
4613
ab361d49
RS
4614 if (arg->info->shared
4615 || (elf_hash_table (arg->info)->dynamic_sections_created
4616 && entry->d.h->root.def_dynamic
4617 && !entry->d.h->root.def_regular))
4618 arg->g->relocs += 1;
f4416af6
AO
4619 }
4620
4621 return 1;
4622}
4623
33bb52fb
RS
4624/* A htab_traverse callback for GOT entries for which DATA is the
4625 bfd_link_info. Forbid any global symbols from having traditional
4626 lazy-binding stubs. */
4627
0626d451 4628static int
33bb52fb 4629mips_elf_forbid_lazy_stubs (void **entryp, void *data)
0626d451 4630{
33bb52fb
RS
4631 struct bfd_link_info *info;
4632 struct mips_elf_link_hash_table *htab;
4633 struct mips_got_entry *entry;
0626d451 4634
33bb52fb
RS
4635 entry = (struct mips_got_entry *) *entryp;
4636 info = (struct bfd_link_info *) data;
4637 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4638 BFD_ASSERT (htab != NULL);
4639
0626d451
RS
4640 if (entry->abfd != NULL
4641 && entry->symndx == -1
33bb52fb 4642 && entry->d.h->needs_lazy_stub)
f4416af6 4643 {
33bb52fb
RS
4644 entry->d.h->needs_lazy_stub = FALSE;
4645 htab->lazy_stub_count--;
f4416af6 4646 }
143d77c5 4647
f4416af6
AO
4648 return 1;
4649}
4650
f4416af6
AO
4651/* Return the offset of an input bfd IBFD's GOT from the beginning of
4652 the primary GOT. */
4653static bfd_vma
9719ad41 4654mips_elf_adjust_gp (bfd *abfd, struct mips_got_info *g, bfd *ibfd)
f4416af6 4655{
d7206569 4656 if (!g->next)
f4416af6
AO
4657 return 0;
4658
d7206569 4659 g = mips_elf_bfd_got (ibfd, FALSE);
f4416af6
AO
4660 if (! g)
4661 return 0;
4662
4663 BFD_ASSERT (g->next);
4664
4665 g = g->next;
143d77c5 4666
0f20cc35
DJ
4667 return (g->local_gotno + g->global_gotno + g->tls_gotno)
4668 * MIPS_ELF_GOT_SIZE (abfd);
f4416af6
AO
4669}
4670
4671/* Turn a single GOT that is too big for 16-bit addressing into
4672 a sequence of GOTs, each one 16-bit addressable. */
4673
4674static bfd_boolean
9719ad41 4675mips_elf_multi_got (bfd *abfd, struct bfd_link_info *info,
a8028dd0 4676 asection *got, bfd_size_type pages)
f4416af6 4677{
a8028dd0 4678 struct mips_elf_link_hash_table *htab;
f4416af6 4679 struct mips_elf_got_per_bfd_arg got_per_bfd_arg;
ab361d49 4680 struct mips_elf_traverse_got_arg tga;
a8028dd0 4681 struct mips_got_info *g, *gg;
33bb52fb 4682 unsigned int assign, needed_relocs;
d7206569 4683 bfd *dynobj, *ibfd;
f4416af6 4684
33bb52fb 4685 dynobj = elf_hash_table (info)->dynobj;
a8028dd0 4686 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
4687 BFD_ASSERT (htab != NULL);
4688
a8028dd0 4689 g = htab->got_info;
f4416af6 4690
f4416af6
AO
4691 got_per_bfd_arg.obfd = abfd;
4692 got_per_bfd_arg.info = info;
f4416af6
AO
4693 got_per_bfd_arg.current = NULL;
4694 got_per_bfd_arg.primary = NULL;
0a44bf69 4695 got_per_bfd_arg.max_count = ((MIPS_ELF_GOT_MAX_SIZE (info)
f4416af6 4696 / MIPS_ELF_GOT_SIZE (abfd))
861fb55a 4697 - htab->reserved_gotno);
c224138d 4698 got_per_bfd_arg.max_pages = pages;
0f20cc35 4699 /* The number of globals that will be included in the primary GOT.
ab361d49 4700 See the calls to mips_elf_set_global_got_area below for more
0f20cc35
DJ
4701 information. */
4702 got_per_bfd_arg.global_count = g->global_gotno;
f4416af6
AO
4703
4704 /* Try to merge the GOTs of input bfds together, as long as they
4705 don't seem to exceed the maximum GOT size, choosing one of them
4706 to be the primary GOT. */
d7206569
RS
4707 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link_next)
4708 {
4709 gg = mips_elf_bfd_got (ibfd, FALSE);
4710 if (gg && !mips_elf_merge_got (ibfd, gg, &got_per_bfd_arg))
4711 return FALSE;
4712 }
f4416af6 4713
0f20cc35 4714 /* If we do not find any suitable primary GOT, create an empty one. */
f4416af6 4715 if (got_per_bfd_arg.primary == NULL)
3dff0dd1 4716 g->next = mips_elf_create_got_info (abfd);
f4416af6
AO
4717 else
4718 g->next = got_per_bfd_arg.primary;
4719 g->next->next = got_per_bfd_arg.current;
4720
4721 /* GG is now the master GOT, and G is the primary GOT. */
4722 gg = g;
4723 g = g->next;
4724
4725 /* Map the output bfd to the primary got. That's what we're going
4726 to use for bfds that use GOT16 or GOT_PAGE relocations that we
4727 didn't mark in check_relocs, and we want a quick way to find it.
4728 We can't just use gg->next because we're going to reverse the
4729 list. */
d7206569 4730 mips_elf_replace_bfd_got (abfd, g);
f4416af6 4731
634835ae
RS
4732 /* Every symbol that is referenced in a dynamic relocation must be
4733 present in the primary GOT, so arrange for them to appear after
4734 those that are actually referenced. */
23cc69b6 4735 gg->reloc_only_gotno = gg->global_gotno - g->global_gotno;
634835ae 4736 g->global_gotno = gg->global_gotno;
f4416af6 4737
ab361d49
RS
4738 tga.info = info;
4739 tga.value = GGA_RELOC_ONLY;
4740 htab_traverse (gg->got_entries, mips_elf_set_global_got_area, &tga);
4741 tga.value = GGA_NORMAL;
4742 htab_traverse (g->got_entries, mips_elf_set_global_got_area, &tga);
f4416af6
AO
4743
4744 /* Now go through the GOTs assigning them offset ranges.
4745 [assigned_gotno, local_gotno[ will be set to the range of local
4746 entries in each GOT. We can then compute the end of a GOT by
4747 adding local_gotno to global_gotno. We reverse the list and make
4748 it circular since then we'll be able to quickly compute the
4749 beginning of a GOT, by computing the end of its predecessor. To
4750 avoid special cases for the primary GOT, while still preserving
4751 assertions that are valid for both single- and multi-got links,
4752 we arrange for the main got struct to have the right number of
4753 global entries, but set its local_gotno such that the initial
4754 offset of the primary GOT is zero. Remember that the primary GOT
4755 will become the last item in the circular linked list, so it
4756 points back to the master GOT. */
4757 gg->local_gotno = -g->global_gotno;
4758 gg->global_gotno = g->global_gotno;
0f20cc35 4759 gg->tls_gotno = 0;
f4416af6
AO
4760 assign = 0;
4761 gg->next = gg;
4762
4763 do
4764 {
4765 struct mips_got_info *gn;
4766
861fb55a 4767 assign += htab->reserved_gotno;
f4416af6 4768 g->assigned_gotno = assign;
c224138d
RS
4769 g->local_gotno += assign;
4770 g->local_gotno += (pages < g->page_gotno ? pages : g->page_gotno);
0f20cc35
DJ
4771 assign = g->local_gotno + g->global_gotno + g->tls_gotno;
4772
ead49a57
RS
4773 /* Take g out of the direct list, and push it onto the reversed
4774 list that gg points to. g->next is guaranteed to be nonnull after
4775 this operation, as required by mips_elf_initialize_tls_index. */
4776 gn = g->next;
4777 g->next = gg->next;
4778 gg->next = g;
4779
0f20cc35
DJ
4780 /* Set up any TLS entries. We always place the TLS entries after
4781 all non-TLS entries. */
4782 g->tls_assigned_gotno = g->local_gotno + g->global_gotno;
72e7511a
RS
4783 tga.g = g;
4784 tga.value = MIPS_ELF_GOT_SIZE (abfd);
4785 htab_traverse (g->got_entries, mips_elf_initialize_tls_index, &tga);
4786 if (!tga.g)
4787 return FALSE;
1fd20d70 4788 BFD_ASSERT (g->tls_assigned_gotno == assign);
f4416af6 4789
ead49a57 4790 /* Move onto the next GOT. It will be a secondary GOT if nonull. */
f4416af6 4791 g = gn;
0626d451 4792
33bb52fb
RS
4793 /* Forbid global symbols in every non-primary GOT from having
4794 lazy-binding stubs. */
0626d451 4795 if (g)
33bb52fb 4796 htab_traverse (g->got_entries, mips_elf_forbid_lazy_stubs, info);
f4416af6
AO
4797 }
4798 while (g);
4799
59b08994 4800 got->size = assign * MIPS_ELF_GOT_SIZE (abfd);
33bb52fb
RS
4801
4802 needed_relocs = 0;
33bb52fb
RS
4803 for (g = gg->next; g && g->next != gg; g = g->next)
4804 {
4805 unsigned int save_assign;
4806
ab361d49
RS
4807 /* Assign offsets to global GOT entries and count how many
4808 relocations they need. */
33bb52fb
RS
4809 save_assign = g->assigned_gotno;
4810 g->assigned_gotno = g->local_gotno;
ab361d49
RS
4811 tga.info = info;
4812 tga.value = MIPS_ELF_GOT_SIZE (abfd);
4813 tga.g = g;
4814 htab_traverse (g->got_entries, mips_elf_set_global_gotidx, &tga);
72e7511a
RS
4815 if (!tga.g)
4816 return FALSE;
4817 BFD_ASSERT (g->assigned_gotno == g->local_gotno + g->global_gotno);
33bb52fb 4818 g->assigned_gotno = save_assign;
72e7511a 4819
33bb52fb
RS
4820 if (info->shared)
4821 {
ab361d49 4822 g->relocs += g->local_gotno - g->assigned_gotno;
33bb52fb
RS
4823 BFD_ASSERT (g->assigned_gotno == g->next->local_gotno
4824 + g->next->global_gotno
4825 + g->next->tls_gotno
861fb55a 4826 + htab->reserved_gotno);
33bb52fb 4827 }
ab361d49 4828 needed_relocs += g->relocs;
33bb52fb 4829 }
ab361d49 4830 needed_relocs += g->relocs;
33bb52fb
RS
4831
4832 if (needed_relocs)
4833 mips_elf_allocate_dynamic_relocations (dynobj, info,
4834 needed_relocs);
143d77c5 4835
f4416af6
AO
4836 return TRUE;
4837}
143d77c5 4838
b49e97c9
TS
4839\f
4840/* Returns the first relocation of type r_type found, beginning with
4841 RELOCATION. RELEND is one-past-the-end of the relocation table. */
4842
4843static const Elf_Internal_Rela *
9719ad41
RS
4844mips_elf_next_relocation (bfd *abfd ATTRIBUTE_UNUSED, unsigned int r_type,
4845 const Elf_Internal_Rela *relocation,
4846 const Elf_Internal_Rela *relend)
b49e97c9 4847{
c000e262
TS
4848 unsigned long r_symndx = ELF_R_SYM (abfd, relocation->r_info);
4849
b49e97c9
TS
4850 while (relocation < relend)
4851 {
c000e262
TS
4852 if (ELF_R_TYPE (abfd, relocation->r_info) == r_type
4853 && ELF_R_SYM (abfd, relocation->r_info) == r_symndx)
b49e97c9
TS
4854 return relocation;
4855
4856 ++relocation;
4857 }
4858
4859 /* We didn't find it. */
b49e97c9
TS
4860 return NULL;
4861}
4862
020d7251 4863/* Return whether an input relocation is against a local symbol. */
b49e97c9 4864
b34976b6 4865static bfd_boolean
9719ad41
RS
4866mips_elf_local_relocation_p (bfd *input_bfd,
4867 const Elf_Internal_Rela *relocation,
020d7251 4868 asection **local_sections)
b49e97c9
TS
4869{
4870 unsigned long r_symndx;
4871 Elf_Internal_Shdr *symtab_hdr;
b49e97c9
TS
4872 size_t extsymoff;
4873
4874 r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
4875 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4876 extsymoff = (elf_bad_symtab (input_bfd)) ? 0 : symtab_hdr->sh_info;
4877
4878 if (r_symndx < extsymoff)
b34976b6 4879 return TRUE;
b49e97c9 4880 if (elf_bad_symtab (input_bfd) && local_sections[r_symndx] != NULL)
b34976b6 4881 return TRUE;
b49e97c9 4882
b34976b6 4883 return FALSE;
b49e97c9
TS
4884}
4885\f
4886/* Sign-extend VALUE, which has the indicated number of BITS. */
4887
a7ebbfdf 4888bfd_vma
9719ad41 4889_bfd_mips_elf_sign_extend (bfd_vma value, int bits)
b49e97c9
TS
4890{
4891 if (value & ((bfd_vma) 1 << (bits - 1)))
4892 /* VALUE is negative. */
4893 value |= ((bfd_vma) - 1) << bits;
4894
4895 return value;
4896}
4897
4898/* Return non-zero if the indicated VALUE has overflowed the maximum
4cc11e76 4899 range expressible by a signed number with the indicated number of
b49e97c9
TS
4900 BITS. */
4901
b34976b6 4902static bfd_boolean
9719ad41 4903mips_elf_overflow_p (bfd_vma value, int bits)
b49e97c9
TS
4904{
4905 bfd_signed_vma svalue = (bfd_signed_vma) value;
4906
4907 if (svalue > (1 << (bits - 1)) - 1)
4908 /* The value is too big. */
b34976b6 4909 return TRUE;
b49e97c9
TS
4910 else if (svalue < -(1 << (bits - 1)))
4911 /* The value is too small. */
b34976b6 4912 return TRUE;
b49e97c9
TS
4913
4914 /* All is well. */
b34976b6 4915 return FALSE;
b49e97c9
TS
4916}
4917
4918/* Calculate the %high function. */
4919
4920static bfd_vma
9719ad41 4921mips_elf_high (bfd_vma value)
b49e97c9
TS
4922{
4923 return ((value + (bfd_vma) 0x8000) >> 16) & 0xffff;
4924}
4925
4926/* Calculate the %higher function. */
4927
4928static bfd_vma
9719ad41 4929mips_elf_higher (bfd_vma value ATTRIBUTE_UNUSED)
b49e97c9
TS
4930{
4931#ifdef BFD64
4932 return ((value + (bfd_vma) 0x80008000) >> 32) & 0xffff;
4933#else
4934 abort ();
c5ae1840 4935 return MINUS_ONE;
b49e97c9
TS
4936#endif
4937}
4938
4939/* Calculate the %highest function. */
4940
4941static bfd_vma
9719ad41 4942mips_elf_highest (bfd_vma value ATTRIBUTE_UNUSED)
b49e97c9
TS
4943{
4944#ifdef BFD64
b15e6682 4945 return ((value + (((bfd_vma) 0x8000 << 32) | 0x80008000)) >> 48) & 0xffff;
b49e97c9
TS
4946#else
4947 abort ();
c5ae1840 4948 return MINUS_ONE;
b49e97c9
TS
4949#endif
4950}
4951\f
4952/* Create the .compact_rel section. */
4953
b34976b6 4954static bfd_boolean
9719ad41
RS
4955mips_elf_create_compact_rel_section
4956 (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
b49e97c9
TS
4957{
4958 flagword flags;
4959 register asection *s;
4960
3d4d4302 4961 if (bfd_get_linker_section (abfd, ".compact_rel") == NULL)
b49e97c9
TS
4962 {
4963 flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED
4964 | SEC_READONLY);
4965
3d4d4302 4966 s = bfd_make_section_anyway_with_flags (abfd, ".compact_rel", flags);
b49e97c9 4967 if (s == NULL
b49e97c9
TS
4968 || ! bfd_set_section_alignment (abfd, s,
4969 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
b34976b6 4970 return FALSE;
b49e97c9 4971
eea6121a 4972 s->size = sizeof (Elf32_External_compact_rel);
b49e97c9
TS
4973 }
4974
b34976b6 4975 return TRUE;
b49e97c9
TS
4976}
4977
4978/* Create the .got section to hold the global offset table. */
4979
b34976b6 4980static bfd_boolean
23cc69b6 4981mips_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
b49e97c9
TS
4982{
4983 flagword flags;
4984 register asection *s;
4985 struct elf_link_hash_entry *h;
14a793b2 4986 struct bfd_link_hash_entry *bh;
0a44bf69
RS
4987 struct mips_elf_link_hash_table *htab;
4988
4989 htab = mips_elf_hash_table (info);
4dfe6ac6 4990 BFD_ASSERT (htab != NULL);
b49e97c9
TS
4991
4992 /* This function may be called more than once. */
23cc69b6
RS
4993 if (htab->sgot)
4994 return TRUE;
b49e97c9
TS
4995
4996 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4997 | SEC_LINKER_CREATED);
4998
72b4917c
TS
4999 /* We have to use an alignment of 2**4 here because this is hardcoded
5000 in the function stub generation and in the linker script. */
87e0a731 5001 s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
b49e97c9 5002 if (s == NULL
72b4917c 5003 || ! bfd_set_section_alignment (abfd, s, 4))
b34976b6 5004 return FALSE;
a8028dd0 5005 htab->sgot = s;
b49e97c9
TS
5006
5007 /* Define the symbol _GLOBAL_OFFSET_TABLE_. We don't do this in the
5008 linker script because we don't want to define the symbol if we
5009 are not creating a global offset table. */
14a793b2 5010 bh = NULL;
b49e97c9
TS
5011 if (! (_bfd_generic_link_add_one_symbol
5012 (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
9719ad41 5013 0, NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 5014 return FALSE;
14a793b2
AM
5015
5016 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
5017 h->non_elf = 0;
5018 h->def_regular = 1;
b49e97c9 5019 h->type = STT_OBJECT;
d329bcd1 5020 elf_hash_table (info)->hgot = h;
b49e97c9
TS
5021
5022 if (info->shared
c152c796 5023 && ! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 5024 return FALSE;
b49e97c9 5025
3dff0dd1 5026 htab->got_info = mips_elf_create_got_info (abfd);
f0abc2a1 5027 mips_elf_section_data (s)->elf.this_hdr.sh_flags
b49e97c9
TS
5028 |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
5029
861fb55a 5030 /* We also need a .got.plt section when generating PLTs. */
87e0a731
AM
5031 s = bfd_make_section_anyway_with_flags (abfd, ".got.plt",
5032 SEC_ALLOC | SEC_LOAD
5033 | SEC_HAS_CONTENTS
5034 | SEC_IN_MEMORY
5035 | SEC_LINKER_CREATED);
861fb55a
DJ
5036 if (s == NULL)
5037 return FALSE;
5038 htab->sgotplt = s;
0a44bf69 5039
b34976b6 5040 return TRUE;
b49e97c9 5041}
b49e97c9 5042\f
0a44bf69
RS
5043/* Return true if H refers to the special VxWorks __GOTT_BASE__ or
5044 __GOTT_INDEX__ symbols. These symbols are only special for
5045 shared objects; they are not used in executables. */
5046
5047static bfd_boolean
5048is_gott_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h)
5049{
5050 return (mips_elf_hash_table (info)->is_vxworks
5051 && info->shared
5052 && (strcmp (h->root.root.string, "__GOTT_BASE__") == 0
5053 || strcmp (h->root.root.string, "__GOTT_INDEX__") == 0));
5054}
861fb55a
DJ
5055
5056/* Return TRUE if a relocation of type R_TYPE from INPUT_BFD might
5057 require an la25 stub. See also mips_elf_local_pic_function_p,
5058 which determines whether the destination function ever requires a
5059 stub. */
5060
5061static bfd_boolean
8f0c309a
CLT
5062mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type,
5063 bfd_boolean target_is_16_bit_code_p)
861fb55a
DJ
5064{
5065 /* We specifically ignore branches and jumps from EF_PIC objects,
5066 where the onus is on the compiler or programmer to perform any
5067 necessary initialization of $25. Sometimes such initialization
5068 is unnecessary; for example, -mno-shared functions do not use
5069 the incoming value of $25, and may therefore be called directly. */
5070 if (PIC_OBJECT_P (input_bfd))
5071 return FALSE;
5072
5073 switch (r_type)
5074 {
5075 case R_MIPS_26:
5076 case R_MIPS_PC16:
df58fc94
RS
5077 case R_MICROMIPS_26_S1:
5078 case R_MICROMIPS_PC7_S1:
5079 case R_MICROMIPS_PC10_S1:
5080 case R_MICROMIPS_PC16_S1:
5081 case R_MICROMIPS_PC23_S2:
861fb55a
DJ
5082 return TRUE;
5083
8f0c309a
CLT
5084 case R_MIPS16_26:
5085 return !target_is_16_bit_code_p;
5086
861fb55a
DJ
5087 default:
5088 return FALSE;
5089 }
5090}
0a44bf69 5091\f
b49e97c9
TS
5092/* Calculate the value produced by the RELOCATION (which comes from
5093 the INPUT_BFD). The ADDEND is the addend to use for this
5094 RELOCATION; RELOCATION->R_ADDEND is ignored.
5095
5096 The result of the relocation calculation is stored in VALUEP.
38a7df63 5097 On exit, set *CROSS_MODE_JUMP_P to true if the relocation field
df58fc94 5098 is a MIPS16 or microMIPS jump to standard MIPS code, or vice versa.
b49e97c9
TS
5099
5100 This function returns bfd_reloc_continue if the caller need take no
5101 further action regarding this relocation, bfd_reloc_notsupported if
5102 something goes dramatically wrong, bfd_reloc_overflow if an
5103 overflow occurs, and bfd_reloc_ok to indicate success. */
5104
5105static bfd_reloc_status_type
9719ad41
RS
5106mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
5107 asection *input_section,
5108 struct bfd_link_info *info,
5109 const Elf_Internal_Rela *relocation,
5110 bfd_vma addend, reloc_howto_type *howto,
5111 Elf_Internal_Sym *local_syms,
5112 asection **local_sections, bfd_vma *valuep,
38a7df63
CF
5113 const char **namep,
5114 bfd_boolean *cross_mode_jump_p,
9719ad41 5115 bfd_boolean save_addend)
b49e97c9
TS
5116{
5117 /* The eventual value we will return. */
5118 bfd_vma value;
5119 /* The address of the symbol against which the relocation is
5120 occurring. */
5121 bfd_vma symbol = 0;
5122 /* The final GP value to be used for the relocatable, executable, or
5123 shared object file being produced. */
0a61c8c2 5124 bfd_vma gp;
b49e97c9
TS
5125 /* The place (section offset or address) of the storage unit being
5126 relocated. */
5127 bfd_vma p;
5128 /* The value of GP used to create the relocatable object. */
0a61c8c2 5129 bfd_vma gp0;
b49e97c9
TS
5130 /* The offset into the global offset table at which the address of
5131 the relocation entry symbol, adjusted by the addend, resides
5132 during execution. */
5133 bfd_vma g = MINUS_ONE;
5134 /* The section in which the symbol referenced by the relocation is
5135 located. */
5136 asection *sec = NULL;
5137 struct mips_elf_link_hash_entry *h = NULL;
b34976b6 5138 /* TRUE if the symbol referred to by this relocation is a local
b49e97c9 5139 symbol. */
b34976b6
AM
5140 bfd_boolean local_p, was_local_p;
5141 /* TRUE if the symbol referred to by this relocation is "_gp_disp". */
5142 bfd_boolean gp_disp_p = FALSE;
bbe506e8
TS
5143 /* TRUE if the symbol referred to by this relocation is
5144 "__gnu_local_gp". */
5145 bfd_boolean gnu_local_gp_p = FALSE;
b49e97c9
TS
5146 Elf_Internal_Shdr *symtab_hdr;
5147 size_t extsymoff;
5148 unsigned long r_symndx;
5149 int r_type;
b34976b6 5150 /* TRUE if overflow occurred during the calculation of the
b49e97c9 5151 relocation value. */
b34976b6
AM
5152 bfd_boolean overflowed_p;
5153 /* TRUE if this relocation refers to a MIPS16 function. */
5154 bfd_boolean target_is_16_bit_code_p = FALSE;
df58fc94 5155 bfd_boolean target_is_micromips_code_p = FALSE;
0a44bf69
RS
5156 struct mips_elf_link_hash_table *htab;
5157 bfd *dynobj;
5158
5159 dynobj = elf_hash_table (info)->dynobj;
5160 htab = mips_elf_hash_table (info);
4dfe6ac6 5161 BFD_ASSERT (htab != NULL);
b49e97c9
TS
5162
5163 /* Parse the relocation. */
5164 r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
5165 r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
5166 p = (input_section->output_section->vma
5167 + input_section->output_offset
5168 + relocation->r_offset);
5169
5170 /* Assume that there will be no overflow. */
b34976b6 5171 overflowed_p = FALSE;
b49e97c9
TS
5172
5173 /* Figure out whether or not the symbol is local, and get the offset
5174 used in the array of hash table entries. */
5175 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5176 local_p = mips_elf_local_relocation_p (input_bfd, relocation,
020d7251 5177 local_sections);
bce03d3d 5178 was_local_p = local_p;
b49e97c9
TS
5179 if (! elf_bad_symtab (input_bfd))
5180 extsymoff = symtab_hdr->sh_info;
5181 else
5182 {
5183 /* The symbol table does not follow the rule that local symbols
5184 must come before globals. */
5185 extsymoff = 0;
5186 }
5187
5188 /* Figure out the value of the symbol. */
5189 if (local_p)
5190 {
5191 Elf_Internal_Sym *sym;
5192
5193 sym = local_syms + r_symndx;
5194 sec = local_sections[r_symndx];
5195
5196 symbol = sec->output_section->vma + sec->output_offset;
d4df96e6
L
5197 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION
5198 || (sec->flags & SEC_MERGE))
b49e97c9 5199 symbol += sym->st_value;
d4df96e6
L
5200 if ((sec->flags & SEC_MERGE)
5201 && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
5202 {
5203 addend = _bfd_elf_rel_local_sym (abfd, sym, &sec, addend);
5204 addend -= symbol;
5205 addend += sec->output_section->vma + sec->output_offset;
5206 }
b49e97c9 5207
df58fc94
RS
5208 /* MIPS16/microMIPS text labels should be treated as odd. */
5209 if (ELF_ST_IS_COMPRESSED (sym->st_other))
b49e97c9
TS
5210 ++symbol;
5211
5212 /* Record the name of this symbol, for our caller. */
5213 *namep = bfd_elf_string_from_elf_section (input_bfd,
5214 symtab_hdr->sh_link,
5215 sym->st_name);
5216 if (*namep == '\0')
5217 *namep = bfd_section_name (input_bfd, sec);
5218
30c09090 5219 target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (sym->st_other);
df58fc94 5220 target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (sym->st_other);
b49e97c9
TS
5221 }
5222 else
5223 {
560e09e9
NC
5224 /* ??? Could we use RELOC_FOR_GLOBAL_SYMBOL here ? */
5225
b49e97c9
TS
5226 /* For global symbols we look up the symbol in the hash-table. */
5227 h = ((struct mips_elf_link_hash_entry *)
5228 elf_sym_hashes (input_bfd) [r_symndx - extsymoff]);
5229 /* Find the real hash-table entry for this symbol. */
5230 while (h->root.root.type == bfd_link_hash_indirect
5231 || h->root.root.type == bfd_link_hash_warning)
5232 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
5233
5234 /* Record the name of this symbol, for our caller. */
5235 *namep = h->root.root.root.string;
5236
5237 /* See if this is the special _gp_disp symbol. Note that such a
5238 symbol must always be a global symbol. */
560e09e9 5239 if (strcmp (*namep, "_gp_disp") == 0
b49e97c9
TS
5240 && ! NEWABI_P (input_bfd))
5241 {
5242 /* Relocations against _gp_disp are permitted only with
5243 R_MIPS_HI16 and R_MIPS_LO16 relocations. */
738e5348 5244 if (!hi16_reloc_p (r_type) && !lo16_reloc_p (r_type))
b49e97c9
TS
5245 return bfd_reloc_notsupported;
5246
b34976b6 5247 gp_disp_p = TRUE;
b49e97c9 5248 }
bbe506e8
TS
5249 /* See if this is the special _gp symbol. Note that such a
5250 symbol must always be a global symbol. */
5251 else if (strcmp (*namep, "__gnu_local_gp") == 0)
5252 gnu_local_gp_p = TRUE;
5253
5254
b49e97c9
TS
5255 /* If this symbol is defined, calculate its address. Note that
5256 _gp_disp is a magic symbol, always implicitly defined by the
5257 linker, so it's inappropriate to check to see whether or not
5258 its defined. */
5259 else if ((h->root.root.type == bfd_link_hash_defined
5260 || h->root.root.type == bfd_link_hash_defweak)
5261 && h->root.root.u.def.section)
5262 {
5263 sec = h->root.root.u.def.section;
5264 if (sec->output_section)
5265 symbol = (h->root.root.u.def.value
5266 + sec->output_section->vma
5267 + sec->output_offset);
5268 else
5269 symbol = h->root.root.u.def.value;
5270 }
5271 else if (h->root.root.type == bfd_link_hash_undefweak)
5272 /* We allow relocations against undefined weak symbols, giving
5273 it the value zero, so that you can undefined weak functions
5274 and check to see if they exist by looking at their
5275 addresses. */
5276 symbol = 0;
59c2e50f 5277 else if (info->unresolved_syms_in_objects == RM_IGNORE
b49e97c9
TS
5278 && ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
5279 symbol = 0;
a4d0f181
TS
5280 else if (strcmp (*namep, SGI_COMPAT (input_bfd)
5281 ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING") == 0)
b49e97c9
TS
5282 {
5283 /* If this is a dynamic link, we should have created a
5284 _DYNAMIC_LINK symbol or _DYNAMIC_LINKING(for normal mips) symbol
5285 in in _bfd_mips_elf_create_dynamic_sections.
5286 Otherwise, we should define the symbol with a value of 0.
5287 FIXME: It should probably get into the symbol table
5288 somehow as well. */
5289 BFD_ASSERT (! info->shared);
5290 BFD_ASSERT (bfd_get_section_by_name (abfd, ".dynamic") == NULL);
5291 symbol = 0;
5292 }
5e2b0d47
NC
5293 else if (ELF_MIPS_IS_OPTIONAL (h->root.other))
5294 {
5295 /* This is an optional symbol - an Irix specific extension to the
5296 ELF spec. Ignore it for now.
5297 XXX - FIXME - there is more to the spec for OPTIONAL symbols
5298 than simply ignoring them, but we do not handle this for now.
5299 For information see the "64-bit ELF Object File Specification"
5300 which is available from here:
5301 http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf */
5302 symbol = 0;
5303 }
e7e2196d
MR
5304 else if ((*info->callbacks->undefined_symbol)
5305 (info, h->root.root.root.string, input_bfd,
5306 input_section, relocation->r_offset,
5307 (info->unresolved_syms_in_objects == RM_GENERATE_ERROR)
5308 || ELF_ST_VISIBILITY (h->root.other)))
5309 {
5310 return bfd_reloc_undefined;
5311 }
b49e97c9
TS
5312 else
5313 {
e7e2196d 5314 return bfd_reloc_notsupported;
b49e97c9
TS
5315 }
5316
30c09090 5317 target_is_16_bit_code_p = ELF_ST_IS_MIPS16 (h->root.other);
1bbce132 5318 target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (h->root.other);
b49e97c9
TS
5319 }
5320
738e5348
RS
5321 /* If this is a reference to a 16-bit function with a stub, we need
5322 to redirect the relocation to the stub unless:
5323
5324 (a) the relocation is for a MIPS16 JAL;
5325
5326 (b) the relocation is for a MIPS16 PIC call, and there are no
5327 non-MIPS16 uses of the GOT slot; or
5328
5329 (c) the section allows direct references to MIPS16 functions. */
5330 if (r_type != R_MIPS16_26
5331 && !info->relocatable
5332 && ((h != NULL
5333 && h->fn_stub != NULL
5334 && (r_type != R_MIPS16_CALL16 || h->need_fn_stub))
b9d58d71 5335 || (local_p
698600e4
AM
5336 && mips_elf_tdata (input_bfd)->local_stubs != NULL
5337 && mips_elf_tdata (input_bfd)->local_stubs[r_symndx] != NULL))
738e5348 5338 && !section_allows_mips16_refs_p (input_section))
b49e97c9
TS
5339 {
5340 /* This is a 32- or 64-bit call to a 16-bit function. We should
5341 have already noticed that we were going to need the
5342 stub. */
5343 if (local_p)
8f0c309a 5344 {
698600e4 5345 sec = mips_elf_tdata (input_bfd)->local_stubs[r_symndx];
8f0c309a
CLT
5346 value = 0;
5347 }
b49e97c9
TS
5348 else
5349 {
5350 BFD_ASSERT (h->need_fn_stub);
8f0c309a
CLT
5351 if (h->la25_stub)
5352 {
5353 /* If a LA25 header for the stub itself exists, point to the
5354 prepended LUI/ADDIU sequence. */
5355 sec = h->la25_stub->stub_section;
5356 value = h->la25_stub->offset;
5357 }
5358 else
5359 {
5360 sec = h->fn_stub;
5361 value = 0;
5362 }
b49e97c9
TS
5363 }
5364
8f0c309a 5365 symbol = sec->output_section->vma + sec->output_offset + value;
f38c2df5
TS
5366 /* The target is 16-bit, but the stub isn't. */
5367 target_is_16_bit_code_p = FALSE;
b49e97c9 5368 }
1bbce132
MR
5369 /* If this is a MIPS16 call with a stub, that is made through the PLT or
5370 to a standard MIPS function, we need to redirect the call to the stub.
5371 Note that we specifically exclude R_MIPS16_CALL16 from this behavior;
5372 indirect calls should use an indirect stub instead. */
1049f94e 5373 else if (r_type == R_MIPS16_26 && !info->relocatable
b314ec0e 5374 && ((h != NULL && (h->call_stub != NULL || h->call_fp_stub != NULL))
b9d58d71 5375 || (local_p
698600e4
AM
5376 && mips_elf_tdata (input_bfd)->local_call_stubs != NULL
5377 && mips_elf_tdata (input_bfd)->local_call_stubs[r_symndx] != NULL))
1bbce132 5378 && ((h != NULL && h->use_plt_entry) || !target_is_16_bit_code_p))
b49e97c9 5379 {
b9d58d71 5380 if (local_p)
698600e4 5381 sec = mips_elf_tdata (input_bfd)->local_call_stubs[r_symndx];
b9d58d71 5382 else
b49e97c9 5383 {
b9d58d71
TS
5384 /* If both call_stub and call_fp_stub are defined, we can figure
5385 out which one to use by checking which one appears in the input
5386 file. */
5387 if (h->call_stub != NULL && h->call_fp_stub != NULL)
b49e97c9 5388 {
b9d58d71 5389 asection *o;
68ffbac6 5390
b9d58d71
TS
5391 sec = NULL;
5392 for (o = input_bfd->sections; o != NULL; o = o->next)
b49e97c9 5393 {
b9d58d71
TS
5394 if (CALL_FP_STUB_P (bfd_get_section_name (input_bfd, o)))
5395 {
5396 sec = h->call_fp_stub;
5397 break;
5398 }
b49e97c9 5399 }
b9d58d71
TS
5400 if (sec == NULL)
5401 sec = h->call_stub;
b49e97c9 5402 }
b9d58d71 5403 else if (h->call_stub != NULL)
b49e97c9 5404 sec = h->call_stub;
b9d58d71
TS
5405 else
5406 sec = h->call_fp_stub;
5407 }
b49e97c9 5408
eea6121a 5409 BFD_ASSERT (sec->size > 0);
b49e97c9
TS
5410 symbol = sec->output_section->vma + sec->output_offset;
5411 }
861fb55a
DJ
5412 /* If this is a direct call to a PIC function, redirect to the
5413 non-PIC stub. */
5414 else if (h != NULL && h->la25_stub
8f0c309a
CLT
5415 && mips_elf_relocation_needs_la25_stub (input_bfd, r_type,
5416 target_is_16_bit_code_p))
861fb55a
DJ
5417 symbol = (h->la25_stub->stub_section->output_section->vma
5418 + h->la25_stub->stub_section->output_offset
5419 + h->la25_stub->offset);
1bbce132
MR
5420 /* For direct MIPS16 and microMIPS calls make sure the compressed PLT
5421 entry is used if a standard PLT entry has also been made. In this
5422 case the symbol will have been set by mips_elf_set_plt_sym_value
5423 to point to the standard PLT entry, so redirect to the compressed
5424 one. */
5425 else if ((r_type == R_MIPS16_26 || r_type == R_MICROMIPS_26_S1)
5426 && !info->relocatable
5427 && h != NULL
5428 && h->use_plt_entry
5429 && h->root.plt.plist->comp_offset != MINUS_ONE
5430 && h->root.plt.plist->mips_offset != MINUS_ONE)
5431 {
5432 bfd_boolean micromips_p = MICROMIPS_P (abfd);
5433
5434 sec = htab->splt;
5435 symbol = (sec->output_section->vma
5436 + sec->output_offset
5437 + htab->plt_header_size
5438 + htab->plt_mips_offset
5439 + h->root.plt.plist->comp_offset
5440 + 1);
5441
5442 target_is_16_bit_code_p = !micromips_p;
5443 target_is_micromips_code_p = micromips_p;
5444 }
b49e97c9 5445
df58fc94
RS
5446 /* Make sure MIPS16 and microMIPS are not used together. */
5447 if ((r_type == R_MIPS16_26 && target_is_micromips_code_p)
5448 || (micromips_branch_reloc_p (r_type) && target_is_16_bit_code_p))
5449 {
5450 (*_bfd_error_handler)
5451 (_("MIPS16 and microMIPS functions cannot call each other"));
5452 return bfd_reloc_notsupported;
5453 }
5454
b49e97c9 5455 /* Calls from 16-bit code to 32-bit code and vice versa require the
df58fc94
RS
5456 mode change. However, we can ignore calls to undefined weak symbols,
5457 which should never be executed at runtime. This exception is important
5458 because the assembly writer may have "known" that any definition of the
5459 symbol would be 16-bit code, and that direct jumps were therefore
5460 acceptable. */
5461 *cross_mode_jump_p = (!info->relocatable
5462 && !(h && h->root.root.type == bfd_link_hash_undefweak)
5463 && ((r_type == R_MIPS16_26 && !target_is_16_bit_code_p)
5464 || (r_type == R_MICROMIPS_26_S1
5465 && !target_is_micromips_code_p)
5466 || ((r_type == R_MIPS_26 || r_type == R_MIPS_JALR)
5467 && (target_is_16_bit_code_p
5468 || target_is_micromips_code_p))));
b49e97c9 5469
9f1a453e
MR
5470 local_p = (h == NULL
5471 || (h->got_only_for_calls
5472 ? SYMBOL_CALLS_LOCAL (info, &h->root)
5473 : SYMBOL_REFERENCES_LOCAL (info, &h->root)));
b49e97c9 5474
0a61c8c2
RS
5475 gp0 = _bfd_get_gp_value (input_bfd);
5476 gp = _bfd_get_gp_value (abfd);
23cc69b6 5477 if (htab->got_info)
a8028dd0 5478 gp += mips_elf_adjust_gp (abfd, htab->got_info, input_bfd);
0a61c8c2
RS
5479
5480 if (gnu_local_gp_p)
5481 symbol = gp;
5482
df58fc94
RS
5483 /* Global R_MIPS_GOT_PAGE/R_MICROMIPS_GOT_PAGE relocations are equivalent
5484 to R_MIPS_GOT_DISP/R_MICROMIPS_GOT_DISP. The addend is applied by the
5485 corresponding R_MIPS_GOT_OFST/R_MICROMIPS_GOT_OFST. */
5486 if (got_page_reloc_p (r_type) && !local_p)
020d7251 5487 {
df58fc94
RS
5488 r_type = (micromips_reloc_p (r_type)
5489 ? R_MICROMIPS_GOT_DISP : R_MIPS_GOT_DISP);
020d7251
RS
5490 addend = 0;
5491 }
5492
e77760d2 5493 /* If we haven't already determined the GOT offset, and we're going
0a61c8c2 5494 to need it, get it now. */
b49e97c9
TS
5495 switch (r_type)
5496 {
738e5348
RS
5497 case R_MIPS16_CALL16:
5498 case R_MIPS16_GOT16:
b49e97c9
TS
5499 case R_MIPS_CALL16:
5500 case R_MIPS_GOT16:
5501 case R_MIPS_GOT_DISP:
5502 case R_MIPS_GOT_HI16:
5503 case R_MIPS_CALL_HI16:
5504 case R_MIPS_GOT_LO16:
5505 case R_MIPS_CALL_LO16:
df58fc94
RS
5506 case R_MICROMIPS_CALL16:
5507 case R_MICROMIPS_GOT16:
5508 case R_MICROMIPS_GOT_DISP:
5509 case R_MICROMIPS_GOT_HI16:
5510 case R_MICROMIPS_CALL_HI16:
5511 case R_MICROMIPS_GOT_LO16:
5512 case R_MICROMIPS_CALL_LO16:
0f20cc35
DJ
5513 case R_MIPS_TLS_GD:
5514 case R_MIPS_TLS_GOTTPREL:
5515 case R_MIPS_TLS_LDM:
d0f13682
CLT
5516 case R_MIPS16_TLS_GD:
5517 case R_MIPS16_TLS_GOTTPREL:
5518 case R_MIPS16_TLS_LDM:
df58fc94
RS
5519 case R_MICROMIPS_TLS_GD:
5520 case R_MICROMIPS_TLS_GOTTPREL:
5521 case R_MICROMIPS_TLS_LDM:
b49e97c9 5522 /* Find the index into the GOT where this value is located. */
df58fc94 5523 if (tls_ldm_reloc_p (r_type))
0f20cc35 5524 {
0a44bf69 5525 g = mips_elf_local_got_index (abfd, input_bfd, info,
5c18022e 5526 0, 0, NULL, r_type);
0f20cc35
DJ
5527 if (g == MINUS_ONE)
5528 return bfd_reloc_outofrange;
5529 }
5530 else if (!local_p)
b49e97c9 5531 {
0a44bf69
RS
5532 /* On VxWorks, CALL relocations should refer to the .got.plt
5533 entry, which is initialized to point at the PLT stub. */
5534 if (htab->is_vxworks
df58fc94
RS
5535 && (call_hi16_reloc_p (r_type)
5536 || call_lo16_reloc_p (r_type)
738e5348 5537 || call16_reloc_p (r_type)))
0a44bf69
RS
5538 {
5539 BFD_ASSERT (addend == 0);
5540 BFD_ASSERT (h->root.needs_plt);
5541 g = mips_elf_gotplt_index (info, &h->root);
5542 }
5543 else
b49e97c9 5544 {
020d7251 5545 BFD_ASSERT (addend == 0);
13fbec83
RS
5546 g = mips_elf_global_got_index (abfd, info, input_bfd,
5547 &h->root, r_type);
e641e783 5548 if (!TLS_RELOC_P (r_type)
020d7251
RS
5549 && !elf_hash_table (info)->dynamic_sections_created)
5550 /* This is a static link. We must initialize the GOT entry. */
a8028dd0 5551 MIPS_ELF_PUT_WORD (dynobj, symbol, htab->sgot->contents + g);
b49e97c9
TS
5552 }
5553 }
0a44bf69 5554 else if (!htab->is_vxworks
738e5348 5555 && (call16_reloc_p (r_type) || got16_reloc_p (r_type)))
0a44bf69 5556 /* The calculation below does not involve "g". */
b49e97c9
TS
5557 break;
5558 else
5559 {
5c18022e 5560 g = mips_elf_local_got_index (abfd, input_bfd, info,
0a44bf69 5561 symbol + addend, r_symndx, h, r_type);
b49e97c9
TS
5562 if (g == MINUS_ONE)
5563 return bfd_reloc_outofrange;
5564 }
5565
5566 /* Convert GOT indices to actual offsets. */
a8028dd0 5567 g = mips_elf_got_offset_from_index (info, abfd, input_bfd, g);
b49e97c9 5568 break;
b49e97c9
TS
5569 }
5570
0a44bf69
RS
5571 /* Relocations against the VxWorks __GOTT_BASE__ and __GOTT_INDEX__
5572 symbols are resolved by the loader. Add them to .rela.dyn. */
5573 if (h != NULL && is_gott_symbol (info, &h->root))
5574 {
5575 Elf_Internal_Rela outrel;
5576 bfd_byte *loc;
5577 asection *s;
5578
5579 s = mips_elf_rel_dyn_section (info, FALSE);
5580 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
5581
5582 outrel.r_offset = (input_section->output_section->vma
5583 + input_section->output_offset
5584 + relocation->r_offset);
5585 outrel.r_info = ELF32_R_INFO (h->root.dynindx, r_type);
5586 outrel.r_addend = addend;
5587 bfd_elf32_swap_reloca_out (abfd, &outrel, loc);
9e3313ae
RS
5588
5589 /* If we've written this relocation for a readonly section,
5590 we need to set DF_TEXTREL again, so that we do not delete the
5591 DT_TEXTREL tag. */
5592 if (MIPS_ELF_READONLY_SECTION (input_section))
5593 info->flags |= DF_TEXTREL;
5594
0a44bf69
RS
5595 *valuep = 0;
5596 return bfd_reloc_ok;
5597 }
5598
b49e97c9
TS
5599 /* Figure out what kind of relocation is being performed. */
5600 switch (r_type)
5601 {
5602 case R_MIPS_NONE:
5603 return bfd_reloc_continue;
5604
5605 case R_MIPS_16:
a7ebbfdf 5606 value = symbol + _bfd_mips_elf_sign_extend (addend, 16);
b49e97c9
TS
5607 overflowed_p = mips_elf_overflow_p (value, 16);
5608 break;
5609
5610 case R_MIPS_32:
5611 case R_MIPS_REL32:
5612 case R_MIPS_64:
5613 if ((info->shared
861fb55a 5614 || (htab->root.dynamic_sections_created
b49e97c9 5615 && h != NULL
f5385ebf 5616 && h->root.def_dynamic
861fb55a
DJ
5617 && !h->root.def_regular
5618 && !h->has_static_relocs))
cf35638d 5619 && r_symndx != STN_UNDEF
9a59ad6b
DJ
5620 && (h == NULL
5621 || h->root.root.type != bfd_link_hash_undefweak
5622 || ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
b49e97c9
TS
5623 && (input_section->flags & SEC_ALLOC) != 0)
5624 {
861fb55a 5625 /* If we're creating a shared library, then we can't know
b49e97c9
TS
5626 where the symbol will end up. So, we create a relocation
5627 record in the output, and leave the job up to the dynamic
861fb55a
DJ
5628 linker. We must do the same for executable references to
5629 shared library symbols, unless we've decided to use copy
5630 relocs or PLTs instead. */
b49e97c9
TS
5631 value = addend;
5632 if (!mips_elf_create_dynamic_relocation (abfd,
5633 info,
5634 relocation,
5635 h,
5636 sec,
5637 symbol,
5638 &value,
5639 input_section))
5640 return bfd_reloc_undefined;
5641 }
5642 else
5643 {
5644 if (r_type != R_MIPS_REL32)
5645 value = symbol + addend;
5646 else
5647 value = addend;
5648 }
5649 value &= howto->dst_mask;
092dcd75
CD
5650 break;
5651
5652 case R_MIPS_PC32:
5653 value = symbol + addend - p;
5654 value &= howto->dst_mask;
b49e97c9
TS
5655 break;
5656
b49e97c9
TS
5657 case R_MIPS16_26:
5658 /* The calculation for R_MIPS16_26 is just the same as for an
5659 R_MIPS_26. It's only the storage of the relocated field into
5660 the output file that's different. That's handled in
5661 mips_elf_perform_relocation. So, we just fall through to the
5662 R_MIPS_26 case here. */
5663 case R_MIPS_26:
df58fc94
RS
5664 case R_MICROMIPS_26_S1:
5665 {
5666 unsigned int shift;
5667
5668 /* Make sure the target of JALX is word-aligned. Bit 0 must be
5669 the correct ISA mode selector and bit 1 must be 0. */
5670 if (*cross_mode_jump_p && (symbol & 3) != (r_type == R_MIPS_26))
5671 return bfd_reloc_outofrange;
5672
5673 /* Shift is 2, unusually, for microMIPS JALX. */
5674 shift = (!*cross_mode_jump_p && r_type == R_MICROMIPS_26_S1) ? 1 : 2;
5675
5676 if (was_local_p)
5677 value = addend | ((p + 4) & (0xfc000000 << shift));
5678 else
5679 value = _bfd_mips_elf_sign_extend (addend, 26 + shift);
5680 value = (value + symbol) >> shift;
5681 if (!was_local_p && h->root.root.type != bfd_link_hash_undefweak)
5682 overflowed_p = (value >> 26) != ((p + 4) >> (26 + shift));
5683 value &= howto->dst_mask;
5684 }
b49e97c9
TS
5685 break;
5686
0f20cc35 5687 case R_MIPS_TLS_DTPREL_HI16:
d0f13682 5688 case R_MIPS16_TLS_DTPREL_HI16:
df58fc94 5689 case R_MICROMIPS_TLS_DTPREL_HI16:
0f20cc35
DJ
5690 value = (mips_elf_high (addend + symbol - dtprel_base (info))
5691 & howto->dst_mask);
5692 break;
5693
5694 case R_MIPS_TLS_DTPREL_LO16:
741d6ea8
JM
5695 case R_MIPS_TLS_DTPREL32:
5696 case R_MIPS_TLS_DTPREL64:
d0f13682 5697 case R_MIPS16_TLS_DTPREL_LO16:
df58fc94 5698 case R_MICROMIPS_TLS_DTPREL_LO16:
0f20cc35
DJ
5699 value = (symbol + addend - dtprel_base (info)) & howto->dst_mask;
5700 break;
5701
5702 case R_MIPS_TLS_TPREL_HI16:
d0f13682 5703 case R_MIPS16_TLS_TPREL_HI16:
df58fc94 5704 case R_MICROMIPS_TLS_TPREL_HI16:
0f20cc35
DJ
5705 value = (mips_elf_high (addend + symbol - tprel_base (info))
5706 & howto->dst_mask);
5707 break;
5708
5709 case R_MIPS_TLS_TPREL_LO16:
d0f13682
CLT
5710 case R_MIPS_TLS_TPREL32:
5711 case R_MIPS_TLS_TPREL64:
5712 case R_MIPS16_TLS_TPREL_LO16:
df58fc94 5713 case R_MICROMIPS_TLS_TPREL_LO16:
0f20cc35
DJ
5714 value = (symbol + addend - tprel_base (info)) & howto->dst_mask;
5715 break;
5716
b49e97c9 5717 case R_MIPS_HI16:
d6f16593 5718 case R_MIPS16_HI16:
df58fc94 5719 case R_MICROMIPS_HI16:
b49e97c9
TS
5720 if (!gp_disp_p)
5721 {
5722 value = mips_elf_high (addend + symbol);
5723 value &= howto->dst_mask;
5724 }
5725 else
5726 {
d6f16593
MR
5727 /* For MIPS16 ABI code we generate this sequence
5728 0: li $v0,%hi(_gp_disp)
5729 4: addiupc $v1,%lo(_gp_disp)
5730 8: sll $v0,16
5731 12: addu $v0,$v1
5732 14: move $gp,$v0
5733 So the offsets of hi and lo relocs are the same, but the
888b9c01
CLT
5734 base $pc is that used by the ADDIUPC instruction at $t9 + 4.
5735 ADDIUPC clears the low two bits of the instruction address,
5736 so the base is ($t9 + 4) & ~3. */
d6f16593 5737 if (r_type == R_MIPS16_HI16)
888b9c01 5738 value = mips_elf_high (addend + gp - ((p + 4) & ~(bfd_vma) 0x3));
df58fc94
RS
5739 /* The microMIPS .cpload sequence uses the same assembly
5740 instructions as the traditional psABI version, but the
5741 incoming $t9 has the low bit set. */
5742 else if (r_type == R_MICROMIPS_HI16)
5743 value = mips_elf_high (addend + gp - p - 1);
d6f16593
MR
5744 else
5745 value = mips_elf_high (addend + gp - p);
b49e97c9
TS
5746 overflowed_p = mips_elf_overflow_p (value, 16);
5747 }
5748 break;
5749
5750 case R_MIPS_LO16:
d6f16593 5751 case R_MIPS16_LO16:
df58fc94
RS
5752 case R_MICROMIPS_LO16:
5753 case R_MICROMIPS_HI0_LO16:
b49e97c9
TS
5754 if (!gp_disp_p)
5755 value = (symbol + addend) & howto->dst_mask;
5756 else
5757 {
d6f16593
MR
5758 /* See the comment for R_MIPS16_HI16 above for the reason
5759 for this conditional. */
5760 if (r_type == R_MIPS16_LO16)
888b9c01 5761 value = addend + gp - (p & ~(bfd_vma) 0x3);
df58fc94
RS
5762 else if (r_type == R_MICROMIPS_LO16
5763 || r_type == R_MICROMIPS_HI0_LO16)
5764 value = addend + gp - p + 3;
d6f16593
MR
5765 else
5766 value = addend + gp - p + 4;
b49e97c9 5767 /* The MIPS ABI requires checking the R_MIPS_LO16 relocation
8dc1a139 5768 for overflow. But, on, say, IRIX5, relocations against
b49e97c9
TS
5769 _gp_disp are normally generated from the .cpload
5770 pseudo-op. It generates code that normally looks like
5771 this:
5772
5773 lui $gp,%hi(_gp_disp)
5774 addiu $gp,$gp,%lo(_gp_disp)
5775 addu $gp,$gp,$t9
5776
5777 Here $t9 holds the address of the function being called,
5778 as required by the MIPS ELF ABI. The R_MIPS_LO16
5779 relocation can easily overflow in this situation, but the
5780 R_MIPS_HI16 relocation will handle the overflow.
5781 Therefore, we consider this a bug in the MIPS ABI, and do
5782 not check for overflow here. */
5783 }
5784 break;
5785
5786 case R_MIPS_LITERAL:
df58fc94 5787 case R_MICROMIPS_LITERAL:
b49e97c9
TS
5788 /* Because we don't merge literal sections, we can handle this
5789 just like R_MIPS_GPREL16. In the long run, we should merge
5790 shared literals, and then we will need to additional work
5791 here. */
5792
5793 /* Fall through. */
5794
5795 case R_MIPS16_GPREL:
5796 /* The R_MIPS16_GPREL performs the same calculation as
5797 R_MIPS_GPREL16, but stores the relocated bits in a different
5798 order. We don't need to do anything special here; the
5799 differences are handled in mips_elf_perform_relocation. */
5800 case R_MIPS_GPREL16:
df58fc94
RS
5801 case R_MICROMIPS_GPREL7_S2:
5802 case R_MICROMIPS_GPREL16:
bce03d3d
AO
5803 /* Only sign-extend the addend if it was extracted from the
5804 instruction. If the addend was separate, leave it alone,
5805 otherwise we may lose significant bits. */
5806 if (howto->partial_inplace)
a7ebbfdf 5807 addend = _bfd_mips_elf_sign_extend (addend, 16);
bce03d3d
AO
5808 value = symbol + addend - gp;
5809 /* If the symbol was local, any earlier relocatable links will
5810 have adjusted its addend with the gp offset, so compensate
5811 for that now. Don't do it for symbols forced local in this
5812 link, though, since they won't have had the gp offset applied
5813 to them before. */
5814 if (was_local_p)
5815 value += gp0;
b49e97c9
TS
5816 overflowed_p = mips_elf_overflow_p (value, 16);
5817 break;
5818
738e5348
RS
5819 case R_MIPS16_GOT16:
5820 case R_MIPS16_CALL16:
b49e97c9
TS
5821 case R_MIPS_GOT16:
5822 case R_MIPS_CALL16:
df58fc94
RS
5823 case R_MICROMIPS_GOT16:
5824 case R_MICROMIPS_CALL16:
0a44bf69 5825 /* VxWorks does not have separate local and global semantics for
738e5348 5826 R_MIPS*_GOT16; every relocation evaluates to "G". */
0a44bf69 5827 if (!htab->is_vxworks && local_p)
b49e97c9 5828 {
5c18022e 5829 value = mips_elf_got16_entry (abfd, input_bfd, info,
020d7251 5830 symbol + addend, !was_local_p);
b49e97c9
TS
5831 if (value == MINUS_ONE)
5832 return bfd_reloc_outofrange;
5833 value
a8028dd0 5834 = mips_elf_got_offset_from_index (info, abfd, input_bfd, value);
b49e97c9
TS
5835 overflowed_p = mips_elf_overflow_p (value, 16);
5836 break;
5837 }
5838
5839 /* Fall through. */
5840
0f20cc35
DJ
5841 case R_MIPS_TLS_GD:
5842 case R_MIPS_TLS_GOTTPREL:
5843 case R_MIPS_TLS_LDM:
b49e97c9 5844 case R_MIPS_GOT_DISP:
d0f13682
CLT
5845 case R_MIPS16_TLS_GD:
5846 case R_MIPS16_TLS_GOTTPREL:
5847 case R_MIPS16_TLS_LDM:
df58fc94
RS
5848 case R_MICROMIPS_TLS_GD:
5849 case R_MICROMIPS_TLS_GOTTPREL:
5850 case R_MICROMIPS_TLS_LDM:
5851 case R_MICROMIPS_GOT_DISP:
b49e97c9
TS
5852 value = g;
5853 overflowed_p = mips_elf_overflow_p (value, 16);
5854 break;
5855
5856 case R_MIPS_GPREL32:
bce03d3d
AO
5857 value = (addend + symbol + gp0 - gp);
5858 if (!save_addend)
5859 value &= howto->dst_mask;
b49e97c9
TS
5860 break;
5861
5862 case R_MIPS_PC16:
bad36eac
DJ
5863 case R_MIPS_GNU_REL16_S2:
5864 value = symbol + _bfd_mips_elf_sign_extend (addend, 18) - p;
5865 overflowed_p = mips_elf_overflow_p (value, 18);
37caec6b
TS
5866 value >>= howto->rightshift;
5867 value &= howto->dst_mask;
b49e97c9
TS
5868 break;
5869
df58fc94
RS
5870 case R_MICROMIPS_PC7_S1:
5871 value = symbol + _bfd_mips_elf_sign_extend (addend, 8) - p;
5872 overflowed_p = mips_elf_overflow_p (value, 8);
5873 value >>= howto->rightshift;
5874 value &= howto->dst_mask;
5875 break;
5876
5877 case R_MICROMIPS_PC10_S1:
5878 value = symbol + _bfd_mips_elf_sign_extend (addend, 11) - p;
5879 overflowed_p = mips_elf_overflow_p (value, 11);
5880 value >>= howto->rightshift;
5881 value &= howto->dst_mask;
5882 break;
5883
5884 case R_MICROMIPS_PC16_S1:
5885 value = symbol + _bfd_mips_elf_sign_extend (addend, 17) - p;
5886 overflowed_p = mips_elf_overflow_p (value, 17);
5887 value >>= howto->rightshift;
5888 value &= howto->dst_mask;
5889 break;
5890
5891 case R_MICROMIPS_PC23_S2:
5892 value = symbol + _bfd_mips_elf_sign_extend (addend, 25) - ((p | 3) ^ 3);
5893 overflowed_p = mips_elf_overflow_p (value, 25);
5894 value >>= howto->rightshift;
5895 value &= howto->dst_mask;
5896 break;
5897
b49e97c9
TS
5898 case R_MIPS_GOT_HI16:
5899 case R_MIPS_CALL_HI16:
df58fc94
RS
5900 case R_MICROMIPS_GOT_HI16:
5901 case R_MICROMIPS_CALL_HI16:
b49e97c9
TS
5902 /* We're allowed to handle these two relocations identically.
5903 The dynamic linker is allowed to handle the CALL relocations
5904 differently by creating a lazy evaluation stub. */
5905 value = g;
5906 value = mips_elf_high (value);
5907 value &= howto->dst_mask;
5908 break;
5909
5910 case R_MIPS_GOT_LO16:
5911 case R_MIPS_CALL_LO16:
df58fc94
RS
5912 case R_MICROMIPS_GOT_LO16:
5913 case R_MICROMIPS_CALL_LO16:
b49e97c9
TS
5914 value = g & howto->dst_mask;
5915 break;
5916
5917 case R_MIPS_GOT_PAGE:
df58fc94 5918 case R_MICROMIPS_GOT_PAGE:
5c18022e 5919 value = mips_elf_got_page (abfd, input_bfd, info, symbol + addend, NULL);
b49e97c9
TS
5920 if (value == MINUS_ONE)
5921 return bfd_reloc_outofrange;
a8028dd0 5922 value = mips_elf_got_offset_from_index (info, abfd, input_bfd, value);
b49e97c9
TS
5923 overflowed_p = mips_elf_overflow_p (value, 16);
5924 break;
5925
5926 case R_MIPS_GOT_OFST:
df58fc94 5927 case R_MICROMIPS_GOT_OFST:
93a2b7ae 5928 if (local_p)
5c18022e 5929 mips_elf_got_page (abfd, input_bfd, info, symbol + addend, &value);
0fdc1bf1
AO
5930 else
5931 value = addend;
b49e97c9
TS
5932 overflowed_p = mips_elf_overflow_p (value, 16);
5933 break;
5934
5935 case R_MIPS_SUB:
df58fc94 5936 case R_MICROMIPS_SUB:
b49e97c9
TS
5937 value = symbol - addend;
5938 value &= howto->dst_mask;
5939 break;
5940
5941 case R_MIPS_HIGHER:
df58fc94 5942 case R_MICROMIPS_HIGHER:
b49e97c9
TS
5943 value = mips_elf_higher (addend + symbol);
5944 value &= howto->dst_mask;
5945 break;
5946
5947 case R_MIPS_HIGHEST:
df58fc94 5948 case R_MICROMIPS_HIGHEST:
b49e97c9
TS
5949 value = mips_elf_highest (addend + symbol);
5950 value &= howto->dst_mask;
5951 break;
5952
5953 case R_MIPS_SCN_DISP:
df58fc94 5954 case R_MICROMIPS_SCN_DISP:
b49e97c9
TS
5955 value = symbol + addend - sec->output_offset;
5956 value &= howto->dst_mask;
5957 break;
5958
b49e97c9 5959 case R_MIPS_JALR:
df58fc94 5960 case R_MICROMIPS_JALR:
1367d393
ILT
5961 /* This relocation is only a hint. In some cases, we optimize
5962 it into a bal instruction. But we don't try to optimize
5bbc5ae7
AN
5963 when the symbol does not resolve locally. */
5964 if (h != NULL && !SYMBOL_CALLS_LOCAL (info, &h->root))
1367d393
ILT
5965 return bfd_reloc_continue;
5966 value = symbol + addend;
5967 break;
b49e97c9 5968
1367d393 5969 case R_MIPS_PJUMP:
b49e97c9
TS
5970 case R_MIPS_GNU_VTINHERIT:
5971 case R_MIPS_GNU_VTENTRY:
5972 /* We don't do anything with these at present. */
5973 return bfd_reloc_continue;
5974
5975 default:
5976 /* An unrecognized relocation type. */
5977 return bfd_reloc_notsupported;
5978 }
5979
5980 /* Store the VALUE for our caller. */
5981 *valuep = value;
5982 return overflowed_p ? bfd_reloc_overflow : bfd_reloc_ok;
5983}
5984
5985/* Obtain the field relocated by RELOCATION. */
5986
5987static bfd_vma
9719ad41
RS
5988mips_elf_obtain_contents (reloc_howto_type *howto,
5989 const Elf_Internal_Rela *relocation,
5990 bfd *input_bfd, bfd_byte *contents)
b49e97c9
TS
5991{
5992 bfd_vma x;
5993 bfd_byte *location = contents + relocation->r_offset;
5994
5995 /* Obtain the bytes. */
5996 x = bfd_get ((8 * bfd_get_reloc_size (howto)), input_bfd, location);
5997
b49e97c9
TS
5998 return x;
5999}
6000
6001/* It has been determined that the result of the RELOCATION is the
6002 VALUE. Use HOWTO to place VALUE into the output file at the
6003 appropriate position. The SECTION is the section to which the
68ffbac6 6004 relocation applies.
38a7df63 6005 CROSS_MODE_JUMP_P is true if the relocation field
df58fc94 6006 is a MIPS16 or microMIPS jump to standard MIPS code, or vice versa.
b49e97c9 6007
b34976b6 6008 Returns FALSE if anything goes wrong. */
b49e97c9 6009
b34976b6 6010static bfd_boolean
9719ad41
RS
6011mips_elf_perform_relocation (struct bfd_link_info *info,
6012 reloc_howto_type *howto,
6013 const Elf_Internal_Rela *relocation,
6014 bfd_vma value, bfd *input_bfd,
6015 asection *input_section, bfd_byte *contents,
38a7df63 6016 bfd_boolean cross_mode_jump_p)
b49e97c9
TS
6017{
6018 bfd_vma x;
6019 bfd_byte *location;
6020 int r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
6021
6022 /* Figure out where the relocation is occurring. */
6023 location = contents + relocation->r_offset;
6024
df58fc94 6025 _bfd_mips_elf_reloc_unshuffle (input_bfd, r_type, FALSE, location);
d6f16593 6026
b49e97c9
TS
6027 /* Obtain the current value. */
6028 x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
6029
6030 /* Clear the field we are setting. */
6031 x &= ~howto->dst_mask;
6032
b49e97c9
TS
6033 /* Set the field. */
6034 x |= (value & howto->dst_mask);
6035
6036 /* If required, turn JAL into JALX. */
38a7df63 6037 if (cross_mode_jump_p && jal_reloc_p (r_type))
b49e97c9 6038 {
b34976b6 6039 bfd_boolean ok;
b49e97c9
TS
6040 bfd_vma opcode = x >> 26;
6041 bfd_vma jalx_opcode;
6042
6043 /* Check to see if the opcode is already JAL or JALX. */
6044 if (r_type == R_MIPS16_26)
6045 {
6046 ok = ((opcode == 0x6) || (opcode == 0x7));
6047 jalx_opcode = 0x7;
6048 }
df58fc94
RS
6049 else if (r_type == R_MICROMIPS_26_S1)
6050 {
6051 ok = ((opcode == 0x3d) || (opcode == 0x3c));
6052 jalx_opcode = 0x3c;
6053 }
b49e97c9
TS
6054 else
6055 {
6056 ok = ((opcode == 0x3) || (opcode == 0x1d));
6057 jalx_opcode = 0x1d;
6058 }
6059
3bdf9505
MR
6060 /* If the opcode is not JAL or JALX, there's a problem. We cannot
6061 convert J or JALS to JALX. */
b49e97c9
TS
6062 if (!ok)
6063 {
6064 (*_bfd_error_handler)
3bdf9505 6065 (_("%B: %A+0x%lx: Unsupported jump between ISA modes; consider recompiling with interlinking enabled."),
d003868e
AM
6066 input_bfd,
6067 input_section,
b49e97c9
TS
6068 (unsigned long) relocation->r_offset);
6069 bfd_set_error (bfd_error_bad_value);
b34976b6 6070 return FALSE;
b49e97c9
TS
6071 }
6072
6073 /* Make this the JALX opcode. */
6074 x = (x & ~(0x3f << 26)) | (jalx_opcode << 26);
6075 }
6076
38a7df63
CF
6077 /* Try converting JAL to BAL and J(AL)R to B(AL), if the target is in
6078 range. */
cd8d5a82 6079 if (!info->relocatable
38a7df63 6080 && !cross_mode_jump_p
cd8d5a82
CF
6081 && ((JAL_TO_BAL_P (input_bfd)
6082 && r_type == R_MIPS_26
6083 && (x >> 26) == 0x3) /* jal addr */
6084 || (JALR_TO_BAL_P (input_bfd)
6085 && r_type == R_MIPS_JALR
38a7df63
CF
6086 && x == 0x0320f809) /* jalr t9 */
6087 || (JR_TO_B_P (input_bfd)
6088 && r_type == R_MIPS_JALR
6089 && x == 0x03200008))) /* jr t9 */
1367d393
ILT
6090 {
6091 bfd_vma addr;
6092 bfd_vma dest;
6093 bfd_signed_vma off;
6094
6095 addr = (input_section->output_section->vma
6096 + input_section->output_offset
6097 + relocation->r_offset
6098 + 4);
6099 if (r_type == R_MIPS_26)
6100 dest = (value << 2) | ((addr >> 28) << 28);
6101 else
6102 dest = value;
6103 off = dest - addr;
6104 if (off <= 0x1ffff && off >= -0x20000)
38a7df63
CF
6105 {
6106 if (x == 0x03200008) /* jr t9 */
6107 x = 0x10000000 | (((bfd_vma) off >> 2) & 0xffff); /* b addr */
6108 else
6109 x = 0x04110000 | (((bfd_vma) off >> 2) & 0xffff); /* bal addr */
6110 }
1367d393
ILT
6111 }
6112
b49e97c9
TS
6113 /* Put the value into the output. */
6114 bfd_put (8 * bfd_get_reloc_size (howto), input_bfd, x, location);
d6f16593 6115
df58fc94
RS
6116 _bfd_mips_elf_reloc_shuffle (input_bfd, r_type, !info->relocatable,
6117 location);
d6f16593 6118
b34976b6 6119 return TRUE;
b49e97c9 6120}
b49e97c9 6121\f
b49e97c9
TS
6122/* Create a rel.dyn relocation for the dynamic linker to resolve. REL
6123 is the original relocation, which is now being transformed into a
6124 dynamic relocation. The ADDENDP is adjusted if necessary; the
6125 caller should store the result in place of the original addend. */
6126
b34976b6 6127static bfd_boolean
9719ad41
RS
6128mips_elf_create_dynamic_relocation (bfd *output_bfd,
6129 struct bfd_link_info *info,
6130 const Elf_Internal_Rela *rel,
6131 struct mips_elf_link_hash_entry *h,
6132 asection *sec, bfd_vma symbol,
6133 bfd_vma *addendp, asection *input_section)
b49e97c9 6134{
947216bf 6135 Elf_Internal_Rela outrel[3];
b49e97c9
TS
6136 asection *sreloc;
6137 bfd *dynobj;
6138 int r_type;
5d41f0b6
RS
6139 long indx;
6140 bfd_boolean defined_p;
0a44bf69 6141 struct mips_elf_link_hash_table *htab;
b49e97c9 6142
0a44bf69 6143 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
6144 BFD_ASSERT (htab != NULL);
6145
b49e97c9
TS
6146 r_type = ELF_R_TYPE (output_bfd, rel->r_info);
6147 dynobj = elf_hash_table (info)->dynobj;
0a44bf69 6148 sreloc = mips_elf_rel_dyn_section (info, FALSE);
b49e97c9
TS
6149 BFD_ASSERT (sreloc != NULL);
6150 BFD_ASSERT (sreloc->contents != NULL);
6151 BFD_ASSERT (sreloc->reloc_count * MIPS_ELF_REL_SIZE (output_bfd)
eea6121a 6152 < sreloc->size);
b49e97c9 6153
b49e97c9
TS
6154 outrel[0].r_offset =
6155 _bfd_elf_section_offset (output_bfd, info, input_section, rel[0].r_offset);
9ddf8309
TS
6156 if (ABI_64_P (output_bfd))
6157 {
6158 outrel[1].r_offset =
6159 _bfd_elf_section_offset (output_bfd, info, input_section, rel[1].r_offset);
6160 outrel[2].r_offset =
6161 _bfd_elf_section_offset (output_bfd, info, input_section, rel[2].r_offset);
6162 }
b49e97c9 6163
c5ae1840 6164 if (outrel[0].r_offset == MINUS_ONE)
0d591ff7 6165 /* The relocation field has been deleted. */
5d41f0b6
RS
6166 return TRUE;
6167
6168 if (outrel[0].r_offset == MINUS_TWO)
0d591ff7
RS
6169 {
6170 /* The relocation field has been converted into a relative value of
6171 some sort. Functions like _bfd_elf_write_section_eh_frame expect
6172 the field to be fully relocated, so add in the symbol's value. */
0d591ff7 6173 *addendp += symbol;
5d41f0b6 6174 return TRUE;
0d591ff7 6175 }
b49e97c9 6176
5d41f0b6
RS
6177 /* We must now calculate the dynamic symbol table index to use
6178 in the relocation. */
d4a77f3f 6179 if (h != NULL && ! SYMBOL_REFERENCES_LOCAL (info, &h->root))
5d41f0b6 6180 {
020d7251 6181 BFD_ASSERT (htab->is_vxworks || h->global_got_area != GGA_NONE);
5d41f0b6
RS
6182 indx = h->root.dynindx;
6183 if (SGI_COMPAT (output_bfd))
6184 defined_p = h->root.def_regular;
6185 else
6186 /* ??? glibc's ld.so just adds the final GOT entry to the
6187 relocation field. It therefore treats relocs against
6188 defined symbols in the same way as relocs against
6189 undefined symbols. */
6190 defined_p = FALSE;
6191 }
b49e97c9
TS
6192 else
6193 {
5d41f0b6
RS
6194 if (sec != NULL && bfd_is_abs_section (sec))
6195 indx = 0;
6196 else if (sec == NULL || sec->owner == NULL)
fdd07405 6197 {
5d41f0b6
RS
6198 bfd_set_error (bfd_error_bad_value);
6199 return FALSE;
b49e97c9
TS
6200 }
6201 else
6202 {
5d41f0b6 6203 indx = elf_section_data (sec->output_section)->dynindx;
74541ad4
AM
6204 if (indx == 0)
6205 {
6206 asection *osec = htab->root.text_index_section;
6207 indx = elf_section_data (osec)->dynindx;
6208 }
5d41f0b6
RS
6209 if (indx == 0)
6210 abort ();
b49e97c9
TS
6211 }
6212
5d41f0b6
RS
6213 /* Instead of generating a relocation using the section
6214 symbol, we may as well make it a fully relative
6215 relocation. We want to avoid generating relocations to
6216 local symbols because we used to generate them
6217 incorrectly, without adding the original symbol value,
6218 which is mandated by the ABI for section symbols. In
6219 order to give dynamic loaders and applications time to
6220 phase out the incorrect use, we refrain from emitting
6221 section-relative relocations. It's not like they're
6222 useful, after all. This should be a bit more efficient
6223 as well. */
6224 /* ??? Although this behavior is compatible with glibc's ld.so,
6225 the ABI says that relocations against STN_UNDEF should have
6226 a symbol value of 0. Irix rld honors this, so relocations
6227 against STN_UNDEF have no effect. */
6228 if (!SGI_COMPAT (output_bfd))
6229 indx = 0;
6230 defined_p = TRUE;
b49e97c9
TS
6231 }
6232
5d41f0b6
RS
6233 /* If the relocation was previously an absolute relocation and
6234 this symbol will not be referred to by the relocation, we must
6235 adjust it by the value we give it in the dynamic symbol table.
6236 Otherwise leave the job up to the dynamic linker. */
6237 if (defined_p && r_type != R_MIPS_REL32)
6238 *addendp += symbol;
6239
0a44bf69
RS
6240 if (htab->is_vxworks)
6241 /* VxWorks uses non-relative relocations for this. */
6242 outrel[0].r_info = ELF32_R_INFO (indx, R_MIPS_32);
6243 else
6244 /* The relocation is always an REL32 relocation because we don't
6245 know where the shared library will wind up at load-time. */
6246 outrel[0].r_info = ELF_R_INFO (output_bfd, (unsigned long) indx,
6247 R_MIPS_REL32);
6248
5d41f0b6
RS
6249 /* For strict adherence to the ABI specification, we should
6250 generate a R_MIPS_64 relocation record by itself before the
6251 _REL32/_64 record as well, such that the addend is read in as
6252 a 64-bit value (REL32 is a 32-bit relocation, after all).
6253 However, since none of the existing ELF64 MIPS dynamic
6254 loaders seems to care, we don't waste space with these
6255 artificial relocations. If this turns out to not be true,
6256 mips_elf_allocate_dynamic_relocation() should be tweaked so
6257 as to make room for a pair of dynamic relocations per
6258 invocation if ABI_64_P, and here we should generate an
6259 additional relocation record with R_MIPS_64 by itself for a
6260 NULL symbol before this relocation record. */
6261 outrel[1].r_info = ELF_R_INFO (output_bfd, 0,
6262 ABI_64_P (output_bfd)
6263 ? R_MIPS_64
6264 : R_MIPS_NONE);
6265 outrel[2].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_NONE);
6266
6267 /* Adjust the output offset of the relocation to reference the
6268 correct location in the output file. */
6269 outrel[0].r_offset += (input_section->output_section->vma
6270 + input_section->output_offset);
6271 outrel[1].r_offset += (input_section->output_section->vma
6272 + input_section->output_offset);
6273 outrel[2].r_offset += (input_section->output_section->vma
6274 + input_section->output_offset);
6275
b49e97c9
TS
6276 /* Put the relocation back out. We have to use the special
6277 relocation outputter in the 64-bit case since the 64-bit
6278 relocation format is non-standard. */
6279 if (ABI_64_P (output_bfd))
6280 {
6281 (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
6282 (output_bfd, &outrel[0],
6283 (sreloc->contents
6284 + sreloc->reloc_count * sizeof (Elf64_Mips_External_Rel)));
6285 }
0a44bf69
RS
6286 else if (htab->is_vxworks)
6287 {
6288 /* VxWorks uses RELA rather than REL dynamic relocations. */
6289 outrel[0].r_addend = *addendp;
6290 bfd_elf32_swap_reloca_out
6291 (output_bfd, &outrel[0],
6292 (sreloc->contents
6293 + sreloc->reloc_count * sizeof (Elf32_External_Rela)));
6294 }
b49e97c9 6295 else
947216bf
AM
6296 bfd_elf32_swap_reloc_out
6297 (output_bfd, &outrel[0],
6298 (sreloc->contents + sreloc->reloc_count * sizeof (Elf32_External_Rel)));
b49e97c9 6299
b49e97c9
TS
6300 /* We've now added another relocation. */
6301 ++sreloc->reloc_count;
6302
6303 /* Make sure the output section is writable. The dynamic linker
6304 will be writing to it. */
6305 elf_section_data (input_section->output_section)->this_hdr.sh_flags
6306 |= SHF_WRITE;
6307
6308 /* On IRIX5, make an entry of compact relocation info. */
5d41f0b6 6309 if (IRIX_COMPAT (output_bfd) == ict_irix5)
b49e97c9 6310 {
3d4d4302 6311 asection *scpt = bfd_get_linker_section (dynobj, ".compact_rel");
b49e97c9
TS
6312 bfd_byte *cr;
6313
6314 if (scpt)
6315 {
6316 Elf32_crinfo cptrel;
6317
6318 mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG);
6319 cptrel.vaddr = (rel->r_offset
6320 + input_section->output_section->vma
6321 + input_section->output_offset);
6322 if (r_type == R_MIPS_REL32)
6323 mips_elf_set_cr_type (cptrel, CRT_MIPS_REL32);
6324 else
6325 mips_elf_set_cr_type (cptrel, CRT_MIPS_WORD);
6326 mips_elf_set_cr_dist2to (cptrel, 0);
6327 cptrel.konst = *addendp;
6328
6329 cr = (scpt->contents
6330 + sizeof (Elf32_External_compact_rel));
abc0f8d0 6331 mips_elf_set_cr_relvaddr (cptrel, 0);
b49e97c9
TS
6332 bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
6333 ((Elf32_External_crinfo *) cr
6334 + scpt->reloc_count));
6335 ++scpt->reloc_count;
6336 }
6337 }
6338
943284cc
DJ
6339 /* If we've written this relocation for a readonly section,
6340 we need to set DF_TEXTREL again, so that we do not delete the
6341 DT_TEXTREL tag. */
6342 if (MIPS_ELF_READONLY_SECTION (input_section))
6343 info->flags |= DF_TEXTREL;
6344
b34976b6 6345 return TRUE;
b49e97c9
TS
6346}
6347\f
b49e97c9
TS
6348/* Return the MACH for a MIPS e_flags value. */
6349
6350unsigned long
9719ad41 6351_bfd_elf_mips_mach (flagword flags)
b49e97c9
TS
6352{
6353 switch (flags & EF_MIPS_MACH)
6354 {
6355 case E_MIPS_MACH_3900:
6356 return bfd_mach_mips3900;
6357
6358 case E_MIPS_MACH_4010:
6359 return bfd_mach_mips4010;
6360
6361 case E_MIPS_MACH_4100:
6362 return bfd_mach_mips4100;
6363
6364 case E_MIPS_MACH_4111:
6365 return bfd_mach_mips4111;
6366
00707a0e
RS
6367 case E_MIPS_MACH_4120:
6368 return bfd_mach_mips4120;
6369
b49e97c9
TS
6370 case E_MIPS_MACH_4650:
6371 return bfd_mach_mips4650;
6372
00707a0e
RS
6373 case E_MIPS_MACH_5400:
6374 return bfd_mach_mips5400;
6375
6376 case E_MIPS_MACH_5500:
6377 return bfd_mach_mips5500;
6378
e407c74b
NC
6379 case E_MIPS_MACH_5900:
6380 return bfd_mach_mips5900;
6381
0d2e43ed
ILT
6382 case E_MIPS_MACH_9000:
6383 return bfd_mach_mips9000;
6384
b49e97c9
TS
6385 case E_MIPS_MACH_SB1:
6386 return bfd_mach_mips_sb1;
6387
350cc38d
MS
6388 case E_MIPS_MACH_LS2E:
6389 return bfd_mach_mips_loongson_2e;
6390
6391 case E_MIPS_MACH_LS2F:
6392 return bfd_mach_mips_loongson_2f;
6393
fd503541
NC
6394 case E_MIPS_MACH_LS3A:
6395 return bfd_mach_mips_loongson_3a;
6396
432233b3
AP
6397 case E_MIPS_MACH_OCTEON2:
6398 return bfd_mach_mips_octeon2;
6399
6f179bd0
AN
6400 case E_MIPS_MACH_OCTEON:
6401 return bfd_mach_mips_octeon;
6402
52b6b6b9
JM
6403 case E_MIPS_MACH_XLR:
6404 return bfd_mach_mips_xlr;
6405
b49e97c9
TS
6406 default:
6407 switch (flags & EF_MIPS_ARCH)
6408 {
6409 default:
6410 case E_MIPS_ARCH_1:
6411 return bfd_mach_mips3000;
b49e97c9
TS
6412
6413 case E_MIPS_ARCH_2:
6414 return bfd_mach_mips6000;
b49e97c9
TS
6415
6416 case E_MIPS_ARCH_3:
6417 return bfd_mach_mips4000;
b49e97c9
TS
6418
6419 case E_MIPS_ARCH_4:
6420 return bfd_mach_mips8000;
b49e97c9
TS
6421
6422 case E_MIPS_ARCH_5:
6423 return bfd_mach_mips5;
b49e97c9
TS
6424
6425 case E_MIPS_ARCH_32:
6426 return bfd_mach_mipsisa32;
b49e97c9
TS
6427
6428 case E_MIPS_ARCH_64:
6429 return bfd_mach_mipsisa64;
af7ee8bf
CD
6430
6431 case E_MIPS_ARCH_32R2:
6432 return bfd_mach_mipsisa32r2;
5f74bc13
CD
6433
6434 case E_MIPS_ARCH_64R2:
6435 return bfd_mach_mipsisa64r2;
b49e97c9
TS
6436 }
6437 }
6438
6439 return 0;
6440}
6441
6442/* Return printable name for ABI. */
6443
6444static INLINE char *
9719ad41 6445elf_mips_abi_name (bfd *abfd)
b49e97c9
TS
6446{
6447 flagword flags;
6448
6449 flags = elf_elfheader (abfd)->e_flags;
6450 switch (flags & EF_MIPS_ABI)
6451 {
6452 case 0:
6453 if (ABI_N32_P (abfd))
6454 return "N32";
6455 else if (ABI_64_P (abfd))
6456 return "64";
6457 else
6458 return "none";
6459 case E_MIPS_ABI_O32:
6460 return "O32";
6461 case E_MIPS_ABI_O64:
6462 return "O64";
6463 case E_MIPS_ABI_EABI32:
6464 return "EABI32";
6465 case E_MIPS_ABI_EABI64:
6466 return "EABI64";
6467 default:
6468 return "unknown abi";
6469 }
6470}
6471\f
6472/* MIPS ELF uses two common sections. One is the usual one, and the
6473 other is for small objects. All the small objects are kept
6474 together, and then referenced via the gp pointer, which yields
6475 faster assembler code. This is what we use for the small common
6476 section. This approach is copied from ecoff.c. */
6477static asection mips_elf_scom_section;
6478static asymbol mips_elf_scom_symbol;
6479static asymbol *mips_elf_scom_symbol_ptr;
6480
6481/* MIPS ELF also uses an acommon section, which represents an
6482 allocated common symbol which may be overridden by a
6483 definition in a shared library. */
6484static asection mips_elf_acom_section;
6485static asymbol mips_elf_acom_symbol;
6486static asymbol *mips_elf_acom_symbol_ptr;
6487
738e5348 6488/* This is used for both the 32-bit and the 64-bit ABI. */
b49e97c9
TS
6489
6490void
9719ad41 6491_bfd_mips_elf_symbol_processing (bfd *abfd, asymbol *asym)
b49e97c9
TS
6492{
6493 elf_symbol_type *elfsym;
6494
738e5348 6495 /* Handle the special MIPS section numbers that a symbol may use. */
b49e97c9
TS
6496 elfsym = (elf_symbol_type *) asym;
6497 switch (elfsym->internal_elf_sym.st_shndx)
6498 {
6499 case SHN_MIPS_ACOMMON:
6500 /* This section is used in a dynamically linked executable file.
6501 It is an allocated common section. The dynamic linker can
6502 either resolve these symbols to something in a shared
6503 library, or it can just leave them here. For our purposes,
6504 we can consider these symbols to be in a new section. */
6505 if (mips_elf_acom_section.name == NULL)
6506 {
6507 /* Initialize the acommon section. */
6508 mips_elf_acom_section.name = ".acommon";
6509 mips_elf_acom_section.flags = SEC_ALLOC;
6510 mips_elf_acom_section.output_section = &mips_elf_acom_section;
6511 mips_elf_acom_section.symbol = &mips_elf_acom_symbol;
6512 mips_elf_acom_section.symbol_ptr_ptr = &mips_elf_acom_symbol_ptr;
6513 mips_elf_acom_symbol.name = ".acommon";
6514 mips_elf_acom_symbol.flags = BSF_SECTION_SYM;
6515 mips_elf_acom_symbol.section = &mips_elf_acom_section;
6516 mips_elf_acom_symbol_ptr = &mips_elf_acom_symbol;
6517 }
6518 asym->section = &mips_elf_acom_section;
6519 break;
6520
6521 case SHN_COMMON:
6522 /* Common symbols less than the GP size are automatically
6523 treated as SHN_MIPS_SCOMMON symbols on IRIX5. */
6524 if (asym->value > elf_gp_size (abfd)
b59eed79 6525 || ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_TLS
b49e97c9
TS
6526 || IRIX_COMPAT (abfd) == ict_irix6)
6527 break;
6528 /* Fall through. */
6529 case SHN_MIPS_SCOMMON:
6530 if (mips_elf_scom_section.name == NULL)
6531 {
6532 /* Initialize the small common section. */
6533 mips_elf_scom_section.name = ".scommon";
6534 mips_elf_scom_section.flags = SEC_IS_COMMON;
6535 mips_elf_scom_section.output_section = &mips_elf_scom_section;
6536 mips_elf_scom_section.symbol = &mips_elf_scom_symbol;
6537 mips_elf_scom_section.symbol_ptr_ptr = &mips_elf_scom_symbol_ptr;
6538 mips_elf_scom_symbol.name = ".scommon";
6539 mips_elf_scom_symbol.flags = BSF_SECTION_SYM;
6540 mips_elf_scom_symbol.section = &mips_elf_scom_section;
6541 mips_elf_scom_symbol_ptr = &mips_elf_scom_symbol;
6542 }
6543 asym->section = &mips_elf_scom_section;
6544 asym->value = elfsym->internal_elf_sym.st_size;
6545 break;
6546
6547 case SHN_MIPS_SUNDEFINED:
6548 asym->section = bfd_und_section_ptr;
6549 break;
6550
b49e97c9 6551 case SHN_MIPS_TEXT:
00b4930b
TS
6552 {
6553 asection *section = bfd_get_section_by_name (abfd, ".text");
6554
00b4930b
TS
6555 if (section != NULL)
6556 {
6557 asym->section = section;
6558 /* MIPS_TEXT is a bit special, the address is not an offset
6559 to the base of the .text section. So substract the section
6560 base address to make it an offset. */
6561 asym->value -= section->vma;
6562 }
6563 }
b49e97c9
TS
6564 break;
6565
6566 case SHN_MIPS_DATA:
00b4930b
TS
6567 {
6568 asection *section = bfd_get_section_by_name (abfd, ".data");
6569
00b4930b
TS
6570 if (section != NULL)
6571 {
6572 asym->section = section;
6573 /* MIPS_DATA is a bit special, the address is not an offset
6574 to the base of the .data section. So substract the section
6575 base address to make it an offset. */
6576 asym->value -= section->vma;
6577 }
6578 }
b49e97c9 6579 break;
b49e97c9 6580 }
738e5348 6581
df58fc94
RS
6582 /* If this is an odd-valued function symbol, assume it's a MIPS16
6583 or microMIPS one. */
738e5348
RS
6584 if (ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_FUNC
6585 && (asym->value & 1) != 0)
6586 {
6587 asym->value--;
e8faf7d1 6588 if (MICROMIPS_P (abfd))
df58fc94
RS
6589 elfsym->internal_elf_sym.st_other
6590 = ELF_ST_SET_MICROMIPS (elfsym->internal_elf_sym.st_other);
6591 else
6592 elfsym->internal_elf_sym.st_other
6593 = ELF_ST_SET_MIPS16 (elfsym->internal_elf_sym.st_other);
738e5348 6594 }
b49e97c9
TS
6595}
6596\f
8c946ed5
RS
6597/* Implement elf_backend_eh_frame_address_size. This differs from
6598 the default in the way it handles EABI64.
6599
6600 EABI64 was originally specified as an LP64 ABI, and that is what
6601 -mabi=eabi normally gives on a 64-bit target. However, gcc has
6602 historically accepted the combination of -mabi=eabi and -mlong32,
6603 and this ILP32 variation has become semi-official over time.
6604 Both forms use elf32 and have pointer-sized FDE addresses.
6605
6606 If an EABI object was generated by GCC 4.0 or above, it will have
6607 an empty .gcc_compiled_longXX section, where XX is the size of longs
6608 in bits. Unfortunately, ILP32 objects generated by earlier compilers
6609 have no special marking to distinguish them from LP64 objects.
6610
6611 We don't want users of the official LP64 ABI to be punished for the
6612 existence of the ILP32 variant, but at the same time, we don't want
6613 to mistakenly interpret pre-4.0 ILP32 objects as being LP64 objects.
6614 We therefore take the following approach:
6615
6616 - If ABFD contains a .gcc_compiled_longXX section, use it to
6617 determine the pointer size.
6618
6619 - Otherwise check the type of the first relocation. Assume that
6620 the LP64 ABI is being used if the relocation is of type R_MIPS_64.
6621
6622 - Otherwise punt.
6623
6624 The second check is enough to detect LP64 objects generated by pre-4.0
6625 compilers because, in the kind of output generated by those compilers,
6626 the first relocation will be associated with either a CIE personality
6627 routine or an FDE start address. Furthermore, the compilers never
6628 used a special (non-pointer) encoding for this ABI.
6629
6630 Checking the relocation type should also be safe because there is no
6631 reason to use R_MIPS_64 in an ILP32 object. Pre-4.0 compilers never
6632 did so. */
6633
6634unsigned int
6635_bfd_mips_elf_eh_frame_address_size (bfd *abfd, asection *sec)
6636{
6637 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
6638 return 8;
6639 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64)
6640 {
6641 bfd_boolean long32_p, long64_p;
6642
6643 long32_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long32") != 0;
6644 long64_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long64") != 0;
6645 if (long32_p && long64_p)
6646 return 0;
6647 if (long32_p)
6648 return 4;
6649 if (long64_p)
6650 return 8;
6651
6652 if (sec->reloc_count > 0
6653 && elf_section_data (sec)->relocs != NULL
6654 && (ELF32_R_TYPE (elf_section_data (sec)->relocs[0].r_info)
6655 == R_MIPS_64))
6656 return 8;
6657
6658 return 0;
6659 }
6660 return 4;
6661}
6662\f
174fd7f9
RS
6663/* There appears to be a bug in the MIPSpro linker that causes GOT_DISP
6664 relocations against two unnamed section symbols to resolve to the
6665 same address. For example, if we have code like:
6666
6667 lw $4,%got_disp(.data)($gp)
6668 lw $25,%got_disp(.text)($gp)
6669 jalr $25
6670
6671 then the linker will resolve both relocations to .data and the program
6672 will jump there rather than to .text.
6673
6674 We can work around this problem by giving names to local section symbols.
6675 This is also what the MIPSpro tools do. */
6676
6677bfd_boolean
6678_bfd_mips_elf_name_local_section_symbols (bfd *abfd)
6679{
6680 return SGI_COMPAT (abfd);
6681}
6682\f
b49e97c9
TS
6683/* Work over a section just before writing it out. This routine is
6684 used by both the 32-bit and the 64-bit ABI. FIXME: We recognize
6685 sections that need the SHF_MIPS_GPREL flag by name; there has to be
6686 a better way. */
6687
b34976b6 6688bfd_boolean
9719ad41 6689_bfd_mips_elf_section_processing (bfd *abfd, Elf_Internal_Shdr *hdr)
b49e97c9
TS
6690{
6691 if (hdr->sh_type == SHT_MIPS_REGINFO
6692 && hdr->sh_size > 0)
6693 {
6694 bfd_byte buf[4];
6695
6696 BFD_ASSERT (hdr->sh_size == sizeof (Elf32_External_RegInfo));
6697 BFD_ASSERT (hdr->contents == NULL);
6698
6699 if (bfd_seek (abfd,
6700 hdr->sh_offset + sizeof (Elf32_External_RegInfo) - 4,
6701 SEEK_SET) != 0)
b34976b6 6702 return FALSE;
b49e97c9 6703 H_PUT_32 (abfd, elf_gp (abfd), buf);
9719ad41 6704 if (bfd_bwrite (buf, 4, abfd) != 4)
b34976b6 6705 return FALSE;
b49e97c9
TS
6706 }
6707
6708 if (hdr->sh_type == SHT_MIPS_OPTIONS
6709 && hdr->bfd_section != NULL
f0abc2a1
AM
6710 && mips_elf_section_data (hdr->bfd_section) != NULL
6711 && mips_elf_section_data (hdr->bfd_section)->u.tdata != NULL)
b49e97c9
TS
6712 {
6713 bfd_byte *contents, *l, *lend;
6714
f0abc2a1
AM
6715 /* We stored the section contents in the tdata field in the
6716 set_section_contents routine. We save the section contents
6717 so that we don't have to read them again.
b49e97c9
TS
6718 At this point we know that elf_gp is set, so we can look
6719 through the section contents to see if there is an
6720 ODK_REGINFO structure. */
6721
f0abc2a1 6722 contents = mips_elf_section_data (hdr->bfd_section)->u.tdata;
b49e97c9
TS
6723 l = contents;
6724 lend = contents + hdr->sh_size;
6725 while (l + sizeof (Elf_External_Options) <= lend)
6726 {
6727 Elf_Internal_Options intopt;
6728
6729 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
6730 &intopt);
1bc8074d
MR
6731 if (intopt.size < sizeof (Elf_External_Options))
6732 {
6733 (*_bfd_error_handler)
6734 (_("%B: Warning: bad `%s' option size %u smaller than its header"),
6735 abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd), intopt.size);
6736 break;
6737 }
b49e97c9
TS
6738 if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
6739 {
6740 bfd_byte buf[8];
6741
6742 if (bfd_seek (abfd,
6743 (hdr->sh_offset
6744 + (l - contents)
6745 + sizeof (Elf_External_Options)
6746 + (sizeof (Elf64_External_RegInfo) - 8)),
6747 SEEK_SET) != 0)
b34976b6 6748 return FALSE;
b49e97c9 6749 H_PUT_64 (abfd, elf_gp (abfd), buf);
9719ad41 6750 if (bfd_bwrite (buf, 8, abfd) != 8)
b34976b6 6751 return FALSE;
b49e97c9
TS
6752 }
6753 else if (intopt.kind == ODK_REGINFO)
6754 {
6755 bfd_byte buf[4];
6756
6757 if (bfd_seek (abfd,
6758 (hdr->sh_offset
6759 + (l - contents)
6760 + sizeof (Elf_External_Options)
6761 + (sizeof (Elf32_External_RegInfo) - 4)),
6762 SEEK_SET) != 0)
b34976b6 6763 return FALSE;
b49e97c9 6764 H_PUT_32 (abfd, elf_gp (abfd), buf);
9719ad41 6765 if (bfd_bwrite (buf, 4, abfd) != 4)
b34976b6 6766 return FALSE;
b49e97c9
TS
6767 }
6768 l += intopt.size;
6769 }
6770 }
6771
6772 if (hdr->bfd_section != NULL)
6773 {
6774 const char *name = bfd_get_section_name (abfd, hdr->bfd_section);
6775
2d0f9ad9
JM
6776 /* .sbss is not handled specially here because the GNU/Linux
6777 prelinker can convert .sbss from NOBITS to PROGBITS and
6778 changing it back to NOBITS breaks the binary. The entry in
6779 _bfd_mips_elf_special_sections will ensure the correct flags
6780 are set on .sbss if BFD creates it without reading it from an
6781 input file, and without special handling here the flags set
6782 on it in an input file will be followed. */
b49e97c9
TS
6783 if (strcmp (name, ".sdata") == 0
6784 || strcmp (name, ".lit8") == 0
6785 || strcmp (name, ".lit4") == 0)
6786 {
6787 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
6788 hdr->sh_type = SHT_PROGBITS;
6789 }
b49e97c9
TS
6790 else if (strcmp (name, ".srdata") == 0)
6791 {
6792 hdr->sh_flags |= SHF_ALLOC | SHF_MIPS_GPREL;
6793 hdr->sh_type = SHT_PROGBITS;
6794 }
6795 else if (strcmp (name, ".compact_rel") == 0)
6796 {
6797 hdr->sh_flags = 0;
6798 hdr->sh_type = SHT_PROGBITS;
6799 }
6800 else if (strcmp (name, ".rtproc") == 0)
6801 {
6802 if (hdr->sh_addralign != 0 && hdr->sh_entsize == 0)
6803 {
6804 unsigned int adjust;
6805
6806 adjust = hdr->sh_size % hdr->sh_addralign;
6807 if (adjust != 0)
6808 hdr->sh_size += hdr->sh_addralign - adjust;
6809 }
6810 }
6811 }
6812
b34976b6 6813 return TRUE;
b49e97c9
TS
6814}
6815
6816/* Handle a MIPS specific section when reading an object file. This
6817 is called when elfcode.h finds a section with an unknown type.
6818 This routine supports both the 32-bit and 64-bit ELF ABI.
6819
6820 FIXME: We need to handle the SHF_MIPS_GPREL flag, but I'm not sure
6821 how to. */
6822
b34976b6 6823bfd_boolean
6dc132d9
L
6824_bfd_mips_elf_section_from_shdr (bfd *abfd,
6825 Elf_Internal_Shdr *hdr,
6826 const char *name,
6827 int shindex)
b49e97c9
TS
6828{
6829 flagword flags = 0;
6830
6831 /* There ought to be a place to keep ELF backend specific flags, but
6832 at the moment there isn't one. We just keep track of the
6833 sections by their name, instead. Fortunately, the ABI gives
6834 suggested names for all the MIPS specific sections, so we will
6835 probably get away with this. */
6836 switch (hdr->sh_type)
6837 {
6838 case SHT_MIPS_LIBLIST:
6839 if (strcmp (name, ".liblist") != 0)
b34976b6 6840 return FALSE;
b49e97c9
TS
6841 break;
6842 case SHT_MIPS_MSYM:
6843 if (strcmp (name, ".msym") != 0)
b34976b6 6844 return FALSE;
b49e97c9
TS
6845 break;
6846 case SHT_MIPS_CONFLICT:
6847 if (strcmp (name, ".conflict") != 0)
b34976b6 6848 return FALSE;
b49e97c9
TS
6849 break;
6850 case SHT_MIPS_GPTAB:
0112cd26 6851 if (! CONST_STRNEQ (name, ".gptab."))
b34976b6 6852 return FALSE;
b49e97c9
TS
6853 break;
6854 case SHT_MIPS_UCODE:
6855 if (strcmp (name, ".ucode") != 0)
b34976b6 6856 return FALSE;
b49e97c9
TS
6857 break;
6858 case SHT_MIPS_DEBUG:
6859 if (strcmp (name, ".mdebug") != 0)
b34976b6 6860 return FALSE;
b49e97c9
TS
6861 flags = SEC_DEBUGGING;
6862 break;
6863 case SHT_MIPS_REGINFO:
6864 if (strcmp (name, ".reginfo") != 0
6865 || hdr->sh_size != sizeof (Elf32_External_RegInfo))
b34976b6 6866 return FALSE;
b49e97c9
TS
6867 flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
6868 break;
6869 case SHT_MIPS_IFACE:
6870 if (strcmp (name, ".MIPS.interfaces") != 0)
b34976b6 6871 return FALSE;
b49e97c9
TS
6872 break;
6873 case SHT_MIPS_CONTENT:
0112cd26 6874 if (! CONST_STRNEQ (name, ".MIPS.content"))
b34976b6 6875 return FALSE;
b49e97c9
TS
6876 break;
6877 case SHT_MIPS_OPTIONS:
cc2e31b9 6878 if (!MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
b34976b6 6879 return FALSE;
b49e97c9
TS
6880 break;
6881 case SHT_MIPS_DWARF:
1b315056 6882 if (! CONST_STRNEQ (name, ".debug_")
355d10dc 6883 && ! CONST_STRNEQ (name, ".zdebug_"))
b34976b6 6884 return FALSE;
b49e97c9
TS
6885 break;
6886 case SHT_MIPS_SYMBOL_LIB:
6887 if (strcmp (name, ".MIPS.symlib") != 0)
b34976b6 6888 return FALSE;
b49e97c9
TS
6889 break;
6890 case SHT_MIPS_EVENTS:
0112cd26
NC
6891 if (! CONST_STRNEQ (name, ".MIPS.events")
6892 && ! CONST_STRNEQ (name, ".MIPS.post_rel"))
b34976b6 6893 return FALSE;
b49e97c9
TS
6894 break;
6895 default:
cc2e31b9 6896 break;
b49e97c9
TS
6897 }
6898
6dc132d9 6899 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
b34976b6 6900 return FALSE;
b49e97c9
TS
6901
6902 if (flags)
6903 {
6904 if (! bfd_set_section_flags (abfd, hdr->bfd_section,
6905 (bfd_get_section_flags (abfd,
6906 hdr->bfd_section)
6907 | flags)))
b34976b6 6908 return FALSE;
b49e97c9
TS
6909 }
6910
6911 /* FIXME: We should record sh_info for a .gptab section. */
6912
6913 /* For a .reginfo section, set the gp value in the tdata information
6914 from the contents of this section. We need the gp value while
6915 processing relocs, so we just get it now. The .reginfo section
6916 is not used in the 64-bit MIPS ELF ABI. */
6917 if (hdr->sh_type == SHT_MIPS_REGINFO)
6918 {
6919 Elf32_External_RegInfo ext;
6920 Elf32_RegInfo s;
6921
9719ad41
RS
6922 if (! bfd_get_section_contents (abfd, hdr->bfd_section,
6923 &ext, 0, sizeof ext))
b34976b6 6924 return FALSE;
b49e97c9
TS
6925 bfd_mips_elf32_swap_reginfo_in (abfd, &ext, &s);
6926 elf_gp (abfd) = s.ri_gp_value;
6927 }
6928
6929 /* For a SHT_MIPS_OPTIONS section, look for a ODK_REGINFO entry, and
6930 set the gp value based on what we find. We may see both
6931 SHT_MIPS_REGINFO and SHT_MIPS_OPTIONS/ODK_REGINFO; in that case,
6932 they should agree. */
6933 if (hdr->sh_type == SHT_MIPS_OPTIONS)
6934 {
6935 bfd_byte *contents, *l, *lend;
6936
9719ad41 6937 contents = bfd_malloc (hdr->sh_size);
b49e97c9 6938 if (contents == NULL)
b34976b6 6939 return FALSE;
b49e97c9 6940 if (! bfd_get_section_contents (abfd, hdr->bfd_section, contents,
9719ad41 6941 0, hdr->sh_size))
b49e97c9
TS
6942 {
6943 free (contents);
b34976b6 6944 return FALSE;
b49e97c9
TS
6945 }
6946 l = contents;
6947 lend = contents + hdr->sh_size;
6948 while (l + sizeof (Elf_External_Options) <= lend)
6949 {
6950 Elf_Internal_Options intopt;
6951
6952 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
6953 &intopt);
1bc8074d
MR
6954 if (intopt.size < sizeof (Elf_External_Options))
6955 {
6956 (*_bfd_error_handler)
6957 (_("%B: Warning: bad `%s' option size %u smaller than its header"),
6958 abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd), intopt.size);
6959 break;
6960 }
b49e97c9
TS
6961 if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
6962 {
6963 Elf64_Internal_RegInfo intreg;
6964
6965 bfd_mips_elf64_swap_reginfo_in
6966 (abfd,
6967 ((Elf64_External_RegInfo *)
6968 (l + sizeof (Elf_External_Options))),
6969 &intreg);
6970 elf_gp (abfd) = intreg.ri_gp_value;
6971 }
6972 else if (intopt.kind == ODK_REGINFO)
6973 {
6974 Elf32_RegInfo intreg;
6975
6976 bfd_mips_elf32_swap_reginfo_in
6977 (abfd,
6978 ((Elf32_External_RegInfo *)
6979 (l + sizeof (Elf_External_Options))),
6980 &intreg);
6981 elf_gp (abfd) = intreg.ri_gp_value;
6982 }
6983 l += intopt.size;
6984 }
6985 free (contents);
6986 }
6987
b34976b6 6988 return TRUE;
b49e97c9
TS
6989}
6990
6991/* Set the correct type for a MIPS ELF section. We do this by the
6992 section name, which is a hack, but ought to work. This routine is
6993 used by both the 32-bit and the 64-bit ABI. */
6994
b34976b6 6995bfd_boolean
9719ad41 6996_bfd_mips_elf_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
b49e97c9 6997{
0414f35b 6998 const char *name = bfd_get_section_name (abfd, sec);
b49e97c9
TS
6999
7000 if (strcmp (name, ".liblist") == 0)
7001 {
7002 hdr->sh_type = SHT_MIPS_LIBLIST;
eea6121a 7003 hdr->sh_info = sec->size / sizeof (Elf32_Lib);
b49e97c9
TS
7004 /* The sh_link field is set in final_write_processing. */
7005 }
7006 else if (strcmp (name, ".conflict") == 0)
7007 hdr->sh_type = SHT_MIPS_CONFLICT;
0112cd26 7008 else if (CONST_STRNEQ (name, ".gptab."))
b49e97c9
TS
7009 {
7010 hdr->sh_type = SHT_MIPS_GPTAB;
7011 hdr->sh_entsize = sizeof (Elf32_External_gptab);
7012 /* The sh_info field is set in final_write_processing. */
7013 }
7014 else if (strcmp (name, ".ucode") == 0)
7015 hdr->sh_type = SHT_MIPS_UCODE;
7016 else if (strcmp (name, ".mdebug") == 0)
7017 {
7018 hdr->sh_type = SHT_MIPS_DEBUG;
8dc1a139 7019 /* In a shared object on IRIX 5.3, the .mdebug section has an
b49e97c9
TS
7020 entsize of 0. FIXME: Does this matter? */
7021 if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0)
7022 hdr->sh_entsize = 0;
7023 else
7024 hdr->sh_entsize = 1;
7025 }
7026 else if (strcmp (name, ".reginfo") == 0)
7027 {
7028 hdr->sh_type = SHT_MIPS_REGINFO;
8dc1a139 7029 /* In a shared object on IRIX 5.3, the .reginfo section has an
b49e97c9
TS
7030 entsize of 0x18. FIXME: Does this matter? */
7031 if (SGI_COMPAT (abfd))
7032 {
7033 if ((abfd->flags & DYNAMIC) != 0)
7034 hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
7035 else
7036 hdr->sh_entsize = 1;
7037 }
7038 else
7039 hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
7040 }
7041 else if (SGI_COMPAT (abfd)
7042 && (strcmp (name, ".hash") == 0
7043 || strcmp (name, ".dynamic") == 0
7044 || strcmp (name, ".dynstr") == 0))
7045 {
7046 if (SGI_COMPAT (abfd))
7047 hdr->sh_entsize = 0;
7048#if 0
8dc1a139 7049 /* This isn't how the IRIX6 linker behaves. */
b49e97c9
TS
7050 hdr->sh_info = SIZEOF_MIPS_DYNSYM_SECNAMES;
7051#endif
7052 }
7053 else if (strcmp (name, ".got") == 0
7054 || strcmp (name, ".srdata") == 0
7055 || strcmp (name, ".sdata") == 0
7056 || strcmp (name, ".sbss") == 0
7057 || strcmp (name, ".lit4") == 0
7058 || strcmp (name, ".lit8") == 0)
7059 hdr->sh_flags |= SHF_MIPS_GPREL;
7060 else if (strcmp (name, ".MIPS.interfaces") == 0)
7061 {
7062 hdr->sh_type = SHT_MIPS_IFACE;
7063 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7064 }
0112cd26 7065 else if (CONST_STRNEQ (name, ".MIPS.content"))
b49e97c9
TS
7066 {
7067 hdr->sh_type = SHT_MIPS_CONTENT;
7068 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7069 /* The sh_info field is set in final_write_processing. */
7070 }
cc2e31b9 7071 else if (MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
b49e97c9
TS
7072 {
7073 hdr->sh_type = SHT_MIPS_OPTIONS;
7074 hdr->sh_entsize = 1;
7075 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7076 }
1b315056
CS
7077 else if (CONST_STRNEQ (name, ".debug_")
7078 || CONST_STRNEQ (name, ".zdebug_"))
b5482f21
NC
7079 {
7080 hdr->sh_type = SHT_MIPS_DWARF;
7081
7082 /* Irix facilities such as libexc expect a single .debug_frame
7083 per executable, the system ones have NOSTRIP set and the linker
7084 doesn't merge sections with different flags so ... */
7085 if (SGI_COMPAT (abfd) && CONST_STRNEQ (name, ".debug_frame"))
7086 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7087 }
b49e97c9
TS
7088 else if (strcmp (name, ".MIPS.symlib") == 0)
7089 {
7090 hdr->sh_type = SHT_MIPS_SYMBOL_LIB;
7091 /* The sh_link and sh_info fields are set in
7092 final_write_processing. */
7093 }
0112cd26
NC
7094 else if (CONST_STRNEQ (name, ".MIPS.events")
7095 || CONST_STRNEQ (name, ".MIPS.post_rel"))
b49e97c9
TS
7096 {
7097 hdr->sh_type = SHT_MIPS_EVENTS;
7098 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
7099 /* The sh_link field is set in final_write_processing. */
7100 }
7101 else if (strcmp (name, ".msym") == 0)
7102 {
7103 hdr->sh_type = SHT_MIPS_MSYM;
7104 hdr->sh_flags |= SHF_ALLOC;
7105 hdr->sh_entsize = 8;
7106 }
7107
7a79a000
TS
7108 /* The generic elf_fake_sections will set up REL_HDR using the default
7109 kind of relocations. We used to set up a second header for the
7110 non-default kind of relocations here, but only NewABI would use
7111 these, and the IRIX ld doesn't like resulting empty RELA sections.
7112 Thus we create those header only on demand now. */
b49e97c9 7113
b34976b6 7114 return TRUE;
b49e97c9
TS
7115}
7116
7117/* Given a BFD section, try to locate the corresponding ELF section
7118 index. This is used by both the 32-bit and the 64-bit ABI.
7119 Actually, it's not clear to me that the 64-bit ABI supports these,
7120 but for non-PIC objects we will certainly want support for at least
7121 the .scommon section. */
7122
b34976b6 7123bfd_boolean
9719ad41
RS
7124_bfd_mips_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
7125 asection *sec, int *retval)
b49e97c9
TS
7126{
7127 if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
7128 {
7129 *retval = SHN_MIPS_SCOMMON;
b34976b6 7130 return TRUE;
b49e97c9
TS
7131 }
7132 if (strcmp (bfd_get_section_name (abfd, sec), ".acommon") == 0)
7133 {
7134 *retval = SHN_MIPS_ACOMMON;
b34976b6 7135 return TRUE;
b49e97c9 7136 }
b34976b6 7137 return FALSE;
b49e97c9
TS
7138}
7139\f
7140/* Hook called by the linker routine which adds symbols from an object
7141 file. We must handle the special MIPS section numbers here. */
7142
b34976b6 7143bfd_boolean
9719ad41 7144_bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
555cd476 7145 Elf_Internal_Sym *sym, const char **namep,
9719ad41
RS
7146 flagword *flagsp ATTRIBUTE_UNUSED,
7147 asection **secp, bfd_vma *valp)
b49e97c9
TS
7148{
7149 if (SGI_COMPAT (abfd)
7150 && (abfd->flags & DYNAMIC) != 0
7151 && strcmp (*namep, "_rld_new_interface") == 0)
7152 {
8dc1a139 7153 /* Skip IRIX5 rld entry name. */
b49e97c9 7154 *namep = NULL;
b34976b6 7155 return TRUE;
b49e97c9
TS
7156 }
7157
eedecc07
DD
7158 /* Shared objects may have a dynamic symbol '_gp_disp' defined as
7159 a SECTION *ABS*. This causes ld to think it can resolve _gp_disp
7160 by setting a DT_NEEDED for the shared object. Since _gp_disp is
7161 a magic symbol resolved by the linker, we ignore this bogus definition
7162 of _gp_disp. New ABI objects do not suffer from this problem so this
7163 is not done for them. */
7164 if (!NEWABI_P(abfd)
7165 && (sym->st_shndx == SHN_ABS)
7166 && (strcmp (*namep, "_gp_disp") == 0))
7167 {
7168 *namep = NULL;
7169 return TRUE;
7170 }
7171
b49e97c9
TS
7172 switch (sym->st_shndx)
7173 {
7174 case SHN_COMMON:
7175 /* Common symbols less than the GP size are automatically
7176 treated as SHN_MIPS_SCOMMON symbols. */
7177 if (sym->st_size > elf_gp_size (abfd)
b59eed79 7178 || ELF_ST_TYPE (sym->st_info) == STT_TLS
b49e97c9
TS
7179 || IRIX_COMPAT (abfd) == ict_irix6)
7180 break;
7181 /* Fall through. */
7182 case SHN_MIPS_SCOMMON:
7183 *secp = bfd_make_section_old_way (abfd, ".scommon");
7184 (*secp)->flags |= SEC_IS_COMMON;
7185 *valp = sym->st_size;
7186 break;
7187
7188 case SHN_MIPS_TEXT:
7189 /* This section is used in a shared object. */
698600e4 7190 if (mips_elf_tdata (abfd)->elf_text_section == NULL)
b49e97c9
TS
7191 {
7192 asymbol *elf_text_symbol;
7193 asection *elf_text_section;
7194 bfd_size_type amt = sizeof (asection);
7195
7196 elf_text_section = bfd_zalloc (abfd, amt);
7197 if (elf_text_section == NULL)
b34976b6 7198 return FALSE;
b49e97c9
TS
7199
7200 amt = sizeof (asymbol);
7201 elf_text_symbol = bfd_zalloc (abfd, amt);
7202 if (elf_text_symbol == NULL)
b34976b6 7203 return FALSE;
b49e97c9
TS
7204
7205 /* Initialize the section. */
7206
698600e4
AM
7207 mips_elf_tdata (abfd)->elf_text_section = elf_text_section;
7208 mips_elf_tdata (abfd)->elf_text_symbol = elf_text_symbol;
b49e97c9
TS
7209
7210 elf_text_section->symbol = elf_text_symbol;
698600e4 7211 elf_text_section->symbol_ptr_ptr = &mips_elf_tdata (abfd)->elf_text_symbol;
b49e97c9
TS
7212
7213 elf_text_section->name = ".text";
7214 elf_text_section->flags = SEC_NO_FLAGS;
7215 elf_text_section->output_section = NULL;
7216 elf_text_section->owner = abfd;
7217 elf_text_symbol->name = ".text";
7218 elf_text_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
7219 elf_text_symbol->section = elf_text_section;
7220 }
7221 /* This code used to do *secp = bfd_und_section_ptr if
7222 info->shared. I don't know why, and that doesn't make sense,
7223 so I took it out. */
698600e4 7224 *secp = mips_elf_tdata (abfd)->elf_text_section;
b49e97c9
TS
7225 break;
7226
7227 case SHN_MIPS_ACOMMON:
7228 /* Fall through. XXX Can we treat this as allocated data? */
7229 case SHN_MIPS_DATA:
7230 /* This section is used in a shared object. */
698600e4 7231 if (mips_elf_tdata (abfd)->elf_data_section == NULL)
b49e97c9
TS
7232 {
7233 asymbol *elf_data_symbol;
7234 asection *elf_data_section;
7235 bfd_size_type amt = sizeof (asection);
7236
7237 elf_data_section = bfd_zalloc (abfd, amt);
7238 if (elf_data_section == NULL)
b34976b6 7239 return FALSE;
b49e97c9
TS
7240
7241 amt = sizeof (asymbol);
7242 elf_data_symbol = bfd_zalloc (abfd, amt);
7243 if (elf_data_symbol == NULL)
b34976b6 7244 return FALSE;
b49e97c9
TS
7245
7246 /* Initialize the section. */
7247
698600e4
AM
7248 mips_elf_tdata (abfd)->elf_data_section = elf_data_section;
7249 mips_elf_tdata (abfd)->elf_data_symbol = elf_data_symbol;
b49e97c9
TS
7250
7251 elf_data_section->symbol = elf_data_symbol;
698600e4 7252 elf_data_section->symbol_ptr_ptr = &mips_elf_tdata (abfd)->elf_data_symbol;
b49e97c9
TS
7253
7254 elf_data_section->name = ".data";
7255 elf_data_section->flags = SEC_NO_FLAGS;
7256 elf_data_section->output_section = NULL;
7257 elf_data_section->owner = abfd;
7258 elf_data_symbol->name = ".data";
7259 elf_data_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
7260 elf_data_symbol->section = elf_data_section;
7261 }
7262 /* This code used to do *secp = bfd_und_section_ptr if
7263 info->shared. I don't know why, and that doesn't make sense,
7264 so I took it out. */
698600e4 7265 *secp = mips_elf_tdata (abfd)->elf_data_section;
b49e97c9
TS
7266 break;
7267
7268 case SHN_MIPS_SUNDEFINED:
7269 *secp = bfd_und_section_ptr;
7270 break;
7271 }
7272
7273 if (SGI_COMPAT (abfd)
7274 && ! info->shared
f13a99db 7275 && info->output_bfd->xvec == abfd->xvec
b49e97c9
TS
7276 && strcmp (*namep, "__rld_obj_head") == 0)
7277 {
7278 struct elf_link_hash_entry *h;
14a793b2 7279 struct bfd_link_hash_entry *bh;
b49e97c9
TS
7280
7281 /* Mark __rld_obj_head as dynamic. */
14a793b2 7282 bh = NULL;
b49e97c9 7283 if (! (_bfd_generic_link_add_one_symbol
9719ad41 7284 (info, abfd, *namep, BSF_GLOBAL, *secp, *valp, NULL, FALSE,
14a793b2 7285 get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 7286 return FALSE;
14a793b2
AM
7287
7288 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
7289 h->non_elf = 0;
7290 h->def_regular = 1;
b49e97c9
TS
7291 h->type = STT_OBJECT;
7292
c152c796 7293 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 7294 return FALSE;
b49e97c9 7295
b34976b6 7296 mips_elf_hash_table (info)->use_rld_obj_head = TRUE;
b4082c70 7297 mips_elf_hash_table (info)->rld_symbol = h;
b49e97c9
TS
7298 }
7299
7300 /* If this is a mips16 text symbol, add 1 to the value to make it
7301 odd. This will cause something like .word SYM to come up with
7302 the right value when it is loaded into the PC. */
df58fc94 7303 if (ELF_ST_IS_COMPRESSED (sym->st_other))
b49e97c9
TS
7304 ++*valp;
7305
b34976b6 7306 return TRUE;
b49e97c9
TS
7307}
7308
7309/* This hook function is called before the linker writes out a global
7310 symbol. We mark symbols as small common if appropriate. This is
7311 also where we undo the increment of the value for a mips16 symbol. */
7312
6e0b88f1 7313int
9719ad41
RS
7314_bfd_mips_elf_link_output_symbol_hook
7315 (struct bfd_link_info *info ATTRIBUTE_UNUSED,
7316 const char *name ATTRIBUTE_UNUSED, Elf_Internal_Sym *sym,
7317 asection *input_sec, struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
b49e97c9
TS
7318{
7319 /* If we see a common symbol, which implies a relocatable link, then
7320 if a symbol was small common in an input file, mark it as small
7321 common in the output file. */
7322 if (sym->st_shndx == SHN_COMMON
7323 && strcmp (input_sec->name, ".scommon") == 0)
7324 sym->st_shndx = SHN_MIPS_SCOMMON;
7325
df58fc94 7326 if (ELF_ST_IS_COMPRESSED (sym->st_other))
79cda7cf 7327 sym->st_value &= ~1;
b49e97c9 7328
6e0b88f1 7329 return 1;
b49e97c9
TS
7330}
7331\f
7332/* Functions for the dynamic linker. */
7333
7334/* Create dynamic sections when linking against a dynamic object. */
7335
b34976b6 7336bfd_boolean
9719ad41 7337_bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
b49e97c9
TS
7338{
7339 struct elf_link_hash_entry *h;
14a793b2 7340 struct bfd_link_hash_entry *bh;
b49e97c9
TS
7341 flagword flags;
7342 register asection *s;
7343 const char * const *namep;
0a44bf69 7344 struct mips_elf_link_hash_table *htab;
b49e97c9 7345
0a44bf69 7346 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
7347 BFD_ASSERT (htab != NULL);
7348
b49e97c9
TS
7349 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
7350 | SEC_LINKER_CREATED | SEC_READONLY);
7351
0a44bf69
RS
7352 /* The psABI requires a read-only .dynamic section, but the VxWorks
7353 EABI doesn't. */
7354 if (!htab->is_vxworks)
b49e97c9 7355 {
3d4d4302 7356 s = bfd_get_linker_section (abfd, ".dynamic");
0a44bf69
RS
7357 if (s != NULL)
7358 {
7359 if (! bfd_set_section_flags (abfd, s, flags))
7360 return FALSE;
7361 }
b49e97c9
TS
7362 }
7363
7364 /* We need to create .got section. */
23cc69b6 7365 if (!mips_elf_create_got_section (abfd, info))
f4416af6
AO
7366 return FALSE;
7367
0a44bf69 7368 if (! mips_elf_rel_dyn_section (info, TRUE))
b34976b6 7369 return FALSE;
b49e97c9 7370
b49e97c9 7371 /* Create .stub section. */
3d4d4302
AM
7372 s = bfd_make_section_anyway_with_flags (abfd,
7373 MIPS_ELF_STUB_SECTION_NAME (abfd),
7374 flags | SEC_CODE);
4e41d0d7
RS
7375 if (s == NULL
7376 || ! bfd_set_section_alignment (abfd, s,
7377 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
7378 return FALSE;
7379 htab->sstubs = s;
b49e97c9 7380
e6aea42d 7381 if (!mips_elf_hash_table (info)->use_rld_obj_head
b49e97c9 7382 && !info->shared
3d4d4302 7383 && bfd_get_linker_section (abfd, ".rld_map") == NULL)
b49e97c9 7384 {
3d4d4302
AM
7385 s = bfd_make_section_anyway_with_flags (abfd, ".rld_map",
7386 flags &~ (flagword) SEC_READONLY);
b49e97c9 7387 if (s == NULL
b49e97c9
TS
7388 || ! bfd_set_section_alignment (abfd, s,
7389 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
b34976b6 7390 return FALSE;
b49e97c9
TS
7391 }
7392
7393 /* On IRIX5, we adjust add some additional symbols and change the
7394 alignments of several sections. There is no ABI documentation
7395 indicating that this is necessary on IRIX6, nor any evidence that
7396 the linker takes such action. */
7397 if (IRIX_COMPAT (abfd) == ict_irix5)
7398 {
7399 for (namep = mips_elf_dynsym_rtproc_names; *namep != NULL; namep++)
7400 {
14a793b2 7401 bh = NULL;
b49e97c9 7402 if (! (_bfd_generic_link_add_one_symbol
9719ad41
RS
7403 (info, abfd, *namep, BSF_GLOBAL, bfd_und_section_ptr, 0,
7404 NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 7405 return FALSE;
14a793b2
AM
7406
7407 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
7408 h->non_elf = 0;
7409 h->def_regular = 1;
b49e97c9
TS
7410 h->type = STT_SECTION;
7411
c152c796 7412 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 7413 return FALSE;
b49e97c9
TS
7414 }
7415
7416 /* We need to create a .compact_rel section. */
7417 if (SGI_COMPAT (abfd))
7418 {
7419 if (!mips_elf_create_compact_rel_section (abfd, info))
b34976b6 7420 return FALSE;
b49e97c9
TS
7421 }
7422
44c410de 7423 /* Change alignments of some sections. */
3d4d4302 7424 s = bfd_get_linker_section (abfd, ".hash");
b49e97c9 7425 if (s != NULL)
a253d456
NC
7426 (void) bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
7427
3d4d4302 7428 s = bfd_get_linker_section (abfd, ".dynsym");
b49e97c9 7429 if (s != NULL)
a253d456
NC
7430 (void) bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
7431
3d4d4302 7432 s = bfd_get_linker_section (abfd, ".dynstr");
b49e97c9 7433 if (s != NULL)
a253d456
NC
7434 (void) bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
7435
3d4d4302 7436 /* ??? */
b49e97c9
TS
7437 s = bfd_get_section_by_name (abfd, ".reginfo");
7438 if (s != NULL)
a253d456
NC
7439 (void) bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
7440
3d4d4302 7441 s = bfd_get_linker_section (abfd, ".dynamic");
b49e97c9 7442 if (s != NULL)
a253d456 7443 (void) bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
b49e97c9
TS
7444 }
7445
7446 if (!info->shared)
7447 {
14a793b2
AM
7448 const char *name;
7449
7450 name = SGI_COMPAT (abfd) ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING";
7451 bh = NULL;
7452 if (!(_bfd_generic_link_add_one_symbol
9719ad41
RS
7453 (info, abfd, name, BSF_GLOBAL, bfd_abs_section_ptr, 0,
7454 NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 7455 return FALSE;
14a793b2
AM
7456
7457 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
7458 h->non_elf = 0;
7459 h->def_regular = 1;
b49e97c9
TS
7460 h->type = STT_SECTION;
7461
c152c796 7462 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 7463 return FALSE;
b49e97c9
TS
7464
7465 if (! mips_elf_hash_table (info)->use_rld_obj_head)
7466 {
7467 /* __rld_map is a four byte word located in the .data section
7468 and is filled in by the rtld to contain a pointer to
7469 the _r_debug structure. Its symbol value will be set in
7470 _bfd_mips_elf_finish_dynamic_symbol. */
3d4d4302 7471 s = bfd_get_linker_section (abfd, ".rld_map");
0abfb97a 7472 BFD_ASSERT (s != NULL);
14a793b2 7473
0abfb97a
L
7474 name = SGI_COMPAT (abfd) ? "__rld_map" : "__RLD_MAP";
7475 bh = NULL;
7476 if (!(_bfd_generic_link_add_one_symbol
7477 (info, abfd, name, BSF_GLOBAL, s, 0, NULL, FALSE,
7478 get_elf_backend_data (abfd)->collect, &bh)))
7479 return FALSE;
b49e97c9 7480
0abfb97a
L
7481 h = (struct elf_link_hash_entry *) bh;
7482 h->non_elf = 0;
7483 h->def_regular = 1;
7484 h->type = STT_OBJECT;
7485
7486 if (! bfd_elf_link_record_dynamic_symbol (info, h))
7487 return FALSE;
b4082c70 7488 mips_elf_hash_table (info)->rld_symbol = h;
b49e97c9
TS
7489 }
7490 }
7491
861fb55a 7492 /* Create the .plt, .rel(a).plt, .dynbss and .rel(a).bss sections.
c164a95d 7493 Also, on VxWorks, create the _PROCEDURE_LINKAGE_TABLE_ symbol. */
861fb55a
DJ
7494 if (!_bfd_elf_create_dynamic_sections (abfd, info))
7495 return FALSE;
7496
7497 /* Cache the sections created above. */
3d4d4302
AM
7498 htab->splt = bfd_get_linker_section (abfd, ".plt");
7499 htab->sdynbss = bfd_get_linker_section (abfd, ".dynbss");
0a44bf69
RS
7500 if (htab->is_vxworks)
7501 {
3d4d4302
AM
7502 htab->srelbss = bfd_get_linker_section (abfd, ".rela.bss");
7503 htab->srelplt = bfd_get_linker_section (abfd, ".rela.plt");
861fb55a
DJ
7504 }
7505 else
3d4d4302 7506 htab->srelplt = bfd_get_linker_section (abfd, ".rel.plt");
861fb55a
DJ
7507 if (!htab->sdynbss
7508 || (htab->is_vxworks && !htab->srelbss && !info->shared)
7509 || !htab->srelplt
7510 || !htab->splt)
7511 abort ();
0a44bf69 7512
1bbce132
MR
7513 /* Do the usual VxWorks handling. */
7514 if (htab->is_vxworks
7515 && !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
7516 return FALSE;
0a44bf69 7517
b34976b6 7518 return TRUE;
b49e97c9
TS
7519}
7520\f
c224138d
RS
7521/* Return true if relocation REL against section SEC is a REL rather than
7522 RELA relocation. RELOCS is the first relocation in the section and
7523 ABFD is the bfd that contains SEC. */
7524
7525static bfd_boolean
7526mips_elf_rel_relocation_p (bfd *abfd, asection *sec,
7527 const Elf_Internal_Rela *relocs,
7528 const Elf_Internal_Rela *rel)
7529{
7530 Elf_Internal_Shdr *rel_hdr;
7531 const struct elf_backend_data *bed;
7532
d4730f92
BS
7533 /* To determine which flavor of relocation this is, we depend on the
7534 fact that the INPUT_SECTION's REL_HDR is read before RELA_HDR. */
7535 rel_hdr = elf_section_data (sec)->rel.hdr;
7536 if (rel_hdr == NULL)
7537 return FALSE;
c224138d 7538 bed = get_elf_backend_data (abfd);
d4730f92
BS
7539 return ((size_t) (rel - relocs)
7540 < NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel);
c224138d
RS
7541}
7542
7543/* Read the addend for REL relocation REL, which belongs to bfd ABFD.
7544 HOWTO is the relocation's howto and CONTENTS points to the contents
7545 of the section that REL is against. */
7546
7547static bfd_vma
7548mips_elf_read_rel_addend (bfd *abfd, const Elf_Internal_Rela *rel,
7549 reloc_howto_type *howto, bfd_byte *contents)
7550{
7551 bfd_byte *location;
7552 unsigned int r_type;
7553 bfd_vma addend;
7554
7555 r_type = ELF_R_TYPE (abfd, rel->r_info);
7556 location = contents + rel->r_offset;
7557
7558 /* Get the addend, which is stored in the input file. */
df58fc94 7559 _bfd_mips_elf_reloc_unshuffle (abfd, r_type, FALSE, location);
c224138d 7560 addend = mips_elf_obtain_contents (howto, rel, abfd, contents);
df58fc94 7561 _bfd_mips_elf_reloc_shuffle (abfd, r_type, FALSE, location);
c224138d
RS
7562
7563 return addend & howto->src_mask;
7564}
7565
7566/* REL is a relocation in ABFD that needs a partnering LO16 relocation
7567 and *ADDEND is the addend for REL itself. Look for the LO16 relocation
7568 and update *ADDEND with the final addend. Return true on success
7569 or false if the LO16 could not be found. RELEND is the exclusive
7570 upper bound on the relocations for REL's section. */
7571
7572static bfd_boolean
7573mips_elf_add_lo16_rel_addend (bfd *abfd,
7574 const Elf_Internal_Rela *rel,
7575 const Elf_Internal_Rela *relend,
7576 bfd_byte *contents, bfd_vma *addend)
7577{
7578 unsigned int r_type, lo16_type;
7579 const Elf_Internal_Rela *lo16_relocation;
7580 reloc_howto_type *lo16_howto;
7581 bfd_vma l;
7582
7583 r_type = ELF_R_TYPE (abfd, rel->r_info);
738e5348 7584 if (mips16_reloc_p (r_type))
c224138d 7585 lo16_type = R_MIPS16_LO16;
df58fc94
RS
7586 else if (micromips_reloc_p (r_type))
7587 lo16_type = R_MICROMIPS_LO16;
c224138d
RS
7588 else
7589 lo16_type = R_MIPS_LO16;
7590
7591 /* The combined value is the sum of the HI16 addend, left-shifted by
7592 sixteen bits, and the LO16 addend, sign extended. (Usually, the
7593 code does a `lui' of the HI16 value, and then an `addiu' of the
7594 LO16 value.)
7595
7596 Scan ahead to find a matching LO16 relocation.
7597
7598 According to the MIPS ELF ABI, the R_MIPS_LO16 relocation must
7599 be immediately following. However, for the IRIX6 ABI, the next
7600 relocation may be a composed relocation consisting of several
7601 relocations for the same address. In that case, the R_MIPS_LO16
7602 relocation may occur as one of these. We permit a similar
7603 extension in general, as that is useful for GCC.
7604
7605 In some cases GCC dead code elimination removes the LO16 but keeps
7606 the corresponding HI16. This is strictly speaking a violation of
7607 the ABI but not immediately harmful. */
7608 lo16_relocation = mips_elf_next_relocation (abfd, lo16_type, rel, relend);
7609 if (lo16_relocation == NULL)
7610 return FALSE;
7611
7612 /* Obtain the addend kept there. */
7613 lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, lo16_type, FALSE);
7614 l = mips_elf_read_rel_addend (abfd, lo16_relocation, lo16_howto, contents);
7615
7616 l <<= lo16_howto->rightshift;
7617 l = _bfd_mips_elf_sign_extend (l, 16);
7618
7619 *addend <<= 16;
7620 *addend += l;
7621 return TRUE;
7622}
7623
7624/* Try to read the contents of section SEC in bfd ABFD. Return true and
7625 store the contents in *CONTENTS on success. Assume that *CONTENTS
7626 already holds the contents if it is nonull on entry. */
7627
7628static bfd_boolean
7629mips_elf_get_section_contents (bfd *abfd, asection *sec, bfd_byte **contents)
7630{
7631 if (*contents)
7632 return TRUE;
7633
7634 /* Get cached copy if it exists. */
7635 if (elf_section_data (sec)->this_hdr.contents != NULL)
7636 {
7637 *contents = elf_section_data (sec)->this_hdr.contents;
7638 return TRUE;
7639 }
7640
7641 return bfd_malloc_and_get_section (abfd, sec, contents);
7642}
7643
1bbce132
MR
7644/* Make a new PLT record to keep internal data. */
7645
7646static struct plt_entry *
7647mips_elf_make_plt_record (bfd *abfd)
7648{
7649 struct plt_entry *entry;
7650
7651 entry = bfd_zalloc (abfd, sizeof (*entry));
7652 if (entry == NULL)
7653 return NULL;
7654
7655 entry->stub_offset = MINUS_ONE;
7656 entry->mips_offset = MINUS_ONE;
7657 entry->comp_offset = MINUS_ONE;
7658 entry->gotplt_index = MINUS_ONE;
7659 return entry;
7660}
7661
b49e97c9 7662/* Look through the relocs for a section during the first phase, and
1bbce132
MR
7663 allocate space in the global offset table and record the need for
7664 standard MIPS and compressed procedure linkage table entries. */
b49e97c9 7665
b34976b6 7666bfd_boolean
9719ad41
RS
7667_bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
7668 asection *sec, const Elf_Internal_Rela *relocs)
b49e97c9
TS
7669{
7670 const char *name;
7671 bfd *dynobj;
7672 Elf_Internal_Shdr *symtab_hdr;
7673 struct elf_link_hash_entry **sym_hashes;
b49e97c9
TS
7674 size_t extsymoff;
7675 const Elf_Internal_Rela *rel;
7676 const Elf_Internal_Rela *rel_end;
b49e97c9 7677 asection *sreloc;
9c5bfbb7 7678 const struct elf_backend_data *bed;
0a44bf69 7679 struct mips_elf_link_hash_table *htab;
c224138d
RS
7680 bfd_byte *contents;
7681 bfd_vma addend;
7682 reloc_howto_type *howto;
b49e97c9 7683
1049f94e 7684 if (info->relocatable)
b34976b6 7685 return TRUE;
b49e97c9 7686
0a44bf69 7687 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
7688 BFD_ASSERT (htab != NULL);
7689
b49e97c9
TS
7690 dynobj = elf_hash_table (info)->dynobj;
7691 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
7692 sym_hashes = elf_sym_hashes (abfd);
7693 extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
7694
738e5348
RS
7695 bed = get_elf_backend_data (abfd);
7696 rel_end = relocs + sec->reloc_count * bed->s->int_rels_per_ext_rel;
7697
b49e97c9
TS
7698 /* Check for the mips16 stub sections. */
7699
7700 name = bfd_get_section_name (abfd, sec);
b9d58d71 7701 if (FN_STUB_P (name))
b49e97c9
TS
7702 {
7703 unsigned long r_symndx;
7704
7705 /* Look at the relocation information to figure out which symbol
7706 this is for. */
7707
cb4437b8 7708 r_symndx = mips16_stub_symndx (bed, sec, relocs, rel_end);
738e5348
RS
7709 if (r_symndx == 0)
7710 {
7711 (*_bfd_error_handler)
7712 (_("%B: Warning: cannot determine the target function for"
7713 " stub section `%s'"),
7714 abfd, name);
7715 bfd_set_error (bfd_error_bad_value);
7716 return FALSE;
7717 }
b49e97c9
TS
7718
7719 if (r_symndx < extsymoff
7720 || sym_hashes[r_symndx - extsymoff] == NULL)
7721 {
7722 asection *o;
7723
7724 /* This stub is for a local symbol. This stub will only be
7725 needed if there is some relocation in this BFD, other
7726 than a 16 bit function call, which refers to this symbol. */
7727 for (o = abfd->sections; o != NULL; o = o->next)
7728 {
7729 Elf_Internal_Rela *sec_relocs;
7730 const Elf_Internal_Rela *r, *rend;
7731
7732 /* We can ignore stub sections when looking for relocs. */
7733 if ((o->flags & SEC_RELOC) == 0
7734 || o->reloc_count == 0
738e5348 7735 || section_allows_mips16_refs_p (o))
b49e97c9
TS
7736 continue;
7737
45d6a902 7738 sec_relocs
9719ad41 7739 = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
45d6a902 7740 info->keep_memory);
b49e97c9 7741 if (sec_relocs == NULL)
b34976b6 7742 return FALSE;
b49e97c9
TS
7743
7744 rend = sec_relocs + o->reloc_count;
7745 for (r = sec_relocs; r < rend; r++)
7746 if (ELF_R_SYM (abfd, r->r_info) == r_symndx
738e5348 7747 && !mips16_call_reloc_p (ELF_R_TYPE (abfd, r->r_info)))
b49e97c9
TS
7748 break;
7749
6cdc0ccc 7750 if (elf_section_data (o)->relocs != sec_relocs)
b49e97c9
TS
7751 free (sec_relocs);
7752
7753 if (r < rend)
7754 break;
7755 }
7756
7757 if (o == NULL)
7758 {
7759 /* There is no non-call reloc for this stub, so we do
7760 not need it. Since this function is called before
7761 the linker maps input sections to output sections, we
7762 can easily discard it by setting the SEC_EXCLUDE
7763 flag. */
7764 sec->flags |= SEC_EXCLUDE;
b34976b6 7765 return TRUE;
b49e97c9
TS
7766 }
7767
7768 /* Record this stub in an array of local symbol stubs for
7769 this BFD. */
698600e4 7770 if (mips_elf_tdata (abfd)->local_stubs == NULL)
b49e97c9
TS
7771 {
7772 unsigned long symcount;
7773 asection **n;
7774 bfd_size_type amt;
7775
7776 if (elf_bad_symtab (abfd))
7777 symcount = NUM_SHDR_ENTRIES (symtab_hdr);
7778 else
7779 symcount = symtab_hdr->sh_info;
7780 amt = symcount * sizeof (asection *);
9719ad41 7781 n = bfd_zalloc (abfd, amt);
b49e97c9 7782 if (n == NULL)
b34976b6 7783 return FALSE;
698600e4 7784 mips_elf_tdata (abfd)->local_stubs = n;
b49e97c9
TS
7785 }
7786
b9d58d71 7787 sec->flags |= SEC_KEEP;
698600e4 7788 mips_elf_tdata (abfd)->local_stubs[r_symndx] = sec;
b49e97c9
TS
7789
7790 /* We don't need to set mips16_stubs_seen in this case.
7791 That flag is used to see whether we need to look through
7792 the global symbol table for stubs. We don't need to set
7793 it here, because we just have a local stub. */
7794 }
7795 else
7796 {
7797 struct mips_elf_link_hash_entry *h;
7798
7799 h = ((struct mips_elf_link_hash_entry *)
7800 sym_hashes[r_symndx - extsymoff]);
7801
973a3492
L
7802 while (h->root.root.type == bfd_link_hash_indirect
7803 || h->root.root.type == bfd_link_hash_warning)
7804 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
7805
b49e97c9
TS
7806 /* H is the symbol this stub is for. */
7807
b9d58d71
TS
7808 /* If we already have an appropriate stub for this function, we
7809 don't need another one, so we can discard this one. Since
7810 this function is called before the linker maps input sections
7811 to output sections, we can easily discard it by setting the
7812 SEC_EXCLUDE flag. */
7813 if (h->fn_stub != NULL)
7814 {
7815 sec->flags |= SEC_EXCLUDE;
7816 return TRUE;
7817 }
7818
7819 sec->flags |= SEC_KEEP;
b49e97c9 7820 h->fn_stub = sec;
b34976b6 7821 mips_elf_hash_table (info)->mips16_stubs_seen = TRUE;
b49e97c9
TS
7822 }
7823 }
b9d58d71 7824 else if (CALL_STUB_P (name) || CALL_FP_STUB_P (name))
b49e97c9
TS
7825 {
7826 unsigned long r_symndx;
7827 struct mips_elf_link_hash_entry *h;
7828 asection **loc;
7829
7830 /* Look at the relocation information to figure out which symbol
7831 this is for. */
7832
cb4437b8 7833 r_symndx = mips16_stub_symndx (bed, sec, relocs, rel_end);
738e5348
RS
7834 if (r_symndx == 0)
7835 {
7836 (*_bfd_error_handler)
7837 (_("%B: Warning: cannot determine the target function for"
7838 " stub section `%s'"),
7839 abfd, name);
7840 bfd_set_error (bfd_error_bad_value);
7841 return FALSE;
7842 }
b49e97c9
TS
7843
7844 if (r_symndx < extsymoff
7845 || sym_hashes[r_symndx - extsymoff] == NULL)
7846 {
b9d58d71 7847 asection *o;
b49e97c9 7848
b9d58d71
TS
7849 /* This stub is for a local symbol. This stub will only be
7850 needed if there is some relocation (R_MIPS16_26) in this BFD
7851 that refers to this symbol. */
7852 for (o = abfd->sections; o != NULL; o = o->next)
7853 {
7854 Elf_Internal_Rela *sec_relocs;
7855 const Elf_Internal_Rela *r, *rend;
7856
7857 /* We can ignore stub sections when looking for relocs. */
7858 if ((o->flags & SEC_RELOC) == 0
7859 || o->reloc_count == 0
738e5348 7860 || section_allows_mips16_refs_p (o))
b9d58d71
TS
7861 continue;
7862
7863 sec_relocs
7864 = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
7865 info->keep_memory);
7866 if (sec_relocs == NULL)
7867 return FALSE;
7868
7869 rend = sec_relocs + o->reloc_count;
7870 for (r = sec_relocs; r < rend; r++)
7871 if (ELF_R_SYM (abfd, r->r_info) == r_symndx
7872 && ELF_R_TYPE (abfd, r->r_info) == R_MIPS16_26)
7873 break;
7874
7875 if (elf_section_data (o)->relocs != sec_relocs)
7876 free (sec_relocs);
7877
7878 if (r < rend)
7879 break;
7880 }
7881
7882 if (o == NULL)
7883 {
7884 /* There is no non-call reloc for this stub, so we do
7885 not need it. Since this function is called before
7886 the linker maps input sections to output sections, we
7887 can easily discard it by setting the SEC_EXCLUDE
7888 flag. */
7889 sec->flags |= SEC_EXCLUDE;
7890 return TRUE;
7891 }
7892
7893 /* Record this stub in an array of local symbol call_stubs for
7894 this BFD. */
698600e4 7895 if (mips_elf_tdata (abfd)->local_call_stubs == NULL)
b9d58d71
TS
7896 {
7897 unsigned long symcount;
7898 asection **n;
7899 bfd_size_type amt;
7900
7901 if (elf_bad_symtab (abfd))
7902 symcount = NUM_SHDR_ENTRIES (symtab_hdr);
7903 else
7904 symcount = symtab_hdr->sh_info;
7905 amt = symcount * sizeof (asection *);
7906 n = bfd_zalloc (abfd, amt);
7907 if (n == NULL)
7908 return FALSE;
698600e4 7909 mips_elf_tdata (abfd)->local_call_stubs = n;
b9d58d71 7910 }
b49e97c9 7911
b9d58d71 7912 sec->flags |= SEC_KEEP;
698600e4 7913 mips_elf_tdata (abfd)->local_call_stubs[r_symndx] = sec;
b49e97c9 7914
b9d58d71
TS
7915 /* We don't need to set mips16_stubs_seen in this case.
7916 That flag is used to see whether we need to look through
7917 the global symbol table for stubs. We don't need to set
7918 it here, because we just have a local stub. */
7919 }
b49e97c9 7920 else
b49e97c9 7921 {
b9d58d71
TS
7922 h = ((struct mips_elf_link_hash_entry *)
7923 sym_hashes[r_symndx - extsymoff]);
68ffbac6 7924
b9d58d71 7925 /* H is the symbol this stub is for. */
68ffbac6 7926
b9d58d71
TS
7927 if (CALL_FP_STUB_P (name))
7928 loc = &h->call_fp_stub;
7929 else
7930 loc = &h->call_stub;
68ffbac6 7931
b9d58d71
TS
7932 /* If we already have an appropriate stub for this function, we
7933 don't need another one, so we can discard this one. Since
7934 this function is called before the linker maps input sections
7935 to output sections, we can easily discard it by setting the
7936 SEC_EXCLUDE flag. */
7937 if (*loc != NULL)
7938 {
7939 sec->flags |= SEC_EXCLUDE;
7940 return TRUE;
7941 }
b49e97c9 7942
b9d58d71
TS
7943 sec->flags |= SEC_KEEP;
7944 *loc = sec;
7945 mips_elf_hash_table (info)->mips16_stubs_seen = TRUE;
7946 }
b49e97c9
TS
7947 }
7948
b49e97c9 7949 sreloc = NULL;
c224138d 7950 contents = NULL;
b49e97c9
TS
7951 for (rel = relocs; rel < rel_end; ++rel)
7952 {
7953 unsigned long r_symndx;
7954 unsigned int r_type;
7955 struct elf_link_hash_entry *h;
861fb55a 7956 bfd_boolean can_make_dynamic_p;
b49e97c9
TS
7957
7958 r_symndx = ELF_R_SYM (abfd, rel->r_info);
7959 r_type = ELF_R_TYPE (abfd, rel->r_info);
7960
7961 if (r_symndx < extsymoff)
7962 h = NULL;
7963 else if (r_symndx >= extsymoff + NUM_SHDR_ENTRIES (symtab_hdr))
7964 {
7965 (*_bfd_error_handler)
d003868e
AM
7966 (_("%B: Malformed reloc detected for section %s"),
7967 abfd, name);
b49e97c9 7968 bfd_set_error (bfd_error_bad_value);
b34976b6 7969 return FALSE;
b49e97c9
TS
7970 }
7971 else
7972 {
7973 h = sym_hashes[r_symndx - extsymoff];
81fbe831
AM
7974 if (h != NULL)
7975 {
7976 while (h->root.type == bfd_link_hash_indirect
7977 || h->root.type == bfd_link_hash_warning)
7978 h = (struct elf_link_hash_entry *) h->root.u.i.link;
7979
7980 /* PR15323, ref flags aren't set for references in the
7981 same object. */
7982 h->root.non_ir_ref = 1;
7983 }
861fb55a 7984 }
b49e97c9 7985
861fb55a
DJ
7986 /* Set CAN_MAKE_DYNAMIC_P to true if we can convert this
7987 relocation into a dynamic one. */
7988 can_make_dynamic_p = FALSE;
7989 switch (r_type)
7990 {
861fb55a
DJ
7991 case R_MIPS_GOT16:
7992 case R_MIPS_CALL16:
7993 case R_MIPS_CALL_HI16:
7994 case R_MIPS_CALL_LO16:
7995 case R_MIPS_GOT_HI16:
7996 case R_MIPS_GOT_LO16:
7997 case R_MIPS_GOT_PAGE:
7998 case R_MIPS_GOT_OFST:
7999 case R_MIPS_GOT_DISP:
8000 case R_MIPS_TLS_GOTTPREL:
8001 case R_MIPS_TLS_GD:
8002 case R_MIPS_TLS_LDM:
d0f13682
CLT
8003 case R_MIPS16_GOT16:
8004 case R_MIPS16_CALL16:
8005 case R_MIPS16_TLS_GOTTPREL:
8006 case R_MIPS16_TLS_GD:
8007 case R_MIPS16_TLS_LDM:
df58fc94
RS
8008 case R_MICROMIPS_GOT16:
8009 case R_MICROMIPS_CALL16:
8010 case R_MICROMIPS_CALL_HI16:
8011 case R_MICROMIPS_CALL_LO16:
8012 case R_MICROMIPS_GOT_HI16:
8013 case R_MICROMIPS_GOT_LO16:
8014 case R_MICROMIPS_GOT_PAGE:
8015 case R_MICROMIPS_GOT_OFST:
8016 case R_MICROMIPS_GOT_DISP:
8017 case R_MICROMIPS_TLS_GOTTPREL:
8018 case R_MICROMIPS_TLS_GD:
8019 case R_MICROMIPS_TLS_LDM:
861fb55a
DJ
8020 if (dynobj == NULL)
8021 elf_hash_table (info)->dynobj = dynobj = abfd;
8022 if (!mips_elf_create_got_section (dynobj, info))
8023 return FALSE;
8024 if (htab->is_vxworks && !info->shared)
b49e97c9 8025 {
861fb55a
DJ
8026 (*_bfd_error_handler)
8027 (_("%B: GOT reloc at 0x%lx not expected in executables"),
8028 abfd, (unsigned long) rel->r_offset);
8029 bfd_set_error (bfd_error_bad_value);
8030 return FALSE;
b49e97c9 8031 }
861fb55a 8032 break;
b49e97c9 8033
99da6b5f
AN
8034 /* This is just a hint; it can safely be ignored. Don't set
8035 has_static_relocs for the corresponding symbol. */
8036 case R_MIPS_JALR:
df58fc94 8037 case R_MICROMIPS_JALR:
99da6b5f
AN
8038 break;
8039
861fb55a
DJ
8040 case R_MIPS_32:
8041 case R_MIPS_REL32:
8042 case R_MIPS_64:
8043 /* In VxWorks executables, references to external symbols
8044 must be handled using copy relocs or PLT entries; it is not
8045 possible to convert this relocation into a dynamic one.
8046
8047 For executables that use PLTs and copy-relocs, we have a
8048 choice between converting the relocation into a dynamic
8049 one or using copy relocations or PLT entries. It is
8050 usually better to do the former, unless the relocation is
8051 against a read-only section. */
8052 if ((info->shared
8053 || (h != NULL
8054 && !htab->is_vxworks
8055 && strcmp (h->root.root.string, "__gnu_local_gp") != 0
8056 && !(!info->nocopyreloc
8057 && !PIC_OBJECT_P (abfd)
8058 && MIPS_ELF_READONLY_SECTION (sec))))
8059 && (sec->flags & SEC_ALLOC) != 0)
b49e97c9 8060 {
861fb55a 8061 can_make_dynamic_p = TRUE;
b49e97c9
TS
8062 if (dynobj == NULL)
8063 elf_hash_table (info)->dynobj = dynobj = abfd;
b49e97c9 8064 break;
861fb55a 8065 }
21d790b9
MR
8066 /* For sections that are not SEC_ALLOC a copy reloc would be
8067 output if possible (implying questionable semantics for
8068 read-only data objects) or otherwise the final link would
8069 fail as ld.so will not process them and could not therefore
8070 handle any outstanding dynamic relocations.
8071
8072 For such sections that are also SEC_DEBUGGING, we can avoid
8073 these problems by simply ignoring any relocs as these
8074 sections have a predefined use and we know it is safe to do
8075 so.
8076
8077 This is needed in cases such as a global symbol definition
8078 in a shared library causing a common symbol from an object
8079 file to be converted to an undefined reference. If that
8080 happens, then all the relocations against this symbol from
8081 SEC_DEBUGGING sections in the object file will resolve to
8082 nil. */
8083 if ((sec->flags & SEC_DEBUGGING) != 0)
8084 break;
861fb55a 8085 /* Fall through. */
b49e97c9 8086
861fb55a
DJ
8087 default:
8088 /* Most static relocations require pointer equality, except
8089 for branches. */
8090 if (h)
8091 h->pointer_equality_needed = TRUE;
8092 /* Fall through. */
b49e97c9 8093
861fb55a
DJ
8094 case R_MIPS_26:
8095 case R_MIPS_PC16:
8096 case R_MIPS16_26:
df58fc94
RS
8097 case R_MICROMIPS_26_S1:
8098 case R_MICROMIPS_PC7_S1:
8099 case R_MICROMIPS_PC10_S1:
8100 case R_MICROMIPS_PC16_S1:
8101 case R_MICROMIPS_PC23_S2:
861fb55a
DJ
8102 if (h)
8103 ((struct mips_elf_link_hash_entry *) h)->has_static_relocs = TRUE;
8104 break;
b49e97c9
TS
8105 }
8106
0a44bf69
RS
8107 if (h)
8108 {
0a44bf69
RS
8109 /* Relocations against the special VxWorks __GOTT_BASE__ and
8110 __GOTT_INDEX__ symbols must be left to the loader. Allocate
8111 room for them in .rela.dyn. */
8112 if (is_gott_symbol (info, h))
8113 {
8114 if (sreloc == NULL)
8115 {
8116 sreloc = mips_elf_rel_dyn_section (info, TRUE);
8117 if (sreloc == NULL)
8118 return FALSE;
8119 }
8120 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
9e3313ae
RS
8121 if (MIPS_ELF_READONLY_SECTION (sec))
8122 /* We tell the dynamic linker that there are
8123 relocations against the text segment. */
8124 info->flags |= DF_TEXTREL;
0a44bf69
RS
8125 }
8126 }
df58fc94
RS
8127 else if (call_lo16_reloc_p (r_type)
8128 || got_lo16_reloc_p (r_type)
8129 || got_disp_reloc_p (r_type)
738e5348 8130 || (got16_reloc_p (r_type) && htab->is_vxworks))
b49e97c9
TS
8131 {
8132 /* We may need a local GOT entry for this relocation. We
8133 don't count R_MIPS_GOT_PAGE because we can estimate the
8134 maximum number of pages needed by looking at the size of
738e5348
RS
8135 the segment. Similar comments apply to R_MIPS*_GOT16 and
8136 R_MIPS*_CALL16, except on VxWorks, where GOT relocations
0a44bf69 8137 always evaluate to "G". We don't count R_MIPS_GOT_HI16, or
b49e97c9 8138 R_MIPS_CALL_HI16 because these are always followed by an
b15e6682 8139 R_MIPS_GOT_LO16 or R_MIPS_CALL_LO16. */
a8028dd0 8140 if (!mips_elf_record_local_got_symbol (abfd, r_symndx,
e641e783 8141 rel->r_addend, info, r_type))
f4416af6 8142 return FALSE;
b49e97c9
TS
8143 }
8144
8f0c309a
CLT
8145 if (h != NULL
8146 && mips_elf_relocation_needs_la25_stub (abfd, r_type,
8147 ELF_ST_IS_MIPS16 (h->other)))
861fb55a
DJ
8148 ((struct mips_elf_link_hash_entry *) h)->has_nonpic_branches = TRUE;
8149
b49e97c9
TS
8150 switch (r_type)
8151 {
8152 case R_MIPS_CALL16:
738e5348 8153 case R_MIPS16_CALL16:
df58fc94 8154 case R_MICROMIPS_CALL16:
b49e97c9
TS
8155 if (h == NULL)
8156 {
8157 (*_bfd_error_handler)
d003868e
AM
8158 (_("%B: CALL16 reloc at 0x%lx not against global symbol"),
8159 abfd, (unsigned long) rel->r_offset);
b49e97c9 8160 bfd_set_error (bfd_error_bad_value);
b34976b6 8161 return FALSE;
b49e97c9
TS
8162 }
8163 /* Fall through. */
8164
8165 case R_MIPS_CALL_HI16:
8166 case R_MIPS_CALL_LO16:
df58fc94
RS
8167 case R_MICROMIPS_CALL_HI16:
8168 case R_MICROMIPS_CALL_LO16:
b49e97c9
TS
8169 if (h != NULL)
8170 {
6ccf4795
RS
8171 /* Make sure there is room in the regular GOT to hold the
8172 function's address. We may eliminate it in favour of
8173 a .got.plt entry later; see mips_elf_count_got_symbols. */
e641e783
RS
8174 if (!mips_elf_record_global_got_symbol (h, abfd, info, TRUE,
8175 r_type))
b34976b6 8176 return FALSE;
b49e97c9
TS
8177
8178 /* We need a stub, not a plt entry for the undefined
8179 function. But we record it as if it needs plt. See
c152c796 8180 _bfd_elf_adjust_dynamic_symbol. */
f5385ebf 8181 h->needs_plt = 1;
b49e97c9
TS
8182 h->type = STT_FUNC;
8183 }
8184 break;
8185
0fdc1bf1 8186 case R_MIPS_GOT_PAGE:
df58fc94 8187 case R_MICROMIPS_GOT_PAGE:
738e5348 8188 case R_MIPS16_GOT16:
b49e97c9
TS
8189 case R_MIPS_GOT16:
8190 case R_MIPS_GOT_HI16:
8191 case R_MIPS_GOT_LO16:
df58fc94
RS
8192 case R_MICROMIPS_GOT16:
8193 case R_MICROMIPS_GOT_HI16:
8194 case R_MICROMIPS_GOT_LO16:
8195 if (!h || got_page_reloc_p (r_type))
c224138d 8196 {
3a3b6725
DJ
8197 /* This relocation needs (or may need, if h != NULL) a
8198 page entry in the GOT. For R_MIPS_GOT_PAGE we do not
8199 know for sure until we know whether the symbol is
8200 preemptible. */
c224138d
RS
8201 if (mips_elf_rel_relocation_p (abfd, sec, relocs, rel))
8202 {
8203 if (!mips_elf_get_section_contents (abfd, sec, &contents))
8204 return FALSE;
8205 howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, FALSE);
8206 addend = mips_elf_read_rel_addend (abfd, rel,
8207 howto, contents);
9684f078 8208 if (got16_reloc_p (r_type))
c224138d
RS
8209 mips_elf_add_lo16_rel_addend (abfd, rel, rel_end,
8210 contents, &addend);
8211 else
8212 addend <<= howto->rightshift;
8213 }
8214 else
8215 addend = rel->r_addend;
13db6b44
RS
8216 if (!mips_elf_record_got_page_ref (info, abfd, r_symndx,
8217 h, addend))
c224138d 8218 return FALSE;
13db6b44
RS
8219
8220 if (h)
8221 {
8222 struct mips_elf_link_hash_entry *hmips =
8223 (struct mips_elf_link_hash_entry *) h;
8224
8225 /* This symbol is definitely not overridable. */
8226 if (hmips->root.def_regular
8227 && ! (info->shared && ! info->symbolic
8228 && ! hmips->root.forced_local))
8229 h = NULL;
8230 }
c224138d 8231 }
13db6b44
RS
8232 /* If this is a global, overridable symbol, GOT_PAGE will
8233 decay to GOT_DISP, so we'll need a GOT entry for it. */
c224138d
RS
8234 /* Fall through. */
8235
b49e97c9 8236 case R_MIPS_GOT_DISP:
df58fc94 8237 case R_MICROMIPS_GOT_DISP:
6ccf4795 8238 if (h && !mips_elf_record_global_got_symbol (h, abfd, info,
e641e783 8239 FALSE, r_type))
b34976b6 8240 return FALSE;
b49e97c9
TS
8241 break;
8242
0f20cc35 8243 case R_MIPS_TLS_GOTTPREL:
d0f13682 8244 case R_MIPS16_TLS_GOTTPREL:
df58fc94 8245 case R_MICROMIPS_TLS_GOTTPREL:
0f20cc35
DJ
8246 if (info->shared)
8247 info->flags |= DF_STATIC_TLS;
8248 /* Fall through */
8249
8250 case R_MIPS_TLS_LDM:
d0f13682 8251 case R_MIPS16_TLS_LDM:
df58fc94
RS
8252 case R_MICROMIPS_TLS_LDM:
8253 if (tls_ldm_reloc_p (r_type))
0f20cc35 8254 {
cf35638d 8255 r_symndx = STN_UNDEF;
0f20cc35
DJ
8256 h = NULL;
8257 }
8258 /* Fall through */
8259
8260 case R_MIPS_TLS_GD:
d0f13682 8261 case R_MIPS16_TLS_GD:
df58fc94 8262 case R_MICROMIPS_TLS_GD:
0f20cc35
DJ
8263 /* This symbol requires a global offset table entry, or two
8264 for TLS GD relocations. */
e641e783
RS
8265 if (h != NULL)
8266 {
8267 if (!mips_elf_record_global_got_symbol (h, abfd, info,
8268 FALSE, r_type))
8269 return FALSE;
8270 }
8271 else
8272 {
8273 if (!mips_elf_record_local_got_symbol (abfd, r_symndx,
8274 rel->r_addend,
8275 info, r_type))
8276 return FALSE;
8277 }
0f20cc35
DJ
8278 break;
8279
b49e97c9
TS
8280 case R_MIPS_32:
8281 case R_MIPS_REL32:
8282 case R_MIPS_64:
0a44bf69
RS
8283 /* In VxWorks executables, references to external symbols
8284 are handled using copy relocs or PLT stubs, so there's
8285 no need to add a .rela.dyn entry for this relocation. */
861fb55a 8286 if (can_make_dynamic_p)
b49e97c9
TS
8287 {
8288 if (sreloc == NULL)
8289 {
0a44bf69 8290 sreloc = mips_elf_rel_dyn_section (info, TRUE);
b49e97c9 8291 if (sreloc == NULL)
f4416af6 8292 return FALSE;
b49e97c9 8293 }
9a59ad6b 8294 if (info->shared && h == NULL)
82f0cfbd
EC
8295 {
8296 /* When creating a shared object, we must copy these
8297 reloc types into the output file as R_MIPS_REL32
0a44bf69
RS
8298 relocs. Make room for this reloc in .rel(a).dyn. */
8299 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
943284cc 8300 if (MIPS_ELF_READONLY_SECTION (sec))
82f0cfbd
EC
8301 /* We tell the dynamic linker that there are
8302 relocations against the text segment. */
8303 info->flags |= DF_TEXTREL;
8304 }
b49e97c9
TS
8305 else
8306 {
8307 struct mips_elf_link_hash_entry *hmips;
82f0cfbd 8308
9a59ad6b
DJ
8309 /* For a shared object, we must copy this relocation
8310 unless the symbol turns out to be undefined and
8311 weak with non-default visibility, in which case
8312 it will be left as zero.
8313
8314 We could elide R_MIPS_REL32 for locally binding symbols
8315 in shared libraries, but do not yet do so.
8316
8317 For an executable, we only need to copy this
8318 reloc if the symbol is defined in a dynamic
8319 object. */
b49e97c9
TS
8320 hmips = (struct mips_elf_link_hash_entry *) h;
8321 ++hmips->possibly_dynamic_relocs;
943284cc 8322 if (MIPS_ELF_READONLY_SECTION (sec))
82f0cfbd
EC
8323 /* We need it to tell the dynamic linker if there
8324 are relocations against the text segment. */
8325 hmips->readonly_reloc = TRUE;
b49e97c9 8326 }
b49e97c9
TS
8327 }
8328
8329 if (SGI_COMPAT (abfd))
8330 mips_elf_hash_table (info)->compact_rel_size +=
8331 sizeof (Elf32_External_crinfo);
8332 break;
8333
8334 case R_MIPS_26:
8335 case R_MIPS_GPREL16:
8336 case R_MIPS_LITERAL:
8337 case R_MIPS_GPREL32:
df58fc94
RS
8338 case R_MICROMIPS_26_S1:
8339 case R_MICROMIPS_GPREL16:
8340 case R_MICROMIPS_LITERAL:
8341 case R_MICROMIPS_GPREL7_S2:
b49e97c9
TS
8342 if (SGI_COMPAT (abfd))
8343 mips_elf_hash_table (info)->compact_rel_size +=
8344 sizeof (Elf32_External_crinfo);
8345 break;
8346
8347 /* This relocation describes the C++ object vtable hierarchy.
8348 Reconstruct it for later use during GC. */
8349 case R_MIPS_GNU_VTINHERIT:
c152c796 8350 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 8351 return FALSE;
b49e97c9
TS
8352 break;
8353
8354 /* This relocation describes which C++ vtable entries are actually
8355 used. Record for later use during GC. */
8356 case R_MIPS_GNU_VTENTRY:
d17e0c6e
JB
8357 BFD_ASSERT (h != NULL);
8358 if (h != NULL
8359 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
b34976b6 8360 return FALSE;
b49e97c9
TS
8361 break;
8362
8363 default:
8364 break;
8365 }
8366
1bbce132
MR
8367 /* Record the need for a PLT entry. At this point we don't know
8368 yet if we are going to create a PLT in the first place, but
8369 we only record whether the relocation requires a standard MIPS
8370 or a compressed code entry anyway. If we don't make a PLT after
8371 all, then we'll just ignore these arrangements. Likewise if
8372 a PLT entry is not created because the symbol is satisfied
8373 locally. */
8374 if (h != NULL
8375 && jal_reloc_p (r_type)
8376 && !SYMBOL_CALLS_LOCAL (info, h))
8377 {
8378 if (h->plt.plist == NULL)
8379 h->plt.plist = mips_elf_make_plt_record (abfd);
8380 if (h->plt.plist == NULL)
8381 return FALSE;
8382
8383 if (r_type == R_MIPS_26)
8384 h->plt.plist->need_mips = TRUE;
8385 else
8386 h->plt.plist->need_comp = TRUE;
8387 }
8388
b49e97c9 8389 /* We must not create a stub for a symbol that has relocations
0a44bf69
RS
8390 related to taking the function's address. This doesn't apply to
8391 VxWorks, where CALL relocs refer to a .got.plt entry instead of
8392 a normal .got entry. */
8393 if (!htab->is_vxworks && h != NULL)
8394 switch (r_type)
8395 {
8396 default:
8397 ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = TRUE;
8398 break;
738e5348 8399 case R_MIPS16_CALL16:
0a44bf69
RS
8400 case R_MIPS_CALL16:
8401 case R_MIPS_CALL_HI16:
8402 case R_MIPS_CALL_LO16:
8403 case R_MIPS_JALR:
df58fc94
RS
8404 case R_MICROMIPS_CALL16:
8405 case R_MICROMIPS_CALL_HI16:
8406 case R_MICROMIPS_CALL_LO16:
8407 case R_MICROMIPS_JALR:
0a44bf69
RS
8408 break;
8409 }
b49e97c9 8410
738e5348
RS
8411 /* See if this reloc would need to refer to a MIPS16 hard-float stub,
8412 if there is one. We only need to handle global symbols here;
8413 we decide whether to keep or delete stubs for local symbols
8414 when processing the stub's relocations. */
b49e97c9 8415 if (h != NULL
738e5348
RS
8416 && !mips16_call_reloc_p (r_type)
8417 && !section_allows_mips16_refs_p (sec))
b49e97c9
TS
8418 {
8419 struct mips_elf_link_hash_entry *mh;
8420
8421 mh = (struct mips_elf_link_hash_entry *) h;
b34976b6 8422 mh->need_fn_stub = TRUE;
b49e97c9 8423 }
861fb55a
DJ
8424
8425 /* Refuse some position-dependent relocations when creating a
8426 shared library. Do not refuse R_MIPS_32 / R_MIPS_64; they're
8427 not PIC, but we can create dynamic relocations and the result
8428 will be fine. Also do not refuse R_MIPS_LO16, which can be
8429 combined with R_MIPS_GOT16. */
8430 if (info->shared)
8431 {
8432 switch (r_type)
8433 {
8434 case R_MIPS16_HI16:
8435 case R_MIPS_HI16:
8436 case R_MIPS_HIGHER:
8437 case R_MIPS_HIGHEST:
df58fc94
RS
8438 case R_MICROMIPS_HI16:
8439 case R_MICROMIPS_HIGHER:
8440 case R_MICROMIPS_HIGHEST:
861fb55a
DJ
8441 /* Don't refuse a high part relocation if it's against
8442 no symbol (e.g. part of a compound relocation). */
cf35638d 8443 if (r_symndx == STN_UNDEF)
861fb55a
DJ
8444 break;
8445
8446 /* R_MIPS_HI16 against _gp_disp is used for $gp setup,
8447 and has a special meaning. */
8448 if (!NEWABI_P (abfd) && h != NULL
8449 && strcmp (h->root.root.string, "_gp_disp") == 0)
8450 break;
8451
0fc1eb3c
RS
8452 /* Likewise __GOTT_BASE__ and __GOTT_INDEX__ on VxWorks. */
8453 if (is_gott_symbol (info, h))
8454 break;
8455
861fb55a
DJ
8456 /* FALLTHROUGH */
8457
8458 case R_MIPS16_26:
8459 case R_MIPS_26:
df58fc94 8460 case R_MICROMIPS_26_S1:
861fb55a
DJ
8461 howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, FALSE);
8462 (*_bfd_error_handler)
8463 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
8464 abfd, howto->name,
8465 (h) ? h->root.root.string : "a local symbol");
8466 bfd_set_error (bfd_error_bad_value);
8467 return FALSE;
8468 default:
8469 break;
8470 }
8471 }
b49e97c9
TS
8472 }
8473
b34976b6 8474 return TRUE;
b49e97c9
TS
8475}
8476\f
d0647110 8477bfd_boolean
9719ad41
RS
8478_bfd_mips_relax_section (bfd *abfd, asection *sec,
8479 struct bfd_link_info *link_info,
8480 bfd_boolean *again)
d0647110
AO
8481{
8482 Elf_Internal_Rela *internal_relocs;
8483 Elf_Internal_Rela *irel, *irelend;
8484 Elf_Internal_Shdr *symtab_hdr;
8485 bfd_byte *contents = NULL;
d0647110
AO
8486 size_t extsymoff;
8487 bfd_boolean changed_contents = FALSE;
8488 bfd_vma sec_start = sec->output_section->vma + sec->output_offset;
8489 Elf_Internal_Sym *isymbuf = NULL;
8490
8491 /* We are not currently changing any sizes, so only one pass. */
8492 *again = FALSE;
8493
1049f94e 8494 if (link_info->relocatable)
d0647110
AO
8495 return TRUE;
8496
9719ad41 8497 internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
45d6a902 8498 link_info->keep_memory);
d0647110
AO
8499 if (internal_relocs == NULL)
8500 return TRUE;
8501
8502 irelend = internal_relocs + sec->reloc_count
8503 * get_elf_backend_data (abfd)->s->int_rels_per_ext_rel;
8504 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
8505 extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
8506
8507 for (irel = internal_relocs; irel < irelend; irel++)
8508 {
8509 bfd_vma symval;
8510 bfd_signed_vma sym_offset;
8511 unsigned int r_type;
8512 unsigned long r_symndx;
8513 asection *sym_sec;
8514 unsigned long instruction;
8515
8516 /* Turn jalr into bgezal, and jr into beq, if they're marked
8517 with a JALR relocation, that indicate where they jump to.
8518 This saves some pipeline bubbles. */
8519 r_type = ELF_R_TYPE (abfd, irel->r_info);
8520 if (r_type != R_MIPS_JALR)
8521 continue;
8522
8523 r_symndx = ELF_R_SYM (abfd, irel->r_info);
8524 /* Compute the address of the jump target. */
8525 if (r_symndx >= extsymoff)
8526 {
8527 struct mips_elf_link_hash_entry *h
8528 = ((struct mips_elf_link_hash_entry *)
8529 elf_sym_hashes (abfd) [r_symndx - extsymoff]);
8530
8531 while (h->root.root.type == bfd_link_hash_indirect
8532 || h->root.root.type == bfd_link_hash_warning)
8533 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
143d77c5 8534
d0647110
AO
8535 /* If a symbol is undefined, or if it may be overridden,
8536 skip it. */
8537 if (! ((h->root.root.type == bfd_link_hash_defined
8538 || h->root.root.type == bfd_link_hash_defweak)
8539 && h->root.root.u.def.section)
8540 || (link_info->shared && ! link_info->symbolic
f5385ebf 8541 && !h->root.forced_local))
d0647110
AO
8542 continue;
8543
8544 sym_sec = h->root.root.u.def.section;
8545 if (sym_sec->output_section)
8546 symval = (h->root.root.u.def.value
8547 + sym_sec->output_section->vma
8548 + sym_sec->output_offset);
8549 else
8550 symval = h->root.root.u.def.value;
8551 }
8552 else
8553 {
8554 Elf_Internal_Sym *isym;
8555
8556 /* Read this BFD's symbols if we haven't done so already. */
8557 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
8558 {
8559 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
8560 if (isymbuf == NULL)
8561 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
8562 symtab_hdr->sh_info, 0,
8563 NULL, NULL, NULL);
8564 if (isymbuf == NULL)
8565 goto relax_return;
8566 }
8567
8568 isym = isymbuf + r_symndx;
8569 if (isym->st_shndx == SHN_UNDEF)
8570 continue;
8571 else if (isym->st_shndx == SHN_ABS)
8572 sym_sec = bfd_abs_section_ptr;
8573 else if (isym->st_shndx == SHN_COMMON)
8574 sym_sec = bfd_com_section_ptr;
8575 else
8576 sym_sec
8577 = bfd_section_from_elf_index (abfd, isym->st_shndx);
8578 symval = isym->st_value
8579 + sym_sec->output_section->vma
8580 + sym_sec->output_offset;
8581 }
8582
8583 /* Compute branch offset, from delay slot of the jump to the
8584 branch target. */
8585 sym_offset = (symval + irel->r_addend)
8586 - (sec_start + irel->r_offset + 4);
8587
8588 /* Branch offset must be properly aligned. */
8589 if ((sym_offset & 3) != 0)
8590 continue;
8591
8592 sym_offset >>= 2;
8593
8594 /* Check that it's in range. */
8595 if (sym_offset < -0x8000 || sym_offset >= 0x8000)
8596 continue;
143d77c5 8597
d0647110 8598 /* Get the section contents if we haven't done so already. */
c224138d
RS
8599 if (!mips_elf_get_section_contents (abfd, sec, &contents))
8600 goto relax_return;
d0647110
AO
8601
8602 instruction = bfd_get_32 (abfd, contents + irel->r_offset);
8603
8604 /* If it was jalr <reg>, turn it into bgezal $zero, <target>. */
8605 if ((instruction & 0xfc1fffff) == 0x0000f809)
8606 instruction = 0x04110000;
8607 /* If it was jr <reg>, turn it into b <target>. */
8608 else if ((instruction & 0xfc1fffff) == 0x00000008)
8609 instruction = 0x10000000;
8610 else
8611 continue;
8612
8613 instruction |= (sym_offset & 0xffff);
8614 bfd_put_32 (abfd, instruction, contents + irel->r_offset);
8615 changed_contents = TRUE;
8616 }
8617
8618 if (contents != NULL
8619 && elf_section_data (sec)->this_hdr.contents != contents)
8620 {
8621 if (!changed_contents && !link_info->keep_memory)
8622 free (contents);
8623 else
8624 {
8625 /* Cache the section contents for elf_link_input_bfd. */
8626 elf_section_data (sec)->this_hdr.contents = contents;
8627 }
8628 }
8629 return TRUE;
8630
143d77c5 8631 relax_return:
eea6121a
AM
8632 if (contents != NULL
8633 && elf_section_data (sec)->this_hdr.contents != contents)
8634 free (contents);
d0647110
AO
8635 return FALSE;
8636}
8637\f
9a59ad6b
DJ
8638/* Allocate space for global sym dynamic relocs. */
8639
8640static bfd_boolean
8641allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
8642{
8643 struct bfd_link_info *info = inf;
8644 bfd *dynobj;
8645 struct mips_elf_link_hash_entry *hmips;
8646 struct mips_elf_link_hash_table *htab;
8647
8648 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
8649 BFD_ASSERT (htab != NULL);
8650
9a59ad6b
DJ
8651 dynobj = elf_hash_table (info)->dynobj;
8652 hmips = (struct mips_elf_link_hash_entry *) h;
8653
8654 /* VxWorks executables are handled elsewhere; we only need to
8655 allocate relocations in shared objects. */
8656 if (htab->is_vxworks && !info->shared)
8657 return TRUE;
8658
7686d77d
AM
8659 /* Ignore indirect symbols. All relocations against such symbols
8660 will be redirected to the target symbol. */
8661 if (h->root.type == bfd_link_hash_indirect)
63897e2c
RS
8662 return TRUE;
8663
9a59ad6b
DJ
8664 /* If this symbol is defined in a dynamic object, or we are creating
8665 a shared library, we will need to copy any R_MIPS_32 or
8666 R_MIPS_REL32 relocs against it into the output file. */
8667 if (! info->relocatable
8668 && hmips->possibly_dynamic_relocs != 0
8669 && (h->root.type == bfd_link_hash_defweak
625ef6dc 8670 || (!h->def_regular && !ELF_COMMON_DEF_P (h))
9a59ad6b
DJ
8671 || info->shared))
8672 {
8673 bfd_boolean do_copy = TRUE;
8674
8675 if (h->root.type == bfd_link_hash_undefweak)
8676 {
8677 /* Do not copy relocations for undefined weak symbols with
8678 non-default visibility. */
8679 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
8680 do_copy = FALSE;
8681
8682 /* Make sure undefined weak symbols are output as a dynamic
8683 symbol in PIEs. */
8684 else if (h->dynindx == -1 && !h->forced_local)
8685 {
8686 if (! bfd_elf_link_record_dynamic_symbol (info, h))
8687 return FALSE;
8688 }
8689 }
8690
8691 if (do_copy)
8692 {
aff469fa 8693 /* Even though we don't directly need a GOT entry for this symbol,
f7ff1106
RS
8694 the SVR4 psABI requires it to have a dynamic symbol table
8695 index greater that DT_MIPS_GOTSYM if there are dynamic
8696 relocations against it.
8697
8698 VxWorks does not enforce the same mapping between the GOT
8699 and the symbol table, so the same requirement does not
8700 apply there. */
6ccf4795
RS
8701 if (!htab->is_vxworks)
8702 {
8703 if (hmips->global_got_area > GGA_RELOC_ONLY)
8704 hmips->global_got_area = GGA_RELOC_ONLY;
8705 hmips->got_only_for_calls = FALSE;
8706 }
aff469fa 8707
9a59ad6b
DJ
8708 mips_elf_allocate_dynamic_relocations
8709 (dynobj, info, hmips->possibly_dynamic_relocs);
8710 if (hmips->readonly_reloc)
8711 /* We tell the dynamic linker that there are relocations
8712 against the text segment. */
8713 info->flags |= DF_TEXTREL;
8714 }
8715 }
8716
8717 return TRUE;
8718}
8719
b49e97c9
TS
8720/* Adjust a symbol defined by a dynamic object and referenced by a
8721 regular object. The current definition is in some section of the
8722 dynamic object, but we're not including those sections. We have to
8723 change the definition to something the rest of the link can
8724 understand. */
8725
b34976b6 8726bfd_boolean
9719ad41
RS
8727_bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
8728 struct elf_link_hash_entry *h)
b49e97c9
TS
8729{
8730 bfd *dynobj;
8731 struct mips_elf_link_hash_entry *hmips;
5108fc1b 8732 struct mips_elf_link_hash_table *htab;
b49e97c9 8733
5108fc1b 8734 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
8735 BFD_ASSERT (htab != NULL);
8736
b49e97c9 8737 dynobj = elf_hash_table (info)->dynobj;
861fb55a 8738 hmips = (struct mips_elf_link_hash_entry *) h;
b49e97c9
TS
8739
8740 /* Make sure we know what is going on here. */
8741 BFD_ASSERT (dynobj != NULL
f5385ebf 8742 && (h->needs_plt
f6e332e6 8743 || h->u.weakdef != NULL
f5385ebf
AM
8744 || (h->def_dynamic
8745 && h->ref_regular
8746 && !h->def_regular)));
b49e97c9 8747
b49e97c9 8748 hmips = (struct mips_elf_link_hash_entry *) h;
b49e97c9 8749
861fb55a
DJ
8750 /* If there are call relocations against an externally-defined symbol,
8751 see whether we can create a MIPS lazy-binding stub for it. We can
8752 only do this if all references to the function are through call
8753 relocations, and in that case, the traditional lazy-binding stubs
8754 are much more efficient than PLT entries.
8755
8756 Traditional stubs are only available on SVR4 psABI-based systems;
8757 VxWorks always uses PLTs instead. */
8758 if (!htab->is_vxworks && h->needs_plt && !hmips->no_fn_stub)
b49e97c9
TS
8759 {
8760 if (! elf_hash_table (info)->dynamic_sections_created)
b34976b6 8761 return TRUE;
b49e97c9
TS
8762
8763 /* If this symbol is not defined in a regular file, then set
8764 the symbol to the stub location. This is required to make
8765 function pointers compare as equal between the normal
8766 executable and the shared library. */
f5385ebf 8767 if (!h->def_regular)
b49e97c9 8768 {
33bb52fb
RS
8769 hmips->needs_lazy_stub = TRUE;
8770 htab->lazy_stub_count++;
b34976b6 8771 return TRUE;
b49e97c9
TS
8772 }
8773 }
861fb55a
DJ
8774 /* As above, VxWorks requires PLT entries for externally-defined
8775 functions that are only accessed through call relocations.
b49e97c9 8776
861fb55a
DJ
8777 Both VxWorks and non-VxWorks targets also need PLT entries if there
8778 are static-only relocations against an externally-defined function.
8779 This can technically occur for shared libraries if there are
8780 branches to the symbol, although it is unlikely that this will be
8781 used in practice due to the short ranges involved. It can occur
8782 for any relative or absolute relocation in executables; in that
8783 case, the PLT entry becomes the function's canonical address. */
8784 else if (((h->needs_plt && !hmips->no_fn_stub)
8785 || (h->type == STT_FUNC && hmips->has_static_relocs))
8786 && htab->use_plts_and_copy_relocs
8787 && !SYMBOL_CALLS_LOCAL (info, h)
8788 && !(ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
8789 && h->root.type == bfd_link_hash_undefweak))
b49e97c9 8790 {
1bbce132
MR
8791 bfd_boolean micromips_p = MICROMIPS_P (info->output_bfd);
8792 bfd_boolean newabi_p = NEWABI_P (info->output_bfd);
8793
8794 /* If this is the first symbol to need a PLT entry, then make some
8795 basic setup. Also work out PLT entry sizes. We'll need them
8796 for PLT offset calculations. */
8797 if (htab->plt_mips_offset + htab->plt_comp_offset == 0)
861fb55a
DJ
8798 {
8799 BFD_ASSERT (htab->sgotplt->size == 0);
1bbce132 8800 BFD_ASSERT (htab->plt_got_index == 0);
0a44bf69 8801
861fb55a
DJ
8802 /* If we're using the PLT additions to the psABI, each PLT
8803 entry is 16 bytes and the PLT0 entry is 32 bytes.
8804 Encourage better cache usage by aligning. We do this
8805 lazily to avoid pessimizing traditional objects. */
8806 if (!htab->is_vxworks
8807 && !bfd_set_section_alignment (dynobj, htab->splt, 5))
8808 return FALSE;
0a44bf69 8809
861fb55a
DJ
8810 /* Make sure that .got.plt is word-aligned. We do this lazily
8811 for the same reason as above. */
8812 if (!bfd_set_section_alignment (dynobj, htab->sgotplt,
8813 MIPS_ELF_LOG_FILE_ALIGN (dynobj)))
8814 return FALSE;
0a44bf69 8815
861fb55a
DJ
8816 /* On non-VxWorks targets, the first two entries in .got.plt
8817 are reserved. */
8818 if (!htab->is_vxworks)
1bbce132
MR
8819 htab->plt_got_index
8820 += (get_elf_backend_data (dynobj)->got_header_size
8821 / MIPS_ELF_GOT_SIZE (dynobj));
0a44bf69 8822
861fb55a
DJ
8823 /* On VxWorks, also allocate room for the header's
8824 .rela.plt.unloaded entries. */
8825 if (htab->is_vxworks && !info->shared)
0a44bf69 8826 htab->srelplt2->size += 2 * sizeof (Elf32_External_Rela);
1bbce132
MR
8827
8828 /* Now work out the sizes of individual PLT entries. */
8829 if (htab->is_vxworks && info->shared)
8830 htab->plt_mips_entry_size
8831 = 4 * ARRAY_SIZE (mips_vxworks_shared_plt_entry);
8832 else if (htab->is_vxworks)
8833 htab->plt_mips_entry_size
8834 = 4 * ARRAY_SIZE (mips_vxworks_exec_plt_entry);
8835 else if (newabi_p)
8836 htab->plt_mips_entry_size
8837 = 4 * ARRAY_SIZE (mips_exec_plt_entry);
833794fc 8838 else if (!micromips_p)
1bbce132
MR
8839 {
8840 htab->plt_mips_entry_size
8841 = 4 * ARRAY_SIZE (mips_exec_plt_entry);
8842 htab->plt_comp_entry_size
833794fc
MR
8843 = 2 * ARRAY_SIZE (mips16_o32_exec_plt_entry);
8844 }
8845 else if (htab->insn32)
8846 {
8847 htab->plt_mips_entry_size
8848 = 4 * ARRAY_SIZE (mips_exec_plt_entry);
8849 htab->plt_comp_entry_size
8850 = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt_entry);
1bbce132
MR
8851 }
8852 else
8853 {
8854 htab->plt_mips_entry_size
8855 = 4 * ARRAY_SIZE (mips_exec_plt_entry);
8856 htab->plt_comp_entry_size
833794fc 8857 = 2 * ARRAY_SIZE (micromips_o32_exec_plt_entry);
1bbce132 8858 }
0a44bf69
RS
8859 }
8860
1bbce132
MR
8861 if (h->plt.plist == NULL)
8862 h->plt.plist = mips_elf_make_plt_record (dynobj);
8863 if (h->plt.plist == NULL)
8864 return FALSE;
8865
8866 /* There are no defined MIPS16 or microMIPS PLT entries for VxWorks,
8867 n32 or n64, so always use a standard entry there.
8868
8869 If the symbol has a MIPS16 call stub and gets a PLT entry, then
8870 all MIPS16 calls will go via that stub, and there is no benefit
8871 to having a MIPS16 entry. And in the case of call_stub a
8872 standard entry actually has to be used as the stub ends with a J
8873 instruction. */
8874 if (newabi_p
8875 || htab->is_vxworks
8876 || hmips->call_stub
8877 || hmips->call_fp_stub)
8878 {
8879 h->plt.plist->need_mips = TRUE;
8880 h->plt.plist->need_comp = FALSE;
8881 }
8882
8883 /* Otherwise, if there are no direct calls to the function, we
8884 have a free choice of whether to use standard or compressed
8885 entries. Prefer microMIPS entries if the object is known to
8886 contain microMIPS code, so that it becomes possible to create
8887 pure microMIPS binaries. Prefer standard entries otherwise,
8888 because MIPS16 ones are no smaller and are usually slower. */
8889 if (!h->plt.plist->need_mips && !h->plt.plist->need_comp)
8890 {
8891 if (micromips_p)
8892 h->plt.plist->need_comp = TRUE;
8893 else
8894 h->plt.plist->need_mips = TRUE;
8895 }
8896
8897 if (h->plt.plist->need_mips)
8898 {
8899 h->plt.plist->mips_offset = htab->plt_mips_offset;
8900 htab->plt_mips_offset += htab->plt_mips_entry_size;
8901 }
8902 if (h->plt.plist->need_comp)
8903 {
8904 h->plt.plist->comp_offset = htab->plt_comp_offset;
8905 htab->plt_comp_offset += htab->plt_comp_entry_size;
8906 }
8907
8908 /* Reserve the corresponding .got.plt entry now too. */
8909 h->plt.plist->gotplt_index = htab->plt_got_index++;
0a44bf69
RS
8910
8911 /* If the output file has no definition of the symbol, set the
861fb55a 8912 symbol's value to the address of the stub. */
131eb6b7 8913 if (!info->shared && !h->def_regular)
1bbce132 8914 hmips->use_plt_entry = TRUE;
0a44bf69 8915
1bbce132 8916 /* Make room for the R_MIPS_JUMP_SLOT relocation. */
861fb55a
DJ
8917 htab->srelplt->size += (htab->is_vxworks
8918 ? MIPS_ELF_RELA_SIZE (dynobj)
8919 : MIPS_ELF_REL_SIZE (dynobj));
0a44bf69
RS
8920
8921 /* Make room for the .rela.plt.unloaded relocations. */
861fb55a 8922 if (htab->is_vxworks && !info->shared)
0a44bf69
RS
8923 htab->srelplt2->size += 3 * sizeof (Elf32_External_Rela);
8924
861fb55a
DJ
8925 /* All relocations against this symbol that could have been made
8926 dynamic will now refer to the PLT entry instead. */
8927 hmips->possibly_dynamic_relocs = 0;
0a44bf69 8928
0a44bf69
RS
8929 return TRUE;
8930 }
8931
8932 /* If this is a weak symbol, and there is a real definition, the
8933 processor independent code will have arranged for us to see the
8934 real definition first, and we can just use the same value. */
8935 if (h->u.weakdef != NULL)
8936 {
8937 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
8938 || h->u.weakdef->root.type == bfd_link_hash_defweak);
8939 h->root.u.def.section = h->u.weakdef->root.u.def.section;
8940 h->root.u.def.value = h->u.weakdef->root.u.def.value;
8941 return TRUE;
8942 }
8943
861fb55a
DJ
8944 /* Otherwise, there is nothing further to do for symbols defined
8945 in regular objects. */
8946 if (h->def_regular)
0a44bf69
RS
8947 return TRUE;
8948
861fb55a
DJ
8949 /* There's also nothing more to do if we'll convert all relocations
8950 against this symbol into dynamic relocations. */
8951 if (!hmips->has_static_relocs)
8952 return TRUE;
8953
8954 /* We're now relying on copy relocations. Complain if we have
8955 some that we can't convert. */
8956 if (!htab->use_plts_and_copy_relocs || info->shared)
8957 {
8958 (*_bfd_error_handler) (_("non-dynamic relocations refer to "
8959 "dynamic symbol %s"),
8960 h->root.root.string);
8961 bfd_set_error (bfd_error_bad_value);
8962 return FALSE;
8963 }
8964
0a44bf69
RS
8965 /* We must allocate the symbol in our .dynbss section, which will
8966 become part of the .bss section of the executable. There will be
8967 an entry for this symbol in the .dynsym section. The dynamic
8968 object will contain position independent code, so all references
8969 from the dynamic object to this symbol will go through the global
8970 offset table. The dynamic linker will use the .dynsym entry to
8971 determine the address it must put in the global offset table, so
8972 both the dynamic object and the regular object will refer to the
8973 same memory location for the variable. */
8974
8975 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
8976 {
861fb55a
DJ
8977 if (htab->is_vxworks)
8978 htab->srelbss->size += sizeof (Elf32_External_Rela);
8979 else
8980 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
0a44bf69
RS
8981 h->needs_copy = 1;
8982 }
8983
861fb55a
DJ
8984 /* All relocations against this symbol that could have been made
8985 dynamic will now refer to the local copy instead. */
8986 hmips->possibly_dynamic_relocs = 0;
8987
027297b7 8988 return _bfd_elf_adjust_dynamic_copy (h, htab->sdynbss);
0a44bf69 8989}
b49e97c9
TS
8990\f
8991/* This function is called after all the input files have been read,
8992 and the input sections have been assigned to output sections. We
8993 check for any mips16 stub sections that we can discard. */
8994
b34976b6 8995bfd_boolean
9719ad41
RS
8996_bfd_mips_elf_always_size_sections (bfd *output_bfd,
8997 struct bfd_link_info *info)
b49e97c9
TS
8998{
8999 asection *ri;
0a44bf69 9000 struct mips_elf_link_hash_table *htab;
861fb55a 9001 struct mips_htab_traverse_info hti;
0a44bf69
RS
9002
9003 htab = mips_elf_hash_table (info);
4dfe6ac6 9004 BFD_ASSERT (htab != NULL);
f4416af6 9005
b49e97c9
TS
9006 /* The .reginfo section has a fixed size. */
9007 ri = bfd_get_section_by_name (output_bfd, ".reginfo");
9008 if (ri != NULL)
9719ad41 9009 bfd_set_section_size (output_bfd, ri, sizeof (Elf32_External_RegInfo));
b49e97c9 9010
861fb55a
DJ
9011 hti.info = info;
9012 hti.output_bfd = output_bfd;
9013 hti.error = FALSE;
9014 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
9015 mips_elf_check_symbols, &hti);
9016 if (hti.error)
9017 return FALSE;
f4416af6 9018
33bb52fb
RS
9019 return TRUE;
9020}
9021
9022/* If the link uses a GOT, lay it out and work out its size. */
9023
9024static bfd_boolean
9025mips_elf_lay_out_got (bfd *output_bfd, struct bfd_link_info *info)
9026{
9027 bfd *dynobj;
9028 asection *s;
9029 struct mips_got_info *g;
33bb52fb
RS
9030 bfd_size_type loadable_size = 0;
9031 bfd_size_type page_gotno;
d7206569 9032 bfd *ibfd;
ab361d49 9033 struct mips_elf_traverse_got_arg tga;
33bb52fb
RS
9034 struct mips_elf_link_hash_table *htab;
9035
9036 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9037 BFD_ASSERT (htab != NULL);
9038
a8028dd0 9039 s = htab->sgot;
f4416af6 9040 if (s == NULL)
b34976b6 9041 return TRUE;
b49e97c9 9042
33bb52fb 9043 dynobj = elf_hash_table (info)->dynobj;
a8028dd0
RS
9044 g = htab->got_info;
9045
861fb55a
DJ
9046 /* Allocate room for the reserved entries. VxWorks always reserves
9047 3 entries; other objects only reserve 2 entries. */
9048 BFD_ASSERT (g->assigned_gotno == 0);
9049 if (htab->is_vxworks)
9050 htab->reserved_gotno = 3;
9051 else
9052 htab->reserved_gotno = 2;
9053 g->local_gotno += htab->reserved_gotno;
9054 g->assigned_gotno = htab->reserved_gotno;
9055
6c42ddb9
RS
9056 /* Decide which symbols need to go in the global part of the GOT and
9057 count the number of reloc-only GOT symbols. */
020d7251 9058 mips_elf_link_hash_traverse (htab, mips_elf_count_got_symbols, info);
f4416af6 9059
13db6b44
RS
9060 if (!mips_elf_resolve_final_got_entries (info, g))
9061 return FALSE;
9062
33bb52fb
RS
9063 /* Calculate the total loadable size of the output. That
9064 will give us the maximum number of GOT_PAGE entries
9065 required. */
d7206569 9066 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link_next)
33bb52fb
RS
9067 {
9068 asection *subsection;
5108fc1b 9069
d7206569 9070 for (subsection = ibfd->sections;
33bb52fb
RS
9071 subsection;
9072 subsection = subsection->next)
9073 {
9074 if ((subsection->flags & SEC_ALLOC) == 0)
9075 continue;
9076 loadable_size += ((subsection->size + 0xf)
9077 &~ (bfd_size_type) 0xf);
9078 }
9079 }
f4416af6 9080
0a44bf69 9081 if (htab->is_vxworks)
738e5348 9082 /* There's no need to allocate page entries for VxWorks; R_MIPS*_GOT16
0a44bf69
RS
9083 relocations against local symbols evaluate to "G", and the EABI does
9084 not include R_MIPS_GOT_PAGE. */
c224138d 9085 page_gotno = 0;
0a44bf69
RS
9086 else
9087 /* Assume there are two loadable segments consisting of contiguous
9088 sections. Is 5 enough? */
c224138d
RS
9089 page_gotno = (loadable_size >> 16) + 5;
9090
13db6b44 9091 /* Choose the smaller of the two page estimates; both are intended to be
c224138d
RS
9092 conservative. */
9093 if (page_gotno > g->page_gotno)
9094 page_gotno = g->page_gotno;
f4416af6 9095
c224138d 9096 g->local_gotno += page_gotno;
ab361d49 9097
ab361d49
RS
9098 s->size += g->local_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
9099 s->size += g->global_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
0f20cc35
DJ
9100 s->size += g->tls_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
9101
0a44bf69
RS
9102 /* VxWorks does not support multiple GOTs. It initializes $gp to
9103 __GOTT_BASE__[__GOTT_INDEX__], the value of which is set by the
9104 dynamic loader. */
57093f5e 9105 if (!htab->is_vxworks && s->size > MIPS_ELF_GOT_MAX_SIZE (info))
0f20cc35 9106 {
a8028dd0 9107 if (!mips_elf_multi_got (output_bfd, info, s, page_gotno))
0f20cc35
DJ
9108 return FALSE;
9109 }
9110 else
9111 {
d7206569
RS
9112 /* Record that all bfds use G. This also has the effect of freeing
9113 the per-bfd GOTs, which we no longer need. */
9114 for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link_next)
9115 if (mips_elf_bfd_got (ibfd, FALSE))
9116 mips_elf_replace_bfd_got (ibfd, g);
9117 mips_elf_replace_bfd_got (output_bfd, g);
9118
33bb52fb 9119 /* Set up TLS entries. */
0f20cc35 9120 g->tls_assigned_gotno = g->global_gotno + g->local_gotno;
72e7511a
RS
9121 tga.info = info;
9122 tga.g = g;
9123 tga.value = MIPS_ELF_GOT_SIZE (output_bfd);
9124 htab_traverse (g->got_entries, mips_elf_initialize_tls_index, &tga);
9125 if (!tga.g)
9126 return FALSE;
1fd20d70
RS
9127 BFD_ASSERT (g->tls_assigned_gotno
9128 == g->global_gotno + g->local_gotno + g->tls_gotno);
33bb52fb 9129
57093f5e
RS
9130 /* Each VxWorks GOT entry needs an explicit relocation. */
9131 if (htab->is_vxworks && info->shared)
9132 g->relocs += g->global_gotno + g->local_gotno - htab->reserved_gotno;
9133
33bb52fb 9134 /* Allocate room for the TLS relocations. */
ab361d49
RS
9135 if (g->relocs)
9136 mips_elf_allocate_dynamic_relocations (dynobj, info, g->relocs);
0f20cc35 9137 }
b49e97c9 9138
b34976b6 9139 return TRUE;
b49e97c9
TS
9140}
9141
33bb52fb
RS
9142/* Estimate the size of the .MIPS.stubs section. */
9143
9144static void
9145mips_elf_estimate_stub_size (bfd *output_bfd, struct bfd_link_info *info)
9146{
9147 struct mips_elf_link_hash_table *htab;
9148 bfd_size_type dynsymcount;
9149
9150 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9151 BFD_ASSERT (htab != NULL);
9152
33bb52fb
RS
9153 if (htab->lazy_stub_count == 0)
9154 return;
9155
9156 /* IRIX rld assumes that a function stub isn't at the end of the .text
9157 section, so add a dummy entry to the end. */
9158 htab->lazy_stub_count++;
9159
9160 /* Get a worst-case estimate of the number of dynamic symbols needed.
9161 At this point, dynsymcount does not account for section symbols
9162 and count_section_dynsyms may overestimate the number that will
9163 be needed. */
9164 dynsymcount = (elf_hash_table (info)->dynsymcount
9165 + count_section_dynsyms (output_bfd, info));
9166
1bbce132
MR
9167 /* Determine the size of one stub entry. There's no disadvantage
9168 from using microMIPS code here, so for the sake of pure-microMIPS
9169 binaries we prefer it whenever there's any microMIPS code in
9170 output produced at all. This has a benefit of stubs being
833794fc
MR
9171 shorter by 4 bytes each too, unless in the insn32 mode. */
9172 if (!MICROMIPS_P (output_bfd))
1bbce132
MR
9173 htab->function_stub_size = (dynsymcount > 0x10000
9174 ? MIPS_FUNCTION_STUB_BIG_SIZE
9175 : MIPS_FUNCTION_STUB_NORMAL_SIZE);
833794fc
MR
9176 else if (htab->insn32)
9177 htab->function_stub_size = (dynsymcount > 0x10000
9178 ? MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE
9179 : MICROMIPS_INSN32_FUNCTION_STUB_NORMAL_SIZE);
9180 else
9181 htab->function_stub_size = (dynsymcount > 0x10000
9182 ? MICROMIPS_FUNCTION_STUB_BIG_SIZE
9183 : MICROMIPS_FUNCTION_STUB_NORMAL_SIZE);
33bb52fb
RS
9184
9185 htab->sstubs->size = htab->lazy_stub_count * htab->function_stub_size;
9186}
9187
1bbce132
MR
9188/* A mips_elf_link_hash_traverse callback for which DATA points to a
9189 mips_htab_traverse_info. If H needs a traditional MIPS lazy-binding
9190 stub, allocate an entry in the stubs section. */
33bb52fb
RS
9191
9192static bfd_boolean
af924177 9193mips_elf_allocate_lazy_stub (struct mips_elf_link_hash_entry *h, void *data)
33bb52fb 9194{
1bbce132 9195 struct mips_htab_traverse_info *hti = data;
33bb52fb 9196 struct mips_elf_link_hash_table *htab;
1bbce132
MR
9197 struct bfd_link_info *info;
9198 bfd *output_bfd;
9199
9200 info = hti->info;
9201 output_bfd = hti->output_bfd;
9202 htab = mips_elf_hash_table (info);
9203 BFD_ASSERT (htab != NULL);
33bb52fb 9204
33bb52fb
RS
9205 if (h->needs_lazy_stub)
9206 {
1bbce132
MR
9207 bfd_boolean micromips_p = MICROMIPS_P (output_bfd);
9208 unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9209 bfd_vma isa_bit = micromips_p;
9210
9211 BFD_ASSERT (htab->root.dynobj != NULL);
9212 if (h->root.plt.plist == NULL)
9213 h->root.plt.plist = mips_elf_make_plt_record (htab->sstubs->owner);
9214 if (h->root.plt.plist == NULL)
9215 {
9216 hti->error = TRUE;
9217 return FALSE;
9218 }
33bb52fb 9219 h->root.root.u.def.section = htab->sstubs;
1bbce132
MR
9220 h->root.root.u.def.value = htab->sstubs->size + isa_bit;
9221 h->root.plt.plist->stub_offset = htab->sstubs->size;
9222 h->root.other = other;
33bb52fb
RS
9223 htab->sstubs->size += htab->function_stub_size;
9224 }
9225 return TRUE;
9226}
9227
9228/* Allocate offsets in the stubs section to each symbol that needs one.
9229 Set the final size of the .MIPS.stub section. */
9230
1bbce132 9231static bfd_boolean
33bb52fb
RS
9232mips_elf_lay_out_lazy_stubs (struct bfd_link_info *info)
9233{
1bbce132
MR
9234 bfd *output_bfd = info->output_bfd;
9235 bfd_boolean micromips_p = MICROMIPS_P (output_bfd);
9236 unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9237 bfd_vma isa_bit = micromips_p;
33bb52fb 9238 struct mips_elf_link_hash_table *htab;
1bbce132
MR
9239 struct mips_htab_traverse_info hti;
9240 struct elf_link_hash_entry *h;
9241 bfd *dynobj;
33bb52fb
RS
9242
9243 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
9244 BFD_ASSERT (htab != NULL);
9245
33bb52fb 9246 if (htab->lazy_stub_count == 0)
1bbce132 9247 return TRUE;
33bb52fb
RS
9248
9249 htab->sstubs->size = 0;
1bbce132
MR
9250 hti.info = info;
9251 hti.output_bfd = output_bfd;
9252 hti.error = FALSE;
9253 mips_elf_link_hash_traverse (htab, mips_elf_allocate_lazy_stub, &hti);
9254 if (hti.error)
9255 return FALSE;
33bb52fb
RS
9256 htab->sstubs->size += htab->function_stub_size;
9257 BFD_ASSERT (htab->sstubs->size
9258 == htab->lazy_stub_count * htab->function_stub_size);
1bbce132
MR
9259
9260 dynobj = elf_hash_table (info)->dynobj;
9261 BFD_ASSERT (dynobj != NULL);
9262 h = _bfd_elf_define_linkage_sym (dynobj, info, htab->sstubs, "_MIPS_STUBS_");
9263 if (h == NULL)
9264 return FALSE;
9265 h->root.u.def.value = isa_bit;
9266 h->other = other;
9267 h->type = STT_FUNC;
9268
9269 return TRUE;
9270}
9271
9272/* A mips_elf_link_hash_traverse callback for which DATA points to a
9273 bfd_link_info. If H uses the address of a PLT entry as the value
9274 of the symbol, then set the entry in the symbol table now. Prefer
9275 a standard MIPS PLT entry. */
9276
9277static bfd_boolean
9278mips_elf_set_plt_sym_value (struct mips_elf_link_hash_entry *h, void *data)
9279{
9280 struct bfd_link_info *info = data;
9281 bfd_boolean micromips_p = MICROMIPS_P (info->output_bfd);
9282 struct mips_elf_link_hash_table *htab;
9283 unsigned int other;
9284 bfd_vma isa_bit;
9285 bfd_vma val;
9286
9287 htab = mips_elf_hash_table (info);
9288 BFD_ASSERT (htab != NULL);
9289
9290 if (h->use_plt_entry)
9291 {
9292 BFD_ASSERT (h->root.plt.plist != NULL);
9293 BFD_ASSERT (h->root.plt.plist->mips_offset != MINUS_ONE
9294 || h->root.plt.plist->comp_offset != MINUS_ONE);
9295
9296 val = htab->plt_header_size;
9297 if (h->root.plt.plist->mips_offset != MINUS_ONE)
9298 {
9299 isa_bit = 0;
9300 val += h->root.plt.plist->mips_offset;
9301 other = 0;
9302 }
9303 else
9304 {
9305 isa_bit = 1;
9306 val += htab->plt_mips_offset + h->root.plt.plist->comp_offset;
9307 other = micromips_p ? STO_MICROMIPS : STO_MIPS16;
9308 }
9309 val += isa_bit;
9310 /* For VxWorks, point at the PLT load stub rather than the lazy
9311 resolution stub; this stub will become the canonical function
9312 address. */
9313 if (htab->is_vxworks)
9314 val += 8;
9315
9316 h->root.root.u.def.section = htab->splt;
9317 h->root.root.u.def.value = val;
9318 h->root.other = other;
9319 }
9320
9321 return TRUE;
33bb52fb
RS
9322}
9323
b49e97c9
TS
9324/* Set the sizes of the dynamic sections. */
9325
b34976b6 9326bfd_boolean
9719ad41
RS
9327_bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
9328 struct bfd_link_info *info)
b49e97c9
TS
9329{
9330 bfd *dynobj;
861fb55a 9331 asection *s, *sreldyn;
b34976b6 9332 bfd_boolean reltext;
0a44bf69 9333 struct mips_elf_link_hash_table *htab;
b49e97c9 9334
0a44bf69 9335 htab = mips_elf_hash_table (info);
4dfe6ac6 9336 BFD_ASSERT (htab != NULL);
b49e97c9
TS
9337 dynobj = elf_hash_table (info)->dynobj;
9338 BFD_ASSERT (dynobj != NULL);
9339
9340 if (elf_hash_table (info)->dynamic_sections_created)
9341 {
9342 /* Set the contents of the .interp section to the interpreter. */
893c4fe2 9343 if (info->executable)
b49e97c9 9344 {
3d4d4302 9345 s = bfd_get_linker_section (dynobj, ".interp");
b49e97c9 9346 BFD_ASSERT (s != NULL);
eea6121a 9347 s->size
b49e97c9
TS
9348 = strlen (ELF_DYNAMIC_INTERPRETER (output_bfd)) + 1;
9349 s->contents
9350 = (bfd_byte *) ELF_DYNAMIC_INTERPRETER (output_bfd);
9351 }
861fb55a 9352
1bbce132
MR
9353 /* Figure out the size of the PLT header if we know that we
9354 are using it. For the sake of cache alignment always use
9355 a standard header whenever any standard entries are present
9356 even if microMIPS entries are present as well. This also
9357 lets the microMIPS header rely on the value of $v0 only set
9358 by microMIPS entries, for a small size reduction.
9359
9360 Set symbol table entry values for symbols that use the
9361 address of their PLT entry now that we can calculate it.
9362
9363 Also create the _PROCEDURE_LINKAGE_TABLE_ symbol if we
9364 haven't already in _bfd_elf_create_dynamic_sections. */
9365 if (htab->splt && htab->plt_mips_offset + htab->plt_comp_offset != 0)
861fb55a 9366 {
1bbce132
MR
9367 bfd_boolean micromips_p = (MICROMIPS_P (output_bfd)
9368 && !htab->plt_mips_offset);
9369 unsigned int other = micromips_p ? STO_MICROMIPS : 0;
9370 bfd_vma isa_bit = micromips_p;
861fb55a 9371 struct elf_link_hash_entry *h;
1bbce132 9372 bfd_vma size;
861fb55a
DJ
9373
9374 BFD_ASSERT (htab->use_plts_and_copy_relocs);
1bbce132
MR
9375 BFD_ASSERT (htab->sgotplt->size == 0);
9376 BFD_ASSERT (htab->splt->size == 0);
9377
9378 if (htab->is_vxworks && info->shared)
9379 size = 4 * ARRAY_SIZE (mips_vxworks_shared_plt0_entry);
9380 else if (htab->is_vxworks)
9381 size = 4 * ARRAY_SIZE (mips_vxworks_exec_plt0_entry);
9382 else if (ABI_64_P (output_bfd))
9383 size = 4 * ARRAY_SIZE (mips_n64_exec_plt0_entry);
9384 else if (ABI_N32_P (output_bfd))
9385 size = 4 * ARRAY_SIZE (mips_n32_exec_plt0_entry);
9386 else if (!micromips_p)
9387 size = 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry);
833794fc
MR
9388 else if (htab->insn32)
9389 size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry);
1bbce132
MR
9390 else
9391 size = 2 * ARRAY_SIZE (micromips_o32_exec_plt0_entry);
861fb55a 9392
1bbce132
MR
9393 htab->plt_header_is_comp = micromips_p;
9394 htab->plt_header_size = size;
9395 htab->splt->size = (size
9396 + htab->plt_mips_offset
9397 + htab->plt_comp_offset);
9398 htab->sgotplt->size = (htab->plt_got_index
9399 * MIPS_ELF_GOT_SIZE (dynobj));
9400
9401 mips_elf_link_hash_traverse (htab, mips_elf_set_plt_sym_value, info);
9402
9403 if (htab->root.hplt == NULL)
9404 {
9405 h = _bfd_elf_define_linkage_sym (dynobj, info, htab->splt,
9406 "_PROCEDURE_LINKAGE_TABLE_");
9407 htab->root.hplt = h;
9408 if (h == NULL)
9409 return FALSE;
9410 }
9411
9412 h = htab->root.hplt;
9413 h->root.u.def.value = isa_bit;
9414 h->other = other;
861fb55a
DJ
9415 h->type = STT_FUNC;
9416 }
9417 }
4e41d0d7 9418
9a59ad6b 9419 /* Allocate space for global sym dynamic relocs. */
2c3fc389 9420 elf_link_hash_traverse (&htab->root, allocate_dynrelocs, info);
9a59ad6b 9421
33bb52fb
RS
9422 mips_elf_estimate_stub_size (output_bfd, info);
9423
9424 if (!mips_elf_lay_out_got (output_bfd, info))
9425 return FALSE;
9426
9427 mips_elf_lay_out_lazy_stubs (info);
9428
b49e97c9
TS
9429 /* The check_relocs and adjust_dynamic_symbol entry points have
9430 determined the sizes of the various dynamic sections. Allocate
9431 memory for them. */
b34976b6 9432 reltext = FALSE;
b49e97c9
TS
9433 for (s = dynobj->sections; s != NULL; s = s->next)
9434 {
9435 const char *name;
b49e97c9
TS
9436
9437 /* It's OK to base decisions on the section name, because none
9438 of the dynobj section names depend upon the input files. */
9439 name = bfd_get_section_name (dynobj, s);
9440
9441 if ((s->flags & SEC_LINKER_CREATED) == 0)
9442 continue;
9443
0112cd26 9444 if (CONST_STRNEQ (name, ".rel"))
b49e97c9 9445 {
c456f082 9446 if (s->size != 0)
b49e97c9
TS
9447 {
9448 const char *outname;
9449 asection *target;
9450
9451 /* If this relocation section applies to a read only
9452 section, then we probably need a DT_TEXTREL entry.
0a44bf69 9453 If the relocation section is .rel(a).dyn, we always
b49e97c9
TS
9454 assert a DT_TEXTREL entry rather than testing whether
9455 there exists a relocation to a read only section or
9456 not. */
9457 outname = bfd_get_section_name (output_bfd,
9458 s->output_section);
9459 target = bfd_get_section_by_name (output_bfd, outname + 4);
9460 if ((target != NULL
9461 && (target->flags & SEC_READONLY) != 0
9462 && (target->flags & SEC_ALLOC) != 0)
0a44bf69 9463 || strcmp (outname, MIPS_ELF_REL_DYN_NAME (info)) == 0)
b34976b6 9464 reltext = TRUE;
b49e97c9
TS
9465
9466 /* We use the reloc_count field as a counter if we need
9467 to copy relocs into the output file. */
0a44bf69 9468 if (strcmp (name, MIPS_ELF_REL_DYN_NAME (info)) != 0)
b49e97c9 9469 s->reloc_count = 0;
f4416af6
AO
9470
9471 /* If combreloc is enabled, elf_link_sort_relocs() will
9472 sort relocations, but in a different way than we do,
9473 and before we're done creating relocations. Also, it
9474 will move them around between input sections'
9475 relocation's contents, so our sorting would be
9476 broken, so don't let it run. */
9477 info->combreloc = 0;
b49e97c9
TS
9478 }
9479 }
b49e97c9
TS
9480 else if (! info->shared
9481 && ! mips_elf_hash_table (info)->use_rld_obj_head
0112cd26 9482 && CONST_STRNEQ (name, ".rld_map"))
b49e97c9 9483 {
5108fc1b 9484 /* We add a room for __rld_map. It will be filled in by the
b49e97c9 9485 rtld to contain a pointer to the _r_debug structure. */
b4082c70 9486 s->size += MIPS_ELF_RLD_MAP_SIZE (output_bfd);
b49e97c9
TS
9487 }
9488 else if (SGI_COMPAT (output_bfd)
0112cd26 9489 && CONST_STRNEQ (name, ".compact_rel"))
eea6121a 9490 s->size += mips_elf_hash_table (info)->compact_rel_size;
861fb55a
DJ
9491 else if (s == htab->splt)
9492 {
9493 /* If the last PLT entry has a branch delay slot, allocate
6d30f5b2
NC
9494 room for an extra nop to fill the delay slot. This is
9495 for CPUs without load interlocking. */
9496 if (! LOAD_INTERLOCKS_P (output_bfd)
9497 && ! htab->is_vxworks && s->size > 0)
861fb55a
DJ
9498 s->size += 4;
9499 }
0112cd26 9500 else if (! CONST_STRNEQ (name, ".init")
33bb52fb 9501 && s != htab->sgot
0a44bf69 9502 && s != htab->sgotplt
861fb55a
DJ
9503 && s != htab->sstubs
9504 && s != htab->sdynbss)
b49e97c9
TS
9505 {
9506 /* It's not one of our sections, so don't allocate space. */
9507 continue;
9508 }
9509
c456f082 9510 if (s->size == 0)
b49e97c9 9511 {
8423293d 9512 s->flags |= SEC_EXCLUDE;
b49e97c9
TS
9513 continue;
9514 }
9515
c456f082
AM
9516 if ((s->flags & SEC_HAS_CONTENTS) == 0)
9517 continue;
9518
b49e97c9 9519 /* Allocate memory for the section contents. */
eea6121a 9520 s->contents = bfd_zalloc (dynobj, s->size);
c456f082 9521 if (s->contents == NULL)
b49e97c9
TS
9522 {
9523 bfd_set_error (bfd_error_no_memory);
b34976b6 9524 return FALSE;
b49e97c9
TS
9525 }
9526 }
9527
9528 if (elf_hash_table (info)->dynamic_sections_created)
9529 {
9530 /* Add some entries to the .dynamic section. We fill in the
9531 values later, in _bfd_mips_elf_finish_dynamic_sections, but we
9532 must add the entries now so that we get the correct size for
5750dcec 9533 the .dynamic section. */
af5978fb
RS
9534
9535 /* SGI object has the equivalence of DT_DEBUG in the
5750dcec 9536 DT_MIPS_RLD_MAP entry. This must come first because glibc
6e6be592
MR
9537 only fills in DT_MIPS_RLD_MAP (not DT_DEBUG) and some tools
9538 may only look at the first one they see. */
af5978fb
RS
9539 if (!info->shared
9540 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP, 0))
9541 return FALSE;
b49e97c9 9542
5750dcec
DJ
9543 /* The DT_DEBUG entry may be filled in by the dynamic linker and
9544 used by the debugger. */
9545 if (info->executable
9546 && !SGI_COMPAT (output_bfd)
9547 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_DEBUG, 0))
9548 return FALSE;
9549
0a44bf69 9550 if (reltext && (SGI_COMPAT (output_bfd) || htab->is_vxworks))
b49e97c9
TS
9551 info->flags |= DF_TEXTREL;
9552
9553 if ((info->flags & DF_TEXTREL) != 0)
9554 {
9555 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_TEXTREL, 0))
b34976b6 9556 return FALSE;
943284cc
DJ
9557
9558 /* Clear the DF_TEXTREL flag. It will be set again if we
9559 write out an actual text relocation; we may not, because
9560 at this point we do not know whether e.g. any .eh_frame
9561 absolute relocations have been converted to PC-relative. */
9562 info->flags &= ~DF_TEXTREL;
b49e97c9
TS
9563 }
9564
9565 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTGOT, 0))
b34976b6 9566 return FALSE;
b49e97c9 9567
861fb55a 9568 sreldyn = mips_elf_rel_dyn_section (info, FALSE);
0a44bf69 9569 if (htab->is_vxworks)
b49e97c9 9570 {
0a44bf69
RS
9571 /* VxWorks uses .rela.dyn instead of .rel.dyn. It does not
9572 use any of the DT_MIPS_* tags. */
861fb55a 9573 if (sreldyn && sreldyn->size > 0)
0a44bf69
RS
9574 {
9575 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELA, 0))
9576 return FALSE;
b49e97c9 9577
0a44bf69
RS
9578 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELASZ, 0))
9579 return FALSE;
b49e97c9 9580
0a44bf69
RS
9581 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELAENT, 0))
9582 return FALSE;
9583 }
b49e97c9 9584 }
0a44bf69
RS
9585 else
9586 {
861fb55a 9587 if (sreldyn && sreldyn->size > 0)
0a44bf69
RS
9588 {
9589 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_REL, 0))
9590 return FALSE;
b49e97c9 9591
0a44bf69
RS
9592 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELSZ, 0))
9593 return FALSE;
b49e97c9 9594
0a44bf69
RS
9595 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELENT, 0))
9596 return FALSE;
9597 }
b49e97c9 9598
0a44bf69
RS
9599 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_VERSION, 0))
9600 return FALSE;
b49e97c9 9601
0a44bf69
RS
9602 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_FLAGS, 0))
9603 return FALSE;
b49e97c9 9604
0a44bf69
RS
9605 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_BASE_ADDRESS, 0))
9606 return FALSE;
b49e97c9 9607
0a44bf69
RS
9608 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_LOCAL_GOTNO, 0))
9609 return FALSE;
b49e97c9 9610
0a44bf69
RS
9611 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_SYMTABNO, 0))
9612 return FALSE;
b49e97c9 9613
0a44bf69
RS
9614 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_UNREFEXTNO, 0))
9615 return FALSE;
b49e97c9 9616
0a44bf69
RS
9617 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_GOTSYM, 0))
9618 return FALSE;
9619
9620 if (IRIX_COMPAT (dynobj) == ict_irix5
9621 && ! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_HIPAGENO, 0))
9622 return FALSE;
9623
9624 if (IRIX_COMPAT (dynobj) == ict_irix6
9625 && (bfd_get_section_by_name
af0edeb8 9626 (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (dynobj)))
0a44bf69
RS
9627 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_OPTIONS, 0))
9628 return FALSE;
9629 }
861fb55a
DJ
9630 if (htab->splt->size > 0)
9631 {
9632 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTREL, 0))
9633 return FALSE;
9634
9635 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_JMPREL, 0))
9636 return FALSE;
9637
9638 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTRELSZ, 0))
9639 return FALSE;
9640
9641 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_PLTGOT, 0))
9642 return FALSE;
9643 }
7a2b07ff
NS
9644 if (htab->is_vxworks
9645 && !elf_vxworks_add_dynamic_entries (output_bfd, info))
9646 return FALSE;
b49e97c9
TS
9647 }
9648
b34976b6 9649 return TRUE;
b49e97c9
TS
9650}
9651\f
81d43bff
RS
9652/* REL is a relocation in INPUT_BFD that is being copied to OUTPUT_BFD.
9653 Adjust its R_ADDEND field so that it is correct for the output file.
9654 LOCAL_SYMS and LOCAL_SECTIONS are arrays of INPUT_BFD's local symbols
9655 and sections respectively; both use symbol indexes. */
9656
9657static void
9658mips_elf_adjust_addend (bfd *output_bfd, struct bfd_link_info *info,
9659 bfd *input_bfd, Elf_Internal_Sym *local_syms,
9660 asection **local_sections, Elf_Internal_Rela *rel)
9661{
9662 unsigned int r_type, r_symndx;
9663 Elf_Internal_Sym *sym;
9664 asection *sec;
9665
020d7251 9666 if (mips_elf_local_relocation_p (input_bfd, rel, local_sections))
81d43bff
RS
9667 {
9668 r_type = ELF_R_TYPE (output_bfd, rel->r_info);
df58fc94 9669 if (gprel16_reloc_p (r_type)
81d43bff 9670 || r_type == R_MIPS_GPREL32
df58fc94 9671 || literal_reloc_p (r_type))
81d43bff
RS
9672 {
9673 rel->r_addend += _bfd_get_gp_value (input_bfd);
9674 rel->r_addend -= _bfd_get_gp_value (output_bfd);
9675 }
9676
9677 r_symndx = ELF_R_SYM (output_bfd, rel->r_info);
9678 sym = local_syms + r_symndx;
9679
9680 /* Adjust REL's addend to account for section merging. */
9681 if (!info->relocatable)
9682 {
9683 sec = local_sections[r_symndx];
9684 _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
9685 }
9686
9687 /* This would normally be done by the rela_normal code in elflink.c. */
9688 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
9689 rel->r_addend += local_sections[r_symndx]->output_offset;
9690 }
9691}
9692
545fd46b
MR
9693/* Handle relocations against symbols from removed linkonce sections,
9694 or sections discarded by a linker script. We use this wrapper around
9695 RELOC_AGAINST_DISCARDED_SECTION to handle triplets of compound relocs
9696 on 64-bit ELF targets. In this case for any relocation handled, which
9697 always be the first in a triplet, the remaining two have to be processed
9698 together with the first, even if they are R_MIPS_NONE. It is the symbol
9699 index referred by the first reloc that applies to all the three and the
9700 remaining two never refer to an object symbol. And it is the final
9701 relocation (the last non-null one) that determines the output field of
9702 the whole relocation so retrieve the corresponding howto structure for
9703 the relocatable field to be cleared by RELOC_AGAINST_DISCARDED_SECTION.
9704
9705 Note that RELOC_AGAINST_DISCARDED_SECTION is a macro that uses "continue"
9706 and therefore requires to be pasted in a loop. It also defines a block
9707 and does not protect any of its arguments, hence the extra brackets. */
9708
9709static void
9710mips_reloc_against_discarded_section (bfd *output_bfd,
9711 struct bfd_link_info *info,
9712 bfd *input_bfd, asection *input_section,
9713 Elf_Internal_Rela **rel,
9714 const Elf_Internal_Rela **relend,
9715 bfd_boolean rel_reloc,
9716 reloc_howto_type *howto,
9717 bfd_byte *contents)
9718{
9719 const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
9720 int count = bed->s->int_rels_per_ext_rel;
9721 unsigned int r_type;
9722 int i;
9723
9724 for (i = count - 1; i > 0; i--)
9725 {
9726 r_type = ELF_R_TYPE (output_bfd, (*rel)[i].r_info);
9727 if (r_type != R_MIPS_NONE)
9728 {
9729 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type, !rel_reloc);
9730 break;
9731 }
9732 }
9733 do
9734 {
9735 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
9736 (*rel), count, (*relend),
9737 howto, i, contents);
9738 }
9739 while (0);
9740}
9741
b49e97c9
TS
9742/* Relocate a MIPS ELF section. */
9743
b34976b6 9744bfd_boolean
9719ad41
RS
9745_bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
9746 bfd *input_bfd, asection *input_section,
9747 bfd_byte *contents, Elf_Internal_Rela *relocs,
9748 Elf_Internal_Sym *local_syms,
9749 asection **local_sections)
b49e97c9
TS
9750{
9751 Elf_Internal_Rela *rel;
9752 const Elf_Internal_Rela *relend;
9753 bfd_vma addend = 0;
b34976b6 9754 bfd_boolean use_saved_addend_p = FALSE;
9c5bfbb7 9755 const struct elf_backend_data *bed;
b49e97c9
TS
9756
9757 bed = get_elf_backend_data (output_bfd);
9758 relend = relocs + input_section->reloc_count * bed->s->int_rels_per_ext_rel;
9759 for (rel = relocs; rel < relend; ++rel)
9760 {
9761 const char *name;
c9adbffe 9762 bfd_vma value = 0;
b49e97c9 9763 reloc_howto_type *howto;
ad3d9127 9764 bfd_boolean cross_mode_jump_p = FALSE;
b34976b6 9765 /* TRUE if the relocation is a RELA relocation, rather than a
b49e97c9 9766 REL relocation. */
b34976b6 9767 bfd_boolean rela_relocation_p = TRUE;
b49e97c9 9768 unsigned int r_type = ELF_R_TYPE (output_bfd, rel->r_info);
9719ad41 9769 const char *msg;
ab96bf03
AM
9770 unsigned long r_symndx;
9771 asection *sec;
749b8d9d
L
9772 Elf_Internal_Shdr *symtab_hdr;
9773 struct elf_link_hash_entry *h;
d4730f92 9774 bfd_boolean rel_reloc;
b49e97c9 9775
d4730f92
BS
9776 rel_reloc = (NEWABI_P (input_bfd)
9777 && mips_elf_rel_relocation_p (input_bfd, input_section,
9778 relocs, rel));
b49e97c9 9779 /* Find the relocation howto for this relocation. */
d4730f92 9780 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type, !rel_reloc);
ab96bf03
AM
9781
9782 r_symndx = ELF_R_SYM (input_bfd, rel->r_info);
749b8d9d 9783 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
020d7251 9784 if (mips_elf_local_relocation_p (input_bfd, rel, local_sections))
749b8d9d
L
9785 {
9786 sec = local_sections[r_symndx];
9787 h = NULL;
9788 }
ab96bf03
AM
9789 else
9790 {
ab96bf03 9791 unsigned long extsymoff;
ab96bf03 9792
ab96bf03
AM
9793 extsymoff = 0;
9794 if (!elf_bad_symtab (input_bfd))
9795 extsymoff = symtab_hdr->sh_info;
9796 h = elf_sym_hashes (input_bfd) [r_symndx - extsymoff];
9797 while (h->root.type == bfd_link_hash_indirect
9798 || h->root.type == bfd_link_hash_warning)
9799 h = (struct elf_link_hash_entry *) h->root.u.i.link;
9800
9801 sec = NULL;
9802 if (h->root.type == bfd_link_hash_defined
9803 || h->root.type == bfd_link_hash_defweak)
9804 sec = h->root.u.def.section;
9805 }
9806
dbaa2011 9807 if (sec != NULL && discarded_section (sec))
545fd46b
MR
9808 {
9809 mips_reloc_against_discarded_section (output_bfd, info, input_bfd,
9810 input_section, &rel, &relend,
9811 rel_reloc, howto, contents);
9812 continue;
9813 }
ab96bf03 9814
4a14403c 9815 if (r_type == R_MIPS_64 && ! NEWABI_P (input_bfd))
b49e97c9
TS
9816 {
9817 /* Some 32-bit code uses R_MIPS_64. In particular, people use
9818 64-bit code, but make sure all their addresses are in the
9819 lowermost or uppermost 32-bit section of the 64-bit address
9820 space. Thus, when they use an R_MIPS_64 they mean what is
9821 usually meant by R_MIPS_32, with the exception that the
9822 stored value is sign-extended to 64 bits. */
b34976b6 9823 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, R_MIPS_32, FALSE);
b49e97c9
TS
9824
9825 /* On big-endian systems, we need to lie about the position
9826 of the reloc. */
9827 if (bfd_big_endian (input_bfd))
9828 rel->r_offset += 4;
9829 }
b49e97c9
TS
9830
9831 if (!use_saved_addend_p)
9832 {
b49e97c9
TS
9833 /* If these relocations were originally of the REL variety,
9834 we must pull the addend out of the field that will be
9835 relocated. Otherwise, we simply use the contents of the
c224138d
RS
9836 RELA relocation. */
9837 if (mips_elf_rel_relocation_p (input_bfd, input_section,
9838 relocs, rel))
b49e97c9 9839 {
b34976b6 9840 rela_relocation_p = FALSE;
c224138d
RS
9841 addend = mips_elf_read_rel_addend (input_bfd, rel,
9842 howto, contents);
738e5348
RS
9843 if (hi16_reloc_p (r_type)
9844 || (got16_reloc_p (r_type)
b49e97c9 9845 && mips_elf_local_relocation_p (input_bfd, rel,
020d7251 9846 local_sections)))
b49e97c9 9847 {
c224138d
RS
9848 if (!mips_elf_add_lo16_rel_addend (input_bfd, rel, relend,
9849 contents, &addend))
749b8d9d 9850 {
749b8d9d
L
9851 if (h)
9852 name = h->root.root.string;
9853 else
9854 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
9855 local_syms + r_symndx,
9856 sec);
9857 (*_bfd_error_handler)
9858 (_("%B: Can't find matching LO16 reloc against `%s' for %s at 0x%lx in section `%A'"),
9859 input_bfd, input_section, name, howto->name,
9860 rel->r_offset);
749b8d9d 9861 }
b49e97c9 9862 }
30ac9238
RS
9863 else
9864 addend <<= howto->rightshift;
b49e97c9
TS
9865 }
9866 else
9867 addend = rel->r_addend;
81d43bff
RS
9868 mips_elf_adjust_addend (output_bfd, info, input_bfd,
9869 local_syms, local_sections, rel);
b49e97c9
TS
9870 }
9871
1049f94e 9872 if (info->relocatable)
b49e97c9 9873 {
4a14403c 9874 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd)
b49e97c9
TS
9875 && bfd_big_endian (input_bfd))
9876 rel->r_offset -= 4;
9877
81d43bff 9878 if (!rela_relocation_p && rel->r_addend)
5a659663 9879 {
81d43bff 9880 addend += rel->r_addend;
738e5348 9881 if (hi16_reloc_p (r_type) || got16_reloc_p (r_type))
5a659663
TS
9882 addend = mips_elf_high (addend);
9883 else if (r_type == R_MIPS_HIGHER)
9884 addend = mips_elf_higher (addend);
9885 else if (r_type == R_MIPS_HIGHEST)
9886 addend = mips_elf_highest (addend);
30ac9238
RS
9887 else
9888 addend >>= howto->rightshift;
b49e97c9 9889
30ac9238
RS
9890 /* We use the source mask, rather than the destination
9891 mask because the place to which we are writing will be
9892 source of the addend in the final link. */
b49e97c9
TS
9893 addend &= howto->src_mask;
9894
5a659663 9895 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
b49e97c9
TS
9896 /* See the comment above about using R_MIPS_64 in the 32-bit
9897 ABI. Here, we need to update the addend. It would be
9898 possible to get away with just using the R_MIPS_32 reloc
9899 but for endianness. */
9900 {
9901 bfd_vma sign_bits;
9902 bfd_vma low_bits;
9903 bfd_vma high_bits;
9904
9905 if (addend & ((bfd_vma) 1 << 31))
9906#ifdef BFD64
9907 sign_bits = ((bfd_vma) 1 << 32) - 1;
9908#else
9909 sign_bits = -1;
9910#endif
9911 else
9912 sign_bits = 0;
9913
9914 /* If we don't know that we have a 64-bit type,
9915 do two separate stores. */
9916 if (bfd_big_endian (input_bfd))
9917 {
9918 /* Store the sign-bits (which are most significant)
9919 first. */
9920 low_bits = sign_bits;
9921 high_bits = addend;
9922 }
9923 else
9924 {
9925 low_bits = addend;
9926 high_bits = sign_bits;
9927 }
9928 bfd_put_32 (input_bfd, low_bits,
9929 contents + rel->r_offset);
9930 bfd_put_32 (input_bfd, high_bits,
9931 contents + rel->r_offset + 4);
9932 continue;
9933 }
9934
9935 if (! mips_elf_perform_relocation (info, howto, rel, addend,
9936 input_bfd, input_section,
b34976b6
AM
9937 contents, FALSE))
9938 return FALSE;
b49e97c9
TS
9939 }
9940
9941 /* Go on to the next relocation. */
9942 continue;
9943 }
9944
9945 /* In the N32 and 64-bit ABIs there may be multiple consecutive
9946 relocations for the same offset. In that case we are
9947 supposed to treat the output of each relocation as the addend
9948 for the next. */
9949 if (rel + 1 < relend
9950 && rel->r_offset == rel[1].r_offset
9951 && ELF_R_TYPE (input_bfd, rel[1].r_info) != R_MIPS_NONE)
b34976b6 9952 use_saved_addend_p = TRUE;
b49e97c9 9953 else
b34976b6 9954 use_saved_addend_p = FALSE;
b49e97c9
TS
9955
9956 /* Figure out what value we are supposed to relocate. */
9957 switch (mips_elf_calculate_relocation (output_bfd, input_bfd,
9958 input_section, info, rel,
9959 addend, howto, local_syms,
9960 local_sections, &value,
38a7df63 9961 &name, &cross_mode_jump_p,
bce03d3d 9962 use_saved_addend_p))
b49e97c9
TS
9963 {
9964 case bfd_reloc_continue:
9965 /* There's nothing to do. */
9966 continue;
9967
9968 case bfd_reloc_undefined:
9969 /* mips_elf_calculate_relocation already called the
9970 undefined_symbol callback. There's no real point in
9971 trying to perform the relocation at this point, so we
9972 just skip ahead to the next relocation. */
9973 continue;
9974
9975 case bfd_reloc_notsupported:
9976 msg = _("internal error: unsupported relocation error");
9977 info->callbacks->warning
9978 (info, msg, name, input_bfd, input_section, rel->r_offset);
b34976b6 9979 return FALSE;
b49e97c9
TS
9980
9981 case bfd_reloc_overflow:
9982 if (use_saved_addend_p)
9983 /* Ignore overflow until we reach the last relocation for
9984 a given location. */
9985 ;
9986 else
9987 {
0e53d9da
AN
9988 struct mips_elf_link_hash_table *htab;
9989
9990 htab = mips_elf_hash_table (info);
4dfe6ac6 9991 BFD_ASSERT (htab != NULL);
b49e97c9 9992 BFD_ASSERT (name != NULL);
0e53d9da 9993 if (!htab->small_data_overflow_reported
9684f078 9994 && (gprel16_reloc_p (howto->type)
df58fc94 9995 || literal_reloc_p (howto->type)))
0e53d9da 9996 {
91d6fa6a
NC
9997 msg = _("small-data section exceeds 64KB;"
9998 " lower small-data size limit (see option -G)");
0e53d9da
AN
9999
10000 htab->small_data_overflow_reported = TRUE;
10001 (*info->callbacks->einfo) ("%P: %s\n", msg);
10002 }
b49e97c9 10003 if (! ((*info->callbacks->reloc_overflow)
dfeffb9f 10004 (info, NULL, name, howto->name, (bfd_vma) 0,
b49e97c9 10005 input_bfd, input_section, rel->r_offset)))
b34976b6 10006 return FALSE;
b49e97c9
TS
10007 }
10008 break;
10009
10010 case bfd_reloc_ok:
10011 break;
10012
df58fc94
RS
10013 case bfd_reloc_outofrange:
10014 if (jal_reloc_p (howto->type))
10015 {
10016 msg = _("JALX to a non-word-aligned address");
10017 info->callbacks->warning
10018 (info, msg, name, input_bfd, input_section, rel->r_offset);
10019 return FALSE;
10020 }
10021 /* Fall through. */
10022
b49e97c9
TS
10023 default:
10024 abort ();
10025 break;
10026 }
10027
10028 /* If we've got another relocation for the address, keep going
10029 until we reach the last one. */
10030 if (use_saved_addend_p)
10031 {
10032 addend = value;
10033 continue;
10034 }
10035
4a14403c 10036 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
b49e97c9
TS
10037 /* See the comment above about using R_MIPS_64 in the 32-bit
10038 ABI. Until now, we've been using the HOWTO for R_MIPS_32;
10039 that calculated the right value. Now, however, we
10040 sign-extend the 32-bit result to 64-bits, and store it as a
10041 64-bit value. We are especially generous here in that we
10042 go to extreme lengths to support this usage on systems with
10043 only a 32-bit VMA. */
10044 {
10045 bfd_vma sign_bits;
10046 bfd_vma low_bits;
10047 bfd_vma high_bits;
10048
10049 if (value & ((bfd_vma) 1 << 31))
10050#ifdef BFD64
10051 sign_bits = ((bfd_vma) 1 << 32) - 1;
10052#else
10053 sign_bits = -1;
10054#endif
10055 else
10056 sign_bits = 0;
10057
10058 /* If we don't know that we have a 64-bit type,
10059 do two separate stores. */
10060 if (bfd_big_endian (input_bfd))
10061 {
10062 /* Undo what we did above. */
10063 rel->r_offset -= 4;
10064 /* Store the sign-bits (which are most significant)
10065 first. */
10066 low_bits = sign_bits;
10067 high_bits = value;
10068 }
10069 else
10070 {
10071 low_bits = value;
10072 high_bits = sign_bits;
10073 }
10074 bfd_put_32 (input_bfd, low_bits,
10075 contents + rel->r_offset);
10076 bfd_put_32 (input_bfd, high_bits,
10077 contents + rel->r_offset + 4);
10078 continue;
10079 }
10080
10081 /* Actually perform the relocation. */
10082 if (! mips_elf_perform_relocation (info, howto, rel, value,
10083 input_bfd, input_section,
38a7df63 10084 contents, cross_mode_jump_p))
b34976b6 10085 return FALSE;
b49e97c9
TS
10086 }
10087
b34976b6 10088 return TRUE;
b49e97c9
TS
10089}
10090\f
861fb55a
DJ
10091/* A function that iterates over each entry in la25_stubs and fills
10092 in the code for each one. DATA points to a mips_htab_traverse_info. */
10093
10094static int
10095mips_elf_create_la25_stub (void **slot, void *data)
10096{
10097 struct mips_htab_traverse_info *hti;
10098 struct mips_elf_link_hash_table *htab;
10099 struct mips_elf_la25_stub *stub;
10100 asection *s;
10101 bfd_byte *loc;
10102 bfd_vma offset, target, target_high, target_low;
10103
10104 stub = (struct mips_elf_la25_stub *) *slot;
10105 hti = (struct mips_htab_traverse_info *) data;
10106 htab = mips_elf_hash_table (hti->info);
4dfe6ac6 10107 BFD_ASSERT (htab != NULL);
861fb55a
DJ
10108
10109 /* Create the section contents, if we haven't already. */
10110 s = stub->stub_section;
10111 loc = s->contents;
10112 if (loc == NULL)
10113 {
10114 loc = bfd_malloc (s->size);
10115 if (loc == NULL)
10116 {
10117 hti->error = TRUE;
10118 return FALSE;
10119 }
10120 s->contents = loc;
10121 }
10122
10123 /* Work out where in the section this stub should go. */
10124 offset = stub->offset;
10125
10126 /* Work out the target address. */
8f0c309a
CLT
10127 target = mips_elf_get_la25_target (stub, &s);
10128 target += s->output_section->vma + s->output_offset;
10129
861fb55a
DJ
10130 target_high = ((target + 0x8000) >> 16) & 0xffff;
10131 target_low = (target & 0xffff);
10132
10133 if (stub->stub_section != htab->strampoline)
10134 {
df58fc94 10135 /* This is a simple LUI/ADDIU stub. Zero out the beginning
861fb55a
DJ
10136 of the section and write the two instructions at the end. */
10137 memset (loc, 0, offset);
10138 loc += offset;
df58fc94
RS
10139 if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
10140 {
d21911ea
MR
10141 bfd_put_micromips_32 (hti->output_bfd,
10142 LA25_LUI_MICROMIPS (target_high),
10143 loc);
10144 bfd_put_micromips_32 (hti->output_bfd,
10145 LA25_ADDIU_MICROMIPS (target_low),
10146 loc + 4);
df58fc94
RS
10147 }
10148 else
10149 {
10150 bfd_put_32 (hti->output_bfd, LA25_LUI (target_high), loc);
10151 bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 4);
10152 }
861fb55a
DJ
10153 }
10154 else
10155 {
10156 /* This is trampoline. */
10157 loc += offset;
df58fc94
RS
10158 if (ELF_ST_IS_MICROMIPS (stub->h->root.other))
10159 {
d21911ea
MR
10160 bfd_put_micromips_32 (hti->output_bfd,
10161 LA25_LUI_MICROMIPS (target_high), loc);
10162 bfd_put_micromips_32 (hti->output_bfd,
10163 LA25_J_MICROMIPS (target), loc + 4);
10164 bfd_put_micromips_32 (hti->output_bfd,
10165 LA25_ADDIU_MICROMIPS (target_low), loc + 8);
df58fc94
RS
10166 bfd_put_32 (hti->output_bfd, 0, loc + 12);
10167 }
10168 else
10169 {
10170 bfd_put_32 (hti->output_bfd, LA25_LUI (target_high), loc);
10171 bfd_put_32 (hti->output_bfd, LA25_J (target), loc + 4);
10172 bfd_put_32 (hti->output_bfd, LA25_ADDIU (target_low), loc + 8);
10173 bfd_put_32 (hti->output_bfd, 0, loc + 12);
10174 }
861fb55a
DJ
10175 }
10176 return TRUE;
10177}
10178
b49e97c9
TS
10179/* If NAME is one of the special IRIX6 symbols defined by the linker,
10180 adjust it appropriately now. */
10181
10182static void
9719ad41
RS
10183mips_elf_irix6_finish_dynamic_symbol (bfd *abfd ATTRIBUTE_UNUSED,
10184 const char *name, Elf_Internal_Sym *sym)
b49e97c9
TS
10185{
10186 /* The linker script takes care of providing names and values for
10187 these, but we must place them into the right sections. */
10188 static const char* const text_section_symbols[] = {
10189 "_ftext",
10190 "_etext",
10191 "__dso_displacement",
10192 "__elf_header",
10193 "__program_header_table",
10194 NULL
10195 };
10196
10197 static const char* const data_section_symbols[] = {
10198 "_fdata",
10199 "_edata",
10200 "_end",
10201 "_fbss",
10202 NULL
10203 };
10204
10205 const char* const *p;
10206 int i;
10207
10208 for (i = 0; i < 2; ++i)
10209 for (p = (i == 0) ? text_section_symbols : data_section_symbols;
10210 *p;
10211 ++p)
10212 if (strcmp (*p, name) == 0)
10213 {
10214 /* All of these symbols are given type STT_SECTION by the
10215 IRIX6 linker. */
10216 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
e10609d3 10217 sym->st_other = STO_PROTECTED;
b49e97c9
TS
10218
10219 /* The IRIX linker puts these symbols in special sections. */
10220 if (i == 0)
10221 sym->st_shndx = SHN_MIPS_TEXT;
10222 else
10223 sym->st_shndx = SHN_MIPS_DATA;
10224
10225 break;
10226 }
10227}
10228
10229/* Finish up dynamic symbol handling. We set the contents of various
10230 dynamic sections here. */
10231
b34976b6 10232bfd_boolean
9719ad41
RS
10233_bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
10234 struct bfd_link_info *info,
10235 struct elf_link_hash_entry *h,
10236 Elf_Internal_Sym *sym)
b49e97c9
TS
10237{
10238 bfd *dynobj;
b49e97c9 10239 asection *sgot;
f4416af6 10240 struct mips_got_info *g, *gg;
b49e97c9 10241 const char *name;
3d6746ca 10242 int idx;
5108fc1b 10243 struct mips_elf_link_hash_table *htab;
738e5348 10244 struct mips_elf_link_hash_entry *hmips;
b49e97c9 10245
5108fc1b 10246 htab = mips_elf_hash_table (info);
4dfe6ac6 10247 BFD_ASSERT (htab != NULL);
b49e97c9 10248 dynobj = elf_hash_table (info)->dynobj;
738e5348 10249 hmips = (struct mips_elf_link_hash_entry *) h;
b49e97c9 10250
861fb55a
DJ
10251 BFD_ASSERT (!htab->is_vxworks);
10252
1bbce132
MR
10253 if (h->plt.plist != NULL
10254 && (h->plt.plist->mips_offset != MINUS_ONE
10255 || h->plt.plist->comp_offset != MINUS_ONE))
861fb55a
DJ
10256 {
10257 /* We've decided to create a PLT entry for this symbol. */
10258 bfd_byte *loc;
1bbce132 10259 bfd_vma header_address, got_address;
861fb55a 10260 bfd_vma got_address_high, got_address_low, load;
1bbce132
MR
10261 bfd_vma got_index;
10262 bfd_vma isa_bit;
10263
10264 got_index = h->plt.plist->gotplt_index;
861fb55a
DJ
10265
10266 BFD_ASSERT (htab->use_plts_and_copy_relocs);
10267 BFD_ASSERT (h->dynindx != -1);
10268 BFD_ASSERT (htab->splt != NULL);
1bbce132 10269 BFD_ASSERT (got_index != MINUS_ONE);
861fb55a
DJ
10270 BFD_ASSERT (!h->def_regular);
10271
10272 /* Calculate the address of the PLT header. */
1bbce132 10273 isa_bit = htab->plt_header_is_comp;
861fb55a 10274 header_address = (htab->splt->output_section->vma
1bbce132 10275 + htab->splt->output_offset + isa_bit);
861fb55a
DJ
10276
10277 /* Calculate the address of the .got.plt entry. */
10278 got_address = (htab->sgotplt->output_section->vma
10279 + htab->sgotplt->output_offset
1bbce132
MR
10280 + got_index * MIPS_ELF_GOT_SIZE (dynobj));
10281
861fb55a
DJ
10282 got_address_high = ((got_address + 0x8000) >> 16) & 0xffff;
10283 got_address_low = got_address & 0xffff;
10284
10285 /* Initially point the .got.plt entry at the PLT header. */
1bbce132 10286 loc = (htab->sgotplt->contents + got_index * MIPS_ELF_GOT_SIZE (dynobj));
861fb55a
DJ
10287 if (ABI_64_P (output_bfd))
10288 bfd_put_64 (output_bfd, header_address, loc);
10289 else
10290 bfd_put_32 (output_bfd, header_address, loc);
10291
1bbce132
MR
10292 /* Now handle the PLT itself. First the standard entry (the order
10293 does not matter, we just have to pick one). */
10294 if (h->plt.plist->mips_offset != MINUS_ONE)
10295 {
10296 const bfd_vma *plt_entry;
10297 bfd_vma plt_offset;
861fb55a 10298
1bbce132 10299 plt_offset = htab->plt_header_size + h->plt.plist->mips_offset;
861fb55a 10300
1bbce132 10301 BFD_ASSERT (plt_offset <= htab->splt->size);
6d30f5b2 10302
1bbce132
MR
10303 /* Find out where the .plt entry should go. */
10304 loc = htab->splt->contents + plt_offset;
10305
10306 /* Pick the load opcode. */
10307 load = MIPS_ELF_LOAD_WORD (output_bfd);
10308
10309 /* Fill in the PLT entry itself. */
10310 plt_entry = mips_exec_plt_entry;
10311 bfd_put_32 (output_bfd, plt_entry[0] | got_address_high, loc);
10312 bfd_put_32 (output_bfd, plt_entry[1] | got_address_low | load,
10313 loc + 4);
10314
10315 if (! LOAD_INTERLOCKS_P (output_bfd))
10316 {
10317 bfd_put_32 (output_bfd, plt_entry[2] | got_address_low, loc + 8);
10318 bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
10319 }
10320 else
10321 {
10322 bfd_put_32 (output_bfd, plt_entry[3], loc + 8);
10323 bfd_put_32 (output_bfd, plt_entry[2] | got_address_low,
10324 loc + 12);
10325 }
6d30f5b2 10326 }
1bbce132
MR
10327
10328 /* Now the compressed entry. They come after any standard ones. */
10329 if (h->plt.plist->comp_offset != MINUS_ONE)
6d30f5b2 10330 {
1bbce132
MR
10331 bfd_vma plt_offset;
10332
10333 plt_offset = (htab->plt_header_size + htab->plt_mips_offset
10334 + h->plt.plist->comp_offset);
10335
10336 BFD_ASSERT (plt_offset <= htab->splt->size);
10337
10338 /* Find out where the .plt entry should go. */
10339 loc = htab->splt->contents + plt_offset;
10340
10341 /* Fill in the PLT entry itself. */
833794fc
MR
10342 if (!MICROMIPS_P (output_bfd))
10343 {
10344 const bfd_vma *plt_entry = mips16_o32_exec_plt_entry;
10345
10346 bfd_put_16 (output_bfd, plt_entry[0], loc);
10347 bfd_put_16 (output_bfd, plt_entry[1], loc + 2);
10348 bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
10349 bfd_put_16 (output_bfd, plt_entry[3], loc + 6);
10350 bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
10351 bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
10352 bfd_put_32 (output_bfd, got_address, loc + 12);
10353 }
10354 else if (htab->insn32)
10355 {
10356 const bfd_vma *plt_entry = micromips_insn32_o32_exec_plt_entry;
10357
10358 bfd_put_16 (output_bfd, plt_entry[0], loc);
10359 bfd_put_16 (output_bfd, got_address_high, loc + 2);
10360 bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
10361 bfd_put_16 (output_bfd, got_address_low, loc + 6);
10362 bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
10363 bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
10364 bfd_put_16 (output_bfd, plt_entry[6], loc + 12);
10365 bfd_put_16 (output_bfd, got_address_low, loc + 14);
10366 }
10367 else
1bbce132
MR
10368 {
10369 const bfd_vma *plt_entry = micromips_o32_exec_plt_entry;
10370 bfd_signed_vma gotpc_offset;
10371 bfd_vma loc_address;
10372
10373 BFD_ASSERT (got_address % 4 == 0);
10374
10375 loc_address = (htab->splt->output_section->vma
10376 + htab->splt->output_offset + plt_offset);
10377 gotpc_offset = got_address - ((loc_address | 3) ^ 3);
10378
10379 /* ADDIUPC has a span of +/-16MB, check we're in range. */
10380 if (gotpc_offset + 0x1000000 >= 0x2000000)
10381 {
10382 (*_bfd_error_handler)
10383 (_("%B: `%A' offset of %ld from `%A' "
10384 "beyond the range of ADDIUPC"),
10385 output_bfd,
10386 htab->sgotplt->output_section,
10387 htab->splt->output_section,
10388 (long) gotpc_offset);
10389 bfd_set_error (bfd_error_no_error);
10390 return FALSE;
10391 }
10392 bfd_put_16 (output_bfd,
10393 plt_entry[0] | ((gotpc_offset >> 18) & 0x7f), loc);
10394 bfd_put_16 (output_bfd, (gotpc_offset >> 2) & 0xffff, loc + 2);
10395 bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
10396 bfd_put_16 (output_bfd, plt_entry[3], loc + 6);
10397 bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
10398 bfd_put_16 (output_bfd, plt_entry[5], loc + 10);
10399 }
6d30f5b2 10400 }
861fb55a
DJ
10401
10402 /* Emit an R_MIPS_JUMP_SLOT relocation against the .got.plt entry. */
10403 mips_elf_output_dynamic_relocation (output_bfd, htab->srelplt,
1bbce132 10404 got_index - 2, h->dynindx,
861fb55a
DJ
10405 R_MIPS_JUMP_SLOT, got_address);
10406
10407 /* We distinguish between PLT entries and lazy-binding stubs by
10408 giving the former an st_other value of STO_MIPS_PLT. Set the
10409 flag and leave the value if there are any relocations in the
10410 binary where pointer equality matters. */
10411 sym->st_shndx = SHN_UNDEF;
10412 if (h->pointer_equality_needed)
1bbce132 10413 sym->st_other = ELF_ST_SET_MIPS_PLT (sym->st_other);
861fb55a 10414 else
1bbce132
MR
10415 {
10416 sym->st_value = 0;
10417 sym->st_other = 0;
10418 }
861fb55a 10419 }
1bbce132
MR
10420
10421 if (h->plt.plist != NULL && h->plt.plist->stub_offset != MINUS_ONE)
b49e97c9 10422 {
861fb55a 10423 /* We've decided to create a lazy-binding stub. */
1bbce132
MR
10424 bfd_boolean micromips_p = MICROMIPS_P (output_bfd);
10425 unsigned int other = micromips_p ? STO_MICROMIPS : 0;
10426 bfd_vma stub_size = htab->function_stub_size;
5108fc1b 10427 bfd_byte stub[MIPS_FUNCTION_STUB_BIG_SIZE];
1bbce132
MR
10428 bfd_vma isa_bit = micromips_p;
10429 bfd_vma stub_big_size;
10430
833794fc 10431 if (!micromips_p)
1bbce132 10432 stub_big_size = MIPS_FUNCTION_STUB_BIG_SIZE;
833794fc
MR
10433 else if (htab->insn32)
10434 stub_big_size = MICROMIPS_INSN32_FUNCTION_STUB_BIG_SIZE;
10435 else
10436 stub_big_size = MICROMIPS_FUNCTION_STUB_BIG_SIZE;
b49e97c9
TS
10437
10438 /* This symbol has a stub. Set it up. */
10439
10440 BFD_ASSERT (h->dynindx != -1);
10441
1bbce132 10442 BFD_ASSERT (stub_size == stub_big_size || h->dynindx <= 0xffff);
3d6746ca
DD
10443
10444 /* Values up to 2^31 - 1 are allowed. Larger values would cause
5108fc1b
RS
10445 sign extension at runtime in the stub, resulting in a negative
10446 index value. */
10447 if (h->dynindx & ~0x7fffffff)
b34976b6 10448 return FALSE;
b49e97c9
TS
10449
10450 /* Fill the stub. */
1bbce132
MR
10451 if (micromips_p)
10452 {
10453 idx = 0;
10454 bfd_put_micromips_32 (output_bfd, STUB_LW_MICROMIPS (output_bfd),
10455 stub + idx);
10456 idx += 4;
833794fc
MR
10457 if (htab->insn32)
10458 {
10459 bfd_put_micromips_32 (output_bfd,
10460 STUB_MOVE32_MICROMIPS (output_bfd),
10461 stub + idx);
10462 idx += 4;
10463 }
10464 else
10465 {
10466 bfd_put_16 (output_bfd, STUB_MOVE_MICROMIPS, stub + idx);
10467 idx += 2;
10468 }
1bbce132
MR
10469 if (stub_size == stub_big_size)
10470 {
10471 long dynindx_hi = (h->dynindx >> 16) & 0x7fff;
10472
10473 bfd_put_micromips_32 (output_bfd,
10474 STUB_LUI_MICROMIPS (dynindx_hi),
10475 stub + idx);
10476 idx += 4;
10477 }
833794fc
MR
10478 if (htab->insn32)
10479 {
10480 bfd_put_micromips_32 (output_bfd, STUB_JALR32_MICROMIPS,
10481 stub + idx);
10482 idx += 4;
10483 }
10484 else
10485 {
10486 bfd_put_16 (output_bfd, STUB_JALR_MICROMIPS, stub + idx);
10487 idx += 2;
10488 }
1bbce132
MR
10489
10490 /* If a large stub is not required and sign extension is not a
10491 problem, then use legacy code in the stub. */
10492 if (stub_size == stub_big_size)
10493 bfd_put_micromips_32 (output_bfd,
10494 STUB_ORI_MICROMIPS (h->dynindx & 0xffff),
10495 stub + idx);
10496 else if (h->dynindx & ~0x7fff)
10497 bfd_put_micromips_32 (output_bfd,
10498 STUB_LI16U_MICROMIPS (h->dynindx & 0xffff),
10499 stub + idx);
10500 else
10501 bfd_put_micromips_32 (output_bfd,
10502 STUB_LI16S_MICROMIPS (output_bfd,
10503 h->dynindx),
10504 stub + idx);
10505 }
3d6746ca 10506 else
1bbce132
MR
10507 {
10508 idx = 0;
10509 bfd_put_32 (output_bfd, STUB_LW (output_bfd), stub + idx);
10510 idx += 4;
10511 bfd_put_32 (output_bfd, STUB_MOVE (output_bfd), stub + idx);
10512 idx += 4;
10513 if (stub_size == stub_big_size)
10514 {
10515 bfd_put_32 (output_bfd, STUB_LUI ((h->dynindx >> 16) & 0x7fff),
10516 stub + idx);
10517 idx += 4;
10518 }
10519 bfd_put_32 (output_bfd, STUB_JALR, stub + idx);
10520 idx += 4;
10521
10522 /* If a large stub is not required and sign extension is not a
10523 problem, then use legacy code in the stub. */
10524 if (stub_size == stub_big_size)
10525 bfd_put_32 (output_bfd, STUB_ORI (h->dynindx & 0xffff),
10526 stub + idx);
10527 else if (h->dynindx & ~0x7fff)
10528 bfd_put_32 (output_bfd, STUB_LI16U (h->dynindx & 0xffff),
10529 stub + idx);
10530 else
10531 bfd_put_32 (output_bfd, STUB_LI16S (output_bfd, h->dynindx),
10532 stub + idx);
10533 }
5108fc1b 10534
1bbce132
MR
10535 BFD_ASSERT (h->plt.plist->stub_offset <= htab->sstubs->size);
10536 memcpy (htab->sstubs->contents + h->plt.plist->stub_offset,
10537 stub, stub_size);
b49e97c9 10538
1bbce132 10539 /* Mark the symbol as undefined. stub_offset != -1 occurs
b49e97c9
TS
10540 only for the referenced symbol. */
10541 sym->st_shndx = SHN_UNDEF;
10542
10543 /* The run-time linker uses the st_value field of the symbol
10544 to reset the global offset table entry for this external
10545 to its stub address when unlinking a shared object. */
4e41d0d7
RS
10546 sym->st_value = (htab->sstubs->output_section->vma
10547 + htab->sstubs->output_offset
1bbce132
MR
10548 + h->plt.plist->stub_offset
10549 + isa_bit);
10550 sym->st_other = other;
b49e97c9
TS
10551 }
10552
738e5348
RS
10553 /* If we have a MIPS16 function with a stub, the dynamic symbol must
10554 refer to the stub, since only the stub uses the standard calling
10555 conventions. */
10556 if (h->dynindx != -1 && hmips->fn_stub != NULL)
10557 {
10558 BFD_ASSERT (hmips->need_fn_stub);
10559 sym->st_value = (hmips->fn_stub->output_section->vma
10560 + hmips->fn_stub->output_offset);
10561 sym->st_size = hmips->fn_stub->size;
10562 sym->st_other = ELF_ST_VISIBILITY (sym->st_other);
10563 }
10564
b49e97c9 10565 BFD_ASSERT (h->dynindx != -1
f5385ebf 10566 || h->forced_local);
b49e97c9 10567
23cc69b6 10568 sgot = htab->sgot;
a8028dd0 10569 g = htab->got_info;
b49e97c9
TS
10570 BFD_ASSERT (g != NULL);
10571
10572 /* Run through the global symbol table, creating GOT entries for all
10573 the symbols that need them. */
020d7251 10574 if (hmips->global_got_area != GGA_NONE)
b49e97c9
TS
10575 {
10576 bfd_vma offset;
10577 bfd_vma value;
10578
6eaa6adc 10579 value = sym->st_value;
13fbec83 10580 offset = mips_elf_primary_global_got_index (output_bfd, info, h);
b49e97c9
TS
10581 MIPS_ELF_PUT_WORD (output_bfd, value, sgot->contents + offset);
10582 }
10583
e641e783 10584 if (hmips->global_got_area != GGA_NONE && g->next)
f4416af6
AO
10585 {
10586 struct mips_got_entry e, *p;
0626d451 10587 bfd_vma entry;
f4416af6 10588 bfd_vma offset;
f4416af6
AO
10589
10590 gg = g;
10591
10592 e.abfd = output_bfd;
10593 e.symndx = -1;
738e5348 10594 e.d.h = hmips;
9ab066b4 10595 e.tls_type = GOT_TLS_NONE;
143d77c5 10596
f4416af6
AO
10597 for (g = g->next; g->next != gg; g = g->next)
10598 {
10599 if (g->got_entries
10600 && (p = (struct mips_got_entry *) htab_find (g->got_entries,
10601 &e)))
10602 {
10603 offset = p->gotidx;
6c42ddb9 10604 BFD_ASSERT (offset > 0 && offset < htab->sgot->size);
0626d451
RS
10605 if (info->shared
10606 || (elf_hash_table (info)->dynamic_sections_created
10607 && p->d.h != NULL
f5385ebf
AM
10608 && p->d.h->root.def_dynamic
10609 && !p->d.h->root.def_regular))
0626d451
RS
10610 {
10611 /* Create an R_MIPS_REL32 relocation for this entry. Due to
10612 the various compatibility problems, it's easier to mock
10613 up an R_MIPS_32 or R_MIPS_64 relocation and leave
10614 mips_elf_create_dynamic_relocation to calculate the
10615 appropriate addend. */
10616 Elf_Internal_Rela rel[3];
10617
10618 memset (rel, 0, sizeof (rel));
10619 if (ABI_64_P (output_bfd))
10620 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_64);
10621 else
10622 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_32);
10623 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
10624
10625 entry = 0;
10626 if (! (mips_elf_create_dynamic_relocation
10627 (output_bfd, info, rel,
10628 e.d.h, NULL, sym->st_value, &entry, sgot)))
10629 return FALSE;
10630 }
10631 else
10632 entry = sym->st_value;
10633 MIPS_ELF_PUT_WORD (output_bfd, entry, sgot->contents + offset);
f4416af6
AO
10634 }
10635 }
10636 }
10637
b49e97c9
TS
10638 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
10639 name = h->root.root.string;
9637f6ef 10640 if (h == elf_hash_table (info)->hdynamic
22edb2f1 10641 || h == elf_hash_table (info)->hgot)
b49e97c9
TS
10642 sym->st_shndx = SHN_ABS;
10643 else if (strcmp (name, "_DYNAMIC_LINK") == 0
10644 || strcmp (name, "_DYNAMIC_LINKING") == 0)
10645 {
10646 sym->st_shndx = SHN_ABS;
10647 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
10648 sym->st_value = 1;
10649 }
4a14403c 10650 else if (strcmp (name, "_gp_disp") == 0 && ! NEWABI_P (output_bfd))
b49e97c9
TS
10651 {
10652 sym->st_shndx = SHN_ABS;
10653 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
10654 sym->st_value = elf_gp (output_bfd);
10655 }
10656 else if (SGI_COMPAT (output_bfd))
10657 {
10658 if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
10659 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
10660 {
10661 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
10662 sym->st_other = STO_PROTECTED;
10663 sym->st_value = 0;
10664 sym->st_shndx = SHN_MIPS_DATA;
10665 }
10666 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
10667 {
10668 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
10669 sym->st_other = STO_PROTECTED;
10670 sym->st_value = mips_elf_hash_table (info)->procedure_count;
10671 sym->st_shndx = SHN_ABS;
10672 }
10673 else if (sym->st_shndx != SHN_UNDEF && sym->st_shndx != SHN_ABS)
10674 {
10675 if (h->type == STT_FUNC)
10676 sym->st_shndx = SHN_MIPS_TEXT;
10677 else if (h->type == STT_OBJECT)
10678 sym->st_shndx = SHN_MIPS_DATA;
10679 }
10680 }
10681
861fb55a
DJ
10682 /* Emit a copy reloc, if needed. */
10683 if (h->needs_copy)
10684 {
10685 asection *s;
10686 bfd_vma symval;
10687
10688 BFD_ASSERT (h->dynindx != -1);
10689 BFD_ASSERT (htab->use_plts_and_copy_relocs);
10690
10691 s = mips_elf_rel_dyn_section (info, FALSE);
10692 symval = (h->root.u.def.section->output_section->vma
10693 + h->root.u.def.section->output_offset
10694 + h->root.u.def.value);
10695 mips_elf_output_dynamic_relocation (output_bfd, s, s->reloc_count++,
10696 h->dynindx, R_MIPS_COPY, symval);
10697 }
10698
b49e97c9
TS
10699 /* Handle the IRIX6-specific symbols. */
10700 if (IRIX_COMPAT (output_bfd) == ict_irix6)
10701 mips_elf_irix6_finish_dynamic_symbol (output_bfd, name, sym);
10702
cbf8d970
MR
10703 /* Keep dynamic compressed symbols odd. This allows the dynamic linker
10704 to treat compressed symbols like any other. */
30c09090 10705 if (ELF_ST_IS_MIPS16 (sym->st_other))
738e5348
RS
10706 {
10707 BFD_ASSERT (sym->st_value & 1);
10708 sym->st_other -= STO_MIPS16;
10709 }
cbf8d970
MR
10710 else if (ELF_ST_IS_MICROMIPS (sym->st_other))
10711 {
10712 BFD_ASSERT (sym->st_value & 1);
10713 sym->st_other -= STO_MICROMIPS;
10714 }
b49e97c9 10715
b34976b6 10716 return TRUE;
b49e97c9
TS
10717}
10718
0a44bf69
RS
10719/* Likewise, for VxWorks. */
10720
10721bfd_boolean
10722_bfd_mips_vxworks_finish_dynamic_symbol (bfd *output_bfd,
10723 struct bfd_link_info *info,
10724 struct elf_link_hash_entry *h,
10725 Elf_Internal_Sym *sym)
10726{
10727 bfd *dynobj;
10728 asection *sgot;
10729 struct mips_got_info *g;
10730 struct mips_elf_link_hash_table *htab;
020d7251 10731 struct mips_elf_link_hash_entry *hmips;
0a44bf69
RS
10732
10733 htab = mips_elf_hash_table (info);
4dfe6ac6 10734 BFD_ASSERT (htab != NULL);
0a44bf69 10735 dynobj = elf_hash_table (info)->dynobj;
020d7251 10736 hmips = (struct mips_elf_link_hash_entry *) h;
0a44bf69 10737
1bbce132 10738 if (h->plt.plist != NULL && h->plt.plist->mips_offset != MINUS_ONE)
0a44bf69 10739 {
6d79d2ed 10740 bfd_byte *loc;
1bbce132 10741 bfd_vma plt_address, got_address, got_offset, branch_offset;
0a44bf69
RS
10742 Elf_Internal_Rela rel;
10743 static const bfd_vma *plt_entry;
1bbce132
MR
10744 bfd_vma gotplt_index;
10745 bfd_vma plt_offset;
10746
10747 plt_offset = htab->plt_header_size + h->plt.plist->mips_offset;
10748 gotplt_index = h->plt.plist->gotplt_index;
0a44bf69
RS
10749
10750 BFD_ASSERT (h->dynindx != -1);
10751 BFD_ASSERT (htab->splt != NULL);
1bbce132
MR
10752 BFD_ASSERT (gotplt_index != MINUS_ONE);
10753 BFD_ASSERT (plt_offset <= htab->splt->size);
0a44bf69
RS
10754
10755 /* Calculate the address of the .plt entry. */
10756 plt_address = (htab->splt->output_section->vma
10757 + htab->splt->output_offset
1bbce132 10758 + plt_offset);
0a44bf69
RS
10759
10760 /* Calculate the address of the .got.plt entry. */
10761 got_address = (htab->sgotplt->output_section->vma
10762 + htab->sgotplt->output_offset
1bbce132 10763 + gotplt_index * MIPS_ELF_GOT_SIZE (output_bfd));
0a44bf69
RS
10764
10765 /* Calculate the offset of the .got.plt entry from
10766 _GLOBAL_OFFSET_TABLE_. */
10767 got_offset = mips_elf_gotplt_index (info, h);
10768
10769 /* Calculate the offset for the branch at the start of the PLT
10770 entry. The branch jumps to the beginning of .plt. */
1bbce132 10771 branch_offset = -(plt_offset / 4 + 1) & 0xffff;
0a44bf69
RS
10772
10773 /* Fill in the initial value of the .got.plt entry. */
10774 bfd_put_32 (output_bfd, plt_address,
1bbce132
MR
10775 (htab->sgotplt->contents
10776 + gotplt_index * MIPS_ELF_GOT_SIZE (output_bfd)));
0a44bf69
RS
10777
10778 /* Find out where the .plt entry should go. */
1bbce132 10779 loc = htab->splt->contents + plt_offset;
0a44bf69
RS
10780
10781 if (info->shared)
10782 {
10783 plt_entry = mips_vxworks_shared_plt_entry;
10784 bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
1bbce132 10785 bfd_put_32 (output_bfd, plt_entry[1] | gotplt_index, loc + 4);
0a44bf69
RS
10786 }
10787 else
10788 {
10789 bfd_vma got_address_high, got_address_low;
10790
10791 plt_entry = mips_vxworks_exec_plt_entry;
10792 got_address_high = ((got_address + 0x8000) >> 16) & 0xffff;
10793 got_address_low = got_address & 0xffff;
10794
10795 bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
1bbce132 10796 bfd_put_32 (output_bfd, plt_entry[1] | gotplt_index, loc + 4);
0a44bf69
RS
10797 bfd_put_32 (output_bfd, plt_entry[2] | got_address_high, loc + 8);
10798 bfd_put_32 (output_bfd, plt_entry[3] | got_address_low, loc + 12);
10799 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
10800 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
10801 bfd_put_32 (output_bfd, plt_entry[6], loc + 24);
10802 bfd_put_32 (output_bfd, plt_entry[7], loc + 28);
10803
10804 loc = (htab->srelplt2->contents
1bbce132 10805 + (gotplt_index * 3 + 2) * sizeof (Elf32_External_Rela));
0a44bf69
RS
10806
10807 /* Emit a relocation for the .got.plt entry. */
10808 rel.r_offset = got_address;
10809 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
1bbce132 10810 rel.r_addend = plt_offset;
0a44bf69
RS
10811 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
10812
10813 /* Emit a relocation for the lui of %hi(<.got.plt slot>). */
10814 loc += sizeof (Elf32_External_Rela);
10815 rel.r_offset = plt_address + 8;
10816 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
10817 rel.r_addend = got_offset;
10818 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
10819
10820 /* Emit a relocation for the addiu of %lo(<.got.plt slot>). */
10821 loc += sizeof (Elf32_External_Rela);
10822 rel.r_offset += 4;
10823 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
10824 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
10825 }
10826
10827 /* Emit an R_MIPS_JUMP_SLOT relocation against the .got.plt entry. */
1bbce132
MR
10828 loc = (htab->srelplt->contents
10829 + gotplt_index * sizeof (Elf32_External_Rela));
0a44bf69
RS
10830 rel.r_offset = got_address;
10831 rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_JUMP_SLOT);
10832 rel.r_addend = 0;
10833 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
10834
10835 if (!h->def_regular)
10836 sym->st_shndx = SHN_UNDEF;
10837 }
10838
10839 BFD_ASSERT (h->dynindx != -1 || h->forced_local);
10840
23cc69b6 10841 sgot = htab->sgot;
a8028dd0 10842 g = htab->got_info;
0a44bf69
RS
10843 BFD_ASSERT (g != NULL);
10844
10845 /* See if this symbol has an entry in the GOT. */
020d7251 10846 if (hmips->global_got_area != GGA_NONE)
0a44bf69
RS
10847 {
10848 bfd_vma offset;
10849 Elf_Internal_Rela outrel;
10850 bfd_byte *loc;
10851 asection *s;
10852
10853 /* Install the symbol value in the GOT. */
13fbec83 10854 offset = mips_elf_primary_global_got_index (output_bfd, info, h);
0a44bf69
RS
10855 MIPS_ELF_PUT_WORD (output_bfd, sym->st_value, sgot->contents + offset);
10856
10857 /* Add a dynamic relocation for it. */
10858 s = mips_elf_rel_dyn_section (info, FALSE);
10859 loc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
10860 outrel.r_offset = (sgot->output_section->vma
10861 + sgot->output_offset
10862 + offset);
10863 outrel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_32);
10864 outrel.r_addend = 0;
10865 bfd_elf32_swap_reloca_out (dynobj, &outrel, loc);
10866 }
10867
10868 /* Emit a copy reloc, if needed. */
10869 if (h->needs_copy)
10870 {
10871 Elf_Internal_Rela rel;
10872
10873 BFD_ASSERT (h->dynindx != -1);
10874
10875 rel.r_offset = (h->root.u.def.section->output_section->vma
10876 + h->root.u.def.section->output_offset
10877 + h->root.u.def.value);
10878 rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_COPY);
10879 rel.r_addend = 0;
10880 bfd_elf32_swap_reloca_out (output_bfd, &rel,
10881 htab->srelbss->contents
10882 + (htab->srelbss->reloc_count
10883 * sizeof (Elf32_External_Rela)));
10884 ++htab->srelbss->reloc_count;
10885 }
10886
df58fc94
RS
10887 /* If this is a mips16/microMIPS symbol, force the value to be even. */
10888 if (ELF_ST_IS_COMPRESSED (sym->st_other))
0a44bf69
RS
10889 sym->st_value &= ~1;
10890
10891 return TRUE;
10892}
10893
861fb55a
DJ
10894/* Write out a plt0 entry to the beginning of .plt. */
10895
1bbce132 10896static bfd_boolean
861fb55a
DJ
10897mips_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
10898{
10899 bfd_byte *loc;
10900 bfd_vma gotplt_value, gotplt_value_high, gotplt_value_low;
10901 static const bfd_vma *plt_entry;
10902 struct mips_elf_link_hash_table *htab;
10903
10904 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
10905 BFD_ASSERT (htab != NULL);
10906
861fb55a
DJ
10907 if (ABI_64_P (output_bfd))
10908 plt_entry = mips_n64_exec_plt0_entry;
10909 else if (ABI_N32_P (output_bfd))
10910 plt_entry = mips_n32_exec_plt0_entry;
833794fc 10911 else if (!htab->plt_header_is_comp)
861fb55a 10912 plt_entry = mips_o32_exec_plt0_entry;
833794fc
MR
10913 else if (htab->insn32)
10914 plt_entry = micromips_insn32_o32_exec_plt0_entry;
10915 else
10916 plt_entry = micromips_o32_exec_plt0_entry;
861fb55a
DJ
10917
10918 /* Calculate the value of .got.plt. */
10919 gotplt_value = (htab->sgotplt->output_section->vma
10920 + htab->sgotplt->output_offset);
10921 gotplt_value_high = ((gotplt_value + 0x8000) >> 16) & 0xffff;
10922 gotplt_value_low = gotplt_value & 0xffff;
10923
10924 /* The PLT sequence is not safe for N64 if .got.plt's address can
10925 not be loaded in two instructions. */
10926 BFD_ASSERT ((gotplt_value & ~(bfd_vma) 0x7fffffff) == 0
10927 || ~(gotplt_value | 0x7fffffff) == 0);
10928
10929 /* Install the PLT header. */
10930 loc = htab->splt->contents;
1bbce132
MR
10931 if (plt_entry == micromips_o32_exec_plt0_entry)
10932 {
10933 bfd_vma gotpc_offset;
10934 bfd_vma loc_address;
10935 size_t i;
10936
10937 BFD_ASSERT (gotplt_value % 4 == 0);
10938
10939 loc_address = (htab->splt->output_section->vma
10940 + htab->splt->output_offset);
10941 gotpc_offset = gotplt_value - ((loc_address | 3) ^ 3);
10942
10943 /* ADDIUPC has a span of +/-16MB, check we're in range. */
10944 if (gotpc_offset + 0x1000000 >= 0x2000000)
10945 {
10946 (*_bfd_error_handler)
10947 (_("%B: `%A' offset of %ld from `%A' beyond the range of ADDIUPC"),
10948 output_bfd,
10949 htab->sgotplt->output_section,
10950 htab->splt->output_section,
10951 (long) gotpc_offset);
10952 bfd_set_error (bfd_error_no_error);
10953 return FALSE;
10954 }
10955 bfd_put_16 (output_bfd,
10956 plt_entry[0] | ((gotpc_offset >> 18) & 0x7f), loc);
10957 bfd_put_16 (output_bfd, (gotpc_offset >> 2) & 0xffff, loc + 2);
10958 for (i = 2; i < ARRAY_SIZE (micromips_o32_exec_plt0_entry); i++)
10959 bfd_put_16 (output_bfd, plt_entry[i], loc + (i * 2));
10960 }
833794fc
MR
10961 else if (plt_entry == micromips_insn32_o32_exec_plt0_entry)
10962 {
10963 size_t i;
10964
10965 bfd_put_16 (output_bfd, plt_entry[0], loc);
10966 bfd_put_16 (output_bfd, gotplt_value_high, loc + 2);
10967 bfd_put_16 (output_bfd, plt_entry[2], loc + 4);
10968 bfd_put_16 (output_bfd, gotplt_value_low, loc + 6);
10969 bfd_put_16 (output_bfd, plt_entry[4], loc + 8);
10970 bfd_put_16 (output_bfd, gotplt_value_low, loc + 10);
10971 for (i = 6; i < ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry); i++)
10972 bfd_put_16 (output_bfd, plt_entry[i], loc + (i * 2));
10973 }
1bbce132
MR
10974 else
10975 {
10976 bfd_put_32 (output_bfd, plt_entry[0] | gotplt_value_high, loc);
10977 bfd_put_32 (output_bfd, plt_entry[1] | gotplt_value_low, loc + 4);
10978 bfd_put_32 (output_bfd, plt_entry[2] | gotplt_value_low, loc + 8);
10979 bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
10980 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
10981 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
10982 bfd_put_32 (output_bfd, plt_entry[6], loc + 24);
10983 bfd_put_32 (output_bfd, plt_entry[7], loc + 28);
10984 }
10985
10986 return TRUE;
861fb55a
DJ
10987}
10988
0a44bf69
RS
10989/* Install the PLT header for a VxWorks executable and finalize the
10990 contents of .rela.plt.unloaded. */
10991
10992static void
10993mips_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
10994{
10995 Elf_Internal_Rela rela;
10996 bfd_byte *loc;
10997 bfd_vma got_value, got_value_high, got_value_low, plt_address;
10998 static const bfd_vma *plt_entry;
10999 struct mips_elf_link_hash_table *htab;
11000
11001 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
11002 BFD_ASSERT (htab != NULL);
11003
0a44bf69
RS
11004 plt_entry = mips_vxworks_exec_plt0_entry;
11005
11006 /* Calculate the value of _GLOBAL_OFFSET_TABLE_. */
11007 got_value = (htab->root.hgot->root.u.def.section->output_section->vma
11008 + htab->root.hgot->root.u.def.section->output_offset
11009 + htab->root.hgot->root.u.def.value);
11010
11011 got_value_high = ((got_value + 0x8000) >> 16) & 0xffff;
11012 got_value_low = got_value & 0xffff;
11013
11014 /* Calculate the address of the PLT header. */
11015 plt_address = htab->splt->output_section->vma + htab->splt->output_offset;
11016
11017 /* Install the PLT header. */
11018 loc = htab->splt->contents;
11019 bfd_put_32 (output_bfd, plt_entry[0] | got_value_high, loc);
11020 bfd_put_32 (output_bfd, plt_entry[1] | got_value_low, loc + 4);
11021 bfd_put_32 (output_bfd, plt_entry[2], loc + 8);
11022 bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
11023 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
11024 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
11025
11026 /* Output the relocation for the lui of %hi(_GLOBAL_OFFSET_TABLE_). */
11027 loc = htab->srelplt2->contents;
11028 rela.r_offset = plt_address;
11029 rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11030 rela.r_addend = 0;
11031 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
11032 loc += sizeof (Elf32_External_Rela);
11033
11034 /* Output the relocation for the following addiu of
11035 %lo(_GLOBAL_OFFSET_TABLE_). */
11036 rela.r_offset += 4;
11037 rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11038 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
11039 loc += sizeof (Elf32_External_Rela);
11040
11041 /* Fix up the remaining relocations. They may have the wrong
11042 symbol index for _G_O_T_ or _P_L_T_ depending on the order
11043 in which symbols were output. */
11044 while (loc < htab->srelplt2->contents + htab->srelplt2->size)
11045 {
11046 Elf_Internal_Rela rel;
11047
11048 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11049 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
11050 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11051 loc += sizeof (Elf32_External_Rela);
11052
11053 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11054 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
11055 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11056 loc += sizeof (Elf32_External_Rela);
11057
11058 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
11059 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
11060 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
11061 loc += sizeof (Elf32_External_Rela);
11062 }
11063}
11064
11065/* Install the PLT header for a VxWorks shared library. */
11066
11067static void
11068mips_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info)
11069{
11070 unsigned int i;
11071 struct mips_elf_link_hash_table *htab;
11072
11073 htab = mips_elf_hash_table (info);
4dfe6ac6 11074 BFD_ASSERT (htab != NULL);
0a44bf69
RS
11075
11076 /* We just need to copy the entry byte-by-byte. */
11077 for (i = 0; i < ARRAY_SIZE (mips_vxworks_shared_plt0_entry); i++)
11078 bfd_put_32 (output_bfd, mips_vxworks_shared_plt0_entry[i],
11079 htab->splt->contents + i * 4);
11080}
11081
b49e97c9
TS
11082/* Finish up the dynamic sections. */
11083
b34976b6 11084bfd_boolean
9719ad41
RS
11085_bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
11086 struct bfd_link_info *info)
b49e97c9
TS
11087{
11088 bfd *dynobj;
11089 asection *sdyn;
11090 asection *sgot;
f4416af6 11091 struct mips_got_info *gg, *g;
0a44bf69 11092 struct mips_elf_link_hash_table *htab;
b49e97c9 11093
0a44bf69 11094 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
11095 BFD_ASSERT (htab != NULL);
11096
b49e97c9
TS
11097 dynobj = elf_hash_table (info)->dynobj;
11098
3d4d4302 11099 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
b49e97c9 11100
23cc69b6
RS
11101 sgot = htab->sgot;
11102 gg = htab->got_info;
b49e97c9
TS
11103
11104 if (elf_hash_table (info)->dynamic_sections_created)
11105 {
11106 bfd_byte *b;
943284cc 11107 int dyn_to_skip = 0, dyn_skipped = 0;
b49e97c9
TS
11108
11109 BFD_ASSERT (sdyn != NULL);
23cc69b6
RS
11110 BFD_ASSERT (gg != NULL);
11111
d7206569 11112 g = mips_elf_bfd_got (output_bfd, FALSE);
b49e97c9
TS
11113 BFD_ASSERT (g != NULL);
11114
11115 for (b = sdyn->contents;
eea6121a 11116 b < sdyn->contents + sdyn->size;
b49e97c9
TS
11117 b += MIPS_ELF_DYN_SIZE (dynobj))
11118 {
11119 Elf_Internal_Dyn dyn;
11120 const char *name;
11121 size_t elemsize;
11122 asection *s;
b34976b6 11123 bfd_boolean swap_out_p;
b49e97c9
TS
11124
11125 /* Read in the current dynamic entry. */
11126 (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
11127
11128 /* Assume that we're going to modify it and write it out. */
b34976b6 11129 swap_out_p = TRUE;
b49e97c9
TS
11130
11131 switch (dyn.d_tag)
11132 {
11133 case DT_RELENT:
b49e97c9
TS
11134 dyn.d_un.d_val = MIPS_ELF_REL_SIZE (dynobj);
11135 break;
11136
0a44bf69
RS
11137 case DT_RELAENT:
11138 BFD_ASSERT (htab->is_vxworks);
11139 dyn.d_un.d_val = MIPS_ELF_RELA_SIZE (dynobj);
11140 break;
11141
b49e97c9
TS
11142 case DT_STRSZ:
11143 /* Rewrite DT_STRSZ. */
11144 dyn.d_un.d_val =
11145 _bfd_elf_strtab_size (elf_hash_table (info)->dynstr);
11146 break;
11147
11148 case DT_PLTGOT:
861fb55a
DJ
11149 s = htab->sgot;
11150 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
11151 break;
11152
11153 case DT_MIPS_PLTGOT:
11154 s = htab->sgotplt;
11155 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
b49e97c9
TS
11156 break;
11157
11158 case DT_MIPS_RLD_VERSION:
11159 dyn.d_un.d_val = 1; /* XXX */
11160 break;
11161
11162 case DT_MIPS_FLAGS:
11163 dyn.d_un.d_val = RHF_NOTPOT; /* XXX */
11164 break;
11165
b49e97c9 11166 case DT_MIPS_TIME_STAMP:
6edfbbad
DJ
11167 {
11168 time_t t;
11169 time (&t);
11170 dyn.d_un.d_val = t;
11171 }
b49e97c9
TS
11172 break;
11173
11174 case DT_MIPS_ICHECKSUM:
11175 /* XXX FIXME: */
b34976b6 11176 swap_out_p = FALSE;
b49e97c9
TS
11177 break;
11178
11179 case DT_MIPS_IVERSION:
11180 /* XXX FIXME: */
b34976b6 11181 swap_out_p = FALSE;
b49e97c9
TS
11182 break;
11183
11184 case DT_MIPS_BASE_ADDRESS:
11185 s = output_bfd->sections;
11186 BFD_ASSERT (s != NULL);
11187 dyn.d_un.d_ptr = s->vma & ~(bfd_vma) 0xffff;
11188 break;
11189
11190 case DT_MIPS_LOCAL_GOTNO:
11191 dyn.d_un.d_val = g->local_gotno;
11192 break;
11193
11194 case DT_MIPS_UNREFEXTNO:
11195 /* The index into the dynamic symbol table which is the
11196 entry of the first external symbol that is not
11197 referenced within the same object. */
11198 dyn.d_un.d_val = bfd_count_sections (output_bfd) + 1;
11199 break;
11200
11201 case DT_MIPS_GOTSYM:
d222d210 11202 if (htab->global_gotsym)
b49e97c9 11203 {
d222d210 11204 dyn.d_un.d_val = htab->global_gotsym->dynindx;
b49e97c9
TS
11205 break;
11206 }
11207 /* In case if we don't have global got symbols we default
11208 to setting DT_MIPS_GOTSYM to the same value as
11209 DT_MIPS_SYMTABNO, so we just fall through. */
11210
11211 case DT_MIPS_SYMTABNO:
11212 name = ".dynsym";
11213 elemsize = MIPS_ELF_SYM_SIZE (output_bfd);
11214 s = bfd_get_section_by_name (output_bfd, name);
11215 BFD_ASSERT (s != NULL);
11216
eea6121a 11217 dyn.d_un.d_val = s->size / elemsize;
b49e97c9
TS
11218 break;
11219
11220 case DT_MIPS_HIPAGENO:
861fb55a 11221 dyn.d_un.d_val = g->local_gotno - htab->reserved_gotno;
b49e97c9
TS
11222 break;
11223
11224 case DT_MIPS_RLD_MAP:
b4082c70
DD
11225 {
11226 struct elf_link_hash_entry *h;
11227 h = mips_elf_hash_table (info)->rld_symbol;
11228 if (!h)
11229 {
11230 dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
11231 swap_out_p = FALSE;
11232 break;
11233 }
11234 s = h->root.u.def.section;
11235 dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
11236 + h->root.u.def.value);
11237 }
b49e97c9
TS
11238 break;
11239
11240 case DT_MIPS_OPTIONS:
11241 s = (bfd_get_section_by_name
11242 (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (output_bfd)));
11243 dyn.d_un.d_ptr = s->vma;
11244 break;
11245
0a44bf69
RS
11246 case DT_RELASZ:
11247 BFD_ASSERT (htab->is_vxworks);
11248 /* The count does not include the JUMP_SLOT relocations. */
11249 if (htab->srelplt)
11250 dyn.d_un.d_val -= htab->srelplt->size;
11251 break;
11252
11253 case DT_PLTREL:
861fb55a
DJ
11254 BFD_ASSERT (htab->use_plts_and_copy_relocs);
11255 if (htab->is_vxworks)
11256 dyn.d_un.d_val = DT_RELA;
11257 else
11258 dyn.d_un.d_val = DT_REL;
0a44bf69
RS
11259 break;
11260
11261 case DT_PLTRELSZ:
861fb55a 11262 BFD_ASSERT (htab->use_plts_and_copy_relocs);
0a44bf69
RS
11263 dyn.d_un.d_val = htab->srelplt->size;
11264 break;
11265
11266 case DT_JMPREL:
861fb55a
DJ
11267 BFD_ASSERT (htab->use_plts_and_copy_relocs);
11268 dyn.d_un.d_ptr = (htab->srelplt->output_section->vma
0a44bf69
RS
11269 + htab->srelplt->output_offset);
11270 break;
11271
943284cc
DJ
11272 case DT_TEXTREL:
11273 /* If we didn't need any text relocations after all, delete
11274 the dynamic tag. */
11275 if (!(info->flags & DF_TEXTREL))
11276 {
11277 dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
11278 swap_out_p = FALSE;
11279 }
11280 break;
11281
11282 case DT_FLAGS:
11283 /* If we didn't need any text relocations after all, clear
11284 DF_TEXTREL from DT_FLAGS. */
11285 if (!(info->flags & DF_TEXTREL))
11286 dyn.d_un.d_val &= ~DF_TEXTREL;
11287 else
11288 swap_out_p = FALSE;
11289 break;
11290
b49e97c9 11291 default:
b34976b6 11292 swap_out_p = FALSE;
7a2b07ff
NS
11293 if (htab->is_vxworks
11294 && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
11295 swap_out_p = TRUE;
b49e97c9
TS
11296 break;
11297 }
11298
943284cc 11299 if (swap_out_p || dyn_skipped)
b49e97c9 11300 (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
943284cc
DJ
11301 (dynobj, &dyn, b - dyn_skipped);
11302
11303 if (dyn_to_skip)
11304 {
11305 dyn_skipped += dyn_to_skip;
11306 dyn_to_skip = 0;
11307 }
b49e97c9 11308 }
943284cc
DJ
11309
11310 /* Wipe out any trailing entries if we shifted down a dynamic tag. */
11311 if (dyn_skipped > 0)
11312 memset (b - dyn_skipped, 0, dyn_skipped);
b49e97c9
TS
11313 }
11314
b55fd4d4
DJ
11315 if (sgot != NULL && sgot->size > 0
11316 && !bfd_is_abs_section (sgot->output_section))
b49e97c9 11317 {
0a44bf69
RS
11318 if (htab->is_vxworks)
11319 {
11320 /* The first entry of the global offset table points to the
11321 ".dynamic" section. The second is initialized by the
11322 loader and contains the shared library identifier.
11323 The third is also initialized by the loader and points
11324 to the lazy resolution stub. */
11325 MIPS_ELF_PUT_WORD (output_bfd,
11326 sdyn->output_offset + sdyn->output_section->vma,
11327 sgot->contents);
11328 MIPS_ELF_PUT_WORD (output_bfd, 0,
11329 sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
11330 MIPS_ELF_PUT_WORD (output_bfd, 0,
11331 sgot->contents
11332 + 2 * MIPS_ELF_GOT_SIZE (output_bfd));
11333 }
11334 else
11335 {
11336 /* The first entry of the global offset table will be filled at
11337 runtime. The second entry will be used by some runtime loaders.
11338 This isn't the case of IRIX rld. */
11339 MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0, sgot->contents);
51e38d68 11340 MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
0a44bf69
RS
11341 sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
11342 }
b49e97c9 11343
54938e2a
TS
11344 elf_section_data (sgot->output_section)->this_hdr.sh_entsize
11345 = MIPS_ELF_GOT_SIZE (output_bfd);
11346 }
b49e97c9 11347
f4416af6
AO
11348 /* Generate dynamic relocations for the non-primary gots. */
11349 if (gg != NULL && gg->next)
11350 {
11351 Elf_Internal_Rela rel[3];
11352 bfd_vma addend = 0;
11353
11354 memset (rel, 0, sizeof (rel));
11355 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_REL32);
11356
11357 for (g = gg->next; g->next != gg; g = g->next)
11358 {
91d6fa6a 11359 bfd_vma got_index = g->next->local_gotno + g->next->global_gotno
0f20cc35 11360 + g->next->tls_gotno;
f4416af6 11361
9719ad41 11362 MIPS_ELF_PUT_WORD (output_bfd, 0, sgot->contents
91d6fa6a 11363 + got_index++ * MIPS_ELF_GOT_SIZE (output_bfd));
51e38d68
RS
11364 MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
11365 sgot->contents
91d6fa6a 11366 + got_index++ * MIPS_ELF_GOT_SIZE (output_bfd));
f4416af6
AO
11367
11368 if (! info->shared)
11369 continue;
11370
91d6fa6a 11371 while (got_index < g->assigned_gotno)
f4416af6
AO
11372 {
11373 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset
91d6fa6a 11374 = got_index++ * MIPS_ELF_GOT_SIZE (output_bfd);
f4416af6
AO
11375 if (!(mips_elf_create_dynamic_relocation
11376 (output_bfd, info, rel, NULL,
11377 bfd_abs_section_ptr,
11378 0, &addend, sgot)))
11379 return FALSE;
11380 BFD_ASSERT (addend == 0);
11381 }
11382 }
11383 }
11384
3133ddbf
DJ
11385 /* The generation of dynamic relocations for the non-primary gots
11386 adds more dynamic relocations. We cannot count them until
11387 here. */
11388
11389 if (elf_hash_table (info)->dynamic_sections_created)
11390 {
11391 bfd_byte *b;
11392 bfd_boolean swap_out_p;
11393
11394 BFD_ASSERT (sdyn != NULL);
11395
11396 for (b = sdyn->contents;
11397 b < sdyn->contents + sdyn->size;
11398 b += MIPS_ELF_DYN_SIZE (dynobj))
11399 {
11400 Elf_Internal_Dyn dyn;
11401 asection *s;
11402
11403 /* Read in the current dynamic entry. */
11404 (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
11405
11406 /* Assume that we're going to modify it and write it out. */
11407 swap_out_p = TRUE;
11408
11409 switch (dyn.d_tag)
11410 {
11411 case DT_RELSZ:
11412 /* Reduce DT_RELSZ to account for any relocations we
11413 decided not to make. This is for the n64 irix rld,
11414 which doesn't seem to apply any relocations if there
11415 are trailing null entries. */
0a44bf69 11416 s = mips_elf_rel_dyn_section (info, FALSE);
3133ddbf
DJ
11417 dyn.d_un.d_val = (s->reloc_count
11418 * (ABI_64_P (output_bfd)
11419 ? sizeof (Elf64_Mips_External_Rel)
11420 : sizeof (Elf32_External_Rel)));
bcfdf036
RS
11421 /* Adjust the section size too. Tools like the prelinker
11422 can reasonably expect the values to the same. */
11423 elf_section_data (s->output_section)->this_hdr.sh_size
11424 = dyn.d_un.d_val;
3133ddbf
DJ
11425 break;
11426
11427 default:
11428 swap_out_p = FALSE;
11429 break;
11430 }
11431
11432 if (swap_out_p)
11433 (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
11434 (dynobj, &dyn, b);
11435 }
11436 }
11437
b49e97c9 11438 {
b49e97c9
TS
11439 asection *s;
11440 Elf32_compact_rel cpt;
11441
b49e97c9
TS
11442 if (SGI_COMPAT (output_bfd))
11443 {
11444 /* Write .compact_rel section out. */
3d4d4302 11445 s = bfd_get_linker_section (dynobj, ".compact_rel");
b49e97c9
TS
11446 if (s != NULL)
11447 {
11448 cpt.id1 = 1;
11449 cpt.num = s->reloc_count;
11450 cpt.id2 = 2;
11451 cpt.offset = (s->output_section->filepos
11452 + sizeof (Elf32_External_compact_rel));
11453 cpt.reserved0 = 0;
11454 cpt.reserved1 = 0;
11455 bfd_elf32_swap_compact_rel_out (output_bfd, &cpt,
11456 ((Elf32_External_compact_rel *)
11457 s->contents));
11458
11459 /* Clean up a dummy stub function entry in .text. */
4e41d0d7 11460 if (htab->sstubs != NULL)
b49e97c9
TS
11461 {
11462 file_ptr dummy_offset;
11463
4e41d0d7
RS
11464 BFD_ASSERT (htab->sstubs->size >= htab->function_stub_size);
11465 dummy_offset = htab->sstubs->size - htab->function_stub_size;
11466 memset (htab->sstubs->contents + dummy_offset, 0,
5108fc1b 11467 htab->function_stub_size);
b49e97c9
TS
11468 }
11469 }
11470 }
11471
0a44bf69
RS
11472 /* The psABI says that the dynamic relocations must be sorted in
11473 increasing order of r_symndx. The VxWorks EABI doesn't require
11474 this, and because the code below handles REL rather than RELA
11475 relocations, using it for VxWorks would be outright harmful. */
11476 if (!htab->is_vxworks)
b49e97c9 11477 {
0a44bf69
RS
11478 s = mips_elf_rel_dyn_section (info, FALSE);
11479 if (s != NULL
11480 && s->size > (bfd_vma)2 * MIPS_ELF_REL_SIZE (output_bfd))
11481 {
11482 reldyn_sorting_bfd = output_bfd;
b49e97c9 11483
0a44bf69
RS
11484 if (ABI_64_P (output_bfd))
11485 qsort ((Elf64_External_Rel *) s->contents + 1,
11486 s->reloc_count - 1, sizeof (Elf64_Mips_External_Rel),
11487 sort_dynamic_relocs_64);
11488 else
11489 qsort ((Elf32_External_Rel *) s->contents + 1,
11490 s->reloc_count - 1, sizeof (Elf32_External_Rel),
11491 sort_dynamic_relocs);
11492 }
b49e97c9 11493 }
b49e97c9
TS
11494 }
11495
861fb55a 11496 if (htab->splt && htab->splt->size > 0)
0a44bf69 11497 {
861fb55a
DJ
11498 if (htab->is_vxworks)
11499 {
11500 if (info->shared)
11501 mips_vxworks_finish_shared_plt (output_bfd, info);
11502 else
11503 mips_vxworks_finish_exec_plt (output_bfd, info);
11504 }
0a44bf69 11505 else
861fb55a
DJ
11506 {
11507 BFD_ASSERT (!info->shared);
1bbce132
MR
11508 if (!mips_finish_exec_plt (output_bfd, info))
11509 return FALSE;
861fb55a 11510 }
0a44bf69 11511 }
b34976b6 11512 return TRUE;
b49e97c9
TS
11513}
11514
b49e97c9 11515
64543e1a
RS
11516/* Set ABFD's EF_MIPS_ARCH and EF_MIPS_MACH flags. */
11517
11518static void
9719ad41 11519mips_set_isa_flags (bfd *abfd)
b49e97c9 11520{
64543e1a 11521 flagword val;
b49e97c9
TS
11522
11523 switch (bfd_get_mach (abfd))
11524 {
11525 default:
11526 case bfd_mach_mips3000:
11527 val = E_MIPS_ARCH_1;
11528 break;
11529
11530 case bfd_mach_mips3900:
11531 val = E_MIPS_ARCH_1 | E_MIPS_MACH_3900;
11532 break;
11533
11534 case bfd_mach_mips6000:
11535 val = E_MIPS_ARCH_2;
11536 break;
11537
11538 case bfd_mach_mips4000:
11539 case bfd_mach_mips4300:
11540 case bfd_mach_mips4400:
11541 case bfd_mach_mips4600:
11542 val = E_MIPS_ARCH_3;
11543 break;
11544
11545 case bfd_mach_mips4010:
11546 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4010;
11547 break;
11548
11549 case bfd_mach_mips4100:
11550 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4100;
11551 break;
11552
11553 case bfd_mach_mips4111:
11554 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4111;
11555 break;
11556
00707a0e
RS
11557 case bfd_mach_mips4120:
11558 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4120;
11559 break;
11560
b49e97c9
TS
11561 case bfd_mach_mips4650:
11562 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4650;
11563 break;
11564
00707a0e
RS
11565 case bfd_mach_mips5400:
11566 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5400;
11567 break;
11568
11569 case bfd_mach_mips5500:
11570 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5500;
11571 break;
11572
e407c74b
NC
11573 case bfd_mach_mips5900:
11574 val = E_MIPS_ARCH_3 | E_MIPS_MACH_5900;
11575 break;
11576
0d2e43ed
ILT
11577 case bfd_mach_mips9000:
11578 val = E_MIPS_ARCH_4 | E_MIPS_MACH_9000;
11579 break;
11580
b49e97c9 11581 case bfd_mach_mips5000:
5a7ea749 11582 case bfd_mach_mips7000:
b49e97c9
TS
11583 case bfd_mach_mips8000:
11584 case bfd_mach_mips10000:
11585 case bfd_mach_mips12000:
3aa3176b
TS
11586 case bfd_mach_mips14000:
11587 case bfd_mach_mips16000:
b49e97c9
TS
11588 val = E_MIPS_ARCH_4;
11589 break;
11590
11591 case bfd_mach_mips5:
11592 val = E_MIPS_ARCH_5;
11593 break;
11594
350cc38d
MS
11595 case bfd_mach_mips_loongson_2e:
11596 val = E_MIPS_ARCH_3 | E_MIPS_MACH_LS2E;
11597 break;
11598
11599 case bfd_mach_mips_loongson_2f:
11600 val = E_MIPS_ARCH_3 | E_MIPS_MACH_LS2F;
11601 break;
11602
b49e97c9
TS
11603 case bfd_mach_mips_sb1:
11604 val = E_MIPS_ARCH_64 | E_MIPS_MACH_SB1;
11605 break;
11606
d051516a
NC
11607 case bfd_mach_mips_loongson_3a:
11608 val = E_MIPS_ARCH_64 | E_MIPS_MACH_LS3A;
11609 break;
11610
6f179bd0 11611 case bfd_mach_mips_octeon:
dd6a37e7 11612 case bfd_mach_mips_octeonp:
6f179bd0
AN
11613 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_OCTEON;
11614 break;
11615
52b6b6b9
JM
11616 case bfd_mach_mips_xlr:
11617 val = E_MIPS_ARCH_64 | E_MIPS_MACH_XLR;
11618 break;
11619
432233b3
AP
11620 case bfd_mach_mips_octeon2:
11621 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_OCTEON2;
11622 break;
11623
b49e97c9
TS
11624 case bfd_mach_mipsisa32:
11625 val = E_MIPS_ARCH_32;
11626 break;
11627
11628 case bfd_mach_mipsisa64:
11629 val = E_MIPS_ARCH_64;
af7ee8bf
CD
11630 break;
11631
11632 case bfd_mach_mipsisa32r2:
11633 val = E_MIPS_ARCH_32R2;
11634 break;
5f74bc13
CD
11635
11636 case bfd_mach_mipsisa64r2:
11637 val = E_MIPS_ARCH_64R2;
11638 break;
b49e97c9 11639 }
b49e97c9
TS
11640 elf_elfheader (abfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
11641 elf_elfheader (abfd)->e_flags |= val;
11642
64543e1a
RS
11643}
11644
11645
11646/* The final processing done just before writing out a MIPS ELF object
11647 file. This gets the MIPS architecture right based on the machine
11648 number. This is used by both the 32-bit and the 64-bit ABI. */
11649
11650void
9719ad41
RS
11651_bfd_mips_elf_final_write_processing (bfd *abfd,
11652 bfd_boolean linker ATTRIBUTE_UNUSED)
64543e1a
RS
11653{
11654 unsigned int i;
11655 Elf_Internal_Shdr **hdrpp;
11656 const char *name;
11657 asection *sec;
11658
11659 /* Keep the existing EF_MIPS_MACH and EF_MIPS_ARCH flags if the former
11660 is nonzero. This is for compatibility with old objects, which used
11661 a combination of a 32-bit EF_MIPS_ARCH and a 64-bit EF_MIPS_MACH. */
11662 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == 0)
11663 mips_set_isa_flags (abfd);
11664
b49e97c9
TS
11665 /* Set the sh_info field for .gptab sections and other appropriate
11666 info for each special section. */
11667 for (i = 1, hdrpp = elf_elfsections (abfd) + 1;
11668 i < elf_numsections (abfd);
11669 i++, hdrpp++)
11670 {
11671 switch ((*hdrpp)->sh_type)
11672 {
11673 case SHT_MIPS_MSYM:
11674 case SHT_MIPS_LIBLIST:
11675 sec = bfd_get_section_by_name (abfd, ".dynstr");
11676 if (sec != NULL)
11677 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
11678 break;
11679
11680 case SHT_MIPS_GPTAB:
11681 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
11682 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
11683 BFD_ASSERT (name != NULL
0112cd26 11684 && CONST_STRNEQ (name, ".gptab."));
b49e97c9
TS
11685 sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
11686 BFD_ASSERT (sec != NULL);
11687 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
11688 break;
11689
11690 case SHT_MIPS_CONTENT:
11691 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
11692 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
11693 BFD_ASSERT (name != NULL
0112cd26 11694 && CONST_STRNEQ (name, ".MIPS.content"));
b49e97c9
TS
11695 sec = bfd_get_section_by_name (abfd,
11696 name + sizeof ".MIPS.content" - 1);
11697 BFD_ASSERT (sec != NULL);
11698 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
11699 break;
11700
11701 case SHT_MIPS_SYMBOL_LIB:
11702 sec = bfd_get_section_by_name (abfd, ".dynsym");
11703 if (sec != NULL)
11704 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
11705 sec = bfd_get_section_by_name (abfd, ".liblist");
11706 if (sec != NULL)
11707 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
11708 break;
11709
11710 case SHT_MIPS_EVENTS:
11711 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
11712 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
11713 BFD_ASSERT (name != NULL);
0112cd26 11714 if (CONST_STRNEQ (name, ".MIPS.events"))
b49e97c9
TS
11715 sec = bfd_get_section_by_name (abfd,
11716 name + sizeof ".MIPS.events" - 1);
11717 else
11718 {
0112cd26 11719 BFD_ASSERT (CONST_STRNEQ (name, ".MIPS.post_rel"));
b49e97c9
TS
11720 sec = bfd_get_section_by_name (abfd,
11721 (name
11722 + sizeof ".MIPS.post_rel" - 1));
11723 }
11724 BFD_ASSERT (sec != NULL);
11725 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
11726 break;
11727
11728 }
11729 }
11730}
11731\f
8dc1a139 11732/* When creating an IRIX5 executable, we need REGINFO and RTPROC
b49e97c9
TS
11733 segments. */
11734
11735int
a6b96beb
AM
11736_bfd_mips_elf_additional_program_headers (bfd *abfd,
11737 struct bfd_link_info *info ATTRIBUTE_UNUSED)
b49e97c9
TS
11738{
11739 asection *s;
11740 int ret = 0;
11741
11742 /* See if we need a PT_MIPS_REGINFO segment. */
11743 s = bfd_get_section_by_name (abfd, ".reginfo");
11744 if (s && (s->flags & SEC_LOAD))
11745 ++ret;
11746
11747 /* See if we need a PT_MIPS_OPTIONS segment. */
11748 if (IRIX_COMPAT (abfd) == ict_irix6
11749 && bfd_get_section_by_name (abfd,
11750 MIPS_ELF_OPTIONS_SECTION_NAME (abfd)))
11751 ++ret;
11752
11753 /* See if we need a PT_MIPS_RTPROC segment. */
11754 if (IRIX_COMPAT (abfd) == ict_irix5
11755 && bfd_get_section_by_name (abfd, ".dynamic")
11756 && bfd_get_section_by_name (abfd, ".mdebug"))
11757 ++ret;
11758
98c904a8
RS
11759 /* Allocate a PT_NULL header in dynamic objects. See
11760 _bfd_mips_elf_modify_segment_map for details. */
11761 if (!SGI_COMPAT (abfd)
11762 && bfd_get_section_by_name (abfd, ".dynamic"))
11763 ++ret;
11764
b49e97c9
TS
11765 return ret;
11766}
11767
8dc1a139 11768/* Modify the segment map for an IRIX5 executable. */
b49e97c9 11769
b34976b6 11770bfd_boolean
9719ad41 11771_bfd_mips_elf_modify_segment_map (bfd *abfd,
7c8b76cc 11772 struct bfd_link_info *info)
b49e97c9
TS
11773{
11774 asection *s;
11775 struct elf_segment_map *m, **pm;
11776 bfd_size_type amt;
11777
11778 /* If there is a .reginfo section, we need a PT_MIPS_REGINFO
11779 segment. */
11780 s = bfd_get_section_by_name (abfd, ".reginfo");
11781 if (s != NULL && (s->flags & SEC_LOAD) != 0)
11782 {
12bd6957 11783 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
b49e97c9
TS
11784 if (m->p_type == PT_MIPS_REGINFO)
11785 break;
11786 if (m == NULL)
11787 {
11788 amt = sizeof *m;
9719ad41 11789 m = bfd_zalloc (abfd, amt);
b49e97c9 11790 if (m == NULL)
b34976b6 11791 return FALSE;
b49e97c9
TS
11792
11793 m->p_type = PT_MIPS_REGINFO;
11794 m->count = 1;
11795 m->sections[0] = s;
11796
11797 /* We want to put it after the PHDR and INTERP segments. */
12bd6957 11798 pm = &elf_seg_map (abfd);
b49e97c9
TS
11799 while (*pm != NULL
11800 && ((*pm)->p_type == PT_PHDR
11801 || (*pm)->p_type == PT_INTERP))
11802 pm = &(*pm)->next;
11803
11804 m->next = *pm;
11805 *pm = m;
11806 }
11807 }
11808
11809 /* For IRIX 6, we don't have .mdebug sections, nor does anything but
11810 .dynamic end up in PT_DYNAMIC. However, we do have to insert a
98a8deaf 11811 PT_MIPS_OPTIONS segment immediately following the program header
b49e97c9 11812 table. */
c1fd6598
AO
11813 if (NEWABI_P (abfd)
11814 /* On non-IRIX6 new abi, we'll have already created a segment
11815 for this section, so don't create another. I'm not sure this
11816 is not also the case for IRIX 6, but I can't test it right
11817 now. */
11818 && IRIX_COMPAT (abfd) == ict_irix6)
b49e97c9
TS
11819 {
11820 for (s = abfd->sections; s; s = s->next)
11821 if (elf_section_data (s)->this_hdr.sh_type == SHT_MIPS_OPTIONS)
11822 break;
11823
11824 if (s)
11825 {
11826 struct elf_segment_map *options_segment;
11827
12bd6957 11828 pm = &elf_seg_map (abfd);
98a8deaf
RS
11829 while (*pm != NULL
11830 && ((*pm)->p_type == PT_PHDR
11831 || (*pm)->p_type == PT_INTERP))
11832 pm = &(*pm)->next;
b49e97c9 11833
8ded5a0f
AM
11834 if (*pm == NULL || (*pm)->p_type != PT_MIPS_OPTIONS)
11835 {
11836 amt = sizeof (struct elf_segment_map);
11837 options_segment = bfd_zalloc (abfd, amt);
11838 options_segment->next = *pm;
11839 options_segment->p_type = PT_MIPS_OPTIONS;
11840 options_segment->p_flags = PF_R;
11841 options_segment->p_flags_valid = TRUE;
11842 options_segment->count = 1;
11843 options_segment->sections[0] = s;
11844 *pm = options_segment;
11845 }
b49e97c9
TS
11846 }
11847 }
11848 else
11849 {
11850 if (IRIX_COMPAT (abfd) == ict_irix5)
11851 {
11852 /* If there are .dynamic and .mdebug sections, we make a room
11853 for the RTPROC header. FIXME: Rewrite without section names. */
11854 if (bfd_get_section_by_name (abfd, ".interp") == NULL
11855 && bfd_get_section_by_name (abfd, ".dynamic") != NULL
11856 && bfd_get_section_by_name (abfd, ".mdebug") != NULL)
11857 {
12bd6957 11858 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
b49e97c9
TS
11859 if (m->p_type == PT_MIPS_RTPROC)
11860 break;
11861 if (m == NULL)
11862 {
11863 amt = sizeof *m;
9719ad41 11864 m = bfd_zalloc (abfd, amt);
b49e97c9 11865 if (m == NULL)
b34976b6 11866 return FALSE;
b49e97c9
TS
11867
11868 m->p_type = PT_MIPS_RTPROC;
11869
11870 s = bfd_get_section_by_name (abfd, ".rtproc");
11871 if (s == NULL)
11872 {
11873 m->count = 0;
11874 m->p_flags = 0;
11875 m->p_flags_valid = 1;
11876 }
11877 else
11878 {
11879 m->count = 1;
11880 m->sections[0] = s;
11881 }
11882
11883 /* We want to put it after the DYNAMIC segment. */
12bd6957 11884 pm = &elf_seg_map (abfd);
b49e97c9
TS
11885 while (*pm != NULL && (*pm)->p_type != PT_DYNAMIC)
11886 pm = &(*pm)->next;
11887 if (*pm != NULL)
11888 pm = &(*pm)->next;
11889
11890 m->next = *pm;
11891 *pm = m;
11892 }
11893 }
11894 }
8dc1a139 11895 /* On IRIX5, the PT_DYNAMIC segment includes the .dynamic,
b49e97c9
TS
11896 .dynstr, .dynsym, and .hash sections, and everything in
11897 between. */
12bd6957 11898 for (pm = &elf_seg_map (abfd); *pm != NULL;
b49e97c9
TS
11899 pm = &(*pm)->next)
11900 if ((*pm)->p_type == PT_DYNAMIC)
11901 break;
11902 m = *pm;
11903 if (m != NULL && IRIX_COMPAT (abfd) == ict_none)
11904 {
11905 /* For a normal mips executable the permissions for the PT_DYNAMIC
11906 segment are read, write and execute. We do that here since
11907 the code in elf.c sets only the read permission. This matters
11908 sometimes for the dynamic linker. */
11909 if (bfd_get_section_by_name (abfd, ".dynamic") != NULL)
11910 {
11911 m->p_flags = PF_R | PF_W | PF_X;
11912 m->p_flags_valid = 1;
11913 }
11914 }
f6f62d6f
RS
11915 /* GNU/Linux binaries do not need the extended PT_DYNAMIC section.
11916 glibc's dynamic linker has traditionally derived the number of
11917 tags from the p_filesz field, and sometimes allocates stack
11918 arrays of that size. An overly-big PT_DYNAMIC segment can
11919 be actively harmful in such cases. Making PT_DYNAMIC contain
11920 other sections can also make life hard for the prelinker,
11921 which might move one of the other sections to a different
11922 PT_LOAD segment. */
11923 if (SGI_COMPAT (abfd)
11924 && m != NULL
11925 && m->count == 1
11926 && strcmp (m->sections[0]->name, ".dynamic") == 0)
b49e97c9
TS
11927 {
11928 static const char *sec_names[] =
11929 {
11930 ".dynamic", ".dynstr", ".dynsym", ".hash"
11931 };
11932 bfd_vma low, high;
11933 unsigned int i, c;
11934 struct elf_segment_map *n;
11935
792b4a53 11936 low = ~(bfd_vma) 0;
b49e97c9
TS
11937 high = 0;
11938 for (i = 0; i < sizeof sec_names / sizeof sec_names[0]; i++)
11939 {
11940 s = bfd_get_section_by_name (abfd, sec_names[i]);
11941 if (s != NULL && (s->flags & SEC_LOAD) != 0)
11942 {
11943 bfd_size_type sz;
11944
11945 if (low > s->vma)
11946 low = s->vma;
eea6121a 11947 sz = s->size;
b49e97c9
TS
11948 if (high < s->vma + sz)
11949 high = s->vma + sz;
11950 }
11951 }
11952
11953 c = 0;
11954 for (s = abfd->sections; s != NULL; s = s->next)
11955 if ((s->flags & SEC_LOAD) != 0
11956 && s->vma >= low
eea6121a 11957 && s->vma + s->size <= high)
b49e97c9
TS
11958 ++c;
11959
11960 amt = sizeof *n + (bfd_size_type) (c - 1) * sizeof (asection *);
9719ad41 11961 n = bfd_zalloc (abfd, amt);
b49e97c9 11962 if (n == NULL)
b34976b6 11963 return FALSE;
b49e97c9
TS
11964 *n = *m;
11965 n->count = c;
11966
11967 i = 0;
11968 for (s = abfd->sections; s != NULL; s = s->next)
11969 {
11970 if ((s->flags & SEC_LOAD) != 0
11971 && s->vma >= low
eea6121a 11972 && s->vma + s->size <= high)
b49e97c9
TS
11973 {
11974 n->sections[i] = s;
11975 ++i;
11976 }
11977 }
11978
11979 *pm = n;
11980 }
11981 }
11982
98c904a8
RS
11983 /* Allocate a spare program header in dynamic objects so that tools
11984 like the prelinker can add an extra PT_LOAD entry.
11985
11986 If the prelinker needs to make room for a new PT_LOAD entry, its
11987 standard procedure is to move the first (read-only) sections into
11988 the new (writable) segment. However, the MIPS ABI requires
11989 .dynamic to be in a read-only segment, and the section will often
11990 start within sizeof (ElfNN_Phdr) bytes of the last program header.
11991
11992 Although the prelinker could in principle move .dynamic to a
11993 writable segment, it seems better to allocate a spare program
11994 header instead, and avoid the need to move any sections.
11995 There is a long tradition of allocating spare dynamic tags,
11996 so allocating a spare program header seems like a natural
7c8b76cc
JM
11997 extension.
11998
11999 If INFO is NULL, we may be copying an already prelinked binary
12000 with objcopy or strip, so do not add this header. */
12001 if (info != NULL
12002 && !SGI_COMPAT (abfd)
98c904a8
RS
12003 && bfd_get_section_by_name (abfd, ".dynamic"))
12004 {
12bd6957 12005 for (pm = &elf_seg_map (abfd); *pm != NULL; pm = &(*pm)->next)
98c904a8
RS
12006 if ((*pm)->p_type == PT_NULL)
12007 break;
12008 if (*pm == NULL)
12009 {
12010 m = bfd_zalloc (abfd, sizeof (*m));
12011 if (m == NULL)
12012 return FALSE;
12013
12014 m->p_type = PT_NULL;
12015 *pm = m;
12016 }
12017 }
12018
b34976b6 12019 return TRUE;
b49e97c9
TS
12020}
12021\f
12022/* Return the section that should be marked against GC for a given
12023 relocation. */
12024
12025asection *
9719ad41 12026_bfd_mips_elf_gc_mark_hook (asection *sec,
07adf181 12027 struct bfd_link_info *info,
9719ad41
RS
12028 Elf_Internal_Rela *rel,
12029 struct elf_link_hash_entry *h,
12030 Elf_Internal_Sym *sym)
b49e97c9
TS
12031{
12032 /* ??? Do mips16 stub sections need to be handled special? */
12033
12034 if (h != NULL)
07adf181
AM
12035 switch (ELF_R_TYPE (sec->owner, rel->r_info))
12036 {
12037 case R_MIPS_GNU_VTINHERIT:
12038 case R_MIPS_GNU_VTENTRY:
12039 return NULL;
12040 }
b49e97c9 12041
07adf181 12042 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
b49e97c9
TS
12043}
12044
12045/* Update the got entry reference counts for the section being removed. */
12046
b34976b6 12047bfd_boolean
9719ad41
RS
12048_bfd_mips_elf_gc_sweep_hook (bfd *abfd ATTRIBUTE_UNUSED,
12049 struct bfd_link_info *info ATTRIBUTE_UNUSED,
12050 asection *sec ATTRIBUTE_UNUSED,
12051 const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED)
b49e97c9
TS
12052{
12053#if 0
12054 Elf_Internal_Shdr *symtab_hdr;
12055 struct elf_link_hash_entry **sym_hashes;
12056 bfd_signed_vma *local_got_refcounts;
12057 const Elf_Internal_Rela *rel, *relend;
12058 unsigned long r_symndx;
12059 struct elf_link_hash_entry *h;
12060
7dda2462
TG
12061 if (info->relocatable)
12062 return TRUE;
12063
b49e97c9
TS
12064 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12065 sym_hashes = elf_sym_hashes (abfd);
12066 local_got_refcounts = elf_local_got_refcounts (abfd);
12067
12068 relend = relocs + sec->reloc_count;
12069 for (rel = relocs; rel < relend; rel++)
12070 switch (ELF_R_TYPE (abfd, rel->r_info))
12071 {
738e5348
RS
12072 case R_MIPS16_GOT16:
12073 case R_MIPS16_CALL16:
b49e97c9
TS
12074 case R_MIPS_GOT16:
12075 case R_MIPS_CALL16:
12076 case R_MIPS_CALL_HI16:
12077 case R_MIPS_CALL_LO16:
12078 case R_MIPS_GOT_HI16:
12079 case R_MIPS_GOT_LO16:
4a14403c
TS
12080 case R_MIPS_GOT_DISP:
12081 case R_MIPS_GOT_PAGE:
12082 case R_MIPS_GOT_OFST:
df58fc94
RS
12083 case R_MICROMIPS_GOT16:
12084 case R_MICROMIPS_CALL16:
12085 case R_MICROMIPS_CALL_HI16:
12086 case R_MICROMIPS_CALL_LO16:
12087 case R_MICROMIPS_GOT_HI16:
12088 case R_MICROMIPS_GOT_LO16:
12089 case R_MICROMIPS_GOT_DISP:
12090 case R_MICROMIPS_GOT_PAGE:
12091 case R_MICROMIPS_GOT_OFST:
b49e97c9
TS
12092 /* ??? It would seem that the existing MIPS code does no sort
12093 of reference counting or whatnot on its GOT and PLT entries,
12094 so it is not possible to garbage collect them at this time. */
12095 break;
12096
12097 default:
12098 break;
12099 }
12100#endif
12101
b34976b6 12102 return TRUE;
b49e97c9
TS
12103}
12104\f
12105/* Copy data from a MIPS ELF indirect symbol to its direct symbol,
12106 hiding the old indirect symbol. Process additional relocation
12107 information. Also called for weakdefs, in which case we just let
12108 _bfd_elf_link_hash_copy_indirect copy the flags for us. */
12109
12110void
fcfa13d2 12111_bfd_mips_elf_copy_indirect_symbol (struct bfd_link_info *info,
9719ad41
RS
12112 struct elf_link_hash_entry *dir,
12113 struct elf_link_hash_entry *ind)
b49e97c9
TS
12114{
12115 struct mips_elf_link_hash_entry *dirmips, *indmips;
12116
fcfa13d2 12117 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
b49e97c9 12118
861fb55a
DJ
12119 dirmips = (struct mips_elf_link_hash_entry *) dir;
12120 indmips = (struct mips_elf_link_hash_entry *) ind;
12121 /* Any absolute non-dynamic relocations against an indirect or weak
12122 definition will be against the target symbol. */
12123 if (indmips->has_static_relocs)
12124 dirmips->has_static_relocs = TRUE;
12125
b49e97c9
TS
12126 if (ind->root.type != bfd_link_hash_indirect)
12127 return;
12128
b49e97c9
TS
12129 dirmips->possibly_dynamic_relocs += indmips->possibly_dynamic_relocs;
12130 if (indmips->readonly_reloc)
b34976b6 12131 dirmips->readonly_reloc = TRUE;
b49e97c9 12132 if (indmips->no_fn_stub)
b34976b6 12133 dirmips->no_fn_stub = TRUE;
61b0a4af
RS
12134 if (indmips->fn_stub)
12135 {
12136 dirmips->fn_stub = indmips->fn_stub;
12137 indmips->fn_stub = NULL;
12138 }
12139 if (indmips->need_fn_stub)
12140 {
12141 dirmips->need_fn_stub = TRUE;
12142 indmips->need_fn_stub = FALSE;
12143 }
12144 if (indmips->call_stub)
12145 {
12146 dirmips->call_stub = indmips->call_stub;
12147 indmips->call_stub = NULL;
12148 }
12149 if (indmips->call_fp_stub)
12150 {
12151 dirmips->call_fp_stub = indmips->call_fp_stub;
12152 indmips->call_fp_stub = NULL;
12153 }
634835ae
RS
12154 if (indmips->global_got_area < dirmips->global_got_area)
12155 dirmips->global_got_area = indmips->global_got_area;
12156 if (indmips->global_got_area < GGA_NONE)
12157 indmips->global_got_area = GGA_NONE;
861fb55a
DJ
12158 if (indmips->has_nonpic_branches)
12159 dirmips->has_nonpic_branches = TRUE;
b49e97c9 12160}
b49e97c9 12161\f
d01414a5
TS
12162#define PDR_SIZE 32
12163
b34976b6 12164bfd_boolean
9719ad41
RS
12165_bfd_mips_elf_discard_info (bfd *abfd, struct elf_reloc_cookie *cookie,
12166 struct bfd_link_info *info)
d01414a5
TS
12167{
12168 asection *o;
b34976b6 12169 bfd_boolean ret = FALSE;
d01414a5
TS
12170 unsigned char *tdata;
12171 size_t i, skip;
12172
12173 o = bfd_get_section_by_name (abfd, ".pdr");
12174 if (! o)
b34976b6 12175 return FALSE;
eea6121a 12176 if (o->size == 0)
b34976b6 12177 return FALSE;
eea6121a 12178 if (o->size % PDR_SIZE != 0)
b34976b6 12179 return FALSE;
d01414a5
TS
12180 if (o->output_section != NULL
12181 && bfd_is_abs_section (o->output_section))
b34976b6 12182 return FALSE;
d01414a5 12183
eea6121a 12184 tdata = bfd_zmalloc (o->size / PDR_SIZE);
d01414a5 12185 if (! tdata)
b34976b6 12186 return FALSE;
d01414a5 12187
9719ad41 12188 cookie->rels = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
45d6a902 12189 info->keep_memory);
d01414a5
TS
12190 if (!cookie->rels)
12191 {
12192 free (tdata);
b34976b6 12193 return FALSE;
d01414a5
TS
12194 }
12195
12196 cookie->rel = cookie->rels;
12197 cookie->relend = cookie->rels + o->reloc_count;
12198
eea6121a 12199 for (i = 0, skip = 0; i < o->size / PDR_SIZE; i ++)
d01414a5 12200 {
c152c796 12201 if (bfd_elf_reloc_symbol_deleted_p (i * PDR_SIZE, cookie))
d01414a5
TS
12202 {
12203 tdata[i] = 1;
12204 skip ++;
12205 }
12206 }
12207
12208 if (skip != 0)
12209 {
f0abc2a1 12210 mips_elf_section_data (o)->u.tdata = tdata;
eea6121a 12211 o->size -= skip * PDR_SIZE;
b34976b6 12212 ret = TRUE;
d01414a5
TS
12213 }
12214 else
12215 free (tdata);
12216
12217 if (! info->keep_memory)
12218 free (cookie->rels);
12219
12220 return ret;
12221}
12222
b34976b6 12223bfd_boolean
9719ad41 12224_bfd_mips_elf_ignore_discarded_relocs (asection *sec)
53bfd6b4
MR
12225{
12226 if (strcmp (sec->name, ".pdr") == 0)
b34976b6
AM
12227 return TRUE;
12228 return FALSE;
53bfd6b4 12229}
d01414a5 12230
b34976b6 12231bfd_boolean
c7b8f16e
JB
12232_bfd_mips_elf_write_section (bfd *output_bfd,
12233 struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
12234 asection *sec, bfd_byte *contents)
d01414a5
TS
12235{
12236 bfd_byte *to, *from, *end;
12237 int i;
12238
12239 if (strcmp (sec->name, ".pdr") != 0)
b34976b6 12240 return FALSE;
d01414a5 12241
f0abc2a1 12242 if (mips_elf_section_data (sec)->u.tdata == NULL)
b34976b6 12243 return FALSE;
d01414a5
TS
12244
12245 to = contents;
eea6121a 12246 end = contents + sec->size;
d01414a5
TS
12247 for (from = contents, i = 0;
12248 from < end;
12249 from += PDR_SIZE, i++)
12250 {
f0abc2a1 12251 if ((mips_elf_section_data (sec)->u.tdata)[i] == 1)
d01414a5
TS
12252 continue;
12253 if (to != from)
12254 memcpy (to, from, PDR_SIZE);
12255 to += PDR_SIZE;
12256 }
12257 bfd_set_section_contents (output_bfd, sec->output_section, contents,
eea6121a 12258 sec->output_offset, sec->size);
b34976b6 12259 return TRUE;
d01414a5 12260}
53bfd6b4 12261\f
df58fc94
RS
12262/* microMIPS code retains local labels for linker relaxation. Omit them
12263 from output by default for clarity. */
12264
12265bfd_boolean
12266_bfd_mips_elf_is_target_special_symbol (bfd *abfd, asymbol *sym)
12267{
12268 return _bfd_elf_is_local_label_name (abfd, sym->name);
12269}
12270
b49e97c9
TS
12271/* MIPS ELF uses a special find_nearest_line routine in order the
12272 handle the ECOFF debugging information. */
12273
12274struct mips_elf_find_line
12275{
12276 struct ecoff_debug_info d;
12277 struct ecoff_find_line i;
12278};
12279
b34976b6 12280bfd_boolean
9719ad41
RS
12281_bfd_mips_elf_find_nearest_line (bfd *abfd, asection *section,
12282 asymbol **symbols, bfd_vma offset,
12283 const char **filename_ptr,
12284 const char **functionname_ptr,
12285 unsigned int *line_ptr)
b49e97c9
TS
12286{
12287 asection *msec;
12288
12289 if (_bfd_dwarf1_find_nearest_line (abfd, section, symbols, offset,
12290 filename_ptr, functionname_ptr,
12291 line_ptr))
b34976b6 12292 return TRUE;
b49e97c9 12293
fc28f9aa
TG
12294 if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections,
12295 section, symbols, offset,
b49e97c9 12296 filename_ptr, functionname_ptr,
9b8d1a36 12297 line_ptr, NULL, ABI_64_P (abfd) ? 8 : 0,
b49e97c9 12298 &elf_tdata (abfd)->dwarf2_find_line_info))
b34976b6 12299 return TRUE;
b49e97c9
TS
12300
12301 msec = bfd_get_section_by_name (abfd, ".mdebug");
12302 if (msec != NULL)
12303 {
12304 flagword origflags;
12305 struct mips_elf_find_line *fi;
12306 const struct ecoff_debug_swap * const swap =
12307 get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
12308
12309 /* If we are called during a link, mips_elf_final_link may have
12310 cleared the SEC_HAS_CONTENTS field. We force it back on here
12311 if appropriate (which it normally will be). */
12312 origflags = msec->flags;
12313 if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
12314 msec->flags |= SEC_HAS_CONTENTS;
12315
698600e4 12316 fi = mips_elf_tdata (abfd)->find_line_info;
b49e97c9
TS
12317 if (fi == NULL)
12318 {
12319 bfd_size_type external_fdr_size;
12320 char *fraw_src;
12321 char *fraw_end;
12322 struct fdr *fdr_ptr;
12323 bfd_size_type amt = sizeof (struct mips_elf_find_line);
12324
9719ad41 12325 fi = bfd_zalloc (abfd, amt);
b49e97c9
TS
12326 if (fi == NULL)
12327 {
12328 msec->flags = origflags;
b34976b6 12329 return FALSE;
b49e97c9
TS
12330 }
12331
12332 if (! _bfd_mips_elf_read_ecoff_info (abfd, msec, &fi->d))
12333 {
12334 msec->flags = origflags;
b34976b6 12335 return FALSE;
b49e97c9
TS
12336 }
12337
12338 /* Swap in the FDR information. */
12339 amt = fi->d.symbolic_header.ifdMax * sizeof (struct fdr);
9719ad41 12340 fi->d.fdr = bfd_alloc (abfd, amt);
b49e97c9
TS
12341 if (fi->d.fdr == NULL)
12342 {
12343 msec->flags = origflags;
b34976b6 12344 return FALSE;
b49e97c9
TS
12345 }
12346 external_fdr_size = swap->external_fdr_size;
12347 fdr_ptr = fi->d.fdr;
12348 fraw_src = (char *) fi->d.external_fdr;
12349 fraw_end = (fraw_src
12350 + fi->d.symbolic_header.ifdMax * external_fdr_size);
12351 for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
9719ad41 12352 (*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr);
b49e97c9 12353
698600e4 12354 mips_elf_tdata (abfd)->find_line_info = fi;
b49e97c9
TS
12355
12356 /* Note that we don't bother to ever free this information.
12357 find_nearest_line is either called all the time, as in
12358 objdump -l, so the information should be saved, or it is
12359 rarely called, as in ld error messages, so the memory
12360 wasted is unimportant. Still, it would probably be a
12361 good idea for free_cached_info to throw it away. */
12362 }
12363
12364 if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
12365 &fi->i, filename_ptr, functionname_ptr,
12366 line_ptr))
12367 {
12368 msec->flags = origflags;
b34976b6 12369 return TRUE;
b49e97c9
TS
12370 }
12371
12372 msec->flags = origflags;
12373 }
12374
12375 /* Fall back on the generic ELF find_nearest_line routine. */
12376
12377 return _bfd_elf_find_nearest_line (abfd, section, symbols, offset,
12378 filename_ptr, functionname_ptr,
12379 line_ptr);
12380}
4ab527b0
FF
12381
12382bfd_boolean
12383_bfd_mips_elf_find_inliner_info (bfd *abfd,
12384 const char **filename_ptr,
12385 const char **functionname_ptr,
12386 unsigned int *line_ptr)
12387{
12388 bfd_boolean found;
12389 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
12390 functionname_ptr, line_ptr,
12391 & elf_tdata (abfd)->dwarf2_find_line_info);
12392 return found;
12393}
12394
b49e97c9
TS
12395\f
12396/* When are writing out the .options or .MIPS.options section,
12397 remember the bytes we are writing out, so that we can install the
12398 GP value in the section_processing routine. */
12399
b34976b6 12400bfd_boolean
9719ad41
RS
12401_bfd_mips_elf_set_section_contents (bfd *abfd, sec_ptr section,
12402 const void *location,
12403 file_ptr offset, bfd_size_type count)
b49e97c9 12404{
cc2e31b9 12405 if (MIPS_ELF_OPTIONS_SECTION_NAME_P (section->name))
b49e97c9
TS
12406 {
12407 bfd_byte *c;
12408
12409 if (elf_section_data (section) == NULL)
12410 {
12411 bfd_size_type amt = sizeof (struct bfd_elf_section_data);
9719ad41 12412 section->used_by_bfd = bfd_zalloc (abfd, amt);
b49e97c9 12413 if (elf_section_data (section) == NULL)
b34976b6 12414 return FALSE;
b49e97c9 12415 }
f0abc2a1 12416 c = mips_elf_section_data (section)->u.tdata;
b49e97c9
TS
12417 if (c == NULL)
12418 {
eea6121a 12419 c = bfd_zalloc (abfd, section->size);
b49e97c9 12420 if (c == NULL)
b34976b6 12421 return FALSE;
f0abc2a1 12422 mips_elf_section_data (section)->u.tdata = c;
b49e97c9
TS
12423 }
12424
9719ad41 12425 memcpy (c + offset, location, count);
b49e97c9
TS
12426 }
12427
12428 return _bfd_elf_set_section_contents (abfd, section, location, offset,
12429 count);
12430}
12431
12432/* This is almost identical to bfd_generic_get_... except that some
12433 MIPS relocations need to be handled specially. Sigh. */
12434
12435bfd_byte *
9719ad41
RS
12436_bfd_elf_mips_get_relocated_section_contents
12437 (bfd *abfd,
12438 struct bfd_link_info *link_info,
12439 struct bfd_link_order *link_order,
12440 bfd_byte *data,
12441 bfd_boolean relocatable,
12442 asymbol **symbols)
b49e97c9
TS
12443{
12444 /* Get enough memory to hold the stuff */
12445 bfd *input_bfd = link_order->u.indirect.section->owner;
12446 asection *input_section = link_order->u.indirect.section;
eea6121a 12447 bfd_size_type sz;
b49e97c9
TS
12448
12449 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
12450 arelent **reloc_vector = NULL;
12451 long reloc_count;
12452
12453 if (reloc_size < 0)
12454 goto error_return;
12455
9719ad41 12456 reloc_vector = bfd_malloc (reloc_size);
b49e97c9
TS
12457 if (reloc_vector == NULL && reloc_size != 0)
12458 goto error_return;
12459
12460 /* read in the section */
eea6121a
AM
12461 sz = input_section->rawsize ? input_section->rawsize : input_section->size;
12462 if (!bfd_get_section_contents (input_bfd, input_section, data, 0, sz))
b49e97c9
TS
12463 goto error_return;
12464
b49e97c9
TS
12465 reloc_count = bfd_canonicalize_reloc (input_bfd,
12466 input_section,
12467 reloc_vector,
12468 symbols);
12469 if (reloc_count < 0)
12470 goto error_return;
12471
12472 if (reloc_count > 0)
12473 {
12474 arelent **parent;
12475 /* for mips */
12476 int gp_found;
12477 bfd_vma gp = 0x12345678; /* initialize just to shut gcc up */
12478
12479 {
12480 struct bfd_hash_entry *h;
12481 struct bfd_link_hash_entry *lh;
12482 /* Skip all this stuff if we aren't mixing formats. */
12483 if (abfd && input_bfd
12484 && abfd->xvec == input_bfd->xvec)
12485 lh = 0;
12486 else
12487 {
b34976b6 12488 h = bfd_hash_lookup (&link_info->hash->table, "_gp", FALSE, FALSE);
b49e97c9
TS
12489 lh = (struct bfd_link_hash_entry *) h;
12490 }
12491 lookup:
12492 if (lh)
12493 {
12494 switch (lh->type)
12495 {
12496 case bfd_link_hash_undefined:
12497 case bfd_link_hash_undefweak:
12498 case bfd_link_hash_common:
12499 gp_found = 0;
12500 break;
12501 case bfd_link_hash_defined:
12502 case bfd_link_hash_defweak:
12503 gp_found = 1;
12504 gp = lh->u.def.value;
12505 break;
12506 case bfd_link_hash_indirect:
12507 case bfd_link_hash_warning:
12508 lh = lh->u.i.link;
12509 /* @@FIXME ignoring warning for now */
12510 goto lookup;
12511 case bfd_link_hash_new:
12512 default:
12513 abort ();
12514 }
12515 }
12516 else
12517 gp_found = 0;
12518 }
12519 /* end mips */
9719ad41 12520 for (parent = reloc_vector; *parent != NULL; parent++)
b49e97c9 12521 {
9719ad41 12522 char *error_message = NULL;
b49e97c9
TS
12523 bfd_reloc_status_type r;
12524
12525 /* Specific to MIPS: Deal with relocation types that require
12526 knowing the gp of the output bfd. */
12527 asymbol *sym = *(*parent)->sym_ptr_ptr;
b49e97c9 12528
8236346f
EC
12529 /* If we've managed to find the gp and have a special
12530 function for the relocation then go ahead, else default
12531 to the generic handling. */
12532 if (gp_found
12533 && (*parent)->howto->special_function
12534 == _bfd_mips_elf32_gprel16_reloc)
12535 r = _bfd_mips_elf_gprel16_with_gp (input_bfd, sym, *parent,
12536 input_section, relocatable,
12537 data, gp);
12538 else
86324f90 12539 r = bfd_perform_relocation (input_bfd, *parent, data,
8236346f
EC
12540 input_section,
12541 relocatable ? abfd : NULL,
12542 &error_message);
b49e97c9 12543
1049f94e 12544 if (relocatable)
b49e97c9
TS
12545 {
12546 asection *os = input_section->output_section;
12547
12548 /* A partial link, so keep the relocs */
12549 os->orelocation[os->reloc_count] = *parent;
12550 os->reloc_count++;
12551 }
12552
12553 if (r != bfd_reloc_ok)
12554 {
12555 switch (r)
12556 {
12557 case bfd_reloc_undefined:
12558 if (!((*link_info->callbacks->undefined_symbol)
12559 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
5e2b0d47 12560 input_bfd, input_section, (*parent)->address, TRUE)))
b49e97c9
TS
12561 goto error_return;
12562 break;
12563 case bfd_reloc_dangerous:
9719ad41 12564 BFD_ASSERT (error_message != NULL);
b49e97c9
TS
12565 if (!((*link_info->callbacks->reloc_dangerous)
12566 (link_info, error_message, input_bfd, input_section,
12567 (*parent)->address)))
12568 goto error_return;
12569 break;
12570 case bfd_reloc_overflow:
12571 if (!((*link_info->callbacks->reloc_overflow)
dfeffb9f
L
12572 (link_info, NULL,
12573 bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
b49e97c9
TS
12574 (*parent)->howto->name, (*parent)->addend,
12575 input_bfd, input_section, (*parent)->address)))
12576 goto error_return;
12577 break;
12578 case bfd_reloc_outofrange:
12579 default:
12580 abort ();
12581 break;
12582 }
12583
12584 }
12585 }
12586 }
12587 if (reloc_vector != NULL)
12588 free (reloc_vector);
12589 return data;
12590
12591error_return:
12592 if (reloc_vector != NULL)
12593 free (reloc_vector);
12594 return NULL;
12595}
12596\f
df58fc94
RS
12597static bfd_boolean
12598mips_elf_relax_delete_bytes (bfd *abfd,
12599 asection *sec, bfd_vma addr, int count)
12600{
12601 Elf_Internal_Shdr *symtab_hdr;
12602 unsigned int sec_shndx;
12603 bfd_byte *contents;
12604 Elf_Internal_Rela *irel, *irelend;
12605 Elf_Internal_Sym *isym;
12606 Elf_Internal_Sym *isymend;
12607 struct elf_link_hash_entry **sym_hashes;
12608 struct elf_link_hash_entry **end_hashes;
12609 struct elf_link_hash_entry **start_hashes;
12610 unsigned int symcount;
12611
12612 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec);
12613 contents = elf_section_data (sec)->this_hdr.contents;
12614
12615 irel = elf_section_data (sec)->relocs;
12616 irelend = irel + sec->reloc_count;
12617
12618 /* Actually delete the bytes. */
12619 memmove (contents + addr, contents + addr + count,
12620 (size_t) (sec->size - addr - count));
12621 sec->size -= count;
12622
12623 /* Adjust all the relocs. */
12624 for (irel = elf_section_data (sec)->relocs; irel < irelend; irel++)
12625 {
12626 /* Get the new reloc address. */
12627 if (irel->r_offset > addr)
12628 irel->r_offset -= count;
12629 }
12630
12631 BFD_ASSERT (addr % 2 == 0);
12632 BFD_ASSERT (count % 2 == 0);
12633
12634 /* Adjust the local symbols defined in this section. */
12635 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
12636 isym = (Elf_Internal_Sym *) symtab_hdr->contents;
12637 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
2309ddf2 12638 if (isym->st_shndx == sec_shndx && isym->st_value > addr)
df58fc94
RS
12639 isym->st_value -= count;
12640
12641 /* Now adjust the global symbols defined in this section. */
12642 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
12643 - symtab_hdr->sh_info);
12644 sym_hashes = start_hashes = elf_sym_hashes (abfd);
12645 end_hashes = sym_hashes + symcount;
12646
12647 for (; sym_hashes < end_hashes; sym_hashes++)
12648 {
12649 struct elf_link_hash_entry *sym_hash = *sym_hashes;
12650
12651 if ((sym_hash->root.type == bfd_link_hash_defined
12652 || sym_hash->root.type == bfd_link_hash_defweak)
12653 && sym_hash->root.u.def.section == sec)
12654 {
2309ddf2 12655 bfd_vma value = sym_hash->root.u.def.value;
df58fc94 12656
df58fc94
RS
12657 if (ELF_ST_IS_MICROMIPS (sym_hash->other))
12658 value &= MINUS_TWO;
12659 if (value > addr)
12660 sym_hash->root.u.def.value -= count;
12661 }
12662 }
12663
12664 return TRUE;
12665}
12666
12667
12668/* Opcodes needed for microMIPS relaxation as found in
12669 opcodes/micromips-opc.c. */
12670
12671struct opcode_descriptor {
12672 unsigned long match;
12673 unsigned long mask;
12674};
12675
12676/* The $ra register aka $31. */
12677
12678#define RA 31
12679
12680/* 32-bit instruction format register fields. */
12681
12682#define OP32_SREG(opcode) (((opcode) >> 16) & 0x1f)
12683#define OP32_TREG(opcode) (((opcode) >> 21) & 0x1f)
12684
12685/* Check if a 5-bit register index can be abbreviated to 3 bits. */
12686
12687#define OP16_VALID_REG(r) \
12688 ((2 <= (r) && (r) <= 7) || (16 <= (r) && (r) <= 17))
12689
12690
12691/* 32-bit and 16-bit branches. */
12692
12693static const struct opcode_descriptor b_insns_32[] = {
12694 { /* "b", "p", */ 0x40400000, 0xffff0000 }, /* bgez 0 */
12695 { /* "b", "p", */ 0x94000000, 0xffff0000 }, /* beq 0, 0 */
12696 { 0, 0 } /* End marker for find_match(). */
12697};
12698
12699static const struct opcode_descriptor bc_insn_32 =
12700 { /* "bc(1|2)(ft)", "N,p", */ 0x42800000, 0xfec30000 };
12701
12702static const struct opcode_descriptor bz_insn_32 =
12703 { /* "b(g|l)(e|t)z", "s,p", */ 0x40000000, 0xff200000 };
12704
12705static const struct opcode_descriptor bzal_insn_32 =
12706 { /* "b(ge|lt)zal", "s,p", */ 0x40200000, 0xffa00000 };
12707
12708static const struct opcode_descriptor beq_insn_32 =
12709 { /* "b(eq|ne)", "s,t,p", */ 0x94000000, 0xdc000000 };
12710
12711static const struct opcode_descriptor b_insn_16 =
12712 { /* "b", "mD", */ 0xcc00, 0xfc00 };
12713
12714static const struct opcode_descriptor bz_insn_16 =
c088dedf 12715 { /* "b(eq|ne)z", "md,mE", */ 0x8c00, 0xdc00 };
df58fc94
RS
12716
12717
12718/* 32-bit and 16-bit branch EQ and NE zero. */
12719
12720/* NOTE: All opcode tables have BEQ/BNE in the same order: first the
12721 eq and second the ne. This convention is used when replacing a
12722 32-bit BEQ/BNE with the 16-bit version. */
12723
12724#define BZC32_REG_FIELD(r) (((r) & 0x1f) << 16)
12725
12726static const struct opcode_descriptor bz_rs_insns_32[] = {
12727 { /* "beqz", "s,p", */ 0x94000000, 0xffe00000 },
12728 { /* "bnez", "s,p", */ 0xb4000000, 0xffe00000 },
12729 { 0, 0 } /* End marker for find_match(). */
12730};
12731
12732static const struct opcode_descriptor bz_rt_insns_32[] = {
12733 { /* "beqz", "t,p", */ 0x94000000, 0xfc01f000 },
12734 { /* "bnez", "t,p", */ 0xb4000000, 0xfc01f000 },
12735 { 0, 0 } /* End marker for find_match(). */
12736};
12737
12738static const struct opcode_descriptor bzc_insns_32[] = {
12739 { /* "beqzc", "s,p", */ 0x40e00000, 0xffe00000 },
12740 { /* "bnezc", "s,p", */ 0x40a00000, 0xffe00000 },
12741 { 0, 0 } /* End marker for find_match(). */
12742};
12743
12744static const struct opcode_descriptor bz_insns_16[] = {
12745 { /* "beqz", "md,mE", */ 0x8c00, 0xfc00 },
12746 { /* "bnez", "md,mE", */ 0xac00, 0xfc00 },
12747 { 0, 0 } /* End marker for find_match(). */
12748};
12749
12750/* Switch between a 5-bit register index and its 3-bit shorthand. */
12751
12752#define BZ16_REG(opcode) ((((((opcode) >> 7) & 7) + 0x1e) & 0x17) + 2)
12753#define BZ16_REG_FIELD(r) \
12754 (((2 <= (r) && (r) <= 7) ? (r) : ((r) - 16)) << 7)
12755
12756
12757/* 32-bit instructions with a delay slot. */
12758
12759static const struct opcode_descriptor jal_insn_32_bd16 =
12760 { /* "jals", "a", */ 0x74000000, 0xfc000000 };
12761
12762static const struct opcode_descriptor jal_insn_32_bd32 =
12763 { /* "jal", "a", */ 0xf4000000, 0xfc000000 };
12764
12765static const struct opcode_descriptor jal_x_insn_32_bd32 =
12766 { /* "jal[x]", "a", */ 0xf0000000, 0xf8000000 };
12767
12768static const struct opcode_descriptor j_insn_32 =
12769 { /* "j", "a", */ 0xd4000000, 0xfc000000 };
12770
12771static const struct opcode_descriptor jalr_insn_32 =
12772 { /* "jalr[.hb]", "t,s", */ 0x00000f3c, 0xfc00efff };
12773
12774/* This table can be compacted, because no opcode replacement is made. */
12775
12776static const struct opcode_descriptor ds_insns_32_bd16[] = {
12777 { /* "jals", "a", */ 0x74000000, 0xfc000000 },
12778
12779 { /* "jalrs[.hb]", "t,s", */ 0x00004f3c, 0xfc00efff },
12780 { /* "b(ge|lt)zals", "s,p", */ 0x42200000, 0xffa00000 },
12781
12782 { /* "b(g|l)(e|t)z", "s,p", */ 0x40000000, 0xff200000 },
12783 { /* "b(eq|ne)", "s,t,p", */ 0x94000000, 0xdc000000 },
12784 { /* "j", "a", */ 0xd4000000, 0xfc000000 },
12785 { 0, 0 } /* End marker for find_match(). */
12786};
12787
12788/* This table can be compacted, because no opcode replacement is made. */
12789
12790static const struct opcode_descriptor ds_insns_32_bd32[] = {
12791 { /* "jal[x]", "a", */ 0xf0000000, 0xf8000000 },
12792
12793 { /* "jalr[.hb]", "t,s", */ 0x00000f3c, 0xfc00efff },
12794 { /* "b(ge|lt)zal", "s,p", */ 0x40200000, 0xffa00000 },
12795 { 0, 0 } /* End marker for find_match(). */
12796};
12797
12798
12799/* 16-bit instructions with a delay slot. */
12800
12801static const struct opcode_descriptor jalr_insn_16_bd16 =
12802 { /* "jalrs", "my,mj", */ 0x45e0, 0xffe0 };
12803
12804static const struct opcode_descriptor jalr_insn_16_bd32 =
12805 { /* "jalr", "my,mj", */ 0x45c0, 0xffe0 };
12806
12807static const struct opcode_descriptor jr_insn_16 =
12808 { /* "jr", "mj", */ 0x4580, 0xffe0 };
12809
12810#define JR16_REG(opcode) ((opcode) & 0x1f)
12811
12812/* This table can be compacted, because no opcode replacement is made. */
12813
12814static const struct opcode_descriptor ds_insns_16_bd16[] = {
12815 { /* "jalrs", "my,mj", */ 0x45e0, 0xffe0 },
12816
12817 { /* "b", "mD", */ 0xcc00, 0xfc00 },
12818 { /* "b(eq|ne)z", "md,mE", */ 0x8c00, 0xdc00 },
12819 { /* "jr", "mj", */ 0x4580, 0xffe0 },
12820 { 0, 0 } /* End marker for find_match(). */
12821};
12822
12823
12824/* LUI instruction. */
12825
12826static const struct opcode_descriptor lui_insn =
12827 { /* "lui", "s,u", */ 0x41a00000, 0xffe00000 };
12828
12829
12830/* ADDIU instruction. */
12831
12832static const struct opcode_descriptor addiu_insn =
12833 { /* "addiu", "t,r,j", */ 0x30000000, 0xfc000000 };
12834
12835static const struct opcode_descriptor addiupc_insn =
12836 { /* "addiu", "mb,$pc,mQ", */ 0x78000000, 0xfc000000 };
12837
12838#define ADDIUPC_REG_FIELD(r) \
12839 (((2 <= (r) && (r) <= 7) ? (r) : ((r) - 16)) << 23)
12840
12841
12842/* Relaxable instructions in a JAL delay slot: MOVE. */
12843
12844/* The 16-bit move has rd in 9:5 and rs in 4:0. The 32-bit moves
12845 (ADDU, OR) have rd in 15:11 and rs in 10:16. */
12846#define MOVE32_RD(opcode) (((opcode) >> 11) & 0x1f)
12847#define MOVE32_RS(opcode) (((opcode) >> 16) & 0x1f)
12848
12849#define MOVE16_RD_FIELD(r) (((r) & 0x1f) << 5)
12850#define MOVE16_RS_FIELD(r) (((r) & 0x1f) )
12851
12852static const struct opcode_descriptor move_insns_32[] = {
12853 { /* "move", "d,s", */ 0x00000150, 0xffe007ff }, /* addu d,s,$0 */
12854 { /* "move", "d,s", */ 0x00000290, 0xffe007ff }, /* or d,s,$0 */
12855 { 0, 0 } /* End marker for find_match(). */
12856};
12857
12858static const struct opcode_descriptor move_insn_16 =
12859 { /* "move", "mp,mj", */ 0x0c00, 0xfc00 };
12860
12861
12862/* NOP instructions. */
12863
12864static const struct opcode_descriptor nop_insn_32 =
12865 { /* "nop", "", */ 0x00000000, 0xffffffff };
12866
12867static const struct opcode_descriptor nop_insn_16 =
12868 { /* "nop", "", */ 0x0c00, 0xffff };
12869
12870
12871/* Instruction match support. */
12872
12873#define MATCH(opcode, insn) ((opcode & insn.mask) == insn.match)
12874
12875static int
12876find_match (unsigned long opcode, const struct opcode_descriptor insn[])
12877{
12878 unsigned long indx;
12879
12880 for (indx = 0; insn[indx].mask != 0; indx++)
12881 if (MATCH (opcode, insn[indx]))
12882 return indx;
12883
12884 return -1;
12885}
12886
12887
12888/* Branch and delay slot decoding support. */
12889
12890/* If PTR points to what *might* be a 16-bit branch or jump, then
12891 return the minimum length of its delay slot, otherwise return 0.
12892 Non-zero results are not definitive as we might be checking against
12893 the second half of another instruction. */
12894
12895static int
12896check_br16_dslot (bfd *abfd, bfd_byte *ptr)
12897{
12898 unsigned long opcode;
12899 int bdsize;
12900
12901 opcode = bfd_get_16 (abfd, ptr);
12902 if (MATCH (opcode, jalr_insn_16_bd32) != 0)
12903 /* 16-bit branch/jump with a 32-bit delay slot. */
12904 bdsize = 4;
12905 else if (MATCH (opcode, jalr_insn_16_bd16) != 0
12906 || find_match (opcode, ds_insns_16_bd16) >= 0)
12907 /* 16-bit branch/jump with a 16-bit delay slot. */
12908 bdsize = 2;
12909 else
12910 /* No delay slot. */
12911 bdsize = 0;
12912
12913 return bdsize;
12914}
12915
12916/* If PTR points to what *might* be a 32-bit branch or jump, then
12917 return the minimum length of its delay slot, otherwise return 0.
12918 Non-zero results are not definitive as we might be checking against
12919 the second half of another instruction. */
12920
12921static int
12922check_br32_dslot (bfd *abfd, bfd_byte *ptr)
12923{
12924 unsigned long opcode;
12925 int bdsize;
12926
d21911ea 12927 opcode = bfd_get_micromips_32 (abfd, ptr);
df58fc94
RS
12928 if (find_match (opcode, ds_insns_32_bd32) >= 0)
12929 /* 32-bit branch/jump with a 32-bit delay slot. */
12930 bdsize = 4;
12931 else if (find_match (opcode, ds_insns_32_bd16) >= 0)
12932 /* 32-bit branch/jump with a 16-bit delay slot. */
12933 bdsize = 2;
12934 else
12935 /* No delay slot. */
12936 bdsize = 0;
12937
12938 return bdsize;
12939}
12940
12941/* If PTR points to a 16-bit branch or jump with a 32-bit delay slot
12942 that doesn't fiddle with REG, then return TRUE, otherwise FALSE. */
12943
12944static bfd_boolean
12945check_br16 (bfd *abfd, bfd_byte *ptr, unsigned long reg)
12946{
12947 unsigned long opcode;
12948
12949 opcode = bfd_get_16 (abfd, ptr);
12950 if (MATCH (opcode, b_insn_16)
12951 /* B16 */
12952 || (MATCH (opcode, jr_insn_16) && reg != JR16_REG (opcode))
12953 /* JR16 */
12954 || (MATCH (opcode, bz_insn_16) && reg != BZ16_REG (opcode))
12955 /* BEQZ16, BNEZ16 */
12956 || (MATCH (opcode, jalr_insn_16_bd32)
12957 /* JALR16 */
12958 && reg != JR16_REG (opcode) && reg != RA))
12959 return TRUE;
12960
12961 return FALSE;
12962}
12963
12964/* If PTR points to a 32-bit branch or jump that doesn't fiddle with REG,
12965 then return TRUE, otherwise FALSE. */
12966
f41e5fcc 12967static bfd_boolean
df58fc94
RS
12968check_br32 (bfd *abfd, bfd_byte *ptr, unsigned long reg)
12969{
12970 unsigned long opcode;
12971
d21911ea 12972 opcode = bfd_get_micromips_32 (abfd, ptr);
df58fc94
RS
12973 if (MATCH (opcode, j_insn_32)
12974 /* J */
12975 || MATCH (opcode, bc_insn_32)
12976 /* BC1F, BC1T, BC2F, BC2T */
12977 || (MATCH (opcode, jal_x_insn_32_bd32) && reg != RA)
12978 /* JAL, JALX */
12979 || (MATCH (opcode, bz_insn_32) && reg != OP32_SREG (opcode))
12980 /* BGEZ, BGTZ, BLEZ, BLTZ */
12981 || (MATCH (opcode, bzal_insn_32)
12982 /* BGEZAL, BLTZAL */
12983 && reg != OP32_SREG (opcode) && reg != RA)
12984 || ((MATCH (opcode, jalr_insn_32) || MATCH (opcode, beq_insn_32))
12985 /* JALR, JALR.HB, BEQ, BNE */
12986 && reg != OP32_SREG (opcode) && reg != OP32_TREG (opcode)))
12987 return TRUE;
12988
12989 return FALSE;
12990}
12991
80cab405
MR
12992/* If the instruction encoding at PTR and relocations [INTERNAL_RELOCS,
12993 IRELEND) at OFFSET indicate that there must be a compact branch there,
12994 then return TRUE, otherwise FALSE. */
df58fc94
RS
12995
12996static bfd_boolean
80cab405
MR
12997check_relocated_bzc (bfd *abfd, const bfd_byte *ptr, bfd_vma offset,
12998 const Elf_Internal_Rela *internal_relocs,
12999 const Elf_Internal_Rela *irelend)
df58fc94 13000{
80cab405
MR
13001 const Elf_Internal_Rela *irel;
13002 unsigned long opcode;
13003
d21911ea 13004 opcode = bfd_get_micromips_32 (abfd, ptr);
80cab405
MR
13005 if (find_match (opcode, bzc_insns_32) < 0)
13006 return FALSE;
df58fc94
RS
13007
13008 for (irel = internal_relocs; irel < irelend; irel++)
80cab405
MR
13009 if (irel->r_offset == offset
13010 && ELF32_R_TYPE (irel->r_info) == R_MICROMIPS_PC16_S1)
13011 return TRUE;
13012
df58fc94
RS
13013 return FALSE;
13014}
80cab405
MR
13015
13016/* Bitsize checking. */
13017#define IS_BITSIZE(val, N) \
13018 (((((val) & ((1ULL << (N)) - 1)) ^ (1ULL << ((N) - 1))) \
13019 - (1ULL << ((N) - 1))) == (val))
13020
df58fc94
RS
13021\f
13022bfd_boolean
13023_bfd_mips_elf_relax_section (bfd *abfd, asection *sec,
13024 struct bfd_link_info *link_info,
13025 bfd_boolean *again)
13026{
833794fc 13027 bfd_boolean insn32 = mips_elf_hash_table (link_info)->insn32;
df58fc94
RS
13028 Elf_Internal_Shdr *symtab_hdr;
13029 Elf_Internal_Rela *internal_relocs;
13030 Elf_Internal_Rela *irel, *irelend;
13031 bfd_byte *contents = NULL;
13032 Elf_Internal_Sym *isymbuf = NULL;
13033
13034 /* Assume nothing changes. */
13035 *again = FALSE;
13036
13037 /* We don't have to do anything for a relocatable link, if
13038 this section does not have relocs, or if this is not a
13039 code section. */
13040
13041 if (link_info->relocatable
13042 || (sec->flags & SEC_RELOC) == 0
13043 || sec->reloc_count == 0
13044 || (sec->flags & SEC_CODE) == 0)
13045 return TRUE;
13046
13047 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
13048
13049 /* Get a copy of the native relocations. */
13050 internal_relocs = (_bfd_elf_link_read_relocs
2c3fc389 13051 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
df58fc94
RS
13052 link_info->keep_memory));
13053 if (internal_relocs == NULL)
13054 goto error_return;
13055
13056 /* Walk through them looking for relaxing opportunities. */
13057 irelend = internal_relocs + sec->reloc_count;
13058 for (irel = internal_relocs; irel < irelend; irel++)
13059 {
13060 unsigned long r_symndx = ELF32_R_SYM (irel->r_info);
13061 unsigned int r_type = ELF32_R_TYPE (irel->r_info);
13062 bfd_boolean target_is_micromips_code_p;
13063 unsigned long opcode;
13064 bfd_vma symval;
13065 bfd_vma pcrval;
2309ddf2 13066 bfd_byte *ptr;
df58fc94
RS
13067 int fndopc;
13068
13069 /* The number of bytes to delete for relaxation and from where
13070 to delete these bytes starting at irel->r_offset. */
13071 int delcnt = 0;
13072 int deloff = 0;
13073
13074 /* If this isn't something that can be relaxed, then ignore
13075 this reloc. */
13076 if (r_type != R_MICROMIPS_HI16
13077 && r_type != R_MICROMIPS_PC16_S1
2309ddf2 13078 && r_type != R_MICROMIPS_26_S1)
df58fc94
RS
13079 continue;
13080
13081 /* Get the section contents if we haven't done so already. */
13082 if (contents == NULL)
13083 {
13084 /* Get cached copy if it exists. */
13085 if (elf_section_data (sec)->this_hdr.contents != NULL)
13086 contents = elf_section_data (sec)->this_hdr.contents;
13087 /* Go get them off disk. */
13088 else if (!bfd_malloc_and_get_section (abfd, sec, &contents))
13089 goto error_return;
13090 }
2309ddf2 13091 ptr = contents + irel->r_offset;
df58fc94
RS
13092
13093 /* Read this BFD's local symbols if we haven't done so already. */
13094 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
13095 {
13096 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
13097 if (isymbuf == NULL)
13098 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
13099 symtab_hdr->sh_info, 0,
13100 NULL, NULL, NULL);
13101 if (isymbuf == NULL)
13102 goto error_return;
13103 }
13104
13105 /* Get the value of the symbol referred to by the reloc. */
13106 if (r_symndx < symtab_hdr->sh_info)
13107 {
13108 /* A local symbol. */
13109 Elf_Internal_Sym *isym;
13110 asection *sym_sec;
13111
13112 isym = isymbuf + r_symndx;
13113 if (isym->st_shndx == SHN_UNDEF)
13114 sym_sec = bfd_und_section_ptr;
13115 else if (isym->st_shndx == SHN_ABS)
13116 sym_sec = bfd_abs_section_ptr;
13117 else if (isym->st_shndx == SHN_COMMON)
13118 sym_sec = bfd_com_section_ptr;
13119 else
13120 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
13121 symval = (isym->st_value
13122 + sym_sec->output_section->vma
13123 + sym_sec->output_offset);
13124 target_is_micromips_code_p = ELF_ST_IS_MICROMIPS (isym->st_other);
13125 }
13126 else
13127 {
13128 unsigned long indx;
13129 struct elf_link_hash_entry *h;
13130
13131 /* An external symbol. */
13132 indx = r_symndx - symtab_hdr->sh_info;
13133 h = elf_sym_hashes (abfd)[indx];
13134 BFD_ASSERT (h != NULL);
13135
13136 if (h->root.type != bfd_link_hash_defined
13137 && h->root.type != bfd_link_hash_defweak)
13138 /* This appears to be a reference to an undefined
13139 symbol. Just ignore it -- it will be caught by the
13140 regular reloc processing. */
13141 continue;
13142
13143 symval = (h->root.u.def.value
13144 + h->root.u.def.section->output_section->vma
13145 + h->root.u.def.section->output_offset);
13146 target_is_micromips_code_p = (!h->needs_plt
13147 && ELF_ST_IS_MICROMIPS (h->other));
13148 }
13149
13150
13151 /* For simplicity of coding, we are going to modify the
13152 section contents, the section relocs, and the BFD symbol
13153 table. We must tell the rest of the code not to free up this
13154 information. It would be possible to instead create a table
13155 of changes which have to be made, as is done in coff-mips.c;
13156 that would be more work, but would require less memory when
13157 the linker is run. */
13158
13159 /* Only 32-bit instructions relaxed. */
13160 if (irel->r_offset + 4 > sec->size)
13161 continue;
13162
d21911ea 13163 opcode = bfd_get_micromips_32 (abfd, ptr);
df58fc94
RS
13164
13165 /* This is the pc-relative distance from the instruction the
13166 relocation is applied to, to the symbol referred. */
13167 pcrval = (symval
13168 - (sec->output_section->vma + sec->output_offset)
13169 - irel->r_offset);
13170
13171 /* R_MICROMIPS_HI16 / LUI relaxation to nil, performing relaxation
13172 of corresponding R_MICROMIPS_LO16 to R_MICROMIPS_HI0_LO16 or
13173 R_MICROMIPS_PC23_S2. The R_MICROMIPS_PC23_S2 condition is
13174
13175 (symval % 4 == 0 && IS_BITSIZE (pcrval, 25))
13176
13177 where pcrval has first to be adjusted to apply against the LO16
13178 location (we make the adjustment later on, when we have figured
13179 out the offset). */
13180 if (r_type == R_MICROMIPS_HI16 && MATCH (opcode, lui_insn))
13181 {
80cab405 13182 bfd_boolean bzc = FALSE;
df58fc94
RS
13183 unsigned long nextopc;
13184 unsigned long reg;
13185 bfd_vma offset;
13186
13187 /* Give up if the previous reloc was a HI16 against this symbol
13188 too. */
13189 if (irel > internal_relocs
13190 && ELF32_R_TYPE (irel[-1].r_info) == R_MICROMIPS_HI16
13191 && ELF32_R_SYM (irel[-1].r_info) == r_symndx)
13192 continue;
13193
13194 /* Or if the next reloc is not a LO16 against this symbol. */
13195 if (irel + 1 >= irelend
13196 || ELF32_R_TYPE (irel[1].r_info) != R_MICROMIPS_LO16
13197 || ELF32_R_SYM (irel[1].r_info) != r_symndx)
13198 continue;
13199
13200 /* Or if the second next reloc is a LO16 against this symbol too. */
13201 if (irel + 2 >= irelend
13202 && ELF32_R_TYPE (irel[2].r_info) == R_MICROMIPS_LO16
13203 && ELF32_R_SYM (irel[2].r_info) == r_symndx)
13204 continue;
13205
80cab405
MR
13206 /* See if the LUI instruction *might* be in a branch delay slot.
13207 We check whether what looks like a 16-bit branch or jump is
13208 actually an immediate argument to a compact branch, and let
13209 it through if so. */
df58fc94 13210 if (irel->r_offset >= 2
2309ddf2 13211 && check_br16_dslot (abfd, ptr - 2)
df58fc94 13212 && !(irel->r_offset >= 4
80cab405
MR
13213 && (bzc = check_relocated_bzc (abfd,
13214 ptr - 4, irel->r_offset - 4,
13215 internal_relocs, irelend))))
df58fc94
RS
13216 continue;
13217 if (irel->r_offset >= 4
80cab405 13218 && !bzc
2309ddf2 13219 && check_br32_dslot (abfd, ptr - 4))
df58fc94
RS
13220 continue;
13221
13222 reg = OP32_SREG (opcode);
13223
13224 /* We only relax adjacent instructions or ones separated with
13225 a branch or jump that has a delay slot. The branch or jump
13226 must not fiddle with the register used to hold the address.
13227 Subtract 4 for the LUI itself. */
13228 offset = irel[1].r_offset - irel[0].r_offset;
13229 switch (offset - 4)
13230 {
13231 case 0:
13232 break;
13233 case 2:
2309ddf2 13234 if (check_br16 (abfd, ptr + 4, reg))
df58fc94
RS
13235 break;
13236 continue;
13237 case 4:
2309ddf2 13238 if (check_br32 (abfd, ptr + 4, reg))
df58fc94
RS
13239 break;
13240 continue;
13241 default:
13242 continue;
13243 }
13244
d21911ea 13245 nextopc = bfd_get_micromips_32 (abfd, contents + irel[1].r_offset);
df58fc94
RS
13246
13247 /* Give up unless the same register is used with both
13248 relocations. */
13249 if (OP32_SREG (nextopc) != reg)
13250 continue;
13251
13252 /* Now adjust pcrval, subtracting the offset to the LO16 reloc
13253 and rounding up to take masking of the two LSBs into account. */
13254 pcrval = ((pcrval - offset + 3) | 3) ^ 3;
13255
13256 /* R_MICROMIPS_LO16 relaxation to R_MICROMIPS_HI0_LO16. */
13257 if (IS_BITSIZE (symval, 16))
13258 {
13259 /* Fix the relocation's type. */
13260 irel[1].r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_HI0_LO16);
13261
13262 /* Instructions using R_MICROMIPS_LO16 have the base or
13263 source register in bits 20:16. This register becomes $0
13264 (zero) as the result of the R_MICROMIPS_HI16 being 0. */
13265 nextopc &= ~0x001f0000;
13266 bfd_put_16 (abfd, (nextopc >> 16) & 0xffff,
13267 contents + irel[1].r_offset);
13268 }
13269
13270 /* R_MICROMIPS_LO16 / ADDIU relaxation to R_MICROMIPS_PC23_S2.
13271 We add 4 to take LUI deletion into account while checking
13272 the PC-relative distance. */
13273 else if (symval % 4 == 0
13274 && IS_BITSIZE (pcrval + 4, 25)
13275 && MATCH (nextopc, addiu_insn)
13276 && OP32_TREG (nextopc) == OP32_SREG (nextopc)
13277 && OP16_VALID_REG (OP32_TREG (nextopc)))
13278 {
13279 /* Fix the relocation's type. */
13280 irel[1].r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC23_S2);
13281
13282 /* Replace ADDIU with the ADDIUPC version. */
13283 nextopc = (addiupc_insn.match
13284 | ADDIUPC_REG_FIELD (OP32_TREG (nextopc)));
13285
d21911ea
MR
13286 bfd_put_micromips_32 (abfd, nextopc,
13287 contents + irel[1].r_offset);
df58fc94
RS
13288 }
13289
13290 /* Can't do anything, give up, sigh... */
13291 else
13292 continue;
13293
13294 /* Fix the relocation's type. */
13295 irel->r_info = ELF32_R_INFO (r_symndx, R_MIPS_NONE);
13296
13297 /* Delete the LUI instruction: 4 bytes at irel->r_offset. */
13298 delcnt = 4;
13299 deloff = 0;
13300 }
13301
13302 /* Compact branch relaxation -- due to the multitude of macros
13303 employed by the compiler/assembler, compact branches are not
13304 always generated. Obviously, this can/will be fixed elsewhere,
13305 but there is no drawback in double checking it here. */
13306 else if (r_type == R_MICROMIPS_PC16_S1
13307 && irel->r_offset + 5 < sec->size
13308 && ((fndopc = find_match (opcode, bz_rs_insns_32)) >= 0
13309 || (fndopc = find_match (opcode, bz_rt_insns_32)) >= 0)
833794fc
MR
13310 && ((!insn32
13311 && (delcnt = MATCH (bfd_get_16 (abfd, ptr + 4),
13312 nop_insn_16) ? 2 : 0))
13313 || (irel->r_offset + 7 < sec->size
13314 && (delcnt = MATCH (bfd_get_micromips_32 (abfd,
13315 ptr + 4),
13316 nop_insn_32) ? 4 : 0))))
df58fc94
RS
13317 {
13318 unsigned long reg;
13319
13320 reg = OP32_SREG (opcode) ? OP32_SREG (opcode) : OP32_TREG (opcode);
13321
13322 /* Replace BEQZ/BNEZ with the compact version. */
13323 opcode = (bzc_insns_32[fndopc].match
13324 | BZC32_REG_FIELD (reg)
13325 | (opcode & 0xffff)); /* Addend value. */
13326
d21911ea 13327 bfd_put_micromips_32 (abfd, opcode, ptr);
df58fc94 13328
833794fc
MR
13329 /* Delete the delay slot NOP: two or four bytes from
13330 irel->offset + 4; delcnt has already been set above. */
df58fc94
RS
13331 deloff = 4;
13332 }
13333
13334 /* R_MICROMIPS_PC16_S1 relaxation to R_MICROMIPS_PC10_S1. We need
13335 to check the distance from the next instruction, so subtract 2. */
833794fc
MR
13336 else if (!insn32
13337 && r_type == R_MICROMIPS_PC16_S1
df58fc94
RS
13338 && IS_BITSIZE (pcrval - 2, 11)
13339 && find_match (opcode, b_insns_32) >= 0)
13340 {
13341 /* Fix the relocation's type. */
13342 irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC10_S1);
13343
a8685210 13344 /* Replace the 32-bit opcode with a 16-bit opcode. */
df58fc94
RS
13345 bfd_put_16 (abfd,
13346 (b_insn_16.match
13347 | (opcode & 0x3ff)), /* Addend value. */
2309ddf2 13348 ptr);
df58fc94
RS
13349
13350 /* Delete 2 bytes from irel->r_offset + 2. */
13351 delcnt = 2;
13352 deloff = 2;
13353 }
13354
13355 /* R_MICROMIPS_PC16_S1 relaxation to R_MICROMIPS_PC7_S1. We need
13356 to check the distance from the next instruction, so subtract 2. */
833794fc
MR
13357 else if (!insn32
13358 && r_type == R_MICROMIPS_PC16_S1
df58fc94
RS
13359 && IS_BITSIZE (pcrval - 2, 8)
13360 && (((fndopc = find_match (opcode, bz_rs_insns_32)) >= 0
13361 && OP16_VALID_REG (OP32_SREG (opcode)))
13362 || ((fndopc = find_match (opcode, bz_rt_insns_32)) >= 0
13363 && OP16_VALID_REG (OP32_TREG (opcode)))))
13364 {
13365 unsigned long reg;
13366
13367 reg = OP32_SREG (opcode) ? OP32_SREG (opcode) : OP32_TREG (opcode);
13368
13369 /* Fix the relocation's type. */
13370 irel->r_info = ELF32_R_INFO (r_symndx, R_MICROMIPS_PC7_S1);
13371
a8685210 13372 /* Replace the 32-bit opcode with a 16-bit opcode. */
df58fc94
RS
13373 bfd_put_16 (abfd,
13374 (bz_insns_16[fndopc].match
13375 | BZ16_REG_FIELD (reg)
13376 | (opcode & 0x7f)), /* Addend value. */
2309ddf2 13377 ptr);
df58fc94
RS
13378
13379 /* Delete 2 bytes from irel->r_offset + 2. */
13380 delcnt = 2;
13381 deloff = 2;
13382 }
13383
13384 /* R_MICROMIPS_26_S1 -- JAL to JALS relaxation for microMIPS targets. */
833794fc
MR
13385 else if (!insn32
13386 && r_type == R_MICROMIPS_26_S1
df58fc94
RS
13387 && target_is_micromips_code_p
13388 && irel->r_offset + 7 < sec->size
13389 && MATCH (opcode, jal_insn_32_bd32))
13390 {
13391 unsigned long n32opc;
13392 bfd_boolean relaxed = FALSE;
13393
d21911ea 13394 n32opc = bfd_get_micromips_32 (abfd, ptr + 4);
df58fc94
RS
13395
13396 if (MATCH (n32opc, nop_insn_32))
13397 {
13398 /* Replace delay slot 32-bit NOP with a 16-bit NOP. */
2309ddf2 13399 bfd_put_16 (abfd, nop_insn_16.match, ptr + 4);
df58fc94
RS
13400
13401 relaxed = TRUE;
13402 }
13403 else if (find_match (n32opc, move_insns_32) >= 0)
13404 {
13405 /* Replace delay slot 32-bit MOVE with 16-bit MOVE. */
13406 bfd_put_16 (abfd,
13407 (move_insn_16.match
13408 | MOVE16_RD_FIELD (MOVE32_RD (n32opc))
13409 | MOVE16_RS_FIELD (MOVE32_RS (n32opc))),
2309ddf2 13410 ptr + 4);
df58fc94
RS
13411
13412 relaxed = TRUE;
13413 }
13414 /* Other 32-bit instructions relaxable to 16-bit
13415 instructions will be handled here later. */
13416
13417 if (relaxed)
13418 {
13419 /* JAL with 32-bit delay slot that is changed to a JALS
13420 with 16-bit delay slot. */
d21911ea 13421 bfd_put_micromips_32 (abfd, jal_insn_32_bd16.match, ptr);
df58fc94
RS
13422
13423 /* Delete 2 bytes from irel->r_offset + 6. */
13424 delcnt = 2;
13425 deloff = 6;
13426 }
13427 }
13428
13429 if (delcnt != 0)
13430 {
13431 /* Note that we've changed the relocs, section contents, etc. */
13432 elf_section_data (sec)->relocs = internal_relocs;
13433 elf_section_data (sec)->this_hdr.contents = contents;
13434 symtab_hdr->contents = (unsigned char *) isymbuf;
13435
13436 /* Delete bytes depending on the delcnt and deloff. */
13437 if (!mips_elf_relax_delete_bytes (abfd, sec,
13438 irel->r_offset + deloff, delcnt))
13439 goto error_return;
13440
13441 /* That will change things, so we should relax again.
13442 Note that this is not required, and it may be slow. */
13443 *again = TRUE;
13444 }
13445 }
13446
13447 if (isymbuf != NULL
13448 && symtab_hdr->contents != (unsigned char *) isymbuf)
13449 {
13450 if (! link_info->keep_memory)
13451 free (isymbuf);
13452 else
13453 {
13454 /* Cache the symbols for elf_link_input_bfd. */
13455 symtab_hdr->contents = (unsigned char *) isymbuf;
13456 }
13457 }
13458
13459 if (contents != NULL
13460 && elf_section_data (sec)->this_hdr.contents != contents)
13461 {
13462 if (! link_info->keep_memory)
13463 free (contents);
13464 else
13465 {
13466 /* Cache the section contents for elf_link_input_bfd. */
13467 elf_section_data (sec)->this_hdr.contents = contents;
13468 }
13469 }
13470
13471 if (internal_relocs != NULL
13472 && elf_section_data (sec)->relocs != internal_relocs)
13473 free (internal_relocs);
13474
13475 return TRUE;
13476
13477 error_return:
13478 if (isymbuf != NULL
13479 && symtab_hdr->contents != (unsigned char *) isymbuf)
13480 free (isymbuf);
13481 if (contents != NULL
13482 && elf_section_data (sec)->this_hdr.contents != contents)
13483 free (contents);
13484 if (internal_relocs != NULL
13485 && elf_section_data (sec)->relocs != internal_relocs)
13486 free (internal_relocs);
13487
13488 return FALSE;
13489}
13490\f
b49e97c9
TS
13491/* Create a MIPS ELF linker hash table. */
13492
13493struct bfd_link_hash_table *
9719ad41 13494_bfd_mips_elf_link_hash_table_create (bfd *abfd)
b49e97c9
TS
13495{
13496 struct mips_elf_link_hash_table *ret;
13497 bfd_size_type amt = sizeof (struct mips_elf_link_hash_table);
13498
7bf52ea2 13499 ret = bfd_zmalloc (amt);
9719ad41 13500 if (ret == NULL)
b49e97c9
TS
13501 return NULL;
13502
66eb6687
AM
13503 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
13504 mips_elf_link_hash_newfunc,
4dfe6ac6
NC
13505 sizeof (struct mips_elf_link_hash_entry),
13506 MIPS_ELF_DATA))
b49e97c9 13507 {
e2d34d7d 13508 free (ret);
b49e97c9
TS
13509 return NULL;
13510 }
1bbce132
MR
13511 ret->root.init_plt_refcount.plist = NULL;
13512 ret->root.init_plt_offset.plist = NULL;
b49e97c9 13513
b49e97c9
TS
13514 return &ret->root.root;
13515}
0a44bf69
RS
13516
13517/* Likewise, but indicate that the target is VxWorks. */
13518
13519struct bfd_link_hash_table *
13520_bfd_mips_vxworks_link_hash_table_create (bfd *abfd)
13521{
13522 struct bfd_link_hash_table *ret;
13523
13524 ret = _bfd_mips_elf_link_hash_table_create (abfd);
13525 if (ret)
13526 {
13527 struct mips_elf_link_hash_table *htab;
13528
13529 htab = (struct mips_elf_link_hash_table *) ret;
861fb55a
DJ
13530 htab->use_plts_and_copy_relocs = TRUE;
13531 htab->is_vxworks = TRUE;
0a44bf69
RS
13532 }
13533 return ret;
13534}
861fb55a
DJ
13535
13536/* A function that the linker calls if we are allowed to use PLTs
13537 and copy relocs. */
13538
13539void
13540_bfd_mips_elf_use_plts_and_copy_relocs (struct bfd_link_info *info)
13541{
13542 mips_elf_hash_table (info)->use_plts_and_copy_relocs = TRUE;
13543}
833794fc
MR
13544
13545/* A function that the linker calls to select between all or only
13546 32-bit microMIPS instructions. */
13547
13548void
13549_bfd_mips_elf_insn32 (struct bfd_link_info *info, bfd_boolean on)
13550{
13551 mips_elf_hash_table (info)->insn32 = on;
13552}
b49e97c9
TS
13553\f
13554/* We need to use a special link routine to handle the .reginfo and
13555 the .mdebug sections. We need to merge all instances of these
13556 sections together, not write them all out sequentially. */
13557
b34976b6 13558bfd_boolean
9719ad41 13559_bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
b49e97c9 13560{
b49e97c9
TS
13561 asection *o;
13562 struct bfd_link_order *p;
13563 asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
13564 asection *rtproc_sec;
13565 Elf32_RegInfo reginfo;
13566 struct ecoff_debug_info debug;
861fb55a 13567 struct mips_htab_traverse_info hti;
7a2a6943
NC
13568 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
13569 const struct ecoff_debug_swap *swap = bed->elf_backend_ecoff_debug_swap;
b49e97c9 13570 HDRR *symhdr = &debug.symbolic_header;
9719ad41 13571 void *mdebug_handle = NULL;
b49e97c9
TS
13572 asection *s;
13573 EXTR esym;
13574 unsigned int i;
13575 bfd_size_type amt;
0a44bf69 13576 struct mips_elf_link_hash_table *htab;
b49e97c9
TS
13577
13578 static const char * const secname[] =
13579 {
13580 ".text", ".init", ".fini", ".data",
13581 ".rodata", ".sdata", ".sbss", ".bss"
13582 };
13583 static const int sc[] =
13584 {
13585 scText, scInit, scFini, scData,
13586 scRData, scSData, scSBss, scBss
13587 };
13588
d4596a51
RS
13589 /* Sort the dynamic symbols so that those with GOT entries come after
13590 those without. */
0a44bf69 13591 htab = mips_elf_hash_table (info);
4dfe6ac6
NC
13592 BFD_ASSERT (htab != NULL);
13593
d4596a51
RS
13594 if (!mips_elf_sort_hash_table (abfd, info))
13595 return FALSE;
b49e97c9 13596
861fb55a
DJ
13597 /* Create any scheduled LA25 stubs. */
13598 hti.info = info;
13599 hti.output_bfd = abfd;
13600 hti.error = FALSE;
13601 htab_traverse (htab->la25_stubs, mips_elf_create_la25_stub, &hti);
13602 if (hti.error)
13603 return FALSE;
13604
b49e97c9
TS
13605 /* Get a value for the GP register. */
13606 if (elf_gp (abfd) == 0)
13607 {
13608 struct bfd_link_hash_entry *h;
13609
b34976b6 13610 h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
9719ad41 13611 if (h != NULL && h->type == bfd_link_hash_defined)
b49e97c9
TS
13612 elf_gp (abfd) = (h->u.def.value
13613 + h->u.def.section->output_section->vma
13614 + h->u.def.section->output_offset);
0a44bf69
RS
13615 else if (htab->is_vxworks
13616 && (h = bfd_link_hash_lookup (info->hash,
13617 "_GLOBAL_OFFSET_TABLE_",
13618 FALSE, FALSE, TRUE))
13619 && h->type == bfd_link_hash_defined)
13620 elf_gp (abfd) = (h->u.def.section->output_section->vma
13621 + h->u.def.section->output_offset
13622 + h->u.def.value);
1049f94e 13623 else if (info->relocatable)
b49e97c9
TS
13624 {
13625 bfd_vma lo = MINUS_ONE;
13626
13627 /* Find the GP-relative section with the lowest offset. */
9719ad41 13628 for (o = abfd->sections; o != NULL; o = o->next)
b49e97c9
TS
13629 if (o->vma < lo
13630 && (elf_section_data (o)->this_hdr.sh_flags & SHF_MIPS_GPREL))
13631 lo = o->vma;
13632
13633 /* And calculate GP relative to that. */
0a44bf69 13634 elf_gp (abfd) = lo + ELF_MIPS_GP_OFFSET (info);
b49e97c9
TS
13635 }
13636 else
13637 {
13638 /* If the relocate_section function needs to do a reloc
13639 involving the GP value, it should make a reloc_dangerous
13640 callback to warn that GP is not defined. */
13641 }
13642 }
13643
13644 /* Go through the sections and collect the .reginfo and .mdebug
13645 information. */
13646 reginfo_sec = NULL;
13647 mdebug_sec = NULL;
13648 gptab_data_sec = NULL;
13649 gptab_bss_sec = NULL;
9719ad41 13650 for (o = abfd->sections; o != NULL; o = o->next)
b49e97c9
TS
13651 {
13652 if (strcmp (o->name, ".reginfo") == 0)
13653 {
13654 memset (&reginfo, 0, sizeof reginfo);
13655
13656 /* We have found the .reginfo section in the output file.
13657 Look through all the link_orders comprising it and merge
13658 the information together. */
8423293d 13659 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
13660 {
13661 asection *input_section;
13662 bfd *input_bfd;
13663 Elf32_External_RegInfo ext;
13664 Elf32_RegInfo sub;
13665
13666 if (p->type != bfd_indirect_link_order)
13667 {
13668 if (p->type == bfd_data_link_order)
13669 continue;
13670 abort ();
13671 }
13672
13673 input_section = p->u.indirect.section;
13674 input_bfd = input_section->owner;
13675
b49e97c9 13676 if (! bfd_get_section_contents (input_bfd, input_section,
9719ad41 13677 &ext, 0, sizeof ext))
b34976b6 13678 return FALSE;
b49e97c9
TS
13679
13680 bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub);
13681
13682 reginfo.ri_gprmask |= sub.ri_gprmask;
13683 reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
13684 reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
13685 reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
13686 reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
13687
13688 /* ri_gp_value is set by the function
13689 mips_elf32_section_processing when the section is
13690 finally written out. */
13691
13692 /* Hack: reset the SEC_HAS_CONTENTS flag so that
13693 elf_link_input_bfd ignores this section. */
13694 input_section->flags &= ~SEC_HAS_CONTENTS;
13695 }
13696
13697 /* Size has been set in _bfd_mips_elf_always_size_sections. */
eea6121a 13698 BFD_ASSERT(o->size == sizeof (Elf32_External_RegInfo));
b49e97c9
TS
13699
13700 /* Skip this section later on (I don't think this currently
13701 matters, but someday it might). */
8423293d 13702 o->map_head.link_order = NULL;
b49e97c9
TS
13703
13704 reginfo_sec = o;
13705 }
13706
13707 if (strcmp (o->name, ".mdebug") == 0)
13708 {
13709 struct extsym_info einfo;
13710 bfd_vma last;
13711
13712 /* We have found the .mdebug section in the output file.
13713 Look through all the link_orders comprising it and merge
13714 the information together. */
13715 symhdr->magic = swap->sym_magic;
13716 /* FIXME: What should the version stamp be? */
13717 symhdr->vstamp = 0;
13718 symhdr->ilineMax = 0;
13719 symhdr->cbLine = 0;
13720 symhdr->idnMax = 0;
13721 symhdr->ipdMax = 0;
13722 symhdr->isymMax = 0;
13723 symhdr->ioptMax = 0;
13724 symhdr->iauxMax = 0;
13725 symhdr->issMax = 0;
13726 symhdr->issExtMax = 0;
13727 symhdr->ifdMax = 0;
13728 symhdr->crfd = 0;
13729 symhdr->iextMax = 0;
13730
13731 /* We accumulate the debugging information itself in the
13732 debug_info structure. */
13733 debug.line = NULL;
13734 debug.external_dnr = NULL;
13735 debug.external_pdr = NULL;
13736 debug.external_sym = NULL;
13737 debug.external_opt = NULL;
13738 debug.external_aux = NULL;
13739 debug.ss = NULL;
13740 debug.ssext = debug.ssext_end = NULL;
13741 debug.external_fdr = NULL;
13742 debug.external_rfd = NULL;
13743 debug.external_ext = debug.external_ext_end = NULL;
13744
13745 mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
9719ad41 13746 if (mdebug_handle == NULL)
b34976b6 13747 return FALSE;
b49e97c9
TS
13748
13749 esym.jmptbl = 0;
13750 esym.cobol_main = 0;
13751 esym.weakext = 0;
13752 esym.reserved = 0;
13753 esym.ifd = ifdNil;
13754 esym.asym.iss = issNil;
13755 esym.asym.st = stLocal;
13756 esym.asym.reserved = 0;
13757 esym.asym.index = indexNil;
13758 last = 0;
13759 for (i = 0; i < sizeof (secname) / sizeof (secname[0]); i++)
13760 {
13761 esym.asym.sc = sc[i];
13762 s = bfd_get_section_by_name (abfd, secname[i]);
13763 if (s != NULL)
13764 {
13765 esym.asym.value = s->vma;
eea6121a 13766 last = s->vma + s->size;
b49e97c9
TS
13767 }
13768 else
13769 esym.asym.value = last;
13770 if (!bfd_ecoff_debug_one_external (abfd, &debug, swap,
13771 secname[i], &esym))
b34976b6 13772 return FALSE;
b49e97c9
TS
13773 }
13774
8423293d 13775 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
13776 {
13777 asection *input_section;
13778 bfd *input_bfd;
13779 const struct ecoff_debug_swap *input_swap;
13780 struct ecoff_debug_info input_debug;
13781 char *eraw_src;
13782 char *eraw_end;
13783
13784 if (p->type != bfd_indirect_link_order)
13785 {
13786 if (p->type == bfd_data_link_order)
13787 continue;
13788 abort ();
13789 }
13790
13791 input_section = p->u.indirect.section;
13792 input_bfd = input_section->owner;
13793
d5eaccd7 13794 if (!is_mips_elf (input_bfd))
b49e97c9
TS
13795 {
13796 /* I don't know what a non MIPS ELF bfd would be
13797 doing with a .mdebug section, but I don't really
13798 want to deal with it. */
13799 continue;
13800 }
13801
13802 input_swap = (get_elf_backend_data (input_bfd)
13803 ->elf_backend_ecoff_debug_swap);
13804
eea6121a 13805 BFD_ASSERT (p->size == input_section->size);
b49e97c9
TS
13806
13807 /* The ECOFF linking code expects that we have already
13808 read in the debugging information and set up an
13809 ecoff_debug_info structure, so we do that now. */
13810 if (! _bfd_mips_elf_read_ecoff_info (input_bfd, input_section,
13811 &input_debug))
b34976b6 13812 return FALSE;
b49e97c9
TS
13813
13814 if (! (bfd_ecoff_debug_accumulate
13815 (mdebug_handle, abfd, &debug, swap, input_bfd,
13816 &input_debug, input_swap, info)))
b34976b6 13817 return FALSE;
b49e97c9
TS
13818
13819 /* Loop through the external symbols. For each one with
13820 interesting information, try to find the symbol in
13821 the linker global hash table and save the information
13822 for the output external symbols. */
13823 eraw_src = input_debug.external_ext;
13824 eraw_end = (eraw_src
13825 + (input_debug.symbolic_header.iextMax
13826 * input_swap->external_ext_size));
13827 for (;
13828 eraw_src < eraw_end;
13829 eraw_src += input_swap->external_ext_size)
13830 {
13831 EXTR ext;
13832 const char *name;
13833 struct mips_elf_link_hash_entry *h;
13834
9719ad41 13835 (*input_swap->swap_ext_in) (input_bfd, eraw_src, &ext);
b49e97c9
TS
13836 if (ext.asym.sc == scNil
13837 || ext.asym.sc == scUndefined
13838 || ext.asym.sc == scSUndefined)
13839 continue;
13840
13841 name = input_debug.ssext + ext.asym.iss;
13842 h = mips_elf_link_hash_lookup (mips_elf_hash_table (info),
b34976b6 13843 name, FALSE, FALSE, TRUE);
b49e97c9
TS
13844 if (h == NULL || h->esym.ifd != -2)
13845 continue;
13846
13847 if (ext.ifd != -1)
13848 {
13849 BFD_ASSERT (ext.ifd
13850 < input_debug.symbolic_header.ifdMax);
13851 ext.ifd = input_debug.ifdmap[ext.ifd];
13852 }
13853
13854 h->esym = ext;
13855 }
13856
13857 /* Free up the information we just read. */
13858 free (input_debug.line);
13859 free (input_debug.external_dnr);
13860 free (input_debug.external_pdr);
13861 free (input_debug.external_sym);
13862 free (input_debug.external_opt);
13863 free (input_debug.external_aux);
13864 free (input_debug.ss);
13865 free (input_debug.ssext);
13866 free (input_debug.external_fdr);
13867 free (input_debug.external_rfd);
13868 free (input_debug.external_ext);
13869
13870 /* Hack: reset the SEC_HAS_CONTENTS flag so that
13871 elf_link_input_bfd ignores this section. */
13872 input_section->flags &= ~SEC_HAS_CONTENTS;
13873 }
13874
13875 if (SGI_COMPAT (abfd) && info->shared)
13876 {
13877 /* Create .rtproc section. */
87e0a731 13878 rtproc_sec = bfd_get_linker_section (abfd, ".rtproc");
b49e97c9
TS
13879 if (rtproc_sec == NULL)
13880 {
13881 flagword flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
13882 | SEC_LINKER_CREATED | SEC_READONLY);
13883
87e0a731
AM
13884 rtproc_sec = bfd_make_section_anyway_with_flags (abfd,
13885 ".rtproc",
13886 flags);
b49e97c9 13887 if (rtproc_sec == NULL
b49e97c9 13888 || ! bfd_set_section_alignment (abfd, rtproc_sec, 4))
b34976b6 13889 return FALSE;
b49e97c9
TS
13890 }
13891
13892 if (! mips_elf_create_procedure_table (mdebug_handle, abfd,
13893 info, rtproc_sec,
13894 &debug))
b34976b6 13895 return FALSE;
b49e97c9
TS
13896 }
13897
13898 /* Build the external symbol information. */
13899 einfo.abfd = abfd;
13900 einfo.info = info;
13901 einfo.debug = &debug;
13902 einfo.swap = swap;
b34976b6 13903 einfo.failed = FALSE;
b49e97c9 13904 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
9719ad41 13905 mips_elf_output_extsym, &einfo);
b49e97c9 13906 if (einfo.failed)
b34976b6 13907 return FALSE;
b49e97c9
TS
13908
13909 /* Set the size of the .mdebug section. */
eea6121a 13910 o->size = bfd_ecoff_debug_size (abfd, &debug, swap);
b49e97c9
TS
13911
13912 /* Skip this section later on (I don't think this currently
13913 matters, but someday it might). */
8423293d 13914 o->map_head.link_order = NULL;
b49e97c9
TS
13915
13916 mdebug_sec = o;
13917 }
13918
0112cd26 13919 if (CONST_STRNEQ (o->name, ".gptab."))
b49e97c9
TS
13920 {
13921 const char *subname;
13922 unsigned int c;
13923 Elf32_gptab *tab;
13924 Elf32_External_gptab *ext_tab;
13925 unsigned int j;
13926
13927 /* The .gptab.sdata and .gptab.sbss sections hold
13928 information describing how the small data area would
13929 change depending upon the -G switch. These sections
13930 not used in executables files. */
1049f94e 13931 if (! info->relocatable)
b49e97c9 13932 {
8423293d 13933 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
13934 {
13935 asection *input_section;
13936
13937 if (p->type != bfd_indirect_link_order)
13938 {
13939 if (p->type == bfd_data_link_order)
13940 continue;
13941 abort ();
13942 }
13943
13944 input_section = p->u.indirect.section;
13945
13946 /* Hack: reset the SEC_HAS_CONTENTS flag so that
13947 elf_link_input_bfd ignores this section. */
13948 input_section->flags &= ~SEC_HAS_CONTENTS;
13949 }
13950
13951 /* Skip this section later on (I don't think this
13952 currently matters, but someday it might). */
8423293d 13953 o->map_head.link_order = NULL;
b49e97c9
TS
13954
13955 /* Really remove the section. */
5daa8fe7 13956 bfd_section_list_remove (abfd, o);
b49e97c9
TS
13957 --abfd->section_count;
13958
13959 continue;
13960 }
13961
13962 /* There is one gptab for initialized data, and one for
13963 uninitialized data. */
13964 if (strcmp (o->name, ".gptab.sdata") == 0)
13965 gptab_data_sec = o;
13966 else if (strcmp (o->name, ".gptab.sbss") == 0)
13967 gptab_bss_sec = o;
13968 else
13969 {
13970 (*_bfd_error_handler)
13971 (_("%s: illegal section name `%s'"),
13972 bfd_get_filename (abfd), o->name);
13973 bfd_set_error (bfd_error_nonrepresentable_section);
b34976b6 13974 return FALSE;
b49e97c9
TS
13975 }
13976
13977 /* The linker script always combines .gptab.data and
13978 .gptab.sdata into .gptab.sdata, and likewise for
13979 .gptab.bss and .gptab.sbss. It is possible that there is
13980 no .sdata or .sbss section in the output file, in which
13981 case we must change the name of the output section. */
13982 subname = o->name + sizeof ".gptab" - 1;
13983 if (bfd_get_section_by_name (abfd, subname) == NULL)
13984 {
13985 if (o == gptab_data_sec)
13986 o->name = ".gptab.data";
13987 else
13988 o->name = ".gptab.bss";
13989 subname = o->name + sizeof ".gptab" - 1;
13990 BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
13991 }
13992
13993 /* Set up the first entry. */
13994 c = 1;
13995 amt = c * sizeof (Elf32_gptab);
9719ad41 13996 tab = bfd_malloc (amt);
b49e97c9 13997 if (tab == NULL)
b34976b6 13998 return FALSE;
b49e97c9
TS
13999 tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
14000 tab[0].gt_header.gt_unused = 0;
14001
14002 /* Combine the input sections. */
8423293d 14003 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
14004 {
14005 asection *input_section;
14006 bfd *input_bfd;
14007 bfd_size_type size;
14008 unsigned long last;
14009 bfd_size_type gpentry;
14010
14011 if (p->type != bfd_indirect_link_order)
14012 {
14013 if (p->type == bfd_data_link_order)
14014 continue;
14015 abort ();
14016 }
14017
14018 input_section = p->u.indirect.section;
14019 input_bfd = input_section->owner;
14020
14021 /* Combine the gptab entries for this input section one
14022 by one. We know that the input gptab entries are
14023 sorted by ascending -G value. */
eea6121a 14024 size = input_section->size;
b49e97c9
TS
14025 last = 0;
14026 for (gpentry = sizeof (Elf32_External_gptab);
14027 gpentry < size;
14028 gpentry += sizeof (Elf32_External_gptab))
14029 {
14030 Elf32_External_gptab ext_gptab;
14031 Elf32_gptab int_gptab;
14032 unsigned long val;
14033 unsigned long add;
b34976b6 14034 bfd_boolean exact;
b49e97c9
TS
14035 unsigned int look;
14036
14037 if (! (bfd_get_section_contents
9719ad41
RS
14038 (input_bfd, input_section, &ext_gptab, gpentry,
14039 sizeof (Elf32_External_gptab))))
b49e97c9
TS
14040 {
14041 free (tab);
b34976b6 14042 return FALSE;
b49e97c9
TS
14043 }
14044
14045 bfd_mips_elf32_swap_gptab_in (input_bfd, &ext_gptab,
14046 &int_gptab);
14047 val = int_gptab.gt_entry.gt_g_value;
14048 add = int_gptab.gt_entry.gt_bytes - last;
14049
b34976b6 14050 exact = FALSE;
b49e97c9
TS
14051 for (look = 1; look < c; look++)
14052 {
14053 if (tab[look].gt_entry.gt_g_value >= val)
14054 tab[look].gt_entry.gt_bytes += add;
14055
14056 if (tab[look].gt_entry.gt_g_value == val)
b34976b6 14057 exact = TRUE;
b49e97c9
TS
14058 }
14059
14060 if (! exact)
14061 {
14062 Elf32_gptab *new_tab;
14063 unsigned int max;
14064
14065 /* We need a new table entry. */
14066 amt = (bfd_size_type) (c + 1) * sizeof (Elf32_gptab);
9719ad41 14067 new_tab = bfd_realloc (tab, amt);
b49e97c9
TS
14068 if (new_tab == NULL)
14069 {
14070 free (tab);
b34976b6 14071 return FALSE;
b49e97c9
TS
14072 }
14073 tab = new_tab;
14074 tab[c].gt_entry.gt_g_value = val;
14075 tab[c].gt_entry.gt_bytes = add;
14076
14077 /* Merge in the size for the next smallest -G
14078 value, since that will be implied by this new
14079 value. */
14080 max = 0;
14081 for (look = 1; look < c; look++)
14082 {
14083 if (tab[look].gt_entry.gt_g_value < val
14084 && (max == 0
14085 || (tab[look].gt_entry.gt_g_value
14086 > tab[max].gt_entry.gt_g_value)))
14087 max = look;
14088 }
14089 if (max != 0)
14090 tab[c].gt_entry.gt_bytes +=
14091 tab[max].gt_entry.gt_bytes;
14092
14093 ++c;
14094 }
14095
14096 last = int_gptab.gt_entry.gt_bytes;
14097 }
14098
14099 /* Hack: reset the SEC_HAS_CONTENTS flag so that
14100 elf_link_input_bfd ignores this section. */
14101 input_section->flags &= ~SEC_HAS_CONTENTS;
14102 }
14103
14104 /* The table must be sorted by -G value. */
14105 if (c > 2)
14106 qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
14107
14108 /* Swap out the table. */
14109 amt = (bfd_size_type) c * sizeof (Elf32_External_gptab);
9719ad41 14110 ext_tab = bfd_alloc (abfd, amt);
b49e97c9
TS
14111 if (ext_tab == NULL)
14112 {
14113 free (tab);
b34976b6 14114 return FALSE;
b49e97c9
TS
14115 }
14116
14117 for (j = 0; j < c; j++)
14118 bfd_mips_elf32_swap_gptab_out (abfd, tab + j, ext_tab + j);
14119 free (tab);
14120
eea6121a 14121 o->size = c * sizeof (Elf32_External_gptab);
b49e97c9
TS
14122 o->contents = (bfd_byte *) ext_tab;
14123
14124 /* Skip this section later on (I don't think this currently
14125 matters, but someday it might). */
8423293d 14126 o->map_head.link_order = NULL;
b49e97c9
TS
14127 }
14128 }
14129
14130 /* Invoke the regular ELF backend linker to do all the work. */
c152c796 14131 if (!bfd_elf_final_link (abfd, info))
b34976b6 14132 return FALSE;
b49e97c9
TS
14133
14134 /* Now write out the computed sections. */
14135
9719ad41 14136 if (reginfo_sec != NULL)
b49e97c9
TS
14137 {
14138 Elf32_External_RegInfo ext;
14139
14140 bfd_mips_elf32_swap_reginfo_out (abfd, &reginfo, &ext);
9719ad41 14141 if (! bfd_set_section_contents (abfd, reginfo_sec, &ext, 0, sizeof ext))
b34976b6 14142 return FALSE;
b49e97c9
TS
14143 }
14144
9719ad41 14145 if (mdebug_sec != NULL)
b49e97c9
TS
14146 {
14147 BFD_ASSERT (abfd->output_has_begun);
14148 if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
14149 swap, info,
14150 mdebug_sec->filepos))
b34976b6 14151 return FALSE;
b49e97c9
TS
14152
14153 bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
14154 }
14155
9719ad41 14156 if (gptab_data_sec != NULL)
b49e97c9
TS
14157 {
14158 if (! bfd_set_section_contents (abfd, gptab_data_sec,
14159 gptab_data_sec->contents,
eea6121a 14160 0, gptab_data_sec->size))
b34976b6 14161 return FALSE;
b49e97c9
TS
14162 }
14163
9719ad41 14164 if (gptab_bss_sec != NULL)
b49e97c9
TS
14165 {
14166 if (! bfd_set_section_contents (abfd, gptab_bss_sec,
14167 gptab_bss_sec->contents,
eea6121a 14168 0, gptab_bss_sec->size))
b34976b6 14169 return FALSE;
b49e97c9
TS
14170 }
14171
14172 if (SGI_COMPAT (abfd))
14173 {
14174 rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
14175 if (rtproc_sec != NULL)
14176 {
14177 if (! bfd_set_section_contents (abfd, rtproc_sec,
14178 rtproc_sec->contents,
eea6121a 14179 0, rtproc_sec->size))
b34976b6 14180 return FALSE;
b49e97c9
TS
14181 }
14182 }
14183
b34976b6 14184 return TRUE;
b49e97c9
TS
14185}
14186\f
64543e1a
RS
14187/* Structure for saying that BFD machine EXTENSION extends BASE. */
14188
a253d456
NC
14189struct mips_mach_extension
14190{
64543e1a
RS
14191 unsigned long extension, base;
14192};
14193
14194
14195/* An array describing how BFD machines relate to one another. The entries
14196 are ordered topologically with MIPS I extensions listed last. */
14197
a253d456
NC
14198static const struct mips_mach_extension mips_mach_extensions[] =
14199{
6f179bd0 14200 /* MIPS64r2 extensions. */
432233b3 14201 { bfd_mach_mips_octeon2, bfd_mach_mips_octeonp },
dd6a37e7 14202 { bfd_mach_mips_octeonp, bfd_mach_mips_octeon },
6f179bd0
AN
14203 { bfd_mach_mips_octeon, bfd_mach_mipsisa64r2 },
14204
64543e1a 14205 /* MIPS64 extensions. */
5f74bc13 14206 { bfd_mach_mipsisa64r2, bfd_mach_mipsisa64 },
64543e1a 14207 { bfd_mach_mips_sb1, bfd_mach_mipsisa64 },
52b6b6b9 14208 { bfd_mach_mips_xlr, bfd_mach_mipsisa64 },
fd503541 14209 { bfd_mach_mips_loongson_3a, bfd_mach_mipsisa64 },
64543e1a
RS
14210
14211 /* MIPS V extensions. */
14212 { bfd_mach_mipsisa64, bfd_mach_mips5 },
14213
14214 /* R10000 extensions. */
14215 { bfd_mach_mips12000, bfd_mach_mips10000 },
3aa3176b
TS
14216 { bfd_mach_mips14000, bfd_mach_mips10000 },
14217 { bfd_mach_mips16000, bfd_mach_mips10000 },
64543e1a
RS
14218
14219 /* R5000 extensions. Note: the vr5500 ISA is an extension of the core
14220 vr5400 ISA, but doesn't include the multimedia stuff. It seems
14221 better to allow vr5400 and vr5500 code to be merged anyway, since
14222 many libraries will just use the core ISA. Perhaps we could add
14223 some sort of ASE flag if this ever proves a problem. */
14224 { bfd_mach_mips5500, bfd_mach_mips5400 },
14225 { bfd_mach_mips5400, bfd_mach_mips5000 },
14226
14227 /* MIPS IV extensions. */
14228 { bfd_mach_mips5, bfd_mach_mips8000 },
14229 { bfd_mach_mips10000, bfd_mach_mips8000 },
14230 { bfd_mach_mips5000, bfd_mach_mips8000 },
5a7ea749 14231 { bfd_mach_mips7000, bfd_mach_mips8000 },
0d2e43ed 14232 { bfd_mach_mips9000, bfd_mach_mips8000 },
64543e1a
RS
14233
14234 /* VR4100 extensions. */
14235 { bfd_mach_mips4120, bfd_mach_mips4100 },
14236 { bfd_mach_mips4111, bfd_mach_mips4100 },
14237
14238 /* MIPS III extensions. */
350cc38d
MS
14239 { bfd_mach_mips_loongson_2e, bfd_mach_mips4000 },
14240 { bfd_mach_mips_loongson_2f, bfd_mach_mips4000 },
64543e1a
RS
14241 { bfd_mach_mips8000, bfd_mach_mips4000 },
14242 { bfd_mach_mips4650, bfd_mach_mips4000 },
14243 { bfd_mach_mips4600, bfd_mach_mips4000 },
14244 { bfd_mach_mips4400, bfd_mach_mips4000 },
14245 { bfd_mach_mips4300, bfd_mach_mips4000 },
14246 { bfd_mach_mips4100, bfd_mach_mips4000 },
14247 { bfd_mach_mips4010, bfd_mach_mips4000 },
e407c74b 14248 { bfd_mach_mips5900, bfd_mach_mips4000 },
64543e1a
RS
14249
14250 /* MIPS32 extensions. */
14251 { bfd_mach_mipsisa32r2, bfd_mach_mipsisa32 },
14252
14253 /* MIPS II extensions. */
14254 { bfd_mach_mips4000, bfd_mach_mips6000 },
14255 { bfd_mach_mipsisa32, bfd_mach_mips6000 },
14256
14257 /* MIPS I extensions. */
14258 { bfd_mach_mips6000, bfd_mach_mips3000 },
14259 { bfd_mach_mips3900, bfd_mach_mips3000 }
14260};
14261
14262
14263/* Return true if bfd machine EXTENSION is an extension of machine BASE. */
14264
14265static bfd_boolean
9719ad41 14266mips_mach_extends_p (unsigned long base, unsigned long extension)
64543e1a
RS
14267{
14268 size_t i;
14269
c5211a54
RS
14270 if (extension == base)
14271 return TRUE;
14272
14273 if (base == bfd_mach_mipsisa32
14274 && mips_mach_extends_p (bfd_mach_mipsisa64, extension))
14275 return TRUE;
14276
14277 if (base == bfd_mach_mipsisa32r2
14278 && mips_mach_extends_p (bfd_mach_mipsisa64r2, extension))
14279 return TRUE;
14280
14281 for (i = 0; i < ARRAY_SIZE (mips_mach_extensions); i++)
64543e1a 14282 if (extension == mips_mach_extensions[i].extension)
c5211a54
RS
14283 {
14284 extension = mips_mach_extensions[i].base;
14285 if (extension == base)
14286 return TRUE;
14287 }
64543e1a 14288
c5211a54 14289 return FALSE;
64543e1a
RS
14290}
14291
14292
14293/* Return true if the given ELF header flags describe a 32-bit binary. */
00707a0e 14294
b34976b6 14295static bfd_boolean
9719ad41 14296mips_32bit_flags_p (flagword flags)
00707a0e 14297{
64543e1a
RS
14298 return ((flags & EF_MIPS_32BITMODE) != 0
14299 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_O32
14300 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32
14301 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1
14302 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2
14303 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32
14304 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2);
00707a0e
RS
14305}
14306
64543e1a 14307
2cf19d5c
JM
14308/* Merge object attributes from IBFD into OBFD. Raise an error if
14309 there are conflicting attributes. */
14310static bfd_boolean
14311mips_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
14312{
14313 obj_attribute *in_attr;
14314 obj_attribute *out_attr;
6ae68ba3
MR
14315 bfd *abi_fp_bfd;
14316
14317 abi_fp_bfd = mips_elf_tdata (obfd)->abi_fp_bfd;
14318 in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
d929bc19 14319 if (!abi_fp_bfd && in_attr[Tag_GNU_MIPS_ABI_FP].i != Val_GNU_MIPS_ABI_FP_ANY)
6ae68ba3 14320 mips_elf_tdata (obfd)->abi_fp_bfd = ibfd;
2cf19d5c
JM
14321
14322 if (!elf_known_obj_attributes_proc (obfd)[0].i)
14323 {
14324 /* This is the first object. Copy the attributes. */
14325 _bfd_elf_copy_obj_attributes (ibfd, obfd);
14326
14327 /* Use the Tag_null value to indicate the attributes have been
14328 initialized. */
14329 elf_known_obj_attributes_proc (obfd)[0].i = 1;
14330
14331 return TRUE;
14332 }
14333
14334 /* Check for conflicting Tag_GNU_MIPS_ABI_FP attributes and merge
14335 non-conflicting ones. */
2cf19d5c
JM
14336 out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
14337 if (in_attr[Tag_GNU_MIPS_ABI_FP].i != out_attr[Tag_GNU_MIPS_ABI_FP].i)
14338 {
14339 out_attr[Tag_GNU_MIPS_ABI_FP].type = 1;
d929bc19 14340 if (out_attr[Tag_GNU_MIPS_ABI_FP].i == Val_GNU_MIPS_ABI_FP_ANY)
2cf19d5c 14341 out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
d929bc19 14342 else if (in_attr[Tag_GNU_MIPS_ABI_FP].i != Val_GNU_MIPS_ABI_FP_ANY)
2cf19d5c
JM
14343 switch (out_attr[Tag_GNU_MIPS_ABI_FP].i)
14344 {
d929bc19 14345 case Val_GNU_MIPS_ABI_FP_DOUBLE:
2cf19d5c
JM
14346 switch (in_attr[Tag_GNU_MIPS_ABI_FP].i)
14347 {
d929bc19 14348 case Val_GNU_MIPS_ABI_FP_SINGLE:
2cf19d5c 14349 _bfd_error_handler
6ae68ba3
MR
14350 (_("Warning: %B uses %s (set by %B), %B uses %s"),
14351 obfd, abi_fp_bfd, ibfd, "-mdouble-float", "-msingle-float");
51a0dd31 14352 break;
2cf19d5c 14353
d929bc19 14354 case Val_GNU_MIPS_ABI_FP_SOFT:
2cf19d5c 14355 _bfd_error_handler
6ae68ba3
MR
14356 (_("Warning: %B uses %s (set by %B), %B uses %s"),
14357 obfd, abi_fp_bfd, ibfd, "-mhard-float", "-msoft-float");
2cf19d5c
JM
14358 break;
14359
d929bc19 14360 case Val_GNU_MIPS_ABI_FP_64:
42554f6a 14361 _bfd_error_handler
6ae68ba3
MR
14362 (_("Warning: %B uses %s (set by %B), %B uses %s"),
14363 obfd, abi_fp_bfd, ibfd,
14364 "-mdouble-float", "-mips32r2 -mfp64");
42554f6a
TS
14365 break;
14366
2cf19d5c 14367 default:
6ae68ba3
MR
14368 _bfd_error_handler
14369 (_("Warning: %B uses %s (set by %B), "
14370 "%B uses unknown floating point ABI %d"),
14371 obfd, abi_fp_bfd, ibfd,
14372 "-mdouble-float", in_attr[Tag_GNU_MIPS_ABI_FP].i);
14373 break;
2cf19d5c
JM
14374 }
14375 break;
14376
d929bc19 14377 case Val_GNU_MIPS_ABI_FP_SINGLE:
2cf19d5c
JM
14378 switch (in_attr[Tag_GNU_MIPS_ABI_FP].i)
14379 {
d929bc19 14380 case Val_GNU_MIPS_ABI_FP_DOUBLE:
2cf19d5c 14381 _bfd_error_handler
6ae68ba3
MR
14382 (_("Warning: %B uses %s (set by %B), %B uses %s"),
14383 obfd, abi_fp_bfd, ibfd, "-msingle-float", "-mdouble-float");
51a0dd31 14384 break;
2cf19d5c 14385
d929bc19 14386 case Val_GNU_MIPS_ABI_FP_SOFT:
2cf19d5c 14387 _bfd_error_handler
6ae68ba3
MR
14388 (_("Warning: %B uses %s (set by %B), %B uses %s"),
14389 obfd, abi_fp_bfd, ibfd, "-mhard-float", "-msoft-float");
2cf19d5c
JM
14390 break;
14391
d929bc19 14392 case Val_GNU_MIPS_ABI_FP_64:
42554f6a 14393 _bfd_error_handler
6ae68ba3
MR
14394 (_("Warning: %B uses %s (set by %B), %B uses %s"),
14395 obfd, abi_fp_bfd, ibfd,
14396 "-msingle-float", "-mips32r2 -mfp64");
42554f6a
TS
14397 break;
14398
2cf19d5c 14399 default:
6ae68ba3
MR
14400 _bfd_error_handler
14401 (_("Warning: %B uses %s (set by %B), "
14402 "%B uses unknown floating point ABI %d"),
14403 obfd, abi_fp_bfd, ibfd,
14404 "-msingle-float", in_attr[Tag_GNU_MIPS_ABI_FP].i);
14405 break;
2cf19d5c
JM
14406 }
14407 break;
14408
d929bc19 14409 case Val_GNU_MIPS_ABI_FP_SOFT:
2cf19d5c
JM
14410 switch (in_attr[Tag_GNU_MIPS_ABI_FP].i)
14411 {
d929bc19
MR
14412 case Val_GNU_MIPS_ABI_FP_DOUBLE:
14413 case Val_GNU_MIPS_ABI_FP_SINGLE:
14414 case Val_GNU_MIPS_ABI_FP_64:
2cf19d5c 14415 _bfd_error_handler
6ae68ba3
MR
14416 (_("Warning: %B uses %s (set by %B), %B uses %s"),
14417 obfd, abi_fp_bfd, ibfd, "-msoft-float", "-mhard-float");
2cf19d5c
JM
14418 break;
14419
14420 default:
6ae68ba3
MR
14421 _bfd_error_handler
14422 (_("Warning: %B uses %s (set by %B), "
14423 "%B uses unknown floating point ABI %d"),
14424 obfd, abi_fp_bfd, ibfd,
14425 "-msoft-float", in_attr[Tag_GNU_MIPS_ABI_FP].i);
14426 break;
2cf19d5c
JM
14427 }
14428 break;
14429
d929bc19 14430 case Val_GNU_MIPS_ABI_FP_64:
42554f6a
TS
14431 switch (in_attr[Tag_GNU_MIPS_ABI_FP].i)
14432 {
d929bc19 14433 case Val_GNU_MIPS_ABI_FP_DOUBLE:
42554f6a 14434 _bfd_error_handler
6ae68ba3
MR
14435 (_("Warning: %B uses %s (set by %B), %B uses %s"),
14436 obfd, abi_fp_bfd, ibfd,
14437 "-mips32r2 -mfp64", "-mdouble-float");
42554f6a
TS
14438 break;
14439
d929bc19 14440 case Val_GNU_MIPS_ABI_FP_SINGLE:
42554f6a 14441 _bfd_error_handler
6ae68ba3
MR
14442 (_("Warning: %B uses %s (set by %B), %B uses %s"),
14443 obfd, abi_fp_bfd, ibfd,
14444 "-mips32r2 -mfp64", "-msingle-float");
42554f6a
TS
14445 break;
14446
d929bc19 14447 case Val_GNU_MIPS_ABI_FP_SOFT:
42554f6a 14448 _bfd_error_handler
6ae68ba3
MR
14449 (_("Warning: %B uses %s (set by %B), %B uses %s"),
14450 obfd, abi_fp_bfd, ibfd, "-mhard-float", "-msoft-float");
42554f6a
TS
14451 break;
14452
14453 default:
6ae68ba3
MR
14454 _bfd_error_handler
14455 (_("Warning: %B uses %s (set by %B), "
14456 "%B uses unknown floating point ABI %d"),
14457 obfd, abi_fp_bfd, ibfd,
14458 "-mips32r2 -mfp64", in_attr[Tag_GNU_MIPS_ABI_FP].i);
14459 break;
42554f6a
TS
14460 }
14461 break;
14462
2cf19d5c 14463 default:
6ae68ba3
MR
14464 switch (in_attr[Tag_GNU_MIPS_ABI_FP].i)
14465 {
d929bc19 14466 case Val_GNU_MIPS_ABI_FP_DOUBLE:
6ae68ba3
MR
14467 _bfd_error_handler
14468 (_("Warning: %B uses unknown floating point ABI %d "
14469 "(set by %B), %B uses %s"),
14470 obfd, abi_fp_bfd, ibfd,
14471 out_attr[Tag_GNU_MIPS_ABI_FP].i, "-mdouble-float");
14472 break;
14473
d929bc19 14474 case Val_GNU_MIPS_ABI_FP_SINGLE:
6ae68ba3
MR
14475 _bfd_error_handler
14476 (_("Warning: %B uses unknown floating point ABI %d "
14477 "(set by %B), %B uses %s"),
14478 obfd, abi_fp_bfd, ibfd,
14479 out_attr[Tag_GNU_MIPS_ABI_FP].i, "-msingle-float");
14480 break;
14481
d929bc19 14482 case Val_GNU_MIPS_ABI_FP_SOFT:
6ae68ba3
MR
14483 _bfd_error_handler
14484 (_("Warning: %B uses unknown floating point ABI %d "
14485 "(set by %B), %B uses %s"),
14486 obfd, abi_fp_bfd, ibfd,
14487 out_attr[Tag_GNU_MIPS_ABI_FP].i, "-msoft-float");
14488 break;
14489
d929bc19 14490 case Val_GNU_MIPS_ABI_FP_64:
6ae68ba3
MR
14491 _bfd_error_handler
14492 (_("Warning: %B uses unknown floating point ABI %d "
14493 "(set by %B), %B uses %s"),
14494 obfd, abi_fp_bfd, ibfd,
14495 out_attr[Tag_GNU_MIPS_ABI_FP].i, "-mips32r2 -mfp64");
14496 break;
14497
14498 default:
14499 _bfd_error_handler
14500 (_("Warning: %B uses unknown floating point ABI %d "
14501 "(set by %B), %B uses unknown floating point ABI %d"),
14502 obfd, abi_fp_bfd, ibfd,
14503 out_attr[Tag_GNU_MIPS_ABI_FP].i,
14504 in_attr[Tag_GNU_MIPS_ABI_FP].i);
14505 break;
14506 }
14507 break;
2cf19d5c
JM
14508 }
14509 }
14510
14511 /* Merge Tag_compatibility attributes and any common GNU ones. */
14512 _bfd_elf_merge_object_attributes (ibfd, obfd);
14513
14514 return TRUE;
14515}
14516
b49e97c9
TS
14517/* Merge backend specific data from an object file to the output
14518 object file when linking. */
14519
b34976b6 14520bfd_boolean
9719ad41 14521_bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
b49e97c9
TS
14522{
14523 flagword old_flags;
14524 flagword new_flags;
b34976b6
AM
14525 bfd_boolean ok;
14526 bfd_boolean null_input_bfd = TRUE;
b49e97c9
TS
14527 asection *sec;
14528
58238693 14529 /* Check if we have the same endianness. */
82e51918 14530 if (! _bfd_generic_verify_endian_match (ibfd, obfd))
aa701218
AO
14531 {
14532 (*_bfd_error_handler)
d003868e
AM
14533 (_("%B: endianness incompatible with that of the selected emulation"),
14534 ibfd);
aa701218
AO
14535 return FALSE;
14536 }
b49e97c9 14537
d5eaccd7 14538 if (!is_mips_elf (ibfd) || !is_mips_elf (obfd))
b34976b6 14539 return TRUE;
b49e97c9 14540
aa701218
AO
14541 if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
14542 {
14543 (*_bfd_error_handler)
d003868e
AM
14544 (_("%B: ABI is incompatible with that of the selected emulation"),
14545 ibfd);
aa701218
AO
14546 return FALSE;
14547 }
14548
2cf19d5c
JM
14549 if (!mips_elf_merge_obj_attributes (ibfd, obfd))
14550 return FALSE;
14551
b49e97c9
TS
14552 new_flags = elf_elfheader (ibfd)->e_flags;
14553 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_NOREORDER;
14554 old_flags = elf_elfheader (obfd)->e_flags;
14555
14556 if (! elf_flags_init (obfd))
14557 {
b34976b6 14558 elf_flags_init (obfd) = TRUE;
b49e97c9
TS
14559 elf_elfheader (obfd)->e_flags = new_flags;
14560 elf_elfheader (obfd)->e_ident[EI_CLASS]
14561 = elf_elfheader (ibfd)->e_ident[EI_CLASS];
14562
14563 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
2907b861 14564 && (bfd_get_arch_info (obfd)->the_default
68ffbac6 14565 || mips_mach_extends_p (bfd_get_mach (obfd),
2907b861 14566 bfd_get_mach (ibfd))))
b49e97c9
TS
14567 {
14568 if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
14569 bfd_get_mach (ibfd)))
b34976b6 14570 return FALSE;
b49e97c9
TS
14571 }
14572
b34976b6 14573 return TRUE;
b49e97c9
TS
14574 }
14575
14576 /* Check flag compatibility. */
14577
14578 new_flags &= ~EF_MIPS_NOREORDER;
14579 old_flags &= ~EF_MIPS_NOREORDER;
14580
f4416af6
AO
14581 /* Some IRIX 6 BSD-compatibility objects have this bit set. It
14582 doesn't seem to matter. */
14583 new_flags &= ~EF_MIPS_XGOT;
14584 old_flags &= ~EF_MIPS_XGOT;
14585
98a8deaf
RS
14586 /* MIPSpro generates ucode info in n64 objects. Again, we should
14587 just be able to ignore this. */
14588 new_flags &= ~EF_MIPS_UCODE;
14589 old_flags &= ~EF_MIPS_UCODE;
14590
861fb55a
DJ
14591 /* DSOs should only be linked with CPIC code. */
14592 if ((ibfd->flags & DYNAMIC) != 0)
14593 new_flags |= EF_MIPS_PIC | EF_MIPS_CPIC;
0a44bf69 14594
b49e97c9 14595 if (new_flags == old_flags)
b34976b6 14596 return TRUE;
b49e97c9
TS
14597
14598 /* Check to see if the input BFD actually contains any sections.
14599 If not, its flags may not have been initialised either, but it cannot
14600 actually cause any incompatibility. */
14601 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
14602 {
14603 /* Ignore synthetic sections and empty .text, .data and .bss sections
ed88c97e
RS
14604 which are automatically generated by gas. Also ignore fake
14605 (s)common sections, since merely defining a common symbol does
14606 not affect compatibility. */
14607 if ((sec->flags & SEC_IS_COMMON) == 0
14608 && strcmp (sec->name, ".reginfo")
b49e97c9 14609 && strcmp (sec->name, ".mdebug")
eea6121a 14610 && (sec->size != 0
d13d89fa
NS
14611 || (strcmp (sec->name, ".text")
14612 && strcmp (sec->name, ".data")
14613 && strcmp (sec->name, ".bss"))))
b49e97c9 14614 {
b34976b6 14615 null_input_bfd = FALSE;
b49e97c9
TS
14616 break;
14617 }
14618 }
14619 if (null_input_bfd)
b34976b6 14620 return TRUE;
b49e97c9 14621
b34976b6 14622 ok = TRUE;
b49e97c9 14623
143d77c5
EC
14624 if (((new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0)
14625 != ((old_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0))
b49e97c9 14626 {
b49e97c9 14627 (*_bfd_error_handler)
861fb55a 14628 (_("%B: warning: linking abicalls files with non-abicalls files"),
d003868e 14629 ibfd);
143d77c5 14630 ok = TRUE;
b49e97c9
TS
14631 }
14632
143d77c5
EC
14633 if (new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC))
14634 elf_elfheader (obfd)->e_flags |= EF_MIPS_CPIC;
14635 if (! (new_flags & EF_MIPS_PIC))
14636 elf_elfheader (obfd)->e_flags &= ~EF_MIPS_PIC;
14637
14638 new_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
14639 old_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
b49e97c9 14640
64543e1a
RS
14641 /* Compare the ISAs. */
14642 if (mips_32bit_flags_p (old_flags) != mips_32bit_flags_p (new_flags))
b49e97c9 14643 {
64543e1a 14644 (*_bfd_error_handler)
d003868e
AM
14645 (_("%B: linking 32-bit code with 64-bit code"),
14646 ibfd);
64543e1a
RS
14647 ok = FALSE;
14648 }
14649 else if (!mips_mach_extends_p (bfd_get_mach (ibfd), bfd_get_mach (obfd)))
14650 {
14651 /* OBFD's ISA isn't the same as, or an extension of, IBFD's. */
14652 if (mips_mach_extends_p (bfd_get_mach (obfd), bfd_get_mach (ibfd)))
b49e97c9 14653 {
64543e1a
RS
14654 /* Copy the architecture info from IBFD to OBFD. Also copy
14655 the 32-bit flag (if set) so that we continue to recognise
14656 OBFD as a 32-bit binary. */
14657 bfd_set_arch_info (obfd, bfd_get_arch_info (ibfd));
14658 elf_elfheader (obfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
14659 elf_elfheader (obfd)->e_flags
14660 |= new_flags & (EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
14661
14662 /* Copy across the ABI flags if OBFD doesn't use them
14663 and if that was what caused us to treat IBFD as 32-bit. */
14664 if ((old_flags & EF_MIPS_ABI) == 0
14665 && mips_32bit_flags_p (new_flags)
14666 && !mips_32bit_flags_p (new_flags & ~EF_MIPS_ABI))
14667 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ABI;
b49e97c9
TS
14668 }
14669 else
14670 {
64543e1a 14671 /* The ISAs aren't compatible. */
b49e97c9 14672 (*_bfd_error_handler)
d003868e
AM
14673 (_("%B: linking %s module with previous %s modules"),
14674 ibfd,
64543e1a
RS
14675 bfd_printable_name (ibfd),
14676 bfd_printable_name (obfd));
b34976b6 14677 ok = FALSE;
b49e97c9 14678 }
b49e97c9
TS
14679 }
14680
64543e1a
RS
14681 new_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
14682 old_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
14683
14684 /* Compare ABIs. The 64-bit ABI does not use EF_MIPS_ABI. But, it
b49e97c9
TS
14685 does set EI_CLASS differently from any 32-bit ABI. */
14686 if ((new_flags & EF_MIPS_ABI) != (old_flags & EF_MIPS_ABI)
14687 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
14688 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
14689 {
14690 /* Only error if both are set (to different values). */
14691 if (((new_flags & EF_MIPS_ABI) && (old_flags & EF_MIPS_ABI))
14692 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
14693 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
14694 {
14695 (*_bfd_error_handler)
d003868e
AM
14696 (_("%B: ABI mismatch: linking %s module with previous %s modules"),
14697 ibfd,
b49e97c9
TS
14698 elf_mips_abi_name (ibfd),
14699 elf_mips_abi_name (obfd));
b34976b6 14700 ok = FALSE;
b49e97c9
TS
14701 }
14702 new_flags &= ~EF_MIPS_ABI;
14703 old_flags &= ~EF_MIPS_ABI;
14704 }
14705
df58fc94
RS
14706 /* Compare ASEs. Forbid linking MIPS16 and microMIPS ASE modules together
14707 and allow arbitrary mixing of the remaining ASEs (retain the union). */
fb39dac1
RS
14708 if ((new_flags & EF_MIPS_ARCH_ASE) != (old_flags & EF_MIPS_ARCH_ASE))
14709 {
df58fc94
RS
14710 int old_micro = old_flags & EF_MIPS_ARCH_ASE_MICROMIPS;
14711 int new_micro = new_flags & EF_MIPS_ARCH_ASE_MICROMIPS;
14712 int old_m16 = old_flags & EF_MIPS_ARCH_ASE_M16;
14713 int new_m16 = new_flags & EF_MIPS_ARCH_ASE_M16;
14714 int micro_mis = old_m16 && new_micro;
14715 int m16_mis = old_micro && new_m16;
14716
14717 if (m16_mis || micro_mis)
14718 {
14719 (*_bfd_error_handler)
14720 (_("%B: ASE mismatch: linking %s module with previous %s modules"),
14721 ibfd,
14722 m16_mis ? "MIPS16" : "microMIPS",
14723 m16_mis ? "microMIPS" : "MIPS16");
14724 ok = FALSE;
14725 }
14726
fb39dac1
RS
14727 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ARCH_ASE;
14728
14729 new_flags &= ~ EF_MIPS_ARCH_ASE;
14730 old_flags &= ~ EF_MIPS_ARCH_ASE;
14731 }
14732
ba92f887
MR
14733 /* Compare NaN encodings. */
14734 if ((new_flags & EF_MIPS_NAN2008) != (old_flags & EF_MIPS_NAN2008))
14735 {
14736 _bfd_error_handler (_("%B: linking %s module with previous %s modules"),
14737 ibfd,
14738 (new_flags & EF_MIPS_NAN2008
14739 ? "-mnan=2008" : "-mnan=legacy"),
14740 (old_flags & EF_MIPS_NAN2008
14741 ? "-mnan=2008" : "-mnan=legacy"));
14742 ok = FALSE;
14743 new_flags &= ~EF_MIPS_NAN2008;
14744 old_flags &= ~EF_MIPS_NAN2008;
14745 }
14746
b49e97c9
TS
14747 /* Warn about any other mismatches */
14748 if (new_flags != old_flags)
14749 {
14750 (*_bfd_error_handler)
d003868e
AM
14751 (_("%B: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
14752 ibfd, (unsigned long) new_flags,
b49e97c9 14753 (unsigned long) old_flags);
b34976b6 14754 ok = FALSE;
b49e97c9
TS
14755 }
14756
14757 if (! ok)
14758 {
14759 bfd_set_error (bfd_error_bad_value);
b34976b6 14760 return FALSE;
b49e97c9
TS
14761 }
14762
b34976b6 14763 return TRUE;
b49e97c9
TS
14764}
14765
14766/* Function to keep MIPS specific file flags like as EF_MIPS_PIC. */
14767
b34976b6 14768bfd_boolean
9719ad41 14769_bfd_mips_elf_set_private_flags (bfd *abfd, flagword flags)
b49e97c9
TS
14770{
14771 BFD_ASSERT (!elf_flags_init (abfd)
14772 || elf_elfheader (abfd)->e_flags == flags);
14773
14774 elf_elfheader (abfd)->e_flags = flags;
b34976b6
AM
14775 elf_flags_init (abfd) = TRUE;
14776 return TRUE;
b49e97c9
TS
14777}
14778
ad9563d6
CM
14779char *
14780_bfd_mips_elf_get_target_dtag (bfd_vma dtag)
14781{
14782 switch (dtag)
14783 {
14784 default: return "";
14785 case DT_MIPS_RLD_VERSION:
14786 return "MIPS_RLD_VERSION";
14787 case DT_MIPS_TIME_STAMP:
14788 return "MIPS_TIME_STAMP";
14789 case DT_MIPS_ICHECKSUM:
14790 return "MIPS_ICHECKSUM";
14791 case DT_MIPS_IVERSION:
14792 return "MIPS_IVERSION";
14793 case DT_MIPS_FLAGS:
14794 return "MIPS_FLAGS";
14795 case DT_MIPS_BASE_ADDRESS:
14796 return "MIPS_BASE_ADDRESS";
14797 case DT_MIPS_MSYM:
14798 return "MIPS_MSYM";
14799 case DT_MIPS_CONFLICT:
14800 return "MIPS_CONFLICT";
14801 case DT_MIPS_LIBLIST:
14802 return "MIPS_LIBLIST";
14803 case DT_MIPS_LOCAL_GOTNO:
14804 return "MIPS_LOCAL_GOTNO";
14805 case DT_MIPS_CONFLICTNO:
14806 return "MIPS_CONFLICTNO";
14807 case DT_MIPS_LIBLISTNO:
14808 return "MIPS_LIBLISTNO";
14809 case DT_MIPS_SYMTABNO:
14810 return "MIPS_SYMTABNO";
14811 case DT_MIPS_UNREFEXTNO:
14812 return "MIPS_UNREFEXTNO";
14813 case DT_MIPS_GOTSYM:
14814 return "MIPS_GOTSYM";
14815 case DT_MIPS_HIPAGENO:
14816 return "MIPS_HIPAGENO";
14817 case DT_MIPS_RLD_MAP:
14818 return "MIPS_RLD_MAP";
14819 case DT_MIPS_DELTA_CLASS:
14820 return "MIPS_DELTA_CLASS";
14821 case DT_MIPS_DELTA_CLASS_NO:
14822 return "MIPS_DELTA_CLASS_NO";
14823 case DT_MIPS_DELTA_INSTANCE:
14824 return "MIPS_DELTA_INSTANCE";
14825 case DT_MIPS_DELTA_INSTANCE_NO:
14826 return "MIPS_DELTA_INSTANCE_NO";
14827 case DT_MIPS_DELTA_RELOC:
14828 return "MIPS_DELTA_RELOC";
14829 case DT_MIPS_DELTA_RELOC_NO:
14830 return "MIPS_DELTA_RELOC_NO";
14831 case DT_MIPS_DELTA_SYM:
14832 return "MIPS_DELTA_SYM";
14833 case DT_MIPS_DELTA_SYM_NO:
14834 return "MIPS_DELTA_SYM_NO";
14835 case DT_MIPS_DELTA_CLASSSYM:
14836 return "MIPS_DELTA_CLASSSYM";
14837 case DT_MIPS_DELTA_CLASSSYM_NO:
14838 return "MIPS_DELTA_CLASSSYM_NO";
14839 case DT_MIPS_CXX_FLAGS:
14840 return "MIPS_CXX_FLAGS";
14841 case DT_MIPS_PIXIE_INIT:
14842 return "MIPS_PIXIE_INIT";
14843 case DT_MIPS_SYMBOL_LIB:
14844 return "MIPS_SYMBOL_LIB";
14845 case DT_MIPS_LOCALPAGE_GOTIDX:
14846 return "MIPS_LOCALPAGE_GOTIDX";
14847 case DT_MIPS_LOCAL_GOTIDX:
14848 return "MIPS_LOCAL_GOTIDX";
14849 case DT_MIPS_HIDDEN_GOTIDX:
14850 return "MIPS_HIDDEN_GOTIDX";
14851 case DT_MIPS_PROTECTED_GOTIDX:
14852 return "MIPS_PROTECTED_GOT_IDX";
14853 case DT_MIPS_OPTIONS:
14854 return "MIPS_OPTIONS";
14855 case DT_MIPS_INTERFACE:
14856 return "MIPS_INTERFACE";
14857 case DT_MIPS_DYNSTR_ALIGN:
14858 return "DT_MIPS_DYNSTR_ALIGN";
14859 case DT_MIPS_INTERFACE_SIZE:
14860 return "DT_MIPS_INTERFACE_SIZE";
14861 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR:
14862 return "DT_MIPS_RLD_TEXT_RESOLVE_ADDR";
14863 case DT_MIPS_PERF_SUFFIX:
14864 return "DT_MIPS_PERF_SUFFIX";
14865 case DT_MIPS_COMPACT_SIZE:
14866 return "DT_MIPS_COMPACT_SIZE";
14867 case DT_MIPS_GP_VALUE:
14868 return "DT_MIPS_GP_VALUE";
14869 case DT_MIPS_AUX_DYNAMIC:
14870 return "DT_MIPS_AUX_DYNAMIC";
861fb55a
DJ
14871 case DT_MIPS_PLTGOT:
14872 return "DT_MIPS_PLTGOT";
14873 case DT_MIPS_RWPLT:
14874 return "DT_MIPS_RWPLT";
ad9563d6
CM
14875 }
14876}
14877
b34976b6 14878bfd_boolean
9719ad41 14879_bfd_mips_elf_print_private_bfd_data (bfd *abfd, void *ptr)
b49e97c9 14880{
9719ad41 14881 FILE *file = ptr;
b49e97c9
TS
14882
14883 BFD_ASSERT (abfd != NULL && ptr != NULL);
14884
14885 /* Print normal ELF private data. */
14886 _bfd_elf_print_private_bfd_data (abfd, ptr);
14887
14888 /* xgettext:c-format */
14889 fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
14890
14891 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O32)
14892 fprintf (file, _(" [abi=O32]"));
14893 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O64)
14894 fprintf (file, _(" [abi=O64]"));
14895 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32)
14896 fprintf (file, _(" [abi=EABI32]"));
14897 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64)
14898 fprintf (file, _(" [abi=EABI64]"));
14899 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI))
14900 fprintf (file, _(" [abi unknown]"));
14901 else if (ABI_N32_P (abfd))
14902 fprintf (file, _(" [abi=N32]"));
14903 else if (ABI_64_P (abfd))
14904 fprintf (file, _(" [abi=64]"));
14905 else
14906 fprintf (file, _(" [no abi set]"));
14907
14908 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
ae0d2616 14909 fprintf (file, " [mips1]");
b49e97c9 14910 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
ae0d2616 14911 fprintf (file, " [mips2]");
b49e97c9 14912 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
ae0d2616 14913 fprintf (file, " [mips3]");
b49e97c9 14914 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
ae0d2616 14915 fprintf (file, " [mips4]");
b49e97c9 14916 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_5)
ae0d2616 14917 fprintf (file, " [mips5]");
b49e97c9 14918 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
ae0d2616 14919 fprintf (file, " [mips32]");
b49e97c9 14920 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64)
ae0d2616 14921 fprintf (file, " [mips64]");
af7ee8bf 14922 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2)
ae0d2616 14923 fprintf (file, " [mips32r2]");
5f74bc13 14924 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64R2)
ae0d2616 14925 fprintf (file, " [mips64r2]");
b49e97c9
TS
14926 else
14927 fprintf (file, _(" [unknown ISA]"));
14928
40d32fc6 14929 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
ae0d2616 14930 fprintf (file, " [mdmx]");
40d32fc6
CD
14931
14932 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
ae0d2616 14933 fprintf (file, " [mips16]");
40d32fc6 14934
df58fc94
RS
14935 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
14936 fprintf (file, " [micromips]");
14937
ba92f887
MR
14938 if (elf_elfheader (abfd)->e_flags & EF_MIPS_NAN2008)
14939 fprintf (file, " [nan2008]");
14940
5baf5e34
SE
14941 if (elf_elfheader (abfd)->e_flags & EF_MIPS_FP64)
14942 fprintf (file, " [fp64]");
14943
b49e97c9 14944 if (elf_elfheader (abfd)->e_flags & EF_MIPS_32BITMODE)
ae0d2616 14945 fprintf (file, " [32bitmode]");
b49e97c9
TS
14946 else
14947 fprintf (file, _(" [not 32bitmode]"));
14948
c0e3f241 14949 if (elf_elfheader (abfd)->e_flags & EF_MIPS_NOREORDER)
ae0d2616 14950 fprintf (file, " [noreorder]");
c0e3f241
CD
14951
14952 if (elf_elfheader (abfd)->e_flags & EF_MIPS_PIC)
ae0d2616 14953 fprintf (file, " [PIC]");
c0e3f241
CD
14954
14955 if (elf_elfheader (abfd)->e_flags & EF_MIPS_CPIC)
ae0d2616 14956 fprintf (file, " [CPIC]");
c0e3f241
CD
14957
14958 if (elf_elfheader (abfd)->e_flags & EF_MIPS_XGOT)
ae0d2616 14959 fprintf (file, " [XGOT]");
c0e3f241
CD
14960
14961 if (elf_elfheader (abfd)->e_flags & EF_MIPS_UCODE)
ae0d2616 14962 fprintf (file, " [UCODE]");
c0e3f241 14963
b49e97c9
TS
14964 fputc ('\n', file);
14965
b34976b6 14966 return TRUE;
b49e97c9 14967}
2f89ff8d 14968
b35d266b 14969const struct bfd_elf_special_section _bfd_mips_elf_special_sections[] =
2f89ff8d 14970{
0112cd26
NC
14971 { STRING_COMMA_LEN (".lit4"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
14972 { STRING_COMMA_LEN (".lit8"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
14973 { STRING_COMMA_LEN (".mdebug"), 0, SHT_MIPS_DEBUG, 0 },
14974 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
14975 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
14976 { STRING_COMMA_LEN (".ucode"), 0, SHT_MIPS_UCODE, 0 },
14977 { NULL, 0, 0, 0, 0 }
2f89ff8d 14978};
5e2b0d47 14979
8992f0d7
TS
14980/* Merge non visibility st_other attributes. Ensure that the
14981 STO_OPTIONAL flag is copied into h->other, even if this is not a
14982 definiton of the symbol. */
5e2b0d47
NC
14983void
14984_bfd_mips_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
14985 const Elf_Internal_Sym *isym,
14986 bfd_boolean definition,
14987 bfd_boolean dynamic ATTRIBUTE_UNUSED)
14988{
8992f0d7
TS
14989 if ((isym->st_other & ~ELF_ST_VISIBILITY (-1)) != 0)
14990 {
14991 unsigned char other;
14992
14993 other = (definition ? isym->st_other : h->other);
14994 other &= ~ELF_ST_VISIBILITY (-1);
14995 h->other = other | ELF_ST_VISIBILITY (h->other);
14996 }
14997
14998 if (!definition
5e2b0d47
NC
14999 && ELF_MIPS_IS_OPTIONAL (isym->st_other))
15000 h->other |= STO_OPTIONAL;
15001}
12ac1cf5
NC
15002
15003/* Decide whether an undefined symbol is special and can be ignored.
15004 This is the case for OPTIONAL symbols on IRIX. */
15005bfd_boolean
15006_bfd_mips_elf_ignore_undef_symbol (struct elf_link_hash_entry *h)
15007{
15008 return ELF_MIPS_IS_OPTIONAL (h->other) ? TRUE : FALSE;
15009}
e0764319
NC
15010
15011bfd_boolean
15012_bfd_mips_elf_common_definition (Elf_Internal_Sym *sym)
15013{
15014 return (sym->st_shndx == SHN_COMMON
15015 || sym->st_shndx == SHN_MIPS_ACOMMON
15016 || sym->st_shndx == SHN_MIPS_SCOMMON);
15017}
861fb55a
DJ
15018
15019/* Return address for Ith PLT stub in section PLT, for relocation REL
15020 or (bfd_vma) -1 if it should not be included. */
15021
15022bfd_vma
15023_bfd_mips_elf_plt_sym_val (bfd_vma i, const asection *plt,
15024 const arelent *rel ATTRIBUTE_UNUSED)
15025{
15026 return (plt->vma
15027 + 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry)
15028 + i * 4 * ARRAY_SIZE (mips_exec_plt_entry));
15029}
15030
1bbce132
MR
15031/* Build a table of synthetic symbols to represent the PLT. As with MIPS16
15032 and microMIPS PLT slots we may have a many-to-one mapping between .plt
15033 and .got.plt and also the slots may be of a different size each we walk
15034 the PLT manually fetching instructions and matching them against known
15035 patterns. To make things easier standard MIPS slots, if any, always come
15036 first. As we don't create proper ELF symbols we use the UDATA.I member
15037 of ASYMBOL to carry ISA annotation. The encoding used is the same as
15038 with the ST_OTHER member of the ELF symbol. */
15039
15040long
15041_bfd_mips_elf_get_synthetic_symtab (bfd *abfd,
15042 long symcount ATTRIBUTE_UNUSED,
15043 asymbol **syms ATTRIBUTE_UNUSED,
15044 long dynsymcount, asymbol **dynsyms,
15045 asymbol **ret)
15046{
15047 static const char pltname[] = "_PROCEDURE_LINKAGE_TABLE_";
15048 static const char microsuffix[] = "@micromipsplt";
15049 static const char m16suffix[] = "@mips16plt";
15050 static const char mipssuffix[] = "@plt";
15051
15052 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
15053 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
15054 bfd_boolean micromips_p = MICROMIPS_P (abfd);
15055 Elf_Internal_Shdr *hdr;
15056 bfd_byte *plt_data;
15057 bfd_vma plt_offset;
15058 unsigned int other;
15059 bfd_vma entry_size;
15060 bfd_vma plt0_size;
15061 asection *relplt;
15062 bfd_vma opcode;
15063 asection *plt;
15064 asymbol *send;
15065 size_t size;
15066 char *names;
15067 long counti;
15068 arelent *p;
15069 asymbol *s;
15070 char *nend;
15071 long count;
15072 long pi;
15073 long i;
15074 long n;
15075
15076 *ret = NULL;
15077
15078 if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0 || dynsymcount <= 0)
15079 return 0;
15080
15081 relplt = bfd_get_section_by_name (abfd, ".rel.plt");
15082 if (relplt == NULL)
15083 return 0;
15084
15085 hdr = &elf_section_data (relplt)->this_hdr;
15086 if (hdr->sh_link != elf_dynsymtab (abfd) || hdr->sh_type != SHT_REL)
15087 return 0;
15088
15089 plt = bfd_get_section_by_name (abfd, ".plt");
15090 if (plt == NULL)
15091 return 0;
15092
15093 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
15094 if (!(*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
15095 return -1;
15096 p = relplt->relocation;
15097
15098 /* Calculating the exact amount of space required for symbols would
15099 require two passes over the PLT, so just pessimise assuming two
15100 PLT slots per relocation. */
15101 count = relplt->size / hdr->sh_entsize;
15102 counti = count * bed->s->int_rels_per_ext_rel;
15103 size = 2 * count * sizeof (asymbol);
15104 size += count * (sizeof (mipssuffix) +
15105 (micromips_p ? sizeof (microsuffix) : sizeof (m16suffix)));
15106 for (pi = 0; pi < counti; pi += bed->s->int_rels_per_ext_rel)
15107 size += 2 * strlen ((*p[pi].sym_ptr_ptr)->name);
15108
15109 /* Add the size of "_PROCEDURE_LINKAGE_TABLE_" too. */
15110 size += sizeof (asymbol) + sizeof (pltname);
15111
15112 if (!bfd_malloc_and_get_section (abfd, plt, &plt_data))
15113 return -1;
15114
15115 if (plt->size < 16)
15116 return -1;
15117
15118 s = *ret = bfd_malloc (size);
15119 if (s == NULL)
15120 return -1;
15121 send = s + 2 * count + 1;
15122
15123 names = (char *) send;
15124 nend = (char *) s + size;
15125 n = 0;
15126
15127 opcode = bfd_get_micromips_32 (abfd, plt_data + 12);
15128 if (opcode == 0x3302fffe)
15129 {
15130 if (!micromips_p)
15131 return -1;
15132 plt0_size = 2 * ARRAY_SIZE (micromips_o32_exec_plt0_entry);
15133 other = STO_MICROMIPS;
15134 }
833794fc
MR
15135 else if (opcode == 0x0398c1d0)
15136 {
15137 if (!micromips_p)
15138 return -1;
15139 plt0_size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt0_entry);
15140 other = STO_MICROMIPS;
15141 }
1bbce132
MR
15142 else
15143 {
15144 plt0_size = 4 * ARRAY_SIZE (mips_o32_exec_plt0_entry);
15145 other = 0;
15146 }
15147
15148 s->the_bfd = abfd;
15149 s->flags = BSF_SYNTHETIC | BSF_FUNCTION | BSF_LOCAL;
15150 s->section = plt;
15151 s->value = 0;
15152 s->name = names;
15153 s->udata.i = other;
15154 memcpy (names, pltname, sizeof (pltname));
15155 names += sizeof (pltname);
15156 ++s, ++n;
15157
15158 pi = 0;
15159 for (plt_offset = plt0_size;
15160 plt_offset + 8 <= plt->size && s < send;
15161 plt_offset += entry_size)
15162 {
15163 bfd_vma gotplt_addr;
15164 const char *suffix;
15165 bfd_vma gotplt_hi;
15166 bfd_vma gotplt_lo;
15167 size_t suffixlen;
15168
15169 opcode = bfd_get_micromips_32 (abfd, plt_data + plt_offset + 4);
15170
15171 /* Check if the second word matches the expected MIPS16 instruction. */
15172 if (opcode == 0x651aeb00)
15173 {
15174 if (micromips_p)
15175 return -1;
15176 /* Truncated table??? */
15177 if (plt_offset + 16 > plt->size)
15178 break;
15179 gotplt_addr = bfd_get_32 (abfd, plt_data + plt_offset + 12);
15180 entry_size = 2 * ARRAY_SIZE (mips16_o32_exec_plt_entry);
15181 suffixlen = sizeof (m16suffix);
15182 suffix = m16suffix;
15183 other = STO_MIPS16;
15184 }
833794fc 15185 /* Likewise the expected microMIPS instruction (no insn32 mode). */
1bbce132
MR
15186 else if (opcode == 0xff220000)
15187 {
15188 if (!micromips_p)
15189 return -1;
15190 gotplt_hi = bfd_get_16 (abfd, plt_data + plt_offset) & 0x7f;
15191 gotplt_lo = bfd_get_16 (abfd, plt_data + plt_offset + 2) & 0xffff;
15192 gotplt_hi = ((gotplt_hi ^ 0x40) - 0x40) << 18;
15193 gotplt_lo <<= 2;
15194 gotplt_addr = gotplt_hi + gotplt_lo;
15195 gotplt_addr += ((plt->vma + plt_offset) | 3) ^ 3;
15196 entry_size = 2 * ARRAY_SIZE (micromips_o32_exec_plt_entry);
15197 suffixlen = sizeof (microsuffix);
15198 suffix = microsuffix;
15199 other = STO_MICROMIPS;
15200 }
833794fc
MR
15201 /* Likewise the expected microMIPS instruction (insn32 mode). */
15202 else if ((opcode & 0xffff0000) == 0xff2f0000)
15203 {
15204 gotplt_hi = bfd_get_16 (abfd, plt_data + plt_offset + 2) & 0xffff;
15205 gotplt_lo = bfd_get_16 (abfd, plt_data + plt_offset + 6) & 0xffff;
15206 gotplt_hi = ((gotplt_hi ^ 0x8000) - 0x8000) << 16;
15207 gotplt_lo = (gotplt_lo ^ 0x8000) - 0x8000;
15208 gotplt_addr = gotplt_hi + gotplt_lo;
15209 entry_size = 2 * ARRAY_SIZE (micromips_insn32_o32_exec_plt_entry);
15210 suffixlen = sizeof (microsuffix);
15211 suffix = microsuffix;
15212 other = STO_MICROMIPS;
15213 }
1bbce132
MR
15214 /* Otherwise assume standard MIPS code. */
15215 else
15216 {
15217 gotplt_hi = bfd_get_32 (abfd, plt_data + plt_offset) & 0xffff;
15218 gotplt_lo = bfd_get_32 (abfd, plt_data + plt_offset + 4) & 0xffff;
15219 gotplt_hi = ((gotplt_hi ^ 0x8000) - 0x8000) << 16;
15220 gotplt_lo = (gotplt_lo ^ 0x8000) - 0x8000;
15221 gotplt_addr = gotplt_hi + gotplt_lo;
15222 entry_size = 4 * ARRAY_SIZE (mips_exec_plt_entry);
15223 suffixlen = sizeof (mipssuffix);
15224 suffix = mipssuffix;
15225 other = 0;
15226 }
15227 /* Truncated table??? */
15228 if (plt_offset + entry_size > plt->size)
15229 break;
15230
15231 for (i = 0;
15232 i < count && p[pi].address != gotplt_addr;
15233 i++, pi = (pi + bed->s->int_rels_per_ext_rel) % counti);
15234
15235 if (i < count)
15236 {
15237 size_t namelen;
15238 size_t len;
15239
15240 *s = **p[pi].sym_ptr_ptr;
15241 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
15242 we are defining a symbol, ensure one of them is set. */
15243 if ((s->flags & BSF_LOCAL) == 0)
15244 s->flags |= BSF_GLOBAL;
15245 s->flags |= BSF_SYNTHETIC;
15246 s->section = plt;
15247 s->value = plt_offset;
15248 s->name = names;
15249 s->udata.i = other;
15250
15251 len = strlen ((*p[pi].sym_ptr_ptr)->name);
15252 namelen = len + suffixlen;
15253 if (names + namelen > nend)
15254 break;
15255
15256 memcpy (names, (*p[pi].sym_ptr_ptr)->name, len);
15257 names += len;
15258 memcpy (names, suffix, suffixlen);
15259 names += suffixlen;
15260
15261 ++s, ++n;
15262 pi = (pi + bed->s->int_rels_per_ext_rel) % counti;
15263 }
15264 }
15265
15266 free (plt_data);
15267
15268 return n;
15269}
15270
861fb55a
DJ
15271void
15272_bfd_mips_post_process_headers (bfd *abfd, struct bfd_link_info *link_info)
15273{
15274 struct mips_elf_link_hash_table *htab;
15275 Elf_Internal_Ehdr *i_ehdrp;
15276
15277 i_ehdrp = elf_elfheader (abfd);
15278 if (link_info)
15279 {
15280 htab = mips_elf_hash_table (link_info);
4dfe6ac6
NC
15281 BFD_ASSERT (htab != NULL);
15282
861fb55a
DJ
15283 if (htab->use_plts_and_copy_relocs && !htab->is_vxworks)
15284 i_ehdrp->e_ident[EI_ABIVERSION] = 1;
15285 }
15286}