github.com/searKing/golang/go@v1.2.117/os/signal/cgo/include/boost/stacktrace/detail/location_from_symbol.hpp (about)

     1  // Copyright Antony Polukhin, 2016-2023.
     2  //
     3  // Distributed under the Boost Software License, Version 1.0. (See
     4  // accompanying file LICENSE_1_0.txt or copy at
     5  // http://www.boost.org/LICENSE_1_0.txt)
     6  
     7  #ifndef BOOST_STACKTRACE_DETAIL_LOCATION_FROM_SYMBOL_HPP
     8  #define BOOST_STACKTRACE_DETAIL_LOCATION_FROM_SYMBOL_HPP
     9  
    10  #include <boost/config.hpp>
    11  #ifdef BOOST_HAS_PRAGMA_ONCE
    12  #   pragma once
    13  #endif
    14  
    15  #if !defined(BOOST_WINDOWS) && !defined(__CYGWIN__)
    16  #   include <dlfcn.h>
    17  #else
    18  #   include <boost/winapi/dll.hpp>
    19  #endif
    20  
    21  namespace boost { namespace stacktrace { namespace detail {
    22  
    23  #if !defined(BOOST_WINDOWS) && !defined(__CYGWIN__)
    24  class location_from_symbol {
    25      ::Dl_info dli_;
    26  
    27  public:
    28      explicit location_from_symbol(const void* addr) noexcept
    29          : dli_()
    30      {
    31          if (!::dladdr(const_cast<void*>(addr), &dli_)) { // `dladdr` on Solaris accepts nonconst addresses
    32              dli_.dli_fname = 0;
    33          }
    34      }
    35  
    36      bool empty() const noexcept {
    37          return !dli_.dli_fname;
    38      }
    39  
    40      const char* name() const noexcept {
    41          return dli_.dli_fname;
    42      }
    43  };
    44  
    45  class program_location {
    46  public:
    47      const char* name() const noexcept {
    48          return 0;
    49      }
    50  };
    51  
    52  #else
    53  
    54  class location_from_symbol {
    55      BOOST_STATIC_CONSTEXPR boost::winapi::DWORD_ DEFAULT_PATH_SIZE_ = 260;
    56      char file_name_[DEFAULT_PATH_SIZE_];
    57  
    58  public:
    59      explicit location_from_symbol(const void* addr) noexcept {
    60          file_name_[0] = '\0';
    61  
    62          boost::winapi::MEMORY_BASIC_INFORMATION_ mbi;
    63          if (!boost::winapi::VirtualQuery(addr, &mbi, sizeof(mbi))) {
    64              return;
    65          }
    66  
    67          boost::winapi::HMODULE_ handle = reinterpret_cast<boost::winapi::HMODULE_>(mbi.AllocationBase);
    68          if (!boost::winapi::GetModuleFileNameA(handle, file_name_, DEFAULT_PATH_SIZE_)) {
    69              file_name_[0] = '\0';
    70              return;
    71          }
    72      }
    73  
    74      bool empty() const noexcept {
    75          return file_name_[0] == '\0';
    76      }
    77  
    78      const char* name() const noexcept {
    79          return file_name_;
    80      }
    81  };
    82  
    83  class program_location {
    84      BOOST_STATIC_CONSTEXPR boost::winapi::DWORD_ DEFAULT_PATH_SIZE_ = 260;
    85      char file_name_[DEFAULT_PATH_SIZE_];
    86  
    87  public:
    88      program_location() noexcept {
    89          file_name_[0] = '\0';
    90  
    91          const boost::winapi::HMODULE_ handle = 0;
    92          if (!boost::winapi::GetModuleFileNameA(handle, file_name_, DEFAULT_PATH_SIZE_)) {
    93              file_name_[0] = '\0';
    94          }
    95      }
    96  
    97      const char* name() const noexcept {
    98          return file_name_[0] ? file_name_ : 0;
    99      }
   100  };
   101  #endif
   102  
   103  }}} // namespace boost::stacktrace::detail
   104  
   105  #endif // BOOST_STACKTRACE_DETAIL_LOCATION_FROM_SYMBOL_HPP