summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog89
-rwxr-xr-xconfigure11
-rw-r--r--elf/Makefile14
-rw-r--r--elf/dl-deps.c2
-rw-r--r--elf/dl-load.c14
-rw-r--r--elf/dl-object.c12
-rw-r--r--elf/dl-open.c3
-rw-r--r--elf/do-rel.h4
-rw-r--r--elf/dynamic-link.h8
-rw-r--r--elf/rtld.c5
-rw-r--r--elf/tst-deep1.c36
-rw-r--r--elf/tst-deep1mod1.c14
-rw-r--r--elf/tst-deep1mod2.c16
-rw-r--r--elf/tst-deep1mod3.c17
-rw-r--r--fedora/branch.mk4
-rw-r--r--fedora/glibc.spec.in6
-rw-r--r--linuxthreads/ChangeLog7
-rw-r--r--linuxthreads/sysdeps/i386/tls.h2
-rw-r--r--locale/weight.h4
-rw-r--r--locale/weightwc.h4
-rw-r--r--malloc/malloc.c9
-rw-r--r--misc/daemon.c31
-rw-r--r--nis/ypclnt.c43
-rw-r--r--nptl/ChangeLog22
-rw-r--r--nptl/descr.h3
-rw-r--r--nptl/pthread_create.c25
-rw-r--r--nptl/sysdeps/pthread/createthread.c24
-rw-r--r--posix/regcomp.c8
-rw-r--r--sysdeps/generic/bits/dlfcn.h3
-rw-r--r--sysdeps/generic/ldsodefs.h3
-rw-r--r--sysdeps/unix/sysv/linux/i386/setuid.c1
-rw-r--r--sysdeps/unix/sysv/linux/ia64/sysdep.h20
-rw-r--r--sysdeps/unix/sysv/linux/sh/sysdep.h14
-rw-r--r--sysdeps/unix/sysv/linux/sys/mount.h13
-rw-r--r--sysdeps/x86_64/dl-machine.h9
35 files changed, 393 insertions, 107 deletions
diff --git a/ChangeLog b/ChangeLog
index 7aab6f0bd0..779d045778 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,94 @@
+2004-09-25 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/unix/sysv/linux/i386/setuid.c (__setuid): Remove second
+ result declaration.
+
+2004-09-22 Andreas Schwab <schwab@suse.de>
+
+ * sysdeps/unix/sysv/linux/ia64/sysdep.h: Adjust whitespace.
+
+2004-09-24 Ulrich Drepper <drepper@redhat.com>
+
+ * misc/daemon.c (daemon): Don't succeed if /dev/null cannot be
+ opened.
+
+ * nis/ypclnt.c (do_ypcall): Add one missing unlock. Simplify the
+ code a bit.
+
+ * misc/daemon.c (daemon): Define errno in case /dev/null is not
+ the correct device.
+
+ * nis/ypclnt.c (yp_bind_file): Optimize a bit. Minimal cleanups.
+
+2004-09-23 Andreas Jaeger <aj@suse.de>
+
+ * locale/weight.h (findidx): Remove static, it's not supported
+ anymore with GCC 4.0 in a block scope.
+ * locale/weightwc.h (findidx): Likewise.
+ * posix/regcomp.c (seek_collating_symbol_entry): Likewise.
+ (lookup_collation_sequence_value): Likewise.
+ (build_range_exp): Likewise.
+ (build_collating_symbol): Likewise.
+ * iconv/iconvconfig.c (write_output): Likewise.
+ * elf/do-rel.h (elf_dynamic_do_rel): Likewise.
+
+ * sysdeps/x86_64/dl-machine.h (elf_machine_rela_relative): Remove
+ static, add always_inline attribute.
+ (elf_machine_rela): Likewise.
+ (elf_machine_lazy_rel): Likewise.
+
+ * elf/dynamic-link.h (elf_get_dynamic_info): Make static dependend
+ on !RESOLVE so that it's not defined in local scope.
+
+2004-09-23 Kaz Kojima <kkojima@rr.iij4u.or.jp>
+
+ * sysdeps/unix/sysv/linux/sh/sysdep.h (INTERNAL_SYSCALL_NCS): Define.
+
+2004-09-23 Thorsten Kukuk <kukuk@suse.de>
+
+ * sysdeps/unix/sysv/linux/sys/mount.h: Sync MS_RMT_MASK flag
+ and BLK* ioctls with linux kernel headers.
+
+2004-09-23 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/generic/bits/dlfcn.h: Add RTLD_DEEPBIND.
+ * elf/dl-object.c (_dl_new_object): Add new parameter mode. If mode
+ has RTLD_DEEPBIND set add local searchlist before global scope.
+ * sysdeps/generic/ldsodefs.h (_dl_new_object): Adjust prototype.
+ * elf/rtld.c: Adjust callers of _dl_new_object.
+ * elf/dl-load.c: Likewise.
+ (_dl_map_object_from_fd): If RTLD_DEEPBIND is used, don't do anything
+ for DF_SYMBOLIC.
+ * elf/dl-open.c (dl_open_writer): Pass RTLD_DEEPBIND flag on to
+ _dl_map_object_deps.
+ * elf/tst-deep1.c: New file.
+ * elf/tst-deep1mod1.c: New file.
+ * elf/tst-deep1mod2.c: New file.
+ * elf/tst-deep1mod3.c: New file.
+ * elf/Makefile: Add rules to build and run new tests.
+
+ * elf/dl-deps.c: Pretty printing.
+
+2004-09-23 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/unix/alpha/sysdep.h (inline_syscall[0-6]): Change name
+ argument to numbers from syscall names.
+ (INLINE_SYSCALL1): Pass __NR_##name to inline_syscall##nr.
+ (INTERNAL_SYSCALL_NCS): Renamed from...
+ (INTERNAL_SYSCALL_1): ... this. Use INTERNAL_SYSCALL_NCS.
+ * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
+ (INTERNAL_SYSCALL_NCS): Define.
+ * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
+ (INTERNAL_SYSCALL_NCS): Likewise.
+ * sysdeps/unix/sysv/linux/sparc/sysdep.h (inline_syscall[0-6]):
+ Change name argument to numbers from syscall names.
+ (INLINE_SYSCALL, INTERNAL_SYSCALL): Adjust.
+ (INTERNAL_SYSCALL_NCS): Define.
+
2004-09-22 Ulrich Drepper <drepper@redhat.com>
+ * malloc/malloc.c (malloc_printerr): Use syslog if writev failed.
+
* string/string.h: Add __nonnull annotations.
* stdlib/stdlib.h: Likewise.
diff --git a/configure b/configure
index 4e0ea1b765..6f9bde759d 100755
--- a/configure
+++ b/configure
@@ -6842,15 +6842,10 @@ rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
echo "${ECHO_T}$have_selinux" >&6
fi
- if test x$with_selinux = xauto ; then
+ if test x$with_selinux = xyes ; then
if test x$have_selinux = xno ; then
- { echo "$as_me:$LINENO: WARNING: Sufficiently new SELinux library not found" >&5
-echo "$as_me: WARNING: Sufficiently new SELinux library not found" >&2;}
- fi
- else
- if test x$have_selinux = xno ; then
- { { echo "$as_me:$LINENO: error: SELinux explicitly required, and SELinux library not found" >&5
-echo "$as_me: error: SELinux explicitly required, and SELinux library not found" >&2;}
+ { { echo "$as_me:$LINENO: error: SELinux explicitly required, but sufficiently recent SELinux library not found" >&5
+echo "$as_me: error: SELinux explicitly required, but sufficiently recent SELinux library not found" >&2;}
{ (exit 1); exit 1; }; }
fi
fi
diff --git a/elf/Makefile b/elf/Makefile
index ac8319bc5f..d40d3fd6a7 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -82,7 +82,8 @@ distribute := rtld-Rules \
tst-array1.exp tst-array2.exp tst-array4.exp \
tst-array2dep.c tst-piemod1.c \
tst-execstack-mod.c tst-dlmodcount.c \
- check-textrel.c dl-sysdep.h test-dlopenrpathmod.c
+ check-textrel.c dl-sysdep.h test-dlopenrpathmod.c \
+ tst-deep1mod1.c tst-deep1mod2.c tst-deep1mod3.c
CFLAGS-dl-runtime.c = -fexceptions -fasynchronous-unwind-tables
CFLAGS-dl-lookup.c = -fexceptions -fasynchronous-unwind-tables
@@ -152,7 +153,8 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
restest2 next dblload dblunload reldep5 reldep6 reldep7 reldep8 \
circleload1 tst-tls3 tst-tls4 tst-tls5 tst-tls6 tst-tls7 tst-tls8 \
tst-tls10 tst-tls11 tst-tls12 tst-tls13 tst-tls14 tst-align \
- $(tests-execstack-$(have-z-execstack)) tst-dlmodcount tst-dlopenrpath
+ $(tests-execstack-$(have-z-execstack)) tst-dlmodcount \
+ tst-dlopenrpath tst-deep1
# reldep9
test-srcs = tst-pathopt
tests-vis-yes = vismain
@@ -185,7 +187,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
reldep8mod1 reldep8mod2 reldep8mod3 \
reldep9mod1 reldep9mod2 reldep9mod3 \
tst-alignmod $(modules-execstack-$(have-z-execstack)) \
- tst-dlopenrpathmod
+ tst-dlopenrpathmod tst-deep1mod1 tst-deep1mod2 tst-deep1mod3
ifeq (yes,$(have-initfini-array))
modules-names += tst-array2dep
endif
@@ -754,3 +756,9 @@ $(objpfx)tst-dlopenrpath: $(objpfx)tst-dlopenrpathmod.so $(libdl)
CFLAGS-tst-dlopenrpath.c += -DPFX=\"$(objpfx)\"
LDFLAGS-tst-dlopenrpathmod.so += -Wl,-rpath,\$$ORIGIN/test-subdir
$(objpfx)tst-dlopenrpath.out: $(objpfx)firstobj.so
+
+$(objpfx)tst-deep1mod2.so: $(objpfx)tst-deep1mod3.so
+$(objpfx)tst-deep1: $(libdl) $(objpfx)tst-deep1mod1.so
+$(objpfx)tst-deep1.out: $(objpfx)tst-deep1mod2.so
+LDFLAGS-tst-deep1 += -rdynamic
+tst-deep1mod3.so-no-z-defs = yes
diff --git a/elf/dl-deps.c b/elf/dl-deps.c
index b8dee8ab52..1a0fedf988 100644
--- a/elf/dl-deps.c
+++ b/elf/dl-deps.c
@@ -509,7 +509,7 @@ _dl_map_object_deps (struct link_map *map,
runp->map->l_reserved = 0;
}
- if (__builtin_expect(GLRO(dl_debug_mask) & DL_DEBUG_PRELINK, 0) != 0
+ if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK, 0) != 0
&& map == GL(dl_loaded))
{
/* If we are to compute conflicts, we have to build local scope
diff --git a/elf/dl-load.c b/elf/dl-load.c
index 73112bce23..15fff3c5e1 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -881,7 +881,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
#endif
/* Enter the new object in the list of loaded objects. */
- l = _dl_new_object (realname, name, l_type, loader);
+ l = _dl_new_object (realname, name, l_type, loader, mode);
if (__builtin_expect (! l, 0))
{
errstring = N_("cannot create shared object descriptor");
@@ -1355,15 +1355,12 @@ cannot enable executable stack as shared object requires");
/* If this object has DT_SYMBOLIC set modify now its scope. We don't
have to do this for the main map. */
- if (__builtin_expect (l->l_info[DT_SYMBOLIC] != NULL, 0)
+ if ((mode & RTLD_DEEPBIND) == 0
+ && __builtin_expect (l->l_info[DT_SYMBOLIC] != NULL, 0)
&& &l->l_searchlist != l->l_scope[0])
{
/* Create an appropriate searchlist. It contains only this map.
-
- XXX This is the definition of DT_SYMBOLIC in SysVr4. The old
- GNU ld.so implementation had a different interpretation which
- is more reasonable. We are prepared to add this possibility
- back as part of a GNU extension of the ELF format. */
+ This is the definition of DT_SYMBOLIC in SysVr4. */
l->l_symbolic_searchlist.r_list =
(struct link_map **) malloc (sizeof (struct link_map *));
@@ -1968,7 +1965,8 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
/* Enter the new object in the list of loaded objects. */
if ((name_copy = local_strdup (name)) == NULL
- || (l = _dl_new_object (name_copy, name, type, loader)) == NULL)
+ || (l = _dl_new_object (name_copy, name, type, loader,
+ mode)) == NULL)
_dl_signal_error (ENOMEM, name, NULL,
N_("cannot create shared object descriptor"));
/* Signal that this is a faked entry. */
diff --git a/elf/dl-object.c b/elf/dl-object.c
index 52131181b3..91b1fa2187 100644
--- a/elf/dl-object.c
+++ b/elf/dl-object.c
@@ -32,7 +32,7 @@
struct link_map *
internal_function
_dl_new_object (char *realname, const char *libname, int type,
- struct link_map *loader)
+ struct link_map *loader, int mode)
{
struct link_map *l;
int idx;
@@ -95,7 +95,15 @@ _dl_new_object (char *realname, const char *libname, int type,
/* Insert the scope if it isn't the global scope we already added. */
if (idx == 0 || &loader->l_searchlist != new->l_scope[0])
- new->l_scope[idx] = &loader->l_searchlist;
+ {
+ if ((mode & RTLD_DEEPBIND) != 0 && idx != 0)
+ {
+ new->l_scope[1] = new->l_scope[0];
+ idx = 0;
+ }
+
+ new->l_scope[idx] = &loader->l_searchlist;
+ }
new->l_local_scope[0] = &new->l_searchlist;
diff --git a/elf/dl-open.c b/elf/dl-open.c
index c352722e27..c9b4a45596 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -272,7 +272,8 @@ dl_open_worker (void *a)
}
/* Load that object's dependencies. */
- GLRO(dl_map_object_deps) (new, NULL, 0, 0, mode & __RTLD_DLOPEN);
+ GLRO(dl_map_object_deps) (new, NULL, 0, 0,
+ mode & (__RTLD_DLOPEN | RTLD_DEEPBIND));
/* So far, so good. Now check the versions. */
for (i = 0; i < new->l_searchlist.r_nlist; ++i)
diff --git a/elf/do-rel.h b/elf/do-rel.h
index 726418748c..990b9615e0 100644
--- a/elf/do-rel.h
+++ b/elf/do-rel.h
@@ -1,5 +1,5 @@
/* Do relocations for ELF dynamic linking.
- Copyright (C) 1995-2002, 2003 Free Software Foundation, Inc.
+ Copyright (C) 1995-2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -49,7 +49,7 @@
relocations; they should be set up to call _dl_runtime_resolve, rather
than fully resolved now. */
-static inline void __attribute__ ((always_inline))
+auto inline void __attribute__ ((always_inline))
elf_dynamic_do_rel (struct link_map *map,
ElfW(Addr) reladdr, ElfW(Addr) relsize,
int lazy)
diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h
index 5d48b16511..f9559dc59c 100644
--- a/elf/dynamic-link.h
+++ b/elf/dynamic-link.h
@@ -64,8 +64,12 @@ elf_machine_lazy_rel (struct link_map *map,
/* Read the dynamic section at DYN and fill in INFO with indices DT_*. */
-
-static inline void __attribute__ ((unused, always_inline))
+#ifndef RESOLVE
+static
+#else
+auto
+#endif
+inline void __attribute__ ((unused, always_inline))
elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
{
ElfW(Dyn) *dyn = l->l_ld;
diff --git a/elf/rtld.c b/elf/rtld.c
index b912124fca..28a33f26f3 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -879,7 +879,7 @@ of this helper program; chances are you did not intend to run this program.\n\
{
/* Create a link_map for the executable itself.
This will be what dlopen on "" returns. */
- _dl_new_object ((char *) "", "", lt_executable, NULL);
+ _dl_new_object ((char *) "", "", lt_executable, NULL, 0);
if (GL(dl_loaded) == NULL)
_dl_fatal_printf ("cannot allocate memory for link map\n");
GL(dl_loaded)->l_phdr = phdr;
@@ -1372,7 +1372,8 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n",
better be, since it's read-only and so we couldn't relocate it).
We just want our data structures to describe it as if we had just
mapped and relocated it normally. */
- struct link_map *l = _dl_new_object ((char *) "", "", lt_library, NULL);
+ struct link_map *l = _dl_new_object ((char *) "", "", lt_library, NULL,
+ 0);
if (__builtin_expect (l != NULL, 1))
{
static ElfW(Dyn) dyn_temp[DL_RO_DYN_TEMP_CNT] attribute_relro;
diff --git a/elf/tst-deep1.c b/elf/tst-deep1.c
new file mode 100644
index 0000000000..5428d13de4
--- /dev/null
+++ b/elf/tst-deep1.c
@@ -0,0 +1,36 @@
+#include <dlfcn.h>
+#include <stdio.h>
+
+int
+xyzzy (void)
+{
+ printf ("%s:%s\n", __FILE__, __func__);
+ return 21;
+}
+
+int
+back (void)
+{
+ printf ("%s:%s\n", __FILE__, __func__);
+ return 1;
+}
+
+extern int foo (void);
+
+static int
+do_test (void)
+{
+ void *p = dlopen ("$ORIGIN/tst-deep1mod2.so", RTLD_LAZY|RTLD_DEEPBIND);
+
+ int (*f) (void) = dlsym (p, "bar");
+ if (f == NULL)
+ {
+ puts (dlerror ());
+ return 1;
+ }
+
+ return foo () + f ();
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/elf/tst-deep1mod1.c b/elf/tst-deep1mod1.c
new file mode 100644
index 0000000000..cc922e6ea5
--- /dev/null
+++ b/elf/tst-deep1mod1.c
@@ -0,0 +1,14 @@
+#include <stdio.h>
+int
+foo (void)
+{
+ printf ("%s:%s\n", __FILE__, __func__);
+ return 1;
+}
+
+int
+baz (void)
+{
+ printf ("%s:%s\n", __FILE__, __func__);
+ return 20;
+}
diff --git a/elf/tst-deep1mod2.c b/elf/tst-deep1mod2.c
new file mode 100644
index 0000000000..b99caf0328
--- /dev/null
+++ b/elf/tst-deep1mod2.c
@@ -0,0 +1,16 @@
+#include <stdio.h>
+extern int baz (void);
+extern int xyzzy (void);
+int
+bar (void)
+{
+ printf ("%s:%s\n", __FILE__, __func__);
+ return baz () + xyzzy ();;
+}
+
+int
+back (void)
+{
+ printf ("%s:%s\n", __FILE__, __func__);
+ return -1;
+}
diff --git a/elf/tst-deep1mod3.c b/elf/tst-deep1mod3.c
new file mode 100644
index 0000000000..eee7d5c97b
--- /dev/null
+++ b/elf/tst-deep1mod3.c
@@ -0,0 +1,17 @@
+#include <stdio.h>
+
+extern int back (void);
+
+int
+baz (void)
+{
+ printf ("%s:%s\n", __FILE__, __func__);
+ return back ();
+}
+
+int
+xyzzy (void)
+{
+ printf ("%s:%s\n", __FILE__, __func__);
+ return 0;
+}
diff --git a/fedora/branch.mk b/fedora/branch.mk
index 95e9a8c0c6..e7c3bf9511 100644
--- a/fedora/branch.mk
+++ b/fedora/branch.mk
@@ -1,5 +1,5 @@
# This file is updated automatically by Makefile.
glibc-branch := fedora
glibc-base := HEAD
-fedora-sync-date := 2004-09-23 01:48 UTC
-fedora-sync-tag := fedora-glibc-20040923T0148
+fedora-sync-date := 2004-09-25 07:38 UTC
+fedora-sync-tag := fedora-glibc-20040925T0738
diff --git a/fedora/glibc.spec.in b/fedora/glibc.spec.in
index cb92c4ba71..416ad0dfe5 100644
--- a/fedora/glibc.spec.in
+++ b/fedora/glibc.spec.in
@@ -1,4 +1,4 @@
-%define glibcrelease 56
+%define glibcrelease 57
%define auxarches i586 i686 athlon sparcv9 alphaev6
%define prelinkarches noarch
%define nptlarches i386 i686 athlon x86_64 ia64 s390 s390x sparcv9 ppc ppc64
@@ -186,6 +186,7 @@ Summary: A Name Service Caching Daemon (nscd).
Group: System Environment/Daemons
Conflicts: kernel < 2.2.0
Requires: libselinux >= 1.17.10-1
+Conflicts: selinux-policy-targeted < 1.17.20
Prereq: /sbin/chkconfig, /usr/sbin/useradd, /usr/sbin/userdel, sh-utils
Autoreq: true
@@ -1238,6 +1239,9 @@ rm -f *.filelist*
%endif
%changelog
+* Sat Sep 25 2004 Jakub Jelinek <jakub@redhat.com> 2.3.3-57
+- update from CVS
+
* Wed Sep 22 2004 Roland McGrath <roland@redhat.com> 2.3.3-56
- migrated CVS to fedora-branch in sources.redhat.com glibc repository
- source tarballs renamed
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog
index 63d3faf364..63bb29bf73 100644
--- a/linuxthreads/ChangeLog
+++ b/linuxthreads/ChangeLog
@@ -1,3 +1,10 @@
+2004-09-24 Roland McGrath <roland@redhat.com>
+
+ [BZ #406]
+ * sysdeps/i386/tls.h: Move #include "useldt.h" outside
+ of [__ASSUME_LDT_WORKS > 0] test.
+ Reported by Carlos Velasco <carlos.velasco@newipnet.com>.
+
2004-09-21 Roland McGrath <roland@redhat.com>
* Versions: Add comment about linuxthreads' frozen ABI.
diff --git a/linuxthreads/sysdeps/i386/tls.h b/linuxthreads/sysdeps/i386/tls.h
index 84d87db359..30a6e59963 100644
--- a/linuxthreads/sysdeps/i386/tls.h
+++ b/linuxthreads/sysdeps/i386/tls.h
@@ -120,10 +120,10 @@ typedef struct
# define TLS_LOAD_EBX
# endif
+# include "useldt.h" /* For the structure. */
# if __ASSUME_LDT_WORKS > 0
# define TLS_DO_MODIFY_LDT_KERNEL_CHECK(doit) (doit) /* Nothing to check. */
# else
-# include "useldt.h" /* For the structure. */
# define TLS_DO_MODIFY_LDT_KERNEL_CHECK(doit) \
(__builtin_expect (GLRO(dl_osversion) < 131939, 0) \
? "kernel too old for thread-local storage support\n" \
diff --git a/locale/weight.h b/locale/weight.h
index d67e9d9c24..dc70a00be5 100644
--- a/locale/weight.h
+++ b/locale/weight.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996,1997,1998,1999,2000,2003 Free Software Foundation, Inc.
+/* Copyright (C) 1996,1997,1998,1999,2000,2003,2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Ulrich Drepper, <drepper@cygnus.com>.
@@ -18,7 +18,7 @@
02111-1307 USA. */
/* Find index of weight. */
-static inline int32_t
+auto inline int32_t
__attribute ((always_inline))
findidx (const unsigned char **cpp)
{
diff --git a/locale/weightwc.h b/locale/weightwc.h
index 9957893def..ff5e63aeef 100644
--- a/locale/weightwc.h
+++ b/locale/weightwc.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996-2000, 2001, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 1996-2000, 2001,2003,2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Ulrich Drepper, <drepper@cygnus.com>.
@@ -18,7 +18,7 @@
02111-1307 USA. */
/* Find index of weight. */
-static inline int32_t
+auto inline int32_t
__attribute ((always_inline))
findidx (const wint_t **cpp)
{
diff --git a/malloc/malloc.c b/malloc/malloc.c
index 665d7a4b3e..dcc54c46f1 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -285,6 +285,8 @@ extern "C" {
/* For writev and struct iovec. */
#include <sys/uio.h>
+ /* For syslog. */
+#include <sys/syslog.h>
/*
Debugging:
@@ -5467,7 +5469,12 @@ malloc_printerr(int action, const char *str, void *ptr)
iov[n].iov_base = cp;
iov[n].iov_len = &buf[sizeof (buf) - 1] - cp;
++n;
- TEMP_FAILURE_RETRY (__writev (STDERR_FILENO, iov, n));
+ if (TEMP_FAILURE_RETRY (__writev (STDERR_FILENO, iov, n)) == -1
+ && errno == EBADF)
+ /* Standard error is not opened. Try using syslog. */
+ syslog (LOG_ERR, "%s%s%s", (char *) iov[0].iov_base,
+ (char *) iov[1].iov_base,
+ n == 3 ? (const char *) iov[2].iov_base : "");
}
if (action & 2)
abort ();
diff --git a/misc/daemon.c b/misc/daemon.c
index bc93956e85..7597ce9996 100644
--- a/misc/daemon.c
+++ b/misc/daemon.c
@@ -61,21 +61,30 @@ daemon(nochdir, noclose)
if (!nochdir)
(void)__chdir("/");
- if (!noclose
- && (fd = open_not_cancel(_PATH_DEVNULL, O_RDWR, 0)) != -1) {
+ if (!noclose) {
struct stat64 st;
- if (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0) == 0
- && __builtin_expect (S_ISCHR (st.st_mode), 1) != 0
+ if ((fd = open_not_cancel(_PATH_DEVNULL, O_RDWR, 0)) != -1
+ && (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0)
+ == 0)) {
+ if (__builtin_expect (S_ISCHR (st.st_mode), 1) != 0
#if defined DEV_NULL_MAJOR && defined DEV_NULL_MINOR
- && st.st_rdev == makedev (DEV_NULL_MAJOR, DEV_NULL_MINOR)
+ && (st.st_rdev
+ == makedev (DEV_NULL_MAJOR, DEV_NULL_MINOR))
#endif
- ) {
- (void)__dup2(fd, STDIN_FILENO);
- (void)__dup2(fd, STDOUT_FILENO);
- (void)__dup2(fd, STDERR_FILENO);
- if (fd > 2)
- (void)__close (fd);
+ ) {
+ (void)__dup2(fd, STDIN_FILENO);
+ (void)__dup2(fd, STDOUT_FILENO);
+ (void)__dup2(fd, STDERR_FILENO);
+ if (fd > 2)
+ (void)__close (fd);
+ } else {
+ /* We must set an errno value since no
+ function call actually failed. */
+ close_not_cancel_no_status (fd);
+ __set_errno (ENODEV);
+ return -1;
+ }
} else {
close_not_cancel_no_status (fd);
return -1;
diff --git a/nis/ypclnt.c b/nis/ypclnt.c
index ab28e6002b..f25c7c710b 100644
--- a/nis/ypclnt.c
+++ b/nis/ypclnt.c
@@ -74,7 +74,7 @@ yp_bind_client_create (const char *domain, dom_binding *ysd,
if (ysd->dom_client != NULL)
{
/* If the program exits, close the socket */
- if (fcntl (ysd->dom_socket, F_SETFD, 1) == -1)
+ if (fcntl (ysd->dom_socket, F_SETFD, FD_CLOEXEC) == -1)
perror ("fcntl: F_SETFD");
}
}
@@ -83,23 +83,18 @@ yp_bind_client_create (const char *domain, dom_binding *ysd,
static void
yp_bind_file (const char *domain, dom_binding *ysd)
{
- struct ypbind_resp ypbr;
- char path[sizeof (BINDINGDIR) + strlen (domain) + 10];
- struct iovec vec[2];
- unsigned short port;
- int fd;
+ char path[sizeof (BINDINGDIR) + strlen (domain) + 3 * sizeof (unsigned) + 3];
- sprintf (path, "%s/%s.%d", BINDINGDIR, domain, YPBINDVERS);
- fd = open (path, O_RDONLY);
+ snprintf (path, sizeof (path), "%s/%s.%u", BINDINGDIR, domain, YPBINDVERS);
+ int fd = open (path, O_RDONLY);
if (fd >= 0)
{
- /* We have a binding file and could save a RPC call */
- vec[0].iov_base = &port;
- vec[0].iov_len = sizeof (port);
- vec[1].iov_base = &ypbr;
- vec[1].iov_len = sizeof (ypbr);
+ /* We have a binding file and could save a RPC call. The file
+ contains a port number and the YPBIND_RESP record. The port
+ number (16 bits) can be ignored. */
+ struct ypbind_resp ypbr;
- if (readv (fd, vec, 2) == sizeof (port) + sizeof (ypbr))
+ if (pread (fd, &ypbr, sizeof (ypbr), 2) == sizeof (ypbr))
yp_bind_client_create (domain, ysd, &ypbr);
close (fd);
@@ -183,9 +178,9 @@ __yp_bind (const char *domain, dom_binding **ypdb)
}
#if USE_BINDINGDIR
- /* Try binding dir at first if we have no binding */
+ /* Try binding dir at first if we have no binding */
if (ysd->dom_client == NULL)
- yp_bind_file (domain, ysd);
+ yp_bind_file (domain, ysd);
#endif /* USE_BINDINGDIR */
if (ysd->dom_client == NULL)
@@ -309,16 +304,10 @@ do_ypcall (const char *domain, u_long prog, xdrproc_t xargs,
status = YPERR_YPERR;
__libc_lock_lock (ypbindlist_lock);
- if (__ypbindlist != NULL)
+ ydb = __ypbindlist;
+ while (ydb != NULL)
{
- ydb = __ypbindlist;
- while (ydb != NULL)
- {
- if (strcmp (domain, ydb->dom_domain) == 0)
- break;
- ydb = ydb->dom_pnext;
- }
- if (ydb != NULL)
+ if (strcmp (domain, ydb->dom_domain) == 0)
{
if (__yp_bind (domain, &ydb) == 0)
{
@@ -327,6 +316,7 @@ do_ypcall (const char *domain, u_long prog, xdrproc_t xargs,
resp, &ydb, 0);
if (status == YPERR_SUCCESS)
{
+ __libc_lock_unlock (ypbindlist_lock);
__set_errno (saved_errno);
return status;
}
@@ -334,7 +324,10 @@ do_ypcall (const char *domain, u_long prog, xdrproc_t xargs,
/* We use ypbindlist, and the old cached data is
invalid. unbind now and create a new binding */
yp_unbind_locked (domain);
+
+ break;
}
+ ydb = ydb->dom_pnext;
}
__libc_lock_unlock (ypbindlist_lock);
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index b06743dcb7..2aff8c8dbb 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,25 @@
+2004-09-25 Ulrich Drepper <drepper@redhat.com>
+
+ * descr.h (struct pthread): Add stopped_start field.
+ * sysdeps/pthread/createthread.c (create_thread): Set
+ start_stopped flag in descriptor for new thread appropriately.
+ * pthread_create.c (start_thread): Only take lock to be stopped on
+ startup if stopped_start flag says so.
+
+2004-09-24 Ulrich Drepper <drepper@redhat.com>
+
+ * pthread_create.c (__pthread_create_2_1): Remember whether thread
+ is created detached and if yes, do not try to free the stack in case
+ the thread creation failed.
+ * sysdeps/pthread/createthread.c (do_clone): Free stack here if clone
+ call fails. Don't depend on INTERNAL_SYSCALL_ERRNO return zero in
+ case there has been no error. [BZ #405]
+
+ * pthread_create.c (start_thread): Don't wait for scheduler data
+ etc to be set at the beginning of the function. The cancellation
+ infrastructure must have been set up. And enable async
+ cancellation before potentially going to sleep. [BZ #401]
+
2004-09-20 Ulrich Drepper <drepper@redhat.com>
* Versions: Remove exports for pthread_set*id_np functions.
diff --git a/nptl/descr.h b/nptl/descr.h
index 89bfbd25ad..7ef4221e83 100644
--- a/nptl/descr.h
+++ b/nptl/descr.h
@@ -201,6 +201,9 @@ struct pthread
/* True if the user provided the stack. */
bool user_stack;
+ /* True if thread must stop at startup time. */
+ bool stopped_start;
+
/* Lock to synchronize access to the descriptor. */
lll_lock_t lock;
diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
index 160656863d..1bab72d1e9 100644
--- a/nptl/pthread_create.c
+++ b/nptl/pthread_create.c
@@ -227,11 +227,6 @@ start_thread (void *arg)
struct pthread *pd = (struct pthread *) arg;
- /* Get the lock the parent locked to force synchronization. */
- lll_lock (pd->lock);
- /* And give it up right away. */
- lll_unlock (pd->lock);
-
#if HP_TIMING_AVAIL
/* Remember the time when the thread was started. */
hp_timing_t now;
@@ -257,6 +252,18 @@ start_thread (void *arg)
/* Store the new cleanup handler info. */
THREAD_SETMEM (pd, cleanup_jmp_buf, &unwind_buf);
+ if (__builtin_expect (pd->stopped_start, 0))
+ {
+ int oldtype = CANCEL_ASYNC ();
+
+ /* Get the lock the parent locked to force synchronization. */
+ lll_lock (pd->lock);
+ /* And give it up right away. */
+ lll_unlock (pd->lock);
+
+ CANCEL_RESET (oldtype);
+ }
+
/* Run the code the user provided. */
#ifdef CALL_THREAD_FCT
THREAD_SETMEM (pd, result, CALL_THREAD_FCT (pd));
@@ -443,13 +450,19 @@ __pthread_create_2_1 (newthread, attr, start_routine, arg)
/* Pass the descriptor to the caller. */
*newthread = (pthread_t) pd;
+ /* Remember whether the thread is detached or not. In case of an
+ error we have to free the stacks of non-detached stillborn
+ threads. */
+ bool is_detached = IS_DETACHED (pd);
+
/* Start the thread. */
err = create_thread (pd, iattr, STACK_VARIABLES_ARGS);
if (err != 0)
{
errout:
/* Something went wrong. Free the resources. */
- __deallocate_stack (pd);
+ if (!is_detached)
+ __deallocate_stack (pd);
return err;
}
diff --git a/nptl/sysdeps/pthread/createthread.c b/nptl/sysdeps/pthread/createthread.c
index 49383cf769..8620519887 100644
--- a/nptl/sysdeps/pthread/createthread.c
+++ b/nptl/sysdeps/pthread/createthread.c
@@ -66,8 +66,16 @@ do_clone (struct pthread *pd, const struct pthread_attr *attr,
if (ARCH_CLONE (fct, STACK_VARIABLES_ARGS, clone_flags,
pd, &pd->tid, TLS_VALUE, &pd->tid) == -1)
- /* Failed. */
- return errno;
+ {
+ /* Failed. If the thread is detached, remove the TCB here since
+ the caller cannot do this. The caller remembered the thread
+ as detached and cannot reverify that it is not since it must
+ not access the thread descriptor again. */
+ if (IS_DETACHED (pd))
+ __deallocate_stack (pd);
+
+ return errno;
+ }
/* Now we have the possibility to set scheduling parameters etc. */
if (__builtin_expect (stopped != 0, 0))
@@ -95,7 +103,9 @@ do_clone (struct pthread *pd, const struct pthread_attr *attr,
(void) INTERNAL_SYSCALL (tkill, err2, 2, pd->tid, SIGCANCEL);
#endif
- return INTERNAL_SYSCALL_ERRNO (res, err);
+ return (INTERNAL_SYSCALL_ERROR_P (res, err)
+ ? INTERNAL_SYSCALL_ERRNO (res, err)
+ : 0);
}
}
@@ -176,6 +186,9 @@ create_thread (struct pthread *pd, const struct pthread_attr *attr,
if ((_mask & (__nptl_threads_events.event_bits[_idx]
| pd->eventbuf.eventmask.event_bits[_idx])) != 0)
{
+ /* We always must have the thread start stopped. */
+ pd->stopped_start = true;
+
/* Create the thread. We always create the thread stopped
so that it does not get far before we tell the debugger. */
int res = do_clone (pd, attr, clone_flags, start_thread,
@@ -214,10 +227,11 @@ create_thread (struct pthread *pd, const struct pthread_attr *attr,
/* Determine whether the newly created threads has to be started
stopped since we have to set the scheduling parameters or set the
affinity. */
- int stopped = 0;
+ bool stopped = false;
if (attr != NULL && (attr->cpuset != NULL
|| (attr->flags & ATTR_FLAG_NOTINHERITSCHED) != 0))
- stopped = 1;
+ stopped = true;
+ pd->stopped_start = stopped;
/* Actually create the thread. */
int res = do_clone (pd, attr, clone_flags, start_thread,
diff --git a/posix/regcomp.c b/posix/regcomp.c
index bc9e56bd02..9b435a885e 100644
--- a/posix/regcomp.c
+++ b/posix/regcomp.c
@@ -2682,7 +2682,7 @@ parse_bracket_exp (regexp, dfa, token, syntax, err)
Seek the collating symbol entry correspondings to NAME.
Return the index of the symbol in the SYMB_TABLE. */
- static inline int32_t
+ auto inline int32_t
__attribute ((always_inline))
seek_collating_symbol_entry (name, name_len)
const unsigned char *name;
@@ -2715,7 +2715,7 @@ parse_bracket_exp (regexp, dfa, token, syntax, err)
Look up the collation sequence value of BR_ELEM.
Return the value if succeeded, UINT_MAX otherwise. */
- static inline unsigned int
+ auto inline unsigned int
__attribute ((always_inline))
lookup_collation_sequence_value (br_elem)
bracket_elem_t *br_elem;
@@ -2783,7 +2783,7 @@ parse_bracket_exp (regexp, dfa, token, syntax, err)
mbcset->range_ends, is a pointer argument sinse we may
update it. */
- static inline reg_errcode_t
+ auto inline reg_errcode_t
__attribute ((always_inline))
build_range_exp (sbcset, mbcset, range_alloc, start_elem, end_elem)
re_charset_t *mbcset;
@@ -2866,7 +2866,7 @@ parse_bracket_exp (regexp, dfa, token, syntax, err)
COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
pointer argument sinse we may update it. */
- static inline reg_errcode_t
+ auto inline reg_errcode_t
__attribute ((always_inline))
build_collating_symbol (sbcset, mbcset, coll_sym_alloc, name)
re_charset_t *mbcset;
diff --git a/sysdeps/generic/bits/dlfcn.h b/sysdeps/generic/bits/dlfcn.h
index e96b5c17ae..67fd96a22a 100644
--- a/sysdeps/generic/bits/dlfcn.h
+++ b/sysdeps/generic/bits/dlfcn.h
@@ -1,5 +1,5 @@
/* System dependent definitions for run-time dynamic loading.
- Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc.
+ Copyright (C) 1996-2001, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -26,6 +26,7 @@
#define RTLD_NOW 0x00002 /* Immediate function call binding. */
#define RTLD_BINDING_MASK 0x3 /* Mask of binding time value. */
#define RTLD_NOLOAD 0x00004 /* Do not load the object. */
+#define RTLD_DEEPBIND 0x00008 /* Use deep binding. */
/* If the following bit is set in the MODE argument to `dlopen',
the symbols of the loaded object and its dependencies are made
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index be3d2dd61f..2b526867ad 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -722,7 +722,8 @@ extern ElfW(Addr) _dl_symbol_value (struct link_map *map, const char *name)
/* Allocate a `struct link_map' for a new object being loaded,
and enter it into the _dl_main_map list. */
extern struct link_map *_dl_new_object (char *realname, const char *libname,
- int type, struct link_map *loader)
+ int type, struct link_map *loader,
+ int mode)
internal_function attribute_hidden;
/* Relocate the given object (if it hasn't already been).
diff --git a/sysdeps/unix/sysv/linux/i386/setuid.c b/sysdeps/unix/sysv/linux/i386/setuid.c
index a11fb7f60c..0d948fb775 100644
--- a/sysdeps/unix/sysv/linux/i386/setuid.c
+++ b/sysdeps/unix/sysv/linux/i386/setuid.c
@@ -47,7 +47,6 @@ __setuid (uid_t uid)
# ifdef __NR_setuid32
if (__libc_missing_32bit_uids <= 0)
{
- int result;
int saved_errno = errno;
result = INLINE_SYSCALL (setuid32, 1, uid);
diff --git a/sysdeps/unix/sysv/linux/ia64/sysdep.h b/sysdeps/unix/sysv/linux/ia64/sysdep.h
index 0347641dfe..a4453ddcc7 100644
--- a/sysdeps/unix/sysv/linux/ia64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/ia64/sysdep.h
@@ -165,7 +165,7 @@
#undef PSEUDO_ERRVAL
#define PSEUDO_ERRVAL(name, syscall_name, args) \
- ENTRY(name) \
+ ENTRY(name) \
DO_CALL (SYS_ify(syscall_name)); \
cmp.eq p6,p0=-1,r10; \
(p6) mov r10=r8;
@@ -241,14 +241,14 @@
DO_INLINE_SYSCALL_NCS (__NR_##name, nr, ##args)
#undef INLINE_SYSCALL
-#define INLINE_SYSCALL(name, nr, args...) \
- ({ \
- DO_INLINE_SYSCALL_NCS(__NR_##name, nr, args)\
- if (_r10 == -1) \
- { \
- __set_errno (_retval); \
- _retval = -1; \
- } \
+#define INLINE_SYSCALL(name, nr, args...) \
+ ({ \
+ DO_INLINE_SYSCALL_NCS (__NR_##name, nr, args) \
+ if (_r10 == -1) \
+ { \
+ __set_errno (_retval); \
+ _retval = -1; \
+ } \
_retval; })
#undef INTERNAL_SYSCALL_DECL
@@ -257,7 +257,7 @@
#undef INTERNAL_SYSCALL
#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
({ \
- DO_INLINE_SYSCALL_NCS(name, nr, args) \
+ DO_INLINE_SYSCALL_NCS (name, nr, args) \
err = _r10; \
_retval; })
#define INTERNAL_SYSCALL(name, err, nr, args...) \
diff --git a/sysdeps/unix/sysv/linux/sh/sysdep.h b/sysdeps/unix/sysv/linux/sh/sysdep.h
index 35b8a58afa..aeec279de0 100644
--- a/sysdeps/unix/sysv/linux/sh/sysdep.h
+++ b/sysdeps/unix/sysv/linux/sh/sysdep.h
@@ -333,6 +333,20 @@
\
(int) resultvar; })
+/* The _NCS variant allows non-constant syscall numbers. */
+#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
+ ({ \
+ unsigned long int resultvar; \
+ register long int r3 asm ("%r3") = (name); \
+ SUBSTITUTE_ARGS_##nr(args); \
+ \
+ asm volatile (SYSCALL_INST_STR##nr SYSCALL_INST_PAD \
+ : "=z" (resultvar) \
+ : "r" (r3) ASMFMT_##nr \
+ : "memory"); \
+ \
+ (int) resultvar; })
+
#undef INTERNAL_SYSCALL_DECL
#define INTERNAL_SYSCALL_DECL(err) do { } while (0)
diff --git a/sysdeps/unix/sysv/linux/sys/mount.h b/sysdeps/unix/sysv/linux/sys/mount.h
index f768d4dc73..b30554987a 100644
--- a/sysdeps/unix/sysv/linux/sys/mount.h
+++ b/sysdeps/unix/sysv/linux/sys/mount.h
@@ -1,5 +1,5 @@
/* Header file for mounting/unmount Linux filesystems.
- Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1996,1997,1998,1999,2000,2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -62,7 +62,8 @@ enum
};
/* Flags that can be altered by MS_REMOUNT */
-#define MS_RMT_MASK (MS_RDONLY | MS_MANDLOCK)
+#define MS_RMT_MASK (MS_RDONLY|MS_SYNCHRONOUS|MS_MANDLOCK|MS_NOATIME \
+ |MS_NODIRATIME)
/* Magic mount flag number. Has to be or-ed to the flag values. */
@@ -82,6 +83,14 @@ enum
#define BLKFLSBUF _IO(0x12, 97) /* Flush buffer cache. */
#define BLKRASET _IO(0x12, 98) /* Set read ahead for block device. */
#define BLKRAGET _IO(0x12, 99) /* Get current read ahead setting. */
+#define BLKFRASET _IO(0x12,100) /* Set filesystem read-ahead. */
+#define BLKFRAGET _IO(0x12,101) /* Get filesystem read-ahead. */
+#define BLKSECTSET _IO(0x12,102) /* Set max sectors per request. */
+#define BLKSECTGET _IO(0x12,103) /* Get max sectors per request. */
+#define BLKSSZGET _IO(0x12,104) /* Get block device sector size. */
+#define BLKBSZGET _IOR(0x12,112,size_t)
+#define BLKBSZSET _IOW(0x12,113,size_t)
+#define BLKGETSIZE64 _IOR(0x12,114,size_t) /* return device size. */
/* Possible value for FLAGS parameter of `umount2'. */
diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h
index 302545f68f..b932f51d15 100644
--- a/sysdeps/x86_64/dl-machine.h
+++ b/sysdeps/x86_64/dl-machine.h
@@ -355,7 +355,8 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
MAP is the object containing the reloc. */
-static inline void
+auto inline void
+__attribute__ ((always_inline))
elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
const Elf64_Sym *sym, const struct r_found_version *version,
void *const reloc_addr_arg)
@@ -520,7 +521,8 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
}
}
-static inline void
+auto inline void
+__attribute ((always_inline))
elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
void *const reloc_addr_arg)
{
@@ -529,7 +531,8 @@ elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
*reloc_addr = l_addr + reloc->r_addend;
}
-static inline void
+auto inline void
+__attribute ((always_inline))
elf_machine_lazy_rel (struct link_map *map,
Elf64_Addr l_addr, const Elf64_Rela *reloc)
{