Gcc objcopy和dsymutil之间有什么区别?

Gcc objcopy和dsymutil之间有什么区别?,gcc,gdb,clang,lldb,debug-symbols,Gcc,Gdb,Clang,Lldb,Debug Symbols,linux上有以下两个命令: objcopy --only-keep-debug foo foo.dbg objcopy --add-gnu-debuglink=foo.dbg foo objcopy --strip-debug foo 相当于mac上的以下内容 dsymutil <binary> -o <binary>.dSYM strip -S <binary> 或 strip-g 相当于mac上的以下内容 dsymutil <binary

linux上有以下两个命令:

objcopy --only-keep-debug foo foo.dbg
objcopy --add-gnu-debuglink=foo.dbg foo
objcopy --strip-debug foo
相当于mac上的以下内容

dsymutil <binary> -o <binary>.dSYM
strip -S <binary>

strip-g
相当于mac上的以下内容

dsymutil <binary> -o <binary>.dSYM
strip -S <binary>
strip-S
对象副本的
部分只保留调试功能,其功能与dsymutil相同

没有任何工具记录dSYM中的二进制位置。相反,dSYM&二进制文件共享一个公共UUID,希望查找符号文件的客户端使用DebugSymbols框架,该框架使用各种技巧(例如聚光灯导入器、搜索路径、“dSYM查找外部脚本”等)查找单独的调试文件。因此,不需要一个等价于
——addgnudebuglink


strip-S
的mac版本以与binutils版本相同的方式执行strip调试信息。不同之处在于OSX上的
strip-S
实际上不会减少二进制文件的大小。在OSX上,调试信息总是被排除在可执行文件之外-驻留在.o文件或dSYM中。可执行文件只有一个小的“调试映射”,告诉lldb或dsymutil如何从.o文件链接dwarf<代码>条带-S
只需删除调试映射。

1。在MacOSX上,dSYM和二进制文件之间的链接是如何发生的?2.这是否意味着.o文件也需要传递给dsymutil?否,dsymutil从可执行文件中读取“调试映射”,其中列出了所有.o文件的位置。这意味着您必须将.o文件放在其原始位置,而不是剥离要在其上运行dsymutil的二进制文件。这似乎是一个可以接受的折衷方案,因为不必考虑在哪些.o文件上运行dsymutil……我想我刚才回答了#2。至于#1。简而言之,“通过在二进制文件上运行dsymutil”。由于二进制文件知道.o文件的位置(从调试映射中),因此您只需要向dsymutil提供二进制文件的路径,它将完成其他所有操作。如果您想了解dsymutil如何工作的详细信息,请注意,在Xcode 7.0中,我们从dsymutil的内部版本切换到在llvm源代码库中实现的版本。因此,您可以阅读llvm/tools/dsymutil中的源代码,以获得完整的故事。我构建了一个二进制文件,然后创建了独立符号dSYM,然后从二进制文件中剥离了映射。然后我运行二进制文件,它崩溃了,内核被丢弃了。现在,在使用target create分析lldb中的核心时——core-core/path-binary/path。由于dSYM紧挨着二进制,lldb能够拾取符号。但当我把dSYM移到别的地方时,1。它不能向我显示任何源代码,只能显示函数名,函数名信息从何而来。如果我把dSYM放在binary旁边,并使用lldb进行核心分析,那么现在它也不会从dSYM中提取符号。GetNumCompileUnits返回0或图像列表显示dSYM。可能是什么问题?我还在targetcreate中使用了--symfile,但这也没有帮助。