「read_header()」の編集履歴(バックアップ)一覧はこちら

read_header()」(2005/10/31 (月) 17:20:20) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

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>
a.outファイルのヘッダを読む関数<br> <br> [[strcut exec]] が良く分からない.<br> <br> 引数ihdrは破壊的に更新される<br> <br> <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> 以下のようにセグメントのサイズ表示される?<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, structimage_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>

表示オプション

横に並べて表示:
変化行の前後のみ表示:
目安箱バナー