A análise de
ltrace -S de um exemplo mínimo mostra que mmap é usado em glibc 2.23
No glibc 2.23, Ubuntu 16.04, executando latrace -S em um programa mínimo que usa dlopen com:
ltrace -S ./dlopen.out
mostra:
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, "7ELFltrace -S ./dlopen.out
2dlopen("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, "7ELF%pre%2%pre%1%pre%1", 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
1%pre%1", 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
para que possamos ver imediatamente que dlopen chama open + mmap .
A incrível ferramenta ltrace rastreia as chamadas da biblioteca e do sistema e, portanto, é perfeita para examinar o que está acontecendo nesse caso.
Uma análise mais detalhada mostra que open retorna o descritor de arquivo 3 (o próximo é livre depois de stdin, out e err).
read , em seguida, usa esse descritor de arquivo, mas TODO por que os argumentos de mmap estão limitados a quatro, e não podemos ver qual fd foi usado lá, já que é o quinto argumento . strace confirma como esperado que 3 é o único, e a ordem do universo é restaurada.
Almas corajosas também podem se aventurar no código da glibc, mas não consegui encontrar o mmap depois de um grep rápido e sou preguiçoso.
Testado com este exemplo mínimo com clichê de construção no GitHub .