aboutsummaryrefslogtreecommitdiff
path: root/gold/object.h
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2009-11-05 06:24:39 +0000
committerIan Lance Taylor <ian@airs.com>2009-11-05 06:24:39 +0000
commit594c8e5ede2a93362f335a97389eaadac17ec204 (patch)
treef6fa13b594ad3af2539139a534d3645daefb4fbf /gold/object.h
parent946ef19679549c1751ca5c3a963f48c21112e19b (diff)
downloadgdb-594c8e5ede2a93362f335a97389eaadac17ec204.zip
gdb-594c8e5ede2a93362f335a97389eaadac17ec204.tar.gz
gdb-594c8e5ede2a93362f335a97389eaadac17ec204.tar.bz2
PR 10880
* object.h (class Object): Add is_needed and set_is_needed methods. Add is_needed_ field. Make bool fields into bitfields. * symtab.cc (Symbol_table::set_dynsym_indexes): If a symbol is defined in a dynamic object and referenced by a regular object, set is_needed for the dynamic object. * layout.cc (Layout::finish_dynamic_section): Don't add DT_NEEDED if the file is marked with as_needed and it is not needed.
Diffstat (limited to 'gold/object.h')
-rw-r--r--gold/object.h33
1 files changed, 25 insertions, 8 deletions
diff --git a/gold/object.h b/gold/object.h
index 558e456..187a101 100644
--- a/gold/object.h
+++ b/gold/object.h
@@ -195,8 +195,8 @@ class Object
Object(const std::string& name, Input_file* input_file, bool is_dynamic,
off_t offset = 0)
: name_(name), input_file_(input_file), offset_(offset), shnum_(-1U),
- is_dynamic_(is_dynamic), uses_split_stack_(false),
- has_no_split_stack_(false), xindex_(NULL), no_export_(false)
+ is_dynamic_(is_dynamic), is_needed_(false), uses_split_stack_(false),
+ has_no_split_stack_(false), no_export_(false), xindex_(NULL)
{ input_file->file().add_object(); }
virtual ~Object()
@@ -217,6 +217,19 @@ class Object
is_dynamic() const
{ return this->is_dynamic_; }
+ // Return whether this object is needed--true if it is a dynamic
+ // object which defines some symbol referenced by a regular object.
+ // We keep the flag here rather than in Dynobj for convenience when
+ // setting it.
+ bool
+ is_needed() const
+ { return this->is_needed_; }
+
+ // Record that this object is needed.
+ void
+ set_is_needed()
+ { this->is_needed_ = true; }
+
// Return whether this object was compiled with -fsplit-stack.
bool
uses_split_stack() const
@@ -589,17 +602,21 @@ class Object
// Number of input sections.
unsigned int shnum_;
// Whether this is a dynamic object.
- bool is_dynamic_;
+ bool is_dynamic_ : 1;
+ // Whether this object is needed. This is only set for dynamic
+ // objects, and means that the object defined a symbol which was
+ // used by a reference from a regular object.
+ bool is_needed_ : 1;
// Whether this object was compiled with -fsplit-stack.
- bool uses_split_stack_;
+ bool uses_split_stack_ : 1;
// Whether this object contains any functions compiled with the
// no_split_stack attribute.
- bool has_no_split_stack_;
- // Many sections for objects with more than SHN_LORESERVE sections.
- Xindex* xindex_;
+ bool has_no_split_stack_ : 1;
// True if exclude this object from automatic symbol export.
// This is used only for archive objects.
- bool no_export_;
+ bool no_export_ : 1;
+ // Many sections for objects with more than SHN_LORESERVE sections.
+ Xindex* xindex_;
};
// A regular object (ET_REL). This is an abstract base class itself.