1 2 /*--------------------------------------------------------------------*/ 3 /*--- Create initial process image on for the client ---*/ 4 /*--- pub_core_initimg.h ---*/ 5 /*--------------------------------------------------------------------*/ 6 7 /* 8 This file is part of Valgrind, a dynamic binary instrumentation 9 framework. 10 11 Copyright (C) 2006-2017 OpenWorks LLP 12 info@open-works.co.uk 13 14 This program is free software; you can redistribute it and/or 15 modify it under the terms of the GNU General Public License as 16 published by the Free Software Foundation; either version 2 of the 17 License, or (at your option) any later version. 18 19 This program is distributed in the hope that it will be useful, but 20 WITHOUT ANY WARRANTY; without even the implied warranty of 21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 22 General Public License for more details. 23 24 You should have received a copy of the GNU General Public License 25 along with this program; if not, write to the Free Software 26 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 27 02111-1307, USA. 28 29 The GNU General Public License is contained in the file COPYING. 30 */ 31 32 #ifndef __PUB_CORE_INITIMG_H 33 #define __PUB_CORE_INITIMG_H 34 35 #include "pub_core_basics.h" // Addr 36 #include "libvex.h" 37 38 //-------------------------------------------------------------------- 39 // PURPOSE: Map the client executable into memory, then set up its 40 // stack, environment and data section, ready for execution. Quite a 41 // lot of work on Linux (ELF). 42 //-------------------------------------------------------------------- 43 44 /* These are OS-specific and defined below. */ 45 typedef struct _IICreateImageInfo IICreateImageInfo; 46 typedef struct _IIFinaliseImageInfo IIFinaliseImageInfo; 47 48 /* This is a two stage process. The first stage, which is most of the 49 work, creates the initial image in memory to the extent possible. 50 To do this it takes a bundle of information in an IICreateImageInfo 51 structure, which is gathered in an OS-specific way at startup. 52 This returns an IIFinaliseImageInfo structure: */ 53 extern 54 IIFinaliseImageInfo VG_(ii_create_image)( IICreateImageInfo, 55 const VexArchInfo* vex_archinfo ); 56 57 /* Just before starting the client, we may need to make final 58 adjustments to its initial image. Also we need to set up the VEX 59 guest state for thread 1 (the root thread) and copy in essential 60 starting values. This is handed the IIFinaliseImageInfo created by 61 VG_(ii_create_image). */ 62 extern 63 void VG_(ii_finalise_image)( IIFinaliseImageInfo ); 64 65 /* Note that both IICreateImageInfo and IIFinaliseImageInfo are 66 OS-specific. We now go on to give instantiations of them 67 for supported OSes. */ 68 69 /* ------------------------- Linux ------------------------- */ 70 71 #if defined(VGO_linux) 72 73 struct _IICreateImageInfo { 74 /* ------ Mandatory fields ------ */ 75 const HChar* toolname; 76 Addr sp_at_startup; 77 Addr clstack_end; // Highest stack addressable byte 78 /* ------ Per-OS fields ------ */ 79 HChar** argv; 80 HChar** envp; 81 }; 82 83 struct _IIFinaliseImageInfo { 84 /* ------ Mandatory fields ------ */ 85 SizeT clstack_max_size; 86 Addr initial_client_SP; 87 /* ------ Per-OS fields ------ */ 88 Addr initial_client_IP; 89 Addr initial_client_TOC; 90 UInt* client_auxv; 91 /* ------ Arch-specific ELF loading state ------ */ 92 struct vki_arch_elf_state arch_elf_state; 93 }; 94 95 /* ------------------------- Darwin ------------------------- */ 96 97 #elif defined(VGO_darwin) 98 99 struct _IICreateImageInfo { 100 /* ------ Mandatory fields ------ */ 101 const HChar* toolname; 102 Addr sp_at_startup; 103 Addr clstack_end; // highest stack addressable byte 104 /* ------ Per-OS fields ------ */ 105 HChar** argv; 106 HChar** envp; 107 Addr entry; /* &_start */ 108 Addr init_ip; /* &__dyld_start, or copy of entry */ 109 Addr stack_start; /* stack segment hot */ 110 Addr stack_end; /* stack segment cold */ 111 Addr text; /* executable's Mach header */ 112 Bool dynamic; /* False iff executable is static */ 113 HChar* executable_path; /* path passed to execve() */ 114 }; 115 116 struct _IIFinaliseImageInfo { 117 /* ------ Mandatory fields ------ */ 118 SizeT clstack_max_size; 119 Addr initial_client_SP; 120 /* ------ Per-OS fields ------ */ 121 Addr initial_client_IP; 122 }; 123 124 /* ------------------------- Solaris ------------------------- */ 125 126 #elif defined(VGO_solaris) 127 128 struct _IICreateImageInfo { 129 /* ------ Mandatory fields ------ */ 130 const HChar* toolname; 131 Addr sp_at_startup; 132 Addr clstack_end; /* highest stack addressable byte */ 133 /* ------ Per-OS fields ------ */ 134 HChar** argv; 135 HChar** envp; 136 }; 137 138 struct _IIFinaliseImageInfo { 139 /* ------ Mandatory fields ------ */ 140 SizeT clstack_max_size; 141 Addr initial_client_SP; 142 /* ------ Per-OS fields ------ */ 143 Addr initial_client_IP; 144 Addr initial_client_TOC; 145 UInt* client_auxv; 146 Addr initial_client_TP; /* thread pointer */ 147 }; 148 149 #else 150 # error "Unknown OS" 151 #endif 152 153 154 #endif // __PUB_CORE_INITIMG_H 155 156 /*--------------------------------------------------------------------*/ 157 /*--- end ---*/ 158 /*--------------------------------------------------------------------*/ 159