pub_core_ume.h revision ec7be9c3b51e516092dde66a5ff11ea11b114535
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
10e4b0bf07b0ee0a18eacc5aba91686ab5fc1d327bsewardj   Copyright (C) 2000-2006 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
3408a2e173ad2067f19c0466dd6c774d36b4575262njn//--------------------------------------------------------------------
3508a2e173ad2067f19c0466dd6c774d36b4575262njn// PURPOSE: This module implements user-mode execve, ie. program loading
36ec7be9c3b51e516092dde66a5ff11ea11b114535sewardj// and exec'ing.
3708a2e173ad2067f19c0466dd6c774d36b4575262njn//--------------------------------------------------------------------
387e343cd9bc720226fa395b1588621086f152dd5efitzhardinge
39107e1c0ebd1fa36ade35dff79dd40f0a67e3cb19nethercote/*------------------------------------------------------------*/
40107e1c0ebd1fa36ade35dff79dd40f0a67e3cb19nethercote/*--- Loading ELF files                                    ---*/
41107e1c0ebd1fa36ade35dff79dd40f0a67e3cb19nethercote/*------------------------------------------------------------*/
42107e1c0ebd1fa36ade35dff79dd40f0a67e3cb19nethercote
43ea147e739aff620b1336537f251f58f074ec16f2nethercote// Info needed to load and run a program.  IN/INOUT/OUT refers to the
44ea147e739aff620b1336537f251f58f074ec16f2nethercote// inputs/outputs of do_exec().
4513247ca4d05152e83527b63d7350fba76cb05728sewardjtypedef
4613247ca4d05152e83527b63d7350fba76cb05728sewardj   struct {
4713247ca4d05152e83527b63d7350fba76cb05728sewardj      HChar** argv;       // IN: the original argv
4813247ca4d05152e83527b63d7350fba76cb05728sewardj
4913247ca4d05152e83527b63d7350fba76cb05728sewardj      Addr exe_base;     // INOUT: lowest (allowed) address of exe
5013247ca4d05152e83527b63d7350fba76cb05728sewardj      Addr exe_end;      // INOUT: highest (allowed) address
5113247ca4d05152e83527b63d7350fba76cb05728sewardj
5213247ca4d05152e83527b63d7350fba76cb05728sewardj      Addr phdr;         // OUT: address phdr was mapped at
5313247ca4d05152e83527b63d7350fba76cb05728sewardj      Int  phnum;        // OUT: number of phdrs
5413247ca4d05152e83527b63d7350fba76cb05728sewardj      Addr interp_base;  // OUT: where interpreter (ld.so) was mapped
5513247ca4d05152e83527b63d7350fba76cb05728sewardj      Addr entry;        // OUT: entrypoint in main executable
5613247ca4d05152e83527b63d7350fba76cb05728sewardj      Addr init_ip;      // OUT: address of first instruction to execute
5713247ca4d05152e83527b63d7350fba76cb05728sewardj      Addr brkbase;      // OUT: base address of brk segment
5813247ca4d05152e83527b63d7350fba76cb05728sewardj      Addr init_toc;     // OUT: address of table-of-contents, on
5913247ca4d05152e83527b63d7350fba76cb05728sewardj                         // platforms for which that makes sense
6013247ca4d05152e83527b63d7350fba76cb05728sewardj                         // (ppc64-linux only)
6113247ca4d05152e83527b63d7350fba76cb05728sewardj
6213247ca4d05152e83527b63d7350fba76cb05728sewardj      // These are the extra args added by #! scripts
6313247ca4d05152e83527b63d7350fba76cb05728sewardj      HChar*  interp_name;  // OUT: the interpreter name
6413247ca4d05152e83527b63d7350fba76cb05728sewardj      HChar*  interp_args;  // OUT: the args for the interpreter
6513247ca4d05152e83527b63d7350fba76cb05728sewardj   }
6613247ca4d05152e83527b63d7350fba76cb05728sewardj   ExeInfo;
677e343cd9bc720226fa395b1588621086f152dd5efitzhardinge
687375061f0ecd9534a27ade9bb4fbe47ddce41298njn// Do a number of appropriate checks to see if the file looks executable by
697375061f0ecd9534a27ade9bb4fbe47ddce41298njn// the kernel: ie. it's a file, it's readable and executable, and it's in
707375061f0ecd9534a27ade9bb4fbe47ddce41298njn// either ELF or "#!" format.  On success, 'out_fd' gets the fd of the file
717375061f0ecd9534a27ade9bb4fbe47ddce41298njn// if it's non-NULL.  Otherwise the fd is closed.
7213247ca4d05152e83527b63d7350fba76cb05728sewardjextern SysRes VG_(pre_exec_check)(const HChar* exe_name, Int* out_fd);
737375061f0ecd9534a27ade9bb4fbe47ddce41298njn
74ea147e739aff620b1336537f251f58f074ec16f2nethercote// Does everything short of actually running 'exe': finds the file,
75ea147e739aff620b1336537f251f58f074ec16f2nethercote// checks execute permissions, sets up interpreter if program is a script,
76ea147e739aff620b1336537f251f58f074ec16f2nethercote// reads headers, maps file into memory, and returns important info about
77ea147e739aff620b1336537f251f58f074ec16f2nethercote// the program.
7813247ca4d05152e83527b63d7350fba76cb05728sewardjextern Int VG_(do_exec)(const HChar* exe, ExeInfo* info);
797e343cd9bc720226fa395b1588621086f152dd5efitzhardinge
801fe545083582f11a77d928ffed6c0074bd6f381bnethercote/*------------------------------------------------------------*/
811fe545083582f11a77d928ffed6c0074bd6f381bnethercote/*--- Finding and dealing with auxv                        ---*/
821fe545083582f11a77d928ffed6c0074bd6f381bnethercote/*------------------------------------------------------------*/
837e343cd9bc720226fa395b1588621086f152dd5efitzhardinge
847e343cd9bc720226fa395b1588621086f152dd5efitzhardingestruct ume_auxv
857e343cd9bc720226fa395b1588621086f152dd5efitzhardinge{
86b9bca7c47ad233225a13362bbd15f5c2bf8c1f1csewardj   Word a_type;
877e343cd9bc720226fa395b1588621086f152dd5efitzhardinge   union {
887e343cd9bc720226fa395b1588621086f152dd5efitzhardinge      void *a_ptr;
89b9bca7c47ad233225a13362bbd15f5c2bf8c1f1csewardj      Word a_val;
905ed88f2c948cfd878b4c627fa468908666a668e5mueller   } u;
917e343cd9bc720226fa395b1588621086f152dd5efitzhardinge};
927e343cd9bc720226fa395b1588621086f152dd5efitzhardinge
9362ff0f2f39592092459bdc90a9a3b820d380152bnjnextern struct ume_auxv *VG_(find_auxv)(UWord* orig_esp);
947e343cd9bc720226fa395b1588621086f152dd5efitzhardinge
9508a2e173ad2067f19c0466dd6c774d36b4575262njn#endif /* __PUB_CORE_UME_H */
961fe545083582f11a77d928ffed6c0074bd6f381bnethercote
971fe545083582f11a77d928ffed6c0074bd6f381bnethercote/*--------------------------------------------------------------------*/
9808a2e173ad2067f19c0466dd6c774d36b4575262njn/*--- end                                                          ---*/
991fe545083582f11a77d928ffed6c0074bd6f381bnethercote/*--------------------------------------------------------------------*/
100