objcopy和dsymutil有什么区别?

Abh*_*ain 6 gcc gdb clang debug-symbols lldb

这两个命令是否在Linux上:

objcopy --only-keep-debug foo foo.dbg
objcopy --add-gnu-debuglink=foo.dbg foo
Run Code Online (Sandbox Code Playgroud)

相当于下面的mac

dsymutil <binary> -o <binary>.dSYM
Run Code Online (Sandbox Code Playgroud)

在某种意义上相当于

  1. 它创建一个独立的调试信息文件.
  2. 它在可执行文件和调试信息文件之间创建了一个链接.

然后剥离

是linux上的命令:

objcopy --strip-debug foo
Run Code Online (Sandbox Code Playgroud)

要么

strip -g <binary>
Run Code Online (Sandbox Code Playgroud)

相当于下面的mac

strip -S <binary>
Run Code Online (Sandbox Code Playgroud)

Jim*_*ham 6

--only-keep-debugobjcopy的部分在功能上与 dsymutil 相同。

没有任何工具可以记录 dSYM 中的二进制位置。相反,dSYM 和二进制文件共享一个通用 UUID,想要查找符号文件的客户端使用 DebugSymbols 框架,该框架使用各种技巧(例如 Spotlight 导入器、搜索路径、“dSYM 查找外部脚本”等)来查找符号文件单独的调试文件。所以不需要等效于--add-gnu-debuglink.

mac 版本strip -S确实以与 binutils 版本相同的方式去除调试信息。不同之处在于,strip -S在 OS X 上实际上不会大幅减少二进制文件的大小。在 OS X 上,调试信息始终保留在可执行文件之外 - 驻留在 .o 文件或 dSYM 中。可执行文件只有一个小的“调试映射”,它告诉 lldb 或 dsymutil 如何从 .o 文件链接矮人。strip -S只需要删除调试映射。