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:
parent
61315175ad
commit
9993ba115b
2 changed files with 32 additions and 13 deletions
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
Object* plugin_obj
|
||||
= parameters->options().plugins()->claim_file(input_file,
|
||||
memoff,
|
||||
memsize,
|
||||
NULL);
|
||||
if (obj != NULL)
|
||||
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());
|
||||
|
|
Loading…
Reference in a new issue