backend.h revision bac2da505ee174b7fb984b975c5938f88f0dbab2
1/* 2 * This file is part of ltrace. 3 * Copyright (C) 2012 Petr Machata, Red Hat Inc. 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation; either version 2 of the 8 * License, or (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 18 * 02110-1301 USA 19 */ 20 21#ifndef BACKEND_H 22#define BACKEND_H 23 24#include "forward.h" 25#include "sysdep.h" 26 27#include <gelf.h> 28 29enum process_status { 30 ps_invalid, /* Failure. */ 31 ps_stop, /* Job-control stop. */ 32 ps_tracing_stop, 33 ps_sleeping, 34 ps_zombie, 35 ps_other, /* Necessary other states can be added as needed. */ 36}; 37 38/* 39 * This file contains documentation of back end interface. Some of 40 * these may be implemented on an OS level (i.e. they are the same 41 * e.g. on all Linux architectures), some may differ per architecture 42 * on the same OS (e.g. a way to insert a breakpoint into the process 43 * image is a likely candidate). 44 */ 45 46/* Convert a PID to a path to the corresponding binary. */ 47char *pid2name(pid_t pid); 48 49/* Given a PID, find a leader of thread group. */ 50pid_t process_leader(pid_t pid); 51 52/* Given a PID of leader thread, fill in PIDs of all the tasks. The 53 * function will initialize the pointer *RET_TASKS to a 54 * newly-allocated array, and will store number of elements in that 55 * array to *RET_N. You have to free that buffer when you don't need 56 * it anymore. */ 57int process_tasks(pid_t pid, pid_t **ret_tasks, size_t *ret_n); 58 59/* Answer whether the process PID is stopped. Returns 0 when not 60 * stopped, 1 when stopped, or -1 when there was an error. */ 61int process_stopped(pid_t pid); 62 63/* Answer a status of the task PID. See enum process_status. */ 64enum process_status process_status(pid_t pid); 65 66/* Wait for PID to be ready for tracing. */ 67int wait_for_proc(pid_t pid); 68 69/* Send a signal SIG to the task PID. */ 70int task_kill(pid_t pid, int sig); 71 72/* Called after PID is attached, but before it is continued. */ 73void trace_set_options(struct Process *proc); 74 75/* Called after ltrace forks. Should attach the newly created child, 76 * in whose context this function is called. */ 77void trace_me(void); 78 79/* Called when ltrace needs to attach to PID, such as when it attaches 80 * to a running process, whose PID is given on the command line. */ 81int trace_pid(pid_t pid); 82 83/* Stop tracing PID. */ 84void untrace_pid(pid_t pid); 85 86/* The back end may need to store arbitrary data to a process. This 87 * is a place where it can initialize PROC->arch_dep. XXX this should 88 * be dropped in favor of arhc_process_init on pmachata/libs. */ 89void get_arch_dep(struct Process *proc); 90 91/* Return current instruction pointer of PROC. 92 * 93 * XXX note that the IP must fit into an arch pointer. This prevents 94 * us to use 32-bit ltrace to trace 64-bit process, even on arches 95 * that would otherwise support this. Above we have a definition of 96 * arch_addr_t. This should be converted to an integral type and 97 * used for target addresses throughout. */ 98void *get_instruction_pointer(struct Process *proc); 99 100/* Set instruction pointer of PROC to ADDR. XXX see above. */ 101void set_instruction_pointer(struct Process *proc, void *addr); 102 103/* Return current stack pointer of PROC. XXX see above. */ 104void *get_stack_pointer(struct Process *proc); 105 106/* Find and return caller address, i.e. the address where the current 107 * function returns. */ 108void *get_return_addr(struct Process *proc, void *stack_pointer); 109 110/* Adjust PROC so that when the current function returns, it returns 111 * to ADDR. */ 112void set_return_addr(struct Process *proc, void *addr); 113 114/* Enable breakpoint SBP in process PROC. */ 115void enable_breakpoint(struct Process *proc, struct breakpoint *sbp); 116 117/* Disable breakpoint SBP in process PROC. */ 118void disable_breakpoint(struct Process *proc, struct breakpoint *sbp); 119 120/* Determine whether the event that we have just seen (and that is 121 * recorded in STATUS) was a syscall. If it was, return 1. If it was 122 * a return from syscall, return 2. In both cases, set *SYSNUM to the 123 * number of said syscall. If it wasn't a syscall, return 0. If 124 * there was an error, return -1. */ 125int syscall_p(struct Process *proc, int status, int *sysnum); 126 127/* Continue execution of the process with given PID. */ 128void continue_process(pid_t pid); 129 130/* Called after we received a signal SIGNUM. Should do whatever 131 * book-keeping is necessary and continue the process if 132 * necessary. */ 133void continue_after_signal(pid_t pid, int signum); 134 135/* Called after we received a system call SYSNUM. RET_P is 0 if this 136 * is system call, otherwise it's return from a system call. The 137 * callback should do whatever book-keeping is necessary and continue 138 * the process if necessary. */ 139void continue_after_syscall(struct Process *proc, int sysnum, int ret_p); 140 141/* Called after we hit a breakpoint SBP. Should do whatever 142 * book-keeping is necessary and then continue the process. */ 143void continue_after_breakpoint(struct Process *proc, struct breakpoint *sbp); 144 145/* Called after we received a vfork. Should do whatever book-keeping 146 * is necessary and continue the process if necessary. N.B. right 147 * now, with Linux/GNU the only back end, this is not necessary. I 148 * imagine other systems may be different. */ 149void continue_after_vfork(struct Process *proc); 150 151/* Called when trace_me or primary trace_pid fail. This may plug in 152 * any platform-specific knowledge of why it could be so. */ 153void trace_fail_warning(pid_t pid); 154 155/* A pair of functions called to initiate a detachment request when 156 * ltrace is about to exit. Their job is to undo any effects that 157 * tracing had and eventually detach process, perhaps by way of 158 * installing a process handler. 159 * 160 * OS_LTRACE_EXITING_SIGHANDLER is called from a signal handler 161 * context right after the signal was captured. It returns 1 if the 162 * request was handled or 0 if it wasn't. 163 * 164 * If the call to OS_LTRACE_EXITING_SIGHANDLER didn't handle the 165 * request, OS_LTRACE_EXITING is called when the next event is 166 * generated. Therefore it's called in "safe" context, without 167 * re-entrancy concerns, but it's only called after an even is 168 * generated. */ 169int os_ltrace_exiting_sighandler(void); 170void os_ltrace_exiting(void); 171 172/* Should copy COUNT bytes from address ADDR of process PROC to local 173 * buffer BUF. */ 174size_t umovebytes (struct Process *proc, void *addr, void *buf, size_t count); 175 176/* Find out an address of symbol SYM in process PROC, and return. 177 * Returning NULL delays breakpoint insertion and enables heaps of 178 * arch-specific black magic that we should clean up some day. 179 * 180 * XXX the same points as for get_instruction_pointer apply. */ 181void *sym2addr(struct Process *proc, struct library_symbol *sym); 182 183/* Called at some point after we have attached to PROC. This callback 184 * should insert an introspection breakpoint for handling dynamic 185 * linker library loads. */ 186int linkmap_init(struct Process *proc, arch_addr_t dyn_addr); 187 188/* Called for breakpoints defined over an artificial symbol "". This 189 * can be used (like it is on Linux/GNU) to add more breakpoints 190 * because a dlopen'ed library was mapped in. 191 * 192 * XXX we should somehow clean up this interface. For starters, 193 * breakpoints should have their own handler callbacks, so that we can 194 * generalize this to e.g. systemtap SDT probes. linkmap_init could 195 * perhaps be rolled into some other process init callback. */ 196void arch_check_dbg(struct Process *proc); 197 198/* This should produce and return the next event of one of the traced 199 * processes. The returned pointer will not be freed by the core and 200 * should be either statically allocated, or the management should be 201 * done some other way. */ 202struct Event *next_event(void); 203 204/* Called when process PROC was removed. */ 205void process_removed(struct Process *proc); 206 207int arch_elf_init(struct ltelf *lte, struct library *lib); 208void arch_elf_destroy(struct ltelf *lte); 209 210enum plt_status { 211 plt_fail, 212 plt_ok, 213 plt_default, 214}; 215 216enum plt_status arch_elf_add_plt_entry(struct Process *p, struct ltelf *l, 217 const char *n, GElf_Rela *r, size_t i, 218 struct library_symbol **ret); 219 220int arch_breakpoint_init(struct Process *proc, struct breakpoint *sbp); 221void arch_breakpoint_destroy(struct breakpoint *sbp); 222int arch_breakpoint_clone(struct breakpoint *retp, struct breakpoint *sbp); 223 224void arch_library_init(struct library *lib); 225void arch_library_destroy(struct library *lib); 226void arch_library_clone(struct library *retp, struct library *lib); 227 228int arch_library_symbol_init(struct library_symbol *libsym); 229void arch_library_symbol_destroy(struct library_symbol *libsym); 230int arch_library_symbol_clone(struct library_symbol *retp, 231 struct library_symbol *libsym); 232 233int arch_process_init(struct Process *proc); 234void arch_process_destroy(struct Process *proc); 235int arch_process_clone(struct Process *retp, struct Process *proc); 236int arch_process_exec(struct Process *proc); 237 238/* This should extract entry point address and interpreter (dynamic 239 * linker) bias if possible. Returns 0 if there were no errors, -1 240 * otherwise. Sets *ENTRYP and *INTERP_BIASP to non-zero values if 241 * the corresponding value is known. Unknown values are set to 0. */ 242int process_get_entry(struct Process *proc, 243 arch_addr_t *entryp, 244 arch_addr_t *interp_biasp); 245 246/* This is called after the dynamic linker is done with the 247 * process startup. */ 248void arch_dynlink_done(struct Process *proc); 249 250#endif /* BACKEND_H */ 251