code reorganisation
This commit is contained in:
parent
a4ee7e7526
commit
5338fc37ed
1 changed files with 0 additions and 117 deletions
|
@ -11,9 +11,6 @@ import (
|
||||||
"debug/elf"
|
"debug/elf"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
u "tools/srcs/common"
|
u "tools/srcs/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -194,114 +191,6 @@ func executeDependAptCache(programName string, data *u.StaticData,
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// getProgramFolder gets the folder path in which the given program is located, according to the
|
|
||||||
// Unikraft standard (e.g., /home/.../apps/programFolder/.../program).
|
|
||||||
//
|
|
||||||
// It returns the folder containing the program files according to the standard described above.
|
|
||||||
func getProgramFolder(programPath string) string {
|
|
||||||
|
|
||||||
tmp := strings.Split(programPath, "/")
|
|
||||||
i := 2
|
|
||||||
|
|
||||||
for ; i < len(tmp); i++ {
|
|
||||||
if tmp[len(tmp)-i] == "apps" {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
folderPath := strings.Join(tmp[:len(tmp)-i+2], "/")
|
|
||||||
return folderPath
|
|
||||||
}
|
|
||||||
|
|
||||||
// findSourcesFiles puts together all C/C++ source files found in a given application folder.
|
|
||||||
//
|
|
||||||
// It returns a slice containing the found source file names and an error if any, otherwise it
|
|
||||||
// returns nil.
|
|
||||||
func findSourcesFiles(workspace string) ([]string, error) {
|
|
||||||
|
|
||||||
var filenames []string
|
|
||||||
|
|
||||||
err := filepath.Walk(workspace,
|
|
||||||
func(path string, info os.FileInfo, err error) error {
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
ext := filepath.Ext(info.Name())
|
|
||||||
if ext == ".c" || ext == ".cpp" || ext == ".cc" || ext == ".h" || ext == ".hpp" ||
|
|
||||||
ext == ".hcc" {
|
|
||||||
filenames = append(filenames, path)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return filenames, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO REPLACE
|
|
||||||
// ExecuteCommand a single command without displaying the output.
|
|
||||||
//
|
|
||||||
// It returns a string which represents stdout and an error if any, otherwise
|
|
||||||
// it returns nil.
|
|
||||||
func ExecuteCommand(command string, arguments []string) (string, error) {
|
|
||||||
out, err := exec.Command(command, arguments...).CombinedOutput()
|
|
||||||
return string(out), err
|
|
||||||
}
|
|
||||||
|
|
||||||
// addSourceFileSymbols adds all the symbols present in 'output' to the static data field in
|
|
||||||
// 'data'.
|
|
||||||
func addSourceFileSymbols(output string, data *u.Data) {
|
|
||||||
outputTab := strings.Split(output, ",")
|
|
||||||
|
|
||||||
// Get the list of system calls
|
|
||||||
systemCalls := initSystemCalls()
|
|
||||||
|
|
||||||
for _, s := range outputTab {
|
|
||||||
if _, isSyscall := systemCalls[s]; isSyscall {
|
|
||||||
data.StaticData.SystemCalls[s] = systemCalls[s]
|
|
||||||
} else {
|
|
||||||
data.StaticData.Symbols[s] = ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// extractPrototype executes the parserClang.py script on each source file to extracts all possible
|
|
||||||
// symbols of each of these files.
|
|
||||||
//
|
|
||||||
// It returns an error if any, otherwise it returns nil.
|
|
||||||
func extractPrototype(sourcesFiltered []string, data *u.Data) error {
|
|
||||||
|
|
||||||
for _, f := range sourcesFiltered {
|
|
||||||
script := filepath.Join(os.Getenv("GOPATH"), "src", "tools", "srcs", "dependtool",
|
|
||||||
"parserClang.py")
|
|
||||||
output, err := ExecuteCommand("python3", []string{script, "-q", "-t", f})
|
|
||||||
if err != nil {
|
|
||||||
u.PrintWarning("Incomplete analysis with file " + f)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
addSourceFileSymbols(output, data)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// gatherSourceFileSymbols gathers symbols of source files from a given application folder.
|
|
||||||
//
|
|
||||||
// It returns an error if any, otherwise it returns nil.
|
|
||||||
func gatherSourceFileSymbols(data *u.Data, programPath string) error {
|
|
||||||
|
|
||||||
sourceFiles, err := findSourcesFiles(getProgramFolder(programPath))
|
|
||||||
if err != nil {
|
|
||||||
u.PrintErr(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := extractPrototype(sourceFiles, data); err != nil {
|
|
||||||
u.PrintErr(err)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------Run-------------------------------------
|
// -------------------------------------Run-------------------------------------
|
||||||
|
|
||||||
// staticAnalyser runs the static analysis to get shared libraries,
|
// staticAnalyser runs the static analysis to get shared libraries,
|
||||||
|
@ -351,12 +240,6 @@ func staticAnalyser(elfFile *elf.File, isDynamic, isLinux bool, args u.Arguments
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Detect symbols from source files
|
|
||||||
u.PrintHeader2("(*) Gathering symbols from source files")
|
|
||||||
if err := gatherSourceFileSymbols(data, programPath); err != nil {
|
|
||||||
u.PrintWarning(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Detect symbols from shared libraries
|
// Detect symbols from shared libraries
|
||||||
if fullStaticAnalysis && isLinux {
|
if fullStaticAnalysis && isLinux {
|
||||||
u.PrintHeader2("(*) Gathering symbols and system calls of shared libraries from binary" +
|
u.PrintHeader2("(*) Gathering symbols and system calls of shared libraries from binary" +
|
||||||
|
|
Loading…
Add table
Reference in a new issue