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() {
buildArgs = append(buildArgs, "-gdwarf-4")
}
buildArgs = append(buildArgs, "--cref", "--Map=t.map")
buildArgs = append(buildArgs, objFiles...)

View File

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

View File

@@ -2,6 +2,7 @@ package crosscompile
import (
"archive/tar"
"archive/zip"
"compress/gzip"
"fmt"
"io"
@@ -79,9 +80,9 @@ func checkDownloadAndExtractESPClang(platformSuffix, dir string) error {
return nil
}
func checkDownloadAndExtractLibc(url, dstDir, internalArchiveSrcDir string) error {
func checkDownloadAndExtractLibc(cfg *compileLibcConfig, url, dstDir, internalArchiveSrcDir string) error {
// Check if already exists
if _, err := os.Stat(dstDir); err == nil {
if cfg.IsCompiled(dstDir) {
return nil
}
@@ -94,9 +95,10 @@ func checkDownloadAndExtractLibc(url, dstDir, internalArchiveSrcDir string) erro
defer releaseLock(lockFile)
// Double-check after acquiring lock
if _, err := os.Stat(dstDir); err == nil {
if cfg.IsCompiled(dstDir) {
return nil
}
fmt.Fprintf(os.Stderr, "%s not found in LLGO_ROOT or cache, will download and compile.\n", dstDir)
description := fmt.Sprintf("Libc %s", path.Base(url))
@@ -105,7 +107,7 @@ func checkDownloadAndExtractLibc(url, dstDir, internalArchiveSrcDir string) erro
if err := downloadAndExtractArchive(url, tempExtractDir, description); err != nil {
return err
}
defer os.RemoveAll(tempExtractDir)
// defer os.RemoveAll(tempExtractDir)
srcDir := tempExtractDir
@@ -182,10 +184,14 @@ func downloadAndExtractArchive(url, destDir, description string) error {
if err != nil {
return fmt.Errorf("failed to extract %s archive: %w", description, err)
}
} else if strings.HasSuffix(filename, ".zip") {
err := extractZip(localFile, tempDir)
if err != nil {
return fmt.Errorf("failed to extract %s archive: %w", description, err)
}
} else {
return fmt.Errorf("unsupported archive format: %s", filename)
}
// Rename temp directory to target directory
if err := os.Rename(tempDir, destDir); err != nil {
return fmt.Errorf("failed to rename directory: %w", err)
@@ -265,3 +271,44 @@ func extractTarXz(tarXzFile, dest string) error {
cmd := exec.Command("tar", "-xf", tarXzFile, "-C", dest)
return cmd.Run()
}
func extractZip(zipFile, dest string) error {
r, err := zip.OpenReader(zipFile)
if err != nil {
return err
}
defer r.Close()
decompress := func(file *zip.File) error {
path := filepath.Join(dest, file.Name)
if file.FileInfo().IsDir() {
return os.MkdirAll(path, 0700)
}
fs, err := file.Open()
if err != nil {
return err
}
defer fs.Close()
w, err := os.Create(path)
if err != nil {
return err
}
if _, err := io.Copy(w, fs); err != nil {
w.Close()
return err
}
if err := w.Close(); err != nil {
return err
}
return nil
}
for _, file := range r.File {
if err = decompress(file); err != nil {
break
}
}
return err
}

View File

@@ -3,19 +3,101 @@ package crosscompile
import (
"fmt"
"os"
"os/exec"
"path/filepath"
"slices"
"strings"
"github.com/goplus/llgo/internal/clang"
)
type compileGroup struct {
OutputFileName string
Files []string // List of source files to compile
CFlags []string // C compiler flags specific to this libc
CCFlags []string
LDFlags []string // Linker flags
}
func (g compileGroup) IsCompiled(outputDir string) bool {
libcArchive := filepath.Join(outputDir, g.OutputFileName)
_, err := os.Stat(libcArchive)
return !os.IsNotExist(err)
}
func (g compileGroup) Compile(outputDir, cc, linkerName string, extraCCFlags, extraLDFlags []string) (err error) {
if g.IsCompiled(outputDir) {
return
}
tmpCompileDir, err := os.MkdirTemp("", "compile-libc-group*")
if err != nil {
return
}
defer os.RemoveAll(tmpCompileDir)
compileLDFlags := append(slices.Clone(extraLDFlags), g.LDFlags...)
compileCCFlags := append(slices.Clone(extraCCFlags), g.CCFlags...)
cfg := clang.NewConfig(cc, compileCCFlags, g.CFlags, compileLDFlags, linkerName)
var objFiles []string
compiler := clang.NewCompiler(cfg)
compiler.Verbose = true
libcArchive := filepath.Join(outputDir, g.OutputFileName)
fmt.Fprintf(os.Stderr, "Start to compile libc group %s to %s...\n", g.OutputFileName, libcArchive)
for _, file := range g.Files {
var tempObjFile *os.File
tempObjFile, err = os.CreateTemp(tmpCompileDir, fmt.Sprintf("%s*.o", strings.ReplaceAll(file, string(os.PathSeparator), "-")))
if err != nil {
return
}
fmt.Fprintf(os.Stderr, "Compile libc file %s to %s...\n", file, tempObjFile.Name())
lang := "c"
if filepath.Ext(file) == ".S" {
lang = "assembler-with-cpp"
}
err = compiler.Compile("-o", tempObjFile.Name(), "-x", lang, "-c", file)
if err != nil {
return
}
objFiles = append(objFiles, tempObjFile.Name())
}
args := []string{"rcs", libcArchive}
args = append(args, objFiles...)
ccDir := filepath.Dir(cc)
llvmAr := filepath.Join(ccDir, "llvm-ar")
cmd := exec.Command(llvmAr, args...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Run()
return
}
// CompileLibcConfig represents libc compilation configuration
type compileLibcConfig struct {
Url string
Name string // Libc name (e.g., "picolibc", "musl", "glibc")
Files []string // List of source files to compile
CFlags []string // C compiler flags specific to this libc
LDFlags []string // Linker flags
Groups []compileGroup
ArchiveSrcDir string
}
func (c compileLibcConfig) IsCompiled(outputDir string) bool {
for _, group := range c.Groups {
if !group.IsCompiled(outputDir) {
return false
}
}
return true
}
// GetCompileLibcConfigByName retrieves libc compilation configuration by name
// Returns compilation file lists and corresponding cflags
func getCompileLibcConfigByName(baseDir, libcName string) (*compileLibcConfig, error) {
@@ -27,159 +109,9 @@ func getCompileLibcConfigByName(baseDir, libcName string) (*compileLibcConfig, e
switch libcName {
case "picolibc":
return getPicolibcConfig(libcDir), nil
case "newlib-esp32":
return getNewlibESP32Config(libcDir, "xtensa"), nil
default:
return nil, fmt.Errorf("unsupported libc: %s", libcName)
}
}
// getPicolibcConfig returns configuration for picolibc
func getPicolibcConfig(baseDir string) *compileLibcConfig {
libcIncludeDir := filepath.Join(baseDir, "libc", "include")
libmIncludeDir := filepath.Join(baseDir, "libm", "common")
localeIncludeDir := filepath.Join(baseDir, "libc", "locale")
os.MkdirAll(baseDir, 0700)
headerFile, _ := os.Create(filepath.Join(baseDir, "picolibc.h"))
headerFile.Close()
return &compileLibcConfig{
Url: "https://github.com/picolibc/picolibc/releases/download/1.8.10/picolibc-1.8.10.tar.xz",
Name: "picolibc",
Files: []string{
filepath.Join(baseDir, "libc", "string", "bcmp.c"),
filepath.Join(baseDir, "libc", "string", "bcopy.c"),
filepath.Join(baseDir, "libc", "string", "bzero.c"),
filepath.Join(baseDir, "libc", "string", "explicit_bzero.c"),
filepath.Join(baseDir, "libc", "string", "ffsl.c"),
filepath.Join(baseDir, "libc", "string", "ffsll.c"),
filepath.Join(baseDir, "libc", "string", "fls.c"),
filepath.Join(baseDir, "libc", "string", "flsl.c"),
filepath.Join(baseDir, "libc", "string", "flsll.c"),
filepath.Join(baseDir, "libc", "string", "gnu_basename.c"),
filepath.Join(baseDir, "libc", "string", "index.c"),
filepath.Join(baseDir, "libc", "string", "memccpy.c"),
filepath.Join(baseDir, "libc", "string", "memchr.c"),
filepath.Join(baseDir, "libc", "string", "memcmp.c"),
filepath.Join(baseDir, "libc", "string", "memcpy.c"),
filepath.Join(baseDir, "libc", "string", "memmem.c"),
filepath.Join(baseDir, "libc", "string", "memmove.c"),
filepath.Join(baseDir, "libc", "string", "mempcpy.c"),
filepath.Join(baseDir, "libc", "string", "memrchr.c"),
filepath.Join(baseDir, "libc", "string", "memset.c"),
filepath.Join(baseDir, "libc", "string", "rawmemchr.c"),
filepath.Join(baseDir, "libc", "string", "rindex.c"),
filepath.Join(baseDir, "libc", "string", "stpcpy.c"),
filepath.Join(baseDir, "libc", "string", "stpncpy.c"),
filepath.Join(baseDir, "libc", "string", "strcasecmp.c"),
filepath.Join(baseDir, "libc", "string", "strcasecmp_l.c"),
filepath.Join(baseDir, "libc", "string", "strcasestr.c"),
filepath.Join(baseDir, "libc", "string", "strcat.c"),
filepath.Join(baseDir, "libc", "string", "strchr.c"),
filepath.Join(baseDir, "libc", "string", "strchrnul.c"),
filepath.Join(baseDir, "libc", "string", "strcmp.c"),
filepath.Join(baseDir, "libc", "string", "strcoll.c"),
filepath.Join(baseDir, "libc", "string", "strcoll_l.c"),
filepath.Join(baseDir, "libc", "string", "strcpy.c"),
filepath.Join(baseDir, "libc", "string", "strcspn.c"),
filepath.Join(baseDir, "libc", "string", "strerror_r.c"),
filepath.Join(baseDir, "libc", "string", "strlcat.c"),
filepath.Join(baseDir, "libc", "string", "strlcpy.c"),
filepath.Join(baseDir, "libc", "string", "strlen.c"),
filepath.Join(baseDir, "libc", "string", "strlwr.c"),
filepath.Join(baseDir, "libc", "string", "strncasecmp.c"),
filepath.Join(baseDir, "libc", "string", "strncasecmp_l.c"),
filepath.Join(baseDir, "libc", "string", "strncat.c"),
filepath.Join(baseDir, "libc", "string", "strncmp.c"),
filepath.Join(baseDir, "libc", "string", "strncpy.c"),
filepath.Join(baseDir, "libc", "string", "strndup.c"),
filepath.Join(baseDir, "libc", "string", "strnlen.c"),
filepath.Join(baseDir, "libc", "string", "strnstr.c"),
filepath.Join(baseDir, "libc", "string", "strpbrk.c"),
filepath.Join(baseDir, "libc", "string", "strrchr.c"),
filepath.Join(baseDir, "libc", "string", "strsep.c"),
filepath.Join(baseDir, "libc", "string", "strsignal.c"),
filepath.Join(baseDir, "libc", "string", "strspn.c"),
filepath.Join(baseDir, "libc", "string", "strstr.c"),
filepath.Join(baseDir, "libc", "string", "strtok.c"),
filepath.Join(baseDir, "libc", "string", "strtok_r.c"),
filepath.Join(baseDir, "libc", "string", "strupr.c"),
filepath.Join(baseDir, "libc", "string", "strverscmp.c"),
filepath.Join(baseDir, "libc", "string", "strxfrm.c"),
filepath.Join(baseDir, "libc", "string", "strxfrm_l.c"),
filepath.Join(baseDir, "libc", "string", "swab.c"),
filepath.Join(baseDir, "libc", "string", "timingsafe_bcmp.c"),
filepath.Join(baseDir, "libc", "string", "timingsafe_memcmp.c"),
filepath.Join(baseDir, "libc", "string", "strerror.c"),
filepath.Join(baseDir, "libc", "string", "wcpcpy.c"),
filepath.Join(baseDir, "libc", "string", "wcpncpy.c"),
filepath.Join(baseDir, "libc", "string", "wcscasecmp.c"),
filepath.Join(baseDir, "libc", "string", "wcscasecmp_l.c"),
filepath.Join(baseDir, "libc", "string", "wcscat.c"),
filepath.Join(baseDir, "libc", "string", "wcschr.c"),
filepath.Join(baseDir, "libc", "string", "wcscmp.c"),
filepath.Join(baseDir, "libc", "string", "wcscoll.c"),
filepath.Join(baseDir, "libc", "string", "wcscoll_l.c"),
filepath.Join(baseDir, "libc", "string", "wcscpy.c"),
filepath.Join(baseDir, "libc", "string", "wcscspn.c"),
filepath.Join(baseDir, "libc", "string", "wcsdup.c"),
filepath.Join(baseDir, "libc", "string", "wcslcat.c"),
filepath.Join(baseDir, "libc", "string", "wcslcpy.c"),
filepath.Join(baseDir, "libc", "string", "wcslen.c"),
filepath.Join(baseDir, "libc", "string", "wcsncasecmp.c"),
filepath.Join(baseDir, "libc", "string", "wcsncasecmp_l.c"),
filepath.Join(baseDir, "libc", "string", "wcsncat.c"),
filepath.Join(baseDir, "libc", "string", "wcsncmp.c"),
filepath.Join(baseDir, "libc", "string", "wcsncpy.c"),
filepath.Join(baseDir, "libc", "string", "wcsnlen.c"),
filepath.Join(baseDir, "libc", "string", "wcspbrk.c"),
filepath.Join(baseDir, "libc", "string", "wcsrchr.c"),
filepath.Join(baseDir, "libc", "string", "wcsspn.c"),
filepath.Join(baseDir, "libc", "string", "wcsstr.c"),
filepath.Join(baseDir, "libc", "string", "wcstok.c"),
filepath.Join(baseDir, "libc", "string", "wcswidth.c"),
filepath.Join(baseDir, "libc", "string", "wcsxfrm.c"),
filepath.Join(baseDir, "libc", "string", "wcsxfrm_l.c"),
filepath.Join(baseDir, "libc", "string", "wcwidth.c"),
filepath.Join(baseDir, "libc", "string", "wmemchr.c"),
filepath.Join(baseDir, "libc", "string", "wmemcmp.c"),
filepath.Join(baseDir, "libc", "string", "wmemcpy.c"),
filepath.Join(baseDir, "libc", "string", "wmemmove.c"),
filepath.Join(baseDir, "libc", "string", "wmempcpy.c"),
filepath.Join(baseDir, "libc", "string", "wmemset.c"),
filepath.Join(baseDir, "libc", "string", "xpg_strerror_r.c"),
filepath.Join(baseDir, "libc", "stdlib", "nano-calloc.c"),
filepath.Join(baseDir, "libc", "stdlib", "nano-malloc.c"),
filepath.Join(baseDir, "libc", "stdlib", "nano-pvalloc.c"),
filepath.Join(baseDir, "libc", "stdlib", "nano-realloc.c"),
filepath.Join(baseDir, "libc", "stdlib", "nano-valloc.c"),
filepath.Join(baseDir, "libc", "stdlib", "rand.c"),
filepath.Join(baseDir, "libc", "stdlib", "srand.c"),
filepath.Join(baseDir, "libc", "stdlib", "nano-free.c"),
filepath.Join(baseDir, "libc", "tinystdio", "printf.c"),
filepath.Join(baseDir, "libc", "tinystdio", "putchar.c"),
filepath.Join(baseDir, "libc", "tinystdio", "puts.c"),
},
CFlags: []string{
"-D_COMPILING_NEWLIB",
"-D_HAVE_ALIAS_ATTRIBUTE",
"-DTINY_STDIO",
"-DPOSIX_IO",
"-DFORMAT_DEFAULT_INTEGER",
"-D_IEEE_LIBM",
"-D__OBSOLETE_MATH_FLOAT=1",
"-D__OBSOLETE_MATH_DOUBLE=0",
"-D_WANT_IO_C99_FORMATS",
"-nostdlib",
"-isystem" + libcIncludeDir,
"-I" + libmIncludeDir,
"-I" + localeIncludeDir,
"-I" + baseDir,
"-I" + filepath.Join(baseDir, "libc", "tinystdio"),
},
LDFlags: []string{"-nostdlib"},
ArchiveSrcDir: filepath.Join("picolibc-1.8.10", "newlib"),
}
}

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",
"features": "+atomctl,+bool,+clamps,+coprocessor,+debug,+density,+dfpaccel,+div32,+exception,+fp,+highpriinterrupts,+interrupt,+loop,+mac16,+memctl,+minmax,+miscsr,+mul32,+mul32high,+nsa,+prid,+regprotect,+rvector,+s32c1i,+sext,+threadptr,+timerint,+windowed",
"build-tags": ["esp32", "esp"],
"build-tags": [
"esp32",
"esp"
],
"scheduler": "tasks",
"serial": "uart",
"linker": "ld.lld",
"default-stack-size": 2048,
"rtlib": "compiler-rt",
"libc": "picolibc",
"linkerscript": "targets/esp32.ld",
"extra-files": [
"targets/device/esp/esp32.S"
],
"libc": "newlib-esp32",
"linkerscript": "targets/esp32.memory.elf.ld",
"extra-files": [],
"binary-format": "esp32",
"flash-command": "esptool.py --chip=esp32 --port {port} write_flash 0x1000 {bin} -ff 80m -fm dout",
"emulator": "qemu-system-xtensa -machine esp32 -nographic -drive file={img},if=mtd,format=raw",
"gdb": ["xtensa-esp32-elf-gdb"]
"gdb": [
"xtensa-esp32-elf-gdb"
]
}

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;