Не могу использовать __objc_msg_forward на x86_64 - PullRequest
0 голосов
/ 14 августа 2010

Что бы я ни делал, я не могу заставить __objc_msg_forward работать на x86_64 в Linux.Если я скомпилирую с -m32, он работает нормально.Я собрал эту простую программу для демонстрации.Это должно напечатать Crasho Barfo дважды.

#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, он скажет Illegal Instruction.

1 Ответ

0 голосов
/ 14 августа 2010

Какую 64-битную среду исполнения Obj-C вы используете? Насколько я знаю, Apple поддерживает только среду выполнения Obj-C 2.0 на x86_64.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...