我想确保如果我找到了一个全局符号,并且它在一个共享对象中,那么就输入err_value-4。我不确定在我标记的代码中的if语句应该是什么。如果符号不在共享对象中,则它应该进入if部分。
Elf64_Shdr* section_h_arr = (Elf64_Shdr*)((char*)elf + elf_header->e_shoff);
Elf64_Shdr sh_str_section = section_h_arr[elf_header->e_shstrndx];
char *sh_str_tbl = (char*)elf + sh_str_section.sh_offset;
Elf64_Half sections_amount = elf_header->e_shnum;
Elf64_Sym *symtab;
char *strtab;
int symbols_amount = 0;
char* section_name;
for(int i = 0; i < sections_amount; i++) {
section_name = sh_str_tbl + section_h_arr[i].sh_name;
if(!strcmp(".symtab", section_name) || section_h_arr[i].sh_type == 2){
symtab = (Elf64_Sym*)((char*)elf + section_h_arr[i].sh_offset);
symbols_amount = section_h_arr[i].sh_size / section_h_arr[i].sh_entsize;
}
else if(!strcmp(".strtab", section_name) || section_h_arr[i].sh_type == 3){
if((char*)elf + section_h_arr[i].sh_offset != sh_str_tbl)
strtab = ((char*)elf + section_h_arr[i].sh_offset);
}
}
char* curr_symbol_name;
for(int i = 0; i < symbols_amount; i++){
curr_symbol_name = strtab + symtab[i].st_name;
if(!strcmp(symbol_name, curr_symbol_name)) {
if(ELF64_ST_BIND(symtab[i].st_info) == STB_GLOBAL) {
close(elf_fd);
*error_val=1;
if (///////////////////////////////// )
{
return symtab[i].st_value;
}
*error_val=-4;
return 0; }
我的第一个尝试是“section_h_arr[symtab[i].st_shndx].sh_type!=ET_DYN”但不起作用
1条答案
按热度按时间f4t66c6m1#
您需要的
if
语句是:我的第一个尝试是
section_h_arr[symtab[i].st_shndx].sh_type!=ET_DYN
,但它不工作这种说法没有意义--只有将
sh_type
与SHT_...
常量进行比较才有意义。此外,
ET_DYN
或ET_EXEC
是整个ELF
图像的属性,而不是其中任何部分的属性。