如果我有节的符号和它的索引,我如何检查节的类型?(c语言)

kcugc4gi  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(94)

我想确保如果我找到了一个全局符号,并且它在一个共享对象中,那么就输入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”但不起作用

f4t66c6m

f4t66c6m1#

您需要的if语句是:

if (elf_header->e_type == ET_DYN) ...

我的第一个尝试是section_h_arr[symtab[i].st_shndx].sh_type!=ET_DYN,但它不工作
这种说法没有意义--只有将sh_typeSHT_...常量进行比较才有意义。
此外,ET_DYNET_EXEC是整个ELF图像的属性,而不是其中任何部分的属性。

相关问题