Skip to main content

rucc_object/
lib.rs

1//! ELF, Mach-O and COFF object writers.
2//!
3//! Design: `spec/11-asm-objects-debug.md`. Layer rank 8, see `spec/18-package-layout.md`.
4//!
5//! # Status
6//!
7//! ELF, which is what Linux and the freestanding targets want and what M3 needs. A text section,
8//! the symbols that say where each function in it is and how long it is, the names it wanted that
9//! are not in it, the relocations that ask a linker to find them, and the marker whose absence
10//! makes the stack executable. An object this writes links with the system linker and runs.
11//!
12//! The variables a file defines are written too: the section each one goes in, the symbol that
13//! says where it is and how long it is, the binding that says who can see it, and the relocations
14//! an image asks for when it holds the address of something. A tentative definition is asked of
15//! the linker rather than put in a section, which is the one case where a variable has a symbol
16//! and no bytes anywhere.
17//!
18//! What it is given is [`Text`] and [`Data`], which are here rather than beside the assembler that
19//! fills them in because they are what an object file is made of and because a writer cannot
20//! depend on the thing that produces its input without the layer graph going the wrong way round.
21//!
22//! Mach-O and COFF are not written yet. Both wait on the target that needs them.
23//!
24//! Every crate in the workspace is published, and publishing implies a promise. This one is
25//! tier 3: its Rust API is explicitly unstable and will change without a major version bump.
26//! Depend on the `rucc` binary's behaviour, not on this.
27
28#![doc(html_root_url = "https://docs.rs/rucc-object/0.3.10")]
29
30mod elf;
31mod section;
32
33pub use crate::elf::{Error, write};
34pub use crate::section::{Binding, Data, Extent, Object, Place, Reference, Reloc, Text};
35
36/// The milestone in `spec/17-milestones.md` that fills this crate in.
37pub const MILESTONE: &str = "M3";
38
39#[cfg(test)]
40mod tests {
41    #[test]
42    fn milestone_is_recorded() {
43        assert!(super::MILESTONE.starts_with('M'));
44    }
45}