Все эти mmap()
вызовы являются частью запуска вашей программы при загрузке общих библиотек. Это стандартная вещь, которую вы увидите, когда вы strace
большинство программ.
Реальное действие заключается в последних нескольких строках:
- Два вызова
brk()
из malloc()
. - Вызов
fstat()
и write()
из printf()
.
Вы можете добавить распечатку в начало main()
, чтобы узнать, когда ваш код фактически запускается.
(Важно вызывать системный вызов write()
напрямую, а не печатать с помощью printf()
или puts()
. Функции stdio вызывают внутри malloc()
, что мешает нам пытаясь проверить.)
#include <unistd.h>
int main()
{
write(1, "start\n", 6);
...
}
Когда я это делаю, я вижу вызов write()
прямо перед brk(NULL)
, который я пометил ниже пустой строкой:
...
mmap(0x7f1b34802000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7f1b34802000
mmap(0x7f1b34808000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1b34808000
close(3) = 0
arch_prctl(ARCH_SET_FS, 0x7f1b34a124c0) = 0
mprotect(0x7f1b34802000, 16384, PROT_READ) = 0
mprotect(0x558c3cd9a000, 4096, PROT_READ) = 0
mprotect(0x7f1b34a33000, 4096, PROT_READ) = 0
munmap(0x7f1b34a13000, 128122) = 0
write(1, "start\n", 6) = 6
brk(NULL) = 0x558c3dc58000
brk(0x558c3dc79000) = 0x558c3dc79000
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 4), ...}) = 0
write(1, "allocated 10 bytes at addr: 0x55"..., 44) = 44
exit_group(0) = ?
+++ exited with 0 +++