Есть такой код:
#include <stdio.h>
#include <unistd.h>
#include <sys/ptrace.h>
#include <time.h>
#include <errno.h>
#include <sys/types.h>
#include <signal.h>
#define ELF_MAGIC_LE 0x464C457F /* "\x7FELF" in little endian */
void parent(pid_t);
void child();
int main( int argc, char *argv[])
{
pid_t pid = fork();
if (pid)
{
parent(pid);
}
else
child();
return 0;
}
void child()
{
struct timespec tim = {5,0};
for(;;) nanosleep(&tim, NULL); //sleep 5 sec
}
void parent(pid_t pid)
{
size_t i;
long ret = ptrace(PTRACE_ATTACH, pid, NULL, NULL);
for (i = 0x0; i+1 < 0xfffff000ULL; i+= 0x1000)
{
ret = ptrace(PTRACE_PEEKDATA, pid, (void *)i, NULL);
if ( ((unsigned long)ret & 0xFFFFFFFF) == ELF_MAGIC_LE) printf ("elf header at 0x%zx\n", i);
}
ptrace(PTRACE_DETACH, pid, NULL, NULL);
kill(pid, SIGKILL);
}
elf header at 0x8048000
elf header at 0x8049000
elf header at 0xf7602000
elf header at 0xf77d7000
elf header at 0xf77d8000
ptrace(PTRACE_PEEKDATA, ...
вызывает сигфолт? Что тут можно улучшить?