diff options
Diffstat (limited to 'usr.sbin/kgzip/kgzcmp.c')
-rw-r--r-- | usr.sbin/kgzip/kgzcmp.c | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/usr.sbin/kgzip/kgzcmp.c b/usr.sbin/kgzip/kgzcmp.c index 01c7763..e873b11 100644 --- a/usr.sbin/kgzip/kgzcmp.c +++ b/usr.sbin/kgzip/kgzcmp.c @@ -36,10 +36,11 @@ #include <stdlib.h> #include <unistd.h> -#include <a.out.h> +#include "i386_a.out.h" #include "aouthdr.h" #include "elfhdr.h" +#include "endian.h" #include "kgzip.h" static void mk_data(const struct iodesc *i, const struct iodesc *, @@ -47,7 +48,7 @@ static void mk_data(const struct iodesc *i, const struct iodesc *, static int ld_elf(const struct iodesc *, const struct iodesc *, struct kgz_hdr *, const Elf32_Ehdr *); static int ld_aout(const struct iodesc *, const struct iodesc *, - struct kgz_hdr *, const struct exec *); + struct kgz_hdr *, const struct i386_exec *); /* * Compress executable and output it in relocatable object format. @@ -56,6 +57,7 @@ void kgzcmp(struct kgz_hdr *kh, const char *f1, const char *f2) { struct iodesc idi, ido; + struct kgz_hdr khle; if ((idi.fd = open(idi.fname = f1, O_RDONLY)) == -1) err(1, "%s", idi.fname); @@ -86,12 +88,19 @@ kgzcmp(struct kgz_hdr *kh, const char *f1, const char *f2) xwrite(&ido, &ahdr0, sizeof(ahdr0)); } else { struct kgz_elfhdr ehdr = elfhdr; - ehdr.st[KGZ_ST_KGZ_NDATA].st_size = kh->nsize; - ehdr.sh[KGZ_SH_DATA].sh_size += kh->nsize; + ehdr.st[KGZ_ST_KGZ_NDATA].st_size = HTOLE32(kh->nsize); + ehdr.sh[KGZ_SH_DATA].sh_size = + HTOLE32(LE32TOH(ehdr.sh[KGZ_SH_DATA].sh_size) + kh->nsize); xseek(&ido, 0); xwrite(&ido, &ehdr, sizeof(ehdr)); } - xwrite(&ido, kh, sizeof(*kh)); + khle = *kh; + khle.dload = HTOLE32(khle.dload); + khle.dsize = HTOLE32(khle.dsize); + khle.isize = HTOLE32(khle.isize); + khle.entry = HTOLE32(khle.entry); + khle.nsize = HTOLE32(khle.nsize); + xwrite(&ido, &khle, sizeof(khle)); xclose(&ido); xclose(&idi); } @@ -104,7 +113,7 @@ mk_data(const struct iodesc * idi, const struct iodesc * ido, struct kgz_hdr * kh, size_t off) { union { - struct exec ex; + struct i386_exec ex; Elf32_Ehdr ee; } hdr; struct stat sb; @@ -118,7 +127,7 @@ mk_data(const struct iodesc * idi, const struct iodesc * ido, fmt = 0; if (n >= sizeof(hdr.ee) && IS_ELF(hdr.ee)) fmt = F_ELF; - else if (n >= sizeof(hdr.ex) && N_GETMAGIC(hdr.ex) == ZMAGIC) + else if (n >= sizeof(hdr.ex) && I386_N_GETMAGIC(hdr.ex) == ZMAGIC) fmt = F_AOUT; if (!fmt) errx(1, "%s: Format not supported", idi->fname); @@ -207,20 +216,20 @@ ld_elf(const struct iodesc * idi, const struct iodesc * ido, */ static int ld_aout(const struct iodesc * idi, const struct iodesc * ido, - struct kgz_hdr * kh, const struct exec * a) + struct kgz_hdr * kh, const struct i386_exec * a) { size_t load, addr; - load = addr = N_TXTADDR(*a); - xcopy(idi, ido, a->a_text, N_TXTOFF(*a)); - addr += a->a_text; - if (N_DATADDR(*a) != addr) + load = addr = I386_N_TXTADDR(*a); + xcopy(idi, ido, LE32TOH(a->a_text), I386_N_TXTOFF(*a)); + addr += LE32TOH(a->a_text); + if (I386_N_DATADDR(*a) != addr) return -1; - xcopy(idi, ido, a->a_data, N_DATOFF(*a)); - addr += a->a_data; + xcopy(idi, ido, LE32TOH(a->a_data), I386_N_DATOFF(*a)); + addr += LE32TOH(a->a_data); kh->dload = load; kh->dsize = addr - load; - kh->isize = kh->dsize + a->a_bss; - kh->entry = a->a_entry; + kh->isize = kh->dsize + LE32TOH(a->a_bss); + kh->entry = LE32TOH(a->a_entry); return 0; } |