為 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 的十六進位字串 雜湊值 (未去除的二進位值)。每個這類檔案都應與一個字詞相符 經過移除的 ELF 二進位檔,與原始套件具有相同的 build-id

    這個範例顯示 CIPD 符號套件的目錄結構 未移除的 ELF 二進位檔:

    1d/
      bca0bd1be33e19.debug
    1f/
      512abdcbe453ee.debug
      90dd45623deab1.debug
    2b/
      0e519bcf3942dd.debug
    3d/
      aca0b11beff127.debug
    5b/
      66bc85af2da641697328996cbc04d62b84fc58.debug
    
  • 符號套件必須使用相同的 版本 ID (標記) 當做原始 CIPD 套件。這讓他們

  • 如果數個包含簡化 ELF 二進位檔的 CIPD 套件遭到擲回 並使用相同的版本 ID,再將偵錯分組 單一 CIPD 符號套件中 全都可以使用符號 但並非必要

  • 符號套件的 CIPD 路徑必須使用 下列後置字串:

    -debug-symbols-<ARCH>
    

    例如: myproject/fuchsia/mypackage-debug-symbols-amd64 包含符號 適用於 myproject/fuchsia/mypackage-amd64 預建套件

  • 所有符號套件的 Jiri 結帳路徑必須 ${FUCHSIA_DIR}/prebuilt/.build-id

產生符號套件

如要產生符號套件,您需要:

  • 將所有 ELF 二進位檔編譯成 DWARF 偵錯資訊 (例如, 將 -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 套件