ltrace -S
l'analyse d'un exemple minimal montre qu'il mmap
est utilisé dans la glibc 2.23
Dans la glibc 2.23, Ubuntu 16.04, fonctionnant latrace -S
sur un programme minimal qui utilise dlopen
avec:
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 dlopen
appelle open
+ mmap
.
L' ltrace
outil 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 open
renvoie le descripteur de fichier 3
(libre suivant après stdin, out et err).
read
utilise ensuite ce descripteur de fichier, mais TODO pourquoi mmap
les arguments sont limités à quatre, et nous ne pouvons pas voir quel fd a été utilisé car il s'agit du 5ème argument . strace
confirme 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' mmap
after après une grep rapide et je suis paresseux.
Testé avec cet exemple minimal avec build passe-partout sur GitHub .