Fact-checked by Grok 2 weeks ago

Executable and Linkable Format

The Executable and Linkable Format (ELF) is a standard for executables, relocatable object files, shared object libraries, and core dumps, primarily used on operating systems to define the structure and organization of for loading and linking. Developed in the early 1990s by Unix System Laboratories (a subsidiary of ) and as part of System V Release 4 (SVR4), ELF first appeared in 2.0 and has since become the de facto standard for many open-source and commercial Unix variants, including , BSD, and . Its design emphasizes flexibility, portability across architectures, and support for dynamic linking, replacing earlier formats like a.out and COFF to streamline software development and execution. At its core, an ELF file begins with a fixed ELF header that provides essential metadata, including the magic bytes (0x7F 'E' 'L' 'F'), the file's class (32-bit or 64-bit), data encoding (little-endian or big-endian), the target architecture (e.g., x86, ), and the file type (relocatable, , shared object, or core). Following the header, ELF files may include a program header table—an array of entries describing loadable segments for process image creation, such as code, data, and dynamic linking information—and a section header table that details smaller, linkable sections like .text ( code), .data (initialized variables), .bss (uninitialized data), and .symtab (). This dual structure allows ELF to serve both runtime loading (via program headers) and static linking/relocation (via section headers), enabling efficient memory mapping and usage without redundant code duplication. ELF's extensibility supports versioning for symbols, relocation entries for address resolution, and notes sections for auxiliary information like data or operating system-specific details, making it adaptable to modern features like (PIC) and multi-architecture binaries. Widely implemented in toolchains such as and binutils, ELF facilitates cross-compilation and has influenced formats in non-Unix environments, underscoring its role as a foundational element in and system reliability.

History and Development

Origins and 86open Principles

The Executable and Linkable Format () originated in the late 1980s when Unix System Laboratories (USL) developed it as part of System V Release 4 (SVR4) to supersede the limitations of the earlier a.out format, providing a more flexible structure for executables, object files, and . USL collaborated with , incorporating elements of Sun's dynamic shared library system from 4.x (introduced in 1988), which enabled runtime linking of libraries to reduce executable sizes and improve modularity. was first specified in the SVR4 (ABI), with initial implementations appearing in SVR4-based systems such as 2.0, released in 1992. Shortly thereafter, adopted ELF in 2.0 (also known as 5.0), marking one of the earliest widespread deployments and demonstrating its compatibility with SVR4-based environments. Other Unix variants followed suit in the early 1990s, as the format's design facilitated portability across x86 systems without requiring OS-specific modifications. In response to growing fragmentation among proprietary executable formats on x86 Unix platforms, the 86open project was founded in 1997 by a including the (SCO) and vendors, to establish a unified standard that would allow binaries to run seamlessly across diverse Unix implementations. The project focused on consensus-building for a common ABI, ultimately endorsing ELF as the solution before concluding in 1999. The core principles of 86open emphasized a simple yet extensible file structure to accommodate future enhancements without breaking compatibility, robust support for dynamic linking to enable shared libraries, generation of () for relocatable executables, and deliberate exclusion of OS-specific dependencies to ensure broad across Unix variants. These guidelines addressed the proprietary of the era, promoting ELF's adoption as a vendor-neutral format that prioritized efficiency and cross-platform usability.

Standardization and Evolution

The formal standardization of the Executable and Linkable Format (ELF) was led by the (TIS) committee, a of industry leaders formed in 1993 to define portable formats for systems. The TIS adopted ELF, originally developed for System V Release 4, as the standard object file format and published version 1.1 of the Portable Formats Specification in October 1993, extracting and refining ELF details from the System V . This effort culminated in the TIS ELF Specification version 1.2 in May 1995, which incorporated minor fixes, clarifications, and extensions for broader portability across 32-bit architectures. Subsequent evolution included the Generic Application Binary Interface (gABI), released in March 1997 as part of the System V ABI edition 4.1, which defined processor-independent ELF conventions to promote cross-distribution compatibility in and other environments. The gABI built on TIS foundations by specifying common ELF usage, such as dynamic linking and resolution, while allowing processor supplements for specific architectures. System V ABI extensions further refined ELF for operating system interfaces, including process initialization and function calling sequences. Support for 64-bit architectures emerged in the mid-1990s, with ELFCLASS64 defined to accommodate larger address spaces; an initial ELF-64 specification was developed for the Alpha processor around 1995, enabling 64-bit object files on Digital Unix. This was extended to x86-64 in the early 2000s through processor-specific ABIs, maintaining backward compatibility with 32-bit ELF while supporting extended data types and relocations. In the 2000s, ELF evolved with security enhancements, notably the introduction of RELRO (Relocation Read-Only) as a linker option in GNU ld around 2007, which marks relocation sections as read-only after processing to prevent runtime tampering. Partial and full RELRO modes balanced performance and protection, becoming standard in distributions for mitigating exploits targeting global offset tables. Adaptations for modern hardware continued into the 2010s, with formal ARM ELF specifications published in 1999 to support embedded and mobile processors. For RISC-V, ELF support was integrated into toolchains starting in the mid-2010s, with the processor-specific ABI specification finalized in 2021 to enable open-source implementations across microcontrollers and servers. In 2025, Xinuos published version 4.2 of the ELF specification and released a draft of version 4.3 for public review, formalizing updates such as separating the ELF spec from the gABI.

File Format Specifications

Overall Structure and Layout

The Executable and Linkable Format () organizes files in a hierarchical structure that begins with a fixed-size header containing metadata about the file's layout and type. This header is immediately followed by zero or more program headers, which describe loadable segments for runtime execution, and the actual content of those segments or sections. The file concludes with a section header table that catalogs all sections, such as , , and , enabling link-time processing; the sections themselves occupy space between the program headers and the section header table. ELF supports distinct file types tailored to different stages of and use. Executable files rely on headers to define loadable segments that the operating maps directly into for execution. Relocatable object files emphasize sections as the primary units, facilitating combination with other objects during linking to produce executables or shared libraries. Shared libraries incorporate dynamic linking mechanisms, including dedicated sections for tables and entries to resolve references at load time or . Core dump files preserve process state, encompassing segments, thread information, and register values for post-mortem analysis. ELF files vary by class and data encoding to accommodate diverse hardware. The 32-bit class uses 32-bit addresses and types suitable for traditional systems, while the 64-bit class employs 64-bit addressing for larger memory spaces and modern architectures. Data encoding supports little-endian byte order for processors like x86 or big-endian for others like some PowerPC variants. Identification begins with the magic bytes 0x7F 'E' 'L' 'F' in the file's initial bytes, distinguishing ELF from other formats. Common file types include ET_EXEC for standalone executables, ET_DYN for like shared libraries, and ET_REL for relocatable objects awaiting linking. Program headers and section headers provide complementary perspectives on the file: program headers offer a runtime-oriented view by grouping sections into coarse-grained segments optimized for efficient loading and execution by the , whereas section headers deliver a fine-grained, link-time view that permits the static linker to manipulate individual sections for tasks like and symbol merging. This separation enhances modularity, allowing tools to operate on either view as needed without redundancy.

ELF Header Details

The Executable and Linkable Format (ELF) begins with a fixed-size header that provides essential for interpreting the file, ensuring compatibility across different systems and architectures. This header is located at offset zero and contains an of identification bytes followed by core structural fields, allowing parsers to validate the , determine its class (32-bit or 64-bit), encoding, and other attributes before processing the rest of the file. The header's design promotes portability by standardizing field positions and sizes, with variations only for bit width to accommodate different processor architectures. The header's size is 52 bytes for 32-bit ELF files and 64 bytes for 64-bit files, reflecting the use of 4-byte or 8-byte addressing for certain fields. The initial 16 bytes form the e_ident , which serves as the file's "magic number" and configuration descriptor. Specifically, bytes 0-3 (EI_MAG) must contain the hexadecimal values 0x7f, 'E', 'L', 'F' to identify an ELF file; byte 4 (EI_CLASS) specifies the file class as 1 for 32-bit or 2 for 64-bit; byte 5 (EI_DATA) indicates data encoding as 1 for little-endian or 2 for big-endian; byte 6 (EI_VERSION) is always set to 1 for the current ELF version; byte 7 (EI_OSABI) denotes the operating system/ABI target, such as 0 for System V or 3 for ; and byte 8 (EI_ABIVERSION) provides the ABI version number, with bytes 9-15 reserved for padding (EI_PAD) initialized to zero. This enables immediate validation, as any mismatch (e.g., incorrect bytes) signals an invalid ELF file, preventing erroneous . Following e_ident, the header includes several core fields that describe the file's type, target machine, and layout pointers, all encoded in native byte order as determined by EI_DATA. The e_type field (2 bytes) classifies the file as ET_NONE (0, no file type), ET_REL (1, relocatable), ET_EXEC (2, executable), ET_DYN (3, shared object), or ET_CORE (4, core dump). The e_machine field (2 bytes) identifies the target architecture, such as EM_386 (3) for Intel 80386 or EM_X86_64 (62) for AMD x86-64. The e_version field (4 bytes) is fixed at 1, matching EI_VERSION for consistency. The e_entry field (4 or 8 bytes, depending on class) holds the virtual address of the program's entry point. Layout offsets are provided by e_phoff (4 or 8 bytes) for the program header table position and e_shoff (4 or 8 bytes) for the section header table position, both relative to the file start. The e_flags field (4 bytes) carries processor-specific flags, such as 0x00000001 for x86-64 code model adjustments. Header metadata includes e_ehsize (2 bytes) indicating the header's own size (52 or 64); e_phentsize (2 bytes) and e_phnum (2 bytes) for program header entry size (typically 32 or 56 bytes) and count; and e_shentsize (2 bytes), e_shnum (2 bytes), and e_shstrndx (2 bytes) detailing section header entry size (40 or 64 bytes), total count, and index of the string table section for section names. These fields collectively guide the loader or linker in navigating the file without prior knowledge of its internal structure. To maintain alignment and portability, ELF headers adhere to strict padding and byte-order rules: the e_ident padding bytes are always zero, and all multi-byte fields (e.g., addresses and offsets) are stored in the endianness specified by EI_DATA, with natural for 32-bit (4-byte) and 64-bit (8-byte) variants to avoid unaligned access issues on target architectures. This facilitates robust by allowing tools to first verify the header's —through magic checks, version consistency, and size validations—before advancing to variable components, thereby minimizing errors in cross-platform or multi-architecture environments. For instance, a mismatch in e_ehsize would indicate a corrupted or non-standard file, prompting immediate rejection.
FieldOffset (32-bit)Size (32-bit)TypeDescription
e_ident016 bytesIdentification bytes for , class, data, version, OS/ABI, ABI version, and padding.
e_type162 bytesElf32_HalfFile type (e.g., , shared object).
e_machine182 bytesElf32_HalfTarget (e.g., EM_386).
e_version204 bytesElf32_WordObject file version (always 1).
e_entry244 bytesElf32_Addr virtual address.
e_phoff284 bytesElf32_OffProgram header table offset.
e_shoff324 bytesElf32_OffSection header table offset.
e_flags364 bytesElf32_WordProcessor-specific flags.
e_ehsize402 bytesElf32_HalfELF header size in bytes.
e_phentsize422 bytesElf32_HalfProgram header entry size.
e_phnum442 bytesElf32_HalfNumber of program header entries.
e_shentsize462 bytesElf32_HalfSection header entry size.
e_shnum482 bytesElf32_HalfNumber of section header entries.
e_shstrndx502 bytesElf32_HalfIndex of section name string table.
For 64-bit ELF files, offsets after e_ident shift accordingly, with e_entry, e_phoff, and e_shoff expanding to 8 bytes each, resulting in the total 64-byte size; the table above illustrates the 32-bit layout, but field purposes remain identical.

Program Headers and Segments

The program header table in an ELF file is an array of program header entries that describe the layout of loadable segments for creating a image during execution. This table is optional but required for executable and shared object files; relocatable object files typically omit it. The ELF header references the table using the e_phoff field for its file offset and e_phnum for the number of entries. Each entry is a fixed-size structure: 32 bytes for 32-bit ELF files (Elf32_Phdr) and 56 bytes for 64-bit files (Elf64_Phdr). The table enables the operating system loader to map segments directly into without relying on section-level details, facilitating efficient loading. Each program header entry contains fields that specify the segment's type, location, size, and attributes. The structure for a 32-bit ELF (Elf32_Phdr) is defined as follows:
FieldTypeDescription
p_typeElf32_WordSpecifies the segment type, indicating how the entry should be interpreted (e.g., loadable segment or auxiliary information).
p_offsetElf32_OffFile offset where the segment begins, in bytes from the start of the file. For loadable segments, this must align with p_align; for non-loadable, it points to in-file data.
p_vaddrElf32_AddrVirtual address where the segment should be loaded in memory. Loadable segments start at this address after mapping.
p_paddrElf32_AddrPhysical address for the segment, typically used in embedded systems or kernels; ignored by most user-space loaders.
p_fileszElf32_WordSize of the segment in the file, in bytes; for loadable segments, this is the portion copied from the file to memory.
p_memszElf32_WordSize of the segment in memory, in bytes; may exceed p_filesz for segments requiring zero-initialization (e.g., BSS-like areas).
p_flagsElf32_WordAccess permissions: PF_R (read, bit 0), PF_W (write, bit 1), PF_X (execute, bit 2). These map to memory protection settings like read-only or executable.
p_alignElf32_WordAlignment constraint: the segment's file offset and virtual address must be multiples of this value (e.g., 0x1000 for page alignment). Set to 0 or 1 for non-loadable segments.
The 64-bit variant (Elf64_Phdr) uses analogous types (e.g., Elf64_Off, Elf64_Xword for larger sizes) but maintains the same field order and semantics. The p_type field defines the segment's purpose, with standard values outlined in the ELF specification. Common types include PT_NULL (0, unused entry), PT_LOAD (1, loadable segment for code or data), PT_DYNAMIC (2, dynamic linking information like symbol tables), PT_INTERP (3, path to the program interpreter, e.g., "/lib/ld-linux.so.2"), PT_NOTE (4, auxiliary notes such as build IDs or metadata), and PT_GNU_STACK (0x6474e551, extension for stack attributes, including executable permission for hardening). Other types like PT_TLS (7, ) and processor-specific extensions may appear depending on the platform. Loadable segments (PT_LOAD) are the core of execution, typically dividing the image into read-execute (text) and read-write (data) portions. In , the program header table guides the loader (such as ld.so on ) to construct the process . The loader reads the table, maps PT_LOAD segments into at their p_vaddr with appropriate p_flags protections, initializes extra memory for p_memsz > p_filesz, and processes auxiliary segments like PT_DYNAMIC for and symbol resolution or PT_INTERP to invoke the itself. This segment-based approach allows efficient loading without parsing finer-grained sections, supporting in shared libraries. For instance, the initial process image combines segments from the executable and interpreter, with the loader applying relocations post-mapping.

Section Headers and Contents

The section header table in an ELF file is an array of section header entries that describe the layout and attributes of each within the , enabling tools like linkers and debuggers to interpret the file's contents. Each entry is a fixed-size structure—40 bytes for 32-bit ELF (Elf32_Shdr) and 64 bytes for 64-bit ELF (Elf64_Shdr)—and the ELF header provides pointers to this table via the e_shoff ( to the table), e_shnum (number of entries), and e_shentsize (size of each entry) fields. The table typically appears at the end of the file, and names are stored as indices into a dedicated string , often named .shstrtab. The Elf32_Shdr structure consists of the following fields:
FieldTypeSize (bytes)Description
sh_nameElf32_Word4An index into the (.shstrtab), giving the name of this section as a .
sh_typeElf32_Word4A value specifying the type of , such as program data or (see section types below).
sh_flagsElf32_Word4 flags, bitmasks indicating attributes like whether the section is allocatable (SHF_ALLOC), writable (SHF_WRITE), (SHF_EXECINSTR), or occupies no space in the file (SHF_MASKOS for OS-specific).
sh_addrElf32_Addr4The at which the section should reside in , if applicable (0 if not relevant).
sh_offsetElf32_Off4The offset in bytes from the beginning of the file to the first byte of the section.
sh_sizeElf32_Word4The size in bytes of the section, or 0 if the section occupies no space (e.g., .bss).
sh_linkElf32_Word4An index into the for a related section, such as the associated string table for (interpretation depends on sh_type).
sh_infoElf32_Word4Extra information, often an index into another section or , with meaning varying by sh_type (e.g., target section for relocations).
sh_addralignElf32_Word4The alignment requirement for the section in , expressed as a power of 2 (0 or 1 means no alignment).
sh_entsizeElf32_Word4The size in bytes of each entry if the section holds a of fixed-size entries (e.g., symbols); 0 otherwise.
The Elf64_Shdr structure mirrors this layout but uses 64-bit types where appropriate (e.g., Elf64_Xword for sh_size and sh_flags, Elf64_Addr for sh_addr, Elf64_Off for sh_offset), resulting in the larger size. Section types, defined by the sh_type field, categorize the purpose and contents of each section, with standard values including SHT_NULL (0, an inactive entry with undefined values), SHT_PROGBITS (1, program-specific data like code or constants), SHT_SYMTAB (2, a full for linking), SHT_STRTAB (3, a table), SHT_RELA (4, relocation entries with explicit addends), SHT_HASH (5, a for symbol lookups), SHT_DYNAMIC (6, dynamic linking information), SHT_NOTE (7, vendor-specific notes), SHT_NOBITS (8, data that occupies memory but no file space, like uninitialized variables), SHT_REL (9, relocation entries without addends), SHT_SHLIB (10, reserved), and SHT_DYNSYM (11, a minimal dynamic symbol table). Processor-specific or OS-specific types may extend this range. Common sections in ELF object files include .text (type SHT_PROGBITS, flags SHF_ALLOC | SHF_EXECINSTR, containing ), .data (SHT_PROGBITS, SHF_ALLOC | SHF_WRITE, holding initialized or static variables), .bss (SHT_NOBITS, SHF_ALLOC | SHF_WRITE, for uninitialized that is zeroed at runtime to conserve file space), .rodata (SHT_PROGBITS, SHF_ALLOC, read-only constants like strings), .symtab (SHT_SYMTAB, a of with sh_entsize typically 16 bytes on 32-bit systems, linked to .strtab via sh_link), .strtab (SHT_STRTAB, strings for symbol names and other identifiers), .rela (SHT_RELA, relocation entries with addend fields for ), .rel (SHT_REL, similar but without addends), .dynamic (SHT_DYNAMIC, entries for use, such as dependencies), and .shstrtab (SHT_STRTAB, exclusively for section names referenced by sh_name indices). Special sections encompass .interp (SHT_PROGBITS, containing the null-terminated path to the program interpreter, such as /lib/ld-linux.so.2 for dynamic executables) and .note (SHT_NOTE, holding auxiliary information like build IDs for debugging or notes for ABI identification). During linking, the linker processes these sections by merging compatible ones based on type and flags—for instance, combining .text and .rodata into a single read-only loadable segment, or .data and .bss into a writable segment—while resolving relocations and symbols to produce the final executable's program headers. This separation allows flexible static analysis and linking without affecting runtime loading.

Example Hexdump and Parsing

To illustrate the practical structure of an ELF file, consider a minimal 32-bit executable for x86 architecture that prints "Hello world" and exits, compiled for Linux systems. Such files begin with the ELF identification bytes, followed by the ELF header and program headers, as defined in the official ELF specification. This example is 116 bytes total, with no section headers (e_shoff=0) and a single program header. The following hexdump shows the full content of this minimal 32-bit ELF executable (little-endian byte order). The magic bytes (0x7F 'E' 'L' 'F') confirm the file class (32-bit), data encoding (little-endian), and version.
00000000  7f 45 4c 46 01 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 03 00 01 00 00 00  54 80 04 08 34 00 00 00  |........T...4...|
00000020  00 00 00 00 00 00 00 00  34 00 20 00 01 00 00 00  |........4. .....|
00000030  00 00 00 00 01 00 00 00  00 00 00 00 00 80 04 08  |................|
00000040  00 80 04 08 74 00 00 00  74 00 00 00 05 00 00 00  |....t...t.......|
00000050  00 10 00 00 b0 04 31 db  43 b9 69 80 04 08 31 d2  |......1.C.i...1.|
00000060  b2 0b cd 80 31 c0 40 cd  80 48 65 6c 6c 6f 20 77  |[email protected] w|
00000070  6f 72 6c 64                                       |orld             |
In this hexdump, bytes 0x00-0x0F form the e_ident array: 0x7F454C46 (magic number), 0x01 (EI_CLASS for 32-bit), 0x01 (EI_DATA for little-endian), 0x01 (EI_VERSION), 0x00 (EI_OSABI for System V), and padding zeros. Bytes 0x10-0x11 hold e_type = 0x0002 (ET_EXEC for ), and 0x12-0x13 hold e_machine = 0x0003 (EM_386 for 80386). The e_version at 0x14-0x17 is 0x00000001. The e_entry at 0x18-0x1B is 0x08048054 ( virtual address). e_phoff at 0x1C-0x1F is 0x00000034 (program header offset at byte 52). e_shoff at 0x20-0x23 is 0x00000000 (no section headers). e_flags at 0x24-0x27 is 0x00000000. e_ehsize at 0x28-0x29 is 0x0034 (52 bytes). e_phentsize at 0x2A-0x2B is 0x0020 (32 bytes per program header). e_phnum at 0x2C-0x2D is 0x0001 (one entry). e_shentsize at 0x2E-0x2F is 0x0000, e_shnum at 0x30-0x31 is 0x0000, e_shstrndx at 0x32-0x33 is 0x0000 (no sections). Parsing proceeds sequentially from the start. First, validate the magic bytes at 0 to ensure ELF format and extract e_ident for architecture details: (32-bit vs. 64-bit determines header size and field widths), (little-endian requires byte reversal on big-endian hosts), and OS/ABI for . Next, read e_type to confirm it's an (ET_EXEC = 2); e_machine specifies the target (e.g., 3 for x86). The e_entry provides the to jump to after loading (0x08048054). Since e_shoff=0, there are no sections to parse. headers begin at e_phoff=0x34 (byte 52): the single PT_LOAD entry (p_type=1 at bytes 0x34-0x37) describes a loadable with p_offset=0x00000000 ( ), p_vaddr=0x08048000 ( , page-aligned), p_paddr=0x08048000, p_filesz=0x00000074 (116 bytes from ), p_memsz=0x00000074 (116 bytes in memory), p_flags=0x00000005 (read and execute). p_align=0x00001000 (4 KB ). This encompasses the entire , including the code starting at 0x54 ( 0x08048054): it performs sys_write (eax=4, ebx=1 for stdout, ecx=0x08048069 for , edx=11 for length) via int 0x80, then sys_exit (eax=1) via int 0x80, printing "Hello " before terminating. The resides at 0x69 ( 0x08048069). Common pitfalls in parsing include ignoring from EI_DATA, leading to swapped multi-byte fields (e.g., misreading e_type as 0x0001 instead of 2 on big-endian systems), or assuming 64-bit for 32-bit files, which alters field sizes and offsets (64-bit headers are 64 bytes with 8-byte fields). Additionally, 32-bit vs. 64-bit differences affect : 32-bit uses 4-byte words, while 64-bit uses 8-byte, potentially causing buffer overflows in parsers. In this minimal example, the absence of sections simplifies linking but limits debuggability; the self-contained loadable segment demonstrates runtime execution without separate link-time sections.

Tools and Utilities

Core Manipulation Tools

The GNU Binutils suite comprises a set of command-line utilities essential for creating, modifying, and inspecting Executable and Linkable Format (ELF) files in workflows. Developed and maintained by Project, these tools facilitate the manipulation of ELF object files, executables, and libraries by handling linking, section copying, disassembly, and archiving operations. The GNU linker, known as ld, serves as the primary tool for combining multiple ELF object files (.o) and libraries into a single program or . It resolves symbols, applies relocations, and generates the final ELF binary by processing input sections and program headers as defined in the ELF specification. For instance, the command ld -o output.elf input1.o input2.o -lc links two object files with the standard C library to produce an executable. To create a shared library, the option -shared is used, as in ld -shared -o libexample.so input.o, which produces a position-independent ELF file suitable for . objcopy enables the copying and transformation of ELF files, allowing developers to manipulate sections, such as removing debugging symbols or converting formats. It can extract specific sections, adjust headers, or strip unnecessary data to reduce file size. A common usage is stripping all symbols with objcopy --strip-all input.elf -o output.elf, which removes symbol tables and debug information while preserving the executable's functionality, aiding in production builds. Other options include --only-section=.text to copy just the code section. For disassembly and inspection, disassembles ELF sections to reveal in assembler mnemonics, alongside headers and symbol tables. It is particularly useful for verifying the output of and linking steps. Key flags include -d to disassemble executable sections, -h to display section headers, and -t for the . An example command, objdump -d input.elf, outputs the disassembled instructions from code sections, helping developers analyze binary structure. When combined with -S, it intermixes if available, as in objdump -S -d input.elf. The readelf utility provides detailed parsing of ELF file structures, displaying headers, program headers, section headers, symbols, and relocations without disassembly. It offers flags tailored to specific components, such as -h for the ELF header, -S for section headers, -l for program headers, and -s for the . For example, readelf -h input.elf prints the main ELF header fields like magic number and , while readelf -S input.elf lists all sections with their sizes and attributes. This tool is invaluable for verifying format compliance during development. Finally, ar functions as an archiver for creating static libraries in .a format, which bundle multiple ELF object files for use in linking. It maintains file metadata like timestamps and permissions within the archive. Common operations include creating an archive with ar rcs libexample.a obj1.o obj2.o, where r inserts files, c suppresses prompts, and s generates a index for efficient linking. The --record-libdeps option can track inter-library dependencies. Thin archives, supported in modern versions, reference external ELF files instead of embedding them, optimizing build processes.

Analysis and Debugging Tools

The GNU Debugger (GDB) serves as a foundational tool for runtime debugging of ELF executables on systems, enabling developers to inspect program execution, set breakpoints within specific ELF sections such as .text or .data, and load ELF-formatted files to analyze states. GDB examines dynamic symbols from the ELF's .dynsym section and supports symbol resolution through debugging information embedded in ELF files, facilitating step-by-step execution tracing and variable inspection during runtime. This integration with ELF structures allows precise control over loaded segments and addresses, making it essential for diagnosing issues in dynamically linked binaries. Strace is a diagnostic that traces system calls and signals made by executables running on , providing visibility into interactions without requiring modifications. By attaching to an via the mechanism, logs calls such as open, read, and related to ELF loading and execution, helping identify I/O bottlenecks or permission errors in runtime behavior. It supports filtering by syscall type or file paths, such as those involving ELF shared libraries, to focus analysis on specific aspects of program flow. Complementing strace, ltrace traces dynamic library calls and signals in ELF binaries, intercepting invocations to functions in shared objects like libc.so during execution. This tool records entry and return points for library APIs, revealing how ELF programs interact with dynamically loaded code and aiding in the diagnosis of linkage or API misuse issues. Ltrace also captures associated system calls when invoked with appropriate flags, offering a layered view of runtime dependencies beyond kernel boundaries. The ldd command, part of the GNU C Library (glibc), lists the dependencies of an or by simulating the dynamic linker's resolution process. It parses the 's program headers and dynamic section to output required files, their memory addresses, and any unresolved symbols, which is crucial for verifying linkage integrity before deployment. For example, running ldd on a reveals paths to libraries like libm.6, highlighting potential portability issues across systems. Security auditing tools like checksec evaluate binaries for protective features, checking attributes such as RELRO (Relocation Read-Only) to prevent GOT overwrites, NX (No eXecute) to block code execution in data areas, and (Position Independent Executable) for ASLR compatibility. By inspecting headers and sections, checksec reports on usage for stack smashing protection and Fortify for buffered I/O safeguards, enabling quick assessments of binary hardening against exploits. These audits are performed statically on files, providing a security posture overview without execution. The elfkickers suite comprises a collection of utilities for in-depth ELF file analysis, including scripts for computing section entropy to detect packed or obfuscated code and generating statistics on header layouts and tables. Tools within elfkickers, such as elfls for listing sections and readelf variants for parsing, facilitate forensic examination of ELF structures, revealing anomalies like unusual permissions or alignments that may indicate tampering. This set is particularly useful for and , focusing on static properties rather than . Valgrind, a suite of dynamic analysis tools, primarily through its Memcheck instrumenter, detects memory errors in running processes by shadowing allocations and tracking accesses in loaded segments. It intercepts execution to identify leaks, invalid reads/writes, and use-after-free bugs, with support for debugging information from sections to pinpoint issues in lines. Valgrind's compatibility with on Linux allows comprehensive profiling of heap and stack usage in dynamically linked applications, often revealing subtle defects missed by static checks.

Usage and Adoption

Primary Use in Unix-like Systems

The Executable and Linkable Format (ELF) is the predominant binary file format for executables, shared libraries, and core dumps in Unix-like systems, enabling efficient loading and execution by kernels and dynamic linkers. In Linux, ELF has been the default format since kernel version 1.0 released in 1994, with initial support introduced in development kernel 0.99.13 in 1993. The Linux kernel integrates ELF loading through the binfmt_elf module, which registers the format with the execve system call to interpret ELF binaries during process creation. Upon execution, the kernel validates the ELF header's magic bytes and structure, then uses the program header table to map loadable segments into virtual memory via mmap, before passing control to the dynamic loader, typically /lib/ld-linux.so.2 for 32-bit systems or /lib64/ld-linux-x86-64.so.2 for 64-bit. In BSD variants, ELF adoption occurred in the mid-1990s as a replacement for the older a.out format to support advanced features like dynamic linking and shared libraries. FreeBSD introduced ELF header files in version 2.2.6 (1996), marking the beginning of its transition, with full native support solidified by version 3.0 in 1998, including FreeBSD-specific extensions such as brand notes in ELF headers to denote compatibility features like ABI versioning. NetBSD transitioned to ELF as its primary format for i386 and sparc ports starting with release 1.5 in 2000, maintaining backward compatibility for a.out binaries through tools like elf2aout for bootloaders and debugging utilities. OpenBSD added initial ELF support in version 1.2 (1996) and made it the native format across all platforms from version 5.4 (2013) onward. These implementations leverage ELF's program headers for kernel-level segment mapping, ensuring portable execution across architectures. Solaris, originating from System V Release 4 (SVR4) in 1988, was one of the first Unix systems to adopt as its standard format with Solaris 2.0 in 1992, inheriting SVR4's design for object files and executables. The project, an open-source continuation of since 2010, retains this SVR4-derived support, including unique extensions like the .SUNW_cap section for specifying software and hardware capabilities such as required CPU instructions or platform features to guide linking and loading decisions. In both systems, the kernel performs ELF header validation to confirm file integrity and architecture compatibility, maps program segments into process , and defers relocation resolution—such as adjusting addresses for —to the runtime linker, ld.so.1, which processes dynamic relocation entries from .rel or .rela sections. While macOS primarily employs the Mach-O format for native binaries, it supports ELF indirectly through cross-compilation toolchains in Xcode and third-party GNU binutils, allowing developers to generate ELF files targeting Linux or embedded Unix-like systems without altering the host OS's loader. This partial integration facilitates porting and building for Unix environments but does not involve direct kernel handling of ELF files on macOS itself. Overall, ELF's standardization in Unix-like kernels emphasizes robust header validation to prevent malformed binaries, memory-efficient segment mapping for shared libraries, and deferred relocation processing to minimize load times and enable address space layout randomization for security.

Adoption in Non-Unix Environments

The Executable and Linkable Format () has seen partial adoption in Windows environments through compatibility layers and development tools that bridge -like functionality with the native () format. , a emulation layer for Windows, supports handling files via libraries such as ELFIO, enabling developers to read and generate binaries within a environment while ultimately producing executables for Windows execution. Similarly, provides a for Windows that can be configured to generate object files for cross-compilation purposes, though native Windows applications remain in format. , an open-source implementation of the kernel, incorporates internals in its debugging subsystem, such as the dbghelp module, to parse modules for compatibility and analysis tasks. BeOS and its successor Haiku adopted ELF as the native executable format starting in the late 1990s, leveraging its Unix-like heritage for efficient binary handling on x86 architectures after transitioning from the earlier Preferred Executable Format (PEF) used on PowerPC. This choice facilitated compatibility with Unix tools and binutils, allowing Haiku to maintain a lightweight yet robust binary ecosystem without major modifications to the core ELF specification. Fuchsia, Google's modular capability-based operating system, employs via its built-in ELF runner for launching executable components. In firmware and real-time operating systems (RTOS), has been adapted for resource-constrained embedded environments, notably in uClinux distributions for microcontrollers lacking units (MMUs). uClinux employs as the base format for executables and shared libraries, with modifications to support flat loading and no-MMU operation, enabling deployment on systems like ARM-based devices. Cross-platform toolchains further extend this adoption; for instance, and can generate binaries targeting non-Unix architectures directly from Windows or other hosts, facilitating development for embedded and hybrid systems. A key challenge in ELF's adoption outside Unix environments stems from (ABI) differences, particularly in calling conventions. The System V ABI, integral to ELF on systems, passes the first six integer or pointer arguments in registers RDI, RSI, , RCX, R8, and R9, contrasting with the Windows x64 ABI, which uses RCX, , R8, and R9 for the first four arguments and reserves additional registers for shadow space. These variances necessitate adaptations in loaders and linkers to ensure compatibility, often requiring wrappers or recompilation for cross-environment execution.

Applications in Embedded and Specialized Systems

The Executable and Linkable Format (ELF) finds significant application in game consoles, where it supports development kits, homebrew software, and proprietary variants tailored to hardware constraints. In the PlayStation series, the PS2 employs ELF files for homebrew applications and executable packing, enabling modular loading of code segments optimized for the Emotion Engine processor. Similarly, the PS3 utilizes SELF (Signed Executable and Linkable Format), a cryptographically signed extension of ELF, for system executables and dynamic libraries (SPRX files), ensuring secure loading on the Cell Broadband Engine architecture from 2006 onward. For the Nintendo Switch, homebrew development relies on ELF-based formats like .nro files, which are loaded via custom loaders to run unsigned code on the Tegra X1 SoC, facilitating community-driven applications since the console's 2017 release. In mobile ecosystems, ELF serves native code execution in , where the Native Development Kit (NDK) compiles C/C++ libraries into ELF shared objects (.so files) linked against Bionic libc, enabling high-performance components in apps since Android 1.0 in 2008. This format allows of optimized binaries for architectures, supporting features like graphics rendering and signal processing in resource-limited environments. On , while the native format dominates, ELF plays a role in jailbreak tools through custom loaders that inject ELF shared objects, as demonstrated by developer Comex's "food" module, which enabled loading Android-compatible ELF libraries like libflashplayer.so on jailbroken devices. Historical and specialized uses of ELF extend to PowerPC-based systems, where adopted ELF executables to replace the earlier Extended Hunk Format for PowerPC accelerator cards, providing a standardized structure for binaries on Amiga hardware since 2006. , a lightweight OS for PowerPC Macs and Amiga clones, also employs ELF for its executables, leveraging the format's flexibility for efficient media-centric applications on constrained 32-bit and 64-bit PowerPC processors. IBM's AIX operating system on PowerPC historically favored the proprietary XCOFF format but incorporated ELF support through optional toolchains for compatibility with environments, allowing cross-compilation of ELF binaries for PowerPC targets. In blockchain platforms, ELF underpins node implementations running on Unix-like hosts. Ethereum clients, such as the Go Ethereum (Geth) implementation, produce ELF executables for Linux deployments, facilitating consensus and transaction processing on x86 and ARM hosts since the network's 2015 launch. Solana validators, built in Rust, compile to ELF binaries for Unix systems, with on-chain programs specifically packaged as ELF files containing BPF bytecode, enabling high-throughput validation on diverse hardware including ARM-based servers. For and systems, ELF's modularity supports resource-constrained architectures like and . , a derivative for processors, uses ELF for all native executables and libraries, allowing seamless deployment of applications on devices like the since 2012. SiFive's boards, such as the series, rely on ELF for and application binaries, with toolchains handling relocations and sections tailored to embedded needs. To minimize footprint in these environments, optimizations like stripping unnecessary sections (e.g., debug symbols via binutils' tool) reduce ELF file sizes by up to 50% without affecting runtime functionality, as applied in software for edge devices.

Extensions and Variants

Multi-Architecture Support Initiatives

As adoption grew, the format evolved to support multiple architectures through the e_machine field in the ELF header, a 16-bit identifier that specifies the target processor, enabling compatibility with over 60 architectures including ARM (EM_ARM=40), MIPS (EM_MIPS=8), and x86-64 (EM_X86_64=62). This design choice decoupled the core file structure from architecture-specific details, allowing ELF to serve as a flexible container for binaries across diverse hardware without requiring format redesigns. To accommodate varying system conventions, ELF incorporates (ABI) extensions that build on the generic System V ABI. The Linux generic ABI (gABI), maintained by the , provides a baseline for ELF usage across distributions, defining common conventions for object files, executables, and shared libraries while leaving room for processor-specific adaptations. Architecture-specific ABIs extend this foundation; for instance, the ARM Embedded (EABI), finalized in 2009, tailors ELF for processors by specifying details like relocation types, dynamic linking tags, and procedure call standards to ensure efficient execution on resource-constrained systems. These extensions maintain with the gABI while addressing unique requirements, such as ARM's support for both little- and big-endian byte orders via the e_ident[EI_DATA] field. Efforts to consolidate multiple architectures into a single ELF file have included proposals like FatELF, which embeds several architecture-specific ELF binaries within one container file. Cross-compilation standards have further enhanced 's multi-architecture capabilities, particularly through the project's toolchain. / supports generating portable ELF object files and executables for numerous targets via the target triple specification (e.g., armv7-linux-gnueabihf for ELF), enabling developers to build binaries for remote architectures from a single host system without architecture-specific toolchains. This portability relies on ELF's extensible structure, such as the e_flags field for architecture-specific attributes, and integrates with standards like the gABI to produce compatible outputs for linking and execution across ecosystems.

Modern Binary Format Proposals

In 2009, Ryan C. Gordon proposed FatELF as an extension to the format to enable universal binaries on , akin to those on macOS, by embedding multiple architecture-specific binaries within a single file. The structure consists of a primary binary followed by secondary binaries, each identified by headers specifying attributes like CPU architecture, byte order, and OS ABI version, allowing the loader to select the appropriate one at runtime. Despite initial interest for simplifying multi-architecture distribution, the project was abandoned later that year due to integration challenges and community resistance, resulting in no widespread adoption by 2025. WebAssembly (Wasm), introduced in 2017, draws conceptual inspiration from in its binary format, organizing modules into sections for code, data, and custom metadata to support portable, secure execution across environments. While distinct from , Wasm's section-based layout facilitates integration with ELF-based systems through tools like the linker (lld), which can produce Wasm outputs from ELF inputs or embed Wasm modules into ELF executables for hybrid applications. Contemporary security enhancements to ELF focus on embedding properties for hardware-enforced protections rather than full cryptographic signing schemes. For instance, the GNU toolchain introduced the .note.gnu.property section in 2019 to signal support for Intel's Control-flow Enforcement Technology (CET), which mitigates control-flow hijacking attacks by enforcing indirect branch restrictions, with the kernel using this note to configure execution accordingly. Similarly, on ARM64, ELF binaries leverage the same property note mechanism to enable Pointer Authentication Codes (PAC) and Branch Target Identification (BTI) for control-flow integrity (CFI), authenticating pointers and validating branch targets to prevent exploits like return-oriented programming, as integrated into Linux kernels since 2020. Looking ahead, RISC-V ELF extensions in the 2020s incorporate property notes to indicate support for vector cryptography instructions, such as those in the Zvkn (AES/SHA) and Zvks (SM4) extensions ratified in 2023, enabling efficient hardware-accelerated crypto operations in ELF binaries without altering the core format. GNU binutils 2.45, released in July 2025, added support for these RISC-V cryptography property notes. Broader discussions in the Linux community, including a January 2025 thread on the binutils mailing list introducing the concept of "ELF 2.0," have explored potential enhancements to ELF functionality such as improved relocations and compatibility, though no formal specification has emerged as of November 2025.

References

  1. [1]
    [PDF] Tool Interface Standard (TIS) Executable and Linking Format (ELF ...
    This Executable and Linking Format Specification, Version 1.2, is the result of the work of the Tool Interface Standards (TIS) Committee--an association of ...
  2. [2]
    ELF - OSDev Wiki
    ELF (Executable and Linkable Format) is a versatile file format designed for Unix-alike systems, used for executables and shared libraries, distinguishing ...
  3. [3]
    The 101 of ELF files on Linux: Understanding and Analysis
    Mar 12, 2025 · ELF is short for Executable and Linkable Format. It is a formal specification that defines how instructions are stored in executable code.
  4. [4]
    Evolution of the ELF object file format - MaskRay
    May 26, 2024 · Unix System Laboratories (USL) created ELF for their System V Release 4 in late 1980s. USL also maintained the System V Application Binary ...
  5. [5]
    Halloween IX: It Ain't Necessarily SCO - catb. Org
    SCO/Caldera bought the Santa Cruz Operation's Linux business for $36 million. SCO/Tarantella bought UnixWare from Novell in 1995 for an estimated $72.4 ...
  6. [6]
    [PDF] Tool Interface Standard (TIS) Portable Formats Specification
    The TIS Committee formed an object format subcommittee to evaluate the widely available formats and to select one as the TIS standard.Missing: 1992-1995 | Show results with:1992-1995
  7. [7]
    [PDF] SYSTEM V APPLICATION BINARY INTERFACE - SCO
    Mar 18, 1997 · generic System V ABI or generic ABI: Consists of the processor-independent portions of the System V Application Binary Interface. Processor ...Missing: Linux | Show results with:Linux
  8. [8]
    [PDF] ARM ELF
    Sep 22, 1999 · As mentioned above, ELF provides an object file framework to support multiple processors, multiple data encodings, and multiple classes of ...
  9. [9]
    elf(5) - Linux manual page - man7.org
    An executable file using the ELF file format consists of an ELF header, followed by a program header table or a section header table, or both. The ELF header ...
  10. [10]
    Linux Standard Base Core Specification 4.1
    See `Program Header' in Chapter 5 of System V ABI Update for more information. ... p_type; /* Segment type */ Elf32_Off p_offset; /* Segment file offset ...
  11. [11]
  12. [12]
    ELF Special Sections - Linux Foundation
    .bss. This section holds uninitialized data that contribute to the program's memory image. ·.comment. This section holds version control information. ·.data.
  13. [13]
    Binutils - GNU Project - Free Software Foundation
    The GNU Binutils are a collection of binary tools. The main ones are: ld - the GNU linker. as - the GNU assembler. gold - a new, faster, ELF only linker.
  14. [14]
    objdump (GNU Binary Utilities)
    ### Summary of objdump Role and Usage
  15. [15]
    ar (GNU Binary Utilities)
    ### Summary of `ar` Archiver for ELF Static Libraries
  16. [16]
    GDB Website - GNU.org
    No information is available for this page. · Learn why
  17. [17]
  18. [18]
    strace
    strace is a diagnostic, debugging and instructional userspace utility for Linux. ... -e trace=%clock Trace all system calls that read or modify system clocks.Missing: ELF | Show results with:ELF
  19. [19]
    strace(1) - Linux manual page - man7.org
    strace is a useful diagnostic, instructional, and debugging tool. System administrators, diagnosticians, and troubleshooters will find it invaluable for ...Missing: ELF | Show results with:ELF
  20. [20]
    ltrace
    Jul 19, 2019 · ltrace intercepts and records dynamic library calls which are called by an executed process and the signals received by that process.Missing: ELF tracing
  21. [21]
    ltrace(1) - Linux manual page - man7.org
    ltrace is a library call tracer that runs a command, intercepts and records dynamic library calls, signals, and system calls.Missing: ELF | Show results with:ELF
  22. [22]
    ltrace intercepts and records dynamic library calls which ... - GitHub
    ltrace intercepts and records dynamic library calls which are called by an executed process and the signals received by that process.
  23. [23]
    ldd(1) - Linux manual page - man7.org
    ldd prints the shared objects (shared libraries) required by each program or shared object specified on the command line.
  24. [24]
    ldd(1): print shared library dependencies - Linux man page - Die.net
    Description. ldd prints the shared libraries required by each program or shared library specified on the command line.Missing: GNU | Show results with:GNU
  25. [25]
    slimm609/checksec - GitHub
    Checksec checks the properties of executables (like PIE, RELRO, Canaries, ASLR, Fortify Source). It has been originally written by Tobias Klein.Missing: ELF | Show results with:ELF
  26. [26]
    Checksec | A tool used to quickly survey mitigation technologies in ...
    Checksec is a bash shell script that is used to check the properties of executables (like PIE, RELRO, Canaries, ASLR, Fortify Source) and the linux kernel.Missing: ELF audit
  27. [27]
    checksec(1) - Arch manual pages
    DESCRIPTION. checksec is a bash script used to check the properties of executables (like PIE, RELRO, PaX, Canaries, ASLR, Fortify Source), library calls ...Missing: ELF tool<|separator|>
  28. [28]
    BR903/ELFkickers: A collection of programs that access ... - GitHub
    This distribution is a collection of programs that are generally unrelated, except in that they all deal with the ELF file format.Missing: analysis scripts
  29. [29]
    ELF Kickers - Muppetlabs
    The main purpose of these programs is to be illustrative and educational -- to help fellow programmers understand ELF files and something of how they work under ...Missing: analysis scripts
  30. [30]
    ELF Kickers
    The main purpose of these programs is to be illustrative and educational -- to help fellow programmers understand the ELF file format and something of how it ...Missing: analysis scripts github
  31. [31]
    Valgrind User Manual
    Valgrind User Manual · 1. Quick Start: debugging in 3 steps · 2. Valgrind gdbserver overall organisation · 3. Connecting GDB to a Valgrind gdbserver · 4. Connecting ...10. DHAT: a dynamic heap... · 6. Callgrind: a call-graph... · Valgrind's coreMissing: ELF | Show results with:ELF
  32. [32]
    4. Memcheck: a memory error detector - Valgrind
    Debugging MPI Parallel Programs with Valgrind. Memcheck supports debugging of distributed-memory applications which use the MPI message passing standard.
  33. [33]
    [PDF] Valgrind Documentation
    Nov 27, 2017 · The Valgrind tool suite provides a number of debugging and profiling tools that help you make your programs faster and more correct. The most ...
  34. [34]
    A way out for a.out - LWN.net
    Mar 24, 2022 · Still, Linux used a.out for some time, until support for the newfangled ELF format was first added to the 0.99.13 development kernel in 1993.
  35. [35]
    How programs get run: ELF binaries - LWN.net
    Feb 4, 2015 · The ELF (Executable and Linkable Format) format is the main binary format in use on modern Linux systems, and support for it is implemented in ...
  36. [36]
    elf(5) - FreeBSD Manual Pages
    The header file <elf.h> defines the format of ELF executable binary files. Amongst these files are normal executable files, relocatable object files, core ...
  37. [37]
    NetBSD ELF FAQ
    ELF is a binary format designed to support dynamic objects and shared libraries. On older COFF and ECOFF systems, dynamic support and shared libraries were not ...No need for ldconfig or for ld... · My program can't find its...Missing: OpenBSD | Show results with:OpenBSD
  38. [38]
    elf(5) - OpenBSD manual pages
    OpenBSD ELF support first appeared in OpenBSD 1.2. Starting with OpenBSD 5.4, all supported platforms use it as the native binary file format. ELF in itself ...
  39. [39]
    [PDF] elf.pdf - ELF Object File Format
    Sep 4, 2025 · As described here, the object file format supports various processors with 8-bit bytes and either 32-bit or 64-bit architectures. Nevertheless, ...Missing: 1995 | Show results with:1995
  40. [40]
    Identifying Capability Requirements - Oracle® Solaris 11.3 Linkers ...
    System capabilities are the capabilities that describe a running system. The platform name, and machine hardware name can be displayed with uname (1) using ...Missing: illumos | Show results with:illumos
  41. [41]
    Cygwin Package Summary for ELFIO (source)
    Jan 19, 2015 · ELFIO is a C++ library for reading and generating files in the ELF (Executable and Linkable Format) binary format. This library is unique and ...
  42. [42]
    mingw - How can I make GCC generate ELF object files?
    Sep 9, 2018 · I need to use the TCC compiler to link object files generated by GCC. However, GCC in MinGW outputs object files in COFF format, and TCC only supports the ELF ...Building Elf Shared Library with MinGW - c++ - Stack OverflowCompiling C to ELF32 on Windows - Stack OverflowMore results from stackoverflow.com
  43. [43]
    dll/win32/dbghelp/elf_module.c File Reference - ReactOS
    ... internal ELF headers within. 1301 * this thing. We need the main executable header, and the section. 1302 * table. 1303 */. 1304 if (!fmap.u.elf.elf_start ...
  44. [44]
    Native GCC 4.3.3 for Haiku - Tales of updating the GCC4 port ...
    It's the binutils that actually understand the ELF format for example. The good thing about the binutils being separate is that you can update them ...
  45. [45]
    Haiku boot process specification
    Contains both the stage 1.5 boot loader, and the compressed stage 2 loader. It's not an ELF executable file; i.e. it can be directly written to a floppy disk ...
  46. [46]
    [ODF] Introduction to uClinux - Bootlin
    Only implements memory protection, not virtual memory. GOT: Global Offset Table - Used in executable formats. ELF: Executable and Linkable Format
  47. [47]
    Cross-compilation using Clang - LLVM
    This document will guide you in choosing the right Clang options for cross-compiling your code to a different architecture.
  48. [48]
    [PDF] Calling conventions - Agner Fog
    Feb 1, 2023 · The System V ABI for 32-bit Unix does not mention __m256, but ... Windows and 64-bit Linux systems; 0x8048000 for 32-bit Linux; 0x1000 ...
  49. [49]
    Linux Foundation Referenced Specifications
    ELF and ABI Standards​​ The Executable and Linking Format (ELF) Specification describes the widely used executable file format. The Application Binary Interface ...
  50. [50]
    FatELF: Universal Binaries for Linux - icculus.org
    FatELF is a file format that embeds multiple ELF binaries for different architectures into one file. This is the Linux equivalent of what Mac OS X calls ...Missing: 2007 | Show results with:2007
  51. [51]
    Development [LWN.net]
    FatELF: universal binaries for Linux · At the moment, Ryan has written a file format specification and documentation for FatELF. · Later in the discussion, Jeremy ...
  52. [52]
    icculus/fatelf: Universal binaries for Linux. - GitHub
    FatELF is a simple file format that allows you to package several ELF binaries in one file. The most obvious use for this is supplying a single executable that ...Missing: 2007 | Show results with:2007
  53. [53]
    Ryan Gordon Halts FatELF Project - OSnews
    Nov 5, 2009 · FatELF is optional, so i see no problem. Kernels and Packages could still release non fat-elf binaries… and the people that need multiples ...
  54. [54]
    What is WebAssembly?
    The .wasm binary format is lower-level and intended for consumption directly by wasm virtual machines. It is conceptually similar to ELF and Mach-O.
  55. [55]
    WebAssembly lld port - The LLVM Linker
    The WebAssembly lld port takes WebAssembly binaries as input, produces a WebAssembly binary, and emulates the behavior of traditional ELF linkers.
  56. [56]
    D59780 Support Intel Control-flow Enforcement Technology
    Mar 25, 2019 · ... cet works as intended if .note.gnu.property contains several notes. ld -r may merge .note.gnu.property of several input objects into one.
  57. [57]
    Control-flow integrity | MaskRay
    Dec 18, 2022 · A PT_GNU_PROPERTY program header is created to encompass the .note.gnu.property section. If -z gcs-report={warning,error} is specified, the ...
  58. [58]
    RISC-V cryptography extensions standardisation work. - GitHub
    Feb 16, 2024 · This repository is used to develop standardisation proposals for scalar and vector cryptographic instruction set extensions for the RISC-V architecture.
  59. [59]
    Introducing ELF2.0 - Sourceware
    Jan 29, 2025 · ... ELF. How individual target architectures express relocations etc. is within their discretion, again normal ELF. If you think you have a ...