#include <stdio.h>
|
#include <stdio.h>
|
#include <stdlib.h>
|
#include <stdlib.h>
|
#include <a.out.h>
|
#include <a.out.h>
|
#include <string.h>
|
#include <string.h>
|
|
|
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
{
|
{
|
void *data;
|
void *data;
|
struct exec ex;
|
struct exec ex;
|
FILE *f;
|
FILE *f;
|
int totlen;
|
int totlen;
|
|
|
if (argc < 2) {
|
if (argc < 2) {
|
fprintf(stderr, "Usage: build kernel-name\n");
|
fprintf(stderr, "Usage: build kernel-name\n");
|
exit(1);
|
exit(1);
|
}
|
}
|
|
|
f = fopen(argv[1], "rb");
|
f = fopen(argv[1], "rb");
|
|
|
fread(&ex, 1, sizeof(ex), f);
|
fread(&ex, 1, sizeof(ex), f);
|
|
|
if(N_MAGIC(ex) == ZMAGIC) {
|
if(N_MAGIC(ex) == ZMAGIC) {
|
fseek(f, 4096, SEEK_SET);
|
fseek(f, 4096, SEEK_SET);
|
totlen = ex.a_text + ex.a_data;
|
totlen = ex.a_text + ex.a_data;
|
} else
|
} else
|
if(N_MAGIC(ex) == QMAGIC) {
|
if(N_MAGIC(ex) == QMAGIC) {
|
unsigned int my_header;
|
unsigned int my_header;
|
|
|
fseek(f, 4, SEEK_SET);
|
fseek(f, 4, SEEK_SET);
|
|
|
my_header = 0xea000006;
|
my_header = 0xea000006;
|
|
|
fwrite(&my_header, 4, 1, stdout);
|
fwrite(&my_header, 4, 1, stdout);
|
|
|
totlen = ex.a_text + ex.a_data - 4;
|
totlen = ex.a_text + ex.a_data - 4;
|
} else {
|
} else {
|
fprintf(stderr, "Unacceptable a.out header on kernel\n");
|
fprintf(stderr, "Unacceptable a.out header on kernel\n");
|
fclose(f);
|
fclose(f);
|
exit(1);
|
exit(1);
|
}
|
}
|
|
|
fprintf(stderr, "Kernel is %dk (%dk text, %dk data, %dk bss)\n",
|
fprintf(stderr, "Kernel is %dk (%dk text, %dk data, %dk bss)\n",
|
(ex.a_text + ex.a_data + ex.a_bss)/1024,
|
(ex.a_text + ex.a_data + ex.a_bss)/1024,
|
ex.a_text/1024, ex.a_data/1024, ex.a_bss/1024);
|
ex.a_text/1024, ex.a_data/1024, ex.a_bss/1024);
|
|
|
data = malloc(totlen);
|
data = malloc(totlen);
|
fread(data, 1, totlen, f);
|
fread(data, 1, totlen, f);
|
fwrite(data, 1, totlen, stdout);
|
fwrite(data, 1, totlen, stdout);
|
|
|
free(data);
|
free(data);
|
fclose(f);
|
fclose(f);
|
fflush(stdout);
|
fflush(stdout);
|
return 0;
|
return 0;
|
}
|
}
|
|
|