From 779fa22bd869f8644ba56b6e0e1004d004cb7309 Mon Sep 17 00:00:00 2001 From: Andrea Bolognani Date: Wed, 31 Aug 2022 17:24:07 +0200 Subject: [PATCH 1/2] Accept multiple library directories in ldd.Resolve() Not all libraries are necessarily found in /usr/lib64, even on 64-bit systems. Make it possible to pass a list of directories and only error out if a given library can't be found in any of those. Signed-off-by: Andrea Bolognani --- cmd/ldd.go | 2 +- pkg/ldd/ldd.go | 34 +++++++++++++++++++++++----------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/cmd/ldd.go b/cmd/ldd.go index a5b2dfb..7b4de2d 100644 --- a/cmd/ldd.go +++ b/cmd/ldd.go @@ -48,7 +48,7 @@ func NewLddCmd() *cobra.Command { } files := []string{} - dependencies, err := ldd.Resolve(objects, filepath.Join(tmpRoot, "/usr/lib64")) + dependencies, err := ldd.Resolve(objects, []string{filepath.Join(tmpRoot, "/usr/lib64")}) if err != nil { return err } diff --git a/pkg/ldd/ldd.go b/pkg/ldd/ldd.go index f394cbe..a9abad4 100644 --- a/pkg/ldd/ldd.go +++ b/pkg/ldd/ldd.go @@ -2,11 +2,12 @@ package ldd import ( "debug/elf" + "fmt" "os" "path/filepath" ) -func Resolve(objects []string, library_path string) (finalFiles []string, err error) { +func Resolve(objects []string, library_path []string) (finalFiles []string, err error) { discovered := map[string]struct{}{} for _, obj := range objects { if files, err := resolve(obj, library_path); err != nil { @@ -23,7 +24,7 @@ func Resolve(objects []string, library_path string) (finalFiles []string, err er return } -func resolve(library string, library_path string) ([]string, error) { +func resolve(library string, library_path []string) ([]string, error) { next := []string{library} processed := map[string]struct{}{} @@ -61,7 +62,7 @@ func resolve(library string, library_path string) ([]string, error) { return finalFiles, nil } -func ldd(library string, library_path string) (discovered []string, err error) { +func ldd(library string, library_path []string) (discovered []string, err error) { bin, err := elf.Open(library) if err != nil { return nil, err @@ -71,16 +72,27 @@ func ldd(library string, library_path string) (discovered []string, err error) { return nil, err } for _, l := range libs { - _, err := os.Stat(filepath.Join(library_path, l)) - if err != nil { - return nil, err + found := false + for _, dir := range library_path { + _, err := os.Stat(filepath.Join(dir, l)) + if err != nil { + if os.IsNotExist(err) { + continue + } + return nil, err + } + discovered = append(discovered, filepath.Join(dir, l)) + symlinks, err := followSymlinks(filepath.Join(dir, l)) + if err != nil { + return nil, err + } + discovered = append(discovered, symlinks...) + found = true + break } - discovered = append(discovered, filepath.Join(library_path, l)) - symlinks, err := followSymlinks(filepath.Join(library_path, l)) - if err != nil { - return nil, err + if !found { + return nil, fmt.Errorf("%v not found in any of %v", l, library_path) } - discovered = append(discovered, symlinks...) } return discovered, nil } From 8893816b238f9cf81160c50799f453c916e56d51 Mon Sep 17 00:00:00 2001 From: Andrea Bolognani Date: Wed, 31 Aug 2022 17:28:36 +0200 Subject: [PATCH 2/2] Look for libraries in /usr/lib too On current aarch64 Linux versions such as CentOS Stream 9 and Fedora 36, ld-linux-aarch64.so is found in /usr/lib instead of /usr/lib64. Signed-off-by: Andrea Bolognani --- cmd/ldd.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/ldd.go b/cmd/ldd.go index 7b4de2d..e34c2dc 100644 --- a/cmd/ldd.go +++ b/cmd/ldd.go @@ -48,7 +48,7 @@ func NewLddCmd() *cobra.Command { } files := []string{} - dependencies, err := ldd.Resolve(objects, []string{filepath.Join(tmpRoot, "/usr/lib64")}) + dependencies, err := ldd.Resolve(objects, []string{filepath.Join(tmpRoot, "/usr/lib64"), filepath.Join(tmpRoot, "/usr/lib")}) if err != nil { return err }