| OLD | NEW |
| 1 /* 8 and 16 bit COFF relocation functions, for BFD. | 1 /* 8 and 16 bit COFF relocation functions, for BFD. |
| 2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000, 2001, | 2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000, 2001, |
| 3 2002, 2003, 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. | 3 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2012 |
| 4 Free Software Foundation, Inc. |
| 4 Written by Cygnus Support. | 5 Written by Cygnus Support. |
| 5 | 6 |
| 6 This file is part of BFD, the Binary File Descriptor library. | 7 This file is part of BFD, the Binary File Descriptor library. |
| 7 | 8 |
| 8 This program is free software; you can redistribute it and/or modify | 9 This program is free software; you can redistribute it and/or modify |
| 9 it under the terms of the GNU General Public License as published by | 10 it under the terms of the GNU General Public License as published by |
| 10 the Free Software Foundation; either version 3 of the License, or | 11 the Free Software Foundation; either version 3 of the License, or |
| 11 (at your option) any later version. | 12 (at your option) any later version. |
| 12 | 13 |
| 13 This program is distributed in the hope that it will be useful, | 14 This program is distributed in the hope that it will be useful, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 36 | 37 |
| 37 #include "sysdep.h" | 38 #include "sysdep.h" |
| 38 #include "bfd.h" | 39 #include "bfd.h" |
| 39 #include "libbfd.h" | 40 #include "libbfd.h" |
| 40 #include "bfdlink.h" | 41 #include "bfdlink.h" |
| 41 #include "genlink.h" | 42 #include "genlink.h" |
| 42 #include "coff/internal.h" | 43 #include "coff/internal.h" |
| 43 #include "libcoff.h" | 44 #include "libcoff.h" |
| 44 | 45 |
| 45 bfd_vma | 46 bfd_vma |
| 46 bfd_coff_reloc16_get_value (reloc, link_info, input_section) | 47 bfd_coff_reloc16_get_value (arelent *reloc, |
| 47 arelent *reloc; | 48 » » » struct bfd_link_info *link_info, |
| 48 struct bfd_link_info *link_info; | 49 » » » asection *input_section) |
| 49 asection *input_section; | |
| 50 { | 50 { |
| 51 bfd_vma value; | 51 bfd_vma value; |
| 52 asymbol *symbol = *(reloc->sym_ptr_ptr); | 52 asymbol *symbol = *(reloc->sym_ptr_ptr); |
| 53 /* A symbol holds a pointer to a section, and an offset from the | 53 /* A symbol holds a pointer to a section, and an offset from the |
| 54 base of the section. To relocate, we find where the section will | 54 base of the section. To relocate, we find where the section will |
| 55 live in the output and add that in. */ | 55 live in the output and add that in. */ |
| 56 | 56 |
| 57 if (bfd_is_und_section (symbol->section) | 57 if (bfd_is_und_section (symbol->section) |
| 58 || bfd_is_com_section (symbol->section)) | 58 || bfd_is_com_section (symbol->section)) |
| 59 { | 59 { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 + symbol->section->output_section->vma; | 97 + symbol->section->output_section->vma; |
| 98 } | 98 } |
| 99 | 99 |
| 100 /* Add the value contained in the relocation. */ | 100 /* Add the value contained in the relocation. */ |
| 101 value += reloc->addend; | 101 value += reloc->addend; |
| 102 | 102 |
| 103 return value; | 103 return value; |
| 104 } | 104 } |
| 105 | 105 |
| 106 void | 106 void |
| 107 bfd_perform_slip (abfd, slip, input_section, value) | 107 bfd_perform_slip (bfd *abfd, |
| 108 bfd *abfd; | 108 » » unsigned int slip, |
| 109 unsigned int slip; | 109 » » asection *input_section, |
| 110 asection *input_section; | 110 » » bfd_vma value) |
| 111 bfd_vma value; | |
| 112 { | 111 { |
| 113 asymbol **s; | 112 asymbol **s; |
| 114 | 113 |
| 115 s = _bfd_generic_link_get_symbols (abfd); | 114 s = _bfd_generic_link_get_symbols (abfd); |
| 116 BFD_ASSERT (s != (asymbol **) NULL); | 115 BFD_ASSERT (s != (asymbol **) NULL); |
| 117 | 116 |
| 118 /* Find all symbols past this point, and make them know | 117 /* Find all symbols past this point, and make them know |
| 119 what's happened. */ | 118 what's happened. */ |
| 120 while (*s) | 119 while (*s) |
| 121 { | 120 { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 136 h->root.u.def.value -= slip; | 135 h->root.u.def.value -= slip; |
| 137 BFD_ASSERT (h->root.u.def.value == p->value); | 136 BFD_ASSERT (h->root.u.def.value == p->value); |
| 138 } | 137 } |
| 139 } | 138 } |
| 140 } | 139 } |
| 141 s++; | 140 s++; |
| 142 } | 141 } |
| 143 } | 142 } |
| 144 | 143 |
| 145 bfd_boolean | 144 bfd_boolean |
| 146 bfd_coff_reloc16_relax_section (abfd, input_section, link_info, again) | 145 bfd_coff_reloc16_relax_section (bfd *abfd, |
| 147 bfd *abfd; | 146 » » » » asection *input_section, |
| 148 asection *input_section; | 147 » » » » struct bfd_link_info *link_info, |
| 149 struct bfd_link_info *link_info; | 148 » » » » bfd_boolean *again) |
| 150 bfd_boolean *again; | |
| 151 { | 149 { |
| 152 /* Get enough memory to hold the stuff. */ | 150 /* Get enough memory to hold the stuff. */ |
| 153 bfd *input_bfd = input_section->owner; | 151 bfd *input_bfd = input_section->owner; |
| 154 unsigned *shrinks; | 152 unsigned *shrinks; |
| 155 unsigned shrink = 0; | 153 unsigned shrink = 0; |
| 156 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section); | 154 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section); |
| 157 arelent **reloc_vector = NULL; | 155 arelent **reloc_vector = NULL; |
| 158 long reloc_count; | 156 long reloc_count; |
| 159 | 157 |
| 160 if (link_info->relocatable) | 158 if (link_info->relocatable) |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 free ((char *) shrinks); | 238 free ((char *) shrinks); |
| 241 } | 239 } |
| 242 | 240 |
| 243 input_section->rawsize = input_section->size; | 241 input_section->rawsize = input_section->size; |
| 244 input_section->size -= shrink; | 242 input_section->size -= shrink; |
| 245 free ((char *) reloc_vector); | 243 free ((char *) reloc_vector); |
| 246 return TRUE; | 244 return TRUE; |
| 247 } | 245 } |
| 248 | 246 |
| 249 bfd_byte * | 247 bfd_byte * |
| 250 bfd_coff_reloc16_get_relocated_section_contents (in_abfd, | 248 bfd_coff_reloc16_get_relocated_section_contents |
| 251 » » » » » » link_info, | 249 (bfd *in_abfd, |
| 252 » » » » » » link_order, | 250 struct bfd_link_info *link_info, |
| 253 » » » » » » data, | 251 struct bfd_link_order *link_order, |
| 254 » » » » » » relocatable, | 252 bfd_byte *data, |
| 255 » » » » » » symbols) | 253 bfd_boolean relocatable, |
| 256 bfd *in_abfd; | 254 asymbol **symbols) |
| 257 struct bfd_link_info *link_info; | |
| 258 struct bfd_link_order *link_order; | |
| 259 bfd_byte *data; | |
| 260 bfd_boolean relocatable; | |
| 261 asymbol **symbols; | |
| 262 { | 255 { |
| 263 /* Get enough memory to hold the stuff. */ | 256 /* Get enough memory to hold the stuff. */ |
| 264 bfd *input_bfd = link_order->u.indirect.section->owner; | 257 bfd *input_bfd = link_order->u.indirect.section->owner; |
| 265 asection *input_section = link_order->u.indirect.section; | 258 asection *input_section = link_order->u.indirect.section; |
| 266 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section); | 259 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section); |
| 267 arelent **reloc_vector; | 260 arelent **reloc_vector; |
| 268 long reloc_count; | 261 long reloc_count; |
| 269 bfd_size_type sz; | 262 bfd_size_type sz; |
| 270 | 263 |
| 271 if (reloc_size < 0) | 264 if (reloc_size < 0) |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 { | 325 { |
| 333 bfd_coff_reloc16_extra_cases (input_bfd, link_info, link_order, | 326 bfd_coff_reloc16_extra_cases (input_bfd, link_info, link_order, |
| 334 reloc, data, &src_address, | 327 reloc, data, &src_address, |
| 335 &dst_address); | 328 &dst_address); |
| 336 } | 329 } |
| 337 } | 330 } |
| 338 } | 331 } |
| 339 free ((char *) reloc_vector); | 332 free ((char *) reloc_vector); |
| 340 return data; | 333 return data; |
| 341 } | 334 } |
| OLD | NEW |