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.
This commit is contained in:
John Polstra 1998-09-09 01:21:25 +00:00
parent 7ac9884afe
commit cfa4d73988
8 changed files with 314 additions and 79 deletions

View File

@ -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 \

39
include/objformat.h Normal file
View File

@ -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_ */

View File

@ -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 \

114
lib/libc/gen/getobjformat.3 Normal file
View File

@ -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.

119
lib/libc/gen/getobjformat.c Normal file
View File

@ -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);
}

View File

@ -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;
char objformat[32];
int is_aout;
fmt = getobjfmt(&argc, argv);
hints_file = fmt == Aout ? _PATH_LD_HINTS : _PATH_ELF_HINTS;
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()
{

View File

@ -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 */
/*
@ -55,6 +55,13 @@
#include <machine/alpha_cpu.h>
#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

View File

@ -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