diff options
Diffstat (limited to 'elf')
-rw-r--r-- | elf/Makefile | 8 | ||||
-rw-r--r-- | elf/dl-addr.c | 2 | ||||
-rw-r--r-- | elf/tst-absolute-sym-lib.c | 25 | ||||
-rw-r--r-- | elf/tst-absolute-sym-lib.lds | 19 | ||||
-rw-r--r-- | elf/tst-absolute-sym.c | 38 |
5 files changed, 90 insertions, 2 deletions
diff --git a/elf/Makefile b/elf/Makefile index 59bcca5046..e658928305 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -186,7 +186,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \ tst-tlsalign tst-tlsalign-extern tst-nodelete-opened \ tst-nodelete2 tst-audit11 tst-audit12 tst-dlsym-error tst-noload \ tst-latepthread tst-tls-manydynamic tst-nodelete-dlclose \ - tst-debug1 tst-main1 + tst-debug1 tst-main1 tst-absolute-sym # reldep9 tests-internal += loadtest unload unload2 circleload1 \ neededtest neededtest2 neededtest3 neededtest4 \ @@ -272,7 +272,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-main1mod tst-libc_dlvsym-dso tst-absolute-sym-lib ifeq (yes,$(have-mtls-dialect-gnu2)) tests += tst-gnu2-tls1 modules-names += tst-gnu2-tls1mod @@ -1437,6 +1437,10 @@ tst-main1-no-pie = yes LDLIBS-tst-main1 = $(libsupport) tst-main1mod.so-no-z-defs = yes +LDLIBS-tst-absolute-sym-lib.so = tst-absolute-sym-lib.lds +$(objpfx)tst-absolute-sym-lib.so: $(LDLIBS-tst-absolute-sym-lib.so) +$(objpfx)tst-absolute-sym: $(objpfx)tst-absolute-sym-lib.so + # Both the main program and the DSO for tst-libc_dlvsym need to link # against libdl. $(objpfx)tst-libc_dlvsym: $(libdl) diff --git a/elf/dl-addr.c b/elf/dl-addr.c index 2250617a73..e6c7d02094 100644 --- a/elf/dl-addr.c +++ b/elf/dl-addr.c @@ -59,6 +59,7 @@ determine_info (const ElfW(Addr) addr, struct link_map *match, Dl_info *info, we can omit that test here. */ if ((symtab[symndx].st_shndx != SHN_UNDEF || symtab[symndx].st_value != 0) + && symtab[symndx].st_shndx != SHN_ABS && ELFW(ST_TYPE) (symtab[symndx].st_info) != STT_TLS && DL_ADDR_SYM_MATCH (match, &symtab[symndx], matchsym, addr) @@ -91,6 +92,7 @@ determine_info (const ElfW(Addr) addr, struct link_map *match, Dl_info *info, && ELFW(ST_TYPE) (symtab->st_info) != STT_TLS && (symtab->st_shndx != SHN_UNDEF || symtab->st_value != 0) + && symtab->st_shndx != SHN_ABS && DL_ADDR_SYM_MATCH (match, symtab, matchsym, addr) && symtab->st_name < strtabsize) matchsym = (ElfW(Sym) *) symtab; diff --git a/elf/tst-absolute-sym-lib.c b/elf/tst-absolute-sym-lib.c new file mode 100644 index 0000000000..912cb0048a --- /dev/null +++ b/elf/tst-absolute-sym-lib.c @@ -0,0 +1,25 @@ +/* BZ #19818 absolute symbol calculation shared module. + Copyright (C) 2018 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/>. */ + +extern char absolute; + +void * +get_absolute (void) +{ + return &absolute; +} diff --git a/elf/tst-absolute-sym-lib.lds b/elf/tst-absolute-sym-lib.lds new file mode 100644 index 0000000000..d4a4128514 --- /dev/null +++ b/elf/tst-absolute-sym-lib.lds @@ -0,0 +1,19 @@ +/* BZ #19818 absolute symbol calculation linker script. + Copyright (C) 2018 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/>. */ + +"absolute" = 0x55aa; diff --git a/elf/tst-absolute-sym.c b/elf/tst-absolute-sym.c new file mode 100644 index 0000000000..111491d159 --- /dev/null +++ b/elf/tst-absolute-sym.c @@ -0,0 +1,38 @@ +/* BZ #19818 absolute symbol calculation main executable. + Copyright (C) 2018 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/>. */ + +#include <support/check.h> +#include <support/support.h> +#include <support/test-driver.h> + +void *get_absolute (void); + +static int +do_test (void) +{ + void *ref = (void *) 0x55aa; + void *ptr; + + ptr = get_absolute (); + if (ptr != ref) + FAIL_EXIT1 ("Got %p, expected %p\n", ptr, ref); + + return 0; +} + +#include <support/test-driver.c> |