Skip to content

Commit bab9e17

Browse files
committed
fix(ovsm): CRITICAL - Add 8-byte alignment for .rel.dyn section
ROOT CAUSE IDENTIFIED: The .rel.dyn section was at unaligned file offset 0x285, causing solana-rbpf's slice_from_bytes() to fail with InvalidAlignment when trying to cast raw bytes to &[Elf64Rel]. FIX: Add padding after .dynstr section to ensure .rel.dyn starts at an 8-byte aligned offset. The Rust memory safety checks require proper alignment for struct casting. This was the final blocker preventing SBPF V1 ELF deployment to Solana. Changes: - Line 353: Align reldyn_offset to 8 bytes: ((dynstr_offset + dynstr_size) + 7) & \!7 - Lines 486-490: Insert padding bytes between .dynstr and .rel.dyn sections Testing: Confirmed with solana_rbpf v0.8.5 source code analysis and debug logging.
1 parent 87070a8 commit bab9e17

File tree

1 file changed

+9
-2
lines changed
  • crates/ovsm/src/compiler

1 file changed

+9
-2
lines changed

crates/ovsm/src/compiler/elf.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,8 @@ impl ElfWriter {
349349
let dynstr_size = self.dynstr.len();
350350

351351
// .rel.dyn section (N relocations * 16 bytes)
352-
let reldyn_offset = dynstr_offset + dynstr_size;
352+
// CRITICAL: Must be 8-byte aligned for Elf64Rel casting
353+
let reldyn_offset = ((dynstr_offset + dynstr_size) + 7) & !7;
353354
let reldyn_entry_size = 16usize;
354355
let reldyn_size = reldyn_entry_size * syscalls.len();
355356

@@ -482,6 +483,12 @@ impl ElfWriter {
482483
// ==================== .dynstr Section ====================
483484
elf.extend_from_slice(&self.dynstr);
484485

486+
// Add padding to align .rel.dyn to 8 bytes (Elf64Rel requires 8-byte alignment)
487+
let padding_needed = reldyn_offset - (dynstr_offset + dynstr_size);
488+
for _ in 0..padding_needed {
489+
elf.push(0);
490+
}
491+
485492
// ==================== .rel.dyn Section ====================
486493
for sc in syscalls {
487494
let sym_idx = *seen_syscalls.get(&sc.name).unwrap();
@@ -621,7 +628,7 @@ mod tests {
621628
SbpfInstruction::exit(),
622629
];
623630

624-
let elf = writer.write(&program, false).unwrap();
631+
let elf = writer.write(&program, false, super::SbpfVersion::V1).unwrap();
625632
assert!(elf.len() > 64);
626633
validate_sbpf_elf(&elf).unwrap();
627634
}

0 commit comments

Comments
 (0)