From 4df4e9c14eb1019a8c2299c48b15420ee7f20855 Mon Sep 17 00:00:00 2001 From: William Findlay Date: Sun, 24 Oct 2021 15:56:00 -0400 Subject: [PATCH] aya: introduce include_bytes_aligned!() macro This is a helper macro that can be used to include bytes at compile-time that can then be used in Bpf::load(). Unlike std's include_bytes!(), this macro also ensures that the resulting byte array is correctly aligned so that it can be parsed as an ELF binary. Signed-off-by: William Findlay --- aya/src/util.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/aya/src/util.rs b/aya/src/util.rs index a3bb2aa2..0586531b 100644 --- a/aya/src/util.rs +++ b/aya/src/util.rs @@ -106,6 +106,40 @@ pub(crate) fn tc_handler_make(major: u32, minor: u32) -> u32 { (major & TC_H_MAJ_MASK) | (minor & TC_H_MIN_MASK) } +/// Include bytes from a file for use in a subsequent [`crate::Bpf::load`]. +/// +/// This macro differs from the standard `include_bytes!` macro since it also ensures that +/// the bytes are correctly aligned to be parsed as an ELF binary. This avoid some nasty +/// compilation errors when the resulting byte array is not the correct alignment. +/// +/// # Examples +/// ```ignore +/// use aya::{Bpf, include_bytes_aligned}; +/// +/// let mut bpf = Bpf::load(include_bytes_aligned!( +/// "/path/to/bpf.o" +/// ))?; +/// +/// # Ok::<(), aya::BpfError>(()) +/// ``` +#[macro_export] +macro_rules! include_bytes_aligned { + ($path:literal) => {{ + #[repr(C)] + pub struct Aligned { + pub _align: [u32; 0], + pub bytes: Bytes, + } + + static ALIGNED: &Aligned<[u8]> = &Aligned { + _align: [], + bytes: *include_bytes!($path), + }; + + &ALIGNED.bytes + }}; +} + #[cfg(test)] mod tests { use super::*;