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