diff options
Diffstat (limited to 'elf')
-rw-r--r-- | elf/Makefile | 5 | ||||
-rw-r--r-- | elf/rtld.c | 3 | ||||
-rwxr-xr-x | elf/tst-rtld-load-self.sh | 46 |
3 files changed, 52 insertions, 2 deletions
diff --git a/elf/Makefile b/elf/Makefile index b99937624c..c844739adc 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -434,7 +434,7 @@ generated += $(addsuffix .so,$(strip $(modules-names))) ifeq (yes,$(build-shared)) ifeq ($(cross-compiling),no) -tests: $(objpfx)tst-pathopt.out +tests: $(objpfx)tst-pathopt.out $(objpfx)tst-rtld-load-self.out endif endif @@ -707,6 +707,9 @@ $(objpfx)tst-pathopt.out: tst-pathopt.sh $(objpfx)tst-pathopt \ $(objpfx)pathoptobj.so $(SHELL) -e $< $(common-objpfx) +$(objpfx)tst-rtld-load-self.out: tst-rtld-load-self.sh $(objpfx)ld.so + $(SHELL) $^ > $@ + $(objpfx)initfirst: $(libdl) $(objpfx)initfirst.out: $(objpfx)firstobj.so diff --git a/elf/rtld.c b/elf/rtld.c index fc221ace25..ed0a86bb3d 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -1093,7 +1093,8 @@ of this helper program; chances are you did not intend to run this program.\n\ /* Now the map for the main executable is available. */ main_map = GL(dl_ns)[LM_ID_BASE]._ns_loaded; - if (GL(dl_rtld_map).l_info[DT_SONAME] != NULL + if (__builtin_expect (mode, normal) == normal + && GL(dl_rtld_map).l_info[DT_SONAME] != NULL && main_map->l_info[DT_SONAME] != NULL && strcmp ((const char *) D_PTR (&GL(dl_rtld_map), l_info[DT_STRTAB]) + GL(dl_rtld_map).l_info[DT_SONAME]->d_un.d_val, diff --git a/elf/tst-rtld-load-self.sh b/elf/tst-rtld-load-self.sh new file mode 100755 index 0000000000..f4c5dea23a --- /dev/null +++ b/elf/tst-rtld-load-self.sh @@ -0,0 +1,46 @@ +#! /bin/sh +# Test how rtld loads itself. +# Copyright (C) 2012 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 +# <http://www.gnu.org/licenses/>. + +set -e + +rtld=$1 +result=0 + +echo '# normal mode' +$rtld $rtld 2>&1 && rc=0 || rc=$? +echo "# exit status $rc" +test $rc -le 127 || result=1 + +echo '# list mode' +$rtld --list $rtld 2>&1 && rc=0 || rc=$? +echo "# exit status $rc" +test $rc -eq 0 || result=1 + +echo '# verify mode' +$rtld --verify $rtld 2>&1 && rc=0 || rc=$? +echo "# exit status $rc" +test $rc -eq 2 || result=1 + +echo '# trace mode' +LD_TRACE_LOADED_OBJECTS=1 $rtld $rtld 2>&1 && rc=0 || rc=$? +echo "# exit status $rc" +test $rc -eq 0 || result=1 + +exit $result |