1 // SPDX-License-Identifier: GPL-2.0
7 #include <linux/string.h>
8 #include <linux/zalloc.h>
9 #include <uapi/linux/mman.h> /* To get things like MAP_HUGETLB even on older libc headers */
13 #include "namespaces.h"
19 static inline int is_android_lib(const char *filename
)
21 return strstarts(filename
, "/data/app-lib/") ||
22 strstarts(filename
, "/system/lib/");
25 static inline bool replace_android_lib(const char *filename
, char *newfilename
)
29 size_t app_abi_length
, new_length
;
30 size_t lib_length
= 0;
32 libname
= strrchr(filename
, '/');
34 lib_length
= strlen(libname
);
36 app_abi
= getenv("APP_ABI");
40 app_abi_length
= strlen(app_abi
);
42 if (strstarts(filename
, "/data/app-lib/")) {
48 new_length
= 7 + app_abi_length
+ lib_length
;
50 apk_path
= getenv("APK_PATH");
52 new_length
+= strlen(apk_path
) + 1;
53 if (new_length
> PATH_MAX
)
55 snprintf(newfilename
, new_length
,
56 "%s/libs/%s/%s", apk_path
, app_abi
, libname
);
58 if (new_length
> PATH_MAX
)
60 snprintf(newfilename
, new_length
,
61 "libs/%s/%s", app_abi
, libname
);
66 if (strstarts(filename
, "/system/lib/")) {
69 int ndk_length
, app_length
;
71 ndk
= getenv("NDK_ROOT");
72 app
= getenv("APP_PLATFORM");
77 ndk_length
= strlen(ndk
);
78 app_length
= strlen(app
);
80 if (!(ndk_length
&& app_length
&& app_abi_length
))
83 arch
= !strncmp(app_abi
, "arm", 3) ? "arm" :
84 !strncmp(app_abi
, "mips", 4) ? "mips" :
85 !strncmp(app_abi
, "x86", 3) ? "x86" : NULL
;
90 new_length
= 27 + ndk_length
+
91 app_length
+ lib_length
94 if (new_length
> PATH_MAX
)
96 snprintf(newfilename
, new_length
,
97 "%.*s/platforms/%.*s/arch-%s/usr/lib/%s",
98 ndk_length
, ndk
, app_length
, app
, arch
, libname
);
105 static void map__init(struct map
*map
, u64 start
, u64 end
, u64 pgoff
,
106 struct dso
*dso
, u32 prot
, u32 flags
)
108 map__set_start(map
, start
);
109 map__set_end(map
, end
);
110 map__set_pgoff(map
, pgoff
);
111 assert(map__reloc(map
) == 0);
112 map__set_dso(map
, dso__get(dso
));
113 refcount_set(map__refcnt(map
), 1);
114 RC_CHK_ACCESS(map
)->prot
= prot
;
115 RC_CHK_ACCESS(map
)->flags
= flags
;
116 map__set_mapping_type(map
, MAPPING_TYPE__DSO
);
117 assert(map__erange_warned(map
) == false);
118 assert(map__priv(map
) == false);
119 assert(map__hit(map
) == false);
122 struct map
*map__new(struct machine
*machine
, u64 start
, u64 len
,
123 u64 pgoff
, struct dso_id
*id
,
124 u32 prot
, u32 flags
, struct build_id
*bid
,
125 char *filename
, struct thread
*thread
)
129 struct nsinfo
*nsi
= NULL
;
132 map
= zalloc(sizeof(*map
));
133 if (ADD_RC_CHK(result
, map
)) {
134 char newfilename
[PATH_MAX
];
135 struct dso
*dso
, *header_bid_dso
;
136 int anon
, no_dso
, vdso
, android
;
138 android
= is_android_lib(filename
);
139 anon
= is_anon_memory(filename
) || flags
& MAP_HUGETLB
;
140 vdso
= is_vdso_map(filename
);
141 no_dso
= is_no_dso_memory(filename
);
142 nsi
= nsinfo__get(thread__nsinfo(thread
));
144 if ((anon
|| no_dso
) && nsi
&& (prot
& PROT_EXEC
)) {
145 snprintf(newfilename
, sizeof(newfilename
),
146 "/tmp/perf-%d.map", nsinfo__pid(nsi
));
147 filename
= newfilename
;
151 if (replace_android_lib(filename
, newfilename
))
152 filename
= newfilename
;
156 /* The vdso maps are always on the host and not the
157 * container. Ensure that we don't use setns to look
160 nnsi
= nsinfo__copy(nsi
);
163 nsinfo__clear_need_setns(nnsi
);
167 dso
= machine__findnew_vdso(machine
, thread
);
169 dso
= machine__findnew_dso_id(machine
, filename
, id
);
174 assert(!dso__kernel(dso
));
175 map__init(result
, start
, start
+ len
, pgoff
, dso
, prot
, flags
);
177 if (anon
|| no_dso
) {
178 map
->mapping_type
= MAPPING_TYPE__IDENTITY
;
181 * Set memory without DSO as loaded. All map__find_*
182 * functions still return NULL, and we avoid the
183 * unnecessary map__load warning.
185 if (!(prot
& PROT_EXEC
))
186 dso__set_loaded(dso
);
188 mutex_lock(dso__lock(dso
));
189 dso__set_nsinfo(dso
, nsi
);
190 mutex_unlock(dso__lock(dso
));
192 if (build_id__is_defined(bid
)) {
193 dso__set_build_id(dso
, bid
);
196 * If the mmap event had no build ID, search for an existing dso from the
197 * build ID header by name. Otherwise only the dso loaded at the time of
198 * reading the header will have the build ID set and all future mmaps will
201 header_bid_dso
= dsos__find(&machine
->dsos
, filename
, false);
202 if (header_bid_dso
&& dso__header_build_id(header_bid_dso
)) {
203 dso__set_build_id(dso
, dso__bid(header_bid_dso
));
204 dso__set_header_build_id(dso
, 1);
206 dso__put(header_bid_dso
);
218 * Constructor variant for modules (where we know from /proc/modules where
219 * they are loaded) and for vmlinux, where only after we load all the
220 * symbols we'll know where it starts and ends.
222 struct map
*map__new2(u64 start
, struct dso
*dso
)
227 map
= calloc(1, sizeof(*map
) + (dso__kernel(dso
) ? sizeof(struct kmap
) : 0));
228 if (ADD_RC_CHK(result
, map
)) {
229 /* ->end will be filled after we load all the symbols. */
230 map__init(result
, start
, /*end=*/0, /*pgoff=*/0, dso
, /*prot=*/0, /*flags=*/0);
236 bool __map__is_kernel(const struct map
*map
)
238 if (!dso__kernel(map__dso(map
)))
240 return machine__kernel_map(maps__machine(map__kmaps((struct map
*)map
))) == map
;
243 bool __map__is_extra_kernel_map(const struct map
*map
)
245 struct kmap
*kmap
= __map__kmap((struct map
*)map
);
247 return kmap
&& kmap
->name
[0];
250 bool __map__is_bpf_prog(const struct map
*map
)
253 struct dso
*dso
= map__dso(map
);
255 if (dso__binary_type(dso
) == DSO_BINARY_TYPE__BPF_PROG_INFO
)
259 * If PERF_RECORD_BPF_EVENT is not included, the dso will not have
260 * type of DSO_BINARY_TYPE__BPF_PROG_INFO. In such cases, we can
261 * guess the type based on name.
263 name
= dso__short_name(dso
);
264 return name
&& (strstr(name
, "bpf_prog_") == name
);
267 bool __map__is_bpf_image(const struct map
*map
)
270 struct dso
*dso
= map__dso(map
);
272 if (dso__binary_type(dso
) == DSO_BINARY_TYPE__BPF_IMAGE
)
276 * If PERF_RECORD_KSYMBOL is not included, the dso will not have
277 * type of DSO_BINARY_TYPE__BPF_IMAGE. In such cases, we can
278 * guess the type based on name.
280 name
= dso__short_name(dso
);
281 return name
&& is_bpf_image(name
);
284 bool __map__is_ool(const struct map
*map
)
286 const struct dso
*dso
= map__dso(map
);
288 return dso
&& dso__binary_type(dso
) == DSO_BINARY_TYPE__OOL
;
291 bool map__has_symbols(const struct map
*map
)
293 return dso__has_symbols(map__dso(map
));
296 static void map__exit(struct map
*map
)
298 BUG_ON(refcount_read(map__refcnt(map
)) != 0);
299 dso__zput(RC_CHK_ACCESS(map
)->dso
);
302 void map__delete(struct map
*map
)
308 void map__put(struct map
*map
)
310 if (map
&& refcount_dec_and_test(map__refcnt(map
)))
316 void map__fixup_start(struct map
*map
)
318 struct dso
*dso
= map__dso(map
);
319 struct rb_root_cached
*symbols
= dso__symbols(dso
);
320 struct rb_node
*nd
= rb_first_cached(symbols
);
323 struct symbol
*sym
= rb_entry(nd
, struct symbol
, rb_node
);
325 map__set_start(map
, sym
->start
);
329 void map__fixup_end(struct map
*map
)
331 struct dso
*dso
= map__dso(map
);
332 struct rb_root_cached
*symbols
= dso__symbols(dso
);
333 struct rb_node
*nd
= rb_last(&symbols
->rb_root
);
336 struct symbol
*sym
= rb_entry(nd
, struct symbol
, rb_node
);
337 map__set_end(map
, sym
->end
);
341 #define DSO__DELETED "(deleted)"
343 int map__load(struct map
*map
)
345 struct dso
*dso
= map__dso(map
);
346 const char *name
= dso__long_name(dso
);
349 if (dso__loaded(dso
))
352 nr
= dso__load(dso
, map
);
354 if (dso__has_build_id(dso
)) {
355 char sbuild_id
[SBUILD_ID_SIZE
];
357 build_id__sprintf(dso__bid(dso
), sbuild_id
);
358 pr_debug("%s with build id %s not found", name
, sbuild_id
);
360 pr_debug("Failed to open %s", name
);
362 pr_debug(", continuing without symbols\n");
364 } else if (nr
== 0) {
365 #ifdef HAVE_LIBELF_SUPPORT
366 const size_t len
= strlen(name
);
367 const size_t real_len
= len
- sizeof(DSO__DELETED
);
369 if (len
> sizeof(DSO__DELETED
) &&
370 strcmp(name
+ real_len
+ 1, DSO__DELETED
) == 0) {
371 pr_debug("%.*s was updated (is prelink enabled?). "
372 "Restart the long running apps that use it!\n",
373 (int)real_len
, name
);
375 pr_debug("no symbols found in %s, maybe install a debug package?\n", name
);
384 struct symbol
*map__find_symbol(struct map
*map
, u64 addr
)
386 if (map__load(map
) < 0)
389 return dso__find_symbol(map__dso(map
), addr
);
392 struct symbol
*map__find_symbol_by_name_idx(struct map
*map
, const char *name
, size_t *idx
)
396 if (map__load(map
) < 0)
400 dso__sort_by_name(dso
);
402 return dso__find_symbol_by_name(dso
, name
, idx
);
405 struct symbol
*map__find_symbol_by_name(struct map
*map
, const char *name
)
409 return map__find_symbol_by_name_idx(map
, name
, &idx
);
412 struct map
*map__clone(struct map
*from
)
416 size_t size
= sizeof(RC_STRUCT(map
));
417 struct dso
*dso
= map__dso(from
);
419 if (dso
&& dso__kernel(dso
))
420 size
+= sizeof(struct kmap
);
422 map
= memdup(RC_CHK_ACCESS(from
), size
);
423 if (ADD_RC_CHK(result
, map
)) {
424 refcount_set(&map
->refcnt
, 1);
425 map
->dso
= dso__get(dso
);
431 size_t map__fprintf(struct map
*map
, FILE *fp
)
433 const struct dso
*dso
= map__dso(map
);
435 return fprintf(fp
, " %" PRIx64
"-%" PRIx64
" %" PRIx64
" %s\n",
436 map__start(map
), map__end(map
), map__pgoff(map
), dso__name(dso
));
439 static bool prefer_dso_long_name(const struct dso
*dso
, bool print_off
)
441 return dso__long_name(dso
) &&
442 (symbol_conf
.show_kernel_path
||
443 (print_off
&& (dso__name(dso
)[0] == '[' || dso__is_kcore(dso
))));
446 static size_t __map__fprintf_dsoname(struct map
*map
, bool print_off
, FILE *fp
)
448 char buf
[symbol_conf
.pad_output_len_dso
+ 1];
449 const char *dsoname
= "[unknown]";
450 const struct dso
*dso
= map
? map__dso(map
) : NULL
;
453 if (prefer_dso_long_name(dso
, print_off
))
454 dsoname
= dso__long_name(dso
);
456 dsoname
= dso__name(dso
);
459 if (symbol_conf
.pad_output_len_dso
) {
460 scnprintf_pad(buf
, symbol_conf
.pad_output_len_dso
, "%s", dsoname
);
464 return fprintf(fp
, "%s", dsoname
);
467 size_t map__fprintf_dsoname(struct map
*map
, FILE *fp
)
469 return __map__fprintf_dsoname(map
, false, fp
);
472 size_t map__fprintf_dsoname_dsoff(struct map
*map
, bool print_off
, u64 addr
, FILE *fp
)
474 const struct dso
*dso
= map
? map__dso(map
) : NULL
;
477 if (print_off
&& (!dso
|| !dso__is_object_file(dso
)))
479 printed
+= fprintf(fp
, " (");
480 printed
+= __map__fprintf_dsoname(map
, print_off
, fp
);
482 printed
+= fprintf(fp
, "+0x%" PRIx64
, addr
);
483 printed
+= fprintf(fp
, ")");
488 char *map__srcline(struct map
*map
, u64 addr
, struct symbol
*sym
)
491 return SRCLINE_UNKNOWN
;
493 return get_srcline(map__dso(map
), map__rip_2objdump(map
, addr
), sym
, true, true, addr
);
496 int map__fprintf_srcline(struct map
*map
, u64 addr
, const char *prefix
,
499 const struct dso
*dso
= map
? map__dso(map
) : NULL
;
503 char *srcline
= map__srcline(map
, addr
, NULL
);
504 if (srcline
!= SRCLINE_UNKNOWN
)
505 ret
= fprintf(fp
, "%s%s", prefix
, srcline
);
506 zfree_srcline(&srcline
);
511 void srccode_state_free(struct srccode_state
*state
)
513 zfree(&state
->srcfile
);
518 * map__rip_2objdump - convert symbol start address to objdump address.
520 * @rip: symbol start address
522 * objdump wants/reports absolute IPs for ET_EXEC, and RIPs for ET_DYN.
523 * map->dso->adjust_symbols==1 for ET_EXEC-like cases except ET_REL which is
524 * relative to section start.
526 * Return: Address suitable for passing to "objdump --start-address="
528 u64
map__rip_2objdump(struct map
*map
, u64 rip
)
530 struct kmap
*kmap
= __map__kmap(map
);
531 const struct dso
*dso
= map__dso(map
);
534 * vmlinux does not have program headers for PTI entry trampolines and
535 * kcore may not either. However the trampoline object code is on the
536 * main kernel map, so just use that instead.
538 if (kmap
&& is_entry_trampoline(kmap
->name
) && kmap
->kmaps
) {
539 struct machine
*machine
= maps__machine(kmap
->kmaps
);
542 struct map
*kernel_map
= machine__kernel_map(machine
);
549 if (!dso__adjust_symbols(dso
))
553 return rip
- map__pgoff(map
);
555 if (dso__kernel(dso
) == DSO_SPACE__USER
)
556 return rip
+ dso__text_offset(dso
);
558 return map__unmap_ip(map
, rip
) - map__reloc(map
);
562 * map__objdump_2mem - convert objdump address to a memory address.
564 * @ip: objdump address
566 * Closely related to map__rip_2objdump(), this function takes an address from
567 * objdump and converts it to a memory address. Note this assumes that @map
568 * contains the address. To be sure the result is valid, check it forwards
569 * e.g. map__rip_2objdump(map__map_ip(map, map__objdump_2mem(map, ip))) == ip
571 * Return: Memory address.
573 u64
map__objdump_2mem(struct map
*map
, u64 ip
)
575 const struct dso
*dso
= map__dso(map
);
577 if (!dso__adjust_symbols(dso
))
578 return map__unmap_ip(map
, ip
);
581 return map__unmap_ip(map
, ip
+ map__pgoff(map
));
583 if (dso__kernel(dso
) == DSO_SPACE__USER
)
584 return map__unmap_ip(map
, ip
- dso__text_offset(dso
));
586 return ip
+ map__reloc(map
);
589 /* convert objdump address to relative address. (To be removed) */
590 u64
map__objdump_2rip(struct map
*map
, u64 ip
)
592 const struct dso
*dso
= map__dso(map
);
594 if (!dso__adjust_symbols(dso
))
598 return ip
+ map__pgoff(map
);
600 if (dso__kernel(dso
) == DSO_SPACE__USER
)
601 return ip
- dso__text_offset(dso
);
603 return map__map_ip(map
, ip
+ map__reloc(map
));
606 bool map__contains_symbol(const struct map
*map
, const struct symbol
*sym
)
608 u64 ip
= map__unmap_ip(map
, sym
->start
);
610 return ip
>= map__start(map
) && ip
< map__end(map
);
613 struct kmap
*__map__kmap(struct map
*map
)
615 const struct dso
*dso
= map__dso(map
);
617 if (!dso
|| !dso__kernel(dso
))
619 return (struct kmap
*)(&RC_CHK_ACCESS(map
)[1]);
622 struct kmap
*map__kmap(struct map
*map
)
624 struct kmap
*kmap
= __map__kmap(map
);
627 pr_err("Internal error: map__kmap with a non-kernel map\n");
631 struct maps
*map__kmaps(struct map
*map
)
633 struct kmap
*kmap
= map__kmap(map
);
635 if (!kmap
|| !kmap
->kmaps
) {
636 pr_err("Internal error: map__kmaps with a non-kernel map\n");