12886b0ee5858900af3ab9392ee9d0884a549ce04jseward 21fe545083582f11a77d928ffed6c0074bd6f381bnethercote/*--------------------------------------------------------------------*/ 308a2e173ad2067f19c0466dd6c774d36b4575262njn/*--- User-mode execve. pub_core_ume.h ---*/ 41fe545083582f11a77d928ffed6c0074bd6f381bnethercote/*--------------------------------------------------------------------*/ 51fe545083582f11a77d928ffed6c0074bd6f381bnethercote 62886b0ee5858900af3ab9392ee9d0884a549ce04jseward/* 7b9c427c63a278cc612ae0ec573be7bb1abaa447fnjn This file is part of Valgrind, a dynamic binary instrumentation 8b9c427c63a278cc612ae0ec573be7bb1abaa447fnjn framework. 92886b0ee5858900af3ab9392ee9d0884a549ce04jseward 10ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes Copyright (C) 2000-2017 Julian Seward 112886b0ee5858900af3ab9392ee9d0884a549ce04jseward jseward@acm.org 122886b0ee5858900af3ab9392ee9d0884a549ce04jseward 132886b0ee5858900af3ab9392ee9d0884a549ce04jseward This program is free software; you can redistribute it and/or 142886b0ee5858900af3ab9392ee9d0884a549ce04jseward modify it under the terms of the GNU General Public License as 152886b0ee5858900af3ab9392ee9d0884a549ce04jseward published by the Free Software Foundation; either version 2 of the 162886b0ee5858900af3ab9392ee9d0884a549ce04jseward License, or (at your option) any later version. 172886b0ee5858900af3ab9392ee9d0884a549ce04jseward 182886b0ee5858900af3ab9392ee9d0884a549ce04jseward This program is distributed in the hope that it will be useful, but 192886b0ee5858900af3ab9392ee9d0884a549ce04jseward WITHOUT ANY WARRANTY; without even the implied warranty of 202886b0ee5858900af3ab9392ee9d0884a549ce04jseward MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 212886b0ee5858900af3ab9392ee9d0884a549ce04jseward General Public License for more details. 222886b0ee5858900af3ab9392ee9d0884a549ce04jseward 232886b0ee5858900af3ab9392ee9d0884a549ce04jseward You should have received a copy of the GNU General Public License 242886b0ee5858900af3ab9392ee9d0884a549ce04jseward along with this program; if not, write to the Free Software 252886b0ee5858900af3ab9392ee9d0884a549ce04jseward Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 262886b0ee5858900af3ab9392ee9d0884a549ce04jseward 02111-1307, USA. 272886b0ee5858900af3ab9392ee9d0884a549ce04jseward 282886b0ee5858900af3ab9392ee9d0884a549ce04jseward The GNU General Public License is contained in the file COPYING. 292886b0ee5858900af3ab9392ee9d0884a549ce04jseward*/ 302886b0ee5858900af3ab9392ee9d0884a549ce04jseward 3108a2e173ad2067f19c0466dd6c774d36b4575262njn#ifndef __PUB_CORE_UME_H 3208a2e173ad2067f19c0466dd6c774d36b4575262njn#define __PUB_CORE_UME_H 3308a2e173ad2067f19c0466dd6c774d36b4575262njn 34535fb1b49a80f2e880f755ee618381de3e222ddfflorian#include "pub_core_basics.h" // VG_ macro 35535fb1b49a80f2e880f755ee618381de3e222ddfflorian 3608a2e173ad2067f19c0466dd6c774d36b4575262njn//-------------------------------------------------------------------- 3708a2e173ad2067f19c0466dd6c774d36b4575262njn// PURPOSE: This module implements user-mode execve, ie. program loading 38ec7be9c3b51e516092dde66a5ff11ea11b114535sewardj// and exec'ing. 3908a2e173ad2067f19c0466dd6c774d36b4575262njn//-------------------------------------------------------------------- 407e343cd9bc720226fa395b1588621086f152dd5efitzhardinge 41107e1c0ebd1fa36ade35dff79dd40f0a67e3cb19nethercote/*------------------------------------------------------------*/ 4291772d140e9f918c25b9b20233d3673367b799dfnjn/*--- Loading files ---*/ 43107e1c0ebd1fa36ade35dff79dd40f0a67e3cb19nethercote/*------------------------------------------------------------*/ 44107e1c0ebd1fa36ade35dff79dd40f0a67e3cb19nethercote 45ea147e739aff620b1336537f251f58f074ec16f2nethercote// Info needed to load and run a program. IN/INOUT/OUT refers to the 46ea147e739aff620b1336537f251f58f074ec16f2nethercote// inputs/outputs of do_exec(). 4713247ca4d05152e83527b63d7350fba76cb05728sewardjtypedef 4813247ca4d05152e83527b63d7350fba76cb05728sewardj struct { 493e7986312a0ffc7646b0552d4c4ea3744a870e73florian const HChar** argv; // IN: the original argv 5013247ca4d05152e83527b63d7350fba76cb05728sewardj 5113247ca4d05152e83527b63d7350fba76cb05728sewardj Addr exe_base; // INOUT: lowest (allowed) address of exe 5213247ca4d05152e83527b63d7350fba76cb05728sewardj Addr exe_end; // INOUT: highest (allowed) address 5313247ca4d05152e83527b63d7350fba76cb05728sewardj 54f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#if !defined(VGO_darwin) 553d24135101d712a59f9ec722e95d2a5670ea735etom Addr phdr; // OUT: address phdr was mapped at 563d24135101d712a59f9ec722e95d2a5670ea735etom Int phnum; // OUT: number of phdrs 573d24135101d712a59f9ec722e95d2a5670ea735etom UInt stack_prot; // OUT: stack permissions 583d24135101d712a59f9ec722e95d2a5670ea735etom PtrdiffT interp_offset; // OUT: relocation offset for ld.so 59f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#else 60f76d27a697a7b0bf3b84490baf60623fc96a23afnjn Addr stack_start; // OUT: address of start of stack segment (hot) 61f76d27a697a7b0bf3b84490baf60623fc96a23afnjn Addr stack_end; // OUT: address of end of stack segment (cold) 62f76d27a697a7b0bf3b84490baf60623fc96a23afnjn Addr text; // OUT: address of executable's Mach header 63f76d27a697a7b0bf3b84490baf60623fc96a23afnjn Bool dynamic; // OUT: False iff executable is static 64dc240c8d5df401333a4e6aa92afe874edc43c1c3florian HChar* executable_path; // OUT: path passed to execve() 65f76d27a697a7b0bf3b84490baf60623fc96a23afnjn#endif 66f76d27a697a7b0bf3b84490baf60623fc96a23afnjn 678eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#if defined(VGO_solaris) 68358f27ccb54ef77fbd0d6e199b4b5431dfb1b465iraisr Addr init_thrptr; // OUT: architecture-specific user per-thread location 69358f27ccb54ef77fbd0d6e199b4b5431dfb1b465iraisr Bool real_phdr_present; // OUT: PT_PHDR found, include phdr in auxv 70bcfaeedb1e1ac2625eea81951a785a777834321ciraisr Bool ldsoexec; // OUT: the program is the runtime linker itself 718eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#endif 728eb8bab992e3998c33770b0cdb16059a8b918a06sewardj 73a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#if defined(VGO_linux) 74a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes // INOUT: architecture-specific ELF loading state 75a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes struct vki_arch_elf_state *arch_elf_state; 76a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes#endif 77a0664b9ca67b594bd6f570a61d3301167a24750cElliott Hughes 7813247ca4d05152e83527b63d7350fba76cb05728sewardj Addr entry; // OUT: entrypoint in main executable 7913247ca4d05152e83527b63d7350fba76cb05728sewardj Addr init_ip; // OUT: address of first instruction to execute 8013247ca4d05152e83527b63d7350fba76cb05728sewardj Addr brkbase; // OUT: base address of brk segment 8113247ca4d05152e83527b63d7350fba76cb05728sewardj Addr init_toc; // OUT: address of table-of-contents, on 8213247ca4d05152e83527b63d7350fba76cb05728sewardj // platforms for which that makes sense 8313247ca4d05152e83527b63d7350fba76cb05728sewardj // (ppc64-linux only) 8413247ca4d05152e83527b63d7350fba76cb05728sewardj 8513247ca4d05152e83527b63d7350fba76cb05728sewardj // These are the extra args added by #! scripts 8613247ca4d05152e83527b63d7350fba76cb05728sewardj HChar* interp_name; // OUT: the interpreter name 8713247ca4d05152e83527b63d7350fba76cb05728sewardj HChar* interp_args; // OUT: the args for the interpreter 8813247ca4d05152e83527b63d7350fba76cb05728sewardj } 8913247ca4d05152e83527b63d7350fba76cb05728sewardj ExeInfo; 907e343cd9bc720226fa395b1588621086f152dd5efitzhardinge 917375061f0ecd9534a27ade9bb4fbe47ddce41298njn// Do a number of appropriate checks to see if the file looks executable by 927375061f0ecd9534a27ade9bb4fbe47ddce41298njn// the kernel: ie. it's a file, it's readable and executable, and it's in 9391772d140e9f918c25b9b20233d3673367b799dfnjn// either binary or "#!" format. On success, 'out_fd' gets the fd of the file 947375061f0ecd9534a27ade9bb4fbe47ddce41298njn// if it's non-NULL. Otherwise the fd is closed. 95c74b3ba6f1d1b269aa2abcad3bd1c58d0d630c9fsewardjextern SysRes VG_(pre_exec_check)(const HChar* exe_name, Int* out_fd, 96c74b3ba6f1d1b269aa2abcad3bd1c58d0d630c9fsewardj Bool allow_setuid); 977375061f0ecd9534a27ade9bb4fbe47ddce41298njn 98ea147e739aff620b1336537f251f58f074ec16f2nethercote// Does everything short of actually running 'exe': finds the file, 99ea147e739aff620b1336537f251f58f074ec16f2nethercote// checks execute permissions, sets up interpreter if program is a script, 100ea147e739aff620b1336537f251f58f074ec16f2nethercote// reads headers, maps file into memory, and returns important info about 101ea147e739aff620b1336537f251f58f074ec16f2nethercote// the program. 10213247ca4d05152e83527b63d7350fba76cb05728sewardjextern Int VG_(do_exec)(const HChar* exe, ExeInfo* info); 1037e343cd9bc720226fa395b1588621086f152dd5efitzhardinge 10408a2e173ad2067f19c0466dd6c774d36b4575262njn#endif /* __PUB_CORE_UME_H */ 1051fe545083582f11a77d928ffed6c0074bd6f381bnethercote 1061fe545083582f11a77d928ffed6c0074bd6f381bnethercote/*--------------------------------------------------------------------*/ 10708a2e173ad2067f19c0466dd6c774d36b4575262njn/*--- end ---*/ 1081fe545083582f11a77d928ffed6c0074bd6f381bnethercote/*--------------------------------------------------------------------*/ 109