elf: Fix audit regression

Commit 03e187a41d added a regression when an audit module does not have
libc as DT_NEEDED (although unusual it is possible).

Checked on x86_64-linux-gnu.
This commit is contained in:
Adhemerval Zanella 2021-06-30 00:21:18 -03:00
parent c37fc3ebf0
commit 3908fa933a
4 changed files with 61 additions and 10 deletions

View File

@ -219,7 +219,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
tst-dlopen-self tst-auditmany tst-initfinilazyfail tst-dlopenfail \
tst-dlopenfail-2 \
tst-filterobj tst-filterobj-dlopen tst-auxobj tst-auxobj-dlopen \
tst-audit14 tst-audit15 tst-audit16 \
tst-audit14 tst-audit15 tst-audit16 tst-audit17 \
tst-single_threaded tst-single_threaded-pthread \
tst-tls-ie tst-tls-ie-dlmopen argv0test \
tst-glibc-hwcaps tst-glibc-hwcaps-prepend tst-glibc-hwcaps-mask \
@ -1475,6 +1475,16 @@ $(objpfx)tst-auditlogmod-3.so: $(libsupport)
$(objpfx)tst-audit16.out: \
$(objpfx)tst-auditlogmod-1.so $(objpfx)tst-auditlogmod-2.so \
$(objpfx)tst-auditlogmod-3.so
$(objpfx)tst-audit17.out: $(objpfx)tst-auditmod17.so
# The test check if a audit library without libc.so on DT_NEEDED works as
# intended, so it uses an explicit link rule.
$(objpfx)tst-auditmod17.so: $(objpfx)tst-auditmod17.os
$(CC) -nostdlib -nostartfiles -shared -o $@.new \
$(filter-out $(map-file),$^)
$(call after-link,$@.new)
mv -f $@.new $@
CFLAGS-.os += $(call elide-stack-protector,.os,tst-auditmod17)
tst-audit17-ENV = LD_AUDIT=$(objpfx)tst-auditmod17.so
# tst-sonamemove links against an older implementation of the library.
LDFLAGS-tst-sonamemove-linkmod1.so = \

View File

@ -769,16 +769,9 @@ dl_open_worker (void *a)
namespace. */
if (!args->libc_already_loaded)
{
/* dlopen cannot be used to load an initial libc by design. */
struct link_map *libc_map = GL(dl_ns)[args->nsid].libc_map;
#ifdef SHARED
bool initial = libc_map->l_ns == LM_ID_BASE;
#else
/* In the static case, there is only one namespace, but it
contains a secondary libc (the primary libc is statically
linked). */
bool initial = false;
#endif
_dl_call_libc_early_init (libc_map, initial);
_dl_call_libc_early_init (libc_map, false);
}
/* Run the initializer functions of new objects. Temporarily

25
elf/tst-audit17.c Normal file
View File

@ -0,0 +1,25 @@
/* Check DT_AUDIT with audit not linked against libc.
Copyright (C) 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/>. */
static int
do_test (void)
{
return 0;
}
#include <support/test-driver.c>

23
elf/tst-auditmod17.c Normal file
View File

@ -0,0 +1,23 @@
/* Check DT_AUDIT with audit not linked against libc.
Copyright (C) 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/>. */
unsigned int
la_version (unsigned int version)
{
return version;
}