2 * Copyright (C) 2008 Eduard - Gabriel Munteanu
4 * This file is released under GPL version 2.
13 #include <addr2line.h>
16 static int our_pipe
[2], a2l_pipe
[2]; /* "Ownership" defined by who reads. */
17 static int addr2line_running
;
19 int addr2line_init(const char *vmlinux_path
)
25 if (addr2line_running
)
28 if (pipe(our_pipe
) < 0)
30 if (pipe(a2l_pipe
) < 0)
41 sprintf(tmp
, "--exe=%s", vmlinux_path
);
42 exit(execl(ADDR2LINE_PATH
, ADDR2LINE_PATH
,
43 "-i", tmp
, (char *) NULL
));
45 addr2line_running
= 1;
54 void addr2line_exit(void)
60 ssize_t
addr2line_query(void *addr
, char *result
, size_t len
)
66 sprintf(ptr_str
, "%p\n", addr
);
67 ptr_str_len
= strlen(ptr_str
);
68 count
= write(a2l_pipe
[1], ptr_str
, ptr_str_len
);
69 if (count
< ptr_str_len
)
72 count
= read(our_pipe
[0], result
, len
- 1);
73 result
[count
- 1] = '\0'; /* addr2line terminates lines with '\n' */