Variable ge: genv.
(** The two functions below axiomatize how the linker processes symbolic references [symbol + offset)] and splits their actual values into a 20-bit high part [%hi(symbol + offset)] and a 12-bit low part [%lo(symbol + offset)]. *)
Parameter low_half: genv -> ident -> ptrofs -> ptrofs.
Parameter high_half: genv -> ident -> ptrofs -> val.
(** The fundamental property of these operations is that, when applied to the address of a symbol, their results can be recombined by addition, rebuilding the original address. *)

Axiom low_high_half:
forall id ofs,
Val.offset_ptr (high_half ge id ofs) (low_half ge id ofs) = Genv.symbol_address ge id ofs.