符号包用于在日志和 调试崩溃。包含 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 软件包。