blob: 9f1d40e926d6a5075a5878f8fe2306b4f69a1264 [file] [log] [blame]
Michael K. Edwardsef4428a2011-03-06 20:39:18 +00001#ifndef COMMON_H
2#define COMMON_H
3
Joe Damatoab3b72c2010-10-31 00:21:53 -07004#if defined(HAVE_LIBUNWIND)
5#include <libunwind.h>
6#endif /* defined(HAVE_LIBUNWIND) */
7
Juan Cespedes3df476b2009-05-28 19:17:17 +02008#include <sys/types.h>
9#include <sys/time.h>
10#include <stdio.h>
11
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020012#include "ltrace.h"
Juan Cespedes3df476b2009-05-28 19:17:17 +020013#include "defs.h"
14#include "dict.h"
Juan Cespedes3df476b2009-05-28 19:17:17 +020015#include "sysdep.h"
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020016#include "debug.h"
Marc Kleine-Budde747c73d2010-02-03 20:23:20 +010017#include "ltrace-elf.h"
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020018#include "read_config_file.h"
Juan Cespedes3df476b2009-05-28 19:17:17 +020019
20#if defined HAVE_LIBIBERTY || defined HAVE_LIBSUPC__
21# define USE_DEMANGLE
22#endif
23
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020024extern char * command;
Juan Cespedes3df476b2009-05-28 19:17:17 +020025
26extern int exiting; /* =1 if we have to exit ASAP */
27
28typedef struct Breakpoint Breakpoint;
29struct Breakpoint {
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020030 void * addr;
Juan Cespedes3df476b2009-05-28 19:17:17 +020031 unsigned char orig_value[BREAKPOINT_LENGTH];
32 int enabled;
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020033 struct library_symbol * libsym;
Juan Cespedes3df476b2009-05-28 19:17:17 +020034#ifdef __arm__
35 int thumb_mode;
36#endif
37};
38
39enum arg_type {
40 ARGTYPE_UNKNOWN = -1,
41 ARGTYPE_VOID,
42 ARGTYPE_INT,
43 ARGTYPE_UINT,
44 ARGTYPE_LONG,
45 ARGTYPE_ULONG,
46 ARGTYPE_OCTAL,
47 ARGTYPE_CHAR,
48 ARGTYPE_SHORT,
49 ARGTYPE_USHORT,
50 ARGTYPE_FLOAT, /* float value, may require index */
51 ARGTYPE_DOUBLE, /* double value, may require index */
52 ARGTYPE_ADDR,
53 ARGTYPE_FILE,
54 ARGTYPE_FORMAT, /* printf-like format */
55 ARGTYPE_STRING, /* NUL-terminated string */
56 ARGTYPE_STRING_N, /* String of known maxlen */
57 ARGTYPE_ARRAY, /* Series of values in memory */
58 ARGTYPE_ENUM, /* Enumeration */
59 ARGTYPE_STRUCT, /* Structure of values */
60 ARGTYPE_POINTER, /* Pointer to some other type */
61 ARGTYPE_COUNT /* number of ARGTYPE_* values */
62};
63
64typedef struct arg_type_info_t {
65 enum arg_type type;
66 union {
67 /* ARGTYPE_ENUM */
68 struct {
69 size_t entries;
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020070 char ** keys;
71 int * values;
Juan Cespedes3df476b2009-05-28 19:17:17 +020072 } enum_info;
73
74 /* ARGTYPE_ARRAY */
75 struct {
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020076 struct arg_type_info_t * elt_type;
Juan Cespedes3df476b2009-05-28 19:17:17 +020077 size_t elt_size;
78 int len_spec;
79 } array_info;
80
81 /* ARGTYPE_STRING_N */
82 struct {
83 int size_spec;
84 } string_n_info;
85
86 /* ARGTYPE_STRUCT */
87 struct {
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020088 struct arg_type_info_t ** fields; /* NULL-terminated */
89 size_t * offset;
Juan Cespedes3df476b2009-05-28 19:17:17 +020090 size_t size;
91 } struct_info;
92
93 /* ARGTYPE_POINTER */
94 struct {
Juan Cespedes8d1b92b2009-07-03 10:39:34 +020095 struct arg_type_info_t * info;
Juan Cespedes3df476b2009-05-28 19:17:17 +020096 } ptr_info;
97
98 /* ARGTYPE_FLOAT */
99 struct {
100 size_t float_index;
101 } float_info;
102
103 /* ARGTYPE_DOUBLE */
104 struct {
105 size_t float_index;
106 } double_info;
107 } u;
108} arg_type_info;
109
110enum tof {
111 LT_TOF_NONE = 0,
112 LT_TOF_FUNCTION, /* A real library function */
113 LT_TOF_FUNCTIONR, /* Return from a real library function */
114 LT_TOF_SYSCALL, /* A syscall */
115 LT_TOF_SYSCALLR, /* Return from a syscall */
116 LT_TOF_STRUCT /* Not a function; read args from struct */
117};
118
119typedef struct Function Function;
120struct Function {
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200121 const char * name;
122 arg_type_info * return_info;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200123 int num_params;
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200124 arg_type_info * arg_info[MAX_ARGS];
Juan Cespedes3df476b2009-05-28 19:17:17 +0200125 int params_right;
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200126 Function * next;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200127};
128
129enum toplt {
130 LS_TOPLT_NONE = 0, /* PLT not used for this symbol. */
131 LS_TOPLT_EXEC, /* PLT for this symbol is executable. */
132 LS_TOPLT_POINT /* PLT for this symbol is a non-executable. */
133};
134
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200135extern Function * list_of_functions;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200136extern char *PLTs_initialized_by_here;
137
138struct library_symbol {
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200139 char * name;
140 void * enter_addr;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200141 char needs_init;
142 enum toplt plt_type;
143 char is_weak;
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200144 struct library_symbol * next;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200145};
146
147struct callstack_element {
148 union {
149 int syscall;
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200150 struct library_symbol * libfunc;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200151 } c_un;
152 int is_syscall;
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200153 void * return_addr;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200154 struct timeval time_spent;
Petr Machata211f0882010-11-03 18:42:18 +0100155 void * arch_ptr;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200156};
157
158#define MAX_CALLDEPTH 64
159
160typedef enum Process_State Process_State;
161enum Process_State {
162 STATE_ATTACHED = 0,
163 STATE_BEING_CREATED,
164 STATE_IGNORED /* ignore this process (it's a fork and no -f was used) */
165};
166
Juan Cespedes3df476b2009-05-28 19:17:17 +0200167struct Process {
168 Process_State state;
Juan Cespedes2a61d192009-07-04 11:29:27 +0200169 Process * parent; /* needed by STATE_BEING_CREATED */
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200170 char * filename;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200171 pid_t pid;
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200172 Dict * breakpoints;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200173 int breakpoints_enabled; /* -1:not enabled yet, 0:disabled, 1:enabled */
174 int mask_32bit; /* 1 if 64-bit ltrace is tracing 32-bit process */
175 unsigned int personality;
176 int tracesysgood; /* signal indicating a PTRACE_SYSCALL trap */
177
178 int callstack_depth;
179 struct callstack_element callstack[MAX_CALLDEPTH];
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200180 struct library_symbol * list_of_symbols;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200181
Joe Damatof0bd98b2010-11-08 15:47:42 -0800182 int libdl_hooked;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200183 /* Arch-dependent: */
Joe Damatof0bd98b2010-11-08 15:47:42 -0800184 void * debug; /* arch-dep process debug struct */
185 long debug_state; /* arch-dep debug state */
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200186 void * instruction_pointer;
187 void * stack_pointer; /* To get return addr, args... */
188 void * return_addr;
189 Breakpoint * breakpoint_being_enabled;
190 void * arch_ptr;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200191 short e_machine;
192 short need_to_reinitialize_breakpoints;
193#ifdef __arm__
194 int thumb_mode; /* ARM execution mode: 0: ARM, 1: Thumb */
195#endif
196
197 /* output: */
198 enum tof type_being_displayed;
199
Joe Damatoab3b72c2010-10-31 00:21:53 -0700200#if defined(HAVE_LIBUNWIND)
201 /* libunwind address space */
202 unw_addr_space_t unwind_as;
203 void *unwind_priv;
204#endif /* defined(HAVE_LIBUNWIND) */
205
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200206 Process * next;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200207};
208
Juan Cespedes3df476b2009-05-28 19:17:17 +0200209struct opt_c_struct {
210 int count;
211 struct timeval tv;
212};
Juan Cespedes3df476b2009-05-28 19:17:17 +0200213
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200214#include "options.h"
215#include "output.h"
216#ifdef USE_DEMANGLE
217#include "demangle.h"
218#endif
Juan Cespedes3df476b2009-05-28 19:17:17 +0200219
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200220extern Dict * dict_opt_c;
Juan Cespedes3df476b2009-05-28 19:17:17 +0200221
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200222extern Process * list_of_processes;
223
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200224extern Event * next_event(void);
Juan Cespedes3df476b2009-05-28 19:17:17 +0200225extern Process * pid2proc(pid_t pid);
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200226extern void handle_event(Event * event);
Juan Cespedes3df476b2009-05-28 19:17:17 +0200227extern void execute_program(Process *, char **);
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200228extern int display_arg(enum tof type, Process * proc, int arg_num, arg_type_info * info);
229extern Breakpoint * address2bpstruct(Process * proc, void * addr);
230extern void breakpoints_init(Process * proc);
231extern void insert_breakpoint(Process * proc, void * addr, struct library_symbol * libsym);
232extern void delete_breakpoint(Process * proc, void * addr);
233extern void enable_all_breakpoints(Process * proc);
234extern void disable_all_breakpoints(Process * proc);
Juan Cespedes3df476b2009-05-28 19:17:17 +0200235extern void reinitialize_breakpoints(Process *);
236
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200237extern Process * open_program(char * filename, pid_t pid);
238extern void open_pid(pid_t pid);
Juan Cespedes3df476b2009-05-28 19:17:17 +0200239extern void show_summary(void);
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200240extern arg_type_info * lookup_prototype(enum arg_type at);
Juan Cespedes3df476b2009-05-28 19:17:17 +0200241
Joe Damato7a2bdf82010-11-08 15:47:41 -0800242extern void do_init_elf(struct ltelf *lte, const char *filename);
243extern void do_close_elf(struct ltelf *lte);
244extern int in_load_libraries(const char *name, struct ltelf *lte, size_t count, GElf_Sym *sym);
245extern struct library_symbol *library_symbols;
246extern void add_library_symbol(GElf_Addr addr, const char *name,
247 struct library_symbol **library_symbolspp,
248 enum toplt type_of_plt, int is_weak);
249
Juan Cespedes3df476b2009-05-28 19:17:17 +0200250/* Arch-dependent stuff: */
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200251extern char * pid2name(pid_t pid);
252extern void trace_set_options(Process * proc, pid_t pid);
Juan Cespedes3df476b2009-05-28 19:17:17 +0200253extern void trace_me(void);
254extern int trace_pid(pid_t pid);
255extern void untrace_pid(pid_t pid);
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200256extern void get_arch_dep(Process * proc);
257extern void * get_instruction_pointer(Process * proc);
258extern void set_instruction_pointer(Process * proc, void * addr);
259extern void * get_stack_pointer(Process * proc);
260extern void * get_return_addr(Process * proc, void * stack_pointer);
Juan Cespedes2a61d192009-07-04 11:29:27 +0200261extern void set_return_addr(Process * proc, void * addr);
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200262extern void enable_breakpoint(pid_t pid, Breakpoint * sbp);
263extern void disable_breakpoint(pid_t pid, const Breakpoint * sbp);
264extern int syscall_p(Process * proc, int status, int * sysnum);
Juan Cespedes3df476b2009-05-28 19:17:17 +0200265extern void continue_process(pid_t pid);
266extern void continue_after_signal(pid_t pid, int signum);
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200267extern void continue_after_breakpoint(Process * proc, Breakpoint * sbp);
268extern void continue_enabling_breakpoint(pid_t pid, Breakpoint * sbp);
269extern long gimme_arg(enum tof type, Process * proc, int arg_num, arg_type_info * info);
270extern void save_register_args(enum tof type, Process * proc);
271extern int umovestr(Process * proc, void * addr, int len, void * laddr);
272extern int umovelong (Process * proc, void * addr, long * result, arg_type_info * info);
Joe Damatodfa3fa32010-11-08 15:47:35 -0800273extern size_t umovebytes (Process *proc, void * addr, void * laddr, size_t count);
Juan Cespedes8d1b92b2009-07-03 10:39:34 +0200274extern int ffcheck(void * maddr);
275extern void * sym2addr(Process *, struct library_symbol *);
Joe Damatof0bd98b2010-11-08 15:47:42 -0800276extern int linkmap_init(Process *, struct ltelf *);
277extern void arch_check_dbg(Process *proc);
Juan Cespedes3df476b2009-05-28 19:17:17 +0200278
Joe Damatof0bd98b2010-11-08 15:47:42 -0800279extern struct ltelf main_lte;
Michael K. Edwardsef4428a2011-03-06 20:39:18 +0000280
281#endif