New macro.
(PSEUDO): Use it instead of SYSCALL_PIC_SETUP and jmp syscall_error.
* sysdeps/unix/sysv/linux/i386/sysdep.S (__syscall_error): Define
only #ifndef PIC.
* Makeconfig (built-program-cmd): New variable.
* sunrpc/Makefile (rpcgen-cmd): Use $(built-program-cmd).
* time/Makefile (zic-cmd): Likewise.
* hurd/Makefile (user-interfaces): Add hurd/exec_startup.
Tue Oct 24 15:22:58 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
+ * sysdeps/unix/sysv/linux/i386/sysdep.h (SYSCALL_ERROR_HANDLER):
+ New macro.
+ (PSEUDO): Use it instead of SYSCALL_PIC_SETUP and jmp syscall_error.
+
+ * sysdeps/unix/sysv/linux/i386/sysdep.S (__syscall_error): Define
+ only #ifndef PIC.
+
+ * Makeconfig (built-program-cmd): New variable.
+ * sunrpc/Makefile (rpcgen-cmd): Use $(built-program-cmd).
+ * time/Makefile (zic-cmd): Likewise.
+
+ * hurd/Makefile (user-interfaces): Add hurd/exec_startup.
+
* sunrpc/Makefile (librpcsvc-no-lib-dep): New variable.
* extra-lib.mk: If $(lib)-no-lib-dep is defined and MAKELEVEL>0,
make `others' rather than `lib-noranlib' depend on the libraries.
endif
ifdef objpfx
csu-objpfx = $(objpfx)
+elf-objpfx = $(objpfx)
else
csu-objpfx = $(..)csu/
+elf-objpfx = $(..)elf/
endif
ifeq (yes,$(build-shared))
endif
endif
+# How to run a program we just linked with our library.
+# The program binary is assumed to be $(word 2,$^).
+built-program-file = $(dir $(word 2,$^))$(notdir $(word 2,$^))
+ifneq (yes,$(build-shared))
+built-program-cmd = $(built-program-file)
+else
+, = ,
+define built-program-cmd
+LD_LIBRARY_PATH=$(common-objdir)$(patsubst -Wl$,-rpath-link=%,:%,\
+ $(filter -Wl$,-rpath-link=%,\
+ $(sysdep-LDFLAGS))) \
+$(elf-objpfx)ld.so $(built-program-file)
+endef
+endif
+
ifndef LD
LD := ld -X
endif
user-interfaces := $(addprefix hurd/,\
auth process startup \
msg msg_reply msg_request \
- exec crash interrupt \
+ exec exec_startup crash interrupt \
fs fsys io term socket ifsock)
server-interfaces := hurd/msg
#if HAVE_ALLOCA_H
#include <alloca.h>
#else /* not __GNUC__ or HAVE_ALLOCA_H */
+#if 0 /* It is a bad idea to declare alloca. We always cast the result. */
#ifndef _AIX /* Already did AIX, up at the top. */
char *alloca ();
#endif /* not _AIX */
+#endif
#endif /* not HAVE_ALLOCA_H */
#endif /* not __GNUC__ */
if necessary. Also cast from a signed character in the constant
string passed to us by the user to an unsigned char that we can use
as an array index (in, e.g., `translate'). */
+#ifndef PATFETCH
#define PATFETCH(c) \
do {if (p == pend) return REG_EEND; \
c = (unsigned char) *p++; \
- if (translate) c = translate[c]; \
+ if (translate) c = (unsigned char) translate[c]; \
} while (0)
+#endif
/* Fetch the next character in the uncompiled pattern, with no
translation. */
cast the subscript to translate because some data is declared as
`char *', to avoid warnings when a string constant is passed. But
when we use a character as a subscript we must make it unsigned. */
-#define TRANSLATE(d) (translate ? translate[(unsigned char) (d)] : (d))
+#ifndef TRANSLATE
+#define TRANSLATE(d) \
+ (translate ? (char) translate[(unsigned char) (d)] : (d))
+#endif
/* Macros for outputting the compiled pattern into `buffer'. */
const char *pend = pattern + size;
/* How to translate the characters in the pattern. */
- char *translate = bufp->translate;
+ RE_TRANSLATE_TYPE translate = bufp->translate;
/* Address of the count-byte of the most recently inserted `exactn'
command. This makes it possible to tell if a new exact-match
static reg_errcode_t
compile_range (p_ptr, pend, translate, syntax, b)
const char **p_ptr, *pend;
- char *translate;
+ RE_TRANSLATE_TYPE translate;
reg_syntax_t syntax;
unsigned char *b;
{
{
int val;
register char *fastmap = bufp->fastmap;
- register char *translate = bufp->translate;
+ register RE_TRANSLATE_TYPE translate = bufp->translate;
int total_size = size1 + size2;
int endpos = startpos + range;
unsigned char *just_past_start_mem = 0;
/* We use this to map every character in the string. */
- char *translate = bufp->translate;
+ RE_TRANSLATE_TYPE translate = bufp->translate;
/* Failure point stack. Each place that can handle a failure further
down the line pushes a failure point on this stack. It consists of
do
{
PREFETCH ();
- if (translate[(unsigned char) *d++] != (char) *p++)
+ if ((unsigned char) translate[(unsigned char) *d++]
+ != (unsigned char) *p++)
goto fail;
}
while (--mcnt);
bcmp_translate (s1, s2, len, translate)
unsigned char *s1, *s2;
register int len;
- char *translate;
+ RE_TRANSLATE_TYPE translate;
{
register unsigned char *p1 = s1, *p2 = s2;
while (len)
{
unsigned i;
- preg->translate = (char *) malloc (CHAR_SET_SIZE);
+ preg->translate
+ = (RE_TRANSLATE_TYPE) malloc (CHAR_SET_SIZE
+ * sizeof (*(RE_TRANSLATE_TYPE)0));
if (preg->translate == NULL)
return (int) REG_ESPACE;
compiled, the `re_nsub' field is available. All other fields are
private to the regex routines. */
+#ifndef RE_TRANSLATE_TYPE
+#define RE_TRANSLATE_TYPE char *
+#endif
+
struct re_pattern_buffer
{
/* [[[begin pattern_buffer]]] */
comparing them, or zero for no translation. The translation
is applied to a pattern when it is compiled and to a string
when it is matched. */
- char *translate;
+ RE_TRANSLATE_TYPE translate;
/* Number of subexpressions found by the compiler. */
size_t re_nsub;
$(objpfx)rpcgen: $(addprefix $(objpfx),$(rpcgen-objs)) $(common-objpfx)libc.a
$(+link)
-rpcgen-cmd = $(dir $(word 2,$^))$(notdir $(word 2,$^))
+rpcgen-cmd = $(built-program-cmd)
# The proper file name is longer than 14 chars, so we install it under
# a shorter name. But if the filesystem can handle it, we want to
getitimer setitimer \
getdomainname/getdomain=bsd/bsd4.4 \
setdomainname/setdomain=bsd/bsd4.4 \
+ fchdir=bsd/bsd4.4 \
profil=bsd readv=bsd writev=bsd \
getpriority setpriority \
getrlimit setrlimit
unix_srcname=
unix_srcdir=common
eval "unix_syscall=`echo $unix_function | \
- sed -e 's@=\(.*\)$@ unix_srcdir=\1@' \
- -e 's@/\(.*\)$@ unix_srcname=\1@'`"
+ sed -e 's@=\(.*\)$@ unix_srcdir=\1@' \
+ -e 's@/\(^=/*\)$@ unix_srcname=\1@'`"
test -z "$unix_srcname" && unix_srcname=$unix_syscall
unix_implementor=none
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
-/* The syscall stubs jump here when they detect an error.
- The code for Linux is almost identical to the canonical Unix/i386
- code, except that the error number in %eax is negated. */
-
-.globl __syscall_error
-__syscall_error:
- negl %eax
-
-#define __syscall_error __syscall_error_1
-#include <sysdeps/unix/i386/sysdep.S>
-
/* Because the Linux version is in fact i386/ELF and the start.? file
for this system (sysdeps/i386/elf/start.S) is also used by The Hurd
and therefore this files must not contain the definition of the
.globl errno
errno:
.long 0
+
+/* The following code is not used at all in the shared library.
+ The PIC system call stubs set errno themselves. */
+
+#ifndef PIC
+
+/* The syscall stubs jump here when they detect an error.
+ The code for Linux is almost identical to the canonical Unix/i386
+ code, except that the error number in %eax is negated. */
+
+.globl __syscall_error
+__syscall_error:
+ negl %eax
+
+#define __syscall_error __syscall_error_1
+#include <sysdeps/unix/i386/sysdep.S>
+
+#endif
#undef PSEUDO
#define PSEUDO(name, syscall_name, args) \
.text; \
- lose: SYSCALL_PIC_SETUP \
- jmp JUMPTARGET (syscall_error) \
- .globl syscall_error; \
+ SYSCALL_ERROR_HANDLER \
ENTRY (name) \
movl $SYS_ify (syscall_name), %eax; \
DO_CALL (args); \
testl %eax, %eax; \
- jl lose
+ jl syscall_error;
-/* We define our own ENTRY macro because the alignment should be 16 for ELF. */
+#ifndef PIC
+#define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
+#else
+/* Store (- %eax) into errno through the GOT. */
+#define SYSCALL_ERROR_HANDLER \
+syscall_error: \
+ call 0f; \
+0:popl %ecx; \
+ negl %eax; \
+ addl $_GLOBAL_OFFSET_TABLE_+[.-0b], %ecx; \
+ movl errno@GOT(%ecx), %ecx; \
+ movl %eax, (%ecx); \
+ movl $-1, %eax; \
+ ret
+#endif
+
+/* We define our own ENTRY macro because the alignment should be 16 for
+ ELF. */
#undef ENTRY
#define ENTRY(name) \
ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (name); \
arguments 4 and 5.)
The following code tries hard to be optimal. A general assuption
- (which is true accoriding to the data books I have) is that
+ (which is true according to the data books I have) is that
2 * xchg is more expensive than pushl + movl + popl
# Although $(zonedir) gets compiled into zic, it is useful to always
# specify it with -d on the command line so that it can be overridden on
# the command line of `make install' (e.g., "make install prefix=/foo").
-zic-cmd = $(dir $(word 2,$^))$(notdir $(word 2,$^)) -d $(zonedir)
+zic-cmd = $(built-program-cmd) -d $(zonedir)
define tzcompile
$(zic-cmd) -L $(word 3,$^) -y $(dir $(word 4,$^))$(notdir $(word 4,$^)) $<
endef