* ldlang.h (lang_input_statement_type): Use bitfields for booleans.
[binutils.git] / bfd / elfxx-mips.c
blob45917811a40571ac8b2df265cb653eb933d08920
1 /* MIPS-specific support for ELF
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3 2003, 2004, 2005, 2006 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 2 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, MA 02110-1301, USA. */
28 /* This file handles functionality common to the different MIPS ABI's. */
30 #include "bfd.h"
31 #include "sysdep.h"
32 #include "libbfd.h"
33 #include "libiberty.h"
34 #include "elf-bfd.h"
35 #include "elfxx-mips.h"
36 #include "elf/mips.h"
37 #include "elf-vxworks.h"
39 /* Get the ECOFF swapping routines. */
40 #include "coff/sym.h"
41 #include "coff/symconst.h"
42 #include "coff/ecoff.h"
43 #include "coff/mips.h"
45 #include "hashtab.h"
47 /* This structure is used to hold information about one GOT entry.
48 There are three types of entry:
50 (1) absolute addresses
51 (abfd == NULL)
52 (2) SYMBOL + OFFSET addresses, where SYMBOL is local to an input bfd
53 (abfd != NULL, symndx >= 0)
54 (3) global and forced-local symbols
55 (abfd != NULL, symndx == -1)
57 Type (3) entries are treated differently for different types of GOT.
58 In the "master" GOT -- i.e. the one that describes every GOT
59 reference needed in the link -- the mips_got_entry is keyed on both
60 the symbol and the input bfd that references it. If it turns out
61 that we need multiple GOTs, we can then use this information to
62 create separate GOTs for each input bfd.
64 However, we want each of these separate GOTs to have at most one
65 entry for a given symbol, so their type (3) entries are keyed only
66 on the symbol. The input bfd given by the "abfd" field is somewhat
67 arbitrary in this case.
69 This means that when there are multiple GOTs, each GOT has a unique
70 mips_got_entry for every symbol within it. We can therefore use the
71 mips_got_entry fields (tls_type and gotidx) to track the symbol's
72 GOT index.
74 However, if it turns out that we need only a single GOT, we continue
75 to use the master GOT to describe it. There may therefore be several
76 mips_got_entries for the same symbol, each with a different input bfd.
77 We want to make sure that each symbol gets a unique GOT entry, so when
78 there's a single GOT, we use the symbol's hash entry, not the
79 mips_got_entry fields, to track a symbol's GOT index. */
80 struct mips_got_entry
82 /* The input bfd in which the symbol is defined. */
83 bfd *abfd;
84 /* The index of the symbol, as stored in the relocation r_info, if
85 we have a local symbol; -1 otherwise. */
86 long symndx;
87 union
89 /* If abfd == NULL, an address that must be stored in the got. */
90 bfd_vma address;
91 /* If abfd != NULL && symndx != -1, the addend of the relocation
92 that should be added to the symbol value. */
93 bfd_vma addend;
94 /* If abfd != NULL && symndx == -1, the hash table entry
95 corresponding to a global symbol in the got (or, local, if
96 h->forced_local). */
97 struct mips_elf_link_hash_entry *h;
98 } d;
100 /* The TLS types included in this GOT entry (specifically, GD and
101 IE). The GD and IE flags can be added as we encounter new
102 relocations. LDM can also be set; it will always be alone, not
103 combined with any GD or IE flags. An LDM GOT entry will be
104 a local symbol entry with r_symndx == 0. */
105 unsigned char tls_type;
107 /* The offset from the beginning of the .got section to the entry
108 corresponding to this symbol+addend. If it's a global symbol
109 whose offset is yet to be decided, it's going to be -1. */
110 long gotidx;
113 /* This structure is used to hold .got information when linking. */
115 struct mips_got_info
117 /* The global symbol in the GOT with the lowest index in the dynamic
118 symbol table. */
119 struct elf_link_hash_entry *global_gotsym;
120 /* The number of global .got entries. */
121 unsigned int global_gotno;
122 /* The number of .got slots used for TLS. */
123 unsigned int tls_gotno;
124 /* The first unused TLS .got entry. Used only during
125 mips_elf_initialize_tls_index. */
126 unsigned int tls_assigned_gotno;
127 /* The number of local .got entries. */
128 unsigned int local_gotno;
129 /* The number of local .got entries we have used. */
130 unsigned int assigned_gotno;
131 /* A hash table holding members of the got. */
132 struct htab *got_entries;
133 /* A hash table mapping input bfds to other mips_got_info. NULL
134 unless multi-got was necessary. */
135 struct htab *bfd2got;
136 /* In multi-got links, a pointer to the next got (err, rather, most
137 of the time, it points to the previous got). */
138 struct mips_got_info *next;
139 /* This is the GOT index of the TLS LDM entry for the GOT, MINUS_ONE
140 for none, or MINUS_TWO for not yet assigned. This is needed
141 because a single-GOT link may have multiple hash table entries
142 for the LDM. It does not get initialized in multi-GOT mode. */
143 bfd_vma tls_ldm_offset;
146 /* Map an input bfd to a got in a multi-got link. */
148 struct mips_elf_bfd2got_hash {
149 bfd *bfd;
150 struct mips_got_info *g;
153 /* Structure passed when traversing the bfd2got hash table, used to
154 create and merge bfd's gots. */
156 struct mips_elf_got_per_bfd_arg
158 /* A hashtable that maps bfds to gots. */
159 htab_t bfd2got;
160 /* The output bfd. */
161 bfd *obfd;
162 /* The link information. */
163 struct bfd_link_info *info;
164 /* A pointer to the primary got, i.e., the one that's going to get
165 the implicit relocations from DT_MIPS_LOCAL_GOTNO and
166 DT_MIPS_GOTSYM. */
167 struct mips_got_info *primary;
168 /* A non-primary got we're trying to merge with other input bfd's
169 gots. */
170 struct mips_got_info *current;
171 /* The maximum number of got entries that can be addressed with a
172 16-bit offset. */
173 unsigned int max_count;
174 /* The number of local and global entries in the primary got. */
175 unsigned int primary_count;
176 /* The number of local and global entries in the current got. */
177 unsigned int current_count;
178 /* The total number of global entries which will live in the
179 primary got and be automatically relocated. This includes
180 those not referenced by the primary GOT but included in
181 the "master" GOT. */
182 unsigned int global_count;
185 /* Another structure used to pass arguments for got entries traversal. */
187 struct mips_elf_set_global_got_offset_arg
189 struct mips_got_info *g;
190 int value;
191 unsigned int needed_relocs;
192 struct bfd_link_info *info;
195 /* A structure used to count TLS relocations or GOT entries, for GOT
196 entry or ELF symbol table traversal. */
198 struct mips_elf_count_tls_arg
200 struct bfd_link_info *info;
201 unsigned int needed;
204 struct _mips_elf_section_data
206 struct bfd_elf_section_data elf;
207 union
209 struct mips_got_info *got_info;
210 bfd_byte *tdata;
211 } u;
214 #define mips_elf_section_data(sec) \
215 ((struct _mips_elf_section_data *) elf_section_data (sec))
217 /* This structure is passed to mips_elf_sort_hash_table_f when sorting
218 the dynamic symbols. */
220 struct mips_elf_hash_sort_data
222 /* The symbol in the global GOT with the lowest dynamic symbol table
223 index. */
224 struct elf_link_hash_entry *low;
225 /* The least dynamic symbol table index corresponding to a non-TLS
226 symbol with a GOT entry. */
227 long min_got_dynindx;
228 /* The greatest dynamic symbol table index corresponding to a symbol
229 with a GOT entry that is not referenced (e.g., a dynamic symbol
230 with dynamic relocations pointing to it from non-primary GOTs). */
231 long max_unref_got_dynindx;
232 /* The greatest dynamic symbol table index not corresponding to a
233 symbol without a GOT entry. */
234 long max_non_got_dynindx;
237 /* The MIPS ELF linker needs additional information for each symbol in
238 the global hash table. */
240 struct mips_elf_link_hash_entry
242 struct elf_link_hash_entry root;
244 /* External symbol information. */
245 EXTR esym;
247 /* Number of R_MIPS_32, R_MIPS_REL32, or R_MIPS_64 relocs against
248 this symbol. */
249 unsigned int possibly_dynamic_relocs;
251 /* If the R_MIPS_32, R_MIPS_REL32, or R_MIPS_64 reloc is against
252 a readonly section. */
253 bfd_boolean readonly_reloc;
255 /* We must not create a stub for a symbol that has relocations
256 related to taking the function's address, i.e. any but
257 R_MIPS_CALL*16 ones -- see "MIPS ABI Supplement, 3rd Edition",
258 p. 4-20. */
259 bfd_boolean no_fn_stub;
261 /* If there is a stub that 32 bit functions should use to call this
262 16 bit function, this points to the section containing the stub. */
263 asection *fn_stub;
265 /* Whether we need the fn_stub; this is set if this symbol appears
266 in any relocs other than a 16 bit call. */
267 bfd_boolean need_fn_stub;
269 /* If there is a stub that 16 bit functions should use to call this
270 32 bit function, this points to the section containing the stub. */
271 asection *call_stub;
273 /* This is like the call_stub field, but it is used if the function
274 being called returns a floating point value. */
275 asection *call_fp_stub;
277 /* Are we forced local? This will only be set if we have converted
278 the initial global GOT entry to a local GOT entry. */
279 bfd_boolean forced_local;
281 /* Are we referenced by some kind of relocation? */
282 bfd_boolean is_relocation_target;
284 /* Are we referenced by branch relocations? */
285 bfd_boolean is_branch_target;
287 #define GOT_NORMAL 0
288 #define GOT_TLS_GD 1
289 #define GOT_TLS_LDM 2
290 #define GOT_TLS_IE 4
291 #define GOT_TLS_OFFSET_DONE 0x40
292 #define GOT_TLS_DONE 0x80
293 unsigned char tls_type;
294 /* This is only used in single-GOT mode; in multi-GOT mode there
295 is one mips_got_entry per GOT entry, so the offset is stored
296 there. In single-GOT mode there may be many mips_got_entry
297 structures all referring to the same GOT slot. It might be
298 possible to use root.got.offset instead, but that field is
299 overloaded already. */
300 bfd_vma tls_got_offset;
303 /* MIPS ELF linker hash table. */
305 struct mips_elf_link_hash_table
307 struct elf_link_hash_table root;
308 #if 0
309 /* We no longer use this. */
310 /* String section indices for the dynamic section symbols. */
311 bfd_size_type dynsym_sec_strindex[SIZEOF_MIPS_DYNSYM_SECNAMES];
312 #endif
313 /* The number of .rtproc entries. */
314 bfd_size_type procedure_count;
315 /* The size of the .compact_rel section (if SGI_COMPAT). */
316 bfd_size_type compact_rel_size;
317 /* This flag indicates that the value of DT_MIPS_RLD_MAP dynamic
318 entry is set to the address of __rld_obj_head as in IRIX5. */
319 bfd_boolean use_rld_obj_head;
320 /* This is the value of the __rld_map or __rld_obj_head symbol. */
321 bfd_vma rld_value;
322 /* This is set if we see any mips16 stub sections. */
323 bfd_boolean mips16_stubs_seen;
324 /* True if we're generating code for VxWorks. */
325 bfd_boolean is_vxworks;
326 /* Shortcuts to some dynamic sections, or NULL if they are not
327 being used. */
328 asection *srelbss;
329 asection *sdynbss;
330 asection *srelplt;
331 asection *srelplt2;
332 asection *sgotplt;
333 asection *splt;
334 /* The size of the PLT header in bytes (VxWorks only). */
335 bfd_vma plt_header_size;
336 /* The size of a PLT entry in bytes (VxWorks only). */
337 bfd_vma plt_entry_size;
340 #define TLS_RELOC_P(r_type) \
341 (r_type == R_MIPS_TLS_DTPMOD32 \
342 || r_type == R_MIPS_TLS_DTPMOD64 \
343 || r_type == R_MIPS_TLS_DTPREL32 \
344 || r_type == R_MIPS_TLS_DTPREL64 \
345 || r_type == R_MIPS_TLS_GD \
346 || r_type == R_MIPS_TLS_LDM \
347 || r_type == R_MIPS_TLS_DTPREL_HI16 \
348 || r_type == R_MIPS_TLS_DTPREL_LO16 \
349 || r_type == R_MIPS_TLS_GOTTPREL \
350 || r_type == R_MIPS_TLS_TPREL32 \
351 || r_type == R_MIPS_TLS_TPREL64 \
352 || r_type == R_MIPS_TLS_TPREL_HI16 \
353 || r_type == R_MIPS_TLS_TPREL_LO16)
355 /* Structure used to pass information to mips_elf_output_extsym. */
357 struct extsym_info
359 bfd *abfd;
360 struct bfd_link_info *info;
361 struct ecoff_debug_info *debug;
362 const struct ecoff_debug_swap *swap;
363 bfd_boolean failed;
366 /* The names of the runtime procedure table symbols used on IRIX5. */
368 static const char * const mips_elf_dynsym_rtproc_names[] =
370 "_procedure_table",
371 "_procedure_string_table",
372 "_procedure_table_size",
373 NULL
376 /* These structures are used to generate the .compact_rel section on
377 IRIX5. */
379 typedef struct
381 unsigned long id1; /* Always one? */
382 unsigned long num; /* Number of compact relocation entries. */
383 unsigned long id2; /* Always two? */
384 unsigned long offset; /* The file offset of the first relocation. */
385 unsigned long reserved0; /* Zero? */
386 unsigned long reserved1; /* Zero? */
387 } Elf32_compact_rel;
389 typedef struct
391 bfd_byte id1[4];
392 bfd_byte num[4];
393 bfd_byte id2[4];
394 bfd_byte offset[4];
395 bfd_byte reserved0[4];
396 bfd_byte reserved1[4];
397 } Elf32_External_compact_rel;
399 typedef struct
401 unsigned int ctype : 1; /* 1: long 0: short format. See below. */
402 unsigned int rtype : 4; /* Relocation types. See below. */
403 unsigned int dist2to : 8;
404 unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
405 unsigned long konst; /* KONST field. See below. */
406 unsigned long vaddr; /* VADDR to be relocated. */
407 } Elf32_crinfo;
409 typedef struct
411 unsigned int ctype : 1; /* 1: long 0: short format. See below. */
412 unsigned int rtype : 4; /* Relocation types. See below. */
413 unsigned int dist2to : 8;
414 unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
415 unsigned long konst; /* KONST field. See below. */
416 } Elf32_crinfo2;
418 typedef struct
420 bfd_byte info[4];
421 bfd_byte konst[4];
422 bfd_byte vaddr[4];
423 } Elf32_External_crinfo;
425 typedef struct
427 bfd_byte info[4];
428 bfd_byte konst[4];
429 } Elf32_External_crinfo2;
431 /* These are the constants used to swap the bitfields in a crinfo. */
433 #define CRINFO_CTYPE (0x1)
434 #define CRINFO_CTYPE_SH (31)
435 #define CRINFO_RTYPE (0xf)
436 #define CRINFO_RTYPE_SH (27)
437 #define CRINFO_DIST2TO (0xff)
438 #define CRINFO_DIST2TO_SH (19)
439 #define CRINFO_RELVADDR (0x7ffff)
440 #define CRINFO_RELVADDR_SH (0)
442 /* A compact relocation info has long (3 words) or short (2 words)
443 formats. A short format doesn't have VADDR field and relvaddr
444 fields contains ((VADDR - vaddr of the previous entry) >> 2). */
445 #define CRF_MIPS_LONG 1
446 #define CRF_MIPS_SHORT 0
448 /* There are 4 types of compact relocation at least. The value KONST
449 has different meaning for each type:
451 (type) (konst)
452 CT_MIPS_REL32 Address in data
453 CT_MIPS_WORD Address in word (XXX)
454 CT_MIPS_GPHI_LO GP - vaddr
455 CT_MIPS_JMPAD Address to jump
458 #define CRT_MIPS_REL32 0xa
459 #define CRT_MIPS_WORD 0xb
460 #define CRT_MIPS_GPHI_LO 0xc
461 #define CRT_MIPS_JMPAD 0xd
463 #define mips_elf_set_cr_format(x,format) ((x).ctype = (format))
464 #define mips_elf_set_cr_type(x,type) ((x).rtype = (type))
465 #define mips_elf_set_cr_dist2to(x,v) ((x).dist2to = (v))
466 #define mips_elf_set_cr_relvaddr(x,d) ((x).relvaddr = (d)<<2)
468 /* The structure of the runtime procedure descriptor created by the
469 loader for use by the static exception system. */
471 typedef struct runtime_pdr {
472 bfd_vma adr; /* Memory address of start of procedure. */
473 long regmask; /* Save register mask. */
474 long regoffset; /* Save register offset. */
475 long fregmask; /* Save floating point register mask. */
476 long fregoffset; /* Save floating point register offset. */
477 long frameoffset; /* Frame size. */
478 short framereg; /* Frame pointer register. */
479 short pcreg; /* Offset or reg of return pc. */
480 long irpss; /* Index into the runtime string table. */
481 long reserved;
482 struct exception_info *exception_info;/* Pointer to exception array. */
483 } RPDR, *pRPDR;
484 #define cbRPDR sizeof (RPDR)
485 #define rpdNil ((pRPDR) 0)
487 static struct mips_got_entry *mips_elf_create_local_got_entry
488 (bfd *, struct bfd_link_info *, bfd *, struct mips_got_info *, asection *,
489 asection *, bfd_vma, unsigned long, struct mips_elf_link_hash_entry *, int);
490 static bfd_boolean mips_elf_sort_hash_table_f
491 (struct mips_elf_link_hash_entry *, void *);
492 static bfd_vma mips_elf_high
493 (bfd_vma);
494 static bfd_boolean mips_elf_stub_section_p
495 (bfd *, asection *);
496 static bfd_boolean mips_elf_create_dynamic_relocation
497 (bfd *, struct bfd_link_info *, const Elf_Internal_Rela *,
498 struct mips_elf_link_hash_entry *, asection *, bfd_vma,
499 bfd_vma *, asection *);
500 static hashval_t mips_elf_got_entry_hash
501 (const void *);
502 static bfd_vma mips_elf_adjust_gp
503 (bfd *, struct mips_got_info *, bfd *);
504 static struct mips_got_info *mips_elf_got_for_ibfd
505 (struct mips_got_info *, bfd *);
507 /* This will be used when we sort the dynamic relocation records. */
508 static bfd *reldyn_sorting_bfd;
510 /* Nonzero if ABFD is using the N32 ABI. */
511 #define ABI_N32_P(abfd) \
512 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
514 /* Nonzero if ABFD is using the N64 ABI. */
515 #define ABI_64_P(abfd) \
516 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
518 /* Nonzero if ABFD is using NewABI conventions. */
519 #define NEWABI_P(abfd) (ABI_N32_P (abfd) || ABI_64_P (abfd))
521 /* The IRIX compatibility level we are striving for. */
522 #define IRIX_COMPAT(abfd) \
523 (get_elf_backend_data (abfd)->elf_backend_mips_irix_compat (abfd))
525 /* Whether we are trying to be compatible with IRIX at all. */
526 #define SGI_COMPAT(abfd) \
527 (IRIX_COMPAT (abfd) != ict_none)
529 /* The name of the options section. */
530 #define MIPS_ELF_OPTIONS_SECTION_NAME(abfd) \
531 (NEWABI_P (abfd) ? ".MIPS.options" : ".options")
533 /* True if NAME is the recognized name of any SHT_MIPS_OPTIONS section.
534 Some IRIX system files do not use MIPS_ELF_OPTIONS_SECTION_NAME. */
535 #define MIPS_ELF_OPTIONS_SECTION_NAME_P(NAME) \
536 (strcmp (NAME, ".MIPS.options") == 0 || strcmp (NAME, ".options") == 0)
538 /* Whether the section is readonly. */
539 #define MIPS_ELF_READONLY_SECTION(sec) \
540 ((sec->flags & (SEC_ALLOC | SEC_LOAD | SEC_READONLY)) \
541 == (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
543 /* The name of the stub section. */
544 #define MIPS_ELF_STUB_SECTION_NAME(abfd) ".MIPS.stubs"
546 /* The size of an external REL relocation. */
547 #define MIPS_ELF_REL_SIZE(abfd) \
548 (get_elf_backend_data (abfd)->s->sizeof_rel)
550 /* The size of an external RELA relocation. */
551 #define MIPS_ELF_RELA_SIZE(abfd) \
552 (get_elf_backend_data (abfd)->s->sizeof_rela)
554 /* The size of an external dynamic table entry. */
555 #define MIPS_ELF_DYN_SIZE(abfd) \
556 (get_elf_backend_data (abfd)->s->sizeof_dyn)
558 /* The size of a GOT entry. */
559 #define MIPS_ELF_GOT_SIZE(abfd) \
560 (get_elf_backend_data (abfd)->s->arch_size / 8)
562 /* The size of a symbol-table entry. */
563 #define MIPS_ELF_SYM_SIZE(abfd) \
564 (get_elf_backend_data (abfd)->s->sizeof_sym)
566 /* The default alignment for sections, as a power of two. */
567 #define MIPS_ELF_LOG_FILE_ALIGN(abfd) \
568 (get_elf_backend_data (abfd)->s->log_file_align)
570 /* Get word-sized data. */
571 #define MIPS_ELF_GET_WORD(abfd, ptr) \
572 (ABI_64_P (abfd) ? bfd_get_64 (abfd, ptr) : bfd_get_32 (abfd, ptr))
574 /* Put out word-sized data. */
575 #define MIPS_ELF_PUT_WORD(abfd, val, ptr) \
576 (ABI_64_P (abfd) \
577 ? bfd_put_64 (abfd, val, ptr) \
578 : bfd_put_32 (abfd, val, ptr))
580 /* Add a dynamic symbol table-entry. */
581 #define MIPS_ELF_ADD_DYNAMIC_ENTRY(info, tag, val) \
582 _bfd_elf_add_dynamic_entry (info, tag, val)
584 #define MIPS_ELF_RTYPE_TO_HOWTO(abfd, rtype, rela) \
585 (get_elf_backend_data (abfd)->elf_backend_mips_rtype_to_howto (rtype, rela))
587 /* Determine whether the internal relocation of index REL_IDX is REL
588 (zero) or RELA (non-zero). The assumption is that, if there are
589 two relocation sections for this section, one of them is REL and
590 the other is RELA. If the index of the relocation we're testing is
591 in range for the first relocation section, check that the external
592 relocation size is that for RELA. It is also assumed that, if
593 rel_idx is not in range for the first section, and this first
594 section contains REL relocs, then the relocation is in the second
595 section, that is RELA. */
596 #define MIPS_RELOC_RELA_P(abfd, sec, rel_idx) \
597 ((NUM_SHDR_ENTRIES (&elf_section_data (sec)->rel_hdr) \
598 * get_elf_backend_data (abfd)->s->int_rels_per_ext_rel \
599 > (bfd_vma)(rel_idx)) \
600 == (elf_section_data (sec)->rel_hdr.sh_entsize \
601 == (ABI_64_P (abfd) ? sizeof (Elf64_External_Rela) \
602 : sizeof (Elf32_External_Rela))))
604 /* The name of the dynamic relocation section. */
605 #define MIPS_ELF_REL_DYN_NAME(INFO) \
606 (mips_elf_hash_table (INFO)->is_vxworks ? ".rela.dyn" : ".rel.dyn")
608 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
609 from smaller values. Start with zero, widen, *then* decrement. */
610 #define MINUS_ONE (((bfd_vma)0) - 1)
611 #define MINUS_TWO (((bfd_vma)0) - 2)
613 /* The number of local .got entries we reserve. */
614 #define MIPS_RESERVED_GOTNO(INFO) \
615 (mips_elf_hash_table (INFO)->is_vxworks ? 3 : 2)
617 /* The offset of $gp from the beginning of the .got section. */
618 #define ELF_MIPS_GP_OFFSET(INFO) \
619 (mips_elf_hash_table (INFO)->is_vxworks ? 0x0 : 0x7ff0)
621 /* The maximum size of the GOT for it to be addressable using 16-bit
622 offsets from $gp. */
623 #define MIPS_ELF_GOT_MAX_SIZE(INFO) (ELF_MIPS_GP_OFFSET (INFO) + 0x7fff)
625 /* Instructions which appear in a stub. */
626 #define STUB_LW(abfd) \
627 ((ABI_64_P (abfd) \
628 ? 0xdf998010 /* ld t9,0x8010(gp) */ \
629 : 0x8f998010)) /* lw t9,0x8010(gp) */
630 #define STUB_MOVE(abfd) \
631 ((ABI_64_P (abfd) \
632 ? 0x03e0782d /* daddu t7,ra */ \
633 : 0x03e07821)) /* addu t7,ra */
634 #define STUB_LUI(VAL) (0x3c180000 + (VAL)) /* lui t8,VAL */
635 #define STUB_JALR 0x0320f809 /* jalr t9,ra */
636 #define STUB_LI16U(VAL) (0x34180000 + (VAL)) /* ori t8,zero,VAL unsigned*/
637 #define STUB_LI16S(abfd, VAL) \
638 ((ABI_64_P (abfd) \
639 ? (0x64180000 + (VAL)) /* daddiu t8,zero,VAL sign extended */ \
640 : (0x24180000 + (VAL)))) /* addiu t8,zero,VAL sign extended */
642 #define MIPS_FUNCTION_STUB_SIZE(INFO) \
643 (elf_hash_table (INFO)->dynsymcount > 65536 ? 20 : 16)
645 #define MIPS_FUNCTION_STUB_MAX_SIZE 20
647 /* The name of the dynamic interpreter. This is put in the .interp
648 section. */
650 #define ELF_DYNAMIC_INTERPRETER(abfd) \
651 (ABI_N32_P (abfd) ? "/usr/lib32/libc.so.1" \
652 : ABI_64_P (abfd) ? "/usr/lib64/libc.so.1" \
653 : "/usr/lib/libc.so.1")
655 #ifdef BFD64
656 #define MNAME(bfd,pre,pos) \
657 (ABI_64_P (bfd) ? CONCAT4 (pre,64,_,pos) : CONCAT4 (pre,32,_,pos))
658 #define ELF_R_SYM(bfd, i) \
659 (ABI_64_P (bfd) ? ELF64_R_SYM (i) : ELF32_R_SYM (i))
660 #define ELF_R_TYPE(bfd, i) \
661 (ABI_64_P (bfd) ? ELF64_MIPS_R_TYPE (i) : ELF32_R_TYPE (i))
662 #define ELF_R_INFO(bfd, s, t) \
663 (ABI_64_P (bfd) ? ELF64_R_INFO (s, t) : ELF32_R_INFO (s, t))
664 #else
665 #define MNAME(bfd,pre,pos) CONCAT4 (pre,32,_,pos)
666 #define ELF_R_SYM(bfd, i) \
667 (ELF32_R_SYM (i))
668 #define ELF_R_TYPE(bfd, i) \
669 (ELF32_R_TYPE (i))
670 #define ELF_R_INFO(bfd, s, t) \
671 (ELF32_R_INFO (s, t))
672 #endif
674 /* The mips16 compiler uses a couple of special sections to handle
675 floating point arguments.
677 Section names that look like .mips16.fn.FNNAME contain stubs that
678 copy floating point arguments from the fp regs to the gp regs and
679 then jump to FNNAME. If any 32 bit function calls FNNAME, the
680 call should be redirected to the stub instead. If no 32 bit
681 function calls FNNAME, the stub should be discarded. We need to
682 consider any reference to the function, not just a call, because
683 if the address of the function is taken we will need the stub,
684 since the address might be passed to a 32 bit function.
686 Section names that look like .mips16.call.FNNAME contain stubs
687 that copy floating point arguments from the gp regs to the fp
688 regs and then jump to FNNAME. If FNNAME is a 32 bit function,
689 then any 16 bit function that calls FNNAME should be redirected
690 to the stub instead. If FNNAME is not a 32 bit function, the
691 stub should be discarded.
693 .mips16.call.fp.FNNAME sections are similar, but contain stubs
694 which call FNNAME and then copy the return value from the fp regs
695 to the gp regs. These stubs store the return value in $18 while
696 calling FNNAME; any function which might call one of these stubs
697 must arrange to save $18 around the call. (This case is not
698 needed for 32 bit functions that call 16 bit functions, because
699 16 bit functions always return floating point values in both
700 $f0/$f1 and $2/$3.)
702 Note that in all cases FNNAME might be defined statically.
703 Therefore, FNNAME is not used literally. Instead, the relocation
704 information will indicate which symbol the section is for.
706 We record any stubs that we find in the symbol table. */
708 #define FN_STUB ".mips16.fn."
709 #define CALL_STUB ".mips16.call."
710 #define CALL_FP_STUB ".mips16.call.fp."
712 /* The format of the first PLT entry in a VxWorks executable. */
713 static const bfd_vma mips_vxworks_exec_plt0_entry[] = {
714 0x3c190000, /* lui t9, %hi(_GLOBAL_OFFSET_TABLE_) */
715 0x27390000, /* addiu t9, t9, %lo(_GLOBAL_OFFSET_TABLE_) */
716 0x8f390008, /* lw t9, 8(t9) */
717 0x00000000, /* nop */
718 0x03200008, /* jr t9 */
719 0x00000000 /* nop */
722 /* The format of subsequent PLT entries. */
723 static const bfd_vma mips_vxworks_exec_plt_entry[] = {
724 0x10000000, /* b .PLT_resolver */
725 0x24180000, /* li t8, <pltindex> */
726 0x3c190000, /* lui t9, %hi(<.got.plt slot>) */
727 0x27390000, /* addiu t9, t9, %lo(<.got.plt slot>) */
728 0x8f390000, /* lw t9, 0(t9) */
729 0x00000000, /* nop */
730 0x03200008, /* jr t9 */
731 0x00000000 /* nop */
734 /* The format of the first PLT entry in a VxWorks shared object. */
735 static const bfd_vma mips_vxworks_shared_plt0_entry[] = {
736 0x8f990008, /* lw t9, 8(gp) */
737 0x00000000, /* nop */
738 0x03200008, /* jr t9 */
739 0x00000000, /* nop */
740 0x00000000, /* nop */
741 0x00000000 /* nop */
744 /* The format of subsequent PLT entries. */
745 static const bfd_vma mips_vxworks_shared_plt_entry[] = {
746 0x10000000, /* b .PLT_resolver */
747 0x24180000 /* li t8, <pltindex> */
750 /* Look up an entry in a MIPS ELF linker hash table. */
752 #define mips_elf_link_hash_lookup(table, string, create, copy, follow) \
753 ((struct mips_elf_link_hash_entry *) \
754 elf_link_hash_lookup (&(table)->root, (string), (create), \
755 (copy), (follow)))
757 /* Traverse a MIPS ELF linker hash table. */
759 #define mips_elf_link_hash_traverse(table, func, info) \
760 (elf_link_hash_traverse \
761 (&(table)->root, \
762 (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \
763 (info)))
765 /* Get the MIPS ELF linker hash table from a link_info structure. */
767 #define mips_elf_hash_table(p) \
768 ((struct mips_elf_link_hash_table *) ((p)->hash))
770 /* Find the base offsets for thread-local storage in this object,
771 for GD/LD and IE/LE respectively. */
773 #define TP_OFFSET 0x7000
774 #define DTP_OFFSET 0x8000
776 static bfd_vma
777 dtprel_base (struct bfd_link_info *info)
779 /* If tls_sec is NULL, we should have signalled an error already. */
780 if (elf_hash_table (info)->tls_sec == NULL)
781 return 0;
782 return elf_hash_table (info)->tls_sec->vma + DTP_OFFSET;
785 static bfd_vma
786 tprel_base (struct bfd_link_info *info)
788 /* If tls_sec is NULL, we should have signalled an error already. */
789 if (elf_hash_table (info)->tls_sec == NULL)
790 return 0;
791 return elf_hash_table (info)->tls_sec->vma + TP_OFFSET;
794 /* Create an entry in a MIPS ELF linker hash table. */
796 static struct bfd_hash_entry *
797 mips_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
798 struct bfd_hash_table *table, const char *string)
800 struct mips_elf_link_hash_entry *ret =
801 (struct mips_elf_link_hash_entry *) entry;
803 /* Allocate the structure if it has not already been allocated by a
804 subclass. */
805 if (ret == NULL)
806 ret = bfd_hash_allocate (table, sizeof (struct mips_elf_link_hash_entry));
807 if (ret == NULL)
808 return (struct bfd_hash_entry *) ret;
810 /* Call the allocation method of the superclass. */
811 ret = ((struct mips_elf_link_hash_entry *)
812 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
813 table, string));
814 if (ret != NULL)
816 /* Set local fields. */
817 memset (&ret->esym, 0, sizeof (EXTR));
818 /* We use -2 as a marker to indicate that the information has
819 not been set. -1 means there is no associated ifd. */
820 ret->esym.ifd = -2;
821 ret->possibly_dynamic_relocs = 0;
822 ret->readonly_reloc = FALSE;
823 ret->no_fn_stub = FALSE;
824 ret->fn_stub = NULL;
825 ret->need_fn_stub = FALSE;
826 ret->call_stub = NULL;
827 ret->call_fp_stub = NULL;
828 ret->forced_local = FALSE;
829 ret->is_branch_target = FALSE;
830 ret->is_relocation_target = FALSE;
831 ret->tls_type = GOT_NORMAL;
834 return (struct bfd_hash_entry *) ret;
837 bfd_boolean
838 _bfd_mips_elf_new_section_hook (bfd *abfd, asection *sec)
840 if (!sec->used_by_bfd)
842 struct _mips_elf_section_data *sdata;
843 bfd_size_type amt = sizeof (*sdata);
845 sdata = bfd_zalloc (abfd, amt);
846 if (sdata == NULL)
847 return FALSE;
848 sec->used_by_bfd = sdata;
851 return _bfd_elf_new_section_hook (abfd, sec);
854 /* Read ECOFF debugging information from a .mdebug section into a
855 ecoff_debug_info structure. */
857 bfd_boolean
858 _bfd_mips_elf_read_ecoff_info (bfd *abfd, asection *section,
859 struct ecoff_debug_info *debug)
861 HDRR *symhdr;
862 const struct ecoff_debug_swap *swap;
863 char *ext_hdr;
865 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
866 memset (debug, 0, sizeof (*debug));
868 ext_hdr = bfd_malloc (swap->external_hdr_size);
869 if (ext_hdr == NULL && swap->external_hdr_size != 0)
870 goto error_return;
872 if (! bfd_get_section_contents (abfd, section, ext_hdr, 0,
873 swap->external_hdr_size))
874 goto error_return;
876 symhdr = &debug->symbolic_header;
877 (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
879 /* The symbolic header contains absolute file offsets and sizes to
880 read. */
881 #define READ(ptr, offset, count, size, type) \
882 if (symhdr->count == 0) \
883 debug->ptr = NULL; \
884 else \
886 bfd_size_type amt = (bfd_size_type) size * symhdr->count; \
887 debug->ptr = bfd_malloc (amt); \
888 if (debug->ptr == NULL) \
889 goto error_return; \
890 if (bfd_seek (abfd, symhdr->offset, SEEK_SET) != 0 \
891 || bfd_bread (debug->ptr, amt, abfd) != amt) \
892 goto error_return; \
895 READ (line, cbLineOffset, cbLine, sizeof (unsigned char), unsigned char *);
896 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, void *);
897 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, void *);
898 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, void *);
899 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, void *);
900 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
901 union aux_ext *);
902 READ (ss, cbSsOffset, issMax, sizeof (char), char *);
903 READ (ssext, cbSsExtOffset, issExtMax, sizeof (char), char *);
904 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, void *);
905 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, void *);
906 READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size, void *);
907 #undef READ
909 debug->fdr = NULL;
911 return TRUE;
913 error_return:
914 if (ext_hdr != NULL)
915 free (ext_hdr);
916 if (debug->line != NULL)
917 free (debug->line);
918 if (debug->external_dnr != NULL)
919 free (debug->external_dnr);
920 if (debug->external_pdr != NULL)
921 free (debug->external_pdr);
922 if (debug->external_sym != NULL)
923 free (debug->external_sym);
924 if (debug->external_opt != NULL)
925 free (debug->external_opt);
926 if (debug->external_aux != NULL)
927 free (debug->external_aux);
928 if (debug->ss != NULL)
929 free (debug->ss);
930 if (debug->ssext != NULL)
931 free (debug->ssext);
932 if (debug->external_fdr != NULL)
933 free (debug->external_fdr);
934 if (debug->external_rfd != NULL)
935 free (debug->external_rfd);
936 if (debug->external_ext != NULL)
937 free (debug->external_ext);
938 return FALSE;
941 /* Swap RPDR (runtime procedure table entry) for output. */
943 static void
944 ecoff_swap_rpdr_out (bfd *abfd, const RPDR *in, struct rpdr_ext *ex)
946 H_PUT_S32 (abfd, in->adr, ex->p_adr);
947 H_PUT_32 (abfd, in->regmask, ex->p_regmask);
948 H_PUT_32 (abfd, in->regoffset, ex->p_regoffset);
949 H_PUT_32 (abfd, in->fregmask, ex->p_fregmask);
950 H_PUT_32 (abfd, in->fregoffset, ex->p_fregoffset);
951 H_PUT_32 (abfd, in->frameoffset, ex->p_frameoffset);
953 H_PUT_16 (abfd, in->framereg, ex->p_framereg);
954 H_PUT_16 (abfd, in->pcreg, ex->p_pcreg);
956 H_PUT_32 (abfd, in->irpss, ex->p_irpss);
959 /* Create a runtime procedure table from the .mdebug section. */
961 static bfd_boolean
962 mips_elf_create_procedure_table (void *handle, bfd *abfd,
963 struct bfd_link_info *info, asection *s,
964 struct ecoff_debug_info *debug)
966 const struct ecoff_debug_swap *swap;
967 HDRR *hdr = &debug->symbolic_header;
968 RPDR *rpdr, *rp;
969 struct rpdr_ext *erp;
970 void *rtproc;
971 struct pdr_ext *epdr;
972 struct sym_ext *esym;
973 char *ss, **sv;
974 char *str;
975 bfd_size_type size;
976 bfd_size_type count;
977 unsigned long sindex;
978 unsigned long i;
979 PDR pdr;
980 SYMR sym;
981 const char *no_name_func = _("static procedure (no name)");
983 epdr = NULL;
984 rpdr = NULL;
985 esym = NULL;
986 ss = NULL;
987 sv = NULL;
989 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
991 sindex = strlen (no_name_func) + 1;
992 count = hdr->ipdMax;
993 if (count > 0)
995 size = swap->external_pdr_size;
997 epdr = bfd_malloc (size * count);
998 if (epdr == NULL)
999 goto error_return;
1001 if (! _bfd_ecoff_get_accumulated_pdr (handle, (bfd_byte *) epdr))
1002 goto error_return;
1004 size = sizeof (RPDR);
1005 rp = rpdr = bfd_malloc (size * count);
1006 if (rpdr == NULL)
1007 goto error_return;
1009 size = sizeof (char *);
1010 sv = bfd_malloc (size * count);
1011 if (sv == NULL)
1012 goto error_return;
1014 count = hdr->isymMax;
1015 size = swap->external_sym_size;
1016 esym = bfd_malloc (size * count);
1017 if (esym == NULL)
1018 goto error_return;
1020 if (! _bfd_ecoff_get_accumulated_sym (handle, (bfd_byte *) esym))
1021 goto error_return;
1023 count = hdr->issMax;
1024 ss = bfd_malloc (count);
1025 if (ss == NULL)
1026 goto error_return;
1027 if (! _bfd_ecoff_get_accumulated_ss (handle, (bfd_byte *) ss))
1028 goto error_return;
1030 count = hdr->ipdMax;
1031 for (i = 0; i < (unsigned long) count; i++, rp++)
1033 (*swap->swap_pdr_in) (abfd, epdr + i, &pdr);
1034 (*swap->swap_sym_in) (abfd, &esym[pdr.isym], &sym);
1035 rp->adr = sym.value;
1036 rp->regmask = pdr.regmask;
1037 rp->regoffset = pdr.regoffset;
1038 rp->fregmask = pdr.fregmask;
1039 rp->fregoffset = pdr.fregoffset;
1040 rp->frameoffset = pdr.frameoffset;
1041 rp->framereg = pdr.framereg;
1042 rp->pcreg = pdr.pcreg;
1043 rp->irpss = sindex;
1044 sv[i] = ss + sym.iss;
1045 sindex += strlen (sv[i]) + 1;
1049 size = sizeof (struct rpdr_ext) * (count + 2) + sindex;
1050 size = BFD_ALIGN (size, 16);
1051 rtproc = bfd_alloc (abfd, size);
1052 if (rtproc == NULL)
1054 mips_elf_hash_table (info)->procedure_count = 0;
1055 goto error_return;
1058 mips_elf_hash_table (info)->procedure_count = count + 2;
1060 erp = rtproc;
1061 memset (erp, 0, sizeof (struct rpdr_ext));
1062 erp++;
1063 str = (char *) rtproc + sizeof (struct rpdr_ext) * (count + 2);
1064 strcpy (str, no_name_func);
1065 str += strlen (no_name_func) + 1;
1066 for (i = 0; i < count; i++)
1068 ecoff_swap_rpdr_out (abfd, rpdr + i, erp + i);
1069 strcpy (str, sv[i]);
1070 str += strlen (sv[i]) + 1;
1072 H_PUT_S32 (abfd, -1, (erp + count)->p_adr);
1074 /* Set the size and contents of .rtproc section. */
1075 s->size = size;
1076 s->contents = rtproc;
1078 /* Skip this section later on (I don't think this currently
1079 matters, but someday it might). */
1080 s->map_head.link_order = NULL;
1082 if (epdr != NULL)
1083 free (epdr);
1084 if (rpdr != NULL)
1085 free (rpdr);
1086 if (esym != NULL)
1087 free (esym);
1088 if (ss != NULL)
1089 free (ss);
1090 if (sv != NULL)
1091 free (sv);
1093 return TRUE;
1095 error_return:
1096 if (epdr != NULL)
1097 free (epdr);
1098 if (rpdr != NULL)
1099 free (rpdr);
1100 if (esym != NULL)
1101 free (esym);
1102 if (ss != NULL)
1103 free (ss);
1104 if (sv != NULL)
1105 free (sv);
1106 return FALSE;
1109 /* Check the mips16 stubs for a particular symbol, and see if we can
1110 discard them. */
1112 static bfd_boolean
1113 mips_elf_check_mips16_stubs (struct mips_elf_link_hash_entry *h,
1114 void *data ATTRIBUTE_UNUSED)
1116 if (h->root.root.type == bfd_link_hash_warning)
1117 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
1119 if (h->fn_stub != NULL
1120 && ! h->need_fn_stub)
1122 /* We don't need the fn_stub; the only references to this symbol
1123 are 16 bit calls. Clobber the size to 0 to prevent it from
1124 being included in the link. */
1125 h->fn_stub->size = 0;
1126 h->fn_stub->flags &= ~SEC_RELOC;
1127 h->fn_stub->reloc_count = 0;
1128 h->fn_stub->flags |= SEC_EXCLUDE;
1131 if (h->call_stub != NULL
1132 && h->root.other == STO_MIPS16)
1134 /* We don't need the call_stub; this is a 16 bit function, so
1135 calls from other 16 bit functions are OK. Clobber the size
1136 to 0 to prevent it from being included in the link. */
1137 h->call_stub->size = 0;
1138 h->call_stub->flags &= ~SEC_RELOC;
1139 h->call_stub->reloc_count = 0;
1140 h->call_stub->flags |= SEC_EXCLUDE;
1143 if (h->call_fp_stub != NULL
1144 && h->root.other == STO_MIPS16)
1146 /* We don't need the call_stub; this is a 16 bit function, so
1147 calls from other 16 bit functions are OK. Clobber the size
1148 to 0 to prevent it from being included in the link. */
1149 h->call_fp_stub->size = 0;
1150 h->call_fp_stub->flags &= ~SEC_RELOC;
1151 h->call_fp_stub->reloc_count = 0;
1152 h->call_fp_stub->flags |= SEC_EXCLUDE;
1155 return TRUE;
1158 /* R_MIPS16_26 is used for the mips16 jal and jalx instructions.
1159 Most mips16 instructions are 16 bits, but these instructions
1160 are 32 bits.
1162 The format of these instructions is:
1164 +--------------+--------------------------------+
1165 | JALX | X| Imm 20:16 | Imm 25:21 |
1166 +--------------+--------------------------------+
1167 | Immediate 15:0 |
1168 +-----------------------------------------------+
1170 JALX is the 5-bit value 00011. X is 0 for jal, 1 for jalx.
1171 Note that the immediate value in the first word is swapped.
1173 When producing a relocatable object file, R_MIPS16_26 is
1174 handled mostly like R_MIPS_26. In particular, the addend is
1175 stored as a straight 26-bit value in a 32-bit instruction.
1176 (gas makes life simpler for itself by never adjusting a
1177 R_MIPS16_26 reloc to be against a section, so the addend is
1178 always zero). However, the 32 bit instruction is stored as 2
1179 16-bit values, rather than a single 32-bit value. In a
1180 big-endian file, the result is the same; in a little-endian
1181 file, the two 16-bit halves of the 32 bit value are swapped.
1182 This is so that a disassembler can recognize the jal
1183 instruction.
1185 When doing a final link, R_MIPS16_26 is treated as a 32 bit
1186 instruction stored as two 16-bit values. The addend A is the
1187 contents of the targ26 field. The calculation is the same as
1188 R_MIPS_26. When storing the calculated value, reorder the
1189 immediate value as shown above, and don't forget to store the
1190 value as two 16-bit values.
1192 To put it in MIPS ABI terms, the relocation field is T-targ26-16,
1193 defined as
1195 big-endian:
1196 +--------+----------------------+
1197 | | |
1198 | | targ26-16 |
1199 |31 26|25 0|
1200 +--------+----------------------+
1202 little-endian:
1203 +----------+------+-------------+
1204 | | | |
1205 | sub1 | | sub2 |
1206 |0 9|10 15|16 31|
1207 +----------+--------------------+
1208 where targ26-16 is sub1 followed by sub2 (i.e., the addend field A is
1209 ((sub1 << 16) | sub2)).
1211 When producing a relocatable object file, the calculation is
1212 (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
1213 When producing a fully linked file, the calculation is
1214 let R = (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
1215 ((R & 0x1f0000) << 5) | ((R & 0x3e00000) >> 5) | (R & 0xffff)
1217 R_MIPS16_GPREL is used for GP-relative addressing in mips16
1218 mode. A typical instruction will have a format like this:
1220 +--------------+--------------------------------+
1221 | EXTEND | Imm 10:5 | Imm 15:11 |
1222 +--------------+--------------------------------+
1223 | Major | rx | ry | Imm 4:0 |
1224 +--------------+--------------------------------+
1226 EXTEND is the five bit value 11110. Major is the instruction
1227 opcode.
1229 This is handled exactly like R_MIPS_GPREL16, except that the
1230 addend is retrieved and stored as shown in this diagram; that
1231 is, the Imm fields above replace the V-rel16 field.
1233 All we need to do here is shuffle the bits appropriately. As
1234 above, the two 16-bit halves must be swapped on a
1235 little-endian system.
1237 R_MIPS16_HI16 and R_MIPS16_LO16 are used in mips16 mode to
1238 access data when neither GP-relative nor PC-relative addressing
1239 can be used. They are handled like R_MIPS_HI16 and R_MIPS_LO16,
1240 except that the addend is retrieved and stored as shown above
1241 for R_MIPS16_GPREL.
1243 void
1244 _bfd_mips16_elf_reloc_unshuffle (bfd *abfd, int r_type,
1245 bfd_boolean jal_shuffle, bfd_byte *data)
1247 bfd_vma extend, insn, val;
1249 if (r_type != R_MIPS16_26 && r_type != R_MIPS16_GPREL
1250 && r_type != R_MIPS16_HI16 && r_type != R_MIPS16_LO16)
1251 return;
1253 /* Pick up the mips16 extend instruction and the real instruction. */
1254 extend = bfd_get_16 (abfd, data);
1255 insn = bfd_get_16 (abfd, data + 2);
1256 if (r_type == R_MIPS16_26)
1258 if (jal_shuffle)
1259 val = ((extend & 0xfc00) << 16) | ((extend & 0x3e0) << 11)
1260 | ((extend & 0x1f) << 21) | insn;
1261 else
1262 val = extend << 16 | insn;
1264 else
1265 val = ((extend & 0xf800) << 16) | ((insn & 0xffe0) << 11)
1266 | ((extend & 0x1f) << 11) | (extend & 0x7e0) | (insn & 0x1f);
1267 bfd_put_32 (abfd, val, data);
1270 void
1271 _bfd_mips16_elf_reloc_shuffle (bfd *abfd, int r_type,
1272 bfd_boolean jal_shuffle, bfd_byte *data)
1274 bfd_vma extend, insn, val;
1276 if (r_type != R_MIPS16_26 && r_type != R_MIPS16_GPREL
1277 && r_type != R_MIPS16_HI16 && r_type != R_MIPS16_LO16)
1278 return;
1280 val = bfd_get_32 (abfd, data);
1281 if (r_type == R_MIPS16_26)
1283 if (jal_shuffle)
1285 insn = val & 0xffff;
1286 extend = ((val >> 16) & 0xfc00) | ((val >> 11) & 0x3e0)
1287 | ((val >> 21) & 0x1f);
1289 else
1291 insn = val & 0xffff;
1292 extend = val >> 16;
1295 else
1297 insn = ((val >> 11) & 0xffe0) | (val & 0x1f);
1298 extend = ((val >> 16) & 0xf800) | ((val >> 11) & 0x1f) | (val & 0x7e0);
1300 bfd_put_16 (abfd, insn, data + 2);
1301 bfd_put_16 (abfd, extend, data);
1304 bfd_reloc_status_type
1305 _bfd_mips_elf_gprel16_with_gp (bfd *abfd, asymbol *symbol,
1306 arelent *reloc_entry, asection *input_section,
1307 bfd_boolean relocatable, void *data, bfd_vma gp)
1309 bfd_vma relocation;
1310 bfd_signed_vma val;
1311 bfd_reloc_status_type status;
1313 if (bfd_is_com_section (symbol->section))
1314 relocation = 0;
1315 else
1316 relocation = symbol->value;
1318 relocation += symbol->section->output_section->vma;
1319 relocation += symbol->section->output_offset;
1321 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1322 return bfd_reloc_outofrange;
1324 /* Set val to the offset into the section or symbol. */
1325 val = reloc_entry->addend;
1327 _bfd_mips_elf_sign_extend (val, 16);
1329 /* Adjust val for the final section location and GP value. If we
1330 are producing relocatable output, we don't want to do this for
1331 an external symbol. */
1332 if (! relocatable
1333 || (symbol->flags & BSF_SECTION_SYM) != 0)
1334 val += relocation - gp;
1336 if (reloc_entry->howto->partial_inplace)
1338 status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
1339 (bfd_byte *) data
1340 + reloc_entry->address);
1341 if (status != bfd_reloc_ok)
1342 return status;
1344 else
1345 reloc_entry->addend = val;
1347 if (relocatable)
1348 reloc_entry->address += input_section->output_offset;
1350 return bfd_reloc_ok;
1353 /* Used to store a REL high-part relocation such as R_MIPS_HI16 or
1354 R_MIPS_GOT16. REL is the relocation, INPUT_SECTION is the section
1355 that contains the relocation field and DATA points to the start of
1356 INPUT_SECTION. */
1358 struct mips_hi16
1360 struct mips_hi16 *next;
1361 bfd_byte *data;
1362 asection *input_section;
1363 arelent rel;
1366 /* FIXME: This should not be a static variable. */
1368 static struct mips_hi16 *mips_hi16_list;
1370 /* A howto special_function for REL *HI16 relocations. We can only
1371 calculate the correct value once we've seen the partnering
1372 *LO16 relocation, so just save the information for later.
1374 The ABI requires that the *LO16 immediately follow the *HI16.
1375 However, as a GNU extension, we permit an arbitrary number of
1376 *HI16s to be associated with a single *LO16. This significantly
1377 simplies the relocation handling in gcc. */
1379 bfd_reloc_status_type
1380 _bfd_mips_elf_hi16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
1381 asymbol *symbol ATTRIBUTE_UNUSED, void *data,
1382 asection *input_section, bfd *output_bfd,
1383 char **error_message ATTRIBUTE_UNUSED)
1385 struct mips_hi16 *n;
1387 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1388 return bfd_reloc_outofrange;
1390 n = bfd_malloc (sizeof *n);
1391 if (n == NULL)
1392 return bfd_reloc_outofrange;
1394 n->next = mips_hi16_list;
1395 n->data = data;
1396 n->input_section = input_section;
1397 n->rel = *reloc_entry;
1398 mips_hi16_list = n;
1400 if (output_bfd != NULL)
1401 reloc_entry->address += input_section->output_offset;
1403 return bfd_reloc_ok;
1406 /* A howto special_function for REL R_MIPS_GOT16 relocations. This is just
1407 like any other 16-bit relocation when applied to global symbols, but is
1408 treated in the same as R_MIPS_HI16 when applied to local symbols. */
1410 bfd_reloc_status_type
1411 _bfd_mips_elf_got16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1412 void *data, asection *input_section,
1413 bfd *output_bfd, char **error_message)
1415 if ((symbol->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1416 || bfd_is_und_section (bfd_get_section (symbol))
1417 || bfd_is_com_section (bfd_get_section (symbol)))
1418 /* The relocation is against a global symbol. */
1419 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1420 input_section, output_bfd,
1421 error_message);
1423 return _bfd_mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
1424 input_section, output_bfd, error_message);
1427 /* A howto special_function for REL *LO16 relocations. The *LO16 itself
1428 is a straightforward 16 bit inplace relocation, but we must deal with
1429 any partnering high-part relocations as well. */
1431 bfd_reloc_status_type
1432 _bfd_mips_elf_lo16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1433 void *data, asection *input_section,
1434 bfd *output_bfd, char **error_message)
1436 bfd_vma vallo;
1437 bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
1439 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1440 return bfd_reloc_outofrange;
1442 _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
1443 location);
1444 vallo = bfd_get_32 (abfd, location);
1445 _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, FALSE,
1446 location);
1448 while (mips_hi16_list != NULL)
1450 bfd_reloc_status_type ret;
1451 struct mips_hi16 *hi;
1453 hi = mips_hi16_list;
1455 /* R_MIPS_GOT16 relocations are something of a special case. We
1456 want to install the addend in the same way as for a R_MIPS_HI16
1457 relocation (with a rightshift of 16). However, since GOT16
1458 relocations can also be used with global symbols, their howto
1459 has a rightshift of 0. */
1460 if (hi->rel.howto->type == R_MIPS_GOT16)
1461 hi->rel.howto = MIPS_ELF_RTYPE_TO_HOWTO (abfd, R_MIPS_HI16, FALSE);
1463 /* VALLO is a signed 16-bit number. Bias it by 0x8000 so that any
1464 carry or borrow will induce a change of +1 or -1 in the high part. */
1465 hi->rel.addend += (vallo + 0x8000) & 0xffff;
1467 ret = _bfd_mips_elf_generic_reloc (abfd, &hi->rel, symbol, hi->data,
1468 hi->input_section, output_bfd,
1469 error_message);
1470 if (ret != bfd_reloc_ok)
1471 return ret;
1473 mips_hi16_list = hi->next;
1474 free (hi);
1477 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1478 input_section, output_bfd,
1479 error_message);
1482 /* A generic howto special_function. This calculates and installs the
1483 relocation itself, thus avoiding the oft-discussed problems in
1484 bfd_perform_relocation and bfd_install_relocation. */
1486 bfd_reloc_status_type
1487 _bfd_mips_elf_generic_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
1488 asymbol *symbol, void *data ATTRIBUTE_UNUSED,
1489 asection *input_section, bfd *output_bfd,
1490 char **error_message ATTRIBUTE_UNUSED)
1492 bfd_signed_vma val;
1493 bfd_reloc_status_type status;
1494 bfd_boolean relocatable;
1496 relocatable = (output_bfd != NULL);
1498 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1499 return bfd_reloc_outofrange;
1501 /* Build up the field adjustment in VAL. */
1502 val = 0;
1503 if (!relocatable || (symbol->flags & BSF_SECTION_SYM) != 0)
1505 /* Either we're calculating the final field value or we have a
1506 relocation against a section symbol. Add in the section's
1507 offset or address. */
1508 val += symbol->section->output_section->vma;
1509 val += symbol->section->output_offset;
1512 if (!relocatable)
1514 /* We're calculating the final field value. Add in the symbol's value
1515 and, if pc-relative, subtract the address of the field itself. */
1516 val += symbol->value;
1517 if (reloc_entry->howto->pc_relative)
1519 val -= input_section->output_section->vma;
1520 val -= input_section->output_offset;
1521 val -= reloc_entry->address;
1525 /* VAL is now the final adjustment. If we're keeping this relocation
1526 in the output file, and if the relocation uses a separate addend,
1527 we just need to add VAL to that addend. Otherwise we need to add
1528 VAL to the relocation field itself. */
1529 if (relocatable && !reloc_entry->howto->partial_inplace)
1530 reloc_entry->addend += val;
1531 else
1533 bfd_byte *location = (bfd_byte *) data + reloc_entry->address;
1535 /* Add in the separate addend, if any. */
1536 val += reloc_entry->addend;
1538 /* Add VAL to the relocation field. */
1539 _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
1540 location);
1541 status = _bfd_relocate_contents (reloc_entry->howto, abfd, val,
1542 location);
1543 _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, FALSE,
1544 location);
1546 if (status != bfd_reloc_ok)
1547 return status;
1550 if (relocatable)
1551 reloc_entry->address += input_section->output_offset;
1553 return bfd_reloc_ok;
1556 /* Swap an entry in a .gptab section. Note that these routines rely
1557 on the equivalence of the two elements of the union. */
1559 static void
1560 bfd_mips_elf32_swap_gptab_in (bfd *abfd, const Elf32_External_gptab *ex,
1561 Elf32_gptab *in)
1563 in->gt_entry.gt_g_value = H_GET_32 (abfd, ex->gt_entry.gt_g_value);
1564 in->gt_entry.gt_bytes = H_GET_32 (abfd, ex->gt_entry.gt_bytes);
1567 static void
1568 bfd_mips_elf32_swap_gptab_out (bfd *abfd, const Elf32_gptab *in,
1569 Elf32_External_gptab *ex)
1571 H_PUT_32 (abfd, in->gt_entry.gt_g_value, ex->gt_entry.gt_g_value);
1572 H_PUT_32 (abfd, in->gt_entry.gt_bytes, ex->gt_entry.gt_bytes);
1575 static void
1576 bfd_elf32_swap_compact_rel_out (bfd *abfd, const Elf32_compact_rel *in,
1577 Elf32_External_compact_rel *ex)
1579 H_PUT_32 (abfd, in->id1, ex->id1);
1580 H_PUT_32 (abfd, in->num, ex->num);
1581 H_PUT_32 (abfd, in->id2, ex->id2);
1582 H_PUT_32 (abfd, in->offset, ex->offset);
1583 H_PUT_32 (abfd, in->reserved0, ex->reserved0);
1584 H_PUT_32 (abfd, in->reserved1, ex->reserved1);
1587 static void
1588 bfd_elf32_swap_crinfo_out (bfd *abfd, const Elf32_crinfo *in,
1589 Elf32_External_crinfo *ex)
1591 unsigned long l;
1593 l = (((in->ctype & CRINFO_CTYPE) << CRINFO_CTYPE_SH)
1594 | ((in->rtype & CRINFO_RTYPE) << CRINFO_RTYPE_SH)
1595 | ((in->dist2to & CRINFO_DIST2TO) << CRINFO_DIST2TO_SH)
1596 | ((in->relvaddr & CRINFO_RELVADDR) << CRINFO_RELVADDR_SH));
1597 H_PUT_32 (abfd, l, ex->info);
1598 H_PUT_32 (abfd, in->konst, ex->konst);
1599 H_PUT_32 (abfd, in->vaddr, ex->vaddr);
1602 /* A .reginfo section holds a single Elf32_RegInfo structure. These
1603 routines swap this structure in and out. They are used outside of
1604 BFD, so they are globally visible. */
1606 void
1607 bfd_mips_elf32_swap_reginfo_in (bfd *abfd, const Elf32_External_RegInfo *ex,
1608 Elf32_RegInfo *in)
1610 in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
1611 in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
1612 in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
1613 in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
1614 in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
1615 in->ri_gp_value = H_GET_32 (abfd, ex->ri_gp_value);
1618 void
1619 bfd_mips_elf32_swap_reginfo_out (bfd *abfd, const Elf32_RegInfo *in,
1620 Elf32_External_RegInfo *ex)
1622 H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
1623 H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
1624 H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
1625 H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
1626 H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
1627 H_PUT_32 (abfd, in->ri_gp_value, ex->ri_gp_value);
1630 /* In the 64 bit ABI, the .MIPS.options section holds register
1631 information in an Elf64_Reginfo structure. These routines swap
1632 them in and out. They are globally visible because they are used
1633 outside of BFD. These routines are here so that gas can call them
1634 without worrying about whether the 64 bit ABI has been included. */
1636 void
1637 bfd_mips_elf64_swap_reginfo_in (bfd *abfd, const Elf64_External_RegInfo *ex,
1638 Elf64_Internal_RegInfo *in)
1640 in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
1641 in->ri_pad = H_GET_32 (abfd, ex->ri_pad);
1642 in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
1643 in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
1644 in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
1645 in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
1646 in->ri_gp_value = H_GET_64 (abfd, ex->ri_gp_value);
1649 void
1650 bfd_mips_elf64_swap_reginfo_out (bfd *abfd, const Elf64_Internal_RegInfo *in,
1651 Elf64_External_RegInfo *ex)
1653 H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
1654 H_PUT_32 (abfd, in->ri_pad, ex->ri_pad);
1655 H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
1656 H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
1657 H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
1658 H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
1659 H_PUT_64 (abfd, in->ri_gp_value, ex->ri_gp_value);
1662 /* Swap in an options header. */
1664 void
1665 bfd_mips_elf_swap_options_in (bfd *abfd, const Elf_External_Options *ex,
1666 Elf_Internal_Options *in)
1668 in->kind = H_GET_8 (abfd, ex->kind);
1669 in->size = H_GET_8 (abfd, ex->size);
1670 in->section = H_GET_16 (abfd, ex->section);
1671 in->info = H_GET_32 (abfd, ex->info);
1674 /* Swap out an options header. */
1676 void
1677 bfd_mips_elf_swap_options_out (bfd *abfd, const Elf_Internal_Options *in,
1678 Elf_External_Options *ex)
1680 H_PUT_8 (abfd, in->kind, ex->kind);
1681 H_PUT_8 (abfd, in->size, ex->size);
1682 H_PUT_16 (abfd, in->section, ex->section);
1683 H_PUT_32 (abfd, in->info, ex->info);
1686 /* This function is called via qsort() to sort the dynamic relocation
1687 entries by increasing r_symndx value. */
1689 static int
1690 sort_dynamic_relocs (const void *arg1, const void *arg2)
1692 Elf_Internal_Rela int_reloc1;
1693 Elf_Internal_Rela int_reloc2;
1695 bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg1, &int_reloc1);
1696 bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg2, &int_reloc2);
1698 return ELF32_R_SYM (int_reloc1.r_info) - ELF32_R_SYM (int_reloc2.r_info);
1701 /* Like sort_dynamic_relocs, but used for elf64 relocations. */
1703 static int
1704 sort_dynamic_relocs_64 (const void *arg1 ATTRIBUTE_UNUSED,
1705 const void *arg2 ATTRIBUTE_UNUSED)
1707 #ifdef BFD64
1708 Elf_Internal_Rela int_reloc1[3];
1709 Elf_Internal_Rela int_reloc2[3];
1711 (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
1712 (reldyn_sorting_bfd, arg1, int_reloc1);
1713 (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
1714 (reldyn_sorting_bfd, arg2, int_reloc2);
1716 return (ELF64_R_SYM (int_reloc1[0].r_info)
1717 - ELF64_R_SYM (int_reloc2[0].r_info));
1718 #else
1719 abort ();
1720 #endif
1724 /* This routine is used to write out ECOFF debugging external symbol
1725 information. It is called via mips_elf_link_hash_traverse. The
1726 ECOFF external symbol information must match the ELF external
1727 symbol information. Unfortunately, at this point we don't know
1728 whether a symbol is required by reloc information, so the two
1729 tables may wind up being different. We must sort out the external
1730 symbol information before we can set the final size of the .mdebug
1731 section, and we must set the size of the .mdebug section before we
1732 can relocate any sections, and we can't know which symbols are
1733 required by relocation until we relocate the sections.
1734 Fortunately, it is relatively unlikely that any symbol will be
1735 stripped but required by a reloc. In particular, it can not happen
1736 when generating a final executable. */
1738 static bfd_boolean
1739 mips_elf_output_extsym (struct mips_elf_link_hash_entry *h, void *data)
1741 struct extsym_info *einfo = data;
1742 bfd_boolean strip;
1743 asection *sec, *output_section;
1745 if (h->root.root.type == bfd_link_hash_warning)
1746 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
1748 if (h->root.indx == -2)
1749 strip = FALSE;
1750 else if ((h->root.def_dynamic
1751 || h->root.ref_dynamic
1752 || h->root.type == bfd_link_hash_new)
1753 && !h->root.def_regular
1754 && !h->root.ref_regular)
1755 strip = TRUE;
1756 else if (einfo->info->strip == strip_all
1757 || (einfo->info->strip == strip_some
1758 && bfd_hash_lookup (einfo->info->keep_hash,
1759 h->root.root.root.string,
1760 FALSE, FALSE) == NULL))
1761 strip = TRUE;
1762 else
1763 strip = FALSE;
1765 if (strip)
1766 return TRUE;
1768 if (h->esym.ifd == -2)
1770 h->esym.jmptbl = 0;
1771 h->esym.cobol_main = 0;
1772 h->esym.weakext = 0;
1773 h->esym.reserved = 0;
1774 h->esym.ifd = ifdNil;
1775 h->esym.asym.value = 0;
1776 h->esym.asym.st = stGlobal;
1778 if (h->root.root.type == bfd_link_hash_undefined
1779 || h->root.root.type == bfd_link_hash_undefweak)
1781 const char *name;
1783 /* Use undefined class. Also, set class and type for some
1784 special symbols. */
1785 name = h->root.root.root.string;
1786 if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
1787 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
1789 h->esym.asym.sc = scData;
1790 h->esym.asym.st = stLabel;
1791 h->esym.asym.value = 0;
1793 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
1795 h->esym.asym.sc = scAbs;
1796 h->esym.asym.st = stLabel;
1797 h->esym.asym.value =
1798 mips_elf_hash_table (einfo->info)->procedure_count;
1800 else if (strcmp (name, "_gp_disp") == 0 && ! NEWABI_P (einfo->abfd))
1802 h->esym.asym.sc = scAbs;
1803 h->esym.asym.st = stLabel;
1804 h->esym.asym.value = elf_gp (einfo->abfd);
1806 else
1807 h->esym.asym.sc = scUndefined;
1809 else if (h->root.root.type != bfd_link_hash_defined
1810 && h->root.root.type != bfd_link_hash_defweak)
1811 h->esym.asym.sc = scAbs;
1812 else
1814 const char *name;
1816 sec = h->root.root.u.def.section;
1817 output_section = sec->output_section;
1819 /* When making a shared library and symbol h is the one from
1820 the another shared library, OUTPUT_SECTION may be null. */
1821 if (output_section == NULL)
1822 h->esym.asym.sc = scUndefined;
1823 else
1825 name = bfd_section_name (output_section->owner, output_section);
1827 if (strcmp (name, ".text") == 0)
1828 h->esym.asym.sc = scText;
1829 else if (strcmp (name, ".data") == 0)
1830 h->esym.asym.sc = scData;
1831 else if (strcmp (name, ".sdata") == 0)
1832 h->esym.asym.sc = scSData;
1833 else if (strcmp (name, ".rodata") == 0
1834 || strcmp (name, ".rdata") == 0)
1835 h->esym.asym.sc = scRData;
1836 else if (strcmp (name, ".bss") == 0)
1837 h->esym.asym.sc = scBss;
1838 else if (strcmp (name, ".sbss") == 0)
1839 h->esym.asym.sc = scSBss;
1840 else if (strcmp (name, ".init") == 0)
1841 h->esym.asym.sc = scInit;
1842 else if (strcmp (name, ".fini") == 0)
1843 h->esym.asym.sc = scFini;
1844 else
1845 h->esym.asym.sc = scAbs;
1849 h->esym.asym.reserved = 0;
1850 h->esym.asym.index = indexNil;
1853 if (h->root.root.type == bfd_link_hash_common)
1854 h->esym.asym.value = h->root.root.u.c.size;
1855 else if (h->root.root.type == bfd_link_hash_defined
1856 || h->root.root.type == bfd_link_hash_defweak)
1858 if (h->esym.asym.sc == scCommon)
1859 h->esym.asym.sc = scBss;
1860 else if (h->esym.asym.sc == scSCommon)
1861 h->esym.asym.sc = scSBss;
1863 sec = h->root.root.u.def.section;
1864 output_section = sec->output_section;
1865 if (output_section != NULL)
1866 h->esym.asym.value = (h->root.root.u.def.value
1867 + sec->output_offset
1868 + output_section->vma);
1869 else
1870 h->esym.asym.value = 0;
1872 else if (h->root.needs_plt)
1874 struct mips_elf_link_hash_entry *hd = h;
1875 bfd_boolean no_fn_stub = h->no_fn_stub;
1877 while (hd->root.root.type == bfd_link_hash_indirect)
1879 hd = (struct mips_elf_link_hash_entry *)h->root.root.u.i.link;
1880 no_fn_stub = no_fn_stub || hd->no_fn_stub;
1883 if (!no_fn_stub)
1885 /* Set type and value for a symbol with a function stub. */
1886 h->esym.asym.st = stProc;
1887 sec = hd->root.root.u.def.section;
1888 if (sec == NULL)
1889 h->esym.asym.value = 0;
1890 else
1892 output_section = sec->output_section;
1893 if (output_section != NULL)
1894 h->esym.asym.value = (hd->root.plt.offset
1895 + sec->output_offset
1896 + output_section->vma);
1897 else
1898 h->esym.asym.value = 0;
1903 if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
1904 h->root.root.root.string,
1905 &h->esym))
1907 einfo->failed = TRUE;
1908 return FALSE;
1911 return TRUE;
1914 /* A comparison routine used to sort .gptab entries. */
1916 static int
1917 gptab_compare (const void *p1, const void *p2)
1919 const Elf32_gptab *a1 = p1;
1920 const Elf32_gptab *a2 = p2;
1922 return a1->gt_entry.gt_g_value - a2->gt_entry.gt_g_value;
1925 /* Functions to manage the got entry hash table. */
1927 /* Use all 64 bits of a bfd_vma for the computation of a 32-bit
1928 hash number. */
1930 static INLINE hashval_t
1931 mips_elf_hash_bfd_vma (bfd_vma addr)
1933 #ifdef BFD64
1934 return addr + (addr >> 32);
1935 #else
1936 return addr;
1937 #endif
1940 /* got_entries only match if they're identical, except for gotidx, so
1941 use all fields to compute the hash, and compare the appropriate
1942 union members. */
1944 static hashval_t
1945 mips_elf_got_entry_hash (const void *entry_)
1947 const struct mips_got_entry *entry = (struct mips_got_entry *)entry_;
1949 return entry->symndx
1950 + ((entry->tls_type & GOT_TLS_LDM) << 17)
1951 + (! entry->abfd ? mips_elf_hash_bfd_vma (entry->d.address)
1952 : entry->abfd->id
1953 + (entry->symndx >= 0 ? mips_elf_hash_bfd_vma (entry->d.addend)
1954 : entry->d.h->root.root.root.hash));
1957 static int
1958 mips_elf_got_entry_eq (const void *entry1, const void *entry2)
1960 const struct mips_got_entry *e1 = (struct mips_got_entry *)entry1;
1961 const struct mips_got_entry *e2 = (struct mips_got_entry *)entry2;
1963 /* An LDM entry can only match another LDM entry. */
1964 if ((e1->tls_type ^ e2->tls_type) & GOT_TLS_LDM)
1965 return 0;
1967 return e1->abfd == e2->abfd && e1->symndx == e2->symndx
1968 && (! e1->abfd ? e1->d.address == e2->d.address
1969 : e1->symndx >= 0 ? e1->d.addend == e2->d.addend
1970 : e1->d.h == e2->d.h);
1973 /* multi_got_entries are still a match in the case of global objects,
1974 even if the input bfd in which they're referenced differs, so the
1975 hash computation and compare functions are adjusted
1976 accordingly. */
1978 static hashval_t
1979 mips_elf_multi_got_entry_hash (const void *entry_)
1981 const struct mips_got_entry *entry = (struct mips_got_entry *)entry_;
1983 return entry->symndx
1984 + (! entry->abfd
1985 ? mips_elf_hash_bfd_vma (entry->d.address)
1986 : entry->symndx >= 0
1987 ? ((entry->tls_type & GOT_TLS_LDM)
1988 ? (GOT_TLS_LDM << 17)
1989 : (entry->abfd->id
1990 + mips_elf_hash_bfd_vma (entry->d.addend)))
1991 : entry->d.h->root.root.root.hash);
1994 static int
1995 mips_elf_multi_got_entry_eq (const void *entry1, const void *entry2)
1997 const struct mips_got_entry *e1 = (struct mips_got_entry *)entry1;
1998 const struct mips_got_entry *e2 = (struct mips_got_entry *)entry2;
2000 /* Any two LDM entries match. */
2001 if (e1->tls_type & e2->tls_type & GOT_TLS_LDM)
2002 return 1;
2004 /* Nothing else matches an LDM entry. */
2005 if ((e1->tls_type ^ e2->tls_type) & GOT_TLS_LDM)
2006 return 0;
2008 return e1->symndx == e2->symndx
2009 && (e1->symndx >= 0 ? e1->abfd == e2->abfd && e1->d.addend == e2->d.addend
2010 : e1->abfd == NULL || e2->abfd == NULL
2011 ? e1->abfd == e2->abfd && e1->d.address == e2->d.address
2012 : e1->d.h == e2->d.h);
2015 /* Return the dynamic relocation section. If it doesn't exist, try to
2016 create a new it if CREATE_P, otherwise return NULL. Also return NULL
2017 if creation fails. */
2019 static asection *
2020 mips_elf_rel_dyn_section (struct bfd_link_info *info, bfd_boolean create_p)
2022 const char *dname;
2023 asection *sreloc;
2024 bfd *dynobj;
2026 dname = MIPS_ELF_REL_DYN_NAME (info);
2027 dynobj = elf_hash_table (info)->dynobj;
2028 sreloc = bfd_get_section_by_name (dynobj, dname);
2029 if (sreloc == NULL && create_p)
2031 sreloc = bfd_make_section_with_flags (dynobj, dname,
2032 (SEC_ALLOC
2033 | SEC_LOAD
2034 | SEC_HAS_CONTENTS
2035 | SEC_IN_MEMORY
2036 | SEC_LINKER_CREATED
2037 | SEC_READONLY));
2038 if (sreloc == NULL
2039 || ! bfd_set_section_alignment (dynobj, sreloc,
2040 MIPS_ELF_LOG_FILE_ALIGN (dynobj)))
2041 return NULL;
2043 return sreloc;
2046 /* Returns the GOT section for ABFD. */
2048 static asection *
2049 mips_elf_got_section (bfd *abfd, bfd_boolean maybe_excluded)
2051 asection *sgot = bfd_get_section_by_name (abfd, ".got");
2052 if (sgot == NULL
2053 || (! maybe_excluded && (sgot->flags & SEC_EXCLUDE) != 0))
2054 return NULL;
2055 return sgot;
2058 /* Returns the GOT information associated with the link indicated by
2059 INFO. If SGOTP is non-NULL, it is filled in with the GOT
2060 section. */
2062 static struct mips_got_info *
2063 mips_elf_got_info (bfd *abfd, asection **sgotp)
2065 asection *sgot;
2066 struct mips_got_info *g;
2068 sgot = mips_elf_got_section (abfd, TRUE);
2069 BFD_ASSERT (sgot != NULL);
2070 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
2071 g = mips_elf_section_data (sgot)->u.got_info;
2072 BFD_ASSERT (g != NULL);
2074 if (sgotp)
2075 *sgotp = (sgot->flags & SEC_EXCLUDE) == 0 ? sgot : NULL;
2077 return g;
2080 /* Count the number of relocations needed for a TLS GOT entry, with
2081 access types from TLS_TYPE, and symbol H (or a local symbol if H
2082 is NULL). */
2084 static int
2085 mips_tls_got_relocs (struct bfd_link_info *info, unsigned char tls_type,
2086 struct elf_link_hash_entry *h)
2088 int indx = 0;
2089 int ret = 0;
2090 bfd_boolean need_relocs = FALSE;
2091 bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
2093 if (h && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2094 && (!info->shared || !SYMBOL_REFERENCES_LOCAL (info, h)))
2095 indx = h->dynindx;
2097 if ((info->shared || indx != 0)
2098 && (h == NULL
2099 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2100 || h->root.type != bfd_link_hash_undefweak))
2101 need_relocs = TRUE;
2103 if (!need_relocs)
2104 return FALSE;
2106 if (tls_type & GOT_TLS_GD)
2108 ret++;
2109 if (indx != 0)
2110 ret++;
2113 if (tls_type & GOT_TLS_IE)
2114 ret++;
2116 if ((tls_type & GOT_TLS_LDM) && info->shared)
2117 ret++;
2119 return ret;
2122 /* Count the number of TLS relocations required for the GOT entry in
2123 ARG1, if it describes a local symbol. */
2125 static int
2126 mips_elf_count_local_tls_relocs (void **arg1, void *arg2)
2128 struct mips_got_entry *entry = * (struct mips_got_entry **) arg1;
2129 struct mips_elf_count_tls_arg *arg = arg2;
2131 if (entry->abfd != NULL && entry->symndx != -1)
2132 arg->needed += mips_tls_got_relocs (arg->info, entry->tls_type, NULL);
2134 return 1;
2137 /* Count the number of TLS GOT entries required for the global (or
2138 forced-local) symbol in ARG1. */
2140 static int
2141 mips_elf_count_global_tls_entries (void *arg1, void *arg2)
2143 struct mips_elf_link_hash_entry *hm
2144 = (struct mips_elf_link_hash_entry *) arg1;
2145 struct mips_elf_count_tls_arg *arg = arg2;
2147 if (hm->tls_type & GOT_TLS_GD)
2148 arg->needed += 2;
2149 if (hm->tls_type & GOT_TLS_IE)
2150 arg->needed += 1;
2152 return 1;
2155 /* Count the number of TLS relocations required for the global (or
2156 forced-local) symbol in ARG1. */
2158 static int
2159 mips_elf_count_global_tls_relocs (void *arg1, void *arg2)
2161 struct mips_elf_link_hash_entry *hm
2162 = (struct mips_elf_link_hash_entry *) arg1;
2163 struct mips_elf_count_tls_arg *arg = arg2;
2165 arg->needed += mips_tls_got_relocs (arg->info, hm->tls_type, &hm->root);
2167 return 1;
2170 /* Output a simple dynamic relocation into SRELOC. */
2172 static void
2173 mips_elf_output_dynamic_relocation (bfd *output_bfd,
2174 asection *sreloc,
2175 unsigned long indx,
2176 int r_type,
2177 bfd_vma offset)
2179 Elf_Internal_Rela rel[3];
2181 memset (rel, 0, sizeof (rel));
2183 rel[0].r_info = ELF_R_INFO (output_bfd, indx, r_type);
2184 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
2186 if (ABI_64_P (output_bfd))
2188 (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
2189 (output_bfd, &rel[0],
2190 (sreloc->contents
2191 + sreloc->reloc_count * sizeof (Elf64_Mips_External_Rel)));
2193 else
2194 bfd_elf32_swap_reloc_out
2195 (output_bfd, &rel[0],
2196 (sreloc->contents
2197 + sreloc->reloc_count * sizeof (Elf32_External_Rel)));
2198 ++sreloc->reloc_count;
2201 /* Initialize a set of TLS GOT entries for one symbol. */
2203 static void
2204 mips_elf_initialize_tls_slots (bfd *abfd, bfd_vma got_offset,
2205 unsigned char *tls_type_p,
2206 struct bfd_link_info *info,
2207 struct mips_elf_link_hash_entry *h,
2208 bfd_vma value)
2210 int indx;
2211 asection *sreloc, *sgot;
2212 bfd_vma offset, offset2;
2213 bfd *dynobj;
2214 bfd_boolean need_relocs = FALSE;
2216 dynobj = elf_hash_table (info)->dynobj;
2217 sgot = mips_elf_got_section (dynobj, FALSE);
2219 indx = 0;
2220 if (h != NULL)
2222 bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
2224 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, &h->root)
2225 && (!info->shared || !SYMBOL_REFERENCES_LOCAL (info, &h->root)))
2226 indx = h->root.dynindx;
2229 if (*tls_type_p & GOT_TLS_DONE)
2230 return;
2232 if ((info->shared || indx != 0)
2233 && (h == NULL
2234 || ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT
2235 || h->root.type != bfd_link_hash_undefweak))
2236 need_relocs = TRUE;
2238 /* MINUS_ONE means the symbol is not defined in this object. It may not
2239 be defined at all; assume that the value doesn't matter in that
2240 case. Otherwise complain if we would use the value. */
2241 BFD_ASSERT (value != MINUS_ONE || (indx != 0 && need_relocs)
2242 || h->root.root.type == bfd_link_hash_undefweak);
2244 /* Emit necessary relocations. */
2245 sreloc = mips_elf_rel_dyn_section (info, FALSE);
2247 /* General Dynamic. */
2248 if (*tls_type_p & GOT_TLS_GD)
2250 offset = got_offset;
2251 offset2 = offset + MIPS_ELF_GOT_SIZE (abfd);
2253 if (need_relocs)
2255 mips_elf_output_dynamic_relocation
2256 (abfd, sreloc, indx,
2257 ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
2258 sgot->output_offset + sgot->output_section->vma + offset);
2260 if (indx)
2261 mips_elf_output_dynamic_relocation
2262 (abfd, sreloc, indx,
2263 ABI_64_P (abfd) ? R_MIPS_TLS_DTPREL64 : R_MIPS_TLS_DTPREL32,
2264 sgot->output_offset + sgot->output_section->vma + offset2);
2265 else
2266 MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
2267 sgot->contents + offset2);
2269 else
2271 MIPS_ELF_PUT_WORD (abfd, 1,
2272 sgot->contents + offset);
2273 MIPS_ELF_PUT_WORD (abfd, value - dtprel_base (info),
2274 sgot->contents + offset2);
2277 got_offset += 2 * MIPS_ELF_GOT_SIZE (abfd);
2280 /* Initial Exec model. */
2281 if (*tls_type_p & GOT_TLS_IE)
2283 offset = got_offset;
2285 if (need_relocs)
2287 if (indx == 0)
2288 MIPS_ELF_PUT_WORD (abfd, value - elf_hash_table (info)->tls_sec->vma,
2289 sgot->contents + offset);
2290 else
2291 MIPS_ELF_PUT_WORD (abfd, 0,
2292 sgot->contents + offset);
2294 mips_elf_output_dynamic_relocation
2295 (abfd, sreloc, indx,
2296 ABI_64_P (abfd) ? R_MIPS_TLS_TPREL64 : R_MIPS_TLS_TPREL32,
2297 sgot->output_offset + sgot->output_section->vma + offset);
2299 else
2300 MIPS_ELF_PUT_WORD (abfd, value - tprel_base (info),
2301 sgot->contents + offset);
2304 if (*tls_type_p & GOT_TLS_LDM)
2306 /* The initial offset is zero, and the LD offsets will include the
2307 bias by DTP_OFFSET. */
2308 MIPS_ELF_PUT_WORD (abfd, 0,
2309 sgot->contents + got_offset
2310 + MIPS_ELF_GOT_SIZE (abfd));
2312 if (!info->shared)
2313 MIPS_ELF_PUT_WORD (abfd, 1,
2314 sgot->contents + got_offset);
2315 else
2316 mips_elf_output_dynamic_relocation
2317 (abfd, sreloc, indx,
2318 ABI_64_P (abfd) ? R_MIPS_TLS_DTPMOD64 : R_MIPS_TLS_DTPMOD32,
2319 sgot->output_offset + sgot->output_section->vma + got_offset);
2322 *tls_type_p |= GOT_TLS_DONE;
2325 /* Return the GOT index to use for a relocation of type R_TYPE against
2326 a symbol accessed using TLS_TYPE models. The GOT entries for this
2327 symbol in this GOT start at GOT_INDEX. This function initializes the
2328 GOT entries and corresponding relocations. */
2330 static bfd_vma
2331 mips_tls_got_index (bfd *abfd, bfd_vma got_index, unsigned char *tls_type,
2332 int r_type, struct bfd_link_info *info,
2333 struct mips_elf_link_hash_entry *h, bfd_vma symbol)
2335 BFD_ASSERT (r_type == R_MIPS_TLS_GOTTPREL || r_type == R_MIPS_TLS_GD
2336 || r_type == R_MIPS_TLS_LDM);
2338 mips_elf_initialize_tls_slots (abfd, got_index, tls_type, info, h, symbol);
2340 if (r_type == R_MIPS_TLS_GOTTPREL)
2342 BFD_ASSERT (*tls_type & GOT_TLS_IE);
2343 if (*tls_type & GOT_TLS_GD)
2344 return got_index + 2 * MIPS_ELF_GOT_SIZE (abfd);
2345 else
2346 return got_index;
2349 if (r_type == R_MIPS_TLS_GD)
2351 BFD_ASSERT (*tls_type & GOT_TLS_GD);
2352 return got_index;
2355 if (r_type == R_MIPS_TLS_LDM)
2357 BFD_ASSERT (*tls_type & GOT_TLS_LDM);
2358 return got_index;
2361 return got_index;
2364 /* Return the offset from _GLOBAL_OFFSET_TABLE_ of the .got.plt entry
2365 for global symbol H. .got.plt comes before the GOT, so the offset
2366 will be negative. */
2368 static bfd_vma
2369 mips_elf_gotplt_index (struct bfd_link_info *info,
2370 struct elf_link_hash_entry *h)
2372 bfd_vma plt_index, got_address, got_value;
2373 struct mips_elf_link_hash_table *htab;
2375 htab = mips_elf_hash_table (info);
2376 BFD_ASSERT (h->plt.offset != (bfd_vma) -1);
2378 /* Calculate the index of the symbol's PLT entry. */
2379 plt_index = (h->plt.offset - htab->plt_header_size) / htab->plt_entry_size;
2381 /* Calculate the address of the associated .got.plt entry. */
2382 got_address = (htab->sgotplt->output_section->vma
2383 + htab->sgotplt->output_offset
2384 + plt_index * 4);
2386 /* Calculate the value of _GLOBAL_OFFSET_TABLE_. */
2387 got_value = (htab->root.hgot->root.u.def.section->output_section->vma
2388 + htab->root.hgot->root.u.def.section->output_offset
2389 + htab->root.hgot->root.u.def.value);
2391 return got_address - got_value;
2394 /* Return the GOT offset for address VALUE, which was derived from
2395 a symbol belonging to INPUT_SECTION. If there is not yet a GOT
2396 entry for this value, create one. If R_SYMNDX refers to a TLS symbol,
2397 create a TLS GOT entry instead. Return -1 if no satisfactory GOT
2398 offset can be found. */
2400 static bfd_vma
2401 mips_elf_local_got_index (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
2402 asection *input_section, bfd_vma value,
2403 unsigned long r_symndx,
2404 struct mips_elf_link_hash_entry *h, int r_type)
2406 asection *sgot;
2407 struct mips_got_info *g;
2408 struct mips_got_entry *entry;
2410 g = mips_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
2412 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, g, sgot,
2413 input_section, value,
2414 r_symndx, h, r_type);
2415 if (!entry)
2416 return MINUS_ONE;
2418 if (TLS_RELOC_P (r_type))
2420 if (entry->symndx == -1 && g->next == NULL)
2421 /* A type (3) entry in the single-GOT case. We use the symbol's
2422 hash table entry to track the index. */
2423 return mips_tls_got_index (abfd, h->tls_got_offset, &h->tls_type,
2424 r_type, info, h, value);
2425 else
2426 return mips_tls_got_index (abfd, entry->gotidx, &entry->tls_type,
2427 r_type, info, h, value);
2429 else
2430 return entry->gotidx;
2433 /* Returns the GOT index for the global symbol indicated by H. */
2435 static bfd_vma
2436 mips_elf_global_got_index (bfd *abfd, bfd *ibfd, struct elf_link_hash_entry *h,
2437 int r_type, struct bfd_link_info *info)
2439 bfd_vma index;
2440 asection *sgot;
2441 struct mips_got_info *g, *gg;
2442 long global_got_dynindx = 0;
2444 gg = g = mips_elf_got_info (abfd, &sgot);
2445 if (g->bfd2got && ibfd)
2447 struct mips_got_entry e, *p;
2449 BFD_ASSERT (h->dynindx >= 0);
2451 g = mips_elf_got_for_ibfd (g, ibfd);
2452 if (g->next != gg || TLS_RELOC_P (r_type))
2454 e.abfd = ibfd;
2455 e.symndx = -1;
2456 e.d.h = (struct mips_elf_link_hash_entry *)h;
2457 e.tls_type = 0;
2459 p = htab_find (g->got_entries, &e);
2461 BFD_ASSERT (p->gotidx > 0);
2463 if (TLS_RELOC_P (r_type))
2465 bfd_vma value = MINUS_ONE;
2466 if ((h->root.type == bfd_link_hash_defined
2467 || h->root.type == bfd_link_hash_defweak)
2468 && h->root.u.def.section->output_section)
2469 value = (h->root.u.def.value
2470 + h->root.u.def.section->output_offset
2471 + h->root.u.def.section->output_section->vma);
2473 return mips_tls_got_index (abfd, p->gotidx, &p->tls_type, r_type,
2474 info, e.d.h, value);
2476 else
2477 return p->gotidx;
2481 if (gg->global_gotsym != NULL)
2482 global_got_dynindx = gg->global_gotsym->dynindx;
2484 if (TLS_RELOC_P (r_type))
2486 struct mips_elf_link_hash_entry *hm
2487 = (struct mips_elf_link_hash_entry *) h;
2488 bfd_vma value = MINUS_ONE;
2490 if ((h->root.type == bfd_link_hash_defined
2491 || h->root.type == bfd_link_hash_defweak)
2492 && h->root.u.def.section->output_section)
2493 value = (h->root.u.def.value
2494 + h->root.u.def.section->output_offset
2495 + h->root.u.def.section->output_section->vma);
2497 index = mips_tls_got_index (abfd, hm->tls_got_offset, &hm->tls_type,
2498 r_type, info, hm, value);
2500 else
2502 /* Once we determine the global GOT entry with the lowest dynamic
2503 symbol table index, we must put all dynamic symbols with greater
2504 indices into the GOT. That makes it easy to calculate the GOT
2505 offset. */
2506 BFD_ASSERT (h->dynindx >= global_got_dynindx);
2507 index = ((h->dynindx - global_got_dynindx + g->local_gotno)
2508 * MIPS_ELF_GOT_SIZE (abfd));
2510 BFD_ASSERT (index < sgot->size);
2512 return index;
2515 /* Find a GOT page entry that points to within 32KB of VALUE, which was
2516 calculated from a symbol belonging to INPUT_SECTION. These entries
2517 are supposed to be placed at small offsets in the GOT, i.e., within
2518 32KB of GP. Return the index of the GOT entry, or -1 if no entry
2519 could be created. If OFFSETP is nonnull, use it to return the
2520 offset of the GOT entry from VALUE. */
2522 static bfd_vma
2523 mips_elf_got_page (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
2524 asection *input_section, bfd_vma value, bfd_vma *offsetp)
2526 asection *sgot;
2527 struct mips_got_info *g;
2528 bfd_vma page, index;
2529 struct mips_got_entry *entry;
2531 g = mips_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
2533 page = (value + 0x8000) & ~(bfd_vma) 0xffff;
2534 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, g, sgot,
2535 input_section, page, 0,
2536 NULL, R_MIPS_GOT_PAGE);
2538 if (!entry)
2539 return MINUS_ONE;
2541 index = entry->gotidx;
2543 if (offsetp)
2544 *offsetp = value - entry->d.address;
2546 return index;
2549 /* Find a local GOT entry for an R_MIPS_GOT16 relocation against VALUE,
2550 which was calculated from a symbol belonging to INPUT_SECTION.
2551 EXTERNAL is true if the relocation was against a global symbol
2552 that has been forced local. */
2554 static bfd_vma
2555 mips_elf_got16_entry (bfd *abfd, bfd *ibfd, struct bfd_link_info *info,
2556 asection *input_section, bfd_vma value,
2557 bfd_boolean external)
2559 asection *sgot;
2560 struct mips_got_info *g;
2561 struct mips_got_entry *entry;
2563 /* GOT16 relocations against local symbols are followed by a LO16
2564 relocation; those against global symbols are not. Thus if the
2565 symbol was originally local, the GOT16 relocation should load the
2566 equivalent of %hi(VALUE), otherwise it should load VALUE itself. */
2567 if (! external)
2568 value = mips_elf_high (value) << 16;
2570 g = mips_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
2572 entry = mips_elf_create_local_got_entry (abfd, info, ibfd, g, sgot,
2573 input_section, value, 0,
2574 NULL, R_MIPS_GOT16);
2575 if (entry)
2576 return entry->gotidx;
2577 else
2578 return MINUS_ONE;
2581 /* Returns the offset for the entry at the INDEXth position
2582 in the GOT. */
2584 static bfd_vma
2585 mips_elf_got_offset_from_index (bfd *dynobj, bfd *output_bfd,
2586 bfd *input_bfd, bfd_vma index)
2588 asection *sgot;
2589 bfd_vma gp;
2590 struct mips_got_info *g;
2592 g = mips_elf_got_info (dynobj, &sgot);
2593 gp = _bfd_get_gp_value (output_bfd)
2594 + mips_elf_adjust_gp (output_bfd, g, input_bfd);
2596 return sgot->output_section->vma + sgot->output_offset + index - gp;
2599 /* Create and return a local GOT entry for VALUE, which was calculated
2600 from a symbol belonging to INPUT_SECTON. Return NULL if it could not
2601 be created. If R_SYMNDX refers to a TLS symbol, create a TLS entry
2602 instead. */
2604 static struct mips_got_entry *
2605 mips_elf_create_local_got_entry (bfd *abfd, struct bfd_link_info *info,
2606 bfd *ibfd, struct mips_got_info *gg,
2607 asection *sgot, asection *input_section,
2608 bfd_vma value, unsigned long r_symndx,
2609 struct mips_elf_link_hash_entry *h,
2610 int r_type)
2612 struct mips_got_entry entry, **loc;
2613 struct mips_got_info *g;
2614 struct mips_elf_link_hash_table *htab;
2616 htab = mips_elf_hash_table (info);
2618 entry.abfd = NULL;
2619 entry.symndx = -1;
2620 entry.d.address = value;
2621 entry.tls_type = 0;
2623 g = mips_elf_got_for_ibfd (gg, ibfd);
2624 if (g == NULL)
2626 g = mips_elf_got_for_ibfd (gg, abfd);
2627 BFD_ASSERT (g != NULL);
2630 /* We might have a symbol, H, if it has been forced local. Use the
2631 global entry then. It doesn't matter whether an entry is local
2632 or global for TLS, since the dynamic linker does not
2633 automatically relocate TLS GOT entries. */
2634 BFD_ASSERT (h == NULL || h->root.forced_local);
2635 if (TLS_RELOC_P (r_type))
2637 struct mips_got_entry *p;
2639 entry.abfd = ibfd;
2640 if (r_type == R_MIPS_TLS_LDM)
2642 entry.tls_type = GOT_TLS_LDM;
2643 entry.symndx = 0;
2644 entry.d.addend = 0;
2646 else if (h == NULL)
2648 entry.symndx = r_symndx;
2649 entry.d.addend = 0;
2651 else
2652 entry.d.h = h;
2654 p = (struct mips_got_entry *)
2655 htab_find (g->got_entries, &entry);
2657 BFD_ASSERT (p);
2658 return p;
2661 loc = (struct mips_got_entry **) htab_find_slot (g->got_entries, &entry,
2662 INSERT);
2663 if (*loc)
2664 return *loc;
2666 entry.gotidx = MIPS_ELF_GOT_SIZE (abfd) * g->assigned_gotno++;
2667 entry.tls_type = 0;
2669 *loc = (struct mips_got_entry *)bfd_alloc (abfd, sizeof entry);
2671 if (! *loc)
2672 return NULL;
2674 memcpy (*loc, &entry, sizeof entry);
2676 if (g->assigned_gotno >= g->local_gotno)
2678 (*loc)->gotidx = -1;
2679 /* We didn't allocate enough space in the GOT. */
2680 (*_bfd_error_handler)
2681 (_("not enough GOT space for local GOT entries"));
2682 bfd_set_error (bfd_error_bad_value);
2683 return NULL;
2686 MIPS_ELF_PUT_WORD (abfd, value,
2687 (sgot->contents + entry.gotidx));
2689 /* These GOT entries need a dynamic relocation on VxWorks. Because
2690 the offset between segments is not fixed, the relocation must be
2691 against a symbol in the same segment as the original symbol.
2692 The easiest way to do this is to take INPUT_SECTION's output
2693 section and emit a relocation against its section symbol. */
2694 if (htab->is_vxworks)
2696 Elf_Internal_Rela outrel;
2697 asection *s, *output_section;
2698 bfd_byte *loc;
2699 bfd_vma got_address;
2700 int dynindx;
2702 s = mips_elf_rel_dyn_section (info, FALSE);
2703 output_section = input_section->output_section;
2704 dynindx = elf_section_data (output_section)->dynindx;
2705 got_address = (sgot->output_section->vma
2706 + sgot->output_offset
2707 + entry.gotidx);
2709 loc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
2710 outrel.r_offset = got_address;
2711 outrel.r_info = ELF32_R_INFO (dynindx, R_MIPS_32);
2712 outrel.r_addend = value - output_section->vma;
2713 bfd_elf32_swap_reloca_out (abfd, &outrel, loc);
2716 return *loc;
2719 /* Sort the dynamic symbol table so that symbols that need GOT entries
2720 appear towards the end. This reduces the amount of GOT space
2721 required. MAX_LOCAL is used to set the number of local symbols
2722 known to be in the dynamic symbol table. During
2723 _bfd_mips_elf_size_dynamic_sections, this value is 1. Afterward, the
2724 section symbols are added and the count is higher. */
2726 static bfd_boolean
2727 mips_elf_sort_hash_table (struct bfd_link_info *info, unsigned long max_local)
2729 struct mips_elf_hash_sort_data hsd;
2730 struct mips_got_info *g;
2731 bfd *dynobj;
2733 dynobj = elf_hash_table (info)->dynobj;
2735 g = mips_elf_got_info (dynobj, NULL);
2737 hsd.low = NULL;
2738 hsd.max_unref_got_dynindx =
2739 hsd.min_got_dynindx = elf_hash_table (info)->dynsymcount
2740 /* In the multi-got case, assigned_gotno of the master got_info
2741 indicate the number of entries that aren't referenced in the
2742 primary GOT, but that must have entries because there are
2743 dynamic relocations that reference it. Since they aren't
2744 referenced, we move them to the end of the GOT, so that they
2745 don't prevent other entries that are referenced from getting
2746 too large offsets. */
2747 - (g->next ? g->assigned_gotno : 0);
2748 hsd.max_non_got_dynindx = max_local;
2749 mips_elf_link_hash_traverse (((struct mips_elf_link_hash_table *)
2750 elf_hash_table (info)),
2751 mips_elf_sort_hash_table_f,
2752 &hsd);
2754 /* There should have been enough room in the symbol table to
2755 accommodate both the GOT and non-GOT symbols. */
2756 BFD_ASSERT (hsd.max_non_got_dynindx <= hsd.min_got_dynindx);
2757 BFD_ASSERT ((unsigned long)hsd.max_unref_got_dynindx
2758 <= elf_hash_table (info)->dynsymcount);
2760 /* Now we know which dynamic symbol has the lowest dynamic symbol
2761 table index in the GOT. */
2762 g->global_gotsym = hsd.low;
2764 return TRUE;
2767 /* If H needs a GOT entry, assign it the highest available dynamic
2768 index. Otherwise, assign it the lowest available dynamic
2769 index. */
2771 static bfd_boolean
2772 mips_elf_sort_hash_table_f (struct mips_elf_link_hash_entry *h, void *data)
2774 struct mips_elf_hash_sort_data *hsd = data;
2776 if (h->root.root.type == bfd_link_hash_warning)
2777 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
2779 /* Symbols without dynamic symbol table entries aren't interesting
2780 at all. */
2781 if (h->root.dynindx == -1)
2782 return TRUE;
2784 /* Global symbols that need GOT entries that are not explicitly
2785 referenced are marked with got offset 2. Those that are
2786 referenced get a 1, and those that don't need GOT entries get
2787 -1. */
2788 if (h->root.got.offset == 2)
2790 BFD_ASSERT (h->tls_type == GOT_NORMAL);
2792 if (hsd->max_unref_got_dynindx == hsd->min_got_dynindx)
2793 hsd->low = (struct elf_link_hash_entry *) h;
2794 h->root.dynindx = hsd->max_unref_got_dynindx++;
2796 else if (h->root.got.offset != 1)
2797 h->root.dynindx = hsd->max_non_got_dynindx++;
2798 else
2800 BFD_ASSERT (h->tls_type == GOT_NORMAL);
2802 h->root.dynindx = --hsd->min_got_dynindx;
2803 hsd->low = (struct elf_link_hash_entry *) h;
2806 return TRUE;
2809 /* If H is a symbol that needs a global GOT entry, but has a dynamic
2810 symbol table index lower than any we've seen to date, record it for
2811 posterity. */
2813 static bfd_boolean
2814 mips_elf_record_global_got_symbol (struct elf_link_hash_entry *h,
2815 bfd *abfd, struct bfd_link_info *info,
2816 struct mips_got_info *g,
2817 unsigned char tls_flag)
2819 struct mips_got_entry entry, **loc;
2821 /* A global symbol in the GOT must also be in the dynamic symbol
2822 table. */
2823 if (h->dynindx == -1)
2825 switch (ELF_ST_VISIBILITY (h->other))
2827 case STV_INTERNAL:
2828 case STV_HIDDEN:
2829 _bfd_mips_elf_hide_symbol (info, h, TRUE);
2830 break;
2832 if (!bfd_elf_link_record_dynamic_symbol (info, h))
2833 return FALSE;
2836 /* Make sure we have a GOT to put this entry into. */
2837 BFD_ASSERT (g != NULL);
2839 entry.abfd = abfd;
2840 entry.symndx = -1;
2841 entry.d.h = (struct mips_elf_link_hash_entry *) h;
2842 entry.tls_type = 0;
2844 loc = (struct mips_got_entry **) htab_find_slot (g->got_entries, &entry,
2845 INSERT);
2847 /* If we've already marked this entry as needing GOT space, we don't
2848 need to do it again. */
2849 if (*loc)
2851 (*loc)->tls_type |= tls_flag;
2852 return TRUE;
2855 *loc = (struct mips_got_entry *)bfd_alloc (abfd, sizeof entry);
2857 if (! *loc)
2858 return FALSE;
2860 entry.gotidx = -1;
2861 entry.tls_type = tls_flag;
2863 memcpy (*loc, &entry, sizeof entry);
2865 if (h->got.offset != MINUS_ONE)
2866 return TRUE;
2868 /* By setting this to a value other than -1, we are indicating that
2869 there needs to be a GOT entry for H. Avoid using zero, as the
2870 generic ELF copy_indirect_symbol tests for <= 0. */
2871 if (tls_flag == 0)
2872 h->got.offset = 1;
2874 return TRUE;
2877 /* Reserve space in G for a GOT entry containing the value of symbol
2878 SYMNDX in input bfd ABDF, plus ADDEND. */
2880 static bfd_boolean
2881 mips_elf_record_local_got_symbol (bfd *abfd, long symndx, bfd_vma addend,
2882 struct mips_got_info *g,
2883 unsigned char tls_flag)
2885 struct mips_got_entry entry, **loc;
2887 entry.abfd = abfd;
2888 entry.symndx = symndx;
2889 entry.d.addend = addend;
2890 entry.tls_type = tls_flag;
2891 loc = (struct mips_got_entry **)
2892 htab_find_slot (g->got_entries, &entry, INSERT);
2894 if (*loc)
2896 if (tls_flag == GOT_TLS_GD && !((*loc)->tls_type & GOT_TLS_GD))
2898 g->tls_gotno += 2;
2899 (*loc)->tls_type |= tls_flag;
2901 else if (tls_flag == GOT_TLS_IE && !((*loc)->tls_type & GOT_TLS_IE))
2903 g->tls_gotno += 1;
2904 (*loc)->tls_type |= tls_flag;
2906 return TRUE;
2909 if (tls_flag != 0)
2911 entry.gotidx = -1;
2912 entry.tls_type = tls_flag;
2913 if (tls_flag == GOT_TLS_IE)
2914 g->tls_gotno += 1;
2915 else if (tls_flag == GOT_TLS_GD)
2916 g->tls_gotno += 2;
2917 else if (g->tls_ldm_offset == MINUS_ONE)
2919 g->tls_ldm_offset = MINUS_TWO;
2920 g->tls_gotno += 2;
2923 else
2925 entry.gotidx = g->local_gotno++;
2926 entry.tls_type = 0;
2929 *loc = (struct mips_got_entry *)bfd_alloc (abfd, sizeof entry);
2931 if (! *loc)
2932 return FALSE;
2934 memcpy (*loc, &entry, sizeof entry);
2936 return TRUE;
2939 /* Compute the hash value of the bfd in a bfd2got hash entry. */
2941 static hashval_t
2942 mips_elf_bfd2got_entry_hash (const void *entry_)
2944 const struct mips_elf_bfd2got_hash *entry
2945 = (struct mips_elf_bfd2got_hash *)entry_;
2947 return entry->bfd->id;
2950 /* Check whether two hash entries have the same bfd. */
2952 static int
2953 mips_elf_bfd2got_entry_eq (const void *entry1, const void *entry2)
2955 const struct mips_elf_bfd2got_hash *e1
2956 = (const struct mips_elf_bfd2got_hash *)entry1;
2957 const struct mips_elf_bfd2got_hash *e2
2958 = (const struct mips_elf_bfd2got_hash *)entry2;
2960 return e1->bfd == e2->bfd;
2963 /* In a multi-got link, determine the GOT to be used for IBFD. G must
2964 be the master GOT data. */
2966 static struct mips_got_info *
2967 mips_elf_got_for_ibfd (struct mips_got_info *g, bfd *ibfd)
2969 struct mips_elf_bfd2got_hash e, *p;
2971 if (! g->bfd2got)
2972 return g;
2974 e.bfd = ibfd;
2975 p = htab_find (g->bfd2got, &e);
2976 return p ? p->g : NULL;
2979 /* Create one separate got for each bfd that has entries in the global
2980 got, such that we can tell how many local and global entries each
2981 bfd requires. */
2983 static int
2984 mips_elf_make_got_per_bfd (void **entryp, void *p)
2986 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
2987 struct mips_elf_got_per_bfd_arg *arg = (struct mips_elf_got_per_bfd_arg *)p;
2988 htab_t bfd2got = arg->bfd2got;
2989 struct mips_got_info *g;
2990 struct mips_elf_bfd2got_hash bfdgot_entry, *bfdgot;
2991 void **bfdgotp;
2993 /* Find the got_info for this GOT entry's input bfd. Create one if
2994 none exists. */
2995 bfdgot_entry.bfd = entry->abfd;
2996 bfdgotp = htab_find_slot (bfd2got, &bfdgot_entry, INSERT);
2997 bfdgot = (struct mips_elf_bfd2got_hash *)*bfdgotp;
2999 if (bfdgot != NULL)
3000 g = bfdgot->g;
3001 else
3003 bfdgot = (struct mips_elf_bfd2got_hash *)bfd_alloc
3004 (arg->obfd, sizeof (struct mips_elf_bfd2got_hash));
3006 if (bfdgot == NULL)
3008 arg->obfd = 0;
3009 return 0;
3012 *bfdgotp = bfdgot;
3014 bfdgot->bfd = entry->abfd;
3015 bfdgot->g = g = (struct mips_got_info *)
3016 bfd_alloc (arg->obfd, sizeof (struct mips_got_info));
3017 if (g == NULL)
3019 arg->obfd = 0;
3020 return 0;
3023 g->global_gotsym = NULL;
3024 g->global_gotno = 0;
3025 g->local_gotno = 0;
3026 g->assigned_gotno = -1;
3027 g->tls_gotno = 0;
3028 g->tls_assigned_gotno = 0;
3029 g->tls_ldm_offset = MINUS_ONE;
3030 g->got_entries = htab_try_create (1, mips_elf_multi_got_entry_hash,
3031 mips_elf_multi_got_entry_eq, NULL);
3032 if (g->got_entries == NULL)
3034 arg->obfd = 0;
3035 return 0;
3038 g->bfd2got = NULL;
3039 g->next = NULL;
3042 /* Insert the GOT entry in the bfd's got entry hash table. */
3043 entryp = htab_find_slot (g->got_entries, entry, INSERT);
3044 if (*entryp != NULL)
3045 return 1;
3047 *entryp = entry;
3049 if (entry->tls_type)
3051 if (entry->tls_type & (GOT_TLS_GD | GOT_TLS_LDM))
3052 g->tls_gotno += 2;
3053 if (entry->tls_type & GOT_TLS_IE)
3054 g->tls_gotno += 1;
3056 else if (entry->symndx >= 0 || entry->d.h->forced_local)
3057 ++g->local_gotno;
3058 else
3059 ++g->global_gotno;
3061 return 1;
3064 /* Attempt to merge gots of different input bfds. Try to use as much
3065 as possible of the primary got, since it doesn't require explicit
3066 dynamic relocations, but don't use bfds that would reference global
3067 symbols out of the addressable range. Failing the primary got,
3068 attempt to merge with the current got, or finish the current got
3069 and then make make the new got current. */
3071 static int
3072 mips_elf_merge_gots (void **bfd2got_, void *p)
3074 struct mips_elf_bfd2got_hash *bfd2got
3075 = (struct mips_elf_bfd2got_hash *)*bfd2got_;
3076 struct mips_elf_got_per_bfd_arg *arg = (struct mips_elf_got_per_bfd_arg *)p;
3077 unsigned int lcount = bfd2got->g->local_gotno;
3078 unsigned int gcount = bfd2got->g->global_gotno;
3079 unsigned int tcount = bfd2got->g->tls_gotno;
3080 unsigned int maxcnt = arg->max_count;
3081 bfd_boolean too_many_for_tls = FALSE;
3083 /* We place TLS GOT entries after both locals and globals. The globals
3084 for the primary GOT may overflow the normal GOT size limit, so be
3085 sure not to merge a GOT which requires TLS with the primary GOT in that
3086 case. This doesn't affect non-primary GOTs. */
3087 if (tcount > 0)
3089 unsigned int primary_total = lcount + tcount + arg->global_count;
3090 if (primary_total * MIPS_ELF_GOT_SIZE (bfd2got->bfd)
3091 >= MIPS_ELF_GOT_MAX_SIZE (arg->info))
3092 too_many_for_tls = TRUE;
3095 /* If we don't have a primary GOT and this is not too big, use it as
3096 a starting point for the primary GOT. */
3097 if (! arg->primary && lcount + gcount + tcount <= maxcnt
3098 && ! too_many_for_tls)
3100 arg->primary = bfd2got->g;
3101 arg->primary_count = lcount + gcount;
3103 /* If it looks like we can merge this bfd's entries with those of
3104 the primary, merge them. The heuristics is conservative, but we
3105 don't have to squeeze it too hard. */
3106 else if (arg->primary && ! too_many_for_tls
3107 && (arg->primary_count + lcount + gcount + tcount) <= maxcnt)
3109 struct mips_got_info *g = bfd2got->g;
3110 int old_lcount = arg->primary->local_gotno;
3111 int old_gcount = arg->primary->global_gotno;
3112 int old_tcount = arg->primary->tls_gotno;
3114 bfd2got->g = arg->primary;
3116 htab_traverse (g->got_entries,
3117 mips_elf_make_got_per_bfd,
3118 arg);
3119 if (arg->obfd == NULL)
3120 return 0;
3122 htab_delete (g->got_entries);
3123 /* We don't have to worry about releasing memory of the actual
3124 got entries, since they're all in the master got_entries hash
3125 table anyway. */
3127 BFD_ASSERT (old_lcount + lcount >= arg->primary->local_gotno);
3128 BFD_ASSERT (old_gcount + gcount >= arg->primary->global_gotno);
3129 BFD_ASSERT (old_tcount + tcount >= arg->primary->tls_gotno);
3131 arg->primary_count = arg->primary->local_gotno
3132 + arg->primary->global_gotno + arg->primary->tls_gotno;
3134 /* If we can merge with the last-created got, do it. */
3135 else if (arg->current
3136 && arg->current_count + lcount + gcount + tcount <= maxcnt)
3138 struct mips_got_info *g = bfd2got->g;
3139 int old_lcount = arg->current->local_gotno;
3140 int old_gcount = arg->current->global_gotno;
3141 int old_tcount = arg->current->tls_gotno;
3143 bfd2got->g = arg->current;
3145 htab_traverse (g->got_entries,
3146 mips_elf_make_got_per_bfd,
3147 arg);
3148 if (arg->obfd == NULL)
3149 return 0;
3151 htab_delete (g->got_entries);
3153 BFD_ASSERT (old_lcount + lcount >= arg->current->local_gotno);
3154 BFD_ASSERT (old_gcount + gcount >= arg->current->global_gotno);
3155 BFD_ASSERT (old_tcount + tcount >= arg->current->tls_gotno);
3157 arg->current_count = arg->current->local_gotno
3158 + arg->current->global_gotno + arg->current->tls_gotno;
3160 /* Well, we couldn't merge, so create a new GOT. Don't check if it
3161 fits; if it turns out that it doesn't, we'll get relocation
3162 overflows anyway. */
3163 else
3165 bfd2got->g->next = arg->current;
3166 arg->current = bfd2got->g;
3168 arg->current_count = lcount + gcount + 2 * tcount;
3171 return 1;
3174 /* Set the TLS GOT index for the GOT entry in ENTRYP. ENTRYP's NEXT field
3175 is null iff there is just a single GOT. */
3177 static int
3178 mips_elf_initialize_tls_index (void **entryp, void *p)
3180 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
3181 struct mips_got_info *g = p;
3182 bfd_vma next_index;
3184 /* We're only interested in TLS symbols. */
3185 if (entry->tls_type == 0)
3186 return 1;
3188 next_index = MIPS_ELF_GOT_SIZE (entry->abfd) * (long) g->tls_assigned_gotno;
3190 if (entry->symndx == -1 && g->next == NULL)
3192 /* A type (3) got entry in the single-GOT case. We use the symbol's
3193 hash table entry to track its index. */
3194 if (entry->d.h->tls_type & GOT_TLS_OFFSET_DONE)
3195 return 1;
3196 entry->d.h->tls_type |= GOT_TLS_OFFSET_DONE;
3197 entry->d.h->tls_got_offset = next_index;
3199 else
3201 if (entry->tls_type & GOT_TLS_LDM)
3203 /* There are separate mips_got_entry objects for each input bfd
3204 that requires an LDM entry. Make sure that all LDM entries in
3205 a GOT resolve to the same index. */
3206 if (g->tls_ldm_offset != MINUS_TWO && g->tls_ldm_offset != MINUS_ONE)
3208 entry->gotidx = g->tls_ldm_offset;
3209 return 1;
3211 g->tls_ldm_offset = next_index;
3213 entry->gotidx = next_index;
3216 /* Account for the entries we've just allocated. */
3217 if (entry->tls_type & (GOT_TLS_GD | GOT_TLS_LDM))
3218 g->tls_assigned_gotno += 2;
3219 if (entry->tls_type & GOT_TLS_IE)
3220 g->tls_assigned_gotno += 1;
3222 return 1;
3225 /* If passed a NULL mips_got_info in the argument, set the marker used
3226 to tell whether a global symbol needs a got entry (in the primary
3227 got) to the given VALUE.
3229 If passed a pointer G to a mips_got_info in the argument (it must
3230 not be the primary GOT), compute the offset from the beginning of
3231 the (primary) GOT section to the entry in G corresponding to the
3232 global symbol. G's assigned_gotno must contain the index of the
3233 first available global GOT entry in G. VALUE must contain the size
3234 of a GOT entry in bytes. For each global GOT entry that requires a
3235 dynamic relocation, NEEDED_RELOCS is incremented, and the symbol is
3236 marked as not eligible for lazy resolution through a function
3237 stub. */
3238 static int
3239 mips_elf_set_global_got_offset (void **entryp, void *p)
3241 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
3242 struct mips_elf_set_global_got_offset_arg *arg
3243 = (struct mips_elf_set_global_got_offset_arg *)p;
3244 struct mips_got_info *g = arg->g;
3246 if (g && entry->tls_type != GOT_NORMAL)
3247 arg->needed_relocs +=
3248 mips_tls_got_relocs (arg->info, entry->tls_type,
3249 entry->symndx == -1 ? &entry->d.h->root : NULL);
3251 if (entry->abfd != NULL && entry->symndx == -1
3252 && entry->d.h->root.dynindx != -1
3253 && entry->d.h->tls_type == GOT_NORMAL)
3255 if (g)
3257 BFD_ASSERT (g->global_gotsym == NULL);
3259 entry->gotidx = arg->value * (long) g->assigned_gotno++;
3260 if (arg->info->shared
3261 || (elf_hash_table (arg->info)->dynamic_sections_created
3262 && entry->d.h->root.def_dynamic
3263 && !entry->d.h->root.def_regular))
3264 ++arg->needed_relocs;
3266 else
3267 entry->d.h->root.got.offset = arg->value;
3270 return 1;
3273 /* Mark any global symbols referenced in the GOT we are iterating over
3274 as inelligible for lazy resolution stubs. */
3275 static int
3276 mips_elf_set_no_stub (void **entryp, void *p ATTRIBUTE_UNUSED)
3278 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
3280 if (entry->abfd != NULL
3281 && entry->symndx == -1
3282 && entry->d.h->root.dynindx != -1)
3283 entry->d.h->no_fn_stub = TRUE;
3285 return 1;
3288 /* Follow indirect and warning hash entries so that each got entry
3289 points to the final symbol definition. P must point to a pointer
3290 to the hash table we're traversing. Since this traversal may
3291 modify the hash table, we set this pointer to NULL to indicate
3292 we've made a potentially-destructive change to the hash table, so
3293 the traversal must be restarted. */
3294 static int
3295 mips_elf_resolve_final_got_entry (void **entryp, void *p)
3297 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
3298 htab_t got_entries = *(htab_t *)p;
3300 if (entry->abfd != NULL && entry->symndx == -1)
3302 struct mips_elf_link_hash_entry *h = entry->d.h;
3304 while (h->root.root.type == bfd_link_hash_indirect
3305 || h->root.root.type == bfd_link_hash_warning)
3306 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
3308 if (entry->d.h == h)
3309 return 1;
3311 entry->d.h = h;
3313 /* If we can't find this entry with the new bfd hash, re-insert
3314 it, and get the traversal restarted. */
3315 if (! htab_find (got_entries, entry))
3317 htab_clear_slot (got_entries, entryp);
3318 entryp = htab_find_slot (got_entries, entry, INSERT);
3319 if (! *entryp)
3320 *entryp = entry;
3321 /* Abort the traversal, since the whole table may have
3322 moved, and leave it up to the parent to restart the
3323 process. */
3324 *(htab_t *)p = NULL;
3325 return 0;
3327 /* We might want to decrement the global_gotno count, but it's
3328 either too early or too late for that at this point. */
3331 return 1;
3334 /* Turn indirect got entries in a got_entries table into their final
3335 locations. */
3336 static void
3337 mips_elf_resolve_final_got_entries (struct mips_got_info *g)
3339 htab_t got_entries;
3343 got_entries = g->got_entries;
3345 htab_traverse (got_entries,
3346 mips_elf_resolve_final_got_entry,
3347 &got_entries);
3349 while (got_entries == NULL);
3352 /* Return the offset of an input bfd IBFD's GOT from the beginning of
3353 the primary GOT. */
3354 static bfd_vma
3355 mips_elf_adjust_gp (bfd *abfd, struct mips_got_info *g, bfd *ibfd)
3357 if (g->bfd2got == NULL)
3358 return 0;
3360 g = mips_elf_got_for_ibfd (g, ibfd);
3361 if (! g)
3362 return 0;
3364 BFD_ASSERT (g->next);
3366 g = g->next;
3368 return (g->local_gotno + g->global_gotno + g->tls_gotno)
3369 * MIPS_ELF_GOT_SIZE (abfd);
3372 /* Turn a single GOT that is too big for 16-bit addressing into
3373 a sequence of GOTs, each one 16-bit addressable. */
3375 static bfd_boolean
3376 mips_elf_multi_got (bfd *abfd, struct bfd_link_info *info,
3377 struct mips_got_info *g, asection *got,
3378 bfd_size_type pages)
3380 struct mips_elf_got_per_bfd_arg got_per_bfd_arg;
3381 struct mips_elf_set_global_got_offset_arg set_got_offset_arg;
3382 struct mips_got_info *gg;
3383 unsigned int assign;
3385 g->bfd2got = htab_try_create (1, mips_elf_bfd2got_entry_hash,
3386 mips_elf_bfd2got_entry_eq, NULL);
3387 if (g->bfd2got == NULL)
3388 return FALSE;
3390 got_per_bfd_arg.bfd2got = g->bfd2got;
3391 got_per_bfd_arg.obfd = abfd;
3392 got_per_bfd_arg.info = info;
3394 /* Count how many GOT entries each input bfd requires, creating a
3395 map from bfd to got info while at that. */
3396 htab_traverse (g->got_entries, mips_elf_make_got_per_bfd, &got_per_bfd_arg);
3397 if (got_per_bfd_arg.obfd == NULL)
3398 return FALSE;
3400 got_per_bfd_arg.current = NULL;
3401 got_per_bfd_arg.primary = NULL;
3402 /* Taking out PAGES entries is a worst-case estimate. We could
3403 compute the maximum number of pages that each separate input bfd
3404 uses, but it's probably not worth it. */
3405 got_per_bfd_arg.max_count = ((MIPS_ELF_GOT_MAX_SIZE (info)
3406 / MIPS_ELF_GOT_SIZE (abfd))
3407 - MIPS_RESERVED_GOTNO (info) - pages);
3408 /* The number of globals that will be included in the primary GOT.
3409 See the calls to mips_elf_set_global_got_offset below for more
3410 information. */
3411 got_per_bfd_arg.global_count = g->global_gotno;
3413 /* Try to merge the GOTs of input bfds together, as long as they
3414 don't seem to exceed the maximum GOT size, choosing one of them
3415 to be the primary GOT. */
3416 htab_traverse (g->bfd2got, mips_elf_merge_gots, &got_per_bfd_arg);
3417 if (got_per_bfd_arg.obfd == NULL)
3418 return FALSE;
3420 /* If we do not find any suitable primary GOT, create an empty one. */
3421 if (got_per_bfd_arg.primary == NULL)
3423 g->next = (struct mips_got_info *)
3424 bfd_alloc (abfd, sizeof (struct mips_got_info));
3425 if (g->next == NULL)
3426 return FALSE;
3428 g->next->global_gotsym = NULL;
3429 g->next->global_gotno = 0;
3430 g->next->local_gotno = 0;
3431 g->next->tls_gotno = 0;
3432 g->next->assigned_gotno = 0;
3433 g->next->tls_assigned_gotno = 0;
3434 g->next->tls_ldm_offset = MINUS_ONE;
3435 g->next->got_entries = htab_try_create (1, mips_elf_multi_got_entry_hash,
3436 mips_elf_multi_got_entry_eq,
3437 NULL);
3438 if (g->next->got_entries == NULL)
3439 return FALSE;
3440 g->next->bfd2got = NULL;
3442 else
3443 g->next = got_per_bfd_arg.primary;
3444 g->next->next = got_per_bfd_arg.current;
3446 /* GG is now the master GOT, and G is the primary GOT. */
3447 gg = g;
3448 g = g->next;
3450 /* Map the output bfd to the primary got. That's what we're going
3451 to use for bfds that use GOT16 or GOT_PAGE relocations that we
3452 didn't mark in check_relocs, and we want a quick way to find it.
3453 We can't just use gg->next because we're going to reverse the
3454 list. */
3456 struct mips_elf_bfd2got_hash *bfdgot;
3457 void **bfdgotp;
3459 bfdgot = (struct mips_elf_bfd2got_hash *)bfd_alloc
3460 (abfd, sizeof (struct mips_elf_bfd2got_hash));
3462 if (bfdgot == NULL)
3463 return FALSE;
3465 bfdgot->bfd = abfd;
3466 bfdgot->g = g;
3467 bfdgotp = htab_find_slot (gg->bfd2got, bfdgot, INSERT);
3469 BFD_ASSERT (*bfdgotp == NULL);
3470 *bfdgotp = bfdgot;
3473 /* The IRIX dynamic linker requires every symbol that is referenced
3474 in a dynamic relocation to be present in the primary GOT, so
3475 arrange for them to appear after those that are actually
3476 referenced.
3478 GNU/Linux could very well do without it, but it would slow down
3479 the dynamic linker, since it would have to resolve every dynamic
3480 symbol referenced in other GOTs more than once, without help from
3481 the cache. Also, knowing that every external symbol has a GOT
3482 helps speed up the resolution of local symbols too, so GNU/Linux
3483 follows IRIX's practice.
3485 The number 2 is used by mips_elf_sort_hash_table_f to count
3486 global GOT symbols that are unreferenced in the primary GOT, with
3487 an initial dynamic index computed from gg->assigned_gotno, where
3488 the number of unreferenced global entries in the primary GOT is
3489 preserved. */
3490 if (1)
3492 gg->assigned_gotno = gg->global_gotno - g->global_gotno;
3493 g->global_gotno = gg->global_gotno;
3494 set_got_offset_arg.value = 2;
3496 else
3498 /* This could be used for dynamic linkers that don't optimize
3499 symbol resolution while applying relocations so as to use
3500 primary GOT entries or assuming the symbol is locally-defined.
3501 With this code, we assign lower dynamic indices to global
3502 symbols that are not referenced in the primary GOT, so that
3503 their entries can be omitted. */
3504 gg->assigned_gotno = 0;
3505 set_got_offset_arg.value = -1;
3508 /* Reorder dynamic symbols as described above (which behavior
3509 depends on the setting of VALUE). */
3510 set_got_offset_arg.g = NULL;
3511 htab_traverse (gg->got_entries, mips_elf_set_global_got_offset,
3512 &set_got_offset_arg);
3513 set_got_offset_arg.value = 1;
3514 htab_traverse (g->got_entries, mips_elf_set_global_got_offset,
3515 &set_got_offset_arg);
3516 if (! mips_elf_sort_hash_table (info, 1))
3517 return FALSE;
3519 /* Now go through the GOTs assigning them offset ranges.
3520 [assigned_gotno, local_gotno[ will be set to the range of local
3521 entries in each GOT. We can then compute the end of a GOT by
3522 adding local_gotno to global_gotno. We reverse the list and make
3523 it circular since then we'll be able to quickly compute the
3524 beginning of a GOT, by computing the end of its predecessor. To
3525 avoid special cases for the primary GOT, while still preserving
3526 assertions that are valid for both single- and multi-got links,
3527 we arrange for the main got struct to have the right number of
3528 global entries, but set its local_gotno such that the initial
3529 offset of the primary GOT is zero. Remember that the primary GOT
3530 will become the last item in the circular linked list, so it
3531 points back to the master GOT. */
3532 gg->local_gotno = -g->global_gotno;
3533 gg->global_gotno = g->global_gotno;
3534 gg->tls_gotno = 0;
3535 assign = 0;
3536 gg->next = gg;
3540 struct mips_got_info *gn;
3542 assign += MIPS_RESERVED_GOTNO (info);
3543 g->assigned_gotno = assign;
3544 g->local_gotno += assign + pages;
3545 assign = g->local_gotno + g->global_gotno + g->tls_gotno;
3547 /* Take g out of the direct list, and push it onto the reversed
3548 list that gg points to. g->next is guaranteed to be nonnull after
3549 this operation, as required by mips_elf_initialize_tls_index. */
3550 gn = g->next;
3551 g->next = gg->next;
3552 gg->next = g;
3554 /* Set up any TLS entries. We always place the TLS entries after
3555 all non-TLS entries. */
3556 g->tls_assigned_gotno = g->local_gotno + g->global_gotno;
3557 htab_traverse (g->got_entries, mips_elf_initialize_tls_index, g);
3559 /* Move onto the next GOT. It will be a secondary GOT if nonull. */
3560 g = gn;
3562 /* Mark global symbols in every non-primary GOT as ineligible for
3563 stubs. */
3564 if (g)
3565 htab_traverse (g->got_entries, mips_elf_set_no_stub, NULL);
3567 while (g);
3569 got->size = (gg->next->local_gotno
3570 + gg->next->global_gotno
3571 + gg->next->tls_gotno) * MIPS_ELF_GOT_SIZE (abfd);
3573 return TRUE;
3577 /* Returns the first relocation of type r_type found, beginning with
3578 RELOCATION. RELEND is one-past-the-end of the relocation table. */
3580 static const Elf_Internal_Rela *
3581 mips_elf_next_relocation (bfd *abfd ATTRIBUTE_UNUSED, unsigned int r_type,
3582 const Elf_Internal_Rela *relocation,
3583 const Elf_Internal_Rela *relend)
3585 while (relocation < relend)
3587 if (ELF_R_TYPE (abfd, relocation->r_info) == r_type)
3588 return relocation;
3590 ++relocation;
3593 /* We didn't find it. */
3594 bfd_set_error (bfd_error_bad_value);
3595 return NULL;
3598 /* Return whether a relocation is against a local symbol. */
3600 static bfd_boolean
3601 mips_elf_local_relocation_p (bfd *input_bfd,
3602 const Elf_Internal_Rela *relocation,
3603 asection **local_sections,
3604 bfd_boolean check_forced)
3606 unsigned long r_symndx;
3607 Elf_Internal_Shdr *symtab_hdr;
3608 struct mips_elf_link_hash_entry *h;
3609 size_t extsymoff;
3611 r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
3612 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3613 extsymoff = (elf_bad_symtab (input_bfd)) ? 0 : symtab_hdr->sh_info;
3615 if (r_symndx < extsymoff)
3616 return TRUE;
3617 if (elf_bad_symtab (input_bfd) && local_sections[r_symndx] != NULL)
3618 return TRUE;
3620 if (check_forced)
3622 /* Look up the hash table to check whether the symbol
3623 was forced local. */
3624 h = (struct mips_elf_link_hash_entry *)
3625 elf_sym_hashes (input_bfd) [r_symndx - extsymoff];
3626 /* Find the real hash-table entry for this symbol. */
3627 while (h->root.root.type == bfd_link_hash_indirect
3628 || h->root.root.type == bfd_link_hash_warning)
3629 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
3630 if (h->root.forced_local)
3631 return TRUE;
3634 return FALSE;
3637 /* Sign-extend VALUE, which has the indicated number of BITS. */
3639 bfd_vma
3640 _bfd_mips_elf_sign_extend (bfd_vma value, int bits)
3642 if (value & ((bfd_vma) 1 << (bits - 1)))
3643 /* VALUE is negative. */
3644 value |= ((bfd_vma) - 1) << bits;
3646 return value;
3649 /* Return non-zero if the indicated VALUE has overflowed the maximum
3650 range expressible by a signed number with the indicated number of
3651 BITS. */
3653 static bfd_boolean
3654 mips_elf_overflow_p (bfd_vma value, int bits)
3656 bfd_signed_vma svalue = (bfd_signed_vma) value;
3658 if (svalue > (1 << (bits - 1)) - 1)
3659 /* The value is too big. */
3660 return TRUE;
3661 else if (svalue < -(1 << (bits - 1)))
3662 /* The value is too small. */
3663 return TRUE;
3665 /* All is well. */
3666 return FALSE;
3669 /* Calculate the %high function. */
3671 static bfd_vma
3672 mips_elf_high (bfd_vma value)
3674 return ((value + (bfd_vma) 0x8000) >> 16) & 0xffff;
3677 /* Calculate the %higher function. */
3679 static bfd_vma
3680 mips_elf_higher (bfd_vma value ATTRIBUTE_UNUSED)
3682 #ifdef BFD64
3683 return ((value + (bfd_vma) 0x80008000) >> 32) & 0xffff;
3684 #else
3685 abort ();
3686 return MINUS_ONE;
3687 #endif
3690 /* Calculate the %highest function. */
3692 static bfd_vma
3693 mips_elf_highest (bfd_vma value ATTRIBUTE_UNUSED)
3695 #ifdef BFD64
3696 return ((value + (((bfd_vma) 0x8000 << 32) | 0x80008000)) >> 48) & 0xffff;
3697 #else
3698 abort ();
3699 return MINUS_ONE;
3700 #endif
3703 /* Create the .compact_rel section. */
3705 static bfd_boolean
3706 mips_elf_create_compact_rel_section
3707 (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
3709 flagword flags;
3710 register asection *s;
3712 if (bfd_get_section_by_name (abfd, ".compact_rel") == NULL)
3714 flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED
3715 | SEC_READONLY);
3717 s = bfd_make_section_with_flags (abfd, ".compact_rel", flags);
3718 if (s == NULL
3719 || ! bfd_set_section_alignment (abfd, s,
3720 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
3721 return FALSE;
3723 s->size = sizeof (Elf32_External_compact_rel);
3726 return TRUE;
3729 /* Create the .got section to hold the global offset table. */
3731 static bfd_boolean
3732 mips_elf_create_got_section (bfd *abfd, struct bfd_link_info *info,
3733 bfd_boolean maybe_exclude)
3735 flagword flags;
3736 register asection *s;
3737 struct elf_link_hash_entry *h;
3738 struct bfd_link_hash_entry *bh;
3739 struct mips_got_info *g;
3740 bfd_size_type amt;
3741 struct mips_elf_link_hash_table *htab;
3743 htab = mips_elf_hash_table (info);
3745 /* This function may be called more than once. */
3746 s = mips_elf_got_section (abfd, TRUE);
3747 if (s)
3749 if (! maybe_exclude)
3750 s->flags &= ~SEC_EXCLUDE;
3751 return TRUE;
3754 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3755 | SEC_LINKER_CREATED);
3757 if (maybe_exclude)
3758 flags |= SEC_EXCLUDE;
3760 /* We have to use an alignment of 2**4 here because this is hardcoded
3761 in the function stub generation and in the linker script. */
3762 s = bfd_make_section_with_flags (abfd, ".got", flags);
3763 if (s == NULL
3764 || ! bfd_set_section_alignment (abfd, s, 4))
3765 return FALSE;
3767 /* Define the symbol _GLOBAL_OFFSET_TABLE_. We don't do this in the
3768 linker script because we don't want to define the symbol if we
3769 are not creating a global offset table. */
3770 bh = NULL;
3771 if (! (_bfd_generic_link_add_one_symbol
3772 (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
3773 0, NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
3774 return FALSE;
3776 h = (struct elf_link_hash_entry *) bh;
3777 h->non_elf = 0;
3778 h->def_regular = 1;
3779 h->type = STT_OBJECT;
3780 elf_hash_table (info)->hgot = h;
3782 if (info->shared
3783 && ! bfd_elf_link_record_dynamic_symbol (info, h))
3784 return FALSE;
3786 amt = sizeof (struct mips_got_info);
3787 g = bfd_alloc (abfd, amt);
3788 if (g == NULL)
3789 return FALSE;
3790 g->global_gotsym = NULL;
3791 g->global_gotno = 0;
3792 g->tls_gotno = 0;
3793 g->local_gotno = MIPS_RESERVED_GOTNO (info);
3794 g->assigned_gotno = MIPS_RESERVED_GOTNO (info);
3795 g->bfd2got = NULL;
3796 g->next = NULL;
3797 g->tls_ldm_offset = MINUS_ONE;
3798 g->got_entries = htab_try_create (1, mips_elf_got_entry_hash,
3799 mips_elf_got_entry_eq, NULL);
3800 if (g->got_entries == NULL)
3801 return FALSE;
3802 mips_elf_section_data (s)->u.got_info = g;
3803 mips_elf_section_data (s)->elf.this_hdr.sh_flags
3804 |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
3806 /* VxWorks also needs a .got.plt section. */
3807 if (htab->is_vxworks)
3809 s = bfd_make_section_with_flags (abfd, ".got.plt",
3810 SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
3811 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3812 if (s == NULL || !bfd_set_section_alignment (abfd, s, 4))
3813 return FALSE;
3815 htab->sgotplt = s;
3817 return TRUE;
3820 /* Return true if H refers to the special VxWorks __GOTT_BASE__ or
3821 __GOTT_INDEX__ symbols. These symbols are only special for
3822 shared objects; they are not used in executables. */
3824 static bfd_boolean
3825 is_gott_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h)
3827 return (mips_elf_hash_table (info)->is_vxworks
3828 && info->shared
3829 && (strcmp (h->root.root.string, "__GOTT_BASE__") == 0
3830 || strcmp (h->root.root.string, "__GOTT_INDEX__") == 0));
3833 /* Calculate the value produced by the RELOCATION (which comes from
3834 the INPUT_BFD). The ADDEND is the addend to use for this
3835 RELOCATION; RELOCATION->R_ADDEND is ignored.
3837 The result of the relocation calculation is stored in VALUEP.
3838 REQUIRE_JALXP indicates whether or not the opcode used with this
3839 relocation must be JALX.
3841 This function returns bfd_reloc_continue if the caller need take no
3842 further action regarding this relocation, bfd_reloc_notsupported if
3843 something goes dramatically wrong, bfd_reloc_overflow if an
3844 overflow occurs, and bfd_reloc_ok to indicate success. */
3846 static bfd_reloc_status_type
3847 mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
3848 asection *input_section,
3849 struct bfd_link_info *info,
3850 const Elf_Internal_Rela *relocation,
3851 bfd_vma addend, reloc_howto_type *howto,
3852 Elf_Internal_Sym *local_syms,
3853 asection **local_sections, bfd_vma *valuep,
3854 const char **namep, bfd_boolean *require_jalxp,
3855 bfd_boolean save_addend)
3857 /* The eventual value we will return. */
3858 bfd_vma value;
3859 /* The address of the symbol against which the relocation is
3860 occurring. */
3861 bfd_vma symbol = 0;
3862 /* The final GP value to be used for the relocatable, executable, or
3863 shared object file being produced. */
3864 bfd_vma gp = MINUS_ONE;
3865 /* The place (section offset or address) of the storage unit being
3866 relocated. */
3867 bfd_vma p;
3868 /* The value of GP used to create the relocatable object. */
3869 bfd_vma gp0 = MINUS_ONE;
3870 /* The offset into the global offset table at which the address of
3871 the relocation entry symbol, adjusted by the addend, resides
3872 during execution. */
3873 bfd_vma g = MINUS_ONE;
3874 /* The section in which the symbol referenced by the relocation is
3875 located. */
3876 asection *sec = NULL;
3877 struct mips_elf_link_hash_entry *h = NULL;
3878 /* TRUE if the symbol referred to by this relocation is a local
3879 symbol. */
3880 bfd_boolean local_p, was_local_p;
3881 /* TRUE if the symbol referred to by this relocation is "_gp_disp". */
3882 bfd_boolean gp_disp_p = FALSE;
3883 /* TRUE if the symbol referred to by this relocation is
3884 "__gnu_local_gp". */
3885 bfd_boolean gnu_local_gp_p = FALSE;
3886 Elf_Internal_Shdr *symtab_hdr;
3887 size_t extsymoff;
3888 unsigned long r_symndx;
3889 int r_type;
3890 /* TRUE if overflow occurred during the calculation of the
3891 relocation value. */
3892 bfd_boolean overflowed_p;
3893 /* TRUE if this relocation refers to a MIPS16 function. */
3894 bfd_boolean target_is_16_bit_code_p = FALSE;
3895 struct mips_elf_link_hash_table *htab;
3896 bfd *dynobj;
3898 dynobj = elf_hash_table (info)->dynobj;
3899 htab = mips_elf_hash_table (info);
3901 /* Parse the relocation. */
3902 r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
3903 r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
3904 p = (input_section->output_section->vma
3905 + input_section->output_offset
3906 + relocation->r_offset);
3908 /* Assume that there will be no overflow. */
3909 overflowed_p = FALSE;
3911 /* Figure out whether or not the symbol is local, and get the offset
3912 used in the array of hash table entries. */
3913 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3914 local_p = mips_elf_local_relocation_p (input_bfd, relocation,
3915 local_sections, FALSE);
3916 was_local_p = local_p;
3917 if (! elf_bad_symtab (input_bfd))
3918 extsymoff = symtab_hdr->sh_info;
3919 else
3921 /* The symbol table does not follow the rule that local symbols
3922 must come before globals. */
3923 extsymoff = 0;
3926 /* Figure out the value of the symbol. */
3927 if (local_p)
3929 Elf_Internal_Sym *sym;
3931 sym = local_syms + r_symndx;
3932 sec = local_sections[r_symndx];
3934 symbol = sec->output_section->vma + sec->output_offset;
3935 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION
3936 || (sec->flags & SEC_MERGE))
3937 symbol += sym->st_value;
3938 if ((sec->flags & SEC_MERGE)
3939 && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
3941 addend = _bfd_elf_rel_local_sym (abfd, sym, &sec, addend);
3942 addend -= symbol;
3943 addend += sec->output_section->vma + sec->output_offset;
3946 /* MIPS16 text labels should be treated as odd. */
3947 if (sym->st_other == STO_MIPS16)
3948 ++symbol;
3950 /* Record the name of this symbol, for our caller. */
3951 *namep = bfd_elf_string_from_elf_section (input_bfd,
3952 symtab_hdr->sh_link,
3953 sym->st_name);
3954 if (*namep == '\0')
3955 *namep = bfd_section_name (input_bfd, sec);
3957 target_is_16_bit_code_p = (sym->st_other == STO_MIPS16);
3959 else
3961 /* ??? Could we use RELOC_FOR_GLOBAL_SYMBOL here ? */
3963 /* For global symbols we look up the symbol in the hash-table. */
3964 h = ((struct mips_elf_link_hash_entry *)
3965 elf_sym_hashes (input_bfd) [r_symndx - extsymoff]);
3966 /* Find the real hash-table entry for this symbol. */
3967 while (h->root.root.type == bfd_link_hash_indirect
3968 || h->root.root.type == bfd_link_hash_warning)
3969 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
3971 /* Record the name of this symbol, for our caller. */
3972 *namep = h->root.root.root.string;
3974 /* See if this is the special _gp_disp symbol. Note that such a
3975 symbol must always be a global symbol. */
3976 if (strcmp (*namep, "_gp_disp") == 0
3977 && ! NEWABI_P (input_bfd))
3979 /* Relocations against _gp_disp are permitted only with
3980 R_MIPS_HI16 and R_MIPS_LO16 relocations. */
3981 if (r_type != R_MIPS_HI16 && r_type != R_MIPS_LO16
3982 && r_type != R_MIPS16_HI16 && r_type != R_MIPS16_LO16)
3983 return bfd_reloc_notsupported;
3985 gp_disp_p = TRUE;
3987 /* See if this is the special _gp symbol. Note that such a
3988 symbol must always be a global symbol. */
3989 else if (strcmp (*namep, "__gnu_local_gp") == 0)
3990 gnu_local_gp_p = TRUE;
3993 /* If this symbol is defined, calculate its address. Note that
3994 _gp_disp is a magic symbol, always implicitly defined by the
3995 linker, so it's inappropriate to check to see whether or not
3996 its defined. */
3997 else if ((h->root.root.type == bfd_link_hash_defined
3998 || h->root.root.type == bfd_link_hash_defweak)
3999 && h->root.root.u.def.section)
4001 sec = h->root.root.u.def.section;
4002 if (sec->output_section)
4003 symbol = (h->root.root.u.def.value
4004 + sec->output_section->vma
4005 + sec->output_offset);
4006 else
4007 symbol = h->root.root.u.def.value;
4009 else if (h->root.root.type == bfd_link_hash_undefweak)
4010 /* We allow relocations against undefined weak symbols, giving
4011 it the value zero, so that you can undefined weak functions
4012 and check to see if they exist by looking at their
4013 addresses. */
4014 symbol = 0;
4015 else if (info->unresolved_syms_in_objects == RM_IGNORE
4016 && ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
4017 symbol = 0;
4018 else if (strcmp (*namep, SGI_COMPAT (input_bfd)
4019 ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING") == 0)
4021 /* If this is a dynamic link, we should have created a
4022 _DYNAMIC_LINK symbol or _DYNAMIC_LINKING(for normal mips) symbol
4023 in in _bfd_mips_elf_create_dynamic_sections.
4024 Otherwise, we should define the symbol with a value of 0.
4025 FIXME: It should probably get into the symbol table
4026 somehow as well. */
4027 BFD_ASSERT (! info->shared);
4028 BFD_ASSERT (bfd_get_section_by_name (abfd, ".dynamic") == NULL);
4029 symbol = 0;
4031 else if (ELF_MIPS_IS_OPTIONAL (h->root.other))
4033 /* This is an optional symbol - an Irix specific extension to the
4034 ELF spec. Ignore it for now.
4035 XXX - FIXME - there is more to the spec for OPTIONAL symbols
4036 than simply ignoring them, but we do not handle this for now.
4037 For information see the "64-bit ELF Object File Specification"
4038 which is available from here:
4039 http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf */
4040 symbol = 0;
4042 else
4044 if (! ((*info->callbacks->undefined_symbol)
4045 (info, h->root.root.root.string, input_bfd,
4046 input_section, relocation->r_offset,
4047 (info->unresolved_syms_in_objects == RM_GENERATE_ERROR)
4048 || ELF_ST_VISIBILITY (h->root.other))))
4049 return bfd_reloc_undefined;
4050 symbol = 0;
4053 target_is_16_bit_code_p = (h->root.other == STO_MIPS16);
4056 /* If this is a 32- or 64-bit call to a 16-bit function with a stub, we
4057 need to redirect the call to the stub, unless we're already *in*
4058 a stub. */
4059 if (r_type != R_MIPS16_26 && !info->relocatable
4060 && ((h != NULL && h->fn_stub != NULL)
4061 || (local_p && elf_tdata (input_bfd)->local_stubs != NULL
4062 && elf_tdata (input_bfd)->local_stubs[r_symndx] != NULL))
4063 && !mips_elf_stub_section_p (input_bfd, input_section))
4065 /* This is a 32- or 64-bit call to a 16-bit function. We should
4066 have already noticed that we were going to need the
4067 stub. */
4068 if (local_p)
4069 sec = elf_tdata (input_bfd)->local_stubs[r_symndx];
4070 else
4072 BFD_ASSERT (h->need_fn_stub);
4073 sec = h->fn_stub;
4076 symbol = sec->output_section->vma + sec->output_offset;
4078 /* If this is a 16-bit call to a 32- or 64-bit function with a stub, we
4079 need to redirect the call to the stub. */
4080 else if (r_type == R_MIPS16_26 && !info->relocatable
4081 && h != NULL
4082 && (h->call_stub != NULL || h->call_fp_stub != NULL)
4083 && !target_is_16_bit_code_p)
4085 /* If both call_stub and call_fp_stub are defined, we can figure
4086 out which one to use by seeing which one appears in the input
4087 file. */
4088 if (h->call_stub != NULL && h->call_fp_stub != NULL)
4090 asection *o;
4092 sec = NULL;
4093 for (o = input_bfd->sections; o != NULL; o = o->next)
4095 if (strncmp (bfd_get_section_name (input_bfd, o),
4096 CALL_FP_STUB, sizeof CALL_FP_STUB - 1) == 0)
4098 sec = h->call_fp_stub;
4099 break;
4102 if (sec == NULL)
4103 sec = h->call_stub;
4105 else if (h->call_stub != NULL)
4106 sec = h->call_stub;
4107 else
4108 sec = h->call_fp_stub;
4110 BFD_ASSERT (sec->size > 0);
4111 symbol = sec->output_section->vma + sec->output_offset;
4114 /* Calls from 16-bit code to 32-bit code and vice versa require the
4115 special jalx instruction. */
4116 *require_jalxp = (!info->relocatable
4117 && (((r_type == R_MIPS16_26) && !target_is_16_bit_code_p)
4118 || ((r_type == R_MIPS_26) && target_is_16_bit_code_p)));
4120 local_p = mips_elf_local_relocation_p (input_bfd, relocation,
4121 local_sections, TRUE);
4123 /* If we haven't already determined the GOT offset, or the GP value,
4124 and we're going to need it, get it now. */
4125 switch (r_type)
4127 case R_MIPS_GOT_PAGE:
4128 case R_MIPS_GOT_OFST:
4129 /* We need to decay to GOT_DISP/addend if the symbol doesn't
4130 bind locally. */
4131 local_p = local_p || _bfd_elf_symbol_refs_local_p (&h->root, info, 1);
4132 if (local_p || r_type == R_MIPS_GOT_OFST)
4133 break;
4134 /* Fall through. */
4136 case R_MIPS_CALL16:
4137 case R_MIPS_GOT16:
4138 case R_MIPS_GOT_DISP:
4139 case R_MIPS_GOT_HI16:
4140 case R_MIPS_CALL_HI16:
4141 case R_MIPS_GOT_LO16:
4142 case R_MIPS_CALL_LO16:
4143 case R_MIPS_TLS_GD:
4144 case R_MIPS_TLS_GOTTPREL:
4145 case R_MIPS_TLS_LDM:
4146 /* Find the index into the GOT where this value is located. */
4147 if (r_type == R_MIPS_TLS_LDM)
4149 g = mips_elf_local_got_index (abfd, input_bfd, info,
4150 sec, 0, 0, NULL, r_type);
4151 if (g == MINUS_ONE)
4152 return bfd_reloc_outofrange;
4154 else if (!local_p)
4156 /* On VxWorks, CALL relocations should refer to the .got.plt
4157 entry, which is initialized to point at the PLT stub. */
4158 if (htab->is_vxworks
4159 && (r_type == R_MIPS_CALL_HI16
4160 || r_type == R_MIPS_CALL_LO16
4161 || r_type == R_MIPS_CALL16))
4163 BFD_ASSERT (addend == 0);
4164 BFD_ASSERT (h->root.needs_plt);
4165 g = mips_elf_gotplt_index (info, &h->root);
4167 else
4169 /* GOT_PAGE may take a non-zero addend, that is ignored in a
4170 GOT_PAGE relocation that decays to GOT_DISP because the
4171 symbol turns out to be global. The addend is then added
4172 as GOT_OFST. */
4173 BFD_ASSERT (addend == 0 || r_type == R_MIPS_GOT_PAGE);
4174 g = mips_elf_global_got_index (dynobj, input_bfd,
4175 &h->root, r_type, info);
4176 if (h->tls_type == GOT_NORMAL
4177 && (! elf_hash_table(info)->dynamic_sections_created
4178 || (info->shared
4179 && (info->symbolic || h->root.forced_local)
4180 && h->root.def_regular)))
4182 /* This is a static link or a -Bsymbolic link. The
4183 symbol is defined locally, or was forced to be local.
4184 We must initialize this entry in the GOT. */
4185 asection *sgot = mips_elf_got_section (dynobj, FALSE);
4186 MIPS_ELF_PUT_WORD (dynobj, symbol, sgot->contents + g);
4190 else if (!htab->is_vxworks
4191 && (r_type == R_MIPS_CALL16 || (r_type == R_MIPS_GOT16)))
4192 /* The calculation below does not involve "g". */
4193 break;
4194 else
4196 g = mips_elf_local_got_index (abfd, input_bfd, info, sec,
4197 symbol + addend, r_symndx, h, r_type);
4198 if (g == MINUS_ONE)
4199 return bfd_reloc_outofrange;
4202 /* Convert GOT indices to actual offsets. */
4203 g = mips_elf_got_offset_from_index (dynobj, abfd, input_bfd, g);
4204 break;
4206 case R_MIPS_HI16:
4207 case R_MIPS_LO16:
4208 case R_MIPS_GPREL16:
4209 case R_MIPS_GPREL32:
4210 case R_MIPS_LITERAL:
4211 case R_MIPS16_HI16:
4212 case R_MIPS16_LO16:
4213 case R_MIPS16_GPREL:
4214 gp0 = _bfd_get_gp_value (input_bfd);
4215 gp = _bfd_get_gp_value (abfd);
4216 if (dynobj)
4217 gp += mips_elf_adjust_gp (abfd, mips_elf_got_info (dynobj, NULL),
4218 input_bfd);
4219 break;
4221 default:
4222 break;
4225 if (gnu_local_gp_p)
4226 symbol = gp;
4228 /* Relocations against the VxWorks __GOTT_BASE__ and __GOTT_INDEX__
4229 symbols are resolved by the loader. Add them to .rela.dyn. */
4230 if (h != NULL && is_gott_symbol (info, &h->root))
4232 Elf_Internal_Rela outrel;
4233 bfd_byte *loc;
4234 asection *s;
4236 s = mips_elf_rel_dyn_section (info, FALSE);
4237 loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
4239 outrel.r_offset = (input_section->output_section->vma
4240 + input_section->output_offset
4241 + relocation->r_offset);
4242 outrel.r_info = ELF32_R_INFO (h->root.dynindx, r_type);
4243 outrel.r_addend = addend;
4244 bfd_elf32_swap_reloca_out (abfd, &outrel, loc);
4245 *valuep = 0;
4246 return bfd_reloc_ok;
4249 /* Figure out what kind of relocation is being performed. */
4250 switch (r_type)
4252 case R_MIPS_NONE:
4253 return bfd_reloc_continue;
4255 case R_MIPS_16:
4256 value = symbol + _bfd_mips_elf_sign_extend (addend, 16);
4257 overflowed_p = mips_elf_overflow_p (value, 16);
4258 break;
4260 case R_MIPS_32:
4261 case R_MIPS_REL32:
4262 case R_MIPS_64:
4263 if ((info->shared
4264 || (!htab->is_vxworks
4265 && htab->root.dynamic_sections_created
4266 && h != NULL
4267 && h->root.def_dynamic
4268 && !h->root.def_regular))
4269 && r_symndx != 0
4270 && (input_section->flags & SEC_ALLOC) != 0)
4272 /* If we're creating a shared library, or this relocation is
4273 against a symbol in a shared library, then we can't know
4274 where the symbol will end up. So, we create a relocation
4275 record in the output, and leave the job up to the dynamic
4276 linker.
4278 In VxWorks executables, references to external symbols
4279 are handled using copy relocs or PLT stubs, so there's
4280 no need to add a dynamic relocation here. */
4281 value = addend;
4282 if (!mips_elf_create_dynamic_relocation (abfd,
4283 info,
4284 relocation,
4286 sec,
4287 symbol,
4288 &value,
4289 input_section))
4290 return bfd_reloc_undefined;
4292 else
4294 if (r_type != R_MIPS_REL32)
4295 value = symbol + addend;
4296 else
4297 value = addend;
4299 value &= howto->dst_mask;
4300 break;
4302 case R_MIPS_PC32:
4303 value = symbol + addend - p;
4304 value &= howto->dst_mask;
4305 break;
4307 case R_MIPS16_26:
4308 /* The calculation for R_MIPS16_26 is just the same as for an
4309 R_MIPS_26. It's only the storage of the relocated field into
4310 the output file that's different. That's handled in
4311 mips_elf_perform_relocation. So, we just fall through to the
4312 R_MIPS_26 case here. */
4313 case R_MIPS_26:
4314 if (local_p)
4315 value = ((addend | ((p + 4) & 0xf0000000)) + symbol) >> 2;
4316 else
4318 value = (_bfd_mips_elf_sign_extend (addend, 28) + symbol) >> 2;
4319 if (h->root.root.type != bfd_link_hash_undefweak)
4320 overflowed_p = (value >> 26) != ((p + 4) >> 28);
4322 value &= howto->dst_mask;
4323 break;
4325 case R_MIPS_TLS_DTPREL_HI16:
4326 value = (mips_elf_high (addend + symbol - dtprel_base (info))
4327 & howto->dst_mask);
4328 break;
4330 case R_MIPS_TLS_DTPREL_LO16:
4331 value = (symbol + addend - dtprel_base (info)) & howto->dst_mask;
4332 break;
4334 case R_MIPS_TLS_TPREL_HI16:
4335 value = (mips_elf_high (addend + symbol - tprel_base (info))
4336 & howto->dst_mask);
4337 break;
4339 case R_MIPS_TLS_TPREL_LO16:
4340 value = (symbol + addend - tprel_base (info)) & howto->dst_mask;
4341 break;
4343 case R_MIPS_HI16:
4344 case R_MIPS16_HI16:
4345 if (!gp_disp_p)
4347 value = mips_elf_high (addend + symbol);
4348 value &= howto->dst_mask;
4350 else
4352 /* For MIPS16 ABI code we generate this sequence
4353 0: li $v0,%hi(_gp_disp)
4354 4: addiupc $v1,%lo(_gp_disp)
4355 8: sll $v0,16
4356 12: addu $v0,$v1
4357 14: move $gp,$v0
4358 So the offsets of hi and lo relocs are the same, but the
4359 $pc is four higher than $t9 would be, so reduce
4360 both reloc addends by 4. */
4361 if (r_type == R_MIPS16_HI16)
4362 value = mips_elf_high (addend + gp - p - 4);
4363 else
4364 value = mips_elf_high (addend + gp - p);
4365 overflowed_p = mips_elf_overflow_p (value, 16);
4367 break;
4369 case R_MIPS_LO16:
4370 case R_MIPS16_LO16:
4371 if (!gp_disp_p)
4372 value = (symbol + addend) & howto->dst_mask;
4373 else
4375 /* See the comment for R_MIPS16_HI16 above for the reason
4376 for this conditional. */
4377 if (r_type == R_MIPS16_LO16)
4378 value = addend + gp - p;
4379 else
4380 value = addend + gp - p + 4;
4381 /* The MIPS ABI requires checking the R_MIPS_LO16 relocation
4382 for overflow. But, on, say, IRIX5, relocations against
4383 _gp_disp are normally generated from the .cpload
4384 pseudo-op. It generates code that normally looks like
4385 this:
4387 lui $gp,%hi(_gp_disp)
4388 addiu $gp,$gp,%lo(_gp_disp)
4389 addu $gp,$gp,$t9
4391 Here $t9 holds the address of the function being called,
4392 as required by the MIPS ELF ABI. The R_MIPS_LO16
4393 relocation can easily overflow in this situation, but the
4394 R_MIPS_HI16 relocation will handle the overflow.
4395 Therefore, we consider this a bug in the MIPS ABI, and do
4396 not check for overflow here. */
4398 break;
4400 case R_MIPS_LITERAL:
4401 /* Because we don't merge literal sections, we can handle this
4402 just like R_MIPS_GPREL16. In the long run, we should merge
4403 shared literals, and then we will need to additional work
4404 here. */
4406 /* Fall through. */
4408 case R_MIPS16_GPREL:
4409 /* The R_MIPS16_GPREL performs the same calculation as
4410 R_MIPS_GPREL16, but stores the relocated bits in a different
4411 order. We don't need to do anything special here; the
4412 differences are handled in mips_elf_perform_relocation. */
4413 case R_MIPS_GPREL16:
4414 /* Only sign-extend the addend if it was extracted from the
4415 instruction. If the addend was separate, leave it alone,
4416 otherwise we may lose significant bits. */
4417 if (howto->partial_inplace)
4418 addend = _bfd_mips_elf_sign_extend (addend, 16);
4419 value = symbol + addend - gp;
4420 /* If the symbol was local, any earlier relocatable links will
4421 have adjusted its addend with the gp offset, so compensate
4422 for that now. Don't do it for symbols forced local in this
4423 link, though, since they won't have had the gp offset applied
4424 to them before. */
4425 if (was_local_p)
4426 value += gp0;
4427 overflowed_p = mips_elf_overflow_p (value, 16);
4428 break;
4430 case R_MIPS_GOT16:
4431 case R_MIPS_CALL16:
4432 /* VxWorks does not have separate local and global semantics for
4433 R_MIPS_GOT16; every relocation evaluates to "G". */
4434 if (!htab->is_vxworks && local_p)
4436 bfd_boolean forced;
4438 forced = ! mips_elf_local_relocation_p (input_bfd, relocation,
4439 local_sections, FALSE);
4440 value = mips_elf_got16_entry (abfd, input_bfd, info, sec,
4441 symbol + addend, forced);
4442 if (value == MINUS_ONE)
4443 return bfd_reloc_outofrange;
4444 value
4445 = mips_elf_got_offset_from_index (dynobj, abfd, input_bfd, value);
4446 overflowed_p = mips_elf_overflow_p (value, 16);
4447 break;
4450 /* Fall through. */
4452 case R_MIPS_TLS_GD:
4453 case R_MIPS_TLS_GOTTPREL:
4454 case R_MIPS_TLS_LDM:
4455 case R_MIPS_GOT_DISP:
4456 got_disp:
4457 value = g;
4458 overflowed_p = mips_elf_overflow_p (value, 16);
4459 break;
4461 case R_MIPS_GPREL32:
4462 value = (addend + symbol + gp0 - gp);
4463 if (!save_addend)
4464 value &= howto->dst_mask;
4465 break;
4467 case R_MIPS_PC16:
4468 case R_MIPS_GNU_REL16_S2:
4469 value = symbol + _bfd_mips_elf_sign_extend (addend, 18) - p;
4470 overflowed_p = mips_elf_overflow_p (value, 18);
4471 value = (value >> 2) & howto->dst_mask;
4472 break;
4474 case R_MIPS_GOT_HI16:
4475 case R_MIPS_CALL_HI16:
4476 /* We're allowed to handle these two relocations identically.
4477 The dynamic linker is allowed to handle the CALL relocations
4478 differently by creating a lazy evaluation stub. */
4479 value = g;
4480 value = mips_elf_high (value);
4481 value &= howto->dst_mask;
4482 break;
4484 case R_MIPS_GOT_LO16:
4485 case R_MIPS_CALL_LO16:
4486 value = g & howto->dst_mask;
4487 break;
4489 case R_MIPS_GOT_PAGE:
4490 /* GOT_PAGE relocations that reference non-local symbols decay
4491 to GOT_DISP. The corresponding GOT_OFST relocation decays to
4492 0. */
4493 if (! local_p)
4494 goto got_disp;
4495 value = mips_elf_got_page (abfd, input_bfd, info, sec,
4496 symbol + addend, NULL);
4497 if (value == MINUS_ONE)
4498 return bfd_reloc_outofrange;
4499 value = mips_elf_got_offset_from_index (dynobj, abfd, input_bfd, value);
4500 overflowed_p = mips_elf_overflow_p (value, 16);
4501 break;
4503 case R_MIPS_GOT_OFST:
4504 if (local_p)
4505 mips_elf_got_page (abfd, input_bfd, info, sec,
4506 symbol + addend, &value);
4507 else
4508 value = addend;
4509 overflowed_p = mips_elf_overflow_p (value, 16);
4510 break;
4512 case R_MIPS_SUB:
4513 value = symbol - addend;
4514 value &= howto->dst_mask;
4515 break;
4517 case R_MIPS_HIGHER:
4518 value = mips_elf_higher (addend + symbol);
4519 value &= howto->dst_mask;
4520 break;
4522 case R_MIPS_HIGHEST:
4523 value = mips_elf_highest (addend + symbol);
4524 value &= howto->dst_mask;
4525 break;
4527 case R_MIPS_SCN_DISP:
4528 value = symbol + addend - sec->output_offset;
4529 value &= howto->dst_mask;
4530 break;
4532 case R_MIPS_JALR:
4533 /* This relocation is only a hint. In some cases, we optimize
4534 it into a bal instruction. But we don't try to optimize
4535 branches to the PLT; that will wind up wasting time. */
4536 if (h != NULL && h->root.plt.offset != (bfd_vma) -1)
4537 return bfd_reloc_continue;
4538 value = symbol + addend;
4539 break;
4541 case R_MIPS_PJUMP:
4542 case R_MIPS_GNU_VTINHERIT:
4543 case R_MIPS_GNU_VTENTRY:
4544 /* We don't do anything with these at present. */
4545 return bfd_reloc_continue;
4547 default:
4548 /* An unrecognized relocation type. */
4549 return bfd_reloc_notsupported;
4552 /* Store the VALUE for our caller. */
4553 *valuep = value;
4554 return overflowed_p ? bfd_reloc_overflow : bfd_reloc_ok;
4557 /* Obtain the field relocated by RELOCATION. */
4559 static bfd_vma
4560 mips_elf_obtain_contents (reloc_howto_type *howto,
4561 const Elf_Internal_Rela *relocation,
4562 bfd *input_bfd, bfd_byte *contents)
4564 bfd_vma x;
4565 bfd_byte *location = contents + relocation->r_offset;
4567 /* Obtain the bytes. */
4568 x = bfd_get ((8 * bfd_get_reloc_size (howto)), input_bfd, location);
4570 return x;
4573 /* It has been determined that the result of the RELOCATION is the
4574 VALUE. Use HOWTO to place VALUE into the output file at the
4575 appropriate position. The SECTION is the section to which the
4576 relocation applies. If REQUIRE_JALX is TRUE, then the opcode used
4577 for the relocation must be either JAL or JALX, and it is
4578 unconditionally converted to JALX.
4580 Returns FALSE if anything goes wrong. */
4582 static bfd_boolean
4583 mips_elf_perform_relocation (struct bfd_link_info *info,
4584 reloc_howto_type *howto,
4585 const Elf_Internal_Rela *relocation,
4586 bfd_vma value, bfd *input_bfd,
4587 asection *input_section, bfd_byte *contents,
4588 bfd_boolean require_jalx)
4590 bfd_vma x;
4591 bfd_byte *location;
4592 int r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
4594 /* Figure out where the relocation is occurring. */
4595 location = contents + relocation->r_offset;
4597 _bfd_mips16_elf_reloc_unshuffle (input_bfd, r_type, FALSE, location);
4599 /* Obtain the current value. */
4600 x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
4602 /* Clear the field we are setting. */
4603 x &= ~howto->dst_mask;
4605 /* Set the field. */
4606 x |= (value & howto->dst_mask);
4608 /* If required, turn JAL into JALX. */
4609 if (require_jalx)
4611 bfd_boolean ok;
4612 bfd_vma opcode = x >> 26;
4613 bfd_vma jalx_opcode;
4615 /* Check to see if the opcode is already JAL or JALX. */
4616 if (r_type == R_MIPS16_26)
4618 ok = ((opcode == 0x6) || (opcode == 0x7));
4619 jalx_opcode = 0x7;
4621 else
4623 ok = ((opcode == 0x3) || (opcode == 0x1d));
4624 jalx_opcode = 0x1d;
4627 /* If the opcode is not JAL or JALX, there's a problem. */
4628 if (!ok)
4630 (*_bfd_error_handler)
4631 (_("%B: %A+0x%lx: jump to stub routine which is not jal"),
4632 input_bfd,
4633 input_section,
4634 (unsigned long) relocation->r_offset);
4635 bfd_set_error (bfd_error_bad_value);
4636 return FALSE;
4639 /* Make this the JALX opcode. */
4640 x = (x & ~(0x3f << 26)) | (jalx_opcode << 26);
4643 /* On the RM9000, bal is faster than jal, because bal uses branch
4644 prediction hardware. If we are linking for the RM9000, and we
4645 see jal, and bal fits, use it instead. Note that this
4646 transformation should be safe for all architectures. */
4647 if (bfd_get_mach (input_bfd) == bfd_mach_mips9000
4648 && !info->relocatable
4649 && !require_jalx
4650 && ((r_type == R_MIPS_26 && (x >> 26) == 0x3) /* jal addr */
4651 || (r_type == R_MIPS_JALR && x == 0x0320f809))) /* jalr t9 */
4653 bfd_vma addr;
4654 bfd_vma dest;
4655 bfd_signed_vma off;
4657 addr = (input_section->output_section->vma
4658 + input_section->output_offset
4659 + relocation->r_offset
4660 + 4);
4661 if (r_type == R_MIPS_26)
4662 dest = (value << 2) | ((addr >> 28) << 28);
4663 else
4664 dest = value;
4665 off = dest - addr;
4666 if (off <= 0x1ffff && off >= -0x20000)
4667 x = 0x04110000 | (((bfd_vma) off >> 2) & 0xffff); /* bal addr */
4670 /* Put the value into the output. */
4671 bfd_put (8 * bfd_get_reloc_size (howto), input_bfd, x, location);
4673 _bfd_mips16_elf_reloc_shuffle(input_bfd, r_type, !info->relocatable,
4674 location);
4676 return TRUE;
4679 /* Returns TRUE if SECTION is a MIPS16 stub section. */
4681 static bfd_boolean
4682 mips_elf_stub_section_p (bfd *abfd ATTRIBUTE_UNUSED, asection *section)
4684 const char *name = bfd_get_section_name (abfd, section);
4686 return (strncmp (name, FN_STUB, sizeof FN_STUB - 1) == 0
4687 || strncmp (name, CALL_STUB, sizeof CALL_STUB - 1) == 0
4688 || strncmp (name, CALL_FP_STUB, sizeof CALL_FP_STUB - 1) == 0);
4691 /* Add room for N relocations to the .rel(a).dyn section in ABFD. */
4693 static void
4694 mips_elf_allocate_dynamic_relocations (bfd *abfd, struct bfd_link_info *info,
4695 unsigned int n)
4697 asection *s;
4698 struct mips_elf_link_hash_table *htab;
4700 htab = mips_elf_hash_table (info);
4701 s = mips_elf_rel_dyn_section (info, FALSE);
4702 BFD_ASSERT (s != NULL);
4704 if (htab->is_vxworks)
4705 s->size += n * MIPS_ELF_RELA_SIZE (abfd);
4706 else
4708 if (s->size == 0)
4710 /* Make room for a null element. */
4711 s->size += MIPS_ELF_REL_SIZE (abfd);
4712 ++s->reloc_count;
4714 s->size += n * MIPS_ELF_REL_SIZE (abfd);
4718 /* Create a rel.dyn relocation for the dynamic linker to resolve. REL
4719 is the original relocation, which is now being transformed into a
4720 dynamic relocation. The ADDENDP is adjusted if necessary; the
4721 caller should store the result in place of the original addend. */
4723 static bfd_boolean
4724 mips_elf_create_dynamic_relocation (bfd *output_bfd,
4725 struct bfd_link_info *info,
4726 const Elf_Internal_Rela *rel,
4727 struct mips_elf_link_hash_entry *h,
4728 asection *sec, bfd_vma symbol,
4729 bfd_vma *addendp, asection *input_section)
4731 Elf_Internal_Rela outrel[3];
4732 asection *sreloc;
4733 bfd *dynobj;
4734 int r_type;
4735 long indx;
4736 bfd_boolean defined_p;
4737 struct mips_elf_link_hash_table *htab;
4739 htab = mips_elf_hash_table (info);
4740 r_type = ELF_R_TYPE (output_bfd, rel->r_info);
4741 dynobj = elf_hash_table (info)->dynobj;
4742 sreloc = mips_elf_rel_dyn_section (info, FALSE);
4743 BFD_ASSERT (sreloc != NULL);
4744 BFD_ASSERT (sreloc->contents != NULL);
4745 BFD_ASSERT (sreloc->reloc_count * MIPS_ELF_REL_SIZE (output_bfd)
4746 < sreloc->size);
4748 outrel[0].r_offset =
4749 _bfd_elf_section_offset (output_bfd, info, input_section, rel[0].r_offset);
4750 outrel[1].r_offset =
4751 _bfd_elf_section_offset (output_bfd, info, input_section, rel[1].r_offset);
4752 outrel[2].r_offset =
4753 _bfd_elf_section_offset (output_bfd, info, input_section, rel[2].r_offset);
4755 if (outrel[0].r_offset == MINUS_ONE)
4756 /* The relocation field has been deleted. */
4757 return TRUE;
4759 if (outrel[0].r_offset == MINUS_TWO)
4761 /* The relocation field has been converted into a relative value of
4762 some sort. Functions like _bfd_elf_write_section_eh_frame expect
4763 the field to be fully relocated, so add in the symbol's value. */
4764 *addendp += symbol;
4765 return TRUE;
4768 /* We must now calculate the dynamic symbol table index to use
4769 in the relocation. */
4770 if (h != NULL
4771 && (!h->root.def_regular
4772 || (info->shared && !info->symbolic && !h->root.forced_local)))
4774 indx = h->root.dynindx;
4775 if (SGI_COMPAT (output_bfd))
4776 defined_p = h->root.def_regular;
4777 else
4778 /* ??? glibc's ld.so just adds the final GOT entry to the
4779 relocation field. It therefore treats relocs against
4780 defined symbols in the same way as relocs against
4781 undefined symbols. */
4782 defined_p = FALSE;
4784 else
4786 if (sec != NULL && bfd_is_abs_section (sec))
4787 indx = 0;
4788 else if (sec == NULL || sec->owner == NULL)
4790 bfd_set_error (bfd_error_bad_value);
4791 return FALSE;
4793 else
4795 indx = elf_section_data (sec->output_section)->dynindx;
4796 if (indx == 0)
4797 abort ();
4800 /* Instead of generating a relocation using the section
4801 symbol, we may as well make it a fully relative
4802 relocation. We want to avoid generating relocations to
4803 local symbols because we used to generate them
4804 incorrectly, without adding the original symbol value,
4805 which is mandated by the ABI for section symbols. In
4806 order to give dynamic loaders and applications time to
4807 phase out the incorrect use, we refrain from emitting
4808 section-relative relocations. It's not like they're
4809 useful, after all. This should be a bit more efficient
4810 as well. */
4811 /* ??? Although this behavior is compatible with glibc's ld.so,
4812 the ABI says that relocations against STN_UNDEF should have
4813 a symbol value of 0. Irix rld honors this, so relocations
4814 against STN_UNDEF have no effect. */
4815 if (!SGI_COMPAT (output_bfd))
4816 indx = 0;
4817 defined_p = TRUE;
4820 /* If the relocation was previously an absolute relocation and
4821 this symbol will not be referred to by the relocation, we must
4822 adjust it by the value we give it in the dynamic symbol table.
4823 Otherwise leave the job up to the dynamic linker. */
4824 if (defined_p && r_type != R_MIPS_REL32)
4825 *addendp += symbol;
4827 if (htab->is_vxworks)
4828 /* VxWorks uses non-relative relocations for this. */
4829 outrel[0].r_info = ELF32_R_INFO (indx, R_MIPS_32);
4830 else
4831 /* The relocation is always an REL32 relocation because we don't
4832 know where the shared library will wind up at load-time. */
4833 outrel[0].r_info = ELF_R_INFO (output_bfd, (unsigned long) indx,
4834 R_MIPS_REL32);
4836 /* For strict adherence to the ABI specification, we should
4837 generate a R_MIPS_64 relocation record by itself before the
4838 _REL32/_64 record as well, such that the addend is read in as
4839 a 64-bit value (REL32 is a 32-bit relocation, after all).
4840 However, since none of the existing ELF64 MIPS dynamic
4841 loaders seems to care, we don't waste space with these
4842 artificial relocations. If this turns out to not be true,
4843 mips_elf_allocate_dynamic_relocation() should be tweaked so
4844 as to make room for a pair of dynamic relocations per
4845 invocation if ABI_64_P, and here we should generate an
4846 additional relocation record with R_MIPS_64 by itself for a
4847 NULL symbol before this relocation record. */
4848 outrel[1].r_info = ELF_R_INFO (output_bfd, 0,
4849 ABI_64_P (output_bfd)
4850 ? R_MIPS_64
4851 : R_MIPS_NONE);
4852 outrel[2].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_NONE);
4854 /* Adjust the output offset of the relocation to reference the
4855 correct location in the output file. */
4856 outrel[0].r_offset += (input_section->output_section->vma
4857 + input_section->output_offset);
4858 outrel[1].r_offset += (input_section->output_section->vma
4859 + input_section->output_offset);
4860 outrel[2].r_offset += (input_section->output_section->vma
4861 + input_section->output_offset);
4863 /* Put the relocation back out. We have to use the special
4864 relocation outputter in the 64-bit case since the 64-bit
4865 relocation format is non-standard. */
4866 if (ABI_64_P (output_bfd))
4868 (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
4869 (output_bfd, &outrel[0],
4870 (sreloc->contents
4871 + sreloc->reloc_count * sizeof (Elf64_Mips_External_Rel)));
4873 else if (htab->is_vxworks)
4875 /* VxWorks uses RELA rather than REL dynamic relocations. */
4876 outrel[0].r_addend = *addendp;
4877 bfd_elf32_swap_reloca_out
4878 (output_bfd, &outrel[0],
4879 (sreloc->contents
4880 + sreloc->reloc_count * sizeof (Elf32_External_Rela)));
4882 else
4883 bfd_elf32_swap_reloc_out
4884 (output_bfd, &outrel[0],
4885 (sreloc->contents + sreloc->reloc_count * sizeof (Elf32_External_Rel)));
4887 /* We've now added another relocation. */
4888 ++sreloc->reloc_count;
4890 /* Make sure the output section is writable. The dynamic linker
4891 will be writing to it. */
4892 elf_section_data (input_section->output_section)->this_hdr.sh_flags
4893 |= SHF_WRITE;
4895 /* On IRIX5, make an entry of compact relocation info. */
4896 if (IRIX_COMPAT (output_bfd) == ict_irix5)
4898 asection *scpt = bfd_get_section_by_name (dynobj, ".compact_rel");
4899 bfd_byte *cr;
4901 if (scpt)
4903 Elf32_crinfo cptrel;
4905 mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG);
4906 cptrel.vaddr = (rel->r_offset
4907 + input_section->output_section->vma
4908 + input_section->output_offset);
4909 if (r_type == R_MIPS_REL32)
4910 mips_elf_set_cr_type (cptrel, CRT_MIPS_REL32);
4911 else
4912 mips_elf_set_cr_type (cptrel, CRT_MIPS_WORD);
4913 mips_elf_set_cr_dist2to (cptrel, 0);
4914 cptrel.konst = *addendp;
4916 cr = (scpt->contents
4917 + sizeof (Elf32_External_compact_rel));
4918 mips_elf_set_cr_relvaddr (cptrel, 0);
4919 bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
4920 ((Elf32_External_crinfo *) cr
4921 + scpt->reloc_count));
4922 ++scpt->reloc_count;
4926 /* If we've written this relocation for a readonly section,
4927 we need to set DF_TEXTREL again, so that we do not delete the
4928 DT_TEXTREL tag. */
4929 if (MIPS_ELF_READONLY_SECTION (input_section))
4930 info->flags |= DF_TEXTREL;
4932 return TRUE;
4935 /* Return the MACH for a MIPS e_flags value. */
4937 unsigned long
4938 _bfd_elf_mips_mach (flagword flags)
4940 switch (flags & EF_MIPS_MACH)
4942 case E_MIPS_MACH_3900:
4943 return bfd_mach_mips3900;
4945 case E_MIPS_MACH_4010:
4946 return bfd_mach_mips4010;
4948 case E_MIPS_MACH_4100:
4949 return bfd_mach_mips4100;
4951 case E_MIPS_MACH_4111:
4952 return bfd_mach_mips4111;
4954 case E_MIPS_MACH_4120:
4955 return bfd_mach_mips4120;
4957 case E_MIPS_MACH_4650:
4958 return bfd_mach_mips4650;
4960 case E_MIPS_MACH_5400:
4961 return bfd_mach_mips5400;
4963 case E_MIPS_MACH_5500:
4964 return bfd_mach_mips5500;
4966 case E_MIPS_MACH_9000:
4967 return bfd_mach_mips9000;
4969 case E_MIPS_MACH_SB1:
4970 return bfd_mach_mips_sb1;
4972 default:
4973 switch (flags & EF_MIPS_ARCH)
4975 default:
4976 case E_MIPS_ARCH_1:
4977 return bfd_mach_mips3000;
4979 case E_MIPS_ARCH_2:
4980 return bfd_mach_mips6000;
4982 case E_MIPS_ARCH_3:
4983 return bfd_mach_mips4000;
4985 case E_MIPS_ARCH_4:
4986 return bfd_mach_mips8000;
4988 case E_MIPS_ARCH_5:
4989 return bfd_mach_mips5;
4991 case E_MIPS_ARCH_32:
4992 return bfd_mach_mipsisa32;
4994 case E_MIPS_ARCH_64:
4995 return bfd_mach_mipsisa64;
4997 case E_MIPS_ARCH_32R2:
4998 return bfd_mach_mipsisa32r2;
5000 case E_MIPS_ARCH_64R2:
5001 return bfd_mach_mipsisa64r2;
5005 return 0;
5008 /* Return printable name for ABI. */
5010 static INLINE char *
5011 elf_mips_abi_name (bfd *abfd)
5013 flagword flags;
5015 flags = elf_elfheader (abfd)->e_flags;
5016 switch (flags & EF_MIPS_ABI)
5018 case 0:
5019 if (ABI_N32_P (abfd))
5020 return "N32";
5021 else if (ABI_64_P (abfd))
5022 return "64";
5023 else
5024 return "none";
5025 case E_MIPS_ABI_O32:
5026 return "O32";
5027 case E_MIPS_ABI_O64:
5028 return "O64";
5029 case E_MIPS_ABI_EABI32:
5030 return "EABI32";
5031 case E_MIPS_ABI_EABI64:
5032 return "EABI64";
5033 default:
5034 return "unknown abi";
5038 /* MIPS ELF uses two common sections. One is the usual one, and the
5039 other is for small objects. All the small objects are kept
5040 together, and then referenced via the gp pointer, which yields
5041 faster assembler code. This is what we use for the small common
5042 section. This approach is copied from ecoff.c. */
5043 static asection mips_elf_scom_section;
5044 static asymbol mips_elf_scom_symbol;
5045 static asymbol *mips_elf_scom_symbol_ptr;
5047 /* MIPS ELF also uses an acommon section, which represents an
5048 allocated common symbol which may be overridden by a
5049 definition in a shared library. */
5050 static asection mips_elf_acom_section;
5051 static asymbol mips_elf_acom_symbol;
5052 static asymbol *mips_elf_acom_symbol_ptr;
5054 /* Handle the special MIPS section numbers that a symbol may use.
5055 This is used for both the 32-bit and the 64-bit ABI. */
5057 void
5058 _bfd_mips_elf_symbol_processing (bfd *abfd, asymbol *asym)
5060 elf_symbol_type *elfsym;
5062 elfsym = (elf_symbol_type *) asym;
5063 switch (elfsym->internal_elf_sym.st_shndx)
5065 case SHN_MIPS_ACOMMON:
5066 /* This section is used in a dynamically linked executable file.
5067 It is an allocated common section. The dynamic linker can
5068 either resolve these symbols to something in a shared
5069 library, or it can just leave them here. For our purposes,
5070 we can consider these symbols to be in a new section. */
5071 if (mips_elf_acom_section.name == NULL)
5073 /* Initialize the acommon section. */
5074 mips_elf_acom_section.name = ".acommon";
5075 mips_elf_acom_section.flags = SEC_ALLOC;
5076 mips_elf_acom_section.output_section = &mips_elf_acom_section;
5077 mips_elf_acom_section.symbol = &mips_elf_acom_symbol;
5078 mips_elf_acom_section.symbol_ptr_ptr = &mips_elf_acom_symbol_ptr;
5079 mips_elf_acom_symbol.name = ".acommon";
5080 mips_elf_acom_symbol.flags = BSF_SECTION_SYM;
5081 mips_elf_acom_symbol.section = &mips_elf_acom_section;
5082 mips_elf_acom_symbol_ptr = &mips_elf_acom_symbol;
5084 asym->section = &mips_elf_acom_section;
5085 break;
5087 case SHN_COMMON:
5088 /* Common symbols less than the GP size are automatically
5089 treated as SHN_MIPS_SCOMMON symbols on IRIX5. */
5090 if (asym->value > elf_gp_size (abfd)
5091 || IRIX_COMPAT (abfd) == ict_irix6)
5092 break;
5093 /* Fall through. */
5094 case SHN_MIPS_SCOMMON:
5095 if (mips_elf_scom_section.name == NULL)
5097 /* Initialize the small common section. */
5098 mips_elf_scom_section.name = ".scommon";
5099 mips_elf_scom_section.flags = SEC_IS_COMMON;
5100 mips_elf_scom_section.output_section = &mips_elf_scom_section;
5101 mips_elf_scom_section.symbol = &mips_elf_scom_symbol;
5102 mips_elf_scom_section.symbol_ptr_ptr = &mips_elf_scom_symbol_ptr;
5103 mips_elf_scom_symbol.name = ".scommon";
5104 mips_elf_scom_symbol.flags = BSF_SECTION_SYM;
5105 mips_elf_scom_symbol.section = &mips_elf_scom_section;
5106 mips_elf_scom_symbol_ptr = &mips_elf_scom_symbol;
5108 asym->section = &mips_elf_scom_section;
5109 asym->value = elfsym->internal_elf_sym.st_size;
5110 break;
5112 case SHN_MIPS_SUNDEFINED:
5113 asym->section = bfd_und_section_ptr;
5114 break;
5116 case SHN_MIPS_TEXT:
5118 asection *section = bfd_get_section_by_name (abfd, ".text");
5120 BFD_ASSERT (SGI_COMPAT (abfd));
5121 if (section != NULL)
5123 asym->section = section;
5124 /* MIPS_TEXT is a bit special, the address is not an offset
5125 to the base of the .text section. So substract the section
5126 base address to make it an offset. */
5127 asym->value -= section->vma;
5130 break;
5132 case SHN_MIPS_DATA:
5134 asection *section = bfd_get_section_by_name (abfd, ".data");
5136 BFD_ASSERT (SGI_COMPAT (abfd));
5137 if (section != NULL)
5139 asym->section = section;
5140 /* MIPS_DATA is a bit special, the address is not an offset
5141 to the base of the .data section. So substract the section
5142 base address to make it an offset. */
5143 asym->value -= section->vma;
5146 break;
5150 /* Implement elf_backend_eh_frame_address_size. This differs from
5151 the default in the way it handles EABI64.
5153 EABI64 was originally specified as an LP64 ABI, and that is what
5154 -mabi=eabi normally gives on a 64-bit target. However, gcc has
5155 historically accepted the combination of -mabi=eabi and -mlong32,
5156 and this ILP32 variation has become semi-official over time.
5157 Both forms use elf32 and have pointer-sized FDE addresses.
5159 If an EABI object was generated by GCC 4.0 or above, it will have
5160 an empty .gcc_compiled_longXX section, where XX is the size of longs
5161 in bits. Unfortunately, ILP32 objects generated by earlier compilers
5162 have no special marking to distinguish them from LP64 objects.
5164 We don't want users of the official LP64 ABI to be punished for the
5165 existence of the ILP32 variant, but at the same time, we don't want
5166 to mistakenly interpret pre-4.0 ILP32 objects as being LP64 objects.
5167 We therefore take the following approach:
5169 - If ABFD contains a .gcc_compiled_longXX section, use it to
5170 determine the pointer size.
5172 - Otherwise check the type of the first relocation. Assume that
5173 the LP64 ABI is being used if the relocation is of type R_MIPS_64.
5175 - Otherwise punt.
5177 The second check is enough to detect LP64 objects generated by pre-4.0
5178 compilers because, in the kind of output generated by those compilers,
5179 the first relocation will be associated with either a CIE personality
5180 routine or an FDE start address. Furthermore, the compilers never
5181 used a special (non-pointer) encoding for this ABI.
5183 Checking the relocation type should also be safe because there is no
5184 reason to use R_MIPS_64 in an ILP32 object. Pre-4.0 compilers never
5185 did so. */
5187 unsigned int
5188 _bfd_mips_elf_eh_frame_address_size (bfd *abfd, asection *sec)
5190 if (elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64)
5191 return 8;
5192 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64)
5194 bfd_boolean long32_p, long64_p;
5196 long32_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long32") != 0;
5197 long64_p = bfd_get_section_by_name (abfd, ".gcc_compiled_long64") != 0;
5198 if (long32_p && long64_p)
5199 return 0;
5200 if (long32_p)
5201 return 4;
5202 if (long64_p)
5203 return 8;
5205 if (sec->reloc_count > 0
5206 && elf_section_data (sec)->relocs != NULL
5207 && (ELF32_R_TYPE (elf_section_data (sec)->relocs[0].r_info)
5208 == R_MIPS_64))
5209 return 8;
5211 return 0;
5213 return 4;
5216 /* There appears to be a bug in the MIPSpro linker that causes GOT_DISP
5217 relocations against two unnamed section symbols to resolve to the
5218 same address. For example, if we have code like:
5220 lw $4,%got_disp(.data)($gp)
5221 lw $25,%got_disp(.text)($gp)
5222 jalr $25
5224 then the linker will resolve both relocations to .data and the program
5225 will jump there rather than to .text.
5227 We can work around this problem by giving names to local section symbols.
5228 This is also what the MIPSpro tools do. */
5230 bfd_boolean
5231 _bfd_mips_elf_name_local_section_symbols (bfd *abfd)
5233 return SGI_COMPAT (abfd);
5236 /* Work over a section just before writing it out. This routine is
5237 used by both the 32-bit and the 64-bit ABI. FIXME: We recognize
5238 sections that need the SHF_MIPS_GPREL flag by name; there has to be
5239 a better way. */
5241 bfd_boolean
5242 _bfd_mips_elf_section_processing (bfd *abfd, Elf_Internal_Shdr *hdr)
5244 if (hdr->sh_type == SHT_MIPS_REGINFO
5245 && hdr->sh_size > 0)
5247 bfd_byte buf[4];
5249 BFD_ASSERT (hdr->sh_size == sizeof (Elf32_External_RegInfo));
5250 BFD_ASSERT (hdr->contents == NULL);
5252 if (bfd_seek (abfd,
5253 hdr->sh_offset + sizeof (Elf32_External_RegInfo) - 4,
5254 SEEK_SET) != 0)
5255 return FALSE;
5256 H_PUT_32 (abfd, elf_gp (abfd), buf);
5257 if (bfd_bwrite (buf, 4, abfd) != 4)
5258 return FALSE;
5261 if (hdr->sh_type == SHT_MIPS_OPTIONS
5262 && hdr->bfd_section != NULL
5263 && mips_elf_section_data (hdr->bfd_section) != NULL
5264 && mips_elf_section_data (hdr->bfd_section)->u.tdata != NULL)
5266 bfd_byte *contents, *l, *lend;
5268 /* We stored the section contents in the tdata field in the
5269 set_section_contents routine. We save the section contents
5270 so that we don't have to read them again.
5271 At this point we know that elf_gp is set, so we can look
5272 through the section contents to see if there is an
5273 ODK_REGINFO structure. */
5275 contents = mips_elf_section_data (hdr->bfd_section)->u.tdata;
5276 l = contents;
5277 lend = contents + hdr->sh_size;
5278 while (l + sizeof (Elf_External_Options) <= lend)
5280 Elf_Internal_Options intopt;
5282 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
5283 &intopt);
5284 if (intopt.size < sizeof (Elf_External_Options))
5286 (*_bfd_error_handler)
5287 (_("%B: Warning: bad `%s' option size %u smaller than its header"),
5288 abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd), intopt.size);
5289 break;
5291 if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
5293 bfd_byte buf[8];
5295 if (bfd_seek (abfd,
5296 (hdr->sh_offset
5297 + (l - contents)
5298 + sizeof (Elf_External_Options)
5299 + (sizeof (Elf64_External_RegInfo) - 8)),
5300 SEEK_SET) != 0)
5301 return FALSE;
5302 H_PUT_64 (abfd, elf_gp (abfd), buf);
5303 if (bfd_bwrite (buf, 8, abfd) != 8)
5304 return FALSE;
5306 else if (intopt.kind == ODK_REGINFO)
5308 bfd_byte buf[4];
5310 if (bfd_seek (abfd,
5311 (hdr->sh_offset
5312 + (l - contents)
5313 + sizeof (Elf_External_Options)
5314 + (sizeof (Elf32_External_RegInfo) - 4)),
5315 SEEK_SET) != 0)
5316 return FALSE;
5317 H_PUT_32 (abfd, elf_gp (abfd), buf);
5318 if (bfd_bwrite (buf, 4, abfd) != 4)
5319 return FALSE;
5321 l += intopt.size;
5325 if (hdr->bfd_section != NULL)
5327 const char *name = bfd_get_section_name (abfd, hdr->bfd_section);
5329 if (strcmp (name, ".sdata") == 0
5330 || strcmp (name, ".lit8") == 0
5331 || strcmp (name, ".lit4") == 0)
5333 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
5334 hdr->sh_type = SHT_PROGBITS;
5336 else if (strcmp (name, ".sbss") == 0)
5338 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
5339 hdr->sh_type = SHT_NOBITS;
5341 else if (strcmp (name, ".srdata") == 0)
5343 hdr->sh_flags |= SHF_ALLOC | SHF_MIPS_GPREL;
5344 hdr->sh_type = SHT_PROGBITS;
5346 else if (strcmp (name, ".compact_rel") == 0)
5348 hdr->sh_flags = 0;
5349 hdr->sh_type = SHT_PROGBITS;
5351 else if (strcmp (name, ".rtproc") == 0)
5353 if (hdr->sh_addralign != 0 && hdr->sh_entsize == 0)
5355 unsigned int adjust;
5357 adjust = hdr->sh_size % hdr->sh_addralign;
5358 if (adjust != 0)
5359 hdr->sh_size += hdr->sh_addralign - adjust;
5364 return TRUE;
5367 /* Handle a MIPS specific section when reading an object file. This
5368 is called when elfcode.h finds a section with an unknown type.
5369 This routine supports both the 32-bit and 64-bit ELF ABI.
5371 FIXME: We need to handle the SHF_MIPS_GPREL flag, but I'm not sure
5372 how to. */
5374 bfd_boolean
5375 _bfd_mips_elf_section_from_shdr (bfd *abfd,
5376 Elf_Internal_Shdr *hdr,
5377 const char *name,
5378 int shindex)
5380 flagword flags = 0;
5382 /* There ought to be a place to keep ELF backend specific flags, but
5383 at the moment there isn't one. We just keep track of the
5384 sections by their name, instead. Fortunately, the ABI gives
5385 suggested names for all the MIPS specific sections, so we will
5386 probably get away with this. */
5387 switch (hdr->sh_type)
5389 case SHT_MIPS_LIBLIST:
5390 if (strcmp (name, ".liblist") != 0)
5391 return FALSE;
5392 break;
5393 case SHT_MIPS_MSYM:
5394 if (strcmp (name, ".msym") != 0)
5395 return FALSE;
5396 break;
5397 case SHT_MIPS_CONFLICT:
5398 if (strcmp (name, ".conflict") != 0)
5399 return FALSE;
5400 break;
5401 case SHT_MIPS_GPTAB:
5402 if (strncmp (name, ".gptab.", sizeof ".gptab." - 1) != 0)
5403 return FALSE;
5404 break;
5405 case SHT_MIPS_UCODE:
5406 if (strcmp (name, ".ucode") != 0)
5407 return FALSE;
5408 break;
5409 case SHT_MIPS_DEBUG:
5410 if (strcmp (name, ".mdebug") != 0)
5411 return FALSE;
5412 flags = SEC_DEBUGGING;
5413 break;
5414 case SHT_MIPS_REGINFO:
5415 if (strcmp (name, ".reginfo") != 0
5416 || hdr->sh_size != sizeof (Elf32_External_RegInfo))
5417 return FALSE;
5418 flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
5419 break;
5420 case SHT_MIPS_IFACE:
5421 if (strcmp (name, ".MIPS.interfaces") != 0)
5422 return FALSE;
5423 break;
5424 case SHT_MIPS_CONTENT:
5425 if (strncmp (name, ".MIPS.content", sizeof ".MIPS.content" - 1) != 0)
5426 return FALSE;
5427 break;
5428 case SHT_MIPS_OPTIONS:
5429 if (!MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
5430 return FALSE;
5431 break;
5432 case SHT_MIPS_DWARF:
5433 if (strncmp (name, ".debug_", sizeof ".debug_" - 1) != 0)
5434 return FALSE;
5435 break;
5436 case SHT_MIPS_SYMBOL_LIB:
5437 if (strcmp (name, ".MIPS.symlib") != 0)
5438 return FALSE;
5439 break;
5440 case SHT_MIPS_EVENTS:
5441 if (strncmp (name, ".MIPS.events", sizeof ".MIPS.events" - 1) != 0
5442 && strncmp (name, ".MIPS.post_rel",
5443 sizeof ".MIPS.post_rel" - 1) != 0)
5444 return FALSE;
5445 break;
5446 default:
5447 break;
5450 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
5451 return FALSE;
5453 if (flags)
5455 if (! bfd_set_section_flags (abfd, hdr->bfd_section,
5456 (bfd_get_section_flags (abfd,
5457 hdr->bfd_section)
5458 | flags)))
5459 return FALSE;
5462 /* FIXME: We should record sh_info for a .gptab section. */
5464 /* For a .reginfo section, set the gp value in the tdata information
5465 from the contents of this section. We need the gp value while
5466 processing relocs, so we just get it now. The .reginfo section
5467 is not used in the 64-bit MIPS ELF ABI. */
5468 if (hdr->sh_type == SHT_MIPS_REGINFO)
5470 Elf32_External_RegInfo ext;
5471 Elf32_RegInfo s;
5473 if (! bfd_get_section_contents (abfd, hdr->bfd_section,
5474 &ext, 0, sizeof ext))
5475 return FALSE;
5476 bfd_mips_elf32_swap_reginfo_in (abfd, &ext, &s);
5477 elf_gp (abfd) = s.ri_gp_value;
5480 /* For a SHT_MIPS_OPTIONS section, look for a ODK_REGINFO entry, and
5481 set the gp value based on what we find. We may see both
5482 SHT_MIPS_REGINFO and SHT_MIPS_OPTIONS/ODK_REGINFO; in that case,
5483 they should agree. */
5484 if (hdr->sh_type == SHT_MIPS_OPTIONS)
5486 bfd_byte *contents, *l, *lend;
5488 contents = bfd_malloc (hdr->sh_size);
5489 if (contents == NULL)
5490 return FALSE;
5491 if (! bfd_get_section_contents (abfd, hdr->bfd_section, contents,
5492 0, hdr->sh_size))
5494 free (contents);
5495 return FALSE;
5497 l = contents;
5498 lend = contents + hdr->sh_size;
5499 while (l + sizeof (Elf_External_Options) <= lend)
5501 Elf_Internal_Options intopt;
5503 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
5504 &intopt);
5505 if (intopt.size < sizeof (Elf_External_Options))
5507 (*_bfd_error_handler)
5508 (_("%B: Warning: bad `%s' option size %u smaller than its header"),
5509 abfd, MIPS_ELF_OPTIONS_SECTION_NAME (abfd), intopt.size);
5510 break;
5512 if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
5514 Elf64_Internal_RegInfo intreg;
5516 bfd_mips_elf64_swap_reginfo_in
5517 (abfd,
5518 ((Elf64_External_RegInfo *)
5519 (l + sizeof (Elf_External_Options))),
5520 &intreg);
5521 elf_gp (abfd) = intreg.ri_gp_value;
5523 else if (intopt.kind == ODK_REGINFO)
5525 Elf32_RegInfo intreg;
5527 bfd_mips_elf32_swap_reginfo_in
5528 (abfd,
5529 ((Elf32_External_RegInfo *)
5530 (l + sizeof (Elf_External_Options))),
5531 &intreg);
5532 elf_gp (abfd) = intreg.ri_gp_value;
5534 l += intopt.size;
5536 free (contents);
5539 return TRUE;
5542 /* Set the correct type for a MIPS ELF section. We do this by the
5543 section name, which is a hack, but ought to work. This routine is
5544 used by both the 32-bit and the 64-bit ABI. */
5546 bfd_boolean
5547 _bfd_mips_elf_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
5549 register const char *name;
5550 unsigned int sh_type;
5552 name = bfd_get_section_name (abfd, sec);
5553 sh_type = hdr->sh_type;
5555 if (strcmp (name, ".liblist") == 0)
5557 hdr->sh_type = SHT_MIPS_LIBLIST;
5558 hdr->sh_info = sec->size / sizeof (Elf32_Lib);
5559 /* The sh_link field is set in final_write_processing. */
5561 else if (strcmp (name, ".conflict") == 0)
5562 hdr->sh_type = SHT_MIPS_CONFLICT;
5563 else if (strncmp (name, ".gptab.", sizeof ".gptab." - 1) == 0)
5565 hdr->sh_type = SHT_MIPS_GPTAB;
5566 hdr->sh_entsize = sizeof (Elf32_External_gptab);
5567 /* The sh_info field is set in final_write_processing. */
5569 else if (strcmp (name, ".ucode") == 0)
5570 hdr->sh_type = SHT_MIPS_UCODE;
5571 else if (strcmp (name, ".mdebug") == 0)
5573 hdr->sh_type = SHT_MIPS_DEBUG;
5574 /* In a shared object on IRIX 5.3, the .mdebug section has an
5575 entsize of 0. FIXME: Does this matter? */
5576 if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0)
5577 hdr->sh_entsize = 0;
5578 else
5579 hdr->sh_entsize = 1;
5581 else if (strcmp (name, ".reginfo") == 0)
5583 hdr->sh_type = SHT_MIPS_REGINFO;
5584 /* In a shared object on IRIX 5.3, the .reginfo section has an
5585 entsize of 0x18. FIXME: Does this matter? */
5586 if (SGI_COMPAT (abfd))
5588 if ((abfd->flags & DYNAMIC) != 0)
5589 hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
5590 else
5591 hdr->sh_entsize = 1;
5593 else
5594 hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
5596 else if (SGI_COMPAT (abfd)
5597 && (strcmp (name, ".hash") == 0
5598 || strcmp (name, ".dynamic") == 0
5599 || strcmp (name, ".dynstr") == 0))
5601 if (SGI_COMPAT (abfd))
5602 hdr->sh_entsize = 0;
5603 #if 0
5604 /* This isn't how the IRIX6 linker behaves. */
5605 hdr->sh_info = SIZEOF_MIPS_DYNSYM_SECNAMES;
5606 #endif
5608 else if (strcmp (name, ".got") == 0
5609 || strcmp (name, ".srdata") == 0
5610 || strcmp (name, ".sdata") == 0
5611 || strcmp (name, ".sbss") == 0
5612 || strcmp (name, ".lit4") == 0
5613 || strcmp (name, ".lit8") == 0)
5614 hdr->sh_flags |= SHF_MIPS_GPREL;
5615 else if (strcmp (name, ".MIPS.interfaces") == 0)
5617 hdr->sh_type = SHT_MIPS_IFACE;
5618 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
5620 else if (strncmp (name, ".MIPS.content", strlen (".MIPS.content")) == 0)
5622 hdr->sh_type = SHT_MIPS_CONTENT;
5623 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
5624 /* The sh_info field is set in final_write_processing. */
5626 else if (MIPS_ELF_OPTIONS_SECTION_NAME_P (name))
5628 hdr->sh_type = SHT_MIPS_OPTIONS;
5629 hdr->sh_entsize = 1;
5630 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
5632 else if (strncmp (name, ".debug_", sizeof ".debug_" - 1) == 0)
5633 hdr->sh_type = SHT_MIPS_DWARF;
5634 else if (strcmp (name, ".MIPS.symlib") == 0)
5636 hdr->sh_type = SHT_MIPS_SYMBOL_LIB;
5637 /* The sh_link and sh_info fields are set in
5638 final_write_processing. */
5640 else if (strncmp (name, ".MIPS.events", sizeof ".MIPS.events" - 1) == 0
5641 || strncmp (name, ".MIPS.post_rel",
5642 sizeof ".MIPS.post_rel" - 1) == 0)
5644 hdr->sh_type = SHT_MIPS_EVENTS;
5645 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
5646 /* The sh_link field is set in final_write_processing. */
5648 else if (strcmp (name, ".msym") == 0)
5650 hdr->sh_type = SHT_MIPS_MSYM;
5651 hdr->sh_flags |= SHF_ALLOC;
5652 hdr->sh_entsize = 8;
5655 /* In the unlikely event a special section is empty it has to lose its
5656 special meaning. This may happen e.g. when using `strip' with the
5657 "--only-keep-debug" option. */
5658 if (sec->size > 0 && !(sec->flags & SEC_HAS_CONTENTS))
5659 hdr->sh_type = sh_type;
5661 /* The generic elf_fake_sections will set up REL_HDR using the default
5662 kind of relocations. We used to set up a second header for the
5663 non-default kind of relocations here, but only NewABI would use
5664 these, and the IRIX ld doesn't like resulting empty RELA sections.
5665 Thus we create those header only on demand now. */
5667 return TRUE;
5670 /* Given a BFD section, try to locate the corresponding ELF section
5671 index. This is used by both the 32-bit and the 64-bit ABI.
5672 Actually, it's not clear to me that the 64-bit ABI supports these,
5673 but for non-PIC objects we will certainly want support for at least
5674 the .scommon section. */
5676 bfd_boolean
5677 _bfd_mips_elf_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
5678 asection *sec, int *retval)
5680 if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
5682 *retval = SHN_MIPS_SCOMMON;
5683 return TRUE;
5685 if (strcmp (bfd_get_section_name (abfd, sec), ".acommon") == 0)
5687 *retval = SHN_MIPS_ACOMMON;
5688 return TRUE;
5690 return FALSE;
5693 /* Hook called by the linker routine which adds symbols from an object
5694 file. We must handle the special MIPS section numbers here. */
5696 bfd_boolean
5697 _bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
5698 Elf_Internal_Sym *sym, const char **namep,
5699 flagword *flagsp ATTRIBUTE_UNUSED,
5700 asection **secp, bfd_vma *valp)
5702 if (SGI_COMPAT (abfd)
5703 && (abfd->flags & DYNAMIC) != 0
5704 && strcmp (*namep, "_rld_new_interface") == 0)
5706 /* Skip IRIX5 rld entry name. */
5707 *namep = NULL;
5708 return TRUE;
5711 /* Shared objects may have a dynamic symbol '_gp_disp' defined as
5712 a SECTION *ABS*. This causes ld to think it can resolve _gp_disp
5713 by setting a DT_NEEDED for the shared object. Since _gp_disp is
5714 a magic symbol resolved by the linker, we ignore this bogus definition
5715 of _gp_disp. New ABI objects do not suffer from this problem so this
5716 is not done for them. */
5717 if (!NEWABI_P(abfd)
5718 && (sym->st_shndx == SHN_ABS)
5719 && (strcmp (*namep, "_gp_disp") == 0))
5721 *namep = NULL;
5722 return TRUE;
5725 switch (sym->st_shndx)
5727 case SHN_COMMON:
5728 /* Common symbols less than the GP size are automatically
5729 treated as SHN_MIPS_SCOMMON symbols. */
5730 if (sym->st_size > elf_gp_size (abfd)
5731 || IRIX_COMPAT (abfd) == ict_irix6)
5732 break;
5733 /* Fall through. */
5734 case SHN_MIPS_SCOMMON:
5735 *secp = bfd_make_section_old_way (abfd, ".scommon");
5736 (*secp)->flags |= SEC_IS_COMMON;
5737 *valp = sym->st_size;
5738 break;
5740 case SHN_MIPS_TEXT:
5741 /* This section is used in a shared object. */
5742 if (elf_tdata (abfd)->elf_text_section == NULL)
5744 asymbol *elf_text_symbol;
5745 asection *elf_text_section;
5746 bfd_size_type amt = sizeof (asection);
5748 elf_text_section = bfd_zalloc (abfd, amt);
5749 if (elf_text_section == NULL)
5750 return FALSE;
5752 amt = sizeof (asymbol);
5753 elf_text_symbol = bfd_zalloc (abfd, amt);
5754 if (elf_text_symbol == NULL)
5755 return FALSE;
5757 /* Initialize the section. */
5759 elf_tdata (abfd)->elf_text_section = elf_text_section;
5760 elf_tdata (abfd)->elf_text_symbol = elf_text_symbol;
5762 elf_text_section->symbol = elf_text_symbol;
5763 elf_text_section->symbol_ptr_ptr = &elf_tdata (abfd)->elf_text_symbol;
5765 elf_text_section->name = ".text";
5766 elf_text_section->flags = SEC_NO_FLAGS;
5767 elf_text_section->output_section = NULL;
5768 elf_text_section->owner = abfd;
5769 elf_text_symbol->name = ".text";
5770 elf_text_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
5771 elf_text_symbol->section = elf_text_section;
5773 /* This code used to do *secp = bfd_und_section_ptr if
5774 info->shared. I don't know why, and that doesn't make sense,
5775 so I took it out. */
5776 *secp = elf_tdata (abfd)->elf_text_section;
5777 break;
5779 case SHN_MIPS_ACOMMON:
5780 /* Fall through. XXX Can we treat this as allocated data? */
5781 case SHN_MIPS_DATA:
5782 /* This section is used in a shared object. */
5783 if (elf_tdata (abfd)->elf_data_section == NULL)
5785 asymbol *elf_data_symbol;
5786 asection *elf_data_section;
5787 bfd_size_type amt = sizeof (asection);
5789 elf_data_section = bfd_zalloc (abfd, amt);
5790 if (elf_data_section == NULL)
5791 return FALSE;
5793 amt = sizeof (asymbol);
5794 elf_data_symbol = bfd_zalloc (abfd, amt);
5795 if (elf_data_symbol == NULL)
5796 return FALSE;
5798 /* Initialize the section. */
5800 elf_tdata (abfd)->elf_data_section = elf_data_section;
5801 elf_tdata (abfd)->elf_data_symbol = elf_data_symbol;
5803 elf_data_section->symbol = elf_data_symbol;
5804 elf_data_section->symbol_ptr_ptr = &elf_tdata (abfd)->elf_data_symbol;
5806 elf_data_section->name = ".data";
5807 elf_data_section->flags = SEC_NO_FLAGS;
5808 elf_data_section->output_section = NULL;
5809 elf_data_section->owner = abfd;
5810 elf_data_symbol->name = ".data";
5811 elf_data_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
5812 elf_data_symbol->section = elf_data_section;
5814 /* This code used to do *secp = bfd_und_section_ptr if
5815 info->shared. I don't know why, and that doesn't make sense,
5816 so I took it out. */
5817 *secp = elf_tdata (abfd)->elf_data_section;
5818 break;
5820 case SHN_MIPS_SUNDEFINED:
5821 *secp = bfd_und_section_ptr;
5822 break;
5825 if (SGI_COMPAT (abfd)
5826 && ! info->shared
5827 && info->hash->creator == abfd->xvec
5828 && strcmp (*namep, "__rld_obj_head") == 0)
5830 struct elf_link_hash_entry *h;
5831 struct bfd_link_hash_entry *bh;
5833 /* Mark __rld_obj_head as dynamic. */
5834 bh = NULL;
5835 if (! (_bfd_generic_link_add_one_symbol
5836 (info, abfd, *namep, BSF_GLOBAL, *secp, *valp, NULL, FALSE,
5837 get_elf_backend_data (abfd)->collect, &bh)))
5838 return FALSE;
5840 h = (struct elf_link_hash_entry *) bh;
5841 h->non_elf = 0;
5842 h->def_regular = 1;
5843 h->type = STT_OBJECT;
5845 if (! bfd_elf_link_record_dynamic_symbol (info, h))
5846 return FALSE;
5848 mips_elf_hash_table (info)->use_rld_obj_head = TRUE;
5851 /* If this is a mips16 text symbol, add 1 to the value to make it
5852 odd. This will cause something like .word SYM to come up with
5853 the right value when it is loaded into the PC. */
5854 if (sym->st_other == STO_MIPS16)
5855 ++*valp;
5857 return TRUE;
5860 /* This hook function is called before the linker writes out a global
5861 symbol. We mark symbols as small common if appropriate. This is
5862 also where we undo the increment of the value for a mips16 symbol. */
5864 bfd_boolean
5865 _bfd_mips_elf_link_output_symbol_hook
5866 (struct bfd_link_info *info ATTRIBUTE_UNUSED,
5867 const char *name ATTRIBUTE_UNUSED, Elf_Internal_Sym *sym,
5868 asection *input_sec, struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
5870 /* If we see a common symbol, which implies a relocatable link, then
5871 if a symbol was small common in an input file, mark it as small
5872 common in the output file. */
5873 if (sym->st_shndx == SHN_COMMON
5874 && strcmp (input_sec->name, ".scommon") == 0)
5875 sym->st_shndx = SHN_MIPS_SCOMMON;
5877 if (sym->st_other == STO_MIPS16)
5878 sym->st_value &= ~1;
5880 return TRUE;
5883 /* Functions for the dynamic linker. */
5885 /* Create dynamic sections when linking against a dynamic object. */
5887 bfd_boolean
5888 _bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
5890 struct elf_link_hash_entry *h;
5891 struct bfd_link_hash_entry *bh;
5892 flagword flags;
5893 register asection *s;
5894 const char * const *namep;
5895 struct mips_elf_link_hash_table *htab;
5897 htab = mips_elf_hash_table (info);
5898 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
5899 | SEC_LINKER_CREATED | SEC_READONLY);
5901 /* The psABI requires a read-only .dynamic section, but the VxWorks
5902 EABI doesn't. */
5903 if (!htab->is_vxworks)
5905 s = bfd_get_section_by_name (abfd, ".dynamic");
5906 if (s != NULL)
5908 if (! bfd_set_section_flags (abfd, s, flags))
5909 return FALSE;
5913 /* We need to create .got section. */
5914 if (! mips_elf_create_got_section (abfd, info, FALSE))
5915 return FALSE;
5917 if (! mips_elf_rel_dyn_section (info, TRUE))
5918 return FALSE;
5920 /* Create .stub section. */
5921 if (bfd_get_section_by_name (abfd,
5922 MIPS_ELF_STUB_SECTION_NAME (abfd)) == NULL)
5924 s = bfd_make_section_with_flags (abfd,
5925 MIPS_ELF_STUB_SECTION_NAME (abfd),
5926 flags | SEC_CODE);
5927 if (s == NULL
5928 || ! bfd_set_section_alignment (abfd, s,
5929 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
5930 return FALSE;
5933 if ((IRIX_COMPAT (abfd) == ict_irix5 || IRIX_COMPAT (abfd) == ict_none)
5934 && !info->shared
5935 && bfd_get_section_by_name (abfd, ".rld_map") == NULL)
5937 s = bfd_make_section_with_flags (abfd, ".rld_map",
5938 flags &~ (flagword) SEC_READONLY);
5939 if (s == NULL
5940 || ! bfd_set_section_alignment (abfd, s,
5941 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
5942 return FALSE;
5945 /* On IRIX5, we adjust add some additional symbols and change the
5946 alignments of several sections. There is no ABI documentation
5947 indicating that this is necessary on IRIX6, nor any evidence that
5948 the linker takes such action. */
5949 if (IRIX_COMPAT (abfd) == ict_irix5)
5951 for (namep = mips_elf_dynsym_rtproc_names; *namep != NULL; namep++)
5953 bh = NULL;
5954 if (! (_bfd_generic_link_add_one_symbol
5955 (info, abfd, *namep, BSF_GLOBAL, bfd_und_section_ptr, 0,
5956 NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
5957 return FALSE;
5959 h = (struct elf_link_hash_entry *) bh;
5960 h->non_elf = 0;
5961 h->def_regular = 1;
5962 h->type = STT_SECTION;
5964 if (! bfd_elf_link_record_dynamic_symbol (info, h))
5965 return FALSE;
5968 /* We need to create a .compact_rel section. */
5969 if (SGI_COMPAT (abfd))
5971 if (!mips_elf_create_compact_rel_section (abfd, info))
5972 return FALSE;
5975 /* Change alignments of some sections. */
5976 s = bfd_get_section_by_name (abfd, ".hash");
5977 if (s != NULL)
5978 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
5979 s = bfd_get_section_by_name (abfd, ".dynsym");
5980 if (s != NULL)
5981 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
5982 s = bfd_get_section_by_name (abfd, ".dynstr");
5983 if (s != NULL)
5984 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
5985 s = bfd_get_section_by_name (abfd, ".reginfo");
5986 if (s != NULL)
5987 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
5988 s = bfd_get_section_by_name (abfd, ".dynamic");
5989 if (s != NULL)
5990 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
5993 if (!info->shared)
5995 const char *name;
5997 name = SGI_COMPAT (abfd) ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING";
5998 bh = NULL;
5999 if (!(_bfd_generic_link_add_one_symbol
6000 (info, abfd, name, BSF_GLOBAL, bfd_abs_section_ptr, 0,
6001 NULL, FALSE, get_elf_backend_data (abfd)->collect, &bh)))
6002 return FALSE;
6004 h = (struct elf_link_hash_entry *) bh;
6005 h->non_elf = 0;
6006 h->def_regular = 1;
6007 h->type = STT_SECTION;
6009 if (! bfd_elf_link_record_dynamic_symbol (info, h))
6010 return FALSE;
6012 if (! mips_elf_hash_table (info)->use_rld_obj_head)
6014 /* __rld_map is a four byte word located in the .data section
6015 and is filled in by the rtld to contain a pointer to
6016 the _r_debug structure. Its symbol value will be set in
6017 _bfd_mips_elf_finish_dynamic_symbol. */
6018 s = bfd_get_section_by_name (abfd, ".rld_map");
6019 BFD_ASSERT (s != NULL);
6021 name = SGI_COMPAT (abfd) ? "__rld_map" : "__RLD_MAP";
6022 bh = NULL;
6023 if (!(_bfd_generic_link_add_one_symbol
6024 (info, abfd, name, BSF_GLOBAL, s, 0, NULL, FALSE,
6025 get_elf_backend_data (abfd)->collect, &bh)))
6026 return FALSE;
6028 h = (struct elf_link_hash_entry *) bh;
6029 h->non_elf = 0;
6030 h->def_regular = 1;
6031 h->type = STT_OBJECT;
6033 if (! bfd_elf_link_record_dynamic_symbol (info, h))
6034 return FALSE;
6038 if (htab->is_vxworks)
6040 /* Create the .plt, .rela.plt, .dynbss and .rela.bss sections.
6041 Also create the _PROCEDURE_LINKAGE_TABLE symbol. */
6042 if (!_bfd_elf_create_dynamic_sections (abfd, info))
6043 return FALSE;
6045 /* Cache the sections created above. */
6046 htab->sdynbss = bfd_get_section_by_name (abfd, ".dynbss");
6047 htab->srelbss = bfd_get_section_by_name (abfd, ".rela.bss");
6048 htab->srelplt = bfd_get_section_by_name (abfd, ".rela.plt");
6049 htab->splt = bfd_get_section_by_name (abfd, ".plt");
6050 if (!htab->sdynbss
6051 || (!htab->srelbss && !info->shared)
6052 || !htab->srelplt
6053 || !htab->splt)
6054 abort ();
6056 /* Do the usual VxWorks handling. */
6057 if (!elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
6058 return FALSE;
6060 /* Work out the PLT sizes. */
6061 if (info->shared)
6063 htab->plt_header_size
6064 = 4 * ARRAY_SIZE (mips_vxworks_shared_plt0_entry);
6065 htab->plt_entry_size
6066 = 4 * ARRAY_SIZE (mips_vxworks_shared_plt_entry);
6068 else
6070 htab->plt_header_size
6071 = 4 * ARRAY_SIZE (mips_vxworks_exec_plt0_entry);
6072 htab->plt_entry_size
6073 = 4 * ARRAY_SIZE (mips_vxworks_exec_plt_entry);
6077 return TRUE;
6080 /* Look through the relocs for a section during the first phase, and
6081 allocate space in the global offset table. */
6083 bfd_boolean
6084 _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
6085 asection *sec, const Elf_Internal_Rela *relocs)
6087 const char *name;
6088 bfd *dynobj;
6089 Elf_Internal_Shdr *symtab_hdr;
6090 struct elf_link_hash_entry **sym_hashes;
6091 struct mips_got_info *g;
6092 size_t extsymoff;
6093 const Elf_Internal_Rela *rel;
6094 const Elf_Internal_Rela *rel_end;
6095 asection *sgot;
6096 asection *sreloc;
6097 const struct elf_backend_data *bed;
6098 struct mips_elf_link_hash_table *htab;
6100 if (info->relocatable)
6101 return TRUE;
6103 htab = mips_elf_hash_table (info);
6104 dynobj = elf_hash_table (info)->dynobj;
6105 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6106 sym_hashes = elf_sym_hashes (abfd);
6107 extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
6109 /* Check for the mips16 stub sections. */
6111 name = bfd_get_section_name (abfd, sec);
6112 if (strncmp (name, FN_STUB, sizeof FN_STUB - 1) == 0)
6114 unsigned long r_symndx;
6116 /* Look at the relocation information to figure out which symbol
6117 this is for. */
6119 r_symndx = ELF_R_SYM (abfd, relocs->r_info);
6121 if (r_symndx < extsymoff
6122 || sym_hashes[r_symndx - extsymoff] == NULL)
6124 asection *o;
6126 /* This stub is for a local symbol. This stub will only be
6127 needed if there is some relocation in this BFD, other
6128 than a 16 bit function call, which refers to this symbol. */
6129 for (o = abfd->sections; o != NULL; o = o->next)
6131 Elf_Internal_Rela *sec_relocs;
6132 const Elf_Internal_Rela *r, *rend;
6134 /* We can ignore stub sections when looking for relocs. */
6135 if ((o->flags & SEC_RELOC) == 0
6136 || o->reloc_count == 0
6137 || strncmp (bfd_get_section_name (abfd, o), FN_STUB,
6138 sizeof FN_STUB - 1) == 0
6139 || strncmp (bfd_get_section_name (abfd, o), CALL_STUB,
6140 sizeof CALL_STUB - 1) == 0
6141 || strncmp (bfd_get_section_name (abfd, o), CALL_FP_STUB,
6142 sizeof CALL_FP_STUB - 1) == 0)
6143 continue;
6145 sec_relocs
6146 = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
6147 info->keep_memory);
6148 if (sec_relocs == NULL)
6149 return FALSE;
6151 rend = sec_relocs + o->reloc_count;
6152 for (r = sec_relocs; r < rend; r++)
6153 if (ELF_R_SYM (abfd, r->r_info) == r_symndx
6154 && ELF_R_TYPE (abfd, r->r_info) != R_MIPS16_26)
6155 break;
6157 if (elf_section_data (o)->relocs != sec_relocs)
6158 free (sec_relocs);
6160 if (r < rend)
6161 break;
6164 if (o == NULL)
6166 /* There is no non-call reloc for this stub, so we do
6167 not need it. Since this function is called before
6168 the linker maps input sections to output sections, we
6169 can easily discard it by setting the SEC_EXCLUDE
6170 flag. */
6171 sec->flags |= SEC_EXCLUDE;
6172 return TRUE;
6175 /* Record this stub in an array of local symbol stubs for
6176 this BFD. */
6177 if (elf_tdata (abfd)->local_stubs == NULL)
6179 unsigned long symcount;
6180 asection **n;
6181 bfd_size_type amt;
6183 if (elf_bad_symtab (abfd))
6184 symcount = NUM_SHDR_ENTRIES (symtab_hdr);
6185 else
6186 symcount = symtab_hdr->sh_info;
6187 amt = symcount * sizeof (asection *);
6188 n = bfd_zalloc (abfd, amt);
6189 if (n == NULL)
6190 return FALSE;
6191 elf_tdata (abfd)->local_stubs = n;
6194 elf_tdata (abfd)->local_stubs[r_symndx] = sec;
6196 /* We don't need to set mips16_stubs_seen in this case.
6197 That flag is used to see whether we need to look through
6198 the global symbol table for stubs. We don't need to set
6199 it here, because we just have a local stub. */
6201 else
6203 struct mips_elf_link_hash_entry *h;
6205 h = ((struct mips_elf_link_hash_entry *)
6206 sym_hashes[r_symndx - extsymoff]);
6208 while (h->root.root.type == bfd_link_hash_indirect
6209 || h->root.root.type == bfd_link_hash_warning)
6210 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
6212 /* H is the symbol this stub is for. */
6214 h->fn_stub = sec;
6215 mips_elf_hash_table (info)->mips16_stubs_seen = TRUE;
6218 else if (strncmp (name, CALL_STUB, sizeof CALL_STUB - 1) == 0
6219 || strncmp (name, CALL_FP_STUB, sizeof CALL_FP_STUB - 1) == 0)
6221 unsigned long r_symndx;
6222 struct mips_elf_link_hash_entry *h;
6223 asection **loc;
6225 /* Look at the relocation information to figure out which symbol
6226 this is for. */
6228 r_symndx = ELF_R_SYM (abfd, relocs->r_info);
6230 if (r_symndx < extsymoff
6231 || sym_hashes[r_symndx - extsymoff] == NULL)
6233 /* This stub was actually built for a static symbol defined
6234 in the same file. We assume that all static symbols in
6235 mips16 code are themselves mips16, so we can simply
6236 discard this stub. Since this function is called before
6237 the linker maps input sections to output sections, we can
6238 easily discard it by setting the SEC_EXCLUDE flag. */
6239 sec->flags |= SEC_EXCLUDE;
6240 return TRUE;
6243 h = ((struct mips_elf_link_hash_entry *)
6244 sym_hashes[r_symndx - extsymoff]);
6246 /* H is the symbol this stub is for. */
6248 if (strncmp (name, CALL_FP_STUB, sizeof CALL_FP_STUB - 1) == 0)
6249 loc = &h->call_fp_stub;
6250 else
6251 loc = &h->call_stub;
6253 /* If we already have an appropriate stub for this function, we
6254 don't need another one, so we can discard this one. Since
6255 this function is called before the linker maps input sections
6256 to output sections, we can easily discard it by setting the
6257 SEC_EXCLUDE flag. We can also discard this section if we
6258 happen to already know that this is a mips16 function; it is
6259 not necessary to check this here, as it is checked later, but
6260 it is slightly faster to check now. */
6261 if (*loc != NULL || h->root.other == STO_MIPS16)
6263 sec->flags |= SEC_EXCLUDE;
6264 return TRUE;
6267 *loc = sec;
6268 mips_elf_hash_table (info)->mips16_stubs_seen = TRUE;
6271 if (dynobj == NULL)
6273 sgot = NULL;
6274 g = NULL;
6276 else
6278 sgot = mips_elf_got_section (dynobj, FALSE);
6279 if (sgot == NULL)
6280 g = NULL;
6281 else
6283 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
6284 g = mips_elf_section_data (sgot)->u.got_info;
6285 BFD_ASSERT (g != NULL);
6289 sreloc = NULL;
6290 bed = get_elf_backend_data (abfd);
6291 rel_end = relocs + sec->reloc_count * bed->s->int_rels_per_ext_rel;
6292 for (rel = relocs; rel < rel_end; ++rel)
6294 unsigned long r_symndx;
6295 unsigned int r_type;
6296 struct elf_link_hash_entry *h;
6298 r_symndx = ELF_R_SYM (abfd, rel->r_info);
6299 r_type = ELF_R_TYPE (abfd, rel->r_info);
6301 if (r_symndx < extsymoff)
6302 h = NULL;
6303 else if (r_symndx >= extsymoff + NUM_SHDR_ENTRIES (symtab_hdr))
6305 (*_bfd_error_handler)
6306 (_("%B: Malformed reloc detected for section %s"),
6307 abfd, name);
6308 bfd_set_error (bfd_error_bad_value);
6309 return FALSE;
6311 else
6313 h = sym_hashes[r_symndx - extsymoff];
6315 /* This may be an indirect symbol created because of a version. */
6316 if (h != NULL)
6318 while (h->root.type == bfd_link_hash_indirect)
6319 h = (struct elf_link_hash_entry *) h->root.u.i.link;
6323 /* Some relocs require a global offset table. */
6324 if (dynobj == NULL || sgot == NULL)
6326 switch (r_type)
6328 case R_MIPS_GOT16:
6329 case R_MIPS_CALL16:
6330 case R_MIPS_CALL_HI16:
6331 case R_MIPS_CALL_LO16:
6332 case R_MIPS_GOT_HI16:
6333 case R_MIPS_GOT_LO16:
6334 case R_MIPS_GOT_PAGE:
6335 case R_MIPS_GOT_OFST:
6336 case R_MIPS_GOT_DISP:
6337 case R_MIPS_TLS_GOTTPREL:
6338 case R_MIPS_TLS_GD:
6339 case R_MIPS_TLS_LDM:
6340 if (dynobj == NULL)
6341 elf_hash_table (info)->dynobj = dynobj = abfd;
6342 if (! mips_elf_create_got_section (dynobj, info, FALSE))
6343 return FALSE;
6344 g = mips_elf_got_info (dynobj, &sgot);
6345 if (htab->is_vxworks && !info->shared)
6347 (*_bfd_error_handler)
6348 (_("%B: GOT reloc at 0x%lx not expected in executables"),
6349 abfd, (unsigned long) rel->r_offset);
6350 bfd_set_error (bfd_error_bad_value);
6351 return FALSE;
6353 break;
6355 case R_MIPS_32:
6356 case R_MIPS_REL32:
6357 case R_MIPS_64:
6358 /* In VxWorks executables, references to external symbols
6359 are handled using copy relocs or PLT stubs, so there's
6360 no need to add a dynamic relocation here. */
6361 if (dynobj == NULL
6362 && (info->shared || (h != NULL && !htab->is_vxworks))
6363 && (sec->flags & SEC_ALLOC) != 0)
6364 elf_hash_table (info)->dynobj = dynobj = abfd;
6365 break;
6367 default:
6368 break;
6372 if (h)
6374 ((struct mips_elf_link_hash_entry *) h)->is_relocation_target = TRUE;
6376 /* Relocations against the special VxWorks __GOTT_BASE__ and
6377 __GOTT_INDEX__ symbols must be left to the loader. Allocate
6378 room for them in .rela.dyn. */
6379 if (is_gott_symbol (info, h))
6381 if (sreloc == NULL)
6383 sreloc = mips_elf_rel_dyn_section (info, TRUE);
6384 if (sreloc == NULL)
6385 return FALSE;
6387 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
6390 else if (r_type == R_MIPS_CALL_LO16
6391 || r_type == R_MIPS_GOT_LO16
6392 || r_type == R_MIPS_GOT_DISP
6393 || (r_type == R_MIPS_GOT16 && htab->is_vxworks))
6395 /* We may need a local GOT entry for this relocation. We
6396 don't count R_MIPS_GOT_PAGE because we can estimate the
6397 maximum number of pages needed by looking at the size of
6398 the segment. Similar comments apply to R_MIPS_GOT16 and
6399 R_MIPS_CALL16, except on VxWorks, where GOT relocations
6400 always evaluate to "G". We don't count R_MIPS_GOT_HI16, or
6401 R_MIPS_CALL_HI16 because these are always followed by an
6402 R_MIPS_GOT_LO16 or R_MIPS_CALL_LO16. */
6403 if (! mips_elf_record_local_got_symbol (abfd, r_symndx,
6404 rel->r_addend, g, 0))
6405 return FALSE;
6408 switch (r_type)
6410 case R_MIPS_CALL16:
6411 if (h == NULL)
6413 (*_bfd_error_handler)
6414 (_("%B: CALL16 reloc at 0x%lx not against global symbol"),
6415 abfd, (unsigned long) rel->r_offset);
6416 bfd_set_error (bfd_error_bad_value);
6417 return FALSE;
6419 /* Fall through. */
6421 case R_MIPS_CALL_HI16:
6422 case R_MIPS_CALL_LO16:
6423 if (h != NULL)
6425 /* VxWorks call relocations point the function's .got.plt
6426 entry, which will be allocated by adjust_dynamic_symbol.
6427 Otherwise, this symbol requires a global GOT entry. */
6428 if (!htab->is_vxworks
6429 && !mips_elf_record_global_got_symbol (h, abfd, info, g, 0))
6430 return FALSE;
6432 /* We need a stub, not a plt entry for the undefined
6433 function. But we record it as if it needs plt. See
6434 _bfd_elf_adjust_dynamic_symbol. */
6435 h->needs_plt = 1;
6436 h->type = STT_FUNC;
6438 break;
6440 case R_MIPS_GOT_PAGE:
6441 /* If this is a global, overridable symbol, GOT_PAGE will
6442 decay to GOT_DISP, so we'll need a GOT entry for it. */
6443 if (h == NULL)
6444 break;
6445 else
6447 struct mips_elf_link_hash_entry *hmips =
6448 (struct mips_elf_link_hash_entry *) h;
6450 while (hmips->root.root.type == bfd_link_hash_indirect
6451 || hmips->root.root.type == bfd_link_hash_warning)
6452 hmips = (struct mips_elf_link_hash_entry *)
6453 hmips->root.root.u.i.link;
6455 if (hmips->root.def_regular
6456 && ! (info->shared && ! info->symbolic
6457 && ! hmips->root.forced_local))
6458 break;
6460 /* Fall through. */
6462 case R_MIPS_GOT16:
6463 case R_MIPS_GOT_HI16:
6464 case R_MIPS_GOT_LO16:
6465 case R_MIPS_GOT_DISP:
6466 if (h && ! mips_elf_record_global_got_symbol (h, abfd, info, g, 0))
6467 return FALSE;
6468 break;
6470 case R_MIPS_TLS_GOTTPREL:
6471 if (info->shared)
6472 info->flags |= DF_STATIC_TLS;
6473 /* Fall through */
6475 case R_MIPS_TLS_LDM:
6476 if (r_type == R_MIPS_TLS_LDM)
6478 r_symndx = 0;
6479 h = NULL;
6481 /* Fall through */
6483 case R_MIPS_TLS_GD:
6484 /* This symbol requires a global offset table entry, or two
6485 for TLS GD relocations. */
6487 unsigned char flag = (r_type == R_MIPS_TLS_GD
6488 ? GOT_TLS_GD
6489 : r_type == R_MIPS_TLS_LDM
6490 ? GOT_TLS_LDM
6491 : GOT_TLS_IE);
6492 if (h != NULL)
6494 struct mips_elf_link_hash_entry *hmips =
6495 (struct mips_elf_link_hash_entry *) h;
6496 hmips->tls_type |= flag;
6498 if (h && ! mips_elf_record_global_got_symbol (h, abfd, info, g, flag))
6499 return FALSE;
6501 else
6503 BFD_ASSERT (flag == GOT_TLS_LDM || r_symndx != 0);
6505 if (! mips_elf_record_local_got_symbol (abfd, r_symndx,
6506 rel->r_addend, g, flag))
6507 return FALSE;
6510 break;
6512 case R_MIPS_32:
6513 case R_MIPS_REL32:
6514 case R_MIPS_64:
6515 /* In VxWorks executables, references to external symbols
6516 are handled using copy relocs or PLT stubs, so there's
6517 no need to add a .rela.dyn entry for this relocation. */
6518 if ((info->shared || (h != NULL && !htab->is_vxworks))
6519 && (sec->flags & SEC_ALLOC) != 0)
6521 if (sreloc == NULL)
6523 sreloc = mips_elf_rel_dyn_section (info, TRUE);
6524 if (sreloc == NULL)
6525 return FALSE;
6527 if (info->shared)
6529 /* When creating a shared object, we must copy these
6530 reloc types into the output file as R_MIPS_REL32
6531 relocs. Make room for this reloc in .rel(a).dyn. */
6532 mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
6533 if (MIPS_ELF_READONLY_SECTION (sec))
6534 /* We tell the dynamic linker that there are
6535 relocations against the text segment. */
6536 info->flags |= DF_TEXTREL;
6538 else
6540 struct mips_elf_link_hash_entry *hmips;
6542 /* We only need to copy this reloc if the symbol is
6543 defined in a dynamic object. */
6544 hmips = (struct mips_elf_link_hash_entry *) h;
6545 ++hmips->possibly_dynamic_relocs;
6546 if (MIPS_ELF_READONLY_SECTION (sec))
6547 /* We need it to tell the dynamic linker if there
6548 are relocations against the text segment. */
6549 hmips->readonly_reloc = TRUE;
6552 /* Even though we don't directly need a GOT entry for
6553 this symbol, a symbol must have a dynamic symbol
6554 table index greater that DT_MIPS_GOTSYM if there are
6555 dynamic relocations against it. This does not apply
6556 to VxWorks, which does not have the usual coupling
6557 between global GOT entries and .dynsym entries. */
6558 if (h != NULL && !htab->is_vxworks)
6560 if (dynobj == NULL)
6561 elf_hash_table (info)->dynobj = dynobj = abfd;
6562 if (! mips_elf_create_got_section (dynobj, info, TRUE))
6563 return FALSE;
6564 g = mips_elf_got_info (dynobj, &sgot);
6565 if (! mips_elf_record_global_got_symbol (h, abfd, info, g, 0))
6566 return FALSE;
6570 if (SGI_COMPAT (abfd))
6571 mips_elf_hash_table (info)->compact_rel_size +=
6572 sizeof (Elf32_External_crinfo);
6573 break;
6575 case R_MIPS_PC16:
6576 if (h)
6577 ((struct mips_elf_link_hash_entry *) h)->is_branch_target = TRUE;
6578 break;
6580 case R_MIPS_26:
6581 if (h)
6582 ((struct mips_elf_link_hash_entry *) h)->is_branch_target = TRUE;
6583 /* Fall through. */
6585 case R_MIPS_GPREL16:
6586 case R_MIPS_LITERAL:
6587 case R_MIPS_GPREL32:
6588 if (SGI_COMPAT (abfd))
6589 mips_elf_hash_table (info)->compact_rel_size +=
6590 sizeof (Elf32_External_crinfo);
6591 break;
6593 /* This relocation describes the C++ object vtable hierarchy.
6594 Reconstruct it for later use during GC. */
6595 case R_MIPS_GNU_VTINHERIT:
6596 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
6597 return FALSE;
6598 break;
6600 /* This relocation describes which C++ vtable entries are actually
6601 used. Record for later use during GC. */
6602 case R_MIPS_GNU_VTENTRY:
6603 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_offset))
6604 return FALSE;
6605 break;
6607 default:
6608 break;
6611 /* We must not create a stub for a symbol that has relocations
6612 related to taking the function's address. This doesn't apply to
6613 VxWorks, where CALL relocs refer to a .got.plt entry instead of
6614 a normal .got entry. */
6615 if (!htab->is_vxworks && h != NULL)
6616 switch (r_type)
6618 default:
6619 ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = TRUE;
6620 break;
6621 case R_MIPS_CALL16:
6622 case R_MIPS_CALL_HI16:
6623 case R_MIPS_CALL_LO16:
6624 case R_MIPS_JALR:
6625 break;
6628 /* If this reloc is not a 16 bit call, and it has a global
6629 symbol, then we will need the fn_stub if there is one.
6630 References from a stub section do not count. */
6631 if (h != NULL
6632 && r_type != R_MIPS16_26
6633 && strncmp (bfd_get_section_name (abfd, sec), FN_STUB,
6634 sizeof FN_STUB - 1) != 0
6635 && strncmp (bfd_get_section_name (abfd, sec), CALL_STUB,
6636 sizeof CALL_STUB - 1) != 0
6637 && strncmp (bfd_get_section_name (abfd, sec), CALL_FP_STUB,
6638 sizeof CALL_FP_STUB - 1) != 0)
6640 struct mips_elf_link_hash_entry *mh;
6642 mh = (struct mips_elf_link_hash_entry *) h;
6643 mh->need_fn_stub = TRUE;
6647 return TRUE;
6650 bfd_boolean
6651 _bfd_mips_relax_section (bfd *abfd, asection *sec,
6652 struct bfd_link_info *link_info,
6653 bfd_boolean *again)
6655 Elf_Internal_Rela *internal_relocs;
6656 Elf_Internal_Rela *irel, *irelend;
6657 Elf_Internal_Shdr *symtab_hdr;
6658 bfd_byte *contents = NULL;
6659 size_t extsymoff;
6660 bfd_boolean changed_contents = FALSE;
6661 bfd_vma sec_start = sec->output_section->vma + sec->output_offset;
6662 Elf_Internal_Sym *isymbuf = NULL;
6664 /* We are not currently changing any sizes, so only one pass. */
6665 *again = FALSE;
6667 if (link_info->relocatable)
6668 return TRUE;
6670 internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL,
6671 link_info->keep_memory);
6672 if (internal_relocs == NULL)
6673 return TRUE;
6675 irelend = internal_relocs + sec->reloc_count
6676 * get_elf_backend_data (abfd)->s->int_rels_per_ext_rel;
6677 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
6678 extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
6680 for (irel = internal_relocs; irel < irelend; irel++)
6682 bfd_vma symval;
6683 bfd_signed_vma sym_offset;
6684 unsigned int r_type;
6685 unsigned long r_symndx;
6686 asection *sym_sec;
6687 unsigned long instruction;
6689 /* Turn jalr into bgezal, and jr into beq, if they're marked
6690 with a JALR relocation, that indicate where they jump to.
6691 This saves some pipeline bubbles. */
6692 r_type = ELF_R_TYPE (abfd, irel->r_info);
6693 if (r_type != R_MIPS_JALR)
6694 continue;
6696 r_symndx = ELF_R_SYM (abfd, irel->r_info);
6697 /* Compute the address of the jump target. */
6698 if (r_symndx >= extsymoff)
6700 struct mips_elf_link_hash_entry *h
6701 = ((struct mips_elf_link_hash_entry *)
6702 elf_sym_hashes (abfd) [r_symndx - extsymoff]);
6704 while (h->root.root.type == bfd_link_hash_indirect
6705 || h->root.root.type == bfd_link_hash_warning)
6706 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
6708 /* If a symbol is undefined, or if it may be overridden,
6709 skip it. */
6710 if (! ((h->root.root.type == bfd_link_hash_defined
6711 || h->root.root.type == bfd_link_hash_defweak)
6712 && h->root.root.u.def.section)
6713 || (link_info->shared && ! link_info->symbolic
6714 && !h->root.forced_local))
6715 continue;
6717 sym_sec = h->root.root.u.def.section;
6718 if (sym_sec->output_section)
6719 symval = (h->root.root.u.def.value
6720 + sym_sec->output_section->vma
6721 + sym_sec->output_offset);
6722 else
6723 symval = h->root.root.u.def.value;
6725 else
6727 Elf_Internal_Sym *isym;
6729 /* Read this BFD's symbols if we haven't done so already. */
6730 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
6732 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
6733 if (isymbuf == NULL)
6734 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
6735 symtab_hdr->sh_info, 0,
6736 NULL, NULL, NULL);
6737 if (isymbuf == NULL)
6738 goto relax_return;
6741 isym = isymbuf + r_symndx;
6742 if (isym->st_shndx == SHN_UNDEF)
6743 continue;
6744 else if (isym->st_shndx == SHN_ABS)
6745 sym_sec = bfd_abs_section_ptr;
6746 else if (isym->st_shndx == SHN_COMMON)
6747 sym_sec = bfd_com_section_ptr;
6748 else
6749 sym_sec
6750 = bfd_section_from_elf_index (abfd, isym->st_shndx);
6751 symval = isym->st_value
6752 + sym_sec->output_section->vma
6753 + sym_sec->output_offset;
6756 /* Compute branch offset, from delay slot of the jump to the
6757 branch target. */
6758 sym_offset = (symval + irel->r_addend)
6759 - (sec_start + irel->r_offset + 4);
6761 /* Branch offset must be properly aligned. */
6762 if ((sym_offset & 3) != 0)
6763 continue;
6765 sym_offset >>= 2;
6767 /* Check that it's in range. */
6768 if (sym_offset < -0x8000 || sym_offset >= 0x8000)
6769 continue;
6771 /* Get the section contents if we haven't done so already. */
6772 if (contents == NULL)
6774 /* Get cached copy if it exists. */
6775 if (elf_section_data (sec)->this_hdr.contents != NULL)
6776 contents = elf_section_data (sec)->this_hdr.contents;
6777 else
6779 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
6780 goto relax_return;
6784 instruction = bfd_get_32 (abfd, contents + irel->r_offset);
6786 /* If it was jalr <reg>, turn it into bgezal $zero, <target>. */
6787 if ((instruction & 0xfc1fffff) == 0x0000f809)
6788 instruction = 0x04110000;
6789 /* If it was jr <reg>, turn it into b <target>. */
6790 else if ((instruction & 0xfc1fffff) == 0x00000008)
6791 instruction = 0x10000000;
6792 else
6793 continue;
6795 instruction |= (sym_offset & 0xffff);
6796 bfd_put_32 (abfd, instruction, contents + irel->r_offset);
6797 changed_contents = TRUE;
6800 if (contents != NULL
6801 && elf_section_data (sec)->this_hdr.contents != contents)
6803 if (!changed_contents && !link_info->keep_memory)
6804 free (contents);
6805 else
6807 /* Cache the section contents for elf_link_input_bfd. */
6808 elf_section_data (sec)->this_hdr.contents = contents;
6811 return TRUE;
6813 relax_return:
6814 if (contents != NULL
6815 && elf_section_data (sec)->this_hdr.contents != contents)
6816 free (contents);
6817 return FALSE;
6820 /* Adjust a symbol defined by a dynamic object and referenced by a
6821 regular object. The current definition is in some section of the
6822 dynamic object, but we're not including those sections. We have to
6823 change the definition to something the rest of the link can
6824 understand. */
6826 bfd_boolean
6827 _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
6828 struct elf_link_hash_entry *h)
6830 bfd *dynobj;
6831 struct mips_elf_link_hash_entry *hmips;
6832 asection *s;
6834 dynobj = elf_hash_table (info)->dynobj;
6836 /* Make sure we know what is going on here. */
6837 BFD_ASSERT (dynobj != NULL
6838 && (h->needs_plt
6839 || h->u.weakdef != NULL
6840 || (h->def_dynamic
6841 && h->ref_regular
6842 && !h->def_regular)));
6844 /* If this symbol is defined in a dynamic object, we need to copy
6845 any R_MIPS_32 or R_MIPS_REL32 relocs against it into the output
6846 file. */
6847 hmips = (struct mips_elf_link_hash_entry *) h;
6848 if (! info->relocatable
6849 && hmips->possibly_dynamic_relocs != 0
6850 && (h->root.type == bfd_link_hash_defweak
6851 || !h->def_regular))
6853 mips_elf_allocate_dynamic_relocations
6854 (dynobj, info, hmips->possibly_dynamic_relocs);
6855 if (hmips->readonly_reloc)
6856 /* We tell the dynamic linker that there are relocations
6857 against the text segment. */
6858 info->flags |= DF_TEXTREL;
6861 /* For a function, create a stub, if allowed. */
6862 if (! hmips->no_fn_stub
6863 && h->needs_plt)
6865 if (! elf_hash_table (info)->dynamic_sections_created)
6866 return TRUE;
6868 /* If this symbol is not defined in a regular file, then set
6869 the symbol to the stub location. This is required to make
6870 function pointers compare as equal between the normal
6871 executable and the shared library. */
6872 if (!h->def_regular)
6874 /* We need .stub section. */
6875 s = bfd_get_section_by_name (dynobj,
6876 MIPS_ELF_STUB_SECTION_NAME (dynobj));
6877 BFD_ASSERT (s != NULL);
6879 h->root.u.def.section = s;
6880 h->root.u.def.value = s->size;
6882 /* XXX Write this stub address somewhere. */
6883 h->plt.offset = s->size;
6885 /* Make room for this stub code. */
6886 s->size += MIPS_FUNCTION_STUB_SIZE (info);
6888 /* The last half word of the stub will be filled with the index
6889 of this symbol in .dynsym section. */
6890 return TRUE;
6893 else if ((h->type == STT_FUNC)
6894 && !h->needs_plt)
6896 /* This will set the entry for this symbol in the GOT to 0, and
6897 the dynamic linker will take care of this. */
6898 h->root.u.def.value = 0;
6899 return TRUE;
6902 /* If this is a weak symbol, and there is a real definition, the
6903 processor independent code will have arranged for us to see the
6904 real definition first, and we can just use the same value. */
6905 if (h->u.weakdef != NULL)
6907 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
6908 || h->u.weakdef->root.type == bfd_link_hash_defweak);
6909 h->root.u.def.section = h->u.weakdef->root.u.def.section;
6910 h->root.u.def.value = h->u.weakdef->root.u.def.value;
6911 return TRUE;
6914 /* This is a reference to a symbol defined by a dynamic object which
6915 is not a function. */
6917 return TRUE;
6920 /* Likewise, for VxWorks. */
6922 bfd_boolean
6923 _bfd_mips_vxworks_adjust_dynamic_symbol (struct bfd_link_info *info,
6924 struct elf_link_hash_entry *h)
6926 bfd *dynobj;
6927 struct mips_elf_link_hash_entry *hmips;
6928 struct mips_elf_link_hash_table *htab;
6929 unsigned int power_of_two;
6931 htab = mips_elf_hash_table (info);
6932 dynobj = elf_hash_table (info)->dynobj;
6933 hmips = (struct mips_elf_link_hash_entry *) h;
6935 /* Make sure we know what is going on here. */
6936 BFD_ASSERT (dynobj != NULL
6937 && (h->needs_plt
6938 || h->needs_copy
6939 || h->u.weakdef != NULL
6940 || (h->def_dynamic
6941 && h->ref_regular
6942 && !h->def_regular)));
6944 /* If the symbol is defined by a dynamic object, we need a PLT stub if
6945 either (a) we want to branch to the symbol or (b) we're linking an
6946 executable that needs a canonical function address. In the latter
6947 case, the canonical address will be the address of the executable's
6948 load stub. */
6949 if ((hmips->is_branch_target
6950 || (!info->shared
6951 && h->type == STT_FUNC
6952 && hmips->is_relocation_target))
6953 && h->def_dynamic
6954 && h->ref_regular
6955 && !h->def_regular
6956 && !h->forced_local)
6957 h->needs_plt = 1;
6959 /* Locally-binding symbols do not need a PLT stub; we can refer to
6960 the functions directly. */
6961 else if (h->needs_plt
6962 && (SYMBOL_CALLS_LOCAL (info, h)
6963 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
6964 && h->root.type == bfd_link_hash_undefweak)))
6966 h->needs_plt = 0;
6967 return TRUE;
6970 if (h->needs_plt)
6972 /* If this is the first symbol to need a PLT entry, allocate room
6973 for the header, and for the header's .rela.plt.unloaded entries. */
6974 if (htab->splt->size == 0)
6976 htab->splt->size += htab->plt_header_size;
6977 if (!info->shared)
6978 htab->srelplt2->size += 2 * sizeof (Elf32_External_Rela);
6981 /* Assign the next .plt entry to this symbol. */
6982 h->plt.offset = htab->splt->size;
6983 htab->splt->size += htab->plt_entry_size;
6985 /* If the output file has no definition of the symbol, set the
6986 symbol's value to the address of the stub. For executables,
6987 point at the PLT load stub rather than the lazy resolution stub;
6988 this stub will become the canonical function address. */
6989 if (!h->def_regular)
6991 h->root.u.def.section = htab->splt;
6992 h->root.u.def.value = h->plt.offset;
6993 if (!info->shared)
6994 h->root.u.def.value += 8;
6997 /* Make room for the .got.plt entry and the R_JUMP_SLOT relocation. */
6998 htab->sgotplt->size += 4;
6999 htab->srelplt->size += sizeof (Elf32_External_Rela);
7001 /* Make room for the .rela.plt.unloaded relocations. */
7002 if (!info->shared)
7003 htab->srelplt2->size += 3 * sizeof (Elf32_External_Rela);
7005 return TRUE;
7008 /* If a function symbol is defined by a dynamic object, and we do not
7009 need a PLT stub for it, the symbol's value should be zero. */
7010 if (h->type == STT_FUNC
7011 && h->def_dynamic
7012 && h->ref_regular
7013 && !h->def_regular)
7015 h->root.u.def.value = 0;
7016 return TRUE;
7019 /* If this is a weak symbol, and there is a real definition, the
7020 processor independent code will have arranged for us to see the
7021 real definition first, and we can just use the same value. */
7022 if (h->u.weakdef != NULL)
7024 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
7025 || h->u.weakdef->root.type == bfd_link_hash_defweak);
7026 h->root.u.def.section = h->u.weakdef->root.u.def.section;
7027 h->root.u.def.value = h->u.weakdef->root.u.def.value;
7028 return TRUE;
7031 /* This is a reference to a symbol defined by a dynamic object which
7032 is not a function. */
7033 if (info->shared)
7034 return TRUE;
7036 /* We must allocate the symbol in our .dynbss section, which will
7037 become part of the .bss section of the executable. There will be
7038 an entry for this symbol in the .dynsym section. The dynamic
7039 object will contain position independent code, so all references
7040 from the dynamic object to this symbol will go through the global
7041 offset table. The dynamic linker will use the .dynsym entry to
7042 determine the address it must put in the global offset table, so
7043 both the dynamic object and the regular object will refer to the
7044 same memory location for the variable. */
7046 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
7048 htab->srelbss->size += sizeof (Elf32_External_Rela);
7049 h->needs_copy = 1;
7052 /* We need to figure out the alignment required for this symbol. */
7053 power_of_two = bfd_log2 (h->size);
7054 if (power_of_two > 4)
7055 power_of_two = 4;
7057 /* Apply the required alignment. */
7058 htab->sdynbss->size = BFD_ALIGN (htab->sdynbss->size,
7059 (bfd_size_type) 1 << power_of_two);
7060 if (power_of_two > bfd_get_section_alignment (dynobj, htab->sdynbss)
7061 && !bfd_set_section_alignment (dynobj, htab->sdynbss, power_of_two))
7062 return FALSE;
7064 /* Define the symbol as being at this point in the section. */
7065 h->root.u.def.section = htab->sdynbss;
7066 h->root.u.def.value = htab->sdynbss->size;
7068 /* Increment the section size to make room for the symbol. */
7069 htab->sdynbss->size += h->size;
7071 return TRUE;
7074 /* This function is called after all the input files have been read,
7075 and the input sections have been assigned to output sections. We
7076 check for any mips16 stub sections that we can discard. */
7078 bfd_boolean
7079 _bfd_mips_elf_always_size_sections (bfd *output_bfd,
7080 struct bfd_link_info *info)
7082 asection *ri;
7084 bfd *dynobj;
7085 asection *s;
7086 struct mips_got_info *g;
7087 int i;
7088 bfd_size_type loadable_size = 0;
7089 bfd_size_type local_gotno;
7090 bfd *sub;
7091 struct mips_elf_count_tls_arg count_tls_arg;
7092 struct mips_elf_link_hash_table *htab;
7094 htab = mips_elf_hash_table (info);
7096 /* The .reginfo section has a fixed size. */
7097 ri = bfd_get_section_by_name (output_bfd, ".reginfo");
7098 if (ri != NULL)
7099 bfd_set_section_size (output_bfd, ri, sizeof (Elf32_External_RegInfo));
7101 if (! (info->relocatable
7102 || ! mips_elf_hash_table (info)->mips16_stubs_seen))
7103 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
7104 mips_elf_check_mips16_stubs, NULL);
7106 dynobj = elf_hash_table (info)->dynobj;
7107 if (dynobj == NULL)
7108 /* Relocatable links don't have it. */
7109 return TRUE;
7111 g = mips_elf_got_info (dynobj, &s);
7112 if (s == NULL)
7113 return TRUE;
7115 /* Calculate the total loadable size of the output. That
7116 will give us the maximum number of GOT_PAGE entries
7117 required. */
7118 for (sub = info->input_bfds; sub; sub = sub->link_next)
7120 asection *subsection;
7122 for (subsection = sub->sections;
7123 subsection;
7124 subsection = subsection->next)
7126 if ((subsection->flags & SEC_ALLOC) == 0)
7127 continue;
7128 loadable_size += ((subsection->size + 0xf)
7129 &~ (bfd_size_type) 0xf);
7133 /* There has to be a global GOT entry for every symbol with
7134 a dynamic symbol table index of DT_MIPS_GOTSYM or
7135 higher. Therefore, it make sense to put those symbols
7136 that need GOT entries at the end of the symbol table. We
7137 do that here. */
7138 if (! mips_elf_sort_hash_table (info, 1))
7139 return FALSE;
7141 if (g->global_gotsym != NULL)
7142 i = elf_hash_table (info)->dynsymcount - g->global_gotsym->dynindx;
7143 else
7144 /* If there are no global symbols, or none requiring
7145 relocations, then GLOBAL_GOTSYM will be NULL. */
7146 i = 0;
7148 /* In the worst case, we'll get one stub per dynamic symbol, plus
7149 one to account for the dummy entry at the end required by IRIX
7150 rld. */
7151 loadable_size += MIPS_FUNCTION_STUB_SIZE (info) * (i + 1);
7153 if (htab->is_vxworks)
7154 /* There's no need to allocate page entries for VxWorks; R_MIPS_GOT16
7155 relocations against local symbols evaluate to "G", and the EABI does
7156 not include R_MIPS_GOT_PAGE. */
7157 local_gotno = 0;
7158 else
7159 /* Assume there are two loadable segments consisting of contiguous
7160 sections. Is 5 enough? */
7161 local_gotno = (loadable_size >> 16) + 5;
7163 g->local_gotno += local_gotno;
7164 s->size += g->local_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
7166 g->global_gotno = i;
7167 s->size += i * MIPS_ELF_GOT_SIZE (output_bfd);
7169 /* We need to calculate tls_gotno for global symbols at this point
7170 instead of building it up earlier, to avoid doublecounting
7171 entries for one global symbol from multiple input files. */
7172 count_tls_arg.info = info;
7173 count_tls_arg.needed = 0;
7174 elf_link_hash_traverse (elf_hash_table (info),
7175 mips_elf_count_global_tls_entries,
7176 &count_tls_arg);
7177 g->tls_gotno += count_tls_arg.needed;
7178 s->size += g->tls_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
7180 mips_elf_resolve_final_got_entries (g);
7182 /* VxWorks does not support multiple GOTs. It initializes $gp to
7183 __GOTT_BASE__[__GOTT_INDEX__], the value of which is set by the
7184 dynamic loader. */
7185 if (!htab->is_vxworks && s->size > MIPS_ELF_GOT_MAX_SIZE (info))
7187 if (! mips_elf_multi_got (output_bfd, info, g, s, local_gotno))
7188 return FALSE;
7190 else
7192 /* Set up TLS entries for the first GOT. */
7193 g->tls_assigned_gotno = g->global_gotno + g->local_gotno;
7194 htab_traverse (g->got_entries, mips_elf_initialize_tls_index, g);
7197 return TRUE;
7200 /* Set the sizes of the dynamic sections. */
7202 bfd_boolean
7203 _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
7204 struct bfd_link_info *info)
7206 bfd *dynobj;
7207 asection *s, *sreldyn;
7208 bfd_boolean reltext;
7209 struct mips_elf_link_hash_table *htab;
7211 htab = mips_elf_hash_table (info);
7212 dynobj = elf_hash_table (info)->dynobj;
7213 BFD_ASSERT (dynobj != NULL);
7215 if (elf_hash_table (info)->dynamic_sections_created)
7217 /* Set the contents of the .interp section to the interpreter. */
7218 if (info->executable)
7220 s = bfd_get_section_by_name (dynobj, ".interp");
7221 BFD_ASSERT (s != NULL);
7222 s->size
7223 = strlen (ELF_DYNAMIC_INTERPRETER (output_bfd)) + 1;
7224 s->contents
7225 = (bfd_byte *) ELF_DYNAMIC_INTERPRETER (output_bfd);
7229 /* The check_relocs and adjust_dynamic_symbol entry points have
7230 determined the sizes of the various dynamic sections. Allocate
7231 memory for them. */
7232 reltext = FALSE;
7233 sreldyn = NULL;
7234 for (s = dynobj->sections; s != NULL; s = s->next)
7236 const char *name;
7238 /* It's OK to base decisions on the section name, because none
7239 of the dynobj section names depend upon the input files. */
7240 name = bfd_get_section_name (dynobj, s);
7242 if ((s->flags & SEC_LINKER_CREATED) == 0)
7243 continue;
7245 if (strncmp (name, ".rel", 4) == 0)
7247 if (s->size != 0)
7249 const char *outname;
7250 asection *target;
7252 /* If this relocation section applies to a read only
7253 section, then we probably need a DT_TEXTREL entry.
7254 If the relocation section is .rel(a).dyn, we always
7255 assert a DT_TEXTREL entry rather than testing whether
7256 there exists a relocation to a read only section or
7257 not. */
7258 outname = bfd_get_section_name (output_bfd,
7259 s->output_section);
7260 target = bfd_get_section_by_name (output_bfd, outname + 4);
7261 if ((target != NULL
7262 && (target->flags & SEC_READONLY) != 0
7263 && (target->flags & SEC_ALLOC) != 0)
7264 || strcmp (outname, MIPS_ELF_REL_DYN_NAME (info)) == 0)
7265 reltext = TRUE;
7267 /* We use the reloc_count field as a counter if we need
7268 to copy relocs into the output file. */
7269 if (strcmp (name, MIPS_ELF_REL_DYN_NAME (info)) != 0)
7270 s->reloc_count = 0;
7272 /* If combreloc is enabled, elf_link_sort_relocs() will
7273 sort relocations, but in a different way than we do,
7274 and before we're done creating relocations. Also, it
7275 will move them around between input sections'
7276 relocation's contents, so our sorting would be
7277 broken, so don't let it run. */
7278 info->combreloc = 0;
7281 else if (htab->is_vxworks && strcmp (name, ".got") == 0)
7283 /* Executables do not need a GOT. */
7284 if (info->shared)
7286 /* Allocate relocations for all but the reserved entries. */
7287 struct mips_got_info *g;
7288 unsigned int count;
7290 g = mips_elf_got_info (dynobj, NULL);
7291 count = (g->global_gotno
7292 + g->local_gotno
7293 - MIPS_RESERVED_GOTNO (info));
7294 mips_elf_allocate_dynamic_relocations (dynobj, info, count);
7297 else if (!htab->is_vxworks && strncmp (name, ".got", 4) == 0)
7299 /* _bfd_mips_elf_always_size_sections() has already done
7300 most of the work, but some symbols may have been mapped
7301 to versions that we must now resolve in the got_entries
7302 hash tables. */
7303 struct mips_got_info *gg = mips_elf_got_info (dynobj, NULL);
7304 struct mips_got_info *g = gg;
7305 struct mips_elf_set_global_got_offset_arg set_got_offset_arg;
7306 unsigned int needed_relocs = 0;
7308 if (gg->next)
7310 set_got_offset_arg.value = MIPS_ELF_GOT_SIZE (output_bfd);
7311 set_got_offset_arg.info = info;
7313 /* NOTE 2005-02-03: How can this call, or the next, ever
7314 find any indirect entries to resolve? They were all
7315 resolved in mips_elf_multi_got. */
7316 mips_elf_resolve_final_got_entries (gg);
7317 for (g = gg->next; g && g->next != gg; g = g->next)
7319 unsigned int save_assign;
7321 mips_elf_resolve_final_got_entries (g);
7323 /* Assign offsets to global GOT entries. */
7324 save_assign = g->assigned_gotno;
7325 g->assigned_gotno = g->local_gotno;
7326 set_got_offset_arg.g = g;
7327 set_got_offset_arg.needed_relocs = 0;
7328 htab_traverse (g->got_entries,
7329 mips_elf_set_global_got_offset,
7330 &set_got_offset_arg);
7331 needed_relocs += set_got_offset_arg.needed_relocs;
7332 BFD_ASSERT (g->assigned_gotno - g->local_gotno
7333 <= g->global_gotno);
7335 g->assigned_gotno = save_assign;
7336 if (info->shared)
7338 needed_relocs += g->local_gotno - g->assigned_gotno;
7339 BFD_ASSERT (g->assigned_gotno == g->next->local_gotno
7340 + g->next->global_gotno
7341 + g->next->tls_gotno
7342 + MIPS_RESERVED_GOTNO (info));
7346 else
7348 struct mips_elf_count_tls_arg arg;
7349 arg.info = info;
7350 arg.needed = 0;
7352 htab_traverse (gg->got_entries, mips_elf_count_local_tls_relocs,
7353 &arg);
7354 elf_link_hash_traverse (elf_hash_table (info),
7355 mips_elf_count_global_tls_relocs,
7356 &arg);
7358 needed_relocs += arg.needed;
7361 if (needed_relocs)
7362 mips_elf_allocate_dynamic_relocations (dynobj, info,
7363 needed_relocs);
7365 else if (strcmp (name, MIPS_ELF_STUB_SECTION_NAME (output_bfd)) == 0)
7367 /* IRIX rld assumes that the function stub isn't at the end
7368 of .text section. So put a dummy. XXX */
7369 s->size += MIPS_FUNCTION_STUB_SIZE (info);
7371 else if (! info->shared
7372 && ! mips_elf_hash_table (info)->use_rld_obj_head
7373 && strncmp (name, ".rld_map", 8) == 0)
7375 /* We add a room for __rld_map. It will be filled in by the
7376 rtld to contain a pointer to the _r_debug structure. */
7377 s->size += 4;
7379 else if (SGI_COMPAT (output_bfd)
7380 && strncmp (name, ".compact_rel", 12) == 0)
7381 s->size += mips_elf_hash_table (info)->compact_rel_size;
7382 else if (strncmp (name, ".init", 5) != 0
7383 && s != htab->sgotplt
7384 && s != htab->splt)
7386 /* It's not one of our sections, so don't allocate space. */
7387 continue;
7390 if (s->size == 0)
7392 s->flags |= SEC_EXCLUDE;
7393 continue;
7396 if ((s->flags & SEC_HAS_CONTENTS) == 0)
7397 continue;
7399 /* Allocate memory for this section last, since we may increase its
7400 size above. */
7401 if (strcmp (name, MIPS_ELF_REL_DYN_NAME (info)) == 0)
7403 sreldyn = s;
7404 continue;
7407 /* Allocate memory for the section contents. */
7408 s->contents = bfd_zalloc (dynobj, s->size);
7409 if (s->contents == NULL)
7411 bfd_set_error (bfd_error_no_memory);
7412 return FALSE;
7416 /* Allocate memory for the .rel(a).dyn section. */
7417 if (sreldyn != NULL)
7419 sreldyn->contents = bfd_zalloc (dynobj, sreldyn->size);
7420 if (sreldyn->contents == NULL)
7422 bfd_set_error (bfd_error_no_memory);
7423 return FALSE;
7427 if (elf_hash_table (info)->dynamic_sections_created)
7429 /* Add some entries to the .dynamic section. We fill in the
7430 values later, in _bfd_mips_elf_finish_dynamic_sections, but we
7431 must add the entries now so that we get the correct size for
7432 the .dynamic section. The DT_DEBUG entry is filled in by the
7433 dynamic linker and used by the debugger. */
7434 if (! info->shared)
7436 /* SGI object has the equivalence of DT_DEBUG in the
7437 DT_MIPS_RLD_MAP entry. */
7438 if (!MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP, 0))
7439 return FALSE;
7440 if (!SGI_COMPAT (output_bfd))
7442 if (!MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_DEBUG, 0))
7443 return FALSE;
7446 else
7448 /* Shared libraries on traditional mips have DT_DEBUG. */
7449 if (!SGI_COMPAT (output_bfd))
7451 if (!MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_DEBUG, 0))
7452 return FALSE;
7456 if (reltext && (SGI_COMPAT (output_bfd) || htab->is_vxworks))
7457 info->flags |= DF_TEXTREL;
7459 if ((info->flags & DF_TEXTREL) != 0)
7461 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_TEXTREL, 0))
7462 return FALSE;
7464 /* Clear the DF_TEXTREL flag. It will be set again if we
7465 write out an actual text relocation; we may not, because
7466 at this point we do not know whether e.g. any .eh_frame
7467 absolute relocations have been converted to PC-relative. */
7468 info->flags &= ~DF_TEXTREL;
7471 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTGOT, 0))
7472 return FALSE;
7474 if (htab->is_vxworks)
7476 /* VxWorks uses .rela.dyn instead of .rel.dyn. It does not
7477 use any of the DT_MIPS_* tags. */
7478 if (mips_elf_rel_dyn_section (info, FALSE))
7480 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELA, 0))
7481 return FALSE;
7483 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELASZ, 0))
7484 return FALSE;
7486 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELAENT, 0))
7487 return FALSE;
7489 if (htab->splt->size > 0)
7491 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTREL, 0))
7492 return FALSE;
7494 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_JMPREL, 0))
7495 return FALSE;
7497 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTRELSZ, 0))
7498 return FALSE;
7501 else
7503 if (mips_elf_rel_dyn_section (info, FALSE))
7505 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_REL, 0))
7506 return FALSE;
7508 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELSZ, 0))
7509 return FALSE;
7511 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELENT, 0))
7512 return FALSE;
7515 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_VERSION, 0))
7516 return FALSE;
7518 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_FLAGS, 0))
7519 return FALSE;
7521 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_BASE_ADDRESS, 0))
7522 return FALSE;
7524 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_LOCAL_GOTNO, 0))
7525 return FALSE;
7527 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_SYMTABNO, 0))
7528 return FALSE;
7530 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_UNREFEXTNO, 0))
7531 return FALSE;
7533 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_GOTSYM, 0))
7534 return FALSE;
7536 if (IRIX_COMPAT (dynobj) == ict_irix5
7537 && ! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_HIPAGENO, 0))
7538 return FALSE;
7540 if (IRIX_COMPAT (dynobj) == ict_irix6
7541 && (bfd_get_section_by_name
7542 (dynobj, MIPS_ELF_OPTIONS_SECTION_NAME (dynobj)))
7543 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_OPTIONS, 0))
7544 return FALSE;
7548 return TRUE;
7551 /* REL is a relocation in INPUT_BFD that is being copied to OUTPUT_BFD.
7552 Adjust its R_ADDEND field so that it is correct for the output file.
7553 LOCAL_SYMS and LOCAL_SECTIONS are arrays of INPUT_BFD's local symbols
7554 and sections respectively; both use symbol indexes. */
7556 static void
7557 mips_elf_adjust_addend (bfd *output_bfd, struct bfd_link_info *info,
7558 bfd *input_bfd, Elf_Internal_Sym *local_syms,
7559 asection **local_sections, Elf_Internal_Rela *rel)
7561 unsigned int r_type, r_symndx;
7562 Elf_Internal_Sym *sym;
7563 asection *sec;
7565 if (mips_elf_local_relocation_p (input_bfd, rel, local_sections, FALSE))
7567 r_type = ELF_R_TYPE (output_bfd, rel->r_info);
7568 if (r_type == R_MIPS16_GPREL
7569 || r_type == R_MIPS_GPREL16
7570 || r_type == R_MIPS_GPREL32
7571 || r_type == R_MIPS_LITERAL)
7573 rel->r_addend += _bfd_get_gp_value (input_bfd);
7574 rel->r_addend -= _bfd_get_gp_value (output_bfd);
7577 r_symndx = ELF_R_SYM (output_bfd, rel->r_info);
7578 sym = local_syms + r_symndx;
7580 /* Adjust REL's addend to account for section merging. */
7581 if (!info->relocatable)
7583 sec = local_sections[r_symndx];
7584 _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
7587 /* This would normally be done by the rela_normal code in elflink.c. */
7588 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
7589 rel->r_addend += local_sections[r_symndx]->output_offset;
7593 /* Relocate a MIPS ELF section. */
7595 bfd_boolean
7596 _bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
7597 bfd *input_bfd, asection *input_section,
7598 bfd_byte *contents, Elf_Internal_Rela *relocs,
7599 Elf_Internal_Sym *local_syms,
7600 asection **local_sections)
7602 Elf_Internal_Rela *rel;
7603 const Elf_Internal_Rela *relend;
7604 bfd_vma addend = 0;
7605 bfd_boolean use_saved_addend_p = FALSE;
7606 const struct elf_backend_data *bed;
7608 bed = get_elf_backend_data (output_bfd);
7609 relend = relocs + input_section->reloc_count * bed->s->int_rels_per_ext_rel;
7610 for (rel = relocs; rel < relend; ++rel)
7612 const char *name;
7613 bfd_vma value = 0;
7614 reloc_howto_type *howto;
7615 bfd_boolean require_jalx;
7616 /* TRUE if the relocation is a RELA relocation, rather than a
7617 REL relocation. */
7618 bfd_boolean rela_relocation_p = TRUE;
7619 unsigned int r_type = ELF_R_TYPE (output_bfd, rel->r_info);
7620 const char *msg;
7622 /* Find the relocation howto for this relocation. */
7623 if (r_type == R_MIPS_64 && ! NEWABI_P (input_bfd))
7625 /* Some 32-bit code uses R_MIPS_64. In particular, people use
7626 64-bit code, but make sure all their addresses are in the
7627 lowermost or uppermost 32-bit section of the 64-bit address
7628 space. Thus, when they use an R_MIPS_64 they mean what is
7629 usually meant by R_MIPS_32, with the exception that the
7630 stored value is sign-extended to 64 bits. */
7631 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, R_MIPS_32, FALSE);
7633 /* On big-endian systems, we need to lie about the position
7634 of the reloc. */
7635 if (bfd_big_endian (input_bfd))
7636 rel->r_offset += 4;
7638 else
7639 /* NewABI defaults to RELA relocations. */
7640 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type,
7641 NEWABI_P (input_bfd)
7642 && (MIPS_RELOC_RELA_P
7643 (input_bfd, input_section,
7644 rel - relocs)));
7646 if (!use_saved_addend_p)
7648 Elf_Internal_Shdr *rel_hdr;
7650 /* If these relocations were originally of the REL variety,
7651 we must pull the addend out of the field that will be
7652 relocated. Otherwise, we simply use the contents of the
7653 RELA relocation. To determine which flavor or relocation
7654 this is, we depend on the fact that the INPUT_SECTION's
7655 REL_HDR is read before its REL_HDR2. */
7656 rel_hdr = &elf_section_data (input_section)->rel_hdr;
7657 if ((size_t) (rel - relocs)
7658 >= (NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel))
7659 rel_hdr = elf_section_data (input_section)->rel_hdr2;
7660 if (rel_hdr->sh_entsize == MIPS_ELF_REL_SIZE (input_bfd))
7662 bfd_byte *location = contents + rel->r_offset;
7664 /* Note that this is a REL relocation. */
7665 rela_relocation_p = FALSE;
7667 /* Get the addend, which is stored in the input file. */
7668 _bfd_mips16_elf_reloc_unshuffle (input_bfd, r_type, FALSE,
7669 location);
7670 addend = mips_elf_obtain_contents (howto, rel, input_bfd,
7671 contents);
7672 _bfd_mips16_elf_reloc_shuffle(input_bfd, r_type, FALSE,
7673 location);
7675 addend &= howto->src_mask;
7677 /* For some kinds of relocations, the ADDEND is a
7678 combination of the addend stored in two different
7679 relocations. */
7680 if (r_type == R_MIPS_HI16 || r_type == R_MIPS16_HI16
7681 || (r_type == R_MIPS_GOT16
7682 && mips_elf_local_relocation_p (input_bfd, rel,
7683 local_sections, FALSE)))
7685 bfd_vma l;
7686 const Elf_Internal_Rela *lo16_relocation;
7687 reloc_howto_type *lo16_howto;
7688 bfd_byte *lo16_location;
7689 int lo16_type;
7691 if (r_type == R_MIPS16_HI16)
7692 lo16_type = R_MIPS16_LO16;
7693 else
7694 lo16_type = R_MIPS_LO16;
7696 /* The combined value is the sum of the HI16 addend,
7697 left-shifted by sixteen bits, and the LO16
7698 addend, sign extended. (Usually, the code does
7699 a `lui' of the HI16 value, and then an `addiu' of
7700 the LO16 value.)
7702 Scan ahead to find a matching LO16 relocation.
7704 According to the MIPS ELF ABI, the R_MIPS_LO16
7705 relocation must be immediately following.
7706 However, for the IRIX6 ABI, the next relocation
7707 may be a composed relocation consisting of
7708 several relocations for the same address. In
7709 that case, the R_MIPS_LO16 relocation may occur
7710 as one of these. We permit a similar extension
7711 in general, as that is useful for GCC. */
7712 lo16_relocation = mips_elf_next_relocation (input_bfd,
7713 lo16_type,
7714 rel, relend);
7715 if (lo16_relocation == NULL)
7716 return FALSE;
7718 lo16_location = contents + lo16_relocation->r_offset;
7720 /* Obtain the addend kept there. */
7721 lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd,
7722 lo16_type, FALSE);
7723 _bfd_mips16_elf_reloc_unshuffle (input_bfd, lo16_type, FALSE,
7724 lo16_location);
7725 l = mips_elf_obtain_contents (lo16_howto, lo16_relocation,
7726 input_bfd, contents);
7727 _bfd_mips16_elf_reloc_shuffle (input_bfd, lo16_type, FALSE,
7728 lo16_location);
7729 l &= lo16_howto->src_mask;
7730 l <<= lo16_howto->rightshift;
7731 l = _bfd_mips_elf_sign_extend (l, 16);
7733 addend <<= 16;
7735 /* Compute the combined addend. */
7736 addend += l;
7738 else
7739 addend <<= howto->rightshift;
7741 else
7742 addend = rel->r_addend;
7743 mips_elf_adjust_addend (output_bfd, info, input_bfd,
7744 local_syms, local_sections, rel);
7747 if (info->relocatable)
7749 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd)
7750 && bfd_big_endian (input_bfd))
7751 rel->r_offset -= 4;
7753 if (!rela_relocation_p && rel->r_addend)
7755 addend += rel->r_addend;
7756 if (r_type == R_MIPS_HI16
7757 || r_type == R_MIPS_GOT16)
7758 addend = mips_elf_high (addend);
7759 else if (r_type == R_MIPS_HIGHER)
7760 addend = mips_elf_higher (addend);
7761 else if (r_type == R_MIPS_HIGHEST)
7762 addend = mips_elf_highest (addend);
7763 else
7764 addend >>= howto->rightshift;
7766 /* We use the source mask, rather than the destination
7767 mask because the place to which we are writing will be
7768 source of the addend in the final link. */
7769 addend &= howto->src_mask;
7771 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
7772 /* See the comment above about using R_MIPS_64 in the 32-bit
7773 ABI. Here, we need to update the addend. It would be
7774 possible to get away with just using the R_MIPS_32 reloc
7775 but for endianness. */
7777 bfd_vma sign_bits;
7778 bfd_vma low_bits;
7779 bfd_vma high_bits;
7781 if (addend & ((bfd_vma) 1 << 31))
7782 #ifdef BFD64
7783 sign_bits = ((bfd_vma) 1 << 32) - 1;
7784 #else
7785 sign_bits = -1;
7786 #endif
7787 else
7788 sign_bits = 0;
7790 /* If we don't know that we have a 64-bit type,
7791 do two separate stores. */
7792 if (bfd_big_endian (input_bfd))
7794 /* Store the sign-bits (which are most significant)
7795 first. */
7796 low_bits = sign_bits;
7797 high_bits = addend;
7799 else
7801 low_bits = addend;
7802 high_bits = sign_bits;
7804 bfd_put_32 (input_bfd, low_bits,
7805 contents + rel->r_offset);
7806 bfd_put_32 (input_bfd, high_bits,
7807 contents + rel->r_offset + 4);
7808 continue;
7811 if (! mips_elf_perform_relocation (info, howto, rel, addend,
7812 input_bfd, input_section,
7813 contents, FALSE))
7814 return FALSE;
7817 /* Go on to the next relocation. */
7818 continue;
7821 /* In the N32 and 64-bit ABIs there may be multiple consecutive
7822 relocations for the same offset. In that case we are
7823 supposed to treat the output of each relocation as the addend
7824 for the next. */
7825 if (rel + 1 < relend
7826 && rel->r_offset == rel[1].r_offset
7827 && ELF_R_TYPE (input_bfd, rel[1].r_info) != R_MIPS_NONE)
7828 use_saved_addend_p = TRUE;
7829 else
7830 use_saved_addend_p = FALSE;
7832 /* Figure out what value we are supposed to relocate. */
7833 switch (mips_elf_calculate_relocation (output_bfd, input_bfd,
7834 input_section, info, rel,
7835 addend, howto, local_syms,
7836 local_sections, &value,
7837 &name, &require_jalx,
7838 use_saved_addend_p))
7840 case bfd_reloc_continue:
7841 /* There's nothing to do. */
7842 continue;
7844 case bfd_reloc_undefined:
7845 /* mips_elf_calculate_relocation already called the
7846 undefined_symbol callback. There's no real point in
7847 trying to perform the relocation at this point, so we
7848 just skip ahead to the next relocation. */
7849 continue;
7851 case bfd_reloc_notsupported:
7852 msg = _("internal error: unsupported relocation error");
7853 info->callbacks->warning
7854 (info, msg, name, input_bfd, input_section, rel->r_offset);
7855 return FALSE;
7857 case bfd_reloc_overflow:
7858 if (use_saved_addend_p)
7859 /* Ignore overflow until we reach the last relocation for
7860 a given location. */
7862 else
7864 BFD_ASSERT (name != NULL);
7865 if (! ((*info->callbacks->reloc_overflow)
7866 (info, NULL, name, howto->name, (bfd_vma) 0,
7867 input_bfd, input_section, rel->r_offset)))
7868 return FALSE;
7870 break;
7872 case bfd_reloc_ok:
7873 break;
7875 default:
7876 abort ();
7877 break;
7880 /* If we've got another relocation for the address, keep going
7881 until we reach the last one. */
7882 if (use_saved_addend_p)
7884 addend = value;
7885 continue;
7888 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
7889 /* See the comment above about using R_MIPS_64 in the 32-bit
7890 ABI. Until now, we've been using the HOWTO for R_MIPS_32;
7891 that calculated the right value. Now, however, we
7892 sign-extend the 32-bit result to 64-bits, and store it as a
7893 64-bit value. We are especially generous here in that we
7894 go to extreme lengths to support this usage on systems with
7895 only a 32-bit VMA. */
7897 bfd_vma sign_bits;
7898 bfd_vma low_bits;
7899 bfd_vma high_bits;
7901 if (value & ((bfd_vma) 1 << 31))
7902 #ifdef BFD64
7903 sign_bits = ((bfd_vma) 1 << 32) - 1;
7904 #else
7905 sign_bits = -1;
7906 #endif
7907 else
7908 sign_bits = 0;
7910 /* If we don't know that we have a 64-bit type,
7911 do two separate stores. */
7912 if (bfd_big_endian (input_bfd))
7914 /* Undo what we did above. */
7915 rel->r_offset -= 4;
7916 /* Store the sign-bits (which are most significant)
7917 first. */
7918 low_bits = sign_bits;
7919 high_bits = value;
7921 else
7923 low_bits = value;
7924 high_bits = sign_bits;
7926 bfd_put_32 (input_bfd, low_bits,
7927 contents + rel->r_offset);
7928 bfd_put_32 (input_bfd, high_bits,
7929 contents + rel->r_offset + 4);
7930 continue;
7933 /* Actually perform the relocation. */
7934 if (! mips_elf_perform_relocation (info, howto, rel, value,
7935 input_bfd, input_section,
7936 contents, require_jalx))
7937 return FALSE;
7940 return TRUE;
7943 /* If NAME is one of the special IRIX6 symbols defined by the linker,
7944 adjust it appropriately now. */
7946 static void
7947 mips_elf_irix6_finish_dynamic_symbol (bfd *abfd ATTRIBUTE_UNUSED,
7948 const char *name, Elf_Internal_Sym *sym)
7950 /* The linker script takes care of providing names and values for
7951 these, but we must place them into the right sections. */
7952 static const char* const text_section_symbols[] = {
7953 "_ftext",
7954 "_etext",
7955 "__dso_displacement",
7956 "__elf_header",
7957 "__program_header_table",
7958 NULL
7961 static const char* const data_section_symbols[] = {
7962 "_fdata",
7963 "_edata",
7964 "_end",
7965 "_fbss",
7966 NULL
7969 const char* const *p;
7970 int i;
7972 for (i = 0; i < 2; ++i)
7973 for (p = (i == 0) ? text_section_symbols : data_section_symbols;
7975 ++p)
7976 if (strcmp (*p, name) == 0)
7978 /* All of these symbols are given type STT_SECTION by the
7979 IRIX6 linker. */
7980 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
7981 sym->st_other = STO_PROTECTED;
7983 /* The IRIX linker puts these symbols in special sections. */
7984 if (i == 0)
7985 sym->st_shndx = SHN_MIPS_TEXT;
7986 else
7987 sym->st_shndx = SHN_MIPS_DATA;
7989 break;
7993 /* Finish up dynamic symbol handling. We set the contents of various
7994 dynamic sections here. */
7996 bfd_boolean
7997 _bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
7998 struct bfd_link_info *info,
7999 struct elf_link_hash_entry *h,
8000 Elf_Internal_Sym *sym)
8002 bfd *dynobj;
8003 asection *sgot;
8004 struct mips_got_info *g, *gg;
8005 const char *name;
8006 int idx;
8008 dynobj = elf_hash_table (info)->dynobj;
8010 if (h->plt.offset != MINUS_ONE)
8012 asection *s;
8013 bfd_byte stub[MIPS_FUNCTION_STUB_MAX_SIZE];
8015 /* This symbol has a stub. Set it up. */
8017 BFD_ASSERT (h->dynindx != -1);
8019 s = bfd_get_section_by_name (dynobj,
8020 MIPS_ELF_STUB_SECTION_NAME (dynobj));
8021 BFD_ASSERT (s != NULL);
8023 BFD_ASSERT ((MIPS_FUNCTION_STUB_SIZE (info) == 20)
8024 || (h->dynindx <= 65536));
8026 /* Values up to 2^31 - 1 are allowed. Larger values would cause
8027 sign extension at runtime in the stub, resulting in a
8028 negative index value. */
8029 if (h->dynindx & 0x80000000)
8030 return FALSE;
8032 /* Fill the stub. */
8033 idx = 0;
8034 bfd_put_32 (output_bfd, STUB_LW (output_bfd), stub + idx);
8035 idx += 4;
8036 bfd_put_32 (output_bfd, STUB_MOVE (output_bfd), stub + idx);
8037 idx += 4;
8038 if (MIPS_FUNCTION_STUB_SIZE (info) == 20)
8040 bfd_put_32 (output_bfd, STUB_LUI ((h->dynindx >> 16 ) & 0xffff),
8041 stub + idx);
8042 idx += 4;
8044 bfd_put_32 (output_bfd, STUB_JALR, stub + idx);
8045 idx += 4;
8047 /* If a large stub is not required and sign extension is not a
8048 problem, then use legacy code in the stub. */
8049 if ((MIPS_FUNCTION_STUB_SIZE (info) == 20) || (h->dynindx & 0xffff8000))
8050 bfd_put_32 (output_bfd, STUB_LI16U (h->dynindx & 0xffff), stub + idx);
8051 else
8052 bfd_put_32 (output_bfd,
8053 STUB_LI16S (output_bfd, h->dynindx & 0xffff), stub + idx);
8055 BFD_ASSERT (h->plt.offset <= s->size);
8056 memcpy (s->contents + h->plt.offset,
8057 stub, MIPS_FUNCTION_STUB_SIZE (info));
8059 /* Mark the symbol as undefined. plt.offset != -1 occurs
8060 only for the referenced symbol. */
8061 sym->st_shndx = SHN_UNDEF;
8063 /* The run-time linker uses the st_value field of the symbol
8064 to reset the global offset table entry for this external
8065 to its stub address when unlinking a shared object. */
8066 sym->st_value = (s->output_section->vma + s->output_offset
8067 + h->plt.offset);
8070 BFD_ASSERT (h->dynindx != -1
8071 || h->forced_local);
8073 sgot = mips_elf_got_section (dynobj, FALSE);
8074 BFD_ASSERT (sgot != NULL);
8075 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
8076 g = mips_elf_section_data (sgot)->u.got_info;
8077 BFD_ASSERT (g != NULL);
8079 /* Run through the global symbol table, creating GOT entries for all
8080 the symbols that need them. */
8081 if (g->global_gotsym != NULL
8082 && h->dynindx >= g->global_gotsym->dynindx)
8084 bfd_vma offset;
8085 bfd_vma value;
8087 value = sym->st_value;
8088 offset = mips_elf_global_got_index (dynobj, output_bfd, h, R_MIPS_GOT16, info);
8089 MIPS_ELF_PUT_WORD (output_bfd, value, sgot->contents + offset);
8092 if (g->next && h->dynindx != -1 && h->type != STT_TLS)
8094 struct mips_got_entry e, *p;
8095 bfd_vma entry;
8096 bfd_vma offset;
8098 gg = g;
8100 e.abfd = output_bfd;
8101 e.symndx = -1;
8102 e.d.h = (struct mips_elf_link_hash_entry *)h;
8103 e.tls_type = 0;
8105 for (g = g->next; g->next != gg; g = g->next)
8107 if (g->got_entries
8108 && (p = (struct mips_got_entry *) htab_find (g->got_entries,
8109 &e)))
8111 offset = p->gotidx;
8112 if (info->shared
8113 || (elf_hash_table (info)->dynamic_sections_created
8114 && p->d.h != NULL
8115 && p->d.h->root.def_dynamic
8116 && !p->d.h->root.def_regular))
8118 /* Create an R_MIPS_REL32 relocation for this entry. Due to
8119 the various compatibility problems, it's easier to mock
8120 up an R_MIPS_32 or R_MIPS_64 relocation and leave
8121 mips_elf_create_dynamic_relocation to calculate the
8122 appropriate addend. */
8123 Elf_Internal_Rela rel[3];
8125 memset (rel, 0, sizeof (rel));
8126 if (ABI_64_P (output_bfd))
8127 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_64);
8128 else
8129 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_32);
8130 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
8132 entry = 0;
8133 if (! (mips_elf_create_dynamic_relocation
8134 (output_bfd, info, rel,
8135 e.d.h, NULL, sym->st_value, &entry, sgot)))
8136 return FALSE;
8138 else
8139 entry = sym->st_value;
8140 MIPS_ELF_PUT_WORD (output_bfd, entry, sgot->contents + offset);
8145 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
8146 name = h->root.root.string;
8147 if (strcmp (name, "_DYNAMIC") == 0
8148 || h == elf_hash_table (info)->hgot)
8149 sym->st_shndx = SHN_ABS;
8150 else if (strcmp (name, "_DYNAMIC_LINK") == 0
8151 || strcmp (name, "_DYNAMIC_LINKING") == 0)
8153 sym->st_shndx = SHN_ABS;
8154 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8155 sym->st_value = 1;
8157 else if (strcmp (name, "_gp_disp") == 0 && ! NEWABI_P (output_bfd))
8159 sym->st_shndx = SHN_ABS;
8160 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8161 sym->st_value = elf_gp (output_bfd);
8163 else if (SGI_COMPAT (output_bfd))
8165 if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
8166 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
8168 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8169 sym->st_other = STO_PROTECTED;
8170 sym->st_value = 0;
8171 sym->st_shndx = SHN_MIPS_DATA;
8173 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
8175 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
8176 sym->st_other = STO_PROTECTED;
8177 sym->st_value = mips_elf_hash_table (info)->procedure_count;
8178 sym->st_shndx = SHN_ABS;
8180 else if (sym->st_shndx != SHN_UNDEF && sym->st_shndx != SHN_ABS)
8182 if (h->type == STT_FUNC)
8183 sym->st_shndx = SHN_MIPS_TEXT;
8184 else if (h->type == STT_OBJECT)
8185 sym->st_shndx = SHN_MIPS_DATA;
8189 /* Handle the IRIX6-specific symbols. */
8190 if (IRIX_COMPAT (output_bfd) == ict_irix6)
8191 mips_elf_irix6_finish_dynamic_symbol (output_bfd, name, sym);
8193 if (! info->shared)
8195 if (! mips_elf_hash_table (info)->use_rld_obj_head
8196 && (strcmp (name, "__rld_map") == 0
8197 || strcmp (name, "__RLD_MAP") == 0))
8199 asection *s = bfd_get_section_by_name (dynobj, ".rld_map");
8200 BFD_ASSERT (s != NULL);
8201 sym->st_value = s->output_section->vma + s->output_offset;
8202 bfd_put_32 (output_bfd, 0, s->contents);
8203 if (mips_elf_hash_table (info)->rld_value == 0)
8204 mips_elf_hash_table (info)->rld_value = sym->st_value;
8206 else if (mips_elf_hash_table (info)->use_rld_obj_head
8207 && strcmp (name, "__rld_obj_head") == 0)
8209 /* IRIX6 does not use a .rld_map section. */
8210 if (IRIX_COMPAT (output_bfd) == ict_irix5
8211 || IRIX_COMPAT (output_bfd) == ict_none)
8212 BFD_ASSERT (bfd_get_section_by_name (dynobj, ".rld_map")
8213 != NULL);
8214 mips_elf_hash_table (info)->rld_value = sym->st_value;
8218 /* If this is a mips16 symbol, force the value to be even. */
8219 if (sym->st_other == STO_MIPS16)
8220 sym->st_value &= ~1;
8222 return TRUE;
8225 /* Likewise, for VxWorks. */
8227 bfd_boolean
8228 _bfd_mips_vxworks_finish_dynamic_symbol (bfd *output_bfd,
8229 struct bfd_link_info *info,
8230 struct elf_link_hash_entry *h,
8231 Elf_Internal_Sym *sym)
8233 bfd *dynobj;
8234 asection *sgot;
8235 struct mips_got_info *g;
8236 struct mips_elf_link_hash_table *htab;
8238 htab = mips_elf_hash_table (info);
8239 dynobj = elf_hash_table (info)->dynobj;
8241 if (h->plt.offset != (bfd_vma) -1)
8243 bfd_byte *loc;
8244 bfd_vma plt_address, plt_index, got_address, got_offset, branch_offset;
8245 Elf_Internal_Rela rel;
8246 static const bfd_vma *plt_entry;
8248 BFD_ASSERT (h->dynindx != -1);
8249 BFD_ASSERT (htab->splt != NULL);
8250 BFD_ASSERT (h->plt.offset <= htab->splt->size);
8252 /* Calculate the address of the .plt entry. */
8253 plt_address = (htab->splt->output_section->vma
8254 + htab->splt->output_offset
8255 + h->plt.offset);
8257 /* Calculate the index of the entry. */
8258 plt_index = ((h->plt.offset - htab->plt_header_size)
8259 / htab->plt_entry_size);
8261 /* Calculate the address of the .got.plt entry. */
8262 got_address = (htab->sgotplt->output_section->vma
8263 + htab->sgotplt->output_offset
8264 + plt_index * 4);
8266 /* Calculate the offset of the .got.plt entry from
8267 _GLOBAL_OFFSET_TABLE_. */
8268 got_offset = mips_elf_gotplt_index (info, h);
8270 /* Calculate the offset for the branch at the start of the PLT
8271 entry. The branch jumps to the beginning of .plt. */
8272 branch_offset = -(h->plt.offset / 4 + 1) & 0xffff;
8274 /* Fill in the initial value of the .got.plt entry. */
8275 bfd_put_32 (output_bfd, plt_address,
8276 htab->sgotplt->contents + plt_index * 4);
8278 /* Find out where the .plt entry should go. */
8279 loc = htab->splt->contents + h->plt.offset;
8281 if (info->shared)
8283 plt_entry = mips_vxworks_shared_plt_entry;
8284 bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
8285 bfd_put_32 (output_bfd, plt_entry[1] | plt_index, loc + 4);
8287 else
8289 bfd_vma got_address_high, got_address_low;
8291 plt_entry = mips_vxworks_exec_plt_entry;
8292 got_address_high = ((got_address + 0x8000) >> 16) & 0xffff;
8293 got_address_low = got_address & 0xffff;
8295 bfd_put_32 (output_bfd, plt_entry[0] | branch_offset, loc);
8296 bfd_put_32 (output_bfd, plt_entry[1] | plt_index, loc + 4);
8297 bfd_put_32 (output_bfd, plt_entry[2] | got_address_high, loc + 8);
8298 bfd_put_32 (output_bfd, plt_entry[3] | got_address_low, loc + 12);
8299 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
8300 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
8301 bfd_put_32 (output_bfd, plt_entry[6], loc + 24);
8302 bfd_put_32 (output_bfd, plt_entry[7], loc + 28);
8304 loc = (htab->srelplt2->contents
8305 + (plt_index * 3 + 2) * sizeof (Elf32_External_Rela));
8307 /* Emit a relocation for the .got.plt entry. */
8308 rel.r_offset = got_address;
8309 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
8310 rel.r_addend = h->plt.offset;
8311 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8313 /* Emit a relocation for the lui of %hi(<.got.plt slot>). */
8314 loc += sizeof (Elf32_External_Rela);
8315 rel.r_offset = plt_address + 8;
8316 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
8317 rel.r_addend = got_offset;
8318 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8320 /* Emit a relocation for the addiu of %lo(<.got.plt slot>). */
8321 loc += sizeof (Elf32_External_Rela);
8322 rel.r_offset += 4;
8323 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
8324 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8327 /* Emit an R_MIPS_JUMP_SLOT relocation against the .got.plt entry. */
8328 loc = htab->srelplt->contents + plt_index * sizeof (Elf32_External_Rela);
8329 rel.r_offset = got_address;
8330 rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_JUMP_SLOT);
8331 rel.r_addend = 0;
8332 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8334 if (!h->def_regular)
8335 sym->st_shndx = SHN_UNDEF;
8338 BFD_ASSERT (h->dynindx != -1 || h->forced_local);
8340 sgot = mips_elf_got_section (dynobj, FALSE);
8341 BFD_ASSERT (sgot != NULL);
8342 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
8343 g = mips_elf_section_data (sgot)->u.got_info;
8344 BFD_ASSERT (g != NULL);
8346 /* See if this symbol has an entry in the GOT. */
8347 if (g->global_gotsym != NULL
8348 && h->dynindx >= g->global_gotsym->dynindx)
8350 bfd_vma offset;
8351 Elf_Internal_Rela outrel;
8352 bfd_byte *loc;
8353 asection *s;
8355 /* Install the symbol value in the GOT. */
8356 offset = mips_elf_global_got_index (dynobj, output_bfd, h,
8357 R_MIPS_GOT16, info);
8358 MIPS_ELF_PUT_WORD (output_bfd, sym->st_value, sgot->contents + offset);
8360 /* Add a dynamic relocation for it. */
8361 s = mips_elf_rel_dyn_section (info, FALSE);
8362 loc = s->contents + (s->reloc_count++ * sizeof (Elf32_External_Rela));
8363 outrel.r_offset = (sgot->output_section->vma
8364 + sgot->output_offset
8365 + offset);
8366 outrel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_32);
8367 outrel.r_addend = 0;
8368 bfd_elf32_swap_reloca_out (dynobj, &outrel, loc);
8371 /* Emit a copy reloc, if needed. */
8372 if (h->needs_copy)
8374 Elf_Internal_Rela rel;
8376 BFD_ASSERT (h->dynindx != -1);
8378 rel.r_offset = (h->root.u.def.section->output_section->vma
8379 + h->root.u.def.section->output_offset
8380 + h->root.u.def.value);
8381 rel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_COPY);
8382 rel.r_addend = 0;
8383 bfd_elf32_swap_reloca_out (output_bfd, &rel,
8384 htab->srelbss->contents
8385 + (htab->srelbss->reloc_count
8386 * sizeof (Elf32_External_Rela)));
8387 ++htab->srelbss->reloc_count;
8390 /* If this is a mips16 symbol, force the value to be even. */
8391 if (sym->st_other == STO_MIPS16)
8392 sym->st_value &= ~1;
8394 return TRUE;
8397 /* Install the PLT header for a VxWorks executable and finalize the
8398 contents of .rela.plt.unloaded. */
8400 static void
8401 mips_vxworks_finish_exec_plt (bfd *output_bfd, struct bfd_link_info *info)
8403 Elf_Internal_Rela rela;
8404 bfd_byte *loc;
8405 bfd_vma got_value, got_value_high, got_value_low, plt_address;
8406 static const bfd_vma *plt_entry;
8407 struct mips_elf_link_hash_table *htab;
8409 htab = mips_elf_hash_table (info);
8410 plt_entry = mips_vxworks_exec_plt0_entry;
8412 /* Calculate the value of _GLOBAL_OFFSET_TABLE_. */
8413 got_value = (htab->root.hgot->root.u.def.section->output_section->vma
8414 + htab->root.hgot->root.u.def.section->output_offset
8415 + htab->root.hgot->root.u.def.value);
8417 got_value_high = ((got_value + 0x8000) >> 16) & 0xffff;
8418 got_value_low = got_value & 0xffff;
8420 /* Calculate the address of the PLT header. */
8421 plt_address = htab->splt->output_section->vma + htab->splt->output_offset;
8423 /* Install the PLT header. */
8424 loc = htab->splt->contents;
8425 bfd_put_32 (output_bfd, plt_entry[0] | got_value_high, loc);
8426 bfd_put_32 (output_bfd, plt_entry[1] | got_value_low, loc + 4);
8427 bfd_put_32 (output_bfd, plt_entry[2], loc + 8);
8428 bfd_put_32 (output_bfd, plt_entry[3], loc + 12);
8429 bfd_put_32 (output_bfd, plt_entry[4], loc + 16);
8430 bfd_put_32 (output_bfd, plt_entry[5], loc + 20);
8432 /* Output the relocation for the lui of %hi(_GLOBAL_OFFSET_TABLE_). */
8433 loc = htab->srelplt2->contents;
8434 rela.r_offset = plt_address;
8435 rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
8436 rela.r_addend = 0;
8437 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
8438 loc += sizeof (Elf32_External_Rela);
8440 /* Output the relocation for the following addiu of
8441 %lo(_GLOBAL_OFFSET_TABLE_). */
8442 rela.r_offset += 4;
8443 rela.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
8444 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
8445 loc += sizeof (Elf32_External_Rela);
8447 /* Fix up the remaining relocations. They may have the wrong
8448 symbol index for _G_O_T_ or _P_L_T_ depending on the order
8449 in which symbols were output. */
8450 while (loc < htab->srelplt2->contents + htab->srelplt2->size)
8452 Elf_Internal_Rela rel;
8454 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
8455 rel.r_info = ELF32_R_INFO (htab->root.hplt->indx, R_MIPS_32);
8456 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8457 loc += sizeof (Elf32_External_Rela);
8459 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
8460 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_HI16);
8461 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8462 loc += sizeof (Elf32_External_Rela);
8464 bfd_elf32_swap_reloca_in (output_bfd, loc, &rel);
8465 rel.r_info = ELF32_R_INFO (htab->root.hgot->indx, R_MIPS_LO16);
8466 bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
8467 loc += sizeof (Elf32_External_Rela);
8471 /* Install the PLT header for a VxWorks shared library. */
8473 static void
8474 mips_vxworks_finish_shared_plt (bfd *output_bfd, struct bfd_link_info *info)
8476 unsigned int i;
8477 struct mips_elf_link_hash_table *htab;
8479 htab = mips_elf_hash_table (info);
8481 /* We just need to copy the entry byte-by-byte. */
8482 for (i = 0; i < ARRAY_SIZE (mips_vxworks_shared_plt0_entry); i++)
8483 bfd_put_32 (output_bfd, mips_vxworks_shared_plt0_entry[i],
8484 htab->splt->contents + i * 4);
8487 /* Finish up the dynamic sections. */
8489 bfd_boolean
8490 _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
8491 struct bfd_link_info *info)
8493 bfd *dynobj;
8494 asection *sdyn;
8495 asection *sgot;
8496 struct mips_got_info *gg, *g;
8497 struct mips_elf_link_hash_table *htab;
8499 htab = mips_elf_hash_table (info);
8500 dynobj = elf_hash_table (info)->dynobj;
8502 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
8504 sgot = mips_elf_got_section (dynobj, FALSE);
8505 if (sgot == NULL)
8506 gg = g = NULL;
8507 else
8509 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
8510 gg = mips_elf_section_data (sgot)->u.got_info;
8511 BFD_ASSERT (gg != NULL);
8512 g = mips_elf_got_for_ibfd (gg, output_bfd);
8513 BFD_ASSERT (g != NULL);
8516 if (elf_hash_table (info)->dynamic_sections_created)
8518 bfd_byte *b;
8519 int dyn_to_skip = 0, dyn_skipped = 0;
8521 BFD_ASSERT (sdyn != NULL);
8522 BFD_ASSERT (g != NULL);
8524 for (b = sdyn->contents;
8525 b < sdyn->contents + sdyn->size;
8526 b += MIPS_ELF_DYN_SIZE (dynobj))
8528 Elf_Internal_Dyn dyn;
8529 const char *name;
8530 size_t elemsize;
8531 asection *s;
8532 bfd_boolean swap_out_p;
8534 /* Read in the current dynamic entry. */
8535 (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
8537 /* Assume that we're going to modify it and write it out. */
8538 swap_out_p = TRUE;
8540 switch (dyn.d_tag)
8542 case DT_RELENT:
8543 dyn.d_un.d_val = MIPS_ELF_REL_SIZE (dynobj);
8544 break;
8546 case DT_RELAENT:
8547 BFD_ASSERT (htab->is_vxworks);
8548 dyn.d_un.d_val = MIPS_ELF_RELA_SIZE (dynobj);
8549 break;
8551 case DT_STRSZ:
8552 /* Rewrite DT_STRSZ. */
8553 dyn.d_un.d_val =
8554 _bfd_elf_strtab_size (elf_hash_table (info)->dynstr);
8555 break;
8557 case DT_PLTGOT:
8558 name = ".got";
8559 if (htab->is_vxworks)
8561 /* _GLOBAL_OFFSET_TABLE_ is defined to be the beginning
8562 of the ".got" section in DYNOBJ. */
8563 s = bfd_get_section_by_name (dynobj, name);
8564 BFD_ASSERT (s != NULL);
8565 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
8567 else
8569 s = bfd_get_section_by_name (output_bfd, name);
8570 BFD_ASSERT (s != NULL);
8571 dyn.d_un.d_ptr = s->vma;
8573 break;
8575 case DT_MIPS_RLD_VERSION:
8576 dyn.d_un.d_val = 1; /* XXX */
8577 break;
8579 case DT_MIPS_FLAGS:
8580 dyn.d_un.d_val = RHF_NOTPOT; /* XXX */
8581 break;
8583 case DT_MIPS_TIME_STAMP:
8585 time_t t;
8586 time (&t);
8587 dyn.d_un.d_val = t;
8589 break;
8591 case DT_MIPS_ICHECKSUM:
8592 /* XXX FIXME: */
8593 swap_out_p = FALSE;
8594 break;
8596 case DT_MIPS_IVERSION:
8597 /* XXX FIXME: */
8598 swap_out_p = FALSE;
8599 break;
8601 case DT_MIPS_BASE_ADDRESS:
8602 s = output_bfd->sections;
8603 BFD_ASSERT (s != NULL);
8604 dyn.d_un.d_ptr = s->vma & ~(bfd_vma) 0xffff;
8605 break;
8607 case DT_MIPS_LOCAL_GOTNO:
8608 dyn.d_un.d_val = g->local_gotno;
8609 break;
8611 case DT_MIPS_UNREFEXTNO:
8612 /* The index into the dynamic symbol table which is the
8613 entry of the first external symbol that is not
8614 referenced within the same object. */
8615 dyn.d_un.d_val = bfd_count_sections (output_bfd) + 1;
8616 break;
8618 case DT_MIPS_GOTSYM:
8619 if (gg->global_gotsym)
8621 dyn.d_un.d_val = gg->global_gotsym->dynindx;
8622 break;
8624 /* In case if we don't have global got symbols we default
8625 to setting DT_MIPS_GOTSYM to the same value as
8626 DT_MIPS_SYMTABNO, so we just fall through. */
8628 case DT_MIPS_SYMTABNO:
8629 name = ".dynsym";
8630 elemsize = MIPS_ELF_SYM_SIZE (output_bfd);
8631 s = bfd_get_section_by_name (output_bfd, name);
8632 BFD_ASSERT (s != NULL);
8634 dyn.d_un.d_val = s->size / elemsize;
8635 break;
8637 case DT_MIPS_HIPAGENO:
8638 dyn.d_un.d_val = g->local_gotno - MIPS_RESERVED_GOTNO (info);
8639 break;
8641 case DT_MIPS_RLD_MAP:
8642 dyn.d_un.d_ptr = mips_elf_hash_table (info)->rld_value;
8643 break;
8645 case DT_MIPS_OPTIONS:
8646 s = (bfd_get_section_by_name
8647 (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (output_bfd)));
8648 dyn.d_un.d_ptr = s->vma;
8649 break;
8651 case DT_RELASZ:
8652 BFD_ASSERT (htab->is_vxworks);
8653 /* The count does not include the JUMP_SLOT relocations. */
8654 if (htab->srelplt)
8655 dyn.d_un.d_val -= htab->srelplt->size;
8656 break;
8658 case DT_PLTREL:
8659 BFD_ASSERT (htab->is_vxworks);
8660 dyn.d_un.d_val = DT_RELA;
8661 break;
8663 case DT_PLTRELSZ:
8664 BFD_ASSERT (htab->is_vxworks);
8665 dyn.d_un.d_val = htab->srelplt->size;
8666 break;
8668 case DT_JMPREL:
8669 BFD_ASSERT (htab->is_vxworks);
8670 dyn.d_un.d_val = (htab->srelplt->output_section->vma
8671 + htab->srelplt->output_offset);
8672 break;
8674 case DT_TEXTREL:
8675 /* If we didn't need any text relocations after all, delete
8676 the dynamic tag. */
8677 if (!(info->flags & DF_TEXTREL))
8679 dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
8680 swap_out_p = FALSE;
8682 break;
8684 case DT_FLAGS:
8685 /* If we didn't need any text relocations after all, clear
8686 DF_TEXTREL from DT_FLAGS. */
8687 if (!(info->flags & DF_TEXTREL))
8688 dyn.d_un.d_val &= ~DF_TEXTREL;
8689 else
8690 swap_out_p = FALSE;
8691 break;
8693 default:
8694 swap_out_p = FALSE;
8695 break;
8698 if (swap_out_p || dyn_skipped)
8699 (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
8700 (dynobj, &dyn, b - dyn_skipped);
8702 if (dyn_to_skip)
8704 dyn_skipped += dyn_to_skip;
8705 dyn_to_skip = 0;
8709 /* Wipe out any trailing entries if we shifted down a dynamic tag. */
8710 if (dyn_skipped > 0)
8711 memset (b - dyn_skipped, 0, dyn_skipped);
8714 if (sgot != NULL && sgot->size > 0)
8716 if (htab->is_vxworks)
8718 /* The first entry of the global offset table points to the
8719 ".dynamic" section. The second is initialized by the
8720 loader and contains the shared library identifier.
8721 The third is also initialized by the loader and points
8722 to the lazy resolution stub. */
8723 MIPS_ELF_PUT_WORD (output_bfd,
8724 sdyn->output_offset + sdyn->output_section->vma,
8725 sgot->contents);
8726 MIPS_ELF_PUT_WORD (output_bfd, 0,
8727 sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
8728 MIPS_ELF_PUT_WORD (output_bfd, 0,
8729 sgot->contents
8730 + 2 * MIPS_ELF_GOT_SIZE (output_bfd));
8732 else
8734 /* The first entry of the global offset table will be filled at
8735 runtime. The second entry will be used by some runtime loaders.
8736 This isn't the case of IRIX rld. */
8737 MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0, sgot->contents);
8738 MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0x80000000,
8739 sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
8743 if (sgot != NULL)
8744 elf_section_data (sgot->output_section)->this_hdr.sh_entsize
8745 = MIPS_ELF_GOT_SIZE (output_bfd);
8747 /* Generate dynamic relocations for the non-primary gots. */
8748 if (gg != NULL && gg->next)
8750 Elf_Internal_Rela rel[3];
8751 bfd_vma addend = 0;
8753 memset (rel, 0, sizeof (rel));
8754 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_REL32);
8756 for (g = gg->next; g->next != gg; g = g->next)
8758 bfd_vma index = g->next->local_gotno + g->next->global_gotno
8759 + g->next->tls_gotno;
8761 MIPS_ELF_PUT_WORD (output_bfd, 0, sgot->contents
8762 + index++ * MIPS_ELF_GOT_SIZE (output_bfd));
8763 MIPS_ELF_PUT_WORD (output_bfd, 0x80000000, sgot->contents
8764 + index++ * MIPS_ELF_GOT_SIZE (output_bfd));
8766 if (! info->shared)
8767 continue;
8769 while (index < g->assigned_gotno)
8771 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset
8772 = index++ * MIPS_ELF_GOT_SIZE (output_bfd);
8773 if (!(mips_elf_create_dynamic_relocation
8774 (output_bfd, info, rel, NULL,
8775 bfd_abs_section_ptr,
8776 0, &addend, sgot)))
8777 return FALSE;
8778 BFD_ASSERT (addend == 0);
8783 /* The generation of dynamic relocations for the non-primary gots
8784 adds more dynamic relocations. We cannot count them until
8785 here. */
8787 if (elf_hash_table (info)->dynamic_sections_created)
8789 bfd_byte *b;
8790 bfd_boolean swap_out_p;
8792 BFD_ASSERT (sdyn != NULL);
8794 for (b = sdyn->contents;
8795 b < sdyn->contents + sdyn->size;
8796 b += MIPS_ELF_DYN_SIZE (dynobj))
8798 Elf_Internal_Dyn dyn;
8799 asection *s;
8801 /* Read in the current dynamic entry. */
8802 (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
8804 /* Assume that we're going to modify it and write it out. */
8805 swap_out_p = TRUE;
8807 switch (dyn.d_tag)
8809 case DT_RELSZ:
8810 /* Reduce DT_RELSZ to account for any relocations we
8811 decided not to make. This is for the n64 irix rld,
8812 which doesn't seem to apply any relocations if there
8813 are trailing null entries. */
8814 s = mips_elf_rel_dyn_section (info, FALSE);
8815 dyn.d_un.d_val = (s->reloc_count
8816 * (ABI_64_P (output_bfd)
8817 ? sizeof (Elf64_Mips_External_Rel)
8818 : sizeof (Elf32_External_Rel)));
8819 break;
8821 default:
8822 swap_out_p = FALSE;
8823 break;
8826 if (swap_out_p)
8827 (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
8828 (dynobj, &dyn, b);
8833 asection *s;
8834 Elf32_compact_rel cpt;
8836 if (SGI_COMPAT (output_bfd))
8838 /* Write .compact_rel section out. */
8839 s = bfd_get_section_by_name (dynobj, ".compact_rel");
8840 if (s != NULL)
8842 cpt.id1 = 1;
8843 cpt.num = s->reloc_count;
8844 cpt.id2 = 2;
8845 cpt.offset = (s->output_section->filepos
8846 + sizeof (Elf32_External_compact_rel));
8847 cpt.reserved0 = 0;
8848 cpt.reserved1 = 0;
8849 bfd_elf32_swap_compact_rel_out (output_bfd, &cpt,
8850 ((Elf32_External_compact_rel *)
8851 s->contents));
8853 /* Clean up a dummy stub function entry in .text. */
8854 s = bfd_get_section_by_name (dynobj,
8855 MIPS_ELF_STUB_SECTION_NAME (dynobj));
8856 if (s != NULL)
8858 file_ptr dummy_offset;
8860 BFD_ASSERT (s->size >= MIPS_FUNCTION_STUB_SIZE (info));
8861 dummy_offset = s->size - MIPS_FUNCTION_STUB_SIZE (info);
8862 memset (s->contents + dummy_offset, 0,
8863 MIPS_FUNCTION_STUB_SIZE (info));
8868 /* The psABI says that the dynamic relocations must be sorted in
8869 increasing order of r_symndx. The VxWorks EABI doesn't require
8870 this, and because the code below handles REL rather than RELA
8871 relocations, using it for VxWorks would be outright harmful. */
8872 if (!htab->is_vxworks)
8874 s = mips_elf_rel_dyn_section (info, FALSE);
8875 if (s != NULL
8876 && s->size > (bfd_vma)2 * MIPS_ELF_REL_SIZE (output_bfd))
8878 reldyn_sorting_bfd = output_bfd;
8880 if (ABI_64_P (output_bfd))
8881 qsort ((Elf64_External_Rel *) s->contents + 1,
8882 s->reloc_count - 1, sizeof (Elf64_Mips_External_Rel),
8883 sort_dynamic_relocs_64);
8884 else
8885 qsort ((Elf32_External_Rel *) s->contents + 1,
8886 s->reloc_count - 1, sizeof (Elf32_External_Rel),
8887 sort_dynamic_relocs);
8892 if (htab->is_vxworks && htab->splt->size > 0)
8894 if (info->shared)
8895 mips_vxworks_finish_shared_plt (output_bfd, info);
8896 else
8897 mips_vxworks_finish_exec_plt (output_bfd, info);
8899 return TRUE;
8903 /* Set ABFD's EF_MIPS_ARCH and EF_MIPS_MACH flags. */
8905 static void
8906 mips_set_isa_flags (bfd *abfd)
8908 flagword val;
8910 switch (bfd_get_mach (abfd))
8912 default:
8913 case bfd_mach_mips3000:
8914 val = E_MIPS_ARCH_1;
8915 break;
8917 case bfd_mach_mips3900:
8918 val = E_MIPS_ARCH_1 | E_MIPS_MACH_3900;
8919 break;
8921 case bfd_mach_mips6000:
8922 val = E_MIPS_ARCH_2;
8923 break;
8925 case bfd_mach_mips4000:
8926 case bfd_mach_mips4300:
8927 case bfd_mach_mips4400:
8928 case bfd_mach_mips4600:
8929 val = E_MIPS_ARCH_3;
8930 break;
8932 case bfd_mach_mips4010:
8933 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4010;
8934 break;
8936 case bfd_mach_mips4100:
8937 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4100;
8938 break;
8940 case bfd_mach_mips4111:
8941 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4111;
8942 break;
8944 case bfd_mach_mips4120:
8945 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4120;
8946 break;
8948 case bfd_mach_mips4650:
8949 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4650;
8950 break;
8952 case bfd_mach_mips5400:
8953 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5400;
8954 break;
8956 case bfd_mach_mips5500:
8957 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5500;
8958 break;
8960 case bfd_mach_mips9000:
8961 val = E_MIPS_ARCH_4 | E_MIPS_MACH_9000;
8962 break;
8964 case bfd_mach_mips5000:
8965 case bfd_mach_mips7000:
8966 case bfd_mach_mips8000:
8967 case bfd_mach_mips10000:
8968 case bfd_mach_mips12000:
8969 val = E_MIPS_ARCH_4;
8970 break;
8972 case bfd_mach_mips5:
8973 val = E_MIPS_ARCH_5;
8974 break;
8976 case bfd_mach_mips_sb1:
8977 val = E_MIPS_ARCH_64 | E_MIPS_MACH_SB1;
8978 break;
8980 case bfd_mach_mipsisa32:
8981 val = E_MIPS_ARCH_32;
8982 break;
8984 case bfd_mach_mipsisa64:
8985 val = E_MIPS_ARCH_64;
8986 break;
8988 case bfd_mach_mipsisa32r2:
8989 val = E_MIPS_ARCH_32R2;
8990 break;
8992 case bfd_mach_mipsisa64r2:
8993 val = E_MIPS_ARCH_64R2;
8994 break;
8996 elf_elfheader (abfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
8997 elf_elfheader (abfd)->e_flags |= val;
9002 /* The final processing done just before writing out a MIPS ELF object
9003 file. This gets the MIPS architecture right based on the machine
9004 number. This is used by both the 32-bit and the 64-bit ABI. */
9006 void
9007 _bfd_mips_elf_final_write_processing (bfd *abfd,
9008 bfd_boolean linker ATTRIBUTE_UNUSED)
9010 unsigned int i;
9011 Elf_Internal_Shdr **hdrpp;
9012 const char *name;
9013 asection *sec;
9015 /* Keep the existing EF_MIPS_MACH and EF_MIPS_ARCH flags if the former
9016 is nonzero. This is for compatibility with old objects, which used
9017 a combination of a 32-bit EF_MIPS_ARCH and a 64-bit EF_MIPS_MACH. */
9018 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == 0)
9019 mips_set_isa_flags (abfd);
9021 /* Set the sh_info field for .gptab sections and other appropriate
9022 info for each special section. */
9023 for (i = 1, hdrpp = elf_elfsections (abfd) + 1;
9024 i < elf_numsections (abfd);
9025 i++, hdrpp++)
9027 switch ((*hdrpp)->sh_type)
9029 case SHT_MIPS_MSYM:
9030 case SHT_MIPS_LIBLIST:
9031 sec = bfd_get_section_by_name (abfd, ".dynstr");
9032 if (sec != NULL)
9033 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
9034 break;
9036 case SHT_MIPS_GPTAB:
9037 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
9038 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
9039 BFD_ASSERT (name != NULL
9040 && strncmp (name, ".gptab.", sizeof ".gptab." - 1) == 0);
9041 sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
9042 BFD_ASSERT (sec != NULL);
9043 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
9044 break;
9046 case SHT_MIPS_CONTENT:
9047 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
9048 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
9049 BFD_ASSERT (name != NULL
9050 && strncmp (name, ".MIPS.content",
9051 sizeof ".MIPS.content" - 1) == 0);
9052 sec = bfd_get_section_by_name (abfd,
9053 name + sizeof ".MIPS.content" - 1);
9054 BFD_ASSERT (sec != NULL);
9055 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
9056 break;
9058 case SHT_MIPS_SYMBOL_LIB:
9059 sec = bfd_get_section_by_name (abfd, ".dynsym");
9060 if (sec != NULL)
9061 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
9062 sec = bfd_get_section_by_name (abfd, ".liblist");
9063 if (sec != NULL)
9064 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
9065 break;
9067 case SHT_MIPS_EVENTS:
9068 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
9069 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
9070 BFD_ASSERT (name != NULL);
9071 if (strncmp (name, ".MIPS.events", sizeof ".MIPS.events" - 1) == 0)
9072 sec = bfd_get_section_by_name (abfd,
9073 name + sizeof ".MIPS.events" - 1);
9074 else
9076 BFD_ASSERT (strncmp (name, ".MIPS.post_rel",
9077 sizeof ".MIPS.post_rel" - 1) == 0);
9078 sec = bfd_get_section_by_name (abfd,
9079 (name
9080 + sizeof ".MIPS.post_rel" - 1));
9082 BFD_ASSERT (sec != NULL);
9083 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
9084 break;
9090 /* When creating an IRIX5 executable, we need REGINFO and RTPROC
9091 segments. */
9094 _bfd_mips_elf_additional_program_headers (bfd *abfd)
9096 asection *s;
9097 int ret = 0;
9099 /* See if we need a PT_MIPS_REGINFO segment. */
9100 s = bfd_get_section_by_name (abfd, ".reginfo");
9101 if (s && (s->flags & SEC_LOAD))
9102 ++ret;
9104 /* See if we need a PT_MIPS_OPTIONS segment. */
9105 if (IRIX_COMPAT (abfd) == ict_irix6
9106 && bfd_get_section_by_name (abfd,
9107 MIPS_ELF_OPTIONS_SECTION_NAME (abfd)))
9108 ++ret;
9110 /* See if we need a PT_MIPS_RTPROC segment. */
9111 if (IRIX_COMPAT (abfd) == ict_irix5
9112 && bfd_get_section_by_name (abfd, ".dynamic")
9113 && bfd_get_section_by_name (abfd, ".mdebug"))
9114 ++ret;
9116 return ret;
9119 /* Modify the segment map for an IRIX5 executable. */
9121 bfd_boolean
9122 _bfd_mips_elf_modify_segment_map (bfd *abfd,
9123 struct bfd_link_info *info ATTRIBUTE_UNUSED)
9125 asection *s;
9126 struct elf_segment_map *m, **pm;
9127 bfd_size_type amt;
9129 /* If there is a .reginfo section, we need a PT_MIPS_REGINFO
9130 segment. */
9131 s = bfd_get_section_by_name (abfd, ".reginfo");
9132 if (s != NULL && (s->flags & SEC_LOAD) != 0)
9134 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
9135 if (m->p_type == PT_MIPS_REGINFO)
9136 break;
9137 if (m == NULL)
9139 amt = sizeof *m;
9140 m = bfd_zalloc (abfd, amt);
9141 if (m == NULL)
9142 return FALSE;
9144 m->p_type = PT_MIPS_REGINFO;
9145 m->count = 1;
9146 m->sections[0] = s;
9148 /* We want to put it after the PHDR and INTERP segments. */
9149 pm = &elf_tdata (abfd)->segment_map;
9150 while (*pm != NULL
9151 && ((*pm)->p_type == PT_PHDR
9152 || (*pm)->p_type == PT_INTERP))
9153 pm = &(*pm)->next;
9155 m->next = *pm;
9156 *pm = m;
9160 /* For IRIX 6, we don't have .mdebug sections, nor does anything but
9161 .dynamic end up in PT_DYNAMIC. However, we do have to insert a
9162 PT_MIPS_OPTIONS segment immediately following the program header
9163 table. */
9164 if (NEWABI_P (abfd)
9165 /* On non-IRIX6 new abi, we'll have already created a segment
9166 for this section, so don't create another. I'm not sure this
9167 is not also the case for IRIX 6, but I can't test it right
9168 now. */
9169 && IRIX_COMPAT (abfd) == ict_irix6)
9171 for (s = abfd->sections; s; s = s->next)
9172 if (elf_section_data (s)->this_hdr.sh_type == SHT_MIPS_OPTIONS)
9173 break;
9175 if (s)
9177 struct elf_segment_map *options_segment;
9179 pm = &elf_tdata (abfd)->segment_map;
9180 while (*pm != NULL
9181 && ((*pm)->p_type == PT_PHDR
9182 || (*pm)->p_type == PT_INTERP))
9183 pm = &(*pm)->next;
9185 amt = sizeof (struct elf_segment_map);
9186 options_segment = bfd_zalloc (abfd, amt);
9187 options_segment->next = *pm;
9188 options_segment->p_type = PT_MIPS_OPTIONS;
9189 options_segment->p_flags = PF_R;
9190 options_segment->p_flags_valid = TRUE;
9191 options_segment->count = 1;
9192 options_segment->sections[0] = s;
9193 *pm = options_segment;
9196 else
9198 if (IRIX_COMPAT (abfd) == ict_irix5)
9200 /* If there are .dynamic and .mdebug sections, we make a room
9201 for the RTPROC header. FIXME: Rewrite without section names. */
9202 if (bfd_get_section_by_name (abfd, ".interp") == NULL
9203 && bfd_get_section_by_name (abfd, ".dynamic") != NULL
9204 && bfd_get_section_by_name (abfd, ".mdebug") != NULL)
9206 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
9207 if (m->p_type == PT_MIPS_RTPROC)
9208 break;
9209 if (m == NULL)
9211 amt = sizeof *m;
9212 m = bfd_zalloc (abfd, amt);
9213 if (m == NULL)
9214 return FALSE;
9216 m->p_type = PT_MIPS_RTPROC;
9218 s = bfd_get_section_by_name (abfd, ".rtproc");
9219 if (s == NULL)
9221 m->count = 0;
9222 m->p_flags = 0;
9223 m->p_flags_valid = 1;
9225 else
9227 m->count = 1;
9228 m->sections[0] = s;
9231 /* We want to put it after the DYNAMIC segment. */
9232 pm = &elf_tdata (abfd)->segment_map;
9233 while (*pm != NULL && (*pm)->p_type != PT_DYNAMIC)
9234 pm = &(*pm)->next;
9235 if (*pm != NULL)
9236 pm = &(*pm)->next;
9238 m->next = *pm;
9239 *pm = m;
9243 /* On IRIX5, the PT_DYNAMIC segment includes the .dynamic,
9244 .dynstr, .dynsym, and .hash sections, and everything in
9245 between. */
9246 for (pm = &elf_tdata (abfd)->segment_map; *pm != NULL;
9247 pm = &(*pm)->next)
9248 if ((*pm)->p_type == PT_DYNAMIC)
9249 break;
9250 m = *pm;
9251 if (m != NULL && IRIX_COMPAT (abfd) == ict_none)
9253 /* For a normal mips executable the permissions for the PT_DYNAMIC
9254 segment are read, write and execute. We do that here since
9255 the code in elf.c sets only the read permission. This matters
9256 sometimes for the dynamic linker. */
9257 if (bfd_get_section_by_name (abfd, ".dynamic") != NULL)
9259 m->p_flags = PF_R | PF_W | PF_X;
9260 m->p_flags_valid = 1;
9263 if (m != NULL
9264 && m->count == 1 && strcmp (m->sections[0]->name, ".dynamic") == 0)
9266 static const char *sec_names[] =
9268 ".dynamic", ".dynstr", ".dynsym", ".hash"
9270 bfd_vma low, high;
9271 unsigned int i, c;
9272 struct elf_segment_map *n;
9274 low = ~(bfd_vma) 0;
9275 high = 0;
9276 for (i = 0; i < sizeof sec_names / sizeof sec_names[0]; i++)
9278 s = bfd_get_section_by_name (abfd, sec_names[i]);
9279 if (s != NULL && (s->flags & SEC_LOAD) != 0)
9281 bfd_size_type sz;
9283 if (low > s->vma)
9284 low = s->vma;
9285 sz = s->size;
9286 if (high < s->vma + sz)
9287 high = s->vma + sz;
9291 c = 0;
9292 for (s = abfd->sections; s != NULL; s = s->next)
9293 if ((s->flags & SEC_LOAD) != 0
9294 && s->vma >= low
9295 && s->vma + s->size <= high)
9296 ++c;
9298 amt = sizeof *n + (bfd_size_type) (c - 1) * sizeof (asection *);
9299 n = bfd_zalloc (abfd, amt);
9300 if (n == NULL)
9301 return FALSE;
9302 *n = *m;
9303 n->count = c;
9305 i = 0;
9306 for (s = abfd->sections; s != NULL; s = s->next)
9308 if ((s->flags & SEC_LOAD) != 0
9309 && s->vma >= low
9310 && s->vma + s->size <= high)
9312 n->sections[i] = s;
9313 ++i;
9317 *pm = n;
9321 return TRUE;
9324 /* Return the section that should be marked against GC for a given
9325 relocation. */
9327 asection *
9328 _bfd_mips_elf_gc_mark_hook (asection *sec,
9329 struct bfd_link_info *info ATTRIBUTE_UNUSED,
9330 Elf_Internal_Rela *rel,
9331 struct elf_link_hash_entry *h,
9332 Elf_Internal_Sym *sym)
9334 /* ??? Do mips16 stub sections need to be handled special? */
9336 if (h != NULL)
9338 switch (ELF_R_TYPE (sec->owner, rel->r_info))
9340 case R_MIPS_GNU_VTINHERIT:
9341 case R_MIPS_GNU_VTENTRY:
9342 break;
9344 default:
9345 switch (h->root.type)
9347 case bfd_link_hash_defined:
9348 case bfd_link_hash_defweak:
9349 return h->root.u.def.section;
9351 case bfd_link_hash_common:
9352 return h->root.u.c.p->section;
9354 default:
9355 break;
9359 else
9360 return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
9362 return NULL;
9365 /* Update the got entry reference counts for the section being removed. */
9367 bfd_boolean
9368 _bfd_mips_elf_gc_sweep_hook (bfd *abfd ATTRIBUTE_UNUSED,
9369 struct bfd_link_info *info ATTRIBUTE_UNUSED,
9370 asection *sec ATTRIBUTE_UNUSED,
9371 const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED)
9373 #if 0
9374 Elf_Internal_Shdr *symtab_hdr;
9375 struct elf_link_hash_entry **sym_hashes;
9376 bfd_signed_vma *local_got_refcounts;
9377 const Elf_Internal_Rela *rel, *relend;
9378 unsigned long r_symndx;
9379 struct elf_link_hash_entry *h;
9381 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
9382 sym_hashes = elf_sym_hashes (abfd);
9383 local_got_refcounts = elf_local_got_refcounts (abfd);
9385 relend = relocs + sec->reloc_count;
9386 for (rel = relocs; rel < relend; rel++)
9387 switch (ELF_R_TYPE (abfd, rel->r_info))
9389 case R_MIPS_GOT16:
9390 case R_MIPS_CALL16:
9391 case R_MIPS_CALL_HI16:
9392 case R_MIPS_CALL_LO16:
9393 case R_MIPS_GOT_HI16:
9394 case R_MIPS_GOT_LO16:
9395 case R_MIPS_GOT_DISP:
9396 case R_MIPS_GOT_PAGE:
9397 case R_MIPS_GOT_OFST:
9398 /* ??? It would seem that the existing MIPS code does no sort
9399 of reference counting or whatnot on its GOT and PLT entries,
9400 so it is not possible to garbage collect them at this time. */
9401 break;
9403 default:
9404 break;
9406 #endif
9408 return TRUE;
9411 /* Copy data from a MIPS ELF indirect symbol to its direct symbol,
9412 hiding the old indirect symbol. Process additional relocation
9413 information. Also called for weakdefs, in which case we just let
9414 _bfd_elf_link_hash_copy_indirect copy the flags for us. */
9416 void
9417 _bfd_mips_elf_copy_indirect_symbol (struct bfd_link_info *info,
9418 struct elf_link_hash_entry *dir,
9419 struct elf_link_hash_entry *ind)
9421 struct mips_elf_link_hash_entry *dirmips, *indmips;
9423 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
9425 if (ind->root.type != bfd_link_hash_indirect)
9426 return;
9428 dirmips = (struct mips_elf_link_hash_entry *) dir;
9429 indmips = (struct mips_elf_link_hash_entry *) ind;
9430 dirmips->possibly_dynamic_relocs += indmips->possibly_dynamic_relocs;
9431 if (indmips->readonly_reloc)
9432 dirmips->readonly_reloc = TRUE;
9433 if (indmips->no_fn_stub)
9434 dirmips->no_fn_stub = TRUE;
9436 if (dirmips->tls_type == 0)
9437 dirmips->tls_type = indmips->tls_type;
9440 void
9441 _bfd_mips_elf_hide_symbol (struct bfd_link_info *info,
9442 struct elf_link_hash_entry *entry,
9443 bfd_boolean force_local)
9445 bfd *dynobj;
9446 asection *got;
9447 struct mips_got_info *g;
9448 struct mips_elf_link_hash_entry *h;
9450 h = (struct mips_elf_link_hash_entry *) entry;
9451 if (h->forced_local)
9452 return;
9453 h->forced_local = force_local;
9455 dynobj = elf_hash_table (info)->dynobj;
9456 if (dynobj != NULL && force_local && h->root.type != STT_TLS
9457 && (got = mips_elf_got_section (dynobj, TRUE)) != NULL
9458 && (g = mips_elf_section_data (got)->u.got_info) != NULL)
9460 if (g->next)
9462 struct mips_got_entry e;
9463 struct mips_got_info *gg = g;
9465 /* Since we're turning what used to be a global symbol into a
9466 local one, bump up the number of local entries of each GOT
9467 that had an entry for it. This will automatically decrease
9468 the number of global entries, since global_gotno is actually
9469 the upper limit of global entries. */
9470 e.abfd = dynobj;
9471 e.symndx = -1;
9472 e.d.h = h;
9473 e.tls_type = 0;
9475 for (g = g->next; g != gg; g = g->next)
9476 if (htab_find (g->got_entries, &e))
9478 BFD_ASSERT (g->global_gotno > 0);
9479 g->local_gotno++;
9480 g->global_gotno--;
9483 /* If this was a global symbol forced into the primary GOT, we
9484 no longer need an entry for it. We can't release the entry
9485 at this point, but we must at least stop counting it as one
9486 of the symbols that required a forced got entry. */
9487 if (h->root.got.offset == 2)
9489 BFD_ASSERT (gg->assigned_gotno > 0);
9490 gg->assigned_gotno--;
9493 else if (g->global_gotno == 0 && g->global_gotsym == NULL)
9494 /* If we haven't got through GOT allocation yet, just bump up the
9495 number of local entries, as this symbol won't be counted as
9496 global. */
9497 g->local_gotno++;
9498 else if (h->root.got.offset == 1)
9500 /* If we're past non-multi-GOT allocation and this symbol had
9501 been marked for a global got entry, give it a local entry
9502 instead. */
9503 BFD_ASSERT (g->global_gotno > 0);
9504 g->local_gotno++;
9505 g->global_gotno--;
9509 _bfd_elf_link_hash_hide_symbol (info, &h->root, force_local);
9512 #define PDR_SIZE 32
9514 bfd_boolean
9515 _bfd_mips_elf_discard_info (bfd *abfd, struct elf_reloc_cookie *cookie,
9516 struct bfd_link_info *info)
9518 asection *o;
9519 bfd_boolean ret = FALSE;
9520 unsigned char *tdata;
9521 size_t i, skip;
9523 o = bfd_get_section_by_name (abfd, ".pdr");
9524 if (! o)
9525 return FALSE;
9526 if (o->size == 0)
9527 return FALSE;
9528 if (o->size % PDR_SIZE != 0)
9529 return FALSE;
9530 if (o->output_section != NULL
9531 && bfd_is_abs_section (o->output_section))
9532 return FALSE;
9534 tdata = bfd_zmalloc (o->size / PDR_SIZE);
9535 if (! tdata)
9536 return FALSE;
9538 cookie->rels = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
9539 info->keep_memory);
9540 if (!cookie->rels)
9542 free (tdata);
9543 return FALSE;
9546 cookie->rel = cookie->rels;
9547 cookie->relend = cookie->rels + o->reloc_count;
9549 for (i = 0, skip = 0; i < o->size / PDR_SIZE; i ++)
9551 if (bfd_elf_reloc_symbol_deleted_p (i * PDR_SIZE, cookie))
9553 tdata[i] = 1;
9554 skip ++;
9558 if (skip != 0)
9560 mips_elf_section_data (o)->u.tdata = tdata;
9561 o->size -= skip * PDR_SIZE;
9562 ret = TRUE;
9564 else
9565 free (tdata);
9567 if (! info->keep_memory)
9568 free (cookie->rels);
9570 return ret;
9573 bfd_boolean
9574 _bfd_mips_elf_ignore_discarded_relocs (asection *sec)
9576 if (strcmp (sec->name, ".pdr") == 0)
9577 return TRUE;
9578 return FALSE;
9581 bfd_boolean
9582 _bfd_mips_elf_write_section (bfd *output_bfd, asection *sec,
9583 bfd_byte *contents)
9585 bfd_byte *to, *from, *end;
9586 int i;
9588 if (strcmp (sec->name, ".pdr") != 0)
9589 return FALSE;
9591 if (mips_elf_section_data (sec)->u.tdata == NULL)
9592 return FALSE;
9594 to = contents;
9595 end = contents + sec->size;
9596 for (from = contents, i = 0;
9597 from < end;
9598 from += PDR_SIZE, i++)
9600 if ((mips_elf_section_data (sec)->u.tdata)[i] == 1)
9601 continue;
9602 if (to != from)
9603 memcpy (to, from, PDR_SIZE);
9604 to += PDR_SIZE;
9606 bfd_set_section_contents (output_bfd, sec->output_section, contents,
9607 sec->output_offset, sec->size);
9608 return TRUE;
9611 /* MIPS ELF uses a special find_nearest_line routine in order the
9612 handle the ECOFF debugging information. */
9614 struct mips_elf_find_line
9616 struct ecoff_debug_info d;
9617 struct ecoff_find_line i;
9620 bfd_boolean
9621 _bfd_mips_elf_find_nearest_line (bfd *abfd, asection *section,
9622 asymbol **symbols, bfd_vma offset,
9623 const char **filename_ptr,
9624 const char **functionname_ptr,
9625 unsigned int *line_ptr)
9627 asection *msec;
9629 if (_bfd_dwarf1_find_nearest_line (abfd, section, symbols, offset,
9630 filename_ptr, functionname_ptr,
9631 line_ptr))
9632 return TRUE;
9634 if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
9635 filename_ptr, functionname_ptr,
9636 line_ptr, ABI_64_P (abfd) ? 8 : 0,
9637 &elf_tdata (abfd)->dwarf2_find_line_info))
9638 return TRUE;
9640 msec = bfd_get_section_by_name (abfd, ".mdebug");
9641 if (msec != NULL)
9643 flagword origflags;
9644 struct mips_elf_find_line *fi;
9645 const struct ecoff_debug_swap * const swap =
9646 get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
9648 /* If we are called during a link, mips_elf_final_link may have
9649 cleared the SEC_HAS_CONTENTS field. We force it back on here
9650 if appropriate (which it normally will be). */
9651 origflags = msec->flags;
9652 if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
9653 msec->flags |= SEC_HAS_CONTENTS;
9655 fi = elf_tdata (abfd)->find_line_info;
9656 if (fi == NULL)
9658 bfd_size_type external_fdr_size;
9659 char *fraw_src;
9660 char *fraw_end;
9661 struct fdr *fdr_ptr;
9662 bfd_size_type amt = sizeof (struct mips_elf_find_line);
9664 fi = bfd_zalloc (abfd, amt);
9665 if (fi == NULL)
9667 msec->flags = origflags;
9668 return FALSE;
9671 if (! _bfd_mips_elf_read_ecoff_info (abfd, msec, &fi->d))
9673 msec->flags = origflags;
9674 return FALSE;
9677 /* Swap in the FDR information. */
9678 amt = fi->d.symbolic_header.ifdMax * sizeof (struct fdr);
9679 fi->d.fdr = bfd_alloc (abfd, amt);
9680 if (fi->d.fdr == NULL)
9682 msec->flags = origflags;
9683 return FALSE;
9685 external_fdr_size = swap->external_fdr_size;
9686 fdr_ptr = fi->d.fdr;
9687 fraw_src = (char *) fi->d.external_fdr;
9688 fraw_end = (fraw_src
9689 + fi->d.symbolic_header.ifdMax * external_fdr_size);
9690 for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
9691 (*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr);
9693 elf_tdata (abfd)->find_line_info = fi;
9695 /* Note that we don't bother to ever free this information.
9696 find_nearest_line is either called all the time, as in
9697 objdump -l, so the information should be saved, or it is
9698 rarely called, as in ld error messages, so the memory
9699 wasted is unimportant. Still, it would probably be a
9700 good idea for free_cached_info to throw it away. */
9703 if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
9704 &fi->i, filename_ptr, functionname_ptr,
9705 line_ptr))
9707 msec->flags = origflags;
9708 return TRUE;
9711 msec->flags = origflags;
9714 /* Fall back on the generic ELF find_nearest_line routine. */
9716 return _bfd_elf_find_nearest_line (abfd, section, symbols, offset,
9717 filename_ptr, functionname_ptr,
9718 line_ptr);
9721 bfd_boolean
9722 _bfd_mips_elf_find_inliner_info (bfd *abfd,
9723 const char **filename_ptr,
9724 const char **functionname_ptr,
9725 unsigned int *line_ptr)
9727 bfd_boolean found;
9728 found = _bfd_dwarf2_find_inliner_info (abfd, filename_ptr,
9729 functionname_ptr, line_ptr,
9730 & elf_tdata (abfd)->dwarf2_find_line_info);
9731 return found;
9735 /* When are writing out the .options or .MIPS.options section,
9736 remember the bytes we are writing out, so that we can install the
9737 GP value in the section_processing routine. */
9739 bfd_boolean
9740 _bfd_mips_elf_set_section_contents (bfd *abfd, sec_ptr section,
9741 const void *location,
9742 file_ptr offset, bfd_size_type count)
9744 if (MIPS_ELF_OPTIONS_SECTION_NAME_P (section->name))
9746 bfd_byte *c;
9748 if (elf_section_data (section) == NULL)
9750 bfd_size_type amt = sizeof (struct bfd_elf_section_data);
9751 section->used_by_bfd = bfd_zalloc (abfd, amt);
9752 if (elf_section_data (section) == NULL)
9753 return FALSE;
9755 c = mips_elf_section_data (section)->u.tdata;
9756 if (c == NULL)
9758 c = bfd_zalloc (abfd, section->size);
9759 if (c == NULL)
9760 return FALSE;
9761 mips_elf_section_data (section)->u.tdata = c;
9764 memcpy (c + offset, location, count);
9767 return _bfd_elf_set_section_contents (abfd, section, location, offset,
9768 count);
9771 /* This is almost identical to bfd_generic_get_... except that some
9772 MIPS relocations need to be handled specially. Sigh. */
9774 bfd_byte *
9775 _bfd_elf_mips_get_relocated_section_contents
9776 (bfd *abfd,
9777 struct bfd_link_info *link_info,
9778 struct bfd_link_order *link_order,
9779 bfd_byte *data,
9780 bfd_boolean relocatable,
9781 asymbol **symbols)
9783 /* Get enough memory to hold the stuff */
9784 bfd *input_bfd = link_order->u.indirect.section->owner;
9785 asection *input_section = link_order->u.indirect.section;
9786 bfd_size_type sz;
9788 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
9789 arelent **reloc_vector = NULL;
9790 long reloc_count;
9792 if (reloc_size < 0)
9793 goto error_return;
9795 reloc_vector = bfd_malloc (reloc_size);
9796 if (reloc_vector == NULL && reloc_size != 0)
9797 goto error_return;
9799 /* read in the section */
9800 sz = input_section->rawsize ? input_section->rawsize : input_section->size;
9801 if (!bfd_get_section_contents (input_bfd, input_section, data, 0, sz))
9802 goto error_return;
9804 reloc_count = bfd_canonicalize_reloc (input_bfd,
9805 input_section,
9806 reloc_vector,
9807 symbols);
9808 if (reloc_count < 0)
9809 goto error_return;
9811 if (reloc_count > 0)
9813 arelent **parent;
9814 /* for mips */
9815 int gp_found;
9816 bfd_vma gp = 0x12345678; /* initialize just to shut gcc up */
9819 struct bfd_hash_entry *h;
9820 struct bfd_link_hash_entry *lh;
9821 /* Skip all this stuff if we aren't mixing formats. */
9822 if (abfd && input_bfd
9823 && abfd->xvec == input_bfd->xvec)
9824 lh = 0;
9825 else
9827 h = bfd_hash_lookup (&link_info->hash->table, "_gp", FALSE, FALSE);
9828 lh = (struct bfd_link_hash_entry *) h;
9830 lookup:
9831 if (lh)
9833 switch (lh->type)
9835 case bfd_link_hash_undefined:
9836 case bfd_link_hash_undefweak:
9837 case bfd_link_hash_common:
9838 gp_found = 0;
9839 break;
9840 case bfd_link_hash_defined:
9841 case bfd_link_hash_defweak:
9842 gp_found = 1;
9843 gp = lh->u.def.value;
9844 break;
9845 case bfd_link_hash_indirect:
9846 case bfd_link_hash_warning:
9847 lh = lh->u.i.link;
9848 /* @@FIXME ignoring warning for now */
9849 goto lookup;
9850 case bfd_link_hash_new:
9851 default:
9852 abort ();
9855 else
9856 gp_found = 0;
9858 /* end mips */
9859 for (parent = reloc_vector; *parent != NULL; parent++)
9861 char *error_message = NULL;
9862 bfd_reloc_status_type r;
9864 /* Specific to MIPS: Deal with relocation types that require
9865 knowing the gp of the output bfd. */
9866 asymbol *sym = *(*parent)->sym_ptr_ptr;
9868 /* If we've managed to find the gp and have a special
9869 function for the relocation then go ahead, else default
9870 to the generic handling. */
9871 if (gp_found
9872 && (*parent)->howto->special_function
9873 == _bfd_mips_elf32_gprel16_reloc)
9874 r = _bfd_mips_elf_gprel16_with_gp (input_bfd, sym, *parent,
9875 input_section, relocatable,
9876 data, gp);
9877 else
9878 r = bfd_perform_relocation (input_bfd, *parent, data,
9879 input_section,
9880 relocatable ? abfd : NULL,
9881 &error_message);
9883 if (relocatable)
9885 asection *os = input_section->output_section;
9887 /* A partial link, so keep the relocs */
9888 os->orelocation[os->reloc_count] = *parent;
9889 os->reloc_count++;
9892 if (r != bfd_reloc_ok)
9894 switch (r)
9896 case bfd_reloc_undefined:
9897 if (!((*link_info->callbacks->undefined_symbol)
9898 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
9899 input_bfd, input_section, (*parent)->address, TRUE)))
9900 goto error_return;
9901 break;
9902 case bfd_reloc_dangerous:
9903 BFD_ASSERT (error_message != NULL);
9904 if (!((*link_info->callbacks->reloc_dangerous)
9905 (link_info, error_message, input_bfd, input_section,
9906 (*parent)->address)))
9907 goto error_return;
9908 break;
9909 case bfd_reloc_overflow:
9910 if (!((*link_info->callbacks->reloc_overflow)
9911 (link_info, NULL,
9912 bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
9913 (*parent)->howto->name, (*parent)->addend,
9914 input_bfd, input_section, (*parent)->address)))
9915 goto error_return;
9916 break;
9917 case bfd_reloc_outofrange:
9918 default:
9919 abort ();
9920 break;
9926 if (reloc_vector != NULL)
9927 free (reloc_vector);
9928 return data;
9930 error_return:
9931 if (reloc_vector != NULL)
9932 free (reloc_vector);
9933 return NULL;
9936 /* Create a MIPS ELF linker hash table. */
9938 struct bfd_link_hash_table *
9939 _bfd_mips_elf_link_hash_table_create (bfd *abfd)
9941 struct mips_elf_link_hash_table *ret;
9942 bfd_size_type amt = sizeof (struct mips_elf_link_hash_table);
9944 ret = bfd_malloc (amt);
9945 if (ret == NULL)
9946 return NULL;
9948 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
9949 mips_elf_link_hash_newfunc,
9950 sizeof (struct mips_elf_link_hash_entry)))
9952 free (ret);
9953 return NULL;
9956 #if 0
9957 /* We no longer use this. */
9958 for (i = 0; i < SIZEOF_MIPS_DYNSYM_SECNAMES; i++)
9959 ret->dynsym_sec_strindex[i] = (bfd_size_type) -1;
9960 #endif
9961 ret->procedure_count = 0;
9962 ret->compact_rel_size = 0;
9963 ret->use_rld_obj_head = FALSE;
9964 ret->rld_value = 0;
9965 ret->mips16_stubs_seen = FALSE;
9966 ret->is_vxworks = FALSE;
9967 ret->srelbss = NULL;
9968 ret->sdynbss = NULL;
9969 ret->srelplt = NULL;
9970 ret->srelplt2 = NULL;
9971 ret->sgotplt = NULL;
9972 ret->splt = NULL;
9973 ret->plt_header_size = 0;
9974 ret->plt_entry_size = 0;
9976 return &ret->root.root;
9979 /* Likewise, but indicate that the target is VxWorks. */
9981 struct bfd_link_hash_table *
9982 _bfd_mips_vxworks_link_hash_table_create (bfd *abfd)
9984 struct bfd_link_hash_table *ret;
9986 ret = _bfd_mips_elf_link_hash_table_create (abfd);
9987 if (ret)
9989 struct mips_elf_link_hash_table *htab;
9991 htab = (struct mips_elf_link_hash_table *) ret;
9992 htab->is_vxworks = 1;
9994 return ret;
9997 /* We need to use a special link routine to handle the .reginfo and
9998 the .mdebug sections. We need to merge all instances of these
9999 sections together, not write them all out sequentially. */
10001 bfd_boolean
10002 _bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
10004 asection *o;
10005 struct bfd_link_order *p;
10006 asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
10007 asection *rtproc_sec;
10008 Elf32_RegInfo reginfo;
10009 struct ecoff_debug_info debug;
10010 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
10011 const struct ecoff_debug_swap *swap = bed->elf_backend_ecoff_debug_swap;
10012 HDRR *symhdr = &debug.symbolic_header;
10013 void *mdebug_handle = NULL;
10014 asection *s;
10015 EXTR esym;
10016 unsigned int i;
10017 bfd_size_type amt;
10018 struct mips_elf_link_hash_table *htab;
10020 static const char * const secname[] =
10022 ".text", ".init", ".fini", ".data",
10023 ".rodata", ".sdata", ".sbss", ".bss"
10025 static const int sc[] =
10027 scText, scInit, scFini, scData,
10028 scRData, scSData, scSBss, scBss
10031 /* We'd carefully arranged the dynamic symbol indices, and then the
10032 generic size_dynamic_sections renumbered them out from under us.
10033 Rather than trying somehow to prevent the renumbering, just do
10034 the sort again. */
10035 htab = mips_elf_hash_table (info);
10036 if (elf_hash_table (info)->dynamic_sections_created)
10038 bfd *dynobj;
10039 asection *got;
10040 struct mips_got_info *g;
10041 bfd_size_type dynsecsymcount;
10043 /* When we resort, we must tell mips_elf_sort_hash_table what
10044 the lowest index it may use is. That's the number of section
10045 symbols we're going to add. The generic ELF linker only
10046 adds these symbols when building a shared object. Note that
10047 we count the sections after (possibly) removing the .options
10048 section above. */
10050 dynsecsymcount = 0;
10051 if (info->shared)
10053 asection * p;
10055 for (p = abfd->sections; p ; p = p->next)
10056 if ((p->flags & SEC_EXCLUDE) == 0
10057 && (p->flags & SEC_ALLOC) != 0
10058 && !(*bed->elf_backend_omit_section_dynsym) (abfd, info, p))
10059 ++ dynsecsymcount;
10062 if (! mips_elf_sort_hash_table (info, dynsecsymcount + 1))
10063 return FALSE;
10065 /* Make sure we didn't grow the global .got region. */
10066 dynobj = elf_hash_table (info)->dynobj;
10067 got = mips_elf_got_section (dynobj, FALSE);
10068 g = mips_elf_section_data (got)->u.got_info;
10070 if (g->global_gotsym != NULL)
10071 BFD_ASSERT ((elf_hash_table (info)->dynsymcount
10072 - g->global_gotsym->dynindx)
10073 <= g->global_gotno);
10076 /* Get a value for the GP register. */
10077 if (elf_gp (abfd) == 0)
10079 struct bfd_link_hash_entry *h;
10081 h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
10082 if (h != NULL && h->type == bfd_link_hash_defined)
10083 elf_gp (abfd) = (h->u.def.value
10084 + h->u.def.section->output_section->vma
10085 + h->u.def.section->output_offset);
10086 else if (htab->is_vxworks
10087 && (h = bfd_link_hash_lookup (info->hash,
10088 "_GLOBAL_OFFSET_TABLE_",
10089 FALSE, FALSE, TRUE))
10090 && h->type == bfd_link_hash_defined)
10091 elf_gp (abfd) = (h->u.def.section->output_section->vma
10092 + h->u.def.section->output_offset
10093 + h->u.def.value);
10094 else if (info->relocatable)
10096 bfd_vma lo = MINUS_ONE;
10098 /* Find the GP-relative section with the lowest offset. */
10099 for (o = abfd->sections; o != NULL; o = o->next)
10100 if (o->vma < lo
10101 && (elf_section_data (o)->this_hdr.sh_flags & SHF_MIPS_GPREL))
10102 lo = o->vma;
10104 /* And calculate GP relative to that. */
10105 elf_gp (abfd) = lo + ELF_MIPS_GP_OFFSET (info);
10107 else
10109 /* If the relocate_section function needs to do a reloc
10110 involving the GP value, it should make a reloc_dangerous
10111 callback to warn that GP is not defined. */
10115 /* Go through the sections and collect the .reginfo and .mdebug
10116 information. */
10117 reginfo_sec = NULL;
10118 mdebug_sec = NULL;
10119 gptab_data_sec = NULL;
10120 gptab_bss_sec = NULL;
10121 for (o = abfd->sections; o != NULL; o = o->next)
10123 if (strcmp (o->name, ".reginfo") == 0)
10125 memset (&reginfo, 0, sizeof reginfo);
10127 /* We have found the .reginfo section in the output file.
10128 Look through all the link_orders comprising it and merge
10129 the information together. */
10130 for (p = o->map_head.link_order; p != NULL; p = p->next)
10132 asection *input_section;
10133 bfd *input_bfd;
10134 Elf32_External_RegInfo ext;
10135 Elf32_RegInfo sub;
10137 if (p->type != bfd_indirect_link_order)
10139 if (p->type == bfd_data_link_order)
10140 continue;
10141 abort ();
10144 input_section = p->u.indirect.section;
10145 input_bfd = input_section->owner;
10147 if (! bfd_get_section_contents (input_bfd, input_section,
10148 &ext, 0, sizeof ext))
10149 return FALSE;
10151 bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub);
10153 reginfo.ri_gprmask |= sub.ri_gprmask;
10154 reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
10155 reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
10156 reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
10157 reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
10159 /* ri_gp_value is set by the function
10160 mips_elf32_section_processing when the section is
10161 finally written out. */
10163 /* Hack: reset the SEC_HAS_CONTENTS flag so that
10164 elf_link_input_bfd ignores this section. */
10165 input_section->flags &= ~SEC_HAS_CONTENTS;
10168 /* Size has been set in _bfd_mips_elf_always_size_sections. */
10169 BFD_ASSERT(o->size == sizeof (Elf32_External_RegInfo));
10171 /* Skip this section later on (I don't think this currently
10172 matters, but someday it might). */
10173 o->map_head.link_order = NULL;
10175 reginfo_sec = o;
10178 if (strcmp (o->name, ".mdebug") == 0)
10180 struct extsym_info einfo;
10181 bfd_vma last;
10183 /* We have found the .mdebug section in the output file.
10184 Look through all the link_orders comprising it and merge
10185 the information together. */
10186 symhdr->magic = swap->sym_magic;
10187 /* FIXME: What should the version stamp be? */
10188 symhdr->vstamp = 0;
10189 symhdr->ilineMax = 0;
10190 symhdr->cbLine = 0;
10191 symhdr->idnMax = 0;
10192 symhdr->ipdMax = 0;
10193 symhdr->isymMax = 0;
10194 symhdr->ioptMax = 0;
10195 symhdr->iauxMax = 0;
10196 symhdr->issMax = 0;
10197 symhdr->issExtMax = 0;
10198 symhdr->ifdMax = 0;
10199 symhdr->crfd = 0;
10200 symhdr->iextMax = 0;
10202 /* We accumulate the debugging information itself in the
10203 debug_info structure. */
10204 debug.line = NULL;
10205 debug.external_dnr = NULL;
10206 debug.external_pdr = NULL;
10207 debug.external_sym = NULL;
10208 debug.external_opt = NULL;
10209 debug.external_aux = NULL;
10210 debug.ss = NULL;
10211 debug.ssext = debug.ssext_end = NULL;
10212 debug.external_fdr = NULL;
10213 debug.external_rfd = NULL;
10214 debug.external_ext = debug.external_ext_end = NULL;
10216 mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
10217 if (mdebug_handle == NULL)
10218 return FALSE;
10220 esym.jmptbl = 0;
10221 esym.cobol_main = 0;
10222 esym.weakext = 0;
10223 esym.reserved = 0;
10224 esym.ifd = ifdNil;
10225 esym.asym.iss = issNil;
10226 esym.asym.st = stLocal;
10227 esym.asym.reserved = 0;
10228 esym.asym.index = indexNil;
10229 last = 0;
10230 for (i = 0; i < sizeof (secname) / sizeof (secname[0]); i++)
10232 esym.asym.sc = sc[i];
10233 s = bfd_get_section_by_name (abfd, secname[i]);
10234 if (s != NULL)
10236 esym.asym.value = s->vma;
10237 last = s->vma + s->size;
10239 else
10240 esym.asym.value = last;
10241 if (!bfd_ecoff_debug_one_external (abfd, &debug, swap,
10242 secname[i], &esym))
10243 return FALSE;
10246 for (p = o->map_head.link_order; p != NULL; p = p->next)
10248 asection *input_section;
10249 bfd *input_bfd;
10250 const struct ecoff_debug_swap *input_swap;
10251 struct ecoff_debug_info input_debug;
10252 char *eraw_src;
10253 char *eraw_end;
10255 if (p->type != bfd_indirect_link_order)
10257 if (p->type == bfd_data_link_order)
10258 continue;
10259 abort ();
10262 input_section = p->u.indirect.section;
10263 input_bfd = input_section->owner;
10265 if (bfd_get_flavour (input_bfd) != bfd_target_elf_flavour
10266 || (get_elf_backend_data (input_bfd)
10267 ->elf_backend_ecoff_debug_swap) == NULL)
10269 /* I don't know what a non MIPS ELF bfd would be
10270 doing with a .mdebug section, but I don't really
10271 want to deal with it. */
10272 continue;
10275 input_swap = (get_elf_backend_data (input_bfd)
10276 ->elf_backend_ecoff_debug_swap);
10278 BFD_ASSERT (p->size == input_section->size);
10280 /* The ECOFF linking code expects that we have already
10281 read in the debugging information and set up an
10282 ecoff_debug_info structure, so we do that now. */
10283 if (! _bfd_mips_elf_read_ecoff_info (input_bfd, input_section,
10284 &input_debug))
10285 return FALSE;
10287 if (! (bfd_ecoff_debug_accumulate
10288 (mdebug_handle, abfd, &debug, swap, input_bfd,
10289 &input_debug, input_swap, info)))
10290 return FALSE;
10292 /* Loop through the external symbols. For each one with
10293 interesting information, try to find the symbol in
10294 the linker global hash table and save the information
10295 for the output external symbols. */
10296 eraw_src = input_debug.external_ext;
10297 eraw_end = (eraw_src
10298 + (input_debug.symbolic_header.iextMax
10299 * input_swap->external_ext_size));
10300 for (;
10301 eraw_src < eraw_end;
10302 eraw_src += input_swap->external_ext_size)
10304 EXTR ext;
10305 const char *name;
10306 struct mips_elf_link_hash_entry *h;
10308 (*input_swap->swap_ext_in) (input_bfd, eraw_src, &ext);
10309 if (ext.asym.sc == scNil
10310 || ext.asym.sc == scUndefined
10311 || ext.asym.sc == scSUndefined)
10312 continue;
10314 name = input_debug.ssext + ext.asym.iss;
10315 h = mips_elf_link_hash_lookup (mips_elf_hash_table (info),
10316 name, FALSE, FALSE, TRUE);
10317 if (h == NULL || h->esym.ifd != -2)
10318 continue;
10320 if (ext.ifd != -1)
10322 BFD_ASSERT (ext.ifd
10323 < input_debug.symbolic_header.ifdMax);
10324 ext.ifd = input_debug.ifdmap[ext.ifd];
10327 h->esym = ext;
10330 /* Free up the information we just read. */
10331 free (input_debug.line);
10332 free (input_debug.external_dnr);
10333 free (input_debug.external_pdr);
10334 free (input_debug.external_sym);
10335 free (input_debug.external_opt);
10336 free (input_debug.external_aux);
10337 free (input_debug.ss);
10338 free (input_debug.ssext);
10339 free (input_debug.external_fdr);
10340 free (input_debug.external_rfd);
10341 free (input_debug.external_ext);
10343 /* Hack: reset the SEC_HAS_CONTENTS flag so that
10344 elf_link_input_bfd ignores this section. */
10345 input_section->flags &= ~SEC_HAS_CONTENTS;
10348 if (SGI_COMPAT (abfd) && info->shared)
10350 /* Create .rtproc section. */
10351 rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
10352 if (rtproc_sec == NULL)
10354 flagword flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
10355 | SEC_LINKER_CREATED | SEC_READONLY);
10357 rtproc_sec = bfd_make_section_with_flags (abfd,
10358 ".rtproc",
10359 flags);
10360 if (rtproc_sec == NULL
10361 || ! bfd_set_section_alignment (abfd, rtproc_sec, 4))
10362 return FALSE;
10365 if (! mips_elf_create_procedure_table (mdebug_handle, abfd,
10366 info, rtproc_sec,
10367 &debug))
10368 return FALSE;
10371 /* Build the external symbol information. */
10372 einfo.abfd = abfd;
10373 einfo.info = info;
10374 einfo.debug = &debug;
10375 einfo.swap = swap;
10376 einfo.failed = FALSE;
10377 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
10378 mips_elf_output_extsym, &einfo);
10379 if (einfo.failed)
10380 return FALSE;
10382 /* Set the size of the .mdebug section. */
10383 o->size = bfd_ecoff_debug_size (abfd, &debug, swap);
10385 /* Skip this section later on (I don't think this currently
10386 matters, but someday it might). */
10387 o->map_head.link_order = NULL;
10389 mdebug_sec = o;
10392 if (strncmp (o->name, ".gptab.", sizeof ".gptab." - 1) == 0)
10394 const char *subname;
10395 unsigned int c;
10396 Elf32_gptab *tab;
10397 Elf32_External_gptab *ext_tab;
10398 unsigned int j;
10400 /* The .gptab.sdata and .gptab.sbss sections hold
10401 information describing how the small data area would
10402 change depending upon the -G switch. These sections
10403 not used in executables files. */
10404 if (! info->relocatable)
10406 for (p = o->map_head.link_order; p != NULL; p = p->next)
10408 asection *input_section;
10410 if (p->type != bfd_indirect_link_order)
10412 if (p->type == bfd_data_link_order)
10413 continue;
10414 abort ();
10417 input_section = p->u.indirect.section;
10419 /* Hack: reset the SEC_HAS_CONTENTS flag so that
10420 elf_link_input_bfd ignores this section. */
10421 input_section->flags &= ~SEC_HAS_CONTENTS;
10424 /* Skip this section later on (I don't think this
10425 currently matters, but someday it might). */
10426 o->map_head.link_order = NULL;
10428 /* Really remove the section. */
10429 bfd_section_list_remove (abfd, o);
10430 --abfd->section_count;
10432 continue;
10435 /* There is one gptab for initialized data, and one for
10436 uninitialized data. */
10437 if (strcmp (o->name, ".gptab.sdata") == 0)
10438 gptab_data_sec = o;
10439 else if (strcmp (o->name, ".gptab.sbss") == 0)
10440 gptab_bss_sec = o;
10441 else
10443 (*_bfd_error_handler)
10444 (_("%s: illegal section name `%s'"),
10445 bfd_get_filename (abfd), o->name);
10446 bfd_set_error (bfd_error_nonrepresentable_section);
10447 return FALSE;
10450 /* The linker script always combines .gptab.data and
10451 .gptab.sdata into .gptab.sdata, and likewise for
10452 .gptab.bss and .gptab.sbss. It is possible that there is
10453 no .sdata or .sbss section in the output file, in which
10454 case we must change the name of the output section. */
10455 subname = o->name + sizeof ".gptab" - 1;
10456 if (bfd_get_section_by_name (abfd, subname) == NULL)
10458 if (o == gptab_data_sec)
10459 o->name = ".gptab.data";
10460 else
10461 o->name = ".gptab.bss";
10462 subname = o->name + sizeof ".gptab" - 1;
10463 BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
10466 /* Set up the first entry. */
10467 c = 1;
10468 amt = c * sizeof (Elf32_gptab);
10469 tab = bfd_malloc (amt);
10470 if (tab == NULL)
10471 return FALSE;
10472 tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
10473 tab[0].gt_header.gt_unused = 0;
10475 /* Combine the input sections. */
10476 for (p = o->map_head.link_order; p != NULL; p = p->next)
10478 asection *input_section;
10479 bfd *input_bfd;
10480 bfd_size_type size;
10481 unsigned long last;
10482 bfd_size_type gpentry;
10484 if (p->type != bfd_indirect_link_order)
10486 if (p->type == bfd_data_link_order)
10487 continue;
10488 abort ();
10491 input_section = p->u.indirect.section;
10492 input_bfd = input_section->owner;
10494 /* Combine the gptab entries for this input section one
10495 by one. We know that the input gptab entries are
10496 sorted by ascending -G value. */
10497 size = input_section->size;
10498 last = 0;
10499 for (gpentry = sizeof (Elf32_External_gptab);
10500 gpentry < size;
10501 gpentry += sizeof (Elf32_External_gptab))
10503 Elf32_External_gptab ext_gptab;
10504 Elf32_gptab int_gptab;
10505 unsigned long val;
10506 unsigned long add;
10507 bfd_boolean exact;
10508 unsigned int look;
10510 if (! (bfd_get_section_contents
10511 (input_bfd, input_section, &ext_gptab, gpentry,
10512 sizeof (Elf32_External_gptab))))
10514 free (tab);
10515 return FALSE;
10518 bfd_mips_elf32_swap_gptab_in (input_bfd, &ext_gptab,
10519 &int_gptab);
10520 val = int_gptab.gt_entry.gt_g_value;
10521 add = int_gptab.gt_entry.gt_bytes - last;
10523 exact = FALSE;
10524 for (look = 1; look < c; look++)
10526 if (tab[look].gt_entry.gt_g_value >= val)
10527 tab[look].gt_entry.gt_bytes += add;
10529 if (tab[look].gt_entry.gt_g_value == val)
10530 exact = TRUE;
10533 if (! exact)
10535 Elf32_gptab *new_tab;
10536 unsigned int max;
10538 /* We need a new table entry. */
10539 amt = (bfd_size_type) (c + 1) * sizeof (Elf32_gptab);
10540 new_tab = bfd_realloc (tab, amt);
10541 if (new_tab == NULL)
10543 free (tab);
10544 return FALSE;
10546 tab = new_tab;
10547 tab[c].gt_entry.gt_g_value = val;
10548 tab[c].gt_entry.gt_bytes = add;
10550 /* Merge in the size for the next smallest -G
10551 value, since that will be implied by this new
10552 value. */
10553 max = 0;
10554 for (look = 1; look < c; look++)
10556 if (tab[look].gt_entry.gt_g_value < val
10557 && (max == 0
10558 || (tab[look].gt_entry.gt_g_value
10559 > tab[max].gt_entry.gt_g_value)))
10560 max = look;
10562 if (max != 0)
10563 tab[c].gt_entry.gt_bytes +=
10564 tab[max].gt_entry.gt_bytes;
10566 ++c;
10569 last = int_gptab.gt_entry.gt_bytes;
10572 /* Hack: reset the SEC_HAS_CONTENTS flag so that
10573 elf_link_input_bfd ignores this section. */
10574 input_section->flags &= ~SEC_HAS_CONTENTS;
10577 /* The table must be sorted by -G value. */
10578 if (c > 2)
10579 qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
10581 /* Swap out the table. */
10582 amt = (bfd_size_type) c * sizeof (Elf32_External_gptab);
10583 ext_tab = bfd_alloc (abfd, amt);
10584 if (ext_tab == NULL)
10586 free (tab);
10587 return FALSE;
10590 for (j = 0; j < c; j++)
10591 bfd_mips_elf32_swap_gptab_out (abfd, tab + j, ext_tab + j);
10592 free (tab);
10594 o->size = c * sizeof (Elf32_External_gptab);
10595 o->contents = (bfd_byte *) ext_tab;
10597 /* Skip this section later on (I don't think this currently
10598 matters, but someday it might). */
10599 o->map_head.link_order = NULL;
10603 /* Invoke the regular ELF backend linker to do all the work. */
10604 if (!bfd_elf_final_link (abfd, info))
10605 return FALSE;
10607 /* Now write out the computed sections. */
10609 if (reginfo_sec != NULL)
10611 Elf32_External_RegInfo ext;
10613 bfd_mips_elf32_swap_reginfo_out (abfd, &reginfo, &ext);
10614 if (! bfd_set_section_contents (abfd, reginfo_sec, &ext, 0, sizeof ext))
10615 return FALSE;
10618 if (mdebug_sec != NULL)
10620 BFD_ASSERT (abfd->output_has_begun);
10621 if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
10622 swap, info,
10623 mdebug_sec->filepos))
10624 return FALSE;
10626 bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
10629 if (gptab_data_sec != NULL)
10631 if (! bfd_set_section_contents (abfd, gptab_data_sec,
10632 gptab_data_sec->contents,
10633 0, gptab_data_sec->size))
10634 return FALSE;
10637 if (gptab_bss_sec != NULL)
10639 if (! bfd_set_section_contents (abfd, gptab_bss_sec,
10640 gptab_bss_sec->contents,
10641 0, gptab_bss_sec->size))
10642 return FALSE;
10645 if (SGI_COMPAT (abfd))
10647 rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
10648 if (rtproc_sec != NULL)
10650 if (! bfd_set_section_contents (abfd, rtproc_sec,
10651 rtproc_sec->contents,
10652 0, rtproc_sec->size))
10653 return FALSE;
10657 return TRUE;
10660 /* Structure for saying that BFD machine EXTENSION extends BASE. */
10662 struct mips_mach_extension {
10663 unsigned long extension, base;
10667 /* An array describing how BFD machines relate to one another. The entries
10668 are ordered topologically with MIPS I extensions listed last. */
10670 static const struct mips_mach_extension mips_mach_extensions[] = {
10671 /* MIPS64 extensions. */
10672 { bfd_mach_mipsisa64r2, bfd_mach_mipsisa64 },
10673 { bfd_mach_mips_sb1, bfd_mach_mipsisa64 },
10675 /* MIPS V extensions. */
10676 { bfd_mach_mipsisa64, bfd_mach_mips5 },
10678 /* R10000 extensions. */
10679 { bfd_mach_mips12000, bfd_mach_mips10000 },
10681 /* R5000 extensions. Note: the vr5500 ISA is an extension of the core
10682 vr5400 ISA, but doesn't include the multimedia stuff. It seems
10683 better to allow vr5400 and vr5500 code to be merged anyway, since
10684 many libraries will just use the core ISA. Perhaps we could add
10685 some sort of ASE flag if this ever proves a problem. */
10686 { bfd_mach_mips5500, bfd_mach_mips5400 },
10687 { bfd_mach_mips5400, bfd_mach_mips5000 },
10689 /* MIPS IV extensions. */
10690 { bfd_mach_mips5, bfd_mach_mips8000 },
10691 { bfd_mach_mips10000, bfd_mach_mips8000 },
10692 { bfd_mach_mips5000, bfd_mach_mips8000 },
10693 { bfd_mach_mips7000, bfd_mach_mips8000 },
10694 { bfd_mach_mips9000, bfd_mach_mips8000 },
10696 /* VR4100 extensions. */
10697 { bfd_mach_mips4120, bfd_mach_mips4100 },
10698 { bfd_mach_mips4111, bfd_mach_mips4100 },
10700 /* MIPS III extensions. */
10701 { bfd_mach_mips8000, bfd_mach_mips4000 },
10702 { bfd_mach_mips4650, bfd_mach_mips4000 },
10703 { bfd_mach_mips4600, bfd_mach_mips4000 },
10704 { bfd_mach_mips4400, bfd_mach_mips4000 },
10705 { bfd_mach_mips4300, bfd_mach_mips4000 },
10706 { bfd_mach_mips4100, bfd_mach_mips4000 },
10707 { bfd_mach_mips4010, bfd_mach_mips4000 },
10709 /* MIPS32 extensions. */
10710 { bfd_mach_mipsisa32r2, bfd_mach_mipsisa32 },
10712 /* MIPS II extensions. */
10713 { bfd_mach_mips4000, bfd_mach_mips6000 },
10714 { bfd_mach_mipsisa32, bfd_mach_mips6000 },
10716 /* MIPS I extensions. */
10717 { bfd_mach_mips6000, bfd_mach_mips3000 },
10718 { bfd_mach_mips3900, bfd_mach_mips3000 }
10722 /* Return true if bfd machine EXTENSION is an extension of machine BASE. */
10724 static bfd_boolean
10725 mips_mach_extends_p (unsigned long base, unsigned long extension)
10727 size_t i;
10729 if (extension == base)
10730 return TRUE;
10732 if (base == bfd_mach_mipsisa32
10733 && mips_mach_extends_p (bfd_mach_mipsisa64, extension))
10734 return TRUE;
10736 if (base == bfd_mach_mipsisa32r2
10737 && mips_mach_extends_p (bfd_mach_mipsisa64r2, extension))
10738 return TRUE;
10740 for (i = 0; i < ARRAY_SIZE (mips_mach_extensions); i++)
10741 if (extension == mips_mach_extensions[i].extension)
10743 extension = mips_mach_extensions[i].base;
10744 if (extension == base)
10745 return TRUE;
10748 return FALSE;
10752 /* Return true if the given ELF header flags describe a 32-bit binary. */
10754 static bfd_boolean
10755 mips_32bit_flags_p (flagword flags)
10757 return ((flags & EF_MIPS_32BITMODE) != 0
10758 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_O32
10759 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32
10760 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1
10761 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2
10762 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32
10763 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2);
10767 /* Merge backend specific data from an object file to the output
10768 object file when linking. */
10770 bfd_boolean
10771 _bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
10773 flagword old_flags;
10774 flagword new_flags;
10775 bfd_boolean ok;
10776 bfd_boolean null_input_bfd = TRUE;
10777 asection *sec;
10779 /* Check if we have the same endianess */
10780 if (! _bfd_generic_verify_endian_match (ibfd, obfd))
10782 (*_bfd_error_handler)
10783 (_("%B: endianness incompatible with that of the selected emulation"),
10784 ibfd);
10785 return FALSE;
10788 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
10789 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
10790 return TRUE;
10792 if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
10794 (*_bfd_error_handler)
10795 (_("%B: ABI is incompatible with that of the selected emulation"),
10796 ibfd);
10797 return FALSE;
10800 new_flags = elf_elfheader (ibfd)->e_flags;
10801 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_NOREORDER;
10802 old_flags = elf_elfheader (obfd)->e_flags;
10804 if (! elf_flags_init (obfd))
10806 elf_flags_init (obfd) = TRUE;
10807 elf_elfheader (obfd)->e_flags = new_flags;
10808 elf_elfheader (obfd)->e_ident[EI_CLASS]
10809 = elf_elfheader (ibfd)->e_ident[EI_CLASS];
10811 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
10812 && bfd_get_arch_info (obfd)->the_default)
10814 if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
10815 bfd_get_mach (ibfd)))
10816 return FALSE;
10819 return TRUE;
10822 /* Check flag compatibility. */
10824 new_flags &= ~EF_MIPS_NOREORDER;
10825 old_flags &= ~EF_MIPS_NOREORDER;
10827 /* Some IRIX 6 BSD-compatibility objects have this bit set. It
10828 doesn't seem to matter. */
10829 new_flags &= ~EF_MIPS_XGOT;
10830 old_flags &= ~EF_MIPS_XGOT;
10832 /* MIPSpro generates ucode info in n64 objects. Again, we should
10833 just be able to ignore this. */
10834 new_flags &= ~EF_MIPS_UCODE;
10835 old_flags &= ~EF_MIPS_UCODE;
10837 /* Don't care about the PIC flags from dynamic objects; they are
10838 PIC by design. */
10839 if ((new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0
10840 && (ibfd->flags & DYNAMIC) != 0)
10841 new_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
10843 if (new_flags == old_flags)
10844 return TRUE;
10846 /* Check to see if the input BFD actually contains any sections.
10847 If not, its flags may not have been initialised either, but it cannot
10848 actually cause any incompatibility. */
10849 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
10851 /* Ignore synthetic sections and empty .text, .data and .bss sections
10852 which are automatically generated by gas. */
10853 if (strcmp (sec->name, ".reginfo")
10854 && strcmp (sec->name, ".mdebug")
10855 && (sec->size != 0
10856 || (strcmp (sec->name, ".text")
10857 && strcmp (sec->name, ".data")
10858 && strcmp (sec->name, ".bss"))))
10860 null_input_bfd = FALSE;
10861 break;
10864 if (null_input_bfd)
10865 return TRUE;
10867 ok = TRUE;
10869 if (((new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0)
10870 != ((old_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0))
10872 (*_bfd_error_handler)
10873 (_("%B: warning: linking PIC files with non-PIC files"),
10874 ibfd);
10875 ok = TRUE;
10878 if (new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC))
10879 elf_elfheader (obfd)->e_flags |= EF_MIPS_CPIC;
10880 if (! (new_flags & EF_MIPS_PIC))
10881 elf_elfheader (obfd)->e_flags &= ~EF_MIPS_PIC;
10883 new_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
10884 old_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
10886 /* Compare the ISAs. */
10887 if (mips_32bit_flags_p (old_flags) != mips_32bit_flags_p (new_flags))
10889 (*_bfd_error_handler)
10890 (_("%B: linking 32-bit code with 64-bit code"),
10891 ibfd);
10892 ok = FALSE;
10894 else if (!mips_mach_extends_p (bfd_get_mach (ibfd), bfd_get_mach (obfd)))
10896 /* OBFD's ISA isn't the same as, or an extension of, IBFD's. */
10897 if (mips_mach_extends_p (bfd_get_mach (obfd), bfd_get_mach (ibfd)))
10899 /* Copy the architecture info from IBFD to OBFD. Also copy
10900 the 32-bit flag (if set) so that we continue to recognise
10901 OBFD as a 32-bit binary. */
10902 bfd_set_arch_info (obfd, bfd_get_arch_info (ibfd));
10903 elf_elfheader (obfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
10904 elf_elfheader (obfd)->e_flags
10905 |= new_flags & (EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
10907 /* Copy across the ABI flags if OBFD doesn't use them
10908 and if that was what caused us to treat IBFD as 32-bit. */
10909 if ((old_flags & EF_MIPS_ABI) == 0
10910 && mips_32bit_flags_p (new_flags)
10911 && !mips_32bit_flags_p (new_flags & ~EF_MIPS_ABI))
10912 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ABI;
10914 else
10916 /* The ISAs aren't compatible. */
10917 (*_bfd_error_handler)
10918 (_("%B: linking %s module with previous %s modules"),
10919 ibfd,
10920 bfd_printable_name (ibfd),
10921 bfd_printable_name (obfd));
10922 ok = FALSE;
10926 new_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
10927 old_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
10929 /* Compare ABIs. The 64-bit ABI does not use EF_MIPS_ABI. But, it
10930 does set EI_CLASS differently from any 32-bit ABI. */
10931 if ((new_flags & EF_MIPS_ABI) != (old_flags & EF_MIPS_ABI)
10932 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
10933 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
10935 /* Only error if both are set (to different values). */
10936 if (((new_flags & EF_MIPS_ABI) && (old_flags & EF_MIPS_ABI))
10937 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
10938 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
10940 (*_bfd_error_handler)
10941 (_("%B: ABI mismatch: linking %s module with previous %s modules"),
10942 ibfd,
10943 elf_mips_abi_name (ibfd),
10944 elf_mips_abi_name (obfd));
10945 ok = FALSE;
10947 new_flags &= ~EF_MIPS_ABI;
10948 old_flags &= ~EF_MIPS_ABI;
10951 /* For now, allow arbitrary mixing of ASEs (retain the union). */
10952 if ((new_flags & EF_MIPS_ARCH_ASE) != (old_flags & EF_MIPS_ARCH_ASE))
10954 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ARCH_ASE;
10956 new_flags &= ~ EF_MIPS_ARCH_ASE;
10957 old_flags &= ~ EF_MIPS_ARCH_ASE;
10960 /* Warn about any other mismatches */
10961 if (new_flags != old_flags)
10963 (*_bfd_error_handler)
10964 (_("%B: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
10965 ibfd, (unsigned long) new_flags,
10966 (unsigned long) old_flags);
10967 ok = FALSE;
10970 if (! ok)
10972 bfd_set_error (bfd_error_bad_value);
10973 return FALSE;
10976 return TRUE;
10979 /* Function to keep MIPS specific file flags like as EF_MIPS_PIC. */
10981 bfd_boolean
10982 _bfd_mips_elf_set_private_flags (bfd *abfd, flagword flags)
10984 BFD_ASSERT (!elf_flags_init (abfd)
10985 || elf_elfheader (abfd)->e_flags == flags);
10987 elf_elfheader (abfd)->e_flags = flags;
10988 elf_flags_init (abfd) = TRUE;
10989 return TRUE;
10992 bfd_boolean
10993 _bfd_mips_elf_print_private_bfd_data (bfd *abfd, void *ptr)
10995 FILE *file = ptr;
10997 BFD_ASSERT (abfd != NULL && ptr != NULL);
10999 /* Print normal ELF private data. */
11000 _bfd_elf_print_private_bfd_data (abfd, ptr);
11002 /* xgettext:c-format */
11003 fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
11005 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O32)
11006 fprintf (file, _(" [abi=O32]"));
11007 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O64)
11008 fprintf (file, _(" [abi=O64]"));
11009 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32)
11010 fprintf (file, _(" [abi=EABI32]"));
11011 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64)
11012 fprintf (file, _(" [abi=EABI64]"));
11013 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI))
11014 fprintf (file, _(" [abi unknown]"));
11015 else if (ABI_N32_P (abfd))
11016 fprintf (file, _(" [abi=N32]"));
11017 else if (ABI_64_P (abfd))
11018 fprintf (file, _(" [abi=64]"));
11019 else
11020 fprintf (file, _(" [no abi set]"));
11022 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
11023 fprintf (file, _(" [mips1]"));
11024 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
11025 fprintf (file, _(" [mips2]"));
11026 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
11027 fprintf (file, _(" [mips3]"));
11028 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
11029 fprintf (file, _(" [mips4]"));
11030 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_5)
11031 fprintf (file, _(" [mips5]"));
11032 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
11033 fprintf (file, _(" [mips32]"));
11034 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64)
11035 fprintf (file, _(" [mips64]"));
11036 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2)
11037 fprintf (file, _(" [mips32r2]"));
11038 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64R2)
11039 fprintf (file, _(" [mips64r2]"));
11040 else
11041 fprintf (file, _(" [unknown ISA]"));
11043 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
11044 fprintf (file, _(" [mdmx]"));
11046 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
11047 fprintf (file, _(" [mips16]"));
11049 if (elf_elfheader (abfd)->e_flags & EF_MIPS_32BITMODE)
11050 fprintf (file, _(" [32bitmode]"));
11051 else
11052 fprintf (file, _(" [not 32bitmode]"));
11054 fputc ('\n', file);
11056 return TRUE;
11059 const struct bfd_elf_special_section _bfd_mips_elf_special_sections[] =
11061 { ".lit4", 5, 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
11062 { ".lit8", 5, 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
11063 { ".mdebug", 7, 0, SHT_MIPS_DEBUG, 0 },
11064 { ".sbss", 5, -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
11065 { ".sdata", 6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
11066 { ".ucode", 6, 0, SHT_MIPS_UCODE, 0 },
11067 { NULL, 0, 0, 0, 0 }
11070 /* Ensure that the STO_OPTIONAL flag is copied into h->other,
11071 even if this is not a defintion of the symbol. */
11072 void
11073 _bfd_mips_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
11074 const Elf_Internal_Sym *isym,
11075 bfd_boolean definition,
11076 bfd_boolean dynamic ATTRIBUTE_UNUSED)
11078 if (! definition
11079 && ELF_MIPS_IS_OPTIONAL (isym->st_other))
11080 h->other |= STO_OPTIONAL;
11083 /* Decide whether an undefined symbol is special and can be ignored.
11084 This is the case for OPTIONAL symbols on IRIX. */
11085 bfd_boolean
11086 _bfd_mips_elf_ignore_undef_symbol (struct elf_link_hash_entry *h)
11088 return ELF_MIPS_IS_OPTIONAL (h->other) ? TRUE : FALSE;