gaulthiergain-tools/srcs/dependtool/binary_file.go
Gaulthier Gain 597c47c27d Remove nm and readelf subroutines and replace them by elf package API
Signed-off-by: Gaulthier Gain <gaulthier.gain@uliege.be>
2021-05-24 09:54:26 +02:00

96 lines
2.1 KiB
Go

// Copyright 2019 The UNICORE Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file
//
// Author: Gaulthier Gain <gaulthier.gain@uliege.be>
package dependtool
import (
"debug/elf"
"errors"
"os"
)
// getMachOS reads and decodes a Mac os file.
//
// It returns an error if any otherwise it returns nil.
func getMachOS(filename string) error {
f, err := os.Open(filename)
if err != nil {
return err
}
defer f.Close()
// Read and decode MachOS identifier
var ident [16]uint8
if _, err = f.ReadAt(ident[0:], 0); err != nil {
return err
}
if ident[0] != '\xca' || ident[1] != '\xfe' || ident[2] != '\xba' || ident[3] != '\xbe' {
return nil
} else if ident[0] != '\xcf' || ident[1] != '\xfa' || ident[2] != '\xed' || ident[3] != '\xfe' {
return nil
} else if ident[0] != '\xfe' || ident[1] != '\xed' || ident[2] != '\xfa' || ident[3] != '\xcf' {
return nil
}
return errors.New("not compatible machos format")
}
// getElf reads and decodes an ELF file.
//
// It returns a pointer to an ELF file and an error if any, otherwise it
// returns nil.
func getElf(filename string) (*elf.File, error) {
f, err := os.Open(filename)
if err != nil {
return nil, err
}
_elf, err := elf.NewFile(f)
if err != nil {
return nil, err
}
// Read and decode ELF identifier
var ident [16]uint8
_, err = f.ReadAt(ident[0:], 0)
if err != nil {
return nil, err
}
// Check the type
if ident[0] != '\x7f' || ident[1] != 'E' || ident[2] != 'L' || ident[3] != 'F' {
return nil, nil
}
return _elf, nil
}
// GetElfArchitecture gets the ELF architecture.
//
// It returns a string that defines the ELF class and a string that defines the
// Machine type.
func GetElfArchitecture(elf *elf.File) (string, string) {
var arch, mach string
switch elf.Class.String() {
case "ELFCLASS64":
arch = "64 bits"
case "ELFCLASS32":
arch = "32 bits"
}
switch elf.Machine.String() {
case "EM_AARCH64":
mach = "ARM64"
case "EM_386":
mach = "x86"
case "EM_X86_64":
mach = "x86_64"
}
return arch, mach
}