diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2024-02-22 10:42:55 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2024-02-23 08:50:00 -0300 |
commit | f4c142bb9fe6b02c0af8cfca8a920091e2dba44b (patch) | |
tree | 2b4b576da6835eb847026dad5c1a89c3abf52985 /elf/dl-find_object.c | |
parent | e2a65ecc4b30a797df7dc6529f09b712aa256029 (diff) | |
download | glibc-f4c142bb9fe6b02c0af8cfca8a920091e2dba44b.zip glibc-f4c142bb9fe6b02c0af8cfca8a920091e2dba44b.tar.gz glibc-f4c142bb9fe6b02c0af8cfca8a920091e2dba44b.tar.bz2 |
arm: Use _dl_find_object on __gnu_Unwind_Find_exidx (BZ 31405)
Instead of __dl_iterate_phdr. On ARM dlfo_eh_frame/dlfo_eh_count
maps to PT_ARM_EXIDX vaddr start / length.
On a Neoverse N1 machine with 160 cores, the following program:
$ cat test.c
#include <stdlib.h>
#include <pthread.h>
#include <assert.h>
enum {
niter = 1024,
ntimes = 128,
};
static void *
tf (void *arg)
{
int a = (int) arg;
for (int i = 0; i < niter; i++)
{
void *p[ntimes];
for (int j = 0; j < ntimes; j++)
p[j] = malloc (a * 128);
for (int j = 0; j < ntimes; j++)
free (p[j]);
}
return NULL;
}
int main (int argc, char *argv[])
{
enum { nthreads = 16 };
pthread_t t[nthreads];
for (int i = 0; i < nthreads; i ++)
assert (pthread_create (&t[i], NULL, tf, (void *) i) == 0);
for (int i = 0; i < nthreads; i++)
{
void *r;
assert (pthread_join (t[i], &r) == 0);
assert (r == NULL);
}
return 0;
}
$ arm-linux-gnueabihf-gcc -fsanitize=address test.c -o test
Improves from ~15s to 0.5s.
Checked on arm-linux-gnueabihf.
Diffstat (limited to 'elf/dl-find_object.c')
-rw-r--r-- | elf/dl-find_object.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/elf/dl-find_object.c b/elf/dl-find_object.c index 940fa5c..449302e 100644 --- a/elf/dl-find_object.c +++ b/elf/dl-find_object.c @@ -356,7 +356,7 @@ _dlfo_lookup (uintptr_t pc, struct dl_find_object_internal *first1, size_t size) } int -_dl_find_object (void *pc1, struct dl_find_object *result) +__dl_find_object (void *pc1, struct dl_find_object *result) { uintptr_t pc = (uintptr_t) pc1; @@ -463,7 +463,8 @@ _dl_find_object (void *pc1, struct dl_find_object *result) return -1; } /* Transaction retry loop. */ } -rtld_hidden_def (_dl_find_object) +hidden_def (__dl_find_object) +weak_alias (__dl_find_object, _dl_find_object) /* _dlfo_process_initial is called twice. First to compute the array sizes from the initial loaded mappings. Second to fill in the |