ltrace -SEl análisis de un ejemplo mínimo muestra que mmapse usa en glibc 2.23
En glibc 2.23, Ubuntu 16.04, ejecutándose latrace -Sen un programa mínimo que utiliza dlopencon:
ltrace -S ./dlopen.out
muestra:
dlopen("libcirosantilli_ab.so", 1 <unfinished ...>
SYS_open("./x86_64/libcirosantilli_ab.so", 524288, 06267650550) = -2
SYS_open("./libcirosantilli_ab.so", 524288, 06267650550) = 3
SYS_read(3, "\177ELF\002\001\001", 832) = 832
SYS_brk(0) = 0x244c000
SYS_brk(0x246d000) = 0x246d000
SYS_fstat(3, 0x7fff42f9ce30) = 0
SYS_getcwd("/home/ciro/bak/git/cpp-cheat"..., 128) = 54
SYS_mmap(0, 0x201028, 5, 2050) = 0x7f1c323fe000
SYS_mprotect(0x7f1c323ff000, 2093056, 0) = 0
SYS_mmap(0x7f1c325fe000, 8192, 3, 2066) = 0x7f1c325fe000
SYS_close(3) = 0
SYS_mprotect(0x7f1c325fe000, 4096, 1) = 0
entonces vemos de inmediato que las dlopenllamadas open+ mmap.
La asombrosa ltraceherramienta rastrea las llamadas a la biblioteca y las llamadas al sistema, y por lo tanto es perfecta para examinar lo que está sucediendo en este caso.
Un análisis más detallado muestra que opendevuelve el descriptor de archivo 3(el siguiente libre después de stdin, out y err).
readluego usa ese descriptor de archivo, pero TODO por qué mmaplos argumentos están limitados a cuatro, y no podemos ver qué fd se utilizó allí ya que ese es el quinto argumento . straceconfirma como se esperaba que ese 3es, y el orden del universo se restaura.
Las almas valientes también pueden aventurarse en el código glibc, pero no pude encontrar el mmapdespués de un grep rápido y soy flojo.
Probado con este ejemplo mínimo con build boilerplate en GitHub .