summaryrefslogtreecommitdiffstats
path: root/libexec/rtld-elf/arm
diff options
context:
space:
mode:
authorrdivacky <rdivacky@FreeBSD.org>2010-05-18 08:55:23 +0000
committerrdivacky <rdivacky@FreeBSD.org>2010-05-18 08:55:23 +0000
commit7f3f7db3798a4d71f451d4eede04bcd6f9bec96b (patch)
tree7fc7f07db9e35a3b666f265dc0bf57e5ecb0d5ee /libexec/rtld-elf/arm
parentfb4f09998080bd2fa70c75879bedb4dfef12a265 (diff)
downloadFreeBSD-src-7f3f7db3798a4d71f451d4eede04bcd6f9bec96b.zip
FreeBSD-src-7f3f7db3798a4d71f451d4eede04bcd6f9bec96b.tar.gz
Only use the cache after the early stage of loading. This is
because calling mmap() etc. may use GOT which is not set up yet. Use calloc() instead of mmap() in cases where this was the case before (sparc64, powerpc, arm). Submitted by: Dimitry Andric (dimitry andric com) Reviewed by: kan Approved by: ed (mentor)
Diffstat (limited to 'libexec/rtld-elf/arm')
-rw-r--r--libexec/rtld-elf/arm/reloc.c13
1 files changed, 5 insertions, 8 deletions
diff --git a/libexec/rtld-elf/arm/reloc.c b/libexec/rtld-elf/arm/reloc.c
index e383892..6ad80fd 100644
--- a/libexec/rtld-elf/arm/reloc.c
+++ b/libexec/rtld-elf/arm/reloc.c
@@ -245,7 +245,6 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld)
const Elf_Rel *rellim;
const Elf_Rel *rel;
SymCache *cache;
- int bytes = obj->nchains * sizeof(SymCache);
int r = -1;
/* The relocation for the dynamic loader has already been done. */
@@ -255,10 +254,9 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld)
* The dynamic loader may be called from a thread, we have
* limited amounts of stack available so we cannot use alloca().
*/
- cache = mmap(NULL, bytes, PROT_READ|PROT_WRITE, MAP_ANON, -1, 0);
- if (cache == MAP_FAILED)
- cache = NULL;
-
+ cache = calloc(obj->nchains, sizeof(SymCache));
+ /* No need to check for NULL here */
+
rellim = (const Elf_Rel *)((caddr_t)obj->rel + obj->relsize);
for (rel = obj->rel; rel < rellim; rel++) {
if (reloc_nonplt_object(obj, rel, cache) < 0)
@@ -266,9 +264,8 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld)
}
r = 0;
done:
- if (cache) {
- munmap(cache, bytes);
- }
+ if (cache != NULL)
+ free(cache);
return (r);
}
OpenPOWER on IntegriCloud