====== lbfdump — LBF-Binaries untersuchen ====== ''lbfdump'' ist das, was ''objdump'' für ELF ist: ein Inspektor für **LBF**-Dateien. Es erkennt das Format am Magic und liest beide Ausprägungen, die der Compiler erzeugt: ^ Magic ^ Format ^ Erzeugt mit ^ Inhalt ^ | ''LYX!'' (4C 59 58 21) | **Native Genesis** | ''lyxc --target=lyxos'' | Blockbasiertes Maschinencode-Programm | | ''LBF\0'' (4C 42 46 00) | **IR-Bytecode** | ''lyxc --target=lyxos --emit=lbf'' | Kompakter IR: Header, String-Pool, Funktionen, 20-Byte-Instruktionen | Das Werkzeug ist selbst in Lyx geschrieben und übersetzt zu einem nativen Linux-ELF — es läuft also auf dem Entwicklungsrechner, ohne LyxOS. Seine Layout-Konstanten **importiert es aus dem Compiler** (''src/std/lyxos/lbf_layout.lyx''), kann also nicht vom tatsächlichen Dateiformat abdriften. → [[lyx_-_programmiersprache:tools|Tools & Compiler]] · [[lyx_-_programmiersprache:tools:compiler-parameter|Compiler-Parameter]] · [[lyxos:lbf|LBF-Format]] · [[lyxos:start|LyxOS]] ---- ===== Optionen ===== lbfdump [Optionen] ^ Kurz ^ Lang ^ Wirkung ^ | ''-f'' | ''%%--%%file-headers'' | Header bzw. Genesis-Block ausgeben | | ''-h'' | ''%%--%%section-headers'' | Sektionen ausgeben | | ''-p'' | ''%%--%%private'' | TLV-Pool — nur ''LYX!'': Capabilities, Intent, Section-Map | | ''-t'' | ''%%--%%syms'' | Symbol-/Funktionstabelle — nur ''LBF\0'' | | ''-s'' | ''%%--%%full-contents'' | Hex-Dump von Code bzw. Block-Nutzlast | | ''-d'' | ''%%--%%disassemble'' | Disassembly (''LBF\0''; siehe Kasten) | | ''-x'' | ''%%--%%all-headers'' | ''LYX!'': ''-f -p -h'' · ''LBF\0'': ''-f -h -t'' | | ''-H'' | ''%%--%%help'' | Hilfe | ---- ===== Native Genesis (LYX!) untersuchen ===== $ lyxc add.lyx --target=lyxos -o add.lbf $ lbfdump -x add.lbf === LBF Genesis (LYX! native) === Magic: LYX! (4C 59 58 21) Target arch: x86-64 Entry point: 0x0000000000400000 File size: 8192 bytes (2 blocks) File CRC32C: 0xb3318131 (stored) Stack size: 131072 bytes Compiler: lyxc === TLV Pool === [0x05] Capabilities: 0x0000000000000000 (none) [0x08] Lifecycle: kind=0x00 [0x09] Section Map: .text start=1 count=1 (R/X) [0x09] Section Map: .rodata start=1 count=1 (R) === Sections (block inventory) === .text 1 block(s) R/X .rodata 1 block(s) R .data 0 block(s) R/W .bss 0 block(s) R/W Blocks: 2 total (incl. Genesis) Der **TLV-Pool** ist der interessante Teil: Dort steht, was das Programm über sich selbst mitteilt. Die Einträge sind ''tag u8 + len u16 + value''; bekannt sind ''1'' Human-Intent, ''2'' Dep-Hash-Graph, ''3'' Symbol-Interface, ''4'' ISA-Extensions, ''5'' Capabilities, ''6'' Source-Map, ''7'' Build-Manifest, ''8'' Lifecycle, ''9'' Section-Map. Die Zeile ''Capabilities'' ist der schnellste Weg zu prüfen, welche Rechte ein fertiges Binary tatsächlich verlangt — unabhängig davon, was im Quelltext steht (→ [[lyx_-_programmiersprache:sprache:capabilities|Capabilities]]). Jeder Block ist 4096 Byte groß: 64 Byte Kopf, 4032 Byte Nutzlast. Block 0 trägt die Genesis-Nutzlast ab Dateioffset 64. ---- ===== IR-Bytecode (LBF\0) untersuchen ===== $ lyxc add.lyx --target=lyxos --emit=lbf -o add_ir.lbf $ lbfdump -f -t add_ir.lbf === LBF File Header (LBF\0 IR) === Magic: LBF\0 (4C 42 46 00) Version: 1 Entry index: 1 Functions: 2 Code offset: 0x00000079 Instructions: 16 File size: 441 bytes === Symbols (functions) === Idx Name 0 Add 1 main Aufbau: ''Header (64 B) + String-Pool + Funktionstabelle (24 B je Eintrag) + Instruktionen (20 B je Stück)''. Eine Instruktion ist ''opcode u16 · dest u16 · a u32 · b u32 · imm i64'', wobei ''dest = 0xFFFF'' „kein Ziel" und ''a''/''b = 0xFFFFFFFF'' „unbenutzt" heißt. ==== Disassembly ==== $ lbfdump -d add_ir.lbf === Disassembly: Add === 0: LOAD_LOCAL r3 a=0 imm=0 1: LOAD_LOCAL r4 a=1 imm=0 2: ADD r5 a=3 b=4 imm=0 3: STORE_LOCAL r2 a=5 imm=0 4: JMP imm=0 > **Zwei Voraussetzungen für ''-d'':** > > * Die Tabellen ''lbf_opcodes.tsv'' und ''lbf_builtins.tsv'' werden im **aktuellen Verzeichnis** gesucht, nicht neben dem Programm. Ohne sie erscheinen statt der Namen nur Zahlen — die beiden Dateien liegen im ''lbfdump''-Quellverzeichnis und gehören ins Arbeitsverzeichnis kopiert. > * Für ein ''LYX!''-Binary geht ''-d'' **nicht**: Dort steht Maschinencode, dessen Disassembly Capstone braucht. ''lbfdump'' meldet das und verweist auf ''-s'' für den Hex-Dump. ---- ===== Bauen ===== lyxc lbfdump.lyx -I /home/andreas/PhpstormProjects/aurum --target=linux -o lbfdump Die Ausgabe wird gegen den kanonischen Referenz-Dumper ''src/tools/lbf/dumper.lyx'' des Compilers gegengeprüft. ---- Geprüft mit lbfdump 1.1 und lyxc 1.0.15G. Letzte Aktualisierung: 2026-08-11