Search code examples
linuxsysv

Linux file command: what does SYSV imply?


I'm digging through two legacy cross-compiled ARM Linux builds. There isn't much documentation other than "use this VM image to build the source" The only difference between the file command output is the presence of "(SYSV)"

# file Executable
Executable: ELF 32-bit LSB executable, ARM, version 1 (SYSV) ...

What should I be able to assume based on the presence or absence of SYSV in the string?


Solution

  • If you see that (SYSV) string, it means the e_ident[EI_OSABI] field in the ELF header is set to 0. From the ELF spec (PDF link):

    Table 5. Operating System and ABI Identifiers, e_ident[EI_OSABI]
    Name                 Value   Meaning
    ELFOSABI_SYSV          0     System V ABI
    ELFOSABI_HPUX          1     HP-UX operating system
    ELFOSABI_STANDALONE   255    Standalone (embedded) application
    

    My local machine's /usr/share/file/magic/elf file has a longer list:

    # Up to now only 0, 1 and 2 are defined; I've seen a file with 0x83, it seemed
    # like proper ELF, but extracting the string had bad results.
    >4      byte            <0x80
    >>8 string      >\0     (%s)
    >8  string      \0
    >>7 byte        0       (SYSV)
    >>7 byte        1       (HP-UX)
    >>7 byte        2       (NetBSD)
    >>7 byte        3       (GNU/Linux)
    >>7 byte        4       (GNU/Hurd)
    >>7 byte        5       (86Open)
    >>7 byte        6       (Solaris)
    >>7 byte        7       (Monterey)
    >>7 byte        8       (IRIX)
    >>7 byte        9       (FreeBSD)
    >>7 byte        10      (Tru64)
    >>7 byte        11      (Novell Modesto)
    >>7 byte        12      (OpenBSD)
    >8      string          \2
    >>7     byte            13              (OpenVMS)
    >>7 byte        97      (ARM)
    >>7 byte        255     (embedded)
    

    Here are the ELF header and offsets for your reference (from this link):

    #define EI_NIDENT 16
    
    typedef struct {
            unsigned char   e_ident[EI_NIDENT];
            Elf32_Half      e_type;
            Elf32_Half      e_machine;
            Elf32_Word      e_version;
            Elf32_Addr      e_entry;
            Elf32_Off       e_phoff;
            Elf32_Off       e_shoff;
            Elf32_Word      e_flags;
            Elf32_Half      e_ehsize;
            Elf32_Half      e_phentsize;
            Elf32_Half      e_phnum;
            Elf32_Half      e_shentsize;
            Elf32_Half      e_shnum;
            Elf32_Half      e_shstrndx;
    } Elf32_Ehdr;
    
    
    Figure 4-4: e_ident[] Identification Indexes
    Name      Value Purpose
    EI_MAG0       0     File identification
    EI_MAG1       1     File identification
    EI_MAG2       2     File identification
    EI_MAG3       3     File identification
    EI_CLASS      4     File class
    EI_DATA       5     Data encoding
    EI_VERSION    6     File version
    EI_OSABI      7     Operating system/ABI identification
    EI_ABIVERSION 8     ABI version
    EI_PAD        9     Start of padding bytes
    EI_NIDENT     16    Size of e_ident[]