2013-06-23 43 views
1

我想在內聯程序中調用系統調用(prctl)並檢索系統調用的結果。但我無法讓它工作。內聯彙編程序用於調用系統調用並檢索其結果

這是我使用的代碼:

int install_filter(void) 
{ 

    long int res =-1; 
    void *prg_ptr = NULL; 

    struct sock_filter filter[] = { 
    BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_TRAP), 
     /* If a trap is not generate, the application is killed */ 
     BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL), 
    }; 
    struct sock_fprog prog = { 
     .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), 
     .filter = filter, 
    }; 

    prg_ptr = &prog; 

    no_permis(); 

    __asm__ (
     "mov %1, %%rdx\n" 
     "mov $0x2, %%rsi \n" 
     "mov $0x16, %%rdi \n" 
     "mov $0x9d, %%rax\n" 
     "syscall\n" 
     "mov %%rax, %0\n" 
     : "=r"(res) 
     : "r"(prg_ptr)  
     : "%rdx", "%rsi", "%rdi", "%rax" 
     ); 

    if (res < 0){ 
    perror("prctl"); 
    exit(EXIT_FAILURE); 
    } 

    return 0; 
} 

過濾器應該是輸入(prg_ptr)的地址,我想保存的結果資源。

你能幫我嗎?

回答

3

對於內聯彙編,除非必須,否則不要使用像這樣的mov,即使那樣你也必須做醜陋的shiffling。那是因爲你不知道什麼寄存器的參數到達相反,你應該使用:

__asm__ __volatile__ ("syscall" : "=a"(res) : "d"(prg_ptr), "S"(0x2), "D"(0x16), "a"(0x9d) : "memory"); 

我還添加了__volatile__,你應該比它的輸出等副作用的ASM使用和memory撞(內存屏障),你應該使用任何帶有內存副作用的asm,或者對內存訪問重新排序它將是無效的。除非你知道你不需要它們,否則總是使用這兩個系統調用是一個很好的習慣。

如果您仍然遇到問題,請使用strace觀察系統調用嘗試並查看發生了什麼問題。