feat: support libc for small devices

This commit is contained in:
Haolan
2025-08-28 20:11:13 +08:00
parent 5587fd2885
commit f3ecce86ee
15 changed files with 1536 additions and 746 deletions

View File

@@ -826,6 +826,7 @@ func linkObjFiles(ctx *context, app string, objFiles, linkArgs []string, verbose
if IsDbgSymsEnabled() { if IsDbgSymsEnabled() {
buildArgs = append(buildArgs, "-gdwarf-4") buildArgs = append(buildArgs, "-gdwarf-4")
} }
buildArgs = append(buildArgs, "--cref", "--Map=t.map")
buildArgs = append(buildArgs, objFiles...) buildArgs = append(buildArgs, objFiles...)

View File

@@ -8,11 +8,8 @@ import (
"os/exec" "os/exec"
"path/filepath" "path/filepath"
"runtime" "runtime"
"slices"
"strings" "strings"
"github.com/goplus/llgo/internal/clang"
"github.com/goplus/llgo/internal/env" "github.com/goplus/llgo/internal/env"
"github.com/goplus/llgo/internal/targets" "github.com/goplus/llgo/internal/targets"
"github.com/goplus/llgo/internal/xtool/llvm" "github.com/goplus/llgo/internal/xtool/llvm"
@@ -218,67 +215,33 @@ func getESPClangPlatform(goos, goarch string) string {
return "" 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") baseDir := filepath.Join(cacheRoot(), "crosscompile")
libcDir := filepath.Join(baseDir, libcName) outputDir := 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
}
compileConfig, err := getCompileLibcConfigByName(baseDir, libcName) compileConfig, err := getCompileLibcConfigByName(baseDir, libcName)
if err != nil { if err != nil {
return return
} }
tempDir, err := os.MkdirTemp("", "compile*") if err = checkDownloadAndExtractLibc(compileConfig, compileConfig.Url, outputDir, compileConfig.ArchiveSrcDir); err != nil {
if err != nil {
return 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) for _, group := range compileConfig.Groups {
if err = checkDownloadAndExtractLibc(compileConfig.Url, libcDir, compileConfig.ArchiveSrcDir); err != nil { err = group.Compile(outputDir, cc, linkerName, exportCCFlags, exportLDFlags)
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")
if err != nil { if err != nil {
return break
} }
fmt.Fprintf(os.Stderr, "Compile libc file %s to %s...\n", file, tempObjFile.Name()) if filepath.Ext(group.OutputFileName) == ".o" {
continue
err = compiler.Compile("-o", tempObjFile.Name(), "-x", "c", "-c", file)
if err != nil {
return
} }
ldflags = append(ldflags, "-l"+ldFlagsFromFileName(group.OutputFileName))
objFiles = append(objFiles, tempObjFile.Name())
} }
args := []string{"-o", libcArchive}
args = append(args, objFiles...)
err = linker.Link(args...)
if err != nil {
return
}
ldflags = append(ldflags, "-nostdlib", "-L", libcDir, "-lc")
return return
} }

View File

@@ -2,6 +2,7 @@ package crosscompile
import ( import (
"archive/tar" "archive/tar"
"archive/zip"
"compress/gzip" "compress/gzip"
"fmt" "fmt"
"io" "io"
@@ -79,9 +80,9 @@ func checkDownloadAndExtractESPClang(platformSuffix, dir string) error {
return nil return nil
} }
func checkDownloadAndExtractLibc(url, dstDir, internalArchiveSrcDir string) error { func checkDownloadAndExtractLibc(cfg *compileLibcConfig, url, dstDir, internalArchiveSrcDir string) error {
// Check if already exists // Check if already exists
if _, err := os.Stat(dstDir); err == nil { if cfg.IsCompiled(dstDir) {
return nil return nil
} }
@@ -94,9 +95,10 @@ func checkDownloadAndExtractLibc(url, dstDir, internalArchiveSrcDir string) erro
defer releaseLock(lockFile) defer releaseLock(lockFile)
// Double-check after acquiring lock // Double-check after acquiring lock
if _, err := os.Stat(dstDir); err == nil { if cfg.IsCompiled(dstDir) {
return nil 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)) 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 { if err := downloadAndExtractArchive(url, tempExtractDir, description); err != nil {
return err return err
} }
defer os.RemoveAll(tempExtractDir) // defer os.RemoveAll(tempExtractDir)
srcDir := tempExtractDir srcDir := tempExtractDir
@@ -182,10 +184,14 @@ func downloadAndExtractArchive(url, destDir, description string) error {
if err != nil { if err != nil {
return fmt.Errorf("failed to extract %s archive: %w", description, err) 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 { } else {
return fmt.Errorf("unsupported archive format: %s", filename) return fmt.Errorf("unsupported archive format: %s", filename)
} }
// Rename temp directory to target directory // Rename temp directory to target directory
if err := os.Rename(tempDir, destDir); err != nil { if err := os.Rename(tempDir, destDir); err != nil {
return fmt.Errorf("failed to rename directory: %w", err) 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) cmd := exec.Command("tar", "-xf", tarXzFile, "-C", dest)
return cmd.Run() 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
}

View File

@@ -3,19 +3,101 @@ package crosscompile
import ( import (
"fmt" "fmt"
"os" "os"
"os/exec"
"path/filepath" "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 // CompileLibcConfig represents libc compilation configuration
type compileLibcConfig struct { type compileLibcConfig struct {
Url string Url string
Name string // Libc name (e.g., "picolibc", "musl", "glibc") Name string // Libc name (e.g., "picolibc", "musl", "glibc")
Files []string // List of source files to compile Groups []compileGroup
CFlags []string // C compiler flags specific to this libc
LDFlags []string // Linker flags
ArchiveSrcDir string 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 // GetCompileLibcConfigByName retrieves libc compilation configuration by name
// Returns compilation file lists and corresponding cflags // Returns compilation file lists and corresponding cflags
func getCompileLibcConfigByName(baseDir, libcName string) (*compileLibcConfig, error) { func getCompileLibcConfigByName(baseDir, libcName string) (*compileLibcConfig, error) {
@@ -27,159 +109,9 @@ func getCompileLibcConfigByName(baseDir, libcName string) (*compileLibcConfig, e
switch libcName { switch libcName {
case "picolibc": case "picolibc":
return getPicolibcConfig(libcDir), nil return getPicolibcConfig(libcDir), nil
case "newlib-esp32":
return getNewlibESP32Config(libcDir, "xtensa"), nil
default: default:
return nil, fmt.Errorf("unsupported libc: %s", libcName) 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"),
}
}

View File

@@ -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",
}
}

View File

@@ -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"),
}
}

185
targets/esp32.app.elf.ld Executable file
View File

@@ -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;

View File

@@ -1,20 +1,25 @@
{ {
"inherits": ["xtensa"], "inherits": [
"xtensa"
],
"cpu": "esp32", "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", "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", "scheduler": "tasks",
"serial": "uart", "serial": "uart",
"linker": "ld.lld", "linker": "ld.lld",
"default-stack-size": 2048, "default-stack-size": 2048,
"rtlib": "compiler-rt", "rtlib": "compiler-rt",
"libc": "picolibc", "libc": "newlib-esp32",
"linkerscript": "targets/esp32.ld", "linkerscript": "targets/esp32.memory.elf.ld",
"extra-files": [ "extra-files": [],
"targets/device/esp/esp32.S"
],
"binary-format": "esp32", "binary-format": "esp32",
"flash-command": "esptool.py --chip=esp32 --port {port} write_flash 0x1000 {bin} -ff 80m -fm dout", "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", "emulator": "qemu-system-xtensa -machine esp32 -nographic -drive file={img},if=mtd,format=raw",
"gdb": ["xtensa-esp32-elf-gdb"] "gdb": [
"xtensa-esp32-elf-gdb"
]
} }

View File

@@ -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";

26
targets/esp32.memory.elf.ld Executable file
View File

@@ -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";

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;
*/

View File

@@ -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;