123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507(*Generated by Lem from gnu_extensions/gnu_ext_dynamic.lem.*)(** [gnu_ext_dynamic] contains GNU extension specific definitions related to the
* .dynamic section of an ELF file.
*)openLem_basic_classesopenLem_boolopenLem_numopenLem_stringopenErroropenShowopenString_tableopenElf_dynamicopenElf_types_native_uint(** Additional dynamic entries, see LSB section 11.3.2.2.
* All values taken from elf.c from binutils and GLIBC as the LSB does not
* specify them.
*
* 98 #define OLD_DT_LOOS 0x60000000
* 99 #define DT_LOOS 0x6000000d
* 100 #define DT_HIOS 0x6ffff000
* 101 #define DT_VALRNGLO 0x6ffffd00
* 102 #define DT_VALRNGHI 0x6ffffdff
* 103 #define DT_ADDRRNGLO 0x6ffffe00
* 104 #define DT_ADDRRNGHI 0x6ffffeff
* 105 #define DT_VERSYM 0x6ffffff0
* 106 #define DT_RELACOUNT 0x6ffffff9
* 107 #define DT_RELCOUNT 0x6ffffffa
* 108 #define DT_FLAGS_1 0x6ffffffb
* 109 #define DT_VERDEF 0x6ffffffc
* 110 #define DT_VERDEFNUM 0x6ffffffd
* 111 #define DT_VERNEED 0x6ffffffe
* 112 #define DT_VERNEEDNUM 0x6fffffff
* 113 #define OLD_DT_HIOS 0x6fffffff
* 114 #define DT_LOPROC 0x70000000
* 115 #define DT_HIPROC 0x7fffffff
*)letelf_dt_gnu_addrrnghi:Nat_big_num.num=(Nat_big_num.add(Nat_big_num.mul((Nat_big_num.of_int939523967))((Nat_big_num.of_int2)))((Nat_big_num.of_int1)))(*0x6ffffeff*)letelf_dt_gnu_addrrnglo:Nat_big_num.num=(Nat_big_num.mul((Nat_big_num.of_int939523840))((Nat_big_num.of_int2)))(*0x6ffffe00*)letelf_dt_gnu_auxiliary:Nat_big_num.num=(Nat_big_num.add(Nat_big_num.mul((Nat_big_num.of_int1073741822))((Nat_big_num.of_int2)))((Nat_big_num.of_int1)))(*0x7ffffffd*)letelf_dt_gnu_filter:Nat_big_num.num=(Nat_big_num.add(Nat_big_num.mul((Nat_big_num.of_int1073741823))((Nat_big_num.of_int2)))((Nat_big_num.of_int1)))(*0x7fffffff*)(** The following is "specified" in the LSB document but is not present in the
* elf.c file so taken from elf.h from GLIBC:
*)letelf_dt_gnu_num:Nat_big_num.num=((Nat_big_num.of_int32))(** ??? This should match something *)letelf_dt_gnu_posflag_1:Nat_big_num.num=(Nat_big_num.add(Nat_big_num.mul((Nat_big_num.of_int939523838))((Nat_big_num.of_int2)))((Nat_big_num.of_int1)))(*0x6ffffdfd*)letelf_dt_gnu_relcount:Nat_big_num.num=(Nat_big_num.mul((Nat_big_num.of_int939524093))((Nat_big_num.of_int2)))(*0x6ffffffa*)letelf_dt_gnu_relacount:Nat_big_num.num=(Nat_big_num.add(Nat_big_num.mul((Nat_big_num.of_int939524092))((Nat_big_num.of_int2)))((Nat_big_num.of_int1)))(*0x6FFFFFF9*)letelf_dt_gnu_syminent:Nat_big_num.num=(Nat_big_num.add(Nat_big_num.mul((Nat_big_num.of_int939523839))((Nat_big_num.of_int2)))((Nat_big_num.of_int1)))(*0x6ffffdff*)letelf_dt_gnu_syminfo:Nat_big_num.num=(Nat_big_num.add(Nat_big_num.mul((Nat_big_num.of_int939523967))((Nat_big_num.of_int2)))((Nat_big_num.of_int1)))(*0x6ffffeff*)letelf_dt_gnu_syminsz:Nat_big_num.num=(Nat_big_num.mul((Nat_big_num.of_int939523839))((Nat_big_num.of_int2)))(*0x6ffffdfe*)letelf_dt_gnu_valrnghi:Nat_big_num.num=(Nat_big_num.add(Nat_big_num.mul((Nat_big_num.of_int939523839))((Nat_big_num.of_int2)))((Nat_big_num.of_int1)))(*0x6ffffdff*)letelf_dt_gnu_valrnglo:Nat_big_num.num=(Nat_big_num.mul((Nat_big_num.of_int939523712))((Nat_big_num.of_int2)))(*0x6ffffd00*)letelf_dt_gnu_verdef:Nat_big_num.num=(Nat_big_num.mul((Nat_big_num.of_int939524094))((Nat_big_num.of_int2)))(*0x6ffffffc*)letelf_dt_gnu_verdefnum:Nat_big_num.num=(Nat_big_num.add(Nat_big_num.mul((Nat_big_num.of_int939524094))((Nat_big_num.of_int2)))((Nat_big_num.of_int1)))(*0x6ffffffd*)letelf_dt_gnu_verneed:Nat_big_num.num=(Nat_big_num.mul((Nat_big_num.of_int939524095))((Nat_big_num.of_int2)))(*0x6ffffffe*)letelf_dt_gnu_verneednum:Nat_big_num.num=(Nat_big_num.add(Nat_big_num.mul((Nat_big_num.of_int939524095))((Nat_big_num.of_int2)))((Nat_big_num.of_int1)))(*0x6fffffff*)letelf_dt_gnu_versym:Nat_big_num.num=(Nat_big_num.mul((Nat_big_num.of_int939524088))((Nat_big_num.of_int2)))(*0x6ffffff0*)(** Not present in the LSB but turns up in "real" ELF files... *)letelf_dt_gnu_hash:Nat_big_num.num=(Nat_big_num.add(Nat_big_num.mul((Nat_big_num.of_int939523962))((Nat_big_num.of_int2)))((Nat_big_num.of_int1)))(*0x6ffffef5*)letelf_dt_gnu_flags_1:Nat_big_num.num=(Nat_big_num.add(Nat_big_num.mul((Nat_big_num.of_int939524093))((Nat_big_num.of_int2)))((Nat_big_num.of_int1)))(*0x6ffffffb*)letelf_dt_gnu_checksum:Nat_big_num.num=(Nat_big_num.mul((Nat_big_num.of_int939523836))((Nat_big_num.of_int2)))(* 0x6FFFFDF8 *)letelf_dt_gnu_prelinked:Nat_big_num.num=(Nat_big_num.add(Nat_big_num.mul((Nat_big_num.of_int2))((Nat_big_num.of_int939523834)))((Nat_big_num.of_int1)))(* 0x6FFFFDF5 *)(** Extended DT flags for FLAGS_1 dynamic section types. Taken from GLibC source
* as they appear to be completely unspecified!
*)letgnu_df_1_now:Nat_big_num.num=((Nat_big_num.of_int1))(*0x00000001*)letgnu_df_1_global:Nat_big_num.num=((Nat_big_num.of_int2))(*0x00000002*)letgnu_df_1_group:Nat_big_num.num=((Nat_big_num.of_int4))(*0x00000004*)letgnu_df_1_nodelete:Nat_big_num.num=((Nat_big_num.of_int8))(*0x00000008*)letgnu_df_1_loadfltr:Nat_big_num.num=((Nat_big_num.of_int16))(*0x00000010*)letgnu_df_1_initfirst:Nat_big_num.num=((Nat_big_num.of_int32))(*0x00000020*)letgnu_df_1_noopen:Nat_big_num.num=((Nat_big_num.of_int64))(*0x00000040*)letgnu_df_1_origin:Nat_big_num.num=((Nat_big_num.of_int128))(*0x00000080*)letgnu_df_1_direct:Nat_big_num.num=((Nat_big_num.of_int256))(*0x00000100*)letgnu_df_1_trans:Nat_big_num.num=((Nat_big_num.of_int512))(*0x00000200*)letgnu_df_1_interpose:Nat_big_num.num=((Nat_big_num.of_int1024))(*0x00000400*)letgnu_df_1_nodeflib:Nat_big_num.num=((Nat_big_num.of_int2048))(*0x00000800*)letgnu_df_1_nodump:Nat_big_num.num=((Nat_big_num.of_int4096))(*0x00001000*)letgnu_df_1_confalt:Nat_big_num.num=((Nat_big_num.of_int8192))(*0x00002000*)letgnu_df_1_endfiltee:Nat_big_num.num=((Nat_big_num.of_int16384))(*0x00004000*)letgnu_df_1_dispreldne:Nat_big_num.num=((Nat_big_num.of_int32768))(*0x00008000*)letgnu_df_1_disprelpnd:Nat_big_num.num=((Nat_big_num.of_int65536))(*0x00010000*)(** [gnu_string_of_dt_flag1 m] produces a string based representation of GNU
* extensions flag_1 value [m].
*)(*val gnu_string_of_dt_flag_1 : natural -> string*)letgnu_string_of_dt_flag_1flag:string=(ifcheck_flagflag((Nat_big_num.of_int0))then"None"elseifcheck_flagflaggnu_df_1_nowthen"NOW"elseifcheck_flagflaggnu_df_1_globalthen"GLOBAL"elseifcheck_flagflaggnu_df_1_groupthen"GROUP"elseifcheck_flagflaggnu_df_1_nodeletethen"NODELETE"elseifcheck_flagflaggnu_df_1_loadfltrthen"LOADFLTR"elseifcheck_flagflaggnu_df_1_initfirstthen"INITFIRST"elseifcheck_flagflaggnu_df_1_noopenthen"NOOPEN"elseifcheck_flagflaggnu_df_1_originthen"ORIGIN"elseifcheck_flagflaggnu_df_1_directthen"DIRECT"elseifcheck_flagflaggnu_df_1_transthen"TRANS"elseifcheck_flagflaggnu_df_1_interposethen"INTERPOSE"elseifcheck_flagflaggnu_df_1_nodeflibthen"NODEFLIB"elseifcheck_flagflaggnu_df_1_nodumpthen"NODUMP"elseifcheck_flagflaggnu_df_1_confaltthen"CONFALT"elseifcheck_flagflaggnu_df_1_endfilteethen"ENDFILTEE"elseifcheck_flagflaggnu_df_1_dispreldnethen"DISPRELDNE"elseifcheck_flagflaggnu_df_1_disprelpndthen"DISPRELPND"elseifcheck_flagflag(Nat_big_num.addgnu_df_1_nodeletegnu_df_1_now)then"NOW NODELETE"elseifcheck_flagflag(Nat_big_num.addgnu_df_1_nodeletegnu_df_1_initfirst)then"NODELETE INITFIRST"else(* XXX: add more as necessary *)"Invalid GNU dynamic flag")(** [gnu_ext_os_additional_ranges m] checks whether dynamic section type [m]
* lies within the ranges set aside for GNU specific functionality.
* NB: quite ad hoc as this is not properly specified anywhere.
*)(*val gnu_ext_os_additional_ranges : natural -> bool*)letgnu_ext_os_additional_rangesm:bool=(ifNat_big_num.greater_equalmelf_dt_gnu_addrrnglo&&Nat_big_num.less_equalmelf_dt_gnu_addrrnghithentrueelseNat_big_num.equal(* ad hoc extensions go here... *)melf_dt_gnu_verneed||(Nat_big_num.equalmelf_dt_gnu_verneednum||(Nat_big_num.equalmelf_dt_gnu_versym||(Nat_big_num.equalmelf_dt_gnu_verdef||(Nat_big_num.equalmelf_dt_gnu_verdefnum||(Nat_big_num.equalmelf_dt_gnu_flags_1||(Nat_big_num.equalmelf_dt_gnu_relcount||(Nat_big_num.equalmelf_dt_gnu_relacount||(Nat_big_num.equalmelf_dt_gnu_checksum||Nat_big_num.equalmelf_dt_gnu_prelinked)))))))))(** [gnu_ext_tag_correspondence_of_tag0 m] produces a tag correspondence for the
* extended GNU-specific dynamic section types [m]. Used to provide the ABI
* specific functionality expected of the corresponding function in the elf_dynamic
* module.
*)(*val gnu_ext_tag_correspondence_of_tag0 : natural -> error tag_correspondence*)letgnu_ext_tag_correspondence_of_tag0m:(tag_correspondence)error=(ifNat_big_num.equalmelf_dt_gnu_hashthenreturnC_PtrelseifNat_big_num.equalmelf_dt_gnu_flags_1thenreturnC_ValelseifNat_big_num.equalmelf_dt_gnu_versymthenreturnC_PtrelseifNat_big_num.equalmelf_dt_gnu_verneednumthenreturnC_ValelseifNat_big_num.equalmelf_dt_gnu_verneedthenreturnC_PtrelseifNat_big_num.equalmelf_dt_gnu_verdefthenreturnC_PtrelseifNat_big_num.equalmelf_dt_gnu_verdefnumthenreturnC_ValelseifNat_big_num.equalmelf_dt_gnu_relcountthenreturnC_ValelseifNat_big_num.equalmelf_dt_gnu_relacountthenreturnC_ValelseifNat_big_num.equalmelf_dt_gnu_checksumthenreturnC_ValelseifNat_big_num.equalmelf_dt_gnu_prelinkedthenreturnC_Valelsefail"gnu_ext_tag_correspondence_of_tag0: invalid dynamic tag")(** [gnu_ext_tag_correspondence_of_tag m] produces a tag correspondence for the
* extended GNU-specific dynamic section types [m]. Used to provide the ABI
* specific functionality expected of the corresponding function in the elf_dynamic
* module.
* TODO: examine whether this and the function above really need separating into
* two functions.
*)(*val gnu_ext_tag_correspondence_of_tag : natural -> error tag_correspondence*)letgnu_ext_tag_correspondence_of_tagm:(tag_correspondence)error=(ifNat_big_num.greater_equalmelf_dt_gnu_addrrnglo&&Nat_big_num.less_equalmelf_dt_gnu_addrrnghithenreturnC_PtrelseifNat_big_num.greater_equalmelf_dt_gnu_valrnglo&&Nat_big_num.less_equalmelf_dt_gnu_valrnghithenreturnC_Valelseifgnu_ext_os_additional_rangesmthengnu_ext_tag_correspondence_of_tag0melseifNat_big_num.equalmelf_dt_gnu_syminszthenreturnC_Val(** unsure *)elseifNat_big_num.equalmelf_dt_gnu_syminfothenreturnC_Ptr(** unsure *)elseifNat_big_num.equalmelf_dt_gnu_syminentthenreturnC_Val(** unsure *)elseifNat_big_num.equalmelf_dt_gnu_posflag_1thenreturnC_Val(** unsure *)elseifNat_big_num.equalmelf_dt_gnu_numthenreturnC_IgnoredelseifNat_big_num.equalmelf_dt_gnu_filterthenreturnC_Val(** unsure *)elseifNat_big_num.equalmelf_dt_gnu_auxiliarythenreturnC_Val(** unsure *)elsefail("gnu_ext_tag_correspondence_of_tag: unrecognised GNU dynamic tag"))(** [gnu_ext_elf32_value_of_elf32_dyn0 dyn] extracts a dynamic value from the
* dynamic section entry [dyn] under the assumption that its type is a GNU
* extended dynamic section type. Fails otherwise. Used to provide the
* ABI-specific functionality expected of the corresponding functions in
* elf_dynamic.lem.
*)(*val gnu_ext_elf32_value_of_elf32_dyn0 : elf32_dyn -> string_table -> error elf32_dyn_value*)letgnu_ext_elf32_value_of_elf32_dyn0dynstbl:(((Uint32_wrapper.uint32),(Uint32_wrapper.uint32))dyn_value)error=(lettag=(Nat_big_num.abs(Nat_big_num.of_int32dyn.elf32_dyn_tag))inifNat_big_num.equaltagelf_dt_gnu_hashthenbind(matchdyn.elf32_dyn_d_unwith|D_Valv->fail"gnu_ext_elf32_value_of_elf32_dyn: GNU_HASH must be a PTR"|D_Ptrp->returnp|D_Ignoredi->fail"gnu_ext_elf32_value_of_elf32_dyn: GNU_HASH must be a PTR")(funaddr->return(Addressaddr))elseifNat_big_num.equaltagelf_dt_gnu_flags_1thenbind(matchdyn.elf32_dyn_d_unwith|D_Valv->returnv|D_Ptrp->fail"gnu_ext_elf32_value_of_elf32_dyn: FLAGS_1 must be a Val"|D_Ignoredi->fail"gnu_ext_elf32_value_of_elf32_dyn: FlAGS_1 must be a Val")(funf->return(Flags1(Uint32_wrapper.to_bigintf)))elseifNat_big_num.equaltagelf_dt_gnu_versymthenbind(matchdyn.elf32_dyn_d_unwith|D_Valv->fail"gnu_ext_elf32_value_of_elf32_dyn: VERSYM must be a PTR"|D_Ptrp->returnp|D_Ignoredi->fail"gnu_ext_elf32_value_of_elf32_dyn: VERSYM must be a PTR")(funaddr->return(Addressaddr))elseifNat_big_num.equaltagelf_dt_gnu_verdefthenbind(matchdyn.elf32_dyn_d_unwith|D_Valv->fail"gnu_ext_elf32_value_of_elf32_dyn: VERDEF must be a PTR"|D_Ptrp->returnp|D_Ignoredi->fail"gnu_ext_elf32_value_of_elf32_dyn: VERDEF must be a PTR")(funaddr->return(Addressaddr))elseifNat_big_num.equaltagelf_dt_gnu_verdefnumthenbind(matchdyn.elf32_dyn_d_unwith|D_Valv->returnv|D_Ptrp->fail"gnu_ext_elf32_value_of_elf32_dyn: VERDEFNUM must be a Val"|D_Ignoredi->fail"gnu_ext_elf32_value_of_elf32_dyn: VERDEFNUM must be a Val")(funsz->return(Numeric(Uint32_wrapper.to_bigintsz)))elseifNat_big_num.equaltagelf_dt_gnu_verneednumthenbind(matchdyn.elf32_dyn_d_unwith|D_Valv->returnv|D_Ptrp->fail"gnu_ext_elf32_value_of_elf32_dyn: VERNEEDNUM must be a Val"|D_Ignoredi->fail"gnu_ext_elf32_value_of_elf32_dyn: VERNEEDNUM must be a Val")(funsz->return(Numeric(Uint32_wrapper.to_bigintsz)))elseifNat_big_num.equaltagelf_dt_gnu_verneedthenbind(matchdyn.elf32_dyn_d_unwith|D_Valv->fail"gnu_ext_elf32_value_of_elf32_dyn: VERNEED must be a PTR"|D_Ptrp->returnp|D_Ignoredi->fail"gnu_ext_elf32_value_of_elf32_dyn: VERNEED must be a PTR")(funaddr->return(Addressaddr))elseifNat_big_num.equaltagelf_dt_gnu_relcountthenbind(matchdyn.elf32_dyn_d_unwith|D_Valv->returnv|D_Ptrp->fail"gnu_ext_elf32_value_of_elf32_dyn: RELCOUNT must be a Val"|D_Ignoredi->fail"gnu_ext_elf32_value_of_elf32_dyn: RELCOUNT must be a Val")(funsz->return(Numeric(Uint32_wrapper.to_bigintsz)))elseifNat_big_num.equaltagelf_dt_gnu_relacountthenbind(matchdyn.elf32_dyn_d_unwith|D_Valv->returnv|D_Ptrp->fail"gnu_ext_elf32_value_of_elf32_dyn: RELACOUNT must be a Val"|D_Ignoredi->fail"gnu_ext_elf32_value_of_elf32_dyn: RELACOUNT must be a Val")(funsz->return(Numeric(Uint32_wrapper.to_bigintsz)))elseifNat_big_num.equaltagelf_dt_gnu_checksumthenbind(matchdyn.elf32_dyn_d_unwith|D_Valv->returnv|D_Ptrp->fail"gnu_ext_elf32_value_of_elf32_dyn: CHECKSUM must be a Val"|D_Ignoredi->fail"gnu_ext_elf32_value_of_elf32_dyn: CHECKSUM must be a Val")(funsz->return(Checksum(Uint32_wrapper.to_bigintsz)))elseifNat_big_num.equaltagelf_dt_gnu_prelinkedthenbind(matchdyn.elf32_dyn_d_unwith|D_Valv->returnv|D_Ptrp->fail"gnu_ext_elf32_value_of_elf32_dyn: GNU_PRELINKED must be a Val"|D_Ignoredi->fail"gnu_ext_elf32_value_of_elf32_dyn: GNU_PRELINKED must be a Val")(funoff->return(Timestamp(Uint32_wrapper.to_bigintoff)))elsefail"gnu_ext_elf32_value_of_elf32_dyn0: unrecognised GNU dynamic tag")(** [gnu_ext_elf64_value_of_elf64_dyn0 dyn] extracts a dynamic value from the
* dynamic section entry [dyn] under the assumption that its type is a GNU
* extended dynamic section type. Fails otherwise. Used to provide the
* ABI-specific functionality expected of the corresponding functions in
* elf_dynamic.lem.
*)(*val gnu_ext_elf64_value_of_elf64_dyn0 : elf64_dyn -> string_table -> error elf64_dyn_value*)letgnu_ext_elf64_value_of_elf64_dyn0dynstbl:(((Uint64_wrapper.uint64),(Uint64_wrapper.uint64))dyn_value)error=(lettag=(Nat_big_num.abs(Nat_big_num.of_int64dyn.elf64_dyn_tag))inifNat_big_num.equaltagelf_dt_gnu_hashthenbind(matchdyn.elf64_dyn_d_unwith|D_Valv->fail"gnu_ext_elf64_value_of_elf64_dyn: GNU_HASH must be a PTR"|D_Ptrp->returnp|D_Ignoredi->fail"gnu_ext_elf64_value_of_elf64_dyn: GNU_HASH must be a PTR")(funaddr->return(Addressaddr))elseifNat_big_num.equaltagelf_dt_gnu_flags_1thenbind(matchdyn.elf64_dyn_d_unwith|D_Valv->returnv|D_Ptrp->fail"gnu_ext_elf64_value_of_elf64_dyn: FLAGS_1 must be a Val"|D_Ignoredi->fail"gnu_ext_elf64_value_of_elf64_dyn: FlAGS_1 must be a Val")(funf->return(Flags1(Ml_bindings.nat_big_num_of_uint64f)))elseifNat_big_num.equaltagelf_dt_gnu_versymthenbind(matchdyn.elf64_dyn_d_unwith|D_Valv->fail"gnu_ext_elf64_value_of_elf64_dyn: VERSYM must be a PTR"|D_Ptrp->returnp|D_Ignoredi->fail"gnu_ext_elf64_value_of_elf64_dyn: VERSYM must be a PTR")(funaddr->return(Addressaddr))elseifNat_big_num.equaltagelf_dt_gnu_verdefthenbind(matchdyn.elf64_dyn_d_unwith|D_Valv->fail"gnu_ext_elf64_value_of_elf64_dyn: VERDEF must be a PTR"|D_Ptrp->returnp|D_Ignoredi->fail"gnu_ext_elf64_value_of_elf64_dyn: VERDEF must be a PTR")(funaddr->return(Addressaddr))elseifNat_big_num.equaltagelf_dt_gnu_verdefnumthenbind(matchdyn.elf64_dyn_d_unwith|D_Valv->returnv|D_Ptrp->fail"gnu_ext_elf32_value_of_elf64_dyn: VERDEFNUM must be a Val"|D_Ignoredi->fail"gnu_ext_elf32_value_of_elf64_dyn: VERDEFNUM must be a Val")(funsz->return(Numeric(Ml_bindings.nat_big_num_of_uint64sz)))elseifNat_big_num.equaltagelf_dt_gnu_verneednumthenbind(matchdyn.elf64_dyn_d_unwith|D_Valv->returnv|D_Ptrp->fail"gnu_ext_elf64_value_of_elf64_dyn: VERNEEDNUM must be a Val"|D_Ignoredi->fail"gnu_ext_elf64_value_of_elf64_dyn: VERNEEDNUM must be a Val")(funsz->return(Numeric(Ml_bindings.nat_big_num_of_uint64sz)))elseifNat_big_num.equaltagelf_dt_gnu_verneedthenbind(matchdyn.elf64_dyn_d_unwith|D_Valv->fail"gnu_ext_elf64_value_of_elf64_dyn: VERNEED must be a PTR"|D_Ptrp->returnp|D_Ignoredi->fail"gnu_ext_elf64_value_of_elf64_dyn: VERNEED must be a PTR")(funaddr->return(Addressaddr))elseifNat_big_num.equaltagelf_dt_gnu_relcountthenbind(matchdyn.elf64_dyn_d_unwith|D_Valv->returnv|D_Ptrp->fail"gnu_ext_elf64_value_of_elf64_dyn: RELCOUNT must be a Val"|D_Ignoredi->fail"gnu_ext_elf64_value_of_elf64_dyn: RELCOUNT must be a Val")(funsz->return(Numeric(Ml_bindings.nat_big_num_of_uint64sz)))elseifNat_big_num.equaltagelf_dt_gnu_relacountthenbind(matchdyn.elf64_dyn_d_unwith|D_Valv->returnv|D_Ptrp->fail"gnu_ext_elf64_value_of_elf64_dyn: RELACOUNT must be a Val"|D_Ignoredi->fail"gnu_ext_elf64_value_of_elf64_dyn: RELACOUNT must be a Val")(funsz->return(Numeric(Ml_bindings.nat_big_num_of_uint64sz)))elseifNat_big_num.equaltagelf_dt_gnu_checksumthenbind(matchdyn.elf64_dyn_d_unwith|D_Valv->returnv|D_Ptrp->fail"gnu_ext_elf64_value_of_elf64_dyn: CHECKSUM must be a Val"|D_Ignoredi->fail"gnu_ext_elf64_value_of_elf64_dyn: CHECKSUM must be a Val")(funsz->return(Checksum(Ml_bindings.nat_big_num_of_uint64sz)))elseifNat_big_num.equaltagelf_dt_gnu_prelinkedthenbind(matchdyn.elf64_dyn_d_unwith|D_Valv->returnv|D_Ptrp->fail"gnu_ext_elf64_value_of_elf64_dyn: GNU_PRELINKED must be a Val"|D_Ignoredi->fail"gnu_ext_elf64_value_of_elf64_dyn: GNU_PRELINKED must be a Val")(funoff->return(Timestamp(Ml_bindings.nat_big_num_of_uint64off)))elsefail"gnu_ext_elf64_value_of_elf64_dyn0: unrecognised GNU dynamic tag")(** [gnu_ext_elf32_value_of_elf32_dyn dyn] extracts a dynamic value from the
* dynamic section entry [dyn] under the assumption that its type is a GNU
* extended dynamic section type. Fails otherwise. Used to provide the
* ABI-specific functionality expected of the corresponding functions in
* elf_dynamic.lem.
* TODO: some of these cases are missing as they have never come up in "real"
* ELF files that have been processed as part of validation. Try and find some
* files that do actually exhibit these.
*)(*val gnu_ext_elf32_value_of_elf32_dyn : elf32_dyn -> string_table -> error elf32_dyn_value*)letgnu_ext_elf32_value_of_elf32_dyndynstbl:(elf32_dyn_value)error=(lettag=(Nat_big_num.abs(Nat_big_num.of_int32dyn.elf32_dyn_tag))inifgnu_ext_os_additional_rangestagthen(* this should cover valrngs and addrrngs *)gnu_ext_elf32_value_of_elf32_dyn0dynstblelseifNat_big_num.equaltagelf_dt_gnu_syminszthenbind(matchdyn.elf32_dyn_d_unwith|D_Valv->returnv|D_Ptrp->fail"gnu_ext_elf32_value_of_elf32_dyn: SYMINSZ must be a VAL"|D_Ignoredi->fail"gnu_ext_elf32_value_of_elf32_dyn: SYMINSZ must be a VAL")(funsz->return(Sizesz))elseifNat_big_num.equaltagelf_dt_gnu_syminfothenfail"SYMINFO"(* XXX: never seen in 32-bit ELF *)elseifNat_big_num.equaltagelf_dt_gnu_syminentthenfail"SYMINENT"(* XXX: never seen in 32-bit ELF *)elseifNat_big_num.equaltagelf_dt_gnu_posflag_1thenfail"POSFLAG_1"(* XXX: never seen in 32-bit ELF *)elseifNat_big_num.equaltagelf_dt_gnu_numthenfail"NUM"(* XXX: never seen in 32-bit ELF *)elseifNat_big_num.equaltagelf_dt_gnu_filterthenfail"FILTER"(* XXX: never seen in 32-bit ELF *)elseifNat_big_num.equaltagelf_dt_gnu_auxiliarythenfail"AUXILIARY"(* XXX: never seen in 32-bit ELF *)elsefail"gnu_ext_elf32_value_of_elf32_dyn: unrecognised GNU dynamic tag")(** [gnu_ext_elf64_value_of_elf64_dyn dyn] extracts a dynamic value from the
* dynamic section entry [dyn] under the assumption that its type is a GNU
* extended dynamic section type. Fails otherwise. Used to provide the
* ABI-specific functionality expected of the corresponding functions in
* elf_dynamic.lem.
* TODO: some of these cases are missing as they have never come up in "real"
* ELF files that have been processed as part of validation. Try and find some
* files that do actually exhibit these.
*)(*val gnu_ext_elf64_value_of_elf64_dyn : elf64_dyn -> string_table -> error elf64_dyn_value*)letgnu_ext_elf64_value_of_elf64_dyndynstbl:(elf64_dyn_value)error=(lettag=(Nat_big_num.abs(Nat_big_num.of_int64dyn.elf64_dyn_tag))inifgnu_ext_os_additional_rangestagthen(* this should cover valrngs and addrrngs *)gnu_ext_elf64_value_of_elf64_dyn0dynstblelseifNat_big_num.equaltagelf_dt_gnu_syminszthenbind(matchdyn.elf64_dyn_d_unwith|D_Valv->returnv|D_Ptrp->fail"gnu_ext_elf64_value_of_elf64_dyn: SYMINSZ must be a VAL"|D_Ignoredi->fail"gnu_ext_elf64_value_of_elf64_dyn: SYMINSZ must be a VAL")(funsz->return(Sizesz))elseifNat_big_num.equaltagelf_dt_gnu_syminfothenfail"SYMINFO"(* XXX: fill in as seen *)elseifNat_big_num.equaltagelf_dt_gnu_syminentthenfail"SYMINENT"(* XXX: fill in as seen *)elseifNat_big_num.equaltagelf_dt_gnu_posflag_1thenfail"POSFLAG_1"(* XXX: fill in as seen *)elseifNat_big_num.equaltagelf_dt_gnu_numthenfail"NUM"(* XXX: fill in as seen *)elseifNat_big_num.equaltagelf_dt_gnu_filterthenfail"FILTER"(* XXX: fill in as seen *)elseifNat_big_num.equaltagelf_dt_gnu_auxiliarythenfail"AUXILIARY"(* XXX: fill in as seen *)elsefail"gnu_ext_elf64_value_of_elf64_dyn: unrecognised GNU dynamic tag")(** [string_of_gnu_ext_dynamic_tag0 m] produces a string based representation of
* GNU extensions dynamic tag value [m].
*)(*val string_of_gnu_ext_dynamic_tag0 : natural -> string*)letstring_of_gnu_ext_dynamic_tag0m:string=(ifNat_big_num.equalmelf_dt_gnu_hashthen"GNU_HASH"elseifNat_big_num.equalmelf_dt_gnu_flags_1then"FLAGS_1"elseifNat_big_num.equalmelf_dt_gnu_versymthen"VERSYM"elseifNat_big_num.equalmelf_dt_gnu_verneednumthen"VERNEEDNUM"elseifNat_big_num.equalmelf_dt_gnu_verneedthen"VERNEED"elseifNat_big_num.equalmelf_dt_gnu_relcountthen"RELCOUNT"elseifNat_big_num.equalmelf_dt_gnu_relacountthen"RELACOUNT"elseifNat_big_num.equalmelf_dt_gnu_verdefnumthen"VERDEFNUM"elseifNat_big_num.equalmelf_dt_gnu_verdefthen"VERDEF"elseifNat_big_num.equalmelf_dt_gnu_checksumthen"CHECKSUM"elseifNat_big_num.equalmelf_dt_gnu_prelinkedthen"GNU_PRELINKED"else"Invalid dynamic tag")(** [string_of_gnu_ext_dynamic_tag m] produces a string based representation of
* GNU extensions dynamic tag value [m].
*)(*val string_of_gnu_ext_dynamic_tag : natural -> string*)letstring_of_gnu_ext_dynamic_tagm:string=(ifNat_big_num.greater_equalmelf_dt_gnu_addrrnglo&&Nat_big_num.less_equalmelf_dt_gnu_addrrnghithenstring_of_gnu_ext_dynamic_tag0melseifNat_big_num.greater_equalmelf_dt_gnu_valrnglo&&Nat_big_num.less_equalmelf_dt_gnu_valrnghithenstring_of_gnu_ext_dynamic_tag0melseifgnu_ext_os_additional_rangesmthenstring_of_gnu_ext_dynamic_tag0melseifNat_big_num.equalmelf_dt_gnu_syminszthen"SYMINSZ"elseifNat_big_num.equalmelf_dt_gnu_syminfothen"SYMINFO"elseifNat_big_num.equalmelf_dt_gnu_syminentthen"SYMINENT"elseifNat_big_num.equalmelf_dt_gnu_posflag_1then"POSFLAG_1"elseifNat_big_num.equalmelf_dt_gnu_numthen"NUM"elseifNat_big_num.equalmelf_dt_gnu_filterthen"FILTER"elseifNat_big_num.equalmelf_dt_gnu_auxiliarythen"AUXILIARY"else"Invalid dynamic tag")