diff options
author | Dale Rahn <drahn@cvs.openbsd.org> | 2008-11-24 17:23:27 +0000 |
---|---|---|
committer | Dale Rahn <drahn@cvs.openbsd.org> | 2008-11-24 17:23:27 +0000 |
commit | ff77764606316d1e448ef97cdd5380de36810114 (patch) | |
tree | b1e15c8566025609fb8d4fb11b7a3b9baa7e4269 /usr.sbin/crunchgen | |
parent | 4c4620904ad302bcb3be1ff350897a9b433d708c (diff) |
Change mips detection in crunchgen from ifdef to command line flag
ok deraadt@, fkr@, rainer@. manpage cleanup thanks to jmc@
Diffstat (limited to 'usr.sbin/crunchgen')
-rw-r--r-- | usr.sbin/crunchgen/crunchgen.8 | 20 | ||||
-rw-r--r-- | usr.sbin/crunchgen/crunchgen.c | 14 | ||||
-rw-r--r-- | usr.sbin/crunchgen/elf_hide.c | 46 |
3 files changed, 42 insertions, 38 deletions
diff --git a/usr.sbin/crunchgen/crunchgen.8 b/usr.sbin/crunchgen/crunchgen.8 index 3c37ebf0e88..1abfe9b0f31 100644 --- a/usr.sbin/crunchgen/crunchgen.8 +++ b/usr.sbin/crunchgen/crunchgen.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: crunchgen.8,v 1.2 2008/08/23 07:24:06 jmc Exp $ +.\" $OpenBSD: crunchgen.8,v 1.3 2008/11/24 17:23:26 drahn Exp $ .\" .\" .\" Copyright (c) 1994 University of Maryland @@ -25,7 +25,7 @@ .\" Computer Science Department .\" University of Maryland at College Park .\" -.Dd $Mdocdate: August 23 2008 $ +.Dd $Mdocdate: November 24 2008 $ .Dt CRUNCHGEN 8 .Os .Sh NAME @@ -34,7 +34,7 @@ .Sh SYNOPSIS .Nm crunchgen .Bk -words -.Op Fl Efq +.Op Fl EfMq .Op Fl c Ar c-file-name .Op Fl D Ar src-root .Op Fl e Ar exec-file-name @@ -113,8 +113,8 @@ Assume that relative source directory specifications begin with .Ar src-root . .It Fl E Don't prepend stub names with an underscore. -Used for architectures that don't have underscore prepended to symbol names. -Example mips ELF. +Used for architectures that don't have underscore prepended to symbol names, +such as ELF architectures. .It Fl e Ar exec-file-name Set crunched binary executable file name to .Ar exec-file-name . @@ -125,9 +125,10 @@ Flush cache. Forces the recalculation of cached parameters. .It Fl h Hide all unnecessary symbols. -Note that the ELF version of -.Fl h -mangles the symbol table beyond recognition. +Note that this is done on some ELF architectures by marking the symbol +local, while the +.Fl M +option causes it to mangle the symbol name to hide the symbol. It is therefore not advisable to try to run .Xr nm 1 on a crunched object file. @@ -136,6 +137,9 @@ and how some architectures use the symbol attributes for their GOT build. .It Fl L Ar lib-dir Try to obtain libraries from .Ar lib-dir . +.It Fl M +On ELF architectures mangle the symbol instead of marking it global; +necessary for some architectures due to GOT usage. .It Fl m Ar makefile-name Set output Makefile name to .Ar makefile-name . diff --git a/usr.sbin/crunchgen/crunchgen.c b/usr.sbin/crunchgen/crunchgen.c index 88a82d59f12..4d53a05b7f8 100644 --- a/usr.sbin/crunchgen/crunchgen.c +++ b/usr.sbin/crunchgen/crunchgen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: crunchgen.c,v 1.3 2008/08/23 07:24:06 jmc Exp $ */ +/* $OpenBSD: crunchgen.c,v 1.4 2008/11/24 17:23:26 drahn Exp $ */ /* * Copyright (c) 1994 University of Maryland @@ -96,7 +96,7 @@ int goterror = 0; extern char *__progname; -int verbose = 1, readcache = 1, elf_names; /* options */ +int verbose = 1, readcache = 1, elf_names, elf_mangle; /* options */ int reading_cache; void status(char *str); @@ -118,7 +118,7 @@ main(int argc, char *argv[]) extern int optind; extern char *optarg; - while ((optc = getopt(argc, argv, "hm:c:e:fqD:EL:O:")) != -1) { + while ((optc = getopt(argc, argv, "hm:c:e:fqD:EL:O:M")) != -1) { switch (optc) { case 'h': optreset = 1; @@ -164,6 +164,9 @@ main(int argc, char *argv[]) sizeof(objdir)) usage(); break; + case 'M': + elf_mangle = 1; + break; default: usage(); } @@ -212,7 +215,7 @@ void usage(void) { fprintf(stderr, - "usage: crunchgen [-Efq] [-c c-file-name] [-D src-root] [-e exec-file-name]\n" + "usage: crunchgen [-EfMq] [-c c-file-name] [-D src-root] [-e exec-file-name]\n" "\t[-L lib-dir] [-m makefile-name] [-O objdir-name] conf-file\n"); fprintf(stderr, " crunchgen -h [-f keep-list-file] [-k keep-symbol] object-file ...\n"); @@ -933,7 +936,8 @@ prog_makefile_rules(FILE * outmk, prog_t * p) p->name, p->name, p->ident); fprintf(outmk, "\t$(LINK) -o $@ %s_stub.o $(%s_OBJPATHS)\n", p->name, p->ident); - fprintf(outmk, "\tcrunchgen -h -k %s_crunched_%s_stub $@\n", + fprintf(outmk, "\tcrunchgen %s -h -k %s_crunched_%s_stub $@\n", + elf_mangle ? "-M" : "", elf_names ? "" : "_", p->ident); } diff --git a/usr.sbin/crunchgen/elf_hide.c b/usr.sbin/crunchgen/elf_hide.c index 148a3946ff1..3d084aa6c99 100644 --- a/usr.sbin/crunchgen/elf_hide.c +++ b/usr.sbin/crunchgen/elf_hide.c @@ -1,4 +1,4 @@ -/* $OpenBSD: elf_hide.c,v 1.2 2008/09/08 20:42:24 deraadt Exp $ */ +/* $OpenBSD: elf_hide.c,v 1.3 2008/11/24 17:23:26 drahn Exp $ */ /* * Copyright (c) 1997 Dale Rahn. @@ -40,6 +40,8 @@ #ifdef _NLIST_DO_ELF #include <sys/exec_elf.h> +extern int elf_mangle; + void load_strtab(Elf_Ehdr * pehdr, char *pexe); void dump_strtab(); char *get_str(int indx); @@ -304,15 +306,9 @@ hide_sym(Elf_Ehdr * ehdr, Elf_Shdr * symsect, Elf_Sym * symtab, int symtabsize, int symtabsecnum) { int i; -#ifndef __mips__ unsigned char info; -#endif Elf_Sym *psymtab; -#ifdef __mips__ - u_int32_t f = arc4random(); -#endif - for (i = 0; i < (symtabsize / sizeof(Elf_Sym)); i++) { psymtab = &(symtab[i]); if ((psymtab->st_info & 0xf0) == 0x10 && @@ -325,24 +321,26 @@ hide_sym(Elf_Ehdr * ehdr, Elf_Shdr * symsect, get_str(psymtab->st_name)); printf("st_info %x\n", psymtab->st_info); #endif -#ifndef __mips__ - info = psymtab->st_info; - info = info & 0xf; - psymtab->st_info = info; -#else - /* - * XXX This is a small ugly hack to be able to use - * XXX chrunchide with MIPS. - * XXX Because MIPS needs global symbols to stay - * XXX global (has to do with GOT), we mess around - * XXX with the symbol names instead. For most uses - * XXX this will be no problem, symbols are stripped - * XXX anyway. However, if many one character - * XXX symbols exist, names may clash. - */ - { + if (!elf_mangle) { + info = psymtab->st_info; + info = info & 0xf; + psymtab->st_info = info; + } else { + /* + * XXX This is a small ugly hack to be able to + * XXX use chrunchide with MIPS. + * XXX Because MIPS needs global symbols to stay + * XXX global (has to do with GOT), we mess + * XXX around with the symbol names instead. + * XXX For most uses this will be no problem, + * XXX symbols are stripped anyway. + * XXX However, if many one character + * XXX symbols exist, names may clash. + */ char *p; u_int32_t n, z; + u_int32_t f; + f = arc4random(); z = f++; p = get_str(psymtab->st_name); @@ -356,8 +354,6 @@ hide_sym(Elf_Ehdr * ehdr, Elf_Shdr * symsect, p[n] += arc4random(); } } - -#endif #ifdef DEBUG printf("st_info %x\n", psymtab->st_info); #endif |