diff --git a/internal/build/build.go b/internal/build/build.go index 2b2ce4f0..b13fac77 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -826,6 +826,7 @@ func linkObjFiles(ctx *context, app string, objFiles, linkArgs []string, verbose if IsDbgSymsEnabled() { buildArgs = append(buildArgs, "-gdwarf-4") } + buildArgs = append(buildArgs, "--cref", "--Map=t.map") buildArgs = append(buildArgs, objFiles...) diff --git a/internal/crosscompile/crosscompile.go b/internal/crosscompile/crosscompile.go index a4581832..79749534 100644 --- a/internal/crosscompile/crosscompile.go +++ b/internal/crosscompile/crosscompile.go @@ -8,11 +8,8 @@ import ( "os/exec" "path/filepath" "runtime" - "slices" "strings" - "github.com/goplus/llgo/internal/clang" - "github.com/goplus/llgo/internal/env" "github.com/goplus/llgo/internal/targets" "github.com/goplus/llgo/internal/xtool/llvm" @@ -218,67 +215,33 @@ func getESPClangPlatform(goos, goarch string) string { return "" } -func getOrCompileLibc(cc, linkerName, libcName string, ccflags, exportLdFlags []string) (ldflags []string, err error) { +func ldFlagsFromFileName(fileName string) string { + return strings.TrimPrefix(strings.TrimSuffix(fileName, ".a"), "lib") +} + +func getOrCompileLibc(cc, linkerName, libcName string, exportCCFlags, exportLDFlags []string) (ldflags []string, err error) { baseDir := filepath.Join(cacheRoot(), "crosscompile") - libcDir := filepath.Join(baseDir, libcName) - libcArchive := filepath.Join(libcDir, "libc.a") - // fast-path: compiled already - if _, err = os.Stat(libcArchive); !os.IsNotExist(err) { - ldflags = append(ldflags, "-nostdlib", "-L", libcDir, "-lc") - return ldflags, nil - } + outputDir := filepath.Join(baseDir, libcName) + compileConfig, err := getCompileLibcConfigByName(baseDir, libcName) if err != nil { return } - tempDir, err := os.MkdirTemp("", "compile*") - if err != nil { + if err = checkDownloadAndExtractLibc(compileConfig, compileConfig.Url, outputDir, compileConfig.ArchiveSrcDir); err != nil { return } - defer os.RemoveAll(tempDir) + ldflags = append(ldflags, "-nostdlib", "-L"+outputDir) - fmt.Fprintf(os.Stderr, "%s not found in LLGO_ROOT or cache, will download and compile.\n", libcDir) - if err = checkDownloadAndExtractLibc(compileConfig.Url, libcDir, compileConfig.ArchiveSrcDir); err != nil { - return - } - compileLDFlags := append(slices.Clone(exportLdFlags), compileConfig.LDFlags...) - - cfg := clang.NewConfig(cc, ccflags, compileConfig.CFlags, compileLDFlags, linkerName) - - var objFiles []string - - compiler := clang.NewCompiler(cfg) - linker := clang.NewLinker(cfg) - - compiler.Verbose = true - linker.Verbose = true - fmt.Fprintf(os.Stderr, "Start to compile libc %s to %s...\n", libcName, libcArchive) - - for _, file := range compileConfig.Files { - var tempObjFile *os.File - tempObjFile, err = os.CreateTemp(tempDir, "libc*.o") + for _, group := range compileConfig.Groups { + err = group.Compile(outputDir, cc, linkerName, exportCCFlags, exportLDFlags) if err != nil { - return + break } - fmt.Fprintf(os.Stderr, "Compile libc file %s to %s...\n", file, tempObjFile.Name()) - - err = compiler.Compile("-o", tempObjFile.Name(), "-x", "c", "-c", file) - if err != nil { - return + if filepath.Ext(group.OutputFileName) == ".o" { + continue } - - objFiles = append(objFiles, tempObjFile.Name()) + ldflags = append(ldflags, "-l"+ldFlagsFromFileName(group.OutputFileName)) } - - args := []string{"-o", libcArchive} - args = append(args, objFiles...) - - err = linker.Link(args...) - if err != nil { - return - } - ldflags = append(ldflags, "-nostdlib", "-L", libcDir, "-lc") - return } diff --git a/internal/crosscompile/fetch.go b/internal/crosscompile/fetch.go index ba000df9..cc676662 100644 --- a/internal/crosscompile/fetch.go +++ b/internal/crosscompile/fetch.go @@ -2,6 +2,7 @@ package crosscompile import ( "archive/tar" + "archive/zip" "compress/gzip" "fmt" "io" @@ -79,9 +80,9 @@ func checkDownloadAndExtractESPClang(platformSuffix, dir string) error { return nil } -func checkDownloadAndExtractLibc(url, dstDir, internalArchiveSrcDir string) error { +func checkDownloadAndExtractLibc(cfg *compileLibcConfig, url, dstDir, internalArchiveSrcDir string) error { // Check if already exists - if _, err := os.Stat(dstDir); err == nil { + if cfg.IsCompiled(dstDir) { return nil } @@ -94,9 +95,10 @@ func checkDownloadAndExtractLibc(url, dstDir, internalArchiveSrcDir string) erro defer releaseLock(lockFile) // Double-check after acquiring lock - if _, err := os.Stat(dstDir); err == nil { + if cfg.IsCompiled(dstDir) { return nil } + fmt.Fprintf(os.Stderr, "%s not found in LLGO_ROOT or cache, will download and compile.\n", dstDir) description := fmt.Sprintf("Libc %s", path.Base(url)) @@ -105,7 +107,7 @@ func checkDownloadAndExtractLibc(url, dstDir, internalArchiveSrcDir string) erro if err := downloadAndExtractArchive(url, tempExtractDir, description); err != nil { return err } - defer os.RemoveAll(tempExtractDir) + // defer os.RemoveAll(tempExtractDir) srcDir := tempExtractDir @@ -182,10 +184,14 @@ func downloadAndExtractArchive(url, destDir, description string) error { if err != nil { return fmt.Errorf("failed to extract %s archive: %w", description, err) } + } else if strings.HasSuffix(filename, ".zip") { + err := extractZip(localFile, tempDir) + if err != nil { + return fmt.Errorf("failed to extract %s archive: %w", description, err) + } } else { return fmt.Errorf("unsupported archive format: %s", filename) } - // Rename temp directory to target directory if err := os.Rename(tempDir, destDir); err != nil { return fmt.Errorf("failed to rename directory: %w", err) @@ -265,3 +271,44 @@ func extractTarXz(tarXzFile, dest string) error { cmd := exec.Command("tar", "-xf", tarXzFile, "-C", dest) return cmd.Run() } + +func extractZip(zipFile, dest string) error { + r, err := zip.OpenReader(zipFile) + if err != nil { + return err + } + defer r.Close() + decompress := func(file *zip.File) error { + path := filepath.Join(dest, file.Name) + + if file.FileInfo().IsDir() { + return os.MkdirAll(path, 0700) + } + + fs, err := file.Open() + if err != nil { + return err + } + defer fs.Close() + + w, err := os.Create(path) + if err != nil { + return err + } + if _, err := io.Copy(w, fs); err != nil { + w.Close() + return err + } + if err := w.Close(); err != nil { + return err + } + return nil + } + + for _, file := range r.File { + if err = decompress(file); err != nil { + break + } + } + return err +} diff --git a/internal/crosscompile/libc.go b/internal/crosscompile/libc.go index 774ea390..d9fe64bc 100644 --- a/internal/crosscompile/libc.go +++ b/internal/crosscompile/libc.go @@ -3,19 +3,101 @@ package crosscompile import ( "fmt" "os" + "os/exec" "path/filepath" + "slices" + "strings" + + "github.com/goplus/llgo/internal/clang" ) +type compileGroup struct { + OutputFileName string + Files []string // List of source files to compile + CFlags []string // C compiler flags specific to this libc + CCFlags []string + LDFlags []string // Linker flags +} + +func (g compileGroup) IsCompiled(outputDir string) bool { + libcArchive := filepath.Join(outputDir, g.OutputFileName) + _, err := os.Stat(libcArchive) + return !os.IsNotExist(err) +} + +func (g compileGroup) Compile(outputDir, cc, linkerName string, extraCCFlags, extraLDFlags []string) (err error) { + if g.IsCompiled(outputDir) { + return + } + tmpCompileDir, err := os.MkdirTemp("", "compile-libc-group*") + if err != nil { + return + } + defer os.RemoveAll(tmpCompileDir) + + compileLDFlags := append(slices.Clone(extraLDFlags), g.LDFlags...) + compileCCFlags := append(slices.Clone(extraCCFlags), g.CCFlags...) + cfg := clang.NewConfig(cc, compileCCFlags, g.CFlags, compileLDFlags, linkerName) + + var objFiles []string + + compiler := clang.NewCompiler(cfg) + + compiler.Verbose = true + + libcArchive := filepath.Join(outputDir, g.OutputFileName) + fmt.Fprintf(os.Stderr, "Start to compile libc group %s to %s...\n", g.OutputFileName, libcArchive) + + for _, file := range g.Files { + var tempObjFile *os.File + tempObjFile, err = os.CreateTemp(tmpCompileDir, fmt.Sprintf("%s*.o", strings.ReplaceAll(file, string(os.PathSeparator), "-"))) + if err != nil { + return + } + fmt.Fprintf(os.Stderr, "Compile libc file %s to %s...\n", file, tempObjFile.Name()) + + lang := "c" + if filepath.Ext(file) == ".S" { + lang = "assembler-with-cpp" + } + err = compiler.Compile("-o", tempObjFile.Name(), "-x", lang, "-c", file) + if err != nil { + return + } + + objFiles = append(objFiles, tempObjFile.Name()) + } + + args := []string{"rcs", libcArchive} + args = append(args, objFiles...) + + ccDir := filepath.Dir(cc) + llvmAr := filepath.Join(ccDir, "llvm-ar") + + cmd := exec.Command(llvmAr, args...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + cmd.Run() + return +} + // CompileLibcConfig represents libc compilation configuration type compileLibcConfig struct { Url string - Name string // Libc name (e.g., "picolibc", "musl", "glibc") - Files []string // List of source files to compile - CFlags []string // C compiler flags specific to this libc - LDFlags []string // Linker flags + Name string // Libc name (e.g., "picolibc", "musl", "glibc") + Groups []compileGroup ArchiveSrcDir string } +func (c compileLibcConfig) IsCompiled(outputDir string) bool { + for _, group := range c.Groups { + if !group.IsCompiled(outputDir) { + return false + } + } + return true +} + // GetCompileLibcConfigByName retrieves libc compilation configuration by name // Returns compilation file lists and corresponding cflags func getCompileLibcConfigByName(baseDir, libcName string) (*compileLibcConfig, error) { @@ -27,159 +109,9 @@ func getCompileLibcConfigByName(baseDir, libcName string) (*compileLibcConfig, e switch libcName { case "picolibc": return getPicolibcConfig(libcDir), nil + case "newlib-esp32": + return getNewlibESP32Config(libcDir, "xtensa"), nil default: return nil, fmt.Errorf("unsupported libc: %s", libcName) } } - -// getPicolibcConfig returns configuration for picolibc -func getPicolibcConfig(baseDir string) *compileLibcConfig { - libcIncludeDir := filepath.Join(baseDir, "libc", "include") - libmIncludeDir := filepath.Join(baseDir, "libm", "common") - localeIncludeDir := filepath.Join(baseDir, "libc", "locale") - - os.MkdirAll(baseDir, 0700) - - headerFile, _ := os.Create(filepath.Join(baseDir, "picolibc.h")) - headerFile.Close() - - return &compileLibcConfig{ - Url: "https://github.com/picolibc/picolibc/releases/download/1.8.10/picolibc-1.8.10.tar.xz", - Name: "picolibc", - Files: []string{ - filepath.Join(baseDir, "libc", "string", "bcmp.c"), - filepath.Join(baseDir, "libc", "string", "bcopy.c"), - filepath.Join(baseDir, "libc", "string", "bzero.c"), - filepath.Join(baseDir, "libc", "string", "explicit_bzero.c"), - filepath.Join(baseDir, "libc", "string", "ffsl.c"), - filepath.Join(baseDir, "libc", "string", "ffsll.c"), - filepath.Join(baseDir, "libc", "string", "fls.c"), - filepath.Join(baseDir, "libc", "string", "flsl.c"), - filepath.Join(baseDir, "libc", "string", "flsll.c"), - filepath.Join(baseDir, "libc", "string", "gnu_basename.c"), - filepath.Join(baseDir, "libc", "string", "index.c"), - filepath.Join(baseDir, "libc", "string", "memccpy.c"), - filepath.Join(baseDir, "libc", "string", "memchr.c"), - filepath.Join(baseDir, "libc", "string", "memcmp.c"), - filepath.Join(baseDir, "libc", "string", "memcpy.c"), - filepath.Join(baseDir, "libc", "string", "memmem.c"), - filepath.Join(baseDir, "libc", "string", "memmove.c"), - filepath.Join(baseDir, "libc", "string", "mempcpy.c"), - filepath.Join(baseDir, "libc", "string", "memrchr.c"), - filepath.Join(baseDir, "libc", "string", "memset.c"), - filepath.Join(baseDir, "libc", "string", "rawmemchr.c"), - filepath.Join(baseDir, "libc", "string", "rindex.c"), - filepath.Join(baseDir, "libc", "string", "stpcpy.c"), - filepath.Join(baseDir, "libc", "string", "stpncpy.c"), - filepath.Join(baseDir, "libc", "string", "strcasecmp.c"), - filepath.Join(baseDir, "libc", "string", "strcasecmp_l.c"), - filepath.Join(baseDir, "libc", "string", "strcasestr.c"), - filepath.Join(baseDir, "libc", "string", "strcat.c"), - filepath.Join(baseDir, "libc", "string", "strchr.c"), - filepath.Join(baseDir, "libc", "string", "strchrnul.c"), - filepath.Join(baseDir, "libc", "string", "strcmp.c"), - filepath.Join(baseDir, "libc", "string", "strcoll.c"), - filepath.Join(baseDir, "libc", "string", "strcoll_l.c"), - filepath.Join(baseDir, "libc", "string", "strcpy.c"), - filepath.Join(baseDir, "libc", "string", "strcspn.c"), - filepath.Join(baseDir, "libc", "string", "strerror_r.c"), - filepath.Join(baseDir, "libc", "string", "strlcat.c"), - filepath.Join(baseDir, "libc", "string", "strlcpy.c"), - filepath.Join(baseDir, "libc", "string", "strlen.c"), - filepath.Join(baseDir, "libc", "string", "strlwr.c"), - filepath.Join(baseDir, "libc", "string", "strncasecmp.c"), - filepath.Join(baseDir, "libc", "string", "strncasecmp_l.c"), - filepath.Join(baseDir, "libc", "string", "strncat.c"), - filepath.Join(baseDir, "libc", "string", "strncmp.c"), - filepath.Join(baseDir, "libc", "string", "strncpy.c"), - filepath.Join(baseDir, "libc", "string", "strndup.c"), - filepath.Join(baseDir, "libc", "string", "strnlen.c"), - filepath.Join(baseDir, "libc", "string", "strnstr.c"), - filepath.Join(baseDir, "libc", "string", "strpbrk.c"), - filepath.Join(baseDir, "libc", "string", "strrchr.c"), - filepath.Join(baseDir, "libc", "string", "strsep.c"), - filepath.Join(baseDir, "libc", "string", "strsignal.c"), - filepath.Join(baseDir, "libc", "string", "strspn.c"), - filepath.Join(baseDir, "libc", "string", "strstr.c"), - filepath.Join(baseDir, "libc", "string", "strtok.c"), - filepath.Join(baseDir, "libc", "string", "strtok_r.c"), - filepath.Join(baseDir, "libc", "string", "strupr.c"), - filepath.Join(baseDir, "libc", "string", "strverscmp.c"), - filepath.Join(baseDir, "libc", "string", "strxfrm.c"), - filepath.Join(baseDir, "libc", "string", "strxfrm_l.c"), - filepath.Join(baseDir, "libc", "string", "swab.c"), - filepath.Join(baseDir, "libc", "string", "timingsafe_bcmp.c"), - filepath.Join(baseDir, "libc", "string", "timingsafe_memcmp.c"), - filepath.Join(baseDir, "libc", "string", "strerror.c"), - filepath.Join(baseDir, "libc", "string", "wcpcpy.c"), - filepath.Join(baseDir, "libc", "string", "wcpncpy.c"), - filepath.Join(baseDir, "libc", "string", "wcscasecmp.c"), - filepath.Join(baseDir, "libc", "string", "wcscasecmp_l.c"), - filepath.Join(baseDir, "libc", "string", "wcscat.c"), - filepath.Join(baseDir, "libc", "string", "wcschr.c"), - filepath.Join(baseDir, "libc", "string", "wcscmp.c"), - filepath.Join(baseDir, "libc", "string", "wcscoll.c"), - filepath.Join(baseDir, "libc", "string", "wcscoll_l.c"), - filepath.Join(baseDir, "libc", "string", "wcscpy.c"), - filepath.Join(baseDir, "libc", "string", "wcscspn.c"), - filepath.Join(baseDir, "libc", "string", "wcsdup.c"), - filepath.Join(baseDir, "libc", "string", "wcslcat.c"), - filepath.Join(baseDir, "libc", "string", "wcslcpy.c"), - filepath.Join(baseDir, "libc", "string", "wcslen.c"), - filepath.Join(baseDir, "libc", "string", "wcsncasecmp.c"), - filepath.Join(baseDir, "libc", "string", "wcsncasecmp_l.c"), - filepath.Join(baseDir, "libc", "string", "wcsncat.c"), - filepath.Join(baseDir, "libc", "string", "wcsncmp.c"), - filepath.Join(baseDir, "libc", "string", "wcsncpy.c"), - filepath.Join(baseDir, "libc", "string", "wcsnlen.c"), - filepath.Join(baseDir, "libc", "string", "wcspbrk.c"), - filepath.Join(baseDir, "libc", "string", "wcsrchr.c"), - filepath.Join(baseDir, "libc", "string", "wcsspn.c"), - filepath.Join(baseDir, "libc", "string", "wcsstr.c"), - filepath.Join(baseDir, "libc", "string", "wcstok.c"), - filepath.Join(baseDir, "libc", "string", "wcswidth.c"), - filepath.Join(baseDir, "libc", "string", "wcsxfrm.c"), - filepath.Join(baseDir, "libc", "string", "wcsxfrm_l.c"), - filepath.Join(baseDir, "libc", "string", "wcwidth.c"), - filepath.Join(baseDir, "libc", "string", "wmemchr.c"), - filepath.Join(baseDir, "libc", "string", "wmemcmp.c"), - filepath.Join(baseDir, "libc", "string", "wmemcpy.c"), - filepath.Join(baseDir, "libc", "string", "wmemmove.c"), - filepath.Join(baseDir, "libc", "string", "wmempcpy.c"), - filepath.Join(baseDir, "libc", "string", "wmemset.c"), - filepath.Join(baseDir, "libc", "string", "xpg_strerror_r.c"), - - filepath.Join(baseDir, "libc", "stdlib", "nano-calloc.c"), - filepath.Join(baseDir, "libc", "stdlib", "nano-malloc.c"), - filepath.Join(baseDir, "libc", "stdlib", "nano-pvalloc.c"), - filepath.Join(baseDir, "libc", "stdlib", "nano-realloc.c"), - filepath.Join(baseDir, "libc", "stdlib", "nano-valloc.c"), - filepath.Join(baseDir, "libc", "stdlib", "rand.c"), - filepath.Join(baseDir, "libc", "stdlib", "srand.c"), - filepath.Join(baseDir, "libc", "stdlib", "nano-free.c"), - - filepath.Join(baseDir, "libc", "tinystdio", "printf.c"), - filepath.Join(baseDir, "libc", "tinystdio", "putchar.c"), - filepath.Join(baseDir, "libc", "tinystdio", "puts.c"), - }, - CFlags: []string{ - "-D_COMPILING_NEWLIB", - "-D_HAVE_ALIAS_ATTRIBUTE", - "-DTINY_STDIO", - "-DPOSIX_IO", - "-DFORMAT_DEFAULT_INTEGER", - "-D_IEEE_LIBM", - "-D__OBSOLETE_MATH_FLOAT=1", - "-D__OBSOLETE_MATH_DOUBLE=0", - "-D_WANT_IO_C99_FORMATS", - "-nostdlib", - "-isystem" + libcIncludeDir, - "-I" + libmIncludeDir, - "-I" + localeIncludeDir, - "-I" + baseDir, - "-I" + filepath.Join(baseDir, "libc", "tinystdio"), - }, - LDFlags: []string{"-nostdlib"}, - ArchiveSrcDir: filepath.Join("picolibc-1.8.10", "newlib"), - } -} diff --git a/internal/crosscompile/newlibesp.go b/internal/crosscompile/newlibesp.go new file mode 100644 index 00000000..d70723f1 --- /dev/null +++ b/internal/crosscompile/newlibesp.go @@ -0,0 +1,990 @@ +package crosscompile + +import ( + "path/filepath" +) + +// getNewlibESP32Config returns configuration for newlib esp32 +func getNewlibESP32Config(baseDir, arch string) *compileLibcConfig { + libcDir := filepath.Join(baseDir, "newlib", "libc") + + // headerFile, _ := os.Create(filepath.Join(baseDir, "picolibc.h")) + // headerFile.Close() + + return &compileLibcConfig{ + Url: "https://github.com/MeteorsLiu/newlib-esp32/archive/refs/heads/esp-4.3.0.zip", + Name: "newlib-esp32", + Groups: []compileGroup{ + { + OutputFileName: "libcrt0.a", + Files: []string{ + filepath.Join(baseDir, "libgloss", "xtensa", "clibrary_init.c"), + filepath.Join(baseDir, "libgloss", "xtensa", "syscalls.c"), + filepath.Join(baseDir, "libgloss", "xtensa", "boards", "esp32", "board.c"), + filepath.Join(baseDir, "libgloss", "xtensa", "crt1-boards.S"), + filepath.Join(baseDir, "libgloss", "xtensa", "sleep.S"), + filepath.Join(baseDir, "libgloss", "xtensa", "window-vectors.S"), + }, + CFlags: []string{ + "-DHAVE_CONFIG_H", + "-D_LIBGLOSS", + "-isystem" + filepath.Join(libcDir, "include"), + "-I" + filepath.Join(baseDir, "libgloss"), + // TODO(MeteorsLiu): support riscv + "-I" + filepath.Join(baseDir, "libgloss", "xtensa", "include"), + "-I" + filepath.Join(baseDir, "libgloss", "xtensa", "boards", "esp32", "include"), + }, + LDFlags: []string{"-nostdlib"}, + CCFlags: []string{ + "-Oz", + }, + }, + { + OutputFileName: "libgloss.a", + Files: []string{ + filepath.Join(baseDir, "libgloss", "libnosys", "chown.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "close.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "environ.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "errno.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "execve.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "fork.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "fstat.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "getpid.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "gettod.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "isatty.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "kill.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "link.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "lseek.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "open.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "read.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "readlink.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "sbrk.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "stat.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "symlink.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "times.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "unlink.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "wait.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "write.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "getentropy.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "_exit.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "getreent.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "time.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "fcntl.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "chdir.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "chmod.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "closedir.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "dirfd.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "ftw.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "getcwd.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "mkdir.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "nftw.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "opendir.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pathconf.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "readdir.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "rewinddir.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "scandir.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "seekdir.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "telldir.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "rename.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "_pthread_cleanup_pop.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "_pthread_cleanup_pop_restore.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "_pthread_cleanup_push.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "_pthread_cleanup_push_defer.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_atfork.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_destroy.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_getaffinity_np.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_getdetachstate.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_getguardsize.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_getinheritsched.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_getschedparam.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_getschedpolicy.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_getscope.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_getstack.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_getstackaddr.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_getstacksize.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_init.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_setaffinity_np.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_setdetachstate.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_setguardsize.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_setinheritsched.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_setschedparam.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_setschedpolicy.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_setscope.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_setstack.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_setstackaddr.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_attr_setstacksize.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_barrier_destroy.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_barrier_init.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_barrier_wait.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_barrierattr_destroy.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_barrierattr_getpshared.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_barrierattr_init.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_barrierattr_setpshared.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_cancel.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_cond_broadcast.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_cond_clockwait.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_cond_destroy.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_cond_init.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_cond_signal.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_cond_timedwait.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_cond_wait.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_condattr_destroy.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_condattr_getclock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_condattr_getpshared.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_condattr_init.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_condattr_setclock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_condattr_setpshared.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_create.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_detach.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_equal.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_exit.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_getaffinity_np.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_getattr_np.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_getconcurrency.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_getcpuclockid.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_getname_np.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_getschedparam.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_getspecific.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_join.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_key_create.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_key_delete.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutex_clocklock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutex_destroy.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutex_getprioceiling.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutex_init.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutex_lock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutex_setprioceiling.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutex_timedlock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutex_trylock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutex_unlock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutexattr_destroy.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutexattr_getprioceiling.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutexattr_getprotocol.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutexattr_getpshared.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutexattr_gettype.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutexattr_init.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutexattr_setprioceiling.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutexattr_setprotocol.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutexattr_setpshared.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_mutexattr_settype.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_once.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_rwlock_clockrdlock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_rwlock_clockwrlock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_rwlock_destroy.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_rwlock_init.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_rwlock_rdlock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_rwlock_timedrdlock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_rwlock_timedwrlock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_rwlock_tryrdlock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_rwlock_trywrlock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_rwlock_unlock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_rwlock_wrlock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_rwlockattr_destroy.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_rwlockattr_getpshared.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_rwlockattr_init.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_rwlockattr_setpshared.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_self.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_setaffinity_np.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_setcancelstate.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_setcanceltype.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_setconcurrency.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_setname_np.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_setschedparam.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_setschedprio.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_setspecific.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_spin_destroy.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_spin_init.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_spin_lock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_spin_trylock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_spin_unlock.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_testcancel.c"), + filepath.Join(baseDir, "libgloss", "libnosys", "pthread_yield.c"), + }, + CFlags: []string{ + "-D__NO_SYSCALLS__", + "-D_NO_GETUT", + "-DHAVE_CONFIG_H", + "-D_LIBC", + "-D_NO_GLOB", + "-D_NO_GETPWENT", + "-D_NO_SIGSET", + "-D__ESP__", + "-D_NO_GETPASS", + "-D_NO_POSIX_SPAWN", + "-DHAVE_FCNTL", + "-DHAVE_BLKSIZE", + "-DHAVE_OPENDIR", + "-D_GNU_SOURCE", + "-D_LIBGLOSS", + "-D_NO_EXECVE", + "-D_NO_GETLOGIN", + "-D_NO_WORDEXP", + "-D_NO_POPEN", + "-DHAVE_RENAME", + "-DGETREENT_PROVIDED", + "-DSIGNAL_PROVIDED", + "-isystem" + filepath.Join(libcDir, "include"), + "-I" + libcDir, + "-I" + filepath.Join(libcDir, "xtensa"), + "-I" + filepath.Join(baseDir, "libgloss"), + // TODO(MeteorsLiu): support riscv + "-I" + filepath.Join(baseDir, "libgloss", "xtensa", "include"), + "-I" + filepath.Join(baseDir, "libgloss", "xtensa", "boards", "esp32", "include"), + }, + LDFlags: []string{"-nostdlib"}, + CCFlags: []string{ + "-Oz", + }, + }, + { + OutputFileName: "libc.a", + Files: []string{ + filepath.Join(libcDir, "argz", "argz_add.c"), + filepath.Join(libcDir, "argz", "argz_add_sep.c"), + filepath.Join(libcDir, "argz", "argz_append.c"), + filepath.Join(libcDir, "argz", "argz_count.c"), + filepath.Join(libcDir, "argz", "argz_create.c"), + filepath.Join(libcDir, "argz", "argz_create_sep.c"), + filepath.Join(libcDir, "argz", "argz_delete.c"), + filepath.Join(libcDir, "argz", "argz_extract.c"), + filepath.Join(libcDir, "argz", "argz_insert.c"), + filepath.Join(libcDir, "argz", "argz_next.c"), + filepath.Join(libcDir, "argz", "argz_replace.c"), + filepath.Join(libcDir, "argz", "argz_stringify.c"), + filepath.Join(libcDir, "argz", "buf_findstr.c"), + filepath.Join(libcDir, "argz", "envz_entry.c"), + filepath.Join(libcDir, "argz", "envz_get.c"), + filepath.Join(libcDir, "argz", "envz_add.c"), + filepath.Join(libcDir, "argz", "envz_remove.c"), + filepath.Join(libcDir, "argz", "envz_merge.c"), + filepath.Join(libcDir, "argz", "envz_strip.c"), + filepath.Join(libcDir, "stdlib", "__adjust.c"), + filepath.Join(libcDir, "stdlib", "__atexit.c"), + filepath.Join(libcDir, "stdlib", "__call_atexit.c"), + filepath.Join(libcDir, "stdlib", "__exp10.c"), + filepath.Join(libcDir, "stdlib", "__ten_mu.c"), + filepath.Join(libcDir, "stdlib", "_Exit.c"), + filepath.Join(libcDir, "stdlib", "abort.c"), + filepath.Join(libcDir, "stdlib", "abs.c"), + filepath.Join(libcDir, "stdlib", "aligned_alloc.c"), + filepath.Join(libcDir, "stdlib", "assert.c"), + filepath.Join(libcDir, "stdlib", "atexit.c"), + filepath.Join(libcDir, "stdlib", "atof.c"), + filepath.Join(libcDir, "stdlib", "atoff.c"), + filepath.Join(libcDir, "stdlib", "atoi.c"), + filepath.Join(libcDir, "stdlib", "atol.c"), + filepath.Join(libcDir, "stdlib", "calloc.c"), + filepath.Join(libcDir, "stdlib", "callocr.c"), + filepath.Join(libcDir, "stdlib", "cfreer.c"), + filepath.Join(libcDir, "stdlib", "div.c"), + filepath.Join(libcDir, "stdlib", "dtoa.c"), + filepath.Join(libcDir, "stdlib", "dtoastub.c"), + filepath.Join(libcDir, "stdlib", "environ.c"), + filepath.Join(libcDir, "stdlib", "envlock.c"), + filepath.Join(libcDir, "stdlib", "eprintf.c"), + filepath.Join(libcDir, "stdlib", "exit.c"), + filepath.Join(libcDir, "stdlib", "freer.c"), + filepath.Join(libcDir, "stdlib", "gdtoa-gethex.c"), + filepath.Join(libcDir, "stdlib", "gdtoa-hexnan.c"), + filepath.Join(libcDir, "stdlib", "getenv.c"), + filepath.Join(libcDir, "stdlib", "getenv_r.c"), + filepath.Join(libcDir, "stdlib", "imaxabs.c"), + filepath.Join(libcDir, "stdlib", "imaxdiv.c"), + filepath.Join(libcDir, "stdlib", "itoa.c"), + filepath.Join(libcDir, "stdlib", "labs.c"), + filepath.Join(libcDir, "stdlib", "ldiv.c"), + filepath.Join(libcDir, "stdlib", "ldtoa.c"), + filepath.Join(libcDir, "stdlib", "gdtoa-ldtoa.c"), + filepath.Join(libcDir, "stdlib", "gdtoa-gdtoa.c"), + filepath.Join(libcDir, "stdlib", "gdtoa-dmisc.c"), + filepath.Join(libcDir, "stdlib", "gdtoa-gmisc.c"), + filepath.Join(libcDir, "stdlib", "mallinfor.c"), + filepath.Join(libcDir, "stdlib", "malloc.c"), + filepath.Join(libcDir, "stdlib", "mallocr.c"), + filepath.Join(libcDir, "stdlib", "mallstatsr.c"), + filepath.Join(libcDir, "stdlib", "mblen.c"), + filepath.Join(libcDir, "stdlib", "mblen_r.c"), + filepath.Join(libcDir, "stdlib", "mbstowcs.c"), + filepath.Join(libcDir, "stdlib", "mbstowcs_r.c"), + filepath.Join(libcDir, "stdlib", "mbtowc.c"), + filepath.Join(libcDir, "stdlib", "mbtowc_r.c"), + filepath.Join(libcDir, "stdlib", "mlock.c"), + filepath.Join(libcDir, "stdlib", "mprec.c"), + filepath.Join(libcDir, "stdlib", "msizer.c"), + filepath.Join(libcDir, "stdlib", "mstats.c"), + filepath.Join(libcDir, "stdlib", "on_exit_args.c"), + filepath.Join(libcDir, "stdlib", "quick_exit.c"), + filepath.Join(libcDir, "stdlib", "rand.c"), + filepath.Join(libcDir, "stdlib", "rand_r.c"), + filepath.Join(libcDir, "stdlib", "random.c"), + filepath.Join(libcDir, "stdlib", "realloc.c"), + filepath.Join(libcDir, "stdlib", "reallocarray.c"), + filepath.Join(libcDir, "stdlib", "reallocf.c"), + filepath.Join(libcDir, "stdlib", "reallocr.c"), + filepath.Join(libcDir, "stdlib", "sb_charsets.c"), + filepath.Join(libcDir, "stdlib", "strtod.c"), + filepath.Join(libcDir, "stdlib", "strtoimax.c"), + filepath.Join(libcDir, "stdlib", "strtol.c"), + filepath.Join(libcDir, "stdlib", "strtoul.c"), + filepath.Join(libcDir, "stdlib", "strtoumax.c"), + filepath.Join(libcDir, "stdlib", "utoa.c"), + filepath.Join(libcDir, "stdlib", "wcstod.c"), + filepath.Join(libcDir, "stdlib", "wcstoimax.c"), + filepath.Join(libcDir, "stdlib", "wcstol.c"), + filepath.Join(libcDir, "stdlib", "wcstoul.c"), + filepath.Join(libcDir, "stdlib", "wcstoumax.c"), + filepath.Join(libcDir, "stdlib", "wcstombs.c"), + filepath.Join(libcDir, "stdlib", "wcstombs_r.c"), + filepath.Join(libcDir, "stdlib", "wctomb.c"), + filepath.Join(libcDir, "stdlib", "wctomb_r.c"), + filepath.Join(libcDir, "stdlib", "strtodg.c"), + filepath.Join(libcDir, "stdlib", "strtold.c"), + filepath.Join(libcDir, "stdlib", "strtorx.c"), + filepath.Join(libcDir, "stdlib", "wcstold.c"), + filepath.Join(libcDir, "stdlib", "arc4random.c"), + filepath.Join(libcDir, "stdlib", "arc4random_uniform.c"), + filepath.Join(libcDir, "stdlib", "cxa_atexit.c"), + filepath.Join(libcDir, "stdlib", "cxa_finalize.c"), + filepath.Join(libcDir, "stdlib", "drand48.c"), + filepath.Join(libcDir, "stdlib", "ecvtbuf.c"), + filepath.Join(libcDir, "stdlib", "efgcvt.c"), + filepath.Join(libcDir, "stdlib", "erand48.c"), + filepath.Join(libcDir, "stdlib", "jrand48.c"), + filepath.Join(libcDir, "stdlib", "lcong48.c"), + filepath.Join(libcDir, "stdlib", "lrand48.c"), + filepath.Join(libcDir, "stdlib", "mrand48.c"), + filepath.Join(libcDir, "stdlib", "msize.c"), + filepath.Join(libcDir, "stdlib", "mtrim.c"), + filepath.Join(libcDir, "stdlib", "nrand48.c"), + filepath.Join(libcDir, "stdlib", "rand48.c"), + filepath.Join(libcDir, "stdlib", "seed48.c"), + filepath.Join(libcDir, "stdlib", "srand48.c"), + filepath.Join(libcDir, "stdlib", "strtoll.c"), + filepath.Join(libcDir, "stdlib", "strtoll_r.c"), + filepath.Join(libcDir, "stdlib", "strtoull.c"), + filepath.Join(libcDir, "stdlib", "strtoull_r.c"), + filepath.Join(libcDir, "stdlib", "wcstoll.c"), + filepath.Join(libcDir, "stdlib", "wcstoll_r.c"), + filepath.Join(libcDir, "stdlib", "wcstoull.c"), + filepath.Join(libcDir, "stdlib", "wcstoull_r.c"), + filepath.Join(libcDir, "stdlib", "atoll.c"), + filepath.Join(libcDir, "stdlib", "llabs.c"), + filepath.Join(libcDir, "stdlib", "lldiv.c"), + filepath.Join(libcDir, "stdlib", "a64l.c"), + filepath.Join(libcDir, "stdlib", "btowc.c"), + filepath.Join(libcDir, "stdlib", "getopt.c"), + filepath.Join(libcDir, "stdlib", "getsubopt.c"), + filepath.Join(libcDir, "stdlib", "l64a.c"), + filepath.Join(libcDir, "stdlib", "malign.c"), + filepath.Join(libcDir, "stdlib", "malignr.c"), + filepath.Join(libcDir, "stdlib", "malloptr.c"), + filepath.Join(libcDir, "stdlib", "mbrlen.c"), + filepath.Join(libcDir, "stdlib", "mbrtowc.c"), + filepath.Join(libcDir, "stdlib", "mbsinit.c"), + filepath.Join(libcDir, "stdlib", "mbsnrtowcs.c"), + filepath.Join(libcDir, "stdlib", "mbsrtowcs.c"), + filepath.Join(libcDir, "stdlib", "on_exit.c"), + filepath.Join(libcDir, "stdlib", "pvallocr.c"), + filepath.Join(libcDir, "stdlib", "valloc.c"), + filepath.Join(libcDir, "stdlib", "vallocr.c"), + filepath.Join(libcDir, "stdlib", "wcrtomb.c"), + filepath.Join(libcDir, "stdlib", "wcsnrtombs.c"), + filepath.Join(libcDir, "stdlib", "wcsrtombs.c"), + filepath.Join(libcDir, "stdlib", "wctob.c"), + filepath.Join(libcDir, "stdlib", "putenv.c"), + filepath.Join(libcDir, "stdlib", "putenv_r.c"), + filepath.Join(libcDir, "stdlib", "setenv.c"), + filepath.Join(libcDir, "stdlib", "setenv_r.c"), + filepath.Join(libcDir, "stdlib", "rpmatch.c"), + filepath.Join(libcDir, "stdlib", "system.c"), + filepath.Join(libcDir, "ctype", "ctype_.c"), + filepath.Join(libcDir, "ctype", "isalnum.c"), + filepath.Join(libcDir, "ctype", "isalpha.c"), + filepath.Join(libcDir, "ctype", "iscntrl.c"), + filepath.Join(libcDir, "ctype", "isdigit.c"), + filepath.Join(libcDir, "ctype", "islower.c"), + filepath.Join(libcDir, "ctype", "isupper.c"), + filepath.Join(libcDir, "ctype", "isprint.c"), + filepath.Join(libcDir, "ctype", "ispunct.c"), + filepath.Join(libcDir, "ctype", "isspace.c"), + filepath.Join(libcDir, "ctype", "isxdigit.c"), + filepath.Join(libcDir, "ctype", "tolower.c"), + filepath.Join(libcDir, "ctype", "toupper.c"), + filepath.Join(libcDir, "ctype", "categories.c"), + filepath.Join(libcDir, "ctype", "isalnum_l.c"), + filepath.Join(libcDir, "ctype", "isalpha_l.c"), + filepath.Join(libcDir, "ctype", "isascii.c"), + filepath.Join(libcDir, "ctype", "isascii_l.c"), + filepath.Join(libcDir, "ctype", "isblank.c"), + filepath.Join(libcDir, "ctype", "isblank_l.c"), + filepath.Join(libcDir, "ctype", "iscntrl_l.c"), + filepath.Join(libcDir, "ctype", "isdigit_l.c"), + filepath.Join(libcDir, "ctype", "islower_l.c"), + filepath.Join(libcDir, "ctype", "isupper_l.c"), + filepath.Join(libcDir, "ctype", "isprint_l.c"), + filepath.Join(libcDir, "ctype", "ispunct_l.c"), + filepath.Join(libcDir, "ctype", "isspace_l.c"), + filepath.Join(libcDir, "ctype", "iswalnum.c"), + filepath.Join(libcDir, "ctype", "iswalnum_l.c"), + filepath.Join(libcDir, "ctype", "iswalpha.c"), + filepath.Join(libcDir, "ctype", "iswalpha_l.c"), + filepath.Join(libcDir, "ctype", "iswblank.c"), + filepath.Join(libcDir, "ctype", "iswblank_l.c"), + filepath.Join(libcDir, "ctype", "iswcntrl.c"), + filepath.Join(libcDir, "ctype", "iswcntrl_l.c"), + filepath.Join(libcDir, "ctype", "iswctype.c"), + filepath.Join(libcDir, "ctype", "iswctype_l.c"), + filepath.Join(libcDir, "ctype", "iswdigit.c"), + filepath.Join(libcDir, "ctype", "iswdigit_l.c"), + filepath.Join(libcDir, "ctype", "iswgraph.c"), + filepath.Join(libcDir, "ctype", "iswgraph_l.c"), + filepath.Join(libcDir, "ctype", "iswlower.c"), + filepath.Join(libcDir, "ctype", "iswlower_l.c"), + filepath.Join(libcDir, "ctype", "iswprint.c"), + filepath.Join(libcDir, "ctype", "iswprint_l.c"), + filepath.Join(libcDir, "ctype", "iswpunct.c"), + filepath.Join(libcDir, "ctype", "iswpunct_l.c"), + filepath.Join(libcDir, "ctype", "iswspace.c"), + filepath.Join(libcDir, "ctype", "iswspace_l.c"), + filepath.Join(libcDir, "ctype", "iswupper.c"), + filepath.Join(libcDir, "ctype", "iswupper_l.c"), + filepath.Join(libcDir, "ctype", "iswxdigit.c"), + filepath.Join(libcDir, "ctype", "iswxdigit_l.c"), + filepath.Join(libcDir, "ctype", "isxdigit_l.c"), + filepath.Join(libcDir, "ctype", "jp2uc.c"), + filepath.Join(libcDir, "ctype", "toascii.c"), + filepath.Join(libcDir, "ctype", "toascii_l.c"), + filepath.Join(libcDir, "ctype", "tolower_l.c"), + filepath.Join(libcDir, "ctype", "toupper_l.c"), + filepath.Join(libcDir, "ctype", "towctrans.c"), + filepath.Join(libcDir, "ctype", "towctrans_l.c"), + filepath.Join(libcDir, "ctype", "towlower.c"), + filepath.Join(libcDir, "ctype", "towlower_l.c"), + filepath.Join(libcDir, "ctype", "towupper.c"), + filepath.Join(libcDir, "ctype", "towupper_l.c"), + filepath.Join(libcDir, "ctype", "wctrans.c"), + filepath.Join(libcDir, "ctype", "wctrans_l.c"), + filepath.Join(libcDir, "ctype", "wctype.c"), + filepath.Join(libcDir, "ctype", "wctype_l.c"), + filepath.Join(libcDir, "search", "bsearch.c"), + filepath.Join(libcDir, "search", "ndbm.c"), + filepath.Join(libcDir, "search", "qsort.c"), + filepath.Join(libcDir, "search", "hash.c"), + filepath.Join(libcDir, "search", "hash_bigkey.c"), + filepath.Join(libcDir, "search", "hash_buf.c"), + filepath.Join(libcDir, "search", "hash_func.c"), + filepath.Join(libcDir, "search", "hash_log2.c"), + filepath.Join(libcDir, "search", "hash_page.c"), + filepath.Join(libcDir, "search", "hcreate.c"), + filepath.Join(libcDir, "search", "hcreate_r.c"), + filepath.Join(libcDir, "search", "tdelete.c"), + filepath.Join(libcDir, "search", "tdestroy.c"), + filepath.Join(libcDir, "search", "tfind.c"), + filepath.Join(libcDir, "search", "tsearch.c"), + filepath.Join(libcDir, "search", "twalk.c"), + filepath.Join(libcDir, "search", "bsd_qsort_r.c"), + filepath.Join(libcDir, "search", "qsort_r.c"), + filepath.Join(libcDir, "stdio", "nano-vfprintf_float.c"), + filepath.Join(libcDir, "stdio", "nano-svfprintf.c"), + filepath.Join(libcDir, "stdio", "nano-svfscanf.c"), + filepath.Join(libcDir, "stdio", "nano-vfprintf.c"), + filepath.Join(libcDir, "stdio", "nano-vfprintf_i.c"), + filepath.Join(libcDir, "stdio", "nano-vfscanf.c"), + filepath.Join(libcDir, "stdio", "nano-vfscanf_i.c"), + filepath.Join(libcDir, "stdio", "nano-vfscanf_float.c"), + filepath.Join(libcDir, "stdio", "clearerr.c"), + filepath.Join(libcDir, "stdio", "fclose.c"), + filepath.Join(libcDir, "stdio", "fdopen.c"), + filepath.Join(libcDir, "stdio", "feof.c"), + filepath.Join(libcDir, "stdio", "ferror.c"), + filepath.Join(libcDir, "stdio", "fflush.c"), + filepath.Join(libcDir, "stdio", "fgetc.c"), + filepath.Join(libcDir, "stdio", "fgetpos.c"), + filepath.Join(libcDir, "stdio", "fgets.c"), + filepath.Join(libcDir, "stdio", "fileno.c"), + filepath.Join(libcDir, "stdio", "findfp.c"), + filepath.Join(libcDir, "stdio", "flags.c"), + filepath.Join(libcDir, "stdio", "fopen.c"), + filepath.Join(libcDir, "stdio", "fprintf.c"), + filepath.Join(libcDir, "stdio", "fputc.c"), + filepath.Join(libcDir, "stdio", "fputs.c"), + filepath.Join(libcDir, "stdio", "fread.c"), + filepath.Join(libcDir, "stdio", "freopen.c"), + filepath.Join(libcDir, "stdio", "fscanf.c"), + filepath.Join(libcDir, "stdio", "fseek.c"), + filepath.Join(libcDir, "stdio", "fsetpos.c"), + filepath.Join(libcDir, "stdio", "ftell.c"), + filepath.Join(libcDir, "stdio", "fvwrite.c"), + filepath.Join(libcDir, "stdio", "fwalk.c"), + filepath.Join(libcDir, "stdio", "fwrite.c"), + filepath.Join(libcDir, "stdio", "getc.c"), + filepath.Join(libcDir, "stdio", "getchar.c"), + filepath.Join(libcDir, "stdio", "getc_u.c"), + filepath.Join(libcDir, "stdio", "getchar_u.c"), + filepath.Join(libcDir, "stdio", "getdelim.c"), + filepath.Join(libcDir, "stdio", "getline.c"), + filepath.Join(libcDir, "stdio", "gets.c"), + filepath.Join(libcDir, "stdio", "makebuf.c"), + filepath.Join(libcDir, "stdio", "perror.c"), + filepath.Join(libcDir, "stdio", "printf.c"), + filepath.Join(libcDir, "stdio", "putc.c"), + filepath.Join(libcDir, "stdio", "putchar.c"), + filepath.Join(libcDir, "stdio", "putc_u.c"), + filepath.Join(libcDir, "stdio", "putchar_u.c"), + filepath.Join(libcDir, "stdio", "puts.c"), + filepath.Join(libcDir, "stdio", "refill.c"), + filepath.Join(libcDir, "stdio", "remove.c"), + filepath.Join(libcDir, "stdio", "rename.c"), + filepath.Join(libcDir, "stdio", "rewind.c"), + filepath.Join(libcDir, "stdio", "rget.c"), + filepath.Join(libcDir, "stdio", "scanf.c"), + filepath.Join(libcDir, "stdio", "sccl.c"), + filepath.Join(libcDir, "stdio", "setbuf.c"), + filepath.Join(libcDir, "stdio", "setbuffer.c"), + filepath.Join(libcDir, "stdio", "setlinebuf.c"), + filepath.Join(libcDir, "stdio", "setvbuf.c"), + filepath.Join(libcDir, "stdio", "snprintf.c"), + filepath.Join(libcDir, "stdio", "sprintf.c"), + filepath.Join(libcDir, "stdio", "sscanf.c"), + filepath.Join(libcDir, "stdio", "stdio.c"), + filepath.Join(libcDir, "stdio", "svfiwprintf.c"), + filepath.Join(libcDir, "stdio", "svfiwscanf.c"), + filepath.Join(libcDir, "stdio", "svfwprintf.c"), + filepath.Join(libcDir, "stdio", "svfwscanf.c"), + filepath.Join(libcDir, "stdio", "tmpfile.c"), + filepath.Join(libcDir, "stdio", "tmpnam.c"), + filepath.Join(libcDir, "stdio", "ungetc.c"), + filepath.Join(libcDir, "stdio", "vdprintf.c"), + filepath.Join(libcDir, "stdio", "vfiwprintf.c"), + filepath.Join(libcDir, "stdio", "vfiwscanf.c"), + filepath.Join(libcDir, "stdio", "vfwscanf.c"), + filepath.Join(libcDir, "stdio", "vprintf.c"), + filepath.Join(libcDir, "stdio", "vscanf.c"), + filepath.Join(libcDir, "stdio", "vsnprintf.c"), + filepath.Join(libcDir, "stdio", "vsprintf.c"), + filepath.Join(libcDir, "stdio", "vsscanf.c"), + filepath.Join(libcDir, "stdio", "wbuf.c"), + filepath.Join(libcDir, "stdio", "wsetup.c"), + filepath.Join(libcDir, "stdio", "asprintf.c"), + filepath.Join(libcDir, "stdio", "fcloseall.c"), + filepath.Join(libcDir, "stdio", "fseeko.c"), + filepath.Join(libcDir, "stdio", "ftello.c"), + filepath.Join(libcDir, "stdio", "getw.c"), + filepath.Join(libcDir, "stdio", "mktemp.c"), + filepath.Join(libcDir, "stdio", "putw.c"), + filepath.Join(libcDir, "stdio", "vasprintf.c"), + filepath.Join(libcDir, "stdio", "asnprintf.c"), + filepath.Join(libcDir, "stdio", "clearerr_u.c"), + filepath.Join(libcDir, "stdio", "dprintf.c"), + filepath.Join(libcDir, "stdio", "feof_u.c"), + filepath.Join(libcDir, "stdio", "ferror_u.c"), + filepath.Join(libcDir, "stdio", "fflush_u.c"), + filepath.Join(libcDir, "stdio", "fgetc_u.c"), + filepath.Join(libcDir, "stdio", "fgets_u.c"), + filepath.Join(libcDir, "stdio", "fgetwc.c"), + filepath.Join(libcDir, "stdio", "fgetwc_u.c"), + filepath.Join(libcDir, "stdio", "fgetws.c"), + filepath.Join(libcDir, "stdio", "fgetws_u.c"), + filepath.Join(libcDir, "stdio", "fileno_u.c"), + filepath.Join(libcDir, "stdio", "fmemopen.c"), + filepath.Join(libcDir, "stdio", "fopencookie.c"), + filepath.Join(libcDir, "stdio", "fpurge.c"), + filepath.Join(libcDir, "stdio", "fputc_u.c"), + filepath.Join(libcDir, "stdio", "fputs_u.c"), + filepath.Join(libcDir, "stdio", "fputwc.c"), + filepath.Join(libcDir, "stdio", "fputwc_u.c"), + filepath.Join(libcDir, "stdio", "fputws.c"), + filepath.Join(libcDir, "stdio", "fputws_u.c"), + filepath.Join(libcDir, "stdio", "fread_u.c"), + filepath.Join(libcDir, "stdio", "fsetlocking.c"), + filepath.Join(libcDir, "stdio", "funopen.c"), + filepath.Join(libcDir, "stdio", "fwide.c"), + filepath.Join(libcDir, "stdio", "fwprintf.c"), + filepath.Join(libcDir, "stdio", "fwrite_u.c"), + filepath.Join(libcDir, "stdio", "fwscanf.c"), + filepath.Join(libcDir, "stdio", "getwc.c"), + filepath.Join(libcDir, "stdio", "getwc_u.c"), + filepath.Join(libcDir, "stdio", "getwchar.c"), + filepath.Join(libcDir, "stdio", "getwchar_u.c"), + filepath.Join(libcDir, "stdio", "open_memstream.c"), + filepath.Join(libcDir, "stdio", "putwc.c"), + filepath.Join(libcDir, "stdio", "putwc_u.c"), + filepath.Join(libcDir, "stdio", "putwchar.c"), + filepath.Join(libcDir, "stdio", "putwchar_u.c"), + filepath.Join(libcDir, "stdio", "stdio_ext.c"), + filepath.Join(libcDir, "stdio", "swprintf.c"), + filepath.Join(libcDir, "stdio", "swscanf.c"), + filepath.Join(libcDir, "stdio", "ungetwc.c"), + filepath.Join(libcDir, "stdio", "vasnprintf.c"), + filepath.Join(libcDir, "stdio", "vswprintf.c"), + filepath.Join(libcDir, "stdio", "vswscanf.c"), + filepath.Join(libcDir, "stdio", "vwprintf.c"), + filepath.Join(libcDir, "stdio", "vwscanf.c"), + filepath.Join(libcDir, "stdio", "wprintf.c"), + filepath.Join(libcDir, "stdio", "wscanf.c"), + filepath.Join(libcDir, "string", "bcopy.c"), + filepath.Join(libcDir, "string", "bzero.c"), + filepath.Join(libcDir, "string", "explicit_bzero.c"), + filepath.Join(libcDir, "string", "ffsl.c"), + filepath.Join(libcDir, "string", "ffsll.c"), + filepath.Join(libcDir, "string", "fls.c"), + filepath.Join(libcDir, "string", "flsl.c"), + filepath.Join(libcDir, "string", "flsll.c"), + filepath.Join(libcDir, "string", "index.c"), + filepath.Join(libcDir, "string", "memchr.c"), + filepath.Join(libcDir, "string", "memcmp.c"), + filepath.Join(libcDir, "string", "memmove.c"), + filepath.Join(libcDir, "string", "rindex.c"), + filepath.Join(libcDir, "string", "strcasecmp.c"), + filepath.Join(libcDir, "string", "strcat.c"), + filepath.Join(libcDir, "string", "strchr.c"), + filepath.Join(libcDir, "string", "strcoll.c"), + filepath.Join(libcDir, "string", "strcspn.c"), + filepath.Join(libcDir, "string", "strdup.c"), + filepath.Join(libcDir, "string", "strdup_r.c"), + filepath.Join(libcDir, "string", "strerror.c"), + filepath.Join(libcDir, "string", "strerror_r.c"), + filepath.Join(libcDir, "string", "strlcat.c"), + filepath.Join(libcDir, "string", "strlcpy.c"), + filepath.Join(libcDir, "string", "strlwr.c"), + filepath.Join(libcDir, "string", "strncasecmp.c"), + filepath.Join(libcDir, "string", "strncat.c"), + filepath.Join(libcDir, "string", "strncmp.c"), + filepath.Join(libcDir, "string", "strnlen.c"), + filepath.Join(libcDir, "string", "strnstr.c"), + filepath.Join(libcDir, "string", "strpbrk.c"), + filepath.Join(libcDir, "string", "strrchr.c"), + filepath.Join(libcDir, "string", "strsep.c"), + filepath.Join(libcDir, "string", "strsignal.c"), + filepath.Join(libcDir, "string", "strspn.c"), + filepath.Join(libcDir, "string", "strtok.c"), + filepath.Join(libcDir, "string", "strtok_r.c"), + filepath.Join(libcDir, "string", "strupr.c"), + filepath.Join(libcDir, "string", "strxfrm.c"), + filepath.Join(libcDir, "string", "strstr.c"), + filepath.Join(libcDir, "string", "swab.c"), + filepath.Join(libcDir, "string", "timingsafe_bcmp.c"), + filepath.Join(libcDir, "string", "timingsafe_memcmp.c"), + filepath.Join(libcDir, "string", "u_strerr.c"), + filepath.Join(libcDir, "string", "wcscat.c"), + filepath.Join(libcDir, "string", "wcschr.c"), + filepath.Join(libcDir, "string", "wcscmp.c"), + filepath.Join(libcDir, "string", "wcscoll.c"), + filepath.Join(libcDir, "string", "wcscpy.c"), + filepath.Join(libcDir, "string", "wcscspn.c"), + filepath.Join(libcDir, "string", "wcslcat.c"), + filepath.Join(libcDir, "string", "wcslcpy.c"), + filepath.Join(libcDir, "string", "wcslen.c"), + filepath.Join(libcDir, "string", "wcsncat.c"), + filepath.Join(libcDir, "string", "wcsncmp.c"), + filepath.Join(libcDir, "string", "wcsncpy.c"), + filepath.Join(libcDir, "string", "wcsnlen.c"), + filepath.Join(libcDir, "string", "wcspbrk.c"), + filepath.Join(libcDir, "string", "wcsrchr.c"), + filepath.Join(libcDir, "string", "wcsspn.c"), + filepath.Join(libcDir, "string", "wcsstr.c"), + filepath.Join(libcDir, "string", "wcstok.c"), + filepath.Join(libcDir, "string", "wcswidth.c"), + filepath.Join(libcDir, "string", "wcsxfrm.c"), + filepath.Join(libcDir, "string", "wcwidth.c"), + filepath.Join(libcDir, "string", "wmemchr.c"), + filepath.Join(libcDir, "string", "wmemcmp.c"), + filepath.Join(libcDir, "string", "wmemcpy.c"), + filepath.Join(libcDir, "string", "wmemmove.c"), + filepath.Join(libcDir, "string", "wmemset.c"), + filepath.Join(libcDir, "string", "xpg_strerror_r.c"), + filepath.Join(libcDir, "string", "bcmp.c"), + filepath.Join(libcDir, "string", "memccpy.c"), + filepath.Join(libcDir, "string", "mempcpy.c"), + filepath.Join(libcDir, "string", "stpcpy.c"), + filepath.Join(libcDir, "string", "stpncpy.c"), + filepath.Join(libcDir, "string", "strndup.c"), + filepath.Join(libcDir, "string", "strcasestr.c"), + filepath.Join(libcDir, "string", "strchrnul.c"), + filepath.Join(libcDir, "string", "strndup_r.c"), + filepath.Join(libcDir, "string", "wcpcpy.c"), + filepath.Join(libcDir, "string", "wcpncpy.c"), + filepath.Join(libcDir, "string", "wcsdup.c"), + filepath.Join(libcDir, "string", "gnu_basename.c"), + filepath.Join(libcDir, "string", "memmem.c"), + filepath.Join(libcDir, "string", "memrchr.c"), + filepath.Join(libcDir, "string", "rawmemchr.c"), + filepath.Join(libcDir, "string", "strcasecmp_l.c"), + filepath.Join(libcDir, "string", "strcoll_l.c"), + filepath.Join(libcDir, "string", "strncasecmp_l.c"), + filepath.Join(libcDir, "string", "strverscmp.c"), + filepath.Join(libcDir, "string", "strxfrm_l.c"), + filepath.Join(libcDir, "string", "wcscasecmp.c"), + filepath.Join(libcDir, "string", "wcscasecmp_l.c"), + filepath.Join(libcDir, "string", "wcscoll_l.c"), + filepath.Join(libcDir, "string", "wcsncasecmp.c"), + filepath.Join(libcDir, "string", "wcsncasecmp_l.c"), + filepath.Join(libcDir, "string", "wcsxfrm_l.c"), + filepath.Join(libcDir, "string", "wmempcpy.c"), + filepath.Join(libcDir, "signal", "psignal.c"), + filepath.Join(libcDir, "signal", "raise.c"), + filepath.Join(libcDir, "signal", "signal.c"), + filepath.Join(libcDir, "signal", "sig2str.c"), + filepath.Join(libcDir, "time", "asctime.c"), + filepath.Join(libcDir, "time", "asctime_r.c"), + filepath.Join(libcDir, "time", "clock.c"), + filepath.Join(libcDir, "time", "ctime.c"), + filepath.Join(libcDir, "time", "ctime_r.c"), + filepath.Join(libcDir, "time", "difftime.c"), + filepath.Join(libcDir, "time", "gettzinfo.c"), + filepath.Join(libcDir, "time", "gmtime.c"), + filepath.Join(libcDir, "time", "gmtime_r.c"), + filepath.Join(libcDir, "time", "lcltime.c"), + filepath.Join(libcDir, "time", "lcltime_r.c"), + filepath.Join(libcDir, "time", "mktime.c"), + filepath.Join(libcDir, "time", "month_lengths.c"), + filepath.Join(libcDir, "time", "strftime.c"), + filepath.Join(libcDir, "time", "strptime.c"), + filepath.Join(libcDir, "time", "time.c"), + filepath.Join(libcDir, "time", "tzcalc_limits.c"), + filepath.Join(libcDir, "time", "tzlock.c"), + filepath.Join(libcDir, "time", "tzset.c"), + filepath.Join(libcDir, "time", "tzset_r.c"), + filepath.Join(libcDir, "time", "tzvars.c"), + filepath.Join(libcDir, "time", "wcsftime.c"), + filepath.Join(libcDir, "locale", "locale.c"), + filepath.Join(libcDir, "locale", "localeconv.c"), + filepath.Join(libcDir, "locale", "duplocale.c"), + filepath.Join(libcDir, "locale", "freelocale.c"), + filepath.Join(libcDir, "locale", "lctype.c"), + filepath.Join(libcDir, "locale", "lmessages.c"), + filepath.Join(libcDir, "locale", "lnumeric.c"), + filepath.Join(libcDir, "locale", "lmonetary.c"), + filepath.Join(libcDir, "locale", "newlocale.c"), + filepath.Join(libcDir, "locale", "nl_langinfo.c"), + filepath.Join(libcDir, "locale", "timelocal.c"), + filepath.Join(libcDir, "locale", "uselocale.c"), + filepath.Join(libcDir, "reent", "closer.c"), + filepath.Join(libcDir, "reent", "reent.c"), + filepath.Join(libcDir, "reent", "impure.c"), + filepath.Join(libcDir, "reent", "fcntlr.c"), + filepath.Join(libcDir, "reent", "fstatr.c"), + filepath.Join(libcDir, "reent", "getentropyr.c"), + filepath.Join(libcDir, "reent", "getreent.c"), + filepath.Join(libcDir, "reent", "gettimeofdayr.c"), + filepath.Join(libcDir, "reent", "isattyr.c"), + filepath.Join(libcDir, "reent", "linkr.c"), + filepath.Join(libcDir, "reent", "lseekr.c"), + filepath.Join(libcDir, "reent", "mkdirr.c"), + filepath.Join(libcDir, "reent", "openr.c"), + filepath.Join(libcDir, "reent", "readr.c"), + filepath.Join(libcDir, "reent", "renamer.c"), + filepath.Join(libcDir, "reent", "signalr.c"), + filepath.Join(libcDir, "reent", "signgam.c"), + filepath.Join(libcDir, "reent", "sbrkr.c"), + filepath.Join(libcDir, "reent", "statr.c"), + filepath.Join(libcDir, "reent", "timesr.c"), + filepath.Join(libcDir, "reent", "unlinkr.c"), + filepath.Join(libcDir, "reent", "writer.c"), + filepath.Join(libcDir, "reent", "execr.c"), + filepath.Join(libcDir, "errno", "errno.c"), + filepath.Join(libcDir, "misc", "__dprintf.c"), + filepath.Join(libcDir, "misc", "unctrl.c"), + filepath.Join(libcDir, "misc", "ffs.c"), + filepath.Join(libcDir, "misc", "init.c"), + filepath.Join(libcDir, "misc", "fini.c"), + filepath.Join(libcDir, "misc", "lock.c"), + filepath.Join(libcDir, "posix", "closedir.c"), + filepath.Join(libcDir, "posix", "collate.c"), + filepath.Join(libcDir, "posix", "collcmp.c"), + filepath.Join(libcDir, "posix", "creat.c"), + filepath.Join(libcDir, "posix", "dirfd.c"), + // filepath.Join(libcDir, "posix", "fnmatch.c"), + filepath.Join(libcDir, "posix", "glob.c"), + filepath.Join(libcDir, "posix", "opendir.c"), + filepath.Join(libcDir, "posix", "readdir.c"), + filepath.Join(libcDir, "posix", "readdir_r.c"), + filepath.Join(libcDir, "posix", "regcomp.c"), + filepath.Join(libcDir, "posix", "regerror.c"), + filepath.Join(libcDir, "posix", "regexec.c"), + filepath.Join(libcDir, "posix", "regfree.c"), + filepath.Join(libcDir, "posix", "rewinddir.c"), + filepath.Join(libcDir, "posix", "sleep.c"), + filepath.Join(libcDir, "posix", "usleep.c"), + filepath.Join(libcDir, "posix", "telldir.c"), + filepath.Join(libcDir, "posix", "ftw.c"), + filepath.Join(libcDir, "posix", "nftw.c"), + filepath.Join(libcDir, "posix", "scandir.c"), + filepath.Join(libcDir, "posix", "seekdir.c"), + filepath.Join(libcDir, "posix", "execl.c"), + filepath.Join(libcDir, "posix", "execle.c"), + filepath.Join(libcDir, "posix", "execlp.c"), + filepath.Join(libcDir, "posix", "execv.c"), + filepath.Join(libcDir, "posix", "execve.c"), + filepath.Join(libcDir, "posix", "execvp.c"), + filepath.Join(libcDir, "posix", "wordexp.c"), + filepath.Join(libcDir, "posix", "wordfree.c"), + filepath.Join(libcDir, "posix", "popen.c"), + filepath.Join(libcDir, "posix", "posix_spawn.c"), + filepath.Join(libcDir, "syscalls", "sysclose.c"), + filepath.Join(libcDir, "syscalls", "sysfcntl.c"), + filepath.Join(libcDir, "syscalls", "sysfstat.c"), + filepath.Join(libcDir, "syscalls", "sysgetentropy.c"), + filepath.Join(libcDir, "syscalls", "sysgetpid.c"), + filepath.Join(libcDir, "syscalls", "sysgettod.c"), + filepath.Join(libcDir, "syscalls", "sysisatty.c"), + filepath.Join(libcDir, "syscalls", "syskill.c"), + filepath.Join(libcDir, "syscalls", "syslink.c"), + filepath.Join(libcDir, "syscalls", "syslseek.c"), + filepath.Join(libcDir, "syscalls", "sysopen.c"), + filepath.Join(libcDir, "syscalls", "sysread.c"), + filepath.Join(libcDir, "syscalls", "syssbrk.c"), + filepath.Join(libcDir, "syscalls", "sysstat.c"), + filepath.Join(libcDir, "syscalls", "systimes.c"), + filepath.Join(libcDir, "syscalls", "sysunlink.c"), + filepath.Join(libcDir, "syscalls", "syswrite.c"), + filepath.Join(libcDir, "syscalls", "sysexecve.c"), + filepath.Join(libcDir, "syscalls", "sysfork.c"), + filepath.Join(libcDir, "syscalls", "syswait.c"), + filepath.Join(libcDir, "iconv", "ces", "utf-8.c"), + filepath.Join(libcDir, "iconv", "ces", "utf-16.c"), + filepath.Join(libcDir, "iconv", "ces", "ucs-2.c"), + filepath.Join(libcDir, "iconv", "ces", "us-ascii.c"), + filepath.Join(libcDir, "iconv", "ces", "ucs-4.c"), + filepath.Join(libcDir, "iconv", "ces", "ucs-2-internal.c"), + filepath.Join(libcDir, "iconv", "ces", "ucs-4-internal.c"), + filepath.Join(libcDir, "iconv", "ces", "cesbi.c"), + filepath.Join(libcDir, "iconv", "ces", "table.c"), + filepath.Join(libcDir, "iconv", "ces", "table-pcs.c"), + filepath.Join(libcDir, "iconv", "ces", "euc.c"), + filepath.Join(libcDir, "iconv", "ccs", "ccsbi.c"), + filepath.Join(libcDir, "iconv", "ccs", "iso_8859_10.c"), + filepath.Join(libcDir, "iconv", "ccs", "iso_8859_13.c"), + filepath.Join(libcDir, "iconv", "ccs", "iso_8859_14.c"), + filepath.Join(libcDir, "iconv", "ccs", "iso_8859_15.c"), + filepath.Join(libcDir, "iconv", "ccs", "iso_8859_1.c"), + filepath.Join(libcDir, "iconv", "ccs", "iso_8859_2.c"), + filepath.Join(libcDir, "iconv", "ccs", "iso_8859_3.c"), + filepath.Join(libcDir, "iconv", "ccs", "iso_8859_4.c"), + filepath.Join(libcDir, "iconv", "ccs", "iso_8859_5.c"), + filepath.Join(libcDir, "iconv", "ccs", "iso_8859_6.c"), + filepath.Join(libcDir, "iconv", "ccs", "iso_8859_7.c"), + filepath.Join(libcDir, "iconv", "ccs", "iso_8859_8.c"), + filepath.Join(libcDir, "iconv", "ccs", "iso_8859_9.c"), + filepath.Join(libcDir, "iconv", "ccs", "iso_8859_11.c"), + filepath.Join(libcDir, "iconv", "ccs", "win_1250.c"), + filepath.Join(libcDir, "iconv", "ccs", "win_1252.c"), + filepath.Join(libcDir, "iconv", "ccs", "win_1254.c"), + filepath.Join(libcDir, "iconv", "ccs", "win_1256.c"), + filepath.Join(libcDir, "iconv", "ccs", "win_1258.c"), + filepath.Join(libcDir, "iconv", "ccs", "win_1251.c"), + filepath.Join(libcDir, "iconv", "ccs", "win_1253.c"), + filepath.Join(libcDir, "iconv", "ccs", "win_1255.c"), + filepath.Join(libcDir, "iconv", "ccs", "win_1257.c"), + filepath.Join(libcDir, "iconv", "ccs", "koi8_r.c"), + filepath.Join(libcDir, "iconv", "ccs", "koi8_u.c"), + filepath.Join(libcDir, "iconv", "ccs", "koi8_ru.c"), + filepath.Join(libcDir, "iconv", "ccs", "koi8_uni.c"), + filepath.Join(libcDir, "iconv", "ccs", "iso_ir_111.c"), + filepath.Join(libcDir, "iconv", "ccs", "big5.c"), + filepath.Join(libcDir, "iconv", "ccs", "cp775.c"), + filepath.Join(libcDir, "iconv", "ccs", "cp850.c"), + filepath.Join(libcDir, "iconv", "ccs", "cp852.c"), + filepath.Join(libcDir, "iconv", "ccs", "cp855.c"), + filepath.Join(libcDir, "iconv", "ccs", "cp866.c"), + filepath.Join(libcDir, "iconv", "ccs", "jis_x0212_1990.c"), + filepath.Join(libcDir, "iconv", "ccs", "jis_x0201_1976.c"), + filepath.Join(libcDir, "iconv", "ccs", "jis_x0208_1990.c"), + filepath.Join(libcDir, "iconv", "ccs", "ksx1001.c"), + filepath.Join(libcDir, "iconv", "ccs", "cns11643_plane1.c"), + filepath.Join(libcDir, "iconv", "ccs", "cns11643_plane2.c"), + filepath.Join(libcDir, "iconv", "ccs", "cns11643_plane14.c"), + filepath.Join(libcDir, "iconv", "lib", "aliasesi.c"), + filepath.Join(libcDir, "iconv", "lib", "ucsconv.c"), + filepath.Join(libcDir, "iconv", "lib", "nullconv.c"), + filepath.Join(libcDir, "iconv", "lib", "iconv.c"), + filepath.Join(libcDir, "iconv", "lib", "aliasesbi.c"), + filepath.Join(libcDir, "iconv", "lib", "iconvnls.c"), + filepath.Join(libcDir, "ssp", "chk_fail.c"), + filepath.Join(libcDir, "ssp", "stack_protector.c"), + filepath.Join(libcDir, "ssp", "memcpy_chk.c"), + filepath.Join(libcDir, "ssp", "memmove_chk.c"), + filepath.Join(libcDir, "ssp", "mempcpy_chk.c"), + filepath.Join(libcDir, "ssp", "memset_chk.c"), + filepath.Join(libcDir, "ssp", "stpcpy_chk.c"), + filepath.Join(libcDir, "ssp", "stpncpy_chk.c"), + filepath.Join(libcDir, "ssp", "strcat_chk.c"), + filepath.Join(libcDir, "ssp", "strcpy_chk.c"), + filepath.Join(libcDir, "ssp", "strncat_chk.c"), + filepath.Join(libcDir, "ssp", "strncpy_chk.c"), + filepath.Join(libcDir, "ssp", "gets_chk.c"), + filepath.Join(libcDir, "ssp", "snprintf_chk.c"), + filepath.Join(libcDir, "ssp", "sprintf_chk.c"), + filepath.Join(libcDir, "ssp", "vsnprintf_chk.c"), + filepath.Join(libcDir, "ssp", "vsprintf_chk.c"), + // TODO(MeteorsLiu): support riscv + filepath.Join(libcDir, "machine", "xtensa", "memcpy.S"), + filepath.Join(libcDir, "machine", "xtensa", "memset.S"), + filepath.Join(libcDir, "machine", "xtensa", "setjmp.S"), + filepath.Join(libcDir, "machine", "xtensa", "strcmp.S"), + filepath.Join(libcDir, "machine", "xtensa", "strcpy.S"), + filepath.Join(libcDir, "machine", "xtensa", "strlen.S"), + filepath.Join(libcDir, "machine", "xtensa", "strncpy.S"), + }, + CFlags: []string{ + "-DHAVE_CONFIG_H", + "-D_LIBC", + "-D__NO_SYSCALLS__", + "-D_NO_GLOB", + "-D_NO_EXECVE", + "-D_NO_GETLOGIN", + "-D_NO_GETPWENT", + "-D_NO_GETUT", + "-D_NO_GETPASS", + "-D_NO_SIGSET", + "-D_NO_WORDEXP", + "-D_NO_POPEN", + "-D_NO_POSIX_SPAWN", + "-DHAVE_FCNTL", + "-DHAVE_BLKSIZE", + "-DHAVE_OPENDIR", + "-DHAVE_RENAME", + "-DGETREENT_PROVIDED", + "-DSIGNAL_PROVIDED", + "-D__ESP__", + "-isystem" + filepath.Join(libcDir, "include"), + "-I" + filepath.Join(baseDir, "newlib"), + "-I" + libcDir, + "-I" + filepath.Join(libcDir, "xtensa"), + "-I" + filepath.Join(baseDir, "libgloss"), + // TODO(MeteorsLiu): support riscv + "-idirafter" + filepath.Join(baseDir, "include"), + "-I" + filepath.Join(libcDir, "ssp"), + "-I" + filepath.Join(libcDir, "locale"), + "-I" + filepath.Join(libcDir, "errno"), + "-I" + filepath.Join(libcDir, "syscalls"), + "-I" + filepath.Join(libcDir, "iconv", "lib"), + "-I" + filepath.Join(libcDir, "argz"), + "-I" + filepath.Join(libcDir, "stdio"), + "-I" + filepath.Join(libcDir, "iconv", "ccs"), + "-I" + filepath.Join(libcDir, "ctype"), + "-I" + filepath.Join(libcDir, "signal"), + "-I" + filepath.Join(libcDir, "time"), + "-I" + filepath.Join(libcDir, "reent"), + "-I" + filepath.Join(libcDir, "machine", "xtensa", "include"), + "-I" + filepath.Join(libcDir, "string"), + "-I" + filepath.Join(libcDir, "iconv", "ces"), + "-I" + filepath.Join(libcDir, "search"), + "-I" + filepath.Join(libcDir, "misc"), + "-I" + filepath.Join(libcDir, "posix"), + "-I" + filepath.Join(libcDir, "stdlib"), + }, + LDFlags: []string{"-nostdlib", "-L" + baseDir, "-lgloss"}, + CCFlags: []string{ + "-Oz", + "-fno-builtin", + "-ffreestanding", + "-Wno-implicit-function-declaration", + "-Wno-int-conversion", + "-Wno-unused-command-line-argument", + }, + }, + }, + ArchiveSrcDir: "newlib-esp32-esp-4.3.0", + } +} diff --git a/internal/crosscompile/picolibc.go b/internal/crosscompile/picolibc.go new file mode 100644 index 00000000..b31405d6 --- /dev/null +++ b/internal/crosscompile/picolibc.go @@ -0,0 +1,166 @@ +package crosscompile + +import ( + "os" + "path/filepath" +) + +// getPicolibcConfig returns configuration for picolibc +func getPicolibcConfig(baseDir string) *compileLibcConfig { + libcIncludeDir := filepath.Join(baseDir, "libc", "include") + libmIncludeDir := filepath.Join(baseDir, "libm", "common") + localeIncludeDir := filepath.Join(baseDir, "libc", "locale") + + os.MkdirAll(baseDir, 0700) + + headerFile, _ := os.Create(filepath.Join(baseDir, "picolibc.h")) + headerFile.Close() + + return &compileLibcConfig{ + Url: "https://github.com/picolibc/picolibc/releases/download/1.8.10/picolibc-1.8.10.tar.xz", + Name: "picolibc", + Groups: []compileGroup{ + { + OutputFileName: "libc.a", + Files: []string{ + filepath.Join(baseDir, "libc", "string", "bcmp.c"), + filepath.Join(baseDir, "libc", "string", "bcopy.c"), + filepath.Join(baseDir, "libc", "string", "bzero.c"), + filepath.Join(baseDir, "libc", "string", "explicit_bzero.c"), + filepath.Join(baseDir, "libc", "string", "ffsl.c"), + filepath.Join(baseDir, "libc", "string", "ffsll.c"), + filepath.Join(baseDir, "libc", "string", "fls.c"), + filepath.Join(baseDir, "libc", "string", "flsl.c"), + filepath.Join(baseDir, "libc", "string", "flsll.c"), + filepath.Join(baseDir, "libc", "string", "gnu_basename.c"), + filepath.Join(baseDir, "libc", "string", "index.c"), + filepath.Join(baseDir, "libc", "string", "memccpy.c"), + filepath.Join(baseDir, "libc", "string", "memchr.c"), + filepath.Join(baseDir, "libc", "string", "memcmp.c"), + filepath.Join(baseDir, "libc", "string", "memcpy.c"), + filepath.Join(baseDir, "libc", "string", "memmem.c"), + filepath.Join(baseDir, "libc", "string", "memmove.c"), + filepath.Join(baseDir, "libc", "string", "mempcpy.c"), + filepath.Join(baseDir, "libc", "string", "memrchr.c"), + filepath.Join(baseDir, "libc", "string", "memset.c"), + filepath.Join(baseDir, "libc", "string", "rawmemchr.c"), + filepath.Join(baseDir, "libc", "string", "rindex.c"), + filepath.Join(baseDir, "libc", "string", "stpcpy.c"), + filepath.Join(baseDir, "libc", "string", "stpncpy.c"), + filepath.Join(baseDir, "libc", "string", "strcasecmp.c"), + filepath.Join(baseDir, "libc", "string", "strcasecmp_l.c"), + filepath.Join(baseDir, "libc", "string", "strcasestr.c"), + filepath.Join(baseDir, "libc", "string", "strcat.c"), + filepath.Join(baseDir, "libc", "string", "strchr.c"), + filepath.Join(baseDir, "libc", "string", "strchrnul.c"), + filepath.Join(baseDir, "libc", "string", "strcmp.c"), + filepath.Join(baseDir, "libc", "string", "strcoll.c"), + filepath.Join(baseDir, "libc", "string", "strcoll_l.c"), + filepath.Join(baseDir, "libc", "string", "strcpy.c"), + filepath.Join(baseDir, "libc", "string", "strcspn.c"), + filepath.Join(baseDir, "libc", "string", "strerror_r.c"), + filepath.Join(baseDir, "libc", "string", "strlcat.c"), + filepath.Join(baseDir, "libc", "string", "strlcpy.c"), + filepath.Join(baseDir, "libc", "string", "strlen.c"), + filepath.Join(baseDir, "libc", "string", "strlwr.c"), + filepath.Join(baseDir, "libc", "string", "strncasecmp.c"), + filepath.Join(baseDir, "libc", "string", "strncasecmp_l.c"), + filepath.Join(baseDir, "libc", "string", "strncat.c"), + filepath.Join(baseDir, "libc", "string", "strncmp.c"), + filepath.Join(baseDir, "libc", "string", "strncpy.c"), + filepath.Join(baseDir, "libc", "string", "strndup.c"), + filepath.Join(baseDir, "libc", "string", "strnlen.c"), + filepath.Join(baseDir, "libc", "string", "strnstr.c"), + filepath.Join(baseDir, "libc", "string", "strpbrk.c"), + filepath.Join(baseDir, "libc", "string", "strrchr.c"), + filepath.Join(baseDir, "libc", "string", "strsep.c"), + filepath.Join(baseDir, "libc", "string", "strsignal.c"), + filepath.Join(baseDir, "libc", "string", "strspn.c"), + filepath.Join(baseDir, "libc", "string", "strstr.c"), + filepath.Join(baseDir, "libc", "string", "strtok.c"), + filepath.Join(baseDir, "libc", "string", "strtok_r.c"), + filepath.Join(baseDir, "libc", "string", "strupr.c"), + filepath.Join(baseDir, "libc", "string", "strverscmp.c"), + filepath.Join(baseDir, "libc", "string", "strxfrm.c"), + filepath.Join(baseDir, "libc", "string", "strxfrm_l.c"), + filepath.Join(baseDir, "libc", "string", "swab.c"), + filepath.Join(baseDir, "libc", "string", "timingsafe_bcmp.c"), + filepath.Join(baseDir, "libc", "string", "timingsafe_memcmp.c"), + filepath.Join(baseDir, "libc", "string", "strerror.c"), + filepath.Join(baseDir, "libc", "string", "wcpcpy.c"), + filepath.Join(baseDir, "libc", "string", "wcpncpy.c"), + filepath.Join(baseDir, "libc", "string", "wcscasecmp.c"), + filepath.Join(baseDir, "libc", "string", "wcscasecmp_l.c"), + filepath.Join(baseDir, "libc", "string", "wcscat.c"), + filepath.Join(baseDir, "libc", "string", "wcschr.c"), + filepath.Join(baseDir, "libc", "string", "wcscmp.c"), + filepath.Join(baseDir, "libc", "string", "wcscoll.c"), + filepath.Join(baseDir, "libc", "string", "wcscoll_l.c"), + filepath.Join(baseDir, "libc", "string", "wcscpy.c"), + filepath.Join(baseDir, "libc", "string", "wcscspn.c"), + filepath.Join(baseDir, "libc", "string", "wcsdup.c"), + filepath.Join(baseDir, "libc", "string", "wcslcat.c"), + filepath.Join(baseDir, "libc", "string", "wcslcpy.c"), + filepath.Join(baseDir, "libc", "string", "wcslen.c"), + filepath.Join(baseDir, "libc", "string", "wcsncasecmp.c"), + filepath.Join(baseDir, "libc", "string", "wcsncasecmp_l.c"), + filepath.Join(baseDir, "libc", "string", "wcsncat.c"), + filepath.Join(baseDir, "libc", "string", "wcsncmp.c"), + filepath.Join(baseDir, "libc", "string", "wcsncpy.c"), + filepath.Join(baseDir, "libc", "string", "wcsnlen.c"), + filepath.Join(baseDir, "libc", "string", "wcspbrk.c"), + filepath.Join(baseDir, "libc", "string", "wcsrchr.c"), + filepath.Join(baseDir, "libc", "string", "wcsspn.c"), + filepath.Join(baseDir, "libc", "string", "wcsstr.c"), + filepath.Join(baseDir, "libc", "string", "wcstok.c"), + filepath.Join(baseDir, "libc", "string", "wcswidth.c"), + filepath.Join(baseDir, "libc", "string", "wcsxfrm.c"), + filepath.Join(baseDir, "libc", "string", "wcsxfrm_l.c"), + filepath.Join(baseDir, "libc", "string", "wcwidth.c"), + filepath.Join(baseDir, "libc", "string", "wmemchr.c"), + filepath.Join(baseDir, "libc", "string", "wmemcmp.c"), + filepath.Join(baseDir, "libc", "string", "wmemcpy.c"), + filepath.Join(baseDir, "libc", "string", "wmemmove.c"), + filepath.Join(baseDir, "libc", "string", "wmempcpy.c"), + filepath.Join(baseDir, "libc", "string", "wmemset.c"), + filepath.Join(baseDir, "libc", "string", "xpg_strerror_r.c"), + + filepath.Join(baseDir, "libc", "stdlib", "nano-calloc.c"), + filepath.Join(baseDir, "libc", "stdlib", "nano-malloc.c"), + filepath.Join(baseDir, "libc", "stdlib", "nano-pvalloc.c"), + filepath.Join(baseDir, "libc", "stdlib", "nano-realloc.c"), + filepath.Join(baseDir, "libc", "stdlib", "nano-valloc.c"), + filepath.Join(baseDir, "libc", "stdlib", "rand.c"), + filepath.Join(baseDir, "libc", "stdlib", "srand.c"), + filepath.Join(baseDir, "libc", "stdlib", "nano-free.c"), + + filepath.Join(baseDir, "libc", "tinystdio", "printf.c"), + filepath.Join(baseDir, "libc", "tinystdio", "putchar.c"), + filepath.Join(baseDir, "libc", "tinystdio", "puts.c"), + }, + CFlags: []string{ + "-D_COMPILING_NEWLIB", + "-D_HAVE_ALIAS_ATTRIBUTE", + "-DTINY_STDIO", + "-DPOSIX_IO", + "-DFORMAT_DEFAULT_INTEGER", + "-D_IEEE_LIBM", + "-D__OBSOLETE_MATH_FLOAT=1", + "-D__OBSOLETE_MATH_DOUBLE=0", + "-D_WANT_IO_C99_FORMATS", + "-nostdlib", + "-isystem" + libcIncludeDir, + "-I" + libmIncludeDir, + "-I" + localeIncludeDir, + "-I" + baseDir, + "-I" + filepath.Join(baseDir, "libc", "tinystdio"), + }, + LDFlags: []string{"-nostdlib"}, + CCFlags: []string{ + "-Oz", + }, + }, + }, + ArchiveSrcDir: filepath.Join("picolibc-1.8.10", "newlib"), + } +} diff --git a/targets/esp32.app.elf.ld b/targets/esp32.app.elf.ld new file mode 100755 index 00000000..88e6cf26 --- /dev/null +++ b/targets/esp32.app.elf.ld @@ -0,0 +1,185 @@ +__stack = ORIGIN(dram_seg) + LENGTH(dram_seg); +__MIN_STACK_SIZE = 0x2000; + +ENTRY(_start) +SECTIONS +{ + . = SEGMENT_START("iram_seg", 0); + .vectors : + { + _vector_table = ABSOLUTE(.); + KEEP(*(.WindowVectors.text)); + KEEP(*(.Level2InterruptVector.text)); + KEEP(*(.Level3InterruptVector.text)); + KEEP(*(.Level4InterruptVector.text)); + KEEP(*(.Level5InterruptVector.text)); + KEEP(*(.DebugExceptionVector.text)); + KEEP(*(.NMIExceptionVector.text)); + KEEP(*(.KernelExceptionVector.text)); + KEEP(*(.UserExceptionVector.text)); + KEEP(*(.DoubleExceptionVector.text)); + KEEP(*(.ResetVector.text)); + *(.*Vector.literal) + . = ALIGN (16); + } > iram_seg + + text : + { + KEEP (*(.init.literal)) + KEEP (*(SORT_NONE(.init))) + *(.literal .text .stub .literal.* .text.* .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + KEEP (*(.fini.literal)) + KEEP (*(SORT_NONE(.fini))) + } > iram_seg + + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + + + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); + + + .rodata : + { + *(.rodata .rodata.* .gnu.linkonce.r.*) + *(.rodata1) + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) + } + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + + _data_start = .; + .data : + { + *(.data .data.* .gnu.linkonce.d.*) + SORT(CONSTRUCTORS) + *(.data1) + } + _edata = .; PROVIDE (edata = .); + . = .; + __bss_start = .; + .bss : + { + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. + FIXME: Why do we need it? When there is no .bss section, we do not + pad the .data section. */ + . = ALIGN(. != 0 ? 32 / 8 : 1); + } + . = ALIGN(32 / 8); + . = ALIGN(32 / 8); + _end = .; PROVIDE (end = .); + . = DATA_SEGMENT_END (.); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(. <= __stack - __MIN_STACK_SIZE, "region DRAM overflowed by .data and .bss sections") + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + /* DWARF 3 */ + .debug_pubtypes 0 : { *(.debug_pubtypes) } + .debug_ranges 0 : { *(.debug_ranges) } + /* DWARF Extension. */ + .debug_macro 0 : { *(.debug_macro) } + .debug_addr 0 : { *(.debug_addr) } + .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } + /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) } +} + + +_sbss = __bss_start; +_ebss = _end; + diff --git a/targets/esp32.json b/targets/esp32.json index 841c7d41..5ba0c390 100644 --- a/targets/esp32.json +++ b/targets/esp32.json @@ -1,20 +1,25 @@ { - "inherits": ["xtensa"], + "inherits": [ + "xtensa" + ], "cpu": "esp32", "features": "+atomctl,+bool,+clamps,+coprocessor,+debug,+density,+dfpaccel,+div32,+exception,+fp,+highpriinterrupts,+interrupt,+loop,+mac16,+memctl,+minmax,+miscsr,+mul32,+mul32high,+nsa,+prid,+regprotect,+rvector,+s32c1i,+sext,+threadptr,+timerint,+windowed", - "build-tags": ["esp32", "esp"], + "build-tags": [ + "esp32", + "esp" + ], "scheduler": "tasks", "serial": "uart", "linker": "ld.lld", "default-stack-size": 2048, "rtlib": "compiler-rt", - "libc": "picolibc", - "linkerscript": "targets/esp32.ld", - "extra-files": [ - "targets/device/esp/esp32.S" - ], + "libc": "newlib-esp32", + "linkerscript": "targets/esp32.memory.elf.ld", + "extra-files": [], "binary-format": "esp32", "flash-command": "esptool.py --chip=esp32 --port {port} write_flash 0x1000 {bin} -ff 80m -fm dout", "emulator": "qemu-system-xtensa -machine esp32 -nographic -drive file={img},if=mtd,format=raw", - "gdb": ["xtensa-esp32-elf-gdb"] + "gdb": [ + "xtensa-esp32-elf-gdb" + ] } diff --git a/targets/esp32.ld b/targets/esp32.ld deleted file mode 100644 index 0d5de614..00000000 --- a/targets/esp32.ld +++ /dev/null @@ -1,200 +0,0 @@ -/* Linker script for the ESP32 */ - -MEMORY -{ - /* Data RAM. Allows byte access. - * There are various data RAM regions: - * SRAM2: 0x3FFA_E000..0x3FFD_FFFF (72 + 128 = 200K) - * SRAM1: 0x3FFE_0000..0x3FFF_FFFF (128K) - * This gives us 328K of contiguous RAM, which is the largest span possible. - * SRAM1 has other addresses as well but the datasheet seems to indicate - * these are aliases. - */ - DRAM (rw) : ORIGIN = 0x3FFAE000, LENGTH = 200K + 128K /* Internal SRAM 1 + 2 */ - - /* Instruction RAM. */ - IRAM (x) : ORIGIN = 0x40080000, LENGTH = 128K /* Internal SRAM 0 */ -} - -/* The entry point. It is set in the image flashed to the chip, so must be - * defined. - */ -ENTRY(call_start_cpu0) - -SECTIONS -{ - /* Constant literals and code. Loaded into IRAM for now. Eventually, most - * code should be executed directly from flash. - * Note that literals must be before code for the l32r instruction to work. - */ - .text : ALIGN(4) - { - *(.literal.call_start_cpu0) - *(.text.call_start_cpu0) - *(.literal .text) - *(.literal.* .text.*) - } >IRAM - - /* Put the stack at the bottom of DRAM, so that the application will - * crash on stack overflow instead of silently corrupting memory. - * See: http://blog.japaric.io/stack-overflow-protection/ */ - .stack (NOLOAD) : - { - . = ALIGN(16); - . += _stack_size; - _stack_top = .; - } >DRAM - - /* Constant global variables. - * They are loaded in DRAM for ease of use. Eventually they should be stored - * in flash and loaded directly from there but they're kept in RAM to make - * sure they can always be accessed (even in interrupts). - */ - .rodata : ALIGN(4) - { - *(.rodata) - *(.rodata.*) - } >DRAM - - /* Mutable global variables. - */ - .data : ALIGN(4) - { - _sdata = ABSOLUTE(.); - *(.data) - *(.data.*) - _edata = ABSOLUTE(.); - } >DRAM - - /* Check that the boot ROM stack (for the APP CPU) does not overlap with the - * data that is loaded by the boot ROM. There may be ways to avoid this - * issue if it occurs in practice. - * The magic value here is _stack_sentry in the boot ROM ELF file. - */ - ASSERT(_edata < 0x3ffe1320, "the .data section overlaps with the stack used by the boot ROM, possibly causing corruption at startup") - - /* Global variables that are mutable and zero-initialized. - * These must be zeroed at startup (unlike data, which is loaded by the - * bootloader). - */ - .bss (NOLOAD) : ALIGN(4) - { - . = ALIGN (4); - _sbss = ABSOLUTE(.); - *(.bss) - *(.bss.*) - . = ALIGN (4); - _ebss = ABSOLUTE(.); - } >DRAM -} - -/* For the garbage collector. - */ -_globals_start = _sdata; -_globals_end = _ebss; -_heap_start = _ebss; -_heap_end = ORIGIN(DRAM) + LENGTH(DRAM); - -_stack_size = 4K; - - -/* From ESP-IDF: - * components/esp_rom/esp32/ld/esp32.rom.libgcc.ld - * These are called from LLVM during codegen. The original license is Apache - * 2.0, but I believe that a list of function names and addresses can't really - * be copyrighted. - */ -__absvdi2 = 0x4006387c; -__absvsi2 = 0x40063868; -__adddf3 = 0x40002590; -__addsf3 = 0x400020e8; -__addvdi3 = 0x40002cbc; -__addvsi3 = 0x40002c98; -__ashldi3 = 0x4000c818; -__ashrdi3 = 0x4000c830; -__bswapdi2 = 0x40064b08; -__bswapsi2 = 0x40064ae0; -__clrsbdi2 = 0x40064b7c; -__clrsbsi2 = 0x40064b64; -__clzdi2 = 0x4000ca50; -__clzsi2 = 0x4000c7e8; -__cmpdi2 = 0x40063820; -__ctzdi2 = 0x4000ca64; -__ctzsi2 = 0x4000c7f0; -__divdc3 = 0x400645a4; -__divdf3 = 0x40002954; -__divdi3 = 0x4000ca84; -__divsi3 = 0x4000c7b8; -__eqdf2 = 0x400636a8; -__eqsf2 = 0x40063374; -__extendsfdf2 = 0x40002c34; -__ffsdi2 = 0x4000ca2c; -__ffssi2 = 0x4000c804; -__fixdfdi = 0x40002ac4; -__fixdfsi = 0x40002a78; -__fixsfdi = 0x4000244c; -__fixsfsi = 0x4000240c; -__fixunsdfsi = 0x40002b30; -__fixunssfdi = 0x40002504; -__fixunssfsi = 0x400024ac; -__floatdidf = 0x4000c988; -__floatdisf = 0x4000c8c0; -__floatsidf = 0x4000c944; -__floatsisf = 0x4000c870; -__floatundidf = 0x4000c978; -__floatundisf = 0x4000c8b0; -__floatunsidf = 0x4000c938; -__floatunsisf = 0x4000c864; -__gcc_bcmp = 0x40064a70; -__gedf2 = 0x40063768; -__gesf2 = 0x4006340c; -__gtdf2 = 0x400636dc; -__gtsf2 = 0x400633a0; -__ledf2 = 0x40063704; -__lesf2 = 0x400633c0; -__lshrdi3 = 0x4000c84c; -__ltdf2 = 0x40063790; -__ltsf2 = 0x4006342c; -__moddi3 = 0x4000cd4c; -__modsi3 = 0x4000c7c0; -__muldc3 = 0x40063c90; -__muldf3 = 0x4006358c; -__muldi3 = 0x4000c9fc; -__mulsf3 = 0x400632c8; -__mulsi3 = 0x4000c7b0; -__mulvdi3 = 0x40002d78; -__mulvsi3 = 0x40002d60; -__nedf2 = 0x400636a8; -__negdf2 = 0x400634a0; -__negdi2 = 0x4000ca14; -__negsf2 = 0x400020c0; -__negvdi2 = 0x40002e98; -__negvsi2 = 0x40002e78; -__nesf2 = 0x40063374; -__nsau_data = 0x3ff96544; -__paritysi2 = 0x40002f3c; -__popcount_tab = 0x3ff96544; -__popcountdi2 = 0x40002ef8; -__popcountsi2 = 0x40002ed0; -__powidf2 = 0x400638e4; -__subdf3 = 0x400026e4; -__subsf3 = 0x400021d0; -__subvdi3 = 0x40002d20; -__subvsi3 = 0x40002cf8; -__truncdfsf2 = 0x40002b90; -__ucmpdi2 = 0x40063840; -__udiv_w_sdiv = 0x40064bec; -__udivdi3 = 0x4000cff8; -__udivmoddi4 = 0x40064bf4; -__udivsi3 = 0x4000c7c8; -__umoddi3 = 0x4000d280; -__umodsi3 = 0x4000c7d0; -__umulsidi3 = 0x4000c7d8; -__unorddf2 = 0x400637f4; -__unordsf2 = 0x40063478; - -INCLUDE "targets/esp32.rom.newlib-data.ld"; -INCLUDE "targets/esp32.rom.newlib-funcs.ld"; -INCLUDE "targets/esp32.rom.newlib-locale.ld"; -INCLUDE "targets/esp32.rom.newlib-nano.ld"; -INCLUDE "targets/esp32.rom.newlib-time.ld"; diff --git a/targets/esp32.memory.elf.ld b/targets/esp32.memory.elf.ld new file mode 100755 index 00000000..65976719 --- /dev/null +++ b/targets/esp32.memory.elf.ld @@ -0,0 +1,26 @@ +/* + * IROM/DRAM definition in QEMU: + * [ESP32_MEMREGION_IROM] = { 0x40000000, 0x70000 }, + * [ESP32_MEMREGION_DRAM] = { 0x3ffae000, 0x52000 }, + * + * In theory we could use whole DRAM section, but I had some faults when using + * memory in range 0x3ffae000 - 0x3ffb0000 + * + * But used memory range for data such as esp-idf for ESP32 to satisfy user's + * expectation on chip emulation + * + * Pass '--defsym=entire_dram_seg=1' to linker script to use whole DRAM + * + */ + +MEMORY +{ + iram_seg (X) : org = 0x40078000, len = 0x28000 +/* 64k at the end of DRAM, after ROM bootloader stack + * or entire DRAM (for QEMU only) + */ + dram_seg (RW) : org = 0x3FFF0000 , + len = 0x10000 +} + +INCLUDE "targets/esp32.app.elf.ld"; diff --git a/targets/esp32.rom.newlib-data.ld b/targets/esp32.rom.newlib-data.ld deleted file mode 100644 index ed5795c8..00000000 --- a/targets/esp32.rom.newlib-data.ld +++ /dev/null @@ -1,23 +0,0 @@ -/* These are the .bss/.data symbols used by newlib functions present in ESP32 ROM. - See also esp32.rom.newlib-funcs.ld for the list of general newlib functions, - and esp32.rom.newlib-nano.ld for "nano" versions of printf/scanf family of functions. - - Unlike other ROM functions and data which are exported using PROVIDE, which declares - weak symbols, newlib related functions are exported using assignment, - which declares strong symbols. This is done so that ROM functions are always - used instead of the ones provided by libc.a. - */ - -_ctype_ = 0x3ff96354; -__ctype_ptr__ = 0x3ff96350; -environ = 0x3ffae0b4; -_global_impure_ptr = 0x3ffae0b0; -__mb_cur_max = 0x3ff96530; -__sf_fake_stderr = 0x3ff96458; -__sf_fake_stdin = 0x3ff96498; -__sf_fake_stdout = 0x3ff96478; -__wctomb = 0x3ff96540; -__sfp_lock = 0x3ffae0ac; -__sinit_lock = 0x3ffae0a8; -__env_lock_object = 0x3ffae0b8; -__tz_lock_object = 0x3ffae080; diff --git a/targets/esp32.rom.newlib-funcs.ld b/targets/esp32.rom.newlib-funcs.ld deleted file mode 100644 index 79d5c5be..00000000 --- a/targets/esp32.rom.newlib-funcs.ld +++ /dev/null @@ -1,130 +0,0 @@ -/* These are the newlib functions present in ESP32 ROM. - They should not be used when compiling with PSRAM cache workaround enabled. - See also esp32.rom.newlib-data.ld for the list of .data/.bss symbols - used by these functions, and esp32.rom.newlib-nano.ld for "nano" versions - of printf/scanf family of functions. - - Unlike other ROM functions which are exported using PROVIDE, which declares - weak symbols, newlib related functions are exported using assignment, - which declares strong symbols. This is done so that ROM functions are always - used instead of the ones provided by libc.a. - - Time functions were moved to the esp32.rom.newlib-time.ld file. - */ - -abs = 0x40056340; -__ascii_wctomb = 0x40058ef0; -atoi = 0x400566c4; -_atoi_r = 0x400566d4; -atol = 0x400566ec; -_atol_r = 0x400566fc; -bzero = 0x4000c1f4; -_cleanup = 0x40001df8; -_cleanup_r = 0x40001d48; -creat = 0x40000e8c; -div = 0x40056348; -__dummy_lock = 0x4000c728; -__dummy_lock_try = 0x4000c730; -__env_lock = 0x40001fd4; -__env_unlock = 0x40001fe0; -fclose = 0x400020ac; -_fclose_r = 0x40001fec; -fflush = 0x40059394; -_fflush_r = 0x40059320; -_findenv_r = 0x40001f44; -__fp_lock_all = 0x40001f1c; -__fp_unlock_all = 0x40001f30; -__fputwc = 0x40058da0; -fputwc = 0x40058ea8; -_fputwc_r = 0x40058e4c; -_fwalk = 0x4000c738; -_fwalk_reent = 0x4000c770; -_getenv_r = 0x40001fbc; -isalnum = 0x40000f04; -isalpha = 0x40000f18; -isascii = 0x4000c20c; -isblank = 0x40000f2c; -iscntrl = 0x40000f50; -isdigit = 0x40000f64; -isgraph = 0x40000f94; -islower = 0x40000f78; -isprint = 0x40000fa8; -ispunct = 0x40000fc0; -isspace = 0x40000fd4; -isupper = 0x40000fe8; -__itoa = 0x40056678; -itoa = 0x400566b4; -labs = 0x40056370; -ldiv = 0x40056378; -longjmp = 0x400562cc; -memccpy = 0x4000c220; -memchr = 0x4000c244; -memcmp = 0x4000c260; -memcpy = 0x4000c2c8; -memmove = 0x4000c3c0; -memrchr = 0x4000c400; -memset = 0x4000c44c; -qsort = 0x40056424; -rand = 0x40001058; -rand_r = 0x400010d4; -__sccl = 0x4000c498; -__sclose = 0x400011b8; -__seofread = 0x40001148; -setjmp = 0x40056268; -__sflush_r = 0x400591e0; -__sfmoreglue = 0x40001dc8; -__sfp = 0x40001e90; -__sfp_lock_acquire = 0x40001e08; -__sfp_lock_release = 0x40001e14; -__sinit = 0x40001e38; -__sinit_lock_acquire = 0x40001e20; -__sinit_lock_release = 0x40001e2c; -srand = 0x40001004; -__sread = 0x40001118; -__sseek = 0x40001184; -strcasecmp = 0x400011cc; -strcasestr = 0x40001210; -strcat = 0x4000c518; -strchr = 0x4000c53c; -strcmp = 0x40001274; -strcoll = 0x40001398; -strcpy = 0x400013ac; -strcspn = 0x4000c558; -strdup = 0x4000143c; -_strdup_r = 0x40001450; -strlcat = 0x40001470; -strlcpy = 0x4000c584; -strlen = 0x400014c0; -strlwr = 0x40001524; -strncasecmp = 0x40001550; -strncat = 0x4000c5c4; -strncmp = 0x4000c5f4; -strncpy = 0x400015d4; -strndup = 0x400016b0; -_strndup_r = 0x400016c4; -strnlen = 0x4000c628; -strrchr = 0x40001708; -strsep = 0x40001734; -strspn = 0x4000c648; -strstr = 0x4000c674; -__strtok_r = 0x4000c6a8; -strtok_r = 0x4000c70c; -strtol = 0x4005681c; -_strtol_r = 0x40056714; -strtoul = 0x4005692c; -_strtoul_r = 0x40056834; -strupr = 0x4000174c; -__submore = 0x40058f3c; -__swbuf = 0x40058cb4; -__swbuf_r = 0x40058bec; -__swrite = 0x40001150; -toascii = 0x4000c720; -tolower = 0x40001868; -toupper = 0x40001884; -ungetc = 0x400590f4; -_ungetc_r = 0x40058fa0; -__utoa = 0x400561f0; -utoa = 0x40056258; -wcrtomb = 0x40058920; -_wcrtomb_r = 0x400588d8; -_wctomb_r = 0x40058f14; diff --git a/targets/esp32.rom.newlib-locale.ld b/targets/esp32.rom.newlib-locale.ld deleted file mode 100644 index 81e22aaf..00000000 --- a/targets/esp32.rom.newlib-locale.ld +++ /dev/null @@ -1,19 +0,0 @@ -/* These are the locale-related newlib functions present in ESP32 ROM. - ESP32 ROM contains newlib version 2.2.0, and these functions should not be - used when compiling with newlib version 3, since locale implementation is - different there. - - Unlike other ROM functions which are exported using PROVIDE, which declares - weak symbols, newlib related functions are exported using assignment, - which declares strong symbols. This is done so that ROM functions are always - used instead of the ones provided by libc.a. - */ - -__locale_charset = 0x40059540; -__locale_cjk_lang = 0x40059558; -localeconv = 0x4005957c; -_localeconv_r = 0x40059560; -__locale_mb_cur_max = 0x40059548; -__locale_msgcharset = 0x40059550; -setlocale = 0x40059568; -_setlocale_r = 0x4005950c; diff --git a/targets/esp32.rom.newlib-nano.ld b/targets/esp32.rom.newlib-nano.ld deleted file mode 100644 index 51d93a1e..00000000 --- a/targets/esp32.rom.newlib-nano.ld +++ /dev/null @@ -1,115 +0,0 @@ -/* These are the printf/scanf related newlib functions present in ESP32 ROM. - These functions are compiled with newlib "nano" format option. - As such, they don's support 64-bit integer formats. - Floating point formats are supported by setting _printf_float and - _scanf_float entries in syscall table. This is done automatically - by startup code. - These functions should not be used when compiling with PSRAM cache workaround enabled. - See also esp32.rom.newlib-data.ld for the list of .data/.bss symbols - used by newlib functions, and esp32.rom.newlib-funcs.ld for the list - of general newlib functions. - - Unlike other ROM functions which are exported using PROVIDE, which declares - weak symbols, newlib related functions are exported using assignment, - which declares strong symbols. This is done so that ROM functions are always - used instead of the ones provided by libc.a. - */ - -asiprintf = 0x40056d9c; -_asiprintf_r = 0x40056d4c; -asniprintf = 0x40056cd8; -_asniprintf_r = 0x40056c64; -asnprintf = 0x40056cd8; -_asnprintf_r = 0x40056c64; -asprintf = 0x40056d9c; -_asprintf_r = 0x40056d4c; -fiprintf = 0x40056efc; -_fiprintf_r = 0x40056ed8; -fiscanf = 0x40058884; -_fiscanf_r = 0x400588b4; -fprintf = 0x40056efc; -_fprintf_r = 0x40056ed8; -fscanf = 0x40058884; -_fscanf_r = 0x400588b4; -iprintf = 0x40056978; -_iprintf_r = 0x40056944; -iscanf = 0x40058760; -_iscanf_r = 0x4005879c; -printf = 0x40056978; -_printf_common = 0x40057338; -_printf_i = 0x40057404; -_printf_r = 0x40056944; -scanf = 0x40058760; -_scanf_chars = 0x40058384; -_scanf_i = 0x4005845c; -_scanf_r = 0x4005879c; -__sfputs_r = 0x40057790; -siprintf = 0x40056c08; -_siprintf_r = 0x40056bbc; -siscanf = 0x400587d0; -_siscanf_r = 0x40058830; -sniprintf = 0x40056b4c; -_sniprintf_r = 0x40056ae4; -snprintf = 0x40056b4c; -_snprintf_r = 0x40056ae4; -sprintf = 0x40056c08; -_sprintf_r = 0x40056bbc; -__sprint_r = 0x400577e4; -sscanf = 0x400587d0; -_sscanf_r = 0x40058830; -__ssprint_r = 0x40056ff8; -__ssputs_r = 0x40056f2c; -__ssrefill_r = 0x40057fec; -__ssvfiscanf_r = 0x4005802c; -__ssvfscanf_r = 0x4005802c; -_sungetc_r = 0x40057f6c; -_svfiprintf_r = 0x40057100; -__svfiscanf_r = 0x40057b08; -_svfprintf_r = 0x40057100; -__svfscanf = 0x40057f04; -__svfscanf_r = 0x40057b08; -vasiprintf = 0x40056eb8; -_vasiprintf_r = 0x40056e80; -vasniprintf = 0x40056e58; -_vasniprintf_r = 0x40056df8; -vasnprintf = 0x40056e58; -_vasnprintf_r = 0x40056df8; -vasprintf = 0x40056eb8; -_vasprintf_r = 0x40056e80; -vfiprintf = 0x40057ae8; -_vfiprintf_r = 0x40057850; -vfiscanf = 0x40057eb8; -_vfiscanf_r = 0x40057f24; -vfprintf = 0x40057ae8; -_vfprintf_r = 0x40057850; -vfscanf = 0x40057eb8; -_vfscanf_r = 0x40057f24; -viprintf = 0x400569b4; -_viprintf_r = 0x400569e4; -viscanf = 0x40058698; -_viscanf_r = 0x400586c8; -vprintf = 0x400569b4; -_vprintf_r = 0x400569e4; -vscanf = 0x40058698; -_vscanf_r = 0x400586c8; -vsiprintf = 0x40056ac4; -_vsiprintf_r = 0x40056a90; -vsiscanf = 0x40058740; -_vsiscanf_r = 0x400586f8; -vsniprintf = 0x40056a68; -_vsniprintf_r = 0x40056a14; -vsnprintf = 0x40056a68; -_vsnprintf_r = 0x40056a14; -vsprintf = 0x40056ac4; -_vsprintf_r = 0x40056a90; -vsscanf = 0x40058740; -_vsscanf_r = 0x400586f8; - -/* _print_float and _scanf_float functions in ROM are stubs which call - real implementations in IDF through the syscall table. - As such, don't include these ROM symbols. - -_printf_float = 0x4000befc; -_scanf_float = 0x4000bf18; - -*/ diff --git a/targets/esp32.rom.newlib-time.ld b/targets/esp32.rom.newlib-time.ld deleted file mode 100644 index 50ec6488..00000000 --- a/targets/esp32.rom.newlib-time.ld +++ /dev/null @@ -1,38 +0,0 @@ -/* These are the newlib functions and the .bss/.data symbols necessary for these functions present in ESP32 ROM. - They should not be used when you need to solve the Y2K38 problem. - Because these functions were compiled with 32-bit width for the time_t structure. - */ - -asctime = 0x40059588; -asctime_r = 0x40000ec8; -ctime = 0x400595b0; -ctime_r = 0x400595c4; -__gettzinfo = 0x40001fcc; -__get_current_time_locale = 0x40001834; -gmtime = 0x40059848; -gmtime_r = 0x40059868; -localtime = 0x400595dc; -localtime_r = 0x400595fc; -mktime = 0x4005a5e8; -strftime = 0x40059ab4; -time = 0x40001844; -__time_load_locale = 0x4000183c; -tzset = 0x40001a1c; -_tzset_r = 0x40001a28; -__tzcalc_limits = 0x400018a0; -__tz_lock = 0x40001a04; -__tz_unlock = 0x40001a10; -/* The .bss/.data symbols necessary for these functions */ -_timezone = 0x3ffae0a0; -_tzname = 0x3ffae030; -_daylight = 0x3ffae0a4; -__month_lengths = 0x3ff9609c; - -/* These functions don't use time_t, but use other structures which include time_t. - * For example, 'struct stat' contains time_t. - */ -_isatty_r = 0x40000ea0; -__sfvwrite_r = 0x4005893c; -__smakebuf_r = 0x40059108; -__srefill_r = 0x400593d4; -__swsetup_r = 0x40058cc8;