@@ -66,6 +66,10 @@ struct PageSizeGetter {
6666 page_size (sysconf(_SC_PAGE_SIZE))
6767 {}
6868
69+ size_t align_up (size_t l) const {
70+ return (l + page_size - 1 ) / page_size * page_size;
71+ }
72+
6973 constexpr operator size_t () const { return page_size; }
7074};
7175const PageSizeGetter page_size{};
@@ -124,10 +128,20 @@ VMContext VMContext::create(void* _code_buf, std::size_t len) {
124128 VMContext ctx{};
125129 Impl& impl = *ctx.impl ;
126130
127- impl.seg_rodata = SegmentInfo::mmap (header.sh_rodata .mem_size , PROT_READ | PROT_WRITE);
128- impl.seg_data = SegmentInfo::mmap (header.sh_data .mem_size , PROT_READ | PROT_WRITE);
129- memcpy (impl.seg_rodata .base , code_buf + header.sh_rodata .offset , header.sh_rodata .file_size );
130- memcpy (impl.seg_data .base , code_buf + header.sh_data .offset , header.sh_data .file_size );
131+ {
132+ impl.seg_rodata .len = page_size.align_up (header.sh_rodata .mem_size );
133+ impl.seg_data .len = page_size.align_up (header.sh_data .mem_size );
134+
135+ impl.data_arena = SegmentInfo::mmap ((1ull << 32 ) + impl.seg_rodata .len , PROT_NONE);
136+ impl.seg_rodata .base = reinterpret_cast <uint8_t *>(impl.data_arena .base ) + (1ull << 31 );
137+ impl.seg_data .base = reinterpret_cast <uint8_t *>(impl.seg_rodata .base ) + impl.seg_rodata .len ;
138+
139+ impl.seg_rodata .set_prot (PROT_READ | PROT_WRITE);
140+ impl.seg_data .set_prot (PROT_READ | PROT_WRITE);
141+
142+ memcpy (impl.seg_rodata .base , code_buf + header.sh_rodata .offset , header.sh_rodata .file_size );
143+ memcpy (impl.seg_data .base , code_buf + header.sh_data .offset , header.sh_data .file_size );
144+ }
131145 impl.seg_rodata .set_prot (PROT_READ);
132146
133147 impl.c_st .functions .reset (header.n_functions );
@@ -145,7 +159,7 @@ VMContext VMContext::create(void* _code_buf, std::size_t len) {
145159 auto & c_st = impl.c_st ;
146160
147161 c_st.seg_got = SegmentInfo{
148- impl.arena_ptr ,
162+ impl.code_arena_ptr ,
149163 page_size
150164 };
151165
0 commit comments