diff options
author | Florian Weimer <fweimer@redhat.com> | 2022-02-03 10:58:59 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2022-02-10 11:51:55 +0100 |
commit | 8c8510ab2790039e58995ef3a22309582413d3ff (patch) | |
tree | 3ebd93ae5708d2f67a546aeccb200dd5b1dad06c /elf | |
parent | f19fc997a5754a6c0bb9e43618f0597e878061f7 (diff) | |
download | glibc-8c8510ab2790039e58995ef3a22309582413d3ff.tar.gz |
Linux: Consolidate auxiliary vector parsing
And optimize it slightly.
The large switch statement in _dl_sysdep_start can be replaced with
a large array. This reduces source code and binary size. On
i686-linux-gnu:
Before:
text data bss dec hex filename
7791 12 0 7803 1e7b elf/dl-sysdep.os
After:
text data bss dec hex filename
7135 12 0 7147 1beb elf/dl-sysdep.os
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'elf')
-rw-r--r-- | elf/dl-support.c | 80 |
1 files changed, 4 insertions, 76 deletions
diff --git a/elf/dl-support.c b/elf/dl-support.c index fb64765537..0fff62064a 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -241,93 +241,21 @@ __rtld_lock_define_initialized_recursive (, _dl_load_tls_lock) #ifdef HAVE_AUX_VECTOR +#include <dl-parse_auxv.h> + int _dl_clktck; void _dl_aux_init (ElfW(auxv_t) *av) { - int seen = 0; - uid_t uid = 0; - gid_t gid = 0; - #ifdef NEED_DL_SYSINFO /* NB: Avoid RELATIVE relocation in static PIE. */ GL(dl_sysinfo) = DL_SYSINFO_DEFAULT; #endif _dl_auxv = av; - for (; av->a_type != AT_NULL; ++av) - switch (av->a_type) - { - case AT_PAGESZ: - if (av->a_un.a_val != 0) - GLRO(dl_pagesize) = av->a_un.a_val; - break; - case AT_CLKTCK: - GLRO(dl_clktck) = av->a_un.a_val; - break; - case AT_PHDR: - GL(dl_phdr) = (const void *) av->a_un.a_val; - break; - case AT_PHNUM: - GL(dl_phnum) = av->a_un.a_val; - break; - case AT_PLATFORM: - GLRO(dl_platform) = (void *) av->a_un.a_val; - break; - case AT_HWCAP: - GLRO(dl_hwcap) = (unsigned long int) av->a_un.a_val; - break; - case AT_HWCAP2: - GLRO(dl_hwcap2) = (unsigned long int) av->a_un.a_val; - break; - case AT_FPUCW: - GLRO(dl_fpu_control) = av->a_un.a_val; - break; -#ifdef NEED_DL_SYSINFO - case AT_SYSINFO: - GL(dl_sysinfo) = av->a_un.a_val; - break; -#endif -#ifdef NEED_DL_SYSINFO_DSO - case AT_SYSINFO_EHDR: - GL(dl_sysinfo_dso) = (void *) av->a_un.a_val; - break; -#endif - case AT_UID: - uid ^= av->a_un.a_val; - seen |= 1; - break; - case AT_EUID: - uid ^= av->a_un.a_val; - seen |= 2; - break; - case AT_GID: - gid ^= av->a_un.a_val; - seen |= 4; - break; - case AT_EGID: - gid ^= av->a_un.a_val; - seen |= 8; - break; - case AT_SECURE: - seen = -1; - __libc_enable_secure = av->a_un.a_val; - __libc_enable_secure_decided = 1; - break; - case AT_RANDOM: - _dl_random = (void *) av->a_un.a_val; - break; - case AT_MINSIGSTKSZ: - _dl_minsigstacksize = av->a_un.a_val; - break; - DL_PLATFORM_AUXV - } - if (seen == 0xf) - { - __libc_enable_secure = uid != 0 || gid != 0; - __libc_enable_secure_decided = 1; - } + dl_parse_auxv_t auxv_values = { 0, }; + _dl_parse_auxv (av, auxv_values); } #endif |