Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <00ba01cfb0f0$21992d00$64cb8700$@codeaurora.org>
Date: Tue, 5 Aug 2014 13:59:21 -0700
From: "Weiming Zhao" <weimingz@...eaurora.org>
To: <musl@...ts.openwall.com>
Subject: RE: How to setup pre-allocated heap stack space?

Hi Rich,

I'm using it on a bare-metal setup. So the heap space some fixed address.
So I think I should modify __brk() like:
uintptr_t __brk(uintptr_t newbrk) {
  return newbrk == 0 ? HEAP_BASE :  newbrk ; // assume heap is large enough
}
Is that correct?  I don't need to worry about free(), right?

Thanks,
Weiming

-----Original Message-----
From: Rich Felker [mailto:dalias@...ifal.cx] On Behalf Of Rich Felker
Sent: Tuesday, August 05, 2014 1:47 PM
To: musl@...ts.openwall.com
Subject: Re: [musl] How to setup pre-allocated heap stack space?

On Tue, Aug 05, 2014 at 01:26:51PM -0700, Weiming Zhao wrote:
> Hi,
> 
> In musl's crt1.c , I want to let libc to use preallocated heap and stack.
> 
> I can set the SP register in crt1. But how do I specify the base 
> address of heap? So malloc will starts from there.

Are you using musl pretty much as-is on Linux, or on a custom OS, bare-metal
setup, etc.? On Linux the stack is *always* pre-allocated (with a constant
size of 128k, with more committed only lazily as needed, and with possible
failure resulting in process death) so I don't know why you'd need to do
your own stack pre-allocation, but like you said, it's not really hard.

For the heap, if you have a custom OS, you can just define the SYS_brk
syscall to give a pointer to your pre-allocated heap, but beware that musl
will start using mmap if this heap runs out of space.

If you're using Linux and you just want a pre-allocated heap to ensure that
memory is committed at exec-time, so allocations can't fail later, the way
to achieve this from crt1 would be to use the strategy
reclaim_gaps() uses in the dynamic linker, which essentially amounts to
passing the pointer to free() after setting up some adjacent bookkeeping
structures. However I would strongly advise AGAINST this approach unless
you're static-linking with a known version of musl. If dynamic linking, you
would be encoding a dependency on the internal heap representation into your
application binary, and things would horribly break if musl is later
upgraded and the representation no longer matches.

Rich

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.