1e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao/* libunwind - a platform-independent unwind library
2e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao   Copyright (C) 2014 The Android Open Source Project
3e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
4e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei LiaoThis file is part of libunwind.
5e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
6e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei LiaoPermission is hereby granted, free of charge, to any person obtaining
7e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaoa copy of this software and associated documentation files (the
8e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao"Software"), to deal in the Software without restriction, including
9e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaowithout limitation the rights to use, copy, modify, merge, publish,
10e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaodistribute, sublicense, and/or sell copies of the Software, and to
11e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaopermit persons to whom the Software is furnished to do so, subject to
12e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaothe following conditions:
13e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
14e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei LiaoThe above copyright notice and this permission notice shall be
15e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaoincluded in all copies or substantial portions of the Software.
16e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
17e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei LiaoTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei LiaoEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei LiaoMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei LiaoNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei LiaoLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei LiaoOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei LiaoWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
24e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
25e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
26e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "libunwind_i.h"
27e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "map_info.h"
28e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao
29e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaoextern int local_get_elf_image (struct elf_image *, unw_word_t,
30e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao                                unsigned long *, unsigned long *,
31                                char **);
32
33PROTECTED int
34tdep_get_elf_image (unw_addr_space_t as, struct elf_image *ei,
35                    pid_t pid, unw_word_t ip,
36                    unsigned long *segbase, unsigned long *mapoff, char **path)
37{
38  struct map_info *map;
39
40  if (pid == getpid())
41    return local_get_elf_image (ei, ip, segbase, mapoff, path);
42
43  map = map_find_from_addr (as->map_list, ip);
44  if (!map)
45    return -UNW_ENOINFO;
46
47  if (elf_map_cached_image (map, ip) < 0)
48    return -UNW_ENOINFO;
49
50  *ei = map->ei;
51  *segbase = map->start;
52  *mapoff = map->offset;
53  if (path != NULL)
54    {
55      *path = strdup (map->path);
56    }
57  return 0;
58}
59