* gc.h (gc_process_relocs): Don't look through function descriptors.

* icf.cc (get_section_contents): Do so here instead.
This commit is contained in:
Alan Modra 2013-03-15 07:51:32 +00:00
parent 0a251e08fa
commit ad3d8a2f04
3 changed files with 26 additions and 30 deletions

View File

@ -1,3 +1,8 @@
2013-03-15 Alan Modra <amodra@gmail.com>
* gc.h (gc_process_relocs): Don't look through function descriptors.
* icf.cc (get_section_contents): Do so here instead.
2013-03-13 Alan Modra <amodra@gmail.com>
* powerpc.cc (is_branch_reloc): Forward declare.

View File

@ -253,21 +253,7 @@ gc_process_relocs(
{
Address symvalue = dst_off - addend;
if (is_ordinary)
{
Symbol_location loc;
loc.object = dst_obj;
loc.shndx = dst_indx;
loc.offset = convert_types<off_t, Address>(dst_off);
// Look through function descriptors.
parameters->target().function_location(&loc);
if (loc.shndx != dst_indx)
{
// Modify symvalue/addend to the code entry.
symvalue = loc.offset;
addend = 0;
}
(*secvec).push_back(Section_id(loc.object, loc.shndx));
}
(*secvec).push_back(Section_id(dst_obj, dst_indx));
else
(*secvec).push_back(Section_id(NULL, 0));
(*symvec).push_back(NULL);
@ -343,21 +329,7 @@ gc_process_relocs(
{
Address symvalue = dst_off - addend;
if (is_ordinary && gsym->source() == Symbol::FROM_OBJECT)
{
Symbol_location loc;
loc.object = dst_obj;
loc.shndx = dst_indx;
loc.offset = convert_types<off_t, Address>(dst_off);
// Look through function descriptors.
parameters->target().function_location(&loc);
if (loc.shndx != dst_indx)
{
// Modify symvalue/addend to the code entry.
symvalue = loc.offset;
addend = 0;
}
(*secvec).push_back(Section_id(loc.object, loc.shndx));
}
(*secvec).push_back(Section_id(dst_obj, dst_indx));
else
(*secvec).push_back(Section_id(NULL, 0));
(*symvec).push_back(gsym);

View File

@ -288,6 +288,25 @@ get_section_contents(bool first_iteration,
for (; it_v != v.end(); ++it_v, ++it_s, ++it_a, ++it_o, ++it_addend_size)
{
if (first_iteration
&& it_v->first != NULL)
{
Symbol_location loc;
loc.object = it_v->first;
loc.shndx = it_v->second;
loc.offset = convert_types<off_t, long long>(it_a->first
+ it_a->second);
// Look through function descriptors
parameters->target().function_location(&loc);
if (loc.shndx != it_v->second)
{
it_v->second = loc.shndx;
// Modify symvalue/addend to the code entry.
it_a->first = loc.offset;
it_a->second = 0;
}
}
// ADDEND_STR stores the symbol value and addend and offset,
// each at most 16 hex digits long. it_a points to a pair
// where first is the symbol value and second is the