gpt4 book ai didi

无法在 x86_64 上使用 __objc_msg_forward

转载 作者:行者123 更新时间:2023-11-30 18:08:22 25 4
gpt4 key购买 nike

无论我做什么,我都无法让 __objc_msg_forward 在 Linux 上的 x86_64 上工作。如果我用 -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 中将其拉出,它会显示“非法指令”。

最佳答案

您使用谁的 64 位 Obj-C 运行时?据我所知,Apple 仅支持 x86_64 上的 Obj-C 2.0 运行时。

关于无法在 x86_64 上使用 __objc_msg_forward,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3481216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com