Don't emit symbols seen only in dynamic object, don't read duplicate

dynamic object.
This commit is contained in:
Ian Lance Taylor 2006-12-06 06:28:56 +00:00
parent 8f2e9323f0
commit 008db82ec1
8 changed files with 96 additions and 37 deletions

View File

@ -1324,12 +1324,12 @@ Versions::finalize(const Target* target, Symbol_table* symtab,
// Create a version symbol if necessary.
if (!(*p)->is_symbol_created())
{
Symbol* vsym =symtab->define_as_constant(target, (*p)->name(),
(*p)->name(), 0, 0,
elfcpp::STT_OBJECT,
elfcpp::STB_GLOBAL,
elfcpp::STV_DEFAULT, 0,
false);
Symbol* vsym = symtab->define_as_constant(target, (*p)->name(),
(*p)->name(), 0, 0,
elfcpp::STT_OBJECT,
elfcpp::STB_GLOBAL,
elfcpp::STV_DEFAULT, 0,
false);
vsym->set_needs_dynsym_entry();
++dynsym_index;
syms->push_back(vsym);

View File

@ -718,15 +718,29 @@ Sized_relobj<size, big_endian>::write_local_symbols(Output_file* of,
// Input_objects methods.
// Add a regular relocatable object to the list.
// Add a regular relocatable object to the list. Return false if this
// object should be ignored.
void
bool
Input_objects::add_object(Object* obj)
{
if (obj->is_dynamic())
this->dynobj_list_.push_back(static_cast<Dynobj*>(obj));
else
if (!obj->is_dynamic())
this->relobj_list_.push_back(static_cast<Relobj*>(obj));
else
{
// See if this is a duplicate SONAME.
Dynobj* dynobj = static_cast<Dynobj*>(obj);
std::pair<Unordered_set<std::string>::iterator, bool> ins =
this->sonames_.insert(dynobj->soname());
if (!ins.second)
{
// We have already seen a dynamic object with this soname.
return false;
}
this->dynobj_list_.push_back(dynobj);
}
Target* target = obj->target();
if (this->target_ == NULL)
@ -737,6 +751,8 @@ Input_objects::add_object(Object* obj)
program_name, obj->name().c_str());
gold_exit(false);
}
return true;
}
// Relocate_info methods.

View File

@ -600,7 +600,7 @@ class Input_objects
{
public:
Input_objects()
: relobj_list_(), target_(NULL)
: relobj_list_(), dynobj_list_(), target_(NULL), sonames_()
{ }
// The type of the list of input relocateable objects.
@ -611,8 +611,9 @@ class Input_objects
typedef std::vector<Dynobj*> Dynobj_list;
typedef Dynobj_list::const_iterator Dynobj_iterator;
// Add an object to the list.
void
// Add an object to the list. Return true if all is well, or false
// if this object should be ignored.
bool
add_object(Object*);
// Get the target we should use for the output file.
@ -649,9 +650,14 @@ class Input_objects
Input_objects(const Input_objects&);
Input_objects& operator=(const Input_objects&);
// The list of ordinary objects included in the link.
Relobj_list relobj_list_;
// The list of dynamic objects included in the link.
Dynobj_list dynobj_list_;
// The target.
Target* target_;
// SONAMEs that we have seen.
Unordered_set<std::string> sonames_;
};
// Some of the information we pass to the relocation routines. We

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-12-05 15:53-0800\n"
"POT-Creation-Date: 2006-12-05 17:51-0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -166,7 +166,7 @@ msgstr ""
msgid "%s: %s: size of dynamic symbols is not multiple of symbol size\n"
msgstr ""
#: dynobj.cc:1240
#: dynobj.cc:1241
#, c-format
msgid "%s: symbol %s has undefined version %s\n"
msgstr ""
@ -360,42 +360,42 @@ msgstr ""
msgid "%s: %s: local symbol %u section name out of range: %u >= %u\n"
msgstr ""
#: object.cc:799
#: object.cc:815
#, c-format
msgid "%s: %s: unsupported ELF file type %d\n"
msgstr ""
#: object.cc:818 object.cc:871 object.cc:892
#: object.cc:834 object.cc:887 object.cc:908
#, c-format
msgid "%s: %s: ELF file too short\n"
msgstr ""
#: object.cc:827
#: object.cc:843
#, c-format
msgid "%s: %s: invalid ELF version 0\n"
msgstr ""
#: object.cc:830
#: object.cc:846
#, c-format
msgid "%s: %s: unsupported ELF version %d\n"
msgstr ""
#: object.cc:838
#: object.cc:854
#, c-format
msgid "%s: %s: invalid ELF class 0\n"
msgstr ""
#: object.cc:845
#: object.cc:861
#, c-format
msgid "%s: %s: unsupported ELF class %d\n"
msgstr ""
#: object.cc:853
#: object.cc:869
#, c-format
msgid "%s: %s: invalid ELF data encoding\n"
msgstr ""
#: object.cc:860
#: object.cc:876
#, c-format
msgid "%s: %s: unsupported ELF data encoding %d\n"
msgstr ""
@ -592,42 +592,42 @@ msgstr ""
msgid "%s: %s: unsupported symbol binding %d for symbol %s\n"
msgstr ""
#: symtab.cc:445 symtab.cc:542
#: symtab.cc:450 symtab.cc:547
#, c-format
msgid "%s: %s: mixing 32-bit and 64-bit ELF objects\n"
msgstr ""
#: symtab.cc:462
#: symtab.cc:467
#, c-format
msgid "%s: %s: bad global symbol name offset %u at %lu\n"
msgstr ""
#: symtab.cc:549
#: symtab.cc:554
#, c-format
msgid "%s: %s: too few symbol versions\n"
msgstr ""
#: symtab.cc:569
#: symtab.cc:574
#, c-format
msgid "%s: %s: bad symbol name offset %u at %lu\n"
msgstr ""
#: symtab.cc:613
#: symtab.cc:618
#, c-format
msgid "%s: %s: versym for symbol %zu out of range: %u\n"
msgstr ""
#: symtab.cc:621
#: symtab.cc:626
#, c-format
msgid "%s: %s: versym for symbol %zu has no name: %u\n"
msgstr ""
#: symtab.cc:1093 symtab.cc:1265
#: symtab.cc:1106 symtab.cc:1278
#, c-format
msgid "%s: %s: unsupported symbol section 0x%x\n"
msgstr ""
#: symtab.cc:1458
#: symtab.cc:1471
#, c-format
msgid "%s: %s: warning: %s\n"
msgstr ""

View File

@ -240,10 +240,17 @@ Add_symbols::locks(Workqueue* workqueue)
void
Add_symbols::run(Workqueue*)
{
this->input_objects_->add_object(this->object_);
this->object_->layout(this->options_, this->symtab_, this->layout_,
this->sd_);
this->object_->add_symbols(this->symtab_, this->sd_);
if (!this->input_objects_->add_object(this->object_))
{
// FIXME: We need to close the descriptor here.
delete this->object_;
}
else
{
this->object_->layout(this->options_, this->symtab_, this->layout_,
this->sd_);
this->object_->add_symbols(this->symtab_, this->sd_);
}
delete this->sd_;
this->sd_ = NULL;
}

View File

@ -156,7 +156,12 @@ Symbol_table::resolve(Sized_symbol<size>* to,
gold_exit(false);
}
if (object->is_dynamic())
if (!object->is_dynamic())
{
// Record that we've seen this symbol in a regular object.
to->set_in_reg();
}
else
{
frombits |= (1 << 1);

View File

@ -39,6 +39,7 @@ Symbol::init_fields(const char* name, const char* version,
this->is_def_ = false;
this->is_forwarder_ = false;
this->needs_dynsym_entry_ = false;
this->in_reg_ = false;
this->in_dyn_ = false;
this->has_got_offset_ = false;
this->has_warning_ = false;
@ -57,6 +58,7 @@ Symbol::init_base(const char* name, const char* version, Object* object,
// FIXME: Handle SHN_XINDEX.
this->u_.from_object.shndx = sym.get_st_shndx();
this->source_ = FROM_OBJECT;
this->in_reg_ = !object->is_dynamic();
this->in_dyn_ = object->is_dynamic();
}
@ -72,6 +74,7 @@ Symbol::init_base(const char* name, Output_data* od, elfcpp::STT type,
this->u_.in_output_data.output_data = od;
this->u_.in_output_data.offset_is_from_end = offset_is_from_end;
this->source_ = IN_OUTPUT_DATA;
this->in_reg_ = true;
}
// Initialize the fields in the base class Symbol for a symbol defined
@ -86,6 +89,7 @@ Symbol::init_base(const char* name, Output_segment* os, elfcpp::STT type,
this->u_.in_output_segment.output_segment = os;
this->u_.in_output_segment.offset_base = offset_base;
this->source_ = IN_OUTPUT_SEGMENT;
this->in_reg_ = true;
}
// Initialize the fields in the base class Symbol for a symbol defined
@ -98,6 +102,7 @@ Symbol::init_base(const char* name, elfcpp::STT type,
{
this->init_fields(name, NULL, type, binding, visibility, nonvis);
this->source_ = CONSTANT;
this->in_reg_ = true;
}
// Initialize the fields in Sized_symbol for SYM in OBJECT.
@ -1078,6 +1083,14 @@ Symbol_table::sized_finalize(unsigned index, off_t off, Stringpool* pool)
if (sym->has_symtab_index())
continue;
if (!sym->in_reg())
{
gold_assert(!sym->has_symtab_index());
sym->set_symtab_index(-1U);
gold_assert(sym->dynsym_index() == -1U);
continue;
}
typename Sized_symbol<size>::Value_type value;
switch (sym->source())

View File

@ -185,6 +185,16 @@ class Symbol
set_needs_dynsym_entry()
{ this->needs_dynsym_entry_ = true; }
// Return whether this symbol has been seen in a regular object.
bool
in_reg() const
{ return this->in_reg_; }
// Mark this symbol as having been seen in a regular object.
void
set_in_reg()
{ this->in_reg_ = true; }
// Mark this symbol as having been seen in a dynamic object.
void
set_in_dyn()
@ -469,6 +479,8 @@ class Symbol
bool is_forwarder_ : 1;
// True if this symbol needs to be in the dynamic symbol table.
bool needs_dynsym_entry_ : 1;
// True if we've seen this symbol in a regular object.
bool in_reg_ : 1;
// True if we've seen this symbol in a dynamic object.
bool in_dyn_ : 1;
// True if the symbol has an entry in the GOT section.