From 44ec90b93bb675836c5ebf1498463393f72acb97 Mon Sep 17 00:00:00 2001 From: Rainer Orth Date: Fri, 5 Mar 2010 21:04:59 +0000 Subject: [PATCH] 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. --- binutils/ChangeLog | 4 ++++ binutils/readelf.c | 10 +++++++++- elfcpp/ChangeLog | 4 ++++ elfcpp/elfcpp.h | 3 ++- gold/ChangeLog | 9 +++++++++ gold/dynobj.cc | 9 +++++---- gold/dynobj.h | 11 +++++++++-- include/ChangeLog | 5 +++++ include/elf/common.h | 8 +++++++- 9 files changed, 54 insertions(+), 9 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 3d47c3c12e9..128454ccc9f 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,7 @@ +2010-03-05 Rainer Orth + + * readelf.c (get_ver_flags): Handle VER_FLG_INFO. + 2010-03-02 Daniel Jacobowitz * NEWS: Document .ARM.exidx / .ARM.extab support. diff --git a/binutils/readelf.c b/binutils/readelf.c index 2c677598f9b..e3b54873ad6 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, "| "); return buff; diff --git a/elfcpp/ChangeLog b/elfcpp/ChangeLog index a6c75cd184b..6f97d25ea12 100644 --- a/elfcpp/ChangeLog +++ b/elfcpp/ChangeLog @@ -1,3 +1,7 @@ +2010-03-05 Rainer Orth + + * elfcpp.h (VER_FLG_INFO): Define. + 2010-01-21 Doug Kwan * arm.h (EXIDX_CANTUNWIND): New enum. diff --git a/elfcpp/elfcpp.h b/elfcpp/elfcpp.h index 8ecbc0ae4cd..52b8b2534ee 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 . // 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 33b730768be..c96650a2336 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,12 @@ +2010-03-05 Rainer Orth + + * 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 * i386.cc (Target_i386::can_check_for_function_pointers): New function. diff --git a/gold/dynobj.cc b/gold/dynobj.cc index dc6b009f490..fca9bbdf613 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 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(), - 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(), - 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 71d1b68f60c..bc69187571e 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& 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 64f6e1fbdbc..f153061e349 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,8 @@ +2010-03-05 Rainer Orth + + * elf/common.h (VER_FLG_*): Document. + (VER_FLG_INFO): Define. + 2010-02-08 David S. Miller * elf/sparc.h (R_SPARC_JMP_IREL, R_SPARC_IRELATIVE): Define. diff --git a/include/elf/common.h b/include/elf/common.h index e7ffac4b7b6..6bad0d93c68 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. */ -- 2.30.2