common.h revision a06eb81c170a09ba6ca7e169ab4782b9fc7d4c03
1#ifndef COMMON_H
2#define COMMON_H
3
4#include <config.h>
5#if defined(HAVE_LIBUNWIND)
6#include <libunwind.h>
7#endif /* defined(HAVE_LIBUNWIND) */
8
9#include <sys/types.h>
10#include <sys/time.h>
11#include <stdio.h>
12
13#include "ltrace.h"
14#include "defs.h"
15#include "dict.h"
16#include "sysdep.h"
17#include "debug.h"
18#include "ltrace-elf.h"
19#include "read_config_file.h"
20
21#if defined HAVE_LIBIBERTY || defined HAVE_LIBSUPC__
22# define USE_DEMANGLE
23#endif
24
25extern char * command;
26
27extern int exiting;  /* =1 if we have to exit ASAP */
28
29typedef struct Breakpoint Breakpoint;
30struct Breakpoint {
31	void * addr;
32	unsigned char orig_value[BREAKPOINT_LENGTH];
33	int enabled;
34	struct library_symbol * libsym;
35#ifdef __arm__
36	int thumb_mode;
37#endif
38};
39
40enum arg_type {
41	ARGTYPE_UNKNOWN = -1,
42	ARGTYPE_VOID,
43	ARGTYPE_INT,
44	ARGTYPE_UINT,
45	ARGTYPE_LONG,
46	ARGTYPE_ULONG,
47	ARGTYPE_OCTAL,
48	ARGTYPE_CHAR,
49	ARGTYPE_SHORT,
50	ARGTYPE_USHORT,
51	ARGTYPE_FLOAT,		/* float value, may require index */
52	ARGTYPE_DOUBLE,		/* double value, may require index */
53	ARGTYPE_ADDR,
54	ARGTYPE_FILE,
55	ARGTYPE_FORMAT,		/* printf-like format */
56	ARGTYPE_STRING,		/* NUL-terminated string */
57	ARGTYPE_STRING_N,	/* String of known maxlen */
58	ARGTYPE_ARRAY,		/* Series of values in memory */
59	ARGTYPE_ENUM,		/* Enumeration */
60	ARGTYPE_STRUCT,		/* Structure of values */
61	ARGTYPE_POINTER,	/* Pointer to some other type */
62	ARGTYPE_COUNT		/* number of ARGTYPE_* values */
63};
64
65typedef struct arg_type_info_t {
66	enum arg_type type;
67	union {
68		/* ARGTYPE_ENUM */
69		struct {
70			size_t entries;
71			char ** keys;
72			int * values;
73		} enum_info;
74
75		/* ARGTYPE_ARRAY */
76		struct {
77			struct arg_type_info_t * elt_type;
78			size_t elt_size;
79			int len_spec;
80		} array_info;
81
82		/* ARGTYPE_STRING_N */
83		struct {
84			int size_spec;
85		} string_n_info;
86
87		/* ARGTYPE_STRUCT */
88		struct {
89			struct arg_type_info_t ** fields;	/* NULL-terminated */
90			size_t * offset;
91			size_t size;
92		} struct_info;
93
94		/* ARGTYPE_POINTER */
95		struct {
96			struct arg_type_info_t * info;
97		} ptr_info;
98
99		/* ARGTYPE_FLOAT */
100		struct {
101			size_t float_index;
102		} float_info;
103
104		/* ARGTYPE_DOUBLE */
105		struct {
106			size_t float_index;
107		} double_info;
108	} u;
109} arg_type_info;
110
111enum tof {
112	LT_TOF_NONE = 0,
113	LT_TOF_FUNCTION,	/* A real library function */
114	LT_TOF_FUNCTIONR,	/* Return from a real library function */
115	LT_TOF_SYSCALL,		/* A syscall */
116	LT_TOF_SYSCALLR,	/* Return from a syscall */
117	LT_TOF_STRUCT		/* Not a function; read args from struct */
118};
119
120typedef struct Function Function;
121struct Function {
122	const char * name;
123	arg_type_info * return_info;
124	int num_params;
125	arg_type_info * arg_info[MAX_ARGS];
126	int params_right;
127	Function * next;
128};
129
130enum toplt {
131	LS_TOPLT_NONE = 0,	/* PLT not used for this symbol. */
132	LS_TOPLT_EXEC,		/* PLT for this symbol is executable. */
133	LS_TOPLT_POINT		/* PLT for this symbol is a non-executable. */
134};
135
136extern Function * list_of_functions;
137extern char *PLTs_initialized_by_here;
138
139struct library_symbol {
140	char * name;
141	void * enter_addr;
142	char needs_init;
143	enum toplt plt_type;
144	char is_weak;
145	struct library_symbol * next;
146};
147
148struct callstack_element {
149	union {
150		int syscall;
151		struct library_symbol * libfunc;
152	} c_un;
153	int is_syscall;
154	void * return_addr;
155	struct timeval time_spent;
156	void * arch_ptr;
157};
158
159#define MAX_CALLDEPTH 64
160
161typedef enum Process_State Process_State;
162enum Process_State {
163	STATE_ATTACHED = 0,
164	STATE_BEING_CREATED,
165	STATE_IGNORED  /* ignore this process (it's a fork and no -f was used) */
166};
167
168struct Process {
169	Process_State state;
170	Process * parent;         /* needed by STATE_BEING_CREATED */
171	char * filename;
172	pid_t pid;
173	Dict * breakpoints;
174	int breakpoints_enabled;  /* -1:not enabled yet, 0:disabled, 1:enabled */
175	int mask_32bit;           /* 1 if 64-bit ltrace is tracing 32-bit process */
176	unsigned int personality;
177	int tracesysgood;         /* signal indicating a PTRACE_SYSCALL trap */
178
179	int callstack_depth;
180	struct callstack_element callstack[MAX_CALLDEPTH];
181	struct library_symbol * list_of_symbols;
182
183	int libdl_hooked;
184	/* Arch-dependent: */
185	void * debug;	/* arch-dep process debug struct */
186	long debug_state; /* arch-dep debug state */
187	void * instruction_pointer;
188	void * stack_pointer;      /* To get return addr, args... */
189	void * return_addr;
190	Breakpoint * breakpoint_being_enabled;
191	void * arch_ptr;
192	short e_machine;
193	short need_to_reinitialize_breakpoints;
194#ifdef __arm__
195	int thumb_mode;           /* ARM execution mode: 0: ARM, 1: Thumb */
196#endif
197
198#if defined(HAVE_LIBUNWIND)
199	/* libunwind address space */
200	unw_addr_space_t unwind_as;
201	void *unwind_priv;
202#endif /* defined(HAVE_LIBUNWIND) */
203
204	Process * next;
205};
206
207struct opt_c_struct {
208	int count;
209	struct timeval tv;
210};
211
212#include "options.h"
213#include "output.h"
214#ifdef USE_DEMANGLE
215#include "demangle.h"
216#endif
217
218extern Dict * dict_opt_c;
219
220extern Process * list_of_processes;
221
222extern Event * next_event(void);
223extern Process * pid2proc(pid_t pid);
224extern void handle_event(Event * event);
225extern pid_t execute_program(const char * command, char ** argv);
226extern int display_arg(enum tof type, Process * proc, int arg_num, arg_type_info * info);
227extern Breakpoint * address2bpstruct(Process * proc, void * addr);
228extern void breakpoints_init(Process * proc);
229extern void insert_breakpoint(Process * proc, void * addr, struct library_symbol * libsym);
230extern void delete_breakpoint(Process * proc, void * addr);
231extern void enable_all_breakpoints(Process * proc);
232extern void disable_all_breakpoints(Process * proc);
233extern void reinitialize_breakpoints(Process *);
234
235extern Process * open_program(char * filename, pid_t pid);
236extern void open_pid(pid_t pid);
237extern void show_summary(void);
238extern arg_type_info * lookup_prototype(enum arg_type at);
239
240extern void do_init_elf(struct ltelf *lte, const char *filename);
241extern void do_close_elf(struct ltelf *lte);
242extern int in_load_libraries(const char *name, struct ltelf *lte, size_t count, GElf_Sym *sym);
243extern struct library_symbol *library_symbols;
244extern void add_library_symbol(GElf_Addr addr, const char *name,
245		struct library_symbol **library_symbolspp,
246		enum toplt type_of_plt, int is_weak);
247
248/* Arch-dependent stuff: */
249extern char * pid2name(pid_t pid);
250extern void trace_set_options(Process * proc, pid_t pid);
251extern void trace_me(void);
252extern int trace_pid(pid_t pid);
253extern void untrace_pid(pid_t pid);
254extern void get_arch_dep(Process * proc);
255extern void * get_instruction_pointer(Process * proc);
256extern void set_instruction_pointer(Process * proc, void * addr);
257extern void * get_stack_pointer(Process * proc);
258extern void * get_return_addr(Process * proc, void * stack_pointer);
259extern void set_return_addr(Process * proc, void * addr);
260extern void enable_breakpoint(pid_t pid, Breakpoint * sbp);
261extern void disable_breakpoint(pid_t pid, const Breakpoint * sbp);
262extern int syscall_p(Process * proc, int status, int * sysnum);
263extern void continue_process(pid_t pid);
264extern void continue_after_signal(pid_t pid, int signum);
265extern void continue_after_breakpoint(Process * proc, Breakpoint * sbp);
266extern void continue_enabling_breakpoint(pid_t pid, Breakpoint * sbp);
267extern long gimme_arg(enum tof type, Process * proc, int arg_num, arg_type_info * info);
268extern void save_register_args(enum tof type, Process * proc);
269extern int umovestr(Process * proc, void * addr, int len, void * laddr);
270extern int umovelong (Process * proc, void * addr, long * result, arg_type_info * info);
271extern size_t umovebytes (Process *proc, void * addr, void * laddr, size_t count);
272extern int ffcheck(void * maddr);
273extern void * sym2addr(Process *, struct library_symbol *);
274extern int linkmap_init(Process *, struct ltelf *);
275extern void arch_check_dbg(Process *proc);
276
277extern struct ltelf main_lte;
278
279#endif
280