2013-07-21 1 views
0

GCC를 사용하면 && 라벨의 주소를 알 수 있습니다. ICC는 비슷한 기능을 가지고 있습니까? 나는 그것에 관한 문서를 찾을 수 없었다.ICC의 라벨 주소

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/mman.h> 
#include <stdint.h> 

int main(int argc, char **argv) 
{ 
    int (*my_printf) (const char *format, ...); 
    void (*my_exit) (int); 
    void *page = (void *) ((unsigned long) (&&checkpoint) & ~(getpagesize() - 1)); 

    /* mark the code section we are going to overwrite           
    * as writable.                    
    */ 
    mprotect(page, getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC); 

    /* Use the labels to avoid having GCC               
    * optimize them out */ 
    switch (argc) { 
    case 33: 
    goto checkpoint; 
    case 44: 
    goto newcode; 
    case 55: 
    goto newcode_end; 
    default: 
    break; 
    } 

    /* Replace code in checkpoint with code from             
    * newcode.                     
    */ 
    //memcpy(&&checkpoint, &&newcode, &&newcode_end - &&newcode);         

checkpoint: 
    printf("Good morning!\n"); 
    return 1; 

newcode: 
    my_printf = &printf; 
    (*(my_printf)) ("Good evening\n"); 

    my_exit = &exit; 
    (*(my_exit)) (0); 

newcode_end: 
    return 2; 
} 
+2

그렇지 않은 경우에는 그렇지 않습니다. 표준 기능이 아닙니다. –

+0

@ H2CO3 : 그러나 ICC는 gcc와 밀접하게 호환되도록 시도합니다. –

답변

0

Linux 버전의 ICC도이 기능을 지원합니다. 같은 구문 :

void* ptr = &&some_label; 
+0

흠, 내가 icc로 컴파일을 시도했을 때 segfaulted를 실행하고있는 테스트 프로그램. mprotect 또는 memcpy는 icc로 컴파일 할 때 다르게 작동합니까? – user2142343

+0

@ user2142343 : 소스가 포함되도록 질문을 업데이트하여 테스트 프로그램을 보여주십시오 (시간이 너무 오래 걸리지 않는다고 가정). –

+0

@KeithThompson 실행하려고하는 테스트 프로그램으로 업데이트했습니다. – user2142343