X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Freloc.c;h=db7facdf88363cd7a602a66623e50783ee90d294;hb=0aa13feeeb78fc9323bee329c4d91c30f25de121;hp=77a04f8c0ca1882d098cf0998233c5feaf8662a8;hpb=c33205431ae179ed500f2840759a7624af1a23d4;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/reloc.c b/bfd/reloc.c index 77a04f8c0c..db7facdf88 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -1,5 +1,5 @@ /* BFD support for handling relocation entries. - Copyright 1990-2013 Free Software Foundation, Inc. + Copyright (C) 1990-2018 Free Software Foundation, Inc. Written by Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -50,6 +50,7 @@ SECTION #include "bfd.h" #include "bfdlink.h" #include "libbfd.h" +#include "bfdver.h" /* DOCDD INODE @@ -64,8 +65,9 @@ CODE_FRAGMENT . .typedef enum bfd_reloc_status .{ -. {* No errors detected. *} -. bfd_reloc_ok, +. {* No errors detected. Note - the value 2 is used so that it +. will not be mistaken for the boolean TRUE or FALSE values. *} +. bfd_reloc_ok = 2, . . {* The relocation was performed, but there was an overflow. *} . bfd_reloc_overflow, @@ -116,31 +118,31 @@ CODE_FRAGMENT /* DESCRIPTION - Here is a description of each of the fields within an <>: + Here is a description of each of the fields within an <>: - o <> + o <> - The symbol table pointer points to a pointer to the symbol - associated with the relocation request. It is the pointer - into the table returned by the back end's - <> action. @xref{Symbols}. The symbol is - referenced through a pointer to a pointer so that tools like - the linker can fix up all the symbols of the same name by - modifying only one pointer. The relocation routine looks in - the symbol and uses the base of the section the symbol is - attached to and the value of the symbol as the initial - relocation offset. If the symbol pointer is zero, then the - section provided is looked up. + The symbol table pointer points to a pointer to the symbol + associated with the relocation request. It is the pointer + into the table returned by the back end's + <> action. @xref{Symbols}. The symbol is + referenced through a pointer to a pointer so that tools like + the linker can fix up all the symbols of the same name by + modifying only one pointer. The relocation routine looks in + the symbol and uses the base of the section the symbol is + attached to and the value of the symbol as the initial + relocation offset. If the symbol pointer is zero, then the + section provided is looked up. - o <
> + o <
> - The <
> field gives the offset in bytes from the base of - the section data which owns the relocation record to the first - byte of relocatable information. The actual data relocated - will be relative to this point; for example, a relocation - type which modifies the bottom two bytes of a four byte word - would not touch the first byte pointed to in a big endian - world. + The <
> field gives the offset in bytes from the base of + the section data which owns the relocation record to the first + byte of relocatable information. The actual data relocated + will be relative to this point; for example, a relocation + type which modifies the bottom two bytes of a four byte word + would not touch the first byte pointed to in a big endian + world. o <> @@ -154,7 +156,7 @@ DESCRIPTION | return foo[0x12345678]; | } - Could be compiled into: + Could be compiled into: | linkw fp,#-4 | moveb @@#12345678,d0 @@ -162,8 +164,8 @@ DESCRIPTION | unlk fp | rts - This could create a reloc pointing to <>, but leave the - offset in the data, something like: + This could create a reloc pointing to <>, but leave the + offset in the data, something like: |RELOCATION RECORDS FOR [.text]: |offset type value @@ -175,16 +177,16 @@ DESCRIPTION |0000000c 4e5e ; unlk fp |0000000e 4e75 ; rts - Using coff and an 88k, some instructions don't have enough - space in them to represent the full address range, and - pointers have to be loaded in two parts. So you'd get something like: + Using coff and an 88k, some instructions don't have enough + space in them to represent the full address range, and + pointers have to be loaded in two parts. So you'd get something like: | or.u r13,r0,hi16(_foo+0x12345678) | ld.b r2,r13,lo16(_foo+0x12345678) | jmp r1 - This should create two relocs, both pointing to <<_foo>>, and with - 0x12340000 in their addend field. The data would consist of: + This should create two relocs, both pointing to <<_foo>>, and with + 0x12340000 in their addend field. The data would consist of: |RELOCATION RECORDS FOR [.text]: |offset type value @@ -195,18 +197,18 @@ DESCRIPTION |00000004 1c4d5678 ; ld.b r2,r13,0x5678 |00000008 f400c001 ; jmp r1 - The relocation routine digs out the value from the data, adds - it to the addend to get the original offset, and then adds the - value of <<_foo>>. Note that all 32 bits have to be kept around - somewhere, to cope with carry from bit 15 to bit 16. + The relocation routine digs out the value from the data, adds + it to the addend to get the original offset, and then adds the + value of <<_foo>>. Note that all 32 bits have to be kept around + somewhere, to cope with carry from bit 15 to bit 16. - One further example is the sparc and the a.out format. The - sparc has a similar problem to the 88k, in that some - instructions don't have room for an entire offset, but on the - sparc the parts are created in odd sized lumps. The designers of - the a.out format chose to not use the data within the section - for storing part of the offset; all the offset is kept within - the reloc. Anything in the data should be ignored. + One further example is the sparc and the a.out format. The + sparc has a similar problem to the 88k, in that some + instructions don't have room for an entire offset, but on the + sparc the parts are created in odd sized lumps. The designers of + the a.out format chose to not use the data within the section + for storing part of the offset; all the offset is kept within + the reloc. Anything in the data should be ignored. | save %sp,-112,%sp | sethi %hi(_foo+0x12345678),%g2 @@ -214,8 +216,8 @@ DESCRIPTION | ret | restore - Both relocs contain a pointer to <>, and the offsets - contain junk. + Both relocs contain a pointer to <>, and the offsets + contain junk. |RELOCATION RECORDS FOR [.text]: |offset type value @@ -228,15 +230,15 @@ DESCRIPTION |0000000c 81c7e008 ; ret |00000010 81e80000 ; restore - o <> + o <> - The <> field can be imagined as a - relocation instruction. It is a pointer to a structure which - contains information on what to do with all of the other - information in the reloc record and data section. A back end - would normally have a relocation instruction set and turn - relocations into pointers to the correct structure on input - - but it would be possible to create each howto field on demand. + The <> field can be imagined as a + relocation instruction. It is a pointer to a structure which + contains information on what to do with all of the other + information in the reloc record and data section. A back end + would normally have a relocation instruction set and turn + relocations into pointers to the correct structure on input - + but it would be possible to create each howto field on demand. */ @@ -272,10 +274,10 @@ CODE_FRAGMENT /* SUBSUBSECTION - <> + <> - The <> is a structure which contains all the - information that libbfd needs to know to tie up a back end's data. + The <> is a structure which contains all the + information that libbfd needs to know to tie up a back end's data. CODE_FRAGMENT .struct bfd_symbol; {* Forward declaration. *} @@ -383,7 +385,7 @@ DESCRIPTION .#define NEWHOWTO(FUNCTION, NAME, SIZE, REL, IN) \ . HOWTO (0, 0, SIZE, 0, REL, 0, complain_overflow_dont, FUNCTION, \ -. NAME, FALSE, 0, 0, IN) +. NAME, FALSE, 0, 0, IN) . DESCRIPTION @@ -391,25 +393,25 @@ DESCRIPTION .#define EMPTY_HOWTO(C) \ . HOWTO ((C), 0, 0, 0, FALSE, 0, complain_overflow_dont, NULL, \ -. NULL, FALSE, 0, 0, FALSE) +. NULL, FALSE, 0, 0, FALSE) . DESCRIPTION Helper routine to turn a symbol into a relocation value. -.#define HOWTO_PREPARE(relocation, symbol) \ -. { \ -. if (symbol != NULL) \ -. { \ -. if (bfd_is_com_section (symbol->section)) \ -. { \ -. relocation = 0; \ -. } \ -. else \ -. { \ -. relocation = symbol->value; \ -. } \ -. } \ +.#define HOWTO_PREPARE(relocation, symbol) \ +. { \ +. if (symbol != NULL) \ +. { \ +. if (bfd_is_com_section (symbol->section)) \ +. { \ +. relocation = 0; \ +. } \ +. else \ +. { \ +. relocation = symbol->value; \ +. } \ +. } \ . } . */ @@ -437,6 +439,7 @@ bfd_get_reloc_size (reloc_howto_type *howto) case 3: return 0; case 4: return 8; case 8: return 16; + case -1: return 2; case -2: return 4; default: abort (); } @@ -509,7 +512,7 @@ bfd_check_overflow (enum complain_overflow how, case complain_overflow_signed: /* If any sign bits are set, all sign bits must be set. That - is, A must be a valid negative address after shifting. */ + is, A must be a valid negative address after shifting. */ signmask = ~ (fieldmask >> 1); /* Fall thru */ @@ -537,17 +540,52 @@ 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. */ + +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); + + /* The reloc field must be contained entirely within the section. + Allow zero length fields (marker relocs or NONE relocs where no + relocation will be performed) at the end of the section. */ + return octet <= octet_end && octet + reloc_size <= octet_end; +} + /* FUNCTION bfd_perform_relocation SYNOPSIS bfd_reloc_status_type bfd_perform_relocation - (bfd *abfd, - arelent *reloc_entry, - void *data, - asection *input_section, - bfd *output_bfd, + (bfd *abfd, + arelent *reloc_entry, + void *data, + asection *input_section, + bfd *output_bfd, char **error_message); DESCRIPTION @@ -578,19 +616,13 @@ bfd_perform_relocation (bfd *abfd, { bfd_vma relocation; bfd_reloc_status_type flag = bfd_reloc_ok; - bfd_size_type octets = reloc_entry->address * bfd_octets_per_byte (abfd); + bfd_size_type octets; bfd_vma output_base = 0; reloc_howto_type *howto = reloc_entry->howto; asection *reloc_target_output_section; 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; - } /* If we are not producing relocatable output, return an error if the symbol is not defined. An undefined weak symbol is @@ -603,9 +635,14 @@ 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; + + /* 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); @@ -613,8 +650,20 @@ 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? */ - if (reloc_entry->address > bfd_get_section_limit (abfd, input_section)) + octets = reloc_entry->address * bfd_octets_per_byte (abfd); + 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 @@ -784,10 +833,6 @@ space consuming. For each target: } } } - else - { - reloc_entry->addend = 0; - } /* FIXME: This overflow checking is incomplete, because the value might have overflowed before we get here. For a correct check we @@ -850,23 +895,23 @@ space consuming. For each target: R result Do this: - (( i i i i i o o o o o from bfd_get - and S S S S S) to get the size offset we want - + r r r r r r r r r r) to get the final value to place - and D D D D D to chop to right size + (( i i i i i o o o o o from bfd_get + and S S S S S) to get the size offset we want + + r r r r r r r r r r) to get the final value to place + and D D D D D to chop to right size ----------------------- - = A A A A A + = A A A A A And this: - ( i i i i i o o o o o from bfd_get - and N N N N N ) get instruction + ( i i i i i o o o o o from bfd_get + and N N N N N ) get instruction ----------------------- - = B B B B B + = B B B B B And then: - ( B B B B B - or A A A A A) + ( B B B B B + or A A A A A) ----------------------- - = R R R R R R R R R R put into bfd_put + = R R R R R R R R R R put into bfd_put */ #define DOIT(x) \ @@ -942,10 +987,10 @@ FUNCTION SYNOPSIS bfd_reloc_status_type bfd_install_relocation - (bfd *abfd, - arelent *reloc_entry, - void *data, bfd_vma data_start, - asection *input_section, + (bfd *abfd, + arelent *reloc_entry, + void *data, bfd_vma data_start, + asection *input_section, char **error_message); DESCRIPTION @@ -968,7 +1013,7 @@ bfd_install_relocation (bfd *abfd, { bfd_vma relocation; bfd_reloc_status_type flag = bfd_reloc_ok; - bfd_size_type octets = reloc_entry->address * bfd_octets_per_byte (abfd); + bfd_size_type octets; bfd_vma output_base = 0; reloc_howto_type *howto = reloc_entry->howto; asection *reloc_target_output_section; @@ -976,19 +1021,18 @@ 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; + /* 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, @@ -1000,8 +1044,18 @@ 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? */ - if (reloc_entry->address > bfd_get_section_limit (abfd, input_section)) + octets = reloc_entry->address * bfd_octets_per_byte (abfd); + 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 @@ -1229,23 +1283,23 @@ space consuming. For each target: R result Do this: - (( i i i i i o o o o o from bfd_get - and S S S S S) to get the size offset we want - + r r r r r r r r r r) to get the final value to place - and D D D D D to chop to right size + (( i i i i i o o o o o from bfd_get + and S S S S S) to get the size offset we want + + r r r r r r r r r r) to get the final value to place + and D D D D D to chop to right size ----------------------- - = A A A A A + = A A A A A And this: - ( i i i i i o o o o o from bfd_get - and N N N N N ) get instruction + ( i i i i i o o o o o from bfd_get + and N N N N N ) get instruction ----------------------- - = B B B B B + = B B B B B And then: - ( B B B B B - or A A A A A) + ( B B B B B + or A A A A A) ----------------------- - = R R R R R R R R R R put into bfd_put + = R R R R R R R R R R put into bfd_put */ #define DOIT(x) \ @@ -1336,9 +1390,10 @@ _bfd_final_link_relocate (reloc_howto_type *howto, bfd_vma addend) { bfd_vma relocation; + bfd_size_type octets = address * bfd_octets_per_byte (input_bfd); /* Sanity check the address. */ - if (address > bfd_get_section_limit (input_bfd, input_section)) + 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 @@ -1366,7 +1421,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. */ @@ -1393,8 +1449,9 @@ _bfd_relocate_contents (reloc_howto_type *howto, switch (size) { default: - case 0: abort (); + case 0: + return bfd_reloc_ok; case 1: x = bfd_get_8 (input_bfd, location); break; @@ -1424,9 +1481,9 @@ _bfd_relocate_contents (reloc_howto_type *howto, bfd_vma a, b, sum; /* Get the values to be added together. For signed and unsigned - relocations, we assume that all values should be truncated to - the size of an address. For bitfields, all the bits matter. - See also bfd_check_overflow. */ + relocations, we assume that all values should be truncated to + the size of an address. For bitfields, all the bits matter. + See also bfd_check_overflow. */ fieldmask = N_ONES (howto->bitsize); signmask = ~fieldmask; addrmask = (N_ONES (bfd_arch_bits_per_address (input_bfd)) @@ -1455,11 +1512,11 @@ _bfd_relocate_contents (reloc_howto_type *howto, flag = bfd_reloc_overflow; /* We only need this next bit of code if the sign bit of B - is below the sign bit of A. This would only happen if - SRC_MASK had fewer bits than BITSIZE. Note that if - SRC_MASK has more bits than BITSIZE, we can get into - trouble; we would need to verify that B is in range, as - we do for A above. */ + is below the sign bit of A. This would only happen if + SRC_MASK had fewer bits than BITSIZE. Note that if + SRC_MASK has more bits than BITSIZE, we can get into + trouble; we would need to verify that B is in range, as + we do for A above. */ ss = ((~howto->src_mask) >> 1) & howto->src_mask; ss >>= bitpos; @@ -1470,12 +1527,12 @@ _bfd_relocate_contents (reloc_howto_type *howto, sum = a + b; /* See if the result has the correct sign. Bits above the - sign bit are junk now; ignore them. If the sum is - positive, make sure we did not have all negative inputs; - if the sum is negative, make sure we did not have all - positive inputs. The test below looks only at the sign - bits, and it really just - SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM) + sign bit are junk now; ignore them. If the sum is + positive, make sure we did not have all negative inputs; + if the sum is negative, make sure we did not have all + positive inputs. The test below looks only at the sign + bits, and it really just + SIGN (A) == SIGN (B) && SIGN (A) != SIGN (SUM) We mask with addrmask here to explicitly allow an address wrap-around. The Linux kernel relies on it, and it is @@ -1488,16 +1545,16 @@ _bfd_relocate_contents (reloc_howto_type *howto, case complain_overflow_unsigned: /* Checking for an unsigned overflow is relatively easy: - trim the addresses and add, and trim the result as well. - Overflow is normally indicated when the result does not - fit in the field. However, we also need to consider the - case when, e.g., fieldmask is 0x7fffffff or smaller, an - input is 0x80000000, and bfd_vma is only 32 bits; then we - will get sum == 0, but there is an overflow, since the - inputs did not fit in the field. Instead of doing a - separate test, we can check for this by or-ing in the - operands when testing for the sum overflowing its final - field. */ + trim the addresses and add, and trim the result as well. + Overflow is normally indicated when the result does not + fit in the field. However, we also need to consider the + case when, e.g., fieldmask is 0x7fffffff or smaller, an + input is 0x80000000, and bfd_vma is only 32 bits; then we + will get sum == 0, but there is an overflow, since the + inputs did not fit in the field. Instead of doing a + separate test, we can check for this by or-ing in the + operands when testing for the sum overflowing its final + field. */ sum = (a + b) & addrmask; if ((a | b | sum) & signmask) flag = bfd_reloc_overflow; @@ -1561,8 +1618,9 @@ _bfd_clear_contents (reloc_howto_type *howto, switch (size) { default: - case 0: abort (); + case 0: + return; case 1: x = bfd_get_8 (input_bfd, location); break; @@ -2097,9 +2155,9 @@ ENUMDOC away some literal section references. The symbol is ignored (read as the absolute section symbol), and the "addend" indicates the type of instruction using the register: - 1 - "memory" fmt insn - 2 - byte-manipulation (byte offset reg) - 3 - jsr (target of branch) + 1 - "memory" fmt insn + 2 - byte-manipulation (byte offset reg) + 3 - jsr (target of branch) ENUM BFD_RELOC_ALPHA_HINT @@ -2292,6 +2350,22 @@ 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 + BFD_RELOC_MIPS_26_PCREL_S2 +ENUMX + BFD_RELOC_MIPS_18_PCREL_S3 +ENUMX + BFD_RELOC_MIPS_19_PCREL_S2 +ENUMDOC + MIPS PC-relative relocations. + ENUM BFD_RELOC_MICROMIPS_GPREL16 ENUMX @@ -2433,6 +2507,28 @@ ENUMDOC Moxie ELF relocations. COMMENT +ENUM + BFD_RELOC_FT32_10 +ENUMX + BFD_RELOC_FT32_20 +ENUMX + BFD_RELOC_FT32_17 +ENUMX + BFD_RELOC_FT32_18 +ENUMX + BFD_RELOC_FT32_RELAX +ENUMX + BFD_RELOC_FT32_SC0 +ENUMX + BFD_RELOC_FT32_SC1 +ENUMX + BFD_RELOC_FT32_15 +ENUMX + BFD_RELOC_FT32_DIFF32 +ENUMDOC + FT32 ELF relocations. +COMMENT + ENUM BFD_RELOC_FRV_LABEL16 ENUMX @@ -2642,6 +2738,8 @@ ENUMX BFD_RELOC_386_TLS_DESC ENUMX BFD_RELOC_386_IRELATIVE +ENUMX + BFD_RELOC_386_GOT32X ENUMDOC i386/elf relocations @@ -2703,6 +2801,10 @@ ENUMX BFD_RELOC_X86_64_PC32_BND ENUMX BFD_RELOC_X86_64_PLT32_BND +ENUMX + BFD_RELOC_X86_64_GOTPCRELX +ENUMX + BFD_RELOC_X86_64_REX_GOTPCRELX ENUMDOC x86-64/elf relocations @@ -2849,6 +2951,10 @@ ENUMX BFD_RELOC_PPC_VLE_SDAREL_HA16A ENUMX BFD_RELOC_PPC_VLE_SDAREL_HA16D +ENUMX + BFD_RELOC_PPC_16DX_HA +ENUMX + BFD_RELOC_PPC_REL16DX_HA ENUMX BFD_RELOC_PPC64_HIGHER ENUMX @@ -2899,6 +3005,10 @@ ENUMX BFD_RELOC_PPC64_ADDR16_HIGH ENUMX BFD_RELOC_PPC64_ADDR16_HIGHA +ENUMX + BFD_RELOC_PPC64_ADDR64_LOCAL +ENUMX + BFD_RELOC_PPC64_ENTRY ENUMDOC Power(rs6000) and PowerPC relocations. @@ -3225,6 +3335,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 @@ -3479,18 +3600,145 @@ ENUMDOC Renesas / SuperH SH relocs. Not all of these appear in object files. ENUM - BFD_RELOC_ARC_B22_PCREL -ENUMDOC - ARC Cores relocs. - ARC 22 bit pc-relative branch. The lowest two bits must be zero and are - not stored in the instruction. The high 20 bits are installed in bits 26 - through 7 of the instruction. -ENUM - BFD_RELOC_ARC_B26 + BFD_RELOC_ARC_NONE +ENUMX + BFD_RELOC_ARC_8 +ENUMX + BFD_RELOC_ARC_16 +ENUMX + BFD_RELOC_ARC_24 +ENUMX + BFD_RELOC_ARC_32 +ENUMX + BFD_RELOC_ARC_N8 +ENUMX + BFD_RELOC_ARC_N16 +ENUMX + BFD_RELOC_ARC_N24 +ENUMX + BFD_RELOC_ARC_N32 +ENUMX + BFD_RELOC_ARC_SDA +ENUMX + BFD_RELOC_ARC_SECTOFF +ENUMX + BFD_RELOC_ARC_S21H_PCREL +ENUMX + BFD_RELOC_ARC_S21W_PCREL +ENUMX + BFD_RELOC_ARC_S25H_PCREL +ENUMX + BFD_RELOC_ARC_S25W_PCREL +ENUMX + BFD_RELOC_ARC_SDA32 +ENUMX + BFD_RELOC_ARC_SDA_LDST +ENUMX + BFD_RELOC_ARC_SDA_LDST1 +ENUMX + BFD_RELOC_ARC_SDA_LDST2 +ENUMX + BFD_RELOC_ARC_SDA16_LD +ENUMX + BFD_RELOC_ARC_SDA16_LD1 +ENUMX + BFD_RELOC_ARC_SDA16_LD2 +ENUMX + BFD_RELOC_ARC_S13_PCREL +ENUMX + BFD_RELOC_ARC_W +ENUMX + BFD_RELOC_ARC_32_ME +ENUMX + BFD_RELOC_ARC_32_ME_S +ENUMX + BFD_RELOC_ARC_N32_ME +ENUMX + BFD_RELOC_ARC_SECTOFF_ME +ENUMX + BFD_RELOC_ARC_SDA32_ME +ENUMX + BFD_RELOC_ARC_W_ME +ENUMX + BFD_RELOC_AC_SECTOFF_U8 +ENUMX + BFD_RELOC_AC_SECTOFF_U8_1 +ENUMX + BFD_RELOC_AC_SECTOFF_U8_2 +ENUMX + BFD_RELOC_AC_SECTOFF_S9 +ENUMX + BFD_RELOC_AC_SECTOFF_S9_1 +ENUMX + BFD_RELOC_AC_SECTOFF_S9_2 +ENUMX + BFD_RELOC_ARC_SECTOFF_ME_1 +ENUMX + BFD_RELOC_ARC_SECTOFF_ME_2 +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 + BFD_RELOC_ARC_GOT32 +ENUMX + BFD_RELOC_ARC_GOTPC32 +ENUMX + BFD_RELOC_ARC_PLT32 +ENUMX + BFD_RELOC_ARC_COPY +ENUMX + BFD_RELOC_ARC_GLOB_DAT +ENUMX + BFD_RELOC_ARC_JMP_SLOT +ENUMX + BFD_RELOC_ARC_RELATIVE +ENUMX + BFD_RELOC_ARC_GOTOFF +ENUMX + BFD_RELOC_ARC_GOTPC +ENUMX + BFD_RELOC_ARC_S21W_PCREL_PLT +ENUMX + BFD_RELOC_ARC_S25H_PCREL_PLT +ENUMX + BFD_RELOC_ARC_TLS_DTPMOD +ENUMX + BFD_RELOC_ARC_TLS_TPOFF +ENUMX + BFD_RELOC_ARC_TLS_GD_GOT +ENUMX + BFD_RELOC_ARC_TLS_GD_LD +ENUMX + BFD_RELOC_ARC_TLS_GD_CALL +ENUMX + BFD_RELOC_ARC_TLS_IE_GOT +ENUMX + BFD_RELOC_ARC_TLS_DTPOFF +ENUMX + BFD_RELOC_ARC_TLS_DTPOFF_S9 +ENUMX + BFD_RELOC_ARC_TLS_LE_S9 +ENUMX + BFD_RELOC_ARC_TLS_LE_32 +ENUMX + BFD_RELOC_ARC_S25W_PCREL_PLT +ENUMX + BFD_RELOC_ARC_S21H_PCREL_PLT +ENUMX + BFD_RELOC_ARC_NPS_CMEM16 +ENUMX + BFD_RELOC_ARC_JLI_SECTOFF ENUMDOC - ARC 26 bit absolute branch. The lowest two bits must be zero and are not - stored in the instruction. The high 24 bits are installed in bits 23 - through 0. + ARC relocs. ENUM BFD_RELOC_BFIN_16_IMM @@ -3839,114 +4087,430 @@ ENUMDOC ENUM - BFD_RELOC_V850_9_PCREL + BFD_RELOC_NDS32_20 ENUMDOC - This is a 9-bit reloc + NDS32 relocs. + This is a 20 bit absolute address. ENUM - BFD_RELOC_V850_22_PCREL + BFD_RELOC_NDS32_9_PCREL ENUMDOC - This is a 22-bit reloc - + This is a 9-bit pc-relative reloc with the right 1 bit assumed to be 0. ENUM - BFD_RELOC_V850_SDA_16_16_OFFSET + BFD_RELOC_NDS32_WORD_9_PCREL ENUMDOC - This is a 16 bit offset from the short data area pointer. + This is a 9-bit pc-relative reloc with the right 1 bit assumed to be 0. ENUM - BFD_RELOC_V850_SDA_15_16_OFFSET + BFD_RELOC_NDS32_15_PCREL ENUMDOC - This is a 16 bit offset (of which only 15 bits are used) from the - short data area pointer. + This is an 15-bit reloc with the right 1 bit assumed to be 0. ENUM - BFD_RELOC_V850_ZDA_16_16_OFFSET + BFD_RELOC_NDS32_17_PCREL ENUMDOC - This is a 16 bit offset from the zero data area pointer. + This is an 17-bit reloc with the right 1 bit assumed to be 0. ENUM - BFD_RELOC_V850_ZDA_15_16_OFFSET + BFD_RELOC_NDS32_25_PCREL ENUMDOC - This is a 16 bit offset (of which only 15 bits are used) from the - zero data area pointer. + This is a 25-bit reloc with the right 1 bit assumed to be 0. ENUM - BFD_RELOC_V850_TDA_6_8_OFFSET + BFD_RELOC_NDS32_HI20 ENUMDOC - This is an 8 bit offset (of which only 6 bits are used) from the - tiny data area pointer. + This is a 20-bit reloc containing the high 20 bits of an address + used with the lower 12 bits ENUM - BFD_RELOC_V850_TDA_7_8_OFFSET + BFD_RELOC_NDS32_LO12S3 ENUMDOC - This is an 8bit offset (of which only 7 bits are used) from the tiny - data area pointer. + This is a 12-bit reloc containing the lower 12 bits of an address + then shift right by 3. This is used with ldi,sdi... ENUM - BFD_RELOC_V850_TDA_7_7_OFFSET + BFD_RELOC_NDS32_LO12S2 ENUMDOC - This is a 7 bit offset from the tiny data area pointer. + This is a 12-bit reloc containing the lower 12 bits of an address + then shift left by 2. This is used with lwi,swi... ENUM - BFD_RELOC_V850_TDA_16_16_OFFSET + BFD_RELOC_NDS32_LO12S1 ENUMDOC - This is a 16 bit offset from the tiny data area pointer. -COMMENT + This is a 12-bit reloc containing the lower 12 bits of an address + then shift left by 1. This is used with lhi,shi... ENUM - BFD_RELOC_V850_TDA_4_5_OFFSET + BFD_RELOC_NDS32_LO12S0 ENUMDOC - This is a 5 bit offset (of which only 4 bits are used) from the tiny - data area pointer. + This is a 12-bit reloc containing the lower 12 bits of an address + then shift left by 0. This is used with lbisbi... ENUM - BFD_RELOC_V850_TDA_4_4_OFFSET + BFD_RELOC_NDS32_LO12S0_ORI ENUMDOC - This is a 4 bit offset from the tiny data area pointer. + This is a 12-bit reloc containing the lower 12 bits of an address + then shift left by 0. This is only used with branch relaxations ENUM - BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET + BFD_RELOC_NDS32_SDA15S3 ENUMDOC - This is a 16 bit offset from the short data area pointer, with the - bits placed non-contiguously in the instruction. + This is a 15-bit reloc containing the small data area 18-bit signed offset + and shift left by 3 for use in ldi, sdi... ENUM - BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET + BFD_RELOC_NDS32_SDA15S2 ENUMDOC - This is a 16 bit offset from the zero data area pointer, with the - bits placed non-contiguously in the instruction. + This is a 15-bit reloc containing the small data area 17-bit signed offset + and shift left by 2 for use in lwi, swi... ENUM - BFD_RELOC_V850_CALLT_6_7_OFFSET + BFD_RELOC_NDS32_SDA15S1 ENUMDOC - This is a 6 bit offset from the call table base pointer. + This is a 15-bit reloc containing the small data area 16-bit signed offset + and shift left by 1 for use in lhi, shi... ENUM - BFD_RELOC_V850_CALLT_16_16_OFFSET + BFD_RELOC_NDS32_SDA15S0 ENUMDOC - This is a 16 bit offset from the call table base pointer. + This is a 15-bit reloc containing the small data area 15-bit signed offset + and shift left by 0 for use in lbi, sbi... ENUM - BFD_RELOC_V850_LONGCALL + BFD_RELOC_NDS32_SDA16S3 ENUMDOC - Used for relaxing indirect function calls. + This is a 16-bit reloc containing the small data area 16-bit signed offset + and shift left by 3 ENUM - BFD_RELOC_V850_LONGJUMP + BFD_RELOC_NDS32_SDA17S2 ENUMDOC - Used for relaxing indirect jumps. + This is a 17-bit reloc containing the small data area 17-bit signed offset + and shift left by 2 for use in lwi.gp, swi.gp... ENUM - BFD_RELOC_V850_ALIGN + BFD_RELOC_NDS32_SDA18S1 ENUMDOC - Used to maintain alignment whilst relaxing. + This is a 18-bit reloc containing the small data area 18-bit signed offset + and shift left by 1 for use in lhi.gp, shi.gp... ENUM - BFD_RELOC_V850_LO16_SPLIT_OFFSET + BFD_RELOC_NDS32_SDA19S0 ENUMDOC - This is a variation of BFD_RELOC_LO16 that can be used in v850e ld.bu - instructions. + This is a 19-bit reloc containing the small data area 19-bit signed offset + and shift left by 0 for use in lbi.gp, sbi.gp... ENUM - BFD_RELOC_V850_16_PCREL + BFD_RELOC_NDS32_GOT20 +ENUMX + BFD_RELOC_NDS32_9_PLTREL +ENUMX + BFD_RELOC_NDS32_25_PLTREL +ENUMX + BFD_RELOC_NDS32_COPY +ENUMX + BFD_RELOC_NDS32_GLOB_DAT +ENUMX + BFD_RELOC_NDS32_JMP_SLOT +ENUMX + BFD_RELOC_NDS32_RELATIVE +ENUMX + BFD_RELOC_NDS32_GOTOFF +ENUMX + BFD_RELOC_NDS32_GOTOFF_HI20 +ENUMX + BFD_RELOC_NDS32_GOTOFF_LO12 +ENUMX + BFD_RELOC_NDS32_GOTPC20 +ENUMX + BFD_RELOC_NDS32_GOT_HI20 +ENUMX + BFD_RELOC_NDS32_GOT_LO12 +ENUMX + BFD_RELOC_NDS32_GOTPC_HI20 +ENUMX + BFD_RELOC_NDS32_GOTPC_LO12 ENUMDOC - This is a 16-bit reloc. + for PIC ENUM - BFD_RELOC_V850_17_PCREL + BFD_RELOC_NDS32_INSN16 +ENUMX + BFD_RELOC_NDS32_LABEL +ENUMX + BFD_RELOC_NDS32_LONGCALL1 +ENUMX + BFD_RELOC_NDS32_LONGCALL2 +ENUMX + BFD_RELOC_NDS32_LONGCALL3 +ENUMX + BFD_RELOC_NDS32_LONGJUMP1 +ENUMX + BFD_RELOC_NDS32_LONGJUMP2 +ENUMX + BFD_RELOC_NDS32_LONGJUMP3 +ENUMX + BFD_RELOC_NDS32_LOADSTORE +ENUMX + BFD_RELOC_NDS32_9_FIXED +ENUMX + BFD_RELOC_NDS32_15_FIXED +ENUMX + BFD_RELOC_NDS32_17_FIXED +ENUMX + BFD_RELOC_NDS32_25_FIXED +ENUMX + BFD_RELOC_NDS32_LONGCALL4 +ENUMX + BFD_RELOC_NDS32_LONGCALL5 +ENUMX + BFD_RELOC_NDS32_LONGCALL6 +ENUMX + BFD_RELOC_NDS32_LONGJUMP4 +ENUMX + BFD_RELOC_NDS32_LONGJUMP5 +ENUMX + BFD_RELOC_NDS32_LONGJUMP6 +ENUMX + BFD_RELOC_NDS32_LONGJUMP7 ENUMDOC - This is a 17-bit reloc. + for relax ENUM - BFD_RELOC_V850_23 + BFD_RELOC_NDS32_PLTREL_HI20 +ENUMX + BFD_RELOC_NDS32_PLTREL_LO12 +ENUMX + BFD_RELOC_NDS32_PLT_GOTREL_HI20 +ENUMX + BFD_RELOC_NDS32_PLT_GOTREL_LO12 ENUMDOC - This is a 23-bit reloc. + for PIC ENUM - BFD_RELOC_V850_32_PCREL + BFD_RELOC_NDS32_SDA12S2_DP +ENUMX + BFD_RELOC_NDS32_SDA12S2_SP +ENUMX + BFD_RELOC_NDS32_LO12S2_DP +ENUMX + BFD_RELOC_NDS32_LO12S2_SP ENUMDOC - This is a 32-bit reloc. + for floating point ENUM - BFD_RELOC_V850_32_ABS -ENUMDOC + BFD_RELOC_NDS32_DWARF2_OP1 +ENUMX + BFD_RELOC_NDS32_DWARF2_OP2 +ENUMX + BFD_RELOC_NDS32_DWARF2_LEB +ENUMDOC + for dwarf2 debug_line. +ENUM + BFD_RELOC_NDS32_UPDATE_TA +ENUMDOC + for eliminate 16-bit instructions +ENUM + BFD_RELOC_NDS32_PLT_GOTREL_LO20 +ENUMX + BFD_RELOC_NDS32_PLT_GOTREL_LO15 +ENUMX + BFD_RELOC_NDS32_PLT_GOTREL_LO19 +ENUMX + BFD_RELOC_NDS32_GOT_LO15 +ENUMX + BFD_RELOC_NDS32_GOT_LO19 +ENUMX + BFD_RELOC_NDS32_GOTOFF_LO15 +ENUMX + BFD_RELOC_NDS32_GOTOFF_LO19 +ENUMX + BFD_RELOC_NDS32_GOT15S2 +ENUMX + BFD_RELOC_NDS32_GOT17S2 +ENUMDOC + for PIC object relaxation +ENUM + BFD_RELOC_NDS32_5 +ENUMDOC + NDS32 relocs. + This is a 5 bit absolute address. +ENUM + BFD_RELOC_NDS32_10_UPCREL +ENUMDOC + This is a 10-bit unsigned pc-relative reloc with the right 1 bit assumed to be 0. +ENUM + BFD_RELOC_NDS32_SDA_FP7U2_RELA +ENUMDOC + If fp were omitted, fp can used as another gp. +ENUM + BFD_RELOC_NDS32_RELAX_ENTRY +ENUMX + BFD_RELOC_NDS32_GOT_SUFF +ENUMX + BFD_RELOC_NDS32_GOTOFF_SUFF +ENUMX + BFD_RELOC_NDS32_PLT_GOT_SUFF +ENUMX + BFD_RELOC_NDS32_MULCALL_SUFF +ENUMX + BFD_RELOC_NDS32_PTR +ENUMX + BFD_RELOC_NDS32_PTR_COUNT +ENUMX + BFD_RELOC_NDS32_PTR_RESOLVED +ENUMX + BFD_RELOC_NDS32_PLTBLOCK +ENUMX + BFD_RELOC_NDS32_RELAX_REGION_BEGIN +ENUMX + BFD_RELOC_NDS32_RELAX_REGION_END +ENUMX + BFD_RELOC_NDS32_MINUEND +ENUMX + BFD_RELOC_NDS32_SUBTRAHEND +ENUMX + BFD_RELOC_NDS32_DIFF8 +ENUMX + BFD_RELOC_NDS32_DIFF16 +ENUMX + BFD_RELOC_NDS32_DIFF32 +ENUMX + BFD_RELOC_NDS32_DIFF_ULEB128 +ENUMX + BFD_RELOC_NDS32_EMPTY +ENUMDOC + relaxation relative relocation types +ENUM + BFD_RELOC_NDS32_25_ABS +ENUMDOC + This is a 25 bit absolute address. +ENUM + BFD_RELOC_NDS32_DATA +ENUMX + BFD_RELOC_NDS32_TRAN +ENUMX + BFD_RELOC_NDS32_17IFC_PCREL +ENUMX + BFD_RELOC_NDS32_10IFCU_PCREL +ENUMDOC + For ex9 and ifc using. +ENUM + BFD_RELOC_NDS32_TPOFF +ENUMX + BFD_RELOC_NDS32_TLS_LE_HI20 +ENUMX + BFD_RELOC_NDS32_TLS_LE_LO12 +ENUMX + BFD_RELOC_NDS32_TLS_LE_ADD +ENUMX + BFD_RELOC_NDS32_TLS_LE_LS +ENUMX + BFD_RELOC_NDS32_GOTTPOFF +ENUMX + BFD_RELOC_NDS32_TLS_IE_HI20 +ENUMX + BFD_RELOC_NDS32_TLS_IE_LO12S2 +ENUMX + BFD_RELOC_NDS32_TLS_TPOFF +ENUMX + BFD_RELOC_NDS32_TLS_LE_20 +ENUMX + BFD_RELOC_NDS32_TLS_LE_15S0 +ENUMX + BFD_RELOC_NDS32_TLS_LE_15S1 +ENUMX + BFD_RELOC_NDS32_TLS_LE_15S2 +ENUMDOC + For TLS. + + +ENUM + BFD_RELOC_V850_9_PCREL +ENUMDOC + This is a 9-bit reloc +ENUM + BFD_RELOC_V850_22_PCREL +ENUMDOC + This is a 22-bit reloc + +ENUM + BFD_RELOC_V850_SDA_16_16_OFFSET +ENUMDOC + This is a 16 bit offset from the short data area pointer. +ENUM + BFD_RELOC_V850_SDA_15_16_OFFSET +ENUMDOC + This is a 16 bit offset (of which only 15 bits are used) from the + short data area pointer. +ENUM + BFD_RELOC_V850_ZDA_16_16_OFFSET +ENUMDOC + This is a 16 bit offset from the zero data area pointer. +ENUM + BFD_RELOC_V850_ZDA_15_16_OFFSET +ENUMDOC + This is a 16 bit offset (of which only 15 bits are used) from the + zero data area pointer. +ENUM + BFD_RELOC_V850_TDA_6_8_OFFSET +ENUMDOC + This is an 8 bit offset (of which only 6 bits are used) from the + tiny data area pointer. +ENUM + BFD_RELOC_V850_TDA_7_8_OFFSET +ENUMDOC + This is an 8bit offset (of which only 7 bits are used) from the tiny + data area pointer. +ENUM + BFD_RELOC_V850_TDA_7_7_OFFSET +ENUMDOC + This is a 7 bit offset from the tiny data area pointer. +ENUM + BFD_RELOC_V850_TDA_16_16_OFFSET +ENUMDOC + This is a 16 bit offset from the tiny data area pointer. +COMMENT +ENUM + BFD_RELOC_V850_TDA_4_5_OFFSET +ENUMDOC + This is a 5 bit offset (of which only 4 bits are used) from the tiny + data area pointer. +ENUM + BFD_RELOC_V850_TDA_4_4_OFFSET +ENUMDOC + This is a 4 bit offset from the tiny data area pointer. +ENUM + BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET +ENUMDOC + This is a 16 bit offset from the short data area pointer, with the + bits placed non-contiguously in the instruction. +ENUM + BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET +ENUMDOC + This is a 16 bit offset from the zero data area pointer, with the + bits placed non-contiguously in the instruction. +ENUM + BFD_RELOC_V850_CALLT_6_7_OFFSET +ENUMDOC + This is a 6 bit offset from the call table base pointer. +ENUM + BFD_RELOC_V850_CALLT_16_16_OFFSET +ENUMDOC + This is a 16 bit offset from the call table base pointer. +ENUM + BFD_RELOC_V850_LONGCALL +ENUMDOC + Used for relaxing indirect function calls. +ENUM + BFD_RELOC_V850_LONGJUMP +ENUMDOC + Used for relaxing indirect jumps. +ENUM + BFD_RELOC_V850_ALIGN +ENUMDOC + Used to maintain alignment whilst relaxing. +ENUM + BFD_RELOC_V850_LO16_SPLIT_OFFSET +ENUMDOC + This is a variation of BFD_RELOC_LO16 that can be used in v850e ld.bu + instructions. +ENUM + BFD_RELOC_V850_16_PCREL +ENUMDOC + This is a 16-bit reloc. +ENUM + BFD_RELOC_V850_17_PCREL +ENUMDOC + This is a 17-bit reloc. +ENUM + BFD_RELOC_V850_23 +ENUMDOC + This is a 23-bit reloc. +ENUM + BFD_RELOC_V850_32_PCREL +ENUMDOC + This is a 32-bit reloc. +ENUM + BFD_RELOC_V850_32_ABS +ENUMDOC This is a 32-bit reloc. ENUM BFD_RELOC_V850_16_SPLIT_OFFSET @@ -4510,6 +5074,133 @@ ENUM ENUMDOC This is a 8 bit reloc for the AVR that stores bits 16..23 of a symbol in .byte hlo8(symbol) +ENUM + BFD_RELOC_AVR_DIFF8 +ENUMX + BFD_RELOC_AVR_DIFF16 +ENUMX + BFD_RELOC_AVR_DIFF32 +ENUMDOC + AVR relocations to mark the difference of two local symbols. + These are only needed to support linker relaxation and can be ignored + when not relaxing. The field is set to the value of the difference + assuming no relaxation. The relocation encodes the position of the + second symbol so the linker can determine whether to adjust the field + value. +ENUM + BFD_RELOC_AVR_LDS_STS_16 +ENUMDOC + This is a 7 bit reloc for the AVR that stores SRAM address for 16bit + lds and sts instructions supported only tiny core. +ENUM + BFD_RELOC_AVR_PORT6 +ENUMDOC + This is a 6 bit reloc for the AVR that stores an I/O register + number for the IN and OUT instructions +ENUM + BFD_RELOC_AVR_PORT5 +ENUMDOC + This is a 5 bit reloc for the AVR that stores an I/O register + number for the SBIC, SBIS, SBI and CBI instructions + +ENUM + BFD_RELOC_RISCV_HI20 +ENUMX + BFD_RELOC_RISCV_PCREL_HI20 +ENUMX + BFD_RELOC_RISCV_PCREL_LO12_I +ENUMX + BFD_RELOC_RISCV_PCREL_LO12_S +ENUMX + BFD_RELOC_RISCV_LO12_I +ENUMX + BFD_RELOC_RISCV_LO12_S +ENUMX + BFD_RELOC_RISCV_GPREL12_I +ENUMX + BFD_RELOC_RISCV_GPREL12_S +ENUMX + BFD_RELOC_RISCV_TPREL_HI20 +ENUMX + BFD_RELOC_RISCV_TPREL_LO12_I +ENUMX + BFD_RELOC_RISCV_TPREL_LO12_S +ENUMX + BFD_RELOC_RISCV_TPREL_ADD +ENUMX + BFD_RELOC_RISCV_CALL +ENUMX + BFD_RELOC_RISCV_CALL_PLT +ENUMX + BFD_RELOC_RISCV_ADD8 +ENUMX + BFD_RELOC_RISCV_ADD16 +ENUMX + BFD_RELOC_RISCV_ADD32 +ENUMX + BFD_RELOC_RISCV_ADD64 +ENUMX + BFD_RELOC_RISCV_SUB8 +ENUMX + BFD_RELOC_RISCV_SUB16 +ENUMX + BFD_RELOC_RISCV_SUB32 +ENUMX + BFD_RELOC_RISCV_SUB64 +ENUMX + BFD_RELOC_RISCV_GOT_HI20 +ENUMX + BFD_RELOC_RISCV_TLS_GOT_HI20 +ENUMX + BFD_RELOC_RISCV_TLS_GD_HI20 +ENUMX + BFD_RELOC_RISCV_JMP +ENUMX + BFD_RELOC_RISCV_TLS_DTPMOD32 +ENUMX + BFD_RELOC_RISCV_TLS_DTPREL32 +ENUMX + BFD_RELOC_RISCV_TLS_DTPMOD64 +ENUMX + BFD_RELOC_RISCV_TLS_DTPREL64 +ENUMX + BFD_RELOC_RISCV_TLS_TPREL32 +ENUMX + BFD_RELOC_RISCV_TLS_TPREL64 +ENUMX + BFD_RELOC_RISCV_ALIGN +ENUMX + BFD_RELOC_RISCV_RVC_BRANCH +ENUMX + BFD_RELOC_RISCV_RVC_JUMP +ENUMX + BFD_RELOC_RISCV_RVC_LUI +ENUMX + BFD_RELOC_RISCV_GPREL_I +ENUMX + BFD_RELOC_RISCV_GPREL_S +ENUMX + BFD_RELOC_RISCV_TPREL_I +ENUMX + BFD_RELOC_RISCV_TPREL_S +ENUMX + BFD_RELOC_RISCV_RELAX +ENUMX + BFD_RELOC_RISCV_CFA +ENUMX + BFD_RELOC_RISCV_SUB6 +ENUMX + BFD_RELOC_RISCV_SET6 +ENUMX + BFD_RELOC_RISCV_SET8 +ENUMX + BFD_RELOC_RISCV_SET16 +ENUMX + BFD_RELOC_RISCV_SET32 +ENUMX + BFD_RELOC_RISCV_32_PCREL +ENUMDOC + RISC-V relocations. ENUM BFD_RELOC_RL78_NEG8 @@ -4577,6 +5268,8 @@ ENUMX BFD_RELOC_RL78_LO16 ENUMX BFD_RELOC_RL78_CODE +ENUMX + BFD_RELOC_RL78_SADDR ENUMDOC Renesas RL78 Relocations. @@ -5599,11 +6292,55 @@ ENUMDOC Intel i860 Relocations. ENUM - BFD_RELOC_OPENRISC_ABS_26 + BFD_RELOC_OR1K_REL_26 +ENUMX + BFD_RELOC_OR1K_GOTPC_HI16 +ENUMX + BFD_RELOC_OR1K_GOTPC_LO16 +ENUMX + BFD_RELOC_OR1K_GOT16 +ENUMX + BFD_RELOC_OR1K_PLT26 +ENUMX + BFD_RELOC_OR1K_GOTOFF_HI16 +ENUMX + BFD_RELOC_OR1K_GOTOFF_LO16 +ENUMX + BFD_RELOC_OR1K_COPY +ENUMX + BFD_RELOC_OR1K_GLOB_DAT ENUMX - BFD_RELOC_OPENRISC_REL_26 + BFD_RELOC_OR1K_JMP_SLOT +ENUMX + BFD_RELOC_OR1K_RELATIVE +ENUMX + BFD_RELOC_OR1K_TLS_GD_HI16 +ENUMX + BFD_RELOC_OR1K_TLS_GD_LO16 +ENUMX + BFD_RELOC_OR1K_TLS_LDM_HI16 +ENUMX + BFD_RELOC_OR1K_TLS_LDM_LO16 +ENUMX + BFD_RELOC_OR1K_TLS_LDO_HI16 +ENUMX + BFD_RELOC_OR1K_TLS_LDO_LO16 +ENUMX + BFD_RELOC_OR1K_TLS_IE_HI16 +ENUMX + BFD_RELOC_OR1K_TLS_IE_LO16 +ENUMX + BFD_RELOC_OR1K_TLS_LE_HI16 +ENUMX + BFD_RELOC_OR1K_TLS_LE_LO16 +ENUMX + BFD_RELOC_OR1K_TLS_TPOFF +ENUMX + BFD_RELOC_OR1K_TLS_DTPOFF +ENUMX + BFD_RELOC_OR1K_TLS_DTPMOD ENUMDOC - OpenRISC Relocations. + OpenRISC 1000 Relocations. ENUM BFD_RELOC_H8_DIR16A8 @@ -5797,9 +6534,93 @@ ENUMX BFD_RELOC_NIOS2_RELATIVE ENUMX BFD_RELOC_NIOS2_GOTOFF +ENUMX + BFD_RELOC_NIOS2_CALL26_NOAT +ENUMX + BFD_RELOC_NIOS2_GOT_LO +ENUMX + BFD_RELOC_NIOS2_GOT_HA +ENUMX + BFD_RELOC_NIOS2_CALL_LO +ENUMX + BFD_RELOC_NIOS2_CALL_HA +ENUMX + BFD_RELOC_NIOS2_R2_S12 +ENUMX + BFD_RELOC_NIOS2_R2_I10_1_PCREL +ENUMX + BFD_RELOC_NIOS2_R2_T1I7_1_PCREL +ENUMX + BFD_RELOC_NIOS2_R2_T1I7_2 +ENUMX + BFD_RELOC_NIOS2_R2_T2I4 +ENUMX + BFD_RELOC_NIOS2_R2_T2I4_1 +ENUMX + BFD_RELOC_NIOS2_R2_T2I4_2 +ENUMX + BFD_RELOC_NIOS2_R2_X1I7_2 +ENUMX + BFD_RELOC_NIOS2_R2_X2L5 +ENUMX + BFD_RELOC_NIOS2_R2_F1I5_2 +ENUMX + BFD_RELOC_NIOS2_R2_L5I4X1 +ENUMX + BFD_RELOC_NIOS2_R2_T1X1I6 +ENUMX + BFD_RELOC_NIOS2_R2_T1X1I6_2 ENUMDOC Relocations used by the Altera Nios II core. +ENUM + BFD_RELOC_PRU_U16 +ENUMDOC + PRU LDI 16-bit unsigned data-memory relocation. +ENUM + BFD_RELOC_PRU_U16_PMEMIMM +ENUMDOC + PRU LDI 16-bit unsigned instruction-memory relocation. +ENUM + BFD_RELOC_PRU_LDI32 +ENUMDOC + PRU relocation for two consecutive LDI load instructions that load a + 32 bit value into a register. If the higher bits are all zero, then + the second instruction may be relaxed. +ENUM + BFD_RELOC_PRU_S10_PCREL +ENUMDOC + PRU QBBx 10-bit signed PC-relative relocation. +ENUM + BFD_RELOC_PRU_U8_PCREL +ENUMDOC + PRU 8-bit unsigned relocation used for the LOOP instruction. +ENUM + BFD_RELOC_PRU_32_PMEM +ENUMX + BFD_RELOC_PRU_16_PMEM +ENUMDOC + PRU Program Memory relocations. Used to convert from byte addressing to + 32-bit word addressing. +ENUM + BFD_RELOC_PRU_GNU_DIFF8 +ENUMX + BFD_RELOC_PRU_GNU_DIFF16 +ENUMX + BFD_RELOC_PRU_GNU_DIFF32 +ENUMX + BFD_RELOC_PRU_GNU_DIFF16_PMEM +ENUMX + BFD_RELOC_PRU_GNU_DIFF32_PMEM +ENUMDOC + PRU relocations to mark the difference of two local symbols. + These are only needed to support linker relaxation and can be ignored + when not relaxing. The field is set to the value of the difference + assuming no relaxation. The relocation encodes the position of the + second symbol so the linker can determine whether to adjust the field + value. The PMEM variants encode the word difference, instead of byte + difference between symbols. + ENUM BFD_RELOC_IQ2000_OFFSET_16 ENUMX @@ -6000,6 +6821,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 @@ -6017,14 +6846,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 @@ -6038,6 +6859,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 @@ -6151,6 +6990,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 @@ -6227,6 +7070,43 @@ ENUMDOC AArch64 MOV[NZ] instruction with most significant bits 32 to 47 of a signed value. Changes instruction to MOVZ or MOVN depending on the value's sign. +ENUM + BFD_RELOC_AARCH64_MOVW_PREL_G0 +ENUMDOC + AArch64 MOV[NZ] instruction with most significant bits 0 to 15 + of a signed value. Changes instruction to MOVZ or MOVN depending on the + value's sign. +ENUM + BFD_RELOC_AARCH64_MOVW_PREL_G0_NC +ENUMDOC + AArch64 MOV[NZ] instruction with most significant bits 0 to 15 + of a signed value. Changes instruction to MOVZ or MOVN depending on the + value's sign. +ENUM + BFD_RELOC_AARCH64_MOVW_PREL_G1 +ENUMDOC + AArch64 MOVK instruction with most significant bits 16 to 31 + of a signed value. +ENUM + BFD_RELOC_AARCH64_MOVW_PREL_G1_NC +ENUMDOC + AArch64 MOVK instruction with most significant bits 16 to 31 + of a signed value. +ENUM + BFD_RELOC_AARCH64_MOVW_PREL_G2 +ENUMDOC + AArch64 MOVK instruction with most significant bits 32 to 47 + of a signed value. +ENUM + BFD_RELOC_AARCH64_MOVW_PREL_G2_NC +ENUMDOC + AArch64 MOVK instruction with most significant bits 32 to 47 + of a signed value. +ENUM + BFD_RELOC_AARCH64_MOVW_PREL_G3 +ENUMDOC + AArch64 MOVK instruction with most significant bits 47 to 63 + of a signed value. ENUM BFD_RELOC_AARCH64_LD_LO19_PCREL ENUMDOC @@ -6321,13 +7201,36 @@ ENUM ENUMDOC Unsigned 12 bit byte offset for 64 bit load/store from the page of the GOT entry for this symbol. Used in conjunction with - BFD_RELOC_AARCH64_ADR_GOTPAGE. Valid in LP64 ABI only. + BFD_RELOC_AARCH64_ADR_GOT_PAGE. Valid in LP64 ABI only. ENUM BFD_RELOC_AARCH64_LD32_GOT_LO12_NC ENUMDOC Unsigned 12 bit byte offset for 32 bit load/store from the page of the GOT entry for this symbol. Used in conjunction with - BFD_RELOC_AARCH64_ADR_GOTPAGE. Valid in ILP32 ABI only. + BFD_RELOC_AARCH64_ADR_GOT_PAGE. Valid in ILP32 ABI only. + ENUM + BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC +ENUMDOC + Unsigned 16 bit byte offset for 64 bit load/store from the GOT entry + for this symbol. Valid in LP64 ABI only. +ENUM + BFD_RELOC_AARCH64_MOVW_GOTOFF_G1 +ENUMDOC + Unsigned 16 bit byte higher offset for 64 bit load/store from the GOT entry + for this symbol. Valid in LP64 ABI only. +ENUM + BFD_RELOC_AARCH64_LD64_GOTOFF_LO15 +ENUMDOC + Unsigned 15 bit byte offset for 64 bit load/store from the page of + the GOT entry for this symbol. Valid in LP64 ABI only. +ENUM + BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14 +ENUMDOC + Scaled 14 bit byte offset to the page base of the global offset table. +ENUM + BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15 +ENUMDOC + Scaled 15 bit byte offset to the page base of the global offset table. ENUM BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21 ENUMDOC @@ -6335,6 +7238,10 @@ ENUMDOC tls_index structure as part of an adrp instruction using a 21 bit PC relative value. Used in conjunction with BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC. +ENUM + BFD_RELOC_AARCH64_TLSGD_ADR_PREL21 +ENUMDOC + AArch64 TLS General Dynamic ENUM BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC ENUMDOC @@ -6342,13 +7249,13 @@ ENUMDOC tls_index structure. Used in conjunction with BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21. ENUM - BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1 + BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC ENUMDOC - AArch64 TLS INITIAL EXEC relocation. + AArch64 TLS General Dynamic relocation. ENUM - BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC + BFD_RELOC_AARCH64_TLSGD_MOVW_G1 ENUMDOC - AArch64 TLS INITIAL EXEC relocation. + AArch64 TLS General Dynamic relocation. ENUM BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 ENUMDOC @@ -6365,6 +7272,97 @@ ENUM BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19 ENUMDOC AArch64 TLS INITIAL EXEC relocation. +ENUM + BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC +ENUMDOC + AArch64 TLS INITIAL EXEC relocation. +ENUM + BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1 +ENUMDOC + AArch64 TLS INITIAL EXEC relocation. +ENUM + BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_HI12 +ENUMDOC + bit[23:12] of byte offset to module TLS base address. +ENUM + BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12 +ENUMDOC + Unsigned 12 bit byte offset to module TLS base address. +ENUM + BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12_NC +ENUMDOC + No overflow check version of BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12. +ENUM + BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC +ENUMDOC + Unsigned 12 bit byte offset to global offset table entry for a symbols + tls_index structure. Used in conjunction with + BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21. +ENUM + BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21 +ENUMDOC + GOT entry page address for AArch64 TLS Local Dynamic, used with ADRP + instruction. +ENUM + BFD_RELOC_AARCH64_TLSLD_ADR_PREL21 +ENUMDOC + GOT entry address for AArch64 TLS Local Dynamic, used with ADR instruction. +ENUM + BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12 +ENUMDOC + bit[11:1] of byte offset to module TLS base address, encoded in ldst + instructions. +ENUM + BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC +ENUMDOC + Similar as BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12, but no overflow check. +ENUM + BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12 +ENUMDOC + bit[11:2] of byte offset to module TLS base address, encoded in ldst + instructions. +ENUM + BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC +ENUMDOC + Similar as BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12, but no overflow check. +ENUM + BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12 +ENUMDOC + bit[11:3] of byte offset to module TLS base address, encoded in ldst + instructions. +ENUM + BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC +ENUMDOC + Similar as BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12, but no overflow check. +ENUM + BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12 +ENUMDOC + bit[11:0] of byte offset to module TLS base address, encoded in ldst + instructions. +ENUM + BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC +ENUMDOC + Similar as BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12, but no overflow check. +ENUM + BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0 +ENUMDOC + bit[15:0] of byte offset to module TLS base address. +ENUM + BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0_NC +ENUMDOC + No overflow check version of BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0 +ENUM + BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1 +ENUMDOC + bit[31:16] of byte offset to module TLS base address. +ENUM + BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1_NC +ENUMDOC + No overflow check version of BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1 +ENUM + BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G2 +ENUMDOC + bit[47:32] of byte offset to module TLS base address. ENUM BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2 ENUMDOC @@ -6410,7 +7408,7 @@ ENUM ENUMDOC AArch64 TLS DESC relocation. ENUM - BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC + BFD_RELOC_AARCH64_TLSDESC_LD64_LO12 ENUMDOC AArch64 TLS DESC relocation. ENUM @@ -6418,7 +7416,7 @@ ENUM ENUMDOC AArch64 TLS DESC relocation. ENUM - BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC + BFD_RELOC_AARCH64_TLSDESC_ADD_LO12 ENUMDOC AArch64 TLS DESC relocation. ENUM @@ -6495,6 +7493,16 @@ ENUM ENUMDOC AArch64 unspecified load/store instruction, holding bits 0 to 11 of the address. Used in conjunction with BFD_RELOC_AARCH64_ADR_HI21_PCREL. +ENUM + BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12 +ENUMDOC + AArch64 pseudo relocation code for TLS local dynamic mode. It's to be + used internally by the AArch64 assembler and not (currently) written to + any object files. +ENUM + BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12_NC +ENUMDOC + Similar as BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12, but no overflow check. ENUM BFD_RELOC_AARCH64_LD_GOT_LO12_NC ENUMDOC @@ -6510,7 +7518,6 @@ ENUM ENUMDOC AArch64 pseudo relocation code to be used internally by the AArch64 assembler and not (currently) written to any object files. - ENUM BFD_RELOC_TILEPRO_COPY ENUMX @@ -6891,6 +7898,7 @@ ENUMX BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD ENUMDOC Tilera TILE-Gx Relocations. + ENUM BFD_RELOC_EPIPHANY_SIMM8 ENUMDOC @@ -6920,6 +7928,45 @@ ENUM ENUMDOC Adapteva EPIPHANY - 8 bit immediate for 16 bit mov instruction. +ENUM + BFD_RELOC_VISIUM_HI16 +ENUMX + BFD_RELOC_VISIUM_LO16 +ENUMX + BFD_RELOC_VISIUM_IM16 +ENUMX + BFD_RELOC_VISIUM_REL16 +ENUMX + BFD_RELOC_VISIUM_HI16_PCREL +ENUMX + BFD_RELOC_VISIUM_LO16_PCREL +ENUMX + BFD_RELOC_VISIUM_IM16_PCREL +ENUMDOC + Visium Relocations. + +ENUM + BFD_RELOC_WASM32_LEB128 +ENUMX + BFD_RELOC_WASM32_LEB128_GOT +ENUMX + BFD_RELOC_WASM32_LEB128_GOT_CODE +ENUMX + BFD_RELOC_WASM32_LEB128_PLT +ENUMX + BFD_RELOC_WASM32_PLT_INDEX +ENUMX + BFD_RELOC_WASM32_ABS32_CODE +ENUMX + BFD_RELOC_WASM32_COPY +ENUMX + BFD_RELOC_WASM32_CODE_POINTER +ENUMX + BFD_RELOC_WASM32_INDEX +ENUMX + BFD_RELOC_WASM32_PLT_SIG +ENUMDOC + WebAssembly relocations. ENDSENUM BFD_RELOC_UNUSED @@ -6986,13 +8033,16 @@ bfd_default_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code) { case 64: BFD_FAIL (); + break; case 32: return &bfd_howto_32; case 16: BFD_FAIL (); + break; default: BFD_FAIL (); } + break; default: BFD_FAIL (); } @@ -7041,7 +8091,7 @@ bfd_generic_relax_section (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *link_info ATTRIBUTE_UNUSED, bfd_boolean *again) { - if (link_info->relocatable) + if (bfd_link_relocatable (link_info)) (*link_info->callbacks->einfo) (_("%P%F: --relax and -r may not be used together\n")); @@ -7090,7 +8140,7 @@ bfd_generic_lookup_section_flags (struct bfd_link_info *info ATTRIBUTE_UNUSED, { if (flaginfo != NULL) { - (*_bfd_error_handler) (_("INPUT_SECTION_FLAGS are not supported.\n")); + _bfd_error_handler (_("INPUT_SECTION_FLAGS are not supported.\n")); return FALSE; } return TRUE; @@ -7157,6 +8207,9 @@ bfd_generic_get_relocated_section_contents (bfd *abfd, if (!bfd_get_full_section_contents (input_bfd, input_section, &data)) return NULL; + if (data == NULL) + return NULL; + if (reloc_size == 0) return data; @@ -7174,6 +8227,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; @@ -7181,6 +8235,17 @@ 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 + /* xgettext:c-format */ + (_("%X%P: %pB(%pA): 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; @@ -7218,26 +8283,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: @@ -7245,12 +8306,28 @@ bfd_generic_get_relocated_section_contents (bfd *abfd, complete binaries. Do not abort, but issue an error message instead. */ link_info->callbacks->einfo - (_("%X%P: %B(%A): relocation \"%R\" goes out of range\n"), + /* xgettext:c-format */ + (_("%X%P: %pB(%pA): relocation \"%pR\" goes out of range\n"), + abfd, input_section, * parent); + goto error_return; + + case bfd_reloc_notsupported: + /* PR ld/17512 + This error can result when processing a corrupt binary. + Do not abort. Issue an error message instead. */ + link_info->callbacks->einfo + /* xgettext:c-format */ + (_("%X%P: %pB(%pA): relocation \"%pR\" is not supported\n"), abfd, input_section, * parent); goto error_return; default: - abort (); + /* PR 17512; file: 90c2a92e. + Report unexpected results, without aborting. */ + link_info->callbacks->einfo + /* xgettext:c-format */ + (_("%X%P: %pB(%pA): relocation \"%pR\" returns an unrecognized value %x\n"), + abfd, input_section, * parent, r); break; } @@ -7265,3 +8342,82 @@ error_return: free (reloc_vector); return NULL; } + +/* +INTERNAL_FUNCTION + _bfd_generic_set_reloc + +SYNOPSIS + void _bfd_generic_set_reloc + (bfd *abfd, + sec_ptr section, + arelent **relptr, + unsigned int count); + +DESCRIPTION + Installs a new set of internal relocations in SECTION. +*/ + +void +_bfd_generic_set_reloc (bfd *abfd ATTRIBUTE_UNUSED, + sec_ptr section, + arelent **relptr, + unsigned int count) +{ + section->orelocation = relptr; + section->reloc_count = count; +} + +/* +INTERNAL_FUNCTION + _bfd_unrecognized_reloc + +SYNOPSIS + bfd_boolean _bfd_unrecognized_reloc + (bfd * abfd, + sec_ptr section, + unsigned int r_type); + +DESCRIPTION + Reports an unrecognized reloc. + Written as a function in order to reduce code duplication. + Returns FALSE so that it can be called from a return statement. +*/ + +bfd_boolean +_bfd_unrecognized_reloc (bfd * abfd, sec_ptr section, unsigned int r_type) +{ + /* xgettext:c-format */ + _bfd_error_handler (_("%pB: unrecognized relocation type %#x in section `%pA'"), + abfd, r_type, section); + + /* PR 21803: Suggest the most likely cause of this error. */ + _bfd_error_handler (_("Is this version of the linker - %s - out of date ?"), + BFD_VERSION_STRING); + + bfd_set_error (bfd_error_bad_value); + return FALSE; +} + +reloc_howto_type * +_bfd_norelocs_bfd_reloc_type_lookup + (bfd *abfd, + bfd_reloc_code_real_type code ATTRIBUTE_UNUSED) +{ + return (reloc_howto_type *) _bfd_ptr_bfd_null_error (abfd); +} + +reloc_howto_type * +_bfd_norelocs_bfd_reloc_name_lookup (bfd *abfd, + const char *reloc_name ATTRIBUTE_UNUSED) +{ + return (reloc_howto_type *) _bfd_ptr_bfd_null_error (abfd); +} + +long +_bfd_nodynamic_canonicalize_dynamic_reloc (bfd *abfd, + arelent **relp ATTRIBUTE_UNUSED, + asymbol **symp ATTRIBUTE_UNUSED) +{ + return _bfd_long_bfd_n1_error (abfd); +}