diff options
author | marcel <marcel@FreeBSD.org> | 1999-12-17 15:27:21 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 1999-12-17 15:27:21 +0000 |
commit | c926be6ea7337529b70771aa567e9d10a6238901 (patch) | |
tree | d406a0d79d376737cd247f2da59cbb46f14e7183 | |
parent | 37b2004d094765ca1230841e342a5b2c1c969eb8 (diff) | |
download | FreeBSD-src-c926be6ea7337529b70771aa567e9d10a6238901.zip FreeBSD-src-c926be6ea7337529b70771aa567e9d10a6238901.tar.gz |
o Don't use long for 64 bit variables. Use u_int64_t instead.
o Fix printf format specifiers on Alpha and add i386 version.
o Minor style fixes while there.
o Add -Wall compiler option.
-rw-r--r-- | usr.sbin/elf2exe/Makefile | 2 | ||||
-rw-r--r-- | usr.sbin/elf2exe/elf2exe.c | 107 |
2 files changed, 62 insertions, 47 deletions
diff --git a/usr.sbin/elf2exe/Makefile b/usr.sbin/elf2exe/Makefile index d8ce6a1..aaf16c2 100644 --- a/usr.sbin/elf2exe/Makefile +++ b/usr.sbin/elf2exe/Makefile @@ -3,7 +3,7 @@ PROG= elf2exe SRCS= elf2exe.c MAN8= elf2exe.8 - +CFLAGS+= -Wall MANSUBDIR=/${MACHINE_ARCH} .include <bsd.prog.mk> diff --git a/usr.sbin/elf2exe/elf2exe.c b/usr.sbin/elf2exe/elf2exe.c index d874b27..3689af8 100644 --- a/usr.sbin/elf2exe/elf2exe.c +++ b/usr.sbin/elf2exe/elf2exe.c @@ -36,11 +36,12 @@ static const char rcsid[] = #include <sys/types.h> #include <sys/elf64.h> #include <err.h> +#include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <time.h> #include <unistd.h> -#include <fcntl.h> #define ALPHA_FMAGIC 0x184 @@ -99,6 +100,7 @@ int open_elffile(char *filename) { int fileno = open(filename, O_RDONLY); + if (fileno < 0) err(1, filename); return (fileno); @@ -109,7 +111,8 @@ Elf64_Ehdr * load_ehdr(int fileno) { Elf64_Ehdr *ehdr; - int bytes = sizeof(*ehdr); + size_t bytes = sizeof(*ehdr); + ehdr = malloc(bytes); if (ehdr) { lseek(fileno, 0, SEEK_SET); @@ -122,8 +125,9 @@ load_ehdr(int fileno) Elf64_Phdr * load_phdr(int fileno, Elf64_Ehdr *ehdr) { - int bytes = ehdr->e_phentsize * ehdr->e_phnum; + size_t bytes = ehdr->e_phentsize * ehdr->e_phnum; Elf64_Phdr *phdr = malloc(bytes); + if (phdr) { lseek(fileno, ehdr->e_phoff, SEEK_SET); if (read(fileno, phdr, bytes) != bytes) @@ -135,9 +139,9 @@ load_phdr(int fileno, Elf64_Ehdr *ehdr) Elf64_Shdr * load_shdr(int fileno, Elf64_Ehdr *ehdr) { - int bytes = ehdr->e_shentsize * ehdr->e_shnum; - + size_t bytes = ehdr->e_shentsize * ehdr->e_shnum; Elf64_Shdr *shdr = malloc(bytes); + if (shdr) { lseek(fileno, ehdr->e_shoff, SEEK_SET); if (read(fileno, shdr, bytes) != bytes) @@ -149,32 +153,35 @@ load_shdr(int fileno, Elf64_Ehdr *ehdr) char * find_shstrtable(int fileno, int sections, Elf64_Shdr *shdr) { + size_t bytes; char *shstrtab = NULL; - int i; - int shstrtabindex; + int i, shstrtabindex; + for (i = 0; shstrtab == NULL && i < sections; i++) { if (shdr[i].sh_type == 3 && shdr[i].sh_flags == 0) { shstrtabindex = i; - shstrtab = malloc(shdr[shstrtabindex].sh_size); + bytes = shdr[shstrtabindex].sh_size; + shstrtab = malloc(bytes); if (shstrtab == NULL) errx(1, "malloc failed"); lseek(fileno, shdr[shstrtabindex].sh_offset, SEEK_SET); - read(fileno, shstrtab, shdr[shstrtabindex].sh_size); - + read(fileno, shstrtab, bytes); + if (strcmp (shstrtab + shdr[i].sh_name, ".shstrtab")) { free(shstrtab); shstrtab = NULL; } } } - return shstrtab; + return (shstrtab); } int open_exefile(char *filename) { int fileno = open(filename, O_RDWR | O_TRUNC | O_CREAT, 0666); + if (fileno < 0) err(1, filename); return (fileno); @@ -192,60 +199,60 @@ section_name(Elf64_Shdr *shdr, int i) return (shstrtab + shdr[i].sh_name); } -long +int section_index(Elf64_Shdr *shdr, int sections, char *name) { int i; - + for (i = 0; i < sections; i++) if (strcmp (name, section_name(shdr, i)) == 0) return (i); - - return -1; + return (-1); } /* first byte of section */ -long +u_int64_t section_start(Elf64_Shdr *shdr, int sections, char *name) { int i = section_index(shdr, sections, name); - if (i < 0) - return -1; - return shdr[i].sh_addr; + if (i < 0) + return (-1); + return (shdr[i].sh_addr); } /* last byte of section */ -long +u_int64_t section_end(Elf64_Shdr *shdr, int sections, char *name) { int i = section_index(shdr, sections, name); - if (i < 0) - return -1; - return shdr[i].sh_addr + shdr[i].sh_size -1; + if (i < 0) + return (-1); + return (shdr[i].sh_addr + shdr[i].sh_size -1); } /* last byte of section */ -long +u_int64_t section_size(Elf64_Shdr *shdr, int sections, char *name) { int i = section_index(shdr, sections, name); + if (i < 0) - return -1; + return (-1); - return shdr[i].sh_size; + return (shdr[i].sh_size); } /* file position of section start */ -long +u_int64_t section_fpos(Elf64_Shdr *shdr, int sections, char *name) { int i = section_index(shdr, sections, name); - if (i < 0) - return -1; - return shdr[i].sh_offset; + if (i < 0) + return (-1); + return (shdr[i].sh_offset); } void @@ -262,14 +269,13 @@ main(int argc, char** argv) Elf64_Ehdr *ehdr; Elf64_Phdr *phdr; Elf64_Shdr *shdr; - int shstrtabindex; FILHDR filehdr; AOUTHDR aouthdr; SCNHDR textscn, datascn; - long textstart, textsize, textsize2, textfsize, textfpos; - long datastart, datasize, datafsize, datafpos; - long bssstart, bsssize; - long progentry; + u_int64_t textstart, textsize, textsize2, textfsize, textfpos; + u_int64_t datastart, datasize, datafsize, datafpos; + u_int64_t bssstart, bsssize; + u_int64_t progentry; char* p; int sections; @@ -293,11 +299,16 @@ main(int argc, char** argv) for (i = 1; i < sections; i++) { printf("section %d (%s): " - "type=%x flags=0%x " - "offs=%x size=%x addr=%x\n", - i, shstrtab + shdr[i].sh_name, - shdr[i].sh_type, shdr[i].sh_flags, - shdr[i].sh_offset, shdr[i].sh_size, shdr[i].sh_addr); +#if defined(__alpha__) + "type=%x flags=0%lx " + "offs=%lx size=%lx addr=%lx\n", +#else + "type=%x flags=0%llx " + "offs=%llx size=%llx addr=%llx\n", +#endif + i, shstrtab + shdr[i].sh_name, + shdr[i].sh_type, shdr[i].sh_flags, + shdr[i].sh_offset, shdr[i].sh_size, shdr[i].sh_addr); } textstart = section_start(shdr, sections, ".text"); @@ -316,10 +327,15 @@ main(int argc, char** argv) bssstart = section_start(shdr, sections, ".bss"); bsssize = section_size(shdr, sections, ".bss"); - printf ("text: %x(%x) @%x data: %x(%x) @%x bss: %x(%x)\n", - textstart, textsize, textfpos, - datastart, datasize, datafpos, - bssstart, bsssize); +#if defined(__alpha__) + printf ("text: %lx(%lx) @%lx data: %lx(%lx) @%lx bss: %lx(%lx)\n", +#else + printf("text: %llx(%llx) @%llx data: %llx(%llx) @%llx " + "bss: %llx(%llx)\n", +#endif + textstart, textsize, textfpos, + datastart, datasize, datafpos, + bssstart, bsssize); memset(&filehdr, 0, sizeof filehdr); memset(&aouthdr, 0, sizeof aouthdr); @@ -391,6 +407,5 @@ main(int argc, char** argv) write(outfd, p, ROUNDUP(datasize, 512)); free(p); - return 0; + return (0); } - |