「read_header()」の編集履歴(バックアップ)一覧はこちら
「read_header()」(2005/10/31 (月) 17:20:20) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
a.outファイルのヘッダを読む関数<br>
<br>
strcut exec が良く分からない.<br>
<br>
<br>
<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>
以下のようにセグメントのサイズ表示される?<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= &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 ", 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 ");<br>
banner= 1;<br>
}<br>
<br>
if (talk) {<br>
printf("%8ld%8ld%8ld%9ld %s ",<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 ",<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>
a.outファイルのヘッダを読む関数<br>
<br>
[[strcut exec]] が良く分からない.<br>
<br>
引数ihdrは破壊的に更新される<br>
<br>
<br>
<br>
<br>
if (talk && !banner) {<br>
printf(" text data bss size ");<br>
banner= 1;<br>
}<br>
<br>
if (talk) {<br>
printf("%8ld%8ld%8ld%9ld %s ",<br>
phdr->a_text, phdr->a_data, phdr->a_bss,<br>
phdr->a_text + phdr->a_data + phdr->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= &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 ", 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 ");<br>
banner= 1;<br>
}<br>
<br>
if (talk) {<br>
printf("%8ld%8ld%8ld%9ld %s ",<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 ",<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>
表示オプション
横に並べて表示:
変化行の前後のみ表示: