【问题标题】:Multiple Program Headers in ELF filesELF 文件中的多个程序头
【发布时间】:2013-01-17 17:20:42
【问题描述】:

我正在尝试使用 C 将 ELF 文件的内容读入内存。我目前可以读取具有 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);

因为我每次都在寻找第一个程序头的开头。我该如何改变这个,所以每次我寻找第一个标题的开头,然后是第二个标题等..

谢谢

【问题讨论】:

    标签: c io elf fread disassembly


    【解决方案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 次,fread 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)
    

    【讨论】:

    • 感谢您的帮助。虽然有点困惑。你说所有 phdr 的 prgHdr = malloc,但后来说 disassemble(prghdr[i])。您是否建议 PrgHdr 是一个数组?谢谢
    • "你是否建议 PrgHdr 是一个数组?" -- 请阅读指针算法,例如这里:learncpp.com/cpp-tutorial/… 关键:“请注意,*(anArray+1) 与 anArray[1] 具有相同的效果。”
    猜你喜欢
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多