+ arelent *reloc;
+ bfd_reloc_code_real_type code;
+
+ reloc = XNEW (arelent);
+
+ reloc->sym_ptr_ptr = XNEW (asymbol *);
+ *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
+ reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
+
+ if (fixp->fx_pcrel)
+ {
+ if (section->use_rela_p)
+ fixp->fx_offset -= md_pcrel_from_section (fixp, section);
+ else
+ fixp->fx_offset = reloc->address;
+ }
+ reloc->addend = fixp->fx_offset;
+
+ code = fixp->fx_r_type;
+ switch (code)
+ {
+ case BFD_RELOC_16:
+ if (fixp->fx_pcrel)
+ code = BFD_RELOC_16_PCREL;
+ break;
+
+ case BFD_RELOC_32:
+ if (fixp->fx_pcrel)
+ code = BFD_RELOC_32_PCREL;
+ break;
+
+ case BFD_RELOC_64:
+ if (fixp->fx_pcrel)
+ code = BFD_RELOC_64_PCREL;
+ break;
+
+ default:
+ break;
+ }