我正在尝试对 Core Foundation 函数进行逆向工程并在我的代码中使用它。我已确定此函数所需的参数数量仅为 1,并且我 99% 确定该函数旨在采用单个CFStringRef
并返回CFStringRef
. 所以我像这样声明了这个函数:
extern CFStringRef CPPhoneNumberCopyFormattedStringForTextMessage(CFStringRef pnString);
然后我开始尝试使用它:
CFStringRef formattedAddress = CPPhoneNumberCopyFormattedStringForTextMessage((CFStringRef)@"test");
但是当我编译时,我得到了一个熟悉的symbol not found
错误:
Undefined symbols for architecture armv7:
"CPPhoneNumberCopyFormattedStringForTextMessage(__CFString const*)", referenced from: ...
ld: symbol(s) not found for architecture armv7
现在,通常我会假设我对函数签名的至少一个猜测(即参数数量、参数类型等)是错误的,但在这种情况下,我已经一次又一次地检查了程序集,唯一有意义的签名是我提供的签名。我知道我正在链接到正确的框架,并且我已经运行nm
以确保该函数的符号确实存在。
所以我想我的问题有两个部分:
- 我在这里缺少什么吗?
- 有没有更好的方法来确定像这样的 C 函数满足编译器的参数数量和/或参数类型?
我不是编译器/链接器如何工作的专家,但我认为它必须做一些我可以利用的事情,如果它依赖于准确的函数声明来正确链接到该函数。它到底在检查什么?对于sizeof
每个参数?有没有一种方法可以比有根据的猜测更容易地利用它来确定函数的参数?
如果有帮助,我可以提供汇编代码和任何其他信息。
编辑:为了清楚起见,我在 iOS 5.1 上运行,所以这是为 ARM 编译的(确切地说是 armv7)。我正在使用最新版本的 Clang 进行编译。该框架是 armv6 和 armv7 的胖二进制文件。