blob: 5c7ba0902815a989d943d3e9277d00be4b3f2b76 [file] [log] [blame]
Michael K. Edwardsef4428a2011-03-06 20:39:18 +00001#ifndef COMMON_H
2#define COMMON_H
3
Petr Machataa06eb812011-07-08 19:23:25 +02004#include <config.h>
Joe Damatoab3b72c2010-10-31 00:21:53 -07005
Juan Cespedes3df476b2009-05-28 19:17:17 +02006#include <sys/types.h>
7#include <sys/time.h>
8#include <stdio.h>
9
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020010#include "ltrace.h"
Juan Cespedes3df476b2009-05-28 19:17:17 +020011#include "defs.h"
12#include "dict.h"
Juan Cespedes3df476b2009-05-28 19:17:17 +020013#include "sysdep.h"
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020014#include "debug.h"
Marc Kleine-Budde747c73d2010-02-03 20:23:20 +010015#include "ltrace-elf.h"
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020016#include "read_config_file.h"
Petr Machata2b46cfc2012-02-18 11:17:29 +010017#include "proc.h"
Juan Cespedes3df476b2009-05-28 19:17:17 +020018
19#if defined HAVE_LIBIBERTY || defined HAVE_LIBSUPC__
20# define USE_DEMANGLE
21#endif
22
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020023extern char * command;
Juan Cespedes3df476b2009-05-28 19:17:17 +020024
25extern int exiting; /* =1 if we have to exit ASAP */
26
Juan Cespedes3df476b2009-05-28 19:17:17 +020027enum arg_type {
28 ARGTYPE_UNKNOWN = -1,
29 ARGTYPE_VOID,
30 ARGTYPE_INT,
31 ARGTYPE_UINT,
32 ARGTYPE_LONG,
33 ARGTYPE_ULONG,
34 ARGTYPE_OCTAL,
35 ARGTYPE_CHAR,
36 ARGTYPE_SHORT,
37 ARGTYPE_USHORT,
38 ARGTYPE_FLOAT, /* float value, may require index */
39 ARGTYPE_DOUBLE, /* double value, may require index */
40 ARGTYPE_ADDR,
41 ARGTYPE_FILE,
42 ARGTYPE_FORMAT, /* printf-like format */
43 ARGTYPE_STRING, /* NUL-terminated string */
44 ARGTYPE_STRING_N, /* String of known maxlen */
45 ARGTYPE_ARRAY, /* Series of values in memory */
46 ARGTYPE_ENUM, /* Enumeration */
47 ARGTYPE_STRUCT, /* Structure of values */
48 ARGTYPE_POINTER, /* Pointer to some other type */
49 ARGTYPE_COUNT /* number of ARGTYPE_* values */
50};
51
52typedef struct arg_type_info_t {
53 enum arg_type type;
54 union {
55 /* ARGTYPE_ENUM */
56 struct {
57 size_t entries;
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020058 char ** keys;
59 int * values;
Juan Cespedes3df476b2009-05-28 19:17:17 +020060 } enum_info;
61
62 /* ARGTYPE_ARRAY */
63 struct {
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020064 struct arg_type_info_t * elt_type;
Juan Cespedes3df476b2009-05-28 19:17:17 +020065 size_t elt_size;
66 int len_spec;
67 } array_info;
68
69 /* ARGTYPE_STRING_N */
70 struct {
71 int size_spec;
72 } string_n_info;
73
74 /* ARGTYPE_STRUCT */
75 struct {
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020076 struct arg_type_info_t ** fields; /* NULL-terminated */
77 size_t * offset;
Juan Cespedes3df476b2009-05-28 19:17:17 +020078 size_t size;
79 } struct_info;
80
81 /* ARGTYPE_POINTER */
82 struct {
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020083 struct arg_type_info_t * info;
Juan Cespedes3df476b2009-05-28 19:17:17 +020084 } ptr_info;
85
86 /* ARGTYPE_FLOAT */
87 struct {
88 size_t float_index;
89 } float_info;
90
91 /* ARGTYPE_DOUBLE */
92 struct {
93 size_t float_index;
94 } double_info;
95 } u;
96} arg_type_info;
97
98enum tof {
99 LT_TOF_NONE = 0,
100 LT_TOF_FUNCTION, /* A real library function */
101 LT_TOF_FUNCTIONR, /* Return from a real library function */
102 LT_TOF_SYSCALL, /* A syscall */
103 LT_TOF_SYSCALLR, /* Return from a syscall */
104 LT_TOF_STRUCT /* Not a function; read args from struct */
105};
106
107typedef struct Function Function;
108struct Function {
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200109 const char * name;
110 arg_type_info * return_info;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200111 int num_params;
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200112 arg_type_info * arg_info[MAX_ARGS];
Juan Cespedes3df476b2009-05-28 19:17:17 +0200113 int params_right;
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200114 Function * next;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200115};
116
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200117extern Function * list_of_functions;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200118extern char *PLTs_initialized_by_here;
119
Juan Cespedes3df476b2009-05-28 19:17:17 +0200120struct opt_c_struct {
121 int count;
122 struct timeval tv;
123};
Juan Cespedes3df476b2009-05-28 19:17:17 +0200124
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200125#include "options.h"
126#include "output.h"
127#ifdef USE_DEMANGLE
128#include "demangle.h"
129#endif
Juan Cespedes3df476b2009-05-28 19:17:17 +0200130
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200131extern Dict * dict_opt_c;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200132
Petr Machata617ff0b2011-10-06 14:23:24 +0200133enum process_status {
134 ps_invalid, /* Failure. */
135 ps_stop, /* Job-control stop. */
136 ps_tracing_stop,
Petr Machatacbe29c62011-09-27 02:27:58 +0200137 ps_sleeping,
Petr Machata617ff0b2011-10-06 14:23:24 +0200138 ps_zombie,
139 ps_other, /* Necessary other states can be added as needed. */
140};
141
Petr Machata69a03e62011-07-09 11:29:12 +0200142/* Events */
143enum ecb_status {
144 ecb_cont, /* The iteration should continue. */
145 ecb_yield, /* The iteration should stop, yielding this
146 * event. */
147 ecb_deque, /* Like ecb_stop, but the event should be removed
148 * from the queue. */
149};
150extern Event * next_event(void);
151extern Event * each_qd_event(enum ecb_status (* cb)(Event * event, void * data),
152 void * data);
153extern void enque_event(Event * event);
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200154extern void handle_event(Event * event);
Petr Machata4007d742011-07-09 11:29:42 +0200155
Petr Machata1b17dbf2011-07-08 19:22:52 +0200156extern pid_t execute_program(const char * command, char ** argv);
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200157extern int display_arg(enum tof type, Process * proc, int arg_num, arg_type_info * info);
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200158extern void disable_all_breakpoints(Process * proc);
Juan Cespedes3df476b2009-05-28 19:17:17 +0200159
Juan Cespedes3df476b2009-05-28 19:17:17 +0200160extern void show_summary(void);
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200161extern arg_type_info * lookup_prototype(enum arg_type at);
Juan Cespedes3df476b2009-05-28 19:17:17 +0200162
Petr Machata9294d822012-02-07 12:35:58 +0100163struct breakpoint;
Petr Machata2b46cfc2012-02-18 11:17:29 +0100164struct library_symbol;
Petr Machata9294d822012-02-07 12:35:58 +0100165
Juan Cespedes3df476b2009-05-28 19:17:17 +0200166/* Arch-dependent stuff: */
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200167extern char * pid2name(pid_t pid);
Petr Machata9a5420c2011-07-09 11:21:23 +0200168extern pid_t process_leader(pid_t pid);
169extern int process_tasks(pid_t pid, pid_t **ret_tasks, size_t *ret_n);
170extern int process_stopped(pid_t pid);
Petr Machata617ff0b2011-10-06 14:23:24 +0200171extern enum process_status process_status(pid_t pid);
Petr Machata3ed2a422012-04-06 17:18:55 +0200172extern void trace_set_options(struct Process *proc);
Petr Machatac805c622012-03-02 00:10:37 +0100173extern int wait_for_proc(pid_t pid);
Juan Cespedes3df476b2009-05-28 19:17:17 +0200174extern void trace_me(void);
175extern int trace_pid(pid_t pid);
176extern void untrace_pid(pid_t pid);
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200177extern void get_arch_dep(Process * proc);
178extern void * get_instruction_pointer(Process * proc);
179extern void set_instruction_pointer(Process * proc, void * addr);
180extern void * get_stack_pointer(Process * proc);
181extern void * get_return_addr(Process * proc, void * stack_pointer);
Juan Cespedes2a61d192009-07-04 11:29:27 +0200182extern void set_return_addr(Process * proc, void * addr);
Petr Machata9294d822012-02-07 12:35:58 +0100183extern void enable_breakpoint(Process * proc, struct breakpoint *sbp);
184extern void disable_breakpoint(Process * proc, struct breakpoint *sbp);
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200185extern int syscall_p(Process * proc, int status, int * sysnum);
Juan Cespedes3df476b2009-05-28 19:17:17 +0200186extern void continue_process(pid_t pid);
187extern void continue_after_signal(pid_t pid, int signum);
Petr Machata43d2fe52011-11-02 13:25:49 +0100188extern void continue_after_syscall(Process *proc, int sysnum, int ret_p);
Petr Machata9294d822012-02-07 12:35:58 +0100189extern void continue_after_breakpoint(Process * proc, struct breakpoint *sbp);
Petr Machatacbe29c62011-09-27 02:27:58 +0200190extern void continue_after_vfork(Process * proc);
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200191extern long gimme_arg(enum tof type, Process * proc, int arg_num, arg_type_info * info);
192extern void save_register_args(enum tof type, Process * proc);
193extern int umovestr(Process * proc, void * addr, int len, void * laddr);
194extern int umovelong (Process * proc, void * addr, long * result, arg_type_info * info);
Joe Damatodfa3fa32010-11-08 15:47:35 -0800195extern size_t umovebytes (Process *proc, void * addr, void * laddr, size_t count);
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200196extern int ffcheck(void * maddr);
197extern void * sym2addr(Process *, struct library_symbol *);
Petr Machata52dbfb12012-03-29 16:38:26 +0200198extern int linkmap_init(struct Process *proc, void *dyn_addr);
Joe Damatof0bd98b2010-11-08 15:47:42 -0800199extern void arch_check_dbg(Process *proc);
Petr Machata9a5420c2011-07-09 11:21:23 +0200200extern int task_kill (pid_t pid, int sig);
201
Petr Machatacec06ec2012-04-10 13:31:55 +0200202/* Called when trace_me or primary trace_pid fail. This may plug in
203 * any platform-specific knowledge of why it could be so. */
204void trace_fail_warning(pid_t pid);
205
Petr Machataffe4cd22012-04-11 18:01:44 +0200206/* A pair of functions called to initiate a detachment request when
207 * ltrace is about to exit. Their job is to undo any effects that
208 * tracing had and eventually detach process, perhaps by way of
209 * installing a process handler.
210 *
211 * OS_LTRACE_EXITING_SIGHANDLER is called from a signal handler
212 * context right after the signal was captured. It returns 1 if the
213 * request was handled or 0 if it wasn't.
214 *
215 * If the call to OS_LTRACE_EXITING_SIGHANDLER didn't handle the
216 * request, OS_LTRACE_EXITING is called when the next event is
217 * generated. Therefore it's called in "safe" context, without
Petr Machatae67635d2012-03-21 03:37:39 +0100218 * re-entrancy concerns, but it's only called after an event is
Petr Machataffe4cd22012-04-11 18:01:44 +0200219 * generated. */
220int os_ltrace_exiting_sighandler(void);
221void os_ltrace_exiting(void);
Juan Cespedes3df476b2009-05-28 19:17:17 +0200222
Petr Machatae67635d2012-03-21 03:37:39 +0100223int arch_elf_init(struct ltelf *lte);
Petr Machata4d9a91c2012-03-24 04:55:03 +0100224void arch_elf_destroy(struct ltelf *lte);
225
Petr Machatae6523e62012-03-24 04:54:06 +0100226enum plt_status {
227 plt_fail,
228 plt_ok,
229 plt_default,
230};
231
232enum plt_status arch_elf_add_plt_entry(struct Process *p, struct ltelf *l,
233 const char *n, GElf_Rela *r, size_t i,
234 struct library_symbol **ret);
Petr Machatae67635d2012-03-21 03:37:39 +0100235
Petr Machata8cce1192012-03-25 01:37:19 +0100236int arch_breakpoint_init(struct Process *proc, struct breakpoint *sbp);
237void arch_breakpoint_destroy(struct breakpoint *sbp);
Petr Machatad3cc9882012-04-13 21:40:23 +0200238int arch_breakpoint_clone(struct breakpoint *retp, struct breakpoint *sbp);
Petr Machata8cce1192012-03-25 01:37:19 +0100239
Petr Machata18bd8ff2012-04-10 04:32:39 +0200240typedef void *target_address_t;
241/* This should extract entry point address and interpreter (dynamic
242 * linker) bias if possible. Returns 0 if there were no errors, -1
243 * otherwise. Sets *ENTRYP and *INTERP_BIASP to non-zero values if
244 * the corresponding value is known. Unknown values are set to 0. */
245int process_get_entry(struct Process *proc,
246 target_address_t *entryp,
247 target_address_t *interp_biasp);
Petr Machata8cce1192012-03-25 01:37:19 +0100248
Michael K. Edwardsef4428a2011-03-06 20:39:18 +0000249#endif