blob: 57f38c5b69e0cc8ae811ae161829e400225ec990 [file] [log] [blame]
Petr Machata64262602012-01-07 03:41:36 +01001/*
2 * This file is part of ltrace.
3 * Copyright (C) 2011,2012 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
Petr Machata750ca8c2011-10-06 14:29:34 +020024#define _GNU_SOURCE /* For getline. */
Juan Cespedesd44c6b81998-09-25 14:48:42 +020025#include "config.h"
Juan Cespedesd44c6b81998-09-25 14:48:42 +020026
Petr Machata9a5420c2011-07-09 11:21:23 +020027#include <sys/stat.h>
Petr Machatacc0e1e42012-04-25 13:42:07 +020028#include <sys/syscall.h>
29#include <sys/types.h>
30#include <ctype.h>
31#include <dirent.h>
32#include <errno.h>
Petr Machata9a5420c2011-07-09 11:21:23 +020033#include <fcntl.h>
Zachary T Welchbfb26c72010-12-06 23:21:00 -080034#include <inttypes.h>
Joe Damato47cae1e2010-11-08 15:47:39 -080035#include <link.h>
Petr Machatacc0e1e42012-04-25 13:42:07 +020036#include <signal.h>
Juan Cespedes1fe93d51998-03-13 00:29:21 +010037#include <stdio.h>
Petr Machataba1664b2012-04-28 14:59:05 +020038#include <stdlib.h>
Juan Cespedes1fe93d51998-03-13 00:29:21 +010039#include <string.h>
Juan Cespedes273ea6d1998-03-14 23:02:40 +010040#include <unistd.h>
Petr Machata9a5420c2011-07-09 11:21:23 +020041
Petr Machata64262602012-01-07 03:41:36 +010042#include "backend.h"
Petr Machataba1664b2012-04-28 14:59:05 +020043#include "breakpoint.h"
44#include "config.h"
45#include "debug.h"
Petr Machatacd972582012-01-07 03:02:07 +010046#include "events.h"
Petr Machataba1664b2012-04-28 14:59:05 +020047#include "library.h"
48#include "ltrace-elf.h"
49#include "proc.h"
Juan Cespedes273ea6d1998-03-14 23:02:40 +010050
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
Ian Wienand2d45b1a2006-02-20 22:48:07 +010056#define MAX_DELAY 100000 /* 100000 microseconds = 0.1 seconds */
Juan Cespedes1fe93d51998-03-13 00:29:21 +010057
Petr Machata9a5420c2011-07-09 11:21:23 +020058#define PROC_PID_FILE(VAR, FORMAT, PID) \
59 char VAR[strlen(FORMAT) + 6]; \
60 sprintf(VAR, FORMAT, PID)
61
Juan Cespedes1fe93d51998-03-13 00:29:21 +010062/*
Juan Cespedese0660df2009-05-21 18:14:39 +020063 * Returns a (malloc'd) file name corresponding to a running pid
Juan Cespedes1fe93d51998-03-13 00:29:21 +010064 */
Juan Cespedesf1350522008-12-16 18:19:58 +010065char *
66pid2name(pid_t pid) {
Juan Cespedes1fe93d51998-03-13 00:29:21 +010067 if (!kill(pid, 0)) {
Ian Wienand2d45b1a2006-02-20 22:48:07 +010068 int delay = 0;
Juan Cespedes273ea6d1998-03-14 23:02:40 +010069
Petr Machata9a5420c2011-07-09 11:21:23 +020070 PROC_PID_FILE(proc_exe, "/proc/%d/exe", pid);
Juan Cespedes273ea6d1998-03-14 23:02:40 +010071
Ian Wienand2d45b1a2006-02-20 22:48:07 +010072 while (delay < MAX_DELAY) {
Juan Cespedes273ea6d1998-03-14 23:02:40 +010073 if (!access(proc_exe, F_OK)) {
74 return strdup(proc_exe);
75 }
76 delay += 1000; /* 1 milisecond */
77 }
Juan Cespedes1fe93d51998-03-13 00:29:21 +010078 }
Juan Cespedes273ea6d1998-03-14 23:02:40 +010079 return NULL;
Juan Cespedes1fe93d51998-03-13 00:29:21 +010080}
Joe Damato47cae1e2010-11-08 15:47:39 -080081
Petr Machata9a5420c2011-07-09 11:21:23 +020082static FILE *
83open_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
94static char *
95find_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
108static void
Petr Machata2b46cfc2012-02-18 11:17:29 +0100109each_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)
Petr Machata9a5420c2011-07-09 11:21:23 +0200114{
115 size_t len = strlen(prefix);
116 char * line;
117 while ((line = find_line_starting(file, prefix, len)) != NULL) {
Petr Machata2b46cfc2012-02-18 11:17:29 +0100118 enum callback_status st = (*cb)(line, prefix, data);
Petr Machataba1664b2012-04-28 14:59:05 +0200119 free(line);
Petr Machata2b46cfc2012-02-18 11:17:29 +0100120 if (st == CBS_STOP)
Petr Machata9a5420c2011-07-09 11:21:23 +0200121 return;
122 }
123}
124
Petr Machata2b46cfc2012-02-18 11:17:29 +0100125static enum callback_status
126process_leader_cb(const char *line, const char *prefix, void *data)
Petr Machata9a5420c2011-07-09 11:21:23 +0200127{
128 pid_t * pidp = data;
129 *pidp = atoi(line + strlen(prefix));
Petr Machata2b46cfc2012-02-18 11:17:29 +0100130 return CBS_STOP;
Petr Machata9a5420c2011-07-09 11:21:23 +0200131}
132
133pid_t
134process_leader(pid_t pid)
135{
Petr Machata1974dbc2011-08-19 18:58:01 +0200136 pid_t tgid = 0;
Petr Machata9a5420c2011-07-09 11:21:23 +0200137 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
Petr Machata2b46cfc2012-02-18 11:17:29 +0100146static enum callback_status
147process_stopped_cb(const char *line, const char *prefix, void *data)
Petr Machata9a5420c2011-07-09 11:21:23 +0200148{
149 char c = line[strlen(prefix)];
150 // t:tracing stop, T:job control stop
151 *(int *)data = (c == 't' || c == 'T');
Petr Machata2b46cfc2012-02-18 11:17:29 +0100152 return CBS_STOP;
Petr Machata9a5420c2011-07-09 11:21:23 +0200153}
154
155int
156process_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
Petr Machata2b46cfc2012-02-18 11:17:29 +0100168static enum callback_status
169process_status_cb(const char *line, const char *prefix, void *data)
Petr Machata9a5420c2011-07-09 11:21:23 +0200170{
Petr Machata617ff0b2011-10-06 14:23:24 +0200171 const char * status = line + strlen(prefix);
172 const char c = *status;
173
174#define RETURN(C) do { \
175 *(enum process_status *)data = C; \
Petr Machata2b46cfc2012-02-18 11:17:29 +0100176 return CBS_STOP; \
Petr Machata617ff0b2011-10-06 14:23:24 +0200177 } while (0)
178
179 switch (c) {
180 case 'Z': RETURN(ps_zombie);
181 case 't': RETURN(ps_tracing_stop);
Petr Machatacbe29c62011-09-27 02:27:58 +0200182 case 'T':
Petr Machata617ff0b2011-10-06 14:23:24 +0200183 /* 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 }
Petr Machatacbe29c62011-09-27 02:27:58 +0200195 case 'D':
196 case 'S': RETURN(ps_sleeping);
Petr Machata617ff0b2011-10-06 14:23:24 +0200197 }
198
199 RETURN(ps_other);
200#undef RETURN
Petr Machata9a5420c2011-07-09 11:21:23 +0200201}
202
Petr Machata617ff0b2011-10-06 14:23:24 +0200203enum process_status
Petr Machata9a5420c2011-07-09 11:21:23 +0200204process_status(pid_t pid)
205{
Petr Machata617ff0b2011-10-06 14:23:24 +0200206 enum process_status ret = ps_invalid;
Petr Machata9a5420c2011-07-09 11:21:23 +0200207 FILE * file = open_status_file(pid);
208 if (file != NULL) {
209 each_line_starting(file, "State:\t", &process_status_cb, &ret);
210 fclose(file);
Petr Machata750ca8c2011-10-06 14:29:34 +0200211 if (ret == ps_invalid)
Petr Machatacc0e1e42012-04-25 13:42:07 +0200212 fprintf(stderr, "process_status %d: %s", pid,
213 strerror(errno));
Petr Machata750ca8c2011-10-06 14:29:34 +0200214 } else
215 /* If the file is not present, the process presumably
216 * exited already. */
217 ret = ps_zombie;
218
Petr Machata9a5420c2011-07-09 11:21:23 +0200219 return ret;
220}
221
222static int
223all_digits(const char *str)
224{
225 while (isdigit(*str))
226 str++;
227 return !*str;
228}
229
230int
231process_tasks(pid_t pid, pid_t **ret_tasks, size_t *ret_n)
232{
233 PROC_PID_FILE(fn, "/proc/%d/task", pid);
234 DIR * d = opendir(fn);
235 if (d == NULL)
236 return -1;
237
Petr Machata9a5420c2011-07-09 11:21:23 +0200238 pid_t *tasks = NULL;
239 size_t n = 0;
240 size_t alloc = 0;
241
242 while (1) {
243 struct dirent entry;
244 struct dirent *result;
245 if (readdir_r(d, &entry, &result) != 0) {
246 free(tasks);
247 return -1;
248 }
249 if (result == NULL)
250 break;
251 if (result->d_type == DT_DIR && all_digits(result->d_name)) {
252 pid_t npid = atoi(result->d_name);
253 if (n >= alloc) {
254 alloc = alloc > 0 ? (2 * alloc) : 8;
255 pid_t *ntasks = realloc(tasks,
256 sizeof(*tasks) * alloc);
257 if (ntasks == NULL) {
258 free(tasks);
259 return -1;
260 }
261 tasks = ntasks;
262 }
263 if (n >= alloc)
264 abort();
265 tasks[n++] = npid;
266 }
267 }
268
269 closedir(d);
270
271 *ret_tasks = tasks;
272 *ret_n = n;
273 return 0;
274}
275
Petr Machata6a7997d2012-03-29 18:37:15 +0200276/* On native 64-bit system, we need to be careful when handling cross
277 * tracing. This select appropriate pointer depending on host and
278 * target architectures. XXX Really we should abstract this into the
279 * ABI object, as theorized about somewhere on pmachata/revamp
280 * branch. */
281static void *
282select_32_64(struct Process *proc, void *p32, void *p64)
283{
284 if (sizeof(long) == 4 || proc->mask_32bit)
285 return p32;
286 else
287 return p64;
288}
289
Joe Damato47cae1e2010-11-08 15:47:39 -0800290static int
Petr Machatabac2da52012-05-29 00:42:59 +0200291fetch_dyn64(struct Process *proc, arch_addr_t *addr, Elf64_Dyn *ret)
Petr Machata6a7997d2012-03-29 18:37:15 +0200292{
293 if (umovebytes(proc, *addr, ret, sizeof(*ret)) != sizeof(*ret))
294 return -1;
295 *addr += sizeof(*ret);
296 return 0;
297}
298
299static int
Petr Machatabac2da52012-05-29 00:42:59 +0200300fetch_dyn32(struct Process *proc, arch_addr_t *addr, Elf64_Dyn *ret)
Petr Machata6a7997d2012-03-29 18:37:15 +0200301{
302 Elf32_Dyn dyn;
303 if (umovebytes(proc, *addr, &dyn, sizeof(dyn)) != sizeof(dyn))
304 return -1;
305
306 *addr += sizeof(dyn);
307 ret->d_tag = dyn.d_tag;
308 ret->d_un.d_val = dyn.d_un.d_val;
309
310 return 0;
311}
312
313static int (*
314dyn_fetcher(struct Process *proc))(struct Process *,
Petr Machatabac2da52012-05-29 00:42:59 +0200315 arch_addr_t *, Elf64_Dyn *)
Petr Machata6a7997d2012-03-29 18:37:15 +0200316{
317 return select_32_64(proc, fetch_dyn32, fetch_dyn64);
318}
319
Edgar E. Iglesiascc77b0e2012-10-09 12:15:20 +0200320int
321proc_find_dynamic_entry_addr(struct Process *proc, arch_addr_t src_addr,
322 int d_tag, arch_addr_t *ret)
Petr Machata6a7997d2012-03-29 18:37:15 +0200323{
Joe Damato47cae1e2010-11-08 15:47:39 -0800324 debug(DEBUG_FUNCTION, "find_dynamic_entry()");
325
Edgar E. Iglesiasfd4b4ef2012-10-09 12:21:17 +0200326 if (ret == NULL || src_addr == 0 || d_tag < 0)
Joe Damato47cae1e2010-11-08 15:47:39 -0800327 return -1;
Joe Damato47cae1e2010-11-08 15:47:39 -0800328
Petr Machata6a7997d2012-03-29 18:37:15 +0200329 int i = 0;
330 while (1) {
331 Elf64_Dyn entry;
332 if (dyn_fetcher(proc)(proc, &src_addr, &entry) < 0
333 || entry.d_tag == DT_NULL
334 || i++ > 100) { /* Arbitrary cut-off so that we
335 * don't loop forever if the
336 * binary is corrupted. */
337 debug(2, "Couldn't find address for dtag!");
338 return -1;
339 }
340
Joe Damato47cae1e2010-11-08 15:47:39 -0800341 if (entry.d_tag == d_tag) {
Petr Machataea8eb9a2012-04-17 01:32:07 +0200342 /* XXX The double cast should be removed when
Petr Machatabac2da52012-05-29 00:42:59 +0200343 * arch_addr_t becomes integral type. */
344 *ret = (arch_addr_t)(uintptr_t)entry.d_un.d_val;
Petr Machata8454bd72012-04-17 17:12:44 +0200345 debug(2, "found address: %p in dtag %d", *ret, d_tag);
Petr Machata17476b72012-02-23 18:50:37 +0100346 return 0;
Joe Damato47cae1e2010-11-08 15:47:39 -0800347 }
Petr Machata6a7997d2012-03-29 18:37:15 +0200348 }
349}
350
351/* Our own type for representing 32-bit linkmap. We can't rely on the
352 * definition in link.h, because that's only accurate for our host
353 * architecture, not for target architecture (where the traced process
354 * runs). */
355#define LT_LINK_MAP(BITS) \
356 { \
357 Elf##BITS##_Addr l_addr; \
358 Elf##BITS##_Addr l_name; \
359 Elf##BITS##_Addr l_ld; \
360 Elf##BITS##_Addr l_next; \
361 Elf##BITS##_Addr l_prev; \
362 }
363struct lt_link_map_32 LT_LINK_MAP(32);
364struct lt_link_map_64 LT_LINK_MAP(64);
365
366static int
Petr Machatabac2da52012-05-29 00:42:59 +0200367fetch_lm64(struct Process *proc, arch_addr_t addr,
Petr Machata6a7997d2012-03-29 18:37:15 +0200368 struct lt_link_map_64 *ret)
369{
370 if (umovebytes(proc, addr, ret, sizeof(*ret)) != sizeof(*ret))
371 return -1;
372 return 0;
373}
374
375static int
Petr Machatabac2da52012-05-29 00:42:59 +0200376fetch_lm32(struct Process *proc, arch_addr_t addr,
Petr Machata6a7997d2012-03-29 18:37:15 +0200377 struct lt_link_map_64 *ret)
378{
379 struct lt_link_map_32 lm;
380 if (umovebytes(proc, addr, &lm, sizeof(lm)) != sizeof(lm))
381 return -1;
382
383 ret->l_addr = lm.l_addr;
384 ret->l_name = lm.l_name;
385 ret->l_ld = lm.l_ld;
386 ret->l_next = lm.l_next;
387 ret->l_prev = lm.l_prev;
388
389 return 0;
390}
391
392static int (*
393lm_fetcher(struct Process *proc))(struct Process *,
Petr Machatabac2da52012-05-29 00:42:59 +0200394 arch_addr_t, struct lt_link_map_64 *)
Petr Machata6a7997d2012-03-29 18:37:15 +0200395{
396 return select_32_64(proc, fetch_lm32, fetch_lm64);
397}
398
399/* The same as above holds for struct r_debug. */
400#define LT_R_DEBUG(BITS) \
401 { \
402 int r_version; \
403 Elf##BITS##_Addr r_map; \
404 Elf##BITS##_Addr r_brk; \
405 int r_state; \
406 Elf##BITS##_Addr r_ldbase; \
Joe Damato47cae1e2010-11-08 15:47:39 -0800407 }
408
Petr Machata6a7997d2012-03-29 18:37:15 +0200409struct lt_r_debug_32 LT_R_DEBUG(32);
410struct lt_r_debug_64 LT_R_DEBUG(64);
411
412static int
Petr Machatabac2da52012-05-29 00:42:59 +0200413fetch_rd64(struct Process *proc, arch_addr_t addr,
Petr Machata6a7997d2012-03-29 18:37:15 +0200414 struct lt_r_debug_64 *ret)
415{
416 if (umovebytes(proc, addr, ret, sizeof(*ret)) != sizeof(*ret))
417 return -1;
418 return 0;
419}
420
421static int
Petr Machatabac2da52012-05-29 00:42:59 +0200422fetch_rd32(struct Process *proc, arch_addr_t addr,
Petr Machata6a7997d2012-03-29 18:37:15 +0200423 struct lt_r_debug_64 *ret)
424{
425 struct lt_r_debug_32 rd;
426 if (umovebytes(proc, addr, &rd, sizeof(rd)) != sizeof(rd))
427 return -1;
428
429 ret->r_version = rd.r_version;
430 ret->r_map = rd.r_map;
431 ret->r_brk = rd.r_brk;
432 ret->r_state = rd.r_state;
433 ret->r_ldbase = rd.r_ldbase;
434
435 return 0;
436}
437
438static int (*
439rdebug_fetcher(struct Process *proc))(struct Process *,
Petr Machatabac2da52012-05-29 00:42:59 +0200440 arch_addr_t, struct lt_r_debug_64 *)
Petr Machata6a7997d2012-03-29 18:37:15 +0200441{
442 return select_32_64(proc, fetch_rd32, fetch_rd64);
Joe Damato47cae1e2010-11-08 15:47:39 -0800443}
Joe Damatof0bd98b2010-11-08 15:47:42 -0800444
Petr Machata0475ac32012-10-18 15:37:04 +0200445static int
446fetch_auxv64_entry(int fd, Elf64_auxv_t *ret)
447{
448 /* Reaching EOF is as much problem as not reading whole
449 * entry. */
450 return read(fd, ret, sizeof(*ret)) == sizeof(*ret) ? 0 : -1;
451}
452
453static int
454fetch_auxv32_entry(int fd, Elf64_auxv_t *ret)
455{
456 Elf32_auxv_t auxv;
457 if (read(fd, &auxv, sizeof(auxv)) != sizeof(auxv))
458 return -1;
459
460 ret->a_type = auxv.a_type;
461 ret->a_un.a_val = auxv.a_un.a_val;
462 return 0;
463}
464
465static int (*
466auxv_fetcher(struct Process *proc))(int, Elf64_auxv_t *)
467{
468 return select_32_64(proc, fetch_auxv32_entry, fetch_auxv64_entry);
469}
470
Joe Damatof0bd98b2010-11-08 15:47:42 -0800471static void
Petr Machata6a7997d2012-03-29 18:37:15 +0200472crawl_linkmap(struct Process *proc, struct lt_r_debug_64 *dbg)
Petr Machata2b46cfc2012-02-18 11:17:29 +0100473{
Joe Damatof0bd98b2010-11-08 15:47:42 -0800474 debug (DEBUG_FUNCTION, "crawl_linkmap()");
475
476 if (!dbg || !dbg->r_map) {
477 debug(2, "Debug structure or it's linkmap are NULL!");
478 return;
479 }
480
Petr Machataea8eb9a2012-04-17 01:32:07 +0200481 /* XXX The double cast should be removed when
Petr Machatabac2da52012-05-29 00:42:59 +0200482 * arch_addr_t becomes integral type. */
483 arch_addr_t addr = (arch_addr_t)(uintptr_t)dbg->r_map;
Joe Damatof0bd98b2010-11-08 15:47:42 -0800484
Petr Machata6a7997d2012-03-29 18:37:15 +0200485 while (addr != 0) {
486 struct lt_link_map_64 rlm;
487 if (lm_fetcher(proc)(proc, addr, &rlm) < 0) {
Petr Machata74d80542012-04-03 12:40:59 +0200488 debug(2, "Unable to read link map");
Joe Damatof0bd98b2010-11-08 15:47:42 -0800489 return;
490 }
491
Petr Machatabac2da52012-05-29 00:42:59 +0200492 arch_addr_t key = addr;
Petr Machataea8eb9a2012-04-17 01:32:07 +0200493 /* XXX The double cast should be removed when
Petr Machatabac2da52012-05-29 00:42:59 +0200494 * arch_addr_t becomes integral type. */
495 addr = (arch_addr_t)(uintptr_t)rlm.l_next;
Petr Machata6a7997d2012-03-29 18:37:15 +0200496 if (rlm.l_name == 0) {
Petr Machata74d80542012-04-03 12:40:59 +0200497 debug(2, "Name of mapped library is NULL");
Joe Damatof0bd98b2010-11-08 15:47:42 -0800498 return;
499 }
500
Petr Machata6a7997d2012-03-29 18:37:15 +0200501 char lib_name[BUFSIZ];
Petr Machataea8eb9a2012-04-17 01:32:07 +0200502 /* XXX The double cast should be removed when
Petr Machatabac2da52012-05-29 00:42:59 +0200503 * arch_addr_t becomes integral type. */
504 umovebytes(proc, (arch_addr_t)(uintptr_t)rlm.l_name,
Petr Machata6a7997d2012-03-29 18:37:15 +0200505 lib_name, sizeof(lib_name));
Joe Damatof0bd98b2010-11-08 15:47:42 -0800506
Petr Machata2b46cfc2012-02-18 11:17:29 +0100507 if (*lib_name == '\0') {
508 /* VDSO. No associated file, XXX but we might
509 * load it from the address space of the
510 * process. */
Joe Damatof0bd98b2010-11-08 15:47:42 -0800511 continue;
512 }
513
Petr Machata89ac0392012-04-03 02:30:48 +0200514 /* Do we have that library already? */
515 if (proc_each_library(proc, NULL, library_with_key_cb, &key))
516 continue;
517
Petr Machatab5f80ac2012-04-04 01:46:18 +0200518 struct library *lib = malloc(sizeof(*lib));
Petr Machata2b46cfc2012-02-18 11:17:29 +0100519 if (lib == NULL) {
Petr Machatab5f80ac2012-04-04 01:46:18 +0200520 fail:
521 if (lib != NULL)
522 library_destroy(lib);
Petr Machatacc0e1e42012-04-25 13:42:07 +0200523 fprintf(stderr, "Couldn't load ELF object %s: %s\n",
524 lib_name, strerror(errno));
Petr Machata2b46cfc2012-02-18 11:17:29 +0100525 continue;
Joe Damatof0bd98b2010-11-08 15:47:42 -0800526 }
Petr Machatab5f80ac2012-04-04 01:46:18 +0200527 library_init(lib, LT_LIBTYPE_DSO);
528
529 if (ltelf_read_library(lib, proc, lib_name, rlm.l_addr) < 0)
530 goto fail;
531
Petr Machata89ac0392012-04-03 02:30:48 +0200532 lib->key = key;
Petr Machata2b46cfc2012-02-18 11:17:29 +0100533 proc_add_library(proc, lib);
Joe Damatof0bd98b2010-11-08 15:47:42 -0800534 }
535 return;
536}
537
Petr Machata6a7997d2012-03-29 18:37:15 +0200538static int
539load_debug_struct(struct Process *proc, struct lt_r_debug_64 *ret)
540{
Joe Damatof0bd98b2010-11-08 15:47:42 -0800541 debug(DEBUG_FUNCTION, "load_debug_struct");
542
Petr Machata47d70f62012-10-26 23:43:51 +0200543 if (rdebug_fetcher(proc)(proc, proc->os.debug_addr, ret) < 0) {
Joe Damatof0bd98b2010-11-08 15:47:42 -0800544 debug(2, "This process does not have a debug structure!\n");
Petr Machata6a7997d2012-03-29 18:37:15 +0200545 return -1;
Joe Damatof0bd98b2010-11-08 15:47:42 -0800546 }
547
Petr Machata6a7997d2012-03-29 18:37:15 +0200548 return 0;
Joe Damatof0bd98b2010-11-08 15:47:42 -0800549}
550
551static void
Petr Machata12affff2012-03-29 18:33:03 +0200552rdebug_bp_on_hit(struct breakpoint *bp, struct Process *proc)
Petr Machata2b46cfc2012-02-18 11:17:29 +0100553{
Joe Damatof0bd98b2010-11-08 15:47:42 -0800554 debug(DEBUG_FUNCTION, "arch_check_dbg");
555
Petr Machata6a7997d2012-03-29 18:37:15 +0200556 struct lt_r_debug_64 rdbg;
557 if (load_debug_struct(proc, &rdbg) < 0) {
Joe Damatof0bd98b2010-11-08 15:47:42 -0800558 debug(2, "Unable to load debug structure!");
559 return;
560 }
561
Petr Machata6a7997d2012-03-29 18:37:15 +0200562 if (rdbg.r_state == RT_CONSISTENT) {
Joe Damatof0bd98b2010-11-08 15:47:42 -0800563 debug(2, "Linkmap is now consistent");
Petr Machata47d70f62012-10-26 23:43:51 +0200564 switch (proc->os.debug_state) {
565 case RT_ADD:
Joe Damatof0bd98b2010-11-08 15:47:42 -0800566 debug(2, "Adding DSO to linkmap");
Petr Machata6a7997d2012-03-29 18:37:15 +0200567 crawl_linkmap(proc, &rdbg);
Petr Machata47d70f62012-10-26 23:43:51 +0200568 break;
569 case RT_DELETE:
Joe Damatof0bd98b2010-11-08 15:47:42 -0800570 debug(2, "Removing DSO from linkmap");
Petr Machata47d70f62012-10-26 23:43:51 +0200571 // XXX unload that library
572 break;
573 default:
Joe Damatof0bd98b2010-11-08 15:47:42 -0800574 debug(2, "Unexpected debug state!");
575 }
576 }
577
Petr Machata47d70f62012-10-26 23:43:51 +0200578 proc->os.debug_state = rdbg.r_state;
Joe Damatof0bd98b2010-11-08 15:47:42 -0800579}
580
Edgar E. Iglesias11c3c3e2012-10-09 12:16:52 +0200581#ifndef ARCH_HAVE_FIND_DL_DEBUG
582int
583arch_find_dl_debug(struct Process *proc, arch_addr_t dyn_addr,
584 arch_addr_t *ret)
585{
586 return proc_find_dynamic_entry_addr(proc, dyn_addr, DT_DEBUG, ret);
587}
588#endif
589
Joe Damatof0bd98b2010-11-08 15:47:42 -0800590int
Petr Machatabac2da52012-05-29 00:42:59 +0200591linkmap_init(struct Process *proc, arch_addr_t dyn_addr)
Petr Machata2b46cfc2012-02-18 11:17:29 +0100592{
Petr Machatab8fd68d2012-10-18 18:54:27 +0200593 debug(DEBUG_FUNCTION, "linkmap_init(%d, dyn_addr=%p)", proc->pid, dyn_addr);
Joe Damatof0bd98b2010-11-08 15:47:42 -0800594
Petr Machata47d70f62012-10-26 23:43:51 +0200595 if (arch_find_dl_debug(proc, dyn_addr, &proc->os.debug_addr) == -1) {
Petr Machata029171f2012-04-05 02:14:30 +0200596 debug(2, "Couldn't find debug structure!");
Petr Machata47d70f62012-10-26 23:43:51 +0200597 return -1;
Petr Machata029171f2012-04-05 02:14:30 +0200598 }
Joe Damatof0bd98b2010-11-08 15:47:42 -0800599
Petr Machata6a7997d2012-03-29 18:37:15 +0200600 int status;
601 struct lt_r_debug_64 rdbg;
602 if ((status = load_debug_struct(proc, &rdbg)) < 0) {
Joe Damatof0bd98b2010-11-08 15:47:42 -0800603 debug(2, "No debug structure or no memory to allocate one!");
Petr Machata6a7997d2012-03-29 18:37:15 +0200604 return status;
Joe Damatof0bd98b2010-11-08 15:47:42 -0800605 }
606
Petr Machataea8eb9a2012-04-17 01:32:07 +0200607 /* XXX The double cast should be removed when
Petr Machatabac2da52012-05-29 00:42:59 +0200608 * arch_addr_t becomes integral type. */
609 arch_addr_t addr = (arch_addr_t)(uintptr_t)rdbg.r_brk;
Petr Machatab1492df2012-04-30 21:01:40 +0200610 if (arch_translate_address_dyn(proc, addr, &addr) < 0)
Petr Machata47d70f62012-10-26 23:43:51 +0200611 return -1;
Petr Machata89ac0392012-04-03 02:30:48 +0200612
Petr Machata9df15012012-02-20 12:49:46 +0100613 struct breakpoint *rdebug_bp = insert_breakpoint(proc, addr, NULL);
Petr Machata2b46cfc2012-02-18 11:17:29 +0100614 static struct bp_callbacks rdebug_callbacks = {
Petr Machata12affff2012-03-29 18:33:03 +0200615 .on_hit = rdebug_bp_on_hit,
Petr Machata2b46cfc2012-02-18 11:17:29 +0100616 };
617 rdebug_bp->cbs = &rdebug_callbacks;
Joe Damatof0bd98b2010-11-08 15:47:42 -0800618
Petr Machata6a7997d2012-03-29 18:37:15 +0200619 crawl_linkmap(proc, &rdbg);
Joe Damatof0bd98b2010-11-08 15:47:42 -0800620
Joe Damatof0bd98b2010-11-08 15:47:42 -0800621 return 0;
622}
Petr Machata9a5420c2011-07-09 11:21:23 +0200623
624int
625task_kill (pid_t pid, int sig)
626{
627 // Taken from GDB
628 int ret;
629
630 errno = 0;
631 ret = syscall (__NR_tkill, pid, sig);
632 return ret;
633}
Petr Machatacd972582012-01-07 03:02:07 +0100634
635void
636process_removed(struct Process *proc)
637{
638 delete_events_for(proc);
639}
Petr Machata0475ac32012-10-18 15:37:04 +0200640
641int
642process_get_entry(struct Process *proc,
643 arch_addr_t *entryp,
644 arch_addr_t *interp_biasp)
645{
646 PROC_PID_FILE(fn, "/proc/%d/auxv", proc->pid);
647 int fd = open(fn, O_RDONLY);
648 if (fd == -1) {
649 fail:
650 fprintf(stderr, "couldn't read %s: %s", fn, strerror(errno));
651 done:
652 if (fd != -1)
653 close(fd);
654 return fd == -1 ? -1 : 0;
655 }
656
657 arch_addr_t at_entry = 0;
658 arch_addr_t at_bias = 0;
659 while (1) {
660 Elf64_auxv_t entry;
661 if (auxv_fetcher(proc)(fd, &entry) < 0)
662 goto fail;
663
664 switch (entry.a_type) {
665 case AT_BASE:
666 /* XXX The double cast should be removed when
667 * arch_addr_t becomes integral type. */
668 at_bias = (arch_addr_t)(uintptr_t)entry.a_un.a_val;
669 continue;
670
671 case AT_ENTRY:
672 /* XXX The double cast should be removed when
673 * arch_addr_t becomes integral type. */
674 at_entry = (arch_addr_t)(uintptr_t)entry.a_un.a_val;
675 default:
676 continue;
677
678 case AT_NULL:
679 break;
680 }
681 break;
682 }
683
684 if (entryp != NULL)
685 *entryp = at_entry;
686 if (interp_biasp != NULL)
687 *interp_biasp = at_bias;
688 goto done;
689}
Petr Machata47d70f62012-10-26 23:43:51 +0200690
691int
692os_process_init(struct Process *proc)
693{
694 proc->os.debug_addr = 0;
695 proc->os.debug_state = 0;
696 return 0;
697}
698
699void
700os_process_destroy(struct Process *proc)
701{
702}
703
704int
705os_process_clone(struct Process *retp, struct Process *proc)
706{
707 retp->os = proc->os;
708 return 0;
709}
710
711int
712os_process_exec(struct Process *proc)
713{
714 return 0;
715}