- Flag to ignore main:
--defsym=main=0x100- To ignore
_start:
-nostartfilesRelocID Pass
*howto:
{type = 224, size = 2, bitsize = 32, rightshift = 1, bitpos = 0, complain_on_overflow = complain_overflow_unsigned, negate = 0, pc_relative = 1, partial_inplace = 0, pcrel_offset = 1, src_mask = 0, dst_mask = 4293918720, special_function = 0x5555555cb8e0 <bfd_elf_generic_reloc>, name = 0x5555556c7506 "R_RISCV_CVPCREL_UI12"}*rel:
{r_offset = 2, r_info = 1504, r_addend = 0}- value:
3145728
We first do CVPCREL with the *howto:
{type = 224, size = 2, bitsize = 32, rightshift = 1, bitpos = 0, complain_on_overflow = complain_overflow_unsigned, negate = 0, pc_relative = 1, partial_inplace = 0, pcrel_offset = 1, src_mask = 0, dst_mask = 4293918720, special_function = 0x5555555cb8e0 <bfd_elf_generic_reloc>, name = 0x5555556c7506 "R_RISCV_CVPCREL_UI12"}Value is set to 6.
Then we get to RELOCID:
{type = 59, size = 3, bitsize = 32, rightshift = 0, bitpos = 0, complain_on_overflow = complain_overflow_dont, negate = 0, pc_relative = 0, partial_inplace = 0, pcrel_offset = 0, src_mask = 0, dst_mask = 0, special_function = 0x5555555cb8e0 <bfd_elf_generic_reloc>, name = 0x5555556c7530 "R_RISCV_RELOCID"}value += rel->r_addend therefore 100 (the ID).
We get the previous relocation:
int prev_reloc = ELFNN_R_TYPE ((rel - 1))->r_info);The howto turns into:
{type = 224, size = 2, bitsize = 32, rightshift = 1, bitpos = 0, complain_on_overflow = complain_overflow_unsigned, negate = 0, pc_relative = 1, partial_inplace = 0, pcrel_offset = 1, src_mask = 0, dst_mask = 4293918720, special_function = 0x5555555cb8e0 <bfd_elf_generic_reloc>, name = 0x5555556c7506 "R_RISCV_CVPCREL_UI12"}And word is 3145851.
rel however, still points to RELOCID and not CVPCREL. I don’t seem able to change the value (or addend) without accessing the actual relocation.
We go to riscv_elf_rtype_to_howto which looks for relocation 224 in the howto table and returns its location (&howto_table[i]).
When we get to r_type = 58, it jumps to 224. Therefore, it replaces RELOCID with CVPCREL in the howto table (RELOCID points to CVPCREL).
The address being returned is:
(const reloc_howto_type *) 0x5555559043b8 <howto_table+2360>We are then sent to elfnn-riscv.c:1765 aka the default of perform_relocation: return bfd_reloc_notsupported.
If I use the riscv_reloc_type_lookup function, then prev_reloc somehow points to BFD_RELOC_MICROMIPS_GPREL16. It seems to only get
HOWTO
The howto 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 relocation 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.
- daily
- work/relocation-prototype programming-languages: created: 2022-07-07
- Flag to ignore main:
--defsym=main=0x100- To ignore
_start:
-nostartfilesRelocID Pass
*howto:
{type = 224, size = 2, bitsize = 32, rightshift = 1, bitpos = 0, complain_on_overflow = complain_overflow_unsigned, negate = 0, pc_relative = 1, partial_inplace = 0, pcrel_offset = 1, src_mask = 0, dst_mask = 4293918720, special_function = 0x5555555cb8e0 <bfd_elf_generic_reloc>, name = 0x5555556c7506 "R_RISCV_CVPCREL_UI12"}*rel:
{r_offset = 2, r_info = 1504, r_addend = 0}- value:
3145728
We first do CVPCREL with the *howto:
{type = 224, size = 2, bitsize = 32, rightshift = 1, bitpos = 0, complain_on_overflow = complain_overflow_unsigned, negate = 0, pc_relative = 1, partial_inplace = 0, pcrel_offset = 1, src_mask = 0, dst_mask = 4293918720, special_function = 0x5555555cb8e0 <bfd_elf_generic_reloc>, name = 0x5555556c7506 "R_RISCV_CVPCREL_UI12"}Value is set to 6.
Then we get to RELOCID:
{type = 59, size = 3, bitsize = 32, rightshift = 0, bitpos = 0, complain_on_overflow = complain_overflow_dont, negate = 0, pc_relative = 0, partial_inplace = 0, pcrel_offset = 0, src_mask = 0, dst_mask = 0, special_function = 0x5555555cb8e0 <bfd_elf_generic_reloc>, name = 0x5555556c7530 "R_RISCV_RELOCID"}value += rel->r_addend therefore 100 (the ID).
We get the previous relocation:
int prev_reloc = ELFNN_R_TYPE ((rel - 1))->r_info);The howto turns into:
{type = 224, size = 2, bitsize = 32, rightshift = 1, bitpos = 0, complain_on_overflow = complain_overflow_unsigned, negate = 0, pc_relative = 1, partial_inplace = 0, pcrel_offset = 1, src_mask = 0, dst_mask = 4293918720, special_function = 0x5555555cb8e0 <bfd_elf_generic_reloc>, name = 0x5555556c7506 "R_RISCV_CVPCREL_UI12"}And word is 3145851.
rel however, still points to RELOCID and not CVPCREL. I don’t seem able to change the value (or addend) without accessing the actual relocation.
We go to riscv_elf_rtype_to_howto which looks for relocation 224 in the howto table and returns its location (&howto_table[i]).
When we get to r_type = 58, it jumps to 224. Therefore, it replaces RELOCID with CVPCREL in the howto table (RELOCID points to CVPCREL).
The address being returned is:
(const reloc_howto_type *) 0x5555559043b8 <howto_table+2360>We are then sent to elfnn-riscv.c:1765 aka the default of perform_relocation: return bfd_reloc_notsupported.
If I use the riscv_reloc_type_lookup function, then prev_reloc somehow points to BFD_RELOC_MICROMIPS_GPREL16. It seems to only get
HOWTO
The howto 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 relocation 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.