diff options
author | Cary Coutant <ccoutant@google.com> | 2008-04-04 17:24:47 +0000 |
---|---|---|
committer | Cary Coutant <ccoutant@google.com> | 2008-04-04 17:24:47 +0000 |
commit | 86925eef33811b6ca76006e539314a7de652b5c8 (patch) | |
tree | 860e974f6df678882727d8b0a9fd35c227e86fa7 /gold/symtab.h | |
parent | 594ab6a333bf85639e6839a924534fa264616c39 (diff) | |
download | gdb-86925eef33811b6ca76006e539314a7de652b5c8.zip gdb-86925eef33811b6ca76006e539314a7de652b5c8.tar.gz gdb-86925eef33811b6ca76006e539314a7de652b5c8.tar.bz2 |
2008-04-04 Cary Coutant <ccoutant@google.com>
* symtab.h (Symbol::is_weak_undefined): New function.
(Symbol::is_strong_undefined): New function.
(Symbol::is_absolute): New function.
(Symbol::needs_plt_entry): Exclude weak undefined symbols.
(Symbol::needs_dynamic_reloc): Exclude weak undefined and
absolute symbols.
* testsuite/Makefile.am (check_PROGRAMS): Add weak_undef_test.
(weak_undef_test): New target.
* testsuite/Makefile.in: Rebuild.
* testsuite/weak_undef_file1.cc: New file.
* testsuite/weak_undef_file2.cc: New file.
* testsuite/weak_undef_test.cc: New file.
Diffstat (limited to 'gold/symtab.h')
-rw-r--r-- | gold/symtab.h | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/gold/symtab.h b/gold/symtab.h index bd41794..e262cd4 100644 --- a/gold/symtab.h +++ b/gold/symtab.h @@ -405,6 +405,31 @@ class Symbol return this->source_ == FROM_OBJECT && this->shndx() == elfcpp::SHN_UNDEF; } + // Return whether this is a weak undefined symbol. + bool + is_weak_undefined() const + { + return (this->source_ == FROM_OBJECT + && this->binding() == elfcpp::STB_WEAK + && this->shndx() == elfcpp::SHN_UNDEF); + } + + // Return whether this is a strong (i.e., not weak) undefined symbol. + bool + is_strong_undefined() const + { + return (this->source_ == FROM_OBJECT + && this->binding() != elfcpp::STB_WEAK + && this->shndx() == elfcpp::SHN_UNDEF); + } + + // Return whether this is an absolute symbol. + bool + is_absolute() const + { + return this->source_ == FROM_OBJECT && this->shndx() == elfcpp::SHN_ABS; + } + // Return whether this is a common symbol. bool is_common() const @@ -453,7 +478,7 @@ class Symbol return (!parameters->doing_static_link() && this->type() == elfcpp::STT_FUNC && (this->is_from_dynobj() - || this->is_undefined() + || this->is_strong_undefined() || this->is_preemptible())); } @@ -481,6 +506,11 @@ class Symbol if (parameters->doing_static_link()) return false; + // A reference to a weak undefined symbol or to an absolute symbol + // does not need a dynamic relocation. + if (this->is_weak_undefined() || this->is_absolute()) + return false; + // An absolute reference within a position-independent output file // will need a dynamic relocation. if ((flags & ABSOLUTE_REF) |