@@ -3313,6 +3313,9 @@ enum bfd_reloc_code_real
BFD_RELOC_HI16_PLTOFF,
BFD_RELOC_HI16_S_PLTOFF,
BFD_RELOC_8_PLTOFF,
+ BFD_RELOC_LO16_GOTOFF_CALL,
+ BFD_RELOC_HI16_GOTOFF_CALL,
+ BFD_RELOC_HI16_S_GOTOFF_CALL,
/* Size relocations. */
BFD_RELOC_SIZE32,
@@ -809,6 +809,62 @@ static reloc_howto_type elf_mips_howto_table_rel[] =
0x0000ffff, /* src_mask */
0x0000ffff, /* dst_mask */
true), /* pcrel_offset */
+
+ HOWTO (R_MIPS_GOTPC_HI16, /* type */
+ 16, /* rightshift */
+ 4, /* size */
+ 16, /* bitsize */
+ true, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed, /* complain_on_overflow */
+ _bfd_mips_elf_generic_reloc, /* special_function */
+ "R_MIPS_GOTPC_HI16", /* name */
+ true, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ true), /* pcrel_offset */
+
+ HOWTO (R_MIPS_GOTPC_LO16, /* type */
+ 0, /* rightshift */
+ 4, /* size */
+ 16, /* bitsize */
+ true, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ _bfd_mips_elf_generic_reloc, /* special_function */
+ "R_MIPS_GOTPC_LO16", /* name */
+ true, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ true), /* pcrel_offset */
+
+ HOWTO (R_MIPS_GOTPC_CALL_HI16, /* type */
+ 16, /* rightshift */
+ 4, /* size */
+ 16, /* bitsize */
+ true, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed, /* complain_on_overflow */
+ _bfd_mips_elf_generic_reloc, /* special_function */
+ "R_MIPS_GOTPC_CALL_HI16", /* name */
+ true, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ true), /* pcrel_offset */
+
+ HOWTO (R_MIPS_GOTPC_CALL_LO16, /* type */
+ 0, /* rightshift */
+ 4, /* size */
+ 16, /* bitsize */
+ true, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ _bfd_mips_elf_generic_reloc, /* special_function */
+ "R_MIPS_GOTPC_CALL_LO16", /* name */
+ true, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ true), /* pcrel_offset */
};
/* The reloc used for BFD_RELOC_CTOR when doing a 64 bit link. This
@@ -2030,7 +2086,11 @@ static const struct elf_reloc_map mips_reloc_map[] =
{ BFD_RELOC_MIPS_18_PCREL_S3, R_MIPS_PC18_S3 },
{ BFD_RELOC_MIPS_19_PCREL_S2, R_MIPS_PC19_S2 },
{ BFD_RELOC_HI16_S_PCREL, R_MIPS_PCHI16 },
- { BFD_RELOC_LO16_PCREL, R_MIPS_PCLO16 }
+ { BFD_RELOC_LO16_PCREL, R_MIPS_PCLO16 },
+ { BFD_RELOC_HI16_S_GOTOFF, R_MIPS_GOTPC_HI16 },
+ { BFD_RELOC_LO16_GOTOFF, R_MIPS_GOTPC_LO16 },
+ { BFD_RELOC_HI16_S_GOTOFF_CALL, R_MIPS_GOTPC_CALL_HI16 },
+ { BFD_RELOC_LO16_GOTOFF_CALL, R_MIPS_GOTPC_CALL_LO16 }
};
static const struct elf_reloc_map mips16_reloc_map[] =
@@ -889,6 +889,62 @@ static reloc_howto_type mips_elf64_howto_table_rel[] =
0x0000ffff, /* dst_mask */
true), /* pcrel_offset */
+ HOWTO (R_MIPS_GOTPC_HI16, /* type */
+ 16, /* rightshift */
+ 4, /* size */
+ 16, /* bitsize */
+ true, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed, /* complain_on_overflow */
+ _bfd_mips_elf_generic_reloc, /* special_function */
+ "R_MIPS_GOTPC_HI16", /* name */
+ true, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ true), /* pcrel_offset */
+
+ HOWTO (R_MIPS_GOTPC_LO16, /* type */
+ 0, /* rightshift */
+ 4, /* size */
+ 16, /* bitsize */
+ true, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ _bfd_mips_elf_generic_reloc, /* special_function */
+ "R_MIPS_GOTPC_LO16", /* name */
+ true, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ true), /* pcrel_offset */
+
+ HOWTO (R_MIPS_GOTPC_CALL_HI16, /* type */
+ 16, /* rightshift */
+ 4, /* size */
+ 16, /* bitsize */
+ true, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed, /* complain_on_overflow */
+ _bfd_mips_elf_generic_reloc, /* special_function */
+ "R_MIPS_GOTPC_CALL_HI16", /* name */
+ true, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ true), /* pcrel_offset */
+
+ HOWTO (R_MIPS_GOTPC_CALL_LO16, /* type */
+ 0, /* rightshift */
+ 4, /* size */
+ 16, /* bitsize */
+ true, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ _bfd_mips_elf_generic_reloc, /* special_function */
+ "R_MIPS_GOTPC_CALL_LO16", /* name */
+ true, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ true), /* pcrel_offset */
+
};
/* The relocation table used for SHT_RELA sections. */
@@ -3743,7 +3799,11 @@ static const struct elf_reloc_map mips_reloc_map[] =
{ BFD_RELOC_MIPS_18_PCREL_S3, R_MIPS_PC18_S3 },
{ BFD_RELOC_MIPS_19_PCREL_S2, R_MIPS_PC19_S2 },
{ BFD_RELOC_HI16_S_PCREL, R_MIPS_PCHI16 },
- { BFD_RELOC_LO16_PCREL, R_MIPS_PCLO16 }
+ { BFD_RELOC_LO16_PCREL, R_MIPS_PCLO16 },
+ { BFD_RELOC_HI16_S_GOTOFF, R_MIPS_GOTPC_HI16 },
+ { BFD_RELOC_LO16_GOTOFF, R_MIPS_GOTPC_LO16 },
+ { BFD_RELOC_HI16_S_GOTOFF_CALL, R_MIPS_GOTPC_CALL_HI16 },
+ { BFD_RELOC_LO16_GOTOFF_CALL, R_MIPS_GOTPC_CALL_LO16 }
};
static const struct elf_reloc_map mips16_reloc_map[] =
@@ -868,6 +868,62 @@ static reloc_howto_type elf_mips_howto_table_rel[] =
0x0000ffff, /* dst_mask */
true), /* pcrel_offset */
+ HOWTO (R_MIPS_GOTPC_HI16, /* type */
+ 16, /* rightshift */
+ 4, /* size */
+ 16, /* bitsize */
+ true, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed, /* complain_on_overflow */
+ _bfd_mips_elf_generic_reloc, /* special_function */
+ "R_MIPS_GOTPC_HI16", /* name */
+ true, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ true), /* pcrel_offset */
+
+ HOWTO (R_MIPS_GOTPC_LO16, /* type */
+ 0, /* rightshift */
+ 4, /* size */
+ 16, /* bitsize */
+ true, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ _bfd_mips_elf_generic_reloc, /* special_function */
+ "R_MIPS_GOTPC_LO16", /* name */
+ true, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ true), /* pcrel_offset */
+
+ HOWTO (R_MIPS_GOTPC_CALL_HI16, /* type */
+ 16, /* rightshift */
+ 4, /* size */
+ 16, /* bitsize */
+ true, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_signed, /* complain_on_overflow */
+ _bfd_mips_elf_generic_reloc, /* special_function */
+ "R_MIPS_GOTPC_CALL_HI16", /* name */
+ true, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ true), /* pcrel_offset */
+
+ HOWTO (R_MIPS_GOTPC_CALL_LO16, /* type */
+ 0, /* rightshift */
+ 4, /* size */
+ 16, /* bitsize */
+ true, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_dont, /* complain_on_overflow */
+ _bfd_mips_elf_generic_reloc, /* special_function */
+ "R_MIPS_GOTPC_CALL_LO16", /* name */
+ true, /* partial_inplace */
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ true), /* pcrel_offset */
+
};
/* The relocation table used for SHT_RELA sections. */
@@ -3577,7 +3633,11 @@ static const struct elf_reloc_map mips_reloc_map[] =
{ BFD_RELOC_MIPS_18_PCREL_S3, R_MIPS_PC18_S3 },
{ BFD_RELOC_MIPS_19_PCREL_S2, R_MIPS_PC19_S2 },
{ BFD_RELOC_HI16_S_PCREL, R_MIPS_PCHI16 },
- { BFD_RELOC_LO16_PCREL, R_MIPS_PCLO16 }
+ { BFD_RELOC_LO16_PCREL, R_MIPS_PCLO16 },
+ { BFD_RELOC_HI16_S_GOTOFF, R_MIPS_GOTPC_HI16 },
+ { BFD_RELOC_LO16_GOTOFF, R_MIPS_GOTPC_LO16 },
+ { BFD_RELOC_HI16_S_GOTOFF_CALL, R_MIPS_GOTPC_CALL_HI16 },
+ { BFD_RELOC_LO16_GOTOFF_CALL, R_MIPS_GOTPC_CALL_LO16 }
};
static const struct elf_reloc_map mips16_reloc_map[] =
@@ -2267,19 +2267,25 @@ got_page_reloc_p (unsigned int r_type)
static inline bool
got_lo16_reloc_p (unsigned int r_type)
{
- return r_type == R_MIPS_GOT_LO16 || r_type == R_MICROMIPS_GOT_LO16;
+ return r_type == R_MIPS_GOT_LO16
+ || r_type == R_MIPS_GOTPC_LO16
+ || r_type == R_MICROMIPS_GOT_LO16;
}
static inline bool
call_hi16_reloc_p (unsigned int r_type)
{
- return r_type == R_MIPS_CALL_HI16 || r_type == R_MICROMIPS_CALL_HI16;
+ return r_type == R_MIPS_CALL_HI16
+ || r_type == R_MIPS_GOTPC_CALL_HI16
+ || r_type == R_MICROMIPS_CALL_HI16;
}
static inline bool
call_lo16_reloc_p (unsigned int r_type)
{
- return r_type == R_MIPS_CALL_LO16 || r_type == R_MICROMIPS_CALL_LO16;
+ return r_type == R_MIPS_CALL_LO16
+ || r_type == R_MIPS_GOTPC_CALL_LO16
+ || r_type == R_MICROMIPS_CALL_LO16;
}
static inline bool
@@ -5241,6 +5247,21 @@ mips_elf_highest (bfd_vma value ATTRIBUTE_UNUSED)
return MINUS_ONE;
#endif
}
+
+/**/
+static bfd_vma
+mips_elf_16bit_align(bfd_vma value, bfd_vma p, bool hi)
+{
+ bfd_vma value_lo = (value & 0xffff) + (p & 0xffff);
+ bfd_vma value_hi = (value >> 16) & 0xffff;
+ value_hi += mips_elf_high (value_lo);
+ value_lo &= 0xffff;
+ if (hi)
+ return value_hi;
+ else
+ return value_lo;
+}
+
/* Create the .compact_rel section. */
@@ -5888,6 +5909,8 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
case R_MIPS_GOT_DISP:
case R_MIPS_GOT_LO16:
case R_MIPS_CALL_LO16:
+ case R_MIPS_GOTPC_LO16:
+ case R_MIPS_GOTPC_CALL_LO16:
case R_MICROMIPS_CALL16:
case R_MICROMIPS_GOT16:
case R_MICROMIPS_GOT_PAGE:
@@ -5905,6 +5928,8 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
/* Fall through. */
case R_MIPS_GOT_HI16:
case R_MIPS_CALL_HI16:
+ case R_MIPS_GOTPC_HI16:
+ case R_MIPS_GOTPC_CALL_HI16:
case R_MICROMIPS_GOT_HI16:
case R_MICROMIPS_CALL_HI16:
if (resolved_to_zero
@@ -5952,6 +5977,10 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
case R_MIPS_CALL_HI16:
case R_MIPS_GOT_LO16:
case R_MIPS_CALL_LO16:
+ case R_MIPS_GOTPC_HI16:
+ case R_MIPS_GOTPC_LO16:
+ case R_MIPS_GOTPC_CALL_HI16:
+ case R_MIPS_GOTPC_CALL_LO16:
case R_MICROMIPS_CALL16:
case R_MICROMIPS_GOT16:
case R_MICROMIPS_GOT_DISP:
@@ -6413,6 +6442,37 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
value &= howto->dst_mask;
break;
+ /* Pre-R6, we use
+ bal . + 8
+ lui $2,%gotpc_hi(sym)
+ addu $2,$2,$ra
+ lw $2,%gotpc_lo(sym)
+ In this case, the LO should +=4, and HI should -=4.
+
+ For R6+, we use
+ aluipc $2,%gotpc_hi(sym)
+ lw $2,%gotpc_lo(sym)($2)
+ In this case, the HI is OK, while LO should +4 and add the page_offet */
+ case R_MIPS_GOTPC_HI16:
+ case R_MIPS_GOTPC_CALL_HI16:
+ if (MIPSR6_P (abfd))
+ value = mips_elf_16bit_align (addend + gp - p + g, p, true);
+ else
+ value = mips_elf_high (addend + gp - p + g - 4);
+ value &= howto->dst_mask;
+ break;
+
+ case R_MIPS_GOTPC_LO16:
+ case R_MIPS_GOTPC_CALL_LO16:
+ if (howto->partial_inplace)
+ addend = _bfd_mips_elf_sign_extend (addend, 16);
+ if (MIPSR6_P (abfd))
+ value = mips_elf_16bit_align (addend + gp - p + g, p, false);
+ else
+ value = addend + gp - p + g + 4;
+ value &= howto->dst_mask;
+ break;
+
case R_MIPS_PCHI16:
value = mips_elf_high (symbol + addend - p);
value &= howto->dst_mask;
@@ -8282,6 +8342,10 @@ mips_elf_add_lo16_rel_addend (bfd *abfd,
lo16_type = R_MIPS16_LO16;
else if (micromips_reloc_p (r_type))
lo16_type = R_MICROMIPS_LO16;
+ else if (r_type == R_MIPS_GOTPC_HI16)
+ lo16_type = R_MIPS_GOTPC_LO16;
+ else if (r_type == R_MIPS_GOTPC_CALL_HI16)
+ lo16_type = R_MIPS_GOTPC_CALL_LO16;
else if (r_type == R_MIPS_PCHI16)
lo16_type = R_MIPS_PCLO16;
else
@@ -8742,6 +8806,8 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
case R_MIPS_CALL16:
case R_MIPS_CALL_HI16:
case R_MIPS_CALL_LO16:
+ case R_MIPS_GOTPC_CALL_HI16:
+ case R_MIPS_GOTPC_CALL_LO16:
case R_MIPS16_CALL16:
case R_MICROMIPS_CALL16:
case R_MICROMIPS_CALL_HI16:
@@ -8751,6 +8817,7 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
case R_MIPS_GOT16:
case R_MIPS_GOT_LO16:
+ case R_MIPS_GOTPC_LO16:
case R_MIPS_GOT_PAGE:
case R_MIPS_GOT_DISP:
case R_MIPS16_GOT16:
@@ -8788,6 +8855,7 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
/* Fall through. */
case R_MIPS_GOT_HI16:
+ case R_MIPS_GOTPC_HI16:
case R_MIPS_GOT_OFST:
case R_MIPS_TLS_GOTTPREL:
case R_MIPS_TLS_GD:
@@ -8958,6 +9026,8 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
case R_MIPS_CALL_HI16:
case R_MIPS_CALL_LO16:
+ case R_MIPS_GOTPC_CALL_HI16:
+ case R_MIPS_GOTPC_CALL_LO16:
case R_MICROMIPS_CALL_HI16:
case R_MICROMIPS_CALL_LO16:
if (h != NULL)
@@ -8983,6 +9053,8 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
case R_MIPS_GOT16:
case R_MIPS_GOT_HI16:
case R_MIPS_GOT_LO16:
+ case R_MIPS_GOTPC_HI16:
+ case R_MIPS_GOTPC_LO16:
case R_MICROMIPS_GOT16:
case R_MICROMIPS_GOT_HI16:
case R_MICROMIPS_GOT_LO16:
@@ -1084,6 +1084,9 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
"BFD_RELOC_HI16_PLTOFF",
"BFD_RELOC_HI16_S_PLTOFF",
"BFD_RELOC_8_PLTOFF",
+ "BFD_RELOC_LO16_GOTOFF_CALL",
+ "BFD_RELOC_HI16_GOTOFF_CALL",
+ "BFD_RELOC_HI16_S_GOTOFF_CALL",
"BFD_RELOC_SIZE32",
"BFD_RELOC_SIZE64",
"BFD_RELOC_68K_GLOB_DAT",
@@ -1470,6 +1470,12 @@ ENUMX
BFD_RELOC_HI16_S_PLTOFF
ENUMX
BFD_RELOC_8_PLTOFF
+ENUMX
+ BFD_RELOC_LO16_GOTOFF_CALL
+ENUMX
+ BFD_RELOC_HI16_GOTOFF_CALL
+ENUMX
+ BFD_RELOC_HI16_S_GOTOFF_CALL
ENUMDOC
For ELF.
@@ -104,6 +104,8 @@ enum
R_MIPS_PC19_S2 = 63,
R_MIPS_PCHI16 = 64,
R_MIPS_PCLO16 = 65,
+ R_MIPS_GOTPC_HI16 = 66,
+ R_MIPS_GOTPC_LO16 = 67,
// These relocs are used for the mips16.
R_MIPS16_26 = 100,
R_MIPS16_GPREL = 101,
@@ -4370,7 +4370,11 @@ limited_pcrel_reloc_p (bfd_reloc_code_real_type reloc)
return true;
case BFD_RELOC_32_PCREL:
+ case BFD_RELOC_HI16_S_GOTOFF:
+ case BFD_RELOC_LO16_GOTOFF:
case BFD_RELOC_HI16_S_PCREL:
+ case BFD_RELOC_LO16_GOTOFF_CALL:
+ case BFD_RELOC_HI16_S_GOTOFF_CALL:
case BFD_RELOC_LO16_PCREL:
return HAVE_64BIT_ADDRESSES;
@@ -7432,6 +7436,7 @@ calculate_reloc (bfd_reloc_code_real_type reloc, offsetT operand,
case BFD_RELOC_HI16_S:
case BFD_RELOC_HI16_S_PCREL:
+ case BFD_RELOC_HI16_S_GOTOFF:
case BFD_RELOC_MICROMIPS_HI16_S:
case BFD_RELOC_MIPS16_HI16_S:
*result = ((operand + 0x8000) >> 16) & 0xffff;
@@ -7445,6 +7450,8 @@ calculate_reloc (bfd_reloc_code_real_type reloc, offsetT operand,
case BFD_RELOC_LO16:
case BFD_RELOC_LO16_PCREL:
+ case BFD_RELOC_LO16_GOTOFF:
+ case BFD_RELOC_LO16_GOTOFF_CALL:
case BFD_RELOC_MICROMIPS_LO16:
case BFD_RELOC_MIPS16_LO16:
*result = operand & 0xffff;
@@ -14583,7 +14590,11 @@ static const struct percent_op_match mips_percent_op[] =
{"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
{"%hi", BFD_RELOC_HI16_S},
{"%pcrel_hi", BFD_RELOC_HI16_S_PCREL},
- {"%pcrel_lo", BFD_RELOC_LO16_PCREL}
+ {"%pcrel_lo", BFD_RELOC_LO16_PCREL},
+ {"%gotpc_hi", BFD_RELOC_HI16_S_GOTOFF},
+ {"%gotpc_lo", BFD_RELOC_LO16_GOTOFF},
+ {"%gotpc_call_hi", BFD_RELOC_HI16_S_GOTOFF_CALL},
+ {"%gotpc_call_lo", BFD_RELOC_LO16_GOTOFF_CALL}
};
static const struct percent_op_match mips16_percent_op[] =
@@ -15541,7 +15552,11 @@ mips_force_relocation (fixS *fixp)
|| fixp->fx_r_type == BFD_RELOC_MIPS_26_PCREL_S2
|| fixp->fx_r_type == BFD_RELOC_MIPS_18_PCREL_S3
|| fixp->fx_r_type == BFD_RELOC_MIPS_19_PCREL_S2
+ || fixp->fx_r_type == BFD_RELOC_HI16_S_GOTOFF
+ || fixp->fx_r_type == BFD_RELOC_LO16_GOTOFF
|| fixp->fx_r_type == BFD_RELOC_HI16_S_PCREL
+ || fixp->fx_r_type == BFD_RELOC_LO16_GOTOFF_CALL
+ || fixp->fx_r_type == BFD_RELOC_HI16_S_GOTOFF_CALL
|| fixp->fx_r_type == BFD_RELOC_LO16_PCREL))
return 1;
@@ -15822,6 +15837,10 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
case BFD_RELOC_MIPS_19_PCREL_S2:
case BFD_RELOC_HI16_S_PCREL:
case BFD_RELOC_LO16_PCREL:
+ case BFD_RELOC_HI16_S_GOTOFF:
+ case BFD_RELOC_LO16_GOTOFF:
+ case BFD_RELOC_HI16_S_GOTOFF_CALL:
+ case BFD_RELOC_LO16_GOTOFF_CALL:
break;
case BFD_RELOC_32:
@@ -15965,6 +15984,10 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
case BFD_RELOC_MIPS_GOT_LO16:
case BFD_RELOC_MIPS_CALL_HI16:
case BFD_RELOC_MIPS_CALL_LO16:
+ case BFD_RELOC_HI16_S_GOTOFF:
+ case BFD_RELOC_LO16_GOTOFF:
+ case BFD_RELOC_HI16_S_GOTOFF_CALL:
+ case BFD_RELOC_LO16_GOTOFF_CALL:
case BFD_RELOC_HI16_S_PCREL:
case BFD_RELOC_LO16_PCREL:
case BFD_RELOC_MIPS16_GPREL:
@@ -18386,7 +18409,11 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
|| fixp->fx_r_type == BFD_RELOC_MIPS_26_PCREL_S2
|| fixp->fx_r_type == BFD_RELOC_MIPS_18_PCREL_S3
|| fixp->fx_r_type == BFD_RELOC_MIPS_19_PCREL_S2
+ || fixp->fx_r_type == BFD_RELOC_HI16_S_GOTOFF
+ || fixp->fx_r_type == BFD_RELOC_LO16_GOTOFF
|| fixp->fx_r_type == BFD_RELOC_HI16_S_PCREL
+ || fixp->fx_r_type == BFD_RELOC_LO16_GOTOFF_CALL
+ || fixp->fx_r_type == BFD_RELOC_HI16_S_GOTOFF_CALL
|| fixp->fx_r_type == BFD_RELOC_LO16_PCREL);
/* At this point, fx_addnumber is "symbol offset - pcrel address".
@@ -98,7 +98,11 @@ START_RELOC_NUMBERS (elf_mips_reloc_type)
RELOC_NUMBER (R_MIPS_PC19_S2, 63)
RELOC_NUMBER (R_MIPS_PCHI16, 64)
RELOC_NUMBER (R_MIPS_PCLO16, 65)
- FAKE_RELOC (R_MIPS_max, 66)
+ RELOC_NUMBER (R_MIPS_GOTPC_HI16, 66)
+ RELOC_NUMBER (R_MIPS_GOTPC_LO16, 67)
+ RELOC_NUMBER (R_MIPS_GOTPC_CALL_HI16, 68)
+ RELOC_NUMBER (R_MIPS_GOTPC_CALL_LO16, 69)
+ FAKE_RELOC (R_MIPS_max, 70)
/* These relocs are used for the mips16. */
FAKE_RELOC (R_MIPS16_min, 100)
RELOC_NUMBER (R_MIPS16_26, 100)