blob: 8cf93c096b238736a9baf3ca6f512c0446ee3527 [file] [log] [blame] [view]
# ELF Runner (Components v2)
<<../_v2_banner.md>>
The ELF runner is the runner responsible for launching
[components][glossary-components] based on standard executable files (ELF
format).
A capability to the ELF runner service is offered to the root component under
the name `elf`. For other components to use the ELF runner, the capability must
be explicitly [routed][capability-routing] to them.
For a detailed explanation of how processes are created, please see
[`//docs/concepts/booting/program_loading.md`][program-loading].
## Using the ELF Runner
To use the ELF runner, the component must add a `program` block, containing:
- the binary
- the runner the program uses (unless that is already included via a [CML shard][cml-shards])
- (optionally) program arguments that should be used.
The ELF runner receives instructions from the `program` section of the
[component manifest][glossary-component-manifests]. The `binary` field holds the
path to an executable file in the package the manifest comes from, and the
`args` field holds any additional string arguments that should be provided to
the process when it is created.
The `main_process_critical` field may be used to mark the component's first
process as [critical to component manager's job][job-set-critical], which will
cause component manager (and all components) to be terminated if the process
exits with a non-zero code. An allowlist is used to control which components may
use this field.
This is an example manifest that launches `bin/echo` with the arguments `Hello`
and `world!`. It assumes that the ELF runner capability has been offered to the
component under the name `elf`:
```cml
{
program: {
runner: "elf",
binary: "bin/echo",
args: [ "Hello", "world!" ],
}
}
```
### Lifecycle
Components have a [lifecycle][lifecycle]. Components run by the ELF runner can
integrate with the lifecycle if you add a `lifecycle` attribute to your component
manifest. Currently `stop` is the only method in the Lifecycle protocol.
```cml
{
program: {
runner: "elf",
binary: "bin/echo",
lifecycle: { stop_event: "notify" },
}
}
```
The program should take the handle to the Lifecycle channel and serve the
[Lifecycle protocol][lc-proto] on that channel. The component should exit after
receiving and processing the `stop` call. For an example see this
[sample code][lc-example].
The ELF Runner monitors the process it started for the program binary of the
component. If this process exits, the ELF runner will terminate the component's
execution context, which includes the component's job and all subprocesses.
[use]: /docs/glossary.md#use
[capability-routing]: component_manifests.md#capability-routing
[cml-shards]: component_manifests.md#include
[glossary-components]: /docs/glossary.md#component
[lc-example]: /examples/components/basic/src/lifecycle_full.rs
[lc-proto]: /sdk/fidl/fuchsia.process.lifecycle/lifecycle.fidl
[lifecycle]: lifecycle.md
[program-loading]: /docs/concepts/booting/program_loading.md
[job-set-critical]: /docs/reference/syscalls/job_set_critical.md
<!-- TODO: the component manifest link describes v1 manifests -->
[glossary-component-manifests]: /docs/glossary.md#component-manifest