Using madvise for ld.so
Michael Matz
matz at kde.org
Tue Mar 16 12:39:38 CET 2004
Hi,
On Tue, 16 Mar 2004, Michael Matz wrote:
> did so (thanks to Lubos for fixing a silly error in it).
Hmpf. I sent the patch with that error. Trying again ;-)
Ciao,
Michael.
--
diff -upr sysdeps.orig/generic/ldsodefs.h sysdeps/generic/ldsodefs.h
--- sysdeps.orig/generic/ldsodefs.h 2004-03-09 17:51:44.000000000 +0100
+++ sysdeps/generic/ldsodefs.h 2004-03-09 16:31:45.000000000 +0100
@@ -282,6 +282,8 @@ struct rtld_global
/* Do we do lazy relocations? */
EXTERN int _dl_lazy;
+ EXTERN int _dl_madvise;
+
/* Nonzero if runtime lookups should not update the .got/.plt. */
EXTERN int _dl_bind_not;
diff -upr sysdeps.orig/unix/sysv/linux/syscalls.list sysdeps/unix/sysv/linux/syscalls.list
--- sysdeps.orig/unix/sysv/linux/syscalls.list 2003-09-08 08:42:40.000000000 +0200
+++ sysdeps/unix/sysv/linux/syscalls.list 2004-03-09 17:19:46.000000000 +0100
@@ -29,7 +29,7 @@ iopl - iopl i:i iopl
klogctl EXTRA syslog i:isi klogctl
lchown - lchown i:sii __lchown lchown
posix_madvise - madvise Vi:pii posix_madvise
-madvise - madvise i:pii madvise
+madvise - madvise i:pii __madvise madvise
mincore - mincore i:anV mincore
mlock - mlock i:bn mlock
mlockall - mlockall i:i mlockall
diff -upr elf.orig/dl-load.c elf/dl-load.c
--- elf.orig/dl-load.c 2004-02-22 20:33:36.000000000 +0100
+++ elf/dl-load.c 2004-03-09 17:19:07.000000000 +0100
@@ -1101,6 +1101,9 @@ cannot allocate TLS data structures for
goto call_lose_errno;
}
+ if (GLRO(dl_madvise))
+ __madvise ((void *) l->l_map_start, maplength, MADV_WILLNEED);
+
l->l_map_end = l->l_map_start + maplength;
l->l_addr = l->l_map_start - c->mapstart;
diff -upr elf.orig/dl-support.c elf/dl-support.c
--- elf.orig/dl-support.c 2004-01-28 07:53:55.000000000 +0100
+++ elf/dl-support.c 2004-03-09 17:47:53.000000000 +0100
@@ -41,6 +41,7 @@ size_t _dl_platformlen;
int _dl_debug_mask;
int _dl_lazy;
+int _dl_madvise;
ElfW(Addr) _dl_use_load_bias = -2;
int _dl_dynamic_weak;
@@ -243,6 +244,8 @@ _dl_non_dynamic_init (void)
_dl_lazy = *(getenv ("LD_BIND_NOW") ?: "") == '\0';
+ _dl_madvise = *(getenv ("LD_NOMADVISE") ?: "") == '\0';
+
_dl_bind_not = *(getenv ("LD_BIND_NOT") ?: "") != '\0';
_dl_dynamic_weak = *(getenv ("LD_DYNAMIC_WEAK") ?: "") == '\0';
diff -upr elf.orig/rtld.c elf/rtld.c
--- elf.orig/rtld.c 2004-03-09 11:35:17.000000000 +0100
+++ elf/rtld.c 2004-03-09 17:47:24.000000000 +0100
@@ -122,6 +122,7 @@
._dl_hwcap_mask = HWCAP_IMPORTANT,
._dl_lazy = 1,
._dl_fpu_control = _FPU_DEFAULT,
+ ._dl_madvise = 1,
/* Function pointers. */
._dl_get_origin = _dl_get_origin,
@@ -2086,6 +2087,12 @@ process_envvars (enum mode *modep)
break;
case 9:
+ if (memcmp (envline, "NOMADVISE", 9) == 0)
+ {
+ GLRO(dl_madvise) = envline[10] == '\0';
+ break;
+ }
+
/* Test whether we want to see the content of the auxiliary
array passed up from the kernel. */
if (memcmp (envline, "SHOW_AUXV", 9) == 0)
diff -upr include.orig/sys/mman.h include/sys/mman.h
--- include.orig/sys/mman.h 1999-11-26 09:16:29.000000000 +0100
+++ include/sys/mman.h 2004-03-09 17:18:50.000000000 +0100
@@ -8,6 +8,7 @@ extern void *__mmap64 (void *__addr, siz
int __flags, int __fd, __off64_t __offset);
extern int __munmap (void *__addr, size_t __len);
extern int __mprotect (void *__addr, size_t __len, int __prot);
+extern int __madvise (void *__addr, size_t __len, int __advise);
/* This one is Linux specific. */
extern void *__mremap (void *__addr, size_t __old_len,
More information about the Kde-optimize
mailing list