github.com/vchain-us/vcn@v0.9.11-0.20210921212052-a2484d23c0b3/pkg/extractor/file/internal/sniff/elf.go (about)

     1  /*
     2   * Copyright (c) 2018-2020 vChain, Inc. All Rights Reserved.
     3   * This software is released under GPL3.
     4   * The full license information can be found under:
     5   * https://www.gnu.org/licenses/gpl-3.0.en.html
     6   *
     7   */
     8  
     9  package sniff
    10  
    11  import (
    12  	"debug/elf"
    13  	"os"
    14  	"strings"
    15  )
    16  
    17  var elfosabiDesc = map[elf.OSABI]string{
    18  	elf.ELFOSABI_HPUX:       "HP-UX operating system",
    19  	elf.ELFOSABI_NETBSD:     "NetBSD",
    20  	elf.ELFOSABI_LINUX:      "GNU/Linux",
    21  	elf.ELFOSABI_HURD:       "GNU/Hurd",
    22  	elf.ELFOSABI_86OPEN:     "86Open common IA32 ABI",
    23  	elf.ELFOSABI_SOLARIS:    "Solaris",
    24  	elf.ELFOSABI_AIX:        "AIX",
    25  	elf.ELFOSABI_IRIX:       "IRIX",
    26  	elf.ELFOSABI_FREEBSD:    "FreeBSD",
    27  	elf.ELFOSABI_TRU64:      "TRU64 UNIX",
    28  	elf.ELFOSABI_MODESTO:    "Novell Modesto",
    29  	elf.ELFOSABI_OPENBSD:    "OpenBSD",
    30  	elf.ELFOSABI_OPENVMS:    "Open VMS",
    31  	elf.ELFOSABI_NSK:        "HP Non-Stop Kernel",
    32  	elf.ELFOSABI_AROS:       "Amiga Research OS",
    33  	elf.ELFOSABI_FENIXOS:    "The FenixOS highly scalable multi-core OS",
    34  	elf.ELFOSABI_CLOUDABI:   "Nuxi CloudABI",
    35  	elf.ELFOSABI_ARM:        "ARM",
    36  	elf.ELFOSABI_STANDALONE: "Standalone (embedded) application",
    37  }
    38  
    39  func ELF(file *os.File) (*Data, error) {
    40  	f, err := elf.NewFile(file)
    41  	if err != nil {
    42  		return nil, err
    43  	}
    44  
    45  	platform := elfosabiDesc[f.OSABI]
    46  	if platform == "" {
    47  		// https://refspecs.linuxfoundation.org/LSB_1.2.0/gLSB/noteabitag.html
    48  		if abiTag := f.Section(".note.ABI-tag"); abiTag != nil {
    49  			if data, err := abiTag.Data(); err == nil && strings.Contains(string(data), "GNU") {
    50  				platform = "GNU/Linux"
    51  			}
    52  		}
    53  	}
    54  
    55  	d := &Data{
    56  		Format:   "ELF",
    57  		Type:     strings.TrimPrefix(f.Type.String(), "ET_"),
    58  		Platform: platform,
    59  		Arch:     strings.TrimPrefix(f.Machine.String(), "EM_"),
    60  		X64:      f.Class == elf.ELFCLASS64,
    61  	}
    62  	return d, nil
    63  }