|
From: <sv...@va...> - 2012-07-05 09:42:43
|
tom 2012-07-05 10:42:31 +0100 (Thu, 05 Jul 2012)
New Revision: 12711
Log:
Allow an IFunc symbol to be merged with a non-IFunc symbol that
represents the underlying resolver function. Fixes BZ#301204.
Modified files:
trunk/coregrind/m_debuginfo/storage.c
Modified: trunk/coregrind/m_debuginfo/storage.c (+3 -2)
===================================================================
--- trunk/coregrind/m_debuginfo/storage.c 2012-07-04 22:59:29 +01:00 (rev 12710)
+++ trunk/coregrind/m_debuginfo/storage.c 2012-07-05 10:42:31 +01:00 (rev 12711)
@@ -1369,8 +1369,7 @@
vg_assert(w < r);
if ( di->symtab[w].addr == di->symtab[r].addr
&& di->symtab[w].size == di->symtab[r].size
- && !!di->symtab[w].isText == !!di->symtab[r].isText
- && !!di->symtab[w].isIFunc == !!di->symtab[r].isIFunc) {
+ && !!di->symtab[w].isText == !!di->symtab[r].isText) {
/* merge the two into one */
n_merged++;
/* Add r names to w if r has secondary names
@@ -1380,6 +1379,8 @@
di->symtab[w].pri_name))) {
add_DiSym_names_to_from(di, &di->symtab[w], &di->symtab[r]);
}
+ /* mark w as an IFunc if either w or r are */
+ di->symtab[w].isIFunc = di->symtab[w].isIFunc || di->symtab[r].isIFunc;
/* and use ::pri_names to indicate this slot is no longer in use */
di->symtab[r].pri_name = NULL;
if (di->symtab[r].sec_names) {
|