objcopy 和 dsymutil 有什么区别?

What is difference between objcopy and dsymutil?

这两个命令是在linux:

objcopy --only-keep-debug foo foo.dbg
objcopy --add-gnu-debuglink=foo.dbg foo

相当于下面 mac

dsymutil <binary> -o <binary>.dSYM

在某种意义上等价,

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

然后进行剥离

是linux上的命令:

objcopy --strip-debug foo

strip -g <binary>

相当于下面 mac

strip -S <binary>

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

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

strip -S 的 mac 版本确实以与 binutils 版本相同的方式去除调试信息。区别在于 OS X 上的 strip -S 实际上不会减少二进制文件的大小。在 OS X 上,调试信息始终保留在可执行文件之外 - 驻留在 .o 文件或 dSYM 中。可执行文件只有一个小的 "debug map" 告诉 lldb 或 dsymutil 如何 link 来自 .o 文件的矮人。 strip -S只需要删除调试图即可。