ltrace -Sl'analyse d'un exemple minimal montre qu'il mmapest utilisé dans la glibc 2.23
Dans la glibc 2.23, Ubuntu 16.04, fonctionnant latrace -Ssur un programme minimal qui utilise dlopenavec:
ltrace -S ./dlopen.out
spectacles:
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
nous voyons donc immédiatement que dlopenappelle open+ mmap.
L' ltraceoutil génial trace à la fois les appels de bibliothèque et les appels système, et est donc parfait pour examiner ce qui se passe dans ce cas.
Une analyse plus approfondie montre que openrenvoie le descripteur de fichier 3(libre suivant après stdin, out et err).
readutilise ensuite ce descripteur de fichier, mais TODO pourquoi mmaples arguments sont limités à quatre, et nous ne pouvons pas voir quel fd a été utilisé car il s'agit du 5ème argument . straceconfirme comme prévu celui 3-là, et l'ordre de l'univers est rétabli.
Les âmes courageuses peuvent également s'aventurer dans le code glibc, mais je n'ai pas pu trouver l' mmapafter après une grep rapide et je suis paresseux.
Testé avec cet exemple minimal avec build passe-partout sur GitHub .