|新しいページ|検索|ページ一覧|RSS|@ウィキご利用ガイド | 管理者にお問合せ
|ログイン|

read_header()


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

a.outファイルのヘッダを読む関数

[[strcut exec]] が良く分からない.

引数ihdrは破壊的に更新される




  if (talk && !banner) {
    printf("  text  data   bss   size ");
    banner= 1;
  }

  if (talk) {
    printf("%8ld%8ld%8ld%9ld %s ",
      phdr->a_text, phdr->a_data, phdr->a_bss,
      phdr->a_text + phdr->a_data + phdr->a_bss, proc);
  }
以下のようにセグメントのサイズ表示される?

  text  data   bss   size
  xxxx  xxxx  xxxx  xxxx








以下全文
void read_header(int talk, char *proc, FILE *procf, structimage_header*ihdr)
/* Read the a.out header of a program and check it. If procf happens to be
* nil then the header is already in *image_hdr and need only be checked.
*/
{
  int n, big= 0;
  static int banner= 0;
  struct exec *phdr= &ihdr->process;

  if (procf == nil) {
    /* Header already present. */
    n= phdr->a_hdrlen;
  } else {
    memset(ihdr, 0, sizeof(*ihdr));

    /* Put the basename of proc in the header. */
    strncpy(ihdr->name, basename(proc), IM_NAME_MAX);

    /* Read the header. */
    n= fread(phdr, sizeof(char), A_MINHDR, procf);
    if (ferror(procf)) fatal(proc);
  }

  if (n < A_MINHDR || BADMAG(*phdr)) {
    fprintf(stderr, "installboot: %s is not an executable ", proc);
    exit(1);
  }

  /* Get the rest of the exec header. */
  if (procf != nil) {
    bread(procf, proc, ((char *) phdr) + A_MINHDR,
            phdr->a_hdrlen - A_MINHDR);
  }

  if (talk && !banner) {
    printf("  text  data   bss   size ");
    banner= 1;
  }

  if (talk) {
    printf("%8ld%8ld%8ld%9ld %s ",
      phdr->a_text, phdr->a_data, phdr->a_bss,
      phdr->a_text + phdr->a_data + phdr->a_bss, proc);
  }
  total_text+= phdr->a_text;
  total_data+= phdr->a_data;
  total_bss+= phdr->a_bss;

  if (phdr->a_cpu == A_I8086) {
    long data= phdr->a_data + phdr->a_bss;

    if (!(phdr->a_flags & A_SEP)) data+= phdr->a_text;

    if (phdr->a_text >= 65536) big|= 1;
    if (data >= 65536) big|= 2;
  }
  if (big) {
    fprintf(stderr,
      "%s will crash, %s%s%s segment%s larger then 64K ",
      proc,
      big & 1 ? "text" : "",
      big == 3 ? " and " : "",
      big & 2 ? "data" : "",
      big == 3 ? "s are" : " is");
  }
}