为 ELF 二进制文件发布 CIPD 符号软件包

符号包用于在日志和 调试崩溃。包含 Fuchsia ELF 二进制文件的 CIPD 预构建软件包 需要一个配套的符号包,其中包含 二进制文件

关于符号软件包的要求

  • 原始 CIPD 软件包中的每个 ELF 二进制文件都必须包含 一个 ELF NT_GNU_BUILD_ID 备注部分,其中包括一个唯一的 build-id 哈希值,用于唯一标识与调试无关的内容。

    此备注是在生成 ELF 二进制文件时在链接时创建的。近期对话 或预构建的 Fuchsia Clang 工具链版本, 。不过,常规 Clang 要求传递一个特殊的链接器 标志(即 -Wl,--build-id)。

  • 符号软件包必须使用 .build-id 的典型目录布局 用于存储 单独文件中的调试信息

    也就是说,每个文件都必须存储为 <xx>/<xxxxxxxxxx>.debug, 其中 <xx><xxxxxxxxx> 是从 build-id 派生的十六进制字符串 哈希值。每个此类文件都应匹配 从原始软件包中移除了具有相同 build-id 的 ELF 二进制文件。

    此示例展示了 CIPD 符号软件包的目录结构,其中包含 未剥离的 ELF 二进制文件:

    1d/
      bca0bd1be33e19.debug
    1f/
      512abdcbe453ee.debug
      90dd45623deab1.debug
    2b/
      0e519bcf3942dd.debug
    3d/
      aca0b11beff127.debug
    5b/
      66bc85af2da641697328996cbc04d62b84fc58.debug
    
  • 符号包必须使用相同的 版本标识符 (标记)作为其引用的原始 CIPD 软件包。这样,他们就可以 可以汇总到一起

  • 如果几个包含剥离的 ELF 二进制文件的 CIPD 软件包滚动 (使用相同的版本标识符),然后将调试 可以在单个 CIPD 符号包中包含所有这些符号。 但不是必需的。

  • 符号软件包的 CIPD 路径需要使用 以下后缀:

    -debug-symbols-<ARCH>
    

    例如: myproject/fuchsia/mypackage-debug-symbols-amd64 包含符号 (针对 myproject/fuchsia/mypackage-amd64 预构建软件包)。

  • 所有符号文件包的 Jiri 结账路径必须为 ${FUCHSIA_DIR}/prebuilt/.build-id

生成符号软件包

如需生成符号软件包,您需要执行以下操作:

  • 使用 DWARF 调试信息编译所有 ELF 二进制文件(例如, 将 -g 标志传递给编译器(即使在发布模式下)。

  • 为 ELF 二进制文件生成 NT_GNU_BUILD_ID 备注。

    这是最新 GCC 版本和 Fuchsia 预构建版本中的默认设置。 Clang 工具链,但常规 Clang 需要传递特殊标记 (-Wl,--build-id) 传递给链接器。

您可以生成被剥离的二进制文件, build-id 目录中包含对 llvm-objcopy 的单次调用,如 示例:

# Copy out/libfoo.so to symbols/<xx>/<xxxxxxx>.debug according to its
# `build-id` value (requires the library to be linked with -Wl,--build-id when
# using Clang), and also copy the stripped version of the library to
# stripped/libfoo.so
#
# NOTE: To strip executables, instead of libraries, replace --strip-all below
#       with --strip-sections
#
UNSTRIPPED_LIB=out/libfoo.so
STRIPPED_LIB=stripped/libfoo.so
SYMBOLS_DIR=./symbols

llvm-objcopy --strip-all \
    --build-id-link-dir="${SYMBOLS_DIR}" \
    --build-id-link-input=.debug \
    "${UNSTRIPPED_LIB}" "${STRIPPED_LIB}"

根据需要重复此操作以填充 symbols/ 目录, 然后,上传其内容(symbols/ 下的文件)作为您的符号文件包。

别忘了将 stripped/ 目录的内容复制到您的 预构建的 CIPD 软件包。