X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Freloc.c;h=a2bfe2b45bfb167e2a8072a235ebdc2a792b77e6;hb=f4e0d9f40b21fb42bbf7da07917683fb1cc16e8e;hp=aa3d24f272a9dd7299c0a9383692e9509887244b;hpb=56ceb5b5405af23eddd12e12d8ba849010120324;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/reloc.c b/bfd/reloc.c index aa3d24f272..a2bfe2b45b 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -1,5 +1,5 @@ /* BFD support for handling relocation entries. - Copyright (C) 1990-2015 Free Software Foundation, Inc. + Copyright (C) 1990-2016 Free Software Foundation, Inc. Written by Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -586,16 +586,6 @@ bfd_perform_relocation (bfd *abfd, asymbol *symbol; symbol = *(reloc_entry->sym_ptr_ptr); - if (bfd_is_abs_section (symbol->section) - && output_bfd != NULL) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - /* PR 17512: file: 0f67f69d. */ - if (howto == NULL) - return bfd_reloc_undefined; /* If we are not producing relocatable output, return an error if the symbol is not defined. An undefined weak symbol is @@ -608,7 +598,7 @@ bfd_perform_relocation (bfd *abfd, /* If there is a function supplied to handle this relocation type, call it. It'll return `bfd_reloc_continue' if further processing can be done. */ - if (howto->special_function) + if (howto && howto->special_function) { bfd_reloc_status_type cont; cont = howto->special_function (abfd, reloc_entry, symbol, data, @@ -618,6 +608,17 @@ bfd_perform_relocation (bfd *abfd, return cont; } + if (bfd_is_abs_section (symbol->section) + && output_bfd != NULL) + { + reloc_entry->address += input_section->output_offset; + return bfd_reloc_ok; + } + + /* PR 17512: file: 0f67f69d. */ + if (howto == NULL) + return bfd_reloc_undefined; + /* Is the address of the relocation really within the section? Include the size of the reloc in the test for out of range addresses. PR 17512: file: c146ab8b, 46dff27f, 38e53ebf. */ @@ -981,16 +982,11 @@ bfd_install_relocation (bfd *abfd, bfd_byte *data; symbol = *(reloc_entry->sym_ptr_ptr); - if (bfd_is_abs_section (symbol->section)) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } /* If there is a function supplied to handle this relocation type, call it. It'll return `bfd_reloc_continue' if further processing can be done. */ - if (howto->special_function) + if (howto && howto->special_function) { bfd_reloc_status_type cont; @@ -1005,6 +1001,15 @@ bfd_install_relocation (bfd *abfd, return cont; } + if (bfd_is_abs_section (symbol->section)) + { + reloc_entry->address += input_section->output_offset; + return bfd_reloc_ok; + } + + /* No need to check for howto != NULL if !bfd_is_abs_section as + it will have been checked in `bfd_perform_relocation already'. */ + /* Is the address of the relocation really within the section? */ octets = reloc_entry->address * bfd_octets_per_byte (abfd); if (octets + bfd_get_reloc_size (howto) @@ -1375,7 +1380,8 @@ _bfd_final_link_relocate (reloc_howto_type *howto, } return _bfd_relocate_contents (howto, input_bfd, relocation, - contents + address); + contents + + address * bfd_octets_per_byte (input_bfd)); } /* Relocate a given location using a given value and howto. */ @@ -2303,6 +2309,11 @@ ENUMX ENUMDOC microMIPS PC-relative relocations. +ENUM + BFD_RELOC_MIPS16_16_PCREL_S1 +ENUMDOC + MIPS16 PC-relative relocation. + ENUM BFD_RELOC_MIPS_21_PCREL_S2 ENUMX @@ -2889,6 +2900,8 @@ ENUMX BFD_RELOC_PPC_VLE_SDAREL_HA16A ENUMX BFD_RELOC_PPC_VLE_SDAREL_HA16D +ENUMX + BFD_RELOC_PPC_REL16DX_HA ENUMX BFD_RELOC_PPC64_HIGHER ENUMX @@ -2941,6 +2954,8 @@ ENUMX BFD_RELOC_PPC64_ADDR16_HIGHA ENUMX BFD_RELOC_PPC64_ADDR64_LOCAL +ENUMX + BFD_RELOC_PPC64_ENTRY ENUMDOC Power(rs6000) and PowerPC relocations. @@ -3267,6 +3282,17 @@ ENUM ENUMDOC ARM support for STT_GNU_IFUNC. +ENUM + BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC +ENUMX + BFD_RELOC_ARM_THUMB_ALU_ABS_G1_NC +ENUMX + BFD_RELOC_ARM_THUMB_ALU_ABS_G2_NC +ENUMX + BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC +ENUMDOC + Thumb1 relocations to support execute-only code. + ENUM BFD_RELOC_ARM_IMMEDIATE ENUMX @@ -3587,11 +3613,11 @@ ENUMX ENUMX BFD_RELOC_AC_SECTOFF_U8_2 ENUMX - BFD_RELOC_AC_SECTFOFF_S9 + BFD_RELOC_AC_SECTOFF_S9 ENUMX - BFD_RELOC_AC_SECTFOFF_S9_1 + BFD_RELOC_AC_SECTOFF_S9_1 ENUMX - BFD_RELOC_AC_SECTFOFF_S9_2 + BFD_RELOC_AC_SECTOFF_S9_2 ENUMX BFD_RELOC_ARC_SECTOFF_ME_1 ENUMX @@ -3600,8 +3626,12 @@ ENUMX BFD_RELOC_ARC_SECTOFF_1 ENUMX BFD_RELOC_ARC_SECTOFF_2 +ENUMX + BFD_RELOC_ARC_SDA_12 ENUMX BFD_RELOC_ARC_SDA16_ST2 +ENUMX + BFD_RELOC_ARC_32_PCREL ENUMX BFD_RELOC_ARC_PC32 ENUMX @@ -3650,6 +3680,8 @@ ENUMX BFD_RELOC_ARC_S25W_PCREL_PLT ENUMX BFD_RELOC_ARC_S21H_PCREL_PLT +ENUMX + BFD_RELOC_ARC_NPS_CMEM16 ENUMDOC ARC relocs. @@ -6586,6 +6618,14 @@ ENUM BFD_RELOC_MACH_O_PAIR ENUMDOC Pair of relocation. Contains the first symbol. +ENUM + BFD_RELOC_MACH_O_SUBTRACTOR32 +ENUMDOC + Symbol will be substracted. Must be followed by a BFD_RELOC_32. +ENUM + BFD_RELOC_MACH_O_SUBTRACTOR64 +ENUMDOC + Symbol will be substracted. Must be followed by a BFD_RELOC_64. ENUM BFD_RELOC_MACH_O_X86_64_BRANCH32 @@ -6603,14 +6643,6 @@ ENUM ENUMDOC Used when loading a GOT entry with movq. It is specially marked so that the linker could optimize the movq to a leaq if possible. -ENUM - BFD_RELOC_MACH_O_X86_64_SUBTRACTOR32 -ENUMDOC - Symbol will be substracted. Must be followed by a BFD_RELOC_64. -ENUM - BFD_RELOC_MACH_O_X86_64_SUBTRACTOR64 -ENUMDOC - Symbol will be substracted. Must be followed by a BFD_RELOC_64. ENUM BFD_RELOC_MACH_O_X86_64_PCREL32_1 ENUMDOC @@ -6624,6 +6656,24 @@ ENUM ENUMDOC Same as BFD_RELOC_32_PCREL but with an implicit -4 addend. + +ENUM + BFD_RELOC_MACH_O_ARM64_ADDEND +ENUMDOC + Addend for PAGE or PAGEOFF. +ENUM + BFD_RELOC_MACH_O_ARM64_GOT_LOAD_PAGE21 +ENUMDOC + Relative offset to page of GOT slot. +ENUM + BFD_RELOC_MACH_O_ARM64_GOT_LOAD_PAGEOFF12 +ENUMDOC + Relative offset within page of GOT slot. +ENUM + BFD_RELOC_MACH_O_ARM64_POINTER_TO_GOT +ENUMDOC + Address of a GOT entry. + ENUM BFD_RELOC_MICROBLAZE_32_LO ENUMDOC @@ -6737,6 +6787,10 @@ ENUMDOC relocation enumerators. N.B. the order of the enumerators is important as several tables in the AArch64 bfd backend are indexed by these enumerators; make sure they are all synced. +ENUM + BFD_RELOC_AARCH64_NULL +ENUMDOC + Deprecated AArch64 null relocation code. ENUM BFD_RELOC_AARCH64_NONE ENUMDOC @@ -7904,6 +7958,7 @@ bfd_generic_get_relocated_section_contents (bfd *abfd, if (reloc_count > 0) { arelent **parent; + for (parent = reloc_vector; *parent != NULL; parent++) { char *error_message = NULL; @@ -7911,6 +7966,16 @@ bfd_generic_get_relocated_section_contents (bfd *abfd, bfd_reloc_status_type r; symbol = *(*parent)->sym_ptr_ptr; + /* PR ld/19628: A specially crafted input file + can result in a NULL symbol pointer here. */ + if (symbol == NULL) + { + link_info->callbacks->einfo + (_("%X%P: %B(%A): error: relocation for offset %V has no value\n"), + abfd, input_section, (* parent)->address); + goto error_return; + } + if (symbol->section && discarded_section (symbol->section)) { bfd_byte *p; @@ -7948,26 +8013,22 @@ bfd_generic_get_relocated_section_contents (bfd *abfd, switch (r) { case bfd_reloc_undefined: - if (!((*link_info->callbacks->undefined_symbol) - (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr), - input_bfd, input_section, (*parent)->address, - TRUE))) - goto error_return; + (*link_info->callbacks->undefined_symbol) + (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr), + input_bfd, input_section, (*parent)->address, TRUE); break; case bfd_reloc_dangerous: BFD_ASSERT (error_message != NULL); - if (!((*link_info->callbacks->reloc_dangerous) - (link_info, error_message, input_bfd, input_section, - (*parent)->address))) - goto error_return; + (*link_info->callbacks->reloc_dangerous) + (link_info, error_message, + input_bfd, input_section, (*parent)->address); break; case bfd_reloc_overflow: - if (!((*link_info->callbacks->reloc_overflow) - (link_info, NULL, - bfd_asymbol_name (*(*parent)->sym_ptr_ptr), - (*parent)->howto->name, (*parent)->addend, - input_bfd, input_section, (*parent)->address))) - goto error_return; + (*link_info->callbacks->reloc_overflow) + (link_info, NULL, + bfd_asymbol_name (*(*parent)->sym_ptr_ptr), + (*parent)->howto->name, (*parent)->addend, + input_bfd, input_section, (*parent)->address); break; case bfd_reloc_outofrange: /* PR ld/13730: