栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Linux架构上即时列出C代码中可用的所有功能/符号?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Linux架构上即时列出C代码中可用的所有功能/符号?

由于我同样需要在运行时检索所有已加载的符号名称,因此我根据R
..的答案进行了一些研究。因此,这里是ELF格式的Linux共享库的详细解决方案,该解决方案可与我的gcc 4.3.4一起使用,但也希望与新版本一起使用。

我主要使用以下资源来开发此解决方案:

  • ELF手册页
  • 一些示例代码(在搜索“ dl_iterate_phdr”时找到了它)

这是我的代码。我使用自解释变量名并添加了详细注释以使其易于理解。如果有什么错误或遗漏,请让我知道…(编辑:我刚刚意识到问题是C的,而我的代码是C
++的。但是,如果省略向量和字符串,它也应适用于C )

#include <link.h>#include <string>#include <vector>using namespace std;int retrieve_symbolnames(struct dl_phdr_info* info, size_t info_size, void* symbol_names_vector) {        ElfW(Dyn*) dyn;    ElfW(Sym*) sym;    ElfW(Word*) hash;    char* strtab = 0;    char* sym_name = 0;    ElfW(Word) sym_cnt = 0;        vector<string>* symbol_names = reinterpret_cast<vector<string>*>(symbol_names_vector);        for (size_t header_index = 0; header_index < info->dlpi_phnum; header_index++)    {                if (info->dlpi_phdr[header_index].p_type == PT_DYNAMIC)        {  dyn = (ElfW(Dyn)*)(info->dlpi_addr +  info->dlpi_phdr[header_index].p_vaddr);  while(dyn->d_tag != DT_NULL) {     if (dyn->d_tag == DT_HASH)     {                  hash = (ElfW(Word*))dyn->d_un.d_ptr;                  sym_cnt = hash[1];     }     else if (dyn->d_tag == DT_STRTAB)     {                  strtab = (char*)dyn->d_un.d_ptr;     }     else if (dyn->d_tag == DT_SYMTAB)     {                  sym = (ElfW(Sym*))dyn->d_un.d_ptr;                  for (ElfW(Word) sym_index = 0; sym_index < sym_cnt; sym_index++)         {    sym_name = &strtab[sym[sym_index].st_name];  symbol_names->push_back(string(sym_name));         }     }          dyn++; }        }    }        return 1;}int main(){    vector<string> symbolNames;    dl_iterate_phdr(retrieve_symbolnames, &symbolNames);    return 0;}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/401001.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号