about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog15
-rw-r--r--Makerules8
-rw-r--r--math/Makefile4
-rw-r--r--stdlib/canonicalize.c9
-rw-r--r--sysdeps/arm/dl-machine.h25
-rw-r--r--sysdeps/i386/dl-machine.h26
6 files changed, 85 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index e0d4e7822b..bf84dc0879 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2002-11-15  Jakub Jelinek  <jakub@redhat.com>
+
+	* sysdeps/i386/dl-machine.h (elf_machine_rela): Handle R_386_COPY.
+	* sysdeps/arm/dl-machine.h (elf_machine_rela): Handle R_ARM_COPY.
+
+2002-11-15  Roland McGrath  <roland@redhat.com>
+
+	* math/Makefile (libm-calls): Change s_ldexp to m_ldexp.
+	* Makerules ($(+sysdir_pfx)sysd-rules): Emit pattern rules for m_%.[Sc]
+	from sysdeps/.../s_%.[Sc] with commands $(+make-include-of-dep).
+	(+make-include-of-dep): New canned sequence.
+
+	* stdlib/canonicalize.c (__realpath): Check for malloc failure.
+	From Dmitry V. Levin <ldv@altlinux.org>.
+
 2002-11-14  Roland McGrath  <roland@redhat.com>
 
 	* sysdeps/generic/errno.c (__libc_errno): Remove alias.
diff --git a/Makerules b/Makerules
index 89e8c0eb58..d8d7f970ba 100644
--- a/Makerules
+++ b/Makerules
@@ -283,6 +283,8 @@ $(+sysdir_pfx)sysd-rules: $(+sysdir_pfx)config.make $(..)Makerules \
 		\$$(+make-deps)";					      \
 	   echo "\$$(objpfx)rtld-%.d: $$dir/%.c \$$(before-compile); \
 		\$$(+make-deps)";					      \
+	   echo "\$$(objpfx)m_%.S: $$dir/s_%.S; \$$(+make-include-of-dep)";   \
+	   echo "\$$(objpfx)m_%.c: $$dir/s_%.c; \$$(+make-include-of-dep)";   \
 	 done;								      \
 	 echo 'sysd-rules-done = t') > $@T
 	mv -f $@T $@
@@ -292,6 +294,12 @@ ifndef sysd-rules-done
 no_deps=t
 endif
 
+# This is used by the m_%.[Sc] pattern rules in sysd-rules.
+define +make-include-of-dep
+echo '#include <$<>' > $@T
+mv -f $@T $@
+endef
+
 # Generate version maps, but wait until sysdep-subdirs is known
 ifeq ($(sysd-sorted-done),t)
 ifeq ($(versioning),yes)
diff --git a/math/Makefile b/math/Makefile
index 045cdb2a6a..b710c372e0 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -46,7 +46,7 @@ libm-calls = e_acos e_acosh e_asin e_atan2 e_atanh e_cosh e_exp e_fmod	\
 	     e_rem_pio2 e_remainder e_scalb e_sinh e_sqrt e_gamma_r	\
 	     k_cos k_rem_pio2 k_sin k_tan s_asinh s_atan s_cbrt		\
 	     s_ceil s_copysign s_cos s_erf s_expm1 s_fabs s_finite	\
-	     s_floor s_frexp s_ilogb s_ldexp s_log1p s_logb		\
+	     s_floor s_frexp s_ilogb m_ldexp s_log1p s_logb		\
 	     s_modf s_nextafter s_nexttoward s_rint s_scalbn s_scalbln	\
 	     s_significand s_sin s_tan s_tanh w_acos w_acosh w_asin	\
 	     w_atan2 w_atanh w_cosh w_drem w_exp w_exp2 w_exp10 w_fmod	\
@@ -74,6 +74,8 @@ distribute += $(long-m-yes:=.c)
 # These functions are in libc instead of libm because __printf_fp
 # calls them, so any program using printf will need them linked in,
 # and we don't want to have to link every program with -lm.
+# In libm-calls (above), list m_foo in place of s_foo for any
+# routine that should be compiled separately for its libc and libm versions.
 calls = s_isinf s_isnan s_finite s_copysign s_modf s_scalbn s_frexp s_ldexp \
 	s_signbit
 routines = $(calls) $(calls:=f) $(long-c-$(long-double-fcts))
diff --git a/stdlib/canonicalize.c b/stdlib/canonicalize.c
index 3394048fb3..5c55c5dbd1 100644
--- a/stdlib/canonicalize.c
+++ b/stdlib/canonicalize.c
@@ -73,7 +73,14 @@ __realpath (const char *name, char *resolved)
     path_max = 1024;
 #endif
 
-  rpath = resolved ? __alloca (path_max) : malloc (path_max);
+  if (resolved == NULL)
+    {
+      rpath = malloc (path_max);
+      if (rpath == NULL)
+	return NULL;
+    }
+  else
+    rpath = resolved;
   rpath_limit = rpath + path_max;
 
   if (name[0] != '/')
diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h
index e3e666a42f..074762e1f0 100644
--- a/sysdeps/arm/dl-machine.h
+++ b/sysdeps/arm/dl-machine.h
@@ -554,12 +554,37 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
     return;
   else
     {
+# ifndef RESOLVE_CONFLICT_FIND_MAP
+      const Elf32_Sym *const refsym = sym;
+# endif
       Elf32_Addr value = RESOLVE (&sym, version, r_type);
       if (sym)
 	value += sym->st_value;
 
       switch (r_type)
 	{
+#  ifndef RESOLVE_CONFLICT_FIND_MAP
+	  /* Not needed for dl-conflict.c.  */
+	case R_ARM_COPY:
+	  if (sym == NULL)
+	    /* This can happen in trace mode if an object could not be
+	       found.  */
+	    break;
+	  if (sym->st_size > refsym->st_size
+	      || (GL(dl_verbose) && sym->st_size < refsym->st_size))
+	    {
+	      const char *strtab;
+
+	      strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
+	      _dl_error_printf ("\
+%s: Symbol `%s' has different size in shared object, consider re-linking\n",
+				rtld_progname ?: "<program name unknown>",
+				strtab + refsym->st_name);
+	    }
+	  memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
+						   refsym->st_size));
+	  break;
+#  endif /* !RESOLVE_CONFLICT_FIND_MAP */
 	case R_ARM_GLOB_DAT:
 	case R_ARM_JUMP_SLOT:
 	case R_ARM_ABS32:
diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h
index 4aa07373f8..add6f8e01b 100644
--- a/sysdeps/i386/dl-machine.h
+++ b/sysdeps/i386/dl-machine.h
@@ -514,6 +514,9 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
     *reloc_addr = map->l_addr + reloc->r_addend;
   else if (r_type != R_386_NONE)
     {
+# ifndef RESOLVE_CONFLICT_FIND_MAP
+      const Elf32_Sym *const refsym = sym;
+# endif
 # ifdef USE_TLS
       struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
       Elf32_Addr value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value;
@@ -568,6 +571,29 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
 	  CHECK_STATIC_TLS (map, sym_map);
 	  break;
 # endif	/* use TLS */
+# ifndef RESOLVE_CONFLICT_FIND_MAP
+	  /* Not needed for dl-conflict.c.  */
+	case R_386_COPY:
+	  if (sym == NULL)
+	    /* This can happen in trace mode if an object could not be
+	       found.  */
+	    break;
+	  if (__builtin_expect (sym->st_size > refsym->st_size, 0)
+	      || (__builtin_expect (sym->st_size < refsym->st_size, 0)
+		  && GL(dl_verbose)))
+	    {
+	      const char *strtab;
+
+	      strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
+	      _dl_error_printf ("\
+%s: Symbol `%s' has different size in shared object, consider re-linking\n",
+				rtld_progname ?: "<program name unknown>",
+				strtab + refsym->st_name);
+	    }
+	  memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
+						   refsym->st_size));
+	  break;
+# endif /* !RESOLVE_CONFLICT_FIND_MAP */
 	default:
 	  /* We add these checks in the version to relocate ld.so only
 	     if we are still debugging.  */