X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Fexperimental%2Fsymbolizer%2FElf-inl.h;h=51f9030834a64f398579b09d7ac7be7b895115f6;hb=af7e70660f867873638ef2ce5bb33b19771bdd41;hp=bc0984009e9e72f8c5cc92dc4126f040f1c77272;hpb=d8c1a8c069f29498ea6db6094837042c2744913a;p=folly.git diff --git a/folly/experimental/symbolizer/Elf-inl.h b/folly/experimental/symbolizer/Elf-inl.h index bc098400..51f90308 100644 --- a/folly/experimental/symbolizer/Elf-inl.h +++ b/folly/experimental/symbolizer/Elf-inl.h @@ -1,5 +1,5 @@ /* - * Copyright 2012 Facebook, Inc. + * Copyright 2014 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -59,6 +59,34 @@ const char* ElfFile::iterateStrings(const ElfW(Shdr)& stringTable, Fn fn) return ptr != end ? ptr : nullptr; } +template +const ElfW(Sym)* ElfFile::iterateSymbols(const ElfW(Shdr)& section, Fn fn) + const { + FOLLY_SAFE_CHECK(section.sh_entsize == sizeof(ElfW(Sym)), + "invalid entry size in symbol table"); + + const ElfW(Sym)* sym = &at(section.sh_offset); + const ElfW(Sym)* end = sym + (section.sh_size / section.sh_entsize); + + while (sym < end) { + if (fn(*sym)) { + return sym; + } + + ++sym; + } + + return nullptr; +} + +template +const ElfW(Sym)* ElfFile::iterateSymbolsWithType(const ElfW(Shdr)& section, + uint32_t type, Fn fn) const { + // N.B. st_info has the same representation on 32- and 64-bit platforms + return iterateSymbols(section, [&](const ElfW(Sym)& sym) -> bool { + return ELF32_ST_TYPE(sym.st_info) == type && fn(sym); + }); +} } // namespace symbolizer } // namespace folly