diff options
author | Nick Clifton <nickc@redhat.com> | 2009-07-23 13:00:30 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2009-07-23 13:00:30 +0000 |
commit | 3e7a7d11f1106a451c26b49fcb8fafb5059fd684 (patch) | |
tree | b3d0c290c25b650e408ec3f60e770f56bb1f5be6 /binutils | |
parent | 6ec8e7022b6b6a69ee682d1797e8bfec473aae11 (diff) | |
download | gdb-3e7a7d11f1106a451c26b49fcb8fafb5059fd684.zip gdb-3e7a7d11f1106a451c26b49fcb8fafb5059fd684.tar.gz gdb-3e7a7d11f1106a451c26b49fcb8fafb5059fd684.tar.bz2 |
* config/obj-elf.c (obj_elf_type): Add code to support a type of
gnu_unique_object.
* doc/as.texinfo: Document new feature of .type directive.
* NEWS: Mention support for gnu_unique_object symbol type.
* common.h (STB_GNU_UNIQUE): Define.
* NEWS: Mention the linker's support for symbols with a binding of
STB_GNU_UNIQUE.
* gas/elf/type.s: Add unique global symbol definition.
* gas/elf/type.e: Add expected readelf output for global unique
symbol.
* elfcpp.h (enum STB): Add STB_GNU_UNIQUE.
* readelf.c (get_symbol_binding): For Linux targeted files return
UNIQUE for symbols with the STB_GNU_UNIQUE binding.
* doc/binutils.texi: Document the meaning of the 'u' symbol
binding in the output of nm and objdump --syms.
* elf-bfd.h (struct elf_link_hash_entry): Add unique_global field.
* elf.c (swap_out_syms): Set binding to STB_GNU_UNIQUE for symbols
with the BSF_GNU_UNIQUE flag bit set.
* elfcode.h (elf_slurp_symbol_table): Set the BSF_GNU_UNIQUE flag
for symbols with STB_GNU_UNIQUE binding.
* elflink.c (_bfd_elf_merge_symbol): Set unique_global for symbols
with the STB_GNU_UNIQUE binding.
(elf_link_add_object_symbols): Set the BSF_GNU_UNIQUE flag for
symbols with STB_GNU_UNIQUE binding. Set STB_GNU_UNIQUE for
symbols with the unique_global field set.
(elf_link_output_extsym): Set unique_global field for symbols with
the STB_GNU_UNIQUE binding.
* syms.c (struct bfd_symbol): Define BSF_GNU_UNIQUE flag bit.
(bfd_print_symbol_vandf): Print a 'u' character for BSF_GNU_UNIQUE
symbols.
(bfd_decode_symclass): Return a 'u' character for BSF_GNU_UNIQUE
symbols.
* bfd-in2.h: Regenerate.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 7 | ||||
-rw-r--r-- | binutils/doc/binutils.texi | 23 | ||||
-rw-r--r-- | binutils/readelf.c | 9 |
3 files changed, 35 insertions, 4 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 89b1a66..28caa23 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,10 @@ +2009-07-23 Ulrich Drepper <drepper@redhat.com> + + * readelf.c (get_symbol_binding): For Linux targeted files return + UNIQUE for symbols with the STB_GNU_UNIQUE binding. + * doc/binutils.texi: Document the meaning of the 'u' symbol + binding in the output of nm and objdump --syms. + 2009-07-20 H.J. Lu <hongjiu.lu@intel.com> * NEWS: Mention --insn-width. diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi index 98438f2..a5856b2 100644 --- a/binutils/doc/binutils.texi +++ b/binutils/doc/binutils.texi @@ -745,7 +745,13 @@ object file formats permit more efficient access to small data objects, such as a global int variable as opposed to a large global array. @item i -The symbol is in a section specific to the implementation of DLLs. +For PE format files this indicates that the symbol is in a section +specific to the implementation of DLLs. For ELF format files this +indicates that the symbol is an indirect function. This is a GNU +extension to the standard set of ELF symbol types. It indicates a +symbol which if referenced by a relocation does not evaluate to its +address, but instead must be invoked at runtime. The runtime +execution will then return the value to be used in the relocation. @item N The symbol is a debugging symbol. @@ -768,6 +774,12 @@ The symbol is in the text (code) section. @item U The symbol is undefined. +@item u +The symbol is a unique global symbol. This is a GNU extension to the +standard set of ELF symbol bindings. For such a symbol the dynamic linker +will make sure that in the entire process there is just one symbol with +this name and type in use. + @item V @itemx v The symbol is a weak object. When a weak defined symbol is linked with @@ -2142,11 +2154,16 @@ The flag characters are divided into 7 groups as follows: @table @code @item l @itemx g +@itemx u @itemx ! -The symbol is local (l), global (g), neither (a space) or both (!). A +The symbol is a local (l), global (g), unique global (u), neither +global nor local (a space) or both global and local (!). A symbol can be neither local or global for a variety of reasons, e.g., because it is used for debugging, but it is probably an indication of -a bug if it is ever both local and global. +a bug if it is ever both local and global. Unique global symbols are +a GNU extension to the standard set of ELF symbol bindings. For such +a symbol the dynamic linker will make sure that in the entire process +there is just one symbol with this name and type in use. @item w The symbol is weak (w) or strong (a space). diff --git a/binutils/readelf.c b/binutils/readelf.c index ce739e6..f56e6c2 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -6902,7 +6902,14 @@ get_symbol_binding (unsigned int binding) snprintf (buff, sizeof (buff), _("<processor specific>: %d"), binding); else if (binding >= STB_LOOS && binding <= STB_HIOS) - snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding); + { + if (binding == STB_GNU_UNIQUE + && (elf_header.e_ident[EI_OSABI] == ELFOSABI_LINUX + /* GNU/Linux is still using the default value 0. */ + || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE)) + return "UNIQUE"; + snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding); + } else snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding); return buff; |