aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/0015-treat-STB_WEAK-and-STB_GNU_UNIQUE-like-STB_GLOBAL-in.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/musl/0015-treat-STB_WEAK-and-STB_GNU_UNIQUE-like-STB_GLOBAL-in.patch')
-rw-r--r--main/musl/0015-treat-STB_WEAK-and-STB_GNU_UNIQUE-like-STB_GLOBAL-in.patch40
1 files changed, 40 insertions, 0 deletions
diff --git a/main/musl/0015-treat-STB_WEAK-and-STB_GNU_UNIQUE-like-STB_GLOBAL-in.patch b/main/musl/0015-treat-STB_WEAK-and-STB_GNU_UNIQUE-like-STB_GLOBAL-in.patch
new file mode 100644
index 0000000000..af8d843923
--- /dev/null
+++ b/main/musl/0015-treat-STB_WEAK-and-STB_GNU_UNIQUE-like-STB_GLOBAL-in.patch
@@ -0,0 +1,40 @@
+From c9783e4d32e786c4b76bf77c6030111d9e79dbb7 Mon Sep 17 00:00:00 2001
+From: Szabolcs Nagy <nsz@port70.net>
+Date: Sat, 3 Dec 2016 20:52:43 +0000
+Subject: [PATCH] treat STB_WEAK and STB_GNU_UNIQUE like STB_GLOBAL in find_sym
+
+A weak symbol definition is not special during dynamic linking, so
+don't let a strong definition in a later module override it.
+(glibc dynamic linker allows overriding weak definitions if
+LD_DYNAMIC_WEAK is set, musl does not.)
+
+STB_GNU_UNIQUE means that the symbol is global, even if it is in a
+module that's loaded with RTLD_LOCAL, and all references resolve to
+the same definition. This semantics is only relevant for c++ plugin
+systems and even there it's often not what the user wants (so it can
+be turned off in g++ by -fno-gnu-unique when the c++ shared lib is
+compiled). In musl just treat it like STB_GLOBAL.
+---
+ ldso/dynlink.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/ldso/dynlink.c b/ldso/dynlink.c
+index a03f75e3..d00827a3 100644
+--- a/ldso/dynlink.c
++++ b/ldso/dynlink.c
+@@ -286,11 +286,9 @@ static struct symdef find_sym(struct dso *dso, const char *s, int need_def)
+ continue;
+ if (!(1<<(sym->st_info&0xf) & OK_TYPES)) continue;
+ if (!(1<<(sym->st_info>>4) & OK_BINDS)) continue;
+-
+- if (def.sym && sym->st_info>>4 == STB_WEAK) continue;
+ def.sym = sym;
+ def.dso = dso;
+- if (sym->st_info>>4 == STB_GLOBAL) break;
++ break;
+ }
+ return def;
+ }
+--
+2.11.1
+