Android Toolchain 原始程式碼尋寶

很多人從事 Android 移植,但連 Android Toolchain 都自行維護者,相對就少多了。筆者過去有幸在「台灣心」計畫中,從事建構於台灣自主 CPU 的軟體開發,嘗試從零到有,將 Android 移植到 Andes NDS32 架構,就涉及到 Toolchain 的更動。而維護 0xdroid 與對應 0xlab 的 GNU Toolchain,不免會迷失於眾多的原始程式碼,只好靜下心慢慢探索,沒想到因此挖掘到頗多「寶物」,本文簡記備忘使用。

Google 工程師 Jing Yu 於 Jan 18, 2010 提交一份修改 "Bring gcc-4.4.0 to up-to-date",讓人摸不著頭緒,不過其對於 GCC 的 architecture 更動,追加了新項目,可參見檔案 gcc-4.4.0/gcc/config/linux-grtev1.h 。以下節錄開頭註解:

/* Definitions for Linux-based GRTE (Google RunTime Environment) version 1.
Copyright (C) 2009 Free Software Foundation, Inc.
Contributed by Chris Demetriou.

This file is part of GCC.
這個以 Linux 為基礎的 GRTE 到底是什麼呢?沒獲得解答,只好在其 gcc spec 檔中探索,以下是相關的描述:
/* When GRTE links statically, it needs its NSS and resolver libraries
linked in as well. Note that when linking statically, these are
enclosed in a group by LINK_GCC_C_SEQUENCE_SPEC. */
#undef LINUX_GRTE_EXTRA_SPECS
#define LINUX_GRTE_EXTRA_SPECS \
{ "libc", "%{static:%(libc_static);:-lc}" }, \
{ "libc_p", "%{static:%(libc_p_static);:-lc_p}" }, \
{ "libc_static", \
"-lc -lnss_borg -lnss_cache -lnss_dns -lnss_files -lresolv" }, \
{ "libc_p_static", \
"-lc_p -lnss_borg_p -lnss_cache_p -lnss_dns_p -lnss_files_p -lresolv_p" },
這裡的 libc 看來是獨立的 C Library 實做,比較有趣的是 libnss 的部份。libnss 可透過外部的 module 作擴充,比方說 libnss-ldap 就是 "NSS module for using LDAP as a naming service",而前述 gcc spec 提及當進行靜態編譯時,需要將所需的 module 一併連結,那麼,這系列 libnss_ 開頭的函式庫,顯然就是 GRTE (Google RunTime Environment) 所需的基礎建設。來看看有哪些特別的:
  • libnss_borg
  • libnss_cache
或許後者可從名稱猜出一些端倪,但這個 "libnss_borg" 實在是太詭異 (Borg in Star Trek?),跟 GRTE 一樣神秘,我們只好等待 Google 大神給我們一些驚喜。

另外,Android Benchmark Suite 2.0.0 已公開釋出,可參見 benchmark.git,值得一書的是,內建了 FDO (Feedback Directed Optimization) 的編譯、測試,與效能評估機制。


About this entry