2010-08-13 3 views
0

Quoi que je fasse, je ne peux pas obtenir __objc_msg_forward pour travailler sur x86_64 sous Linux. Si je compile avec -m32 cela fonctionne bien. J'ai mis en place ce programme simple pour démontrer. Il devrait imprimer Crasho Barfo deux fois.Impossible d'utiliser __objc_msg_forward sur x86_64

#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; 
} 

Qu'est-ce que je fais de mal? Quand je le lance cela se produit:

./vtest 
Crasho 
Barfo 
Segmentation fault 

Si je le tire dans gdb il dit instruction illégale. Dont l'environnement d'exécution Obj-C 64 bits est-il utilisé?

Répondre

0

? Pour autant que je sache, Apple ne supporte que l'exécution d'Obj-C 2.0 sur x86_64.

+0

Exécution standard GNU/gcc sous Linux. – FozzTexx

Questions connexes