• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * This file is part of ltrace.
3  * Copyright (C) 2011,2012,2013 Petr Machata, Red Hat Inc.
4  * Copyright (C) 2010 Zachary T Welch, CodeSourcery
5  * Copyright (C) 2010 Joe Damato
6  * Copyright (C) 1998,2008,2009 Juan Cespedes
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; either version 2 of the
11  * License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21  * 02110-1301 USA
22  */
23 
24 #define _GNU_SOURCE /* For getline.  */
25 #include "config.h"
26 
27 #include <sys/stat.h>
28 #include <sys/syscall.h>
29 #include <sys/types.h>
30 #include <ctype.h>
31 #include <dirent.h>
32 #include <errno.h>
33 #include <fcntl.h>
34 #include <inttypes.h>
35 #include <link.h>
36 #include <signal.h>
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <string.h>
40 #include <unistd.h>
41 
42 #include "backend.h"
43 #include "breakpoint.h"
44 #include "config.h"
45 #include "debug.h"
46 #include "events.h"
47 #include "library.h"
48 #include "ltrace-elf.h"
49 #include "proc.h"
50 
51 /* /proc/pid doesn't exist just after the fork, and sometimes `ltrace'
52  * couldn't open it to find the executable.  So it may be necessary to
53  * have a bit delay
54  */
55 
56 #define	MAX_DELAY	100000	/* 100000 microseconds = 0.1 seconds */
57 
58 #define PROC_PID_FILE(VAR, FORMAT, PID)		\
59 	char VAR[strlen(FORMAT) + 6];		\
60 	sprintf(VAR, FORMAT, PID)
61 
62 /*
63  * Returns a (malloc'd) file name corresponding to a running pid
64  */
65 char *
pid2name(pid_t pid)66 pid2name(pid_t pid) {
67 	if (!kill(pid, 0)) {
68 		int delay = 0;
69 
70 		PROC_PID_FILE(proc_exe, "/proc/%d/exe", pid);
71 
72 		while (delay < MAX_DELAY) {
73 			if (!access(proc_exe, F_OK)) {
74 				return strdup(proc_exe);
75 			}
76 			delay += 1000;	/* 1 milisecond */
77 		}
78 	}
79 	return NULL;
80 }
81 
82 static FILE *
open_status_file(pid_t pid)83 open_status_file(pid_t pid)
84 {
85 	PROC_PID_FILE(fn, "/proc/%d/status", pid);
86 	/* Don't complain if we fail.  This would typically happen
87 	   when the process is about to terminate, and these files are
88 	   not available anymore.  This function is called from the
89 	   event loop, and we don't want to clutter the output just
90 	   because the process terminates.  */
91 	return fopen(fn, "r");
92 }
93 
94 static char *
find_line_starting(FILE * file,const char * prefix,size_t len)95 find_line_starting(FILE * file, const char * prefix, size_t len)
96 {
97 	char * line = NULL;
98 	size_t line_len = 0;
99 	while (!feof(file)) {
100 		if (getline(&line, &line_len, file) < 0)
101 			return NULL;
102 		if (strncmp(line, prefix, len) == 0)
103 			return line;
104 	}
105 	return NULL;
106 }
107 
108 static void
each_line_starting(FILE * file,const char * prefix,enum callback_status (* cb)(const char * line,const char * prefix,void * data),void * data)109 each_line_starting(FILE *file, const char *prefix,
110 		   enum callback_status (*cb)(const char *line,
111 					      const char *prefix,
112 					      void *data),
113 		   void *data)
114 {
115 	size_t len = strlen(prefix);
116 	char * line;
117 	while ((line = find_line_starting(file, prefix, len)) != NULL) {
118 		enum callback_status st = (*cb)(line, prefix, data);
119 		free(line);
120 		if (st == CBS_STOP)
121 			return;
122 	}
123 }
124 
125 static enum callback_status
process_leader_cb(const char * line,const char * prefix,void * data)126 process_leader_cb(const char *line, const char *prefix, void *data)
127 {
128 	pid_t * pidp = data;
129 	*pidp = atoi(line + strlen(prefix));
130 	return CBS_STOP;
131 }
132 
133 pid_t
process_leader(pid_t pid)134 process_leader(pid_t pid)
135 {
136 	pid_t tgid = 0;
137 	FILE * file = open_status_file(pid);
138 	if (file != NULL) {
139 		each_line_starting(file, "Tgid:\t", &process_leader_cb, &tgid);
140 		fclose(file);
141 	}
142 
143 	return tgid;
144 }
145 
146 static enum callback_status
process_stopped_cb(const char * line,const char * prefix,void * data)147 process_stopped_cb(const char *line, const char *prefix, void *data)
148 {
149 	char c = line[strlen(prefix)];
150 	// t:tracing stop, T:job control stop
151 	*(int *)data = (c == 't' || c == 'T');
152 	return CBS_STOP;
153 }
154 
155 int
process_stopped(pid_t pid)156 process_stopped(pid_t pid)
157 {
158 	int is_stopped = -1;
159 	FILE * file = open_status_file(pid);
160 	if (file != NULL) {
161 		each_line_starting(file, "State:\t", &process_stopped_cb,
162 				   &is_stopped);
163 		fclose(file);
164 	}
165 	return is_stopped;
166 }
167 
168 static enum callback_status
process_status_cb(const char * line,const char * prefix,void * data)169 process_status_cb(const char *line, const char *prefix, void *data)
170 {
171 	const char * status = line + strlen(prefix);
172 	const char c = *status;
173 
174 #define RETURN(C) do {					\
175 		*(enum process_status *)data = C;	\
176 		return CBS_STOP;			\
177 	} while (0)
178 
179 	switch (c) {
180 	case 'Z': RETURN(PS_ZOMBIE);
181 	case 't': RETURN(PS_TRACING_STOP);
182 	case 'T':
183 		/* This can be either "T (stopped)" or, for older
184 		 * kernels, "T (tracing stop)".  */
185 		if (!strcmp(status, "T (stopped)\n"))
186 			RETURN(PS_STOP);
187 		else if (!strcmp(status, "T (tracing stop)\n"))
188 			RETURN(PS_TRACING_STOP);
189 		else {
190 			fprintf(stderr, "Unknown process status: %s",
191 				status);
192 			RETURN(PS_STOP); /* Some sort of stop
193 					  * anyway.  */
194 		}
195 	case 'D':
196 	case 'S': RETURN(PS_SLEEPING);
197 	}
198 
199 	RETURN(PS_OTHER);
200 #undef RETURN
201 }
202 
203 enum process_status
process_status(pid_t pid)204 process_status(pid_t pid)
205 {
206 	enum process_status ret = PS_INVALID;
207 	FILE * file = open_status_file(pid);
208 	if (file != NULL) {
209 		each_line_starting(file, "State:\t", &process_status_cb, &ret);
210 		fclose(file);
211 		if (ret == PS_INVALID)
212 			fprintf(stderr,
213 				"Couldn't determine status of process %d: %s\n",
214 				pid, strerror(errno));
215 	} else {
216 		/* If the file is not present, the process presumably
217 		 * exited already.  */
218 		ret = PS_ZOMBIE;
219 	}
220 
221 	return ret;
222 }
223 
224 static int
all_digits(const char * str)225 all_digits(const char *str)
226 {
227 	while (isdigit(*str))
228 		str++;
229 	return !*str;
230 }
231 
232 int
process_tasks(pid_t pid,pid_t ** ret_tasks,size_t * ret_n)233 process_tasks(pid_t pid, pid_t **ret_tasks, size_t *ret_n)
234 {
235 	PROC_PID_FILE(fn, "/proc/%d/task", pid);
236 	DIR *d = opendir(fn);
237 	if (d == NULL)
238 		return -1;
239 
240 	pid_t *tasks = NULL;
241 	size_t n = 0;
242 	size_t alloc = 0;
243 
244 	while (1) {
245 		struct dirent entry;
246 		struct dirent *result;
247 		if (readdir_r(d, &entry, &result) != 0) {
248 		fail:
249 			free(tasks);
250 			closedir(d);
251 			return -1;
252 		}
253 		if (result == NULL)
254 			break;
255 		if (result->d_type == DT_DIR && all_digits(result->d_name)) {
256 			pid_t npid = atoi(result->d_name);
257 			if (n >= alloc) {
258 				alloc = alloc > 0 ? (2 * alloc) : 8;
259 				pid_t *ntasks = realloc(tasks,
260 							sizeof(*tasks) * alloc);
261 				if (ntasks == NULL)
262 					goto fail;
263 				tasks = ntasks;
264 			}
265 			assert(n < alloc);
266 			tasks[n++] = npid;
267 		}
268 	}
269 
270 	closedir(d);
271 
272 	*ret_tasks = tasks;
273 	*ret_n = n;
274 	return 0;
275 }
276 
277 /* On native 64-bit system, we need to be careful when handling cross
278  * tracing.  This select appropriate pointer depending on host and
279  * target architectures.  XXX Really we should abstract this into the
280  * ABI object, as theorized about somewhere on pmachata/revamp
281  * branch.  */
282 static void *
select_32_64(struct process * proc,void * p32,void * p64)283 select_32_64(struct process *proc, void *p32, void *p64)
284 {
285 	if (sizeof(long) == 4 || proc->mask_32bit)
286 		return p32;
287 	else
288 		return p64;
289 }
290 
291 static int
fetch_dyn64(struct process * proc,arch_addr_t * addr,Elf64_Dyn * ret)292 fetch_dyn64(struct process *proc, arch_addr_t *addr, Elf64_Dyn *ret)
293 {
294 	if (umovebytes(proc, *addr, ret, sizeof(*ret)) != sizeof(*ret))
295 		return -1;
296 	*addr += sizeof(*ret);
297 	return 0;
298 }
299 
300 static int
fetch_dyn32(struct process * proc,arch_addr_t * addr,Elf64_Dyn * ret)301 fetch_dyn32(struct process *proc, arch_addr_t *addr, Elf64_Dyn *ret)
302 {
303 	Elf32_Dyn dyn;
304 	if (umovebytes(proc, *addr, &dyn, sizeof(dyn)) != sizeof(dyn))
305 		return -1;
306 
307 	*addr += sizeof(dyn);
308 	ret->d_tag = dyn.d_tag;
309 	ret->d_un.d_val = dyn.d_un.d_val;
310 
311 	return 0;
312 }
313 
314 static int (*
dyn_fetcher(struct process * proc)315 dyn_fetcher(struct process *proc))(struct process *,
316 				   arch_addr_t *, Elf64_Dyn *)
317 {
318 	return select_32_64(proc, fetch_dyn32, fetch_dyn64);
319 }
320 
321 int
proc_find_dynamic_entry_addr(struct process * proc,arch_addr_t src_addr,int d_tag,arch_addr_t * ret)322 proc_find_dynamic_entry_addr(struct process *proc, arch_addr_t src_addr,
323 			     int d_tag, arch_addr_t *ret)
324 {
325 	debug(DEBUG_FUNCTION, "find_dynamic_entry()");
326 
327 	if (ret == NULL || src_addr == 0 || d_tag < 0)
328 		return -1;
329 
330 	int i = 0;
331 	while (1) {
332 		Elf64_Dyn entry;
333 		if (dyn_fetcher(proc)(proc, &src_addr, &entry) < 0
334 		    || entry.d_tag == DT_NULL
335 		    || i++ > 100) { /* Arbitrary cut-off so that we
336 				     * don't loop forever if the
337 				     * binary is corrupted.  */
338 			debug(2, "Couldn't find address for dtag!");
339 			return -1;
340 		}
341 
342 		if (entry.d_tag == d_tag) {
343 			/* XXX The double cast should be removed when
344 			 * arch_addr_t becomes integral type.  */
345 			*ret = (arch_addr_t)(uintptr_t)entry.d_un.d_val;
346 			debug(2, "found address: %p in dtag %d", *ret, d_tag);
347 			return 0;
348 		}
349 	}
350 }
351 
352 /* Our own type for representing 32-bit linkmap.  We can't rely on the
353  * definition in link.h, because that's only accurate for our host
354  * architecture, not for target architecture (where the traced process
355  * runs). */
356 #define LT_LINK_MAP(BITS)			\
357 	{					\
358 		Elf##BITS##_Addr l_addr;	\
359 		Elf##BITS##_Addr l_name;	\
360 		Elf##BITS##_Addr l_ld;		\
361 		Elf##BITS##_Addr l_next;	\
362 		Elf##BITS##_Addr l_prev;	\
363 	}
364 struct lt_link_map_32 LT_LINK_MAP(32);
365 struct lt_link_map_64 LT_LINK_MAP(64);
366 
367 static int
fetch_lm64(struct process * proc,arch_addr_t addr,struct lt_link_map_64 * ret)368 fetch_lm64(struct process *proc, arch_addr_t addr,
369 	   struct lt_link_map_64 *ret)
370 {
371 	if (umovebytes(proc, addr, ret, sizeof(*ret)) != sizeof(*ret))
372 		return -1;
373 	return 0;
374 }
375 
376 static int
fetch_lm32(struct process * proc,arch_addr_t addr,struct lt_link_map_64 * ret)377 fetch_lm32(struct process *proc, arch_addr_t addr,
378 	   struct lt_link_map_64 *ret)
379 {
380 	struct lt_link_map_32 lm;
381 	if (umovebytes(proc, addr, &lm, sizeof(lm)) != sizeof(lm))
382 		return -1;
383 
384 	ret->l_addr = lm.l_addr;
385 	ret->l_name = lm.l_name;
386 	ret->l_ld = lm.l_ld;
387 	ret->l_next = lm.l_next;
388 	ret->l_prev = lm.l_prev;
389 
390 	return 0;
391 }
392 
393 static int (*
lm_fetcher(struct process * proc)394 lm_fetcher(struct process *proc))(struct process *,
395 				  arch_addr_t, struct lt_link_map_64 *)
396 {
397 	return select_32_64(proc, fetch_lm32, fetch_lm64);
398 }
399 
400 /* The same as above holds for struct r_debug.  */
401 #define LT_R_DEBUG(BITS)			\
402 	{					\
403 		int r_version;			\
404 		Elf##BITS##_Addr r_map;		\
405 		Elf##BITS##_Addr r_brk;		\
406 		int r_state;			\
407 		Elf##BITS##_Addr r_ldbase;	\
408 	}
409 
410 struct lt_r_debug_32 LT_R_DEBUG(32);
411 struct lt_r_debug_64 LT_R_DEBUG(64);
412 
413 static int
fetch_rd64(struct process * proc,arch_addr_t addr,struct lt_r_debug_64 * ret)414 fetch_rd64(struct process *proc, arch_addr_t addr,
415 	   struct lt_r_debug_64 *ret)
416 {
417 	if (umovebytes(proc, addr, ret, sizeof(*ret)) != sizeof(*ret))
418 		return -1;
419 	return 0;
420 }
421 
422 static int
fetch_rd32(struct process * proc,arch_addr_t addr,struct lt_r_debug_64 * ret)423 fetch_rd32(struct process *proc, arch_addr_t addr,
424 	   struct lt_r_debug_64 *ret)
425 {
426 	struct lt_r_debug_32 rd;
427 	if (umovebytes(proc, addr, &rd, sizeof(rd)) != sizeof(rd))
428 		return -1;
429 
430 	ret->r_version = rd.r_version;
431 	ret->r_map = rd.r_map;
432 	ret->r_brk = rd.r_brk;
433 	ret->r_state = rd.r_state;
434 	ret->r_ldbase = rd.r_ldbase;
435 
436 	return 0;
437 }
438 
439 static int (*
rdebug_fetcher(struct process * proc)440 rdebug_fetcher(struct process *proc))(struct process *,
441 				      arch_addr_t, struct lt_r_debug_64 *)
442 {
443 	return select_32_64(proc, fetch_rd32, fetch_rd64);
444 }
445 
446 static int
fetch_auxv64_entry(int fd,Elf64_auxv_t * ret)447 fetch_auxv64_entry(int fd, Elf64_auxv_t *ret)
448 {
449 	/* Reaching EOF is as much problem as not reading whole
450 	 * entry.  */
451 	return read(fd, ret, sizeof(*ret)) == sizeof(*ret) ? 0 : -1;
452 }
453 
454 static int
fetch_auxv32_entry(int fd,Elf64_auxv_t * ret)455 fetch_auxv32_entry(int fd, Elf64_auxv_t *ret)
456 {
457 	Elf32_auxv_t auxv;
458 	if (read(fd, &auxv, sizeof(auxv)) != sizeof(auxv))
459 		return -1;
460 
461 	ret->a_type = auxv.a_type;
462 	ret->a_un.a_val = auxv.a_un.a_val;
463 	return 0;
464 }
465 
466 static int (*
auxv_fetcher(struct process * proc)467 auxv_fetcher(struct process *proc))(int, Elf64_auxv_t *)
468 {
469 	return select_32_64(proc, fetch_auxv32_entry, fetch_auxv64_entry);
470 }
471 
472 static void
crawl_linkmap(struct process * proc,struct lt_r_debug_64 * dbg)473 crawl_linkmap(struct process *proc, struct lt_r_debug_64 *dbg)
474 {
475 	debug (DEBUG_FUNCTION, "crawl_linkmap()");
476 
477 	if (!dbg || !dbg->r_map) {
478 		debug(2, "Debug structure or it's linkmap are NULL!");
479 		return;
480 	}
481 
482 	/* XXX The double cast should be removed when
483 	 * arch_addr_t becomes integral type.  */
484 	arch_addr_t addr = (arch_addr_t)(uintptr_t)dbg->r_map;
485 
486 	while (addr != 0) {
487 		struct lt_link_map_64 rlm = {};
488 		if (lm_fetcher(proc)(proc, addr, &rlm) < 0) {
489 			debug(2, "Unable to read link map");
490 			return;
491 		}
492 
493 		arch_addr_t key = addr;
494 		/* XXX The double cast should be removed when
495 		 * arch_addr_t becomes integral type.  */
496 		addr = (arch_addr_t)(uintptr_t)rlm.l_next;
497 		if (rlm.l_name == 0) {
498 			debug(2, "Name of mapped library is NULL");
499 			return;
500 		}
501 
502 		char lib_name[BUFSIZ];
503 		/* XXX The double cast should be removed when
504 		 * arch_addr_t becomes integral type.  */
505 		umovebytes(proc, (arch_addr_t)(uintptr_t)rlm.l_name,
506 			   lib_name, sizeof(lib_name));
507 
508 		/* Library name can be an empty string, in which case
509 		 * the entry represents either the main binary, or a
510 		 * VDSO.  Unfortunately we can't rely on that, as in
511 		 * recent glibc, that entry is initialized to VDSO
512 		 * SONAME.
513 		 *
514 		 * It's not clear how to detect VDSO in this case.  We
515 		 * can't assume that l_name of real DSOs will be
516 		 * either absolute or relative (for LD_LIBRARY_PATH=:
517 		 * it will be neither).  We can't compare l_addr with
518 		 * AT_SYSINFO_EHDR either, as l_addr is bias (which
519 		 * also means it's not unique, and therefore useless
520 		 * for this).  We could load VDSO from process image
521 		 * and at least compare actual SONAMEs.  For now, this
522 		 * kludge is about the best that we can do.  */
523 		if (*lib_name == 0
524 		    || strcmp(lib_name, "linux-vdso.so.1") == 0
525 		    || strcmp(lib_name, "linux-gate.so.1") == 0
526 		    || strcmp(lib_name, "linux-vdso32.so.1") == 0
527 		    || strcmp(lib_name, "linux-vdso64.so.1") == 0)
528 			continue;
529 
530 		/* Do we have that library already?  */
531 		if (proc_each_library(proc, NULL, library_with_key_cb, &key))
532 			continue;
533 
534 		struct library *lib = malloc(sizeof(*lib));
535 		if (lib == NULL) {
536 		fail:
537 			free(lib);
538 			fprintf(stderr, "Couldn't load ELF object %s: %s\n",
539 				lib_name, strerror(errno));
540 			continue;
541 		}
542 
543 		if (library_init(lib, LT_LIBTYPE_DSO) < 0)
544 			goto fail;
545 
546 		if (ltelf_read_library(lib, proc, lib_name, rlm.l_addr) < 0) {
547 			library_destroy(lib);
548 			goto fail;
549 		}
550 
551 		lib->key = key;
552 		proc_add_library(proc, lib);
553 	}
554 	return;
555 }
556 
557 static int
load_debug_struct(struct process * proc,struct lt_r_debug_64 * ret)558 load_debug_struct(struct process *proc, struct lt_r_debug_64 *ret)
559 {
560 	debug(DEBUG_FUNCTION, "load_debug_struct");
561 
562 	if (rdebug_fetcher(proc)(proc, proc->os.debug_addr, ret) < 0) {
563 		debug(2, "This process does not have a debug structure!");
564 		return -1;
565 	}
566 
567 	return 0;
568 }
569 
570 static void
rdebug_bp_on_hit(struct breakpoint * bp,struct process * proc)571 rdebug_bp_on_hit(struct breakpoint *bp, struct process *proc)
572 {
573 	debug(DEBUG_FUNCTION, "arch_check_dbg");
574 
575 	struct lt_r_debug_64 rdbg;
576 	if (load_debug_struct(proc, &rdbg) < 0) {
577 		debug(2, "Unable to load debug structure!");
578 		return;
579 	}
580 
581 	if (rdbg.r_state == RT_CONSISTENT) {
582 		debug(2, "Linkmap is now consistent");
583 		switch (proc->os.debug_state) {
584 		case RT_ADD:
585 			debug(2, "Adding DSO to linkmap");
586 			crawl_linkmap(proc, &rdbg);
587 			break;
588 		case RT_DELETE:
589 			debug(2, "Removing DSO from linkmap");
590 			// XXX unload that library
591 			break;
592 		default:
593 			debug(2, "Unexpected debug state!");
594 		}
595 	}
596 
597 	proc->os.debug_state = rdbg.r_state;
598 }
599 
600 #ifndef ARCH_HAVE_FIND_DL_DEBUG
601 int
arch_find_dl_debug(struct process * proc,arch_addr_t dyn_addr,arch_addr_t * ret)602 arch_find_dl_debug(struct process *proc, arch_addr_t dyn_addr,
603 		   arch_addr_t *ret)
604 {
605 	return proc_find_dynamic_entry_addr(proc, dyn_addr, DT_DEBUG, ret);
606 }
607 #endif
608 
609 int
linkmap_init(struct process * proc,arch_addr_t dyn_addr)610 linkmap_init(struct process *proc, arch_addr_t dyn_addr)
611 {
612 	debug(DEBUG_FUNCTION, "linkmap_init(%d, dyn_addr=%p)", proc->pid, dyn_addr);
613 
614 	if (arch_find_dl_debug(proc, dyn_addr, &proc->os.debug_addr) == -1) {
615 		debug(2, "Couldn't find debug structure!");
616 		return -1;
617 	}
618 
619 	int status;
620 	struct lt_r_debug_64 rdbg;
621 	if ((status = load_debug_struct(proc, &rdbg)) < 0) {
622 		debug(2, "No debug structure or no memory to allocate one!");
623 		return status;
624 	}
625 
626 	crawl_linkmap(proc, &rdbg);
627 
628 	/* XXX The double cast should be removed when
629 	 * arch_addr_t becomes integral type.  */
630 	arch_addr_t addr = (arch_addr_t)(uintptr_t)rdbg.r_brk;
631 	if (arch_translate_address_dyn(proc, addr, &addr) < 0)
632 		return -1;
633 
634 	struct breakpoint *rdebug_bp = insert_breakpoint_at(proc, addr, NULL);
635 	if (rdebug_bp == NULL) {
636 		/* This is not fatal, the tracing can continue with
637 		 * reduced functionality.  */
638 		fprintf(stderr,
639 			"Couldn't insert _r_debug breakpoint to %d: %s.\n"
640 			"As a result of that, ltrace will not be able to "
641 			"detect and trace\nnewly-loaded libraries.\n",
642 			proc->pid, strerror(errno));
643 	} else {
644 		static struct bp_callbacks rdebug_callbacks = {
645 			.on_hit = rdebug_bp_on_hit,
646 		};
647 		rdebug_bp->cbs = &rdebug_callbacks;
648 	}
649 
650 	return 0;
651 }
652 
653 int
task_kill(pid_t pid,int sig)654 task_kill (pid_t pid, int sig)
655 {
656 	// Taken from GDB
657         int ret;
658 
659         errno = 0;
660         ret = syscall (__NR_tkill, pid, sig);
661 	return ret;
662 }
663 
664 void
process_removed(struct process * proc)665 process_removed(struct process *proc)
666 {
667 	delete_events_for(proc);
668 }
669 
670 int
process_get_entry(struct process * proc,arch_addr_t * entryp,arch_addr_t * interp_biasp)671 process_get_entry(struct process *proc,
672 		  arch_addr_t *entryp,
673 		  arch_addr_t *interp_biasp)
674 {
675 	PROC_PID_FILE(fn, "/proc/%d/auxv", proc->pid);
676 	int fd = open(fn, O_RDONLY);
677 	int ret = 0;
678 	if (fd == -1) {
679 	fail:
680 		fprintf(stderr, "couldn't read %s: %s", fn, strerror(errno));
681 		ret = -1;
682 	done:
683 		if (fd != -1)
684 			close(fd);
685 		return ret;
686 	}
687 
688 	arch_addr_t at_entry = 0;
689 	arch_addr_t at_bias = 0;
690 	while (1) {
691 		Elf64_auxv_t entry = {};
692 		if (auxv_fetcher(proc)(fd, &entry) < 0)
693 			goto fail;
694 
695 		switch (entry.a_type) {
696 		case AT_BASE:
697 			/* XXX The double cast should be removed when
698 			 * arch_addr_t becomes integral type.  */
699 			at_bias = (arch_addr_t)(uintptr_t)entry.a_un.a_val;
700 			continue;
701 
702 		case AT_ENTRY:
703 			/* XXX The double cast should be removed when
704 			 * arch_addr_t becomes integral type.  */
705 			at_entry = (arch_addr_t)(uintptr_t)entry.a_un.a_val;
706 		default:
707 			continue;
708 
709 		case AT_NULL:
710 			break;
711 		}
712 		break;
713 	}
714 
715 	if (entryp != NULL)
716 		*entryp = at_entry;
717 	if (interp_biasp != NULL)
718 		*interp_biasp = at_bias;
719 	goto done;
720 }
721 
722 int
os_process_init(struct process * proc)723 os_process_init(struct process *proc)
724 {
725 	proc->os.debug_addr = 0;
726 	proc->os.debug_state = 0;
727 	return 0;
728 }
729 
730 void
os_process_destroy(struct process * proc)731 os_process_destroy(struct process *proc)
732 {
733 }
734 
735 int
os_process_clone(struct process * retp,struct process * proc)736 os_process_clone(struct process *retp, struct process *proc)
737 {
738 	retp->os = proc->os;
739 	return 0;
740 }
741 
742 int
os_process_exec(struct process * proc)743 os_process_exec(struct process *proc)
744 {
745 	return 0;
746 }
747