packaging: update homepage url
[platform/upstream/elfutils.git] / libdwfl / linux-pid-attach.c
1 /* Get Dwarf Frame state for target live PID process.
2    Copyright (C) 2013, 2014, 2015 Red Hat, Inc.
3    This file is part of elfutils.
4
5    This file is free software; you can redistribute it and/or modify
6    it under the terms of either
7
8      * the GNU Lesser General Public License as published by the Free
9        Software Foundation; either version 3 of the License, or (at
10        your option) any later version
11
12    or
13
14      * the GNU General Public License as published by the Free
15        Software Foundation; either version 2 of the License, or (at
16        your option) any later version
17
18    or both in parallel, as here.
19
20    elfutils is distributed in the hope that it will be useful, but
21    WITHOUT ANY WARRANTY; without even the implied warranty of
22    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23    General Public License for more details.
24
25    You should have received copies of the GNU General Public License and
26    the GNU Lesser General Public License along with this program.  If
27    not, see <http://www.gnu.org/licenses/>.  */
28
29 #include "libelfP.h"
30 #include "libdwflP.h"
31 #include <sys/types.h>
32 #include <sys/stat.h>
33 #include <fcntl.h>
34 #include <sys/ptrace.h>
35 #include <sys/wait.h>
36 #include <dirent.h>
37 #include <sys/syscall.h>
38 #include <unistd.h>
39
40 #ifndef MAX
41 # define MAX(a, b) ((a) > (b) ? (a) : (b))
42 #endif
43
44 #ifdef __linux__
45
46 static bool
47 linux_proc_pid_is_stopped (pid_t pid)
48 {
49   char buffer[64];
50   FILE *procfile;
51   bool retval, have_state;
52
53   snprintf (buffer, sizeof (buffer), "/proc/%ld/status", (long) pid);
54   procfile = fopen (buffer, "r");
55   if (procfile == NULL)
56     return false;
57
58   have_state = false;
59   while (fgets (buffer, sizeof (buffer), procfile) != NULL)
60     if (strncmp (buffer, "State:", 6) == 0)
61       {
62         have_state = true;
63         break;
64       }
65   retval = (have_state && strstr (buffer, "T (stopped)") != NULL);
66   fclose (procfile);
67   return retval;
68 }
69
70 bool
71 internal_function
72 __libdwfl_ptrace_attach (pid_t tid, bool *tid_was_stoppedp)
73 {
74   if (ptrace (PTRACE_ATTACH, tid, NULL, NULL) != 0)
75     {
76       __libdwfl_seterrno (DWFL_E_ERRNO);
77       return false;
78     }
79   *tid_was_stoppedp = linux_proc_pid_is_stopped (tid);
80   if (*tid_was_stoppedp)
81     {
82       /* Make sure there is a SIGSTOP signal pending even when the process is
83          already State: T (stopped).  Older kernels might fail to generate
84          a SIGSTOP notification in that case in response to our PTRACE_ATTACH
85          above.  Which would make the waitpid below wait forever.  So emulate
86          it.  Since there can only be one SIGSTOP notification pending this is
87          safe.  See also gdb/linux-nat.c linux_nat_post_attach_wait.  */
88       syscall (__NR_tkill, tid, SIGSTOP);
89       ptrace (PTRACE_CONT, tid, NULL, NULL);
90     }
91   for (;;)
92     {
93       int status;
94       if (waitpid (tid, &status, __WALL) != tid || !WIFSTOPPED (status))
95         {
96           int saved_errno = errno;
97           ptrace (PTRACE_DETACH, tid, NULL, NULL);
98           errno = saved_errno;
99           __libdwfl_seterrno (DWFL_E_ERRNO);
100           return false;
101         }
102       if (WSTOPSIG (status) == SIGSTOP)
103         break;
104       if (ptrace (PTRACE_CONT, tid, NULL,
105                   (void *) (uintptr_t) WSTOPSIG (status)) != 0)
106         {
107           int saved_errno = errno;
108           ptrace (PTRACE_DETACH, tid, NULL, NULL);
109           errno = saved_errno;
110           __libdwfl_seterrno (DWFL_E_ERRNO);
111           return false;
112         }
113     }
114   return true;
115 }
116
117 static bool
118 pid_memory_read (Dwfl *dwfl, Dwarf_Addr addr, Dwarf_Word *result, void *arg)
119 {
120   struct __libdwfl_pid_arg *pid_arg = arg;
121   pid_t tid = pid_arg->tid_attached;
122   assert (tid > 0);
123   Dwfl_Process *process = dwfl->process;
124   if (ebl_get_elfclass (process->ebl) == ELFCLASS64)
125     {
126 #if SIZEOF_LONG == 8
127       errno = 0;
128       *result = ptrace (PTRACE_PEEKDATA, tid, (void *) (uintptr_t) addr, NULL);
129       return errno == 0;
130 #else /* SIZEOF_LONG != 8 */
131       /* This should not happen.  */
132       return false;
133 #endif /* SIZEOF_LONG != 8 */
134     }
135 #if SIZEOF_LONG == 8
136   /* We do not care about reads unaliged to 4 bytes boundary.
137      But 0x...ffc read of 8 bytes could overrun a page.  */
138   bool lowered = (addr & 4) != 0;
139   if (lowered)
140     addr -= 4;
141 #endif /* SIZEOF_LONG == 8 */
142   errno = 0;
143   *result = ptrace (PTRACE_PEEKDATA, tid, (void *) (uintptr_t) addr, NULL);
144   if (errno != 0)
145     return false;
146 #if SIZEOF_LONG == 8
147 # if BYTE_ORDER == BIG_ENDIAN
148   if (! lowered)
149     *result >>= 32;
150 # else
151   if (lowered)
152     *result >>= 32;
153 # endif
154 #endif /* SIZEOF_LONG == 8 */
155   *result &= 0xffffffff;
156   return true;
157 }
158
159 static pid_t
160 pid_next_thread (Dwfl *dwfl __attribute__ ((unused)), void *dwfl_arg,
161                  void **thread_argp)
162 {
163   struct __libdwfl_pid_arg *pid_arg = dwfl_arg;
164   struct dirent *dirent;
165   /* Start fresh on first traversal. */
166   if (*thread_argp == NULL)
167     rewinddir (pid_arg->dir);
168   do
169     {
170       errno = 0;
171       dirent = readdir (pid_arg->dir);
172       if (dirent == NULL)
173         {
174           if (errno != 0)
175             {
176               __libdwfl_seterrno (DWFL_E_ERRNO);
177               return -1;
178             }
179           return 0;
180         }
181     }
182   while (strcmp (dirent->d_name, ".") == 0
183          || strcmp (dirent->d_name, "..") == 0);
184   char *end;
185   errno = 0;
186   long tidl = strtol (dirent->d_name, &end, 10);
187   if (errno != 0)
188     {
189       __libdwfl_seterrno (DWFL_E_ERRNO);
190       return -1;
191     }
192   pid_t tid = tidl;
193   if (tidl <= 0 || (end && *end) || tid != tidl)
194     {
195       __libdwfl_seterrno (DWFL_E_PARSE_PROC);
196       return -1;
197     }
198   *thread_argp = dwfl_arg;
199   return tid;
200 }
201
202 /* Just checks that the thread id exists.  */
203 static bool
204 pid_getthread (Dwfl *dwfl __attribute__ ((unused)), pid_t tid,
205                void *dwfl_arg, void **thread_argp)
206 {
207   *thread_argp = dwfl_arg;
208   if (kill (tid, 0) < 0)
209     {
210       __libdwfl_seterrno (DWFL_E_ERRNO);
211       return false;
212     }
213   return true;
214 }
215
216 /* Implement the ebl_set_initial_registers_tid setfunc callback.  */
217
218 static bool
219 pid_thread_state_registers_cb (int firstreg, unsigned nregs,
220                                const Dwarf_Word *regs, void *arg)
221 {
222   Dwfl_Thread *thread = (Dwfl_Thread *) arg;
223   if (firstreg < 0)
224     {
225       assert (firstreg == -1);
226       assert (nregs == 1);
227       INTUSE(dwfl_thread_state_register_pc) (thread, *regs);
228       return true;
229     }
230   assert (nregs > 0);
231   return INTUSE(dwfl_thread_state_registers) (thread, firstreg, nregs, regs);
232 }
233
234 static bool
235 pid_set_initial_registers (Dwfl_Thread *thread, void *thread_arg)
236 {
237   struct __libdwfl_pid_arg *pid_arg = thread_arg;
238   assert (pid_arg->tid_attached == 0);
239   pid_t tid = INTUSE(dwfl_thread_tid) (thread);
240   if (! pid_arg->assume_ptrace_stopped
241       && ! __libdwfl_ptrace_attach (tid, &pid_arg->tid_was_stopped))
242     return false;
243   pid_arg->tid_attached = tid;
244   Dwfl_Process *process = thread->process;
245   Ebl *ebl = process->ebl;
246   return ebl_set_initial_registers_tid (ebl, tid,
247                                         pid_thread_state_registers_cb, thread);
248 }
249
250 static void
251 pid_detach (Dwfl *dwfl __attribute__ ((unused)), void *dwfl_arg)
252 {
253   struct __libdwfl_pid_arg *pid_arg = dwfl_arg;
254   elf_end (pid_arg->elf);
255   close (pid_arg->elf_fd);
256   closedir (pid_arg->dir);
257   free (pid_arg);
258 }
259
260 void
261 internal_function
262 __libdwfl_ptrace_detach (pid_t tid, bool tid_was_stopped)
263 {
264   /* This handling is needed only on older Linux kernels such as
265      2.6.32-358.23.2.el6.ppc64.  Later kernels such as
266      3.11.7-200.fc19.x86_64 remember the T (stopped) state
267      themselves and no longer need to pass SIGSTOP during
268      PTRACE_DETACH.  */
269   ptrace (PTRACE_DETACH, tid, NULL,
270           (void *) (intptr_t) (tid_was_stopped ? SIGSTOP : 0));
271 }
272
273 static void
274 pid_thread_detach (Dwfl_Thread *thread, void *thread_arg)
275 {
276   struct __libdwfl_pid_arg *pid_arg = thread_arg;
277   pid_t tid = INTUSE(dwfl_thread_tid) (thread);
278   assert (pid_arg->tid_attached == tid);
279   pid_arg->tid_attached = 0;
280   if (! pid_arg->assume_ptrace_stopped)
281     __libdwfl_ptrace_detach (tid, pid_arg->tid_was_stopped);
282 }
283
284 static const Dwfl_Thread_Callbacks pid_thread_callbacks =
285 {
286   pid_next_thread,
287   pid_getthread,
288   pid_memory_read,
289   pid_set_initial_registers,
290   pid_detach,
291   pid_thread_detach,
292 };
293
294 int
295 dwfl_linux_proc_attach (Dwfl *dwfl, pid_t pid, bool assume_ptrace_stopped)
296 {
297   char buffer[36];
298   FILE *procfile;
299   int err = 0; /* The errno to return and set for dwfl->attcherr.  */
300
301   /* Make sure to report the actual PID (thread group leader) to
302      dwfl_attach_state.  */
303   snprintf (buffer, sizeof (buffer), "/proc/%ld/status", (long) pid);
304   procfile = fopen (buffer, "r");
305   if (procfile == NULL)
306     {
307       err = errno;
308     fail:
309       if (dwfl->process == NULL && dwfl->attacherr == DWFL_E_NOERROR)
310         {
311           errno = err;
312           dwfl->attacherr = __libdwfl_canon_error (DWFL_E_ERRNO);
313         }
314       return err;
315     }
316
317   char *line = NULL;
318   size_t linelen = 0;
319   while (getline (&line, &linelen, procfile) >= 0)
320     if (strncmp (line, "Tgid:", 5) == 0)
321       {
322         errno = 0;
323         char *endptr;
324         long val = strtol (&line[5], &endptr, 10);
325         if ((errno == ERANGE && val == LONG_MAX)
326             || *endptr != '\n' || val < 0 || val != (pid_t) val)
327           pid = 0;
328         else
329           pid = (pid_t) val;
330         break;
331       }
332   free (line);
333   fclose (procfile);
334
335   if (pid == 0)
336     {
337       err = ESRCH;
338       goto fail;
339     }
340
341   char name[64];
342   int i = snprintf (name, sizeof (name), "/proc/%ld/task", (long) pid);
343   assert (i > 0 && i < (ssize_t) sizeof (name) - 1);
344   DIR *dir = opendir (name);
345   if (dir == NULL)
346     {
347       err = errno;
348       goto fail;
349     }
350
351   Elf *elf;
352   i = snprintf (name, sizeof (name), "/proc/%ld/exe", (long) pid);
353   assert (i > 0 && i < (ssize_t) sizeof (name) - 1);
354   int elf_fd = open (name, O_RDONLY);
355   if (elf_fd >= 0)
356     {
357       elf = elf_begin (elf_fd, ELF_C_READ_MMAP, NULL);
358       if (elf == NULL)
359         {
360           /* Just ignore, dwfl_attach_state will fall back to trying
361              to associate the Dwfl with one of the existing DWfl_Module
362              ELF images (to know the machine/class backend to use).  */
363           close (elf_fd);
364           elf_fd = -1;
365         }
366     }
367   else
368     elf = NULL;
369   struct __libdwfl_pid_arg *pid_arg = malloc (sizeof *pid_arg);
370   if (pid_arg == NULL)
371     {
372       elf_end (elf);
373       close (elf_fd);
374       closedir (dir);
375       err = ENOMEM;
376       goto fail;
377     }
378   pid_arg->dir = dir;
379   pid_arg->elf = elf;
380   pid_arg->elf_fd = elf_fd;
381   pid_arg->tid_attached = 0;
382   pid_arg->assume_ptrace_stopped = assume_ptrace_stopped;
383   if (! INTUSE(dwfl_attach_state) (dwfl, elf, pid, &pid_thread_callbacks,
384                                    pid_arg))
385     {
386       elf_end (elf);
387       close (elf_fd);
388       closedir (dir);
389       free (pid_arg);
390       return -1;
391     }
392   return 0;
393 }
394 INTDEF (dwfl_linux_proc_attach)
395
396 struct __libdwfl_pid_arg *
397 internal_function
398 __libdwfl_get_pid_arg (Dwfl *dwfl)
399 {
400   if (dwfl != NULL && dwfl->process != NULL
401       && dwfl->process->callbacks == &pid_thread_callbacks)
402     return (struct __libdwfl_pid_arg *) dwfl->process->callbacks_arg;
403
404   return NULL;
405 }
406
407 #else   /* __linux__ */
408
409 static pid_t
410 pid_next_thread (Dwfl *dwfl __attribute__ ((unused)),
411                  void *dwfl_arg __attribute__ ((unused)),
412                  void **thread_argp __attribute__ ((unused)))
413 {
414   errno = ENOSYS;
415   __libdwfl_seterrno (DWFL_E_ERRNO);
416   return -1;
417 }
418
419 static bool
420 pid_getthread (Dwfl *dwfl __attribute__ ((unused)),
421                pid_t tid __attribute__ ((unused)),
422                void *dwfl_arg __attribute__ ((unused)),
423                void **thread_argp __attribute__ ((unused)))
424 {
425   errno = ENOSYS;
426   __libdwfl_seterrno (DWFL_E_ERRNO);
427   return false;
428 }
429
430 bool
431 internal_function
432 __libdwfl_ptrace_attach (pid_t tid __attribute__ ((unused)),
433                          bool *tid_was_stoppedp __attribute__ ((unused)))
434 {
435   errno = ENOSYS;
436   __libdwfl_seterrno (DWFL_E_ERRNO);
437   return false;
438 }
439
440 static bool
441 pid_memory_read (Dwfl *dwfl __attribute__ ((unused)),
442                  Dwarf_Addr addr __attribute__ ((unused)),
443                  Dwarf_Word *result __attribute__ ((unused)),
444                  void *arg __attribute__ ((unused)))
445 {
446   errno = ENOSYS;
447   __libdwfl_seterrno (DWFL_E_ERRNO);
448   return false;
449 }
450
451 static bool
452 pid_set_initial_registers (Dwfl_Thread *thread __attribute__ ((unused)),
453                            void *thread_arg __attribute__ ((unused)))
454 {
455   errno = ENOSYS;
456   __libdwfl_seterrno (DWFL_E_ERRNO);
457   return false;
458 }
459
460 static void
461 pid_detach (Dwfl *dwfl __attribute__ ((unused)),
462             void *dwfl_arg __attribute__ ((unused)))
463 {
464 }
465
466 void
467 internal_function
468 __libdwfl_ptrace_detach (pid_t tid __attribute__ ((unused)),
469                          bool tid_was_stopped __attribute__ ((unused)))
470 {
471 }
472
473 static void
474 pid_thread_detach (Dwfl_Thread *thread __attribute__ ((unused)),
475                   void *thread_arg __attribute__ ((unused)))
476 {
477 }
478
479 static const Dwfl_Thread_Callbacks pid_thread_callbacks =
480 {
481   pid_next_thread,
482   pid_getthread,
483   pid_memory_read,
484   pid_set_initial_registers,
485   pid_detach,
486   pid_thread_detach,
487 };
488
489 int
490 dwfl_linux_proc_attach (Dwfl *dwfl __attribute__ ((unused)),
491                         pid_t pid __attribute__ ((unused)),
492                         bool assume_ptrace_stopped __attribute__ ((unused)))
493 {
494   return ENOSYS;
495 }
496 INTDEF (dwfl_linux_proc_attach)
497
498 struct __libdwfl_pid_arg *
499 internal_function
500 __libdwfl_get_pid_arg (Dwfl *dwfl __attribute__ ((unused)))
501 {
502   return NULL;
503 }
504
505 #endif /* ! __linux __ */
506