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 .