2013-03-29 Sriraman Tallam <tmsriram@google.com>

* archive.cc (Archive::get_elf_object_for_member):  Create the elf
	object before calling the plugin claim_file handler.  Pass the elf
	object of the archive to the plugin. Delete the elf object if the
	plugin claims the file.
This commit is contained in:
Sriraman Tallam 2013-03-30 01:03:23 +00:00
parent 61315175ad
commit 9993ba115b
2 changed files with 32 additions and 13 deletions

View File

@ -1,3 +1,10 @@
2013-03-29 Sriraman Tallam <tmsriram@google.com>
* archive.cc (Archive::get_elf_object_for_member): Create the elf
object before calling the plugin claim_file handler. Pass the elf
object of the archive to the plugin. Delete the elf object if the
plugin claims the file.
2013-03-21 Alan Modra <amodra@gmail.com>
* layout.cc (Layout::set_segment_offsets): Accept writable .text

View File

@ -654,33 +654,45 @@ Archive::get_elf_object_for_member(off_t off, bool* punconfigured)
&member_name))
return NULL;
const unsigned char* ehdr;
int read_size;
Object *obj = NULL;
bool is_elf_obj = false;
if (is_elf_object(input_file, memoff, &ehdr, &read_size))
{
obj = make_elf_object((std::string(this->input_file_->filename())
+ "(" + member_name + ")"),
input_file, memoff, ehdr, read_size,
punconfigured);
is_elf_obj = true;
}
if (parameters->options().has_plugins())
{
Object* obj = parameters->options().plugins()->claim_file(input_file,
memoff,
memsize,
NULL);
if (obj != NULL)
Object* plugin_obj
= parameters->options().plugins()->claim_file(input_file,
memoff,
memsize,
obj);
if (plugin_obj != NULL)
{
// The input file was claimed by a plugin, and its symbols
// have been provided by the plugin.
return obj;
// Delete its elf object.
if (obj != NULL)
delete obj;
return plugin_obj;
}
}
const unsigned char* ehdr;
int read_size;
if (!is_elf_object(input_file, memoff, &ehdr, &read_size))
if (!is_elf_obj)
{
gold_error(_("%s: member at %zu is not an ELF object"),
this->name().c_str(), static_cast<size_t>(off));
return NULL;
}
Object* obj = make_elf_object((std::string(this->input_file_->filename())
+ "(" + member_name + ")"),
input_file, memoff, ehdr, read_size,
punconfigured);
if (obj == NULL)
return NULL;
obj->set_no_export(this->no_export());