ltrace -S
A análise de um exemplo mínimo mostra que mmap
é usado na 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, "\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
então vemos imediatamente que dlopen
chama open
+ mmap
.
A ltrace
ferramenta impressionante rastreia chamadas de biblioteca e chamadas de sistema e, portanto, é perfeita para examinar o que está acontecendo neste caso.
Uma análise mais detalhada mostra que open
retorna o descritor de arquivo 3
(o próximo é gratuito após stdin, out e err).
read
então usa esse descritor de arquivo, mas os argumentos do TODO why mmap
são limitados a quatro, e não podemos ver qual fd foi usado lá, pois esse é o quinto argumento . strace
confirma como esperado que 3
é esse, e a ordem do universo é restaurada.
Almas corajosas também podem se aventurar no código glibc, mas não consegui encontrar o mmap
após um grep rápido e sou preguiçoso.
Testado com este exemplo mínimo com build clichê no GitHub .