2010-08-13 10 views
0

__objc_msg_forward가 Linux에서 x86_64에서 작동하도록 할 수 없습니다. -m32로 컴파일하면 잘 동작합니다. 나는이 간단한 프로그램을 모아 보여줍니다. Crasho Barfo를 두 번 인쇄해야합니다.x86_64에서 __objc_msg_forward를 사용할 수 없습니다.

#import <objc/Object.h> 
#import <objc/objc-api.h> 

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

@interface Object (Test) 
-(id) doSomething:(id) anObject; 
@end 

typedef void *(*vafunc)(void *a1, void *a2, ...); 
vafunc getvtest(void *s1); 

int main(int argc, char *argv[]) 
{ 
    id o1; 
    vafunc ptr; 
    int na; 


    ptr = getvtest(NULL); 
    na = 4; 
    (*ptr)(ptr, &na, "dog", "cat"); 

    __objc_msg_forward = getvtest; 
    o1 = [[Object alloc] init]; 
    [o1 doSomething:o1]; 
    exit(0); 
} 

void *aptest(void *a1, void *a2, va_list ap) 
{ 
    fprintf(stderr, "Barfo\n"); 
    return nil; 
} 

void *vtest(void *a1, void *a2, ...) 
{ 
    va_list ap; 
    void *ret = NULL; 


    fprintf(stderr, "Crasho\n"); 
    va_start(ap, a2); 
    ret = aptest(a1, a2, ap); 
    va_end(ap); 

    return ret; 
} 

vafunc getvtest(void *s1) 
{ 
    return (vafunc) vtest; 
} 

내가 뭘 잘못하고 있니? 내가 이걸 실행하면 다음과 같은 일이 일어난다.

./vtest 
Crasho 
Barfo 
Segmentation fault 

내가 gdb에서 풀다 보면 불법적 인 지시가 나온다.

답변

0

누구의 64 비트 Obj-C 런타임을 사용하고 있습니까? 내가 아는 한, Apple은 x86_64에서 Obj-C 2.0 런타임 만 지원합니다.

+0

Linux의 표준 GNU/gcc 런타임. – FozzTexx

관련 문제