[BACK]Return to clean-elf.c CVS log [TXT][DIR] Up to [local] / sys / arch / sparc / stand / common

Annotation of sys/arch/sparc/stand/common/clean-elf.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: clean-elf.c,v 1.2 2003/11/03 07:01:33 david Exp $     */
                      2: /*
                      3:  * Public domain. I don't even want my name on this.
                      4:  */
                      5: #include <stdio.h>
                      6: #include <stdlib.h>
                      7: #include <unistd.h>
                      8: #include <sys/types.h>
                      9: #include <sys/mman.h>
                     10: #include <err.h>
                     11: #include <elf_abi.h>
                     12: #include <fcntl.h>
                     13:
                     14: int
                     15: elf_is_okay(Elf_Ehdr *ehdr)
                     16: {
                     17:        int retval = 0;
                     18:
                     19:        /*
                     20:         * We need to check magic, class size, endianess,
                     21:         * and version before we look at the rest of the
                     22:         * Elf_Ehdr structure.  These few elements are
                     23:         * represented in a machine independent fashion.
                     24:         */
                     25:
                     26:        if (IS_ELF(*ehdr) &&
                     27:            ehdr->e_ident[EI_CLASS] == ELF_TARG_CLASS &&
                     28:            ehdr->e_ident[EI_DATA] == ELF_TARG_DATA &&
                     29:            ehdr->e_ident[EI_VERSION] == ELF_TARG_VER) {
                     30:                /* Now check the machine dependant header */
                     31:                if (ehdr->e_machine == ELF_TARG_MACH &&
                     32:                    ehdr->e_version == ELF_TARG_VER)
                     33:                        retval = 1;
                     34:        }
                     35:
                     36:        return retval;
                     37: }
                     38:
                     39: void
                     40: cleanit(caddr_t addr)
                     41: {
                     42:        Elf_Ehdr *ehdr;
                     43:        Elf_Shdr *shdr;
                     44:        char *strtab;
                     45:        int i;
                     46:
                     47:        ehdr = (Elf_Ehdr *)addr;
                     48:        shdr = (Elf_Shdr *)(addr + ehdr->e_shoff);
                     49:
                     50:        strtab = shdr[ehdr->e_shstrndx].sh_offset + addr;
                     51:
                     52:        /*
                     53:         * Simple. find a .text section, verify that the next section is
                     54:         * .rodata and merge them.
                     55:         */
                     56:
                     57:        for (i = 0; i < ehdr->e_shnum; i++) {
                     58:                Elf_Shdr *t = &shdr[i];
                     59:                Elf_Shdr *r = &shdr[i + 1];
                     60:
                     61: #if 0
                     62:                printf("foo: %s %d\n", strtab + t->sh_name, t->sh_type);
                     63:                continue;
                     64: #endif
                     65:                if (strcmp(strtab + t->sh_name, ".text"))
                     66:                        continue;
                     67:                if (strcmp(strtab + r->sh_name, ".rodata"))
                     68:                        errx(1, "sorry, rodata merge not possible.");
                     69:
                     70:                t->sh_size += r->sh_size + (r->sh_offset - t->sh_offset - t->sh_size);
                     71:                r->sh_type = SHT_NULL;
                     72:                r->sh_name = 0;
                     73:        }
                     74: }
                     75:
                     76: int
                     77: main(int argc, char **argv)
                     78: {
                     79:        int fd;
                     80:        void *addr;
                     81:        off_t len;
                     82:        int pgsz = getpagesize();
                     83:
                     84:        if (argc != 2)
                     85:                errx(1, "usage");
                     86:
                     87:        if ((fd = open(argv[1], O_RDWR)) < 0)
                     88:                err(1, "open");
                     89:
                     90:        if ((len = lseek(fd, 0, SEEK_END)) < 0)
                     91:                err(1, "lseek");
                     92:
                     93:        len = ((len + pgsz - 1) & ~(pgsz - 1));
                     94:
                     95:        if ((addr = mmap(0, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) ==
                     96:            MAP_FAILED)
                     97:                err(1, "mmap");
                     98:
                     99:        if (!elf_is_okay((Elf_Ehdr *)addr))
                    100:                errx(1, "not an elf file");
                    101:
                    102:        cleanit(addr);
                    103:
                    104:        msync(addr, len, MS_SYNC|MS_INVALIDATE);
                    105:
                    106:        close(fd);
                    107:        return (0);
                    108: }
                    109:

CVSweb