Early engine prototypes resolved Extern(Library:…) via dlopen/dlsym. That complicates reproducible AOT artifacts and blurs security review of loaded code.
FAQ and troubleshooting
Platform spec article
FAQ and troubleshooting
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).
Should new packages use extern_dlopen?
Section titled “Should new packages use extern_dlopen?”No for production Standard flows—use link-time linking. extern_dlopen remains documented for legacy engine tests and Proposed dynamic profiles.
Why do externs fail on macOS CI?
Section titled “Why do externs fail on macOS CI?”Dynamic resolution tests target Linux x86_64. macOS agents should skip or use link-time externs; dlopen policy is not portable in the legacy feature.
What is the difference between interop_dispatch_* and user Extern?
Section titled “What is the difference between interop_dispatch_* and user Extern?”User Extern calls native library functions directly (C ABI). interop_dispatch_* interprets Beskid-owned tagged values at the language/runtime boundary; both are declared via BUILTIN_SPECS but serve different layers.
Can externs call Beskid builtins?
Section titled “Can externs call Beskid builtins?”No. Extern targets must be foreign symbols; calling alloc or panic through dlsym would bypass type descriptors and GC scope rules.
Troubleshooting
Section titled “Troubleshooting”| Symptom | Check |
|---|---|
| ”extern present but feature disabled” | Enable extern_dlopen on engine or switch to link-time profile |
| Invalid signature at JIT | Parameter uses Beskid struct/string type—fix contract to scalars/pointers |
dlsym undefined symbol | Typo in symbol string; verify with nm -D on the .so |
| Dispatch returns garbage | ABI/layout drift—compare interop_layout.rs with ABI versioning |