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

elf: Remove LD_PROFILE for static binaries

The _dl_non_dynamic_init does not parse LD_PROFILE, which does not
enable profile for dlopen objects.  Since dlopen is deprecated for
static objects, it is better to remove the support.

It also allows to trim down libc.a of profile support.

Checked on x86_64-linux-gnu.
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
This commit is contained in:
Adhemerval Zanella
2023-11-06 17:25:46 -03:00
parent 4a133885a7
commit 55f41ef8de
39 changed files with 166 additions and 110 deletions

View File

@@ -37,12 +37,12 @@ routines = \
dl-iteratephdr \ dl-iteratephdr \
dl-libc \ dl-libc \
dl-origin \ dl-origin \
dl-profstub \
dl-reloc-static-pie \ dl-reloc-static-pie \
dl-support \ dl-support \
dl-sym \ dl-sym \
dl-sysdep \ dl-sysdep \
enbl-secure \ enbl-secure \
libc-dl-profstub \
libc-dl_find_object \ libc-dl_find_object \
libc_early_init \ libc_early_init \
rtld_static_init \ rtld_static_init \
@@ -72,7 +72,6 @@ dl-routines = \
dl-open \ dl-open \
dl-origin \ dl-origin \
dl-printf \ dl-printf \
dl-profile \
dl-reloc \ dl-reloc \
dl-runtime \ dl-runtime \
dl-scope \ dl-scope \
@@ -117,7 +116,11 @@ elide-routines.os = \
# elide-routines.os # elide-routines.os
# These object files are only included in the dynamically-linked libc. # These object files are only included in the dynamically-linked libc.
shared-only-routines = libc-dl_find_object shared-only-routines = \
libc-dl-profile \
libc-dl-profstub \
libc-dl_find_object \
# shared-only-routines
# ld.so uses those routines, plus some special stuff for being the program # ld.so uses those routines, plus some special stuff for being the program
# interpreter and operating independent of libc. # interpreter and operating independent of libc.
@@ -135,6 +138,7 @@ rtld-routines = \
dl-libc_freeres \ dl-libc_freeres \
dl-minimal \ dl-minimal \
dl-mutex \ dl-mutex \
dl-profile \
dl-sysdep \ dl-sysdep \
dl-usage \ dl-usage \
rtld \ rtld \

View File

@@ -1443,11 +1443,6 @@ cannot enable executable stack as shared object requires");
name by which the DSO is actually known. Add that as well. */ name by which the DSO is actually known. Add that as well. */
if (__glibc_unlikely (origname != NULL)) if (__glibc_unlikely (origname != NULL))
add_name_to_object (l, origname); add_name_to_object (l, origname);
#else
/* Audit modules only exist when linking is dynamic so ORIGNAME
cannot be non-NULL. */
assert (origname == NULL);
#endif
/* When we profile the SONAME might be needed for something else but /* When we profile the SONAME might be needed for something else but
loading. Add it right away. */ loading. Add it right away. */
@@ -1455,6 +1450,11 @@ cannot enable executable stack as shared object requires");
&& l->l_info[DT_SONAME] != NULL) && l->l_info[DT_SONAME] != NULL)
add_name_to_object (l, ((const char *) D_PTR (l, l_info[DT_STRTAB]) add_name_to_object (l, ((const char *) D_PTR (l, l_info[DT_STRTAB])
+ l->l_info[DT_SONAME]->d_un.d_val)); + l->l_info[DT_SONAME]->d_un.d_val));
#else
/* Audit modules only exist when linking is dynamic so ORIGNAME
cannot be non-NULL. */
assert (origname == NULL);
#endif
/* If we have newly loaded libc.so, update the namespace /* If we have newly loaded libc.so, update the namespace
description. */ description. */

View File

@@ -162,14 +162,14 @@ _dl_fixup (
return elf_machine_fixup_plt (l, result, refsym, sym, reloc, rel_addr, value); return elf_machine_fixup_plt (l, result, refsym, sym, reloc, rel_addr, value);
} }
#ifndef PROF #if !defined PROF && defined SHARED
DL_FIXUP_VALUE_TYPE DL_FIXUP_VALUE_TYPE
__attribute ((noinline)) __attribute ((noinline))
DL_ARCH_FIXUP_ATTRIBUTE DL_ARCH_FIXUP_ATTRIBUTE
_dl_profile_fixup ( _dl_profile_fixup (
#ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS # ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
ELF_MACHINE_RUNTIME_FIXUP_ARGS, ELF_MACHINE_RUNTIME_FIXUP_ARGS,
#endif # endif
struct link_map *l, ElfW(Word) reloc_arg, struct link_map *l, ElfW(Word) reloc_arg,
ElfW(Addr) retaddr, void *regs, long int *framesizep) ElfW(Addr) retaddr, void *regs, long int *framesizep)
{ {
@@ -309,14 +309,12 @@ _dl_profile_fixup (
/* And now perhaps the relocation addend. */ /* And now perhaps the relocation addend. */
value = elf_machine_plt_value (l, reloc, value); value = elf_machine_plt_value (l, reloc, value);
#ifdef SHARED
/* Auditing checkpoint: we have a new binding. Provide the /* Auditing checkpoint: we have a new binding. Provide the
auditing libraries the possibility to change the value and auditing libraries the possibility to change the value and
tell us whether further auditing is wanted. */ tell us whether further auditing is wanted. */
if (defsym != NULL && GLRO(dl_naudit) > 0) if (defsym != NULL && GLRO(dl_naudit) > 0)
_dl_audit_symbind (l, reloc_result, reloc, defsym, &value, result, _dl_audit_symbind (l, reloc_result, reloc, defsym, &value, result,
true); true);
#endif
/* Store the result for later runs. */ /* Store the result for later runs. */
if (__glibc_likely (! GLRO(dl_bind_not))) if (__glibc_likely (! GLRO(dl_bind_not)))
@@ -335,11 +333,9 @@ _dl_profile_fixup (
long int framesize = -1; long int framesize = -1;
#ifdef SHARED
/* Auditing checkpoint: report the PLT entering and allow the /* Auditing checkpoint: report the PLT entering and allow the
auditors to change the value. */ auditors to change the value. */
_dl_audit_pltenter (l, reloc_result, &value, regs, &framesize); _dl_audit_pltenter (l, reloc_result, &value, regs, &framesize);
#endif
/* Store the frame size information. */ /* Store the frame size information. */
*framesizep = framesize; *framesizep = framesize;
@@ -349,4 +345,4 @@ _dl_profile_fixup (
return value; return value;
} }
#endif /* PROF */ #endif /* !defined PROF && defined SHARED */

View File

@@ -60,10 +60,6 @@ int _dl_dynamic_weak;
/* If nonzero print warnings about problematic situations. */ /* If nonzero print warnings about problematic situations. */
int _dl_verbose; int _dl_verbose;
/* We never do profiling. */
const char *_dl_profile;
const char *_dl_profile_output;
/* Names of shared object for which the RUNPATHs and RPATHs should be /* Names of shared object for which the RUNPATHs and RPATHs should be
ignored. */ ignored. */
const char *_dl_inhibit_rpath; const char *_dl_inhibit_rpath;
@@ -301,11 +297,6 @@ _dl_non_dynamic_init (void)
_dl_dynamic_weak = *(getenv ("LD_DYNAMIC_WEAK") ?: "") == '\0'; _dl_dynamic_weak = *(getenv ("LD_DYNAMIC_WEAK") ?: "") == '\0';
_dl_profile_output = getenv ("LD_PROFILE_OUTPUT");
if (_dl_profile_output == NULL || _dl_profile_output[0] == '\0')
_dl_profile_output
= &"/var/tmp\0/var/profile"[__libc_enable_secure ? 9 : 0];
if (__libc_enable_secure) if (__libc_enable_secure)
{ {
static const char unsecure_envvars[] = static const char unsecure_envvars[] =

View File

@@ -135,5 +135,10 @@ extern int __dladdr1 (const void *address, Dl_info *info,
extern int __dlinfo (void *handle, int request, void *arg); extern int __dlinfo (void *handle, int request, void *arg);
extern char *__dlerror (void); extern char *__dlerror (void);
#ifndef SHARED
# undef DL_CALL_FCT
# define DL_CALL_FCT(fctp, args) ((fctp) args)
#endif
#endif #endif
#endif #endif

View File

@@ -68,7 +68,6 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
{ {
ElfW(Addr) *got; ElfW(Addr) *got;
extern void _dl_runtime_resolve (ElfW(Word)); extern void _dl_runtime_resolve (ElfW(Word));
extern void _dl_runtime_profile (ElfW(Word));
got = (ElfW(Addr) *) D_PTR (l, l_info[DT_PLTGOT]); got = (ElfW(Addr) *) D_PTR (l, l_info[DT_PLTGOT]);
if (got[1]) if (got[1])
@@ -83,6 +82,8 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
to intercept the calls to collect information. In this case we to intercept the calls to collect information. In this case we
don't store the address in the GOT so that all future calls also don't store the address in the GOT so that all future calls also
end in this function. */ end in this function. */
#ifdef SHARED
extern void _dl_runtime_profile (ElfW(Word));
if ( profile) if ( profile)
{ {
got[2] = (ElfW(Addr)) &_dl_runtime_profile; got[2] = (ElfW(Addr)) &_dl_runtime_profile;
@@ -94,6 +95,7 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
GL(dl_profile_map) = l; GL(dl_profile_map) = l;
} }
else else
#endif
{ {
/* This function will get called to fix up the GOT entry /* This function will get called to fix up the GOT entry
indicated by the offset on the stack, and then jump to indicated by the offset on the stack, and then jump to

View File

@@ -122,7 +122,7 @@ _dl_runtime_resolve:
cfi_endproc cfi_endproc
.size _dl_runtime_resolve, .-_dl_runtime_resolve .size _dl_runtime_resolve, .-_dl_runtime_resolve
#ifndef PROF #if !defined PROF && defined SHARED
.globl _dl_runtime_profile .globl _dl_runtime_profile
.type _dl_runtime_profile, #function .type _dl_runtime_profile, #function
cfi_startproc cfi_startproc

View File

@@ -75,9 +75,7 @@ elf_machine_runtime_setup (struct link_map *map, struct r_scope_elem *scope[],
int lazy, int profile) int lazy, int profile)
{ {
extern char _dl_runtime_resolve_new[] attribute_hidden; extern char _dl_runtime_resolve_new[] attribute_hidden;
extern char _dl_runtime_profile_new[] attribute_hidden;
extern char _dl_runtime_resolve_old[] attribute_hidden; extern char _dl_runtime_resolve_old[] attribute_hidden;
extern char _dl_runtime_profile_old[] attribute_hidden;
struct pltgot { struct pltgot {
char *resolve; char *resolve;
@@ -109,6 +107,9 @@ elf_machine_runtime_setup (struct link_map *map, struct r_scope_elem *scope[],
else else
resolve = _dl_runtime_resolve_old; resolve = _dl_runtime_resolve_old;
#ifdef SHARED
extern char _dl_runtime_profile_new[] attribute_hidden;
extern char _dl_runtime_profile_old[] attribute_hidden;
if (__builtin_expect (profile, 0)) if (__builtin_expect (profile, 0))
{ {
if (secureplt) if (secureplt)
@@ -123,6 +124,7 @@ elf_machine_runtime_setup (struct link_map *map, struct r_scope_elem *scope[],
GL(dl_profile_map) = map; GL(dl_profile_map) = map;
} }
} }
#endif
pg->resolve = resolve; pg->resolve = resolve;
pg->link = map; pg->link = map;

View File

@@ -89,6 +89,7 @@ _dl_runtime_resolve_new:
.globl _dl_runtime_profile_new .globl _dl_runtime_profile_new
.type _dl_runtime_profile_new, @function .type _dl_runtime_profile_new, @function
#ifdef SHARED
#undef FRAMESIZE #undef FRAMESIZE
#define FRAMESIZE 20*8 #define FRAMESIZE 20*8
@@ -207,6 +208,7 @@ _dl_runtime_profile_new:
cfi_endproc cfi_endproc
.size _dl_runtime_profile_new, .-_dl_runtime_profile_new .size _dl_runtime_profile_new, .-_dl_runtime_profile_new
#endif /* SHARED */
.align 4 .align 4
.globl _dl_runtime_resolve_old .globl _dl_runtime_resolve_old
@@ -340,6 +342,7 @@ _dl_runtime_resolve_old:
.usepv _dl_runtime_profile_old, no .usepv _dl_runtime_profile_old, no
.type _dl_runtime_profile_old, @function .type _dl_runtime_profile_old, @function
#ifdef SHARED
/* We save the registers in a different order than desired by /* We save the registers in a different order than desired by
.mask/.fmask, so we have to use explicit cfi directives. */ .mask/.fmask, so we have to use explicit cfi directives. */
cfi_startproc cfi_startproc
@@ -538,3 +541,4 @@ _dl_runtime_profile_old:
cfi_endproc cfi_endproc
.size _dl_runtime_profile_old, .-_dl_runtime_profile_old .size _dl_runtime_profile_old, .-_dl_runtime_profile_old
#endif /* SHARED */

View File

@@ -65,7 +65,6 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
{ {
Elf32_Addr *got; Elf32_Addr *got;
extern void _dl_runtime_resolve (Elf32_Word); extern void _dl_runtime_resolve (Elf32_Word);
extern void _dl_runtime_profile (Elf32_Word);
if (l->l_info[DT_JMPREL] && lazy) if (l->l_info[DT_JMPREL] && lazy)
{ {
@@ -88,6 +87,8 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
to intercept the calls to collect information. In this case we to intercept the calls to collect information. In this case we
don't store the address in the GOT so that all future calls also don't store the address in the GOT so that all future calls also
end in this function. */ end in this function. */
#ifdef SHARED
extern void _dl_runtime_profile (Elf32_Word);
if (profile) if (profile)
{ {
got[2] = (Elf32_Addr) &_dl_runtime_profile; got[2] = (Elf32_Addr) &_dl_runtime_profile;
@@ -99,6 +100,7 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
GL(dl_profile_map) = l; GL(dl_profile_map) = l;
} }
else else
#endif
/* This function will get called to fix up the GOT entry indicated by /* This function will get called to fix up the GOT entry indicated by
the offset on the stack, and then jump to the resolved address. */ the offset on the stack, and then jump to the resolved address. */
got[2] = (Elf32_Addr) &_dl_runtime_resolve; got[2] = (Elf32_Addr) &_dl_runtime_resolve;

View File

@@ -70,7 +70,7 @@ _dl_runtime_resolve:
cfi_endproc cfi_endproc
.size _dl_runtime_resolve, .-_dl_runtime_resolve .size _dl_runtime_resolve, .-_dl_runtime_resolve
#ifndef PROF #if !defined PROF && defined SHARED
.globl _dl_runtime_profile .globl _dl_runtime_profile
.type _dl_runtime_profile, #function .type _dl_runtime_profile, #function
CFI_SECTIONS CFI_SECTIONS

View File

@@ -195,7 +195,6 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
end_jmprel = jmprel + l->l_info[DT_PLTRELSZ]->d_un.d_val; end_jmprel = jmprel + l->l_info[DT_PLTRELSZ]->d_un.d_val;
extern void _dl_runtime_resolve (void); extern void _dl_runtime_resolve (void);
extern void _dl_runtime_profile (void);
/* Linking lazily */ /* Linking lazily */
if (lazy) if (lazy)
@@ -235,22 +234,9 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
got[1] = (Elf32_Addr) l; got[1] = (Elf32_Addr) l;
/* This function will be called to perform the relocation. */ /* This function will be called to perform the relocation. */
if (__builtin_expect (!profile, 1)) #ifdef SHARED
{ extern void _dl_runtime_profile (void);
/* If a static application called us, then _dl_runtime_resolve is not if (__glibc_unlikely (profile))
a function descriptor, but the *real* address of the function... */
if((unsigned long) &_dl_runtime_resolve & 3)
{
got[-2] = (Elf32_Addr) ((struct fdesc *)
((unsigned long) &_dl_runtime_resolve & ~3))->ip;
}
else
{
/* Static executable! */
got[-2] = (Elf32_Addr) &_dl_runtime_resolve;
}
}
else
{ {
if (GLRO(dl_profile) != NULL if (GLRO(dl_profile) != NULL
&& _dl_name_match_p (GLRO(dl_profile), l)) && _dl_name_match_p (GLRO(dl_profile), l))
@@ -272,6 +258,22 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
got[-2] = (Elf32_Addr) &_dl_runtime_profile; got[-2] = (Elf32_Addr) &_dl_runtime_profile;
} }
} }
else
#endif
{
/* If a static application called us, then _dl_runtime_resolve is not
a function descriptor, but the *real* address of the function... */
if((unsigned long) &_dl_runtime_resolve & 3)
{
got[-2] = (Elf32_Addr) ((struct fdesc *)
((unsigned long) &_dl_runtime_resolve & ~3))->ip;
}
else
{
/* Static executable! */
got[-2] = (Elf32_Addr) &_dl_runtime_resolve;
}
}
/* Plunk in the gp of this function descriptor so we /* Plunk in the gp of this function descriptor so we
can make the call to _dl_runtime_xxxxxx */ can make the call to _dl_runtime_xxxxxx */
got[-1] = ltp; got[-1] = ltp;

View File

@@ -156,6 +156,7 @@ _dl_runtime_resolve:
cfi_endproc cfi_endproc
.size _dl_runtime_resolve, . - _dl_runtime_resolve .size _dl_runtime_resolve, . - _dl_runtime_resolve
#ifdef SHARED
.text .text
.global _dl_runtime_profile .global _dl_runtime_profile
.type _dl_runtime_profile,@function .type _dl_runtime_profile,@function
@@ -359,3 +360,4 @@ L(cont):
.PROCEND .PROCEND
cfi_endproc cfi_endproc
.size _dl_runtime_profile, . - _dl_runtime_profile .size _dl_runtime_profile, . - _dl_runtime_profile
#endif

View File

@@ -92,6 +92,7 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
to intercept the calls to collect information. In this case we to intercept the calls to collect information. In this case we
don't store the address in the GOT so that all future calls also don't store the address in the GOT so that all future calls also
end in this function. */ end in this function. */
#ifdef SHARED
if (__glibc_unlikely (profile)) if (__glibc_unlikely (profile))
{ {
got[2] = (shstk_enabled got[2] = (shstk_enabled
@@ -105,6 +106,7 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
GL(dl_profile_map) = l; GL(dl_profile_map) = l;
} }
else else
#endif
/* This function will get called to fix up the GOT entry indicated by /* This function will get called to fix up the GOT entry indicated by
the offset on the stack, and then jump to the resolved address. */ the offset on the stack, and then jump to the resolved address. */
got[2] = (shstk_enabled got[2] = (shstk_enabled

View File

@@ -70,7 +70,7 @@ _dl_runtime_resolve_shstk:
cfi_endproc cfi_endproc
.size _dl_runtime_resolve_shstk, .-_dl_runtime_resolve_shstk .size _dl_runtime_resolve_shstk, .-_dl_runtime_resolve_shstk
#ifndef PROF #if !defined PROF && defined SHARED
# The SHSTK compatible version. # The SHSTK compatible version.
.globl _dl_runtime_profile_shstk .globl _dl_runtime_profile_shstk
.type _dl_runtime_profile_shstk, @function .type _dl_runtime_profile_shstk, @function

View File

@@ -121,9 +121,8 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
reserve[0] = (Elf64_Addr) l; reserve[0] = (Elf64_Addr) l;
/* This function will be called to perform the relocation. */ /* This function will be called to perform the relocation. */
if (!profile) #ifdef SHARED
doit = (Elf64_Addr) ELF_PTR_TO_FDESC (&_dl_runtime_resolve)->ip; if (__glibc_unlikely (profile))
else
{ {
if (GLRO(dl_profile) != NULL if (GLRO(dl_profile) != NULL
&& _dl_name_match_p (GLRO(dl_profile), l)) && _dl_name_match_p (GLRO(dl_profile), l))
@@ -134,6 +133,11 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
} }
doit = (Elf64_Addr) ELF_PTR_TO_FDESC (&_dl_runtime_profile)->ip; doit = (Elf64_Addr) ELF_PTR_TO_FDESC (&_dl_runtime_profile)->ip;
} }
else
#endif
{
doit = (Elf64_Addr) ELF_PTR_TO_FDESC (&_dl_runtime_resolve)->ip;
}
reserve[1] = doit; reserve[1] = doit;
reserve[2] = gp; reserve[2] = gp;

View File

@@ -188,7 +188,7 @@ END(_dl_runtime_resolve)
#define PLTENTER_FRAME_SIZE (4*8 + 8*8 + 8*16 + 2*8 + 16) #define PLTENTER_FRAME_SIZE (4*8 + 8*8 + 8*16 + 2*8 + 16)
#define PLTEXIT_FRAME_SIZE (PLTENTER_FRAME_SIZE + 4*8 + 8*16) #define PLTEXIT_FRAME_SIZE (PLTENTER_FRAME_SIZE + 4*8 + 8*16)
#ifndef PROF #if !defined PROF && defined SHARED
ENTRY(_dl_runtime_profile) ENTRY(_dl_runtime_profile)
{ .mii { .mii
.prologue .prologue

View File

@@ -287,15 +287,16 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
to intercept the calls to collect information. In this case we to intercept the calls to collect information. In this case we
don't store the address in the GOT so that all future calls also don't store the address in the GOT so that all future calls also
end in this function. */ end in this function. */
#ifdef SHARED
if (profile != 0) if (profile != 0)
{ {
#if !defined __loongarch_soft_float # if !defined __loongarch_soft_float
if (SUPPORT_LASX) if (SUPPORT_LASX)
gotplt[0] = (ElfW(Addr)) &_dl_runtime_profile_lasx; gotplt[0] = (ElfW(Addr)) &_dl_runtime_profile_lasx;
else if (SUPPORT_LSX) else if (SUPPORT_LSX)
gotplt[0] = (ElfW(Addr)) &_dl_runtime_profile_lsx; gotplt[0] = (ElfW(Addr)) &_dl_runtime_profile_lsx;
else else
#endif # endif
gotplt[0] = (ElfW(Addr)) &_dl_runtime_profile; gotplt[0] = (ElfW(Addr)) &_dl_runtime_profile;
if (GLRO(dl_profile) != NULL if (GLRO(dl_profile) != NULL
@@ -305,6 +306,7 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
GL(dl_profile_map) = l; GL(dl_profile_map) = l;
} }
else else
#endif
{ {
/* This function will get called to fix up the GOT entry /* This function will get called to fix up the GOT entry
indicated by the offset on the stack, and then jump to indicated by the offset on the stack, and then jump to

View File

@@ -126,6 +126,7 @@ ENTRY (_dl_runtime_resolve)
jirl zero, t1, 0 jirl zero, t1, 0
END (_dl_runtime_resolve) END (_dl_runtime_resolve)
#ifdef SHARED
#include "dl-link.h" #include "dl-link.h"
ENTRY (_dl_runtime_profile) ENTRY (_dl_runtime_profile)
@@ -367,3 +368,4 @@ ENTRY (_dl_runtime_profile)
jirl zero, ra, 0 jirl zero, ra, 0
END (_dl_runtime_profile) END (_dl_runtime_profile)
#endif /* SHARED */

View File

@@ -75,7 +75,6 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
{ {
Elf32_Addr *got; Elf32_Addr *got;
extern void _dl_runtime_resolve (Elf32_Word); extern void _dl_runtime_resolve (Elf32_Word);
extern void _dl_runtime_profile (Elf32_Word);
if (l->l_info[DT_JMPREL] && lazy) if (l->l_info[DT_JMPREL] && lazy)
{ {
@@ -93,6 +92,8 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
to intercept the calls to collect information. In this case we to intercept the calls to collect information. In this case we
don't store the address in the GOT so that all future calls also don't store the address in the GOT so that all future calls also
end in this function. */ end in this function. */
#ifdef SHARED
extern void _dl_runtime_profile (Elf32_Word);
if (profile) if (profile)
{ {
got[2] = (Elf32_Addr) &_dl_runtime_profile; got[2] = (Elf32_Addr) &_dl_runtime_profile;
@@ -106,6 +107,7 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
} }
} }
else else
#endif
/* This function will get called to fix up the GOT entry indicated by /* This function will get called to fix up the GOT entry indicated by
the offset on the stack, and then jump to the resolved address. */ the offset on the stack, and then jump to the resolved address. */
got[2] = (Elf32_Addr) &_dl_runtime_resolve; got[2] = (Elf32_Addr) &_dl_runtime_resolve;

View File

@@ -60,6 +60,7 @@ _dl_runtime_resolve:
cfi_endproc cfi_endproc
.size _dl_runtime_resolve, . - _dl_runtime_resolve .size _dl_runtime_resolve, . - _dl_runtime_resolve
#ifdef SHARED
.text .text
.globl _dl_runtime_profile .globl _dl_runtime_profile
.type _dl_runtime_profile, @function .type _dl_runtime_profile, @function
@@ -220,3 +221,4 @@ _dl_runtime_profile:
rts rts
cfi_endproc cfi_endproc
.size _dl_runtime_profile, . - _dl_runtime_profile .size _dl_runtime_profile, . - _dl_runtime_profile
#endif /* SHARED */

View File

@@ -226,7 +226,7 @@ __elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
Elf32_Word dlrr; Elf32_Word dlrr;
Elf32_Word offset; Elf32_Word offset;
#ifndef PROF #if !defined PROF && defined SHARED
dlrr = (Elf32_Word) (profile dlrr = (Elf32_Word) (profile
? _dl_prof_resolve ? _dl_prof_resolve
: _dl_runtime_resolve); : _dl_runtime_resolve);

View File

@@ -188,15 +188,19 @@ elf_machine_runtime_setup (struct link_map *map, struct r_scope_elem *scope[],
extern void _dl_runtime_resolve (void); extern void _dl_runtime_resolve (void);
extern void _dl_prof_resolve (void); extern void _dl_prof_resolve (void);
if (__glibc_likely (!profile)) #ifdef SHARED
dlrr = _dl_runtime_resolve; if (__glibc_unlikely (profile))
else
{ {
if (GLRO(dl_profile) != NULL if (GLRO(dl_profile) != NULL
&&_dl_name_match_p (GLRO(dl_profile), map)) &&_dl_name_match_p (GLRO(dl_profile), map))
GL(dl_profile_map) = map; GL(dl_profile_map) = map;
dlrr = _dl_prof_resolve; dlrr = _dl_prof_resolve;
} }
else
#endif
{
dlrr = _dl_runtime_resolve;
}
got = (Elf32_Addr *) map->l_info[DT_PPC(GOT)]->d_un.d_ptr; got = (Elf32_Addr *) map->l_info[DT_PPC(GOT)]->d_un.d_ptr;
glink = got[1]; glink = got[1];
got[1] = (Elf32_Addr) dlrr; got[1] = (Elf32_Addr) dlrr;

View File

@@ -70,7 +70,7 @@ _dl_runtime_resolve:
cfi_endproc cfi_endproc
.size _dl_runtime_resolve,.-_dl_runtime_resolve .size _dl_runtime_resolve,.-_dl_runtime_resolve
#ifndef PROF #if !defined PROF && defined SHARED
.align 2 .align 2
.globl _dl_prof_resolve .globl _dl_prof_resolve
.type _dl_prof_resolve,@function .type _dl_prof_resolve,@function

View File

@@ -362,13 +362,19 @@ elf_machine_runtime_setup (struct link_map *map, struct r_scope_elem *scope[],
Elf64_Word offset; Elf64_Word offset;
Elf64_Addr dlrr; Elf64_Addr dlrr;
dlrr = (Elf64_Addr) (profile ? _dl_profile_resolve #ifdef SHARED
: _dl_runtime_resolve); if (__glibc_unlikely (profile))
if (profile && GLRO(dl_profile) != NULL {
&& _dl_name_match_p (GLRO(dl_profile), map)) dlrr = (Elf64_Addr) _dl_profile_resolve;
/* This is the object we are looking for. Say that we really if (profile && GLRO(dl_profile) != NULL
want profiling and the timers are started. */ && _dl_name_match_p (GLRO(dl_profile), map))
GL(dl_profile_map) = map; /* This is the object we are looking for. Say that we really
want profiling and the timers are started. */
GL(dl_profile_map) = map;
}
else
#endif
dlrr = (Elf64_Addr) _dl_runtime_resolve;
#if _CALL_ELF != 2 #if _CALL_ELF != 2
/* We need to stuff the address/TOC of _dl_runtime_resolve /* We need to stuff the address/TOC of _dl_runtime_resolve

View File

@@ -195,7 +195,7 @@ END(_dl_runtime_resolve)
and r11 contains the link_map (from PLT0+16). The link_map becomes and r11 contains the link_map (from PLT0+16). The link_map becomes
parm1 (r3) and the index (r0) needs to be converted to an offset parm1 (r3) and the index (r0) needs to be converted to an offset
(index * 24) in parm2 (r4). */ (index * 24) in parm2 (r4). */
#ifndef PROF #if !defined PROF && defined SHARED
.hidden _dl_profile_resolve .hidden _dl_profile_resolve
ENTRY (_dl_profile_resolve, 4) ENTRY (_dl_profile_resolve, 4)
/* Spill r30, r31 to preserve the link_map* and reloc_addr, in case we /* Spill r30, r31 to preserve the link_map* and reloc_addr, in case we

View File

@@ -124,16 +124,17 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
to intercept the calls to collect information. In this case we to intercept the calls to collect information. In this case we
don't store the address in the GOT so that all future calls also don't store the address in the GOT so that all future calls also
end in this function. */ end in this function. */
#ifdef SHARED
if (__glibc_unlikely (profile)) if (__glibc_unlikely (profile))
{ {
#if defined HAVE_S390_VX_ASM_SUPPORT # if defined HAVE_S390_VX_ASM_SUPPORT
if (GLRO(dl_hwcap) & HWCAP_S390_VX) if (GLRO(dl_hwcap) & HWCAP_S390_VX)
got[2] = (Elf32_Addr) &_dl_runtime_profile_vx; got[2] = (Elf32_Addr) &_dl_runtime_profile_vx;
else else
got[2] = (Elf32_Addr) &_dl_runtime_profile; got[2] = (Elf32_Addr) &_dl_runtime_profile;
#else # else
got[2] = (Elf32_Addr) &_dl_runtime_profile; got[2] = (Elf32_Addr) &_dl_runtime_profile;
#endif # endif
if (GLRO(dl_profile) != NULL if (GLRO(dl_profile) != NULL
&& _dl_name_match_p (GLRO(dl_profile), l)) && _dl_name_match_p (GLRO(dl_profile), l))
@@ -142,6 +143,7 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
GL(dl_profile_map) = l; GL(dl_profile_map) = l;
} }
else else
#endif
{ {
/* This function will get called to fix up the GOT entry indicated by /* This function will get called to fix up the GOT entry indicated by
the offset on the stack, and then jump to the resolved address. */ the offset on the stack, and then jump to the resolved address. */

View File

@@ -148,7 +148,7 @@ _dl_runtime_resolve:
#undef F0_OFF #undef F0_OFF
#undef F2_OFF #undef F2_OFF
#ifndef PROF #if !defined PROF && defined SHARED
# define SIZEOF_STRUCT_LA_S390_32_REGS 168 # define SIZEOF_STRUCT_LA_S390_32_REGS 168
# define REGS_OFF -264 # define REGS_OFF -264
# define R2_OFF -264 # define R2_OFF -264

View File

@@ -111,16 +111,17 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
to intercept the calls to collect information. In this case we to intercept the calls to collect information. In this case we
don't store the address in the GOT so that all future calls also don't store the address in the GOT so that all future calls also
end in this function. */ end in this function. */
#ifdef SHARED
if (__glibc_unlikely (profile)) if (__glibc_unlikely (profile))
{ {
#if defined HAVE_S390_VX_ASM_SUPPORT # if defined HAVE_S390_VX_ASM_SUPPORT
if (GLRO(dl_hwcap) & HWCAP_S390_VX) if (GLRO(dl_hwcap) & HWCAP_S390_VX)
got[2] = (Elf64_Addr) &_dl_runtime_profile_vx; got[2] = (Elf64_Addr) &_dl_runtime_profile_vx;
else else
got[2] = (Elf64_Addr) &_dl_runtime_profile; got[2] = (Elf64_Addr) &_dl_runtime_profile;
#else # else
got[2] = (Elf64_Addr) &_dl_runtime_profile; got[2] = (Elf64_Addr) &_dl_runtime_profile;
#endif # endif
if (GLRO(dl_profile) != NULL if (GLRO(dl_profile) != NULL
&& _dl_name_match_p (GLRO(dl_profile), l)) && _dl_name_match_p (GLRO(dl_profile), l))
@@ -129,6 +130,7 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
GL(dl_profile_map) = l; GL(dl_profile_map) = l;
} }
else else
#endif
{ {
/* This function will get called to fix up the GOT entry indicated by /* This function will get called to fix up the GOT entry indicated by
the offset on the stack, and then jump to the resolved address. */ the offset on the stack, and then jump to the resolved address. */

View File

@@ -150,7 +150,7 @@ _dl_runtime_resolve:
#undef F4_OFF #undef F4_OFF
#undef F6_OFF #undef F6_OFF
#ifndef PROF #if !defined PROF && defined SHARED
# define SIZEOF_STRUCT_LA_S390_64_REGS 200 # define SIZEOF_STRUCT_LA_S390_64_REGS 200
# define REGS_OFF -360 # define REGS_OFF -360
# define R2_OFF -360 # define R2_OFF -360

View File

@@ -101,6 +101,7 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
to intercept the calls to collect information. In this case we to intercept the calls to collect information. In this case we
don't store the address in the GOT so that all future calls also don't store the address in the GOT so that all future calls also
end in this function. */ end in this function. */
#ifdef SHARED
if (profile) if (profile)
{ {
got[2] = (Elf32_Addr) &_dl_runtime_profile; got[2] = (Elf32_Addr) &_dl_runtime_profile;
@@ -110,6 +111,7 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
GL(dl_profile_map) = l; GL(dl_profile_map) = l;
} }
else else
#endif
/* This function will get called to fix up the GOT entry indicated by /* This function will get called to fix up the GOT entry indicated by
the offset on the stack, and then jump to the resolved address. */ the offset on the stack, and then jump to the resolved address. */
got[2] = (Elf32_Addr) &_dl_runtime_resolve; got[2] = (Elf32_Addr) &_dl_runtime_resolve;

View File

@@ -142,6 +142,7 @@ _dl_runtime_resolve:
.size _dl_runtime_resolve, .-_dl_runtime_resolve .size _dl_runtime_resolve, .-_dl_runtime_resolve
#ifdef SHARED
.globl _dl_runtime_profile .globl _dl_runtime_profile
.type _dl_runtime_profile,@function .type _dl_runtime_profile,@function
cfi_startproc cfi_startproc
@@ -428,3 +429,4 @@ _dl_runtime_profile:
8: .long _dl_audit_pltexit 8: .long _dl_audit_pltexit
#endif #endif
.size _dl_runtime_profile, .-_dl_runtime_profile .size _dl_runtime_profile, .-_dl_runtime_profile
#endif /* SHARED */

View File

@@ -116,7 +116,8 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
bits of %g1 with an offset into the .rela.plt section and jump to bits of %g1 with an offset into the .rela.plt section and jump to
the beginning of the PLT. */ the beginning of the PLT. */
plt = (Elf32_Addr *) D_PTR (l, l_info[DT_PLTGOT]); plt = (Elf32_Addr *) D_PTR (l, l_info[DT_PLTGOT]);
if (__builtin_expect(profile, 0)) #ifdef SHARED
if (__glibc_unlikely (profile))
{ {
rfunc = (Elf32_Addr) &_dl_runtime_profile; rfunc = (Elf32_Addr) &_dl_runtime_profile;
@@ -125,6 +126,7 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
GL(dl_profile_map) = l; GL(dl_profile_map) = l;
} }
else else
#endif
{ {
rfunc = (Elf32_Addr) &_dl_runtime_resolve; rfunc = (Elf32_Addr) &_dl_runtime_resolve;
} }

View File

@@ -47,6 +47,7 @@ _dl_runtime_resolve:
.size _dl_runtime_resolve, .-_dl_runtime_resolve .size _dl_runtime_resolve, .-_dl_runtime_resolve
#ifdef SHARED
/* For the profiling cases we pass in our stack frame /* For the profiling cases we pass in our stack frame
* as the base of the La_sparc32_regs, so it looks * as the base of the La_sparc32_regs, so it looks
* like: * like:
@@ -185,3 +186,4 @@ _dl_runtime_profile:
cfi_endproc cfi_endproc
.size _dl_runtime_profile, .-_dl_runtime_profile .size _dl_runtime_profile, .-_dl_runtime_profile
#endif

View File

@@ -136,7 +136,8 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
Elf64_Addr res0_addr, res1_addr; Elf64_Addr res0_addr, res1_addr;
unsigned int *plt = (void *) D_PTR (l, l_info[DT_PLTGOT]); unsigned int *plt = (void *) D_PTR (l, l_info[DT_PLTGOT]);
if (__builtin_expect(profile, 0)) #ifdef SHARED
if (__glibc_unlikely (profile))
{ {
res0_addr = (Elf64_Addr) &_dl_runtime_profile_0; res0_addr = (Elf64_Addr) &_dl_runtime_profile_0;
res1_addr = (Elf64_Addr) &_dl_runtime_profile_1; res1_addr = (Elf64_Addr) &_dl_runtime_profile_1;
@@ -146,6 +147,7 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
GL(dl_profile_map) = l; GL(dl_profile_map) = l;
} }
else else
#endif
{ {
res0_addr = (Elf64_Addr) &_dl_runtime_resolve_0; res0_addr = (Elf64_Addr) &_dl_runtime_resolve_0;
res1_addr = (Elf64_Addr) &_dl_runtime_resolve_1; res1_addr = (Elf64_Addr) &_dl_runtime_resolve_1;

View File

@@ -92,6 +92,7 @@ _dl_runtime_resolve_1:
.size _dl_runtime_resolve_1, .-_dl_runtime_resolve_1 .size _dl_runtime_resolve_1, .-_dl_runtime_resolve_1
#ifdef SHARED
/* For the profiling cases we pass in our stack frame /* For the profiling cases we pass in our stack frame
* as the base of the La_sparc64_regs, so it looks * as the base of the La_sparc64_regs, so it looks
* like: * like:
@@ -323,3 +324,4 @@ _dl_runtime_profile_1:
cfi_endproc cfi_endproc
.size _dl_runtime_resolve_1, .-_dl_runtime_resolve_1 .size _dl_runtime_resolve_1, .-_dl_runtime_resolve_1
#endif

View File

@@ -89,6 +89,7 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
const struct cpu_features* cpu_features = __get_cpu_features (); const struct cpu_features* cpu_features = __get_cpu_features ();
#ifdef SHARED
/* The got[2] entry contains the address of a function which gets /* The got[2] entry contains the address of a function which gets
called to get the address of a so far unresolved function and called to get the address of a so far unresolved function and
jump to it. The profiling extension of the dynamic linker allows jump to it. The profiling extension of the dynamic linker allows
@@ -111,6 +112,7 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
GL(dl_profile_map) = l; GL(dl_profile_map) = l;
} }
else else
#endif
{ {
/* This function will get called to fix up the GOT entry /* This function will get called to fix up the GOT entry
indicated by the offset on the stack, and then jump to indicated by the offset on the stack, and then jump to

View File

@@ -53,45 +53,49 @@
#define RESTORE_AVX #define RESTORE_AVX
#define VEC_SIZE 64 #ifdef SHARED
#define VMOVA vmovdqa64 # define VEC_SIZE 64
#define VEC(i) zmm##i # define VMOVA vmovdqa64
#define _dl_runtime_profile _dl_runtime_profile_avx512 # define VEC(i) zmm##i
# define SECTION(p) p##.evex512 # define _dl_runtime_profile _dl_runtime_profile_avx512
#include "dl-trampoline.h" # define SECTION(p) p##.evex512
#undef _dl_runtime_profile
#undef VEC
#undef VMOVA
#undef VEC_SIZE
#undef SECTION
#if MINIMUM_X86_ISA_LEVEL <= AVX_X86_ISA_LEVEL
# define VEC_SIZE 32
# define VMOVA vmovdqa
# define VEC(i) ymm##i
# define SECTION(p) p##.avx
# define _dl_runtime_profile _dl_runtime_profile_avx
# include "dl-trampoline.h" # include "dl-trampoline.h"
# undef _dl_runtime_profile # undef _dl_runtime_profile
# undef VEC # undef VEC
# undef VMOVA # undef VMOVA
# undef VEC_SIZE # undef VEC_SIZE
# undef SECTION # undef SECTION
#endif
# if MINIMUM_X86_ISA_LEVEL <= AVX_X86_ISA_LEVEL
# define VEC_SIZE 32
# define VMOVA vmovdqa
# define VEC(i) ymm##i
# define SECTION(p) p##.avx
# define _dl_runtime_profile _dl_runtime_profile_avx
# include "dl-trampoline.h"
# undef _dl_runtime_profile
# undef VEC
# undef VMOVA
# undef VEC_SIZE
# undef SECTION
# endif
# if MINIMUM_X86_ISA_LEVEL < AVX_X86_ISA_LEVEL
/* movaps/movups is 1-byte shorter. */
# define VEC_SIZE 16
# define VMOVA movaps
# define VEC(i) xmm##i
# define _dl_runtime_profile _dl_runtime_profile_sse
# undef RESTORE_AVX
# include "dl-trampoline.h"
# undef _dl_runtime_profile
# undef VEC
# undef VMOVA
# undef VEC_SIZE
# endif
#endif /* SHARED */
#if MINIMUM_X86_ISA_LEVEL < AVX_X86_ISA_LEVEL #if MINIMUM_X86_ISA_LEVEL < AVX_X86_ISA_LEVEL
/* movaps/movups is 1-byte shorter. */
# define VEC_SIZE 16
# define VMOVA movaps
# define VEC(i) xmm##i
# define _dl_runtime_profile _dl_runtime_profile_sse
# undef RESTORE_AVX
# include "dl-trampoline.h"
# undef _dl_runtime_profile
# undef VEC
# undef VMOVA
# undef VEC_SIZE
# define USE_FXSAVE # define USE_FXSAVE
# define STATE_SAVE_ALIGNMENT 16 # define STATE_SAVE_ALIGNMENT 16
# define _dl_runtime_resolve _dl_runtime_resolve_fxsave # define _dl_runtime_resolve _dl_runtime_resolve_fxsave