microfmt
Zero-allocation C++ formatting for constrained environments
Loading...
Searching...
No Matches
dl_symbol_resolver.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2026 Jarosław Pelczar <jarek@jpelczar.com>
2//
3// SPDX-License-Identifier: BSD-2-Clause
4
8#pragma once
9
10#if !defined(__linux__) && !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && \
11 !defined(__DragonFly__)
12#error "microfmt/inspector/dl_symbol_resolver.hpp only supports Linux and BSD systems"
13#endif
14
15#include <cstdint>
16#include <dlfcn.h>
17
18#include "../microfmt.hpp"
19#include "symbol_resolver.hpp"
20
21namespace microfmt::detail {
22
30// decodes raw bytes of a target address space; casts, pointers and offsets are bounded by the explicit lengths checked
31// here.
32RELOCO_BEGIN_UNSAFE_CODE
33inline bool dl_resolve_symbol(uintptr_t addr, raw_resolved_symbol &out_raw) noexcept {
34 if (addr == 0)
35 return false;
36
37 Dl_info info{};
38 // NOLINTNEXTLINE(performance-no-int-to-ptr)
39 if (::dladdr(reinterpret_cast<const void *>(addr), &info) == 0 || info.dli_fbase == nullptr)
40 return false;
41
42 raw_resolved_symbol result{};
43 result.image_name =
44 (info.dli_fname != nullptr && info.dli_fname[0] != '\0') ? string_view(info.dli_fname) : string_view("");
45 result.image_load_base = reinterpret_cast<uintptr_t>(info.dli_fbase);
46
47 if (info.dli_sname != nullptr && info.dli_sname[0] != '\0' && info.dli_saddr != nullptr) {
48 result.symbol_name = string_view(info.dli_sname);
49 result.symbol_base = reinterpret_cast<uintptr_t>(info.dli_saddr);
50 result.is_exact = (result.symbol_base == addr);
51 }
52
53 out_raw = result;
54 return true;
55}
57
58} // namespace microfmt::detail
59
60namespace microfmt {
61
67
78 using context_type = void;
79
80 static bool resolve(uintptr_t addr, span<char>, raw_resolved_symbol &out_raw) noexcept {
81 return detail::dl_resolve_symbol(addr, out_raw);
82 }
83};
84
85} // namespace microfmt
Definition bintime.hpp:22
RELOCO_BEGIN_UNSAFE_CODE bool dl_resolve_symbol(uintptr_t addr, raw_resolved_symbol &out_raw) noexcept
Resolves addr to its nearest preceding symbol/image via dladdr.
Definition dl_symbol_resolver.hpp:33
Definition assert.hpp:19
RELOCO_END_UNSAFE_CODE
Definition remote_object.hpp:132
Tag selecting the dladdr-backed symbol_resolver_traits specialization.
Definition dl_symbol_resolver.hpp:66
Raw resolution result as returned by a resolver backend.
Definition symbol_resolver.hpp:26
microfmt::string_view image_name
Owning image/module name.
Definition symbol_resolver.hpp:43
static bool resolve(uintptr_t addr, span< char >, raw_resolved_symbol &out_raw) noexcept
Definition dl_symbol_resolver.hpp:80
void context_type
Definition dl_symbol_resolver.hpp:78
Static customization point for symbol resolver backends.
Definition symbol_resolver.hpp:120
Type-erased symbol resolution for remote addresses and formattable symbol views.