1 // Copyright 2016 The Chromium OS Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROMIUMOS_WIDE_PROFILING_DSO_H_ 6 #define CHROMIUMOS_WIDE_PROFILING_DSO_H_ 7 8 #include <sys/stat.h> 9 10 #include <unordered_set> 11 #include <utility> 12 13 #include "compat/string.h" 14 #include "data_reader.h" 15 16 namespace quipper { 17 18 // Defines a type for a pid:tid pair. 19 using PidTid = std::pair<u32, u32>; 20 21 // A struct containing all relevant info for a mapped DSO, independent of any 22 // samples. 23 struct DSOInfo { 24 string name; 25 string build_id; 26 u32 maj = 0; 27 u32 min = 0; 28 u64 ino = 0; 29 bool hit = false; // Have we seen any samples in this DSO? 30 // unordered_set of pids this DSO had samples in. 31 std::unordered_set<uint64_t> threads; 32 }; 33 34 // Do the |DSOInfo| and |struct stat| refer to the same inode? 35 bool SameInode(const DSOInfo& dso, const struct stat* s); 36 37 // Must be called at least once before using libelf. 38 void InitializeLibelf(); 39 // Read buildid from an ELF file using libelf. 40 bool ReadElfBuildId(const string& filename, string* buildid); 41 bool ReadElfBuildId(int fd, string* buildid); 42 43 // Read buildid from /sys/module/<module_name>/notes/.note.gnu.build-id 44 // (Does not use libelf.) 45 bool ReadModuleBuildId(const string& module_name, string* buildid); 46 // Read builid from Elf note data section. 47 bool ReadBuildIdNote(DataReader* data, string* buildid); 48 49 // Is |name| match one of the things reported by the kernel that is known 50 // not to be a kernel module? 51 bool IsKernelNonModuleName(string name); 52 53 } // namespace quipper 54 55 #endif // CHROMIUMOS_WIDE_PROFILING_DSO_H_ 56