123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355(*Generated by Lem from abis/amd64/abi_amd64_relocation.lem.*)(** [abi_amd64_relocation] contains types and definitions relating to ABI
* specific relocation functionality for the AMD64 ABI.
*)openLem_basic_classesopenLem_mapopenLem_maybeopenLem_numopenLem_stringopenErroropenMissing_pervasivesopenLem_assert_extraopenElf_types_native_uintopenElf_fileopenElf_headeropenElf_relocationopenElf_symbol_tableopenMemory_imageopenAbi_classesopenAbi_utilities(** x86-64 relocation types. *)letr_x86_64_none:Nat_big_num.num=((Nat_big_num.of_int0))letr_x86_64_64:Nat_big_num.num=((Nat_big_num.of_int1))letr_x86_64_pc32:Nat_big_num.num=((Nat_big_num.of_int2))letr_x86_64_got32:Nat_big_num.num=((Nat_big_num.of_int3))letr_x86_64_plt32:Nat_big_num.num=((Nat_big_num.of_int4))letr_x86_64_copy:Nat_big_num.num=((Nat_big_num.of_int5))letr_x86_64_glob_dat:Nat_big_num.num=((Nat_big_num.of_int6))letr_x86_64_jump_slot:Nat_big_num.num=((Nat_big_num.of_int7))letr_x86_64_relative:Nat_big_num.num=((Nat_big_num.of_int8))letr_x86_64_gotpcrel:Nat_big_num.num=((Nat_big_num.of_int9))letr_x86_64_32:Nat_big_num.num=((Nat_big_num.of_int10))letr_x86_64_32s:Nat_big_num.num=((Nat_big_num.of_int11))letr_x86_64_16:Nat_big_num.num=((Nat_big_num.of_int12))letr_x86_64_pc16:Nat_big_num.num=((Nat_big_num.of_int13))letr_x86_64_8:Nat_big_num.num=((Nat_big_num.of_int14))letr_x86_64_pc8:Nat_big_num.num=((Nat_big_num.of_int15))letr_x86_64_dtpmod64:Nat_big_num.num=((Nat_big_num.of_int16))letr_x86_64_dtpoff64:Nat_big_num.num=((Nat_big_num.of_int17))letr_x86_64_tpoff64:Nat_big_num.num=((Nat_big_num.of_int18))letr_x86_64_tlsgd:Nat_big_num.num=((Nat_big_num.of_int19))letr_x86_64_tlsld:Nat_big_num.num=((Nat_big_num.of_int20))letr_x86_64_dtpoff32:Nat_big_num.num=((Nat_big_num.of_int21))letr_x86_64_gottpoff:Nat_big_num.num=((Nat_big_num.of_int22))letr_x86_64_tpoff32:Nat_big_num.num=((Nat_big_num.of_int23))letr_x86_64_pc64:Nat_big_num.num=((Nat_big_num.of_int24))letr_x86_64_gotoff64:Nat_big_num.num=((Nat_big_num.of_int25))letr_x86_64_gotpc32:Nat_big_num.num=((Nat_big_num.of_int26))letr_x86_64_size32:Nat_big_num.num=((Nat_big_num.of_int32))letr_x86_64_size64:Nat_big_num.num=((Nat_big_num.of_int33))letr_x86_64_gotpc32_tlsdesc:Nat_big_num.num=((Nat_big_num.of_int34))letr_x86_64_tlsdesc_call:Nat_big_num.num=((Nat_big_num.of_int35))letr_x86_64_tlsdesc:Nat_big_num.num=((Nat_big_num.of_int36))letr_x86_64_irelative:Nat_big_num.num=((Nat_big_num.of_int37))(** [string_of_x86_64_relocation_type m] produces a string representation of the
* relocation type [m].
*)(*val string_of_amd64_relocation_type : natural -> string*)letstring_of_amd64_relocation_typerel_type1:string=(ifNat_big_num.equalrel_type1r_x86_64_nonethen"R_X86_64_NONE"elseifNat_big_num.equalrel_type1r_x86_64_64then"R_X86_64_64"elseifNat_big_num.equalrel_type1r_x86_64_pc32then"R_X86_64_PC32"elseifNat_big_num.equalrel_type1r_x86_64_got32then"R_X86_64_GOT32"elseifNat_big_num.equalrel_type1r_x86_64_plt32then"R_X86_64_PLT32"elseifNat_big_num.equalrel_type1r_x86_64_copythen"R_X86_64_COPY"elseifNat_big_num.equalrel_type1r_x86_64_glob_datthen"R_X86_64_GLOB_DAT"elseifNat_big_num.equalrel_type1r_x86_64_jump_slotthen"R_X86_64_JUMP_SLOT"elseifNat_big_num.equalrel_type1r_x86_64_relativethen"R_X86_64_RELATIVE"elseifNat_big_num.equalrel_type1r_x86_64_gotpcrelthen"R_X86_64_GOTPCREL"elseifNat_big_num.equalrel_type1r_x86_64_32then"R_X86_64_32"elseifNat_big_num.equalrel_type1r_x86_64_32sthen"R_X86_64_32S"elseifNat_big_num.equalrel_type1r_x86_64_16then"R_X86_64_16"elseifNat_big_num.equalrel_type1r_x86_64_pc16then"R_X86_64_PC16"elseifNat_big_num.equalrel_type1r_x86_64_8then"R_X86_64_8"elseifNat_big_num.equalrel_type1r_x86_64_pc8then"R_X86_64_PC8"elseifNat_big_num.equalrel_type1r_x86_64_dtpmod64then"R_X86_64_DTPMOD64"elseifNat_big_num.equalrel_type1r_x86_64_dtpoff64then"R_X86_64_DTPOFF64"elseifNat_big_num.equalrel_type1r_x86_64_tpoff64then"R_X86_64_TPOFF64"elseifNat_big_num.equalrel_type1r_x86_64_tlsgdthen"R_X86_64_TLSGD"elseifNat_big_num.equalrel_type1r_x86_64_tlsldthen"R_X86_64_TLSLD"elseifNat_big_num.equalrel_type1r_x86_64_dtpoff32then"R_X86_64_DTPOFF32"elseifNat_big_num.equalrel_type1r_x86_64_gottpoffthen"R_X86_64_GOTTPOFF"elseifNat_big_num.equalrel_type1r_x86_64_tpoff32then"R_X86_64_TPOFF32"elseifNat_big_num.equalrel_type1r_x86_64_pc64then"R_X86_64_PC64"elseifNat_big_num.equalrel_type1r_x86_64_gotoff64then"R_X86_64_GOTOFF64"elseifNat_big_num.equalrel_type1r_x86_64_gotpc32then"R_X86_64_GOTPC32"elseifNat_big_num.equalrel_type1r_x86_64_size32then"R_X86_64_SIZE32"elseifNat_big_num.equalrel_type1r_x86_64_size64then"R_X86_64_SIZE64"elseifNat_big_num.equalrel_type1r_x86_64_gotpc32_tlsdescthen"R_X86_64_GOTPC32_TLSDESC"elseifNat_big_num.equalrel_type1r_x86_64_tlsdesc_callthen"R_X86_64_TLSDESC_CALL"elseifNat_big_num.equalrel_type1r_x86_64_tlsdescthen"R_X86_64_TLSDESC"elseifNat_big_num.equalrel_type1r_x86_64_irelativethen"R_X86_64_IRELATIVE"else"Invalid X86_64 relocation")(* How do we find the GOT? *)(* We really want to find the GOT without knowing how it's labelled, because
* in this file 'abifeature is abstract. This is a real problem. So for now,
* we use the HACK of looking for a section called ".got".
* Even then, we can't understand the content of the GOT without reading the tag.
*
* So we can
*
* - accept an argument of type abi 'abifeature and call a function on it to get the GOT
(but then type abi becomes a recursive record type);
* - extend the AbiFeatureTagEquiv class into a generic class capturing ABIs;
then we risk breaking various things in Isabelle because Lem's type classes don't work there;
* - move the amd64_reloc function to abis.lem and define it only for any_abi_feature.
*)(** [abi_amd64_apply_relocation rel val_map ef]
* calculates the effect of a relocation of type [rel] using relevant addresses,
* offsets and fields represented by [b_val], [g_val], [got_val], [l_val], [p_val],
* [s_val] and [z_val], stored in [val_map] with "B", "G", and so on as string
* keys, which are:
*
* - B : Base address at which a shared-object has been loaded into memory
* during execution.
* - G : Represents the offset into the GOT at which the relocation's entry
* will reside during execution.
* - GOT: Address of the GOT.
* - L : Represents the address or offset of the PLT entry for a symbol.
* - P : Represents the address or offset of the storage unit being
* relocated.
* - S : Represents the value of the symbol whose index resides in the
* relocation entry.
* - Z : Represents the size of the symbol whose index resides in the
* relocation entry.
*
* More details of the above can be found in the AMD64 ABI document's chapter
* on relocations.
*
* The [abi_amd64_apply_relocation] function returns a relocation frame, either
* indicating that the relocation is a copy relocation, or that some calculation
* must be carried out at a certain location. See the comment above the
* [relocation_frame] type in [Abi_utilities.lem] for more details.
*)(*val abi_amd64_apply_relocation : elf64_relocation_a -> val_map string integer -> elf64_file
-> error (relocation_frame elf64_addr integer)*)letabi_amd64_apply_relocationrelval_map1ef:(((Uint64_wrapper.uint64),(Nat_big_num.num))relocation_frame)error=(ifis_elf64_relocatable_fileef.elf64_file_headerthenlet(rel_type1,_)=(parse_elf64_relocation_inforel.elf64_ra_info)inleta_val=(Nat_big_num.of_int64rel.elf64_ra_addend)in(** No width, No calculation *)ifNat_big_num.equalrel_type1r_x86_64_nonethenreturn(NoCopy((Pmap.emptycompare)))(** Width: 64 Calculation: S + A *)elseifNat_big_num.equalrel_type1r_x86_64_64thenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"S"val_map1)(funs_val->letresult=(Lift(Nat_big_num.adds_vala_val))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I64,CannotFail)(Pmap.emptycompare))))(** Width: 32 Calculation: S + A - P *)elseifNat_big_num.equalrel_type1r_x86_64_pc32thenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"S"val_map1)(funs_val->bind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"P"val_map1)(funp_val->letresult=(Lift(Nat_big_num.sub(Nat_big_num.adds_vala_val)p_val))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I32,CanFail)(Pmap.emptycompare)))))(** Width: 32 Calculation: G + A *)elseifNat_big_num.equalrel_type1r_x86_64_got32thenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"G"val_map1)(fung_val->letresult=(Lift(Nat_big_num.addg_vala_val))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I32,CanFail)(Pmap.emptycompare))))(** Width: 32 Calculation: L + A - P *)elseifNat_big_num.equalrel_type1r_x86_64_plt32thenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"L"val_map1)(funl_val->bind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"P"val_map1)(funp_val->letresult=(Lift(Nat_big_num.sub(Nat_big_num.addl_vala_val)p_val))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I32,CanFail)(Pmap.emptycompare)))))(** No width, No calculation *)elseifNat_big_num.equalrel_type1r_x86_64_copythenreturnCopy(** Width: 64 Calculation: S *)elseifNat_big_num.equalrel_type1r_x86_64_glob_datthenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"S"val_map1)(funs_val->letresult=(Lifts_val)inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I64,CannotFail)(Pmap.emptycompare))))(** Width: 64 Calculation: S *)elseifNat_big_num.equalrel_type1r_x86_64_jump_slotthenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"S"val_map1)(funs_val->letresult=(Lifts_val)inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I64,CannotFail)(Pmap.emptycompare))))(** Width: 64 Calculation: B + A *)elseifNat_big_num.equalrel_type1r_x86_64_relativethenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"B"val_map1)(funb_val->letresult=(Lift(Nat_big_num.addb_vala_val))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I64,CannotFail)(Pmap.emptycompare))))(** Width: 32 Calculation: G + GOT + A - P *)elseifNat_big_num.equalrel_type1r_x86_64_gotpcrelthenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"G"val_map1)(fung_val->bind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"GOT"val_map1)(fungot_val->bind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"P"val_map1)(funp_val->letresult=(Lift(Nat_big_num.sub(Nat_big_num.add(Nat_big_num.addg_valgot_val)a_val)p_val))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I32,CanFail)(Pmap.emptycompare))))))(** Width: 32 Calculation: S + A *)elseifNat_big_num.equalrel_type1r_x86_64_32thenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"S"val_map1)(funs_val->letresult=(Lift(Nat_big_num.adds_vala_val))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I32,CanFail)(Pmap.emptycompare))))(** Width: 32 Calculation: S + A *)elseifNat_big_num.equalrel_type1r_x86_64_32sthenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"S"val_map1)(funs_val->letresult=(Lift(Nat_big_num.adds_vala_val))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I32,CanFail)(Pmap.emptycompare))))(** Width: 16 Calculation: S + A *)elseifNat_big_num.equalrel_type1r_x86_64_16thenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"S"val_map1)(funs_val->letresult=(Lift(Nat_big_num.adds_vala_val))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I16,CanFail)(Pmap.emptycompare))))(** Width: 16 Calculation: S + A - P *)elseifNat_big_num.equalrel_type1r_x86_64_pc16thenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"S"val_map1)(funs_val->bind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"P"val_map1)(funp_val->letresult=(Lift(Nat_big_num.sub(Nat_big_num.adds_vala_val)p_val))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I16,CanFail)(Pmap.emptycompare)))))(** Width: 8 Calculation: S + A *)elseifNat_big_num.equalrel_type1r_x86_64_8thenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"S"val_map1)(funs_val->letresult=(Lift(Nat_big_num.adds_vala_val))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I8,CanFail)(Pmap.emptycompare))))(** Width 8: Calculation: S + A - P *)elseifNat_big_num.equalrel_type1r_x86_64_pc8thenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"S"val_map1)(funs_val->bind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"P"val_map1)(funp_val->letresult=(Lift(Nat_big_num.sub(Nat_big_num.adds_vala_val)p_val))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I8,CanFail)(Pmap.emptycompare)))))(** Width: 64 *)elseifNat_big_num.equalrel_type1r_x86_64_dtpmod64thenfailwith"abi_amd64_apply_relocation: r_x86_64_dtpmod64 not implemented"(** Width: 64 *)elseifNat_big_num.equalrel_type1r_x86_64_dtpoff64thenfailwith"abi_amd64_apply_relocation: r_x86_64_dtpoff64 not implemented"(** Width: 64 *)elseifNat_big_num.equalrel_type1r_x86_64_tpoff64thenfailwith"abi_amd64_apply_relocation: r_x86_64_tpoff64 not implemented"(** Width: 32 *)elseifNat_big_num.equalrel_type1r_x86_64_tlsgdthenfailwith"abi_amd64_apply_relocation: r_x86_64_tlsgd not implemented"(** Width: 32 *)elseifNat_big_num.equalrel_type1r_x86_64_tlsldthenfailwith"abi_amd64_apply_relocation: r_x86_64_tlsld not implemented"(** Width: 32 *)elseifNat_big_num.equalrel_type1r_x86_64_dtpoff32thenfailwith"abi_amd64_apply_relocation: r_x86_64_dtpoff32 not implemented"(** Width: 32 *)elseifNat_big_num.equalrel_type1r_x86_64_gottpoffthenfailwith"abi_amd64_apply_relocation: r_x86_64_gottpoff not implemented"(** Width: 32 *)elseifNat_big_num.equalrel_type1r_x86_64_tpoff32thenfailwith"abi_amd64_apply_relocation: r_x86_64_tpoff32 not implemented"(** Width: 64 Calculation: S + A - P *)elseifNat_big_num.equalrel_type1r_x86_64_pc64thenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"S"val_map1)(funs_val->bind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"P"val_map1)(funp_val->letresult=(Lift(Nat_big_num.sub(Nat_big_num.adds_vala_val)p_val))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I64,CannotFail)(Pmap.emptycompare)))))(** Width: 64 Calculation: S + A - GOT *)elseifNat_big_num.equalrel_type1r_x86_64_gotoff64thenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"S"val_map1)(funs_val->bind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"GOT"val_map1)(fungot_val->letresult=(Lift(Nat_big_num.sub(Nat_big_num.adds_vala_val)got_val))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I64,CannotFail)(Pmap.emptycompare)))))(** Width: 32 Calculation: GOT + A - P *)elseifNat_big_num.equalrel_type1r_x86_64_gotpc32thenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"GOT"val_map1)(fungot_val->bind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"P"val_map1)(funp_val->letresult=(Lift(Nat_big_num.sub(Nat_big_num.addgot_vala_val)p_val))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I32,CanFail)(Pmap.emptycompare)))))(** Width: 32 Calculation: Z + A *)elseifNat_big_num.equalrel_type1r_x86_64_size32thenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"Z"val_map1)(funz_val->letresult=(Lift(Nat_big_num.addz_vala_val))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I32,CanFail)(Pmap.emptycompare))))(** Width: 64 Calculation: Z + A *)elseifNat_big_num.equalrel_type1r_x86_64_size64thenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"Z"val_map1)(funz_val->letresult=(Lift(Nat_big_num.addz_vala_val))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I64,CannotFail)(Pmap.emptycompare))))(** Width: 32 *)elseifNat_big_num.equalrel_type1r_x86_64_gotpc32_tlsdescthenfailwith"abi_amd64_apply_relocation: r_x86_64_gotpc32_tlsdesc not implemented"(** No width *)elseifNat_big_num.equalrel_type1r_x86_64_tlsdesc_callthenfailwith"abi_amd64_apply_relocation: r_x86_64_tlsdesc_call not implemented"(** Width: 64X2 *)elseifNat_big_num.equalrel_type1r_x86_64_tlsdescthenfailwith"abi_amd64_apply_relocation: r_x86_64_tlsdesc not implemented"(** Calculation: indirect(B + A) *)elseifNat_big_num.equalrel_type1r_x86_64_irelativethenbind(lookupM(instance_Map_MapKeyType_var_dictinstance_Basic_classes_SetType_var_dict)"B"val_map1)(funb_val->letresult=(Apply(Indirect,Lift(Nat_big_num.addb_vala_val)))inletaddr=(rel.elf64_ra_offset)inreturn(NoCopy(Pmap.addaddr(result,I64,CannotFail)(Pmap.emptycompare))))elsefailwith"abi_amd64_apply_relocation: invalid relocation type"elsefailwith"abi_amd64_apply_relocation: not a relocatable file")