unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Wang Bing via Libc-alpha <libc-alpha@sourceware.org>
To: <libc-alpha@sourceware.org>, <szabolcs.nagy@arm.com>
Cc: <nixiaoming@huawei.com>, <zhongjubin@huawei.com>, <yanhuijun@huawei.com>
Subject: [PATCH] dlsym: Add RTLD_PROBE to dlsym only probe symbol without add dependency.
Date: Tue, 22 Nov 2022 10:30:41 +0800	[thread overview]
Message-ID: <20221122023041.36724-1-wangbing6@huawei.com> (raw)

Signed-off-by: Wang Bing <wangbing6@huawei.com>
---
 dlfcn/dlfcn.h              |  4 ++++
 elf/Makefile               |  1 +
 elf/dl-sym.c               | 13 +++++++++---
 elf/tst-dlsym-rtld-probe.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 65 insertions(+), 3 deletions(-)
 create mode 100644 elf/tst-dlsym-rtld-probe.c

diff --git a/dlfcn/dlfcn.h b/dlfcn/dlfcn.h
index 6f7cad8682..ab709883a6 100644
--- a/dlfcn/dlfcn.h
+++ b/dlfcn/dlfcn.h
@@ -49,6 +49,10 @@ typedef long int Lmid_t;
    is returned.  */
 #define RTLD_DEFAULT	((void *) 0)
 
+/* If only find sym in the global scope, but will not use it, do not
+   set sym dependency. */
+# define RTLD_PROBE    ((void *) -2l)
+
 __BEGIN_DECLS
 
 /* Open the shared object FILE and map it in; return a handle that can be
diff --git a/elf/Makefile b/elf/Makefile
index eca7b28ab5..f9fc9fbebb 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -472,6 +472,7 @@ tests += \
   unload7 \
   unload8 \
   valgrind-test \
+  tst-dlsym-rtld-probe \
   # tests
 tests-cxx = \
   tst-dlopen-nodelete-reloc \
diff --git a/elf/dl-sym.c b/elf/dl-sym.c
index b1cf42f36d..bc95b12a19 100644
--- a/elf/dl-sym.c
+++ b/elf/dl-sym.c
@@ -92,10 +92,17 @@ do_sym (void *handle, const char *name, void *who,
   /* Link map of the caller if needed.  */
   struct link_map *match = NULL;
 
-  if (handle == RTLD_DEFAULT)
+  int def_flags;
+
+  if (handle == RTLD_DEFAULT || handle == RTLD_PROBE)
     {
       match = _dl_sym_find_caller_link_map (caller);
 
+      def_flags = flags
+      if (def_flags == RTLD_DEFAULT) {
+          def_flags != DL_LOOKUP_ADD_DEPENDENCY;
+      }
+
       /* Search the global scope.  We have the simple case where
 	 we look up in the scope of an object which was part of
 	 the initial binary.  And then the more complex part
@@ -104,7 +111,7 @@ do_sym (void *handle, const char *name, void *who,
       if (RTLD_SINGLE_THREAD_P)
 	result = GLRO(dl_lookup_symbol_x) (name, match, &ref,
 					   match->l_scope, vers, 0,
-					   flags | DL_LOOKUP_ADD_DEPENDENCY,
+					   def_flags,
 					   NULL);
       else
 	{
@@ -113,7 +120,7 @@ do_sym (void *handle, const char *name, void *who,
 	  args.map = match;
 	  args.vers = vers;
 	  args.flags
-	    = flags | DL_LOOKUP_ADD_DEPENDENCY | DL_LOOKUP_GSCOPE_LOCK;
+	    = def_flags | DL_LOOKUP_GSCOPE_LOCK;
 	  args.refp = &ref;
 
 	  THREAD_GSCOPE_SET_FLAG ();
diff --git a/elf/tst-dlsym-rtld-probe.c b/elf/tst-dlsym-rtld-probe.c
new file mode 100644
index 0000000000..c72ceaa182
--- /dev/null
+++ b/elf/tst-dlsym-rtld-probe.c
@@ -0,0 +1,50 @@
+/* Test RTLD_PROBE for dlsym.
+   Copyright (C) 2022-2022 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <dlfcn.h>
+#include <gnu/lib-names.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <support/check.h>
+#include <support/xdlfcn.h>
+
+static int
+do_test (void)
+{
+  int *iptr;
+  int ret;
+  void *handle;
+
+  handle = dlopen (LIBM_SO, RTLD_LAZY);
+  TEST_VERIFY (handle == NULL);
+  iptr = (int *)dlsym (RTLD_PROBE, "finite");	// get sym but not call --detect if symbol exist
+  ret = dlclose (handle);
+  TEST_VERIFY (ret != 0);
+  ret = 0;
+
+  handle = dlopen (LIBM_SO, RTLD_LAZY);
+  TEST_VERIFY (handle == NULL);
+  iptr = (int *)dlsym (RTLD_DEFAULT, "finite"); // get sym and keep
+  ret = dlcose (handle);
+  TEST_VERIFY (ret == 0);
+  return 0;
+}
+
+
+#include <support/test-driver.c>
-- 
2.12.3


             reply	other threads:[~2022-11-22  2:31 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-22  2:30 Wang Bing via Libc-alpha [this message]
2022-11-22  2:36 ` [PATCH] dlsym: Add RTLD_PROBE to dlsym only probe symbol without add dependency H.J. Lu via Libc-alpha
2022-11-22 16:35   ` H.J. Lu via Libc-alpha
2022-11-23  2:21     ` [PATCH v2] " Wang Bing via Libc-alpha
2022-12-05 14:45       ` Florian Weimer via Libc-alpha
  -- strict thread matches above, loose matches on Subject: below --
2022-11-23  2:05 [PATCH] " Wangbing(wangbing, RTOS/Poincare Lab) via Libc-alpha

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/libc/involved.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221122023041.36724-1-wangbing6@huawei.com \
    --to=libc-alpha@sourceware.org \
    --cc=nixiaoming@huawei.com \
    --cc=szabolcs.nagy@arm.com \
    --cc=wangbing6@huawei.com \
    --cc=yanhuijun@huawei.com \
    --cc=zhongjubin@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).