common.h revision cebb88491e68bdf4d466b03970c9ca77f65615f8
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 220enum pcb_status { 221 pcb_stop, /* The iteration should stop. */ 222 pcb_cont, /* The iteration should continue. */ 223}; 224 225extern Event * next_event(void); 226extern Process * pid2proc(pid_t pid); 227extern void add_process(Process * proc); 228extern void remove_process(Process * proc); 229extern Process *each_process(Process * start, 230 enum pcb_status (* cb)(Process * proc, void * data), 231 void * data); 232extern void handle_event(Event * event); 233extern pid_t execute_program(const char * command, char ** argv); 234extern int display_arg(enum tof type, Process * proc, int arg_num, arg_type_info * info); 235extern Breakpoint * address2bpstruct(Process * proc, void * addr); 236extern void breakpoints_init(Process * proc, int enable); 237extern void insert_breakpoint(Process * proc, void * addr, 238 struct library_symbol * libsym, int enable); 239extern void delete_breakpoint(Process * proc, void * addr); 240extern void enable_all_breakpoints(Process * proc); 241extern void disable_all_breakpoints(Process * proc); 242extern void reinitialize_breakpoints(Process *); 243 244extern Process * open_program(char * filename, pid_t pid, int init_breakpoints); 245extern void open_pid(pid_t pid); 246extern void show_summary(void); 247extern arg_type_info * lookup_prototype(enum arg_type at); 248 249extern void do_init_elf(struct ltelf *lte, const char *filename); 250extern void do_close_elf(struct ltelf *lte); 251extern int in_load_libraries(const char *name, struct ltelf *lte, size_t count, GElf_Sym *sym); 252extern struct library_symbol *library_symbols; 253extern void add_library_symbol(GElf_Addr addr, const char *name, 254 struct library_symbol **library_symbolspp, 255 enum toplt type_of_plt, int is_weak); 256 257/* Arch-dependent stuff: */ 258extern char * pid2name(pid_t pid); 259extern void trace_set_options(Process * proc, pid_t pid); 260extern void trace_me(void); 261extern int trace_pid(pid_t pid); 262extern void untrace_pid(pid_t pid); 263extern void get_arch_dep(Process * proc); 264extern void * get_instruction_pointer(Process * proc); 265extern void set_instruction_pointer(Process * proc, void * addr); 266extern void * get_stack_pointer(Process * proc); 267extern void * get_return_addr(Process * proc, void * stack_pointer); 268extern void set_return_addr(Process * proc, void * addr); 269extern void enable_breakpoint(Process * proc, Breakpoint * sbp); 270extern void disable_breakpoint(Process * proc, Breakpoint * sbp); 271extern int syscall_p(Process * proc, int status, int * sysnum); 272extern void continue_process(pid_t pid); 273extern void continue_after_signal(pid_t pid, int signum); 274extern void continue_after_breakpoint(Process * proc, Breakpoint * sbp); 275extern void continue_enabling_breakpoint(Process * proc, Breakpoint * sbp); 276extern long gimme_arg(enum tof type, Process * proc, int arg_num, arg_type_info * info); 277extern void save_register_args(enum tof type, Process * proc); 278extern int umovestr(Process * proc, void * addr, int len, void * laddr); 279extern int umovelong (Process * proc, void * addr, long * result, arg_type_info * info); 280extern size_t umovebytes (Process *proc, void * addr, void * laddr, size_t count); 281extern int ffcheck(void * maddr); 282extern void * sym2addr(Process *, struct library_symbol *); 283extern int linkmap_init(Process *, struct ltelf *); 284extern void arch_check_dbg(Process *proc); 285 286extern struct ltelf main_lte; 287 288#endif 289