【问题标题】:theos tweak is not loaded into app when 3rd party framework is linked链接 3rd 方框架时,theos 调整未加载到应用程序中
【发布时间】:2019-12-19 13:48:05
【问题描述】:

我正在使用 theos 将第三个框架链接到我的测试调整中,它只做一个日志,似乎在链接框架之后,tweak.dylib 根本没有加载到应用程序中。如果我在 makefile 中注释掉框架,则调整效果很好。任何想法?谢谢

makefile 关于框架很简单:

ARCHS = arm64

include $(THEOS)/makefiles/common.mk

ADDITIONAL_OBJCFLAGS = -fobjc-arc

TWEAK_NAME = WebServerTest
WebServerTest_FILES = Tweak.xm


WebServerTest_CFLAGS += -F./Frameworks
WebServerTest_LDFLAGS += -F./Frameworks -framework GCDWebServers

include $(THEOS_MAKE_PATH)/tweak.mk

after-install::
    install.exec "killall -9 SpringBoard"

tweak.xm 非常简单:

%ctor {
    NSLog(@"Staring up tweak...");
    %init();
}

所以如果我在上面注释掉

WebServerTest_CFLAGS += -F./Frameworks

WebServerTest_LDFLAGS += -F./Frameworks -framework GCDWebServers

调整工作正常:

Aug 13 10:06:20 iOS-Dev SpringBoard(WebServerTest.dylib)[10378] <Notice>: Staring up tweak...

但是,如果我开始链接框架,则根本不会加载 WebServerTest.dylib

我在 lldb cmd image list 中手动检查了一个测试应用程序,它显示 WebServerTest.dylib 根本没有加载

有什么想法吗?或者我如何开始调试出了什么问题?因为我不确定可能的原因在哪里。

环境:iOS 12.0,unc0ver 3.1.0

otool -l WebServerTest.dylib | fgrep -A5 LC_LOAD_DYLIB

表演

--
          cmd LC_LOAD_DYLIB
      cmdsize 72
         name @rpath/GCDWebServers.framework/GCDWebServers (offset 24)
   time stamp 2 Thu Jan  1 08:00:02 1970
      current version 1.0.0
compatibility version 1.0.0
--

所以看起来使用@rpath,我可以理解,但是我可以将框架嵌入到tweak.dylib中,以便可以自动加载吗?

【问题讨论】:

  • 听起来像是框架加载问题。你能发布otool -l WebServerTest.dylib | fgrep -A5 LC_LOAD_DYLIB的输出吗?
  • 是的,可能是链接器找不到 GCDWebServers 框架。 WebServerTest.dylib 中 GCDWebServers 的 LC_LOAD_DYLIB 命令将显示链接器正在查看的路径。
  • @Siguza 老朋友你在堆栈溢出?!伟大的。我已经发布了关于框架的 otool 输出,它使用的是 rpath。那么在这种情况下,我该如何将框架捆绑到 Tweak dylib 中?
  • @creker 在问题中发表,谢谢
  • 所以似乎使用@rpath,我可以理解,但是我可以将框架嵌入到tweak.dylib中,以便它可以自动加载吗?请给出答案,以便我可以接受给予学分

标签: ios jailbreak theos


【解决方案1】:

无论您将GCDWebServers.framework 放在哪里,dyld 都不会在哪里寻找它。有几种方法可以解决此问题。

您可以修补 GCDWebServersLC_ID_DYLIB 命令以包含绝对路径 - 您可能希望看到 man install_name_tool

或者您可以在您的LDFLAGS 中添加一些-rpath 标志。具体来说,如果您的GCDWebServers 位于/mypath/GCDWebServers.framework/GCDWebServers,您需要添加:

-rpath /mypath/

或者,如果你想在你的dylib旁边有GCDWebServers.framework,不管绝对路径,你应该可以使用:

-rpath @loader_path/

有关详细信息,请参阅man dyldman ld

【讨论】:

  • 如何让theos将框架嵌入到tweak dylib中?
  • 这不会以任何合理的方式工作。 dylib 不是文件夹,编译后的框架也不再是可以静态链接的东西。
  • 啊,我明白了。所以如果我能得到源代码,要么构建一个静态库(xxx.a)来嵌入,对吗?
  • 是的。
  • 确认WebServerTest_LDFLAGS += -rpath @loader_path/ 工作正常,将框架复制到@loader_path/ 后,调整已加载!看起来加载失败会导致调整根本不加载。
猜你喜欢
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多