【问题标题】:linking mess with libc与 libc 链接混乱
【发布时间】:2009-11-13 20:33:09
【问题描述】:

我有一个编译成 .a 文件的库,链接到我的应用程序。 (iphone,用Xcode开发)

一切似乎都很好,链接似乎成功了,但是当我运行程序时它崩溃了。崩溃点是静态链接库中的 memcmp() 调用。调试器显示了所有名称中带有“dyld”的东西,因此似乎无论出于何种原因它都无法解析 memcmp,开始寻找动态库,然后失败。

AFAIK memcmp 在 libc 中,所以应该不是问题。 (也尝试将 -lc 传递给链接器,但正如我所料,它没有帮助)

那么它应该如何工作?为什么静态链接库不能使用 libc 中的任何内容?应该怎么编译?

谢谢

【问题讨论】:

  • 您链接到应用程序的库是您自己编写的吗? - 我不禁怀疑它正在使用未初始化或空指针。或者,也许您没有正确使用导致无效指针的库?回溯说明了什么?
  • 不,它是一个广泛使用的库,可以在很多平台上可靠地工作,但它在一开始就失败了,它带有一个初始化函数。相同的代码 sn-p(实际上是 2 个函数调用来设置)回溯指向一个 memcmp 函数。 (库是在调试模式下编译的)

标签: iphone c xcode linker libc


【解决方案1】:

libc 显然是在您的平台上动态链接的。在运行时找不到匹配的版本来满足链接时生成的依赖关系。

除了文件系统损坏或在动态链接发生之​​前调用 chroot(这似乎不太可能)之外,我无法解释这是如何发生的。

【讨论】:

  • 奇怪的是,我可以从我的主程序调用 memcmp(),但是库仍然不能使用它。
  • 一些编译器将 memcmp() 作为内在函数处理。也就是说,如果你调用它,它会放置代码来实现它,而不是调用库函数。
【解决方案2】:

如果我分享问题所在,也许有人会发现它很有用:

该库未针对与主程序相同的操作系统版本进行编译,因此它预期的 libc 与运行时找到的不同。

【讨论】:

    猜你喜欢
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多