gpt4 book ai didi

macos - DYLD_FORCE_FLAT_NAMESPACE=1 DYLD_INSERT_LIBRARIES=./foo/my.dylib ./bar/exec 返回 1 w/o 运行我的可执行文件

转载 作者:行者123 更新时间:2023-12-04 15:30:40 25 4
gpt4 key购买 nike

在 macOS 10.12.6 上,我有一个共享库和一个可执行文件(都是自己构建的,SIP 不应应用 AFAIK),我想为可执行文件预加载库。它失败,返回码为 1,否则无提示:

$ ./bar/exec
<does stuff>
$ DYLD_FORCE_FLAT_NAMESPACE=1 DYLD_INSERT_LIBRARIES=./foo/my.dylib ./bar/exec
<returns immediately>
$ echo $?
1
# 1 is not an explicitly returned value from ./bar/exec

如果我添加 DYLD_PRINT_LIBRARIESDYLD_PRINT_LIBRARIES_POST_LAUNCH man dyld 中记录的选项,它们都显示库和可执行文件都已成功加载:
...
dyld: loaded: /full/path/to/exec
dyld: loaded: ./foo/my.dylib
...

如果我尝试在 dtruss 或 lldb 中使用预加载运行可执行文件,它会运行,但不会预加载库。这可能是有道理的,因为这些工具受 SIP 保护。

我该如何调试?

更新

感谢@macmoonshine,我能够通过设置 LLDB 本身的预加载环境而不是 LLDB 来重现 lldb 下的返回代码 1 退出:
(lldb) env DYLD_FORCE_FLAT_NAMESPACE=1 DYLD_INSERT_LIBRARIES=./foo/my.dylib
(lldb) run
...
Process 24130 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
frame #0: 0x00007fffc8aac310 libsystem_kernel.dylib`__exit
...
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
* frame #0: 0x00007fffc8aac310 libsystem_kernel.dylib`__exit
frame #1: 0x000000010008ebac my.dylib`my_init at my.c:86 [opt]
frame #2: 0x0000000100018a1b dyld`ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) + 385
frame #3: 0x0000000100018c1e dyld`ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) + 40
frame #4: 0x00000001000144aa dyld`ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 338
frame #5: 0x0000000100013524 dyld`ImageLoader::processInitializers(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 138
frame #6: 0x00000001000135b9 dyld`ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) + 75
frame #7: 0x0000000100005434 dyld`dyld::initializeMainExecutable() + 125
frame #8: 0x00000001000098c6 dyld`dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**, unsigned long*) + 3966
frame #9: 0x0000000100004249 dyld`dyldbootstrap::start(macho_header const*, int, char const**, long, macho_header const*, unsigned long*) + 470
frame #10: 0x0000000100004036 dyld`_dyld_start + 54

这是调试的开始。

最佳答案

您可以在 lldb 中运行您的代码,您可以在其中使用 env 设置环境命令:

env DYLD_FORCE_FLAT_NAMESPACE=1
env DYLD_INSERT_LIBRARIES=./foo/my.dylib
run

lldb你可以运行你的程序直到它崩溃。如果存在异常用 exit() (或 _exit() ),您应该使用 b exit 设置符号断点和 b _exit .因此,您有机会获得失败的回溯。

关于macos - DYLD_FORCE_FLAT_NAMESPACE=1 DYLD_INSERT_LIBRARIES=./foo/my.dylib ./bar/exec 返回 1 w/o 运行我的可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45432512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com