Central Docs
Catálogo Inicio

Inserts binarios y parches finales

RIF puede colocar material binario alrededor de la fase del MIR externo. Los dos bloques son de nivel raíz y lineales; @end termina cualquiera de ellos.

@insert

@insert es un preámbulo. Sus payloads se agregan antes de iniciar el MIR, respetando el orden de declaración:

@insert:
.section "text"
.bytes "7f454c46"
.binary "01010101"
.file "elf64.template.bin"
.call #call[make_payload]
@end

.section selecciona la sección de los payloads siguientes. Si se omite, se usa .defaultsection. .bytes recibe bytes hexadecimales, .binary recibe bits, .file lee un archivo binario relativo al proyecto y .call pide un payload binario a funcs.py.

Los paquetes copian los archivos de .file dentro de entradas opacas en assets/ y registran sus hashes. Empaquetar nunca ejecuta un insert ni un payload Python; el asset se resuelve al compilar usando el .pack.

@before y .rplc

@before corre después de todas las líneas MIR y antes de devolver el binario final:

@before:
.rplc 24, 8, #:calc(4194304 + #:qlsize(0, "_start"))
.rplc 96, 8, #:qssize(0, "text")
.rplc 104, 8, #:calc(#:qvssize(0, "text") - 4194304)
@end

Los offsets y anchos opcionales están expresados en bytes. Si no se indica un ancho, se usa el ancho intrínseco del payload. Los parches no desplazan la imagen; todos se validan primero y se aplican de forma transaccional, por lo que un parche inválido no deja cambios parciales.

Las expresiones nativas son:

Expresión Resultado
#:query(offset, size) Copia un rango de bytes de la imagen final.
#:qssize(base, "section") Fin físico de una sección relativo a base.
#:qlsize(base, "label") Offset físico del label en el archivo.
#:qvsize(base, "label") Dirección virtual del label.
#:qvssize(base, "section") Fin virtual de una sección relativo a base.
#:calc(a + b) / #:calc(a - b) Suma o resta entera.

El layout físico usa el orden de .make section. .sectionalign alinea en bytes y .sectionvaddr permite fijar una base virtual. ::SIZE y ::VSIZE siguen siendo cursores locales de cada Rule; las queries nativas inspeccionan la imagen completa.

El ejemplo ELF64 usa una plantilla ELF, Rules normales para el código máquina y estas queries para construir un ejecutable Linux mínimo.