@@ -337,10 +337,13 @@ size_t emitElf(Binary *B, const MappingSet &mappings, size_t mapping_size)
337337 }
338338 std::vector<Bounds> bounds;
339339 intptr_t ub = INTPTR_MIN;
340+ // level 0 == non-trampoline mappings (reserves, refactors), default mmap()
341+ // level 1 == trampoline mappings, user mmap() can be used.
340342 for (unsigned i = 0 ; i < 2 ; i++)
341343 {
342- config->maps [i] = (uint32_t )(size - config_offset);
343- bool preload = (i == 0 );
344+ unsigned level = i;
345+ config->maps [level] = (uint32_t )(size - config_offset);
346+ bool preload = (level == 0 );
344347 for (auto *mapping: mappings)
345348 {
346349 if (preload)
@@ -361,18 +364,34 @@ size_t emitElf(Binary *B, const MappingSet &mappings, size_t mapping_size)
361364 size_t len = b.ub - b.lb ;
362365 off_t offset = offset_0 + b.lb ;
363366
364- debug (" load trampoline: mmap(addr=" ADDRESS_FORMAT
367+ const char *name = (level == 0 ? " reserve" : " trampoline" );
368+ debug (" load %s: mmap(addr=" ADDRESS_FORMAT
365369 " ,size=%zu,offset=+%zu,prot=%c%c%c)" ,
366- ADDRESS (base), len, offset_0, (r? ' r' : ' -' ),
370+ name, ADDRESS (base), len, offset_0, (r? ' r' : ' -' ),
367371 (w? ' w' : ' -' ), (x? ' x' : ' -' ));
368372 stat_num_virtual_bytes += len;
369373
370374 size += emitLoaderMap (data + size, base, len, offset,
371375 r, w, x, &ub);
372- config->num_maps [i ]++;
376+ config->num_maps [level ]++;
373377 }
374378 }
375379 }
380+ if (level == 0 )
381+ {
382+ // Emit refactorings at level 0.
383+ for (const auto &refactor: refactors)
384+ {
385+ debug (" load refactor: mmap(addr=" ADDRESS_FORMAT
386+ " ,size=%zu,offset=+%zd,prot=r-x)" ,
387+ ADDRESS (refactor.addr ), refactor.size ,
388+ refactor.patched .offset );
389+ size += emitLoaderMap (data + size, refactor.addr ,
390+ refactor.size , refactor.patched .offset , /* r=*/ true ,
391+ /* w=*/ false , /* x=*/ true , nullptr );
392+ config->num_maps [level]++;
393+ }
394+ }
376395 }
377396 if (ub > option_loader_base)
378397 {
@@ -383,16 +402,6 @@ size_t emitElf(Binary *B, const MappingSet &mappings, size_t mapping_size)
383402 " exceed maximum mapping address (0x%lx) (see `--mem-ub')" ,
384403 option_loader_base, ub);
385404 }
386- for (const auto &refactor: refactors)
387- {
388- debug (" load refactoring: mmap(" ADDRESS_FORMAT " , %zu, "
389- " PROT_READ | PROT_WRITE | 0, MAP_FIXED | MAP_PRIVATE, fd, +%zd)" ,
390- ADDRESS (refactor.addr ), refactor.size , refactor.patched .offset );
391- size += emitLoaderMap (data + size, refactor.addr , refactor.size ,
392- refactor.patched .offset , /* r=*/ true , /* w=*/ false , /* x=*/ true ,
393- nullptr );
394- config->num_maps [1 ]++;
395- }
396405 intptr_t entry = (option_loader_base + (size - config_offset));
397406 if (option_trap_entry)
398407 data[size++] = /* int3=*/ 0xCC ;
0 commit comments