aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Schlemmer <azarah@gentoo.org>2005-12-01 01:00:40 +0000
committerMartin Schlemmer <azarah@gentoo.org>2005-12-01 01:00:40 +0000
commitdd7fcf79c15562adeb22e4b08f326d4d40970082 (patch)
tree994302094f13e939cffe3b6ecf69df236e9003d7
parentRename configure.in to configure.ac. (diff)
downloadsandbox-dd7fcf79c15562adeb22e4b08f326d4d40970082.tar.gz
sandbox-dd7fcf79c15562adeb22e4b08f326d4d40970082.tar.bz2
sandbox-dd7fcf79c15562adeb22e4b08f326d4d40970082.zip
Fix non-versioned libc's to also prepend '__' to internal symbols by using
strong aliases. Signed-off-by: Martin Schlemmer <azarah@gentoo.org>
-rw-r--r--ChangeLog3
-rw-r--r--localdecls.h17
-rw-r--r--scripts/gen_symbol_header.awk6
3 files changed, 19 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 2f7e83f..55df6d3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -14,6 +14,9 @@
Rename configure.in to configure.ac.
+ Fix non-versioned libc's to also prepend '__' to internal symbols by using
+ strong aliases.
+
28 Nov 2005; Martin Schlemmer <azarah@gentoo.org> configure.in, sandbox.c,
sandbox_fdutils.c:
diff --git a/localdecls.h b/localdecls.h
index 22d5d2a..512030c 100644
--- a/localdecls.h
+++ b/localdecls.h
@@ -47,15 +47,20 @@
#endif
#if !HAVE_DLVSYM
-# define dlvsym(lib, sym, ver) dlsym(lib, sym)
+# define dlvsym(_lib, _sym, _ver) dlsym(_lib, _sym)
#endif
-/* from glibc */
#if HAVE_DLVSYM
-# define symbol_version(real, name, version) \
- __asm__ (".symver " #real "," #name "@" #version)
-# define default_symbol_version(real, name, version) \
- __asm__ (".symver " #real "," #name "@@" #version)
+/* Taken from glibc */
+# define symbol_version(_real, _name, _version) \
+ __asm__ (".symver " #_real "," #_name "@" #_version)
+# define default_symbol_version(_real, _name, _version) \
+ __asm__ (".symver " #_real "," #_name "@@" #_version)
#endif
+/* Taken from glibc */
+# define strong_alias(_name, _aliasname) \
+ extern __typeof (_name) _aliasname __attribute__ ((alias (#_name)));
+
+
#endif
diff --git a/scripts/gen_symbol_header.awk b/scripts/gen_symbol_header.awk
index 0426106..f6e877d 100644
--- a/scripts/gen_symbol_header.awk
+++ b/scripts/gen_symbol_header.awk
@@ -27,7 +27,8 @@ END {
# Defualt symbol have '@@' and not '@', so name it by
# prepending '__' rather than the symbol version so
# that we know what the name is in libsandbox.c ...
- if (sym_full_names[x] ~ /@@/) {
+ # Also do this for non-versioned libc's ...
+ if (sym_full_names[x] ~ /@@/ || !symbol_array[2]) {
sym_real_name = "__" sym_index;
} else {
sym_real_name = sym_full_names[x];
@@ -54,6 +55,9 @@ END {
else
printf("symbol_version(%s, %s, %s);\n",
sym_real_name, sym_index, symbol_array[2]);
+ } else {
+ printf("strong_alias(%s, %s);\n", sym_real_name,
+ sym_index);
}
printf("\n");