链接第 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 正在寻找它的地方。有几种方法可以解决此问题。
您可以修补 GCDWebServers
的 LC_ID_DYLIB
命令以包含绝对路径 - 您可能希望为此查看 man install_name_tool
。
或者您可以在 LDFLAGS
中添加一些 -rpath
标记。具体来说,如果您的 GCDWebServers
位于 /mypath/GCDWebServers.framework/GCDWebServers
,您将添加:
-rpath /mypath/
或者,如果你想让 GCDWebServers.framework
紧挨着你的 dylib,无论绝对路径如何,你应该能够使用:
-rpath @loader_path/
有关详细信息,请参阅 man dyld
和 man ld
。
我正在使用 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 正在寻找它的地方。有几种方法可以解决此问题。
您可以修补 GCDWebServers
的 LC_ID_DYLIB
命令以包含绝对路径 - 您可能希望为此查看 man install_name_tool
。
或者您可以在 LDFLAGS
中添加一些 -rpath
标记。具体来说,如果您的 GCDWebServers
位于 /mypath/GCDWebServers.framework/GCDWebServers
,您将添加:
-rpath /mypath/
或者,如果你想让 GCDWebServers.framework
紧挨着你的 dylib,无论绝对路径如何,你应该能够使用:
-rpath @loader_path/
有关详细信息,请参阅 man dyld
和 man ld
。