由于我同样需要在运行时检索所有已加载的符号名称,因此我根据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;}


