diff options
author | bde <bde@FreeBSD.org> | 2001-02-17 06:06:14 +0000 |
---|---|---|
committer | bde <bde@FreeBSD.org> | 2001-02-17 06:06:14 +0000 |
commit | b8925ba36b8ad1851ed9f11deeafc4c2d4498fe4 (patch) | |
tree | 708dbe470d3da32045a22cd205c271217cc9adbb | |
parent | 4d938ae7541ec044b9e0336a09dd27dc5492b49d (diff) | |
download | FreeBSD-src-b8925ba36b8ad1851ed9f11deeafc4c2d4498fe4.zip FreeBSD-src-b8925ba36b8ad1851ed9f11deeafc4c2d4498fe4.tar.gz |
Removed some garbage (genassym(8) and its infrastructure).
-rw-r--r-- | Makefile.inc1 | 2 | ||||
-rw-r--r-- | usr.bin/Makefile | 1 | ||||
-rw-r--r-- | usr.bin/genassym/Makefile | 9 | ||||
-rw-r--r-- | usr.bin/genassym/genassym.8 | 76 | ||||
-rw-r--r-- | usr.bin/genassym/genassym.c | 271 |
5 files changed, 1 insertions, 358 deletions
diff --git a/Makefile.inc1 b/Makefile.inc1 index a8487db..07188e4 100644 --- a/Makefile.inc1 +++ b/Makefile.inc1 @@ -610,7 +610,7 @@ _perl= gnu/usr.bin/perl/libperl gnu/usr.bin/perl/miniperl .endif cross-tools: -.for _tool in ${_btxld} ${_elf2exe} ${_perl} usr.bin/genassym \ +.for _tool in ${_btxld} ${_elf2exe} ${_perl} \ usr.bin/gensetdefs gnu/usr.bin/binutils usr.bin/objformat gnu/usr.bin/cc cd ${.CURDIR}/${_tool}; \ ${MAKE} obj; \ diff --git a/usr.bin/Makefile b/usr.bin/Makefile index ea6b99e..e277a30 100644 --- a/usr.bin/Makefile +++ b/usr.bin/Makefile @@ -51,7 +51,6 @@ SUBDIR= apply \ fstat \ fsync \ ftp \ - genassym \ gencat \ gensetdefs \ getconf \ diff --git a/usr.bin/genassym/Makefile b/usr.bin/genassym/Makefile deleted file mode 100644 index c85dc9b..0000000 --- a/usr.bin/genassym/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -# $FreeBSD$ - -TARGET_ARCH?= ${MACHINE_ARCH} - -PROG= genassym -MAN8= genassym.8 -CFLAGS+= -Wall -Darch_${TARGET_ARCH} - -.include <bsd.prog.mk> diff --git a/usr.bin/genassym/genassym.8 b/usr.bin/genassym/genassym.8 deleted file mode 100644 index 3841a0b..0000000 --- a/usr.bin/genassym/genassym.8 +++ /dev/null @@ -1,76 +0,0 @@ -.\" -.\" $FreeBSD$ -.\" -.Dd December 20, 1999 -.Dt GENASSYM 8 -.Os -.Sh NAME -.Nm genassym -.Nd generate assembler symbols from C -.Sh SYNOPSIS -.Nm -.Op Fl o Ar outfile -.Ar objfile -.Sh DESCRIPTION -The -.Nm -command is a special-purpose program to generate assembler -symbols from C code and is used to interface the low-level -assembly code with the C code. -This, for example, is used -to build a -.Fx -kernel or module. -Its -.Ar objfile -argument is the name of an ELF object file that holds the -symbol definitions. -These definitions are extracted from -the object file and written to standard output or to the -file specified with -.Ar outfile , -suitable for inclusion in assembler source files. -.Pp -The -.Nm -command only extracts symbols from the object file if they -are prefixed by -.Nm assym_ -and are global data types, whose value is the value given -to the symbol. -The following C declaration -.Bd -literal -offset indent -compact -int assym_MY_SYMBOL = 3; -.Ed -is used to create the following assembler symbol. -.Bd -literal -offset indent -compact -#define MY_SYMBOL 0x3 -.Ed -Note that the size of the symbol is extracted from the -object file, which means that the symbol may have any type -that is wide enough to hold the value. -.Sh SEE ALSO -.Xr config 8 -.Xr gensetdefs 8 -.Sh AUTHORS -The -.Nm -command was written by -.An Marcel Moolenaar Aq marcel@FreeBSD.org -and was based on the -.Dv gensetdefs -command. -.Sh BUGS -Not all linkers store the size of the symbol in the ELF -object file. -The GNU linker for Alpha has this bug for -example (binutils 2.9.1). In those cases the size of the -symbol is assumed to be equal to the word size of the ELF -object file. -For Alpha this is 64 bits and for i386 this -is 32 bits. -.Sh HISTORY -The -.Nm -command first appeared in -.Fx 4.0 . diff --git a/usr.bin/genassym/genassym.c b/usr.bin/genassym/genassym.c deleted file mode 100644 index 5d4a543..0000000 --- a/usr.bin/genassym/genassym.c +++ /dev/null @@ -1,271 +0,0 @@ -/*- - * Copyright (c) 1999 Marcel Moolenaar - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer - * in this position and unchanged. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software withough specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include <sys/types.h> -#if defined(arch_i386) -#include <sys/elf32.h> -#define __ELF_WORD_SIZE 32 -#elif defined(arch_alpha) || defined(arch_sparc64) -#include <sys/elf64.h> -#define __ELF_WORD_SIZE 64 -#else -#error unknown or missing architecture -#endif -#include <sys/elf_generic.h> - -#include <err.h> -#include <fcntl.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -const char s_data[] = ".data"; -const char s_strtab[] = ".strtab"; -const char s_symtab[] = ".symtab"; -const char assym[] = "assym_"; - -int fd; -char *objfile; -Elf_Ehdr ehdr; -Elf_Shdr *shdr; -char *shstr; - -int -my_byte_order(void) -{ - static unsigned short s = 0xbbaa; - int byte0; - - byte0 = *(unsigned char *)&s; - if (byte0 == 0xaa) - return (ELFDATA2LSB); - else if (byte0 == 0xbb) - return (ELFDATA2MSB); - return (ELFDATANONE); -} - -void * -read_section(int index) -{ - void *buf; - size_t size; - ssize_t bytes; - - size = shdr[index].sh_size; - buf = malloc(size); - if (buf == NULL) - return (NULL); - if (lseek(fd, shdr[index].sh_offset, SEEK_SET) == -1) - return (NULL); - bytes = read(fd, buf, size); - if (bytes == -1) - return (NULL); - if (bytes != size) - warnx("%s: section %d partially read", objfile, index); - return (buf); -} - -int section_index(const char *section) -{ - int i; - - for (i = 1; i < ehdr.e_shnum; i++) - if (!strcmp(section, shstr + shdr[i].sh_name)) - return (i); - return (-1); -} - -char * -filter(char *name) -{ - char *dot; - - name += sizeof(assym) - 1; - dot = strchr(name, '.'); - if (dot != NULL) - *dot = '\0'; - return (name); -} - -void usage(void) -{ - fprintf(stderr, "usage: genassym [-o outfile] objfile\n"); - exit(1); - /* NOT REACHED */ -} - -int -main(int argc, char *argv[]) -{ - Elf_Sym *sym; - char *data, *name, *symbols; - char *outfile; - void *valp; - size_t size; - ssize_t bytes; - int ch, i, numsym, warn_ld_bug; - int si_data, si_strtab, si_symtab; - u_int64_t value; - - outfile = NULL; - warn_ld_bug = 1; - - while ((ch = getopt(argc, argv, "o:")) != -1) { - switch (ch) { - case 'o': - outfile = optarg; - break; - default: - usage(); - /* NOT REACHED */ - } - } - argc -= optind; - argv += optind; - - if (argc == 0) { - usage(); - /* NOT REACHED */ - } - if (argc > 1) - warnx("ignoring trailing arguments"); - - objfile = argv[0]; - fd = open(objfile, O_RDONLY); - if (fd == -1) - err(1, "%s", objfile); - - bytes = read(fd, &ehdr, sizeof(ehdr)); - if (bytes == -1) - err(1, "%s", objfile); - if (bytes != sizeof(ehdr) || - ehdr.e_ident[EI_MAG0] != ELFMAG0 || - ehdr.e_ident[EI_MAG1] != ELFMAG1 || - ehdr.e_ident[EI_MAG2] != ELFMAG2 || - ehdr.e_ident[EI_MAG3] != ELFMAG3) - errx(1, "%s: not an ELF file", objfile); - if (ehdr.e_ident[EI_VERSION] != EV_CURRENT) - errx(1, "%s: unsupported ELF version", objfile); - if (ehdr.e_ident[EI_DATA] != my_byte_order()) - errx(1, "%s: unsupported byte order", objfile); - if (ehdr.e_shoff == 0) - errx(1, "%s: no section table", objfile); - if (ehdr.e_shstrndx == SHN_UNDEF) - errx(1, "%s: no section name string table", objfile); - - size = sizeof(*shdr) * ehdr.e_shnum; - shdr = malloc(size); - if (shdr == NULL) - err(1, "malloc"); - if (lseek(fd, ehdr.e_shoff, SEEK_SET) == -1) - err(1, "%s", objfile); - bytes = read(fd, shdr, size); - if (bytes == -1) - err(1, "%s", objfile); - if (bytes != size) - errx(1, "%s: truncated section table", objfile); - - shstr = read_section(ehdr.e_shstrndx); - if (shstr == NULL) - err(1, "%s[%d]", objfile, ehdr.e_shstrndx); - - si_data = section_index(s_data); - if (si_data == -1) - errx(1, "%s: section %s not present", objfile, s_data); - data = read_section(si_data); - if (data == NULL) - err(1, "%s[%d]", objfile, si_data); - - si_strtab = section_index(s_strtab); - if (si_strtab == -1) - errx(1, "%s: section %s not present", objfile, s_strtab); - symbols = read_section(si_strtab); - if (symbols == NULL) - err(1, "%s[%d]", objfile, si_strtab); - - si_symtab = section_index(s_symtab); - if (si_symtab == -1) - errx(1, "%s: section %s not present", objfile, s_symtab); - sym = read_section(si_symtab); - if (sym == NULL) - err(1, "%s[%d]", objfile, si_symtab); - - numsym = shdr[si_symtab].sh_size / sizeof(*sym); - - if (outfile != NULL) - freopen(outfile, "w", stdout); - - for (i = 0; i < numsym; i++) { - name = symbols + sym[i].st_name; - if (sym[i].st_shndx == si_data && - !strncmp(name, assym, sizeof(assym) - 1)) { - valp = (void*)(data + sym[i].st_value); - /* - * XXX - ld(1) on Alpha doesn't store the size of - * the symbol in the object file. The following - * fix handles this case quite genericly. It - * assumes that the symbols have the same size as - * a word on that architecture, determined by the - * word size in the ELF object file. - */ - if (sym[i].st_size == 0) { - sym[i].st_size = __ELF_WORD_SIZE >> 3; - if (warn_ld_bug) { - warnx("%s: symbol sizes not properly" - " set", objfile); - warn_ld_bug = 0; - } - } - switch (sym[i].st_size) { - case 1: - value = *(u_int8_t*)valp; - break; - case 2: - value = *(u_int16_t*)valp; - break; - case 4: - value = *(u_int32_t*)valp; - break; - case 8: - value = *(u_int64_t*)valp; - break; - default: - warnx("unsupported size (%lld) for symbol %s", - (long long)sym[i].st_size, filter(name)); - continue; - } - fprintf(stdout, "#define\t%s 0x%llx\n", filter(name), - (long long)value); - } - } - - return (0); -} |