2013-04-01 55 views
0

我想獲得一個系統調用的地址,生成一個sigsys信號!但我從GCC收到以下錯誤:siginfo匿名工會

gcc emulator.c -fms-extensions 
error: ‘siginfo_t’ has no member named ‘si_call_addr’ 

我使用的代碼是:

static void emulator(int nr, siginfo_t *siginfo, void *void_context) 
{ 
     ucontext_t *ctx = (ucontext_t *)(void_context); 
     int syscall; 
     char *buf; 
     ssize_t bytes; 
     size_t len; 


     if (siginfo->si_code != SYS_SECCOMP) 
       return; 
     if (!ctx) 
       return; 


     syscall = ctx->uc_mcontext.gregs[REG_SYSCALL]; 
     printf("System call %d ADDR %X\n", syscall, siginfo->si_call_addr); 

     setcontext(ctx); 

     return; 
} 

的si_call_addr被定義爲siginfo_t匿名結構。

回答

0

siginfo_t中沒有si_call_addr。您可能正在尋找si_addr會員。

下面是Linux所提供的siginfo_t:

siginfo_t { 
     int  si_signo; /* Signal number */ 
     int  si_errno; /* An errno value */ 
     int  si_code;  /* Signal code */ 
     int  si_trapno; /* Trap number that caused 
           hardware-generated signal 
           (unused on most architectures) */ 
     pid_t si_pid;  /* Sending process ID */ 
     uid_t si_uid;  /* Real user ID of sending process */ 
     int  si_status; /* Exit value or signal */ 
     clock_t si_utime; /* User time consumed */ 
     clock_t si_stime; /* System time consumed */ 
     sigval_t si_value; /* Signal value */ 
     int  si_int;  /* POSIX.1b signal */ 
     void *si_ptr;  /* POSIX.1b signal */ 
     int  si_overrun; /* Timer overrun count; POSIX.1b timers */ 
     int  si_timerid; /* Timer ID; POSIX.1b timers */ 
     void *si_addr;  /* Memory location which caused fault */ 
     long  si_band;  /* Band event (was int in 
           glibc 2.3.2 and earlier) */ 
     int  si_fd;  /* File descriptor */ 
     short si_addr_lsb; /* Least significant bit of address 
           (since kernel 2.6.32) */ 
    } 
+0

這是不是當前版本..因爲kernle 3.5本已改爲http://lxr.oss.org.cn/source/include/asm -generic/siginfo.h –

+0

@GiuseppePes此處顯示的結構是呈現給用戶空間的ABI(在glibc 2.16中)如果有其他成員可用,那麼您可能沒有更新的頭文件用於用戶空間代碼 - 您擁有的鏈接顯示內核頭文件。 – nos