符號套件的用途是在記錄檔和 偵錯當機問題。含有 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 套件