Заголовки нескольких программ в файлах ELF
Я пытаюсь прочитать содержимое файла ELF в память, используя C. В настоящее время я могу прочитать файл с 1 заголовком программы, но у меня возникла проблема с более чем этим.
/* Find and read program headers */
ELFPROGHDR *prgHdr;
fseek(fp, elfhead.phdrpos, SEEK_SET);
prgHdr = (ELFPROGHDR*)malloc(sizeof(ELFPROGHDR)*elfhead.phdrcnt);
if(!prgHdr)
{
fprintf(fp, "Out of Memory\n");
fclose(fp);
return 3;
}
fread(prgHdr, 1, sizeof(ELFPROGHDR)*elfhead.phdrcnt, fp);
printf("Segment-Offset: %x\n", prgHdr->offset);
printf("File-size: %d\n", prgHdr->filesize);
printf("Align: %d\n", prgHdr->align);
/* allocate memory and read in ARM instructions */
for(i = 0; i < elfhead.phdrcnt; i++)
{
armInstructions = (unsigned int *)malloc(prgHdr->filesize + 3 & ~3);
if(armInstructions == NULL)
{
fclose(fp);
free(prgHdr);
fprintf(stderr, "Out of Memory\n");
return 3;
}
fseek(fp, prgHdr->offset, SEEK_SET);
fread(armInstructions, 1, prgHdr->filesize, fp);
/* Disassemble */
printf("\nInstructions\n\n");
Disassemble(armInstructions, (prgHdr->filesize + 3 & ~3) /4, prgHdr->virtaddr);
printf("\n");
free(armInstructions);
}
free(prgHdr);
Я думаю, что проблема заключается в
fseek(fp, elfhead.phdrpos, SEEK_SET);
Поскольку я просто ищу начало 1-го заголовка программы каждый раз. Как мне изменить это так, каждый раз, когда я ищу в начале первого заголовка, затем второй заголовок и т. Д..
Спасибо
1 ответ
Решение
Ваш код довольно плохой:-(
Вы делаете следующее:
for i in phdrcnt
fseek(phdrpos);
prgHdr[i] = malloc space for *all* phdrs
fread() *all* phdrs into the allocated space
use first phdr to disassemble
free allocated space
Другими словами, вы выделяете N раз, читаете N раз, разбираете N раз один и тот же первый phdr, освобождаете N раз.
Что вы хотите вместо этого:
fseek(phdrpos)
prgHdr = malloc space for all phdrs
fread all phdrs into space allocated
for i in phdrcnt
disassemble(pgrHdr[i])
free(pgrHdr)