Как напечатать таблицу символов, название символа - PullRequest
1 голос
/ 31 мая 2019

Я хочу напечатать имя символа в таблице символов. Я сопоставляю эльфа с виртуальной памятью (используя mmap), я успешно получил доступ к таблице символов, но при попытке напечатать имена символов это не удается (показывается нечетная строка, сравнивая ее с результатами файла эльфа).

мой код:

void printSymboles() {
Elf32_Sym* symtab;
Elf32_Shdr * sh_strtab_p ;
char *sh_strtab;
int symbol_num=-1;
  if(currentFd==-1){
    printf("not legal file set\n");
} else { 

    sectionHeader=(Elf32_Shdr*)(map_start+header->e_shoff);
    int section_num=header->e_shnum;

    int numSectionsFound=0;
    for(int i=0;i<section_num &&numSectionsFound<2;i++){
        if(sectionHeader[i].sh_type==SHT_SYMTAB) {
            symtab=(Elf32_Sym *) (map_start+sectionHeader[i].sh_offset);
            symbol_num= sectionHeader[i].sh_size/sectionHeader[i].sh_entsize; // symobl tbl size/ entrysize 
            numSectionsFound++;
        }
        if(sectionHeader[i].sh_type==SHT_STRTAB) {
            sh_strtab_p=&sectionHeader[i];
            sh_strtab=(char*) map_start+sh_strtab_p->sh_offset;
            numSectionsFound++;

        }
    }

    if(symbol_num==-1) {
        printf("symbol table doesn't exist");
    } else {
        printf("symbol table : \n");
        for(int i=0;i<symbol_num;i++) {
        printf("name : %s\n",sh_strtab+symtab[i].st_name);
        }
    }

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Проблема почти наверняка в том, что вы ищете неправильный раздел SHT_STRTAB - вы просматриваете заголовок в поисках разделов SHT_STRTAB, и тот, который вы найдете последним, вы помните в sh_strtab_p.Если ваш файл ELF похож на большинство файлов elf, это, вероятно, таблица строк заголовка раздела (содержит имена заголовков раздела), а не таблица строк с именами символов.

Чтобы найти таблицу строк с именами символов, вынужно заглянуть в поле sh_link заголовка раздела таблицы символов - в котором указан номер раздела (индекс в заголовке раздела) раздела таблицы строк, содержащего имена символов в этом разделе символов.В файле может быть произвольно много разделов SYMTAB, каждый со своим собственным разделом STRTAB.

Собирая все это вместе, вы хотите что-то более похожее на:

Elf32_Shdr *section = (Elf32_Shdr*)(map_start+header->e_shoff);
char *section_names = (char *)(map_start + section[header->e_shstrndx].sh_offset);

for(int i=0; i<header->e_shnum; i++) {
    if(section[i].sh_type==SHT_SYMTAB) {
        printf("Symobl table %s:\n",  section_names + section[i].sh_name);
        Elf32_Sym *symtab = (Elf32_Sym *)(map_start+section[i].sh_offset);
        int symbol_num = section[i].sh_size/section[i].sh_entsize;
        char *symbol_names = (char *)(map_start + section[section[i].sh_link].sh_offset);
        for (int j=0; j<symbol_num; j++) {
            printf("name : %s\n", symbol_names + symtab[j].st_name);
        }
    }
}

Конечно, это такжехорошо выполнить проверку работоспособности, чтобы убедиться, что ни один из индексов не выходит за пределы диапазона для раздела, в который они индексируются, и что sh_entsize и и e_shentsize соответствуют размеру используемых вами структур, на случай, если файл ELF был поврежден.

0 голосов
/ 01 июня 2019

как заметил @chris Dodd, проблема действительно была в том, что SHT_STRTAB. Я изменил этот раздел кода:

   if(sectionHeader[i].sh_type==SHT_STRTAB) {
        sh_strtab_p=&sectionHeader[i];
        sh_strtab=(char*) map_start+sh_strtab_p->sh_offset;
        numSectionsFound++;

    }

к этому:

    Elf32_Shde * sh_sectionStrTbl_p;
    char * sh_sectionStrTbl;
    sh_sectionStrTbl_p=&sectionHeader[header->e_shoff);
    sh_sectionStrTbl=map_start+sh_sectionStrTbl_p->sh_offset;

    if(sectionHeader[i].sh_type==SHT_STRTAB) {
        if(strcmp(sectionHeader[i].sh_name+sh_sectionStrTbl,".strtab")==0) {
        sh_strtab_p=&sectionHeader[i];
        sh_strtab=(char*) map_start+sh_strtab_p->sh_offset;
        numSectionsFound++;
        }
    }

и это работает.

...