从程序集中确定C函数的参数类型

时间:2012-09-06 04:55:17

标签: 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函数可以满足编译器的需要?
  3. 我不是编译器/链接器如何工作的专家,但我认为它必须做一些我可以利用的东西,如果它依赖于一个准确的函数声明来正确链接到该函数。究竟是什么检查?每个参数的sizeof?有没有一种方法可以利用它来比决定教育的猜测更容易确定函数的参数?

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

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

1 个答案:

答案 0 :(得分:2)

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