#pragma once #if defined(__ELF__) && !defined(__FreeBSD__) #include #include #include #include #include namespace DB { /** Allow to quickly find symbol name from address. * Used as a replacement for "dladdr" function which is extremely slow. * It works better than "dladdr" because it also allows to search private symbols, that are not participated in shared linking. */ class SymbolIndex : private boost::noncopyable { protected: SymbolIndex() { update(); } public: static MultiVersion::Version instance(); static void reload(); struct Symbol { const void * address_begin; const void * address_end; const char * name; }; struct Object { const void * address_begin; const void * address_end; std::string name; std::shared_ptr elf; }; /// Address in virtual memory should be passed. These addresses include offset where the object is loaded in memory. const Symbol * findSymbol(const void * address) const; const Object * findObject(const void * address) const; const std::vector & symbols() const { return data.symbols; } const std::vector & objects() const { return data.objects; } /// The BuildID that is generated by compiler. String getBuildID() const { return data.build_id; } String getBuildIDHex() const; struct Data { std::vector symbols; std::vector objects; String build_id; }; private: Data data; void update(); static MultiVersion & instanceImpl(); }; } #endif