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에서 풀다 보면 불법적 인 지시가 나온다.
Linux의 표준 GNU/gcc 런타임. – FozzTexx