elf: Clean up GLIBC_PRIVATE exports of internal libdl symbols

They are no longer needed after everything has been moved into
libc.  The _dl_vsym test has to be removed because the symbol
cannot be used outside libc anymore.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
This commit is contained in:
Florian Weimer 2021-07-07 08:40:41 +02:00
parent ceda365fba
commit 7a5db2e82f
11 changed files with 18 additions and 260 deletions

View File

@ -196,4 +196,3 @@ _dlerror_run (void (*operate) (void *), void *args)
return 1;
}
}
libc_hidden_def (_dlerror_run)

View File

@ -165,7 +165,7 @@ tests-static-normal := tst-leaks1-static tst-array1-static tst-array5-static \
tests-static-internal := tst-tls1-static tst-tls2-static \
tst-ptrguard1-static tst-stackguard1-static \
tst-tls1-static-non-pie tst-libc_dlvsym-static
tst-tls1-static-non-pie
CRT-tst-tls1-static-non-pie := $(csu-objpfx)crt1.o
tst-tls1-static-non-pie-no-pie = yes
@ -229,7 +229,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
tests-internal += loadtest unload unload2 circleload1 \
neededtest neededtest2 neededtest3 neededtest4 \
tst-tls3 tst-tls6 tst-tls7 tst-tls8 tst-dlmopen2 \
tst-ptrguard1 tst-stackguard1 tst-libc_dlvsym \
tst-ptrguard1 tst-stackguard1 \
tst-create_format1 tst-tls-surplus tst-dl-hwcaps_split
tests-container += tst-pldd tst-dlopen-tlsmodid-container \
tst-dlopen-self-container tst-preload-pthread-libc
@ -326,7 +326,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
tst-audit12mod1 tst-audit12mod2 tst-audit12mod3 tst-auditmod12 \
tst-latepthreadmod $(tst-tls-many-dynamic-modules) \
tst-nodelete-dlclose-dso tst-nodelete-dlclose-plugin \
tst-main1mod tst-libc_dlvsym-dso tst-absolute-sym-lib \
tst-main1mod tst-absolute-sym-lib \
tst-absolute-zero-lib tst-big-note-lib tst-unwind-ctor-lib \
tst-audit13mod1 tst-sonamemove-linkmod1 \
tst-sonamemove-runmod1 tst-sonamemove-runmod2 \
@ -352,7 +352,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
# Most modules build with _ISOMAC defined, but those filtered out
# depend on internal headers.
modules-names-tests = $(filter-out ifuncmod% tst-libc_dlvsym-dso tst-tlsmod%,\
modules-names-tests = $(filter-out ifuncmod% tst-tlsmod%,\
$(modules-names))
ifeq (yes,$(have-mtls-dialect-gnu2))
@ -1582,14 +1582,6 @@ LDLIBS-tst-absolute-zero-lib.so = tst-absolute-zero-lib.lds
$(objpfx)tst-absolute-zero-lib.so: $(LDLIBS-tst-absolute-zero-lib.so)
$(objpfx)tst-absolute-zero: $(objpfx)tst-absolute-zero-lib.so
# Both the main program and the DSO for tst-libc_dlvsym need to link
# against libdl.
$(objpfx)tst-libc_dlvsym-dso.so: $(libsupport)
$(objpfx)tst-libc_dlvsym.out: $(objpfx)tst-libc_dlvsym-dso.so
tst-libc_dlvsym-static-ENV = \
LD_LIBRARY_PATH=$(ld-library-path):$(common-objpfx)dlfcn
$(objpfx)tst-libc_dlvsym-static.out: $(objpfx)tst-libc_dlvsym-dso.so
$(objpfx)tst-big-note: $(objpfx)tst-big-note-lib.so
# Avoid creating an ABI tag note, which may come before the
# artificial, large note in tst-big-note-lib.o and invalidate the

View File

@ -22,9 +22,6 @@ libc {
%endif
GLIBC_PRIVATE {
# functions used in other libraries
_dl_addr;
_dl_sym; _dl_vsym;
__libc_dlclose; __libc_dlopen_mode; __libc_dlsym; __libc_dlvsym;
__libc_early_init;
# Internal error handling support. Interposes the functions in ld.so.

View File

@ -142,4 +142,3 @@ _dl_addr (const void *address, Dl_info *info,
return result;
}
libc_hidden_def (_dl_addr)

View File

@ -162,7 +162,6 @@ __libc_dlopen_mode (const char *name, int mode)
#endif
return dlerror_run (do_dlopen, &args) ? NULL : (void *) args.map;
}
libc_hidden_def (__libc_dlopen_mode)
#ifndef SHARED
void *
@ -192,7 +191,6 @@ __libc_dlsym (void *map, const char *name)
return (dlerror_run (do_dlsym, &args) ? NULL
: (void *) (DL_SYMBOL_ADDRESS (args.loadbase, args.ref)));
}
libc_hidden_def (__libc_dlsym)
/* Replacement for dlvsym. MAP must be a real map. This function
returns NULL without setting the dlerror value in case of static
@ -219,7 +217,6 @@ __libc_dlvsym (void *map, const char *name, const char *version)
: (void *) (DL_SYMBOL_ADDRESS (args.dlsym.loadbase,
args.dlsym.ref)));
}
libc_hidden_def (__libc_dlvsym)
int
__libc_dlclose (void *map)
@ -230,7 +227,6 @@ __libc_dlclose (void *map)
#endif
return dlerror_run (do_dlclose, map);
}
libc_hidden_def (__libc_dlclose)
static bool __libc_freeres_fn_section

View File

@ -188,11 +188,9 @@ _dl_vsym (void *handle, const char *name, const char *version, void *who)
return do_sym (handle, name, who, &vers, 0);
}
libc_hidden_def (_dl_vsym)
void *
_dl_sym (void *handle, const char *name, void *who)
{
return do_sym (handle, name, who, NULL, DL_LOOKUP_RETURN_NEWEST);
}
libc_hidden_def (_dl_sym)

View File

@ -1,25 +0,0 @@
/* Compare dlvsym and __libc_dlvsym results. Shared object code.
Copyright (C) 2017-2021 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 "tst-libc_dlvsym.h"
void
compare_vsyms_global (void)
{
compare_vsyms ();
}

View File

@ -1,32 +0,0 @@
/* Compare dlvsym and __libc_dlvsym results. Static version.
Copyright (C) 2017-2021 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 <support/xdlfcn.h>
static int
do_test (void)
{
void *handle = xdlopen ("tst-libc_dlvsym-dso.so", RTLD_LAZY);
void (*compare) (void) = xdlsym (handle, "compare_vsyms_global");
compare ();
xdlclose (handle);
return 0;
}
#include <support/test-driver.c>

View File

@ -1,34 +0,0 @@
/* Compare dlvsym and __libc_dlvsym results. Dynamic version.
Copyright (C) 2017-2021 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 "tst-libc_dlvsym.h"
static int
do_test (void)
{
compare_vsyms ();
void *handle = xdlopen ("tst-libc_dlvsym-dso.so", RTLD_LAZY);
void (*compare) (void) = xdlsym (handle, "compare_vsyms_global");
compare ();
xdlclose (handle);
return 0;
}
#include <support/test-driver.c>

View File

@ -1,130 +0,0 @@
/* Compare dlvsym and __libc_dlvsym results. Common code.
Copyright (C) 2017-2021 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/>. */
/* compare_vsyms is the main entry point for these tests.
Indirectly, It calls __libc_dlvsym (from libc.so; internal
interface) and dlvsym (from libdl.so; public interface) to compare
the results for a selected set of symbols in libc.so which
typically have more than one symbol version. The two functions are
implemented by somewhat different code, and this test checks that
their results are the same.
The versions are generated to range from GLIBC_2.0 to GLIBC_2.Y,
with Y being the current __GLIBC_MINOR__ version plus two. In
addition, there is a list of special symbol versions of the form
GLIBC_2.Y.Z, which were used for some releases.
Comparing the two dlvsym results at versions which do not actually
exist does not test much, but it will not contribute to false test
failures, either. */
#include <array_length.h>
#include <gnu/lib-names.h>
#include <stdbool.h>
#include <stdio.h>
#include <support/check.h>
#include <support/xdlfcn.h>
/* Run consistency check for versioned symbol NAME@VERSION. NB: We
may execute in a shared object, so exit on error for proper error
reporting. */
static void
compare_vsyms_0 (void *libc_handle, const char *name, const char *version,
bool *pfound)
{
void *dlvsym_address = dlvsym (libc_handle, name, version);
void *libc_dlvsym_address
= __libc_dlvsym (libc_handle, name, version);
if (dlvsym_address != libc_dlvsym_address)
FAIL_EXIT1 ("%s@%s mismatch: %p != %p",
name, version, dlvsym_address, libc_dlvsym_address);
if (dlvsym_address != NULL)
*pfound = true;
}
/* Run consistency check for versioned symbol NAME at multiple symbol
version. */
static void
compare_vsyms_1 (void *libc_handle, const char *name)
{
bool found = false;
/* Historic versions which do not follow the usual GLIBC_2.Y
pattern, to increase test coverage. Not all architectures have
those, but probing additional versions does not hurt. */
static const char special_versions[][12] =
{
"GLIBC_2.1.1",
"GLIBC_2.1.2",
"GLIBC_2.1.3",
"GLIBC_2.1.4",
"GLIBC_2.2.1",
"GLIBC_2.2.2",
"GLIBC_2.2.3",
"GLIBC_2.2.4",
"GLIBC_2.2.5",
"GLIBC_2.2.6",
"GLIBC_2.3.2",
"GLIBC_2.3.3",
"GLIBC_2.3.4",
};
for (int i = 0; i < array_length (special_versions); ++i)
compare_vsyms_0 (libc_handle, name, special_versions[i], &found);
/* Iterate to an out-of-range version, to cover some unused symbols
as well. */
for (int minor_version = 0; minor_version <= __GLIBC_MINOR__ + 2;
++minor_version)
{
char version[30];
snprintf (version, sizeof (version), "GLIBC_%d.%d",
__GLIBC__, minor_version);
compare_vsyms_0 (libc_handle, name, version, &found);
}
if (!found)
FAIL_EXIT1 ("symbol %s not found at any version", name);
}
/* Run consistency checks for various symbols which usually have
multiple versions. */
static void
compare_vsyms (void)
{
/* The minor version loop in compare_vsyms_1 needs updating in case
we ever switch to glibc 3.0. */
if (__GLIBC__ != 2)
FAIL_EXIT1 ("unexpected glibc major version: %d", __GLIBC__);
/* __libc_dlvsym does not recognize the special RTLD_* handles, so
obtain an explicit handle for libc.so. */
void *libc_handle = xdlopen (LIBC_SO, RTLD_LAZY | RTLD_NOLOAD);
/* sys_errlist and sys_siglist were deprecated in glibc 2.32 and they are
not available on architectures with base ABI newer than 2.32. */
#if TEST_COMPAT (libc, GLIBC_2_0, GLIBC_2_32)
compare_vsyms_1 (libc_handle, "_sys_errlist");
compare_vsyms_1 (libc_handle, "_sys_siglist");
#endif
compare_vsyms_1 (libc_handle, "quick_exit");
xdlclose (libc_handle);
}

View File

@ -45,20 +45,20 @@ extern char **__libc_argv attribute_hidden;
better error handling semantics for the library. */
#define __libc_dlopen(name) \
__libc_dlopen_mode (name, RTLD_NOW | __RTLD_DLOPEN)
extern void *__libc_dlopen_mode (const char *__name, int __mode);
extern void *__libc_dlsym (void *__map, const char *__name);
extern void *__libc_dlvsym (void *map, const char *name, const char *version);
extern int __libc_dlclose (void *__map);
libc_hidden_proto (__libc_dlopen_mode)
libc_hidden_proto (__libc_dlsym)
libc_hidden_proto (__libc_dlvsym)
libc_hidden_proto (__libc_dlclose)
extern void *__libc_dlopen_mode (const char *__name, int __mode)
attribute_hidden;
extern void *__libc_dlsym (void *__map, const char *__name)
attribute_hidden;
extern void *__libc_dlvsym (void *map, const char *name, const char *version)
attribute_hidden;
extern int __libc_dlclose (void *__map)
attribute_hidden;
/* Locate shared object containing the given address. */
#ifdef ElfW
extern int _dl_addr (const void *address, Dl_info *info,
struct link_map **mapp, const ElfW(Sym) **symbolp);
libc_hidden_proto (_dl_addr)
struct link_map **mapp, const ElfW(Sym) **symbolp)
attribute_hidden;
#endif
struct link_map;
@ -73,23 +73,21 @@ extern void _dl_close_worker (struct link_map *map, bool force)
/* Look up NAME in shared object HANDLE (which may be RTLD_DEFAULT or
RTLD_NEXT). WHO is the calling function, for RTLD_NEXT. Returns
the symbol value, which may be NULL. */
extern void *_dl_sym (void *handle, const char *name, void *who);
libc_hidden_proto (_dl_sym)
extern void *_dl_sym (void *handle, const char *name, void *who)
attribute_hidden;
/* Look up version VERSION of symbol NAME in shared object HANDLE
(which may be RTLD_DEFAULT or RTLD_NEXT). WHO is the calling
function, for RTLD_NEXT. Returns the symbol value, which may be
NULL. */
extern void *_dl_vsym (void *handle, const char *name, const char *version,
void *who);
libc_hidden_proto (_dl_vsym)
void *who) attribute_hidden;
/* Helper function for <dlfcn.h> functions. Runs the OPERATE function via
_dl_catch_error. Returns zero for success, nonzero for failure; and
arranges for `dlerror' to return the error details.
ARGS is passed as argument to OPERATE. */
extern int _dlerror_run (void (*operate) (void *), void *args);
libc_hidden_proto (_dlerror_run)
extern int _dlerror_run (void (*operate) (void *), void *args) attribute_hidden;
/* This structure is used to make the outer (statically linked)
implementation of dlopen and related functions to the inner libc