• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 如何在 Mach-O 文件中编辑加载命令并在 tvOS 上成功链接它?

[复制链接]
菜鸟教程小白 发表于 2022-12-12 14:31:06 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

假设我有一个 .a fat 库,它是为多种架构构建的(例如 armv7、armv7s、i386、x86_64、arm64)。库是为 iOS 构建的(其中包含 cmd LC_VERSION_MIN_IPHONEOS 和 6.0 版)。例如,当我运行 $ otool -lv 时,我得到了带有这样加载命令的部分:

Load command 1
      cmd LC_VERSION_MIN_IPHONEOS
  cmdsize 16
  version 6.0
      sdk n/a

我想将其替换为:

Load command 1
      cmd LC_VERSION_MIN_TVOS
  cmdsize 16
  version 9.0
      sdk n/a

有谁知道我该怎么做,或者可以指出一些有用的资源吗? 我还能在 tvOS 上链接修改后的库吗?



Best Answer-推荐答案


如果您可以访问源代码,最好的解决方案显然是为 tvOS 重新编译它。

如果您无权访问源代码,快速而肮脏的解决方案是在十六进制编辑器中打开库,搜索这些字节(每个目标文件一次):



并用这些替换它们:



一个更稳定的解决方案是编写一个小的 C 程序来解析和编辑目标文件的 header 。在安装了 Xcode 的 Mac 上,您需要的所有信息(以及有用的评论)都可以从 <mach-o/loader.h> 获得。头文件。对于其他人,该文件也可以从 the XNU source code 获得。 .

迭代所有加载命令的基本思想如下所示,给定一个字符缓冲区 file包含一个 Mach-O:



现在为了您的目的,您需要迭代直到找到带有 cmd->cmd == LC_VERSION_MIN_IPHONEOS 的加载命令, 并将其替换为 LC_VERSION_MIN_TVOS .您还需要将该加载命令转换为 struct version_min_command*然后,其定义如下:

struct version_min_command {
    uint32_t cmd;
    uint32_t cmdsize;
    uint32_t version;   /* X.Y.Z is encoded in nibbles xxxx.yy.zz */
    uint32_t sdk;       /* X.Y.Z is encoded in nibbles xxxx.yy.zz */
};

所以为了得到版本号9.0 ,你会分配 version (9 << 16) 的值.

然后将文件保存回来就大功告成了。

关于ios - 如何在 Mach-O 文件中编辑加载命令并在 tvOS 上成功链接它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48301420/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap