summaryrefslogtreecommitdiff
path: root/ld/ldlang.c
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2011-02-14 17:03:43 +0000
committerMike Frysinger <vapier@gentoo.org>2011-02-14 17:03:43 +0000
commit7492f8e608331acc9ae6f1547052d200898938c6 (patch)
tree91115b8e236d069fd084eac64a62c2ab6106bcbf /ld/ldlang.c
parentfdbc4035db118d5a46d2c8361f8eb441dd5a8021 (diff)
downloadbinutils-redhat-7492f8e608331acc9ae6f1547052d200898938c6.tar.gz
bfd/ld: handle ABI prefixes in version scripts
The default language in version scripts is supposed to be C, but no symbol demangling is performed on the symbols by default. This makes targets with a symbol prefix to fail with most version scripts out there. So strip away this prefix by default. This fixes many tests (real world and ld's testsuite) for Blackfin targets and doesn't seem to cause regressions for x86_64. Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'ld/ldlang.c')
-rw-r--r--ld/ldlang.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 7ffe760371..7ffbf451e4 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -7296,19 +7296,29 @@ lang_vers_match (struct bfd_elf_version_expr_head *head,
struct bfd_elf_version_expr *prev,
const char *sym)
{
+ const char *c_sym;
const char *cxx_sym = sym;
const char *java_sym = sym;
struct bfd_elf_version_expr *expr = NULL;
+ enum demangling_styles curr_style;
+
+ curr_style = CURRENT_DEMANGLING_STYLE;
+ cplus_demangle_set_style (no_demangling);
+ c_sym = bfd_demangle (link_info.output_bfd, sym, DMGL_NO_OPTS);
+ if (!c_sym)
+ c_sym = sym;
+ cplus_demangle_set_style (curr_style);
if (head->mask & BFD_ELF_VERSION_CXX_TYPE)
{
- cxx_sym = cplus_demangle (sym, DMGL_PARAMS | DMGL_ANSI);
+ cxx_sym = bfd_demangle (link_info.output_bfd, sym,
+ DMGL_PARAMS | DMGL_ANSI);
if (!cxx_sym)
cxx_sym = sym;
}
if (head->mask & BFD_ELF_VERSION_JAVA_TYPE)
{
- java_sym = cplus_demangle (sym, DMGL_JAVA);
+ java_sym = bfd_demangle (link_info.output_bfd, sym, DMGL_JAVA);
if (!java_sym)
java_sym = sym;
}
@@ -7322,10 +7332,10 @@ lang_vers_match (struct bfd_elf_version_expr_head *head,
case 0:
if (head->mask & BFD_ELF_VERSION_C_TYPE)
{
- e.pattern = sym;
+ e.pattern = c_sym;
expr = (struct bfd_elf_version_expr *)
htab_find ((htab_t) head->htab, &e);
- while (expr && strcmp (expr->pattern, sym) == 0)
+ while (expr && strcmp (expr->pattern, c_sym) == 0)
if (expr->mask == BFD_ELF_VERSION_C_TYPE)
goto out_ret;
else
@@ -7383,12 +7393,14 @@ lang_vers_match (struct bfd_elf_version_expr_head *head,
else if (expr->mask == BFD_ELF_VERSION_CXX_TYPE)
s = cxx_sym;
else
- s = sym;
+ s = c_sym;
if (fnmatch (expr->pattern, s, 0) == 0)
break;
}
out_ret:
+ if (c_sym != sym)
+ free ((char *) c_sym);
if (cxx_sym != sym)
free ((char *) cxx_sym);
if (java_sym != sym)