1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-01 10:06:57 +03:00

elf: Do not run IFUNC resolvers for LD_DEBUG=unused [BZ #24214]

This commit adds missing skip_ifunc checks to aarch64, arm, i386,
sparc, and x86_64.  A new test case ensures that IRELATIVE IFUNC
resolvers do not run in various diagnostic modes of the dynamic
loader.

Reviewed-By: Szabolcs Nagy <szabolcs.nagy@arm.com>
This commit is contained in:
Florian Weimer
2019-11-29 17:55:22 +01:00
parent 61a7c9df71
commit 4db71d2f98
9 changed files with 114 additions and 10 deletions

View File

@ -425,11 +425,13 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
*reloc_addr = value;
break;
case R_SPARC_IRELATIVE:
value = ((Elf32_Addr (*) (int)) value) (GLRO(dl_hwcap));
if (__glibc_likely (!skip_ifunc))
value = ((Elf32_Addr (*) (int)) value) (GLRO(dl_hwcap));
*reloc_addr = value;
break;
case R_SPARC_JMP_IREL:
value = ((Elf32_Addr (*) (int)) value) (GLRO(dl_hwcap));
if (__glibc_likely (!skip_ifunc))
value = ((Elf32_Addr (*) (int)) value) (GLRO(dl_hwcap));
/* Fall thru */
case R_SPARC_JMP_SLOT:
{

View File

@ -450,11 +450,13 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
*reloc_addr = value;
break;
case R_SPARC_IRELATIVE:
value = ((Elf64_Addr (*) (int)) value) (GLRO(dl_hwcap));
if (__glibc_likely (!skip_ifunc))
value = ((Elf64_Addr (*) (int)) value) (GLRO(dl_hwcap));
*reloc_addr = value;
break;
case R_SPARC_JMP_IREL:
value = ((Elf64_Addr (*) (int)) value) (GLRO(dl_hwcap));
if (__glibc_likely (!skip_ifunc))
value = ((Elf64_Addr (*) (int)) value) (GLRO(dl_hwcap));
/* 'high' is always zero, for large PLT entries the linker
emits an R_SPARC_IRELATIVE. */
#ifdef RESOLVE_CONFLICT_FIND_MAP