blob: 8a63ed90117770ea717673a738b635aef5d3ae49 [file] [log] [blame]
Petr Machata750ca8c2011-10-06 14:29:34 +02001#define _GNU_SOURCE /* For getline. */
Juan Cespedesd44c6b81998-09-25 14:48:42 +02002#include "config.h"
Juan Cespedesd44c6b81998-09-25 14:48:42 +02003
Juan Cespedes1fe93d51998-03-13 00:29:21 +01004#include <sys/types.h>
Petr Machata9a5420c2011-07-09 11:21:23 +02005#include <sys/stat.h>
6#include <fcntl.h>
Zachary T Welchbfb26c72010-12-06 23:21:00 -08007#include <inttypes.h>
Joe Damato47cae1e2010-11-08 15:47:39 -08008#include <link.h>
Juan Cespedes1fe93d51998-03-13 00:29:21 +01009#include <stdio.h>
10#include <string.h>
11#include <signal.h>
Juan Cespedes273ea6d1998-03-14 23:02:40 +010012#include <unistd.h>
Petr Machata9a5420c2011-07-09 11:21:23 +020013#include <dirent.h>
14#include <ctype.h>
15#include <errno.h>
16#include <sys/syscall.h>
Petr Machata750ca8c2011-10-06 14:29:34 +020017#include <error.h>
Petr Machata9a5420c2011-07-09 11:21:23 +020018
Petr Machataa611fc82012-02-07 13:27:04 +010019#include "common.h"
Petr Machata9294d822012-02-07 12:35:58 +010020#include "breakpoint.h"
Petr Machata366c2f42012-02-09 19:34:36 +010021#include "proc.h"
Petr Machata2b46cfc2012-02-18 11:17:29 +010022#include "library.h"
Juan Cespedes273ea6d1998-03-14 23:02:40 +010023
24/* /proc/pid doesn't exist just after the fork, and sometimes `ltrace'
25 * couldn't open it to find the executable. So it may be necessary to
26 * have a bit delay
27 */
28
Ian Wienand2d45b1a2006-02-20 22:48:07 +010029#define MAX_DELAY 100000 /* 100000 microseconds = 0.1 seconds */
Juan Cespedes1fe93d51998-03-13 00:29:21 +010030
Petr Machata9a5420c2011-07-09 11:21:23 +020031#define PROC_PID_FILE(VAR, FORMAT, PID) \
32 char VAR[strlen(FORMAT) + 6]; \
33 sprintf(VAR, FORMAT, PID)
34
Juan Cespedes1fe93d51998-03-13 00:29:21 +010035/*
Juan Cespedese0660df2009-05-21 18:14:39 +020036 * Returns a (malloc'd) file name corresponding to a running pid
Juan Cespedes1fe93d51998-03-13 00:29:21 +010037 */
Juan Cespedesf1350522008-12-16 18:19:58 +010038char *
39pid2name(pid_t pid) {
Juan Cespedes1fe93d51998-03-13 00:29:21 +010040 if (!kill(pid, 0)) {
Ian Wienand2d45b1a2006-02-20 22:48:07 +010041 int delay = 0;
Juan Cespedes273ea6d1998-03-14 23:02:40 +010042
Petr Machata9a5420c2011-07-09 11:21:23 +020043 PROC_PID_FILE(proc_exe, "/proc/%d/exe", pid);
Juan Cespedes273ea6d1998-03-14 23:02:40 +010044
Ian Wienand2d45b1a2006-02-20 22:48:07 +010045 while (delay < MAX_DELAY) {
Juan Cespedes273ea6d1998-03-14 23:02:40 +010046 if (!access(proc_exe, F_OK)) {
47 return strdup(proc_exe);
48 }
49 delay += 1000; /* 1 milisecond */
50 }
Juan Cespedes1fe93d51998-03-13 00:29:21 +010051 }
Juan Cespedes273ea6d1998-03-14 23:02:40 +010052 return NULL;
Juan Cespedes1fe93d51998-03-13 00:29:21 +010053}
Joe Damato47cae1e2010-11-08 15:47:39 -080054
Petr Machata9a5420c2011-07-09 11:21:23 +020055static FILE *
56open_status_file(pid_t pid)
57{
58 PROC_PID_FILE(fn, "/proc/%d/status", pid);
59 /* Don't complain if we fail. This would typically happen
60 when the process is about to terminate, and these files are
61 not available anymore. This function is called from the
62 event loop, and we don't want to clutter the output just
63 because the process terminates. */
64 return fopen(fn, "r");
65}
66
67static char *
68find_line_starting(FILE * file, const char * prefix, size_t len)
69{
70 char * line = NULL;
71 size_t line_len = 0;
72 while (!feof(file)) {
73 if (getline(&line, &line_len, file) < 0)
74 return NULL;
75 if (strncmp(line, prefix, len) == 0)
76 return line;
77 }
78 return NULL;
79}
80
81static void
Petr Machata2b46cfc2012-02-18 11:17:29 +010082each_line_starting(FILE *file, const char *prefix,
83 enum callback_status (*cb)(const char *line,
84 const char *prefix,
85 void *data),
86 void *data)
Petr Machata9a5420c2011-07-09 11:21:23 +020087{
88 size_t len = strlen(prefix);
89 char * line;
90 while ((line = find_line_starting(file, prefix, len)) != NULL) {
Petr Machata2b46cfc2012-02-18 11:17:29 +010091 enum callback_status st = (*cb)(line, prefix, data);
Petr Machata9a5420c2011-07-09 11:21:23 +020092 free (line);
Petr Machata2b46cfc2012-02-18 11:17:29 +010093 if (st == CBS_STOP)
Petr Machata9a5420c2011-07-09 11:21:23 +020094 return;
95 }
96}
97
Petr Machata2b46cfc2012-02-18 11:17:29 +010098static enum callback_status
99process_leader_cb(const char *line, const char *prefix, void *data)
Petr Machata9a5420c2011-07-09 11:21:23 +0200100{
101 pid_t * pidp = data;
102 *pidp = atoi(line + strlen(prefix));
Petr Machata2b46cfc2012-02-18 11:17:29 +0100103 return CBS_STOP;
Petr Machata9a5420c2011-07-09 11:21:23 +0200104}
105
106pid_t
107process_leader(pid_t pid)
108{
Petr Machata1974dbc2011-08-19 18:58:01 +0200109 pid_t tgid = 0;
Petr Machata9a5420c2011-07-09 11:21:23 +0200110 FILE * file = open_status_file(pid);
111 if (file != NULL) {
112 each_line_starting(file, "Tgid:\t", &process_leader_cb, &tgid);
113 fclose(file);
114 }
115
116 return tgid;
117}
118
Petr Machata2b46cfc2012-02-18 11:17:29 +0100119static enum callback_status
120process_stopped_cb(const char *line, const char *prefix, void *data)
Petr Machata9a5420c2011-07-09 11:21:23 +0200121{
122 char c = line[strlen(prefix)];
123 // t:tracing stop, T:job control stop
124 *(int *)data = (c == 't' || c == 'T');
Petr Machata2b46cfc2012-02-18 11:17:29 +0100125 return CBS_STOP;
Petr Machata9a5420c2011-07-09 11:21:23 +0200126}
127
128int
129process_stopped(pid_t pid)
130{
131 int is_stopped = -1;
132 FILE * file = open_status_file(pid);
133 if (file != NULL) {
134 each_line_starting(file, "State:\t", &process_stopped_cb,
135 &is_stopped);
136 fclose(file);
137 }
138 return is_stopped;
139}
140
Petr Machata2b46cfc2012-02-18 11:17:29 +0100141static enum callback_status
142process_status_cb(const char *line, const char *prefix, void *data)
Petr Machata9a5420c2011-07-09 11:21:23 +0200143{
Petr Machata617ff0b2011-10-06 14:23:24 +0200144 const char * status = line + strlen(prefix);
145 const char c = *status;
146
147#define RETURN(C) do { \
148 *(enum process_status *)data = C; \
Petr Machata2b46cfc2012-02-18 11:17:29 +0100149 return CBS_STOP; \
Petr Machata617ff0b2011-10-06 14:23:24 +0200150 } while (0)
151
152 switch (c) {
153 case 'Z': RETURN(ps_zombie);
154 case 't': RETURN(ps_tracing_stop);
Petr Machatacbe29c62011-09-27 02:27:58 +0200155 case 'T':
Petr Machata617ff0b2011-10-06 14:23:24 +0200156 /* This can be either "T (stopped)" or, for older
157 * kernels, "T (tracing stop)". */
158 if (!strcmp(status, "T (stopped)\n"))
159 RETURN(ps_stop);
160 else if (!strcmp(status, "T (tracing stop)\n"))
161 RETURN(ps_tracing_stop);
162 else {
163 fprintf(stderr, "Unknown process status: %s",
164 status);
165 RETURN(ps_stop); /* Some sort of stop
166 * anyway. */
167 }
Petr Machatacbe29c62011-09-27 02:27:58 +0200168 case 'D':
169 case 'S': RETURN(ps_sleeping);
Petr Machata617ff0b2011-10-06 14:23:24 +0200170 }
171
172 RETURN(ps_other);
173#undef RETURN
Petr Machata9a5420c2011-07-09 11:21:23 +0200174}
175
Petr Machata617ff0b2011-10-06 14:23:24 +0200176enum process_status
Petr Machata9a5420c2011-07-09 11:21:23 +0200177process_status(pid_t pid)
178{
Petr Machata617ff0b2011-10-06 14:23:24 +0200179 enum process_status ret = ps_invalid;
Petr Machata9a5420c2011-07-09 11:21:23 +0200180 FILE * file = open_status_file(pid);
181 if (file != NULL) {
182 each_line_starting(file, "State:\t", &process_status_cb, &ret);
183 fclose(file);
Petr Machata750ca8c2011-10-06 14:29:34 +0200184 if (ret == ps_invalid)
185 error(0, errno, "process_status %d", pid);
186 } else
187 /* If the file is not present, the process presumably
188 * exited already. */
189 ret = ps_zombie;
190
Petr Machata9a5420c2011-07-09 11:21:23 +0200191 return ret;
192}
193
194static int
195all_digits(const char *str)
196{
197 while (isdigit(*str))
198 str++;
199 return !*str;
200}
201
202int
203process_tasks(pid_t pid, pid_t **ret_tasks, size_t *ret_n)
204{
205 PROC_PID_FILE(fn, "/proc/%d/task", pid);
206 DIR * d = opendir(fn);
207 if (d == NULL)
208 return -1;
209
Petr Machata9a5420c2011-07-09 11:21:23 +0200210 pid_t *tasks = NULL;
211 size_t n = 0;
212 size_t alloc = 0;
213
214 while (1) {
215 struct dirent entry;
216 struct dirent *result;
217 if (readdir_r(d, &entry, &result) != 0) {
218 free(tasks);
219 return -1;
220 }
221 if (result == NULL)
222 break;
223 if (result->d_type == DT_DIR && all_digits(result->d_name)) {
224 pid_t npid = atoi(result->d_name);
225 if (n >= alloc) {
226 alloc = alloc > 0 ? (2 * alloc) : 8;
227 pid_t *ntasks = realloc(tasks,
228 sizeof(*tasks) * alloc);
229 if (ntasks == NULL) {
230 free(tasks);
231 return -1;
232 }
233 tasks = ntasks;
234 }
235 if (n >= alloc)
236 abort();
237 tasks[n++] = npid;
238 }
239 }
240
241 closedir(d);
242
243 *ret_tasks = tasks;
244 *ret_n = n;
245 return 0;
246}
247
Petr Machata6a7997d2012-03-29 18:37:15 +0200248/* On native 64-bit system, we need to be careful when handling cross
249 * tracing. This select appropriate pointer depending on host and
250 * target architectures. XXX Really we should abstract this into the
251 * ABI object, as theorized about somewhere on pmachata/revamp
252 * branch. */
253static void *
254select_32_64(struct Process *proc, void *p32, void *p64)
255{
256 if (sizeof(long) == 4 || proc->mask_32bit)
257 return p32;
258 else
259 return p64;
260}
261
Joe Damato47cae1e2010-11-08 15:47:39 -0800262static int
Petr Machata6a7997d2012-03-29 18:37:15 +0200263fetch_dyn64(struct Process *proc, target_address_t *addr, Elf64_Dyn *ret)
264{
265 if (umovebytes(proc, *addr, ret, sizeof(*ret)) != sizeof(*ret))
266 return -1;
267 *addr += sizeof(*ret);
268 return 0;
269}
270
271static int
272fetch_dyn32(struct Process *proc, target_address_t *addr, Elf64_Dyn *ret)
273{
274 Elf32_Dyn dyn;
275 if (umovebytes(proc, *addr, &dyn, sizeof(dyn)) != sizeof(dyn))
276 return -1;
277
278 *addr += sizeof(dyn);
279 ret->d_tag = dyn.d_tag;
280 ret->d_un.d_val = dyn.d_un.d_val;
281
282 return 0;
283}
284
285static int (*
286dyn_fetcher(struct Process *proc))(struct Process *,
287 target_address_t *, Elf64_Dyn *)
288{
289 return select_32_64(proc, fetch_dyn32, fetch_dyn64);
290}
291
292static int
293find_dynamic_entry_addr(struct Process *proc, target_address_t src_addr,
294 int d_tag, target_address_t *ret)
295{
Joe Damato47cae1e2010-11-08 15:47:39 -0800296 debug(DEBUG_FUNCTION, "find_dynamic_entry()");
297
Petr Machata6a7997d2012-03-29 18:37:15 +0200298 if (ret == NULL || src_addr == 0 || d_tag < 0 || d_tag > DT_NUM)
Joe Damato47cae1e2010-11-08 15:47:39 -0800299 return -1;
Joe Damato47cae1e2010-11-08 15:47:39 -0800300
Petr Machata6a7997d2012-03-29 18:37:15 +0200301 int i = 0;
302 while (1) {
303 Elf64_Dyn entry;
304 if (dyn_fetcher(proc)(proc, &src_addr, &entry) < 0
305 || entry.d_tag == DT_NULL
306 || i++ > 100) { /* Arbitrary cut-off so that we
307 * don't loop forever if the
308 * binary is corrupted. */
309 debug(2, "Couldn't find address for dtag!");
310 return -1;
311 }
312
Joe Damato47cae1e2010-11-08 15:47:39 -0800313 if (entry.d_tag == d_tag) {
Petr Machata6a7997d2012-03-29 18:37:15 +0200314 *ret = (target_address_t)entry.d_un.d_val;
315 debug(2, "found address: %p in dtag %d\n", *ret, d_tag);
Petr Machata17476b72012-02-23 18:50:37 +0100316 return 0;
Joe Damato47cae1e2010-11-08 15:47:39 -0800317 }
Petr Machata6a7997d2012-03-29 18:37:15 +0200318 }
319}
320
321/* Our own type for representing 32-bit linkmap. We can't rely on the
322 * definition in link.h, because that's only accurate for our host
323 * architecture, not for target architecture (where the traced process
324 * runs). */
325#define LT_LINK_MAP(BITS) \
326 { \
327 Elf##BITS##_Addr l_addr; \
328 Elf##BITS##_Addr l_name; \
329 Elf##BITS##_Addr l_ld; \
330 Elf##BITS##_Addr l_next; \
331 Elf##BITS##_Addr l_prev; \
332 }
333struct lt_link_map_32 LT_LINK_MAP(32);
334struct lt_link_map_64 LT_LINK_MAP(64);
335
336static int
337fetch_lm64(struct Process *proc, target_address_t addr,
338 struct lt_link_map_64 *ret)
339{
340 if (umovebytes(proc, addr, ret, sizeof(*ret)) != sizeof(*ret))
341 return -1;
342 return 0;
343}
344
345static int
346fetch_lm32(struct Process *proc, target_address_t addr,
347 struct lt_link_map_64 *ret)
348{
349 struct lt_link_map_32 lm;
350 if (umovebytes(proc, addr, &lm, sizeof(lm)) != sizeof(lm))
351 return -1;
352
353 ret->l_addr = lm.l_addr;
354 ret->l_name = lm.l_name;
355 ret->l_ld = lm.l_ld;
356 ret->l_next = lm.l_next;
357 ret->l_prev = lm.l_prev;
358
359 return 0;
360}
361
362static int (*
363lm_fetcher(struct Process *proc))(struct Process *,
364 target_address_t, struct lt_link_map_64 *)
365{
366 return select_32_64(proc, fetch_lm32, fetch_lm64);
367}
368
369/* The same as above holds for struct r_debug. */
370#define LT_R_DEBUG(BITS) \
371 { \
372 int r_version; \
373 Elf##BITS##_Addr r_map; \
374 Elf##BITS##_Addr r_brk; \
375 int r_state; \
376 Elf##BITS##_Addr r_ldbase; \
Joe Damato47cae1e2010-11-08 15:47:39 -0800377 }
378
Petr Machata6a7997d2012-03-29 18:37:15 +0200379struct lt_r_debug_32 LT_R_DEBUG(32);
380struct lt_r_debug_64 LT_R_DEBUG(64);
381
382static int
383fetch_rd64(struct Process *proc, target_address_t addr,
384 struct lt_r_debug_64 *ret)
385{
386 if (umovebytes(proc, addr, ret, sizeof(*ret)) != sizeof(*ret))
387 return -1;
388 return 0;
389}
390
391static int
392fetch_rd32(struct Process *proc, target_address_t addr,
393 struct lt_r_debug_64 *ret)
394{
395 struct lt_r_debug_32 rd;
396 if (umovebytes(proc, addr, &rd, sizeof(rd)) != sizeof(rd))
397 return -1;
398
399 ret->r_version = rd.r_version;
400 ret->r_map = rd.r_map;
401 ret->r_brk = rd.r_brk;
402 ret->r_state = rd.r_state;
403 ret->r_ldbase = rd.r_ldbase;
404
405 return 0;
406}
407
408static int (*
409rdebug_fetcher(struct Process *proc))(struct Process *,
410 target_address_t, struct lt_r_debug_64 *)
411{
412 return select_32_64(proc, fetch_rd32, fetch_rd64);
Joe Damato47cae1e2010-11-08 15:47:39 -0800413}
Joe Damatof0bd98b2010-11-08 15:47:42 -0800414
Joe Damatof0bd98b2010-11-08 15:47:42 -0800415static void
Petr Machata6a7997d2012-03-29 18:37:15 +0200416crawl_linkmap(struct Process *proc, struct lt_r_debug_64 *dbg)
Petr Machata2b46cfc2012-02-18 11:17:29 +0100417{
Joe Damatof0bd98b2010-11-08 15:47:42 -0800418 debug (DEBUG_FUNCTION, "crawl_linkmap()");
419
420 if (!dbg || !dbg->r_map) {
421 debug(2, "Debug structure or it's linkmap are NULL!");
422 return;
423 }
424
Petr Machata6a7997d2012-03-29 18:37:15 +0200425 target_address_t addr = (target_address_t)dbg->r_map;
Joe Damatof0bd98b2010-11-08 15:47:42 -0800426
Petr Machata6a7997d2012-03-29 18:37:15 +0200427 while (addr != 0) {
428 struct lt_link_map_64 rlm;
429 if (lm_fetcher(proc)(proc, addr, &rlm) < 0) {
Petr Machata74d80542012-04-03 12:40:59 +0200430 debug(2, "Unable to read link map");
Joe Damatof0bd98b2010-11-08 15:47:42 -0800431 return;
432 }
433
Petr Machata89ac0392012-04-03 02:30:48 +0200434 target_address_t key = addr;
Petr Machata6a7997d2012-03-29 18:37:15 +0200435 addr = (target_address_t)rlm.l_next;
436 if (rlm.l_name == 0) {
Petr Machata74d80542012-04-03 12:40:59 +0200437 debug(2, "Name of mapped library is NULL");
Joe Damatof0bd98b2010-11-08 15:47:42 -0800438 return;
439 }
440
Petr Machata6a7997d2012-03-29 18:37:15 +0200441 char lib_name[BUFSIZ];
442 umovebytes(proc, (target_address_t)rlm.l_name,
443 lib_name, sizeof(lib_name));
Joe Damatof0bd98b2010-11-08 15:47:42 -0800444
Petr Machata2b46cfc2012-02-18 11:17:29 +0100445 if (*lib_name == '\0') {
446 /* VDSO. No associated file, XXX but we might
447 * load it from the address space of the
448 * process. */
Joe Damatof0bd98b2010-11-08 15:47:42 -0800449 continue;
450 }
451
Petr Machata89ac0392012-04-03 02:30:48 +0200452 /* Do we have that library already? */
453 if (proc_each_library(proc, NULL, library_with_key_cb, &key))
454 continue;
455
Petr Machatab5f80ac2012-04-04 01:46:18 +0200456 struct library *lib = malloc(sizeof(*lib));
Petr Machata2b46cfc2012-02-18 11:17:29 +0100457 if (lib == NULL) {
Petr Machatab5f80ac2012-04-04 01:46:18 +0200458 fail:
459 if (lib != NULL)
460 library_destroy(lib);
Petr Machata2b46cfc2012-02-18 11:17:29 +0100461 error(0, errno, "Couldn't load ELF object %s\n",
462 lib_name);
463 continue;
Joe Damatof0bd98b2010-11-08 15:47:42 -0800464 }
Petr Machatab5f80ac2012-04-04 01:46:18 +0200465 library_init(lib, LT_LIBTYPE_DSO);
466
467 if (ltelf_read_library(lib, proc, lib_name, rlm.l_addr) < 0)
468 goto fail;
469
Petr Machata89ac0392012-04-03 02:30:48 +0200470 lib->key = key;
Petr Machata2b46cfc2012-02-18 11:17:29 +0100471 proc_add_library(proc, lib);
Joe Damatof0bd98b2010-11-08 15:47:42 -0800472 }
473 return;
474}
475
Petr Machata029171f2012-04-05 02:14:30 +0200476/* A struct stored at proc->debug. */
477struct debug_struct
478{
479 target_address_t debug_addr;
480 int state;
481};
482
Petr Machata6a7997d2012-03-29 18:37:15 +0200483static int
484load_debug_struct(struct Process *proc, struct lt_r_debug_64 *ret)
485{
Joe Damatof0bd98b2010-11-08 15:47:42 -0800486 debug(DEBUG_FUNCTION, "load_debug_struct");
487
Petr Machata029171f2012-04-05 02:14:30 +0200488 struct debug_struct *debug = proc->debug;
489
490 if (rdebug_fetcher(proc)(proc, debug->debug_addr, ret) < 0) {
Joe Damatof0bd98b2010-11-08 15:47:42 -0800491 debug(2, "This process does not have a debug structure!\n");
Petr Machata6a7997d2012-03-29 18:37:15 +0200492 return -1;
Joe Damatof0bd98b2010-11-08 15:47:42 -0800493 }
494
Petr Machata6a7997d2012-03-29 18:37:15 +0200495 return 0;
Joe Damatof0bd98b2010-11-08 15:47:42 -0800496}
497
498static void
Petr Machata12affff2012-03-29 18:33:03 +0200499rdebug_bp_on_hit(struct breakpoint *bp, struct Process *proc)
Petr Machata2b46cfc2012-02-18 11:17:29 +0100500{
Joe Damatof0bd98b2010-11-08 15:47:42 -0800501 debug(DEBUG_FUNCTION, "arch_check_dbg");
502
Petr Machata6a7997d2012-03-29 18:37:15 +0200503 struct lt_r_debug_64 rdbg;
504 if (load_debug_struct(proc, &rdbg) < 0) {
Joe Damatof0bd98b2010-11-08 15:47:42 -0800505 debug(2, "Unable to load debug structure!");
506 return;
507 }
508
Petr Machata029171f2012-04-05 02:14:30 +0200509 struct debug_struct *debug = proc->debug;
Petr Machata6a7997d2012-03-29 18:37:15 +0200510 if (rdbg.r_state == RT_CONSISTENT) {
Joe Damatof0bd98b2010-11-08 15:47:42 -0800511 debug(2, "Linkmap is now consistent");
Petr Machata029171f2012-04-05 02:14:30 +0200512 if (debug->state == RT_ADD) {
Joe Damatof0bd98b2010-11-08 15:47:42 -0800513 debug(2, "Adding DSO to linkmap");
Petr Machata2b46cfc2012-02-18 11:17:29 +0100514 //data.proc = proc;
Petr Machata6a7997d2012-03-29 18:37:15 +0200515 crawl_linkmap(proc, &rdbg);
Petr Machata2b46cfc2012-02-18 11:17:29 +0100516 //&data);
Petr Machata029171f2012-04-05 02:14:30 +0200517 } else if (debug->state == RT_DELETE) {
Joe Damatof0bd98b2010-11-08 15:47:42 -0800518 debug(2, "Removing DSO from linkmap");
519 } else {
520 debug(2, "Unexpected debug state!");
521 }
522 }
523
Petr Machata029171f2012-04-05 02:14:30 +0200524 debug->state = rdbg.r_state;
Joe Damatof0bd98b2010-11-08 15:47:42 -0800525}
526
Joe Damatof0bd98b2010-11-08 15:47:42 -0800527int
Petr Machata52dbfb12012-03-29 16:38:26 +0200528linkmap_init(struct Process *proc, target_address_t dyn_addr)
Petr Machata2b46cfc2012-02-18 11:17:29 +0100529{
Joe Damatof0bd98b2010-11-08 15:47:42 -0800530 debug(DEBUG_FUNCTION, "linkmap_init()");
531
Petr Machata029171f2012-04-05 02:14:30 +0200532 struct debug_struct *debug = malloc(sizeof(*debug));
533 if (debug == NULL) {
534 error(0, errno, "couldn't allocate debug struct");
Petr Machata89ac0392012-04-03 02:30:48 +0200535 fail:
Petr Machata029171f2012-04-05 02:14:30 +0200536 proc->debug = NULL;
537 free(debug);
Joe Damatof0bd98b2010-11-08 15:47:42 -0800538 return -1;
539 }
Petr Machata029171f2012-04-05 02:14:30 +0200540 proc->debug = debug;
Joe Damatof0bd98b2010-11-08 15:47:42 -0800541
Petr Machata029171f2012-04-05 02:14:30 +0200542 if (find_dynamic_entry_addr(proc, dyn_addr, DT_DEBUG,
543 &debug->debug_addr) == -1) {
544 debug(2, "Couldn't find debug structure!");
545 goto fail;
546 }
Joe Damatof0bd98b2010-11-08 15:47:42 -0800547
Petr Machata6a7997d2012-03-29 18:37:15 +0200548 int status;
549 struct lt_r_debug_64 rdbg;
550 if ((status = load_debug_struct(proc, &rdbg)) < 0) {
Joe Damatof0bd98b2010-11-08 15:47:42 -0800551 debug(2, "No debug structure or no memory to allocate one!");
Petr Machata6a7997d2012-03-29 18:37:15 +0200552 return status;
Joe Damatof0bd98b2010-11-08 15:47:42 -0800553 }
554
Petr Machata89ac0392012-04-03 02:30:48 +0200555 target_address_t addr = (target_address_t)rdbg.r_brk;
556 if (arch_translate_address(proc, addr, &addr) < 0)
557 goto fail;
Petr Machata89ac0392012-04-03 02:30:48 +0200558
Petr Machata9df15012012-02-20 12:49:46 +0100559 struct breakpoint *rdebug_bp = insert_breakpoint(proc, addr, NULL);
Petr Machata2b46cfc2012-02-18 11:17:29 +0100560 static struct bp_callbacks rdebug_callbacks = {
Petr Machata12affff2012-03-29 18:33:03 +0200561 .on_hit = rdebug_bp_on_hit,
Petr Machata2b46cfc2012-02-18 11:17:29 +0100562 };
563 rdebug_bp->cbs = &rdebug_callbacks;
Joe Damatof0bd98b2010-11-08 15:47:42 -0800564
Petr Machata6a7997d2012-03-29 18:37:15 +0200565 crawl_linkmap(proc, &rdbg);
Joe Damatof0bd98b2010-11-08 15:47:42 -0800566
Joe Damatof0bd98b2010-11-08 15:47:42 -0800567 return 0;
568}
Petr Machata9a5420c2011-07-09 11:21:23 +0200569
570int
571task_kill (pid_t pid, int sig)
572{
573 // Taken from GDB
574 int ret;
575
576 errno = 0;
577 ret = syscall (__NR_tkill, pid, sig);
578 return ret;
579}