summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjdp <jdp@FreeBSD.org>1998-09-09 01:21:25 +0000
committerjdp <jdp@FreeBSD.org>1998-09-09 01:21:25 +0000
commit7aadfa5c68916fc245b31ddeccdabc2deecd7c61 (patch)
tree52e3ead876c9fb810a56d0eaa0793ccf853b2efa
parent5279ba7b15b4567ed68a3eca5a0b3197d8a9f116 (diff)
downloadFreeBSD-src-7aadfa5c68916fc245b31ddeccdabc2deecd7c61.zip
FreeBSD-src-7aadfa5c68916fc245b31ddeccdabc2deecd7c61.tar.gz
Add a new library function getobjformat(). It checks all the
standard places ("/etc/objformat", ${OBJFORMAT}, argv) for an indication of the user's preferred object file format. This consolidates some code that was starting to be duplicated in more and more places. Use the new function in ldconfig. Note: I don't think that gcc should use getobjformat(), even though it could. The compiler should limit itself to functions that are widespread, to ease porting and cross-compilation.
-rw-r--r--include/Makefile4
-rw-r--r--include/objformat.h39
-rw-r--r--lib/libc/gen/Makefile.inc8
-rw-r--r--lib/libc/gen/getobjformat.3114
-rw-r--r--lib/libc/gen/getobjformat.c119
-rw-r--r--sbin/ldconfig/ldconfig.c89
-rw-r--r--sys/alpha/include/param.h9
-rw-r--r--sys/i386/include/param.h13
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
OpenPOWER on IntegriCloud