Проблема почти наверняка в том, что вы ищете неправильный раздел 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 был поврежден.