хочу написать тулзу использующую ptrace() для трейсинга malloc()/free().
знаю, что malloc()/free() - не сисколы, потому ptrace() не сможет их трейсить. для того чтоб определить, какие сисколы в реале используются, набросал тест и запусти его под strace:
#include <stdlib.h>
int main() {
void *p = malloc(32);
free(p);
}
execve("./malloc", ["./malloc"], [/* 74 vars */]) = 0
brk(0) = 0xd00000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f505301d000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=152675, ...}) = 0
mmap(NULL, 152675, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f5052ff7000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\37\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1845024, ...}) = 0
mmap(NULL, 3953344, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f5052a37000
mprotect(0x7f5052bf3000, 2093056, PROT_NONE) = 0
mmap(0x7f5052df2000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1bb000) = 0x7f5052df2000
mmap(0x7f5052df8000, 17088, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f5052df8000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5052ff6000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5052ff4000
arch_prctl(ARCH_SET_FS, 0x7f5052ff4740) = 0
mprotect(0x7f5052df2000, 16384, PROT_READ) = 0
mprotect(0x600000, 4096, PROT_READ) = 0
mprotect(0x7f505301f000, 4096, PROT_READ) = 0
munmap(0x7f5052ff7000, 152675) = 0
mmap(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5052ef3000
munmap(0x7f5052ef3000, 1052672) = 0
exit_group(1048576) = ?
+++ exited with 0 +++
execve("./malloc", ["./malloc"], [/* 74 vars */]) = 0
brk(0) = 0x1aea000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f72854ce000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=152675, ...}) = 0
mmap(NULL, 152675, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f72854a8000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\37\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1845024, ...}) = 0
mmap(NULL, 3953344, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f7284ee8000
mprotect(0x7f72850a4000, 2093056, PROT_NONE) = 0
mmap(0x7f72852a3000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1bb000) = 0x7f72852a3000
mmap(0x7f72852a9000, 17088, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f72852a9000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f72854a7000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f72854a5000
arch_prctl(ARCH_SET_FS, 0x7f72854a5740) = 0
mprotect(0x7f72852a3000, 16384, PROT_READ) = 0
mprotect(0x600000, 4096, PROT_READ) = 0
mprotect(0x7f72854d0000, 4096, PROT_READ) = 0
munmap(0x7f72854a8000, 152675) = 0
exit_group(1048576) = ?
+++ exited with 0 +++
mmap(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5052ef3000
munmap(0x7f5052ef3000, 1052672) = 0
т.е. я правильно понимаю, что mmap()/munmap() используются для malloc()/free() соответственно? второй вопрос в том, каким образом я могу определить, что эти mmap()/munmap() используются именно для malloc()/free(), а не для мапинга файла, к примеру?
кто-то вообще копал в этом направлении? или, может быть, кто-то знает где есть решение похожее тому, что я пытаюсь сделать?
благодарен.