ltrace -S
El análisis de un ejemplo mínimo muestra que mmap
se usa en glibc 2.23
En glibc 2.23, Ubuntu 16.04, ejecutándose latrace -S
en un programa mínimo que utiliza dlopen
con:
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 dlopen
llamadas open
+ mmap
.
La asombrosa ltrace
herramienta 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 open
devuelve el descriptor de archivo 3
(el siguiente libre después de stdin, out y err).
read
luego usa ese descriptor de archivo, pero TODO por qué mmap
los argumentos están limitados a cuatro, y no podemos ver qué fd se utilizó allí ya que ese es el quinto argumento . strace
confirma como se esperaba que ese 3
es, y el orden del universo se restaura.
Las almas valientes también pueden aventurarse en el código glibc, pero no pude encontrar el mmap
después de un grep rápido y soy flojo.
Probado con este ejemplo mínimo con build boilerplate en GitHub .