2001-05-25 H.J. Lu <hjl@gnu.org>
[binutils.git] / bfd / elf32-i370.c
blobd70ba53bc6d0a483b384d4d0276df8f16ed745bf
1 /* i370-specific support for 32-bit ELF
2 Copyright 1994, 1995, 1996, 1997, 1998, 2000, 2001
3 Free Software Foundation, Inc.
4 Written by Ian Lance Taylor, Cygnus Support.
5 Hacked by Linas Vepstas for i370 linas@linas.org
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
23 /* This file is based on a preliminary PowerPC ELF ABI.
24 But its been hacked on for the IBM 360/370 architectures.
25 Basically, the 31bit relocation works, and just about everything
26 else is a wild card. In particular, don't expect shared libs or
27 dynamic loading to work ... its never been tested ...
30 #include "bfd.h"
31 #include "sysdep.h"
32 #include "bfdlink.h"
33 #include "libbfd.h"
34 #include "elf-bfd.h"
35 #include "elf/i370.h"
37 #define USE_RELA /* we want RELA relocations, not REL */
39 /* i370 relocations */
40 /* Note that there is really just one relocation that we currently
41 * support (and only one that we seem to need, at the moment), and
42 * that is the 31-bit address relocation. Note that the 370/390
43 * only supports a 31-bit (2GB) address space.
45 enum i370_reloc_type
47 R_I370_NONE = 0,
48 R_I370_ADDR31 = 1,
49 R_I370_ADDR32 = 2,
50 R_I370_ADDR16 = 3,
51 R_I370_REL31 = 4,
52 R_I370_REL32 = 5,
53 R_I370_ADDR12 = 6,
54 R_I370_REL12 = 7,
55 R_I370_ADDR8 = 8,
56 R_I370_REL8 = 9,
57 R_I370_COPY = 10,
58 R_I370_RELATIVE = 11,
60 R_I370_max
63 static reloc_howto_type *i370_elf_howto_table[ (int)R_I370_max ];
65 static reloc_howto_type i370_elf_howto_raw[] =
67 /* This reloc does nothing. */
68 HOWTO (R_I370_NONE, /* type */
69 0, /* rightshift */
70 2, /* size (0 = byte, 1 = short, 2 = long) */
71 32, /* bitsize */
72 false, /* pc_relative */
73 0, /* bitpos */
74 complain_overflow_bitfield, /* complain_on_overflow */
75 bfd_elf_generic_reloc, /* special_function */
76 "R_I370_NONE", /* name */
77 false, /* partial_inplace */
78 0, /* src_mask */
79 0, /* dst_mask */
80 false), /* pcrel_offset */
82 /* A standard 31 bit relocation. */
83 HOWTO (R_I370_ADDR31, /* type */
84 0, /* rightshift */
85 2, /* size (0 = byte, 1 = short, 2 = long) */
86 31, /* bitsize */
87 false, /* pc_relative */
88 0, /* bitpos */
89 complain_overflow_bitfield, /* complain_on_overflow */
90 bfd_elf_generic_reloc, /* special_function */
91 "R_I370_ADDR31", /* name */
92 false, /* partial_inplace */
93 0, /* src_mask */
94 0x7fffffff, /* dst_mask */
95 false), /* pcrel_offset */
97 /* A standard 32 bit relocation. */
98 HOWTO (R_I370_ADDR32, /* type */
99 0, /* rightshift */
100 2, /* size (0 = byte, 1 = short, 2 = long) */
101 32, /* bitsize */
102 false, /* pc_relative */
103 0, /* bitpos */
104 complain_overflow_bitfield, /* complain_on_overflow */
105 bfd_elf_generic_reloc, /* special_function */
106 "R_I370_ADDR32", /* name */
107 false, /* partial_inplace */
108 0, /* src_mask */
109 0xffffffff, /* dst_mask */
110 false), /* pcrel_offset */
112 /* A standard 16 bit relocation. */
113 HOWTO (R_I370_ADDR16, /* type */
114 0, /* rightshift */
115 1, /* size (0 = byte, 1 = short, 2 = long) */
116 16, /* bitsize */
117 false, /* pc_relative */
118 0, /* bitpos */
119 complain_overflow_bitfield, /* complain_on_overflow */
120 bfd_elf_generic_reloc, /* special_function */
121 "R_I370_ADDR16", /* name */
122 false, /* partial_inplace */
123 0, /* src_mask */
124 0xffff, /* dst_mask */
125 false), /* pcrel_offset */
127 /* 31-bit PC relative */
128 HOWTO (R_I370_REL31, /* type */
129 0, /* rightshift */
130 2, /* size (0 = byte, 1 = short, 2 = long) */
131 31, /* bitsize */
132 true, /* pc_relative */
133 0, /* bitpos */
134 complain_overflow_bitfield, /* complain_on_overflow */
135 bfd_elf_generic_reloc, /* special_function */
136 "R_I370_REL31", /* name */
137 false, /* partial_inplace */
138 0, /* src_mask */
139 0x7fffffff, /* dst_mask */
140 true), /* pcrel_offset */
142 /* 32-bit PC relative */
143 HOWTO (R_I370_REL32, /* type */
144 0, /* rightshift */
145 2, /* size (0 = byte, 1 = short, 2 = long) */
146 32, /* bitsize */
147 true, /* pc_relative */
148 0, /* bitpos */
149 complain_overflow_bitfield, /* complain_on_overflow */
150 bfd_elf_generic_reloc, /* special_function */
151 "R_I370_REL32", /* name */
152 false, /* partial_inplace */
153 0, /* src_mask */
154 0xffffffff, /* dst_mask */
155 true), /* pcrel_offset */
157 /* A standard 12 bit relocation. */
158 HOWTO (R_I370_ADDR12, /* type */
159 0, /* rightshift */
160 1, /* size (0 = byte, 1 = short, 2 = long) */
161 12, /* bitsize */
162 false, /* pc_relative */
163 0, /* bitpos */
164 complain_overflow_bitfield, /* complain_on_overflow */
165 bfd_elf_generic_reloc, /* special_function */
166 "R_I370_ADDR12", /* name */
167 false, /* partial_inplace */
168 0, /* src_mask */
169 0xfff, /* dst_mask */
170 false), /* pcrel_offset */
172 /* 12-bit PC relative */
173 HOWTO (R_I370_REL12, /* type */
174 0, /* rightshift */
175 1, /* size (0 = byte, 1 = short, 2 = long) */
176 12, /* bitsize */
177 true, /* pc_relative */
178 0, /* bitpos */
179 complain_overflow_bitfield, /* complain_on_overflow */
180 bfd_elf_generic_reloc, /* special_function */
181 "R_I370_REL12", /* name */
182 false, /* partial_inplace */
183 0, /* src_mask */
184 0xfff, /* dst_mask */
185 true), /* pcrel_offset */
187 /* A standard 8 bit relocation. */
188 HOWTO (R_I370_ADDR8, /* type */
189 0, /* rightshift */
190 0, /* size (0 = byte, 1 = short, 2 = long) */
191 8, /* bitsize */
192 false, /* pc_relative */
193 0, /* bitpos */
194 complain_overflow_bitfield, /* complain_on_overflow */
195 bfd_elf_generic_reloc, /* special_function */
196 "R_I370_ADDR8", /* name */
197 false, /* partial_inplace */
198 0, /* src_mask */
199 0xff, /* dst_mask */
200 false), /* pcrel_offset */
202 /* 8-bit PC relative */
203 HOWTO (R_I370_REL8, /* type */
204 0, /* rightshift */
205 0, /* size (0 = byte, 1 = short, 2 = long) */
206 8, /* bitsize */
207 true, /* pc_relative */
208 0, /* bitpos */
209 complain_overflow_bitfield, /* complain_on_overflow */
210 bfd_elf_generic_reloc, /* special_function */
211 "R_I370_REL8", /* name */
212 false, /* partial_inplace */
213 0, /* src_mask */
214 0xff, /* dst_mask */
215 true), /* pcrel_offset */
217 /* This is used only by the dynamic linker. The symbol should exist
218 both in the object being run and in some shared library. The
219 dynamic linker copies the data addressed by the symbol from the
220 shared library into the object, because the object being
221 run has to have the data at some particular address. */
222 HOWTO (R_I370_COPY, /* type */
223 0, /* rightshift */
224 2, /* size (0 = byte, 1 = short, 2 = long) */
225 32, /* bitsize */
226 false, /* pc_relative */
227 0, /* bitpos */
228 complain_overflow_bitfield, /* complain_on_overflow */
229 bfd_elf_generic_reloc, /* special_function */
230 "R_I370_COPY", /* name */
231 false, /* partial_inplace */
232 0, /* src_mask */
233 0, /* dst_mask */
234 false), /* pcrel_offset */
236 /* Used only by the dynamic linker. When the object is run, this
237 longword is set to the load address of the object, plus the
238 addend. */
239 HOWTO (R_I370_RELATIVE, /* type */
240 0, /* rightshift */
241 2, /* size (0 = byte, 1 = short, 2 = long) */
242 32, /* bitsize */
243 false, /* pc_relative */
244 0, /* bitpos */
245 complain_overflow_bitfield, /* complain_on_overflow */
246 bfd_elf_generic_reloc, /* special_function */
247 "R_I370_RELATIVE", /* name */
248 false, /* partial_inplace */
249 0, /* src_mask */
250 0xffffffff, /* dst_mask */
251 false), /* pcrel_offset */
255 static void i370_elf_howto_init PARAMS ((void));
256 static void i370_elf_info_to_howto PARAMS ((bfd *abfd, arelent *cache_ptr,
257 Elf32_Internal_Rela *dst));
258 static boolean i370_elf_set_private_flags PARAMS ((bfd *, flagword));
260 /* Initialize the i370_elf_howto_table, so that linear accesses can be done. */
262 static void
263 i370_elf_howto_init ()
265 unsigned int i, type;
267 for (i = 0; i < sizeof (i370_elf_howto_raw) / sizeof (i370_elf_howto_raw[0]); i++)
269 type = i370_elf_howto_raw[i].type;
270 BFD_ASSERT (type < sizeof (i370_elf_howto_table) / sizeof (i370_elf_howto_table[0]));
271 i370_elf_howto_table[type] = &i370_elf_howto_raw[i];
275 static reloc_howto_type *
276 i370_elf_reloc_type_lookup (abfd, code)
277 bfd *abfd ATTRIBUTE_UNUSED;
278 bfd_reloc_code_real_type code;
280 enum i370_reloc_type i370_reloc = R_I370_NONE;
282 if (!i370_elf_howto_table[ R_I370_ADDR31 ]) /* Initialize howto table if needed */
283 i370_elf_howto_init ();
285 switch ((int)code)
287 default:
288 return (reloc_howto_type *)NULL;
290 case BFD_RELOC_NONE: i370_reloc = R_I370_NONE; break;
291 case BFD_RELOC_32: i370_reloc = R_I370_ADDR31; break;
292 case BFD_RELOC_16: i370_reloc = R_I370_ADDR16; break;
293 case BFD_RELOC_32_PCREL: i370_reloc = R_I370_REL31; break;
294 case BFD_RELOC_CTOR: i370_reloc = R_I370_ADDR31; break;
295 case BFD_RELOC_I370_D12: i370_reloc = R_I370_ADDR12; break;
298 return i370_elf_howto_table[ (int)i370_reloc ];
301 static boolean i370_elf_copy_private_bfd_data PARAMS ((bfd *, bfd *));
302 static boolean i370_elf_merge_private_bfd_data PARAMS ((bfd *, bfd *));
304 static boolean i370_elf_relocate_section PARAMS ((bfd *,
305 struct bfd_link_info *info,
306 bfd *,
307 asection *,
308 bfd_byte *,
309 Elf_Internal_Rela *relocs,
310 Elf_Internal_Sym *local_syms,
311 asection **));
313 static boolean i370_elf_create_dynamic_sections PARAMS ((bfd *,
314 struct bfd_link_info *));
316 static boolean i370_elf_section_from_shdr PARAMS ((bfd *,
317 Elf32_Internal_Shdr *,
318 char *));
319 static boolean i370_elf_fake_sections PARAMS ((bfd *,
320 Elf32_Internal_Shdr *,
321 asection *));
322 #if 0
323 static elf_linker_section_t *i370_elf_create_linker_section
324 PARAMS ((bfd *abfd,
325 struct bfd_link_info *info,
326 enum elf_linker_section_enum));
327 #endif
328 static boolean i370_elf_check_relocs PARAMS ((bfd *,
329 struct bfd_link_info *,
330 asection *,
331 const Elf_Internal_Rela *));
333 static boolean i370_elf_adjust_dynamic_symbol PARAMS ((struct bfd_link_info *,
334 struct elf_link_hash_entry *));
336 static boolean i370_elf_adjust_dynindx PARAMS ((struct elf_link_hash_entry *, PTR));
338 static boolean i370_elf_size_dynamic_sections PARAMS ((bfd *, struct bfd_link_info *));
340 static boolean i370_elf_finish_dynamic_sections PARAMS ((bfd *, struct bfd_link_info *));
342 /* The name of the dynamic interpreter. This is put in the .interp
343 section. */
345 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so"
347 /* Set the howto pointer for an i370 ELF reloc. */
349 static void
350 i370_elf_info_to_howto (abfd, cache_ptr, dst)
351 bfd *abfd ATTRIBUTE_UNUSED;
352 arelent *cache_ptr;
353 Elf32_Internal_Rela *dst;
355 if (!i370_elf_howto_table[ R_I370_ADDR31 ]) /* Initialize howto table */
356 i370_elf_howto_init ();
358 BFD_ASSERT (ELF32_R_TYPE (dst->r_info) < (unsigned int) R_I370_max);
359 cache_ptr->howto = i370_elf_howto_table[ELF32_R_TYPE (dst->r_info)];
362 /* hack alert -- the following several routines look generic to me ...
363 * why are we bothering with them ???
365 /* Function to set whether a module needs the -mrelocatable bit set. */
366 static boolean
367 i370_elf_set_private_flags (abfd, flags)
368 bfd *abfd;
369 flagword flags;
371 BFD_ASSERT (!elf_flags_init (abfd)
372 || elf_elfheader (abfd)->e_flags == flags);
374 elf_elfheader (abfd)->e_flags = flags;
375 elf_flags_init (abfd) = true;
376 return true;
379 /* Copy backend specific data from one object module to another */
380 static boolean
381 i370_elf_copy_private_bfd_data (ibfd, obfd)
382 bfd *ibfd;
383 bfd *obfd;
385 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
386 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
387 return true;
389 BFD_ASSERT (!elf_flags_init (obfd)
390 || elf_elfheader (obfd)->e_flags == elf_elfheader (ibfd)->e_flags);
392 elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
393 elf_flags_init (obfd) = true;
394 return true;
397 /* Merge backend specific data from an object file to the output
398 object file when linking */
399 static boolean
400 i370_elf_merge_private_bfd_data (ibfd, obfd)
401 bfd *ibfd;
402 bfd *obfd;
404 flagword old_flags;
405 flagword new_flags;
407 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
408 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
409 return true;
411 new_flags = elf_elfheader (ibfd)->e_flags;
412 old_flags = elf_elfheader (obfd)->e_flags;
413 if (!elf_flags_init (obfd)) /* First call, no flags set */
415 elf_flags_init (obfd) = true;
416 elf_elfheader (obfd)->e_flags = new_flags;
419 else if (new_flags == old_flags) /* Compatible flags are ok */
422 else /* Incompatible flags */
424 (*_bfd_error_handler)
425 ("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)",
426 bfd_get_filename (ibfd), (long)new_flags, (long)old_flags);
428 bfd_set_error (bfd_error_bad_value);
429 return false;
432 return true;
435 /* Handle an i370 specific section when reading an object file. This
436 is called when elfcode.h finds a section with an unknown type. */
437 /* XXX hack alert bogus This routine is mostly all junk and almost
438 * certainly does the wrong thing. Its here simply because it does
439 * just enough to allow glibc-2.1 ld.so to compile & link.
442 static boolean
443 i370_elf_section_from_shdr (abfd, hdr, name)
444 bfd *abfd;
445 Elf32_Internal_Shdr *hdr;
446 char *name;
448 asection *newsect;
449 flagword flags;
451 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
452 return false;
454 newsect = hdr->bfd_section;
455 flags = bfd_get_section_flags (abfd, newsect);
456 if (hdr->sh_flags & SHF_EXCLUDE)
457 flags |= SEC_EXCLUDE;
459 if (hdr->sh_type == SHT_ORDERED)
460 flags |= SEC_SORT_ENTRIES;
462 bfd_set_section_flags (abfd, newsect, flags);
463 return true;
466 /* Set up any other section flags and such that may be necessary. */
467 /* XXX hack alert bogus This routine is mostly all junk and almost
468 * certainly does the wrong thing. Its here simply because it does
469 * just enough to allow glibc-2.1 ld.so to compile & link.
472 static boolean
473 i370_elf_fake_sections (abfd, shdr, asect)
474 bfd *abfd ATTRIBUTE_UNUSED;
475 Elf32_Internal_Shdr *shdr;
476 asection *asect;
478 if ((asect->flags & SEC_EXCLUDE) != 0)
479 shdr->sh_flags |= SHF_EXCLUDE;
481 if ((asect->flags & SEC_SORT_ENTRIES) != 0)
482 shdr->sh_type = SHT_ORDERED;
484 return true;
487 #if 0
488 /* Create a special linker section */
489 /* XXX hack alert bogus This routine is mostly all junk and almost
490 * certainly does the wrong thing. Its here simply because it does
491 * just enough to allow glibc-2.1 ld.so to compile & link.
494 static elf_linker_section_t *
495 i370_elf_create_linker_section (abfd, info, which)
496 bfd *abfd;
497 struct bfd_link_info *info;
498 enum elf_linker_section_enum which;
500 bfd *dynobj = elf_hash_table (info)->dynobj;
501 elf_linker_section_t *lsect;
503 /* Record the first bfd section that needs the special section */
504 if (!dynobj)
505 dynobj = elf_hash_table (info)->dynobj = abfd;
507 /* If this is the first time, create the section */
508 lsect = elf_linker_section (dynobj, which);
509 if (!lsect)
511 elf_linker_section_t defaults;
512 static elf_linker_section_t zero_section;
514 defaults = zero_section;
515 defaults.which = which;
516 defaults.hole_written_p = false;
517 defaults.alignment = 2;
519 /* Both of these sections are (technically) created by the user
520 putting data in them, so they shouldn't be marked
521 SEC_LINKER_CREATED.
523 The linker creates them so it has somewhere to attach their
524 respective symbols. In fact, if they were empty it would
525 be OK to leave the symbol set to 0 (or any random number), because
526 the appropriate register should never be used. */
527 defaults.flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
528 | SEC_IN_MEMORY);
530 switch (which)
532 default:
533 (*_bfd_error_handler) ("%s: Unknown special linker type %d",
534 bfd_get_filename (abfd),
535 (int)which);
537 bfd_set_error (bfd_error_bad_value);
538 return (elf_linker_section_t *)0;
540 case LINKER_SECTION_SDATA: /* .sdata/.sbss section */
541 defaults.name = ".sdata";
542 defaults.rel_name = ".rela.sdata";
543 defaults.bss_name = ".sbss";
544 defaults.sym_name = "_SDA_BASE_";
545 defaults.sym_offset = 32768;
546 break;
548 case LINKER_SECTION_SDATA2: /* .sdata2/.sbss2 section */
549 defaults.name = ".sdata2";
550 defaults.rel_name = ".rela.sdata2";
551 defaults.bss_name = ".sbss2";
552 defaults.sym_name = "_SDA2_BASE_";
553 defaults.sym_offset = 32768;
554 defaults.flags |= SEC_READONLY;
555 break;
558 lsect = _bfd_elf_create_linker_section (abfd, info, which, &defaults);
561 return lsect;
563 #endif
565 /* We have to create .dynsbss and .rela.sbss here so that they get mapped
566 to output sections (just like _bfd_elf_create_dynamic_sections has
567 to create .dynbss and .rela.bss). */
568 /* XXX hack alert bogus This routine is mostly all junk and almost
569 * certainly does the wrong thing. Its here simply because it does
570 * just enough to allow glibc-2.1 ld.so to compile & link.
573 static boolean
574 i370_elf_create_dynamic_sections (abfd, info)
575 bfd *abfd;
576 struct bfd_link_info *info;
578 register asection *s;
579 flagword flags;
581 if (!_bfd_elf_create_dynamic_sections(abfd, info))
582 return false;
584 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
585 | SEC_LINKER_CREATED);
587 s = bfd_make_section (abfd, ".dynsbss");
588 if (s == NULL
589 || ! bfd_set_section_flags (abfd, s, SEC_ALLOC))
590 return false;
592 if (! info->shared)
594 s = bfd_make_section (abfd, ".rela.sbss");
595 if (s == NULL
596 || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
597 || ! bfd_set_section_alignment (abfd, s, 2))
598 return false;
601 /* xxx beats me, seem to need a rela.text ... */
602 s = bfd_make_section (abfd, ".rela.text");
603 if (s == NULL
604 || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
605 || ! bfd_set_section_alignment (abfd, s, 2))
606 return false;
607 return true;
610 /* Adjust a symbol defined by a dynamic object and referenced by a
611 regular object. The current definition is in some section of the
612 dynamic object, but we're not including those sections. We have to
613 change the definition to something the rest of the link can
614 understand. */
615 /* XXX hack alert bogus This routine is mostly all junk and almost
616 * certainly does the wrong thing. Its here simply because it does
617 * just enough to allow glibc-2.1 ld.so to compile & link.
620 static boolean
621 i370_elf_adjust_dynamic_symbol (info, h)
622 struct bfd_link_info *info;
623 struct elf_link_hash_entry *h;
625 bfd *dynobj = elf_hash_table (info)->dynobj;
626 asection *s;
627 unsigned int power_of_two;
629 #ifdef DEBUG
630 fprintf (stderr, "i370_elf_adjust_dynamic_symbol called for %s\n",
631 h->root.root.string);
632 #endif
634 /* Make sure we know what is going on here. */
635 BFD_ASSERT (dynobj != NULL
636 && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT)
637 || h->weakdef != NULL
638 || ((h->elf_link_hash_flags
639 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
640 && (h->elf_link_hash_flags
641 & ELF_LINK_HASH_REF_REGULAR) != 0
642 && (h->elf_link_hash_flags
643 & ELF_LINK_HASH_DEF_REGULAR) == 0)));
645 s = bfd_get_section_by_name (dynobj, ".rela.text");
646 BFD_ASSERT (s != NULL);
647 s->_raw_size += sizeof (Elf32_External_Rela);
649 /* If this is a weak symbol, and there is a real definition, the
650 processor independent code will have arranged for us to see the
651 real definition first, and we can just use the same value. */
652 if (h->weakdef != NULL)
654 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
655 || h->weakdef->root.type == bfd_link_hash_defweak);
656 h->root.u.def.section = h->weakdef->root.u.def.section;
657 h->root.u.def.value = h->weakdef->root.u.def.value;
658 return true;
661 /* This is a reference to a symbol defined by a dynamic object which
662 is not a function. */
664 /* If we are creating a shared library, we must presume that the
665 only references to the symbol are via the global offset table.
666 For such cases we need not do anything here; the relocations will
667 be handled correctly by relocate_section. */
668 if (info->shared)
669 return true;
671 /* We must allocate the symbol in our .dynbss section, which will
672 become part of the .bss section of the executable. There will be
673 an entry for this symbol in the .dynsym section. The dynamic
674 object will contain position independent code, so all references
675 from the dynamic object to this symbol will go through the global
676 offset table. The dynamic linker will use the .dynsym entry to
677 determine the address it must put in the global offset table, so
678 both the dynamic object and the regular object will refer to the
679 same memory location for the variable.
681 Of course, if the symbol is sufficiently small, we must instead
682 allocate it in .sbss. FIXME: It would be better to do this if and
683 only if there were actually SDAREL relocs for that symbol. */
685 if (h->size <= elf_gp_size (dynobj))
686 s = bfd_get_section_by_name (dynobj, ".dynsbss");
687 else
688 s = bfd_get_section_by_name (dynobj, ".dynbss");
689 BFD_ASSERT (s != NULL);
691 /* We must generate a R_I370_COPY reloc to tell the dynamic linker to
692 copy the initial value out of the dynamic object and into the
693 runtime process image. We need to remember the offset into the
694 .rela.bss section we are going to use. */
695 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
697 asection *srel;
699 if (h->size <= elf_gp_size (dynobj))
700 srel = bfd_get_section_by_name (dynobj, ".rela.sbss");
701 else
702 srel = bfd_get_section_by_name (dynobj, ".rela.bss");
703 BFD_ASSERT (srel != NULL);
704 srel->_raw_size += sizeof (Elf32_External_Rela);
705 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
708 /* We need to figure out the alignment required for this symbol. I
709 have no idea how ELF linkers handle this. */
710 power_of_two = bfd_log2 (h->size);
711 if (power_of_two > 4)
712 power_of_two = 4;
714 /* Apply the required alignment. */
715 s->_raw_size = BFD_ALIGN (s->_raw_size,
716 (bfd_size_type) (1 << power_of_two));
717 if (power_of_two > bfd_get_section_alignment (dynobj, s))
719 if (! bfd_set_section_alignment (dynobj, s, power_of_two))
720 return false;
723 /* Define the symbol as being at this point in the section. */
724 h->root.u.def.section = s;
725 h->root.u.def.value = s->_raw_size;
727 /* Increment the section size to make room for the symbol. */
728 s->_raw_size += h->size;
730 return true;
733 /* Increment the index of a dynamic symbol by a given amount. Called
734 via elf_link_hash_traverse. */
735 /* XXX hack alert bogus This routine is mostly all junk and almost
736 * certainly does the wrong thing. Its here simply because it does
737 * just enough to allow glibc-2.1 ld.so to compile & link.
740 static boolean
741 i370_elf_adjust_dynindx (h, cparg)
742 struct elf_link_hash_entry *h;
743 PTR cparg;
745 int *cp = (int *) cparg;
747 #ifdef DEBUG
748 fprintf (stderr,
749 "i370_elf_adjust_dynindx called, h->dynindx = %d, *cp = %d\n",
750 h->dynindx, *cp);
751 #endif
753 if (h->dynindx != -1)
754 h->dynindx += *cp;
756 return true;
759 /* Set the sizes of the dynamic sections. */
760 /* XXX hack alert bogus This routine is mostly all junk and almost
761 * certainly does the wrong thing. Its here simply because it does
762 * just enough to allow glibc-2.1 ld.so to compile & link.
765 static boolean
766 i370_elf_size_dynamic_sections (output_bfd, info)
767 bfd *output_bfd;
768 struct bfd_link_info *info;
770 bfd *dynobj;
771 asection *s;
772 boolean plt;
773 boolean relocs;
774 boolean reltext;
776 #ifdef DEBUG
777 fprintf (stderr, "i370_elf_size_dynamic_sections called\n");
778 #endif
780 dynobj = elf_hash_table (info)->dynobj;
781 BFD_ASSERT (dynobj != NULL);
783 if (elf_hash_table (info)->dynamic_sections_created)
785 /* Set the contents of the .interp section to the interpreter. */
786 if (! info->shared)
788 s = bfd_get_section_by_name (dynobj, ".interp");
789 BFD_ASSERT (s != NULL);
790 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
791 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
794 else
796 /* We may have created entries in the .rela.got, .rela.sdata, and
797 .rela.sdata2 sections. However, if we are not creating the
798 dynamic sections, we will not actually use these entries. Reset
799 the size of .rela.got, et al, which will cause it to get
800 stripped from the output file below. */
801 static char *rela_sections[] = { ".rela.got", ".rela.sdata",
802 ".rela.sdata2", ".rela.sbss",
803 (char *)0 };
804 char **p;
806 for (p = rela_sections; *p != (char *)0; p++)
808 s = bfd_get_section_by_name (dynobj, *p);
809 if (s != NULL)
810 s->_raw_size = 0;
814 /* The check_relocs and adjust_dynamic_symbol entry points have
815 determined the sizes of the various dynamic sections. Allocate
816 memory for them. */
817 plt = false;
818 relocs = false;
819 reltext = false;
820 for (s = dynobj->sections; s != NULL; s = s->next)
822 const char *name;
823 boolean strip;
825 if ((s->flags & SEC_LINKER_CREATED) == 0)
826 continue;
828 /* It's OK to base decisions on the section name, because none
829 of the dynobj section names depend upon the input files. */
830 name = bfd_get_section_name (dynobj, s);
831 strip = false;
833 if (strcmp (name, ".plt") == 0)
835 if (s->_raw_size == 0)
837 /* Strip this section if we don't need it; see the
838 comment below. */
839 strip = true;
841 else
843 /* Remember whether there is a PLT. */
844 plt = true;
847 else if (strncmp (name, ".rela", 5) == 0)
849 if (s->_raw_size == 0)
851 /* If we don't need this section, strip it from the
852 output file. This is mostly to handle .rela.bss and
853 .rela.plt. We must create both sections in
854 create_dynamic_sections, because they must be created
855 before the linker maps input sections to output
856 sections. The linker does that before
857 adjust_dynamic_symbol is called, and it is that
858 function which decides whether anything needs to go
859 into these sections. */
860 strip = true;
862 else
864 asection *target;
865 const char *outname;
867 /* Remember whether there are any relocation sections. */
868 relocs = true;
870 /* If this relocation section applies to a read only
871 section, then we probably need a DT_TEXTREL entry. */
872 outname = bfd_get_section_name (output_bfd,
873 s->output_section);
874 target = bfd_get_section_by_name (output_bfd, outname + 5);
875 if (target != NULL
876 && (target->flags & SEC_READONLY) != 0
877 && (target->flags & SEC_ALLOC) != 0)
878 reltext = true;
880 /* We use the reloc_count field as a counter if we need
881 to copy relocs into the output file. */
882 s->reloc_count = 0;
885 else if (strcmp (name, ".got") != 0
886 && strcmp (name, ".sdata") != 0
887 && strcmp (name, ".sdata2") != 0)
889 /* It's not one of our sections, so don't allocate space. */
890 continue;
893 if (strip)
895 asection **spp;
897 for (spp = &s->output_section->owner->sections;
898 *spp != s->output_section;
899 spp = &(*spp)->next)
901 *spp = s->output_section->next;
902 --s->output_section->owner->section_count;
904 continue;
906 /* Allocate memory for the section contents. */
907 s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
908 if (s->contents == NULL && s->_raw_size != 0)
909 return false;
912 if (elf_hash_table (info)->dynamic_sections_created)
914 /* Add some entries to the .dynamic section. We fill in the
915 values later, in i370_elf_finish_dynamic_sections, but we
916 must add the entries now so that we get the correct size for
917 the .dynamic section. The DT_DEBUG entry is filled in by the
918 dynamic linker and used by the debugger. */
919 if (! info->shared)
921 if (! bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0))
922 return false;
925 if (plt)
927 if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)
928 || ! bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0)
929 || ! bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
930 || ! bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0))
931 return false;
934 if (relocs)
936 if (! bfd_elf32_add_dynamic_entry (info, DT_RELA, 0)
937 || ! bfd_elf32_add_dynamic_entry (info, DT_RELASZ, 0)
938 || ! bfd_elf32_add_dynamic_entry (info, DT_RELAENT,
939 sizeof (Elf32_External_Rela)))
940 return false;
943 if (reltext)
945 if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0))
946 return false;
947 info->flags |= DF_TEXTREL;
951 /* If we are generating a shared library, we generate a section
952 symbol for each output section. These are local symbols, which
953 means that they must come first in the dynamic symbol table.
954 That means we must increment the dynamic symbol index of every
955 other dynamic symbol.
957 FIXME: We assume that there will never be relocations to
958 locations in linker-created sections that do not have
959 externally-visible names. Instead, we should work out precisely
960 which sections relocations are targetted at. */
961 if (info->shared)
963 int c;
965 for (c = 0, s = output_bfd->sections; s != NULL; s = s->next)
967 if ((s->flags & SEC_LINKER_CREATED) != 0
968 || (s->flags & SEC_ALLOC) == 0)
970 elf_section_data (s)->dynindx = -1;
971 continue;
974 /* These symbols will have no names, so we don't need to
975 fiddle with dynstr_index. */
977 elf_section_data (s)->dynindx = c + 1;
979 c++;
982 elf_link_hash_traverse (elf_hash_table (info),
983 i370_elf_adjust_dynindx,
984 (PTR) &c);
985 elf_hash_table (info)->dynsymcount += c;
988 return true;
991 /* Look through the relocs for a section during the first phase, and
992 allocate space in the global offset table or procedure linkage
993 table. */
994 /* XXX hack alert bogus This routine is mostly all junk and almost
995 * certainly does the wrong thing. Its here simply because it does
996 * just enough to allow glibc-2.1 ld.so to compile & link.
999 static boolean
1000 i370_elf_check_relocs (abfd, info, sec, relocs)
1001 bfd *abfd;
1002 struct bfd_link_info *info;
1003 asection *sec;
1004 const Elf_Internal_Rela *relocs;
1006 bfd *dynobj;
1007 Elf_Internal_Shdr *symtab_hdr;
1008 struct elf_link_hash_entry **sym_hashes;
1009 const Elf_Internal_Rela *rel;
1010 const Elf_Internal_Rela *rel_end;
1011 bfd_vma *local_got_offsets;
1012 asection *sreloc;
1014 if (info->relocateable)
1015 return true;
1017 #ifdef DEBUG
1018 fprintf (stderr, "i370_elf_check_relocs called for section %s in %s\n",
1019 bfd_get_section_name (abfd, sec),
1020 bfd_get_filename (abfd));
1021 #endif
1023 dynobj = elf_hash_table (info)->dynobj;
1024 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1025 sym_hashes = elf_sym_hashes (abfd);
1026 local_got_offsets = elf_local_got_offsets (abfd);
1028 sreloc = NULL;
1030 rel_end = relocs + sec->reloc_count;
1031 for (rel = relocs; rel < rel_end; rel++)
1033 unsigned long r_symndx;
1034 struct elf_link_hash_entry *h;
1036 r_symndx = ELF32_R_SYM (rel->r_info);
1037 if (r_symndx < symtab_hdr->sh_info)
1038 h = NULL;
1039 else
1040 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1042 if (info->shared)
1044 #ifdef DEBUG
1045 fprintf (stderr,
1046 "i370_elf_check_relocs needs to create relocation for %s\n",
1047 (h && h->root.root.string)
1048 ? h->root.root.string : "<unknown>");
1049 #endif
1050 if (sreloc == NULL)
1052 const char *name;
1054 name = (bfd_elf_string_from_elf_section
1055 (abfd,
1056 elf_elfheader (abfd)->e_shstrndx,
1057 elf_section_data (sec)->rel_hdr.sh_name));
1058 if (name == NULL)
1059 return false;
1061 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
1062 && strcmp (bfd_get_section_name (abfd, sec), name + 5) == 0);
1064 sreloc = bfd_get_section_by_name (dynobj, name);
1065 if (sreloc == NULL)
1067 flagword flags;
1069 sreloc = bfd_make_section (dynobj, name);
1070 flags = (SEC_HAS_CONTENTS | SEC_READONLY
1071 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
1072 if ((sec->flags & SEC_ALLOC) != 0)
1073 flags |= SEC_ALLOC | SEC_LOAD;
1074 if (sreloc == NULL
1075 || ! bfd_set_section_flags (dynobj, sreloc, flags)
1076 || ! bfd_set_section_alignment (dynobj, sreloc, 2))
1077 return false;
1081 sreloc->_raw_size += sizeof (Elf32_External_Rela);
1083 /* FIXME: We should here do what the m68k and i386
1084 backends do: if the reloc is pc-relative, record it
1085 in case it turns out that the reloc is unnecessary
1086 because the symbol is forced local by versioning or
1087 we are linking with -Bdynamic. Fortunately this
1088 case is not frequent. */
1092 return true;
1095 /* Finish up the dynamic sections. */
1096 /* XXX hack alert bogus This routine is mostly all junk and almost
1097 * certainly does the wrong thing. Its here simply because it does
1098 * just enough to allow glibc-2.1 ld.so to compile & link.
1101 static boolean
1102 i370_elf_finish_dynamic_sections (output_bfd, info)
1103 bfd *output_bfd;
1104 struct bfd_link_info *info;
1106 asection *sdyn;
1107 bfd *dynobj = elf_hash_table (info)->dynobj;
1108 asection *sgot = bfd_get_section_by_name (dynobj, ".got");
1110 #ifdef DEBUG
1111 fprintf (stderr, "i370_elf_finish_dynamic_sections called\n");
1112 #endif
1114 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
1116 if (elf_hash_table (info)->dynamic_sections_created)
1118 asection *splt;
1119 Elf32_External_Dyn *dyncon, *dynconend;
1121 splt = bfd_get_section_by_name (dynobj, ".plt");
1122 BFD_ASSERT (splt != NULL && sdyn != NULL);
1124 dyncon = (Elf32_External_Dyn *) sdyn->contents;
1125 dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
1126 for (; dyncon < dynconend; dyncon++)
1128 Elf_Internal_Dyn dyn;
1129 const char *name;
1130 boolean size;
1132 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
1134 switch (dyn.d_tag)
1136 case DT_PLTGOT: name = ".plt"; size = false; break;
1137 case DT_PLTRELSZ: name = ".rela.plt"; size = true; break;
1138 case DT_JMPREL: name = ".rela.plt"; size = false; break;
1139 default: name = NULL; size = false; break;
1142 if (name != NULL)
1144 asection *s;
1146 s = bfd_get_section_by_name (output_bfd, name);
1147 if (s == NULL)
1148 dyn.d_un.d_val = 0;
1149 else
1151 if (! size)
1152 dyn.d_un.d_ptr = s->vma;
1153 else
1155 if (s->_cooked_size != 0)
1156 dyn.d_un.d_val = s->_cooked_size;
1157 else
1158 dyn.d_un.d_val = s->_raw_size;
1161 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1166 /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4 so that a function can
1167 easily find the address of the _GLOBAL_OFFSET_TABLE_. */
1168 /* XXX this is clearly very wrong for the 370 arch */
1169 if (sgot)
1171 unsigned char *contents = sgot->contents;
1172 bfd_put_32 (output_bfd, 0x4e800021 /* blrl */, contents);
1174 if (sdyn == NULL)
1175 bfd_put_32 (output_bfd, (bfd_vma) 0, contents+4);
1176 else
1177 bfd_put_32 (output_bfd,
1178 sdyn->output_section->vma + sdyn->output_offset,
1179 contents+4);
1181 elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
1184 if (info->shared)
1186 asection *sdynsym;
1187 asection *s;
1188 Elf_Internal_Sym sym;
1189 int maxdindx = 0;
1191 /* Set up the section symbols for the output sections. */
1193 sdynsym = bfd_get_section_by_name (dynobj, ".dynsym");
1194 BFD_ASSERT (sdynsym != NULL);
1196 sym.st_size = 0;
1197 sym.st_name = 0;
1198 sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION);
1199 sym.st_other = 0;
1201 for (s = output_bfd->sections; s != NULL; s = s->next)
1203 int indx, dindx;
1205 sym.st_value = s->vma;
1207 indx = elf_section_data (s)->this_idx;
1208 dindx = elf_section_data (s)->dynindx;
1209 if (dindx != -1)
1211 BFD_ASSERT(indx > 0);
1212 BFD_ASSERT(dindx > 0);
1214 if (dindx > maxdindx)
1215 maxdindx = dindx;
1217 sym.st_shndx = indx;
1219 bfd_elf32_swap_symbol_out (output_bfd, &sym,
1220 (PTR) (((Elf32_External_Sym *)
1221 sdynsym->contents)
1222 + dindx));
1226 /* Set the sh_info field of the output .dynsym section to the
1227 index of the first global symbol. */
1228 elf_section_data (sdynsym->output_section)->this_hdr.sh_info =
1229 maxdindx + 1;
1232 return true;
1235 /* The RELOCATE_SECTION function is called by the ELF backend linker
1236 to handle the relocations for a section.
1238 The relocs are always passed as Rela structures; if the section
1239 actually uses Rel structures, the r_addend field will always be
1240 zero.
1242 This function is responsible for adjust the section contents as
1243 necessary, and (if using Rela relocs and generating a
1244 relocateable output file) adjusting the reloc addend as
1245 necessary.
1247 This function does not have to worry about setting the reloc
1248 address or the reloc symbol index.
1250 LOCAL_SYMS is a pointer to the swapped in local symbols.
1252 LOCAL_SECTIONS is an array giving the section in the input file
1253 corresponding to the st_shndx field of each local symbol.
1255 The global hash table entry for the global symbols can be found
1256 via elf_sym_hashes (input_bfd).
1258 When generating relocateable output, this function must handle
1259 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
1260 going to be the section symbol corresponding to the output
1261 section, which means that the addend must be adjusted
1262 accordingly. */
1264 static boolean
1265 i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
1266 contents, relocs, local_syms, local_sections)
1267 bfd *output_bfd;
1268 struct bfd_link_info *info;
1269 bfd *input_bfd;
1270 asection *input_section;
1271 bfd_byte *contents;
1272 Elf_Internal_Rela *relocs;
1273 Elf_Internal_Sym *local_syms;
1274 asection **local_sections;
1276 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1277 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
1278 bfd *dynobj = elf_hash_table (info)->dynobj;
1279 Elf_Internal_Rela *rel = relocs;
1280 Elf_Internal_Rela *relend = relocs + input_section->reloc_count;
1281 asection *sreloc = NULL;
1282 bfd_vma *local_got_offsets;
1283 boolean ret = true;
1285 #ifdef DEBUG
1286 fprintf (stderr, "i370_elf_relocate_section called for %s section %s, %ld relocations%s\n",
1287 bfd_get_filename (input_bfd),
1288 bfd_section_name(input_bfd, input_section),
1289 (long)input_section->reloc_count,
1290 (info->relocateable) ? " (relocatable)" : "");
1291 #endif
1293 if (!i370_elf_howto_table[ R_I370_ADDR31 ]) /* Initialize howto table if needed */
1294 i370_elf_howto_init ();
1296 local_got_offsets = elf_local_got_offsets (input_bfd);
1298 for (; rel < relend; rel++)
1300 enum i370_reloc_type r_type = (enum i370_reloc_type)ELF32_R_TYPE (rel->r_info);
1301 bfd_vma offset = rel->r_offset;
1302 bfd_vma addend = rel->r_addend;
1303 bfd_reloc_status_type r = bfd_reloc_other;
1304 Elf_Internal_Sym *sym = (Elf_Internal_Sym *)0;
1305 asection *sec = (asection *)0;
1306 struct elf_link_hash_entry *h = (struct elf_link_hash_entry *)0;
1307 const char *sym_name = (const char *)0;
1308 reloc_howto_type *howto;
1309 unsigned long r_symndx;
1310 bfd_vma relocation;
1312 /* Unknown relocation handling */
1313 if ((unsigned)r_type >= (unsigned)R_I370_max
1314 || !i370_elf_howto_table[(int)r_type])
1316 (*_bfd_error_handler) ("%s: unknown relocation type %d",
1317 bfd_get_filename (input_bfd),
1318 (int)r_type);
1320 bfd_set_error (bfd_error_bad_value);
1321 ret = false;
1322 continue;
1325 howto = i370_elf_howto_table[(int)r_type];
1326 r_symndx = ELF32_R_SYM (rel->r_info);
1328 if (info->relocateable)
1330 /* This is a relocateable link. We don't have to change
1331 anything, unless the reloc is against a section symbol,
1332 in which case we have to adjust according to where the
1333 section symbol winds up in the output section. */
1334 if (r_symndx < symtab_hdr->sh_info)
1336 sym = local_syms + r_symndx;
1337 if ((unsigned)ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1339 sec = local_sections[r_symndx];
1340 addend = rel->r_addend += sec->output_offset + sym->st_value;
1344 #ifdef DEBUG
1345 fprintf (stderr, "\ttype = %s (%d), symbol index = %ld, offset = %ld, addend = %ld\n",
1346 howto->name,
1347 (int)r_type,
1348 r_symndx,
1349 (long)offset,
1350 (long)addend);
1351 #endif
1352 continue;
1355 /* This is a final link. */
1356 if (r_symndx < symtab_hdr->sh_info)
1358 sym = local_syms + r_symndx;
1359 sec = local_sections[r_symndx];
1360 sym_name = "<local symbol>";
1362 relocation = (sec->output_section->vma
1363 + sec->output_offset
1364 + sym->st_value);
1366 else
1368 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1369 while (h->root.type == bfd_link_hash_indirect
1370 || h->root.type == bfd_link_hash_warning)
1371 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1372 sym_name = h->root.root.string;
1373 if (h->root.type == bfd_link_hash_defined
1374 || h->root.type == bfd_link_hash_defweak)
1376 sec = h->root.u.def.section;
1377 if (info->shared
1378 && ((! info->symbolic && h->dynindx != -1)
1379 || (h->elf_link_hash_flags
1380 & ELF_LINK_HASH_DEF_REGULAR) == 0)
1381 && (input_section->flags & SEC_ALLOC) != 0
1382 && (r_type == R_I370_ADDR31
1383 || r_type == R_I370_COPY
1384 || r_type == R_I370_ADDR16
1385 || r_type == R_I370_RELATIVE))
1387 /* In these cases, we don't need the relocation
1388 value. We check specially because in some
1389 obscure cases sec->output_section will be NULL. */
1390 relocation = 0;
1392 else
1393 relocation = (h->root.u.def.value
1394 + sec->output_section->vma
1395 + sec->output_offset);
1397 else if (h->root.type == bfd_link_hash_undefweak)
1398 relocation = 0;
1399 else if (info->shared
1400 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
1401 relocation = 0;
1402 else
1404 (*info->callbacks->undefined_symbol) (info,
1405 h->root.root.string,
1406 input_bfd,
1407 input_section,
1408 rel->r_offset,
1409 true);
1410 ret = false;
1411 continue;
1415 switch ((int)r_type)
1417 default:
1418 (*_bfd_error_handler) ("%s: unknown relocation type %d for symbol %s",
1419 bfd_get_filename (input_bfd),
1420 (int)r_type, sym_name);
1422 bfd_set_error (bfd_error_bad_value);
1423 ret = false;
1424 continue;
1426 /* Relocations that may need to be propagated if this is a shared
1427 object. */
1428 case (int)R_I370_REL31:
1429 /* If these relocations are not to a named symbol, they can be
1430 handled right here, no need to bother the dynamic linker. */
1431 if (h == NULL
1432 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1433 break;
1434 /* fall through */
1436 /* Relocations that always need to be propagated if this is a shared
1437 object. */
1438 case (int)R_I370_NONE:
1439 case (int)R_I370_ADDR31:
1440 case (int)R_I370_ADDR16:
1441 if (info->shared)
1443 Elf_Internal_Rela outrel;
1444 boolean skip;
1446 #ifdef DEBUG
1447 fprintf (stderr,
1448 "i370_elf_relocate_section needs to create relocation for %s\n",
1449 (h && h->root.root.string) ? h->root.root.string : "<unknown>");
1450 #endif
1452 /* When generating a shared object, these relocations
1453 are copied into the output file to be resolved at run
1454 time. */
1456 if (sreloc == NULL)
1458 const char *name;
1460 name = (bfd_elf_string_from_elf_section
1461 (input_bfd,
1462 elf_elfheader (input_bfd)->e_shstrndx,
1463 elf_section_data (input_section)->rel_hdr.sh_name));
1464 if (name == NULL)
1465 return false;
1467 BFD_ASSERT (strncmp (name, ".rela", 5) == 0
1468 && strcmp (bfd_get_section_name (input_bfd,
1469 input_section),
1470 name + 5) == 0);
1472 sreloc = bfd_get_section_by_name (dynobj, name);
1473 BFD_ASSERT (sreloc != NULL);
1476 skip = false;
1478 if (elf_section_data (input_section)->stab_info == NULL)
1479 outrel.r_offset = rel->r_offset;
1480 else
1482 bfd_vma off;
1484 off = (_bfd_stab_section_offset
1485 (output_bfd, &elf_hash_table (info)->stab_info,
1486 input_section,
1487 &elf_section_data (input_section)->stab_info,
1488 rel->r_offset));
1489 if (off == (bfd_vma) -1)
1490 skip = true;
1491 outrel.r_offset = off;
1494 outrel.r_offset += (input_section->output_section->vma
1495 + input_section->output_offset);
1497 if (skip)
1498 memset (&outrel, 0, sizeof outrel);
1499 /* h->dynindx may be -1 if this symbol was marked to
1500 become local. */
1501 else if (h != NULL
1502 && ((! info->symbolic && h->dynindx != -1)
1503 || (h->elf_link_hash_flags
1504 & ELF_LINK_HASH_DEF_REGULAR) == 0))
1506 BFD_ASSERT (h->dynindx != -1);
1507 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1508 outrel.r_addend = rel->r_addend;
1510 else
1512 if (r_type == R_I370_ADDR31)
1514 outrel.r_info = ELF32_R_INFO (0, R_I370_RELATIVE);
1515 outrel.r_addend = relocation + rel->r_addend;
1517 else
1519 long indx;
1521 if (h == NULL)
1522 sec = local_sections[r_symndx];
1523 else
1525 BFD_ASSERT (h->root.type == bfd_link_hash_defined
1526 || (h->root.type
1527 == bfd_link_hash_defweak));
1528 sec = h->root.u.def.section;
1530 if (sec != NULL && bfd_is_abs_section (sec))
1531 indx = 0;
1532 else if (sec == NULL || sec->owner == NULL)
1534 bfd_set_error (bfd_error_bad_value);
1535 return false;
1537 else
1539 asection *osec;
1541 osec = sec->output_section;
1542 indx = elf_section_data (osec)->dynindx;
1543 BFD_ASSERT(indx > 0);
1544 #ifdef DEBUG
1545 if (indx <= 0)
1547 printf ("indx=%d section=%s flags=%08x name=%s\n",
1548 indx, osec->name, osec->flags,
1549 h->root.root.string);
1551 #endif
1554 outrel.r_info = ELF32_R_INFO (indx, r_type);
1555 outrel.r_addend = relocation + rel->r_addend;
1559 bfd_elf32_swap_reloca_out (output_bfd, &outrel,
1560 (((Elf32_External_Rela *)
1561 sreloc->contents)
1562 + sreloc->reloc_count));
1563 ++sreloc->reloc_count;
1565 /* This reloc will be computed at runtime, so there's no
1566 need to do anything now, unless this is a RELATIVE
1567 reloc in an unallocated section. */
1568 if (skip
1569 || (input_section->flags & SEC_ALLOC) != 0
1570 || ELF32_R_TYPE (outrel.r_info) != R_I370_RELATIVE)
1571 continue;
1573 break;
1575 case (int)R_I370_COPY:
1576 case (int)R_I370_RELATIVE:
1577 (*_bfd_error_handler) ("%s: Relocation %s is not yet supported for symbol %s.",
1578 bfd_get_filename (input_bfd),
1579 i370_elf_howto_table[ (int)r_type ]->name,
1580 sym_name);
1582 bfd_set_error (bfd_error_invalid_operation);
1583 ret = false;
1584 continue;
1587 #ifdef DEBUG
1588 fprintf (stderr, "\ttype = %s (%d), name = %s, symbol index = %ld, offset = %ld, addend = %ld\n",
1589 howto->name,
1590 (int)r_type,
1591 sym_name,
1592 r_symndx,
1593 (long)offset,
1594 (long)addend);
1595 #endif
1597 r = _bfd_final_link_relocate (howto,
1598 input_bfd,
1599 input_section,
1600 contents,
1601 offset,
1602 relocation,
1603 addend);
1605 if (r != bfd_reloc_ok)
1607 ret = false;
1608 switch (r)
1610 default:
1611 break;
1613 case bfd_reloc_overflow:
1615 const char *name;
1617 if (h != NULL)
1618 name = h->root.root.string;
1619 else
1621 name = bfd_elf_string_from_elf_section (input_bfd,
1622 symtab_hdr->sh_link,
1623 sym->st_name);
1624 if (name == NULL)
1625 break;
1627 if (*name == '\0')
1628 name = bfd_section_name (input_bfd, sec);
1631 (*info->callbacks->reloc_overflow) (info,
1632 name,
1633 howto->name,
1634 (bfd_vma) 0,
1635 input_bfd,
1636 input_section,
1637 offset);
1639 break;
1645 #ifdef DEBUG
1646 fprintf (stderr, "\n");
1647 #endif
1649 return ret;
1652 static void
1653 i370_elf_post_process_headers (abfd, link_info)
1654 bfd * abfd;
1655 struct bfd_link_info * link_info ATTRIBUTE_UNUSED;
1657 Elf_Internal_Ehdr * i_ehdrp; /* Elf file header, internal form */
1659 i_ehdrp = elf_elfheader (abfd);
1660 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_LINUX;
1663 #define TARGET_BIG_SYM bfd_elf32_i370_vec
1664 #define TARGET_BIG_NAME "elf32-i370"
1665 #define ELF_ARCH bfd_arch_i370
1666 #define ELF_MACHINE_CODE EM_S370
1667 #ifdef EM_I370_OLD
1668 #define ELF_MACHINE_ALT1 EM_I370_OLD
1669 #endif
1670 #define ELF_MAXPAGESIZE 0x1000
1671 #define elf_info_to_howto i370_elf_info_to_howto
1673 #define elf_backend_plt_not_loaded 1
1674 #define elf_backend_got_symbol_offset 4
1676 #define bfd_elf32_bfd_reloc_type_lookup i370_elf_reloc_type_lookup
1677 #define bfd_elf32_bfd_set_private_flags i370_elf_set_private_flags
1678 #define bfd_elf32_bfd_copy_private_bfd_data i370_elf_copy_private_bfd_data
1679 #define bfd_elf32_bfd_merge_private_bfd_data i370_elf_merge_private_bfd_data
1680 #define elf_backend_relocate_section i370_elf_relocate_section
1682 /* dynamic loader support is mostly broken; just enough here to be able to
1683 * link glibc's ld.so without errors.
1685 #define elf_backend_create_dynamic_sections i370_elf_create_dynamic_sections
1686 #define elf_backend_size_dynamic_sections i370_elf_size_dynamic_sections
1687 #define elf_backend_finish_dynamic_sections i370_elf_finish_dynamic_sections
1688 #define elf_backend_fake_sections i370_elf_fake_sections
1689 #define elf_backend_section_from_shdr i370_elf_section_from_shdr
1690 #define elf_backend_adjust_dynamic_symbol i370_elf_adjust_dynamic_symbol
1691 #define elf_backend_check_relocs i370_elf_check_relocs
1694 #define elf_backend_add_symbol_hook i370_elf_add_symbol_hook
1695 #define elf_backend_finish_dynamic_symbol i370_elf_finish_dynamic_symbol
1696 #define elf_backend_additional_program_headers i370_elf_additional_program_headers
1697 #define elf_backend_modify_segment_map i370_elf_modify_segment_map
1700 #define elf_backend_post_process_headers i370_elf_post_process_headers
1702 int i370_noop()
1704 return 1;
1707 /* we need to define these at least as no-ops to link glibc ld.so */
1709 #define elf_backend_add_symbol_hook \
1710 (boolean (*) PARAMS ((bfd *, struct bfd_link_info *, \
1711 const Elf_Internal_Sym *, const char **, flagword *, \
1712 asection **, bfd_vma *))) i370_noop
1713 #define elf_backend_finish_dynamic_symbol \
1714 (boolean (*) PARAMS ((bfd *, struct bfd_link_info *, \
1715 struct elf_link_hash_entry *, \
1716 Elf_Internal_Sym *))) i370_noop
1717 #define elf_backend_additional_program_headers \
1718 (int (*) PARAMS ((bfd *))) i370_noop
1719 #define elf_backend_modify_segment_map \
1720 (boolean (*) PARAMS ((bfd *))) i370_noop
1722 #include "elf32-target.h"