「read_header()」の編集履歴(バックアップ)一覧に戻る
read_header() - (2005/10/31 (月) 15:17:49) のソース
a.outファイルのヘッダを読む関数<br> <br> strcut exec が良く分からない.<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= &ihdr->process;<br> <br> if (procf == nil) {<br> /* Header already present. */<br> n= phdr->a_hdrlen;<br> } else {<br> memset(ihdr, 0, sizeof(*ihdr));<br> <br> /* Put the basename of proc in the header. */<br> strncpy(ihdr->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 < A_MINHDR || BADMAG(*phdr)) {<br> fprintf(stderr, "installboot: %s is not an executable\n", 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->a_hdrlen - A_MINHDR);<br> }<br> <br> if (talk && !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->a_text, phdr->a_data, phdr->a_bss,<br> phdr->a_text + phdr->a_data + phdr->a_bss, proc);<br> }<br> total_text+= phdr->a_text;<br> total_data+= phdr->a_data;<br> total_bss+= phdr->a_bss;<br> <br> if (phdr->a_cpu == A_I8086) {<br> long data= phdr->a_data + phdr->a_bss;<br> <br> if (!(phdr->a_flags & A_SEP)) data+= phdr->a_text;<br> <br> if (phdr->a_text >= 65536) big|= 1;<br> if (data >= 65536) big|= 2;<br> }<br> if (big) {<br> fprintf(stderr,<br> "%s will crash, %s%s%s segment%s larger then 64K\n",<br> proc,<br> big & 1 ? "text" : "",<br> big == 3 ? " and " : "",<br> big & 2 ? "data" : "",<br> big == 3 ? "s are" : " is");<br> }<br> }<br> <br> <br>