diff options
author | Bernhard Schommer <bernhardschommer@gmail.com> | 2015-10-20 14:45:56 +0200 |
---|---|---|
committer | Bernhard Schommer <bernhardschommer@gmail.com> | 2015-10-20 14:45:56 +0200 |
commit | ed6043fe910f7a320f7af6d3f9d35f39f5cf7ee1 (patch) | |
tree | 3fab134f5444f0472a1ff8c06e5b7686a40648dc /checklink/ELF_utils.ml | |
parent | 4d542bc7eafadb16b845cf05d1eb4988eb55ed0f (diff) | |
parent | 8a95c3e07fd02eaa87f8cca447bc7d7c2642eb22 (diff) | |
download | compcert-ed6043fe910f7a320f7af6d3f9d35f39f5cf7ee1.tar.gz compcert-ed6043fe910f7a320f7af6d3f9d35f39f5cf7ee1.zip |
Merge remote-tracking branch 'origin/master' into named-externals
Conflicts:
arm/TargetPrinter.ml
backend/CMparser.mly
backend/SelectLongproof.v
backend/Selectionproof.v
cfrontend/C2C.ml
checklink/Asm_printers.ml
checklink/Check.ml
checklink/Fuzz.ml
common/AST.v
debug/DebugInformation.ml
debug/DebugInit.ml
debug/DwarfPrinter.ml
debug/DwarfTypes.mli
debug/Dwarfgen.ml
exportclight/ExportClight.ml
ia32/TargetPrinter.ml
powerpc/Asm.v
powerpc/SelectOpproof.v
powerpc/TargetPrinter.ml
Diffstat (limited to 'checklink/ELF_utils.ml')
-rw-r--r-- | checklink/ELF_utils.ml | 128 |
1 files changed, 0 insertions, 128 deletions
diff --git a/checklink/ELF_utils.ml b/checklink/ELF_utils.ml deleted file mode 100644 index 898c778d..00000000 --- a/checklink/ELF_utils.ml +++ /dev/null @@ -1,128 +0,0 @@ -open ELF_types -open Library - -let section_ndx_by_name_noelf (eshdra: elf32_shdr array)(name: string): int = - match array_exists (fun eshdr -> eshdr.sh_name = name) eshdra with - | Some sndx -> sndx - | None -> assert false - -let section_ndx_by_name (e: elf)(name: string): int option = - array_exists (fun eshdr -> eshdr.sh_name = name) e.e_shdra - -let section_bitstring_noelf - (bs: bitstring)(eshdra: elf32_shdr array)(sndx: int): bitstring = - let sofs = Safe32.to_int eshdra.(sndx).sh_offset in - let size = Safe32.to_int eshdra.(sndx).sh_size in - Bitstring.subbitstring bs Safe.(sofs * 8) Safe.(size * 8) - -let section_bitstring (e: elf): int -> bitstring = - section_bitstring_noelf e.e_bitstring e.e_shdra - -let physical_offset_of_vaddr (e: elf)(vaddr: int32): int32 option = - begin match e.e_sym_phdr vaddr with - | None -> None - | Some(pndx) -> - let phdr = e.e_phdra.(pndx) in - let vaddr_ofs = Safe32.(vaddr - phdr.p_vaddr) in - Some(Safe32.(phdr.p_offset + vaddr_ofs)) - end - -(* TODO: could make this more efficient, but it's not often called *) -let section_at_vaddr (e: elf)(vaddr: int32): int option = - array_exists - (fun shdr -> - shdr.sh_addr <= vaddr && vaddr < Int32.add shdr.sh_addr shdr.sh_size - ) - e.e_shdra - -(** - Returns the bitstring of the specified byte size beginning at the specified - virtual address, along with its physical byte offset and physical byte size, - that is, the space it occupies in the file. -*) -let bitstring_at_vaddr (e: elf)(vaddr: int32)(size:int32): - (bitstring * int32 * int32) option = - match e.e_sym_phdr vaddr with - | None -> None - | Some(pndx) -> - let phdr = e.e_phdra.(pndx) in - let phdr_mem_first = phdr.p_vaddr in - let phdr_mem_last = Safe32.(phdr.p_vaddr + phdr.p_memsz - 1l) in - let vaddr_mem_first = vaddr in - let vaddr_mem_last = Safe32.(vaddr + size - 1l) in - if not (phdr_mem_first <= vaddr_mem_first && vaddr_mem_last <= phdr_mem_last) - then None (* we're overlapping segments *) - else - let vaddr_relative_ofs = Safe32.(vaddr_mem_first - phdr_mem_first) in - let vaddr_file_ofs = Safe32.(phdr.p_offset + vaddr_relative_ofs) in - if phdr.p_filesz = 0l || vaddr_relative_ofs > phdr.p_filesz - then - Some( - Bitstring.create_bitstring Safe32.(to_int (8l * size)), - phdr.p_offset, (* whatever? *) - 0l - ) - else if Safe32.(vaddr_relative_ofs + size) > phdr.p_filesz - then - let bit_start = Safe32.(to_int (8l * vaddr_file_ofs)) in - let vaddr_file_len = Safe32.(phdr.p_filesz - vaddr_relative_ofs) in - let bit_len = Safe32.(to_int (8l * vaddr_file_len)) in - let first = Bitstring.subbitstring e.e_bitstring bit_start bit_len in - let rest = Bitstring.create_bitstring (8 * Safe32.to_int size - bit_len) in - Some( - Bitstring.concat [first; rest], - vaddr_file_ofs, - vaddr_file_len - ) - else - let bit_start = Safe32.(to_int (8l * (phdr.p_offset + vaddr_relative_ofs))) in - let bit_len = Safe.(8 * Safe32.to_int size) in - Some( - Bitstring.subbitstring e.e_bitstring bit_start bit_len, - vaddr_file_ofs, - size - ) - -(** - Returns the entire bitstring that begins at the specified virtual address and - ends at the end of the segment. -*) -let bitstring_at_vaddr_nosize (e: elf)(vaddr: int32): - (bitstring * int32 * int32) option = - match e.e_sym_phdr vaddr with - | None -> None - | Some(pndx) -> - let phdr = e.e_phdra.(pndx) in - let first_byte_vaddr = vaddr in - let last_byte_vaddr = Safe32.(phdr.p_vaddr + phdr.p_memsz - 1l) in - let size = Safe32.(last_byte_vaddr - first_byte_vaddr + 1l) in - bitstring_at_vaddr e vaddr size - -(** - Removes symbol version for GCC's symbols. -*) -let strip_versioning (s: string): string = - try String.sub s 0 (String.index s '@') - with Not_found -> s - -(** - Removes CompCert's mangling of variadic functions -*) -let strip_mangling (s: string): string = - try String.sub s 0 (String.index s '$') - with Not_found -> s - -(** - Returns the list of all symbols matching the specified name. -*) -let ndxes_of_sym_name (e: elf) (name: string): int list = - try StringMap.find (strip_mangling name) e.e_syms_by_name with Not_found -> [] - -(** - Returns the index of the first symbol matching the specified name, if it - exists. -*) -let ndx_of_sym_name (e: elf) (name: string): int option = - match ndxes_of_sym_name e name with - | [] -> None - | h::_ -> Some(h) |