Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src PR/45015: ld.elf_so: support ELF symbol versioning
details: https://anonhg.NetBSD.org/src/rev/bb18085e8ab2
branches: trunk
changeset: 766520:bb18085e8ab2
user: nonaka <nonaka%NetBSD.org@localhost>
date: Sat Jun 25 05:45:10 2011 +0000
description:
PR/45015: ld.elf_so: support ELF symbol versioning
Applied latest patch.
diffstat:
distrib/sets/lists/comp/mi | 5 +-
distrib/sets/lists/tests/mi | 36 +-
distrib/sets/lists/tests/shl.mi | 14 +-
etc/mtree/NetBSD.dist.tests | 9 +-
include/dlfcn.h | 4 +-
lib/libc/dlfcn/dlfcn_elf.c | 15 +-
libexec/ld.elf_so/Makefile | 4 +-
libexec/ld.elf_so/headers.c | 27 +-
libexec/ld.elf_so/reloc.c | 12 +-
libexec/ld.elf_so/rtld.c | 80 +-
libexec/ld.elf_so/rtld.h | 60 +-
libexec/ld.elf_so/symbol.c | 169 ++++-
libexec/ld.elf_so/symver.c | 317 ++++++++++
share/man/man3/Makefile | 4 +-
share/man/man3/dlfcn.3 | 18 +-
sys/sys/exec_elf.h | 28 +-
tests/libexec/ld.elf_so/Makefile | 27 +-
tests/libexec/ld.elf_so/data/Makefile | 28 +
tests/libexec/ld.elf_so/data/symver-output-ref-stderr.v1-v0 | 1 +
tests/libexec/ld.elf_so/data/symver-output-ref-stderr.v2-v0 | 1 +
tests/libexec/ld.elf_so/data/symver-output-ref-stderr.v2-v1 | 1 +
tests/libexec/ld.elf_so/data/symver-output-ref-stdout.v0-v0 | 1 +
tests/libexec/ld.elf_so/data/symver-output-ref-stdout.v0-v1 | 1 +
tests/libexec/ld.elf_so/data/symver-output-ref-stdout.v0-v2 | 1 +
tests/libexec/ld.elf_so/data/symver-output-ref-stdout.v1-v1 | 1 +
tests/libexec/ld.elf_so/data/symver-output-ref-stdout.v1-v2 | 1 +
tests/libexec/ld.elf_so/data/symver-output-ref-stdout.v2-v2 | 1 +
tests/libexec/ld.elf_so/h_dl_symver.c | 42 +
tests/libexec/ld.elf_so/helper_symver_dso0/Makefile | 21 +
tests/libexec/ld.elf_so/helper_symver_dso0/h_helper_symver_dso0.c | 39 +
tests/libexec/ld.elf_so/helper_symver_dso1/Makefile | 23 +
tests/libexec/ld.elf_so/helper_symver_dso1/h_helper_symver_dso1.c | 41 +
tests/libexec/ld.elf_so/helper_symver_dso1/h_helper_symver_dso1.map | 5 +
tests/libexec/ld.elf_so/helper_symver_dso2/Makefile | 23 +
tests/libexec/ld.elf_so/helper_symver_dso2/h_helper_symver_dso2.c | 59 +
tests/libexec/ld.elf_so/helper_symver_dso2/h_helper_symver_dso2.map | 13 +
tests/libexec/ld.elf_so/t_dl_symver.sh | 55 +
tests/libexec/ld.elf_so/t_dlvsym.c | 203 ++++++
38 files changed, 1300 insertions(+), 90 deletions(-)
diffs (truncated from 2134 to 300 lines):
diff -r 84eee28a1a66 -r bb18085e8ab2 distrib/sets/lists/comp/mi
--- a/distrib/sets/lists/comp/mi Sat Jun 25 02:26:53 2011 +0000
+++ b/distrib/sets/lists/comp/mi Sat Jun 25 05:45:10 2011 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1630 2011/06/14 15:27:46 jmmv Exp $
+# $NetBSD: mi,v 1.1631 2011/06/25 05:45:11 nonaka Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
#
@@ -5814,6 +5814,7 @@
./usr/share/man/cat3/dlfcn.0 comp-c-catman .cat
./usr/share/man/cat3/dlopen.0 comp-c-catman .cat
./usr/share/man/cat3/dlsym.0 comp-c-catman .cat
+./usr/share/man/cat3/dlvsym.0 comp-c-catman .cat
./usr/share/man/cat3/dm.0 comp-c-catman .cat
./usr/share/man/cat3/dn_comp.0 comp-c-catman .cat
./usr/share/man/cat3/dn_expand.0 comp-c-catman .cat
@@ -11908,6 +11909,7 @@
./usr/share/man/html3/dlfcn.html comp-c-htmlman html
./usr/share/man/html3/dlopen.html comp-c-htmlman html
./usr/share/man/html3/dlsym.html comp-c-htmlman html
+./usr/share/man/html3/dlvsym.html comp-c-htmlman html
./usr/share/man/html3/dm.html comp-c-htmlman html
./usr/share/man/html3/dn_comp.html comp-c-htmlman html
./usr/share/man/html3/dn_expand.html comp-c-htmlman html
@@ -17911,6 +17913,7 @@
./usr/share/man/man3/dlfcn.3 comp-c-man .man
./usr/share/man/man3/dlopen.3 comp-c-man .man
./usr/share/man/man3/dlsym.3 comp-c-man .man
+./usr/share/man/man3/dlvsym.3 comp-c-man .man
./usr/share/man/man3/dm.3 comp-c-man .man
./usr/share/man/man3/dn_comp.3 comp-c-man .man
./usr/share/man/man3/dn_expand.3 comp-c-man .man
diff -r 84eee28a1a66 -r bb18085e8ab2 distrib/sets/lists/tests/mi
--- a/distrib/sets/lists/tests/mi Sat Jun 25 02:26:53 2011 +0000
+++ b/distrib/sets/lists/tests/mi Sat Jun 25 05:45:10 2011 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.354 2011/06/20 18:03:41 jruoho Exp $
+# $NetBSD: mi,v 1.355 2011/06/25 05:45:13 nonaka Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
#
@@ -559,10 +559,17 @@
./usr/libdata/debug/usr/tests/libexec/ld.elf_so tests-libexec-debug
./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_df_1_noopen1.debug tests-libexec-debug debug,atf
./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_df_1_noopen2.debug tests-libexec-debug debug,atf
+./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_dl_symver_v0.debug tests-libexec-debug debug,atf
+./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_dl_symver_v1.debug tests-libexec-debug debug,atf
+./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_dl_symver_v2.debug tests-libexec-debug debug,atf
+./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_helper_symver_dso0 tests-libexec-debug
+./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_helper_symver_dso1 tests-libexec-debug
+./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_helper_symver_dso2 tests-libexec-debug
./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_locking.debug tests-libexec-debug debug,atf
./usr/libdata/debug/usr/tests/libexec/ld.elf_so/t_dlerror-cleared.debug tests-libexec-debug debug,atf
./usr/libdata/debug/usr/tests/libexec/ld.elf_so/t_dlerror-false.debug tests-libexec-debug debug,atf
./usr/libdata/debug/usr/tests/libexec/ld.elf_so/t_dlinfo.debug tests-libexec-debug debug,atf
+./usr/libdata/debug/usr/tests/libexec/ld.elf_so/t_dlvsym.debug tests-libexec-debug debug,atf
./usr/libdata/debug/usr/tests/modules tests-sys-debug
./usr/libdata/debug/usr/tests/modules/t_builtin.debug tests-sys-debug debug,atf
./usr/libdata/debug/usr/tests/modules/t_modctl.debug tests-sys-debug debug,atf
@@ -2224,13 +2231,40 @@
./usr/tests/libexec/Atffile tests-lib-tests atf
./usr/tests/libexec/ld.elf_so tests-libexec-tests
./usr/tests/libexec/ld.elf_so/Atffile tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stderr.v0-v0 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stderr.v0-v1 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stderr.v0-v2 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stderr.v1-v0 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stderr.v1-v1 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stderr.v1-v2 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stderr.v2-v0 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stderr.v2-v1 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stderr.v2-v2 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stdout.v0-v0 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stdout.v0-v1 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stdout.v0-v2 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stdout.v1-v0 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stdout.v1-v1 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stdout.v1-v2 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stdout.v2-v0 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stdout.v2-v1 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/data/symver-output-ref-stdout.v2-v2 tests-libexec-tests atf
./usr/tests/libexec/ld.elf_so/h_df_1_noopen1 tests-libexec-tests atf
./usr/tests/libexec/ld.elf_so/h_df_1_noopen2 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/h_dl_symver_v0 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/h_dl_symver_v1 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/h_dl_symver_v2 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/h_helper_symver_dso0 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/h_helper_symver_dso1 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/h_helper_symver_dso2 tests-libexec-tests atf
./usr/tests/libexec/ld.elf_so/h_locking tests-libexec-tests atf
./usr/tests/libexec/ld.elf_so/t_df_1_noopen tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/t_dl_symver tests-libexec-tests atf
./usr/tests/libexec/ld.elf_so/t_dlerror-cleared tests-libexec-tests atf
./usr/tests/libexec/ld.elf_so/t_dlerror-false tests-libexec-tests atf
./usr/tests/libexec/ld.elf_so/t_dlinfo tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/t_dlvsym tests-libexec-tests atf
./usr/tests/modules tests-sys-tests
./usr/tests/net tests-net-tests
./usr/tests/net/Atffile tests-net-tests atf
diff -r 84eee28a1a66 -r bb18085e8ab2 distrib/sets/lists/tests/shl.mi
--- a/distrib/sets/lists/tests/shl.mi Sat Jun 25 02:26:53 2011 +0000
+++ b/distrib/sets/lists/tests/shl.mi Sat Jun 25 05:45:10 2011 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: shl.mi,v 1.5 2011/05/30 02:10:26 christos Exp $
+# $NetBSD: shl.mi,v 1.6 2011/06/25 05:45:14 nonaka Exp $
#
./usr/libdata/debug/usr/tests/lib/csu/libh_initfini3_dso.so.1.debug tests-lib-debug debug,atf
./usr/libdata/debug/usr/tests/lib/libc/tls/libh_tls_dlopen.so.1.debug tests-lib-debug debug,atf
@@ -18,8 +18,20 @@
./usr/tests/lib/libc/tls/t_tls_dynamic tests-lib-tests atf
./usr/tests/util/id/libfake.so.0 tests-obsolete obsolete
./usr/tests/util/id/libfake.so.0.0 tests-obsolete obsolete
+./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_helper_symver_dso0/libh_helper_symver_dso.so.1.debug tests-libexec-debug debug,atf
+./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_helper_symver_dso1/libh_helper_symver_dso.so.1.debug tests-libexec-debug debug,atf
+./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_helper_symver_dso2/libh_helper_symver_dso.so.1.debug tests-libexec-debug debug,atf
./usr/libdata/debug/usr/tests/libexec/ld.elf_so/libh_helper_dso1.so.1.debug tests-libexec-debug debug,atf
./usr/libdata/debug/usr/tests/libexec/ld.elf_so/libh_helper_dso2.so.1.debug tests-libexec-debug debug,atf
+./usr/tests/libexec/ld.elf_so/h_helper_symver_dso0/libh_helper_symver_dso_g.a -unknown- atf,debuglib
+./usr/tests/libexec/ld.elf_so/h_helper_symver_dso0/libh_helper_symver_dso.so tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/h_helper_symver_dso0/libh_helper_symver_dso.so.1 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/h_helper_symver_dso1/libh_helper_symver_dso_g.a -unknown- atf,debuglib
+./usr/tests/libexec/ld.elf_so/h_helper_symver_dso1/libh_helper_symver_dso.so tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/h_helper_symver_dso1/libh_helper_symver_dso.so.1 tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/h_helper_symver_dso2/libh_helper_symver_dso_g.a -unknown- atf,debuglib
+./usr/tests/libexec/ld.elf_so/h_helper_symver_dso2/libh_helper_symver_dso.so tests-libexec-tests atf
+./usr/tests/libexec/ld.elf_so/h_helper_symver_dso2/libh_helper_symver_dso.so.1 tests-libexec-tests atf
./usr/tests/libexec/ld.elf_so/libh_helper_dso1_g.a -unknown- atf,debuglib
./usr/tests/libexec/ld.elf_so/libh_helper_dso1.so tests-libexec-tests atf
./usr/tests/libexec/ld.elf_so/libh_helper_dso1.so.1 tests-libexec-tests atf
diff -r 84eee28a1a66 -r bb18085e8ab2 etc/mtree/NetBSD.dist.tests
--- a/etc/mtree/NetBSD.dist.tests Sat Jun 25 02:26:53 2011 +0000
+++ b/etc/mtree/NetBSD.dist.tests Sat Jun 25 05:45:10 2011 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: NetBSD.dist.tests,v 1.49 2011/05/30 18:14:11 njoly Exp $
+# $NetBSD: NetBSD.dist.tests,v 1.50 2011/06/25 05:45:12 nonaka Exp $
./usr/libdata/debug/usr/tests
./usr/libdata/debug/usr/tests/atf
@@ -88,6 +88,9 @@
./usr/libdata/debug/usr/tests/lib/libutil
./usr/libdata/debug/usr/tests/libexec
./usr/libdata/debug/usr/tests/libexec/ld.elf_so
+./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_helper_symver_dso0
+./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_helper_symver_dso1
+./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_helper_symver_dso2
./usr/libdata/debug/usr/tests/modules
./usr/libdata/debug/usr/tests/net
./usr/libdata/debug/usr/tests/net/bpf
@@ -211,6 +214,10 @@
./usr/tests/lib/libutil
./usr/tests/libexec
./usr/tests/libexec/ld.elf_so
+./usr/tests/libexec/ld.elf_so/data
+./usr/tests/libexec/ld.elf_so/h_helper_symver_dso0
+./usr/tests/libexec/ld.elf_so/h_helper_symver_dso1
+./usr/tests/libexec/ld.elf_so/h_helper_symver_dso2
./usr/tests/modules
./usr/tests/net
./usr/tests/net/bpf
diff -r 84eee28a1a66 -r bb18085e8ab2 include/dlfcn.h
--- a/include/dlfcn.h Sat Jun 25 02:26:53 2011 +0000
+++ b/include/dlfcn.h Sat Jun 25 05:45:10 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: dlfcn.h,v 1.22 2010/12/24 12:41:42 skrll Exp $ */
+/* $NetBSD: dlfcn.h,v 1.23 2011/06/25 05:45:11 nonaka Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -55,6 +55,8 @@
int dladdr(const void * __restrict, Dl_info * __restrict);
int dlctl(void *, int, void *);
int dlinfo(void *, int, void *);
+void *dlvsym(void * __restrict, const char * __restrict,
+ const char * __restrict);
#endif
__aconst char *dlerror(void);
__END_DECLS
diff -r 84eee28a1a66 -r bb18085e8ab2 lib/libc/dlfcn/dlfcn_elf.c
--- a/lib/libc/dlfcn/dlfcn_elf.c Sat Jun 25 02:26:53 2011 +0000
+++ b/lib/libc/dlfcn/dlfcn_elf.c Sat Jun 25 05:45:10 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: dlfcn_elf.c,v 1.9 2011/03/12 21:55:09 joerg Exp $ */
+/* $NetBSD: dlfcn_elf.c,v 1.10 2011/06/25 05:45:11 nonaka Exp $ */
/*
* Copyright (c) 2000 Takuya SHIOZAKI
@@ -27,7 +27,7 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: dlfcn_elf.c,v 1.9 2011/03/12 21:55:09 joerg Exp $");
+__RCSID("$NetBSD: dlfcn_elf.c,v 1.10 2011/06/25 05:45:11 nonaka Exp $");
#endif /* LIBC_SCCS and not lint */
#include "namespace.h"
@@ -47,6 +47,7 @@
#define dlopen ___dlopen
#define dlclose ___dlclose
#define dlsym ___dlsym
+#define dlvsym ___dlvsym
#define dlerror ___dlerror
#define dladdr ___dladdr
#define dlinfo ___dlinfo
@@ -59,6 +60,7 @@
__weak_alias(dlopen,___dlopen)
__weak_alias(dlclose,___dlclose)
__weak_alias(dlsym,___dlsym)
+__weak_alias(dlvsym,___dlvsym)
__weak_alias(dlerror,___dlerror)
__weak_alias(dladdr,___dladdr)
__weak_alias(dlinfo,___dlinfo)
@@ -67,6 +69,7 @@
__weak_alias(__dlopen,___dlopen)
__weak_alias(__dlclose,___dlclose)
__weak_alias(__dlsym,___dlsym)
+__weak_alias(__dlvsym,___dlvsym)
__weak_alias(__dlerror,___dlerror)
__weak_alias(__dladdr,___dladdr)
__weak_alias(__dlinfo,___dlinfo)
@@ -110,6 +113,14 @@
}
/*ARGSUSED*/
+void *
+dlvsym(void *handle, const char *name, const char *version)
+{
+
+ return NULL;
+}
+
+/*ARGSUSED*/
__aconst char *
dlerror()
{
diff -r 84eee28a1a66 -r bb18085e8ab2 libexec/ld.elf_so/Makefile
--- a/libexec/ld.elf_so/Makefile Sat Jun 25 02:26:53 2011 +0000
+++ b/libexec/ld.elf_so/Makefile Sat Jun 25 05:45:10 2011 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.107 2011/06/05 23:08:17 christos Exp $
+# $NetBSD: Makefile,v 1.108 2011/06/25 05:45:12 nonaka Exp $
#
# NOTE: when changing ld.so, ensure that ldd still compiles.
#
@@ -63,7 +63,7 @@
SRCS+= rtld.c reloc.c symbol.c xmalloc.c xprintf.c debug.c \
map_object.c load.c search.c headers.c paths.c expand.c \
- tls.c
+ tls.c symver.c
.if ${USE_FORT} == "yes"
.PATH.c: ${NETBSDSRCDIR}/lib/libc/misc
diff -r 84eee28a1a66 -r bb18085e8ab2 libexec/ld.elf_so/headers.c
--- a/libexec/ld.elf_so/headers.c Sat Jun 25 02:26:53 2011 +0000
+++ b/libexec/ld.elf_so/headers.c Sat Jun 25 05:45:10 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: headers.c,v 1.40 2011/03/09 23:10:07 joerg Exp $ */
+/* $NetBSD: headers.c,v 1.41 2011/06/25 05:45:12 nonaka Exp $ */
/*
* Copyright 1996 John D. Polstra.
@@ -40,7 +40,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: headers.c,v 1.40 2011/03/09 23:10:07 joerg Exp $");
+__RCSID("$NetBSD: headers.c,v 1.41 2011/06/25 05:45:12 nonaka Exp $");
#endif /* not lint */
#include <err.h>
@@ -136,6 +136,29 @@
obj->strsize = dynp->d_un.d_val;
break;
+ case DT_VERNEED:
+ obj->verneed = (const Elf_Verneed *)
+ (obj->relocbase + dynp->d_un.d_ptr);
+ break;
+
+ case DT_VERNEEDNUM:
+ obj->verneednum = dynp->d_un.d_val;
+ break;
+
+ case DT_VERDEF:
+ obj->verdef = (const Elf_Verdef *)
+ (obj->relocbase + dynp->d_un.d_ptr);
+ break;
+
+ case DT_VERDEFNUM:
+ obj->verdefnum = dynp->d_un.d_val;
+ break;
+
+ case DT_VERSYM:
+ obj->versyms = (const Elf_Versym *)
+ (obj->relocbase + dynp->d_un.d_ptr);
+ break;
+
case DT_HASH:
Home |
Main Index |
Thread Index |
Old Index