]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elfxx-mips.c
include/opcode/
[thirdparty/binutils-gdb.git] / bfd / elfxx-mips.c
CommitLineData
b49e97c9 1/* MIPS-specific support for ELF
64543e1a 2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3db64b00 3 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
b49e97c9
TS
4
5 Most of the information added by Ian Lance Taylor, Cygnus Support,
6 <ian@cygnus.com>.
7 N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
8 <mark@codesourcery.com>
9 Traditional MIPS targets support added by Koundinya.K, Dansk Data
10 Elektronik & Operations Research Group. <kk@ddeorg.soft.net>
11
ae9a127f 12 This file is part of BFD, the Binary File Descriptor library.
b49e97c9 13
ae9a127f
NC
14 This program is free software; you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
cd123cb7 16 the Free Software Foundation; either version 3 of the License, or
ae9a127f 17 (at your option) any later version.
b49e97c9 18
ae9a127f
NC
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
b49e97c9 23
ae9a127f
NC
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
cd123cb7
NC
26 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
27 MA 02110-1301, USA. */
28
b49e97c9
TS
29
30/* This file handles functionality common to the different MIPS ABI's. */
31
b49e97c9 32#include "sysdep.h"
3db64b00 33#include "bfd.h"
b49e97c9 34#include "libbfd.h"
64543e1a 35#include "libiberty.h"
b49e97c9
TS
36#include "elf-bfd.h"
37#include "elfxx-mips.h"
38#include "elf/mips.h"
0a44bf69 39#include "elf-vxworks.h"
b49e97c9
TS
40
41/* Get the ECOFF swapping routines. */
42#include "coff/sym.h"
43#include "coff/symconst.h"
44#include "coff/ecoff.h"
45#include "coff/mips.h"
46
b15e6682
AO
47#include "hashtab.h"
48
ead49a57
RS
49/* This structure is used to hold information about one GOT entry.
50 There are three types of entry:
51
52 (1) absolute addresses
53 (abfd == NULL)
54 (2) SYMBOL + OFFSET addresses, where SYMBOL is local to an input bfd
55 (abfd != NULL, symndx >= 0)
56 (3) global and forced-local symbols
57 (abfd != NULL, symndx == -1)
58
59 Type (3) entries are treated differently for different types of GOT.
60 In the "master" GOT -- i.e. the one that describes every GOT
61 reference needed in the link -- the mips_got_entry is keyed on both
62 the symbol and the input bfd that references it. If it turns out
63 that we need multiple GOTs, we can then use this information to
64 create separate GOTs for each input bfd.
65
66 However, we want each of these separate GOTs to have at most one
67 entry for a given symbol, so their type (3) entries are keyed only
68 on the symbol. The input bfd given by the "abfd" field is somewhat
69 arbitrary in this case.
70
71 This means that when there are multiple GOTs, each GOT has a unique
72 mips_got_entry for every symbol within it. We can therefore use the
73 mips_got_entry fields (tls_type and gotidx) to track the symbol's
74 GOT index.
75
76 However, if it turns out that we need only a single GOT, we continue
77 to use the master GOT to describe it. There may therefore be several
78 mips_got_entries for the same symbol, each with a different input bfd.
79 We want to make sure that each symbol gets a unique GOT entry, so when
80 there's a single GOT, we use the symbol's hash entry, not the
81 mips_got_entry fields, to track a symbol's GOT index. */
b15e6682
AO
82struct mips_got_entry
83{
84 /* The input bfd in which the symbol is defined. */
85 bfd *abfd;
f4416af6
AO
86 /* The index of the symbol, as stored in the relocation r_info, if
87 we have a local symbol; -1 otherwise. */
88 long symndx;
89 union
90 {
91 /* If abfd == NULL, an address that must be stored in the got. */
92 bfd_vma address;
93 /* If abfd != NULL && symndx != -1, the addend of the relocation
94 that should be added to the symbol value. */
95 bfd_vma addend;
96 /* If abfd != NULL && symndx == -1, the hash table entry
97 corresponding to a global symbol in the got (or, local, if
98 h->forced_local). */
99 struct mips_elf_link_hash_entry *h;
100 } d;
0f20cc35
DJ
101
102 /* The TLS types included in this GOT entry (specifically, GD and
103 IE). The GD and IE flags can be added as we encounter new
104 relocations. LDM can also be set; it will always be alone, not
105 combined with any GD or IE flags. An LDM GOT entry will be
106 a local symbol entry with r_symndx == 0. */
107 unsigned char tls_type;
108
b15e6682 109 /* The offset from the beginning of the .got section to the entry
f4416af6
AO
110 corresponding to this symbol+addend. If it's a global symbol
111 whose offset is yet to be decided, it's going to be -1. */
112 long gotidx;
b15e6682
AO
113};
114
c224138d
RS
115/* This structure describes a range of addends: [MIN_ADDEND, MAX_ADDEND].
116 The structures form a non-overlapping list that is sorted by increasing
117 MIN_ADDEND. */
118struct mips_got_page_range
119{
120 struct mips_got_page_range *next;
121 bfd_signed_vma min_addend;
122 bfd_signed_vma max_addend;
123};
124
125/* This structure describes the range of addends that are applied to page
126 relocations against a given symbol. */
127struct mips_got_page_entry
128{
129 /* The input bfd in which the symbol is defined. */
130 bfd *abfd;
131 /* The index of the symbol, as stored in the relocation r_info. */
132 long symndx;
133 /* The ranges for this page entry. */
134 struct mips_got_page_range *ranges;
135 /* The maximum number of page entries needed for RANGES. */
136 bfd_vma num_pages;
137};
138
f0abc2a1 139/* This structure is used to hold .got information when linking. */
b49e97c9
TS
140
141struct mips_got_info
142{
143 /* The global symbol in the GOT with the lowest index in the dynamic
144 symbol table. */
145 struct elf_link_hash_entry *global_gotsym;
146 /* The number of global .got entries. */
147 unsigned int global_gotno;
0f20cc35
DJ
148 /* The number of .got slots used for TLS. */
149 unsigned int tls_gotno;
150 /* The first unused TLS .got entry. Used only during
151 mips_elf_initialize_tls_index. */
152 unsigned int tls_assigned_gotno;
c224138d 153 /* The number of local .got entries, eventually including page entries. */
b49e97c9 154 unsigned int local_gotno;
c224138d
RS
155 /* The maximum number of page entries needed. */
156 unsigned int page_gotno;
b49e97c9
TS
157 /* The number of local .got entries we have used. */
158 unsigned int assigned_gotno;
b15e6682
AO
159 /* A hash table holding members of the got. */
160 struct htab *got_entries;
c224138d
RS
161 /* A hash table of mips_got_page_entry structures. */
162 struct htab *got_page_entries;
f4416af6
AO
163 /* A hash table mapping input bfds to other mips_got_info. NULL
164 unless multi-got was necessary. */
165 struct htab *bfd2got;
166 /* In multi-got links, a pointer to the next got (err, rather, most
167 of the time, it points to the previous got). */
168 struct mips_got_info *next;
0f20cc35
DJ
169 /* This is the GOT index of the TLS LDM entry for the GOT, MINUS_ONE
170 for none, or MINUS_TWO for not yet assigned. This is needed
171 because a single-GOT link may have multiple hash table entries
172 for the LDM. It does not get initialized in multi-GOT mode. */
173 bfd_vma tls_ldm_offset;
f4416af6
AO
174};
175
176/* Map an input bfd to a got in a multi-got link. */
177
178struct mips_elf_bfd2got_hash {
179 bfd *bfd;
180 struct mips_got_info *g;
181};
182
183/* Structure passed when traversing the bfd2got hash table, used to
184 create and merge bfd's gots. */
185
186struct mips_elf_got_per_bfd_arg
187{
188 /* A hashtable that maps bfds to gots. */
189 htab_t bfd2got;
190 /* The output bfd. */
191 bfd *obfd;
192 /* The link information. */
193 struct bfd_link_info *info;
194 /* A pointer to the primary got, i.e., the one that's going to get
195 the implicit relocations from DT_MIPS_LOCAL_GOTNO and
196 DT_MIPS_GOTSYM. */
197 struct mips_got_info *primary;
198 /* A non-primary got we're trying to merge with other input bfd's
199 gots. */
200 struct mips_got_info *current;
201 /* The maximum number of got entries that can be addressed with a
202 16-bit offset. */
203 unsigned int max_count;
c224138d
RS
204 /* The maximum number of page entries needed by each got. */
205 unsigned int max_pages;
0f20cc35
DJ
206 /* The total number of global entries which will live in the
207 primary got and be automatically relocated. This includes
208 those not referenced by the primary GOT but included in
209 the "master" GOT. */
210 unsigned int global_count;
f4416af6
AO
211};
212
213/* Another structure used to pass arguments for got entries traversal. */
214
215struct mips_elf_set_global_got_offset_arg
216{
217 struct mips_got_info *g;
218 int value;
219 unsigned int needed_relocs;
220 struct bfd_link_info *info;
b49e97c9
TS
221};
222
0f20cc35
DJ
223/* A structure used to count TLS relocations or GOT entries, for GOT
224 entry or ELF symbol table traversal. */
225
226struct mips_elf_count_tls_arg
227{
228 struct bfd_link_info *info;
229 unsigned int needed;
230};
231
f0abc2a1
AM
232struct _mips_elf_section_data
233{
234 struct bfd_elf_section_data elf;
235 union
236 {
237 struct mips_got_info *got_info;
238 bfd_byte *tdata;
239 } u;
240};
241
242#define mips_elf_section_data(sec) \
68bfbfcc 243 ((struct _mips_elf_section_data *) elf_section_data (sec))
f0abc2a1 244
b49e97c9
TS
245/* This structure is passed to mips_elf_sort_hash_table_f when sorting
246 the dynamic symbols. */
247
248struct mips_elf_hash_sort_data
249{
250 /* The symbol in the global GOT with the lowest dynamic symbol table
251 index. */
252 struct elf_link_hash_entry *low;
0f20cc35
DJ
253 /* The least dynamic symbol table index corresponding to a non-TLS
254 symbol with a GOT entry. */
b49e97c9 255 long min_got_dynindx;
f4416af6
AO
256 /* The greatest dynamic symbol table index corresponding to a symbol
257 with a GOT entry that is not referenced (e.g., a dynamic symbol
9e4aeb93 258 with dynamic relocations pointing to it from non-primary GOTs). */
f4416af6 259 long max_unref_got_dynindx;
b49e97c9
TS
260 /* The greatest dynamic symbol table index not corresponding to a
261 symbol without a GOT entry. */
262 long max_non_got_dynindx;
263};
264
265/* The MIPS ELF linker needs additional information for each symbol in
266 the global hash table. */
267
268struct mips_elf_link_hash_entry
269{
270 struct elf_link_hash_entry root;
271
272 /* External symbol information. */
273 EXTR esym;
274
275 /* Number of R_MIPS_32, R_MIPS_REL32, or R_MIPS_64 relocs against
276 this symbol. */
277 unsigned int possibly_dynamic_relocs;
278
279 /* If the R_MIPS_32, R_MIPS_REL32, or R_MIPS_64 reloc is against
280 a readonly section. */
b34976b6 281 bfd_boolean readonly_reloc;
b49e97c9 282
b49e97c9
TS
283 /* We must not create a stub for a symbol that has relocations
284 related to taking the function's address, i.e. any but
285 R_MIPS_CALL*16 ones -- see "MIPS ABI Supplement, 3rd Edition",
286 p. 4-20. */
b34976b6 287 bfd_boolean no_fn_stub;
b49e97c9
TS
288
289 /* If there is a stub that 32 bit functions should use to call this
290 16 bit function, this points to the section containing the stub. */
291 asection *fn_stub;
292
293 /* Whether we need the fn_stub; this is set if this symbol appears
294 in any relocs other than a 16 bit call. */
b34976b6 295 bfd_boolean need_fn_stub;
b49e97c9
TS
296
297 /* If there is a stub that 16 bit functions should use to call this
298 32 bit function, this points to the section containing the stub. */
299 asection *call_stub;
300
301 /* This is like the call_stub field, but it is used if the function
302 being called returns a floating point value. */
303 asection *call_fp_stub;
7c5fcef7 304
a008ac03
DJ
305 /* Are we forced local? This will only be set if we have converted
306 the initial global GOT entry to a local GOT entry. */
b34976b6 307 bfd_boolean forced_local;
0f20cc35 308
0a44bf69
RS
309 /* Are we referenced by some kind of relocation? */
310 bfd_boolean is_relocation_target;
311
312 /* Are we referenced by branch relocations? */
313 bfd_boolean is_branch_target;
314
0f20cc35
DJ
315#define GOT_NORMAL 0
316#define GOT_TLS_GD 1
317#define GOT_TLS_LDM 2
318#define GOT_TLS_IE 4
319#define GOT_TLS_OFFSET_DONE 0x40
320#define GOT_TLS_DONE 0x80
321 unsigned char tls_type;
322 /* This is only used in single-GOT mode; in multi-GOT mode there
323 is one mips_got_entry per GOT entry, so the offset is stored
324 there. In single-GOT mode there may be many mips_got_entry
325 structures all referring to the same GOT slot. It might be
326 possible to use root.got.offset instead, but that field is
327 overloaded already. */
328 bfd_vma tls_got_offset;
b49e97c9
TS
329};
330
331/* MIPS ELF linker hash table. */
332
333struct mips_elf_link_hash_table
334{
335 struct elf_link_hash_table root;
336#if 0
337 /* We no longer use this. */
338 /* String section indices for the dynamic section symbols. */
339 bfd_size_type dynsym_sec_strindex[SIZEOF_MIPS_DYNSYM_SECNAMES];
340#endif
341 /* The number of .rtproc entries. */
342 bfd_size_type procedure_count;
343 /* The size of the .compact_rel section (if SGI_COMPAT). */
344 bfd_size_type compact_rel_size;
345 /* This flag indicates that the value of DT_MIPS_RLD_MAP dynamic
8dc1a139 346 entry is set to the address of __rld_obj_head as in IRIX5. */
b34976b6 347 bfd_boolean use_rld_obj_head;
b49e97c9
TS
348 /* This is the value of the __rld_map or __rld_obj_head symbol. */
349 bfd_vma rld_value;
350 /* This is set if we see any mips16 stub sections. */
b34976b6 351 bfd_boolean mips16_stubs_seen;
8275b357
RS
352 /* True if we've computed the size of the GOT. */
353 bfd_boolean computed_got_sizes;
0a44bf69
RS
354 /* True if we're generating code for VxWorks. */
355 bfd_boolean is_vxworks;
0e53d9da
AN
356 /* True if we already reported the small-data section overflow. */
357 bfd_boolean small_data_overflow_reported;
0a44bf69
RS
358 /* Shortcuts to some dynamic sections, or NULL if they are not
359 being used. */
360 asection *srelbss;
361 asection *sdynbss;
362 asection *srelplt;
363 asection *srelplt2;
364 asection *sgotplt;
365 asection *splt;
366 /* The size of the PLT header in bytes (VxWorks only). */
367 bfd_vma plt_header_size;
368 /* The size of a PLT entry in bytes (VxWorks only). */
369 bfd_vma plt_entry_size;
5108fc1b
RS
370 /* The size of a function stub entry in bytes. */
371 bfd_vma function_stub_size;
b49e97c9
TS
372};
373
0f20cc35
DJ
374#define TLS_RELOC_P(r_type) \
375 (r_type == R_MIPS_TLS_DTPMOD32 \
376 || r_type == R_MIPS_TLS_DTPMOD64 \
377 || r_type == R_MIPS_TLS_DTPREL32 \
378 || r_type == R_MIPS_TLS_DTPREL64 \
379 || r_type == R_MIPS_TLS_GD \
380 || r_type == R_MIPS_TLS_LDM \
381 || r_type == R_MIPS_TLS_DTPREL_HI16 \
382 || r_type == R_MIPS_TLS_DTPREL_LO16 \
383 || r_type == R_MIPS_TLS_GOTTPREL \
384 || r_type == R_MIPS_TLS_TPREL32 \
385 || r_type == R_MIPS_TLS_TPREL64 \
386 || r_type == R_MIPS_TLS_TPREL_HI16 \
387 || r_type == R_MIPS_TLS_TPREL_LO16)
388
b49e97c9
TS
389/* Structure used to pass information to mips_elf_output_extsym. */
390
391struct extsym_info
392{
9e4aeb93
RS
393 bfd *abfd;
394 struct bfd_link_info *info;
b49e97c9
TS
395 struct ecoff_debug_info *debug;
396 const struct ecoff_debug_swap *swap;
b34976b6 397 bfd_boolean failed;
b49e97c9
TS
398};
399
8dc1a139 400/* The names of the runtime procedure table symbols used on IRIX5. */
b49e97c9
TS
401
402static const char * const mips_elf_dynsym_rtproc_names[] =
403{
404 "_procedure_table",
405 "_procedure_string_table",
406 "_procedure_table_size",
407 NULL
408};
409
410/* These structures are used to generate the .compact_rel section on
8dc1a139 411 IRIX5. */
b49e97c9
TS
412
413typedef struct
414{
415 unsigned long id1; /* Always one? */
416 unsigned long num; /* Number of compact relocation entries. */
417 unsigned long id2; /* Always two? */
418 unsigned long offset; /* The file offset of the first relocation. */
419 unsigned long reserved0; /* Zero? */
420 unsigned long reserved1; /* Zero? */
421} Elf32_compact_rel;
422
423typedef struct
424{
425 bfd_byte id1[4];
426 bfd_byte num[4];
427 bfd_byte id2[4];
428 bfd_byte offset[4];
429 bfd_byte reserved0[4];
430 bfd_byte reserved1[4];
431} Elf32_External_compact_rel;
432
433typedef struct
434{
435 unsigned int ctype : 1; /* 1: long 0: short format. See below. */
436 unsigned int rtype : 4; /* Relocation types. See below. */
437 unsigned int dist2to : 8;
438 unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
439 unsigned long konst; /* KONST field. See below. */
440 unsigned long vaddr; /* VADDR to be relocated. */
441} Elf32_crinfo;
442
443typedef struct
444{
445 unsigned int ctype : 1; /* 1: long 0: short format. See below. */
446 unsigned int rtype : 4; /* Relocation types. See below. */
447 unsigned int dist2to : 8;
448 unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
449 unsigned long konst; /* KONST field. See below. */
450} Elf32_crinfo2;
451
452typedef struct
453{
454 bfd_byte info[4];
455 bfd_byte konst[4];
456 bfd_byte vaddr[4];
457} Elf32_External_crinfo;
458
459typedef struct
460{
461 bfd_byte info[4];
462 bfd_byte konst[4];
463} Elf32_External_crinfo2;
464
465/* These are the constants used to swap the bitfields in a crinfo. */
466
467#define CRINFO_CTYPE (0x1)
468#define CRINFO_CTYPE_SH (31)
469#define CRINFO_RTYPE (0xf)
470#define CRINFO_RTYPE_SH (27)
471#define CRINFO_DIST2TO (0xff)
472#define CRINFO_DIST2TO_SH (19)
473#define CRINFO_RELVADDR (0x7ffff)
474#define CRINFO_RELVADDR_SH (0)
475
476/* A compact relocation info has long (3 words) or short (2 words)
477 formats. A short format doesn't have VADDR field and relvaddr
478 fields contains ((VADDR - vaddr of the previous entry) >> 2). */
479#define CRF_MIPS_LONG 1
480#define CRF_MIPS_SHORT 0
481
482/* There are 4 types of compact relocation at least. The value KONST
483 has different meaning for each type:
484
485 (type) (konst)
486 CT_MIPS_REL32 Address in data
487 CT_MIPS_WORD Address in word (XXX)
488 CT_MIPS_GPHI_LO GP - vaddr
489 CT_MIPS_JMPAD Address to jump
490 */
491
492#define CRT_MIPS_REL32 0xa
493#define CRT_MIPS_WORD 0xb
494#define CRT_MIPS_GPHI_LO 0xc
495#define CRT_MIPS_JMPAD 0xd
496
497#define mips_elf_set_cr_format(x,format) ((x).ctype = (format))
498#define mips_elf_set_cr_type(x,type) ((x).rtype = (type))
499#define mips_elf_set_cr_dist2to(x,v) ((x).dist2to = (v))
500#define mips_elf_set_cr_relvaddr(x,d) ((x).relvaddr = (d)<<2)
501\f
502/* The structure of the runtime procedure descriptor created by the
503 loader for use by the static exception system. */
504
505typedef struct runtime_pdr {
ae9a127f
NC
506 bfd_vma adr; /* Memory address of start of procedure. */
507 long regmask; /* Save register mask. */
508 long regoffset; /* Save register offset. */
509 long fregmask; /* Save floating point register mask. */
510 long fregoffset; /* Save floating point register offset. */
511 long frameoffset; /* Frame size. */
512 short framereg; /* Frame pointer register. */
513 short pcreg; /* Offset or reg of return pc. */
514 long irpss; /* Index into the runtime string table. */
b49e97c9 515 long reserved;
ae9a127f 516 struct exception_info *exception_info;/* Pointer to exception array. */
b49e97c9
TS
517} RPDR, *pRPDR;
518#define cbRPDR sizeof (RPDR)
519#define rpdNil ((pRPDR) 0)
520\f
b15e6682 521static struct mips_got_entry *mips_elf_create_local_got_entry
0a44bf69 522 (bfd *, struct bfd_link_info *, bfd *, struct mips_got_info *, asection *,
5c18022e 523 bfd_vma, unsigned long, struct mips_elf_link_hash_entry *, int);
b34976b6 524static bfd_boolean mips_elf_sort_hash_table_f
9719ad41 525 (struct mips_elf_link_hash_entry *, void *);
9719ad41
RS
526static bfd_vma mips_elf_high
527 (bfd_vma);
b9d58d71 528static bfd_boolean mips16_stub_section_p
9719ad41 529 (bfd *, asection *);
b34976b6 530static bfd_boolean mips_elf_create_dynamic_relocation
9719ad41
RS
531 (bfd *, struct bfd_link_info *, const Elf_Internal_Rela *,
532 struct mips_elf_link_hash_entry *, asection *, bfd_vma,
533 bfd_vma *, asection *);
9719ad41
RS
534static hashval_t mips_elf_got_entry_hash
535 (const void *);
f4416af6 536static bfd_vma mips_elf_adjust_gp
9719ad41 537 (bfd *, struct mips_got_info *, bfd *);
f4416af6 538static struct mips_got_info *mips_elf_got_for_ibfd
9719ad41 539 (struct mips_got_info *, bfd *);
f4416af6 540
b49e97c9
TS
541/* This will be used when we sort the dynamic relocation records. */
542static bfd *reldyn_sorting_bfd;
543
544/* Nonzero if ABFD is using the N32 ABI. */
b49e97c9
TS
545#define ABI_N32_P(abfd) \
546 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
547
4a14403c 548/* Nonzero if ABFD is using the N64 ABI. */
b49e97c9 549#define ABI_64_P(abfd) \
141ff970 550 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
b49e97c9 551
4a14403c
TS
552/* Nonzero if ABFD is using NewABI conventions. */
553#define NEWABI_P(abfd) (ABI_N32_P (abfd) || ABI_64_P (abfd))
554
555/* The IRIX compatibility level we are striving for. */
b49e97c9
TS
556#define IRIX_COMPAT(abfd) \
557 (get_elf_backend_data (abfd)->elf_backend_mips_irix_compat (abfd))
558
b49e97c9
TS
559/* Whether we are trying to be compatible with IRIX at all. */
560#define SGI_COMPAT(abfd) \
561 (IRIX_COMPAT (abfd) != ict_none)
562
563/* The name of the options section. */
564#define MIPS_ELF_OPTIONS_SECTION_NAME(abfd) \
d80dcc6a 565 (NEWABI_P (abfd) ? ".MIPS.options" : ".options")
b49e97c9 566
cc2e31b9
RS
567/* True if NAME is the recognized name of any SHT_MIPS_OPTIONS section.
568 Some IRIX system files do not use MIPS_ELF_OPTIONS_SECTION_NAME. */
569#define MIPS_ELF_OPTIONS_SECTION_NAME_P(NAME) \
570 (strcmp (NAME, ".MIPS.options") == 0 || strcmp (NAME, ".options") == 0)
571
943284cc
DJ
572/* Whether the section is readonly. */
573#define MIPS_ELF_READONLY_SECTION(sec) \
574 ((sec->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)) \
575 == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
576
b49e97c9 577/* The name of the stub section. */
ca07892d 578#define MIPS_ELF_STUB_SECTION_NAME(abfd) ".MIPS.stubs"
b49e97c9
TS
579
580/* The size of an external REL relocation. */
581#define MIPS_ELF_REL_SIZE(abfd) \
582 (get_elf_backend_data (abfd)->s->sizeof_rel)
583
0a44bf69
RS
584/* The size of an external RELA relocation. */
585#define MIPS_ELF_RELA_SIZE(abfd) \
586 (get_elf_backend_data (abfd)->s->sizeof_rela)
587
b49e97c9
TS
588/* The size of an external dynamic table entry. */
589#define MIPS_ELF_DYN_SIZE(abfd) \
590 (get_elf_backend_data (abfd)->s->sizeof_dyn)
591
592/* The size of a GOT entry. */
593#define MIPS_ELF_GOT_SIZE(abfd) \
594 (get_elf_backend_data (abfd)->s->arch_size / 8)
595
596/* The size of a symbol-table entry. */
597#define MIPS_ELF_SYM_SIZE(abfd) \
598 (get_elf_backend_data (abfd)->s->sizeof_sym)
599
600/* The default alignment for sections, as a power of two. */
601#define MIPS_ELF_LOG_FILE_ALIGN(abfd) \
45d6a902 602 (get_elf_backend_data (abfd)->s->log_file_align)
b49e97c9
TS
603
604/* Get word-sized data. */
605#define MIPS_ELF_GET_WORD(abfd, ptr) \
606 (ABI_64_P (abfd) ? bfd_get_64 (abfd, ptr) : bfd_get_32 (abfd, ptr))
607
608/* Put out word-sized data. */
609#define MIPS_ELF_PUT_WORD(abfd, val, ptr) \
610 (ABI_64_P (abfd) \
611 ? bfd_put_64 (abfd, val, ptr) \
612 : bfd_put_32 (abfd, val, ptr))
613
614/* Add a dynamic symbol table-entry. */
9719ad41 615#define MIPS_ELF_ADD_DYNAMIC_ENTRY(info, tag, val) \
5a580b3a 616 _bfd_elf_add_dynamic_entry (info, tag, val)
b49e97c9
TS
617
618#define MIPS_ELF_RTYPE_TO_HOWTO(abfd, rtype, rela) \
619 (get_elf_backend_data (abfd)->elf_backend_mips_rtype_to_howto (rtype, rela))
620
4ffba85c
AO
621/* Determine whether the internal relocation of index REL_IDX is REL
622 (zero) or RELA (non-zero). The assumption is that, if there are
623 two relocation sections for this section, one of them is REL and
624 the other is RELA. If the index of the relocation we're testing is
625 in range for the first relocation section, check that the external
626 relocation size is that for RELA. It is also assumed that, if
627 rel_idx is not in range for the first section, and this first
628 section contains REL relocs, then the relocation is in the second
629 section, that is RELA. */
630#define MIPS_RELOC_RELA_P(abfd, sec, rel_idx) \
631 ((NUM_SHDR_ENTRIES (&elf_section_data (sec)->rel_hdr) \
632 * get_elf_backend_data (abfd)->s->int_rels_per_ext_rel \
633 > (bfd_vma)(rel_idx)) \
634 == (elf_section_data (sec)->rel_hdr.sh_entsize \
635 == (ABI_64_P (abfd) ? sizeof (Elf64_External_Rela) \
636 : sizeof (Elf32_External_Rela))))
637
0a44bf69
RS
638/* The name of the dynamic relocation section. */
639#define MIPS_ELF_REL_DYN_NAME(INFO) \
640 (mips_elf_hash_table (INFO)->is_vxworks ? ".rela.dyn" : ".rel.dyn")
641
b49e97c9
TS
642/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
643 from smaller values. Start with zero, widen, *then* decrement. */
644#define MINUS_ONE (((bfd_vma)0) - 1)
c5ae1840 645#define MINUS_TWO (((bfd_vma)0) - 2)
b49e97c9
TS
646
647/* The number of local .got entries we reserve. */
0a44bf69
RS
648#define MIPS_RESERVED_GOTNO(INFO) \
649 (mips_elf_hash_table (INFO)->is_vxworks ? 3 : 2)
b49e97c9 650
f4416af6 651/* The offset of $gp from the beginning of the .got section. */
0a44bf69
RS
652#define ELF_MIPS_GP_OFFSET(INFO) \
653 (mips_elf_hash_table (INFO)->is_vxworks ? 0x0 : 0x7ff0)
f4416af6
AO
654
655/* The maximum size of the GOT for it to be addressable using 16-bit
656 offsets from $gp. */
0a44bf69 657#define MIPS_ELF_GOT_MAX_SIZE(INFO) (ELF_MIPS_GP_OFFSET (INFO) + 0x7fff)
f4416af6 658
6a691779 659/* Instructions which appear in a stub. */
3d6746ca
DD
660#define STUB_LW(abfd) \
661 ((ABI_64_P (abfd) \
662 ? 0xdf998010 /* ld t9,0x8010(gp) */ \
663 : 0x8f998010)) /* lw t9,0x8010(gp) */
664#define STUB_MOVE(abfd) \
665 ((ABI_64_P (abfd) \
666 ? 0x03e0782d /* daddu t7,ra */ \
667 : 0x03e07821)) /* addu t7,ra */
668#define STUB_LUI(VAL) (0x3c180000 + (VAL)) /* lui t8,VAL */
669#define STUB_JALR 0x0320f809 /* jalr t9,ra */
5108fc1b
RS
670#define STUB_ORI(VAL) (0x37180000 + (VAL)) /* ori t8,t8,VAL */
671#define STUB_LI16U(VAL) (0x34180000 + (VAL)) /* ori t8,zero,VAL unsigned */
3d6746ca
DD
672#define STUB_LI16S(abfd, VAL) \
673 ((ABI_64_P (abfd) \
674 ? (0x64180000 + (VAL)) /* daddiu t8,zero,VAL sign extended */ \
675 : (0x24180000 + (VAL)))) /* addiu t8,zero,VAL sign extended */
676
5108fc1b
RS
677#define MIPS_FUNCTION_STUB_NORMAL_SIZE 16
678#define MIPS_FUNCTION_STUB_BIG_SIZE 20
b49e97c9
TS
679
680/* The name of the dynamic interpreter. This is put in the .interp
681 section. */
682
683#define ELF_DYNAMIC_INTERPRETER(abfd) \
684 (ABI_N32_P (abfd) ? "/usr/lib32/libc.so.1" \
685 : ABI_64_P (abfd) ? "/usr/lib64/libc.so.1" \
686 : "/usr/lib/libc.so.1")
687
688#ifdef BFD64
ee6423ed
AO
689#define MNAME(bfd,pre,pos) \
690 (ABI_64_P (bfd) ? CONCAT4 (pre,64,_,pos) : CONCAT4 (pre,32,_,pos))
b49e97c9
TS
691#define ELF_R_SYM(bfd, i) \
692 (ABI_64_P (bfd) ? ELF64_R_SYM (i) : ELF32_R_SYM (i))
693#define ELF_R_TYPE(bfd, i) \
694 (ABI_64_P (bfd) ? ELF64_MIPS_R_TYPE (i) : ELF32_R_TYPE (i))
695#define ELF_R_INFO(bfd, s, t) \
696 (ABI_64_P (bfd) ? ELF64_R_INFO (s, t) : ELF32_R_INFO (s, t))
697#else
ee6423ed 698#define MNAME(bfd,pre,pos) CONCAT4 (pre,32,_,pos)
b49e97c9
TS
699#define ELF_R_SYM(bfd, i) \
700 (ELF32_R_SYM (i))
701#define ELF_R_TYPE(bfd, i) \
702 (ELF32_R_TYPE (i))
703#define ELF_R_INFO(bfd, s, t) \
704 (ELF32_R_INFO (s, t))
705#endif
706\f
707 /* The mips16 compiler uses a couple of special sections to handle
708 floating point arguments.
709
710 Section names that look like .mips16.fn.FNNAME contain stubs that
711 copy floating point arguments from the fp regs to the gp regs and
712 then jump to FNNAME. If any 32 bit function calls FNNAME, the
713 call should be redirected to the stub instead. If no 32 bit
714 function calls FNNAME, the stub should be discarded. We need to
715 consider any reference to the function, not just a call, because
716 if the address of the function is taken we will need the stub,
717 since the address might be passed to a 32 bit function.
718
719 Section names that look like .mips16.call.FNNAME contain stubs
720 that copy floating point arguments from the gp regs to the fp
721 regs and then jump to FNNAME. If FNNAME is a 32 bit function,
722 then any 16 bit function that calls FNNAME should be redirected
723 to the stub instead. If FNNAME is not a 32 bit function, the
724 stub should be discarded.
725
726 .mips16.call.fp.FNNAME sections are similar, but contain stubs
727 which call FNNAME and then copy the return value from the fp regs
728 to the gp regs. These stubs store the return value in $18 while
729 calling FNNAME; any function which might call one of these stubs
730 must arrange to save $18 around the call. (This case is not
731 needed for 32 bit functions that call 16 bit functions, because
732 16 bit functions always return floating point values in both
733 $f0/$f1 and $2/$3.)
734
735 Note that in all cases FNNAME might be defined statically.
736 Therefore, FNNAME is not used literally. Instead, the relocation
737 information will indicate which symbol the section is for.
738
739 We record any stubs that we find in the symbol table. */
740
741#define FN_STUB ".mips16.fn."
742#define CALL_STUB ".mips16.call."
743#define CALL_FP_STUB ".mips16.call.fp."
b9d58d71
TS
744
745#define FN_STUB_P(name) CONST_STRNEQ (name, FN_STUB)
746#define CALL_STUB_P(name) CONST_STRNEQ (name, CALL_STUB)
747#define CALL_FP_STUB_P(name) CONST_STRNEQ (name, CALL_FP_STUB)
b49e97c9 748\f
0a44bf69
RS
749/* The format of the first PLT entry in a VxWorks executable. */
750static const bfd_vma mips_vxworks_exec_plt0_entry[] = {
751 0x3c190000, /* lui t9, %hi(_GLOBAL_OFFSET_TABLE_) */
752 0x27390000, /* addiu t9, t9, %lo(_GLOBAL_OFFSET_TABLE_) */
753 0x8f390008, /* lw t9, 8(t9) */
754 0x00000000, /* nop */
755 0x03200008, /* jr t9 */
756 0x00000000 /* nop */
757};
758
759/* The format of subsequent PLT entries. */
760static const bfd_vma mips_vxworks_exec_plt_entry[] = {
761 0x10000000, /* b .PLT_resolver */
762 0x24180000, /* li t8, <pltindex> */
763 0x3c190000, /* lui t9, %hi(<.got.plt slot>) */
764 0x27390000, /* addiu t9, t9, %lo(<.got.plt slot>) */
765 0x8f390000, /* lw t9, 0(t9) */
766 0x00000000, /* nop */
767 0x03200008, /* jr t9 */
768 0x00000000 /* nop */
769};
770
771/* The format of the first PLT entry in a VxWorks shared object. */
772static const bfd_vma mips_vxworks_shared_plt0_entry[] = {
773 0x8f990008, /* lw t9, 8(gp) */
774 0x00000000, /* nop */
775 0x03200008, /* jr t9 */
776 0x00000000, /* nop */
777 0x00000000, /* nop */
778 0x00000000 /* nop */
779};
780
781/* The format of subsequent PLT entries. */
782static const bfd_vma mips_vxworks_shared_plt_entry[] = {
783 0x10000000, /* b .PLT_resolver */
784 0x24180000 /* li t8, <pltindex> */
785};
786\f
b49e97c9
TS
787/* Look up an entry in a MIPS ELF linker hash table. */
788
789#define mips_elf_link_hash_lookup(table, string, create, copy, follow) \
790 ((struct mips_elf_link_hash_entry *) \
791 elf_link_hash_lookup (&(table)->root, (string), (create), \
792 (copy), (follow)))
793
794/* Traverse a MIPS ELF linker hash table. */
795
796#define mips_elf_link_hash_traverse(table, func, info) \
797 (elf_link_hash_traverse \
798 (&(table)->root, \
9719ad41 799 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
b49e97c9
TS
800 (info)))
801
802/* Get the MIPS ELF linker hash table from a link_info structure. */
803
804#define mips_elf_hash_table(p) \
805 ((struct mips_elf_link_hash_table *) ((p)->hash))
806
0f20cc35
DJ
807/* Find the base offsets for thread-local storage in this object,
808 for GD/LD and IE/LE respectively. */
809
810#define TP_OFFSET 0x7000
811#define DTP_OFFSET 0x8000
812
813static bfd_vma
814dtprel_base (struct bfd_link_info *info)
815{
816 /* If tls_sec is NULL, we should have signalled an error already. */
817 if (elf_hash_table (info)->tls_sec == NULL)
818 return 0;
819 return elf_hash_table (info)->tls_sec->vma + DTP_OFFSET;
820}
821
822static bfd_vma
823tprel_base (struct bfd_link_info *info)
824{
825 /* If tls_sec is NULL, we should have signalled an error already. */
826 if (elf_hash_table (info)->tls_sec == NULL)
827 return 0;
828 return elf_hash_table (info)->tls_sec->vma + TP_OFFSET;
829}
830
b49e97c9
TS
831/* Create an entry in a MIPS ELF linker hash table. */
832
833static struct bfd_hash_entry *
9719ad41
RS
834mips_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
835 struct bfd_hash_table *table, const char *string)
b49e97c9
TS
836{
837 struct mips_elf_link_hash_entry *ret =
838 (struct mips_elf_link_hash_entry *) entry;
839
840 /* Allocate the structure if it has not already been allocated by a
841 subclass. */
9719ad41
RS
842 if (ret == NULL)
843 ret = bfd_hash_allocate (table, sizeof (struct mips_elf_link_hash_entry));
844 if (ret == NULL)
b49e97c9
TS
845 return (struct bfd_hash_entry *) ret;
846
847 /* Call the allocation method of the superclass. */
848 ret = ((struct mips_elf_link_hash_entry *)
849 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
850 table, string));
9719ad41 851 if (ret != NULL)
b49e97c9
TS
852 {
853 /* Set local fields. */
854 memset (&ret->esym, 0, sizeof (EXTR));
855 /* We use -2 as a marker to indicate that the information has
856 not been set. -1 means there is no associated ifd. */
857 ret->esym.ifd = -2;
858 ret->possibly_dynamic_relocs = 0;
b34976b6 859 ret->readonly_reloc = FALSE;
b34976b6 860 ret->no_fn_stub = FALSE;
b49e97c9 861 ret->fn_stub = NULL;
b34976b6 862 ret->need_fn_stub = FALSE;
b49e97c9
TS
863 ret->call_stub = NULL;
864 ret->call_fp_stub = NULL;
b34976b6 865 ret->forced_local = FALSE;
0a44bf69
RS
866 ret->is_branch_target = FALSE;
867 ret->is_relocation_target = FALSE;
0f20cc35 868 ret->tls_type = GOT_NORMAL;
b49e97c9
TS
869 }
870
871 return (struct bfd_hash_entry *) ret;
872}
f0abc2a1
AM
873
874bfd_boolean
9719ad41 875_bfd_mips_elf_new_section_hook (bfd *abfd, asection *sec)
f0abc2a1 876{
f592407e
AM
877 if (!sec->used_by_bfd)
878 {
879 struct _mips_elf_section_data *sdata;
880 bfd_size_type amt = sizeof (*sdata);
f0abc2a1 881
f592407e
AM
882 sdata = bfd_zalloc (abfd, amt);
883 if (sdata == NULL)
884 return FALSE;
885 sec->used_by_bfd = sdata;
886 }
f0abc2a1
AM
887
888 return _bfd_elf_new_section_hook (abfd, sec);
889}
b49e97c9
TS
890\f
891/* Read ECOFF debugging information from a .mdebug section into a
892 ecoff_debug_info structure. */
893
b34976b6 894bfd_boolean
9719ad41
RS
895_bfd_mips_elf_read_ecoff_info (bfd *abfd, asection *section,
896 struct ecoff_debug_info *debug)
b49e97c9
TS
897{
898 HDRR *symhdr;
899 const struct ecoff_debug_swap *swap;
9719ad41 900 char *ext_hdr;
b49e97c9
TS
901
902 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
903 memset (debug, 0, sizeof (*debug));
904
9719ad41 905 ext_hdr = bfd_malloc (swap->external_hdr_size);
b49e97c9
TS
906 if (ext_hdr == NULL && swap->external_hdr_size != 0)
907 goto error_return;
908
9719ad41 909 if (! bfd_get_section_contents (abfd, section, ext_hdr, 0,
82e51918 910 swap->external_hdr_size))
b49e97c9
TS
911 goto error_return;
912
913 symhdr = &debug->symbolic_header;
914 (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
915
916 /* The symbolic header contains absolute file offsets and sizes to
917 read. */
918#define READ(ptr, offset, count, size, type) \
919 if (symhdr->count == 0) \
920 debug->ptr = NULL; \
921 else \
922 { \
923 bfd_size_type amt = (bfd_size_type) size * symhdr->count; \
9719ad41 924 debug->ptr = bfd_malloc (amt); \
b49e97c9
TS
925 if (debug->ptr == NULL) \
926 goto error_return; \
9719ad41 927 if (bfd_seek (abfd, symhdr->offset, SEEK_SET) != 0 \
b49e97c9
TS
928 || bfd_bread (debug->ptr, amt, abfd) != amt) \
929 goto error_return; \
930 }
931
932 READ (line, cbLineOffset, cbLine, sizeof (unsigned char), unsigned char *);
9719ad41
RS
933 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, void *);
934 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, void *);
935 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, void *);
936 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, void *);
b49e97c9
TS
937 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
938 union aux_ext *);
939 READ (ss, cbSsOffset, issMax, sizeof (char), char *);
940 READ (ssext, cbSsExtOffset, issExtMax, sizeof (char), char *);
9719ad41
RS
941 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, void *);
942 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, void *);
943 READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size, void *);
b49e97c9
TS
944#undef READ
945
946 debug->fdr = NULL;
b49e97c9 947
b34976b6 948 return TRUE;
b49e97c9
TS
949
950 error_return:
951 if (ext_hdr != NULL)
952 free (ext_hdr);
953 if (debug->line != NULL)
954 free (debug->line);
955 if (debug->external_dnr != NULL)
956 free (debug->external_dnr);
957 if (debug->external_pdr != NULL)
958 free (debug->external_pdr);
959 if (debug->external_sym != NULL)
960 free (debug->external_sym);
961 if (debug->external_opt != NULL)
962 free (debug->external_opt);
963 if (debug->external_aux != NULL)
964 free (debug->external_aux);
965 if (debug->ss != NULL)
966 free (debug->ss);
967 if (debug->ssext != NULL)
968 free (debug->ssext);
969 if (debug->external_fdr != NULL)
970 free (debug->external_fdr);
971 if (debug->external_rfd != NULL)
972 free (debug->external_rfd);
973 if (debug->external_ext != NULL)
974 free (debug->external_ext);
b34976b6 975 return FALSE;
b49e97c9
TS
976}
977\f
978/* Swap RPDR (runtime procedure table entry) for output. */
979
980static void
9719ad41 981ecoff_swap_rpdr_out (bfd *abfd, const RPDR *in, struct rpdr_ext *ex)
b49e97c9
TS
982{
983 H_PUT_S32 (abfd, in->adr, ex->p_adr);
984 H_PUT_32 (abfd, in->regmask, ex->p_regmask);
985 H_PUT_32 (abfd, in->regoffset, ex->p_regoffset);
986 H_PUT_32 (abfd, in->fregmask, ex->p_fregmask);
987 H_PUT_32 (abfd, in->fregoffset, ex->p_fregoffset);
988 H_PUT_32 (abfd, in->frameoffset, ex->p_frameoffset);
989
990 H_PUT_16 (abfd, in->framereg, ex->p_framereg);
991 H_PUT_16 (abfd, in->pcreg, ex->p_pcreg);
992
993 H_PUT_32 (abfd, in->irpss, ex->p_irpss);
b49e97c9
TS
994}
995
996/* Create a runtime procedure table from the .mdebug section. */
997
b34976b6 998static bfd_boolean
9719ad41
RS
999mips_elf_create_procedure_table (void *handle, bfd *abfd,
1000 struct bfd_link_info *info, asection *s,
1001 struct ecoff_debug_info *debug)
b49e97c9
TS
1002{
1003 const struct ecoff_debug_swap *swap;
1004 HDRR *hdr = &debug->symbolic_header;
1005 RPDR *rpdr, *rp;
1006 struct rpdr_ext *erp;
9719ad41 1007 void *rtproc;
b49e97c9
TS
1008 struct pdr_ext *epdr;
1009 struct sym_ext *esym;
1010 char *ss, **sv;
1011 char *str;
1012 bfd_size_type size;
1013 bfd_size_type count;
1014 unsigned long sindex;
1015 unsigned long i;
1016 PDR pdr;
1017 SYMR sym;
1018 const char *no_name_func = _("static procedure (no name)");
1019
1020 epdr = NULL;
1021 rpdr = NULL;
1022 esym = NULL;
1023 ss = NULL;
1024 sv = NULL;
1025
1026 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1027
1028 sindex = strlen (no_name_func) + 1;
1029 count = hdr->ipdMax;
1030 if (count > 0)
1031 {
1032 size = swap->external_pdr_size;
1033
9719ad41 1034 epdr = bfd_malloc (size * count);
b49e97c9
TS
1035 if (epdr == NULL)
1036 goto error_return;
1037
9719ad41 1038 if (! _bfd_ecoff_get_accumulated_pdr (handle, (bfd_byte *) epdr))
b49e97c9
TS
1039 goto error_return;
1040
1041 size = sizeof (RPDR);
9719ad41 1042 rp = rpdr = bfd_malloc (size * count);
b49e97c9
TS
1043 if (rpdr == NULL)
1044 goto error_return;
1045
1046 size = sizeof (char *);
9719ad41 1047 sv = bfd_malloc (size * count);
b49e97c9
TS
1048 if (sv == NULL)
1049 goto error_return;
1050
1051 count = hdr->isymMax;
1052 size = swap->external_sym_size;
9719ad41 1053 esym = bfd_malloc (size * count);
b49e97c9
TS
1054 if (esym == NULL)
1055 goto error_return;
1056
9719ad41 1057 if (! _bfd_ecoff_get_accumulated_sym (handle, (bfd_byte *) esym))
b49e97c9
TS
1058 goto error_return;
1059
1060 count = hdr->issMax;
9719ad41 1061 ss = bfd_malloc (count);
b49e97c9
TS
1062 if (ss == NULL)
1063 goto error_return;
f075ee0c 1064 if (! _bfd_ecoff_get_accumulated_ss (handle, (bfd_byte *) ss))
b49e97c9
TS
1065 goto error_return;
1066
1067 count = hdr->ipdMax;
1068 for (i = 0; i < (unsigned long) count; i++, rp++)
1069 {
9719ad41
RS
1070 (*swap->swap_pdr_in) (abfd, epdr + i, &pdr);
1071 (*swap->swap_sym_in) (abfd, &esym[pdr.isym], &sym);
b49e97c9
TS
1072 rp->adr = sym.value;
1073 rp->regmask = pdr.regmask;
1074 rp->regoffset = pdr.regoffset;
1075 rp->fregmask = pdr.fregmask;
1076 rp->fregoffset = pdr.fregoffset;
1077 rp->frameoffset = pdr.frameoffset;
1078 rp->framereg = pdr.framereg;
1079 rp->pcreg = pdr.pcreg;
1080 rp->irpss = sindex;
1081 sv[i] = ss + sym.iss;
1082 sindex += strlen (sv[i]) + 1;
1083 }
1084 }
1085
1086 size = sizeof (struct rpdr_ext) * (count + 2) + sindex;
1087 size = BFD_ALIGN (size, 16);
9719ad41 1088 rtproc = bfd_alloc (abfd, size);
b49e97c9
TS
1089 if (rtproc == NULL)
1090 {
1091 mips_elf_hash_table (info)->procedure_count = 0;
1092 goto error_return;
1093 }
1094
1095 mips_elf_hash_table (info)->procedure_count = count + 2;
1096
9719ad41 1097 erp = rtproc;
b49e97c9
TS
1098 memset (erp, 0, sizeof (struct rpdr_ext));
1099 erp++;
1100 str = (char *) rtproc + sizeof (struct rpdr_ext) * (count + 2);
1101 strcpy (str, no_name_func);
1102 str += strlen (no_name_func) + 1;
1103 for (i = 0; i < count; i++)
1104 {
1105 ecoff_swap_rpdr_out (abfd, rpdr + i, erp + i);
1106 strcpy (str, sv[i]);
1107 str += strlen (sv[i]) + 1;
1108 }
1109 H_PUT_S32 (abfd, -1, (erp + count)->p_adr);
1110
1111 /* Set the size and contents of .rtproc section. */
eea6121a 1112 s->size = size;
9719ad41 1113 s->contents = rtproc;
b49e97c9
TS
1114
1115 /* Skip this section later on (I don't think this currently
1116 matters, but someday it might). */
8423293d 1117 s->map_head.link_order = NULL;
b49e97c9
TS
1118
1119 if (epdr != NULL)
1120 free (epdr);
1121 if (rpdr != NULL)
1122 free (rpdr);
1123 if (esym != NULL)
1124 free (esym);
1125 if (ss != NULL)
1126 free (ss);
1127 if (sv != NULL)
1128 free (sv);
1129
b34976b6 1130 return TRUE;
b49e97c9
TS
1131
1132 error_return:
1133 if (epdr != NULL)
1134 free (epdr);
1135 if (rpdr != NULL)
1136 free (rpdr);
1137 if (esym != NULL)
1138 free (esym);
1139 if (ss != NULL)
1140 free (ss);
1141 if (sv != NULL)
1142 free (sv);
b34976b6 1143 return FALSE;
b49e97c9
TS
1144}
1145
1146/* Check the mips16 stubs for a particular symbol, and see if we can
1147 discard them. */
1148
b34976b6 1149static bfd_boolean
9719ad41
RS
1150mips_elf_check_mips16_stubs (struct mips_elf_link_hash_entry *h,
1151 void *data ATTRIBUTE_UNUSED)
b49e97c9
TS
1152{
1153 if (h->root.root.type == bfd_link_hash_warning)
1154 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
1155
1156 if (h->fn_stub != NULL
1157 && ! h->need_fn_stub)
1158 {
1159 /* We don't need the fn_stub; the only references to this symbol
1160 are 16 bit calls. Clobber the size to 0 to prevent it from
1161 being included in the link. */
eea6121a 1162 h->fn_stub->size = 0;
b49e97c9
TS
1163 h->fn_stub->flags &= ~SEC_RELOC;
1164 h->fn_stub->reloc_count = 0;
1165 h->fn_stub->flags |= SEC_EXCLUDE;
1166 }
1167
1168 if (h->call_stub != NULL
1169 && h->root.other == STO_MIPS16)
1170 {
1171 /* We don't need the call_stub; this is a 16 bit function, so
1172 calls from other 16 bit functions are OK. Clobber the size
1173 to 0 to prevent it from being included in the link. */
eea6121a 1174 h->call_stub->size = 0;
b49e97c9
TS
1175 h->call_stub->flags &= ~SEC_RELOC;
1176 h->call_stub->reloc_count = 0;
1177 h->call_stub->flags |= SEC_EXCLUDE;
1178 }
1179
1180 if (h->call_fp_stub != NULL
1181 && h->root.other == STO_MIPS16)
1182 {
1183 /* We don't need the call_stub; this is a 16 bit function, so
1184 calls from other 16 bit functions are OK. Clobber the size
1185 to 0 to prevent it from being included in the link. */
eea6121a 1186 h->call_fp_stub->size = 0;
b49e97c9
TS
1187 h->call_fp_stub->flags &= ~SEC_RELOC;
1188 h->call_fp_stub->reloc_count = 0;
1189 h->call_fp_stub->flags |= SEC_EXCLUDE;
1190 }
1191
b34976b6 1192 return TRUE;
b49e97c9
TS
1193}
1194\f
d6f16593
MR
1195/* R_MIPS16_26 is used for the mips16 jal and jalx instructions.
1196 Most mips16 instructions are 16 bits, but these instructions
1197 are 32 bits.
1198
1199 The format of these instructions is:
1200
1201 +--------------+--------------------------------+
1202 | JALX | X| Imm 20:16 | Imm 25:21 |
1203 +--------------+--------------------------------+
1204 | Immediate 15:0 |
1205 +-----------------------------------------------+
1206
1207 JALX is the 5-bit value 00011. X is 0 for jal, 1 for jalx.
1208 Note that the immediate value in the first word is swapped.
1209
1210 When producing a relocatable object file, R_MIPS16_26 is
1211 handled mostly like R_MIPS_26. In particular, the addend is
1212 stored as a straight 26-bit value in a 32-bit instruction.
1213 (gas makes life simpler for itself by never adjusting a
1214 R_MIPS16_26 reloc to be against a section, so the addend is
1215 always zero). However, the 32 bit instruction is stored as 2
1216 16-bit values, rather than a single 32-bit value. In a
1217 big-endian file, the result is the same; in a little-endian
1218 file, the two 16-bit halves of the 32 bit value are swapped.
1219 This is so that a disassembler can recognize the jal
1220 instruction.
1221
1222 When doing a final link, R_MIPS16_26 is treated as a 32 bit
1223 instruction stored as two 16-bit values. The addend A is the
1224 contents of the targ26 field. The calculation is the same as
1225 R_MIPS_26. When storing the calculated value, reorder the
1226 immediate value as shown above, and don't forget to store the
1227 value as two 16-bit values.
1228
1229 To put it in MIPS ABI terms, the relocation field is T-targ26-16,
1230 defined as
1231
1232 big-endian:
1233 +--------+----------------------+
1234 | | |
1235 | | targ26-16 |
1236 |31 26|25 0|
1237 +--------+----------------------+
1238
1239 little-endian:
1240 +----------+------+-------------+
1241 | | | |
1242 | sub1 | | sub2 |
1243 |0 9|10 15|16 31|
1244 +----------+--------------------+
1245 where targ26-16 is sub1 followed by sub2 (i.e., the addend field A is
1246 ((sub1 << 16) | sub2)).
1247
1248 When producing a relocatable object file, the calculation is
1249 (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
1250 When producing a fully linked file, the calculation is
1251 let R = (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
1252 ((R & 0x1f0000) << 5) | ((R & 0x3e00000) >> 5) | (R & 0xffff)
1253
1254 R_MIPS16_GPREL is used for GP-relative addressing in mips16
1255 mode. A typical instruction will have a format like this:
1256
1257 +--------------+--------------------------------+
1258 | EXTEND | Imm 10:5 | Imm 15:11 |
1259 +--------------+--------------------------------+
1260 | Major | rx | ry | Imm 4:0 |
1261 +--------------+--------------------------------+
1262
1263 EXTEND is the five bit value 11110. Major is the instruction
1264 opcode.
1265
1266 This is handled exactly like R_MIPS_GPREL16, except that the
1267 addend is retrieved and stored as shown in this diagram; that
1268 is, the Imm fields above replace the V-rel16 field.
1269
1270 All we need to do here is shuffle the bits appropriately. As
1271 above, the two 16-bit halves must be swapped on a
1272 little-endian system.
1273
1274 R_MIPS16_HI16 and R_MIPS16_LO16 are used in mips16 mode to
1275 access data when neither GP-relative nor PC-relative addressing
1276 can be used. They are handled like R_MIPS_HI16 and R_MIPS_LO16,
1277 except that the addend is retrieved and stored as shown above
1278 for R_MIPS16_GPREL.
1279 */
1280void
1281_bfd_mips16_elf_reloc_unshuffle (bfd *abfd, int r_type,
1282 bfd_boolean jal_shuffle, bfd_byte *data)
1283{
1284 bfd_vma extend, insn, val;
1285
1286 if (r_type != R_MIPS16_26 && r_type != R_MIPS16_GPREL
1287 && r_type != R_MIPS16_HI16 && r_type != R_MIPS16_LO16)
1288 return;
1289
1290 /* Pick up the mips16 extend instruction and the real instruction. */
1291 extend = bfd_get_16 (abfd, data);
1292 insn = bfd_get_16 (abfd, data + 2);
1293 if (r_type == R_MIPS16_26)
1294 {
1295 if (jal_shuffle)
1296 val = ((extend & 0xfc00) << 16) | ((extend & 0x3e0) << 11)
1297 | ((extend & 0x1f) << 21) | insn;
1298 else
1299 val = extend << 16 | insn;
1300 }
1301 else
1302 val = ((extend & 0xf800) << 16) | ((insn & 0xffe0) << 11)
1303 | ((extend & 0x1f) << 11) | (extend & 0x7e0) | (insn & 0x1f);
1304 bfd_put_32 (abfd, val, data);
1305}
1306
1307void
1308_bfd_mips16_elf_reloc_shuffle (bfd *abfd, int r_type,
1309 bfd_boolean jal_shuffle, bfd_byte *data)
1310{
1311 bfd_vma extend, insn, val;
1312
1313 if (r_type != R_MIPS16_26 && r_type != R_MIPS16_GPREL
1314 && r_type != R_MIPS16_HI16 && r_type != R_MIPS16_LO16)
1315 return;
1316
1317 val = bfd_get_32 (abfd, data);
1318 if (r_type == R_MIPS16_26)
1319 {
1320 if (jal_shuffle)
1321 {
1322 insn = val & 0xffff;
1323 extend = ((val >> 16) & 0xfc00) | ((val >> 11) & 0x3e0)
1324 | ((val >> 21) & 0x1f);
1325 }
1326 else
1327 {
1328 insn = val & 0xffff;
1329 extend = val >> 16;
1330 }
1331 }
1332 else
1333 {
1334 insn = ((val >> 11) & 0xffe0) | (val & 0x1f);
1335 extend = ((val >> 16) & 0xf800) | ((val >> 11) & 0x1f) | (val & 0x7e0);
1336 }
1337 bfd_put_16 (abfd, insn, data + 2);
1338 bfd_put_16 (abfd, extend, data);
1339}
1340
b49e97c9 1341bfd_reloc_status_type
9719ad41
RS
1342_bfd_mips_elf_gprel16_with_gp (bfd *abfd, asymbol *symbol,
1343 arelent *reloc_entry, asection *input_section,
1344 bfd_boolean relocatable, void *data, bfd_vma gp)
b49e97c9
TS
1345{
1346 bfd_vma relocation;
a7ebbfdf 1347 bfd_signed_vma val;
30ac9238 1348 bfd_reloc_status_type status;
b49e97c9
TS
1349
1350 if (bfd_is_com_section (symbol->section))
1351 relocation = 0;
1352 else
1353 relocation = symbol->value;
1354
1355 relocation += symbol->section->output_section->vma;
1356 relocation += symbol->section->output_offset;
1357
07515404 1358 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
b49e97c9
TS
1359 return bfd_reloc_outofrange;
1360
b49e97c9 1361 /* Set val to the offset into the section or symbol. */
a7ebbfdf
TS
1362 val = reloc_entry->addend;
1363
30ac9238 1364 _bfd_mips_elf_sign_extend (val, 16);
a7ebbfdf 1365
b49e97c9 1366 /* Adjust val for the final section location and GP value. If we
1049f94e 1367 are producing relocatable output, we don't want to do this for
b49e97c9 1368 an external symbol. */
1049f94e 1369 if (! relocatable
b49e97c9
TS
1370 || (symbol->flags & BSF_SECTION_SYM) != 0)
1371 val += relocation - gp;
1372
a7ebbfdf
TS
1373 if (reloc_entry->howto->partial_inplace)
1374 {
30ac9238
RS
1375 status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
1376 (bfd_byte *) data
1377 + reloc_entry->address);
1378 if (status != bfd_reloc_ok)
1379 return status;
a7ebbfdf
TS
1380 }
1381 else
1382 reloc_entry->addend = val;
b49e97c9 1383
1049f94e 1384 if (relocatable)
b49e97c9 1385 reloc_entry->address += input_section->output_offset;
30ac9238
RS
1386
1387 return bfd_reloc_ok;
1388}
1389
1390/* Used to store a REL high-part relocation such as R_MIPS_HI16 or
1391 R_MIPS_GOT16. REL is the relocation, INPUT_SECTION is the section
1392 that contains the relocation field and DATA points to the start of
1393 INPUT_SECTION. */
1394
1395struct mips_hi16
1396{
1397 struct mips_hi16 *next;
1398 bfd_byte *data;
1399 asection *input_section;
1400 arelent rel;
1401};
1402
1403/* FIXME: This should not be a static variable. */
1404
1405static struct mips_hi16 *mips_hi16_list;
1406
1407/* A howto special_function for REL *HI16 relocations. We can only
1408 calculate the correct value once we've seen the partnering
1409 *LO16 relocation, so just save the information for later.
1410
1411 The ABI requires that the *LO16 immediately follow the *HI16.
1412 However, as a GNU extension, we permit an arbitrary number of
1413 *HI16s to be associated with a single *LO16. This significantly
1414 simplies the relocation handling in gcc. */
1415
1416bfd_reloc_status_type
1417_bfd_mips_elf_hi16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
1418 asymbol *symbol ATTRIBUTE_UNUSED, void *data,
1419 asection *input_section, bfd *output_bfd,
1420 char **error_message ATTRIBUTE_UNUSED)
1421{
1422 struct mips_hi16 *n;
1423
07515404 1424 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
30ac9238
RS
1425 return bfd_reloc_outofrange;
1426
1427 n = bfd_malloc (sizeof *n);
1428 if (n == NULL)
1429 return bfd_reloc_outofrange;
1430
1431 n->next = mips_hi16_list;
1432 n->data = data;
1433 n->input_section = input_section;
1434 n->rel = *reloc_entry;
1435 mips_hi16_list = n;
1436
1437 if (output_bfd != NULL)
1438 reloc_entry->address += input_section->output_offset;
1439
1440 return bfd_reloc_ok;
1441}
1442
1443/* A howto special_function for REL R_MIPS_GOT16 relocations. This is just
1444 like any other 16-bit relocation when applied to global symbols, but is
1445 treated in the same as R_MIPS_HI16 when applied to local symbols. */
1446
1447bfd_reloc_status_type
1448_bfd_mips_elf_got16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1449 void *data, asection *input_section,
1450 bfd *output_bfd, char **error_message)
1451{
1452 if ((symbol->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1453 || bfd_is_und_section (bfd_get_section (symbol))
1454 || bfd_is_com_section (bfd_get_section (symbol)))
1455 /* The relocation is against a global symbol. */
1456 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1457 input_section, output_bfd,
1458 error_message);
1459
1460 return _bfd_mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
1461 input_section, output_bfd, error_message);
1462}
1463
1464/* A howto special_function for REL *LO16 relocations. The *LO16 itself
1465 is a straightforward 16 bit inplace relocation, but we must deal with
1466 any partnering high-part relocations as well. */
1467
1468bfd_reloc_status_type
1469_bfd_mips_elf_lo16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1470 void *data, asection *input_section,
1471 bfd *output_bfd, char **error_message)
1472{
1473 bfd_vma vallo;
d6f16593 1474 bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
30ac9238 1475
07515404 1476 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
30ac9238
RS
1477 return bfd_reloc_outofrange;
1478
d6f16593
MR
1479 _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
1480 location);
1481 vallo = bfd_get_32 (abfd, location);
1482 _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, FALSE,
1483 location);
1484
30ac9238
RS
1485 while (mips_hi16_list != NULL)
1486 {
1487 bfd_reloc_status_type ret;
1488 struct mips_hi16 *hi;
1489
1490 hi = mips_hi16_list;
1491
1492 /* R_MIPS_GOT16 relocations are something of a special case. We
1493 want to install the addend in the same way as for a R_MIPS_HI16
1494 relocation (with a rightshift of 16). However, since GOT16
1495 relocations can also be used with global symbols, their howto
1496 has a rightshift of 0. */
1497 if (hi->rel.howto->type == R_MIPS_GOT16)
1498 hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MIPS_HI16, FALSE);
1499
1500 /* VALLO is a signed 16-bit number. Bias it by 0x8000 so that any
1501 carry or borrow will induce a change of +1 or -1 in the high part. */
1502 hi->rel.addend += (vallo + 0x8000) & 0xffff;
1503
30ac9238
RS
1504 ret = _bfd_mips_elf_generic_reloc (abfd, &hi->rel, symbol, hi->data,
1505 hi->input_section, output_bfd,
1506 error_message);
1507 if (ret != bfd_reloc_ok)
1508 return ret;
1509
1510 mips_hi16_list = hi->next;
1511 free (hi);
1512 }
1513
1514 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1515 input_section, output_bfd,
1516 error_message);
1517}
1518
1519/* A generic howto special_function. This calculates and installs the
1520 relocation itself, thus avoiding the oft-discussed problems in
1521 bfd_perform_relocation and bfd_install_relocation. */
1522
1523bfd_reloc_status_type
1524_bfd_mips_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
1525 asymbol *symbol, void *data ATTRIBUTE_UNUSED,
1526 asection *input_section, bfd *output_bfd,
1527 char **error_message ATTRIBUTE_UNUSED)
1528{
1529 bfd_signed_vma val;
1530 bfd_reloc_status_type status;
1531 bfd_boolean relocatable;
1532
1533 relocatable = (output_bfd != NULL);
1534
07515404 1535 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
30ac9238
RS
1536 return bfd_reloc_outofrange;
1537
1538 /* Build up the field adjustment in VAL. */
1539 val = 0;
1540 if (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0)
1541 {
1542 /* Either we're calculating the final field value or we have a
1543 relocation against a section symbol. Add in the section's
1544 offset or address. */
1545 val += symbol->section->output_section->vma;
1546 val += symbol->section->output_offset;
1547 }
1548
1549 if (!relocatable)
1550 {
1551 /* We're calculating the final field value. Add in the symbol's value
1552 and, if pc-relative, subtract the address of the field itself. */
1553 val += symbol->value;
1554 if (reloc_entry->howto->pc_relative)
1555 {
1556 val -= input_section->output_section->vma;
1557 val -= input_section->output_offset;
1558 val -= reloc_entry->address;
1559 }
1560 }
1561
1562 /* VAL is now the final adjustment. If we're keeping this relocation
1563 in the output file, and if the relocation uses a separate addend,
1564 we just need to add VAL to that addend. Otherwise we need to add
1565 VAL to the relocation field itself. */
1566 if (relocatable && !reloc_entry->howto->partial_inplace)
1567 reloc_entry->addend += val;
1568 else
1569 {
d6f16593
MR
1570 bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
1571
30ac9238
RS
1572 /* Add in the separate addend, if any. */
1573 val += reloc_entry->addend;
1574
1575 /* Add VAL to the relocation field. */
d6f16593
MR
1576 _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
1577 location);
30ac9238 1578 status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
d6f16593
MR
1579 location);
1580 _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, FALSE,
1581 location);
1582
30ac9238
RS
1583 if (status != bfd_reloc_ok)
1584 return status;
1585 }
1586
1587 if (relocatable)
1588 reloc_entry->address += input_section->output_offset;
b49e97c9
TS
1589
1590 return bfd_reloc_ok;
1591}
1592\f
1593/* Swap an entry in a .gptab section. Note that these routines rely
1594 on the equivalence of the two elements of the union. */
1595
1596static void
9719ad41
RS
1597bfd_mips_elf32_swap_gptab_in (bfd *abfd, const Elf32_External_gptab *ex,
1598 Elf32_gptab *in)
b49e97c9
TS
1599{
1600 in->gt_entry.gt_g_value = H_GET_32 (abfd, ex->gt_entry.gt_g_value);
1601 in->gt_entry.gt_bytes = H_GET_32 (abfd, ex->gt_entry.gt_bytes);
1602}
1603
1604static void
9719ad41
RS
1605bfd_mips_elf32_swap_gptab_out (bfd *abfd, const Elf32_gptab *in,
1606 Elf32_External_gptab *ex)
b49e97c9
TS
1607{
1608 H_PUT_32 (abfd, in->gt_entry.gt_g_value, ex->gt_entry.gt_g_value);
1609 H_PUT_32 (abfd, in->gt_entry.gt_bytes, ex->gt_entry.gt_bytes);
1610}
1611
1612static void
9719ad41
RS
1613bfd_elf32_swap_compact_rel_out (bfd *abfd, const Elf32_compact_rel *in,
1614 Elf32_External_compact_rel *ex)
b49e97c9
TS
1615{
1616 H_PUT_32 (abfd, in->id1, ex->id1);
1617 H_PUT_32 (abfd, in->num, ex->num);
1618 H_PUT_32 (abfd, in->id2, ex->id2);
1619 H_PUT_32 (abfd, in->offset, ex->offset);
1620 H_PUT_32 (abfd, in->reserved0, ex->reserved0);
1621 H_PUT_32 (abfd, in->reserved1, ex->reserved1);
1622}
1623
1624static void
9719ad41
RS
1625bfd_elf32_swap_crinfo_out (bfd *abfd, const Elf32_crinfo *in,
1626 Elf32_External_crinfo *ex)
b49e97c9
TS
1627{
1628 unsigned long l;
1629
1630 l = (((in->ctype & CRINFO_CTYPE) << CRINFO_CTYPE_SH)
1631 | ((in->rtype & CRINFO_RTYPE) << CRINFO_RTYPE_SH)
1632 | ((in->dist2to & CRINFO_DIST2TO) << CRINFO_DIST2TO_SH)
1633 | ((in->relvaddr & CRINFO_RELVADDR) << CRINFO_RELVADDR_SH));
1634 H_PUT_32 (abfd, l, ex->info);
1635 H_PUT_32 (abfd, in->konst, ex->konst);
1636 H_PUT_32 (abfd, in->vaddr, ex->vaddr);
1637}
b49e97c9
TS
1638\f
1639/* A .reginfo section holds a single Elf32_RegInfo structure. These
1640 routines swap this structure in and out. They are used outside of
1641 BFD, so they are globally visible. */
1642
1643void
9719ad41
RS
1644bfd_mips_elf32_swap_reginfo_in (bfd *abfd, const Elf32_External_RegInfo *ex,
1645 Elf32_RegInfo *in)
b49e97c9
TS
1646{
1647 in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
1648 in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
1649 in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
1650 in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
1651 in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
1652 in->ri_gp_value = H_GET_32 (abfd, ex->ri_gp_value);
1653}
1654
1655void
9719ad41
RS
1656bfd_mips_elf32_swap_reginfo_out (bfd *abfd, const Elf32_RegInfo *in,
1657 Elf32_External_RegInfo *ex)
b49e97c9
TS
1658{
1659 H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
1660 H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
1661 H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
1662 H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
1663 H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
1664 H_PUT_32 (abfd, in->ri_gp_value, ex->ri_gp_value);
1665}
1666
1667/* In the 64 bit ABI, the .MIPS.options section holds register
1668 information in an Elf64_Reginfo structure. These routines swap
1669 them in and out. They are globally visible because they are used
1670 outside of BFD. These routines are here so that gas can call them
1671 without worrying about whether the 64 bit ABI has been included. */
1672
1673void
9719ad41
RS
1674bfd_mips_elf64_swap_reginfo_in (bfd *abfd, const Elf64_External_RegInfo *ex,
1675 Elf64_Internal_RegInfo *in)
b49e97c9
TS
1676{
1677 in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
1678 in->ri_pad = H_GET_32 (abfd, ex->ri_pad);
1679 in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
1680 in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
1681 in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
1682 in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
1683 in->ri_gp_value = H_GET_64 (abfd, ex->ri_gp_value);
1684}
1685
1686void
9719ad41
RS
1687bfd_mips_elf64_swap_reginfo_out (bfd *abfd, const Elf64_Internal_RegInfo *in,
1688 Elf64_External_RegInfo *ex)
b49e97c9
TS
1689{
1690 H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
1691 H_PUT_32 (abfd, in->ri_pad, ex->ri_pad);
1692 H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
1693 H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
1694 H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
1695 H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
1696 H_PUT_64 (abfd, in->ri_gp_value, ex->ri_gp_value);
1697}
1698
1699/* Swap in an options header. */
1700
1701void
9719ad41
RS
1702bfd_mips_elf_swap_options_in (bfd *abfd, const Elf_External_Options *ex,
1703 Elf_Internal_Options *in)
b49e97c9
TS
1704{
1705 in->kind = H_GET_8 (abfd, ex->kind);
1706 in->size = H_GET_8 (abfd, ex->size);
1707 in->section = H_GET_16 (abfd, ex->section);
1708 in->info = H_GET_32 (abfd, ex->info);
1709}
1710
1711/* Swap out an options header. */
1712
1713void
9719ad41
RS
1714bfd_mips_elf_swap_options_out (bfd *abfd, const Elf_Internal_Options *in,
1715 Elf_External_Options *ex)
b49e97c9
TS
1716{
1717 H_PUT_8 (abfd, in->kind, ex->kind);
1718 H_PUT_8 (abfd, in->size, ex->size);
1719 H_PUT_16 (abfd, in->section, ex->section);
1720 H_PUT_32 (abfd, in->info, ex->info);
1721}
1722\f
1723/* This function is called via qsort() to sort the dynamic relocation
1724 entries by increasing r_symndx value. */
1725
1726static int
9719ad41 1727sort_dynamic_relocs (const void *arg1, const void *arg2)
b49e97c9 1728{
947216bf
AM
1729 Elf_Internal_Rela int_reloc1;
1730 Elf_Internal_Rela int_reloc2;
6870500c 1731 int diff;
b49e97c9 1732
947216bf
AM
1733 bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg1, &int_reloc1);
1734 bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg2, &int_reloc2);
b49e97c9 1735
6870500c
RS
1736 diff = ELF32_R_SYM (int_reloc1.r_info) - ELF32_R_SYM (int_reloc2.r_info);
1737 if (diff != 0)
1738 return diff;
1739
1740 if (int_reloc1.r_offset < int_reloc2.r_offset)
1741 return -1;
1742 if (int_reloc1.r_offset > int_reloc2.r_offset)
1743 return 1;
1744 return 0;
b49e97c9
TS
1745}
1746
f4416af6
AO
1747/* Like sort_dynamic_relocs, but used for elf64 relocations. */
1748
1749static int
7e3102a7
AM
1750sort_dynamic_relocs_64 (const void *arg1 ATTRIBUTE_UNUSED,
1751 const void *arg2 ATTRIBUTE_UNUSED)
f4416af6 1752{
7e3102a7 1753#ifdef BFD64
f4416af6
AO
1754 Elf_Internal_Rela int_reloc1[3];
1755 Elf_Internal_Rela int_reloc2[3];
1756
1757 (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
1758 (reldyn_sorting_bfd, arg1, int_reloc1);
1759 (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
1760 (reldyn_sorting_bfd, arg2, int_reloc2);
1761
6870500c
RS
1762 if (ELF64_R_SYM (int_reloc1[0].r_info) < ELF64_R_SYM (int_reloc2[0].r_info))
1763 return -1;
1764 if (ELF64_R_SYM (int_reloc1[0].r_info) > ELF64_R_SYM (int_reloc2[0].r_info))
1765 return 1;
1766
1767 if (int_reloc1[0].r_offset < int_reloc2[0].r_offset)
1768 return -1;
1769 if (int_reloc1[0].r_offset > int_reloc2[0].r_offset)
1770 return 1;
1771 return 0;
7e3102a7
AM
1772#else
1773 abort ();
1774#endif
f4416af6
AO
1775}
1776
1777
b49e97c9
TS
1778/* This routine is used to write out ECOFF debugging external symbol
1779 information. It is called via mips_elf_link_hash_traverse. The
1780 ECOFF external symbol information must match the ELF external
1781 symbol information. Unfortunately, at this point we don't know
1782 whether a symbol is required by reloc information, so the two
1783 tables may wind up being different. We must sort out the external
1784 symbol information before we can set the final size of the .mdebug
1785 section, and we must set the size of the .mdebug section before we
1786 can relocate any sections, and we can't know which symbols are
1787 required by relocation until we relocate the sections.
1788 Fortunately, it is relatively unlikely that any symbol will be
1789 stripped but required by a reloc. In particular, it can not happen
1790 when generating a final executable. */
1791
b34976b6 1792static bfd_boolean
9719ad41 1793mips_elf_output_extsym (struct mips_elf_link_hash_entry *h, void *data)
b49e97c9 1794{
9719ad41 1795 struct extsym_info *einfo = data;
b34976b6 1796 bfd_boolean strip;
b49e97c9
TS
1797 asection *sec, *output_section;
1798
1799 if (h->root.root.type == bfd_link_hash_warning)
1800 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
1801
1802 if (h->root.indx == -2)
b34976b6 1803 strip = FALSE;
f5385ebf 1804 else if ((h->root.def_dynamic
77cfaee6
AM
1805 || h->root.ref_dynamic
1806 || h->root.type == bfd_link_hash_new)
f5385ebf
AM
1807 && !h->root.def_regular
1808 && !h->root.ref_regular)
b34976b6 1809 strip = TRUE;
b49e97c9
TS
1810 else if (einfo->info->strip == strip_all
1811 || (einfo->info->strip == strip_some
1812 && bfd_hash_lookup (einfo->info->keep_hash,
1813 h->root.root.root.string,
b34976b6
AM
1814 FALSE, FALSE) == NULL))
1815 strip = TRUE;
b49e97c9 1816 else
b34976b6 1817 strip = FALSE;
b49e97c9
TS
1818
1819 if (strip)
b34976b6 1820 return TRUE;
b49e97c9
TS
1821
1822 if (h->esym.ifd == -2)
1823 {
1824 h->esym.jmptbl = 0;
1825 h->esym.cobol_main = 0;
1826 h->esym.weakext = 0;
1827 h->esym.reserved = 0;
1828 h->esym.ifd = ifdNil;
1829 h->esym.asym.value = 0;
1830 h->esym.asym.st = stGlobal;
1831
1832 if (h->root.root.type == bfd_link_hash_undefined
1833 || h->root.root.type == bfd_link_hash_undefweak)
1834 {
1835 const char *name;
1836
1837 /* Use undefined class. Also, set class and type for some
1838 special symbols. */
1839 name = h->root.root.root.string;
1840 if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
1841 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
1842 {
1843 h->esym.asym.sc = scData;
1844 h->esym.asym.st = stLabel;
1845 h->esym.asym.value = 0;
1846 }
1847 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
1848 {
1849 h->esym.asym.sc = scAbs;
1850 h->esym.asym.st = stLabel;
1851 h->esym.asym.value =
1852 mips_elf_hash_table (einfo->info)->procedure_count;
1853 }
4a14403c 1854 else if (strcmp (name, "_gp_disp") == 0 && ! NEWABI_P (einfo->abfd))
b49e97c9
TS
1855 {
1856 h->esym.asym.sc = scAbs;
1857 h->esym.asym.st = stLabel;
1858 h->esym.asym.value = elf_gp (einfo->abfd);
1859 }
1860 else
1861 h->esym.asym.sc = scUndefined;
1862 }
1863 else if (h->root.root.type != bfd_link_hash_defined
1864 && h->root.root.type != bfd_link_hash_defweak)
1865 h->esym.asym.sc = scAbs;
1866 else
1867 {
1868 const char *name;
1869
1870 sec = h->root.root.u.def.section;
1871 output_section = sec->output_section;
1872
1873 /* When making a shared library and symbol h is the one from
1874 the another shared library, OUTPUT_SECTION may be null. */
1875 if (output_section == NULL)
1876 h->esym.asym.sc = scUndefined;
1877 else
1878 {
1879 name = bfd_section_name (output_section->owner, output_section);
1880
1881 if (strcmp (name, ".text") == 0)
1882 h->esym.asym.sc = scText;
1883 else if (strcmp (name, ".data") == 0)
1884 h->esym.asym.sc = scData;
1885 else if (strcmp (name, ".sdata") == 0)
1886 h->esym.asym.sc = scSData;
1887 else if (strcmp (name, ".rodata") == 0
1888 || strcmp (name, ".rdata") == 0)
1889 h->esym.asym.sc = scRData;
1890 else if (strcmp (name, ".bss") == 0)
1891 h->esym.asym.sc = scBss;
1892 else if (strcmp (name, ".sbss") == 0)
1893 h->esym.asym.sc = scSBss;
1894 else if (strcmp (name, ".init") == 0)
1895 h->esym.asym.sc = scInit;
1896 else if (strcmp (name, ".fini") == 0)
1897 h->esym.asym.sc = scFini;
1898 else
1899 h->esym.asym.sc = scAbs;
1900 }
1901 }
1902
1903 h->esym.asym.reserved = 0;
1904 h->esym.asym.index = indexNil;
1905 }
1906
1907 if (h->root.root.type == bfd_link_hash_common)
1908 h->esym.asym.value = h->root.root.u.c.size;
1909 else if (h->root.root.type == bfd_link_hash_defined
1910 || h->root.root.type == bfd_link_hash_defweak)
1911 {
1912 if (h->esym.asym.sc == scCommon)
1913 h->esym.asym.sc = scBss;
1914 else if (h->esym.asym.sc == scSCommon)
1915 h->esym.asym.sc = scSBss;
1916
1917 sec = h->root.root.u.def.section;
1918 output_section = sec->output_section;
1919 if (output_section != NULL)
1920 h->esym.asym.value = (h->root.root.u.def.value
1921 + sec->output_offset
1922 + output_section->vma);
1923 else
1924 h->esym.asym.value = 0;
1925 }
f5385ebf 1926 else if (h->root.needs_plt)
b49e97c9
TS
1927 {
1928 struct mips_elf_link_hash_entry *hd = h;
b34976b6 1929 bfd_boolean no_fn_stub = h->no_fn_stub;
b49e97c9
TS
1930
1931 while (hd->root.root.type == bfd_link_hash_indirect)
1932 {
1933 hd = (struct mips_elf_link_hash_entry *)h->root.root.u.i.link;
1934 no_fn_stub = no_fn_stub || hd->no_fn_stub;
1935 }
1936
1937 if (!no_fn_stub)
1938 {
1939 /* Set type and value for a symbol with a function stub. */
1940 h->esym.asym.st = stProc;
1941 sec = hd->root.root.u.def.section;
1942 if (sec == NULL)
1943 h->esym.asym.value = 0;
1944 else
1945 {
1946 output_section = sec->output_section;
1947 if (output_section != NULL)
1948 h->esym.asym.value = (hd->root.plt.offset
1949 + sec->output_offset
1950 + output_section->vma);
1951 else
1952 h->esym.asym.value = 0;
1953 }
b49e97c9
TS
1954 }
1955 }
1956
1957 if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
1958 h->root.root.root.string,
1959 &h->esym))
1960 {
b34976b6
AM
1961 einfo->failed = TRUE;
1962 return FALSE;
b49e97c9
TS
1963 }
1964
b34976b6 1965 return TRUE;
b49e97c9
TS
1966}
1967
1968/* A comparison routine used to sort .gptab entries. */
1969
1970static int
9719ad41 1971gptab_compare (const void *p1, const void *p2)
b49e97c9 1972{
9719ad41
RS
1973 const Elf32_gptab *a1 = p1;
1974 const Elf32_gptab *a2 = p2;
b49e97c9
TS
1975
1976 return a1->gt_entry.gt_g_value - a2->gt_entry.gt_g_value;
1977}
1978\f
b15e6682 1979/* Functions to manage the got entry hash table. */
f4416af6
AO
1980
1981/* Use all 64 bits of a bfd_vma for the computation of a 32-bit
1982 hash number. */
1983
1984static INLINE hashval_t
9719ad41 1985mips_elf_hash_bfd_vma (bfd_vma addr)
f4416af6
AO
1986{
1987#ifdef BFD64
1988 return addr + (addr >> 32);
1989#else
1990 return addr;
1991#endif
1992}
1993
1994/* got_entries only match if they're identical, except for gotidx, so
1995 use all fields to compute the hash, and compare the appropriate
1996 union members. */
1997
b15e6682 1998static hashval_t
9719ad41 1999mips_elf_got_entry_hash (const void *entry_)
b15e6682
AO
2000{
2001 const struct mips_got_entry *entry = (struct mips_got_entry *)entry_;
2002
38985a1c 2003 return entry->symndx
0f20cc35 2004 + ((entry->tls_type & GOT_TLS_LDM) << 17)
f4416af6 2005 + (! entry->abfd ? mips_elf_hash_bfd_vma (entry->d.address)
38985a1c
AO
2006 : entry->abfd->id
2007 + (entry->symndx >= 0 ? mips_elf_hash_bfd_vma (entry->d.addend)
2008 : entry->d.h->root.root.root.hash));
b15e6682
AO
2009}
2010
2011static int
9719ad41 2012mips_elf_got_entry_eq (const void *entry1, const void *entry2)
b15e6682
AO
2013{
2014 const struct mips_got_entry *e1 = (struct mips_got_entry *)entry1;
2015 const struct mips_got_entry *e2 = (struct mips_got_entry *)entry2;
2016
0f20cc35
DJ
2017 /* An LDM entry can only match another LDM entry. */
2018 if ((e1->tls_type ^ e2->tls_type) & GOT_TLS_LDM)
2019 return 0;
2020
b15e6682 2021 return e1->abfd == e2->abfd && e1->symndx == e2->symndx
f4416af6
AO
2022 && (! e1->abfd ? e1->d.address == e2->d.address
2023 : e1->symndx >= 0 ? e1->d.addend == e2->d.addend
2024 : e1->d.h == e2->d.h);
2025}
2026
2027/* multi_got_entries are still a match in the case of global objects,
2028 even if the input bfd in which they're referenced differs, so the
2029 hash computation and compare functions are adjusted
2030 accordingly. */
2031
2032static hashval_t
9719ad41 2033mips_elf_multi_got_entry_hash (const void *entry_)
f4416af6
AO
2034{
2035 const struct mips_got_entry *entry = (struct mips_got_entry *)entry_;
2036
2037 return entry->symndx
2038 + (! entry->abfd
2039 ? mips_elf_hash_bfd_vma (entry->d.address)
2040 : entry->symndx >= 0
0f20cc35
DJ
2041 ? ((entry->tls_type & GOT_TLS_LDM)
2042 ? (GOT_TLS_LDM << 17)
2043 : (entry->abfd->id
2044 + mips_elf_hash_bfd_vma (entry->d.addend)))
f4416af6
AO
2045 : entry->d.h->root.root.root.hash);
2046}
2047
2048static int
9719ad41 2049mips_elf_multi_got_entry_eq (const void *entry1, const void *entry2)
f4416af6
AO
2050{
2051 const struct mips_got_entry *e1 = (struct mips_got_entry *)entry1;
2052 const struct mips_got_entry *e2 = (struct mips_got_entry *)entry2;
2053
0f20cc35
DJ
2054 /* Any two LDM entries match. */
2055 if (e1->tls_type & e2->tls_type & GOT_TLS_LDM)
2056 return 1;
2057
2058 /* Nothing else matches an LDM entry. */
2059 if ((e1->tls_type ^ e2->tls_type) & GOT_TLS_LDM)
2060 return 0;
2061
f4416af6
AO
2062 return e1->symndx == e2->symndx
2063 && (e1->symndx >= 0 ? e1->abfd == e2->abfd && e1->d.addend == e2->d.addend
2064 : e1->abfd == NULL || e2->abfd == NULL
2065 ? e1->abfd == e2->abfd && e1->d.address == e2->d.address
2066 : e1->d.h == e2->d.h);
b15e6682 2067}
c224138d
RS
2068
2069static hashval_t
2070mips_got_page_entry_hash (const void *entry_)
2071{
2072 const struct mips_got_page_entry *entry;
2073
2074 entry = (const struct mips_got_page_entry *) entry_;
2075 return entry->abfd->id + entry->symndx;
2076}
2077
2078static int
2079mips_got_page_entry_eq (const void *entry1_, const void *entry2_)
2080{
2081 const struct mips_got_page_entry *entry1, *entry2;
2082
2083 entry1 = (const struct mips_got_page_entry *) entry1_;
2084 entry2 = (const struct mips_got_page_entry *) entry2_;
2085 return entry1->abfd == entry2->abfd && entry1->symndx == entry2->symndx;
2086}
b15e6682 2087\f
0a44bf69
RS
2088/* Return the dynamic relocation section. If it doesn't exist, try to
2089 create a new it if CREATE_P, otherwise return NULL. Also return NULL
2090 if creation fails. */
f4416af6
AO
2091
2092static asection *
0a44bf69 2093mips_elf_rel_dyn_section (struct bfd_link_info *info, bfd_boolean create_p)
f4416af6 2094{
0a44bf69 2095 const char *dname;
f4416af6 2096 asection *sreloc;
0a44bf69 2097 bfd *dynobj;
f4416af6 2098
0a44bf69
RS
2099 dname = MIPS_ELF_REL_DYN_NAME (info);
2100 dynobj = elf_hash_table (info)->dynobj;
f4416af6
AO
2101 sreloc = bfd_get_section_by_name (dynobj, dname);
2102 if (sreloc == NULL && create_p)
2103 {
3496cb2a
L
2104 sreloc = bfd_make_section_with_flags (dynobj, dname,
2105 (SEC_ALLOC
2106 | SEC_LOAD
2107 | SEC_HAS_CONTENTS
2108 | SEC_IN_MEMORY
2109 | SEC_LINKER_CREATED
2110 | SEC_READONLY));
f4416af6 2111 if (sreloc == NULL
f4416af6 2112 || ! bfd_set_section_alignment (dynobj, sreloc,
d80dcc6a 2113 MIPS_ELF_LOG_FILE_ALIGN (dynobj)))
f4416af6
AO
2114 return NULL;
2115 }
2116 return sreloc;
2117}
2118
b49e97c9
TS
2119/* Returns the GOT section for ABFD. */
2120
2121static asection *
9719ad41 2122mips_elf_got_section (bfd *abfd, bfd_boolean maybe_excluded)
b49e97c9 2123{
f4416af6
AO
2124 asection *sgot = bfd_get_section_by_name (abfd, ".got");
2125 if (sgot == NULL
2126 || (! maybe_excluded && (sgot->flags & SEC_EXCLUDE) != 0))
2127 return NULL;
2128 return sgot;
b49e97c9
TS
2129}
2130
2131/* Returns the GOT information associated with the link indicated by
2132 INFO. If SGOTP is non-NULL, it is filled in with the GOT
2133 section. */
2134
2135static struct mips_got_info *
9719ad41 2136mips_elf_got_info (bfd *abfd, asection **sgotp)
b49e97c9
TS
2137{
2138 asection *sgot;
2139 struct mips_got_info *g;
2140
f4416af6 2141 sgot = mips_elf_got_section (abfd, TRUE);
b49e97c9 2142 BFD_ASSERT (sgot != NULL);
f0abc2a1
AM
2143 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
2144 g = mips_elf_section_data (sgot)->u.got_info;
b49e97c9
TS
2145 BFD_ASSERT (g != NULL);
2146
2147 if (sgotp)
f4416af6
AO
2148 *sgotp = (sgot->flags & SEC_EXCLUDE) == 0 ? sgot : NULL;
2149
b49e97c9
TS
2150 return g;
2151}
2152
0f20cc35
DJ
2153/* Count the number of relocations needed for a TLS GOT entry, with
2154 access types from TLS_TYPE, and symbol H (or a local symbol if H
2155 is NULL). */
2156
2157static int
2158mips_tls_got_relocs (struct bfd_link_info *info, unsigned char tls_type,
2159 struct elf_link_hash_entry *h)
2160{
2161 int indx = 0;
2162 int ret = 0;
2163 bfd_boolean need_relocs = FALSE;
2164 bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
2165
2166 if (h && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2167 && (!info->shared || !SYMBOL_REFERENCES_LOCAL (info, h)))
2168 indx = h->dynindx;
2169
2170 if ((info->shared || indx != 0)
2171 && (h == NULL
2172 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2173 || h->root.type != bfd_link_hash_undefweak))
2174 need_relocs = TRUE;
2175
2176 if (!need_relocs)
2177 return FALSE;
2178
2179 if (tls_type & GOT_TLS_GD)
2180 {
2181 ret++;
2182 if (indx != 0)
2183 ret++;
2184 }
2185
2186 if (tls_type & GOT_TLS_IE)
2187 ret++;
2188
2189 if ((tls_type & GOT_TLS_LDM) && info->shared)
2190 ret++;
2191
2192 return ret;
2193}
2194
2195/* Count the number of TLS relocations required for the GOT entry in
2196 ARG1, if it describes a local symbol. */
2197
2198static int
2199mips_elf_count_local_tls_relocs (void **arg1, void *arg2)
2200{
2201 struct mips_got_entry *entry = * (struct mips_got_entry **) arg1;
2202 struct mips_elf_count_tls_arg *arg = arg2;
2203
2204 if (entry->abfd != NULL && entry->symndx != -1)
2205 arg->needed += mips_tls_got_relocs (arg->info, entry->tls_type, NULL);
2206
2207 return 1;
2208}
2209
2210/* Count the number of TLS GOT entries required for the global (or
2211 forced-local) symbol in ARG1. */
2212
2213static int
2214mips_elf_count_global_tls_entries (void *arg1, void *arg2)
2215{
2216 struct mips_elf_link_hash_entry *hm
2217 = (struct mips_elf_link_hash_entry *) arg1;
2218 struct mips_elf_count_tls_arg *arg = arg2;
2219
2220 if (hm->tls_type & GOT_TLS_GD)
2221 arg->needed += 2;
2222 if (hm->tls_type & GOT_TLS_IE)
2223 arg->needed += 1;
2224
2225 return 1;
2226}
2227
2228/* Count the number of TLS relocations required for the global (or
2229 forced-local) symbol in ARG1. */
2230
2231static int
2232mips_elf_count_global_tls_relocs (void *arg1, void *arg2)
2233{
2234 struct mips_elf_link_hash_entry *hm
2235 = (struct mips_elf_link_hash_entry *) arg1;
2236 struct mips_elf_count_tls_arg *arg = arg2;
2237
2238 arg->needed += mips_tls_got_relocs (arg->info, hm->tls_type, &hm->root);
2239
2240 return 1;
2241}
2242
2243/* Output a simple dynamic relocation into SRELOC. */
2244
2245static void
2246mips_elf_output_dynamic_relocation (bfd *output_bfd,
2247 asection *sreloc,
2248 unsigned long indx,
2249 int r_type,
2250 bfd_vma offset)
2251{
2252 Elf_Internal_Rela rel[3];
2253
2254 memset (rel, 0, sizeof (rel));
2255
2256 rel[0].r_info = ELF_R_INFO (output_bfd, indx, r_type);
2257 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
2258
2259 if (ABI_64_P (output_bfd))
2260 {
2261 (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
2262 (output_bfd, &rel[0],
2263 (sreloc->contents
2264 + sreloc->reloc_count * sizeof (Elf64_Mips_External_Rel)));
2265 }
2266 else
2267 bfd_elf32_swap_reloc_out
2268 (output_bfd, &rel[0],
2269 (sreloc->contents
2270 + sreloc->reloc_count * sizeof (Elf32_External_Rel)));
2271 ++sreloc->reloc_count;
2272}
2273
2274/* Initialize a set of TLS GOT entries for one symbol. */
2275
2276static void
2277mips_elf_initialize_tls_slots (bfd *abfd, bfd_vma got_offset,
2278 unsigned char *tls_type_p,
2279 struct bfd_link_info *info,
2280 struct mips_elf_link_hash_entry *h,
2281 bfd_vma value)
2282{
2283 int indx;
2284 asection *sreloc, *sgot;
2285 bfd_vma offset, offset2;
2286 bfd *dynobj;
2287 bfd_boolean need_relocs = FALSE;
2288
2289 dynobj = elf_hash_table (info)->dynobj;
2290 sgot = mips_elf_got_section (dynobj, FALSE);
2291
2292 indx = 0;
2293 if (h != NULL)
2294 {
2295 bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
2296
2297 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, &h->root)
2298 && (!info->shared || !SYMBOL_REFERENCES_LOCAL (info, &h->root)))
2299 indx = h->root.dynindx;
2300 }
2301
2302 if (*tls_type_p & GOT_TLS_DONE)
2303 return;
2304
2305 if ((info->shared || indx != 0)
2306 && (h == NULL
2307 || ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT
2308 || h->root.type != bfd_link_hash_undefweak))
2309 need_relocs = TRUE;
2310
2311 /* MINUS_ONE means the symbol is not defined in this object. It may not
2312 be defined at all; assume that the value doesn't matter in that
2313 case. Otherwise complain if we would use the value. */
2314 BFD_ASSERT (value != MINUS_ONE || (indx != 0 && need_relocs)
2315 || h->root.root.type == bfd_link_hash_undefweak);
2316
2317 /* Emit necessary relocations. */
0a44bf69 2318 sreloc = mips_elf_rel_dyn_section (info, FALSE);
0f20cc35
DJ
2319
2320 /* General Dynamic. */
2321 if (*tls_type_p & GOT_TLS_GD)
2322 {
2323 offset = got_offset;
2324 offset2 = offset + MIPS_ELF_GOT_SIZE (abfd);
2325
2326 if (need_relocs)
2327 {
2328 mips_elf_output_dynamic_relocation
2329 (abfd, sreloc, indx,
2330 ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
2331 sgot->output_offset + sgot->output_section->vma + offset);
2332
2333 if (indx)
2334 mips_elf_output_dynamic_relocation
2335 (abfd, sreloc, indx,
2336 ABI_64_P (abfd) ? R_MIPS_TLS_DTPREL64 : R_MIPS_TLS_DTPREL32,
2337 sgot->output_offset + sgot->output_section->vma + offset2);
2338 else
2339 MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
2340 sgot->contents + offset2);
2341 }
2342 else
2343 {
2344 MIPS_ELF_PUT_WORD (abfd, 1,
2345 sgot->contents + offset);
2346 MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
2347 sgot->contents + offset2);
2348 }
2349
2350 got_offset += 2 * MIPS_ELF_GOT_SIZE (abfd);
2351 }
2352
2353 /* Initial Exec model. */
2354 if (*tls_type_p & GOT_TLS_IE)
2355 {
2356 offset = got_offset;
2357
2358 if (need_relocs)
2359 {
2360 if (indx == 0)
2361 MIPS_ELF_PUT_WORD (abfd, value - elf_hash_table (info)->tls_sec->vma,
2362 sgot->contents + offset);
2363 else
2364 MIPS_ELF_PUT_WORD (abfd, 0,
2365 sgot->contents + offset);
2366
2367 mips_elf_output_dynamic_relocation
2368 (abfd, sreloc, indx,
2369 ABI_64_P (abfd) ? R_MIPS_TLS_TPREL64 : R_MIPS_TLS_TPREL32,
2370 sgot->output_offset + sgot->output_section->vma + offset);
2371 }
2372 else
2373 MIPS_ELF_PUT_WORD (abfd, value - tprel_base (info),
2374 sgot->contents + offset);
2375 }
2376
2377 if (*tls_type_p & GOT_TLS_LDM)
2378 {
2379 /* The initial offset is zero, and the LD offsets will include the
2380 bias by DTP_OFFSET. */
2381 MIPS_ELF_PUT_WORD (abfd, 0,
2382 sgot->contents + got_offset
2383 + MIPS_ELF_GOT_SIZE (abfd));
2384
2385 if (!info->shared)
2386 MIPS_ELF_PUT_WORD (abfd, 1,
2387 sgot->contents + got_offset);
2388 else
2389 mips_elf_output_dynamic_relocation
2390 (abfd, sreloc, indx,
2391 ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
2392 sgot->output_offset + sgot->output_section->vma + got_offset);
2393 }
2394
2395 *tls_type_p |= GOT_TLS_DONE;
2396}
2397
2398/* Return the GOT index to use for a relocation of type R_TYPE against
2399 a symbol accessed using TLS_TYPE models. The GOT entries for this
2400 symbol in this GOT start at GOT_INDEX. This function initializes the
2401 GOT entries and corresponding relocations. */
2402
2403static bfd_vma
2404mips_tls_got_index (bfd *abfd, bfd_vma got_index, unsigned char *tls_type,
2405 int r_type, struct bfd_link_info *info,
2406 struct mips_elf_link_hash_entry *h, bfd_vma symbol)
2407{
2408 BFD_ASSERT (r_type == R_MIPS_TLS_GOTTPREL || r_type == R_MIPS_TLS_GD
2409 || r_type == R_MIPS_TLS_LDM);
2410
2411 mips_elf_initialize_tls_slots (abfd, got_index, tls_type, info, h, symbol);
2412
2413 if (r_type == R_MIPS_TLS_GOTTPREL)
2414 {
2415 BFD_ASSERT (*tls_type & GOT_TLS_IE);
2416 if (*tls_type & GOT_TLS_GD)
2417 return got_index + 2 * MIPS_ELF_GOT_SIZE (abfd);
2418 else
2419 return got_index;
2420 }
2421
2422 if (r_type == R_MIPS_TLS_GD)
2423 {
2424 BFD_ASSERT (*tls_type & GOT_TLS_GD);
2425 return got_index;
2426 }
2427
2428 if (r_type == R_MIPS_TLS_LDM)
2429 {
2430 BFD_ASSERT (*tls_type & GOT_TLS_LDM);
2431 return got_index;
2432 }
2433
2434 return got_index;
2435}
2436
0a44bf69
RS
2437/* Return the offset from _GLOBAL_OFFSET_TABLE_ of the .got.plt entry
2438 for global symbol H. .got.plt comes before the GOT, so the offset
2439 will be negative. */
2440
2441static bfd_vma
2442mips_elf_gotplt_index (struct bfd_link_info *info,
2443 struct elf_link_hash_entry *h)
2444{
2445 bfd_vma plt_index, got_address, got_value;
2446 struct mips_elf_link_hash_table *htab;
2447
2448 htab = mips_elf_hash_table (info);
2449 BFD_ASSERT (h->plt.offset != (bfd_vma) -1);
2450
2451 /* Calculate the index of the symbol's PLT entry. */
2452 plt_index = (h->plt.offset - htab->plt_header_size) / htab->plt_entry_size;
2453
2454 /* Calculate the address of the associated .got.plt entry. */
2455 got_address = (htab->sgotplt->output_section->vma
2456 + htab->sgotplt->output_offset
2457 + plt_index * 4);
2458
2459 /* Calculate the value of _GLOBAL_OFFSET_TABLE_. */
2460 got_value = (htab->root.hgot->root.u.def.section->output_section->vma
2461 + htab->root.hgot->root.u.def.section->output_offset
2462 + htab->root.hgot->root.u.def.value);
2463
2464 return got_address - got_value;
2465}
2466
5c18022e 2467/* Return the GOT offset for address VALUE. If there is not yet a GOT
0a44bf69
RS
2468 entry for this value, create one. If R_SYMNDX refers to a TLS symbol,
2469 create a TLS GOT entry instead. Return -1 if no satisfactory GOT
2470 offset can be found. */
b49e97c9
TS
2471
2472static bfd_vma
9719ad41 2473mips_elf_local_got_index (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
5c18022e 2474 bfd_vma value, unsigned long r_symndx,
0f20cc35 2475 struct mips_elf_link_hash_entry *h, int r_type)
b49e97c9
TS
2476{
2477 asection *sgot;
2478 struct mips_got_info *g;
b15e6682 2479 struct mips_got_entry *entry;
b49e97c9
TS
2480
2481 g = mips_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
2482
0a44bf69 2483 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, g, sgot,
5c18022e 2484 value, r_symndx, h, r_type);
0f20cc35 2485 if (!entry)
b15e6682 2486 return MINUS_ONE;
0f20cc35
DJ
2487
2488 if (TLS_RELOC_P (r_type))
ead49a57
RS
2489 {
2490 if (entry->symndx == -1 && g->next == NULL)
2491 /* A type (3) entry in the single-GOT case. We use the symbol's
2492 hash table entry to track the index. */
2493 return mips_tls_got_index (abfd, h->tls_got_offset, &h->tls_type,
2494 r_type, info, h, value);
2495 else
2496 return mips_tls_got_index (abfd, entry->gotidx, &entry->tls_type,
2497 r_type, info, h, value);
2498 }
0f20cc35
DJ
2499 else
2500 return entry->gotidx;
b49e97c9
TS
2501}
2502
2503/* Returns the GOT index for the global symbol indicated by H. */
2504
2505static bfd_vma
0f20cc35
DJ
2506mips_elf_global_got_index (bfd *abfd, bfd *ibfd, struct elf_link_hash_entry *h,
2507 int r_type, struct bfd_link_info *info)
b49e97c9
TS
2508{
2509 bfd_vma index;
2510 asection *sgot;
f4416af6 2511 struct mips_got_info *g, *gg;
d0c7ff07 2512 long global_got_dynindx = 0;
b49e97c9 2513
f4416af6
AO
2514 gg = g = mips_elf_got_info (abfd, &sgot);
2515 if (g->bfd2got && ibfd)
2516 {
2517 struct mips_got_entry e, *p;
143d77c5 2518
f4416af6
AO
2519 BFD_ASSERT (h->dynindx >= 0);
2520
2521 g = mips_elf_got_for_ibfd (g, ibfd);
0f20cc35 2522 if (g->next != gg || TLS_RELOC_P (r_type))
f4416af6
AO
2523 {
2524 e.abfd = ibfd;
2525 e.symndx = -1;
2526 e.d.h = (struct mips_elf_link_hash_entry *)h;
0f20cc35 2527 e.tls_type = 0;
f4416af6 2528
9719ad41 2529 p = htab_find (g->got_entries, &e);
f4416af6
AO
2530
2531 BFD_ASSERT (p->gotidx > 0);
0f20cc35
DJ
2532
2533 if (TLS_RELOC_P (r_type))
2534 {
2535 bfd_vma value = MINUS_ONE;
2536 if ((h->root.type == bfd_link_hash_defined
2537 || h->root.type == bfd_link_hash_defweak)
2538 && h->root.u.def.section->output_section)
2539 value = (h->root.u.def.value
2540 + h->root.u.def.section->output_offset
2541 + h->root.u.def.section->output_section->vma);
2542
2543 return mips_tls_got_index (abfd, p->gotidx, &p->tls_type, r_type,
2544 info, e.d.h, value);
2545 }
2546 else
2547 return p->gotidx;
f4416af6
AO
2548 }
2549 }
2550
2551 if (gg->global_gotsym != NULL)
2552 global_got_dynindx = gg->global_gotsym->dynindx;
b49e97c9 2553
0f20cc35
DJ
2554 if (TLS_RELOC_P (r_type))
2555 {
2556 struct mips_elf_link_hash_entry *hm
2557 = (struct mips_elf_link_hash_entry *) h;
2558 bfd_vma value = MINUS_ONE;
2559
2560 if ((h->root.type == bfd_link_hash_defined
2561 || h->root.type == bfd_link_hash_defweak)
2562 && h->root.u.def.section->output_section)
2563 value = (h->root.u.def.value
2564 + h->root.u.def.section->output_offset
2565 + h->root.u.def.section->output_section->vma);
2566
2567 index = mips_tls_got_index (abfd, hm->tls_got_offset, &hm->tls_type,
2568 r_type, info, hm, value);
2569 }
2570 else
2571 {
2572 /* Once we determine the global GOT entry with the lowest dynamic
2573 symbol table index, we must put all dynamic symbols with greater
2574 indices into the GOT. That makes it easy to calculate the GOT
2575 offset. */
2576 BFD_ASSERT (h->dynindx >= global_got_dynindx);
2577 index = ((h->dynindx - global_got_dynindx + g->local_gotno)
2578 * MIPS_ELF_GOT_SIZE (abfd));
2579 }
eea6121a 2580 BFD_ASSERT (index < sgot->size);
b49e97c9
TS
2581
2582 return index;
2583}
2584
5c18022e
RS
2585/* Find a GOT page entry that points to within 32KB of VALUE. These
2586 entries are supposed to be placed at small offsets in the GOT, i.e.,
2587 within 32KB of GP. Return the index of the GOT entry, or -1 if no
2588 entry could be created. If OFFSETP is nonnull, use it to return the
0a44bf69 2589 offset of the GOT entry from VALUE. */
b49e97c9
TS
2590
2591static bfd_vma
9719ad41 2592mips_elf_got_page (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
5c18022e 2593 bfd_vma value, bfd_vma *offsetp)
b49e97c9
TS
2594{
2595 asection *sgot;
2596 struct mips_got_info *g;
0a44bf69 2597 bfd_vma page, index;
b15e6682 2598 struct mips_got_entry *entry;
b49e97c9
TS
2599
2600 g = mips_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
2601
0a44bf69
RS
2602 page = (value + 0x8000) & ~(bfd_vma) 0xffff;
2603 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, g, sgot,
5c18022e 2604 page, 0, NULL, R_MIPS_GOT_PAGE);
b49e97c9 2605
b15e6682
AO
2606 if (!entry)
2607 return MINUS_ONE;
143d77c5 2608
b15e6682 2609 index = entry->gotidx;
b49e97c9
TS
2610
2611 if (offsetp)
f4416af6 2612 *offsetp = value - entry->d.address;
b49e97c9
TS
2613
2614 return index;
2615}
2616
5c18022e 2617/* Find a local GOT entry for an R_MIPS_GOT16 relocation against VALUE.
0a44bf69
RS
2618 EXTERNAL is true if the relocation was against a global symbol
2619 that has been forced local. */
b49e97c9
TS
2620
2621static bfd_vma
9719ad41 2622mips_elf_got16_entry (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
5c18022e 2623 bfd_vma value, bfd_boolean external)
b49e97c9
TS
2624{
2625 asection *sgot;
2626 struct mips_got_info *g;
b15e6682 2627 struct mips_got_entry *entry;
b49e97c9 2628
0a44bf69
RS
2629 /* GOT16 relocations against local symbols are followed by a LO16
2630 relocation; those against global symbols are not. Thus if the
2631 symbol was originally local, the GOT16 relocation should load the
2632 equivalent of %hi(VALUE), otherwise it should load VALUE itself. */
b49e97c9 2633 if (! external)
0a44bf69 2634 value = mips_elf_high (value) << 16;
b49e97c9
TS
2635
2636 g = mips_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
2637
0a44bf69 2638 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, g, sgot,
5c18022e 2639 value, 0, NULL, R_MIPS_GOT16);
b15e6682
AO
2640 if (entry)
2641 return entry->gotidx;
2642 else
2643 return MINUS_ONE;
b49e97c9
TS
2644}
2645
2646/* Returns the offset for the entry at the INDEXth position
2647 in the GOT. */
2648
2649static bfd_vma
9719ad41
RS
2650mips_elf_got_offset_from_index (bfd *dynobj, bfd *output_bfd,
2651 bfd *input_bfd, bfd_vma index)
b49e97c9
TS
2652{
2653 asection *sgot;
2654 bfd_vma gp;
f4416af6 2655 struct mips_got_info *g;
b49e97c9 2656
f4416af6
AO
2657 g = mips_elf_got_info (dynobj, &sgot);
2658 gp = _bfd_get_gp_value (output_bfd)
2659 + mips_elf_adjust_gp (output_bfd, g, input_bfd);
143d77c5 2660
f4416af6 2661 return sgot->output_section->vma + sgot->output_offset + index - gp;
b49e97c9
TS
2662}
2663
0a44bf69
RS
2664/* Create and return a local GOT entry for VALUE, which was calculated
2665 from a symbol belonging to INPUT_SECTON. Return NULL if it could not
2666 be created. If R_SYMNDX refers to a TLS symbol, create a TLS entry
2667 instead. */
b49e97c9 2668
b15e6682 2669static struct mips_got_entry *
0a44bf69
RS
2670mips_elf_create_local_got_entry (bfd *abfd, struct bfd_link_info *info,
2671 bfd *ibfd, struct mips_got_info *gg,
5c18022e
RS
2672 asection *sgot, bfd_vma value,
2673 unsigned long r_symndx,
0f20cc35
DJ
2674 struct mips_elf_link_hash_entry *h,
2675 int r_type)
b49e97c9 2676{
b15e6682 2677 struct mips_got_entry entry, **loc;
f4416af6 2678 struct mips_got_info *g;
0a44bf69
RS
2679 struct mips_elf_link_hash_table *htab;
2680
2681 htab = mips_elf_hash_table (info);
b15e6682 2682
f4416af6
AO
2683 entry.abfd = NULL;
2684 entry.symndx = -1;
2685 entry.d.address = value;
0f20cc35 2686 entry.tls_type = 0;
f4416af6
AO
2687
2688 g = mips_elf_got_for_ibfd (gg, ibfd);
2689 if (g == NULL)
2690 {
2691 g = mips_elf_got_for_ibfd (gg, abfd);
2692 BFD_ASSERT (g != NULL);
2693 }
b15e6682 2694
0f20cc35
DJ
2695 /* We might have a symbol, H, if it has been forced local. Use the
2696 global entry then. It doesn't matter whether an entry is local
2697 or global for TLS, since the dynamic linker does not
2698 automatically relocate TLS GOT entries. */
a008ac03 2699 BFD_ASSERT (h == NULL || h->root.forced_local);
0f20cc35
DJ
2700 if (TLS_RELOC_P (r_type))
2701 {
2702 struct mips_got_entry *p;
2703
2704 entry.abfd = ibfd;
2705 if (r_type == R_MIPS_TLS_LDM)
2706 {
2707 entry.tls_type = GOT_TLS_LDM;
2708 entry.symndx = 0;
2709 entry.d.addend = 0;
2710 }
2711 else if (h == NULL)
2712 {
2713 entry.symndx = r_symndx;
2714 entry.d.addend = 0;
2715 }
2716 else
2717 entry.d.h = h;
2718
2719 p = (struct mips_got_entry *)
2720 htab_find (g->got_entries, &entry);
2721
2722 BFD_ASSERT (p);
2723 return p;
2724 }
2725
b15e6682
AO
2726 loc = (struct mips_got_entry **) htab_find_slot (g->got_entries, &entry,
2727 INSERT);
2728 if (*loc)
2729 return *loc;
143d77c5 2730
b15e6682 2731 entry.gotidx = MIPS_ELF_GOT_SIZE (abfd) * g->assigned_gotno++;
0f20cc35 2732 entry.tls_type = 0;
b15e6682
AO
2733
2734 *loc = (struct mips_got_entry *)bfd_alloc (abfd, sizeof entry);
2735
2736 if (! *loc)
2737 return NULL;
143d77c5 2738
b15e6682
AO
2739 memcpy (*loc, &entry, sizeof entry);
2740
8275b357 2741 if (g->assigned_gotno > g->local_gotno)
b49e97c9 2742 {
f4416af6 2743 (*loc)->gotidx = -1;
b49e97c9
TS
2744 /* We didn't allocate enough space in the GOT. */
2745 (*_bfd_error_handler)
2746 (_("not enough GOT space for local GOT entries"));
2747 bfd_set_error (bfd_error_bad_value);
b15e6682 2748 return NULL;
b49e97c9
TS
2749 }
2750
2751 MIPS_ELF_PUT_WORD (abfd, value,
b15e6682
AO
2752 (sgot->contents + entry.gotidx));
2753
5c18022e 2754 /* These GOT entries need a dynamic relocation on VxWorks. */
0a44bf69
RS
2755 if (htab->is_vxworks)
2756 {
2757 Elf_Internal_Rela outrel;
5c18022e 2758 asection *s;
0a44bf69
RS
2759 bfd_byte *loc;
2760 bfd_vma got_address;
0a44bf69
RS
2761
2762 s = mips_elf_rel_dyn_section (info, FALSE);
0a44bf69
RS
2763 got_address = (sgot->output_section->vma
2764 + sgot->output_offset
2765 + entry.gotidx);
2766
2767 loc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
2768 outrel.r_offset = got_address;
5c18022e
RS
2769 outrel.r_info = ELF32_R_INFO (STN_UNDEF, R_MIPS_32);
2770 outrel.r_addend = value;
0a44bf69
RS
2771 bfd_elf32_swap_reloca_out (abfd, &outrel, loc);
2772 }
2773
b15e6682 2774 return *loc;
b49e97c9
TS
2775}
2776
2777/* Sort the dynamic symbol table so that symbols that need GOT entries
2778 appear towards the end. This reduces the amount of GOT space
2779 required. MAX_LOCAL is used to set the number of local symbols
2780 known to be in the dynamic symbol table. During
2781 _bfd_mips_elf_size_dynamic_sections, this value is 1. Afterward, the
2782 section symbols are added and the count is higher. */
2783
b34976b6 2784static bfd_boolean
9719ad41 2785mips_elf_sort_hash_table (struct bfd_link_info *info, unsigned long max_local)
b49e97c9
TS
2786{
2787 struct mips_elf_hash_sort_data hsd;
2788 struct mips_got_info *g;
2789 bfd *dynobj;
2790
2791 dynobj = elf_hash_table (info)->dynobj;
2792
f4416af6
AO
2793 g = mips_elf_got_info (dynobj, NULL);
2794
b49e97c9 2795 hsd.low = NULL;
143d77c5 2796 hsd.max_unref_got_dynindx =
f4416af6
AO
2797 hsd.min_got_dynindx = elf_hash_table (info)->dynsymcount
2798 /* In the multi-got case, assigned_gotno of the master got_info
2799 indicate the number of entries that aren't referenced in the
2800 primary GOT, but that must have entries because there are
2801 dynamic relocations that reference it. Since they aren't
2802 referenced, we move them to the end of the GOT, so that they
2803 don't prevent other entries that are referenced from getting
2804 too large offsets. */
2805 - (g->next ? g->assigned_gotno : 0);
b49e97c9
TS
2806 hsd.max_non_got_dynindx = max_local;
2807 mips_elf_link_hash_traverse (((struct mips_elf_link_hash_table *)
2808 elf_hash_table (info)),
2809 mips_elf_sort_hash_table_f,
2810 &hsd);
2811
2812 /* There should have been enough room in the symbol table to
44c410de 2813 accommodate both the GOT and non-GOT symbols. */
b49e97c9 2814 BFD_ASSERT (hsd.max_non_got_dynindx <= hsd.min_got_dynindx);
f4416af6
AO
2815 BFD_ASSERT ((unsigned long)hsd.max_unref_got_dynindx
2816 <= elf_hash_table (info)->dynsymcount);
b49e97c9
TS
2817
2818 /* Now we know which dynamic symbol has the lowest dynamic symbol
2819 table index in the GOT. */
b49e97c9
TS
2820 g->global_gotsym = hsd.low;
2821
b34976b6 2822 return TRUE;
b49e97c9
TS
2823}
2824
2825/* If H needs a GOT entry, assign it the highest available dynamic
2826 index. Otherwise, assign it the lowest available dynamic
2827 index. */
2828
b34976b6 2829static bfd_boolean
9719ad41 2830mips_elf_sort_hash_table_f (struct mips_elf_link_hash_entry *h, void *data)
b49e97c9 2831{
9719ad41 2832 struct mips_elf_hash_sort_data *hsd = data;
b49e97c9
TS
2833
2834 if (h->root.root.type == bfd_link_hash_warning)
2835 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
2836
2837 /* Symbols without dynamic symbol table entries aren't interesting
2838 at all. */
2839 if (h->root.dynindx == -1)
b34976b6 2840 return TRUE;
b49e97c9 2841
f4416af6
AO
2842 /* Global symbols that need GOT entries that are not explicitly
2843 referenced are marked with got offset 2. Those that are
2844 referenced get a 1, and those that don't need GOT entries get
720199d6
DJ
2845 -1. Forced local symbols may also be marked with got offset 1,
2846 but are never given global GOT entries. */
f4416af6
AO
2847 if (h->root.got.offset == 2)
2848 {
0f20cc35
DJ
2849 BFD_ASSERT (h->tls_type == GOT_NORMAL);
2850
f4416af6
AO
2851 if (hsd->max_unref_got_dynindx == hsd->min_got_dynindx)
2852 hsd->low = (struct elf_link_hash_entry *) h;
2853 h->root.dynindx = hsd->max_unref_got_dynindx++;
2854 }
720199d6 2855 else if (h->root.got.offset != 1 || h->forced_local)
b49e97c9
TS
2856 h->root.dynindx = hsd->max_non_got_dynindx++;
2857 else
2858 {
0f20cc35
DJ
2859 BFD_ASSERT (h->tls_type == GOT_NORMAL);
2860
b49e97c9
TS
2861 h->root.dynindx = --hsd->min_got_dynindx;
2862 hsd->low = (struct elf_link_hash_entry *) h;
2863 }
2864
b34976b6 2865 return TRUE;
b49e97c9
TS
2866}
2867
2868/* If H is a symbol that needs a global GOT entry, but has a dynamic
2869 symbol table index lower than any we've seen to date, record it for
2870 posterity. */
2871
b34976b6 2872static bfd_boolean
9719ad41
RS
2873mips_elf_record_global_got_symbol (struct elf_link_hash_entry *h,
2874 bfd *abfd, struct bfd_link_info *info,
0f20cc35
DJ
2875 struct mips_got_info *g,
2876 unsigned char tls_flag)
b49e97c9 2877{
f4416af6
AO
2878 struct mips_got_entry entry, **loc;
2879
b49e97c9
TS
2880 /* A global symbol in the GOT must also be in the dynamic symbol
2881 table. */
7c5fcef7
L
2882 if (h->dynindx == -1)
2883 {
2884 switch (ELF_ST_VISIBILITY (h->other))
2885 {
2886 case STV_INTERNAL:
2887 case STV_HIDDEN:
b34976b6 2888 _bfd_mips_elf_hide_symbol (info, h, TRUE);
7c5fcef7
L
2889 break;
2890 }
c152c796 2891 if (!bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 2892 return FALSE;
7c5fcef7 2893 }
b49e97c9 2894
86324f90
EC
2895 /* Make sure we have a GOT to put this entry into. */
2896 BFD_ASSERT (g != NULL);
2897
f4416af6
AO
2898 entry.abfd = abfd;
2899 entry.symndx = -1;
2900 entry.d.h = (struct mips_elf_link_hash_entry *) h;
0f20cc35 2901 entry.tls_type = 0;
f4416af6
AO
2902
2903 loc = (struct mips_got_entry **) htab_find_slot (g->got_entries, &entry,
2904 INSERT);
2905
b49e97c9
TS
2906 /* If we've already marked this entry as needing GOT space, we don't
2907 need to do it again. */
f4416af6 2908 if (*loc)
0f20cc35
DJ
2909 {
2910 (*loc)->tls_type |= tls_flag;
2911 return TRUE;
2912 }
f4416af6
AO
2913
2914 *loc = (struct mips_got_entry *)bfd_alloc (abfd, sizeof entry);
2915
2916 if (! *loc)
2917 return FALSE;
143d77c5 2918
f4416af6 2919 entry.gotidx = -1;
0f20cc35
DJ
2920 entry.tls_type = tls_flag;
2921
f4416af6
AO
2922 memcpy (*loc, &entry, sizeof entry);
2923
b49e97c9 2924 if (h->got.offset != MINUS_ONE)
b34976b6 2925 return TRUE;
b49e97c9 2926
0f20cc35 2927 if (tls_flag == 0)
8275b357
RS
2928 {
2929 /* By setting this to a value other than -1, we are indicating that
2930 there needs to be a GOT entry for H. Avoid using zero, as the
2931 generic ELF copy_indirect_symbol tests for <= 0. */
2932 h->got.offset = 1;
2933 if (h->forced_local)
2934 g->local_gotno++;
2935 }
b49e97c9 2936
b34976b6 2937 return TRUE;
b49e97c9 2938}
f4416af6
AO
2939
2940/* Reserve space in G for a GOT entry containing the value of symbol
2941 SYMNDX in input bfd ABDF, plus ADDEND. */
2942
2943static bfd_boolean
9719ad41 2944mips_elf_record_local_got_symbol (bfd *abfd, long symndx, bfd_vma addend,
0f20cc35
DJ
2945 struct mips_got_info *g,
2946 unsigned char tls_flag)
f4416af6
AO
2947{
2948 struct mips_got_entry entry, **loc;
2949
2950 entry.abfd = abfd;
2951 entry.symndx = symndx;
2952 entry.d.addend = addend;
0f20cc35 2953 entry.tls_type = tls_flag;
f4416af6
AO
2954 loc = (struct mips_got_entry **)
2955 htab_find_slot (g->got_entries, &entry, INSERT);
2956
2957 if (*loc)
0f20cc35
DJ
2958 {
2959 if (tls_flag == GOT_TLS_GD && !((*loc)->tls_type & GOT_TLS_GD))
2960 {
2961 g->tls_gotno += 2;
2962 (*loc)->tls_type |= tls_flag;
2963 }
2964 else if (tls_flag == GOT_TLS_IE && !((*loc)->tls_type & GOT_TLS_IE))
2965 {
2966 g->tls_gotno += 1;
2967 (*loc)->tls_type |= tls_flag;
2968 }
2969 return TRUE;
2970 }
f4416af6 2971
0f20cc35
DJ
2972 if (tls_flag != 0)
2973 {
2974 entry.gotidx = -1;
2975 entry.tls_type = tls_flag;
2976 if (tls_flag == GOT_TLS_IE)
2977 g->tls_gotno += 1;
2978 else if (tls_flag == GOT_TLS_GD)
2979 g->tls_gotno += 2;
2980 else if (g->tls_ldm_offset == MINUS_ONE)
2981 {
2982 g->tls_ldm_offset = MINUS_TWO;
2983 g->tls_gotno += 2;
2984 }
2985 }
2986 else
2987 {
2988 entry.gotidx = g->local_gotno++;
2989 entry.tls_type = 0;
2990 }
f4416af6
AO
2991
2992 *loc = (struct mips_got_entry *)bfd_alloc (abfd, sizeof entry);
2993
2994 if (! *loc)
2995 return FALSE;
143d77c5 2996
f4416af6
AO
2997 memcpy (*loc, &entry, sizeof entry);
2998
2999 return TRUE;
3000}
c224138d
RS
3001
3002/* Return the maximum number of GOT page entries required for RANGE. */
3003
3004static bfd_vma
3005mips_elf_pages_for_range (const struct mips_got_page_range *range)
3006{
3007 return (range->max_addend - range->min_addend + 0x1ffff) >> 16;
3008}
3009
3010/* Record that ABFD has a page relocation against symbol SYMNDX and that
3011 ADDEND is the addend for that relocation. G is the GOT information. */
3012
3013static bfd_boolean
3014mips_elf_record_got_page_entry (bfd *abfd, long symndx, bfd_signed_vma addend,
3015 struct mips_got_info *g)
3016{
3017 struct mips_got_page_entry lookup, *entry;
3018 struct mips_got_page_range **range_ptr, *range;
3019 bfd_vma old_pages, new_pages;
3020 void **loc;
3021
3022 /* Find the mips_got_page_entry hash table entry for this symbol. */
3023 lookup.abfd = abfd;
3024 lookup.symndx = symndx;
3025 loc = htab_find_slot (g->got_page_entries, &lookup, INSERT);
3026 if (loc == NULL)
3027 return FALSE;
3028
3029 /* Create a mips_got_page_entry if this is the first time we've
3030 seen the symbol. */
3031 entry = (struct mips_got_page_entry *) *loc;
3032 if (!entry)
3033 {
3034 entry = bfd_alloc (abfd, sizeof (*entry));
3035 if (!entry)
3036 return FALSE;
3037
3038 entry->abfd = abfd;
3039 entry->symndx = symndx;
3040 entry->ranges = NULL;
3041 entry->num_pages = 0;
3042 *loc = entry;
3043 }
3044
3045 /* Skip over ranges whose maximum extent cannot share a page entry
3046 with ADDEND. */
3047 range_ptr = &entry->ranges;
3048 while (*range_ptr && addend > (*range_ptr)->max_addend + 0xffff)
3049 range_ptr = &(*range_ptr)->next;
3050
3051 /* If we scanned to the end of the list, or found a range whose
3052 minimum extent cannot share a page entry with ADDEND, create
3053 a new singleton range. */
3054 range = *range_ptr;
3055 if (!range || addend < range->min_addend - 0xffff)
3056 {
3057 range = bfd_alloc (abfd, sizeof (*range));
3058 if (!range)
3059 return FALSE;
3060
3061 range->next = *range_ptr;
3062 range->min_addend = addend;
3063 range->max_addend = addend;
3064
3065 *range_ptr = range;
3066 entry->num_pages++;
3067 g->page_gotno++;
3068 return TRUE;
3069 }
3070
3071 /* Remember how many pages the old range contributed. */
3072 old_pages = mips_elf_pages_for_range (range);
3073
3074 /* Update the ranges. */
3075 if (addend < range->min_addend)
3076 range->min_addend = addend;
3077 else if (addend > range->max_addend)
3078 {
3079 if (range->next && addend >= range->next->min_addend - 0xffff)
3080 {
3081 old_pages += mips_elf_pages_for_range (range->next);
3082 range->max_addend = range->next->max_addend;
3083 range->next = range->next->next;
3084 }
3085 else
3086 range->max_addend = addend;
3087 }
3088
3089 /* Record any change in the total estimate. */
3090 new_pages = mips_elf_pages_for_range (range);
3091 if (old_pages != new_pages)
3092 {
3093 entry->num_pages += new_pages - old_pages;
3094 g->page_gotno += new_pages - old_pages;
3095 }
3096
3097 return TRUE;
3098}
f4416af6
AO
3099\f
3100/* Compute the hash value of the bfd in a bfd2got hash entry. */
3101
3102static hashval_t
9719ad41 3103mips_elf_bfd2got_entry_hash (const void *entry_)
f4416af6
AO
3104{
3105 const struct mips_elf_bfd2got_hash *entry
3106 = (struct mips_elf_bfd2got_hash *)entry_;
3107
3108 return entry->bfd->id;
3109}
3110
3111/* Check whether two hash entries have the same bfd. */
3112
3113static int
9719ad41 3114mips_elf_bfd2got_entry_eq (const void *entry1, const void *entry2)
f4416af6
AO
3115{
3116 const struct mips_elf_bfd2got_hash *e1
3117 = (const struct mips_elf_bfd2got_hash *)entry1;
3118 const struct mips_elf_bfd2got_hash *e2
3119 = (const struct mips_elf_bfd2got_hash *)entry2;
3120
3121 return e1->bfd == e2->bfd;
3122}
3123
bad36eac 3124/* In a multi-got link, determine the GOT to be used for IBFD. G must
f4416af6
AO
3125 be the master GOT data. */
3126
3127static struct mips_got_info *
9719ad41 3128mips_elf_got_for_ibfd (struct mips_got_info *g, bfd *ibfd)
f4416af6
AO
3129{
3130 struct mips_elf_bfd2got_hash e, *p;
3131
3132 if (! g->bfd2got)
3133 return g;
3134
3135 e.bfd = ibfd;
9719ad41 3136 p = htab_find (g->bfd2got, &e);
f4416af6
AO
3137 return p ? p->g : NULL;
3138}
3139
c224138d
RS
3140/* Use BFD2GOT to find ABFD's got entry, creating one if none exists.
3141 Return NULL if an error occured. */
f4416af6 3142
c224138d
RS
3143static struct mips_got_info *
3144mips_elf_get_got_for_bfd (struct htab *bfd2got, bfd *output_bfd,
3145 bfd *input_bfd)
f4416af6 3146{
f4416af6 3147 struct mips_elf_bfd2got_hash bfdgot_entry, *bfdgot;
c224138d 3148 struct mips_got_info *g;
f4416af6 3149 void **bfdgotp;
143d77c5 3150
c224138d 3151 bfdgot_entry.bfd = input_bfd;
f4416af6 3152 bfdgotp = htab_find_slot (bfd2got, &bfdgot_entry, INSERT);
c224138d 3153 bfdgot = (struct mips_elf_bfd2got_hash *) *bfdgotp;
f4416af6 3154
c224138d 3155 if (bfdgot == NULL)
f4416af6 3156 {
c224138d
RS
3157 bfdgot = ((struct mips_elf_bfd2got_hash *)
3158 bfd_alloc (output_bfd, sizeof (struct mips_elf_bfd2got_hash)));
f4416af6 3159 if (bfdgot == NULL)
c224138d 3160 return NULL;
f4416af6
AO
3161
3162 *bfdgotp = bfdgot;
3163
c224138d
RS
3164 g = ((struct mips_got_info *)
3165 bfd_alloc (output_bfd, sizeof (struct mips_got_info)));
f4416af6 3166 if (g == NULL)
c224138d
RS
3167 return NULL;
3168
3169 bfdgot->bfd = input_bfd;
3170 bfdgot->g = g;
f4416af6
AO
3171
3172 g->global_gotsym = NULL;
3173 g->global_gotno = 0;
3174 g->local_gotno = 0;
c224138d 3175 g->page_gotno = 0;
f4416af6 3176 g->assigned_gotno = -1;
0f20cc35
DJ
3177 g->tls_gotno = 0;
3178 g->tls_assigned_gotno = 0;
3179 g->tls_ldm_offset = MINUS_ONE;
f4416af6 3180 g->got_entries = htab_try_create (1, mips_elf_multi_got_entry_hash,
9719ad41 3181 mips_elf_multi_got_entry_eq, NULL);
f4416af6 3182 if (g->got_entries == NULL)
c224138d
RS
3183 return NULL;
3184
3185 g->got_page_entries = htab_try_create (1, mips_got_page_entry_hash,
3186 mips_got_page_entry_eq, NULL);
3187 if (g->got_page_entries == NULL)
3188 return NULL;
f4416af6
AO
3189
3190 g->bfd2got = NULL;
3191 g->next = NULL;
3192 }
3193
c224138d
RS
3194 return bfdgot->g;
3195}
3196
3197/* A htab_traverse callback for the entries in the master got.
3198 Create one separate got for each bfd that has entries in the global
3199 got, such that we can tell how many local and global entries each
3200 bfd requires. */
3201
3202static int
3203mips_elf_make_got_per_bfd (void **entryp, void *p)
3204{
3205 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
3206 struct mips_elf_got_per_bfd_arg *arg = (struct mips_elf_got_per_bfd_arg *)p;
3207 struct mips_got_info *g;
3208
3209 g = mips_elf_get_got_for_bfd (arg->bfd2got, arg->obfd, entry->abfd);
3210 if (g == NULL)
3211 {
3212 arg->obfd = NULL;
3213 return 0;
3214 }
3215
f4416af6
AO
3216 /* Insert the GOT entry in the bfd's got entry hash table. */
3217 entryp = htab_find_slot (g->got_entries, entry, INSERT);
3218 if (*entryp != NULL)
3219 return 1;
143d77c5 3220
f4416af6
AO
3221 *entryp = entry;
3222
0f20cc35
DJ
3223 if (entry->tls_type)
3224 {
3225 if (entry->tls_type & (GOT_TLS_GD | GOT_TLS_LDM))
3226 g->tls_gotno += 2;
3227 if (entry->tls_type & GOT_TLS_IE)
3228 g->tls_gotno += 1;
3229 }
3230 else if (entry->symndx >= 0 || entry->d.h->forced_local)
f4416af6
AO
3231 ++g->local_gotno;
3232 else
3233 ++g->global_gotno;
3234
3235 return 1;
3236}
3237
c224138d
RS
3238/* A htab_traverse callback for the page entries in the master got.
3239 Associate each page entry with the bfd's got. */
3240
3241static int
3242mips_elf_make_got_pages_per_bfd (void **entryp, void *p)
3243{
3244 struct mips_got_page_entry *entry = (struct mips_got_page_entry *) *entryp;
3245 struct mips_elf_got_per_bfd_arg *arg = (struct mips_elf_got_per_bfd_arg *) p;
3246 struct mips_got_info *g;
3247
3248 g = mips_elf_get_got_for_bfd (arg->bfd2got, arg->obfd, entry->abfd);
3249 if (g == NULL)
3250 {
3251 arg->obfd = NULL;
3252 return 0;
3253 }
3254
3255 /* Insert the GOT entry in the bfd's got entry hash table. */
3256 entryp = htab_find_slot (g->got_page_entries, entry, INSERT);
3257 if (*entryp != NULL)
3258 return 1;
3259
3260 *entryp = entry;
3261 g->page_gotno += entry->num_pages;
3262 return 1;
3263}
3264
3265/* Consider merging the got described by BFD2GOT with TO, using the
3266 information given by ARG. Return -1 if this would lead to overflow,
3267 1 if they were merged successfully, and 0 if a merge failed due to
3268 lack of memory. (These values are chosen so that nonnegative return
3269 values can be returned by a htab_traverse callback.) */
3270
3271static int
3272mips_elf_merge_got_with (struct mips_elf_bfd2got_hash *bfd2got,
3273 struct mips_got_info *to,
3274 struct mips_elf_got_per_bfd_arg *arg)
3275{
3276 struct mips_got_info *from = bfd2got->g;
3277 unsigned int estimate;
3278
3279 /* Work out how many page entries we would need for the combined GOT. */
3280 estimate = arg->max_pages;
3281 if (estimate >= from->page_gotno + to->page_gotno)
3282 estimate = from->page_gotno + to->page_gotno;
3283
3284 /* And conservatively estimate how many local, global and TLS entries
3285 would be needed. */
3286 estimate += (from->local_gotno
3287 + from->global_gotno
3288 + from->tls_gotno
3289 + to->local_gotno
3290 + to->global_gotno
3291 + to->tls_gotno);
3292
3293 /* Bail out if the combined GOT might be too big. */
3294 if (estimate > arg->max_count)
3295 return -1;
3296
3297 /* Commit to the merge. Record that TO is now the bfd for this got. */
3298 bfd2got->g = to;
3299
3300 /* Transfer the bfd's got information from FROM to TO. */
3301 htab_traverse (from->got_entries, mips_elf_make_got_per_bfd, arg);
3302 if (arg->obfd == NULL)
3303 return 0;
3304
3305 htab_traverse (from->got_page_entries, mips_elf_make_got_pages_per_bfd, arg);
3306 if (arg->obfd == NULL)
3307 return 0;
3308
3309 /* We don't have to worry about releasing memory of the actual
3310 got entries, since they're all in the master got_entries hash
3311 table anyway. */
3312 htab_delete (from->got_entries);
3313 htab_delete (from->got_page_entries);
3314 return 1;
3315}
3316
f4416af6
AO
3317/* Attempt to merge gots of different input bfds. Try to use as much
3318 as possible of the primary got, since it doesn't require explicit
3319 dynamic relocations, but don't use bfds that would reference global
3320 symbols out of the addressable range. Failing the primary got,
3321 attempt to merge with the current got, or finish the current got
3322 and then make make the new got current. */
3323
3324static int
9719ad41 3325mips_elf_merge_gots (void **bfd2got_, void *p)
f4416af6
AO
3326{
3327 struct mips_elf_bfd2got_hash *bfd2got
3328 = (struct mips_elf_bfd2got_hash *)*bfd2got_;
3329 struct mips_elf_got_per_bfd_arg *arg = (struct mips_elf_got_per_bfd_arg *)p;
c224138d
RS
3330 struct mips_got_info *g;
3331 unsigned int estimate;
3332 int result;
3333
3334 g = bfd2got->g;
3335
3336 /* Work out the number of page, local and TLS entries. */
3337 estimate = arg->max_pages;
3338 if (estimate > g->page_gotno)
3339 estimate = g->page_gotno;
3340 estimate += g->local_gotno + g->tls_gotno;
0f20cc35
DJ
3341
3342 /* We place TLS GOT entries after both locals and globals. The globals
3343 for the primary GOT may overflow the normal GOT size limit, so be
3344 sure not to merge a GOT which requires TLS with the primary GOT in that
3345 case. This doesn't affect non-primary GOTs. */
c224138d 3346 estimate += (g->tls_gotno > 0 ? arg->global_count : g->global_gotno);
143d77c5 3347
c224138d 3348 if (estimate <= arg->max_count)
f4416af6 3349 {
c224138d
RS
3350 /* If we don't have a primary GOT, use it as
3351 a starting point for the primary GOT. */
3352 if (!arg->primary)
3353 {
3354 arg->primary = bfd2got->g;
3355 return 1;
3356 }
f4416af6 3357
c224138d
RS
3358 /* Try merging with the primary GOT. */
3359 result = mips_elf_merge_got_with (bfd2got, arg->primary, arg);
3360 if (result >= 0)
3361 return result;
f4416af6 3362 }
c224138d 3363
f4416af6 3364 /* If we can merge with the last-created got, do it. */
c224138d 3365 if (arg->current)
f4416af6 3366 {
c224138d
RS
3367 result = mips_elf_merge_got_with (bfd2got, arg->current, arg);
3368 if (result >= 0)
3369 return result;
f4416af6 3370 }
c224138d 3371
f4416af6
AO
3372 /* Well, we couldn't merge, so create a new GOT. Don't check if it
3373 fits; if it turns out that it doesn't, we'll get relocation
3374 overflows anyway. */
c224138d
RS
3375 g->next = arg->current;
3376 arg->current = g;
0f20cc35
DJ
3377
3378 return 1;
3379}
3380
ead49a57
RS
3381/* Set the TLS GOT index for the GOT entry in ENTRYP. ENTRYP's NEXT field
3382 is null iff there is just a single GOT. */
0f20cc35
DJ
3383
3384static int
3385mips_elf_initialize_tls_index (void **entryp, void *p)
3386{
3387 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
3388 struct mips_got_info *g = p;
ead49a57 3389 bfd_vma next_index;
cbf2cba4 3390 unsigned char tls_type;
0f20cc35
DJ
3391
3392 /* We're only interested in TLS symbols. */
3393 if (entry->tls_type == 0)
3394 return 1;
3395
ead49a57
RS
3396 next_index = MIPS_ELF_GOT_SIZE (entry->abfd) * (long) g->tls_assigned_gotno;
3397
3398 if (entry->symndx == -1 && g->next == NULL)
0f20cc35 3399 {
ead49a57
RS
3400 /* A type (3) got entry in the single-GOT case. We use the symbol's
3401 hash table entry to track its index. */
3402 if (entry->d.h->tls_type & GOT_TLS_OFFSET_DONE)
3403 return 1;
3404 entry->d.h->tls_type |= GOT_TLS_OFFSET_DONE;
3405 entry->d.h->tls_got_offset = next_index;
cbf2cba4 3406 tls_type = entry->d.h->tls_type;
ead49a57
RS
3407 }
3408 else
3409 {
3410 if (entry->tls_type & GOT_TLS_LDM)
0f20cc35 3411 {
ead49a57
RS
3412 /* There are separate mips_got_entry objects for each input bfd
3413 that requires an LDM entry. Make sure that all LDM entries in
3414 a GOT resolve to the same index. */
3415 if (g->tls_ldm_offset != MINUS_TWO && g->tls_ldm_offset != MINUS_ONE)
4005427f 3416 {
ead49a57 3417 entry->gotidx = g->tls_ldm_offset;
4005427f
RS
3418 return 1;
3419 }
ead49a57 3420 g->tls_ldm_offset = next_index;
0f20cc35 3421 }
ead49a57 3422 entry->gotidx = next_index;
cbf2cba4 3423 tls_type = entry->tls_type;
f4416af6
AO
3424 }
3425
ead49a57 3426 /* Account for the entries we've just allocated. */
cbf2cba4 3427 if (tls_type & (GOT_TLS_GD | GOT_TLS_LDM))
0f20cc35 3428 g->tls_assigned_gotno += 2;
cbf2cba4 3429 if (tls_type & GOT_TLS_IE)
0f20cc35
DJ
3430 g->tls_assigned_gotno += 1;
3431
f4416af6
AO
3432 return 1;
3433}
3434
3435/* If passed a NULL mips_got_info in the argument, set the marker used
3436 to tell whether a global symbol needs a got entry (in the primary
3437 got) to the given VALUE.
3438
3439 If passed a pointer G to a mips_got_info in the argument (it must
3440 not be the primary GOT), compute the offset from the beginning of
3441 the (primary) GOT section to the entry in G corresponding to the
3442 global symbol. G's assigned_gotno must contain the index of the
3443 first available global GOT entry in G. VALUE must contain the size
3444 of a GOT entry in bytes. For each global GOT entry that requires a
3445 dynamic relocation, NEEDED_RELOCS is incremented, and the symbol is
4cc11e76 3446 marked as not eligible for lazy resolution through a function
f4416af6
AO
3447 stub. */
3448static int
9719ad41 3449mips_elf_set_global_got_offset (void **entryp, void *p)
f4416af6
AO
3450{
3451 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
3452 struct mips_elf_set_global_got_offset_arg *arg
3453 = (struct mips_elf_set_global_got_offset_arg *)p;
3454 struct mips_got_info *g = arg->g;
3455
0f20cc35
DJ
3456 if (g && entry->tls_type != GOT_NORMAL)
3457 arg->needed_relocs +=
3458 mips_tls_got_relocs (arg->info, entry->tls_type,
3459 entry->symndx == -1 ? &entry->d.h->root : NULL);
3460
f4416af6 3461 if (entry->abfd != NULL && entry->symndx == -1
0f20cc35 3462 && entry->d.h->root.dynindx != -1
720199d6 3463 && !entry->d.h->forced_local
0f20cc35 3464 && entry->d.h->tls_type == GOT_NORMAL)
f4416af6
AO
3465 {
3466 if (g)
3467 {
3468 BFD_ASSERT (g->global_gotsym == NULL);
3469
3470 entry->gotidx = arg->value * (long) g->assigned_gotno++;
f4416af6
AO
3471 if (arg->info->shared
3472 || (elf_hash_table (arg->info)->dynamic_sections_created
f5385ebf
AM
3473 && entry->d.h->root.def_dynamic
3474 && !entry->d.h->root.def_regular))
f4416af6
AO
3475 ++arg->needed_relocs;
3476 }
3477 else
3478 entry->d.h->root.got.offset = arg->value;
3479 }
3480
3481 return 1;
3482}
3483
0626d451
RS
3484/* Mark any global symbols referenced in the GOT we are iterating over
3485 as inelligible for lazy resolution stubs. */
3486static int
9719ad41 3487mips_elf_set_no_stub (void **entryp, void *p ATTRIBUTE_UNUSED)
0626d451
RS
3488{
3489 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
3490
3491 if (entry->abfd != NULL
3492 && entry->symndx == -1
3493 && entry->d.h->root.dynindx != -1)
3494 entry->d.h->no_fn_stub = TRUE;
3495
3496 return 1;
3497}
3498
f4416af6
AO
3499/* Follow indirect and warning hash entries so that each got entry
3500 points to the final symbol definition. P must point to a pointer
3501 to the hash table we're traversing. Since this traversal may
3502 modify the hash table, we set this pointer to NULL to indicate
3503 we've made a potentially-destructive change to the hash table, so
3504 the traversal must be restarted. */
3505static int
9719ad41 3506mips_elf_resolve_final_got_entry (void **entryp, void *p)
f4416af6
AO
3507{
3508 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
3509 htab_t got_entries = *(htab_t *)p;
3510
3511 if (entry->abfd != NULL && entry->symndx == -1)
3512 {
3513 struct mips_elf_link_hash_entry *h = entry->d.h;
3514
3515 while (h->root.root.type == bfd_link_hash_indirect
3516 || h->root.root.type == bfd_link_hash_warning)
3517 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
3518
3519 if (entry->d.h == h)
3520 return 1;
143d77c5 3521
f4416af6
AO
3522 entry->d.h = h;
3523
3524 /* If we can't find this entry with the new bfd hash, re-insert
3525 it, and get the traversal restarted. */
3526 if (! htab_find (got_entries, entry))
3527 {
3528 htab_clear_slot (got_entries, entryp);
3529 entryp = htab_find_slot (got_entries, entry, INSERT);
3530 if (! *entryp)
3531 *entryp = entry;
3532 /* Abort the traversal, since the whole table may have
3533 moved, and leave it up to the parent to restart the
3534 process. */
3535 *(htab_t *)p = NULL;
3536 return 0;
3537 }
3538 /* We might want to decrement the global_gotno count, but it's
3539 either too early or too late for that at this point. */
3540 }
143d77c5 3541
f4416af6
AO
3542 return 1;
3543}
3544
3545/* Turn indirect got entries in a got_entries table into their final
3546 locations. */
3547static void
9719ad41 3548mips_elf_resolve_final_got_entries (struct mips_got_info *g)
f4416af6
AO
3549{
3550 htab_t got_entries;
3551
3552 do
3553 {
3554 got_entries = g->got_entries;
3555
3556 htab_traverse (got_entries,
3557 mips_elf_resolve_final_got_entry,
3558 &got_entries);
3559 }
3560 while (got_entries == NULL);
3561}
3562
3563/* Return the offset of an input bfd IBFD's GOT from the beginning of
3564 the primary GOT. */
3565static bfd_vma
9719ad41 3566mips_elf_adjust_gp (bfd *abfd, struct mips_got_info *g, bfd *ibfd)
f4416af6
AO
3567{
3568 if (g->bfd2got == NULL)
3569 return 0;
3570
3571 g = mips_elf_got_for_ibfd (g, ibfd);
3572 if (! g)
3573 return 0;
3574
3575 BFD_ASSERT (g->next);
3576
3577 g = g->next;
143d77c5 3578
0f20cc35
DJ
3579 return (g->local_gotno + g->global_gotno + g->tls_gotno)
3580 * MIPS_ELF_GOT_SIZE (abfd);
f4416af6
AO
3581}
3582
3583/* Turn a single GOT that is too big for 16-bit addressing into
3584 a sequence of GOTs, each one 16-bit addressable. */
3585
3586static bfd_boolean
9719ad41
RS
3587mips_elf_multi_got (bfd *abfd, struct bfd_link_info *info,
3588 struct mips_got_info *g, asection *got,
3589 bfd_size_type pages)
f4416af6
AO
3590{
3591 struct mips_elf_got_per_bfd_arg got_per_bfd_arg;
3592 struct mips_elf_set_global_got_offset_arg set_got_offset_arg;
3593 struct mips_got_info *gg;
3594 unsigned int assign;
3595
3596 g->bfd2got = htab_try_create (1, mips_elf_bfd2got_entry_hash,
9719ad41 3597 mips_elf_bfd2got_entry_eq, NULL);
f4416af6
AO
3598 if (g->bfd2got == NULL)
3599 return FALSE;
3600
3601 got_per_bfd_arg.bfd2got = g->bfd2got;
3602 got_per_bfd_arg.obfd = abfd;
3603 got_per_bfd_arg.info = info;
3604
3605 /* Count how many GOT entries each input bfd requires, creating a
3606 map from bfd to got info while at that. */
f4416af6
AO
3607 htab_traverse (g->got_entries, mips_elf_make_got_per_bfd, &got_per_bfd_arg);
3608 if (got_per_bfd_arg.obfd == NULL)
3609 return FALSE;
3610
c224138d
RS
3611 /* Also count how many page entries each input bfd requires. */
3612 htab_traverse (g->got_page_entries, mips_elf_make_got_pages_per_bfd,
3613 &got_per_bfd_arg);
3614 if (got_per_bfd_arg.obfd == NULL)
3615 return FALSE;
3616
f4416af6
AO
3617 got_per_bfd_arg.current = NULL;
3618 got_per_bfd_arg.primary = NULL;
0a44bf69 3619 got_per_bfd_arg.max_count = ((MIPS_ELF_GOT_MAX_SIZE (info)
f4416af6 3620 / MIPS_ELF_GOT_SIZE (abfd))
c224138d
RS
3621 - MIPS_RESERVED_GOTNO (info));
3622 got_per_bfd_arg.max_pages = pages;
0f20cc35
DJ
3623 /* The number of globals that will be included in the primary GOT.
3624 See the calls to mips_elf_set_global_got_offset below for more
3625 information. */
3626 got_per_bfd_arg.global_count = g->global_gotno;
f4416af6
AO
3627
3628 /* Try to merge the GOTs of input bfds together, as long as they
3629 don't seem to exceed the maximum GOT size, choosing one of them
3630 to be the primary GOT. */
3631 htab_traverse (g->bfd2got, mips_elf_merge_gots, &got_per_bfd_arg);
3632 if (got_per_bfd_arg.obfd == NULL)
3633 return FALSE;
3634
0f20cc35 3635 /* If we do not find any suitable primary GOT, create an empty one. */
f4416af6
AO
3636 if (got_per_bfd_arg.primary == NULL)
3637 {
3638 g->next = (struct mips_got_info *)
3639 bfd_alloc (abfd, sizeof (struct mips_got_info));
3640 if (g->next == NULL)
3641 return FALSE;
3642
3643 g->next->global_gotsym = NULL;
3644 g->next->global_gotno = 0;
3645 g->next->local_gotno = 0;
c224138d 3646 g->next->page_gotno = 0;
0f20cc35 3647 g->next->tls_gotno = 0;
f4416af6 3648 g->next->assigned_gotno = 0;
0f20cc35
DJ
3649 g->next->tls_assigned_gotno = 0;
3650 g->next->tls_ldm_offset = MINUS_ONE;
f4416af6
AO
3651 g->next->got_entries = htab_try_create (1, mips_elf_multi_got_entry_hash,
3652 mips_elf_multi_got_entry_eq,
9719ad41 3653 NULL);
f4416af6
AO
3654 if (g->next->got_entries == NULL)
3655 return FALSE;
c224138d
RS
3656 g->next->got_page_entries = htab_try_create (1, mips_got_page_entry_hash,
3657 mips_got_page_entry_eq,
3658 NULL);
3659 if (g->next->got_page_entries == NULL)
3660 return FALSE;
f4416af6
AO
3661 g->next->bfd2got = NULL;
3662 }
3663 else
3664 g->next = got_per_bfd_arg.primary;
3665 g->next->next = got_per_bfd_arg.current;
3666
3667 /* GG is now the master GOT, and G is the primary GOT. */
3668 gg = g;
3669 g = g->next;
3670
3671 /* Map the output bfd to the primary got. That's what we're going
3672 to use for bfds that use GOT16 or GOT_PAGE relocations that we
3673 didn't mark in check_relocs, and we want a quick way to find it.
3674 We can't just use gg->next because we're going to reverse the
3675 list. */
3676 {
3677 struct mips_elf_bfd2got_hash *bfdgot;
3678 void **bfdgotp;
143d77c5 3679
f4416af6
AO
3680 bfdgot = (struct mips_elf_bfd2got_hash *)bfd_alloc
3681 (abfd, sizeof (struct mips_elf_bfd2got_hash));
3682
3683 if (bfdgot == NULL)
3684 return FALSE;
3685
3686 bfdgot->bfd = abfd;
3687 bfdgot->g = g;
3688 bfdgotp = htab_find_slot (gg->bfd2got, bfdgot, INSERT);
3689
3690 BFD_ASSERT (*bfdgotp == NULL);
3691 *bfdgotp = bfdgot;
3692 }
3693
3694 /* The IRIX dynamic linker requires every symbol that is referenced
3695 in a dynamic relocation to be present in the primary GOT, so
3696 arrange for them to appear after those that are actually
3697 referenced.
3698
3699 GNU/Linux could very well do without it, but it would slow down
3700 the dynamic linker, since it would have to resolve every dynamic
3701 symbol referenced in other GOTs more than once, without help from
3702 the cache. Also, knowing that every external symbol has a GOT
3703 helps speed up the resolution of local symbols too, so GNU/Linux
3704 follows IRIX's practice.
143d77c5 3705
f4416af6
AO
3706 The number 2 is used by mips_elf_sort_hash_table_f to count
3707 global GOT symbols that are unreferenced in the primary GOT, with
3708 an initial dynamic index computed from gg->assigned_gotno, where
3709 the number of unreferenced global entries in the primary GOT is
3710 preserved. */
3711 if (1)
3712 {
3713 gg->assigned_gotno = gg->global_gotno - g->global_gotno;
3714 g->global_gotno = gg->global_gotno;
3715 set_got_offset_arg.value = 2;
3716 }
3717 else
3718 {
3719 /* This could be used for dynamic linkers that don't optimize
3720 symbol resolution while applying relocations so as to use
3721 primary GOT entries or assuming the symbol is locally-defined.
3722 With this code, we assign lower dynamic indices to global
3723 symbols that are not referenced in the primary GOT, so that
3724 their entries can be omitted. */
3725 gg->assigned_gotno = 0;
3726 set_got_offset_arg.value = -1;
3727 }
3728
3729 /* Reorder dynamic symbols as described above (which behavior
3730 depends on the setting of VALUE). */
3731 set_got_offset_arg.g = NULL;
3732 htab_traverse (gg->got_entries, mips_elf_set_global_got_offset,
3733 &set_got_offset_arg);
3734 set_got_offset_arg.value = 1;
3735 htab_traverse (g->got_entries, mips_elf_set_global_got_offset,
3736 &set_got_offset_arg);
3737 if (! mips_elf_sort_hash_table (info, 1))
3738 return FALSE;
3739
3740 /* Now go through the GOTs assigning them offset ranges.
3741 [assigned_gotno, local_gotno[ will be set to the range of local
3742 entries in each GOT. We can then compute the end of a GOT by
3743 adding local_gotno to global_gotno. We reverse the list and make
3744 it circular since then we'll be able to quickly compute the
3745 beginning of a GOT, by computing the end of its predecessor. To
3746 avoid special cases for the primary GOT, while still preserving
3747 assertions that are valid for both single- and multi-got links,
3748 we arrange for the main got struct to have the right number of
3749 global entries, but set its local_gotno such that the initial
3750 offset of the primary GOT is zero. Remember that the primary GOT
3751 will become the last item in the circular linked list, so it
3752 points back to the master GOT. */
3753 gg->local_gotno = -g->global_gotno;
3754 gg->global_gotno = g->global_gotno;
0f20cc35 3755 gg->tls_gotno = 0;
f4416af6
AO
3756 assign = 0;
3757 gg->next = gg;
3758
3759 do
3760 {
3761 struct mips_got_info *gn;
3762
0a44bf69 3763 assign += MIPS_RESERVED_GOTNO (info);
f4416af6 3764 g->assigned_gotno = assign;
c224138d
RS
3765 g->local_gotno += assign;
3766 g->local_gotno += (pages < g->page_gotno ? pages : g->page_gotno);
0f20cc35
DJ
3767 assign = g->local_gotno + g->global_gotno + g->tls_gotno;
3768
ead49a57
RS
3769 /* Take g out of the direct list, and push it onto the reversed
3770 list that gg points to. g->next is guaranteed to be nonnull after
3771 this operation, as required by mips_elf_initialize_tls_index. */
3772 gn = g->next;
3773 g->next = gg->next;
3774 gg->next = g;
3775
0f20cc35
DJ
3776 /* Set up any TLS entries. We always place the TLS entries after
3777 all non-TLS entries. */
3778 g->tls_assigned_gotno = g->local_gotno + g->global_gotno;
3779 htab_traverse (g->got_entries, mips_elf_initialize_tls_index, g);
f4416af6 3780
ead49a57 3781 /* Move onto the next GOT. It will be a secondary GOT if nonull. */
f4416af6 3782 g = gn;
0626d451
RS
3783
3784 /* Mark global symbols in every non-primary GOT as ineligible for
3785 stubs. */
3786 if (g)
3787 htab_traverse (g->got_entries, mips_elf_set_no_stub, NULL);
f4416af6
AO
3788 }
3789 while (g);
3790
eea6121a 3791 got->size = (gg->next->local_gotno
0f20cc35
DJ
3792 + gg->next->global_gotno
3793 + gg->next->tls_gotno) * MIPS_ELF_GOT_SIZE (abfd);
143d77c5 3794
f4416af6
AO
3795 return TRUE;
3796}
143d77c5 3797
b49e97c9
TS
3798\f
3799/* Returns the first relocation of type r_type found, beginning with
3800 RELOCATION. RELEND is one-past-the-end of the relocation table. */
3801
3802static const Elf_Internal_Rela *
9719ad41
RS
3803mips_elf_next_relocation (bfd *abfd ATTRIBUTE_UNUSED, unsigned int r_type,
3804 const Elf_Internal_Rela *relocation,
3805 const Elf_Internal_Rela *relend)
b49e97c9 3806{
c000e262
TS
3807 unsigned long r_symndx = ELF_R_SYM (abfd, relocation->r_info);
3808
b49e97c9
TS
3809 while (relocation < relend)
3810 {
c000e262
TS
3811 if (ELF_R_TYPE (abfd, relocation->r_info) == r_type
3812 && ELF_R_SYM (abfd, relocation->r_info) == r_symndx)
b49e97c9
TS
3813 return relocation;
3814
3815 ++relocation;
3816 }
3817
3818 /* We didn't find it. */
b49e97c9
TS
3819 return NULL;
3820}
3821
3822/* Return whether a relocation is against a local symbol. */
3823
b34976b6 3824static bfd_boolean
9719ad41
RS
3825mips_elf_local_relocation_p (bfd *input_bfd,
3826 const Elf_Internal_Rela *relocation,
3827 asection **local_sections,
3828 bfd_boolean check_forced)
b49e97c9
TS
3829{
3830 unsigned long r_symndx;
3831 Elf_Internal_Shdr *symtab_hdr;
3832 struct mips_elf_link_hash_entry *h;
3833 size_t extsymoff;
3834
3835 r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
3836 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3837 extsymoff = (elf_bad_symtab (input_bfd)) ? 0 : symtab_hdr->sh_info;
3838
3839 if (r_symndx < extsymoff)
b34976b6 3840 return TRUE;
b49e97c9 3841 if (elf_bad_symtab (input_bfd) && local_sections[r_symndx] != NULL)
b34976b6 3842 return TRUE;
b49e97c9
TS
3843
3844 if (check_forced)
3845 {
3846 /* Look up the hash table to check whether the symbol
3847 was forced local. */
3848 h = (struct mips_elf_link_hash_entry *)
3849 elf_sym_hashes (input_bfd) [r_symndx - extsymoff];
3850 /* Find the real hash-table entry for this symbol. */
3851 while (h->root.root.type == bfd_link_hash_indirect
3852 || h->root.root.type == bfd_link_hash_warning)
3853 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
f5385ebf 3854 if (h->root.forced_local)
b34976b6 3855 return TRUE;
b49e97c9
TS
3856 }
3857
b34976b6 3858 return FALSE;
b49e97c9
TS
3859}
3860\f
3861/* Sign-extend VALUE, which has the indicated number of BITS. */
3862
a7ebbfdf 3863bfd_vma
9719ad41 3864_bfd_mips_elf_sign_extend (bfd_vma value, int bits)
b49e97c9
TS
3865{
3866 if (value & ((bfd_vma) 1 << (bits - 1)))
3867 /* VALUE is negative. */
3868 value |= ((bfd_vma) - 1) << bits;
3869
3870 return value;
3871}
3872
3873/* Return non-zero if the indicated VALUE has overflowed the maximum
4cc11e76 3874 range expressible by a signed number with the indicated number of
b49e97c9
TS
3875 BITS. */
3876
b34976b6 3877static bfd_boolean
9719ad41 3878mips_elf_overflow_p (bfd_vma value, int bits)
b49e97c9
TS
3879{
3880 bfd_signed_vma svalue = (bfd_signed_vma) value;
3881
3882 if (svalue > (1 << (bits - 1)) - 1)
3883 /* The value is too big. */
b34976b6 3884 return TRUE;
b49e97c9
TS
3885 else if (svalue < -(1 << (bits - 1)))
3886 /* The value is too small. */
b34976b6 3887 return TRUE;
b49e97c9
TS
3888
3889 /* All is well. */
b34976b6 3890 return FALSE;
b49e97c9
TS
3891}
3892
3893/* Calculate the %high function. */
3894
3895static bfd_vma
9719ad41 3896mips_elf_high (bfd_vma value)
b49e97c9
TS
3897{
3898 return ((value + (bfd_vma) 0x8000) >> 16) & 0xffff;
3899}
3900
3901/* Calculate the %higher function. */
3902
3903static bfd_vma
9719ad41 3904mips_elf_higher (bfd_vma value ATTRIBUTE_UNUSED)
b49e97c9
TS
3905{
3906#ifdef BFD64
3907 return ((value + (bfd_vma) 0x80008000) >> 32) & 0xffff;
3908#else
3909 abort ();
c5ae1840 3910 return MINUS_ONE;
b49e97c9
TS
3911#endif
3912}
3913
3914/* Calculate the %highest function. */
3915
3916static bfd_vma
9719ad41 3917mips_elf_highest (bfd_vma value ATTRIBUTE_UNUSED)
b49e97c9
TS
3918{
3919#ifdef BFD64
b15e6682 3920 return ((value + (((bfd_vma) 0x8000 << 32) | 0x80008000)) >> 48) & 0xffff;
b49e97c9
TS
3921#else
3922 abort ();
c5ae1840 3923 return MINUS_ONE;
b49e97c9
TS
3924#endif
3925}
3926\f
3927/* Create the .compact_rel section. */
3928
b34976b6 3929static bfd_boolean
9719ad41
RS
3930mips_elf_create_compact_rel_section
3931 (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
b49e97c9
TS
3932{
3933 flagword flags;
3934 register asection *s;
3935
3936 if (bfd_get_section_by_name (abfd, ".compact_rel") == NULL)
3937 {
3938 flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED
3939 | SEC_READONLY);
3940
3496cb2a 3941 s = bfd_make_section_with_flags (abfd, ".compact_rel", flags);
b49e97c9 3942 if (s == NULL
b49e97c9
TS
3943 || ! bfd_set_section_alignment (abfd, s,
3944 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
b34976b6 3945 return FALSE;
b49e97c9 3946
eea6121a 3947 s->size = sizeof (Elf32_External_compact_rel);
b49e97c9
TS
3948 }
3949
b34976b6 3950 return TRUE;
b49e97c9
TS
3951}
3952
3953/* Create the .got section to hold the global offset table. */
3954
b34976b6 3955static bfd_boolean
9719ad41
RS
3956mips_elf_create_got_section (bfd *abfd, struct bfd_link_info *info,
3957 bfd_boolean maybe_exclude)
b49e97c9
TS
3958{
3959 flagword flags;
3960 register asection *s;
3961 struct elf_link_hash_entry *h;
14a793b2 3962 struct bfd_link_hash_entry *bh;
b49e97c9
TS
3963 struct mips_got_info *g;
3964 bfd_size_type amt;
0a44bf69
RS
3965 struct mips_elf_link_hash_table *htab;
3966
3967 htab = mips_elf_hash_table (info);
b49e97c9
TS
3968
3969 /* This function may be called more than once. */
f4416af6
AO
3970 s = mips_elf_got_section (abfd, TRUE);
3971 if (s)
3972 {
3973 if (! maybe_exclude)
3974 s->flags &= ~SEC_EXCLUDE;
3975 return TRUE;
3976 }
b49e97c9
TS
3977
3978 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3979 | SEC_LINKER_CREATED);
3980
f4416af6
AO
3981 if (maybe_exclude)
3982 flags |= SEC_EXCLUDE;
3983
72b4917c
TS
3984 /* We have to use an alignment of 2**4 here because this is hardcoded
3985 in the function stub generation and in the linker script. */
3496cb2a 3986 s = bfd_make_section_with_flags (abfd, ".got", flags);
b49e97c9 3987 if (s == NULL
72b4917c 3988 || ! bfd_set_section_alignment (abfd, s, 4))
b34976b6 3989 return FALSE;
b49e97c9
TS
3990
3991 /* Define the symbol _GLOBAL_OFFSET_TABLE_. We don't do this in the
3992 linker script because we don't want to define the symbol if we
3993 are not creating a global offset table. */
14a793b2 3994 bh = NULL;
b49e97c9
TS
3995 if (! (_bfd_generic_link_add_one_symbol
3996 (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
9719ad41 3997 0, NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 3998 return FALSE;
14a793b2
AM
3999
4000 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
4001 h->non_elf = 0;
4002 h->def_regular = 1;
b49e97c9 4003 h->type = STT_OBJECT;
d329bcd1 4004 elf_hash_table (info)->hgot = h;
b49e97c9
TS
4005
4006 if (info->shared
c152c796 4007 && ! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 4008 return FALSE;
b49e97c9 4009
b49e97c9 4010 amt = sizeof (struct mips_got_info);
9719ad41 4011 g = bfd_alloc (abfd, amt);
b49e97c9 4012 if (g == NULL)
b34976b6 4013 return FALSE;
b49e97c9 4014 g->global_gotsym = NULL;
e3d54347 4015 g->global_gotno = 0;
0f20cc35 4016 g->tls_gotno = 0;
0a44bf69 4017 g->local_gotno = MIPS_RESERVED_GOTNO (info);
c224138d 4018 g->page_gotno = 0;
0a44bf69 4019 g->assigned_gotno = MIPS_RESERVED_GOTNO (info);
f4416af6
AO
4020 g->bfd2got = NULL;
4021 g->next = NULL;
0f20cc35 4022 g->tls_ldm_offset = MINUS_ONE;
b15e6682 4023 g->got_entries = htab_try_create (1, mips_elf_got_entry_hash,
9719ad41 4024 mips_elf_got_entry_eq, NULL);
b15e6682
AO
4025 if (g->got_entries == NULL)
4026 return FALSE;
c224138d
RS
4027 g->got_page_entries = htab_try_create (1, mips_got_page_entry_hash,
4028 mips_got_page_entry_eq, NULL);
4029 if (g->got_page_entries == NULL)
4030 return FALSE;
f0abc2a1
AM
4031 mips_elf_section_data (s)->u.got_info = g;
4032 mips_elf_section_data (s)->elf.this_hdr.sh_flags
b49e97c9
TS
4033 |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
4034
0a44bf69
RS
4035 /* VxWorks also needs a .got.plt section. */
4036 if (htab->is_vxworks)
4037 {
4038 s = bfd_make_section_with_flags (abfd, ".got.plt",
4039 SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
4040 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4041 if (s == NULL || !bfd_set_section_alignment (abfd, s, 4))
4042 return FALSE;
4043
4044 htab->sgotplt = s;
4045 }
b34976b6 4046 return TRUE;
b49e97c9 4047}
b49e97c9 4048\f
0a44bf69
RS
4049/* Return true if H refers to the special VxWorks __GOTT_BASE__ or
4050 __GOTT_INDEX__ symbols. These symbols are only special for
4051 shared objects; they are not used in executables. */
4052
4053static bfd_boolean
4054is_gott_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h)
4055{
4056 return (mips_elf_hash_table (info)->is_vxworks
4057 && info->shared
4058 && (strcmp (h->root.root.string, "__GOTT_BASE__") == 0
4059 || strcmp (h->root.root.string, "__GOTT_INDEX__") == 0));
4060}
4061\f
b49e97c9
TS
4062/* Calculate the value produced by the RELOCATION (which comes from
4063 the INPUT_BFD). The ADDEND is the addend to use for this
4064 RELOCATION; RELOCATION->R_ADDEND is ignored.
4065
4066 The result of the relocation calculation is stored in VALUEP.
4067 REQUIRE_JALXP indicates whether or not the opcode used with this
4068 relocation must be JALX.
4069
4070 This function returns bfd_reloc_continue if the caller need take no
4071 further action regarding this relocation, bfd_reloc_notsupported if
4072 something goes dramatically wrong, bfd_reloc_overflow if an
4073 overflow occurs, and bfd_reloc_ok to indicate success. */
4074
4075static bfd_reloc_status_type
9719ad41
RS
4076mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
4077 asection *input_section,
4078 struct bfd_link_info *info,
4079 const Elf_Internal_Rela *relocation,
4080 bfd_vma addend, reloc_howto_type *howto,
4081 Elf_Internal_Sym *local_syms,
4082 asection **local_sections, bfd_vma *valuep,
4083 const char **namep, bfd_boolean *require_jalxp,
4084 bfd_boolean save_addend)
b49e97c9
TS
4085{
4086 /* The eventual value we will return. */
4087 bfd_vma value;
4088 /* The address of the symbol against which the relocation is
4089 occurring. */
4090 bfd_vma symbol = 0;
4091 /* The final GP value to be used for the relocatable, executable, or
4092 shared object file being produced. */
4093 bfd_vma gp = MINUS_ONE;
4094 /* The place (section offset or address) of the storage unit being
4095 relocated. */
4096 bfd_vma p;
4097 /* The value of GP used to create the relocatable object. */
4098 bfd_vma gp0 = MINUS_ONE;
4099 /* The offset into the global offset table at which the address of
4100 the relocation entry symbol, adjusted by the addend, resides
4101 during execution. */
4102 bfd_vma g = MINUS_ONE;
4103 /* The section in which the symbol referenced by the relocation is
4104 located. */
4105 asection *sec = NULL;
4106 struct mips_elf_link_hash_entry *h = NULL;
b34976b6 4107 /* TRUE if the symbol referred to by this relocation is a local
b49e97c9 4108 symbol. */
b34976b6
AM
4109 bfd_boolean local_p, was_local_p;
4110 /* TRUE if the symbol referred to by this relocation is "_gp_disp". */
4111 bfd_boolean gp_disp_p = FALSE;
bbe506e8
TS
4112 /* TRUE if the symbol referred to by this relocation is
4113 "__gnu_local_gp". */
4114 bfd_boolean gnu_local_gp_p = FALSE;
b49e97c9
TS
4115 Elf_Internal_Shdr *symtab_hdr;
4116 size_t extsymoff;
4117 unsigned long r_symndx;
4118 int r_type;
b34976b6 4119 /* TRUE if overflow occurred during the calculation of the
b49e97c9 4120 relocation value. */
b34976b6
AM
4121 bfd_boolean overflowed_p;
4122 /* TRUE if this relocation refers to a MIPS16 function. */
4123 bfd_boolean target_is_16_bit_code_p = FALSE;
0a44bf69
RS
4124 struct mips_elf_link_hash_table *htab;
4125 bfd *dynobj;
4126
4127 dynobj = elf_hash_table (info)->dynobj;
4128 htab = mips_elf_hash_table (info);
b49e97c9
TS
4129
4130 /* Parse the relocation. */
4131 r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
4132 r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
4133 p = (input_section->output_section->vma
4134 + input_section->output_offset
4135 + relocation->r_offset);
4136
4137 /* Assume that there will be no overflow. */
b34976b6 4138 overflowed_p = FALSE;
b49e97c9
TS
4139
4140 /* Figure out whether or not the symbol is local, and get the offset
4141 used in the array of hash table entries. */
4142 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4143 local_p = mips_elf_local_relocation_p (input_bfd, relocation,
b34976b6 4144 local_sections, FALSE);
bce03d3d 4145 was_local_p = local_p;
b49e97c9
TS
4146 if (! elf_bad_symtab (input_bfd))
4147 extsymoff = symtab_hdr->sh_info;
4148 else
4149 {
4150 /* The symbol table does not follow the rule that local symbols
4151 must come before globals. */
4152 extsymoff = 0;
4153 }
4154
4155 /* Figure out the value of the symbol. */
4156 if (local_p)
4157 {
4158 Elf_Internal_Sym *sym;
4159
4160 sym = local_syms + r_symndx;
4161 sec = local_sections[r_symndx];
4162
4163 symbol = sec->output_section->vma + sec->output_offset;
d4df96e6
L
4164 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION
4165 || (sec->flags & SEC_MERGE))
b49e97c9 4166 symbol += sym->st_value;
d4df96e6
L
4167 if ((sec->flags & SEC_MERGE)
4168 && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4169 {
4170 addend = _bfd_elf_rel_local_sym (abfd, sym, &sec, addend);
4171 addend -= symbol;
4172 addend += sec->output_section->vma + sec->output_offset;
4173 }
b49e97c9
TS
4174
4175 /* MIPS16 text labels should be treated as odd. */
4176 if (sym->st_other == STO_MIPS16)
4177 ++symbol;
4178
4179 /* Record the name of this symbol, for our caller. */
4180 *namep = bfd_elf_string_from_elf_section (input_bfd,
4181 symtab_hdr->sh_link,
4182 sym->st_name);
4183 if (*namep == '\0')
4184 *namep = bfd_section_name (input_bfd, sec);
4185
4186 target_is_16_bit_code_p = (sym->st_other == STO_MIPS16);
4187 }
4188 else
4189 {
560e09e9
NC
4190 /* ??? Could we use RELOC_FOR_GLOBAL_SYMBOL here ? */
4191
b49e97c9
TS
4192 /* For global symbols we look up the symbol in the hash-table. */
4193 h = ((struct mips_elf_link_hash_entry *)
4194 elf_sym_hashes (input_bfd) [r_symndx - extsymoff]);
4195 /* Find the real hash-table entry for this symbol. */
4196 while (h->root.root.type == bfd_link_hash_indirect
4197 || h->root.root.type == bfd_link_hash_warning)
4198 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
4199
4200 /* Record the name of this symbol, for our caller. */
4201 *namep = h->root.root.root.string;
4202
4203 /* See if this is the special _gp_disp symbol. Note that such a
4204 symbol must always be a global symbol. */
560e09e9 4205 if (strcmp (*namep, "_gp_disp") == 0
b49e97c9
TS
4206 && ! NEWABI_P (input_bfd))
4207 {
4208 /* Relocations against _gp_disp are permitted only with
4209 R_MIPS_HI16 and R_MIPS_LO16 relocations. */
d6f16593
MR
4210 if (r_type != R_MIPS_HI16 && r_type != R_MIPS_LO16
4211 && r_type != R_MIPS16_HI16 && r_type != R_MIPS16_LO16)
b49e97c9
TS
4212 return bfd_reloc_notsupported;
4213
b34976b6 4214 gp_disp_p = TRUE;
b49e97c9 4215 }
bbe506e8
TS
4216 /* See if this is the special _gp symbol. Note that such a
4217 symbol must always be a global symbol. */
4218 else if (strcmp (*namep, "__gnu_local_gp") == 0)
4219 gnu_local_gp_p = TRUE;
4220
4221
b49e97c9
TS
4222 /* If this symbol is defined, calculate its address. Note that
4223 _gp_disp is a magic symbol, always implicitly defined by the
4224 linker, so it's inappropriate to check to see whether or not
4225 its defined. */
4226 else if ((h->root.root.type == bfd_link_hash_defined
4227 || h->root.root.type == bfd_link_hash_defweak)
4228 && h->root.root.u.def.section)
4229 {
4230 sec = h->root.root.u.def.section;
4231 if (sec->output_section)
4232 symbol = (h->root.root.u.def.value
4233 + sec->output_section->vma
4234 + sec->output_offset);
4235 else
4236 symbol = h->root.root.u.def.value;
4237 }
4238 else if (h->root.root.type == bfd_link_hash_undefweak)
4239 /* We allow relocations against undefined weak symbols, giving
4240 it the value zero, so that you can undefined weak functions
4241 and check to see if they exist by looking at their
4242 addresses. */
4243 symbol = 0;
59c2e50f 4244 else if (info->unresolved_syms_in_objects == RM_IGNORE
b49e97c9
TS
4245 && ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
4246 symbol = 0;
a4d0f181
TS
4247 else if (strcmp (*namep, SGI_COMPAT (input_bfd)
4248 ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING") == 0)
b49e97c9
TS
4249 {
4250 /* If this is a dynamic link, we should have created a
4251 _DYNAMIC_LINK symbol or _DYNAMIC_LINKING(for normal mips) symbol
4252 in in _bfd_mips_elf_create_dynamic_sections.
4253 Otherwise, we should define the symbol with a value of 0.
4254 FIXME: It should probably get into the symbol table
4255 somehow as well. */
4256 BFD_ASSERT (! info->shared);
4257 BFD_ASSERT (bfd_get_section_by_name (abfd, ".dynamic") == NULL);
4258 symbol = 0;
4259 }
5e2b0d47
NC
4260 else if (ELF_MIPS_IS_OPTIONAL (h->root.other))
4261 {
4262 /* This is an optional symbol - an Irix specific extension to the
4263 ELF spec. Ignore it for now.
4264 XXX - FIXME - there is more to the spec for OPTIONAL symbols
4265 than simply ignoring them, but we do not handle this for now.
4266 For information see the "64-bit ELF Object File Specification"
4267 which is available from here:
4268 http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf */
4269 symbol = 0;
4270 }
b49e97c9
TS
4271 else
4272 {
4273 if (! ((*info->callbacks->undefined_symbol)
4274 (info, h->root.root.root.string, input_bfd,
4275 input_section, relocation->r_offset,
59c2e50f
L
4276 (info->unresolved_syms_in_objects == RM_GENERATE_ERROR)
4277 || ELF_ST_VISIBILITY (h->root.other))))
b49e97c9
TS
4278 return bfd_reloc_undefined;
4279 symbol = 0;
4280 }
4281
4282 target_is_16_bit_code_p = (h->root.other == STO_MIPS16);
4283 }
4284
4285 /* If this is a 32- or 64-bit call to a 16-bit function with a stub, we
4286 need to redirect the call to the stub, unless we're already *in*
4287 a stub. */
1049f94e 4288 if (r_type != R_MIPS16_26 && !info->relocatable
b49e97c9 4289 && ((h != NULL && h->fn_stub != NULL)
b9d58d71
TS
4290 || (local_p
4291 && elf_tdata (input_bfd)->local_stubs != NULL
b49e97c9 4292 && elf_tdata (input_bfd)->local_stubs[r_symndx] != NULL))
b9d58d71 4293 && !mips16_stub_section_p (input_bfd, input_section))
b49e97c9
TS
4294 {
4295 /* This is a 32- or 64-bit call to a 16-bit function. We should
4296 have already noticed that we were going to need the
4297 stub. */
4298 if (local_p)
4299 sec = elf_tdata (input_bfd)->local_stubs[r_symndx];
4300 else
4301 {
4302 BFD_ASSERT (h->need_fn_stub);
4303 sec = h->fn_stub;
4304 }
4305
4306 symbol = sec->output_section->vma + sec->output_offset;
f38c2df5
TS
4307 /* The target is 16-bit, but the stub isn't. */
4308 target_is_16_bit_code_p = FALSE;
b49e97c9
TS
4309 }
4310 /* If this is a 16-bit call to a 32- or 64-bit function with a stub, we
4311 need to redirect the call to the stub. */
1049f94e 4312 else if (r_type == R_MIPS16_26 && !info->relocatable
b314ec0e 4313 && ((h != NULL && (h->call_stub != NULL || h->call_fp_stub != NULL))
b9d58d71
TS
4314 || (local_p
4315 && elf_tdata (input_bfd)->local_call_stubs != NULL
4316 && elf_tdata (input_bfd)->local_call_stubs[r_symndx] != NULL))
b49e97c9
TS
4317 && !target_is_16_bit_code_p)
4318 {
b9d58d71
TS
4319 if (local_p)
4320 sec = elf_tdata (input_bfd)->local_call_stubs[r_symndx];
4321 else
b49e97c9 4322 {
b9d58d71
TS
4323 /* If both call_stub and call_fp_stub are defined, we can figure
4324 out which one to use by checking which one appears in the input
4325 file. */
4326 if (h->call_stub != NULL && h->call_fp_stub != NULL)
b49e97c9 4327 {
b9d58d71
TS
4328 asection *o;
4329
4330 sec = NULL;
4331 for (o = input_bfd->sections; o != NULL; o = o->next)
b49e97c9 4332 {
b9d58d71
TS
4333 if (CALL_FP_STUB_P (bfd_get_section_name (input_bfd, o)))
4334 {
4335 sec = h->call_fp_stub;
4336 break;
4337 }
b49e97c9 4338 }
b9d58d71
TS
4339 if (sec == NULL)
4340 sec = h->call_stub;
b49e97c9 4341 }
b9d58d71 4342 else if (h->call_stub != NULL)
b49e97c9 4343 sec = h->call_stub;
b9d58d71
TS
4344 else
4345 sec = h->call_fp_stub;
4346 }
b49e97c9 4347
eea6121a 4348 BFD_ASSERT (sec->size > 0);
b49e97c9
TS
4349 symbol = sec->output_section->vma + sec->output_offset;
4350 }
4351
4352 /* Calls from 16-bit code to 32-bit code and vice versa require the
4353 special jalx instruction. */
1049f94e 4354 *require_jalxp = (!info->relocatable
b49e97c9
TS
4355 && (((r_type == R_MIPS16_26) && !target_is_16_bit_code_p)
4356 || ((r_type == R_MIPS_26) && target_is_16_bit_code_p)));
4357
4358 local_p = mips_elf_local_relocation_p (input_bfd, relocation,
b34976b6 4359 local_sections, TRUE);
b49e97c9
TS
4360
4361 /* If we haven't already determined the GOT offset, or the GP value,
4362 and we're going to need it, get it now. */
4363 switch (r_type)
4364 {
0fdc1bf1 4365 case R_MIPS_GOT_PAGE:
93a2b7ae 4366 case R_MIPS_GOT_OFST:
d25aed71
RS
4367 /* We need to decay to GOT_DISP/addend if the symbol doesn't
4368 bind locally. */
4369 local_p = local_p || _bfd_elf_symbol_refs_local_p (&h->root, info, 1);
93a2b7ae 4370 if (local_p || r_type == R_MIPS_GOT_OFST)
0fdc1bf1
AO
4371 break;
4372 /* Fall through. */
4373
b49e97c9
TS
4374 case R_MIPS_CALL16:
4375 case R_MIPS_GOT16:
4376 case R_MIPS_GOT_DISP:
4377 case R_MIPS_GOT_HI16:
4378 case R_MIPS_CALL_HI16:
4379 case R_MIPS_GOT_LO16:
4380 case R_MIPS_CALL_LO16:
0f20cc35
DJ
4381 case R_MIPS_TLS_GD:
4382 case R_MIPS_TLS_GOTTPREL:
4383 case R_MIPS_TLS_LDM:
b49e97c9 4384 /* Find the index into the GOT where this value is located. */
0f20cc35
DJ
4385 if (r_type == R_MIPS_TLS_LDM)
4386 {
0a44bf69 4387 g = mips_elf_local_got_index (abfd, input_bfd, info,
5c18022e 4388 0, 0, NULL, r_type);
0f20cc35
DJ
4389 if (g == MINUS_ONE)
4390 return bfd_reloc_outofrange;
4391 }
4392 else if (!local_p)
b49e97c9 4393 {
0a44bf69
RS
4394 /* On VxWorks, CALL relocations should refer to the .got.plt
4395 entry, which is initialized to point at the PLT stub. */
4396 if (htab->is_vxworks
4397 && (r_type == R_MIPS_CALL_HI16
4398 || r_type == R_MIPS_CALL_LO16
4399 || r_type == R_MIPS_CALL16))
4400 {
4401 BFD_ASSERT (addend == 0);
4402 BFD_ASSERT (h->root.needs_plt);
4403 g = mips_elf_gotplt_index (info, &h->root);
4404 }
4405 else
b49e97c9 4406 {
0a44bf69
RS
4407 /* GOT_PAGE may take a non-zero addend, that is ignored in a
4408 GOT_PAGE relocation that decays to GOT_DISP because the
4409 symbol turns out to be global. The addend is then added
4410 as GOT_OFST. */
4411 BFD_ASSERT (addend == 0 || r_type == R_MIPS_GOT_PAGE);
4412 g = mips_elf_global_got_index (dynobj, input_bfd,
4413 &h->root, r_type, info);
4414 if (h->tls_type == GOT_NORMAL
4415 && (! elf_hash_table(info)->dynamic_sections_created
4416 || (info->shared
4417 && (info->symbolic || h->root.forced_local)
4418 && h->root.def_regular)))
4419 {
4420 /* This is a static link or a -Bsymbolic link. The
4421 symbol is defined locally, or was forced to be local.
4422 We must initialize this entry in the GOT. */
4423 asection *sgot = mips_elf_got_section (dynobj, FALSE);
4424 MIPS_ELF_PUT_WORD (dynobj, symbol, sgot->contents + g);
4425 }
b49e97c9
TS
4426 }
4427 }
0a44bf69
RS
4428 else if (!htab->is_vxworks
4429 && (r_type == R_MIPS_CALL16 || (r_type == R_MIPS_GOT16)))
4430 /* The calculation below does not involve "g". */
b49e97c9
TS
4431 break;
4432 else
4433 {
5c18022e 4434 g = mips_elf_local_got_index (abfd, input_bfd, info,
0a44bf69 4435 symbol + addend, r_symndx, h, r_type);
b49e97c9
TS
4436 if (g == MINUS_ONE)
4437 return bfd_reloc_outofrange;
4438 }
4439
4440 /* Convert GOT indices to actual offsets. */
0a44bf69 4441 g = mips_elf_got_offset_from_index (dynobj, abfd, input_bfd, g);
b49e97c9
TS
4442 break;
4443
4444 case R_MIPS_HI16:
4445 case R_MIPS_LO16:
b49e97c9
TS
4446 case R_MIPS_GPREL16:
4447 case R_MIPS_GPREL32:
4448 case R_MIPS_LITERAL:
d6f16593
MR
4449 case R_MIPS16_HI16:
4450 case R_MIPS16_LO16:
4451 case R_MIPS16_GPREL:
b49e97c9
TS
4452 gp0 = _bfd_get_gp_value (input_bfd);
4453 gp = _bfd_get_gp_value (abfd);
0a44bf69
RS
4454 if (dynobj)
4455 gp += mips_elf_adjust_gp (abfd, mips_elf_got_info (dynobj, NULL),
f4416af6 4456 input_bfd);
b49e97c9
TS
4457 break;
4458
4459 default:
4460 break;
4461 }
4462
bbe506e8
TS
4463 if (gnu_local_gp_p)
4464 symbol = gp;
86324f90 4465
0a44bf69
RS
4466 /* Relocations against the VxWorks __GOTT_BASE__ and __GOTT_INDEX__
4467 symbols are resolved by the loader. Add them to .rela.dyn. */
4468 if (h != NULL && is_gott_symbol (info, &h->root))
4469 {
4470 Elf_Internal_Rela outrel;
4471 bfd_byte *loc;
4472 asection *s;
4473
4474 s = mips_elf_rel_dyn_section (info, FALSE);
4475 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
4476
4477 outrel.r_offset = (input_section->output_section->vma
4478 + input_section->output_offset
4479 + relocation->r_offset);
4480 outrel.r_info = ELF32_R_INFO (h->root.dynindx, r_type);
4481 outrel.r_addend = addend;
4482 bfd_elf32_swap_reloca_out (abfd, &outrel, loc);
9e3313ae
RS
4483
4484 /* If we've written this relocation for a readonly section,
4485 we need to set DF_TEXTREL again, so that we do not delete the
4486 DT_TEXTREL tag. */
4487 if (MIPS_ELF_READONLY_SECTION (input_section))
4488 info->flags |= DF_TEXTREL;
4489
0a44bf69
RS
4490 *valuep = 0;
4491 return bfd_reloc_ok;
4492 }
4493
b49e97c9
TS
4494 /* Figure out what kind of relocation is being performed. */
4495 switch (r_type)
4496 {
4497 case R_MIPS_NONE:
4498 return bfd_reloc_continue;
4499
4500 case R_MIPS_16:
a7ebbfdf 4501 value = symbol + _bfd_mips_elf_sign_extend (addend, 16);
b49e97c9
TS
4502 overflowed_p = mips_elf_overflow_p (value, 16);
4503 break;
4504
4505 case R_MIPS_32:
4506 case R_MIPS_REL32:
4507 case R_MIPS_64:
4508 if ((info->shared
0a44bf69
RS
4509 || (!htab->is_vxworks
4510 && htab->root.dynamic_sections_created
b49e97c9 4511 && h != NULL
f5385ebf
AM
4512 && h->root.def_dynamic
4513 && !h->root.def_regular))
b49e97c9
TS
4514 && r_symndx != 0
4515 && (input_section->flags & SEC_ALLOC) != 0)
4516 {
4517 /* If we're creating a shared library, or this relocation is
4518 against a symbol in a shared library, then we can't know
4519 where the symbol will end up. So, we create a relocation
4520 record in the output, and leave the job up to the dynamic
0a44bf69
RS
4521 linker.
4522
4523 In VxWorks executables, references to external symbols
4524 are handled using copy relocs or PLT stubs, so there's
4525 no need to add a dynamic relocation here. */
b49e97c9
TS
4526 value = addend;
4527 if (!mips_elf_create_dynamic_relocation (abfd,
4528 info,
4529 relocation,
4530 h,
4531 sec,
4532 symbol,
4533 &value,
4534 input_section))
4535 return bfd_reloc_undefined;
4536 }
4537 else
4538 {
4539 if (r_type != R_MIPS_REL32)
4540 value = symbol + addend;
4541 else
4542 value = addend;
4543 }
4544 value &= howto->dst_mask;
092dcd75
CD
4545 break;
4546
4547 case R_MIPS_PC32:
4548 value = symbol + addend - p;
4549 value &= howto->dst_mask;
b49e97c9
TS
4550 break;
4551
b49e97c9
TS
4552 case R_MIPS16_26:
4553 /* The calculation for R_MIPS16_26 is just the same as for an
4554 R_MIPS_26. It's only the storage of the relocated field into
4555 the output file that's different. That's handled in
4556 mips_elf_perform_relocation. So, we just fall through to the
4557 R_MIPS_26 case here. */
4558 case R_MIPS_26:
4559 if (local_p)
30ac9238 4560 value = ((addend | ((p + 4) & 0xf0000000)) + symbol) >> 2;
b49e97c9 4561 else
728b2f21
ILT
4562 {
4563 value = (_bfd_mips_elf_sign_extend (addend, 28) + symbol) >> 2;
c314987d
RS
4564 if (h->root.root.type != bfd_link_hash_undefweak)
4565 overflowed_p = (value >> 26) != ((p + 4) >> 28);
728b2f21 4566 }
b49e97c9
TS
4567 value &= howto->dst_mask;
4568 break;
4569
0f20cc35
DJ
4570 case R_MIPS_TLS_DTPREL_HI16:
4571 value = (mips_elf_high (addend + symbol - dtprel_base (info))
4572 & howto->dst_mask);
4573 break;
4574
4575 case R_MIPS_TLS_DTPREL_LO16:
741d6ea8
JM
4576 case R_MIPS_TLS_DTPREL32:
4577 case R_MIPS_TLS_DTPREL64:
0f20cc35
DJ
4578 value = (symbol + addend - dtprel_base (info)) & howto->dst_mask;
4579 break;
4580
4581 case R_MIPS_TLS_TPREL_HI16:
4582 value = (mips_elf_high (addend + symbol - tprel_base (info))
4583 & howto->dst_mask);
4584 break;
4585
4586 case R_MIPS_TLS_TPREL_LO16:
4587 value = (symbol + addend - tprel_base (info)) & howto->dst_mask;
4588 break;
4589
b49e97c9 4590 case R_MIPS_HI16:
d6f16593 4591 case R_MIPS16_HI16:
b49e97c9
TS
4592 if (!gp_disp_p)
4593 {
4594 value = mips_elf_high (addend + symbol);
4595 value &= howto->dst_mask;
4596 }
4597 else
4598 {
d6f16593
MR
4599 /* For MIPS16 ABI code we generate this sequence
4600 0: li $v0,%hi(_gp_disp)
4601 4: addiupc $v1,%lo(_gp_disp)
4602 8: sll $v0,16
4603 12: addu $v0,$v1
4604 14: move $gp,$v0
4605 So the offsets of hi and lo relocs are the same, but the
4606 $pc is four higher than $t9 would be, so reduce
4607 both reloc addends by 4. */
4608 if (r_type == R_MIPS16_HI16)
4609 value = mips_elf_high (addend + gp - p - 4);
4610 else
4611 value = mips_elf_high (addend + gp - p);
b49e97c9
TS
4612 overflowed_p = mips_elf_overflow_p (value, 16);
4613 }
4614 break;
4615
4616 case R_MIPS_LO16:
d6f16593 4617 case R_MIPS16_LO16:
b49e97c9
TS
4618 if (!gp_disp_p)
4619 value = (symbol + addend) & howto->dst_mask;
4620 else
4621 {
d6f16593
MR
4622 /* See the comment for R_MIPS16_HI16 above for the reason
4623 for this conditional. */
4624 if (r_type == R_MIPS16_LO16)
4625 value = addend + gp - p;
4626 else
4627 value = addend + gp - p + 4;
b49e97c9 4628 /* The MIPS ABI requires checking the R_MIPS_LO16 relocation
8dc1a139 4629 for overflow. But, on, say, IRIX5, relocations against
b49e97c9
TS
4630 _gp_disp are normally generated from the .cpload
4631 pseudo-op. It generates code that normally looks like
4632 this:
4633
4634 lui $gp,%hi(_gp_disp)
4635 addiu $gp,$gp,%lo(_gp_disp)
4636 addu $gp,$gp,$t9
4637
4638 Here $t9 holds the address of the function being called,
4639 as required by the MIPS ELF ABI. The R_MIPS_LO16
4640 relocation can easily overflow in this situation, but the
4641 R_MIPS_HI16 relocation will handle the overflow.
4642 Therefore, we consider this a bug in the MIPS ABI, and do
4643 not check for overflow here. */
4644 }
4645 break;
4646
4647 case R_MIPS_LITERAL:
4648 /* Because we don't merge literal sections, we can handle this
4649 just like R_MIPS_GPREL16. In the long run, we should merge
4650 shared literals, and then we will need to additional work
4651 here. */
4652
4653 /* Fall through. */
4654
4655 case R_MIPS16_GPREL:
4656 /* The R_MIPS16_GPREL performs the same calculation as
4657 R_MIPS_GPREL16, but stores the relocated bits in a different
4658 order. We don't need to do anything special here; the
4659 differences are handled in mips_elf_perform_relocation. */
4660 case R_MIPS_GPREL16:
bce03d3d
AO
4661 /* Only sign-extend the addend if it was extracted from the
4662 instruction. If the addend was separate, leave it alone,
4663 otherwise we may lose significant bits. */
4664 if (howto->partial_inplace)
a7ebbfdf 4665 addend = _bfd_mips_elf_sign_extend (addend, 16);
bce03d3d
AO
4666 value = symbol + addend - gp;
4667 /* If the symbol was local, any earlier relocatable links will
4668 have adjusted its addend with the gp offset, so compensate
4669 for that now. Don't do it for symbols forced local in this
4670 link, though, since they won't have had the gp offset applied
4671 to them before. */
4672 if (was_local_p)
4673 value += gp0;
b49e97c9
TS
4674 overflowed_p = mips_elf_overflow_p (value, 16);
4675 break;
4676
4677 case R_MIPS_GOT16:
4678 case R_MIPS_CALL16:
0a44bf69
RS
4679 /* VxWorks does not have separate local and global semantics for
4680 R_MIPS_GOT16; every relocation evaluates to "G". */
4681 if (!htab->is_vxworks && local_p)
b49e97c9 4682 {
b34976b6 4683 bfd_boolean forced;
b49e97c9 4684
b49e97c9 4685 forced = ! mips_elf_local_relocation_p (input_bfd, relocation,
b34976b6 4686 local_sections, FALSE);
5c18022e 4687 value = mips_elf_got16_entry (abfd, input_bfd, info,
f4416af6 4688 symbol + addend, forced);
b49e97c9
TS
4689 if (value == MINUS_ONE)
4690 return bfd_reloc_outofrange;
4691 value
0a44bf69 4692 = mips_elf_got_offset_from_index (dynobj, abfd, input_bfd, value);
b49e97c9
TS
4693 overflowed_p = mips_elf_overflow_p (value, 16);
4694 break;
4695 }
4696
4697 /* Fall through. */
4698
0f20cc35
DJ
4699 case R_MIPS_TLS_GD:
4700 case R_MIPS_TLS_GOTTPREL:
4701 case R_MIPS_TLS_LDM:
b49e97c9 4702 case R_MIPS_GOT_DISP:
0fdc1bf1 4703 got_disp:
b49e97c9
TS
4704 value = g;
4705 overflowed_p = mips_elf_overflow_p (value, 16);
4706 break;
4707
4708 case R_MIPS_GPREL32:
bce03d3d
AO
4709 value = (addend + symbol + gp0 - gp);
4710 if (!save_addend)
4711 value &= howto->dst_mask;
b49e97c9
TS
4712 break;
4713
4714 case R_MIPS_PC16:
bad36eac
DJ
4715 case R_MIPS_GNU_REL16_S2:
4716 value = symbol + _bfd_mips_elf_sign_extend (addend, 18) - p;
4717 overflowed_p = mips_elf_overflow_p (value, 18);
37caec6b
TS
4718 value >>= howto->rightshift;
4719 value &= howto->dst_mask;
b49e97c9
TS
4720 break;
4721
4722 case R_MIPS_GOT_HI16:
4723 case R_MIPS_CALL_HI16:
4724 /* We're allowed to handle these two relocations identically.
4725 The dynamic linker is allowed to handle the CALL relocations
4726 differently by creating a lazy evaluation stub. */
4727 value = g;
4728 value = mips_elf_high (value);
4729 value &= howto->dst_mask;
4730 break;
4731
4732 case R_MIPS_GOT_LO16:
4733 case R_MIPS_CALL_LO16:
4734 value = g & howto->dst_mask;
4735 break;
4736
4737 case R_MIPS_GOT_PAGE:
0fdc1bf1
AO
4738 /* GOT_PAGE relocations that reference non-local symbols decay
4739 to GOT_DISP. The corresponding GOT_OFST relocation decays to
4740 0. */
93a2b7ae 4741 if (! local_p)
0fdc1bf1 4742 goto got_disp;
5c18022e 4743 value = mips_elf_got_page (abfd, input_bfd, info, symbol + addend, NULL);
b49e97c9
TS
4744 if (value == MINUS_ONE)
4745 return bfd_reloc_outofrange;
0a44bf69 4746 value = mips_elf_got_offset_from_index (dynobj, abfd, input_bfd, value);
b49e97c9
TS
4747 overflowed_p = mips_elf_overflow_p (value, 16);
4748 break;
4749
4750 case R_MIPS_GOT_OFST:
93a2b7ae 4751 if (local_p)
5c18022e 4752 mips_elf_got_page (abfd, input_bfd, info, symbol + addend, &value);
0fdc1bf1
AO
4753 else
4754 value = addend;
b49e97c9
TS
4755 overflowed_p = mips_elf_overflow_p (value, 16);
4756 break;
4757
4758 case R_MIPS_SUB:
4759 value = symbol - addend;
4760 value &= howto->dst_mask;
4761 break;
4762
4763 case R_MIPS_HIGHER:
4764 value = mips_elf_higher (addend + symbol);
4765 value &= howto->dst_mask;
4766 break;
4767
4768 case R_MIPS_HIGHEST:
4769 value = mips_elf_highest (addend + symbol);
4770 value &= howto->dst_mask;
4771 break;
4772
4773 case R_MIPS_SCN_DISP:
4774 value = symbol + addend - sec->output_offset;
4775 value &= howto->dst_mask;
4776 break;
4777
b49e97c9 4778 case R_MIPS_JALR:
1367d393
ILT
4779 /* This relocation is only a hint. In some cases, we optimize
4780 it into a bal instruction. But we don't try to optimize
4781 branches to the PLT; that will wind up wasting time. */
4782 if (h != NULL && h->root.plt.offset != (bfd_vma) -1)
4783 return bfd_reloc_continue;
4784 value = symbol + addend;
4785 break;
b49e97c9 4786
1367d393 4787 case R_MIPS_PJUMP:
b49e97c9
TS
4788 case R_MIPS_GNU_VTINHERIT:
4789 case R_MIPS_GNU_VTENTRY:
4790 /* We don't do anything with these at present. */
4791 return bfd_reloc_continue;
4792
4793 default:
4794 /* An unrecognized relocation type. */
4795 return bfd_reloc_notsupported;
4796 }
4797
4798 /* Store the VALUE for our caller. */
4799 *valuep = value;
4800 return overflowed_p ? bfd_reloc_overflow : bfd_reloc_ok;
4801}
4802
4803/* Obtain the field relocated by RELOCATION. */
4804
4805static bfd_vma
9719ad41
RS
4806mips_elf_obtain_contents (reloc_howto_type *howto,
4807 const Elf_Internal_Rela *relocation,
4808 bfd *input_bfd, bfd_byte *contents)
b49e97c9
TS
4809{
4810 bfd_vma x;
4811 bfd_byte *location = contents + relocation->r_offset;
4812
4813 /* Obtain the bytes. */
4814 x = bfd_get ((8 * bfd_get_reloc_size (howto)), input_bfd, location);
4815
b49e97c9
TS
4816 return x;
4817}
4818
4819/* It has been determined that the result of the RELOCATION is the
4820 VALUE. Use HOWTO to place VALUE into the output file at the
4821 appropriate position. The SECTION is the section to which the
b34976b6 4822 relocation applies. If REQUIRE_JALX is TRUE, then the opcode used
b49e97c9
TS
4823 for the relocation must be either JAL or JALX, and it is
4824 unconditionally converted to JALX.
4825
b34976b6 4826 Returns FALSE if anything goes wrong. */
b49e97c9 4827
b34976b6 4828static bfd_boolean
9719ad41
RS
4829mips_elf_perform_relocation (struct bfd_link_info *info,
4830 reloc_howto_type *howto,
4831 const Elf_Internal_Rela *relocation,
4832 bfd_vma value, bfd *input_bfd,
4833 asection *input_section, bfd_byte *contents,
4834 bfd_boolean require_jalx)
b49e97c9
TS
4835{
4836 bfd_vma x;
4837 bfd_byte *location;
4838 int r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
4839
4840 /* Figure out where the relocation is occurring. */
4841 location = contents + relocation->r_offset;
4842
d6f16593
MR
4843 _bfd_mips16_elf_reloc_unshuffle (input_bfd, r_type, FALSE, location);
4844
b49e97c9
TS
4845 /* Obtain the current value. */
4846 x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
4847
4848 /* Clear the field we are setting. */
4849 x &= ~howto->dst_mask;
4850
b49e97c9
TS
4851 /* Set the field. */
4852 x |= (value & howto->dst_mask);
4853
4854 /* If required, turn JAL into JALX. */
4855 if (require_jalx)
4856 {
b34976b6 4857 bfd_boolean ok;
b49e97c9
TS
4858 bfd_vma opcode = x >> 26;
4859 bfd_vma jalx_opcode;
4860
4861 /* Check to see if the opcode is already JAL or JALX. */
4862 if (r_type == R_MIPS16_26)
4863 {
4864 ok = ((opcode == 0x6) || (opcode == 0x7));
4865 jalx_opcode = 0x7;
4866 }
4867 else
4868 {
4869 ok = ((opcode == 0x3) || (opcode == 0x1d));
4870 jalx_opcode = 0x1d;
4871 }
4872
4873 /* If the opcode is not JAL or JALX, there's a problem. */
4874 if (!ok)
4875 {
4876 (*_bfd_error_handler)
d003868e
AM
4877 (_("%B: %A+0x%lx: jump to stub routine which is not jal"),
4878 input_bfd,
4879 input_section,
b49e97c9
TS
4880 (unsigned long) relocation->r_offset);
4881 bfd_set_error (bfd_error_bad_value);
b34976b6 4882 return FALSE;
b49e97c9
TS
4883 }
4884
4885 /* Make this the JALX opcode. */
4886 x = (x & ~(0x3f << 26)) | (jalx_opcode << 26);
4887 }
4888
1367d393
ILT
4889 /* On the RM9000, bal is faster than jal, because bal uses branch
4890 prediction hardware. If we are linking for the RM9000, and we
4891 see jal, and bal fits, use it instead. Note that this
4892 transformation should be safe for all architectures. */
4893 if (bfd_get_mach (input_bfd) == bfd_mach_mips9000
4894 && !info->relocatable
4895 && !require_jalx
4896 && ((r_type == R_MIPS_26 && (x >> 26) == 0x3) /* jal addr */
4897 || (r_type == R_MIPS_JALR && x == 0x0320f809))) /* jalr t9 */
4898 {
4899 bfd_vma addr;
4900 bfd_vma dest;
4901 bfd_signed_vma off;
4902
4903 addr = (input_section->output_section->vma
4904 + input_section->output_offset
4905 + relocation->r_offset
4906 + 4);
4907 if (r_type == R_MIPS_26)
4908 dest = (value << 2) | ((addr >> 28) << 28);
4909 else
4910 dest = value;
4911 off = dest - addr;
4912 if (off <= 0x1ffff && off >= -0x20000)
4913 x = 0x04110000 | (((bfd_vma) off >> 2) & 0xffff); /* bal addr */
4914 }
4915
b49e97c9
TS
4916 /* Put the value into the output. */
4917 bfd_put (8 * bfd_get_reloc_size (howto), input_bfd, x, location);
d6f16593
MR
4918
4919 _bfd_mips16_elf_reloc_shuffle(input_bfd, r_type, !info->relocatable,
4920 location);
4921
b34976b6 4922 return TRUE;
b49e97c9
TS
4923}
4924
b34976b6 4925/* Returns TRUE if SECTION is a MIPS16 stub section. */
b49e97c9 4926
b34976b6 4927static bfd_boolean
b9d58d71 4928mips16_stub_section_p (bfd *abfd ATTRIBUTE_UNUSED, asection *section)
b49e97c9
TS
4929{
4930 const char *name = bfd_get_section_name (abfd, section);
4931
b9d58d71 4932 return FN_STUB_P (name) || CALL_STUB_P (name) || CALL_FP_STUB_P (name);
b49e97c9
TS
4933}
4934\f
0a44bf69 4935/* Add room for N relocations to the .rel(a).dyn section in ABFD. */
b49e97c9
TS
4936
4937static void
0a44bf69
RS
4938mips_elf_allocate_dynamic_relocations (bfd *abfd, struct bfd_link_info *info,
4939 unsigned int n)
b49e97c9
TS
4940{
4941 asection *s;
0a44bf69 4942 struct mips_elf_link_hash_table *htab;
b49e97c9 4943
0a44bf69
RS
4944 htab = mips_elf_hash_table (info);
4945 s = mips_elf_rel_dyn_section (info, FALSE);
b49e97c9
TS
4946 BFD_ASSERT (s != NULL);
4947
0a44bf69
RS
4948 if (htab->is_vxworks)
4949 s->size += n * MIPS_ELF_RELA_SIZE (abfd);
4950 else
b49e97c9 4951 {
0a44bf69
RS
4952 if (s->size == 0)
4953 {
4954 /* Make room for a null element. */
4955 s->size += MIPS_ELF_REL_SIZE (abfd);
4956 ++s->reloc_count;
4957 }
4958 s->size += n * MIPS_ELF_REL_SIZE (abfd);
b49e97c9 4959 }
b49e97c9
TS
4960}
4961
4962/* Create a rel.dyn relocation for the dynamic linker to resolve. REL
4963 is the original relocation, which is now being transformed into a
4964 dynamic relocation. The ADDENDP is adjusted if necessary; the
4965 caller should store the result in place of the original addend. */
4966
b34976b6 4967static bfd_boolean
9719ad41
RS
4968mips_elf_create_dynamic_relocation (bfd *output_bfd,
4969 struct bfd_link_info *info,
4970 const Elf_Internal_Rela *rel,
4971 struct mips_elf_link_hash_entry *h,
4972 asection *sec, bfd_vma symbol,
4973 bfd_vma *addendp, asection *input_section)
b49e97c9 4974{
947216bf 4975 Elf_Internal_Rela outrel[3];
b49e97c9
TS
4976 asection *sreloc;
4977 bfd *dynobj;
4978 int r_type;
5d41f0b6
RS
4979 long indx;
4980 bfd_boolean defined_p;
0a44bf69 4981 struct mips_elf_link_hash_table *htab;
b49e97c9 4982
0a44bf69 4983 htab = mips_elf_hash_table (info);
b49e97c9
TS
4984 r_type = ELF_R_TYPE (output_bfd, rel->r_info);
4985 dynobj = elf_hash_table (info)->dynobj;
0a44bf69 4986 sreloc = mips_elf_rel_dyn_section (info, FALSE);
b49e97c9
TS
4987 BFD_ASSERT (sreloc != NULL);
4988 BFD_ASSERT (sreloc->contents != NULL);
4989 BFD_ASSERT (sreloc->reloc_count * MIPS_ELF_REL_SIZE (output_bfd)
eea6121a 4990 < sreloc->size);
b49e97c9 4991
b49e97c9
TS
4992 outrel[0].r_offset =
4993 _bfd_elf_section_offset (output_bfd, info, input_section, rel[0].r_offset);
9ddf8309
TS
4994 if (ABI_64_P (output_bfd))
4995 {
4996 outrel[1].r_offset =
4997 _bfd_elf_section_offset (output_bfd, info, input_section, rel[1].r_offset);
4998 outrel[2].r_offset =
4999 _bfd_elf_section_offset (output_bfd, info, input_section, rel[2].r_offset);
5000 }
b49e97c9 5001
c5ae1840 5002 if (outrel[0].r_offset == MINUS_ONE)
0d591ff7 5003 /* The relocation field has been deleted. */
5d41f0b6
RS
5004 return TRUE;
5005
5006 if (outrel[0].r_offset == MINUS_TWO)
0d591ff7
RS
5007 {
5008 /* The relocation field has been converted into a relative value of
5009 some sort. Functions like _bfd_elf_write_section_eh_frame expect
5010 the field to be fully relocated, so add in the symbol's value. */
0d591ff7 5011 *addendp += symbol;
5d41f0b6 5012 return TRUE;
0d591ff7 5013 }
b49e97c9 5014
5d41f0b6
RS
5015 /* We must now calculate the dynamic symbol table index to use
5016 in the relocation. */
5017 if (h != NULL
6ece8836
TS
5018 && (!h->root.def_regular
5019 || (info->shared && !info->symbolic && !h->root.forced_local)))
5d41f0b6
RS
5020 {
5021 indx = h->root.dynindx;
5022 if (SGI_COMPAT (output_bfd))
5023 defined_p = h->root.def_regular;
5024 else
5025 /* ??? glibc's ld.so just adds the final GOT entry to the
5026 relocation field. It therefore treats relocs against
5027 defined symbols in the same way as relocs against
5028 undefined symbols. */
5029 defined_p = FALSE;
5030 }
b49e97c9
TS
5031 else
5032 {
5d41f0b6
RS
5033 if (sec != NULL && bfd_is_abs_section (sec))
5034 indx = 0;
5035 else if (sec == NULL || sec->owner == NULL)
fdd07405 5036 {
5d41f0b6
RS
5037 bfd_set_error (bfd_error_bad_value);
5038 return FALSE;
b49e97c9
TS
5039 }
5040 else
5041 {
5d41f0b6 5042 indx = elf_section_data (sec->output_section)->dynindx;
74541ad4
AM
5043 if (indx == 0)
5044 {
5045 asection *osec = htab->root.text_index_section;
5046 indx = elf_section_data (osec)->dynindx;
5047 }
5d41f0b6
RS
5048 if (indx == 0)
5049 abort ();
b49e97c9
TS
5050 }
5051
5d41f0b6
RS
5052 /* Instead of generating a relocation using the section
5053 symbol, we may as well make it a fully relative
5054 relocation. We want to avoid generating relocations to
5055 local symbols because we used to generate them
5056 incorrectly, without adding the original symbol value,
5057 which is mandated by the ABI for section symbols. In
5058 order to give dynamic loaders and applications time to
5059 phase out the incorrect use, we refrain from emitting
5060 section-relative relocations. It's not like they're
5061 useful, after all. This should be a bit more efficient
5062 as well. */
5063 /* ??? Although this behavior is compatible with glibc's ld.so,
5064 the ABI says that relocations against STN_UNDEF should have
5065 a symbol value of 0. Irix rld honors this, so relocations
5066 against STN_UNDEF have no effect. */
5067 if (!SGI_COMPAT (output_bfd))
5068 indx = 0;
5069 defined_p = TRUE;
b49e97c9
TS
5070 }
5071
5d41f0b6
RS
5072 /* If the relocation was previously an absolute relocation and
5073 this symbol will not be referred to by the relocation, we must
5074 adjust it by the value we give it in the dynamic symbol table.
5075 Otherwise leave the job up to the dynamic linker. */
5076 if (defined_p && r_type != R_MIPS_REL32)
5077 *addendp += symbol;
5078
0a44bf69
RS
5079 if (htab->is_vxworks)
5080 /* VxWorks uses non-relative relocations for this. */
5081 outrel[0].r_info = ELF32_R_INFO (indx, R_MIPS_32);
5082 else
5083 /* The relocation is always an REL32 relocation because we don't
5084 know where the shared library will wind up at load-time. */
5085 outrel[0].r_info = ELF_R_INFO (output_bfd, (unsigned long) indx,
5086 R_MIPS_REL32);
5087
5d41f0b6
RS
5088 /* For strict adherence to the ABI specification, we should
5089 generate a R_MIPS_64 relocation record by itself before the
5090 _REL32/_64 record as well, such that the addend is read in as
5091 a 64-bit value (REL32 is a 32-bit relocation, after all).
5092 However, since none of the existing ELF64 MIPS dynamic
5093 loaders seems to care, we don't waste space with these
5094 artificial relocations. If this turns out to not be true,
5095 mips_elf_allocate_dynamic_relocation() should be tweaked so
5096 as to make room for a pair of dynamic relocations per
5097 invocation if ABI_64_P, and here we should generate an
5098 additional relocation record with R_MIPS_64 by itself for a
5099 NULL symbol before this relocation record. */
5100 outrel[1].r_info = ELF_R_INFO (output_bfd, 0,
5101 ABI_64_P (output_bfd)
5102 ? R_MIPS_64
5103 : R_MIPS_NONE);
5104 outrel[2].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_NONE);
5105
5106 /* Adjust the output offset of the relocation to reference the
5107 correct location in the output file. */
5108 outrel[0].r_offset += (input_section->output_section->vma
5109 + input_section->output_offset);
5110 outrel[1].r_offset += (input_section->output_section->vma
5111 + input_section->output_offset);
5112 outrel[2].r_offset += (input_section->output_section->vma
5113 + input_section->output_offset);
5114
b49e97c9
TS
5115 /* Put the relocation back out. We have to use the special
5116 relocation outputter in the 64-bit case since the 64-bit
5117 relocation format is non-standard. */
5118 if (ABI_64_P (output_bfd))
5119 {
5120 (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
5121 (output_bfd, &outrel[0],
5122 (sreloc->contents
5123 + sreloc->reloc_count * sizeof (Elf64_Mips_External_Rel)));
5124 }
0a44bf69
RS
5125 else if (htab->is_vxworks)
5126 {
5127 /* VxWorks uses RELA rather than REL dynamic relocations. */
5128 outrel[0].r_addend = *addendp;
5129 bfd_elf32_swap_reloca_out
5130 (output_bfd, &outrel[0],
5131 (sreloc->contents
5132 + sreloc->reloc_count * sizeof (Elf32_External_Rela)));
5133 }
b49e97c9 5134 else
947216bf
AM
5135 bfd_elf32_swap_reloc_out
5136 (output_bfd, &outrel[0],
5137 (sreloc->contents + sreloc->reloc_count * sizeof (Elf32_External_Rel)));
b49e97c9 5138
b49e97c9
TS
5139 /* We've now added another relocation. */
5140 ++sreloc->reloc_count;
5141
5142 /* Make sure the output section is writable. The dynamic linker
5143 will be writing to it. */
5144 elf_section_data (input_section->output_section)->this_hdr.sh_flags
5145 |= SHF_WRITE;
5146
5147 /* On IRIX5, make an entry of compact relocation info. */
5d41f0b6 5148 if (IRIX_COMPAT (output_bfd) == ict_irix5)
b49e97c9
TS
5149 {
5150 asection *scpt = bfd_get_section_by_name (dynobj, ".compact_rel");
5151 bfd_byte *cr;
5152
5153 if (scpt)
5154 {
5155 Elf32_crinfo cptrel;
5156
5157 mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG);
5158 cptrel.vaddr = (rel->r_offset
5159 + input_section->output_section->vma
5160 + input_section->output_offset);
5161 if (r_type == R_MIPS_REL32)
5162 mips_elf_set_cr_type (cptrel, CRT_MIPS_REL32);
5163 else
5164 mips_elf_set_cr_type (cptrel, CRT_MIPS_WORD);
5165 mips_elf_set_cr_dist2to (cptrel, 0);
5166 cptrel.konst = *addendp;
5167
5168 cr = (scpt->contents
5169 + sizeof (Elf32_External_compact_rel));
abc0f8d0 5170 mips_elf_set_cr_relvaddr (cptrel, 0);
b49e97c9
TS
5171 bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
5172 ((Elf32_External_crinfo *) cr
5173 + scpt->reloc_count));
5174 ++scpt->reloc_count;
5175 }
5176 }
5177
943284cc
DJ
5178 /* If we've written this relocation for a readonly section,
5179 we need to set DF_TEXTREL again, so that we do not delete the
5180 DT_TEXTREL tag. */
5181 if (MIPS_ELF_READONLY_SECTION (input_section))
5182 info->flags |= DF_TEXTREL;
5183
b34976b6 5184 return TRUE;
b49e97c9
TS
5185}
5186\f
b49e97c9
TS
5187/* Return the MACH for a MIPS e_flags value. */
5188
5189unsigned long
9719ad41 5190_bfd_elf_mips_mach (flagword flags)
b49e97c9
TS
5191{
5192 switch (flags & EF_MIPS_MACH)
5193 {
5194 case E_MIPS_MACH_3900:
5195 return bfd_mach_mips3900;
5196
5197 case E_MIPS_MACH_4010:
5198 return bfd_mach_mips4010;
5199
5200 case E_MIPS_MACH_4100:
5201 return bfd_mach_mips4100;
5202
5203 case E_MIPS_MACH_4111:
5204 return bfd_mach_mips4111;
5205
00707a0e
RS
5206 case E_MIPS_MACH_4120:
5207 return bfd_mach_mips4120;
5208
b49e97c9
TS
5209 case E_MIPS_MACH_4650:
5210 return bfd_mach_mips4650;
5211
00707a0e
RS
5212 case E_MIPS_MACH_5400:
5213 return bfd_mach_mips5400;
5214
5215 case E_MIPS_MACH_5500:
5216 return bfd_mach_mips5500;
5217
0d2e43ed
ILT
5218 case E_MIPS_MACH_9000:
5219 return bfd_mach_mips9000;
5220
b49e97c9
TS
5221 case E_MIPS_MACH_SB1:
5222 return bfd_mach_mips_sb1;
5223
5224 default:
5225 switch (flags & EF_MIPS_ARCH)
5226 {
5227 default:
5228 case E_MIPS_ARCH_1:
5229 return bfd_mach_mips3000;
b49e97c9
TS
5230
5231 case E_MIPS_ARCH_2:
5232 return bfd_mach_mips6000;
b49e97c9
TS
5233
5234 case E_MIPS_ARCH_3:
5235 return bfd_mach_mips4000;
b49e97c9
TS
5236
5237 case E_MIPS_ARCH_4:
5238 return bfd_mach_mips8000;
b49e97c9
TS
5239
5240 case E_MIPS_ARCH_5:
5241 return bfd_mach_mips5;
b49e97c9
TS
5242
5243 case E_MIPS_ARCH_32:
5244 return bfd_mach_mipsisa32;
b49e97c9
TS
5245
5246 case E_MIPS_ARCH_64:
5247 return bfd_mach_mipsisa64;
af7ee8bf
CD
5248
5249 case E_MIPS_ARCH_32R2:
5250 return bfd_mach_mipsisa32r2;
5f74bc13
CD
5251
5252 case E_MIPS_ARCH_64R2:
5253 return bfd_mach_mipsisa64r2;
b49e97c9
TS
5254 }
5255 }
5256
5257 return 0;
5258}
5259
5260/* Return printable name for ABI. */
5261
5262static INLINE char *
9719ad41 5263elf_mips_abi_name (bfd *abfd)
b49e97c9
TS
5264{
5265 flagword flags;
5266
5267 flags = elf_elfheader (abfd)->e_flags;
5268 switch (flags & EF_MIPS_ABI)
5269 {
5270 case 0:
5271 if (ABI_N32_P (abfd))
5272 return "N32";
5273 else if (ABI_64_P (abfd))
5274 return "64";
5275 else
5276 return "none";
5277 case E_MIPS_ABI_O32:
5278 return "O32";
5279 case E_MIPS_ABI_O64:
5280 return "O64";
5281 case E_MIPS_ABI_EABI32:
5282 return "EABI32";
5283 case E_MIPS_ABI_EABI64:
5284 return "EABI64";
5285 default:
5286 return "unknown abi";
5287 }
5288}
5289\f
5290/* MIPS ELF uses two common sections. One is the usual one, and the
5291 other is for small objects. All the small objects are kept
5292 together, and then referenced via the gp pointer, which yields
5293 faster assembler code. This is what we use for the small common
5294 section. This approach is copied from ecoff.c. */
5295static asection mips_elf_scom_section;
5296static asymbol mips_elf_scom_symbol;
5297static asymbol *mips_elf_scom_symbol_ptr;
5298
5299/* MIPS ELF also uses an acommon section, which represents an
5300 allocated common symbol which may be overridden by a
5301 definition in a shared library. */
5302static asection mips_elf_acom_section;
5303static asymbol mips_elf_acom_symbol;
5304static asymbol *mips_elf_acom_symbol_ptr;
5305
5306/* Handle the special MIPS section numbers that a symbol may use.
5307 This is used for both the 32-bit and the 64-bit ABI. */
5308
5309void
9719ad41 5310_bfd_mips_elf_symbol_processing (bfd *abfd, asymbol *asym)
b49e97c9
TS
5311{
5312 elf_symbol_type *elfsym;
5313
5314 elfsym = (elf_symbol_type *) asym;
5315 switch (elfsym->internal_elf_sym.st_shndx)
5316 {
5317 case SHN_MIPS_ACOMMON:
5318 /* This section is used in a dynamically linked executable file.
5319 It is an allocated common section. The dynamic linker can
5320 either resolve these symbols to something in a shared
5321 library, or it can just leave them here. For our purposes,
5322 we can consider these symbols to be in a new section. */
5323 if (mips_elf_acom_section.name == NULL)
5324 {
5325 /* Initialize the acommon section. */
5326 mips_elf_acom_section.name = ".acommon";
5327 mips_elf_acom_section.flags = SEC_ALLOC;
5328 mips_elf_acom_section.output_section = &mips_elf_acom_section;
5329 mips_elf_acom_section.symbol = &mips_elf_acom_symbol;
5330 mips_elf_acom_section.symbol_ptr_ptr = &mips_elf_acom_symbol_ptr;
5331 mips_elf_acom_symbol.name = ".acommon";
5332 mips_elf_acom_symbol.flags = BSF_SECTION_SYM;
5333 mips_elf_acom_symbol.section = &mips_elf_acom_section;
5334 mips_elf_acom_symbol_ptr = &mips_elf_acom_symbol;
5335 }
5336 asym->section = &mips_elf_acom_section;
5337 break;
5338
5339 case SHN_COMMON:
5340 /* Common symbols less than the GP size are automatically
5341 treated as SHN_MIPS_SCOMMON symbols on IRIX5. */
5342 if (asym->value > elf_gp_size (abfd)
b59eed79 5343 || ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_TLS
b49e97c9
TS
5344 || IRIX_COMPAT (abfd) == ict_irix6)
5345 break;
5346 /* Fall through. */
5347 case SHN_MIPS_SCOMMON:
5348 if (mips_elf_scom_section.name == NULL)
5349 {
5350 /* Initialize the small common section. */
5351 mips_elf_scom_section.name = ".scommon";
5352 mips_elf_scom_section.flags = SEC_IS_COMMON;
5353 mips_elf_scom_section.output_section = &mips_elf_scom_section;
5354 mips_elf_scom_section.symbol = &mips_elf_scom_symbol;
5355 mips_elf_scom_section.symbol_ptr_ptr = &mips_elf_scom_symbol_ptr;
5356 mips_elf_scom_symbol.name = ".scommon";
5357 mips_elf_scom_symbol.flags = BSF_SECTION_SYM;
5358 mips_elf_scom_symbol.section = &mips_elf_scom_section;
5359 mips_elf_scom_symbol_ptr = &mips_elf_scom_symbol;
5360 }
5361 asym->section = &mips_elf_scom_section;
5362 asym->value = elfsym->internal_elf_sym.st_size;
5363 break;
5364
5365 case SHN_MIPS_SUNDEFINED:
5366 asym->section = bfd_und_section_ptr;
5367 break;
5368
b49e97c9 5369 case SHN_MIPS_TEXT:
00b4930b
TS
5370 {
5371 asection *section = bfd_get_section_by_name (abfd, ".text");
5372
5373 BFD_ASSERT (SGI_COMPAT (abfd));
5374 if (section != NULL)
5375 {
5376 asym->section = section;
5377 /* MIPS_TEXT is a bit special, the address is not an offset
5378 to the base of the .text section. So substract the section
5379 base address to make it an offset. */
5380 asym->value -= section->vma;
5381 }
5382 }
b49e97c9
TS
5383 break;
5384
5385 case SHN_MIPS_DATA:
00b4930b
TS
5386 {
5387 asection *section = bfd_get_section_by_name (abfd, ".data");
5388
5389 BFD_ASSERT (SGI_COMPAT (abfd));
5390 if (section != NULL)
5391 {
5392 asym->section = section;
5393 /* MIPS_DATA is a bit special, the address is not an offset
5394 to the base of the .data section. So substract the section
5395 base address to make it an offset. */
5396 asym->value -= section->vma;
5397 }
5398 }
b49e97c9 5399 break;
b49e97c9
TS
5400 }
5401}
5402\f
8c946ed5
RS
5403/* Implement elf_backend_eh_frame_address_size. This differs from
5404 the default in the way it handles EABI64.
5405
5406 EABI64 was originally specified as an LP64 ABI, and that is what
5407 -mabi=eabi normally gives on a 64-bit target. However, gcc has
5408 historically accepted the combination of -mabi=eabi and -mlong32,
5409 and this ILP32 variation has become semi-official over time.
5410 Both forms use elf32 and have pointer-sized FDE addresses.
5411
5412 If an EABI object was generated by GCC 4.0 or above, it will have
5413 an empty .gcc_compiled_longXX section, where XX is the size of longs
5414 in bits. Unfortunately, ILP32 objects generated by earlier compilers
5415 have no special marking to distinguish them from LP64 objects.
5416
5417 We don't want users of the official LP64 ABI to be punished for the
5418 existence of the ILP32 variant, but at the same time, we don't want
5419 to mistakenly interpret pre-4.0 ILP32 objects as being LP64 objects.
5420 We therefore take the following approach:
5421
5422 - If ABFD contains a .gcc_compiled_longXX section, use it to
5423 determine the pointer size.
5424
5425 - Otherwise check the type of the first relocation. Assume that
5426 the LP64 ABI is being used if the relocation is of type R_MIPS_64.
5427
5428 - Otherwise punt.
5429
5430 The second check is enough to detect LP64 objects generated by pre-4.0
5431 compilers because, in the kind of output generated by those compilers,
5432 the first relocation will be associated with either a CIE personality
5433 routine or an FDE start address. Furthermore, the compilers never
5434 used a special (non-pointer) encoding for this ABI.
5435
5436 Checking the relocation type should also be safe because there is no
5437 reason to use R_MIPS_64 in an ILP32 object. Pre-4.0 compilers never
5438 did so. */
5439
5440unsigned int
5441_bfd_mips_elf_eh_frame_address_size (bfd *abfd, asection *sec)
5442{
5443 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
5444 return 8;
5445 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64)
5446 {
5447 bfd_boolean long32_p, long64_p;
5448
5449 long32_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long32") != 0;
5450 long64_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long64") != 0;
5451 if (long32_p && long64_p)
5452 return 0;
5453 if (long32_p)
5454 return 4;
5455 if (long64_p)
5456 return 8;
5457
5458 if (sec->reloc_count > 0
5459 && elf_section_data (sec)->relocs != NULL
5460 && (ELF32_R_TYPE (elf_section_data (sec)->relocs[0].r_info)
5461 == R_MIPS_64))
5462 return 8;
5463
5464 return 0;
5465 }
5466 return 4;
5467}
5468\f
174fd7f9
RS
5469/* There appears to be a bug in the MIPSpro linker that causes GOT_DISP
5470 relocations against two unnamed section symbols to resolve to the
5471 same address. For example, if we have code like:
5472
5473 lw $4,%got_disp(.data)($gp)
5474 lw $25,%got_disp(.text)($gp)
5475 jalr $25
5476
5477 then the linker will resolve both relocations to .data and the program
5478 will jump there rather than to .text.
5479
5480 We can work around this problem by giving names to local section symbols.
5481 This is also what the MIPSpro tools do. */
5482
5483bfd_boolean
5484_bfd_mips_elf_name_local_section_symbols (bfd *abfd)
5485{
5486 return SGI_COMPAT (abfd);
5487}
5488\f
b49e97c9
TS
5489/* Work over a section just before writing it out. This routine is
5490 used by both the 32-bit and the 64-bit ABI. FIXME: We recognize
5491 sections that need the SHF_MIPS_GPREL flag by name; there has to be
5492 a better way. */
5493
b34976b6 5494bfd_boolean
9719ad41 5495_bfd_mips_elf_section_processing (bfd *abfd, Elf_Internal_Shdr *hdr)
b49e97c9
TS
5496{
5497 if (hdr->sh_type == SHT_MIPS_REGINFO
5498 && hdr->sh_size > 0)
5499 {
5500 bfd_byte buf[4];
5501
5502 BFD_ASSERT (hdr->sh_size == sizeof (Elf32_External_RegInfo));
5503 BFD_ASSERT (hdr->contents == NULL);
5504
5505 if (bfd_seek (abfd,
5506 hdr->sh_offset + sizeof (Elf32_External_RegInfo) - 4,
5507 SEEK_SET) != 0)
b34976b6 5508 return FALSE;
b49e97c9 5509 H_PUT_32 (abfd, elf_gp (abfd), buf);
9719ad41 5510 if (bfd_bwrite (buf, 4, abfd) != 4)
b34976b6 5511 return FALSE;
b49e97c9
TS
5512 }
5513
5514 if (hdr->sh_type == SHT_MIPS_OPTIONS
5515 && hdr->bfd_section != NULL
f0abc2a1
AM
5516 && mips_elf_section_data (hdr->bfd_section) != NULL
5517 && mips_elf_section_data (hdr->bfd_section)->u.tdata != NULL)
b49e97c9
TS
5518 {
5519 bfd_byte *contents, *l, *lend;
5520
f0abc2a1
AM
5521 /* We stored the section contents in the tdata field in the
5522 set_section_contents routine. We save the section contents
5523 so that we don't have to read them again.
b49e97c9
TS
5524 At this point we know that elf_gp is set, so we can look
5525 through the section contents to see if there is an
5526 ODK_REGINFO structure. */
5527
f0abc2a1 5528 contents = mips_elf_section_data (hdr->bfd_section)->u.tdata;
b49e97c9
TS
5529 l = contents;
5530 lend = contents + hdr->sh_size;
5531 while (l + sizeof (Elf_External_Options) <= lend)
5532 {
5533 Elf_Internal_Options intopt;
5534
5535 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
5536 &intopt);
1bc8074d
MR
5537 if (intopt.size < sizeof (Elf_External_Options))
5538 {
5539 (*_bfd_error_handler)
5540 (_("%B: Warning: bad `%s' option size %u smaller than its header"),
5541 abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd), intopt.size);
5542 break;
5543 }
b49e97c9
TS
5544 if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
5545 {
5546 bfd_byte buf[8];
5547
5548 if (bfd_seek (abfd,
5549 (hdr->sh_offset
5550 + (l - contents)
5551 + sizeof (Elf_External_Options)
5552 + (sizeof (Elf64_External_RegInfo) - 8)),
5553 SEEK_SET) != 0)
b34976b6 5554 return FALSE;
b49e97c9 5555 H_PUT_64 (abfd, elf_gp (abfd), buf);
9719ad41 5556 if (bfd_bwrite (buf, 8, abfd) != 8)
b34976b6 5557 return FALSE;
b49e97c9
TS
5558 }
5559 else if (intopt.kind == ODK_REGINFO)
5560 {
5561 bfd_byte buf[4];
5562
5563 if (bfd_seek (abfd,
5564 (hdr->sh_offset
5565 + (l - contents)
5566 + sizeof (Elf_External_Options)
5567 + (sizeof (Elf32_External_RegInfo) - 4)),
5568 SEEK_SET) != 0)
b34976b6 5569 return FALSE;
b49e97c9 5570 H_PUT_32 (abfd, elf_gp (abfd), buf);
9719ad41 5571 if (bfd_bwrite (buf, 4, abfd) != 4)
b34976b6 5572 return FALSE;
b49e97c9
TS
5573 }
5574 l += intopt.size;
5575 }
5576 }
5577
5578 if (hdr->bfd_section != NULL)
5579 {
5580 const char *name = bfd_get_section_name (abfd, hdr->bfd_section);
5581
5582 if (strcmp (name, ".sdata") == 0
5583 || strcmp (name, ".lit8") == 0
5584 || strcmp (name, ".lit4") == 0)
5585 {
5586 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
5587 hdr->sh_type = SHT_PROGBITS;
5588 }
5589 else if (strcmp (name, ".sbss") == 0)
5590 {
5591 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
5592 hdr->sh_type = SHT_NOBITS;
5593 }
5594 else if (strcmp (name, ".srdata") == 0)
5595 {
5596 hdr->sh_flags |= SHF_ALLOC | SHF_MIPS_GPREL;
5597 hdr->sh_type = SHT_PROGBITS;
5598 }
5599 else if (strcmp (name, ".compact_rel") == 0)
5600 {
5601 hdr->sh_flags = 0;
5602 hdr->sh_type = SHT_PROGBITS;
5603 }
5604 else if (strcmp (name, ".rtproc") == 0)
5605 {
5606 if (hdr->sh_addralign != 0 && hdr->sh_entsize == 0)
5607 {
5608 unsigned int adjust;
5609
5610 adjust = hdr->sh_size % hdr->sh_addralign;
5611 if (adjust != 0)
5612 hdr->sh_size += hdr->sh_addralign - adjust;
5613 }
5614 }
5615 }
5616
b34976b6 5617 return TRUE;
b49e97c9
TS
5618}
5619
5620/* Handle a MIPS specific section when reading an object file. This
5621 is called when elfcode.h finds a section with an unknown type.
5622 This routine supports both the 32-bit and 64-bit ELF ABI.
5623
5624 FIXME: We need to handle the SHF_MIPS_GPREL flag, but I'm not sure
5625 how to. */
5626
b34976b6 5627bfd_boolean
6dc132d9
L
5628_bfd_mips_elf_section_from_shdr (bfd *abfd,
5629 Elf_Internal_Shdr *hdr,
5630 const char *name,
5631 int shindex)
b49e97c9
TS
5632{
5633 flagword flags = 0;
5634
5635 /* There ought to be a place to keep ELF backend specific flags, but
5636 at the moment there isn't one. We just keep track of the
5637 sections by their name, instead. Fortunately, the ABI gives
5638 suggested names for all the MIPS specific sections, so we will
5639 probably get away with this. */
5640 switch (hdr->sh_type)
5641 {
5642 case SHT_MIPS_LIBLIST:
5643 if (strcmp (name, ".liblist") != 0)
b34976b6 5644 return FALSE;
b49e97c9
TS
5645 break;
5646 case SHT_MIPS_MSYM:
5647 if (strcmp (name, ".msym") != 0)
b34976b6 5648 return FALSE;
b49e97c9
TS
5649 break;
5650 case SHT_MIPS_CONFLICT:
5651 if (strcmp (name, ".conflict") != 0)
b34976b6 5652 return FALSE;
b49e97c9
TS
5653 break;
5654 case SHT_MIPS_GPTAB:
0112cd26 5655 if (! CONST_STRNEQ (name, ".gptab."))
b34976b6 5656 return FALSE;
b49e97c9
TS
5657 break;
5658 case SHT_MIPS_UCODE:
5659 if (strcmp (name, ".ucode") != 0)
b34976b6 5660 return FALSE;
b49e97c9
TS
5661 break;
5662 case SHT_MIPS_DEBUG:
5663 if (strcmp (name, ".mdebug") != 0)
b34976b6 5664 return FALSE;
b49e97c9
TS
5665 flags = SEC_DEBUGGING;
5666 break;
5667 case SHT_MIPS_REGINFO:
5668 if (strcmp (name, ".reginfo") != 0
5669 || hdr->sh_size != sizeof (Elf32_External_RegInfo))
b34976b6 5670 return FALSE;
b49e97c9
TS
5671 flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
5672 break;
5673 case SHT_MIPS_IFACE:
5674 if (strcmp (name, ".MIPS.interfaces") != 0)
b34976b6 5675 return FALSE;
b49e97c9
TS
5676 break;
5677 case SHT_MIPS_CONTENT:
0112cd26 5678 if (! CONST_STRNEQ (name, ".MIPS.content"))
b34976b6 5679 return FALSE;
b49e97c9
TS
5680 break;
5681 case SHT_MIPS_OPTIONS:
cc2e31b9 5682 if (!MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
b34976b6 5683 return FALSE;
b49e97c9
TS
5684 break;
5685 case SHT_MIPS_DWARF:
0112cd26 5686 if (! CONST_STRNEQ (name, ".debug_"))
b34976b6 5687 return FALSE;
b49e97c9
TS
5688 break;
5689 case SHT_MIPS_SYMBOL_LIB:
5690 if (strcmp (name, ".MIPS.symlib") != 0)
b34976b6 5691 return FALSE;
b49e97c9
TS
5692 break;
5693 case SHT_MIPS_EVENTS:
0112cd26
NC
5694 if (! CONST_STRNEQ (name, ".MIPS.events")
5695 && ! CONST_STRNEQ (name, ".MIPS.post_rel"))
b34976b6 5696 return FALSE;
b49e97c9
TS
5697 break;
5698 default:
cc2e31b9 5699 break;
b49e97c9
TS
5700 }
5701
6dc132d9 5702 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
b34976b6 5703 return FALSE;
b49e97c9
TS
5704
5705 if (flags)
5706 {
5707 if (! bfd_set_section_flags (abfd, hdr->bfd_section,
5708 (bfd_get_section_flags (abfd,
5709 hdr->bfd_section)
5710 | flags)))
b34976b6 5711 return FALSE;
b49e97c9
TS
5712 }
5713
5714 /* FIXME: We should record sh_info for a .gptab section. */
5715
5716 /* For a .reginfo section, set the gp value in the tdata information
5717 from the contents of this section. We need the gp value while
5718 processing relocs, so we just get it now. The .reginfo section
5719 is not used in the 64-bit MIPS ELF ABI. */
5720 if (hdr->sh_type == SHT_MIPS_REGINFO)
5721 {
5722 Elf32_External_RegInfo ext;
5723 Elf32_RegInfo s;
5724
9719ad41
RS
5725 if (! bfd_get_section_contents (abfd, hdr->bfd_section,
5726 &ext, 0, sizeof ext))
b34976b6 5727 return FALSE;
b49e97c9
TS
5728 bfd_mips_elf32_swap_reginfo_in (abfd, &ext, &s);
5729 elf_gp (abfd) = s.ri_gp_value;
5730 }
5731
5732 /* For a SHT_MIPS_OPTIONS section, look for a ODK_REGINFO entry, and
5733 set the gp value based on what we find. We may see both
5734 SHT_MIPS_REGINFO and SHT_MIPS_OPTIONS/ODK_REGINFO; in that case,
5735 they should agree. */
5736 if (hdr->sh_type == SHT_MIPS_OPTIONS)
5737 {
5738 bfd_byte *contents, *l, *lend;
5739
9719ad41 5740 contents = bfd_malloc (hdr->sh_size);
b49e97c9 5741 if (contents == NULL)
b34976b6 5742 return FALSE;
b49e97c9 5743 if (! bfd_get_section_contents (abfd, hdr->bfd_section, contents,
9719ad41 5744 0, hdr->sh_size))
b49e97c9
TS
5745 {
5746 free (contents);
b34976b6 5747 return FALSE;
b49e97c9
TS
5748 }
5749 l = contents;
5750 lend = contents + hdr->sh_size;
5751 while (l + sizeof (Elf_External_Options) <= lend)
5752 {
5753 Elf_Internal_Options intopt;
5754
5755 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
5756 &intopt);
1bc8074d
MR
5757 if (intopt.size < sizeof (Elf_External_Options))
5758 {
5759 (*_bfd_error_handler)
5760 (_("%B: Warning: bad `%s' option size %u smaller than its header"),
5761 abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd), intopt.size);
5762 break;
5763 }
b49e97c9
TS
5764 if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
5765 {
5766 Elf64_Internal_RegInfo intreg;
5767
5768 bfd_mips_elf64_swap_reginfo_in
5769 (abfd,
5770 ((Elf64_External_RegInfo *)
5771 (l + sizeof (Elf_External_Options))),
5772 &intreg);
5773 elf_gp (abfd) = intreg.ri_gp_value;
5774 }
5775 else if (intopt.kind == ODK_REGINFO)
5776 {
5777 Elf32_RegInfo intreg;
5778
5779 bfd_mips_elf32_swap_reginfo_in
5780 (abfd,
5781 ((Elf32_External_RegInfo *)
5782 (l + sizeof (Elf_External_Options))),
5783 &intreg);
5784 elf_gp (abfd) = intreg.ri_gp_value;
5785 }
5786 l += intopt.size;
5787 }
5788 free (contents);
5789 }
5790
b34976b6 5791 return TRUE;
b49e97c9
TS
5792}
5793
5794/* Set the correct type for a MIPS ELF section. We do this by the
5795 section name, which is a hack, but ought to work. This routine is
5796 used by both the 32-bit and the 64-bit ABI. */
5797
b34976b6 5798bfd_boolean
9719ad41 5799_bfd_mips_elf_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
b49e97c9 5800{
0414f35b 5801 const char *name = bfd_get_section_name (abfd, sec);
b49e97c9
TS
5802
5803 if (strcmp (name, ".liblist") == 0)
5804 {
5805 hdr->sh_type = SHT_MIPS_LIBLIST;
eea6121a 5806 hdr->sh_info = sec->size / sizeof (Elf32_Lib);
b49e97c9
TS
5807 /* The sh_link field is set in final_write_processing. */
5808 }
5809 else if (strcmp (name, ".conflict") == 0)
5810 hdr->sh_type = SHT_MIPS_CONFLICT;
0112cd26 5811 else if (CONST_STRNEQ (name, ".gptab."))
b49e97c9
TS
5812 {
5813 hdr->sh_type = SHT_MIPS_GPTAB;
5814 hdr->sh_entsize = sizeof (Elf32_External_gptab);
5815 /* The sh_info field is set in final_write_processing. */
5816 }
5817 else if (strcmp (name, ".ucode") == 0)
5818 hdr->sh_type = SHT_MIPS_UCODE;
5819 else if (strcmp (name, ".mdebug") == 0)
5820 {
5821 hdr->sh_type = SHT_MIPS_DEBUG;
8dc1a139 5822 /* In a shared object on IRIX 5.3, the .mdebug section has an
b49e97c9
TS
5823 entsize of 0. FIXME: Does this matter? */
5824 if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0)
5825 hdr->sh_entsize = 0;
5826 else
5827 hdr->sh_entsize = 1;
5828 }
5829 else if (strcmp (name, ".reginfo") == 0)
5830 {
5831 hdr->sh_type = SHT_MIPS_REGINFO;
8dc1a139 5832 /* In a shared object on IRIX 5.3, the .reginfo section has an
b49e97c9
TS
5833 entsize of 0x18. FIXME: Does this matter? */
5834 if (SGI_COMPAT (abfd))
5835 {
5836 if ((abfd->flags & DYNAMIC) != 0)
5837 hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
5838 else
5839 hdr->sh_entsize = 1;
5840 }
5841 else
5842 hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
5843 }
5844 else if (SGI_COMPAT (abfd)
5845 && (strcmp (name, ".hash") == 0
5846 || strcmp (name, ".dynamic") == 0
5847 || strcmp (name, ".dynstr") == 0))
5848 {
5849 if (SGI_COMPAT (abfd))
5850 hdr->sh_entsize = 0;
5851#if 0
8dc1a139 5852 /* This isn't how the IRIX6 linker behaves. */
b49e97c9
TS
5853 hdr->sh_info = SIZEOF_MIPS_DYNSYM_SECNAMES;
5854#endif
5855 }
5856 else if (strcmp (name, ".got") == 0
5857 || strcmp (name, ".srdata") == 0
5858 || strcmp (name, ".sdata") == 0
5859 || strcmp (name, ".sbss") == 0
5860 || strcmp (name, ".lit4") == 0
5861 || strcmp (name, ".lit8") == 0)
5862 hdr->sh_flags |= SHF_MIPS_GPREL;
5863 else if (strcmp (name, ".MIPS.interfaces") == 0)
5864 {
5865 hdr->sh_type = SHT_MIPS_IFACE;
5866 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
5867 }
0112cd26 5868 else if (CONST_STRNEQ (name, ".MIPS.content"))
b49e97c9
TS
5869 {
5870 hdr->sh_type = SHT_MIPS_CONTENT;
5871 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
5872 /* The sh_info field is set in final_write_processing. */
5873 }
cc2e31b9 5874 else if (MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
b49e97c9
TS
5875 {
5876 hdr->sh_type = SHT_MIPS_OPTIONS;
5877 hdr->sh_entsize = 1;
5878 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
5879 }
0112cd26 5880 else if (CONST_STRNEQ (name, ".debug_"))
b5482f21
NC
5881 {
5882 hdr->sh_type = SHT_MIPS_DWARF;
5883
5884 /* Irix facilities such as libexc expect a single .debug_frame
5885 per executable, the system ones have NOSTRIP set and the linker
5886 doesn't merge sections with different flags so ... */
5887 if (SGI_COMPAT (abfd) && CONST_STRNEQ (name, ".debug_frame"))
5888 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
5889 }
b49e97c9
TS
5890 else if (strcmp (name, ".MIPS.symlib") == 0)
5891 {
5892 hdr->sh_type = SHT_MIPS_SYMBOL_LIB;
5893 /* The sh_link and sh_info fields are set in
5894 final_write_processing. */
5895 }
0112cd26
NC
5896 else if (CONST_STRNEQ (name, ".MIPS.events")
5897 || CONST_STRNEQ (name, ".MIPS.post_rel"))
b49e97c9
TS
5898 {
5899 hdr->sh_type = SHT_MIPS_EVENTS;
5900 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
5901 /* The sh_link field is set in final_write_processing. */
5902 }
5903 else if (strcmp (name, ".msym") == 0)
5904 {
5905 hdr->sh_type = SHT_MIPS_MSYM;
5906 hdr->sh_flags |= SHF_ALLOC;
5907 hdr->sh_entsize = 8;
5908 }
5909
7a79a000
TS
5910 /* The generic elf_fake_sections will set up REL_HDR using the default
5911 kind of relocations. We used to set up a second header for the
5912 non-default kind of relocations here, but only NewABI would use
5913 these, and the IRIX ld doesn't like resulting empty RELA sections.
5914 Thus we create those header only on demand now. */
b49e97c9 5915
b34976b6 5916 return TRUE;
b49e97c9
TS
5917}
5918
5919/* Given a BFD section, try to locate the corresponding ELF section
5920 index. This is used by both the 32-bit and the 64-bit ABI.
5921 Actually, it's not clear to me that the 64-bit ABI supports these,
5922 but for non-PIC objects we will certainly want support for at least
5923 the .scommon section. */
5924
b34976b6 5925bfd_boolean
9719ad41
RS
5926_bfd_mips_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
5927 asection *sec, int *retval)
b49e97c9
TS
5928{
5929 if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
5930 {
5931 *retval = SHN_MIPS_SCOMMON;
b34976b6 5932 return TRUE;
b49e97c9
TS
5933 }
5934 if (strcmp (bfd_get_section_name (abfd, sec), ".acommon") == 0)
5935 {
5936 *retval = SHN_MIPS_ACOMMON;
b34976b6 5937 return TRUE;
b49e97c9 5938 }
b34976b6 5939 return FALSE;
b49e97c9
TS
5940}
5941\f
5942/* Hook called by the linker routine which adds symbols from an object
5943 file. We must handle the special MIPS section numbers here. */
5944
b34976b6 5945bfd_boolean
9719ad41 5946_bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
555cd476 5947 Elf_Internal_Sym *sym, const char **namep,
9719ad41
RS
5948 flagword *flagsp ATTRIBUTE_UNUSED,
5949 asection **secp, bfd_vma *valp)
b49e97c9
TS
5950{
5951 if (SGI_COMPAT (abfd)
5952 && (abfd->flags & DYNAMIC) != 0
5953 && strcmp (*namep, "_rld_new_interface") == 0)
5954 {
8dc1a139 5955 /* Skip IRIX5 rld entry name. */
b49e97c9 5956 *namep = NULL;
b34976b6 5957 return TRUE;
b49e97c9
TS
5958 }
5959
eedecc07
DD
5960 /* Shared objects may have a dynamic symbol '_gp_disp' defined as
5961 a SECTION *ABS*. This causes ld to think it can resolve _gp_disp
5962 by setting a DT_NEEDED for the shared object. Since _gp_disp is
5963 a magic symbol resolved by the linker, we ignore this bogus definition
5964 of _gp_disp. New ABI objects do not suffer from this problem so this
5965 is not done for them. */
5966 if (!NEWABI_P(abfd)
5967 && (sym->st_shndx == SHN_ABS)
5968 && (strcmp (*namep, "_gp_disp") == 0))
5969 {
5970 *namep = NULL;
5971 return TRUE;
5972 }
5973
b49e97c9
TS
5974 switch (sym->st_shndx)
5975 {
5976 case SHN_COMMON:
5977 /* Common symbols less than the GP size are automatically
5978 treated as SHN_MIPS_SCOMMON symbols. */
5979 if (sym->st_size > elf_gp_size (abfd)
b59eed79 5980 || ELF_ST_TYPE (sym->st_info) == STT_TLS
b49e97c9
TS
5981 || IRIX_COMPAT (abfd) == ict_irix6)
5982 break;
5983 /* Fall through. */
5984 case SHN_MIPS_SCOMMON:
5985 *secp = bfd_make_section_old_way (abfd, ".scommon");
5986 (*secp)->flags |= SEC_IS_COMMON;
5987 *valp = sym->st_size;
5988 break;
5989
5990 case SHN_MIPS_TEXT:
5991 /* This section is used in a shared object. */
5992 if (elf_tdata (abfd)->elf_text_section == NULL)
5993 {
5994 asymbol *elf_text_symbol;
5995 asection *elf_text_section;
5996 bfd_size_type amt = sizeof (asection);
5997
5998 elf_text_section = bfd_zalloc (abfd, amt);
5999 if (elf_text_section == NULL)
b34976b6 6000 return FALSE;
b49e97c9
TS
6001
6002 amt = sizeof (asymbol);
6003 elf_text_symbol = bfd_zalloc (abfd, amt);
6004 if (elf_text_symbol == NULL)
b34976b6 6005 return FALSE;
b49e97c9
TS
6006
6007 /* Initialize the section. */
6008
6009 elf_tdata (abfd)->elf_text_section = elf_text_section;
6010 elf_tdata (abfd)->elf_text_symbol = elf_text_symbol;
6011
6012 elf_text_section->symbol = elf_text_symbol;
6013 elf_text_section->symbol_ptr_ptr = &elf_tdata (abfd)->elf_text_symbol;
6014
6015 elf_text_section->name = ".text";
6016 elf_text_section->flags = SEC_NO_FLAGS;
6017 elf_text_section->output_section = NULL;
6018 elf_text_section->owner = abfd;
6019 elf_text_symbol->name = ".text";
6020 elf_text_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
6021 elf_text_symbol->section = elf_text_section;
6022 }
6023 /* This code used to do *secp = bfd_und_section_ptr if
6024 info->shared. I don't know why, and that doesn't make sense,
6025 so I took it out. */
6026 *secp = elf_tdata (abfd)->elf_text_section;
6027 break;
6028
6029 case SHN_MIPS_ACOMMON:
6030 /* Fall through. XXX Can we treat this as allocated data? */
6031 case SHN_MIPS_DATA:
6032 /* This section is used in a shared object. */
6033 if (elf_tdata (abfd)->elf_data_section == NULL)
6034 {
6035 asymbol *elf_data_symbol;
6036 asection *elf_data_section;
6037 bfd_size_type amt = sizeof (asection);
6038
6039 elf_data_section = bfd_zalloc (abfd, amt);
6040 if (elf_data_section == NULL)
b34976b6 6041 return FALSE;
b49e97c9
TS
6042
6043 amt = sizeof (asymbol);
6044 elf_data_symbol = bfd_zalloc (abfd, amt);
6045 if (elf_data_symbol == NULL)
b34976b6 6046 return FALSE;
b49e97c9
TS
6047
6048 /* Initialize the section. */
6049
6050 elf_tdata (abfd)->elf_data_section = elf_data_section;
6051 elf_tdata (abfd)->elf_data_symbol = elf_data_symbol;
6052
6053 elf_data_section->symbol = elf_data_symbol;
6054 elf_data_section->symbol_ptr_ptr = &elf_tdata (abfd)->elf_data_symbol;
6055
6056 elf_data_section->name = ".data";
6057 elf_data_section->flags = SEC_NO_FLAGS;
6058 elf_data_section->output_section = NULL;
6059 elf_data_section->owner = abfd;
6060 elf_data_symbol->name = ".data";
6061 elf_data_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
6062 elf_data_symbol->section = elf_data_section;
6063 }
6064 /* This code used to do *secp = bfd_und_section_ptr if
6065 info->shared. I don't know why, and that doesn't make sense,
6066 so I took it out. */
6067 *secp = elf_tdata (abfd)->elf_data_section;
6068 break;
6069
6070 case SHN_MIPS_SUNDEFINED:
6071 *secp = bfd_und_section_ptr;
6072 break;
6073 }
6074
6075 if (SGI_COMPAT (abfd)
6076 && ! info->shared
6077 && info->hash->creator == abfd->xvec
6078 && strcmp (*namep, "__rld_obj_head") == 0)
6079 {
6080 struct elf_link_hash_entry *h;
14a793b2 6081 struct bfd_link_hash_entry *bh;
b49e97c9
TS
6082
6083 /* Mark __rld_obj_head as dynamic. */
14a793b2 6084 bh = NULL;
b49e97c9 6085 if (! (_bfd_generic_link_add_one_symbol
9719ad41 6086 (info, abfd, *namep, BSF_GLOBAL, *secp, *valp, NULL, FALSE,
14a793b2 6087 get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 6088 return FALSE;
14a793b2
AM
6089
6090 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
6091 h->non_elf = 0;
6092 h->def_regular = 1;
b49e97c9
TS
6093 h->type = STT_OBJECT;
6094
c152c796 6095 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 6096 return FALSE;
b49e97c9 6097
b34976b6 6098 mips_elf_hash_table (info)->use_rld_obj_head = TRUE;
b49e97c9
TS
6099 }
6100
6101 /* If this is a mips16 text symbol, add 1 to the value to make it
6102 odd. This will cause something like .word SYM to come up with
6103 the right value when it is loaded into the PC. */
6104 if (sym->st_other == STO_MIPS16)
6105 ++*valp;
6106
b34976b6 6107 return TRUE;
b49e97c9
TS
6108}
6109
6110/* This hook function is called before the linker writes out a global
6111 symbol. We mark symbols as small common if appropriate. This is
6112 also where we undo the increment of the value for a mips16 symbol. */
6113
b34976b6 6114bfd_boolean
9719ad41
RS
6115_bfd_mips_elf_link_output_symbol_hook
6116 (struct bfd_link_info *info ATTRIBUTE_UNUSED,
6117 const char *name ATTRIBUTE_UNUSED, Elf_Internal_Sym *sym,
6118 asection *input_sec, struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
b49e97c9
TS
6119{
6120 /* If we see a common symbol, which implies a relocatable link, then
6121 if a symbol was small common in an input file, mark it as small
6122 common in the output file. */
6123 if (sym->st_shndx == SHN_COMMON
6124 && strcmp (input_sec->name, ".scommon") == 0)
6125 sym->st_shndx = SHN_MIPS_SCOMMON;
6126
79cda7cf
FF
6127 if (sym->st_other == STO_MIPS16)
6128 sym->st_value &= ~1;
b49e97c9 6129
b34976b6 6130 return TRUE;
b49e97c9
TS
6131}
6132\f
6133/* Functions for the dynamic linker. */
6134
6135/* Create dynamic sections when linking against a dynamic object. */
6136
b34976b6 6137bfd_boolean
9719ad41 6138_bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
b49e97c9
TS
6139{
6140 struct elf_link_hash_entry *h;
14a793b2 6141 struct bfd_link_hash_entry *bh;
b49e97c9
TS
6142 flagword flags;
6143 register asection *s;
6144 const char * const *namep;
0a44bf69 6145 struct mips_elf_link_hash_table *htab;
b49e97c9 6146
0a44bf69 6147 htab = mips_elf_hash_table (info);
b49e97c9
TS
6148 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
6149 | SEC_LINKER_CREATED | SEC_READONLY);
6150
0a44bf69
RS
6151 /* The psABI requires a read-only .dynamic section, but the VxWorks
6152 EABI doesn't. */
6153 if (!htab->is_vxworks)
b49e97c9 6154 {
0a44bf69
RS
6155 s = bfd_get_section_by_name (abfd, ".dynamic");
6156 if (s != NULL)
6157 {
6158 if (! bfd_set_section_flags (abfd, s, flags))
6159 return FALSE;
6160 }
b49e97c9
TS
6161 }
6162
6163 /* We need to create .got section. */
f4416af6
AO
6164 if (! mips_elf_create_got_section (abfd, info, FALSE))
6165 return FALSE;
6166
0a44bf69 6167 if (! mips_elf_rel_dyn_section (info, TRUE))
b34976b6 6168 return FALSE;
b49e97c9 6169
b49e97c9
TS
6170 /* Create .stub section. */
6171 if (bfd_get_section_by_name (abfd,
6172 MIPS_ELF_STUB_SECTION_NAME (abfd)) == NULL)
6173 {
3496cb2a
L
6174 s = bfd_make_section_with_flags (abfd,
6175 MIPS_ELF_STUB_SECTION_NAME (abfd),
6176 flags | SEC_CODE);
b49e97c9 6177 if (s == NULL
b49e97c9
TS
6178 || ! bfd_set_section_alignment (abfd, s,
6179 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
b34976b6 6180 return FALSE;
b49e97c9
TS
6181 }
6182
6183 if ((IRIX_COMPAT (abfd) == ict_irix5 || IRIX_COMPAT (abfd) == ict_none)
6184 && !info->shared
6185 && bfd_get_section_by_name (abfd, ".rld_map") == NULL)
6186 {
3496cb2a
L
6187 s = bfd_make_section_with_flags (abfd, ".rld_map",
6188 flags &~ (flagword) SEC_READONLY);
b49e97c9 6189 if (s == NULL
b49e97c9
TS
6190 || ! bfd_set_section_alignment (abfd, s,
6191 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
b34976b6 6192 return FALSE;
b49e97c9
TS
6193 }
6194
6195 /* On IRIX5, we adjust add some additional symbols and change the
6196 alignments of several sections. There is no ABI documentation
6197 indicating that this is necessary on IRIX6, nor any evidence that
6198 the linker takes such action. */
6199 if (IRIX_COMPAT (abfd) == ict_irix5)
6200 {
6201 for (namep = mips_elf_dynsym_rtproc_names; *namep != NULL; namep++)
6202 {
14a793b2 6203 bh = NULL;
b49e97c9 6204 if (! (_bfd_generic_link_add_one_symbol
9719ad41
RS
6205 (info, abfd, *namep, BSF_GLOBAL, bfd_und_section_ptr, 0,
6206 NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 6207 return FALSE;
14a793b2
AM
6208
6209 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
6210 h->non_elf = 0;
6211 h->def_regular = 1;
b49e97c9
TS
6212 h->type = STT_SECTION;
6213
c152c796 6214 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 6215 return FALSE;
b49e97c9
TS
6216 }
6217
6218 /* We need to create a .compact_rel section. */
6219 if (SGI_COMPAT (abfd))
6220 {
6221 if (!mips_elf_create_compact_rel_section (abfd, info))
b34976b6 6222 return FALSE;
b49e97c9
TS
6223 }
6224
44c410de 6225 /* Change alignments of some sections. */
b49e97c9
TS
6226 s = bfd_get_section_by_name (abfd, ".hash");
6227 if (s != NULL)
d80dcc6a 6228 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
b49e97c9
TS
6229 s = bfd_get_section_by_name (abfd, ".dynsym");
6230 if (s != NULL)
d80dcc6a 6231 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
b49e97c9
TS
6232 s = bfd_get_section_by_name (abfd, ".dynstr");
6233 if (s != NULL)
d80dcc6a 6234 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
b49e97c9
TS
6235 s = bfd_get_section_by_name (abfd, ".reginfo");
6236 if (s != NULL)
d80dcc6a 6237 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
b49e97c9
TS
6238 s = bfd_get_section_by_name (abfd, ".dynamic");
6239 if (s != NULL)
d80dcc6a 6240 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
b49e97c9
TS
6241 }
6242
6243 if (!info->shared)
6244 {
14a793b2
AM
6245 const char *name;
6246
6247 name = SGI_COMPAT (abfd) ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING";
6248 bh = NULL;
6249 if (!(_bfd_generic_link_add_one_symbol
9719ad41
RS
6250 (info, abfd, name, BSF_GLOBAL, bfd_abs_section_ptr, 0,
6251 NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 6252 return FALSE;
14a793b2
AM
6253
6254 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
6255 h->non_elf = 0;
6256 h->def_regular = 1;
b49e97c9
TS
6257 h->type = STT_SECTION;
6258
c152c796 6259 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 6260 return FALSE;
b49e97c9
TS
6261
6262 if (! mips_elf_hash_table (info)->use_rld_obj_head)
6263 {
6264 /* __rld_map is a four byte word located in the .data section
6265 and is filled in by the rtld to contain a pointer to
6266 the _r_debug structure. Its symbol value will be set in
6267 _bfd_mips_elf_finish_dynamic_symbol. */
6268 s = bfd_get_section_by_name (abfd, ".rld_map");
6269 BFD_ASSERT (s != NULL);
6270
14a793b2
AM
6271 name = SGI_COMPAT (abfd) ? "__rld_map" : "__RLD_MAP";
6272 bh = NULL;
6273 if (!(_bfd_generic_link_add_one_symbol
9719ad41 6274 (info, abfd, name, BSF_GLOBAL, s, 0, NULL, FALSE,
14a793b2 6275 get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 6276 return FALSE;
14a793b2
AM
6277
6278 h = (struct elf_link_hash_entry *) bh;
f5385ebf
AM
6279 h->non_elf = 0;
6280 h->def_regular = 1;
b49e97c9
TS
6281 h->type = STT_OBJECT;
6282
c152c796 6283 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 6284 return FALSE;
b49e97c9
TS
6285 }
6286 }
6287
0a44bf69
RS
6288 if (htab->is_vxworks)
6289 {
6290 /* Create the .plt, .rela.plt, .dynbss and .rela.bss sections.
6291 Also create the _PROCEDURE_LINKAGE_TABLE symbol. */
6292 if (!_bfd_elf_create_dynamic_sections (abfd, info))
6293 return FALSE;
6294
6295 /* Cache the sections created above. */
6296 htab->sdynbss = bfd_get_section_by_name (abfd, ".dynbss");
6297 htab->srelbss = bfd_get_section_by_name (abfd, ".rela.bss");
6298 htab->srelplt = bfd_get_section_by_name (abfd, ".rela.plt");
6299 htab->splt = bfd_get_section_by_name (abfd, ".plt");
6300 if (!htab->sdynbss
6301 || (!htab->srelbss && !info->shared)
6302 || !htab->srelplt
6303 || !htab->splt)
6304 abort ();
6305
6306 /* Do the usual VxWorks handling. */
6307 if (!elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
6308 return FALSE;
6309
6310 /* Work out the PLT sizes. */
6311 if (info->shared)
6312 {
6313 htab->plt_header_size
6314 = 4 * ARRAY_SIZE (mips_vxworks_shared_plt0_entry);
6315 htab->plt_entry_size
6316 = 4 * ARRAY_SIZE (mips_vxworks_shared_plt_entry);
6317 }
6318 else
6319 {
6320 htab->plt_header_size
6321 = 4 * ARRAY_SIZE (mips_vxworks_exec_plt0_entry);
6322 htab->plt_entry_size
6323 = 4 * ARRAY_SIZE (mips_vxworks_exec_plt_entry);
6324 }
6325 }
6326
b34976b6 6327 return TRUE;
b49e97c9
TS
6328}
6329\f
c224138d
RS
6330/* Return true if relocation REL against section SEC is a REL rather than
6331 RELA relocation. RELOCS is the first relocation in the section and
6332 ABFD is the bfd that contains SEC. */
6333
6334static bfd_boolean
6335mips_elf_rel_relocation_p (bfd *abfd, asection *sec,
6336 const Elf_Internal_Rela *relocs,
6337 const Elf_Internal_Rela *rel)
6338{
6339 Elf_Internal_Shdr *rel_hdr;
6340 const struct elf_backend_data *bed;
6341
6342 /* To determine which flavor or relocation this is, we depend on the
6343 fact that the INPUT_SECTION's REL_HDR is read before its REL_HDR2. */
6344 rel_hdr = &elf_section_data (sec)->rel_hdr;
6345 bed = get_elf_backend_data (abfd);
6346 if ((size_t) (rel - relocs)
6347 >= (NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel))
6348 rel_hdr = elf_section_data (sec)->rel_hdr2;
6349 return rel_hdr->sh_entsize == MIPS_ELF_REL_SIZE (abfd);
6350}
6351
6352/* Read the addend for REL relocation REL, which belongs to bfd ABFD.
6353 HOWTO is the relocation's howto and CONTENTS points to the contents
6354 of the section that REL is against. */
6355
6356static bfd_vma
6357mips_elf_read_rel_addend (bfd *abfd, const Elf_Internal_Rela *rel,
6358 reloc_howto_type *howto, bfd_byte *contents)
6359{
6360 bfd_byte *location;
6361 unsigned int r_type;
6362 bfd_vma addend;
6363
6364 r_type = ELF_R_TYPE (abfd, rel->r_info);
6365 location = contents + rel->r_offset;
6366
6367 /* Get the addend, which is stored in the input file. */
6368 _bfd_mips16_elf_reloc_unshuffle (abfd, r_type, FALSE, location);
6369 addend = mips_elf_obtain_contents (howto, rel, abfd, contents);
6370 _bfd_mips16_elf_reloc_shuffle (abfd, r_type, FALSE, location);
6371
6372 return addend & howto->src_mask;
6373}
6374
6375/* REL is a relocation in ABFD that needs a partnering LO16 relocation
6376 and *ADDEND is the addend for REL itself. Look for the LO16 relocation
6377 and update *ADDEND with the final addend. Return true on success
6378 or false if the LO16 could not be found. RELEND is the exclusive
6379 upper bound on the relocations for REL's section. */
6380
6381static bfd_boolean
6382mips_elf_add_lo16_rel_addend (bfd *abfd,
6383 const Elf_Internal_Rela *rel,
6384 const Elf_Internal_Rela *relend,
6385 bfd_byte *contents, bfd_vma *addend)
6386{
6387 unsigned int r_type, lo16_type;
6388 const Elf_Internal_Rela *lo16_relocation;
6389 reloc_howto_type *lo16_howto;
6390 bfd_vma l;
6391
6392 r_type = ELF_R_TYPE (abfd, rel->r_info);
6393 if (r_type == R_MIPS16_HI16)
6394 lo16_type = R_MIPS16_LO16;
6395 else
6396 lo16_type = R_MIPS_LO16;
6397
6398 /* The combined value is the sum of the HI16 addend, left-shifted by
6399 sixteen bits, and the LO16 addend, sign extended. (Usually, the
6400 code does a `lui' of the HI16 value, and then an `addiu' of the
6401 LO16 value.)
6402
6403 Scan ahead to find a matching LO16 relocation.
6404
6405 According to the MIPS ELF ABI, the R_MIPS_LO16 relocation must
6406 be immediately following. However, for the IRIX6 ABI, the next
6407 relocation may be a composed relocation consisting of several
6408 relocations for the same address. In that case, the R_MIPS_LO16
6409 relocation may occur as one of these. We permit a similar
6410 extension in general, as that is useful for GCC.
6411
6412 In some cases GCC dead code elimination removes the LO16 but keeps
6413 the corresponding HI16. This is strictly speaking a violation of
6414 the ABI but not immediately harmful. */
6415 lo16_relocation = mips_elf_next_relocation (abfd, lo16_type, rel, relend);
6416 if (lo16_relocation == NULL)
6417 return FALSE;
6418
6419 /* Obtain the addend kept there. */
6420 lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, lo16_type, FALSE);
6421 l = mips_elf_read_rel_addend (abfd, lo16_relocation, lo16_howto, contents);
6422
6423 l <<= lo16_howto->rightshift;
6424 l = _bfd_mips_elf_sign_extend (l, 16);
6425
6426 *addend <<= 16;
6427 *addend += l;
6428 return TRUE;
6429}
6430
6431/* Try to read the contents of section SEC in bfd ABFD. Return true and
6432 store the contents in *CONTENTS on success. Assume that *CONTENTS
6433 already holds the contents if it is nonull on entry. */
6434
6435static bfd_boolean
6436mips_elf_get_section_contents (bfd *abfd, asection *sec, bfd_byte **contents)
6437{
6438 if (*contents)
6439 return TRUE;
6440
6441 /* Get cached copy if it exists. */
6442 if (elf_section_data (sec)->this_hdr.contents != NULL)
6443 {
6444 *contents = elf_section_data (sec)->this_hdr.contents;
6445 return TRUE;
6446 }
6447
6448 return bfd_malloc_and_get_section (abfd, sec, contents);
6449}
6450
b49e97c9
TS
6451/* Look through the relocs for a section during the first phase, and
6452 allocate space in the global offset table. */
6453
b34976b6 6454bfd_boolean
9719ad41
RS
6455_bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
6456 asection *sec, const Elf_Internal_Rela *relocs)
b49e97c9
TS
6457{
6458 const char *name;
6459 bfd *dynobj;
6460 Elf_Internal_Shdr *symtab_hdr;
6461 struct elf_link_hash_entry **sym_hashes;
6462 struct mips_got_info *g;
6463 size_t extsymoff;
6464 const Elf_Internal_Rela *rel;
6465 const Elf_Internal_Rela *rel_end;
6466 asection *sgot;
6467 asection *sreloc;
9c5bfbb7 6468 const struct elf_backend_data *bed;
0a44bf69 6469 struct mips_elf_link_hash_table *htab;
c224138d
RS
6470 bfd_byte *contents;
6471 bfd_vma addend;
6472 reloc_howto_type *howto;
b49e97c9 6473
1049f94e 6474 if (info->relocatable)
b34976b6 6475 return TRUE;
b49e97c9 6476
0a44bf69 6477 htab = mips_elf_hash_table (info);
b49e97c9
TS
6478 dynobj = elf_hash_table (info)->dynobj;
6479 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6480 sym_hashes = elf_sym_hashes (abfd);
6481 extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
6482
6483 /* Check for the mips16 stub sections. */
6484
6485 name = bfd_get_section_name (abfd, sec);
b9d58d71 6486 if (FN_STUB_P (name))
b49e97c9
TS
6487 {
6488 unsigned long r_symndx;
6489
6490 /* Look at the relocation information to figure out which symbol
6491 this is for. */
6492
6493 r_symndx = ELF_R_SYM (abfd, relocs->r_info);
6494
6495 if (r_symndx < extsymoff
6496 || sym_hashes[r_symndx - extsymoff] == NULL)
6497 {
6498 asection *o;
6499
6500 /* This stub is for a local symbol. This stub will only be
6501 needed if there is some relocation in this BFD, other
6502 than a 16 bit function call, which refers to this symbol. */
6503 for (o = abfd->sections; o != NULL; o = o->next)
6504 {
6505 Elf_Internal_Rela *sec_relocs;
6506 const Elf_Internal_Rela *r, *rend;
6507
6508 /* We can ignore stub sections when looking for relocs. */
6509 if ((o->flags & SEC_RELOC) == 0
6510 || o->reloc_count == 0
b9d58d71 6511 || mips16_stub_section_p (abfd, o))
b49e97c9
TS
6512 continue;
6513
45d6a902 6514 sec_relocs
9719ad41 6515 = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
45d6a902 6516 info->keep_memory);
b49e97c9 6517 if (sec_relocs == NULL)
b34976b6 6518 return FALSE;
b49e97c9
TS
6519
6520 rend = sec_relocs + o->reloc_count;
6521 for (r = sec_relocs; r < rend; r++)
6522 if (ELF_R_SYM (abfd, r->r_info) == r_symndx
6523 && ELF_R_TYPE (abfd, r->r_info) != R_MIPS16_26)
6524 break;
6525
6cdc0ccc 6526 if (elf_section_data (o)->relocs != sec_relocs)
b49e97c9
TS
6527 free (sec_relocs);
6528
6529 if (r < rend)
6530 break;
6531 }
6532
6533 if (o == NULL)
6534 {
6535 /* There is no non-call reloc for this stub, so we do
6536 not need it. Since this function is called before
6537 the linker maps input sections to output sections, we
6538 can easily discard it by setting the SEC_EXCLUDE
6539 flag. */
6540 sec->flags |= SEC_EXCLUDE;
b34976b6 6541 return TRUE;
b49e97c9
TS
6542 }
6543
6544 /* Record this stub in an array of local symbol stubs for
6545 this BFD. */
6546 if (elf_tdata (abfd)->local_stubs == NULL)
6547 {
6548 unsigned long symcount;
6549 asection **n;
6550 bfd_size_type amt;
6551
6552 if (elf_bad_symtab (abfd))
6553 symcount = NUM_SHDR_ENTRIES (symtab_hdr);
6554 else
6555 symcount = symtab_hdr->sh_info;
6556 amt = symcount * sizeof (asection *);
9719ad41 6557 n = bfd_zalloc (abfd, amt);
b49e97c9 6558 if (n == NULL)
b34976b6 6559 return FALSE;
b49e97c9
TS
6560 elf_tdata (abfd)->local_stubs = n;
6561 }
6562
b9d58d71 6563 sec->flags |= SEC_KEEP;
b49e97c9
TS
6564 elf_tdata (abfd)->local_stubs[r_symndx] = sec;
6565
6566 /* We don't need to set mips16_stubs_seen in this case.
6567 That flag is used to see whether we need to look through
6568 the global symbol table for stubs. We don't need to set
6569 it here, because we just have a local stub. */
6570 }
6571 else
6572 {
6573 struct mips_elf_link_hash_entry *h;
6574
6575 h = ((struct mips_elf_link_hash_entry *)
6576 sym_hashes[r_symndx - extsymoff]);
6577
973a3492
L
6578 while (h->root.root.type == bfd_link_hash_indirect
6579 || h->root.root.type == bfd_link_hash_warning)
6580 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
6581
b49e97c9
TS
6582 /* H is the symbol this stub is for. */
6583
b9d58d71
TS
6584 /* If we already have an appropriate stub for this function, we
6585 don't need another one, so we can discard this one. Since
6586 this function is called before the linker maps input sections
6587 to output sections, we can easily discard it by setting the
6588 SEC_EXCLUDE flag. */
6589 if (h->fn_stub != NULL)
6590 {
6591 sec->flags |= SEC_EXCLUDE;
6592 return TRUE;
6593 }
6594
6595 sec->flags |= SEC_KEEP;
b49e97c9 6596 h->fn_stub = sec;
b34976b6 6597 mips_elf_hash_table (info)->mips16_stubs_seen = TRUE;
b49e97c9
TS
6598 }
6599 }
b9d58d71 6600 else if (CALL_STUB_P (name) || CALL_FP_STUB_P (name))
b49e97c9
TS
6601 {
6602 unsigned long r_symndx;
6603 struct mips_elf_link_hash_entry *h;
6604 asection **loc;
6605
6606 /* Look at the relocation information to figure out which symbol
6607 this is for. */
6608
6609 r_symndx = ELF_R_SYM (abfd, relocs->r_info);
6610
6611 if (r_symndx < extsymoff
6612 || sym_hashes[r_symndx - extsymoff] == NULL)
6613 {
b9d58d71 6614 asection *o;
b49e97c9 6615
b9d58d71
TS
6616 /* This stub is for a local symbol. This stub will only be
6617 needed if there is some relocation (R_MIPS16_26) in this BFD
6618 that refers to this symbol. */
6619 for (o = abfd->sections; o != NULL; o = o->next)
6620 {
6621 Elf_Internal_Rela *sec_relocs;
6622 const Elf_Internal_Rela *r, *rend;
6623
6624 /* We can ignore stub sections when looking for relocs. */
6625 if ((o->flags & SEC_RELOC) == 0
6626 || o->reloc_count == 0
6627 || mips16_stub_section_p (abfd, o))
6628 continue;
6629
6630 sec_relocs
6631 = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
6632 info->keep_memory);
6633 if (sec_relocs == NULL)
6634 return FALSE;
6635
6636 rend = sec_relocs + o->reloc_count;
6637 for (r = sec_relocs; r < rend; r++)
6638 if (ELF_R_SYM (abfd, r->r_info) == r_symndx
6639 && ELF_R_TYPE (abfd, r->r_info) == R_MIPS16_26)
6640 break;
6641
6642 if (elf_section_data (o)->relocs != sec_relocs)
6643 free (sec_relocs);
6644
6645 if (r < rend)
6646 break;
6647 }
6648
6649 if (o == NULL)
6650 {
6651 /* There is no non-call reloc for this stub, so we do
6652 not need it. Since this function is called before
6653 the linker maps input sections to output sections, we
6654 can easily discard it by setting the SEC_EXCLUDE
6655 flag. */
6656 sec->flags |= SEC_EXCLUDE;
6657 return TRUE;
6658 }
6659
6660 /* Record this stub in an array of local symbol call_stubs for
6661 this BFD. */
6662 if (elf_tdata (abfd)->local_call_stubs == NULL)
6663 {
6664 unsigned long symcount;
6665 asection **n;
6666 bfd_size_type amt;
6667
6668 if (elf_bad_symtab (abfd))
6669 symcount = NUM_SHDR_ENTRIES (symtab_hdr);
6670 else
6671 symcount = symtab_hdr->sh_info;
6672 amt = symcount * sizeof (asection *);
6673 n = bfd_zalloc (abfd, amt);
6674 if (n == NULL)
6675 return FALSE;
6676 elf_tdata (abfd)->local_call_stubs = n;
6677 }
b49e97c9 6678
b9d58d71
TS
6679 sec->flags |= SEC_KEEP;
6680 elf_tdata (abfd)->local_call_stubs[r_symndx] = sec;
b49e97c9 6681
b9d58d71
TS
6682 /* We don't need to set mips16_stubs_seen in this case.
6683 That flag is used to see whether we need to look through
6684 the global symbol table for stubs. We don't need to set
6685 it here, because we just have a local stub. */
6686 }
b49e97c9 6687 else
b49e97c9 6688 {
b9d58d71
TS
6689 h = ((struct mips_elf_link_hash_entry *)
6690 sym_hashes[r_symndx - extsymoff]);
6691
6692 /* H is the symbol this stub is for. */
6693
6694 if (CALL_FP_STUB_P (name))
6695 loc = &h->call_fp_stub;
6696 else
6697 loc = &h->call_stub;
6698
6699 /* If we already have an appropriate stub for this function, we
6700 don't need another one, so we can discard this one. Since
6701 this function is called before the linker maps input sections
6702 to output sections, we can easily discard it by setting the
6703 SEC_EXCLUDE flag. */
6704 if (*loc != NULL)
6705 {
6706 sec->flags |= SEC_EXCLUDE;
6707 return TRUE;
6708 }
b49e97c9 6709
b9d58d71
TS
6710 sec->flags |= SEC_KEEP;
6711 *loc = sec;
6712 mips_elf_hash_table (info)->mips16_stubs_seen = TRUE;
6713 }
b49e97c9
TS
6714 }
6715
6716 if (dynobj == NULL)
6717 {
6718 sgot = NULL;
6719 g = NULL;
6720 }
6721 else
6722 {
f4416af6 6723 sgot = mips_elf_got_section (dynobj, FALSE);
b49e97c9
TS
6724 if (sgot == NULL)
6725 g = NULL;
6726 else
6727 {
f0abc2a1
AM
6728 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
6729 g = mips_elf_section_data (sgot)->u.got_info;
b49e97c9
TS
6730 BFD_ASSERT (g != NULL);
6731 }
6732 }
6733
6734 sreloc = NULL;
6735 bed = get_elf_backend_data (abfd);
6736 rel_end = relocs + sec->reloc_count * bed->s->int_rels_per_ext_rel;
c224138d 6737 contents = NULL;
b49e97c9
TS
6738 for (rel = relocs; rel < rel_end; ++rel)
6739 {
6740 unsigned long r_symndx;
6741 unsigned int r_type;
6742 struct elf_link_hash_entry *h;
6743
6744 r_symndx = ELF_R_SYM (abfd, rel->r_info);
6745 r_type = ELF_R_TYPE (abfd, rel->r_info);
6746
6747 if (r_symndx < extsymoff)
6748 h = NULL;
6749 else if (r_symndx >= extsymoff + NUM_SHDR_ENTRIES (symtab_hdr))
6750 {
6751 (*_bfd_error_handler)
d003868e
AM
6752 (_("%B: Malformed reloc detected for section %s"),
6753 abfd, name);
b49e97c9 6754 bfd_set_error (bfd_error_bad_value);
b34976b6 6755 return FALSE;
b49e97c9
TS
6756 }
6757 else
6758 {
6759 h = sym_hashes[r_symndx - extsymoff];
6760
6761 /* This may be an indirect symbol created because of a version. */
6762 if (h != NULL)
6763 {
6764 while (h->root.type == bfd_link_hash_indirect)
6765 h = (struct elf_link_hash_entry *) h->root.u.i.link;
6766 }
6767 }
6768
6769 /* Some relocs require a global offset table. */
6770 if (dynobj == NULL || sgot == NULL)
6771 {
6772 switch (r_type)
6773 {
6774 case R_MIPS_GOT16:
6775 case R_MIPS_CALL16:
6776 case R_MIPS_CALL_HI16:
6777 case R_MIPS_CALL_LO16:
6778 case R_MIPS_GOT_HI16:
6779 case R_MIPS_GOT_LO16:
6780 case R_MIPS_GOT_PAGE:
6781 case R_MIPS_GOT_OFST:
6782 case R_MIPS_GOT_DISP:
86324f90 6783 case R_MIPS_TLS_GOTTPREL:
0f20cc35
DJ
6784 case R_MIPS_TLS_GD:
6785 case R_MIPS_TLS_LDM:
b49e97c9
TS
6786 if (dynobj == NULL)
6787 elf_hash_table (info)->dynobj = dynobj = abfd;
f4416af6 6788 if (! mips_elf_create_got_section (dynobj, info, FALSE))
b34976b6 6789 return FALSE;
b49e97c9 6790 g = mips_elf_got_info (dynobj, &sgot);
0a44bf69
RS
6791 if (htab->is_vxworks && !info->shared)
6792 {
6793 (*_bfd_error_handler)
6794 (_("%B: GOT reloc at 0x%lx not expected in executables"),
6795 abfd, (unsigned long) rel->r_offset);
6796 bfd_set_error (bfd_error_bad_value);
6797 return FALSE;
6798 }
b49e97c9
TS
6799 break;
6800
6801 case R_MIPS_32:
6802 case R_MIPS_REL32:
6803 case R_MIPS_64:
0a44bf69
RS
6804 /* In VxWorks executables, references to external symbols
6805 are handled using copy relocs or PLT stubs, so there's
6806 no need to add a dynamic relocation here. */
b49e97c9 6807 if (dynobj == NULL
0a44bf69 6808 && (info->shared || (h != NULL && !htab->is_vxworks))
b49e97c9
TS
6809 && (sec->flags & SEC_ALLOC) != 0)
6810 elf_hash_table (info)->dynobj = dynobj = abfd;
6811 break;
6812
6813 default:
6814 break;
6815 }
6816 }
6817
0a44bf69
RS
6818 if (h)
6819 {
6820 ((struct mips_elf_link_hash_entry *) h)->is_relocation_target = TRUE;
6821
6822 /* Relocations against the special VxWorks __GOTT_BASE__ and
6823 __GOTT_INDEX__ symbols must be left to the loader. Allocate
6824 room for them in .rela.dyn. */
6825 if (is_gott_symbol (info, h))
6826 {
6827 if (sreloc == NULL)
6828 {
6829 sreloc = mips_elf_rel_dyn_section (info, TRUE);
6830 if (sreloc == NULL)
6831 return FALSE;
6832 }
6833 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
9e3313ae
RS
6834 if (MIPS_ELF_READONLY_SECTION (sec))
6835 /* We tell the dynamic linker that there are
6836 relocations against the text segment. */
6837 info->flags |= DF_TEXTREL;
0a44bf69
RS
6838 }
6839 }
6840 else if (r_type == R_MIPS_CALL_LO16
6841 || r_type == R_MIPS_GOT_LO16
6842 || r_type == R_MIPS_GOT_DISP
6843 || (r_type == R_MIPS_GOT16 && htab->is_vxworks))
b49e97c9
TS
6844 {
6845 /* We may need a local GOT entry for this relocation. We
6846 don't count R_MIPS_GOT_PAGE because we can estimate the
6847 maximum number of pages needed by looking at the size of
6848 the segment. Similar comments apply to R_MIPS_GOT16 and
0a44bf69
RS
6849 R_MIPS_CALL16, except on VxWorks, where GOT relocations
6850 always evaluate to "G". We don't count R_MIPS_GOT_HI16, or
b49e97c9 6851 R_MIPS_CALL_HI16 because these are always followed by an
b15e6682 6852 R_MIPS_GOT_LO16 or R_MIPS_CALL_LO16. */
f4416af6 6853 if (! mips_elf_record_local_got_symbol (abfd, r_symndx,
0f20cc35 6854 rel->r_addend, g, 0))
f4416af6 6855 return FALSE;
b49e97c9
TS
6856 }
6857
6858 switch (r_type)
6859 {
6860 case R_MIPS_CALL16:
6861 if (h == NULL)
6862 {
6863 (*_bfd_error_handler)
d003868e
AM
6864 (_("%B: CALL16 reloc at 0x%lx not against global symbol"),
6865 abfd, (unsigned long) rel->r_offset);
b49e97c9 6866 bfd_set_error (bfd_error_bad_value);
b34976b6 6867 return FALSE;
b49e97c9
TS
6868 }
6869 /* Fall through. */
6870
6871 case R_MIPS_CALL_HI16:
6872 case R_MIPS_CALL_LO16:
6873 if (h != NULL)
6874 {
0a44bf69
RS
6875 /* VxWorks call relocations point the function's .got.plt
6876 entry, which will be allocated by adjust_dynamic_symbol.
6877 Otherwise, this symbol requires a global GOT entry. */
8275b357 6878 if ((!htab->is_vxworks || h->forced_local)
0a44bf69 6879 && !mips_elf_record_global_got_symbol (h, abfd, info, g, 0))
b34976b6 6880 return FALSE;
b49e97c9
TS
6881
6882 /* We need a stub, not a plt entry for the undefined
6883 function. But we record it as if it needs plt. See
c152c796 6884 _bfd_elf_adjust_dynamic_symbol. */
f5385ebf 6885 h->needs_plt = 1;
b49e97c9
TS
6886 h->type = STT_FUNC;
6887 }
6888 break;
6889
0fdc1bf1
AO
6890 case R_MIPS_GOT_PAGE:
6891 /* If this is a global, overridable symbol, GOT_PAGE will
6892 decay to GOT_DISP, so we'll need a GOT entry for it. */
c224138d 6893 if (h)
0fdc1bf1
AO
6894 {
6895 struct mips_elf_link_hash_entry *hmips =
6896 (struct mips_elf_link_hash_entry *) h;
143d77c5 6897
0fdc1bf1
AO
6898 while (hmips->root.root.type == bfd_link_hash_indirect
6899 || hmips->root.root.type == bfd_link_hash_warning)
6900 hmips = (struct mips_elf_link_hash_entry *)
6901 hmips->root.root.u.i.link;
143d77c5 6902
f5385ebf 6903 if (hmips->root.def_regular
0fdc1bf1 6904 && ! (info->shared && ! info->symbolic
f5385ebf 6905 && ! hmips->root.forced_local))
c224138d 6906 h = NULL;
0fdc1bf1
AO
6907 }
6908 /* Fall through. */
6909
b49e97c9
TS
6910 case R_MIPS_GOT16:
6911 case R_MIPS_GOT_HI16:
6912 case R_MIPS_GOT_LO16:
c224138d
RS
6913 if (!h)
6914 {
6915 /* This relocation needs a page entry in the GOT. */
6916 if (mips_elf_rel_relocation_p (abfd, sec, relocs, rel))
6917 {
6918 if (!mips_elf_get_section_contents (abfd, sec, &contents))
6919 return FALSE;
6920 howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, FALSE);
6921 addend = mips_elf_read_rel_addend (abfd, rel,
6922 howto, contents);
6923 if (r_type == R_MIPS_GOT16)
6924 mips_elf_add_lo16_rel_addend (abfd, rel, rel_end,
6925 contents, &addend);
6926 else
6927 addend <<= howto->rightshift;
6928 }
6929 else
6930 addend = rel->r_addend;
6931 if (!mips_elf_record_got_page_entry (abfd, r_symndx, addend, g))
6932 return FALSE;
6933 break;
6934 }
6935 /* Fall through. */
6936
b49e97c9 6937 case R_MIPS_GOT_DISP:
0f20cc35 6938 if (h && ! mips_elf_record_global_got_symbol (h, abfd, info, g, 0))
b34976b6 6939 return FALSE;
b49e97c9
TS
6940 break;
6941
0f20cc35
DJ
6942 case R_MIPS_TLS_GOTTPREL:
6943 if (info->shared)
6944 info->flags |= DF_STATIC_TLS;
6945 /* Fall through */
6946
6947 case R_MIPS_TLS_LDM:
6948 if (r_type == R_MIPS_TLS_LDM)
6949 {
6950 r_symndx = 0;
6951 h = NULL;
6952 }
6953 /* Fall through */
6954
6955 case R_MIPS_TLS_GD:
6956 /* This symbol requires a global offset table entry, or two
6957 for TLS GD relocations. */
6958 {
6959 unsigned char flag = (r_type == R_MIPS_TLS_GD
6960 ? GOT_TLS_GD
6961 : r_type == R_MIPS_TLS_LDM
6962 ? GOT_TLS_LDM
6963 : GOT_TLS_IE);
6964 if (h != NULL)
6965 {
6966 struct mips_elf_link_hash_entry *hmips =
6967 (struct mips_elf_link_hash_entry *) h;
6968 hmips->tls_type |= flag;
6969
6970 if (h && ! mips_elf_record_global_got_symbol (h, abfd, info, g, flag))
6971 return FALSE;
6972 }
6973 else
6974 {
6975 BFD_ASSERT (flag == GOT_TLS_LDM || r_symndx != 0);
6976
6977 if (! mips_elf_record_local_got_symbol (abfd, r_symndx,
6978 rel->r_addend, g, flag))
6979 return FALSE;
6980 }
6981 }
6982 break;
6983
b49e97c9
TS
6984 case R_MIPS_32:
6985 case R_MIPS_REL32:
6986 case R_MIPS_64:
0a44bf69
RS
6987 /* In VxWorks executables, references to external symbols
6988 are handled using copy relocs or PLT stubs, so there's
6989 no need to add a .rela.dyn entry for this relocation. */
6990 if ((info->shared || (h != NULL && !htab->is_vxworks))
b49e97c9
TS
6991 && (sec->flags & SEC_ALLOC) != 0)
6992 {
6993 if (sreloc == NULL)
6994 {
0a44bf69 6995 sreloc = mips_elf_rel_dyn_section (info, TRUE);
b49e97c9 6996 if (sreloc == NULL)
f4416af6 6997 return FALSE;
b49e97c9 6998 }
b49e97c9 6999 if (info->shared)
82f0cfbd
EC
7000 {
7001 /* When creating a shared object, we must copy these
7002 reloc types into the output file as R_MIPS_REL32
0a44bf69
RS
7003 relocs. Make room for this reloc in .rel(a).dyn. */
7004 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
943284cc 7005 if (MIPS_ELF_READONLY_SECTION (sec))
82f0cfbd
EC
7006 /* We tell the dynamic linker that there are
7007 relocations against the text segment. */
7008 info->flags |= DF_TEXTREL;
7009 }
b49e97c9
TS
7010 else
7011 {
7012 struct mips_elf_link_hash_entry *hmips;
82f0cfbd 7013
b49e97c9
TS
7014 /* We only need to copy this reloc if the symbol is
7015 defined in a dynamic object. */
7016 hmips = (struct mips_elf_link_hash_entry *) h;
7017 ++hmips->possibly_dynamic_relocs;
943284cc 7018 if (MIPS_ELF_READONLY_SECTION (sec))
82f0cfbd
EC
7019 /* We need it to tell the dynamic linker if there
7020 are relocations against the text segment. */
7021 hmips->readonly_reloc = TRUE;
b49e97c9
TS
7022 }
7023
7024 /* Even though we don't directly need a GOT entry for
7025 this symbol, a symbol must have a dynamic symbol
7026 table index greater that DT_MIPS_GOTSYM if there are
0a44bf69
RS
7027 dynamic relocations against it. This does not apply
7028 to VxWorks, which does not have the usual coupling
7029 between global GOT entries and .dynsym entries. */
7030 if (h != NULL && !htab->is_vxworks)
f4416af6
AO
7031 {
7032 if (dynobj == NULL)
7033 elf_hash_table (info)->dynobj = dynobj = abfd;
7034 if (! mips_elf_create_got_section (dynobj, info, TRUE))
7035 return FALSE;
7036 g = mips_elf_got_info (dynobj, &sgot);
0f20cc35 7037 if (! mips_elf_record_global_got_symbol (h, abfd, info, g, 0))
f4416af6
AO
7038 return FALSE;
7039 }
b49e97c9
TS
7040 }
7041
7042 if (SGI_COMPAT (abfd))
7043 mips_elf_hash_table (info)->compact_rel_size +=
7044 sizeof (Elf32_External_crinfo);
7045 break;
7046
0a44bf69
RS
7047 case R_MIPS_PC16:
7048 if (h)
7049 ((struct mips_elf_link_hash_entry *) h)->is_branch_target = TRUE;
7050 break;
7051
b49e97c9 7052 case R_MIPS_26:
0a44bf69
RS
7053 if (h)
7054 ((struct mips_elf_link_hash_entry *) h)->is_branch_target = TRUE;
7055 /* Fall through. */
7056
b49e97c9
TS
7057 case R_MIPS_GPREL16:
7058 case R_MIPS_LITERAL:
7059 case R_MIPS_GPREL32:
7060 if (SGI_COMPAT (abfd))
7061 mips_elf_hash_table (info)->compact_rel_size +=
7062 sizeof (Elf32_External_crinfo);
7063 break;
7064
7065 /* This relocation describes the C++ object vtable hierarchy.
7066 Reconstruct it for later use during GC. */
7067 case R_MIPS_GNU_VTINHERIT:
c152c796 7068 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 7069 return FALSE;
b49e97c9
TS
7070 break;
7071
7072 /* This relocation describes which C++ vtable entries are actually
7073 used. Record for later use during GC. */
7074 case R_MIPS_GNU_VTENTRY:
d17e0c6e
JB
7075 BFD_ASSERT (h != NULL);
7076 if (h != NULL
7077 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
b34976b6 7078 return FALSE;
b49e97c9
TS
7079 break;
7080
7081 default:
7082 break;
7083 }
7084
7085 /* We must not create a stub for a symbol that has relocations
0a44bf69
RS
7086 related to taking the function's address. This doesn't apply to
7087 VxWorks, where CALL relocs refer to a .got.plt entry instead of
7088 a normal .got entry. */
7089 if (!htab->is_vxworks && h != NULL)
7090 switch (r_type)
7091 {
7092 default:
7093 ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = TRUE;
7094 break;
7095 case R_MIPS_CALL16:
7096 case R_MIPS_CALL_HI16:
7097 case R_MIPS_CALL_LO16:
7098 case R_MIPS_JALR:
7099 break;
7100 }
b49e97c9
TS
7101
7102 /* If this reloc is not a 16 bit call, and it has a global
7103 symbol, then we will need the fn_stub if there is one.
7104 References from a stub section do not count. */
7105 if (h != NULL
7106 && r_type != R_MIPS16_26
b9d58d71 7107 && !mips16_stub_section_p (abfd, sec))
b49e97c9
TS
7108 {
7109 struct mips_elf_link_hash_entry *mh;
7110
7111 mh = (struct mips_elf_link_hash_entry *) h;
b34976b6 7112 mh->need_fn_stub = TRUE;
b49e97c9
TS
7113 }
7114 }
7115
b34976b6 7116 return TRUE;
b49e97c9
TS
7117}
7118\f
d0647110 7119bfd_boolean
9719ad41
RS
7120_bfd_mips_relax_section (bfd *abfd, asection *sec,
7121 struct bfd_link_info *link_info,
7122 bfd_boolean *again)
d0647110
AO
7123{
7124 Elf_Internal_Rela *internal_relocs;
7125 Elf_Internal_Rela *irel, *irelend;
7126 Elf_Internal_Shdr *symtab_hdr;
7127 bfd_byte *contents = NULL;
d0647110
AO
7128 size_t extsymoff;
7129 bfd_boolean changed_contents = FALSE;
7130 bfd_vma sec_start = sec->output_section->vma + sec->output_offset;
7131 Elf_Internal_Sym *isymbuf = NULL;
7132
7133 /* We are not currently changing any sizes, so only one pass. */
7134 *again = FALSE;
7135
1049f94e 7136 if (link_info->relocatable)
d0647110
AO
7137 return TRUE;
7138
9719ad41 7139 internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
45d6a902 7140 link_info->keep_memory);
d0647110
AO
7141 if (internal_relocs == NULL)
7142 return TRUE;
7143
7144 irelend = internal_relocs + sec->reloc_count
7145 * get_elf_backend_data (abfd)->s->int_rels_per_ext_rel;
7146 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
7147 extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
7148
7149 for (irel = internal_relocs; irel < irelend; irel++)
7150 {
7151 bfd_vma symval;
7152 bfd_signed_vma sym_offset;
7153 unsigned int r_type;
7154 unsigned long r_symndx;
7155 asection *sym_sec;
7156 unsigned long instruction;
7157
7158 /* Turn jalr into bgezal, and jr into beq, if they're marked
7159 with a JALR relocation, that indicate where they jump to.
7160 This saves some pipeline bubbles. */
7161 r_type = ELF_R_TYPE (abfd, irel->r_info);
7162 if (r_type != R_MIPS_JALR)
7163 continue;
7164
7165 r_symndx = ELF_R_SYM (abfd, irel->r_info);
7166 /* Compute the address of the jump target. */
7167 if (r_symndx >= extsymoff)
7168 {
7169 struct mips_elf_link_hash_entry *h
7170 = ((struct mips_elf_link_hash_entry *)
7171 elf_sym_hashes (abfd) [r_symndx - extsymoff]);
7172
7173 while (h->root.root.type == bfd_link_hash_indirect
7174 || h->root.root.type == bfd_link_hash_warning)
7175 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
143d77c5 7176
d0647110
AO
7177 /* If a symbol is undefined, or if it may be overridden,
7178 skip it. */
7179 if (! ((h->root.root.type == bfd_link_hash_defined
7180 || h->root.root.type == bfd_link_hash_defweak)
7181 && h->root.root.u.def.section)
7182 || (link_info->shared && ! link_info->symbolic
f5385ebf 7183 && !h->root.forced_local))
d0647110
AO
7184 continue;
7185
7186 sym_sec = h->root.root.u.def.section;
7187 if (sym_sec->output_section)
7188 symval = (h->root.root.u.def.value
7189 + sym_sec->output_section->vma
7190 + sym_sec->output_offset);
7191 else
7192 symval = h->root.root.u.def.value;
7193 }
7194 else
7195 {
7196 Elf_Internal_Sym *isym;
7197
7198 /* Read this BFD's symbols if we haven't done so already. */
7199 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
7200 {
7201 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
7202 if (isymbuf == NULL)
7203 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
7204 symtab_hdr->sh_info, 0,
7205 NULL, NULL, NULL);
7206 if (isymbuf == NULL)
7207 goto relax_return;
7208 }
7209
7210 isym = isymbuf + r_symndx;
7211 if (isym->st_shndx == SHN_UNDEF)
7212 continue;
7213 else if (isym->st_shndx == SHN_ABS)
7214 sym_sec = bfd_abs_section_ptr;
7215 else if (isym->st_shndx == SHN_COMMON)
7216 sym_sec = bfd_com_section_ptr;
7217 else
7218 sym_sec
7219 = bfd_section_from_elf_index (abfd, isym->st_shndx);
7220 symval = isym->st_value
7221 + sym_sec->output_section->vma
7222 + sym_sec->output_offset;
7223 }
7224
7225 /* Compute branch offset, from delay slot of the jump to the
7226 branch target. */
7227 sym_offset = (symval + irel->r_addend)
7228 - (sec_start + irel->r_offset + 4);
7229
7230 /* Branch offset must be properly aligned. */
7231 if ((sym_offset & 3) != 0)
7232 continue;
7233
7234 sym_offset >>= 2;
7235
7236 /* Check that it's in range. */
7237 if (sym_offset < -0x8000 || sym_offset >= 0x8000)
7238 continue;
143d77c5 7239
d0647110 7240 /* Get the section contents if we haven't done so already. */
c224138d
RS
7241 if (!mips_elf_get_section_contents (abfd, sec, &contents))
7242 goto relax_return;
d0647110
AO
7243
7244 instruction = bfd_get_32 (abfd, contents + irel->r_offset);
7245
7246 /* If it was jalr <reg>, turn it into bgezal $zero, <target>. */
7247 if ((instruction & 0xfc1fffff) == 0x0000f809)
7248 instruction = 0x04110000;
7249 /* If it was jr <reg>, turn it into b <target>. */
7250 else if ((instruction & 0xfc1fffff) == 0x00000008)
7251 instruction = 0x10000000;
7252 else
7253 continue;
7254
7255 instruction |= (sym_offset & 0xffff);
7256 bfd_put_32 (abfd, instruction, contents + irel->r_offset);
7257 changed_contents = TRUE;
7258 }
7259
7260 if (contents != NULL
7261 && elf_section_data (sec)->this_hdr.contents != contents)
7262 {
7263 if (!changed_contents && !link_info->keep_memory)
7264 free (contents);
7265 else
7266 {
7267 /* Cache the section contents for elf_link_input_bfd. */
7268 elf_section_data (sec)->this_hdr.contents = contents;
7269 }
7270 }
7271 return TRUE;
7272
143d77c5 7273 relax_return:
eea6121a
AM
7274 if (contents != NULL
7275 && elf_section_data (sec)->this_hdr.contents != contents)
7276 free (contents);
d0647110
AO
7277 return FALSE;
7278}
7279\f
b49e97c9
TS
7280/* Adjust a symbol defined by a dynamic object and referenced by a
7281 regular object. The current definition is in some section of the
7282 dynamic object, but we're not including those sections. We have to
7283 change the definition to something the rest of the link can
7284 understand. */
7285
b34976b6 7286bfd_boolean
9719ad41
RS
7287_bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
7288 struct elf_link_hash_entry *h)
b49e97c9
TS
7289{
7290 bfd *dynobj;
7291 struct mips_elf_link_hash_entry *hmips;
7292 asection *s;
5108fc1b 7293 struct mips_elf_link_hash_table *htab;
b49e97c9 7294
5108fc1b 7295 htab = mips_elf_hash_table (info);
b49e97c9
TS
7296 dynobj = elf_hash_table (info)->dynobj;
7297
7298 /* Make sure we know what is going on here. */
7299 BFD_ASSERT (dynobj != NULL
f5385ebf 7300 && (h->needs_plt
f6e332e6 7301 || h->u.weakdef != NULL
f5385ebf
AM
7302 || (h->def_dynamic
7303 && h->ref_regular
7304 && !h->def_regular)));
b49e97c9
TS
7305
7306 /* If this symbol is defined in a dynamic object, we need to copy
7307 any R_MIPS_32 or R_MIPS_REL32 relocs against it into the output
7308 file. */
7309 hmips = (struct mips_elf_link_hash_entry *) h;
1049f94e 7310 if (! info->relocatable
b49e97c9
TS
7311 && hmips->possibly_dynamic_relocs != 0
7312 && (h->root.type == bfd_link_hash_defweak
f5385ebf 7313 || !h->def_regular))
b49e97c9 7314 {
0a44bf69
RS
7315 mips_elf_allocate_dynamic_relocations
7316 (dynobj, info, hmips->possibly_dynamic_relocs);
82f0cfbd 7317 if (hmips->readonly_reloc)
b49e97c9
TS
7318 /* We tell the dynamic linker that there are relocations
7319 against the text segment. */
7320 info->flags |= DF_TEXTREL;
7321 }
7322
7323 /* For a function, create a stub, if allowed. */
7324 if (! hmips->no_fn_stub
f5385ebf 7325 && h->needs_plt)
b49e97c9
TS
7326 {
7327 if (! elf_hash_table (info)->dynamic_sections_created)
b34976b6 7328 return TRUE;
b49e97c9
TS
7329
7330 /* If this symbol is not defined in a regular file, then set
7331 the symbol to the stub location. This is required to make
7332 function pointers compare as equal between the normal
7333 executable and the shared library. */
f5385ebf 7334 if (!h->def_regular)
b49e97c9
TS
7335 {
7336 /* We need .stub section. */
7337 s = bfd_get_section_by_name (dynobj,
7338 MIPS_ELF_STUB_SECTION_NAME (dynobj));
7339 BFD_ASSERT (s != NULL);
7340
7341 h->root.u.def.section = s;
eea6121a 7342 h->root.u.def.value = s->size;
b49e97c9
TS
7343
7344 /* XXX Write this stub address somewhere. */
eea6121a 7345 h->plt.offset = s->size;
b49e97c9
TS
7346
7347 /* Make room for this stub code. */
5108fc1b 7348 s->size += htab->function_stub_size;
b49e97c9
TS
7349
7350 /* The last half word of the stub will be filled with the index
7351 of this symbol in .dynsym section. */
b34976b6 7352 return TRUE;
b49e97c9
TS
7353 }
7354 }
7355 else if ((h->type == STT_FUNC)
f5385ebf 7356 && !h->needs_plt)
b49e97c9
TS
7357 {
7358 /* This will set the entry for this symbol in the GOT to 0, and
7359 the dynamic linker will take care of this. */
7360 h->root.u.def.value = 0;
b34976b6 7361 return TRUE;
b49e97c9
TS
7362 }
7363
7364 /* If this is a weak symbol, and there is a real definition, the
7365 processor independent code will have arranged for us to see the
7366 real definition first, and we can just use the same value. */
f6e332e6 7367 if (h->u.weakdef != NULL)
b49e97c9 7368 {
f6e332e6
AM
7369 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
7370 || h->u.weakdef->root.type == bfd_link_hash_defweak);
7371 h->root.u.def.section = h->u.weakdef->root.u.def.section;
7372 h->root.u.def.value = h->u.weakdef->root.u.def.value;
b34976b6 7373 return TRUE;
b49e97c9
TS
7374 }
7375
7376 /* This is a reference to a symbol defined by a dynamic object which
7377 is not a function. */
7378
b34976b6 7379 return TRUE;
b49e97c9 7380}
0a44bf69
RS
7381
7382/* Likewise, for VxWorks. */
7383
7384bfd_boolean
7385_bfd_mips_vxworks_adjust_dynamic_symbol (struct bfd_link_info *info,
7386 struct elf_link_hash_entry *h)
7387{
7388 bfd *dynobj;
7389 struct mips_elf_link_hash_entry *hmips;
7390 struct mips_elf_link_hash_table *htab;
0a44bf69
RS
7391
7392 htab = mips_elf_hash_table (info);
7393 dynobj = elf_hash_table (info)->dynobj;
7394 hmips = (struct mips_elf_link_hash_entry *) h;
7395
7396 /* Make sure we know what is going on here. */
7397 BFD_ASSERT (dynobj != NULL
7398 && (h->needs_plt
7399 || h->needs_copy
7400 || h->u.weakdef != NULL
7401 || (h->def_dynamic
7402 && h->ref_regular
7403 && !h->def_regular)));
7404
7405 /* If the symbol is defined by a dynamic object, we need a PLT stub if
7406 either (a) we want to branch to the symbol or (b) we're linking an
7407 executable that needs a canonical function address. In the latter
7408 case, the canonical address will be the address of the executable's
7409 load stub. */
7410 if ((hmips->is_branch_target
7411 || (!info->shared
7412 && h->type == STT_FUNC
7413 && hmips->is_relocation_target))
7414 && h->def_dynamic
7415 && h->ref_regular
7416 && !h->def_regular
7417 && !h->forced_local)
7418 h->needs_plt = 1;
7419
7420 /* Locally-binding symbols do not need a PLT stub; we can refer to
7421 the functions directly. */
7422 else if (h->needs_plt
7423 && (SYMBOL_CALLS_LOCAL (info, h)
7424 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
7425 && h->root.type == bfd_link_hash_undefweak)))
7426 {
7427 h->needs_plt = 0;
7428 return TRUE;
7429 }
7430
7431 if (h->needs_plt)
7432 {
7433 /* If this is the first symbol to need a PLT entry, allocate room
7434 for the header, and for the header's .rela.plt.unloaded entries. */
7435 if (htab->splt->size == 0)
7436 {
7437 htab->splt->size += htab->plt_header_size;
7438 if (!info->shared)
7439 htab->srelplt2->size += 2 * sizeof (Elf32_External_Rela);
7440 }
7441
7442 /* Assign the next .plt entry to this symbol. */
7443 h->plt.offset = htab->splt->size;
7444 htab->splt->size += htab->plt_entry_size;
7445
7446 /* If the output file has no definition of the symbol, set the
7447 symbol's value to the address of the stub. For executables,
7448 point at the PLT load stub rather than the lazy resolution stub;
7449 this stub will become the canonical function address. */
7450 if (!h->def_regular)
7451 {
7452 h->root.u.def.section = htab->splt;
7453 h->root.u.def.value = h->plt.offset;
7454 if (!info->shared)
7455 h->root.u.def.value += 8;
7456 }
7457
7458 /* Make room for the .got.plt entry and the R_JUMP_SLOT relocation. */
7459 htab->sgotplt->size += 4;
7460 htab->srelplt->size += sizeof (Elf32_External_Rela);
7461
7462 /* Make room for the .rela.plt.unloaded relocations. */
7463 if (!info->shared)
7464 htab->srelplt2->size += 3 * sizeof (Elf32_External_Rela);
7465
7466 return TRUE;
7467 }
7468
7469 /* If a function symbol is defined by a dynamic object, and we do not
7470 need a PLT stub for it, the symbol's value should be zero. */
7471 if (h->type == STT_FUNC
7472 && h->def_dynamic
7473 && h->ref_regular
7474 && !h->def_regular)
7475 {
7476 h->root.u.def.value = 0;
7477 return TRUE;
7478 }
7479
7480 /* If this is a weak symbol, and there is a real definition, the
7481 processor independent code will have arranged for us to see the
7482 real definition first, and we can just use the same value. */
7483 if (h->u.weakdef != NULL)
7484 {
7485 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
7486 || h->u.weakdef->root.type == bfd_link_hash_defweak);
7487 h->root.u.def.section = h->u.weakdef->root.u.def.section;
7488 h->root.u.def.value = h->u.weakdef->root.u.def.value;
7489 return TRUE;
7490 }
7491
7492 /* This is a reference to a symbol defined by a dynamic object which
7493 is not a function. */
7494 if (info->shared)
7495 return TRUE;
7496
7497 /* We must allocate the symbol in our .dynbss section, which will
7498 become part of the .bss section of the executable. There will be
7499 an entry for this symbol in the .dynsym section. The dynamic
7500 object will contain position independent code, so all references
7501 from the dynamic object to this symbol will go through the global
7502 offset table. The dynamic linker will use the .dynsym entry to
7503 determine the address it must put in the global offset table, so
7504 both the dynamic object and the regular object will refer to the
7505 same memory location for the variable. */
7506
7507 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
7508 {
7509 htab->srelbss->size += sizeof (Elf32_External_Rela);
7510 h->needs_copy = 1;
7511 }
7512
027297b7 7513 return _bfd_elf_adjust_dynamic_copy (h, htab->sdynbss);
0a44bf69 7514}
b49e97c9 7515\f
5108fc1b
RS
7516/* Return the number of dynamic section symbols required by OUTPUT_BFD.
7517 The number might be exact or a worst-case estimate, depending on how
7518 much information is available to elf_backend_omit_section_dynsym at
7519 the current linking stage. */
7520
7521static bfd_size_type
7522count_section_dynsyms (bfd *output_bfd, struct bfd_link_info *info)
7523{
7524 bfd_size_type count;
7525
7526 count = 0;
7527 if (info->shared || elf_hash_table (info)->is_relocatable_executable)
7528 {
7529 asection *p;
7530 const struct elf_backend_data *bed;
7531
7532 bed = get_elf_backend_data (output_bfd);
7533 for (p = output_bfd->sections; p ; p = p->next)
7534 if ((p->flags & SEC_EXCLUDE) == 0
7535 && (p->flags & SEC_ALLOC) != 0
7536 && !(*bed->elf_backend_omit_section_dynsym) (output_bfd, info, p))
7537 ++count;
7538 }
7539 return count;
7540}
7541
b49e97c9
TS
7542/* This function is called after all the input files have been read,
7543 and the input sections have been assigned to output sections. We
7544 check for any mips16 stub sections that we can discard. */
7545
b34976b6 7546bfd_boolean
9719ad41
RS
7547_bfd_mips_elf_always_size_sections (bfd *output_bfd,
7548 struct bfd_link_info *info)
b49e97c9
TS
7549{
7550 asection *ri;
7551
f4416af6
AO
7552 bfd *dynobj;
7553 asection *s;
7554 struct mips_got_info *g;
7555 int i;
7556 bfd_size_type loadable_size = 0;
c224138d 7557 bfd_size_type page_gotno;
5108fc1b 7558 bfd_size_type dynsymcount;
f4416af6 7559 bfd *sub;
0f20cc35 7560 struct mips_elf_count_tls_arg count_tls_arg;
0a44bf69
RS
7561 struct mips_elf_link_hash_table *htab;
7562
7563 htab = mips_elf_hash_table (info);
f4416af6 7564
b49e97c9
TS
7565 /* The .reginfo section has a fixed size. */
7566 ri = bfd_get_section_by_name (output_bfd, ".reginfo");
7567 if (ri != NULL)
9719ad41 7568 bfd_set_section_size (output_bfd, ri, sizeof (Elf32_External_RegInfo));
b49e97c9 7569
1049f94e 7570 if (! (info->relocatable
f4416af6
AO
7571 || ! mips_elf_hash_table (info)->mips16_stubs_seen))
7572 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
9719ad41 7573 mips_elf_check_mips16_stubs, NULL);
f4416af6
AO
7574
7575 dynobj = elf_hash_table (info)->dynobj;
7576 if (dynobj == NULL)
7577 /* Relocatable links don't have it. */
7578 return TRUE;
143d77c5 7579
f4416af6
AO
7580 g = mips_elf_got_info (dynobj, &s);
7581 if (s == NULL)
b34976b6 7582 return TRUE;
b49e97c9 7583
f4416af6
AO
7584 /* Calculate the total loadable size of the output. That
7585 will give us the maximum number of GOT_PAGE entries
7586 required. */
7587 for (sub = info->input_bfds; sub; sub = sub->link_next)
7588 {
7589 asection *subsection;
7590
7591 for (subsection = sub->sections;
7592 subsection;
7593 subsection = subsection->next)
7594 {
7595 if ((subsection->flags & SEC_ALLOC) == 0)
7596 continue;
eea6121a 7597 loadable_size += ((subsection->size + 0xf)
f4416af6
AO
7598 &~ (bfd_size_type) 0xf);
7599 }
7600 }
7601
7602 /* There has to be a global GOT entry for every symbol with
7603 a dynamic symbol table index of DT_MIPS_GOTSYM or
7604 higher. Therefore, it make sense to put those symbols
7605 that need GOT entries at the end of the symbol table. We
7606 do that here. */
7607 if (! mips_elf_sort_hash_table (info, 1))
7608 return FALSE;
7609
7610 if (g->global_gotsym != NULL)
7611 i = elf_hash_table (info)->dynsymcount - g->global_gotsym->dynindx;
7612 else
7613 /* If there are no global symbols, or none requiring
7614 relocations, then GLOBAL_GOTSYM will be NULL. */
7615 i = 0;
7616
5108fc1b
RS
7617 /* Get a worst-case estimate of the number of dynamic symbols needed.
7618 At this point, dynsymcount does not account for section symbols
7619 and count_section_dynsyms may overestimate the number that will
7620 be needed. */
7621 dynsymcount = (elf_hash_table (info)->dynsymcount
7622 + count_section_dynsyms (output_bfd, info));
7623
7624 /* Determine the size of one stub entry. */
7625 htab->function_stub_size = (dynsymcount > 0x10000
7626 ? MIPS_FUNCTION_STUB_BIG_SIZE
7627 : MIPS_FUNCTION_STUB_NORMAL_SIZE);
7628
f4416af6
AO
7629 /* In the worst case, we'll get one stub per dynamic symbol, plus
7630 one to account for the dummy entry at the end required by IRIX
7631 rld. */
5108fc1b 7632 loadable_size += htab->function_stub_size * (i + 1);
f4416af6 7633
0a44bf69
RS
7634 if (htab->is_vxworks)
7635 /* There's no need to allocate page entries for VxWorks; R_MIPS_GOT16
7636 relocations against local symbols evaluate to "G", and the EABI does
7637 not include R_MIPS_GOT_PAGE. */
c224138d 7638 page_gotno = 0;
0a44bf69
RS
7639 else
7640 /* Assume there are two loadable segments consisting of contiguous
7641 sections. Is 5 enough? */
c224138d
RS
7642 page_gotno = (loadable_size >> 16) + 5;
7643
7644 /* Choose the smaller of the two estimates; both are intended to be
7645 conservative. */
7646 if (page_gotno > g->page_gotno)
7647 page_gotno = g->page_gotno;
f4416af6 7648
c224138d 7649 g->local_gotno += page_gotno;
eea6121a 7650 s->size += g->local_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
f4416af6
AO
7651
7652 g->global_gotno = i;
eea6121a 7653 s->size += i * MIPS_ELF_GOT_SIZE (output_bfd);
f4416af6 7654
0f20cc35
DJ
7655 /* We need to calculate tls_gotno for global symbols at this point
7656 instead of building it up earlier, to avoid doublecounting
7657 entries for one global symbol from multiple input files. */
7658 count_tls_arg.info = info;
7659 count_tls_arg.needed = 0;
7660 elf_link_hash_traverse (elf_hash_table (info),
7661 mips_elf_count_global_tls_entries,
7662 &count_tls_arg);
7663 g->tls_gotno += count_tls_arg.needed;
7664 s->size += g->tls_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
7665
7666 mips_elf_resolve_final_got_entries (g);
7667
0a44bf69
RS
7668 /* VxWorks does not support multiple GOTs. It initializes $gp to
7669 __GOTT_BASE__[__GOTT_INDEX__], the value of which is set by the
7670 dynamic loader. */
7671 if (!htab->is_vxworks && s->size > MIPS_ELF_GOT_MAX_SIZE (info))
0f20cc35 7672 {
c224138d 7673 if (! mips_elf_multi_got (output_bfd, info, g, s, page_gotno))
0f20cc35
DJ
7674 return FALSE;
7675 }
7676 else
7677 {
7678 /* Set up TLS entries for the first GOT. */
7679 g->tls_assigned_gotno = g->global_gotno + g->local_gotno;
7680 htab_traverse (g->got_entries, mips_elf_initialize_tls_index, g);
7681 }
8275b357 7682 htab->computed_got_sizes = TRUE;
b49e97c9 7683
b34976b6 7684 return TRUE;
b49e97c9
TS
7685}
7686
7687/* Set the sizes of the dynamic sections. */
7688
b34976b6 7689bfd_boolean
9719ad41
RS
7690_bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
7691 struct bfd_link_info *info)
b49e97c9
TS
7692{
7693 bfd *dynobj;
0a44bf69 7694 asection *s, *sreldyn;
b34976b6 7695 bfd_boolean reltext;
0a44bf69 7696 struct mips_elf_link_hash_table *htab;
b49e97c9 7697
0a44bf69 7698 htab = mips_elf_hash_table (info);
b49e97c9
TS
7699 dynobj = elf_hash_table (info)->dynobj;
7700 BFD_ASSERT (dynobj != NULL);
7701
7702 if (elf_hash_table (info)->dynamic_sections_created)
7703 {
7704 /* Set the contents of the .interp section to the interpreter. */
893c4fe2 7705 if (info->executable)
b49e97c9
TS
7706 {
7707 s = bfd_get_section_by_name (dynobj, ".interp");
7708 BFD_ASSERT (s != NULL);
eea6121a 7709 s->size
b49e97c9
TS
7710 = strlen (ELF_DYNAMIC_INTERPRETER (output_bfd)) + 1;
7711 s->contents
7712 = (bfd_byte *) ELF_DYNAMIC_INTERPRETER (output_bfd);
7713 }
7714 }
7715
7716 /* The check_relocs and adjust_dynamic_symbol entry points have
7717 determined the sizes of the various dynamic sections. Allocate
7718 memory for them. */
b34976b6 7719 reltext = FALSE;
0a44bf69 7720 sreldyn = NULL;
b49e97c9
TS
7721 for (s = dynobj->sections; s != NULL; s = s->next)
7722 {
7723 const char *name;
b49e97c9
TS
7724
7725 /* It's OK to base decisions on the section name, because none
7726 of the dynobj section names depend upon the input files. */
7727 name = bfd_get_section_name (dynobj, s);
7728
7729 if ((s->flags & SEC_LINKER_CREATED) == 0)
7730 continue;
7731
0112cd26 7732 if (CONST_STRNEQ (name, ".rel"))
b49e97c9 7733 {
c456f082 7734 if (s->size != 0)
b49e97c9
TS
7735 {
7736 const char *outname;
7737 asection *target;
7738
7739 /* If this relocation section applies to a read only
7740 section, then we probably need a DT_TEXTREL entry.
0a44bf69 7741 If the relocation section is .rel(a).dyn, we always
b49e97c9
TS
7742 assert a DT_TEXTREL entry rather than testing whether
7743 there exists a relocation to a read only section or
7744 not. */
7745 outname = bfd_get_section_name (output_bfd,
7746 s->output_section);
7747 target = bfd_get_section_by_name (output_bfd, outname + 4);
7748 if ((target != NULL
7749 && (target->flags & SEC_READONLY) != 0
7750 && (target->flags & SEC_ALLOC) != 0)
0a44bf69 7751 || strcmp (outname, MIPS_ELF_REL_DYN_NAME (info)) == 0)
b34976b6 7752 reltext = TRUE;
b49e97c9
TS
7753
7754 /* We use the reloc_count field as a counter if we need
7755 to copy relocs into the output file. */
0a44bf69 7756 if (strcmp (name, MIPS_ELF_REL_DYN_NAME (info)) != 0)
b49e97c9 7757 s->reloc_count = 0;
f4416af6
AO
7758
7759 /* If combreloc is enabled, elf_link_sort_relocs() will
7760 sort relocations, but in a different way than we do,
7761 and before we're done creating relocations. Also, it
7762 will move them around between input sections'
7763 relocation's contents, so our sorting would be
7764 broken, so don't let it run. */
7765 info->combreloc = 0;
b49e97c9
TS
7766 }
7767 }
0a44bf69
RS
7768 else if (htab->is_vxworks && strcmp (name, ".got") == 0)
7769 {
7770 /* Executables do not need a GOT. */
7771 if (info->shared)
7772 {
7773 /* Allocate relocations for all but the reserved entries. */
7774 struct mips_got_info *g;
7775 unsigned int count;
7776
7777 g = mips_elf_got_info (dynobj, NULL);
7778 count = (g->global_gotno
7779 + g->local_gotno
7780 - MIPS_RESERVED_GOTNO (info));
7781 mips_elf_allocate_dynamic_relocations (dynobj, info, count);
7782 }
7783 }
0112cd26 7784 else if (!htab->is_vxworks && CONST_STRNEQ (name, ".got"))
b49e97c9 7785 {
f4416af6
AO
7786 /* _bfd_mips_elf_always_size_sections() has already done
7787 most of the work, but some symbols may have been mapped
7788 to versions that we must now resolve in the got_entries
7789 hash tables. */
7790 struct mips_got_info *gg = mips_elf_got_info (dynobj, NULL);
7791 struct mips_got_info *g = gg;
7792 struct mips_elf_set_global_got_offset_arg set_got_offset_arg;
7793 unsigned int needed_relocs = 0;
143d77c5 7794
f4416af6 7795 if (gg->next)
b49e97c9 7796 {
f4416af6
AO
7797 set_got_offset_arg.value = MIPS_ELF_GOT_SIZE (output_bfd);
7798 set_got_offset_arg.info = info;
b49e97c9 7799
0f20cc35
DJ
7800 /* NOTE 2005-02-03: How can this call, or the next, ever
7801 find any indirect entries to resolve? They were all
7802 resolved in mips_elf_multi_got. */
f4416af6
AO
7803 mips_elf_resolve_final_got_entries (gg);
7804 for (g = gg->next; g && g->next != gg; g = g->next)
b49e97c9 7805 {
f4416af6
AO
7806 unsigned int save_assign;
7807
7808 mips_elf_resolve_final_got_entries (g);
7809
7810 /* Assign offsets to global GOT entries. */
7811 save_assign = g->assigned_gotno;
7812 g->assigned_gotno = g->local_gotno;
7813 set_got_offset_arg.g = g;
7814 set_got_offset_arg.needed_relocs = 0;
7815 htab_traverse (g->got_entries,
7816 mips_elf_set_global_got_offset,
7817 &set_got_offset_arg);
7818 needed_relocs += set_got_offset_arg.needed_relocs;
7819 BFD_ASSERT (g->assigned_gotno - g->local_gotno
7820 <= g->global_gotno);
7821
7822 g->assigned_gotno = save_assign;
7823 if (info->shared)
7824 {
7825 needed_relocs += g->local_gotno - g->assigned_gotno;
7826 BFD_ASSERT (g->assigned_gotno == g->next->local_gotno
7827 + g->next->global_gotno
0f20cc35 7828 + g->next->tls_gotno
0a44bf69 7829 + MIPS_RESERVED_GOTNO (info));
f4416af6 7830 }
b49e97c9 7831 }
0f20cc35
DJ
7832 }
7833 else
7834 {
7835 struct mips_elf_count_tls_arg arg;
7836 arg.info = info;
7837 arg.needed = 0;
b49e97c9 7838
0f20cc35
DJ
7839 htab_traverse (gg->got_entries, mips_elf_count_local_tls_relocs,
7840 &arg);
7841 elf_link_hash_traverse (elf_hash_table (info),
7842 mips_elf_count_global_tls_relocs,
7843 &arg);
7844
7845 needed_relocs += arg.needed;
f4416af6 7846 }
0f20cc35
DJ
7847
7848 if (needed_relocs)
0a44bf69
RS
7849 mips_elf_allocate_dynamic_relocations (dynobj, info,
7850 needed_relocs);
b49e97c9
TS
7851 }
7852 else if (strcmp (name, MIPS_ELF_STUB_SECTION_NAME (output_bfd)) == 0)
7853 {
8dc1a139 7854 /* IRIX rld assumes that the function stub isn't at the end
5108fc1b
RS
7855 of .text section. So put a dummy. XXX */
7856 s->size += htab->function_stub_size;
b49e97c9
TS
7857 }
7858 else if (! info->shared
7859 && ! mips_elf_hash_table (info)->use_rld_obj_head
0112cd26 7860 && CONST_STRNEQ (name, ".rld_map"))
b49e97c9 7861 {
5108fc1b 7862 /* We add a room for __rld_map. It will be filled in by the
b49e97c9 7863 rtld to contain a pointer to the _r_debug structure. */
eea6121a 7864 s->size += 4;
b49e97c9
TS
7865 }
7866 else if (SGI_COMPAT (output_bfd)
0112cd26 7867 && CONST_STRNEQ (name, ".compact_rel"))
eea6121a 7868 s->size += mips_elf_hash_table (info)->compact_rel_size;
0112cd26 7869 else if (! CONST_STRNEQ (name, ".init")
0a44bf69
RS
7870 && s != htab->sgotplt
7871 && s != htab->splt)
b49e97c9
TS
7872 {
7873 /* It's not one of our sections, so don't allocate space. */
7874 continue;
7875 }
7876
c456f082 7877 if (s->size == 0)
b49e97c9 7878 {
8423293d 7879 s->flags |= SEC_EXCLUDE;
b49e97c9
TS
7880 continue;
7881 }
7882
c456f082
AM
7883 if ((s->flags & SEC_HAS_CONTENTS) == 0)
7884 continue;
7885
0a44bf69
RS
7886 /* Allocate memory for this section last, since we may increase its
7887 size above. */
7888 if (strcmp (name, MIPS_ELF_REL_DYN_NAME (info)) == 0)
7889 {
7890 sreldyn = s;
7891 continue;
7892 }
7893
b49e97c9 7894 /* Allocate memory for the section contents. */
eea6121a 7895 s->contents = bfd_zalloc (dynobj, s->size);
c456f082 7896 if (s->contents == NULL)
b49e97c9
TS
7897 {
7898 bfd_set_error (bfd_error_no_memory);
b34976b6 7899 return FALSE;
b49e97c9
TS
7900 }
7901 }
7902
0a44bf69
RS
7903 /* Allocate memory for the .rel(a).dyn section. */
7904 if (sreldyn != NULL)
7905 {
7906 sreldyn->contents = bfd_zalloc (dynobj, sreldyn->size);
7907 if (sreldyn->contents == NULL)
7908 {
7909 bfd_set_error (bfd_error_no_memory);
7910 return FALSE;
7911 }
7912 }
7913
b49e97c9
TS
7914 if (elf_hash_table (info)->dynamic_sections_created)
7915 {
7916 /* Add some entries to the .dynamic section. We fill in the
7917 values later, in _bfd_mips_elf_finish_dynamic_sections, but we
7918 must add the entries now so that we get the correct size for
5750dcec 7919 the .dynamic section. */
af5978fb
RS
7920
7921 /* SGI object has the equivalence of DT_DEBUG in the
5750dcec
DJ
7922 DT_MIPS_RLD_MAP entry. This must come first because glibc
7923 only fills in DT_MIPS_RLD_MAP (not DT_DEBUG) and GDB only
7924 looks at the first one it sees. */
af5978fb
RS
7925 if (!info->shared
7926 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP, 0))
7927 return FALSE;
b49e97c9 7928
5750dcec
DJ
7929 /* The DT_DEBUG entry may be filled in by the dynamic linker and
7930 used by the debugger. */
7931 if (info->executable
7932 && !SGI_COMPAT (output_bfd)
7933 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_DEBUG, 0))
7934 return FALSE;
7935
0a44bf69 7936 if (reltext && (SGI_COMPAT (output_bfd) || htab->is_vxworks))
b49e97c9
TS
7937 info->flags |= DF_TEXTREL;
7938
7939 if ((info->flags & DF_TEXTREL) != 0)
7940 {
7941 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_TEXTREL, 0))
b34976b6 7942 return FALSE;
943284cc
DJ
7943
7944 /* Clear the DF_TEXTREL flag. It will be set again if we
7945 write out an actual text relocation; we may not, because
7946 at this point we do not know whether e.g. any .eh_frame
7947 absolute relocations have been converted to PC-relative. */
7948 info->flags &= ~DF_TEXTREL;
b49e97c9
TS
7949 }
7950
7951 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTGOT, 0))
b34976b6 7952 return FALSE;
b49e97c9 7953
0a44bf69 7954 if (htab->is_vxworks)
b49e97c9 7955 {
0a44bf69
RS
7956 /* VxWorks uses .rela.dyn instead of .rel.dyn. It does not
7957 use any of the DT_MIPS_* tags. */
7958 if (mips_elf_rel_dyn_section (info, FALSE))
7959 {
7960 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELA, 0))
7961 return FALSE;
b49e97c9 7962
0a44bf69
RS
7963 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELASZ, 0))
7964 return FALSE;
b49e97c9 7965
0a44bf69
RS
7966 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELAENT, 0))
7967 return FALSE;
7968 }
7969 if (htab->splt->size > 0)
7970 {
7971 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTREL, 0))
7972 return FALSE;
7973
7974 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_JMPREL, 0))
7975 return FALSE;
7976
7977 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTRELSZ, 0))
7978 return FALSE;
7979 }
b49e97c9 7980 }
0a44bf69
RS
7981 else
7982 {
7983 if (mips_elf_rel_dyn_section (info, FALSE))
7984 {
7985 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_REL, 0))
7986 return FALSE;
b49e97c9 7987
0a44bf69
RS
7988 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELSZ, 0))
7989 return FALSE;
b49e97c9 7990
0a44bf69
RS
7991 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELENT, 0))
7992 return FALSE;
7993 }
b49e97c9 7994
0a44bf69
RS
7995 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_VERSION, 0))
7996 return FALSE;
b49e97c9 7997
0a44bf69
RS
7998 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_FLAGS, 0))
7999 return FALSE;
b49e97c9 8000
0a44bf69
RS
8001 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_BASE_ADDRESS, 0))
8002 return FALSE;
b49e97c9 8003
0a44bf69
RS
8004 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_LOCAL_GOTNO, 0))
8005 return FALSE;
b49e97c9 8006
0a44bf69
RS
8007 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_SYMTABNO, 0))
8008 return FALSE;
b49e97c9 8009
0a44bf69
RS
8010 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_UNREFEXTNO, 0))
8011 return FALSE;
b49e97c9 8012
0a44bf69
RS
8013 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_GOTSYM, 0))
8014 return FALSE;
8015
8016 if (IRIX_COMPAT (dynobj) == ict_irix5
8017 && ! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_HIPAGENO, 0))
8018 return FALSE;
8019
8020 if (IRIX_COMPAT (dynobj) == ict_irix6
8021 && (bfd_get_section_by_name
8022 (dynobj, MIPS_ELF_OPTIONS_SECTION_NAME (dynobj)))
8023 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_OPTIONS, 0))
8024 return FALSE;
8025 }
7a2b07ff
NS
8026 if (htab->is_vxworks
8027 && !elf_vxworks_add_dynamic_entries (output_bfd, info))
8028 return FALSE;
b49e97c9
TS
8029 }
8030
b34976b6 8031 return TRUE;
b49e97c9
TS
8032}
8033\f
81d43bff
RS
8034/* REL is a relocation in INPUT_BFD that is being copied to OUTPUT_BFD.
8035 Adjust its R_ADDEND field so that it is correct for the output file.
8036 LOCAL_SYMS and LOCAL_SECTIONS are arrays of INPUT_BFD's local symbols
8037 and sections respectively; both use symbol indexes. */
8038
8039static void
8040mips_elf_adjust_addend (bfd *output_bfd, struct bfd_link_info *info,
8041 bfd *input_bfd, Elf_Internal_Sym *local_syms,
8042 asection **local_sections, Elf_Internal_Rela *rel)
8043{
8044 unsigned int r_type, r_symndx;
8045 Elf_Internal_Sym *sym;
8046 asection *sec;
8047
8048 if (mips_elf_local_relocation_p (input_bfd, rel, local_sections, FALSE))
8049 {
8050 r_type = ELF_R_TYPE (output_bfd, rel->r_info);
8051 if (r_type == R_MIPS16_GPREL
8052 || r_type == R_MIPS_GPREL16
8053 || r_type == R_MIPS_GPREL32
8054 || r_type == R_MIPS_LITERAL)
8055 {
8056 rel->r_addend += _bfd_get_gp_value (input_bfd);
8057 rel->r_addend -= _bfd_get_gp_value (output_bfd);
8058 }
8059
8060 r_symndx = ELF_R_SYM (output_bfd, rel->r_info);
8061 sym = local_syms + r_symndx;
8062
8063 /* Adjust REL's addend to account for section merging. */
8064 if (!info->relocatable)
8065 {
8066 sec = local_sections[r_symndx];
8067 _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
8068 }
8069
8070 /* This would normally be done by the rela_normal code in elflink.c. */
8071 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
8072 rel->r_addend += local_sections[r_symndx]->output_offset;
8073 }
8074}
8075
b49e97c9
TS
8076/* Relocate a MIPS ELF section. */
8077
b34976b6 8078bfd_boolean
9719ad41
RS
8079_bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
8080 bfd *input_bfd, asection *input_section,
8081 bfd_byte *contents, Elf_Internal_Rela *relocs,
8082 Elf_Internal_Sym *local_syms,
8083 asection **local_sections)
b49e97c9
TS
8084{
8085 Elf_Internal_Rela *rel;
8086 const Elf_Internal_Rela *relend;
8087 bfd_vma addend = 0;
b34976b6 8088 bfd_boolean use_saved_addend_p = FALSE;
9c5bfbb7 8089 const struct elf_backend_data *bed;
b49e97c9
TS
8090
8091 bed = get_elf_backend_data (output_bfd);
8092 relend = relocs + input_section->reloc_count * bed->s->int_rels_per_ext_rel;
8093 for (rel = relocs; rel < relend; ++rel)
8094 {
8095 const char *name;
c9adbffe 8096 bfd_vma value = 0;
b49e97c9 8097 reloc_howto_type *howto;
b34976b6
AM
8098 bfd_boolean require_jalx;
8099 /* TRUE if the relocation is a RELA relocation, rather than a
b49e97c9 8100 REL relocation. */
b34976b6 8101 bfd_boolean rela_relocation_p = TRUE;
b49e97c9 8102 unsigned int r_type = ELF_R_TYPE (output_bfd, rel->r_info);
9719ad41 8103 const char *msg;
ab96bf03
AM
8104 unsigned long r_symndx;
8105 asection *sec;
749b8d9d
L
8106 Elf_Internal_Shdr *symtab_hdr;
8107 struct elf_link_hash_entry *h;
b49e97c9
TS
8108
8109 /* Find the relocation howto for this relocation. */
ab96bf03
AM
8110 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type,
8111 NEWABI_P (input_bfd)
8112 && (MIPS_RELOC_RELA_P
8113 (input_bfd, input_section,
8114 rel - relocs)));
8115
8116 r_symndx = ELF_R_SYM (input_bfd, rel->r_info);
749b8d9d 8117 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
ab96bf03 8118 if (mips_elf_local_relocation_p (input_bfd, rel, local_sections, FALSE))
749b8d9d
L
8119 {
8120 sec = local_sections[r_symndx];
8121 h = NULL;
8122 }
ab96bf03
AM
8123 else
8124 {
ab96bf03 8125 unsigned long extsymoff;
ab96bf03 8126
ab96bf03
AM
8127 extsymoff = 0;
8128 if (!elf_bad_symtab (input_bfd))
8129 extsymoff = symtab_hdr->sh_info;
8130 h = elf_sym_hashes (input_bfd) [r_symndx - extsymoff];
8131 while (h->root.type == bfd_link_hash_indirect
8132 || h->root.type == bfd_link_hash_warning)
8133 h = (struct elf_link_hash_entry *) h->root.u.i.link;
8134
8135 sec = NULL;
8136 if (h->root.type == bfd_link_hash_defined
8137 || h->root.type == bfd_link_hash_defweak)
8138 sec = h->root.u.def.section;
8139 }
8140
8141 if (sec != NULL && elf_discarded_section (sec))
8142 {
8143 /* For relocs against symbols from removed linkonce sections,
8144 or sections discarded by a linker script, we just want the
8145 section contents zeroed. Avoid any special processing. */
8146 _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
8147 rel->r_info = 0;
8148 rel->r_addend = 0;
8149 continue;
8150 }
8151
4a14403c 8152 if (r_type == R_MIPS_64 && ! NEWABI_P (input_bfd))
b49e97c9
TS
8153 {
8154 /* Some 32-bit code uses R_MIPS_64. In particular, people use
8155 64-bit code, but make sure all their addresses are in the
8156 lowermost or uppermost 32-bit section of the 64-bit address
8157 space. Thus, when they use an R_MIPS_64 they mean what is
8158 usually meant by R_MIPS_32, with the exception that the
8159 stored value is sign-extended to 64 bits. */
b34976b6 8160 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, R_MIPS_32, FALSE);
b49e97c9
TS
8161
8162 /* On big-endian systems, we need to lie about the position
8163 of the reloc. */
8164 if (bfd_big_endian (input_bfd))
8165 rel->r_offset += 4;
8166 }
b49e97c9
TS
8167
8168 if (!use_saved_addend_p)
8169 {
b49e97c9
TS
8170 /* If these relocations were originally of the REL variety,
8171 we must pull the addend out of the field that will be
8172 relocated. Otherwise, we simply use the contents of the
c224138d
RS
8173 RELA relocation. */
8174 if (mips_elf_rel_relocation_p (input_bfd, input_section,
8175 relocs, rel))
b49e97c9 8176 {
b34976b6 8177 rela_relocation_p = FALSE;
c224138d
RS
8178 addend = mips_elf_read_rel_addend (input_bfd, rel,
8179 howto, contents);
8180 if (r_type == R_MIPS_HI16
8181 || r_type == R_MIPS16_HI16
b49e97c9
TS
8182 || (r_type == R_MIPS_GOT16
8183 && mips_elf_local_relocation_p (input_bfd, rel,
b34976b6 8184 local_sections, FALSE)))
b49e97c9 8185 {
c224138d
RS
8186 if (!mips_elf_add_lo16_rel_addend (input_bfd, rel, relend,
8187 contents, &addend))
749b8d9d
L
8188 {
8189 const char *name;
8190
8191 if (h)
8192 name = h->root.root.string;
8193 else
8194 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
8195 local_syms + r_symndx,
8196 sec);
8197 (*_bfd_error_handler)
8198 (_("%B: Can't find matching LO16 reloc against `%s' for %s at 0x%lx in section `%A'"),
8199 input_bfd, input_section, name, howto->name,
8200 rel->r_offset);
749b8d9d 8201 }
b49e97c9 8202 }
30ac9238
RS
8203 else
8204 addend <<= howto->rightshift;
b49e97c9
TS
8205 }
8206 else
8207 addend = rel->r_addend;
81d43bff
RS
8208 mips_elf_adjust_addend (output_bfd, info, input_bfd,
8209 local_syms, local_sections, rel);
b49e97c9
TS
8210 }
8211
1049f94e 8212 if (info->relocatable)
b49e97c9 8213 {
4a14403c 8214 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd)
b49e97c9
TS
8215 && bfd_big_endian (input_bfd))
8216 rel->r_offset -= 4;
8217
81d43bff 8218 if (!rela_relocation_p && rel->r_addend)
5a659663 8219 {
81d43bff 8220 addend += rel->r_addend;
30ac9238 8221 if (r_type == R_MIPS_HI16
4030e8f6 8222 || r_type == R_MIPS_GOT16)
5a659663
TS
8223 addend = mips_elf_high (addend);
8224 else if (r_type == R_MIPS_HIGHER)
8225 addend = mips_elf_higher (addend);
8226 else if (r_type == R_MIPS_HIGHEST)
8227 addend = mips_elf_highest (addend);
30ac9238
RS
8228 else
8229 addend >>= howto->rightshift;
b49e97c9 8230
30ac9238
RS
8231 /* We use the source mask, rather than the destination
8232 mask because the place to which we are writing will be
8233 source of the addend in the final link. */
b49e97c9
TS
8234 addend &= howto->src_mask;
8235
5a659663 8236 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
b49e97c9
TS
8237 /* See the comment above about using R_MIPS_64 in the 32-bit
8238 ABI. Here, we need to update the addend. It would be
8239 possible to get away with just using the R_MIPS_32 reloc
8240 but for endianness. */
8241 {
8242 bfd_vma sign_bits;
8243 bfd_vma low_bits;
8244 bfd_vma high_bits;
8245
8246 if (addend & ((bfd_vma) 1 << 31))
8247#ifdef BFD64
8248 sign_bits = ((bfd_vma) 1 << 32) - 1;
8249#else
8250 sign_bits = -1;
8251#endif
8252 else
8253 sign_bits = 0;
8254
8255 /* If we don't know that we have a 64-bit type,
8256 do two separate stores. */
8257 if (bfd_big_endian (input_bfd))
8258 {
8259 /* Store the sign-bits (which are most significant)
8260 first. */
8261 low_bits = sign_bits;
8262 high_bits = addend;
8263 }
8264 else
8265 {
8266 low_bits = addend;
8267 high_bits = sign_bits;
8268 }
8269 bfd_put_32 (input_bfd, low_bits,
8270 contents + rel->r_offset);
8271 bfd_put_32 (input_bfd, high_bits,
8272 contents + rel->r_offset + 4);
8273 continue;
8274 }
8275
8276 if (! mips_elf_perform_relocation (info, howto, rel, addend,
8277 input_bfd, input_section,
b34976b6
AM
8278 contents, FALSE))
8279 return FALSE;
b49e97c9
TS
8280 }
8281
8282 /* Go on to the next relocation. */
8283 continue;
8284 }
8285
8286 /* In the N32 and 64-bit ABIs there may be multiple consecutive
8287 relocations for the same offset. In that case we are
8288 supposed to treat the output of each relocation as the addend
8289 for the next. */
8290 if (rel + 1 < relend
8291 && rel->r_offset == rel[1].r_offset
8292 && ELF_R_TYPE (input_bfd, rel[1].r_info) != R_MIPS_NONE)
b34976b6 8293 use_saved_addend_p = TRUE;
b49e97c9 8294 else
b34976b6 8295 use_saved_addend_p = FALSE;
b49e97c9
TS
8296
8297 /* Figure out what value we are supposed to relocate. */
8298 switch (mips_elf_calculate_relocation (output_bfd, input_bfd,
8299 input_section, info, rel,
8300 addend, howto, local_syms,
8301 local_sections, &value,
bce03d3d
AO
8302 &name, &require_jalx,
8303 use_saved_addend_p))
b49e97c9
TS
8304 {
8305 case bfd_reloc_continue:
8306 /* There's nothing to do. */
8307 continue;
8308
8309 case bfd_reloc_undefined:
8310 /* mips_elf_calculate_relocation already called the
8311 undefined_symbol callback. There's no real point in
8312 trying to perform the relocation at this point, so we
8313 just skip ahead to the next relocation. */
8314 continue;
8315
8316 case bfd_reloc_notsupported:
8317 msg = _("internal error: unsupported relocation error");
8318 info->callbacks->warning
8319 (info, msg, name, input_bfd, input_section, rel->r_offset);
b34976b6 8320 return FALSE;
b49e97c9
TS
8321
8322 case bfd_reloc_overflow:
8323 if (use_saved_addend_p)
8324 /* Ignore overflow until we reach the last relocation for
8325 a given location. */
8326 ;
8327 else
8328 {
0e53d9da
AN
8329 struct mips_elf_link_hash_table *htab;
8330
8331 htab = mips_elf_hash_table (info);
b49e97c9 8332 BFD_ASSERT (name != NULL);
0e53d9da
AN
8333 if (!htab->small_data_overflow_reported
8334 && (howto->type == R_MIPS_GPREL16
8335 || howto->type == R_MIPS_LITERAL))
8336 {
8337 const char *msg =
8338 _("small-data section exceeds 64KB;"
8339 " lower small-data size limit (see option -G)");
8340
8341 htab->small_data_overflow_reported = TRUE;
8342 (*info->callbacks->einfo) ("%P: %s\n", msg);
8343 }
b49e97c9 8344 if (! ((*info->callbacks->reloc_overflow)
dfeffb9f 8345 (info, NULL, name, howto->name, (bfd_vma) 0,
b49e97c9 8346 input_bfd, input_section, rel->r_offset)))
b34976b6 8347 return FALSE;
b49e97c9
TS
8348 }
8349 break;
8350
8351 case bfd_reloc_ok:
8352 break;
8353
8354 default:
8355 abort ();
8356 break;
8357 }
8358
8359 /* If we've got another relocation for the address, keep going
8360 until we reach the last one. */
8361 if (use_saved_addend_p)
8362 {
8363 addend = value;
8364 continue;
8365 }
8366
4a14403c 8367 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
b49e97c9
TS
8368 /* See the comment above about using R_MIPS_64 in the 32-bit
8369 ABI. Until now, we've been using the HOWTO for R_MIPS_32;
8370 that calculated the right value. Now, however, we
8371 sign-extend the 32-bit result to 64-bits, and store it as a
8372 64-bit value. We are especially generous here in that we
8373 go to extreme lengths to support this usage on systems with
8374 only a 32-bit VMA. */
8375 {
8376 bfd_vma sign_bits;
8377 bfd_vma low_bits;
8378 bfd_vma high_bits;
8379
8380 if (value & ((bfd_vma) 1 << 31))
8381#ifdef BFD64
8382 sign_bits = ((bfd_vma) 1 << 32) - 1;
8383#else
8384 sign_bits = -1;
8385#endif
8386 else
8387 sign_bits = 0;
8388
8389 /* If we don't know that we have a 64-bit type,
8390 do two separate stores. */
8391 if (bfd_big_endian (input_bfd))
8392 {
8393 /* Undo what we did above. */
8394 rel->r_offset -= 4;
8395 /* Store the sign-bits (which are most significant)
8396 first. */
8397 low_bits = sign_bits;
8398 high_bits = value;
8399 }
8400 else
8401 {
8402 low_bits = value;
8403 high_bits = sign_bits;
8404 }
8405 bfd_put_32 (input_bfd, low_bits,
8406 contents + rel->r_offset);
8407 bfd_put_32 (input_bfd, high_bits,
8408 contents + rel->r_offset + 4);
8409 continue;
8410 }
8411
8412 /* Actually perform the relocation. */
8413 if (! mips_elf_perform_relocation (info, howto, rel, value,
8414 input_bfd, input_section,
8415 contents, require_jalx))
b34976b6 8416 return FALSE;
b49e97c9
TS
8417 }
8418
b34976b6 8419 return TRUE;
b49e97c9
TS
8420}
8421\f
8422/* If NAME is one of the special IRIX6 symbols defined by the linker,
8423 adjust it appropriately now. */
8424
8425static void
9719ad41
RS
8426mips_elf_irix6_finish_dynamic_symbol (bfd *abfd ATTRIBUTE_UNUSED,
8427 const char *name, Elf_Internal_Sym *sym)
b49e97c9
TS
8428{
8429 /* The linker script takes care of providing names and values for
8430 these, but we must place them into the right sections. */
8431 static const char* const text_section_symbols[] = {
8432 "_ftext",
8433 "_etext",
8434 "__dso_displacement",
8435 "__elf_header",
8436 "__program_header_table",
8437 NULL
8438 };
8439
8440 static const char* const data_section_symbols[] = {
8441 "_fdata",
8442 "_edata",
8443 "_end",
8444 "_fbss",
8445 NULL
8446 };
8447
8448 const char* const *p;
8449 int i;
8450
8451 for (i = 0; i < 2; ++i)
8452 for (p = (i == 0) ? text_section_symbols : data_section_symbols;
8453 *p;
8454 ++p)
8455 if (strcmp (*p, name) == 0)
8456 {
8457 /* All of these symbols are given type STT_SECTION by the
8458 IRIX6 linker. */
8459 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
e10609d3 8460 sym->st_other = STO_PROTECTED;
b49e97c9
TS
8461
8462 /* The IRIX linker puts these symbols in special sections. */
8463 if (i == 0)
8464 sym->st_shndx = SHN_MIPS_TEXT;
8465 else
8466 sym->st_shndx = SHN_MIPS_DATA;
8467
8468 break;
8469 }
8470}
8471
8472/* Finish up dynamic symbol handling. We set the contents of various
8473 dynamic sections here. */
8474
b34976b6 8475bfd_boolean
9719ad41
RS
8476_bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
8477 struct bfd_link_info *info,
8478 struct elf_link_hash_entry *h,
8479 Elf_Internal_Sym *sym)
b49e97c9
TS
8480{
8481 bfd *dynobj;
b49e97c9 8482 asection *sgot;
f4416af6 8483 struct mips_got_info *g, *gg;
b49e97c9 8484 const char *name;
3d6746ca 8485 int idx;
5108fc1b 8486 struct mips_elf_link_hash_table *htab;
b49e97c9 8487
5108fc1b 8488 htab = mips_elf_hash_table (info);
b49e97c9 8489 dynobj = elf_hash_table (info)->dynobj;
b49e97c9 8490
c5ae1840 8491 if (h->plt.offset != MINUS_ONE)
b49e97c9
TS
8492 {
8493 asection *s;
5108fc1b 8494 bfd_byte stub[MIPS_FUNCTION_STUB_BIG_SIZE];
b49e97c9
TS
8495
8496 /* This symbol has a stub. Set it up. */
8497
8498 BFD_ASSERT (h->dynindx != -1);
8499
8500 s = bfd_get_section_by_name (dynobj,
8501 MIPS_ELF_STUB_SECTION_NAME (dynobj));
8502 BFD_ASSERT (s != NULL);
8503
5108fc1b
RS
8504 BFD_ASSERT ((htab->function_stub_size == MIPS_FUNCTION_STUB_BIG_SIZE)
8505 || (h->dynindx <= 0xffff));
3d6746ca
DD
8506
8507 /* Values up to 2^31 - 1 are allowed. Larger values would cause
5108fc1b
RS
8508 sign extension at runtime in the stub, resulting in a negative
8509 index value. */
8510 if (h->dynindx & ~0x7fffffff)
b34976b6 8511 return FALSE;
b49e97c9
TS
8512
8513 /* Fill the stub. */
3d6746ca
DD
8514 idx = 0;
8515 bfd_put_32 (output_bfd, STUB_LW (output_bfd), stub + idx);
8516 idx += 4;
8517 bfd_put_32 (output_bfd, STUB_MOVE (output_bfd), stub + idx);
8518 idx += 4;
5108fc1b 8519 if (htab->function_stub_size == MIPS_FUNCTION_STUB_BIG_SIZE)
3d6746ca 8520 {
5108fc1b 8521 bfd_put_32 (output_bfd, STUB_LUI ((h->dynindx >> 16) & 0x7fff),
3d6746ca
DD
8522 stub + idx);
8523 idx += 4;
8524 }
8525 bfd_put_32 (output_bfd, STUB_JALR, stub + idx);
8526 idx += 4;
b49e97c9 8527
3d6746ca
DD
8528 /* If a large stub is not required and sign extension is not a
8529 problem, then use legacy code in the stub. */
5108fc1b
RS
8530 if (htab->function_stub_size == MIPS_FUNCTION_STUB_BIG_SIZE)
8531 bfd_put_32 (output_bfd, STUB_ORI (h->dynindx & 0xffff), stub + idx);
8532 else if (h->dynindx & ~0x7fff)
3d6746ca
DD
8533 bfd_put_32 (output_bfd, STUB_LI16U (h->dynindx & 0xffff), stub + idx);
8534 else
5108fc1b
RS
8535 bfd_put_32 (output_bfd, STUB_LI16S (output_bfd, h->dynindx),
8536 stub + idx);
8537
eea6121a 8538 BFD_ASSERT (h->plt.offset <= s->size);
5108fc1b 8539 memcpy (s->contents + h->plt.offset, stub, htab->function_stub_size);
b49e97c9
TS
8540
8541 /* Mark the symbol as undefined. plt.offset != -1 occurs
8542 only for the referenced symbol. */
8543 sym->st_shndx = SHN_UNDEF;
8544
8545 /* The run-time linker uses the st_value field of the symbol
8546 to reset the global offset table entry for this external
8547 to its stub address when unlinking a shared object. */
c5ae1840
TS
8548 sym->st_value = (s->output_section->vma + s->output_offset
8549 + h->plt.offset);
b49e97c9
TS
8550 }
8551
8552 BFD_ASSERT (h->dynindx != -1
f5385ebf 8553 || h->forced_local);
b49e97c9 8554
f4416af6 8555 sgot = mips_elf_got_section (dynobj, FALSE);
b49e97c9 8556 BFD_ASSERT (sgot != NULL);
f4416af6 8557 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
f0abc2a1 8558 g = mips_elf_section_data (sgot)->u.got_info;
b49e97c9
TS
8559 BFD_ASSERT (g != NULL);
8560
8561 /* Run through the global symbol table, creating GOT entries for all
8562 the symbols that need them. */
8563 if (g->global_gotsym != NULL
8564 && h->dynindx >= g->global_gotsym->dynindx)
8565 {
8566 bfd_vma offset;
8567 bfd_vma value;
8568
6eaa6adc 8569 value = sym->st_value;
0f20cc35 8570 offset = mips_elf_global_got_index (dynobj, output_bfd, h, R_MIPS_GOT16, info);
b49e97c9
TS
8571 MIPS_ELF_PUT_WORD (output_bfd, value, sgot->contents + offset);
8572 }
8573
0f20cc35 8574 if (g->next && h->dynindx != -1 && h->type != STT_TLS)
f4416af6
AO
8575 {
8576 struct mips_got_entry e, *p;
0626d451 8577 bfd_vma entry;
f4416af6 8578 bfd_vma offset;
f4416af6
AO
8579
8580 gg = g;
8581
8582 e.abfd = output_bfd;
8583 e.symndx = -1;
8584 e.d.h = (struct mips_elf_link_hash_entry *)h;
0f20cc35 8585 e.tls_type = 0;
143d77c5 8586
f4416af6
AO
8587 for (g = g->next; g->next != gg; g = g->next)
8588 {
8589 if (g->got_entries
8590 && (p = (struct mips_got_entry *) htab_find (g->got_entries,
8591 &e)))
8592 {
8593 offset = p->gotidx;
0626d451
RS
8594 if (info->shared
8595 || (elf_hash_table (info)->dynamic_sections_created
8596 && p->d.h != NULL
f5385ebf
AM
8597 && p->d.h->root.def_dynamic
8598 && !p->d.h->root.def_regular))
0626d451
RS
8599 {
8600 /* Create an R_MIPS_REL32 relocation for this entry. Due to
8601 the various compatibility problems, it's easier to mock
8602 up an R_MIPS_32 or R_MIPS_64 relocation and leave
8603 mips_elf_create_dynamic_relocation to calculate the
8604 appropriate addend. */
8605 Elf_Internal_Rela rel[3];
8606
8607 memset (rel, 0, sizeof (rel));
8608 if (ABI_64_P (output_bfd))
8609 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_64);
8610 else
8611 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_32);
8612 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
8613
8614 entry = 0;
8615 if (! (mips_elf_create_dynamic_relocation
8616 (output_bfd, info, rel,
8617 e.d.h, NULL, sym->st_value, &entry, sgot)))
8618 return FALSE;
8619 }
8620 else
8621 entry = sym->st_value;
8622 MIPS_ELF_PUT_WORD (output_bfd, entry, sgot->contents + offset);
f4416af6
AO
8623 }
8624 }
8625 }
8626
b49e97c9
TS
8627 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
8628 name = h->root.root.string;
8629 if (strcmp (name, "_DYNAMIC") == 0
22edb2f1 8630 || h == elf_hash_table (info)->hgot)
b49e97c9
TS
8631 sym->st_shndx = SHN_ABS;
8632 else if (strcmp (name, "_DYNAMIC_LINK") == 0
8633 || strcmp (name, "_DYNAMIC_LINKING") == 0)
8634 {
8635 sym->st_shndx = SHN_ABS;
8636 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8637 sym->st_value = 1;
8638 }
4a14403c 8639 else if (strcmp (name, "_gp_disp") == 0 && ! NEWABI_P (output_bfd))
b49e97c9
TS
8640 {
8641 sym->st_shndx = SHN_ABS;
8642 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8643 sym->st_value = elf_gp (output_bfd);
8644 }
8645 else if (SGI_COMPAT (output_bfd))
8646 {
8647 if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
8648 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
8649 {
8650 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8651 sym->st_other = STO_PROTECTED;
8652 sym->st_value = 0;
8653 sym->st_shndx = SHN_MIPS_DATA;
8654 }
8655 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
8656 {
8657 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8658 sym->st_other = STO_PROTECTED;
8659 sym->st_value = mips_elf_hash_table (info)->procedure_count;
8660 sym->st_shndx = SHN_ABS;
8661 }
8662 else if (sym->st_shndx != SHN_UNDEF && sym->st_shndx != SHN_ABS)
8663 {
8664 if (h->type == STT_FUNC)
8665 sym->st_shndx = SHN_MIPS_TEXT;
8666 else if (h->type == STT_OBJECT)
8667 sym->st_shndx = SHN_MIPS_DATA;
8668 }
8669 }
8670
8671 /* Handle the IRIX6-specific symbols. */
8672 if (IRIX_COMPAT (output_bfd) == ict_irix6)
8673 mips_elf_irix6_finish_dynamic_symbol (output_bfd, name, sym);
8674
8675 if (! info->shared)
8676 {
8677 if (! mips_elf_hash_table (info)->use_rld_obj_head
8678 && (strcmp (name, "__rld_map") == 0
8679 || strcmp (name, "__RLD_MAP") == 0))
8680 {
8681 asection *s = bfd_get_section_by_name (dynobj, ".rld_map");
8682 BFD_ASSERT (s != NULL);
8683 sym->st_value = s->output_section->vma + s->output_offset;
9719ad41 8684 bfd_put_32 (output_bfd, 0, s->contents);
b49e97c9
TS
8685 if (mips_elf_hash_table (info)->rld_value == 0)
8686 mips_elf_hash_table (info)->rld_value = sym->st_value;
8687 }
8688 else if (mips_elf_hash_table (info)->use_rld_obj_head
8689 && strcmp (name, "__rld_obj_head") == 0)
8690 {
8691 /* IRIX6 does not use a .rld_map section. */
8692 if (IRIX_COMPAT (output_bfd) == ict_irix5
8693 || IRIX_COMPAT (output_bfd) == ict_none)
8694 BFD_ASSERT (bfd_get_section_by_name (dynobj, ".rld_map")
8695 != NULL);
8696 mips_elf_hash_table (info)->rld_value = sym->st_value;
8697 }
8698 }
8699
8700 /* If this is a mips16 symbol, force the value to be even. */
79cda7cf
FF
8701 if (sym->st_other == STO_MIPS16)
8702 sym->st_value &= ~1;
b49e97c9 8703
b34976b6 8704 return TRUE;
b49e97c9
TS
8705}
8706
0a44bf69
RS
8707/* Likewise, for VxWorks. */
8708
8709bfd_boolean
8710_bfd_mips_vxworks_finish_dynamic_symbol (bfd *output_bfd,
8711 struct bfd_link_info *info,
8712 struct elf_link_hash_entry *h,
8713 Elf_Internal_Sym *sym)
8714{
8715 bfd *dynobj;
8716 asection *sgot;
8717 struct mips_got_info *g;
8718 struct mips_elf_link_hash_table *htab;
8719
8720 htab = mips_elf_hash_table (info);
8721 dynobj = elf_hash_table (info)->dynobj;
8722
8723 if (h->plt.offset != (bfd_vma) -1)
8724 {
6d79d2ed 8725 bfd_byte *loc;
0a44bf69
RS
8726 bfd_vma plt_address, plt_index, got_address, got_offset, branch_offset;
8727 Elf_Internal_Rela rel;
8728 static const bfd_vma *plt_entry;
8729
8730 BFD_ASSERT (h->dynindx != -1);
8731 BFD_ASSERT (htab->splt != NULL);
8732 BFD_ASSERT (h->plt.offset <= htab->splt->size);
8733
8734 /* Calculate the address of the .plt entry. */
8735 plt_address = (htab->splt->output_section->vma
8736 + htab->splt->output_offset
8737 + h->plt.offset);
8738
8739 /* Calculate the index of the entry. */
8740 plt_index = ((h->plt.offset - htab->plt_header_size)
8741 / htab->plt_entry_size);
8742
8743 /* Calculate the address of the .got.plt entry. */
8744 got_address = (htab->sgotplt->output_section->vma
8745 + htab->sgotplt->output_offset
8746 + plt_index * 4);
8747
8748 /* Calculate the offset of the .got.plt entry from
8749 _GLOBAL_OFFSET_TABLE_. */
8750 got_offset = mips_elf_gotplt_index (info, h);
8751
8752 /* Calculate the offset for the branch at the start of the PLT
8753 entry. The branch jumps to the beginning of .plt. */
8754 branch_offset = -(h->plt.offset / 4 + 1) & 0xffff;
8755
8756 /* Fill in the initial value of the .got.plt entry. */
8757 bfd_put_32 (output_bfd, plt_address,
8758 htab->sgotplt->contents + plt_index * 4);
8759
8760 /* Find out where the .plt entry should go. */
8761 loc = htab->splt->contents + h->plt.offset;
8762
8763 if (info->shared)
8764 {
8765 plt_entry = mips_vxworks_shared_plt_entry;
8766 bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
8767 bfd_put_32 (output_bfd, plt_entry[1] | plt_index, loc + 4);
8768 }
8769 else
8770 {
8771 bfd_vma got_address_high, got_address_low;
8772
8773 plt_entry = mips_vxworks_exec_plt_entry;
8774 got_address_high = ((got_address + 0x8000) >> 16) & 0xffff;
8775 got_address_low = got_address & 0xffff;
8776
8777 bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
8778 bfd_put_32 (output_bfd, plt_entry[1] | plt_index, loc + 4);
8779 bfd_put_32 (output_bfd, plt_entry[2] | got_address_high, loc + 8);
8780 bfd_put_32 (output_bfd, plt_entry[3] | got_address_low, loc + 12);
8781 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
8782 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
8783 bfd_put_32 (output_bfd, plt_entry[6], loc + 24);
8784 bfd_put_32 (output_bfd, plt_entry[7], loc + 28);
8785
8786 loc = (htab->srelplt2->contents
8787 + (plt_index * 3 + 2) * sizeof (Elf32_External_Rela));
8788
8789 /* Emit a relocation for the .got.plt entry. */
8790 rel.r_offset = got_address;
8791 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
8792 rel.r_addend = h->plt.offset;
8793 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8794
8795 /* Emit a relocation for the lui of %hi(<.got.plt slot>). */
8796 loc += sizeof (Elf32_External_Rela);
8797 rel.r_offset = plt_address + 8;
8798 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
8799 rel.r_addend = got_offset;
8800 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8801
8802 /* Emit a relocation for the addiu of %lo(<.got.plt slot>). */
8803 loc += sizeof (Elf32_External_Rela);
8804 rel.r_offset += 4;
8805 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
8806 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8807 }
8808
8809 /* Emit an R_MIPS_JUMP_SLOT relocation against the .got.plt entry. */
8810 loc = htab->srelplt->contents + plt_index * sizeof (Elf32_External_Rela);
8811 rel.r_offset = got_address;
8812 rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_JUMP_SLOT);
8813 rel.r_addend = 0;
8814 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8815
8816 if (!h->def_regular)
8817 sym->st_shndx = SHN_UNDEF;
8818 }
8819
8820 BFD_ASSERT (h->dynindx != -1 || h->forced_local);
8821
8822 sgot = mips_elf_got_section (dynobj, FALSE);
8823 BFD_ASSERT (sgot != NULL);
8824 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
8825 g = mips_elf_section_data (sgot)->u.got_info;
8826 BFD_ASSERT (g != NULL);
8827
8828 /* See if this symbol has an entry in the GOT. */
8829 if (g->global_gotsym != NULL
8830 && h->dynindx >= g->global_gotsym->dynindx)
8831 {
8832 bfd_vma offset;
8833 Elf_Internal_Rela outrel;
8834 bfd_byte *loc;
8835 asection *s;
8836
8837 /* Install the symbol value in the GOT. */
8838 offset = mips_elf_global_got_index (dynobj, output_bfd, h,
8839 R_MIPS_GOT16, info);
8840 MIPS_ELF_PUT_WORD (output_bfd, sym->st_value, sgot->contents + offset);
8841
8842 /* Add a dynamic relocation for it. */
8843 s = mips_elf_rel_dyn_section (info, FALSE);
8844 loc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
8845 outrel.r_offset = (sgot->output_section->vma
8846 + sgot->output_offset
8847 + offset);
8848 outrel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_32);
8849 outrel.r_addend = 0;
8850 bfd_elf32_swap_reloca_out (dynobj, &outrel, loc);
8851 }
8852
8853 /* Emit a copy reloc, if needed. */
8854 if (h->needs_copy)
8855 {
8856 Elf_Internal_Rela rel;
8857
8858 BFD_ASSERT (h->dynindx != -1);
8859
8860 rel.r_offset = (h->root.u.def.section->output_section->vma
8861 + h->root.u.def.section->output_offset
8862 + h->root.u.def.value);
8863 rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_COPY);
8864 rel.r_addend = 0;
8865 bfd_elf32_swap_reloca_out (output_bfd, &rel,
8866 htab->srelbss->contents
8867 + (htab->srelbss->reloc_count
8868 * sizeof (Elf32_External_Rela)));
8869 ++htab->srelbss->reloc_count;
8870 }
8871
8872 /* If this is a mips16 symbol, force the value to be even. */
8873 if (sym->st_other == STO_MIPS16)
8874 sym->st_value &= ~1;
8875
8876 return TRUE;
8877}
8878
8879/* Install the PLT header for a VxWorks executable and finalize the
8880 contents of .rela.plt.unloaded. */
8881
8882static void
8883mips_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
8884{
8885 Elf_Internal_Rela rela;
8886 bfd_byte *loc;
8887 bfd_vma got_value, got_value_high, got_value_low, plt_address;
8888 static const bfd_vma *plt_entry;
8889 struct mips_elf_link_hash_table *htab;
8890
8891 htab = mips_elf_hash_table (info);
8892 plt_entry = mips_vxworks_exec_plt0_entry;
8893
8894 /* Calculate the value of _GLOBAL_OFFSET_TABLE_. */
8895 got_value = (htab->root.hgot->root.u.def.section->output_section->vma
8896 + htab->root.hgot->root.u.def.section->output_offset
8897 + htab->root.hgot->root.u.def.value);
8898
8899 got_value_high = ((got_value + 0x8000) >> 16) & 0xffff;
8900 got_value_low = got_value & 0xffff;
8901
8902 /* Calculate the address of the PLT header. */
8903 plt_address = htab->splt->output_section->vma + htab->splt->output_offset;
8904
8905 /* Install the PLT header. */
8906 loc = htab->splt->contents;
8907 bfd_put_32 (output_bfd, plt_entry[0] | got_value_high, loc);
8908 bfd_put_32 (output_bfd, plt_entry[1] | got_value_low, loc + 4);
8909 bfd_put_32 (output_bfd, plt_entry[2], loc + 8);
8910 bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
8911 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
8912 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
8913
8914 /* Output the relocation for the lui of %hi(_GLOBAL_OFFSET_TABLE_). */
8915 loc = htab->srelplt2->contents;
8916 rela.r_offset = plt_address;
8917 rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
8918 rela.r_addend = 0;
8919 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
8920 loc += sizeof (Elf32_External_Rela);
8921
8922 /* Output the relocation for the following addiu of
8923 %lo(_GLOBAL_OFFSET_TABLE_). */
8924 rela.r_offset += 4;
8925 rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
8926 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
8927 loc += sizeof (Elf32_External_Rela);
8928
8929 /* Fix up the remaining relocations. They may have the wrong
8930 symbol index for _G_O_T_ or _P_L_T_ depending on the order
8931 in which symbols were output. */
8932 while (loc < htab->srelplt2->contents + htab->srelplt2->size)
8933 {
8934 Elf_Internal_Rela rel;
8935
8936 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
8937 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
8938 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8939 loc += sizeof (Elf32_External_Rela);
8940
8941 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
8942 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
8943 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8944 loc += sizeof (Elf32_External_Rela);
8945
8946 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
8947 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
8948 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8949 loc += sizeof (Elf32_External_Rela);
8950 }
8951}
8952
8953/* Install the PLT header for a VxWorks shared library. */
8954
8955static void
8956mips_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info)
8957{
8958 unsigned int i;
8959 struct mips_elf_link_hash_table *htab;
8960
8961 htab = mips_elf_hash_table (info);
8962
8963 /* We just need to copy the entry byte-by-byte. */
8964 for (i = 0; i < ARRAY_SIZE (mips_vxworks_shared_plt0_entry); i++)
8965 bfd_put_32 (output_bfd, mips_vxworks_shared_plt0_entry[i],
8966 htab->splt->contents + i * 4);
8967}
8968
b49e97c9
TS
8969/* Finish up the dynamic sections. */
8970
b34976b6 8971bfd_boolean
9719ad41
RS
8972_bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
8973 struct bfd_link_info *info)
b49e97c9
TS
8974{
8975 bfd *dynobj;
8976 asection *sdyn;
8977 asection *sgot;
f4416af6 8978 struct mips_got_info *gg, *g;
0a44bf69 8979 struct mips_elf_link_hash_table *htab;
b49e97c9 8980
0a44bf69 8981 htab = mips_elf_hash_table (info);
b49e97c9
TS
8982 dynobj = elf_hash_table (info)->dynobj;
8983
8984 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
8985
f4416af6 8986 sgot = mips_elf_got_section (dynobj, FALSE);
b49e97c9 8987 if (sgot == NULL)
f4416af6 8988 gg = g = NULL;
b49e97c9
TS
8989 else
8990 {
f4416af6
AO
8991 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
8992 gg = mips_elf_section_data (sgot)->u.got_info;
8993 BFD_ASSERT (gg != NULL);
8994 g = mips_elf_got_for_ibfd (gg, output_bfd);
b49e97c9
TS
8995 BFD_ASSERT (g != NULL);
8996 }
8997
8998 if (elf_hash_table (info)->dynamic_sections_created)
8999 {
9000 bfd_byte *b;
943284cc 9001 int dyn_to_skip = 0, dyn_skipped = 0;
b49e97c9
TS
9002
9003 BFD_ASSERT (sdyn != NULL);
9004 BFD_ASSERT (g != NULL);
9005
9006 for (b = sdyn->contents;
eea6121a 9007 b < sdyn->contents + sdyn->size;
b49e97c9
TS
9008 b += MIPS_ELF_DYN_SIZE (dynobj))
9009 {
9010 Elf_Internal_Dyn dyn;
9011 const char *name;
9012 size_t elemsize;
9013 asection *s;
b34976b6 9014 bfd_boolean swap_out_p;
b49e97c9
TS
9015
9016 /* Read in the current dynamic entry. */
9017 (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
9018
9019 /* Assume that we're going to modify it and write it out. */
b34976b6 9020 swap_out_p = TRUE;
b49e97c9
TS
9021
9022 switch (dyn.d_tag)
9023 {
9024 case DT_RELENT:
b49e97c9
TS
9025 dyn.d_un.d_val = MIPS_ELF_REL_SIZE (dynobj);
9026 break;
9027
0a44bf69
RS
9028 case DT_RELAENT:
9029 BFD_ASSERT (htab->is_vxworks);
9030 dyn.d_un.d_val = MIPS_ELF_RELA_SIZE (dynobj);
9031 break;
9032
b49e97c9
TS
9033 case DT_STRSZ:
9034 /* Rewrite DT_STRSZ. */
9035 dyn.d_un.d_val =
9036 _bfd_elf_strtab_size (elf_hash_table (info)->dynstr);
9037 break;
9038
9039 case DT_PLTGOT:
9040 name = ".got";
0a44bf69
RS
9041 if (htab->is_vxworks)
9042 {
9043 /* _GLOBAL_OFFSET_TABLE_ is defined to be the beginning
9044 of the ".got" section in DYNOBJ. */
9045 s = bfd_get_section_by_name (dynobj, name);
9046 BFD_ASSERT (s != NULL);
9047 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
9048 }
9049 else
9050 {
9051 s = bfd_get_section_by_name (output_bfd, name);
9052 BFD_ASSERT (s != NULL);
9053 dyn.d_un.d_ptr = s->vma;
9054 }
b49e97c9
TS
9055 break;
9056
9057 case DT_MIPS_RLD_VERSION:
9058 dyn.d_un.d_val = 1; /* XXX */
9059 break;
9060
9061 case DT_MIPS_FLAGS:
9062 dyn.d_un.d_val = RHF_NOTPOT; /* XXX */
9063 break;
9064
b49e97c9 9065 case DT_MIPS_TIME_STAMP:
6edfbbad
DJ
9066 {
9067 time_t t;
9068 time (&t);
9069 dyn.d_un.d_val = t;
9070 }
b49e97c9
TS
9071 break;
9072
9073 case DT_MIPS_ICHECKSUM:
9074 /* XXX FIXME: */
b34976b6 9075 swap_out_p = FALSE;
b49e97c9
TS
9076 break;
9077
9078 case DT_MIPS_IVERSION:
9079 /* XXX FIXME: */
b34976b6 9080 swap_out_p = FALSE;
b49e97c9
TS
9081 break;
9082
9083 case DT_MIPS_BASE_ADDRESS:
9084 s = output_bfd->sections;
9085 BFD_ASSERT (s != NULL);
9086 dyn.d_un.d_ptr = s->vma & ~(bfd_vma) 0xffff;
9087 break;
9088
9089 case DT_MIPS_LOCAL_GOTNO:
9090 dyn.d_un.d_val = g->local_gotno;
9091 break;
9092
9093 case DT_MIPS_UNREFEXTNO:
9094 /* The index into the dynamic symbol table which is the
9095 entry of the first external symbol that is not
9096 referenced within the same object. */
9097 dyn.d_un.d_val = bfd_count_sections (output_bfd) + 1;
9098 break;
9099
9100 case DT_MIPS_GOTSYM:
f4416af6 9101 if (gg->global_gotsym)
b49e97c9 9102 {
f4416af6 9103 dyn.d_un.d_val = gg->global_gotsym->dynindx;
b49e97c9
TS
9104 break;
9105 }
9106 /* In case if we don't have global got symbols we default
9107 to setting DT_MIPS_GOTSYM to the same value as
9108 DT_MIPS_SYMTABNO, so we just fall through. */
9109
9110 case DT_MIPS_SYMTABNO:
9111 name = ".dynsym";
9112 elemsize = MIPS_ELF_SYM_SIZE (output_bfd);
9113 s = bfd_get_section_by_name (output_bfd, name);
9114 BFD_ASSERT (s != NULL);
9115
eea6121a 9116 dyn.d_un.d_val = s->size / elemsize;
b49e97c9
TS
9117 break;
9118
9119 case DT_MIPS_HIPAGENO:
0a44bf69 9120 dyn.d_un.d_val = g->local_gotno - MIPS_RESERVED_GOTNO (info);
b49e97c9
TS
9121 break;
9122
9123 case DT_MIPS_RLD_MAP:
9124 dyn.d_un.d_ptr = mips_elf_hash_table (info)->rld_value;
9125 break;
9126
9127 case DT_MIPS_OPTIONS:
9128 s = (bfd_get_section_by_name
9129 (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (output_bfd)));
9130 dyn.d_un.d_ptr = s->vma;
9131 break;
9132
0a44bf69
RS
9133 case DT_RELASZ:
9134 BFD_ASSERT (htab->is_vxworks);
9135 /* The count does not include the JUMP_SLOT relocations. */
9136 if (htab->srelplt)
9137 dyn.d_un.d_val -= htab->srelplt->size;
9138 break;
9139
9140 case DT_PLTREL:
9141 BFD_ASSERT (htab->is_vxworks);
9142 dyn.d_un.d_val = DT_RELA;
9143 break;
9144
9145 case DT_PLTRELSZ:
9146 BFD_ASSERT (htab->is_vxworks);
9147 dyn.d_un.d_val = htab->srelplt->size;
9148 break;
9149
9150 case DT_JMPREL:
9151 BFD_ASSERT (htab->is_vxworks);
9152 dyn.d_un.d_val = (htab->srelplt->output_section->vma
9153 + htab->srelplt->output_offset);
9154 break;
9155
943284cc
DJ
9156 case DT_TEXTREL:
9157 /* If we didn't need any text relocations after all, delete
9158 the dynamic tag. */
9159 if (!(info->flags & DF_TEXTREL))
9160 {
9161 dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
9162 swap_out_p = FALSE;
9163 }
9164 break;
9165
9166 case DT_FLAGS:
9167 /* If we didn't need any text relocations after all, clear
9168 DF_TEXTREL from DT_FLAGS. */
9169 if (!(info->flags & DF_TEXTREL))
9170 dyn.d_un.d_val &= ~DF_TEXTREL;
9171 else
9172 swap_out_p = FALSE;
9173 break;
9174
b49e97c9 9175 default:
b34976b6 9176 swap_out_p = FALSE;
7a2b07ff
NS
9177 if (htab->is_vxworks
9178 && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
9179 swap_out_p = TRUE;
b49e97c9
TS
9180 break;
9181 }
9182
943284cc 9183 if (swap_out_p || dyn_skipped)
b49e97c9 9184 (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
943284cc
DJ
9185 (dynobj, &dyn, b - dyn_skipped);
9186
9187 if (dyn_to_skip)
9188 {
9189 dyn_skipped += dyn_to_skip;
9190 dyn_to_skip = 0;
9191 }
b49e97c9 9192 }
943284cc
DJ
9193
9194 /* Wipe out any trailing entries if we shifted down a dynamic tag. */
9195 if (dyn_skipped > 0)
9196 memset (b - dyn_skipped, 0, dyn_skipped);
b49e97c9
TS
9197 }
9198
b55fd4d4
DJ
9199 if (sgot != NULL && sgot->size > 0
9200 && !bfd_is_abs_section (sgot->output_section))
b49e97c9 9201 {
0a44bf69
RS
9202 if (htab->is_vxworks)
9203 {
9204 /* The first entry of the global offset table points to the
9205 ".dynamic" section. The second is initialized by the
9206 loader and contains the shared library identifier.
9207 The third is also initialized by the loader and points
9208 to the lazy resolution stub. */
9209 MIPS_ELF_PUT_WORD (output_bfd,
9210 sdyn->output_offset + sdyn->output_section->vma,
9211 sgot->contents);
9212 MIPS_ELF_PUT_WORD (output_bfd, 0,
9213 sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
9214 MIPS_ELF_PUT_WORD (output_bfd, 0,
9215 sgot->contents
9216 + 2 * MIPS_ELF_GOT_SIZE (output_bfd));
9217 }
9218 else
9219 {
9220 /* The first entry of the global offset table will be filled at
9221 runtime. The second entry will be used by some runtime loaders.
9222 This isn't the case of IRIX rld. */
9223 MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0, sgot->contents);
9224 MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0x80000000,
9225 sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
9226 }
b49e97c9 9227
54938e2a
TS
9228 elf_section_data (sgot->output_section)->this_hdr.sh_entsize
9229 = MIPS_ELF_GOT_SIZE (output_bfd);
9230 }
b49e97c9 9231
f4416af6
AO
9232 /* Generate dynamic relocations for the non-primary gots. */
9233 if (gg != NULL && gg->next)
9234 {
9235 Elf_Internal_Rela rel[3];
9236 bfd_vma addend = 0;
9237
9238 memset (rel, 0, sizeof (rel));
9239 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_REL32);
9240
9241 for (g = gg->next; g->next != gg; g = g->next)
9242 {
0f20cc35
DJ
9243 bfd_vma index = g->next->local_gotno + g->next->global_gotno
9244 + g->next->tls_gotno;
f4416af6 9245
9719ad41 9246 MIPS_ELF_PUT_WORD (output_bfd, 0, sgot->contents
f4416af6 9247 + index++ * MIPS_ELF_GOT_SIZE (output_bfd));
9719ad41 9248 MIPS_ELF_PUT_WORD (output_bfd, 0x80000000, sgot->contents
f4416af6
AO
9249 + index++ * MIPS_ELF_GOT_SIZE (output_bfd));
9250
9251 if (! info->shared)
9252 continue;
9253
9254 while (index < g->assigned_gotno)
9255 {
9256 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset
9257 = index++ * MIPS_ELF_GOT_SIZE (output_bfd);
9258 if (!(mips_elf_create_dynamic_relocation
9259 (output_bfd, info, rel, NULL,
9260 bfd_abs_section_ptr,
9261 0, &addend, sgot)))
9262 return FALSE;
9263 BFD_ASSERT (addend == 0);
9264 }
9265 }
9266 }
9267
3133ddbf
DJ
9268 /* The generation of dynamic relocations for the non-primary gots
9269 adds more dynamic relocations. We cannot count them until
9270 here. */
9271
9272 if (elf_hash_table (info)->dynamic_sections_created)
9273 {
9274 bfd_byte *b;
9275 bfd_boolean swap_out_p;
9276
9277 BFD_ASSERT (sdyn != NULL);
9278
9279 for (b = sdyn->contents;
9280 b < sdyn->contents + sdyn->size;
9281 b += MIPS_ELF_DYN_SIZE (dynobj))
9282 {
9283 Elf_Internal_Dyn dyn;
9284 asection *s;
9285
9286 /* Read in the current dynamic entry. */
9287 (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
9288
9289 /* Assume that we're going to modify it and write it out. */
9290 swap_out_p = TRUE;
9291
9292 switch (dyn.d_tag)
9293 {
9294 case DT_RELSZ:
9295 /* Reduce DT_RELSZ to account for any relocations we
9296 decided not to make. This is for the n64 irix rld,
9297 which doesn't seem to apply any relocations if there
9298 are trailing null entries. */
0a44bf69 9299 s = mips_elf_rel_dyn_section (info, FALSE);
3133ddbf
DJ
9300 dyn.d_un.d_val = (s->reloc_count
9301 * (ABI_64_P (output_bfd)
9302 ? sizeof (Elf64_Mips_External_Rel)
9303 : sizeof (Elf32_External_Rel)));
bcfdf036
RS
9304 /* Adjust the section size too. Tools like the prelinker
9305 can reasonably expect the values to the same. */
9306 elf_section_data (s->output_section)->this_hdr.sh_size
9307 = dyn.d_un.d_val;
3133ddbf
DJ
9308 break;
9309
9310 default:
9311 swap_out_p = FALSE;
9312 break;
9313 }
9314
9315 if (swap_out_p)
9316 (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
9317 (dynobj, &dyn, b);
9318 }
9319 }
9320
b49e97c9 9321 {
b49e97c9
TS
9322 asection *s;
9323 Elf32_compact_rel cpt;
9324
b49e97c9
TS
9325 if (SGI_COMPAT (output_bfd))
9326 {
9327 /* Write .compact_rel section out. */
9328 s = bfd_get_section_by_name (dynobj, ".compact_rel");
9329 if (s != NULL)
9330 {
9331 cpt.id1 = 1;
9332 cpt.num = s->reloc_count;
9333 cpt.id2 = 2;
9334 cpt.offset = (s->output_section->filepos
9335 + sizeof (Elf32_External_compact_rel));
9336 cpt.reserved0 = 0;
9337 cpt.reserved1 = 0;
9338 bfd_elf32_swap_compact_rel_out (output_bfd, &cpt,
9339 ((Elf32_External_compact_rel *)
9340 s->contents));
9341
9342 /* Clean up a dummy stub function entry in .text. */
9343 s = bfd_get_section_by_name (dynobj,
9344 MIPS_ELF_STUB_SECTION_NAME (dynobj));
9345 if (s != NULL)
9346 {
9347 file_ptr dummy_offset;
9348
5108fc1b
RS
9349 BFD_ASSERT (s->size >= htab->function_stub_size);
9350 dummy_offset = s->size - htab->function_stub_size;
b49e97c9 9351 memset (s->contents + dummy_offset, 0,
5108fc1b 9352 htab->function_stub_size);
b49e97c9
TS
9353 }
9354 }
9355 }
9356
0a44bf69
RS
9357 /* The psABI says that the dynamic relocations must be sorted in
9358 increasing order of r_symndx. The VxWorks EABI doesn't require
9359 this, and because the code below handles REL rather than RELA
9360 relocations, using it for VxWorks would be outright harmful. */
9361 if (!htab->is_vxworks)
b49e97c9 9362 {
0a44bf69
RS
9363 s = mips_elf_rel_dyn_section (info, FALSE);
9364 if (s != NULL
9365 && s->size > (bfd_vma)2 * MIPS_ELF_REL_SIZE (output_bfd))
9366 {
9367 reldyn_sorting_bfd = output_bfd;
b49e97c9 9368
0a44bf69
RS
9369 if (ABI_64_P (output_bfd))
9370 qsort ((Elf64_External_Rel *) s->contents + 1,
9371 s->reloc_count - 1, sizeof (Elf64_Mips_External_Rel),
9372 sort_dynamic_relocs_64);
9373 else
9374 qsort ((Elf32_External_Rel *) s->contents + 1,
9375 s->reloc_count - 1, sizeof (Elf32_External_Rel),
9376 sort_dynamic_relocs);
9377 }
b49e97c9 9378 }
b49e97c9
TS
9379 }
9380
0a44bf69
RS
9381 if (htab->is_vxworks && htab->splt->size > 0)
9382 {
9383 if (info->shared)
9384 mips_vxworks_finish_shared_plt (output_bfd, info);
9385 else
9386 mips_vxworks_finish_exec_plt (output_bfd, info);
9387 }
b34976b6 9388 return TRUE;
b49e97c9
TS
9389}
9390
b49e97c9 9391
64543e1a
RS
9392/* Set ABFD's EF_MIPS_ARCH and EF_MIPS_MACH flags. */
9393
9394static void
9719ad41 9395mips_set_isa_flags (bfd *abfd)
b49e97c9 9396{
64543e1a 9397 flagword val;
b49e97c9
TS
9398
9399 switch (bfd_get_mach (abfd))
9400 {
9401 default:
9402 case bfd_mach_mips3000:
9403 val = E_MIPS_ARCH_1;
9404 break;
9405
9406 case bfd_mach_mips3900:
9407 val = E_MIPS_ARCH_1 | E_MIPS_MACH_3900;
9408 break;
9409
9410 case bfd_mach_mips6000:
9411 val = E_MIPS_ARCH_2;
9412 break;
9413
9414 case bfd_mach_mips4000:
9415 case bfd_mach_mips4300:
9416 case bfd_mach_mips4400:
9417 case bfd_mach_mips4600:
9418 val = E_MIPS_ARCH_3;
9419 break;
9420
9421 case bfd_mach_mips4010:
9422 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4010;
9423 break;
9424
9425 case bfd_mach_mips4100:
9426 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4100;
9427 break;
9428
9429 case bfd_mach_mips4111:
9430 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4111;
9431 break;
9432
00707a0e
RS
9433 case bfd_mach_mips4120:
9434 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4120;
9435 break;
9436
b49e97c9
TS
9437 case bfd_mach_mips4650:
9438 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4650;
9439 break;
9440
00707a0e
RS
9441 case bfd_mach_mips5400:
9442 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5400;
9443 break;
9444
9445 case bfd_mach_mips5500:
9446 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5500;
9447 break;
9448
0d2e43ed
ILT
9449 case bfd_mach_mips9000:
9450 val = E_MIPS_ARCH_4 | E_MIPS_MACH_9000;
9451 break;
9452
b49e97c9 9453 case bfd_mach_mips5000:
5a7ea749 9454 case bfd_mach_mips7000:
b49e97c9
TS
9455 case bfd_mach_mips8000:
9456 case bfd_mach_mips10000:
9457 case bfd_mach_mips12000:
9458 val = E_MIPS_ARCH_4;
9459 break;
9460
9461 case bfd_mach_mips5:
9462 val = E_MIPS_ARCH_5;
9463 break;
9464
9465 case bfd_mach_mips_sb1:
9466 val = E_MIPS_ARCH_64 | E_MIPS_MACH_SB1;
9467 break;
9468
9469 case bfd_mach_mipsisa32:
9470 val = E_MIPS_ARCH_32;
9471 break;
9472
9473 case bfd_mach_mipsisa64:
9474 val = E_MIPS_ARCH_64;
af7ee8bf
CD
9475 break;
9476
9477 case bfd_mach_mipsisa32r2:
9478 val = E_MIPS_ARCH_32R2;
9479 break;
5f74bc13
CD
9480
9481 case bfd_mach_mipsisa64r2:
9482 val = E_MIPS_ARCH_64R2;
9483 break;
b49e97c9 9484 }
b49e97c9
TS
9485 elf_elfheader (abfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
9486 elf_elfheader (abfd)->e_flags |= val;
9487
64543e1a
RS
9488}
9489
9490
9491/* The final processing done just before writing out a MIPS ELF object
9492 file. This gets the MIPS architecture right based on the machine
9493 number. This is used by both the 32-bit and the 64-bit ABI. */
9494
9495void
9719ad41
RS
9496_bfd_mips_elf_final_write_processing (bfd *abfd,
9497 bfd_boolean linker ATTRIBUTE_UNUSED)
64543e1a
RS
9498{
9499 unsigned int i;
9500 Elf_Internal_Shdr **hdrpp;
9501 const char *name;
9502 asection *sec;
9503
9504 /* Keep the existing EF_MIPS_MACH and EF_MIPS_ARCH flags if the former
9505 is nonzero. This is for compatibility with old objects, which used
9506 a combination of a 32-bit EF_MIPS_ARCH and a 64-bit EF_MIPS_MACH. */
9507 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == 0)
9508 mips_set_isa_flags (abfd);
9509
b49e97c9
TS
9510 /* Set the sh_info field for .gptab sections and other appropriate
9511 info for each special section. */
9512 for (i = 1, hdrpp = elf_elfsections (abfd) + 1;
9513 i < elf_numsections (abfd);
9514 i++, hdrpp++)
9515 {
9516 switch ((*hdrpp)->sh_type)
9517 {
9518 case SHT_MIPS_MSYM:
9519 case SHT_MIPS_LIBLIST:
9520 sec = bfd_get_section_by_name (abfd, ".dynstr");
9521 if (sec != NULL)
9522 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
9523 break;
9524
9525 case SHT_MIPS_GPTAB:
9526 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
9527 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
9528 BFD_ASSERT (name != NULL
0112cd26 9529 && CONST_STRNEQ (name, ".gptab."));
b49e97c9
TS
9530 sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
9531 BFD_ASSERT (sec != NULL);
9532 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
9533 break;
9534
9535 case SHT_MIPS_CONTENT:
9536 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
9537 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
9538 BFD_ASSERT (name != NULL
0112cd26 9539 && CONST_STRNEQ (name, ".MIPS.content"));
b49e97c9
TS
9540 sec = bfd_get_section_by_name (abfd,
9541 name + sizeof ".MIPS.content" - 1);
9542 BFD_ASSERT (sec != NULL);
9543 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
9544 break;
9545
9546 case SHT_MIPS_SYMBOL_LIB:
9547 sec = bfd_get_section_by_name (abfd, ".dynsym");
9548 if (sec != NULL)
9549 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
9550 sec = bfd_get_section_by_name (abfd, ".liblist");
9551 if (sec != NULL)
9552 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
9553 break;
9554
9555 case SHT_MIPS_EVENTS:
9556 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
9557 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
9558 BFD_ASSERT (name != NULL);
0112cd26 9559 if (CONST_STRNEQ (name, ".MIPS.events"))
b49e97c9
TS
9560 sec = bfd_get_section_by_name (abfd,
9561 name + sizeof ".MIPS.events" - 1);
9562 else
9563 {
0112cd26 9564 BFD_ASSERT (CONST_STRNEQ (name, ".MIPS.post_rel"));
b49e97c9
TS
9565 sec = bfd_get_section_by_name (abfd,
9566 (name
9567 + sizeof ".MIPS.post_rel" - 1));
9568 }
9569 BFD_ASSERT (sec != NULL);
9570 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
9571 break;
9572
9573 }
9574 }
9575}
9576\f
8dc1a139 9577/* When creating an IRIX5 executable, we need REGINFO and RTPROC
b49e97c9
TS
9578 segments. */
9579
9580int
a6b96beb
AM
9581_bfd_mips_elf_additional_program_headers (bfd *abfd,
9582 struct bfd_link_info *info ATTRIBUTE_UNUSED)
b49e97c9
TS
9583{
9584 asection *s;
9585 int ret = 0;
9586
9587 /* See if we need a PT_MIPS_REGINFO segment. */
9588 s = bfd_get_section_by_name (abfd, ".reginfo");
9589 if (s && (s->flags & SEC_LOAD))
9590 ++ret;
9591
9592 /* See if we need a PT_MIPS_OPTIONS segment. */
9593 if (IRIX_COMPAT (abfd) == ict_irix6
9594 && bfd_get_section_by_name (abfd,
9595 MIPS_ELF_OPTIONS_SECTION_NAME (abfd)))
9596 ++ret;
9597
9598 /* See if we need a PT_MIPS_RTPROC segment. */
9599 if (IRIX_COMPAT (abfd) == ict_irix5
9600 && bfd_get_section_by_name (abfd, ".dynamic")
9601 && bfd_get_section_by_name (abfd, ".mdebug"))
9602 ++ret;
9603
98c904a8
RS
9604 /* Allocate a PT_NULL header in dynamic objects. See
9605 _bfd_mips_elf_modify_segment_map for details. */
9606 if (!SGI_COMPAT (abfd)
9607 && bfd_get_section_by_name (abfd, ".dynamic"))
9608 ++ret;
9609
b49e97c9
TS
9610 return ret;
9611}
9612
8dc1a139 9613/* Modify the segment map for an IRIX5 executable. */
b49e97c9 9614
b34976b6 9615bfd_boolean
9719ad41 9616_bfd_mips_elf_modify_segment_map (bfd *abfd,
7c8b76cc 9617 struct bfd_link_info *info)
b49e97c9
TS
9618{
9619 asection *s;
9620 struct elf_segment_map *m, **pm;
9621 bfd_size_type amt;
9622
9623 /* If there is a .reginfo section, we need a PT_MIPS_REGINFO
9624 segment. */
9625 s = bfd_get_section_by_name (abfd, ".reginfo");
9626 if (s != NULL && (s->flags & SEC_LOAD) != 0)
9627 {
9628 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
9629 if (m->p_type == PT_MIPS_REGINFO)
9630 break;
9631 if (m == NULL)
9632 {
9633 amt = sizeof *m;
9719ad41 9634 m = bfd_zalloc (abfd, amt);
b49e97c9 9635 if (m == NULL)
b34976b6 9636 return FALSE;
b49e97c9
TS
9637
9638 m->p_type = PT_MIPS_REGINFO;
9639 m->count = 1;
9640 m->sections[0] = s;
9641
9642 /* We want to put it after the PHDR and INTERP segments. */
9643 pm = &elf_tdata (abfd)->segment_map;
9644 while (*pm != NULL
9645 && ((*pm)->p_type == PT_PHDR
9646 || (*pm)->p_type == PT_INTERP))
9647 pm = &(*pm)->next;
9648
9649 m->next = *pm;
9650 *pm = m;
9651 }
9652 }
9653
9654 /* For IRIX 6, we don't have .mdebug sections, nor does anything but
9655 .dynamic end up in PT_DYNAMIC. However, we do have to insert a
98a8deaf 9656 PT_MIPS_OPTIONS segment immediately following the program header
b49e97c9 9657 table. */
c1fd6598
AO
9658 if (NEWABI_P (abfd)
9659 /* On non-IRIX6 new abi, we'll have already created a segment
9660 for this section, so don't create another. I'm not sure this
9661 is not also the case for IRIX 6, but I can't test it right
9662 now. */
9663 && IRIX_COMPAT (abfd) == ict_irix6)
b49e97c9
TS
9664 {
9665 for (s = abfd->sections; s; s = s->next)
9666 if (elf_section_data (s)->this_hdr.sh_type == SHT_MIPS_OPTIONS)
9667 break;
9668
9669 if (s)
9670 {
9671 struct elf_segment_map *options_segment;
9672
98a8deaf
RS
9673 pm = &elf_tdata (abfd)->segment_map;
9674 while (*pm != NULL
9675 && ((*pm)->p_type == PT_PHDR
9676 || (*pm)->p_type == PT_INTERP))
9677 pm = &(*pm)->next;
b49e97c9 9678
8ded5a0f
AM
9679 if (*pm == NULL || (*pm)->p_type != PT_MIPS_OPTIONS)
9680 {
9681 amt = sizeof (struct elf_segment_map);
9682 options_segment = bfd_zalloc (abfd, amt);
9683 options_segment->next = *pm;
9684 options_segment->p_type = PT_MIPS_OPTIONS;
9685 options_segment->p_flags = PF_R;
9686 options_segment->p_flags_valid = TRUE;
9687 options_segment->count = 1;
9688 options_segment->sections[0] = s;
9689 *pm = options_segment;
9690 }
b49e97c9
TS
9691 }
9692 }
9693 else
9694 {
9695 if (IRIX_COMPAT (abfd) == ict_irix5)
9696 {
9697 /* If there are .dynamic and .mdebug sections, we make a room
9698 for the RTPROC header. FIXME: Rewrite without section names. */
9699 if (bfd_get_section_by_name (abfd, ".interp") == NULL
9700 && bfd_get_section_by_name (abfd, ".dynamic") != NULL
9701 && bfd_get_section_by_name (abfd, ".mdebug") != NULL)
9702 {
9703 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
9704 if (m->p_type == PT_MIPS_RTPROC)
9705 break;
9706 if (m == NULL)
9707 {
9708 amt = sizeof *m;
9719ad41 9709 m = bfd_zalloc (abfd, amt);
b49e97c9 9710 if (m == NULL)
b34976b6 9711 return FALSE;
b49e97c9
TS
9712
9713 m->p_type = PT_MIPS_RTPROC;
9714
9715 s = bfd_get_section_by_name (abfd, ".rtproc");
9716 if (s == NULL)
9717 {
9718 m->count = 0;
9719 m->p_flags = 0;
9720 m->p_flags_valid = 1;
9721 }
9722 else
9723 {
9724 m->count = 1;
9725 m->sections[0] = s;
9726 }
9727
9728 /* We want to put it after the DYNAMIC segment. */
9729 pm = &elf_tdata (abfd)->segment_map;
9730 while (*pm != NULL && (*pm)->p_type != PT_DYNAMIC)
9731 pm = &(*pm)->next;
9732 if (*pm != NULL)
9733 pm = &(*pm)->next;
9734
9735 m->next = *pm;
9736 *pm = m;
9737 }
9738 }
9739 }
8dc1a139 9740 /* On IRIX5, the PT_DYNAMIC segment includes the .dynamic,
b49e97c9
TS
9741 .dynstr, .dynsym, and .hash sections, and everything in
9742 between. */
9743 for (pm = &elf_tdata (abfd)->segment_map; *pm != NULL;
9744 pm = &(*pm)->next)
9745 if ((*pm)->p_type == PT_DYNAMIC)
9746 break;
9747 m = *pm;
9748 if (m != NULL && IRIX_COMPAT (abfd) == ict_none)
9749 {
9750 /* For a normal mips executable the permissions for the PT_DYNAMIC
9751 segment are read, write and execute. We do that here since
9752 the code in elf.c sets only the read permission. This matters
9753 sometimes for the dynamic linker. */
9754 if (bfd_get_section_by_name (abfd, ".dynamic") != NULL)
9755 {
9756 m->p_flags = PF_R | PF_W | PF_X;
9757 m->p_flags_valid = 1;
9758 }
9759 }
f6f62d6f
RS
9760 /* GNU/Linux binaries do not need the extended PT_DYNAMIC section.
9761 glibc's dynamic linker has traditionally derived the number of
9762 tags from the p_filesz field, and sometimes allocates stack
9763 arrays of that size. An overly-big PT_DYNAMIC segment can
9764 be actively harmful in such cases. Making PT_DYNAMIC contain
9765 other sections can also make life hard for the prelinker,
9766 which might move one of the other sections to a different
9767 PT_LOAD segment. */
9768 if (SGI_COMPAT (abfd)
9769 && m != NULL
9770 && m->count == 1
9771 && strcmp (m->sections[0]->name, ".dynamic") == 0)
b49e97c9
TS
9772 {
9773 static const char *sec_names[] =
9774 {
9775 ".dynamic", ".dynstr", ".dynsym", ".hash"
9776 };
9777 bfd_vma low, high;
9778 unsigned int i, c;
9779 struct elf_segment_map *n;
9780
792b4a53 9781 low = ~(bfd_vma) 0;
b49e97c9
TS
9782 high = 0;
9783 for (i = 0; i < sizeof sec_names / sizeof sec_names[0]; i++)
9784 {
9785 s = bfd_get_section_by_name (abfd, sec_names[i]);
9786 if (s != NULL && (s->flags & SEC_LOAD) != 0)
9787 {
9788 bfd_size_type sz;
9789
9790 if (low > s->vma)
9791 low = s->vma;
eea6121a 9792 sz = s->size;
b49e97c9
TS
9793 if (high < s->vma + sz)
9794 high = s->vma + sz;
9795 }
9796 }
9797
9798 c = 0;
9799 for (s = abfd->sections; s != NULL; s = s->next)
9800 if ((s->flags & SEC_LOAD) != 0
9801 && s->vma >= low
eea6121a 9802 && s->vma + s->size <= high)
b49e97c9
TS
9803 ++c;
9804
9805 amt = sizeof *n + (bfd_size_type) (c - 1) * sizeof (asection *);
9719ad41 9806 n = bfd_zalloc (abfd, amt);
b49e97c9 9807 if (n == NULL)
b34976b6 9808 return FALSE;
b49e97c9
TS
9809 *n = *m;
9810 n->count = c;
9811
9812 i = 0;
9813 for (s = abfd->sections; s != NULL; s = s->next)
9814 {
9815 if ((s->flags & SEC_LOAD) != 0
9816 && s->vma >= low
eea6121a 9817 && s->vma + s->size <= high)
b49e97c9
TS
9818 {
9819 n->sections[i] = s;
9820 ++i;
9821 }
9822 }
9823
9824 *pm = n;
9825 }
9826 }
9827
98c904a8
RS
9828 /* Allocate a spare program header in dynamic objects so that tools
9829 like the prelinker can add an extra PT_LOAD entry.
9830
9831 If the prelinker needs to make room for a new PT_LOAD entry, its
9832 standard procedure is to move the first (read-only) sections into
9833 the new (writable) segment. However, the MIPS ABI requires
9834 .dynamic to be in a read-only segment, and the section will often
9835 start within sizeof (ElfNN_Phdr) bytes of the last program header.
9836
9837 Although the prelinker could in principle move .dynamic to a
9838 writable segment, it seems better to allocate a spare program
9839 header instead, and avoid the need to move any sections.
9840 There is a long tradition of allocating spare dynamic tags,
9841 so allocating a spare program header seems like a natural
7c8b76cc
JM
9842 extension.
9843
9844 If INFO is NULL, we may be copying an already prelinked binary
9845 with objcopy or strip, so do not add this header. */
9846 if (info != NULL
9847 && !SGI_COMPAT (abfd)
98c904a8
RS
9848 && bfd_get_section_by_name (abfd, ".dynamic"))
9849 {
9850 for (pm = &elf_tdata (abfd)->segment_map; *pm != NULL; pm = &(*pm)->next)
9851 if ((*pm)->p_type == PT_NULL)
9852 break;
9853 if (*pm == NULL)
9854 {
9855 m = bfd_zalloc (abfd, sizeof (*m));
9856 if (m == NULL)
9857 return FALSE;
9858
9859 m->p_type = PT_NULL;
9860 *pm = m;
9861 }
9862 }
9863
b34976b6 9864 return TRUE;
b49e97c9
TS
9865}
9866\f
9867/* Return the section that should be marked against GC for a given
9868 relocation. */
9869
9870asection *
9719ad41 9871_bfd_mips_elf_gc_mark_hook (asection *sec,
07adf181 9872 struct bfd_link_info *info,
9719ad41
RS
9873 Elf_Internal_Rela *rel,
9874 struct elf_link_hash_entry *h,
9875 Elf_Internal_Sym *sym)
b49e97c9
TS
9876{
9877 /* ??? Do mips16 stub sections need to be handled special? */
9878
9879 if (h != NULL)
07adf181
AM
9880 switch (ELF_R_TYPE (sec->owner, rel->r_info))
9881 {
9882 case R_MIPS_GNU_VTINHERIT:
9883 case R_MIPS_GNU_VTENTRY:
9884 return NULL;
9885 }
b49e97c9 9886
07adf181 9887 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
b49e97c9
TS
9888}
9889
9890/* Update the got entry reference counts for the section being removed. */
9891
b34976b6 9892bfd_boolean
9719ad41
RS
9893_bfd_mips_elf_gc_sweep_hook (bfd *abfd ATTRIBUTE_UNUSED,
9894 struct bfd_link_info *info ATTRIBUTE_UNUSED,
9895 asection *sec ATTRIBUTE_UNUSED,
9896 const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED)
b49e97c9
TS
9897{
9898#if 0
9899 Elf_Internal_Shdr *symtab_hdr;
9900 struct elf_link_hash_entry **sym_hashes;
9901 bfd_signed_vma *local_got_refcounts;
9902 const Elf_Internal_Rela *rel, *relend;
9903 unsigned long r_symndx;
9904 struct elf_link_hash_entry *h;
9905
9906 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
9907 sym_hashes = elf_sym_hashes (abfd);
9908 local_got_refcounts = elf_local_got_refcounts (abfd);
9909
9910 relend = relocs + sec->reloc_count;
9911 for (rel = relocs; rel < relend; rel++)
9912 switch (ELF_R_TYPE (abfd, rel->r_info))
9913 {
9914 case R_MIPS_GOT16:
9915 case R_MIPS_CALL16:
9916 case R_MIPS_CALL_HI16:
9917 case R_MIPS_CALL_LO16:
9918 case R_MIPS_GOT_HI16:
9919 case R_MIPS_GOT_LO16:
4a14403c
TS
9920 case R_MIPS_GOT_DISP:
9921 case R_MIPS_GOT_PAGE:
9922 case R_MIPS_GOT_OFST:
b49e97c9
TS
9923 /* ??? It would seem that the existing MIPS code does no sort
9924 of reference counting or whatnot on its GOT and PLT entries,
9925 so it is not possible to garbage collect them at this time. */
9926 break;
9927
9928 default:
9929 break;
9930 }
9931#endif
9932
b34976b6 9933 return TRUE;
b49e97c9
TS
9934}
9935\f
9936/* Copy data from a MIPS ELF indirect symbol to its direct symbol,
9937 hiding the old indirect symbol. Process additional relocation
9938 information. Also called for weakdefs, in which case we just let
9939 _bfd_elf_link_hash_copy_indirect copy the flags for us. */
9940
9941void
fcfa13d2 9942_bfd_mips_elf_copy_indirect_symbol (struct bfd_link_info *info,
9719ad41
RS
9943 struct elf_link_hash_entry *dir,
9944 struct elf_link_hash_entry *ind)
b49e97c9
TS
9945{
9946 struct mips_elf_link_hash_entry *dirmips, *indmips;
9947
fcfa13d2 9948 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
b49e97c9
TS
9949
9950 if (ind->root.type != bfd_link_hash_indirect)
9951 return;
9952
9953 dirmips = (struct mips_elf_link_hash_entry *) dir;
9954 indmips = (struct mips_elf_link_hash_entry *) ind;
9955 dirmips->possibly_dynamic_relocs += indmips->possibly_dynamic_relocs;
9956 if (indmips->readonly_reloc)
b34976b6 9957 dirmips->readonly_reloc = TRUE;
b49e97c9 9958 if (indmips->no_fn_stub)
b34976b6 9959 dirmips->no_fn_stub = TRUE;
0f20cc35
DJ
9960
9961 if (dirmips->tls_type == 0)
9962 dirmips->tls_type = indmips->tls_type;
b49e97c9
TS
9963}
9964
9965void
9719ad41
RS
9966_bfd_mips_elf_hide_symbol (struct bfd_link_info *info,
9967 struct elf_link_hash_entry *entry,
9968 bfd_boolean force_local)
b49e97c9
TS
9969{
9970 bfd *dynobj;
9971 asection *got;
9972 struct mips_got_info *g;
9973 struct mips_elf_link_hash_entry *h;
8275b357 9974 struct mips_elf_link_hash_table *htab;
7c5fcef7 9975
b49e97c9 9976 h = (struct mips_elf_link_hash_entry *) entry;
7c5fcef7
L
9977 if (h->forced_local)
9978 return;
4b555070 9979 h->forced_local = force_local;
7c5fcef7 9980
b49e97c9 9981 dynobj = elf_hash_table (info)->dynobj;
8275b357 9982 htab = mips_elf_hash_table (info);
8d1d654f 9983 if (dynobj != NULL && force_local && h->root.type != STT_TLS
003b8e1d 9984 && (got = mips_elf_got_section (dynobj, TRUE)) != NULL
8d1d654f 9985 && (g = mips_elf_section_data (got)->u.got_info) != NULL)
f4416af6 9986 {
c45a316a
AM
9987 if (g->next)
9988 {
9989 struct mips_got_entry e;
9990 struct mips_got_info *gg = g;
9991
9992 /* Since we're turning what used to be a global symbol into a
9993 local one, bump up the number of local entries of each GOT
9994 that had an entry for it. This will automatically decrease
9995 the number of global entries, since global_gotno is actually
9996 the upper limit of global entries. */
9997 e.abfd = dynobj;
9998 e.symndx = -1;
9999 e.d.h = h;
0f20cc35 10000 e.tls_type = 0;
c45a316a
AM
10001
10002 for (g = g->next; g != gg; g = g->next)
10003 if (htab_find (g->got_entries, &e))
10004 {
10005 BFD_ASSERT (g->global_gotno > 0);
10006 g->local_gotno++;
10007 g->global_gotno--;
10008 }
b49e97c9 10009
c45a316a
AM
10010 /* If this was a global symbol forced into the primary GOT, we
10011 no longer need an entry for it. We can't release the entry
10012 at this point, but we must at least stop counting it as one
10013 of the symbols that required a forced got entry. */
10014 if (h->root.got.offset == 2)
10015 {
10016 BFD_ASSERT (gg->assigned_gotno > 0);
10017 gg->assigned_gotno--;
10018 }
10019 }
c45a316a 10020 else if (h->root.got.offset == 1)
f4416af6 10021 {
8275b357
RS
10022 /* check_relocs didn't know that this symbol would be
10023 forced-local, so add an extra local got entry. */
c45a316a 10024 g->local_gotno++;
8275b357
RS
10025 if (htab->computed_got_sizes)
10026 {
10027 /* We'll have treated this symbol as global rather
10028 than local. */
10029 BFD_ASSERT (g->global_gotno > 0);
10030 g->global_gotno--;
10031 }
f4416af6 10032 }
8275b357
RS
10033 else if (htab->is_vxworks && h->root.needs_plt)
10034 {
10035 /* check_relocs didn't know that this symbol would be
10036 forced-local, so add an extra local got entry. */
10037 g->local_gotno++;
10038 if (htab->computed_got_sizes)
10039 /* The symbol is only used in call relocations, so we'll
10040 have assumed it only needs a .got.plt entry. Increase
10041 the size of .got accordingly. */
10042 got->size += MIPS_ELF_GOT_SIZE (dynobj);
10043 }
f4416af6 10044 }
f4416af6
AO
10045
10046 _bfd_elf_link_hash_hide_symbol (info, &h->root, force_local);
b49e97c9
TS
10047}
10048\f
d01414a5
TS
10049#define PDR_SIZE 32
10050
b34976b6 10051bfd_boolean
9719ad41
RS
10052_bfd_mips_elf_discard_info (bfd *abfd, struct elf_reloc_cookie *cookie,
10053 struct bfd_link_info *info)
d01414a5
TS
10054{
10055 asection *o;
b34976b6 10056 bfd_boolean ret = FALSE;
d01414a5
TS
10057 unsigned char *tdata;
10058 size_t i, skip;
10059
10060 o = bfd_get_section_by_name (abfd, ".pdr");
10061 if (! o)
b34976b6 10062 return FALSE;
eea6121a 10063 if (o->size == 0)
b34976b6 10064 return FALSE;
eea6121a 10065 if (o->size % PDR_SIZE != 0)
b34976b6 10066 return FALSE;
d01414a5
TS
10067 if (o->output_section != NULL
10068 && bfd_is_abs_section (o->output_section))
b34976b6 10069 return FALSE;
d01414a5 10070
eea6121a 10071 tdata = bfd_zmalloc (o->size / PDR_SIZE);
d01414a5 10072 if (! tdata)
b34976b6 10073 return FALSE;
d01414a5 10074
9719ad41 10075 cookie->rels = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
45d6a902 10076 info->keep_memory);
d01414a5
TS
10077 if (!cookie->rels)
10078 {
10079 free (tdata);
b34976b6 10080 return FALSE;
d01414a5
TS
10081 }
10082
10083 cookie->rel = cookie->rels;
10084 cookie->relend = cookie->rels + o->reloc_count;
10085
eea6121a 10086 for (i = 0, skip = 0; i < o->size / PDR_SIZE; i ++)
d01414a5 10087 {
c152c796 10088 if (bfd_elf_reloc_symbol_deleted_p (i * PDR_SIZE, cookie))
d01414a5
TS
10089 {
10090 tdata[i] = 1;
10091 skip ++;
10092 }
10093 }
10094
10095 if (skip != 0)
10096 {
f0abc2a1 10097 mips_elf_section_data (o)->u.tdata = tdata;
eea6121a 10098 o->size -= skip * PDR_SIZE;
b34976b6 10099 ret = TRUE;
d01414a5
TS
10100 }
10101 else
10102 free (tdata);
10103
10104 if (! info->keep_memory)
10105 free (cookie->rels);
10106
10107 return ret;
10108}
10109
b34976b6 10110bfd_boolean
9719ad41 10111_bfd_mips_elf_ignore_discarded_relocs (asection *sec)
53bfd6b4
MR
10112{
10113 if (strcmp (sec->name, ".pdr") == 0)
b34976b6
AM
10114 return TRUE;
10115 return FALSE;
53bfd6b4 10116}
d01414a5 10117
b34976b6 10118bfd_boolean
c7b8f16e
JB
10119_bfd_mips_elf_write_section (bfd *output_bfd,
10120 struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
10121 asection *sec, bfd_byte *contents)
d01414a5
TS
10122{
10123 bfd_byte *to, *from, *end;
10124 int i;
10125
10126 if (strcmp (sec->name, ".pdr") != 0)
b34976b6 10127 return FALSE;
d01414a5 10128
f0abc2a1 10129 if (mips_elf_section_data (sec)->u.tdata == NULL)
b34976b6 10130 return FALSE;
d01414a5
TS
10131
10132 to = contents;
eea6121a 10133 end = contents + sec->size;
d01414a5
TS
10134 for (from = contents, i = 0;
10135 from < end;
10136 from += PDR_SIZE, i++)
10137 {
f0abc2a1 10138 if ((mips_elf_section_data (sec)->u.tdata)[i] == 1)
d01414a5
TS
10139 continue;
10140 if (to != from)
10141 memcpy (to, from, PDR_SIZE);
10142 to += PDR_SIZE;
10143 }
10144 bfd_set_section_contents (output_bfd, sec->output_section, contents,
eea6121a 10145 sec->output_offset, sec->size);
b34976b6 10146 return TRUE;
d01414a5 10147}
53bfd6b4 10148\f
b49e97c9
TS
10149/* MIPS ELF uses a special find_nearest_line routine in order the
10150 handle the ECOFF debugging information. */
10151
10152struct mips_elf_find_line
10153{
10154 struct ecoff_debug_info d;
10155 struct ecoff_find_line i;
10156};
10157
b34976b6 10158bfd_boolean
9719ad41
RS
10159_bfd_mips_elf_find_nearest_line (bfd *abfd, asection *section,
10160 asymbol **symbols, bfd_vma offset,
10161 const char **filename_ptr,
10162 const char **functionname_ptr,
10163 unsigned int *line_ptr)
b49e97c9
TS
10164{
10165 asection *msec;
10166
10167 if (_bfd_dwarf1_find_nearest_line (abfd, section, symbols, offset,
10168 filename_ptr, functionname_ptr,
10169 line_ptr))
b34976b6 10170 return TRUE;
b49e97c9
TS
10171
10172 if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
10173 filename_ptr, functionname_ptr,
9719ad41 10174 line_ptr, ABI_64_P (abfd) ? 8 : 0,
b49e97c9 10175 &elf_tdata (abfd)->dwarf2_find_line_info))
b34976b6 10176 return TRUE;
b49e97c9
TS
10177
10178 msec = bfd_get_section_by_name (abfd, ".mdebug");
10179 if (msec != NULL)
10180 {
10181 flagword origflags;
10182 struct mips_elf_find_line *fi;
10183 const struct ecoff_debug_swap * const swap =
10184 get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
10185
10186 /* If we are called during a link, mips_elf_final_link may have
10187 cleared the SEC_HAS_CONTENTS field. We force it back on here
10188 if appropriate (which it normally will be). */
10189 origflags = msec->flags;
10190 if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
10191 msec->flags |= SEC_HAS_CONTENTS;
10192
10193 fi = elf_tdata (abfd)->find_line_info;
10194 if (fi == NULL)
10195 {
10196 bfd_size_type external_fdr_size;
10197 char *fraw_src;
10198 char *fraw_end;
10199 struct fdr *fdr_ptr;
10200 bfd_size_type amt = sizeof (struct mips_elf_find_line);
10201
9719ad41 10202 fi = bfd_zalloc (abfd, amt);
b49e97c9
TS
10203 if (fi == NULL)
10204 {
10205 msec->flags = origflags;
b34976b6 10206 return FALSE;
b49e97c9
TS
10207 }
10208
10209 if (! _bfd_mips_elf_read_ecoff_info (abfd, msec, &fi->d))
10210 {
10211 msec->flags = origflags;
b34976b6 10212 return FALSE;
b49e97c9
TS
10213 }
10214
10215 /* Swap in the FDR information. */
10216 amt = fi->d.symbolic_header.ifdMax * sizeof (struct fdr);
9719ad41 10217 fi->d.fdr = bfd_alloc (abfd, amt);
b49e97c9
TS
10218 if (fi->d.fdr == NULL)
10219 {
10220 msec->flags = origflags;
b34976b6 10221 return FALSE;
b49e97c9
TS
10222 }
10223 external_fdr_size = swap->external_fdr_size;
10224 fdr_ptr = fi->d.fdr;
10225 fraw_src = (char *) fi->d.external_fdr;
10226 fraw_end = (fraw_src
10227 + fi->d.symbolic_header.ifdMax * external_fdr_size);
10228 for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
9719ad41 10229 (*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr);
b49e97c9
TS
10230
10231 elf_tdata (abfd)->find_line_info = fi;
10232
10233 /* Note that we don't bother to ever free this information.
10234 find_nearest_line is either called all the time, as in
10235 objdump -l, so the information should be saved, or it is
10236 rarely called, as in ld error messages, so the memory
10237 wasted is unimportant. Still, it would probably be a
10238 good idea for free_cached_info to throw it away. */
10239 }
10240
10241 if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
10242 &fi->i, filename_ptr, functionname_ptr,
10243 line_ptr))
10244 {
10245 msec->flags = origflags;
b34976b6 10246 return TRUE;
b49e97c9
TS
10247 }
10248
10249 msec->flags = origflags;
10250 }
10251
10252 /* Fall back on the generic ELF find_nearest_line routine. */
10253
10254 return _bfd_elf_find_nearest_line (abfd, section, symbols, offset,
10255 filename_ptr, functionname_ptr,
10256 line_ptr);
10257}
4ab527b0
FF
10258
10259bfd_boolean
10260_bfd_mips_elf_find_inliner_info (bfd *abfd,
10261 const char **filename_ptr,
10262 const char **functionname_ptr,
10263 unsigned int *line_ptr)
10264{
10265 bfd_boolean found;
10266 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
10267 functionname_ptr, line_ptr,
10268 & elf_tdata (abfd)->dwarf2_find_line_info);
10269 return found;
10270}
10271
b49e97c9
TS
10272\f
10273/* When are writing out the .options or .MIPS.options section,
10274 remember the bytes we are writing out, so that we can install the
10275 GP value in the section_processing routine. */
10276
b34976b6 10277bfd_boolean
9719ad41
RS
10278_bfd_mips_elf_set_section_contents (bfd *abfd, sec_ptr section,
10279 const void *location,
10280 file_ptr offset, bfd_size_type count)
b49e97c9 10281{
cc2e31b9 10282 if (MIPS_ELF_OPTIONS_SECTION_NAME_P (section->name))
b49e97c9
TS
10283 {
10284 bfd_byte *c;
10285
10286 if (elf_section_data (section) == NULL)
10287 {
10288 bfd_size_type amt = sizeof (struct bfd_elf_section_data);
9719ad41 10289 section->used_by_bfd = bfd_zalloc (abfd, amt);
b49e97c9 10290 if (elf_section_data (section) == NULL)
b34976b6 10291 return FALSE;
b49e97c9 10292 }
f0abc2a1 10293 c = mips_elf_section_data (section)->u.tdata;
b49e97c9
TS
10294 if (c == NULL)
10295 {
eea6121a 10296 c = bfd_zalloc (abfd, section->size);
b49e97c9 10297 if (c == NULL)
b34976b6 10298 return FALSE;
f0abc2a1 10299 mips_elf_section_data (section)->u.tdata = c;
b49e97c9
TS
10300 }
10301
9719ad41 10302 memcpy (c + offset, location, count);
b49e97c9
TS
10303 }
10304
10305 return _bfd_elf_set_section_contents (abfd, section, location, offset,
10306 count);
10307}
10308
10309/* This is almost identical to bfd_generic_get_... except that some
10310 MIPS relocations need to be handled specially. Sigh. */
10311
10312bfd_byte *
9719ad41
RS
10313_bfd_elf_mips_get_relocated_section_contents
10314 (bfd *abfd,
10315 struct bfd_link_info *link_info,
10316 struct bfd_link_order *link_order,
10317 bfd_byte *data,
10318 bfd_boolean relocatable,
10319 asymbol **symbols)
b49e97c9
TS
10320{
10321 /* Get enough memory to hold the stuff */
10322 bfd *input_bfd = link_order->u.indirect.section->owner;
10323 asection *input_section = link_order->u.indirect.section;
eea6121a 10324 bfd_size_type sz;
b49e97c9
TS
10325
10326 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
10327 arelent **reloc_vector = NULL;
10328 long reloc_count;
10329
10330 if (reloc_size < 0)
10331 goto error_return;
10332
9719ad41 10333 reloc_vector = bfd_malloc (reloc_size);
b49e97c9
TS
10334 if (reloc_vector == NULL && reloc_size != 0)
10335 goto error_return;
10336
10337 /* read in the section */
eea6121a
AM
10338 sz = input_section->rawsize ? input_section->rawsize : input_section->size;
10339 if (!bfd_get_section_contents (input_bfd, input_section, data, 0, sz))
b49e97c9
TS
10340 goto error_return;
10341
b49e97c9
TS
10342 reloc_count = bfd_canonicalize_reloc (input_bfd,
10343 input_section,
10344 reloc_vector,
10345 symbols);
10346 if (reloc_count < 0)
10347 goto error_return;
10348
10349 if (reloc_count > 0)
10350 {
10351 arelent **parent;
10352 /* for mips */
10353 int gp_found;
10354 bfd_vma gp = 0x12345678; /* initialize just to shut gcc up */
10355
10356 {
10357 struct bfd_hash_entry *h;
10358 struct bfd_link_hash_entry *lh;
10359 /* Skip all this stuff if we aren't mixing formats. */
10360 if (abfd && input_bfd
10361 && abfd->xvec == input_bfd->xvec)
10362 lh = 0;
10363 else
10364 {
b34976b6 10365 h = bfd_hash_lookup (&link_info->hash->table, "_gp", FALSE, FALSE);
b49e97c9
TS
10366 lh = (struct bfd_link_hash_entry *) h;
10367 }
10368 lookup:
10369 if (lh)
10370 {
10371 switch (lh->type)
10372 {
10373 case bfd_link_hash_undefined:
10374 case bfd_link_hash_undefweak:
10375 case bfd_link_hash_common:
10376 gp_found = 0;
10377 break;
10378 case bfd_link_hash_defined:
10379 case bfd_link_hash_defweak:
10380 gp_found = 1;
10381 gp = lh->u.def.value;
10382 break;
10383 case bfd_link_hash_indirect:
10384 case bfd_link_hash_warning:
10385 lh = lh->u.i.link;
10386 /* @@FIXME ignoring warning for now */
10387 goto lookup;
10388 case bfd_link_hash_new:
10389 default:
10390 abort ();
10391 }
10392 }
10393 else
10394 gp_found = 0;
10395 }
10396 /* end mips */
9719ad41 10397 for (parent = reloc_vector; *parent != NULL; parent++)
b49e97c9 10398 {
9719ad41 10399 char *error_message = NULL;
b49e97c9
TS
10400 bfd_reloc_status_type r;
10401
10402 /* Specific to MIPS: Deal with relocation types that require
10403 knowing the gp of the output bfd. */
10404 asymbol *sym = *(*parent)->sym_ptr_ptr;
b49e97c9 10405
8236346f
EC
10406 /* If we've managed to find the gp and have a special
10407 function for the relocation then go ahead, else default
10408 to the generic handling. */
10409 if (gp_found
10410 && (*parent)->howto->special_function
10411 == _bfd_mips_elf32_gprel16_reloc)
10412 r = _bfd_mips_elf_gprel16_with_gp (input_bfd, sym, *parent,
10413 input_section, relocatable,
10414 data, gp);
10415 else
86324f90 10416 r = bfd_perform_relocation (input_bfd, *parent, data,
8236346f
EC
10417 input_section,
10418 relocatable ? abfd : NULL,
10419 &error_message);
b49e97c9 10420
1049f94e 10421 if (relocatable)
b49e97c9
TS
10422 {
10423 asection *os = input_section->output_section;
10424
10425 /* A partial link, so keep the relocs */
10426 os->orelocation[os->reloc_count] = *parent;
10427 os->reloc_count++;
10428 }
10429
10430 if (r != bfd_reloc_ok)
10431 {
10432 switch (r)
10433 {
10434 case bfd_reloc_undefined:
10435 if (!((*link_info->callbacks->undefined_symbol)
10436 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
5e2b0d47 10437 input_bfd, input_section, (*parent)->address, TRUE)))
b49e97c9
TS
10438 goto error_return;
10439 break;
10440 case bfd_reloc_dangerous:
9719ad41 10441 BFD_ASSERT (error_message != NULL);
b49e97c9
TS
10442 if (!((*link_info->callbacks->reloc_dangerous)
10443 (link_info, error_message, input_bfd, input_section,
10444 (*parent)->address)))
10445 goto error_return;
10446 break;
10447 case bfd_reloc_overflow:
10448 if (!((*link_info->callbacks->reloc_overflow)
dfeffb9f
L
10449 (link_info, NULL,
10450 bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
b49e97c9
TS
10451 (*parent)->howto->name, (*parent)->addend,
10452 input_bfd, input_section, (*parent)->address)))
10453 goto error_return;
10454 break;
10455 case bfd_reloc_outofrange:
10456 default:
10457 abort ();
10458 break;
10459 }
10460
10461 }
10462 }
10463 }
10464 if (reloc_vector != NULL)
10465 free (reloc_vector);
10466 return data;
10467
10468error_return:
10469 if (reloc_vector != NULL)
10470 free (reloc_vector);
10471 return NULL;
10472}
10473\f
10474/* Create a MIPS ELF linker hash table. */
10475
10476struct bfd_link_hash_table *
9719ad41 10477_bfd_mips_elf_link_hash_table_create (bfd *abfd)
b49e97c9
TS
10478{
10479 struct mips_elf_link_hash_table *ret;
10480 bfd_size_type amt = sizeof (struct mips_elf_link_hash_table);
10481
9719ad41
RS
10482 ret = bfd_malloc (amt);
10483 if (ret == NULL)
b49e97c9
TS
10484 return NULL;
10485
66eb6687
AM
10486 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
10487 mips_elf_link_hash_newfunc,
10488 sizeof (struct mips_elf_link_hash_entry)))
b49e97c9 10489 {
e2d34d7d 10490 free (ret);
b49e97c9
TS
10491 return NULL;
10492 }
10493
10494#if 0
10495 /* We no longer use this. */
10496 for (i = 0; i < SIZEOF_MIPS_DYNSYM_SECNAMES; i++)
10497 ret->dynsym_sec_strindex[i] = (bfd_size_type) -1;
10498#endif
10499 ret->procedure_count = 0;
10500 ret->compact_rel_size = 0;
b34976b6 10501 ret->use_rld_obj_head = FALSE;
b49e97c9 10502 ret->rld_value = 0;
b34976b6 10503 ret->mips16_stubs_seen = FALSE;
8275b357 10504 ret->computed_got_sizes = FALSE;
0a44bf69 10505 ret->is_vxworks = FALSE;
0e53d9da 10506 ret->small_data_overflow_reported = FALSE;
0a44bf69
RS
10507 ret->srelbss = NULL;
10508 ret->sdynbss = NULL;
10509 ret->srelplt = NULL;
10510 ret->srelplt2 = NULL;
10511 ret->sgotplt = NULL;
10512 ret->splt = NULL;
10513 ret->plt_header_size = 0;
10514 ret->plt_entry_size = 0;
5108fc1b 10515 ret->function_stub_size = 0;
b49e97c9
TS
10516
10517 return &ret->root.root;
10518}
0a44bf69
RS
10519
10520/* Likewise, but indicate that the target is VxWorks. */
10521
10522struct bfd_link_hash_table *
10523_bfd_mips_vxworks_link_hash_table_create (bfd *abfd)
10524{
10525 struct bfd_link_hash_table *ret;
10526
10527 ret = _bfd_mips_elf_link_hash_table_create (abfd);
10528 if (ret)
10529 {
10530 struct mips_elf_link_hash_table *htab;
10531
10532 htab = (struct mips_elf_link_hash_table *) ret;
10533 htab->is_vxworks = 1;
10534 }
10535 return ret;
10536}
b49e97c9
TS
10537\f
10538/* We need to use a special link routine to handle the .reginfo and
10539 the .mdebug sections. We need to merge all instances of these
10540 sections together, not write them all out sequentially. */
10541
b34976b6 10542bfd_boolean
9719ad41 10543_bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
b49e97c9 10544{
b49e97c9
TS
10545 asection *o;
10546 struct bfd_link_order *p;
10547 asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
10548 asection *rtproc_sec;
10549 Elf32_RegInfo reginfo;
10550 struct ecoff_debug_info debug;
7a2a6943
NC
10551 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10552 const struct ecoff_debug_swap *swap = bed->elf_backend_ecoff_debug_swap;
b49e97c9 10553 HDRR *symhdr = &debug.symbolic_header;
9719ad41 10554 void *mdebug_handle = NULL;
b49e97c9
TS
10555 asection *s;
10556 EXTR esym;
10557 unsigned int i;
10558 bfd_size_type amt;
0a44bf69 10559 struct mips_elf_link_hash_table *htab;
b49e97c9
TS
10560
10561 static const char * const secname[] =
10562 {
10563 ".text", ".init", ".fini", ".data",
10564 ".rodata", ".sdata", ".sbss", ".bss"
10565 };
10566 static const int sc[] =
10567 {
10568 scText, scInit, scFini, scData,
10569 scRData, scSData, scSBss, scBss
10570 };
10571
b49e97c9
TS
10572 /* We'd carefully arranged the dynamic symbol indices, and then the
10573 generic size_dynamic_sections renumbered them out from under us.
10574 Rather than trying somehow to prevent the renumbering, just do
10575 the sort again. */
0a44bf69 10576 htab = mips_elf_hash_table (info);
b49e97c9
TS
10577 if (elf_hash_table (info)->dynamic_sections_created)
10578 {
10579 bfd *dynobj;
10580 asection *got;
10581 struct mips_got_info *g;
7a2a6943 10582 bfd_size_type dynsecsymcount;
b49e97c9
TS
10583
10584 /* When we resort, we must tell mips_elf_sort_hash_table what
10585 the lowest index it may use is. That's the number of section
10586 symbols we're going to add. The generic ELF linker only
10587 adds these symbols when building a shared object. Note that
10588 we count the sections after (possibly) removing the .options
10589 section above. */
7a2a6943 10590
5108fc1b 10591 dynsecsymcount = count_section_dynsyms (abfd, info);
7a2a6943 10592 if (! mips_elf_sort_hash_table (info, dynsecsymcount + 1))
b34976b6 10593 return FALSE;
b49e97c9
TS
10594
10595 /* Make sure we didn't grow the global .got region. */
10596 dynobj = elf_hash_table (info)->dynobj;
f4416af6 10597 got = mips_elf_got_section (dynobj, FALSE);
f0abc2a1 10598 g = mips_elf_section_data (got)->u.got_info;
b49e97c9
TS
10599
10600 if (g->global_gotsym != NULL)
10601 BFD_ASSERT ((elf_hash_table (info)->dynsymcount
10602 - g->global_gotsym->dynindx)
10603 <= g->global_gotno);
10604 }
10605
b49e97c9
TS
10606 /* Get a value for the GP register. */
10607 if (elf_gp (abfd) == 0)
10608 {
10609 struct bfd_link_hash_entry *h;
10610
b34976b6 10611 h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
9719ad41 10612 if (h != NULL && h->type == bfd_link_hash_defined)
b49e97c9
TS
10613 elf_gp (abfd) = (h->u.def.value
10614 + h->u.def.section->output_section->vma
10615 + h->u.def.section->output_offset);
0a44bf69
RS
10616 else if (htab->is_vxworks
10617 && (h = bfd_link_hash_lookup (info->hash,
10618 "_GLOBAL_OFFSET_TABLE_",
10619 FALSE, FALSE, TRUE))
10620 && h->type == bfd_link_hash_defined)
10621 elf_gp (abfd) = (h->u.def.section->output_section->vma
10622 + h->u.def.section->output_offset
10623 + h->u.def.value);
1049f94e 10624 else if (info->relocatable)
b49e97c9
TS
10625 {
10626 bfd_vma lo = MINUS_ONE;
10627
10628 /* Find the GP-relative section with the lowest offset. */
9719ad41 10629 for (o = abfd->sections; o != NULL; o = o->next)
b49e97c9
TS
10630 if (o->vma < lo
10631 && (elf_section_data (o)->this_hdr.sh_flags & SHF_MIPS_GPREL))
10632 lo = o->vma;
10633
10634 /* And calculate GP relative to that. */
0a44bf69 10635 elf_gp (abfd) = lo + ELF_MIPS_GP_OFFSET (info);
b49e97c9
TS
10636 }
10637 else
10638 {
10639 /* If the relocate_section function needs to do a reloc
10640 involving the GP value, it should make a reloc_dangerous
10641 callback to warn that GP is not defined. */
10642 }
10643 }
10644
10645 /* Go through the sections and collect the .reginfo and .mdebug
10646 information. */
10647 reginfo_sec = NULL;
10648 mdebug_sec = NULL;
10649 gptab_data_sec = NULL;
10650 gptab_bss_sec = NULL;
9719ad41 10651 for (o = abfd->sections; o != NULL; o = o->next)
b49e97c9
TS
10652 {
10653 if (strcmp (o->name, ".reginfo") == 0)
10654 {
10655 memset (&reginfo, 0, sizeof reginfo);
10656
10657 /* We have found the .reginfo section in the output file.
10658 Look through all the link_orders comprising it and merge
10659 the information together. */
8423293d 10660 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
10661 {
10662 asection *input_section;
10663 bfd *input_bfd;
10664 Elf32_External_RegInfo ext;
10665 Elf32_RegInfo sub;
10666
10667 if (p->type != bfd_indirect_link_order)
10668 {
10669 if (p->type == bfd_data_link_order)
10670 continue;
10671 abort ();
10672 }
10673
10674 input_section = p->u.indirect.section;
10675 input_bfd = input_section->owner;
10676
b49e97c9 10677 if (! bfd_get_section_contents (input_bfd, input_section,
9719ad41 10678 &ext, 0, sizeof ext))
b34976b6 10679 return FALSE;
b49e97c9
TS
10680
10681 bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub);
10682
10683 reginfo.ri_gprmask |= sub.ri_gprmask;
10684 reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
10685 reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
10686 reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
10687 reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
10688
10689 /* ri_gp_value is set by the function
10690 mips_elf32_section_processing when the section is
10691 finally written out. */
10692
10693 /* Hack: reset the SEC_HAS_CONTENTS flag so that
10694 elf_link_input_bfd ignores this section. */
10695 input_section->flags &= ~SEC_HAS_CONTENTS;
10696 }
10697
10698 /* Size has been set in _bfd_mips_elf_always_size_sections. */
eea6121a 10699 BFD_ASSERT(o->size == sizeof (Elf32_External_RegInfo));
b49e97c9
TS
10700
10701 /* Skip this section later on (I don't think this currently
10702 matters, but someday it might). */
8423293d 10703 o->map_head.link_order = NULL;
b49e97c9
TS
10704
10705 reginfo_sec = o;
10706 }
10707
10708 if (strcmp (o->name, ".mdebug") == 0)
10709 {
10710 struct extsym_info einfo;
10711 bfd_vma last;
10712
10713 /* We have found the .mdebug section in the output file.
10714 Look through all the link_orders comprising it and merge
10715 the information together. */
10716 symhdr->magic = swap->sym_magic;
10717 /* FIXME: What should the version stamp be? */
10718 symhdr->vstamp = 0;
10719 symhdr->ilineMax = 0;
10720 symhdr->cbLine = 0;
10721 symhdr->idnMax = 0;
10722 symhdr->ipdMax = 0;
10723 symhdr->isymMax = 0;
10724 symhdr->ioptMax = 0;
10725 symhdr->iauxMax = 0;
10726 symhdr->issMax = 0;
10727 symhdr->issExtMax = 0;
10728 symhdr->ifdMax = 0;
10729 symhdr->crfd = 0;
10730 symhdr->iextMax = 0;
10731
10732 /* We accumulate the debugging information itself in the
10733 debug_info structure. */
10734 debug.line = NULL;
10735 debug.external_dnr = NULL;
10736 debug.external_pdr = NULL;
10737 debug.external_sym = NULL;
10738 debug.external_opt = NULL;
10739 debug.external_aux = NULL;
10740 debug.ss = NULL;
10741 debug.ssext = debug.ssext_end = NULL;
10742 debug.external_fdr = NULL;
10743 debug.external_rfd = NULL;
10744 debug.external_ext = debug.external_ext_end = NULL;
10745
10746 mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
9719ad41 10747 if (mdebug_handle == NULL)
b34976b6 10748 return FALSE;
b49e97c9
TS
10749
10750 esym.jmptbl = 0;
10751 esym.cobol_main = 0;
10752 esym.weakext = 0;
10753 esym.reserved = 0;
10754 esym.ifd = ifdNil;
10755 esym.asym.iss = issNil;
10756 esym.asym.st = stLocal;
10757 esym.asym.reserved = 0;
10758 esym.asym.index = indexNil;
10759 last = 0;
10760 for (i = 0; i < sizeof (secname) / sizeof (secname[0]); i++)
10761 {
10762 esym.asym.sc = sc[i];
10763 s = bfd_get_section_by_name (abfd, secname[i]);
10764 if (s != NULL)
10765 {
10766 esym.asym.value = s->vma;
eea6121a 10767 last = s->vma + s->size;
b49e97c9
TS
10768 }
10769 else
10770 esym.asym.value = last;
10771 if (!bfd_ecoff_debug_one_external (abfd, &debug, swap,
10772 secname[i], &esym))
b34976b6 10773 return FALSE;
b49e97c9
TS
10774 }
10775
8423293d 10776 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
10777 {
10778 asection *input_section;
10779 bfd *input_bfd;
10780 const struct ecoff_debug_swap *input_swap;
10781 struct ecoff_debug_info input_debug;
10782 char *eraw_src;
10783 char *eraw_end;
10784
10785 if (p->type != bfd_indirect_link_order)
10786 {
10787 if (p->type == bfd_data_link_order)
10788 continue;
10789 abort ();
10790 }
10791
10792 input_section = p->u.indirect.section;
10793 input_bfd = input_section->owner;
10794
10795 if (bfd_get_flavour (input_bfd) != bfd_target_elf_flavour
10796 || (get_elf_backend_data (input_bfd)
10797 ->elf_backend_ecoff_debug_swap) == NULL)
10798 {
10799 /* I don't know what a non MIPS ELF bfd would be
10800 doing with a .mdebug section, but I don't really
10801 want to deal with it. */
10802 continue;
10803 }
10804
10805 input_swap = (get_elf_backend_data (input_bfd)
10806 ->elf_backend_ecoff_debug_swap);
10807
eea6121a 10808 BFD_ASSERT (p->size == input_section->size);
b49e97c9
TS
10809
10810 /* The ECOFF linking code expects that we have already
10811 read in the debugging information and set up an
10812 ecoff_debug_info structure, so we do that now. */
10813 if (! _bfd_mips_elf_read_ecoff_info (input_bfd, input_section,
10814 &input_debug))
b34976b6 10815 return FALSE;
b49e97c9
TS
10816
10817 if (! (bfd_ecoff_debug_accumulate
10818 (mdebug_handle, abfd, &debug, swap, input_bfd,
10819 &input_debug, input_swap, info)))
b34976b6 10820 return FALSE;
b49e97c9
TS
10821
10822 /* Loop through the external symbols. For each one with
10823 interesting information, try to find the symbol in
10824 the linker global hash table and save the information
10825 for the output external symbols. */
10826 eraw_src = input_debug.external_ext;
10827 eraw_end = (eraw_src
10828 + (input_debug.symbolic_header.iextMax
10829 * input_swap->external_ext_size));
10830 for (;
10831 eraw_src < eraw_end;
10832 eraw_src += input_swap->external_ext_size)
10833 {
10834 EXTR ext;
10835 const char *name;
10836 struct mips_elf_link_hash_entry *h;
10837
9719ad41 10838 (*input_swap->swap_ext_in) (input_bfd, eraw_src, &ext);
b49e97c9
TS
10839 if (ext.asym.sc == scNil
10840 || ext.asym.sc == scUndefined
10841 || ext.asym.sc == scSUndefined)
10842 continue;
10843
10844 name = input_debug.ssext + ext.asym.iss;
10845 h = mips_elf_link_hash_lookup (mips_elf_hash_table (info),
b34976b6 10846 name, FALSE, FALSE, TRUE);
b49e97c9
TS
10847 if (h == NULL || h->esym.ifd != -2)
10848 continue;
10849
10850 if (ext.ifd != -1)
10851 {
10852 BFD_ASSERT (ext.ifd
10853 < input_debug.symbolic_header.ifdMax);
10854 ext.ifd = input_debug.ifdmap[ext.ifd];
10855 }
10856
10857 h->esym = ext;
10858 }
10859
10860 /* Free up the information we just read. */
10861 free (input_debug.line);
10862 free (input_debug.external_dnr);
10863 free (input_debug.external_pdr);
10864 free (input_debug.external_sym);
10865 free (input_debug.external_opt);
10866 free (input_debug.external_aux);
10867 free (input_debug.ss);
10868 free (input_debug.ssext);
10869 free (input_debug.external_fdr);
10870 free (input_debug.external_rfd);
10871 free (input_debug.external_ext);
10872
10873 /* Hack: reset the SEC_HAS_CONTENTS flag so that
10874 elf_link_input_bfd ignores this section. */
10875 input_section->flags &= ~SEC_HAS_CONTENTS;
10876 }
10877
10878 if (SGI_COMPAT (abfd) && info->shared)
10879 {
10880 /* Create .rtproc section. */
10881 rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
10882 if (rtproc_sec == NULL)
10883 {
10884 flagword flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
10885 | SEC_LINKER_CREATED | SEC_READONLY);
10886
3496cb2a
L
10887 rtproc_sec = bfd_make_section_with_flags (abfd,
10888 ".rtproc",
10889 flags);
b49e97c9 10890 if (rtproc_sec == NULL
b49e97c9 10891 || ! bfd_set_section_alignment (abfd, rtproc_sec, 4))
b34976b6 10892 return FALSE;
b49e97c9
TS
10893 }
10894
10895 if (! mips_elf_create_procedure_table (mdebug_handle, abfd,
10896 info, rtproc_sec,
10897 &debug))
b34976b6 10898 return FALSE;
b49e97c9
TS
10899 }
10900
10901 /* Build the external symbol information. */
10902 einfo.abfd = abfd;
10903 einfo.info = info;
10904 einfo.debug = &debug;
10905 einfo.swap = swap;
b34976b6 10906 einfo.failed = FALSE;
b49e97c9 10907 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
9719ad41 10908 mips_elf_output_extsym, &einfo);
b49e97c9 10909 if (einfo.failed)
b34976b6 10910 return FALSE;
b49e97c9
TS
10911
10912 /* Set the size of the .mdebug section. */
eea6121a 10913 o->size = bfd_ecoff_debug_size (abfd, &debug, swap);
b49e97c9
TS
10914
10915 /* Skip this section later on (I don't think this currently
10916 matters, but someday it might). */
8423293d 10917 o->map_head.link_order = NULL;
b49e97c9
TS
10918
10919 mdebug_sec = o;
10920 }
10921
0112cd26 10922 if (CONST_STRNEQ (o->name, ".gptab."))
b49e97c9
TS
10923 {
10924 const char *subname;
10925 unsigned int c;
10926 Elf32_gptab *tab;
10927 Elf32_External_gptab *ext_tab;
10928 unsigned int j;
10929
10930 /* The .gptab.sdata and .gptab.sbss sections hold
10931 information describing how the small data area would
10932 change depending upon the -G switch. These sections
10933 not used in executables files. */
1049f94e 10934 if (! info->relocatable)
b49e97c9 10935 {
8423293d 10936 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
10937 {
10938 asection *input_section;
10939
10940 if (p->type != bfd_indirect_link_order)
10941 {
10942 if (p->type == bfd_data_link_order)
10943 continue;
10944 abort ();
10945 }
10946
10947 input_section = p->u.indirect.section;
10948
10949 /* Hack: reset the SEC_HAS_CONTENTS flag so that
10950 elf_link_input_bfd ignores this section. */
10951 input_section->flags &= ~SEC_HAS_CONTENTS;
10952 }
10953
10954 /* Skip this section later on (I don't think this
10955 currently matters, but someday it might). */
8423293d 10956 o->map_head.link_order = NULL;
b49e97c9
TS
10957
10958 /* Really remove the section. */
5daa8fe7 10959 bfd_section_list_remove (abfd, o);
b49e97c9
TS
10960 --abfd->section_count;
10961
10962 continue;
10963 }
10964
10965 /* There is one gptab for initialized data, and one for
10966 uninitialized data. */
10967 if (strcmp (o->name, ".gptab.sdata") == 0)
10968 gptab_data_sec = o;
10969 else if (strcmp (o->name, ".gptab.sbss") == 0)
10970 gptab_bss_sec = o;
10971 else
10972 {
10973 (*_bfd_error_handler)
10974 (_("%s: illegal section name `%s'"),
10975 bfd_get_filename (abfd), o->name);
10976 bfd_set_error (bfd_error_nonrepresentable_section);
b34976b6 10977 return FALSE;
b49e97c9
TS
10978 }
10979
10980 /* The linker script always combines .gptab.data and
10981 .gptab.sdata into .gptab.sdata, and likewise for
10982 .gptab.bss and .gptab.sbss. It is possible that there is
10983 no .sdata or .sbss section in the output file, in which
10984 case we must change the name of the output section. */
10985 subname = o->name + sizeof ".gptab" - 1;
10986 if (bfd_get_section_by_name (abfd, subname) == NULL)
10987 {
10988 if (o == gptab_data_sec)
10989 o->name = ".gptab.data";
10990 else
10991 o->name = ".gptab.bss";
10992 subname = o->name + sizeof ".gptab" - 1;
10993 BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
10994 }
10995
10996 /* Set up the first entry. */
10997 c = 1;
10998 amt = c * sizeof (Elf32_gptab);
9719ad41 10999 tab = bfd_malloc (amt);
b49e97c9 11000 if (tab == NULL)
b34976b6 11001 return FALSE;
b49e97c9
TS
11002 tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
11003 tab[0].gt_header.gt_unused = 0;
11004
11005 /* Combine the input sections. */
8423293d 11006 for (p = o->map_head.link_order; p != NULL; p = p->next)
b49e97c9
TS
11007 {
11008 asection *input_section;
11009 bfd *input_bfd;
11010 bfd_size_type size;
11011 unsigned long last;
11012 bfd_size_type gpentry;
11013
11014 if (p->type != bfd_indirect_link_order)
11015 {
11016 if (p->type == bfd_data_link_order)
11017 continue;
11018 abort ();
11019 }
11020
11021 input_section = p->u.indirect.section;
11022 input_bfd = input_section->owner;
11023
11024 /* Combine the gptab entries for this input section one
11025 by one. We know that the input gptab entries are
11026 sorted by ascending -G value. */
eea6121a 11027 size = input_section->size;
b49e97c9
TS
11028 last = 0;
11029 for (gpentry = sizeof (Elf32_External_gptab);
11030 gpentry < size;
11031 gpentry += sizeof (Elf32_External_gptab))
11032 {
11033 Elf32_External_gptab ext_gptab;
11034 Elf32_gptab int_gptab;
11035 unsigned long val;
11036 unsigned long add;
b34976b6 11037 bfd_boolean exact;
b49e97c9
TS
11038 unsigned int look;
11039
11040 if (! (bfd_get_section_contents
9719ad41
RS
11041 (input_bfd, input_section, &ext_gptab, gpentry,
11042 sizeof (Elf32_External_gptab))))
b49e97c9
TS
11043 {
11044 free (tab);
b34976b6 11045 return FALSE;
b49e97c9
TS
11046 }
11047
11048 bfd_mips_elf32_swap_gptab_in (input_bfd, &ext_gptab,
11049 &int_gptab);
11050 val = int_gptab.gt_entry.gt_g_value;
11051 add = int_gptab.gt_entry.gt_bytes - last;
11052
b34976b6 11053 exact = FALSE;
b49e97c9
TS
11054 for (look = 1; look < c; look++)
11055 {
11056 if (tab[look].gt_entry.gt_g_value >= val)
11057 tab[look].gt_entry.gt_bytes += add;
11058
11059 if (tab[look].gt_entry.gt_g_value == val)
b34976b6 11060 exact = TRUE;
b49e97c9
TS
11061 }
11062
11063 if (! exact)
11064 {
11065 Elf32_gptab *new_tab;
11066 unsigned int max;
11067
11068 /* We need a new table entry. */
11069 amt = (bfd_size_type) (c + 1) * sizeof (Elf32_gptab);
9719ad41 11070 new_tab = bfd_realloc (tab, amt);
b49e97c9
TS
11071 if (new_tab == NULL)
11072 {
11073 free (tab);
b34976b6 11074 return FALSE;
b49e97c9
TS
11075 }
11076 tab = new_tab;
11077 tab[c].gt_entry.gt_g_value = val;
11078 tab[c].gt_entry.gt_bytes = add;
11079
11080 /* Merge in the size for the next smallest -G
11081 value, since that will be implied by this new
11082 value. */
11083 max = 0;
11084 for (look = 1; look < c; look++)
11085 {
11086 if (tab[look].gt_entry.gt_g_value < val
11087 && (max == 0
11088 || (tab[look].gt_entry.gt_g_value
11089 > tab[max].gt_entry.gt_g_value)))
11090 max = look;
11091 }
11092 if (max != 0)
11093 tab[c].gt_entry.gt_bytes +=
11094 tab[max].gt_entry.gt_bytes;
11095
11096 ++c;
11097 }
11098
11099 last = int_gptab.gt_entry.gt_bytes;
11100 }
11101
11102 /* Hack: reset the SEC_HAS_CONTENTS flag so that
11103 elf_link_input_bfd ignores this section. */
11104 input_section->flags &= ~SEC_HAS_CONTENTS;
11105 }
11106
11107 /* The table must be sorted by -G value. */
11108 if (c > 2)
11109 qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
11110
11111 /* Swap out the table. */
11112 amt = (bfd_size_type) c * sizeof (Elf32_External_gptab);
9719ad41 11113 ext_tab = bfd_alloc (abfd, amt);
b49e97c9
TS
11114 if (ext_tab == NULL)
11115 {
11116 free (tab);
b34976b6 11117 return FALSE;
b49e97c9
TS
11118 }
11119
11120 for (j = 0; j < c; j++)
11121 bfd_mips_elf32_swap_gptab_out (abfd, tab + j, ext_tab + j);
11122 free (tab);
11123
eea6121a 11124 o->size = c * sizeof (Elf32_External_gptab);
b49e97c9
TS
11125 o->contents = (bfd_byte *) ext_tab;
11126
11127 /* Skip this section later on (I don't think this currently
11128 matters, but someday it might). */
8423293d 11129 o->map_head.link_order = NULL;
b49e97c9
TS
11130 }
11131 }
11132
11133 /* Invoke the regular ELF backend linker to do all the work. */
c152c796 11134 if (!bfd_elf_final_link (abfd, info))
b34976b6 11135 return FALSE;
b49e97c9
TS
11136
11137 /* Now write out the computed sections. */
11138
9719ad41 11139 if (reginfo_sec != NULL)
b49e97c9
TS
11140 {
11141 Elf32_External_RegInfo ext;
11142
11143 bfd_mips_elf32_swap_reginfo_out (abfd, &reginfo, &ext);
9719ad41 11144 if (! bfd_set_section_contents (abfd, reginfo_sec, &ext, 0, sizeof ext))
b34976b6 11145 return FALSE;
b49e97c9
TS
11146 }
11147
9719ad41 11148 if (mdebug_sec != NULL)
b49e97c9
TS
11149 {
11150 BFD_ASSERT (abfd->output_has_begun);
11151 if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
11152 swap, info,
11153 mdebug_sec->filepos))
b34976b6 11154 return FALSE;
b49e97c9
TS
11155
11156 bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
11157 }
11158
9719ad41 11159 if (gptab_data_sec != NULL)
b49e97c9
TS
11160 {
11161 if (! bfd_set_section_contents (abfd, gptab_data_sec,
11162 gptab_data_sec->contents,
eea6121a 11163 0, gptab_data_sec->size))
b34976b6 11164 return FALSE;
b49e97c9
TS
11165 }
11166
9719ad41 11167 if (gptab_bss_sec != NULL)
b49e97c9
TS
11168 {
11169 if (! bfd_set_section_contents (abfd, gptab_bss_sec,
11170 gptab_bss_sec->contents,
eea6121a 11171 0, gptab_bss_sec->size))
b34976b6 11172 return FALSE;
b49e97c9
TS
11173 }
11174
11175 if (SGI_COMPAT (abfd))
11176 {
11177 rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
11178 if (rtproc_sec != NULL)
11179 {
11180 if (! bfd_set_section_contents (abfd, rtproc_sec,
11181 rtproc_sec->contents,
eea6121a 11182 0, rtproc_sec->size))
b34976b6 11183 return FALSE;
b49e97c9
TS
11184 }
11185 }
11186
b34976b6 11187 return TRUE;
b49e97c9
TS
11188}
11189\f
64543e1a
RS
11190/* Structure for saying that BFD machine EXTENSION extends BASE. */
11191
11192struct mips_mach_extension {
11193 unsigned long extension, base;
11194};
11195
11196
11197/* An array describing how BFD machines relate to one another. The entries
11198 are ordered topologically with MIPS I extensions listed last. */
11199
11200static const struct mips_mach_extension mips_mach_extensions[] = {
11201 /* MIPS64 extensions. */
5f74bc13 11202 { bfd_mach_mipsisa64r2, bfd_mach_mipsisa64 },
64543e1a
RS
11203 { bfd_mach_mips_sb1, bfd_mach_mipsisa64 },
11204
11205 /* MIPS V extensions. */
11206 { bfd_mach_mipsisa64, bfd_mach_mips5 },
11207
11208 /* R10000 extensions. */
11209 { bfd_mach_mips12000, bfd_mach_mips10000 },
11210
11211 /* R5000 extensions. Note: the vr5500 ISA is an extension of the core
11212 vr5400 ISA, but doesn't include the multimedia stuff. It seems
11213 better to allow vr5400 and vr5500 code to be merged anyway, since
11214 many libraries will just use the core ISA. Perhaps we could add
11215 some sort of ASE flag if this ever proves a problem. */
11216 { bfd_mach_mips5500, bfd_mach_mips5400 },
11217 { bfd_mach_mips5400, bfd_mach_mips5000 },
11218
11219 /* MIPS IV extensions. */
11220 { bfd_mach_mips5, bfd_mach_mips8000 },
11221 { bfd_mach_mips10000, bfd_mach_mips8000 },
11222 { bfd_mach_mips5000, bfd_mach_mips8000 },
5a7ea749 11223 { bfd_mach_mips7000, bfd_mach_mips8000 },
0d2e43ed 11224 { bfd_mach_mips9000, bfd_mach_mips8000 },
64543e1a
RS
11225
11226 /* VR4100 extensions. */
11227 { bfd_mach_mips4120, bfd_mach_mips4100 },
11228 { bfd_mach_mips4111, bfd_mach_mips4100 },
11229
11230 /* MIPS III extensions. */
11231 { bfd_mach_mips8000, bfd_mach_mips4000 },
11232 { bfd_mach_mips4650, bfd_mach_mips4000 },
11233 { bfd_mach_mips4600, bfd_mach_mips4000 },
11234 { bfd_mach_mips4400, bfd_mach_mips4000 },
11235 { bfd_mach_mips4300, bfd_mach_mips4000 },
11236 { bfd_mach_mips4100, bfd_mach_mips4000 },
11237 { bfd_mach_mips4010, bfd_mach_mips4000 },
11238
11239 /* MIPS32 extensions. */
11240 { bfd_mach_mipsisa32r2, bfd_mach_mipsisa32 },
11241
11242 /* MIPS II extensions. */
11243 { bfd_mach_mips4000, bfd_mach_mips6000 },
11244 { bfd_mach_mipsisa32, bfd_mach_mips6000 },
11245
11246 /* MIPS I extensions. */
11247 { bfd_mach_mips6000, bfd_mach_mips3000 },
11248 { bfd_mach_mips3900, bfd_mach_mips3000 }
11249};
11250
11251
11252/* Return true if bfd machine EXTENSION is an extension of machine BASE. */
11253
11254static bfd_boolean
9719ad41 11255mips_mach_extends_p (unsigned long base, unsigned long extension)
64543e1a
RS
11256{
11257 size_t i;
11258
c5211a54
RS
11259 if (extension == base)
11260 return TRUE;
11261
11262 if (base == bfd_mach_mipsisa32
11263 && mips_mach_extends_p (bfd_mach_mipsisa64, extension))
11264 return TRUE;
11265
11266 if (base == bfd_mach_mipsisa32r2
11267 && mips_mach_extends_p (bfd_mach_mipsisa64r2, extension))
11268 return TRUE;
11269
11270 for (i = 0; i < ARRAY_SIZE (mips_mach_extensions); i++)
64543e1a 11271 if (extension == mips_mach_extensions[i].extension)
c5211a54
RS
11272 {
11273 extension = mips_mach_extensions[i].base;
11274 if (extension == base)
11275 return TRUE;
11276 }
64543e1a 11277
c5211a54 11278 return FALSE;
64543e1a
RS
11279}
11280
11281
11282/* Return true if the given ELF header flags describe a 32-bit binary. */
00707a0e 11283
b34976b6 11284static bfd_boolean
9719ad41 11285mips_32bit_flags_p (flagword flags)
00707a0e 11286{
64543e1a
RS
11287 return ((flags & EF_MIPS_32BITMODE) != 0
11288 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_O32
11289 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32
11290 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1
11291 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2
11292 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32
11293 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2);
00707a0e
RS
11294}
11295
64543e1a 11296
2cf19d5c
JM
11297/* Merge object attributes from IBFD into OBFD. Raise an error if
11298 there are conflicting attributes. */
11299static bfd_boolean
11300mips_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
11301{
11302 obj_attribute *in_attr;
11303 obj_attribute *out_attr;
11304
11305 if (!elf_known_obj_attributes_proc (obfd)[0].i)
11306 {
11307 /* This is the first object. Copy the attributes. */
11308 _bfd_elf_copy_obj_attributes (ibfd, obfd);
11309
11310 /* Use the Tag_null value to indicate the attributes have been
11311 initialized. */
11312 elf_known_obj_attributes_proc (obfd)[0].i = 1;
11313
11314 return TRUE;
11315 }
11316
11317 /* Check for conflicting Tag_GNU_MIPS_ABI_FP attributes and merge
11318 non-conflicting ones. */
11319 in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
11320 out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
11321 if (in_attr[Tag_GNU_MIPS_ABI_FP].i != out_attr[Tag_GNU_MIPS_ABI_FP].i)
11322 {
11323 out_attr[Tag_GNU_MIPS_ABI_FP].type = 1;
11324 if (out_attr[Tag_GNU_MIPS_ABI_FP].i == 0)
11325 out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
11326 else if (in_attr[Tag_GNU_MIPS_ABI_FP].i == 0)
11327 ;
42554f6a 11328 else if (in_attr[Tag_GNU_MIPS_ABI_FP].i > 4)
2cf19d5c
JM
11329 _bfd_error_handler
11330 (_("Warning: %B uses unknown floating point ABI %d"), ibfd,
11331 in_attr[Tag_GNU_MIPS_ABI_FP].i);
42554f6a 11332 else if (out_attr[Tag_GNU_MIPS_ABI_FP].i > 4)
2cf19d5c
JM
11333 _bfd_error_handler
11334 (_("Warning: %B uses unknown floating point ABI %d"), obfd,
11335 out_attr[Tag_GNU_MIPS_ABI_FP].i);
11336 else
11337 switch (out_attr[Tag_GNU_MIPS_ABI_FP].i)
11338 {
11339 case 1:
11340 switch (in_attr[Tag_GNU_MIPS_ABI_FP].i)
11341 {
11342 case 2:
11343 _bfd_error_handler
11344 (_("Warning: %B uses -msingle-float, %B uses -mdouble-float"),
11345 obfd, ibfd);
51a0dd31 11346 break;
2cf19d5c
JM
11347
11348 case 3:
11349 _bfd_error_handler
11350 (_("Warning: %B uses hard float, %B uses soft float"),
11351 obfd, ibfd);
11352 break;
11353
42554f6a
TS
11354 case 4:
11355 _bfd_error_handler
11356 (_("Warning: %B uses -msingle-float, %B uses -mips32r2 -mfp64"),
11357 obfd, ibfd);
11358 break;
11359
2cf19d5c
JM
11360 default:
11361 abort ();
11362 }
11363 break;
11364
11365 case 2:
11366 switch (in_attr[Tag_GNU_MIPS_ABI_FP].i)
11367 {
11368 case 1:
11369 _bfd_error_handler
11370 (_("Warning: %B uses -msingle-float, %B uses -mdouble-float"),
11371 ibfd, obfd);
51a0dd31 11372 break;
2cf19d5c
JM
11373
11374 case 3:
11375 _bfd_error_handler
11376 (_("Warning: %B uses hard float, %B uses soft float"),
11377 obfd, ibfd);
11378 break;
11379
42554f6a
TS
11380 case 4:
11381 _bfd_error_handler
11382 (_("Warning: %B uses -mdouble-float, %B uses -mips32r2 -mfp64"),
11383 obfd, ibfd);
11384 break;
11385
2cf19d5c
JM
11386 default:
11387 abort ();
11388 }
11389 break;
11390
11391 case 3:
11392 switch (in_attr[Tag_GNU_MIPS_ABI_FP].i)
11393 {
11394 case 1:
11395 case 2:
42554f6a 11396 case 4:
2cf19d5c
JM
11397 _bfd_error_handler
11398 (_("Warning: %B uses hard float, %B uses soft float"),
11399 ibfd, obfd);
11400 break;
11401
11402 default:
11403 abort ();
11404 }
11405 break;
11406
42554f6a
TS
11407 case 4:
11408 switch (in_attr[Tag_GNU_MIPS_ABI_FP].i)
11409 {
11410 case 1:
11411 _bfd_error_handler
11412 (_("Warning: %B uses -msingle-float, %B uses -mips32r2 -mfp64"),
11413 ibfd, obfd);
11414 break;
11415
11416 case 2:
11417 _bfd_error_handler
11418 (_("Warning: %B uses -mdouble-float, %B uses -mips32r2 -mfp64"),
11419 ibfd, obfd);
11420 break;
11421
11422 case 3:
11423 _bfd_error_handler
11424 (_("Warning: %B uses hard float, %B uses soft float"),
11425 obfd, ibfd);
11426 break;
11427
11428 default:
11429 abort ();
11430 }
11431 break;
11432
2cf19d5c
JM
11433 default:
11434 abort ();
11435 }
11436 }
11437
11438 /* Merge Tag_compatibility attributes and any common GNU ones. */
11439 _bfd_elf_merge_object_attributes (ibfd, obfd);
11440
11441 return TRUE;
11442}
11443
b49e97c9
TS
11444/* Merge backend specific data from an object file to the output
11445 object file when linking. */
11446
b34976b6 11447bfd_boolean
9719ad41 11448_bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
b49e97c9
TS
11449{
11450 flagword old_flags;
11451 flagword new_flags;
b34976b6
AM
11452 bfd_boolean ok;
11453 bfd_boolean null_input_bfd = TRUE;
b49e97c9
TS
11454 asection *sec;
11455
11456 /* Check if we have the same endianess */
82e51918 11457 if (! _bfd_generic_verify_endian_match (ibfd, obfd))
aa701218
AO
11458 {
11459 (*_bfd_error_handler)
d003868e
AM
11460 (_("%B: endianness incompatible with that of the selected emulation"),
11461 ibfd);
aa701218
AO
11462 return FALSE;
11463 }
b49e97c9
TS
11464
11465 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
11466 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
b34976b6 11467 return TRUE;
b49e97c9 11468
aa701218
AO
11469 if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
11470 {
11471 (*_bfd_error_handler)
d003868e
AM
11472 (_("%B: ABI is incompatible with that of the selected emulation"),
11473 ibfd);
aa701218
AO
11474 return FALSE;
11475 }
11476
2cf19d5c
JM
11477 if (!mips_elf_merge_obj_attributes (ibfd, obfd))
11478 return FALSE;
11479
b49e97c9
TS
11480 new_flags = elf_elfheader (ibfd)->e_flags;
11481 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_NOREORDER;
11482 old_flags = elf_elfheader (obfd)->e_flags;
11483
11484 if (! elf_flags_init (obfd))
11485 {
b34976b6 11486 elf_flags_init (obfd) = TRUE;
b49e97c9
TS
11487 elf_elfheader (obfd)->e_flags = new_flags;
11488 elf_elfheader (obfd)->e_ident[EI_CLASS]
11489 = elf_elfheader (ibfd)->e_ident[EI_CLASS];
11490
11491 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
2907b861
TS
11492 && (bfd_get_arch_info (obfd)->the_default
11493 || mips_mach_extends_p (bfd_get_mach (obfd),
11494 bfd_get_mach (ibfd))))
b49e97c9
TS
11495 {
11496 if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
11497 bfd_get_mach (ibfd)))
b34976b6 11498 return FALSE;
b49e97c9
TS
11499 }
11500
b34976b6 11501 return TRUE;
b49e97c9
TS
11502 }
11503
11504 /* Check flag compatibility. */
11505
11506 new_flags &= ~EF_MIPS_NOREORDER;
11507 old_flags &= ~EF_MIPS_NOREORDER;
11508
f4416af6
AO
11509 /* Some IRIX 6 BSD-compatibility objects have this bit set. It
11510 doesn't seem to matter. */
11511 new_flags &= ~EF_MIPS_XGOT;
11512 old_flags &= ~EF_MIPS_XGOT;
11513
98a8deaf
RS
11514 /* MIPSpro generates ucode info in n64 objects. Again, we should
11515 just be able to ignore this. */
11516 new_flags &= ~EF_MIPS_UCODE;
11517 old_flags &= ~EF_MIPS_UCODE;
11518
0a44bf69
RS
11519 /* Don't care about the PIC flags from dynamic objects; they are
11520 PIC by design. */
11521 if ((new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0
11522 && (ibfd->flags & DYNAMIC) != 0)
11523 new_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
11524
b49e97c9 11525 if (new_flags == old_flags)
b34976b6 11526 return TRUE;
b49e97c9
TS
11527
11528 /* Check to see if the input BFD actually contains any sections.
11529 If not, its flags may not have been initialised either, but it cannot
11530 actually cause any incompatibility. */
11531 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
11532 {
11533 /* Ignore synthetic sections and empty .text, .data and .bss sections
11534 which are automatically generated by gas. */
11535 if (strcmp (sec->name, ".reginfo")
11536 && strcmp (sec->name, ".mdebug")
eea6121a 11537 && (sec->size != 0
d13d89fa
NS
11538 || (strcmp (sec->name, ".text")
11539 && strcmp (sec->name, ".data")
11540 && strcmp (sec->name, ".bss"))))
b49e97c9 11541 {
b34976b6 11542 null_input_bfd = FALSE;
b49e97c9
TS
11543 break;
11544 }
11545 }
11546 if (null_input_bfd)
b34976b6 11547 return TRUE;
b49e97c9 11548
b34976b6 11549 ok = TRUE;
b49e97c9 11550
143d77c5
EC
11551 if (((new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0)
11552 != ((old_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0))
b49e97c9 11553 {
b49e97c9 11554 (*_bfd_error_handler)
d003868e
AM
11555 (_("%B: warning: linking PIC files with non-PIC files"),
11556 ibfd);
143d77c5 11557 ok = TRUE;
b49e97c9
TS
11558 }
11559
143d77c5
EC
11560 if (new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC))
11561 elf_elfheader (obfd)->e_flags |= EF_MIPS_CPIC;
11562 if (! (new_flags & EF_MIPS_PIC))
11563 elf_elfheader (obfd)->e_flags &= ~EF_MIPS_PIC;
11564
11565 new_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
11566 old_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
b49e97c9 11567
64543e1a
RS
11568 /* Compare the ISAs. */
11569 if (mips_32bit_flags_p (old_flags) != mips_32bit_flags_p (new_flags))
b49e97c9 11570 {
64543e1a 11571 (*_bfd_error_handler)
d003868e
AM
11572 (_("%B: linking 32-bit code with 64-bit code"),
11573 ibfd);
64543e1a
RS
11574 ok = FALSE;
11575 }
11576 else if (!mips_mach_extends_p (bfd_get_mach (ibfd), bfd_get_mach (obfd)))
11577 {
11578 /* OBFD's ISA isn't the same as, or an extension of, IBFD's. */
11579 if (mips_mach_extends_p (bfd_get_mach (obfd), bfd_get_mach (ibfd)))
b49e97c9 11580 {
64543e1a
RS
11581 /* Copy the architecture info from IBFD to OBFD. Also copy
11582 the 32-bit flag (if set) so that we continue to recognise
11583 OBFD as a 32-bit binary. */
11584 bfd_set_arch_info (obfd, bfd_get_arch_info (ibfd));
11585 elf_elfheader (obfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
11586 elf_elfheader (obfd)->e_flags
11587 |= new_flags & (EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
11588
11589 /* Copy across the ABI flags if OBFD doesn't use them
11590 and if that was what caused us to treat IBFD as 32-bit. */
11591 if ((old_flags & EF_MIPS_ABI) == 0
11592 && mips_32bit_flags_p (new_flags)
11593 && !mips_32bit_flags_p (new_flags & ~EF_MIPS_ABI))
11594 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ABI;
b49e97c9
TS
11595 }
11596 else
11597 {
64543e1a 11598 /* The ISAs aren't compatible. */
b49e97c9 11599 (*_bfd_error_handler)
d003868e
AM
11600 (_("%B: linking %s module with previous %s modules"),
11601 ibfd,
64543e1a
RS
11602 bfd_printable_name (ibfd),
11603 bfd_printable_name (obfd));
b34976b6 11604 ok = FALSE;
b49e97c9 11605 }
b49e97c9
TS
11606 }
11607
64543e1a
RS
11608 new_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
11609 old_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
11610
11611 /* Compare ABIs. The 64-bit ABI does not use EF_MIPS_ABI. But, it
b49e97c9
TS
11612 does set EI_CLASS differently from any 32-bit ABI. */
11613 if ((new_flags & EF_MIPS_ABI) != (old_flags & EF_MIPS_ABI)
11614 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
11615 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
11616 {
11617 /* Only error if both are set (to different values). */
11618 if (((new_flags & EF_MIPS_ABI) && (old_flags & EF_MIPS_ABI))
11619 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
11620 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
11621 {
11622 (*_bfd_error_handler)
d003868e
AM
11623 (_("%B: ABI mismatch: linking %s module with previous %s modules"),
11624 ibfd,
b49e97c9
TS
11625 elf_mips_abi_name (ibfd),
11626 elf_mips_abi_name (obfd));
b34976b6 11627 ok = FALSE;
b49e97c9
TS
11628 }
11629 new_flags &= ~EF_MIPS_ABI;
11630 old_flags &= ~EF_MIPS_ABI;
11631 }
11632
fb39dac1
RS
11633 /* For now, allow arbitrary mixing of ASEs (retain the union). */
11634 if ((new_flags & EF_MIPS_ARCH_ASE) != (old_flags & EF_MIPS_ARCH_ASE))
11635 {
11636 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ARCH_ASE;
11637
11638 new_flags &= ~ EF_MIPS_ARCH_ASE;
11639 old_flags &= ~ EF_MIPS_ARCH_ASE;
11640 }
11641
b49e97c9
TS
11642 /* Warn about any other mismatches */
11643 if (new_flags != old_flags)
11644 {
11645 (*_bfd_error_handler)
d003868e
AM
11646 (_("%B: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
11647 ibfd, (unsigned long) new_flags,
b49e97c9 11648 (unsigned long) old_flags);
b34976b6 11649 ok = FALSE;
b49e97c9
TS
11650 }
11651
11652 if (! ok)
11653 {
11654 bfd_set_error (bfd_error_bad_value);
b34976b6 11655 return FALSE;
b49e97c9
TS
11656 }
11657
b34976b6 11658 return TRUE;
b49e97c9
TS
11659}
11660
11661/* Function to keep MIPS specific file flags like as EF_MIPS_PIC. */
11662
b34976b6 11663bfd_boolean
9719ad41 11664_bfd_mips_elf_set_private_flags (bfd *abfd, flagword flags)
b49e97c9
TS
11665{
11666 BFD_ASSERT (!elf_flags_init (abfd)
11667 || elf_elfheader (abfd)->e_flags == flags);
11668
11669 elf_elfheader (abfd)->e_flags = flags;
b34976b6
AM
11670 elf_flags_init (abfd) = TRUE;
11671 return TRUE;
b49e97c9
TS
11672}
11673
b34976b6 11674bfd_boolean
9719ad41 11675_bfd_mips_elf_print_private_bfd_data (bfd *abfd, void *ptr)
b49e97c9 11676{
9719ad41 11677 FILE *file = ptr;
b49e97c9
TS
11678
11679 BFD_ASSERT (abfd != NULL && ptr != NULL);
11680
11681 /* Print normal ELF private data. */
11682 _bfd_elf_print_private_bfd_data (abfd, ptr);
11683
11684 /* xgettext:c-format */
11685 fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
11686
11687 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O32)
11688 fprintf (file, _(" [abi=O32]"));
11689 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O64)
11690 fprintf (file, _(" [abi=O64]"));
11691 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32)
11692 fprintf (file, _(" [abi=EABI32]"));
11693 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64)
11694 fprintf (file, _(" [abi=EABI64]"));
11695 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI))
11696 fprintf (file, _(" [abi unknown]"));
11697 else if (ABI_N32_P (abfd))
11698 fprintf (file, _(" [abi=N32]"));
11699 else if (ABI_64_P (abfd))
11700 fprintf (file, _(" [abi=64]"));
11701 else
11702 fprintf (file, _(" [no abi set]"));
11703
11704 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
ae0d2616 11705 fprintf (file, " [mips1]");
b49e97c9 11706 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
ae0d2616 11707 fprintf (file, " [mips2]");
b49e97c9 11708 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
ae0d2616 11709 fprintf (file, " [mips3]");
b49e97c9 11710 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
ae0d2616 11711 fprintf (file, " [mips4]");
b49e97c9 11712 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_5)
ae0d2616 11713 fprintf (file, " [mips5]");
b49e97c9 11714 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
ae0d2616 11715 fprintf (file, " [mips32]");
b49e97c9 11716 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64)
ae0d2616 11717 fprintf (file, " [mips64]");
af7ee8bf 11718 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2)
ae0d2616 11719 fprintf (file, " [mips32r2]");
5f74bc13 11720 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64R2)
ae0d2616 11721 fprintf (file, " [mips64r2]");
b49e97c9
TS
11722 else
11723 fprintf (file, _(" [unknown ISA]"));
11724
40d32fc6 11725 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
ae0d2616 11726 fprintf (file, " [mdmx]");
40d32fc6
CD
11727
11728 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
ae0d2616 11729 fprintf (file, " [mips16]");
40d32fc6 11730
b49e97c9 11731 if (elf_elfheader (abfd)->e_flags & EF_MIPS_32BITMODE)
ae0d2616 11732 fprintf (file, " [32bitmode]");
b49e97c9
TS
11733 else
11734 fprintf (file, _(" [not 32bitmode]"));
11735
c0e3f241 11736 if (elf_elfheader (abfd)->e_flags & EF_MIPS_NOREORDER)
ae0d2616 11737 fprintf (file, " [noreorder]");
c0e3f241
CD
11738
11739 if (elf_elfheader (abfd)->e_flags & EF_MIPS_PIC)
ae0d2616 11740 fprintf (file, " [PIC]");
c0e3f241
CD
11741
11742 if (elf_elfheader (abfd)->e_flags & EF_MIPS_CPIC)
ae0d2616 11743 fprintf (file, " [CPIC]");
c0e3f241
CD
11744
11745 if (elf_elfheader (abfd)->e_flags & EF_MIPS_XGOT)
ae0d2616 11746 fprintf (file, " [XGOT]");
c0e3f241
CD
11747
11748 if (elf_elfheader (abfd)->e_flags & EF_MIPS_UCODE)
ae0d2616 11749 fprintf (file, " [UCODE]");
c0e3f241 11750
b49e97c9
TS
11751 fputc ('\n', file);
11752
b34976b6 11753 return TRUE;
b49e97c9 11754}
2f89ff8d 11755
b35d266b 11756const struct bfd_elf_special_section _bfd_mips_elf_special_sections[] =
2f89ff8d 11757{
0112cd26
NC
11758 { STRING_COMMA_LEN (".lit4"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
11759 { STRING_COMMA_LEN (".lit8"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
11760 { STRING_COMMA_LEN (".mdebug"), 0, SHT_MIPS_DEBUG, 0 },
11761 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
11762 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
11763 { STRING_COMMA_LEN (".ucode"), 0, SHT_MIPS_UCODE, 0 },
11764 { NULL, 0, 0, 0, 0 }
2f89ff8d 11765};
5e2b0d47 11766
8992f0d7
TS
11767/* Merge non visibility st_other attributes. Ensure that the
11768 STO_OPTIONAL flag is copied into h->other, even if this is not a
11769 definiton of the symbol. */
5e2b0d47
NC
11770void
11771_bfd_mips_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
11772 const Elf_Internal_Sym *isym,
11773 bfd_boolean definition,
11774 bfd_boolean dynamic ATTRIBUTE_UNUSED)
11775{
8992f0d7
TS
11776 if ((isym->st_other & ~ELF_ST_VISIBILITY (-1)) != 0)
11777 {
11778 unsigned char other;
11779
11780 other = (definition ? isym->st_other : h->other);
11781 other &= ~ELF_ST_VISIBILITY (-1);
11782 h->other = other | ELF_ST_VISIBILITY (h->other);
11783 }
11784
11785 if (!definition
5e2b0d47
NC
11786 && ELF_MIPS_IS_OPTIONAL (isym->st_other))
11787 h->other |= STO_OPTIONAL;
11788}
12ac1cf5
NC
11789
11790/* Decide whether an undefined symbol is special and can be ignored.
11791 This is the case for OPTIONAL symbols on IRIX. */
11792bfd_boolean
11793_bfd_mips_elf_ignore_undef_symbol (struct elf_link_hash_entry *h)
11794{
11795 return ELF_MIPS_IS_OPTIONAL (h->other) ? TRUE : FALSE;
11796}
e0764319
NC
11797
11798bfd_boolean
11799_bfd_mips_elf_common_definition (Elf_Internal_Sym *sym)
11800{
11801 return (sym->st_shndx == SHN_COMMON
11802 || sym->st_shndx == SHN_MIPS_ACOMMON
11803 || sym->st_shndx == SHN_MIPS_SCOMMON);
11804}