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] |
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] |