diff options
Diffstat (limited to 'bfd/reloc.c')
-rw-r--r-- | bfd/reloc.c | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/bfd/reloc.c b/bfd/reloc.c index 7ee7844..0fe93be 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -540,12 +540,31 @@ bfd_check_overflow (enum complain_overflow how, return flag; } +/* +FUNCTION + bfd_reloc_offset_in_range + +SYNOPSIS + bfd_boolean bfd_reloc_offset_in_range + (reloc_howto_type *howto, + bfd *abfd, + asection *section, + bfd_size_type offset); + +DESCRIPTION + Returns TRUE if the reloc described by @var{HOWTO} can be + applied at @var{OFFSET} octets in @var{SECTION}. + +*/ + /* HOWTO describes a relocation, at offset OCTET. Return whether the relocation field is within SECTION of ABFD. */ -static bfd_boolean -reloc_offset_in_range (reloc_howto_type *howto, bfd *abfd, - asection *section, bfd_size_type octet) +bfd_boolean +bfd_reloc_offset_in_range (reloc_howto_type *howto, + bfd *abfd, + asection *section, + bfd_size_type octet) { bfd_size_type octet_end = bfd_get_section_limit_octets (abfd, section); bfd_size_type reloc_size = bfd_get_reloc_size (howto); @@ -619,6 +638,11 @@ bfd_perform_relocation (bfd *abfd, if (howto && howto->special_function) { bfd_reloc_status_type cont; + + /* Note - we do not call bfd_reloc_offset_in_range here as the + reloc_entry->address field might actually be valid for the + backend concerned. It is up to the special_function itself + to call bfd_reloc_offset_in_range if needed. */ cont = howto->special_function (abfd, reloc_entry, symbol, data, input_section, output_bfd, error_message); @@ -639,7 +663,7 @@ bfd_perform_relocation (bfd *abfd, /* Is the address of the relocation really within the section? */ octets = reloc_entry->address * bfd_octets_per_byte (abfd); - if (!reloc_offset_in_range (howto, abfd, input_section, octets)) + if (!bfd_reloc_offset_in_range (howto, abfd, input_section, octets)) return bfd_reloc_outofrange; /* Work out which section the relocation is targeted at and the @@ -1005,6 +1029,10 @@ bfd_install_relocation (bfd *abfd, { bfd_reloc_status_type cont; + /* Note - we do not call bfd_reloc_offset_in_range here as the + reloc_entry->address field might actually be valid for the + backend concerned. It is up to the special_function itself + to call bfd_reloc_offset_in_range if needed. */ /* XXX - The special_function calls haven't been fixed up to deal with creating new relocations and section contents. */ cont = howto->special_function (abfd, reloc_entry, symbol, @@ -1027,7 +1055,7 @@ bfd_install_relocation (bfd *abfd, /* Is the address of the relocation really within the section? */ octets = reloc_entry->address * bfd_octets_per_byte (abfd); - if (!reloc_offset_in_range (howto, abfd, input_section, octets)) + if (!bfd_reloc_offset_in_range (howto, abfd, input_section, octets)) return bfd_reloc_outofrange; /* Work out which section the relocation is targeted at and the @@ -1365,7 +1393,7 @@ _bfd_final_link_relocate (reloc_howto_type *howto, bfd_size_type octets = address * bfd_octets_per_byte (input_bfd); /* Sanity check the address. */ - if (!reloc_offset_in_range (howto, input_bfd, input_section, octets)) + if (!bfd_reloc_offset_in_range (howto, input_bfd, input_section, octets)) return bfd_reloc_outofrange; /* This function assumes that we are dealing with a basic relocation |