「read_header()」の編集履歴(バックアップ)一覧に戻る

read_header() - (2005/10/31 (月) 16:01:28) のソース

a.outファイルのヘッダを読む関数<br>
<br>
strcut exec が良く分からない.<br>
<br>
<br>
<br>
<br>
<br>
  if (talk &amp;&amp; !banner) {<br>
    printf("  text  data   bss   size\n");<br>
    banner= 1;<br>
  }<br>
<br>
  if (talk) {<br>
    printf("%8ld%8ld%8ld%9ld %s\n",<br>
      phdr-&gt;a_text, phdr-&gt;a_data, phdr-&gt;a_bss,<br>
      phdr-&gt;a_text + phdr-&gt;a_data + phdr-&gt;a_bss, proc);<br>
  }<br>
以下のようにセグメントのサイズ表示される?<br>
<br>
  text  data   bss   size<br>
  xxxx  xxxx  xxxx  xxxx<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
以下全文<br>
void read_header(int talk, char *proc, FILE *procf, struct
image_header*ihdr)<br>
/* Read the a.out header of a program and check it. If procf happens to be<br>
* nil then the header is already in *image_hdr and need only be checked.<br>
*/<br>
{<br>
  int n, big= 0;<br>
  static int banner= 0;<br>
  struct exec *phdr= &amp;ihdr-&gt;process;<br>
<br>
  if (procf == nil) {<br>
    /* Header already present. */<br>
    n= phdr-&gt;a_hdrlen;<br>
  } else {<br>
    memset(ihdr, 0, sizeof(*ihdr));<br>
<br>
    /* Put the basename of proc in the header. */<br>
    strncpy(ihdr-&gt;name, basename(proc), IM_NAME_MAX);<br>
<br>
    /* Read the header. */<br>
    n= fread(phdr, sizeof(char), A_MINHDR, procf);<br>
    if (ferror(procf)) fatal(proc);<br>
  }<br>
<br>
  if (n &lt; A_MINHDR || BADMAG(*phdr)) {<br>
    fprintf(stderr, "installboot: %s is not an executable ", proc);<br>
    exit(1);<br>
  }<br>
<br>
  /* Get the rest of the exec header. */<br>
  if (procf != nil) {<br>
    bread(procf, proc, ((char *) phdr) + A_MINHDR,<br>
            phdr-&gt;a_hdrlen - A_MINHDR);<br>
  }<br>
<br>
  if (talk &amp;&amp; !banner) {<br>
    printf("  text  data   bss   size ");<br>
    banner= 1;<br>
  }<br>
<br>
  if (talk) {<br>
    printf("%8ld%8ld%8ld%9ld %s ",<br>
      phdr-&gt;a_text, phdr-&gt;a_data, phdr-&gt;a_bss,<br>
      phdr-&gt;a_text + phdr-&gt;a_data + phdr-&gt;a_bss, proc);<br>
  }<br>
  total_text+= phdr-&gt;a_text;<br>
  total_data+= phdr-&gt;a_data;<br>
  total_bss+= phdr-&gt;a_bss;<br>
<br>
  if (phdr-&gt;a_cpu == A_I8086) {<br>
    long data= phdr-&gt;a_data + phdr-&gt;a_bss;<br>
<br>
    if (!(phdr-&gt;a_flags &amp; A_SEP)) data+= phdr-&gt;a_text;<br>
<br>
    if (phdr-&gt;a_text &gt;= 65536) big|= 1;<br>
    if (data &gt;= 65536) big|= 2;<br>
  }<br>
  if (big) {<br>
    fprintf(stderr,<br>
      "%s will crash, %s%s%s segment%s larger then 64K ",<br>
      proc,<br>
      big &amp; 1 ? "text" : "",<br>
      big == 3 ? " and " : "",<br>
      big &amp; 2 ? "data" : "",<br>
      big == 3 ? "s are" : " is");<br>
  }<br>
}<br>
<br>
<br>
目安箱バナー