[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 5/6] refactor and simplify ELF loader in objcodes.c
From: |
Andy Wingo |
Subject: |
Re: [PATCH 5/6] refactor and simplify ELF loader in objcodes.c |
Date: |
Fri, 24 May 2013 16:49:06 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.2 (gnu/linux) |
On Thu 23 May 2013 22:35, address@hidden (Ludovic Courtès) writes:
>> The best is to use mmap. But if you fall back, malloc is OK, and we can
>> manually align it. In any case the loader ends up adding part of the
>> image to the GC roots, so it's probably best that the memory not be
>> managed by the GC itself.
>
> But malloc’d and mmap’d regions are not scanned by default, so here they
> would need to be scanned, or the GC-managed data they refer to would
> need to be registered as root, no?
>
> (This reminds me of
> <http://thread.gmane.org/gmane.comp.programming.garbage-collection.boehmgc/2576>,
> except that with Guile’s loader GNU_RELRO regions could refer to
> GC-managed data.)
See the patch :) There is a part of the dynamic section that specifies
the GC roots, which are added using GC_add_roots.
>>> Since .go are only produced by Guile, can it really happen to have .go
>>> files without 8-byte alignment?
>>
>> Yes! If the system supports mmap, .go files should be produced with
>> 4096-byte alignment so that the whole thing can be mapped read-only, and
>> write permissions only need be given to the writable pages. (Mprotect
>> only works on a page level.)
>
> Oh, I’m lost. Is it 8B or 4KiB? Can’t .go files always be
> page-aligned?
In 2.0 the alignment is 8 bytes. In 2.2, it can be any multiple of 8
bytes -- including 4096.
>From linker.scm:
;;; By default, the ELF files created by the linker include some padding
;;; so that different parts of the file can be loaded in with different
;;; permissions. For example, some parts of the file are read-only and
;;; thus can be shared between processes. Some parts of the file don't
;;; need to be loaded at all. However this padding can be too much for
;;; interactive compilation, when the code is never written out to disk;
;;; in that case, pass #:page-aligned? #f to `link-elf'.
And:
If @var{page-aligned?} is true, read-only and writable data are
separated so that only those writable parts of the image need be mapped
with writable permissions. This is suitable for situations where you
would write a file out to disk and read it in with @code{mmap}.
Otherwise if @var{page-aligned?} is false, sections default to 8-byte
alignment.
Andy
--
http://wingolog.org/
[PATCH 3/6] elf: add accessors for header members that might need relocation, Andy Wingo, 2013/05/18
[PATCH 4/6] refactor linker to lay out ELF files and memory in the same way, Andy Wingo, 2013/05/18
[PATCH 1/6] split linker out of elf module, Andy Wingo, 2013/05/18