c - 从汇编中确定 C 函数的参数类型

标签 c assembly core-foundation

我正在尝试对 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 以确保该函数的符号确实存在。

所以我想我的问题有两个部分:

  1. 这里有什么我遗漏的吗?
  2. 是否有更好的方法来确定像这样的 C 函数满足编译器要求的参数数量和/或参数类型?

我不是编译器/链接器如何工作的专家,但我认为如果它依赖准确的函数声明来正确链接到该函数,它一定在做一些我可以利用的事情。它到底在检查什么?每个参数的 sizeof?有没有一种方法可以利用它比有根据的猜测更容易地确定函数的参数?

如果有帮助,我可以提供汇编代码和任何其他信息。

编辑:明确地说,我在 iOS 5.1 上运行,所以这是为 ARM(准确地说是 armv7)编译的。我正在使用最新版本的 Clang 进行编译。该框架是 armv6 和 armv7 的胖二进制文件。

最佳答案

看起来您正在使用 C++ 编译器来编译您的代码。如果将 CPPhoneNumberCopyFormattedStringForTextMessage 的原型(prototype)放在 extern "C" block 中,它应该链接,因为不会进行名称修改。确定类型完全是另一回事。

关于c - 从汇编中确定 C 函数的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12293186/

相关文章:

c++ - 使用 SCH_CRED_FORMAT_CERT_HASH 时,AcquireCredentialsHandle 在内核模式下失败

objective-c - 我如何将工作日添加到 NSDate?

objective-c - Foundation框架导致的 "memory leaks"怎么办?

objective-c - 如何从 Cocoa 中的 CFStringTokenizer 获取 token 类型?

c++ - 将元素插入已排序的循环双链表

python - 在 C/C++ 中使用 Python 代码

c - 看似随机的 opendir() 失败 C

assembly - 从 EQU 符号名表示浮点常数

gcc - gcc 输出的 .seh_* 汇编命令是什么?

c - linux内核bootsect.s文件中的 "seg fs"是什么意思