Заголовки нескольких программ в файлах 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)
Другие вопросы по тегам