Доступ к таблице символов ELF в C
Я пишу программу для имитации elfdump -ecps
В настоящее время он правильно печатает заголовок elf, заголовки программы и заголовки разделов, но я застрял в последних нескольких частях таблицы символов.
желаемый вывод в формате:
Symbol Table Section: .dynsym
index value size type bind oth ver shndx name
[0] 0x00000000 0x00000000 NOTY LOCL D 0 UNDEF
[1] 0x00025c0c 0x00000000 FUNC GLOB D 2 UNDEF .udiv
[2] 0x00025e00 0x00000140 OBJT WEAK D 1 .bss _iob
[3] 0x00025b24 0x00000000 OBJT GLOB P 1 .got _GLOBAL_OFFSET_TABLE_
[4] 0x00013a44 0x0000001c FUNC GLOB D 1 .init _init
...
Можете ли вы сказать мне, где находятся oth, ver, shndx и имя?
до сих пор я печатаю это со следующим:
//for each entry in the symbol table
for(i=0; i<num_sym; i++)
{
//read the current symbol
fread(&mysym,sizeof(Elf32_Sym),1,fp);
idx=mysym.st_name;
//multiple lines to get formatting correct
//prints index in brackets right aligned
char buf[12];
sprintf(buf, "[%d]", i);
printf("%10s", buf);
//value
printf(" 0x%.8x", mysym.st_value);
//size
printf(" 0x%.8x", mysym.st_size);
//type
switch (ELF32_ST_TYPE(mysym.st_info)) {
case 0:
printf(" NOTY");
break;
case 1:
printf(" OBJT");
break;
case 2:
printf(" FUNC");
break;
case 3:
printf(" SECT");
break;
case 4:
printf(" FILE");
break;
default:
break;
}
//bind
switch(ELF32_ST_BIND(mysym.st_info))
{
case 0: printf(" LOCL");
break;
case 1: printf(" GLOB");
break;
case 2: printf(" WEAK");
break;
case 3: printf(" NUM");
break;
default:
break;
}
//TODO: oth
//TODO: ver
//TODO: shndx
//TODO: name
}
Я перечитывал http://docs.oracle.com/cd/E19457-01/801-6737/801-6737.pdf (глава 5), но не смог найти ничего полезного
2 ответа
Это в основном покрыто Symbol Table
начиная со страницы 119 этого документа, на который вы ссылаетесь.
Он на самом деле имеет структуру, которая вам нужна:
typedef struct {
Elf32_Word st_name;
Elf32_Addr st_value;
Elf32_Word st_size;
unsigned char st_info;
unsigned char st_other;
Elf32_Half st_shndx;
} Elf32_Sym;
наряду с подробной информацией о том, как найти информацию для связанных записей (в частности, средства для поиска имени из st_name
структура поля).
К сожалению, этот документ, по-видимому, не охватывает то, откуда берутся определенные вещи (например, версия), поэтому, когда я пытаюсь эмулировать другую программу, имеющую доступный источник, я перехожу к источнику - на самом деле ничего не происходит более определенным, чем это:-)
Начиная с строки 1665 этого файла, вы найдете elf_print_symtab()
функция, которая отвечает за вывод интересующей вас информации. get_versym()
чтобы получить эту информацию, и из этого кода в строке 1632 вы можете видеть, что она использует для этого другой раздел ( раздел символов версии).
И, как можно видеть здесь, этот тип раздела считается одним из специфических для ОС, поэтому вы не найдете его в базовом стандарте, который касается только общих вещей.
Для имени есть еще один раздел, который содержит все строки. Вы должны использовать первое поле в "Таблице заголовка раздела" в качестве индекса в заголовке раздела, чтобы получить реальную строку из этого раздела строки. Вы можете найти много статей об этом с Google.