Early engine prototypes resolved Extern(Library:…) via dlopen/dlsym. That complicates reproducible AOT artifacts and blurs security review of loaded code.
Examples
Platform spec article
Examples
Spec standingStandard
-
User foreign libraries resolve at link time; dlopen remains legacy.
Context
Decision
Track Status Link-time Standard for v0.3 — addresses fixed before execution via C ABI profile Dynamic extern_dlopenProposed / legacy — engine feature only; not required for reference CLI Validation High-level Beskid types in extern signatures must be rejected before codegen Syscalls User externs must not embed OS syscall sequences — see Panic, IO, and syscalls Consequences
New platform work documents link-time flows first. Dynamic resolution stays gated behind
extern_dlopeninbeskid_engine.Verification anchors
compiler/crates/beskid_analysisextern validation;beskid_enginelink paths. -
Compiler thunks call stable dispatch entrypoints for language/runtime interop layouts.
Context
Tagged interop values need runtime-known layout offsets. Per-site custom trampolines would fork ABI stability.
Decision
Builtin family Role interop_dispatch_unitUnit-tagged dispatch interop_dispatch_ptrPointer payloads interop_dispatch_usizeScalar bridge Layout stability Offsets are versioned with ABI versioning Implementation beskid_runtime::interopexports registered inBUILTIN_SPECSLowering must route approved tagged calls through these builtins rather than ad-hoc host calls.
Consequences
Interop layout changes require ABI bump or additive symbol policy per D-EXEC-ABI-0002.
Verification anchors
compiler/crates/beskid_runtime/src/interop/; interop lowering tests.
- Contracts and edge cases MUST rules for extern validation, dynamic linking policy, and interop dispatch layout.
- Design model Extern resolution layers, runtime dispatch builtins, and host policy boundaries.
- Examples Declaring Extern contracts, dynamic getpid smoke, and interop dispatch usage patterns.
- FAQ and troubleshooting Extern linking failures, dlopen policy, and interop dispatch debugging.
- Flow and algorithm Extern validation, link registration, optional dlopen resolution, and interop dispatch calls.
- Verification and traceability Engine extern tests, analysis diagnostics, and interop layout traceability.
0 revisions (git unavailable at build; counts may be empty)
No commits recorded for this path.
| Section id | Required | Found |
|---|---|---|
what-this-feature-specifies | yes | yes |
implementation-anchors | yes | yes |
Full tree: run pnpm verify:platform-spec-layout (writes src/generated/platform-spec-layout-report.json).
C extern contract (dynamic profile)
Section titled “C extern contract (dynamic profile)”Legacy engine-assisted linking declares prototypes on a contract:
[Extern(Abi:"C", Library:"libc.so.6")]pub contract LibC { i64 getpid();}With extern_dlopen enabled on Linux x86_64, the engine resolves getpid once and registers the address for JIT imports. With the feature disabled, compilation fails unless the symbol is satisfied by link-time layout instead.
Link-time preferred shape
Section titled “Link-time preferred shape”New work should attach libraries through the platform link-time linking profile so AOT and production JIT bundles do not depend on dlopen at first run.
Failure scenario (feature off)
Section titled “Failure scenario (feature off)”A module references LibC.getpid() but the workspace builds beskid_engine without extern_dlopen. Expected outcome: diagnostic listing getpid / libc.so.6 rather than a link to address 0.
Interop dispatch (conceptual)
Section titled “Interop dispatch (conceptual)”Lowering for a typed interop return may emit:
- Load tag word at header +8.
call interop_dispatch_ptr(handle)when the result is a pointer-width value.- Branch on runtime-known variant; invalid tags trap or panic per interop policy.
Exact variant tables live in Interop.Contracts; offsets are pinned by ABI versioning.
Test commands (maintainers)
Section titled “Test commands (maintainers)”Legacy harness references:
cargo test -p beskid_engine extern_resolution_only_compiles_with_feature --features extern_dlopencargo test -p beskid_engine extern_real_call_getpid --features extern_dlopencargo test -p beskid_engine extern_resolution_fails_without_feature