summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRainer Orth <ro@TechFak.Uni-Bielefeld.DE>2010-03-05 21:04:57 +0000
committerRainer Orth <ro@TechFak.Uni-Bielefeld.DE>2010-03-05 21:04:57 +0000
commitab127c9f571339775a84fe9c3d16eb76bbcd9d1a (patch)
tree8948cc8cb3cfd2d1d86b536cbea795e8e58e8102
parentcd7bebbcf23c92024741f9ca38928a921f1ece4d (diff)
downloadbinutils-redhat-ab127c9f571339775a84fe9c3d16eb76bbcd9d1a.tar.gz
include:
* elf/common.h (VER_FLG_*): Document. (VER_FLG_INFO): Define. gold: * dynobj.h (Verdef::Verdef): Add is_info arg, is_info member function, is_info_ member. * dynobj.cc (Verdef::write): Set VER_FLG_INFO if this->is_info_. (Versions::Versions): Update caller. (Versions::define_base_version): Likewise. (Versions::add_def): Likewise. elfcpp: * elfcpp.h (VER_FLG_INFO): Define. binutils: * readelf.c (get_ver_flags): Handle VER_FLG_INFO.
-rw-r--r--binutils/ChangeLog4
-rw-r--r--binutils/readelf.c10
-rw-r--r--elfcpp/ChangeLog4
-rw-r--r--elfcpp/elfcpp.h3
-rw-r--r--gold/ChangeLog9
-rw-r--r--gold/dynobj.cc9
-rw-r--r--gold/dynobj.h11
-rw-r--r--include/ChangeLog5
-rw-r--r--include/elf/common.h8
9 files changed, 54 insertions, 9 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 3d47c3c12e..128454ccc9 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,7 @@
+2010-03-05 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * readelf.c (get_ver_flags): Handle VER_FLG_INFO.
+
2010-03-02 Daniel Jacobowitz <dan@codesourcery.com>
* NEWS: Document .ARM.exidx / .ARM.extab support.
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 2c677598f9..e3b54873ad 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -7267,7 +7267,15 @@ get_ver_flags (unsigned int flags)
strcat (buff, "WEAK ");
}
- if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
+ if (flags & VER_FLG_INFO)
+ {
+ if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
+ strcat (buff, "| ");
+
+ strcat (buff, "INFO ");
+ }
+
+ if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
strcat (buff, "| <unknown>");
return buff;
diff --git a/elfcpp/ChangeLog b/elfcpp/ChangeLog
index a6c75cd184..6f97d25ea1 100644
--- a/elfcpp/ChangeLog
+++ b/elfcpp/ChangeLog
@@ -1,3 +1,7 @@
+2010-03-05 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * elfcpp.h (VER_FLG_INFO): Define.
+
2010-01-21 Doug Kwan <dougkwan@google.com>
* arm.h (EXIDX_CANTUNWIND): New enum.
diff --git a/elfcpp/elfcpp.h b/elfcpp/elfcpp.h
index 8ecbc0ae4c..52b8b2534e 100644
--- a/elfcpp/elfcpp.h
+++ b/elfcpp/elfcpp.h
@@ -1,6 +1,6 @@
// elfcpp.h -- main header file for elfcpp -*- C++ -*-
-// Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of elfcpp.
@@ -784,6 +784,7 @@ const int VER_NEED_CURRENT = 1;
const int VER_FLG_BASE = 0x1;
const int VER_FLG_WEAK = 0x2;
+const int VER_FLG_INFO = 0x4;
// Special constants found in the SHT_GNU_versym entries.
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 33b730768b..c96650a233 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,12 @@
+2010-03-05 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * dynobj.h (Verdef::Verdef): Add is_info arg, is_info member
+ function, is_info_ member.
+ * dynobj.cc (Verdef::write): Set VER_FLG_INFO if this->is_info_.
+ (Versions::Versions): Update caller.
+ (Versions::define_base_version): Likewise.
+ (Versions::add_def): Likewise.
+
2010-03-03 Sriraman Tallam <tmsriram@google.com>
* i386.cc (Target_i386::can_check_for_function_pointers): New function.
diff --git a/gold/dynobj.cc b/gold/dynobj.cc
index dc6b009f49..fca9bbdf61 100644
--- a/gold/dynobj.cc
+++ b/gold/dynobj.cc
@@ -1221,7 +1221,8 @@ Verdef::write(const Stringpool* dynpool, bool is_last, unsigned char* pb) const
elfcpp::Verdef_write<size, big_endian> vd(pb);
vd.set_vd_version(elfcpp::VER_DEF_CURRENT);
vd.set_vd_flags((this->is_base_ ? elfcpp::VER_FLG_BASE : 0)
- | (this->is_weak_ ? elfcpp::VER_FLG_WEAK : 0));
+ | (this->is_weak_ ? elfcpp::VER_FLG_WEAK : 0)
+ | (this->is_info_ ? elfcpp::VER_FLG_INFO : 0));
vd.set_vd_ndx(this->index());
vd.set_vd_cnt(1 + this->deps_.size());
vd.set_vd_hash(Dynobj::elf_hash(this->name()));
@@ -1353,7 +1354,7 @@ Versions::Versions(const Version_script_info& version_script,
Verdef* const vd = new Verdef(
version,
this->version_script_.get_dependencies(version),
- false, false, false);
+ false, false, false, false);
this->defs_.push_back(vd);
Key key(version_key, 0);
this->version_table_.insert(std::make_pair(key, vd));
@@ -1391,7 +1392,7 @@ Versions::define_base_version(Stringpool* dynpool)
name = parameters->options().output_file_name();
name = dynpool->add(name, false, NULL);
Verdef* vdbase = new Verdef(name, std::vector<std::string>(),
- true, false, true);
+ true, false, false, true);
this->defs_.push_back(vdbase);
this->needs_base_version_ = false;
}
@@ -1474,7 +1475,7 @@ Versions::add_def(const Symbol* sym, const char* version,
// When creating a regular executable, automatically define
// a new version.
Verdef* vd = new Verdef(version, std::vector<std::string>(),
- false, false, false);
+ false, false, false, false);
this->defs_.push_back(vd);
ins.first->second = vd;
}
diff --git a/gold/dynobj.h b/gold/dynobj.h
index 71d1b68f60..bc69187571 100644
--- a/gold/dynobj.h
+++ b/gold/dynobj.h
@@ -360,9 +360,9 @@ class Verdef : public Version_base
{
public:
Verdef(const char* name, const std::vector<std::string>& deps,
- bool is_base, bool is_weak, bool is_symbol_created)
+ bool is_base, bool is_weak, bool is_info, bool is_symbol_created)
: name_(name), deps_(deps), is_base_(is_base), is_weak_(is_weak),
- is_symbol_created_(is_symbol_created)
+ is_info_(is_info), is_symbol_created_(is_symbol_created)
{ }
// Return the version name.
@@ -391,6 +391,11 @@ class Verdef : public Version_base
clear_weak()
{ this->is_weak_ = false; }
+ // Return whether this definition is informational.
+ bool
+ is_info() const
+ { return this->is_info_; }
+
// Return whether a version symbol has been created for this
// definition.
bool
@@ -419,6 +424,8 @@ class Verdef : public Version_base
bool is_base_;
// Whether this version is weak.
bool is_weak_;
+ // Whether this version is informational.
+ bool is_info_;
// Whether a version symbol has been created.
bool is_symbol_created_;
};
diff --git a/include/ChangeLog b/include/ChangeLog
index 64f6e1fbdb..f153061e34 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,8 @@
+2010-03-05 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * elf/common.h (VER_FLG_*): Document.
+ (VER_FLG_INFO): Define.
+
2010-02-08 David S. Miller <davem@davemloft.net>
* elf/sparc.h (R_SPARC_JMP_IREL, R_SPARC_IRELATIVE): Define.
diff --git a/include/elf/common.h b/include/elf/common.h
index e7ffac4b7b..6bad0d93c6 100644
--- a/include/elf/common.h
+++ b/include/elf/common.h
@@ -812,10 +812,16 @@
#define VER_DEF_CURRENT 1
/* These constants appear in the vd_flags field of a Elf32_Verdef
- structure. */
+ structure.
+
+ Cf. the Solaris Linker and Libraries Guide, Ch. 7, Object File Format,
+ Versioning Sections, for a description:
+
+ http://docs.sun.com/app/docs/doc/819-0690/chapter6-93046?l=en&a=view */
#define VER_FLG_BASE 0x1
#define VER_FLG_WEAK 0x2
+#define VER_FLG_INFO 0x4
/* These special constants can be found in an Elf32_Versym field. */