common/update/verify_linux_386.go (31 lines of code) (raw):

package update import ( "debug/elf" "fmt" "github.com/aliyun/aliyun_assist_client/agent/util/osutil" ) func ValidateExecutable(executablePath string) error { executable, err := elf.Open(executablePath) if err != nil { return fmt.Errorf("%w: %s", ErrInvalidELF, err.Error()) } if executable.FileHeader.OSABI != elf.ELFOSABI_NONE && executable.FileHeader.OSABI != elf.ELFOSABI_LINUX { return fmt.Errorf("%w: %s", ErrELFUnsupportedOSABI, executable.FileHeader.OSABI.String()) } // There are still some x86 instances running on our cloud and that is why // agent has to be compiled with GOARCH=386 when GOOS=linux. Much careful // handling these instances during updating procedures is neccessary. Thus // machine architecture MUST be obtained before further disscussion. unameMachine, err := osutil.GetUnameMachine() if err != nil { return err } // There are also many names or aliases for machine architectures. Try our // best to match all possible names for correct handling. For possible // values, see https://stackoverflow.com/a/45125525 for a incomplete list. if unameMachine == "i386" || unameMachine == "i686" || unameMachine == "x86" { // 32-bit x86 architecture only accepts 32-bit x86 executables if executable.FileHeader.Machine != elf.EM_386 { return fmt.Errorf("%w: %s", ErrELFUnsupportedArchitecture, executable.FileHeader.Machine.String()) } } else { // Otherwise, looks like happily running on x86_64 architecture if executable.FileHeader.Machine != elf.EM_386 && executable.FileHeader.Machine != elf.EM_X86_64 { return fmt.Errorf("%w: %s", ErrELFUnsupportedArchitecture, executable.FileHeader.Machine.String()) } } return nil }