ELF 執行者

ELF 執行元件負責根據標準可執行檔 (ELF 格式) 啟動元件。這是內建的執行元件,適用於所有元件。

使用 ELF Runner

如要使用 ELF 執行元件,元件的資訊清單必須包含 program 區塊,其中包含:

{
    program: {
        runner: "elf",
        binary: "bin/foo",
    }
}

  • runner 欄位,值設為字串 elf
  • binary 欄位,值設為元件套件中的二進位輸出名稱。

欄位

此外,ELF 執行元件接受一組選用欄位,用於設定 ELF 元件的執行階段環境。

引數

引數 (也就是大多數程式設計語言中的 argv) 可以使用 args 欄位傳遞至元件的程序。這個欄位接受字串向量 (請參閱下方範例)。系統會按照資訊清單中宣告的順序傳遞引數集。

{
    program: {
        runner: "elf",
        binary: "bin/foo",
        args: ["--verbose", "--debug"]
    }
}

轉送 stdout 和 stderr 串流

ELF 元件的 stdout 和 stderr 串流可以轉送至 LogSink 服務。根據預設,只有在元件可使用 LogSink 時,ELF 執行元件才會轉送這些串流。如果元件會將診斷訊息列印到任一資料流,您應將資料流轉送至 LogSink 服務

如要啟用這項功能,請在資訊清單檔案中加入下列內容:

{
    include: [ "syslog/client.shard.cml" ],
}

納入這個分片後,所有寫入 stdout 的內容都會記錄為 INFO 訊息, 所有寫入 stderr 的內容都會記錄為 WARN 訊息。訊息會依換行符號分割,並解碼為 UTF-8 字串。無效的位元組序列會轉換為 U+FFFD 替換字元,通常看起來像

無論是否包含系統記錄分片,都可以使用明確的標記停用這項功能:

    program: {
        runner: "elf",
        binary: "bin/foo",
        forward_stdout_to: "none",
        forward_stderr_to: "none",
    }

生命週期

元件有生命週期。如果您在元件資訊清單中加入 lifecycle 屬性,ELF 執行元件執行的元件就能與生命週期整合。目前 Lifecycle 通訊協定中只有 stop 這個方法。

{
    program: {
        runner: "elf",
        binary: "bin/foo",
        lifecycle: { stop_event: "notify" },
    }
}

程式應取得生命週期管道的控制代碼,並在該管道上提供 Lifecycle 通訊協定。元件應在收到並處理 stop 呼叫後結束。

ELF Runner 會監控為元件程式二進位檔啟動的程序。如果這個程序結束,ELF 執行元件會終止元件的執行環境,包括元件的工作和所有子程序。

安全性

有幾個特殊權限欄位受到允許清單限制。只有這份許可清單中的元件可以使用這些欄位。對於所有欄位,這項政策適用於元件中的第一個程序。第一個程序是由 ELF 執行元件為 program 區塊中宣告的二進位檔建立。所有欄位都是布林值,預設為 false

主要程序重大問題

main_process_critical 欄位可用於將元件的第一個程序標示為「對元件管理員的工作至關重要」,如果程序以非零代碼結束,元件管理員 (和所有元件) 就會終止。系統會強制重新啟動。

Ambient VMO Exec

ambient_mark_vmo_exec 欄位可用於允許元件的第一個程序使用 zx_vmo_replace_as_executable,並以 ZX_HANDLE_INVALID 做為第二個引數,而非以 ZX_RSRC_SYSTEM_VMEX_BASE 為底的有效 ZX_RSRC_KIND_SYSTEM

建立原始程序

job_policy_create_raw_processes 欄位可用於允許元件使用 zx_process_create 建立程序。

{
    program: {
        runner: "elf",
        binary: "bin/foo",
        job_policy_create_raw_processes: "true"
    }
}

是否為共用程序

呼叫 zx_process_create 時,is_shared_process 欄位可用來傳遞 ZX_PROCESS_SHARED 旗標。只有在元件也將 job_policy_create_raw_processes 設為 true 時,才能使用這個旗標。

{
    program: {
        runner: "elf",
        binary: "bin/foo",
        job_policy_create_raw_processes: "true",
        is_shared_process: "true"
    }
}

有可用例外狀況管道的工作

job_with_available_exception_channel 欄位可用於確保元件是做為工作的直接後代建立,而該工作會有例外狀況管道可供使用。

{
    program: {
        runner: "elf",
        binary: "bin/foo",
        job_with_available_exception_channel: "true"
    }
}

不良帳號代碼政策

job_policy_bad_handles 欄位會設定工作的錯誤控制代碼政策。支援的值為 deny_exceptionallow_exception,分別對應至 https://fuchsia.dev/reference/syscalls/job_set_policy#zx_job_pol_basic_v2_and_v1 中記錄的 ZX_POL_ACTION_DENY_EXCEPTIONZX_POL_ALLOW_EXCEPTION 動作。

{
    program: {
        runner: "elf",
        binary: "bin/foo",
        job_policy_bad_handles: "deny_exception"
    }
}

環境變數

您可以使用 environ 屬性,為 ELF 元件設定環境變數。這個欄位必須是字串向量,每個字串都包含以等號分隔的變數和值。舉例來說,下列程式碼範例會將變數 FAVORITE_ANIMALFAVORITE_COLOR 宣告為 catred

{
    program: {
        runner: "elf",
        binary: "bin/echo",
        environ: [
            "FAVORITE_ANIMAL=cat",
            "FAVORITE_COLOR=red",
        ]
    }
}

其他資訊

如要詳細瞭解程序的建立方式,請參閱「Zircon program loading and dynamic linking」。