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