ltrace -S
Die Analyse eines Minimalbeispiels zeigt, dass mmap
es in glibc 2.23 verwendet wird
In glibc 2.23, Ubuntu 16.04, ausgeführt latrace -S
auf einem Minimalprogramm, das verwendet wird dlopen
mit:
ltrace -S ./dlopen.out
zeigt an:
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
so sehen wir sofort, dass dlopen
ruft open
+ mmap
.
Das fantastische ltrace
Tool verfolgt sowohl Bibliotheksaufrufe als auch Systemaufrufe und ist daher perfekt, um zu untersuchen, was in diesem Fall vor sich geht.
Eine genauere Analyse zeigt, dass open
der Dateideskriptor zurückgegeben wird 3
(nächster freier nach stdin, out und err).
read
verwendet dann diesen Dateideskriptor, aber die Argumente von TODO why mmap
sind auf vier beschränkt, und wir können nicht sehen, welches fd dort verwendet wurde, da dies das fünfte Argument ist . strace
bestätigt, wie erwartet, dass dies 3
der Fall ist, und die Ordnung des Universums wird wiederhergestellt.
Tapfere Seelen können sich auch in Glibc-Code wagen, aber ich konnte den mmap
nach einem kurzen Grep nicht finden und bin faul.
Getestet mit diesem Minimalbeispiel mit Build Boilerplate auf GitHub .