【问题标题】:Runtime API availability check (weak linking) -- incorrect behavior on 10.5运行时 API 可用性检查(弱链接)- 10.5 上的错误行为
【发布时间】:2010-12-27 19:14:51
【问题描述】:

我正在 10.6 上构建我的应用程序,但目标是 10.5 进行部署。当程序将在 10.6 上运行时,我想利用 Service Management SMJobBless api,但在 10.5 上运行时我显然仍需要使用特权安装工具。

我在我的可执行目标中弱链接到服务管理框架。我尝试了几种代码变体:

if (SMJobBless != NULL) ...

if (SMJobBless) ...

bool const /* or non-const */ useBlessAPI = SMJobBless != NULL;
if (useBlessAPI) ...

我什至尝试过使用compiler flags listed in a similar-seeming question

在 10.6 上,printf("%p %d", SMJobBless, SMJobBless != NULL)(正确)为 SMJobBless 打印非空指针值,为非空打印 1。

当我将应用程序包复制到 10.5 时,printf 告诉我 SMJobBless 为 0x0,但(错误地)为非空指针打印 1。

我让它工作的唯一方法是关闭所有优化并将函数指针分配给一个变量。

Boolean (* const blessAPI) (CFStringRef, CFStringRef, AuthorizationRef, CFErrorRef *) = &SMJobBless;

但我无法关闭生产代码的优化!

【问题讨论】:

  • @Jonathan Grynspan 我重新阅读了your answer to that question 并重新尝试获取我想要的函数的地址,但正如我在 Q 中所说,只有当我将编译器优化设置为无时才有效。
  • 你用 & 符号试过了吗?你使用的是哪个编译器,GCC 还是 LLVM?
  • 我尝试了所有 3 个编译器:gcc、llvm 和 llvm-gcc。当我创建函数指针 volatile 时,该方法终于奏效了(在编译器优化的情况下),如下面的回答中所述。
  • @Richard,请不要回滚清理烧毁标签的编辑。 [可用性] 因某种原因被删除。

标签: macos api compatibility weak-linking


【解决方案1】:

尝试将extern Boolean SMJobBless() __attribute__((weak_import)); 放入使用该函数的文件中。它可能没有被正确标记为弱。

【讨论】:

    【解决方案2】:

    我还发现,similar to the question/answer cited in comments,如果我将函数指针分配给 volatile 变量,那么一切评估正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-21
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      相关资源
      最近更新 更多