Tue Jun 18 14:42:58 1996 Klaus Kaempf <kkaempf@progis.de>
[deliverable/binutils-gdb.git] / bfd / elf32-mips.c
CommitLineData
b3c0fc57 1/* MIPS-specific support for 32-bit ELF
5b3b9ff6 2 Copyright 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
6b4b4d17 3
b3c0fc57
ILT
4 Most of the information added by Ian Lance Taylor, Cygnus Support,
5 <ian@cygnus.com>.
6
6b4b4d17
JK
7This file is part of BFD, the Binary File Descriptor library.
8
9This program is free software; you can redistribute it and/or modify
10it under the terms of the GNU General Public License as published by
11the Free Software Foundation; either version 2 of the License, or
12(at your option) any later version.
13
14This program is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with this program; if not, write to the Free Software
3fe22b98 21Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
6b4b4d17 22
5b3b9ff6
ILT
23/* This file handles MIPS ELF targets. SGI Irix 5 uses a slightly
24 different MIPS ELF from other targets. This matters when linking.
25 This file supports both, switching at runtime. */
26
6b4b4d17
JK
27#include "bfd.h"
28#include "sysdep.h"
29#include "libbfd.h"
6e07e54f
ILT
30#include "bfdlink.h"
31#include "genlink.h"
6ab826bd 32#include "elf-bfd.h"
b3c0fc57
ILT
33#include "elf/mips.h"
34
6e07e54f
ILT
35/* Get the ECOFF swapping routines. */
36#include "coff/sym.h"
37#include "coff/symconst.h"
38#include "coff/internal.h"
39#include "coff/ecoff.h"
40#include "coff/mips.h"
41#define ECOFF_32
42#include "ecoffswap.h"
43
16fe8950 44static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
aac6b32f
ILT
45 PARAMS ((bfd *, bfd_reloc_code_real_type));
46static void mips_info_to_howto_rel
47 PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
53787b23
ILT
48static void bfd_mips_elf32_swap_gptab_in
49 PARAMS ((bfd *, const Elf32_External_gptab *, Elf32_gptab *));
50static void bfd_mips_elf32_swap_gptab_out
51 PARAMS ((bfd *, const Elf32_gptab *, Elf32_External_gptab *));
aac6b32f 52static boolean mips_elf_sym_is_global PARAMS ((bfd *, asymbol *));
00176555 53static boolean mips_elf32_object_p PARAMS ((bfd *));
5b3b9ff6
ILT
54static boolean mips_elf_create_procedure_table
55 PARAMS ((PTR, bfd *, struct bfd_link_info *, asection *,
56 struct ecoff_debug_info *));
57static int mips_elf_additional_program_headers PARAMS ((bfd *));
58static boolean mips_elf_modify_segment_map PARAMS ((bfd *));
d1bf45aa 59static boolean mips_elf32_section_from_shdr
aac6b32f 60 PARAMS ((bfd *, Elf32_Internal_Shdr *, char *));
00176555 61static boolean mips_elf32_section_processing
aac6b32f 62 PARAMS ((bfd *, Elf32_Internal_Shdr *));
a2546fce
ILT
63static boolean mips_elf_is_local_label
64 PARAMS ((bfd *, asymbol *));
aac6b32f
ILT
65static struct bfd_hash_entry *mips_elf_link_hash_newfunc
66 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
67static struct bfd_link_hash_table *mips_elf_link_hash_table_create
68 PARAMS ((bfd *));
69static int gptab_compare PARAMS ((const void *, const void *));
70static boolean mips_elf_final_link
71 PARAMS ((bfd *, struct bfd_link_info *));
72static void mips_elf_relocate_hi16
73 PARAMS ((bfd *, Elf_Internal_Rela *, Elf_Internal_Rela *, bfd_byte *,
74 bfd_vma));
5b3b9ff6
ILT
75static void mips_elf_relocate_got_local
76 PARAMS ((bfd *, bfd *, asection *, Elf_Internal_Rela *,
77 Elf_Internal_Rela *, bfd_byte *, bfd_vma));
78static void mips_elf_relocate_global_got
79 PARAMS ((bfd *, Elf_Internal_Rela *, bfd_byte *, bfd_vma));
80static boolean mips_elf_adjust_dynindx
81 PARAMS ((struct elf_link_hash_entry *, PTR));
aac6b32f
ILT
82static boolean mips_elf_relocate_section
83 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
82b1edf7 84 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
53787b23
ILT
85static boolean mips_elf_create_dynamic_sections
86 PARAMS ((bfd *, struct bfd_link_info *));
87static boolean mips_elf_create_compact_rel_section
88 PARAMS ((bfd *, struct bfd_link_info *));
89static boolean mips_elf_create_got_section
90 PARAMS ((bfd *, struct bfd_link_info *));
91static boolean mips_elf_check_relocs
92 PARAMS ((bfd *, struct bfd_link_info *, asection *,
93 const Elf_Internal_Rela *));
94static boolean mips_elf_adjust_dynamic_symbol
95 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
96static boolean mips_elf_size_dynamic_sections
97 PARAMS ((bfd *, struct bfd_link_info *));
98static boolean mips_elf_finish_dynamic_symbol
99 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
100 Elf_Internal_Sym *));
101static boolean mips_elf_finish_dynamic_sections
102 PARAMS ((bfd *, struct bfd_link_info *));
aac6b32f
ILT
103static boolean mips_elf_add_symbol_hook
104 PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
105 const char **, flagword *, asection **, bfd_vma *));
5b3b9ff6 106static bfd_reloc_status_type mips_elf_final_gp
abec70b9 107 PARAMS ((bfd *, asymbol *, boolean, char **, bfd_vma *));
53787b23
ILT
108static bfd_byte *elf32_mips_get_relocated_section_contents
109 PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
110 bfd_byte *, boolean, asymbol **));
5b3b9ff6
ILT
111
112/* This is true for Irix 5 executables, false for normal MIPS ELF ABI
113 executables. FIXME: At the moment, we default to always generating
114 Irix 5 executables. */
115
116#define SGI_COMPAT(abfd) (1)
117
118/* This structure is used to hold .got information when linking. It
119 is stored in the tdata field of the bfd_elf_section_data structure. */
120
121struct mips_got_info
122{
123 /* The symbol index of the first global .got symbol. */
124 unsigned long global_gotsym;
125 /* The number of local .got entries. */
126 unsigned int local_gotno;
127};
128
129/* The number of local .got entries we reserve. */
130#define MIPS_RESERVED_GOTNO (2)
131
132/* Instructions which appear in a stub. For some reason the stub is
133 slightly different on an SGI system. */
134#define ELF_MIPS_GP_OFFSET(abfd) (SGI_COMPAT (abfd) ? 0x7ff0 : 0x8000)
135#define STUB_LW(abfd) \
136 (SGI_COMPAT (abfd) \
137 ? 0x8f998010 /* lw t9,0x8010(gp) */ \
138 : 0x8f998000) /* lw t9,0x8000(gp) */
139#define STUB_MOVE 0x03e07825 /* move t7,ra */
140#define STUB_JALR 0x0320f809 /* jal t9 */
141#define STUB_LI16 0x34180000 /* ori t8,zero,0 */
142#define MIPS_FUNCTION_STUB_SIZE (16)
143
144/* Names of sections which appear in the .dynsym section in an Irix 5
145 executable. */
146
147static const char * const mips_elf_dynsym_sec_names[] =
148{
149 ".text",
150 ".init",
151 ".fini",
152 ".data",
153 ".rodata",
154 ".sdata",
155 ".sbss",
156 ".bss",
157 NULL
158};
159
160#define SIZEOF_MIPS_DYNSYM_SECNAMES \
161 (sizeof mips_elf_dynsym_sec_names / sizeof mips_elf_dynsym_sec_names[0])
162
163/* The number of entries in mips_elf_dynsym_sec_names which go in the
164 text segment. */
165
166#define MIPS_TEXT_DYNSYM_SECNO (3)
167
168/* The names of the runtime procedure table symbols used on Irix 5. */
169
170static const char * const mips_elf_dynsym_rtproc_names[] =
171{
172 "_procedure_table",
173 "_procedure_string_table",
174 "_procedure_table_size",
175 NULL
176};
177
178/* These structures are used to generate the .compact_rel section on
179 Irix 5. */
180
181typedef struct
182{
183 unsigned long id1; /* Always one? */
184 unsigned long num; /* Number of compact relocation entries. */
185 unsigned long id2; /* Always two? */
186 unsigned long offset; /* The file offset of the first relocation. */
187 unsigned long reserved0; /* Zero? */
188 unsigned long reserved1; /* Zero? */
189} Elf32_compact_rel;
190
191typedef struct
192{
193 bfd_byte id1[4];
194 bfd_byte num[4];
195 bfd_byte id2[4];
196 bfd_byte offset[4];
197 bfd_byte reserved0[4];
198 bfd_byte reserved1[4];
199} Elf32_External_compact_rel;
200
201typedef struct
202{
053baeb1
ILT
203 unsigned int ctype : 1; /* 1: long 0: short format. See below. */
204 unsigned int rtype : 4; /* Relocation types. See below. */
205 unsigned int dist2to : 8;
206 unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
5b3b9ff6
ILT
207 unsigned long konst; /* KONST field. See below. */
208 unsigned long vaddr; /* VADDR to be relocated. */
209} Elf32_crinfo;
210
211typedef struct
212{
053baeb1
ILT
213 unsigned int ctype : 1; /* 1: long 0: short format. See below. */
214 unsigned int rtype : 4; /* Relocation types. See below. */
215 unsigned int dist2to : 8;
216 unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */
5b3b9ff6
ILT
217 unsigned long konst; /* KONST field. See below. */
218} Elf32_crinfo2;
219
220typedef struct
221{
222 bfd_byte info[4];
223 bfd_byte konst[4];
224 bfd_byte vaddr[4];
225} Elf32_External_crinfo;
226
227typedef struct
228{
229 bfd_byte info[4];
230 bfd_byte konst[4];
231} Elf32_External_crinfo2;
232
053baeb1
ILT
233/* These are the constants used to swap the bitfields in a crinfo. */
234
235#define CRINFO_CTYPE (0x1)
236#define CRINFO_CTYPE_SH (31)
237#define CRINFO_RTYPE (0xf)
238#define CRINFO_RTYPE_SH (27)
239#define CRINFO_DIST2TO (0xff)
240#define CRINFO_DIST2TO_SH (19)
241#define CRINFO_RELVADDR (0x7ffff)
242#define CRINFO_RELVADDR_SH (0)
243
5b3b9ff6
ILT
244/* A compact relocation info has long (3 words) or short (2 words)
245 formats. A short format doesn't have VADDR field and relvaddr
246 fields contains ((VADDR - vaddr of the previous entry) >> 2). */
247#define CRF_MIPS_LONG 1
248#define CRF_MIPS_SHORT 0
249
250/* There are 4 types of compact relocation at least. The value KONST
251 has different meaning for each type:
252
253 (type) (konst)
254 CT_MIPS_REL32 Address in data
255 CT_MIPS_WORD Address in word (XXX)
256 CT_MIPS_GPHI_LO GP - vaddr
257 CT_MIPS_JMPAD Address to jump
258 */
259
260#define CRT_MIPS_REL32 0xa
261#define CRT_MIPS_WORD 0xb
262#define CRT_MIPS_GPHI_LO 0xc
263#define CRT_MIPS_JMPAD 0xd
264
053baeb1
ILT
265#define mips_elf_set_cr_format(x,format) ((x).ctype = (format))
266#define mips_elf_set_cr_type(x,type) ((x).rtype = (type))
267#define mips_elf_set_cr_dist2to(x,v) ((x).dist2to = (v))
268#define mips_elf_set_cr_relvaddr(x,d) ((x).relvaddr = (d)<<2)
b3c0fc57 269
53787b23
ILT
270static void bfd_elf32_swap_compact_rel_out
271 PARAMS ((bfd *, const Elf32_compact_rel *, Elf32_External_compact_rel *));
272static void bfd_elf32_swap_crinfo_out
273 PARAMS ((bfd *, const Elf32_crinfo *, Elf32_External_crinfo *));
274
b3c0fc57
ILT
275#define USE_REL 1 /* MIPS uses REL relocations instead of RELA */
276
277enum reloc_type
278{
279 R_MIPS_NONE = 0,
280 R_MIPS_16, R_MIPS_32,
281 R_MIPS_REL32, R_MIPS_26,
282 R_MIPS_HI16, R_MIPS_LO16,
283 R_MIPS_GPREL16, R_MIPS_LITERAL,
284 R_MIPS_GOT16, R_MIPS_PC16,
285 R_MIPS_CALL16, R_MIPS_GPREL32,
6a5848cd
ILT
286 /* The remaining relocs are defined on Irix, although they are not
287 in the MIPS ELF ABI. */
288 R_MIPS_UNUSED1, R_MIPS_UNUSED2,
289 R_MIPS_UNUSED3,
290 R_MIPS_SHIFT5, R_MIPS_SHIFT6,
291 R_MIPS_64, R_MIPS_GOT_DISP,
292 R_MIPS_GOT_PAGE, R_MIPS_GOT_OFST,
293 R_MIPS_GOT_HI16, R_MIPS_GOT_LO16,
294 R_MIPS_SUB, R_MIPS_INSERT_A,
295 R_MIPS_INSERT_B, R_MIPS_DELETE,
296 R_MIPS_HIGHER, R_MIPS_HIGHEST,
297 R_MIPS_CALL_HI16, R_MIPS_CALL_LO16,
b3c0fc57
ILT
298 R_MIPS_max
299};
300
301static reloc_howto_type elf_mips_howto_table[] =
302{
303 /* No relocation. */
304 HOWTO (R_MIPS_NONE, /* type */
305 0, /* rightshift */
306 0, /* size (0 = byte, 1 = short, 2 = long) */
307 0, /* bitsize */
308 false, /* pc_relative */
309 0, /* bitpos */
310 complain_overflow_dont, /* complain_on_overflow */
311 bfd_elf_generic_reloc, /* special_function */
312 "R_MIPS_NONE", /* name */
313 false, /* partial_inplace */
314 0, /* src_mask */
315 0, /* dst_mask */
316 false), /* pcrel_offset */
317
318 /* 16 bit relocation. */
319 HOWTO (R_MIPS_16, /* type */
320 0, /* rightshift */
321 1, /* size (0 = byte, 1 = short, 2 = long) */
322 16, /* bitsize */
323 false, /* pc_relative */
324 0, /* bitpos */
325 complain_overflow_bitfield, /* complain_on_overflow */
326 bfd_elf_generic_reloc, /* special_function */
327 "R_MIPS_16", /* name */
328 true, /* partial_inplace */
329 0xffff, /* src_mask */
330 0xffff, /* dst_mask */
331 false), /* pcrel_offset */
332
333 /* 32 bit relocation. */
334 HOWTO (R_MIPS_32, /* type */
335 0, /* rightshift */
336 2, /* size (0 = byte, 1 = short, 2 = long) */
337 32, /* bitsize */
338 false, /* pc_relative */
339 0, /* bitpos */
340 complain_overflow_bitfield, /* complain_on_overflow */
341 bfd_elf_generic_reloc, /* special_function */
342 "R_MIPS_32", /* name */
343 true, /* partial_inplace */
344 0xffffffff, /* src_mask */
345 0xffffffff, /* dst_mask */
346 false), /* pcrel_offset */
347
348 /* 32 bit symbol relative relocation. */
349 HOWTO (R_MIPS_REL32, /* type */
350 0, /* rightshift */
351 2, /* size (0 = byte, 1 = short, 2 = long) */
352 32, /* bitsize */
353 false, /* pc_relative */
354 0, /* bitpos */
355 complain_overflow_bitfield, /* complain_on_overflow */
356 bfd_elf_generic_reloc, /* special_function */
357 "R_MIPS_REL32", /* name */
358 true, /* partial_inplace */
359 0xffffffff, /* src_mask */
360 0xffffffff, /* dst_mask */
361 false), /* pcrel_offset */
362
363 /* 26 bit branch address. */
364 HOWTO (R_MIPS_26, /* type */
365 2, /* rightshift */
366 2, /* size (0 = byte, 1 = short, 2 = long) */
367 26, /* bitsize */
368 false, /* pc_relative */
369 0, /* bitpos */
6e07e54f
ILT
370 complain_overflow_dont, /* complain_on_overflow */
371 /* This needs complex overflow
372 detection, because the upper four
373 bits must match the PC. */
b3c0fc57
ILT
374 bfd_elf_generic_reloc, /* special_function */
375 "R_MIPS_26", /* name */
376 true, /* partial_inplace */
377 0x3ffffff, /* src_mask */
378 0x3ffffff, /* dst_mask */
379 false), /* pcrel_offset */
380
381 /* High 16 bits of symbol value. */
382 HOWTO (R_MIPS_HI16, /* type */
383 0, /* rightshift */
384 2, /* size (0 = byte, 1 = short, 2 = long) */
385 16, /* bitsize */
386 false, /* pc_relative */
387 0, /* bitpos */
388 complain_overflow_dont, /* complain_on_overflow */
bc05732b 389 _bfd_mips_elf_hi16_reloc, /* special_function */
b3c0fc57
ILT
390 "R_MIPS_HI16", /* name */
391 true, /* partial_inplace */
392 0xffff, /* src_mask */
393 0xffff, /* dst_mask */
394 false), /* pcrel_offset */
395
396 /* Low 16 bits of symbol value. */
397 HOWTO (R_MIPS_LO16, /* type */
398 0, /* rightshift */
399 2, /* size (0 = byte, 1 = short, 2 = long) */
400 16, /* bitsize */
401 false, /* pc_relative */
402 0, /* bitpos */
403 complain_overflow_dont, /* complain_on_overflow */
bc05732b 404 _bfd_mips_elf_lo16_reloc, /* special_function */
b3c0fc57
ILT
405 "R_MIPS_LO16", /* name */
406 true, /* partial_inplace */
407 0xffff, /* src_mask */
408 0xffff, /* dst_mask */
409 false), /* pcrel_offset */
410
411 /* GP relative reference. */
412 HOWTO (R_MIPS_GPREL16, /* type */
413 0, /* rightshift */
414 2, /* size (0 = byte, 1 = short, 2 = long) */
415 16, /* bitsize */
416 false, /* pc_relative */
417 0, /* bitpos */
418 complain_overflow_signed, /* complain_on_overflow */
bc05732b 419 _bfd_mips_elf_gprel16_reloc, /* special_function */
b3c0fc57
ILT
420 "R_MIPS_GPREL16", /* name */
421 true, /* partial_inplace */
422 0xffff, /* src_mask */
423 0xffff, /* dst_mask */
424 false), /* pcrel_offset */
425
426 /* Reference to literal section. */
427 HOWTO (R_MIPS_LITERAL, /* type */
428 0, /* rightshift */
429 2, /* size (0 = byte, 1 = short, 2 = long) */
430 16, /* bitsize */
431 false, /* pc_relative */
432 0, /* bitpos */
433 complain_overflow_signed, /* complain_on_overflow */
bc05732b 434 _bfd_mips_elf_gprel16_reloc, /* special_function */
b3c0fc57
ILT
435 "R_MIPS_LITERAL", /* name */
436 true, /* partial_inplace */
437 0xffff, /* src_mask */
438 0xffff, /* dst_mask */
439 false), /* pcrel_offset */
440
441 /* Reference to global offset table. */
b3c0fc57
ILT
442 HOWTO (R_MIPS_GOT16, /* type */
443 0, /* rightshift */
444 2, /* size (0 = byte, 1 = short, 2 = long) */
445 16, /* bitsize */
446 false, /* pc_relative */
447 0, /* bitpos */
448 complain_overflow_signed, /* complain_on_overflow */
bc05732b 449 _bfd_mips_elf_got16_reloc, /* special_function */
b3c0fc57
ILT
450 "R_MIPS_GOT16", /* name */
451 false, /* partial_inplace */
452 0, /* src_mask */
453 0xffff, /* dst_mask */
454 false), /* pcrel_offset */
455
456 /* 16 bit PC relative reference. */
457 HOWTO (R_MIPS_PC16, /* type */
458 0, /* rightshift */
459 2, /* size (0 = byte, 1 = short, 2 = long) */
460 16, /* bitsize */
461 true, /* pc_relative */
462 0, /* bitpos */
463 complain_overflow_signed, /* complain_on_overflow */
464 bfd_elf_generic_reloc, /* special_function */
465 "R_MIPS_PC16", /* name */
466 true, /* partial_inplace */
467 0xffff, /* src_mask */
468 0xffff, /* dst_mask */
469 false), /* pcrel_offset */
470
471 /* 16 bit call through global offset table. */
472 /* FIXME: This is not handled correctly. */
473 HOWTO (R_MIPS_CALL16, /* type */
474 0, /* rightshift */
475 2, /* size (0 = byte, 1 = short, 2 = long) */
476 16, /* bitsize */
477 false, /* pc_relative */
478 0, /* bitpos */
479 complain_overflow_signed, /* complain_on_overflow */
480 bfd_elf_generic_reloc, /* special_function */
481 "R_MIPS_CALL16", /* name */
482 false, /* partial_inplace */
483 0, /* src_mask */
484 0xffff, /* dst_mask */
485 false), /* pcrel_offset */
486
487 /* 32 bit GP relative reference. */
b3c0fc57
ILT
488 HOWTO (R_MIPS_GPREL32, /* type */
489 0, /* rightshift */
490 2, /* size (0 = byte, 1 = short, 2 = long) */
491 32, /* bitsize */
492 false, /* pc_relative */
493 0, /* bitpos */
494 complain_overflow_bitfield, /* complain_on_overflow */
bc05732b 495 _bfd_mips_elf_gprel32_reloc, /* special_function */
b3c0fc57
ILT
496 "R_MIPS_GPREL32", /* name */
497 true, /* partial_inplace */
498 0xffffffff, /* src_mask */
499 0xffffffff, /* dst_mask */
6a5848cd
ILT
500 false), /* pcrel_offset */
501
502 /* The remaining relocs are defined on Irix 5, although they are
503 not defined by the ABI. */
504 { 13 },
505 { 14 },
506 { 15 },
507
508 /* A 5 bit shift field. */
509 HOWTO (R_MIPS_SHIFT5, /* type */
510 0, /* rightshift */
511 2, /* size (0 = byte, 1 = short, 2 = long) */
512 5, /* bitsize */
513 false, /* pc_relative */
514 6, /* bitpos */
515 complain_overflow_bitfield, /* complain_on_overflow */
516 bfd_elf_generic_reloc, /* special_function */
517 "R_MIPS_SHIFT5", /* name */
518 true, /* partial_inplace */
519 0x000007c0, /* src_mask */
520 0x000007c0, /* dst_mask */
521 false), /* pcrel_offset */
522
523 /* A 6 bit shift field. */
524 /* FIXME: This is not handled correctly; a special function is
525 needed to put the most significant bit in the right place. */
526 HOWTO (R_MIPS_SHIFT6, /* type */
527 0, /* rightshift */
528 2, /* size (0 = byte, 1 = short, 2 = long) */
529 6, /* bitsize */
530 false, /* pc_relative */
531 6, /* bitpos */
532 complain_overflow_bitfield, /* complain_on_overflow */
533 bfd_elf_generic_reloc, /* special_function */
534 "R_MIPS_SHIFT6", /* name */
535 true, /* partial_inplace */
536 0x000007c4, /* src_mask */
537 0x000007c4, /* dst_mask */
538 false), /* pcrel_offset */
539
540 /* A 64 bit relocation. Presumably not used in 32 bit ELF. */
541 { R_MIPS_64 },
542
543 /* Displacement in the global offset table. */
544 /* FIXME: Not handled correctly. */
545 HOWTO (R_MIPS_GOT_DISP, /* type */
546 0, /* rightshift */
547 2, /* size (0 = byte, 1 = short, 2 = long) */
548 16, /* bitsize */
549 false, /* pc_relative */
550 0, /* bitpos */
551 complain_overflow_bitfield, /* complain_on_overflow */
552 bfd_elf_generic_reloc, /* special_function */
553 "R_MIPS_GOT_DISP", /* name */
554 true, /* partial_inplace */
555 0x0000ffff, /* src_mask */
556 0x0000ffff, /* dst_mask */
557 false), /* pcrel_offset */
558
559 /* Displacement to page pointer in the global offset table. */
560 /* FIXME: Not handled correctly. */
561 HOWTO (R_MIPS_GOT_PAGE, /* type */
562 0, /* rightshift */
563 2, /* size (0 = byte, 1 = short, 2 = long) */
564 16, /* bitsize */
565 false, /* pc_relative */
566 0, /* bitpos */
567 complain_overflow_bitfield, /* complain_on_overflow */
568 bfd_elf_generic_reloc, /* special_function */
569 "R_MIPS_GOT_PAGE", /* name */
570 true, /* partial_inplace */
571 0x0000ffff, /* src_mask */
572 0x0000ffff, /* dst_mask */
573 false), /* pcrel_offset */
574
575 /* Offset from page pointer in the global offset table. */
576 /* FIXME: Not handled correctly. */
577 HOWTO (R_MIPS_GOT_OFST, /* type */
578 0, /* rightshift */
579 2, /* size (0 = byte, 1 = short, 2 = long) */
580 16, /* bitsize */
581 false, /* pc_relative */
582 0, /* bitpos */
583 complain_overflow_bitfield, /* complain_on_overflow */
584 bfd_elf_generic_reloc, /* special_function */
585 "R_MIPS_GOT_OFST", /* name */
586 true, /* partial_inplace */
587 0x0000ffff, /* src_mask */
588 0x0000ffff, /* dst_mask */
589 false), /* pcrel_offset */
590
591 /* High 16 bits of displacement in global offset table. */
592 /* FIXME: Not handled correctly. */
593 HOWTO (R_MIPS_GOT_HI16, /* type */
594 0, /* rightshift */
595 2, /* size (0 = byte, 1 = short, 2 = long) */
596 16, /* bitsize */
597 false, /* pc_relative */
598 0, /* bitpos */
599 complain_overflow_dont, /* complain_on_overflow */
600 bfd_elf_generic_reloc, /* special_function */
601 "R_MIPS_GOT_HI16", /* name */
602 true, /* partial_inplace */
603 0x0000ffff, /* src_mask */
604 0x0000ffff, /* dst_mask */
605 false), /* pcrel_offset */
606
607 /* Low 16 bits of displacement in global offset table. */
608 /* FIXME: Not handled correctly. */
609 HOWTO (R_MIPS_GOT_LO16, /* type */
610 0, /* rightshift */
611 2, /* size (0 = byte, 1 = short, 2 = long) */
612 16, /* bitsize */
613 false, /* pc_relative */
614 0, /* bitpos */
615 complain_overflow_dont, /* complain_on_overflow */
616 bfd_elf_generic_reloc, /* special_function */
617 "R_MIPS_GOT_LO16", /* name */
618 true, /* partial_inplace */
619 0x0000ffff, /* src_mask */
620 0x0000ffff, /* dst_mask */
621 false), /* pcrel_offset */
622
623 /* 64 bit subtraction. Presumably not used in 32 bit ELF. */
624 { R_MIPS_SUB },
625
626 /* Used to cause the linker to insert and delete instructions? */
627 { R_MIPS_INSERT_A },
628 { R_MIPS_INSERT_B },
629 { R_MIPS_DELETE },
630
631 /* Get the higher values of a 64 bit addend. Presumably not used in
632 32 bit ELF. */
633 { R_MIPS_HIGHER },
634 { R_MIPS_HIGHEST },
635
636 /* High 16 bits of displacement in global offset table. */
637 /* FIXME: Not handled correctly. */
638 HOWTO (R_MIPS_CALL_HI16, /* type */
639 0, /* rightshift */
640 2, /* size (0 = byte, 1 = short, 2 = long) */
641 16, /* bitsize */
642 false, /* pc_relative */
643 0, /* bitpos */
644 complain_overflow_dont, /* complain_on_overflow */
645 bfd_elf_generic_reloc, /* special_function */
646 "R_MIPS_CALL_HI16", /* name */
647 true, /* partial_inplace */
648 0x0000ffff, /* src_mask */
649 0x0000ffff, /* dst_mask */
650 false), /* pcrel_offset */
651
652 /* Low 16 bits of displacement in global offset table. */
653 /* FIXME: Not handled correctly. */
654 HOWTO (R_MIPS_CALL_LO16, /* type */
655 0, /* rightshift */
656 2, /* size (0 = byte, 1 = short, 2 = long) */
657 16, /* bitsize */
658 false, /* pc_relative */
659 0, /* bitpos */
660 complain_overflow_dont, /* complain_on_overflow */
661 bfd_elf_generic_reloc, /* special_function */
662 "R_MIPS_CALL_LO16", /* name */
663 true, /* partial_inplace */
664 0x0000ffff, /* src_mask */
665 0x0000ffff, /* dst_mask */
b3c0fc57
ILT
666 false) /* pcrel_offset */
667};
668
669/* Do a R_MIPS_HI16 relocation. This has to be done in combination
670 with a R_MIPS_LO16 reloc, because there is a carry from the LO16 to
671 the HI16. Here we just save the information we need; we do the
672 actual relocation when we see the LO16. MIPS ELF requires that the
abec70b9
ILT
673 LO16 immediately follow the HI16. As a GNU extension, we permit an
674 arbitrary number of HI16 relocs to be associated with a single LO16
675 reloc. This extension permits gcc to output the HI and LO relocs
676 itself. */
b3c0fc57 677
abec70b9
ILT
678struct mips_hi16
679{
680 struct mips_hi16 *next;
681 bfd_byte *addr;
682 bfd_vma addend;
683};
684
685/* FIXME: This should not be a static variable. */
686
687static struct mips_hi16 *mips_hi16_list;
b3c0fc57 688
bc05732b
ILT
689bfd_reloc_status_type
690_bfd_mips_elf_hi16_reloc (abfd,
b3c0fc57
ILT
691 reloc_entry,
692 symbol,
693 data,
694 input_section,
6e07e54f
ILT
695 output_bfd,
696 error_message)
b3c0fc57
ILT
697 bfd *abfd;
698 arelent *reloc_entry;
699 asymbol *symbol;
700 PTR data;
701 asection *input_section;
702 bfd *output_bfd;
6e07e54f 703 char **error_message;
b3c0fc57
ILT
704{
705 bfd_reloc_status_type ret;
706 bfd_vma relocation;
abec70b9 707 struct mips_hi16 *n;
b3c0fc57 708
b3c0fc57
ILT
709 /* If we're relocating, and this an external symbol, we don't want
710 to change anything. */
711 if (output_bfd != (bfd *) NULL
712 && (symbol->flags & BSF_SECTION_SYM) == 0
713 && reloc_entry->addend == 0)
714 {
715 reloc_entry->address += input_section->output_offset;
716 return bfd_reloc_ok;
717 }
718
5b3b9ff6
ILT
719 ret = bfd_reloc_ok;
720
6e07e54f 721 if (strcmp (bfd_asymbol_name (symbol), "_gp_disp") == 0)
5b3b9ff6
ILT
722 {
723 boolean relocateable;
abec70b9 724 bfd_vma gp;
6e07e54f 725
5b3b9ff6
ILT
726 if (ret == bfd_reloc_undefined)
727 abort ();
b3c0fc57 728
5b3b9ff6
ILT
729 if (output_bfd != NULL)
730 relocateable = true;
731 else
732 {
733 relocateable = false;
734 output_bfd = symbol->section->output_section->owner;
735 }
736
737 ret = mips_elf_final_gp (output_bfd, symbol, relocateable,
abec70b9 738 error_message, &gp);
5b3b9ff6
ILT
739 if (ret != bfd_reloc_ok)
740 return ret;
741
abec70b9 742 relocation = gp - reloc_entry->address;
5b3b9ff6 743 }
b3c0fc57 744 else
5b3b9ff6
ILT
745 {
746 if (bfd_is_und_section (symbol->section)
747 && output_bfd == (bfd *) NULL)
748 ret = bfd_reloc_undefined;
749
750 if (bfd_is_com_section (symbol->section))
751 relocation = 0;
752 else
753 relocation = symbol->value;
754 }
b3c0fc57
ILT
755
756 relocation += symbol->section->output_section->vma;
757 relocation += symbol->section->output_offset;
758 relocation += reloc_entry->addend;
759
760 if (reloc_entry->address > input_section->_cooked_size)
761 return bfd_reloc_outofrange;
762
763 /* Save the information, and let LO16 do the actual relocation. */
abec70b9
ILT
764 n = (struct mips_hi16 *) bfd_malloc (sizeof *n);
765 if (n == NULL)
766 return bfd_reloc_outofrange;
767 n->addr = (bfd_byte *) data + reloc_entry->address;
768 n->addend = relocation;
769 n->next = mips_hi16_list;
770 mips_hi16_list = n;
b3c0fc57
ILT
771
772 if (output_bfd != (bfd *) NULL)
773 reloc_entry->address += input_section->output_offset;
774
775 return ret;
776}
777
778/* Do a R_MIPS_LO16 relocation. This is a straightforward 16 bit
779 inplace relocation; this function exists in order to do the
780 R_MIPS_HI16 relocation described above. */
781
bc05732b
ILT
782bfd_reloc_status_type
783_bfd_mips_elf_lo16_reloc (abfd,
b3c0fc57
ILT
784 reloc_entry,
785 symbol,
786 data,
787 input_section,
6e07e54f
ILT
788 output_bfd,
789 error_message)
b3c0fc57
ILT
790 bfd *abfd;
791 arelent *reloc_entry;
792 asymbol *symbol;
793 PTR data;
794 asection *input_section;
795 bfd *output_bfd;
6e07e54f 796 char **error_message;
b3c0fc57 797{
5b3b9ff6 798 arelent gp_disp_relent;
b3c0fc57 799
abec70b9 800 if (mips_hi16_list != NULL)
b3c0fc57 801 {
abec70b9
ILT
802 struct mips_hi16 *l;
803
804 l = mips_hi16_list;
805 while (l != NULL)
5b3b9ff6 806 {
abec70b9
ILT
807 unsigned long insn;
808 unsigned long val;
809 unsigned long vallo;
810 struct mips_hi16 *next;
811
812 /* Do the HI16 relocation. Note that we actually don't need
813 to know anything about the LO16 itself, except where to
814 find the low 16 bits of the addend needed by the LO16. */
815 insn = bfd_get_32 (abfd, l->addr);
816 vallo = (bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address)
817 & 0xffff);
818 val = ((insn & 0xffff) << 16) + vallo;
819 val += l->addend;
820
821 /* The low order 16 bits are always treated as a signed
822 value. Therefore, a negative value in the low order bits
823 requires an adjustment in the high order bits. We need
824 to make this adjustment in two ways: once for the bits we
825 took from the data, and once for the bits we are putting
826 back in to the data. */
827 if ((vallo & 0x8000) != 0)
828 val -= 0x10000;
829 if ((val & 0x8000) != 0)
830 val += 0x10000;
831
832 insn = (insn &~ 0xffff) | ((val >> 16) & 0xffff);
833 bfd_put_32 (abfd, insn, l->addr);
834
835 if (strcmp (bfd_asymbol_name (symbol), "_gp_disp") == 0)
836 {
837 gp_disp_relent = *reloc_entry;
838 reloc_entry = &gp_disp_relent;
839 reloc_entry->addend = l->addend;
840 }
841
842 next = l->next;
843 free (l);
844 l = next;
5b3b9ff6 845 }
abec70b9
ILT
846
847 mips_hi16_list = NULL;
5b3b9ff6
ILT
848 }
849 else if (strcmp (bfd_asymbol_name (symbol), "_gp_disp") == 0)
850 {
851 bfd_reloc_status_type ret;
abec70b9 852 bfd_vma gp, relocation;
5b3b9ff6
ILT
853
854 /* FIXME: Does this case ever occur? */
855
abec70b9 856 ret = mips_elf_final_gp (output_bfd, symbol, true, error_message, &gp);
5b3b9ff6
ILT
857 if (ret != bfd_reloc_ok)
858 return ret;
859
abec70b9 860 relocation = gp - reloc_entry->address;
5b3b9ff6
ILT
861 relocation += symbol->section->output_section->vma;
862 relocation += symbol->section->output_offset;
863 relocation += reloc_entry->addend;
864
865 if (reloc_entry->address > input_section->_cooked_size)
866 return bfd_reloc_outofrange;
867
868 gp_disp_relent = *reloc_entry;
869 reloc_entry = &gp_disp_relent;
870 reloc_entry->addend = relocation - 4;
b3c0fc57
ILT
871 }
872
873 /* Now do the LO16 reloc in the usual way. */
874 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
6e07e54f
ILT
875 input_section, output_bfd, error_message);
876}
877
878/* Do a R_MIPS_GOT16 reloc. This is a reloc against the global offset
879 table used for PIC code. If the symbol is an external symbol, the
880 instruction is modified to contain the offset of the appropriate
881 entry in the global offset table. If the symbol is a section
882 symbol, the next reloc is a R_MIPS_LO16 reloc. The two 16 bit
883 addends are combined to form the real addend against the section
884 symbol; the GOT16 is modified to contain the offset of an entry in
885 the global offset table, and the LO16 is modified to offset it
886 appropriately. Thus an offset larger than 16 bits requires a
887 modified value in the global offset table.
888
889 This implementation suffices for the assembler, but the linker does
890 not yet know how to create global offset tables. */
891
bc05732b
ILT
892bfd_reloc_status_type
893_bfd_mips_elf_got16_reloc (abfd,
6e07e54f
ILT
894 reloc_entry,
895 symbol,
896 data,
897 input_section,
898 output_bfd,
899 error_message)
900 bfd *abfd;
901 arelent *reloc_entry;
902 asymbol *symbol;
903 PTR data;
904 asection *input_section;
905 bfd *output_bfd;
906 char **error_message;
907{
908 /* If we're relocating, and this an external symbol, we don't want
909 to change anything. */
910 if (output_bfd != (bfd *) NULL
911 && (symbol->flags & BSF_SECTION_SYM) == 0
912 && reloc_entry->addend == 0)
913 {
914 reloc_entry->address += input_section->output_offset;
915 return bfd_reloc_ok;
916 }
917
918 /* If we're relocating, and this is a local symbol, we can handle it
919 just like HI16. */
920 if (output_bfd != (bfd *) NULL
921 && (symbol->flags & BSF_SECTION_SYM) != 0)
bc05732b
ILT
922 return _bfd_mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
923 input_section, output_bfd, error_message);
6e07e54f
ILT
924
925 abort ();
b3c0fc57
ILT
926}
927
5b3b9ff6
ILT
928/* We have to figure out the gp value, so that we can adjust the
929 symbol value correctly. We look up the symbol _gp in the output
930 BFD. If we can't find it, we're stuck. We cache it in the ELF
931 target data. We don't need to adjust the symbol value for an
932 external symbol if we are producing relocateable output. */
a16fcab3 933
b3c0fc57 934static bfd_reloc_status_type
abec70b9 935mips_elf_final_gp (output_bfd, symbol, relocateable, error_message, pgp)
b3c0fc57 936 bfd *output_bfd;
5b3b9ff6
ILT
937 asymbol *symbol;
938 boolean relocateable;
6e07e54f 939 char **error_message;
abec70b9 940 bfd_vma *pgp;
b3c0fc57 941{
24f13b03 942 if (bfd_is_und_section (symbol->section)
5b3b9ff6 943 && ! relocateable)
abec70b9
ILT
944 {
945 *pgp = 0;
946 return bfd_reloc_undefined;
947 }
a16fcab3 948
abec70b9
ILT
949 *pgp = _bfd_get_gp_value (output_bfd);
950 if (*pgp == 0
5b3b9ff6 951 && (! relocateable
b3c0fc57
ILT
952 || (symbol->flags & BSF_SECTION_SYM) != 0))
953 {
5b3b9ff6 954 if (relocateable)
b3c0fc57
ILT
955 {
956 /* Make up a value. */
abec70b9
ILT
957 *pgp = symbol->section->output_section->vma + 0x4000;
958 _bfd_set_gp_value (output_bfd, *pgp);
b3c0fc57
ILT
959 }
960 else
961 {
962 unsigned int count;
963 asymbol **sym;
964 unsigned int i;
965
966 count = bfd_get_symcount (output_bfd);
967 sym = bfd_get_outsymbols (output_bfd);
968
969 if (sym == (asymbol **) NULL)
970 i = count;
971 else
972 {
973 for (i = 0; i < count; i++, sym++)
974 {
975 register CONST char *name;
976
977 name = bfd_asymbol_name (*sym);
978 if (*name == '_' && strcmp (name, "_gp") == 0)
979 {
abec70b9
ILT
980 *pgp = bfd_asymbol_value (*sym);
981 _bfd_set_gp_value (output_bfd, *pgp);
b3c0fc57
ILT
982 break;
983 }
984 }
985 }
986
987 if (i >= count)
988 {
989 /* Only get the error once. */
abec70b9
ILT
990 *pgp = 4;
991 _bfd_set_gp_value (output_bfd, *pgp);
6e07e54f
ILT
992 *error_message =
993 (char *) "GP relative relocation when _gp not defined";
b3c0fc57
ILT
994 return bfd_reloc_dangerous;
995 }
996 }
997 }
998
5b3b9ff6
ILT
999 return bfd_reloc_ok;
1000}
1001
1002/* Do a R_MIPS_GPREL16 relocation. This is a 16 bit value which must
1003 become the offset from the gp register. This function also handles
1004 R_MIPS_LITERAL relocations, although those can be handled more
1005 cleverly because the entries in the .lit8 and .lit4 sections can be
1006 merged. */
1007
1008static bfd_reloc_status_type gprel16_with_gp PARAMS ((bfd *, asymbol *,
1009 arelent *, asection *,
1010 boolean, PTR, bfd_vma));
1011
bc05732b
ILT
1012bfd_reloc_status_type
1013_bfd_mips_elf_gprel16_reloc (abfd, reloc_entry, symbol, data, input_section,
1014 output_bfd, error_message)
5b3b9ff6
ILT
1015 bfd *abfd;
1016 arelent *reloc_entry;
1017 asymbol *symbol;
1018 PTR data;
1019 asection *input_section;
1020 bfd *output_bfd;
1021 char **error_message;
1022{
1023 boolean relocateable;
1024 bfd_reloc_status_type ret;
abec70b9 1025 bfd_vma gp;
5b3b9ff6
ILT
1026
1027 /* If we're relocating, and this is an external symbol with no
1028 addend, we don't want to change anything. We will only have an
1029 addend if this is a newly created reloc, not read from an ELF
1030 file. */
1031 if (output_bfd != (bfd *) NULL
1032 && (symbol->flags & BSF_SECTION_SYM) == 0
1033 && reloc_entry->addend == 0)
1034 {
1035 reloc_entry->address += input_section->output_offset;
1036 return bfd_reloc_ok;
1037 }
1038
1039 if (output_bfd != (bfd *) NULL)
1040 relocateable = true;
1041 else
1042 {
1043 relocateable = false;
1044 output_bfd = symbol->section->output_section->owner;
1045 }
1046
abec70b9
ILT
1047 ret = mips_elf_final_gp (output_bfd, symbol, relocateable, error_message,
1048 &gp);
5b3b9ff6
ILT
1049 if (ret != bfd_reloc_ok)
1050 return ret;
1051
a2546fce 1052 return gprel16_with_gp (abfd, symbol, reloc_entry, input_section,
abec70b9 1053 relocateable, data, gp);
a16fcab3
KR
1054}
1055
1056static bfd_reloc_status_type
1057gprel16_with_gp (abfd, symbol, reloc_entry, input_section, relocateable, data,
1058 gp)
1059 bfd *abfd;
1060 asymbol *symbol;
1061 arelent *reloc_entry;
1062 asection *input_section;
1063 boolean relocateable;
1064 PTR data;
1065 bfd_vma gp;
1066{
1067 bfd_vma relocation;
1068 unsigned long insn;
1069 unsigned long val;
1070
b3c0fc57
ILT
1071 if (bfd_is_com_section (symbol->section))
1072 relocation = 0;
1073 else
1074 relocation = symbol->value;
1075
1076 relocation += symbol->section->output_section->vma;
1077 relocation += symbol->section->output_offset;
1078
1079 if (reloc_entry->address > input_section->_cooked_size)
1080 return bfd_reloc_outofrange;
1081
1082 insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1083
1084 /* Set val to the offset into the section or symbol. */
bc05732b
ILT
1085 if (reloc_entry->howto->src_mask == 0)
1086 {
1087 /* This case occurs with the 64-bit MIPS ELF ABI. */
1088 val = reloc_entry->addend;
1089 }
1090 else
1091 {
1092 val = ((insn & 0xffff) + reloc_entry->addend) & 0xffff;
1093 if (val & 0x8000)
1094 val -= 0x10000;
1095 }
b3c0fc57
ILT
1096
1097 /* Adjust val for the final section location and GP value. If we
1098 are producing relocateable output, we don't want to do this for
1099 an external symbol. */
5b3b9ff6 1100 if (! relocateable
b3c0fc57 1101 || (symbol->flags & BSF_SECTION_SYM) != 0)
a16fcab3 1102 val += relocation - gp;
b3c0fc57
ILT
1103
1104 insn = (insn &~ 0xffff) | (val & 0xffff);
1105 bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
1106
5b3b9ff6 1107 if (relocateable)
b3c0fc57
ILT
1108 reloc_entry->address += input_section->output_offset;
1109
1110 /* Make sure it fit in 16 bits. */
1111 if (val >= 0x8000 && val < 0xffff8000)
6e07e54f 1112 return bfd_reloc_overflow;
b3c0fc57
ILT
1113
1114 return bfd_reloc_ok;
1115}
6b4b4d17 1116
5b3b9ff6
ILT
1117/* Do a R_MIPS_GPREL32 relocation. Is this 32 bit value the offset
1118 from the gp register? XXX */
1119
1120static bfd_reloc_status_type gprel32_with_gp PARAMS ((bfd *, asymbol *,
1121 arelent *, asection *,
1122 boolean, PTR, bfd_vma));
1123
bc05732b
ILT
1124bfd_reloc_status_type
1125_bfd_mips_elf_gprel32_reloc (abfd,
5b3b9ff6
ILT
1126 reloc_entry,
1127 symbol,
1128 data,
1129 input_section,
1130 output_bfd,
1131 error_message)
1132 bfd *abfd;
1133 arelent *reloc_entry;
1134 asymbol *symbol;
1135 PTR data;
1136 asection *input_section;
1137 bfd *output_bfd;
1138 char **error_message;
1139{
1140 boolean relocateable;
1141 bfd_reloc_status_type ret;
abec70b9 1142 bfd_vma gp;
5b3b9ff6
ILT
1143
1144 /* If we're relocating, and this is an external symbol with no
1145 addend, we don't want to change anything. We will only have an
1146 addend if this is a newly created reloc, not read from an ELF
1147 file. */
1148 if (output_bfd != (bfd *) NULL
1149 && (symbol->flags & BSF_SECTION_SYM) == 0
1150 && reloc_entry->addend == 0)
1151 {
1152 *error_message = (char *)
1153 "32bits gp relative relocation occurs for an external symbol";
1154 return bfd_reloc_outofrange;
1155 }
1156
1157 if (output_bfd != (bfd *) NULL)
abec70b9
ILT
1158 {
1159 relocateable = true;
1160 gp = _bfd_get_gp_value (output_bfd);
1161 }
5b3b9ff6
ILT
1162 else
1163 {
1164 relocateable = false;
1165 output_bfd = symbol->section->output_section->owner;
1166
1167 ret = mips_elf_final_gp (output_bfd, symbol, relocateable,
abec70b9 1168 error_message, &gp);
5b3b9ff6
ILT
1169 if (ret != bfd_reloc_ok)
1170 return ret;
1171 }
1172
1173 return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
abec70b9 1174 relocateable, data, gp);
5b3b9ff6
ILT
1175}
1176
1177static bfd_reloc_status_type
1178gprel32_with_gp (abfd, symbol, reloc_entry, input_section, relocateable, data,
1179 gp)
1180 bfd *abfd;
1181 asymbol *symbol;
1182 arelent *reloc_entry;
1183 asection *input_section;
1184 boolean relocateable;
1185 PTR data;
1186 bfd_vma gp;
1187{
1188 bfd_vma relocation;
1189 unsigned long val;
1190
1191 if (bfd_is_com_section (symbol->section))
1192 relocation = 0;
1193 else
1194 relocation = symbol->value;
1195
1196 relocation += symbol->section->output_section->vma;
1197 relocation += symbol->section->output_offset;
1198
1199 if (reloc_entry->address > input_section->_cooked_size)
1200 return bfd_reloc_outofrange;
1201
bc05732b
ILT
1202 if (reloc_entry->howto->src_mask == 0)
1203 {
1204 /* This case arises with the 64-bit MIPS ELF ABI. */
1205 val = 0;
1206 }
1207 else
1208 val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
5b3b9ff6
ILT
1209
1210 /* Set val to the offset into the section or symbol. */
1211 val += reloc_entry->addend;
1212
1213 /* Adjust val for the final section location and GP value. If we
1214 are producing relocateable output, we don't want to do this for
1215 an external symbol. */
1216 if (! relocateable
1217 || (symbol->flags & BSF_SECTION_SYM) != 0)
1218 val += relocation - gp;
1219
1220 bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
1221
1222 if (relocateable)
1223 reloc_entry->address += input_section->output_offset;
1224
1225 return bfd_reloc_ok;
1226}
1227
b3c0fc57 1228/* A mapping from BFD reloc types to MIPS ELF reloc types. */
6b4b4d17 1229
b3c0fc57
ILT
1230struct elf_reloc_map {
1231 bfd_reloc_code_real_type bfd_reloc_val;
1232 enum reloc_type elf_reloc_val;
1233};
1234
1235static CONST struct elf_reloc_map mips_reloc_map[] =
1236{
1237 { BFD_RELOC_NONE, R_MIPS_NONE, },
1238 { BFD_RELOC_16, R_MIPS_16 },
1239 { BFD_RELOC_32, R_MIPS_32 },
1240 { BFD_RELOC_CTOR, R_MIPS_32 },
1241 { BFD_RELOC_32_PCREL, R_MIPS_REL32 },
1242 { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
1243 { BFD_RELOC_HI16_S, R_MIPS_HI16 },
1244 { BFD_RELOC_LO16, R_MIPS_LO16 },
1245 { BFD_RELOC_MIPS_GPREL, R_MIPS_GPREL16 },
1246 { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
1247 { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
1248 { BFD_RELOC_16_PCREL, R_MIPS_PC16 },
1249 { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
e9f03cd4
ILT
1250 { BFD_RELOC_MIPS_GPREL32, R_MIPS_GPREL32 },
1251 { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
b7384d22
ILT
1252 { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
1253 { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
1254 { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 }
b3c0fc57
ILT
1255};
1256
1257/* Given a BFD reloc type, return a howto structure. */
1258
16fe8950 1259static reloc_howto_type *
b3c0fc57
ILT
1260bfd_elf32_bfd_reloc_type_lookup (abfd, code)
1261 bfd *abfd;
1262 bfd_reloc_code_real_type code;
1263{
6ab826bd 1264 unsigned int i;
b3c0fc57
ILT
1265
1266 for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map); i++)
1267 {
1268 if (mips_reloc_map[i].bfd_reloc_val == code)
1269 return &elf_mips_howto_table[(int) mips_reloc_map[i].elf_reloc_val];
1270 }
1271 return NULL;
1272}
1273
1274/* Given a MIPS reloc type, fill in an arelent structure. */
1275
1276static void
1277mips_info_to_howto_rel (abfd, cache_ptr, dst)
1278 bfd *abfd;
1279 arelent *cache_ptr;
1280 Elf32_Internal_Rel *dst;
1281{
1282 unsigned int r_type;
1283
1284 r_type = ELF32_R_TYPE (dst->r_info);
1285 BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
1286 cache_ptr->howto = &elf_mips_howto_table[r_type];
1287
1288 /* The addend for a GPREL16 or LITERAL relocation comes from the GP
1289 value for the object file. We get the addend now, rather than
1290 when we do the relocation, because the symbol manipulations done
1291 by the linker may cause us to lose track of the input BFD. */
1292 if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
1293 && (r_type == (unsigned int) R_MIPS_GPREL16
1294 || r_type == (unsigned int) R_MIPS_LITERAL))
1295 cache_ptr->addend = elf_gp (abfd);
1296}
1297\f
1298/* A .reginfo section holds a single Elf32_RegInfo structure. These
1299 routines swap this structure in and out. They are used outside of
1300 BFD, so they are globally visible. */
1301
1302void
1303bfd_mips_elf32_swap_reginfo_in (abfd, ex, in)
1304 bfd *abfd;
1305 const Elf32_External_RegInfo *ex;
1306 Elf32_RegInfo *in;
1307{
1308 in->ri_gprmask = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_gprmask);
1309 in->ri_cprmask[0] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[0]);
1310 in->ri_cprmask[1] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[1]);
1311 in->ri_cprmask[2] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[2]);
1312 in->ri_cprmask[3] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[3]);
1313 in->ri_gp_value = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_gp_value);
1314}
1315
1316void
1317bfd_mips_elf32_swap_reginfo_out (abfd, in, ex)
1318 bfd *abfd;
1319 const Elf32_RegInfo *in;
1320 Elf32_External_RegInfo *ex;
1321{
1322 bfd_h_put_32 (abfd, (bfd_vma) in->ri_gprmask,
1323 (bfd_byte *) ex->ri_gprmask);
1324 bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[0],
1325 (bfd_byte *) ex->ri_cprmask[0]);
1326 bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[1],
1327 (bfd_byte *) ex->ri_cprmask[1]);
1328 bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[2],
1329 (bfd_byte *) ex->ri_cprmask[2]);
1330 bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[3],
1331 (bfd_byte *) ex->ri_cprmask[3]);
1332 bfd_h_put_32 (abfd, (bfd_vma) in->ri_gp_value,
1333 (bfd_byte *) ex->ri_gp_value);
1334}
aac6b32f 1335
903612a2
ILT
1336/* In the 64 bit ABI, the .MIPS.options section holds register
1337 information in an Elf64_Reginfo structure. These routines swap
1338 them in and out. They are globally visible because they are used
1339 outside of BFD. These routines are here so that gas can call them
1340 without worrying about whether the 64 bit ABI has been included. */
1341
1342void
1343bfd_mips_elf64_swap_reginfo_in (abfd, ex, in)
1344 bfd *abfd;
1345 const Elf64_External_RegInfo *ex;
1346 Elf64_Internal_RegInfo *in;
1347{
1348 in->ri_gprmask = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_gprmask);
1349 in->ri_pad = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_pad);
1350 in->ri_cprmask[0] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[0]);
1351 in->ri_cprmask[1] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[1]);
1352 in->ri_cprmask[2] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[2]);
1353 in->ri_cprmask[3] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[3]);
1354 in->ri_gp_value = bfd_h_get_64 (abfd, (bfd_byte *) ex->ri_gp_value);
1355}
1356
1357void
1358bfd_mips_elf64_swap_reginfo_out (abfd, in, ex)
1359 bfd *abfd;
1360 const Elf64_Internal_RegInfo *in;
1361 Elf64_External_RegInfo *ex;
1362{
1363 bfd_h_put_32 (abfd, (bfd_vma) in->ri_gprmask,
1364 (bfd_byte *) ex->ri_gprmask);
1365 bfd_h_put_32 (abfd, (bfd_vma) in->ri_pad,
1366 (bfd_byte *) ex->ri_pad);
1367 bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[0],
1368 (bfd_byte *) ex->ri_cprmask[0]);
1369 bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[1],
1370 (bfd_byte *) ex->ri_cprmask[1]);
1371 bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[2],
1372 (bfd_byte *) ex->ri_cprmask[2]);
1373 bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[3],
1374 (bfd_byte *) ex->ri_cprmask[3]);
1375 bfd_h_put_64 (abfd, (bfd_vma) in->ri_gp_value,
1376 (bfd_byte *) ex->ri_gp_value);
1377}
1378
aac6b32f
ILT
1379/* Swap an entry in a .gptab section. Note that these routines rely
1380 on the equivalence of the two elements of the union. */
1381
1382static void
1383bfd_mips_elf32_swap_gptab_in (abfd, ex, in)
1384 bfd *abfd;
1385 const Elf32_External_gptab *ex;
1386 Elf32_gptab *in;
1387{
1388 in->gt_entry.gt_g_value = bfd_h_get_32 (abfd, ex->gt_entry.gt_g_value);
1389 in->gt_entry.gt_bytes = bfd_h_get_32 (abfd, ex->gt_entry.gt_bytes);
1390}
1391
1392static void
1393bfd_mips_elf32_swap_gptab_out (abfd, in, ex)
1394 bfd *abfd;
1395 const Elf32_gptab *in;
1396 Elf32_External_gptab *ex;
1397{
1398 bfd_h_put_32 (abfd, (bfd_vma) in->gt_entry.gt_g_value,
1399 ex->gt_entry.gt_g_value);
1400 bfd_h_put_32 (abfd, (bfd_vma) in->gt_entry.gt_bytes,
1401 ex->gt_entry.gt_bytes);
1402}
5b3b9ff6
ILT
1403
1404static void
1405bfd_elf32_swap_compact_rel_out (abfd, in, ex)
1406 bfd *abfd;
53787b23 1407 const Elf32_compact_rel *in;
5b3b9ff6
ILT
1408 Elf32_External_compact_rel *ex;
1409{
1410 bfd_h_put_32 (abfd, (bfd_vma) in->id1, ex->id1);
1411 bfd_h_put_32 (abfd, (bfd_vma) in->num, ex->num);
1412 bfd_h_put_32 (abfd, (bfd_vma) in->id2, ex->id2);
1413 bfd_h_put_32 (abfd, (bfd_vma) in->offset, ex->offset);
1414 bfd_h_put_32 (abfd, (bfd_vma) in->reserved0, ex->reserved0);
1415 bfd_h_put_32 (abfd, (bfd_vma) in->reserved1, ex->reserved1);
1416}
1417
1418static void
1419bfd_elf32_swap_crinfo_out (abfd, in, ex)
1420 bfd *abfd;
53787b23 1421 const Elf32_crinfo *in;
5b3b9ff6
ILT
1422 Elf32_External_crinfo *ex;
1423{
053baeb1
ILT
1424 unsigned long l;
1425
1426 l = (((in->ctype & CRINFO_CTYPE) << CRINFO_CTYPE_SH)
1427 | ((in->rtype & CRINFO_RTYPE) << CRINFO_RTYPE_SH)
1428 | ((in->dist2to & CRINFO_DIST2TO) << CRINFO_DIST2TO_SH)
1429 | ((in->relvaddr & CRINFO_RELVADDR) << CRINFO_RELVADDR_SH));
1430 bfd_h_put_32 (abfd, (bfd_vma) l, ex->info);
5b3b9ff6
ILT
1431 bfd_h_put_32 (abfd, (bfd_vma) in->konst, ex->konst);
1432 bfd_h_put_32 (abfd, (bfd_vma) in->vaddr, ex->vaddr);
1433}
bc05732b
ILT
1434
1435/* Swap in an options header. */
1436
1437void
1438bfd_mips_elf_swap_options_in (abfd, ex, in)
1439 bfd *abfd;
1440 const Elf_External_Options *ex;
1441 Elf_Internal_Options *in;
1442{
1443 in->kind = bfd_h_get_8 (abfd, ex->kind);
1444 in->size = bfd_h_get_8 (abfd, ex->size);
1445 in->section = bfd_h_get_16 (abfd, ex->section);
1446 in->info = bfd_h_get_32 (abfd, ex->info);
1447}
1448
1449/* Swap out an options header. */
1450
1451void
1452bfd_mips_elf_swap_options_out (abfd, in, ex)
1453 bfd *abfd;
1454 const Elf_Internal_Options *in;
1455 Elf_External_Options *ex;
1456{
1457 bfd_h_put_8 (abfd, in->kind, ex->kind);
1458 bfd_h_put_8 (abfd, in->size, ex->size);
1459 bfd_h_put_16 (abfd, in->section, ex->section);
1460 bfd_h_put_32 (abfd, in->info, ex->info);
1461}
5b3b9ff6
ILT
1462\f
1463/* Determine whether a symbol is global for the purposes of splitting
1464 the symbol table into global symbols and local symbols. At least
6e07e54f
ILT
1465 on Irix 5, this split must be between section symbols and all other
1466 symbols. On most ELF targets the split is between static symbols
1467 and externally visible symbols. */
1468
1469/*ARGSUSED*/
1470static boolean
1471mips_elf_sym_is_global (abfd, sym)
1472 bfd *abfd;
1473 asymbol *sym;
1474{
1475 return (sym->flags & BSF_SECTION_SYM) == 0 ? true : false;
1476}
1477\f
00176555
ILT
1478/* Set the right machine number for a MIPS ELF file. This is used for
1479 both the 32-bit and the 64-bit ABI. */
6e07e54f 1480
00176555
ILT
1481boolean
1482_bfd_mips_elf_object_p (abfd)
6e07e54f
ILT
1483 bfd *abfd;
1484{
1485 switch (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH)
1486 {
1487 default:
1488 case E_MIPS_ARCH_1:
1489 /* Just use the default, which was set in elfcode.h. */
1490 break;
1491
1492 case E_MIPS_ARCH_2:
1493 (void) bfd_default_set_arch_mach (abfd, bfd_arch_mips, 6000);
1494 break;
1495
1496 case E_MIPS_ARCH_3:
1497 (void) bfd_default_set_arch_mach (abfd, bfd_arch_mips, 4000);
1498 break;
cabd8fa0
ILT
1499
1500 case E_MIPS_ARCH_4:
1501 (void) bfd_default_set_arch_mach (abfd, bfd_arch_mips, 8000);
1502 break;
6e07e54f
ILT
1503 }
1504
00176555
ILT
1505 return true;
1506}
1507
1508/* Set the right machine number for a 32-bit MIPS ELF file. */
1509
1510static boolean
1511mips_elf32_object_p (abfd)
1512 bfd *abfd;
1513{
aac6b32f
ILT
1514 /* Irix 5 is broken. Object file symbol tables are not always
1515 sorted correctly such that local symbols precede global symbols,
6c495350
ILT
1516 and the sh_info field in the symbol table is not always right. */
1517 elf_bad_symtab (abfd) = true;
aac6b32f 1518
00176555 1519 return _bfd_mips_elf_object_p (abfd);
6e07e54f
ILT
1520}
1521
1522/* The final processing done just before writing out a MIPS ELF object
1523 file. This gets the MIPS architecture right based on the machine
00176555 1524 number. This is used by both the 32-bit and the 64-bit ABI. */
6e07e54f 1525
24f13b03 1526/*ARGSUSED*/
00176555
ILT
1527void
1528_bfd_mips_elf_final_write_processing (abfd, linker)
6e07e54f 1529 bfd *abfd;
24f13b03 1530 boolean linker;
6e07e54f
ILT
1531{
1532 unsigned long val;
aac6b32f
ILT
1533 unsigned int i;
1534 Elf_Internal_Shdr **hdrpp;
6e07e54f
ILT
1535
1536 switch (bfd_get_mach (abfd))
1537 {
1538 case 3000:
1539 val = E_MIPS_ARCH_1;
1540 break;
1541
1542 case 6000:
1543 val = E_MIPS_ARCH_2;
1544 break;
1545
1546 case 4000:
1547 val = E_MIPS_ARCH_3;
1548 break;
1549
cabd8fa0
ILT
1550 case 8000:
1551 val = E_MIPS_ARCH_4;
1552 break;
1553
6e07e54f 1554 default:
5b3b9ff6
ILT
1555 val = 0;
1556 break;
6e07e54f
ILT
1557 }
1558
1559 elf_elfheader (abfd)->e_flags &=~ EF_MIPS_ARCH;
1560 elf_elfheader (abfd)->e_flags |= val;
aac6b32f
ILT
1561
1562 /* Set the sh_info field for .gptab sections. */
1563 for (i = 1, hdrpp = elf_elfsections (abfd) + 1;
1564 i < elf_elfheader (abfd)->e_shnum;
1565 i++, hdrpp++)
1566 {
1567 if ((*hdrpp)->sh_type == SHT_MIPS_GPTAB)
1568 {
1569 const char *name;
1570 asection *sec;
1571
24f13b03
ILT
1572 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
1573 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
aac6b32f
ILT
1574 BFD_ASSERT (name != NULL
1575 && strncmp (name, ".gptab.", sizeof ".gptab." - 1) == 0);
1576 sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
1577 BFD_ASSERT (sec != NULL);
1578 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
1579 }
1580 }
6e07e54f
ILT
1581}
1582\f
5b3b9ff6
ILT
1583/* Function to keep MIPS specific file flags like as EF_MIPS_PIC. */
1584
bc05732b
ILT
1585boolean
1586_bfd_mips_elf_set_private_flags (abfd, flags)
5b3b9ff6
ILT
1587 bfd *abfd;
1588 flagword flags;
1589{
1590 BFD_ASSERT (!elf_flags_init (abfd)
1591 || elf_elfheader (abfd)->e_flags == flags);
1592
1593 elf_elfheader (abfd)->e_flags = flags;
1594 elf_flags_init (abfd) = true;
1595 return true;
1596}
1597
1598/* Copy backend specific data from one object module to another */
1599
bc05732b
ILT
1600boolean
1601_bfd_mips_elf_copy_private_bfd_data (ibfd, obfd)
5b3b9ff6
ILT
1602 bfd *ibfd;
1603 bfd *obfd;
1604{
1605 /* This function is selected based on the input vector. We only
1606 want to copy information over if the output BFD also uses Elf
1607 format. */
1608 if (bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1609 return true;
1610
1611 BFD_ASSERT (!elf_flags_init (obfd)
1612 || (elf_elfheader (obfd)->e_flags
1613 == elf_elfheader (ibfd)->e_flags));
1614
d1bf45aa 1615 elf_gp (obfd) = elf_gp (ibfd);
5b3b9ff6
ILT
1616 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
1617 elf_flags_init (obfd) = true;
1618 return true;
1619}
1620
1621/* Merge backend specific data from an object file to the output
1622 object file when linking. */
1623
bc05732b
ILT
1624boolean
1625_bfd_mips_elf_merge_private_bfd_data (ibfd, obfd)
5b3b9ff6
ILT
1626 bfd *ibfd;
1627 bfd *obfd;
1628{
1629 flagword old_flags;
1630 flagword new_flags;
1631
1632 /* Check if we have the same endianess */
1633 if (ibfd->xvec->byteorder != obfd->xvec->byteorder
1634 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
1635 {
1636 (*_bfd_error_handler)
1637 ("%s: compiled for a %s endian system and target is %s endian",
1638 bfd_get_filename (ibfd),
1639 bfd_big_endian (ibfd) ? "big" : "little",
1640 bfd_big_endian (obfd) ? "big" : "little");
1641
1642 bfd_set_error (bfd_error_wrong_format);
1643 return false;
1644 }
1645
1646 /* This function is selected based on the input vector. We only
1647 want to copy information over if the output BFD also uses Elf
1648 format. */
1649 if (bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1650 return true;
1651
1652 new_flags = elf_elfheader (ibfd)->e_flags;
1653 elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_NOREORDER;
1654 old_flags = elf_elfheader (obfd)->e_flags;
1655
1656 if (!elf_flags_init (obfd)) /* First call, no flags set */
1657 {
1658 elf_flags_init (obfd) = true;
1659 elf_elfheader (obfd)->e_flags = new_flags;
1660 }
1661 else if (((new_flags ^ old_flags) & ~EF_MIPS_NOREORDER)
1662 == 0) /* Compatible flags are ok */
1663 ;
1664 else /* Incompatible flags */
1665 {
1666 /* Warn about -fPIC mismatch */
1667 if ((new_flags & EF_MIPS_PIC) != (old_flags & EF_MIPS_PIC))
1668 {
1669 new_flags &= ~EF_MIPS_PIC;
1670 (*_bfd_error_handler)
1671 ("%s: needs all files compiled with -fPIC",
1672 bfd_get_filename (ibfd));
1673 }
1674
1675 if ((new_flags & EF_MIPS_CPIC) != (old_flags & EF_MIPS_CPIC))
1676 {
1677 new_flags &= ~EF_MIPS_CPIC;
1678 (*_bfd_error_handler)
1679 ("%s: needs all files compiled with -mabicalls",
1680 bfd_get_filename (ibfd));
1681 }
1682
1683 /* Warn about any other mismatches */
1684 if (new_flags != old_flags)
1685 (*_bfd_error_handler)
1686 ("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)",
1687 bfd_get_filename (ibfd), (unsigned long) new_flags,
1688 (unsigned long) old_flags);
1689
1690 bfd_set_error (bfd_error_bad_value);
1691 return false;
1692 }
1693
1694 return true;
1695}
1696\f
b3c0fc57
ILT
1697/* Handle a MIPS specific section when reading an object file. This
1698 is called when elfcode.h finds a section with an unknown type.
d1bf45aa
ILT
1699 This routine supports both the 32-bit and 64-bit ELF ABI.
1700
b3c0fc57
ILT
1701 FIXME: We need to handle the SHF_MIPS_GPREL flag, but I'm not sure
1702 how to. */
1703
d1bf45aa
ILT
1704boolean
1705_bfd_mips_elf_section_from_shdr (abfd, hdr, name)
b3c0fc57 1706 bfd *abfd;
d1bf45aa
ILT
1707 Elf_Internal_Shdr *hdr;
1708 const char *name;
b3c0fc57
ILT
1709{
1710 /* There ought to be a place to keep ELF backend specific flags, but
1711 at the moment there isn't one. We just keep track of the
1712 sections by their name, instead. Fortunately, the ABI gives
1713 suggested names for all the MIPS specific sections, so we will
1714 probably get away with this. */
1715 switch (hdr->sh_type)
1716 {
1717 case SHT_MIPS_LIBLIST:
1718 if (strcmp (name, ".liblist") != 0)
1719 return false;
1720 break;
6a5848cd
ILT
1721 case SHT_MIPS_MSYM:
1722 if (strcmp (name, ".msym") != 0)
1723 return false;
1724 break;
b3c0fc57
ILT
1725 case SHT_MIPS_CONFLICT:
1726 if (strcmp (name, ".conflict") != 0)
1727 return false;
1728 break;
1729 case SHT_MIPS_GPTAB:
1730 if (strncmp (name, ".gptab.", sizeof ".gptab." - 1) != 0)
1731 return false;
1732 break;
1733 case SHT_MIPS_UCODE:
1734 if (strcmp (name, ".ucode") != 0)
1735 return false;
1736 break;
1737 case SHT_MIPS_DEBUG:
1738 if (strcmp (name, ".mdebug") != 0)
1739 return false;
1740 break;
1741 case SHT_MIPS_REGINFO:
1742 if (strcmp (name, ".reginfo") != 0
1743 || hdr->sh_size != sizeof (Elf32_External_RegInfo))
1744 return false;
1745 break;
6e07e54f 1746 case SHT_MIPS_OPTIONS:
bc05732b
ILT
1747 if (strcmp (name, ".options") != 0
1748 && strcmp (name, ".MIPS.options") != 0)
6e07e54f
ILT
1749 return false;
1750 break;
6a5848cd
ILT
1751 case SHT_MIPS_DWARF:
1752 if (strncmp (name, ".debug_", sizeof ".debug_" - 1) != 0)
1753 return false;
1754 break;
1755 case SHT_MIPS_EVENTS:
1756 if (strncmp (name, ".MIPS.events.", sizeof ".MIPS.events." - 1) != 0)
1757 return false;
1758 break;
b3c0fc57
ILT
1759 default:
1760 return false;
1761 }
1762
497c5434
ILT
1763 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
1764 return false;
b3c0fc57 1765
497c5434
ILT
1766 if (hdr->sh_type == SHT_MIPS_DEBUG)
1767 {
d1bf45aa
ILT
1768 if (! bfd_set_section_flags (abfd, hdr->bfd_section,
1769 (bfd_get_section_flags (abfd,
1770 hdr->bfd_section)
497c5434
ILT
1771 | SEC_DEBUGGING)))
1772 return false;
1773 }
b3c0fc57 1774
d1bf45aa
ILT
1775 return true;
1776}
1777
1778/* Handle a 32-bit MIPS ELF specific section. */
1779
1780static boolean
1781mips_elf32_section_from_shdr (abfd, hdr, name)
1782 bfd *abfd;
1783 Elf_Internal_Shdr *hdr;
1784 char *name;
1785{
1786 if (! _bfd_mips_elf_section_from_shdr (abfd, hdr, name))
1787 return false;
1788
497c5434 1789 /* FIXME: We should record sh_info for a .gptab section. */
b3c0fc57 1790
497c5434
ILT
1791 /* For a .reginfo section, set the gp value in the tdata information
1792 from the contents of this section. We need the gp value while
d1bf45aa
ILT
1793 processing relocs, so we just get it now. The .reginfo section
1794 is not used in the 64-bit MIPS ELF ABI. */
497c5434
ILT
1795 if (hdr->sh_type == SHT_MIPS_REGINFO)
1796 {
1797 Elf32_External_RegInfo ext;
1798 Elf32_RegInfo s;
b3c0fc57 1799
d1bf45aa 1800 if (! bfd_get_section_contents (abfd, hdr->bfd_section, (PTR) &ext,
497c5434
ILT
1801 (file_ptr) 0, sizeof ext))
1802 return false;
1803 bfd_mips_elf32_swap_reginfo_in (abfd, &ext, &s);
1804 elf_gp (abfd) = s.ri_gp_value;
b3c0fc57
ILT
1805 }
1806
bc05732b
ILT
1807 /* For a SHT_MIPS_OPTIONS section, look for a ODK_REGINFO entry, and
1808 set the gp value based on what we find. We may see both
1809 SHT_MIPS_REGINFO and SHT_MIPS_OPTIONS/ODK_REGINFO; in that case,
1810 they should agree. */
1811 if (hdr->sh_type == SHT_MIPS_OPTIONS)
1812 {
1813 bfd_byte *contents, *l, *lend;
1814
1815 contents = (bfd_byte *) bfd_malloc (hdr->sh_size);
1816 if (contents == NULL)
1817 return false;
1818 if (! bfd_get_section_contents (abfd, hdr->bfd_section, contents,
1819 (file_ptr) 0, hdr->sh_size))
1820 {
1821 free (contents);
1822 return false;
1823 }
1824 l = contents;
1825 lend = contents + hdr->sh_size;
1826 while (l + sizeof (Elf_External_Options) <= lend)
1827 {
1828 Elf_Internal_Options intopt;
1829
1830 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
1831 &intopt);
1832 if (intopt.kind == ODK_REGINFO)
1833 {
1834 Elf32_RegInfo intreg;
1835
1836 bfd_mips_elf32_swap_reginfo_in
1837 (abfd,
1838 ((Elf32_External_RegInfo *)
1839 (l + sizeof (Elf_External_Options))),
1840 &intreg);
1841 elf_gp (abfd) = intreg.ri_gp_value;
1842 }
1843 l += intopt.size;
1844 }
1845 free (contents);
1846 }
1847
b3c0fc57
ILT
1848 return true;
1849}
1850
1851/* Set the correct type for a MIPS ELF section. We do this by the
00176555
ILT
1852 section name, which is a hack, but ought to work. This routine is
1853 used by both the 32-bit and the 64-bit ABI. */
b3c0fc57 1854
00176555
ILT
1855boolean
1856_bfd_mips_elf_fake_sections (abfd, hdr, sec)
b3c0fc57
ILT
1857 bfd *abfd;
1858 Elf32_Internal_Shdr *hdr;
1859 asection *sec;
1860{
1861 register const char *name;
1862
1863 name = bfd_get_section_name (abfd, sec);
1864
1865 if (strcmp (name, ".liblist") == 0)
1866 {
1867 hdr->sh_type = SHT_MIPS_LIBLIST;
1868 hdr->sh_info = sec->_raw_size / sizeof (Elf32_Lib);
1869 /* FIXME: Set the sh_link field. */
1870 }
6a5848cd
ILT
1871 else if (strcmp (name, ".msym") == 0)
1872 {
1873 hdr->sh_type = SHT_MIPS_MSYM;
1874 hdr->sh_entsize = 8;
1875 /* FIXME: Set the sh_info field. */
1876 }
b3c0fc57
ILT
1877 else if (strcmp (name, ".conflict") == 0)
1878 hdr->sh_type = SHT_MIPS_CONFLICT;
1879 else if (strncmp (name, ".gptab.", sizeof ".gptab." - 1) == 0)
1880 {
1881 hdr->sh_type = SHT_MIPS_GPTAB;
aac6b32f 1882 hdr->sh_entsize = sizeof (Elf32_External_gptab);
00176555 1883 /* The sh_info field is set in final_write_processing. */
b3c0fc57
ILT
1884 }
1885 else if (strcmp (name, ".ucode") == 0)
1886 hdr->sh_type = SHT_MIPS_UCODE;
1887 else if (strcmp (name, ".mdebug") == 0)
6e07e54f
ILT
1888 {
1889 hdr->sh_type = SHT_MIPS_DEBUG;
5b3b9ff6
ILT
1890 /* In a shared object on Irix 5.3, the .mdebug section has an
1891 entsize of 0. FIXME: Does this matter? */
1892 if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0)
1893 hdr->sh_entsize = 0;
1894 else
1895 hdr->sh_entsize = 1;
6e07e54f 1896 }
b3c0fc57
ILT
1897 else if (strcmp (name, ".reginfo") == 0)
1898 {
1899 hdr->sh_type = SHT_MIPS_REGINFO;
5b3b9ff6
ILT
1900 /* In a shared object on Irix 5.3, the .reginfo section has an
1901 entsize of 0x18. FIXME: Does this matter? */
1902 if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0)
1903 hdr->sh_entsize = sizeof (Elf32_External_RegInfo);
1904 else
1905 hdr->sh_entsize = 1;
b3c0fc57
ILT
1906
1907 /* Force the section size to the correct value, even if the
1908 linker thinks it is larger. The link routine below will only
1909 write out this much data for .reginfo. */
1910 hdr->sh_size = sec->_raw_size = sizeof (Elf32_External_RegInfo);
1911 }
5b3b9ff6
ILT
1912 else if (SGI_COMPAT (abfd)
1913 && (strcmp (name, ".hash") == 0
1914 || strcmp (name, ".dynamic") == 0
1915 || strcmp (name, ".dynstr") == 0))
1916 {
1917 hdr->sh_entsize = 0;
1918 hdr->sh_info = SIZEOF_MIPS_DYNSYM_SECNAMES;
1919 }
1920 else if (strcmp (name, ".got") == 0
1921 || strcmp (name, ".sdata") == 0
1922 || strcmp (name, ".sbss") == 0
1923 || strcmp (name, ".lit4") == 0
1924 || strcmp (name, ".lit8") == 0)
1925 hdr->sh_flags |= SHF_MIPS_GPREL;
bc05732b
ILT
1926 else if (strcmp (name, ".options") == 0
1927 || strcmp (name, ".MIPS.options") == 0)
6e07e54f
ILT
1928 {
1929 hdr->sh_type = SHT_MIPS_OPTIONS;
1930 hdr->sh_entsize = 1;
1931 }
6a5848cd
ILT
1932 else if (strncmp (name, ".debug_", sizeof ".debug_" - 1) == 0)
1933 hdr->sh_type = SHT_MIPS_DWARF;
1934 else if (strncmp (name, ".MIPS.events.", sizeof ".MIPS.events." - 1) == 0)
1935 hdr->sh_type = SHT_MIPS_EVENTS;
b3c0fc57
ILT
1936
1937 return true;
1938}
1939
1940/* Given a BFD section, try to locate the corresponding ELF section
00176555
ILT
1941 index. This is used by both the 32-bit and the 64-bit ABI.
1942 Actually, it's not clear to me that the 64-bit ABI supports these,
1943 but for non-PIC objects we will certainly want support for at least
1944 the .scommon section. */
b3c0fc57 1945
00176555
ILT
1946boolean
1947_bfd_mips_elf_section_from_bfd_section (abfd, hdr, sec, retval)
b3c0fc57
ILT
1948 bfd *abfd;
1949 Elf32_Internal_Shdr *hdr;
1950 asection *sec;
1951 int *retval;
1952{
1953 if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
1954 {
1955 *retval = SHN_MIPS_SCOMMON;
1956 return true;
1957 }
82b1edf7
KR
1958 if (strcmp (bfd_get_section_name (abfd, sec), ".acommon") == 0)
1959 {
1960 *retval = SHN_MIPS_ACOMMON;
1961 return true;
1962 }
b3c0fc57
ILT
1963 return false;
1964}
1965
bc05732b
ILT
1966/* When are writing out the .options or .MIPS.options section,
1967 remember the bytes we are writing out, so that we can install the
1968 GP value in the section_processing routine. */
1969
1970boolean
1971_bfd_mips_elf_set_section_contents (abfd, section, location, offset, count)
1972 bfd *abfd;
1973 sec_ptr section;
1974 PTR location;
1975 file_ptr offset;
1976 bfd_size_type count;
1977{
1978 if (strcmp (section->name, ".options") == 0
1979 || strcmp (section->name, ".MIPS.options") == 0)
1980 {
1981 bfd_byte *c;
1982
1983 if (elf_section_data (section) == NULL)
1984 {
1985 section->used_by_bfd =
1986 (PTR) bfd_zalloc (abfd, sizeof (struct bfd_elf_section_data));
1987 if (elf_section_data (section) == NULL)
1988 return false;
1989 }
1990 c = (bfd_byte *) elf_section_data (section)->tdata;
1991 if (c == NULL)
1992 {
1993 bfd_size_type size;
1994
1995 if (section->_cooked_size != 0)
1996 size = section->_cooked_size;
1997 else
1998 size = section->_raw_size;
1999 c = (PTR) bfd_zalloc (abfd, size);
2000 if (c == NULL)
2001 return false;
2002 elf_section_data (section)->tdata = (PTR) c;
2003 }
2004
2005 memcpy (c + offset, location, count);
2006 }
2007
2008 return _bfd_elf_set_section_contents (abfd, section, location, offset,
2009 count);
2010}
2011
2012/* Work over a section just before writing it out. This routine is
2013 used by both the 32-bit and the 64-bit ABI. FIXME: We recognize
2014 sections that need the SHF_MIPS_GPREL flag by name; there has to be
2015 a better way. */
b3c0fc57 2016
00176555
ILT
2017boolean
2018_bfd_mips_elf_section_processing (abfd, hdr)
b3c0fc57 2019 bfd *abfd;
00176555 2020 Elf_Internal_Shdr *hdr;
b3c0fc57 2021{
24f13b03 2022 if (hdr->bfd_section != NULL)
b3c0fc57 2023 {
24f13b03 2024 const char *name = bfd_get_section_name (abfd, hdr->bfd_section);
b3c0fc57
ILT
2025
2026 if (strcmp (name, ".sdata") == 0)
2027 {
2028 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
2029 hdr->sh_type = SHT_PROGBITS;
2030 }
2031 else if (strcmp (name, ".sbss") == 0)
2032 {
2033 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
2034 hdr->sh_type = SHT_NOBITS;
2035 }
2036 else if (strcmp (name, ".lit8") == 0
2037 || strcmp (name, ".lit4") == 0)
2038 {
2039 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
2040 hdr->sh_type = SHT_PROGBITS;
2041 }
5b3b9ff6
ILT
2042 else if (strcmp (name, ".compact_rel") == 0)
2043 {
2044 hdr->sh_flags = 0;
2045 hdr->sh_type = SHT_PROGBITS;
2046 }
2047 else if (strcmp (name, ".rtproc") == 0)
2048 {
2049 if (hdr->sh_addralign != 0 && hdr->sh_entsize == 0)
2050 {
2051 unsigned int adjust;
2052
2053 adjust = hdr->sh_size % hdr->sh_addralign;
2054 if (adjust != 0)
2055 hdr->sh_size += hdr->sh_addralign - adjust;
2056 }
2057 }
b3c0fc57
ILT
2058 }
2059
2060 return true;
2061}
00176555
ILT
2062
2063/* Work over a section just before writing it out. We update the GP
bc05732b
ILT
2064 value in the SHT_MIPS_REGINFO and SHT_MIPS_OPTIONS sections based
2065 on the value we are using. */
00176555
ILT
2066
2067static boolean
2068mips_elf32_section_processing (abfd, hdr)
2069 bfd *abfd;
2070 Elf32_Internal_Shdr *hdr;
2071{
2072 if (hdr->sh_type == SHT_MIPS_REGINFO)
2073 {
2074 bfd_byte buf[4];
2075
2076 BFD_ASSERT (hdr->sh_size == sizeof (Elf32_External_RegInfo));
2077 BFD_ASSERT (hdr->contents == NULL);
2078
2079 if (bfd_seek (abfd,
2080 hdr->sh_offset + sizeof (Elf32_External_RegInfo) - 4,
2081 SEEK_SET) == -1)
2082 return false;
2083 bfd_h_put_32 (abfd, (bfd_vma) elf_gp (abfd), buf);
2084 if (bfd_write (buf, (bfd_size_type) 1, (bfd_size_type) 4, abfd) != 4)
2085 return false;
2086 }
2087
bc05732b
ILT
2088 if (hdr->sh_type == SHT_MIPS_OPTIONS
2089 && hdr->bfd_section != NULL
2090 && elf_section_data (hdr->bfd_section) != NULL
2091 && elf_section_data (hdr->bfd_section)->tdata != NULL)
2092 {
2093 bfd_byte *contents, *l, *lend;
2094
2095 /* We stored the section contents in the elf_section_data tdata
2096 field in the set_section_contents routine. We save the
2097 section contents so that we don't have to read them again.
2098 At this point we know that elf_gp is set, so we can look
2099 through the section contents to see if there is an
2100 ODK_REGINFO structure. */
2101
2102 contents = (bfd_byte *) elf_section_data (hdr->bfd_section)->tdata;
2103 l = contents;
2104 lend = contents + hdr->sh_size;
2105 while (l + sizeof (Elf_External_Options) <= lend)
2106 {
2107 Elf_Internal_Options intopt;
2108
2109 bfd_mips_elf_swap_options_in (abfd, (Elf_External_Options *) l,
2110 &intopt);
2111 if (intopt.kind == ODK_REGINFO)
2112 {
2113 bfd_byte buf[4];
2114
2115 if (bfd_seek (abfd,
2116 (hdr->sh_offset
2117 + (l - contents)
2118 + sizeof (Elf_External_Options)
2119 + (sizeof (Elf32_External_RegInfo) - 4)),
2120 SEEK_SET) == -1)
2121 return false;
2122 bfd_h_put_32 (abfd, elf_gp (abfd), buf);
2123 if (bfd_write (buf, 1, 4, abfd) != 4)
2124 return false;
2125 }
2126 l += intopt.size;
2127 }
2128 }
2129
00176555
ILT
2130 return _bfd_mips_elf_section_processing (abfd, hdr);
2131}
b3c0fc57 2132\f
aac6b32f
ILT
2133/* MIPS ELF uses two common sections. One is the usual one, and the
2134 other is for small objects. All the small objects are kept
2135 together, and then referenced via the gp pointer, which yields
2136 faster assembler code. This is what we use for the small common
2137 section. This approach is copied from ecoff.c. */
2138static asection mips_elf_scom_section;
2139static asymbol mips_elf_scom_symbol;
2140static asymbol *mips_elf_scom_symbol_ptr;
2141
2142/* MIPS ELF also uses an acommon section, which represents an
2143 allocated common symbol which may be overridden by a
2144 definition in a shared library. */
2145static asection mips_elf_acom_section;
2146static asymbol mips_elf_acom_symbol;
2147static asymbol *mips_elf_acom_symbol_ptr;
2148
5b3b9ff6
ILT
2149/* The Irix 5 support uses two virtual sections, which represent
2150 text/data symbols defined in dynamic objects. */
2151static asection mips_elf_text_section;
2152static asection *mips_elf_text_section_ptr;
2153static asymbol mips_elf_text_symbol;
2154static asymbol *mips_elf_text_symbol_ptr;
2155
2156static asection mips_elf_data_section;
2157static asection *mips_elf_data_section_ptr;
2158static asymbol mips_elf_data_symbol;
2159static asymbol *mips_elf_data_symbol_ptr;
2160
00176555
ILT
2161/* Handle the special MIPS section numbers that a symbol may use.
2162 This is used for both the 32-bit and the 64-bit ABI. */
aac6b32f 2163
00176555
ILT
2164void
2165_bfd_mips_elf_symbol_processing (abfd, asym)
aac6b32f
ILT
2166 bfd *abfd;
2167 asymbol *asym;
2168{
2169 elf_symbol_type *elfsym;
2170
2171 elfsym = (elf_symbol_type *) asym;
2172 switch (elfsym->internal_elf_sym.st_shndx)
2173 {
2174 case SHN_MIPS_ACOMMON:
2175 /* This section is used in a dynamically linked executable file.
2176 It is an allocated common section. The dynamic linker can
2177 either resolve these symbols to something in a shared
2178 library, or it can just leave them here. For our purposes,
2179 we can consider these symbols to be in a new section. */
2180 if (mips_elf_acom_section.name == NULL)
2181 {
2182 /* Initialize the acommon section. */
2183 mips_elf_acom_section.name = ".acommon";
6ab826bd 2184 mips_elf_acom_section.flags = SEC_ALLOC;
aac6b32f
ILT
2185 mips_elf_acom_section.output_section = &mips_elf_acom_section;
2186 mips_elf_acom_section.symbol = &mips_elf_acom_symbol;
2187 mips_elf_acom_section.symbol_ptr_ptr = &mips_elf_acom_symbol_ptr;
2188 mips_elf_acom_symbol.name = ".acommon";
2189 mips_elf_acom_symbol.flags = BSF_SECTION_SYM;
2190 mips_elf_acom_symbol.section = &mips_elf_acom_section;
2191 mips_elf_acom_symbol_ptr = &mips_elf_acom_symbol;
2192 }
2193 asym->section = &mips_elf_acom_section;
2194 break;
2195
2196 case SHN_COMMON:
2197 /* Common symbols less than the GP size are automatically
2198 treated as SHN_MIPS_SCOMMON symbols. */
2199 if (asym->value > elf_gp_size (abfd))
2200 break;
2201 /* Fall through. */
2202 case SHN_MIPS_SCOMMON:
2203 if (mips_elf_scom_section.name == NULL)
2204 {
2205 /* Initialize the small common section. */
2206 mips_elf_scom_section.name = ".scommon";
2207 mips_elf_scom_section.flags = SEC_IS_COMMON;
2208 mips_elf_scom_section.output_section = &mips_elf_scom_section;
2209 mips_elf_scom_section.symbol = &mips_elf_scom_symbol;
2210 mips_elf_scom_section.symbol_ptr_ptr = &mips_elf_scom_symbol_ptr;
2211 mips_elf_scom_symbol.name = ".scommon";
2212 mips_elf_scom_symbol.flags = BSF_SECTION_SYM;
2213 mips_elf_scom_symbol.section = &mips_elf_scom_section;
2214 mips_elf_scom_symbol_ptr = &mips_elf_scom_symbol;
2215 }
2216 asym->section = &mips_elf_scom_section;
2217 asym->value = elfsym->internal_elf_sym.st_size;
2218 break;
2219
2220 case SHN_MIPS_SUNDEFINED:
24f13b03 2221 asym->section = bfd_und_section_ptr;
aac6b32f 2222 break;
5b3b9ff6
ILT
2223
2224#if 0 /* for SGI_COMPAT */
2225 case SHN_MIPS_TEXT:
2226 asym->section = mips_elf_text_section_ptr;
2227 break;
2228
2229 case SHN_MIPS_DATA:
2230 asym->section = mips_elf_data_section_ptr;
2231 break;
2232#endif
2233 }
2234}
2235\f
2236/* When creating an Irix 5 executable, we need REGINFO and RTPROC
2237 segments. */
2238
2239static int
2240mips_elf_additional_program_headers (abfd)
2241 bfd *abfd;
2242{
2243 asection *s;
2244 int ret;
2245
2246 ret = 0;
2247
2248 if (! SGI_COMPAT (abfd))
2249 return ret;
2250
2251 s = bfd_get_section_by_name (abfd, ".reginfo");
2252 if (s != NULL && (s->flags & SEC_LOAD) != 0)
2253 {
2254 /* We need a PT_MIPS_REGINFO segment. */
2255 ++ret;
2256 }
2257
53787b23 2258 if (bfd_get_section_by_name (abfd, ".dynamic") != NULL
5b3b9ff6
ILT
2259 && bfd_get_section_by_name (abfd, ".mdebug") != NULL)
2260 {
2261 /* We need a PT_MIPS_RTPROC segment. */
2262 ++ret;
2263 }
2264
2265 return ret;
2266}
2267
2268/* Modify the segment map for an Irix 5 executable. */
2269
2270static boolean
2271mips_elf_modify_segment_map (abfd)
2272 bfd *abfd;
2273{
2274 asection *s;
2275 struct elf_segment_map *m, **pm;
2276
2277 if (! SGI_COMPAT (abfd))
2278 return true;
2279
2280 /* If there is a .reginfo section, we need a PT_MIPS_REGINFO
2281 segment. */
2282 s = bfd_get_section_by_name (abfd, ".reginfo");
2283 if (s != NULL && (s->flags & SEC_LOAD) != 0)
2284 {
2285 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2286 if (m->p_type == PT_MIPS_REGINFO)
2287 break;
2288 if (m == NULL)
2289 {
2290 m = (struct elf_segment_map *) bfd_zalloc (abfd, sizeof *m);
2291 if (m == NULL)
2292 return false;
2293
2294 m->p_type = PT_MIPS_REGINFO;
2295 m->count = 1;
2296 m->sections[0] = s;
2297
2298 /* We want to put it after the PHDR and INTERP segments. */
2299 pm = &elf_tdata (abfd)->segment_map;
2300 while (*pm != NULL
2301 && ((*pm)->p_type == PT_PHDR
2302 || (*pm)->p_type == PT_INTERP))
2303 pm = &(*pm)->next;
2304
2305 m->next = *pm;
2306 *pm = m;
2307 }
2308 }
2309
2310 /* If there are .dynamic and .mdebug sections, we make a room for
2311 the RTPROC header. FIXME: Rewrite without section names. */
2312 if (bfd_get_section_by_name (abfd, ".interp") == NULL
2313 && bfd_get_section_by_name (abfd, ".dynamic") != NULL
2314 && bfd_get_section_by_name (abfd, ".mdebug") != NULL)
2315 {
2316 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2317 if (m->p_type == PT_MIPS_RTPROC)
2318 break;
2319 if (m == NULL)
2320 {
2321 m = (struct elf_segment_map *) bfd_zalloc (abfd, sizeof *m);
2322 if (m == NULL)
2323 return false;
2324
2325 m->p_type = PT_MIPS_RTPROC;
2326
2327 s = bfd_get_section_by_name (abfd, ".rtproc");
2328 if (s == NULL)
2329 {
2330 m->count = 0;
2331 m->p_flags = 0;
2332 m->p_flags_valid = 1;
2333 }
2334 else
2335 {
2336 m->count = 1;
2337 m->sections[0] = s;
2338 }
2339
2340 /* We want to put it after the DYNAMIC segment. */
2341 pm = &elf_tdata (abfd)->segment_map;
2342 while (*pm != NULL && (*pm)->p_type != PT_DYNAMIC)
2343 pm = &(*pm)->next;
2344 if (*pm != NULL)
2345 pm = &(*pm)->next;
2346
2347 m->next = *pm;
2348 *pm = m;
2349 }
2350 }
2351
2352 /* On Irix 5, the PT_DYNAMIC segment includes the .dynamic, .dynstr,
2353 .dynsym, and .hash sections, and everything in between. */
2354 for (pm = &elf_tdata (abfd)->segment_map; *pm != NULL; pm = &(*pm)->next)
2355 if ((*pm)->p_type == PT_DYNAMIC)
2356 break;
2357 m = *pm;
2358 if (m != NULL
2359 && m->count == 1
2360 && strcmp (m->sections[0]->name, ".dynamic") == 0)
2361 {
2362 static const char *sec_names[] =
2363 { ".dynamic", ".dynstr", ".dynsym", ".hash" };
2364 bfd_vma low, high;
2365 unsigned int i, c;
2366 struct elf_segment_map *n;
2367
2368 low = 0xffffffff;
2369 high = 0;
2370 for (i = 0; i < sizeof sec_names / sizeof sec_names[0]; i++)
2371 {
2372 s = bfd_get_section_by_name (abfd, sec_names[i]);
2373 if (s != NULL && (s->flags & SEC_LOAD) != 0)
2374 {
2375 bfd_size_type sz;
2376
2377 if (low > s->vma)
2378 low = s->vma;
2379 sz = s->_cooked_size;
2380 if (sz == 0)
2381 sz = s->_raw_size;
2382 if (high < s->vma + sz)
2383 high = s->vma + sz;
2384 }
2385 }
2386
2387 c = 0;
2388 for (s = abfd->sections; s != NULL; s = s->next)
2389 if ((s->flags & SEC_LOAD) != 0
2390 && s->vma >= low
2391 && ((s->vma
2392 + (s->_cooked_size != 0 ? s->_cooked_size : s->_raw_size))
2393 <= high))
2394 ++c;
2395
2396 n = ((struct elf_segment_map *)
2397 bfd_zalloc (abfd, sizeof *n + (c - 1) * sizeof (asection *)));
2398 if (n == NULL)
2399 return false;
2400 *n = *m;
2401 n->count = c;
2402
2403 i = 0;
2404 for (s = abfd->sections; s != NULL; s = s->next)
2405 {
2406 if ((s->flags & SEC_LOAD) != 0
2407 && s->vma >= low
2408 && ((s->vma
2409 + (s->_cooked_size != 0 ? s->_cooked_size : s->_raw_size))
2410 <= high))
2411 {
2412 n->sections[i] = s;
2413 ++i;
2414 }
2415 }
2416
2417 *pm = n;
aac6b32f 2418 }
5b3b9ff6
ILT
2419
2420 return true;
2421}
2422\f
2423/* The structure of the runtime procedure descriptor created by the
2424 loader for use by the static exception system. */
2425
2426typedef struct runtime_pdr {
2427 bfd_vma adr; /* memory address of start of procedure */
2428 long regmask; /* save register mask */
2429 long regoffset; /* save register offset */
2430 long fregmask; /* save floating point register mask */
2431 long fregoffset; /* save floating point register offset */
2432 long frameoffset; /* frame size */
2433 short framereg; /* frame pointer register */
2434 short pcreg; /* offset or reg of return pc */
2435 long irpss; /* index into the runtime string table */
2436 long reserved;
2437 struct exception_info *exception_info;/* pointer to exception array */
2438} RPDR, *pRPDR;
2439#define cbRPDR sizeof(RPDR)
2440#define rpdNil ((pRPDR) 0)
2441
2442/* Swap RPDR (runtime procedure table entry) for output. */
2443
2444static void ecoff_swap_rpdr_out
2445 PARAMS ((bfd *, const RPDR *, struct rpdr_ext *));
2446
2447static void
2448ecoff_swap_rpdr_out (abfd, in, ex)
2449 bfd *abfd;
2450 const RPDR *in;
2451 struct rpdr_ext *ex;
2452{
2453 /* ecoff_put_off was defined in ecoffswap.h. */
2454 ecoff_put_off (abfd, in->adr, (bfd_byte *) ex->p_adr);
2455 bfd_h_put_32 (abfd, in->regmask, (bfd_byte *) ex->p_regmask);
2456 bfd_h_put_32 (abfd, in->regoffset, (bfd_byte *) ex->p_regoffset);
2457 bfd_h_put_32 (abfd, in->fregmask, (bfd_byte *) ex->p_fregmask);
2458 bfd_h_put_32 (abfd, in->fregoffset, (bfd_byte *) ex->p_fregoffset);
2459 bfd_h_put_32 (abfd, in->frameoffset, (bfd_byte *) ex->p_frameoffset);
2460
2461 bfd_h_put_16 (abfd, in->framereg, (bfd_byte *) ex->p_framereg);
2462 bfd_h_put_16 (abfd, in->pcreg, (bfd_byte *) ex->p_pcreg);
2463
2464 bfd_h_put_32 (abfd, in->irpss, (bfd_byte *) ex->p_irpss);
2465#if 0 /* FIXME */
2466 ecoff_put_off (abfd, in->exception_info, (bfd_byte *) ex->p_exception_info);
2467#endif
aac6b32f
ILT
2468}
2469\f
6e07e54f
ILT
2470/* Read ECOFF debugging information from a .mdebug section into a
2471 ecoff_debug_info structure. */
b3c0fc57 2472
00176555
ILT
2473boolean
2474_bfd_mips_elf_read_ecoff_info (abfd, section, debug)
b3c0fc57 2475 bfd *abfd;
6e07e54f
ILT
2476 asection *section;
2477 struct ecoff_debug_info *debug;
b3c0fc57 2478{
6e07e54f
ILT
2479 HDRR *symhdr;
2480 const struct ecoff_debug_swap *swap;
a3a33af3 2481 char *ext_hdr = NULL;
6e07e54f
ILT
2482
2483 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
2484
5b3b9ff6 2485 ext_hdr = (char *) bfd_malloc ((size_t) swap->external_hdr_size);
a3a33af3 2486 if (ext_hdr == NULL && swap->external_hdr_size != 0)
5b3b9ff6 2487 goto error_return;
6e07e54f
ILT
2488
2489 if (bfd_get_section_contents (abfd, section, ext_hdr, (file_ptr) 0,
2490 swap->external_hdr_size)
2491 == false)
a3a33af3 2492 goto error_return;
6e07e54f
ILT
2493
2494 symhdr = &debug->symbolic_header;
2495 (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
2496
2497 /* The symbolic header contains absolute file offsets and sizes to
2498 read. */
2499#define READ(ptr, offset, count, size, type) \
2500 if (symhdr->count == 0) \
2501 debug->ptr = NULL; \
2502 else \
2503 { \
5b3b9ff6 2504 debug->ptr = (type) bfd_malloc ((size_t) (size * symhdr->count)); \
6e07e54f 2505 if (debug->ptr == NULL) \
5b3b9ff6 2506 goto error_return; \
6e07e54f
ILT
2507 if (bfd_seek (abfd, (file_ptr) symhdr->offset, SEEK_SET) != 0 \
2508 || (bfd_read (debug->ptr, size, symhdr->count, \
2509 abfd) != size * symhdr->count)) \
a3a33af3 2510 goto error_return; \
6e07e54f
ILT
2511 }
2512
2513 READ (line, cbLineOffset, cbLine, sizeof (unsigned char), unsigned char *);
2514 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, PTR);
2515 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, PTR);
2516 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, PTR);
2517 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, PTR);
2518 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
2519 union aux_ext *);
2520 READ (ss, cbSsOffset, issMax, sizeof (char), char *);
2521 READ (ssext, cbSsExtOffset, issExtMax, sizeof (char), char *);
2522 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, PTR);
2523 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, PTR);
aac6b32f
ILT
2524 READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size, PTR);
2525#undef READ
9783e04a
DM
2526
2527 debug->fdr = NULL;
a3a33af3 2528 debug->adjust = NULL;
6e07e54f
ILT
2529
2530 return true;
a3a33af3
ILT
2531
2532 error_return:
2533 if (ext_hdr != NULL)
2534 free (ext_hdr);
a3a33af3
ILT
2535 if (debug->line != NULL)
2536 free (debug->line);
2537 if (debug->external_dnr != NULL)
2538 free (debug->external_dnr);
2539 if (debug->external_pdr != NULL)
2540 free (debug->external_pdr);
2541 if (debug->external_sym != NULL)
2542 free (debug->external_sym);
2543 if (debug->external_opt != NULL)
2544 free (debug->external_opt);
2545 if (debug->external_aux != NULL)
2546 free (debug->external_aux);
2547 if (debug->ss != NULL)
2548 free (debug->ss);
2549 if (debug->ssext != NULL)
2550 free (debug->ssext);
2551 if (debug->external_fdr != NULL)
2552 free (debug->external_fdr);
2553 if (debug->external_rfd != NULL)
2554 free (debug->external_rfd);
aac6b32f
ILT
2555 if (debug->external_ext != NULL)
2556 free (debug->external_ext);
a3a33af3 2557 return false;
6e07e54f 2558}
a16fcab3 2559\f
a2546fce
ILT
2560/* MIPS ELF local labels start with '$', not 'L'. */
2561
2562/*ARGSUSED*/
2563static boolean
2564mips_elf_is_local_label (abfd, symbol)
2565 bfd *abfd;
2566 asymbol *symbol;
2567{
2568 return symbol->name[0] == '$';
2569}
2570
a16fcab3
KR
2571/* MIPS ELF uses a special find_nearest_line routine in order the
2572 handle the ECOFF debugging information. */
2573
2574struct mips_elf_find_line
2575{
2576 struct ecoff_debug_info d;
2577 struct ecoff_find_line i;
2578};
6e07e54f 2579
bc05732b
ILT
2580boolean
2581_bfd_mips_elf_find_nearest_line (abfd, section, symbols, offset, filename_ptr,
2582 functionname_ptr, line_ptr)
a16fcab3
KR
2583 bfd *abfd;
2584 asection *section;
2585 asymbol **symbols;
2586 bfd_vma offset;
2587 const char **filename_ptr;
2588 const char **functionname_ptr;
2589 unsigned int *line_ptr;
2590{
2591 asection *msec;
2592
2593 msec = bfd_get_section_by_name (abfd, ".mdebug");
2594 if (msec != NULL)
2595 {
6ab826bd 2596 flagword origflags;
a16fcab3
KR
2597 struct mips_elf_find_line *fi;
2598 const struct ecoff_debug_swap * const swap =
2599 get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
2600
6ab826bd
FF
2601 /* If we are called during a link, mips_elf_final_link may have
2602 cleared the SEC_HAS_CONTENTS field. We force it back on here
2603 if appropriate (which it normally will be). */
2604 origflags = msec->flags;
2605 if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
2606 msec->flags |= SEC_HAS_CONTENTS;
2607
a16fcab3
KR
2608 fi = elf_tdata (abfd)->find_line_info;
2609 if (fi == NULL)
2610 {
2611 bfd_size_type external_fdr_size;
2612 char *fraw_src;
2613 char *fraw_end;
2614 struct fdr *fdr_ptr;
2615
2616 fi = ((struct mips_elf_find_line *)
abec70b9 2617 bfd_zalloc (abfd, sizeof (struct mips_elf_find_line)));
a16fcab3
KR
2618 if (fi == NULL)
2619 {
6ab826bd 2620 msec->flags = origflags;
a16fcab3
KR
2621 return false;
2622 }
2623
00176555 2624 if (! _bfd_mips_elf_read_ecoff_info (abfd, msec, &fi->d))
6ab826bd
FF
2625 {
2626 msec->flags = origflags;
2627 return false;
2628 }
a16fcab3
KR
2629
2630 /* Swap in the FDR information. */
2631 fi->d.fdr = ((struct fdr *)
2632 bfd_alloc (abfd,
2633 (fi->d.symbolic_header.ifdMax *
2634 sizeof (struct fdr))));
2635 if (fi->d.fdr == NULL)
2636 {
6ab826bd 2637 msec->flags = origflags;
a16fcab3
KR
2638 return false;
2639 }
2640 external_fdr_size = swap->external_fdr_size;
2641 fdr_ptr = fi->d.fdr;
2642 fraw_src = (char *) fi->d.external_fdr;
2643 fraw_end = (fraw_src
2644 + fi->d.symbolic_header.ifdMax * external_fdr_size);
2645 for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
2646 (*swap->swap_fdr_in) (abfd, (PTR) fraw_src, fdr_ptr);
2647
2648 elf_tdata (abfd)->find_line_info = fi;
2649
2650 /* Note that we don't bother to ever free this information.
2651 find_nearest_line is either called all the time, as in
2652 objdump -l, so the information should be saved, or it is
2653 rarely called, as in ld error messages, so the memory
2654 wasted is unimportant. Still, it would probably be a
2655 good idea for free_cached_info to throw it away. */
2656 }
2657
2658 if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
2659 &fi->i, filename_ptr, functionname_ptr,
2660 line_ptr))
6ab826bd
FF
2661 {
2662 msec->flags = origflags;
2663 return true;
2664 }
2665
2666 msec->flags = origflags;
a16fcab3
KR
2667 }
2668
2669 /* Fall back on the generic ELF find_nearest_line routine. */
2670
ede4eed4
KR
2671 return _bfd_elf_find_nearest_line (abfd, section, symbols, offset,
2672 filename_ptr, functionname_ptr,
2673 line_ptr);
a16fcab3
KR
2674}
2675\f
aac6b32f
ILT
2676/* The MIPS ELF linker needs additional information for each symbol in
2677 the global hash table. */
2678
2679struct mips_elf_link_hash_entry
2680{
2681 struct elf_link_hash_entry root;
6e07e54f 2682
aac6b32f
ILT
2683 /* External symbol information. */
2684 EXTR esym;
abec70b9
ILT
2685
2686 /* Number of MIPS_32 or MIPS_REL32 relocs against this symbol. */
2687 unsigned int mips_32_relocs;
aac6b32f
ILT
2688};
2689
2690/* MIPS ELF linker hash table. */
2691
2692struct mips_elf_link_hash_table
2693{
2694 struct elf_link_hash_table root;
5b3b9ff6
ILT
2695 /* String section indices for the dynamic section symbols. */
2696 bfd_size_type dynsym_sec_strindex[SIZEOF_MIPS_DYNSYM_SECNAMES];
2697 /* The number of .rtproc entries. */
2698 bfd_size_type procedure_count;
53787b23
ILT
2699 /* The size of the .compact_rel section (if SGI_COMPAT). */
2700 bfd_size_type compact_rel_size;
aac6b32f
ILT
2701};
2702
2703/* Look up an entry in a MIPS ELF linker hash table. */
2704
2705#define mips_elf_link_hash_lookup(table, string, create, copy, follow) \
2706 ((struct mips_elf_link_hash_entry *) \
2707 elf_link_hash_lookup (&(table)->root, (string), (create), \
2708 (copy), (follow)))
2709
2710/* Traverse a MIPS ELF linker hash table. */
2711
2712#define mips_elf_link_hash_traverse(table, func, info) \
2713 (elf_link_hash_traverse \
2714 (&(table)->root, \
2715 (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
2716 (info)))
2717
2718/* Get the MIPS ELF linker hash table from a link_info structure. */
2719
2720#define mips_elf_hash_table(p) \
2721 ((struct mips_elf_link_hash_table *) ((p)->hash))
2722
2723static boolean mips_elf_output_extsym
2724 PARAMS ((struct mips_elf_link_hash_entry *, PTR));
2725
2726/* Create an entry in a MIPS ELF linker hash table. */
2727
2728static struct bfd_hash_entry *
2729mips_elf_link_hash_newfunc (entry, table, string)
2730 struct bfd_hash_entry *entry;
2731 struct bfd_hash_table *table;
2732 const char *string;
2733{
2734 struct mips_elf_link_hash_entry *ret =
2735 (struct mips_elf_link_hash_entry *) entry;
2736
2737 /* Allocate the structure if it has not already been allocated by a
2738 subclass. */
2739 if (ret == (struct mips_elf_link_hash_entry *) NULL)
2740 ret = ((struct mips_elf_link_hash_entry *)
2741 bfd_hash_allocate (table,
2742 sizeof (struct mips_elf_link_hash_entry)));
2743 if (ret == (struct mips_elf_link_hash_entry *) NULL)
a9713b91 2744 return (struct bfd_hash_entry *) ret;
aac6b32f
ILT
2745
2746 /* Call the allocation method of the superclass. */
2747 ret = ((struct mips_elf_link_hash_entry *)
2748 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
2749 table, string));
2750 if (ret != (struct mips_elf_link_hash_entry *) NULL)
2751 {
2752 /* Set local fields. */
2753 memset (&ret->esym, 0, sizeof (EXTR));
2754 /* We use -2 as a marker to indicate that the information has
2755 not been set. -1 means there is no associated ifd. */
2756 ret->esym.ifd = -2;
abec70b9 2757 ret->mips_32_relocs = 0;
aac6b32f
ILT
2758 }
2759
2760 return (struct bfd_hash_entry *) ret;
2761}
2762
2763/* Create a MIPS ELF linker hash table. */
2764
2765static struct bfd_link_hash_table *
2766mips_elf_link_hash_table_create (abfd)
2767 bfd *abfd;
2768{
2769 struct mips_elf_link_hash_table *ret;
5b3b9ff6 2770 unsigned int i;
aac6b32f
ILT
2771
2772 ret = ((struct mips_elf_link_hash_table *)
2773 bfd_alloc (abfd, sizeof (struct mips_elf_link_hash_table)));
2774 if (ret == (struct mips_elf_link_hash_table *) NULL)
a9713b91 2775 return NULL;
aac6b32f
ILT
2776
2777 if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
2778 mips_elf_link_hash_newfunc))
2779 {
2780 bfd_release (abfd, ret);
2781 return NULL;
2782 }
2783
5b3b9ff6
ILT
2784 for (i = 0; i < SIZEOF_MIPS_DYNSYM_SECNAMES; i++)
2785 ret->dynsym_sec_strindex[i] = (bfd_size_type) -1;
2786 ret->procedure_count = 0;
53787b23 2787 ret->compact_rel_size = 0;
5b3b9ff6 2788
aac6b32f
ILT
2789 return &ret->root.root;
2790}
2791
2792/* Hook called by the linker routine which adds symbols from an object
2793 file. We must handle the special MIPS section numbers here. */
2794
2795/*ARGSUSED*/
6e07e54f 2796static boolean
aac6b32f
ILT
2797mips_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
2798 bfd *abfd;
2799 struct bfd_link_info *info;
2800 const Elf_Internal_Sym *sym;
2801 const char **namep;
2802 flagword *flagsp;
2803 asection **secp;
2804 bfd_vma *valp;
2805{
53787b23
ILT
2806 if (SGI_COMPAT (abfd)
2807 && (abfd->flags & DYNAMIC) != 0
2808 && strcmp (*namep, "_rld_new_interface") == 0)
2809 {
2810 /* Skip Irix 5 rld entry name. */
2811 *namep = NULL;
2812 return true;
2813 }
2814
aac6b32f
ILT
2815 switch (sym->st_shndx)
2816 {
2817 case SHN_COMMON:
2818 /* Common symbols less than the GP size are automatically
2819 treated as SHN_MIPS_SCOMMON symbols. */
2820 if (sym->st_size > elf_gp_size (abfd))
2821 break;
2822 /* Fall through. */
2823 case SHN_MIPS_SCOMMON:
2824 *secp = bfd_make_section_old_way (abfd, ".scommon");
2825 (*secp)->flags |= SEC_IS_COMMON;
2826 *valp = sym->st_size;
2827 break;
2828
5b3b9ff6
ILT
2829 case SHN_MIPS_TEXT:
2830 /* This section is used in a shared object. */
2831 if (mips_elf_text_section_ptr == NULL)
2832 {
2833 /* Initialize the section. */
2834 mips_elf_text_section.name = ".text";
2835 mips_elf_text_section.flags = SEC_NO_FLAGS;
2836 mips_elf_text_section.output_section = NULL;
2837 mips_elf_text_section.owner = abfd;
2838 mips_elf_text_section.symbol = &mips_elf_text_symbol;
2839 mips_elf_text_section.symbol_ptr_ptr = &mips_elf_text_symbol_ptr;
2840 mips_elf_text_symbol.name = ".text";
2841 mips_elf_text_symbol.flags = BSF_SECTION_SYM;
2842 mips_elf_text_symbol.section = &mips_elf_text_section;
2843 mips_elf_text_symbol_ptr = &mips_elf_text_symbol;
2844 mips_elf_text_section_ptr = &mips_elf_text_section;
2845 }
2846 if (info->shared)
2847 *secp = bfd_und_section_ptr;
2848 else
2849 *secp = mips_elf_text_section_ptr;
2850 break;
2851
53787b23
ILT
2852 case SHN_MIPS_ACOMMON:
2853 /* Fall through. XXX Can we treat this as allocated data? */
5b3b9ff6
ILT
2854 case SHN_MIPS_DATA:
2855 /* This section is used in a shared object. */
2856 if (mips_elf_data_section_ptr == NULL)
2857 {
2858 /* Initialize the section. */
2859 mips_elf_data_section.name = ".data";
2860 mips_elf_data_section.flags = SEC_NO_FLAGS;
2861 mips_elf_data_section.output_section = NULL;
2862 mips_elf_data_section.owner = abfd;
2863 mips_elf_data_section.symbol = &mips_elf_data_symbol;
2864 mips_elf_data_section.symbol_ptr_ptr = &mips_elf_data_symbol_ptr;
2865 mips_elf_data_symbol.name = ".data";
2866 mips_elf_data_symbol.flags = BSF_SECTION_SYM;
2867 mips_elf_data_symbol.section = &mips_elf_data_section;
2868 mips_elf_data_symbol_ptr = &mips_elf_data_symbol;
2869 mips_elf_data_section_ptr = &mips_elf_data_section;
2870 }
2871 if (info->shared)
2872 *secp = bfd_und_section_ptr;
2873 else
2874 *secp = mips_elf_data_section_ptr;
2875 break;
2876
aac6b32f 2877 case SHN_MIPS_SUNDEFINED:
24f13b03 2878 *secp = bfd_und_section_ptr;
aac6b32f
ILT
2879 break;
2880 }
2881
2882 return true;
2883}
2884
2885/* Structure used to pass information to mips_elf_output_extsym. */
2886
2887struct extsym_info
6e07e54f 2888{
aac6b32f
ILT
2889 bfd *abfd;
2890 struct bfd_link_info *info;
2891 struct ecoff_debug_info *debug;
9783e04a 2892 const struct ecoff_debug_swap *swap;
aac6b32f
ILT
2893 boolean failed;
2894};
9783e04a 2895
aac6b32f
ILT
2896/* This routine is used to write out ECOFF debugging external symbol
2897 information. It is called via mips_elf_link_hash_traverse. The
2898 ECOFF external symbol information must match the ELF external
2899 symbol information. Unfortunately, at this point we don't know
2900 whether a symbol is required by reloc information, so the two
2901 tables may wind up being different. We must sort out the external
2902 symbol information before we can set the final size of the .mdebug
2903 section, and we must set the size of the .mdebug section before we
2904 can relocate any sections, and we can't know which symbols are
2905 required by relocation until we relocate the sections.
2906 Fortunately, it is relatively unlikely that any symbol will be
2907 stripped but required by a reloc. In particular, it can not happen
2908 when generating a final executable. */
2909
2910static boolean
2911mips_elf_output_extsym (h, data)
2912 struct mips_elf_link_hash_entry *h;
2913 PTR data;
2914{
2915 struct extsym_info *einfo = (struct extsym_info *) data;
2916 boolean strip;
5b3b9ff6 2917 asection *sec, *output_section;
aac6b32f
ILT
2918
2919 if (h->root.indx == -2)
2920 strip = false;
2921 else if (((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
2922 || (h->root.elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0)
2923 && (h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0
2924 && (h->root.elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0)
2925 strip = true;
2926 else if (einfo->info->strip == strip_all
2927 || (einfo->info->strip == strip_some
2928 && bfd_hash_lookup (einfo->info->keep_hash,
2929 h->root.root.root.string,
2930 false, false) == NULL))
2931 strip = true;
2932 else
2933 strip = false;
2934
2935 if (strip)
2936 return true;
6e07e54f 2937
aac6b32f 2938 if (h->esym.ifd == -2)
6e07e54f 2939 {
aac6b32f
ILT
2940 h->esym.jmptbl = 0;
2941 h->esym.cobol_main = 0;
2942 h->esym.weakext = 0;
2943 h->esym.reserved = 0;
2944 h->esym.ifd = ifdNil;
2945 h->esym.asym.value = 0;
2946 h->esym.asym.st = stGlobal;
2947
5b3b9ff6
ILT
2948 if (SGI_COMPAT (einfo->abfd)
2949 && (h->root.root.type == bfd_link_hash_undefined
2950 || h->root.root.type == bfd_link_hash_undefweak))
2951 {
2952 const char *name;
2953
2954 /* Use undefined class. Also, set class and type for some
2955 special symbols. */
2956 name = h->root.root.root.string;
2957 if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
2958 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
2959 {
2960 h->esym.asym.sc = scData;
2961 h->esym.asym.st = stLabel;
2962 h->esym.asym.value = 0;
2963 }
2964 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
2965 {
2966 h->esym.asym.sc = scAbs;
2967 h->esym.asym.st = stLabel;
2968 h->esym.asym.value =
2969 mips_elf_hash_table (einfo->info)->procedure_count;
2970 }
2971 else if (strcmp (name, "_gp_disp") == 0)
2972 {
2973 h->esym.asym.sc = scAbs;
2974 h->esym.asym.st = stLabel;
2975 h->esym.asym.value = elf_gp (einfo->abfd);
2976 }
2977 else
2978 h->esym.asym.sc = scUndefined;
2979 }
2980 else if (h->root.root.type != bfd_link_hash_defined
a16fcab3 2981 && h->root.root.type != bfd_link_hash_defweak)
aac6b32f
ILT
2982 h->esym.asym.sc = scAbs;
2983 else
2984 {
aac6b32f
ILT
2985 const char *name;
2986
5b3b9ff6
ILT
2987 sec = h->root.root.u.def.section;
2988 output_section = sec->output_section;
2989
2990 /* When making a shared library and symbol h is the one from
2991 the another shared library, OUTPUT_SECTION may be null. */
2992 if (output_section == NULL)
2993 h->esym.asym.sc = scUndefined;
aac6b32f 2994 else
5b3b9ff6
ILT
2995 {
2996 name = bfd_section_name (output_section->owner, output_section);
2997
2998 if (strcmp (name, ".text") == 0)
2999 h->esym.asym.sc = scText;
3000 else if (strcmp (name, ".data") == 0)
3001 h->esym.asym.sc = scData;
3002 else if (strcmp (name, ".sdata") == 0)
3003 h->esym.asym.sc = scSData;
3004 else if (strcmp (name, ".rodata") == 0
3005 || strcmp (name, ".rdata") == 0)
3006 h->esym.asym.sc = scRData;
3007 else if (strcmp (name, ".bss") == 0)
3008 h->esym.asym.sc = scBss;
3009 else if (strcmp (name, ".sbss") == 0)
3010 h->esym.asym.sc = scSBss;
3011 else if (strcmp (name, ".init") == 0)
3012 h->esym.asym.sc = scInit;
3013 else if (strcmp (name, ".fini") == 0)
3014 h->esym.asym.sc = scFini;
3015 else
3016 h->esym.asym.sc = scAbs;
3017 }
aac6b32f
ILT
3018 }
3019
3020 h->esym.asym.reserved = 0;
3021 h->esym.asym.index = indexNil;
6e07e54f
ILT
3022 }
3023
16fe8950
ILT
3024 if (h->root.root.type == bfd_link_hash_common)
3025 h->esym.asym.value = h->root.root.u.c.size;
a16fcab3
KR
3026 else if (h->root.root.type == bfd_link_hash_defined
3027 || h->root.root.type == bfd_link_hash_defweak)
16fe8950 3028 {
16fe8950
ILT
3029 if (h->esym.asym.sc == scCommon)
3030 h->esym.asym.sc = scBss;
3031 else if (h->esym.asym.sc == scSCommon)
3032 h->esym.asym.sc = scSBss;
3033
3034 sec = h->root.root.u.def.section;
5b3b9ff6
ILT
3035 output_section = sec->output_section;
3036 if (output_section != NULL)
3037 h->esym.asym.value = (h->root.root.u.def.value
3038 + sec->output_offset
3039 + output_section->vma);
3040 else
3041 h->esym.asym.value = 0;
16fe8950 3042 }
5b3b9ff6
ILT
3043 else if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
3044 {
3045 /* Set type and value for a symbol with a function stub. */
3046 h->esym.asym.st = stProc;
3047 sec = h->root.root.u.def.section;
3048 if (sec == NULL)
3049 h->esym.asym.value = 0;
3050 else
3051 {
3052 output_section = sec->output_section;
3053 if (output_section != NULL)
3054 h->esym.asym.value = (h->root.plt_offset
3055 + sec->output_offset
3056 + output_section->vma);
3057 else
3058 h->esym.asym.value = 0;
3059 }
3060#if 0 /* FIXME? */
3061 h->esym.ifd = 0;
3062#endif
3063 }
aac6b32f
ILT
3064
3065 if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
3066 h->root.root.root.string,
3067 &h->esym))
3068 {
3069 einfo->failed = true;
3070 return false;
3071 }
6e07e54f
ILT
3072
3073 return true;
3074}
3075
5b3b9ff6
ILT
3076/* Create a runtime procedure table from the .mdebug section. */
3077
3078static boolean
3079mips_elf_create_procedure_table (handle, abfd, info, s, debug)
3080 PTR handle;
3081 bfd *abfd;
3082 struct bfd_link_info *info;
3083 asection *s;
3084 struct ecoff_debug_info *debug;
3085{
3086 const struct ecoff_debug_swap *swap;
3087 HDRR *hdr = &debug->symbolic_header;
3088 RPDR *rpdr, *rp;
3089 struct rpdr_ext *erp;
3090 PTR rtproc;
3091 struct pdr_ext *epdr;
3092 struct sym_ext *esym;
3093 char *ss, **sv;
3094 char *str;
3095 unsigned long size, count;
3096 unsigned long sindex;
3097 unsigned long i;
3098 PDR pdr;
3099 SYMR sym;
3100 const char *no_name_func = "static procedure (no name)";
3101
3102 epdr = NULL;
3103 rpdr = NULL;
3104 esym = NULL;
3105 ss = NULL;
abec70b9 3106 sv = NULL;
5b3b9ff6
ILT
3107
3108 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
3109
3110 sindex = strlen (no_name_func) + 1;
3111 count = hdr->ipdMax;
3112 if (count > 0)
3113 {
3114 size = swap->external_pdr_size;
3115
3116 epdr = (struct pdr_ext *) bfd_malloc (size * count);
3117 if (epdr == NULL)
3118 goto error_return;
3119
3120 if (! _bfd_ecoff_get_accumulated_pdr (handle, (PTR) epdr))
3121 goto error_return;
3122
3123 size = sizeof (RPDR);
3124 rp = rpdr = (RPDR *) bfd_malloc (size * count);
3125 if (rpdr == NULL)
3126 goto error_return;
3127
3128 sv = (char **) bfd_malloc (sizeof (char *) * count);
3129 if (sv == NULL)
3130 goto error_return;
3131
3132 count = hdr->isymMax;
3133 size = swap->external_sym_size;
3134 esym = (struct sym_ext *) bfd_malloc (size * count);
3135 if (esym == NULL)
3136 goto error_return;
3137
3138 if (! _bfd_ecoff_get_accumulated_sym (handle, (PTR) esym))
3139 goto error_return;
3140
3141 count = hdr->issMax;
3142 ss = (char *) bfd_malloc (count);
3143 if (ss == NULL)
3144 goto error_return;
3145 if (! _bfd_ecoff_get_accumulated_ss (handle, (PTR) ss))
3146 goto error_return;
3147
3148 count = hdr->ipdMax;
abec70b9 3149 for (i = 0; i < count; i++, rp++)
5b3b9ff6 3150 {
abec70b9 3151 (*swap->swap_pdr_in) (abfd, (PTR) (epdr + i), &pdr);
5b3b9ff6
ILT
3152 (*swap->swap_sym_in) (abfd, (PTR) &esym[pdr.isym], &sym);
3153 rp->adr = sym.value;
3154 rp->regmask = pdr.regmask;
3155 rp->regoffset = pdr.regoffset;
3156 rp->fregmask = pdr.fregmask;
3157 rp->fregoffset = pdr.fregoffset;
3158 rp->frameoffset = pdr.frameoffset;
3159 rp->framereg = pdr.framereg;
3160 rp->pcreg = pdr.pcreg;
3161 rp->irpss = sindex;
3162 sv[i] = ss + sym.iss;
3163 sindex += strlen (sv[i]) + 1;
3164 }
3165 }
3166
3167 size = sizeof (struct rpdr_ext) * (count + 2) + sindex;
3168 size = BFD_ALIGN (size, 16);
3169 rtproc = (PTR) bfd_alloc (abfd, size);
3170 if (rtproc == NULL)
3171 {
3172 mips_elf_hash_table (info)->procedure_count = 0;
3173 goto error_return;
3174 }
3175
3176 mips_elf_hash_table (info)->procedure_count = count + 2;
3177
3178 erp = (struct rpdr_ext *) rtproc;
abec70b9 3179 memset (erp, 0, sizeof (struct rpdr_ext));
5b3b9ff6
ILT
3180 erp++;
3181 str = (char *) rtproc + sizeof (struct rpdr_ext) * (count + 2);
3182 strcpy (str, no_name_func);
3183 str += strlen (no_name_func) + 1;
3184 for (i = 0; i < count; i++)
3185 {
3186 ecoff_swap_rpdr_out (abfd, rpdr + i, erp + i);
3187 strcpy (str, sv[i]);
3188 str += strlen (sv[i]) + 1;
3189 }
3190 ecoff_put_off (abfd, (bfd_vma) -1, (bfd_byte *) (erp + count)->p_adr);
3191
3192 /* Set the size and contents of .rtproc section. */
3193 s->_raw_size = size;
3194 s->contents = rtproc;
3195
3196 /* Skip this section later on (I don't think this currently
3197 matters, but someday it might). */
3198 s->link_order_head = (struct bfd_link_order *) NULL;
3199
abec70b9
ILT
3200 if (epdr != NULL)
3201 free (epdr);
3202 if (rpdr != NULL)
3203 free (rpdr);
3204 if (esym != NULL)
3205 free (esym);
3206 if (ss != NULL)
3207 free (ss);
3208 if (sv != NULL)
3209 free (sv);
5b3b9ff6
ILT
3210
3211 return true;
3212
3213 error_return:
3214 if (epdr != NULL)
3215 free (epdr);
3216 if (rpdr != NULL)
3217 free (rpdr);
3218 if (esym != NULL)
3219 free (esym);
3220 if (ss != NULL)
3221 free (ss);
3222 if (sv != NULL)
3223 free (sv);
3224 return false;
3225}
3226
aac6b32f 3227/* A comparison routine used to sort .gptab entries. */
6e07e54f 3228
aac6b32f
ILT
3229static int
3230gptab_compare (p1, p2)
3231 const PTR p1;
3232 const PTR p2;
6e07e54f 3233{
aac6b32f
ILT
3234 const Elf32_gptab *a1 = (const Elf32_gptab *) p1;
3235 const Elf32_gptab *a2 = (const Elf32_gptab *) p2;
3236
3237 return a1->gt_entry.gt_g_value - a2->gt_entry.gt_g_value;
6e07e54f
ILT
3238}
3239
3240/* We need to use a special link routine to handle the .reginfo and
3241 the .mdebug sections. We need to merge all instances of these
3242 sections together, not write them all out sequentially. */
3243
3244static boolean
3245mips_elf_final_link (abfd, info)
3246 bfd *abfd;
3247 struct bfd_link_info *info;
3248{
6e07e54f
ILT
3249 asection **secpp;
3250 asection *o;
3251 struct bfd_link_order *p;
aac6b32f 3252 asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
5b3b9ff6 3253 asection *rtproc_sec;
b3c0fc57 3254 Elf32_RegInfo reginfo;
6e07e54f
ILT
3255 struct ecoff_debug_info debug;
3256 const struct ecoff_debug_swap *swap
3257 = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
3258 HDRR *symhdr = &debug.symbolic_header;
9783e04a 3259 PTR mdebug_handle = NULL;
6e07e54f 3260
497c5434 3261 /* Drop the .options section, since it has special semantics which I
aac6b32f
ILT
3262 haven't bothered to figure out. */
3263 for (secpp = &abfd->sections; *secpp != NULL; secpp = &(*secpp)->next)
6e07e54f 3264 {
aac6b32f 3265 if (strcmp ((*secpp)->name, ".options") == 0)
6e07e54f 3266 {
aac6b32f
ILT
3267 for (p = (*secpp)->link_order_head; p != NULL; p = p->next)
3268 if (p->type == bfd_indirect_link_order)
3269 p->u.indirect.section->flags &=~ SEC_HAS_CONTENTS;
3270 (*secpp)->link_order_head = NULL;
6e07e54f
ILT
3271 *secpp = (*secpp)->next;
3272 --abfd->section_count;
aac6b32f 3273 break;
6e07e54f 3274 }
6e07e54f 3275 }
b3c0fc57 3276
5b3b9ff6
ILT
3277 /* Get a value for the GP register. */
3278 if (elf_gp (abfd) == 0)
b3c0fc57 3279 {
5b3b9ff6
ILT
3280 struct bfd_link_hash_entry *h;
3281
3282 h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
3283 if (h != (struct bfd_link_hash_entry *) NULL
3284 && h->type == bfd_link_hash_defined)
3285 elf_gp (abfd) = (h->u.def.value
3286 + h->u.def.section->output_section->vma
3287 + h->u.def.section->output_offset);
3288 else if (info->relocateable)
b3c0fc57 3289 {
5b3b9ff6 3290 bfd_vma lo;
b3c0fc57 3291
5b3b9ff6
ILT
3292 /* Make up a value. */
3293 lo = (bfd_vma) -1;
3294 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
3295 {
3296 if (o->vma < lo
3297 && (strcmp (o->name, ".sbss") == 0
3298 || strcmp (o->name, ".sdata") == 0
3299 || strcmp (o->name, ".lit4") == 0
3300 || strcmp (o->name, ".lit8") == 0))
3301 lo = o->vma;
3302 }
3303 elf_gp (abfd) = lo + ELF_MIPS_GP_OFFSET (abfd);
3304 }
3305 else
3306 {
3307 /* If the relocate_section function needs to do a reloc
3308 involving the GP value, it should make a reloc_dangerous
3309 callback to warn that GP is not defined. */
3310 }
3311 }
3312
3313 /* Go through the sections and collect the .reginfo and .mdebug
3314 information. */
3315 reginfo_sec = NULL;
3316 mdebug_sec = NULL;
3317 gptab_data_sec = NULL;
3318 gptab_bss_sec = NULL;
3319 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
3320 {
3321 if (strcmp (o->name, ".reginfo") == 0)
3322 {
3323 memset (&reginfo, 0, sizeof reginfo);
3324
3325 /* We have found the .reginfo section in the output file.
3326 Look through all the link_orders comprising it and merge
3327 the information together. */
3328 for (p = o->link_order_head;
3329 p != (struct bfd_link_order *) NULL;
3330 p = p->next)
3331 {
3332 asection *input_section;
6e07e54f
ILT
3333 bfd *input_bfd;
3334 Elf32_External_RegInfo ext;
3335 Elf32_RegInfo sub;
3336
3337 if (p->type != bfd_indirect_link_order)
aac6b32f
ILT
3338 {
3339 if (p->type == bfd_fill_link_order)
3340 continue;
3341 abort ();
3342 }
6e07e54f
ILT
3343
3344 input_section = p->u.indirect.section;
3345 input_bfd = input_section->owner;
a16fcab3
KR
3346
3347 /* The linker emulation code has probably clobbered the
3348 size to be zero bytes. */
3349 if (input_section->_raw_size == 0)
3350 input_section->_raw_size = sizeof (Elf32_External_RegInfo);
3351
6e07e54f
ILT
3352 if (! bfd_get_section_contents (input_bfd, input_section,
3353 (PTR) &ext,
3354 (file_ptr) 0,
3355 sizeof ext))
3356 return false;
3357
3358 bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub);
3359
3360 reginfo.ri_gprmask |= sub.ri_gprmask;
3361 reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
3362 reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
3363 reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
3364 reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
3365
3366 /* ri_gp_value is set by the function
00176555 3367 mips_elf32_section_processing when the section is
6e07e54f 3368 finally written out. */
aac6b32f
ILT
3369
3370 /* Hack: reset the SEC_HAS_CONTENTS flag so that
3371 elf_link_input_bfd ignores this section. */
3372 input_section->flags &=~ SEC_HAS_CONTENTS;
6e07e54f
ILT
3373 }
3374
3375 /* Force the section size to the value we want. */
3376 o->_raw_size = sizeof (Elf32_External_RegInfo);
3377
aac6b32f
ILT
3378 /* Skip this section later on (I don't think this currently
3379 matters, but someday it might). */
6e07e54f
ILT
3380 o->link_order_head = (struct bfd_link_order *) NULL;
3381
3382 reginfo_sec = o;
3383 }
3384
3385 if (strcmp (o->name, ".mdebug") == 0)
3386 {
aac6b32f
ILT
3387 struct extsym_info einfo;
3388
6e07e54f
ILT
3389 /* We have found the .mdebug section in the output file.
3390 Look through all the link_orders comprising it and merge
3391 the information together. */
3392 symhdr->magic = swap->sym_magic;
3393 /* FIXME: What should the version stamp be? */
3394 symhdr->vstamp = 0;
3395 symhdr->ilineMax = 0;
3396 symhdr->cbLine = 0;
3397 symhdr->idnMax = 0;
3398 symhdr->ipdMax = 0;
3399 symhdr->isymMax = 0;
3400 symhdr->ioptMax = 0;
3401 symhdr->iauxMax = 0;
3402 symhdr->issMax = 0;
3403 symhdr->issExtMax = 0;
3404 symhdr->ifdMax = 0;
3405 symhdr->crfd = 0;
3406 symhdr->iextMax = 0;
3407
3408 /* We accumulate the debugging information itself in the
3409 debug_info structure. */
9783e04a
DM
3410 debug.line = NULL;
3411 debug.external_dnr = NULL;
3412 debug.external_pdr = NULL;
3413 debug.external_sym = NULL;
3414 debug.external_opt = NULL;
3415 debug.external_aux = NULL;
3416 debug.ss = NULL;
6e07e54f 3417 debug.ssext = debug.ssext_end = NULL;
9783e04a
DM
3418 debug.external_fdr = NULL;
3419 debug.external_rfd = NULL;
6e07e54f
ILT
3420 debug.external_ext = debug.external_ext_end = NULL;
3421
9783e04a
DM
3422 mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
3423 if (mdebug_handle == (PTR) NULL)
3424 return false;
3425
5b3b9ff6
ILT
3426 if (SGI_COMPAT (abfd))
3427 {
3428 asection *s;
3429 EXTR esym;
3430 bfd_vma last;
3431 unsigned int i;
3432 static const char * const name[] =
3433 { ".text", ".init", ".fini", ".data",
3434 ".rodata", ".sdata", ".sbss", ".bss" };
3435 static const int sc[] = { scText, scInit, scFini, scData,
3436 scRData, scSData, scSBss, scBss };
3437
3438 esym.jmptbl = 0;
3439 esym.cobol_main = 0;
3440 esym.weakext = 0;
3441 esym.reserved = 0;
3442 esym.ifd = ifdNil;
3443 esym.asym.iss = issNil;
3444 esym.asym.st = stLocal;
3445 esym.asym.reserved = 0;
3446 esym.asym.index = indexNil;
3447 for (i = 0; i < 8; i++)
3448 {
3449 esym.asym.sc = sc[i];
3450 s = bfd_get_section_by_name (abfd, name[i]);
3451 if (s != NULL)
3452 {
3453 esym.asym.value = s->vma;
3454 last = s->vma + s->_raw_size;
3455 }
3456 else
3457 esym.asym.value = last;
3458
3459 if (! bfd_ecoff_debug_one_external (abfd, &debug, swap,
3460 name[i], &esym))
3461 return false;
3462 }
3463 }
3464
6e07e54f
ILT
3465 for (p = o->link_order_head;
3466 p != (struct bfd_link_order *) NULL;
3467 p = p->next)
3468 {
3469 asection *input_section;
3470 bfd *input_bfd;
3471 const struct ecoff_debug_swap *input_swap;
3472 struct ecoff_debug_info input_debug;
aac6b32f
ILT
3473 char *eraw_src;
3474 char *eraw_end;
6e07e54f
ILT
3475
3476 if (p->type != bfd_indirect_link_order)
aac6b32f
ILT
3477 {
3478 if (p->type == bfd_fill_link_order)
3479 continue;
3480 abort ();
3481 }
6e07e54f
ILT
3482
3483 input_section = p->u.indirect.section;
3484 input_bfd = input_section->owner;
3485
3486 if (bfd_get_flavour (input_bfd) != bfd_target_elf_flavour
3487 || (get_elf_backend_data (input_bfd)
3488 ->elf_backend_ecoff_debug_swap) == NULL)
b3c0fc57 3489 {
6e07e54f
ILT
3490 /* I don't know what a non MIPS ELF bfd would be
3491 doing with a .mdebug section, but I don't really
3492 want to deal with it. */
3493 continue;
b3c0fc57 3494 }
6e07e54f
ILT
3495
3496 input_swap = (get_elf_backend_data (input_bfd)
3497 ->elf_backend_ecoff_debug_swap);
3498
3499 BFD_ASSERT (p->size == input_section->_raw_size);
3500
3501 /* The ECOFF linking code expects that we have already
3502 read in the debugging information and set up an
3503 ecoff_debug_info structure, so we do that now. */
00176555
ILT
3504 if (! _bfd_mips_elf_read_ecoff_info (input_bfd, input_section,
3505 &input_debug))
6e07e54f
ILT
3506 return false;
3507
3508 if (! (bfd_ecoff_debug_accumulate
9783e04a
DM
3509 (mdebug_handle, abfd, &debug, swap, input_bfd,
3510 &input_debug, input_swap, info)))
6e07e54f
ILT
3511 return false;
3512
3513 /* Loop through the external symbols. For each one with
aac6b32f
ILT
3514 interesting information, try to find the symbol in
3515 the linker global hash table and save the information
3516 for the output external symbols. */
3517 eraw_src = input_debug.external_ext;
3518 eraw_end = (eraw_src
3519 + (input_debug.symbolic_header.iextMax
3520 * input_swap->external_ext_size));
3521 for (;
3522 eraw_src < eraw_end;
3523 eraw_src += input_swap->external_ext_size)
6e07e54f 3524 {
aac6b32f
ILT
3525 EXTR ext;
3526 const char *name;
3527 struct mips_elf_link_hash_entry *h;
3528
3529 (*input_swap->swap_ext_in) (input_bfd, (PTR) eraw_src, &ext);
3530 if (ext.asym.sc == scNil
3531 || ext.asym.sc == scUndefined
3532 || ext.asym.sc == scSUndefined)
3533 continue;
3534
3535 name = input_debug.ssext + ext.asym.iss;
3536 h = mips_elf_link_hash_lookup (mips_elf_hash_table (info),
3537 name, false, false, true);
3538 if (h == NULL || h->esym.ifd != -2)
3539 continue;
3540
3541 if (ext.ifd != -1)
6e07e54f 3542 {
aac6b32f
ILT
3543 BFD_ASSERT (ext.ifd
3544 < input_debug.symbolic_header.ifdMax);
3545 ext.ifd = input_debug.ifdmap[ext.ifd];
6e07e54f 3546 }
aac6b32f
ILT
3547
3548 h->esym = ext;
6e07e54f
ILT
3549 }
3550
aac6b32f 3551 /* Free up the information we just read. */
6e07e54f
ILT
3552 free (input_debug.line);
3553 free (input_debug.external_dnr);
3554 free (input_debug.external_pdr);
3555 free (input_debug.external_sym);
3556 free (input_debug.external_opt);
3557 free (input_debug.external_aux);
3558 free (input_debug.ss);
3559 free (input_debug.ssext);
3560 free (input_debug.external_fdr);
3561 free (input_debug.external_rfd);
aac6b32f
ILT
3562 free (input_debug.external_ext);
3563
3564 /* Hack: reset the SEC_HAS_CONTENTS flag so that
3565 elf_link_input_bfd ignores this section. */
3566 input_section->flags &=~ SEC_HAS_CONTENTS;
b3c0fc57
ILT
3567 }
3568
5b3b9ff6
ILT
3569 if (SGI_COMPAT (abfd) && info->shared)
3570 {
3571 /* Create .rtproc section. */
3572 rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
3573 if (rtproc_sec == NULL)
3574 {
3575 flagword flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
3576 | SEC_READONLY);
3577
3578 rtproc_sec = bfd_make_section (abfd, ".rtproc");
3579 if (rtproc_sec == NULL
3580 || ! bfd_set_section_flags (abfd, rtproc_sec, flags)
3581 || ! bfd_set_section_alignment (abfd, rtproc_sec, 12))
3582 return false;
3583 }
3584
3585 if (! mips_elf_create_procedure_table (mdebug_handle, abfd,
3586 info, rtproc_sec, &debug))
3587 return false;
3588 }
3589
6e07e54f 3590 /* Build the external symbol information. */
aac6b32f
ILT
3591 einfo.abfd = abfd;
3592 einfo.info = info;
3593 einfo.debug = &debug;
3594 einfo.swap = swap;
3595 einfo.failed = false;
3596 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
3597 mips_elf_output_extsym,
3598 (PTR) &einfo);
3599 if (einfo.failed)
b3c0fc57
ILT
3600 return false;
3601
aac6b32f 3602 /* Set the size of the .mdebug section. */
6e07e54f
ILT
3603 o->_raw_size = bfd_ecoff_debug_size (abfd, &debug, swap);
3604
aac6b32f
ILT
3605 /* Skip this section later on (I don't think this currently
3606 matters, but someday it might). */
6e07e54f
ILT
3607 o->link_order_head = (struct bfd_link_order *) NULL;
3608
3609 mdebug_sec = o;
3610 }
6e07e54f 3611
aac6b32f 3612 if (strncmp (o->name, ".gptab.", sizeof ".gptab." - 1) == 0)
6e07e54f 3613 {
aac6b32f
ILT
3614 const char *subname;
3615 unsigned int c;
3616 Elf32_gptab *tab;
3617 Elf32_External_gptab *ext_tab;
3618 unsigned int i;
3619
3620 /* The .gptab.sdata and .gptab.sbss sections hold
3621 information describing how the small data area would
3622 change depending upon the -G switch. These sections
3623 not used in executables files. */
3624 if (! info->relocateable)
3625 {
3626 asection **secpp;
3627
3628 for (p = o->link_order_head;
3629 p != (struct bfd_link_order *) NULL;
3630 p = p->next)
3631 {
3632 asection *input_section;
3633
3634 if (p->type != bfd_indirect_link_order)
3635 {
3636 if (p->type == bfd_fill_link_order)
3637 continue;
3638 abort ();
3639 }
3640
3641 input_section = p->u.indirect.section;
3642
3643 /* Hack: reset the SEC_HAS_CONTENTS flag so that
3644 elf_link_input_bfd ignores this section. */
3645 input_section->flags &=~ SEC_HAS_CONTENTS;
3646 }
3647
3648 /* Skip this section later on (I don't think this
3649 currently matters, but someday it might). */
3650 o->link_order_head = (struct bfd_link_order *) NULL;
3651
3652 /* Really remove the section. */
3653 for (secpp = &abfd->sections;
3654 *secpp != o;
3655 secpp = &(*secpp)->next)
3656 ;
3657 *secpp = (*secpp)->next;
3658 --abfd->section_count;
3659
3660 continue;
3661 }
3662
3663 /* There is one gptab for initialized data, and one for
3664 uninitialized data. */
3665 if (strcmp (o->name, ".gptab.sdata") == 0)
3666 gptab_data_sec = o;
3667 else if (strcmp (o->name, ".gptab.sbss") == 0)
3668 gptab_bss_sec = o;
3669 else
3670 {
a9713b91
ILT
3671 (*_bfd_error_handler)
3672 ("%s: illegal section name `%s'",
3673 bfd_get_filename (abfd), o->name);
aac6b32f
ILT
3674 bfd_set_error (bfd_error_nonrepresentable_section);
3675 return false;
3676 }
3677
3678 /* The linker script always combines .gptab.data and
3679 .gptab.sdata into .gptab.sdata, and likewise for
3680 .gptab.bss and .gptab.sbss. It is possible that there is
3681 no .sdata or .sbss section in the output file, in which
3682 case we must change the name of the output section. */
3683 subname = o->name + sizeof ".gptab" - 1;
3684 if (bfd_get_section_by_name (abfd, subname) == NULL)
3685 {
3686 if (o == gptab_data_sec)
3687 o->name = ".gptab.data";
3688 else
3689 o->name = ".gptab.bss";
3690 subname = o->name + sizeof ".gptab" - 1;
3691 BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
3692 }
3693
3694 /* Set up the first entry. */
3695 c = 1;
5b3b9ff6 3696 tab = (Elf32_gptab *) bfd_malloc (c * sizeof (Elf32_gptab));
aac6b32f 3697 if (tab == NULL)
5b3b9ff6 3698 return false;
aac6b32f
ILT
3699 tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
3700 tab[0].gt_header.gt_unused = 0;
3701
3702 /* Combine the input sections. */
6e07e54f
ILT
3703 for (p = o->link_order_head;
3704 p != (struct bfd_link_order *) NULL;
3705 p = p->next)
3706 {
aac6b32f
ILT
3707 asection *input_section;
3708 bfd *input_bfd;
3709 bfd_size_type size;
3710 unsigned long last;
3711 bfd_size_type gpentry;
3712
3713 if (p->type != bfd_indirect_link_order)
6e07e54f 3714 {
aac6b32f
ILT
3715 if (p->type == bfd_fill_link_order)
3716 continue;
3717 abort ();
3718 }
6e07e54f 3719
aac6b32f
ILT
3720 input_section = p->u.indirect.section;
3721 input_bfd = input_section->owner;
3722
3723 /* Combine the gptab entries for this input section one
3724 by one. We know that the input gptab entries are
3725 sorted by ascending -G value. */
3726 size = bfd_section_size (input_bfd, input_section);
3727 last = 0;
3728 for (gpentry = sizeof (Elf32_External_gptab);
3729 gpentry < size;
3730 gpentry += sizeof (Elf32_External_gptab))
3731 {
3732 Elf32_External_gptab ext_gptab;
3733 Elf32_gptab int_gptab;
3734 unsigned long val;
3735 unsigned long add;
3736 boolean exact;
3737 unsigned int look;
3738
3739 if (! (bfd_get_section_contents
3740 (input_bfd, input_section, (PTR) &ext_gptab,
3741 gpentry, sizeof (Elf32_External_gptab))))
9783e04a 3742 {
aac6b32f 3743 free (tab);
9783e04a
DM
3744 return false;
3745 }
aac6b32f
ILT
3746
3747 bfd_mips_elf32_swap_gptab_in (input_bfd, &ext_gptab,
3748 &int_gptab);
3749 val = int_gptab.gt_entry.gt_g_value;
3750 add = int_gptab.gt_entry.gt_bytes - last;
3751
3752 exact = false;
3753 for (look = 1; look < c; look++)
3754 {
3755 if (tab[look].gt_entry.gt_g_value >= val)
3756 tab[look].gt_entry.gt_bytes += add;
3757
3758 if (tab[look].gt_entry.gt_g_value == val)
3759 exact = true;
3760 }
3761
3762 if (! exact)
3763 {
3764 Elf32_gptab *new_tab;
3765 unsigned int max;
3766
3767 /* We need a new table entry. */
3768 new_tab = ((Elf32_gptab *)
5b3b9ff6
ILT
3769 bfd_realloc ((PTR) tab,
3770 (c + 1) * sizeof (Elf32_gptab)));
aac6b32f
ILT
3771 if (new_tab == NULL)
3772 {
aac6b32f
ILT
3773 free (tab);
3774 return false;
3775 }
3776 tab = new_tab;
3777 tab[c].gt_entry.gt_g_value = val;
3778 tab[c].gt_entry.gt_bytes = add;
3779
3780 /* Merge in the size for the next smallest -G
3781 value, since that will be implied by this new
3782 value. */
3783 max = 0;
3784 for (look = 1; look < c; look++)
3785 {
3786 if (tab[look].gt_entry.gt_g_value < val
3787 && (max == 0
3788 || (tab[look].gt_entry.gt_g_value
3789 > tab[max].gt_entry.gt_g_value)))
3790 max = look;
3791 }
3792 if (max != 0)
3793 tab[c].gt_entry.gt_bytes +=
3794 tab[max].gt_entry.gt_bytes;
3795
3796 ++c;
3797 }
3798
3799 last = int_gptab.gt_entry.gt_bytes;
6e07e54f 3800 }
aac6b32f
ILT
3801
3802 /* Hack: reset the SEC_HAS_CONTENTS flag so that
3803 elf_link_input_bfd ignores this section. */
3804 input_section->flags &=~ SEC_HAS_CONTENTS;
6e07e54f 3805 }
aac6b32f
ILT
3806
3807 /* The table must be sorted by -G value. */
3808 if (c > 2)
3809 qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
3810
3811 /* Swap out the table. */
3812 ext_tab = ((Elf32_External_gptab *)
3813 bfd_alloc (abfd, c * sizeof (Elf32_External_gptab)));
3814 if (ext_tab == NULL)
6e07e54f 3815 {
aac6b32f
ILT
3816 free (tab);
3817 return false;
3818 }
3819
3820 for (i = 0; i < c; i++)
3821 bfd_mips_elf32_swap_gptab_out (abfd, tab + i, ext_tab + i);
3822 free (tab);
3823
3824 o->_raw_size = c * sizeof (Elf32_External_gptab);
3825 o->contents = (bfd_byte *) ext_tab;
3826
3827 /* Skip this section later on (I don't think this currently
3828 matters, but someday it might). */
3829 o->link_order_head = (struct bfd_link_order *) NULL;
3830 }
3831 }
3832
aac6b32f
ILT
3833 /* Invoke the regular ELF backend linker to do all the work. */
3834 if (! bfd_elf32_bfd_final_link (abfd, info))
3835 return false;
3836
3837 /* Now write out the computed sections. */
3838
6e07e54f
ILT
3839 if (reginfo_sec != (asection *) NULL)
3840 {
3841 Elf32_External_RegInfo ext;
3842
3843 bfd_mips_elf32_swap_reginfo_out (abfd, &reginfo, &ext);
3844 if (! bfd_set_section_contents (abfd, reginfo_sec, (PTR) &ext,
3845 (file_ptr) 0, sizeof ext))
3846 return false;
3847 }
b3c0fc57 3848
6e07e54f
ILT
3849 if (mdebug_sec != (asection *) NULL)
3850 {
aac6b32f 3851 BFD_ASSERT (abfd->output_has_begun);
9783e04a
DM
3852 if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
3853 swap, info,
3854 mdebug_sec->filepos))
6e07e54f 3855 return false;
9783e04a
DM
3856
3857 bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
b3c0fc57
ILT
3858 }
3859
aac6b32f 3860 if (gptab_data_sec != (asection *) NULL)
6e07e54f 3861 {
aac6b32f
ILT
3862 if (! bfd_set_section_contents (abfd, gptab_data_sec,
3863 gptab_data_sec->contents,
3864 (file_ptr) 0,
3865 gptab_data_sec->_raw_size))
3866 return false;
3867 }
3868
3869 if (gptab_bss_sec != (asection *) NULL)
3870 {
3871 if (! bfd_set_section_contents (abfd, gptab_bss_sec,
3872 gptab_bss_sec->contents,
3873 (file_ptr) 0,
3874 gptab_bss_sec->_raw_size))
3875 return false;
6e07e54f
ILT
3876 }
3877
5b3b9ff6
ILT
3878 if (SGI_COMPAT (abfd))
3879 {
3880 rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
3881 if (rtproc_sec != NULL)
3882 {
3883 if (! bfd_set_section_contents (abfd, rtproc_sec,
3884 rtproc_sec->contents,
3885 (file_ptr) 0,
3886 rtproc_sec->_raw_size))
3887 return false;
3888 }
3889 }
3890
6e07e54f 3891 return true;
b3c0fc57 3892}
6e07e54f 3893
aac6b32f 3894/* Handle a MIPS ELF HI16 reloc. */
b3c0fc57
ILT
3895
3896static void
aac6b32f
ILT
3897mips_elf_relocate_hi16 (input_bfd, relhi, rello, contents, addend)
3898 bfd *input_bfd;
3899 Elf_Internal_Rela *relhi;
3900 Elf_Internal_Rela *rello;
3901 bfd_byte *contents;
3902 bfd_vma addend;
b3c0fc57 3903{
aac6b32f
ILT
3904 bfd_vma insn;
3905 bfd_vma addlo;
b3c0fc57 3906
aac6b32f
ILT
3907 insn = bfd_get_32 (input_bfd, contents + relhi->r_offset);
3908
3909 addlo = bfd_get_32 (input_bfd, contents + rello->r_offset);
3910 addlo &= 0xffff;
3911
3912 addend += ((insn & 0xffff) << 16) + addlo;
3913
3914 if ((addlo & 0x8000) != 0)
3915 addend -= 0x10000;
3916 if ((addend & 0x8000) != 0)
3917 addend += 0x10000;
3918
3919 bfd_put_32 (input_bfd,
3920 (insn & 0xffff0000) | ((addend >> 16) & 0xffff),
3921 contents + relhi->r_offset);
3922}
3923
5b3b9ff6
ILT
3924/* Handle a MIPS ELF local GOT16 reloc. */
3925
3926static void
3927mips_elf_relocate_got_local (output_bfd, input_bfd, sgot, relhi, rello,
3928 contents, addend)
3929 bfd *output_bfd;
3930 bfd *input_bfd;
3931 asection *sgot;
3932 Elf_Internal_Rela *relhi;
3933 Elf_Internal_Rela *rello;
3934 bfd_byte *contents;
3935 bfd_vma addend;
3936{
3937 int local_gotno;
3938 int i;
3939 bfd_vma insn;
3940 bfd_vma addlo;
3941 bfd_vma address;
3942 bfd_vma hipage;
3943 bfd_byte *got_contents;
3944 struct mips_got_info *g;
3945
3946 insn = bfd_get_32 (input_bfd, contents + relhi->r_offset);
3947
3948 addlo = bfd_get_32 (input_bfd, contents + rello->r_offset);
3949 addlo &= 0xffff;
3950
3951 addend += ((insn & 0xffff) << 16) + addlo;
3952
3953 if ((addlo & 0x8000) != 0)
3954 addend -= 0x10000;
3955 if ((addend & 0x8000) != 0)
3956 addend += 0x10000;
3957
3958 /* Get a got entry representing requested hipage. */
3959 BFD_ASSERT (elf_section_data (sgot) != NULL);
3960 g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
3961 BFD_ASSERT (g != NULL);
3962
3963 local_gotno = g->local_gotno;
3964 got_contents = sgot->contents;
3965 hipage = addend & 0xffff0000;
3966
3967 for (i = MIPS_RESERVED_GOTNO; i < local_gotno; i++)
3968 {
3969 address = bfd_get_32 (input_bfd, got_contents + i * 4);
3970 if (hipage == (address & 0xffff0000))
3971 break;
3972 if (address == (bfd_vma) 0)
3973 {
3974 bfd_put_32 (input_bfd, hipage, got_contents + i * 4);
3975 break;
3976 }
3977 }
3978
3979 BFD_ASSERT (i < local_gotno);
3980#if 1
3981 if (i == local_gotno)
3982 (*_bfd_error_handler)
3983 ("ELF MIPS linker: more got entries are needed for hipage: %x",
3984 hipage);
3985#endif
3986
3987 i = - ELF_MIPS_GP_OFFSET (output_bfd) + i * 4;
3988 bfd_put_32 (input_bfd, (insn & 0xffff0000) | (i & 0xffff),
3989 contents + relhi->r_offset);
3990}
3991
3992/* Handle MIPS ELF CALL16 reloc and global GOT16 reloc. */
3993
3994static void
3995mips_elf_relocate_global_got (input_bfd, rel, contents, offset)
3996 bfd *input_bfd;
3997 Elf_Internal_Rela *rel;
3998 bfd_byte *contents;
3999 bfd_vma offset;
4000{
4001 bfd_vma insn;
4002
4003 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
4004 bfd_put_32 (input_bfd,
4005 (insn & 0xffff0000) | (offset & 0xffff),
4006 contents + rel->r_offset);
4007}
4008
aac6b32f
ILT
4009/* Relocate a MIPS ELF section. */
4010
4011static boolean
4012mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
82b1edf7 4013 contents, relocs, local_syms, local_sections)
aac6b32f
ILT
4014 bfd *output_bfd;
4015 struct bfd_link_info *info;
4016 bfd *input_bfd;
4017 asection *input_section;
4018 bfd_byte *contents;
4019 Elf_Internal_Rela *relocs;
4020 Elf_Internal_Sym *local_syms;
4021 asection **local_sections;
4022{
4023 Elf_Internal_Shdr *symtab_hdr;
4024 size_t locsymcount;
4025 size_t extsymoff;
5b3b9ff6
ILT
4026 asection *sgot, *sreloc, *scpt;
4027 bfd *dynobj;
abec70b9 4028 bfd_vma gp;
aac6b32f
ILT
4029 Elf_Internal_Rela *rel;
4030 Elf_Internal_Rela *relend;
5b3b9ff6 4031 struct mips_got_info *g;
aac6b32f 4032
5b3b9ff6 4033 dynobj = elf_hash_table (info)->dynobj;
aac6b32f
ILT
4034 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4035
5b3b9ff6
ILT
4036 sgot = NULL;
4037 sreloc = NULL;
4038 if (dynobj == NULL || ! SGI_COMPAT (output_bfd))
4039 scpt = NULL;
4040 else
4041 scpt = bfd_get_section_by_name (dynobj, ".compact_rel");
4042 g = NULL;
4043
aac6b32f 4044 if (elf_bad_symtab (input_bfd))
b3c0fc57 4045 {
aac6b32f
ILT
4046 locsymcount = symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
4047 extsymoff = 0;
4048 }
4049 else
4050 {
4051 locsymcount = symtab_hdr->sh_info;
4052 extsymoff = symtab_hdr->sh_info;
4053 }
4054
abec70b9
ILT
4055 gp = _bfd_get_gp_value (output_bfd);
4056
aac6b32f
ILT
4057 rel = relocs;
4058 relend = relocs + input_section->reloc_count;
4059 for (; rel < relend; rel++)
4060 {
4061 int r_type;
82b1edf7 4062 reloc_howto_type *howto;
6ab826bd 4063 unsigned long r_symndx;
aac6b32f
ILT
4064 bfd_vma addend;
4065 struct elf_link_hash_entry *h;
4066 asection *sec;
4067 Elf_Internal_Sym *sym;
4068 bfd_reloc_status_type r;
4069
4070 r_type = ELF32_R_TYPE (rel->r_info);
4071 if (r_type < 0 || r_type >= (int) R_MIPS_max)
6e07e54f 4072 {
aac6b32f
ILT
4073 bfd_set_error (bfd_error_bad_value);
4074 return false;
6e07e54f 4075 }
aac6b32f 4076 howto = elf_mips_howto_table + r_type;
b3c0fc57 4077
5b3b9ff6
ILT
4078 if (dynobj != NULL
4079 && (r_type == R_MIPS_CALL16
4080 || r_type == R_MIPS_GOT16
4081 || r_type == R_MIPS_CALL_HI16
4082 || r_type == R_MIPS_CALL_LO16
4083 || r_type == R_MIPS_GOT_HI16
4084 || r_type == R_MIPS_GOT_LO16))
4085 {
4086 /* We need the .got section. */
4087 if (sgot == NULL)
4088 {
4089 sgot = bfd_get_section_by_name (dynobj, ".got");
4090 BFD_ASSERT (sgot != NULL);
4091 BFD_ASSERT (elf_section_data (sgot) != NULL);
4092 g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
4093 BFD_ASSERT (g != NULL);
4094 }
4095 }
4096
aac6b32f
ILT
4097 r_symndx = ELF32_R_SYM (rel->r_info);
4098
4099 /* Mix in the change in GP address for a GP relative reloc. */
4100 if (r_type != R_MIPS_GPREL16
4101 && r_type != R_MIPS_LITERAL
4102 && r_type != R_MIPS_GPREL32)
4103 addend = 0;
4104 else
b3c0fc57 4105 {
cba3f8a9 4106 if (gp == 0)
aac6b32f
ILT
4107 {
4108 if (! ((*info->callbacks->reloc_dangerous)
4109 (info,
4110 "GP relative relocation when GP not defined",
4111 input_bfd, input_section,
4112 rel->r_offset)))
4113 return false;
4114 /* Only give the error once per link. */
cba3f8a9
ILT
4115 gp = 4;
4116 _bfd_set_gp_value (output_bfd, gp);
aac6b32f
ILT
4117 }
4118
4119 if (r_symndx < extsymoff
4120 || (elf_bad_symtab (input_bfd)
4121 && local_sections[r_symndx] != NULL))
4122 {
4123 /* This is a relocation against a section. The current
4124 addend in the instruction is the difference between
4125 INPUT_SECTION->vma and the GP value of INPUT_BFD. We
4126 must change this to be the difference between the
4127 final definition (which will end up in RELOCATION)
4128 and the GP value of OUTPUT_BFD (which is in GP). */
cba3f8a9 4129 addend = elf_gp (input_bfd) - gp;
aac6b32f
ILT
4130 }
4131 else if (! info->relocateable)
4132 {
4133 /* We are doing a final link. The current addend in the
4134 instruction is simply the desired offset into the
4135 symbol (normally zero). We want the instruction to
4136 hold the difference between the final definition of
4137 the symbol (which will end up in RELOCATION) and the
4138 GP value of OUTPUT_BFD (which is in GP). */
cba3f8a9 4139 addend = - gp;
aac6b32f
ILT
4140 }
4141 else
4142 {
4143 /* We are generating relocateable output, and we aren't
4144 going to define this symbol, so we just leave the
4145 instruction alone. */
4146 addend = 0;
4147 }
b3c0fc57 4148 }
b3c0fc57 4149
aac6b32f
ILT
4150 h = NULL;
4151 sym = NULL;
4152 sec = NULL;
4153 if (info->relocateable)
4154 {
4155 /* This is a relocateable link. We don't have to change
4156 anything, unless the reloc is against a section symbol,
4157 in which case we have to adjust according to where the
4158 section symbol winds up in the output section. */
4159 if (r_symndx >= locsymcount
4160 || (elf_bad_symtab (input_bfd)
4161 && local_sections[r_symndx] == NULL))
4162 r = bfd_reloc_ok;
4163 else
4164 {
4165 sym = local_syms + r_symndx;
4166 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
4167 r = bfd_reloc_ok;
4168 else
4169 {
4170 sec = local_sections[r_symndx];
4171
4172 /* It would be logical to add sym->st_value here,
4173 but Irix 5 sometimes generates a garbage symbol
4174 value. */
4175 addend += sec->output_offset;
4176
5b3b9ff6
ILT
4177 /* If this is HI16 or GOT16 with an associated LO16,
4178 adjust the addend accordingly. Otherwise, just
aac6b32f 4179 relocate. */
abec70b9 4180 if (r_type != R_MIPS_HI16 && r_type != R_MIPS_GOT16)
aac6b32f
ILT
4181 r = _bfd_relocate_contents (howto, input_bfd,
4182 addend,
4183 contents + rel->r_offset);
4184 else
4185 {
abec70b9
ILT
4186 Elf_Internal_Rela *lorel;
4187
4188 /* As a GNU extension, permit an arbitrary
4189 number of R_MIPS_HI16 relocs before the
4190 R_MIPS_LO16 reloc. This permits gcc to emit
4191 the HI and LO relocs itself. */
4192 if (r_type == R_MIPS_GOT16)
4193 lorel = rel + 1;
4194 else
4195 {
4196 for (lorel = rel + 1;
4197 (lorel < relend
4198 && (ELF32_R_TYPE (lorel->r_info)
4199 == R_MIPS_HI16));
4200 lorel++)
4201 ;
4202 }
4203 if (lorel < relend
4204 && ELF32_R_TYPE (lorel->r_info) == R_MIPS_LO16)
4205 {
4206 mips_elf_relocate_hi16 (input_bfd, rel, lorel,
4207 contents, addend);
4208 r = bfd_reloc_ok;
4209 }
4210 else
4211 r = _bfd_relocate_contents (howto, input_bfd,
4212 addend,
4213 contents + rel->r_offset);
aac6b32f
ILT
4214 }
4215 }
4216 }
4217 }
4218 else
4219 {
4220 bfd_vma relocation;
5b3b9ff6 4221 boolean local;
aac6b32f
ILT
4222
4223 /* This is a final link. */
4224 sym = NULL;
4225 if (r_symndx < extsymoff
4226 || (elf_bad_symtab (input_bfd)
4227 && local_sections[r_symndx] != NULL))
4228 {
5b3b9ff6 4229 local = true;
aac6b32f
ILT
4230 sym = local_syms + r_symndx;
4231 sec = local_sections[r_symndx];
4232 relocation = (sec->output_section->vma
4233 + sec->output_offset);
4234
4235 /* It would be logical to always add sym->st_value here,
4236 but Irix 5 sometimes generates a garbage symbol
4237 value. */
4238 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
4239 relocation += sym->st_value;
4240 }
4241 else
4242 {
4243 long indx;
4244
5b3b9ff6 4245 local = false;
aac6b32f
ILT
4246 indx = r_symndx - extsymoff;
4247 h = elf_sym_hashes (input_bfd)[indx];
e9f03cd4
ILT
4248 while (h->root.type == bfd_link_hash_indirect
4249 || h->root.type == bfd_link_hash_warning)
4250 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5b3b9ff6
ILT
4251 if (strcmp (h->root.root.string, "_gp_disp") == 0)
4252 {
cba3f8a9 4253 if (gp == 0)
5b3b9ff6
ILT
4254 {
4255 if (! ((*info->callbacks->reloc_dangerous)
4256 (info,
4257 "_gp_disp used when GP not defined",
4258 input_bfd, input_section,
4259 rel->r_offset)))
4260 return false;
4261 /* Only give the error once per link. */
cba3f8a9
ILT
4262 gp = 4;
4263 _bfd_set_gp_value (output_bfd, gp);
5b3b9ff6
ILT
4264 relocation = 0;
4265 }
4266 else
4267 {
4268 sec = input_section;
4269 if (sec->output_section != NULL)
cba3f8a9 4270 relocation = (gp
5b3b9ff6
ILT
4271 - (rel->r_offset
4272 + sec->output_section->vma
4273 + sec->output_offset));
4274 else
cba3f8a9 4275 relocation = gp - rel->r_offset;
5b3b9ff6
ILT
4276 if (r_type == R_MIPS_LO16)
4277 relocation += 4;
4278 }
4279 }
4280 else if (h->root.type == bfd_link_hash_defined
a16fcab3 4281 || h->root.type == bfd_link_hash_defweak)
aac6b32f
ILT
4282 {
4283 sec = h->root.u.def.section;
5b3b9ff6
ILT
4284 if (sec->output_section == NULL)
4285 relocation = 0;
4286 else
4287 relocation = (h->root.u.def.value
4288 + sec->output_section->vma
4289 + sec->output_offset);
aac6b32f 4290 }
a16fcab3 4291 else if (h->root.type == bfd_link_hash_undefweak)
aac6b32f 4292 relocation = 0;
5b3b9ff6
ILT
4293 else if (info->shared && ! info->symbolic)
4294 relocation = 0;
53787b23
ILT
4295 else if (strcmp (h->root.root.string, "_DYNAMIC_LINK") == 0)
4296 {
4297 /* If this is a dynamic link, we should have created
4298 a _DYNAMIC_LINK symbol in
4299 mips_elf_create_dynamic_sections. Otherwise, we
4300 should define the symbol with a value of 0.
4301 FIXME: It should probably get into the symbol
4302 table somehow as well. */
4303 BFD_ASSERT (! info->shared);
4304 BFD_ASSERT (bfd_get_section_by_name (output_bfd,
4305 ".dynamic") == NULL);
4306 relocation = 0;
4307 }
aac6b32f
ILT
4308 else
4309 {
4310 if (! ((*info->callbacks->undefined_symbol)
4311 (info, h->root.root.string, input_bfd,
4312 input_section, rel->r_offset)))
4313 return false;
4314 relocation = 0;
4315 }
4316 }
4317
abec70b9 4318 if (r_type == R_MIPS_HI16)
aac6b32f 4319 {
abec70b9
ILT
4320 Elf_Internal_Rela *lorel;
4321
4322 /* As a GNU extension, permit an arbitrary number of
4323 R_MIPS_HI16 relocs before the R_MIPS_LO16 reloc.
4324 This permits gcc to emit the HI and LO relocs itself. */
4325 for (lorel = rel + 1;
4326 (lorel < relend
4327 && ELF32_R_TYPE (lorel->r_info) == R_MIPS_HI16);
4328 lorel++)
4329 ;
4330 if (lorel < relend
4331 && ELF32_R_TYPE (lorel->r_info) == R_MIPS_LO16)
4332 {
4333 mips_elf_relocate_hi16 (input_bfd, rel, lorel,
4334 contents, relocation + addend);
4335 r = bfd_reloc_ok;
4336 }
4337 else
4338 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4339 contents, rel->r_offset,
4340 relocation, addend);
aac6b32f 4341 }
5b3b9ff6
ILT
4342 else if (r_type == R_MIPS_GOT16 && local)
4343 {
abec70b9 4344 /* GOT16 must also have an associated LO16 in the local
5b3b9ff6
ILT
4345 case. In this case, the addend is extracted and the
4346 section in which the referenced object is determined.
4347 Then the final address of the object is computed and
4348 the GOT entry for the hipage (an aligned 64kb chunk)
4349 is added to .got section if needed. The offset field
4350 of the GOT16-relocated instruction is replaced by the
4351 index of this GOT entry for the hipage. */
4352 if ((rel + 1) < relend
4353 && ELF32_R_TYPE ((rel + 1)->r_info) == R_MIPS_LO16)
4354 {
4355 mips_elf_relocate_got_local (output_bfd, input_bfd, sgot,
4356 rel, rel + 1,
4357 contents,
4358 relocation + addend);
4359 r = bfd_reloc_ok;
4360 }
4361 else
4362 r = bfd_reloc_outofrange;
4363 }
4364 else if (r_type == R_MIPS_CALL16
4365 || r_type == R_MIPS_GOT16
4366 || r_type == R_MIPS_CALL_LO16
4367 || r_type == R_MIPS_GOT_LO16)
4368 {
4369 bfd_vma offset;
4370
4371 /* This symbol must be registered as a global symbol
4372 having the corresponding got entry. */
4373 BFD_ASSERT (h->got_offset != (bfd_vma) -1);
4374
4375 offset = (h->dynindx - g->global_gotsym + g->local_gotno) * 4;
4376 BFD_ASSERT (g->local_gotno <= offset
4377 && offset < sgot->_raw_size);
4378 bfd_put_32 (output_bfd, relocation + addend,
4379 sgot->contents + offset);
4380 offset = (sgot->output_section->vma + sgot->output_offset
cba3f8a9 4381 + offset - gp);
5b3b9ff6
ILT
4382 mips_elf_relocate_global_got (input_bfd, rel, contents,
4383 offset);
4384 r = bfd_reloc_ok;
4385 }
4386 else if (r_type == R_MIPS_CALL_HI16
4387 || r_type == R_MIPS_GOT_HI16)
4388 {
4389 bfd_vma offset;
4390
4391 /* This must be a global symbol with a got entry. The
4392 next reloc must be the corresponding LO16 reloc. */
4393 BFD_ASSERT (h != NULL && h->got_offset != (bfd_vma) -1);
4394 BFD_ASSERT ((rel + 1) < relend);
4395 BFD_ASSERT (ELF32_R_TYPE ((rel + 1)->r_info)
4396 == (r_type == R_MIPS_CALL_HI16
4397 ? R_MIPS_CALL_LO16
4398 : R_MIPS_GOT_LO16));
4399
4400 offset = (h->dynindx - g->global_gotsym + g->local_gotno) * 4;
4401 BFD_ASSERT (g->local_gotno <= offset
4402 && offset < sgot->_raw_size);
4403 bfd_put_32 (output_bfd, relocation + addend,
4404 sgot->contents + offset);
4405 offset = (sgot->output_section->vma + sgot->output_offset
cba3f8a9 4406 + offset - gp);
5b3b9ff6
ILT
4407 mips_elf_relocate_hi16 (input_bfd, rel, rel + 1, contents,
4408 offset);
4409 r = bfd_reloc_ok;
4410 }
4411 else if (r_type == R_MIPS_REL32
4412 || r_type == R_MIPS_32)
4413 {
4414 Elf_Internal_Rel outrel;
4415 Elf32_crinfo cptrel;
4416 bfd_byte *cr;
4417
abec70b9
ILT
4418 if ((info->shared
4419 || (h != NULL
4420 && ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)
4421 == 0)))
5b3b9ff6
ILT
4422 && (input_section->flags & SEC_ALLOC) != 0)
4423 {
4424 /* When generating a shared object, these
4425 relocations are copied into the output file to be
4426 resolved at run time. */
4427 if (sreloc == NULL)
4428 {
4429 sreloc = bfd_get_section_by_name (dynobj, ".rel.dyn");
4430 BFD_ASSERT (sreloc != NULL);
4431 }
4432
4433 outrel.r_offset = (rel->r_offset
4434 + input_section->output_section->vma
4435 + input_section->output_offset);
4436
4437 addend = bfd_get_32 (input_bfd, contents + rel->r_offset);
4438
53787b23
ILT
4439 if (h != NULL
4440 && (! info->symbolic
4441 || (h->elf_link_hash_flags
4442 & ELF_LINK_HASH_DEF_REGULAR) == 0))
5b3b9ff6
ILT
4443 {
4444 BFD_ASSERT (h->dynindx != -1);
4445 outrel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_REL32);
4446 sec = input_section;
4447 }
4448 else
4449 {
4450 long indx;
4451
53787b23
ILT
4452 if (h == NULL)
4453 sec = local_sections[r_symndx];
4454 else
4455 {
4456 BFD_ASSERT (h->root.type == bfd_link_hash_defined
4457 || (h->root.type
4458 == bfd_link_hash_defweak));
4459 sec = h->root.u.def.section;
4460 }
5b3b9ff6
ILT
4461 if (sec != NULL && bfd_is_abs_section (sec))
4462 indx = 0;
4463 else if (sec == NULL || sec->owner == NULL)
4464 {
4465 bfd_set_error (bfd_error_bad_value);
4466 return false;
4467 }
4468 else
4469 {
4470 asection *osec;
4471
4472 osec = sec->output_section;
4473 indx = elf_section_data (osec)->dynindx;
4474 if (indx == 0)
4475 abort ();
4476 }
4477
4478 outrel.r_info = ELF32_R_INFO (indx, R_MIPS_REL32);
4479 addend += relocation;
4480 }
4481
4482 bfd_put_32 (output_bfd, addend, contents + rel->r_offset);
4483 bfd_elf32_swap_reloc_out (output_bfd, &outrel,
4484 (((Elf32_External_Rel *)
4485 sreloc->contents)
4486 + sreloc->reloc_count));
4487 ++sreloc->reloc_count;
4488
4489 if (SGI_COMPAT (output_bfd))
4490 {
4491 if (scpt == NULL)
4492 continue;
4493
4494 /* Make an entry of compact relocation info. */
4495 mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG);
4496 cptrel.vaddr = (rel->r_offset
4497 + input_section->output_section->vma
4498 + input_section->output_offset);
4499 if (r_type == R_MIPS_REL32)
4500 mips_elf_set_cr_type (cptrel, CRT_MIPS_REL32);
4501 else
4502 mips_elf_set_cr_type (cptrel, CRT_MIPS_WORD);
53787b23 4503 mips_elf_set_cr_dist2to (cptrel, 0);
5b3b9ff6
ILT
4504 cptrel.konst = addend;
4505
4506 cr = (scpt->contents
4507 + sizeof (Elf32_External_compact_rel));
4508 bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
4509 ((Elf32_External_crinfo *) cr
4510 + scpt->reloc_count));
4511 ++scpt->reloc_count;
4512 }
4513
4514 /* This reloc will be computed at runtime, so
4515 there's no need to do anything now. */
4516 continue;
4517 }
4518 else
4519 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4520 contents, rel->r_offset,
4521 relocation, addend);
4522 }
4523 else
4524 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4525 contents, rel->r_offset,
4526 relocation, addend);
4527
4528 if (SGI_COMPAT (abfd)
4529 && scpt != NULL
4530 && (input_section->flags & SEC_ALLOC) != 0)
4531 {
4532 Elf32_crinfo cptrel;
4533 bfd_byte *cr;
4534
4535 /* Make an entry of compact relocation info. */
4536 mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG);
4537 cptrel.vaddr = (rel->r_offset
4538 + input_section->output_section->vma
4539 + input_section->output_offset);
4540
4541 switch (r_type)
4542 {
4543 case R_MIPS_26:
4544 mips_elf_set_cr_type (cptrel, CRT_MIPS_JMPAD);
53787b23
ILT
4545 /* XXX How should we set dist2to in this case. */
4546 mips_elf_set_cr_dist2to (cptrel, 8);
4547 cptrel.konst = addend + relocation;
5b3b9ff6
ILT
4548 cr = scpt->contents + sizeof (Elf32_External_compact_rel);
4549 bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
4550 ((Elf32_External_crinfo *) cr
4551 + scpt->reloc_count));
4552 ++scpt->reloc_count;
4553 break;
4554
4555 case R_MIPS_GPREL16:
4556 case R_MIPS_LITERAL:
4557 case R_MIPS_GPREL32:
4558 mips_elf_set_cr_type (cptrel, CRT_MIPS_GPHI_LO);
cba3f8a9 4559 cptrel.konst = gp - cptrel.vaddr;
53787b23 4560 mips_elf_set_cr_dist2to (cptrel, 4);
5b3b9ff6
ILT
4561 cr = scpt->contents + sizeof (Elf32_External_compact_rel);
4562 bfd_elf32_swap_crinfo_out (output_bfd, &cptrel,
4563 ((Elf32_External_crinfo *) cr
4564 + scpt->reloc_count));
4565 ++scpt->reloc_count;
4566 break;
4567
4568 default:
4569 break;
4570 }
4571 }
aac6b32f
ILT
4572 }
4573
4574 if (r != bfd_reloc_ok)
4575 {
4576 switch (r)
4577 {
4578 default:
4579 case bfd_reloc_outofrange:
4580 abort ();
4581 case bfd_reloc_overflow:
4582 {
4583 const char *name;
4584
4585 if (h != NULL)
4586 name = h->root.root.string;
4587 else
4588 {
ede4eed4
KR
4589 name = bfd_elf_string_from_elf_section (input_bfd,
4590 symtab_hdr->sh_link,
4591 sym->st_name);
aac6b32f
ILT
4592 if (name == NULL)
4593 return false;
4594 if (*name == '\0')
4595 name = bfd_section_name (input_bfd, sec);
4596 }
4597 if (! ((*info->callbacks->reloc_overflow)
4598 (info, name, howto->name, (bfd_vma) 0,
4599 input_bfd, input_section, rel->r_offset)))
4600 return false;
4601 }
4602 break;
4603 }
4604 }
b3c0fc57 4605 }
aac6b32f
ILT
4606
4607 return true;
b3c0fc57
ILT
4608}
4609\f
5b3b9ff6
ILT
4610/* Functions for the dynamic linker. */
4611
4612/* The name of the dynamic interpreter. This is put in the .interp
4613 section. */
4614
4615#define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1"
4616
4617/* Create dynamic sections when linking against a dynamic object. */
5b3b9ff6
ILT
4618
4619static boolean
4620mips_elf_create_dynamic_sections (abfd, info)
a16fcab3 4621 bfd *abfd;
5b3b9ff6 4622 struct bfd_link_info *info;
a16fcab3 4623{
5b3b9ff6
ILT
4624 struct elf_link_hash_entry *h;
4625 flagword flags;
4626 register asection *s;
4627 const char * const *namep;
a16fcab3 4628
5b3b9ff6
ILT
4629 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4630 | SEC_READONLY);
a16fcab3 4631
5b3b9ff6
ILT
4632 /* Mips ABI requests the .dynamic section to be read only. */
4633 s = bfd_get_section_by_name (abfd, ".dynamic");
4634 if (s != NULL)
4635 {
4636 if (! bfd_set_section_flags (abfd, s, flags))
4637 return false;
4638 }
a16fcab3 4639
5b3b9ff6
ILT
4640 /* We need to create .got section. */
4641 if (! mips_elf_create_got_section (abfd, info))
4642 return false;
4643
4644 /* Create .stub section. */
4645 if (bfd_get_section_by_name (abfd, ".stub") == NULL)
a16fcab3 4646 {
5b3b9ff6
ILT
4647 s = bfd_make_section (abfd, ".stub");
4648 if (s == NULL
4649 || ! bfd_set_section_flags (abfd, s, flags)
4650 || ! bfd_set_section_alignment (abfd, s, 2))
4651 return false;
4652 }
4653
4654 if (SGI_COMPAT (abfd))
4655 {
4656 for (namep = mips_elf_dynsym_rtproc_names; *namep != NULL; namep++)
4657 {
4658 h = NULL;
4659 if (! (_bfd_generic_link_add_one_symbol
4660 (info, abfd, *namep, BSF_GLOBAL, bfd_und_section_ptr,
4661 (bfd_vma) 0, (const char *) NULL, false,
4662 get_elf_backend_data (abfd)->collect,
4663 (struct bfd_link_hash_entry **) &h)))
4664 return false;
e9f03cd4 4665 h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF;
5b3b9ff6
ILT
4666 h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
4667 h->type = STT_SECTION;
4668
53787b23 4669 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
5b3b9ff6
ILT
4670 return false;
4671 }
4672
53787b23
ILT
4673 /* We need to create a .compact_rel section. */
4674 if (! mips_elf_create_compact_rel_section (abfd, info))
4675 return false;
5b3b9ff6
ILT
4676
4677 /* Change aligments of some sections. */
4678 s = bfd_get_section_by_name (abfd, ".hash");
4679 if (s != NULL)
4680 bfd_set_section_alignment (abfd, s, 4);
4681 s = bfd_get_section_by_name (abfd, ".dynsym");
4682 if (s != NULL)
4683 bfd_set_section_alignment (abfd, s, 4);
4684 s = bfd_get_section_by_name (abfd, ".dynstr");
4685 if (s != NULL)
4686 bfd_set_section_alignment (abfd, s, 4);
4687 s = bfd_get_section_by_name (abfd, ".reginfo");
4688 if (s != NULL)
4689 bfd_set_section_alignment (abfd, s, 4);
4690 s = bfd_get_section_by_name (abfd, ".dynamic");
4691 if (s != NULL)
4692 bfd_set_section_alignment (abfd, s, 4);
a16fcab3
KR
4693 }
4694
53787b23
ILT
4695 if (!info->shared)
4696 {
4697 h = NULL;
4698 if (! (_bfd_generic_link_add_one_symbol
4699 (info, abfd, "_DYNAMIC_LINK", BSF_GLOBAL, bfd_abs_section_ptr,
4700 (bfd_vma) 0, (const char *) NULL, false,
4701 get_elf_backend_data (abfd)->collect,
4702 (struct bfd_link_hash_entry **) &h)))
4703 return false;
e9f03cd4 4704 h->elf_link_hash_flags ^=~ ELF_LINK_NON_ELF;
53787b23
ILT
4705 h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
4706 h->type = STT_SECTION;
4707
4708 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
4709 return false;
4710 }
4711
5b3b9ff6
ILT
4712 return true;
4713}
4714
53787b23
ILT
4715/* Create the .compact_rel section. */
4716
4717static boolean
4718mips_elf_create_compact_rel_section (abfd, info)
4719 bfd *abfd;
4720 struct bfd_link_info *info;
4721{
4722 flagword flags;
4723 register asection *s;
4724
4725 if (bfd_get_section_by_name (abfd, ".compact_rel") == NULL)
4726 {
4727 flags = SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_READONLY;
4728
4729 s = bfd_make_section (abfd, ".compact_rel");
4730 if (s == NULL
4731 || ! bfd_set_section_flags (abfd, s, flags)
4732 || ! bfd_set_section_alignment (abfd, s, 2))
4733 return false;
4734
4735 s->_raw_size = sizeof (Elf32_External_compact_rel);
4736 }
4737
4738 return true;
4739}
4740
5b3b9ff6
ILT
4741/* Create the .got section to hold the global offset table. */
4742
4743static boolean
4744mips_elf_create_got_section (abfd, info)
4745 bfd *abfd;
4746 struct bfd_link_info *info;
4747{
4748 flagword flags;
4749 register asection *s;
4750 struct elf_link_hash_entry *h;
4751 struct mips_got_info *g;
4752
4753 /* This function may be called more than once. */
4754 if (bfd_get_section_by_name (abfd, ".got") != NULL)
4755 return true;
4756
4757 flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
4758
4759 s = bfd_make_section (abfd, ".got");
4760 if (s == NULL
4761 || ! bfd_set_section_flags (abfd, s, flags)
4762 || ! bfd_set_section_alignment (abfd, s, 4))
4763 return false;
4764
4765 /* Define the symbol _GLOBAL_OFFSET_TABLE_. We don't do this in the
4766 linker script because we don't want to define the symbol if we
53787b23 4767 are not creating a global offset table. */
5b3b9ff6
ILT
4768 h = NULL;
4769 if (! (_bfd_generic_link_add_one_symbol
4770 (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s,
4771 (bfd_vma) 0, (const char *) NULL, false,
4772 get_elf_backend_data (abfd)->collect,
4773 (struct bfd_link_hash_entry **) &h)))
4774 return false;
e9f03cd4 4775 h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF;
5b3b9ff6
ILT
4776 h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
4777 h->type = STT_OBJECT;
4778
4779 if (info->shared
4780 && ! bfd_elf32_link_record_dynamic_symbol (info, h))
4781 return false;
4782
4783 /* The first several global offset table entries are reserved. */
4784 s->_raw_size = MIPS_RESERVED_GOTNO * 4;
4785
4786 g = (struct mips_got_info *) bfd_alloc (abfd,
4787 sizeof (struct mips_got_info));
4788 if (g == NULL)
4789 return false;
4790 g->global_gotsym = 0;
4791 g->local_gotno = MIPS_RESERVED_GOTNO;
4792 if (elf_section_data (s) == NULL)
4793 {
4794 s->used_by_bfd =
4795 (PTR) bfd_zalloc (abfd, sizeof (struct bfd_elf_section_data));
4796 if (elf_section_data (s) == NULL)
4797 return false;
4798 }
4799 elf_section_data (s)->tdata = (PTR) g;
4800
4801 return true;
4802}
4803
4804/* Look through the relocs for a section during the first phase, and
4805 allocate space in the global offset table. */
4806
4807static boolean
4808mips_elf_check_relocs (abfd, info, sec, relocs)
4809 bfd *abfd;
4810 struct bfd_link_info *info;
4811 asection *sec;
4812 const Elf_Internal_Rela *relocs;
4813{
4814 bfd *dynobj;
4815 Elf_Internal_Shdr *symtab_hdr;
4816 struct elf_link_hash_entry **sym_hashes;
4817 struct mips_got_info *g;
4818 size_t extsymoff;
4819 const Elf_Internal_Rela *rel;
4820 const Elf_Internal_Rela *rel_end;
4821 asection *sgot;
4822 asection *sreloc;
5b3b9ff6
ILT
4823
4824 if (info->relocateable)
4825 return true;
4826
4827 dynobj = elf_hash_table (info)->dynobj;
4828 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4829 sym_hashes = elf_sym_hashes (abfd);
4830 extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info;
4831
4832 sgot = NULL;
4833 sreloc = NULL;
5b3b9ff6
ILT
4834
4835 rel_end = relocs + sec->reloc_count;
4836 for (rel = relocs; rel < rel_end; rel++)
4837 {
4838 unsigned long r_symndx;
4839 struct elf_link_hash_entry *h;
4840
4841 r_symndx = ELF32_R_SYM (rel->r_info);
4842
4843 if (r_symndx < extsymoff)
4844 h = NULL;
4845 else
4846 h = sym_hashes[r_symndx - extsymoff];
4847
4848 /* Some relocs require a global offset table. */
4849 if (dynobj == NULL)
4850 {
4851 switch (ELF32_R_TYPE (rel->r_info))
4852 {
4853 case R_MIPS_GOT16:
4854 case R_MIPS_CALL16:
4855 case R_MIPS_CALL_HI16:
4856 case R_MIPS_CALL_LO16:
4857 case R_MIPS_GOT_HI16:
4858 case R_MIPS_GOT_LO16:
4859 elf_hash_table (info)->dynobj = dynobj = abfd;
4860 if (! mips_elf_create_got_section (dynobj, info))
4861 return false;
4862 break;
4863
4864 default:
4865 break;
4866 }
4867 }
4868
4869 switch (ELF32_R_TYPE (rel->r_info))
4870 {
4871 case R_MIPS_CALL16:
4872 case R_MIPS_CALL_HI16:
4873 case R_MIPS_CALL_LO16:
4874 /* This symbol requires a global offset table entry. */
4875 if (sgot == NULL)
4876 {
4877 sgot = bfd_get_section_by_name (dynobj, ".got");
4878 BFD_ASSERT (sgot != NULL);
4879 BFD_ASSERT (elf_section_data (sgot) != NULL);
4880 g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
4881 BFD_ASSERT (g != NULL);
4882 }
4883
4884 BFD_ASSERT (h != NULL);
4885
4886 /* Make sure this symbol is output as a dynamic symbol. */
4887 if (h->dynindx == -1)
4888 {
4889 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
4890 return false;
4891 }
4892
4893 if (h->got_offset != (bfd_vma) -1)
4894 {
4895 /* We have already allocated space in the .got. */
4896 break;
4897 }
4898
4899 /* Note the index of the first global got symbol in .dynsym. */
4900 if (g->global_gotsym == 0
4901 || g->global_gotsym > (unsigned long) h->dynindx)
4902 g->global_gotsym = h->dynindx;
4903
4904 /* Make this symbol to have the corresponding got entry. */
4905 h->got_offset = 0;
4906
4907 /* We need a stub, not a plt entry for the undefined
4908 function. But we record it as if it needs plt. See
4909 elf_adjust_dynamic_symbol in elflink.h. */
4910 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
4911 h->type = STT_FUNC;
4912
4913 break;
4914
4915 case R_MIPS_GOT16:
4916 case R_MIPS_GOT_HI16:
4917 case R_MIPS_GOT_LO16:
4918 /* This symbol requires a global offset table entry. */
4919 if (sgot == NULL)
4920 {
4921 sgot = bfd_get_section_by_name (dynobj, ".got");
4922 BFD_ASSERT (sgot != NULL);
4923 BFD_ASSERT (elf_section_data (sgot) != NULL);
4924 g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
4925 BFD_ASSERT (g != NULL);
4926 }
4927
4928 if (h != NULL)
4929 {
4930 /* Make sure this symbol is output as a dynamic symbol. */
4931 if (h->dynindx == -1)
4932 {
4933 if (! bfd_elf32_link_record_dynamic_symbol (info, h))
4934 return false;
4935 }
4936
4937 if (h->got_offset != (bfd_vma) -1)
4938 {
4939 /* We have already allocated space in the .got. */
4940 break;
4941 }
4942 /* Note the index of the first global got symbol in
4943 .dynsym. */
4944 if (g->global_gotsym == 0
4945 || g->global_gotsym > (unsigned long) h->dynindx)
4946 g->global_gotsym = h->dynindx;
4947
4948 /* Make this symbol to be the global got symbol. */
4949 h->got_offset = 0;
4950 }
4951
4952 break;
4953
4954 case R_MIPS_32:
4955 case R_MIPS_REL32:
abec70b9 4956 if ((info->shared || h != NULL)
5b3b9ff6
ILT
4957 && (sec->flags & SEC_ALLOC) != 0)
4958 {
4959 /* When creating a shared object, we must copy these
4960 reloc types into the output file as R_MIPS_REL32
4961 relocs. We create the .rel.dyn reloc section in
4962 dynobj and make room for this reloc. */
4963 if (sreloc == NULL)
4964 {
4965 const char *name = ".rel.dyn";
4966
4967 sreloc = bfd_get_section_by_name (dynobj, name);
4968 if (sreloc == NULL)
4969 {
4970 sreloc = bfd_make_section (dynobj, name);
4971 if (sreloc == NULL
4972 || ! bfd_set_section_flags (dynobj, sreloc,
4973 (SEC_ALLOC
4974 | SEC_LOAD
4975 | SEC_HAS_CONTENTS
4976 | SEC_IN_MEMORY
4977 | SEC_READONLY))
4978 || ! bfd_set_section_alignment (dynobj, sreloc, 4))
4979 return false;
4980
4981 /* Add a null element. */
4982 sreloc->_raw_size += sizeof (Elf32_External_Rel);
4983 ++sreloc->reloc_count;
4984 }
4985 }
4986
abec70b9
ILT
4987 if (info->shared)
4988 sreloc->_raw_size += sizeof (Elf32_External_Rel);
4989 else
4990 {
4991 struct mips_elf_link_hash_entry *hmips;
4992
4993 /* We only need to copy this reloc if the symbol is
4994 defined in a dynamic object. */
4995 hmips = (struct mips_elf_link_hash_entry *) h;
4996 ++hmips->mips_32_relocs;
4997 }
5b3b9ff6
ILT
4998 }
4999
53787b23
ILT
5000 if (SGI_COMPAT (abfd))
5001 mips_elf_hash_table (info)->compact_rel_size +=
5002 sizeof (Elf32_External_crinfo);
5003
5b3b9ff6
ILT
5004 break;
5005
5006 case R_MIPS_26:
5007 case R_MIPS_GPREL16:
5008 case R_MIPS_LITERAL:
5009 case R_MIPS_GPREL32:
53787b23
ILT
5010 if (SGI_COMPAT (abfd))
5011 mips_elf_hash_table (info)->compact_rel_size +=
5012 sizeof (Elf32_External_crinfo);
5b3b9ff6
ILT
5013 break;
5014
5015 default:
5016 break;
5017 }
5018 }
5019
5020 return true;
5021}
5022
5023/* Adjust a symbol defined by a dynamic object and referenced by a
5024 regular object. The current definition is in some section of the
5025 dynamic object, but we're not including those sections. We have to
5026 change the definition to something the rest of the link can
5027 understand. */
5028
5029static boolean
5030mips_elf_adjust_dynamic_symbol (info, h)
5031 struct bfd_link_info *info;
5032 struct elf_link_hash_entry *h;
5033{
5034 bfd *dynobj;
abec70b9 5035 struct mips_elf_link_hash_entry *hmips;
5b3b9ff6
ILT
5036 asection *s;
5037
5038 dynobj = elf_hash_table (info)->dynobj;
5039
5040 /* Make sure we know what is going on here. */
5041 BFD_ASSERT (dynobj != NULL
5042 && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
5043 || h->weakdef != NULL
5044 || ((h->elf_link_hash_flags
5045 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
5046 && (h->elf_link_hash_flags
5047 & ELF_LINK_HASH_REF_REGULAR) != 0
5048 && (h->elf_link_hash_flags
5049 & ELF_LINK_HASH_DEF_REGULAR) == 0)));
5050
abec70b9
ILT
5051 /* If this symbol is defined in a dynamic object, we need to copy
5052 any R_MIPS_32 or R_MIPS_REL32 relocs against it into the output
5053 file. */
5054 hmips = (struct mips_elf_link_hash_entry *) h;
5055 if (! info->relocateable
5056 && hmips->mips_32_relocs != 0
5057 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
5058 {
5059 s = bfd_get_section_by_name (dynobj, ".rel.dyn");
5060 BFD_ASSERT (s != NULL);
5061
5062 s->_raw_size += hmips->mips_32_relocs * sizeof (Elf32_External_Rel);
5063 }
5064
5b3b9ff6
ILT
5065 /* For a function, create a stub, if needed. */
5066 if (h->type == STT_FUNC
5067 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
5068 {
5069 if (! elf_hash_table (info)->dynamic_sections_created)
5070 return true;
5071
5072 /* If this symbol is not defined in a regular file, then set
5073 the symbol to the stub location. This is required to make
5074 function pointers compare as equal between the normal
5075 executable and the shared library. */
5076 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
5077 {
5078 /* We need .stub section. */
5079 s = bfd_get_section_by_name (dynobj, ".stub");
5080 BFD_ASSERT (s != NULL);
5081
5082 h->root.u.def.section = s;
5083 h->root.u.def.value = s->_raw_size;
5084
5085 /* XXX Write this stub address somewhere. */
5086 h->plt_offset = s->_raw_size;
5087
5088 /* Make room for this stub code. */
5089 s->_raw_size += MIPS_FUNCTION_STUB_SIZE;
5090
5091 /* The last half word of the stub will be filled with the index
5092 of this symbol in .dynsym section. */
5093 return true;
5094 }
5095 }
5096
5097 /* If this is a weak symbol, and there is a real definition, the
5098 processor independent code will have arranged for us to see the
5099 real definition first, and we can just use the same value. */
5100 if (h->weakdef != NULL)
5101 {
5102 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
5103 || h->weakdef->root.type == bfd_link_hash_defweak);
5104 h->root.u.def.section = h->weakdef->root.u.def.section;
5105 h->root.u.def.value = h->weakdef->root.u.def.value;
5106 return true;
5107 }
5108
5109 /* This is a reference to a symbol defined by a dynamic object which
5110 is not a function. */
5111
5112 return true;
5113}
5114
5115/* Set the sizes of the dynamic sections. */
5116
5117static boolean
5118mips_elf_size_dynamic_sections (output_bfd, info)
5119 bfd *output_bfd;
5120 struct bfd_link_info *info;
5121{
5122 bfd *dynobj;
5123 asection *s;
5124 boolean reltext;
5125 asection *sgot;
5126 struct mips_got_info *g;
5127
5128 dynobj = elf_hash_table (info)->dynobj;
5129 BFD_ASSERT (dynobj != NULL);
5130
5131 if (elf_hash_table (info)->dynamic_sections_created)
5132 {
5133 /* Set the contents of the .interp section to the interpreter. */
5134 if (! info->shared)
5135 {
5136 s = bfd_get_section_by_name (dynobj, ".interp");
5137 BFD_ASSERT (s != NULL);
5138 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
5139 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
5140 }
5141 }
5142
5143 /* Recompute the size of .got for local entires (reserved and
5144 hipages) if needed. To estimate it, get the upper bound of total
5145 size of loadable sections. */
5146 sgot = bfd_get_section_by_name (dynobj, ".got");
5147
5148 if (sgot != NULL)
5149 {
5150 bfd_size_type loadable_size = 0;
5151 bfd_size_type local_gotno;
5152 struct _bfd *sub;
5153
5154 BFD_ASSERT (elf_section_data (sgot) != NULL);
5155 g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
5156 BFD_ASSERT (g != NULL);
5157
5158 for (sub = info->input_bfds; sub; sub = sub->link_next)
5159 for (s = sub->sections; s != NULL; s = s->next)
5160 {
5161 if ((s->flags & SEC_ALLOC) == 0)
5162 continue;
5163 loadable_size += (s->_raw_size + 0xf) & ~0xf;
5164 }
5165
5166 loadable_size += MIPS_FUNCTION_STUB_SIZE;
5167
5168 /* Assume there are two loadable segments consisting of
5169 contiguous sections. Is 5 enough? */
5170 local_gotno = (loadable_size >> 16) + 5 + MIPS_RESERVED_GOTNO;
5171 g->local_gotno = local_gotno;
5172 sgot->_raw_size += local_gotno * 4;
5173 }
5174
5175 /* The check_relocs and adjust_dynamic_symbol entry points have
5176 determined the sizes of the various dynamic sections. Allocate
5177 memory for them. */
5178 reltext = false;
5179 for (s = dynobj->sections; s != NULL; s = s->next)
5180 {
5181 const char *name;
5182 boolean strip;
5183
5184 /* It's OK to base decisions on the section name, because none
5185 of the dynobj section names depend upon the input files. */
5186 name = bfd_get_section_name (dynobj, s);
5187
5188 if ((s->flags & SEC_IN_MEMORY) == 0)
5189 continue;
5190
5191 strip = false;
5192
5193 if (strncmp (name, ".rel", 4) == 0)
5194 {
5195 if (s->_raw_size == 0)
5196 strip = true;
5197 else
5198 {
5199 asection *target;
5200
5201 /* If this relocation section applies to a read only
5202 section, then we probably need a DT_TEXTREL entry.
5203 If the relocation section is .rel.dyn, we always
5204 assert a DT_TEXTREL entry rather than testing whether
5205 there exists a relocation to a read only section or
5206 not. */
5207 target = bfd_get_section_by_name (output_bfd, name + 4);
5208 if ((target != NULL && (target->flags & SEC_READONLY) != 0)
5209 || strcmp (name, ".rel.dyn") == 0)
5210 reltext = true;
5211
5212 /* We use the reloc_count field as a counter if we need
5213 to copy relocs into the output file. */
5214 if (strcmp (name, ".rel.dyn") != 0)
5215 s->reloc_count = 0;
5216 }
5217 }
5218 else if (strncmp (name, ".got", 4) == 0)
5219 {
5220 int i;
5221
5222 BFD_ASSERT (elf_section_data (s) != NULL);
5223 g = (struct mips_got_info *) elf_section_data (s)->tdata;
5224 BFD_ASSERT (g != NULL);
5225
5226 /* Fix the size of .got section for the correspondence of
5227 global symbols and got entries. This adds some useless
5228 got entries. Is this required by ABI really? */
5229 i = elf_hash_table (info)->dynsymcount - g->global_gotsym;
5230 s->_raw_size += i * 4;
5231 }
5232 else if (strncmp (name, ".stub", 5) == 0)
5233 {
5234 /* Irix rld assumes that the function stub isn't at the end
5235 of .text section. So put a dummy. XXX */
5236 s->_raw_size += MIPS_FUNCTION_STUB_SIZE;
5237 }
53787b23
ILT
5238 else if (SGI_COMPAT (output_bfd)
5239 && strncmp (name, ".compact_rel", 12) == 0)
5240 s->_raw_size += mips_elf_hash_table (info)->compact_rel_size;
5241 else if (strncmp (name, ".init", 5) != 0)
5b3b9ff6
ILT
5242 {
5243 /* It's not one of our sections, so don't allocate space. */
5244 continue;
5245 }
5246
5247 if (strip)
5248 {
5249 asection **spp;
5250
5251 for (spp = &s->output_section->owner->sections;
5252 *spp != s->output_section;
5253 spp = &(*spp)->next)
5254 ;
5255 *spp = s->output_section->next;
5256 --s->output_section->owner->section_count;
5257
5258 continue;
5259 }
5260
5261 /* Allocate memory for the section contents. */
5262 s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size);
5263 if (s->contents == NULL && s->_raw_size != 0)
5264 {
5265 bfd_set_error (bfd_error_no_memory);
5266 return false;
5267 }
5268 memset (s->contents, 0, s->_raw_size);
5269 }
5270
5271 if (elf_hash_table (info)->dynamic_sections_created)
5272 {
5273 /* Add some entries to the .dynamic section. We fill in the
5274 values later, in elf_mips_finish_dynamic_sections, but we
5275 must add the entries now so that we get the correct size for
5276 the .dynamic section. The DT_DEBUG entry is filled in by the
5277 dynamic linker and used by the debugger. */
5278 if (! info->shared)
5279 {
5280 if (! bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0))
5281 return false;
5282 }
5283
5284 if (reltext)
5285 {
5286 if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0))
5287 return false;
5288 }
5289
5290 if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0))
5291 return false;
5292
5293 if (bfd_get_section_by_name (dynobj, ".rel.dyn"))
5294 {
5295 if (! bfd_elf32_add_dynamic_entry (info, DT_REL, 0))
5296 return false;
5297
5298 if (! bfd_elf32_add_dynamic_entry (info, DT_RELSZ, 0))
5299 return false;
5300
5301 if (! bfd_elf32_add_dynamic_entry (info, DT_RELENT, 0))
5302 return false;
5303 }
5304
5305 if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_CONFLICTNO, 0))
5306 return false;
5307
5308 if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_LIBLISTNO, 0))
5309 return false;
5310
53787b23 5311 if (bfd_get_section_by_name (dynobj, ".conflict") != NULL)
5b3b9ff6
ILT
5312 {
5313 if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_CONFLICT, 0))
5314 return false;
5315
5316 s = bfd_get_section_by_name (dynobj, ".liblist");
5317 BFD_ASSERT (s != NULL);
5318
5319 if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_LIBLIST, 0))
5320 return false;
5321 }
5322
5323 if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_RLD_VERSION, 0))
5324 return false;
5325
5326 if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_FLAGS, 0))
5327 return false;
5328
53787b23
ILT
5329#if 0
5330 /* Time stamps in executable files are a bad idea. */
5b3b9ff6
ILT
5331 if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_TIME_STAMP, 0))
5332 return false;
53787b23 5333#endif
5b3b9ff6
ILT
5334
5335#if 0 /* FIXME */
5336 if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_ICHECKSUM, 0))
5337 return false;
5338#endif
5339
5340#if 0 /* FIXME */
5341 if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_IVERSION, 0))
5342 return false;
5343#endif
5344
5345 if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_BASE_ADDRESS, 0))
5346 return false;
5347
5348 if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_LOCAL_GOTNO, 0))
5349 return false;
5350
5351 if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_SYMTABNO, 0))
5352 return false;
5353
5354 if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_UNREFEXTNO, 0))
5355 return false;
5356
5357 if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_GOTSYM, 0))
5358 return false;
5359
5360 if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_HIPAGENO, 0))
5361 return false;
5362
5363#if 0 /* (SGI_COMPAT) */
5364 if (! bfd_get_section_by_name (dynobj, ".init"))
5365 if (! bfd_elf32_add_dynamic_entry (info, DT_INIT, 0))
5366 return false;
5367
5368 if (! bfd_get_section_by_name (dynobj, ".fini"))
5369 if (! bfd_elf32_add_dynamic_entry (info, DT_FINI, 0))
5370 return false;
5371#endif
5372 }
5373
53787b23
ILT
5374 /* If we use dynamic linking, we generate a section symbol for each
5375 output section. These are local symbols, which means that they
5376 must come first in the dynamic symbol table.
5b3b9ff6
ILT
5377 That means we must increment the dynamic symbol index of every
5378 other dynamic symbol. */
53787b23
ILT
5379 {
5380 const char * const *namep;
5381 unsigned int c, i;
5382 bfd_size_type strindex;
5383 struct bfd_strtab_hash *dynstr;
5384 struct mips_got_info *g;
5385
5386 if (elf_hash_table (info)->dynamic_sections_created)
5387 {
5388 if (SGI_COMPAT (output_bfd))
5389 {
5390 c = SIZEOF_MIPS_DYNSYM_SECNAMES - 1;
5391 elf_link_hash_traverse (elf_hash_table (info),
5392 mips_elf_adjust_dynindx,
5393 (PTR) &c);
5394 elf_hash_table (info)->dynsymcount += c;
5395
5396 dynstr = elf_hash_table (info)->dynstr;
5397 BFD_ASSERT (dynstr != NULL);
5398
5399 for (i = 1, namep = mips_elf_dynsym_sec_names;
5400 *namep != NULL;
5401 i++, namep++)
5402 {
5403 s = bfd_get_section_by_name (output_bfd, *namep);
5404 if (s != NULL)
5405 elf_section_data (s)->dynindx = i;
5b3b9ff6 5406
53787b23
ILT
5407 strindex = _bfd_stringtab_add (dynstr, *namep, true, false);
5408 if (strindex == (bfd_size_type) -1)
5409 return false;
5b3b9ff6 5410
53787b23
ILT
5411 mips_elf_hash_table (info)->dynsym_sec_strindex[i] = strindex;
5412 }
5413 }
5414 else
5415 {
5416 c = bfd_count_sections (output_bfd);
5417 elf_link_hash_traverse (elf_hash_table (info),
5418 mips_elf_adjust_dynindx,
5419 (PTR) &c);
5420 elf_hash_table (info)->dynsymcount += c;
5b3b9ff6 5421
53787b23
ILT
5422 for (i = 1, s = output_bfd->sections; s != NULL; s = s->next, i++)
5423 {
5424 elf_section_data (s)->dynindx = i;
5425 /* These symbols will have no names, so we don't need to
5426 fiddle with dynstr_index. */
5427 }
5428 }
5429 }
5b3b9ff6 5430
53787b23
ILT
5431 s = bfd_get_section_by_name (dynobj, ".got");
5432 BFD_ASSERT (s != NULL);
5433 BFD_ASSERT (elf_section_data (s) != NULL);
5434 g = (struct mips_got_info *) elf_section_data (s)->tdata;
5435 BFD_ASSERT (g != NULL);
5b3b9ff6 5436
53787b23
ILT
5437 /* If there are no global got symbols, fake the last symbol so for
5438 safety. */
5439 if (g->global_gotsym)
5440 g->global_gotsym += c;
5441 else
5442 g->global_gotsym = elf_hash_table (info)->dynsymcount - 1;
5443 }
5b3b9ff6
ILT
5444
5445 return true;
5446}
5447
5448/* Increment the index of a dynamic symbol by a given amount. Called
5449 via elf_link_hash_traverse. */
5450
5451static boolean
5452mips_elf_adjust_dynindx (h, cparg)
5453 struct elf_link_hash_entry *h;
5454 PTR cparg;
5455{
53787b23 5456 unsigned int *cp = (unsigned int *) cparg;
5b3b9ff6
ILT
5457
5458 if (h->dynindx != -1)
5459 h->dynindx += *cp;
5460 return true;
5461}
5462
5463/* Finish up dynamic symbol handling. We set the contents of various
5464 dynamic sections here. */
5465
5466static boolean
5467mips_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
5468 bfd *output_bfd;
5469 struct bfd_link_info *info;
5470 struct elf_link_hash_entry *h;
5471 Elf_Internal_Sym *sym;
5472{
5473 bfd *dynobj;
5474 bfd_vma gval;
5475 asection *sgot;
5476 struct mips_got_info *g;
5477 const char *name;
5478
5479 dynobj = elf_hash_table (info)->dynobj;
5480 gval = sym->st_value;
5481
5482 if (h->plt_offset != (bfd_vma) -1)
5483 {
5484 asection *s;
5485 bfd_byte *p;
5486 bfd_byte stub[MIPS_FUNCTION_STUB_SIZE];
5487
5488 /* This symbol has a stub. Set it up. */
5489
5490 BFD_ASSERT (h->dynindx != -1);
5491
5492 s = bfd_get_section_by_name (dynobj, ".stub");
5493 BFD_ASSERT (s != NULL);
5494
5495 /* Fill the stub. */
5496 p = stub;
5497 bfd_put_32 (output_bfd, STUB_LW(output_bfd), p);
5498 p += 4;
5499 bfd_put_32 (output_bfd, STUB_MOVE, p);
5500 p += 4;
5501
5502 /* FIXME: Can h->dynindex be more than 64K? */
5503 if (h->dynindx & 0xffff0000)
5504 return false;
5505
5506 bfd_put_32 (output_bfd, STUB_JALR, p);
5507 p += 4;
5508 bfd_put_32 (output_bfd, STUB_LI16 + h->dynindx, p);
5509
5510 BFD_ASSERT (h->plt_offset <= s->_raw_size);
5511 memcpy (s->contents + h->plt_offset, stub, MIPS_FUNCTION_STUB_SIZE);
5512
5513 /* Mark the symbol as undefined. plt_offset != -1 occurs
5514 only for the referenced symbol. */
5515 sym->st_shndx = SHN_UNDEF;
5516
5517 /* The run-time linker uses the st_value field of the symbol
5518 to reset the global offset table entry for this external
5519 to its stub address when unlinking a shared object. */
5520 gval = s->output_section->vma + s->output_offset + h->plt_offset;
5521 sym->st_value = gval;
5522 }
5523
5524 BFD_ASSERT (h->dynindx != -1);
5525
5526 sgot = bfd_get_section_by_name (dynobj, ".got");
5527 BFD_ASSERT (sgot != NULL);
5528 BFD_ASSERT (elf_section_data (sgot) != NULL);
5529 g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
5530 BFD_ASSERT (g != NULL);
5531
5532 if ((unsigned long) h->dynindx >= g->global_gotsym)
5533 {
5534 bfd_size_type offset;
5535
5536 /* This symbol has an entry in the global offset table. Set its
5537 value to the corresponding got entry, if needed. */
5538 if (h->got_offset == (bfd_vma) -1)
5539 {
5540 offset = (h->dynindx - g->global_gotsym + g->local_gotno) * 4;
5541 BFD_ASSERT (g->local_gotno * 4 <= offset
5542 && offset < sgot->_raw_size);
5543 bfd_put_32 (output_bfd, gval, sgot->contents + offset);
5544 }
5545 }
5546
5547 /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
5548 name = h->root.root.string;
5549 if (strcmp (name, "_DYNAMIC") == 0
5550 || strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
5551 sym->st_shndx = SHN_ABS;
53787b23
ILT
5552 else if (strcmp (name, "_DYNAMIC_LINK") == 0)
5553 {
5554 sym->st_shndx = SHN_ABS;
5555 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
5556 sym->st_value = 1;
5557 }
5558 else if (SGI_COMPAT (output_bfd))
5b3b9ff6
ILT
5559 {
5560 if (strcmp (name, "_gp_disp") == 0)
5561 {
5562 sym->st_shndx = SHN_ABS;
5563 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
abec70b9 5564 sym->st_value = elf_gp (output_bfd);
5b3b9ff6
ILT
5565 }
5566 else if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0
5567 || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0)
5568 {
5569 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
5570 sym->st_other = STO_PROTECTED;
5571 sym->st_value = 0;
5572 sym->st_shndx = SHN_MIPS_DATA;
5573 }
5574 else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0)
5575 {
5576 sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION);
5577 sym->st_other = STO_PROTECTED;
5578 sym->st_value = mips_elf_hash_table (info)->procedure_count;
5579 sym->st_shndx = SHN_ABS;
5580 }
53787b23 5581 else if (sym->st_shndx != SHN_UNDEF)
5b3b9ff6
ILT
5582 {
5583 if (h->type == STT_FUNC)
5584 sym->st_shndx = SHN_MIPS_TEXT;
5585 else if (h->type == STT_OBJECT)
5586 sym->st_shndx = SHN_MIPS_DATA;
5587 }
5588 }
5589
5590 return true;
5591}
5592
5593/* Finish up the dynamic sections. */
5594
5595static boolean
5596mips_elf_finish_dynamic_sections (output_bfd, info)
5597 bfd *output_bfd;
5598 struct bfd_link_info *info;
5599{
5600 bfd *dynobj;
5601 asection *sdyn;
5602 asection *sgot;
5603 struct mips_got_info *g;
5604
5605 dynobj = elf_hash_table (info)->dynobj;
5606
5607 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
5608
5609 sgot = bfd_get_section_by_name (dynobj, ".got");
5610 BFD_ASSERT (sgot != NULL);
5611
5612 BFD_ASSERT (elf_section_data (sgot) != NULL);
5613 g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
5614 BFD_ASSERT (g != NULL);
5615
5616 if (elf_hash_table (info)->dynamic_sections_created)
5617 {
5618 Elf32_External_Dyn *dyncon, *dynconend;
5619
5620 BFD_ASSERT (sdyn != NULL);
5621
5622 dyncon = (Elf32_External_Dyn *) sdyn->contents;
5623 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
5624 for (; dyncon < dynconend; dyncon++)
5625 {
5626 Elf_Internal_Dyn dyn;
5627 const char *name;
5628 size_t elemsize;
5629 asection *s;
5630
5631 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
5632
5633 switch (dyn.d_tag)
5634 {
5635 default:
5636 break;
5637
5638 case DT_RELENT:
5639 s = bfd_get_section_by_name (dynobj, ".rel.dyn");
5640 BFD_ASSERT (s != NULL);
5641 dyn.d_un.d_val = sizeof (Elf32_External_Rel);
5642 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5643 break;
5644
5645 case DT_STRSZ:
5646 /* Rewrite DT_STRSZ. */
5647 dyn.d_un.d_val =
5648 _bfd_stringtab_size (elf_hash_table (info)->dynstr);
5649 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5650 break;
5651
5652 case DT_PLTGOT:
5653 name = ".got";
5654 goto get_vma;
5655 case DT_MIPS_CONFLICT:
5656 name = ".conflict";
5657 goto get_vma;
5658 case DT_MIPS_LIBLIST:
5659 name = ".liblist";
5660 get_vma:
5661 s = bfd_get_section_by_name (output_bfd, name);
5662 BFD_ASSERT (s != NULL);
5663 dyn.d_un.d_ptr = s->vma;
5664 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5665 break;
5666
5667 case DT_MIPS_RLD_VERSION:
5668 dyn.d_un.d_val = 1; /* XXX */
5669 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5670 break;
5671
5672 case DT_MIPS_FLAGS:
5673 dyn.d_un.d_val = RHF_NOTPOT; /* XXX */
5674 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5675 break;
5676
5677 case DT_MIPS_CONFLICTNO:
5678 name = ".conflict";
5679 elemsize = sizeof (Elf32_Conflict);
5680 goto set_elemno;
5681
5682 case DT_MIPS_LIBLISTNO:
5683 name = ".liblist";
5684 elemsize = sizeof (Elf32_Lib);
5685 set_elemno:
5686 s = bfd_get_section_by_name (output_bfd, name);
5687 if (s != NULL)
5688 {
5689 if (s->_cooked_size != 0)
5690 dyn.d_un.d_val = s->_cooked_size / elemsize;
5691 else
5692 dyn.d_un.d_val = s->_raw_size / elemsize;
5693 }
5694 else
5695 dyn.d_un.d_val = 0;
5696
5697 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5698 break;
5699
5700 case DT_MIPS_TIME_STAMP:
5701 time ((time_t *) &dyn.d_un.d_val);
5702 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5703 break;
5704
5705 case DT_MIPS_ICHECKSUM:
5706 /* XXX FIXME: */
5707 break;
5708
5709 case DT_MIPS_IVERSION:
5710 /* XXX FIXME: */
5711 break;
5712
5713 case DT_MIPS_BASE_ADDRESS:
5714 s = output_bfd->sections;
5715 BFD_ASSERT (s != NULL);
5716 dyn.d_un.d_ptr = s->vma & ~(0xffff);
5717 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5718 break;
5719
5720 case DT_MIPS_LOCAL_GOTNO:
5721 dyn.d_un.d_val = g->local_gotno;
5722 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5723 break;
5724
5725 case DT_MIPS_SYMTABNO:
5726 name = ".dynsym";
5727 elemsize = sizeof (Elf32_External_Sym);
5728 s = bfd_get_section_by_name (output_bfd, name);
5729 BFD_ASSERT (s != NULL);
5730
5731 if (s->_cooked_size != 0)
5732 dyn.d_un.d_val = s->_cooked_size / elemsize;
5733 else
5734 dyn.d_un.d_val = s->_raw_size / elemsize;
5735 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5736 break;
5737
5738 case DT_MIPS_UNREFEXTNO:
5739 /* XXX FIXME: */
5740 dyn.d_un.d_val = SIZEOF_MIPS_DYNSYM_SECNAMES;
5741 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5742 break;
5743
5744 case DT_MIPS_GOTSYM:
5745 dyn.d_un.d_val = g->global_gotsym;
5746 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5747 break;
5748
5749 case DT_MIPS_HIPAGENO:
5750 dyn.d_un.d_val = g->local_gotno - MIPS_RESERVED_GOTNO;
5751 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
5752 break;
5753
5754 }
5755 }
5756 }
5757
5758 /* The first entry of the global offset table will be filled at
5759 runtime. The second entry will be used by some runtime loaders.
5760 This isn't the case of Irix rld. */
5761 if (sgot->_raw_size > 0)
5762 {
5763 bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
5764 bfd_put_32 (output_bfd, (bfd_vma) 0x80000000, sgot->contents + 4);
5765 }
5766
5767 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
5768
53787b23
ILT
5769 {
5770 asection *sdynsym;
5771 asection *s;
5772 unsigned int i;
5773 bfd_vma last;
5774 Elf_Internal_Sym sym;
5775 long dindx;
5776 const char *name;
5777 const char * const * namep = mips_elf_dynsym_sec_names;
5778 Elf32_compact_rel cpt;
5779
5780 /* Set up the section symbols for the output sections. SGI sets
5781 the STT_NOTYPE attribute for these symbols. Should we do so? */
5782
5783 sdynsym = bfd_get_section_by_name (dynobj, ".dynsym");
5784 if (sdynsym != NULL)
5785 {
5786 if (SGI_COMPAT (output_bfd))
5787 {
5788 sym.st_size = 0;
5789 sym.st_name = 0;
5790 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE);
5791 sym.st_other = 0;
5b3b9ff6 5792
53787b23
ILT
5793 i = 0;
5794 while ((name = *namep++) != NULL)
5795 {
5796 s = bfd_get_section_by_name (output_bfd, name);
5797 if (s != NULL)
5798 {
5799 sym.st_value = s->vma;
5800 dindx = elf_section_data (s)->dynindx;
5801 last = s->vma + s->_raw_size;
5802 }
5803 else
5804 {
5805 sym.st_value = last;
5806 dindx++;
5807 }
5b3b9ff6 5808
53787b23
ILT
5809 sym.st_shndx = (i < MIPS_TEXT_DYNSYM_SECNO
5810 ? SHN_MIPS_TEXT
5811 : SHN_MIPS_DATA);
5812 ++i;
5813 sym.st_name =
5814 mips_elf_hash_table (info)->dynsym_sec_strindex[dindx];
5815
5816 bfd_elf32_swap_symbol_out (output_bfd, &sym,
5817 (((Elf32_External_Sym *)
5818 sdynsym->contents)
5819 + dindx));
5820 }
5b3b9ff6 5821
53787b23
ILT
5822 /* Set the sh_info field of the output .dynsym section to
5823 the index of the first global symbol. */
5824 elf_section_data (sdynsym->output_section)->this_hdr.sh_info =
5825 SIZEOF_MIPS_DYNSYM_SECNAMES;
5826 }
5827 else
5828 {
5829 sym.st_size = 0;
5830 sym.st_name = 0;
5831 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION);
5832 sym.st_other = 0;
5b3b9ff6 5833
53787b23
ILT
5834 for (s = output_bfd->sections; s != NULL; s = s->next)
5835 {
5836 int indx;
5b3b9ff6 5837
53787b23 5838 sym.st_value = s->vma;
5b3b9ff6 5839
53787b23
ILT
5840 indx = elf_section_data (s)->this_idx;
5841 BFD_ASSERT (indx > 0);
5842 sym.st_shndx = indx;
5b3b9ff6 5843
53787b23
ILT
5844 bfd_elf32_swap_symbol_out (output_bfd, &sym,
5845 (((Elf32_External_Sym *)
5846 sdynsym->contents)
5847 + elf_section_data (s)->dynindx));
5848 }
5b3b9ff6 5849
53787b23
ILT
5850 /* Set the sh_info field of the output .dynsym section to
5851 the index of the first global symbol. */
5852 elf_section_data (sdynsym->output_section)->this_hdr.sh_info =
5853 bfd_count_sections (output_bfd) + 1;
5854 }
5855 }
5b3b9ff6 5856
53787b23
ILT
5857 if (SGI_COMPAT (output_bfd))
5858 {
5859 /* Write .compact_rel section out. */
5860 s = bfd_get_section_by_name (dynobj, ".compact_rel");
5861 if (s != NULL)
5862 {
5863 cpt.id1 = 1;
5864 cpt.num = s->reloc_count;
5865 cpt.id2 = 2;
5866 cpt.offset = (s->output_section->filepos
5867 + sizeof (Elf32_External_compact_rel));
5868 cpt.reserved0 = 0;
5869 cpt.reserved1 = 0;
5870 bfd_elf32_swap_compact_rel_out (output_bfd, &cpt,
5871 ((Elf32_External_compact_rel *)
5872 s->contents));
5873
5874 /* Clean up a dummy stub function entry in .text. */
5875 s = bfd_get_section_by_name (dynobj, ".stub");
5876 if (s != NULL)
5877 {
5878 file_ptr dummy_offset;
5b3b9ff6 5879
53787b23
ILT
5880 BFD_ASSERT (s->_raw_size >= MIPS_FUNCTION_STUB_SIZE);
5881 dummy_offset = s->_raw_size - MIPS_FUNCTION_STUB_SIZE;
5882 memset (s->contents + dummy_offset, 0,
5883 MIPS_FUNCTION_STUB_SIZE);
5884 }
5885 }
5886 }
5b3b9ff6 5887
53787b23
ILT
5888 /* Clean up a first relocation in .rel.dyn. */
5889 s = bfd_get_section_by_name (dynobj, ".rel.dyn");
5890 if (s != NULL)
5891 memset (s->contents, 0, sizeof (Elf32_External_Rel));
5892 }
5b3b9ff6
ILT
5893
5894 return true;
5895}
5896\f
5897/* This is almost identical to bfd_generic_get_... except that some
5898 MIPS relocations need to be handled specially. Sigh. */
5899
5900static bfd_byte *
5901elf32_mips_get_relocated_section_contents (abfd, link_info, link_order, data,
5902 relocateable, symbols)
5903 bfd *abfd;
5904 struct bfd_link_info *link_info;
5905 struct bfd_link_order *link_order;
5906 bfd_byte *data;
5907 boolean relocateable;
5908 asymbol **symbols;
5909{
5910 /* Get enough memory to hold the stuff */
5911 bfd *input_bfd = link_order->u.indirect.section->owner;
5912 asection *input_section = link_order->u.indirect.section;
5913
5914 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
5915 arelent **reloc_vector = NULL;
5916 long reloc_count;
5917
5918 if (reloc_size < 0)
5919 goto error_return;
5920
5921 reloc_vector = (arelent **) bfd_malloc (reloc_size);
5922 if (reloc_vector == NULL && reloc_size != 0)
5923 goto error_return;
5924
a16fcab3
KR
5925 /* read in the section */
5926 if (!bfd_get_section_contents (input_bfd,
5927 input_section,
5928 (PTR) data,
5929 0,
5930 input_section->_raw_size))
5931 goto error_return;
5932
5933 /* We're not relaxing the section, so just copy the size info */
5934 input_section->_cooked_size = input_section->_raw_size;
5935 input_section->reloc_done = true;
5936
5937 reloc_count = bfd_canonicalize_reloc (input_bfd,
5938 input_section,
5939 reloc_vector,
5940 symbols);
5941 if (reloc_count < 0)
5942 goto error_return;
5943
5944 if (reloc_count > 0)
5945 {
5946 arelent **parent;
5947 /* for mips */
5948 int gp_found;
ede4eed4 5949 bfd_vma gp = 0x12345678; /* initialize just to shut gcc up */
a16fcab3
KR
5950
5951 {
5952 struct bfd_hash_entry *h;
5953 struct bfd_link_hash_entry *lh;
5954 /* Skip all this stuff if we aren't mixing formats. */
5955 if (abfd && input_bfd
5956 && abfd->xvec == input_bfd->xvec)
5957 lh = 0;
5958 else
5959 {
a2546fce 5960 h = bfd_hash_lookup (&link_info->hash->table, "_gp", false, false);
a16fcab3
KR
5961 lh = (struct bfd_link_hash_entry *) h;
5962 }
5963 lookup:
5964 if (lh)
5965 {
5966 switch (lh->type)
5967 {
5968 case bfd_link_hash_undefined:
5969 case bfd_link_hash_undefweak:
5970 case bfd_link_hash_common:
5971 gp_found = 0;
5972 break;
5973 case bfd_link_hash_defined:
5974 case bfd_link_hash_defweak:
5975 gp_found = 1;
5976 gp = lh->u.def.value;
5977 break;
5978 case bfd_link_hash_indirect:
5979 case bfd_link_hash_warning:
5980 lh = lh->u.i.link;
5981 /* @@FIXME ignoring warning for now */
5982 goto lookup;
5983 case bfd_link_hash_new:
5984 default:
5985 abort ();
5986 }
5987 }
5988 else
5989 gp_found = 0;
5990 }
5991 /* end mips */
5992 for (parent = reloc_vector; *parent != (arelent *) NULL;
5993 parent++)
5994 {
5995 char *error_message = (char *) NULL;
5996 bfd_reloc_status_type r;
5997
5998 /* Specific to MIPS: Deal with relocation types that require
5999 knowing the gp of the output bfd. */
6000 asymbol *sym = *(*parent)->sym_ptr_ptr;
6001 if (bfd_is_abs_section (sym->section) && abfd)
6002 {
6003 /* The special_function wouldn't get called anyways. */
6004 }
6005 else if (!gp_found)
6006 {
6007 /* The gp isn't there; let the special function code
6008 fall over on its own. */
6009 }
5b3b9ff6 6010 else if ((*parent)->howto->special_function
bc05732b 6011 == _bfd_mips_elf_gprel16_reloc)
a16fcab3
KR
6012 {
6013 /* bypass special_function call */
6014 r = gprel16_with_gp (input_bfd, sym, *parent, input_section,
6015 relocateable, (PTR) data, gp);
6016 goto skip_bfd_perform_relocation;
6017 }
6018 /* end mips specific stuff */
6019
6020 r = bfd_perform_relocation (input_bfd,
6021 *parent,
6022 (PTR) data,
6023 input_section,
6024 relocateable ? abfd : (bfd *) NULL,
6025 &error_message);
6026 skip_bfd_perform_relocation:
6027
6028 if (relocateable)
6029 {
6030 asection *os = input_section->output_section;
6031
6032 /* A partial link, so keep the relocs */
6033 os->orelocation[os->reloc_count] = *parent;
6034 os->reloc_count++;
6035 }
6036
6037 if (r != bfd_reloc_ok)
6038 {
6039 switch (r)
6040 {
6041 case bfd_reloc_undefined:
6042 if (!((*link_info->callbacks->undefined_symbol)
6043 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
6044 input_bfd, input_section, (*parent)->address)))
6045 goto error_return;
6046 break;
6047 case bfd_reloc_dangerous:
6048 BFD_ASSERT (error_message != (char *) NULL);
6049 if (!((*link_info->callbacks->reloc_dangerous)
6050 (link_info, error_message, input_bfd, input_section,
6051 (*parent)->address)))
6052 goto error_return;
6053 break;
6054 case bfd_reloc_overflow:
6055 if (!((*link_info->callbacks->reloc_overflow)
6056 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
6057 (*parent)->howto->name, (*parent)->addend,
6058 input_bfd, input_section, (*parent)->address)))
6059 goto error_return;
6060 break;
6061 case bfd_reloc_outofrange:
6062 default:
6063 abort ();
6064 break;
6065 }
6066
6067 }
6068 }
6069 }
6070 if (reloc_vector != NULL)
6071 free (reloc_vector);
6072 return data;
6073
6074error_return:
6075 if (reloc_vector != NULL)
6076 free (reloc_vector);
6077 return NULL;
6078}
5b3b9ff6
ILT
6079#define bfd_elf32_bfd_get_relocated_section_contents \
6080 elf32_mips_get_relocated_section_contents
a16fcab3 6081\f
6e07e54f
ILT
6082/* ECOFF swapping routines. These are used when dealing with the
6083 .mdebug section, which is in the ECOFF debugging format. */
00176555 6084static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap =
6e07e54f
ILT
6085{
6086 /* Symbol table magic number. */
6087 magicSym,
6088 /* Alignment of debugging information. E.g., 4. */
6089 4,
6090 /* Sizes of external symbolic information. */
6091 sizeof (struct hdr_ext),
6092 sizeof (struct dnr_ext),
6093 sizeof (struct pdr_ext),
6094 sizeof (struct sym_ext),
6095 sizeof (struct opt_ext),
6096 sizeof (struct fdr_ext),
6097 sizeof (struct rfd_ext),
6098 sizeof (struct ext_ext),
6099 /* Functions to swap in external symbolic data. */
6100 ecoff_swap_hdr_in,
6101 ecoff_swap_dnr_in,
6102 ecoff_swap_pdr_in,
6103 ecoff_swap_sym_in,
6104 ecoff_swap_opt_in,
6105 ecoff_swap_fdr_in,
6106 ecoff_swap_rfd_in,
6107 ecoff_swap_ext_in,
75f3ef7a
ILT
6108 _bfd_ecoff_swap_tir_in,
6109 _bfd_ecoff_swap_rndx_in,
6e07e54f
ILT
6110 /* Functions to swap out external symbolic data. */
6111 ecoff_swap_hdr_out,
6112 ecoff_swap_dnr_out,
6113 ecoff_swap_pdr_out,
6114 ecoff_swap_sym_out,
6115 ecoff_swap_opt_out,
6116 ecoff_swap_fdr_out,
6117 ecoff_swap_rfd_out,
aac6b32f 6118 ecoff_swap_ext_out,
75f3ef7a
ILT
6119 _bfd_ecoff_swap_tir_out,
6120 _bfd_ecoff_swap_rndx_out,
aac6b32f 6121 /* Function to read in symbolic data. */
00176555 6122 _bfd_mips_elf_read_ecoff_info
6e07e54f
ILT
6123};
6124\f
6b4b4d17
JK
6125#define TARGET_LITTLE_SYM bfd_elf32_littlemips_vec
6126#define TARGET_LITTLE_NAME "elf32-littlemips"
6127#define TARGET_BIG_SYM bfd_elf32_bigmips_vec
6128#define TARGET_BIG_NAME "elf32-bigmips"
6129#define ELF_ARCH bfd_arch_mips
6e07e54f 6130#define ELF_MACHINE_CODE EM_MIPS
b3c0fc57 6131#define ELF_MAXPAGESIZE 0x10000
497c5434 6132#define elf_backend_collect true
5b3b9ff6 6133#define elf_backend_type_change_ok true
b3c0fc57
ILT
6134#define elf_info_to_howto 0
6135#define elf_info_to_howto_rel mips_info_to_howto_rel
6e07e54f 6136#define elf_backend_sym_is_global mips_elf_sym_is_global
00176555 6137#define elf_backend_object_p mips_elf32_object_p
d1bf45aa 6138#define elf_backend_section_from_shdr mips_elf32_section_from_shdr
00176555 6139#define elf_backend_fake_sections _bfd_mips_elf_fake_sections
b3c0fc57 6140#define elf_backend_section_from_bfd_section \
00176555
ILT
6141 _bfd_mips_elf_section_from_bfd_section
6142#define elf_backend_section_processing mips_elf32_section_processing
6143#define elf_backend_symbol_processing _bfd_mips_elf_symbol_processing
5b3b9ff6
ILT
6144#define elf_backend_additional_program_headers \
6145 mips_elf_additional_program_headers
6146#define elf_backend_modify_segment_map mips_elf_modify_segment_map
6e07e54f 6147#define elf_backend_final_write_processing \
00176555
ILT
6148 _bfd_mips_elf_final_write_processing
6149#define elf_backend_ecoff_debug_swap &mips_elf32_ecoff_debug_swap
b3c0fc57 6150
a2546fce 6151#define bfd_elf32_bfd_is_local_label mips_elf_is_local_label
bc05732b
ILT
6152#define bfd_elf32_find_nearest_line _bfd_mips_elf_find_nearest_line
6153#define bfd_elf32_set_section_contents _bfd_mips_elf_set_section_contents
aac6b32f
ILT
6154#define bfd_elf32_bfd_link_hash_table_create \
6155 mips_elf_link_hash_table_create
6e07e54f 6156#define bfd_elf32_bfd_final_link mips_elf_final_link
5b3b9ff6 6157#define bfd_elf32_bfd_copy_private_bfd_data \
bc05732b 6158 _bfd_mips_elf_copy_private_bfd_data
5b3b9ff6 6159#define bfd_elf32_bfd_merge_private_bfd_data \
bc05732b
ILT
6160 _bfd_mips_elf_merge_private_bfd_data
6161#define bfd_elf32_bfd_set_private_flags _bfd_mips_elf_set_private_flags
aac6b32f 6162#define elf_backend_add_symbol_hook mips_elf_add_symbol_hook
5b3b9ff6
ILT
6163#define elf_backend_create_dynamic_sections \
6164 mips_elf_create_dynamic_sections
6165#define elf_backend_check_relocs mips_elf_check_relocs
6166#define elf_backend_adjust_dynamic_symbol \
6167 mips_elf_adjust_dynamic_symbol
6168#define elf_backend_size_dynamic_sections \
6169 mips_elf_size_dynamic_sections
6170#define elf_backend_relocate_section mips_elf_relocate_section
6171#define elf_backend_finish_dynamic_symbol \
6172 mips_elf_finish_dynamic_symbol
6173#define elf_backend_finish_dynamic_sections \
6174 mips_elf_finish_dynamic_sections
6b4b4d17
JK
6175
6176#include "elf32-target.h"
This page took 0.436666 seconds and 4 git commands to generate.