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