Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  Android.bp   Sprache: unbekannt

 
Spracherkennung für: .bp vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

package {
    default_applicable_licenses: ["bionic_libc_license"],
}

license {
    name: "bionic_libc_license",
    visibility: [":__subpackages__"],
    license_kinds: [
        "SPDX-license-identifier-Apache-2.0",
        "SPDX-license-identifier-BSD",
        "SPDX-license-identifier-ISC",
        "SPDX-license-identifier-MIT",
        "legacy_notice",
        "legacy_unencumbered",
    ],
    license_text: [
        "NOTICE",
    ],
}

libc_common_flags = [
    "-D_LIBC=1",
    "-Wall",
    "-Wextra",
    "-Wunused",
    "-Wno-char-subscripts",
    "-Wno-deprecated-declarations",
    "-Wno-gcc-compat",
    "-Wframe-larger-than=2048",
    "-Wno-reorder-init-list",

    // Try to catch typical 32-bit assumptions that break with 64-bit pointers.
    "-Werror=pointer-to-int-cast",
    "-Werror=int-to-pointer-cast",
    "-Werror=type-limits",
    "-Werror",

    // Clang's exit-time destructor registration hides __dso_handle, but
    // __dso_handle needs to have default visibility on ARM32. See b/73485611.
    "-Wexit-time-destructors",

    // We know clang does a lot of harm by rewriting what we've said, and sadly
    // never see any good it does, so let's just ask it to do what we say...
    // (The specific motivating example was clang turning a loop that would only
    // ever touch 01, or 2 bytes into a call to memset, which was never going
    // to amortize.)
    "-fno-builtin",
]

soong_config_module_type {
    name: "bionic_cc_defaults",
    module_type: "cc_defaults",
    config_namespace: "ANDROID",
    bool_variables: ["release_deprecate_runtime_apex"],
    properties: ["apex_available"],
}

// Define some common cflags
// ========================================================
bionic_cc_defaults {
    name: "libc_defaults",
    defaults: [
        "linux_bionic_supported",
    ],
    cflags: libc_common_flags + [
        "-DUSE_SCUDO",
    ],
    asflags: libc_common_flags,
    conlyflags: ["-std=gnu99"],
    cppflags: [],
    include_dirs: [
        "bionic/libc/async_safe/include",
        "bionic/libc/platform",
        // For android_filesystem_config.h.
        "system/core/libcutils/include",
    ],

    header_libs: [
        "libc_headers",
        "liblog_headers", // needed by bionic/libc/async_safe/include
    ],
    export_header_lib_headers: [
        "libc_headers",
    ],

    stl: "none",
    system_shared_libs: [],
    sanitize: {
        address: false,
        integer_overflow: false,
        // TODO(b/132640749): Fix broken fuzzer support.
        fuzzer: false,
    },
    ramdisk_available: true,
    vendor_ramdisk_available: true,
    recovery_available: true,
    native_bridge_supported: true,

    product_variables: {
        malloc_zero_contents: {
            cflags: ["-DSCUDO_ZERO_CONTENTS"],
        },
        malloc_pattern_fill_contents: {
            cflags: ["-DSCUDO_PATTERN_FILL_CONTENTS"],
        },
        malloc_low_memory: {
            cflags: ["-UUSE_SCUDO"],
        },
    },

    lto: {
        never: true,
    },

    soong_config_variables: {
        release_deprecate_runtime_apex: {
            apex_available: ["//apex_available:platform"],
            conditions_default: {
                apex_available: ["com.android.runtime"],
            },
        },
    },
}

// Workaround for b/24465209.
// We're unlikely to be able to remove this before we just
// remove ILP32 support completely.
// Note that we also still have `pack_relocations: false`
// for both libc and libm, even on LP64.
// ========================================================
cc_defaults {
    name: "bug_24465209_workaround",
    target: {
        android_arm: {
            pack_relocations: false,
            ldflags: ["-Wl,--hash-style=both"],
        },
        android_x86: {
            pack_relocations: false,
            ldflags: ["-Wl,--hash-style=both"],
        },
    },
}

// Leave the symbols in the shared library so that stack unwinders can produce
// meaningful name resolution. This is a bit more ugly than it sounds because
// arm32 is a bit broken.
// ========================================================
cc_defaults {
    name: "keep_symbols",
    arch: {
        arm: {
            // arm32 does not produce complete exidx unwind information,
            // so keep the .debug_frame which is relatively small and does
            // include needed unwind information.
            // See b/132992102 for details.
            strip: {
                keep_symbols_and_debug_frame: true,
            },
        },
        arm64: {
            strip: {
                keep_symbols: true,
            },
        },
        riscv64: {
            strip: {
                keep_symbols: true,
            },
        },
        x86: {
            strip: {
                keep_symbols: true,
            },
        },
        x86_64: {
            strip: {
                keep_symbols: true,
            },
        },
    },
}

// Defaults for native allocator libs/includes to make it
// easier to change.
// ========================================================
cc_defaults {
    name: "libc_native_allocator_defaults",

    whole_static_libs: [
        "libscudo",
    ],
    cflags: [
        "-DUSE_SCUDO",
    ],
    header_libs: ["gwp_asan_headers"],
    product_variables: {
        malloc_low_memory: {
            cflags: ["-UUSE_SCUDO"],
            whole_static_libs: [
                "libjemalloc5",
                "libc_jemalloc_wrapper",
            ],
            exclude_static_libs: [
                "libscudo",
            ],
        },
    },
}

// Functions not implemented by jemalloc directly, or that need to
// be modified for Android.
cc_library_static {
    name: "libc_jemalloc_wrapper",
    defaults: ["libc_defaults"],
    srcs: ["bionic/jemalloc_wrapper.cpp"],
    cflags: ["-fvisibility=hidden"],

    // Used to pull in the jemalloc include directory so that if the
    // library is removed, the include directory is also removed.
    static_libs: ["libjemalloc5"],
}

// ========================================================
// libc_bootstrap.a - -fno-stack-protector and -ffreestanding
// ========================================================
//
// Code that implements the stack protector (or that runs before TLS has been set up) needs to be
// compiled with -fno-stack-protector, since it accesses the stack canary TLS slot. In the linker,
// some of this code runs before ifunc resolvers have made string.h functions work, so compile with
// -ffreestanding.

cc_library_static {
    name: "libc_bootstrap",

    srcs: [
        "bionic/__libc_init_main_thread.cpp",
        "bionic/__stack_chk_fail.cpp",
        "bionic/bionic_call_ifunc_resolver.cpp",
        "bionic/getauxval.cpp",
    ],
    arch: {
        x86: {
            srcs: [
                "arch-x86/bionic/__libc_init_sysinfo.cpp",
                "arch-x86/bionic/__libc_int0x80.S",
                "arch-x86/bionic/__set_tls.cpp",
            ],
        },
    },

    defaults: ["libc_defaults"],
    cflags: [
        "-fno-stack-protector",
        "-ffreestanding",
    ],
}

filegroup {
    name: "elf_note_sources",
    srcs: ["bionic/elf_note.cpp"],
}

// libc_init_static.cpp and libc_init_dynamic.cpp need to be built without stack protector.
// libc_init_static.cpp sets up TLS for static executables, and libc_init_dynamic.cpp initializes
// the stack protector global variable.

cc_library_static {
    name: "libc_init_static",
    defaults: ["libc_defaults"],
    srcs: [
        "bionic/libc_init_mte.cpp",
        "bionic/libc_init_static.cpp",
        ":elf_note_sources",
    ],
    cflags: [
        "-fno-stack-protector",

        // Compile libc_init_static.cpp with -ffreestanding, because some of its code is called
        // from the linker before ifunc resolvers have made string.h functions available.
        "-ffreestanding",
    ],
}

cc_library_static {
    name: "libc_init_dynamic",
    defaults: ["libc_defaults"],
    srcs: ["bionic/libc_init_dynamic.cpp"],
    cflags: ["-fno-stack-protector"],
}

// ========================================================
// libc_tzcode.a - upstream 'tzcode' code
// ========================================================

cc_library_static {
    name: "libc_tzcode",

    defaults: ["libc_defaults"],
    srcs: [
        "tzcode/**/*.c",
        "tzcode/bionic.cpp",
        // tzcode doesn't include strptime, so we use a fork of the
        // OpenBSD code which needs this global data.
        "upstream-openbsd/lib/libc/locale/_def_time.c",
        // tzcode doesn't include wcsftime, so we use the FreeBSD code.
        "upstream-freebsd/lib/libc/locale/wcsftime.c",
    ],

    cflags: [
        "-Wno-tautological-constant-out-of-range-compare",
        "-Wno-unused-parameter",
        // Don't use ridiculous amounts of stack.
        "-DALL_STATE",
        // Include tzsetwall, timelocal, timegm, time2posix, and posix2time.
        "-DSTD_INSPIRED",
        // Obviously, we want to be thread-safe.
        "-DTHREAD_SAFE=1",
        // The name of the tm_gmtoff field in our struct tm.
        "-DTM_GMTOFF=tm_gmtoff",
        // Android uses a system property instead of /etc/localtime, so make callers crash.
        "-DTZDEFAULT=NULL",
        // Where we store our tzdata.
        "-DTZDIR=\"/system/usr/share/zoneinfo\"",
        // Include `tzname`, `timezone`, and `daylight` globals.
        "-DHAVE_POSIX_DECLS=0",
        "-DUSG_COMPAT=2",
        "-DHAVE_TZNAME=2",
        // stdbool.h is available
        "-DHAVE_STDBOOL_H",
        // Use the empty string (instead of "   ") as the timezone abbreviation
        // fallback.
        "-DWILDABBR=\"\"",
        "-Dlint",
    ],

    local_include_dirs: [
        "tzcode/",
        "upstream-freebsd/android/include",
    ],
}

// ========================================================
// libc_dns.a - modified NetBSD DNS code
// ========================================================

cc_library_static {
    name: "libc_dns",

    defaults: ["libc_defaults"],
    srcs: [
        "dns/**/*.c*",

        "upstream-netbsd/lib/libc/isc/ev_streams.c",
        "upstream-netbsd/lib/libc/isc/ev_timers.c",
    ],

    cflags: [
        "-DANDROID_CHANGES",
        "-DINET6",
        "-Wno-unused-parameter",
        "-include netbsd-compat.h",
        "-Wframe-larger-than=66000",
    ],

    local_include_dirs: [
        "dns/include",
        "private",
        "upstream-netbsd/lib/libc/include",
        "upstream-netbsd/android/include",
    ],
}

// ========================================================
// libc_freebsd.a - upstream FreeBSD C library code
// ========================================================
//
// These files are built with the freebsd-compat.h header file
// automatically included.

cc_library_static {
    name: "libc_freebsd_ldexp",
    defaults: ["libc_defaults"],
    cflags: ["-Dscalbn=ldexp"],
    srcs: [":libc_ldexp_srcs"],
}

cc_library_static {
    name: "libc_freebsd",
    defaults: ["libc_defaults"],
    srcs: [
        "upstream-freebsd/lib/libc/stdlib/getopt_long.c",
        "upstream-freebsd/lib/libc/stdlib/quick_exit.c",
    ],

    cflags: [
        "-Wno-sign-compare",
        "-Wno-unused-parameter",
        "-include freebsd-compat.h",
    ],

    local_include_dirs: [
        "upstream-freebsd/android/include",
    ],
}

cc_library_static {
    name: "libc_freebsd_large_stack",
    defaults: ["libc_defaults"],
    srcs: [
        "upstream-freebsd/lib/libc/gen/glob.c",
    ],

    cflags: [
        "-Wno-sign-compare",
        "-include freebsd-compat.h",
        "-Wframe-larger-than=66000",
    ],

    local_include_dirs: [
        "upstream-freebsd/android/include",
    ],
}

// ========================================================
// libc_netbsd.a - upstream NetBSD C library code
// ========================================================
//
// These files are built with the netbsd-compat.h header file
// automatically included.

cc_library_static {
    name: "libc_netbsd",
    defaults: ["libc_defaults"],
    srcs: [
        "upstream-netbsd/common/lib/libc/stdlib/random.c",
        "upstream-netbsd/lib/libc/gen/nice.c",
        "upstream-netbsd/lib/libc/inet/nsap_addr.c",
        "upstream-netbsd/lib/libc/regex/regcomp.c",
        "upstream-netbsd/lib/libc/regex/regerror.c",
        "upstream-netbsd/lib/libc/regex/regexec.c",
        "upstream-netbsd/lib/libc/regex/regfree.c",
        "upstream-netbsd/lib/libc/stdlib/drand48.c",
        "upstream-netbsd/lib/libc/stdlib/erand48.c",
        "upstream-netbsd/lib/libc/stdlib/jrand48.c",
        "upstream-netbsd/lib/libc/stdlib/lcong48.c",
        "upstream-netbsd/lib/libc/stdlib/lrand48.c",
        "upstream-netbsd/lib/libc/stdlib/mrand48.c",
        "upstream-netbsd/lib/libc/stdlib/nrand48.c",
        "upstream-netbsd/lib/libc/stdlib/_rand48.c",
        "upstream-netbsd/lib/libc/stdlib/rand_r.c",
        "upstream-netbsd/lib/libc/stdlib/seed48.c",
        "upstream-netbsd/lib/libc/stdlib/srand48.c",
    ],
    multilib: {
        lib32: {
            // LP32 cruft
            srcs: ["upstream-netbsd/common/lib/libc/hash/sha1/sha1.c"],
        },
    },
    cflags: [
        "-Wno-sign-compare",
        "-Wno-unused-parameter",
        "-DPOSIX_MISTAKE",
        "-include netbsd-compat.h",
    ],

    local_include_dirs: [
        "upstream-netbsd/android/include",
        "upstream-netbsd/lib/libc/include",
    ],
}

// ========================================================
// libc_openbsd.a - upstream OpenBSD C library code
// ========================================================
//
// These files are built with the openbsd-compat.h header file
// automatically included.
cc_library_static {
    name: "libc_openbsd",
    defaults: ["libc_defaults"],
    srcs: [
        "upstream-openbsd/lib/libc/crypt/arc4random.c",
        "upstream-openbsd/lib/libc/crypt/arc4random_uniform.c",
        "upstream-openbsd/lib/libc/gen/alarm.c",
        "upstream-openbsd/lib/libc/gen/ctype_.c",
        "upstream-openbsd/lib/libc/gen/daemon.c",
        "upstream-openbsd/lib/libc/gen/fnmatch.c",
        "upstream-openbsd/lib/libc/gen/ftok.c",
        "upstream-openbsd/lib/libc/locale/btowc.c",
        "upstream-openbsd/lib/libc/locale/mbrlen.c",
        "upstream-openbsd/lib/libc/locale/mbstowcs.c",
        "upstream-openbsd/lib/libc/locale/mbtowc.c",
        "upstream-openbsd/lib/libc/locale/wcstombs.c",
        "upstream-openbsd/lib/libc/locale/wctob.c",
        "upstream-openbsd/lib/libc/locale/wctomb.c",
        "upstream-openbsd/lib/libc/net/base64.c",
        "upstream-openbsd/lib/libc/net/inet_lnaof.c",
        "upstream-openbsd/lib/libc/net/inet_makeaddr.c",
        "upstream-openbsd/lib/libc/net/inet_netof.c",
        "upstream-openbsd/lib/libc/net/inet_ntoa.c",
        "upstream-openbsd/lib/libc/net/inet_ntop.c",
        "upstream-openbsd/lib/libc/net/inet_pton.c",
        "upstream-openbsd/lib/libc/net/res_random.c",
        "upstream-openbsd/lib/libc/stdio/fgetwc.c",
        "upstream-openbsd/lib/libc/stdio/fgetws.c",
        "upstream-openbsd/lib/libc/stdio/flags.c",
        "upstream-openbsd/lib/libc/stdio/fputwc.c",
        "upstream-openbsd/lib/libc/stdio/fputws.c",
        "upstream-openbsd/lib/libc/stdio/fvwrite.c",
        "upstream-openbsd/lib/libc/stdio/getdelim.c",
        "upstream-openbsd/lib/libc/stdio/gets.c",
        "upstream-openbsd/lib/libc/stdio/mktemp.c",
        "upstream-openbsd/lib/libc/stdio/open_memstream.c",
        "upstream-openbsd/lib/libc/stdio/open_wmemstream.c",
        "upstream-openbsd/lib/libc/stdio/ungetc.c",
        "upstream-openbsd/lib/libc/stdio/ungetwc.c",
        "upstream-openbsd/lib/libc/stdio/vswprintf.c",
        "upstream-openbsd/lib/libc/stdio/wbuf.c",
        "upstream-openbsd/lib/libc/stdio/wsetup.c",
        "upstream-openbsd/lib/libc/stdlib/getsubopt.c",
        "upstream-openbsd/lib/libc/stdlib/recallocarray.c",
        "upstream-openbsd/lib/libc/stdlib/tfind.c",
        "upstream-openbsd/lib/libc/stdlib/tsearch.c",
        "upstream-openbsd/lib/libc/string/strcasestr.c",

        // These files are originally from OpenBSD,
        // and benefit from being compiled with openbsd-compat.h.
        // TODO: clean them up instead.
        "bionic/fts.c",
        "stdio/vfprintf.cpp",
        "stdio/vfwprintf.cpp",
    ],

    cflags: [
        "-Wno-sign-compare",
        "-Wno-unused-parameter",
        "-include openbsd-compat.h",
    ],

    local_include_dirs: [
        "private",
        "stdio",
        "upstream-openbsd/android/include/",
        "upstream-openbsd/lib/libc/gdtoa/",
        "upstream-openbsd/lib/libc/include/",
        "upstream-openbsd/lib/libc/stdio/",
    ],
}

cc_library_static {
    name: "libc_openbsd_large_stack",
    defaults: ["libc_defaults"],
    srcs: [
        "upstream-openbsd/lib/libc/string/memmem.c",
        "upstream-openbsd/lib/libc/string/strstr.c",
    ],
    cflags: [
        "-include openbsd-compat.h",
        "-Wno-sign-compare",
        "-Wframe-larger-than=5000",
    ],

    local_include_dirs: [
        "upstream-openbsd/android/include/",
    ],
}

// ========================================================
// libc_gdtoa.a - upstream OpenBSD C library gdtoa code
// ========================================================
//
// These files are built with the openbsd-compat.h header file
// automatically included.

cc_library_static {
    name: "libc_gdtoa",
    defaults: ["libc_defaults"],
    srcs: [
        "upstream-openbsd/android/gdtoa_support.cpp",
        "upstream-openbsd/lib/libc/gdtoa/dmisc.c",
        "upstream-openbsd/lib/libc/gdtoa/dtoa.c",
        "upstream-openbsd/lib/libc/gdtoa/gdtoa.c",
        "upstream-openbsd/lib/libc/gdtoa/gethex.c",
        "upstream-openbsd/lib/libc/gdtoa/gmisc.c",
        "upstream-openbsd/lib/libc/gdtoa/hd_init.c",
        "upstream-openbsd/lib/libc/gdtoa/hdtoa.c",
        "upstream-openbsd/lib/libc/gdtoa/hexnan.c",
        "upstream-openbsd/lib/libc/gdtoa/ldtoa.c",
        "upstream-openbsd/lib/libc/gdtoa/misc.c",
        "upstream-openbsd/lib/libc/gdtoa/smisc.c",
        "upstream-openbsd/lib/libc/gdtoa/strtod.c",
        "upstream-openbsd/lib/libc/gdtoa/strtodg.c",
        "upstream-openbsd/lib/libc/gdtoa/strtof.c",
        "upstream-openbsd/lib/libc/gdtoa/strtord.c",
        "upstream-openbsd/lib/libc/gdtoa/sum.c",
        "upstream-openbsd/lib/libc/gdtoa/ulp.c",
    ],
    multilib: {
        lib64: {
            srcs: ["upstream-openbsd/lib/libc/gdtoa/strtorQ.c"],
        },
    },

    cflags: [
        "-Wno-sign-compare",
        "-include openbsd-compat.h",
    ],

    local_include_dirs: [
        "private",
        "upstream-openbsd/android/include",
        "upstream-openbsd/lib/libc/include",
    ],
}

// ========================================================
// libc_fortify.a - container for our FORTIFY
// implementation details
// ========================================================
cc_library_static {
    name: "libc_fortify",
    defaults: ["libc_defaults"],
    srcs: ["bionic/fortify.cpp"],

    // Disable FORTIFY for the compilation of these, so we don't end up having
    // FORTIFY silently call itself.
    cflags: [
        "-U_FORTIFY_SOURCE",
        "-D__BIONIC_DECLARE_FORTIFY_HELPERS",
    ],

    arch: {
        arm: {
            cflags: [
                "-DRENAME___STRCAT_CHK",
                "-DRENAME___STRCPY_CHK",
            ],
            srcs: [
                "arch-arm/generic/string/__memcpy_chk.S",

                "arch-arm/cortex-a15/string/__strcat_chk.S",
                "arch-arm/cortex-a15/string/__strcpy_chk.S",

                "arch-arm/cortex-a7/string/__strcat_chk.S",
                "arch-arm/cortex-a7/string/__strcpy_chk.S",

                "arch-arm/cortex-a9/string/__strcat_chk.S",
                "arch-arm/cortex-a9/string/__strcpy_chk.S",

                "arch-arm/krait/string/__strcat_chk.S",
                "arch-arm/krait/string/__strcpy_chk.S",

                "arch-arm/cortex-a53/string/__strcat_chk.S",
                "arch-arm/cortex-a53/string/__strcpy_chk.S",

                "arch-arm/cortex-a55/string/__strcat_chk.S",
                "arch-arm/cortex-a55/string/__strcpy_chk.S",
            ],
        },
        arm64: {
            srcs: [
                "arch-arm64/string/__memcpy_chk.S",
                "arch-arm64/string/__memset_chk.S",
            ],
        },
    },
}

// ========================================================
// icu4x_bionic.a - Thin Rust wrapper around ICU4X
// ========================================================

rust_library_rlib {
    name: "libicu4x_bionic",
    crate_name: "icu4x_bionic",
    crate_root: "bionic/icu4x.rs",
    edition: "2021",
    features: [],
    rustlibs: [
        "//external/rust/android-crates-io/crates/icu_casemap:libicu_casemap",
        "//external/rust/android-crates-io/crates/icu_collections:libicu_collections",
        "//external/rust/android-crates-io/crates/icu_properties:libicu_properties",
    ],
    apex_available: [
        "//apex_available:platform",
        "//apex_available:anyapex",
    ],
    vendor_available: true,
    product_available: true,
    ramdisk_available: true,
    vendor_ramdisk_available: true,
    recovery_available: true,
    native_bridge_supported: true,
    sdk_version: "minimum",
    no_stdlibs: true,
    defaults: ["linux_bionic_supported"],
}

// current rust implementation detail; will be removed as part of a larger cleanup later
// go/android-mto-staticlibs-in-make
cc_rustlibs_for_make {
    name: "libstatic_rustlibs_for_make",
    whole_static_libs: [
        "libicu4x_bionic",
        "libbionic_panic_abort",
        "liblibc_alloc_rust",
    ],
    apex_available: [
        "//apex_available:platform",
        "//apex_available:anyapex",
    ],
    vendor_available: true,
    product_available: true,
    ramdisk_available: true,
    vendor_ramdisk_available: true,
    recovery_available: true,
    native_bridge_supported: true,
    defaults: ["linux_bionic_supported"],
}

// ========================================================
// portable_simd_* - C++ that uses SIMD intrinsics that are
// meant to be "portable" to various different sets of
// SIMD intrinsics.
// ========================================================

// Defaults for 'portable-simd' functions like `mem*`, `str*`.
// These are highly performance-sensitive and an alternative to hand-written
// asm, so:
// - sanitizers are disabled (in part because these reach out of bounds in
//   buffers on purpose - otherwise, there's no way to vectorize things like
//   `strlen`.)
// - stack protectors are disabled for parity with asm
// - similarly, zeroing stack vars is disabled.
cc_defaults {
    name: "libc_bionic_portable_simd_defaults",
    defaults: ["libc_defaults"],
    header_libs: ["//external/google-highway:hwy_headers_only"],
    cflags: [
        "-fno-sanitize=all",
        "-fno-stack-protector",
        "-ftrivial-auto-var-init=uninitialized",
    ],
    sanitize: {
        hwaddress: false,
    },
}

cc_defaults {
    name: "libc_bionic_portable_simd_x86_64_defaults",
    defaults: ["libc_bionic_portable_simd_defaults"],
    arch: {
        x86_64: {
            srcs: [
                "portable-simd/memchr.cpp",
                "portable-simd/strlen.cpp",
                "portable-simd/strspn.cpp",
            ],
        },
    },
}

cc_defaults {
    name: "libc_bionic_portable_simd_x86_64_v2_defaults",
    defaults: ["libc_bionic_portable_simd_x86_64_defaults"],
    arch: {
        x86_64: {
            cflags: [
                "-DPSIMD_TARGET_SSE=1",
                // Since this is the Android build system's default ABI, don't
                // bother setting CFLAGS for v2.
            ],
        },
    },
}

cc_library_static {
    name: "libc_bionic_portable_simd_x86_64_v2",
    defaults: ["libc_bionic_portable_simd_x86_64_v2_defaults"],
}

cc_library_static {
    name: "libc_bionic_portable_simd_x86_64_no_ifuncs",
    defaults: ["libc_bionic_portable_simd_x86_64_v2_defaults"],
    arch: {
        x86_64: {
            cflags: [
                "-DPSIMD_ADD_LIBC_ALIASES=1",
            ],
        },
    },
}

cc_library_static {
    name: "libc_bionic_portable_simd_x86_64_v3",
    defaults: ["libc_bionic_portable_simd_x86_64_defaults"],
    arch: {
        x86_64: {
            cflags: [
                "-DPSIMD_TARGET_AVX2=1",
                // x86-64-v3 feature flags. We _could_ just write
                // `-march=x86-64-v3` here, but doing so overrides any `-march`
                // given by the build system, so `-march=x86-64-v3` could end
                // up unnecessarily restricting what Clang can generate here.
                //
                // See https://clang.llvm.org/docs/UsersManual.html#x86 for the
                // features Clang associates with x86-64-v3. These are kept in
                // the order of that doc.
                "-mavx",
                "-mavx2",
                "-mbmi",
                "-mbmi2",
                "-mf16c",
                "-mfma",
                "-mlzcnt",
                "-mmovbe",
                "-mxsave",
            ],
        },
    },
}

cc_defaults {
    name: "libc_bionic_portable_simd_arm64_neon_defaults",
    defaults: ["libc_bionic_portable_simd_defaults"],
    arch: {
        arm64: {
            cflags: [
                "-DPSIMD_TARGET_NEON=1",
                // Since this is the Android build system's default ABI, don't
                // bother setting CFLAGS for neon.
            ],
            srcs: [
                "portable-simd/memchr.cpp",
                "portable-simd/strlen.cpp",
            ],
        },
    },
}

cc_library_static {
    name: "libc_bionic_portable_simd_arm64_neon_no_mte",
    defaults: ["libc_bionic_portable_simd_arm64_neon_defaults"],
    arch: {
        arm64: {
            srcs: [
                "portable-simd/strspn.cpp",
            ],
        },
    },
}

cc_library_static {
    name: "libc_bionic_portable_simd_arm64_neon_mte",
    defaults: ["libc_bionic_portable_simd_arm64_neon_defaults"],
    arch: {
        arm64: {
            cflags: [
                "-DPSIMD_MTE_ENABLED=1",
            ],
            // N.B., strspn's regular implementation is MTE-compatible, so it
            // exports strspn/strcspn symbols directly. No need to include
            // here.
        },
    },
}

cc_library_static {
    name: "libc_bionic_portable_simd_arm64_no_ifuncs",
    defaults: ["libc_bionic_portable_simd_arm64_neon_defaults"],
    arch: {
        arm64: {
            cflags: [
                // Conservatively assume MTE.
                "-DPSIMD_MTE_ENABLED=1",
                "-DPSIMD_ADD_LIBC_ALIASES=1",
            ],
        },
    },
}

// ========================================================
// libc_bionic.a - home-grown C library code
// ========================================================

cc_library_static {
    name: "libc_bionic",
    defaults: ["libc_defaults"],
    srcs: [
        "bionic/NetdClientDispatch.cpp",
        "bionic/__bionic_get_shell_path.cpp",
        "bionic/__cmsg_nxthdr.cpp",
        "bionic/__cxa_thread_atexit_impl.cpp",
        "bionic/__errno.cpp",
        "bionic/__gnu_basename.cpp",
        "bionic/__libc_current_sigrtmax.cpp",
        "bionic/__libc_current_sigrtmin.cpp",
        "bionic/__progname.cpp",
        "bionic/abort.cpp",
        "bionic/abs.cpp",
        "bionic/accept.cpp",
        "bionic/access.cpp",
        "bionic/android_crash_detail.cpp",
        "bionic/android_set_abort_message.cpp",
        "bionic/android_unsafe_frame_pointer_chase.cpp",
        "bionic/arpa_inet.cpp",
        "bionic/assert.cpp",
        "bionic/atexit.cpp",
        "bionic/atof.cpp",
        "bionic/bionic_allocator.cpp",
        "bionic/bionic_arc4random.cpp",
        "bionic/bionic_elf_tls.cpp",
        "bionic/bionic_futex.cpp",
        "bionic/bionic_netlink.cpp",
        "bionic/bionic_systrace.cpp",
        "bionic/bionic_time_conversions.cpp",
        "bionic/brk.cpp",
        "bionic/c16rtomb.cpp",
        "bionic/c32rtomb.cpp",
        "bionic/casecmp.cpp",
        "bionic/chmod.cpp",
        "bionic/chown.cpp",
        "bionic/clock.cpp",
        "bionic/clock_getcpuclockid.cpp",
        "bionic/clock_nanosleep.cpp",
        "bionic/clone.cpp",
        "bionic/ctype.cpp",
        "bionic/dirent.cpp",
        "bionic/div.cpp",
        "bionic/dup.cpp",
        "bionic/endian.cpp",
        "bionic/env.cpp",
        "bionic/environ.cpp",
        "bionic/err.cpp",
        "bionic/error.cpp",
        "bionic/eventfd.cpp",
        "bionic/exec.cpp",
        "bionic/execinfo.cpp",
        "bionic/exit.cpp",
        "bionic/faccessat.cpp",
        "bionic/fchmod.cpp",
        "bionic/fchmodat.cpp",
        "bionic/fcntl.cpp",
        "bionic/fdsan.cpp",
        "bionic/fdtrack.cpp",
        "bionic/ffs.cpp",
        "bionic/fgetxattr.cpp",
        "bionic/flistxattr.cpp",
        "bionic/fork.cpp",
        "bionic/fpclassify.cpp",
        "bionic/fsetxattr.cpp",
        "bionic/ftruncate.cpp",
        "bionic/ftw.cpp",
        "bionic/futimens.cpp",
        "bionic/getcwd.cpp",
        "bionic/getentropy.cpp",
        "bionic/gethostname.cpp",
        "bionic/getloadavg.cpp",
        "bionic/getpagesize.cpp",
        "bionic/getpgrp.cpp",
        "bionic/getpid.cpp",
        "bionic/getpriority.cpp",
        "bionic/gettid.cpp",
        "bionic/get_device_api_level.cpp",
        "bionic/grp_pwd.cpp",
        "bionic/grp_pwd_file.cpp",
        "bionic/heap_zero_init.cpp",
        "bionic/iconv.cpp",
        "bionic/ifaddrs.cpp",
        "bionic/inotify_init.cpp",
        "bionic/ioctl.cpp",
        "bionic/isatty.cpp",
        "bionic/killpg.cpp",
        "bionic/langinfo.cpp",
        "bionic/lchmod.cpp",
        "bionic/lchown.cpp",
        "bionic/lfs64_support.cpp",
        "bionic/libc_init_common.cpp",
        "bionic/libgen.cpp",
        "bionic/link.cpp",
        "bionic/locale.cpp",
        "bionic/lockf.cpp",
        "bionic/lstat.cpp",
        "bionic/mblen.cpp",
        "bionic/mbrtoc16.cpp",
        "bionic/mbrtoc32.cpp",
        "bionic/memset_explicit.cpp",
        "bionic/mkdir.cpp",
        "bionic/mkfifo.cpp",
        "bionic/mknod.cpp",
        "bionic/mntent.cpp",
        "bionic/netdb.cpp",
        "bionic/net_if.cpp",
        "bionic/netinet_ether.cpp",
        "bionic/netinet_in.cpp",
        "bionic/nl_types.cpp",
        "bionic/open.cpp",
        "bionic/pathconf.cpp",
        "bionic/pause.cpp",
        "bionic/pidfd.cpp",
        "bionic/pipe.cpp",
        "bionic/poll.cpp",
        "bionic/posix_fadvise.cpp",
        "bionic/posix_fallocate.cpp",
        "bionic/posix_madvise.cpp",
        "bionic/posix_timers.cpp",
        "bionic/preadv_pwritev.cpp",
        "bionic/pthread_atfork.cpp",
        "bionic/pthread_attr.cpp",
        "bionic/pthread_barrier.cpp",
        "bionic/pthread_cond.cpp",
        "bionic/pthread_create.cpp",
        "bionic/pthread_detach.cpp",
        "bionic/pthread_equal.cpp",
        "bionic/pthread_exit.cpp",
        "bionic/pthread_getaffinity.cpp",
        "bionic/pthread_getcpuclockid.cpp",
        "bionic/pthread_getschedparam.cpp",
        "bionic/pthread_gettid_np.cpp",
        "bionic/pthread_internal.cpp",
        "bionic/pthread_join.cpp",
        "bionic/pthread_key.cpp",
        "bionic/pthread_kill.cpp",
        "bionic/pthread_mutex.cpp",
        "bionic/pthread_once.cpp",
        "bionic/pthread_rwlock.cpp",
        "bionic/pthread_sigqueue.cpp",
        "bionic/pthread_self.cpp",
        "bionic/pthread_setname_np.cpp",
        "bionic/pthread_setaffinity.cpp",
        "bionic/pthread_setschedparam.cpp",
        "bionic/pthread_spinlock.cpp",
        "bionic/ptrace.cpp",
        "bionic/pty.cpp",
        "bionic/raise.cpp",
        "bionic/rand.cpp",
        "bionic/readlink.cpp",
        "bionic/realpath.cpp",
        "bionic/reboot.cpp",
        "bionic/recv.cpp",
        "bionic/recvmsg.cpp",
        "bionic/rename.cpp",
        "bionic/rmdir.cpp",
        "bionic/scandir.cpp",
        "bionic/sched_cpualloc.cpp",
        "bionic/sched_cpucount.cpp",
        "bionic/sched_getaffinity.cpp",
        "bionic/sched_getcpu.cpp",
        "bionic/semaphore.cpp",
        "bionic/send.cpp",
        "bionic/setegid.cpp",
        "bionic/seteuid.cpp",
        "bionic/setjmp_cookie.cpp",
        "bionic/setpgrp.cpp",
        "bionic/sigaction.cpp",
        "bionic/signal.cpp",
        "bionic/sigprocmask.cpp",
        "bionic/sleep.cpp",
        "bionic/socketpair.cpp",
        "bionic/spawn.cpp",
        "bionic/stat.cpp",
        "bionic/strerror.cpp",
        "bionic/string.cpp",
        "bionic/strsignal.cpp",
        "bionic/strtod.cpp",
        "bionic/strtol.cpp",
        "bionic/strtold.cpp",
        "bionic/swab.cpp",
        "bionic/symlink.cpp",
        "bionic/sync_file_range.cpp",
        "bionic/sysconf.cpp",
        "bionic/sys_epoll.cpp",
        "bionic/sys_msg.cpp",
        "bionic/sys_sem.cpp",
        "bionic/sys_shm.cpp",
        "bionic/sys_signalfd.cpp",
        "bionic/sys_statfs.cpp",
        "bionic/sys_statvfs.cpp",
        "bionic/sys_thread_properties.cpp",
        "bionic/sys_time.cpp",
        "bionic/sysinfo.cpp",
        "bionic/syslog.cpp",
        "bionic/sysprop_helpers.cpp",
        "bionic/system.cpp",
        "bionic/system_property_api.cpp",
        "bionic/system_property_set.cpp",
        "bionic/tdestroy.cpp",
        "bionic/termios.cpp",
        "bionic/threads.cpp",
        "bionic/time.cpp",
        "bionic/tmpfile.cpp",
        "bionic/umount.cpp",
        "bionic/unlink.cpp",
        "bionic/usleep.cpp",
        "bionic/utime.cpp",
        "bionic/utmp.cpp",
        "bionic/vdso.cpp",
        "bionic/wait.cpp",
        "bionic/wchar.cpp",
        "bionic/wcstod.cpp",
        "bionic/wctype.cpp",
        "bionic/wcwidth.cpp",

        // Forked but not yet cleaned up/rewritten stdio code.
        // TODO: finish cleanup.
        "stdio/fmemopen.cpp",
        "stdio/parsefloat.c",
        "stdio/stdio.cpp",
        "stdio/stdio_ext.cpp",
        "stdio/vfscanf.cpp",
        "stdio/vfwscanf.cpp",
    ],

    arch: {
        arm: {
            asflags: libc_common_flags + ["-mno-restrict-it"],
            srcs: [
                "arch-arm/bionic/__aeabi_read_tp.S",
                "arch-arm/bionic/__bionic_clone.S",
                "arch-arm/bionic/__restore.S",
                "arch-arm/bionic/_exit_with_stack_teardown.S",
                "arch-arm/bionic/atomics_arm.c",
                "arch-arm/bionic/bpabi.c",
                "arch-arm/bionic/libcrt_compat.c",
                "arch-arm/bionic/popcount_tab.c",
                "arch-arm/bionic/setjmp.S",
                "arch-arm/bionic/syscall.S",
                "arch-arm/bionic/vfork.S",

                "arch-arm/cortex-a7/string/memcpy.S",
                "arch-arm/cortex-a7/string/memset.S",

                "arch-arm/cortex-a9/string/memcpy.S",
                "arch-arm/cortex-a9/string/memset.S",
                "arch-arm/cortex-a9/string/stpcpy.S",
                "arch-arm/cortex-a9/string/strcat.S",
                "arch-arm/cortex-a9/string/strcpy.S",
                "arch-arm/cortex-a9/string/strlen.S",

                "arch-arm/cortex-a15/string/memcpy.S",
                "arch-arm/cortex-a15/string/memmove.S",
                "arch-arm/cortex-a15/string/memset.S",
                "arch-arm/cortex-a15/string/stpcpy.S",
                "arch-arm/cortex-a15/string/strcat.S",
                "arch-arm/cortex-a15/string/strcmp.S",
                "arch-arm/cortex-a15/string/strcpy.S",
                "arch-arm/cortex-a15/string/strlen.S",

                "arch-arm/cortex-a53/string/memcpy.S",

                "arch-arm/cortex-a55/string/memcpy.S",

                "arch-arm/generic/string/memcmp.S",

                "arch-arm/krait/string/memcpy.S",
                "arch-arm/krait/string/memset.S",

                "arch-arm/kryo/string/memcpy.S",
            ],
        },
        arm64: {
            srcs: [
                "arch-arm64/bionic/__bionic_clone.S",
                "arch-arm64/bionic/_exit_with_stack_teardown.S",
                "arch-arm64/bionic/setjmp.S",
                "arch-arm64/bionic/syscall.S",
                "arch-arm64/bionic/vfork.S",
                "arch-arm64/oryon/memcpy-nt.S",
                "arch-arm64/oryon/memset-nt.S",
            ],
            whole_static_libs: [
                "libc_bionic_portable_simd_arm64_neon_no_mte",
                "libc_bionic_portable_simd_arm64_neon_mte",
            ],
        },

        riscv64: {
            srcs: [
                "arch-riscv64/bionic/__bionic_clone.S",
                "arch-riscv64/bionic/_exit_with_stack_teardown.S",
                "arch-riscv64/bionic/setjmp.S",
                "arch-riscv64/bionic/syscall.S",
                "arch-riscv64/bionic/vfork.S",

                "arch-riscv64/string/memchr.S",
                "arch-riscv64/string/memcmp.S",
                "arch-riscv64/string/memcpy.S",
                "arch-riscv64/string/memmove.S",
                "arch-riscv64/string/memset.S",
                "arch-riscv64/string/stpcpy.S",
                "arch-riscv64/string/stpncpy.S",
                "arch-riscv64/string/strcat.S",
                "arch-riscv64/string/strchr.S",
                "arch-riscv64/string/strchrnul.S",
                "arch-riscv64/string/strcmp.S",
                "arch-riscv64/string/strcpy.S",
                "arch-riscv64/string/strlen.S",
                "arch-riscv64/string/strncat.S",
                "arch-riscv64/string/strncmp.S",
                "arch-riscv64/string/strnlen.S",
                "arch-riscv64/string/strrchr.S",
            ],
        },

        x86: {
            srcs: [
                "arch-x86/bionic/__bionic_clone.S",
                "arch-x86/bionic/_exit_with_stack_teardown.S",
                "arch-x86/bionic/libcrt_compat.c",
                "arch-x86/bionic/setjmp.S",
                "arch-x86/bionic/syscall.S",
                "arch-x86/bionic/vfork.S",
                "arch-x86/bionic/__x86.get_pc_thunk.S",

                "arch-x86/string/sse2-memmove-slm.S",
                "arch-x86/string/sse2-memset-slm.S",
                "arch-x86/string/sse2-stpcpy-slm.S",
                "arch-x86/string/sse2-stpncpy-slm.S",
                "arch-x86/string/sse2-strcpy-slm.S",
                "arch-x86/string/sse2-strlen-slm.S",
                "arch-x86/string/sse2-strncpy-slm.S",

                "arch-x86/string/ssse3-memcmp-atom.S",
                "arch-x86/string/ssse3-strcat-atom.S",
                "arch-x86/string/ssse3-strcmp-atom.S",
                "arch-x86/string/ssse3-strncat-atom.S",
                "arch-x86/string/ssse3-strncmp-atom.S",

                "arch-x86/string/sse4-memcmp-slm.S",
            ],
        },
        x86_64: {
            srcs: [
                "arch-x86_64/bionic/__bionic_clone.S",
                "arch-x86_64/bionic/_exit_with_stack_teardown.S",
                "arch-x86_64/bionic/__restore_rt.S",
                "arch-x86_64/bionic/setjmp.S",
                "arch-x86_64/bionic/syscall.S",
                "arch-x86_64/bionic/vfork.S",

                "arch-x86_64/string/avx2-memmove-kbl.S",
                "arch-x86_64/string/avx2-memset-kbl.S",
                "arch-x86_64/string/memccpy.S",
                "arch-x86_64/string/sse2-memmove-slm.S",
                "arch-x86_64/string/sse2-memset-slm.S",
                "arch-x86_64/string/sse2-stpcpy-slm.S",
                "arch-x86_64/string/sse2-stpncpy-slm.S",
                "arch-x86_64/string/sse2-strcat-slm.S",
                "arch-x86_64/string/sse2-strcpy-slm.S",
                "arch-x86_64/string/sse2-strncat-slm.S",
                "arch-x86_64/string/sse2-strncpy-slm.S",
                "arch-x86_64/string/sse4-memcmp-slm.S",
                "arch-x86_64/string/ssse3-strcmp-slm.S",
                "arch-x86_64/string/ssse3-strncmp-slm.S",
                "arch-x86_64/string/strchr.S",
                "arch-x86_64/string/strrchr.S",
            ],
            whole_static_libs: [
                "libc_bionic_portable_simd_x86_64_v2",
                "libc_bionic_portable_simd_x86_64_v3",
            ],
        },
    },

    multilib: {
        lib32: {
            srcs: [
                // off64_t/time64_t support on LP32.
                "bionic/legacy_32_bit_support.cpp",
                "bionic/time64.c",
            ],
        },
    },

    local_include_dirs: ["stdio"],
    generated_headers: ["generated_android_ids"],

    whole_static_libs: [
        "//external/llvm-libc:llvmlibc",
        "libsystemproperties",
        "libicu4x_bionic",
    ],

    cppflags: ["-Wold-style-cast"],
    include_dirs: ["bionic/libstdc++/include"],
}

genrule {
    name: "generated_android_ids",
    out: ["generated_android_ids.h"],
    srcs: [":android_filesystem_config_header"],
    tools: ["fs_config_generator"],
    cmd: "$(location fs_config_generator) aidarray $(in) > $(out)",
}

// ========================================================
// libc_syscalls.a
// ========================================================

genrule {
    name: "syscalls-arm",
    out: ["syscalls-arm.S"],
    srcs: ["SYSCALLS.TXT"],
    tools: ["gensyscalls"],
    cmd: "$(location gensyscalls) arm $(in) > $(out)",
}

genrule {
    name: "syscalls-arm64",
    out: ["syscalls-arm64.S"],
    srcs: ["SYSCALLS.TXT"],
    tools: ["gensyscalls"],
    cmd: "$(location gensyscalls) arm64 $(in) > $(out)",
}

genrule {
    name: "syscalls-riscv64",
    out: ["syscalls-riscv64.S"],
    srcs: ["SYSCALLS.TXT"],
    tools: ["gensyscalls"],
    cmd: "$(location gensyscalls) riscv64 $(in) > $(out)",
}

genrule {
    name: "syscalls-x86",
    out: ["syscalls-x86.S"],
    srcs: ["SYSCALLS.TXT"],
    tools: ["gensyscalls"],
    cmd: "$(location gensyscalls) x86 $(in) > $(out)",
}

genrule {
    name: "syscalls-x86_64",
    out: ["syscalls-x86_64.S"],
    srcs: ["SYSCALLS.TXT"],
    tools: ["gensyscalls"],
    cmd: "$(location gensyscalls) x86_64 $(in) > $(out)",
}

cc_library_static {
    name: "libc_syscalls",
    defaults: ["libc_defaults"],
    arch: {
        arm: {
            srcs: [":syscalls-arm"],
        },
        arm64: {
            srcs: [":syscalls-arm64"],
        },
        riscv64: {
            srcs: [":syscalls-riscv64"],
        },
        x86: {
            srcs: [":syscalls-x86"],
        },
        x86_64: {
            srcs: [":syscalls-x86_64"],
        },
    },
}

// ========================================================
// libc_aeabi.a
// This is an LP32 ARM-only library that needs to be built with -fno-builtin
// to avoid infinite recursion. For the other architectures we just build an
// empty library to keep this makefile simple.
// ========================================================

cc_library_static {
    name: "libc_aeabi",
    defaults: ["libc_defaults"],
    arch: {
        arm: {
            srcs: ["arch-arm/bionic/__aeabi.c"],
        },
    },
    cflags: ["-fno-builtin"],
}

// ========================================================
// libc_common.a --- everything shared by libc.a and libc.so
// ========================================================

cc_library_static {
    name: "libc_common",
    defaults: ["libc_defaults"],

    whole_static_libs: [
        "libarm-optimized-routines-string",
        "libasync_safe",
        "libc_bionic",
        "libc_bootstrap",
        "libc_dns",
        "libc_fortify",
        "libc_freebsd",
        "libc_freebsd_large_stack",
        "libc_freebsd_ldexp",
        "libc_gdtoa",
        "libc_netbsd",
        "libc_openbsd",
        "libc_openbsd_large_stack",
        "libc_syscalls",
        "libc_tzcode",
        "libstdc++",
    ],

    arch: {
        arm: {
            whole_static_libs: ["libc_aeabi"],
        },
    },
}

// ========================================================
// libc_static_dispatch.a/libc_dynamic_dispatch.a --- string/memory "ifuncs"
// ========================================================

cc_defaults {
    name: "libc_ifunc_defaults",
    defaults: ["libc_defaults"],
    arch: {
        arm: {
            srcs: ["arch-arm/ifuncs.cpp"],
        },
        arm64: {
            srcs: ["arch-arm64/ifuncs.cpp"],
        },
        x86: {
            srcs: ["arch-x86/ifuncs.cpp"],
        },
        x86_64: {
            srcs: ["arch-x86_64/ifuncs.cpp"],
        },
    },
    // Prevent the compiler from inserting calls to libc/taking the address of
    // a jump table from within an ifunc (or, in the static case, code that
    // can be executed arbitrarily early).
    cflags: [
        "-ffreestanding",
        "-fno-stack-protector",
        "-fno-jump-tables",
    ],
}

cc_library_static {
    name: "libc_static_dispatch",
    defaults: ["libc_ifunc_defaults"],
    cflags: [
        "-DBIONIC_STATIC_DISPATCH",
    ],
}

cc_library_static {
    name: "libc_dynamic_dispatch",
    defaults: ["libc_ifunc_defaults"],
    cflags: [
        "-DBIONIC_DYNAMIC_DISPATCH",
    ],
}

// ========================================================
// libc_common_static.a For static binaries.
// ========================================================
cc_library_static {
    name: "libc_common_static",
    defaults: ["libc_defaults"],

    whole_static_libs: [
        "libc_common",
        "libc_static_dispatch",
    ],
}

// ========================================================
// libc_common_shared.a For shared libraries.
// ========================================================
cc_library_static {
    name: "libc_common_shared",
    defaults: ["libc_defaults"],

    whole_static_libs: [
        "libc_common",
        "libc_dynamic_dispatch",
        "libbionic_panic_abort",
        "liblibc_alloc_rust",
    ],

    target: {
        linux_bionic: {
            exclude_static_libs: [
                "libbionic_panic_abort",
                "liblibc_alloc_rust",
            ],
            whole_static_libs: [
                "libstd",
            ],
        },
    },
}

// Versions of dl_iterate_phdr and similar APIs used to lookup unwinding information in a static
// executable.
cc_library_static {
    name: "libc_unwind_static",
    defaults: ["libc_defaults"],
    cflags: ["-DLIBC_STATIC"],

    srcs: ["bionic/dl_iterate_phdr_static.cpp"],
    arch: {
        // arm32-specific dl_unwind_find_exidx and __gnu_Unwind_Find_exidx APIs
        arm: {
            srcs: ["arch-arm/bionic/exidx_static.c"],
        },
    },
}

// ========================================================
// libc_nomalloc.a
// ========================================================
//
// This is a version of the static C library used by the dynamic linker that exclude malloc. It also
// excludes functions selected using ifunc's (e.g. for string.h). Link in either
// libc_static_dispatch or libc_dynamic_dispatch to provide those functions.

cc_library_static {
    name: "libc_nomalloc",
    defaults: ["libc_defaults"],

    whole_static_libs: [
        "libc_common",
        "libc_init_static",
        "libc_unwind_static",
    ],
}

filegroup {
    name: "libc_sources_shared",
    srcs: [
        "arch-common/bionic/crtbegin_so.c",
        "arch-common/bionic/crtbrand.S",
        "bionic/android_mallopt.cpp",
        "bionic/gwp_asan_wrappers.cpp",
        "bionic/heap_tagging.cpp",
        "bionic/malloc_common.cpp",
        "bionic/malloc_common_dynamic.cpp",
        "bionic/android_profiling_dynamic.cpp",
        "bionic/malloc_heapprofd.cpp",
        "bionic/malloc_limit.cpp",
        "bionic/ndk_cruft.cpp",
        "bionic/ndk_cruft_data.cpp",
        "bionic/NetdClient.cpp",
        "arch-common/bionic/crtend_so.S",
    ],
}

filegroup {
    name: "libc_sources_static",
    srcs: [
        "bionic/android_mallopt.cpp",
        "bionic/gwp_asan_wrappers.cpp",
        "bionic/heap_tagging.cpp",
        "bionic/malloc_common.cpp",
        "bionic/malloc_limit.cpp",
    ],
}

filegroup {
    name: "libc_sources_shared_arm",
    srcs: [
        "arch-arm/bionic/exidx_dynamic.c",
        "arch-arm/bionic/atexit_legacy.c",
    ],
}

// ========================================================
// libc_sources_arc4random
// linker_phdr dependency required by linker-unit-tests
// ========================================================
filegroup {
    name: "libc_sources_arc4random",
    defaults: ["libc_defaults"],
    srcs: [
        "bionic/bionic_arc4random.cpp",
    ],
    visibility: ["//bionic/linker"],
}

// ========================================================
// libc.a + libc.so
// ========================================================
cc_defaults {
    name: "libc_library_defaults",
    defaults: [
        "libc_defaults",
        "libc_native_allocator_defaults",
        "bug_24465209_workaround",
        "keep_symbols",
    ],
    product_variables: {
        platform_sdk_version: {
            asflags: ["-DPLATFORM_SDK_VERSION=%d"],
        },
    },
    static: {
        srcs: [":libc_sources_static"],
        cflags: ["-DLIBC_STATIC"],
        whole_static_libs: [
            "gwp_asan",
            "libc_init_static",
            "libc_common_static",
            "libc_unwind_static",
            "libstd",
        ],
    },
    shared: {
        srcs: [":libc_sources_shared"],
        whole_static_libs: [
            "gwp_asan",
            "libc_init_dynamic",
            "libc_common_shared",
            "libunwind-exported",
        ],
    },

    required: [
        "tzdata_prebuilt",
        "tz_version_prebuilt", // Version metadata for tzdata to help debugging.
    ],

    // Do not pack libc.so relocations; see http://b/20645321 for details.
    pack_relocations: false,

    shared_libs: [
        "ld-android",
        "libdl",
    ],
    static_libs: [
        "libdl_android",
    ],

    nocrt: true,

    arch: {
        arm: {
            version_script: ":libc.arm.map",
            no_libcrt: true,

            shared: {
                srcs: [":libc_sources_shared_arm"],
                // special for arm
                cflags: ["-DCRT_LEGACY_WORKAROUND"],
                // For backwards compatibility, some arm32 builtins are exported from libc.so.
                static_libs: ["libclang_rt.builtins-exported"],
            },

            ldflags: [
                // Since we preserve the debug_frame for libc, do not compress
                // in this case to make unwinds as fast as possible.
                "-Wl,--compress-debug-sections=none",
            ],
        },
        arm64: {
            version_script: ":libc.arm64.map",
        },
        riscv64: {
            version_script: ":libc.riscv64.map",
        },
        x86: {
            version_script: ":libc.x86.map",
            no_libcrt: true,

            shared: {
                // For backwards compatibility, some x86 builtins are exported from libc.so.
                static_libs: ["libclang_rt.builtins-exported"],
            },
        },
        x86_64: {
            version_script: ":libc.x86_64.map",
        },
    },

    target: {
        native_bridge: {
            shared: {
                installable: false,
            },
        },
    },
}

cc_defaults {
    name: "libc_ndk_defaults",
    defaults: [
        "libc_library_defaults",
    ],
    stubs: {
        symbol_file: ":stubs_libc.map.txt",
        versions: [
            "29",
            "R",
            "current",
        ],
    },
    llndk: {
        symbol_file: "libc.map.txt",
        export_headers_as_system: true,
        export_llndk_headers: ["libc_headers"],
    },
    afdo: true,
}

// RELEASE_DEPRECATE_RUNTIME_APEX: "# apex" should be converted to "# systemapi"
genrule {
    name: "stubs_libc.map.txt",
    out: ["stubs_libc.map.txt"],
    srcs: ["libc.map.txt"],
    cmd: select(release_flag("RELEASE_DEPRECATE_RUNTIME_APEX"), {
        true: "sed 's/# apex/# systemapi/g' $(in) > $(out)",
        default: "cp $(in) $(out)",
    }),
}

cc_library {
    name: "libc",
    defaults: [
        "libc_ndk_defaults",
    ],
}

cc_library_static {
    name: "libc.ndk_static",
    defaults: [
        "libc_ndk_defaults",
    ],
    stem: "libc",
    static_ndk_lib: true,
    force_rust_staticlib: true,
}

cc_library {
    name: "libc_hwasan",
    defaults: [
        "libc_library_defaults",
    ],
    sanitize: {
        hwaddress: true,
    },
    enabled: false,
    target: {
        android_arm64: {
            enabled: true,
        },
    },
    stem: "libc",
    relative_install_path: "hwasan",
    // We don't really need the stubs, but this needs to stay to trigger the
    // symlink logic in soong.
    stubs: {
        symbol_file: "libc.map.txt",
    },
    native_bridge_supported: false,
    // It is never correct to depend on this directly. This is only
    // needed for the runtime apex, and in base_system.mk, and system_image_defaults
    // which is default module for soong-defined system image.
    visibility: [
        "//bionic/apex",
        "//visibility:any_system_partition",
    ],
}

genrule {
    name: "libc.arm.map",
    out: ["libc.arm.map.txt"],
    srcs: ["libc.map.txt"],
    tools: ["generate-version-script"],
    cmd: "$(location generate-version-script) arm $(in) $(out)",
}

genrule {
    name: "libc.arm64.map",
    out: ["libc.arm64.map.txt"],
    srcs: ["libc.map.txt"],
    tools: ["generate-version-script"],
    cmd: "$(location generate-version-script) arm64 $(in) $(out)",
}

genrule {
    name: "libc.riscv64.map",
    out: ["libc.riscv64.map.txt"],
    srcs: ["libc.map.txt"],
    tools: ["generate-version-script"],
    cmd: "$(location generate-version-script) riscv64 $(in) $(out)",
}

genrule {
    name: "libc.x86.map",
    out: ["libc.x86.map.txt"],
    srcs: ["libc.map.txt"],
    tools: ["generate-version-script"],
    cmd: "$(location generate-version-script) x86 $(in) $(out)",
}

genrule {
    name: "libc.x86_64.map",
    out: ["libc.x86_64.map.txt"],
    srcs: ["libc.map.txt"],
    tools: ["generate-version-script"],
    cmd: "$(location generate-version-script) x86_64 $(in) $(out)",
}

// Headers that only other parts of the platform can include.
cc_library_headers {
    name: "bionic_libc_platform_headers",
    defaults: ["linux_bionic_supported"],
    visibility: [
        "//art:__subpackages__",
        "//bionic:__subpackages__",
        "//frameworks:__subpackages__",
        "//external/gwp_asan:__subpackages__",
        "//external/perfetto:__subpackages__",
        "//external/scudo:__subpackages__",
        "//system/core/debuggerd:__subpackages__",
        "//system/core/init:__subpackages__",
        "//system/core/libcutils:__subpackages__",
        "//system/memory/libmemunreachable:__subpackages__",
        "//system/unwinding/libunwindstack:__subpackages__",
        "//system/librustutils:__subpackages__",
        "//tools/security/sanitizer-status:__subpackages__",
    ],
    vendor_available: true,
    product_available: true,
    ramdisk_available: true,
    vendor_ramdisk_available: true,
    recovery_available: true,
    native_bridge_supported: true,
    export_include_dirs: [
        "platform",
    ],
    system_shared_libs: [],
    stl: "none",
    sdk_version: "current",

    min_sdk_version: "29",
    apex_available: [
        "//apex_available:platform",
        "//apex_available:anyapex",
    ],
}

cc_library_headers {
    name: "libc_uapi_headers",
    visibility: [
        "//external/musl",
        "//external/rust/crates/v4l2r/android",
        "//system/memory/libmeminfo/libelfutils",
    ],
    llndk: {
        llndk_headers: true,
    },
    lfi_supported: true,
    host_supported: true,
    vendor_available: true,
    product_available: true,
    ramdisk_available: true,
    vendor_ramdisk_available: true,
    recovery_available: true,
    native_bridge_supported: true,
    apex_available: [
        "//apex_available:platform",
        "//apex_available:anyapex",
    ],
    // used by most APEXes indirectly via libunwind_llvm
    min_sdk_version: "apex_inherit",

    no_libcrt: true,
    stl: "none",
    system_shared_libs: [],

    // The build system generally requires that any dependencies of a target
    // with an sdk_version must have a lower sdk_version. By setting sdk_version
    // to 1 we let targets with an sdk_version that need to depend on the libc
    // headers but cannot depend on libc itself due to circular dependencies
    // (such as libunwind_llvm) depend on the headers. Setting sdk_version to 1
    // is correct because the headers can support any sdk_version.
    sdk_version: "1",

    export_system_include_dirs: [
        "kernel/uapi",
        "kernel/android/scsi",
        "kernel/android/uapi",
    ],

    arch: {
        arm: {
            export_system_include_dirs: ["kernel/uapi/asm-arm"],
        },
        arm64: {
            export_system_include_dirs: ["kernel/uapi/asm-arm64"],
        },
        riscv64: {
            export_system_include_dirs: ["kernel/uapi/asm-riscv"],
        },
        x86: {
            export_system_include_dirs: ["kernel/uapi/asm-x86"],
        },
        x86_64: {
            export_system_include_dirs: ["kernel/uapi/asm-x86"],
        },
    },

    target: {
        windows: {
            enabled: true,
        },
    },
}

cc_library_headers {
    name: "libc_headers",
    host_supported: true,
    native_bridge_supported: true,
    vendor_available: true,
    product_available: true,
    ramdisk_available: true,
    vendor_ramdisk_available: true,
    recovery_available: true,
    lfi_supported: true,
    sdk_version: "1",

    apex_available: [
        "//apex_available:platform",
        "//apex_available:anyapex",
    ],
    // used by most APEXes indirectly via libunwind_llvm
    min_sdk_version: "apex_inherit",
    visibility: [
        "//bionic:__subpackages__", // visible to bionic
        // ... and only to these places (b/152668052)
        "//external/arm-optimized-routines",
        "//external/gwp_asan",
        "//external/jemalloc_new",
        "//external/libunwind_llvm",
        "//external/llvm-libc",
        "//external/scudo",
        "//system/core/property_service/libpropertyinfoparser",
        "//system/extras/toolchain-extras",
    ],

    stl: "none",
    no_libcrt: true,
    system_shared_libs: [],

    target: {
        android: {
            export_system_include_dirs: ["include"],
            header_libs: ["libc_uapi_headers"],
            export_header_lib_headers: ["libc_uapi_headers"],
        },
        linux_bionic: {
            export_system_include_dirs: ["include"],
            header_libs: ["libc_uapi_headers"],
            export_header_lib_headers: ["libc_uapi_headers"],
        },
    },
}

// ========================================================
// libstdc++.so and libstdc++.a.
// ========================================================

cc_library {
    name: "libstdc++",
    defaults: [
        "libc_defaults",
        "bug_24465209_workaround",
    ],
    include_dirs: ["bionic/libstdc++/include"],
    srcs: [
        "bionic/__cxa_guard.cpp",
        "bionic/__cxa_pure_virtual.cpp",
        "bionic/new.cpp",
    ],
    static_ndk_lib: true,
    static_libs: ["libasync_safe"],
    apex_available: [
        "//apex_available:platform",
    ],

    static: {
        system_shared_libs: [],
    },
    target: {
        bionic: {
            shared: {
                system_shared_libs: ["libc"],
            },
        },
    },

    arch: {
        arm: {
            version_script: ":libstdc++.arm.map",
        },
        arm64: {
            version_script: ":libstdc++.arm64.map",
        },
        riscv64: {
            version_script: ":libstdc++.riscv64.map",
        },
        x86: {
            version_script: ":libstdc++.x86.map",
        },
        x86_64: {
            version_script: ":libstdc++.x86_64.map",
        },
    },
}

genrule {
    name: "libstdc++.arm.map",
    out: ["libstdc++.arm.map.txt"],
    srcs: ["libstdc++.map.txt"],
    tools: ["generate-version-script"],
    cmd: "$(location generate-version-script) arm $(in) $(out)",
}

genrule {
    name: "libstdc++.arm64.map",
    out: ["libstdc++.arm64.map.txt"],
    srcs: ["libstdc++.map.txt"],
    tools: ["generate-version-script"],
    cmd: "$(location generate-version-script) arm64 $(in) $(out)",
}

genrule {
    name: "libstdc++.riscv64.map",
    out: ["libstdc++.riscv64.map.txt"],
    srcs: ["libstdc++.map.txt"],
    tools: ["generate-version-script"],
    cmd: "$(location generate-version-script) riscv64 $(in) $(out)",
}

genrule {
    name: "libstdc++.x86.map",
    out: ["libstdc++.x86.map.txt"],
    srcs: ["libstdc++.map.txt"],
    tools: ["generate-version-script"],
    cmd: "$(location generate-version-script) x86 $(in) $(out)",
}

genrule {
    name: "libstdc++.x86_64.map",
    out: ["libstdc++.x86_64.map.txt"],
    srcs: ["libstdc++.map.txt"],
    tools: ["generate-version-script"],
    cmd: "$(location generate-version-script) x86_64 $(in) $(out)",
}

// ========================================================
// crt object files.
// ========================================================

cc_defaults {
    name: "crt_and_memtag_defaults",
    defaults: ["linux_bionic_supported"],
    vendor_available: true,
    product_available: true,
    ramdisk_available: true,
    vendor_ramdisk_available: true,
    recovery_available: true,
    native_bridge_supported: true,
    apex_available: [
        "//apex_available:platform",
        "//apex_available:anyapex",
    ],
    // Generate NDK variants of the CRT objects for every supported API level.
    min_sdk_version: "21",
    stl: "none",
    crt: true,
    cflags: [
        "-Wno-gcc-compat",
        "-Wall",
        "-Werror",
    ],
    sanitize: {
        never: true,
    },
}

cc_defaults {
    name: "crt_defaults",
    defaults: ["crt_and_memtag_defaults"],
    header_libs: ["libc_headers"],
    local_include_dirs: [
        "bionic", // crtbegin includes bionic/libc_init_common.h
        "private", // crtbrand depends on private/bionic_asm_note.h
    ],
    system_shared_libs: [],
}

cc_defaults {
    name: "crt_so_defaults",
    defaults: ["crt_defaults"],
    stl: "none",
}

cc_object {
    name: "crtbrand",
    defaults: ["crt_so_defaults"],
    // crtbrand.S needs to know the platform SDK version.
    product_variables: {
        platform_sdk_version: {
            asflags: ["-DPLATFORM_SDK_VERSION=%d"],
        },
    },
    srcs: ["arch-common/bionic/crtbrand.S"],
    // crtbrand is an intermediate artifact, not a final CRT object.
    exclude_from_ndk_sysroot: true,
}

cc_object {
    name: "crtbegin_so",
    defaults: ["crt_so_defaults"],
    srcs: ["arch-common/bionic/crtbegin_so.c"],
    objs: [
        "crtbrand",
    ],
}

cc_object {
    name: "crtend_so",
    defaults: ["crt_so_defaults"],
    srcs: ["arch-common/bionic/crtend_so.S"],
}

cc_object {
    name: "crtbegin_static",
    defaults: ["crt_defaults"],
    cflags: ["-DCRTBEGIN_STATIC"],
    srcs: ["arch-common/bionic/crtbegin.c"],
    objs: [
        "crtbrand",
    ],
    // When using libc.a, we're using the latest library regardless of target API level.
    min_sdk_version: "current",
}

cc_object {
    name: "crtbegin_dynamic",
    defaults: ["crt_defaults"],
    srcs: ["arch-common/bionic/crtbegin.c"],
    objs: [
        "crtbrand",
    ],
    target: {
        linux_bionic: {
            generated_sources: ["host_bionic_linker_asm"],
            objs: [
                "linker_wrapper",
            ],
        },
    },
}

cc_object {
    // We rename crtend.o to crtend_android.o to avoid a
    // name clash between gcc and bionic.
    name: "crtend_android",
    defaults: ["crt_defaults"],
    srcs: ["arch-common/bionic/crtend.S"],
}

cc_object {
    name: "crt_pad_segment",
    defaults: ["crt_defaults"],
    srcs: ["arch-common/bionic/crt_pad_segment.S"],
}

cc_library_static {
    name: "note_memtag_heap_async",
    defaults: ["crt_and_memtag_defaults"],
    arch: {
        arm64: {
            srcs: ["arch-arm64/bionic/note_memtag_heap_async.S"],
        },
    },
    sdk_version: "minimum",
}

cc_library_static {
    name: "note_memtag_heap_sync",
    defaults: ["crt_and_memtag_defaults"],
    arch: {
        arm64: {
            srcs: ["arch-arm64/bionic/note_memtag_heap_sync.S"],
        },
    },
    sdk_version: "minimum",
}

// ========================================================
// libc dependencies for baremetal Rust projects.
// ========================================================

// This library contains the following unresolved symbols:
//     __errno
//     __x86_shared_cache_size_half (x86_64 only)
//     abort
//     async_safe_fatal_va_list
cc_library_static {
    name: "librust_baremetal",
    defaults: ["cc_baremetal_defaults"],
    header_libs: ["libc_headers"],
    include_dirs: [
        "bionic/libc/async_safe/include",
        "bionic/libc/platform",
    ],
    cflags: [
        "-Wall",
        "-Werror",

        "-DBIONIC_RUST_BAREMETAL",
    ],
    asflags: [
        "-DBIONIC_RUST_BAREMETAL",
    ],
    srcs: [
        "bionic/fortify.cpp",
        "bionic/strtol.cpp",
    ],
    arch: {
        arm: {
            enabled: false,
        },
        arm64: {
            srcs: [
                "arch-arm64/string/__memcpy_chk.S",
            ],
            whole_static_libs: [
                "libc_bionic_portable_simd_arm64_no_ifuncs",
            ],
        },
        x86: {
            enabled: false,
        },
        x86_64: {
            asflags: [
                // Statically choose the SSE2 variants for baremetal,
                // where we do not have the dynamic function dispatch
                // machinery.
                "-D__memcpy_chk_generic=__memcpy_chk",
                "-Dmemmove_generic=memmove",
                "-Dmemset_generic=memset",
            ],
            srcs: [
                "arch-x86_64/string/sse2-memmove-slm.S",
                "arch-x86_64/string/sse2-memset-slm.S",
                "arch-x86_64/string/sse2-stpcpy-slm.S",
                "arch-x86_64/string/sse2-stpncpy-slm.S",
                "arch-x86_64/string/sse2-strcat-slm.S",
                "arch-x86_64/string/sse2-strcpy-slm.S",
                "arch-x86_64/string/sse2-strncat-slm.S",
                "arch-x86_64/string/sse2-strncpy-slm.S",
                "arch-x86_64/string/sse4-memcmp-slm.S",
                "arch-x86_64/string/ssse3-strcmp-slm.S",
                "arch-x86_64/string/ssse3-strncmp-slm.S",
                "arch-x86_64/string/strchr.S",
                "arch-x86_64/string/strrchr.S",
            ],
            whole_static_libs: [
                "libc_bionic_portable_simd_x86_64_no_ifuncs",
            ],
        },
    },
    whole_static_libs: [
        "//external/llvm-libc:llvmlibc",
        "libarm-optimized-routines-mem",
    ],
    system_shared_libs: [],
    nocrt: true,
    stl: "none",
    visibility: [
        "//packages/modules/Virtualization/libs/libvmbase",
    ],

    // b/358211032: This library gets linked into a rust rlib.  Disable LTO
    // until cross-language lto is supported.
    lto: {
        never: true,
    },
}

// ========================================================
// libc dependencies for LFI projects
// ========================================================

cc_library_static {
    name: "libc_lfi",
    header_libs: ["libc_headers"],
    export_header_lib_headers: [
        "libc_headers",
    ],
    include_dirs: [
        "bionic/libc/platform",
    ],
    cflags: [
        "-Wall",
        "-Werror",
    ],
    whole_static_libs: [
        "libarm-optimized-routines-mem",
    ],
    system_shared_libs: [],
    nocrt: true,
    stl: "none",
    lfi_supported: true,
    arch: {
        arm: {
            enabled: false,
        },
        arm64: {
            enabled: true,
        },
        x86: {
            enabled: false,
        },
        x86_64: {
            enabled: false,
        },
    },
    min_sdk_version: "apex_inherit",
    apex_available: [
        "com.android.media.swcodec",
    ],
    visibility: [
        "//external/libopus:__subpackages__",
        "//system/lfi:__subpackages__",
        "//build/soong:__subpackages__",
    ],
}

// ========================================================
// NDK headers.
// ========================================================

ndk_headers {
    name: "common_libc",
    from: "include",
    to: "",
    srcs: ["include/**/*.h"],
    license: "NOTICE",
    // These don't pass the bad verification we do because many of them are
    // arch-specific, and they aren't necessarily independently includable.
    // That's not much of a problem though, since C-incompaitibilities in the
    // UAPI headers should run into problems long before they reach us.
    skip_verification: true,
}

ndk_headers {
    name: "libc_uapi",
    from: "kernel/uapi",
    to: "",
    srcs: [
        "kernel/uapi/asm-generic/**/*.h",
        "kernel/uapi/drm/**/*.h",
        "kernel/uapi/linux/**/*.h",
        "kernel/uapi/misc/**/*.h",
        "kernel/uapi/mtd/**/*.h",
        "kernel/uapi/rdma/**/*.h",
        "kernel/uapi/scsi/**/*.h",
        "kernel/uapi/sound/**/*.h",
        "kernel/uapi/video/**/*.h",
        "kernel/uapi/xen/**/*.h",
    ],
    license: "NOTICE",
    skip_verification: true,
}

ndk_headers {
    name: "libc_kernel_android_uapi_linux",
    from: "kernel/android/uapi/linux",
    to: "linux",
    srcs: ["kernel/android/uapi/linux/**/*.h"],
    license: "NOTICE",
}

ndk_headers {
    name: "libc_kernel_android_scsi",
    from: "kernel/android/scsi/scsi",
    to: "scsi",
    srcs: ["kernel/android/scsi/**/*.h"],
    license: "NOTICE",
    skip_verification: true,
}

ndk_headers {
    name: "libc_asm_arm",
    from: "kernel/uapi/asm-arm",
    to: "arm-linux-androideabi",
    srcs: ["kernel/uapi/asm-arm/**/*.h"],
    license: "NOTICE",
    skip_verification: true,
}

ndk_headers {
    name: "libc_asm_arm64",
    from: "kernel/uapi/asm-arm64",
    to: "aarch64-linux-android",
    srcs: ["kernel/uapi/asm-arm64/**/*.h"],
    license: "NOTICE",
    skip_verification: true,
}

ndk_headers {
    name: "libc_asm_riscv64",
    from: "kernel/uapi/asm-riscv",
    to: "riscv64-linux-android",
    srcs: ["kernel/uapi/asm-riscv/**/*.h"],
    license: "NOTICE",
    skip_verification: true,
}

ndk_headers {
    name: "libc_asm_x86",
    from: "kernel/uapi/asm-x86",
    to: "i686-linux-android",
    srcs: ["kernel/uapi/asm-x86/**/*.h"],
    license: "NOTICE",
    skip_verification: true,
}

ndk_headers {
    name: "libc_asm_x86_64",
    from: "kernel/uapi/asm-x86",
    to: "x86_64-linux-android",
    srcs: ["kernel/uapi/asm-x86/**/*.h"],
    license: "NOTICE",
    skip_verification: true,
}

ndk_library {
    name: "libc",
    symbol_file: "libc.map.txt",
    first_version: "9",
    // This runtime library does not depend on ART at all, so it simply gets an
    // empty denylist.
    bypass_artless_denylist: true,
}

ndk_library {
    name: "libstdc++",
    symbol_file: "libstdc++.map.txt",
    first_version: "9",
    // This runtime library does not depend on ART at all, so it simply gets an
    // empty denylist.
    bypass_artless_denylist: true,
}

// Export these headers for toolbox to process
filegroup {
    name: "kernel_input_headers",
    srcs: [
        "kernel/uapi/linux/input.h",
        "kernel/uapi/linux/input-event-codes.h",
    ],
}

// Generate a syscall name / number mapping. These objects are text files
// (thanks to the -dD -E flags) and not binary files. They will then be
// consumed by the genseccomp.py script and converted into C++ code.
cc_defaults {
    name: "libseccomp_gen_syscall_nrs_defaults",
    recovery_available: true,
    srcs: ["seccomp/gen_syscall_nrs.cpp"],
    cflags: [
        "-dD",
        "-E",
        "-Wall",
        "-Werror",
        // Soong implicitly adds a -c argument that we override with -E.
        // Suppress Clang's error about the unused -c argument.
        "-Wno-unused-command-line-argument",
        "-nostdinc",
    ],
}

cc_object {
    name: "libseccomp_gen_syscall_nrs_arm",
    defaults: ["libseccomp_gen_syscall_nrs_defaults"],
    local_include_dirs: [
        "kernel/uapi/asm-arm",
        "kernel/uapi",
    ],
}

cc_object {
    name: "libseccomp_gen_syscall_nrs_arm64",
    defaults: ["libseccomp_gen_syscall_nrs_defaults"],
    local_include_dirs: [
        "kernel/uapi/asm-arm64",
        "kernel/uapi",
    ],
}

cc_object {
    name: "libseccomp_gen_syscall_nrs_riscv64",
    defaults: ["libseccomp_gen_syscall_nrs_defaults"],
    local_include_dirs: [
        "kernel/uapi/asm-riscv",
        "kernel/uapi",
    ],
}

cc_object {
    name: "libseccomp_gen_syscall_nrs_x86",
    defaults: ["libseccomp_gen_syscall_nrs_defaults"],
    srcs: ["seccomp/gen_syscall_nrs_x86.cpp"],
    exclude_srcs: ["seccomp/gen_syscall_nrs.cpp"],
    local_include_dirs: [
        "kernel/uapi/asm-x86",
        "kernel/uapi",
    ],
}

cc_object {
    name: "libseccomp_gen_syscall_nrs_x86_64",
    defaults: ["libseccomp_gen_syscall_nrs_defaults"],
    srcs: ["seccomp/gen_syscall_nrs_x86_64.cpp"],
    exclude_srcs: ["seccomp/gen_syscall_nrs.cpp"],
    local_include_dirs: [
        "kernel/uapi/asm-x86",
        "kernel/uapi",
    ],
}

filegroup {
    name: "all_kernel_uapi_headers",
    srcs: ["kernel/uapi/**/*.h"],
}

cc_genrule {
    name: "func_to_syscall_nrs",
    recovery_available: true,
    cmd: "$(location genfunctosyscallnrs) --out-dir=$(genDir) $(in)",

    tools: ["genfunctosyscallnrs"],

    srcs: [
        "SYSCALLS.TXT",
    ],

    arch: {
        arm: {
            srcs: [
                ":libseccomp_gen_syscall_nrs_arm",
                ":libseccomp_gen_syscall_nrs_arm64",
            ],
        },
        arm64: {
            srcs: [
                ":libseccomp_gen_syscall_nrs_arm",
                ":libseccomp_gen_syscall_nrs_arm64",
            ],
        },
        riscv64: {
            srcs: [":libseccomp_gen_syscall_nrs_riscv64"],
        },
        x86: {
            srcs: [
                ":libseccomp_gen_syscall_nrs_x86",
                ":libseccomp_gen_syscall_nrs_x86_64",
            ],
        },
        x86_64: {
            srcs: [
                ":libseccomp_gen_syscall_nrs_x86",
                ":libseccomp_gen_syscall_nrs_x86_64",
            ],
        },
    },

    out: [
        "func_to_syscall_nrs.h",
    ],
}

// SECCOMP_BLOCKLIST_APP_ZYGOTE.TXT = SECCOMP_BLOCKLIST_APP.txt - setresgid*
genrule {
    name: "generate_app_zygote_blocklist",
    out: ["SECCOMP_BLOCKLIST_APP_ZYGOTE.TXT"],
    srcs: ["SECCOMP_BLOCKLIST_APP.TXT"],
    cmd: "grep -v '^setresgid' $(in) > $(out)",
}

filegroup {
    name: "seccomp_syscalls_sources_zygote",
    srcs: [
        "SYSCALLS.TXT",
        "SECCOMP_ALLOWLIST_COMMON.TXT",
        "SECCOMP_ALLOWLIST_APP.TXT",
        "SECCOMP_BLOCKLIST_COMMON.TXT",
        "SECCOMP_PRIORITY.TXT",
        ":generate_app_zygote_blocklist",
    ],
}

filegroup {
    name: "seccomp_syscalls_sources_app",
    srcs: [
        "SYSCALLS.TXT",
        "SECCOMP_ALLOWLIST_COMMON.TXT",
        "SECCOMP_ALLOWLIST_APP.TXT",
        "SECCOMP_BLOCKLIST_COMMON.TXT",
        "SECCOMP_BLOCKLIST_APP.TXT",
        "SECCOMP_PRIORITY.TXT",
    ],
}

filegroup {
    name: "seccomp_syscalls_sources_system",
    srcs: [
        "SYSCALLS.TXT",
        "SECCOMP_ALLOWLIST_COMMON.TXT",
        "SECCOMP_ALLOWLIST_SYSTEM.TXT",
        "SECCOMP_BLOCKLIST_COMMON.TXT",
        "SECCOMP_PRIORITY.TXT",
    ],
}

cc_genrule {
    name: "libseccomp_policy_app_zygote_sources_x86",
    recovery_available: true,
    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=app_zygote $(in)",
    tools: ["genseccomp"],
    srcs: [
        ":seccomp_syscalls_sources_zygote",
        ":libseccomp_gen_syscall_nrs_x86",
        ":libseccomp_gen_syscall_nrs_x86_64",
    ],
    out: [
        "x86_app_zygote_policy.cpp",
        "x86_64_app_zygote_policy.cpp",
    ],
    enabled: false,
    arch: {
        x86: {
            enabled: true,
        },
        x86_64: {
            enabled: true,
        },
    },
}

cc_genrule {
    name: "libseccomp_policy_app_zygote_sources_arm",
    recovery_available: true,
    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=app_zygote $(in)",
    tools: ["genseccomp"],
    srcs: [
        ":seccomp_syscalls_sources_zygote",
        ":libseccomp_gen_syscall_nrs_arm",
        ":libseccomp_gen_syscall_nrs_arm64",
    ],
    out: [
        "arm_app_zygote_policy.cpp",
        "arm64_app_zygote_policy.cpp",
    ],
    enabled: false,
    arch: {
        arm: {
            enabled: true,
        },
        arm64: {
            enabled: true,
        },
    },
}

cc_genrule {
    name: "libseccomp_policy_app_zygote_sources_riscv64",
    recovery_available: true,
    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=app_zygote $(in)",
    tools: ["genseccomp"],
    srcs: [
        ":seccomp_syscalls_sources_zygote",
        ":libseccomp_gen_syscall_nrs_riscv64",
    ],
    out: [
        "riscv64_app_zygote_policy.cpp",
    ],
    enabled: false,
    arch: {
        riscv64: {
            enabled: true,
        },
    },
}

cc_genrule {
    name: "libseccomp_policy_app_sources_x86",
    recovery_available: true,
    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=app $(in)",
    tools: ["genseccomp"],
    srcs: [
        ":seccomp_syscalls_sources_app",
        ":libseccomp_gen_syscall_nrs_x86",
        ":libseccomp_gen_syscall_nrs_x86_64",
    ],
    out: [
        "x86_app_policy.cpp",
        "x86_64_app_policy.cpp",
    ],
    enabled: false,
    arch: {
        x86: {
            enabled: true,
        },
        x86_64: {
            enabled: true,
        },
    },
}

cc_genrule {
    name: "libseccomp_policy_app_sources_arm",
    recovery_available: true,
    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=app $(in)",
    tools: ["genseccomp"],
    srcs: [
        ":seccomp_syscalls_sources_app",
        ":libseccomp_gen_syscall_nrs_arm",
        ":libseccomp_gen_syscall_nrs_arm64",
    ],
    out: [
        "arm_app_policy.cpp",
        "arm64_app_policy.cpp",
    ],
    enabled: false,
    arch: {
        arm: {
            enabled: true,
        },
        arm64: {
            enabled: true,
        },
    },
}

cc_genrule {
    name: "libseccomp_policy_app_sources_riscv64",
    recovery_available: true,
    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=app $(in)",
    tools: ["genseccomp"],
    srcs: [
        ":seccomp_syscalls_sources_app",
        ":libseccomp_gen_syscall_nrs_riscv64",
    ],
    out: [
        "riscv64_app_policy.cpp",
    ],
    enabled: false,
    arch: {
        riscv64: {
            enabled: true,
        },
    },
}

cc_genrule {
    name: "libseccomp_policy_system_sources_x86",
    recovery_available: true,
    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=system $(in)",
    tools: ["genseccomp"],
    srcs: [
        ":seccomp_syscalls_sources_system",
        ":libseccomp_gen_syscall_nrs_x86",
        ":libseccomp_gen_syscall_nrs_x86_64",
    ],
    out: [
        "x86_system_policy.cpp",
        "x86_64_system_policy.cpp",
    ],
    enabled: false,
    arch: {
        x86: {
            enabled: true,
        },
        x86_64: {
            enabled: true,
        },
    },
}

cc_genrule {
    name: "libseccomp_policy_system_sources_arm",
    recovery_available: true,
    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=system $(in)",
    tools: ["genseccomp"],
    srcs: [
        ":seccomp_syscalls_sources_system",
        ":libseccomp_gen_syscall_nrs_arm",
        ":libseccomp_gen_syscall_nrs_arm64",
    ],
    out: [
        "arm_system_policy.cpp",
        "arm64_system_policy.cpp",
    ],
    enabled: false,
    arch: {
        arm: {
            enabled: true,
        },
        arm64: {
            enabled: true,
        },
    },
}

cc_genrule {
    name: "libseccomp_policy_system_sources_riscv64",
    recovery_available: true,
    cmd: "$(location genseccomp) --out-dir=$(genDir) --name-modifier=system $(in)",
    tools: ["genseccomp"],
    srcs: [
        ":seccomp_syscalls_sources_system",
        ":libseccomp_gen_syscall_nrs_riscv64",
    ],
    out: [
        "riscv64_system_policy.cpp",
    ],
    enabled: false,
    arch: {
        riscv64: {
            enabled: true,
        },
    },
}

cc_library {
    name: "libseccomp_policy",
    recovery_available: true,
    generated_headers: ["func_to_syscall_nrs"],

    arch: {
        arm: {
            generated_sources: [
                "libseccomp_policy_app_sources_arm",
                "libseccomp_policy_app_zygote_sources_arm",
                "libseccomp_policy_system_sources_arm",
            ],
        },
        arm64: {
            generated_sources: [
                "libseccomp_policy_app_sources_arm",
                "libseccomp_policy_app_zygote_sources_arm",
                "libseccomp_policy_system_sources_arm",
            ],
        },
        riscv64: {
            generated_sources: [
                "libseccomp_policy_app_sources_riscv64",
                "libseccomp_policy_app_zygote_sources_riscv64",
                "libseccomp_policy_system_sources_riscv64",
            ],
        },
        x86: {
            generated_sources: [
                "libseccomp_policy_app_sources_x86",
                "libseccomp_policy_app_zygote_sources_x86",
                "libseccomp_policy_system_sources_x86",
            ],
        },
        x86_64: {
            generated_sources: [
                "libseccomp_policy_app_sources_x86",
                "libseccomp_policy_app_zygote_sources_x86",
                "libseccomp_policy_system_sources_x86",
            ],
        },
    },

    srcs: [
        "seccomp/seccomp_policy.cpp",
    ],

    export_include_dirs: ["seccomp/include"],
    cflags: [
        "-Wall",
        "-Werror",
    ],
    shared: {
        shared_libs: ["libbase"],
    },
    static: {
        static_libs: ["libbase"],
    },
}

// TODO: add this directly to musl like libexecinfo and libb64?
cc_library_host_static {
    name: "libfts",
    srcs: [
        "bionic/fts.c",
        "upstream-openbsd/lib/libc/stdlib/recallocarray.c",
    ],
    export_include_dirs: ["fts/include"],
    local_include_dirs: [
        "private",
        "upstream-openbsd/android/include",
    ],
    cflags: [
        "-std=gnu99",
        "-include openbsd-compat.h",
        "-Wno-unused-parameter",
    ],
    enabled: false,
    target: {
        musl: {
            enabled: true,
        },
    },
    stl: "none",
}

cc_library_host_static {
    name: "libexecinfo",
    visibility: ["//external/musl"],
    srcs: ["bionic/execinfo.cpp"],
    export_include_dirs: ["execinfo/include"],
    local_include_dirs: ["private"],
    enabled: false,
    target: {
        musl: {
            enabled: true,
            system_shared_libs: [],
            header_libs: ["libc_musl_headers"],
        },
    },
    stl: "none",
}

cc_library_host_static {
    name: "libb64",
    visibility: ["//external/musl"],
    srcs: ["upstream-openbsd/lib/libc/net/base64.c"],
    export_include_dirs: ["b64/include"],
    local_include_dirs: [
        "private",
        "upstream-openbsd/android/include",
    ],
    cflags: [
        "-std=gnu99",
        "-include openbsd-compat.h",
    ],
    enabled: false,
    target: {
        musl: {
            enabled: true,
            system_shared_libs: [],
            header_libs: ["libc_musl_headers"],
        },
    },
    stl: "none",
}

// Export kernel uapi headers to be used in the musl sysroot.
// Also include the execinfo headers for the libexecinfo and the
// b64 headers for libb64 embedded in musl libc.
cc_genrule {
    name: "libc_musl_sysroot_bionic_headers",
    visibility: ["//external/musl"],
    host_supported: true,
    device_supported: false,
    enabled: false,
    target: {
        musl: {
            enabled: true,
        },
    },
    srcs: [
        "kernel/uapi/**/*.h",
        "kernel/android/**/*.h",
        "execinfo/include/**/*.h",
        "b64/include/**/*.h",
        "include/*.h",

        "NOTICE",

        ":libc_musl_sysroot_bionic_arch_headers",
    ],
    out: ["libc_musl_sysroot_bionic_headers.zip"],
    tools: [
        "soong_zip",
        "merge_zips",
        "zip2zip",
    ],
    cmd: "BIONIC_LIBC_DIR=$$(dirname $(location NOTICE)) && " +
        "$(location soong_zip) -o $(genDir)/sysroot.zip -symlinks=false" +
        // NOTICE
        " -j -f $(location NOTICE) " +
        // headers
        " -P include " +
        "  -C $${BIONIC_LIBC_DIR}/kernel/uapi " +
        "  -D $${BIONIC_LIBC_DIR}/kernel/uapi " +
        "  -C $${BIONIC_LIBC_DIR}/kernel/android/scsi " +
        "  -D $${BIONIC_LIBC_DIR}/kernel/android/scsi " +
        "  -C $${BIONIC_LIBC_DIR}/kernel/android/uapi " +
        "  -D $${BIONIC_LIBC_DIR}/kernel/android/uapi " +
        "  -C $${BIONIC_LIBC_DIR}/execinfo/include " +
        "  -D $${BIONIC_LIBC_DIR}/execinfo/include " +
        "  -C $${BIONIC_LIBC_DIR}/b64/include " +
        "  -D $${BIONIC_LIBC_DIR}/b64/include " +
        " && " +
        "$(location zip2zip) -i $(genDir)/sysroot.zip -o $(genDir)/sysroot-renamed.zip " +
        " -x **/BUILD " +
        " include/**/*:include/ " +
        " NOTICE:NOTICE.bionic " +
        " && " +
        "$(location merge_zips) $(out) $(location :libc_musl_sysroot_bionic_arch_headers) $(genDir)/sysroot-renamed.zip",
}

// The architecture-specific bits have to be handled separately because the label varies based
// on architecture, which prevents using $(locations) to find them and requires using $(in)
// instead, which would mix in all the other files if this were part of the main libc_musl_sysroot
// genrule.
cc_genrule {
    name: "libc_musl_sysroot_bionic_arch_headers",
    visibility: ["//visibility:private"],
    host_supported: true,
    device_supported: false,
    enabled: false,
    target: {
        musl: {
            enabled: true,
        },
    },
    arch: {
        arm: {
            srcs: ["kernel/uapi/asm-arm/**/*.h"],
        },
        arm64: {
            srcs: ["kernel/uapi/asm-arm64/**/*.h"],
        },
        x86: {
            srcs: ["kernel/uapi/asm-x86/**/*.h"],
        },
        x86_64: {
            srcs: ["kernel/uapi/asm-x86/**/*.h"],
        },
    },
    out: ["libc_musl_sysroot_bionic_arch_headers.zip"],
    tools: ["soong_zip"],
    cmd: "includes=($(in)) && $(location soong_zip) -o $(out) -P include/asm -j -D $$(dirname $${includes[0]})",
}

cc_genrule {
    name: "bionic_sysroot_crt_objects",
    visibility: ["//visibility:private"],
    out: ["bionic_sysroot_crt_objects.zip"],
    tools: ["soong_zip"],
    srcs: [
        ":crtbegin_dynamic",
        ":crtbegin_so",
        ":crtbegin_static",
        ":crtend_android",
        ":crtend_so",
    ],
    cmd: "$(location soong_zip) -o $(out) -j " +
        "-f $(location :crtbegin_dynamic) " +
        "-f $(location :crtbegin_so) " +
        "-f $(location :crtbegin_static) " +
        "-f $(location :crtend_android) " +
        "-f $(location :crtend_so)",
    dist: {
        targets: ["bionic_sysroot_crt_objects"],
    },
    arch: {
        arm: {
            dist: {
                suffix: "_arm",
            },
        },
        arm64: {
            dist: {
                suffix: "_arm64",
            },
        },
        riscv64: {
            dist: {
                suffix: "_riscv64",
            },
        },
        x86: {
            dist: {
                suffix: "_x86",
            },
        },
        x86_64: {
            dist: {
                suffix: "_x86_64",
            },
        },
    },
}

filegroup {
    name: "linux_capability_header",
    srcs: ["kernel/uapi/linux/capability.h"],
}

[Dauer der Verarbeitung: 0.43 Sekunden, vorverarbeitet 2026-06-28]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

letze Version des Elbe Quellennavigators


letze Version des Agenda Kalenders

     Anmeldung zur geschlossenen Benutzergruppe
     Anleitung zur Aktivierung von SSL

letze Version der Autor Authoringsoftware

     letze Version des Demonstrationsprogramms Goedel
     letze Version des Bille Abgleichprogramms
     Bilder

Jenseits des Üblichen ....
    

Besucher

Besucher