mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-18 16:53:50 +08:00
Adjust linkonce symbol name algorithm to work for
.gnu.linkonce.t.__i686.get_pc_thunk.bx.
This commit is contained in:
@ -383,7 +383,20 @@ Sized_relobj<size, big_endian>::include_linkonce_section(
|
|||||||
const char* name,
|
const char* name,
|
||||||
const elfcpp::Shdr<size, big_endian>&)
|
const elfcpp::Shdr<size, big_endian>&)
|
||||||
{
|
{
|
||||||
const char* symname = strrchr(name, '.') + 1;
|
// In general the symbol name we want will be the string following
|
||||||
|
// the last '.'. However, we have to handle the case of
|
||||||
|
// .gnu.linkonce.t.__i686.get_pc_thunk.bx, which was generated by
|
||||||
|
// some versions of gcc. So we use a heuristic: if the name starts
|
||||||
|
// with ".gnu.linkonce.t.", we use everything after that. Otherwise
|
||||||
|
// we look for the last '.'. We can't always simply skip
|
||||||
|
// ".gnu.linkonce.X", because we have to deal with cases like
|
||||||
|
// ".gnu.linkonce.d.rel.ro.local".
|
||||||
|
const char* const linkonce_t = ".gnu.linkonce.t.";
|
||||||
|
const char* symname;
|
||||||
|
if (strncmp(name, linkonce_t, strlen(linkonce_t)) == 0)
|
||||||
|
symname = name + strlen(linkonce_t);
|
||||||
|
else
|
||||||
|
symname = strrchr(name, '.') + 1;
|
||||||
bool include1 = layout->add_comdat(symname, false);
|
bool include1 = layout->add_comdat(symname, false);
|
||||||
bool include2 = layout->add_comdat(name, true);
|
bool include2 = layout->add_comdat(name, true);
|
||||||
return include1 && include2;
|
return include1 && include2;
|
||||||
|
Reference in New Issue
Block a user