This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: A symbol version patch for glibc 2.x compatibility
- To: Nick Clifton <nickc at redhat dot com>
- Subject: Re: A symbol version patch for glibc 2.x compatibility
- From: "H . J . Lu" <hjl at valinux dot com>
- Date: Tue, 7 Nov 2000 16:03:42 -0800
- Cc: binutils at sourceware dot cygnus dot com, libc-hacker at sourceware dot cygnus dot com
- References: <200011071901.LAA30915@elmo.cygnus.com>
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