* config/tc-i386.h: Remove BFD_ASSEMBLER tests and all !BFD_ASSEMBLER
[deliverable/binutils-gdb.git] / bfd / elfxx-mips.c
CommitLineData
b49e97c9 1/* MIPS-specific support for ELF
64543e1a
RS
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3 2003 Free Software Foundation, Inc.
b49e97c9
TS
4
5 Most of the information added by Ian Lance Taylor, Cygnus Support,
6 <ian@cygnus.com>.
7 N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
8 <mark@codesourcery.com>
9 Traditional MIPS targets support added by Koundinya.K, Dansk Data
10 Elektronik & Operations Research Group. <kk@ddeorg.soft.net>
11
ae9a127f 12 This file is part of BFD, the Binary File Descriptor library.
b49e97c9 13
ae9a127f
NC
14 This program is free software; you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation; either version 2 of the License, or
17 (at your option) any later version.
b49e97c9 18
ae9a127f
NC
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
b49e97c9 23
ae9a127f
NC
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
b49e97c9
TS
27
28/* This file handles functionality common to the different MIPS ABI's. */
29
30#include "bfd.h"
31#include "sysdep.h"
32#include "libbfd.h"
64543e1a 33#include "libiberty.h"
b49e97c9
TS
34#include "elf-bfd.h"
35#include "elfxx-mips.h"
36#include "elf/mips.h"
37
38/* Get the ECOFF swapping routines. */
39#include "coff/sym.h"
40#include "coff/symconst.h"
41#include "coff/ecoff.h"
42#include "coff/mips.h"
43
b15e6682
AO
44#include "hashtab.h"
45
46/* This structure is used to hold .got entries while estimating got
47 sizes. */
48struct mips_got_entry
49{
50 /* The input bfd in which the symbol is defined. */
51 bfd *abfd;
f4416af6
AO
52 /* The index of the symbol, as stored in the relocation r_info, if
53 we have a local symbol; -1 otherwise. */
54 long symndx;
55 union
56 {
57 /* If abfd == NULL, an address that must be stored in the got. */
58 bfd_vma address;
59 /* If abfd != NULL && symndx != -1, the addend of the relocation
60 that should be added to the symbol value. */
61 bfd_vma addend;
62 /* If abfd != NULL && symndx == -1, the hash table entry
63 corresponding to a global symbol in the got (or, local, if
64 h->forced_local). */
65 struct mips_elf_link_hash_entry *h;
66 } d;
b15e6682 67 /* The offset from the beginning of the .got section to the entry
f4416af6
AO
68 corresponding to this symbol+addend. If it's a global symbol
69 whose offset is yet to be decided, it's going to be -1. */
70 long gotidx;
b15e6682
AO
71};
72
f0abc2a1 73/* This structure is used to hold .got information when linking. */
b49e97c9
TS
74
75struct mips_got_info
76{
77 /* The global symbol in the GOT with the lowest index in the dynamic
78 symbol table. */
79 struct elf_link_hash_entry *global_gotsym;
80 /* The number of global .got entries. */
81 unsigned int global_gotno;
82 /* The number of local .got entries. */
83 unsigned int local_gotno;
84 /* The number of local .got entries we have used. */
85 unsigned int assigned_gotno;
b15e6682
AO
86 /* A hash table holding members of the got. */
87 struct htab *got_entries;
f4416af6
AO
88 /* A hash table mapping input bfds to other mips_got_info. NULL
89 unless multi-got was necessary. */
90 struct htab *bfd2got;
91 /* In multi-got links, a pointer to the next got (err, rather, most
92 of the time, it points to the previous got). */
93 struct mips_got_info *next;
94};
95
96/* Map an input bfd to a got in a multi-got link. */
97
98struct mips_elf_bfd2got_hash {
99 bfd *bfd;
100 struct mips_got_info *g;
101};
102
103/* Structure passed when traversing the bfd2got hash table, used to
104 create and merge bfd's gots. */
105
106struct mips_elf_got_per_bfd_arg
107{
108 /* A hashtable that maps bfds to gots. */
109 htab_t bfd2got;
110 /* The output bfd. */
111 bfd *obfd;
112 /* The link information. */
113 struct bfd_link_info *info;
114 /* A pointer to the primary got, i.e., the one that's going to get
115 the implicit relocations from DT_MIPS_LOCAL_GOTNO and
116 DT_MIPS_GOTSYM. */
117 struct mips_got_info *primary;
118 /* A non-primary got we're trying to merge with other input bfd's
119 gots. */
120 struct mips_got_info *current;
121 /* The maximum number of got entries that can be addressed with a
122 16-bit offset. */
123 unsigned int max_count;
124 /* The number of local and global entries in the primary got. */
125 unsigned int primary_count;
126 /* The number of local and global entries in the current got. */
127 unsigned int current_count;
128};
129
130/* Another structure used to pass arguments for got entries traversal. */
131
132struct mips_elf_set_global_got_offset_arg
133{
134 struct mips_got_info *g;
135 int value;
136 unsigned int needed_relocs;
137 struct bfd_link_info *info;
b49e97c9
TS
138};
139
f0abc2a1
AM
140struct _mips_elf_section_data
141{
142 struct bfd_elf_section_data elf;
143 union
144 {
145 struct mips_got_info *got_info;
146 bfd_byte *tdata;
147 } u;
148};
149
150#define mips_elf_section_data(sec) \
68bfbfcc 151 ((struct _mips_elf_section_data *) elf_section_data (sec))
f0abc2a1 152
b49e97c9
TS
153/* This structure is passed to mips_elf_sort_hash_table_f when sorting
154 the dynamic symbols. */
155
156struct mips_elf_hash_sort_data
157{
158 /* The symbol in the global GOT with the lowest dynamic symbol table
159 index. */
160 struct elf_link_hash_entry *low;
161 /* The least dynamic symbol table index corresponding to a symbol
162 with a GOT entry. */
163 long min_got_dynindx;
f4416af6
AO
164 /* The greatest dynamic symbol table index corresponding to a symbol
165 with a GOT entry that is not referenced (e.g., a dynamic symbol
9e4aeb93 166 with dynamic relocations pointing to it from non-primary GOTs). */
f4416af6 167 long max_unref_got_dynindx;
b49e97c9
TS
168 /* The greatest dynamic symbol table index not corresponding to a
169 symbol without a GOT entry. */
170 long max_non_got_dynindx;
171};
172
173/* The MIPS ELF linker needs additional information for each symbol in
174 the global hash table. */
175
176struct mips_elf_link_hash_entry
177{
178 struct elf_link_hash_entry root;
179
180 /* External symbol information. */
181 EXTR esym;
182
183 /* Number of R_MIPS_32, R_MIPS_REL32, or R_MIPS_64 relocs against
184 this symbol. */
185 unsigned int possibly_dynamic_relocs;
186
187 /* If the R_MIPS_32, R_MIPS_REL32, or R_MIPS_64 reloc is against
188 a readonly section. */
b34976b6 189 bfd_boolean readonly_reloc;
b49e97c9 190
b49e97c9
TS
191 /* We must not create a stub for a symbol that has relocations
192 related to taking the function's address, i.e. any but
193 R_MIPS_CALL*16 ones -- see "MIPS ABI Supplement, 3rd Edition",
194 p. 4-20. */
b34976b6 195 bfd_boolean no_fn_stub;
b49e97c9
TS
196
197 /* If there is a stub that 32 bit functions should use to call this
198 16 bit function, this points to the section containing the stub. */
199 asection *fn_stub;
200
201 /* Whether we need the fn_stub; this is set if this symbol appears
202 in any relocs other than a 16 bit call. */
b34976b6 203 bfd_boolean need_fn_stub;
b49e97c9
TS
204
205 /* If there is a stub that 16 bit functions should use to call this
206 32 bit function, this points to the section containing the stub. */
207 asection *call_stub;
208
209 /* This is like the call_stub field, but it is used if the function
210 being called returns a floating point value. */
211 asection *call_fp_stub;
7c5fcef7
L
212
213 /* Are we forced local? .*/
b34976b6 214 bfd_boolean forced_local;
b49e97c9
TS
215};
216
217/* MIPS ELF linker hash table. */
218
219struct mips_elf_link_hash_table
220{
221 struct elf_link_hash_table root;
222#if 0
223 /* We no longer use this. */
224 /* String section indices for the dynamic section symbols. */
225 bfd_size_type dynsym_sec_strindex[SIZEOF_MIPS_DYNSYM_SECNAMES];
226#endif
227 /* The number of .rtproc entries. */
228 bfd_size_type procedure_count;
229 /* The size of the .compact_rel section (if SGI_COMPAT). */
230 bfd_size_type compact_rel_size;
231 /* This flag indicates that the value of DT_MIPS_RLD_MAP dynamic
8dc1a139 232 entry is set to the address of __rld_obj_head as in IRIX5. */
b34976b6 233 bfd_boolean use_rld_obj_head;
b49e97c9
TS
234 /* This is the value of the __rld_map or __rld_obj_head symbol. */
235 bfd_vma rld_value;
236 /* This is set if we see any mips16 stub sections. */
b34976b6 237 bfd_boolean mips16_stubs_seen;
b49e97c9
TS
238};
239
240/* Structure used to pass information to mips_elf_output_extsym. */
241
242struct extsym_info
243{
9e4aeb93
RS
244 bfd *abfd;
245 struct bfd_link_info *info;
b49e97c9
TS
246 struct ecoff_debug_info *debug;
247 const struct ecoff_debug_swap *swap;
b34976b6 248 bfd_boolean failed;
b49e97c9
TS
249};
250
8dc1a139 251/* The names of the runtime procedure table symbols used on IRIX5. */
b49e97c9
TS
252
253static const char * const mips_elf_dynsym_rtproc_names[] =
254{
255 "_procedure_table",
256 "_procedure_string_table",
257 "_procedure_table_size",
258 NULL
259};
260
261/* These structures are used to generate the .compact_rel section on
8dc1a139 262 IRIX5. */
b49e97c9
TS
263
264typedef struct
265{
266 unsigned long id1; /* Always one? */
267 unsigned long num; /* Number of compact relocation entries. */
268 unsigned long id2; /* Always two? */
269 unsigned long offset; /* The file offset of the first relocation. */
270 unsigned long reserved0; /* Zero? */
271 unsigned long reserved1; /* Zero? */
272} Elf32_compact_rel;
273
274typedef struct
275{
276 bfd_byte id1[4];
277 bfd_byte num[4];
278 bfd_byte id2[4];
279 bfd_byte offset[4];
280 bfd_byte reserved0[4];
281 bfd_byte reserved1[4];
282} Elf32_External_compact_rel;
283
284typedef struct
285{
286 unsigned int ctype : 1; /* 1: long 0: short format. See below. */
287 unsigned int rtype : 4; /* Relocation types. See below. */
288 unsigned int dist2to : 8;
289 unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
290 unsigned long konst; /* KONST field. See below. */
291 unsigned long vaddr; /* VADDR to be relocated. */
292} Elf32_crinfo;
293
294typedef struct
295{
296 unsigned int ctype : 1; /* 1: long 0: short format. See below. */
297 unsigned int rtype : 4; /* Relocation types. See below. */
298 unsigned int dist2to : 8;
299 unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
300 unsigned long konst; /* KONST field. See below. */
301} Elf32_crinfo2;
302
303typedef struct
304{
305 bfd_byte info[4];
306 bfd_byte konst[4];
307 bfd_byte vaddr[4];
308} Elf32_External_crinfo;
309
310typedef struct
311{
312 bfd_byte info[4];
313 bfd_byte konst[4];
314} Elf32_External_crinfo2;
315
316/* These are the constants used to swap the bitfields in a crinfo. */
317
318#define CRINFO_CTYPE (0x1)
319#define CRINFO_CTYPE_SH (31)
320#define CRINFO_RTYPE (0xf)
321#define CRINFO_RTYPE_SH (27)
322#define CRINFO_DIST2TO (0xff)
323#define CRINFO_DIST2TO_SH (19)
324#define CRINFO_RELVADDR (0x7ffff)
325#define CRINFO_RELVADDR_SH (0)
326
327/* A compact relocation info has long (3 words) or short (2 words)
328 formats. A short format doesn't have VADDR field and relvaddr
329 fields contains ((VADDR - vaddr of the previous entry) >> 2). */
330#define CRF_MIPS_LONG 1
331#define CRF_MIPS_SHORT 0
332
333/* There are 4 types of compact relocation at least. The value KONST
334 has different meaning for each type:
335
336 (type) (konst)
337 CT_MIPS_REL32 Address in data
338 CT_MIPS_WORD Address in word (XXX)
339 CT_MIPS_GPHI_LO GP - vaddr
340 CT_MIPS_JMPAD Address to jump
341 */
342
343#define CRT_MIPS_REL32 0xa
344#define CRT_MIPS_WORD 0xb
345#define CRT_MIPS_GPHI_LO 0xc
346#define CRT_MIPS_JMPAD 0xd
347
348#define mips_elf_set_cr_format(x,format) ((x).ctype = (format))
349#define mips_elf_set_cr_type(x,type) ((x).rtype = (type))
350#define mips_elf_set_cr_dist2to(x,v) ((x).dist2to = (v))
351#define mips_elf_set_cr_relvaddr(x,d) ((x).relvaddr = (d)<<2)
352\f
353/* The structure of the runtime procedure descriptor created by the
354 loader for use by the static exception system. */
355
356typedef struct runtime_pdr {
ae9a127f
NC
357 bfd_vma adr; /* Memory address of start of procedure. */
358 long regmask; /* Save register mask. */
359 long regoffset; /* Save register offset. */
360 long fregmask; /* Save floating point register mask. */
361 long fregoffset; /* Save floating point register offset. */
362 long frameoffset; /* Frame size. */
363 short framereg; /* Frame pointer register. */
364 short pcreg; /* Offset or reg of return pc. */
365 long irpss; /* Index into the runtime string table. */
b49e97c9 366 long reserved;
ae9a127f 367 struct exception_info *exception_info;/* Pointer to exception array. */
b49e97c9
TS
368} RPDR, *pRPDR;
369#define cbRPDR sizeof (RPDR)
370#define rpdNil ((pRPDR) 0)
371\f
372static struct bfd_hash_entry *mips_elf_link_hash_newfunc
373 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
374static void ecoff_swap_rpdr_out
375 PARAMS ((bfd *, const RPDR *, struct rpdr_ext *));
b34976b6 376static bfd_boolean mips_elf_create_procedure_table
b49e97c9
TS
377 PARAMS ((PTR, bfd *, struct bfd_link_info *, asection *,
378 struct ecoff_debug_info *));
b34976b6 379static bfd_boolean mips_elf_check_mips16_stubs
b49e97c9
TS
380 PARAMS ((struct mips_elf_link_hash_entry *, PTR));
381static void bfd_mips_elf32_swap_gptab_in
382 PARAMS ((bfd *, const Elf32_External_gptab *, Elf32_gptab *));
383static void bfd_mips_elf32_swap_gptab_out
384 PARAMS ((bfd *, const Elf32_gptab *, Elf32_External_gptab *));
385static void bfd_elf32_swap_compact_rel_out
386 PARAMS ((bfd *, const Elf32_compact_rel *, Elf32_External_compact_rel *));
387static void bfd_elf32_swap_crinfo_out
388 PARAMS ((bfd *, const Elf32_crinfo *, Elf32_External_crinfo *));
b49e97c9
TS
389static int sort_dynamic_relocs
390 PARAMS ((const void *, const void *));
f4416af6
AO
391static int sort_dynamic_relocs_64
392 PARAMS ((const void *, const void *));
b34976b6 393static bfd_boolean mips_elf_output_extsym
b49e97c9
TS
394 PARAMS ((struct mips_elf_link_hash_entry *, PTR));
395static int gptab_compare PARAMS ((const void *, const void *));
f4416af6
AO
396static asection * mips_elf_rel_dyn_section PARAMS ((bfd *, bfd_boolean));
397static asection * mips_elf_got_section PARAMS ((bfd *, bfd_boolean));
b49e97c9
TS
398static struct mips_got_info *mips_elf_got_info
399 PARAMS ((bfd *, asection **));
0176c794 400static long mips_elf_get_global_gotsym_index PARAMS ((bfd *abfd));
b49e97c9 401static bfd_vma mips_elf_local_got_index
f4416af6 402 PARAMS ((bfd *, bfd *, struct bfd_link_info *, bfd_vma));
b49e97c9 403static bfd_vma mips_elf_global_got_index
f4416af6 404 PARAMS ((bfd *, bfd *, struct elf_link_hash_entry *));
b49e97c9 405static bfd_vma mips_elf_got_page
f4416af6 406 PARAMS ((bfd *, bfd *, struct bfd_link_info *, bfd_vma, bfd_vma *));
b49e97c9 407static bfd_vma mips_elf_got16_entry
f4416af6 408 PARAMS ((bfd *, bfd *, struct bfd_link_info *, bfd_vma, bfd_boolean));
b49e97c9 409static bfd_vma mips_elf_got_offset_from_index
f4416af6 410 PARAMS ((bfd *, bfd *, bfd *, bfd_vma));
b15e6682 411static struct mips_got_entry *mips_elf_create_local_got_entry
f4416af6 412 PARAMS ((bfd *, bfd *, struct mips_got_info *, asection *, bfd_vma));
b34976b6 413static bfd_boolean mips_elf_sort_hash_table
b49e97c9 414 PARAMS ((struct bfd_link_info *, unsigned long));
b34976b6 415static bfd_boolean mips_elf_sort_hash_table_f
b49e97c9 416 PARAMS ((struct mips_elf_link_hash_entry *, PTR));
f4416af6
AO
417static bfd_boolean mips_elf_record_local_got_symbol
418 PARAMS ((bfd *, long, bfd_vma, struct mips_got_info *));
b34976b6 419static bfd_boolean mips_elf_record_global_got_symbol
f4416af6 420 PARAMS ((struct elf_link_hash_entry *, bfd *, struct bfd_link_info *,
b49e97c9
TS
421 struct mips_got_info *));
422static const Elf_Internal_Rela *mips_elf_next_relocation
423 PARAMS ((bfd *, unsigned int, const Elf_Internal_Rela *,
424 const Elf_Internal_Rela *));
b34976b6
AM
425static bfd_boolean mips_elf_local_relocation_p
426 PARAMS ((bfd *, const Elf_Internal_Rela *, asection **, bfd_boolean));
b34976b6 427static bfd_boolean mips_elf_overflow_p PARAMS ((bfd_vma, int));
b49e97c9
TS
428static bfd_vma mips_elf_high PARAMS ((bfd_vma));
429static bfd_vma mips_elf_higher PARAMS ((bfd_vma));
430static bfd_vma mips_elf_highest PARAMS ((bfd_vma));
b34976b6 431static bfd_boolean mips_elf_create_compact_rel_section
b49e97c9 432 PARAMS ((bfd *, struct bfd_link_info *));
b34976b6 433static bfd_boolean mips_elf_create_got_section
f4416af6 434 PARAMS ((bfd *, struct bfd_link_info *, bfd_boolean));
b49e97c9
TS
435static bfd_reloc_status_type mips_elf_calculate_relocation
436 PARAMS ((bfd *, bfd *, asection *, struct bfd_link_info *,
437 const Elf_Internal_Rela *, bfd_vma, reloc_howto_type *,
438 Elf_Internal_Sym *, asection **, bfd_vma *, const char **,
b34976b6 439 bfd_boolean *, bfd_boolean));
b49e97c9
TS
440static bfd_vma mips_elf_obtain_contents
441 PARAMS ((reloc_howto_type *, const Elf_Internal_Rela *, bfd *, bfd_byte *));
b34976b6 442static bfd_boolean mips_elf_perform_relocation
b49e97c9
TS
443 PARAMS ((struct bfd_link_info *, reloc_howto_type *,
444 const Elf_Internal_Rela *, bfd_vma, bfd *, asection *, bfd_byte *,
b34976b6
AM
445 bfd_boolean));
446static bfd_boolean mips_elf_stub_section_p
b49e97c9
TS
447 PARAMS ((bfd *, asection *));
448static void mips_elf_allocate_dynamic_relocations
449 PARAMS ((bfd *, unsigned int));
b34976b6 450static bfd_boolean mips_elf_create_dynamic_relocation
b49e97c9
TS
451 PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Rela *,
452 struct mips_elf_link_hash_entry *, asection *,
453 bfd_vma, bfd_vma *, asection *));
64543e1a 454static void mips_set_isa_flags PARAMS ((bfd *));
b49e97c9
TS
455static INLINE char* elf_mips_abi_name PARAMS ((bfd *));
456static void mips_elf_irix6_finish_dynamic_symbol
457 PARAMS ((bfd *, const char *, Elf_Internal_Sym *));
64543e1a
RS
458static bfd_boolean mips_mach_extends_p PARAMS ((unsigned long, unsigned long));
459static bfd_boolean mips_32bit_flags_p PARAMS ((flagword));
f4416af6 460static INLINE hashval_t mips_elf_hash_bfd_vma PARAMS ((bfd_vma));
b15e6682
AO
461static hashval_t mips_elf_got_entry_hash PARAMS ((const PTR));
462static int mips_elf_got_entry_eq PARAMS ((const PTR, const PTR));
b49e97c9 463
f4416af6
AO
464static bfd_boolean mips_elf_multi_got
465 PARAMS ((bfd *, struct bfd_link_info *, struct mips_got_info *,
466 asection *, bfd_size_type));
467static hashval_t mips_elf_multi_got_entry_hash PARAMS ((const PTR));
468static int mips_elf_multi_got_entry_eq PARAMS ((const PTR, const PTR));
469static hashval_t mips_elf_bfd2got_entry_hash PARAMS ((const PTR));
470static int mips_elf_bfd2got_entry_eq PARAMS ((const PTR, const PTR));
471static int mips_elf_make_got_per_bfd PARAMS ((void **, void *));
472static int mips_elf_merge_gots PARAMS ((void **, void *));
473static int mips_elf_set_global_got_offset PARAMS ((void**, void *));
474static int mips_elf_resolve_final_got_entry PARAMS ((void**, void *));
475static void mips_elf_resolve_final_got_entries
476 PARAMS ((struct mips_got_info *));
477static bfd_vma mips_elf_adjust_gp
478 PARAMS ((bfd *, struct mips_got_info *, bfd *));
479static struct mips_got_info *mips_elf_got_for_ibfd
480 PARAMS ((struct mips_got_info *, bfd *));
481
b49e97c9
TS
482/* This will be used when we sort the dynamic relocation records. */
483static bfd *reldyn_sorting_bfd;
484
485/* Nonzero if ABFD is using the N32 ABI. */
0b25d3e6 486
b49e97c9
TS
487#define ABI_N32_P(abfd) \
488 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
489
4a14403c 490/* Nonzero if ABFD is using the N64 ABI. */
b49e97c9 491#define ABI_64_P(abfd) \
141ff970 492 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
b49e97c9 493
4a14403c
TS
494/* Nonzero if ABFD is using NewABI conventions. */
495#define NEWABI_P(abfd) (ABI_N32_P (abfd) || ABI_64_P (abfd))
496
497/* The IRIX compatibility level we are striving for. */
b49e97c9
TS
498#define IRIX_COMPAT(abfd) \
499 (get_elf_backend_data (abfd)->elf_backend_mips_irix_compat (abfd))
500
b49e97c9
TS
501/* Whether we are trying to be compatible with IRIX at all. */
502#define SGI_COMPAT(abfd) \
503 (IRIX_COMPAT (abfd) != ict_none)
504
505/* The name of the options section. */
506#define MIPS_ELF_OPTIONS_SECTION_NAME(abfd) \
d80dcc6a 507 (NEWABI_P (abfd) ? ".MIPS.options" : ".options")
b49e97c9
TS
508
509/* The name of the stub section. */
510#define MIPS_ELF_STUB_SECTION_NAME(abfd) \
d80dcc6a 511 (NEWABI_P (abfd) ? ".MIPS.stubs" : ".stub")
b49e97c9
TS
512
513/* The size of an external REL relocation. */
514#define MIPS_ELF_REL_SIZE(abfd) \
515 (get_elf_backend_data (abfd)->s->sizeof_rel)
516
517/* The size of an external dynamic table entry. */
518#define MIPS_ELF_DYN_SIZE(abfd) \
519 (get_elf_backend_data (abfd)->s->sizeof_dyn)
520
521/* The size of a GOT entry. */
522#define MIPS_ELF_GOT_SIZE(abfd) \
523 (get_elf_backend_data (abfd)->s->arch_size / 8)
524
525/* The size of a symbol-table entry. */
526#define MIPS_ELF_SYM_SIZE(abfd) \
527 (get_elf_backend_data (abfd)->s->sizeof_sym)
528
529/* The default alignment for sections, as a power of two. */
530#define MIPS_ELF_LOG_FILE_ALIGN(abfd) \
45d6a902 531 (get_elf_backend_data (abfd)->s->log_file_align)
b49e97c9
TS
532
533/* Get word-sized data. */
534#define MIPS_ELF_GET_WORD(abfd, ptr) \
535 (ABI_64_P (abfd) ? bfd_get_64 (abfd, ptr) : bfd_get_32 (abfd, ptr))
536
537/* Put out word-sized data. */
538#define MIPS_ELF_PUT_WORD(abfd, val, ptr) \
539 (ABI_64_P (abfd) \
540 ? bfd_put_64 (abfd, val, ptr) \
541 : bfd_put_32 (abfd, val, ptr))
542
543/* Add a dynamic symbol table-entry. */
544#ifdef BFD64
545#define MIPS_ELF_ADD_DYNAMIC_ENTRY(info, tag, val) \
546 (ABI_64_P (elf_hash_table (info)->dynobj) \
547 ? bfd_elf64_add_dynamic_entry (info, (bfd_vma) tag, (bfd_vma) val) \
548 : bfd_elf32_add_dynamic_entry (info, (bfd_vma) tag, (bfd_vma) val))
549#else
550#define MIPS_ELF_ADD_DYNAMIC_ENTRY(info, tag, val) \
551 (ABI_64_P (elf_hash_table (info)->dynobj) \
b34976b6 552 ? (abort (), FALSE) \
b49e97c9
TS
553 : bfd_elf32_add_dynamic_entry (info, (bfd_vma) tag, (bfd_vma) val))
554#endif
555
556#define MIPS_ELF_RTYPE_TO_HOWTO(abfd, rtype, rela) \
557 (get_elf_backend_data (abfd)->elf_backend_mips_rtype_to_howto (rtype, rela))
558
4ffba85c
AO
559/* Determine whether the internal relocation of index REL_IDX is REL
560 (zero) or RELA (non-zero). The assumption is that, if there are
561 two relocation sections for this section, one of them is REL and
562 the other is RELA. If the index of the relocation we're testing is
563 in range for the first relocation section, check that the external
564 relocation size is that for RELA. It is also assumed that, if
565 rel_idx is not in range for the first section, and this first
566 section contains REL relocs, then the relocation is in the second
567 section, that is RELA. */
568#define MIPS_RELOC_RELA_P(abfd, sec, rel_idx) \
569 ((NUM_SHDR_ENTRIES (&elf_section_data (sec)->rel_hdr) \
570 * get_elf_backend_data (abfd)->s->int_rels_per_ext_rel \
571 > (bfd_vma)(rel_idx)) \
572 == (elf_section_data (sec)->rel_hdr.sh_entsize \
573 == (ABI_64_P (abfd) ? sizeof (Elf64_External_Rela) \
574 : sizeof (Elf32_External_Rela))))
575
b49e97c9
TS
576/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
577 from smaller values. Start with zero, widen, *then* decrement. */
578#define MINUS_ONE (((bfd_vma)0) - 1)
579
580/* The number of local .got entries we reserve. */
581#define MIPS_RESERVED_GOTNO (2)
582
f4416af6
AO
583/* The offset of $gp from the beginning of the .got section. */
584#define ELF_MIPS_GP_OFFSET(abfd) (0x7ff0)
585
586/* The maximum size of the GOT for it to be addressable using 16-bit
587 offsets from $gp. */
588#define MIPS_ELF_GOT_MAX_SIZE(abfd) (ELF_MIPS_GP_OFFSET(abfd) + 0x7fff)
589
b49e97c9
TS
590/* Instructions which appear in a stub. For some reason the stub is
591 slightly different on an SGI system. */
b49e97c9 592#define STUB_LW(abfd) \
f4416af6
AO
593 ((ABI_64_P (abfd) \
594 ? 0xdf998010 /* ld t9,0x8010(gp) */ \
595 : 0x8f998010)) /* lw t9,0x8010(gp) */
b49e97c9
TS
596#define STUB_MOVE(abfd) \
597 (SGI_COMPAT (abfd) ? 0x03e07825 : 0x03e07821) /* move t7,ra */
598#define STUB_JALR 0x0320f809 /* jal t9 */
599#define STUB_LI16(abfd) \
600 (SGI_COMPAT (abfd) ? 0x34180000 : 0x24180000) /* ori t8,zero,0 */
601#define MIPS_FUNCTION_STUB_SIZE (16)
602
603/* The name of the dynamic interpreter. This is put in the .interp
604 section. */
605
606#define ELF_DYNAMIC_INTERPRETER(abfd) \
607 (ABI_N32_P (abfd) ? "/usr/lib32/libc.so.1" \
608 : ABI_64_P (abfd) ? "/usr/lib64/libc.so.1" \
609 : "/usr/lib/libc.so.1")
610
611#ifdef BFD64
ee6423ed
AO
612#define MNAME(bfd,pre,pos) \
613 (ABI_64_P (bfd) ? CONCAT4 (pre,64,_,pos) : CONCAT4 (pre,32,_,pos))
b49e97c9
TS
614#define ELF_R_SYM(bfd, i) \
615 (ABI_64_P (bfd) ? ELF64_R_SYM (i) : ELF32_R_SYM (i))
616#define ELF_R_TYPE(bfd, i) \
617 (ABI_64_P (bfd) ? ELF64_MIPS_R_TYPE (i) : ELF32_R_TYPE (i))
618#define ELF_R_INFO(bfd, s, t) \
619 (ABI_64_P (bfd) ? ELF64_R_INFO (s, t) : ELF32_R_INFO (s, t))
620#else
ee6423ed 621#define MNAME(bfd,pre,pos) CONCAT4 (pre,32,_,pos)
b49e97c9
TS
622#define ELF_R_SYM(bfd, i) \
623 (ELF32_R_SYM (i))
624#define ELF_R_TYPE(bfd, i) \
625 (ELF32_R_TYPE (i))
626#define ELF_R_INFO(bfd, s, t) \
627 (ELF32_R_INFO (s, t))
628#endif
629\f
630 /* The mips16 compiler uses a couple of special sections to handle
631 floating point arguments.
632
633 Section names that look like .mips16.fn.FNNAME contain stubs that
634 copy floating point arguments from the fp regs to the gp regs and
635 then jump to FNNAME. If any 32 bit function calls FNNAME, the
636 call should be redirected to the stub instead. If no 32 bit
637 function calls FNNAME, the stub should be discarded. We need to
638 consider any reference to the function, not just a call, because
639 if the address of the function is taken we will need the stub,
640 since the address might be passed to a 32 bit function.
641
642 Section names that look like .mips16.call.FNNAME contain stubs
643 that copy floating point arguments from the gp regs to the fp
644 regs and then jump to FNNAME. If FNNAME is a 32 bit function,
645 then any 16 bit function that calls FNNAME should be redirected
646 to the stub instead. If FNNAME is not a 32 bit function, the
647 stub should be discarded.
648
649 .mips16.call.fp.FNNAME sections are similar, but contain stubs
650 which call FNNAME and then copy the return value from the fp regs
651 to the gp regs. These stubs store the return value in $18 while
652 calling FNNAME; any function which might call one of these stubs
653 must arrange to save $18 around the call. (This case is not
654 needed for 32 bit functions that call 16 bit functions, because
655 16 bit functions always return floating point values in both
656 $f0/$f1 and $2/$3.)
657
658 Note that in all cases FNNAME might be defined statically.
659 Therefore, FNNAME is not used literally. Instead, the relocation
660 information will indicate which symbol the section is for.
661
662 We record any stubs that we find in the symbol table. */
663
664#define FN_STUB ".mips16.fn."
665#define CALL_STUB ".mips16.call."
666#define CALL_FP_STUB ".mips16.call.fp."
667\f
668/* Look up an entry in a MIPS ELF linker hash table. */
669
670#define mips_elf_link_hash_lookup(table, string, create, copy, follow) \
671 ((struct mips_elf_link_hash_entry *) \
672 elf_link_hash_lookup (&(table)->root, (string), (create), \
673 (copy), (follow)))
674
675/* Traverse a MIPS ELF linker hash table. */
676
677#define mips_elf_link_hash_traverse(table, func, info) \
678 (elf_link_hash_traverse \
679 (&(table)->root, \
b34976b6 680 (bfd_boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
b49e97c9
TS
681 (info)))
682
683/* Get the MIPS ELF linker hash table from a link_info structure. */
684
685#define mips_elf_hash_table(p) \
686 ((struct mips_elf_link_hash_table *) ((p)->hash))
687
688/* Create an entry in a MIPS ELF linker hash table. */
689
690static struct bfd_hash_entry *
691mips_elf_link_hash_newfunc (entry, table, string)
692 struct bfd_hash_entry *entry;
693 struct bfd_hash_table *table;
694 const char *string;
695{
696 struct mips_elf_link_hash_entry *ret =
697 (struct mips_elf_link_hash_entry *) entry;
698
699 /* Allocate the structure if it has not already been allocated by a
700 subclass. */
701 if (ret == (struct mips_elf_link_hash_entry *) NULL)
702 ret = ((struct mips_elf_link_hash_entry *)
703 bfd_hash_allocate (table,
704 sizeof (struct mips_elf_link_hash_entry)));
705 if (ret == (struct mips_elf_link_hash_entry *) NULL)
706 return (struct bfd_hash_entry *) ret;
707
708 /* Call the allocation method of the superclass. */
709 ret = ((struct mips_elf_link_hash_entry *)
710 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
711 table, string));
712 if (ret != (struct mips_elf_link_hash_entry *) NULL)
713 {
714 /* Set local fields. */
715 memset (&ret->esym, 0, sizeof (EXTR));
716 /* We use -2 as a marker to indicate that the information has
717 not been set. -1 means there is no associated ifd. */
718 ret->esym.ifd = -2;
719 ret->possibly_dynamic_relocs = 0;
b34976b6 720 ret->readonly_reloc = FALSE;
b34976b6 721 ret->no_fn_stub = FALSE;
b49e97c9 722 ret->fn_stub = NULL;
b34976b6 723 ret->need_fn_stub = FALSE;
b49e97c9
TS
724 ret->call_stub = NULL;
725 ret->call_fp_stub = NULL;
b34976b6 726 ret->forced_local = FALSE;
b49e97c9
TS
727 }
728
729 return (struct bfd_hash_entry *) ret;
730}
f0abc2a1
AM
731
732bfd_boolean
733_bfd_mips_elf_new_section_hook (abfd, sec)
734 bfd *abfd;
735 asection *sec;
736{
737 struct _mips_elf_section_data *sdata;
738 bfd_size_type amt = sizeof (*sdata);
739
740 sdata = (struct _mips_elf_section_data *) bfd_zalloc (abfd, amt);
741 if (sdata == NULL)
742 return FALSE;
743 sec->used_by_bfd = (PTR) sdata;
744
745 return _bfd_elf_new_section_hook (abfd, sec);
746}
b49e97c9
TS
747\f
748/* Read ECOFF debugging information from a .mdebug section into a
749 ecoff_debug_info structure. */
750
b34976b6 751bfd_boolean
b49e97c9
TS
752_bfd_mips_elf_read_ecoff_info (abfd, section, debug)
753 bfd *abfd;
754 asection *section;
755 struct ecoff_debug_info *debug;
756{
757 HDRR *symhdr;
758 const struct ecoff_debug_swap *swap;
759 char *ext_hdr = NULL;
760
761 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
762 memset (debug, 0, sizeof (*debug));
763
764 ext_hdr = (char *) bfd_malloc (swap->external_hdr_size);
765 if (ext_hdr == NULL && swap->external_hdr_size != 0)
766 goto error_return;
767
82e51918
AM
768 if (! bfd_get_section_contents (abfd, section, ext_hdr, (file_ptr) 0,
769 swap->external_hdr_size))
b49e97c9
TS
770 goto error_return;
771
772 symhdr = &debug->symbolic_header;
773 (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
774
775 /* The symbolic header contains absolute file offsets and sizes to
776 read. */
777#define READ(ptr, offset, count, size, type) \
778 if (symhdr->count == 0) \
779 debug->ptr = NULL; \
780 else \
781 { \
782 bfd_size_type amt = (bfd_size_type) size * symhdr->count; \
783 debug->ptr = (type) bfd_malloc (amt); \
784 if (debug->ptr == NULL) \
785 goto error_return; \
786 if (bfd_seek (abfd, (file_ptr) symhdr->offset, SEEK_SET) != 0 \
787 || bfd_bread (debug->ptr, amt, abfd) != amt) \
788 goto error_return; \
789 }
790
791 READ (line, cbLineOffset, cbLine, sizeof (unsigned char), unsigned char *);
792 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, PTR);
793 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, PTR);
794 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, PTR);
795 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, PTR);
796 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
797 union aux_ext *);
798 READ (ss, cbSsOffset, issMax, sizeof (char), char *);
799 READ (ssext, cbSsExtOffset, issExtMax, sizeof (char), char *);
800 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, PTR);
801 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, PTR);
802 READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size, PTR);
803#undef READ
804
805 debug->fdr = NULL;
806 debug->adjust = NULL;
807
b34976b6 808 return TRUE;
b49e97c9
TS
809
810 error_return:
811 if (ext_hdr != NULL)
812 free (ext_hdr);
813 if (debug->line != NULL)
814 free (debug->line);
815 if (debug->external_dnr != NULL)
816 free (debug->external_dnr);
817 if (debug->external_pdr != NULL)
818 free (debug->external_pdr);
819 if (debug->external_sym != NULL)
820 free (debug->external_sym);
821 if (debug->external_opt != NULL)
822 free (debug->external_opt);
823 if (debug->external_aux != NULL)
824 free (debug->external_aux);
825 if (debug->ss != NULL)
826 free (debug->ss);
827 if (debug->ssext != NULL)
828 free (debug->ssext);
829 if (debug->external_fdr != NULL)
830 free (debug->external_fdr);
831 if (debug->external_rfd != NULL)
832 free (debug->external_rfd);
833 if (debug->external_ext != NULL)
834 free (debug->external_ext);
b34976b6 835 return FALSE;
b49e97c9
TS
836}
837\f
838/* Swap RPDR (runtime procedure table entry) for output. */
839
840static void
841ecoff_swap_rpdr_out (abfd, in, ex)
842 bfd *abfd;
843 const RPDR *in;
844 struct rpdr_ext *ex;
845{
846 H_PUT_S32 (abfd, in->adr, ex->p_adr);
847 H_PUT_32 (abfd, in->regmask, ex->p_regmask);
848 H_PUT_32 (abfd, in->regoffset, ex->p_regoffset);
849 H_PUT_32 (abfd, in->fregmask, ex->p_fregmask);
850 H_PUT_32 (abfd, in->fregoffset, ex->p_fregoffset);
851 H_PUT_32 (abfd, in->frameoffset, ex->p_frameoffset);
852
853 H_PUT_16 (abfd, in->framereg, ex->p_framereg);
854 H_PUT_16 (abfd, in->pcreg, ex->p_pcreg);
855
856 H_PUT_32 (abfd, in->irpss, ex->p_irpss);
857#if 0 /* FIXME */
858 H_PUT_S32 (abfd, in->exception_info, ex->p_exception_info);
859#endif
860}
861
862/* Create a runtime procedure table from the .mdebug section. */
863
b34976b6 864static bfd_boolean
b49e97c9
TS
865mips_elf_create_procedure_table (handle, abfd, info, s, debug)
866 PTR handle;
867 bfd *abfd;
868 struct bfd_link_info *info;
869 asection *s;
870 struct ecoff_debug_info *debug;
871{
872 const struct ecoff_debug_swap *swap;
873 HDRR *hdr = &debug->symbolic_header;
874 RPDR *rpdr, *rp;
875 struct rpdr_ext *erp;
876 PTR rtproc;
877 struct pdr_ext *epdr;
878 struct sym_ext *esym;
879 char *ss, **sv;
880 char *str;
881 bfd_size_type size;
882 bfd_size_type count;
883 unsigned long sindex;
884 unsigned long i;
885 PDR pdr;
886 SYMR sym;
887 const char *no_name_func = _("static procedure (no name)");
888
889 epdr = NULL;
890 rpdr = NULL;
891 esym = NULL;
892 ss = NULL;
893 sv = NULL;
894
895 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
896
897 sindex = strlen (no_name_func) + 1;
898 count = hdr->ipdMax;
899 if (count > 0)
900 {
901 size = swap->external_pdr_size;
902
903 epdr = (struct pdr_ext *) bfd_malloc (size * count);
904 if (epdr == NULL)
905 goto error_return;
906
907 if (! _bfd_ecoff_get_accumulated_pdr (handle, (PTR) epdr))
908 goto error_return;
909
910 size = sizeof (RPDR);
911 rp = rpdr = (RPDR *) bfd_malloc (size * count);
912 if (rpdr == NULL)
913 goto error_return;
914
915 size = sizeof (char *);
916 sv = (char **) bfd_malloc (size * count);
917 if (sv == NULL)
918 goto error_return;
919
920 count = hdr->isymMax;
921 size = swap->external_sym_size;
922 esym = (struct sym_ext *) bfd_malloc (size * count);
923 if (esym == NULL)
924 goto error_return;
925
926 if (! _bfd_ecoff_get_accumulated_sym (handle, (PTR) esym))
927 goto error_return;
928
929 count = hdr->issMax;
930 ss = (char *) bfd_malloc (count);
931 if (ss == NULL)
932 goto error_return;
933 if (! _bfd_ecoff_get_accumulated_ss (handle, (PTR) ss))
934 goto error_return;
935
936 count = hdr->ipdMax;
937 for (i = 0; i < (unsigned long) count; i++, rp++)
938 {
939 (*swap->swap_pdr_in) (abfd, (PTR) (epdr + i), &pdr);
940 (*swap->swap_sym_in) (abfd, (PTR) &esym[pdr.isym], &sym);
941 rp->adr = sym.value;
942 rp->regmask = pdr.regmask;
943 rp->regoffset = pdr.regoffset;
944 rp->fregmask = pdr.fregmask;
945 rp->fregoffset = pdr.fregoffset;
946 rp->frameoffset = pdr.frameoffset;
947 rp->framereg = pdr.framereg;
948 rp->pcreg = pdr.pcreg;
949 rp->irpss = sindex;
950 sv[i] = ss + sym.iss;
951 sindex += strlen (sv[i]) + 1;
952 }
953 }
954
955 size = sizeof (struct rpdr_ext) * (count + 2) + sindex;
956 size = BFD_ALIGN (size, 16);
957 rtproc = (PTR) bfd_alloc (abfd, size);
958 if (rtproc == NULL)
959 {
960 mips_elf_hash_table (info)->procedure_count = 0;
961 goto error_return;
962 }
963
964 mips_elf_hash_table (info)->procedure_count = count + 2;
965
966 erp = (struct rpdr_ext *) rtproc;
967 memset (erp, 0, sizeof (struct rpdr_ext));
968 erp++;
969 str = (char *) rtproc + sizeof (struct rpdr_ext) * (count + 2);
970 strcpy (str, no_name_func);
971 str += strlen (no_name_func) + 1;
972 for (i = 0; i < count; i++)
973 {
974 ecoff_swap_rpdr_out (abfd, rpdr + i, erp + i);
975 strcpy (str, sv[i]);
976 str += strlen (sv[i]) + 1;
977 }
978 H_PUT_S32 (abfd, -1, (erp + count)->p_adr);
979
980 /* Set the size and contents of .rtproc section. */
981 s->_raw_size = size;
982 s->contents = (bfd_byte *) rtproc;
983
984 /* Skip this section later on (I don't think this currently
985 matters, but someday it might). */
986 s->link_order_head = (struct bfd_link_order *) NULL;
987
988 if (epdr != NULL)
989 free (epdr);
990 if (rpdr != NULL)
991 free (rpdr);
992 if (esym != NULL)
993 free (esym);
994 if (ss != NULL)
995 free (ss);
996 if (sv != NULL)
997 free (sv);
998
b34976b6 999 return TRUE;
b49e97c9
TS
1000
1001 error_return:
1002 if (epdr != NULL)
1003 free (epdr);
1004 if (rpdr != NULL)
1005 free (rpdr);
1006 if (esym != NULL)
1007 free (esym);
1008 if (ss != NULL)
1009 free (ss);
1010 if (sv != NULL)
1011 free (sv);
b34976b6 1012 return FALSE;
b49e97c9
TS
1013}
1014
1015/* Check the mips16 stubs for a particular symbol, and see if we can
1016 discard them. */
1017
b34976b6 1018static bfd_boolean
b49e97c9
TS
1019mips_elf_check_mips16_stubs (h, data)
1020 struct mips_elf_link_hash_entry *h;
1021 PTR data ATTRIBUTE_UNUSED;
1022{
1023 if (h->root.root.type == bfd_link_hash_warning)
1024 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
1025
1026 if (h->fn_stub != NULL
1027 && ! h->need_fn_stub)
1028 {
1029 /* We don't need the fn_stub; the only references to this symbol
1030 are 16 bit calls. Clobber the size to 0 to prevent it from
1031 being included in the link. */
1032 h->fn_stub->_raw_size = 0;
1033 h->fn_stub->_cooked_size = 0;
1034 h->fn_stub->flags &= ~SEC_RELOC;
1035 h->fn_stub->reloc_count = 0;
1036 h->fn_stub->flags |= SEC_EXCLUDE;
1037 }
1038
1039 if (h->call_stub != NULL
1040 && h->root.other == STO_MIPS16)
1041 {
1042 /* We don't need the call_stub; this is a 16 bit function, so
1043 calls from other 16 bit functions are OK. Clobber the size
1044 to 0 to prevent it from being included in the link. */
1045 h->call_stub->_raw_size = 0;
1046 h->call_stub->_cooked_size = 0;
1047 h->call_stub->flags &= ~SEC_RELOC;
1048 h->call_stub->reloc_count = 0;
1049 h->call_stub->flags |= SEC_EXCLUDE;
1050 }
1051
1052 if (h->call_fp_stub != NULL
1053 && h->root.other == STO_MIPS16)
1054 {
1055 /* We don't need the call_stub; this is a 16 bit function, so
1056 calls from other 16 bit functions are OK. Clobber the size
1057 to 0 to prevent it from being included in the link. */
1058 h->call_fp_stub->_raw_size = 0;
1059 h->call_fp_stub->_cooked_size = 0;
1060 h->call_fp_stub->flags &= ~SEC_RELOC;
1061 h->call_fp_stub->reloc_count = 0;
1062 h->call_fp_stub->flags |= SEC_EXCLUDE;
1063 }
1064
b34976b6 1065 return TRUE;
b49e97c9
TS
1066}
1067\f
1068bfd_reloc_status_type
1069_bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry, input_section,
1049f94e 1070 relocatable, data, gp)
b49e97c9
TS
1071 bfd *abfd;
1072 asymbol *symbol;
1073 arelent *reloc_entry;
1074 asection *input_section;
1049f94e 1075 bfd_boolean relocatable;
b49e97c9
TS
1076 PTR data;
1077 bfd_vma gp;
1078{
1079 bfd_vma relocation;
a7ebbfdf
TS
1080 unsigned long insn = 0;
1081 bfd_signed_vma val;
b49e97c9
TS
1082
1083 if (bfd_is_com_section (symbol->section))
1084 relocation = 0;
1085 else
1086 relocation = symbol->value;
1087
1088 relocation += symbol->section->output_section->vma;
1089 relocation += symbol->section->output_offset;
1090
1091 if (reloc_entry->address > input_section->_cooked_size)
1092 return bfd_reloc_outofrange;
1093
b49e97c9 1094 /* Set val to the offset into the section or symbol. */
a7ebbfdf
TS
1095 val = reloc_entry->addend;
1096
1097 if (reloc_entry->howto->partial_inplace)
b49e97c9 1098 {
a7ebbfdf
TS
1099 insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1100 val += insn & 0xffff;
b49e97c9
TS
1101 }
1102
a7ebbfdf
TS
1103 _bfd_mips_elf_sign_extend(val, 16);
1104
b49e97c9 1105 /* Adjust val for the final section location and GP value. If we
1049f94e 1106 are producing relocatable output, we don't want to do this for
b49e97c9 1107 an external symbol. */
1049f94e 1108 if (! relocatable
b49e97c9
TS
1109 || (symbol->flags & BSF_SECTION_SYM) != 0)
1110 val += relocation - gp;
1111
a7ebbfdf
TS
1112 if (reloc_entry->howto->partial_inplace)
1113 {
1114 insn = (insn & ~0xffff) | (val & 0xffff);
1115 bfd_put_32 (abfd, (bfd_vma) insn,
1116 (bfd_byte *) data + reloc_entry->address);
1117 }
1118 else
1119 reloc_entry->addend = val;
b49e97c9 1120
1049f94e 1121 if (relocatable)
b49e97c9 1122 reloc_entry->address += input_section->output_offset;
a7ebbfdf 1123 else if (((val & ~0xffff) != ~0xffff) && ((val & ~0xffff) != 0))
b49e97c9
TS
1124 return bfd_reloc_overflow;
1125
1126 return bfd_reloc_ok;
1127}
1128\f
1129/* Swap an entry in a .gptab section. Note that these routines rely
1130 on the equivalence of the two elements of the union. */
1131
1132static void
1133bfd_mips_elf32_swap_gptab_in (abfd, ex, in)
1134 bfd *abfd;
1135 const Elf32_External_gptab *ex;
1136 Elf32_gptab *in;
1137{
1138 in->gt_entry.gt_g_value = H_GET_32 (abfd, ex->gt_entry.gt_g_value);
1139 in->gt_entry.gt_bytes = H_GET_32 (abfd, ex->gt_entry.gt_bytes);
1140}
1141
1142static void
1143bfd_mips_elf32_swap_gptab_out (abfd, in, ex)
1144 bfd *abfd;
1145 const Elf32_gptab *in;
1146 Elf32_External_gptab *ex;
1147{
1148 H_PUT_32 (abfd, in->gt_entry.gt_g_value, ex->gt_entry.gt_g_value);
1149 H_PUT_32 (abfd, in->gt_entry.gt_bytes, ex->gt_entry.gt_bytes);
1150}
1151
1152static void
1153bfd_elf32_swap_compact_rel_out (abfd, in, ex)
1154 bfd *abfd;
1155 const Elf32_compact_rel *in;
1156 Elf32_External_compact_rel *ex;
1157{
1158 H_PUT_32 (abfd, in->id1, ex->id1);
1159 H_PUT_32 (abfd, in->num, ex->num);
1160 H_PUT_32 (abfd, in->id2, ex->id2);
1161 H_PUT_32 (abfd, in->offset, ex->offset);
1162 H_PUT_32 (abfd, in->reserved0, ex->reserved0);
1163 H_PUT_32 (abfd, in->reserved1, ex->reserved1);
1164}
1165
1166static void
1167bfd_elf32_swap_crinfo_out (abfd, in, ex)
1168 bfd *abfd;
1169 const Elf32_crinfo *in;
1170 Elf32_External_crinfo *ex;
1171{
1172 unsigned long l;
1173
1174 l = (((in->ctype & CRINFO_CTYPE) << CRINFO_CTYPE_SH)
1175 | ((in->rtype & CRINFO_RTYPE) << CRINFO_RTYPE_SH)
1176 | ((in->dist2to & CRINFO_DIST2TO) << CRINFO_DIST2TO_SH)
1177 | ((in->relvaddr & CRINFO_RELVADDR) << CRINFO_RELVADDR_SH));
1178 H_PUT_32 (abfd, l, ex->info);
1179 H_PUT_32 (abfd, in->konst, ex->konst);
1180 H_PUT_32 (abfd, in->vaddr, ex->vaddr);
1181}
b49e97c9
TS
1182\f
1183/* A .reginfo section holds a single Elf32_RegInfo structure. These
1184 routines swap this structure in and out. They are used outside of
1185 BFD, so they are globally visible. */
1186
1187void
1188bfd_mips_elf32_swap_reginfo_in (abfd, ex, in)
1189 bfd *abfd;
1190 const Elf32_External_RegInfo *ex;
1191 Elf32_RegInfo *in;
1192{
1193 in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
1194 in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
1195 in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
1196 in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
1197 in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
1198 in->ri_gp_value = H_GET_32 (abfd, ex->ri_gp_value);
1199}
1200
1201void
1202bfd_mips_elf32_swap_reginfo_out (abfd, in, ex)
1203 bfd *abfd;
1204 const Elf32_RegInfo *in;
1205 Elf32_External_RegInfo *ex;
1206{
1207 H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
1208 H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
1209 H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
1210 H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
1211 H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
1212 H_PUT_32 (abfd, in->ri_gp_value, ex->ri_gp_value);
1213}
1214
1215/* In the 64 bit ABI, the .MIPS.options section holds register
1216 information in an Elf64_Reginfo structure. These routines swap
1217 them in and out. They are globally visible because they are used
1218 outside of BFD. These routines are here so that gas can call them
1219 without worrying about whether the 64 bit ABI has been included. */
1220
1221void
1222bfd_mips_elf64_swap_reginfo_in (abfd, ex, in)
1223 bfd *abfd;
1224 const Elf64_External_RegInfo *ex;
1225 Elf64_Internal_RegInfo *in;
1226{
1227 in->ri_gprmask = H_GET_32 (abfd, ex->ri_gprmask);
1228 in->ri_pad = H_GET_32 (abfd, ex->ri_pad);
1229 in->ri_cprmask[0] = H_GET_32 (abfd, ex->ri_cprmask[0]);
1230 in->ri_cprmask[1] = H_GET_32 (abfd, ex->ri_cprmask[1]);
1231 in->ri_cprmask[2] = H_GET_32 (abfd, ex->ri_cprmask[2]);
1232 in->ri_cprmask[3] = H_GET_32 (abfd, ex->ri_cprmask[3]);
1233 in->ri_gp_value = H_GET_64 (abfd, ex->ri_gp_value);
1234}
1235
1236void
1237bfd_mips_elf64_swap_reginfo_out (abfd, in, ex)
1238 bfd *abfd;
1239 const Elf64_Internal_RegInfo *in;
1240 Elf64_External_RegInfo *ex;
1241{
1242 H_PUT_32 (abfd, in->ri_gprmask, ex->ri_gprmask);
1243 H_PUT_32 (abfd, in->ri_pad, ex->ri_pad);
1244 H_PUT_32 (abfd, in->ri_cprmask[0], ex->ri_cprmask[0]);
1245 H_PUT_32 (abfd, in->ri_cprmask[1], ex->ri_cprmask[1]);
1246 H_PUT_32 (abfd, in->ri_cprmask[2], ex->ri_cprmask[2]);
1247 H_PUT_32 (abfd, in->ri_cprmask[3], ex->ri_cprmask[3]);
1248 H_PUT_64 (abfd, in->ri_gp_value, ex->ri_gp_value);
1249}
1250
1251/* Swap in an options header. */
1252
1253void
1254bfd_mips_elf_swap_options_in (abfd, ex, in)
1255 bfd *abfd;
1256 const Elf_External_Options *ex;
1257 Elf_Internal_Options *in;
1258{
1259 in->kind = H_GET_8 (abfd, ex->kind);
1260 in->size = H_GET_8 (abfd, ex->size);
1261 in->section = H_GET_16 (abfd, ex->section);
1262 in->info = H_GET_32 (abfd, ex->info);
1263}
1264
1265/* Swap out an options header. */
1266
1267void
1268bfd_mips_elf_swap_options_out (abfd, in, ex)
1269 bfd *abfd;
1270 const Elf_Internal_Options *in;
1271 Elf_External_Options *ex;
1272{
1273 H_PUT_8 (abfd, in->kind, ex->kind);
1274 H_PUT_8 (abfd, in->size, ex->size);
1275 H_PUT_16 (abfd, in->section, ex->section);
1276 H_PUT_32 (abfd, in->info, ex->info);
1277}
1278\f
1279/* This function is called via qsort() to sort the dynamic relocation
1280 entries by increasing r_symndx value. */
1281
1282static int
1283sort_dynamic_relocs (arg1, arg2)
1284 const PTR arg1;
1285 const PTR arg2;
1286{
947216bf
AM
1287 Elf_Internal_Rela int_reloc1;
1288 Elf_Internal_Rela int_reloc2;
b49e97c9 1289
947216bf
AM
1290 bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg1, &int_reloc1);
1291 bfd_elf32_swap_reloc_in (reldyn_sorting_bfd, arg2, &int_reloc2);
b49e97c9 1292
947216bf 1293 return ELF32_R_SYM (int_reloc1.r_info) - ELF32_R_SYM (int_reloc2.r_info);
b49e97c9
TS
1294}
1295
f4416af6
AO
1296/* Like sort_dynamic_relocs, but used for elf64 relocations. */
1297
1298static int
1299sort_dynamic_relocs_64 (arg1, arg2)
1300 const PTR arg1;
1301 const PTR arg2;
1302{
1303 Elf_Internal_Rela int_reloc1[3];
1304 Elf_Internal_Rela int_reloc2[3];
1305
1306 (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
1307 (reldyn_sorting_bfd, arg1, int_reloc1);
1308 (*get_elf_backend_data (reldyn_sorting_bfd)->s->swap_reloc_in)
1309 (reldyn_sorting_bfd, arg2, int_reloc2);
1310
1311 return (ELF64_R_SYM (int_reloc1[0].r_info)
1312 - ELF64_R_SYM (int_reloc2[0].r_info));
1313}
1314
1315
b49e97c9
TS
1316/* This routine is used to write out ECOFF debugging external symbol
1317 information. It is called via mips_elf_link_hash_traverse. The
1318 ECOFF external symbol information must match the ELF external
1319 symbol information. Unfortunately, at this point we don't know
1320 whether a symbol is required by reloc information, so the two
1321 tables may wind up being different. We must sort out the external
1322 symbol information before we can set the final size of the .mdebug
1323 section, and we must set the size of the .mdebug section before we
1324 can relocate any sections, and we can't know which symbols are
1325 required by relocation until we relocate the sections.
1326 Fortunately, it is relatively unlikely that any symbol will be
1327 stripped but required by a reloc. In particular, it can not happen
1328 when generating a final executable. */
1329
b34976b6 1330static bfd_boolean
b49e97c9
TS
1331mips_elf_output_extsym (h, data)
1332 struct mips_elf_link_hash_entry *h;
1333 PTR data;
1334{
1335 struct extsym_info *einfo = (struct extsym_info *) data;
b34976b6 1336 bfd_boolean strip;
b49e97c9
TS
1337 asection *sec, *output_section;
1338
1339 if (h->root.root.type == bfd_link_hash_warning)
1340 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
1341
1342 if (h->root.indx == -2)
b34976b6 1343 strip = FALSE;
b49e97c9
TS
1344 else if (((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1345 || (h->root.elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0)
1346 && (h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0
1347 && (h->root.elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0)
b34976b6 1348 strip = TRUE;
b49e97c9
TS
1349 else if (einfo->info->strip == strip_all
1350 || (einfo->info->strip == strip_some
1351 && bfd_hash_lookup (einfo->info->keep_hash,
1352 h->root.root.root.string,
b34976b6
AM
1353 FALSE, FALSE) == NULL))
1354 strip = TRUE;
b49e97c9 1355 else
b34976b6 1356 strip = FALSE;
b49e97c9
TS
1357
1358 if (strip)
b34976b6 1359 return TRUE;
b49e97c9
TS
1360
1361 if (h->esym.ifd == -2)
1362 {
1363 h->esym.jmptbl = 0;
1364 h->esym.cobol_main = 0;
1365 h->esym.weakext = 0;
1366 h->esym.reserved = 0;
1367 h->esym.ifd = ifdNil;
1368 h->esym.asym.value = 0;
1369 h->esym.asym.st = stGlobal;
1370
1371 if (h->root.root.type == bfd_link_hash_undefined
1372 || h->root.root.type == bfd_link_hash_undefweak)
1373 {
1374 const char *name;
1375
1376 /* Use undefined class. Also, set class and type for some
1377 special symbols. */
1378 name = h->root.root.root.string;
1379 if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
1380 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
1381 {
1382 h->esym.asym.sc = scData;
1383 h->esym.asym.st = stLabel;
1384 h->esym.asym.value = 0;
1385 }
1386 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
1387 {
1388 h->esym.asym.sc = scAbs;
1389 h->esym.asym.st = stLabel;
1390 h->esym.asym.value =
1391 mips_elf_hash_table (einfo->info)->procedure_count;
1392 }
4a14403c 1393 else if (strcmp (name, "_gp_disp") == 0 && ! NEWABI_P (einfo->abfd))
b49e97c9
TS
1394 {
1395 h->esym.asym.sc = scAbs;
1396 h->esym.asym.st = stLabel;
1397 h->esym.asym.value = elf_gp (einfo->abfd);
1398 }
1399 else
1400 h->esym.asym.sc = scUndefined;
1401 }
1402 else if (h->root.root.type != bfd_link_hash_defined
1403 && h->root.root.type != bfd_link_hash_defweak)
1404 h->esym.asym.sc = scAbs;
1405 else
1406 {
1407 const char *name;
1408
1409 sec = h->root.root.u.def.section;
1410 output_section = sec->output_section;
1411
1412 /* When making a shared library and symbol h is the one from
1413 the another shared library, OUTPUT_SECTION may be null. */
1414 if (output_section == NULL)
1415 h->esym.asym.sc = scUndefined;
1416 else
1417 {
1418 name = bfd_section_name (output_section->owner, output_section);
1419
1420 if (strcmp (name, ".text") == 0)
1421 h->esym.asym.sc = scText;
1422 else if (strcmp (name, ".data") == 0)
1423 h->esym.asym.sc = scData;
1424 else if (strcmp (name, ".sdata") == 0)
1425 h->esym.asym.sc = scSData;
1426 else if (strcmp (name, ".rodata") == 0
1427 || strcmp (name, ".rdata") == 0)
1428 h->esym.asym.sc = scRData;
1429 else if (strcmp (name, ".bss") == 0)
1430 h->esym.asym.sc = scBss;
1431 else if (strcmp (name, ".sbss") == 0)
1432 h->esym.asym.sc = scSBss;
1433 else if (strcmp (name, ".init") == 0)
1434 h->esym.asym.sc = scInit;
1435 else if (strcmp (name, ".fini") == 0)
1436 h->esym.asym.sc = scFini;
1437 else
1438 h->esym.asym.sc = scAbs;
1439 }
1440 }
1441
1442 h->esym.asym.reserved = 0;
1443 h->esym.asym.index = indexNil;
1444 }
1445
1446 if (h->root.root.type == bfd_link_hash_common)
1447 h->esym.asym.value = h->root.root.u.c.size;
1448 else if (h->root.root.type == bfd_link_hash_defined
1449 || h->root.root.type == bfd_link_hash_defweak)
1450 {
1451 if (h->esym.asym.sc == scCommon)
1452 h->esym.asym.sc = scBss;
1453 else if (h->esym.asym.sc == scSCommon)
1454 h->esym.asym.sc = scSBss;
1455
1456 sec = h->root.root.u.def.section;
1457 output_section = sec->output_section;
1458 if (output_section != NULL)
1459 h->esym.asym.value = (h->root.root.u.def.value
1460 + sec->output_offset
1461 + output_section->vma);
1462 else
1463 h->esym.asym.value = 0;
1464 }
1465 else if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
1466 {
1467 struct mips_elf_link_hash_entry *hd = h;
b34976b6 1468 bfd_boolean no_fn_stub = h->no_fn_stub;
b49e97c9
TS
1469
1470 while (hd->root.root.type == bfd_link_hash_indirect)
1471 {
1472 hd = (struct mips_elf_link_hash_entry *)h->root.root.u.i.link;
1473 no_fn_stub = no_fn_stub || hd->no_fn_stub;
1474 }
1475
1476 if (!no_fn_stub)
1477 {
1478 /* Set type and value for a symbol with a function stub. */
1479 h->esym.asym.st = stProc;
1480 sec = hd->root.root.u.def.section;
1481 if (sec == NULL)
1482 h->esym.asym.value = 0;
1483 else
1484 {
1485 output_section = sec->output_section;
1486 if (output_section != NULL)
1487 h->esym.asym.value = (hd->root.plt.offset
1488 + sec->output_offset
1489 + output_section->vma);
1490 else
1491 h->esym.asym.value = 0;
1492 }
1493#if 0 /* FIXME? */
1494 h->esym.ifd = 0;
1495#endif
1496 }
1497 }
1498
1499 if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
1500 h->root.root.root.string,
1501 &h->esym))
1502 {
b34976b6
AM
1503 einfo->failed = TRUE;
1504 return FALSE;
b49e97c9
TS
1505 }
1506
b34976b6 1507 return TRUE;
b49e97c9
TS
1508}
1509
1510/* A comparison routine used to sort .gptab entries. */
1511
1512static int
1513gptab_compare (p1, p2)
1514 const PTR p1;
1515 const PTR p2;
1516{
1517 const Elf32_gptab *a1 = (const Elf32_gptab *) p1;
1518 const Elf32_gptab *a2 = (const Elf32_gptab *) p2;
1519
1520 return a1->gt_entry.gt_g_value - a2->gt_entry.gt_g_value;
1521}
1522\f
b15e6682 1523/* Functions to manage the got entry hash table. */
f4416af6
AO
1524
1525/* Use all 64 bits of a bfd_vma for the computation of a 32-bit
1526 hash number. */
1527
1528static INLINE hashval_t
1529mips_elf_hash_bfd_vma (addr)
1530 bfd_vma addr;
1531{
1532#ifdef BFD64
1533 return addr + (addr >> 32);
1534#else
1535 return addr;
1536#endif
1537}
1538
1539/* got_entries only match if they're identical, except for gotidx, so
1540 use all fields to compute the hash, and compare the appropriate
1541 union members. */
1542
b15e6682
AO
1543static hashval_t
1544mips_elf_got_entry_hash (entry_)
1545 const PTR entry_;
1546{
1547 const struct mips_got_entry *entry = (struct mips_got_entry *)entry_;
1548
38985a1c 1549 return entry->symndx
f4416af6 1550 + (! entry->abfd ? mips_elf_hash_bfd_vma (entry->d.address)
38985a1c
AO
1551 : entry->abfd->id
1552 + (entry->symndx >= 0 ? mips_elf_hash_bfd_vma (entry->d.addend)
1553 : entry->d.h->root.root.root.hash));
b15e6682
AO
1554}
1555
1556static int
1557mips_elf_got_entry_eq (entry1, entry2)
1558 const PTR entry1;
1559 const PTR entry2;
1560{
1561 const struct mips_got_entry *e1 = (struct mips_got_entry *)entry1;
1562 const struct mips_got_entry *e2 = (struct mips_got_entry *)entry2;
1563
1564 return e1->abfd == e2->abfd && e1->symndx == e2->symndx
f4416af6
AO
1565 && (! e1->abfd ? e1->d.address == e2->d.address
1566 : e1->symndx >= 0 ? e1->d.addend == e2->d.addend
1567 : e1->d.h == e2->d.h);
1568}
1569
1570/* multi_got_entries are still a match in the case of global objects,
1571 even if the input bfd in which they're referenced differs, so the
1572 hash computation and compare functions are adjusted
1573 accordingly. */
1574
1575static hashval_t
1576mips_elf_multi_got_entry_hash (entry_)
1577 const PTR entry_;
1578{
1579 const struct mips_got_entry *entry = (struct mips_got_entry *)entry_;
1580
1581 return entry->symndx
1582 + (! entry->abfd
1583 ? mips_elf_hash_bfd_vma (entry->d.address)
1584 : entry->symndx >= 0
1585 ? (entry->abfd->id
1586 + mips_elf_hash_bfd_vma (entry->d.addend))
1587 : entry->d.h->root.root.root.hash);
1588}
1589
1590static int
1591mips_elf_multi_got_entry_eq (entry1, entry2)
1592 const PTR entry1;
1593 const PTR entry2;
1594{
1595 const struct mips_got_entry *e1 = (struct mips_got_entry *)entry1;
1596 const struct mips_got_entry *e2 = (struct mips_got_entry *)entry2;
1597
1598 return e1->symndx == e2->symndx
1599 && (e1->symndx >= 0 ? e1->abfd == e2->abfd && e1->d.addend == e2->d.addend
1600 : e1->abfd == NULL || e2->abfd == NULL
1601 ? e1->abfd == e2->abfd && e1->d.address == e2->d.address
1602 : e1->d.h == e2->d.h);
b15e6682
AO
1603}
1604\f
f4416af6
AO
1605/* Returns the dynamic relocation section for DYNOBJ. */
1606
1607static asection *
1608mips_elf_rel_dyn_section (dynobj, create_p)
1609 bfd *dynobj;
1610 bfd_boolean create_p;
1611{
1612 static const char dname[] = ".rel.dyn";
1613 asection *sreloc;
1614
1615 sreloc = bfd_get_section_by_name (dynobj, dname);
1616 if (sreloc == NULL && create_p)
1617 {
1618 sreloc = bfd_make_section (dynobj, dname);
1619 if (sreloc == NULL
1620 || ! bfd_set_section_flags (dynobj, sreloc,
1621 (SEC_ALLOC
1622 | SEC_LOAD
1623 | SEC_HAS_CONTENTS
1624 | SEC_IN_MEMORY
1625 | SEC_LINKER_CREATED
1626 | SEC_READONLY))
1627 || ! bfd_set_section_alignment (dynobj, sreloc,
d80dcc6a 1628 MIPS_ELF_LOG_FILE_ALIGN (dynobj)))
f4416af6
AO
1629 return NULL;
1630 }
1631 return sreloc;
1632}
1633
b49e97c9
TS
1634/* Returns the GOT section for ABFD. */
1635
1636static asection *
f4416af6 1637mips_elf_got_section (abfd, maybe_excluded)
b49e97c9 1638 bfd *abfd;
f4416af6 1639 bfd_boolean maybe_excluded;
b49e97c9 1640{
f4416af6
AO
1641 asection *sgot = bfd_get_section_by_name (abfd, ".got");
1642 if (sgot == NULL
1643 || (! maybe_excluded && (sgot->flags & SEC_EXCLUDE) != 0))
1644 return NULL;
1645 return sgot;
b49e97c9
TS
1646}
1647
1648/* Returns the GOT information associated with the link indicated by
1649 INFO. If SGOTP is non-NULL, it is filled in with the GOT
1650 section. */
1651
1652static struct mips_got_info *
1653mips_elf_got_info (abfd, sgotp)
1654 bfd *abfd;
1655 asection **sgotp;
1656{
1657 asection *sgot;
1658 struct mips_got_info *g;
1659
f4416af6 1660 sgot = mips_elf_got_section (abfd, TRUE);
b49e97c9 1661 BFD_ASSERT (sgot != NULL);
f0abc2a1
AM
1662 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
1663 g = mips_elf_section_data (sgot)->u.got_info;
b49e97c9
TS
1664 BFD_ASSERT (g != NULL);
1665
1666 if (sgotp)
f4416af6
AO
1667 *sgotp = (sgot->flags & SEC_EXCLUDE) == 0 ? sgot : NULL;
1668
b49e97c9
TS
1669 return g;
1670}
1671
0176c794
AO
1672/* Obtain the lowest dynamic index of a symbol that was assigned a
1673 global GOT entry. */
1674static long
1675mips_elf_get_global_gotsym_index (abfd)
1676 bfd *abfd;
1677{
1678 asection *sgot;
1679 struct mips_got_info *g;
1680
1681 if (abfd == NULL)
1682 return 0;
143d77c5 1683
0176c794
AO
1684 sgot = mips_elf_got_section (abfd, TRUE);
1685 if (sgot == NULL || mips_elf_section_data (sgot) == NULL)
1686 return 0;
143d77c5 1687
0176c794
AO
1688 g = mips_elf_section_data (sgot)->u.got_info;
1689 if (g == NULL || g->global_gotsym == NULL)
1690 return 0;
143d77c5 1691
0176c794
AO
1692 return g->global_gotsym->dynindx;
1693}
1694
b49e97c9
TS
1695/* Returns the GOT offset at which the indicated address can be found.
1696 If there is not yet a GOT entry for this value, create one. Returns
1697 -1 if no satisfactory GOT offset can be found. */
1698
1699static bfd_vma
f4416af6
AO
1700mips_elf_local_got_index (abfd, ibfd, info, value)
1701 bfd *abfd, *ibfd;
b49e97c9
TS
1702 struct bfd_link_info *info;
1703 bfd_vma value;
1704{
1705 asection *sgot;
1706 struct mips_got_info *g;
b15e6682 1707 struct mips_got_entry *entry;
b49e97c9
TS
1708
1709 g = mips_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
1710
f4416af6 1711 entry = mips_elf_create_local_got_entry (abfd, ibfd, g, sgot, value);
b15e6682
AO
1712 if (entry)
1713 return entry->gotidx;
1714 else
1715 return MINUS_ONE;
b49e97c9
TS
1716}
1717
1718/* Returns the GOT index for the global symbol indicated by H. */
1719
1720static bfd_vma
f4416af6
AO
1721mips_elf_global_got_index (abfd, ibfd, h)
1722 bfd *abfd, *ibfd;
b49e97c9
TS
1723 struct elf_link_hash_entry *h;
1724{
1725 bfd_vma index;
1726 asection *sgot;
f4416af6 1727 struct mips_got_info *g, *gg;
d0c7ff07 1728 long global_got_dynindx = 0;
b49e97c9 1729
f4416af6
AO
1730 gg = g = mips_elf_got_info (abfd, &sgot);
1731 if (g->bfd2got && ibfd)
1732 {
1733 struct mips_got_entry e, *p;
143d77c5 1734
f4416af6
AO
1735 BFD_ASSERT (h->dynindx >= 0);
1736
1737 g = mips_elf_got_for_ibfd (g, ibfd);
1738 if (g->next != gg)
1739 {
1740 e.abfd = ibfd;
1741 e.symndx = -1;
1742 e.d.h = (struct mips_elf_link_hash_entry *)h;
1743
1744 p = (struct mips_got_entry *) htab_find (g->got_entries, &e);
1745
1746 BFD_ASSERT (p->gotidx > 0);
1747 return p->gotidx;
1748 }
1749 }
1750
1751 if (gg->global_gotsym != NULL)
1752 global_got_dynindx = gg->global_gotsym->dynindx;
b49e97c9
TS
1753
1754 /* Once we determine the global GOT entry with the lowest dynamic
1755 symbol table index, we must put all dynamic symbols with greater
1756 indices into the GOT. That makes it easy to calculate the GOT
1757 offset. */
d0c7ff07
TS
1758 BFD_ASSERT (h->dynindx >= global_got_dynindx);
1759 index = ((h->dynindx - global_got_dynindx + g->local_gotno)
b49e97c9
TS
1760 * MIPS_ELF_GOT_SIZE (abfd));
1761 BFD_ASSERT (index < sgot->_raw_size);
1762
1763 return index;
1764}
1765
1766/* Find a GOT entry that is within 32KB of the VALUE. These entries
1767 are supposed to be placed at small offsets in the GOT, i.e.,
1768 within 32KB of GP. Return the index into the GOT for this page,
1769 and store the offset from this entry to the desired address in
1770 OFFSETP, if it is non-NULL. */
1771
1772static bfd_vma
f4416af6
AO
1773mips_elf_got_page (abfd, ibfd, info, value, offsetp)
1774 bfd *abfd, *ibfd;
b49e97c9
TS
1775 struct bfd_link_info *info;
1776 bfd_vma value;
1777 bfd_vma *offsetp;
1778{
1779 asection *sgot;
1780 struct mips_got_info *g;
b15e6682
AO
1781 bfd_vma index;
1782 struct mips_got_entry *entry;
b49e97c9
TS
1783
1784 g = mips_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
1785
f4416af6 1786 entry = mips_elf_create_local_got_entry (abfd, ibfd, g, sgot,
b15e6682
AO
1787 (value + 0x8000)
1788 & (~(bfd_vma)0xffff));
b49e97c9 1789
b15e6682
AO
1790 if (!entry)
1791 return MINUS_ONE;
143d77c5 1792
b15e6682 1793 index = entry->gotidx;
b49e97c9
TS
1794
1795 if (offsetp)
f4416af6 1796 *offsetp = value - entry->d.address;
b49e97c9
TS
1797
1798 return index;
1799}
1800
1801/* Find a GOT entry whose higher-order 16 bits are the same as those
1802 for value. Return the index into the GOT for this entry. */
1803
1804static bfd_vma
f4416af6
AO
1805mips_elf_got16_entry (abfd, ibfd, info, value, external)
1806 bfd *abfd, *ibfd;
b49e97c9
TS
1807 struct bfd_link_info *info;
1808 bfd_vma value;
b34976b6 1809 bfd_boolean external;
b49e97c9
TS
1810{
1811 asection *sgot;
1812 struct mips_got_info *g;
b15e6682 1813 struct mips_got_entry *entry;
b49e97c9
TS
1814
1815 if (! external)
1816 {
1817 /* Although the ABI says that it is "the high-order 16 bits" that we
1818 want, it is really the %high value. The complete value is
1819 calculated with a `addiu' of a LO16 relocation, just as with a
1820 HI16/LO16 pair. */
1821 value = mips_elf_high (value) << 16;
1822 }
1823
1824 g = mips_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
1825
f4416af6 1826 entry = mips_elf_create_local_got_entry (abfd, ibfd, g, sgot, value);
b15e6682
AO
1827 if (entry)
1828 return entry->gotidx;
1829 else
1830 return MINUS_ONE;
b49e97c9
TS
1831}
1832
1833/* Returns the offset for the entry at the INDEXth position
1834 in the GOT. */
1835
1836static bfd_vma
f4416af6 1837mips_elf_got_offset_from_index (dynobj, output_bfd, input_bfd, index)
b49e97c9
TS
1838 bfd *dynobj;
1839 bfd *output_bfd;
f4416af6 1840 bfd *input_bfd;
b49e97c9
TS
1841 bfd_vma index;
1842{
1843 asection *sgot;
1844 bfd_vma gp;
f4416af6 1845 struct mips_got_info *g;
b49e97c9 1846
f4416af6
AO
1847 g = mips_elf_got_info (dynobj, &sgot);
1848 gp = _bfd_get_gp_value (output_bfd)
1849 + mips_elf_adjust_gp (output_bfd, g, input_bfd);
143d77c5 1850
f4416af6 1851 return sgot->output_section->vma + sgot->output_offset + index - gp;
b49e97c9
TS
1852}
1853
1854/* Create a local GOT entry for VALUE. Return the index of the entry,
1855 or -1 if it could not be created. */
1856
b15e6682 1857static struct mips_got_entry *
f4416af6
AO
1858mips_elf_create_local_got_entry (abfd, ibfd, gg, sgot, value)
1859 bfd *abfd, *ibfd;
1860 struct mips_got_info *gg;
b49e97c9
TS
1861 asection *sgot;
1862 bfd_vma value;
1863{
b15e6682 1864 struct mips_got_entry entry, **loc;
f4416af6 1865 struct mips_got_info *g;
b15e6682 1866
f4416af6
AO
1867 entry.abfd = NULL;
1868 entry.symndx = -1;
1869 entry.d.address = value;
1870
1871 g = mips_elf_got_for_ibfd (gg, ibfd);
1872 if (g == NULL)
1873 {
1874 g = mips_elf_got_for_ibfd (gg, abfd);
1875 BFD_ASSERT (g != NULL);
1876 }
b15e6682
AO
1877
1878 loc = (struct mips_got_entry **) htab_find_slot (g->got_entries, &entry,
1879 INSERT);
1880 if (*loc)
1881 return *loc;
143d77c5 1882
b15e6682
AO
1883 entry.gotidx = MIPS_ELF_GOT_SIZE (abfd) * g->assigned_gotno++;
1884
1885 *loc = (struct mips_got_entry *)bfd_alloc (abfd, sizeof entry);
1886
1887 if (! *loc)
1888 return NULL;
143d77c5 1889
b15e6682
AO
1890 memcpy (*loc, &entry, sizeof entry);
1891
b49e97c9
TS
1892 if (g->assigned_gotno >= g->local_gotno)
1893 {
f4416af6 1894 (*loc)->gotidx = -1;
b49e97c9
TS
1895 /* We didn't allocate enough space in the GOT. */
1896 (*_bfd_error_handler)
1897 (_("not enough GOT space for local GOT entries"));
1898 bfd_set_error (bfd_error_bad_value);
b15e6682 1899 return NULL;
b49e97c9
TS
1900 }
1901
1902 MIPS_ELF_PUT_WORD (abfd, value,
b15e6682
AO
1903 (sgot->contents + entry.gotidx));
1904
1905 return *loc;
b49e97c9
TS
1906}
1907
1908/* Sort the dynamic symbol table so that symbols that need GOT entries
1909 appear towards the end. This reduces the amount of GOT space
1910 required. MAX_LOCAL is used to set the number of local symbols
1911 known to be in the dynamic symbol table. During
1912 _bfd_mips_elf_size_dynamic_sections, this value is 1. Afterward, the
1913 section symbols are added and the count is higher. */
1914
b34976b6 1915static bfd_boolean
b49e97c9
TS
1916mips_elf_sort_hash_table (info, max_local)
1917 struct bfd_link_info *info;
1918 unsigned long max_local;
1919{
1920 struct mips_elf_hash_sort_data hsd;
1921 struct mips_got_info *g;
1922 bfd *dynobj;
1923
1924 dynobj = elf_hash_table (info)->dynobj;
1925
f4416af6
AO
1926 g = mips_elf_got_info (dynobj, NULL);
1927
b49e97c9 1928 hsd.low = NULL;
143d77c5 1929 hsd.max_unref_got_dynindx =
f4416af6
AO
1930 hsd.min_got_dynindx = elf_hash_table (info)->dynsymcount
1931 /* In the multi-got case, assigned_gotno of the master got_info
1932 indicate the number of entries that aren't referenced in the
1933 primary GOT, but that must have entries because there are
1934 dynamic relocations that reference it. Since they aren't
1935 referenced, we move them to the end of the GOT, so that they
1936 don't prevent other entries that are referenced from getting
1937 too large offsets. */
1938 - (g->next ? g->assigned_gotno : 0);
b49e97c9
TS
1939 hsd.max_non_got_dynindx = max_local;
1940 mips_elf_link_hash_traverse (((struct mips_elf_link_hash_table *)
1941 elf_hash_table (info)),
1942 mips_elf_sort_hash_table_f,
1943 &hsd);
1944
1945 /* There should have been enough room in the symbol table to
44c410de 1946 accommodate both the GOT and non-GOT symbols. */
b49e97c9 1947 BFD_ASSERT (hsd.max_non_got_dynindx <= hsd.min_got_dynindx);
f4416af6
AO
1948 BFD_ASSERT ((unsigned long)hsd.max_unref_got_dynindx
1949 <= elf_hash_table (info)->dynsymcount);
b49e97c9
TS
1950
1951 /* Now we know which dynamic symbol has the lowest dynamic symbol
1952 table index in the GOT. */
b49e97c9
TS
1953 g->global_gotsym = hsd.low;
1954
b34976b6 1955 return TRUE;
b49e97c9
TS
1956}
1957
1958/* If H needs a GOT entry, assign it the highest available dynamic
1959 index. Otherwise, assign it the lowest available dynamic
1960 index. */
1961
b34976b6 1962static bfd_boolean
b49e97c9
TS
1963mips_elf_sort_hash_table_f (h, data)
1964 struct mips_elf_link_hash_entry *h;
1965 PTR data;
1966{
1967 struct mips_elf_hash_sort_data *hsd
1968 = (struct mips_elf_hash_sort_data *) data;
1969
1970 if (h->root.root.type == bfd_link_hash_warning)
1971 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
1972
1973 /* Symbols without dynamic symbol table entries aren't interesting
1974 at all. */
1975 if (h->root.dynindx == -1)
b34976b6 1976 return TRUE;
b49e97c9 1977
f4416af6
AO
1978 /* Global symbols that need GOT entries that are not explicitly
1979 referenced are marked with got offset 2. Those that are
1980 referenced get a 1, and those that don't need GOT entries get
1981 -1. */
1982 if (h->root.got.offset == 2)
1983 {
1984 if (hsd->max_unref_got_dynindx == hsd->min_got_dynindx)
1985 hsd->low = (struct elf_link_hash_entry *) h;
1986 h->root.dynindx = hsd->max_unref_got_dynindx++;
1987 }
1988 else if (h->root.got.offset != 1)
b49e97c9
TS
1989 h->root.dynindx = hsd->max_non_got_dynindx++;
1990 else
1991 {
1992 h->root.dynindx = --hsd->min_got_dynindx;
1993 hsd->low = (struct elf_link_hash_entry *) h;
1994 }
1995
b34976b6 1996 return TRUE;
b49e97c9
TS
1997}
1998
1999/* If H is a symbol that needs a global GOT entry, but has a dynamic
2000 symbol table index lower than any we've seen to date, record it for
2001 posterity. */
2002
b34976b6 2003static bfd_boolean
f4416af6 2004mips_elf_record_global_got_symbol (h, abfd, info, g)
b49e97c9 2005 struct elf_link_hash_entry *h;
f4416af6 2006 bfd *abfd;
b49e97c9 2007 struct bfd_link_info *info;
f4416af6 2008 struct mips_got_info *g;
b49e97c9 2009{
f4416af6
AO
2010 struct mips_got_entry entry, **loc;
2011
b49e97c9
TS
2012 /* A global symbol in the GOT must also be in the dynamic symbol
2013 table. */
7c5fcef7
L
2014 if (h->dynindx == -1)
2015 {
2016 switch (ELF_ST_VISIBILITY (h->other))
2017 {
2018 case STV_INTERNAL:
2019 case STV_HIDDEN:
b34976b6 2020 _bfd_mips_elf_hide_symbol (info, h, TRUE);
7c5fcef7
L
2021 break;
2022 }
2023 if (!bfd_elf32_link_record_dynamic_symbol (info, h))
b34976b6 2024 return FALSE;
7c5fcef7 2025 }
b49e97c9 2026
f4416af6
AO
2027 entry.abfd = abfd;
2028 entry.symndx = -1;
2029 entry.d.h = (struct mips_elf_link_hash_entry *) h;
2030
2031 loc = (struct mips_got_entry **) htab_find_slot (g->got_entries, &entry,
2032 INSERT);
2033
b49e97c9
TS
2034 /* If we've already marked this entry as needing GOT space, we don't
2035 need to do it again. */
f4416af6
AO
2036 if (*loc)
2037 return TRUE;
2038
2039 *loc = (struct mips_got_entry *)bfd_alloc (abfd, sizeof entry);
2040
2041 if (! *loc)
2042 return FALSE;
143d77c5 2043
f4416af6
AO
2044 entry.gotidx = -1;
2045 memcpy (*loc, &entry, sizeof entry);
2046
b49e97c9 2047 if (h->got.offset != MINUS_ONE)
b34976b6 2048 return TRUE;
b49e97c9
TS
2049
2050 /* By setting this to a value other than -1, we are indicating that
2051 there needs to be a GOT entry for H. Avoid using zero, as the
2052 generic ELF copy_indirect_symbol tests for <= 0. */
2053 h->got.offset = 1;
2054
b34976b6 2055 return TRUE;
b49e97c9 2056}
f4416af6
AO
2057
2058/* Reserve space in G for a GOT entry containing the value of symbol
2059 SYMNDX in input bfd ABDF, plus ADDEND. */
2060
2061static bfd_boolean
2062mips_elf_record_local_got_symbol (abfd, symndx, addend, g)
2063 bfd *abfd;
2064 long symndx;
2065 bfd_vma addend;
2066 struct mips_got_info *g;
2067{
2068 struct mips_got_entry entry, **loc;
2069
2070 entry.abfd = abfd;
2071 entry.symndx = symndx;
2072 entry.d.addend = addend;
2073 loc = (struct mips_got_entry **)
2074 htab_find_slot (g->got_entries, &entry, INSERT);
2075
2076 if (*loc)
2077 return TRUE;
2078
2079 entry.gotidx = g->local_gotno++;
2080
2081 *loc = (struct mips_got_entry *)bfd_alloc (abfd, sizeof entry);
2082
2083 if (! *loc)
2084 return FALSE;
143d77c5 2085
f4416af6
AO
2086 memcpy (*loc, &entry, sizeof entry);
2087
2088 return TRUE;
2089}
2090\f
2091/* Compute the hash value of the bfd in a bfd2got hash entry. */
2092
2093static hashval_t
2094mips_elf_bfd2got_entry_hash (entry_)
2095 const PTR entry_;
2096{
2097 const struct mips_elf_bfd2got_hash *entry
2098 = (struct mips_elf_bfd2got_hash *)entry_;
2099
2100 return entry->bfd->id;
2101}
2102
2103/* Check whether two hash entries have the same bfd. */
2104
2105static int
2106mips_elf_bfd2got_entry_eq (entry1, entry2)
2107 const PTR entry1;
2108 const PTR entry2;
2109{
2110 const struct mips_elf_bfd2got_hash *e1
2111 = (const struct mips_elf_bfd2got_hash *)entry1;
2112 const struct mips_elf_bfd2got_hash *e2
2113 = (const struct mips_elf_bfd2got_hash *)entry2;
2114
2115 return e1->bfd == e2->bfd;
2116}
2117
0b25d3e6 2118/* In a multi-got link, determine the GOT to be used for IBDF. G must
f4416af6
AO
2119 be the master GOT data. */
2120
2121static struct mips_got_info *
2122mips_elf_got_for_ibfd (g, ibfd)
2123 struct mips_got_info *g;
2124 bfd *ibfd;
2125{
2126 struct mips_elf_bfd2got_hash e, *p;
2127
2128 if (! g->bfd2got)
2129 return g;
2130
2131 e.bfd = ibfd;
2132 p = (struct mips_elf_bfd2got_hash *) htab_find (g->bfd2got, &e);
2133 return p ? p->g : NULL;
2134}
2135
2136/* Create one separate got for each bfd that has entries in the global
2137 got, such that we can tell how many local and global entries each
2138 bfd requires. */
2139
2140static int
2141mips_elf_make_got_per_bfd (entryp, p)
2142 void **entryp;
2143 void *p;
2144{
2145 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
2146 struct mips_elf_got_per_bfd_arg *arg = (struct mips_elf_got_per_bfd_arg *)p;
2147 htab_t bfd2got = arg->bfd2got;
2148 struct mips_got_info *g;
2149 struct mips_elf_bfd2got_hash bfdgot_entry, *bfdgot;
2150 void **bfdgotp;
143d77c5 2151
f4416af6
AO
2152 /* Find the got_info for this GOT entry's input bfd. Create one if
2153 none exists. */
2154 bfdgot_entry.bfd = entry->abfd;
2155 bfdgotp = htab_find_slot (bfd2got, &bfdgot_entry, INSERT);
2156 bfdgot = (struct mips_elf_bfd2got_hash *)*bfdgotp;
2157
2158 if (bfdgot != NULL)
2159 g = bfdgot->g;
2160 else
2161 {
2162 bfdgot = (struct mips_elf_bfd2got_hash *)bfd_alloc
2163 (arg->obfd, sizeof (struct mips_elf_bfd2got_hash));
2164
2165 if (bfdgot == NULL)
2166 {
2167 arg->obfd = 0;
2168 return 0;
2169 }
2170
2171 *bfdgotp = bfdgot;
2172
2173 bfdgot->bfd = entry->abfd;
2174 bfdgot->g = g = (struct mips_got_info *)
2175 bfd_alloc (arg->obfd, sizeof (struct mips_got_info));
2176 if (g == NULL)
2177 {
2178 arg->obfd = 0;
2179 return 0;
2180 }
2181
2182 g->global_gotsym = NULL;
2183 g->global_gotno = 0;
2184 g->local_gotno = 0;
2185 g->assigned_gotno = -1;
2186 g->got_entries = htab_try_create (1, mips_elf_multi_got_entry_hash,
2187 mips_elf_multi_got_entry_eq,
2188 (htab_del) NULL);
2189 if (g->got_entries == NULL)
2190 {
2191 arg->obfd = 0;
2192 return 0;
2193 }
2194
2195 g->bfd2got = NULL;
2196 g->next = NULL;
2197 }
2198
2199 /* Insert the GOT entry in the bfd's got entry hash table. */
2200 entryp = htab_find_slot (g->got_entries, entry, INSERT);
2201 if (*entryp != NULL)
2202 return 1;
143d77c5 2203
f4416af6
AO
2204 *entryp = entry;
2205
2206 if (entry->symndx >= 0 || entry->d.h->forced_local)
2207 ++g->local_gotno;
2208 else
2209 ++g->global_gotno;
2210
2211 return 1;
2212}
2213
2214/* Attempt to merge gots of different input bfds. Try to use as much
2215 as possible of the primary got, since it doesn't require explicit
2216 dynamic relocations, but don't use bfds that would reference global
2217 symbols out of the addressable range. Failing the primary got,
2218 attempt to merge with the current got, or finish the current got
2219 and then make make the new got current. */
2220
2221static int
2222mips_elf_merge_gots (bfd2got_, p)
2223 void **bfd2got_;
2224 void *p;
2225{
2226 struct mips_elf_bfd2got_hash *bfd2got
2227 = (struct mips_elf_bfd2got_hash *)*bfd2got_;
2228 struct mips_elf_got_per_bfd_arg *arg = (struct mips_elf_got_per_bfd_arg *)p;
2229 unsigned int lcount = bfd2got->g->local_gotno;
2230 unsigned int gcount = bfd2got->g->global_gotno;
2231 unsigned int maxcnt = arg->max_count;
143d77c5 2232
f4416af6
AO
2233 /* If we don't have a primary GOT and this is not too big, use it as
2234 a starting point for the primary GOT. */
2235 if (! arg->primary && lcount + gcount <= maxcnt)
2236 {
2237 arg->primary = bfd2got->g;
2238 arg->primary_count = lcount + gcount;
2239 }
2240 /* If it looks like we can merge this bfd's entries with those of
2241 the primary, merge them. The heuristics is conservative, but we
2242 don't have to squeeze it too hard. */
2243 else if (arg->primary
2244 && (arg->primary_count + lcount + gcount) <= maxcnt)
2245 {
2246 struct mips_got_info *g = bfd2got->g;
2247 int old_lcount = arg->primary->local_gotno;
2248 int old_gcount = arg->primary->global_gotno;
2249
2250 bfd2got->g = arg->primary;
2251
2252 htab_traverse (g->got_entries,
2253 mips_elf_make_got_per_bfd,
2254 arg);
2255 if (arg->obfd == NULL)
2256 return 0;
2257
2258 htab_delete (g->got_entries);
2259 /* We don't have to worry about releasing memory of the actual
2260 got entries, since they're all in the master got_entries hash
2261 table anyway. */
2262
2263 BFD_ASSERT (old_lcount + lcount == arg->primary->local_gotno);
2264 BFD_ASSERT (old_gcount + gcount >= arg->primary->global_gotno);
2265
2266 arg->primary_count = arg->primary->local_gotno
2267 + arg->primary->global_gotno;
2268 }
2269 /* If we can merge with the last-created got, do it. */
2270 else if (arg->current
2271 && arg->current_count + lcount + gcount <= maxcnt)
2272 {
2273 struct mips_got_info *g = bfd2got->g;
2274 int old_lcount = arg->current->local_gotno;
2275 int old_gcount = arg->current->global_gotno;
2276
2277 bfd2got->g = arg->current;
2278
2279 htab_traverse (g->got_entries,
2280 mips_elf_make_got_per_bfd,
2281 arg);
2282 if (arg->obfd == NULL)
2283 return 0;
2284
2285 htab_delete (g->got_entries);
2286
2287 BFD_ASSERT (old_lcount + lcount == arg->current->local_gotno);
2288 BFD_ASSERT (old_gcount + gcount >= arg->current->global_gotno);
2289
2290 arg->current_count = arg->current->local_gotno
2291 + arg->current->global_gotno;
2292 }
2293 /* Well, we couldn't merge, so create a new GOT. Don't check if it
2294 fits; if it turns out that it doesn't, we'll get relocation
2295 overflows anyway. */
2296 else
2297 {
2298 bfd2got->g->next = arg->current;
2299 arg->current = bfd2got->g;
143d77c5 2300
f4416af6
AO
2301 arg->current_count = lcount + gcount;
2302 }
2303
2304 return 1;
2305}
2306
2307/* If passed a NULL mips_got_info in the argument, set the marker used
2308 to tell whether a global symbol needs a got entry (in the primary
2309 got) to the given VALUE.
2310
2311 If passed a pointer G to a mips_got_info in the argument (it must
2312 not be the primary GOT), compute the offset from the beginning of
2313 the (primary) GOT section to the entry in G corresponding to the
2314 global symbol. G's assigned_gotno must contain the index of the
2315 first available global GOT entry in G. VALUE must contain the size
2316 of a GOT entry in bytes. For each global GOT entry that requires a
2317 dynamic relocation, NEEDED_RELOCS is incremented, and the symbol is
2318 marked as not elligible for lazy resolution through a function
2319 stub. */
2320static int
2321mips_elf_set_global_got_offset (entryp, p)
2322 void **entryp;
2323 void *p;
2324{
2325 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
2326 struct mips_elf_set_global_got_offset_arg *arg
2327 = (struct mips_elf_set_global_got_offset_arg *)p;
2328 struct mips_got_info *g = arg->g;
2329
2330 if (entry->abfd != NULL && entry->symndx == -1
2331 && entry->d.h->root.dynindx != -1)
2332 {
2333 if (g)
2334 {
2335 BFD_ASSERT (g->global_gotsym == NULL);
2336
2337 entry->gotidx = arg->value * (long) g->assigned_gotno++;
2338 /* We can't do lazy update of GOT entries for
2339 non-primary GOTs since the PLT entries don't use the
2340 right offsets, so punt at it for now. */
2341 entry->d.h->no_fn_stub = TRUE;
2342 if (arg->info->shared
2343 || (elf_hash_table (arg->info)->dynamic_sections_created
2344 && ((entry->d.h->root.elf_link_hash_flags
2345 & ELF_LINK_HASH_DEF_DYNAMIC) != 0)
2346 && ((entry->d.h->root.elf_link_hash_flags
2347 & ELF_LINK_HASH_DEF_REGULAR) == 0)))
2348 ++arg->needed_relocs;
2349 }
2350 else
2351 entry->d.h->root.got.offset = arg->value;
2352 }
2353
2354 return 1;
2355}
2356
2357/* Follow indirect and warning hash entries so that each got entry
2358 points to the final symbol definition. P must point to a pointer
2359 to the hash table we're traversing. Since this traversal may
2360 modify the hash table, we set this pointer to NULL to indicate
2361 we've made a potentially-destructive change to the hash table, so
2362 the traversal must be restarted. */
2363static int
2364mips_elf_resolve_final_got_entry (entryp, p)
2365 void **entryp;
2366 void *p;
2367{
2368 struct mips_got_entry *entry = (struct mips_got_entry *)*entryp;
2369 htab_t got_entries = *(htab_t *)p;
2370
2371 if (entry->abfd != NULL && entry->symndx == -1)
2372 {
2373 struct mips_elf_link_hash_entry *h = entry->d.h;
2374
2375 while (h->root.root.type == bfd_link_hash_indirect
2376 || h->root.root.type == bfd_link_hash_warning)
2377 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
2378
2379 if (entry->d.h == h)
2380 return 1;
143d77c5 2381
f4416af6
AO
2382 entry->d.h = h;
2383
2384 /* If we can't find this entry with the new bfd hash, re-insert
2385 it, and get the traversal restarted. */
2386 if (! htab_find (got_entries, entry))
2387 {
2388 htab_clear_slot (got_entries, entryp);
2389 entryp = htab_find_slot (got_entries, entry, INSERT);
2390 if (! *entryp)
2391 *entryp = entry;
2392 /* Abort the traversal, since the whole table may have
2393 moved, and leave it up to the parent to restart the
2394 process. */
2395 *(htab_t *)p = NULL;
2396 return 0;
2397 }
2398 /* We might want to decrement the global_gotno count, but it's
2399 either too early or too late for that at this point. */
2400 }
143d77c5 2401
f4416af6
AO
2402 return 1;
2403}
2404
2405/* Turn indirect got entries in a got_entries table into their final
2406 locations. */
2407static void
2408mips_elf_resolve_final_got_entries (g)
2409 struct mips_got_info *g;
2410{
2411 htab_t got_entries;
2412
2413 do
2414 {
2415 got_entries = g->got_entries;
2416
2417 htab_traverse (got_entries,
2418 mips_elf_resolve_final_got_entry,
2419 &got_entries);
2420 }
2421 while (got_entries == NULL);
2422}
2423
2424/* Return the offset of an input bfd IBFD's GOT from the beginning of
2425 the primary GOT. */
2426static bfd_vma
2427mips_elf_adjust_gp (abfd, g, ibfd)
2428 bfd *abfd;
2429 struct mips_got_info *g;
2430 bfd *ibfd;
2431{
2432 if (g->bfd2got == NULL)
2433 return 0;
2434
2435 g = mips_elf_got_for_ibfd (g, ibfd);
2436 if (! g)
2437 return 0;
2438
2439 BFD_ASSERT (g->next);
2440
2441 g = g->next;
143d77c5 2442
f4416af6
AO
2443 return (g->local_gotno + g->global_gotno) * MIPS_ELF_GOT_SIZE (abfd);
2444}
2445
2446/* Turn a single GOT that is too big for 16-bit addressing into
2447 a sequence of GOTs, each one 16-bit addressable. */
2448
2449static bfd_boolean
2450mips_elf_multi_got (abfd, info, g, got, pages)
2451 bfd *abfd;
2452 struct bfd_link_info *info;
2453 struct mips_got_info *g;
2454 asection *got;
2455 bfd_size_type pages;
2456{
2457 struct mips_elf_got_per_bfd_arg got_per_bfd_arg;
2458 struct mips_elf_set_global_got_offset_arg set_got_offset_arg;
2459 struct mips_got_info *gg;
2460 unsigned int assign;
2461
2462 g->bfd2got = htab_try_create (1, mips_elf_bfd2got_entry_hash,
2463 mips_elf_bfd2got_entry_eq,
2464 (htab_del) NULL);
2465 if (g->bfd2got == NULL)
2466 return FALSE;
2467
2468 got_per_bfd_arg.bfd2got = g->bfd2got;
2469 got_per_bfd_arg.obfd = abfd;
2470 got_per_bfd_arg.info = info;
2471
2472 /* Count how many GOT entries each input bfd requires, creating a
2473 map from bfd to got info while at that. */
2474 mips_elf_resolve_final_got_entries (g);
2475 htab_traverse (g->got_entries, mips_elf_make_got_per_bfd, &got_per_bfd_arg);
2476 if (got_per_bfd_arg.obfd == NULL)
2477 return FALSE;
2478
2479 got_per_bfd_arg.current = NULL;
2480 got_per_bfd_arg.primary = NULL;
2481 /* Taking out PAGES entries is a worst-case estimate. We could
2482 compute the maximum number of pages that each separate input bfd
2483 uses, but it's probably not worth it. */
2484 got_per_bfd_arg.max_count = ((MIPS_ELF_GOT_MAX_SIZE (abfd)
2485 / MIPS_ELF_GOT_SIZE (abfd))
2486 - MIPS_RESERVED_GOTNO - pages);
2487
2488 /* Try to merge the GOTs of input bfds together, as long as they
2489 don't seem to exceed the maximum GOT size, choosing one of them
2490 to be the primary GOT. */
2491 htab_traverse (g->bfd2got, mips_elf_merge_gots, &got_per_bfd_arg);
2492 if (got_per_bfd_arg.obfd == NULL)
2493 return FALSE;
2494
2495 /* If we find any suitable primary GOT, create an empty one. */
2496 if (got_per_bfd_arg.primary == NULL)
2497 {
2498 g->next = (struct mips_got_info *)
2499 bfd_alloc (abfd, sizeof (struct mips_got_info));
2500 if (g->next == NULL)
2501 return FALSE;
2502
2503 g->next->global_gotsym = NULL;
2504 g->next->global_gotno = 0;
2505 g->next->local_gotno = 0;
2506 g->next->assigned_gotno = 0;
2507 g->next->got_entries = htab_try_create (1, mips_elf_multi_got_entry_hash,
2508 mips_elf_multi_got_entry_eq,
2509 (htab_del) NULL);
2510 if (g->next->got_entries == NULL)
2511 return FALSE;
2512 g->next->bfd2got = NULL;
2513 }
2514 else
2515 g->next = got_per_bfd_arg.primary;
2516 g->next->next = got_per_bfd_arg.current;
2517
2518 /* GG is now the master GOT, and G is the primary GOT. */
2519 gg = g;
2520 g = g->next;
2521
2522 /* Map the output bfd to the primary got. That's what we're going
2523 to use for bfds that use GOT16 or GOT_PAGE relocations that we
2524 didn't mark in check_relocs, and we want a quick way to find it.
2525 We can't just use gg->next because we're going to reverse the
2526 list. */
2527 {
2528 struct mips_elf_bfd2got_hash *bfdgot;
2529 void **bfdgotp;
143d77c5 2530
f4416af6
AO
2531 bfdgot = (struct mips_elf_bfd2got_hash *)bfd_alloc
2532 (abfd, sizeof (struct mips_elf_bfd2got_hash));
2533
2534 if (bfdgot == NULL)
2535 return FALSE;
2536
2537 bfdgot->bfd = abfd;
2538 bfdgot->g = g;
2539 bfdgotp = htab_find_slot (gg->bfd2got, bfdgot, INSERT);
2540
2541 BFD_ASSERT (*bfdgotp == NULL);
2542 *bfdgotp = bfdgot;
2543 }
2544
2545 /* The IRIX dynamic linker requires every symbol that is referenced
2546 in a dynamic relocation to be present in the primary GOT, so
2547 arrange for them to appear after those that are actually
2548 referenced.
2549
2550 GNU/Linux could very well do without it, but it would slow down
2551 the dynamic linker, since it would have to resolve every dynamic
2552 symbol referenced in other GOTs more than once, without help from
2553 the cache. Also, knowing that every external symbol has a GOT
2554 helps speed up the resolution of local symbols too, so GNU/Linux
2555 follows IRIX's practice.
143d77c5 2556
f4416af6
AO
2557 The number 2 is used by mips_elf_sort_hash_table_f to count
2558 global GOT symbols that are unreferenced in the primary GOT, with
2559 an initial dynamic index computed from gg->assigned_gotno, where
2560 the number of unreferenced global entries in the primary GOT is
2561 preserved. */
2562 if (1)
2563 {
2564 gg->assigned_gotno = gg->global_gotno - g->global_gotno;
2565 g->global_gotno = gg->global_gotno;
2566 set_got_offset_arg.value = 2;
2567 }
2568 else
2569 {
2570 /* This could be used for dynamic linkers that don't optimize
2571 symbol resolution while applying relocations so as to use
2572 primary GOT entries or assuming the symbol is locally-defined.
2573 With this code, we assign lower dynamic indices to global
2574 symbols that are not referenced in the primary GOT, so that
2575 their entries can be omitted. */
2576 gg->assigned_gotno = 0;
2577 set_got_offset_arg.value = -1;
2578 }
2579
2580 /* Reorder dynamic symbols as described above (which behavior
2581 depends on the setting of VALUE). */
2582 set_got_offset_arg.g = NULL;
2583 htab_traverse (gg->got_entries, mips_elf_set_global_got_offset,
2584 &set_got_offset_arg);
2585 set_got_offset_arg.value = 1;
2586 htab_traverse (g->got_entries, mips_elf_set_global_got_offset,
2587 &set_got_offset_arg);
2588 if (! mips_elf_sort_hash_table (info, 1))
2589 return FALSE;
2590
2591 /* Now go through the GOTs assigning them offset ranges.
2592 [assigned_gotno, local_gotno[ will be set to the range of local
2593 entries in each GOT. We can then compute the end of a GOT by
2594 adding local_gotno to global_gotno. We reverse the list and make
2595 it circular since then we'll be able to quickly compute the
2596 beginning of a GOT, by computing the end of its predecessor. To
2597 avoid special cases for the primary GOT, while still preserving
2598 assertions that are valid for both single- and multi-got links,
2599 we arrange for the main got struct to have the right number of
2600 global entries, but set its local_gotno such that the initial
2601 offset of the primary GOT is zero. Remember that the primary GOT
2602 will become the last item in the circular linked list, so it
2603 points back to the master GOT. */
2604 gg->local_gotno = -g->global_gotno;
2605 gg->global_gotno = g->global_gotno;
2606 assign = 0;
2607 gg->next = gg;
2608
2609 do
2610 {
2611 struct mips_got_info *gn;
2612
2613 assign += MIPS_RESERVED_GOTNO;
2614 g->assigned_gotno = assign;
2615 g->local_gotno += assign + pages;
2616 assign = g->local_gotno + g->global_gotno;
2617
2618 /* Take g out of the direct list, and push it onto the reversed
2619 list that gg points to. */
2620 gn = g->next;
2621 g->next = gg->next;
2622 gg->next = g;
2623 g = gn;
2624 }
2625 while (g);
2626
2627 got->_raw_size = (gg->next->local_gotno
2628 + gg->next->global_gotno) * MIPS_ELF_GOT_SIZE (abfd);
143d77c5 2629
f4416af6
AO
2630 return TRUE;
2631}
143d77c5 2632
b49e97c9
TS
2633\f
2634/* Returns the first relocation of type r_type found, beginning with
2635 RELOCATION. RELEND is one-past-the-end of the relocation table. */
2636
2637static const Elf_Internal_Rela *
2638mips_elf_next_relocation (abfd, r_type, relocation, relend)
2639 bfd *abfd ATTRIBUTE_UNUSED;
2640 unsigned int r_type;
2641 const Elf_Internal_Rela *relocation;
2642 const Elf_Internal_Rela *relend;
2643{
2644 /* According to the MIPS ELF ABI, the R_MIPS_LO16 relocation must be
2645 immediately following. However, for the IRIX6 ABI, the next
2646 relocation may be a composed relocation consisting of several
2647 relocations for the same address. In that case, the R_MIPS_LO16
2648 relocation may occur as one of these. We permit a similar
2649 extension in general, as that is useful for GCC. */
2650 while (relocation < relend)
2651 {
2652 if (ELF_R_TYPE (abfd, relocation->r_info) == r_type)
2653 return relocation;
2654
2655 ++relocation;
2656 }
2657
2658 /* We didn't find it. */
2659 bfd_set_error (bfd_error_bad_value);
2660 return NULL;
2661}
2662
2663/* Return whether a relocation is against a local symbol. */
2664
b34976b6 2665static bfd_boolean
b49e97c9
TS
2666mips_elf_local_relocation_p (input_bfd, relocation, local_sections,
2667 check_forced)
2668 bfd *input_bfd;
2669 const Elf_Internal_Rela *relocation;
2670 asection **local_sections;
b34976b6 2671 bfd_boolean check_forced;
b49e97c9
TS
2672{
2673 unsigned long r_symndx;
2674 Elf_Internal_Shdr *symtab_hdr;
2675 struct mips_elf_link_hash_entry *h;
2676 size_t extsymoff;
2677
2678 r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
2679 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2680 extsymoff = (elf_bad_symtab (input_bfd)) ? 0 : symtab_hdr->sh_info;
2681
2682 if (r_symndx < extsymoff)
b34976b6 2683 return TRUE;
b49e97c9 2684 if (elf_bad_symtab (input_bfd) && local_sections[r_symndx] != NULL)
b34976b6 2685 return TRUE;
b49e97c9
TS
2686
2687 if (check_forced)
2688 {
2689 /* Look up the hash table to check whether the symbol
2690 was forced local. */
2691 h = (struct mips_elf_link_hash_entry *)
2692 elf_sym_hashes (input_bfd) [r_symndx - extsymoff];
2693 /* Find the real hash-table entry for this symbol. */
2694 while (h->root.root.type == bfd_link_hash_indirect
2695 || h->root.root.type == bfd_link_hash_warning)
2696 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
2697 if ((h->root.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0)
b34976b6 2698 return TRUE;
b49e97c9
TS
2699 }
2700
b34976b6 2701 return FALSE;
b49e97c9
TS
2702}
2703\f
2704/* Sign-extend VALUE, which has the indicated number of BITS. */
2705
a7ebbfdf
TS
2706bfd_vma
2707_bfd_mips_elf_sign_extend (value, bits)
b49e97c9
TS
2708 bfd_vma value;
2709 int bits;
2710{
2711 if (value & ((bfd_vma) 1 << (bits - 1)))
2712 /* VALUE is negative. */
2713 value |= ((bfd_vma) - 1) << bits;
2714
2715 return value;
2716}
2717
2718/* Return non-zero if the indicated VALUE has overflowed the maximum
2719 range expressable by a signed number with the indicated number of
2720 BITS. */
2721
b34976b6 2722static bfd_boolean
b49e97c9
TS
2723mips_elf_overflow_p (value, bits)
2724 bfd_vma value;
2725 int bits;
2726{
2727 bfd_signed_vma svalue = (bfd_signed_vma) value;
2728
2729 if (svalue > (1 << (bits - 1)) - 1)
2730 /* The value is too big. */
b34976b6 2731 return TRUE;
b49e97c9
TS
2732 else if (svalue < -(1 << (bits - 1)))
2733 /* The value is too small. */
b34976b6 2734 return TRUE;
b49e97c9
TS
2735
2736 /* All is well. */
b34976b6 2737 return FALSE;
b49e97c9
TS
2738}
2739
2740/* Calculate the %high function. */
2741
2742static bfd_vma
2743mips_elf_high (value)
2744 bfd_vma value;
2745{
2746 return ((value + (bfd_vma) 0x8000) >> 16) & 0xffff;
2747}
2748
2749/* Calculate the %higher function. */
2750
2751static bfd_vma
2752mips_elf_higher (value)
2753 bfd_vma value ATTRIBUTE_UNUSED;
2754{
2755#ifdef BFD64
2756 return ((value + (bfd_vma) 0x80008000) >> 32) & 0xffff;
2757#else
2758 abort ();
2759 return (bfd_vma) -1;
2760#endif
2761}
2762
2763/* Calculate the %highest function. */
2764
2765static bfd_vma
2766mips_elf_highest (value)
2767 bfd_vma value ATTRIBUTE_UNUSED;
2768{
2769#ifdef BFD64
b15e6682 2770 return ((value + (((bfd_vma) 0x8000 << 32) | 0x80008000)) >> 48) & 0xffff;
b49e97c9
TS
2771#else
2772 abort ();
2773 return (bfd_vma) -1;
2774#endif
2775}
2776\f
2777/* Create the .compact_rel section. */
2778
b34976b6 2779static bfd_boolean
b49e97c9
TS
2780mips_elf_create_compact_rel_section (abfd, info)
2781 bfd *abfd;
2782 struct bfd_link_info *info ATTRIBUTE_UNUSED;
2783{
2784 flagword flags;
2785 register asection *s;
2786
2787 if (bfd_get_section_by_name (abfd, ".compact_rel") == NULL)
2788 {
2789 flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED
2790 | SEC_READONLY);
2791
2792 s = bfd_make_section (abfd, ".compact_rel");
2793 if (s == NULL
2794 || ! bfd_set_section_flags (abfd, s, flags)
2795 || ! bfd_set_section_alignment (abfd, s,
2796 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
b34976b6 2797 return FALSE;
b49e97c9
TS
2798
2799 s->_raw_size = sizeof (Elf32_External_compact_rel);
2800 }
2801
b34976b6 2802 return TRUE;
b49e97c9
TS
2803}
2804
2805/* Create the .got section to hold the global offset table. */
2806
b34976b6 2807static bfd_boolean
f4416af6 2808mips_elf_create_got_section (abfd, info, maybe_exclude)
b49e97c9
TS
2809 bfd *abfd;
2810 struct bfd_link_info *info;
f4416af6 2811 bfd_boolean maybe_exclude;
b49e97c9
TS
2812{
2813 flagword flags;
2814 register asection *s;
2815 struct elf_link_hash_entry *h;
14a793b2 2816 struct bfd_link_hash_entry *bh;
b49e97c9
TS
2817 struct mips_got_info *g;
2818 bfd_size_type amt;
2819
2820 /* This function may be called more than once. */
f4416af6
AO
2821 s = mips_elf_got_section (abfd, TRUE);
2822 if (s)
2823 {
2824 if (! maybe_exclude)
2825 s->flags &= ~SEC_EXCLUDE;
2826 return TRUE;
2827 }
b49e97c9
TS
2828
2829 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2830 | SEC_LINKER_CREATED);
2831
f4416af6
AO
2832 if (maybe_exclude)
2833 flags |= SEC_EXCLUDE;
2834
72b4917c
TS
2835 /* We have to use an alignment of 2**4 here because this is hardcoded
2836 in the function stub generation and in the linker script. */
b49e97c9
TS
2837 s = bfd_make_section (abfd, ".got");
2838 if (s == NULL
2839 || ! bfd_set_section_flags (abfd, s, flags)
72b4917c 2840 || ! bfd_set_section_alignment (abfd, s, 4))
b34976b6 2841 return FALSE;
b49e97c9
TS
2842
2843 /* Define the symbol _GLOBAL_OFFSET_TABLE_. We don't do this in the
2844 linker script because we don't want to define the symbol if we
2845 are not creating a global offset table. */
14a793b2 2846 bh = NULL;
b49e97c9
TS
2847 if (! (_bfd_generic_link_add_one_symbol
2848 (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
b34976b6 2849 (bfd_vma) 0, (const char *) NULL, FALSE,
14a793b2 2850 get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 2851 return FALSE;
14a793b2
AM
2852
2853 h = (struct elf_link_hash_entry *) bh;
b49e97c9
TS
2854 h->elf_link_hash_flags &= ~ELF_LINK_NON_ELF;
2855 h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
2856 h->type = STT_OBJECT;
2857
2858 if (info->shared
2859 && ! bfd_elf32_link_record_dynamic_symbol (info, h))
b34976b6 2860 return FALSE;
b49e97c9 2861
b49e97c9
TS
2862 amt = sizeof (struct mips_got_info);
2863 g = (struct mips_got_info *) bfd_alloc (abfd, amt);
2864 if (g == NULL)
b34976b6 2865 return FALSE;
b49e97c9
TS
2866 g->global_gotsym = NULL;
2867 g->local_gotno = MIPS_RESERVED_GOTNO;
2868 g->assigned_gotno = MIPS_RESERVED_GOTNO;
f4416af6
AO
2869 g->bfd2got = NULL;
2870 g->next = NULL;
b15e6682
AO
2871 g->got_entries = htab_try_create (1, mips_elf_got_entry_hash,
2872 mips_elf_got_entry_eq,
2873 (htab_del) NULL);
2874 if (g->got_entries == NULL)
2875 return FALSE;
f0abc2a1
AM
2876 mips_elf_section_data (s)->u.got_info = g;
2877 mips_elf_section_data (s)->elf.this_hdr.sh_flags
b49e97c9
TS
2878 |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
2879
b34976b6 2880 return TRUE;
b49e97c9 2881}
b49e97c9
TS
2882\f
2883/* Calculate the value produced by the RELOCATION (which comes from
2884 the INPUT_BFD). The ADDEND is the addend to use for this
2885 RELOCATION; RELOCATION->R_ADDEND is ignored.
2886
2887 The result of the relocation calculation is stored in VALUEP.
2888 REQUIRE_JALXP indicates whether or not the opcode used with this
2889 relocation must be JALX.
2890
2891 This function returns bfd_reloc_continue if the caller need take no
2892 further action regarding this relocation, bfd_reloc_notsupported if
2893 something goes dramatically wrong, bfd_reloc_overflow if an
2894 overflow occurs, and bfd_reloc_ok to indicate success. */
2895
2896static bfd_reloc_status_type
2897mips_elf_calculate_relocation (abfd, input_bfd, input_section, info,
2898 relocation, addend, howto, local_syms,
2899 local_sections, valuep, namep,
bce03d3d 2900 require_jalxp, save_addend)
b49e97c9
TS
2901 bfd *abfd;
2902 bfd *input_bfd;
2903 asection *input_section;
2904 struct bfd_link_info *info;
2905 const Elf_Internal_Rela *relocation;
2906 bfd_vma addend;
2907 reloc_howto_type *howto;
2908 Elf_Internal_Sym *local_syms;
2909 asection **local_sections;
2910 bfd_vma *valuep;
2911 const char **namep;
b34976b6
AM
2912 bfd_boolean *require_jalxp;
2913 bfd_boolean save_addend;
b49e97c9
TS
2914{
2915 /* The eventual value we will return. */
2916 bfd_vma value;
2917 /* The address of the symbol against which the relocation is
2918 occurring. */
2919 bfd_vma symbol = 0;
2920 /* The final GP value to be used for the relocatable, executable, or
2921 shared object file being produced. */
2922 bfd_vma gp = MINUS_ONE;
2923 /* The place (section offset or address) of the storage unit being
2924 relocated. */
2925 bfd_vma p;
2926 /* The value of GP used to create the relocatable object. */
2927 bfd_vma gp0 = MINUS_ONE;
2928 /* The offset into the global offset table at which the address of
2929 the relocation entry symbol, adjusted by the addend, resides
2930 during execution. */
2931 bfd_vma g = MINUS_ONE;
2932 /* The section in which the symbol referenced by the relocation is
2933 located. */
2934 asection *sec = NULL;
2935 struct mips_elf_link_hash_entry *h = NULL;
b34976b6 2936 /* TRUE if the symbol referred to by this relocation is a local
b49e97c9 2937 symbol. */
b34976b6
AM
2938 bfd_boolean local_p, was_local_p;
2939 /* TRUE if the symbol referred to by this relocation is "_gp_disp". */
2940 bfd_boolean gp_disp_p = FALSE;
b49e97c9
TS
2941 Elf_Internal_Shdr *symtab_hdr;
2942 size_t extsymoff;
2943 unsigned long r_symndx;
2944 int r_type;
b34976b6 2945 /* TRUE if overflow occurred during the calculation of the
b49e97c9 2946 relocation value. */
b34976b6
AM
2947 bfd_boolean overflowed_p;
2948 /* TRUE if this relocation refers to a MIPS16 function. */
2949 bfd_boolean target_is_16_bit_code_p = FALSE;
b49e97c9
TS
2950
2951 /* Parse the relocation. */
2952 r_symndx = ELF_R_SYM (input_bfd, relocation->r_info);
2953 r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
2954 p = (input_section->output_section->vma
2955 + input_section->output_offset
2956 + relocation->r_offset);
2957
2958 /* Assume that there will be no overflow. */
b34976b6 2959 overflowed_p = FALSE;
b49e97c9
TS
2960
2961 /* Figure out whether or not the symbol is local, and get the offset
2962 used in the array of hash table entries. */
2963 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2964 local_p = mips_elf_local_relocation_p (input_bfd, relocation,
b34976b6 2965 local_sections, FALSE);
bce03d3d 2966 was_local_p = local_p;
b49e97c9
TS
2967 if (! elf_bad_symtab (input_bfd))
2968 extsymoff = symtab_hdr->sh_info;
2969 else
2970 {
2971 /* The symbol table does not follow the rule that local symbols
2972 must come before globals. */
2973 extsymoff = 0;
2974 }
2975
2976 /* Figure out the value of the symbol. */
2977 if (local_p)
2978 {
2979 Elf_Internal_Sym *sym;
2980
2981 sym = local_syms + r_symndx;
2982 sec = local_sections[r_symndx];
2983
2984 symbol = sec->output_section->vma + sec->output_offset;
d4df96e6
L
2985 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION
2986 || (sec->flags & SEC_MERGE))
b49e97c9 2987 symbol += sym->st_value;
d4df96e6
L
2988 if ((sec->flags & SEC_MERGE)
2989 && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
2990 {
2991 addend = _bfd_elf_rel_local_sym (abfd, sym, &sec, addend);
2992 addend -= symbol;
2993 addend += sec->output_section->vma + sec->output_offset;
2994 }
b49e97c9
TS
2995
2996 /* MIPS16 text labels should be treated as odd. */
2997 if (sym->st_other == STO_MIPS16)
2998 ++symbol;
2999
3000 /* Record the name of this symbol, for our caller. */
3001 *namep = bfd_elf_string_from_elf_section (input_bfd,
3002 symtab_hdr->sh_link,
3003 sym->st_name);
3004 if (*namep == '\0')
3005 *namep = bfd_section_name (input_bfd, sec);
3006
3007 target_is_16_bit_code_p = (sym->st_other == STO_MIPS16);
3008 }
3009 else
3010 {
3011 /* For global symbols we look up the symbol in the hash-table. */
3012 h = ((struct mips_elf_link_hash_entry *)
3013 elf_sym_hashes (input_bfd) [r_symndx - extsymoff]);
3014 /* Find the real hash-table entry for this symbol. */
3015 while (h->root.root.type == bfd_link_hash_indirect
3016 || h->root.root.type == bfd_link_hash_warning)
3017 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
3018
3019 /* Record the name of this symbol, for our caller. */
3020 *namep = h->root.root.root.string;
3021
3022 /* See if this is the special _gp_disp symbol. Note that such a
3023 symbol must always be a global symbol. */
3024 if (strcmp (h->root.root.root.string, "_gp_disp") == 0
3025 && ! NEWABI_P (input_bfd))
3026 {
3027 /* Relocations against _gp_disp are permitted only with
3028 R_MIPS_HI16 and R_MIPS_LO16 relocations. */
3029 if (r_type != R_MIPS_HI16 && r_type != R_MIPS_LO16)
3030 return bfd_reloc_notsupported;
3031
b34976b6 3032 gp_disp_p = TRUE;
b49e97c9
TS
3033 }
3034 /* If this symbol is defined, calculate its address. Note that
3035 _gp_disp is a magic symbol, always implicitly defined by the
3036 linker, so it's inappropriate to check to see whether or not
3037 its defined. */
3038 else if ((h->root.root.type == bfd_link_hash_defined
3039 || h->root.root.type == bfd_link_hash_defweak)
3040 && h->root.root.u.def.section)
3041 {
3042 sec = h->root.root.u.def.section;
3043 if (sec->output_section)
3044 symbol = (h->root.root.u.def.value
3045 + sec->output_section->vma
3046 + sec->output_offset);
3047 else
3048 symbol = h->root.root.u.def.value;
3049 }
3050 else if (h->root.root.type == bfd_link_hash_undefweak)
3051 /* We allow relocations against undefined weak symbols, giving
3052 it the value zero, so that you can undefined weak functions
3053 and check to see if they exist by looking at their
3054 addresses. */
3055 symbol = 0;
3056 else if (info->shared
b49e97c9
TS
3057 && !info->no_undefined
3058 && ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
3059 symbol = 0;
3060 else if (strcmp (h->root.root.root.string, "_DYNAMIC_LINK") == 0 ||
3061 strcmp (h->root.root.root.string, "_DYNAMIC_LINKING") == 0)
3062 {
3063 /* If this is a dynamic link, we should have created a
3064 _DYNAMIC_LINK symbol or _DYNAMIC_LINKING(for normal mips) symbol
3065 in in _bfd_mips_elf_create_dynamic_sections.
3066 Otherwise, we should define the symbol with a value of 0.
3067 FIXME: It should probably get into the symbol table
3068 somehow as well. */
3069 BFD_ASSERT (! info->shared);
3070 BFD_ASSERT (bfd_get_section_by_name (abfd, ".dynamic") == NULL);
3071 symbol = 0;
3072 }
3073 else
3074 {
3075 if (! ((*info->callbacks->undefined_symbol)
3076 (info, h->root.root.root.string, input_bfd,
3077 input_section, relocation->r_offset,
3078 (!info->shared || info->no_undefined
3079 || ELF_ST_VISIBILITY (h->root.other)))))
3080 return bfd_reloc_undefined;
3081 symbol = 0;
3082 }
3083
3084 target_is_16_bit_code_p = (h->root.other == STO_MIPS16);
3085 }
3086
3087 /* If this is a 32- or 64-bit call to a 16-bit function with a stub, we
3088 need to redirect the call to the stub, unless we're already *in*
3089 a stub. */
1049f94e 3090 if (r_type != R_MIPS16_26 && !info->relocatable
b49e97c9
TS
3091 && ((h != NULL && h->fn_stub != NULL)
3092 || (local_p && elf_tdata (input_bfd)->local_stubs != NULL
3093 && elf_tdata (input_bfd)->local_stubs[r_symndx] != NULL))
3094 && !mips_elf_stub_section_p (input_bfd, input_section))
3095 {
3096 /* This is a 32- or 64-bit call to a 16-bit function. We should
3097 have already noticed that we were going to need the
3098 stub. */
3099 if (local_p)
3100 sec = elf_tdata (input_bfd)->local_stubs[r_symndx];
3101 else
3102 {
3103 BFD_ASSERT (h->need_fn_stub);
3104 sec = h->fn_stub;
3105 }
3106
3107 symbol = sec->output_section->vma + sec->output_offset;
3108 }
3109 /* If this is a 16-bit call to a 32- or 64-bit function with a stub, we
3110 need to redirect the call to the stub. */
1049f94e 3111 else if (r_type == R_MIPS16_26 && !info->relocatable
b49e97c9
TS
3112 && h != NULL
3113 && (h->call_stub != NULL || h->call_fp_stub != NULL)
3114 && !target_is_16_bit_code_p)
3115 {
3116 /* If both call_stub and call_fp_stub are defined, we can figure
3117 out which one to use by seeing which one appears in the input
3118 file. */
3119 if (h->call_stub != NULL && h->call_fp_stub != NULL)
3120 {
3121 asection *o;
3122
3123 sec = NULL;
3124 for (o = input_bfd->sections; o != NULL; o = o->next)
3125 {
3126 if (strncmp (bfd_get_section_name (input_bfd, o),
3127 CALL_FP_STUB, sizeof CALL_FP_STUB - 1) == 0)
3128 {
3129 sec = h->call_fp_stub;
3130 break;
3131 }
3132 }
3133 if (sec == NULL)
3134 sec = h->call_stub;
3135 }
3136 else if (h->call_stub != NULL)
3137 sec = h->call_stub;
3138 else
3139 sec = h->call_fp_stub;
3140
3141 BFD_ASSERT (sec->_raw_size > 0);
3142 symbol = sec->output_section->vma + sec->output_offset;
3143 }
3144
3145 /* Calls from 16-bit code to 32-bit code and vice versa require the
3146 special jalx instruction. */
1049f94e 3147 *require_jalxp = (!info->relocatable
b49e97c9
TS
3148 && (((r_type == R_MIPS16_26) && !target_is_16_bit_code_p)
3149 || ((r_type == R_MIPS_26) && target_is_16_bit_code_p)));
3150
3151 local_p = mips_elf_local_relocation_p (input_bfd, relocation,
b34976b6 3152 local_sections, TRUE);
b49e97c9
TS
3153
3154 /* If we haven't already determined the GOT offset, or the GP value,
3155 and we're going to need it, get it now. */
3156 switch (r_type)
3157 {
0fdc1bf1 3158 case R_MIPS_GOT_PAGE:
93a2b7ae 3159 case R_MIPS_GOT_OFST:
0176c794
AO
3160 /* If this symbol got a global GOT entry, we have to decay
3161 GOT_PAGE/GOT_OFST to GOT_DISP/addend. */
93a2b7ae
AO
3162 local_p = local_p || ! h
3163 || (h->root.dynindx
3164 < mips_elf_get_global_gotsym_index (elf_hash_table (info)
3165 ->dynobj));
3166 if (local_p || r_type == R_MIPS_GOT_OFST)
0fdc1bf1
AO
3167 break;
3168 /* Fall through. */
3169
b49e97c9
TS
3170 case R_MIPS_CALL16:
3171 case R_MIPS_GOT16:
3172 case R_MIPS_GOT_DISP:
3173 case R_MIPS_GOT_HI16:
3174 case R_MIPS_CALL_HI16:
3175 case R_MIPS_GOT_LO16:
3176 case R_MIPS_CALL_LO16:
3177 /* Find the index into the GOT where this value is located. */
3178 if (!local_p)
3179 {
0fdc1bf1
AO
3180 /* GOT_PAGE may take a non-zero addend, that is ignored in a
3181 GOT_PAGE relocation that decays to GOT_DISP because the
3182 symbol turns out to be global. The addend is then added
3183 as GOT_OFST. */
3184 BFD_ASSERT (addend == 0 || r_type == R_MIPS_GOT_PAGE);
b49e97c9 3185 g = mips_elf_global_got_index (elf_hash_table (info)->dynobj,
f4416af6 3186 input_bfd,
b49e97c9
TS
3187 (struct elf_link_hash_entry *) h);
3188 if (! elf_hash_table(info)->dynamic_sections_created
3189 || (info->shared
3190 && (info->symbolic || h->root.dynindx == -1)
3191 && (h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
3192 {
3193 /* This is a static link or a -Bsymbolic link. The
3194 symbol is defined locally, or was forced to be local.
3195 We must initialize this entry in the GOT. */
3196 bfd *tmpbfd = elf_hash_table (info)->dynobj;
f4416af6 3197 asection *sgot = mips_elf_got_section (tmpbfd, FALSE);
0fdc1bf1 3198 MIPS_ELF_PUT_WORD (tmpbfd, symbol, sgot->contents + g);
b49e97c9
TS
3199 }
3200 }
3201 else if (r_type == R_MIPS_GOT16 || r_type == R_MIPS_CALL16)
3202 /* There's no need to create a local GOT entry here; the
3203 calculation for a local GOT16 entry does not involve G. */
3204 break;
3205 else
3206 {
f4416af6
AO
3207 g = mips_elf_local_got_index (abfd, input_bfd,
3208 info, symbol + addend);
b49e97c9
TS
3209 if (g == MINUS_ONE)
3210 return bfd_reloc_outofrange;
3211 }
3212
3213 /* Convert GOT indices to actual offsets. */
3214 g = mips_elf_got_offset_from_index (elf_hash_table (info)->dynobj,
f4416af6 3215 abfd, input_bfd, g);
b49e97c9
TS
3216 break;
3217
3218 case R_MIPS_HI16:
3219 case R_MIPS_LO16:
3220 case R_MIPS16_GPREL:
3221 case R_MIPS_GPREL16:
3222 case R_MIPS_GPREL32:
3223 case R_MIPS_LITERAL:
3224 gp0 = _bfd_get_gp_value (input_bfd);
3225 gp = _bfd_get_gp_value (abfd);
f4416af6
AO
3226 if (elf_hash_table (info)->dynobj)
3227 gp += mips_elf_adjust_gp (abfd,
3228 mips_elf_got_info
3229 (elf_hash_table (info)->dynobj, NULL),
3230 input_bfd);
b49e97c9
TS
3231 break;
3232
3233 default:
3234 break;
3235 }
3236
3237 /* Figure out what kind of relocation is being performed. */
3238 switch (r_type)
3239 {
3240 case R_MIPS_NONE:
3241 return bfd_reloc_continue;
3242
3243 case R_MIPS_16:
a7ebbfdf 3244 value = symbol + _bfd_mips_elf_sign_extend (addend, 16);
b49e97c9
TS
3245 overflowed_p = mips_elf_overflow_p (value, 16);
3246 break;
3247
3248 case R_MIPS_32:
3249 case R_MIPS_REL32:
3250 case R_MIPS_64:
3251 if ((info->shared
3252 || (elf_hash_table (info)->dynamic_sections_created
3253 && h != NULL
3254 && ((h->root.elf_link_hash_flags
3255 & ELF_LINK_HASH_DEF_DYNAMIC) != 0)
3256 && ((h->root.elf_link_hash_flags
3257 & ELF_LINK_HASH_DEF_REGULAR) == 0)))
3258 && r_symndx != 0
3259 && (input_section->flags & SEC_ALLOC) != 0)
3260 {
3261 /* If we're creating a shared library, or this relocation is
3262 against a symbol in a shared library, then we can't know
3263 where the symbol will end up. So, we create a relocation
3264 record in the output, and leave the job up to the dynamic
3265 linker. */
3266 value = addend;
3267 if (!mips_elf_create_dynamic_relocation (abfd,
3268 info,
3269 relocation,
3270 h,
3271 sec,
3272 symbol,
3273 &value,
3274 input_section))
3275 return bfd_reloc_undefined;
3276 }
3277 else
3278 {
3279 if (r_type != R_MIPS_REL32)
3280 value = symbol + addend;
3281 else
3282 value = addend;
3283 }
3284 value &= howto->dst_mask;
3285 break;
3286
3287 case R_MIPS_PC32:
3288 case R_MIPS_PC64:
3289 case R_MIPS_GNU_REL_LO16:
3290 value = symbol + addend - p;
3291 value &= howto->dst_mask;
3292 break;
3293
0b25d3e6 3294 case R_MIPS_GNU_REL16_S2:
a7ebbfdf 3295 value = symbol + _bfd_mips_elf_sign_extend (addend << 2, 18) - p;
0b25d3e6
AO
3296 overflowed_p = mips_elf_overflow_p (value, 18);
3297 value = (value >> 2) & howto->dst_mask;
3298 break;
3299
b49e97c9
TS
3300 case R_MIPS_GNU_REL_HI16:
3301 /* Instead of subtracting 'p' here, we should be subtracting the
3302 equivalent value for the LO part of the reloc, since the value
3303 here is relative to that address. Because that's not easy to do,
3304 we adjust 'addend' in _bfd_mips_elf_relocate_section(). See also
3305 the comment there for more information. */
3306 value = mips_elf_high (addend + symbol - p);
3307 value &= howto->dst_mask;
3308 break;
3309
3310 case R_MIPS16_26:
3311 /* The calculation for R_MIPS16_26 is just the same as for an
3312 R_MIPS_26. It's only the storage of the relocated field into
3313 the output file that's different. That's handled in
3314 mips_elf_perform_relocation. So, we just fall through to the
3315 R_MIPS_26 case here. */
3316 case R_MIPS_26:
3317 if (local_p)
3318 value = (((addend << 2) | ((p + 4) & 0xf0000000)) + symbol) >> 2;
3319 else
a7ebbfdf 3320 value = (_bfd_mips_elf_sign_extend (addend << 2, 28) + symbol) >> 2;
b49e97c9
TS
3321 value &= howto->dst_mask;
3322 break;
3323
3324 case R_MIPS_HI16:
3325 if (!gp_disp_p)
3326 {
3327 value = mips_elf_high (addend + symbol);
3328 value &= howto->dst_mask;
3329 }
3330 else
3331 {
3332 value = mips_elf_high (addend + gp - p);
3333 overflowed_p = mips_elf_overflow_p (value, 16);
3334 }
3335 break;
3336
3337 case R_MIPS_LO16:
3338 if (!gp_disp_p)
3339 value = (symbol + addend) & howto->dst_mask;
3340 else
3341 {
3342 value = addend + gp - p + 4;
3343 /* The MIPS ABI requires checking the R_MIPS_LO16 relocation
8dc1a139 3344 for overflow. But, on, say, IRIX5, relocations against
b49e97c9
TS
3345 _gp_disp are normally generated from the .cpload
3346 pseudo-op. It generates code that normally looks like
3347 this:
3348
3349 lui $gp,%hi(_gp_disp)
3350 addiu $gp,$gp,%lo(_gp_disp)
3351 addu $gp,$gp,$t9
3352
3353 Here $t9 holds the address of the function being called,
3354 as required by the MIPS ELF ABI. The R_MIPS_LO16
3355 relocation can easily overflow in this situation, but the
3356 R_MIPS_HI16 relocation will handle the overflow.
3357 Therefore, we consider this a bug in the MIPS ABI, and do
3358 not check for overflow here. */
3359 }
3360 break;
3361
3362 case R_MIPS_LITERAL:
3363 /* Because we don't merge literal sections, we can handle this
3364 just like R_MIPS_GPREL16. In the long run, we should merge
3365 shared literals, and then we will need to additional work
3366 here. */
3367
3368 /* Fall through. */
3369
3370 case R_MIPS16_GPREL:
3371 /* The R_MIPS16_GPREL performs the same calculation as
3372 R_MIPS_GPREL16, but stores the relocated bits in a different
3373 order. We don't need to do anything special here; the
3374 differences are handled in mips_elf_perform_relocation. */
3375 case R_MIPS_GPREL16:
bce03d3d
AO
3376 /* Only sign-extend the addend if it was extracted from the
3377 instruction. If the addend was separate, leave it alone,
3378 otherwise we may lose significant bits. */
3379 if (howto->partial_inplace)
a7ebbfdf 3380 addend = _bfd_mips_elf_sign_extend (addend, 16);
bce03d3d
AO
3381 value = symbol + addend - gp;
3382 /* If the symbol was local, any earlier relocatable links will
3383 have adjusted its addend with the gp offset, so compensate
3384 for that now. Don't do it for symbols forced local in this
3385 link, though, since they won't have had the gp offset applied
3386 to them before. */
3387 if (was_local_p)
3388 value += gp0;
b49e97c9
TS
3389 overflowed_p = mips_elf_overflow_p (value, 16);
3390 break;
3391
3392 case R_MIPS_GOT16:
3393 case R_MIPS_CALL16:
3394 if (local_p)
3395 {
b34976b6 3396 bfd_boolean forced;
b49e97c9
TS
3397
3398 /* The special case is when the symbol is forced to be local. We
3399 need the full address in the GOT since no R_MIPS_LO16 relocation
3400 follows. */
3401 forced = ! mips_elf_local_relocation_p (input_bfd, relocation,
b34976b6 3402 local_sections, FALSE);
f4416af6
AO
3403 value = mips_elf_got16_entry (abfd, input_bfd, info,
3404 symbol + addend, forced);
b49e97c9
TS
3405 if (value == MINUS_ONE)
3406 return bfd_reloc_outofrange;
3407 value
3408 = mips_elf_got_offset_from_index (elf_hash_table (info)->dynobj,
f4416af6 3409 abfd, input_bfd, value);
b49e97c9
TS
3410 overflowed_p = mips_elf_overflow_p (value, 16);
3411 break;
3412 }
3413
3414 /* Fall through. */
3415
3416 case R_MIPS_GOT_DISP:
0fdc1bf1 3417 got_disp:
b49e97c9
TS
3418 value = g;
3419 overflowed_p = mips_elf_overflow_p (value, 16);
3420 break;
3421
3422 case R_MIPS_GPREL32:
bce03d3d
AO
3423 value = (addend + symbol + gp0 - gp);
3424 if (!save_addend)
3425 value &= howto->dst_mask;
b49e97c9
TS
3426 break;
3427
3428 case R_MIPS_PC16:
a7ebbfdf 3429 value = _bfd_mips_elf_sign_extend (addend, 16) + symbol - p;
0b25d3e6 3430 overflowed_p = mips_elf_overflow_p (value, 16);
b49e97c9
TS
3431 break;
3432
3433 case R_MIPS_GOT_HI16:
3434 case R_MIPS_CALL_HI16:
3435 /* We're allowed to handle these two relocations identically.
3436 The dynamic linker is allowed to handle the CALL relocations
3437 differently by creating a lazy evaluation stub. */
3438 value = g;
3439 value = mips_elf_high (value);
3440 value &= howto->dst_mask;
3441 break;
3442
3443 case R_MIPS_GOT_LO16:
3444 case R_MIPS_CALL_LO16:
3445 value = g & howto->dst_mask;
3446 break;
3447
3448 case R_MIPS_GOT_PAGE:
0fdc1bf1
AO
3449 /* GOT_PAGE relocations that reference non-local symbols decay
3450 to GOT_DISP. The corresponding GOT_OFST relocation decays to
3451 0. */
93a2b7ae 3452 if (! local_p)
0fdc1bf1 3453 goto got_disp;
f4416af6 3454 value = mips_elf_got_page (abfd, input_bfd, info, symbol + addend, NULL);
b49e97c9
TS
3455 if (value == MINUS_ONE)
3456 return bfd_reloc_outofrange;
3457 value = mips_elf_got_offset_from_index (elf_hash_table (info)->dynobj,
f4416af6 3458 abfd, input_bfd, value);
b49e97c9
TS
3459 overflowed_p = mips_elf_overflow_p (value, 16);
3460 break;
3461
3462 case R_MIPS_GOT_OFST:
93a2b7ae 3463 if (local_p)
0fdc1bf1
AO
3464 mips_elf_got_page (abfd, input_bfd, info, symbol + addend, &value);
3465 else
3466 value = addend;
b49e97c9
TS
3467 overflowed_p = mips_elf_overflow_p (value, 16);
3468 break;
3469
3470 case R_MIPS_SUB:
3471 value = symbol - addend;
3472 value &= howto->dst_mask;
3473 break;
3474
3475 case R_MIPS_HIGHER:
3476 value = mips_elf_higher (addend + symbol);
3477 value &= howto->dst_mask;
3478 break;
3479
3480 case R_MIPS_HIGHEST:
3481 value = mips_elf_highest (addend + symbol);
3482 value &= howto->dst_mask;
3483 break;
3484
3485 case R_MIPS_SCN_DISP:
3486 value = symbol + addend - sec->output_offset;
3487 value &= howto->dst_mask;
3488 break;
3489
3490 case R_MIPS_PJUMP:
3491 case R_MIPS_JALR:
3492 /* Both of these may be ignored. R_MIPS_JALR is an optimization
3493 hint; we could improve performance by honoring that hint. */
3494 return bfd_reloc_continue;
3495
3496 case R_MIPS_GNU_VTINHERIT:
3497 case R_MIPS_GNU_VTENTRY:
3498 /* We don't do anything with these at present. */
3499 return bfd_reloc_continue;
3500
3501 default:
3502 /* An unrecognized relocation type. */
3503 return bfd_reloc_notsupported;
3504 }
3505
3506 /* Store the VALUE for our caller. */
3507 *valuep = value;
3508 return overflowed_p ? bfd_reloc_overflow : bfd_reloc_ok;
3509}
3510
3511/* Obtain the field relocated by RELOCATION. */
3512
3513static bfd_vma
3514mips_elf_obtain_contents (howto, relocation, input_bfd, contents)
3515 reloc_howto_type *howto;
3516 const Elf_Internal_Rela *relocation;
3517 bfd *input_bfd;
3518 bfd_byte *contents;
3519{
3520 bfd_vma x;
3521 bfd_byte *location = contents + relocation->r_offset;
3522
3523 /* Obtain the bytes. */
3524 x = bfd_get ((8 * bfd_get_reloc_size (howto)), input_bfd, location);
3525
3526 if ((ELF_R_TYPE (input_bfd, relocation->r_info) == R_MIPS16_26
3527 || ELF_R_TYPE (input_bfd, relocation->r_info) == R_MIPS16_GPREL)
3528 && bfd_little_endian (input_bfd))
3529 /* The two 16-bit words will be reversed on a little-endian system.
3530 See mips_elf_perform_relocation for more details. */
3531 x = (((x & 0xffff) << 16) | ((x & 0xffff0000) >> 16));
3532
3533 return x;
3534}
3535
3536/* It has been determined that the result of the RELOCATION is the
3537 VALUE. Use HOWTO to place VALUE into the output file at the
3538 appropriate position. The SECTION is the section to which the
b34976b6 3539 relocation applies. If REQUIRE_JALX is TRUE, then the opcode used
b49e97c9
TS
3540 for the relocation must be either JAL or JALX, and it is
3541 unconditionally converted to JALX.
3542
b34976b6 3543 Returns FALSE if anything goes wrong. */
b49e97c9 3544
b34976b6 3545static bfd_boolean
b49e97c9
TS
3546mips_elf_perform_relocation (info, howto, relocation, value, input_bfd,
3547 input_section, contents, require_jalx)
3548 struct bfd_link_info *info;
3549 reloc_howto_type *howto;
3550 const Elf_Internal_Rela *relocation;
3551 bfd_vma value;
3552 bfd *input_bfd;
3553 asection *input_section;
3554 bfd_byte *contents;
b34976b6 3555 bfd_boolean require_jalx;
b49e97c9
TS
3556{
3557 bfd_vma x;
3558 bfd_byte *location;
3559 int r_type = ELF_R_TYPE (input_bfd, relocation->r_info);
3560
3561 /* Figure out where the relocation is occurring. */
3562 location = contents + relocation->r_offset;
3563
3564 /* Obtain the current value. */
3565 x = mips_elf_obtain_contents (howto, relocation, input_bfd, contents);
3566
3567 /* Clear the field we are setting. */
3568 x &= ~howto->dst_mask;
3569
3570 /* If this is the R_MIPS16_26 relocation, we must store the
3571 value in a funny way. */
3572 if (r_type == R_MIPS16_26)
3573 {
3574 /* R_MIPS16_26 is used for the mips16 jal and jalx instructions.
3575 Most mips16 instructions are 16 bits, but these instructions
3576 are 32 bits.
3577
3578 The format of these instructions is:
3579
3580 +--------------+--------------------------------+
3581 ! JALX ! X! Imm 20:16 ! Imm 25:21 !
3582 +--------------+--------------------------------+
3583 ! Immediate 15:0 !
3584 +-----------------------------------------------+
3585
3586 JALX is the 5-bit value 00011. X is 0 for jal, 1 for jalx.
3587 Note that the immediate value in the first word is swapped.
3588
1049f94e 3589 When producing a relocatable object file, R_MIPS16_26 is
b49e97c9
TS
3590 handled mostly like R_MIPS_26. In particular, the addend is
3591 stored as a straight 26-bit value in a 32-bit instruction.
3592 (gas makes life simpler for itself by never adjusting a
3593 R_MIPS16_26 reloc to be against a section, so the addend is
3594 always zero). However, the 32 bit instruction is stored as 2
3595 16-bit values, rather than a single 32-bit value. In a
3596 big-endian file, the result is the same; in a little-endian
3597 file, the two 16-bit halves of the 32 bit value are swapped.
3598 This is so that a disassembler can recognize the jal
3599 instruction.
3600
3601 When doing a final link, R_MIPS16_26 is treated as a 32 bit
3602 instruction stored as two 16-bit values. The addend A is the
3603 contents of the targ26 field. The calculation is the same as
3604 R_MIPS_26. When storing the calculated value, reorder the
3605 immediate value as shown above, and don't forget to store the
3606 value as two 16-bit values.
3607
3608 To put it in MIPS ABI terms, the relocation field is T-targ26-16,
3609 defined as
3610
3611 big-endian:
3612 +--------+----------------------+
3613 | | |
3614 | | targ26-16 |
3615 |31 26|25 0|
3616 +--------+----------------------+
3617
3618 little-endian:
3619 +----------+------+-------------+
3620 | | | |
3621 | sub1 | | sub2 |
3622 |0 9|10 15|16 31|
3623 +----------+--------------------+
3624 where targ26-16 is sub1 followed by sub2 (i.e., the addend field A is
3625 ((sub1 << 16) | sub2)).
3626
1049f94e 3627 When producing a relocatable object file, the calculation is
b49e97c9
TS
3628 (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
3629 When producing a fully linked file, the calculation is
3630 let R = (((A < 2) | ((P + 4) & 0xf0000000) + S) >> 2)
3631 ((R & 0x1f0000) << 5) | ((R & 0x3e00000) >> 5) | (R & 0xffff) */
3632
1049f94e 3633 if (!info->relocatable)
b49e97c9
TS
3634 /* Shuffle the bits according to the formula above. */
3635 value = (((value & 0x1f0000) << 5)
3636 | ((value & 0x3e00000) >> 5)
3637 | (value & 0xffff));
3638 }
3639 else if (r_type == R_MIPS16_GPREL)
3640 {
3641 /* R_MIPS16_GPREL is used for GP-relative addressing in mips16
3642 mode. A typical instruction will have a format like this:
3643
3644 +--------------+--------------------------------+
3645 ! EXTEND ! Imm 10:5 ! Imm 15:11 !
3646 +--------------+--------------------------------+
3647 ! Major ! rx ! ry ! Imm 4:0 !
3648 +--------------+--------------------------------+
3649
3650 EXTEND is the five bit value 11110. Major is the instruction
3651 opcode.
3652
3653 This is handled exactly like R_MIPS_GPREL16, except that the
3654 addend is retrieved and stored as shown in this diagram; that
3655 is, the Imm fields above replace the V-rel16 field.
3656
3657 All we need to do here is shuffle the bits appropriately. As
3658 above, the two 16-bit halves must be swapped on a
3659 little-endian system. */
3660 value = (((value & 0x7e0) << 16)
3661 | ((value & 0xf800) << 5)
3662 | (value & 0x1f));
3663 }
3664
3665 /* Set the field. */
3666 x |= (value & howto->dst_mask);
3667
3668 /* If required, turn JAL into JALX. */
3669 if (require_jalx)
3670 {
b34976b6 3671 bfd_boolean ok;
b49e97c9
TS
3672 bfd_vma opcode = x >> 26;
3673 bfd_vma jalx_opcode;
3674
3675 /* Check to see if the opcode is already JAL or JALX. */
3676 if (r_type == R_MIPS16_26)
3677 {
3678 ok = ((opcode == 0x6) || (opcode == 0x7));
3679 jalx_opcode = 0x7;
3680 }
3681 else
3682 {
3683 ok = ((opcode == 0x3) || (opcode == 0x1d));
3684 jalx_opcode = 0x1d;
3685 }
3686
3687 /* If the opcode is not JAL or JALX, there's a problem. */
3688 if (!ok)
3689 {
3690 (*_bfd_error_handler)
3691 (_("%s: %s+0x%lx: jump to stub routine which is not jal"),
3692 bfd_archive_filename (input_bfd),
3693 input_section->name,
3694 (unsigned long) relocation->r_offset);
3695 bfd_set_error (bfd_error_bad_value);
b34976b6 3696 return FALSE;
b49e97c9
TS
3697 }
3698
3699 /* Make this the JALX opcode. */
3700 x = (x & ~(0x3f << 26)) | (jalx_opcode << 26);
3701 }
3702
3703 /* Swap the high- and low-order 16 bits on little-endian systems
3704 when doing a MIPS16 relocation. */
3705 if ((r_type == R_MIPS16_GPREL || r_type == R_MIPS16_26)
3706 && bfd_little_endian (input_bfd))
3707 x = (((x & 0xffff) << 16) | ((x & 0xffff0000) >> 16));
3708
3709 /* Put the value into the output. */
3710 bfd_put (8 * bfd_get_reloc_size (howto), input_bfd, x, location);
b34976b6 3711 return TRUE;
b49e97c9
TS
3712}
3713
b34976b6 3714/* Returns TRUE if SECTION is a MIPS16 stub section. */
b49e97c9 3715
b34976b6 3716static bfd_boolean
b49e97c9
TS
3717mips_elf_stub_section_p (abfd, section)
3718 bfd *abfd ATTRIBUTE_UNUSED;
3719 asection *section;
3720{
3721 const char *name = bfd_get_section_name (abfd, section);
3722
3723 return (strncmp (name, FN_STUB, sizeof FN_STUB - 1) == 0
3724 || strncmp (name, CALL_STUB, sizeof CALL_STUB - 1) == 0
3725 || strncmp (name, CALL_FP_STUB, sizeof CALL_FP_STUB - 1) == 0);
3726}
3727\f
3728/* Add room for N relocations to the .rel.dyn section in ABFD. */
3729
3730static void
3731mips_elf_allocate_dynamic_relocations (abfd, n)
3732 bfd *abfd;
3733 unsigned int n;
3734{
3735 asection *s;
3736
f4416af6 3737 s = mips_elf_rel_dyn_section (abfd, FALSE);
b49e97c9
TS
3738 BFD_ASSERT (s != NULL);
3739
3740 if (s->_raw_size == 0)
3741 {
3742 /* Make room for a null element. */
3743 s->_raw_size += MIPS_ELF_REL_SIZE (abfd);
3744 ++s->reloc_count;
3745 }
3746 s->_raw_size += n * MIPS_ELF_REL_SIZE (abfd);
3747}
3748
3749/* Create a rel.dyn relocation for the dynamic linker to resolve. REL
3750 is the original relocation, which is now being transformed into a
3751 dynamic relocation. The ADDENDP is adjusted if necessary; the
3752 caller should store the result in place of the original addend. */
3753
b34976b6 3754static bfd_boolean
b49e97c9
TS
3755mips_elf_create_dynamic_relocation (output_bfd, info, rel, h, sec,
3756 symbol, addendp, input_section)
3757 bfd *output_bfd;
3758 struct bfd_link_info *info;
3759 const Elf_Internal_Rela *rel;
3760 struct mips_elf_link_hash_entry *h;
3761 asection *sec;
3762 bfd_vma symbol;
3763 bfd_vma *addendp;
3764 asection *input_section;
3765{
947216bf 3766 Elf_Internal_Rela outrel[3];
b34976b6 3767 bfd_boolean skip;
b49e97c9
TS
3768 asection *sreloc;
3769 bfd *dynobj;
3770 int r_type;
3771
3772 r_type = ELF_R_TYPE (output_bfd, rel->r_info);
3773 dynobj = elf_hash_table (info)->dynobj;
f4416af6 3774 sreloc = mips_elf_rel_dyn_section (dynobj, FALSE);
b49e97c9
TS
3775 BFD_ASSERT (sreloc != NULL);
3776 BFD_ASSERT (sreloc->contents != NULL);
3777 BFD_ASSERT (sreloc->reloc_count * MIPS_ELF_REL_SIZE (output_bfd)
3778 < sreloc->_raw_size);
3779
b34976b6 3780 skip = FALSE;
b49e97c9
TS
3781 outrel[0].r_offset =
3782 _bfd_elf_section_offset (output_bfd, info, input_section, rel[0].r_offset);
3783 outrel[1].r_offset =
3784 _bfd_elf_section_offset (output_bfd, info, input_section, rel[1].r_offset);
3785 outrel[2].r_offset =
3786 _bfd_elf_section_offset (output_bfd, info, input_section, rel[2].r_offset);
3787
3788#if 0
3789 /* We begin by assuming that the offset for the dynamic relocation
3790 is the same as for the original relocation. We'll adjust this
3791 later to reflect the correct output offsets. */
a7ebbfdf 3792 if (input_section->sec_info_type != ELF_INFO_TYPE_STABS)
b49e97c9
TS
3793 {
3794 outrel[1].r_offset = rel[1].r_offset;
3795 outrel[2].r_offset = rel[2].r_offset;
3796 }
3797 else
3798 {
3799 /* Except that in a stab section things are more complex.
3800 Because we compress stab information, the offset given in the
3801 relocation may not be the one we want; we must let the stabs
3802 machinery tell us the offset. */
3803 outrel[1].r_offset = outrel[0].r_offset;
3804 outrel[2].r_offset = outrel[0].r_offset;
3805 /* If we didn't need the relocation at all, this value will be
3806 -1. */
3807 if (outrel[0].r_offset == (bfd_vma) -1)
b34976b6 3808 skip = TRUE;
b49e97c9
TS
3809 }
3810#endif
3811
0d591ff7
RS
3812 if (outrel[0].r_offset == (bfd_vma) -1)
3813 /* The relocation field has been deleted. */
b34976b6 3814 skip = TRUE;
0d591ff7
RS
3815 else if (outrel[0].r_offset == (bfd_vma) -2)
3816 {
3817 /* The relocation field has been converted into a relative value of
3818 some sort. Functions like _bfd_elf_write_section_eh_frame expect
3819 the field to be fully relocated, so add in the symbol's value. */
3820 skip = TRUE;
3821 *addendp += symbol;
3822 }
b49e97c9
TS
3823
3824 /* If we've decided to skip this relocation, just output an empty
3825 record. Note that R_MIPS_NONE == 0, so that this call to memset
3826 is a way of setting R_TYPE to R_MIPS_NONE. */
3827 if (skip)
947216bf 3828 memset (outrel, 0, sizeof (Elf_Internal_Rela) * 3);
b49e97c9
TS
3829 else
3830 {
3831 long indx;
d2fba50d 3832 bfd_boolean defined_p;
b49e97c9
TS
3833
3834 /* We must now calculate the dynamic symbol table index to use
3835 in the relocation. */
3836 if (h != NULL
3837 && (! info->symbolic || (h->root.elf_link_hash_flags
fdd07405 3838 & ELF_LINK_HASH_DEF_REGULAR) == 0)
b49e97c9
TS
3839 /* h->root.dynindx may be -1 if this symbol was marked to
3840 become local. */
fdd07405
RS
3841 && h->root.dynindx != -1)
3842 {
3843 indx = h->root.dynindx;
d2fba50d
RS
3844 if (SGI_COMPAT (output_bfd))
3845 defined_p = ((h->root.elf_link_hash_flags
3846 & ELF_LINK_HASH_DEF_REGULAR) != 0);
3847 else
3848 /* ??? glibc's ld.so just adds the final GOT entry to the
3849 relocation field. It therefore treats relocs against
3850 defined symbols in the same way as relocs against
3851 undefined symbols. */
3852 defined_p = FALSE;
b49e97c9
TS
3853 }
3854 else
3855 {
3856 if (sec != NULL && bfd_is_abs_section (sec))
3857 indx = 0;
3858 else if (sec == NULL || sec->owner == NULL)
3859 {
3860 bfd_set_error (bfd_error_bad_value);
b34976b6 3861 return FALSE;
b49e97c9
TS
3862 }
3863 else
3864 {
3865 indx = elf_section_data (sec->output_section)->dynindx;
3866 if (indx == 0)
3867 abort ();
3868 }
3869
908488f1
AO
3870 /* Instead of generating a relocation using the section
3871 symbol, we may as well make it a fully relative
3872 relocation. We want to avoid generating relocations to
3873 local symbols because we used to generate them
3874 incorrectly, without adding the original symbol value,
3875 which is mandated by the ABI for section symbols. In
3876 order to give dynamic loaders and applications time to
3877 phase out the incorrect use, we refrain from emitting
3878 section-relative relocations. It's not like they're
3879 useful, after all. This should be a bit more efficient
3880 as well. */
fdd07405
RS
3881 /* ??? Although this behavior is compatible with glibc's ld.so,
3882 the ABI says that relocations against STN_UNDEF should have
3883 a symbol value of 0. Irix rld honors this, so relocations
3884 against STN_UNDEF have no effect. */
3885 if (!SGI_COMPAT (output_bfd))
3886 indx = 0;
d2fba50d 3887 defined_p = TRUE;
b49e97c9
TS
3888 }
3889
3890 /* If the relocation was previously an absolute relocation and
3891 this symbol will not be referred to by the relocation, we must
3892 adjust it by the value we give it in the dynamic symbol table.
3893 Otherwise leave the job up to the dynamic linker. */
d2fba50d 3894 if (defined_p && r_type != R_MIPS_REL32)
b49e97c9
TS
3895 *addendp += symbol;
3896
3897 /* The relocation is always an REL32 relocation because we don't
3898 know where the shared library will wind up at load-time. */
34ea4a36
TS
3899 outrel[0].r_info = ELF_R_INFO (output_bfd, (unsigned long) indx,
3900 R_MIPS_REL32);
908488f1
AO
3901 /* For strict adherence to the ABI specification, we should
3902 generate a R_MIPS_64 relocation record by itself before the
3903 _REL32/_64 record as well, such that the addend is read in as
3904 a 64-bit value (REL32 is a 32-bit relocation, after all).
3905 However, since none of the existing ELF64 MIPS dynamic
3906 loaders seems to care, we don't waste space with these
3907 artificial relocations. If this turns out to not be true,
3908 mips_elf_allocate_dynamic_relocation() should be tweaked so
3909 as to make room for a pair of dynamic relocations per
3910 invocation if ABI_64_P, and here we should generate an
3911 additional relocation record with R_MIPS_64 by itself for a
3912 NULL symbol before this relocation record. */
7c4ca42d 3913 outrel[1].r_info = ELF_R_INFO (output_bfd, (unsigned long) 0,
033fd5f9
AO
3914 ABI_64_P (output_bfd)
3915 ? R_MIPS_64
3916 : R_MIPS_NONE);
7c4ca42d
AO
3917 outrel[2].r_info = ELF_R_INFO (output_bfd, (unsigned long) 0,
3918 R_MIPS_NONE);
b49e97c9
TS
3919
3920 /* Adjust the output offset of the relocation to reference the
3921 correct location in the output file. */
3922 outrel[0].r_offset += (input_section->output_section->vma
3923 + input_section->output_offset);
3924 outrel[1].r_offset += (input_section->output_section->vma
3925 + input_section->output_offset);
3926 outrel[2].r_offset += (input_section->output_section->vma
3927 + input_section->output_offset);
3928 }
3929
3930 /* Put the relocation back out. We have to use the special
3931 relocation outputter in the 64-bit case since the 64-bit
3932 relocation format is non-standard. */
3933 if (ABI_64_P (output_bfd))
3934 {
3935 (*get_elf_backend_data (output_bfd)->s->swap_reloc_out)
3936 (output_bfd, &outrel[0],
3937 (sreloc->contents
3938 + sreloc->reloc_count * sizeof (Elf64_Mips_External_Rel)));
3939 }
3940 else
947216bf
AM
3941 bfd_elf32_swap_reloc_out
3942 (output_bfd, &outrel[0],
3943 (sreloc->contents + sreloc->reloc_count * sizeof (Elf32_External_Rel)));
b49e97c9 3944
b49e97c9
TS
3945 /* We've now added another relocation. */
3946 ++sreloc->reloc_count;
3947
3948 /* Make sure the output section is writable. The dynamic linker
3949 will be writing to it. */
3950 elf_section_data (input_section->output_section)->this_hdr.sh_flags
3951 |= SHF_WRITE;
3952
3953 /* On IRIX5, make an entry of compact relocation info. */
3954 if (! skip && IRIX_COMPAT (output_bfd) == ict_irix5)
3955 {
3956 asection *scpt = bfd_get_section_by_name (dynobj, ".compact_rel");
3957 bfd_byte *cr;
3958
3959 if (scpt)
3960 {
3961 Elf32_crinfo cptrel;
3962
3963 mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG);
3964 cptrel.vaddr = (rel->r_offset
3965 + input_section->output_section->vma
3966 + input_section->output_offset);
3967 if (r_type == R_MIPS_REL32)
3968 mips_elf_set_cr_type (cptrel, CRT_MIPS_REL32);
3969 else
3970 mips_elf_set_cr_type (cptrel, CRT_MIPS_WORD);
3971 mips_elf_set_cr_dist2to (cptrel, 0);
3972 cptrel.konst = *addendp;
3973
3974 cr = (scpt->contents
3975 + sizeof (Elf32_External_compact_rel));
3976 bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
3977 ((Elf32_External_crinfo *) cr
3978 + scpt->reloc_count));
3979 ++scpt->reloc_count;
3980 }
3981 }
3982
b34976b6 3983 return TRUE;
b49e97c9
TS
3984}
3985\f
b49e97c9
TS
3986/* Return the MACH for a MIPS e_flags value. */
3987
3988unsigned long
3989_bfd_elf_mips_mach (flags)
3990 flagword flags;
3991{
3992 switch (flags & EF_MIPS_MACH)
3993 {
3994 case E_MIPS_MACH_3900:
3995 return bfd_mach_mips3900;
3996
3997 case E_MIPS_MACH_4010:
3998 return bfd_mach_mips4010;
3999
4000 case E_MIPS_MACH_4100:
4001 return bfd_mach_mips4100;
4002
4003 case E_MIPS_MACH_4111:
4004 return bfd_mach_mips4111;
4005
00707a0e
RS
4006 case E_MIPS_MACH_4120:
4007 return bfd_mach_mips4120;
4008
b49e97c9
TS
4009 case E_MIPS_MACH_4650:
4010 return bfd_mach_mips4650;
4011
00707a0e
RS
4012 case E_MIPS_MACH_5400:
4013 return bfd_mach_mips5400;
4014
4015 case E_MIPS_MACH_5500:
4016 return bfd_mach_mips5500;
4017
b49e97c9
TS
4018 case E_MIPS_MACH_SB1:
4019 return bfd_mach_mips_sb1;
4020
4021 default:
4022 switch (flags & EF_MIPS_ARCH)
4023 {
4024 default:
4025 case E_MIPS_ARCH_1:
4026 return bfd_mach_mips3000;
4027 break;
4028
4029 case E_MIPS_ARCH_2:
4030 return bfd_mach_mips6000;
4031 break;
4032
4033 case E_MIPS_ARCH_3:
4034 return bfd_mach_mips4000;
4035 break;
4036
4037 case E_MIPS_ARCH_4:
4038 return bfd_mach_mips8000;
4039 break;
4040
4041 case E_MIPS_ARCH_5:
4042 return bfd_mach_mips5;
4043 break;
4044
4045 case E_MIPS_ARCH_32:
4046 return bfd_mach_mipsisa32;
4047 break;
4048
4049 case E_MIPS_ARCH_64:
4050 return bfd_mach_mipsisa64;
4051 break;
af7ee8bf
CD
4052
4053 case E_MIPS_ARCH_32R2:
4054 return bfd_mach_mipsisa32r2;
4055 break;
b49e97c9
TS
4056 }
4057 }
4058
4059 return 0;
4060}
4061
4062/* Return printable name for ABI. */
4063
4064static INLINE char *
4065elf_mips_abi_name (abfd)
4066 bfd *abfd;
4067{
4068 flagword flags;
4069
4070 flags = elf_elfheader (abfd)->e_flags;
4071 switch (flags & EF_MIPS_ABI)
4072 {
4073 case 0:
4074 if (ABI_N32_P (abfd))
4075 return "N32";
4076 else if (ABI_64_P (abfd))
4077 return "64";
4078 else
4079 return "none";
4080 case E_MIPS_ABI_O32:
4081 return "O32";
4082 case E_MIPS_ABI_O64:
4083 return "O64";
4084 case E_MIPS_ABI_EABI32:
4085 return "EABI32";
4086 case E_MIPS_ABI_EABI64:
4087 return "EABI64";
4088 default:
4089 return "unknown abi";
4090 }
4091}
4092\f
4093/* MIPS ELF uses two common sections. One is the usual one, and the
4094 other is for small objects. All the small objects are kept
4095 together, and then referenced via the gp pointer, which yields
4096 faster assembler code. This is what we use for the small common
4097 section. This approach is copied from ecoff.c. */
4098static asection mips_elf_scom_section;
4099static asymbol mips_elf_scom_symbol;
4100static asymbol *mips_elf_scom_symbol_ptr;
4101
4102/* MIPS ELF also uses an acommon section, which represents an
4103 allocated common symbol which may be overridden by a
4104 definition in a shared library. */
4105static asection mips_elf_acom_section;
4106static asymbol mips_elf_acom_symbol;
4107static asymbol *mips_elf_acom_symbol_ptr;
4108
4109/* Handle the special MIPS section numbers that a symbol may use.
4110 This is used for both the 32-bit and the 64-bit ABI. */
4111
4112void
4113_bfd_mips_elf_symbol_processing (abfd, asym)
4114 bfd *abfd;
4115 asymbol *asym;
4116{
4117 elf_symbol_type *elfsym;
4118
4119 elfsym = (elf_symbol_type *) asym;
4120 switch (elfsym->internal_elf_sym.st_shndx)
4121 {
4122 case SHN_MIPS_ACOMMON:
4123 /* This section is used in a dynamically linked executable file.
4124 It is an allocated common section. The dynamic linker can
4125 either resolve these symbols to something in a shared
4126 library, or it can just leave them here. For our purposes,
4127 we can consider these symbols to be in a new section. */
4128 if (mips_elf_acom_section.name == NULL)
4129 {
4130 /* Initialize the acommon section. */
4131 mips_elf_acom_section.name = ".acommon";
4132 mips_elf_acom_section.flags = SEC_ALLOC;
4133 mips_elf_acom_section.output_section = &mips_elf_acom_section;
4134 mips_elf_acom_section.symbol = &mips_elf_acom_symbol;
4135 mips_elf_acom_section.symbol_ptr_ptr = &mips_elf_acom_symbol_ptr;
4136 mips_elf_acom_symbol.name = ".acommon";
4137 mips_elf_acom_symbol.flags = BSF_SECTION_SYM;
4138 mips_elf_acom_symbol.section = &mips_elf_acom_section;
4139 mips_elf_acom_symbol_ptr = &mips_elf_acom_symbol;
4140 }
4141 asym->section = &mips_elf_acom_section;
4142 break;
4143
4144 case SHN_COMMON:
4145 /* Common symbols less than the GP size are automatically
4146 treated as SHN_MIPS_SCOMMON symbols on IRIX5. */
4147 if (asym->value > elf_gp_size (abfd)
4148 || IRIX_COMPAT (abfd) == ict_irix6)
4149 break;
4150 /* Fall through. */
4151 case SHN_MIPS_SCOMMON:
4152 if (mips_elf_scom_section.name == NULL)
4153 {
4154 /* Initialize the small common section. */
4155 mips_elf_scom_section.name = ".scommon";
4156 mips_elf_scom_section.flags = SEC_IS_COMMON;
4157 mips_elf_scom_section.output_section = &mips_elf_scom_section;
4158 mips_elf_scom_section.symbol = &mips_elf_scom_symbol;
4159 mips_elf_scom_section.symbol_ptr_ptr = &mips_elf_scom_symbol_ptr;
4160 mips_elf_scom_symbol.name = ".scommon";
4161 mips_elf_scom_symbol.flags = BSF_SECTION_SYM;
4162 mips_elf_scom_symbol.section = &mips_elf_scom_section;
4163 mips_elf_scom_symbol_ptr = &mips_elf_scom_symbol;
4164 }
4165 asym->section = &mips_elf_scom_section;
4166 asym->value = elfsym->internal_elf_sym.st_size;
4167 break;
4168
4169 case SHN_MIPS_SUNDEFINED:
4170 asym->section = bfd_und_section_ptr;
4171 break;
4172
4173#if 0 /* for SGI_COMPAT */
4174 case SHN_MIPS_TEXT:
4175 asym->section = mips_elf_text_section_ptr;
4176 break;
4177
4178 case SHN_MIPS_DATA:
4179 asym->section = mips_elf_data_section_ptr;
4180 break;
4181#endif
4182 }
4183}
4184\f
4185/* Work over a section just before writing it out. This routine is
4186 used by both the 32-bit and the 64-bit ABI. FIXME: We recognize
4187 sections that need the SHF_MIPS_GPREL flag by name; there has to be
4188 a better way. */
4189
b34976b6 4190bfd_boolean
b49e97c9
TS
4191_bfd_mips_elf_section_processing (abfd, hdr)
4192 bfd *abfd;
4193 Elf_Internal_Shdr *hdr;
4194{
4195 if (hdr->sh_type == SHT_MIPS_REGINFO
4196 && hdr->sh_size > 0)
4197 {
4198 bfd_byte buf[4];
4199
4200 BFD_ASSERT (hdr->sh_size == sizeof (Elf32_External_RegInfo));
4201 BFD_ASSERT (hdr->contents == NULL);
4202
4203 if (bfd_seek (abfd,
4204 hdr->sh_offset + sizeof (Elf32_External_RegInfo) - 4,
4205 SEEK_SET) != 0)
b34976b6 4206 return FALSE;
b49e97c9
TS
4207 H_PUT_32 (abfd, elf_gp (abfd), buf);
4208 if (bfd_bwrite (buf, (bfd_size_type) 4, abfd) != 4)
b34976b6 4209 return FALSE;
b49e97c9
TS
4210 }
4211
4212 if (hdr->sh_type == SHT_MIPS_OPTIONS
4213 && hdr->bfd_section != NULL
f0abc2a1
AM
4214 && mips_elf_section_data (hdr->bfd_section) != NULL
4215 && mips_elf_section_data (hdr->bfd_section)->u.tdata != NULL)
b49e97c9
TS
4216 {
4217 bfd_byte *contents, *l, *lend;
4218
f0abc2a1
AM
4219 /* We stored the section contents in the tdata field in the
4220 set_section_contents routine. We save the section contents
4221 so that we don't have to read them again.
b49e97c9
TS
4222 At this point we know that elf_gp is set, so we can look
4223 through the section contents to see if there is an
4224 ODK_REGINFO structure. */
4225
f0abc2a1 4226 contents = mips_elf_section_data (hdr->bfd_section)->u.tdata;
b49e97c9
TS
4227 l = contents;
4228 lend = contents + hdr->sh_size;
4229 while (l + sizeof (Elf_External_Options) <= lend)
4230 {
4231 Elf_Internal_Options intopt;
4232
4233 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
4234 &intopt);
4235 if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
4236 {
4237 bfd_byte buf[8];
4238
4239 if (bfd_seek (abfd,
4240 (hdr->sh_offset
4241 + (l - contents)
4242 + sizeof (Elf_External_Options)
4243 + (sizeof (Elf64_External_RegInfo) - 8)),
4244 SEEK_SET) != 0)
b34976b6 4245 return FALSE;
b49e97c9
TS
4246 H_PUT_64 (abfd, elf_gp (abfd), buf);
4247 if (bfd_bwrite (buf, (bfd_size_type) 8, abfd) != 8)
b34976b6 4248 return FALSE;
b49e97c9
TS
4249 }
4250 else if (intopt.kind == ODK_REGINFO)
4251 {
4252 bfd_byte buf[4];
4253
4254 if (bfd_seek (abfd,
4255 (hdr->sh_offset
4256 + (l - contents)
4257 + sizeof (Elf_External_Options)
4258 + (sizeof (Elf32_External_RegInfo) - 4)),
4259 SEEK_SET) != 0)
b34976b6 4260 return FALSE;
b49e97c9
TS
4261 H_PUT_32 (abfd, elf_gp (abfd), buf);
4262 if (bfd_bwrite (buf, (bfd_size_type) 4, abfd) != 4)
b34976b6 4263 return FALSE;
b49e97c9
TS
4264 }
4265 l += intopt.size;
4266 }
4267 }
4268
4269 if (hdr->bfd_section != NULL)
4270 {
4271 const char *name = bfd_get_section_name (abfd, hdr->bfd_section);
4272
4273 if (strcmp (name, ".sdata") == 0
4274 || strcmp (name, ".lit8") == 0
4275 || strcmp (name, ".lit4") == 0)
4276 {
4277 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
4278 hdr->sh_type = SHT_PROGBITS;
4279 }
4280 else if (strcmp (name, ".sbss") == 0)
4281 {
4282 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
4283 hdr->sh_type = SHT_NOBITS;
4284 }
4285 else if (strcmp (name, ".srdata") == 0)
4286 {
4287 hdr->sh_flags |= SHF_ALLOC | SHF_MIPS_GPREL;
4288 hdr->sh_type = SHT_PROGBITS;
4289 }
4290 else if (strcmp (name, ".compact_rel") == 0)
4291 {
4292 hdr->sh_flags = 0;
4293 hdr->sh_type = SHT_PROGBITS;
4294 }
4295 else if (strcmp (name, ".rtproc") == 0)
4296 {
4297 if (hdr->sh_addralign != 0 && hdr->sh_entsize == 0)
4298 {
4299 unsigned int adjust;
4300
4301 adjust = hdr->sh_size % hdr->sh_addralign;
4302 if (adjust != 0)
4303 hdr->sh_size += hdr->sh_addralign - adjust;
4304 }
4305 }
4306 }
4307
b34976b6 4308 return TRUE;
b49e97c9
TS
4309}
4310
4311/* Handle a MIPS specific section when reading an object file. This
4312 is called when elfcode.h finds a section with an unknown type.
4313 This routine supports both the 32-bit and 64-bit ELF ABI.
4314
4315 FIXME: We need to handle the SHF_MIPS_GPREL flag, but I'm not sure
4316 how to. */
4317
b34976b6 4318bfd_boolean
b49e97c9
TS
4319_bfd_mips_elf_section_from_shdr (abfd, hdr, name)
4320 bfd *abfd;
4321 Elf_Internal_Shdr *hdr;
90937f86 4322 const char *name;
b49e97c9
TS
4323{
4324 flagword flags = 0;
4325
4326 /* There ought to be a place to keep ELF backend specific flags, but
4327 at the moment there isn't one. We just keep track of the
4328 sections by their name, instead. Fortunately, the ABI gives
4329 suggested names for all the MIPS specific sections, so we will
4330 probably get away with this. */
4331 switch (hdr->sh_type)
4332 {
4333 case SHT_MIPS_LIBLIST:
4334 if (strcmp (name, ".liblist") != 0)
b34976b6 4335 return FALSE;
b49e97c9
TS
4336 break;
4337 case SHT_MIPS_MSYM:
4338 if (strcmp (name, ".msym") != 0)
b34976b6 4339 return FALSE;
b49e97c9
TS
4340 break;
4341 case SHT_MIPS_CONFLICT:
4342 if (strcmp (name, ".conflict") != 0)
b34976b6 4343 return FALSE;
b49e97c9
TS
4344 break;
4345 case SHT_MIPS_GPTAB:
4346 if (strncmp (name, ".gptab.", sizeof ".gptab." - 1) != 0)
b34976b6 4347 return FALSE;
b49e97c9
TS
4348 break;
4349 case SHT_MIPS_UCODE:
4350 if (strcmp (name, ".ucode") != 0)
b34976b6 4351 return FALSE;
b49e97c9
TS
4352 break;
4353 case SHT_MIPS_DEBUG:
4354 if (strcmp (name, ".mdebug") != 0)
b34976b6 4355 return FALSE;
b49e97c9
TS
4356 flags = SEC_DEBUGGING;
4357 break;
4358 case SHT_MIPS_REGINFO:
4359 if (strcmp (name, ".reginfo") != 0
4360 || hdr->sh_size != sizeof (Elf32_External_RegInfo))
b34976b6 4361 return FALSE;
b49e97c9
TS
4362 flags = (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_SAME_SIZE);
4363 break;
4364 case SHT_MIPS_IFACE:
4365 if (strcmp (name, ".MIPS.interfaces") != 0)
b34976b6 4366 return FALSE;
b49e97c9
TS
4367 break;
4368 case SHT_MIPS_CONTENT:
4369 if (strncmp (name, ".MIPS.content", sizeof ".MIPS.content" - 1) != 0)
b34976b6 4370 return FALSE;
b49e97c9
TS
4371 break;
4372 case SHT_MIPS_OPTIONS:
4373 if (strcmp (name, MIPS_ELF_OPTIONS_SECTION_NAME (abfd)) != 0)
b34976b6 4374 return FALSE;
b49e97c9
TS
4375 break;
4376 case SHT_MIPS_DWARF:
4377 if (strncmp (name, ".debug_", sizeof ".debug_" - 1) != 0)
b34976b6 4378 return FALSE;
b49e97c9
TS
4379 break;
4380 case SHT_MIPS_SYMBOL_LIB:
4381 if (strcmp (name, ".MIPS.symlib") != 0)
b34976b6 4382 return FALSE;
b49e97c9
TS
4383 break;
4384 case SHT_MIPS_EVENTS:
4385 if (strncmp (name, ".MIPS.events", sizeof ".MIPS.events" - 1) != 0
4386 && strncmp (name, ".MIPS.post_rel",
4387 sizeof ".MIPS.post_rel" - 1) != 0)
b34976b6 4388 return FALSE;
b49e97c9
TS
4389 break;
4390 default:
b34976b6 4391 return FALSE;
b49e97c9
TS
4392 }
4393
4394 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
b34976b6 4395 return FALSE;
b49e97c9
TS
4396
4397 if (flags)
4398 {
4399 if (! bfd_set_section_flags (abfd, hdr->bfd_section,
4400 (bfd_get_section_flags (abfd,
4401 hdr->bfd_section)
4402 | flags)))
b34976b6 4403 return FALSE;
b49e97c9
TS
4404 }
4405
4406 /* FIXME: We should record sh_info for a .gptab section. */
4407
4408 /* For a .reginfo section, set the gp value in the tdata information
4409 from the contents of this section. We need the gp value while
4410 processing relocs, so we just get it now. The .reginfo section
4411 is not used in the 64-bit MIPS ELF ABI. */
4412 if (hdr->sh_type == SHT_MIPS_REGINFO)
4413 {
4414 Elf32_External_RegInfo ext;
4415 Elf32_RegInfo s;
4416
4417 if (! bfd_get_section_contents (abfd, hdr->bfd_section, (PTR) &ext,
4418 (file_ptr) 0,
4419 (bfd_size_type) sizeof ext))
b34976b6 4420 return FALSE;
b49e97c9
TS
4421 bfd_mips_elf32_swap_reginfo_in (abfd, &ext, &s);
4422 elf_gp (abfd) = s.ri_gp_value;
4423 }
4424
4425 /* For a SHT_MIPS_OPTIONS section, look for a ODK_REGINFO entry, and
4426 set the gp value based on what we find. We may see both
4427 SHT_MIPS_REGINFO and SHT_MIPS_OPTIONS/ODK_REGINFO; in that case,
4428 they should agree. */
4429 if (hdr->sh_type == SHT_MIPS_OPTIONS)
4430 {
4431 bfd_byte *contents, *l, *lend;
4432
4433 contents = (bfd_byte *) bfd_malloc (hdr->sh_size);
4434 if (contents == NULL)
b34976b6 4435 return FALSE;
b49e97c9
TS
4436 if (! bfd_get_section_contents (abfd, hdr->bfd_section, contents,
4437 (file_ptr) 0, hdr->sh_size))
4438 {
4439 free (contents);
b34976b6 4440 return FALSE;
b49e97c9
TS
4441 }
4442 l = contents;
4443 lend = contents + hdr->sh_size;
4444 while (l + sizeof (Elf_External_Options) <= lend)
4445 {
4446 Elf_Internal_Options intopt;
4447
4448 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
4449 &intopt);
4450 if (ABI_64_P (abfd) && intopt.kind == ODK_REGINFO)
4451 {
4452 Elf64_Internal_RegInfo intreg;
4453
4454 bfd_mips_elf64_swap_reginfo_in
4455 (abfd,
4456 ((Elf64_External_RegInfo *)
4457 (l + sizeof (Elf_External_Options))),
4458 &intreg);
4459 elf_gp (abfd) = intreg.ri_gp_value;
4460 }
4461 else if (intopt.kind == ODK_REGINFO)
4462 {
4463 Elf32_RegInfo intreg;
4464
4465 bfd_mips_elf32_swap_reginfo_in
4466 (abfd,
4467 ((Elf32_External_RegInfo *)
4468 (l + sizeof (Elf_External_Options))),
4469 &intreg);
4470 elf_gp (abfd) = intreg.ri_gp_value;
4471 }
4472 l += intopt.size;
4473 }
4474 free (contents);
4475 }
4476
b34976b6 4477 return TRUE;
b49e97c9
TS
4478}
4479
4480/* Set the correct type for a MIPS ELF section. We do this by the
4481 section name, which is a hack, but ought to work. This routine is
4482 used by both the 32-bit and the 64-bit ABI. */
4483
b34976b6 4484bfd_boolean
b49e97c9
TS
4485_bfd_mips_elf_fake_sections (abfd, hdr, sec)
4486 bfd *abfd;
947216bf 4487 Elf_Internal_Shdr *hdr;
b49e97c9
TS
4488 asection *sec;
4489{
4490 register const char *name;
4491
4492 name = bfd_get_section_name (abfd, sec);
4493
4494 if (strcmp (name, ".liblist") == 0)
4495 {
4496 hdr->sh_type = SHT_MIPS_LIBLIST;
4497 hdr->sh_info = sec->_raw_size / sizeof (Elf32_Lib);
4498 /* The sh_link field is set in final_write_processing. */
4499 }
4500 else if (strcmp (name, ".conflict") == 0)
4501 hdr->sh_type = SHT_MIPS_CONFLICT;
4502 else if (strncmp (name, ".gptab.", sizeof ".gptab." - 1) == 0)
4503 {
4504 hdr->sh_type = SHT_MIPS_GPTAB;
4505 hdr->sh_entsize = sizeof (Elf32_External_gptab);
4506 /* The sh_info field is set in final_write_processing. */
4507 }
4508 else if (strcmp (name, ".ucode") == 0)
4509 hdr->sh_type = SHT_MIPS_UCODE;
4510 else if (strcmp (name, ".mdebug") == 0)
4511 {
4512 hdr->sh_type = SHT_MIPS_DEBUG;
8dc1a139 4513 /* In a shared object on IRIX 5.3, the .mdebug section has an
b49e97c9
TS
4514 entsize of 0. FIXME: Does this matter? */
4515 if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0)
4516 hdr->sh_entsize = 0;
4517 else
4518 hdr->sh_entsize = 1;
4519 }
4520 else if (strcmp (name, ".reginfo") == 0)
4521 {
4522 hdr->sh_type = SHT_MIPS_REGINFO;
8dc1a139 4523 /* In a shared object on IRIX 5.3, the .reginfo section has an
b49e97c9
TS
4524 entsize of 0x18. FIXME: Does this matter? */
4525 if (SGI_COMPAT (abfd))
4526 {
4527 if ((abfd->flags & DYNAMIC) != 0)
4528 hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
4529 else
4530 hdr->sh_entsize = 1;
4531 }
4532 else
4533 hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
4534 }
4535 else if (SGI_COMPAT (abfd)
4536 && (strcmp (name, ".hash") == 0
4537 || strcmp (name, ".dynamic") == 0
4538 || strcmp (name, ".dynstr") == 0))
4539 {
4540 if (SGI_COMPAT (abfd))
4541 hdr->sh_entsize = 0;
4542#if 0
8dc1a139 4543 /* This isn't how the IRIX6 linker behaves. */
b49e97c9
TS
4544 hdr->sh_info = SIZEOF_MIPS_DYNSYM_SECNAMES;
4545#endif
4546 }
4547 else if (strcmp (name, ".got") == 0
4548 || strcmp (name, ".srdata") == 0
4549 || strcmp (name, ".sdata") == 0
4550 || strcmp (name, ".sbss") == 0
4551 || strcmp (name, ".lit4") == 0
4552 || strcmp (name, ".lit8") == 0)
4553 hdr->sh_flags |= SHF_MIPS_GPREL;
4554 else if (strcmp (name, ".MIPS.interfaces") == 0)
4555 {
4556 hdr->sh_type = SHT_MIPS_IFACE;
4557 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
4558 }
4559 else if (strncmp (name, ".MIPS.content", strlen (".MIPS.content")) == 0)
4560 {
4561 hdr->sh_type = SHT_MIPS_CONTENT;
4562 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
4563 /* The sh_info field is set in final_write_processing. */
4564 }
4565 else if (strcmp (name, MIPS_ELF_OPTIONS_SECTION_NAME (abfd)) == 0)
4566 {
4567 hdr->sh_type = SHT_MIPS_OPTIONS;
4568 hdr->sh_entsize = 1;
4569 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
4570 }
4571 else if (strncmp (name, ".debug_", sizeof ".debug_" - 1) == 0)
4572 hdr->sh_type = SHT_MIPS_DWARF;
4573 else if (strcmp (name, ".MIPS.symlib") == 0)
4574 {
4575 hdr->sh_type = SHT_MIPS_SYMBOL_LIB;
4576 /* The sh_link and sh_info fields are set in
4577 final_write_processing. */
4578 }
4579 else if (strncmp (name, ".MIPS.events", sizeof ".MIPS.events" - 1) == 0
4580 || strncmp (name, ".MIPS.post_rel",
4581 sizeof ".MIPS.post_rel" - 1) == 0)
4582 {
4583 hdr->sh_type = SHT_MIPS_EVENTS;
4584 hdr->sh_flags |= SHF_MIPS_NOSTRIP;
4585 /* The sh_link field is set in final_write_processing. */
4586 }
4587 else if (strcmp (name, ".msym") == 0)
4588 {
4589 hdr->sh_type = SHT_MIPS_MSYM;
4590 hdr->sh_flags |= SHF_ALLOC;
4591 hdr->sh_entsize = 8;
4592 }
4593
7a79a000
TS
4594 /* The generic elf_fake_sections will set up REL_HDR using the default
4595 kind of relocations. We used to set up a second header for the
4596 non-default kind of relocations here, but only NewABI would use
4597 these, and the IRIX ld doesn't like resulting empty RELA sections.
4598 Thus we create those header only on demand now. */
b49e97c9 4599
b34976b6 4600 return TRUE;
b49e97c9
TS
4601}
4602
4603/* Given a BFD section, try to locate the corresponding ELF section
4604 index. This is used by both the 32-bit and the 64-bit ABI.
4605 Actually, it's not clear to me that the 64-bit ABI supports these,
4606 but for non-PIC objects we will certainly want support for at least
4607 the .scommon section. */
4608
b34976b6 4609bfd_boolean
b49e97c9
TS
4610_bfd_mips_elf_section_from_bfd_section (abfd, sec, retval)
4611 bfd *abfd ATTRIBUTE_UNUSED;
4612 asection *sec;
4613 int *retval;
4614{
4615 if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
4616 {
4617 *retval = SHN_MIPS_SCOMMON;
b34976b6 4618 return TRUE;
b49e97c9
TS
4619 }
4620 if (strcmp (bfd_get_section_name (abfd, sec), ".acommon") == 0)
4621 {
4622 *retval = SHN_MIPS_ACOMMON;
b34976b6 4623 return TRUE;
b49e97c9 4624 }
b34976b6 4625 return FALSE;
b49e97c9
TS
4626}
4627\f
4628/* Hook called by the linker routine which adds symbols from an object
4629 file. We must handle the special MIPS section numbers here. */
4630
b34976b6 4631bfd_boolean
b49e97c9
TS
4632_bfd_mips_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
4633 bfd *abfd;
4634 struct bfd_link_info *info;
4635 const Elf_Internal_Sym *sym;
4636 const char **namep;
4637 flagword *flagsp ATTRIBUTE_UNUSED;
4638 asection **secp;
4639 bfd_vma *valp;
4640{
4641 if (SGI_COMPAT (abfd)
4642 && (abfd->flags & DYNAMIC) != 0
4643 && strcmp (*namep, "_rld_new_interface") == 0)
4644 {
8dc1a139 4645 /* Skip IRIX5 rld entry name. */
b49e97c9 4646 *namep = NULL;
b34976b6 4647 return TRUE;
b49e97c9
TS
4648 }
4649
4650 switch (sym->st_shndx)
4651 {
4652 case SHN_COMMON:
4653 /* Common symbols less than the GP size are automatically
4654 treated as SHN_MIPS_SCOMMON symbols. */
4655 if (sym->st_size > elf_gp_size (abfd)
4656 || IRIX_COMPAT (abfd) == ict_irix6)
4657 break;
4658 /* Fall through. */
4659 case SHN_MIPS_SCOMMON:
4660 *secp = bfd_make_section_old_way (abfd, ".scommon");
4661 (*secp)->flags |= SEC_IS_COMMON;
4662 *valp = sym->st_size;
4663 break;
4664
4665 case SHN_MIPS_TEXT:
4666 /* This section is used in a shared object. */
4667 if (elf_tdata (abfd)->elf_text_section == NULL)
4668 {
4669 asymbol *elf_text_symbol;
4670 asection *elf_text_section;
4671 bfd_size_type amt = sizeof (asection);
4672
4673 elf_text_section = bfd_zalloc (abfd, amt);
4674 if (elf_text_section == NULL)
b34976b6 4675 return FALSE;
b49e97c9
TS
4676
4677 amt = sizeof (asymbol);
4678 elf_text_symbol = bfd_zalloc (abfd, amt);
4679 if (elf_text_symbol == NULL)
b34976b6 4680 return FALSE;
b49e97c9
TS
4681
4682 /* Initialize the section. */
4683
4684 elf_tdata (abfd)->elf_text_section = elf_text_section;
4685 elf_tdata (abfd)->elf_text_symbol = elf_text_symbol;
4686
4687 elf_text_section->symbol = elf_text_symbol;
4688 elf_text_section->symbol_ptr_ptr = &elf_tdata (abfd)->elf_text_symbol;
4689
4690 elf_text_section->name = ".text";
4691 elf_text_section->flags = SEC_NO_FLAGS;
4692 elf_text_section->output_section = NULL;
4693 elf_text_section->owner = abfd;
4694 elf_text_symbol->name = ".text";
4695 elf_text_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
4696 elf_text_symbol->section = elf_text_section;
4697 }
4698 /* This code used to do *secp = bfd_und_section_ptr if
4699 info->shared. I don't know why, and that doesn't make sense,
4700 so I took it out. */
4701 *secp = elf_tdata (abfd)->elf_text_section;
4702 break;
4703
4704 case SHN_MIPS_ACOMMON:
4705 /* Fall through. XXX Can we treat this as allocated data? */
4706 case SHN_MIPS_DATA:
4707 /* This section is used in a shared object. */
4708 if (elf_tdata (abfd)->elf_data_section == NULL)
4709 {
4710 asymbol *elf_data_symbol;
4711 asection *elf_data_section;
4712 bfd_size_type amt = sizeof (asection);
4713
4714 elf_data_section = bfd_zalloc (abfd, amt);
4715 if (elf_data_section == NULL)
b34976b6 4716 return FALSE;
b49e97c9
TS
4717
4718 amt = sizeof (asymbol);
4719 elf_data_symbol = bfd_zalloc (abfd, amt);
4720 if (elf_data_symbol == NULL)
b34976b6 4721 return FALSE;
b49e97c9
TS
4722
4723 /* Initialize the section. */
4724
4725 elf_tdata (abfd)->elf_data_section = elf_data_section;
4726 elf_tdata (abfd)->elf_data_symbol = elf_data_symbol;
4727
4728 elf_data_section->symbol = elf_data_symbol;
4729 elf_data_section->symbol_ptr_ptr = &elf_tdata (abfd)->elf_data_symbol;
4730
4731 elf_data_section->name = ".data";
4732 elf_data_section->flags = SEC_NO_FLAGS;
4733 elf_data_section->output_section = NULL;
4734 elf_data_section->owner = abfd;
4735 elf_data_symbol->name = ".data";
4736 elf_data_symbol->flags = BSF_SECTION_SYM | BSF_DYNAMIC;
4737 elf_data_symbol->section = elf_data_section;
4738 }
4739 /* This code used to do *secp = bfd_und_section_ptr if
4740 info->shared. I don't know why, and that doesn't make sense,
4741 so I took it out. */
4742 *secp = elf_tdata (abfd)->elf_data_section;
4743 break;
4744
4745 case SHN_MIPS_SUNDEFINED:
4746 *secp = bfd_und_section_ptr;
4747 break;
4748 }
4749
4750 if (SGI_COMPAT (abfd)
4751 && ! info->shared
4752 && info->hash->creator == abfd->xvec
4753 && strcmp (*namep, "__rld_obj_head") == 0)
4754 {
4755 struct elf_link_hash_entry *h;
14a793b2 4756 struct bfd_link_hash_entry *bh;
b49e97c9
TS
4757
4758 /* Mark __rld_obj_head as dynamic. */
14a793b2 4759 bh = NULL;
b49e97c9
TS
4760 if (! (_bfd_generic_link_add_one_symbol
4761 (info, abfd, *namep, BSF_GLOBAL, *secp,
b34976b6 4762 (bfd_vma) *valp, (const char *) NULL, FALSE,
14a793b2 4763 get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 4764 return FALSE;
14a793b2
AM
4765
4766 h = (struct elf_link_hash_entry *) bh;
b49e97c9
TS
4767 h->elf_link_hash_flags &= ~ELF_LINK_NON_ELF;
4768 h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
4769 h->type = STT_OBJECT;
4770
4771 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
b34976b6 4772 return FALSE;
b49e97c9 4773
b34976b6 4774 mips_elf_hash_table (info)->use_rld_obj_head = TRUE;
b49e97c9
TS
4775 }
4776
4777 /* If this is a mips16 text symbol, add 1 to the value to make it
4778 odd. This will cause something like .word SYM to come up with
4779 the right value when it is loaded into the PC. */
4780 if (sym->st_other == STO_MIPS16)
4781 ++*valp;
4782
b34976b6 4783 return TRUE;
b49e97c9
TS
4784}
4785
4786/* This hook function is called before the linker writes out a global
4787 symbol. We mark symbols as small common if appropriate. This is
4788 also where we undo the increment of the value for a mips16 symbol. */
4789
b34976b6 4790bfd_boolean
b49e97c9
TS
4791_bfd_mips_elf_link_output_symbol_hook (abfd, info, name, sym, input_sec)
4792 bfd *abfd ATTRIBUTE_UNUSED;
4793 struct bfd_link_info *info ATTRIBUTE_UNUSED;
4794 const char *name ATTRIBUTE_UNUSED;
4795 Elf_Internal_Sym *sym;
4796 asection *input_sec;
4797{
4798 /* If we see a common symbol, which implies a relocatable link, then
4799 if a symbol was small common in an input file, mark it as small
4800 common in the output file. */
4801 if (sym->st_shndx == SHN_COMMON
4802 && strcmp (input_sec->name, ".scommon") == 0)
4803 sym->st_shndx = SHN_MIPS_SCOMMON;
4804
4805 if (sym->st_other == STO_MIPS16
4806 && (sym->st_value & 1) != 0)
4807 --sym->st_value;
4808
b34976b6 4809 return TRUE;
b49e97c9
TS
4810}
4811\f
4812/* Functions for the dynamic linker. */
4813
4814/* Create dynamic sections when linking against a dynamic object. */
4815
b34976b6 4816bfd_boolean
b49e97c9
TS
4817_bfd_mips_elf_create_dynamic_sections (abfd, info)
4818 bfd *abfd;
4819 struct bfd_link_info *info;
4820{
4821 struct elf_link_hash_entry *h;
14a793b2 4822 struct bfd_link_hash_entry *bh;
b49e97c9
TS
4823 flagword flags;
4824 register asection *s;
4825 const char * const *namep;
4826
4827 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4828 | SEC_LINKER_CREATED | SEC_READONLY);
4829
4830 /* Mips ABI requests the .dynamic section to be read only. */
4831 s = bfd_get_section_by_name (abfd, ".dynamic");
4832 if (s != NULL)
4833 {
4834 if (! bfd_set_section_flags (abfd, s, flags))
b34976b6 4835 return FALSE;
b49e97c9
TS
4836 }
4837
4838 /* We need to create .got section. */
f4416af6
AO
4839 if (! mips_elf_create_got_section (abfd, info, FALSE))
4840 return FALSE;
4841
4842 if (! mips_elf_rel_dyn_section (elf_hash_table (info)->dynobj, TRUE))
b34976b6 4843 return FALSE;
b49e97c9 4844
b49e97c9
TS
4845 /* Create .stub section. */
4846 if (bfd_get_section_by_name (abfd,
4847 MIPS_ELF_STUB_SECTION_NAME (abfd)) == NULL)
4848 {
4849 s = bfd_make_section (abfd, MIPS_ELF_STUB_SECTION_NAME (abfd));
4850 if (s == NULL
4851 || ! bfd_set_section_flags (abfd, s, flags | SEC_CODE)
4852 || ! bfd_set_section_alignment (abfd, s,
4853 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
b34976b6 4854 return FALSE;
b49e97c9
TS
4855 }
4856
4857 if ((IRIX_COMPAT (abfd) == ict_irix5 || IRIX_COMPAT (abfd) == ict_none)
4858 && !info->shared
4859 && bfd_get_section_by_name (abfd, ".rld_map") == NULL)
4860 {
4861 s = bfd_make_section (abfd, ".rld_map");
4862 if (s == NULL
4863 || ! bfd_set_section_flags (abfd, s, flags &~ (flagword) SEC_READONLY)
4864 || ! bfd_set_section_alignment (abfd, s,
4865 MIPS_ELF_LOG_FILE_ALIGN (abfd)))
b34976b6 4866 return FALSE;
b49e97c9
TS
4867 }
4868
4869 /* On IRIX5, we adjust add some additional symbols and change the
4870 alignments of several sections. There is no ABI documentation
4871 indicating that this is necessary on IRIX6, nor any evidence that
4872 the linker takes such action. */
4873 if (IRIX_COMPAT (abfd) == ict_irix5)
4874 {
4875 for (namep = mips_elf_dynsym_rtproc_names; *namep != NULL; namep++)
4876 {
14a793b2 4877 bh = NULL;
b49e97c9
TS
4878 if (! (_bfd_generic_link_add_one_symbol
4879 (info, abfd, *namep, BSF_GLOBAL, bfd_und_section_ptr,
b34976b6 4880 (bfd_vma) 0, (const char *) NULL, FALSE,
14a793b2 4881 get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 4882 return FALSE;
14a793b2
AM
4883
4884 h = (struct elf_link_hash_entry *) bh;
b49e97c9
TS
4885 h->elf_link_hash_flags &= ~ELF_LINK_NON_ELF;
4886 h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
4887 h->type = STT_SECTION;
4888
4889 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
b34976b6 4890 return FALSE;
b49e97c9
TS
4891 }
4892
4893 /* We need to create a .compact_rel section. */
4894 if (SGI_COMPAT (abfd))
4895 {
4896 if (!mips_elf_create_compact_rel_section (abfd, info))
b34976b6 4897 return FALSE;
b49e97c9
TS
4898 }
4899
44c410de 4900 /* Change alignments of some sections. */
b49e97c9
TS
4901 s = bfd_get_section_by_name (abfd, ".hash");
4902 if (s != NULL)
d80dcc6a 4903 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
b49e97c9
TS
4904 s = bfd_get_section_by_name (abfd, ".dynsym");
4905 if (s != NULL)
d80dcc6a 4906 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
b49e97c9
TS
4907 s = bfd_get_section_by_name (abfd, ".dynstr");
4908 if (s != NULL)
d80dcc6a 4909 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
b49e97c9
TS
4910 s = bfd_get_section_by_name (abfd, ".reginfo");
4911 if (s != NULL)
d80dcc6a 4912 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
b49e97c9
TS
4913 s = bfd_get_section_by_name (abfd, ".dynamic");
4914 if (s != NULL)
d80dcc6a 4915 bfd_set_section_alignment (abfd, s, MIPS_ELF_LOG_FILE_ALIGN (abfd));
b49e97c9
TS
4916 }
4917
4918 if (!info->shared)
4919 {
14a793b2
AM
4920 const char *name;
4921
4922 name = SGI_COMPAT (abfd) ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING";
4923 bh = NULL;
4924 if (!(_bfd_generic_link_add_one_symbol
4925 (info, abfd, name, BSF_GLOBAL, bfd_abs_section_ptr,
b34976b6 4926 (bfd_vma) 0, (const char *) NULL, FALSE,
14a793b2 4927 get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 4928 return FALSE;
14a793b2
AM
4929
4930 h = (struct elf_link_hash_entry *) bh;
b49e97c9
TS
4931 h->elf_link_hash_flags &= ~ELF_LINK_NON_ELF;
4932 h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
4933 h->type = STT_SECTION;
4934
4935 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
b34976b6 4936 return FALSE;
b49e97c9
TS
4937
4938 if (! mips_elf_hash_table (info)->use_rld_obj_head)
4939 {
4940 /* __rld_map is a four byte word located in the .data section
4941 and is filled in by the rtld to contain a pointer to
4942 the _r_debug structure. Its symbol value will be set in
4943 _bfd_mips_elf_finish_dynamic_symbol. */
4944 s = bfd_get_section_by_name (abfd, ".rld_map");
4945 BFD_ASSERT (s != NULL);
4946
14a793b2
AM
4947 name = SGI_COMPAT (abfd) ? "__rld_map" : "__RLD_MAP";
4948 bh = NULL;
4949 if (!(_bfd_generic_link_add_one_symbol
4950 (info, abfd, name, BSF_GLOBAL, s,
b34976b6 4951 (bfd_vma) 0, (const char *) NULL, FALSE,
14a793b2 4952 get_elf_backend_data (abfd)->collect, &bh)))
b34976b6 4953 return FALSE;
14a793b2
AM
4954
4955 h = (struct elf_link_hash_entry *) bh;
b49e97c9
TS
4956 h->elf_link_hash_flags &= ~ELF_LINK_NON_ELF;
4957 h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
4958 h->type = STT_OBJECT;
4959
4960 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
b34976b6 4961 return FALSE;
b49e97c9
TS
4962 }
4963 }
4964
b34976b6 4965 return TRUE;
b49e97c9
TS
4966}
4967\f
4968/* Look through the relocs for a section during the first phase, and
4969 allocate space in the global offset table. */
4970
b34976b6 4971bfd_boolean
b49e97c9
TS
4972_bfd_mips_elf_check_relocs (abfd, info, sec, relocs)
4973 bfd *abfd;
4974 struct bfd_link_info *info;
4975 asection *sec;
4976 const Elf_Internal_Rela *relocs;
4977{
4978 const char *name;
4979 bfd *dynobj;
4980 Elf_Internal_Shdr *symtab_hdr;
4981 struct elf_link_hash_entry **sym_hashes;
4982 struct mips_got_info *g;
4983 size_t extsymoff;
4984 const Elf_Internal_Rela *rel;
4985 const Elf_Internal_Rela *rel_end;
4986 asection *sgot;
4987 asection *sreloc;
9c5bfbb7 4988 const struct elf_backend_data *bed;
b49e97c9 4989
1049f94e 4990 if (info->relocatable)
b34976b6 4991 return TRUE;
b49e97c9
TS
4992
4993 dynobj = elf_hash_table (info)->dynobj;
4994 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4995 sym_hashes = elf_sym_hashes (abfd);
4996 extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
4997
4998 /* Check for the mips16 stub sections. */
4999
5000 name = bfd_get_section_name (abfd, sec);
5001 if (strncmp (name, FN_STUB, sizeof FN_STUB - 1) == 0)
5002 {
5003 unsigned long r_symndx;
5004
5005 /* Look at the relocation information to figure out which symbol
5006 this is for. */
5007
5008 r_symndx = ELF_R_SYM (abfd, relocs->r_info);
5009
5010 if (r_symndx < extsymoff
5011 || sym_hashes[r_symndx - extsymoff] == NULL)
5012 {
5013 asection *o;
5014
5015 /* This stub is for a local symbol. This stub will only be
5016 needed if there is some relocation in this BFD, other
5017 than a 16 bit function call, which refers to this symbol. */
5018 for (o = abfd->sections; o != NULL; o = o->next)
5019 {
5020 Elf_Internal_Rela *sec_relocs;
5021 const Elf_Internal_Rela *r, *rend;
5022
5023 /* We can ignore stub sections when looking for relocs. */
5024 if ((o->flags & SEC_RELOC) == 0
5025 || o->reloc_count == 0
5026 || strncmp (bfd_get_section_name (abfd, o), FN_STUB,
5027 sizeof FN_STUB - 1) == 0
5028 || strncmp (bfd_get_section_name (abfd, o), CALL_STUB,
5029 sizeof CALL_STUB - 1) == 0
5030 || strncmp (bfd_get_section_name (abfd, o), CALL_FP_STUB,
5031 sizeof CALL_FP_STUB - 1) == 0)
5032 continue;
5033
45d6a902
AM
5034 sec_relocs
5035 = _bfd_elf_link_read_relocs (abfd, o, (PTR) NULL,
5036 (Elf_Internal_Rela *) NULL,
5037 info->keep_memory);
b49e97c9 5038 if (sec_relocs == NULL)
b34976b6 5039 return FALSE;
b49e97c9
TS
5040
5041 rend = sec_relocs + o->reloc_count;
5042 for (r = sec_relocs; r < rend; r++)
5043 if (ELF_R_SYM (abfd, r->r_info) == r_symndx
5044 && ELF_R_TYPE (abfd, r->r_info) != R_MIPS16_26)
5045 break;
5046
6cdc0ccc 5047 if (elf_section_data (o)->relocs != sec_relocs)
b49e97c9
TS
5048 free (sec_relocs);
5049
5050 if (r < rend)
5051 break;
5052 }
5053
5054 if (o == NULL)
5055 {
5056 /* There is no non-call reloc for this stub, so we do
5057 not need it. Since this function is called before
5058 the linker maps input sections to output sections, we
5059 can easily discard it by setting the SEC_EXCLUDE
5060 flag. */
5061 sec->flags |= SEC_EXCLUDE;
b34976b6 5062 return TRUE;
b49e97c9
TS
5063 }
5064
5065 /* Record this stub in an array of local symbol stubs for
5066 this BFD. */
5067 if (elf_tdata (abfd)->local_stubs == NULL)
5068 {
5069 unsigned long symcount;
5070 asection **n;
5071 bfd_size_type amt;
5072
5073 if (elf_bad_symtab (abfd))
5074 symcount = NUM_SHDR_ENTRIES (symtab_hdr);
5075 else
5076 symcount = symtab_hdr->sh_info;
5077 amt = symcount * sizeof (asection *);
5078 n = (asection **) bfd_zalloc (abfd, amt);
5079 if (n == NULL)
b34976b6 5080 return FALSE;
b49e97c9
TS
5081 elf_tdata (abfd)->local_stubs = n;
5082 }
5083
5084 elf_tdata (abfd)->local_stubs[r_symndx] = sec;
5085
5086 /* We don't need to set mips16_stubs_seen in this case.
5087 That flag is used to see whether we need to look through
5088 the global symbol table for stubs. We don't need to set
5089 it here, because we just have a local stub. */
5090 }
5091 else
5092 {
5093 struct mips_elf_link_hash_entry *h;
5094
5095 h = ((struct mips_elf_link_hash_entry *)
5096 sym_hashes[r_symndx - extsymoff]);
5097
5098 /* H is the symbol this stub is for. */
5099
5100 h->fn_stub = sec;
b34976b6 5101 mips_elf_hash_table (info)->mips16_stubs_seen = TRUE;
b49e97c9
TS
5102 }
5103 }
5104 else if (strncmp (name, CALL_STUB, sizeof CALL_STUB - 1) == 0
5105 || strncmp (name, CALL_FP_STUB, sizeof CALL_FP_STUB - 1) == 0)
5106 {
5107 unsigned long r_symndx;
5108 struct mips_elf_link_hash_entry *h;
5109 asection **loc;
5110
5111 /* Look at the relocation information to figure out which symbol
5112 this is for. */
5113
5114 r_symndx = ELF_R_SYM (abfd, relocs->r_info);
5115
5116 if (r_symndx < extsymoff
5117 || sym_hashes[r_symndx - extsymoff] == NULL)
5118 {
5119 /* This stub was actually built for a static symbol defined
5120 in the same file. We assume that all static symbols in
5121 mips16 code are themselves mips16, so we can simply
5122 discard this stub. Since this function is called before
5123 the linker maps input sections to output sections, we can
5124 easily discard it by setting the SEC_EXCLUDE flag. */
5125 sec->flags |= SEC_EXCLUDE;
b34976b6 5126 return TRUE;
b49e97c9
TS
5127 }
5128
5129 h = ((struct mips_elf_link_hash_entry *)
5130 sym_hashes[r_symndx - extsymoff]);
5131
5132 /* H is the symbol this stub is for. */
5133
5134 if (strncmp (name, CALL_FP_STUB, sizeof CALL_FP_STUB - 1) == 0)
5135 loc = &h->call_fp_stub;
5136 else
5137 loc = &h->call_stub;
5138
5139 /* If we already have an appropriate stub for this function, we
5140 don't need another one, so we can discard this one. Since
5141 this function is called before the linker maps input sections
5142 to output sections, we can easily discard it by setting the
5143 SEC_EXCLUDE flag. We can also discard this section if we
5144 happen to already know that this is a mips16 function; it is
5145 not necessary to check this here, as it is checked later, but
5146 it is slightly faster to check now. */
5147 if (*loc != NULL || h->root.other == STO_MIPS16)
5148 {
5149 sec->flags |= SEC_EXCLUDE;
b34976b6 5150 return TRUE;
b49e97c9
TS
5151 }
5152
5153 *loc = sec;
b34976b6 5154 mips_elf_hash_table (info)->mips16_stubs_seen = TRUE;
b49e97c9
TS
5155 }
5156
5157 if (dynobj == NULL)
5158 {
5159 sgot = NULL;
5160 g = NULL;
5161 }
5162 else
5163 {
f4416af6 5164 sgot = mips_elf_got_section (dynobj, FALSE);
b49e97c9
TS
5165 if (sgot == NULL)
5166 g = NULL;
5167 else
5168 {
f0abc2a1
AM
5169 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
5170 g = mips_elf_section_data (sgot)->u.got_info;
b49e97c9
TS
5171 BFD_ASSERT (g != NULL);
5172 }
5173 }
5174
5175 sreloc = NULL;
5176 bed = get_elf_backend_data (abfd);
5177 rel_end = relocs + sec->reloc_count * bed->s->int_rels_per_ext_rel;
5178 for (rel = relocs; rel < rel_end; ++rel)
5179 {
5180 unsigned long r_symndx;
5181 unsigned int r_type;
5182 struct elf_link_hash_entry *h;
5183
5184 r_symndx = ELF_R_SYM (abfd, rel->r_info);
5185 r_type = ELF_R_TYPE (abfd, rel->r_info);
5186
5187 if (r_symndx < extsymoff)
5188 h = NULL;
5189 else if (r_symndx >= extsymoff + NUM_SHDR_ENTRIES (symtab_hdr))
5190 {
5191 (*_bfd_error_handler)
5192 (_("%s: Malformed reloc detected for section %s"),
5193 bfd_archive_filename (abfd), name);
5194 bfd_set_error (bfd_error_bad_value);
b34976b6 5195 return FALSE;
b49e97c9
TS
5196 }
5197 else
5198 {
5199 h = sym_hashes[r_symndx - extsymoff];
5200
5201 /* This may be an indirect symbol created because of a version. */
5202 if (h != NULL)
5203 {
5204 while (h->root.type == bfd_link_hash_indirect)
5205 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5206 }
5207 }
5208
5209 /* Some relocs require a global offset table. */
5210 if (dynobj == NULL || sgot == NULL)
5211 {
5212 switch (r_type)
5213 {
5214 case R_MIPS_GOT16:
5215 case R_MIPS_CALL16:
5216 case R_MIPS_CALL_HI16:
5217 case R_MIPS_CALL_LO16:
5218 case R_MIPS_GOT_HI16:
5219 case R_MIPS_GOT_LO16:
5220 case R_MIPS_GOT_PAGE:
5221 case R_MIPS_GOT_OFST:
5222 case R_MIPS_GOT_DISP:
5223 if (dynobj == NULL)
5224 elf_hash_table (info)->dynobj = dynobj = abfd;
f4416af6 5225 if (! mips_elf_create_got_section (dynobj, info, FALSE))
b34976b6 5226 return FALSE;
b49e97c9
TS
5227 g = mips_elf_got_info (dynobj, &sgot);
5228 break;
5229
5230 case R_MIPS_32:
5231 case R_MIPS_REL32:
5232 case R_MIPS_64:
5233 if (dynobj == NULL
5234 && (info->shared || h != NULL)
5235 && (sec->flags & SEC_ALLOC) != 0)
5236 elf_hash_table (info)->dynobj = dynobj = abfd;
5237 break;
5238
5239 default:
5240 break;
5241 }
5242 }
5243
5244 if (!h && (r_type == R_MIPS_CALL_LO16
5245 || r_type == R_MIPS_GOT_LO16
5246 || r_type == R_MIPS_GOT_DISP))
5247 {
5248 /* We may need a local GOT entry for this relocation. We
5249 don't count R_MIPS_GOT_PAGE because we can estimate the
5250 maximum number of pages needed by looking at the size of
5251 the segment. Similar comments apply to R_MIPS_GOT16 and
5252 R_MIPS_CALL16. We don't count R_MIPS_GOT_HI16, or
5253 R_MIPS_CALL_HI16 because these are always followed by an
b15e6682 5254 R_MIPS_GOT_LO16 or R_MIPS_CALL_LO16. */
f4416af6
AO
5255 if (! mips_elf_record_local_got_symbol (abfd, r_symndx,
5256 rel->r_addend, g))
5257 return FALSE;
b49e97c9
TS
5258 }
5259
5260 switch (r_type)
5261 {
5262 case R_MIPS_CALL16:
5263 if (h == NULL)
5264 {
5265 (*_bfd_error_handler)
5266 (_("%s: CALL16 reloc at 0x%lx not against global symbol"),
5267 bfd_archive_filename (abfd), (unsigned long) rel->r_offset);
5268 bfd_set_error (bfd_error_bad_value);
b34976b6 5269 return FALSE;
b49e97c9
TS
5270 }
5271 /* Fall through. */
5272
5273 case R_MIPS_CALL_HI16:
5274 case R_MIPS_CALL_LO16:
5275 if (h != NULL)
5276 {
5277 /* This symbol requires a global offset table entry. */
f4416af6 5278 if (! mips_elf_record_global_got_symbol (h, abfd, info, g))
b34976b6 5279 return FALSE;
b49e97c9
TS
5280
5281 /* We need a stub, not a plt entry for the undefined
5282 function. But we record it as if it needs plt. See
5283 elf_adjust_dynamic_symbol in elflink.h. */
5284 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
5285 h->type = STT_FUNC;
5286 }
5287 break;
5288
0fdc1bf1
AO
5289 case R_MIPS_GOT_PAGE:
5290 /* If this is a global, overridable symbol, GOT_PAGE will
5291 decay to GOT_DISP, so we'll need a GOT entry for it. */
5292 if (h == NULL)
5293 break;
5294 else
5295 {
5296 struct mips_elf_link_hash_entry *hmips =
5297 (struct mips_elf_link_hash_entry *) h;
143d77c5 5298
0fdc1bf1
AO
5299 while (hmips->root.root.type == bfd_link_hash_indirect
5300 || hmips->root.root.type == bfd_link_hash_warning)
5301 hmips = (struct mips_elf_link_hash_entry *)
5302 hmips->root.root.u.i.link;
143d77c5 5303
0fdc1bf1
AO
5304 if ((hmips->root.root.type == bfd_link_hash_defined
5305 || hmips->root.root.type == bfd_link_hash_defweak)
5306 && hmips->root.root.u.def.section
5307 && ! (info->shared && ! info->symbolic
5308 && ! (hmips->root.elf_link_hash_flags
5309 & ELF_LINK_FORCED_LOCAL))
5310 /* If we've encountered any other relocation
5311 referencing the symbol, we'll have marked it as
5312 dynamic, and, even though we might be able to get
5313 rid of the GOT entry should we know for sure all
5314 previous relocations were GOT_PAGE ones, at this
5315 point we can't tell, so just keep using the
5316 symbol as dynamic. This is very important in the
5317 multi-got case, since we don't decide whether to
5318 decay GOT_PAGE to GOT_DISP on a per-GOT basis: if
5319 the symbol is dynamic, we'll need a GOT entry for
5320 every GOT in which the symbol is referenced with
5321 a GOT_PAGE relocation. */
5322 && hmips->root.dynindx == -1)
5323 break;
5324 }
5325 /* Fall through. */
5326
b49e97c9
TS
5327 case R_MIPS_GOT16:
5328 case R_MIPS_GOT_HI16:
5329 case R_MIPS_GOT_LO16:
5330 case R_MIPS_GOT_DISP:
5331 /* This symbol requires a global offset table entry. */
f4416af6 5332 if (h && ! mips_elf_record_global_got_symbol (h, abfd, info, g))
b34976b6 5333 return FALSE;
b49e97c9
TS
5334 break;
5335
5336 case R_MIPS_32:
5337 case R_MIPS_REL32:
5338 case R_MIPS_64:
5339 if ((info->shared || h != NULL)
5340 && (sec->flags & SEC_ALLOC) != 0)
5341 {
5342 if (sreloc == NULL)
5343 {
f4416af6 5344 sreloc = mips_elf_rel_dyn_section (dynobj, TRUE);
b49e97c9 5345 if (sreloc == NULL)
f4416af6 5346 return FALSE;
b49e97c9
TS
5347 }
5348#define MIPS_READONLY_SECTION (SEC_ALLOC | SEC_LOAD | SEC_READONLY)
5349 if (info->shared)
5350 {
5351 /* When creating a shared object, we must copy these
5352 reloc types into the output file as R_MIPS_REL32
5353 relocs. We make room for this reloc in the
5354 .rel.dyn reloc section. */
5355 mips_elf_allocate_dynamic_relocations (dynobj, 1);
5356 if ((sec->flags & MIPS_READONLY_SECTION)
5357 == MIPS_READONLY_SECTION)
5358 /* We tell the dynamic linker that there are
5359 relocations against the text segment. */
5360 info->flags |= DF_TEXTREL;
5361 }
5362 else
5363 {
5364 struct mips_elf_link_hash_entry *hmips;
5365
5366 /* We only need to copy this reloc if the symbol is
5367 defined in a dynamic object. */
5368 hmips = (struct mips_elf_link_hash_entry *) h;
5369 ++hmips->possibly_dynamic_relocs;
5370 if ((sec->flags & MIPS_READONLY_SECTION)
5371 == MIPS_READONLY_SECTION)
5372 /* We need it to tell the dynamic linker if there
5373 are relocations against the text segment. */
b34976b6 5374 hmips->readonly_reloc = TRUE;
b49e97c9
TS
5375 }
5376
5377 /* Even though we don't directly need a GOT entry for
5378 this symbol, a symbol must have a dynamic symbol
5379 table index greater that DT_MIPS_GOTSYM if there are
5380 dynamic relocations against it. */
f4416af6
AO
5381 if (h != NULL)
5382 {
5383 if (dynobj == NULL)
5384 elf_hash_table (info)->dynobj = dynobj = abfd;
5385 if (! mips_elf_create_got_section (dynobj, info, TRUE))
5386 return FALSE;
5387 g = mips_elf_got_info (dynobj, &sgot);
5388 if (! mips_elf_record_global_got_symbol (h, abfd, info, g))
5389 return FALSE;
5390 }
b49e97c9
TS
5391 }
5392
5393 if (SGI_COMPAT (abfd))
5394 mips_elf_hash_table (info)->compact_rel_size +=
5395 sizeof (Elf32_External_crinfo);
5396 break;
5397
5398 case R_MIPS_26:
5399 case R_MIPS_GPREL16:
5400 case R_MIPS_LITERAL:
5401 case R_MIPS_GPREL32:
5402 if (SGI_COMPAT (abfd))
5403 mips_elf_hash_table (info)->compact_rel_size +=
5404 sizeof (Elf32_External_crinfo);
5405 break;
5406
5407 /* This relocation describes the C++ object vtable hierarchy.
5408 Reconstruct it for later use during GC. */
5409 case R_MIPS_GNU_VTINHERIT:
5410 if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 5411 return FALSE;
b49e97c9
TS
5412 break;
5413
5414 /* This relocation describes which C++ vtable entries are actually
5415 used. Record for later use during GC. */
5416 case R_MIPS_GNU_VTENTRY:
5417 if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_offset))
b34976b6 5418 return FALSE;
b49e97c9
TS
5419 break;
5420
5421 default:
5422 break;
5423 }
5424
5425 /* We must not create a stub for a symbol that has relocations
5426 related to taking the function's address. */
5427 switch (r_type)
5428 {
5429 default:
5430 if (h != NULL)
5431 {
5432 struct mips_elf_link_hash_entry *mh;
5433
5434 mh = (struct mips_elf_link_hash_entry *) h;
b34976b6 5435 mh->no_fn_stub = TRUE;
b49e97c9
TS
5436 }
5437 break;
5438 case R_MIPS_CALL16:
5439 case R_MIPS_CALL_HI16:
5440 case R_MIPS_CALL_LO16:
2b86c02e 5441 case R_MIPS_JALR:
b49e97c9
TS
5442 break;
5443 }
5444
5445 /* If this reloc is not a 16 bit call, and it has a global
5446 symbol, then we will need the fn_stub if there is one.
5447 References from a stub section do not count. */
5448 if (h != NULL
5449 && r_type != R_MIPS16_26
5450 && strncmp (bfd_get_section_name (abfd, sec), FN_STUB,
5451 sizeof FN_STUB - 1) != 0
5452 && strncmp (bfd_get_section_name (abfd, sec), CALL_STUB,
5453 sizeof CALL_STUB - 1) != 0
5454 && strncmp (bfd_get_section_name (abfd, sec), CALL_FP_STUB,
5455 sizeof CALL_FP_STUB - 1) != 0)
5456 {
5457 struct mips_elf_link_hash_entry *mh;
5458
5459 mh = (struct mips_elf_link_hash_entry *) h;
b34976b6 5460 mh->need_fn_stub = TRUE;
b49e97c9
TS
5461 }
5462 }
5463
b34976b6 5464 return TRUE;
b49e97c9
TS
5465}
5466\f
d0647110
AO
5467bfd_boolean
5468_bfd_mips_relax_section (abfd, sec, link_info, again)
5469 bfd *abfd;
5470 asection *sec;
5471 struct bfd_link_info *link_info;
5472 bfd_boolean *again;
5473{
5474 Elf_Internal_Rela *internal_relocs;
5475 Elf_Internal_Rela *irel, *irelend;
5476 Elf_Internal_Shdr *symtab_hdr;
5477 bfd_byte *contents = NULL;
5478 bfd_byte *free_contents = NULL;
5479 size_t extsymoff;
5480 bfd_boolean changed_contents = FALSE;
5481 bfd_vma sec_start = sec->output_section->vma + sec->output_offset;
5482 Elf_Internal_Sym *isymbuf = NULL;
5483
5484 /* We are not currently changing any sizes, so only one pass. */
5485 *again = FALSE;
5486
1049f94e 5487 if (link_info->relocatable)
d0647110
AO
5488 return TRUE;
5489
45d6a902
AM
5490 internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, (PTR) NULL,
5491 (Elf_Internal_Rela *) NULL,
5492 link_info->keep_memory);
d0647110
AO
5493 if (internal_relocs == NULL)
5494 return TRUE;
5495
5496 irelend = internal_relocs + sec->reloc_count
5497 * get_elf_backend_data (abfd)->s->int_rels_per_ext_rel;
5498 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5499 extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
5500
5501 for (irel = internal_relocs; irel < irelend; irel++)
5502 {
5503 bfd_vma symval;
5504 bfd_signed_vma sym_offset;
5505 unsigned int r_type;
5506 unsigned long r_symndx;
5507 asection *sym_sec;
5508 unsigned long instruction;
5509
5510 /* Turn jalr into bgezal, and jr into beq, if they're marked
5511 with a JALR relocation, that indicate where they jump to.
5512 This saves some pipeline bubbles. */
5513 r_type = ELF_R_TYPE (abfd, irel->r_info);
5514 if (r_type != R_MIPS_JALR)
5515 continue;
5516
5517 r_symndx = ELF_R_SYM (abfd, irel->r_info);
5518 /* Compute the address of the jump target. */
5519 if (r_symndx >= extsymoff)
5520 {
5521 struct mips_elf_link_hash_entry *h
5522 = ((struct mips_elf_link_hash_entry *)
5523 elf_sym_hashes (abfd) [r_symndx - extsymoff]);
5524
5525 while (h->root.root.type == bfd_link_hash_indirect
5526 || h->root.root.type == bfd_link_hash_warning)
5527 h = (struct mips_elf_link_hash_entry *) h->root.root.u.i.link;
143d77c5 5528
d0647110
AO
5529 /* If a symbol is undefined, or if it may be overridden,
5530 skip it. */
5531 if (! ((h->root.root.type == bfd_link_hash_defined
5532 || h->root.root.type == bfd_link_hash_defweak)
5533 && h->root.root.u.def.section)
5534 || (link_info->shared && ! link_info->symbolic
5535 && ! (h->root.elf_link_hash_flags & ELF_LINK_FORCED_LOCAL)))
5536 continue;
5537
5538 sym_sec = h->root.root.u.def.section;
5539 if (sym_sec->output_section)
5540 symval = (h->root.root.u.def.value
5541 + sym_sec->output_section->vma
5542 + sym_sec->output_offset);
5543 else
5544 symval = h->root.root.u.def.value;
5545 }
5546 else
5547 {
5548 Elf_Internal_Sym *isym;
5549
5550 /* Read this BFD's symbols if we haven't done so already. */
5551 if (isymbuf == NULL && symtab_hdr->sh_info != 0)
5552 {
5553 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
5554 if (isymbuf == NULL)
5555 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
5556 symtab_hdr->sh_info, 0,
5557 NULL, NULL, NULL);
5558 if (isymbuf == NULL)
5559 goto relax_return;
5560 }
5561
5562 isym = isymbuf + r_symndx;
5563 if (isym->st_shndx == SHN_UNDEF)
5564 continue;
5565 else if (isym->st_shndx == SHN_ABS)
5566 sym_sec = bfd_abs_section_ptr;
5567 else if (isym->st_shndx == SHN_COMMON)
5568 sym_sec = bfd_com_section_ptr;
5569 else
5570 sym_sec
5571 = bfd_section_from_elf_index (abfd, isym->st_shndx);
5572 symval = isym->st_value
5573 + sym_sec->output_section->vma
5574 + sym_sec->output_offset;
5575 }
5576
5577 /* Compute branch offset, from delay slot of the jump to the
5578 branch target. */
5579 sym_offset = (symval + irel->r_addend)
5580 - (sec_start + irel->r_offset + 4);
5581
5582 /* Branch offset must be properly aligned. */
5583 if ((sym_offset & 3) != 0)
5584 continue;
5585
5586 sym_offset >>= 2;
5587
5588 /* Check that it's in range. */
5589 if (sym_offset < -0x8000 || sym_offset >= 0x8000)
5590 continue;
143d77c5 5591
d0647110
AO
5592 /* Get the section contents if we haven't done so already. */
5593 if (contents == NULL)
5594 {
5595 /* Get cached copy if it exists. */
5596 if (elf_section_data (sec)->this_hdr.contents != NULL)
5597 contents = elf_section_data (sec)->this_hdr.contents;
5598 else
5599 {
5600 contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
5601 if (contents == NULL)
5602 goto relax_return;
5603
5604 free_contents = contents;
5605 if (! bfd_get_section_contents (abfd, sec, contents,
5606 (file_ptr) 0, sec->_raw_size))
5607 goto relax_return;
5608 }
5609 }
5610
5611 instruction = bfd_get_32 (abfd, contents + irel->r_offset);
5612
5613 /* If it was jalr <reg>, turn it into bgezal $zero, <target>. */
5614 if ((instruction & 0xfc1fffff) == 0x0000f809)
5615 instruction = 0x04110000;
5616 /* If it was jr <reg>, turn it into b <target>. */
5617 else if ((instruction & 0xfc1fffff) == 0x00000008)
5618 instruction = 0x10000000;
5619 else
5620 continue;
5621
5622 instruction |= (sym_offset & 0xffff);
5623 bfd_put_32 (abfd, instruction, contents + irel->r_offset);
5624 changed_contents = TRUE;
5625 }
5626
5627 if (contents != NULL
5628 && elf_section_data (sec)->this_hdr.contents != contents)
5629 {
5630 if (!changed_contents && !link_info->keep_memory)
5631 free (contents);
5632 else
5633 {
5634 /* Cache the section contents for elf_link_input_bfd. */
5635 elf_section_data (sec)->this_hdr.contents = contents;
5636 }
5637 }
5638 return TRUE;
5639
143d77c5 5640 relax_return:
d0647110
AO
5641 if (free_contents != NULL)
5642 free (free_contents);
5643 return FALSE;
5644}
5645\f
b49e97c9
TS
5646/* Adjust a symbol defined by a dynamic object and referenced by a
5647 regular object. The current definition is in some section of the
5648 dynamic object, but we're not including those sections. We have to
5649 change the definition to something the rest of the link can
5650 understand. */
5651
b34976b6 5652bfd_boolean
b49e97c9
TS
5653_bfd_mips_elf_adjust_dynamic_symbol (info, h)
5654 struct bfd_link_info *info;
5655 struct elf_link_hash_entry *h;
5656{
5657 bfd *dynobj;
5658 struct mips_elf_link_hash_entry *hmips;
5659 asection *s;
5660
5661 dynobj = elf_hash_table (info)->dynobj;
5662
5663 /* Make sure we know what is going on here. */
5664 BFD_ASSERT (dynobj != NULL
5665 && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
5666 || h->weakdef != NULL
5667 || ((h->elf_link_hash_flags
5668 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
5669 && (h->elf_link_hash_flags
5670 & ELF_LINK_HASH_REF_REGULAR) != 0
5671 && (h->elf_link_hash_flags
5672 & ELF_LINK_HASH_DEF_REGULAR) == 0)));
5673
5674 /* If this symbol is defined in a dynamic object, we need to copy
5675 any R_MIPS_32 or R_MIPS_REL32 relocs against it into the output
5676 file. */
5677 hmips = (struct mips_elf_link_hash_entry *) h;
1049f94e 5678 if (! info->relocatable
b49e97c9
TS
5679 && hmips->possibly_dynamic_relocs != 0
5680 && (h->root.type == bfd_link_hash_defweak
5681 || (h->elf_link_hash_flags
5682 & ELF_LINK_HASH_DEF_REGULAR) == 0))
5683 {
5684 mips_elf_allocate_dynamic_relocations (dynobj,
5685 hmips->possibly_dynamic_relocs);
5686 if (hmips->readonly_reloc)
5687 /* We tell the dynamic linker that there are relocations
5688 against the text segment. */
5689 info->flags |= DF_TEXTREL;
5690 }
5691
5692 /* For a function, create a stub, if allowed. */
5693 if (! hmips->no_fn_stub
5694 && (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
5695 {
5696 if (! elf_hash_table (info)->dynamic_sections_created)
b34976b6 5697 return TRUE;
b49e97c9
TS
5698
5699 /* If this symbol is not defined in a regular file, then set
5700 the symbol to the stub location. This is required to make
5701 function pointers compare as equal between the normal
5702 executable and the shared library. */
5703 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
5704 {
5705 /* We need .stub section. */
5706 s = bfd_get_section_by_name (dynobj,
5707 MIPS_ELF_STUB_SECTION_NAME (dynobj));
5708 BFD_ASSERT (s != NULL);
5709
5710 h->root.u.def.section = s;
5711 h->root.u.def.value = s->_raw_size;
5712
5713 /* XXX Write this stub address somewhere. */
5714 h->plt.offset = s->_raw_size;
5715
5716 /* Make room for this stub code. */
5717 s->_raw_size += MIPS_FUNCTION_STUB_SIZE;
5718
5719 /* The last half word of the stub will be filled with the index
5720 of this symbol in .dynsym section. */
b34976b6 5721 return TRUE;
b49e97c9
TS
5722 }
5723 }
5724 else if ((h->type == STT_FUNC)
5725 && (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) == 0)
5726 {
5727 /* This will set the entry for this symbol in the GOT to 0, and
5728 the dynamic linker will take care of this. */
5729 h->root.u.def.value = 0;
b34976b6 5730 return TRUE;
b49e97c9
TS
5731 }
5732
5733 /* If this is a weak symbol, and there is a real definition, the
5734 processor independent code will have arranged for us to see the
5735 real definition first, and we can just use the same value. */
5736 if (h->weakdef != NULL)
5737 {
5738 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
5739 || h->weakdef->root.type == bfd_link_hash_defweak);
5740 h->root.u.def.section = h->weakdef->root.u.def.section;
5741 h->root.u.def.value = h->weakdef->root.u.def.value;
b34976b6 5742 return TRUE;
b49e97c9
TS
5743 }
5744
5745 /* This is a reference to a symbol defined by a dynamic object which
5746 is not a function. */
5747
b34976b6 5748 return TRUE;
b49e97c9
TS
5749}
5750\f
5751/* This function is called after all the input files have been read,
5752 and the input sections have been assigned to output sections. We
5753 check for any mips16 stub sections that we can discard. */
5754
b34976b6 5755bfd_boolean
b49e97c9
TS
5756_bfd_mips_elf_always_size_sections (output_bfd, info)
5757 bfd *output_bfd;
5758 struct bfd_link_info *info;
5759{
5760 asection *ri;
5761
f4416af6
AO
5762 bfd *dynobj;
5763 asection *s;
5764 struct mips_got_info *g;
5765 int i;
5766 bfd_size_type loadable_size = 0;
5767 bfd_size_type local_gotno;
5768 bfd *sub;
5769
b49e97c9
TS
5770 /* The .reginfo section has a fixed size. */
5771 ri = bfd_get_section_by_name (output_bfd, ".reginfo");
5772 if (ri != NULL)
5773 bfd_set_section_size (output_bfd, ri,
5774 (bfd_size_type) sizeof (Elf32_External_RegInfo));
5775
1049f94e 5776 if (! (info->relocatable
f4416af6
AO
5777 || ! mips_elf_hash_table (info)->mips16_stubs_seen))
5778 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
5779 mips_elf_check_mips16_stubs,
5780 (PTR) NULL);
5781
5782 dynobj = elf_hash_table (info)->dynobj;
5783 if (dynobj == NULL)
5784 /* Relocatable links don't have it. */
5785 return TRUE;
143d77c5 5786
f4416af6
AO
5787 g = mips_elf_got_info (dynobj, &s);
5788 if (s == NULL)
b34976b6 5789 return TRUE;
b49e97c9 5790
f4416af6
AO
5791 /* Calculate the total loadable size of the output. That
5792 will give us the maximum number of GOT_PAGE entries
5793 required. */
5794 for (sub = info->input_bfds; sub; sub = sub->link_next)
5795 {
5796 asection *subsection;
5797
5798 for (subsection = sub->sections;
5799 subsection;
5800 subsection = subsection->next)
5801 {
5802 if ((subsection->flags & SEC_ALLOC) == 0)
5803 continue;
5804 loadable_size += ((subsection->_raw_size + 0xf)
5805 &~ (bfd_size_type) 0xf);
5806 }
5807 }
5808
5809 /* There has to be a global GOT entry for every symbol with
5810 a dynamic symbol table index of DT_MIPS_GOTSYM or
5811 higher. Therefore, it make sense to put those symbols
5812 that need GOT entries at the end of the symbol table. We
5813 do that here. */
5814 if (! mips_elf_sort_hash_table (info, 1))
5815 return FALSE;
5816
5817 if (g->global_gotsym != NULL)
5818 i = elf_hash_table (info)->dynsymcount - g->global_gotsym->dynindx;
5819 else
5820 /* If there are no global symbols, or none requiring
5821 relocations, then GLOBAL_GOTSYM will be NULL. */
5822 i = 0;
5823
5824 /* In the worst case, we'll get one stub per dynamic symbol, plus
5825 one to account for the dummy entry at the end required by IRIX
5826 rld. */
5827 loadable_size += MIPS_FUNCTION_STUB_SIZE * (i + 1);
5828
5829 /* Assume there are two loadable segments consisting of
5830 contiguous sections. Is 5 enough? */
5831 local_gotno = (loadable_size >> 16) + 5;
5832
5833 g->local_gotno += local_gotno;
5834 s->_raw_size += g->local_gotno * MIPS_ELF_GOT_SIZE (output_bfd);
5835
5836 g->global_gotno = i;
5837 s->_raw_size += i * MIPS_ELF_GOT_SIZE (output_bfd);
5838
5839 if (s->_raw_size > MIPS_ELF_GOT_MAX_SIZE (output_bfd)
5840 && ! mips_elf_multi_got (output_bfd, info, g, s, local_gotno))
5841 return FALSE;
b49e97c9 5842
b34976b6 5843 return TRUE;
b49e97c9
TS
5844}
5845
5846/* Set the sizes of the dynamic sections. */
5847
b34976b6 5848bfd_boolean
b49e97c9
TS
5849_bfd_mips_elf_size_dynamic_sections (output_bfd, info)
5850 bfd *output_bfd;
5851 struct bfd_link_info *info;
5852{
5853 bfd *dynobj;
5854 asection *s;
b34976b6 5855 bfd_boolean reltext;
b49e97c9
TS
5856
5857 dynobj = elf_hash_table (info)->dynobj;
5858 BFD_ASSERT (dynobj != NULL);
5859
5860 if (elf_hash_table (info)->dynamic_sections_created)
5861 {
5862 /* Set the contents of the .interp section to the interpreter. */
5863 if (! info->shared)
5864 {
5865 s = bfd_get_section_by_name (dynobj, ".interp");
5866 BFD_ASSERT (s != NULL);
5867 s->_raw_size
5868 = strlen (ELF_DYNAMIC_INTERPRETER (output_bfd)) + 1;
5869 s->contents
5870 = (bfd_byte *) ELF_DYNAMIC_INTERPRETER (output_bfd);
5871 }
5872 }
5873
5874 /* The check_relocs and adjust_dynamic_symbol entry points have
5875 determined the sizes of the various dynamic sections. Allocate
5876 memory for them. */
b34976b6 5877 reltext = FALSE;
b49e97c9
TS
5878 for (s = dynobj->sections; s != NULL; s = s->next)
5879 {
5880 const char *name;
b34976b6 5881 bfd_boolean strip;
b49e97c9
TS
5882
5883 /* It's OK to base decisions on the section name, because none
5884 of the dynobj section names depend upon the input files. */
5885 name = bfd_get_section_name (dynobj, s);
5886
5887 if ((s->flags & SEC_LINKER_CREATED) == 0)
5888 continue;
5889
b34976b6 5890 strip = FALSE;
b49e97c9
TS
5891
5892 if (strncmp (name, ".rel", 4) == 0)
5893 {
5894 if (s->_raw_size == 0)
5895 {
5896 /* We only strip the section if the output section name
5897 has the same name. Otherwise, there might be several
5898 input sections for this output section. FIXME: This
5899 code is probably not needed these days anyhow, since
5900 the linker now does not create empty output sections. */
5901 if (s->output_section != NULL
5902 && strcmp (name,
5903 bfd_get_section_name (s->output_section->owner,
5904 s->output_section)) == 0)
b34976b6 5905 strip = TRUE;
b49e97c9
TS
5906 }
5907 else
5908 {
5909 const char *outname;
5910 asection *target;
5911
5912 /* If this relocation section applies to a read only
5913 section, then we probably need a DT_TEXTREL entry.
5914 If the relocation section is .rel.dyn, we always
5915 assert a DT_TEXTREL entry rather than testing whether
5916 there exists a relocation to a read only section or
5917 not. */
5918 outname = bfd_get_section_name (output_bfd,
5919 s->output_section);
5920 target = bfd_get_section_by_name (output_bfd, outname + 4);
5921 if ((target != NULL
5922 && (target->flags & SEC_READONLY) != 0
5923 && (target->flags & SEC_ALLOC) != 0)
5924 || strcmp (outname, ".rel.dyn") == 0)
b34976b6 5925 reltext = TRUE;
b49e97c9
TS
5926
5927 /* We use the reloc_count field as a counter if we need
5928 to copy relocs into the output file. */
5929 if (strcmp (name, ".rel.dyn") != 0)
5930 s->reloc_count = 0;
f4416af6
AO
5931
5932 /* If combreloc is enabled, elf_link_sort_relocs() will
5933 sort relocations, but in a different way than we do,
5934 and before we're done creating relocations. Also, it
5935 will move them around between input sections'
5936 relocation's contents, so our sorting would be
5937 broken, so don't let it run. */
5938 info->combreloc = 0;
b49e97c9
TS
5939 }
5940 }
5941 else if (strncmp (name, ".got", 4) == 0)
5942 {
f4416af6
AO
5943 /* _bfd_mips_elf_always_size_sections() has already done
5944 most of the work, but some symbols may have been mapped
5945 to versions that we must now resolve in the got_entries
5946 hash tables. */
5947 struct mips_got_info *gg = mips_elf_got_info (dynobj, NULL);
5948 struct mips_got_info *g = gg;
5949 struct mips_elf_set_global_got_offset_arg set_got_offset_arg;
5950 unsigned int needed_relocs = 0;
143d77c5 5951
f4416af6 5952 if (gg->next)
b49e97c9 5953 {
f4416af6
AO
5954 set_got_offset_arg.value = MIPS_ELF_GOT_SIZE (output_bfd);
5955 set_got_offset_arg.info = info;
b49e97c9 5956
f4416af6
AO
5957 mips_elf_resolve_final_got_entries (gg);
5958 for (g = gg->next; g && g->next != gg; g = g->next)
b49e97c9 5959 {
f4416af6
AO
5960 unsigned int save_assign;
5961
5962 mips_elf_resolve_final_got_entries (g);
5963
5964 /* Assign offsets to global GOT entries. */
5965 save_assign = g->assigned_gotno;
5966 g->assigned_gotno = g->local_gotno;
5967 set_got_offset_arg.g = g;
5968 set_got_offset_arg.needed_relocs = 0;
5969 htab_traverse (g->got_entries,
5970 mips_elf_set_global_got_offset,
5971 &set_got_offset_arg);
5972 needed_relocs += set_got_offset_arg.needed_relocs;
5973 BFD_ASSERT (g->assigned_gotno - g->local_gotno
5974 <= g->global_gotno);
5975
5976 g->assigned_gotno = save_assign;
5977 if (info->shared)
5978 {
5979 needed_relocs += g->local_gotno - g->assigned_gotno;
5980 BFD_ASSERT (g->assigned_gotno == g->next->local_gotno
5981 + g->next->global_gotno
5982 + MIPS_RESERVED_GOTNO);
5983 }
b49e97c9 5984 }
b49e97c9 5985
f4416af6
AO
5986 if (needed_relocs)
5987 mips_elf_allocate_dynamic_relocations (dynobj, needed_relocs);
5988 }
b49e97c9
TS
5989 }
5990 else if (strcmp (name, MIPS_ELF_STUB_SECTION_NAME (output_bfd)) == 0)
5991 {
8dc1a139 5992 /* IRIX rld assumes that the function stub isn't at the end
b49e97c9
TS
5993 of .text section. So put a dummy. XXX */
5994 s->_raw_size += MIPS_FUNCTION_STUB_SIZE;
5995 }
5996 else if (! info->shared
5997 && ! mips_elf_hash_table (info)->use_rld_obj_head
5998 && strncmp (name, ".rld_map", 8) == 0)
5999 {
6000 /* We add a room for __rld_map. It will be filled in by the
6001 rtld to contain a pointer to the _r_debug structure. */
6002 s->_raw_size += 4;
6003 }
6004 else if (SGI_COMPAT (output_bfd)
6005 && strncmp (name, ".compact_rel", 12) == 0)
6006 s->_raw_size += mips_elf_hash_table (info)->compact_rel_size;
b49e97c9
TS
6007 else if (strncmp (name, ".init", 5) != 0)
6008 {
6009 /* It's not one of our sections, so don't allocate space. */
6010 continue;
6011 }
6012
6013 if (strip)
6014 {
6015 _bfd_strip_section_from_output (info, s);
6016 continue;
6017 }
6018
6019 /* Allocate memory for the section contents. */
6020 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
6021 if (s->contents == NULL && s->_raw_size != 0)
6022 {
6023 bfd_set_error (bfd_error_no_memory);
b34976b6 6024 return FALSE;
b49e97c9
TS
6025 }
6026 }
6027
6028 if (elf_hash_table (info)->dynamic_sections_created)
6029 {
6030 /* Add some entries to the .dynamic section. We fill in the
6031 values later, in _bfd_mips_elf_finish_dynamic_sections, but we
6032 must add the entries now so that we get the correct size for
6033 the .dynamic section. The DT_DEBUG entry is filled in by the
6034 dynamic linker and used by the debugger. */
6035 if (! info->shared)
6036 {
6037 /* SGI object has the equivalence of DT_DEBUG in the
6038 DT_MIPS_RLD_MAP entry. */
6039 if (!MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_MAP, 0))
b34976b6 6040 return FALSE;
b49e97c9
TS
6041 if (!SGI_COMPAT (output_bfd))
6042 {
6043 if (!MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_DEBUG, 0))
b34976b6 6044 return FALSE;
b49e97c9
TS
6045 }
6046 }
6047 else
6048 {
6049 /* Shared libraries on traditional mips have DT_DEBUG. */
6050 if (!SGI_COMPAT (output_bfd))
6051 {
6052 if (!MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_DEBUG, 0))
b34976b6 6053 return FALSE;
b49e97c9
TS
6054 }
6055 }
6056
6057 if (reltext && SGI_COMPAT (output_bfd))
6058 info->flags |= DF_TEXTREL;
6059
6060 if ((info->flags & DF_TEXTREL) != 0)
6061 {
6062 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_TEXTREL, 0))
b34976b6 6063 return FALSE;
b49e97c9
TS
6064 }
6065
6066 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_PLTGOT, 0))
b34976b6 6067 return FALSE;
b49e97c9 6068
f4416af6 6069 if (mips_elf_rel_dyn_section (dynobj, FALSE))
b49e97c9
TS
6070 {
6071 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_REL, 0))
b34976b6 6072 return FALSE;
b49e97c9
TS
6073
6074 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELSZ, 0))
b34976b6 6075 return FALSE;
b49e97c9
TS
6076
6077 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_RELENT, 0))
b34976b6 6078 return FALSE;
b49e97c9
TS
6079 }
6080
6081 if (SGI_COMPAT (output_bfd))
6082 {
6083 if (!MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_CONFLICTNO, 0))
b34976b6 6084 return FALSE;
b49e97c9
TS
6085 }
6086
6087 if (SGI_COMPAT (output_bfd))
6088 {
6089 if (!MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_LIBLISTNO, 0))
b34976b6 6090 return FALSE;
b49e97c9
TS
6091 }
6092
6093 if (bfd_get_section_by_name (dynobj, ".conflict") != NULL)
6094 {
6095 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_CONFLICT, 0))
b34976b6 6096 return FALSE;
b49e97c9
TS
6097
6098 s = bfd_get_section_by_name (dynobj, ".liblist");
6099 BFD_ASSERT (s != NULL);
6100
6101 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_LIBLIST, 0))
b34976b6 6102 return FALSE;
b49e97c9
TS
6103 }
6104
6105 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_RLD_VERSION, 0))
b34976b6 6106 return FALSE;
b49e97c9
TS
6107
6108 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_FLAGS, 0))
b34976b6 6109 return FALSE;
b49e97c9
TS
6110
6111#if 0
6112 /* Time stamps in executable files are a bad idea. */
6113 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_TIME_STAMP, 0))
b34976b6 6114 return FALSE;
b49e97c9
TS
6115#endif
6116
6117#if 0 /* FIXME */
6118 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_ICHECKSUM, 0))
b34976b6 6119 return FALSE;
b49e97c9
TS
6120#endif
6121
6122#if 0 /* FIXME */
6123 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_IVERSION, 0))
b34976b6 6124 return FALSE;
b49e97c9
TS
6125#endif
6126
6127 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_BASE_ADDRESS, 0))
b34976b6 6128 return FALSE;
b49e97c9
TS
6129
6130 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_LOCAL_GOTNO, 0))
b34976b6 6131 return FALSE;
b49e97c9
TS
6132
6133 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_SYMTABNO, 0))
b34976b6 6134 return FALSE;
b49e97c9
TS
6135
6136 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_UNREFEXTNO, 0))
b34976b6 6137 return FALSE;
b49e97c9
TS
6138
6139 if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_GOTSYM, 0))
b34976b6 6140 return FALSE;
b49e97c9
TS
6141
6142 if (IRIX_COMPAT (dynobj) == ict_irix5
6143 && ! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_HIPAGENO, 0))
b34976b6 6144 return FALSE;
b49e97c9
TS
6145
6146 if (IRIX_COMPAT (dynobj) == ict_irix6
6147 && (bfd_get_section_by_name
6148 (dynobj, MIPS_ELF_OPTIONS_SECTION_NAME (dynobj)))
6149 && !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_OPTIONS, 0))
b34976b6 6150 return FALSE;
b49e97c9
TS
6151 }
6152
b34976b6 6153 return TRUE;
b49e97c9
TS
6154}
6155\f
6156/* Relocate a MIPS ELF section. */
6157
b34976b6 6158bfd_boolean
b49e97c9
TS
6159_bfd_mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
6160 contents, relocs, local_syms, local_sections)
6161 bfd *output_bfd;
6162 struct bfd_link_info *info;
6163 bfd *input_bfd;
6164 asection *input_section;
6165 bfd_byte *contents;
6166 Elf_Internal_Rela *relocs;
6167 Elf_Internal_Sym *local_syms;
6168 asection **local_sections;
6169{
6170 Elf_Internal_Rela *rel;
6171 const Elf_Internal_Rela *relend;
6172 bfd_vma addend = 0;
b34976b6 6173 bfd_boolean use_saved_addend_p = FALSE;
9c5bfbb7 6174 const struct elf_backend_data *bed;
b49e97c9
TS
6175
6176 bed = get_elf_backend_data (output_bfd);
6177 relend = relocs + input_section->reloc_count * bed->s->int_rels_per_ext_rel;
6178 for (rel = relocs; rel < relend; ++rel)
6179 {
6180 const char *name;
6181 bfd_vma value;
6182 reloc_howto_type *howto;
b34976b6
AM
6183 bfd_boolean require_jalx;
6184 /* TRUE if the relocation is a RELA relocation, rather than a
b49e97c9 6185 REL relocation. */
b34976b6 6186 bfd_boolean rela_relocation_p = TRUE;
b49e97c9
TS
6187 unsigned int r_type = ELF_R_TYPE (output_bfd, rel->r_info);
6188 const char * msg = (const char *) NULL;
6189
6190 /* Find the relocation howto for this relocation. */
4a14403c 6191 if (r_type == R_MIPS_64 && ! NEWABI_P (input_bfd))
b49e97c9
TS
6192 {
6193 /* Some 32-bit code uses R_MIPS_64. In particular, people use
6194 64-bit code, but make sure all their addresses are in the
6195 lowermost or uppermost 32-bit section of the 64-bit address
6196 space. Thus, when they use an R_MIPS_64 they mean what is
6197 usually meant by R_MIPS_32, with the exception that the
6198 stored value is sign-extended to 64 bits. */
b34976b6 6199 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, R_MIPS_32, FALSE);
b49e97c9
TS
6200
6201 /* On big-endian systems, we need to lie about the position
6202 of the reloc. */
6203 if (bfd_big_endian (input_bfd))
6204 rel->r_offset += 4;
6205 }
6206 else
6207 /* NewABI defaults to RELA relocations. */
6208 howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, r_type,
4ffba85c
AO
6209 NEWABI_P (input_bfd)
6210 && (MIPS_RELOC_RELA_P
6211 (input_bfd, input_section,
6212 rel - relocs)));
b49e97c9
TS
6213
6214 if (!use_saved_addend_p)
6215 {
6216 Elf_Internal_Shdr *rel_hdr;
6217
6218 /* If these relocations were originally of the REL variety,
6219 we must pull the addend out of the field that will be
6220 relocated. Otherwise, we simply use the contents of the
6221 RELA relocation. To determine which flavor or relocation
6222 this is, we depend on the fact that the INPUT_SECTION's
6223 REL_HDR is read before its REL_HDR2. */
6224 rel_hdr = &elf_section_data (input_section)->rel_hdr;
6225 if ((size_t) (rel - relocs)
6226 >= (NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel))
6227 rel_hdr = elf_section_data (input_section)->rel_hdr2;
6228 if (rel_hdr->sh_entsize == MIPS_ELF_REL_SIZE (input_bfd))
6229 {
6230 /* Note that this is a REL relocation. */
b34976b6 6231 rela_relocation_p = FALSE;
b49e97c9
TS
6232
6233 /* Get the addend, which is stored in the input file. */
6234 addend = mips_elf_obtain_contents (howto, rel, input_bfd,
6235 contents);
6236 addend &= howto->src_mask;
5a659663 6237 addend <<= howto->rightshift;
b49e97c9
TS
6238
6239 /* For some kinds of relocations, the ADDEND is a
6240 combination of the addend stored in two different
6241 relocations. */
6242 if (r_type == R_MIPS_HI16
6243 || r_type == R_MIPS_GNU_REL_HI16
6244 || (r_type == R_MIPS_GOT16
6245 && mips_elf_local_relocation_p (input_bfd, rel,
b34976b6 6246 local_sections, FALSE)))
b49e97c9
TS
6247 {
6248 bfd_vma l;
6249 const Elf_Internal_Rela *lo16_relocation;
6250 reloc_howto_type *lo16_howto;
6251 unsigned int lo;
6252
6253 /* The combined value is the sum of the HI16 addend,
6254 left-shifted by sixteen bits, and the LO16
6255 addend, sign extended. (Usually, the code does
6256 a `lui' of the HI16 value, and then an `addiu' of
6257 the LO16 value.)
6258
6259 Scan ahead to find a matching LO16 relocation. */
6260 if (r_type == R_MIPS_GNU_REL_HI16)
6261 lo = R_MIPS_GNU_REL_LO16;
6262 else
6263 lo = R_MIPS_LO16;
6264 lo16_relocation = mips_elf_next_relocation (input_bfd, lo,
6265 rel, relend);
6266 if (lo16_relocation == NULL)
b34976b6 6267 return FALSE;
b49e97c9
TS
6268
6269 /* Obtain the addend kept there. */
b34976b6 6270 lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, lo, FALSE);
b49e97c9
TS
6271 l = mips_elf_obtain_contents (lo16_howto, lo16_relocation,
6272 input_bfd, contents);
6273 l &= lo16_howto->src_mask;
5a659663 6274 l <<= lo16_howto->rightshift;
a7ebbfdf 6275 l = _bfd_mips_elf_sign_extend (l, 16);
b49e97c9
TS
6276
6277 addend <<= 16;
6278
6279 /* Compute the combined addend. */
6280 addend += l;
6281
6282 /* If PC-relative, subtract the difference between the
6283 address of the LO part of the reloc and the address of
6284 the HI part. The relocation is relative to the LO
6285 part, but mips_elf_calculate_relocation() doesn't
6286 know its address or the difference from the HI part, so
6287 we subtract that difference here. See also the
6288 comment in mips_elf_calculate_relocation(). */
6289 if (r_type == R_MIPS_GNU_REL_HI16)
6290 addend -= (lo16_relocation->r_offset - rel->r_offset);
6291 }
6292 else if (r_type == R_MIPS16_GPREL)
6293 {
6294 /* The addend is scrambled in the object file. See
6295 mips_elf_perform_relocation for details on the
6296 format. */
6297 addend = (((addend & 0x1f0000) >> 5)
6298 | ((addend & 0x7e00000) >> 16)
6299 | (addend & 0x1f));
6300 }
6301 }
6302 else
6303 addend = rel->r_addend;
6304 }
6305
1049f94e 6306 if (info->relocatable)
b49e97c9
TS
6307 {
6308 Elf_Internal_Sym *sym;
6309 unsigned long r_symndx;
6310
4a14403c 6311 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd)
b49e97c9
TS
6312 && bfd_big_endian (input_bfd))
6313 rel->r_offset -= 4;
6314
6315 /* Since we're just relocating, all we need to do is copy
6316 the relocations back out to the object file, unless
6317 they're against a section symbol, in which case we need
6318 to adjust by the section offset, or unless they're GP
6319 relative in which case we need to adjust by the amount
1049f94e 6320 that we're adjusting GP in this relocatable object. */
b49e97c9
TS
6321
6322 if (! mips_elf_local_relocation_p (input_bfd, rel, local_sections,
b34976b6 6323 FALSE))
b49e97c9
TS
6324 /* There's nothing to do for non-local relocations. */
6325 continue;
6326
6327 if (r_type == R_MIPS16_GPREL
6328 || r_type == R_MIPS_GPREL16
6329 || r_type == R_MIPS_GPREL32
6330 || r_type == R_MIPS_LITERAL)
6331 addend -= (_bfd_get_gp_value (output_bfd)
6332 - _bfd_get_gp_value (input_bfd));
b49e97c9
TS
6333
6334 r_symndx = ELF_R_SYM (output_bfd, rel->r_info);
6335 sym = local_syms + r_symndx;
6336 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6337 /* Adjust the addend appropriately. */
6338 addend += local_sections[r_symndx]->output_offset;
6339
5a659663
TS
6340 if (howto->partial_inplace)
6341 {
6342 /* If the relocation is for a R_MIPS_HI16 or R_MIPS_GOT16,
6343 then we only want to write out the high-order 16 bits.
6344 The subsequent R_MIPS_LO16 will handle the low-order bits.
6345 */
6346 if (r_type == R_MIPS_HI16 || r_type == R_MIPS_GOT16
6347 || r_type == R_MIPS_GNU_REL_HI16)
6348 addend = mips_elf_high (addend);
6349 else if (r_type == R_MIPS_HIGHER)
6350 addend = mips_elf_higher (addend);
6351 else if (r_type == R_MIPS_HIGHEST)
6352 addend = mips_elf_highest (addend);
6353 }
b49e97c9
TS
6354
6355 if (rela_relocation_p)
6356 /* If this is a RELA relocation, just update the addend.
6357 We have to cast away constness for REL. */
6358 rel->r_addend = addend;
6359 else
6360 {
6361 /* Otherwise, we have to write the value back out. Note
6362 that we use the source mask, rather than the
6363 destination mask because the place to which we are
6364 writing will be source of the addend in the final
6365 link. */
5a659663 6366 addend >>= howto->rightshift;
b49e97c9
TS
6367 addend &= howto->src_mask;
6368
5a659663 6369 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
b49e97c9
TS
6370 /* See the comment above about using R_MIPS_64 in the 32-bit
6371 ABI. Here, we need to update the addend. It would be
6372 possible to get away with just using the R_MIPS_32 reloc
6373 but for endianness. */
6374 {
6375 bfd_vma sign_bits;
6376 bfd_vma low_bits;
6377 bfd_vma high_bits;
6378
6379 if (addend & ((bfd_vma) 1 << 31))
6380#ifdef BFD64
6381 sign_bits = ((bfd_vma) 1 << 32) - 1;
6382#else
6383 sign_bits = -1;
6384#endif
6385 else
6386 sign_bits = 0;
6387
6388 /* If we don't know that we have a 64-bit type,
6389 do two separate stores. */
6390 if (bfd_big_endian (input_bfd))
6391 {
6392 /* Store the sign-bits (which are most significant)
6393 first. */
6394 low_bits = sign_bits;
6395 high_bits = addend;
6396 }
6397 else
6398 {
6399 low_bits = addend;
6400 high_bits = sign_bits;
6401 }
6402 bfd_put_32 (input_bfd, low_bits,
6403 contents + rel->r_offset);
6404 bfd_put_32 (input_bfd, high_bits,
6405 contents + rel->r_offset + 4);
6406 continue;
6407 }
6408
6409 if (! mips_elf_perform_relocation (info, howto, rel, addend,
6410 input_bfd, input_section,
b34976b6
AM
6411 contents, FALSE))
6412 return FALSE;
b49e97c9
TS
6413 }
6414
6415 /* Go on to the next relocation. */
6416 continue;
6417 }
6418
6419 /* In the N32 and 64-bit ABIs there may be multiple consecutive
6420 relocations for the same offset. In that case we are
6421 supposed to treat the output of each relocation as the addend
6422 for the next. */
6423 if (rel + 1 < relend
6424 && rel->r_offset == rel[1].r_offset
6425 && ELF_R_TYPE (input_bfd, rel[1].r_info) != R_MIPS_NONE)
b34976b6 6426 use_saved_addend_p = TRUE;
b49e97c9 6427 else
b34976b6 6428 use_saved_addend_p = FALSE;
b49e97c9 6429
5a659663
TS
6430 addend >>= howto->rightshift;
6431
b49e97c9
TS
6432 /* Figure out what value we are supposed to relocate. */
6433 switch (mips_elf_calculate_relocation (output_bfd, input_bfd,
6434 input_section, info, rel,
6435 addend, howto, local_syms,
6436 local_sections, &value,
bce03d3d
AO
6437 &name, &require_jalx,
6438 use_saved_addend_p))
b49e97c9
TS
6439 {
6440 case bfd_reloc_continue:
6441 /* There's nothing to do. */
6442 continue;
6443
6444 case bfd_reloc_undefined:
6445 /* mips_elf_calculate_relocation already called the
6446 undefined_symbol callback. There's no real point in
6447 trying to perform the relocation at this point, so we
6448 just skip ahead to the next relocation. */
6449 continue;
6450
6451 case bfd_reloc_notsupported:
6452 msg = _("internal error: unsupported relocation error");
6453 info->callbacks->warning
6454 (info, msg, name, input_bfd, input_section, rel->r_offset);
b34976b6 6455 return FALSE;
b49e97c9
TS
6456
6457 case bfd_reloc_overflow:
6458 if (use_saved_addend_p)
6459 /* Ignore overflow until we reach the last relocation for
6460 a given location. */
6461 ;
6462 else
6463 {
6464 BFD_ASSERT (name != NULL);
6465 if (! ((*info->callbacks->reloc_overflow)
6466 (info, name, howto->name, (bfd_vma) 0,
6467 input_bfd, input_section, rel->r_offset)))
b34976b6 6468 return FALSE;
b49e97c9
TS
6469 }
6470 break;
6471
6472 case bfd_reloc_ok:
6473 break;
6474
6475 default:
6476 abort ();
6477 break;
6478 }
6479
6480 /* If we've got another relocation for the address, keep going
6481 until we reach the last one. */
6482 if (use_saved_addend_p)
6483 {
6484 addend = value;
6485 continue;
6486 }
6487
4a14403c 6488 if (r_type == R_MIPS_64 && ! NEWABI_P (output_bfd))
b49e97c9
TS
6489 /* See the comment above about using R_MIPS_64 in the 32-bit
6490 ABI. Until now, we've been using the HOWTO for R_MIPS_32;
6491 that calculated the right value. Now, however, we
6492 sign-extend the 32-bit result to 64-bits, and store it as a
6493 64-bit value. We are especially generous here in that we
6494 go to extreme lengths to support this usage on systems with
6495 only a 32-bit VMA. */
6496 {
6497 bfd_vma sign_bits;
6498 bfd_vma low_bits;
6499 bfd_vma high_bits;
6500
6501 if (value & ((bfd_vma) 1 << 31))
6502#ifdef BFD64
6503 sign_bits = ((bfd_vma) 1 << 32) - 1;
6504#else
6505 sign_bits = -1;
6506#endif
6507 else
6508 sign_bits = 0;
6509
6510 /* If we don't know that we have a 64-bit type,
6511 do two separate stores. */
6512 if (bfd_big_endian (input_bfd))
6513 {
6514 /* Undo what we did above. */
6515 rel->r_offset -= 4;
6516 /* Store the sign-bits (which are most significant)
6517 first. */
6518 low_bits = sign_bits;
6519 high_bits = value;
6520 }
6521 else
6522 {
6523 low_bits = value;
6524 high_bits = sign_bits;
6525 }
6526 bfd_put_32 (input_bfd, low_bits,
6527 contents + rel->r_offset);
6528 bfd_put_32 (input_bfd, high_bits,
6529 contents + rel->r_offset + 4);
6530 continue;
6531 }
6532
6533 /* Actually perform the relocation. */
6534 if (! mips_elf_perform_relocation (info, howto, rel, value,
6535 input_bfd, input_section,
6536 contents, require_jalx))
b34976b6 6537 return FALSE;
b49e97c9
TS
6538 }
6539
b34976b6 6540 return TRUE;
b49e97c9
TS
6541}
6542\f
6543/* If NAME is one of the special IRIX6 symbols defined by the linker,
6544 adjust it appropriately now. */
6545
6546static void
6547mips_elf_irix6_finish_dynamic_symbol (abfd, name, sym)
6548 bfd *abfd ATTRIBUTE_UNUSED;
6549 const char *name;
6550 Elf_Internal_Sym *sym;
6551{
6552 /* The linker script takes care of providing names and values for
6553 these, but we must place them into the right sections. */
6554 static const char* const text_section_symbols[] = {
6555 "_ftext",
6556 "_etext",
6557 "__dso_displacement",
6558 "__elf_header",
6559 "__program_header_table",
6560 NULL
6561 };
6562
6563 static const char* const data_section_symbols[] = {
6564 "_fdata",
6565 "_edata",
6566 "_end",
6567 "_fbss",
6568 NULL
6569 };
6570
6571 const char* const *p;
6572 int i;
6573
6574 for (i = 0; i < 2; ++i)
6575 for (p = (i == 0) ? text_section_symbols : data_section_symbols;
6576 *p;
6577 ++p)
6578 if (strcmp (*p, name) == 0)
6579 {
6580 /* All of these symbols are given type STT_SECTION by the
6581 IRIX6 linker. */
6582 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
e10609d3 6583 sym->st_other = STO_PROTECTED;
b49e97c9
TS
6584
6585 /* The IRIX linker puts these symbols in special sections. */
6586 if (i == 0)
6587 sym->st_shndx = SHN_MIPS_TEXT;
6588 else
6589 sym->st_shndx = SHN_MIPS_DATA;
6590
6591 break;
6592 }
6593}
6594
6595/* Finish up dynamic symbol handling. We set the contents of various
6596 dynamic sections here. */
6597
b34976b6 6598bfd_boolean
b49e97c9
TS
6599_bfd_mips_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
6600 bfd *output_bfd;
6601 struct bfd_link_info *info;
6602 struct elf_link_hash_entry *h;
6603 Elf_Internal_Sym *sym;
6604{
6605 bfd *dynobj;
6606 bfd_vma gval;
6607 asection *sgot;
f4416af6 6608 struct mips_got_info *g, *gg;
b49e97c9 6609 const char *name;
b49e97c9
TS
6610
6611 dynobj = elf_hash_table (info)->dynobj;
6612 gval = sym->st_value;
b49e97c9
TS
6613
6614 if (h->plt.offset != (bfd_vma) -1)
6615 {
6616 asection *s;
6617 bfd_byte stub[MIPS_FUNCTION_STUB_SIZE];
6618
6619 /* This symbol has a stub. Set it up. */
6620
6621 BFD_ASSERT (h->dynindx != -1);
6622
6623 s = bfd_get_section_by_name (dynobj,
6624 MIPS_ELF_STUB_SECTION_NAME (dynobj));
6625 BFD_ASSERT (s != NULL);
6626
6627 /* FIXME: Can h->dynindex be more than 64K? */
6628 if (h->dynindx & 0xffff0000)
b34976b6 6629 return FALSE;
b49e97c9
TS
6630
6631 /* Fill the stub. */
6632 bfd_put_32 (output_bfd, STUB_LW (output_bfd), stub);
6633 bfd_put_32 (output_bfd, STUB_MOVE (output_bfd), stub + 4);
6634 bfd_put_32 (output_bfd, STUB_JALR, stub + 8);
6635 bfd_put_32 (output_bfd, STUB_LI16 (output_bfd) + h->dynindx, stub + 12);
6636
6637 BFD_ASSERT (h->plt.offset <= s->_raw_size);
6638 memcpy (s->contents + h->plt.offset, stub, MIPS_FUNCTION_STUB_SIZE);
6639
6640 /* Mark the symbol as undefined. plt.offset != -1 occurs
6641 only for the referenced symbol. */
6642 sym->st_shndx = SHN_UNDEF;
6643
6644 /* The run-time linker uses the st_value field of the symbol
6645 to reset the global offset table entry for this external
6646 to its stub address when unlinking a shared object. */
6647 gval = s->output_section->vma + s->output_offset + h->plt.offset;
6648 sym->st_value = gval;
6649 }
6650
6651 BFD_ASSERT (h->dynindx != -1
6652 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0);
6653
f4416af6 6654 sgot = mips_elf_got_section (dynobj, FALSE);
b49e97c9 6655 BFD_ASSERT (sgot != NULL);
f4416af6 6656 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
f0abc2a1 6657 g = mips_elf_section_data (sgot)->u.got_info;
b49e97c9
TS
6658 BFD_ASSERT (g != NULL);
6659
6660 /* Run through the global symbol table, creating GOT entries for all
6661 the symbols that need them. */
6662 if (g->global_gotsym != NULL
6663 && h->dynindx >= g->global_gotsym->dynindx)
6664 {
6665 bfd_vma offset;
6666 bfd_vma value;
6667
6eaa6adc 6668 value = sym->st_value;
f4416af6 6669 offset = mips_elf_global_got_index (dynobj, output_bfd, h);
b49e97c9
TS
6670 MIPS_ELF_PUT_WORD (output_bfd, value, sgot->contents + offset);
6671 }
6672
f4416af6
AO
6673 if (g->next && h->dynindx != -1)
6674 {
6675 struct mips_got_entry e, *p;
6676 bfd_vma offset;
6677 bfd_vma value;
6678 Elf_Internal_Rela rel[3];
6679 bfd_vma addend = 0;
6680
6681 gg = g;
6682
6683 e.abfd = output_bfd;
6684 e.symndx = -1;
6685 e.d.h = (struct mips_elf_link_hash_entry *)h;
143d77c5 6686
f4416af6
AO
6687 if (info->shared
6688 || h->root.type == bfd_link_hash_undefined
6689 || h->root.type == bfd_link_hash_undefweak)
6690 value = 0;
6691 else if (sym->st_value)
6692 value = sym->st_value;
6693 else
6694 value = h->root.u.def.value;
6695
6696 memset (rel, 0, sizeof (rel));
6697 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_REL32);
6698
6699 for (g = g->next; g->next != gg; g = g->next)
6700 {
6701 if (g->got_entries
6702 && (p = (struct mips_got_entry *) htab_find (g->got_entries,
6703 &e)))
6704 {
6705 offset = p->gotidx;
6706 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset = offset;
6707
6708 MIPS_ELF_PUT_WORD (output_bfd, value, sgot->contents + offset);
6709
6710 if ((info->shared
6711 || (elf_hash_table (info)->dynamic_sections_created
6712 && p->d.h != NULL
6713 && ((p->d.h->root.elf_link_hash_flags
6714 & ELF_LINK_HASH_DEF_DYNAMIC) != 0)
6715 && ((p->d.h->root.elf_link_hash_flags
6716 & ELF_LINK_HASH_DEF_REGULAR) == 0)))
6717 && ! (mips_elf_create_dynamic_relocation
6718 (output_bfd, info, rel,
6719 e.d.h, NULL, value, &addend, sgot)))
6720 return FALSE;
6721 BFD_ASSERT (addend == 0);
6722 }
6723 }
6724 }
6725
b49e97c9
TS
6726 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
6727 name = h->root.root.string;
6728 if (strcmp (name, "_DYNAMIC") == 0
6729 || strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
6730 sym->st_shndx = SHN_ABS;
6731 else if (strcmp (name, "_DYNAMIC_LINK") == 0
6732 || strcmp (name, "_DYNAMIC_LINKING") == 0)
6733 {
6734 sym->st_shndx = SHN_ABS;
6735 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
6736 sym->st_value = 1;
6737 }
4a14403c 6738 else if (strcmp (name, "_gp_disp") == 0 && ! NEWABI_P (output_bfd))
b49e97c9
TS
6739 {
6740 sym->st_shndx = SHN_ABS;
6741 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
6742 sym->st_value = elf_gp (output_bfd);
6743 }
6744 else if (SGI_COMPAT (output_bfd))
6745 {
6746 if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
6747 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
6748 {
6749 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
6750 sym->st_other = STO_PROTECTED;
6751 sym->st_value = 0;
6752 sym->st_shndx = SHN_MIPS_DATA;
6753 }
6754 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
6755 {
6756 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
6757 sym->st_other = STO_PROTECTED;
6758 sym->st_value = mips_elf_hash_table (info)->procedure_count;
6759 sym->st_shndx = SHN_ABS;
6760 }
6761 else if (sym->st_shndx != SHN_UNDEF && sym->st_shndx != SHN_ABS)
6762 {
6763 if (h->type == STT_FUNC)
6764 sym->st_shndx = SHN_MIPS_TEXT;
6765 else if (h->type == STT_OBJECT)
6766 sym->st_shndx = SHN_MIPS_DATA;
6767 }
6768 }
6769
6770 /* Handle the IRIX6-specific symbols. */
6771 if (IRIX_COMPAT (output_bfd) == ict_irix6)
6772 mips_elf_irix6_finish_dynamic_symbol (output_bfd, name, sym);
6773
6774 if (! info->shared)
6775 {
6776 if (! mips_elf_hash_table (info)->use_rld_obj_head
6777 && (strcmp (name, "__rld_map") == 0
6778 || strcmp (name, "__RLD_MAP") == 0))
6779 {
6780 asection *s = bfd_get_section_by_name (dynobj, ".rld_map");
6781 BFD_ASSERT (s != NULL);
6782 sym->st_value = s->output_section->vma + s->output_offset;
6783 bfd_put_32 (output_bfd, (bfd_vma) 0, s->contents);
6784 if (mips_elf_hash_table (info)->rld_value == 0)
6785 mips_elf_hash_table (info)->rld_value = sym->st_value;
6786 }
6787 else if (mips_elf_hash_table (info)->use_rld_obj_head
6788 && strcmp (name, "__rld_obj_head") == 0)
6789 {
6790 /* IRIX6 does not use a .rld_map section. */
6791 if (IRIX_COMPAT (output_bfd) == ict_irix5
6792 || IRIX_COMPAT (output_bfd) == ict_none)
6793 BFD_ASSERT (bfd_get_section_by_name (dynobj, ".rld_map")
6794 != NULL);
6795 mips_elf_hash_table (info)->rld_value = sym->st_value;
6796 }
6797 }
6798
6799 /* If this is a mips16 symbol, force the value to be even. */
6800 if (sym->st_other == STO_MIPS16
6801 && (sym->st_value & 1) != 0)
6802 --sym->st_value;
6803
b34976b6 6804 return TRUE;
b49e97c9
TS
6805}
6806
6807/* Finish up the dynamic sections. */
6808
b34976b6 6809bfd_boolean
b49e97c9
TS
6810_bfd_mips_elf_finish_dynamic_sections (output_bfd, info)
6811 bfd *output_bfd;
6812 struct bfd_link_info *info;
6813{
6814 bfd *dynobj;
6815 asection *sdyn;
6816 asection *sgot;
f4416af6 6817 struct mips_got_info *gg, *g;
b49e97c9
TS
6818
6819 dynobj = elf_hash_table (info)->dynobj;
6820
6821 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
6822
f4416af6 6823 sgot = mips_elf_got_section (dynobj, FALSE);
b49e97c9 6824 if (sgot == NULL)
f4416af6 6825 gg = g = NULL;
b49e97c9
TS
6826 else
6827 {
f4416af6
AO
6828 BFD_ASSERT (mips_elf_section_data (sgot) != NULL);
6829 gg = mips_elf_section_data (sgot)->u.got_info;
6830 BFD_ASSERT (gg != NULL);
6831 g = mips_elf_got_for_ibfd (gg, output_bfd);
b49e97c9
TS
6832 BFD_ASSERT (g != NULL);
6833 }
6834
6835 if (elf_hash_table (info)->dynamic_sections_created)
6836 {
6837 bfd_byte *b;
6838
6839 BFD_ASSERT (sdyn != NULL);
6840 BFD_ASSERT (g != NULL);
6841
6842 for (b = sdyn->contents;
6843 b < sdyn->contents + sdyn->_raw_size;
6844 b += MIPS_ELF_DYN_SIZE (dynobj))
6845 {
6846 Elf_Internal_Dyn dyn;
6847 const char *name;
6848 size_t elemsize;
6849 asection *s;
b34976b6 6850 bfd_boolean swap_out_p;
b49e97c9
TS
6851
6852 /* Read in the current dynamic entry. */
6853 (*get_elf_backend_data (dynobj)->s->swap_dyn_in) (dynobj, b, &dyn);
6854
6855 /* Assume that we're going to modify it and write it out. */
b34976b6 6856 swap_out_p = TRUE;
b49e97c9
TS
6857
6858 switch (dyn.d_tag)
6859 {
6860 case DT_RELENT:
f4416af6 6861 s = mips_elf_rel_dyn_section (dynobj, FALSE);
b49e97c9
TS
6862 BFD_ASSERT (s != NULL);
6863 dyn.d_un.d_val = MIPS_ELF_REL_SIZE (dynobj);
6864 break;
6865
6866 case DT_STRSZ:
6867 /* Rewrite DT_STRSZ. */
6868 dyn.d_un.d_val =
6869 _bfd_elf_strtab_size (elf_hash_table (info)->dynstr);
6870 break;
6871
6872 case DT_PLTGOT:
6873 name = ".got";
6874 goto get_vma;
6875 case DT_MIPS_CONFLICT:
6876 name = ".conflict";
6877 goto get_vma;
6878 case DT_MIPS_LIBLIST:
6879 name = ".liblist";
6880 get_vma:
6881 s = bfd_get_section_by_name (output_bfd, name);
6882 BFD_ASSERT (s != NULL);
6883 dyn.d_un.d_ptr = s->vma;
6884 break;
6885
6886 case DT_MIPS_RLD_VERSION:
6887 dyn.d_un.d_val = 1; /* XXX */
6888 break;
6889
6890 case DT_MIPS_FLAGS:
6891 dyn.d_un.d_val = RHF_NOTPOT; /* XXX */
6892 break;
6893
6894 case DT_MIPS_CONFLICTNO:
6895 name = ".conflict";
6896 elemsize = sizeof (Elf32_Conflict);
6897 goto set_elemno;
6898
6899 case DT_MIPS_LIBLISTNO:
6900 name = ".liblist";
6901 elemsize = sizeof (Elf32_Lib);
6902 set_elemno:
6903 s = bfd_get_section_by_name (output_bfd, name);
6904 if (s != NULL)
6905 {
6906 if (s->_cooked_size != 0)
6907 dyn.d_un.d_val = s->_cooked_size / elemsize;
6908 else
6909 dyn.d_un.d_val = s->_raw_size / elemsize;
6910 }
6911 else
6912 dyn.d_un.d_val = 0;
6913 break;
6914
6915 case DT_MIPS_TIME_STAMP:
6916 time ((time_t *) &dyn.d_un.d_val);
6917 break;
6918
6919 case DT_MIPS_ICHECKSUM:
6920 /* XXX FIXME: */
b34976b6 6921 swap_out_p = FALSE;
b49e97c9
TS
6922 break;
6923
6924 case DT_MIPS_IVERSION:
6925 /* XXX FIXME: */
b34976b6 6926 swap_out_p = FALSE;
b49e97c9
TS
6927 break;
6928
6929 case DT_MIPS_BASE_ADDRESS:
6930 s = output_bfd->sections;
6931 BFD_ASSERT (s != NULL);
6932 dyn.d_un.d_ptr = s->vma & ~(bfd_vma) 0xffff;
6933 break;
6934
6935 case DT_MIPS_LOCAL_GOTNO:
6936 dyn.d_un.d_val = g->local_gotno;
6937 break;
6938
6939 case DT_MIPS_UNREFEXTNO:
6940 /* The index into the dynamic symbol table which is the
6941 entry of the first external symbol that is not
6942 referenced within the same object. */
6943 dyn.d_un.d_val = bfd_count_sections (output_bfd) + 1;
6944 break;
6945
6946 case DT_MIPS_GOTSYM:
f4416af6 6947 if (gg->global_gotsym)
b49e97c9 6948 {
f4416af6 6949 dyn.d_un.d_val = gg->global_gotsym->dynindx;
b49e97c9
TS
6950 break;
6951 }
6952 /* In case if we don't have global got symbols we default
6953 to setting DT_MIPS_GOTSYM to the same value as
6954 DT_MIPS_SYMTABNO, so we just fall through. */
6955
6956 case DT_MIPS_SYMTABNO:
6957 name = ".dynsym";
6958 elemsize = MIPS_ELF_SYM_SIZE (output_bfd);
6959 s = bfd_get_section_by_name (output_bfd, name);
6960 BFD_ASSERT (s != NULL);
6961
6962 if (s->_cooked_size != 0)
6963 dyn.d_un.d_val = s->_cooked_size / elemsize;
6964 else
6965 dyn.d_un.d_val = s->_raw_size / elemsize;
6966 break;
6967
6968 case DT_MIPS_HIPAGENO:
6969 dyn.d_un.d_val = g->local_gotno - MIPS_RESERVED_GOTNO;
6970 break;
6971
6972 case DT_MIPS_RLD_MAP:
6973 dyn.d_un.d_ptr = mips_elf_hash_table (info)->rld_value;
6974 break;
6975
6976 case DT_MIPS_OPTIONS:
6977 s = (bfd_get_section_by_name
6978 (output_bfd, MIPS_ELF_OPTIONS_SECTION_NAME (output_bfd)));
6979 dyn.d_un.d_ptr = s->vma;
6980 break;
6981
6982 case DT_MIPS_MSYM:
6983 s = (bfd_get_section_by_name (output_bfd, ".msym"));
6984 dyn.d_un.d_ptr = s->vma;
6985 break;
6986
6987 default:
b34976b6 6988 swap_out_p = FALSE;
b49e97c9
TS
6989 break;
6990 }
6991
6992 if (swap_out_p)
6993 (*get_elf_backend_data (dynobj)->s->swap_dyn_out)
6994 (dynobj, &dyn, b);
6995 }
6996 }
6997
6998 /* The first entry of the global offset table will be filled at
6999 runtime. The second entry will be used by some runtime loaders.
8dc1a139 7000 This isn't the case of IRIX rld. */
b49e97c9
TS
7001 if (sgot != NULL && sgot->_raw_size > 0)
7002 {
7003 MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0, sgot->contents);
7004 MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0x80000000,
7005 sgot->contents + MIPS_ELF_GOT_SIZE (output_bfd));
7006 }
7007
7008 if (sgot != NULL)
7009 elf_section_data (sgot->output_section)->this_hdr.sh_entsize
7010 = MIPS_ELF_GOT_SIZE (output_bfd);
7011
f4416af6
AO
7012 /* Generate dynamic relocations for the non-primary gots. */
7013 if (gg != NULL && gg->next)
7014 {
7015 Elf_Internal_Rela rel[3];
7016 bfd_vma addend = 0;
7017
7018 memset (rel, 0, sizeof (rel));
7019 rel[0].r_info = ELF_R_INFO (output_bfd, 0, R_MIPS_REL32);
7020
7021 for (g = gg->next; g->next != gg; g = g->next)
7022 {
7023 bfd_vma index = g->next->local_gotno + g->next->global_gotno;
7024
7025 MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0, sgot->contents
7026 + index++ * MIPS_ELF_GOT_SIZE (output_bfd));
7027 MIPS_ELF_PUT_WORD (output_bfd, (bfd_vma) 0x80000000, sgot->contents
7028 + index++ * MIPS_ELF_GOT_SIZE (output_bfd));
7029
7030 if (! info->shared)
7031 continue;
7032
7033 while (index < g->assigned_gotno)
7034 {
7035 rel[0].r_offset = rel[1].r_offset = rel[2].r_offset
7036 = index++ * MIPS_ELF_GOT_SIZE (output_bfd);
7037 if (!(mips_elf_create_dynamic_relocation
7038 (output_bfd, info, rel, NULL,
7039 bfd_abs_section_ptr,
7040 0, &addend, sgot)))
7041 return FALSE;
7042 BFD_ASSERT (addend == 0);
7043 }
7044 }
7045 }
7046
b49e97c9 7047 {
b49e97c9
TS
7048 asection *s;
7049 Elf32_compact_rel cpt;
7050
b49e97c9
TS
7051 if (SGI_COMPAT (output_bfd))
7052 {
7053 /* Write .compact_rel section out. */
7054 s = bfd_get_section_by_name (dynobj, ".compact_rel");
7055 if (s != NULL)
7056 {
7057 cpt.id1 = 1;
7058 cpt.num = s->reloc_count;
7059 cpt.id2 = 2;
7060 cpt.offset = (s->output_section->filepos
7061 + sizeof (Elf32_External_compact_rel));
7062 cpt.reserved0 = 0;
7063 cpt.reserved1 = 0;
7064 bfd_elf32_swap_compact_rel_out (output_bfd, &cpt,
7065 ((Elf32_External_compact_rel *)
7066 s->contents));
7067
7068 /* Clean up a dummy stub function entry in .text. */
7069 s = bfd_get_section_by_name (dynobj,
7070 MIPS_ELF_STUB_SECTION_NAME (dynobj));
7071 if (s != NULL)
7072 {
7073 file_ptr dummy_offset;
7074
7075 BFD_ASSERT (s->_raw_size >= MIPS_FUNCTION_STUB_SIZE);
7076 dummy_offset = s->_raw_size - MIPS_FUNCTION_STUB_SIZE;
7077 memset (s->contents + dummy_offset, 0,
7078 MIPS_FUNCTION_STUB_SIZE);
7079 }
7080 }
7081 }
7082
7083 /* We need to sort the entries of the dynamic relocation section. */
7084
f4416af6
AO
7085 s = mips_elf_rel_dyn_section (dynobj, FALSE);
7086
7087 if (s != NULL
7088 && s->_raw_size > (bfd_vma)2 * MIPS_ELF_REL_SIZE (output_bfd))
b49e97c9 7089 {
f4416af6 7090 reldyn_sorting_bfd = output_bfd;
b49e97c9 7091
f4416af6
AO
7092 if (ABI_64_P (output_bfd))
7093 qsort ((Elf64_External_Rel *) s->contents + 1,
7094 (size_t) s->reloc_count - 1,
7095 sizeof (Elf64_Mips_External_Rel), sort_dynamic_relocs_64);
7096 else
7097 qsort ((Elf32_External_Rel *) s->contents + 1,
7098 (size_t) s->reloc_count - 1,
7099 sizeof (Elf32_External_Rel), sort_dynamic_relocs);
b49e97c9 7100 }
b49e97c9
TS
7101 }
7102
b34976b6 7103 return TRUE;
b49e97c9
TS
7104}
7105
b49e97c9 7106
64543e1a
RS
7107/* Set ABFD's EF_MIPS_ARCH and EF_MIPS_MACH flags. */
7108
7109static void
7110mips_set_isa_flags (abfd)
b49e97c9 7111 bfd *abfd;
b49e97c9 7112{
64543e1a 7113 flagword val;
b49e97c9
TS
7114
7115 switch (bfd_get_mach (abfd))
7116 {
7117 default:
7118 case bfd_mach_mips3000:
7119 val = E_MIPS_ARCH_1;
7120 break;
7121
7122 case bfd_mach_mips3900:
7123 val = E_MIPS_ARCH_1 | E_MIPS_MACH_3900;
7124 break;
7125
7126 case bfd_mach_mips6000:
7127 val = E_MIPS_ARCH_2;
7128 break;
7129
7130 case bfd_mach_mips4000:
7131 case bfd_mach_mips4300:
7132 case bfd_mach_mips4400:
7133 case bfd_mach_mips4600:
7134 val = E_MIPS_ARCH_3;
7135 break;
7136
7137 case bfd_mach_mips4010:
7138 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4010;
7139 break;
7140
7141 case bfd_mach_mips4100:
7142 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4100;
7143 break;
7144
7145 case bfd_mach_mips4111:
7146 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4111;
7147 break;
7148
00707a0e
RS
7149 case bfd_mach_mips4120:
7150 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4120;
7151 break;
7152
b49e97c9
TS
7153 case bfd_mach_mips4650:
7154 val = E_MIPS_ARCH_3 | E_MIPS_MACH_4650;
7155 break;
7156
00707a0e
RS
7157 case bfd_mach_mips5400:
7158 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5400;
7159 break;
7160
7161 case bfd_mach_mips5500:
7162 val = E_MIPS_ARCH_4 | E_MIPS_MACH_5500;
7163 break;
7164
b49e97c9 7165 case bfd_mach_mips5000:
5a7ea749 7166 case bfd_mach_mips7000:
b49e97c9
TS
7167 case bfd_mach_mips8000:
7168 case bfd_mach_mips10000:
7169 case bfd_mach_mips12000:
7170 val = E_MIPS_ARCH_4;
7171 break;
7172
7173 case bfd_mach_mips5:
7174 val = E_MIPS_ARCH_5;
7175 break;
7176
7177 case bfd_mach_mips_sb1:
7178 val = E_MIPS_ARCH_64 | E_MIPS_MACH_SB1;
7179 break;
7180
7181 case bfd_mach_mipsisa32:
7182 val = E_MIPS_ARCH_32;
7183 break;
7184
7185 case bfd_mach_mipsisa64:
7186 val = E_MIPS_ARCH_64;
af7ee8bf
CD
7187 break;
7188
7189 case bfd_mach_mipsisa32r2:
7190 val = E_MIPS_ARCH_32R2;
7191 break;
b49e97c9 7192 }
b49e97c9
TS
7193 elf_elfheader (abfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
7194 elf_elfheader (abfd)->e_flags |= val;
7195
64543e1a
RS
7196}
7197
7198
7199/* The final processing done just before writing out a MIPS ELF object
7200 file. This gets the MIPS architecture right based on the machine
7201 number. This is used by both the 32-bit and the 64-bit ABI. */
7202
7203void
7204_bfd_mips_elf_final_write_processing (abfd, linker)
7205 bfd *abfd;
7206 bfd_boolean linker ATTRIBUTE_UNUSED;
7207{
7208 unsigned int i;
7209 Elf_Internal_Shdr **hdrpp;
7210 const char *name;
7211 asection *sec;
7212
7213 /* Keep the existing EF_MIPS_MACH and EF_MIPS_ARCH flags if the former
7214 is nonzero. This is for compatibility with old objects, which used
7215 a combination of a 32-bit EF_MIPS_ARCH and a 64-bit EF_MIPS_MACH. */
7216 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_MACH) == 0)
7217 mips_set_isa_flags (abfd);
7218
b49e97c9
TS
7219 /* Set the sh_info field for .gptab sections and other appropriate
7220 info for each special section. */
7221 for (i = 1, hdrpp = elf_elfsections (abfd) + 1;
7222 i < elf_numsections (abfd);
7223 i++, hdrpp++)
7224 {
7225 switch ((*hdrpp)->sh_type)
7226 {
7227 case SHT_MIPS_MSYM:
7228 case SHT_MIPS_LIBLIST:
7229 sec = bfd_get_section_by_name (abfd, ".dynstr");
7230 if (sec != NULL)
7231 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
7232 break;
7233
7234 case SHT_MIPS_GPTAB:
7235 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
7236 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
7237 BFD_ASSERT (name != NULL
7238 && strncmp (name, ".gptab.", sizeof ".gptab." - 1) == 0);
7239 sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
7240 BFD_ASSERT (sec != NULL);
7241 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
7242 break;
7243
7244 case SHT_MIPS_CONTENT:
7245 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
7246 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
7247 BFD_ASSERT (name != NULL
7248 && strncmp (name, ".MIPS.content",
7249 sizeof ".MIPS.content" - 1) == 0);
7250 sec = bfd_get_section_by_name (abfd,
7251 name + sizeof ".MIPS.content" - 1);
7252 BFD_ASSERT (sec != NULL);
7253 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
7254 break;
7255
7256 case SHT_MIPS_SYMBOL_LIB:
7257 sec = bfd_get_section_by_name (abfd, ".dynsym");
7258 if (sec != NULL)
7259 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
7260 sec = bfd_get_section_by_name (abfd, ".liblist");
7261 if (sec != NULL)
7262 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
7263 break;
7264
7265 case SHT_MIPS_EVENTS:
7266 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
7267 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
7268 BFD_ASSERT (name != NULL);
7269 if (strncmp (name, ".MIPS.events", sizeof ".MIPS.events" - 1) == 0)
7270 sec = bfd_get_section_by_name (abfd,
7271 name + sizeof ".MIPS.events" - 1);
7272 else
7273 {
7274 BFD_ASSERT (strncmp (name, ".MIPS.post_rel",
7275 sizeof ".MIPS.post_rel" - 1) == 0);
7276 sec = bfd_get_section_by_name (abfd,
7277 (name
7278 + sizeof ".MIPS.post_rel" - 1));
7279 }
7280 BFD_ASSERT (sec != NULL);
7281 (*hdrpp)->sh_link = elf_section_data (sec)->this_idx;
7282 break;
7283
7284 }
7285 }
7286}
7287\f
8dc1a139 7288/* When creating an IRIX5 executable, we need REGINFO and RTPROC
b49e97c9
TS
7289 segments. */
7290
7291int
7292_bfd_mips_elf_additional_program_headers (abfd)
7293 bfd *abfd;
7294{
7295 asection *s;
7296 int ret = 0;
7297
7298 /* See if we need a PT_MIPS_REGINFO segment. */
7299 s = bfd_get_section_by_name (abfd, ".reginfo");
7300 if (s && (s->flags & SEC_LOAD))
7301 ++ret;
7302
7303 /* See if we need a PT_MIPS_OPTIONS segment. */
7304 if (IRIX_COMPAT (abfd) == ict_irix6
7305 && bfd_get_section_by_name (abfd,
7306 MIPS_ELF_OPTIONS_SECTION_NAME (abfd)))
7307 ++ret;
7308
7309 /* See if we need a PT_MIPS_RTPROC segment. */
7310 if (IRIX_COMPAT (abfd) == ict_irix5
7311 && bfd_get_section_by_name (abfd, ".dynamic")
7312 && bfd_get_section_by_name (abfd, ".mdebug"))
7313 ++ret;
7314
7315 return ret;
7316}
7317
8dc1a139 7318/* Modify the segment map for an IRIX5 executable. */
b49e97c9 7319
b34976b6 7320bfd_boolean
b49e97c9
TS
7321_bfd_mips_elf_modify_segment_map (abfd)
7322 bfd *abfd;
7323{
7324 asection *s;
7325 struct elf_segment_map *m, **pm;
7326 bfd_size_type amt;
7327
7328 /* If there is a .reginfo section, we need a PT_MIPS_REGINFO
7329 segment. */
7330 s = bfd_get_section_by_name (abfd, ".reginfo");
7331 if (s != NULL && (s->flags & SEC_LOAD) != 0)
7332 {
7333 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
7334 if (m->p_type == PT_MIPS_REGINFO)
7335 break;
7336 if (m == NULL)
7337 {
7338 amt = sizeof *m;
7339 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
7340 if (m == NULL)
b34976b6 7341 return FALSE;
b49e97c9
TS
7342
7343 m->p_type = PT_MIPS_REGINFO;
7344 m->count = 1;
7345 m->sections[0] = s;
7346
7347 /* We want to put it after the PHDR and INTERP segments. */
7348 pm = &elf_tdata (abfd)->segment_map;
7349 while (*pm != NULL
7350 && ((*pm)->p_type == PT_PHDR
7351 || (*pm)->p_type == PT_INTERP))
7352 pm = &(*pm)->next;
7353
7354 m->next = *pm;
7355 *pm = m;
7356 }
7357 }
7358
7359 /* For IRIX 6, we don't have .mdebug sections, nor does anything but
7360 .dynamic end up in PT_DYNAMIC. However, we do have to insert a
44c410de 7361 PT_OPTIONS segment immediately following the program header
b49e97c9 7362 table. */
c1fd6598
AO
7363 if (NEWABI_P (abfd)
7364 /* On non-IRIX6 new abi, we'll have already created a segment
7365 for this section, so don't create another. I'm not sure this
7366 is not also the case for IRIX 6, but I can't test it right
7367 now. */
7368 && IRIX_COMPAT (abfd) == ict_irix6)
b49e97c9
TS
7369 {
7370 for (s = abfd->sections; s; s = s->next)
7371 if (elf_section_data (s)->this_hdr.sh_type == SHT_MIPS_OPTIONS)
7372 break;
7373
7374 if (s)
7375 {
7376 struct elf_segment_map *options_segment;
7377
7378 /* Usually, there's a program header table. But, sometimes
7379 there's not (like when running the `ld' testsuite). So,
7380 if there's no program header table, we just put the
44c410de 7381 options segment at the end. */
b49e97c9
TS
7382 for (pm = &elf_tdata (abfd)->segment_map;
7383 *pm != NULL;
7384 pm = &(*pm)->next)
7385 if ((*pm)->p_type == PT_PHDR)
7386 break;
7387
7388 amt = sizeof (struct elf_segment_map);
7389 options_segment = bfd_zalloc (abfd, amt);
7390 options_segment->next = *pm;
7391 options_segment->p_type = PT_MIPS_OPTIONS;
7392 options_segment->p_flags = PF_R;
b34976b6 7393 options_segment->p_flags_valid = TRUE;
b49e97c9
TS
7394 options_segment->count = 1;
7395 options_segment->sections[0] = s;
7396 *pm = options_segment;
7397 }
7398 }
7399 else
7400 {
7401 if (IRIX_COMPAT (abfd) == ict_irix5)
7402 {
7403 /* If there are .dynamic and .mdebug sections, we make a room
7404 for the RTPROC header. FIXME: Rewrite without section names. */
7405 if (bfd_get_section_by_name (abfd, ".interp") == NULL
7406 && bfd_get_section_by_name (abfd, ".dynamic") != NULL
7407 && bfd_get_section_by_name (abfd, ".mdebug") != NULL)
7408 {
7409 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
7410 if (m->p_type == PT_MIPS_RTPROC)
7411 break;
7412 if (m == NULL)
7413 {
7414 amt = sizeof *m;
7415 m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
7416 if (m == NULL)
b34976b6 7417 return FALSE;
b49e97c9
TS
7418
7419 m->p_type = PT_MIPS_RTPROC;
7420
7421 s = bfd_get_section_by_name (abfd, ".rtproc");
7422 if (s == NULL)
7423 {
7424 m->count = 0;
7425 m->p_flags = 0;
7426 m->p_flags_valid = 1;
7427 }
7428 else
7429 {
7430 m->count = 1;
7431 m->sections[0] = s;
7432 }
7433
7434 /* We want to put it after the DYNAMIC segment. */
7435 pm = &elf_tdata (abfd)->segment_map;
7436 while (*pm != NULL && (*pm)->p_type != PT_DYNAMIC)
7437 pm = &(*pm)->next;
7438 if (*pm != NULL)
7439 pm = &(*pm)->next;
7440
7441 m->next = *pm;
7442 *pm = m;
7443 }
7444 }
7445 }
8dc1a139 7446 /* On IRIX5, the PT_DYNAMIC segment includes the .dynamic,
b49e97c9
TS
7447 .dynstr, .dynsym, and .hash sections, and everything in
7448 between. */
7449 for (pm = &elf_tdata (abfd)->segment_map; *pm != NULL;
7450 pm = &(*pm)->next)
7451 if ((*pm)->p_type == PT_DYNAMIC)
7452 break;
7453 m = *pm;
7454 if (m != NULL && IRIX_COMPAT (abfd) == ict_none)
7455 {
7456 /* For a normal mips executable the permissions for the PT_DYNAMIC
7457 segment are read, write and execute. We do that here since
7458 the code in elf.c sets only the read permission. This matters
7459 sometimes for the dynamic linker. */
7460 if (bfd_get_section_by_name (abfd, ".dynamic") != NULL)
7461 {
7462 m->p_flags = PF_R | PF_W | PF_X;
7463 m->p_flags_valid = 1;
7464 }
7465 }
7466 if (m != NULL
7467 && m->count == 1 && strcmp (m->sections[0]->name, ".dynamic") == 0)
7468 {
7469 static const char *sec_names[] =
7470 {
7471 ".dynamic", ".dynstr", ".dynsym", ".hash"
7472 };
7473 bfd_vma low, high;
7474 unsigned int i, c;
7475 struct elf_segment_map *n;
7476
7477 low = 0xffffffff;
7478 high = 0;
7479 for (i = 0; i < sizeof sec_names / sizeof sec_names[0]; i++)
7480 {
7481 s = bfd_get_section_by_name (abfd, sec_names[i]);
7482 if (s != NULL && (s->flags & SEC_LOAD) != 0)
7483 {
7484 bfd_size_type sz;
7485
7486 if (low > s->vma)
7487 low = s->vma;
7488 sz = s->_cooked_size;
7489 if (sz == 0)
7490 sz = s->_raw_size;
7491 if (high < s->vma + sz)
7492 high = s->vma + sz;
7493 }
7494 }
7495
7496 c = 0;
7497 for (s = abfd->sections; s != NULL; s = s->next)
7498 if ((s->flags & SEC_LOAD) != 0
7499 && s->vma >= low
7500 && ((s->vma
7501 + (s->_cooked_size !=
7502 0 ? s->_cooked_size : s->_raw_size)) <= high))
7503 ++c;
7504
7505 amt = sizeof *n + (bfd_size_type) (c - 1) * sizeof (asection *);
7506 n = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
7507 if (n == NULL)
b34976b6 7508 return FALSE;
b49e97c9
TS
7509 *n = *m;
7510 n->count = c;
7511
7512 i = 0;
7513 for (s = abfd->sections; s != NULL; s = s->next)
7514 {
7515 if ((s->flags & SEC_LOAD) != 0
7516 && s->vma >= low
7517 && ((s->vma
7518 + (s->_cooked_size != 0 ?
7519 s->_cooked_size : s->_raw_size)) <= high))
7520 {
7521 n->sections[i] = s;
7522 ++i;
7523 }
7524 }
7525
7526 *pm = n;
7527 }
7528 }
7529
b34976b6 7530 return TRUE;
b49e97c9
TS
7531}
7532\f
7533/* Return the section that should be marked against GC for a given
7534 relocation. */
7535
7536asection *
1e2f5b6e
AM
7537_bfd_mips_elf_gc_mark_hook (sec, info, rel, h, sym)
7538 asection *sec;
b49e97c9
TS
7539 struct bfd_link_info *info ATTRIBUTE_UNUSED;
7540 Elf_Internal_Rela *rel;
7541 struct elf_link_hash_entry *h;
7542 Elf_Internal_Sym *sym;
7543{
7544 /* ??? Do mips16 stub sections need to be handled special? */
7545
7546 if (h != NULL)
7547 {
1e2f5b6e 7548 switch (ELF_R_TYPE (sec->owner, rel->r_info))
b49e97c9
TS
7549 {
7550 case R_MIPS_GNU_VTINHERIT:
7551 case R_MIPS_GNU_VTENTRY:
7552 break;
7553
7554 default:
7555 switch (h->root.type)
7556 {
7557 case bfd_link_hash_defined:
7558 case bfd_link_hash_defweak:
7559 return h->root.u.def.section;
7560
7561 case bfd_link_hash_common:
7562 return h->root.u.c.p->section;
7563
7564 default:
7565 break;
7566 }
7567 }
7568 }
7569 else
1e2f5b6e 7570 return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
b49e97c9
TS
7571
7572 return NULL;
7573}
7574
7575/* Update the got entry reference counts for the section being removed. */
7576
b34976b6 7577bfd_boolean
b49e97c9
TS
7578_bfd_mips_elf_gc_sweep_hook (abfd, info, sec, relocs)
7579 bfd *abfd ATTRIBUTE_UNUSED;
7580 struct bfd_link_info *info ATTRIBUTE_UNUSED;
7581 asection *sec ATTRIBUTE_UNUSED;
7582 const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED;
7583{
7584#if 0
7585 Elf_Internal_Shdr *symtab_hdr;
7586 struct elf_link_hash_entry **sym_hashes;
7587 bfd_signed_vma *local_got_refcounts;
7588 const Elf_Internal_Rela *rel, *relend;
7589 unsigned long r_symndx;
7590 struct elf_link_hash_entry *h;
7591
7592 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
7593 sym_hashes = elf_sym_hashes (abfd);
7594 local_got_refcounts = elf_local_got_refcounts (abfd);
7595
7596 relend = relocs + sec->reloc_count;
7597 for (rel = relocs; rel < relend; rel++)
7598 switch (ELF_R_TYPE (abfd, rel->r_info))
7599 {
7600 case R_MIPS_GOT16:
7601 case R_MIPS_CALL16:
7602 case R_MIPS_CALL_HI16:
7603 case R_MIPS_CALL_LO16:
7604 case R_MIPS_GOT_HI16:
7605 case R_MIPS_GOT_LO16:
4a14403c
TS
7606 case R_MIPS_GOT_DISP:
7607 case R_MIPS_GOT_PAGE:
7608 case R_MIPS_GOT_OFST:
b49e97c9
TS
7609 /* ??? It would seem that the existing MIPS code does no sort
7610 of reference counting or whatnot on its GOT and PLT entries,
7611 so it is not possible to garbage collect them at this time. */
7612 break;
7613
7614 default:
7615 break;
7616 }
7617#endif
7618
b34976b6 7619 return TRUE;
b49e97c9
TS
7620}
7621\f
7622/* Copy data from a MIPS ELF indirect symbol to its direct symbol,
7623 hiding the old indirect symbol. Process additional relocation
7624 information. Also called for weakdefs, in which case we just let
7625 _bfd_elf_link_hash_copy_indirect copy the flags for us. */
7626
7627void
b48fa14c 7628_bfd_mips_elf_copy_indirect_symbol (bed, dir, ind)
9c5bfbb7 7629 const struct elf_backend_data *bed;
b49e97c9
TS
7630 struct elf_link_hash_entry *dir, *ind;
7631{
7632 struct mips_elf_link_hash_entry *dirmips, *indmips;
7633
b48fa14c 7634 _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
b49e97c9
TS
7635
7636 if (ind->root.type != bfd_link_hash_indirect)
7637 return;
7638
7639 dirmips = (struct mips_elf_link_hash_entry *) dir;
7640 indmips = (struct mips_elf_link_hash_entry *) ind;
7641 dirmips->possibly_dynamic_relocs += indmips->possibly_dynamic_relocs;
7642 if (indmips->readonly_reloc)
b34976b6 7643 dirmips->readonly_reloc = TRUE;
b49e97c9 7644 if (indmips->no_fn_stub)
b34976b6 7645 dirmips->no_fn_stub = TRUE;
b49e97c9
TS
7646}
7647
7648void
7649_bfd_mips_elf_hide_symbol (info, entry, force_local)
7650 struct bfd_link_info *info;
7651 struct elf_link_hash_entry *entry;
b34976b6 7652 bfd_boolean force_local;
b49e97c9
TS
7653{
7654 bfd *dynobj;
7655 asection *got;
7656 struct mips_got_info *g;
7657 struct mips_elf_link_hash_entry *h;
7c5fcef7 7658
b49e97c9 7659 h = (struct mips_elf_link_hash_entry *) entry;
7c5fcef7
L
7660 if (h->forced_local)
7661 return;
4b555070 7662 h->forced_local = force_local;
7c5fcef7 7663
b49e97c9 7664 dynobj = elf_hash_table (info)->dynobj;
4b555070 7665 if (dynobj != NULL && force_local)
f4416af6 7666 {
c45a316a
AM
7667 got = mips_elf_got_section (dynobj, FALSE);
7668 g = mips_elf_section_data (got)->u.got_info;
f4416af6 7669
c45a316a
AM
7670 if (g->next)
7671 {
7672 struct mips_got_entry e;
7673 struct mips_got_info *gg = g;
7674
7675 /* Since we're turning what used to be a global symbol into a
7676 local one, bump up the number of local entries of each GOT
7677 that had an entry for it. This will automatically decrease
7678 the number of global entries, since global_gotno is actually
7679 the upper limit of global entries. */
7680 e.abfd = dynobj;
7681 e.symndx = -1;
7682 e.d.h = h;
7683
7684 for (g = g->next; g != gg; g = g->next)
7685 if (htab_find (g->got_entries, &e))
7686 {
7687 BFD_ASSERT (g->global_gotno > 0);
7688 g->local_gotno++;
7689 g->global_gotno--;
7690 }
b49e97c9 7691
c45a316a
AM
7692 /* If this was a global symbol forced into the primary GOT, we
7693 no longer need an entry for it. We can't release the entry
7694 at this point, but we must at least stop counting it as one
7695 of the symbols that required a forced got entry. */
7696 if (h->root.got.offset == 2)
7697 {
7698 BFD_ASSERT (gg->assigned_gotno > 0);
7699 gg->assigned_gotno--;
7700 }
7701 }
7702 else if (g->global_gotno == 0 && g->global_gotsym == NULL)
7703 /* If we haven't got through GOT allocation yet, just bump up the
7704 number of local entries, as this symbol won't be counted as
7705 global. */
7706 g->local_gotno++;
7707 else if (h->root.got.offset == 1)
f4416af6 7708 {
c45a316a
AM
7709 /* If we're past non-multi-GOT allocation and this symbol had
7710 been marked for a global got entry, give it a local entry
7711 instead. */
7712 BFD_ASSERT (g->global_gotno > 0);
7713 g->local_gotno++;
7714 g->global_gotno--;
f4416af6
AO
7715 }
7716 }
f4416af6
AO
7717
7718 _bfd_elf_link_hash_hide_symbol (info, &h->root, force_local);
b49e97c9
TS
7719}
7720\f
d01414a5
TS
7721#define PDR_SIZE 32
7722
b34976b6 7723bfd_boolean
d01414a5
TS
7724_bfd_mips_elf_discard_info (abfd, cookie, info)
7725 bfd *abfd;
7726 struct elf_reloc_cookie *cookie;
7727 struct bfd_link_info *info;
7728{
7729 asection *o;
b34976b6 7730 bfd_boolean ret = FALSE;
d01414a5
TS
7731 unsigned char *tdata;
7732 size_t i, skip;
7733
7734 o = bfd_get_section_by_name (abfd, ".pdr");
7735 if (! o)
b34976b6 7736 return FALSE;
d01414a5 7737 if (o->_raw_size == 0)
b34976b6 7738 return FALSE;
d01414a5 7739 if (o->_raw_size % PDR_SIZE != 0)
b34976b6 7740 return FALSE;
d01414a5
TS
7741 if (o->output_section != NULL
7742 && bfd_is_abs_section (o->output_section))
b34976b6 7743 return FALSE;
d01414a5
TS
7744
7745 tdata = bfd_zmalloc (o->_raw_size / PDR_SIZE);
7746 if (! tdata)
b34976b6 7747 return FALSE;
d01414a5 7748
45d6a902
AM
7749 cookie->rels = _bfd_elf_link_read_relocs (abfd, o, (PTR) NULL,
7750 (Elf_Internal_Rela *) NULL,
7751 info->keep_memory);
d01414a5
TS
7752 if (!cookie->rels)
7753 {
7754 free (tdata);
b34976b6 7755 return FALSE;
d01414a5
TS
7756 }
7757
7758 cookie->rel = cookie->rels;
7759 cookie->relend = cookie->rels + o->reloc_count;
7760
c9c27aad 7761 for (i = 0, skip = 0; i < o->_raw_size / PDR_SIZE; i ++)
d01414a5 7762 {
ee6423ed 7763 if (MNAME(abfd,_bfd_elf,reloc_symbol_deleted_p) (i * PDR_SIZE, cookie))
d01414a5
TS
7764 {
7765 tdata[i] = 1;
7766 skip ++;
7767 }
7768 }
7769
7770 if (skip != 0)
7771 {
f0abc2a1 7772 mips_elf_section_data (o)->u.tdata = tdata;
d01414a5 7773 o->_cooked_size = o->_raw_size - skip * PDR_SIZE;
b34976b6 7774 ret = TRUE;
d01414a5
TS
7775 }
7776 else
7777 free (tdata);
7778
7779 if (! info->keep_memory)
7780 free (cookie->rels);
7781
7782 return ret;
7783}
7784
b34976b6 7785bfd_boolean
53bfd6b4
MR
7786_bfd_mips_elf_ignore_discarded_relocs (sec)
7787 asection *sec;
7788{
7789 if (strcmp (sec->name, ".pdr") == 0)
b34976b6
AM
7790 return TRUE;
7791 return FALSE;
53bfd6b4 7792}
d01414a5 7793
b34976b6 7794bfd_boolean
d01414a5
TS
7795_bfd_mips_elf_write_section (output_bfd, sec, contents)
7796 bfd *output_bfd;
7797 asection *sec;
7798 bfd_byte *contents;
7799{
7800 bfd_byte *to, *from, *end;
7801 int i;
7802
7803 if (strcmp (sec->name, ".pdr") != 0)
b34976b6 7804 return FALSE;
d01414a5 7805
f0abc2a1 7806 if (mips_elf_section_data (sec)->u.tdata == NULL)
b34976b6 7807 return FALSE;
d01414a5
TS
7808
7809 to = contents;
7810 end = contents + sec->_raw_size;
7811 for (from = contents, i = 0;
7812 from < end;
7813 from += PDR_SIZE, i++)
7814 {
f0abc2a1 7815 if ((mips_elf_section_data (sec)->u.tdata)[i] == 1)
d01414a5
TS
7816 continue;
7817 if (to != from)
7818 memcpy (to, from, PDR_SIZE);
7819 to += PDR_SIZE;
7820 }
7821 bfd_set_section_contents (output_bfd, sec->output_section, contents,
7822 (file_ptr) sec->output_offset,
7823 sec->_cooked_size);
b34976b6 7824 return TRUE;
d01414a5 7825}
53bfd6b4 7826\f
b49e97c9
TS
7827/* MIPS ELF uses a special find_nearest_line routine in order the
7828 handle the ECOFF debugging information. */
7829
7830struct mips_elf_find_line
7831{
7832 struct ecoff_debug_info d;
7833 struct ecoff_find_line i;
7834};
7835
b34976b6 7836bfd_boolean
b49e97c9
TS
7837_bfd_mips_elf_find_nearest_line (abfd, section, symbols, offset, filename_ptr,
7838 functionname_ptr, line_ptr)
7839 bfd *abfd;
7840 asection *section;
7841 asymbol **symbols;
7842 bfd_vma offset;
7843 const char **filename_ptr;
7844 const char **functionname_ptr;
7845 unsigned int *line_ptr;
7846{
7847 asection *msec;
7848
7849 if (_bfd_dwarf1_find_nearest_line (abfd, section, symbols, offset,
7850 filename_ptr, functionname_ptr,
7851 line_ptr))
b34976b6 7852 return TRUE;
b49e97c9
TS
7853
7854 if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
7855 filename_ptr, functionname_ptr,
7856 line_ptr,
7857 (unsigned) (ABI_64_P (abfd) ? 8 : 0),
7858 &elf_tdata (abfd)->dwarf2_find_line_info))
b34976b6 7859 return TRUE;
b49e97c9
TS
7860
7861 msec = bfd_get_section_by_name (abfd, ".mdebug");
7862 if (msec != NULL)
7863 {
7864 flagword origflags;
7865 struct mips_elf_find_line *fi;
7866 const struct ecoff_debug_swap * const swap =
7867 get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
7868
7869 /* If we are called during a link, mips_elf_final_link may have
7870 cleared the SEC_HAS_CONTENTS field. We force it back on here
7871 if appropriate (which it normally will be). */
7872 origflags = msec->flags;
7873 if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
7874 msec->flags |= SEC_HAS_CONTENTS;
7875
7876 fi = elf_tdata (abfd)->find_line_info;
7877 if (fi == NULL)
7878 {
7879 bfd_size_type external_fdr_size;
7880 char *fraw_src;
7881 char *fraw_end;
7882 struct fdr *fdr_ptr;
7883 bfd_size_type amt = sizeof (struct mips_elf_find_line);
7884
7885 fi = (struct mips_elf_find_line *) bfd_zalloc (abfd, amt);
7886 if (fi == NULL)
7887 {
7888 msec->flags = origflags;
b34976b6 7889 return FALSE;
b49e97c9
TS
7890 }
7891
7892 if (! _bfd_mips_elf_read_ecoff_info (abfd, msec, &fi->d))
7893 {
7894 msec->flags = origflags;
b34976b6 7895 return FALSE;
b49e97c9
TS
7896 }
7897
7898 /* Swap in the FDR information. */
7899 amt = fi->d.symbolic_header.ifdMax * sizeof (struct fdr);
7900 fi->d.fdr = (struct fdr *) bfd_alloc (abfd, amt);
7901 if (fi->d.fdr == NULL)
7902 {
7903 msec->flags = origflags;
b34976b6 7904 return FALSE;
b49e97c9
TS
7905 }
7906 external_fdr_size = swap->external_fdr_size;
7907 fdr_ptr = fi->d.fdr;
7908 fraw_src = (char *) fi->d.external_fdr;
7909 fraw_end = (fraw_src
7910 + fi->d.symbolic_header.ifdMax * external_fdr_size);
7911 for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
7912 (*swap->swap_fdr_in) (abfd, (PTR) fraw_src, fdr_ptr);
7913
7914 elf_tdata (abfd)->find_line_info = fi;
7915
7916 /* Note that we don't bother to ever free this information.
7917 find_nearest_line is either called all the time, as in
7918 objdump -l, so the information should be saved, or it is
7919 rarely called, as in ld error messages, so the memory
7920 wasted is unimportant. Still, it would probably be a
7921 good idea for free_cached_info to throw it away. */
7922 }
7923
7924 if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
7925 &fi->i, filename_ptr, functionname_ptr,
7926 line_ptr))
7927 {
7928 msec->flags = origflags;
b34976b6 7929 return TRUE;
b49e97c9
TS
7930 }
7931
7932 msec->flags = origflags;
7933 }
7934
7935 /* Fall back on the generic ELF find_nearest_line routine. */
7936
7937 return _bfd_elf_find_nearest_line (abfd, section, symbols, offset,
7938 filename_ptr, functionname_ptr,
7939 line_ptr);
7940}
7941\f
7942/* When are writing out the .options or .MIPS.options section,
7943 remember the bytes we are writing out, so that we can install the
7944 GP value in the section_processing routine. */
7945
b34976b6 7946bfd_boolean
b49e97c9
TS
7947_bfd_mips_elf_set_section_contents (abfd, section, location, offset, count)
7948 bfd *abfd;
7949 sec_ptr section;
7950 PTR location;
7951 file_ptr offset;
7952 bfd_size_type count;
7953{
7954 if (strcmp (section->name, MIPS_ELF_OPTIONS_SECTION_NAME (abfd)) == 0)
7955 {
7956 bfd_byte *c;
7957
7958 if (elf_section_data (section) == NULL)
7959 {
7960 bfd_size_type amt = sizeof (struct bfd_elf_section_data);
7961 section->used_by_bfd = (PTR) bfd_zalloc (abfd, amt);
7962 if (elf_section_data (section) == NULL)
b34976b6 7963 return FALSE;
b49e97c9 7964 }
f0abc2a1 7965 c = mips_elf_section_data (section)->u.tdata;
b49e97c9
TS
7966 if (c == NULL)
7967 {
7968 bfd_size_type size;
7969
7970 if (section->_cooked_size != 0)
7971 size = section->_cooked_size;
7972 else
7973 size = section->_raw_size;
7974 c = (bfd_byte *) bfd_zalloc (abfd, size);
7975 if (c == NULL)
b34976b6 7976 return FALSE;
f0abc2a1 7977 mips_elf_section_data (section)->u.tdata = c;
b49e97c9
TS
7978 }
7979
7980 memcpy (c + offset, location, (size_t) count);
7981 }
7982
7983 return _bfd_elf_set_section_contents (abfd, section, location, offset,
7984 count);
7985}
7986
7987/* This is almost identical to bfd_generic_get_... except that some
7988 MIPS relocations need to be handled specially. Sigh. */
7989
7990bfd_byte *
7991_bfd_elf_mips_get_relocated_section_contents (abfd, link_info, link_order,
1049f94e 7992 data, relocatable, symbols)
b49e97c9
TS
7993 bfd *abfd;
7994 struct bfd_link_info *link_info;
7995 struct bfd_link_order *link_order;
7996 bfd_byte *data;
1049f94e 7997 bfd_boolean relocatable;
b49e97c9
TS
7998 asymbol **symbols;
7999{
8000 /* Get enough memory to hold the stuff */
8001 bfd *input_bfd = link_order->u.indirect.section->owner;
8002 asection *input_section = link_order->u.indirect.section;
8003
8004 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
8005 arelent **reloc_vector = NULL;
8006 long reloc_count;
8007
8008 if (reloc_size < 0)
8009 goto error_return;
8010
8011 reloc_vector = (arelent **) bfd_malloc ((bfd_size_type) reloc_size);
8012 if (reloc_vector == NULL && reloc_size != 0)
8013 goto error_return;
8014
8015 /* read in the section */
8016 if (!bfd_get_section_contents (input_bfd,
8017 input_section,
8018 (PTR) data,
8019 (file_ptr) 0,
8020 input_section->_raw_size))
8021 goto error_return;
8022
8023 /* We're not relaxing the section, so just copy the size info */
8024 input_section->_cooked_size = input_section->_raw_size;
b34976b6 8025 input_section->reloc_done = TRUE;
b49e97c9
TS
8026
8027 reloc_count = bfd_canonicalize_reloc (input_bfd,
8028 input_section,
8029 reloc_vector,
8030 symbols);
8031 if (reloc_count < 0)
8032 goto error_return;
8033
8034 if (reloc_count > 0)
8035 {
8036 arelent **parent;
8037 /* for mips */
8038 int gp_found;
8039 bfd_vma gp = 0x12345678; /* initialize just to shut gcc up */
8040
8041 {
8042 struct bfd_hash_entry *h;
8043 struct bfd_link_hash_entry *lh;
8044 /* Skip all this stuff if we aren't mixing formats. */
8045 if (abfd && input_bfd
8046 && abfd->xvec == input_bfd->xvec)
8047 lh = 0;
8048 else
8049 {
b34976b6 8050 h = bfd_hash_lookup (&link_info->hash->table, "_gp", FALSE, FALSE);
b49e97c9
TS
8051 lh = (struct bfd_link_hash_entry *) h;
8052 }
8053 lookup:
8054 if (lh)
8055 {
8056 switch (lh->type)
8057 {
8058 case bfd_link_hash_undefined:
8059 case bfd_link_hash_undefweak:
8060 case bfd_link_hash_common:
8061 gp_found = 0;
8062 break;
8063 case bfd_link_hash_defined:
8064 case bfd_link_hash_defweak:
8065 gp_found = 1;
8066 gp = lh->u.def.value;
8067 break;
8068 case bfd_link_hash_indirect:
8069 case bfd_link_hash_warning:
8070 lh = lh->u.i.link;
8071 /* @@FIXME ignoring warning for now */
8072 goto lookup;
8073 case bfd_link_hash_new:
8074 default:
8075 abort ();
8076 }
8077 }
8078 else
8079 gp_found = 0;
8080 }
8081 /* end mips */
8082 for (parent = reloc_vector; *parent != (arelent *) NULL;
8083 parent++)
8084 {
8085 char *error_message = (char *) NULL;
8086 bfd_reloc_status_type r;
8087
8088 /* Specific to MIPS: Deal with relocation types that require
8089 knowing the gp of the output bfd. */
8090 asymbol *sym = *(*parent)->sym_ptr_ptr;
8091 if (bfd_is_abs_section (sym->section) && abfd)
8092 {
44c410de 8093 /* The special_function wouldn't get called anyway. */
b49e97c9
TS
8094 }
8095 else if (!gp_found)
8096 {
8097 /* The gp isn't there; let the special function code
8098 fall over on its own. */
8099 }
8100 else if ((*parent)->howto->special_function
8101 == _bfd_mips_elf32_gprel16_reloc)
8102 {
8103 /* bypass special_function call */
8104 r = _bfd_mips_elf_gprel16_with_gp (input_bfd, sym, *parent,
1049f94e 8105 input_section, relocatable,
b49e97c9
TS
8106 (PTR) data, gp);
8107 goto skip_bfd_perform_relocation;
8108 }
8109 /* end mips specific stuff */
8110
8111 r = bfd_perform_relocation (input_bfd,
8112 *parent,
8113 (PTR) data,
8114 input_section,
1049f94e 8115 relocatable ? abfd : (bfd *) NULL,
b49e97c9
TS
8116 &error_message);
8117 skip_bfd_perform_relocation:
8118
1049f94e 8119 if (relocatable)
b49e97c9
TS
8120 {
8121 asection *os = input_section->output_section;
8122
8123 /* A partial link, so keep the relocs */
8124 os->orelocation[os->reloc_count] = *parent;
8125 os->reloc_count++;
8126 }
8127
8128 if (r != bfd_reloc_ok)
8129 {
8130 switch (r)
8131 {
8132 case bfd_reloc_undefined:
8133 if (!((*link_info->callbacks->undefined_symbol)
8134 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
8135 input_bfd, input_section, (*parent)->address,
b34976b6 8136 TRUE)))
b49e97c9
TS
8137 goto error_return;
8138 break;
8139 case bfd_reloc_dangerous:
8140 BFD_ASSERT (error_message != (char *) NULL);
8141 if (!((*link_info->callbacks->reloc_dangerous)
8142 (link_info, error_message, input_bfd, input_section,
8143 (*parent)->address)))
8144 goto error_return;
8145 break;
8146 case bfd_reloc_overflow:
8147 if (!((*link_info->callbacks->reloc_overflow)
8148 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
8149 (*parent)->howto->name, (*parent)->addend,
8150 input_bfd, input_section, (*parent)->address)))
8151 goto error_return;
8152 break;
8153 case bfd_reloc_outofrange:
8154 default:
8155 abort ();
8156 break;
8157 }
8158
8159 }
8160 }
8161 }
8162 if (reloc_vector != NULL)
8163 free (reloc_vector);
8164 return data;
8165
8166error_return:
8167 if (reloc_vector != NULL)
8168 free (reloc_vector);
8169 return NULL;
8170}
8171\f
8172/* Create a MIPS ELF linker hash table. */
8173
8174struct bfd_link_hash_table *
8175_bfd_mips_elf_link_hash_table_create (abfd)
8176 bfd *abfd;
8177{
8178 struct mips_elf_link_hash_table *ret;
8179 bfd_size_type amt = sizeof (struct mips_elf_link_hash_table);
8180
e2d34d7d 8181 ret = (struct mips_elf_link_hash_table *) bfd_malloc (amt);
b49e97c9
TS
8182 if (ret == (struct mips_elf_link_hash_table *) NULL)
8183 return NULL;
8184
8185 if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
8186 mips_elf_link_hash_newfunc))
8187 {
e2d34d7d 8188 free (ret);
b49e97c9
TS
8189 return NULL;
8190 }
8191
8192#if 0
8193 /* We no longer use this. */
8194 for (i = 0; i < SIZEOF_MIPS_DYNSYM_SECNAMES; i++)
8195 ret->dynsym_sec_strindex[i] = (bfd_size_type) -1;
8196#endif
8197 ret->procedure_count = 0;
8198 ret->compact_rel_size = 0;
b34976b6 8199 ret->use_rld_obj_head = FALSE;
b49e97c9 8200 ret->rld_value = 0;
b34976b6 8201 ret->mips16_stubs_seen = FALSE;
b49e97c9
TS
8202
8203 return &ret->root.root;
8204}
8205\f
8206/* We need to use a special link routine to handle the .reginfo and
8207 the .mdebug sections. We need to merge all instances of these
8208 sections together, not write them all out sequentially. */
8209
b34976b6 8210bfd_boolean
b49e97c9
TS
8211_bfd_mips_elf_final_link (abfd, info)
8212 bfd *abfd;
8213 struct bfd_link_info *info;
8214{
8215 asection **secpp;
8216 asection *o;
8217 struct bfd_link_order *p;
8218 asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
8219 asection *rtproc_sec;
8220 Elf32_RegInfo reginfo;
8221 struct ecoff_debug_info debug;
8222 const struct ecoff_debug_swap *swap
8223 = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
8224 HDRR *symhdr = &debug.symbolic_header;
8225 PTR mdebug_handle = NULL;
8226 asection *s;
8227 EXTR esym;
8228 unsigned int i;
8229 bfd_size_type amt;
8230
8231 static const char * const secname[] =
8232 {
8233 ".text", ".init", ".fini", ".data",
8234 ".rodata", ".sdata", ".sbss", ".bss"
8235 };
8236 static const int sc[] =
8237 {
8238 scText, scInit, scFini, scData,
8239 scRData, scSData, scSBss, scBss
8240 };
8241
b49e97c9
TS
8242 /* We'd carefully arranged the dynamic symbol indices, and then the
8243 generic size_dynamic_sections renumbered them out from under us.
8244 Rather than trying somehow to prevent the renumbering, just do
8245 the sort again. */
8246 if (elf_hash_table (info)->dynamic_sections_created)
8247 {
8248 bfd *dynobj;
8249 asection *got;
8250 struct mips_got_info *g;
8251
8252 /* When we resort, we must tell mips_elf_sort_hash_table what
8253 the lowest index it may use is. That's the number of section
8254 symbols we're going to add. The generic ELF linker only
8255 adds these symbols when building a shared object. Note that
8256 we count the sections after (possibly) removing the .options
8257 section above. */
8258 if (! mips_elf_sort_hash_table (info, (info->shared
8259 ? bfd_count_sections (abfd) + 1
8260 : 1)))
b34976b6 8261 return FALSE;
b49e97c9
TS
8262
8263 /* Make sure we didn't grow the global .got region. */
8264 dynobj = elf_hash_table (info)->dynobj;
f4416af6 8265 got = mips_elf_got_section (dynobj, FALSE);
f0abc2a1 8266 g = mips_elf_section_data (got)->u.got_info;
b49e97c9
TS
8267
8268 if (g->global_gotsym != NULL)
8269 BFD_ASSERT ((elf_hash_table (info)->dynsymcount
8270 - g->global_gotsym->dynindx)
8271 <= g->global_gotno);
8272 }
8273
a902ee94
SC
8274#if 0
8275 /* We want to set the GP value for ld -r. */
b49e97c9
TS
8276 /* On IRIX5, we omit the .options section. On IRIX6, however, we
8277 include it, even though we don't process it quite right. (Some
8278 entries are supposed to be merged.) Empirically, we seem to be
8279 better off including it then not. */
8280 if (IRIX_COMPAT (abfd) == ict_irix5 || IRIX_COMPAT (abfd) == ict_none)
8281 for (secpp = &abfd->sections; *secpp != NULL; secpp = &(*secpp)->next)
8282 {
8283 if (strcmp ((*secpp)->name, MIPS_ELF_OPTIONS_SECTION_NAME (abfd)) == 0)
8284 {
8285 for (p = (*secpp)->link_order_head; p != NULL; p = p->next)
8286 if (p->type == bfd_indirect_link_order)
8287 p->u.indirect.section->flags &= ~SEC_HAS_CONTENTS;
8288 (*secpp)->link_order_head = NULL;
8289 bfd_section_list_remove (abfd, secpp);
8290 --abfd->section_count;
8291
8292 break;
8293 }
8294 }
8295
8296 /* We include .MIPS.options, even though we don't process it quite right.
8297 (Some entries are supposed to be merged.) At IRIX6 empirically we seem
8298 to be better off including it than not. */
8299 for (secpp = &abfd->sections; *secpp != NULL; secpp = &(*secpp)->next)
8300 {
8301 if (strcmp ((*secpp)->name, ".MIPS.options") == 0)
8302 {
8303 for (p = (*secpp)->link_order_head; p != NULL; p = p->next)
8304 if (p->type == bfd_indirect_link_order)
8305 p->u.indirect.section->flags &=~ SEC_HAS_CONTENTS;
8306 (*secpp)->link_order_head = NULL;
8307 bfd_section_list_remove (abfd, secpp);
8308 --abfd->section_count;
b34976b6 8309
b49e97c9
TS
8310 break;
8311 }
8312 }
a902ee94 8313#endif
b49e97c9
TS
8314
8315 /* Get a value for the GP register. */
8316 if (elf_gp (abfd) == 0)
8317 {
8318 struct bfd_link_hash_entry *h;
8319
b34976b6 8320 h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
b49e97c9
TS
8321 if (h != (struct bfd_link_hash_entry *) NULL
8322 && h->type == bfd_link_hash_defined)
8323 elf_gp (abfd) = (h->u.def.value
8324 + h->u.def.section->output_section->vma
8325 + h->u.def.section->output_offset);
1049f94e 8326 else if (info->relocatable)
b49e97c9
TS
8327 {
8328 bfd_vma lo = MINUS_ONE;
8329
8330 /* Find the GP-relative section with the lowest offset. */
8331 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
8332 if (o->vma < lo
8333 && (elf_section_data (o)->this_hdr.sh_flags & SHF_MIPS_GPREL))
8334 lo = o->vma;
8335
8336 /* And calculate GP relative to that. */
8337 elf_gp (abfd) = lo + ELF_MIPS_GP_OFFSET (abfd);
8338 }
8339 else
8340 {
8341 /* If the relocate_section function needs to do a reloc
8342 involving the GP value, it should make a reloc_dangerous
8343 callback to warn that GP is not defined. */
8344 }
8345 }
8346
8347 /* Go through the sections and collect the .reginfo and .mdebug
8348 information. */
8349 reginfo_sec = NULL;
8350 mdebug_sec = NULL;
8351 gptab_data_sec = NULL;
8352 gptab_bss_sec = NULL;
8353 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
8354 {
8355 if (strcmp (o->name, ".reginfo") == 0)
8356 {
8357 memset (&reginfo, 0, sizeof reginfo);
8358
8359 /* We have found the .reginfo section in the output file.
8360 Look through all the link_orders comprising it and merge
8361 the information together. */
8362 for (p = o->link_order_head;
8363 p != (struct bfd_link_order *) NULL;
8364 p = p->next)
8365 {
8366 asection *input_section;
8367 bfd *input_bfd;
8368 Elf32_External_RegInfo ext;
8369 Elf32_RegInfo sub;
8370
8371 if (p->type != bfd_indirect_link_order)
8372 {
8373 if (p->type == bfd_data_link_order)
8374 continue;
8375 abort ();
8376 }
8377
8378 input_section = p->u.indirect.section;
8379 input_bfd = input_section->owner;
8380
8381 /* The linker emulation code has probably clobbered the
8382 size to be zero bytes. */
8383 if (input_section->_raw_size == 0)
8384 input_section->_raw_size = sizeof (Elf32_External_RegInfo);
8385
8386 if (! bfd_get_section_contents (input_bfd, input_section,
8387 (PTR) &ext,
8388 (file_ptr) 0,
8389 (bfd_size_type) sizeof ext))
b34976b6 8390 return FALSE;
b49e97c9
TS
8391
8392 bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub);
8393
8394 reginfo.ri_gprmask |= sub.ri_gprmask;
8395 reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
8396 reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
8397 reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
8398 reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
8399
8400 /* ri_gp_value is set by the function
8401 mips_elf32_section_processing when the section is
8402 finally written out. */
8403
8404 /* Hack: reset the SEC_HAS_CONTENTS flag so that
8405 elf_link_input_bfd ignores this section. */
8406 input_section->flags &= ~SEC_HAS_CONTENTS;
8407 }
8408
8409 /* Size has been set in _bfd_mips_elf_always_size_sections. */
8410 BFD_ASSERT(o->_raw_size == sizeof (Elf32_External_RegInfo));
8411
8412 /* Skip this section later on (I don't think this currently
8413 matters, but someday it might). */
8414 o->link_order_head = (struct bfd_link_order *) NULL;
8415
8416 reginfo_sec = o;
8417 }
8418
8419 if (strcmp (o->name, ".mdebug") == 0)
8420 {
8421 struct extsym_info einfo;
8422 bfd_vma last;
8423
8424 /* We have found the .mdebug section in the output file.
8425 Look through all the link_orders comprising it and merge
8426 the information together. */
8427 symhdr->magic = swap->sym_magic;
8428 /* FIXME: What should the version stamp be? */
8429 symhdr->vstamp = 0;
8430 symhdr->ilineMax = 0;
8431 symhdr->cbLine = 0;
8432 symhdr->idnMax = 0;
8433 symhdr->ipdMax = 0;
8434 symhdr->isymMax = 0;
8435 symhdr->ioptMax = 0;
8436 symhdr->iauxMax = 0;
8437 symhdr->issMax = 0;
8438 symhdr->issExtMax = 0;
8439 symhdr->ifdMax = 0;
8440 symhdr->crfd = 0;
8441 symhdr->iextMax = 0;
8442
8443 /* We accumulate the debugging information itself in the
8444 debug_info structure. */
8445 debug.line = NULL;
8446 debug.external_dnr = NULL;
8447 debug.external_pdr = NULL;
8448 debug.external_sym = NULL;
8449 debug.external_opt = NULL;
8450 debug.external_aux = NULL;
8451 debug.ss = NULL;
8452 debug.ssext = debug.ssext_end = NULL;
8453 debug.external_fdr = NULL;
8454 debug.external_rfd = NULL;
8455 debug.external_ext = debug.external_ext_end = NULL;
8456
8457 mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
8458 if (mdebug_handle == (PTR) NULL)
b34976b6 8459 return FALSE;
b49e97c9
TS
8460
8461 esym.jmptbl = 0;
8462 esym.cobol_main = 0;
8463 esym.weakext = 0;
8464 esym.reserved = 0;
8465 esym.ifd = ifdNil;
8466 esym.asym.iss = issNil;
8467 esym.asym.st = stLocal;
8468 esym.asym.reserved = 0;
8469 esym.asym.index = indexNil;
8470 last = 0;
8471 for (i = 0; i < sizeof (secname) / sizeof (secname[0]); i++)
8472 {
8473 esym.asym.sc = sc[i];
8474 s = bfd_get_section_by_name (abfd, secname[i]);
8475 if (s != NULL)
8476 {
8477 esym.asym.value = s->vma;
8478 last = s->vma + s->_raw_size;
8479 }
8480 else
8481 esym.asym.value = last;
8482 if (!bfd_ecoff_debug_one_external (abfd, &debug, swap,
8483 secname[i], &esym))
b34976b6 8484 return FALSE;
b49e97c9
TS
8485 }
8486
8487 for (p = o->link_order_head;
8488 p != (struct bfd_link_order *) NULL;
8489 p = p->next)
8490 {
8491 asection *input_section;
8492 bfd *input_bfd;
8493 const struct ecoff_debug_swap *input_swap;
8494 struct ecoff_debug_info input_debug;
8495 char *eraw_src;
8496 char *eraw_end;
8497
8498 if (p->type != bfd_indirect_link_order)
8499 {
8500 if (p->type == bfd_data_link_order)
8501 continue;
8502 abort ();
8503 }
8504
8505 input_section = p->u.indirect.section;
8506 input_bfd = input_section->owner;
8507
8508 if (bfd_get_flavour (input_bfd) != bfd_target_elf_flavour
8509 || (get_elf_backend_data (input_bfd)
8510 ->elf_backend_ecoff_debug_swap) == NULL)
8511 {
8512 /* I don't know what a non MIPS ELF bfd would be
8513 doing with a .mdebug section, but I don't really
8514 want to deal with it. */
8515 continue;
8516 }
8517
8518 input_swap = (get_elf_backend_data (input_bfd)
8519 ->elf_backend_ecoff_debug_swap);
8520
8521 BFD_ASSERT (p->size == input_section->_raw_size);
8522
8523 /* The ECOFF linking code expects that we have already
8524 read in the debugging information and set up an
8525 ecoff_debug_info structure, so we do that now. */
8526 if (! _bfd_mips_elf_read_ecoff_info (input_bfd, input_section,
8527 &input_debug))
b34976b6 8528 return FALSE;
b49e97c9
TS
8529
8530 if (! (bfd_ecoff_debug_accumulate
8531 (mdebug_handle, abfd, &debug, swap, input_bfd,
8532 &input_debug, input_swap, info)))
b34976b6 8533 return FALSE;
b49e97c9
TS
8534
8535 /* Loop through the external symbols. For each one with
8536 interesting information, try to find the symbol in
8537 the linker global hash table and save the information
8538 for the output external symbols. */
8539 eraw_src = input_debug.external_ext;
8540 eraw_end = (eraw_src
8541 + (input_debug.symbolic_header.iextMax
8542 * input_swap->external_ext_size));
8543 for (;
8544 eraw_src < eraw_end;
8545 eraw_src += input_swap->external_ext_size)
8546 {
8547 EXTR ext;
8548 const char *name;
8549 struct mips_elf_link_hash_entry *h;
8550
8551 (*input_swap->swap_ext_in) (input_bfd, (PTR) eraw_src, &ext);
8552 if (ext.asym.sc == scNil
8553 || ext.asym.sc == scUndefined
8554 || ext.asym.sc == scSUndefined)
8555 continue;
8556
8557 name = input_debug.ssext + ext.asym.iss;
8558 h = mips_elf_link_hash_lookup (mips_elf_hash_table (info),
b34976b6 8559 name, FALSE, FALSE, TRUE);
b49e97c9
TS
8560 if (h == NULL || h->esym.ifd != -2)
8561 continue;
8562
8563 if (ext.ifd != -1)
8564 {
8565 BFD_ASSERT (ext.ifd
8566 < input_debug.symbolic_header.ifdMax);
8567 ext.ifd = input_debug.ifdmap[ext.ifd];
8568 }
8569
8570 h->esym = ext;
8571 }
8572
8573 /* Free up the information we just read. */
8574 free (input_debug.line);
8575 free (input_debug.external_dnr);
8576 free (input_debug.external_pdr);
8577 free (input_debug.external_sym);
8578 free (input_debug.external_opt);
8579 free (input_debug.external_aux);
8580 free (input_debug.ss);
8581 free (input_debug.ssext);
8582 free (input_debug.external_fdr);
8583 free (input_debug.external_rfd);
8584 free (input_debug.external_ext);
8585
8586 /* Hack: reset the SEC_HAS_CONTENTS flag so that
8587 elf_link_input_bfd ignores this section. */
8588 input_section->flags &= ~SEC_HAS_CONTENTS;
8589 }
8590
8591 if (SGI_COMPAT (abfd) && info->shared)
8592 {
8593 /* Create .rtproc section. */
8594 rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
8595 if (rtproc_sec == NULL)
8596 {
8597 flagword flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
8598 | SEC_LINKER_CREATED | SEC_READONLY);
8599
8600 rtproc_sec = bfd_make_section (abfd, ".rtproc");
8601 if (rtproc_sec == NULL
8602 || ! bfd_set_section_flags (abfd, rtproc_sec, flags)
8603 || ! bfd_set_section_alignment (abfd, rtproc_sec, 4))
b34976b6 8604 return FALSE;
b49e97c9
TS
8605 }
8606
8607 if (! mips_elf_create_procedure_table (mdebug_handle, abfd,
8608 info, rtproc_sec,
8609 &debug))
b34976b6 8610 return FALSE;
b49e97c9
TS
8611 }
8612
8613 /* Build the external symbol information. */
8614 einfo.abfd = abfd;
8615 einfo.info = info;
8616 einfo.debug = &debug;
8617 einfo.swap = swap;
b34976b6 8618 einfo.failed = FALSE;
b49e97c9
TS
8619 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
8620 mips_elf_output_extsym,
8621 (PTR) &einfo);
8622 if (einfo.failed)
b34976b6 8623 return FALSE;
b49e97c9
TS
8624
8625 /* Set the size of the .mdebug section. */
8626 o->_raw_size = bfd_ecoff_debug_size (abfd, &debug, swap);
8627
8628 /* Skip this section later on (I don't think this currently
8629 matters, but someday it might). */
8630 o->link_order_head = (struct bfd_link_order *) NULL;
8631
8632 mdebug_sec = o;
8633 }
8634
8635 if (strncmp (o->name, ".gptab.", sizeof ".gptab." - 1) == 0)
8636 {
8637 const char *subname;
8638 unsigned int c;
8639 Elf32_gptab *tab;
8640 Elf32_External_gptab *ext_tab;
8641 unsigned int j;
8642
8643 /* The .gptab.sdata and .gptab.sbss sections hold
8644 information describing how the small data area would
8645 change depending upon the -G switch. These sections
8646 not used in executables files. */
1049f94e 8647 if (! info->relocatable)
b49e97c9
TS
8648 {
8649 for (p = o->link_order_head;
8650 p != (struct bfd_link_order *) NULL;
8651 p = p->next)
8652 {
8653 asection *input_section;
8654
8655 if (p->type != bfd_indirect_link_order)
8656 {
8657 if (p->type == bfd_data_link_order)
8658 continue;
8659 abort ();
8660 }
8661
8662 input_section = p->u.indirect.section;
8663
8664 /* Hack: reset the SEC_HAS_CONTENTS flag so that
8665 elf_link_input_bfd ignores this section. */
8666 input_section->flags &= ~SEC_HAS_CONTENTS;
8667 }
8668
8669 /* Skip this section later on (I don't think this
8670 currently matters, but someday it might). */
8671 o->link_order_head = (struct bfd_link_order *) NULL;
8672
8673 /* Really remove the section. */
8674 for (secpp = &abfd->sections;
8675 *secpp != o;
8676 secpp = &(*secpp)->next)
8677 ;
8678 bfd_section_list_remove (abfd, secpp);
8679 --abfd->section_count;
8680
8681 continue;
8682 }
8683
8684 /* There is one gptab for initialized data, and one for
8685 uninitialized data. */
8686 if (strcmp (o->name, ".gptab.sdata") == 0)
8687 gptab_data_sec = o;
8688 else if (strcmp (o->name, ".gptab.sbss") == 0)
8689 gptab_bss_sec = o;
8690 else
8691 {
8692 (*_bfd_error_handler)
8693 (_("%s: illegal section name `%s'"),
8694 bfd_get_filename (abfd), o->name);
8695 bfd_set_error (bfd_error_nonrepresentable_section);
b34976b6 8696 return FALSE;
b49e97c9
TS
8697 }
8698
8699 /* The linker script always combines .gptab.data and
8700 .gptab.sdata into .gptab.sdata, and likewise for
8701 .gptab.bss and .gptab.sbss. It is possible that there is
8702 no .sdata or .sbss section in the output file, in which
8703 case we must change the name of the output section. */
8704 subname = o->name + sizeof ".gptab" - 1;
8705 if (bfd_get_section_by_name (abfd, subname) == NULL)
8706 {
8707 if (o == gptab_data_sec)
8708 o->name = ".gptab.data";
8709 else
8710 o->name = ".gptab.bss";
8711 subname = o->name + sizeof ".gptab" - 1;
8712 BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
8713 }
8714
8715 /* Set up the first entry. */
8716 c = 1;
8717 amt = c * sizeof (Elf32_gptab);
8718 tab = (Elf32_gptab *) bfd_malloc (amt);
8719 if (tab == NULL)
b34976b6 8720 return FALSE;
b49e97c9
TS
8721 tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
8722 tab[0].gt_header.gt_unused = 0;
8723
8724 /* Combine the input sections. */
8725 for (p = o->link_order_head;
8726 p != (struct bfd_link_order *) NULL;
8727 p = p->next)
8728 {
8729 asection *input_section;
8730 bfd *input_bfd;
8731 bfd_size_type size;
8732 unsigned long last;
8733 bfd_size_type gpentry;
8734
8735 if (p->type != bfd_indirect_link_order)
8736 {
8737 if (p->type == bfd_data_link_order)
8738 continue;
8739 abort ();
8740 }
8741
8742 input_section = p->u.indirect.section;
8743 input_bfd = input_section->owner;
8744
8745 /* Combine the gptab entries for this input section one
8746 by one. We know that the input gptab entries are
8747 sorted by ascending -G value. */
8748 size = bfd_section_size (input_bfd, input_section);
8749 last = 0;
8750 for (gpentry = sizeof (Elf32_External_gptab);
8751 gpentry < size;
8752 gpentry += sizeof (Elf32_External_gptab))
8753 {
8754 Elf32_External_gptab ext_gptab;
8755 Elf32_gptab int_gptab;
8756 unsigned long val;
8757 unsigned long add;
b34976b6 8758 bfd_boolean exact;
b49e97c9
TS
8759 unsigned int look;
8760
8761 if (! (bfd_get_section_contents
8762 (input_bfd, input_section, (PTR) &ext_gptab,
8763 (file_ptr) gpentry,
8764 (bfd_size_type) sizeof (Elf32_External_gptab))))
8765 {
8766 free (tab);
b34976b6 8767 return FALSE;
b49e97c9
TS
8768 }
8769
8770 bfd_mips_elf32_swap_gptab_in (input_bfd, &ext_gptab,
8771 &int_gptab);
8772 val = int_gptab.gt_entry.gt_g_value;
8773 add = int_gptab.gt_entry.gt_bytes - last;
8774
b34976b6 8775 exact = FALSE;
b49e97c9
TS
8776 for (look = 1; look < c; look++)
8777 {
8778 if (tab[look].gt_entry.gt_g_value >= val)
8779 tab[look].gt_entry.gt_bytes += add;
8780
8781 if (tab[look].gt_entry.gt_g_value == val)
b34976b6 8782 exact = TRUE;
b49e97c9
TS
8783 }
8784
8785 if (! exact)
8786 {
8787 Elf32_gptab *new_tab;
8788 unsigned int max;
8789
8790 /* We need a new table entry. */
8791 amt = (bfd_size_type) (c + 1) * sizeof (Elf32_gptab);
8792 new_tab = (Elf32_gptab *) bfd_realloc ((PTR) tab, amt);
8793 if (new_tab == NULL)
8794 {
8795 free (tab);
b34976b6 8796 return FALSE;
b49e97c9
TS
8797 }
8798 tab = new_tab;
8799 tab[c].gt_entry.gt_g_value = val;
8800 tab[c].gt_entry.gt_bytes = add;
8801
8802 /* Merge in the size for the next smallest -G
8803 value, since that will be implied by this new
8804 value. */
8805 max = 0;
8806 for (look = 1; look < c; look++)
8807 {
8808 if (tab[look].gt_entry.gt_g_value < val
8809 && (max == 0
8810 || (tab[look].gt_entry.gt_g_value
8811 > tab[max].gt_entry.gt_g_value)))
8812 max = look;
8813 }
8814 if (max != 0)
8815 tab[c].gt_entry.gt_bytes +=
8816 tab[max].gt_entry.gt_bytes;
8817
8818 ++c;
8819 }
8820
8821 last = int_gptab.gt_entry.gt_bytes;
8822 }
8823
8824 /* Hack: reset the SEC_HAS_CONTENTS flag so that
8825 elf_link_input_bfd ignores this section. */
8826 input_section->flags &= ~SEC_HAS_CONTENTS;
8827 }
8828
8829 /* The table must be sorted by -G value. */
8830 if (c > 2)
8831 qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
8832
8833 /* Swap out the table. */
8834 amt = (bfd_size_type) c * sizeof (Elf32_External_gptab);
8835 ext_tab = (Elf32_External_gptab *) bfd_alloc (abfd, amt);
8836 if (ext_tab == NULL)
8837 {
8838 free (tab);
b34976b6 8839 return FALSE;
b49e97c9
TS
8840 }
8841
8842 for (j = 0; j < c; j++)
8843 bfd_mips_elf32_swap_gptab_out (abfd, tab + j, ext_tab + j);
8844 free (tab);
8845
8846 o->_raw_size = c * sizeof (Elf32_External_gptab);
8847 o->contents = (bfd_byte *) ext_tab;
8848
8849 /* Skip this section later on (I don't think this currently
8850 matters, but someday it might). */
8851 o->link_order_head = (struct bfd_link_order *) NULL;
8852 }
8853 }
8854
8855 /* Invoke the regular ELF backend linker to do all the work. */
ee6423ed 8856 if (!MNAME(abfd,bfd_elf,bfd_final_link) (abfd, info))
b34976b6 8857 return FALSE;
b49e97c9
TS
8858
8859 /* Now write out the computed sections. */
8860
8861 if (reginfo_sec != (asection *) NULL)
8862 {
8863 Elf32_External_RegInfo ext;
8864
8865 bfd_mips_elf32_swap_reginfo_out (abfd, &reginfo, &ext);
8866 if (! bfd_set_section_contents (abfd, reginfo_sec, (PTR) &ext,
8867 (file_ptr) 0,
8868 (bfd_size_type) sizeof ext))
b34976b6 8869 return FALSE;
b49e97c9
TS
8870 }
8871
8872 if (mdebug_sec != (asection *) NULL)
8873 {
8874 BFD_ASSERT (abfd->output_has_begun);
8875 if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
8876 swap, info,
8877 mdebug_sec->filepos))
b34976b6 8878 return FALSE;
b49e97c9
TS
8879
8880 bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
8881 }
8882
8883 if (gptab_data_sec != (asection *) NULL)
8884 {
8885 if (! bfd_set_section_contents (abfd, gptab_data_sec,
8886 gptab_data_sec->contents,
8887 (file_ptr) 0,
8888 gptab_data_sec->_raw_size))
b34976b6 8889 return FALSE;
b49e97c9
TS
8890 }
8891
8892 if (gptab_bss_sec != (asection *) NULL)
8893 {
8894 if (! bfd_set_section_contents (abfd, gptab_bss_sec,
8895 gptab_bss_sec->contents,
8896 (file_ptr) 0,
8897 gptab_bss_sec->_raw_size))
b34976b6 8898 return FALSE;
b49e97c9
TS
8899 }
8900
8901 if (SGI_COMPAT (abfd))
8902 {
8903 rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
8904 if (rtproc_sec != NULL)
8905 {
8906 if (! bfd_set_section_contents (abfd, rtproc_sec,
8907 rtproc_sec->contents,
8908 (file_ptr) 0,
8909 rtproc_sec->_raw_size))
b34976b6 8910 return FALSE;
b49e97c9
TS
8911 }
8912 }
8913
b34976b6 8914 return TRUE;
b49e97c9
TS
8915}
8916\f
64543e1a
RS
8917/* Structure for saying that BFD machine EXTENSION extends BASE. */
8918
8919struct mips_mach_extension {
8920 unsigned long extension, base;
8921};
8922
8923
8924/* An array describing how BFD machines relate to one another. The entries
8925 are ordered topologically with MIPS I extensions listed last. */
8926
8927static const struct mips_mach_extension mips_mach_extensions[] = {
8928 /* MIPS64 extensions. */
8929 { bfd_mach_mips_sb1, bfd_mach_mipsisa64 },
8930
8931 /* MIPS V extensions. */
8932 { bfd_mach_mipsisa64, bfd_mach_mips5 },
8933
8934 /* R10000 extensions. */
8935 { bfd_mach_mips12000, bfd_mach_mips10000 },
8936
8937 /* R5000 extensions. Note: the vr5500 ISA is an extension of the core
8938 vr5400 ISA, but doesn't include the multimedia stuff. It seems
8939 better to allow vr5400 and vr5500 code to be merged anyway, since
8940 many libraries will just use the core ISA. Perhaps we could add
8941 some sort of ASE flag if this ever proves a problem. */
8942 { bfd_mach_mips5500, bfd_mach_mips5400 },
8943 { bfd_mach_mips5400, bfd_mach_mips5000 },
8944
8945 /* MIPS IV extensions. */
8946 { bfd_mach_mips5, bfd_mach_mips8000 },
8947 { bfd_mach_mips10000, bfd_mach_mips8000 },
8948 { bfd_mach_mips5000, bfd_mach_mips8000 },
5a7ea749 8949 { bfd_mach_mips7000, bfd_mach_mips8000 },
64543e1a
RS
8950
8951 /* VR4100 extensions. */
8952 { bfd_mach_mips4120, bfd_mach_mips4100 },
8953 { bfd_mach_mips4111, bfd_mach_mips4100 },
8954
8955 /* MIPS III extensions. */
8956 { bfd_mach_mips8000, bfd_mach_mips4000 },
8957 { bfd_mach_mips4650, bfd_mach_mips4000 },
8958 { bfd_mach_mips4600, bfd_mach_mips4000 },
8959 { bfd_mach_mips4400, bfd_mach_mips4000 },
8960 { bfd_mach_mips4300, bfd_mach_mips4000 },
8961 { bfd_mach_mips4100, bfd_mach_mips4000 },
8962 { bfd_mach_mips4010, bfd_mach_mips4000 },
8963
8964 /* MIPS32 extensions. */
8965 { bfd_mach_mipsisa32r2, bfd_mach_mipsisa32 },
8966
8967 /* MIPS II extensions. */
8968 { bfd_mach_mips4000, bfd_mach_mips6000 },
8969 { bfd_mach_mipsisa32, bfd_mach_mips6000 },
8970
8971 /* MIPS I extensions. */
8972 { bfd_mach_mips6000, bfd_mach_mips3000 },
8973 { bfd_mach_mips3900, bfd_mach_mips3000 }
8974};
8975
8976
8977/* Return true if bfd machine EXTENSION is an extension of machine BASE. */
8978
8979static bfd_boolean
8980mips_mach_extends_p (base, extension)
8981 unsigned long base, extension;
8982{
8983 size_t i;
8984
8985 for (i = 0; extension != base && i < ARRAY_SIZE (mips_mach_extensions); i++)
8986 if (extension == mips_mach_extensions[i].extension)
8987 extension = mips_mach_extensions[i].base;
8988
8989 return extension == base;
8990}
8991
8992
8993/* Return true if the given ELF header flags describe a 32-bit binary. */
00707a0e 8994
b34976b6 8995static bfd_boolean
64543e1a
RS
8996mips_32bit_flags_p (flags)
8997 flagword flags;
00707a0e 8998{
64543e1a
RS
8999 return ((flags & EF_MIPS_32BITMODE) != 0
9000 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_O32
9001 || (flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32
9002 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1
9003 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2
9004 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32
9005 || (flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2);
00707a0e
RS
9006}
9007
64543e1a 9008
b49e97c9
TS
9009/* Merge backend specific data from an object file to the output
9010 object file when linking. */
9011
b34976b6 9012bfd_boolean
b49e97c9
TS
9013_bfd_mips_elf_merge_private_bfd_data (ibfd, obfd)
9014 bfd *ibfd;
9015 bfd *obfd;
9016{
9017 flagword old_flags;
9018 flagword new_flags;
b34976b6
AM
9019 bfd_boolean ok;
9020 bfd_boolean null_input_bfd = TRUE;
b49e97c9
TS
9021 asection *sec;
9022
9023 /* Check if we have the same endianess */
82e51918 9024 if (! _bfd_generic_verify_endian_match (ibfd, obfd))
aa701218
AO
9025 {
9026 (*_bfd_error_handler)
9027 (_("%s: endianness incompatible with that of the selected emulation"),
9028 bfd_archive_filename (ibfd));
9029 return FALSE;
9030 }
b49e97c9
TS
9031
9032 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
9033 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
b34976b6 9034 return TRUE;
b49e97c9 9035
aa701218
AO
9036 if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
9037 {
9038 (*_bfd_error_handler)
9039 (_("%s: ABI is incompatible with that of the selected emulation"),
9040 bfd_archive_filename (ibfd));
9041 return FALSE;
9042 }
9043
b49e97c9
TS
9044 new_flags = elf_elfheader (ibfd)->e_flags;
9045 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_NOREORDER;
9046 old_flags = elf_elfheader (obfd)->e_flags;
9047
9048 if (! elf_flags_init (obfd))
9049 {
b34976b6 9050 elf_flags_init (obfd) = TRUE;
b49e97c9
TS
9051 elf_elfheader (obfd)->e_flags = new_flags;
9052 elf_elfheader (obfd)->e_ident[EI_CLASS]
9053 = elf_elfheader (ibfd)->e_ident[EI_CLASS];
9054
9055 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
9056 && bfd_get_arch_info (obfd)->the_default)
9057 {
9058 if (! bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
9059 bfd_get_mach (ibfd)))
b34976b6 9060 return FALSE;
b49e97c9
TS
9061 }
9062
b34976b6 9063 return TRUE;
b49e97c9
TS
9064 }
9065
9066 /* Check flag compatibility. */
9067
9068 new_flags &= ~EF_MIPS_NOREORDER;
9069 old_flags &= ~EF_MIPS_NOREORDER;
9070
f4416af6
AO
9071 /* Some IRIX 6 BSD-compatibility objects have this bit set. It
9072 doesn't seem to matter. */
9073 new_flags &= ~EF_MIPS_XGOT;
9074 old_flags &= ~EF_MIPS_XGOT;
9075
b49e97c9 9076 if (new_flags == old_flags)
b34976b6 9077 return TRUE;
b49e97c9
TS
9078
9079 /* Check to see if the input BFD actually contains any sections.
9080 If not, its flags may not have been initialised either, but it cannot
9081 actually cause any incompatibility. */
9082 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9083 {
9084 /* Ignore synthetic sections and empty .text, .data and .bss sections
9085 which are automatically generated by gas. */
9086 if (strcmp (sec->name, ".reginfo")
9087 && strcmp (sec->name, ".mdebug")
9088 && ((!strcmp (sec->name, ".text")
9089 || !strcmp (sec->name, ".data")
9090 || !strcmp (sec->name, ".bss"))
9091 && sec->_raw_size != 0))
9092 {
b34976b6 9093 null_input_bfd = FALSE;
b49e97c9
TS
9094 break;
9095 }
9096 }
9097 if (null_input_bfd)
b34976b6 9098 return TRUE;
b49e97c9 9099
b34976b6 9100 ok = TRUE;
b49e97c9 9101
143d77c5
EC
9102 if (((new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0)
9103 != ((old_flags & (EF_MIPS_PIC | EF_MIPS_CPIC)) != 0))
b49e97c9 9104 {
b49e97c9 9105 (*_bfd_error_handler)
143d77c5 9106 (_("%s: warning: linking PIC files with non-PIC files"),
b49e97c9 9107 bfd_archive_filename (ibfd));
143d77c5 9108 ok = TRUE;
b49e97c9
TS
9109 }
9110
143d77c5
EC
9111 if (new_flags & (EF_MIPS_PIC | EF_MIPS_CPIC))
9112 elf_elfheader (obfd)->e_flags |= EF_MIPS_CPIC;
9113 if (! (new_flags & EF_MIPS_PIC))
9114 elf_elfheader (obfd)->e_flags &= ~EF_MIPS_PIC;
9115
9116 new_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
9117 old_flags &= ~ (EF_MIPS_PIC | EF_MIPS_CPIC);
b49e97c9 9118
64543e1a
RS
9119 /* Compare the ISAs. */
9120 if (mips_32bit_flags_p (old_flags) != mips_32bit_flags_p (new_flags))
b49e97c9 9121 {
64543e1a
RS
9122 (*_bfd_error_handler)
9123 (_("%s: linking 32-bit code with 64-bit code"),
9124 bfd_archive_filename (ibfd));
9125 ok = FALSE;
9126 }
9127 else if (!mips_mach_extends_p (bfd_get_mach (ibfd), bfd_get_mach (obfd)))
9128 {
9129 /* OBFD's ISA isn't the same as, or an extension of, IBFD's. */
9130 if (mips_mach_extends_p (bfd_get_mach (obfd), bfd_get_mach (ibfd)))
b49e97c9 9131 {
64543e1a
RS
9132 /* Copy the architecture info from IBFD to OBFD. Also copy
9133 the 32-bit flag (if set) so that we continue to recognise
9134 OBFD as a 32-bit binary. */
9135 bfd_set_arch_info (obfd, bfd_get_arch_info (ibfd));
9136 elf_elfheader (obfd)->e_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH);
9137 elf_elfheader (obfd)->e_flags
9138 |= new_flags & (EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
9139
9140 /* Copy across the ABI flags if OBFD doesn't use them
9141 and if that was what caused us to treat IBFD as 32-bit. */
9142 if ((old_flags & EF_MIPS_ABI) == 0
9143 && mips_32bit_flags_p (new_flags)
9144 && !mips_32bit_flags_p (new_flags & ~EF_MIPS_ABI))
9145 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ABI;
b49e97c9
TS
9146 }
9147 else
9148 {
64543e1a 9149 /* The ISAs aren't compatible. */
b49e97c9 9150 (*_bfd_error_handler)
64543e1a 9151 (_("%s: linking %s module with previous %s modules"),
b49e97c9 9152 bfd_archive_filename (ibfd),
64543e1a
RS
9153 bfd_printable_name (ibfd),
9154 bfd_printable_name (obfd));
b34976b6 9155 ok = FALSE;
b49e97c9 9156 }
b49e97c9
TS
9157 }
9158
64543e1a
RS
9159 new_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
9160 old_flags &= ~(EF_MIPS_ARCH | EF_MIPS_MACH | EF_MIPS_32BITMODE);
9161
9162 /* Compare ABIs. The 64-bit ABI does not use EF_MIPS_ABI. But, it
b49e97c9
TS
9163 does set EI_CLASS differently from any 32-bit ABI. */
9164 if ((new_flags & EF_MIPS_ABI) != (old_flags & EF_MIPS_ABI)
9165 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
9166 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
9167 {
9168 /* Only error if both are set (to different values). */
9169 if (((new_flags & EF_MIPS_ABI) && (old_flags & EF_MIPS_ABI))
9170 || (elf_elfheader (ibfd)->e_ident[EI_CLASS]
9171 != elf_elfheader (obfd)->e_ident[EI_CLASS]))
9172 {
9173 (*_bfd_error_handler)
9174 (_("%s: ABI mismatch: linking %s module with previous %s modules"),
9175 bfd_archive_filename (ibfd),
9176 elf_mips_abi_name (ibfd),
9177 elf_mips_abi_name (obfd));
b34976b6 9178 ok = FALSE;
b49e97c9
TS
9179 }
9180 new_flags &= ~EF_MIPS_ABI;
9181 old_flags &= ~EF_MIPS_ABI;
9182 }
9183
fb39dac1
RS
9184 /* For now, allow arbitrary mixing of ASEs (retain the union). */
9185 if ((new_flags & EF_MIPS_ARCH_ASE) != (old_flags & EF_MIPS_ARCH_ASE))
9186 {
9187 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_ARCH_ASE;
9188
9189 new_flags &= ~ EF_MIPS_ARCH_ASE;
9190 old_flags &= ~ EF_MIPS_ARCH_ASE;
9191 }
9192
b49e97c9
TS
9193 /* Warn about any other mismatches */
9194 if (new_flags != old_flags)
9195 {
9196 (*_bfd_error_handler)
9197 (_("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
9198 bfd_archive_filename (ibfd), (unsigned long) new_flags,
9199 (unsigned long) old_flags);
b34976b6 9200 ok = FALSE;
b49e97c9
TS
9201 }
9202
9203 if (! ok)
9204 {
9205 bfd_set_error (bfd_error_bad_value);
b34976b6 9206 return FALSE;
b49e97c9
TS
9207 }
9208
b34976b6 9209 return TRUE;
b49e97c9
TS
9210}
9211
9212/* Function to keep MIPS specific file flags like as EF_MIPS_PIC. */
9213
b34976b6 9214bfd_boolean
b49e97c9
TS
9215_bfd_mips_elf_set_private_flags (abfd, flags)
9216 bfd *abfd;
9217 flagword flags;
9218{
9219 BFD_ASSERT (!elf_flags_init (abfd)
9220 || elf_elfheader (abfd)->e_flags == flags);
9221
9222 elf_elfheader (abfd)->e_flags = flags;
b34976b6
AM
9223 elf_flags_init (abfd) = TRUE;
9224 return TRUE;
b49e97c9
TS
9225}
9226
b34976b6 9227bfd_boolean
b49e97c9
TS
9228_bfd_mips_elf_print_private_bfd_data (abfd, ptr)
9229 bfd *abfd;
9230 PTR ptr;
9231{
9232 FILE *file = (FILE *) ptr;
9233
9234 BFD_ASSERT (abfd != NULL && ptr != NULL);
9235
9236 /* Print normal ELF private data. */
9237 _bfd_elf_print_private_bfd_data (abfd, ptr);
9238
9239 /* xgettext:c-format */
9240 fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
9241
9242 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O32)
9243 fprintf (file, _(" [abi=O32]"));
9244 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_O64)
9245 fprintf (file, _(" [abi=O64]"));
9246 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI32)
9247 fprintf (file, _(" [abi=EABI32]"));
9248 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64)
9249 fprintf (file, _(" [abi=EABI64]"));
9250 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI))
9251 fprintf (file, _(" [abi unknown]"));
9252 else if (ABI_N32_P (abfd))
9253 fprintf (file, _(" [abi=N32]"));
9254 else if (ABI_64_P (abfd))
9255 fprintf (file, _(" [abi=64]"));
9256 else
9257 fprintf (file, _(" [no abi set]"));
9258
9259 if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_1)
9260 fprintf (file, _(" [mips1]"));
9261 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_2)
9262 fprintf (file, _(" [mips2]"));
9263 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_3)
9264 fprintf (file, _(" [mips3]"));
9265 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_4)
9266 fprintf (file, _(" [mips4]"));
9267 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_5)
9268 fprintf (file, _(" [mips5]"));
9269 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32)
9270 fprintf (file, _(" [mips32]"));
9271 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_64)
9272 fprintf (file, _(" [mips64]"));
af7ee8bf
CD
9273 else if ((elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) == E_MIPS_ARCH_32R2)
9274 fprintf (file, _(" [mips32r2]"));
b49e97c9
TS
9275 else
9276 fprintf (file, _(" [unknown ISA]"));
9277
40d32fc6
CD
9278 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_MDMX)
9279 fprintf (file, _(" [mdmx]"));
9280
9281 if (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH_ASE_M16)
9282 fprintf (file, _(" [mips16]"));
9283
b49e97c9
TS
9284 if (elf_elfheader (abfd)->e_flags & EF_MIPS_32BITMODE)
9285 fprintf (file, _(" [32bitmode]"));
9286 else
9287 fprintf (file, _(" [not 32bitmode]"));
9288
9289 fputc ('\n', file);
9290
b34976b6 9291 return TRUE;
b49e97c9 9292}
2f89ff8d
L
9293
9294struct bfd_elf_special_section const _bfd_mips_elf_special_sections[]=
9295{
9296 { ".sdata", 0, NULL, 0,
9297 SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
9298 { ".sbss", 0, NULL, 0,
9299 SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
9300 { ".lit4", 0, NULL, 0,
9301 SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
9302 { ".lit8", 0, NULL, 0,
9303 SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_MIPS_GPREL },
9304 { ".ucode", 0, NULL, 0,
9305 SHT_MIPS_UCODE, 0 },
9306 { ".mdebug", 0, NULL, 0,
9307 SHT_MIPS_DEBUG, 0 },
9308 { NULL, 0, NULL, 0,
9309 0, 0 }
9310};
This page took 0.549506 seconds and 4 git commands to generate.