diff --git a/internal/rpicamera/rpicamera.go b/internal/rpicamera/rpicamera.go index 0215bacf..49debbe9 100644 --- a/internal/rpicamera/rpicamera.go +++ b/internal/rpicamera/rpicamera.go @@ -4,6 +4,7 @@ package rpicamera import ( + "debug/elf" _ "embed" "encoding/base64" "fmt" @@ -92,9 +93,6 @@ func findLibrary(name string) (string, error) { for _, line := range strings.Split(string(byts), "\n") { f := strings.Split(line, " => ") if len(f) == 2 && strings.Contains(f[1], name+".so") { - if runtime.GOARCH == "arm" && !strings.Contains(f[1], "arm-linux-gnueabihf") { - return "", fmt.Errorf("libcamera is 64-bit, you need the 64-bit server version") - } return f[1], nil } } @@ -103,12 +101,39 @@ func findLibrary(name string) (string, error) { return "", fmt.Errorf("library '%s' not found", name) } +func check64bit(fpath string) error { + f, err := os.Open(fpath) + if err != nil { + return err + } + defer f.Close() + + ef, err := elf.NewFile(f) + if err != nil { + return err + } + defer ef.Close() + + if ef.FileHeader.Class == elf.ELFCLASS64 { + return fmt.Errorf("libcamera is 64-bit, you need the 64-bit server version") + } + + return nil +} + func setupSymlink(name string) error { lib, err := findLibrary(name) if err != nil { return err } + if runtime.GOARCH == "arm" { + err := check64bit(lib) + if err != nil { + return err + } + } + os.Remove("/dev/shm/" + name + ".so.x.x.x") return os.Symlink(lib, "/dev/shm/"+name+".so.x.x.x") }