From cdc3db8e7209ccf4d1b8101b49ec4c9cfde7cb91 Mon Sep 17 00:00:00 2001 From: Joel Rudsberg Date: Thu, 6 Feb 2025 10:03:34 +0100 Subject: [PATCH] Native Image SBOM: support extracting symbols in .dynsym section for ELF files Signed-off-by: Joel Rudsberg --- .../java/graalvm_native_image_cataloger.go | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/syft/pkg/cataloger/java/graalvm_native_image_cataloger.go b/syft/pkg/cataloger/java/graalvm_native_image_cataloger.go index 96a63955cec..37495128c37 100644 --- a/syft/pkg/cataloger/java/graalvm_native_image_cataloger.go +++ b/syft/pkg/cataloger/java/graalvm_native_image_cataloger.go @@ -251,11 +251,11 @@ func (ni nativeImageElf) fetchPkgs() (pkgs []pkg.Package, relationships []artifa var sbomLength elf.Symbol var svmVersion elf.Symbol - si, err := bi.Symbols() + si, err := ni.getSymbols() if err != nil { - return nil, nil, fmt.Errorf("no symbols found in binary: %w", err) + return nil, nil, err } - if si == nil { + if len(si) == 0 { return nil, nil, errors.New(nativeImageMissingSymbolsError) } for _, s := range si { @@ -286,6 +286,31 @@ func (ni nativeImageElf) fetchPkgs() (pkgs []pkg.Package, relationships []artifa return decompressSbom(data, sbomLocation, lengthLocation) } +// getSymbols obtains the union of the symbols in the .symtab and .dynsym sections of the ELF file +func (ni nativeImageElf) getSymbols() ([]elf.Symbol, error) { + var symbols []elf.Symbol + symsErr := error(nil) + dynErr := error(nil) + + if syms, err := ni.file.Symbols(); err == nil { + symbols = append(symbols, syms...) + } else { + symsErr = err + } + + if dynSyms, err := ni.file.DynamicSymbols(); err == nil { + symbols = append(symbols, dynSyms...) + } else { + dynErr = err + } + + if symsErr != nil && dynErr != nil { + return nil, fmt.Errorf("could not retrieve symbols from binary: SHT_SYMTAB error: %v, SHT_DYNSYM error: %v", symsErr, dynErr) + } + + return symbols, nil +} + // fetchPkgs obtains the packages from a Native Image given as a Mach O file. func (ni nativeImageMachO) fetchPkgs() (pkgs []pkg.Package, relationships []artifact.Relationship, retErr error) { defer func() {