[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

glibc: pagesize

From: Thomas Schwinge
Subject: glibc: pagesize
Date: Mon, 10 Oct 2011 00:11:28 +0200
User-agent: Notmuch/0.9_rc1-124-gd98bfaf (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)


Linux has a EXEC_PAGESIZE macro, exposed in asm/param.h, typically
accessed via linux/param.h, then sys/param.h.  This is now taken for
granted in glibc:

    commit 02d46fc4b969e25e4ba0c54aa95fa98d7279bd05
    Author: Ulrich Drepper <drepper@gmail.com>
    Date:   Sat Sep 10 21:47:36 2011 -0400
        Simplify malloc initialization
        Singificantly reduce the code needed at malloc initialization.  In
        the process getpagesize is simplified by always initializing
    diff --git a/elf/rtld.c b/elf/rtld.c
    @@ -161,6 +161,7 @@ struct rtld_global_ro _rtld_global_ro attribute_relro =
         ._dl_lazy = 1,
         ._dl_fpu_control = _FPU_DEFAULT,
         ._dl_pointer_guard = 1,
    +    ._dl_pagesize = EXEC_PAGESIZE,


    commit 32b4c8393f6db8b0bbf9c87a09461111a423a433
    Author: Ulrich Drepper <drepper@gmail.com>
    Date:   Sun Sep 11 11:25:51 2011 -0400
        Provide static initializer for _dl_pagesize in statically linked code
    diff --git a/elf/dl-support.c b/elf/dl-support.c
    +#include <sys/param.h>
    -size_t _dl_pagesize;
    +size_t _dl_pagesize = EXEC_PAGESIZE;

Hurd (or specifically: Mach) doesn't have a EXEC_PAGESIZE macro, but
handles this in the mach/mach_init.c startup code with the host_page_size
RPC and stores the retrieved value in __vm_page_size/vm_page_size.

In my understanding, these two, _rtld_global_ro._dl_pagesize and plain
_dl_pagesize is what is accessed in a lot of places all over glibc by
using GLRO(dl_pagesize) for the shared vs. static case.  This used to
be/still is initialized from the auxv (if available) in elf/dl-support.c
and elf/dl-sysdep.c, or otherwise from a __getpagesize call in the latter
file.  For Hurd it is always initialized from a __getpagesize call
(returning vm_page_size) in sysdeps/mach/hurd/dl-sysdep.c, right after

Isn't all this due for some cleanup; also the Linux code with assignment
From EXEC_PAGESIZE vs. assignment from auxv?

For the Hurd, can I wrap the two above assignments with #ifdef
EXEC_PAGESIZE, and it'll be enough for us to set GLRO(dl_pagesize) in
sysdeps/mach/hurd/dl-sysdep.c:_dl_sysdep_start, as it used to be?  But
then, malloc won't work before, right (due to commit 02d46fc4)?

And why do we need a __vm_page_size plus vm_page_size weak alias, and
don't only use GLRO(dl_pagesize)?

Then, additionally in libio/libioP.h, I found this bit of code:

    #if _G_HAVE_MMAP
    # include <sys/param.h>
    # if !defined(MAP_ANONYMOUS) || !defined(EXEC_PAGESIZE)
    #  undef _G_HAVE_MMAP
    #  define _G_HAVE_MMAP 0
    # endif

This means, we don't get to use mmap/munmap but instead use malloc/free.
I will check/fix this later on.


Attachment: pgpm_2ieryeda.pgp
Description: PGP signature

reply via email to

[Prev in Thread] Current Thread [Next in Thread]