diff options
-rw-r--r-- | include/Makefile | 4 | ||||
-rw-r--r-- | include/objformat.h | 39 | ||||
-rw-r--r-- | lib/libc/gen/Makefile.inc | 8 | ||||
-rw-r--r-- | lib/libc/gen/getobjformat.3 | 114 | ||||
-rw-r--r-- | lib/libc/gen/getobjformat.c | 119 | ||||
-rw-r--r-- | sbin/ldconfig/ldconfig.c | 89 | ||||
-rw-r--r-- | sys/alpha/include/param.h | 9 | ||||
-rw-r--r-- | sys/i386/include/param.h | 13 |
8 files changed, 315 insertions, 80 deletions
diff --git a/include/Makefile b/include/Makefile index 7b8e6de..4f12b46 100644 --- a/include/Makefile +++ b/include/Makefile @@ -1,5 +1,5 @@ # From: @(#)Makefile 8.2 (Berkeley) 1/4/94 -# $Id: Makefile,v 1.79 1998/06/11 08:56:40 peter Exp $ +# $Id: Makefile,v 1.80 1998/08/01 13:42:12 alex Exp $ # # Doing a make install builds /usr/include # @@ -14,7 +14,7 @@ FILES= a.out.h ar.h assert.h bitstring.h ctype.h db.h dirent.h disktab.h \ dlfcn.h elf.h err.h fnmatch.h fstab.h \ fts.h glob.h grp.h strhash.h histedit.h iso646.h \ kvm.h limits.h link.h locale.h malloc.h memory.h mpool.h \ - ndbm.h netdb.h nl_types.h nlist.h \ + ndbm.h netdb.h nl_types.h nlist.h objformat.h \ paths.h pthread.h pthread_np.h pwd.h \ ranlib.h regex.h regexp.h resolv.h rune.h runetype.h setjmp.h sgtty.h \ signal.h stab.h stddef.h stdio.h stdlib.h string.h stringlist.h \ diff --git a/include/objformat.h b/include/objformat.h new file mode 100644 index 0000000..a32c1a9 --- /dev/null +++ b/include/objformat.h @@ -0,0 +1,39 @@ +/*- + * Copyright (c) 1998 John D. Polstra + * 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. + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. + * + * $Id$ + */ + +#ifndef _OBJFORMAT_H_ +#define _OBJFORMAT_H_ + +#include <sys/cdefs.h> +#include <stddef.h> + +__BEGIN_DECLS +int getobjformat(char *, size_t, int *, char **); +__END_DECLS + +#endif /* _OBJFORMAT_H_ */ diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc index 060359a..b15f0bb 100644 --- a/lib/libc/gen/Makefile.inc +++ b/lib/libc/gen/Makefile.inc @@ -1,5 +1,5 @@ # @(#)Makefile.inc 8.6 (Berkeley) 5/4/95 -# $Id: Makefile.inc,v 1.48 1998/07/08 15:42:57 dt Exp $ +# $Id: Makefile.inc,v 1.49 1998/08/03 15:35:41 bde Exp $ # machine-independent gen sources .PATH: ${.CURDIR}/../libc/${MACHINE_ARCH}/gen ${.CURDIR}/../libc/gen @@ -11,7 +11,8 @@ SRCS+= _rand48.c _spinlock_stub.c alarm.c arc4random.c assert.c \ exec.c fnmatch.c fstab.c ftok.c fts.c getbootfile.c getbsize.c \ getcap.c getcwd.c getdomainname.c getgrent.c getgrouplist.c \ gethostname.c getloadavg.c getlogin.c getmntinfo.c getnetgrent.c \ - getosreldate.c getpagesize.c getpass.c getpwent.c getttyent.c \ + getobjformat.c getosreldate.c getpagesize.c \ + getpass.c getpwent.c getttyent.c \ getusershell.c getvfsbyname.c getvfsent.c glob.c \ initgroups.c isatty.c jrand48.c lcong48.c \ lockf.c lrand48.c mrand48.c msgctl.c \ @@ -38,7 +39,8 @@ MAN3+= alarm.3 arc4random.3 clock.3 \ getbootfile.3 getbsize.3 getcap.3 getcwd.3 \ getdiskbyname.3 getdomainname.3 getfsent.3 \ getgrent.3 getgrouplist.3 gethostname.3 getloadavg.3 \ - getmntinfo.3 getnetgrent.3 getpagesize.3 getpass.3 getpwent.3 \ + getmntinfo.3 getnetgrent.3 getobjformat.3 \ + getpagesize.3 getpass.3 getpwent.3 \ getttyent.3 getusershell.3 getvfsbyname.3 getvfsent.3 \ glob.3 initgroups.3 isinf.3 \ ldexp.3 lockf.3 modf.3 msgctl.3 msgget.3 msgrcv.3 msgsnd.3 \ diff --git a/lib/libc/gen/getobjformat.3 b/lib/libc/gen/getobjformat.3 new file mode 100644 index 0000000..228bb5f --- /dev/null +++ b/lib/libc/gen/getobjformat.3 @@ -0,0 +1,114 @@ +.\" Copyright (c) 1998 John D. Polstra +.\" 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. +.\" 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. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. +.\" +.\" $Id$ +.\" +.Dd September 7, 1998 +.Dt GETOBJFORMAT 3 +.Os FreeBSD +.Sh NAME +.Nm getobjformat +.Nd get preferred object file format +.Sh SYNOPSIS +.Fd #include <objformat.h> +.Ft int +.Fn getobjformat "char *buf" "size_t bufsize" "int *argcp" "char **argv" +.Sh DESCRIPTION +.Fn getobjformat +queries several sources to determine the preferred object file +format, and copies its name into a buffer provided by the caller. +.Pp +The object file format is determined as follows. If +.Va argv +is +.No non- Ns Ev NULL +and an explicit command line argument such as +.Fl aout +or +.Fl elf +is present, then that determines the object file format. +.Pp +Otherwise, if the variable +.Ev OBJFORMAT +is set in the environment, the object file format is taken from its +value. +.Pp +Otherwise, if the file +.Pa /etc/objformat +is readable and contains a line of the form +.Ql OBJFORMAT=xxx , +the object file format is taken from there. +.Pp +Otherwise, a built-in system default object file format is returned. +.Pp +.Va buf +points to a user-supplied buffer into which the name of the object +file format is copied. +.Va bufsize +gives the size of the buffer in bytes. The string placed in +.Va buf +is always null-terminated. It is an error if the buffer is too +small to hold the null-terminated name. +.Pp +.Va argv +points to a +.Dv NULL Ns -terminated +argument vector to be scanned for object +format options. +.Va argv +may be +.Dv NULL , +in which case the argument vector is not scanned. +.Pp +If +.Va argcp +is non-NULL, any object format options are deleted from the +argument vector, and the updated argument count is stored into +the integer referenced by +.Va argcp . +If +.Va argcp +is +.Dv NULL , +the argument vector is left unchanged. +.Sh RETURN VALUES +On success, +.Fn getobjformat +returns the length of the object file format name, not counting the +null terminator. +If the supplied buffer is too small to hold the object file format +and its null terminator, +.Fn getobjformat +returns -1. In that case, the contents of the buffer and argument +vector supplied by the caller are indeterminate. +.Sh ENVIRONMENT +.Ev OBJFORMAT +.Sh FILES +.Pa /etc/objformat +.Sh SEE ALSO +.Xr objformat 1 +.Sh HISTORY +The +.Fn getobjformat +function first appeared in FreeBSD 3.0. diff --git a/lib/libc/gen/getobjformat.c b/lib/libc/gen/getobjformat.c new file mode 100644 index 0000000..c1e9915 --- /dev/null +++ b/lib/libc/gen/getobjformat.c @@ -0,0 +1,119 @@ +/*- + * Copyright (c) 1998 John D. Polstra + * 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. + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. + * + * $Id$ + */ + +#include <sys/param.h> +#include <objformat.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#define PATH_OBJFORMAT "/etc/objformat" + +static int copyformat(char *, const char *, size_t); + +static const char *known_formats[] = { OBJFORMAT_NAMES, NULL }; + +static int +copyformat(char *buf, const char *fmt, size_t bufsize) +{ + size_t len; + + len = strlen(fmt); + if (len > bufsize - 1) + return -1; + strcpy(buf, fmt); + return len; +} + +int +getobjformat(char *buf, size_t bufsize, int *argcp, char **argv) +{ + const char *fmt; + char **src, **dst; + const char *env; + FILE *fp; + + fmt = NULL; + + if (argv != NULL) { + /* + * Scan for arguments setting known formats, e.g., "-elf". + * If "argcp" is non-NULL, delete these arguments from the + * list and update the argument count in "*argcp". + */ + for (dst = src = argv; *src != NULL; src++) { + if ((*src)[0] == '-') { + const char **p; + + for (p = known_formats; *p != NULL; p++) + if (strcmp(*src + 1, *p) == 0) + break; + if (*p != NULL) { + fmt = *p; + if (argcp == NULL) /* Don't delete */ + *dst++ = *src; + } else + *dst++ = *src; + } else + *dst++ = *src; + } + *dst = NULL; + if (argcp != NULL) + *argcp -= src - dst; + if (fmt != NULL) + return copyformat(buf, fmt, bufsize); + } + + /* Check the OBJFORMAT environment variable. */ + if ((env = getenv("OBJFORMAT")) != NULL) + return copyformat(buf, env, bufsize); + + /* Take a look at "/etc/objformat". */ + if ((fp = fopen(PATH_OBJFORMAT, "r")) != NULL) { + char line[1024]; + int found; + int len; + + found = 0; + while (fgets(line, sizeof line, fp) != NULL) { + if (strncmp(line, "OBJFORMAT=", 10) == 0) { + char *p = &line[10]; + + p[strcspn(p, " \t\n")] = '\0'; + len = copyformat(buf, p, bufsize); + found = 1; + } + } + fclose(fp); + if (found) + return len; + } + + /* As a last resort, use the compiled in default. */ + return copyformat(buf, OBJFORMAT_DEFAULT, bufsize); +} diff --git a/sbin/ldconfig/ldconfig.c b/sbin/ldconfig/ldconfig.c index 2206c0b..bacdcca 100644 --- a/sbin/ldconfig/ldconfig.c +++ b/sbin/ldconfig/ldconfig.c @@ -30,7 +30,7 @@ #ifndef lint static const char rcsid[] = - "$Id: ldconfig.c,v 1.26 1998/09/05 16:20:15 jdp Exp $"; + "$Id: ldconfig.c,v 1.27 1998/09/06 20:43:25 jdp Exp $"; #endif /* not lint */ #include <sys/param.h> @@ -45,6 +45,7 @@ static const char rcsid[] = #include <errno.h> #include <fcntl.h> #include <link.h> +#include <objformat.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -65,16 +66,6 @@ static const char rcsid[] = #undef major #undef minor -enum obj_format { Unknown, Aout, Elf }; - -#ifndef DEFAULT_FORMAT -#ifdef __ELF__ -#define DEFAULT_FORMAT Elf -#else -#define DEFAULT_FORMAT Aout -#endif -#endif - static int verbose; static int nostd; static int justread; @@ -100,7 +91,6 @@ static int buildhints __P((void)); static int dodir __P((char *, int)); int dofile __P((char *, int)); static void enter __P((char *, char *, char *, int *, int)); -static enum obj_format getobjfmt __P((int *, char **)); static void listhints __P((void)); static int readhints __P((void)); static void usage __P((void)); @@ -112,10 +102,19 @@ char *argv[]; { int i, c; int rval = 0; - enum obj_format fmt; - - fmt = getobjfmt(&argc, argv); - hints_file = fmt == Aout ? _PATH_LD_HINTS : _PATH_ELF_HINTS; + char objformat[32]; + int is_aout; + + if (getobjformat(objformat, sizeof objformat, &argc, argv) == -1) + errx(1, "getobjformat failed: name too long"); + if (strcmp(objformat, "aout") == 0) + is_aout = 1; + else if (strcmp(objformat, "elf") == 0) + is_aout = 0; + else + errx(1, "unknown object format \"%s\"", objformat); + + hints_file = is_aout ? _PATH_LD_HINTS : _PATH_ELF_HINTS; while ((c = getopt(argc, argv, "Rf:mrsv")) != -1) { switch (c) { case 'R': @@ -142,7 +141,7 @@ char *argv[]; } } - if (fmt == Elf) { + if (!is_aout) { if (justread) list_elf_hints(hints_file); else @@ -204,62 +203,6 @@ char *argv[]; return rval; } -static enum obj_format -getobjfmt(argcp, argv) - int *argcp; - char **argv; -{ - enum obj_format fmt; - char **src, **dst; - const char *env; - FILE *fp; - - fmt = Unknown; - - /* Scan for "-aout" or "-elf" arguments, deleting them as we go. */ - for (dst = src = argv + 1; *src != NULL; src++) { - if (strcmp(*src, "-aout") == 0) - fmt = Aout; - else if (strcmp(*src, "-elf") == 0) - fmt = Elf; - else - *dst++ = *src; - } - *dst = NULL; - *argcp -= src - dst; - if (fmt != Unknown) - return fmt; - - /* Check the OBJFORMAT environment variable. */ - if ((env = getenv("OBJFORMAT")) != NULL) { - if (strcmp(env, "aout") == 0) - return Aout; - else if (strcmp(env, "elf") == 0) - return Elf; - } - - /* Take a look at "/etc/objformat". */ - if ((fp = fopen("/etc/objformat", "r")) != NULL) { - char buf[1024]; - - while (fgets(buf, sizeof buf, fp) != NULL) { - if (strcmp(buf, "OBJFORMAT=aout\n") == 0) - fmt = Aout; - else if (strcmp(buf, "OBJFORMAT=elf\n") == 0) - fmt = Elf; - else - warnx("Unrecognized line in /etc/objformat: %s", - buf); - } - fclose(fp); - } - if (fmt != Unknown) - return fmt; - - /* As a last resort, use the compiled in default. */ - return DEFAULT_FORMAT; -} - static void usage() { diff --git a/sys/alpha/include/param.h b/sys/alpha/include/param.h index bd5f26f..c07ff73 100644 --- a/sys/alpha/include/param.h +++ b/sys/alpha/include/param.h @@ -1,4 +1,4 @@ -/* $Id: param.h,v 1.5 1998/07/12 16:32:10 dfr Exp $ */ +/* $Id: param.h,v 1.6 1998/07/30 08:12:14 dfr Exp $ */ /* From: NetBSD: param.h,v 1.20 1997/09/19 13:52:53 leo Exp */ /* @@ -56,6 +56,13 @@ #include <machine/cpu.h> /* + * OBJFORMAT_NAMES is a comma-separated list of the object formats + * that are supported on the architecture. + */ +#define OBJFORMAT_NAMES "elf" +#define OBJFORMAT_DEFAULT "elf" + +/* * Round p (pointer or byte index) up to a correctly-aligned value for all * data types (int, long, ...). The result is u_long and must be cast to * any desired pointer type. diff --git a/sys/i386/include/param.h b/sys/i386/include/param.h index cd566e2..462f874 100644 --- a/sys/i386/include/param.h +++ b/sys/i386/include/param.h @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)param.h 5.8 (Berkeley) 6/28/91 - * $Id: param.h,v 1.44 1998/06/15 04:50:55 bde Exp $ + * $Id: param.h,v 1.45 1998/08/31 08:41:40 kato Exp $ */ #ifndef _MACHINE_PARAM_H_ @@ -49,6 +49,17 @@ #define MACHINE_ARCH "i386" #define MID_MACHINE MID_I386 +/* + * OBJFORMAT_NAMES is a comma-separated list of the object formats + * that are supported on the architecture. + */ +#define OBJFORMAT_NAMES "elf", "aout" +#ifdef __ELF__ +#define OBJFORMAT_DEFAULT "elf" +#else +#define OBJFORMAT_DEFAULT "aout" +#endif + #ifdef SMP #define NCPUS 2 #else |