mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-24 02:03:35 +08:00
eb447b7b4b
There are two fixes that are needed to be able to dlopen filter objects. First _dl_map_object_deps cannot assume that map will be at the beginning of l_searchlist.r_list[], as filtees are inserted before map. Secondly dl_open_worker needs to ensure that filtees get relocated. In _dl_map_object_deps: * avoiding removing relocation dependencies of map by setting l_reserved to 0 and otherwise processing the rest of the search list. * ensure that map remains at the beginning of l_initfini - the list of things that need initialisation (and destruction). Do this by splitting the copy up. This may not be required, but matches the initialization order without dlopen. Modify dl_open_worker to relocate the objects in new->l_inifini. new->l_initfini is constructed in _dl_map_object_deps, and lists the objects that need initialization and destruction. Originally the list of objects in new->l_next are relocated. All of these objects should also be included in new->l_initfini (both lists are populated with dependencies in _dl_map_object_deps). We can't use new->l_prev to pick up filtees, as during a recursive dlopen from an interposed malloc call, l->prev can contain objects that are not ready for relocation. Add tests to verify that symbols resolve to the filtee implementation when auxiliary and filter objects are used, both as a normal link and when dlopen'd. Tested by running the testsuite on x86_64.
48 lines
1.5 KiB
C
48 lines
1.5 KiB
C
/* Test for BZ#16272, dlopen'ing an auxiliary filter object.
|
|
Ensure that symbols from the resolve correctly.
|
|
|
|
Copyright (C) 2020 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 <stdio.h>
|
|
#include <support/check.h>
|
|
#include <support/xdlfcn.h>
|
|
|
|
static int do_test (void)
|
|
{
|
|
void *lib = xdlopen ("tst-filterobj-aux.so", RTLD_LAZY);
|
|
char *(*fn)(void) = xdlsym (lib, "get_text");
|
|
const char* text = fn ();
|
|
|
|
printf ("%s\n", text);
|
|
|
|
/* Verify the text matches what we expect from the filtee */
|
|
TEST_COMPARE_STRING (text, "Hello from filtee (PASS)");
|
|
|
|
fn = xdlsym (lib, "get_text2");
|
|
text = fn ();
|
|
|
|
printf ("%s\n", text);
|
|
|
|
/* Verify the text matches what we expect from the auxiliary object */
|
|
TEST_COMPARE_STRING (text, "Hello from auxiliary filter object (PASS)");
|
|
|
|
return 0;
|
|
}
|
|
|
|
#include <support/test-driver.c>
|