This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: A symbol version patch for glibc 2.x compatibility


On Tue, Nov 07, 2000 at 11:01:59AM -0800, Nick Clifton wrote:
> Other than that, I think that the patch is OK.  So, please could you
> extend your patch to update the documentation, and also include a new
> testsuite case to check the new functionality.
> 
> Cheers
> 	Nick

Here it is.

-- 
H.J. Lu (hjl@gnu.org)
---
2000-11-07  H.J. Lu  <hjl@gnu.org>

	* doc/as.texinfo (.symver): Updated for versioned symbol
	reference.

2000-11-06  H.J. Lu  <hjl@gnu.org>

	* obj.h (format_ops): Add the frob_file_before_adjust field.

	* config/obj-aout.c (aout_format_ops): Set the
	frob_file_before_adjust field to 0.
	* config/obj-coff.c (coff_format_ops): Likewise.
	* config/obj-ecoff.c (ecoff_format_ops): Likewise.

	* config/obj-elf.c (obj_elf_symver): Allow duplicated version
	name.
	(elf_frob_file_before_adjust): New function to remove unneeded
	versioned symbols from the symbol table.
	(elf_format_ops): Set the frob_file_before_adjust field to
	elf_frob_file_before_adjust.

	* config/obj-elf.h (obj_frob_file_before_adjust): Defined if
	not defined.

	* config/obj-multi.h (obj_frob_file_before_adjust): Defined.

Index: obj.h
===================================================================
RCS file: /work/cvs/gnu/binutils/gas/obj.h,v
retrieving revision 1.1.1.3
retrieving revision 1.2
diff -u -p -r1.1.1.3 -r1.2
--- obj.h	2000/05/30 05:36:04	1.1.1.3
+++ obj.h	2000/11/07 01:04:40	1.2
@@ -54,6 +54,7 @@ struct format_ops {
   void (*app_file) PARAMS ((const char *));
   void (*frob_symbol) PARAMS ((symbolS *, int *));
   void (*frob_file) PARAMS ((void));
+  void (*frob_file_before_adjust) PARAMS ((void));
   void (*frob_file_after_relocs) PARAMS ((void));
   bfd_vma (*s_get_size) PARAMS ((symbolS *));
   void (*s_set_size) PARAMS ((symbolS *, bfd_vma));
Index: config/obj-aout.c
===================================================================
RCS file: /work/cvs/gnu/binutils/gas/config/obj-aout.c,v
retrieving revision 1.1.1.8
retrieving revision 1.2
diff -u -p -r1.1.1.8 -r1.2
--- config/obj-aout.c	2000/09/17 23:02:05	1.1.1.8
+++ config/obj-aout.c	2000/11/07 01:04:42	1.2
@@ -732,6 +732,7 @@ const struct format_ops aout_format_ops 
   0,	/* app_file */
   obj_aout_frob_symbol,
   obj_aout_frob_file,
+  0,	/* frob_file_before_adjust */
   0,	/* frob_file_after_relocs */
   0,	/* s_get_size */
   0,	/* s_set_size */
Index: config/obj-coff.c
===================================================================
RCS file: /work/cvs/gnu/binutils/gas/config/obj-coff.c,v
retrieving revision 1.1.1.23
retrieving revision 1.2
diff -u -p -r1.1.1.23 -r1.2
--- config/obj-coff.c	2000/09/17 23:02:05	1.1.1.23
+++ config/obj-coff.c	2000/11/07 01:04:42	1.2
@@ -4653,6 +4653,7 @@ const struct format_ops coff_format_ops 
   c_dot_file_symbol,
   coff_frob_symbol,
   0,	/* frob_file */
+  0,	/* frob_file_before_adjust */
   coff_frob_file_after_relocs,
   0,	/* s_get_size */
   0,	/* s_set_size */
Index: config/obj-ecoff.c
===================================================================
RCS file: /work/cvs/gnu/binutils/gas/config/obj-ecoff.c,v
retrieving revision 1.1.1.5
retrieving revision 1.2
diff -u -p -r1.1.1.5 -r1.2
--- config/obj-ecoff.c	2000/09/17 23:02:05	1.1.1.5
+++ config/obj-ecoff.c	2000/11/07 01:04:42	1.2
@@ -309,6 +309,7 @@ const struct format_ops ecoff_format_ops
   ecoff_new_file,
   obj_ecoff_frob_symbol,
   ecoff_frob_file,
+  0,	/* frob_file_before_adjust */
   0,	/* frob_file_after_relocs */
   0,	/* s_get_size */
   0,	/* s_set_size */
Index: config/obj-elf.c
===================================================================
RCS file: /work/cvs/gnu/binutils/gas/config/obj-elf.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -p -r1.22 -r1.23
--- config/obj-elf.c	2000/10/11 18:23:38	1.22
+++ config/obj-elf.c	2000/11/07 01:04:42	1.23
@@ -1106,14 +1106,6 @@ obj_elf_symver (ignore)
 
   *input_line_pointer = c;
 
-  if (symbol_get_obj (sym)->versioned_name != NULL)
-    {
-      as_bad (_("multiple .symver directives for symbol `%s'"),
-	      S_GET_NAME (sym));
-      ignore_rest_of_line ();
-      return;
-    }
-
   SKIP_WHITESPACE ();
   if (*input_line_pointer != ',')
     {
@@ -1132,16 +1124,34 @@ obj_elf_symver (ignore)
       *input_line_pointer++ = c;
     }
 
-  symbol_get_obj (sym)->versioned_name = xstrdup (name);
+  if (symbol_get_obj (sym)->versioned_name == NULL)
+    {
+      symbol_get_obj (sym)->versioned_name = xstrdup (name);
 
-  *input_line_pointer = c;
+      *input_line_pointer = c;
 
-  if (strchr (symbol_get_obj (sym)->versioned_name, ELF_VER_CHR) == NULL)
+      if (strchr (symbol_get_obj (sym)->versioned_name,
+				  ELF_VER_CHR) == NULL)
+	{
+	  as_bad (_("missing version name in `%s' for symbol `%s'"),
+		  symbol_get_obj (sym)->versioned_name,
+		  S_GET_NAME (sym));
+	  ignore_rest_of_line ();
+	  return;
+	}
+    }
+  else
     {
-      as_bad (_("missing version name in `%s' for symbol `%s'"),
-	      symbol_get_obj (sym)->versioned_name, S_GET_NAME (sym));
-      ignore_rest_of_line ();
-      return;
+      if (strcmp (symbol_get_obj (sym)->versioned_name, name))
+	{
+	  as_bad (_("multiple versions [`%s'|`%s'] for symbol `%s'"),
+		  name, symbol_get_obj (sym)->versioned_name,
+		  S_GET_NAME (sym));
+	  ignore_rest_of_line ();
+	  return;
+	}
+
+      *input_line_pointer = c;
     }
 
   demand_empty_rest_of_line ();
@@ -1753,6 +1763,24 @@ elf_frob_file ()
 #endif
 }
 
+/* It removes any unneeded versioned symbols from the symbol table. */
+
+void
+elf_frob_file_before_adjust ()
+{
+  if (symbol_rootP)
+    {
+      symbolS *symp;
+
+      for (symp = symbol_rootP; symp; symp = symbol_next (symp))
+	if (symbol_get_obj (symp)->versioned_name
+	    && !S_IS_DEFINED (symp)
+	    && symbol_used_p (symp) == 0
+	    && symbol_used_in_reloc_p (symp) == 0)
+	  symbol_remove (symp, &symbol_rootP, &symbol_lastP);
+    }
+}
+
 /* It is required that we let write_relocs have the opportunity to
    optimize away fixups before output has begun, since it is possible
    to eliminate all fixups for a section and thus we never should
@@ -1957,6 +1985,7 @@ const struct format_ops elf_format_ops =
   elf_file_symbol,
   elf_frob_symbol,
   elf_frob_file,
+  elf_frob_file_before_adjust,
   elf_frob_file_after_relocs,
   elf_s_get_size, elf_s_set_size,
   elf_s_get_align, elf_s_set_align,
Index: config/obj-elf.h
===================================================================
RCS file: /work/cvs/gnu/binutils/gas/config/obj-elf.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -p -r1.8 -r1.9
--- config/obj-elf.h	2000/09/17 23:09:52	1.8
+++ config/obj-elf.h	2000/11/07 01:04:42	1.9
@@ -132,6 +132,11 @@ extern asection *gdb_section;
 #endif
 extern void elf_frob_file PARAMS ((void));
 
+#ifndef obj_frob_file_before_adjust
+#define obj_frob_file_before_adjust  elf_frob_file_before_adjust
+#endif
+extern void elf_frob_file_before_adjust PARAMS ((void));
+
 #ifndef obj_frob_file_after_relocs
 #define obj_frob_file_after_relocs  elf_frob_file_after_relocs
 #endif
Index: config/obj-multi.h
===================================================================
RCS file: /work/cvs/gnu/binutils/gas/config/obj-multi.h,v
retrieving revision 1.1.1.4
retrieving revision 1.2
diff -u -p -r1.1.1.4 -r1.2
--- config/obj-multi.h	2000/05/30 05:36:07	1.1.1.4
+++ config/obj-multi.h	2000/11/07 01:04:42	1.2
@@ -50,6 +50,11 @@
 	 ? (*this_format->frob_file) ()			\
 	 : (void) 0)
 
+#define obj_frob_file_before_adjust()			\
+	(this_format->frob_file_before_adjust		\
+	 ? (*this_format->frob_file_before_adjust) ()	\
+	 : (void) 0)
+
 #define obj_frob_file_after_relocs()			\
 	(this_format->frob_file_after_relocs		\
 	 ? (*this_format->frob_file_after_relocs) ()	\
Index: doc/as.texinfo
===================================================================
RCS file: /work/cvs/gnu/binutils/gas/doc/as.texinfo,v
retrieving revision 1.15
diff -u -p -r1.15 as.texinfo
--- doc/as.texinfo	2000/10/18 18:23:49	1.15
+++ doc/as.texinfo	2000/11/07 23:56:12
@@ -4938,8 +4938,8 @@ For ELF targets, the @code{.symver} dire
 @smallexample
 .symver @var{name}, @var{name2@@nodename}
 @end smallexample
-In this case, the symbol @var{name} must exist and be defined within the file
-being assembled.  The @code{.versym} directive effectively creates a symbol
+If the symbol @var{name} is defined within the file
+being assembled, the @code{.versym} directive effectively creates a symbol
 alias with the name @var{name2@@nodename}, and in fact the main reason that we
 just don't try and create a regular alias is that the @var{@@} character isn't
 permitted in symbol names.  The @var{name2} part of the name is the actual name
@@ -4952,6 +4952,11 @@ the name of a node specified in the vers
 building a shared library.  If you are attempting to override a versioned
 symbol from a shared library, then @var{nodename} should correspond to the
 nodename of the symbol you are trying to override.
+
+If the symbol @var{name} is not defined within the file being assembled, all
+references to @var{name} will be changed to @var{name2@@nodename}.  If no
+reference to @var{name} is made, @var{name2@@nodename} will be removed from the
+symbol table.
 @end ifset
 
 @ifset COFF

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]