链接第 3 方框架时,theos tweak 未加载到应用程序中

theos tweak is not loaded into app when 3rd party framework is linked

我正在使用 theos link 我的测试调整中的第三个框架,除了日志之外什么都不做,似乎在 link 框架之后, 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...

但是,如果我启动 link 框架,WebServerTest.dylib 根本不会加载

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

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

env: 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,这样就可以自动加载了?

无论你把 GCDWebServers.framework 放在哪里,都不是 dyld 正在寻找它的地方。有几种方法可以解决此问题。

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

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

-rpath /mypath/

或者,如果你想让 GCDWebServers.framework 紧挨着你的 dylib,无论绝对路径如何,你应该能够使用:

-rpath @loader_path/

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