2010-01-24 31 views
0

對於用戶級線程庫,我需要通過修改存儲在jmp_buf中的PC值來計算跳轉到某個函數。在jmp_buf中修改PC以轉至其他功能

這是我寫:

jmp_buf env; 

void print (void) { 
printf("\nHello World!"); 
} 

static int ptr_mangle(int p) { 
     unsigned int ret; 
     asm(" movl %1, %%eax;\n" 
      " xorl %%gs:0x18, %%eax;" 
      " roll $0x9, %%eax;" 
      " movl %%eax, %0;" 
     : "=r"(ret) 
     : "r"(p) 
     : "%eax" 
     ); 
     return ret; 
    } 


int main() { 
int i = setjmp(env); 
    env[0].__jmpbuf[5] = ptr_mangle(print); 
longjmp(env, 2); 
    return 0; 
} 

我試圖將其設置爲我試圖跳到函數的地址修改PC的jmp_buf。 我遇到分段錯誤。 我無法弄清楚究竟需要做什麼。我是否也需要修改SP?

任何幫助將非常感激。

回答

0

你想做什麼?你沒有檢查setjmp的返回值嗎?我認爲你沒有做到這一點。看看下面的示例代碼,看看會產生什麼輸出是:

 
#include <stdio.h> 
#include <setjmp.h> 
#include <stdlib.h> 

void subroutine(jmp_buf); 

int main(void) 
{ 
    int value; 
    jmp_buf jumper; 

    value = setjmp(jumper); 
    if (value != 0) 
    { 
     printf("Longjmp with value %d\n", value); 
     exit(value); 
    } 
    printf("About to call subroutine ... \n"); 
    subroutine(jumper); 

    return 0; 
} 

void subroutine(jmp_buf jumper) 
{ 
    longjmp(jumper,1); 
} 

輸出將是: 關於調用子程序... Longjmp混合與1

這引出了一個問題 - 你爲什麼要修改IP?這聽起來像是你重寫了一些東西,或者代碼'跳進'樹林裏,踐踏了一些東西,然後硬着陸,也就是segfault。

變量env具體爲結構,不要使用數組下標爲你做了。我懷疑這就是爲什麼你有段錯誤...

希望這會有所幫助, 最好的問候, 湯姆。