* layout.h (class Layout): Add added_eh_frame_data_ field.
[binutils.git] / bfd / elfxx-mips.c
blob396e578a2560b8bec26a5640ad3f705625c192b9
1 /* MIPS-specific support for ELF
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
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>
12 This file is part of BFD, the Binary File Descriptor library.
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
16 the Free Software Foundation; either version 3 of the License, or
17 (at your option) any later version.
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.
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
26 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
27 MA 02110-1301, USA. */
30 /* This file handles functionality common to the different MIPS ABI's. */
32 #include "sysdep.h"
33 #include "bfd.h"
34 #include "libbfd.h"
35 #include "libiberty.h"
36 #include "elf-bfd.h"
37 #include "elfxx-mips.h"
38 #include "elf/mips.h"
39 #include "elf-vxworks.h"
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"
47 #include "hashtab.h"
49 /* This structure is used to hold information about one GOT entry.
50 There are three types of entry:
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)
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.
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.
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.
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. */
82 struct mips_got_entry
84 /* The input bfd in which the symbol is defined. */
85 bfd *abfd;
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
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;
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;
109 /* The offset from the beginning of the .got section to the entry
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;
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. */
118 struct mips_got_page_range
120 struct mips_got_page_range *next;
121 bfd_signed_vma min_addend;
122 bfd_signed_vma max_addend;
125 /* This structure describes the range of addends that are applied to page
126 relocations against a given symbol. */
127 struct mips_got_page_entry
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;
139 /* This structure is used to hold .got information when linking. */
141 struct mips_got_info
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;
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;
153 /* The number of local .got entries, eventually including page entries. */
154 unsigned int local_gotno;
155 /* The maximum number of page entries needed. */
156 unsigned int page_gotno;
157 /* The number of local .got entries we have used. */
158 unsigned int assigned_gotno;
159 /* A hash table holding members of the got. */
160 struct htab *got_entries;
161 /* A hash table of mips_got_page_entry structures. */
162 struct htab *got_page_entries;
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;
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;
176 /* Map an input bfd to a got in a multi-got link. */
178 struct mips_elf_bfd2got_hash {
179 bfd *bfd;
180 struct mips_got_info *g;
183 /* Structure passed when traversing the bfd2got hash table, used to
184 create and merge bfd's gots. */
186 struct mips_elf_got_per_bfd_arg
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;
204 /* The maximum number of page entries needed by each got. */
205 unsigned int max_pages;
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;
213 /* Another structure used to pass arguments for got entries traversal. */
215 struct mips_elf_set_global_got_offset_arg
217 struct mips_got_info *g;
218 int value;
219 unsigned int needed_relocs;
220 struct bfd_link_info *info;
223 /* A structure used to count TLS relocations or GOT entries, for GOT
224 entry or ELF symbol table traversal. */
226 struct mips_elf_count_tls_arg
228 struct bfd_link_info *info;
229 unsigned int needed;
232 struct _mips_elf_section_data
234 struct bfd_elf_section_data elf;
235 union
237 struct mips_got_info *got_info;
238 bfd_byte *tdata;
239 } u;
242 #define mips_elf_section_data(sec) \
243 ((struct _mips_elf_section_data *) elf_section_data (sec))
245 /* This structure is passed to mips_elf_sort_hash_table_f when sorting
246 the dynamic symbols. */
248 struct mips_elf_hash_sort_data
250 /* The symbol in the global GOT with the lowest dynamic symbol table
251 index. */
252 struct elf_link_hash_entry *low;
253 /* The least dynamic symbol table index corresponding to a non-TLS
254 symbol with a GOT entry. */
255 long min_got_dynindx;
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
258 with dynamic relocations pointing to it from non-primary GOTs). */
259 long max_unref_got_dynindx;
260 /* The greatest dynamic symbol table index not corresponding to a
261 symbol without a GOT entry. */
262 long max_non_got_dynindx;
265 /* The MIPS ELF linker needs additional information for each symbol in
266 the global hash table. */
268 struct mips_elf_link_hash_entry
270 struct elf_link_hash_entry root;
272 /* External symbol information. */
273 EXTR esym;
275 /* Number of R_MIPS_32, R_MIPS_REL32, or R_MIPS_64 relocs against
276 this symbol. */
277 unsigned int possibly_dynamic_relocs;
279 /* If the R_MIPS_32, R_MIPS_REL32, or R_MIPS_64 reloc is against
280 a readonly section. */
281 bfd_boolean readonly_reloc;
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. */
287 bfd_boolean no_fn_stub;
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;
293 /* Whether we need the fn_stub; this is set if this symbol appears
294 in any relocs other than a 16 bit call. */
295 bfd_boolean need_fn_stub;
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;
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;
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. */
307 bfd_boolean forced_local;
309 /* Are we referenced by some kind of relocation? */
310 bfd_boolean is_relocation_target;
312 /* Are we referenced by branch relocations? */
313 bfd_boolean is_branch_target;
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;
331 /* MIPS ELF linker hash table. */
333 struct mips_elf_link_hash_table
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
346 entry is set to the address of __rld_obj_head as in IRIX5. */
347 bfd_boolean use_rld_obj_head;
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. */
351 bfd_boolean mips16_stubs_seen;
352 /* True if we've computed the size of the GOT. */
353 bfd_boolean computed_got_sizes;
354 /* True if we're generating code for VxWorks. */
355 bfd_boolean is_vxworks;
356 /* True if we already reported the small-data section overflow. */
357 bfd_boolean small_data_overflow_reported;
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;
370 /* The size of a function stub entry in bytes. */
371 bfd_vma function_stub_size;
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)
389 /* Structure used to pass information to mips_elf_output_extsym. */
391 struct extsym_info
393 bfd *abfd;
394 struct bfd_link_info *info;
395 struct ecoff_debug_info *debug;
396 const struct ecoff_debug_swap *swap;
397 bfd_boolean failed;
400 /* The names of the runtime procedure table symbols used on IRIX5. */
402 static const char * const mips_elf_dynsym_rtproc_names[] =
404 "_procedure_table",
405 "_procedure_string_table",
406 "_procedure_table_size",
407 NULL
410 /* These structures are used to generate the .compact_rel section on
411 IRIX5. */
413 typedef struct
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;
423 typedef struct
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;
433 typedef struct
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;
443 typedef struct
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;
452 typedef struct
454 bfd_byte info[4];
455 bfd_byte konst[4];
456 bfd_byte vaddr[4];
457 } Elf32_External_crinfo;
459 typedef struct
461 bfd_byte info[4];
462 bfd_byte konst[4];
463 } Elf32_External_crinfo2;
465 /* These are the constants used to swap the bitfields in a crinfo. */
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)
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
482 /* There are 4 types of compact relocation at least. The value KONST
483 has different meaning for each type:
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
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
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)
502 /* The structure of the runtime procedure descriptor created by the
503 loader for use by the static exception system. */
505 typedef struct runtime_pdr {
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. */
515 long reserved;
516 struct exception_info *exception_info;/* Pointer to exception array. */
517 } RPDR, *pRPDR;
518 #define cbRPDR sizeof (RPDR)
519 #define rpdNil ((pRPDR) 0)
521 static struct mips_got_entry *mips_elf_create_local_got_entry
522 (bfd *, struct bfd_link_info *, bfd *, struct mips_got_info *, asection *,
523 bfd_vma, unsigned long, struct mips_elf_link_hash_entry *, int);
524 static bfd_boolean mips_elf_sort_hash_table_f
525 (struct mips_elf_link_hash_entry *, void *);
526 static bfd_vma mips_elf_high
527 (bfd_vma);
528 static bfd_boolean mips16_stub_section_p
529 (bfd *, asection *);
530 static bfd_boolean mips_elf_create_dynamic_relocation
531 (bfd *, struct bfd_link_info *, const Elf_Internal_Rela *,
532 struct mips_elf_link_hash_entry *, asection *, bfd_vma,
533 bfd_vma *, asection *);
534 static hashval_t mips_elf_got_entry_hash
535 (const void *);
536 static bfd_vma mips_elf_adjust_gp
537 (bfd *, struct mips_got_info *, bfd *);
538 static struct mips_got_info *mips_elf_got_for_ibfd
539 (struct mips_got_info *, bfd *);
541 /* This will be used when we sort the dynamic relocation records. */
542 static bfd *reldyn_sorting_bfd;
544 /* Nonzero if ABFD is using the N32 ABI. */
545 #define ABI_N32_P(abfd) \
546 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
548 /* Nonzero if ABFD is using the N64 ABI. */
549 #define ABI_64_P(abfd) \
550 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
552 /* Nonzero if ABFD is using NewABI conventions. */
553 #define NEWABI_P(abfd) (ABI_N32_P (abfd) || ABI_64_P (abfd))
555 /* The IRIX compatibility level we are striving for. */
556 #define IRIX_COMPAT(abfd) \
557 (get_elf_backend_data (abfd)->elf_backend_mips_irix_compat (abfd))
559 /* Whether we are trying to be compatible with IRIX at all. */
560 #define SGI_COMPAT(abfd) \
561 (IRIX_COMPAT (abfd) != ict_none)
563 /* The name of the options section. */
564 #define MIPS_ELF_OPTIONS_SECTION_NAME(abfd) \
565 (NEWABI_P (abfd) ? ".MIPS.options" : ".options")
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)
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))
577 /* The name of the stub section. */
578 #define MIPS_ELF_STUB_SECTION_NAME(abfd) ".MIPS.stubs"
580 /* The size of an external REL relocation. */
581 #define MIPS_ELF_REL_SIZE(abfd) \
582 (get_elf_backend_data (abfd)->s->sizeof_rel)
584 /* The size of an external RELA relocation. */
585 #define MIPS_ELF_RELA_SIZE(abfd) \
586 (get_elf_backend_data (abfd)->s->sizeof_rela)
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)
592 /* The size of a GOT entry. */
593 #define MIPS_ELF_GOT_SIZE(abfd) \
594 (get_elf_backend_data (abfd)->s->arch_size / 8)
596 /* The size of a symbol-table entry. */
597 #define MIPS_ELF_SYM_SIZE(abfd) \
598 (get_elf_backend_data (abfd)->s->sizeof_sym)
600 /* The default alignment for sections, as a power of two. */
601 #define MIPS_ELF_LOG_FILE_ALIGN(abfd) \
602 (get_elf_backend_data (abfd)->s->log_file_align)
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))
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))
614 /* Add a dynamic symbol table-entry. */
615 #define MIPS_ELF_ADD_DYNAMIC_ENTRY(info, tag, val) \
616 _bfd_elf_add_dynamic_entry (info, tag, val)
618 #define MIPS_ELF_RTYPE_TO_HOWTO(abfd, rtype, rela) \
619 (get_elf_backend_data (abfd)->elf_backend_mips_rtype_to_howto (rtype, rela))
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))))
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")
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)
645 #define MINUS_TWO (((bfd_vma)0) - 2)
647 /* The number of local .got entries we reserve. */
648 #define MIPS_RESERVED_GOTNO(INFO) \
649 (mips_elf_hash_table (INFO)->is_vxworks ? 3 : 2)
651 /* The value to write into got[1] for SVR4 targets, to identify it is
652 a GNU object. The dynamic linker can then use got[1] to store the
653 module pointer. */
654 #define MIPS_ELF_GNU_GOT1_MASK(abfd) \
655 ((bfd_vma) 1 << (ABI_64_P (abfd) ? 63 : 31))
657 /* The offset of $gp from the beginning of the .got section. */
658 #define ELF_MIPS_GP_OFFSET(INFO) \
659 (mips_elf_hash_table (INFO)->is_vxworks ? 0x0 : 0x7ff0)
661 /* The maximum size of the GOT for it to be addressable using 16-bit
662 offsets from $gp. */
663 #define MIPS_ELF_GOT_MAX_SIZE(INFO) (ELF_MIPS_GP_OFFSET (INFO) + 0x7fff)
665 /* Instructions which appear in a stub. */
666 #define STUB_LW(abfd) \
667 ((ABI_64_P (abfd) \
668 ? 0xdf998010 /* ld t9,0x8010(gp) */ \
669 : 0x8f998010)) /* lw t9,0x8010(gp) */
670 #define STUB_MOVE(abfd) \
671 ((ABI_64_P (abfd) \
672 ? 0x03e0782d /* daddu t7,ra */ \
673 : 0x03e07821)) /* addu t7,ra */
674 #define STUB_LUI(VAL) (0x3c180000 + (VAL)) /* lui t8,VAL */
675 #define STUB_JALR 0x0320f809 /* jalr t9,ra */
676 #define STUB_ORI(VAL) (0x37180000 + (VAL)) /* ori t8,t8,VAL */
677 #define STUB_LI16U(VAL) (0x34180000 + (VAL)) /* ori t8,zero,VAL unsigned */
678 #define STUB_LI16S(abfd, VAL) \
679 ((ABI_64_P (abfd) \
680 ? (0x64180000 + (VAL)) /* daddiu t8,zero,VAL sign extended */ \
681 : (0x24180000 + (VAL)))) /* addiu t8,zero,VAL sign extended */
683 #define MIPS_FUNCTION_STUB_NORMAL_SIZE 16
684 #define MIPS_FUNCTION_STUB_BIG_SIZE 20
686 /* The name of the dynamic interpreter. This is put in the .interp
687 section. */
689 #define ELF_DYNAMIC_INTERPRETER(abfd) \
690 (ABI_N32_P (abfd) ? "/usr/lib32/libc.so.1" \
691 : ABI_64_P (abfd) ? "/usr/lib64/libc.so.1" \
692 : "/usr/lib/libc.so.1")
694 #ifdef BFD64
695 #define MNAME(bfd,pre,pos) \
696 (ABI_64_P (bfd) ? CONCAT4 (pre,64,_,pos) : CONCAT4 (pre,32,_,pos))
697 #define ELF_R_SYM(bfd, i) \
698 (ABI_64_P (bfd) ? ELF64_R_SYM (i) : ELF32_R_SYM (i))
699 #define ELF_R_TYPE(bfd, i) \
700 (ABI_64_P (bfd) ? ELF64_MIPS_R_TYPE (i) : ELF32_R_TYPE (i))
701 #define ELF_R_INFO(bfd, s, t) \
702 (ABI_64_P (bfd) ? ELF64_R_INFO (s, t) : ELF32_R_INFO (s, t))
703 #else
704 #define MNAME(bfd,pre,pos) CONCAT4 (pre,32,_,pos)
705 #define ELF_R_SYM(bfd, i) \
706 (ELF32_R_SYM (i))
707 #define ELF_R_TYPE(bfd, i) \
708 (ELF32_R_TYPE (i))
709 #define ELF_R_INFO(bfd, s, t) \
710 (ELF32_R_INFO (s, t))
711 #endif
713 /* The mips16 compiler uses a couple of special sections to handle
714 floating point arguments.
716 Section names that look like .mips16.fn.FNNAME contain stubs that
717 copy floating point arguments from the fp regs to the gp regs and
718 then jump to FNNAME. If any 32 bit function calls FNNAME, the
719 call should be redirected to the stub instead. If no 32 bit
720 function calls FNNAME, the stub should be discarded. We need to
721 consider any reference to the function, not just a call, because
722 if the address of the function is taken we will need the stub,
723 since the address might be passed to a 32 bit function.
725 Section names that look like .mips16.call.FNNAME contain stubs
726 that copy floating point arguments from the gp regs to the fp
727 regs and then jump to FNNAME. If FNNAME is a 32 bit function,
728 then any 16 bit function that calls FNNAME should be redirected
729 to the stub instead. If FNNAME is not a 32 bit function, the
730 stub should be discarded.
732 .mips16.call.fp.FNNAME sections are similar, but contain stubs
733 which call FNNAME and then copy the return value from the fp regs
734 to the gp regs. These stubs store the return value in $18 while
735 calling FNNAME; any function which might call one of these stubs
736 must arrange to save $18 around the call. (This case is not
737 needed for 32 bit functions that call 16 bit functions, because
738 16 bit functions always return floating point values in both
739 $f0/$f1 and $2/$3.)
741 Note that in all cases FNNAME might be defined statically.
742 Therefore, FNNAME is not used literally. Instead, the relocation
743 information will indicate which symbol the section is for.
745 We record any stubs that we find in the symbol table. */
747 #define FN_STUB ".mips16.fn."
748 #define CALL_STUB ".mips16.call."
749 #define CALL_FP_STUB ".mips16.call.fp."
751 #define FN_STUB_P(name) CONST_STRNEQ (name, FN_STUB)
752 #define CALL_STUB_P(name) CONST_STRNEQ (name, CALL_STUB)
753 #define CALL_FP_STUB_P(name) CONST_STRNEQ (name, CALL_FP_STUB)
755 /* The format of the first PLT entry in a VxWorks executable. */
756 static const bfd_vma mips_vxworks_exec_plt0_entry[] = {
757 0x3c190000, /* lui t9, %hi(_GLOBAL_OFFSET_TABLE_) */
758 0x27390000, /* addiu t9, t9, %lo(_GLOBAL_OFFSET_TABLE_) */
759 0x8f390008, /* lw t9, 8(t9) */
760 0x00000000, /* nop */
761 0x03200008, /* jr t9 */
762 0x00000000 /* nop */
765 /* The format of subsequent PLT entries. */
766 static const bfd_vma mips_vxworks_exec_plt_entry[] = {
767 0x10000000, /* b .PLT_resolver */
768 0x24180000, /* li t8, <pltindex> */
769 0x3c190000, /* lui t9, %hi(<.got.plt slot>) */
770 0x27390000, /* addiu t9, t9, %lo(<.got.plt slot>) */
771 0x8f390000, /* lw t9, 0(t9) */
772 0x00000000, /* nop */
773 0x03200008, /* jr t9 */
774 0x00000000 /* nop */
777 /* The format of the first PLT entry in a VxWorks shared object. */
778 static const bfd_vma mips_vxworks_shared_plt0_entry[] = {
779 0x8f990008, /* lw t9, 8(gp) */
780 0x00000000, /* nop */
781 0x03200008, /* jr t9 */
782 0x00000000, /* nop */
783 0x00000000, /* nop */
784 0x00000000 /* nop */
787 /* The format of subsequent PLT entries. */
788 static const bfd_vma mips_vxworks_shared_plt_entry[] = {
789 0x10000000, /* b .PLT_resolver */
790 0x24180000 /* li t8, <pltindex> */
793 /* Look up an entry in a MIPS ELF linker hash table. */
795 #define mips_elf_link_hash_lookup(table, string, create, copy, follow) \
796 ((struct mips_elf_link_hash_entry *) \
797 elf_link_hash_lookup (&(table)->root, (string), (create), \
798 (copy), (follow)))
800 /* Traverse a MIPS ELF linker hash table. */
802 #define mips_elf_link_hash_traverse(table, func, info) \
803 (elf_link_hash_traverse \
804 (&(table)->root, \
805 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
806 (info)))
808 /* Get the MIPS ELF linker hash table from a link_info structure. */
810 #define mips_elf_hash_table(p) \
811 ((struct mips_elf_link_hash_table *) ((p)->hash))
813 /* Find the base offsets for thread-local storage in this object,
814 for GD/LD and IE/LE respectively. */
816 #define TP_OFFSET 0x7000
817 #define DTP_OFFSET 0x8000
819 static bfd_vma
820 dtprel_base (struct bfd_link_info *info)
822 /* If tls_sec is NULL, we should have signalled an error already. */
823 if (elf_hash_table (info)->tls_sec == NULL)
824 return 0;
825 return elf_hash_table (info)->tls_sec->vma + DTP_OFFSET;
828 static bfd_vma
829 tprel_base (struct bfd_link_info *info)
831 /* If tls_sec is NULL, we should have signalled an error already. */
832 if (elf_hash_table (info)->tls_sec == NULL)
833 return 0;
834 return elf_hash_table (info)->tls_sec->vma + TP_OFFSET;
837 /* Create an entry in a MIPS ELF linker hash table. */
839 static struct bfd_hash_entry *
840 mips_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
841 struct bfd_hash_table *table, const char *string)
843 struct mips_elf_link_hash_entry *ret =
844 (struct mips_elf_link_hash_entry *) entry;
846 /* Allocate the structure if it has not already been allocated by a
847 subclass. */
848 if (ret == NULL)
849 ret = bfd_hash_allocate (table, sizeof (struct mips_elf_link_hash_entry));
850 if (ret == NULL)
851 return (struct bfd_hash_entry *) ret;
853 /* Call the allocation method of the superclass. */
854 ret = ((struct mips_elf_link_hash_entry *)
855 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
856 table, string));
857 if (ret != NULL)
859 /* Set local fields. */
860 memset (&ret->esym, 0, sizeof (EXTR));
861 /* We use -2 as a marker to indicate that the information has
862 not been set. -1 means there is no associated ifd. */
863 ret->esym.ifd = -2;
864 ret->possibly_dynamic_relocs = 0;
865 ret->readonly_reloc = FALSE;
866 ret->no_fn_stub = FALSE;
867 ret->fn_stub = NULL;
868 ret->need_fn_stub = FALSE;
869 ret->call_stub = NULL;
870 ret->call_fp_stub = NULL;
871 ret->forced_local = FALSE;
872 ret->is_branch_target = FALSE;
873 ret->is_relocation_target = FALSE;
874 ret->tls_type = GOT_NORMAL;
877 return (struct bfd_hash_entry *) ret;
880 bfd_boolean
881 _bfd_mips_elf_new_section_hook (bfd *abfd, asection *sec)
883 if (!sec->used_by_bfd)
885 struct _mips_elf_section_data *sdata;
886 bfd_size_type amt = sizeof (*sdata);
888 sdata = bfd_zalloc (abfd, amt);
889 if (sdata == NULL)
890 return FALSE;
891 sec->used_by_bfd = sdata;
894 return _bfd_elf_new_section_hook (abfd, sec);
897 /* Read ECOFF debugging information from a .mdebug section into a
898 ecoff_debug_info structure. */
900 bfd_boolean
901 _bfd_mips_elf_read_ecoff_info (bfd *abfd, asection *section,
902 struct ecoff_debug_info *debug)
904 HDRR *symhdr;
905 const struct ecoff_debug_swap *swap;
906 char *ext_hdr;
908 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
909 memset (debug, 0, sizeof (*debug));
911 ext_hdr = bfd_malloc (swap->external_hdr_size);
912 if (ext_hdr == NULL && swap->external_hdr_size != 0)
913 goto error_return;
915 if (! bfd_get_section_contents (abfd, section, ext_hdr, 0,
916 swap->external_hdr_size))
917 goto error_return;
919 symhdr = &debug->symbolic_header;
920 (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
922 /* The symbolic header contains absolute file offsets and sizes to
923 read. */
924 #define READ(ptr, offset, count, size, type) \
925 if (symhdr->count == 0) \
926 debug->ptr = NULL; \
927 else \
929 bfd_size_type amt = (bfd_size_type) size * symhdr->count; \
930 debug->ptr = bfd_malloc (amt); \
931 if (debug->ptr == NULL) \
932 goto error_return; \
933 if (bfd_seek (abfd, symhdr->offset, SEEK_SET) != 0 \
934 || bfd_bread (debug->ptr, amt, abfd) != amt) \
935 goto error_return; \
938 READ (line, cbLineOffset, cbLine, sizeof (unsigned char), unsigned char *);
939 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, void *);
940 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, void *);
941 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, void *);
942 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, void *);
943 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
944 union aux_ext *);
945 READ (ss, cbSsOffset, issMax, sizeof (char), char *);
946 READ (ssext, cbSsExtOffset, issExtMax, sizeof (char), char *);
947 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, void *);
948 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, void *);
949 READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size, void *);
950 #undef READ
952 debug->fdr = NULL;
954 return TRUE;
956 error_return:
957 if (ext_hdr != NULL)
958 free (ext_hdr);
959 if (debug->line != NULL)
960 free (debug->line);
961 if (debug->external_dnr != NULL)
962 free (debug->external_dnr);
963 if (debug->external_pdr != NULL)
964 free (debug->external_pdr);
965 if (debug->external_sym != NULL)
966 free (debug->external_sym);
967 if (debug->external_opt != NULL)
968 free (debug->external_opt);
969 if (debug->external_aux != NULL)
970 free (debug->external_aux);
971 if (debug->ss != NULL)
972 free (debug->ss);
973 if (debug->ssext != NULL)
974 free (debug->ssext);
975 if (debug->external_fdr != NULL)
976 free (debug->external_fdr);
977 if (debug->external_rfd != NULL)
978 free (debug->external_rfd);
979 if (debug->external_ext != NULL)
980 free (debug->external_ext);
981 return FALSE;
984 /* Swap RPDR (runtime procedure table entry) for output. */
986 static void
987 ecoff_swap_rpdr_out (bfd *abfd, const RPDR *in, struct rpdr_ext *ex)
989 H_PUT_S32 (abfd, in->adr, ex->p_adr);
990 H_PUT_32 (abfd, in->regmask, ex->p_regmask);
991 H_PUT_32 (abfd, in->regoffset, ex->p_regoffset);
992 H_PUT_32 (abfd, in->fregmask, ex->p_fregmask);
993 H_PUT_32 (abfd, in->fregoffset, ex->p_fregoffset);
994 H_PUT_32 (abfd, in->frameoffset, ex->p_frameoffset);
996 H_PUT_16 (abfd, in->framereg, ex->p_framereg);
997 H_PUT_16 (abfd, in->pcreg, ex->p_pcreg);
999 H_PUT_32 (abfd, in->irpss, ex->p_irpss);
1002 /* Create a runtime procedure table from the .mdebug section. */
1004 static bfd_boolean
1005 mips_elf_create_procedure_table (void *handle, bfd *abfd,
1006 struct bfd_link_info *info, asection *s,
1007 struct ecoff_debug_info *debug)
1009 const struct ecoff_debug_swap *swap;
1010 HDRR *hdr = &debug->symbolic_header;
1011 RPDR *rpdr, *rp;
1012 struct rpdr_ext *erp;
1013 void *rtproc;
1014 struct pdr_ext *epdr;
1015 struct sym_ext *esym;
1016 char *ss, **sv;
1017 char *str;
1018 bfd_size_type size;
1019 bfd_size_type count;
1020 unsigned long sindex;
1021 unsigned long i;
1022 PDR pdr;
1023 SYMR sym;
1024 const char *no_name_func = _("static procedure (no name)");
1026 epdr = NULL;
1027 rpdr = NULL;
1028 esym = NULL;
1029 ss = NULL;
1030 sv = NULL;
1032 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1034 sindex = strlen (no_name_func) + 1;
1035 count = hdr->ipdMax;
1036 if (count > 0)
1038 size = swap->external_pdr_size;
1040 epdr = bfd_malloc (size * count);
1041 if (epdr == NULL)
1042 goto error_return;
1044 if (! _bfd_ecoff_get_accumulated_pdr (handle, (bfd_byte *) epdr))
1045 goto error_return;
1047 size = sizeof (RPDR);
1048 rp = rpdr = bfd_malloc (size * count);
1049 if (rpdr == NULL)
1050 goto error_return;
1052 size = sizeof (char *);
1053 sv = bfd_malloc (size * count);
1054 if (sv == NULL)
1055 goto error_return;
1057 count = hdr->isymMax;
1058 size = swap->external_sym_size;
1059 esym = bfd_malloc (size * count);
1060 if (esym == NULL)
1061 goto error_return;
1063 if (! _bfd_ecoff_get_accumulated_sym (handle, (bfd_byte *) esym))
1064 goto error_return;
1066 count = hdr->issMax;
1067 ss = bfd_malloc (count);
1068 if (ss == NULL)
1069 goto error_return;
1070 if (! _bfd_ecoff_get_accumulated_ss (handle, (bfd_byte *) ss))
1071 goto error_return;
1073 count = hdr->ipdMax;
1074 for (i = 0; i < (unsigned long) count; i++, rp++)
1076 (*swap->swap_pdr_in) (abfd, epdr + i, &pdr);
1077 (*swap->swap_sym_in) (abfd, &esym[pdr.isym], &sym);
1078 rp->adr = sym.value;
1079 rp->regmask = pdr.regmask;
1080 rp->regoffset = pdr.regoffset;
1081 rp->fregmask = pdr.fregmask;
1082 rp->fregoffset = pdr.fregoffset;
1083 rp->frameoffset = pdr.frameoffset;
1084 rp->framereg = pdr.framereg;
1085 rp->pcreg = pdr.pcreg;
1086 rp->irpss = sindex;
1087 sv[i] = ss + sym.iss;
1088 sindex += strlen (sv[i]) + 1;
1092 size = sizeof (struct rpdr_ext) * (count + 2) + sindex;
1093 size = BFD_ALIGN (size, 16);
1094 rtproc = bfd_alloc (abfd, size);
1095 if (rtproc == NULL)
1097 mips_elf_hash_table (info)->procedure_count = 0;
1098 goto error_return;
1101 mips_elf_hash_table (info)->procedure_count = count + 2;
1103 erp = rtproc;
1104 memset (erp, 0, sizeof (struct rpdr_ext));
1105 erp++;
1106 str = (char *) rtproc + sizeof (struct rpdr_ext) * (count + 2);
1107 strcpy (str, no_name_func);
1108 str += strlen (no_name_func) + 1;
1109 for (i = 0; i < count; i++)
1111 ecoff_swap_rpdr_out (abfd, rpdr + i, erp + i);
1112 strcpy (str, sv[i]);
1113 str += strlen (sv[i]) + 1;
1115 H_PUT_S32 (abfd, -1, (erp + count)->p_adr);
1117 /* Set the size and contents of .rtproc section. */
1118 s->size = size;
1119 s->contents = rtproc;
1121 /* Skip this section later on (I don't think this currently
1122 matters, but someday it might). */
1123 s->map_head.link_order = NULL;
1125 if (epdr != NULL)
1126 free (epdr);
1127 if (rpdr != NULL)
1128 free (rpdr);
1129 if (esym != NULL)
1130 free (esym);
1131 if (ss != NULL)
1132 free (ss);
1133 if (sv != NULL)
1134 free (sv);
1136 return TRUE;
1138 error_return:
1139 if (epdr != NULL)
1140 free (epdr);
1141 if (rpdr != NULL)
1142 free (rpdr);
1143 if (esym != NULL)
1144 free (esym);
1145 if (ss != NULL)
1146 free (ss);
1147 if (sv != NULL)
1148 free (sv);
1149 return FALSE;
1152 /* Check the mips16 stubs for a particular symbol, and see if we can
1153 discard them. */
1155 static bfd_boolean
1156 mips_elf_check_mips16_stubs (struct mips_elf_link_hash_entry *h,
1157 void *data ATTRIBUTE_UNUSED)
1159 if (h->root.root.type == bfd_link_hash_warning)
1160 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
1162 if (h->fn_stub != NULL
1163 && ! h->need_fn_stub)
1165 /* We don't need the fn_stub; the only references to this symbol
1166 are 16 bit calls. Clobber the size to 0 to prevent it from
1167 being included in the link. */
1168 h->fn_stub->size = 0;
1169 h->fn_stub->flags &= ~SEC_RELOC;
1170 h->fn_stub->reloc_count = 0;
1171 h->fn_stub->flags |= SEC_EXCLUDE;
1174 if (h->call_stub != NULL
1175 && h->root.other == STO_MIPS16)
1177 /* We don't need the call_stub; this is a 16 bit function, so
1178 calls from other 16 bit functions are OK. Clobber the size
1179 to 0 to prevent it from being included in the link. */
1180 h->call_stub->size = 0;
1181 h->call_stub->flags &= ~SEC_RELOC;
1182 h->call_stub->reloc_count = 0;
1183 h->call_stub->flags |= SEC_EXCLUDE;
1186 if (h->call_fp_stub != NULL
1187 && h->root.other == STO_MIPS16)
1189 /* We don't need the call_stub; this is a 16 bit function, so
1190 calls from other 16 bit functions are OK. Clobber the size
1191 to 0 to prevent it from being included in the link. */
1192 h->call_fp_stub->size = 0;
1193 h->call_fp_stub->flags &= ~SEC_RELOC;
1194 h->call_fp_stub->reloc_count = 0;
1195 h->call_fp_stub->flags |= SEC_EXCLUDE;
1198 return TRUE;
1201 /* R_MIPS16_26 is used for the mips16 jal and jalx instructions.
1202 Most mips16 instructions are 16 bits, but these instructions
1203 are 32 bits.
1205 The format of these instructions is:
1207 +--------------+--------------------------------+
1208 | JALX | X| Imm 20:16 | Imm 25:21 |
1209 +--------------+--------------------------------+
1210 | Immediate 15:0 |
1211 +-----------------------------------------------+
1213 JALX is the 5-bit value 00011. X is 0 for jal, 1 for jalx.
1214 Note that the immediate value in the first word is swapped.
1216 When producing a relocatable object file, R_MIPS16_26 is
1217 handled mostly like R_MIPS_26. In particular, the addend is
1218 stored as a straight 26-bit value in a 32-bit instruction.
1219 (gas makes life simpler for itself by never adjusting a
1220 R_MIPS16_26 reloc to be against a section, so the addend is
1221 always zero). However, the 32 bit instruction is stored as 2
1222 16-bit values, rather than a single 32-bit value. In a
1223 big-endian file, the result is the same; in a little-endian
1224 file, the two 16-bit halves of the 32 bit value are swapped.
1225 This is so that a disassembler can recognize the jal
1226 instruction.
1228 When doing a final link, R_MIPS16_26 is treated as a 32 bit
1229 instruction stored as two 16-bit values. The addend A is the
1230 contents of the targ26 field. The calculation is the same as
1231 R_MIPS_26. When storing the calculated value, reorder the
1232 immediate value as shown above, and don't forget to store the
1233 value as two 16-bit values.
1235 To put it in MIPS ABI terms, the relocation field is T-targ26-16,
1236 defined as
1238 big-endian:
1239 +--------+----------------------+
1240 | | |
1241 | | targ26-16 |
1242 |31 26|25 0|
1243 +--------+----------------------+
1245 little-endian:
1246 +----------+------+-------------+
1247 | | | |
1248 | sub1 | | sub2 |
1249 |0 9|10 15|16 31|
1250 +----------+--------------------+
1251 where targ26-16 is sub1 followed by sub2 (i.e., the addend field A is
1252 ((sub1 << 16) | sub2)).
1254 When producing a relocatable object file, the calculation is
1255 (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
1256 When producing a fully linked file, the calculation is
1257 let R = (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
1258 ((R & 0x1f0000) << 5) | ((R & 0x3e00000) >> 5) | (R & 0xffff)
1260 R_MIPS16_GPREL is used for GP-relative addressing in mips16
1261 mode. A typical instruction will have a format like this:
1263 +--------------+--------------------------------+
1264 | EXTEND | Imm 10:5 | Imm 15:11 |
1265 +--------------+--------------------------------+
1266 | Major | rx | ry | Imm 4:0 |
1267 +--------------+--------------------------------+
1269 EXTEND is the five bit value 11110. Major is the instruction
1270 opcode.
1272 This is handled exactly like R_MIPS_GPREL16, except that the
1273 addend is retrieved and stored as shown in this diagram; that
1274 is, the Imm fields above replace the V-rel16 field.
1276 All we need to do here is shuffle the bits appropriately. As
1277 above, the two 16-bit halves must be swapped on a
1278 little-endian system.
1280 R_MIPS16_HI16 and R_MIPS16_LO16 are used in mips16 mode to
1281 access data when neither GP-relative nor PC-relative addressing
1282 can be used. They are handled like R_MIPS_HI16 and R_MIPS_LO16,
1283 except that the addend is retrieved and stored as shown above
1284 for R_MIPS16_GPREL.
1286 void
1287 _bfd_mips16_elf_reloc_unshuffle (bfd *abfd, int r_type,
1288 bfd_boolean jal_shuffle, bfd_byte *data)
1290 bfd_vma extend, insn, val;
1292 if (r_type != R_MIPS16_26 && r_type != R_MIPS16_GPREL
1293 && r_type != R_MIPS16_HI16 && r_type != R_MIPS16_LO16)
1294 return;
1296 /* Pick up the mips16 extend instruction and the real instruction. */
1297 extend = bfd_get_16 (abfd, data);
1298 insn = bfd_get_16 (abfd, data + 2);
1299 if (r_type == R_MIPS16_26)
1301 if (jal_shuffle)
1302 val = ((extend & 0xfc00) << 16) | ((extend & 0x3e0) << 11)
1303 | ((extend & 0x1f) << 21) | insn;
1304 else
1305 val = extend << 16 | insn;
1307 else
1308 val = ((extend & 0xf800) << 16) | ((insn & 0xffe0) << 11)
1309 | ((extend & 0x1f) << 11) | (extend & 0x7e0) | (insn & 0x1f);
1310 bfd_put_32 (abfd, val, data);
1313 void
1314 _bfd_mips16_elf_reloc_shuffle (bfd *abfd, int r_type,
1315 bfd_boolean jal_shuffle, bfd_byte *data)
1317 bfd_vma extend, insn, val;
1319 if (r_type != R_MIPS16_26 && r_type != R_MIPS16_GPREL
1320 && r_type != R_MIPS16_HI16 && r_type != R_MIPS16_LO16)
1321 return;
1323 val = bfd_get_32 (abfd, data);
1324 if (r_type == R_MIPS16_26)
1326 if (jal_shuffle)
1328 insn = val & 0xffff;
1329 extend = ((val >> 16) & 0xfc00) | ((val >> 11) & 0x3e0)
1330 | ((val >> 21) & 0x1f);
1332 else
1334 insn = val & 0xffff;
1335 extend = val >> 16;
1338 else
1340 insn = ((val >> 11) & 0xffe0) | (val & 0x1f);
1341 extend = ((val >> 16) & 0xf800) | ((val >> 11) & 0x1f) | (val & 0x7e0);
1343 bfd_put_16 (abfd, insn, data + 2);
1344 bfd_put_16 (abfd, extend, data);
1347 bfd_reloc_status_type
1348 _bfd_mips_elf_gprel16_with_gp (bfd *abfd, asymbol *symbol,
1349 arelent *reloc_entry, asection *input_section,
1350 bfd_boolean relocatable, void *data, bfd_vma gp)
1352 bfd_vma relocation;
1353 bfd_signed_vma val;
1354 bfd_reloc_status_type status;
1356 if (bfd_is_com_section (symbol->section))
1357 relocation = 0;
1358 else
1359 relocation = symbol->value;
1361 relocation += symbol->section->output_section->vma;
1362 relocation += symbol->section->output_offset;
1364 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1365 return bfd_reloc_outofrange;
1367 /* Set val to the offset into the section or symbol. */
1368 val = reloc_entry->addend;
1370 _bfd_mips_elf_sign_extend (val, 16);
1372 /* Adjust val for the final section location and GP value. If we
1373 are producing relocatable output, we don't want to do this for
1374 an external symbol. */
1375 if (! relocatable
1376 || (symbol->flags & BSF_SECTION_SYM) != 0)
1377 val += relocation - gp;
1379 if (reloc_entry->howto->partial_inplace)
1381 status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
1382 (bfd_byte *) data
1383 + reloc_entry->address);
1384 if (status != bfd_reloc_ok)
1385 return status;
1387 else
1388 reloc_entry->addend = val;
1390 if (relocatable)
1391 reloc_entry->address += input_section->output_offset;
1393 return bfd_reloc_ok;
1396 /* Used to store a REL high-part relocation such as R_MIPS_HI16 or
1397 R_MIPS_GOT16. REL is the relocation, INPUT_SECTION is the section
1398 that contains the relocation field and DATA points to the start of
1399 INPUT_SECTION. */
1401 struct mips_hi16
1403 struct mips_hi16 *next;
1404 bfd_byte *data;
1405 asection *input_section;
1406 arelent rel;
1409 /* FIXME: This should not be a static variable. */
1411 static struct mips_hi16 *mips_hi16_list;
1413 /* A howto special_function for REL *HI16 relocations. We can only
1414 calculate the correct value once we've seen the partnering
1415 *LO16 relocation, so just save the information for later.
1417 The ABI requires that the *LO16 immediately follow the *HI16.
1418 However, as a GNU extension, we permit an arbitrary number of
1419 *HI16s to be associated with a single *LO16. This significantly
1420 simplies the relocation handling in gcc. */
1422 bfd_reloc_status_type
1423 _bfd_mips_elf_hi16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
1424 asymbol *symbol ATTRIBUTE_UNUSED, void *data,
1425 asection *input_section, bfd *output_bfd,
1426 char **error_message ATTRIBUTE_UNUSED)
1428 struct mips_hi16 *n;
1430 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1431 return bfd_reloc_outofrange;
1433 n = bfd_malloc (sizeof *n);
1434 if (n == NULL)
1435 return bfd_reloc_outofrange;
1437 n->next = mips_hi16_list;
1438 n->data = data;
1439 n->input_section = input_section;
1440 n->rel = *reloc_entry;
1441 mips_hi16_list = n;
1443 if (output_bfd != NULL)
1444 reloc_entry->address += input_section->output_offset;
1446 return bfd_reloc_ok;
1449 /* A howto special_function for REL R_MIPS_GOT16 relocations. This is just
1450 like any other 16-bit relocation when applied to global symbols, but is
1451 treated in the same as R_MIPS_HI16 when applied to local symbols. */
1453 bfd_reloc_status_type
1454 _bfd_mips_elf_got16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1455 void *data, asection *input_section,
1456 bfd *output_bfd, char **error_message)
1458 if ((symbol->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1459 || bfd_is_und_section (bfd_get_section (symbol))
1460 || bfd_is_com_section (bfd_get_section (symbol)))
1461 /* The relocation is against a global symbol. */
1462 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1463 input_section, output_bfd,
1464 error_message);
1466 return _bfd_mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
1467 input_section, output_bfd, error_message);
1470 /* A howto special_function for REL *LO16 relocations. The *LO16 itself
1471 is a straightforward 16 bit inplace relocation, but we must deal with
1472 any partnering high-part relocations as well. */
1474 bfd_reloc_status_type
1475 _bfd_mips_elf_lo16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1476 void *data, asection *input_section,
1477 bfd *output_bfd, char **error_message)
1479 bfd_vma vallo;
1480 bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
1482 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1483 return bfd_reloc_outofrange;
1485 _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
1486 location);
1487 vallo = bfd_get_32 (abfd, location);
1488 _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, FALSE,
1489 location);
1491 while (mips_hi16_list != NULL)
1493 bfd_reloc_status_type ret;
1494 struct mips_hi16 *hi;
1496 hi = mips_hi16_list;
1498 /* R_MIPS_GOT16 relocations are something of a special case. We
1499 want to install the addend in the same way as for a R_MIPS_HI16
1500 relocation (with a rightshift of 16). However, since GOT16
1501 relocations can also be used with global symbols, their howto
1502 has a rightshift of 0. */
1503 if (hi->rel.howto->type == R_MIPS_GOT16)
1504 hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MIPS_HI16, FALSE);
1506 /* VALLO is a signed 16-bit number. Bias it by 0x8000 so that any
1507 carry or borrow will induce a change of +1 or -1 in the high part. */
1508 hi->rel.addend += (vallo + 0x8000) & 0xffff;
1510 ret = _bfd_mips_elf_generic_reloc (abfd, &hi->rel, symbol, hi->data,
1511 hi->input_section, output_bfd,
1512 error_message);
1513 if (ret != bfd_reloc_ok)
1514 return ret;
1516 mips_hi16_list = hi->next;
1517 free (hi);
1520 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1521 input_section, output_bfd,
1522 error_message);
1525 /* A generic howto special_function. This calculates and installs the
1526 relocation itself, thus avoiding the oft-discussed problems in
1527 bfd_perform_relocation and bfd_install_relocation. */
1529 bfd_reloc_status_type
1530 _bfd_mips_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
1531 asymbol *symbol, void *data ATTRIBUTE_UNUSED,
1532 asection *input_section, bfd *output_bfd,
1533 char **error_message ATTRIBUTE_UNUSED)
1535 bfd_signed_vma val;
1536 bfd_reloc_status_type status;
1537 bfd_boolean relocatable;
1539 relocatable = (output_bfd != NULL);
1541 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1542 return bfd_reloc_outofrange;
1544 /* Build up the field adjustment in VAL. */
1545 val = 0;
1546 if (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0)
1548 /* Either we're calculating the final field value or we have a
1549 relocation against a section symbol. Add in the section's
1550 offset or address. */
1551 val += symbol->section->output_section->vma;
1552 val += symbol->section->output_offset;
1555 if (!relocatable)
1557 /* We're calculating the final field value. Add in the symbol's value
1558 and, if pc-relative, subtract the address of the field itself. */
1559 val += symbol->value;
1560 if (reloc_entry->howto->pc_relative)
1562 val -= input_section->output_section->vma;
1563 val -= input_section->output_offset;
1564 val -= reloc_entry->address;
1568 /* VAL is now the final adjustment. If we're keeping this relocation
1569 in the output file, and if the relocation uses a separate addend,
1570 we just need to add VAL to that addend. Otherwise we need to add
1571 VAL to the relocation field itself. */
1572 if (relocatable && !reloc_entry->howto->partial_inplace)
1573 reloc_entry->addend += val;
1574 else
1576 bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
1578 /* Add in the separate addend, if any. */
1579 val += reloc_entry->addend;
1581 /* Add VAL to the relocation field. */
1582 _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
1583 location);
1584 status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
1585 location);
1586 _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, FALSE,
1587 location);
1589 if (status != bfd_reloc_ok)
1590 return status;
1593 if (relocatable)
1594 reloc_entry->address += input_section->output_offset;
1596 return bfd_reloc_ok;
1599 /* Swap an entry in a .gptab section. Note that these routines rely
1600 on the equivalence of the two elements of the union. */
1602 static void
1603 bfd_mips_elf32_swap_gptab_in (bfd *abfd, const Elf32_External_gptab *ex,
1604 Elf32_gptab *in)
1606 in->gt_entry.gt_g_value = H_GET_32 (abfd, ex->gt_entry.gt_g_value);
1607 in->gt_entry.gt_bytes = H_GET_32 (abfd, ex->gt_entry.gt_bytes);
1610 static void
1611 bfd_mips_elf32_swap_gptab_out (bfd *abfd, const Elf32_gptab *in,
1612 Elf32_External_gptab *ex)
1614 H_PUT_32 (abfd, in->gt_entry.gt_g_value, ex->gt_entry.gt_g_value);
1615 H_PUT_32 (abfd, in->gt_entry.gt_bytes, ex->gt_entry.gt_bytes);
1618 static void
1619 bfd_elf32_swap_compact_rel_out (bfd *abfd, const Elf32_compact_rel *in,
1620 Elf32_External_compact_rel *ex)
1622 H_PUT_32 (abfd, in->id1, ex->id1);
1623 H_PUT_32 (abfd, in->num, ex->num);
1624 H_PUT_32 (abfd, in->id2, ex->id2);
1625 H_PUT_32 (abfd, in->offset, ex->offset);
1626 H_PUT_32 (abfd, in->reserved0, ex->reserved0);
1627 H_PUT_32 (abfd, in->reserved1, ex->reserved1);
1630 static void
1631 bfd_elf32_swap_crinfo_out (bfd *abfd, const Elf32_crinfo *in,
1632 Elf32_External_crinfo *ex)
1634 unsigned long l;
1636 l = (((in->ctype & CRINFO_CTYPE) << CRINFO_CTYPE_SH)
1637 | ((in->rtype & CRINFO_RTYPE) << CRINFO_RTYPE_SH)
1638 | ((in->dist2to & CRINFO_DIST2TO) << CRINFO_DIST2TO_SH)
1639 | ((in->relvaddr & CRINFO_RELVADDR) << CRINFO_RELVADDR_SH));
1640 H_PUT_32 (abfd, l, ex->info);
1641 H_PUT_32 (abfd, in->konst, ex->konst);
1642 H_PUT_32 (abfd, in->vaddr, ex->vaddr);
1645 /* A .reginfo section holds a single Elf32_RegInfo structure. These
1646 routines swap this structure in and out. They are used outside of
1647 BFD, so they are globally visible. */
1649 void
1650 bfd_mips_elf32_swap_reginfo_in (bfd *abfd, const Elf32_External_RegInfo *ex,
1651 Elf32_RegInfo *in)
1653 in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
1654 in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
1655 in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
1656 in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
1657 in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
1658 in->ri_gp_value = H_GET_32 (abfd, ex->ri_gp_value);
1661 void
1662 bfd_mips_elf32_swap_reginfo_out (bfd *abfd, const Elf32_RegInfo *in,
1663 Elf32_External_RegInfo *ex)
1665 H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
1666 H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
1667 H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
1668 H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
1669 H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
1670 H_PUT_32 (abfd, in->ri_gp_value, ex->ri_gp_value);
1673 /* In the 64 bit ABI, the .MIPS.options section holds register
1674 information in an Elf64_Reginfo structure. These routines swap
1675 them in and out. They are globally visible because they are used
1676 outside of BFD. These routines are here so that gas can call them
1677 without worrying about whether the 64 bit ABI has been included. */
1679 void
1680 bfd_mips_elf64_swap_reginfo_in (bfd *abfd, const Elf64_External_RegInfo *ex,
1681 Elf64_Internal_RegInfo *in)
1683 in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
1684 in->ri_pad = H_GET_32 (abfd, ex->ri_pad);
1685 in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
1686 in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
1687 in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
1688 in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
1689 in->ri_gp_value = H_GET_64 (abfd, ex->ri_gp_value);
1692 void
1693 bfd_mips_elf64_swap_reginfo_out (bfd *abfd, const Elf64_Internal_RegInfo *in,
1694 Elf64_External_RegInfo *ex)
1696 H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
1697 H_PUT_32 (abfd, in->ri_pad, ex->ri_pad);
1698 H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
1699 H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
1700 H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
1701 H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
1702 H_PUT_64 (abfd, in->ri_gp_value, ex->ri_gp_value);
1705 /* Swap in an options header. */
1707 void
1708 bfd_mips_elf_swap_options_in (bfd *abfd, const Elf_External_Options *ex,
1709 Elf_Internal_Options *in)
1711 in->kind = H_GET_8 (abfd, ex->kind);
1712 in->size = H_GET_8 (abfd, ex->size);
1713 in->section = H_GET_16 (abfd, ex->section);
1714 in->info = H_GET_32 (abfd, ex->info);
1717 /* Swap out an options header. */
1719 void
1720 bfd_mips_elf_swap_options_out (bfd *abfd, const Elf_Internal_Options *in,
1721 Elf_External_Options *ex)
1723 H_PUT_8 (abfd, in->kind, ex->kind);
1724 H_PUT_8 (abfd, in->size, ex->size);
1725 H_PUT_16 (abfd, in->section, ex->section);
1726 H_PUT_32 (abfd, in->info, ex->info);
1729 /* This function is called via qsort() to sort the dynamic relocation
1730 entries by increasing r_symndx value. */
1732 static int
1733 sort_dynamic_relocs (const void *arg1, const void *arg2)
1735 Elf_Internal_Rela int_reloc1;
1736 Elf_Internal_Rela int_reloc2;
1737 int diff;
1739 bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg1, &int_reloc1);
1740 bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg2, &int_reloc2);
1742 diff = ELF32_R_SYM (int_reloc1.r_info) - ELF32_R_SYM (int_reloc2.r_info);
1743 if (diff != 0)
1744 return diff;
1746 if (int_reloc1.r_offset < int_reloc2.r_offset)
1747 return -1;
1748 if (int_reloc1.r_offset > int_reloc2.r_offset)
1749 return 1;
1750 return 0;
1753 /* Like sort_dynamic_relocs, but used for elf64 relocations. */
1755 static int
1756 sort_dynamic_relocs_64 (const void *arg1 ATTRIBUTE_UNUSED,
1757 const void *arg2 ATTRIBUTE_UNUSED)
1759 #ifdef BFD64
1760 Elf_Internal_Rela int_reloc1[3];
1761 Elf_Internal_Rela int_reloc2[3];
1763 (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
1764 (reldyn_sorting_bfd, arg1, int_reloc1);
1765 (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
1766 (reldyn_sorting_bfd, arg2, int_reloc2);
1768 if (ELF64_R_SYM (int_reloc1[0].r_info) < ELF64_R_SYM (int_reloc2[0].r_info))
1769 return -1;
1770 if (ELF64_R_SYM (int_reloc1[0].r_info) > ELF64_R_SYM (int_reloc2[0].r_info))
1771 return 1;
1773 if (int_reloc1[0].r_offset < int_reloc2[0].r_offset)
1774 return -1;
1775 if (int_reloc1[0].r_offset > int_reloc2[0].r_offset)
1776 return 1;
1777 return 0;
1778 #else
1779 abort ();
1780 #endif
1784 /* This routine is used to write out ECOFF debugging external symbol
1785 information. It is called via mips_elf_link_hash_traverse. The
1786 ECOFF external symbol information must match the ELF external
1787 symbol information. Unfortunately, at this point we don't know
1788 whether a symbol is required by reloc information, so the two
1789 tables may wind up being different. We must sort out the external
1790 symbol information before we can set the final size of the .mdebug
1791 section, and we must set the size of the .mdebug section before we
1792 can relocate any sections, and we can't know which symbols are
1793 required by relocation until we relocate the sections.
1794 Fortunately, it is relatively unlikely that any symbol will be
1795 stripped but required by a reloc. In particular, it can not happen
1796 when generating a final executable. */
1798 static bfd_boolean
1799 mips_elf_output_extsym (struct mips_elf_link_hash_entry *h, void *data)
1801 struct extsym_info *einfo = data;
1802 bfd_boolean strip;
1803 asection *sec, *output_section;
1805 if (h->root.root.type == bfd_link_hash_warning)
1806 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
1808 if (h->root.indx == -2)
1809 strip = FALSE;
1810 else if ((h->root.def_dynamic
1811 || h->root.ref_dynamic
1812 || h->root.type == bfd_link_hash_new)
1813 && !h->root.def_regular
1814 && !h->root.ref_regular)
1815 strip = TRUE;
1816 else if (einfo->info->strip == strip_all
1817 || (einfo->info->strip == strip_some
1818 && bfd_hash_lookup (einfo->info->keep_hash,
1819 h->root.root.root.string,
1820 FALSE, FALSE) == NULL))
1821 strip = TRUE;
1822 else
1823 strip = FALSE;
1825 if (strip)
1826 return TRUE;
1828 if (h->esym.ifd == -2)
1830 h->esym.jmptbl = 0;
1831 h->esym.cobol_main = 0;
1832 h->esym.weakext = 0;
1833 h->esym.reserved = 0;
1834 h->esym.ifd = ifdNil;
1835 h->esym.asym.value = 0;
1836 h->esym.asym.st = stGlobal;
1838 if (h->root.root.type == bfd_link_hash_undefined
1839 || h->root.root.type == bfd_link_hash_undefweak)
1841 const char *name;
1843 /* Use undefined class. Also, set class and type for some
1844 special symbols. */
1845 name = h->root.root.root.string;
1846 if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
1847 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
1849 h->esym.asym.sc = scData;
1850 h->esym.asym.st = stLabel;
1851 h->esym.asym.value = 0;
1853 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
1855 h->esym.asym.sc = scAbs;
1856 h->esym.asym.st = stLabel;
1857 h->esym.asym.value =
1858 mips_elf_hash_table (einfo->info)->procedure_count;
1860 else if (strcmp (name, "_gp_disp") == 0 && ! NEWABI_P (einfo->abfd))
1862 h->esym.asym.sc = scAbs;
1863 h->esym.asym.st = stLabel;
1864 h->esym.asym.value = elf_gp (einfo->abfd);
1866 else
1867 h->esym.asym.sc = scUndefined;
1869 else if (h->root.root.type != bfd_link_hash_defined
1870 && h->root.root.type != bfd_link_hash_defweak)
1871 h->esym.asym.sc = scAbs;
1872 else
1874 const char *name;
1876 sec = h->root.root.u.def.section;
1877 output_section = sec->output_section;
1879 /* When making a shared library and symbol h is the one from
1880 the another shared library, OUTPUT_SECTION may be null. */
1881 if (output_section == NULL)
1882 h->esym.asym.sc = scUndefined;
1883 else
1885 name = bfd_section_name (output_section->owner, output_section);
1887 if (strcmp (name, ".text") == 0)
1888 h->esym.asym.sc = scText;
1889 else if (strcmp (name, ".data") == 0)
1890 h->esym.asym.sc = scData;
1891 else if (strcmp (name, ".sdata") == 0)
1892 h->esym.asym.sc = scSData;
1893 else if (strcmp (name, ".rodata") == 0
1894 || strcmp (name, ".rdata") == 0)
1895 h->esym.asym.sc = scRData;
1896 else if (strcmp (name, ".bss") == 0)
1897 h->esym.asym.sc = scBss;
1898 else if (strcmp (name, ".sbss") == 0)
1899 h->esym.asym.sc = scSBss;
1900 else if (strcmp (name, ".init") == 0)
1901 h->esym.asym.sc = scInit;
1902 else if (strcmp (name, ".fini") == 0)
1903 h->esym.asym.sc = scFini;
1904 else
1905 h->esym.asym.sc = scAbs;
1909 h->esym.asym.reserved = 0;
1910 h->esym.asym.index = indexNil;
1913 if (h->root.root.type == bfd_link_hash_common)
1914 h->esym.asym.value = h->root.root.u.c.size;
1915 else if (h->root.root.type == bfd_link_hash_defined
1916 || h->root.root.type == bfd_link_hash_defweak)
1918 if (h->esym.asym.sc == scCommon)
1919 h->esym.asym.sc = scBss;
1920 else if (h->esym.asym.sc == scSCommon)
1921 h->esym.asym.sc = scSBss;
1923 sec = h->root.root.u.def.section;
1924 output_section = sec->output_section;
1925 if (output_section != NULL)
1926 h->esym.asym.value = (h->root.root.u.def.value
1927 + sec->output_offset
1928 + output_section->vma);
1929 else
1930 h->esym.asym.value = 0;
1932 else if (h->root.needs_plt)
1934 struct mips_elf_link_hash_entry *hd = h;
1935 bfd_boolean no_fn_stub = h->no_fn_stub;
1937 while (hd->root.root.type == bfd_link_hash_indirect)
1939 hd = (struct mips_elf_link_hash_entry *)h->root.root.u.i.link;
1940 no_fn_stub = no_fn_stub || hd->no_fn_stub;
1943 if (!no_fn_stub)
1945 /* Set type and value for a symbol with a function stub. */
1946 h->esym.asym.st = stProc;
1947 sec = hd->root.root.u.def.section;
1948 if (sec == NULL)
1949 h->esym.asym.value = 0;
1950 else
1952 output_section = sec->output_section;
1953 if (output_section != NULL)
1954 h->esym.asym.value = (hd->root.plt.offset
1955 + sec->output_offset
1956 + output_section->vma);
1957 else
1958 h->esym.asym.value = 0;
1963 if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
1964 h->root.root.root.string,
1965 &h->esym))
1967 einfo->failed = TRUE;
1968 return FALSE;
1971 return TRUE;
1974 /* A comparison routine used to sort .gptab entries. */
1976 static int
1977 gptab_compare (const void *p1, const void *p2)
1979 const Elf32_gptab *a1 = p1;
1980 const Elf32_gptab *a2 = p2;
1982 return a1->gt_entry.gt_g_value - a2->gt_entry.gt_g_value;
1985 /* Functions to manage the got entry hash table. */
1987 /* Use all 64 bits of a bfd_vma for the computation of a 32-bit
1988 hash number. */
1990 static INLINE hashval_t
1991 mips_elf_hash_bfd_vma (bfd_vma addr)
1993 #ifdef BFD64
1994 return addr + (addr >> 32);
1995 #else
1996 return addr;
1997 #endif
2000 /* got_entries only match if they're identical, except for gotidx, so
2001 use all fields to compute the hash, and compare the appropriate
2002 union members. */
2004 static hashval_t
2005 mips_elf_got_entry_hash (const void *entry_)
2007 const struct mips_got_entry *entry = (struct mips_got_entry *)entry_;
2009 return entry->symndx
2010 + ((entry->tls_type & GOT_TLS_LDM) << 17)
2011 + (! entry->abfd ? mips_elf_hash_bfd_vma (entry->d.address)
2012 : entry->abfd->id
2013 + (entry->symndx >= 0 ? mips_elf_hash_bfd_vma (entry->d.addend)
2014 : entry->d.h->root.root.root.hash));
2017 static int
2018 mips_elf_got_entry_eq (const void *entry1, const void *entry2)
2020 const struct mips_got_entry *e1 = (struct mips_got_entry *)entry1;
2021 const struct mips_got_entry *e2 = (struct mips_got_entry *)entry2;
2023 /* An LDM entry can only match another LDM entry. */
2024 if ((e1->tls_type ^ e2->tls_type) & GOT_TLS_LDM)
2025 return 0;
2027 return e1->abfd == e2->abfd && e1->symndx == e2->symndx
2028 && (! e1->abfd ? e1->d.address == e2->d.address
2029 : e1->symndx >= 0 ? e1->d.addend == e2->d.addend
2030 : e1->d.h == e2->d.h);
2033 /* multi_got_entries are still a match in the case of global objects,
2034 even if the input bfd in which they're referenced differs, so the
2035 hash computation and compare functions are adjusted
2036 accordingly. */
2038 static hashval_t
2039 mips_elf_multi_got_entry_hash (const void *entry_)
2041 const struct mips_got_entry *entry = (struct mips_got_entry *)entry_;
2043 return entry->symndx
2044 + (! entry->abfd
2045 ? mips_elf_hash_bfd_vma (entry->d.address)
2046 : entry->symndx >= 0
2047 ? ((entry->tls_type & GOT_TLS_LDM)
2048 ? (GOT_TLS_LDM << 17)
2049 : (entry->abfd->id
2050 + mips_elf_hash_bfd_vma (entry->d.addend)))
2051 : entry->d.h->root.root.root.hash);
2054 static int
2055 mips_elf_multi_got_entry_eq (const void *entry1, const void *entry2)
2057 const struct mips_got_entry *e1 = (struct mips_got_entry *)entry1;
2058 const struct mips_got_entry *e2 = (struct mips_got_entry *)entry2;
2060 /* Any two LDM entries match. */
2061 if (e1->tls_type & e2->tls_type & GOT_TLS_LDM)
2062 return 1;
2064 /* Nothing else matches an LDM entry. */
2065 if ((e1->tls_type ^ e2->tls_type) & GOT_TLS_LDM)
2066 return 0;
2068 return e1->symndx == e2->symndx
2069 && (e1->symndx >= 0 ? e1->abfd == e2->abfd && e1->d.addend == e2->d.addend
2070 : e1->abfd == NULL || e2->abfd == NULL
2071 ? e1->abfd == e2->abfd && e1->d.address == e2->d.address
2072 : e1->d.h == e2->d.h);
2075 static hashval_t
2076 mips_got_page_entry_hash (const void *entry_)
2078 const struct mips_got_page_entry *entry;
2080 entry = (const struct mips_got_page_entry *) entry_;
2081 return entry->abfd->id + entry->symndx;
2084 static int
2085 mips_got_page_entry_eq (const void *entry1_, const void *entry2_)
2087 const struct mips_got_page_entry *entry1, *entry2;
2089 entry1 = (const struct mips_got_page_entry *) entry1_;
2090 entry2 = (const struct mips_got_page_entry *) entry2_;
2091 return entry1->abfd == entry2->abfd && entry1->symndx == entry2->symndx;
2094 /* Return the dynamic relocation section. If it doesn't exist, try to
2095 create a new it if CREATE_P, otherwise return NULL. Also return NULL
2096 if creation fails. */
2098 static asection *
2099 mips_elf_rel_dyn_section (struct bfd_link_info *info, bfd_boolean create_p)
2101 const char *dname;
2102 asection *sreloc;
2103 bfd *dynobj;
2105 dname = MIPS_ELF_REL_DYN_NAME (info);
2106 dynobj = elf_hash_table (info)->dynobj;
2107 sreloc = bfd_get_section_by_name (dynobj, dname);
2108 if (sreloc == NULL && create_p)
2110 sreloc = bfd_make_section_with_flags (dynobj, dname,
2111 (SEC_ALLOC
2112 | SEC_LOAD
2113 | SEC_HAS_CONTENTS
2114 | SEC_IN_MEMORY
2115 | SEC_LINKER_CREATED
2116 | SEC_READONLY));
2117 if (sreloc == NULL
2118 || ! bfd_set_section_alignment (dynobj, sreloc,
2119 MIPS_ELF_LOG_FILE_ALIGN (dynobj)))
2120 return NULL;
2122 return sreloc;
2125 /* Returns the GOT section for ABFD. */
2127 static asection *
2128 mips_elf_got_section (bfd *abfd, bfd_boolean maybe_excluded)
2130 asection *sgot = bfd_get_section_by_name (abfd, ".got");
2131 if (sgot == NULL
2132 || (! maybe_excluded && (sgot->flags & SEC_EXCLUDE) != 0))
2133 return NULL;
2134 return sgot;
2137 /* Returns the GOT information associated with the link indicated by
2138 INFO. If SGOTP is non-NULL, it is filled in with the GOT
2139 section. */
2141 static struct mips_got_info *
2142 mips_elf_got_info (bfd *abfd, asection **sgotp)
2144 asection *sgot;
2145 struct mips_got_info *g;
2147 sgot = mips_elf_got_section (abfd, TRUE);
2148 BFD_ASSERT (sgot != NULL);
2149 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
2150 g = mips_elf_section_data (sgot)->u.got_info;
2151 BFD_ASSERT (g != NULL);
2153 if (sgotp)
2154 *sgotp = (sgot->flags & SEC_EXCLUDE) == 0 ? sgot : NULL;
2156 return g;
2159 /* Count the number of relocations needed for a TLS GOT entry, with
2160 access types from TLS_TYPE, and symbol H (or a local symbol if H
2161 is NULL). */
2163 static int
2164 mips_tls_got_relocs (struct bfd_link_info *info, unsigned char tls_type,
2165 struct elf_link_hash_entry *h)
2167 int indx = 0;
2168 int ret = 0;
2169 bfd_boolean need_relocs = FALSE;
2170 bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
2172 if (h && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2173 && (!info->shared || !SYMBOL_REFERENCES_LOCAL (info, h)))
2174 indx = h->dynindx;
2176 if ((info->shared || indx != 0)
2177 && (h == NULL
2178 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2179 || h->root.type != bfd_link_hash_undefweak))
2180 need_relocs = TRUE;
2182 if (!need_relocs)
2183 return FALSE;
2185 if (tls_type & GOT_TLS_GD)
2187 ret++;
2188 if (indx != 0)
2189 ret++;
2192 if (tls_type & GOT_TLS_IE)
2193 ret++;
2195 if ((tls_type & GOT_TLS_LDM) && info->shared)
2196 ret++;
2198 return ret;
2201 /* Count the number of TLS relocations required for the GOT entry in
2202 ARG1, if it describes a local symbol. */
2204 static int
2205 mips_elf_count_local_tls_relocs (void **arg1, void *arg2)
2207 struct mips_got_entry *entry = * (struct mips_got_entry **) arg1;
2208 struct mips_elf_count_tls_arg *arg = arg2;
2210 if (entry->abfd != NULL && entry->symndx != -1)
2211 arg->needed += mips_tls_got_relocs (arg->info, entry->tls_type, NULL);
2213 return 1;
2216 /* Count the number of TLS GOT entries required for the global (or
2217 forced-local) symbol in ARG1. */
2219 static int
2220 mips_elf_count_global_tls_entries (void *arg1, void *arg2)
2222 struct mips_elf_link_hash_entry *hm
2223 = (struct mips_elf_link_hash_entry *) arg1;
2224 struct mips_elf_count_tls_arg *arg = arg2;
2226 if (hm->tls_type & GOT_TLS_GD)
2227 arg->needed += 2;
2228 if (hm->tls_type & GOT_TLS_IE)
2229 arg->needed += 1;
2231 return 1;
2234 /* Count the number of TLS relocations required for the global (or
2235 forced-local) symbol in ARG1. */
2237 static int
2238 mips_elf_count_global_tls_relocs (void *arg1, void *arg2)
2240 struct mips_elf_link_hash_entry *hm
2241 = (struct mips_elf_link_hash_entry *) arg1;
2242 struct mips_elf_count_tls_arg *arg = arg2;
2244 arg->needed += mips_tls_got_relocs (arg->info, hm->tls_type, &hm->root);
2246 return 1;
2249 /* Output a simple dynamic relocation into SRELOC. */
2251 static void
2252 mips_elf_output_dynamic_relocation (bfd *output_bfd,
2253 asection *sreloc,
2254 unsigned long indx,
2255 int r_type,
2256 bfd_vma offset)
2258 Elf_Internal_Rela rel[3];
2260 memset (rel, 0, sizeof (rel));
2262 rel[0].r_info = ELF_R_INFO (output_bfd, indx, r_type);
2263 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
2265 if (ABI_64_P (output_bfd))
2267 (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
2268 (output_bfd, &rel[0],
2269 (sreloc->contents
2270 + sreloc->reloc_count * sizeof (Elf64_Mips_External_Rel)));
2272 else
2273 bfd_elf32_swap_reloc_out
2274 (output_bfd, &rel[0],
2275 (sreloc->contents
2276 + sreloc->reloc_count * sizeof (Elf32_External_Rel)));
2277 ++sreloc->reloc_count;
2280 /* Initialize a set of TLS GOT entries for one symbol. */
2282 static void
2283 mips_elf_initialize_tls_slots (bfd *abfd, bfd_vma got_offset,
2284 unsigned char *tls_type_p,
2285 struct bfd_link_info *info,
2286 struct mips_elf_link_hash_entry *h,
2287 bfd_vma value)
2289 int indx;
2290 asection *sreloc, *sgot;
2291 bfd_vma offset, offset2;
2292 bfd *dynobj;
2293 bfd_boolean need_relocs = FALSE;
2295 dynobj = elf_hash_table (info)->dynobj;
2296 sgot = mips_elf_got_section (dynobj, FALSE);
2298 indx = 0;
2299 if (h != NULL)
2301 bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
2303 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, &h->root)
2304 && (!info->shared || !SYMBOL_REFERENCES_LOCAL (info, &h->root)))
2305 indx = h->root.dynindx;
2308 if (*tls_type_p & GOT_TLS_DONE)
2309 return;
2311 if ((info->shared || indx != 0)
2312 && (h == NULL
2313 || ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT
2314 || h->root.type != bfd_link_hash_undefweak))
2315 need_relocs = TRUE;
2317 /* MINUS_ONE means the symbol is not defined in this object. It may not
2318 be defined at all; assume that the value doesn't matter in that
2319 case. Otherwise complain if we would use the value. */
2320 BFD_ASSERT (value != MINUS_ONE || (indx != 0 && need_relocs)
2321 || h->root.root.type == bfd_link_hash_undefweak);
2323 /* Emit necessary relocations. */
2324 sreloc = mips_elf_rel_dyn_section (info, FALSE);
2326 /* General Dynamic. */
2327 if (*tls_type_p & GOT_TLS_GD)
2329 offset = got_offset;
2330 offset2 = offset + MIPS_ELF_GOT_SIZE (abfd);
2332 if (need_relocs)
2334 mips_elf_output_dynamic_relocation
2335 (abfd, sreloc, indx,
2336 ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
2337 sgot->output_offset + sgot->output_section->vma + offset);
2339 if (indx)
2340 mips_elf_output_dynamic_relocation
2341 (abfd, sreloc, indx,
2342 ABI_64_P (abfd) ? R_MIPS_TLS_DTPREL64 : R_MIPS_TLS_DTPREL32,
2343 sgot->output_offset + sgot->output_section->vma + offset2);
2344 else
2345 MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
2346 sgot->contents + offset2);
2348 else
2350 MIPS_ELF_PUT_WORD (abfd, 1,
2351 sgot->contents + offset);
2352 MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
2353 sgot->contents + offset2);
2356 got_offset += 2 * MIPS_ELF_GOT_SIZE (abfd);
2359 /* Initial Exec model. */
2360 if (*tls_type_p & GOT_TLS_IE)
2362 offset = got_offset;
2364 if (need_relocs)
2366 if (indx == 0)
2367 MIPS_ELF_PUT_WORD (abfd, value - elf_hash_table (info)->tls_sec->vma,
2368 sgot->contents + offset);
2369 else
2370 MIPS_ELF_PUT_WORD (abfd, 0,
2371 sgot->contents + offset);
2373 mips_elf_output_dynamic_relocation
2374 (abfd, sreloc, indx,
2375 ABI_64_P (abfd) ? R_MIPS_TLS_TPREL64 : R_MIPS_TLS_TPREL32,
2376 sgot->output_offset + sgot->output_section->vma + offset);
2378 else
2379 MIPS_ELF_PUT_WORD (abfd, value - tprel_base (info),
2380 sgot->contents + offset);
2383 if (*tls_type_p & GOT_TLS_LDM)
2385 /* The initial offset is zero, and the LD offsets will include the
2386 bias by DTP_OFFSET. */
2387 MIPS_ELF_PUT_WORD (abfd, 0,
2388 sgot->contents + got_offset
2389 + MIPS_ELF_GOT_SIZE (abfd));
2391 if (!info->shared)
2392 MIPS_ELF_PUT_WORD (abfd, 1,
2393 sgot->contents + got_offset);
2394 else
2395 mips_elf_output_dynamic_relocation
2396 (abfd, sreloc, indx,
2397 ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
2398 sgot->output_offset + sgot->output_section->vma + got_offset);
2401 *tls_type_p |= GOT_TLS_DONE;
2404 /* Return the GOT index to use for a relocation of type R_TYPE against
2405 a symbol accessed using TLS_TYPE models. The GOT entries for this
2406 symbol in this GOT start at GOT_INDEX. This function initializes the
2407 GOT entries and corresponding relocations. */
2409 static bfd_vma
2410 mips_tls_got_index (bfd *abfd, bfd_vma got_index, unsigned char *tls_type,
2411 int r_type, struct bfd_link_info *info,
2412 struct mips_elf_link_hash_entry *h, bfd_vma symbol)
2414 BFD_ASSERT (r_type == R_MIPS_TLS_GOTTPREL || r_type == R_MIPS_TLS_GD
2415 || r_type == R_MIPS_TLS_LDM);
2417 mips_elf_initialize_tls_slots (abfd, got_index, tls_type, info, h, symbol);
2419 if (r_type == R_MIPS_TLS_GOTTPREL)
2421 BFD_ASSERT (*tls_type & GOT_TLS_IE);
2422 if (*tls_type & GOT_TLS_GD)
2423 return got_index + 2 * MIPS_ELF_GOT_SIZE (abfd);
2424 else
2425 return got_index;
2428 if (r_type == R_MIPS_TLS_GD)
2430 BFD_ASSERT (*tls_type & GOT_TLS_GD);
2431 return got_index;
2434 if (r_type == R_MIPS_TLS_LDM)
2436 BFD_ASSERT (*tls_type & GOT_TLS_LDM);
2437 return got_index;
2440 return got_index;
2443 /* Return the offset from _GLOBAL_OFFSET_TABLE_ of the .got.plt entry
2444 for global symbol H. .got.plt comes before the GOT, so the offset
2445 will be negative. */
2447 static bfd_vma
2448 mips_elf_gotplt_index (struct bfd_link_info *info,
2449 struct elf_link_hash_entry *h)
2451 bfd_vma plt_index, got_address, got_value;
2452 struct mips_elf_link_hash_table *htab;
2454 htab = mips_elf_hash_table (info);
2455 BFD_ASSERT (h->plt.offset != (bfd_vma) -1);
2457 /* Calculate the index of the symbol's PLT entry. */
2458 plt_index = (h->plt.offset - htab->plt_header_size) / htab->plt_entry_size;
2460 /* Calculate the address of the associated .got.plt entry. */
2461 got_address = (htab->sgotplt->output_section->vma
2462 + htab->sgotplt->output_offset
2463 + plt_index * 4);
2465 /* Calculate the value of _GLOBAL_OFFSET_TABLE_. */
2466 got_value = (htab->root.hgot->root.u.def.section->output_section->vma
2467 + htab->root.hgot->root.u.def.section->output_offset
2468 + htab->root.hgot->root.u.def.value);
2470 return got_address - got_value;
2473 /* Return the GOT offset for address VALUE. If there is not yet a GOT
2474 entry for this value, create one. If R_SYMNDX refers to a TLS symbol,
2475 create a TLS GOT entry instead. Return -1 if no satisfactory GOT
2476 offset can be found. */
2478 static bfd_vma
2479 mips_elf_local_got_index (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
2480 bfd_vma value, unsigned long r_symndx,
2481 struct mips_elf_link_hash_entry *h, int r_type)
2483 asection *sgot;
2484 struct mips_got_info *g;
2485 struct mips_got_entry *entry;
2487 g = mips_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
2489 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, g, sgot,
2490 value, r_symndx, h, r_type);
2491 if (!entry)
2492 return MINUS_ONE;
2494 if (TLS_RELOC_P (r_type))
2496 if (entry->symndx == -1 && g->next == NULL)
2497 /* A type (3) entry in the single-GOT case. We use the symbol's
2498 hash table entry to track the index. */
2499 return mips_tls_got_index (abfd, h->tls_got_offset, &h->tls_type,
2500 r_type, info, h, value);
2501 else
2502 return mips_tls_got_index (abfd, entry->gotidx, &entry->tls_type,
2503 r_type, info, h, value);
2505 else
2506 return entry->gotidx;
2509 /* Returns the GOT index for the global symbol indicated by H. */
2511 static bfd_vma
2512 mips_elf_global_got_index (bfd *abfd, bfd *ibfd, struct elf_link_hash_entry *h,
2513 int r_type, struct bfd_link_info *info)
2515 bfd_vma index;
2516 asection *sgot;
2517 struct mips_got_info *g, *gg;
2518 long global_got_dynindx = 0;
2520 gg = g = mips_elf_got_info (abfd, &sgot);
2521 if (g->bfd2got && ibfd)
2523 struct mips_got_entry e, *p;
2525 BFD_ASSERT (h->dynindx >= 0);
2527 g = mips_elf_got_for_ibfd (g, ibfd);
2528 if (g->next != gg || TLS_RELOC_P (r_type))
2530 e.abfd = ibfd;
2531 e.symndx = -1;
2532 e.d.h = (struct mips_elf_link_hash_entry *)h;
2533 e.tls_type = 0;
2535 p = htab_find (g->got_entries, &e);
2537 BFD_ASSERT (p->gotidx > 0);
2539 if (TLS_RELOC_P (r_type))
2541 bfd_vma value = MINUS_ONE;
2542 if ((h->root.type == bfd_link_hash_defined
2543 || h->root.type == bfd_link_hash_defweak)
2544 && h->root.u.def.section->output_section)
2545 value = (h->root.u.def.value
2546 + h->root.u.def.section->output_offset
2547 + h->root.u.def.section->output_section->vma);
2549 return mips_tls_got_index (abfd, p->gotidx, &p->tls_type, r_type,
2550 info, e.d.h, value);
2552 else
2553 return p->gotidx;
2557 if (gg->global_gotsym != NULL)
2558 global_got_dynindx = gg->global_gotsym->dynindx;
2560 if (TLS_RELOC_P (r_type))
2562 struct mips_elf_link_hash_entry *hm
2563 = (struct mips_elf_link_hash_entry *) h;
2564 bfd_vma value = MINUS_ONE;
2566 if ((h->root.type == bfd_link_hash_defined
2567 || h->root.type == bfd_link_hash_defweak)
2568 && h->root.u.def.section->output_section)
2569 value = (h->root.u.def.value
2570 + h->root.u.def.section->output_offset
2571 + h->root.u.def.section->output_section->vma);
2573 index = mips_tls_got_index (abfd, hm->tls_got_offset, &hm->tls_type,
2574 r_type, info, hm, value);
2576 else
2578 /* Once we determine the global GOT entry with the lowest dynamic
2579 symbol table index, we must put all dynamic symbols with greater
2580 indices into the GOT. That makes it easy to calculate the GOT
2581 offset. */
2582 BFD_ASSERT (h->dynindx >= global_got_dynindx);
2583 index = ((h->dynindx - global_got_dynindx + g->local_gotno)
2584 * MIPS_ELF_GOT_SIZE (abfd));
2586 BFD_ASSERT (index < sgot->size);
2588 return index;
2591 /* Find a GOT page entry that points to within 32KB of VALUE. These
2592 entries are supposed to be placed at small offsets in the GOT, i.e.,
2593 within 32KB of GP. Return the index of the GOT entry, or -1 if no
2594 entry could be created. If OFFSETP is nonnull, use it to return the
2595 offset of the GOT entry from VALUE. */
2597 static bfd_vma
2598 mips_elf_got_page (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
2599 bfd_vma value, bfd_vma *offsetp)
2601 asection *sgot;
2602 struct mips_got_info *g;
2603 bfd_vma page, index;
2604 struct mips_got_entry *entry;
2606 g = mips_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
2608 page = (value + 0x8000) & ~(bfd_vma) 0xffff;
2609 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, g, sgot,
2610 page, 0, NULL, R_MIPS_GOT_PAGE);
2612 if (!entry)
2613 return MINUS_ONE;
2615 index = entry->gotidx;
2617 if (offsetp)
2618 *offsetp = value - entry->d.address;
2620 return index;
2623 /* Find a local GOT entry for an R_MIPS_GOT16 relocation against VALUE.
2624 EXTERNAL is true if the relocation was against a global symbol
2625 that has been forced local. */
2627 static bfd_vma
2628 mips_elf_got16_entry (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
2629 bfd_vma value, bfd_boolean external)
2631 asection *sgot;
2632 struct mips_got_info *g;
2633 struct mips_got_entry *entry;
2635 /* GOT16 relocations against local symbols are followed by a LO16
2636 relocation; those against global symbols are not. Thus if the
2637 symbol was originally local, the GOT16 relocation should load the
2638 equivalent of %hi(VALUE), otherwise it should load VALUE itself. */
2639 if (! external)
2640 value = mips_elf_high (value) << 16;
2642 g = mips_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
2644 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, g, sgot,
2645 value, 0, NULL, R_MIPS_GOT16);
2646 if (entry)
2647 return entry->gotidx;
2648 else
2649 return MINUS_ONE;
2652 /* Returns the offset for the entry at the INDEXth position
2653 in the GOT. */
2655 static bfd_vma
2656 mips_elf_got_offset_from_index (bfd *dynobj, bfd *output_bfd,
2657 bfd *input_bfd, bfd_vma index)
2659 asection *sgot;
2660 bfd_vma gp;
2661 struct mips_got_info *g;
2663 g = mips_elf_got_info (dynobj, &sgot);
2664 gp = _bfd_get_gp_value (output_bfd)
2665 + mips_elf_adjust_gp (output_bfd, g, input_bfd);
2667 return sgot->output_section->vma + sgot->output_offset + index - gp;
2670 /* Create and return a local GOT entry for VALUE, which was calculated
2671 from a symbol belonging to INPUT_SECTON. Return NULL if it could not
2672 be created. If R_SYMNDX refers to a TLS symbol, create a TLS entry
2673 instead. */
2675 static struct mips_got_entry *
2676 mips_elf_create_local_got_entry (bfd *abfd, struct bfd_link_info *info,
2677 bfd *ibfd, struct mips_got_info *gg,
2678 asection *sgot, bfd_vma value,
2679 unsigned long r_symndx,
2680 struct mips_elf_link_hash_entry *h,
2681 int r_type)
2683 struct mips_got_entry entry, **loc;
2684 struct mips_got_info *g;
2685 struct mips_elf_link_hash_table *htab;
2687 htab = mips_elf_hash_table (info);
2689 entry.abfd = NULL;
2690 entry.symndx = -1;
2691 entry.d.address = value;
2692 entry.tls_type = 0;
2694 g = mips_elf_got_for_ibfd (gg, ibfd);
2695 if (g == NULL)
2697 g = mips_elf_got_for_ibfd (gg, abfd);
2698 BFD_ASSERT (g != NULL);
2701 /* We might have a symbol, H, if it has been forced local. Use the
2702 global entry then. It doesn't matter whether an entry is local
2703 or global for TLS, since the dynamic linker does not
2704 automatically relocate TLS GOT entries. */
2705 BFD_ASSERT (h == NULL || h->root.forced_local);
2706 if (TLS_RELOC_P (r_type))
2708 struct mips_got_entry *p;
2710 entry.abfd = ibfd;
2711 if (r_type == R_MIPS_TLS_LDM)
2713 entry.tls_type = GOT_TLS_LDM;
2714 entry.symndx = 0;
2715 entry.d.addend = 0;
2717 else if (h == NULL)
2719 entry.symndx = r_symndx;
2720 entry.d.addend = 0;
2722 else
2723 entry.d.h = h;
2725 p = (struct mips_got_entry *)
2726 htab_find (g->got_entries, &entry);
2728 BFD_ASSERT (p);
2729 return p;
2732 loc = (struct mips_got_entry **) htab_find_slot (g->got_entries, &entry,
2733 INSERT);
2734 if (*loc)
2735 return *loc;
2737 entry.gotidx = MIPS_ELF_GOT_SIZE (abfd) * g->assigned_gotno++;
2738 entry.tls_type = 0;
2740 *loc = (struct mips_got_entry *)bfd_alloc (abfd, sizeof entry);
2742 if (! *loc)
2743 return NULL;
2745 memcpy (*loc, &entry, sizeof entry);
2747 if (g->assigned_gotno > g->local_gotno)
2749 (*loc)->gotidx = -1;
2750 /* We didn't allocate enough space in the GOT. */
2751 (*_bfd_error_handler)
2752 (_("not enough GOT space for local GOT entries"));
2753 bfd_set_error (bfd_error_bad_value);
2754 return NULL;
2757 MIPS_ELF_PUT_WORD (abfd, value,
2758 (sgot->contents + entry.gotidx));
2760 /* These GOT entries need a dynamic relocation on VxWorks. */
2761 if (htab->is_vxworks)
2763 Elf_Internal_Rela outrel;
2764 asection *s;
2765 bfd_byte *loc;
2766 bfd_vma got_address;
2768 s = mips_elf_rel_dyn_section (info, FALSE);
2769 got_address = (sgot->output_section->vma
2770 + sgot->output_offset
2771 + entry.gotidx);
2773 loc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
2774 outrel.r_offset = got_address;
2775 outrel.r_info = ELF32_R_INFO (STN_UNDEF, R_MIPS_32);
2776 outrel.r_addend = value;
2777 bfd_elf32_swap_reloca_out (abfd, &outrel, loc);
2780 return *loc;
2783 /* Sort the dynamic symbol table so that symbols that need GOT entries
2784 appear towards the end. This reduces the amount of GOT space
2785 required. MAX_LOCAL is used to set the number of local symbols
2786 known to be in the dynamic symbol table. During
2787 _bfd_mips_elf_size_dynamic_sections, this value is 1. Afterward, the
2788 section symbols are added and the count is higher. */
2790 static bfd_boolean
2791 mips_elf_sort_hash_table (struct bfd_link_info *info, unsigned long max_local)
2793 struct mips_elf_hash_sort_data hsd;
2794 struct mips_got_info *g;
2795 bfd *dynobj;
2797 dynobj = elf_hash_table (info)->dynobj;
2799 g = mips_elf_got_info (dynobj, NULL);
2801 hsd.low = NULL;
2802 hsd.max_unref_got_dynindx =
2803 hsd.min_got_dynindx = elf_hash_table (info)->dynsymcount
2804 /* In the multi-got case, assigned_gotno of the master got_info
2805 indicate the number of entries that aren't referenced in the
2806 primary GOT, but that must have entries because there are
2807 dynamic relocations that reference it. Since they aren't
2808 referenced, we move them to the end of the GOT, so that they
2809 don't prevent other entries that are referenced from getting
2810 too large offsets. */
2811 - (g->next ? g->assigned_gotno : 0);
2812 hsd.max_non_got_dynindx = max_local;
2813 mips_elf_link_hash_traverse (((struct mips_elf_link_hash_table *)
2814 elf_hash_table (info)),
2815 mips_elf_sort_hash_table_f,
2816 &hsd);
2818 /* There should have been enough room in the symbol table to
2819 accommodate both the GOT and non-GOT symbols. */
2820 BFD_ASSERT (hsd.max_non_got_dynindx <= hsd.min_got_dynindx);
2821 BFD_ASSERT ((unsigned long)hsd.max_unref_got_dynindx
2822 <= elf_hash_table (info)->dynsymcount);
2824 /* Now we know which dynamic symbol has the lowest dynamic symbol
2825 table index in the GOT. */
2826 g->global_gotsym = hsd.low;
2828 return TRUE;
2831 /* If H needs a GOT entry, assign it the highest available dynamic
2832 index. Otherwise, assign it the lowest available dynamic
2833 index. */
2835 static bfd_boolean
2836 mips_elf_sort_hash_table_f (struct mips_elf_link_hash_entry *h, void *data)
2838 struct mips_elf_hash_sort_data *hsd = data;
2840 if (h->root.root.type == bfd_link_hash_warning)
2841 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
2843 /* Symbols without dynamic symbol table entries aren't interesting
2844 at all. */
2845 if (h->root.dynindx == -1)
2846 return TRUE;
2848 /* Global symbols that need GOT entries that are not explicitly
2849 referenced are marked with got offset 2. Those that are
2850 referenced get a 1, and those that don't need GOT entries get
2851 -1. Forced local symbols may also be marked with got offset 1,
2852 but are never given global GOT entries. */
2853 if (h->root.got.offset == 2)
2855 BFD_ASSERT (h->tls_type == GOT_NORMAL);
2857 if (hsd->max_unref_got_dynindx == hsd->min_got_dynindx)
2858 hsd->low = (struct elf_link_hash_entry *) h;
2859 h->root.dynindx = hsd->max_unref_got_dynindx++;
2861 else if (h->root.got.offset != 1 || h->forced_local)
2862 h->root.dynindx = hsd->max_non_got_dynindx++;
2863 else
2865 BFD_ASSERT (h->tls_type == GOT_NORMAL);
2867 h->root.dynindx = --hsd->min_got_dynindx;
2868 hsd->low = (struct elf_link_hash_entry *) h;
2871 return TRUE;
2874 /* If H is a symbol that needs a global GOT entry, but has a dynamic
2875 symbol table index lower than any we've seen to date, record it for
2876 posterity. */
2878 static bfd_boolean
2879 mips_elf_record_global_got_symbol (struct elf_link_hash_entry *h,
2880 bfd *abfd, struct bfd_link_info *info,
2881 struct mips_got_info *g,
2882 unsigned char tls_flag)
2884 struct mips_got_entry entry, **loc;
2886 /* A global symbol in the GOT must also be in the dynamic symbol
2887 table. */
2888 if (h->dynindx == -1)
2890 switch (ELF_ST_VISIBILITY (h->other))
2892 case STV_INTERNAL:
2893 case STV_HIDDEN:
2894 _bfd_mips_elf_hide_symbol (info, h, TRUE);
2895 break;
2897 if (!bfd_elf_link_record_dynamic_symbol (info, h))
2898 return FALSE;
2901 /* Make sure we have a GOT to put this entry into. */
2902 BFD_ASSERT (g != NULL);
2904 entry.abfd = abfd;
2905 entry.symndx = -1;
2906 entry.d.h = (struct mips_elf_link_hash_entry *) h;
2907 entry.tls_type = 0;
2909 loc = (struct mips_got_entry **) htab_find_slot (g->got_entries, &entry,
2910 INSERT);
2912 /* If we've already marked this entry as needing GOT space, we don't
2913 need to do it again. */
2914 if (*loc)
2916 (*loc)->tls_type |= tls_flag;
2917 return TRUE;
2920 *loc = (struct mips_got_entry *)bfd_alloc (abfd, sizeof entry);
2922 if (! *loc)
2923 return FALSE;
2925 entry.gotidx = -1;
2926 entry.tls_type = tls_flag;
2928 memcpy (*loc, &entry, sizeof entry);
2930 if (h->got.offset != MINUS_ONE)
2931 return TRUE;
2933 if (tls_flag == 0)
2935 /* By setting this to a value other than -1, we are indicating that
2936 there needs to be a GOT entry for H. Avoid using zero, as the
2937 generic ELF copy_indirect_symbol tests for <= 0. */
2938 h->got.offset = 1;
2939 if (h->forced_local)
2940 g->local_gotno++;
2943 return TRUE;
2946 /* Reserve space in G for a GOT entry containing the value of symbol
2947 SYMNDX in input bfd ABDF, plus ADDEND. */
2949 static bfd_boolean
2950 mips_elf_record_local_got_symbol (bfd *abfd, long symndx, bfd_vma addend,
2951 struct mips_got_info *g,
2952 unsigned char tls_flag)
2954 struct mips_got_entry entry, **loc;
2956 entry.abfd = abfd;
2957 entry.symndx = symndx;
2958 entry.d.addend = addend;
2959 entry.tls_type = tls_flag;
2960 loc = (struct mips_got_entry **)
2961 htab_find_slot (g->got_entries, &entry, INSERT);
2963 if (*loc)
2965 if (tls_flag == GOT_TLS_GD && !((*loc)->tls_type & GOT_TLS_GD))
2967 g->tls_gotno += 2;
2968 (*loc)->tls_type |= tls_flag;
2970 else if (tls_flag == GOT_TLS_IE && !((*loc)->tls_type & GOT_TLS_IE))
2972 g->tls_gotno += 1;
2973 (*loc)->tls_type |= tls_flag;
2975 return TRUE;
2978 if (tls_flag != 0)
2980 entry.gotidx = -1;
2981 entry.tls_type = tls_flag;
2982 if (tls_flag == GOT_TLS_IE)
2983 g->tls_gotno += 1;
2984 else if (tls_flag == GOT_TLS_GD)
2985 g->tls_gotno += 2;
2986 else if (g->tls_ldm_offset == MINUS_ONE)
2988 g->tls_ldm_offset = MINUS_TWO;
2989 g->tls_gotno += 2;
2992 else
2994 entry.gotidx = g->local_gotno++;
2995 entry.tls_type = 0;
2998 *loc = (struct mips_got_entry *)bfd_alloc (abfd, sizeof entry);
3000 if (! *loc)
3001 return FALSE;
3003 memcpy (*loc, &entry, sizeof entry);
3005 return TRUE;
3008 /* Return the maximum number of GOT page entries required for RANGE. */
3010 static bfd_vma
3011 mips_elf_pages_for_range (const struct mips_got_page_range *range)
3013 return (range->max_addend - range->min_addend + 0x1ffff) >> 16;
3016 /* Record that ABFD has a page relocation against symbol SYMNDX and
3017 that ADDEND is the addend for that relocation. G is the GOT
3018 information. This function creates an upper bound on the number of
3019 GOT slots required; no attempt is made to combine references to
3020 non-overridable global symbols across multiple input files. */
3022 static bfd_boolean
3023 mips_elf_record_got_page_entry (bfd *abfd, long symndx, bfd_signed_vma addend,
3024 struct mips_got_info *g)
3026 struct mips_got_page_entry lookup, *entry;
3027 struct mips_got_page_range **range_ptr, *range;
3028 bfd_vma old_pages, new_pages;
3029 void **loc;
3031 /* Find the mips_got_page_entry hash table entry for this symbol. */
3032 lookup.abfd = abfd;
3033 lookup.symndx = symndx;
3034 loc = htab_find_slot (g->got_page_entries, &lookup, INSERT);
3035 if (loc == NULL)
3036 return FALSE;
3038 /* Create a mips_got_page_entry if this is the first time we've
3039 seen the symbol. */
3040 entry = (struct mips_got_page_entry *) *loc;
3041 if (!entry)
3043 entry = bfd_alloc (abfd, sizeof (*entry));
3044 if (!entry)
3045 return FALSE;
3047 entry->abfd = abfd;
3048 entry->symndx = symndx;
3049 entry->ranges = NULL;
3050 entry->num_pages = 0;
3051 *loc = entry;
3054 /* Skip over ranges whose maximum extent cannot share a page entry
3055 with ADDEND. */
3056 range_ptr = &entry->ranges;
3057 while (*range_ptr && addend > (*range_ptr)->max_addend + 0xffff)
3058 range_ptr = &(*range_ptr)->next;
3060 /* If we scanned to the end of the list, or found a range whose
3061 minimum extent cannot share a page entry with ADDEND, create
3062 a new singleton range. */
3063 range = *range_ptr;
3064 if (!range || addend < range->min_addend - 0xffff)
3066 range = bfd_alloc (abfd, sizeof (*range));
3067 if (!range)
3068 return FALSE;
3070 range->next = *range_ptr;
3071 range->min_addend = addend;
3072 range->max_addend = addend;
3074 *range_ptr = range;
3075 entry->num_pages++;
3076 g->page_gotno++;
3077 return TRUE;
3080 /* Remember how many pages the old range contributed. */
3081 old_pages = mips_elf_pages_for_range (range);
3083 /* Update the ranges. */
3084 if (addend < range->min_addend)
3085 range->min_addend = addend;
3086 else if (addend > range->max_addend)
3088 if (range->next && addend >= range->next->min_addend - 0xffff)
3090 old_pages += mips_elf_pages_for_range (range->next);
3091 range->max_addend = range->next->max_addend;
3092 range->next = range->next->next;
3094 else
3095 range->max_addend = addend;
3098 /* Record any change in the total estimate. */
3099 new_pages = mips_elf_pages_for_range (range);
3100 if (old_pages != new_pages)
3102 entry->num_pages += new_pages - old_pages;
3103 g->page_gotno += new_pages - old_pages;
3106 return TRUE;
3109 /* Compute the hash value of the bfd in a bfd2got hash entry. */
3111 static hashval_t
3112 mips_elf_bfd2got_entry_hash (const void *entry_)
3114 const struct mips_elf_bfd2got_hash *entry
3115 = (struct mips_elf_bfd2got_hash *)entry_;
3117 return entry->bfd->id;
3120 /* Check whether two hash entries have the same bfd. */
3122 static int
3123 mips_elf_bfd2got_entry_eq (const void *entry1, const void *entry2)
3125 const struct mips_elf_bfd2got_hash *e1
3126 = (const struct mips_elf_bfd2got_hash *)entry1;
3127 const struct mips_elf_bfd2got_hash *e2
3128 = (const struct mips_elf_bfd2got_hash *)entry2;
3130 return e1->bfd == e2->bfd;
3133 /* In a multi-got link, determine the GOT to be used for IBFD. G must
3134 be the master GOT data. */
3136 static struct mips_got_info *
3137 mips_elf_got_for_ibfd (struct mips_got_info *g, bfd *ibfd)
3139 struct mips_elf_bfd2got_hash e, *p;
3141 if (! g->bfd2got)
3142 return g;
3144 e.bfd = ibfd;
3145 p = htab_find (g->bfd2got, &e);
3146 return p ? p->g : NULL;
3149 /* Use BFD2GOT to find ABFD's got entry, creating one if none exists.
3150 Return NULL if an error occured. */
3152 static struct mips_got_info *
3153 mips_elf_get_got_for_bfd (struct htab *bfd2got, bfd *output_bfd,
3154 bfd *input_bfd)
3156 struct mips_elf_bfd2got_hash bfdgot_entry, *bfdgot;
3157 struct mips_got_info *g;
3158 void **bfdgotp;
3160 bfdgot_entry.bfd = input_bfd;
3161 bfdgotp = htab_find_slot (bfd2got, &bfdgot_entry, INSERT);
3162 bfdgot = (struct mips_elf_bfd2got_hash *) *bfdgotp;
3164 if (bfdgot == NULL)
3166 bfdgot = ((struct mips_elf_bfd2got_hash *)
3167 bfd_alloc (output_bfd, sizeof (struct mips_elf_bfd2got_hash)));
3168 if (bfdgot == NULL)
3169 return NULL;
3171 *bfdgotp = bfdgot;
3173 g = ((struct mips_got_info *)
3174 bfd_alloc (output_bfd, sizeof (struct mips_got_info)));
3175 if (g == NULL)
3176 return NULL;
3178 bfdgot->bfd = input_bfd;
3179 bfdgot->g = g;
3181 g->global_gotsym = NULL;
3182 g->global_gotno = 0;
3183 g->local_gotno = 0;
3184 g->page_gotno = 0;
3185 g->assigned_gotno = -1;
3186 g->tls_gotno = 0;
3187 g->tls_assigned_gotno = 0;
3188 g->tls_ldm_offset = MINUS_ONE;
3189 g->got_entries = htab_try_create (1, mips_elf_multi_got_entry_hash,
3190 mips_elf_multi_got_entry_eq, NULL);
3191 if (g->got_entries == NULL)
3192 return NULL;
3194 g->got_page_entries = htab_try_create (1, mips_got_page_entry_hash,
3195 mips_got_page_entry_eq, NULL);
3196 if (g->got_page_entries == NULL)
3197 return NULL;
3199 g->bfd2got = NULL;
3200 g->next = NULL;
3203 return bfdgot->g;
3206 /* A htab_traverse callback for the entries in the master got.
3207 Create one separate got for each bfd that has entries in the global
3208 got, such that we can tell how many local and global entries each
3209 bfd requires. */
3211 static int
3212 mips_elf_make_got_per_bfd (void **entryp, void *p)
3214 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
3215 struct mips_elf_got_per_bfd_arg *arg = (struct mips_elf_got_per_bfd_arg *)p;
3216 struct mips_got_info *g;
3218 g = mips_elf_get_got_for_bfd (arg->bfd2got, arg->obfd, entry->abfd);
3219 if (g == NULL)
3221 arg->obfd = NULL;
3222 return 0;
3225 /* Insert the GOT entry in the bfd's got entry hash table. */
3226 entryp = htab_find_slot (g->got_entries, entry, INSERT);
3227 if (*entryp != NULL)
3228 return 1;
3230 *entryp = entry;
3232 if (entry->tls_type)
3234 if (entry->tls_type & (GOT_TLS_GD | GOT_TLS_LDM))
3235 g->tls_gotno += 2;
3236 if (entry->tls_type & GOT_TLS_IE)
3237 g->tls_gotno += 1;
3239 else if (entry->symndx >= 0 || entry->d.h->forced_local)
3240 ++g->local_gotno;
3241 else
3242 ++g->global_gotno;
3244 return 1;
3247 /* A htab_traverse callback for the page entries in the master got.
3248 Associate each page entry with the bfd's got. */
3250 static int
3251 mips_elf_make_got_pages_per_bfd (void **entryp, void *p)
3253 struct mips_got_page_entry *entry = (struct mips_got_page_entry *) *entryp;
3254 struct mips_elf_got_per_bfd_arg *arg = (struct mips_elf_got_per_bfd_arg *) p;
3255 struct mips_got_info *g;
3257 g = mips_elf_get_got_for_bfd (arg->bfd2got, arg->obfd, entry->abfd);
3258 if (g == NULL)
3260 arg->obfd = NULL;
3261 return 0;
3264 /* Insert the GOT entry in the bfd's got entry hash table. */
3265 entryp = htab_find_slot (g->got_page_entries, entry, INSERT);
3266 if (*entryp != NULL)
3267 return 1;
3269 *entryp = entry;
3270 g->page_gotno += entry->num_pages;
3271 return 1;
3274 /* Consider merging the got described by BFD2GOT with TO, using the
3275 information given by ARG. Return -1 if this would lead to overflow,
3276 1 if they were merged successfully, and 0 if a merge failed due to
3277 lack of memory. (These values are chosen so that nonnegative return
3278 values can be returned by a htab_traverse callback.) */
3280 static int
3281 mips_elf_merge_got_with (struct mips_elf_bfd2got_hash *bfd2got,
3282 struct mips_got_info *to,
3283 struct mips_elf_got_per_bfd_arg *arg)
3285 struct mips_got_info *from = bfd2got->g;
3286 unsigned int estimate;
3288 /* Work out how many page entries we would need for the combined GOT. */
3289 estimate = arg->max_pages;
3290 if (estimate >= from->page_gotno + to->page_gotno)
3291 estimate = from->page_gotno + to->page_gotno;
3293 /* And conservatively estimate how many local, global and TLS entries
3294 would be needed. */
3295 estimate += (from->local_gotno
3296 + from->global_gotno
3297 + from->tls_gotno
3298 + to->local_gotno
3299 + to->global_gotno
3300 + to->tls_gotno);
3302 /* Bail out if the combined GOT might be too big. */
3303 if (estimate > arg->max_count)
3304 return -1;
3306 /* Commit to the merge. Record that TO is now the bfd for this got. */
3307 bfd2got->g = to;
3309 /* Transfer the bfd's got information from FROM to TO. */
3310 htab_traverse (from->got_entries, mips_elf_make_got_per_bfd, arg);
3311 if (arg->obfd == NULL)
3312 return 0;
3314 htab_traverse (from->got_page_entries, mips_elf_make_got_pages_per_bfd, arg);
3315 if (arg->obfd == NULL)
3316 return 0;
3318 /* We don't have to worry about releasing memory of the actual
3319 got entries, since they're all in the master got_entries hash
3320 table anyway. */
3321 htab_delete (from->got_entries);
3322 htab_delete (from->got_page_entries);
3323 return 1;
3326 /* Attempt to merge gots of different input bfds. Try to use as much
3327 as possible of the primary got, since it doesn't require explicit
3328 dynamic relocations, but don't use bfds that would reference global
3329 symbols out of the addressable range. Failing the primary got,
3330 attempt to merge with the current got, or finish the current got
3331 and then make make the new got current. */
3333 static int
3334 mips_elf_merge_gots (void **bfd2got_, void *p)
3336 struct mips_elf_bfd2got_hash *bfd2got
3337 = (struct mips_elf_bfd2got_hash *)*bfd2got_;
3338 struct mips_elf_got_per_bfd_arg *arg = (struct mips_elf_got_per_bfd_arg *)p;
3339 struct mips_got_info *g;
3340 unsigned int estimate;
3341 int result;
3343 g = bfd2got->g;
3345 /* Work out the number of page, local and TLS entries. */
3346 estimate = arg->max_pages;
3347 if (estimate > g->page_gotno)
3348 estimate = g->page_gotno;
3349 estimate += g->local_gotno + g->tls_gotno;
3351 /* We place TLS GOT entries after both locals and globals. The globals
3352 for the primary GOT may overflow the normal GOT size limit, so be
3353 sure not to merge a GOT which requires TLS with the primary GOT in that
3354 case. This doesn't affect non-primary GOTs. */
3355 estimate += (g->tls_gotno > 0 ? arg->global_count : g->global_gotno);
3357 if (estimate <= arg->max_count)
3359 /* If we don't have a primary GOT, use it as
3360 a starting point for the primary GOT. */
3361 if (!arg->primary)
3363 arg->primary = bfd2got->g;
3364 return 1;
3367 /* Try merging with the primary GOT. */
3368 result = mips_elf_merge_got_with (bfd2got, arg->primary, arg);
3369 if (result >= 0)
3370 return result;
3373 /* If we can merge with the last-created got, do it. */
3374 if (arg->current)
3376 result = mips_elf_merge_got_with (bfd2got, arg->current, arg);
3377 if (result >= 0)
3378 return result;
3381 /* Well, we couldn't merge, so create a new GOT. Don't check if it
3382 fits; if it turns out that it doesn't, we'll get relocation
3383 overflows anyway. */
3384 g->next = arg->current;
3385 arg->current = g;
3387 return 1;
3390 /* Set the TLS GOT index for the GOT entry in ENTRYP. ENTRYP's NEXT field
3391 is null iff there is just a single GOT. */
3393 static int
3394 mips_elf_initialize_tls_index (void **entryp, void *p)
3396 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
3397 struct mips_got_info *g = p;
3398 bfd_vma next_index;
3399 unsigned char tls_type;
3401 /* We're only interested in TLS symbols. */
3402 if (entry->tls_type == 0)
3403 return 1;
3405 next_index = MIPS_ELF_GOT_SIZE (entry->abfd) * (long) g->tls_assigned_gotno;
3407 if (entry->symndx == -1 && g->next == NULL)
3409 /* A type (3) got entry in the single-GOT case. We use the symbol's
3410 hash table entry to track its index. */
3411 if (entry->d.h->tls_type & GOT_TLS_OFFSET_DONE)
3412 return 1;
3413 entry->d.h->tls_type |= GOT_TLS_OFFSET_DONE;
3414 entry->d.h->tls_got_offset = next_index;
3415 tls_type = entry->d.h->tls_type;
3417 else
3419 if (entry->tls_type & GOT_TLS_LDM)
3421 /* There are separate mips_got_entry objects for each input bfd
3422 that requires an LDM entry. Make sure that all LDM entries in
3423 a GOT resolve to the same index. */
3424 if (g->tls_ldm_offset != MINUS_TWO && g->tls_ldm_offset != MINUS_ONE)
3426 entry->gotidx = g->tls_ldm_offset;
3427 return 1;
3429 g->tls_ldm_offset = next_index;
3431 entry->gotidx = next_index;
3432 tls_type = entry->tls_type;
3435 /* Account for the entries we've just allocated. */
3436 if (tls_type & (GOT_TLS_GD | GOT_TLS_LDM))
3437 g->tls_assigned_gotno += 2;
3438 if (tls_type & GOT_TLS_IE)
3439 g->tls_assigned_gotno += 1;
3441 return 1;
3444 /* If passed a NULL mips_got_info in the argument, set the marker used
3445 to tell whether a global symbol needs a got entry (in the primary
3446 got) to the given VALUE.
3448 If passed a pointer G to a mips_got_info in the argument (it must
3449 not be the primary GOT), compute the offset from the beginning of
3450 the (primary) GOT section to the entry in G corresponding to the
3451 global symbol. G's assigned_gotno must contain the index of the
3452 first available global GOT entry in G. VALUE must contain the size
3453 of a GOT entry in bytes. For each global GOT entry that requires a
3454 dynamic relocation, NEEDED_RELOCS is incremented, and the symbol is
3455 marked as not eligible for lazy resolution through a function
3456 stub. */
3457 static int
3458 mips_elf_set_global_got_offset (void **entryp, void *p)
3460 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
3461 struct mips_elf_set_global_got_offset_arg *arg
3462 = (struct mips_elf_set_global_got_offset_arg *)p;
3463 struct mips_got_info *g = arg->g;
3465 if (g && entry->tls_type != GOT_NORMAL)
3466 arg->needed_relocs +=
3467 mips_tls_got_relocs (arg->info, entry->tls_type,
3468 entry->symndx == -1 ? &entry->d.h->root : NULL);
3470 if (entry->abfd != NULL && entry->symndx == -1
3471 && entry->d.h->root.dynindx != -1
3472 && !entry->d.h->forced_local
3473 && entry->d.h->tls_type == GOT_NORMAL)
3475 if (g)
3477 BFD_ASSERT (g->global_gotsym == NULL);
3479 entry->gotidx = arg->value * (long) g->assigned_gotno++;
3480 if (arg->info->shared
3481 || (elf_hash_table (arg->info)->dynamic_sections_created
3482 && entry->d.h->root.def_dynamic
3483 && !entry->d.h->root.def_regular))
3484 ++arg->needed_relocs;
3486 else
3487 entry->d.h->root.got.offset = arg->value;
3490 return 1;
3493 /* Mark any global symbols referenced in the GOT we are iterating over
3494 as inelligible for lazy resolution stubs. */
3495 static int
3496 mips_elf_set_no_stub (void **entryp, void *p ATTRIBUTE_UNUSED)
3498 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
3500 if (entry->abfd != NULL
3501 && entry->symndx == -1
3502 && entry->d.h->root.dynindx != -1)
3503 entry->d.h->no_fn_stub = TRUE;
3505 return 1;
3508 /* Follow indirect and warning hash entries so that each got entry
3509 points to the final symbol definition. P must point to a pointer
3510 to the hash table we're traversing. Since this traversal may
3511 modify the hash table, we set this pointer to NULL to indicate
3512 we've made a potentially-destructive change to the hash table, so
3513 the traversal must be restarted. */
3514 static int
3515 mips_elf_resolve_final_got_entry (void **entryp, void *p)
3517 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
3518 htab_t got_entries = *(htab_t *)p;
3520 if (entry->abfd != NULL && entry->symndx == -1)
3522 struct mips_elf_link_hash_entry *h = entry->d.h;
3524 while (h->root.root.type == bfd_link_hash_indirect
3525 || h->root.root.type == bfd_link_hash_warning)
3526 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
3528 if (entry->d.h == h)
3529 return 1;
3531 entry->d.h = h;
3533 /* If we can't find this entry with the new bfd hash, re-insert
3534 it, and get the traversal restarted. */
3535 if (! htab_find (got_entries, entry))
3537 htab_clear_slot (got_entries, entryp);
3538 entryp = htab_find_slot (got_entries, entry, INSERT);
3539 if (! *entryp)
3540 *entryp = entry;
3541 /* Abort the traversal, since the whole table may have
3542 moved, and leave it up to the parent to restart the
3543 process. */
3544 *(htab_t *)p = NULL;
3545 return 0;
3547 /* We might want to decrement the global_gotno count, but it's
3548 either too early or too late for that at this point. */
3551 return 1;
3554 /* Turn indirect got entries in a got_entries table into their final
3555 locations. */
3556 static void
3557 mips_elf_resolve_final_got_entries (struct mips_got_info *g)
3559 htab_t got_entries;
3563 got_entries = g->got_entries;
3565 htab_traverse (got_entries,
3566 mips_elf_resolve_final_got_entry,
3567 &got_entries);
3569 while (got_entries == NULL);
3572 /* Return the offset of an input bfd IBFD's GOT from the beginning of
3573 the primary GOT. */
3574 static bfd_vma
3575 mips_elf_adjust_gp (bfd *abfd, struct mips_got_info *g, bfd *ibfd)
3577 if (g->bfd2got == NULL)
3578 return 0;
3580 g = mips_elf_got_for_ibfd (g, ibfd);
3581 if (! g)
3582 return 0;
3584 BFD_ASSERT (g->next);
3586 g = g->next;
3588 return (g->local_gotno + g->global_gotno + g->tls_gotno)
3589 * MIPS_ELF_GOT_SIZE (abfd);
3592 /* Turn a single GOT that is too big for 16-bit addressing into
3593 a sequence of GOTs, each one 16-bit addressable. */
3595 static bfd_boolean
3596 mips_elf_multi_got (bfd *abfd, struct bfd_link_info *info,
3597 struct mips_got_info *g, asection *got,
3598 bfd_size_type pages)
3600 struct mips_elf_got_per_bfd_arg got_per_bfd_arg;
3601 struct mips_elf_set_global_got_offset_arg set_got_offset_arg;
3602 struct mips_got_info *gg;
3603 unsigned int assign;
3605 g->bfd2got = htab_try_create (1, mips_elf_bfd2got_entry_hash,
3606 mips_elf_bfd2got_entry_eq, NULL);
3607 if (g->bfd2got == NULL)
3608 return FALSE;
3610 got_per_bfd_arg.bfd2got = g->bfd2got;
3611 got_per_bfd_arg.obfd = abfd;
3612 got_per_bfd_arg.info = info;
3614 /* Count how many GOT entries each input bfd requires, creating a
3615 map from bfd to got info while at that. */
3616 htab_traverse (g->got_entries, mips_elf_make_got_per_bfd, &got_per_bfd_arg);
3617 if (got_per_bfd_arg.obfd == NULL)
3618 return FALSE;
3620 /* Also count how many page entries each input bfd requires. */
3621 htab_traverse (g->got_page_entries, mips_elf_make_got_pages_per_bfd,
3622 &got_per_bfd_arg);
3623 if (got_per_bfd_arg.obfd == NULL)
3624 return FALSE;
3626 got_per_bfd_arg.current = NULL;
3627 got_per_bfd_arg.primary = NULL;
3628 got_per_bfd_arg.max_count = ((MIPS_ELF_GOT_MAX_SIZE (info)
3629 / MIPS_ELF_GOT_SIZE (abfd))
3630 - MIPS_RESERVED_GOTNO (info));
3631 got_per_bfd_arg.max_pages = pages;
3632 /* The number of globals that will be included in the primary GOT.
3633 See the calls to mips_elf_set_global_got_offset below for more
3634 information. */
3635 got_per_bfd_arg.global_count = g->global_gotno;
3637 /* Try to merge the GOTs of input bfds together, as long as they
3638 don't seem to exceed the maximum GOT size, choosing one of them
3639 to be the primary GOT. */
3640 htab_traverse (g->bfd2got, mips_elf_merge_gots, &got_per_bfd_arg);
3641 if (got_per_bfd_arg.obfd == NULL)
3642 return FALSE;
3644 /* If we do not find any suitable primary GOT, create an empty one. */
3645 if (got_per_bfd_arg.primary == NULL)
3647 g->next = (struct mips_got_info *)
3648 bfd_alloc (abfd, sizeof (struct mips_got_info));
3649 if (g->next == NULL)
3650 return FALSE;
3652 g->next->global_gotsym = NULL;
3653 g->next->global_gotno = 0;
3654 g->next->local_gotno = 0;
3655 g->next->page_gotno = 0;
3656 g->next->tls_gotno = 0;
3657 g->next->assigned_gotno = 0;
3658 g->next->tls_assigned_gotno = 0;
3659 g->next->tls_ldm_offset = MINUS_ONE;
3660 g->next->got_entries = htab_try_create (1, mips_elf_multi_got_entry_hash,
3661 mips_elf_multi_got_entry_eq,
3662 NULL);
3663 if (g->next->got_entries == NULL)
3664 return FALSE;
3665 g->next->got_page_entries = htab_try_create (1, mips_got_page_entry_hash,
3666 mips_got_page_entry_eq,
3667 NULL);
3668 if (g->next->got_page_entries == NULL)
3669 return FALSE;
3670 g->next->bfd2got = NULL;
3672 else
3673 g->next = got_per_bfd_arg.primary;
3674 g->next->next = got_per_bfd_arg.current;
3676 /* GG is now the master GOT, and G is the primary GOT. */
3677 gg = g;
3678 g = g->next;
3680 /* Map the output bfd to the primary got. That's what we're going
3681 to use for bfds that use GOT16 or GOT_PAGE relocations that we
3682 didn't mark in check_relocs, and we want a quick way to find it.
3683 We can't just use gg->next because we're going to reverse the
3684 list. */
3686 struct mips_elf_bfd2got_hash *bfdgot;
3687 void **bfdgotp;
3689 bfdgot = (struct mips_elf_bfd2got_hash *)bfd_alloc
3690 (abfd, sizeof (struct mips_elf_bfd2got_hash));
3692 if (bfdgot == NULL)
3693 return FALSE;
3695 bfdgot->bfd = abfd;
3696 bfdgot->g = g;
3697 bfdgotp = htab_find_slot (gg->bfd2got, bfdgot, INSERT);
3699 BFD_ASSERT (*bfdgotp == NULL);
3700 *bfdgotp = bfdgot;
3703 /* The IRIX dynamic linker requires every symbol that is referenced
3704 in a dynamic relocation to be present in the primary GOT, so
3705 arrange for them to appear after those that are actually
3706 referenced.
3708 GNU/Linux could very well do without it, but it would slow down
3709 the dynamic linker, since it would have to resolve every dynamic
3710 symbol referenced in other GOTs more than once, without help from
3711 the cache. Also, knowing that every external symbol has a GOT
3712 helps speed up the resolution of local symbols too, so GNU/Linux
3713 follows IRIX's practice.
3715 The number 2 is used by mips_elf_sort_hash_table_f to count
3716 global GOT symbols that are unreferenced in the primary GOT, with
3717 an initial dynamic index computed from gg->assigned_gotno, where
3718 the number of unreferenced global entries in the primary GOT is
3719 preserved. */
3720 if (1)
3722 gg->assigned_gotno = gg->global_gotno - g->global_gotno;
3723 g->global_gotno = gg->global_gotno;
3724 set_got_offset_arg.value = 2;
3726 else
3728 /* This could be used for dynamic linkers that don't optimize
3729 symbol resolution while applying relocations so as to use
3730 primary GOT entries or assuming the symbol is locally-defined.
3731 With this code, we assign lower dynamic indices to global
3732 symbols that are not referenced in the primary GOT, so that
3733 their entries can be omitted. */
3734 gg->assigned_gotno = 0;
3735 set_got_offset_arg.value = -1;
3738 /* Reorder dynamic symbols as described above (which behavior
3739 depends on the setting of VALUE). */
3740 set_got_offset_arg.g = NULL;
3741 htab_traverse (gg->got_entries, mips_elf_set_global_got_offset,
3742 &set_got_offset_arg);
3743 set_got_offset_arg.value = 1;
3744 htab_traverse (g->got_entries, mips_elf_set_global_got_offset,
3745 &set_got_offset_arg);
3746 if (! mips_elf_sort_hash_table (info, 1))
3747 return FALSE;
3749 /* Now go through the GOTs assigning them offset ranges.
3750 [assigned_gotno, local_gotno[ will be set to the range of local
3751 entries in each GOT. We can then compute the end of a GOT by
3752 adding local_gotno to global_gotno. We reverse the list and make
3753 it circular since then we'll be able to quickly compute the
3754 beginning of a GOT, by computing the end of its predecessor. To
3755 avoid special cases for the primary GOT, while still preserving
3756 assertions that are valid for both single- and multi-got links,
3757 we arrange for the main got struct to have the right number of
3758 global entries, but set its local_gotno such that the initial
3759 offset of the primary GOT is zero. Remember that the primary GOT
3760 will become the last item in the circular linked list, so it
3761 points back to the master GOT. */
3762 gg->local_gotno = -g->global_gotno;
3763 gg->global_gotno = g->global_gotno;
3764 gg->tls_gotno = 0;
3765 assign = 0;
3766 gg->next = gg;
3770 struct mips_got_info *gn;
3772 assign += MIPS_RESERVED_GOTNO (info);
3773 g->assigned_gotno = assign;
3774 g->local_gotno += assign;
3775 g->local_gotno += (pages < g->page_gotno ? pages : g->page_gotno);
3776 assign = g->local_gotno + g->global_gotno + g->tls_gotno;
3778 /* Take g out of the direct list, and push it onto the reversed
3779 list that gg points to. g->next is guaranteed to be nonnull after
3780 this operation, as required by mips_elf_initialize_tls_index. */
3781 gn = g->next;
3782 g->next = gg->next;
3783 gg->next = g;
3785 /* Set up any TLS entries. We always place the TLS entries after
3786 all non-TLS entries. */
3787 g->tls_assigned_gotno = g->local_gotno + g->global_gotno;
3788 htab_traverse (g->got_entries, mips_elf_initialize_tls_index, g);
3790 /* Move onto the next GOT. It will be a secondary GOT if nonull. */
3791 g = gn;
3793 /* Mark global symbols in every non-primary GOT as ineligible for
3794 stubs. */
3795 if (g)
3796 htab_traverse (g->got_entries, mips_elf_set_no_stub, NULL);
3798 while (g);
3800 got->size = (gg->next->local_gotno
3801 + gg->next->global_gotno
3802 + gg->next->tls_gotno) * MIPS_ELF_GOT_SIZE (abfd);
3804 return TRUE;
3808 /* Returns the first relocation of type r_type found, beginning with
3809 RELOCATION. RELEND is one-past-the-end of the relocation table. */
3811 static const Elf_Internal_Rela *
3812 mips_elf_next_relocation (bfd *abfd ATTRIBUTE_UNUSED, unsigned int r_type,
3813 const Elf_Internal_Rela *relocation,
3814 const Elf_Internal_Rela *relend)
3816 unsigned long r_symndx = ELF_R_SYM (abfd, relocation->r_info);
3818 while (relocation < relend)
3820 if (ELF_R_TYPE (abfd, relocation->r_info) == r_type
3821 && ELF_R_SYM (abfd, relocation->r_info) == r_symndx)
3822 return relocation;
3824 ++relocation;
3827 /* We didn't find it. */
3828 return NULL;
3831 /* Return whether a relocation is against a local symbol. */
3833 static bfd_boolean
3834 mips_elf_local_relocation_p (bfd *input_bfd,
3835 const Elf_Internal_Rela *relocation,
3836 asection **local_sections,
3837 bfd_boolean check_forced)
3839 unsigned long r_symndx;
3840 Elf_Internal_Shdr *symtab_hdr;
3841 struct mips_elf_link_hash_entry *h;
3842 size_t extsymoff;
3844 r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
3845 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3846 extsymoff = (elf_bad_symtab (input_bfd)) ? 0 : symtab_hdr->sh_info;
3848 if (r_symndx < extsymoff)
3849 return TRUE;
3850 if (elf_bad_symtab (input_bfd) && local_sections[r_symndx] != NULL)
3851 return TRUE;
3853 if (check_forced)
3855 /* Look up the hash table to check whether the symbol
3856 was forced local. */
3857 h = (struct mips_elf_link_hash_entry *)
3858 elf_sym_hashes (input_bfd) [r_symndx - extsymoff];
3859 /* Find the real hash-table entry for this symbol. */
3860 while (h->root.root.type == bfd_link_hash_indirect
3861 || h->root.root.type == bfd_link_hash_warning)
3862 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
3863 if (h->root.forced_local)
3864 return TRUE;
3867 return FALSE;
3870 /* Sign-extend VALUE, which has the indicated number of BITS. */
3872 bfd_vma
3873 _bfd_mips_elf_sign_extend (bfd_vma value, int bits)
3875 if (value & ((bfd_vma) 1 << (bits - 1)))
3876 /* VALUE is negative. */
3877 value |= ((bfd_vma) - 1) << bits;
3879 return value;
3882 /* Return non-zero if the indicated VALUE has overflowed the maximum
3883 range expressible by a signed number with the indicated number of
3884 BITS. */
3886 static bfd_boolean
3887 mips_elf_overflow_p (bfd_vma value, int bits)
3889 bfd_signed_vma svalue = (bfd_signed_vma) value;
3891 if (svalue > (1 << (bits - 1)) - 1)
3892 /* The value is too big. */
3893 return TRUE;
3894 else if (svalue < -(1 << (bits - 1)))
3895 /* The value is too small. */
3896 return TRUE;
3898 /* All is well. */
3899 return FALSE;
3902 /* Calculate the %high function. */
3904 static bfd_vma
3905 mips_elf_high (bfd_vma value)
3907 return ((value + (bfd_vma) 0x8000) >> 16) & 0xffff;
3910 /* Calculate the %higher function. */
3912 static bfd_vma
3913 mips_elf_higher (bfd_vma value ATTRIBUTE_UNUSED)
3915 #ifdef BFD64
3916 return ((value + (bfd_vma) 0x80008000) >> 32) & 0xffff;
3917 #else
3918 abort ();
3919 return MINUS_ONE;
3920 #endif
3923 /* Calculate the %highest function. */
3925 static bfd_vma
3926 mips_elf_highest (bfd_vma value ATTRIBUTE_UNUSED)
3928 #ifdef BFD64
3929 return ((value + (((bfd_vma) 0x8000 << 32) | 0x80008000)) >> 48) & 0xffff;
3930 #else
3931 abort ();
3932 return MINUS_ONE;
3933 #endif
3936 /* Create the .compact_rel section. */
3938 static bfd_boolean
3939 mips_elf_create_compact_rel_section
3940 (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
3942 flagword flags;
3943 register asection *s;
3945 if (bfd_get_section_by_name (abfd, ".compact_rel") == NULL)
3947 flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED
3948 | SEC_READONLY);
3950 s = bfd_make_section_with_flags (abfd, ".compact_rel", flags);
3951 if (s == NULL
3952 || ! bfd_set_section_alignment (abfd, s,
3953 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
3954 return FALSE;
3956 s->size = sizeof (Elf32_External_compact_rel);
3959 return TRUE;
3962 /* Create the .got section to hold the global offset table. */
3964 static bfd_boolean
3965 mips_elf_create_got_section (bfd *abfd, struct bfd_link_info *info,
3966 bfd_boolean maybe_exclude)
3968 flagword flags;
3969 register asection *s;
3970 struct elf_link_hash_entry *h;
3971 struct bfd_link_hash_entry *bh;
3972 struct mips_got_info *g;
3973 bfd_size_type amt;
3974 struct mips_elf_link_hash_table *htab;
3976 htab = mips_elf_hash_table (info);
3978 /* This function may be called more than once. */
3979 s = mips_elf_got_section (abfd, TRUE);
3980 if (s)
3982 if (! maybe_exclude)
3983 s->flags &= ~SEC_EXCLUDE;
3984 return TRUE;
3987 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3988 | SEC_LINKER_CREATED);
3990 if (maybe_exclude)
3991 flags |= SEC_EXCLUDE;
3993 /* We have to use an alignment of 2**4 here because this is hardcoded
3994 in the function stub generation and in the linker script. */
3995 s = bfd_make_section_with_flags (abfd, ".got", flags);
3996 if (s == NULL
3997 || ! bfd_set_section_alignment (abfd, s, 4))
3998 return FALSE;
4000 /* Define the symbol _GLOBAL_OFFSET_TABLE_. We don't do this in the
4001 linker script because we don't want to define the symbol if we
4002 are not creating a global offset table. */
4003 bh = NULL;
4004 if (! (_bfd_generic_link_add_one_symbol
4005 (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
4006 0, NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
4007 return FALSE;
4009 h = (struct elf_link_hash_entry *) bh;
4010 h->non_elf = 0;
4011 h->def_regular = 1;
4012 h->type = STT_OBJECT;
4013 elf_hash_table (info)->hgot = h;
4015 if (info->shared
4016 && ! bfd_elf_link_record_dynamic_symbol (info, h))
4017 return FALSE;
4019 amt = sizeof (struct mips_got_info);
4020 g = bfd_alloc (abfd, amt);
4021 if (g == NULL)
4022 return FALSE;
4023 g->global_gotsym = NULL;
4024 g->global_gotno = 0;
4025 g->tls_gotno = 0;
4026 g->local_gotno = MIPS_RESERVED_GOTNO (info);
4027 g->page_gotno = 0;
4028 g->assigned_gotno = MIPS_RESERVED_GOTNO (info);
4029 g->bfd2got = NULL;
4030 g->next = NULL;
4031 g->tls_ldm_offset = MINUS_ONE;
4032 g->got_entries = htab_try_create (1, mips_elf_got_entry_hash,
4033 mips_elf_got_entry_eq, NULL);
4034 if (g->got_entries == NULL)
4035 return FALSE;
4036 g->got_page_entries = htab_try_create (1, mips_got_page_entry_hash,
4037 mips_got_page_entry_eq, NULL);
4038 if (g->got_page_entries == NULL)
4039 return FALSE;
4040 mips_elf_section_data (s)->u.got_info = g;
4041 mips_elf_section_data (s)->elf.this_hdr.sh_flags
4042 |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
4044 /* VxWorks also needs a .got.plt section. */
4045 if (htab->is_vxworks)
4047 s = bfd_make_section_with_flags (abfd, ".got.plt",
4048 SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
4049 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4050 if (s == NULL || !bfd_set_section_alignment (abfd, s, 4))
4051 return FALSE;
4053 htab->sgotplt = s;
4055 return TRUE;
4058 /* Return true if H refers to the special VxWorks __GOTT_BASE__ or
4059 __GOTT_INDEX__ symbols. These symbols are only special for
4060 shared objects; they are not used in executables. */
4062 static bfd_boolean
4063 is_gott_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h)
4065 return (mips_elf_hash_table (info)->is_vxworks
4066 && info->shared
4067 && (strcmp (h->root.root.string, "__GOTT_BASE__") == 0
4068 || strcmp (h->root.root.string, "__GOTT_INDEX__") == 0));
4071 /* Calculate the value produced by the RELOCATION (which comes from
4072 the INPUT_BFD). The ADDEND is the addend to use for this
4073 RELOCATION; RELOCATION->R_ADDEND is ignored.
4075 The result of the relocation calculation is stored in VALUEP.
4076 REQUIRE_JALXP indicates whether or not the opcode used with this
4077 relocation must be JALX.
4079 This function returns bfd_reloc_continue if the caller need take no
4080 further action regarding this relocation, bfd_reloc_notsupported if
4081 something goes dramatically wrong, bfd_reloc_overflow if an
4082 overflow occurs, and bfd_reloc_ok to indicate success. */
4084 static bfd_reloc_status_type
4085 mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
4086 asection *input_section,
4087 struct bfd_link_info *info,
4088 const Elf_Internal_Rela *relocation,
4089 bfd_vma addend, reloc_howto_type *howto,
4090 Elf_Internal_Sym *local_syms,
4091 asection **local_sections, bfd_vma *valuep,
4092 const char **namep, bfd_boolean *require_jalxp,
4093 bfd_boolean save_addend)
4095 /* The eventual value we will return. */
4096 bfd_vma value;
4097 /* The address of the symbol against which the relocation is
4098 occurring. */
4099 bfd_vma symbol = 0;
4100 /* The final GP value to be used for the relocatable, executable, or
4101 shared object file being produced. */
4102 bfd_vma gp = MINUS_ONE;
4103 /* The place (section offset or address) of the storage unit being
4104 relocated. */
4105 bfd_vma p;
4106 /* The value of GP used to create the relocatable object. */
4107 bfd_vma gp0 = MINUS_ONE;
4108 /* The offset into the global offset table at which the address of
4109 the relocation entry symbol, adjusted by the addend, resides
4110 during execution. */
4111 bfd_vma g = MINUS_ONE;
4112 /* The section in which the symbol referenced by the relocation is
4113 located. */
4114 asection *sec = NULL;
4115 struct mips_elf_link_hash_entry *h = NULL;
4116 /* TRUE if the symbol referred to by this relocation is a local
4117 symbol. */
4118 bfd_boolean local_p, was_local_p;
4119 /* TRUE if the symbol referred to by this relocation is "_gp_disp". */
4120 bfd_boolean gp_disp_p = FALSE;
4121 /* TRUE if the symbol referred to by this relocation is
4122 "__gnu_local_gp". */
4123 bfd_boolean gnu_local_gp_p = FALSE;
4124 Elf_Internal_Shdr *symtab_hdr;
4125 size_t extsymoff;
4126 unsigned long r_symndx;
4127 int r_type;
4128 /* TRUE if overflow occurred during the calculation of the
4129 relocation value. */
4130 bfd_boolean overflowed_p;
4131 /* TRUE if this relocation refers to a MIPS16 function. */
4132 bfd_boolean target_is_16_bit_code_p = FALSE;
4133 struct mips_elf_link_hash_table *htab;
4134 bfd *dynobj;
4136 dynobj = elf_hash_table (info)->dynobj;
4137 htab = mips_elf_hash_table (info);
4139 /* Parse the relocation. */
4140 r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
4141 r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
4142 p = (input_section->output_section->vma
4143 + input_section->output_offset
4144 + relocation->r_offset);
4146 /* Assume that there will be no overflow. */
4147 overflowed_p = FALSE;
4149 /* Figure out whether or not the symbol is local, and get the offset
4150 used in the array of hash table entries. */
4151 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4152 local_p = mips_elf_local_relocation_p (input_bfd, relocation,
4153 local_sections, FALSE);
4154 was_local_p = local_p;
4155 if (! elf_bad_symtab (input_bfd))
4156 extsymoff = symtab_hdr->sh_info;
4157 else
4159 /* The symbol table does not follow the rule that local symbols
4160 must come before globals. */
4161 extsymoff = 0;
4164 /* Figure out the value of the symbol. */
4165 if (local_p)
4167 Elf_Internal_Sym *sym;
4169 sym = local_syms + r_symndx;
4170 sec = local_sections[r_symndx];
4172 symbol = sec->output_section->vma + sec->output_offset;
4173 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION
4174 || (sec->flags & SEC_MERGE))
4175 symbol += sym->st_value;
4176 if ((sec->flags & SEC_MERGE)
4177 && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4179 addend = _bfd_elf_rel_local_sym (abfd, sym, &sec, addend);
4180 addend -= symbol;
4181 addend += sec->output_section->vma + sec->output_offset;
4184 /* MIPS16 text labels should be treated as odd. */
4185 if (sym->st_other == STO_MIPS16)
4186 ++symbol;
4188 /* Record the name of this symbol, for our caller. */
4189 *namep = bfd_elf_string_from_elf_section (input_bfd,
4190 symtab_hdr->sh_link,
4191 sym->st_name);
4192 if (*namep == '\0')
4193 *namep = bfd_section_name (input_bfd, sec);
4195 target_is_16_bit_code_p = (sym->st_other == STO_MIPS16);
4197 else
4199 /* ??? Could we use RELOC_FOR_GLOBAL_SYMBOL here ? */
4201 /* For global symbols we look up the symbol in the hash-table. */
4202 h = ((struct mips_elf_link_hash_entry *)
4203 elf_sym_hashes (input_bfd) [r_symndx - extsymoff]);
4204 /* Find the real hash-table entry for this symbol. */
4205 while (h->root.root.type == bfd_link_hash_indirect
4206 || h->root.root.type == bfd_link_hash_warning)
4207 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
4209 /* Record the name of this symbol, for our caller. */
4210 *namep = h->root.root.root.string;
4212 /* See if this is the special _gp_disp symbol. Note that such a
4213 symbol must always be a global symbol. */
4214 if (strcmp (*namep, "_gp_disp") == 0
4215 && ! NEWABI_P (input_bfd))
4217 /* Relocations against _gp_disp are permitted only with
4218 R_MIPS_HI16 and R_MIPS_LO16 relocations. */
4219 if (r_type != R_MIPS_HI16 && r_type != R_MIPS_LO16
4220 && r_type != R_MIPS16_HI16 && r_type != R_MIPS16_LO16)
4221 return bfd_reloc_notsupported;
4223 gp_disp_p = TRUE;
4225 /* See if this is the special _gp symbol. Note that such a
4226 symbol must always be a global symbol. */
4227 else if (strcmp (*namep, "__gnu_local_gp") == 0)
4228 gnu_local_gp_p = TRUE;
4231 /* If this symbol is defined, calculate its address. Note that
4232 _gp_disp is a magic symbol, always implicitly defined by the
4233 linker, so it's inappropriate to check to see whether or not
4234 its defined. */
4235 else if ((h->root.root.type == bfd_link_hash_defined
4236 || h->root.root.type == bfd_link_hash_defweak)
4237 && h->root.root.u.def.section)
4239 sec = h->root.root.u.def.section;
4240 if (sec->output_section)
4241 symbol = (h->root.root.u.def.value
4242 + sec->output_section->vma
4243 + sec->output_offset);
4244 else
4245 symbol = h->root.root.u.def.value;
4247 else if (h->root.root.type == bfd_link_hash_undefweak)
4248 /* We allow relocations against undefined weak symbols, giving
4249 it the value zero, so that you can undefined weak functions
4250 and check to see if they exist by looking at their
4251 addresses. */
4252 symbol = 0;
4253 else if (info->unresolved_syms_in_objects == RM_IGNORE
4254 && ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
4255 symbol = 0;
4256 else if (strcmp (*namep, SGI_COMPAT (input_bfd)
4257 ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING") == 0)
4259 /* If this is a dynamic link, we should have created a
4260 _DYNAMIC_LINK symbol or _DYNAMIC_LINKING(for normal mips) symbol
4261 in in _bfd_mips_elf_create_dynamic_sections.
4262 Otherwise, we should define the symbol with a value of 0.
4263 FIXME: It should probably get into the symbol table
4264 somehow as well. */
4265 BFD_ASSERT (! info->shared);
4266 BFD_ASSERT (bfd_get_section_by_name (abfd, ".dynamic") == NULL);
4267 symbol = 0;
4269 else if (ELF_MIPS_IS_OPTIONAL (h->root.other))
4271 /* This is an optional symbol - an Irix specific extension to the
4272 ELF spec. Ignore it for now.
4273 XXX - FIXME - there is more to the spec for OPTIONAL symbols
4274 than simply ignoring them, but we do not handle this for now.
4275 For information see the "64-bit ELF Object File Specification"
4276 which is available from here:
4277 http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf */
4278 symbol = 0;
4280 else
4282 if (! ((*info->callbacks->undefined_symbol)
4283 (info, h->root.root.root.string, input_bfd,
4284 input_section, relocation->r_offset,
4285 (info->unresolved_syms_in_objects == RM_GENERATE_ERROR)
4286 || ELF_ST_VISIBILITY (h->root.other))))
4287 return bfd_reloc_undefined;
4288 symbol = 0;
4291 target_is_16_bit_code_p = (h->root.other == STO_MIPS16);
4294 /* If this is a 32- or 64-bit call to a 16-bit function with a stub, we
4295 need to redirect the call to the stub, unless we're already *in*
4296 a stub. */
4297 if (r_type != R_MIPS16_26 && !info->relocatable
4298 && ((h != NULL && h->fn_stub != NULL)
4299 || (local_p
4300 && elf_tdata (input_bfd)->local_stubs != NULL
4301 && elf_tdata (input_bfd)->local_stubs[r_symndx] != NULL))
4302 && !mips16_stub_section_p (input_bfd, input_section))
4304 /* This is a 32- or 64-bit call to a 16-bit function. We should
4305 have already noticed that we were going to need the
4306 stub. */
4307 if (local_p)
4308 sec = elf_tdata (input_bfd)->local_stubs[r_symndx];
4309 else
4311 BFD_ASSERT (h->need_fn_stub);
4312 sec = h->fn_stub;
4315 symbol = sec->output_section->vma + sec->output_offset;
4316 /* The target is 16-bit, but the stub isn't. */
4317 target_is_16_bit_code_p = FALSE;
4319 /* If this is a 16-bit call to a 32- or 64-bit function with a stub, we
4320 need to redirect the call to the stub. */
4321 else if (r_type == R_MIPS16_26 && !info->relocatable
4322 && ((h != NULL && (h->call_stub != NULL || h->call_fp_stub != NULL))
4323 || (local_p
4324 && elf_tdata (input_bfd)->local_call_stubs != NULL
4325 && elf_tdata (input_bfd)->local_call_stubs[r_symndx] != NULL))
4326 && !target_is_16_bit_code_p)
4328 if (local_p)
4329 sec = elf_tdata (input_bfd)->local_call_stubs[r_symndx];
4330 else
4332 /* If both call_stub and call_fp_stub are defined, we can figure
4333 out which one to use by checking which one appears in the input
4334 file. */
4335 if (h->call_stub != NULL && h->call_fp_stub != NULL)
4337 asection *o;
4339 sec = NULL;
4340 for (o = input_bfd->sections; o != NULL; o = o->next)
4342 if (CALL_FP_STUB_P (bfd_get_section_name (input_bfd, o)))
4344 sec = h->call_fp_stub;
4345 break;
4348 if (sec == NULL)
4349 sec = h->call_stub;
4351 else if (h->call_stub != NULL)
4352 sec = h->call_stub;
4353 else
4354 sec = h->call_fp_stub;
4357 BFD_ASSERT (sec->size > 0);
4358 symbol = sec->output_section->vma + sec->output_offset;
4361 /* Calls from 16-bit code to 32-bit code and vice versa require the
4362 special jalx instruction. */
4363 *require_jalxp = (!info->relocatable
4364 && (((r_type == R_MIPS16_26) && !target_is_16_bit_code_p)
4365 || ((r_type == R_MIPS_26) && target_is_16_bit_code_p)));
4367 local_p = mips_elf_local_relocation_p (input_bfd, relocation,
4368 local_sections, TRUE);
4370 /* If we haven't already determined the GOT offset, or the GP value,
4371 and we're going to need it, get it now. */
4372 switch (r_type)
4374 case R_MIPS_GOT_PAGE:
4375 case R_MIPS_GOT_OFST:
4376 /* We need to decay to GOT_DISP/addend if the symbol doesn't
4377 bind locally. */
4378 local_p = local_p || _bfd_elf_symbol_refs_local_p (&h->root, info, 1);
4379 if (local_p || r_type == R_MIPS_GOT_OFST)
4380 break;
4381 /* Fall through. */
4383 case R_MIPS_CALL16:
4384 case R_MIPS_GOT16:
4385 case R_MIPS_GOT_DISP:
4386 case R_MIPS_GOT_HI16:
4387 case R_MIPS_CALL_HI16:
4388 case R_MIPS_GOT_LO16:
4389 case R_MIPS_CALL_LO16:
4390 case R_MIPS_TLS_GD:
4391 case R_MIPS_TLS_GOTTPREL:
4392 case R_MIPS_TLS_LDM:
4393 /* Find the index into the GOT where this value is located. */
4394 if (r_type == R_MIPS_TLS_LDM)
4396 g = mips_elf_local_got_index (abfd, input_bfd, info,
4397 0, 0, NULL, r_type);
4398 if (g == MINUS_ONE)
4399 return bfd_reloc_outofrange;
4401 else if (!local_p)
4403 /* On VxWorks, CALL relocations should refer to the .got.plt
4404 entry, which is initialized to point at the PLT stub. */
4405 if (htab->is_vxworks
4406 && (r_type == R_MIPS_CALL_HI16
4407 || r_type == R_MIPS_CALL_LO16
4408 || r_type == R_MIPS_CALL16))
4410 BFD_ASSERT (addend == 0);
4411 BFD_ASSERT (h->root.needs_plt);
4412 g = mips_elf_gotplt_index (info, &h->root);
4414 else
4416 /* GOT_PAGE may take a non-zero addend, that is ignored in a
4417 GOT_PAGE relocation that decays to GOT_DISP because the
4418 symbol turns out to be global. The addend is then added
4419 as GOT_OFST. */
4420 BFD_ASSERT (addend == 0 || r_type == R_MIPS_GOT_PAGE);
4421 g = mips_elf_global_got_index (dynobj, input_bfd,
4422 &h->root, r_type, info);
4423 if (h->tls_type == GOT_NORMAL
4424 && (! elf_hash_table(info)->dynamic_sections_created
4425 || (info->shared
4426 && (info->symbolic || h->root.forced_local)
4427 && h->root.def_regular)))
4429 /* This is a static link or a -Bsymbolic link. The
4430 symbol is defined locally, or was forced to be local.
4431 We must initialize this entry in the GOT. */
4432 asection *sgot = mips_elf_got_section (dynobj, FALSE);
4433 MIPS_ELF_PUT_WORD (dynobj, symbol, sgot->contents + g);
4437 else if (!htab->is_vxworks
4438 && (r_type == R_MIPS_CALL16 || (r_type == R_MIPS_GOT16)))
4439 /* The calculation below does not involve "g". */
4440 break;
4441 else
4443 g = mips_elf_local_got_index (abfd, input_bfd, info,
4444 symbol + addend, r_symndx, h, r_type);
4445 if (g == MINUS_ONE)
4446 return bfd_reloc_outofrange;
4449 /* Convert GOT indices to actual offsets. */
4450 g = mips_elf_got_offset_from_index (dynobj, abfd, input_bfd, g);
4451 break;
4453 case R_MIPS_HI16:
4454 case R_MIPS_LO16:
4455 case R_MIPS_GPREL16:
4456 case R_MIPS_GPREL32:
4457 case R_MIPS_LITERAL:
4458 case R_MIPS16_HI16:
4459 case R_MIPS16_LO16:
4460 case R_MIPS16_GPREL:
4461 gp0 = _bfd_get_gp_value (input_bfd);
4462 gp = _bfd_get_gp_value (abfd);
4463 if (dynobj)
4464 gp += mips_elf_adjust_gp (abfd, mips_elf_got_info (dynobj, NULL),
4465 input_bfd);
4466 break;
4468 default:
4469 break;
4472 if (gnu_local_gp_p)
4473 symbol = gp;
4475 /* Relocations against the VxWorks __GOTT_BASE__ and __GOTT_INDEX__
4476 symbols are resolved by the loader. Add them to .rela.dyn. */
4477 if (h != NULL && is_gott_symbol (info, &h->root))
4479 Elf_Internal_Rela outrel;
4480 bfd_byte *loc;
4481 asection *s;
4483 s = mips_elf_rel_dyn_section (info, FALSE);
4484 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
4486 outrel.r_offset = (input_section->output_section->vma
4487 + input_section->output_offset
4488 + relocation->r_offset);
4489 outrel.r_info = ELF32_R_INFO (h->root.dynindx, r_type);
4490 outrel.r_addend = addend;
4491 bfd_elf32_swap_reloca_out (abfd, &outrel, loc);
4493 /* If we've written this relocation for a readonly section,
4494 we need to set DF_TEXTREL again, so that we do not delete the
4495 DT_TEXTREL tag. */
4496 if (MIPS_ELF_READONLY_SECTION (input_section))
4497 info->flags |= DF_TEXTREL;
4499 *valuep = 0;
4500 return bfd_reloc_ok;
4503 /* Figure out what kind of relocation is being performed. */
4504 switch (r_type)
4506 case R_MIPS_NONE:
4507 return bfd_reloc_continue;
4509 case R_MIPS_16:
4510 value = symbol + _bfd_mips_elf_sign_extend (addend, 16);
4511 overflowed_p = mips_elf_overflow_p (value, 16);
4512 break;
4514 case R_MIPS_32:
4515 case R_MIPS_REL32:
4516 case R_MIPS_64:
4517 if ((info->shared
4518 || (!htab->is_vxworks
4519 && htab->root.dynamic_sections_created
4520 && h != NULL
4521 && h->root.def_dynamic
4522 && !h->root.def_regular))
4523 && r_symndx != 0
4524 && (input_section->flags & SEC_ALLOC) != 0)
4526 /* If we're creating a shared library, or this relocation is
4527 against a symbol in a shared library, then we can't know
4528 where the symbol will end up. So, we create a relocation
4529 record in the output, and leave the job up to the dynamic
4530 linker.
4532 In VxWorks executables, references to external symbols
4533 are handled using copy relocs or PLT stubs, so there's
4534 no need to add a dynamic relocation here. */
4535 value = addend;
4536 if (!mips_elf_create_dynamic_relocation (abfd,
4537 info,
4538 relocation,
4540 sec,
4541 symbol,
4542 &value,
4543 input_section))
4544 return bfd_reloc_undefined;
4546 else
4548 if (r_type != R_MIPS_REL32)
4549 value = symbol + addend;
4550 else
4551 value = addend;
4553 value &= howto->dst_mask;
4554 break;
4556 case R_MIPS_PC32:
4557 value = symbol + addend - p;
4558 value &= howto->dst_mask;
4559 break;
4561 case R_MIPS16_26:
4562 /* The calculation for R_MIPS16_26 is just the same as for an
4563 R_MIPS_26. It's only the storage of the relocated field into
4564 the output file that's different. That's handled in
4565 mips_elf_perform_relocation. So, we just fall through to the
4566 R_MIPS_26 case here. */
4567 case R_MIPS_26:
4568 if (local_p)
4569 value = ((addend | ((p + 4) & 0xf0000000)) + symbol) >> 2;
4570 else
4572 value = (_bfd_mips_elf_sign_extend (addend, 28) + symbol) >> 2;
4573 if (h->root.root.type != bfd_link_hash_undefweak)
4574 overflowed_p = (value >> 26) != ((p + 4) >> 28);
4576 value &= howto->dst_mask;
4577 break;
4579 case R_MIPS_TLS_DTPREL_HI16:
4580 value = (mips_elf_high (addend + symbol - dtprel_base (info))
4581 & howto->dst_mask);
4582 break;
4584 case R_MIPS_TLS_DTPREL_LO16:
4585 case R_MIPS_TLS_DTPREL32:
4586 case R_MIPS_TLS_DTPREL64:
4587 value = (symbol + addend - dtprel_base (info)) & howto->dst_mask;
4588 break;
4590 case R_MIPS_TLS_TPREL_HI16:
4591 value = (mips_elf_high (addend + symbol - tprel_base (info))
4592 & howto->dst_mask);
4593 break;
4595 case R_MIPS_TLS_TPREL_LO16:
4596 value = (symbol + addend - tprel_base (info)) & howto->dst_mask;
4597 break;
4599 case R_MIPS_HI16:
4600 case R_MIPS16_HI16:
4601 if (!gp_disp_p)
4603 value = mips_elf_high (addend + symbol);
4604 value &= howto->dst_mask;
4606 else
4608 /* For MIPS16 ABI code we generate this sequence
4609 0: li $v0,%hi(_gp_disp)
4610 4: addiupc $v1,%lo(_gp_disp)
4611 8: sll $v0,16
4612 12: addu $v0,$v1
4613 14: move $gp,$v0
4614 So the offsets of hi and lo relocs are the same, but the
4615 $pc is four higher than $t9 would be, so reduce
4616 both reloc addends by 4. */
4617 if (r_type == R_MIPS16_HI16)
4618 value = mips_elf_high (addend + gp - p - 4);
4619 else
4620 value = mips_elf_high (addend + gp - p);
4621 overflowed_p = mips_elf_overflow_p (value, 16);
4623 break;
4625 case R_MIPS_LO16:
4626 case R_MIPS16_LO16:
4627 if (!gp_disp_p)
4628 value = (symbol + addend) & howto->dst_mask;
4629 else
4631 /* See the comment for R_MIPS16_HI16 above for the reason
4632 for this conditional. */
4633 if (r_type == R_MIPS16_LO16)
4634 value = addend + gp - p;
4635 else
4636 value = addend + gp - p + 4;
4637 /* The MIPS ABI requires checking the R_MIPS_LO16 relocation
4638 for overflow. But, on, say, IRIX5, relocations against
4639 _gp_disp are normally generated from the .cpload
4640 pseudo-op. It generates code that normally looks like
4641 this:
4643 lui $gp,%hi(_gp_disp)
4644 addiu $gp,$gp,%lo(_gp_disp)
4645 addu $gp,$gp,$t9
4647 Here $t9 holds the address of the function being called,
4648 as required by the MIPS ELF ABI. The R_MIPS_LO16
4649 relocation can easily overflow in this situation, but the
4650 R_MIPS_HI16 relocation will handle the overflow.
4651 Therefore, we consider this a bug in the MIPS ABI, and do
4652 not check for overflow here. */
4654 break;
4656 case R_MIPS_LITERAL:
4657 /* Because we don't merge literal sections, we can handle this
4658 just like R_MIPS_GPREL16. In the long run, we should merge
4659 shared literals, and then we will need to additional work
4660 here. */
4662 /* Fall through. */
4664 case R_MIPS16_GPREL:
4665 /* The R_MIPS16_GPREL performs the same calculation as
4666 R_MIPS_GPREL16, but stores the relocated bits in a different
4667 order. We don't need to do anything special here; the
4668 differences are handled in mips_elf_perform_relocation. */
4669 case R_MIPS_GPREL16:
4670 /* Only sign-extend the addend if it was extracted from the
4671 instruction. If the addend was separate, leave it alone,
4672 otherwise we may lose significant bits. */
4673 if (howto->partial_inplace)
4674 addend = _bfd_mips_elf_sign_extend (addend, 16);
4675 value = symbol + addend - gp;
4676 /* If the symbol was local, any earlier relocatable links will
4677 have adjusted its addend with the gp offset, so compensate
4678 for that now. Don't do it for symbols forced local in this
4679 link, though, since they won't have had the gp offset applied
4680 to them before. */
4681 if (was_local_p)
4682 value += gp0;
4683 overflowed_p = mips_elf_overflow_p (value, 16);
4684 break;
4686 case R_MIPS_GOT16:
4687 case R_MIPS_CALL16:
4688 /* VxWorks does not have separate local and global semantics for
4689 R_MIPS_GOT16; every relocation evaluates to "G". */
4690 if (!htab->is_vxworks && local_p)
4692 bfd_boolean forced;
4694 forced = ! mips_elf_local_relocation_p (input_bfd, relocation,
4695 local_sections, FALSE);
4696 value = mips_elf_got16_entry (abfd, input_bfd, info,
4697 symbol + addend, forced);
4698 if (value == MINUS_ONE)
4699 return bfd_reloc_outofrange;
4700 value
4701 = mips_elf_got_offset_from_index (dynobj, abfd, input_bfd, value);
4702 overflowed_p = mips_elf_overflow_p (value, 16);
4703 break;
4706 /* Fall through. */
4708 case R_MIPS_TLS_GD:
4709 case R_MIPS_TLS_GOTTPREL:
4710 case R_MIPS_TLS_LDM:
4711 case R_MIPS_GOT_DISP:
4712 got_disp:
4713 value = g;
4714 overflowed_p = mips_elf_overflow_p (value, 16);
4715 break;
4717 case R_MIPS_GPREL32:
4718 value = (addend + symbol + gp0 - gp);
4719 if (!save_addend)
4720 value &= howto->dst_mask;
4721 break;
4723 case R_MIPS_PC16:
4724 case R_MIPS_GNU_REL16_S2:
4725 value = symbol + _bfd_mips_elf_sign_extend (addend, 18) - p;
4726 overflowed_p = mips_elf_overflow_p (value, 18);
4727 value >>= howto->rightshift;
4728 value &= howto->dst_mask;
4729 break;
4731 case R_MIPS_GOT_HI16:
4732 case R_MIPS_CALL_HI16:
4733 /* We're allowed to handle these two relocations identically.
4734 The dynamic linker is allowed to handle the CALL relocations
4735 differently by creating a lazy evaluation stub. */
4736 value = g;
4737 value = mips_elf_high (value);
4738 value &= howto->dst_mask;
4739 break;
4741 case R_MIPS_GOT_LO16:
4742 case R_MIPS_CALL_LO16:
4743 value = g & howto->dst_mask;
4744 break;
4746 case R_MIPS_GOT_PAGE:
4747 /* GOT_PAGE relocations that reference non-local symbols decay
4748 to GOT_DISP. The corresponding GOT_OFST relocation decays to
4749 0. */
4750 if (! local_p)
4751 goto got_disp;
4752 value = mips_elf_got_page (abfd, input_bfd, info, symbol + addend, NULL);
4753 if (value == MINUS_ONE)
4754 return bfd_reloc_outofrange;
4755 value = mips_elf_got_offset_from_index (dynobj, abfd, input_bfd, value);
4756 overflowed_p = mips_elf_overflow_p (value, 16);
4757 break;
4759 case R_MIPS_GOT_OFST:
4760 if (local_p)
4761 mips_elf_got_page (abfd, input_bfd, info, symbol + addend, &value);
4762 else
4763 value = addend;
4764 overflowed_p = mips_elf_overflow_p (value, 16);
4765 break;
4767 case R_MIPS_SUB:
4768 value = symbol - addend;
4769 value &= howto->dst_mask;
4770 break;
4772 case R_MIPS_HIGHER:
4773 value = mips_elf_higher (addend + symbol);
4774 value &= howto->dst_mask;
4775 break;
4777 case R_MIPS_HIGHEST:
4778 value = mips_elf_highest (addend + symbol);
4779 value &= howto->dst_mask;
4780 break;
4782 case R_MIPS_SCN_DISP:
4783 value = symbol + addend - sec->output_offset;
4784 value &= howto->dst_mask;
4785 break;
4787 case R_MIPS_JALR:
4788 /* This relocation is only a hint. In some cases, we optimize
4789 it into a bal instruction. But we don't try to optimize
4790 branches to the PLT; that will wind up wasting time. */
4791 if (h != NULL && h->root.plt.offset != (bfd_vma) -1)
4792 return bfd_reloc_continue;
4793 value = symbol + addend;
4794 break;
4796 case R_MIPS_PJUMP:
4797 case R_MIPS_GNU_VTINHERIT:
4798 case R_MIPS_GNU_VTENTRY:
4799 /* We don't do anything with these at present. */
4800 return bfd_reloc_continue;
4802 default:
4803 /* An unrecognized relocation type. */
4804 return bfd_reloc_notsupported;
4807 /* Store the VALUE for our caller. */
4808 *valuep = value;
4809 return overflowed_p ? bfd_reloc_overflow : bfd_reloc_ok;
4812 /* Obtain the field relocated by RELOCATION. */
4814 static bfd_vma
4815 mips_elf_obtain_contents (reloc_howto_type *howto,
4816 const Elf_Internal_Rela *relocation,
4817 bfd *input_bfd, bfd_byte *contents)
4819 bfd_vma x;
4820 bfd_byte *location = contents + relocation->r_offset;
4822 /* Obtain the bytes. */
4823 x = bfd_get ((8 * bfd_get_reloc_size (howto)), input_bfd, location);
4825 return x;
4828 /* It has been determined that the result of the RELOCATION is the
4829 VALUE. Use HOWTO to place VALUE into the output file at the
4830 appropriate position. The SECTION is the section to which the
4831 relocation applies. If REQUIRE_JALX is TRUE, then the opcode used
4832 for the relocation must be either JAL or JALX, and it is
4833 unconditionally converted to JALX.
4835 Returns FALSE if anything goes wrong. */
4837 static bfd_boolean
4838 mips_elf_perform_relocation (struct bfd_link_info *info,
4839 reloc_howto_type *howto,
4840 const Elf_Internal_Rela *relocation,
4841 bfd_vma value, bfd *input_bfd,
4842 asection *input_section, bfd_byte *contents,
4843 bfd_boolean require_jalx)
4845 bfd_vma x;
4846 bfd_byte *location;
4847 int r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
4849 /* Figure out where the relocation is occurring. */
4850 location = contents + relocation->r_offset;
4852 _bfd_mips16_elf_reloc_unshuffle (input_bfd, r_type, FALSE, location);
4854 /* Obtain the current value. */
4855 x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
4857 /* Clear the field we are setting. */
4858 x &= ~howto->dst_mask;
4860 /* Set the field. */
4861 x |= (value & howto->dst_mask);
4863 /* If required, turn JAL into JALX. */
4864 if (require_jalx)
4866 bfd_boolean ok;
4867 bfd_vma opcode = x >> 26;
4868 bfd_vma jalx_opcode;
4870 /* Check to see if the opcode is already JAL or JALX. */
4871 if (r_type == R_MIPS16_26)
4873 ok = ((opcode == 0x6) || (opcode == 0x7));
4874 jalx_opcode = 0x7;
4876 else
4878 ok = ((opcode == 0x3) || (opcode == 0x1d));
4879 jalx_opcode = 0x1d;
4882 /* If the opcode is not JAL or JALX, there's a problem. */
4883 if (!ok)
4885 (*_bfd_error_handler)
4886 (_("%B: %A+0x%lx: jump to stub routine which is not jal"),
4887 input_bfd,
4888 input_section,
4889 (unsigned long) relocation->r_offset);
4890 bfd_set_error (bfd_error_bad_value);
4891 return FALSE;
4894 /* Make this the JALX opcode. */
4895 x = (x & ~(0x3f << 26)) | (jalx_opcode << 26);
4898 /* On the RM9000, bal is faster than jal, because bal uses branch
4899 prediction hardware. If we are linking for the RM9000, and we
4900 see jal, and bal fits, use it instead. Note that this
4901 transformation should be safe for all architectures. */
4902 if (bfd_get_mach (input_bfd) == bfd_mach_mips9000
4903 && !info->relocatable
4904 && !require_jalx
4905 && ((r_type == R_MIPS_26 && (x >> 26) == 0x3) /* jal addr */
4906 || (r_type == R_MIPS_JALR && x == 0x0320f809))) /* jalr t9 */
4908 bfd_vma addr;
4909 bfd_vma dest;
4910 bfd_signed_vma off;
4912 addr = (input_section->output_section->vma
4913 + input_section->output_offset
4914 + relocation->r_offset
4915 + 4);
4916 if (r_type == R_MIPS_26)
4917 dest = (value << 2) | ((addr >> 28) << 28);
4918 else
4919 dest = value;
4920 off = dest - addr;
4921 if (off <= 0x1ffff && off >= -0x20000)
4922 x = 0x04110000 | (((bfd_vma) off >> 2) & 0xffff); /* bal addr */
4925 /* Put the value into the output. */
4926 bfd_put (8 * bfd_get_reloc_size (howto), input_bfd, x, location);
4928 _bfd_mips16_elf_reloc_shuffle(input_bfd, r_type, !info->relocatable,
4929 location);
4931 return TRUE;
4934 /* Returns TRUE if SECTION is a MIPS16 stub section. */
4936 static bfd_boolean
4937 mips16_stub_section_p (bfd *abfd ATTRIBUTE_UNUSED, asection *section)
4939 const char *name = bfd_get_section_name (abfd, section);
4941 return FN_STUB_P (name) || CALL_STUB_P (name) || CALL_FP_STUB_P (name);
4944 /* Add room for N relocations to the .rel(a).dyn section in ABFD. */
4946 static void
4947 mips_elf_allocate_dynamic_relocations (bfd *abfd, struct bfd_link_info *info,
4948 unsigned int n)
4950 asection *s;
4951 struct mips_elf_link_hash_table *htab;
4953 htab = mips_elf_hash_table (info);
4954 s = mips_elf_rel_dyn_section (info, FALSE);
4955 BFD_ASSERT (s != NULL);
4957 if (htab->is_vxworks)
4958 s->size += n * MIPS_ELF_RELA_SIZE (abfd);
4959 else
4961 if (s->size == 0)
4963 /* Make room for a null element. */
4964 s->size += MIPS_ELF_REL_SIZE (abfd);
4965 ++s->reloc_count;
4967 s->size += n * MIPS_ELF_REL_SIZE (abfd);
4971 /* Create a rel.dyn relocation for the dynamic linker to resolve. REL
4972 is the original relocation, which is now being transformed into a
4973 dynamic relocation. The ADDENDP is adjusted if necessary; the
4974 caller should store the result in place of the original addend. */
4976 static bfd_boolean
4977 mips_elf_create_dynamic_relocation (bfd *output_bfd,
4978 struct bfd_link_info *info,
4979 const Elf_Internal_Rela *rel,
4980 struct mips_elf_link_hash_entry *h,
4981 asection *sec, bfd_vma symbol,
4982 bfd_vma *addendp, asection *input_section)
4984 Elf_Internal_Rela outrel[3];
4985 asection *sreloc;
4986 bfd *dynobj;
4987 int r_type;
4988 long indx;
4989 bfd_boolean defined_p;
4990 struct mips_elf_link_hash_table *htab;
4992 htab = mips_elf_hash_table (info);
4993 r_type = ELF_R_TYPE (output_bfd, rel->r_info);
4994 dynobj = elf_hash_table (info)->dynobj;
4995 sreloc = mips_elf_rel_dyn_section (info, FALSE);
4996 BFD_ASSERT (sreloc != NULL);
4997 BFD_ASSERT (sreloc->contents != NULL);
4998 BFD_ASSERT (sreloc->reloc_count * MIPS_ELF_REL_SIZE (output_bfd)
4999 < sreloc->size);
5001 outrel[0].r_offset =
5002 _bfd_elf_section_offset (output_bfd, info, input_section, rel[0].r_offset);
5003 if (ABI_64_P (output_bfd))
5005 outrel[1].r_offset =
5006 _bfd_elf_section_offset (output_bfd, info, input_section, rel[1].r_offset);
5007 outrel[2].r_offset =
5008 _bfd_elf_section_offset (output_bfd, info, input_section, rel[2].r_offset);
5011 if (outrel[0].r_offset == MINUS_ONE)
5012 /* The relocation field has been deleted. */
5013 return TRUE;
5015 if (outrel[0].r_offset == MINUS_TWO)
5017 /* The relocation field has been converted into a relative value of
5018 some sort. Functions like _bfd_elf_write_section_eh_frame expect
5019 the field to be fully relocated, so add in the symbol's value. */
5020 *addendp += symbol;
5021 return TRUE;
5024 /* We must now calculate the dynamic symbol table index to use
5025 in the relocation. */
5026 if (h != NULL
5027 && (!h->root.def_regular
5028 || (info->shared && !info->symbolic && !h->root.forced_local)))
5030 indx = h->root.dynindx;
5031 if (SGI_COMPAT (output_bfd))
5032 defined_p = h->root.def_regular;
5033 else
5034 /* ??? glibc's ld.so just adds the final GOT entry to the
5035 relocation field. It therefore treats relocs against
5036 defined symbols in the same way as relocs against
5037 undefined symbols. */
5038 defined_p = FALSE;
5040 else
5042 if (sec != NULL && bfd_is_abs_section (sec))
5043 indx = 0;
5044 else if (sec == NULL || sec->owner == NULL)
5046 bfd_set_error (bfd_error_bad_value);
5047 return FALSE;
5049 else
5051 indx = elf_section_data (sec->output_section)->dynindx;
5052 if (indx == 0)
5054 asection *osec = htab->root.text_index_section;
5055 indx = elf_section_data (osec)->dynindx;
5057 if (indx == 0)
5058 abort ();
5061 /* Instead of generating a relocation using the section
5062 symbol, we may as well make it a fully relative
5063 relocation. We want to avoid generating relocations to
5064 local symbols because we used to generate them
5065 incorrectly, without adding the original symbol value,
5066 which is mandated by the ABI for section symbols. In
5067 order to give dynamic loaders and applications time to
5068 phase out the incorrect use, we refrain from emitting
5069 section-relative relocations. It's not like they're
5070 useful, after all. This should be a bit more efficient
5071 as well. */
5072 /* ??? Although this behavior is compatible with glibc's ld.so,
5073 the ABI says that relocations against STN_UNDEF should have
5074 a symbol value of 0. Irix rld honors this, so relocations
5075 against STN_UNDEF have no effect. */
5076 if (!SGI_COMPAT (output_bfd))
5077 indx = 0;
5078 defined_p = TRUE;
5081 /* If the relocation was previously an absolute relocation and
5082 this symbol will not be referred to by the relocation, we must
5083 adjust it by the value we give it in the dynamic symbol table.
5084 Otherwise leave the job up to the dynamic linker. */
5085 if (defined_p && r_type != R_MIPS_REL32)
5086 *addendp += symbol;
5088 if (htab->is_vxworks)
5089 /* VxWorks uses non-relative relocations for this. */
5090 outrel[0].r_info = ELF32_R_INFO (indx, R_MIPS_32);
5091 else
5092 /* The relocation is always an REL32 relocation because we don't
5093 know where the shared library will wind up at load-time. */
5094 outrel[0].r_info = ELF_R_INFO (output_bfd, (unsigned long) indx,
5095 R_MIPS_REL32);
5097 /* For strict adherence to the ABI specification, we should
5098 generate a R_MIPS_64 relocation record by itself before the
5099 _REL32/_64 record as well, such that the addend is read in as
5100 a 64-bit value (REL32 is a 32-bit relocation, after all).
5101 However, since none of the existing ELF64 MIPS dynamic
5102 loaders seems to care, we don't waste space with these
5103 artificial relocations. If this turns out to not be true,
5104 mips_elf_allocate_dynamic_relocation() should be tweaked so
5105 as to make room for a pair of dynamic relocations per
5106 invocation if ABI_64_P, and here we should generate an
5107 additional relocation record with R_MIPS_64 by itself for a
5108 NULL symbol before this relocation record. */
5109 outrel[1].r_info = ELF_R_INFO (output_bfd, 0,
5110 ABI_64_P (output_bfd)
5111 ? R_MIPS_64
5112 : R_MIPS_NONE);
5113 outrel[2].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_NONE);
5115 /* Adjust the output offset of the relocation to reference the
5116 correct location in the output file. */
5117 outrel[0].r_offset += (input_section->output_section->vma
5118 + input_section->output_offset);
5119 outrel[1].r_offset += (input_section->output_section->vma
5120 + input_section->output_offset);
5121 outrel[2].r_offset += (input_section->output_section->vma
5122 + input_section->output_offset);
5124 /* Put the relocation back out. We have to use the special
5125 relocation outputter in the 64-bit case since the 64-bit
5126 relocation format is non-standard. */
5127 if (ABI_64_P (output_bfd))
5129 (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
5130 (output_bfd, &outrel[0],
5131 (sreloc->contents
5132 + sreloc->reloc_count * sizeof (Elf64_Mips_External_Rel)));
5134 else if (htab->is_vxworks)
5136 /* VxWorks uses RELA rather than REL dynamic relocations. */
5137 outrel[0].r_addend = *addendp;
5138 bfd_elf32_swap_reloca_out
5139 (output_bfd, &outrel[0],
5140 (sreloc->contents
5141 + sreloc->reloc_count * sizeof (Elf32_External_Rela)));
5143 else
5144 bfd_elf32_swap_reloc_out
5145 (output_bfd, &outrel[0],
5146 (sreloc->contents + sreloc->reloc_count * sizeof (Elf32_External_Rel)));
5148 /* We've now added another relocation. */
5149 ++sreloc->reloc_count;
5151 /* Make sure the output section is writable. The dynamic linker
5152 will be writing to it. */
5153 elf_section_data (input_section->output_section)->this_hdr.sh_flags
5154 |= SHF_WRITE;
5156 /* On IRIX5, make an entry of compact relocation info. */
5157 if (IRIX_COMPAT (output_bfd) == ict_irix5)
5159 asection *scpt = bfd_get_section_by_name (dynobj, ".compact_rel");
5160 bfd_byte *cr;
5162 if (scpt)
5164 Elf32_crinfo cptrel;
5166 mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG);
5167 cptrel.vaddr = (rel->r_offset
5168 + input_section->output_section->vma
5169 + input_section->output_offset);
5170 if (r_type == R_MIPS_REL32)
5171 mips_elf_set_cr_type (cptrel, CRT_MIPS_REL32);
5172 else
5173 mips_elf_set_cr_type (cptrel, CRT_MIPS_WORD);
5174 mips_elf_set_cr_dist2to (cptrel, 0);
5175 cptrel.konst = *addendp;
5177 cr = (scpt->contents
5178 + sizeof (Elf32_External_compact_rel));
5179 mips_elf_set_cr_relvaddr (cptrel, 0);
5180 bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
5181 ((Elf32_External_crinfo *) cr
5182 + scpt->reloc_count));
5183 ++scpt->reloc_count;
5187 /* If we've written this relocation for a readonly section,
5188 we need to set DF_TEXTREL again, so that we do not delete the
5189 DT_TEXTREL tag. */
5190 if (MIPS_ELF_READONLY_SECTION (input_section))
5191 info->flags |= DF_TEXTREL;
5193 return TRUE;
5196 /* Return the MACH for a MIPS e_flags value. */
5198 unsigned long
5199 _bfd_elf_mips_mach (flagword flags)
5201 switch (flags & EF_MIPS_MACH)
5203 case E_MIPS_MACH_3900:
5204 return bfd_mach_mips3900;
5206 case E_MIPS_MACH_4010:
5207 return bfd_mach_mips4010;
5209 case E_MIPS_MACH_4100:
5210 return bfd_mach_mips4100;
5212 case E_MIPS_MACH_4111:
5213 return bfd_mach_mips4111;
5215 case E_MIPS_MACH_4120:
5216 return bfd_mach_mips4120;
5218 case E_MIPS_MACH_4650:
5219 return bfd_mach_mips4650;
5221 case E_MIPS_MACH_5400:
5222 return bfd_mach_mips5400;
5224 case E_MIPS_MACH_5500:
5225 return bfd_mach_mips5500;
5227 case E_MIPS_MACH_9000:
5228 return bfd_mach_mips9000;
5230 case E_MIPS_MACH_SB1:
5231 return bfd_mach_mips_sb1;
5233 case E_MIPS_MACH_LS2E:
5234 return bfd_mach_mips_loongson_2e;
5236 case E_MIPS_MACH_LS2F:
5237 return bfd_mach_mips_loongson_2f;
5239 case E_MIPS_MACH_OCTEON:
5240 return bfd_mach_mips_octeon;
5242 default:
5243 switch (flags & EF_MIPS_ARCH)
5245 default:
5246 case E_MIPS_ARCH_1:
5247 return bfd_mach_mips3000;
5249 case E_MIPS_ARCH_2:
5250 return bfd_mach_mips6000;
5252 case E_MIPS_ARCH_3:
5253 return bfd_mach_mips4000;
5255 case E_MIPS_ARCH_4:
5256 return bfd_mach_mips8000;
5258 case E_MIPS_ARCH_5:
5259 return bfd_mach_mips5;
5261 case E_MIPS_ARCH_32:
5262 return bfd_mach_mipsisa32;
5264 case E_MIPS_ARCH_64:
5265 return bfd_mach_mipsisa64;
5267 case E_MIPS_ARCH_32R2:
5268 return bfd_mach_mipsisa32r2;
5270 case E_MIPS_ARCH_64R2:
5271 return bfd_mach_mipsisa64r2;
5275 return 0;
5278 /* Return printable name for ABI. */
5280 static INLINE char *
5281 elf_mips_abi_name (bfd *abfd)
5283 flagword flags;
5285 flags = elf_elfheader (abfd)->e_flags;
5286 switch (flags & EF_MIPS_ABI)
5288 case 0:
5289 if (ABI_N32_P (abfd))
5290 return "N32";
5291 else if (ABI_64_P (abfd))
5292 return "64";
5293 else
5294 return "none";
5295 case E_MIPS_ABI_O32:
5296 return "O32";
5297 case E_MIPS_ABI_O64:
5298 return "O64";
5299 case E_MIPS_ABI_EABI32:
5300 return "EABI32";
5301 case E_MIPS_ABI_EABI64:
5302 return "EABI64";
5303 default:
5304 return "unknown abi";
5308 /* MIPS ELF uses two common sections. One is the usual one, and the
5309 other is for small objects. All the small objects are kept
5310 together, and then referenced via the gp pointer, which yields
5311 faster assembler code. This is what we use for the small common
5312 section. This approach is copied from ecoff.c. */
5313 static asection mips_elf_scom_section;
5314 static asymbol mips_elf_scom_symbol;
5315 static asymbol *mips_elf_scom_symbol_ptr;
5317 /* MIPS ELF also uses an acommon section, which represents an
5318 allocated common symbol which may be overridden by a
5319 definition in a shared library. */
5320 static asection mips_elf_acom_section;
5321 static asymbol mips_elf_acom_symbol;
5322 static asymbol *mips_elf_acom_symbol_ptr;
5324 /* Handle the special MIPS section numbers that a symbol may use.
5325 This is used for both the 32-bit and the 64-bit ABI. */
5327 void
5328 _bfd_mips_elf_symbol_processing (bfd *abfd, asymbol *asym)
5330 elf_symbol_type *elfsym;
5332 elfsym = (elf_symbol_type *) asym;
5333 switch (elfsym->internal_elf_sym.st_shndx)
5335 case SHN_MIPS_ACOMMON:
5336 /* This section is used in a dynamically linked executable file.
5337 It is an allocated common section. The dynamic linker can
5338 either resolve these symbols to something in a shared
5339 library, or it can just leave them here. For our purposes,
5340 we can consider these symbols to be in a new section. */
5341 if (mips_elf_acom_section.name == NULL)
5343 /* Initialize the acommon section. */
5344 mips_elf_acom_section.name = ".acommon";
5345 mips_elf_acom_section.flags = SEC_ALLOC;
5346 mips_elf_acom_section.output_section = &mips_elf_acom_section;
5347 mips_elf_acom_section.symbol = &mips_elf_acom_symbol;
5348 mips_elf_acom_section.symbol_ptr_ptr = &mips_elf_acom_symbol_ptr;
5349 mips_elf_acom_symbol.name = ".acommon";
5350 mips_elf_acom_symbol.flags = BSF_SECTION_SYM;
5351 mips_elf_acom_symbol.section = &mips_elf_acom_section;
5352 mips_elf_acom_symbol_ptr = &mips_elf_acom_symbol;
5354 asym->section = &mips_elf_acom_section;
5355 break;
5357 case SHN_COMMON:
5358 /* Common symbols less than the GP size are automatically
5359 treated as SHN_MIPS_SCOMMON symbols on IRIX5. */
5360 if (asym->value > elf_gp_size (abfd)
5361 || ELF_ST_TYPE (elfsym->internal_elf_sym.st_info) == STT_TLS
5362 || IRIX_COMPAT (abfd) == ict_irix6)
5363 break;
5364 /* Fall through. */
5365 case SHN_MIPS_SCOMMON:
5366 if (mips_elf_scom_section.name == NULL)
5368 /* Initialize the small common section. */
5369 mips_elf_scom_section.name = ".scommon";
5370 mips_elf_scom_section.flags = SEC_IS_COMMON;
5371 mips_elf_scom_section.output_section = &mips_elf_scom_section;
5372 mips_elf_scom_section.symbol = &mips_elf_scom_symbol;
5373 mips_elf_scom_section.symbol_ptr_ptr = &mips_elf_scom_symbol_ptr;
5374 mips_elf_scom_symbol.name = ".scommon";
5375 mips_elf_scom_symbol.flags = BSF_SECTION_SYM;
5376 mips_elf_scom_symbol.section = &mips_elf_scom_section;
5377 mips_elf_scom_symbol_ptr = &mips_elf_scom_symbol;
5379 asym->section = &mips_elf_scom_section;
5380 asym->value = elfsym->internal_elf_sym.st_size;
5381 break;
5383 case SHN_MIPS_SUNDEFINED:
5384 asym->section = bfd_und_section_ptr;
5385 break;
5387 case SHN_MIPS_TEXT:
5389 asection *section = bfd_get_section_by_name (abfd, ".text");
5391 BFD_ASSERT (SGI_COMPAT (abfd));
5392 if (section != NULL)
5394 asym->section = section;
5395 /* MIPS_TEXT is a bit special, the address is not an offset
5396 to the base of the .text section. So substract the section
5397 base address to make it an offset. */
5398 asym->value -= section->vma;
5401 break;
5403 case SHN_MIPS_DATA:
5405 asection *section = bfd_get_section_by_name (abfd, ".data");
5407 BFD_ASSERT (SGI_COMPAT (abfd));
5408 if (section != NULL)
5410 asym->section = section;
5411 /* MIPS_DATA is a bit special, the address is not an offset
5412 to the base of the .data section. So substract the section
5413 base address to make it an offset. */
5414 asym->value -= section->vma;
5417 break;
5421 /* Implement elf_backend_eh_frame_address_size. This differs from
5422 the default in the way it handles EABI64.
5424 EABI64 was originally specified as an LP64 ABI, and that is what
5425 -mabi=eabi normally gives on a 64-bit target. However, gcc has
5426 historically accepted the combination of -mabi=eabi and -mlong32,
5427 and this ILP32 variation has become semi-official over time.
5428 Both forms use elf32 and have pointer-sized FDE addresses.
5430 If an EABI object was generated by GCC 4.0 or above, it will have
5431 an empty .gcc_compiled_longXX section, where XX is the size of longs
5432 in bits. Unfortunately, ILP32 objects generated by earlier compilers
5433 have no special marking to distinguish them from LP64 objects.
5435 We don't want users of the official LP64 ABI to be punished for the
5436 existence of the ILP32 variant, but at the same time, we don't want
5437 to mistakenly interpret pre-4.0 ILP32 objects as being LP64 objects.
5438 We therefore take the following approach:
5440 - If ABFD contains a .gcc_compiled_longXX section, use it to
5441 determine the pointer size.
5443 - Otherwise check the type of the first relocation. Assume that
5444 the LP64 ABI is being used if the relocation is of type R_MIPS_64.
5446 - Otherwise punt.
5448 The second check is enough to detect LP64 objects generated by pre-4.0
5449 compilers because, in the kind of output generated by those compilers,
5450 the first relocation will be associated with either a CIE personality
5451 routine or an FDE start address. Furthermore, the compilers never
5452 used a special (non-pointer) encoding for this ABI.
5454 Checking the relocation type should also be safe because there is no
5455 reason to use R_MIPS_64 in an ILP32 object. Pre-4.0 compilers never
5456 did so. */
5458 unsigned int
5459 _bfd_mips_elf_eh_frame_address_size (bfd *abfd, asection *sec)
5461 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
5462 return 8;
5463 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64)
5465 bfd_boolean long32_p, long64_p;
5467 long32_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long32") != 0;
5468 long64_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long64") != 0;
5469 if (long32_p && long64_p)
5470 return 0;
5471 if (long32_p)
5472 return 4;
5473 if (long64_p)
5474 return 8;
5476 if (sec->reloc_count > 0
5477 && elf_section_data (sec)->relocs != NULL
5478 && (ELF32_R_TYPE (elf_section_data (sec)->relocs[0].r_info)
5479 == R_MIPS_64))
5480 return 8;
5482 return 0;
5484 return 4;
5487 /* There appears to be a bug in the MIPSpro linker that causes GOT_DISP
5488 relocations against two unnamed section symbols to resolve to the
5489 same address. For example, if we have code like:
5491 lw $4,%got_disp(.data)($gp)
5492 lw $25,%got_disp(.text)($gp)
5493 jalr $25
5495 then the linker will resolve both relocations to .data and the program
5496 will jump there rather than to .text.
5498 We can work around this problem by giving names to local section symbols.
5499 This is also what the MIPSpro tools do. */
5501 bfd_boolean
5502 _bfd_mips_elf_name_local_section_symbols (bfd *abfd)
5504 return SGI_COMPAT (abfd);
5507 /* Work over a section just before writing it out. This routine is
5508 used by both the 32-bit and the 64-bit ABI. FIXME: We recognize
5509 sections that need the SHF_MIPS_GPREL flag by name; there has to be
5510 a better way. */
5512 bfd_boolean
5513 _bfd_mips_elf_section_processing (bfd *abfd, Elf_Internal_Shdr *hdr)
5515 if (hdr->sh_type == SHT_MIPS_REGINFO
5516 && hdr->sh_size > 0)
5518 bfd_byte buf[4];
5520 BFD_ASSERT (hdr->sh_size == sizeof (Elf32_External_RegInfo));
5521 BFD_ASSERT (hdr->contents == NULL);
5523 if (bfd_seek (abfd,
5524 hdr->sh_offset + sizeof (Elf32_External_RegInfo) - 4,
5525 SEEK_SET) != 0)
5526 return FALSE;
5527 H_PUT_32 (abfd, elf_gp (abfd), buf);
5528 if (bfd_bwrite (buf, 4, abfd) != 4)
5529 return FALSE;
5532 if (hdr->sh_type == SHT_MIPS_OPTIONS
5533 && hdr->bfd_section != NULL
5534 && mips_elf_section_data (hdr->bfd_section) != NULL
5535 && mips_elf_section_data (hdr->bfd_section)->u.tdata != NULL)
5537 bfd_byte *contents, *l, *lend;
5539 /* We stored the section contents in the tdata field in the
5540 set_section_contents routine. We save the section contents
5541 so that we don't have to read them again.
5542 At this point we know that elf_gp is set, so we can look
5543 through the section contents to see if there is an
5544 ODK_REGINFO structure. */
5546 contents = mips_elf_section_data (hdr->bfd_section)->u.tdata;
5547 l = contents;
5548 lend = contents + hdr->sh_size;
5549 while (l + sizeof (Elf_External_Options) <= lend)
5551 Elf_Internal_Options intopt;
5553 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
5554 &intopt);
5555 if (intopt.size < sizeof (Elf_External_Options))
5557 (*_bfd_error_handler)
5558 (_("%B: Warning: bad `%s' option size %u smaller than its header"),
5559 abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd), intopt.size);
5560 break;
5562 if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
5564 bfd_byte buf[8];
5566 if (bfd_seek (abfd,
5567 (hdr->sh_offset
5568 + (l - contents)
5569 + sizeof (Elf_External_Options)
5570 + (sizeof (Elf64_External_RegInfo) - 8)),
5571 SEEK_SET) != 0)
5572 return FALSE;
5573 H_PUT_64 (abfd, elf_gp (abfd), buf);
5574 if (bfd_bwrite (buf, 8, abfd) != 8)
5575 return FALSE;
5577 else if (intopt.kind == ODK_REGINFO)
5579 bfd_byte buf[4];
5581 if (bfd_seek (abfd,
5582 (hdr->sh_offset
5583 + (l - contents)
5584 + sizeof (Elf_External_Options)
5585 + (sizeof (Elf32_External_RegInfo) - 4)),
5586 SEEK_SET) != 0)
5587 return FALSE;
5588 H_PUT_32 (abfd, elf_gp (abfd), buf);
5589 if (bfd_bwrite (buf, 4, abfd) != 4)
5590 return FALSE;
5592 l += intopt.size;
5596 if (hdr->bfd_section != NULL)
5598 const char *name = bfd_get_section_name (abfd, hdr->bfd_section);
5600 if (strcmp (name, ".sdata") == 0
5601 || strcmp (name, ".lit8") == 0
5602 || strcmp (name, ".lit4") == 0)
5604 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
5605 hdr->sh_type = SHT_PROGBITS;
5607 else if (strcmp (name, ".sbss") == 0)
5609 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
5610 hdr->sh_type = SHT_NOBITS;
5612 else if (strcmp (name, ".srdata") == 0)
5614 hdr->sh_flags |= SHF_ALLOC | SHF_MIPS_GPREL;
5615 hdr->sh_type = SHT_PROGBITS;
5617 else if (strcmp (name, ".compact_rel") == 0)
5619 hdr->sh_flags = 0;
5620 hdr->sh_type = SHT_PROGBITS;
5622 else if (strcmp (name, ".rtproc") == 0)
5624 if (hdr->sh_addralign != 0 && hdr->sh_entsize == 0)
5626 unsigned int adjust;
5628 adjust = hdr->sh_size % hdr->sh_addralign;
5629 if (adjust != 0)
5630 hdr->sh_size += hdr->sh_addralign - adjust;
5635 return TRUE;
5638 /* Handle a MIPS specific section when reading an object file. This
5639 is called when elfcode.h finds a section with an unknown type.
5640 This routine supports both the 32-bit and 64-bit ELF ABI.
5642 FIXME: We need to handle the SHF_MIPS_GPREL flag, but I'm not sure
5643 how to. */
5645 bfd_boolean
5646 _bfd_mips_elf_section_from_shdr (bfd *abfd,
5647 Elf_Internal_Shdr *hdr,
5648 const char *name,
5649 int shindex)
5651 flagword flags = 0;
5653 /* There ought to be a place to keep ELF backend specific flags, but
5654 at the moment there isn't one. We just keep track of the
5655 sections by their name, instead. Fortunately, the ABI gives
5656 suggested names for all the MIPS specific sections, so we will
5657 probably get away with this. */
5658 switch (hdr->sh_type)
5660 case SHT_MIPS_LIBLIST:
5661 if (strcmp (name, ".liblist") != 0)
5662 return FALSE;
5663 break;
5664 case SHT_MIPS_MSYM:
5665 if (strcmp (name, ".msym") != 0)
5666 return FALSE;
5667 break;
5668 case SHT_MIPS_CONFLICT:
5669 if (strcmp (name, ".conflict") != 0)
5670 return FALSE;
5671 break;
5672 case SHT_MIPS_GPTAB:
5673 if (! CONST_STRNEQ (name, ".gptab."))
5674 return FALSE;
5675 break;
5676 case SHT_MIPS_UCODE:
5677 if (strcmp (name, ".ucode") != 0)
5678 return FALSE;
5679 break;
5680 case SHT_MIPS_DEBUG:
5681 if (strcmp (name, ".mdebug") != 0)
5682 return FALSE;
5683 flags = SEC_DEBUGGING;
5684 break;
5685 case SHT_MIPS_REGINFO:
5686 if (strcmp (name, ".reginfo") != 0
5687 || hdr->sh_size != sizeof (Elf32_External_RegInfo))
5688 return FALSE;
5689 flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
5690 break;
5691 case SHT_MIPS_IFACE:
5692 if (strcmp (name, ".MIPS.interfaces") != 0)
5693 return FALSE;
5694 break;
5695 case SHT_MIPS_CONTENT:
5696 if (! CONST_STRNEQ (name, ".MIPS.content"))
5697 return FALSE;
5698 break;
5699 case SHT_MIPS_OPTIONS:
5700 if (!MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
5701 return FALSE;
5702 break;
5703 case SHT_MIPS_DWARF:
5704 if (! CONST_STRNEQ (name, ".debug_"))
5705 return FALSE;
5706 break;
5707 case SHT_MIPS_SYMBOL_LIB:
5708 if (strcmp (name, ".MIPS.symlib") != 0)
5709 return FALSE;
5710 break;
5711 case SHT_MIPS_EVENTS:
5712 if (! CONST_STRNEQ (name, ".MIPS.events")
5713 && ! CONST_STRNEQ (name, ".MIPS.post_rel"))
5714 return FALSE;
5715 break;
5716 default:
5717 break;
5720 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
5721 return FALSE;
5723 if (flags)
5725 if (! bfd_set_section_flags (abfd, hdr->bfd_section,
5726 (bfd_get_section_flags (abfd,
5727 hdr->bfd_section)
5728 | flags)))
5729 return FALSE;
5732 /* FIXME: We should record sh_info for a .gptab section. */
5734 /* For a .reginfo section, set the gp value in the tdata information
5735 from the contents of this section. We need the gp value while
5736 processing relocs, so we just get it now. The .reginfo section
5737 is not used in the 64-bit MIPS ELF ABI. */
5738 if (hdr->sh_type == SHT_MIPS_REGINFO)
5740 Elf32_External_RegInfo ext;
5741 Elf32_RegInfo s;
5743 if (! bfd_get_section_contents (abfd, hdr->bfd_section,
5744 &ext, 0, sizeof ext))
5745 return FALSE;
5746 bfd_mips_elf32_swap_reginfo_in (abfd, &ext, &s);
5747 elf_gp (abfd) = s.ri_gp_value;
5750 /* For a SHT_MIPS_OPTIONS section, look for a ODK_REGINFO entry, and
5751 set the gp value based on what we find. We may see both
5752 SHT_MIPS_REGINFO and SHT_MIPS_OPTIONS/ODK_REGINFO; in that case,
5753 they should agree. */
5754 if (hdr->sh_type == SHT_MIPS_OPTIONS)
5756 bfd_byte *contents, *l, *lend;
5758 contents = bfd_malloc (hdr->sh_size);
5759 if (contents == NULL)
5760 return FALSE;
5761 if (! bfd_get_section_contents (abfd, hdr->bfd_section, contents,
5762 0, hdr->sh_size))
5764 free (contents);
5765 return FALSE;
5767 l = contents;
5768 lend = contents + hdr->sh_size;
5769 while (l + sizeof (Elf_External_Options) <= lend)
5771 Elf_Internal_Options intopt;
5773 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
5774 &intopt);
5775 if (intopt.size < sizeof (Elf_External_Options))
5777 (*_bfd_error_handler)
5778 (_("%B: Warning: bad `%s' option size %u smaller than its header"),
5779 abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd), intopt.size);
5780 break;
5782 if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
5784 Elf64_Internal_RegInfo intreg;
5786 bfd_mips_elf64_swap_reginfo_in
5787 (abfd,
5788 ((Elf64_External_RegInfo *)
5789 (l + sizeof (Elf_External_Options))),
5790 &intreg);
5791 elf_gp (abfd) = intreg.ri_gp_value;
5793 else if (intopt.kind == ODK_REGINFO)
5795 Elf32_RegInfo intreg;
5797 bfd_mips_elf32_swap_reginfo_in
5798 (abfd,
5799 ((Elf32_External_RegInfo *)
5800 (l + sizeof (Elf_External_Options))),
5801 &intreg);
5802 elf_gp (abfd) = intreg.ri_gp_value;
5804 l += intopt.size;
5806 free (contents);
5809 return TRUE;
5812 /* Set the correct type for a MIPS ELF section. We do this by the
5813 section name, which is a hack, but ought to work. This routine is
5814 used by both the 32-bit and the 64-bit ABI. */
5816 bfd_boolean
5817 _bfd_mips_elf_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
5819 const char *name = bfd_get_section_name (abfd, sec);
5821 if (strcmp (name, ".liblist") == 0)
5823 hdr->sh_type = SHT_MIPS_LIBLIST;
5824 hdr->sh_info = sec->size / sizeof (Elf32_Lib);
5825 /* The sh_link field is set in final_write_processing. */
5827 else if (strcmp (name, ".conflict") == 0)
5828 hdr->sh_type = SHT_MIPS_CONFLICT;
5829 else if (CONST_STRNEQ (name, ".gptab."))
5831 hdr->sh_type = SHT_MIPS_GPTAB;
5832 hdr->sh_entsize = sizeof (Elf32_External_gptab);
5833 /* The sh_info field is set in final_write_processing. */
5835 else if (strcmp (name, ".ucode") == 0)
5836 hdr->sh_type = SHT_MIPS_UCODE;
5837 else if (strcmp (name, ".mdebug") == 0)
5839 hdr->sh_type = SHT_MIPS_DEBUG;
5840 /* In a shared object on IRIX 5.3, the .mdebug section has an
5841 entsize of 0. FIXME: Does this matter? */
5842 if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0)
5843 hdr->sh_entsize = 0;
5844 else
5845 hdr->sh_entsize = 1;
5847 else if (strcmp (name, ".reginfo") == 0)
5849 hdr->sh_type = SHT_MIPS_REGINFO;
5850 /* In a shared object on IRIX 5.3, the .reginfo section has an
5851 entsize of 0x18. FIXME: Does this matter? */
5852 if (SGI_COMPAT (abfd))
5854 if ((abfd->flags & DYNAMIC) != 0)
5855 hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
5856 else
5857 hdr->sh_entsize = 1;
5859 else
5860 hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
5862 else if (SGI_COMPAT (abfd)
5863 && (strcmp (name, ".hash") == 0
5864 || strcmp (name, ".dynamic") == 0
5865 || strcmp (name, ".dynstr") == 0))
5867 if (SGI_COMPAT (abfd))
5868 hdr->sh_entsize = 0;
5869 #if 0
5870 /* This isn't how the IRIX6 linker behaves. */
5871 hdr->sh_info = SIZEOF_MIPS_DYNSYM_SECNAMES;
5872 #endif
5874 else if (strcmp (name, ".got") == 0
5875 || strcmp (name, ".srdata") == 0
5876 || strcmp (name, ".sdata") == 0
5877 || strcmp (name, ".sbss") == 0
5878 || strcmp (name, ".lit4") == 0
5879 || strcmp (name, ".lit8") == 0)
5880 hdr->sh_flags |= SHF_MIPS_GPREL;
5881 else if (strcmp (name, ".MIPS.interfaces") == 0)
5883 hdr->sh_type = SHT_MIPS_IFACE;
5884 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
5886 else if (CONST_STRNEQ (name, ".MIPS.content"))
5888 hdr->sh_type = SHT_MIPS_CONTENT;
5889 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
5890 /* The sh_info field is set in final_write_processing. */
5892 else if (MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
5894 hdr->sh_type = SHT_MIPS_OPTIONS;
5895 hdr->sh_entsize = 1;
5896 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
5898 else if (CONST_STRNEQ (name, ".debug_"))
5900 hdr->sh_type = SHT_MIPS_DWARF;
5902 /* Irix facilities such as libexc expect a single .debug_frame
5903 per executable, the system ones have NOSTRIP set and the linker
5904 doesn't merge sections with different flags so ... */
5905 if (SGI_COMPAT (abfd) && CONST_STRNEQ (name, ".debug_frame"))
5906 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
5908 else if (strcmp (name, ".MIPS.symlib") == 0)
5910 hdr->sh_type = SHT_MIPS_SYMBOL_LIB;
5911 /* The sh_link and sh_info fields are set in
5912 final_write_processing. */
5914 else if (CONST_STRNEQ (name, ".MIPS.events")
5915 || CONST_STRNEQ (name, ".MIPS.post_rel"))
5917 hdr->sh_type = SHT_MIPS_EVENTS;
5918 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
5919 /* The sh_link field is set in final_write_processing. */
5921 else if (strcmp (name, ".msym") == 0)
5923 hdr->sh_type = SHT_MIPS_MSYM;
5924 hdr->sh_flags |= SHF_ALLOC;
5925 hdr->sh_entsize = 8;
5928 /* The generic elf_fake_sections will set up REL_HDR using the default
5929 kind of relocations. We used to set up a second header for the
5930 non-default kind of relocations here, but only NewABI would use
5931 these, and the IRIX ld doesn't like resulting empty RELA sections.
5932 Thus we create those header only on demand now. */
5934 return TRUE;
5937 /* Given a BFD section, try to locate the corresponding ELF section
5938 index. This is used by both the 32-bit and the 64-bit ABI.
5939 Actually, it's not clear to me that the 64-bit ABI supports these,
5940 but for non-PIC objects we will certainly want support for at least
5941 the .scommon section. */
5943 bfd_boolean
5944 _bfd_mips_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
5945 asection *sec, int *retval)
5947 if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
5949 *retval = SHN_MIPS_SCOMMON;
5950 return TRUE;
5952 if (strcmp (bfd_get_section_name (abfd, sec), ".acommon") == 0)
5954 *retval = SHN_MIPS_ACOMMON;
5955 return TRUE;
5957 return FALSE;
5960 /* Hook called by the linker routine which adds symbols from an object
5961 file. We must handle the special MIPS section numbers here. */
5963 bfd_boolean
5964 _bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
5965 Elf_Internal_Sym *sym, const char **namep,
5966 flagword *flagsp ATTRIBUTE_UNUSED,
5967 asection **secp, bfd_vma *valp)
5969 if (SGI_COMPAT (abfd)
5970 && (abfd->flags & DYNAMIC) != 0
5971 && strcmp (*namep, "_rld_new_interface") == 0)
5973 /* Skip IRIX5 rld entry name. */
5974 *namep = NULL;
5975 return TRUE;
5978 /* Shared objects may have a dynamic symbol '_gp_disp' defined as
5979 a SECTION *ABS*. This causes ld to think it can resolve _gp_disp
5980 by setting a DT_NEEDED for the shared object. Since _gp_disp is
5981 a magic symbol resolved by the linker, we ignore this bogus definition
5982 of _gp_disp. New ABI objects do not suffer from this problem so this
5983 is not done for them. */
5984 if (!NEWABI_P(abfd)
5985 && (sym->st_shndx == SHN_ABS)
5986 && (strcmp (*namep, "_gp_disp") == 0))
5988 *namep = NULL;
5989 return TRUE;
5992 switch (sym->st_shndx)
5994 case SHN_COMMON:
5995 /* Common symbols less than the GP size are automatically
5996 treated as SHN_MIPS_SCOMMON symbols. */
5997 if (sym->st_size > elf_gp_size (abfd)
5998 || ELF_ST_TYPE (sym->st_info) == STT_TLS
5999 || IRIX_COMPAT (abfd) == ict_irix6)
6000 break;
6001 /* Fall through. */
6002 case SHN_MIPS_SCOMMON:
6003 *secp = bfd_make_section_old_way (abfd, ".scommon");
6004 (*secp)->flags |= SEC_IS_COMMON;
6005 *valp = sym->st_size;
6006 break;
6008 case SHN_MIPS_TEXT:
6009 /* This section is used in a shared object. */
6010 if (elf_tdata (abfd)->elf_text_section == NULL)
6012 asymbol *elf_text_symbol;
6013 asection *elf_text_section;
6014 bfd_size_type amt = sizeof (asection);
6016 elf_text_section = bfd_zalloc (abfd, amt);
6017 if (elf_text_section == NULL)
6018 return FALSE;
6020 amt = sizeof (asymbol);
6021 elf_text_symbol = bfd_zalloc (abfd, amt);
6022 if (elf_text_symbol == NULL)
6023 return FALSE;
6025 /* Initialize the section. */
6027 elf_tdata (abfd)->elf_text_section = elf_text_section;
6028 elf_tdata (abfd)->elf_text_symbol = elf_text_symbol;
6030 elf_text_section->symbol = elf_text_symbol;
6031 elf_text_section->symbol_ptr_ptr = &elf_tdata (abfd)->elf_text_symbol;
6033 elf_text_section->name = ".text";
6034 elf_text_section->flags = SEC_NO_FLAGS;
6035 elf_text_section->output_section = NULL;
6036 elf_text_section->owner = abfd;
6037 elf_text_symbol->name = ".text";
6038 elf_text_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
6039 elf_text_symbol->section = elf_text_section;
6041 /* This code used to do *secp = bfd_und_section_ptr if
6042 info->shared. I don't know why, and that doesn't make sense,
6043 so I took it out. */
6044 *secp = elf_tdata (abfd)->elf_text_section;
6045 break;
6047 case SHN_MIPS_ACOMMON:
6048 /* Fall through. XXX Can we treat this as allocated data? */
6049 case SHN_MIPS_DATA:
6050 /* This section is used in a shared object. */
6051 if (elf_tdata (abfd)->elf_data_section == NULL)
6053 asymbol *elf_data_symbol;
6054 asection *elf_data_section;
6055 bfd_size_type amt = sizeof (asection);
6057 elf_data_section = bfd_zalloc (abfd, amt);
6058 if (elf_data_section == NULL)
6059 return FALSE;
6061 amt = sizeof (asymbol);
6062 elf_data_symbol = bfd_zalloc (abfd, amt);
6063 if (elf_data_symbol == NULL)
6064 return FALSE;
6066 /* Initialize the section. */
6068 elf_tdata (abfd)->elf_data_section = elf_data_section;
6069 elf_tdata (abfd)->elf_data_symbol = elf_data_symbol;
6071 elf_data_section->symbol = elf_data_symbol;
6072 elf_data_section->symbol_ptr_ptr = &elf_tdata (abfd)->elf_data_symbol;
6074 elf_data_section->name = ".data";
6075 elf_data_section->flags = SEC_NO_FLAGS;
6076 elf_data_section->output_section = NULL;
6077 elf_data_section->owner = abfd;
6078 elf_data_symbol->name = ".data";
6079 elf_data_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
6080 elf_data_symbol->section = elf_data_section;
6082 /* This code used to do *secp = bfd_und_section_ptr if
6083 info->shared. I don't know why, and that doesn't make sense,
6084 so I took it out. */
6085 *secp = elf_tdata (abfd)->elf_data_section;
6086 break;
6088 case SHN_MIPS_SUNDEFINED:
6089 *secp = bfd_und_section_ptr;
6090 break;
6093 if (SGI_COMPAT (abfd)
6094 && ! info->shared
6095 && info->output_bfd->xvec == abfd->xvec
6096 && strcmp (*namep, "__rld_obj_head") == 0)
6098 struct elf_link_hash_entry *h;
6099 struct bfd_link_hash_entry *bh;
6101 /* Mark __rld_obj_head as dynamic. */
6102 bh = NULL;
6103 if (! (_bfd_generic_link_add_one_symbol
6104 (info, abfd, *namep, BSF_GLOBAL, *secp, *valp, NULL, FALSE,
6105 get_elf_backend_data (abfd)->collect, &bh)))
6106 return FALSE;
6108 h = (struct elf_link_hash_entry *) bh;
6109 h->non_elf = 0;
6110 h->def_regular = 1;
6111 h->type = STT_OBJECT;
6113 if (! bfd_elf_link_record_dynamic_symbol (info, h))
6114 return FALSE;
6116 mips_elf_hash_table (info)->use_rld_obj_head = TRUE;
6119 /* If this is a mips16 text symbol, add 1 to the value to make it
6120 odd. This will cause something like .word SYM to come up with
6121 the right value when it is loaded into the PC. */
6122 if (sym->st_other == STO_MIPS16)
6123 ++*valp;
6125 return TRUE;
6128 /* This hook function is called before the linker writes out a global
6129 symbol. We mark symbols as small common if appropriate. This is
6130 also where we undo the increment of the value for a mips16 symbol. */
6132 bfd_boolean
6133 _bfd_mips_elf_link_output_symbol_hook
6134 (struct bfd_link_info *info ATTRIBUTE_UNUSED,
6135 const char *name ATTRIBUTE_UNUSED, Elf_Internal_Sym *sym,
6136 asection *input_sec, struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
6138 /* If we see a common symbol, which implies a relocatable link, then
6139 if a symbol was small common in an input file, mark it as small
6140 common in the output file. */
6141 if (sym->st_shndx == SHN_COMMON
6142 && strcmp (input_sec->name, ".scommon") == 0)
6143 sym->st_shndx = SHN_MIPS_SCOMMON;
6145 if (sym->st_other == STO_MIPS16)
6146 sym->st_value &= ~1;
6148 return TRUE;
6151 /* Functions for the dynamic linker. */
6153 /* Create dynamic sections when linking against a dynamic object. */
6155 bfd_boolean
6156 _bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
6158 struct elf_link_hash_entry *h;
6159 struct bfd_link_hash_entry *bh;
6160 flagword flags;
6161 register asection *s;
6162 const char * const *namep;
6163 struct mips_elf_link_hash_table *htab;
6165 htab = mips_elf_hash_table (info);
6166 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
6167 | SEC_LINKER_CREATED | SEC_READONLY);
6169 /* The psABI requires a read-only .dynamic section, but the VxWorks
6170 EABI doesn't. */
6171 if (!htab->is_vxworks)
6173 s = bfd_get_section_by_name (abfd, ".dynamic");
6174 if (s != NULL)
6176 if (! bfd_set_section_flags (abfd, s, flags))
6177 return FALSE;
6181 /* We need to create .got section. */
6182 if (! mips_elf_create_got_section (abfd, info, FALSE))
6183 return FALSE;
6185 if (! mips_elf_rel_dyn_section (info, TRUE))
6186 return FALSE;
6188 /* Create .stub section. */
6189 if (bfd_get_section_by_name (abfd,
6190 MIPS_ELF_STUB_SECTION_NAME (abfd)) == NULL)
6192 s = bfd_make_section_with_flags (abfd,
6193 MIPS_ELF_STUB_SECTION_NAME (abfd),
6194 flags | SEC_CODE);
6195 if (s == NULL
6196 || ! bfd_set_section_alignment (abfd, s,
6197 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
6198 return FALSE;
6201 if ((IRIX_COMPAT (abfd) == ict_irix5 || IRIX_COMPAT (abfd) == ict_none)
6202 && !info->shared
6203 && bfd_get_section_by_name (abfd, ".rld_map") == NULL)
6205 s = bfd_make_section_with_flags (abfd, ".rld_map",
6206 flags &~ (flagword) SEC_READONLY);
6207 if (s == NULL
6208 || ! bfd_set_section_alignment (abfd, s,
6209 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
6210 return FALSE;
6213 /* On IRIX5, we adjust add some additional symbols and change the
6214 alignments of several sections. There is no ABI documentation
6215 indicating that this is necessary on IRIX6, nor any evidence that
6216 the linker takes such action. */
6217 if (IRIX_COMPAT (abfd) == ict_irix5)
6219 for (namep = mips_elf_dynsym_rtproc_names; *namep != NULL; namep++)
6221 bh = NULL;
6222 if (! (_bfd_generic_link_add_one_symbol
6223 (info, abfd, *namep, BSF_GLOBAL, bfd_und_section_ptr, 0,
6224 NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
6225 return FALSE;
6227 h = (struct elf_link_hash_entry *) bh;
6228 h->non_elf = 0;
6229 h->def_regular = 1;
6230 h->type = STT_SECTION;
6232 if (! bfd_elf_link_record_dynamic_symbol (info, h))
6233 return FALSE;
6236 /* We need to create a .compact_rel section. */
6237 if (SGI_COMPAT (abfd))
6239 if (!mips_elf_create_compact_rel_section (abfd, info))
6240 return FALSE;
6243 /* Change alignments of some sections. */
6244 s = bfd_get_section_by_name (abfd, ".hash");
6245 if (s != NULL)
6246 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
6247 s = bfd_get_section_by_name (abfd, ".dynsym");
6248 if (s != NULL)
6249 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
6250 s = bfd_get_section_by_name (abfd, ".dynstr");
6251 if (s != NULL)
6252 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
6253 s = bfd_get_section_by_name (abfd, ".reginfo");
6254 if (s != NULL)
6255 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
6256 s = bfd_get_section_by_name (abfd, ".dynamic");
6257 if (s != NULL)
6258 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
6261 if (!info->shared)
6263 const char *name;
6265 name = SGI_COMPAT (abfd) ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING";
6266 bh = NULL;
6267 if (!(_bfd_generic_link_add_one_symbol
6268 (info, abfd, name, BSF_GLOBAL, bfd_abs_section_ptr, 0,
6269 NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
6270 return FALSE;
6272 h = (struct elf_link_hash_entry *) bh;
6273 h->non_elf = 0;
6274 h->def_regular = 1;
6275 h->type = STT_SECTION;
6277 if (! bfd_elf_link_record_dynamic_symbol (info, h))
6278 return FALSE;
6280 if (! mips_elf_hash_table (info)->use_rld_obj_head)
6282 /* __rld_map is a four byte word located in the .data section
6283 and is filled in by the rtld to contain a pointer to
6284 the _r_debug structure. Its symbol value will be set in
6285 _bfd_mips_elf_finish_dynamic_symbol. */
6286 s = bfd_get_section_by_name (abfd, ".rld_map");
6287 BFD_ASSERT (s != NULL);
6289 name = SGI_COMPAT (abfd) ? "__rld_map" : "__RLD_MAP";
6290 bh = NULL;
6291 if (!(_bfd_generic_link_add_one_symbol
6292 (info, abfd, name, BSF_GLOBAL, s, 0, NULL, FALSE,
6293 get_elf_backend_data (abfd)->collect, &bh)))
6294 return FALSE;
6296 h = (struct elf_link_hash_entry *) bh;
6297 h->non_elf = 0;
6298 h->def_regular = 1;
6299 h->type = STT_OBJECT;
6301 if (! bfd_elf_link_record_dynamic_symbol (info, h))
6302 return FALSE;
6306 if (htab->is_vxworks)
6308 /* Create the .plt, .rela.plt, .dynbss and .rela.bss sections.
6309 Also create the _PROCEDURE_LINKAGE_TABLE symbol. */
6310 if (!_bfd_elf_create_dynamic_sections (abfd, info))
6311 return FALSE;
6313 /* Cache the sections created above. */
6314 htab->sdynbss = bfd_get_section_by_name (abfd, ".dynbss");
6315 htab->srelbss = bfd_get_section_by_name (abfd, ".rela.bss");
6316 htab->srelplt = bfd_get_section_by_name (abfd, ".rela.plt");
6317 htab->splt = bfd_get_section_by_name (abfd, ".plt");
6318 if (!htab->sdynbss
6319 || (!htab->srelbss && !info->shared)
6320 || !htab->srelplt
6321 || !htab->splt)
6322 abort ();
6324 /* Do the usual VxWorks handling. */
6325 if (!elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
6326 return FALSE;
6328 /* Work out the PLT sizes. */
6329 if (info->shared)
6331 htab->plt_header_size
6332 = 4 * ARRAY_SIZE (mips_vxworks_shared_plt0_entry);
6333 htab->plt_entry_size
6334 = 4 * ARRAY_SIZE (mips_vxworks_shared_plt_entry);
6336 else
6338 htab->plt_header_size
6339 = 4 * ARRAY_SIZE (mips_vxworks_exec_plt0_entry);
6340 htab->plt_entry_size
6341 = 4 * ARRAY_SIZE (mips_vxworks_exec_plt_entry);
6345 return TRUE;
6348 /* Return true if relocation REL against section SEC is a REL rather than
6349 RELA relocation. RELOCS is the first relocation in the section and
6350 ABFD is the bfd that contains SEC. */
6352 static bfd_boolean
6353 mips_elf_rel_relocation_p (bfd *abfd, asection *sec,
6354 const Elf_Internal_Rela *relocs,
6355 const Elf_Internal_Rela *rel)
6357 Elf_Internal_Shdr *rel_hdr;
6358 const struct elf_backend_data *bed;
6360 /* To determine which flavor or relocation this is, we depend on the
6361 fact that the INPUT_SECTION's REL_HDR is read before its REL_HDR2. */
6362 rel_hdr = &elf_section_data (sec)->rel_hdr;
6363 bed = get_elf_backend_data (abfd);
6364 if ((size_t) (rel - relocs)
6365 >= (NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel))
6366 rel_hdr = elf_section_data (sec)->rel_hdr2;
6367 return rel_hdr->sh_entsize == MIPS_ELF_REL_SIZE (abfd);
6370 /* Read the addend for REL relocation REL, which belongs to bfd ABFD.
6371 HOWTO is the relocation's howto and CONTENTS points to the contents
6372 of the section that REL is against. */
6374 static bfd_vma
6375 mips_elf_read_rel_addend (bfd *abfd, const Elf_Internal_Rela *rel,
6376 reloc_howto_type *howto, bfd_byte *contents)
6378 bfd_byte *location;
6379 unsigned int r_type;
6380 bfd_vma addend;
6382 r_type = ELF_R_TYPE (abfd, rel->r_info);
6383 location = contents + rel->r_offset;
6385 /* Get the addend, which is stored in the input file. */
6386 _bfd_mips16_elf_reloc_unshuffle (abfd, r_type, FALSE, location);
6387 addend = mips_elf_obtain_contents (howto, rel, abfd, contents);
6388 _bfd_mips16_elf_reloc_shuffle (abfd, r_type, FALSE, location);
6390 return addend & howto->src_mask;
6393 /* REL is a relocation in ABFD that needs a partnering LO16 relocation
6394 and *ADDEND is the addend for REL itself. Look for the LO16 relocation
6395 and update *ADDEND with the final addend. Return true on success
6396 or false if the LO16 could not be found. RELEND is the exclusive
6397 upper bound on the relocations for REL's section. */
6399 static bfd_boolean
6400 mips_elf_add_lo16_rel_addend (bfd *abfd,
6401 const Elf_Internal_Rela *rel,
6402 const Elf_Internal_Rela *relend,
6403 bfd_byte *contents, bfd_vma *addend)
6405 unsigned int r_type, lo16_type;
6406 const Elf_Internal_Rela *lo16_relocation;
6407 reloc_howto_type *lo16_howto;
6408 bfd_vma l;
6410 r_type = ELF_R_TYPE (abfd, rel->r_info);
6411 if (r_type == R_MIPS16_HI16)
6412 lo16_type = R_MIPS16_LO16;
6413 else
6414 lo16_type = R_MIPS_LO16;
6416 /* The combined value is the sum of the HI16 addend, left-shifted by
6417 sixteen bits, and the LO16 addend, sign extended. (Usually, the
6418 code does a `lui' of the HI16 value, and then an `addiu' of the
6419 LO16 value.)
6421 Scan ahead to find a matching LO16 relocation.
6423 According to the MIPS ELF ABI, the R_MIPS_LO16 relocation must
6424 be immediately following. However, for the IRIX6 ABI, the next
6425 relocation may be a composed relocation consisting of several
6426 relocations for the same address. In that case, the R_MIPS_LO16
6427 relocation may occur as one of these. We permit a similar
6428 extension in general, as that is useful for GCC.
6430 In some cases GCC dead code elimination removes the LO16 but keeps
6431 the corresponding HI16. This is strictly speaking a violation of
6432 the ABI but not immediately harmful. */
6433 lo16_relocation = mips_elf_next_relocation (abfd, lo16_type, rel, relend);
6434 if (lo16_relocation == NULL)
6435 return FALSE;
6437 /* Obtain the addend kept there. */
6438 lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, lo16_type, FALSE);
6439 l = mips_elf_read_rel_addend (abfd, lo16_relocation, lo16_howto, contents);
6441 l <<= lo16_howto->rightshift;
6442 l = _bfd_mips_elf_sign_extend (l, 16);
6444 *addend <<= 16;
6445 *addend += l;
6446 return TRUE;
6449 /* Try to read the contents of section SEC in bfd ABFD. Return true and
6450 store the contents in *CONTENTS on success. Assume that *CONTENTS
6451 already holds the contents if it is nonull on entry. */
6453 static bfd_boolean
6454 mips_elf_get_section_contents (bfd *abfd, asection *sec, bfd_byte **contents)
6456 if (*contents)
6457 return TRUE;
6459 /* Get cached copy if it exists. */
6460 if (elf_section_data (sec)->this_hdr.contents != NULL)
6462 *contents = elf_section_data (sec)->this_hdr.contents;
6463 return TRUE;
6466 return bfd_malloc_and_get_section (abfd, sec, contents);
6469 /* Look through the relocs for a section during the first phase, and
6470 allocate space in the global offset table. */
6472 bfd_boolean
6473 _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
6474 asection *sec, const Elf_Internal_Rela *relocs)
6476 const char *name;
6477 bfd *dynobj;
6478 Elf_Internal_Shdr *symtab_hdr;
6479 struct elf_link_hash_entry **sym_hashes;
6480 struct mips_got_info *g;
6481 size_t extsymoff;
6482 const Elf_Internal_Rela *rel;
6483 const Elf_Internal_Rela *rel_end;
6484 asection *sgot;
6485 asection *sreloc;
6486 const struct elf_backend_data *bed;
6487 struct mips_elf_link_hash_table *htab;
6488 bfd_byte *contents;
6489 bfd_vma addend;
6490 reloc_howto_type *howto;
6492 if (info->relocatable)
6493 return TRUE;
6495 htab = mips_elf_hash_table (info);
6496 dynobj = elf_hash_table (info)->dynobj;
6497 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6498 sym_hashes = elf_sym_hashes (abfd);
6499 extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
6501 /* Check for the mips16 stub sections. */
6503 name = bfd_get_section_name (abfd, sec);
6504 if (FN_STUB_P (name))
6506 unsigned long r_symndx;
6508 /* Look at the relocation information to figure out which symbol
6509 this is for. */
6511 r_symndx = ELF_R_SYM (abfd, relocs->r_info);
6513 if (r_symndx < extsymoff
6514 || sym_hashes[r_symndx - extsymoff] == NULL)
6516 asection *o;
6518 /* This stub is for a local symbol. This stub will only be
6519 needed if there is some relocation in this BFD, other
6520 than a 16 bit function call, which refers to this symbol. */
6521 for (o = abfd->sections; o != NULL; o = o->next)
6523 Elf_Internal_Rela *sec_relocs;
6524 const Elf_Internal_Rela *r, *rend;
6526 /* We can ignore stub sections when looking for relocs. */
6527 if ((o->flags & SEC_RELOC) == 0
6528 || o->reloc_count == 0
6529 || mips16_stub_section_p (abfd, o))
6530 continue;
6532 sec_relocs
6533 = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
6534 info->keep_memory);
6535 if (sec_relocs == NULL)
6536 return FALSE;
6538 rend = sec_relocs + o->reloc_count;
6539 for (r = sec_relocs; r < rend; r++)
6540 if (ELF_R_SYM (abfd, r->r_info) == r_symndx
6541 && ELF_R_TYPE (abfd, r->r_info) != R_MIPS16_26)
6542 break;
6544 if (elf_section_data (o)->relocs != sec_relocs)
6545 free (sec_relocs);
6547 if (r < rend)
6548 break;
6551 if (o == NULL)
6553 /* There is no non-call reloc for this stub, so we do
6554 not need it. Since this function is called before
6555 the linker maps input sections to output sections, we
6556 can easily discard it by setting the SEC_EXCLUDE
6557 flag. */
6558 sec->flags |= SEC_EXCLUDE;
6559 return TRUE;
6562 /* Record this stub in an array of local symbol stubs for
6563 this BFD. */
6564 if (elf_tdata (abfd)->local_stubs == NULL)
6566 unsigned long symcount;
6567 asection **n;
6568 bfd_size_type amt;
6570 if (elf_bad_symtab (abfd))
6571 symcount = NUM_SHDR_ENTRIES (symtab_hdr);
6572 else
6573 symcount = symtab_hdr->sh_info;
6574 amt = symcount * sizeof (asection *);
6575 n = bfd_zalloc (abfd, amt);
6576 if (n == NULL)
6577 return FALSE;
6578 elf_tdata (abfd)->local_stubs = n;
6581 sec->flags |= SEC_KEEP;
6582 elf_tdata (abfd)->local_stubs[r_symndx] = sec;
6584 /* We don't need to set mips16_stubs_seen in this case.
6585 That flag is used to see whether we need to look through
6586 the global symbol table for stubs. We don't need to set
6587 it here, because we just have a local stub. */
6589 else
6591 struct mips_elf_link_hash_entry *h;
6593 h = ((struct mips_elf_link_hash_entry *)
6594 sym_hashes[r_symndx - extsymoff]);
6596 while (h->root.root.type == bfd_link_hash_indirect
6597 || h->root.root.type == bfd_link_hash_warning)
6598 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
6600 /* H is the symbol this stub is for. */
6602 /* If we already have an appropriate stub for this function, we
6603 don't need another one, so we can discard this one. Since
6604 this function is called before the linker maps input sections
6605 to output sections, we can easily discard it by setting the
6606 SEC_EXCLUDE flag. */
6607 if (h->fn_stub != NULL)
6609 sec->flags |= SEC_EXCLUDE;
6610 return TRUE;
6613 sec->flags |= SEC_KEEP;
6614 h->fn_stub = sec;
6615 mips_elf_hash_table (info)->mips16_stubs_seen = TRUE;
6618 else if (CALL_STUB_P (name) || CALL_FP_STUB_P (name))
6620 unsigned long r_symndx;
6621 struct mips_elf_link_hash_entry *h;
6622 asection **loc;
6624 /* Look at the relocation information to figure out which symbol
6625 this is for. */
6627 r_symndx = ELF_R_SYM (abfd, relocs->r_info);
6629 if (r_symndx < extsymoff
6630 || sym_hashes[r_symndx - extsymoff] == NULL)
6632 asection *o;
6634 /* This stub is for a local symbol. This stub will only be
6635 needed if there is some relocation (R_MIPS16_26) in this BFD
6636 that refers to this symbol. */
6637 for (o = abfd->sections; o != NULL; o = o->next)
6639 Elf_Internal_Rela *sec_relocs;
6640 const Elf_Internal_Rela *r, *rend;
6642 /* We can ignore stub sections when looking for relocs. */
6643 if ((o->flags & SEC_RELOC) == 0
6644 || o->reloc_count == 0
6645 || mips16_stub_section_p (abfd, o))
6646 continue;
6648 sec_relocs
6649 = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
6650 info->keep_memory);
6651 if (sec_relocs == NULL)
6652 return FALSE;
6654 rend = sec_relocs + o->reloc_count;
6655 for (r = sec_relocs; r < rend; r++)
6656 if (ELF_R_SYM (abfd, r->r_info) == r_symndx
6657 && ELF_R_TYPE (abfd, r->r_info) == R_MIPS16_26)
6658 break;
6660 if (elf_section_data (o)->relocs != sec_relocs)
6661 free (sec_relocs);
6663 if (r < rend)
6664 break;
6667 if (o == NULL)
6669 /* There is no non-call reloc for this stub, so we do
6670 not need it. Since this function is called before
6671 the linker maps input sections to output sections, we
6672 can easily discard it by setting the SEC_EXCLUDE
6673 flag. */
6674 sec->flags |= SEC_EXCLUDE;
6675 return TRUE;
6678 /* Record this stub in an array of local symbol call_stubs for
6679 this BFD. */
6680 if (elf_tdata (abfd)->local_call_stubs == NULL)
6682 unsigned long symcount;
6683 asection **n;
6684 bfd_size_type amt;
6686 if (elf_bad_symtab (abfd))
6687 symcount = NUM_SHDR_ENTRIES (symtab_hdr);
6688 else
6689 symcount = symtab_hdr->sh_info;
6690 amt = symcount * sizeof (asection *);
6691 n = bfd_zalloc (abfd, amt);
6692 if (n == NULL)
6693 return FALSE;
6694 elf_tdata (abfd)->local_call_stubs = n;
6697 sec->flags |= SEC_KEEP;
6698 elf_tdata (abfd)->local_call_stubs[r_symndx] = sec;
6700 /* We don't need to set mips16_stubs_seen in this case.
6701 That flag is used to see whether we need to look through
6702 the global symbol table for stubs. We don't need to set
6703 it here, because we just have a local stub. */
6705 else
6707 h = ((struct mips_elf_link_hash_entry *)
6708 sym_hashes[r_symndx - extsymoff]);
6710 /* H is the symbol this stub is for. */
6712 if (CALL_FP_STUB_P (name))
6713 loc = &h->call_fp_stub;
6714 else
6715 loc = &h->call_stub;
6717 /* If we already have an appropriate stub for this function, we
6718 don't need another one, so we can discard this one. Since
6719 this function is called before the linker maps input sections
6720 to output sections, we can easily discard it by setting the
6721 SEC_EXCLUDE flag. */
6722 if (*loc != NULL)
6724 sec->flags |= SEC_EXCLUDE;
6725 return TRUE;
6728 sec->flags |= SEC_KEEP;
6729 *loc = sec;
6730 mips_elf_hash_table (info)->mips16_stubs_seen = TRUE;
6734 if (dynobj == NULL)
6736 sgot = NULL;
6737 g = NULL;
6739 else
6741 sgot = mips_elf_got_section (dynobj, FALSE);
6742 if (sgot == NULL)
6743 g = NULL;
6744 else
6746 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
6747 g = mips_elf_section_data (sgot)->u.got_info;
6748 BFD_ASSERT (g != NULL);
6752 sreloc = NULL;
6753 bed = get_elf_backend_data (abfd);
6754 rel_end = relocs + sec->reloc_count * bed->s->int_rels_per_ext_rel;
6755 contents = NULL;
6756 for (rel = relocs; rel < rel_end; ++rel)
6758 unsigned long r_symndx;
6759 unsigned int r_type;
6760 struct elf_link_hash_entry *h;
6762 r_symndx = ELF_R_SYM (abfd, rel->r_info);
6763 r_type = ELF_R_TYPE (abfd, rel->r_info);
6765 if (r_symndx < extsymoff)
6766 h = NULL;
6767 else if (r_symndx >= extsymoff + NUM_SHDR_ENTRIES (symtab_hdr))
6769 (*_bfd_error_handler)
6770 (_("%B: Malformed reloc detected for section %s"),
6771 abfd, name);
6772 bfd_set_error (bfd_error_bad_value);
6773 return FALSE;
6775 else
6777 h = sym_hashes[r_symndx - extsymoff];
6779 /* This may be an indirect symbol created because of a version. */
6780 if (h != NULL)
6782 while (h->root.type == bfd_link_hash_indirect)
6783 h = (struct elf_link_hash_entry *) h->root.u.i.link;
6787 /* Some relocs require a global offset table. */
6788 if (dynobj == NULL || sgot == NULL)
6790 switch (r_type)
6792 case R_MIPS_GOT16:
6793 case R_MIPS_CALL16:
6794 case R_MIPS_CALL_HI16:
6795 case R_MIPS_CALL_LO16:
6796 case R_MIPS_GOT_HI16:
6797 case R_MIPS_GOT_LO16:
6798 case R_MIPS_GOT_PAGE:
6799 case R_MIPS_GOT_OFST:
6800 case R_MIPS_GOT_DISP:
6801 case R_MIPS_TLS_GOTTPREL:
6802 case R_MIPS_TLS_GD:
6803 case R_MIPS_TLS_LDM:
6804 if (dynobj == NULL)
6805 elf_hash_table (info)->dynobj = dynobj = abfd;
6806 if (! mips_elf_create_got_section (dynobj, info, FALSE))
6807 return FALSE;
6808 g = mips_elf_got_info (dynobj, &sgot);
6809 if (htab->is_vxworks && !info->shared)
6811 (*_bfd_error_handler)
6812 (_("%B: GOT reloc at 0x%lx not expected in executables"),
6813 abfd, (unsigned long) rel->r_offset);
6814 bfd_set_error (bfd_error_bad_value);
6815 return FALSE;
6817 break;
6819 case R_MIPS_32:
6820 case R_MIPS_REL32:
6821 case R_MIPS_64:
6822 /* In VxWorks executables, references to external symbols
6823 are handled using copy relocs or PLT stubs, so there's
6824 no need to add a dynamic relocation here. */
6825 if (dynobj == NULL
6826 && (info->shared || (h != NULL && !htab->is_vxworks))
6827 && (sec->flags & SEC_ALLOC) != 0)
6828 elf_hash_table (info)->dynobj = dynobj = abfd;
6829 break;
6831 default:
6832 break;
6836 if (h)
6838 ((struct mips_elf_link_hash_entry *) h)->is_relocation_target = TRUE;
6840 /* Relocations against the special VxWorks __GOTT_BASE__ and
6841 __GOTT_INDEX__ symbols must be left to the loader. Allocate
6842 room for them in .rela.dyn. */
6843 if (is_gott_symbol (info, h))
6845 if (sreloc == NULL)
6847 sreloc = mips_elf_rel_dyn_section (info, TRUE);
6848 if (sreloc == NULL)
6849 return FALSE;
6851 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
6852 if (MIPS_ELF_READONLY_SECTION (sec))
6853 /* We tell the dynamic linker that there are
6854 relocations against the text segment. */
6855 info->flags |= DF_TEXTREL;
6858 else if (r_type == R_MIPS_CALL_LO16
6859 || r_type == R_MIPS_GOT_LO16
6860 || r_type == R_MIPS_GOT_DISP
6861 || (r_type == R_MIPS_GOT16 && htab->is_vxworks))
6863 /* We may need a local GOT entry for this relocation. We
6864 don't count R_MIPS_GOT_PAGE because we can estimate the
6865 maximum number of pages needed by looking at the size of
6866 the segment. Similar comments apply to R_MIPS_GOT16 and
6867 R_MIPS_CALL16, except on VxWorks, where GOT relocations
6868 always evaluate to "G". We don't count R_MIPS_GOT_HI16, or
6869 R_MIPS_CALL_HI16 because these are always followed by an
6870 R_MIPS_GOT_LO16 or R_MIPS_CALL_LO16. */
6871 if (! mips_elf_record_local_got_symbol (abfd, r_symndx,
6872 rel->r_addend, g, 0))
6873 return FALSE;
6876 switch (r_type)
6878 case R_MIPS_CALL16:
6879 if (h == NULL)
6881 (*_bfd_error_handler)
6882 (_("%B: CALL16 reloc at 0x%lx not against global symbol"),
6883 abfd, (unsigned long) rel->r_offset);
6884 bfd_set_error (bfd_error_bad_value);
6885 return FALSE;
6887 /* Fall through. */
6889 case R_MIPS_CALL_HI16:
6890 case R_MIPS_CALL_LO16:
6891 if (h != NULL)
6893 /* VxWorks call relocations point the function's .got.plt
6894 entry, which will be allocated by adjust_dynamic_symbol.
6895 Otherwise, this symbol requires a global GOT entry. */
6896 if ((!htab->is_vxworks || h->forced_local)
6897 && !mips_elf_record_global_got_symbol (h, abfd, info, g, 0))
6898 return FALSE;
6900 /* We need a stub, not a plt entry for the undefined
6901 function. But we record it as if it needs plt. See
6902 _bfd_elf_adjust_dynamic_symbol. */
6903 h->needs_plt = 1;
6904 h->type = STT_FUNC;
6906 break;
6908 case R_MIPS_GOT_PAGE:
6909 /* If this is a global, overridable symbol, GOT_PAGE will
6910 decay to GOT_DISP, so we'll need a GOT entry for it. */
6911 if (h)
6913 struct mips_elf_link_hash_entry *hmips =
6914 (struct mips_elf_link_hash_entry *) h;
6916 while (hmips->root.root.type == bfd_link_hash_indirect
6917 || hmips->root.root.type == bfd_link_hash_warning)
6918 hmips = (struct mips_elf_link_hash_entry *)
6919 hmips->root.root.u.i.link;
6921 /* This symbol is definitely not overridable. */
6922 if (hmips->root.def_regular
6923 && ! (info->shared && ! info->symbolic
6924 && ! hmips->root.forced_local))
6925 h = NULL;
6927 /* Fall through. */
6929 case R_MIPS_GOT16:
6930 case R_MIPS_GOT_HI16:
6931 case R_MIPS_GOT_LO16:
6932 if (!h || r_type == R_MIPS_GOT_PAGE)
6934 /* This relocation needs (or may need, if h != NULL) a
6935 page entry in the GOT. For R_MIPS_GOT_PAGE we do not
6936 know for sure until we know whether the symbol is
6937 preemptible. */
6938 if (mips_elf_rel_relocation_p (abfd, sec, relocs, rel))
6940 if (!mips_elf_get_section_contents (abfd, sec, &contents))
6941 return FALSE;
6942 howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, r_type, FALSE);
6943 addend = mips_elf_read_rel_addend (abfd, rel,
6944 howto, contents);
6945 if (r_type == R_MIPS_GOT16)
6946 mips_elf_add_lo16_rel_addend (abfd, rel, rel_end,
6947 contents, &addend);
6948 else
6949 addend <<= howto->rightshift;
6951 else
6952 addend = rel->r_addend;
6953 if (!mips_elf_record_got_page_entry (abfd, r_symndx, addend, g))
6954 return FALSE;
6955 break;
6957 /* Fall through. */
6959 case R_MIPS_GOT_DISP:
6960 if (h && ! mips_elf_record_global_got_symbol (h, abfd, info, g, 0))
6961 return FALSE;
6962 break;
6964 case R_MIPS_TLS_GOTTPREL:
6965 if (info->shared)
6966 info->flags |= DF_STATIC_TLS;
6967 /* Fall through */
6969 case R_MIPS_TLS_LDM:
6970 if (r_type == R_MIPS_TLS_LDM)
6972 r_symndx = 0;
6973 h = NULL;
6975 /* Fall through */
6977 case R_MIPS_TLS_GD:
6978 /* This symbol requires a global offset table entry, or two
6979 for TLS GD relocations. */
6981 unsigned char flag = (r_type == R_MIPS_TLS_GD
6982 ? GOT_TLS_GD
6983 : r_type == R_MIPS_TLS_LDM
6984 ? GOT_TLS_LDM
6985 : GOT_TLS_IE);
6986 if (h != NULL)
6988 struct mips_elf_link_hash_entry *hmips =
6989 (struct mips_elf_link_hash_entry *) h;
6990 hmips->tls_type |= flag;
6992 if (h && ! mips_elf_record_global_got_symbol (h, abfd, info, g, flag))
6993 return FALSE;
6995 else
6997 BFD_ASSERT (flag == GOT_TLS_LDM || r_symndx != 0);
6999 if (! mips_elf_record_local_got_symbol (abfd, r_symndx,
7000 rel->r_addend, g, flag))
7001 return FALSE;
7004 break;
7006 case R_MIPS_32:
7007 case R_MIPS_REL32:
7008 case R_MIPS_64:
7009 /* In VxWorks executables, references to external symbols
7010 are handled using copy relocs or PLT stubs, so there's
7011 no need to add a .rela.dyn entry for this relocation. */
7012 if ((info->shared || (h != NULL && !htab->is_vxworks))
7013 && (sec->flags & SEC_ALLOC) != 0)
7015 if (sreloc == NULL)
7017 sreloc = mips_elf_rel_dyn_section (info, TRUE);
7018 if (sreloc == NULL)
7019 return FALSE;
7021 if (info->shared)
7023 /* When creating a shared object, we must copy these
7024 reloc types into the output file as R_MIPS_REL32
7025 relocs. Make room for this reloc in .rel(a).dyn. */
7026 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
7027 if (MIPS_ELF_READONLY_SECTION (sec))
7028 /* We tell the dynamic linker that there are
7029 relocations against the text segment. */
7030 info->flags |= DF_TEXTREL;
7032 else
7034 struct mips_elf_link_hash_entry *hmips;
7036 /* We only need to copy this reloc if the symbol is
7037 defined in a dynamic object. */
7038 hmips = (struct mips_elf_link_hash_entry *) h;
7039 ++hmips->possibly_dynamic_relocs;
7040 if (MIPS_ELF_READONLY_SECTION (sec))
7041 /* We need it to tell the dynamic linker if there
7042 are relocations against the text segment. */
7043 hmips->readonly_reloc = TRUE;
7046 /* Even though we don't directly need a GOT entry for
7047 this symbol, a symbol must have a dynamic symbol
7048 table index greater that DT_MIPS_GOTSYM if there are
7049 dynamic relocations against it. This does not apply
7050 to VxWorks, which does not have the usual coupling
7051 between global GOT entries and .dynsym entries. */
7052 if (h != NULL && !htab->is_vxworks)
7054 if (dynobj == NULL)
7055 elf_hash_table (info)->dynobj = dynobj = abfd;
7056 if (! mips_elf_create_got_section (dynobj, info, TRUE))
7057 return FALSE;
7058 g = mips_elf_got_info (dynobj, &sgot);
7059 if (! mips_elf_record_global_got_symbol (h, abfd, info, g, 0))
7060 return FALSE;
7064 if (SGI_COMPAT (abfd))
7065 mips_elf_hash_table (info)->compact_rel_size +=
7066 sizeof (Elf32_External_crinfo);
7067 break;
7069 case R_MIPS_PC16:
7070 if (h)
7071 ((struct mips_elf_link_hash_entry *) h)->is_branch_target = TRUE;
7072 break;
7074 case R_MIPS_26:
7075 if (h)
7076 ((struct mips_elf_link_hash_entry *) h)->is_branch_target = TRUE;
7077 /* Fall through. */
7079 case R_MIPS_GPREL16:
7080 case R_MIPS_LITERAL:
7081 case R_MIPS_GPREL32:
7082 if (SGI_COMPAT (abfd))
7083 mips_elf_hash_table (info)->compact_rel_size +=
7084 sizeof (Elf32_External_crinfo);
7085 break;
7087 /* This relocation describes the C++ object vtable hierarchy.
7088 Reconstruct it for later use during GC. */
7089 case R_MIPS_GNU_VTINHERIT:
7090 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
7091 return FALSE;
7092 break;
7094 /* This relocation describes which C++ vtable entries are actually
7095 used. Record for later use during GC. */
7096 case R_MIPS_GNU_VTENTRY:
7097 BFD_ASSERT (h != NULL);
7098 if (h != NULL
7099 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
7100 return FALSE;
7101 break;
7103 default:
7104 break;
7107 /* We must not create a stub for a symbol that has relocations
7108 related to taking the function's address. This doesn't apply to
7109 VxWorks, where CALL relocs refer to a .got.plt entry instead of
7110 a normal .got entry. */
7111 if (!htab->is_vxworks && h != NULL)
7112 switch (r_type)
7114 default:
7115 ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = TRUE;
7116 break;
7117 case R_MIPS_CALL16:
7118 case R_MIPS_CALL_HI16:
7119 case R_MIPS_CALL_LO16:
7120 case R_MIPS_JALR:
7121 break;
7124 /* If this reloc is not a 16 bit call, and it has a global
7125 symbol, then we will need the fn_stub if there is one.
7126 References from a stub section do not count. */
7127 if (h != NULL
7128 && r_type != R_MIPS16_26
7129 && !mips16_stub_section_p (abfd, sec))
7131 struct mips_elf_link_hash_entry *mh;
7133 mh = (struct mips_elf_link_hash_entry *) h;
7134 mh->need_fn_stub = TRUE;
7138 return TRUE;
7141 bfd_boolean
7142 _bfd_mips_relax_section (bfd *abfd, asection *sec,
7143 struct bfd_link_info *link_info,
7144 bfd_boolean *again)
7146 Elf_Internal_Rela *internal_relocs;
7147 Elf_Internal_Rela *irel, *irelend;
7148 Elf_Internal_Shdr *symtab_hdr;
7149 bfd_byte *contents = NULL;
7150 size_t extsymoff;
7151 bfd_boolean changed_contents = FALSE;
7152 bfd_vma sec_start = sec->output_section->vma + sec->output_offset;
7153 Elf_Internal_Sym *isymbuf = NULL;
7155 /* We are not currently changing any sizes, so only one pass. */
7156 *again = FALSE;
7158 if (link_info->relocatable)
7159 return TRUE;
7161 internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
7162 link_info->keep_memory);
7163 if (internal_relocs == NULL)
7164 return TRUE;
7166 irelend = internal_relocs + sec->reloc_count
7167 * get_elf_backend_data (abfd)->s->int_rels_per_ext_rel;
7168 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
7169 extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
7171 for (irel = internal_relocs; irel < irelend; irel++)
7173 bfd_vma symval;
7174 bfd_signed_vma sym_offset;
7175 unsigned int r_type;
7176 unsigned long r_symndx;
7177 asection *sym_sec;
7178 unsigned long instruction;
7180 /* Turn jalr into bgezal, and jr into beq, if they're marked
7181 with a JALR relocation, that indicate where they jump to.
7182 This saves some pipeline bubbles. */
7183 r_type = ELF_R_TYPE (abfd, irel->r_info);
7184 if (r_type != R_MIPS_JALR)
7185 continue;
7187 r_symndx = ELF_R_SYM (abfd, irel->r_info);
7188 /* Compute the address of the jump target. */
7189 if (r_symndx >= extsymoff)
7191 struct mips_elf_link_hash_entry *h
7192 = ((struct mips_elf_link_hash_entry *)
7193 elf_sym_hashes (abfd) [r_symndx - extsymoff]);
7195 while (h->root.root.type == bfd_link_hash_indirect
7196 || h->root.root.type == bfd_link_hash_warning)
7197 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
7199 /* If a symbol is undefined, or if it may be overridden,
7200 skip it. */
7201 if (! ((h->root.root.type == bfd_link_hash_defined
7202 || h->root.root.type == bfd_link_hash_defweak)
7203 && h->root.root.u.def.section)
7204 || (link_info->shared && ! link_info->symbolic
7205 && !h->root.forced_local))
7206 continue;
7208 sym_sec = h->root.root.u.def.section;
7209 if (sym_sec->output_section)
7210 symval = (h->root.root.u.def.value
7211 + sym_sec->output_section->vma
7212 + sym_sec->output_offset);
7213 else
7214 symval = h->root.root.u.def.value;
7216 else
7218 Elf_Internal_Sym *isym;
7220 /* Read this BFD's symbols if we haven't done so already. */
7221 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
7223 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
7224 if (isymbuf == NULL)
7225 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
7226 symtab_hdr->sh_info, 0,
7227 NULL, NULL, NULL);
7228 if (isymbuf == NULL)
7229 goto relax_return;
7232 isym = isymbuf + r_symndx;
7233 if (isym->st_shndx == SHN_UNDEF)
7234 continue;
7235 else if (isym->st_shndx == SHN_ABS)
7236 sym_sec = bfd_abs_section_ptr;
7237 else if (isym->st_shndx == SHN_COMMON)
7238 sym_sec = bfd_com_section_ptr;
7239 else
7240 sym_sec
7241 = bfd_section_from_elf_index (abfd, isym->st_shndx);
7242 symval = isym->st_value
7243 + sym_sec->output_section->vma
7244 + sym_sec->output_offset;
7247 /* Compute branch offset, from delay slot of the jump to the
7248 branch target. */
7249 sym_offset = (symval + irel->r_addend)
7250 - (sec_start + irel->r_offset + 4);
7252 /* Branch offset must be properly aligned. */
7253 if ((sym_offset & 3) != 0)
7254 continue;
7256 sym_offset >>= 2;
7258 /* Check that it's in range. */
7259 if (sym_offset < -0x8000 || sym_offset >= 0x8000)
7260 continue;
7262 /* Get the section contents if we haven't done so already. */
7263 if (!mips_elf_get_section_contents (abfd, sec, &contents))
7264 goto relax_return;
7266 instruction = bfd_get_32 (abfd, contents + irel->r_offset);
7268 /* If it was jalr <reg>, turn it into bgezal $zero, <target>. */
7269 if ((instruction & 0xfc1fffff) == 0x0000f809)
7270 instruction = 0x04110000;
7271 /* If it was jr <reg>, turn it into b <target>. */
7272 else if ((instruction & 0xfc1fffff) == 0x00000008)
7273 instruction = 0x10000000;
7274 else
7275 continue;
7277 instruction |= (sym_offset & 0xffff);
7278 bfd_put_32 (abfd, instruction, contents + irel->r_offset);
7279 changed_contents = TRUE;
7282 if (contents != NULL
7283 && elf_section_data (sec)->this_hdr.contents != contents)
7285 if (!changed_contents && !link_info->keep_memory)
7286 free (contents);
7287 else
7289 /* Cache the section contents for elf_link_input_bfd. */
7290 elf_section_data (sec)->this_hdr.contents = contents;
7293 return TRUE;
7295 relax_return:
7296 if (contents != NULL
7297 && elf_section_data (sec)->this_hdr.contents != contents)
7298 free (contents);
7299 return FALSE;
7302 /* Adjust a symbol defined by a dynamic object and referenced by a
7303 regular object. The current definition is in some section of the
7304 dynamic object, but we're not including those sections. We have to
7305 change the definition to something the rest of the link can
7306 understand. */
7308 bfd_boolean
7309 _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
7310 struct elf_link_hash_entry *h)
7312 bfd *dynobj;
7313 struct mips_elf_link_hash_entry *hmips;
7314 asection *s;
7315 struct mips_elf_link_hash_table *htab;
7317 htab = mips_elf_hash_table (info);
7318 dynobj = elf_hash_table (info)->dynobj;
7320 /* Make sure we know what is going on here. */
7321 BFD_ASSERT (dynobj != NULL
7322 && (h->needs_plt
7323 || h->u.weakdef != NULL
7324 || (h->def_dynamic
7325 && h->ref_regular
7326 && !h->def_regular)));
7328 /* If this symbol is defined in a dynamic object, we need to copy
7329 any R_MIPS_32 or R_MIPS_REL32 relocs against it into the output
7330 file. */
7331 hmips = (struct mips_elf_link_hash_entry *) h;
7332 if (! info->relocatable
7333 && hmips->possibly_dynamic_relocs != 0
7334 && (h->root.type == bfd_link_hash_defweak
7335 || !h->def_regular))
7337 mips_elf_allocate_dynamic_relocations
7338 (dynobj, info, hmips->possibly_dynamic_relocs);
7339 if (hmips->readonly_reloc)
7340 /* We tell the dynamic linker that there are relocations
7341 against the text segment. */
7342 info->flags |= DF_TEXTREL;
7345 /* For a function, create a stub, if allowed. */
7346 if (! hmips->no_fn_stub
7347 && h->needs_plt)
7349 if (! elf_hash_table (info)->dynamic_sections_created)
7350 return TRUE;
7352 /* If this symbol is not defined in a regular file, then set
7353 the symbol to the stub location. This is required to make
7354 function pointers compare as equal between the normal
7355 executable and the shared library. */
7356 if (!h->def_regular)
7358 /* We need .stub section. */
7359 s = bfd_get_section_by_name (dynobj,
7360 MIPS_ELF_STUB_SECTION_NAME (dynobj));
7361 BFD_ASSERT (s != NULL);
7363 h->root.u.def.section = s;
7364 h->root.u.def.value = s->size;
7366 /* XXX Write this stub address somewhere. */
7367 h->plt.offset = s->size;
7369 /* Make room for this stub code. */
7370 s->size += htab->function_stub_size;
7372 /* The last half word of the stub will be filled with the index
7373 of this symbol in .dynsym section. */
7374 return TRUE;
7377 else if ((h->type == STT_FUNC)
7378 && !h->needs_plt)
7380 /* This will set the entry for this symbol in the GOT to 0, and
7381 the dynamic linker will take care of this. */
7382 h->root.u.def.value = 0;
7383 return TRUE;
7386 /* If this is a weak symbol, and there is a real definition, the
7387 processor independent code will have arranged for us to see the
7388 real definition first, and we can just use the same value. */
7389 if (h->u.weakdef != NULL)
7391 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
7392 || h->u.weakdef->root.type == bfd_link_hash_defweak);
7393 h->root.u.def.section = h->u.weakdef->root.u.def.section;
7394 h->root.u.def.value = h->u.weakdef->root.u.def.value;
7395 return TRUE;
7398 /* This is a reference to a symbol defined by a dynamic object which
7399 is not a function. */
7401 return TRUE;
7404 /* Likewise, for VxWorks. */
7406 bfd_boolean
7407 _bfd_mips_vxworks_adjust_dynamic_symbol (struct bfd_link_info *info,
7408 struct elf_link_hash_entry *h)
7410 bfd *dynobj;
7411 struct mips_elf_link_hash_entry *hmips;
7412 struct mips_elf_link_hash_table *htab;
7414 htab = mips_elf_hash_table (info);
7415 dynobj = elf_hash_table (info)->dynobj;
7416 hmips = (struct mips_elf_link_hash_entry *) h;
7418 /* Make sure we know what is going on here. */
7419 BFD_ASSERT (dynobj != NULL
7420 && (h->needs_plt
7421 || h->needs_copy
7422 || h->u.weakdef != NULL
7423 || (h->def_dynamic
7424 && h->ref_regular
7425 && !h->def_regular)));
7427 /* If the symbol is defined by a dynamic object, we need a PLT stub if
7428 either (a) we want to branch to the symbol or (b) we're linking an
7429 executable that needs a canonical function address. In the latter
7430 case, the canonical address will be the address of the executable's
7431 load stub. */
7432 if ((hmips->is_branch_target
7433 || (!info->shared
7434 && h->type == STT_FUNC
7435 && hmips->is_relocation_target))
7436 && h->def_dynamic
7437 && h->ref_regular
7438 && !h->def_regular
7439 && !h->forced_local)
7440 h->needs_plt = 1;
7442 /* Locally-binding symbols do not need a PLT stub; we can refer to
7443 the functions directly. */
7444 else if (h->needs_plt
7445 && (SYMBOL_CALLS_LOCAL (info, h)
7446 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
7447 && h->root.type == bfd_link_hash_undefweak)))
7449 h->needs_plt = 0;
7450 return TRUE;
7453 if (h->needs_plt)
7455 /* If this is the first symbol to need a PLT entry, allocate room
7456 for the header, and for the header's .rela.plt.unloaded entries. */
7457 if (htab->splt->size == 0)
7459 htab->splt->size += htab->plt_header_size;
7460 if (!info->shared)
7461 htab->srelplt2->size += 2 * sizeof (Elf32_External_Rela);
7464 /* Assign the next .plt entry to this symbol. */
7465 h->plt.offset = htab->splt->size;
7466 htab->splt->size += htab->plt_entry_size;
7468 /* If the output file has no definition of the symbol, set the
7469 symbol's value to the address of the stub. For executables,
7470 point at the PLT load stub rather than the lazy resolution stub;
7471 this stub will become the canonical function address. */
7472 if (!h->def_regular)
7474 h->root.u.def.section = htab->splt;
7475 h->root.u.def.value = h->plt.offset;
7476 if (!info->shared)
7477 h->root.u.def.value += 8;
7480 /* Make room for the .got.plt entry and the R_JUMP_SLOT relocation. */
7481 htab->sgotplt->size += 4;
7482 htab->srelplt->size += sizeof (Elf32_External_Rela);
7484 /* Make room for the .rela.plt.unloaded relocations. */
7485 if (!info->shared)
7486 htab->srelplt2->size += 3 * sizeof (Elf32_External_Rela);
7488 return TRUE;
7491 /* If a function symbol is defined by a dynamic object, and we do not
7492 need a PLT stub for it, the symbol's value should be zero. */
7493 if (h->type == STT_FUNC
7494 && h->def_dynamic
7495 && h->ref_regular
7496 && !h->def_regular)
7498 h->root.u.def.value = 0;
7499 return TRUE;
7502 /* If this is a weak symbol, and there is a real definition, the
7503 processor independent code will have arranged for us to see the
7504 real definition first, and we can just use the same value. */
7505 if (h->u.weakdef != NULL)
7507 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
7508 || h->u.weakdef->root.type == bfd_link_hash_defweak);
7509 h->root.u.def.section = h->u.weakdef->root.u.def.section;
7510 h->root.u.def.value = h->u.weakdef->root.u.def.value;
7511 return TRUE;
7514 /* This is a reference to a symbol defined by a dynamic object which
7515 is not a function. */
7516 if (info->shared)
7517 return TRUE;
7519 /* We must allocate the symbol in our .dynbss section, which will
7520 become part of the .bss section of the executable. There will be
7521 an entry for this symbol in the .dynsym section. The dynamic
7522 object will contain position independent code, so all references
7523 from the dynamic object to this symbol will go through the global
7524 offset table. The dynamic linker will use the .dynsym entry to
7525 determine the address it must put in the global offset table, so
7526 both the dynamic object and the regular object will refer to the
7527 same memory location for the variable. */
7529 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
7531 htab->srelbss->size += sizeof (Elf32_External_Rela);
7532 h->needs_copy = 1;
7535 return _bfd_elf_adjust_dynamic_copy (h, htab->sdynbss);
7538 /* Return the number of dynamic section symbols required by OUTPUT_BFD.
7539 The number might be exact or a worst-case estimate, depending on how
7540 much information is available to elf_backend_omit_section_dynsym at
7541 the current linking stage. */
7543 static bfd_size_type
7544 count_section_dynsyms (bfd *output_bfd, struct bfd_link_info *info)
7546 bfd_size_type count;
7548 count = 0;
7549 if (info->shared || elf_hash_table (info)->is_relocatable_executable)
7551 asection *p;
7552 const struct elf_backend_data *bed;
7554 bed = get_elf_backend_data (output_bfd);
7555 for (p = output_bfd->sections; p ; p = p->next)
7556 if ((p->flags & SEC_EXCLUDE) == 0
7557 && (p->flags & SEC_ALLOC) != 0
7558 && !(*bed->elf_backend_omit_section_dynsym) (output_bfd, info, p))
7559 ++count;
7561 return count;
7564 /* This function is called after all the input files have been read,
7565 and the input sections have been assigned to output sections. We
7566 check for any mips16 stub sections that we can discard. */
7568 bfd_boolean
7569 _bfd_mips_elf_always_size_sections (bfd *output_bfd,
7570 struct bfd_link_info *info)
7572 asection *ri;
7574 bfd *dynobj;
7575 asection *s;
7576 struct mips_got_info *g;
7577 int i;
7578 bfd_size_type loadable_size = 0;
7579 bfd_size_type page_gotno;
7580 bfd_size_type dynsymcount;
7581 bfd *sub;
7582 struct mips_elf_count_tls_arg count_tls_arg;
7583 struct mips_elf_link_hash_table *htab;
7585 htab = mips_elf_hash_table (info);
7587 /* The .reginfo section has a fixed size. */
7588 ri = bfd_get_section_by_name (output_bfd, ".reginfo");
7589 if (ri != NULL)
7590 bfd_set_section_size (output_bfd, ri, sizeof (Elf32_External_RegInfo));
7592 if (! (info->relocatable
7593 || ! mips_elf_hash_table (info)->mips16_stubs_seen))
7594 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
7595 mips_elf_check_mips16_stubs, NULL);
7597 dynobj = elf_hash_table (info)->dynobj;
7598 if (dynobj == NULL)
7599 /* Relocatable links don't have it. */
7600 return TRUE;
7602 g = mips_elf_got_info (dynobj, &s);
7603 if (s == NULL)
7604 return TRUE;
7606 /* Calculate the total loadable size of the output. That
7607 will give us the maximum number of GOT_PAGE entries
7608 required. */
7609 for (sub = info->input_bfds; sub; sub = sub->link_next)
7611 asection *subsection;
7613 for (subsection = sub->sections;
7614 subsection;
7615 subsection = subsection->next)
7617 if ((subsection->flags & SEC_ALLOC) == 0)
7618 continue;
7619 loadable_size += ((subsection->size + 0xf)
7620 &~ (bfd_size_type) 0xf);
7624 /* There has to be a global GOT entry for every symbol with
7625 a dynamic symbol table index of DT_MIPS_GOTSYM or
7626 higher. Therefore, it make sense to put those symbols
7627 that need GOT entries at the end of the symbol table. We
7628 do that here. */
7629 if (! mips_elf_sort_hash_table (info, 1))
7630 return FALSE;
7632 if (g->global_gotsym != NULL)
7633 i = elf_hash_table (info)->dynsymcount - g->global_gotsym->dynindx;
7634 else
7635 /* If there are no global symbols, or none requiring
7636 relocations, then GLOBAL_GOTSYM will be NULL. */
7637 i = 0;
7639 /* Get a worst-case estimate of the number of dynamic symbols needed.
7640 At this point, dynsymcount does not account for section symbols
7641 and count_section_dynsyms may overestimate the number that will
7642 be needed. */
7643 dynsymcount = (elf_hash_table (info)->dynsymcount
7644 + count_section_dynsyms (output_bfd, info));
7646 /* Determine the size of one stub entry. */
7647 htab->function_stub_size = (dynsymcount > 0x10000
7648 ? MIPS_FUNCTION_STUB_BIG_SIZE
7649 : MIPS_FUNCTION_STUB_NORMAL_SIZE);
7651 /* In the worst case, we'll get one stub per dynamic symbol, plus
7652 one to account for the dummy entry at the end required by IRIX
7653 rld. */
7654 loadable_size += htab->function_stub_size * (i + 1);
7656 if (htab->is_vxworks)
7657 /* There's no need to allocate page entries for VxWorks; R_MIPS_GOT16
7658 relocations against local symbols evaluate to "G", and the EABI does
7659 not include R_MIPS_GOT_PAGE. */
7660 page_gotno = 0;
7661 else
7662 /* Assume there are two loadable segments consisting of contiguous
7663 sections. Is 5 enough? */
7664 page_gotno = (loadable_size >> 16) + 5;
7666 /* Choose the smaller of the two estimates; both are intended to be
7667 conservative. */
7668 if (page_gotno > g->page_gotno)
7669 page_gotno = g->page_gotno;
7671 g->local_gotno += page_gotno;
7672 s->size += g->local_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
7674 g->global_gotno = i;
7675 s->size += i * MIPS_ELF_GOT_SIZE (output_bfd);
7677 /* We need to calculate tls_gotno for global symbols at this point
7678 instead of building it up earlier, to avoid doublecounting
7679 entries for one global symbol from multiple input files. */
7680 count_tls_arg.info = info;
7681 count_tls_arg.needed = 0;
7682 elf_link_hash_traverse (elf_hash_table (info),
7683 mips_elf_count_global_tls_entries,
7684 &count_tls_arg);
7685 g->tls_gotno += count_tls_arg.needed;
7686 s->size += g->tls_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
7688 mips_elf_resolve_final_got_entries (g);
7690 /* VxWorks does not support multiple GOTs. It initializes $gp to
7691 __GOTT_BASE__[__GOTT_INDEX__], the value of which is set by the
7692 dynamic loader. */
7693 if (!htab->is_vxworks && s->size > MIPS_ELF_GOT_MAX_SIZE (info))
7695 if (! mips_elf_multi_got (output_bfd, info, g, s, page_gotno))
7696 return FALSE;
7698 else
7700 /* Set up TLS entries for the first GOT. */
7701 g->tls_assigned_gotno = g->global_gotno + g->local_gotno;
7702 htab_traverse (g->got_entries, mips_elf_initialize_tls_index, g);
7704 htab->computed_got_sizes = TRUE;
7706 return TRUE;
7709 /* Set the sizes of the dynamic sections. */
7711 bfd_boolean
7712 _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
7713 struct bfd_link_info *info)
7715 bfd *dynobj;
7716 asection *s, *sreldyn;
7717 bfd_boolean reltext;
7718 struct mips_elf_link_hash_table *htab;
7720 htab = mips_elf_hash_table (info);
7721 dynobj = elf_hash_table (info)->dynobj;
7722 BFD_ASSERT (dynobj != NULL);
7724 if (elf_hash_table (info)->dynamic_sections_created)
7726 /* Set the contents of the .interp section to the interpreter. */
7727 if (info->executable)
7729 s = bfd_get_section_by_name (dynobj, ".interp");
7730 BFD_ASSERT (s != NULL);
7731 s->size
7732 = strlen (ELF_DYNAMIC_INTERPRETER (output_bfd)) + 1;
7733 s->contents
7734 = (bfd_byte *) ELF_DYNAMIC_INTERPRETER (output_bfd);
7738 /* The check_relocs and adjust_dynamic_symbol entry points have
7739 determined the sizes of the various dynamic sections. Allocate
7740 memory for them. */
7741 reltext = FALSE;
7742 sreldyn = NULL;
7743 for (s = dynobj->sections; s != NULL; s = s->next)
7745 const char *name;
7747 /* It's OK to base decisions on the section name, because none
7748 of the dynobj section names depend upon the input files. */
7749 name = bfd_get_section_name (dynobj, s);
7751 if ((s->flags & SEC_LINKER_CREATED) == 0)
7752 continue;
7754 if (CONST_STRNEQ (name, ".rel"))
7756 if (s->size != 0)
7758 const char *outname;
7759 asection *target;
7761 /* If this relocation section applies to a read only
7762 section, then we probably need a DT_TEXTREL entry.
7763 If the relocation section is .rel(a).dyn, we always
7764 assert a DT_TEXTREL entry rather than testing whether
7765 there exists a relocation to a read only section or
7766 not. */
7767 outname = bfd_get_section_name (output_bfd,
7768 s->output_section);
7769 target = bfd_get_section_by_name (output_bfd, outname + 4);
7770 if ((target != NULL
7771 && (target->flags & SEC_READONLY) != 0
7772 && (target->flags & SEC_ALLOC) != 0)
7773 || strcmp (outname, MIPS_ELF_REL_DYN_NAME (info)) == 0)
7774 reltext = TRUE;
7776 /* We use the reloc_count field as a counter if we need
7777 to copy relocs into the output file. */
7778 if (strcmp (name, MIPS_ELF_REL_DYN_NAME (info)) != 0)
7779 s->reloc_count = 0;
7781 /* If combreloc is enabled, elf_link_sort_relocs() will
7782 sort relocations, but in a different way than we do,
7783 and before we're done creating relocations. Also, it
7784 will move them around between input sections'
7785 relocation's contents, so our sorting would be
7786 broken, so don't let it run. */
7787 info->combreloc = 0;
7790 else if (htab->is_vxworks && strcmp (name, ".got") == 0)
7792 /* Executables do not need a GOT. */
7793 if (info->shared)
7795 /* Allocate relocations for all but the reserved entries. */
7796 struct mips_got_info *g;
7797 unsigned int count;
7799 g = mips_elf_got_info (dynobj, NULL);
7800 count = (g->global_gotno
7801 + g->local_gotno
7802 - MIPS_RESERVED_GOTNO (info));
7803 mips_elf_allocate_dynamic_relocations (dynobj, info, count);
7806 else if (!htab->is_vxworks && CONST_STRNEQ (name, ".got"))
7808 /* _bfd_mips_elf_always_size_sections() has already done
7809 most of the work, but some symbols may have been mapped
7810 to versions that we must now resolve in the got_entries
7811 hash tables. */
7812 struct mips_got_info *gg = mips_elf_got_info (dynobj, NULL);
7813 struct mips_got_info *g = gg;
7814 struct mips_elf_set_global_got_offset_arg set_got_offset_arg;
7815 unsigned int needed_relocs = 0;
7817 if (gg->next)
7819 set_got_offset_arg.value = MIPS_ELF_GOT_SIZE (output_bfd);
7820 set_got_offset_arg.info = info;
7822 /* NOTE 2005-02-03: How can this call, or the next, ever
7823 find any indirect entries to resolve? They were all
7824 resolved in mips_elf_multi_got. */
7825 mips_elf_resolve_final_got_entries (gg);
7826 for (g = gg->next; g && g->next != gg; g = g->next)
7828 unsigned int save_assign;
7830 mips_elf_resolve_final_got_entries (g);
7832 /* Assign offsets to global GOT entries. */
7833 save_assign = g->assigned_gotno;
7834 g->assigned_gotno = g->local_gotno;
7835 set_got_offset_arg.g = g;
7836 set_got_offset_arg.needed_relocs = 0;
7837 htab_traverse (g->got_entries,
7838 mips_elf_set_global_got_offset,
7839 &set_got_offset_arg);
7840 needed_relocs += set_got_offset_arg.needed_relocs;
7841 BFD_ASSERT (g->assigned_gotno - g->local_gotno
7842 <= g->global_gotno);
7844 g->assigned_gotno = save_assign;
7845 if (info->shared)
7847 needed_relocs += g->local_gotno - g->assigned_gotno;
7848 BFD_ASSERT (g->assigned_gotno == g->next->local_gotno
7849 + g->next->global_gotno
7850 + g->next->tls_gotno
7851 + MIPS_RESERVED_GOTNO (info));
7855 else
7857 struct mips_elf_count_tls_arg arg;
7858 arg.info = info;
7859 arg.needed = 0;
7861 htab_traverse (gg->got_entries, mips_elf_count_local_tls_relocs,
7862 &arg);
7863 elf_link_hash_traverse (elf_hash_table (info),
7864 mips_elf_count_global_tls_relocs,
7865 &arg);
7867 needed_relocs += arg.needed;
7870 if (needed_relocs)
7871 mips_elf_allocate_dynamic_relocations (dynobj, info,
7872 needed_relocs);
7874 else if (strcmp (name, MIPS_ELF_STUB_SECTION_NAME (output_bfd)) == 0)
7876 /* IRIX rld assumes that the function stub isn't at the end
7877 of .text section. So put a dummy. XXX */
7878 s->size += htab->function_stub_size;
7880 else if (! info->shared
7881 && ! mips_elf_hash_table (info)->use_rld_obj_head
7882 && CONST_STRNEQ (name, ".rld_map"))
7884 /* We add a room for __rld_map. It will be filled in by the
7885 rtld to contain a pointer to the _r_debug structure. */
7886 s->size += 4;
7888 else if (SGI_COMPAT (output_bfd)
7889 && CONST_STRNEQ (name, ".compact_rel"))
7890 s->size += mips_elf_hash_table (info)->compact_rel_size;
7891 else if (! CONST_STRNEQ (name, ".init")
7892 && s != htab->sgotplt
7893 && s != htab->splt)
7895 /* It's not one of our sections, so don't allocate space. */
7896 continue;
7899 if (s->size == 0)
7901 s->flags |= SEC_EXCLUDE;
7902 continue;
7905 if ((s->flags & SEC_HAS_CONTENTS) == 0)
7906 continue;
7908 /* Allocate memory for this section last, since we may increase its
7909 size above. */
7910 if (strcmp (name, MIPS_ELF_REL_DYN_NAME (info)) == 0)
7912 sreldyn = s;
7913 continue;
7916 /* Allocate memory for the section contents. */
7917 s->contents = bfd_zalloc (dynobj, s->size);
7918 if (s->contents == NULL)
7920 bfd_set_error (bfd_error_no_memory);
7921 return FALSE;
7925 /* Allocate memory for the .rel(a).dyn section. */
7926 if (sreldyn != NULL)
7928 sreldyn->contents = bfd_zalloc (dynobj, sreldyn->size);
7929 if (sreldyn->contents == NULL)
7931 bfd_set_error (bfd_error_no_memory);
7932 return FALSE;
7936 if (elf_hash_table (info)->dynamic_sections_created)
7938 /* Add some entries to the .dynamic section. We fill in the
7939 values later, in _bfd_mips_elf_finish_dynamic_sections, but we
7940 must add the entries now so that we get the correct size for
7941 the .dynamic section. */
7943 /* SGI object has the equivalence of DT_DEBUG in the
7944 DT_MIPS_RLD_MAP entry. This must come first because glibc
7945 only fills in DT_MIPS_RLD_MAP (not DT_DEBUG) and GDB only
7946 looks at the first one it sees. */
7947 if (!info->shared
7948 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP, 0))
7949 return FALSE;
7951 /* The DT_DEBUG entry may be filled in by the dynamic linker and
7952 used by the debugger. */
7953 if (info->executable
7954 && !SGI_COMPAT (output_bfd)
7955 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_DEBUG, 0))
7956 return FALSE;
7958 if (reltext && (SGI_COMPAT (output_bfd) || htab->is_vxworks))
7959 info->flags |= DF_TEXTREL;
7961 if ((info->flags & DF_TEXTREL) != 0)
7963 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_TEXTREL, 0))
7964 return FALSE;
7966 /* Clear the DF_TEXTREL flag. It will be set again if we
7967 write out an actual text relocation; we may not, because
7968 at this point we do not know whether e.g. any .eh_frame
7969 absolute relocations have been converted to PC-relative. */
7970 info->flags &= ~DF_TEXTREL;
7973 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTGOT, 0))
7974 return FALSE;
7976 if (htab->is_vxworks)
7978 /* VxWorks uses .rela.dyn instead of .rel.dyn. It does not
7979 use any of the DT_MIPS_* tags. */
7980 if (mips_elf_rel_dyn_section (info, FALSE))
7982 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELA, 0))
7983 return FALSE;
7985 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELASZ, 0))
7986 return FALSE;
7988 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELAENT, 0))
7989 return FALSE;
7991 if (htab->splt->size > 0)
7993 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTREL, 0))
7994 return FALSE;
7996 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_JMPREL, 0))
7997 return FALSE;
7999 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTRELSZ, 0))
8000 return FALSE;
8003 else
8005 if (mips_elf_rel_dyn_section (info, FALSE))
8007 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_REL, 0))
8008 return FALSE;
8010 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELSZ, 0))
8011 return FALSE;
8013 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELENT, 0))
8014 return FALSE;
8017 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_VERSION, 0))
8018 return FALSE;
8020 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_FLAGS, 0))
8021 return FALSE;
8023 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_BASE_ADDRESS, 0))
8024 return FALSE;
8026 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_LOCAL_GOTNO, 0))
8027 return FALSE;
8029 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_SYMTABNO, 0))
8030 return FALSE;
8032 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_UNREFEXTNO, 0))
8033 return FALSE;
8035 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_GOTSYM, 0))
8036 return FALSE;
8038 if (IRIX_COMPAT (dynobj) == ict_irix5
8039 && ! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_HIPAGENO, 0))
8040 return FALSE;
8042 if (IRIX_COMPAT (dynobj) == ict_irix6
8043 && (bfd_get_section_by_name
8044 (dynobj, MIPS_ELF_OPTIONS_SECTION_NAME (dynobj)))
8045 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_OPTIONS, 0))
8046 return FALSE;
8048 if (htab->is_vxworks
8049 && !elf_vxworks_add_dynamic_entries (output_bfd, info))
8050 return FALSE;
8053 return TRUE;
8056 /* REL is a relocation in INPUT_BFD that is being copied to OUTPUT_BFD.
8057 Adjust its R_ADDEND field so that it is correct for the output file.
8058 LOCAL_SYMS and LOCAL_SECTIONS are arrays of INPUT_BFD's local symbols
8059 and sections respectively; both use symbol indexes. */
8061 static void
8062 mips_elf_adjust_addend (bfd *output_bfd, struct bfd_link_info *info,
8063 bfd *input_bfd, Elf_Internal_Sym *local_syms,
8064 asection **local_sections, Elf_Internal_Rela *rel)
8066 unsigned int r_type, r_symndx;
8067 Elf_Internal_Sym *sym;
8068 asection *sec;
8070 if (mips_elf_local_relocation_p (input_bfd, rel, local_sections, FALSE))
8072 r_type = ELF_R_TYPE (output_bfd, rel->r_info);
8073 if (r_type == R_MIPS16_GPREL
8074 || r_type == R_MIPS_GPREL16
8075 || r_type == R_MIPS_GPREL32
8076 || r_type == R_MIPS_LITERAL)
8078 rel->r_addend += _bfd_get_gp_value (input_bfd);
8079 rel->r_addend -= _bfd_get_gp_value (output_bfd);
8082 r_symndx = ELF_R_SYM (output_bfd, rel->r_info);
8083 sym = local_syms + r_symndx;
8085 /* Adjust REL's addend to account for section merging. */
8086 if (!info->relocatable)
8088 sec = local_sections[r_symndx];
8089 _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
8092 /* This would normally be done by the rela_normal code in elflink.c. */
8093 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
8094 rel->r_addend += local_sections[r_symndx]->output_offset;
8098 /* Relocate a MIPS ELF section. */
8100 bfd_boolean
8101 _bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
8102 bfd *input_bfd, asection *input_section,
8103 bfd_byte *contents, Elf_Internal_Rela *relocs,
8104 Elf_Internal_Sym *local_syms,
8105 asection **local_sections)
8107 Elf_Internal_Rela *rel;
8108 const Elf_Internal_Rela *relend;
8109 bfd_vma addend = 0;
8110 bfd_boolean use_saved_addend_p = FALSE;
8111 const struct elf_backend_data *bed;
8113 bed = get_elf_backend_data (output_bfd);
8114 relend = relocs + input_section->reloc_count * bed->s->int_rels_per_ext_rel;
8115 for (rel = relocs; rel < relend; ++rel)
8117 const char *name;
8118 bfd_vma value = 0;
8119 reloc_howto_type *howto;
8120 bfd_boolean require_jalx;
8121 /* TRUE if the relocation is a RELA relocation, rather than a
8122 REL relocation. */
8123 bfd_boolean rela_relocation_p = TRUE;
8124 unsigned int r_type = ELF_R_TYPE (output_bfd, rel->r_info);
8125 const char *msg;
8126 unsigned long r_symndx;
8127 asection *sec;
8128 Elf_Internal_Shdr *symtab_hdr;
8129 struct elf_link_hash_entry *h;
8131 /* Find the relocation howto for this relocation. */
8132 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type,
8133 NEWABI_P (input_bfd)
8134 && (MIPS_RELOC_RELA_P
8135 (input_bfd, input_section,
8136 rel - relocs)));
8138 r_symndx = ELF_R_SYM (input_bfd, rel->r_info);
8139 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
8140 if (mips_elf_local_relocation_p (input_bfd, rel, local_sections, FALSE))
8142 sec = local_sections[r_symndx];
8143 h = NULL;
8145 else
8147 unsigned long extsymoff;
8149 extsymoff = 0;
8150 if (!elf_bad_symtab (input_bfd))
8151 extsymoff = symtab_hdr->sh_info;
8152 h = elf_sym_hashes (input_bfd) [r_symndx - extsymoff];
8153 while (h->root.type == bfd_link_hash_indirect
8154 || h->root.type == bfd_link_hash_warning)
8155 h = (struct elf_link_hash_entry *) h->root.u.i.link;
8157 sec = NULL;
8158 if (h->root.type == bfd_link_hash_defined
8159 || h->root.type == bfd_link_hash_defweak)
8160 sec = h->root.u.def.section;
8163 if (sec != NULL && elf_discarded_section (sec))
8165 /* For relocs against symbols from removed linkonce sections,
8166 or sections discarded by a linker script, we just want the
8167 section contents zeroed. Avoid any special processing. */
8168 _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
8169 rel->r_info = 0;
8170 rel->r_addend = 0;
8171 continue;
8174 if (r_type == R_MIPS_64 && ! NEWABI_P (input_bfd))
8176 /* Some 32-bit code uses R_MIPS_64. In particular, people use
8177 64-bit code, but make sure all their addresses are in the
8178 lowermost or uppermost 32-bit section of the 64-bit address
8179 space. Thus, when they use an R_MIPS_64 they mean what is
8180 usually meant by R_MIPS_32, with the exception that the
8181 stored value is sign-extended to 64 bits. */
8182 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, R_MIPS_32, FALSE);
8184 /* On big-endian systems, we need to lie about the position
8185 of the reloc. */
8186 if (bfd_big_endian (input_bfd))
8187 rel->r_offset += 4;
8190 if (!use_saved_addend_p)
8192 /* If these relocations were originally of the REL variety,
8193 we must pull the addend out of the field that will be
8194 relocated. Otherwise, we simply use the contents of the
8195 RELA relocation. */
8196 if (mips_elf_rel_relocation_p (input_bfd, input_section,
8197 relocs, rel))
8199 rela_relocation_p = FALSE;
8200 addend = mips_elf_read_rel_addend (input_bfd, rel,
8201 howto, contents);
8202 if (r_type == R_MIPS_HI16
8203 || r_type == R_MIPS16_HI16
8204 || (r_type == R_MIPS_GOT16
8205 && mips_elf_local_relocation_p (input_bfd, rel,
8206 local_sections, FALSE)))
8208 if (!mips_elf_add_lo16_rel_addend (input_bfd, rel, relend,
8209 contents, &addend))
8211 const char *name;
8213 if (h)
8214 name = h->root.root.string;
8215 else
8216 name = bfd_elf_sym_name (input_bfd, symtab_hdr,
8217 local_syms + r_symndx,
8218 sec);
8219 (*_bfd_error_handler)
8220 (_("%B: Can't find matching LO16 reloc against `%s' for %s at 0x%lx in section `%A'"),
8221 input_bfd, input_section, name, howto->name,
8222 rel->r_offset);
8225 else
8226 addend <<= howto->rightshift;
8228 else
8229 addend = rel->r_addend;
8230 mips_elf_adjust_addend (output_bfd, info, input_bfd,
8231 local_syms, local_sections, rel);
8234 if (info->relocatable)
8236 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd)
8237 && bfd_big_endian (input_bfd))
8238 rel->r_offset -= 4;
8240 if (!rela_relocation_p && rel->r_addend)
8242 addend += rel->r_addend;
8243 if (r_type == R_MIPS_HI16
8244 || r_type == R_MIPS_GOT16)
8245 addend = mips_elf_high (addend);
8246 else if (r_type == R_MIPS_HIGHER)
8247 addend = mips_elf_higher (addend);
8248 else if (r_type == R_MIPS_HIGHEST)
8249 addend = mips_elf_highest (addend);
8250 else
8251 addend >>= howto->rightshift;
8253 /* We use the source mask, rather than the destination
8254 mask because the place to which we are writing will be
8255 source of the addend in the final link. */
8256 addend &= howto->src_mask;
8258 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
8259 /* See the comment above about using R_MIPS_64 in the 32-bit
8260 ABI. Here, we need to update the addend. It would be
8261 possible to get away with just using the R_MIPS_32 reloc
8262 but for endianness. */
8264 bfd_vma sign_bits;
8265 bfd_vma low_bits;
8266 bfd_vma high_bits;
8268 if (addend & ((bfd_vma) 1 << 31))
8269 #ifdef BFD64
8270 sign_bits = ((bfd_vma) 1 << 32) - 1;
8271 #else
8272 sign_bits = -1;
8273 #endif
8274 else
8275 sign_bits = 0;
8277 /* If we don't know that we have a 64-bit type,
8278 do two separate stores. */
8279 if (bfd_big_endian (input_bfd))
8281 /* Store the sign-bits (which are most significant)
8282 first. */
8283 low_bits = sign_bits;
8284 high_bits = addend;
8286 else
8288 low_bits = addend;
8289 high_bits = sign_bits;
8291 bfd_put_32 (input_bfd, low_bits,
8292 contents + rel->r_offset);
8293 bfd_put_32 (input_bfd, high_bits,
8294 contents + rel->r_offset + 4);
8295 continue;
8298 if (! mips_elf_perform_relocation (info, howto, rel, addend,
8299 input_bfd, input_section,
8300 contents, FALSE))
8301 return FALSE;
8304 /* Go on to the next relocation. */
8305 continue;
8308 /* In the N32 and 64-bit ABIs there may be multiple consecutive
8309 relocations for the same offset. In that case we are
8310 supposed to treat the output of each relocation as the addend
8311 for the next. */
8312 if (rel + 1 < relend
8313 && rel->r_offset == rel[1].r_offset
8314 && ELF_R_TYPE (input_bfd, rel[1].r_info) != R_MIPS_NONE)
8315 use_saved_addend_p = TRUE;
8316 else
8317 use_saved_addend_p = FALSE;
8319 /* Figure out what value we are supposed to relocate. */
8320 switch (mips_elf_calculate_relocation (output_bfd, input_bfd,
8321 input_section, info, rel,
8322 addend, howto, local_syms,
8323 local_sections, &value,
8324 &name, &require_jalx,
8325 use_saved_addend_p))
8327 case bfd_reloc_continue:
8328 /* There's nothing to do. */
8329 continue;
8331 case bfd_reloc_undefined:
8332 /* mips_elf_calculate_relocation already called the
8333 undefined_symbol callback. There's no real point in
8334 trying to perform the relocation at this point, so we
8335 just skip ahead to the next relocation. */
8336 continue;
8338 case bfd_reloc_notsupported:
8339 msg = _("internal error: unsupported relocation error");
8340 info->callbacks->warning
8341 (info, msg, name, input_bfd, input_section, rel->r_offset);
8342 return FALSE;
8344 case bfd_reloc_overflow:
8345 if (use_saved_addend_p)
8346 /* Ignore overflow until we reach the last relocation for
8347 a given location. */
8349 else
8351 struct mips_elf_link_hash_table *htab;
8353 htab = mips_elf_hash_table (info);
8354 BFD_ASSERT (name != NULL);
8355 if (!htab->small_data_overflow_reported
8356 && (howto->type == R_MIPS_GPREL16
8357 || howto->type == R_MIPS_LITERAL))
8359 const char *msg =
8360 _("small-data section exceeds 64KB;"
8361 " lower small-data size limit (see option -G)");
8363 htab->small_data_overflow_reported = TRUE;
8364 (*info->callbacks->einfo) ("%P: %s\n", msg);
8366 if (! ((*info->callbacks->reloc_overflow)
8367 (info, NULL, name, howto->name, (bfd_vma) 0,
8368 input_bfd, input_section, rel->r_offset)))
8369 return FALSE;
8371 break;
8373 case bfd_reloc_ok:
8374 break;
8376 default:
8377 abort ();
8378 break;
8381 /* If we've got another relocation for the address, keep going
8382 until we reach the last one. */
8383 if (use_saved_addend_p)
8385 addend = value;
8386 continue;
8389 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
8390 /* See the comment above about using R_MIPS_64 in the 32-bit
8391 ABI. Until now, we've been using the HOWTO for R_MIPS_32;
8392 that calculated the right value. Now, however, we
8393 sign-extend the 32-bit result to 64-bits, and store it as a
8394 64-bit value. We are especially generous here in that we
8395 go to extreme lengths to support this usage on systems with
8396 only a 32-bit VMA. */
8398 bfd_vma sign_bits;
8399 bfd_vma low_bits;
8400 bfd_vma high_bits;
8402 if (value & ((bfd_vma) 1 << 31))
8403 #ifdef BFD64
8404 sign_bits = ((bfd_vma) 1 << 32) - 1;
8405 #else
8406 sign_bits = -1;
8407 #endif
8408 else
8409 sign_bits = 0;
8411 /* If we don't know that we have a 64-bit type,
8412 do two separate stores. */
8413 if (bfd_big_endian (input_bfd))
8415 /* Undo what we did above. */
8416 rel->r_offset -= 4;
8417 /* Store the sign-bits (which are most significant)
8418 first. */
8419 low_bits = sign_bits;
8420 high_bits = value;
8422 else
8424 low_bits = value;
8425 high_bits = sign_bits;
8427 bfd_put_32 (input_bfd, low_bits,
8428 contents + rel->r_offset);
8429 bfd_put_32 (input_bfd, high_bits,
8430 contents + rel->r_offset + 4);
8431 continue;
8434 /* Actually perform the relocation. */
8435 if (! mips_elf_perform_relocation (info, howto, rel, value,
8436 input_bfd, input_section,
8437 contents, require_jalx))
8438 return FALSE;
8441 return TRUE;
8444 /* If NAME is one of the special IRIX6 symbols defined by the linker,
8445 adjust it appropriately now. */
8447 static void
8448 mips_elf_irix6_finish_dynamic_symbol (bfd *abfd ATTRIBUTE_UNUSED,
8449 const char *name, Elf_Internal_Sym *sym)
8451 /* The linker script takes care of providing names and values for
8452 these, but we must place them into the right sections. */
8453 static const char* const text_section_symbols[] = {
8454 "_ftext",
8455 "_etext",
8456 "__dso_displacement",
8457 "__elf_header",
8458 "__program_header_table",
8459 NULL
8462 static const char* const data_section_symbols[] = {
8463 "_fdata",
8464 "_edata",
8465 "_end",
8466 "_fbss",
8467 NULL
8470 const char* const *p;
8471 int i;
8473 for (i = 0; i < 2; ++i)
8474 for (p = (i == 0) ? text_section_symbols : data_section_symbols;
8476 ++p)
8477 if (strcmp (*p, name) == 0)
8479 /* All of these symbols are given type STT_SECTION by the
8480 IRIX6 linker. */
8481 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8482 sym->st_other = STO_PROTECTED;
8484 /* The IRIX linker puts these symbols in special sections. */
8485 if (i == 0)
8486 sym->st_shndx = SHN_MIPS_TEXT;
8487 else
8488 sym->st_shndx = SHN_MIPS_DATA;
8490 break;
8494 /* Finish up dynamic symbol handling. We set the contents of various
8495 dynamic sections here. */
8497 bfd_boolean
8498 _bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
8499 struct bfd_link_info *info,
8500 struct elf_link_hash_entry *h,
8501 Elf_Internal_Sym *sym)
8503 bfd *dynobj;
8504 asection *sgot;
8505 struct mips_got_info *g, *gg;
8506 const char *name;
8507 int idx;
8508 struct mips_elf_link_hash_table *htab;
8510 htab = mips_elf_hash_table (info);
8511 dynobj = elf_hash_table (info)->dynobj;
8513 if (h->plt.offset != MINUS_ONE)
8515 asection *s;
8516 bfd_byte stub[MIPS_FUNCTION_STUB_BIG_SIZE];
8518 /* This symbol has a stub. Set it up. */
8520 BFD_ASSERT (h->dynindx != -1);
8522 s = bfd_get_section_by_name (dynobj,
8523 MIPS_ELF_STUB_SECTION_NAME (dynobj));
8524 BFD_ASSERT (s != NULL);
8526 BFD_ASSERT ((htab->function_stub_size == MIPS_FUNCTION_STUB_BIG_SIZE)
8527 || (h->dynindx <= 0xffff));
8529 /* Values up to 2^31 - 1 are allowed. Larger values would cause
8530 sign extension at runtime in the stub, resulting in a negative
8531 index value. */
8532 if (h->dynindx & ~0x7fffffff)
8533 return FALSE;
8535 /* Fill the stub. */
8536 idx = 0;
8537 bfd_put_32 (output_bfd, STUB_LW (output_bfd), stub + idx);
8538 idx += 4;
8539 bfd_put_32 (output_bfd, STUB_MOVE (output_bfd), stub + idx);
8540 idx += 4;
8541 if (htab->function_stub_size == MIPS_FUNCTION_STUB_BIG_SIZE)
8543 bfd_put_32 (output_bfd, STUB_LUI ((h->dynindx >> 16) & 0x7fff),
8544 stub + idx);
8545 idx += 4;
8547 bfd_put_32 (output_bfd, STUB_JALR, stub + idx);
8548 idx += 4;
8550 /* If a large stub is not required and sign extension is not a
8551 problem, then use legacy code in the stub. */
8552 if (htab->function_stub_size == MIPS_FUNCTION_STUB_BIG_SIZE)
8553 bfd_put_32 (output_bfd, STUB_ORI (h->dynindx & 0xffff), stub + idx);
8554 else if (h->dynindx & ~0x7fff)
8555 bfd_put_32 (output_bfd, STUB_LI16U (h->dynindx & 0xffff), stub + idx);
8556 else
8557 bfd_put_32 (output_bfd, STUB_LI16S (output_bfd, h->dynindx),
8558 stub + idx);
8560 BFD_ASSERT (h->plt.offset <= s->size);
8561 memcpy (s->contents + h->plt.offset, stub, htab->function_stub_size);
8563 /* Mark the symbol as undefined. plt.offset != -1 occurs
8564 only for the referenced symbol. */
8565 sym->st_shndx = SHN_UNDEF;
8567 /* The run-time linker uses the st_value field of the symbol
8568 to reset the global offset table entry for this external
8569 to its stub address when unlinking a shared object. */
8570 sym->st_value = (s->output_section->vma + s->output_offset
8571 + h->plt.offset);
8574 BFD_ASSERT (h->dynindx != -1
8575 || h->forced_local);
8577 sgot = mips_elf_got_section (dynobj, FALSE);
8578 BFD_ASSERT (sgot != NULL);
8579 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
8580 g = mips_elf_section_data (sgot)->u.got_info;
8581 BFD_ASSERT (g != NULL);
8583 /* Run through the global symbol table, creating GOT entries for all
8584 the symbols that need them. */
8585 if (g->global_gotsym != NULL
8586 && h->dynindx >= g->global_gotsym->dynindx)
8588 bfd_vma offset;
8589 bfd_vma value;
8591 value = sym->st_value;
8592 offset = mips_elf_global_got_index (dynobj, output_bfd, h, R_MIPS_GOT16, info);
8593 MIPS_ELF_PUT_WORD (output_bfd, value, sgot->contents + offset);
8596 if (g->next && h->dynindx != -1 && h->type != STT_TLS)
8598 struct mips_got_entry e, *p;
8599 bfd_vma entry;
8600 bfd_vma offset;
8602 gg = g;
8604 e.abfd = output_bfd;
8605 e.symndx = -1;
8606 e.d.h = (struct mips_elf_link_hash_entry *)h;
8607 e.tls_type = 0;
8609 for (g = g->next; g->next != gg; g = g->next)
8611 if (g->got_entries
8612 && (p = (struct mips_got_entry *) htab_find (g->got_entries,
8613 &e)))
8615 offset = p->gotidx;
8616 if (info->shared
8617 || (elf_hash_table (info)->dynamic_sections_created
8618 && p->d.h != NULL
8619 && p->d.h->root.def_dynamic
8620 && !p->d.h->root.def_regular))
8622 /* Create an R_MIPS_REL32 relocation for this entry. Due to
8623 the various compatibility problems, it's easier to mock
8624 up an R_MIPS_32 or R_MIPS_64 relocation and leave
8625 mips_elf_create_dynamic_relocation to calculate the
8626 appropriate addend. */
8627 Elf_Internal_Rela rel[3];
8629 memset (rel, 0, sizeof (rel));
8630 if (ABI_64_P (output_bfd))
8631 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_64);
8632 else
8633 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_32);
8634 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
8636 entry = 0;
8637 if (! (mips_elf_create_dynamic_relocation
8638 (output_bfd, info, rel,
8639 e.d.h, NULL, sym->st_value, &entry, sgot)))
8640 return FALSE;
8642 else
8643 entry = sym->st_value;
8644 MIPS_ELF_PUT_WORD (output_bfd, entry, sgot->contents + offset);
8649 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
8650 name = h->root.root.string;
8651 if (strcmp (name, "_DYNAMIC") == 0
8652 || h == elf_hash_table (info)->hgot)
8653 sym->st_shndx = SHN_ABS;
8654 else if (strcmp (name, "_DYNAMIC_LINK") == 0
8655 || strcmp (name, "_DYNAMIC_LINKING") == 0)
8657 sym->st_shndx = SHN_ABS;
8658 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8659 sym->st_value = 1;
8661 else if (strcmp (name, "_gp_disp") == 0 && ! NEWABI_P (output_bfd))
8663 sym->st_shndx = SHN_ABS;
8664 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8665 sym->st_value = elf_gp (output_bfd);
8667 else if (SGI_COMPAT (output_bfd))
8669 if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
8670 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
8672 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8673 sym->st_other = STO_PROTECTED;
8674 sym->st_value = 0;
8675 sym->st_shndx = SHN_MIPS_DATA;
8677 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
8679 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8680 sym->st_other = STO_PROTECTED;
8681 sym->st_value = mips_elf_hash_table (info)->procedure_count;
8682 sym->st_shndx = SHN_ABS;
8684 else if (sym->st_shndx != SHN_UNDEF && sym->st_shndx != SHN_ABS)
8686 if (h->type == STT_FUNC)
8687 sym->st_shndx = SHN_MIPS_TEXT;
8688 else if (h->type == STT_OBJECT)
8689 sym->st_shndx = SHN_MIPS_DATA;
8693 /* Handle the IRIX6-specific symbols. */
8694 if (IRIX_COMPAT (output_bfd) == ict_irix6)
8695 mips_elf_irix6_finish_dynamic_symbol (output_bfd, name, sym);
8697 if (! info->shared)
8699 if (! mips_elf_hash_table (info)->use_rld_obj_head
8700 && (strcmp (name, "__rld_map") == 0
8701 || strcmp (name, "__RLD_MAP") == 0))
8703 asection *s = bfd_get_section_by_name (dynobj, ".rld_map");
8704 BFD_ASSERT (s != NULL);
8705 sym->st_value = s->output_section->vma + s->output_offset;
8706 bfd_put_32 (output_bfd, 0, s->contents);
8707 if (mips_elf_hash_table (info)->rld_value == 0)
8708 mips_elf_hash_table (info)->rld_value = sym->st_value;
8710 else if (mips_elf_hash_table (info)->use_rld_obj_head
8711 && strcmp (name, "__rld_obj_head") == 0)
8713 /* IRIX6 does not use a .rld_map section. */
8714 if (IRIX_COMPAT (output_bfd) == ict_irix5
8715 || IRIX_COMPAT (output_bfd) == ict_none)
8716 BFD_ASSERT (bfd_get_section_by_name (dynobj, ".rld_map")
8717 != NULL);
8718 mips_elf_hash_table (info)->rld_value = sym->st_value;
8722 /* If this is a mips16 symbol, force the value to be even. */
8723 if (sym->st_other == STO_MIPS16)
8724 sym->st_value &= ~1;
8726 return TRUE;
8729 /* Likewise, for VxWorks. */
8731 bfd_boolean
8732 _bfd_mips_vxworks_finish_dynamic_symbol (bfd *output_bfd,
8733 struct bfd_link_info *info,
8734 struct elf_link_hash_entry *h,
8735 Elf_Internal_Sym *sym)
8737 bfd *dynobj;
8738 asection *sgot;
8739 struct mips_got_info *g;
8740 struct mips_elf_link_hash_table *htab;
8742 htab = mips_elf_hash_table (info);
8743 dynobj = elf_hash_table (info)->dynobj;
8745 if (h->plt.offset != (bfd_vma) -1)
8747 bfd_byte *loc;
8748 bfd_vma plt_address, plt_index, got_address, got_offset, branch_offset;
8749 Elf_Internal_Rela rel;
8750 static const bfd_vma *plt_entry;
8752 BFD_ASSERT (h->dynindx != -1);
8753 BFD_ASSERT (htab->splt != NULL);
8754 BFD_ASSERT (h->plt.offset <= htab->splt->size);
8756 /* Calculate the address of the .plt entry. */
8757 plt_address = (htab->splt->output_section->vma
8758 + htab->splt->output_offset
8759 + h->plt.offset);
8761 /* Calculate the index of the entry. */
8762 plt_index = ((h->plt.offset - htab->plt_header_size)
8763 / htab->plt_entry_size);
8765 /* Calculate the address of the .got.plt entry. */
8766 got_address = (htab->sgotplt->output_section->vma
8767 + htab->sgotplt->output_offset
8768 + plt_index * 4);
8770 /* Calculate the offset of the .got.plt entry from
8771 _GLOBAL_OFFSET_TABLE_. */
8772 got_offset = mips_elf_gotplt_index (info, h);
8774 /* Calculate the offset for the branch at the start of the PLT
8775 entry. The branch jumps to the beginning of .plt. */
8776 branch_offset = -(h->plt.offset / 4 + 1) & 0xffff;
8778 /* Fill in the initial value of the .got.plt entry. */
8779 bfd_put_32 (output_bfd, plt_address,
8780 htab->sgotplt->contents + plt_index * 4);
8782 /* Find out where the .plt entry should go. */
8783 loc = htab->splt->contents + h->plt.offset;
8785 if (info->shared)
8787 plt_entry = mips_vxworks_shared_plt_entry;
8788 bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
8789 bfd_put_32 (output_bfd, plt_entry[1] | plt_index, loc + 4);
8791 else
8793 bfd_vma got_address_high, got_address_low;
8795 plt_entry = mips_vxworks_exec_plt_entry;
8796 got_address_high = ((got_address + 0x8000) >> 16) & 0xffff;
8797 got_address_low = got_address & 0xffff;
8799 bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
8800 bfd_put_32 (output_bfd, plt_entry[1] | plt_index, loc + 4);
8801 bfd_put_32 (output_bfd, plt_entry[2] | got_address_high, loc + 8);
8802 bfd_put_32 (output_bfd, plt_entry[3] | got_address_low, loc + 12);
8803 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
8804 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
8805 bfd_put_32 (output_bfd, plt_entry[6], loc + 24);
8806 bfd_put_32 (output_bfd, plt_entry[7], loc + 28);
8808 loc = (htab->srelplt2->contents
8809 + (plt_index * 3 + 2) * sizeof (Elf32_External_Rela));
8811 /* Emit a relocation for the .got.plt entry. */
8812 rel.r_offset = got_address;
8813 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
8814 rel.r_addend = h->plt.offset;
8815 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8817 /* Emit a relocation for the lui of %hi(<.got.plt slot>). */
8818 loc += sizeof (Elf32_External_Rela);
8819 rel.r_offset = plt_address + 8;
8820 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
8821 rel.r_addend = got_offset;
8822 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8824 /* Emit a relocation for the addiu of %lo(<.got.plt slot>). */
8825 loc += sizeof (Elf32_External_Rela);
8826 rel.r_offset += 4;
8827 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
8828 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8831 /* Emit an R_MIPS_JUMP_SLOT relocation against the .got.plt entry. */
8832 loc = htab->srelplt->contents + plt_index * sizeof (Elf32_External_Rela);
8833 rel.r_offset = got_address;
8834 rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_JUMP_SLOT);
8835 rel.r_addend = 0;
8836 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8838 if (!h->def_regular)
8839 sym->st_shndx = SHN_UNDEF;
8842 BFD_ASSERT (h->dynindx != -1 || h->forced_local);
8844 sgot = mips_elf_got_section (dynobj, FALSE);
8845 BFD_ASSERT (sgot != NULL);
8846 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
8847 g = mips_elf_section_data (sgot)->u.got_info;
8848 BFD_ASSERT (g != NULL);
8850 /* See if this symbol has an entry in the GOT. */
8851 if (g->global_gotsym != NULL
8852 && h->dynindx >= g->global_gotsym->dynindx)
8854 bfd_vma offset;
8855 Elf_Internal_Rela outrel;
8856 bfd_byte *loc;
8857 asection *s;
8859 /* Install the symbol value in the GOT. */
8860 offset = mips_elf_global_got_index (dynobj, output_bfd, h,
8861 R_MIPS_GOT16, info);
8862 MIPS_ELF_PUT_WORD (output_bfd, sym->st_value, sgot->contents + offset);
8864 /* Add a dynamic relocation for it. */
8865 s = mips_elf_rel_dyn_section (info, FALSE);
8866 loc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
8867 outrel.r_offset = (sgot->output_section->vma
8868 + sgot->output_offset
8869 + offset);
8870 outrel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_32);
8871 outrel.r_addend = 0;
8872 bfd_elf32_swap_reloca_out (dynobj, &outrel, loc);
8875 /* Emit a copy reloc, if needed. */
8876 if (h->needs_copy)
8878 Elf_Internal_Rela rel;
8880 BFD_ASSERT (h->dynindx != -1);
8882 rel.r_offset = (h->root.u.def.section->output_section->vma
8883 + h->root.u.def.section->output_offset
8884 + h->root.u.def.value);
8885 rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_COPY);
8886 rel.r_addend = 0;
8887 bfd_elf32_swap_reloca_out (output_bfd, &rel,
8888 htab->srelbss->contents
8889 + (htab->srelbss->reloc_count
8890 * sizeof (Elf32_External_Rela)));
8891 ++htab->srelbss->reloc_count;
8894 /* If this is a mips16 symbol, force the value to be even. */
8895 if (sym->st_other == STO_MIPS16)
8896 sym->st_value &= ~1;
8898 return TRUE;
8901 /* Install the PLT header for a VxWorks executable and finalize the
8902 contents of .rela.plt.unloaded. */
8904 static void
8905 mips_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
8907 Elf_Internal_Rela rela;
8908 bfd_byte *loc;
8909 bfd_vma got_value, got_value_high, got_value_low, plt_address;
8910 static const bfd_vma *plt_entry;
8911 struct mips_elf_link_hash_table *htab;
8913 htab = mips_elf_hash_table (info);
8914 plt_entry = mips_vxworks_exec_plt0_entry;
8916 /* Calculate the value of _GLOBAL_OFFSET_TABLE_. */
8917 got_value = (htab->root.hgot->root.u.def.section->output_section->vma
8918 + htab->root.hgot->root.u.def.section->output_offset
8919 + htab->root.hgot->root.u.def.value);
8921 got_value_high = ((got_value + 0x8000) >> 16) & 0xffff;
8922 got_value_low = got_value & 0xffff;
8924 /* Calculate the address of the PLT header. */
8925 plt_address = htab->splt->output_section->vma + htab->splt->output_offset;
8927 /* Install the PLT header. */
8928 loc = htab->splt->contents;
8929 bfd_put_32 (output_bfd, plt_entry[0] | got_value_high, loc);
8930 bfd_put_32 (output_bfd, plt_entry[1] | got_value_low, loc + 4);
8931 bfd_put_32 (output_bfd, plt_entry[2], loc + 8);
8932 bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
8933 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
8934 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
8936 /* Output the relocation for the lui of %hi(_GLOBAL_OFFSET_TABLE_). */
8937 loc = htab->srelplt2->contents;
8938 rela.r_offset = plt_address;
8939 rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
8940 rela.r_addend = 0;
8941 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
8942 loc += sizeof (Elf32_External_Rela);
8944 /* Output the relocation for the following addiu of
8945 %lo(_GLOBAL_OFFSET_TABLE_). */
8946 rela.r_offset += 4;
8947 rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
8948 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
8949 loc += sizeof (Elf32_External_Rela);
8951 /* Fix up the remaining relocations. They may have the wrong
8952 symbol index for _G_O_T_ or _P_L_T_ depending on the order
8953 in which symbols were output. */
8954 while (loc < htab->srelplt2->contents + htab->srelplt2->size)
8956 Elf_Internal_Rela rel;
8958 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
8959 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
8960 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8961 loc += sizeof (Elf32_External_Rela);
8963 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
8964 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
8965 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8966 loc += sizeof (Elf32_External_Rela);
8968 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
8969 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
8970 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8971 loc += sizeof (Elf32_External_Rela);
8975 /* Install the PLT header for a VxWorks shared library. */
8977 static void
8978 mips_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info)
8980 unsigned int i;
8981 struct mips_elf_link_hash_table *htab;
8983 htab = mips_elf_hash_table (info);
8985 /* We just need to copy the entry byte-by-byte. */
8986 for (i = 0; i < ARRAY_SIZE (mips_vxworks_shared_plt0_entry); i++)
8987 bfd_put_32 (output_bfd, mips_vxworks_shared_plt0_entry[i],
8988 htab->splt->contents + i * 4);
8991 /* Finish up the dynamic sections. */
8993 bfd_boolean
8994 _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
8995 struct bfd_link_info *info)
8997 bfd *dynobj;
8998 asection *sdyn;
8999 asection *sgot;
9000 struct mips_got_info *gg, *g;
9001 struct mips_elf_link_hash_table *htab;
9003 htab = mips_elf_hash_table (info);
9004 dynobj = elf_hash_table (info)->dynobj;
9006 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
9008 sgot = mips_elf_got_section (dynobj, FALSE);
9009 if (sgot == NULL)
9010 gg = g = NULL;
9011 else
9013 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
9014 gg = mips_elf_section_data (sgot)->u.got_info;
9015 BFD_ASSERT (gg != NULL);
9016 g = mips_elf_got_for_ibfd (gg, output_bfd);
9017 BFD_ASSERT (g != NULL);
9020 if (elf_hash_table (info)->dynamic_sections_created)
9022 bfd_byte *b;
9023 int dyn_to_skip = 0, dyn_skipped = 0;
9025 BFD_ASSERT (sdyn != NULL);
9026 BFD_ASSERT (g != NULL);
9028 for (b = sdyn->contents;
9029 b < sdyn->contents + sdyn->size;
9030 b += MIPS_ELF_DYN_SIZE (dynobj))
9032 Elf_Internal_Dyn dyn;
9033 const char *name;
9034 size_t elemsize;
9035 asection *s;
9036 bfd_boolean swap_out_p;
9038 /* Read in the current dynamic entry. */
9039 (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
9041 /* Assume that we're going to modify it and write it out. */
9042 swap_out_p = TRUE;
9044 switch (dyn.d_tag)
9046 case DT_RELENT:
9047 dyn.d_un.d_val = MIPS_ELF_REL_SIZE (dynobj);
9048 break;
9050 case DT_RELAENT:
9051 BFD_ASSERT (htab->is_vxworks);
9052 dyn.d_un.d_val = MIPS_ELF_RELA_SIZE (dynobj);
9053 break;
9055 case DT_STRSZ:
9056 /* Rewrite DT_STRSZ. */
9057 dyn.d_un.d_val =
9058 _bfd_elf_strtab_size (elf_hash_table (info)->dynstr);
9059 break;
9061 case DT_PLTGOT:
9062 name = ".got";
9063 if (htab->is_vxworks)
9065 /* _GLOBAL_OFFSET_TABLE_ is defined to be the beginning
9066 of the ".got" section in DYNOBJ. */
9067 s = bfd_get_section_by_name (dynobj, name);
9068 BFD_ASSERT (s != NULL);
9069 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
9071 else
9073 s = bfd_get_section_by_name (output_bfd, name);
9074 BFD_ASSERT (s != NULL);
9075 dyn.d_un.d_ptr = s->vma;
9077 break;
9079 case DT_MIPS_RLD_VERSION:
9080 dyn.d_un.d_val = 1; /* XXX */
9081 break;
9083 case DT_MIPS_FLAGS:
9084 dyn.d_un.d_val = RHF_NOTPOT; /* XXX */
9085 break;
9087 case DT_MIPS_TIME_STAMP:
9089 time_t t;
9090 time (&t);
9091 dyn.d_un.d_val = t;
9093 break;
9095 case DT_MIPS_ICHECKSUM:
9096 /* XXX FIXME: */
9097 swap_out_p = FALSE;
9098 break;
9100 case DT_MIPS_IVERSION:
9101 /* XXX FIXME: */
9102 swap_out_p = FALSE;
9103 break;
9105 case DT_MIPS_BASE_ADDRESS:
9106 s = output_bfd->sections;
9107 BFD_ASSERT (s != NULL);
9108 dyn.d_un.d_ptr = s->vma & ~(bfd_vma) 0xffff;
9109 break;
9111 case DT_MIPS_LOCAL_GOTNO:
9112 dyn.d_un.d_val = g->local_gotno;
9113 break;
9115 case DT_MIPS_UNREFEXTNO:
9116 /* The index into the dynamic symbol table which is the
9117 entry of the first external symbol that is not
9118 referenced within the same object. */
9119 dyn.d_un.d_val = bfd_count_sections (output_bfd) + 1;
9120 break;
9122 case DT_MIPS_GOTSYM:
9123 if (gg->global_gotsym)
9125 dyn.d_un.d_val = gg->global_gotsym->dynindx;
9126 break;
9128 /* In case if we don't have global got symbols we default
9129 to setting DT_MIPS_GOTSYM to the same value as
9130 DT_MIPS_SYMTABNO, so we just fall through. */
9132 case DT_MIPS_SYMTABNO:
9133 name = ".dynsym";
9134 elemsize = MIPS_ELF_SYM_SIZE (output_bfd);
9135 s = bfd_get_section_by_name (output_bfd, name);
9136 BFD_ASSERT (s != NULL);
9138 dyn.d_un.d_val = s->size / elemsize;
9139 break;
9141 case DT_MIPS_HIPAGENO:
9142 dyn.d_un.d_val = g->local_gotno - MIPS_RESERVED_GOTNO (info);
9143 break;
9145 case DT_MIPS_RLD_MAP:
9146 dyn.d_un.d_ptr = mips_elf_hash_table (info)->rld_value;
9147 break;
9149 case DT_MIPS_OPTIONS:
9150 s = (bfd_get_section_by_name
9151 (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (output_bfd)));
9152 dyn.d_un.d_ptr = s->vma;
9153 break;
9155 case DT_RELASZ:
9156 BFD_ASSERT (htab->is_vxworks);
9157 /* The count does not include the JUMP_SLOT relocations. */
9158 if (htab->srelplt)
9159 dyn.d_un.d_val -= htab->srelplt->size;
9160 break;
9162 case DT_PLTREL:
9163 BFD_ASSERT (htab->is_vxworks);
9164 dyn.d_un.d_val = DT_RELA;
9165 break;
9167 case DT_PLTRELSZ:
9168 BFD_ASSERT (htab->is_vxworks);
9169 dyn.d_un.d_val = htab->srelplt->size;
9170 break;
9172 case DT_JMPREL:
9173 BFD_ASSERT (htab->is_vxworks);
9174 dyn.d_un.d_val = (htab->srelplt->output_section->vma
9175 + htab->srelplt->output_offset);
9176 break;
9178 case DT_TEXTREL:
9179 /* If we didn't need any text relocations after all, delete
9180 the dynamic tag. */
9181 if (!(info->flags & DF_TEXTREL))
9183 dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
9184 swap_out_p = FALSE;
9186 break;
9188 case DT_FLAGS:
9189 /* If we didn't need any text relocations after all, clear
9190 DF_TEXTREL from DT_FLAGS. */
9191 if (!(info->flags & DF_TEXTREL))
9192 dyn.d_un.d_val &= ~DF_TEXTREL;
9193 else
9194 swap_out_p = FALSE;
9195 break;
9197 default:
9198 swap_out_p = FALSE;
9199 if (htab->is_vxworks
9200 && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
9201 swap_out_p = TRUE;
9202 break;
9205 if (swap_out_p || dyn_skipped)
9206 (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
9207 (dynobj, &dyn, b - dyn_skipped);
9209 if (dyn_to_skip)
9211 dyn_skipped += dyn_to_skip;
9212 dyn_to_skip = 0;
9216 /* Wipe out any trailing entries if we shifted down a dynamic tag. */
9217 if (dyn_skipped > 0)
9218 memset (b - dyn_skipped, 0, dyn_skipped);
9221 if (sgot != NULL && sgot->size > 0
9222 && !bfd_is_abs_section (sgot->output_section))
9224 if (htab->is_vxworks)
9226 /* The first entry of the global offset table points to the
9227 ".dynamic" section. The second is initialized by the
9228 loader and contains the shared library identifier.
9229 The third is also initialized by the loader and points
9230 to the lazy resolution stub. */
9231 MIPS_ELF_PUT_WORD (output_bfd,
9232 sdyn->output_offset + sdyn->output_section->vma,
9233 sgot->contents);
9234 MIPS_ELF_PUT_WORD (output_bfd, 0,
9235 sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
9236 MIPS_ELF_PUT_WORD (output_bfd, 0,
9237 sgot->contents
9238 + 2 * MIPS_ELF_GOT_SIZE (output_bfd));
9240 else
9242 /* The first entry of the global offset table will be filled at
9243 runtime. The second entry will be used by some runtime loaders.
9244 This isn't the case of IRIX rld. */
9245 MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0, sgot->contents);
9246 MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
9247 sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
9250 elf_section_data (sgot->output_section)->this_hdr.sh_entsize
9251 = MIPS_ELF_GOT_SIZE (output_bfd);
9254 /* Generate dynamic relocations for the non-primary gots. */
9255 if (gg != NULL && gg->next)
9257 Elf_Internal_Rela rel[3];
9258 bfd_vma addend = 0;
9260 memset (rel, 0, sizeof (rel));
9261 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_REL32);
9263 for (g = gg->next; g->next != gg; g = g->next)
9265 bfd_vma index = g->next->local_gotno + g->next->global_gotno
9266 + g->next->tls_gotno;
9268 MIPS_ELF_PUT_WORD (output_bfd, 0, sgot->contents
9269 + index++ * MIPS_ELF_GOT_SIZE (output_bfd));
9270 MIPS_ELF_PUT_WORD (output_bfd, MIPS_ELF_GNU_GOT1_MASK (output_bfd),
9271 sgot->contents
9272 + index++ * MIPS_ELF_GOT_SIZE (output_bfd));
9274 if (! info->shared)
9275 continue;
9277 while (index < g->assigned_gotno)
9279 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset
9280 = index++ * MIPS_ELF_GOT_SIZE (output_bfd);
9281 if (!(mips_elf_create_dynamic_relocation
9282 (output_bfd, info, rel, NULL,
9283 bfd_abs_section_ptr,
9284 0, &addend, sgot)))
9285 return FALSE;
9286 BFD_ASSERT (addend == 0);
9291 /* The generation of dynamic relocations for the non-primary gots
9292 adds more dynamic relocations. We cannot count them until
9293 here. */
9295 if (elf_hash_table (info)->dynamic_sections_created)
9297 bfd_byte *b;
9298 bfd_boolean swap_out_p;
9300 BFD_ASSERT (sdyn != NULL);
9302 for (b = sdyn->contents;
9303 b < sdyn->contents + sdyn->size;
9304 b += MIPS_ELF_DYN_SIZE (dynobj))
9306 Elf_Internal_Dyn dyn;
9307 asection *s;
9309 /* Read in the current dynamic entry. */
9310 (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
9312 /* Assume that we're going to modify it and write it out. */
9313 swap_out_p = TRUE;
9315 switch (dyn.d_tag)
9317 case DT_RELSZ:
9318 /* Reduce DT_RELSZ to account for any relocations we
9319 decided not to make. This is for the n64 irix rld,
9320 which doesn't seem to apply any relocations if there
9321 are trailing null entries. */
9322 s = mips_elf_rel_dyn_section (info, FALSE);
9323 dyn.d_un.d_val = (s->reloc_count
9324 * (ABI_64_P (output_bfd)
9325 ? sizeof (Elf64_Mips_External_Rel)
9326 : sizeof (Elf32_External_Rel)));
9327 /* Adjust the section size too. Tools like the prelinker
9328 can reasonably expect the values to the same. */
9329 elf_section_data (s->output_section)->this_hdr.sh_size
9330 = dyn.d_un.d_val;
9331 break;
9333 default:
9334 swap_out_p = FALSE;
9335 break;
9338 if (swap_out_p)
9339 (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
9340 (dynobj, &dyn, b);
9345 asection *s;
9346 Elf32_compact_rel cpt;
9348 if (SGI_COMPAT (output_bfd))
9350 /* Write .compact_rel section out. */
9351 s = bfd_get_section_by_name (dynobj, ".compact_rel");
9352 if (s != NULL)
9354 cpt.id1 = 1;
9355 cpt.num = s->reloc_count;
9356 cpt.id2 = 2;
9357 cpt.offset = (s->output_section->filepos
9358 + sizeof (Elf32_External_compact_rel));
9359 cpt.reserved0 = 0;
9360 cpt.reserved1 = 0;
9361 bfd_elf32_swap_compact_rel_out (output_bfd, &cpt,
9362 ((Elf32_External_compact_rel *)
9363 s->contents));
9365 /* Clean up a dummy stub function entry in .text. */
9366 s = bfd_get_section_by_name (dynobj,
9367 MIPS_ELF_STUB_SECTION_NAME (dynobj));
9368 if (s != NULL)
9370 file_ptr dummy_offset;
9372 BFD_ASSERT (s->size >= htab->function_stub_size);
9373 dummy_offset = s->size - htab->function_stub_size;
9374 memset (s->contents + dummy_offset, 0,
9375 htab->function_stub_size);
9380 /* The psABI says that the dynamic relocations must be sorted in
9381 increasing order of r_symndx. The VxWorks EABI doesn't require
9382 this, and because the code below handles REL rather than RELA
9383 relocations, using it for VxWorks would be outright harmful. */
9384 if (!htab->is_vxworks)
9386 s = mips_elf_rel_dyn_section (info, FALSE);
9387 if (s != NULL
9388 && s->size > (bfd_vma)2 * MIPS_ELF_REL_SIZE (output_bfd))
9390 reldyn_sorting_bfd = output_bfd;
9392 if (ABI_64_P (output_bfd))
9393 qsort ((Elf64_External_Rel *) s->contents + 1,
9394 s->reloc_count - 1, sizeof (Elf64_Mips_External_Rel),
9395 sort_dynamic_relocs_64);
9396 else
9397 qsort ((Elf32_External_Rel *) s->contents + 1,
9398 s->reloc_count - 1, sizeof (Elf32_External_Rel),
9399 sort_dynamic_relocs);
9404 if (htab->is_vxworks && htab->splt->size > 0)
9406 if (info->shared)
9407 mips_vxworks_finish_shared_plt (output_bfd, info);
9408 else
9409 mips_vxworks_finish_exec_plt (output_bfd, info);
9411 return TRUE;
9415 /* Set ABFD's EF_MIPS_ARCH and EF_MIPS_MACH flags. */
9417 static void
9418 mips_set_isa_flags (bfd *abfd)
9420 flagword val;
9422 switch (bfd_get_mach (abfd))
9424 default:
9425 case bfd_mach_mips3000:
9426 val = E_MIPS_ARCH_1;
9427 break;
9429 case bfd_mach_mips3900:
9430 val = E_MIPS_ARCH_1 | E_MIPS_MACH_3900;
9431 break;
9433 case bfd_mach_mips6000:
9434 val = E_MIPS_ARCH_2;
9435 break;
9437 case bfd_mach_mips4000:
9438 case bfd_mach_mips4300:
9439 case bfd_mach_mips4400:
9440 case bfd_mach_mips4600:
9441 val = E_MIPS_ARCH_3;
9442 break;
9444 case bfd_mach_mips4010:
9445 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4010;
9446 break;
9448 case bfd_mach_mips4100:
9449 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4100;
9450 break;
9452 case bfd_mach_mips4111:
9453 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4111;
9454 break;
9456 case bfd_mach_mips4120:
9457 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4120;
9458 break;
9460 case bfd_mach_mips4650:
9461 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4650;
9462 break;
9464 case bfd_mach_mips5400:
9465 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5400;
9466 break;
9468 case bfd_mach_mips5500:
9469 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5500;
9470 break;
9472 case bfd_mach_mips9000:
9473 val = E_MIPS_ARCH_4 | E_MIPS_MACH_9000;
9474 break;
9476 case bfd_mach_mips5000:
9477 case bfd_mach_mips7000:
9478 case bfd_mach_mips8000:
9479 case bfd_mach_mips10000:
9480 case bfd_mach_mips12000:
9481 val = E_MIPS_ARCH_4;
9482 break;
9484 case bfd_mach_mips5:
9485 val = E_MIPS_ARCH_5;
9486 break;
9488 case bfd_mach_mips_loongson_2e:
9489 val = E_MIPS_ARCH_3 | E_MIPS_MACH_LS2E;
9490 break;
9492 case bfd_mach_mips_loongson_2f:
9493 val = E_MIPS_ARCH_3 | E_MIPS_MACH_LS2F;
9494 break;
9496 case bfd_mach_mips_sb1:
9497 val = E_MIPS_ARCH_64 | E_MIPS_MACH_SB1;
9498 break;
9500 case bfd_mach_mips_octeon:
9501 val = E_MIPS_ARCH_64R2 | E_MIPS_MACH_OCTEON;
9502 break;
9504 case bfd_mach_mipsisa32:
9505 val = E_MIPS_ARCH_32;
9506 break;
9508 case bfd_mach_mipsisa64:
9509 val = E_MIPS_ARCH_64;
9510 break;
9512 case bfd_mach_mipsisa32r2:
9513 val = E_MIPS_ARCH_32R2;
9514 break;
9516 case bfd_mach_mipsisa64r2:
9517 val = E_MIPS_ARCH_64R2;
9518 break;
9520 elf_elfheader (abfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
9521 elf_elfheader (abfd)->e_flags |= val;
9526 /* The final processing done just before writing out a MIPS ELF object
9527 file. This gets the MIPS architecture right based on the machine
9528 number. This is used by both the 32-bit and the 64-bit ABI. */
9530 void
9531 _bfd_mips_elf_final_write_processing (bfd *abfd,
9532 bfd_boolean linker ATTRIBUTE_UNUSED)
9534 unsigned int i;
9535 Elf_Internal_Shdr **hdrpp;
9536 const char *name;
9537 asection *sec;
9539 /* Keep the existing EF_MIPS_MACH and EF_MIPS_ARCH flags if the former
9540 is nonzero. This is for compatibility with old objects, which used
9541 a combination of a 32-bit EF_MIPS_ARCH and a 64-bit EF_MIPS_MACH. */
9542 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == 0)
9543 mips_set_isa_flags (abfd);
9545 /* Set the sh_info field for .gptab sections and other appropriate
9546 info for each special section. */
9547 for (i = 1, hdrpp = elf_elfsections (abfd) + 1;
9548 i < elf_numsections (abfd);
9549 i++, hdrpp++)
9551 switch ((*hdrpp)->sh_type)
9553 case SHT_MIPS_MSYM:
9554 case SHT_MIPS_LIBLIST:
9555 sec = bfd_get_section_by_name (abfd, ".dynstr");
9556 if (sec != NULL)
9557 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
9558 break;
9560 case SHT_MIPS_GPTAB:
9561 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
9562 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
9563 BFD_ASSERT (name != NULL
9564 && CONST_STRNEQ (name, ".gptab."));
9565 sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
9566 BFD_ASSERT (sec != NULL);
9567 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
9568 break;
9570 case SHT_MIPS_CONTENT:
9571 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
9572 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
9573 BFD_ASSERT (name != NULL
9574 && CONST_STRNEQ (name, ".MIPS.content"));
9575 sec = bfd_get_section_by_name (abfd,
9576 name + sizeof ".MIPS.content" - 1);
9577 BFD_ASSERT (sec != NULL);
9578 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
9579 break;
9581 case SHT_MIPS_SYMBOL_LIB:
9582 sec = bfd_get_section_by_name (abfd, ".dynsym");
9583 if (sec != NULL)
9584 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
9585 sec = bfd_get_section_by_name (abfd, ".liblist");
9586 if (sec != NULL)
9587 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
9588 break;
9590 case SHT_MIPS_EVENTS:
9591 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
9592 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
9593 BFD_ASSERT (name != NULL);
9594 if (CONST_STRNEQ (name, ".MIPS.events"))
9595 sec = bfd_get_section_by_name (abfd,
9596 name + sizeof ".MIPS.events" - 1);
9597 else
9599 BFD_ASSERT (CONST_STRNEQ (name, ".MIPS.post_rel"));
9600 sec = bfd_get_section_by_name (abfd,
9601 (name
9602 + sizeof ".MIPS.post_rel" - 1));
9604 BFD_ASSERT (sec != NULL);
9605 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
9606 break;
9612 /* When creating an IRIX5 executable, we need REGINFO and RTPROC
9613 segments. */
9616 _bfd_mips_elf_additional_program_headers (bfd *abfd,
9617 struct bfd_link_info *info ATTRIBUTE_UNUSED)
9619 asection *s;
9620 int ret = 0;
9622 /* See if we need a PT_MIPS_REGINFO segment. */
9623 s = bfd_get_section_by_name (abfd, ".reginfo");
9624 if (s && (s->flags & SEC_LOAD))
9625 ++ret;
9627 /* See if we need a PT_MIPS_OPTIONS segment. */
9628 if (IRIX_COMPAT (abfd) == ict_irix6
9629 && bfd_get_section_by_name (abfd,
9630 MIPS_ELF_OPTIONS_SECTION_NAME (abfd)))
9631 ++ret;
9633 /* See if we need a PT_MIPS_RTPROC segment. */
9634 if (IRIX_COMPAT (abfd) == ict_irix5
9635 && bfd_get_section_by_name (abfd, ".dynamic")
9636 && bfd_get_section_by_name (abfd, ".mdebug"))
9637 ++ret;
9639 /* Allocate a PT_NULL header in dynamic objects. See
9640 _bfd_mips_elf_modify_segment_map for details. */
9641 if (!SGI_COMPAT (abfd)
9642 && bfd_get_section_by_name (abfd, ".dynamic"))
9643 ++ret;
9645 return ret;
9648 /* Modify the segment map for an IRIX5 executable. */
9650 bfd_boolean
9651 _bfd_mips_elf_modify_segment_map (bfd *abfd,
9652 struct bfd_link_info *info)
9654 asection *s;
9655 struct elf_segment_map *m, **pm;
9656 bfd_size_type amt;
9658 /* If there is a .reginfo section, we need a PT_MIPS_REGINFO
9659 segment. */
9660 s = bfd_get_section_by_name (abfd, ".reginfo");
9661 if (s != NULL && (s->flags & SEC_LOAD) != 0)
9663 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
9664 if (m->p_type == PT_MIPS_REGINFO)
9665 break;
9666 if (m == NULL)
9668 amt = sizeof *m;
9669 m = bfd_zalloc (abfd, amt);
9670 if (m == NULL)
9671 return FALSE;
9673 m->p_type = PT_MIPS_REGINFO;
9674 m->count = 1;
9675 m->sections[0] = s;
9677 /* We want to put it after the PHDR and INTERP segments. */
9678 pm = &elf_tdata (abfd)->segment_map;
9679 while (*pm != NULL
9680 && ((*pm)->p_type == PT_PHDR
9681 || (*pm)->p_type == PT_INTERP))
9682 pm = &(*pm)->next;
9684 m->next = *pm;
9685 *pm = m;
9689 /* For IRIX 6, we don't have .mdebug sections, nor does anything but
9690 .dynamic end up in PT_DYNAMIC. However, we do have to insert a
9691 PT_MIPS_OPTIONS segment immediately following the program header
9692 table. */
9693 if (NEWABI_P (abfd)
9694 /* On non-IRIX6 new abi, we'll have already created a segment
9695 for this section, so don't create another. I'm not sure this
9696 is not also the case for IRIX 6, but I can't test it right
9697 now. */
9698 && IRIX_COMPAT (abfd) == ict_irix6)
9700 for (s = abfd->sections; s; s = s->next)
9701 if (elf_section_data (s)->this_hdr.sh_type == SHT_MIPS_OPTIONS)
9702 break;
9704 if (s)
9706 struct elf_segment_map *options_segment;
9708 pm = &elf_tdata (abfd)->segment_map;
9709 while (*pm != NULL
9710 && ((*pm)->p_type == PT_PHDR
9711 || (*pm)->p_type == PT_INTERP))
9712 pm = &(*pm)->next;
9714 if (*pm == NULL || (*pm)->p_type != PT_MIPS_OPTIONS)
9716 amt = sizeof (struct elf_segment_map);
9717 options_segment = bfd_zalloc (abfd, amt);
9718 options_segment->next = *pm;
9719 options_segment->p_type = PT_MIPS_OPTIONS;
9720 options_segment->p_flags = PF_R;
9721 options_segment->p_flags_valid = TRUE;
9722 options_segment->count = 1;
9723 options_segment->sections[0] = s;
9724 *pm = options_segment;
9728 else
9730 if (IRIX_COMPAT (abfd) == ict_irix5)
9732 /* If there are .dynamic and .mdebug sections, we make a room
9733 for the RTPROC header. FIXME: Rewrite without section names. */
9734 if (bfd_get_section_by_name (abfd, ".interp") == NULL
9735 && bfd_get_section_by_name (abfd, ".dynamic") != NULL
9736 && bfd_get_section_by_name (abfd, ".mdebug") != NULL)
9738 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
9739 if (m->p_type == PT_MIPS_RTPROC)
9740 break;
9741 if (m == NULL)
9743 amt = sizeof *m;
9744 m = bfd_zalloc (abfd, amt);
9745 if (m == NULL)
9746 return FALSE;
9748 m->p_type = PT_MIPS_RTPROC;
9750 s = bfd_get_section_by_name (abfd, ".rtproc");
9751 if (s == NULL)
9753 m->count = 0;
9754 m->p_flags = 0;
9755 m->p_flags_valid = 1;
9757 else
9759 m->count = 1;
9760 m->sections[0] = s;
9763 /* We want to put it after the DYNAMIC segment. */
9764 pm = &elf_tdata (abfd)->segment_map;
9765 while (*pm != NULL && (*pm)->p_type != PT_DYNAMIC)
9766 pm = &(*pm)->next;
9767 if (*pm != NULL)
9768 pm = &(*pm)->next;
9770 m->next = *pm;
9771 *pm = m;
9775 /* On IRIX5, the PT_DYNAMIC segment includes the .dynamic,
9776 .dynstr, .dynsym, and .hash sections, and everything in
9777 between. */
9778 for (pm = &elf_tdata (abfd)->segment_map; *pm != NULL;
9779 pm = &(*pm)->next)
9780 if ((*pm)->p_type == PT_DYNAMIC)
9781 break;
9782 m = *pm;
9783 if (m != NULL && IRIX_COMPAT (abfd) == ict_none)
9785 /* For a normal mips executable the permissions for the PT_DYNAMIC
9786 segment are read, write and execute. We do that here since
9787 the code in elf.c sets only the read permission. This matters
9788 sometimes for the dynamic linker. */
9789 if (bfd_get_section_by_name (abfd, ".dynamic") != NULL)
9791 m->p_flags = PF_R | PF_W | PF_X;
9792 m->p_flags_valid = 1;
9795 /* GNU/Linux binaries do not need the extended PT_DYNAMIC section.
9796 glibc's dynamic linker has traditionally derived the number of
9797 tags from the p_filesz field, and sometimes allocates stack
9798 arrays of that size. An overly-big PT_DYNAMIC segment can
9799 be actively harmful in such cases. Making PT_DYNAMIC contain
9800 other sections can also make life hard for the prelinker,
9801 which might move one of the other sections to a different
9802 PT_LOAD segment. */
9803 if (SGI_COMPAT (abfd)
9804 && m != NULL
9805 && m->count == 1
9806 && strcmp (m->sections[0]->name, ".dynamic") == 0)
9808 static const char *sec_names[] =
9810 ".dynamic", ".dynstr", ".dynsym", ".hash"
9812 bfd_vma low, high;
9813 unsigned int i, c;
9814 struct elf_segment_map *n;
9816 low = ~(bfd_vma) 0;
9817 high = 0;
9818 for (i = 0; i < sizeof sec_names / sizeof sec_names[0]; i++)
9820 s = bfd_get_section_by_name (abfd, sec_names[i]);
9821 if (s != NULL && (s->flags & SEC_LOAD) != 0)
9823 bfd_size_type sz;
9825 if (low > s->vma)
9826 low = s->vma;
9827 sz = s->size;
9828 if (high < s->vma + sz)
9829 high = s->vma + sz;
9833 c = 0;
9834 for (s = abfd->sections; s != NULL; s = s->next)
9835 if ((s->flags & SEC_LOAD) != 0
9836 && s->vma >= low
9837 && s->vma + s->size <= high)
9838 ++c;
9840 amt = sizeof *n + (bfd_size_type) (c - 1) * sizeof (asection *);
9841 n = bfd_zalloc (abfd, amt);
9842 if (n == NULL)
9843 return FALSE;
9844 *n = *m;
9845 n->count = c;
9847 i = 0;
9848 for (s = abfd->sections; s != NULL; s = s->next)
9850 if ((s->flags & SEC_LOAD) != 0
9851 && s->vma >= low
9852 && s->vma + s->size <= high)
9854 n->sections[i] = s;
9855 ++i;
9859 *pm = n;
9863 /* Allocate a spare program header in dynamic objects so that tools
9864 like the prelinker can add an extra PT_LOAD entry.
9866 If the prelinker needs to make room for a new PT_LOAD entry, its
9867 standard procedure is to move the first (read-only) sections into
9868 the new (writable) segment. However, the MIPS ABI requires
9869 .dynamic to be in a read-only segment, and the section will often
9870 start within sizeof (ElfNN_Phdr) bytes of the last program header.
9872 Although the prelinker could in principle move .dynamic to a
9873 writable segment, it seems better to allocate a spare program
9874 header instead, and avoid the need to move any sections.
9875 There is a long tradition of allocating spare dynamic tags,
9876 so allocating a spare program header seems like a natural
9877 extension.
9879 If INFO is NULL, we may be copying an already prelinked binary
9880 with objcopy or strip, so do not add this header. */
9881 if (info != NULL
9882 && !SGI_COMPAT (abfd)
9883 && bfd_get_section_by_name (abfd, ".dynamic"))
9885 for (pm = &elf_tdata (abfd)->segment_map; *pm != NULL; pm = &(*pm)->next)
9886 if ((*pm)->p_type == PT_NULL)
9887 break;
9888 if (*pm == NULL)
9890 m = bfd_zalloc (abfd, sizeof (*m));
9891 if (m == NULL)
9892 return FALSE;
9894 m->p_type = PT_NULL;
9895 *pm = m;
9899 return TRUE;
9902 /* Return the section that should be marked against GC for a given
9903 relocation. */
9905 asection *
9906 _bfd_mips_elf_gc_mark_hook (asection *sec,
9907 struct bfd_link_info *info,
9908 Elf_Internal_Rela *rel,
9909 struct elf_link_hash_entry *h,
9910 Elf_Internal_Sym *sym)
9912 /* ??? Do mips16 stub sections need to be handled special? */
9914 if (h != NULL)
9915 switch (ELF_R_TYPE (sec->owner, rel->r_info))
9917 case R_MIPS_GNU_VTINHERIT:
9918 case R_MIPS_GNU_VTENTRY:
9919 return NULL;
9922 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
9925 /* Update the got entry reference counts for the section being removed. */
9927 bfd_boolean
9928 _bfd_mips_elf_gc_sweep_hook (bfd *abfd ATTRIBUTE_UNUSED,
9929 struct bfd_link_info *info ATTRIBUTE_UNUSED,
9930 asection *sec ATTRIBUTE_UNUSED,
9931 const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED)
9933 #if 0
9934 Elf_Internal_Shdr *symtab_hdr;
9935 struct elf_link_hash_entry **sym_hashes;
9936 bfd_signed_vma *local_got_refcounts;
9937 const Elf_Internal_Rela *rel, *relend;
9938 unsigned long r_symndx;
9939 struct elf_link_hash_entry *h;
9941 if (info->relocatable)
9942 return TRUE;
9944 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
9945 sym_hashes = elf_sym_hashes (abfd);
9946 local_got_refcounts = elf_local_got_refcounts (abfd);
9948 relend = relocs + sec->reloc_count;
9949 for (rel = relocs; rel < relend; rel++)
9950 switch (ELF_R_TYPE (abfd, rel->r_info))
9952 case R_MIPS_GOT16:
9953 case R_MIPS_CALL16:
9954 case R_MIPS_CALL_HI16:
9955 case R_MIPS_CALL_LO16:
9956 case R_MIPS_GOT_HI16:
9957 case R_MIPS_GOT_LO16:
9958 case R_MIPS_GOT_DISP:
9959 case R_MIPS_GOT_PAGE:
9960 case R_MIPS_GOT_OFST:
9961 /* ??? It would seem that the existing MIPS code does no sort
9962 of reference counting or whatnot on its GOT and PLT entries,
9963 so it is not possible to garbage collect them at this time. */
9964 break;
9966 default:
9967 break;
9969 #endif
9971 return TRUE;
9974 /* Copy data from a MIPS ELF indirect symbol to its direct symbol,
9975 hiding the old indirect symbol. Process additional relocation
9976 information. Also called for weakdefs, in which case we just let
9977 _bfd_elf_link_hash_copy_indirect copy the flags for us. */
9979 void
9980 _bfd_mips_elf_copy_indirect_symbol (struct bfd_link_info *info,
9981 struct elf_link_hash_entry *dir,
9982 struct elf_link_hash_entry *ind)
9984 struct mips_elf_link_hash_entry *dirmips, *indmips;
9986 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
9988 if (ind->root.type != bfd_link_hash_indirect)
9989 return;
9991 dirmips = (struct mips_elf_link_hash_entry *) dir;
9992 indmips = (struct mips_elf_link_hash_entry *) ind;
9993 dirmips->possibly_dynamic_relocs += indmips->possibly_dynamic_relocs;
9994 if (indmips->readonly_reloc)
9995 dirmips->readonly_reloc = TRUE;
9996 if (indmips->no_fn_stub)
9997 dirmips->no_fn_stub = TRUE;
9999 if (dirmips->tls_type == 0)
10000 dirmips->tls_type = indmips->tls_type;
10003 void
10004 _bfd_mips_elf_hide_symbol (struct bfd_link_info *info,
10005 struct elf_link_hash_entry *entry,
10006 bfd_boolean force_local)
10008 bfd *dynobj;
10009 asection *got;
10010 struct mips_got_info *g;
10011 struct mips_elf_link_hash_entry *h;
10012 struct mips_elf_link_hash_table *htab;
10014 h = (struct mips_elf_link_hash_entry *) entry;
10015 if (h->forced_local)
10016 return;
10017 h->forced_local = force_local;
10019 dynobj = elf_hash_table (info)->dynobj;
10020 htab = mips_elf_hash_table (info);
10021 if (dynobj != NULL && force_local && h->root.type != STT_TLS
10022 && (got = mips_elf_got_section (dynobj, TRUE)) != NULL
10023 && (g = mips_elf_section_data (got)->u.got_info) != NULL)
10025 if (g->next)
10027 struct mips_got_entry e;
10028 struct mips_got_info *gg = g;
10030 /* Since we're turning what used to be a global symbol into a
10031 local one, bump up the number of local entries of each GOT
10032 that had an entry for it. This will automatically decrease
10033 the number of global entries, since global_gotno is actually
10034 the upper limit of global entries. */
10035 e.abfd = dynobj;
10036 e.symndx = -1;
10037 e.d.h = h;
10038 e.tls_type = 0;
10040 for (g = g->next; g != gg; g = g->next)
10041 if (htab_find (g->got_entries, &e))
10043 BFD_ASSERT (g->global_gotno > 0);
10044 g->local_gotno++;
10045 g->global_gotno--;
10048 /* If this was a global symbol forced into the primary GOT, we
10049 no longer need an entry for it. We can't release the entry
10050 at this point, but we must at least stop counting it as one
10051 of the symbols that required a forced got entry. */
10052 if (h->root.got.offset == 2)
10054 BFD_ASSERT (gg->assigned_gotno > 0);
10055 gg->assigned_gotno--;
10058 else if (h->root.got.offset == 1)
10060 /* check_relocs didn't know that this symbol would be
10061 forced-local, so add an extra local got entry. */
10062 g->local_gotno++;
10063 if (htab->computed_got_sizes)
10065 /* We'll have treated this symbol as global rather
10066 than local. */
10067 BFD_ASSERT (g->global_gotno > 0);
10068 g->global_gotno--;
10071 else if (htab->is_vxworks && h->root.needs_plt)
10073 /* check_relocs didn't know that this symbol would be
10074 forced-local, so add an extra local got entry. */
10075 g->local_gotno++;
10076 if (htab->computed_got_sizes)
10077 /* The symbol is only used in call relocations, so we'll
10078 have assumed it only needs a .got.plt entry. Increase
10079 the size of .got accordingly. */
10080 got->size += MIPS_ELF_GOT_SIZE (dynobj);
10084 _bfd_elf_link_hash_hide_symbol (info, &h->root, force_local);
10087 #define PDR_SIZE 32
10089 bfd_boolean
10090 _bfd_mips_elf_discard_info (bfd *abfd, struct elf_reloc_cookie *cookie,
10091 struct bfd_link_info *info)
10093 asection *o;
10094 bfd_boolean ret = FALSE;
10095 unsigned char *tdata;
10096 size_t i, skip;
10098 o = bfd_get_section_by_name (abfd, ".pdr");
10099 if (! o)
10100 return FALSE;
10101 if (o->size == 0)
10102 return FALSE;
10103 if (o->size % PDR_SIZE != 0)
10104 return FALSE;
10105 if (o->output_section != NULL
10106 && bfd_is_abs_section (o->output_section))
10107 return FALSE;
10109 tdata = bfd_zmalloc (o->size / PDR_SIZE);
10110 if (! tdata)
10111 return FALSE;
10113 cookie->rels = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
10114 info->keep_memory);
10115 if (!cookie->rels)
10117 free (tdata);
10118 return FALSE;
10121 cookie->rel = cookie->rels;
10122 cookie->relend = cookie->rels + o->reloc_count;
10124 for (i = 0, skip = 0; i < o->size / PDR_SIZE; i ++)
10126 if (bfd_elf_reloc_symbol_deleted_p (i * PDR_SIZE, cookie))
10128 tdata[i] = 1;
10129 skip ++;
10133 if (skip != 0)
10135 mips_elf_section_data (o)->u.tdata = tdata;
10136 o->size -= skip * PDR_SIZE;
10137 ret = TRUE;
10139 else
10140 free (tdata);
10142 if (! info->keep_memory)
10143 free (cookie->rels);
10145 return ret;
10148 bfd_boolean
10149 _bfd_mips_elf_ignore_discarded_relocs (asection *sec)
10151 if (strcmp (sec->name, ".pdr") == 0)
10152 return TRUE;
10153 return FALSE;
10156 bfd_boolean
10157 _bfd_mips_elf_write_section (bfd *output_bfd,
10158 struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
10159 asection *sec, bfd_byte *contents)
10161 bfd_byte *to, *from, *end;
10162 int i;
10164 if (strcmp (sec->name, ".pdr") != 0)
10165 return FALSE;
10167 if (mips_elf_section_data (sec)->u.tdata == NULL)
10168 return FALSE;
10170 to = contents;
10171 end = contents + sec->size;
10172 for (from = contents, i = 0;
10173 from < end;
10174 from += PDR_SIZE, i++)
10176 if ((mips_elf_section_data (sec)->u.tdata)[i] == 1)
10177 continue;
10178 if (to != from)
10179 memcpy (to, from, PDR_SIZE);
10180 to += PDR_SIZE;
10182 bfd_set_section_contents (output_bfd, sec->output_section, contents,
10183 sec->output_offset, sec->size);
10184 return TRUE;
10187 /* MIPS ELF uses a special find_nearest_line routine in order the
10188 handle the ECOFF debugging information. */
10190 struct mips_elf_find_line
10192 struct ecoff_debug_info d;
10193 struct ecoff_find_line i;
10196 bfd_boolean
10197 _bfd_mips_elf_find_nearest_line (bfd *abfd, asection *section,
10198 asymbol **symbols, bfd_vma offset,
10199 const char **filename_ptr,
10200 const char **functionname_ptr,
10201 unsigned int *line_ptr)
10203 asection *msec;
10205 if (_bfd_dwarf1_find_nearest_line (abfd, section, symbols, offset,
10206 filename_ptr, functionname_ptr,
10207 line_ptr))
10208 return TRUE;
10210 if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
10211 filename_ptr, functionname_ptr,
10212 line_ptr, ABI_64_P (abfd) ? 8 : 0,
10213 &elf_tdata (abfd)->dwarf2_find_line_info))
10214 return TRUE;
10216 msec = bfd_get_section_by_name (abfd, ".mdebug");
10217 if (msec != NULL)
10219 flagword origflags;
10220 struct mips_elf_find_line *fi;
10221 const struct ecoff_debug_swap * const swap =
10222 get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
10224 /* If we are called during a link, mips_elf_final_link may have
10225 cleared the SEC_HAS_CONTENTS field. We force it back on here
10226 if appropriate (which it normally will be). */
10227 origflags = msec->flags;
10228 if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
10229 msec->flags |= SEC_HAS_CONTENTS;
10231 fi = elf_tdata (abfd)->find_line_info;
10232 if (fi == NULL)
10234 bfd_size_type external_fdr_size;
10235 char *fraw_src;
10236 char *fraw_end;
10237 struct fdr *fdr_ptr;
10238 bfd_size_type amt = sizeof (struct mips_elf_find_line);
10240 fi = bfd_zalloc (abfd, amt);
10241 if (fi == NULL)
10243 msec->flags = origflags;
10244 return FALSE;
10247 if (! _bfd_mips_elf_read_ecoff_info (abfd, msec, &fi->d))
10249 msec->flags = origflags;
10250 return FALSE;
10253 /* Swap in the FDR information. */
10254 amt = fi->d.symbolic_header.ifdMax * sizeof (struct fdr);
10255 fi->d.fdr = bfd_alloc (abfd, amt);
10256 if (fi->d.fdr == NULL)
10258 msec->flags = origflags;
10259 return FALSE;
10261 external_fdr_size = swap->external_fdr_size;
10262 fdr_ptr = fi->d.fdr;
10263 fraw_src = (char *) fi->d.external_fdr;
10264 fraw_end = (fraw_src
10265 + fi->d.symbolic_header.ifdMax * external_fdr_size);
10266 for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
10267 (*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr);
10269 elf_tdata (abfd)->find_line_info = fi;
10271 /* Note that we don't bother to ever free this information.
10272 find_nearest_line is either called all the time, as in
10273 objdump -l, so the information should be saved, or it is
10274 rarely called, as in ld error messages, so the memory
10275 wasted is unimportant. Still, it would probably be a
10276 good idea for free_cached_info to throw it away. */
10279 if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
10280 &fi->i, filename_ptr, functionname_ptr,
10281 line_ptr))
10283 msec->flags = origflags;
10284 return TRUE;
10287 msec->flags = origflags;
10290 /* Fall back on the generic ELF find_nearest_line routine. */
10292 return _bfd_elf_find_nearest_line (abfd, section, symbols, offset,
10293 filename_ptr, functionname_ptr,
10294 line_ptr);
10297 bfd_boolean
10298 _bfd_mips_elf_find_inliner_info (bfd *abfd,
10299 const char **filename_ptr,
10300 const char **functionname_ptr,
10301 unsigned int *line_ptr)
10303 bfd_boolean found;
10304 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
10305 functionname_ptr, line_ptr,
10306 & elf_tdata (abfd)->dwarf2_find_line_info);
10307 return found;
10311 /* When are writing out the .options or .MIPS.options section,
10312 remember the bytes we are writing out, so that we can install the
10313 GP value in the section_processing routine. */
10315 bfd_boolean
10316 _bfd_mips_elf_set_section_contents (bfd *abfd, sec_ptr section,
10317 const void *location,
10318 file_ptr offset, bfd_size_type count)
10320 if (MIPS_ELF_OPTIONS_SECTION_NAME_P (section->name))
10322 bfd_byte *c;
10324 if (elf_section_data (section) == NULL)
10326 bfd_size_type amt = sizeof (struct bfd_elf_section_data);
10327 section->used_by_bfd = bfd_zalloc (abfd, amt);
10328 if (elf_section_data (section) == NULL)
10329 return FALSE;
10331 c = mips_elf_section_data (section)->u.tdata;
10332 if (c == NULL)
10334 c = bfd_zalloc (abfd, section->size);
10335 if (c == NULL)
10336 return FALSE;
10337 mips_elf_section_data (section)->u.tdata = c;
10340 memcpy (c + offset, location, count);
10343 return _bfd_elf_set_section_contents (abfd, section, location, offset,
10344 count);
10347 /* This is almost identical to bfd_generic_get_... except that some
10348 MIPS relocations need to be handled specially. Sigh. */
10350 bfd_byte *
10351 _bfd_elf_mips_get_relocated_section_contents
10352 (bfd *abfd,
10353 struct bfd_link_info *link_info,
10354 struct bfd_link_order *link_order,
10355 bfd_byte *data,
10356 bfd_boolean relocatable,
10357 asymbol **symbols)
10359 /* Get enough memory to hold the stuff */
10360 bfd *input_bfd = link_order->u.indirect.section->owner;
10361 asection *input_section = link_order->u.indirect.section;
10362 bfd_size_type sz;
10364 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
10365 arelent **reloc_vector = NULL;
10366 long reloc_count;
10368 if (reloc_size < 0)
10369 goto error_return;
10371 reloc_vector = bfd_malloc (reloc_size);
10372 if (reloc_vector == NULL && reloc_size != 0)
10373 goto error_return;
10375 /* read in the section */
10376 sz = input_section->rawsize ? input_section->rawsize : input_section->size;
10377 if (!bfd_get_section_contents (input_bfd, input_section, data, 0, sz))
10378 goto error_return;
10380 reloc_count = bfd_canonicalize_reloc (input_bfd,
10381 input_section,
10382 reloc_vector,
10383 symbols);
10384 if (reloc_count < 0)
10385 goto error_return;
10387 if (reloc_count > 0)
10389 arelent **parent;
10390 /* for mips */
10391 int gp_found;
10392 bfd_vma gp = 0x12345678; /* initialize just to shut gcc up */
10395 struct bfd_hash_entry *h;
10396 struct bfd_link_hash_entry *lh;
10397 /* Skip all this stuff if we aren't mixing formats. */
10398 if (abfd && input_bfd
10399 && abfd->xvec == input_bfd->xvec)
10400 lh = 0;
10401 else
10403 h = bfd_hash_lookup (&link_info->hash->table, "_gp", FALSE, FALSE);
10404 lh = (struct bfd_link_hash_entry *) h;
10406 lookup:
10407 if (lh)
10409 switch (lh->type)
10411 case bfd_link_hash_undefined:
10412 case bfd_link_hash_undefweak:
10413 case bfd_link_hash_common:
10414 gp_found = 0;
10415 break;
10416 case bfd_link_hash_defined:
10417 case bfd_link_hash_defweak:
10418 gp_found = 1;
10419 gp = lh->u.def.value;
10420 break;
10421 case bfd_link_hash_indirect:
10422 case bfd_link_hash_warning:
10423 lh = lh->u.i.link;
10424 /* @@FIXME ignoring warning for now */
10425 goto lookup;
10426 case bfd_link_hash_new:
10427 default:
10428 abort ();
10431 else
10432 gp_found = 0;
10434 /* end mips */
10435 for (parent = reloc_vector; *parent != NULL; parent++)
10437 char *error_message = NULL;
10438 bfd_reloc_status_type r;
10440 /* Specific to MIPS: Deal with relocation types that require
10441 knowing the gp of the output bfd. */
10442 asymbol *sym = *(*parent)->sym_ptr_ptr;
10444 /* If we've managed to find the gp and have a special
10445 function for the relocation then go ahead, else default
10446 to the generic handling. */
10447 if (gp_found
10448 && (*parent)->howto->special_function
10449 == _bfd_mips_elf32_gprel16_reloc)
10450 r = _bfd_mips_elf_gprel16_with_gp (input_bfd, sym, *parent,
10451 input_section, relocatable,
10452 data, gp);
10453 else
10454 r = bfd_perform_relocation (input_bfd, *parent, data,
10455 input_section,
10456 relocatable ? abfd : NULL,
10457 &error_message);
10459 if (relocatable)
10461 asection *os = input_section->output_section;
10463 /* A partial link, so keep the relocs */
10464 os->orelocation[os->reloc_count] = *parent;
10465 os->reloc_count++;
10468 if (r != bfd_reloc_ok)
10470 switch (r)
10472 case bfd_reloc_undefined:
10473 if (!((*link_info->callbacks->undefined_symbol)
10474 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
10475 input_bfd, input_section, (*parent)->address, TRUE)))
10476 goto error_return;
10477 break;
10478 case bfd_reloc_dangerous:
10479 BFD_ASSERT (error_message != NULL);
10480 if (!((*link_info->callbacks->reloc_dangerous)
10481 (link_info, error_message, input_bfd, input_section,
10482 (*parent)->address)))
10483 goto error_return;
10484 break;
10485 case bfd_reloc_overflow:
10486 if (!((*link_info->callbacks->reloc_overflow)
10487 (link_info, NULL,
10488 bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
10489 (*parent)->howto->name, (*parent)->addend,
10490 input_bfd, input_section, (*parent)->address)))
10491 goto error_return;
10492 break;
10493 case bfd_reloc_outofrange:
10494 default:
10495 abort ();
10496 break;
10502 if (reloc_vector != NULL)
10503 free (reloc_vector);
10504 return data;
10506 error_return:
10507 if (reloc_vector != NULL)
10508 free (reloc_vector);
10509 return NULL;
10512 /* Create a MIPS ELF linker hash table. */
10514 struct bfd_link_hash_table *
10515 _bfd_mips_elf_link_hash_table_create (bfd *abfd)
10517 struct mips_elf_link_hash_table *ret;
10518 bfd_size_type amt = sizeof (struct mips_elf_link_hash_table);
10520 ret = bfd_malloc (amt);
10521 if (ret == NULL)
10522 return NULL;
10524 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
10525 mips_elf_link_hash_newfunc,
10526 sizeof (struct mips_elf_link_hash_entry)))
10528 free (ret);
10529 return NULL;
10532 #if 0
10533 /* We no longer use this. */
10534 for (i = 0; i < SIZEOF_MIPS_DYNSYM_SECNAMES; i++)
10535 ret->dynsym_sec_strindex[i] = (bfd_size_type) -1;
10536 #endif
10537 ret->procedure_count = 0;
10538 ret->compact_rel_size = 0;
10539 ret->use_rld_obj_head = FALSE;
10540 ret->rld_value = 0;
10541 ret->mips16_stubs_seen = FALSE;
10542 ret->computed_got_sizes = FALSE;
10543 ret->is_vxworks = FALSE;
10544 ret->small_data_overflow_reported = FALSE;
10545 ret->srelbss = NULL;
10546 ret->sdynbss = NULL;
10547 ret->srelplt = NULL;
10548 ret->srelplt2 = NULL;
10549 ret->sgotplt = NULL;
10550 ret->splt = NULL;
10551 ret->plt_header_size = 0;
10552 ret->plt_entry_size = 0;
10553 ret->function_stub_size = 0;
10555 return &ret->root.root;
10558 /* Likewise, but indicate that the target is VxWorks. */
10560 struct bfd_link_hash_table *
10561 _bfd_mips_vxworks_link_hash_table_create (bfd *abfd)
10563 struct bfd_link_hash_table *ret;
10565 ret = _bfd_mips_elf_link_hash_table_create (abfd);
10566 if (ret)
10568 struct mips_elf_link_hash_table *htab;
10570 htab = (struct mips_elf_link_hash_table *) ret;
10571 htab->is_vxworks = 1;
10573 return ret;
10576 /* We need to use a special link routine to handle the .reginfo and
10577 the .mdebug sections. We need to merge all instances of these
10578 sections together, not write them all out sequentially. */
10580 bfd_boolean
10581 _bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
10583 asection *o;
10584 struct bfd_link_order *p;
10585 asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
10586 asection *rtproc_sec;
10587 Elf32_RegInfo reginfo;
10588 struct ecoff_debug_info debug;
10589 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10590 const struct ecoff_debug_swap *swap = bed->elf_backend_ecoff_debug_swap;
10591 HDRR *symhdr = &debug.symbolic_header;
10592 void *mdebug_handle = NULL;
10593 asection *s;
10594 EXTR esym;
10595 unsigned int i;
10596 bfd_size_type amt;
10597 struct mips_elf_link_hash_table *htab;
10599 static const char * const secname[] =
10601 ".text", ".init", ".fini", ".data",
10602 ".rodata", ".sdata", ".sbss", ".bss"
10604 static const int sc[] =
10606 scText, scInit, scFini, scData,
10607 scRData, scSData, scSBss, scBss
10610 /* We'd carefully arranged the dynamic symbol indices, and then the
10611 generic size_dynamic_sections renumbered them out from under us.
10612 Rather than trying somehow to prevent the renumbering, just do
10613 the sort again. */
10614 htab = mips_elf_hash_table (info);
10615 if (elf_hash_table (info)->dynamic_sections_created)
10617 bfd *dynobj;
10618 asection *got;
10619 struct mips_got_info *g;
10620 bfd_size_type dynsecsymcount;
10622 /* When we resort, we must tell mips_elf_sort_hash_table what
10623 the lowest index it may use is. That's the number of section
10624 symbols we're going to add. The generic ELF linker only
10625 adds these symbols when building a shared object. Note that
10626 we count the sections after (possibly) removing the .options
10627 section above. */
10629 dynsecsymcount = count_section_dynsyms (abfd, info);
10630 if (! mips_elf_sort_hash_table (info, dynsecsymcount + 1))
10631 return FALSE;
10633 /* Make sure we didn't grow the global .got region. */
10634 dynobj = elf_hash_table (info)->dynobj;
10635 got = mips_elf_got_section (dynobj, FALSE);
10636 g = mips_elf_section_data (got)->u.got_info;
10638 if (g->global_gotsym != NULL)
10639 BFD_ASSERT ((elf_hash_table (info)->dynsymcount
10640 - g->global_gotsym->dynindx)
10641 <= g->global_gotno);
10644 /* Get a value for the GP register. */
10645 if (elf_gp (abfd) == 0)
10647 struct bfd_link_hash_entry *h;
10649 h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
10650 if (h != NULL && h->type == bfd_link_hash_defined)
10651 elf_gp (abfd) = (h->u.def.value
10652 + h->u.def.section->output_section->vma
10653 + h->u.def.section->output_offset);
10654 else if (htab->is_vxworks
10655 && (h = bfd_link_hash_lookup (info->hash,
10656 "_GLOBAL_OFFSET_TABLE_",
10657 FALSE, FALSE, TRUE))
10658 && h->type == bfd_link_hash_defined)
10659 elf_gp (abfd) = (h->u.def.section->output_section->vma
10660 + h->u.def.section->output_offset
10661 + h->u.def.value);
10662 else if (info->relocatable)
10664 bfd_vma lo = MINUS_ONE;
10666 /* Find the GP-relative section with the lowest offset. */
10667 for (o = abfd->sections; o != NULL; o = o->next)
10668 if (o->vma < lo
10669 && (elf_section_data (o)->this_hdr.sh_flags & SHF_MIPS_GPREL))
10670 lo = o->vma;
10672 /* And calculate GP relative to that. */
10673 elf_gp (abfd) = lo + ELF_MIPS_GP_OFFSET (info);
10675 else
10677 /* If the relocate_section function needs to do a reloc
10678 involving the GP value, it should make a reloc_dangerous
10679 callback to warn that GP is not defined. */
10683 /* Go through the sections and collect the .reginfo and .mdebug
10684 information. */
10685 reginfo_sec = NULL;
10686 mdebug_sec = NULL;
10687 gptab_data_sec = NULL;
10688 gptab_bss_sec = NULL;
10689 for (o = abfd->sections; o != NULL; o = o->next)
10691 if (strcmp (o->name, ".reginfo") == 0)
10693 memset (&reginfo, 0, sizeof reginfo);
10695 /* We have found the .reginfo section in the output file.
10696 Look through all the link_orders comprising it and merge
10697 the information together. */
10698 for (p = o->map_head.link_order; p != NULL; p = p->next)
10700 asection *input_section;
10701 bfd *input_bfd;
10702 Elf32_External_RegInfo ext;
10703 Elf32_RegInfo sub;
10705 if (p->type != bfd_indirect_link_order)
10707 if (p->type == bfd_data_link_order)
10708 continue;
10709 abort ();
10712 input_section = p->u.indirect.section;
10713 input_bfd = input_section->owner;
10715 if (! bfd_get_section_contents (input_bfd, input_section,
10716 &ext, 0, sizeof ext))
10717 return FALSE;
10719 bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub);
10721 reginfo.ri_gprmask |= sub.ri_gprmask;
10722 reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
10723 reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
10724 reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
10725 reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
10727 /* ri_gp_value is set by the function
10728 mips_elf32_section_processing when the section is
10729 finally written out. */
10731 /* Hack: reset the SEC_HAS_CONTENTS flag so that
10732 elf_link_input_bfd ignores this section. */
10733 input_section->flags &= ~SEC_HAS_CONTENTS;
10736 /* Size has been set in _bfd_mips_elf_always_size_sections. */
10737 BFD_ASSERT(o->size == sizeof (Elf32_External_RegInfo));
10739 /* Skip this section later on (I don't think this currently
10740 matters, but someday it might). */
10741 o->map_head.link_order = NULL;
10743 reginfo_sec = o;
10746 if (strcmp (o->name, ".mdebug") == 0)
10748 struct extsym_info einfo;
10749 bfd_vma last;
10751 /* We have found the .mdebug section in the output file.
10752 Look through all the link_orders comprising it and merge
10753 the information together. */
10754 symhdr->magic = swap->sym_magic;
10755 /* FIXME: What should the version stamp be? */
10756 symhdr->vstamp = 0;
10757 symhdr->ilineMax = 0;
10758 symhdr->cbLine = 0;
10759 symhdr->idnMax = 0;
10760 symhdr->ipdMax = 0;
10761 symhdr->isymMax = 0;
10762 symhdr->ioptMax = 0;
10763 symhdr->iauxMax = 0;
10764 symhdr->issMax = 0;
10765 symhdr->issExtMax = 0;
10766 symhdr->ifdMax = 0;
10767 symhdr->crfd = 0;
10768 symhdr->iextMax = 0;
10770 /* We accumulate the debugging information itself in the
10771 debug_info structure. */
10772 debug.line = NULL;
10773 debug.external_dnr = NULL;
10774 debug.external_pdr = NULL;
10775 debug.external_sym = NULL;
10776 debug.external_opt = NULL;
10777 debug.external_aux = NULL;
10778 debug.ss = NULL;
10779 debug.ssext = debug.ssext_end = NULL;
10780 debug.external_fdr = NULL;
10781 debug.external_rfd = NULL;
10782 debug.external_ext = debug.external_ext_end = NULL;
10784 mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
10785 if (mdebug_handle == NULL)
10786 return FALSE;
10788 esym.jmptbl = 0;
10789 esym.cobol_main = 0;
10790 esym.weakext = 0;
10791 esym.reserved = 0;
10792 esym.ifd = ifdNil;
10793 esym.asym.iss = issNil;
10794 esym.asym.st = stLocal;
10795 esym.asym.reserved = 0;
10796 esym.asym.index = indexNil;
10797 last = 0;
10798 for (i = 0; i < sizeof (secname) / sizeof (secname[0]); i++)
10800 esym.asym.sc = sc[i];
10801 s = bfd_get_section_by_name (abfd, secname[i]);
10802 if (s != NULL)
10804 esym.asym.value = s->vma;
10805 last = s->vma + s->size;
10807 else
10808 esym.asym.value = last;
10809 if (!bfd_ecoff_debug_one_external (abfd, &debug, swap,
10810 secname[i], &esym))
10811 return FALSE;
10814 for (p = o->map_head.link_order; p != NULL; p = p->next)
10816 asection *input_section;
10817 bfd *input_bfd;
10818 const struct ecoff_debug_swap *input_swap;
10819 struct ecoff_debug_info input_debug;
10820 char *eraw_src;
10821 char *eraw_end;
10823 if (p->type != bfd_indirect_link_order)
10825 if (p->type == bfd_data_link_order)
10826 continue;
10827 abort ();
10830 input_section = p->u.indirect.section;
10831 input_bfd = input_section->owner;
10833 if (bfd_get_flavour (input_bfd) != bfd_target_elf_flavour
10834 || (get_elf_backend_data (input_bfd)
10835 ->elf_backend_ecoff_debug_swap) == NULL)
10837 /* I don't know what a non MIPS ELF bfd would be
10838 doing with a .mdebug section, but I don't really
10839 want to deal with it. */
10840 continue;
10843 input_swap = (get_elf_backend_data (input_bfd)
10844 ->elf_backend_ecoff_debug_swap);
10846 BFD_ASSERT (p->size == input_section->size);
10848 /* The ECOFF linking code expects that we have already
10849 read in the debugging information and set up an
10850 ecoff_debug_info structure, so we do that now. */
10851 if (! _bfd_mips_elf_read_ecoff_info (input_bfd, input_section,
10852 &input_debug))
10853 return FALSE;
10855 if (! (bfd_ecoff_debug_accumulate
10856 (mdebug_handle, abfd, &debug, swap, input_bfd,
10857 &input_debug, input_swap, info)))
10858 return FALSE;
10860 /* Loop through the external symbols. For each one with
10861 interesting information, try to find the symbol in
10862 the linker global hash table and save the information
10863 for the output external symbols. */
10864 eraw_src = input_debug.external_ext;
10865 eraw_end = (eraw_src
10866 + (input_debug.symbolic_header.iextMax
10867 * input_swap->external_ext_size));
10868 for (;
10869 eraw_src < eraw_end;
10870 eraw_src += input_swap->external_ext_size)
10872 EXTR ext;
10873 const char *name;
10874 struct mips_elf_link_hash_entry *h;
10876 (*input_swap->swap_ext_in) (input_bfd, eraw_src, &ext);
10877 if (ext.asym.sc == scNil
10878 || ext.asym.sc == scUndefined
10879 || ext.asym.sc == scSUndefined)
10880 continue;
10882 name = input_debug.ssext + ext.asym.iss;
10883 h = mips_elf_link_hash_lookup (mips_elf_hash_table (info),
10884 name, FALSE, FALSE, TRUE);
10885 if (h == NULL || h->esym.ifd != -2)
10886 continue;
10888 if (ext.ifd != -1)
10890 BFD_ASSERT (ext.ifd
10891 < input_debug.symbolic_header.ifdMax);
10892 ext.ifd = input_debug.ifdmap[ext.ifd];
10895 h->esym = ext;
10898 /* Free up the information we just read. */
10899 free (input_debug.line);
10900 free (input_debug.external_dnr);
10901 free (input_debug.external_pdr);
10902 free (input_debug.external_sym);
10903 free (input_debug.external_opt);
10904 free (input_debug.external_aux);
10905 free (input_debug.ss);
10906 free (input_debug.ssext);
10907 free (input_debug.external_fdr);
10908 free (input_debug.external_rfd);
10909 free (input_debug.external_ext);
10911 /* Hack: reset the SEC_HAS_CONTENTS flag so that
10912 elf_link_input_bfd ignores this section. */
10913 input_section->flags &= ~SEC_HAS_CONTENTS;
10916 if (SGI_COMPAT (abfd) && info->shared)
10918 /* Create .rtproc section. */
10919 rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
10920 if (rtproc_sec == NULL)
10922 flagword flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
10923 | SEC_LINKER_CREATED | SEC_READONLY);
10925 rtproc_sec = bfd_make_section_with_flags (abfd,
10926 ".rtproc",
10927 flags);
10928 if (rtproc_sec == NULL
10929 || ! bfd_set_section_alignment (abfd, rtproc_sec, 4))
10930 return FALSE;
10933 if (! mips_elf_create_procedure_table (mdebug_handle, abfd,
10934 info, rtproc_sec,
10935 &debug))
10936 return FALSE;
10939 /* Build the external symbol information. */
10940 einfo.abfd = abfd;
10941 einfo.info = info;
10942 einfo.debug = &debug;
10943 einfo.swap = swap;
10944 einfo.failed = FALSE;
10945 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
10946 mips_elf_output_extsym, &einfo);
10947 if (einfo.failed)
10948 return FALSE;
10950 /* Set the size of the .mdebug section. */
10951 o->size = bfd_ecoff_debug_size (abfd, &debug, swap);
10953 /* Skip this section later on (I don't think this currently
10954 matters, but someday it might). */
10955 o->map_head.link_order = NULL;
10957 mdebug_sec = o;
10960 if (CONST_STRNEQ (o->name, ".gptab."))
10962 const char *subname;
10963 unsigned int c;
10964 Elf32_gptab *tab;
10965 Elf32_External_gptab *ext_tab;
10966 unsigned int j;
10968 /* The .gptab.sdata and .gptab.sbss sections hold
10969 information describing how the small data area would
10970 change depending upon the -G switch. These sections
10971 not used in executables files. */
10972 if (! info->relocatable)
10974 for (p = o->map_head.link_order; p != NULL; p = p->next)
10976 asection *input_section;
10978 if (p->type != bfd_indirect_link_order)
10980 if (p->type == bfd_data_link_order)
10981 continue;
10982 abort ();
10985 input_section = p->u.indirect.section;
10987 /* Hack: reset the SEC_HAS_CONTENTS flag so that
10988 elf_link_input_bfd ignores this section. */
10989 input_section->flags &= ~SEC_HAS_CONTENTS;
10992 /* Skip this section later on (I don't think this
10993 currently matters, but someday it might). */
10994 o->map_head.link_order = NULL;
10996 /* Really remove the section. */
10997 bfd_section_list_remove (abfd, o);
10998 --abfd->section_count;
11000 continue;
11003 /* There is one gptab for initialized data, and one for
11004 uninitialized data. */
11005 if (strcmp (o->name, ".gptab.sdata") == 0)
11006 gptab_data_sec = o;
11007 else if (strcmp (o->name, ".gptab.sbss") == 0)
11008 gptab_bss_sec = o;
11009 else
11011 (*_bfd_error_handler)
11012 (_("%s: illegal section name `%s'"),
11013 bfd_get_filename (abfd), o->name);
11014 bfd_set_error (bfd_error_nonrepresentable_section);
11015 return FALSE;
11018 /* The linker script always combines .gptab.data and
11019 .gptab.sdata into .gptab.sdata, and likewise for
11020 .gptab.bss and .gptab.sbss. It is possible that there is
11021 no .sdata or .sbss section in the output file, in which
11022 case we must change the name of the output section. */
11023 subname = o->name + sizeof ".gptab" - 1;
11024 if (bfd_get_section_by_name (abfd, subname) == NULL)
11026 if (o == gptab_data_sec)
11027 o->name = ".gptab.data";
11028 else
11029 o->name = ".gptab.bss";
11030 subname = o->name + sizeof ".gptab" - 1;
11031 BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
11034 /* Set up the first entry. */
11035 c = 1;
11036 amt = c * sizeof (Elf32_gptab);
11037 tab = bfd_malloc (amt);
11038 if (tab == NULL)
11039 return FALSE;
11040 tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
11041 tab[0].gt_header.gt_unused = 0;
11043 /* Combine the input sections. */
11044 for (p = o->map_head.link_order; p != NULL; p = p->next)
11046 asection *input_section;
11047 bfd *input_bfd;
11048 bfd_size_type size;
11049 unsigned long last;
11050 bfd_size_type gpentry;
11052 if (p->type != bfd_indirect_link_order)
11054 if (p->type == bfd_data_link_order)
11055 continue;
11056 abort ();
11059 input_section = p->u.indirect.section;
11060 input_bfd = input_section->owner;
11062 /* Combine the gptab entries for this input section one
11063 by one. We know that the input gptab entries are
11064 sorted by ascending -G value. */
11065 size = input_section->size;
11066 last = 0;
11067 for (gpentry = sizeof (Elf32_External_gptab);
11068 gpentry < size;
11069 gpentry += sizeof (Elf32_External_gptab))
11071 Elf32_External_gptab ext_gptab;
11072 Elf32_gptab int_gptab;
11073 unsigned long val;
11074 unsigned long add;
11075 bfd_boolean exact;
11076 unsigned int look;
11078 if (! (bfd_get_section_contents
11079 (input_bfd, input_section, &ext_gptab, gpentry,
11080 sizeof (Elf32_External_gptab))))
11082 free (tab);
11083 return FALSE;
11086 bfd_mips_elf32_swap_gptab_in (input_bfd, &ext_gptab,
11087 &int_gptab);
11088 val = int_gptab.gt_entry.gt_g_value;
11089 add = int_gptab.gt_entry.gt_bytes - last;
11091 exact = FALSE;
11092 for (look = 1; look < c; look++)
11094 if (tab[look].gt_entry.gt_g_value >= val)
11095 tab[look].gt_entry.gt_bytes += add;
11097 if (tab[look].gt_entry.gt_g_value == val)
11098 exact = TRUE;
11101 if (! exact)
11103 Elf32_gptab *new_tab;
11104 unsigned int max;
11106 /* We need a new table entry. */
11107 amt = (bfd_size_type) (c + 1) * sizeof (Elf32_gptab);
11108 new_tab = bfd_realloc (tab, amt);
11109 if (new_tab == NULL)
11111 free (tab);
11112 return FALSE;
11114 tab = new_tab;
11115 tab[c].gt_entry.gt_g_value = val;
11116 tab[c].gt_entry.gt_bytes = add;
11118 /* Merge in the size for the next smallest -G
11119 value, since that will be implied by this new
11120 value. */
11121 max = 0;
11122 for (look = 1; look < c; look++)
11124 if (tab[look].gt_entry.gt_g_value < val
11125 && (max == 0
11126 || (tab[look].gt_entry.gt_g_value
11127 > tab[max].gt_entry.gt_g_value)))
11128 max = look;
11130 if (max != 0)
11131 tab[c].gt_entry.gt_bytes +=
11132 tab[max].gt_entry.gt_bytes;
11134 ++c;
11137 last = int_gptab.gt_entry.gt_bytes;
11140 /* Hack: reset the SEC_HAS_CONTENTS flag so that
11141 elf_link_input_bfd ignores this section. */
11142 input_section->flags &= ~SEC_HAS_CONTENTS;
11145 /* The table must be sorted by -G value. */
11146 if (c > 2)
11147 qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
11149 /* Swap out the table. */
11150 amt = (bfd_size_type) c * sizeof (Elf32_External_gptab);
11151 ext_tab = bfd_alloc (abfd, amt);
11152 if (ext_tab == NULL)
11154 free (tab);
11155 return FALSE;
11158 for (j = 0; j < c; j++)
11159 bfd_mips_elf32_swap_gptab_out (abfd, tab + j, ext_tab + j);
11160 free (tab);
11162 o->size = c * sizeof (Elf32_External_gptab);
11163 o->contents = (bfd_byte *) ext_tab;
11165 /* Skip this section later on (I don't think this currently
11166 matters, but someday it might). */
11167 o->map_head.link_order = NULL;
11171 /* Invoke the regular ELF backend linker to do all the work. */
11172 if (!bfd_elf_final_link (abfd, info))
11173 return FALSE;
11175 /* Now write out the computed sections. */
11177 if (reginfo_sec != NULL)
11179 Elf32_External_RegInfo ext;
11181 bfd_mips_elf32_swap_reginfo_out (abfd, &reginfo, &ext);
11182 if (! bfd_set_section_contents (abfd, reginfo_sec, &ext, 0, sizeof ext))
11183 return FALSE;
11186 if (mdebug_sec != NULL)
11188 BFD_ASSERT (abfd->output_has_begun);
11189 if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
11190 swap, info,
11191 mdebug_sec->filepos))
11192 return FALSE;
11194 bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
11197 if (gptab_data_sec != NULL)
11199 if (! bfd_set_section_contents (abfd, gptab_data_sec,
11200 gptab_data_sec->contents,
11201 0, gptab_data_sec->size))
11202 return FALSE;
11205 if (gptab_bss_sec != NULL)
11207 if (! bfd_set_section_contents (abfd, gptab_bss_sec,
11208 gptab_bss_sec->contents,
11209 0, gptab_bss_sec->size))
11210 return FALSE;
11213 if (SGI_COMPAT (abfd))
11215 rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
11216 if (rtproc_sec != NULL)
11218 if (! bfd_set_section_contents (abfd, rtproc_sec,
11219 rtproc_sec->contents,
11220 0, rtproc_sec->size))
11221 return FALSE;
11225 return TRUE;
11228 /* Structure for saying that BFD machine EXTENSION extends BASE. */
11230 struct mips_mach_extension {
11231 unsigned long extension, base;
11235 /* An array describing how BFD machines relate to one another. The entries
11236 are ordered topologically with MIPS I extensions listed last. */
11238 static const struct mips_mach_extension mips_mach_extensions[] = {
11239 /* MIPS64r2 extensions. */
11240 { bfd_mach_mips_octeon, bfd_mach_mipsisa64r2 },
11242 /* MIPS64 extensions. */
11243 { bfd_mach_mipsisa64r2, bfd_mach_mipsisa64 },
11244 { bfd_mach_mips_sb1, bfd_mach_mipsisa64 },
11246 /* MIPS V extensions. */
11247 { bfd_mach_mipsisa64, bfd_mach_mips5 },
11249 /* R10000 extensions. */
11250 { bfd_mach_mips12000, bfd_mach_mips10000 },
11252 /* R5000 extensions. Note: the vr5500 ISA is an extension of the core
11253 vr5400 ISA, but doesn't include the multimedia stuff. It seems
11254 better to allow vr5400 and vr5500 code to be merged anyway, since
11255 many libraries will just use the core ISA. Perhaps we could add
11256 some sort of ASE flag if this ever proves a problem. */
11257 { bfd_mach_mips5500, bfd_mach_mips5400 },
11258 { bfd_mach_mips5400, bfd_mach_mips5000 },
11260 /* MIPS IV extensions. */
11261 { bfd_mach_mips5, bfd_mach_mips8000 },
11262 { bfd_mach_mips10000, bfd_mach_mips8000 },
11263 { bfd_mach_mips5000, bfd_mach_mips8000 },
11264 { bfd_mach_mips7000, bfd_mach_mips8000 },
11265 { bfd_mach_mips9000, bfd_mach_mips8000 },
11267 /* VR4100 extensions. */
11268 { bfd_mach_mips4120, bfd_mach_mips4100 },
11269 { bfd_mach_mips4111, bfd_mach_mips4100 },
11271 /* MIPS III extensions. */
11272 { bfd_mach_mips_loongson_2e, bfd_mach_mips4000 },
11273 { bfd_mach_mips_loongson_2f, bfd_mach_mips4000 },
11274 { bfd_mach_mips8000, bfd_mach_mips4000 },
11275 { bfd_mach_mips4650, bfd_mach_mips4000 },
11276 { bfd_mach_mips4600, bfd_mach_mips4000 },
11277 { bfd_mach_mips4400, bfd_mach_mips4000 },
11278 { bfd_mach_mips4300, bfd_mach_mips4000 },
11279 { bfd_mach_mips4100, bfd_mach_mips4000 },
11280 { bfd_mach_mips4010, bfd_mach_mips4000 },
11282 /* MIPS32 extensions. */
11283 { bfd_mach_mipsisa32r2, bfd_mach_mipsisa32 },
11285 /* MIPS II extensions. */
11286 { bfd_mach_mips4000, bfd_mach_mips6000 },
11287 { bfd_mach_mipsisa32, bfd_mach_mips6000 },
11289 /* MIPS I extensions. */
11290 { bfd_mach_mips6000, bfd_mach_mips3000 },
11291 { bfd_mach_mips3900, bfd_mach_mips3000 }
11295 /* Return true if bfd machine EXTENSION is an extension of machine BASE. */
11297 static bfd_boolean
11298 mips_mach_extends_p (unsigned long base, unsigned long extension)
11300 size_t i;
11302 if (extension == base)
11303 return TRUE;
11305 if (base == bfd_mach_mipsisa32
11306 && mips_mach_extends_p (bfd_mach_mipsisa64, extension))
11307 return TRUE;
11309 if (base == bfd_mach_mipsisa32r2
11310 && mips_mach_extends_p (bfd_mach_mipsisa64r2, extension))
11311 return TRUE;
11313 for (i = 0; i < ARRAY_SIZE (mips_mach_extensions); i++)
11314 if (extension == mips_mach_extensions[i].extension)
11316 extension = mips_mach_extensions[i].base;
11317 if (extension == base)
11318 return TRUE;
11321 return FALSE;
11325 /* Return true if the given ELF header flags describe a 32-bit binary. */
11327 static bfd_boolean
11328 mips_32bit_flags_p (flagword flags)
11330 return ((flags & EF_MIPS_32BITMODE) != 0
11331 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_O32
11332 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32
11333 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1
11334 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2
11335 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32
11336 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2);
11340 /* Merge object attributes from IBFD into OBFD. Raise an error if
11341 there are conflicting attributes. */
11342 static bfd_boolean
11343 mips_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
11345 obj_attribute *in_attr;
11346 obj_attribute *out_attr;
11348 if (!elf_known_obj_attributes_proc (obfd)[0].i)
11350 /* This is the first object. Copy the attributes. */
11351 _bfd_elf_copy_obj_attributes (ibfd, obfd);
11353 /* Use the Tag_null value to indicate the attributes have been
11354 initialized. */
11355 elf_known_obj_attributes_proc (obfd)[0].i = 1;
11357 return TRUE;
11360 /* Check for conflicting Tag_GNU_MIPS_ABI_FP attributes and merge
11361 non-conflicting ones. */
11362 in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
11363 out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
11364 if (in_attr[Tag_GNU_MIPS_ABI_FP].i != out_attr[Tag_GNU_MIPS_ABI_FP].i)
11366 out_attr[Tag_GNU_MIPS_ABI_FP].type = 1;
11367 if (out_attr[Tag_GNU_MIPS_ABI_FP].i == 0)
11368 out_attr[Tag_GNU_MIPS_ABI_FP].i = in_attr[Tag_GNU_MIPS_ABI_FP].i;
11369 else if (in_attr[Tag_GNU_MIPS_ABI_FP].i == 0)
11371 else if (in_attr[Tag_GNU_MIPS_ABI_FP].i > 4)
11372 _bfd_error_handler
11373 (_("Warning: %B uses unknown floating point ABI %d"), ibfd,
11374 in_attr[Tag_GNU_MIPS_ABI_FP].i);
11375 else if (out_attr[Tag_GNU_MIPS_ABI_FP].i > 4)
11376 _bfd_error_handler
11377 (_("Warning: %B uses unknown floating point ABI %d"), obfd,
11378 out_attr[Tag_GNU_MIPS_ABI_FP].i);
11379 else
11380 switch (out_attr[Tag_GNU_MIPS_ABI_FP].i)
11382 case 1:
11383 switch (in_attr[Tag_GNU_MIPS_ABI_FP].i)
11385 case 2:
11386 _bfd_error_handler
11387 (_("Warning: %B uses -msingle-float, %B uses -mdouble-float"),
11388 obfd, ibfd);
11389 break;
11391 case 3:
11392 _bfd_error_handler
11393 (_("Warning: %B uses hard float, %B uses soft float"),
11394 obfd, ibfd);
11395 break;
11397 case 4:
11398 _bfd_error_handler
11399 (_("Warning: %B uses -msingle-float, %B uses -mips32r2 -mfp64"),
11400 obfd, ibfd);
11401 break;
11403 default:
11404 abort ();
11406 break;
11408 case 2:
11409 switch (in_attr[Tag_GNU_MIPS_ABI_FP].i)
11411 case 1:
11412 _bfd_error_handler
11413 (_("Warning: %B uses -msingle-float, %B uses -mdouble-float"),
11414 ibfd, obfd);
11415 break;
11417 case 3:
11418 _bfd_error_handler
11419 (_("Warning: %B uses hard float, %B uses soft float"),
11420 obfd, ibfd);
11421 break;
11423 case 4:
11424 _bfd_error_handler
11425 (_("Warning: %B uses -mdouble-float, %B uses -mips32r2 -mfp64"),
11426 obfd, ibfd);
11427 break;
11429 default:
11430 abort ();
11432 break;
11434 case 3:
11435 switch (in_attr[Tag_GNU_MIPS_ABI_FP].i)
11437 case 1:
11438 case 2:
11439 case 4:
11440 _bfd_error_handler
11441 (_("Warning: %B uses hard float, %B uses soft float"),
11442 ibfd, obfd);
11443 break;
11445 default:
11446 abort ();
11448 break;
11450 case 4:
11451 switch (in_attr[Tag_GNU_MIPS_ABI_FP].i)
11453 case 1:
11454 _bfd_error_handler
11455 (_("Warning: %B uses -msingle-float, %B uses -mips32r2 -mfp64"),
11456 ibfd, obfd);
11457 break;
11459 case 2:
11460 _bfd_error_handler
11461 (_("Warning: %B uses -mdouble-float, %B uses -mips32r2 -mfp64"),
11462 ibfd, obfd);
11463 break;
11465 case 3:
11466 _bfd_error_handler
11467 (_("Warning: %B uses hard float, %B uses soft float"),
11468 obfd, ibfd);
11469 break;
11471 default:
11472 abort ();
11474 break;
11476 default:
11477 abort ();
11481 /* Merge Tag_compatibility attributes and any common GNU ones. */
11482 _bfd_elf_merge_object_attributes (ibfd, obfd);
11484 return TRUE;
11487 /* Merge backend specific data from an object file to the output
11488 object file when linking. */
11490 bfd_boolean
11491 _bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
11493 flagword old_flags;
11494 flagword new_flags;
11495 bfd_boolean ok;
11496 bfd_boolean null_input_bfd = TRUE;
11497 asection *sec;
11499 /* Check if we have the same endianess */
11500 if (! _bfd_generic_verify_endian_match (ibfd, obfd))
11502 (*_bfd_error_handler)
11503 (_("%B: endianness incompatible with that of the selected emulation"),
11504 ibfd);
11505 return FALSE;
11508 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
11509 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
11510 return TRUE;
11512 if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
11514 (*_bfd_error_handler)
11515 (_("%B: ABI is incompatible with that of the selected emulation"),
11516 ibfd);
11517 return FALSE;
11520 if (!mips_elf_merge_obj_attributes (ibfd, obfd))
11521 return FALSE;
11523 new_flags = elf_elfheader (ibfd)->e_flags;
11524 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_NOREORDER;
11525 old_flags = elf_elfheader (obfd)->e_flags;
11527 if (! elf_flags_init (obfd))
11529 elf_flags_init (obfd) = TRUE;
11530 elf_elfheader (obfd)->e_flags = new_flags;
11531 elf_elfheader (obfd)->e_ident[EI_CLASS]
11532 = elf_elfheader (ibfd)->e_ident[EI_CLASS];
11534 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
11535 && (bfd_get_arch_info (obfd)->the_default
11536 || mips_mach_extends_p (bfd_get_mach (obfd),
11537 bfd_get_mach (ibfd))))
11539 if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
11540 bfd_get_mach (ibfd)))
11541 return FALSE;
11544 return TRUE;
11547 /* Check flag compatibility. */
11549 new_flags &= ~EF_MIPS_NOREORDER;
11550 old_flags &= ~EF_MIPS_NOREORDER;
11552 /* Some IRIX 6 BSD-compatibility objects have this bit set. It
11553 doesn't seem to matter. */
11554 new_flags &= ~EF_MIPS_XGOT;
11555 old_flags &= ~EF_MIPS_XGOT;
11557 /* MIPSpro generates ucode info in n64 objects. Again, we should
11558 just be able to ignore this. */
11559 new_flags &= ~EF_MIPS_UCODE;
11560 old_flags &= ~EF_MIPS_UCODE;
11562 /* Don't care about the PIC flags from dynamic objects; they are
11563 PIC by design. */
11564 if ((new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0
11565 && (ibfd->flags & DYNAMIC) != 0)
11566 new_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
11568 if (new_flags == old_flags)
11569 return TRUE;
11571 /* Check to see if the input BFD actually contains any sections.
11572 If not, its flags may not have been initialised either, but it cannot
11573 actually cause any incompatibility. */
11574 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
11576 /* Ignore synthetic sections and empty .text, .data and .bss sections
11577 which are automatically generated by gas. */
11578 if (strcmp (sec->name, ".reginfo")
11579 && strcmp (sec->name, ".mdebug")
11580 && (sec->size != 0
11581 || (strcmp (sec->name, ".text")
11582 && strcmp (sec->name, ".data")
11583 && strcmp (sec->name, ".bss"))))
11585 null_input_bfd = FALSE;
11586 break;
11589 if (null_input_bfd)
11590 return TRUE;
11592 ok = TRUE;
11594 if (((new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0)
11595 != ((old_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0))
11597 (*_bfd_error_handler)
11598 (_("%B: warning: linking PIC files with non-PIC files"),
11599 ibfd);
11600 ok = TRUE;
11603 if (new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC))
11604 elf_elfheader (obfd)->e_flags |= EF_MIPS_CPIC;
11605 if (! (new_flags & EF_MIPS_PIC))
11606 elf_elfheader (obfd)->e_flags &= ~EF_MIPS_PIC;
11608 new_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
11609 old_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
11611 /* Compare the ISAs. */
11612 if (mips_32bit_flags_p (old_flags) != mips_32bit_flags_p (new_flags))
11614 (*_bfd_error_handler)
11615 (_("%B: linking 32-bit code with 64-bit code"),
11616 ibfd);
11617 ok = FALSE;
11619 else if (!mips_mach_extends_p (bfd_get_mach (ibfd), bfd_get_mach (obfd)))
11621 /* OBFD's ISA isn't the same as, or an extension of, IBFD's. */
11622 if (mips_mach_extends_p (bfd_get_mach (obfd), bfd_get_mach (ibfd)))
11624 /* Copy the architecture info from IBFD to OBFD. Also copy
11625 the 32-bit flag (if set) so that we continue to recognise
11626 OBFD as a 32-bit binary. */
11627 bfd_set_arch_info (obfd, bfd_get_arch_info (ibfd));
11628 elf_elfheader (obfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
11629 elf_elfheader (obfd)->e_flags
11630 |= new_flags & (EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
11632 /* Copy across the ABI flags if OBFD doesn't use them
11633 and if that was what caused us to treat IBFD as 32-bit. */
11634 if ((old_flags & EF_MIPS_ABI) == 0
11635 && mips_32bit_flags_p (new_flags)
11636 && !mips_32bit_flags_p (new_flags & ~EF_MIPS_ABI))
11637 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ABI;
11639 else
11641 /* The ISAs aren't compatible. */
11642 (*_bfd_error_handler)
11643 (_("%B: linking %s module with previous %s modules"),
11644 ibfd,
11645 bfd_printable_name (ibfd),
11646 bfd_printable_name (obfd));
11647 ok = FALSE;
11651 new_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
11652 old_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
11654 /* Compare ABIs. The 64-bit ABI does not use EF_MIPS_ABI. But, it
11655 does set EI_CLASS differently from any 32-bit ABI. */
11656 if ((new_flags & EF_MIPS_ABI) != (old_flags & EF_MIPS_ABI)
11657 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
11658 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
11660 /* Only error if both are set (to different values). */
11661 if (((new_flags & EF_MIPS_ABI) && (old_flags & EF_MIPS_ABI))
11662 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
11663 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
11665 (*_bfd_error_handler)
11666 (_("%B: ABI mismatch: linking %s module with previous %s modules"),
11667 ibfd,
11668 elf_mips_abi_name (ibfd),
11669 elf_mips_abi_name (obfd));
11670 ok = FALSE;
11672 new_flags &= ~EF_MIPS_ABI;
11673 old_flags &= ~EF_MIPS_ABI;
11676 /* For now, allow arbitrary mixing of ASEs (retain the union). */
11677 if ((new_flags & EF_MIPS_ARCH_ASE) != (old_flags & EF_MIPS_ARCH_ASE))
11679 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ARCH_ASE;
11681 new_flags &= ~ EF_MIPS_ARCH_ASE;
11682 old_flags &= ~ EF_MIPS_ARCH_ASE;
11685 /* Warn about any other mismatches */
11686 if (new_flags != old_flags)
11688 (*_bfd_error_handler)
11689 (_("%B: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
11690 ibfd, (unsigned long) new_flags,
11691 (unsigned long) old_flags);
11692 ok = FALSE;
11695 if (! ok)
11697 bfd_set_error (bfd_error_bad_value);
11698 return FALSE;
11701 return TRUE;
11704 /* Function to keep MIPS specific file flags like as EF_MIPS_PIC. */
11706 bfd_boolean
11707 _bfd_mips_elf_set_private_flags (bfd *abfd, flagword flags)
11709 BFD_ASSERT (!elf_flags_init (abfd)
11710 || elf_elfheader (abfd)->e_flags == flags);
11712 elf_elfheader (abfd)->e_flags = flags;
11713 elf_flags_init (abfd) = TRUE;
11714 return TRUE;
11717 char *
11718 _bfd_mips_elf_get_target_dtag (bfd_vma dtag)
11720 switch (dtag)
11722 default: return "";
11723 case DT_MIPS_RLD_VERSION:
11724 return "MIPS_RLD_VERSION";
11725 case DT_MIPS_TIME_STAMP:
11726 return "MIPS_TIME_STAMP";
11727 case DT_MIPS_ICHECKSUM:
11728 return "MIPS_ICHECKSUM";
11729 case DT_MIPS_IVERSION:
11730 return "MIPS_IVERSION";
11731 case DT_MIPS_FLAGS:
11732 return "MIPS_FLAGS";
11733 case DT_MIPS_BASE_ADDRESS:
11734 return "MIPS_BASE_ADDRESS";
11735 case DT_MIPS_MSYM:
11736 return "MIPS_MSYM";
11737 case DT_MIPS_CONFLICT:
11738 return "MIPS_CONFLICT";
11739 case DT_MIPS_LIBLIST:
11740 return "MIPS_LIBLIST";
11741 case DT_MIPS_LOCAL_GOTNO:
11742 return "MIPS_LOCAL_GOTNO";
11743 case DT_MIPS_CONFLICTNO:
11744 return "MIPS_CONFLICTNO";
11745 case DT_MIPS_LIBLISTNO:
11746 return "MIPS_LIBLISTNO";
11747 case DT_MIPS_SYMTABNO:
11748 return "MIPS_SYMTABNO";
11749 case DT_MIPS_UNREFEXTNO:
11750 return "MIPS_UNREFEXTNO";
11751 case DT_MIPS_GOTSYM:
11752 return "MIPS_GOTSYM";
11753 case DT_MIPS_HIPAGENO:
11754 return "MIPS_HIPAGENO";
11755 case DT_MIPS_RLD_MAP:
11756 return "MIPS_RLD_MAP";
11757 case DT_MIPS_DELTA_CLASS:
11758 return "MIPS_DELTA_CLASS";
11759 case DT_MIPS_DELTA_CLASS_NO:
11760 return "MIPS_DELTA_CLASS_NO";
11761 case DT_MIPS_DELTA_INSTANCE:
11762 return "MIPS_DELTA_INSTANCE";
11763 case DT_MIPS_DELTA_INSTANCE_NO:
11764 return "MIPS_DELTA_INSTANCE_NO";
11765 case DT_MIPS_DELTA_RELOC:
11766 return "MIPS_DELTA_RELOC";
11767 case DT_MIPS_DELTA_RELOC_NO:
11768 return "MIPS_DELTA_RELOC_NO";
11769 case DT_MIPS_DELTA_SYM:
11770 return "MIPS_DELTA_SYM";
11771 case DT_MIPS_DELTA_SYM_NO:
11772 return "MIPS_DELTA_SYM_NO";
11773 case DT_MIPS_DELTA_CLASSSYM:
11774 return "MIPS_DELTA_CLASSSYM";
11775 case DT_MIPS_DELTA_CLASSSYM_NO:
11776 return "MIPS_DELTA_CLASSSYM_NO";
11777 case DT_MIPS_CXX_FLAGS:
11778 return "MIPS_CXX_FLAGS";
11779 case DT_MIPS_PIXIE_INIT:
11780 return "MIPS_PIXIE_INIT";
11781 case DT_MIPS_SYMBOL_LIB:
11782 return "MIPS_SYMBOL_LIB";
11783 case DT_MIPS_LOCALPAGE_GOTIDX:
11784 return "MIPS_LOCALPAGE_GOTIDX";
11785 case DT_MIPS_LOCAL_GOTIDX:
11786 return "MIPS_LOCAL_GOTIDX";
11787 case DT_MIPS_HIDDEN_GOTIDX:
11788 return "MIPS_HIDDEN_GOTIDX";
11789 case DT_MIPS_PROTECTED_GOTIDX:
11790 return "MIPS_PROTECTED_GOT_IDX";
11791 case DT_MIPS_OPTIONS:
11792 return "MIPS_OPTIONS";
11793 case DT_MIPS_INTERFACE:
11794 return "MIPS_INTERFACE";
11795 case DT_MIPS_DYNSTR_ALIGN:
11796 return "DT_MIPS_DYNSTR_ALIGN";
11797 case DT_MIPS_INTERFACE_SIZE:
11798 return "DT_MIPS_INTERFACE_SIZE";
11799 case DT_MIPS_RLD_TEXT_RESOLVE_ADDR:
11800 return "DT_MIPS_RLD_TEXT_RESOLVE_ADDR";
11801 case DT_MIPS_PERF_SUFFIX:
11802 return "DT_MIPS_PERF_SUFFIX";
11803 case DT_MIPS_COMPACT_SIZE:
11804 return "DT_MIPS_COMPACT_SIZE";
11805 case DT_MIPS_GP_VALUE:
11806 return "DT_MIPS_GP_VALUE";
11807 case DT_MIPS_AUX_DYNAMIC:
11808 return "DT_MIPS_AUX_DYNAMIC";
11812 bfd_boolean
11813 _bfd_mips_elf_print_private_bfd_data (bfd *abfd, void *ptr)
11815 FILE *file = ptr;
11817 BFD_ASSERT (abfd != NULL && ptr != NULL);
11819 /* Print normal ELF private data. */
11820 _bfd_elf_print_private_bfd_data (abfd, ptr);
11822 /* xgettext:c-format */
11823 fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
11825 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O32)
11826 fprintf (file, _(" [abi=O32]"));
11827 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O64)
11828 fprintf (file, _(" [abi=O64]"));
11829 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32)
11830 fprintf (file, _(" [abi=EABI32]"));
11831 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64)
11832 fprintf (file, _(" [abi=EABI64]"));
11833 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI))
11834 fprintf (file, _(" [abi unknown]"));
11835 else if (ABI_N32_P (abfd))
11836 fprintf (file, _(" [abi=N32]"));
11837 else if (ABI_64_P (abfd))
11838 fprintf (file, _(" [abi=64]"));
11839 else
11840 fprintf (file, _(" [no abi set]"));
11842 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
11843 fprintf (file, " [mips1]");
11844 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
11845 fprintf (file, " [mips2]");
11846 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
11847 fprintf (file, " [mips3]");
11848 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
11849 fprintf (file, " [mips4]");
11850 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_5)
11851 fprintf (file, " [mips5]");
11852 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
11853 fprintf (file, " [mips32]");
11854 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64)
11855 fprintf (file, " [mips64]");
11856 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2)
11857 fprintf (file, " [mips32r2]");
11858 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64R2)
11859 fprintf (file, " [mips64r2]");
11860 else
11861 fprintf (file, _(" [unknown ISA]"));
11863 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
11864 fprintf (file, " [mdmx]");
11866 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
11867 fprintf (file, " [mips16]");
11869 if (elf_elfheader (abfd)->e_flags & EF_MIPS_32BITMODE)
11870 fprintf (file, " [32bitmode]");
11871 else
11872 fprintf (file, _(" [not 32bitmode]"));
11874 if (elf_elfheader (abfd)->e_flags & EF_MIPS_NOREORDER)
11875 fprintf (file, " [noreorder]");
11877 if (elf_elfheader (abfd)->e_flags & EF_MIPS_PIC)
11878 fprintf (file, " [PIC]");
11880 if (elf_elfheader (abfd)->e_flags & EF_MIPS_CPIC)
11881 fprintf (file, " [CPIC]");
11883 if (elf_elfheader (abfd)->e_flags & EF_MIPS_XGOT)
11884 fprintf (file, " [XGOT]");
11886 if (elf_elfheader (abfd)->e_flags & EF_MIPS_UCODE)
11887 fprintf (file, " [UCODE]");
11889 fputc ('\n', file);
11891 return TRUE;
11894 const struct bfd_elf_special_section _bfd_mips_elf_special_sections[] =
11896 { STRING_COMMA_LEN (".lit4"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
11897 { STRING_COMMA_LEN (".lit8"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
11898 { STRING_COMMA_LEN (".mdebug"), 0, SHT_MIPS_DEBUG, 0 },
11899 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
11900 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
11901 { STRING_COMMA_LEN (".ucode"), 0, SHT_MIPS_UCODE, 0 },
11902 { NULL, 0, 0, 0, 0 }
11905 /* Merge non visibility st_other attributes. Ensure that the
11906 STO_OPTIONAL flag is copied into h->other, even if this is not a
11907 definiton of the symbol. */
11908 void
11909 _bfd_mips_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
11910 const Elf_Internal_Sym *isym,
11911 bfd_boolean definition,
11912 bfd_boolean dynamic ATTRIBUTE_UNUSED)
11914 if ((isym->st_other & ~ELF_ST_VISIBILITY (-1)) != 0)
11916 unsigned char other;
11918 other = (definition ? isym->st_other : h->other);
11919 other &= ~ELF_ST_VISIBILITY (-1);
11920 h->other = other | ELF_ST_VISIBILITY (h->other);
11923 if (!definition
11924 && ELF_MIPS_IS_OPTIONAL (isym->st_other))
11925 h->other |= STO_OPTIONAL;
11928 /* Decide whether an undefined symbol is special and can be ignored.
11929 This is the case for OPTIONAL symbols on IRIX. */
11930 bfd_boolean
11931 _bfd_mips_elf_ignore_undef_symbol (struct elf_link_hash_entry *h)
11933 return ELF_MIPS_IS_OPTIONAL (h->other) ? TRUE : FALSE;
11936 bfd_boolean
11937 _bfd_mips_elf_common_definition (Elf_Internal_Sym *sym)
11939 return (sym->st_shndx == SHN_COMMON
11940 || sym->st_shndx == SHN_MIPS_ACOMMON
11941 || sym->st_shndx == SHN_MIPS_SCOMMON);