Bytecode ELF
El programa compilado en sí — un objeto compartido ELF estándar cuya cabecera de 64 bytes lo identifica como un binario eBPF little-endian, seguido de los segmentos de código y datos del programa.
Ejemplo: Token Program ELF
(en caché; se actualiza cada hora · solo mainnet)
Ejemplo no disponible temporalmente
No pudimos obtener el ejemplo en caché desde mainnet en este momento. La vista hex completa lo intentará en vivo.
Prueba el visualizadorQué es
El código real de un programa de Solana es un ELF (Executable and Linkable Format) estándar — el mismo contenedor que usa Linux — compilado al conjunto de instrucciones eBPF (SBF, la variante de Solana). Ya esté almacenado en una cuenta ProgramData (actualizable) o directamente en la dirección del programa (loader heredado), los bytes empiezan con la cabecera ELF de 64 bytes.
Por qué existe
En lugar de inventar un formato binario a medida, Solana reutiliza ELF — el herramental maduro (linkers, readelf, objdump) funciona de inmediato. Los validadores cargan el ELF, lo verifican y ejecutan (JIT o interpretado) sus instrucciones eBPF dentro de la SVM.
Diseño de bytes
La cabecera ELF de 64 bytes (64 bits, little-endian) empieza cada binario de programa:
| Offset | Tamaño | Campo | Tipo | Notas |
|---|---|---|---|---|
| 0 | 4 | EI_MAG |
bytes | Magic: 7F 45 4C 46 (\x7F E L F). |
| 4 | 1 | EI_CLASS |
u8 |
2 = ELFCLASS64 (64 bits). |
| 5 | 1 | EI_DATA |
u8 |
1 = little-endian. |
| 6 | 1 | EI_VERSION |
u8 |
1. |
| 7 | 9 | EI_OSABI + relleno |
bytes | OS/ABI y luego relleno hasta el offset 16. |
| 16 | 2 | e_type |
u16 |
3 = ET_DYN (objeto compartido). |
| 18 | 2 | e_machine |
u16 |
247 = eBPF. |
| 20 | 4 | e_version |
u32 |
1. |
| 24 | 8 | e_entry |
u64 |
Dirección virtual del punto de entrada. |
| 32 | 8 | e_phoff |
u64 |
Offset de la tabla de cabeceras de programa. |
| 40 | 8 | e_shoff |
u64 |
Offset de la tabla de cabeceras de sección. |
| 48 | 4 | e_flags |
u32 |
|
| 52 | 2 | e_ehsize |
u16 |
Tamaño de la cabecera ELF (64). |
| 54 | 10 | e_ph/sh entsize+num+shstrndx |
u16×5 |
Tamaños/recuentos de cabeceras de programa/sección, índice de tabla de cadenas. |
Tras la cabecera vienen las cabeceras de programa, las secciones de código/datos y las reubicaciones — el programa compilado.
Dónde lo encuentras
El contenido de una cuenta ProgramData (salta su cabecera de ~45 bytes para llegar al ELF), o los datos de un programa desplegado con el loader heredado no actualizable. El magic 7F 45 4C 46 es la pista delatora en un volcado hex.
Errores comunes
e_machine = 247es el marcador BPF. Así confirmas que un blob hex es un ELF de programa de Solana y no algún otro binario ELF.- En los programas actualizables, el ELF está desplazado. Una cuenta ProgramData prefija el ELF con su propia cabecera de estado de ~45 bytes. El magic
7F454C46aparece después de esa cabecera, no en el byte 0. - Es eBPF/SBF, no x86. Desensamblar requiere una herramienta que entienda eBPF; un objdump x86 estándar no le encontrará sentido a las instrucciones.
- Se verifica al cargar, no en cada llamada. El runtime verifica el ELF (sin instrucciones ilegales, saltos válidos) cuando el programa se despliega/actualiza, luego lo cachea — las llamadas no lo reverifican.
Fuentes
Ver también
Última verificación: 2026-05-20