1LOCAL_PATH:= $(call my-dir) 2 3include $(LOCAL_PATH)/arch-$(TARGET_ARCH)/syscalls.mk 4 5# Define the common source files for all the libc instances 6# ========================================================= 7libc_common_src_files := \ 8 $(syscall_src) \ 9 unistd/abort.c \ 10 unistd/alarm.c \ 11 unistd/brk.c \ 12 unistd/creat.c \ 13 unistd/daemon.c \ 14 unistd/exec.c \ 15 unistd/fcntl.c \ 16 unistd/fnmatch.c \ 17 unistd/ftime.c \ 18 unistd/ftok.c \ 19 unistd/getcwd.c \ 20 unistd/getdtablesize.c \ 21 unistd/gethostname.c \ 22 unistd/getopt_long.c \ 23 unistd/getpgrp.c \ 24 unistd/getpriority.c \ 25 unistd/getpt.c \ 26 unistd/initgroups.c \ 27 unistd/isatty.c \ 28 unistd/issetugid.c \ 29 unistd/lseek64.c \ 30 unistd/mmap.c \ 31 unistd/nice.c \ 32 unistd/open.c \ 33 unistd/openat.c \ 34 unistd/opendir.c \ 35 unistd/pathconf.c \ 36 unistd/perror.c \ 37 unistd/popen.c \ 38 unistd/pread.c \ 39 unistd/pselect.c \ 40 unistd/ptsname.c \ 41 unistd/ptsname_r.c \ 42 unistd/pwrite.c \ 43 unistd/raise.c \ 44 unistd/reboot.c \ 45 unistd/recv.c \ 46 unistd/sbrk.c \ 47 unistd/send.c \ 48 unistd/setegid.c \ 49 unistd/seteuid.c \ 50 unistd/setpgrp.c \ 51 unistd/sigblock.c \ 52 unistd/siginterrupt.c \ 53 unistd/siglist.c \ 54 unistd/signal.c \ 55 unistd/sigsetmask.c \ 56 unistd/sigsuspend.c \ 57 unistd/sigwait.c \ 58 unistd/sleep.c \ 59 unistd/statfs.c \ 60 unistd/strsignal.c \ 61 unistd/sysconf.c \ 62 unistd/syslog.c \ 63 unistd/system.c \ 64 unistd/tcgetpgrp.c \ 65 unistd/tcsetpgrp.c \ 66 unistd/time.c \ 67 unistd/umount.c \ 68 unistd/unlockpt.c \ 69 unistd/usleep.c \ 70 unistd/wait.c \ 71 stdio/asprintf.c \ 72 stdio/clrerr.c \ 73 stdio/fclose.c \ 74 stdio/fdopen.c \ 75 stdio/feof.c \ 76 stdio/ferror.c \ 77 stdio/fflush.c \ 78 stdio/fgetc.c \ 79 stdio/fgetln.c \ 80 stdio/fgetpos.c \ 81 stdio/fgets.c \ 82 stdio/fileno.c \ 83 stdio/findfp.c \ 84 stdio/flags.c \ 85 stdio/flockfile.c \ 86 stdio/fopen.c \ 87 stdio/fprintf.c \ 88 stdio/fpurge.c \ 89 stdio/fputc.c \ 90 stdio/fputs.c \ 91 stdio/fread.c \ 92 stdio/freopen.c \ 93 stdio/fscanf.c \ 94 stdio/fseek.c \ 95 stdio/fsetpos.c \ 96 stdio/ftell.c \ 97 stdio/funopen.c \ 98 stdio/fvwrite.c \ 99 stdio/fwalk.c \ 100 stdio/fwrite.c \ 101 stdio/getc.c \ 102 stdio/getchar.c \ 103 stdio/gets.c \ 104 stdio/makebuf.c \ 105 stdio/mktemp.c \ 106 stdio/printf.c \ 107 stdio/putc.c \ 108 stdio/putchar.c \ 109 stdio/puts.c \ 110 stdio/putw.c \ 111 stdio/refill.c \ 112 stdio/remove.c \ 113 stdio/rewind.c \ 114 stdio/rget.c \ 115 stdio/scanf.c \ 116 stdio/setbuf.c \ 117 stdio/setbuffer.c \ 118 stdio/setvbuf.c \ 119 stdio/snprintf.c\ 120 stdio/sprintf.c \ 121 stdio/sscanf.c \ 122 stdio/stdio.c \ 123 stdio/tempnam.c \ 124 stdio/tmpfile.c \ 125 stdio/tmpnam.c \ 126 stdio/ungetc.c \ 127 stdio/vasprintf.c \ 128 stdio/vfprintf.c \ 129 stdio/vfscanf.c \ 130 stdio/vprintf.c \ 131 stdio/vsnprintf.c \ 132 stdio/vsprintf.c \ 133 stdio/vscanf.c \ 134 stdio/vsscanf.c \ 135 stdio/wbuf.c \ 136 stdio/wsetup.c \ 137 stdlib/_rand48.c \ 138 stdlib/assert.c \ 139 stdlib/atexit.c \ 140 stdlib/atoi.c \ 141 stdlib/atol.c \ 142 stdlib/atoll.c \ 143 stdlib/bsearch.c \ 144 stdlib/ctype_.c \ 145 stdlib/div.c \ 146 stdlib/exit.c \ 147 stdlib/getenv.c \ 148 stdlib/jrand48.c \ 149 stdlib/ldiv.c \ 150 stdlib/lldiv.c \ 151 stdlib/locale.c \ 152 stdlib/lrand48.c \ 153 stdlib/mrand48.c \ 154 stdlib/nrand48.c \ 155 stdlib/putenv.c \ 156 stdlib/qsort.c \ 157 stdlib/seed48.c \ 158 stdlib/setenv.c \ 159 stdlib/setjmperr.c \ 160 stdlib/srand48.c \ 161 stdlib/strntoimax.c \ 162 stdlib/strntoumax.c \ 163 stdlib/strtod.c \ 164 stdlib/strtoimax.c \ 165 stdlib/strtol.c \ 166 stdlib/strtoll.c \ 167 stdlib/strtoul.c \ 168 stdlib/strtoull.c \ 169 stdlib/strtoumax.c \ 170 stdlib/tolower_.c \ 171 stdlib/toupper_.c \ 172 stdlib/wchar.c \ 173 string/bcopy.c \ 174 string/index.c \ 175 string/memccpy.c \ 176 string/memchr.c \ 177 string/memmem.c \ 178 string/memmove.c.arm \ 179 string/memrchr.c \ 180 string/memswap.c \ 181 string/strcasecmp.c \ 182 string/strcasestr.c \ 183 string/strcat.c \ 184 string/strchr.c \ 185 string/strcmp.c \ 186 string/strcoll.c \ 187 string/strcpy.c \ 188 string/strcspn.c \ 189 string/strdup.c \ 190 string/strerror.c \ 191 string/strerror_r.c \ 192 string/strlcat.c \ 193 string/strlcpy.c \ 194 string/strncat.c \ 195 string/strncmp.c \ 196 string/strncpy.c \ 197 string/strndup.c \ 198 string/strnlen.c \ 199 string/strpbrk.c \ 200 string/strrchr.c \ 201 string/strsep.c \ 202 string/strspn.c \ 203 string/strstr.c \ 204 string/strtok.c \ 205 string/strtotimeval.c \ 206 string/strxfrm.c \ 207 inet/bindresvport.c \ 208 inet/inet_addr.c \ 209 inet/inet_aton.c \ 210 inet/inet_ntoa.c \ 211 inet/inet_ntop.c \ 212 inet/inet_pton.c \ 213 tzcode/asctime.c \ 214 tzcode/difftime.c \ 215 tzcode/localtime.c \ 216 tzcode/strftime.c \ 217 tzcode/strptime.c \ 218 bionic/__errno.c \ 219 bionic/__set_errno.c \ 220 bionic/_rand48.c \ 221 bionic/arc4random.c \ 222 bionic/basename.c \ 223 bionic/basename_r.c \ 224 bionic/dirname.c \ 225 bionic/dirname_r.c \ 226 bionic/drand48.c \ 227 bionic/erand48.c \ 228 bionic/fork.c \ 229 bionic/if_nametoindex.c \ 230 bionic/if_indextoname.c \ 231 bionic/ioctl.c \ 232 bionic/ldexp.c \ 233 bionic/libc_init_common.c \ 234 bionic/logd_write.c \ 235 bionic/md5.c \ 236 bionic/pututline.c \ 237 bionic/realpath.c \ 238 bionic/semaphore.c \ 239 bionic/sha1.c \ 240 bionic/ssp.c \ 241 bionic/stubs.c \ 242 bionic/system_properties.c \ 243 bionic/time64.c \ 244 bionic/thread_atexit.c \ 245 bionic/utime.c \ 246 bionic/utmp.c \ 247 netbsd/gethnamaddr.c \ 248 netbsd/isc/ev_timers.c \ 249 netbsd/isc/ev_streams.c \ 250 netbsd/inet/nsap_addr.c \ 251 netbsd/resolv/__dn_comp.c \ 252 netbsd/resolv/__res_close.c \ 253 netbsd/resolv/__res_send.c \ 254 netbsd/resolv/herror.c \ 255 netbsd/resolv/res_comp.c \ 256 netbsd/resolv/res_data.c \ 257 netbsd/resolv/res_debug.c \ 258 netbsd/resolv/res_init.c \ 259 netbsd/resolv/res_mkquery.c \ 260 netbsd/resolv/res_query.c \ 261 netbsd/resolv/res_send.c \ 262 netbsd/resolv/res_state.c.arm \ 263 netbsd/resolv/res_cache.c \ 264 netbsd/net/nsdispatch.c \ 265 netbsd/net/getaddrinfo.c \ 266 netbsd/net/getnameinfo.c \ 267 netbsd/net/getservbyname.c \ 268 netbsd/net/getservent.c \ 269 netbsd/net/base64.c \ 270 netbsd/net/getservbyport.c \ 271 netbsd/nameser/ns_name.c \ 272 netbsd/nameser/ns_parse.c \ 273 netbsd/nameser/ns_ttl.c \ 274 netbsd/nameser/ns_netint.c \ 275 netbsd/nameser/ns_print.c \ 276 netbsd/nameser/ns_samedomain.c 277 278# Architecture specific source files go here 279# ========================================================= 280ifeq ($(TARGET_ARCH),arm) 281libc_common_src_files += \ 282 bionic/eabi.c \ 283 arch-arm/bionic/__get_pc.S \ 284 arch-arm/bionic/__get_sp.S \ 285 arch-arm/bionic/_exit_with_stack_teardown.S \ 286 arch-arm/bionic/_setjmp.S \ 287 arch-arm/bionic/atomics_arm.S \ 288 arch-arm/bionic/clone.S \ 289 arch-arm/bionic/ffs.S \ 290 arch-arm/bionic/kill.S \ 291 arch-arm/bionic/tkill.S \ 292 arch-arm/bionic/memcmp.S \ 293 arch-arm/bionic/memcmp16.S \ 294 arch-arm/bionic/memcpy.S \ 295 arch-arm/bionic/memset.S \ 296 arch-arm/bionic/setjmp.S \ 297 arch-arm/bionic/sigsetjmp.S \ 298 arch-arm/bionic/strlen.c.arm \ 299 arch-arm/bionic/syscall.S \ 300 unistd/socketcalls.c 301 302# These files need to be arm so that gdbserver 303# can set breakpoints in them without messing 304# up any thumb code. 305libc_common_src_files += \ 306 bionic/pthread.c.arm \ 307 bionic/pthread-timers.c.arm \ 308 bionic/ptrace.c.arm 309 310# these are used by the static and dynamic versions of the libc 311# respectively 312libc_arch_static_src_files := \ 313 arch-arm/bionic/exidx_static.c 314 315libc_arch_dynamic_src_files := \ 316 arch-arm/bionic/exidx_dynamic.c 317else # !arm 318 319ifeq ($(TARGET_ARCH),x86) 320libc_common_src_files += \ 321 arch-x86/bionic/__get_sp.S \ 322 arch-x86/bionic/__get_tls.c \ 323 arch-x86/bionic/__set_tls.c \ 324 arch-x86/bionic/atomics_x86.S \ 325 arch-x86/bionic/clone.S \ 326 arch-x86/bionic/_exit_with_stack_teardown.S \ 327 arch-x86/bionic/setjmp.S \ 328 arch-x86/bionic/_setjmp.S \ 329 arch-x86/bionic/vfork.S \ 330 arch-x86/string/bzero.S \ 331 arch-x86/string/memset.S \ 332 arch-x86/string/memcmp.S \ 333 arch-x86/string/memcpy.S \ 334 arch-x86/string/strlen.S \ 335 bionic/pthread.c \ 336 bionic/pthread-timers.c \ 337 bionic/ptrace.c 338 339# this is needed for static versions of libc 340libc_arch_static_src_files := \ 341 arch-x86/bionic/dl_iterate_phdr_static.c 342 343libc_arch_dynamic_src_files := 344endif # x86 345endif # !arm 346 347# Define some common cflags 348# ======================================================== 349libc_common_cflags := \ 350 -DWITH_ERRLIST \ 351 -DANDROID_CHANGES \ 352 -DUSE_LOCKS \ 353 -DREALLOC_ZERO_BYTES_FREES \ 354 -D_LIBC=1 \ 355 -DSOFTFLOAT \ 356 -DFLOATING_POINT \ 357 -DNEED_PSELECT=1 \ 358 -DINET6 \ 359 -I$(LOCAL_PATH)/private \ 360 -DUSE_DL_PREFIX 361 362ifeq ($(strip $(DEBUG_BIONIC_LIBC)),true) 363 libc_common_cflags += -DDEBUG 364endif 365 366ifeq ($(TARGET_ARCH),arm) 367 libc_common_cflags += -fstrict-aliasing 368 libc_crt_target_cflags := -mthumb-interwork 369else # !arm 370 ifeq ($(TARGET_ARCH),x86) 371 libc_crt_target_cflags := -m32 372 endif # x86 373endif # !arm 374 375# Define some common includes 376# ======================================================== 377libc_common_c_includes := \ 378 $(LOCAL_PATH)/stdlib \ 379 $(LOCAL_PATH)/string \ 380 $(LOCAL_PATH)/stdio 381 382 383# Define the libc run-time (crt) support object files that must be built, 384# which are needed to build all other objects (shared/static libs and 385# executables) 386# ========================================================================== 387 388ifeq ($(TARGET_ARCH),x86) 389# we only need begin_so/end_so for x86, since it needs an appropriate .init 390# section in the shared library with a function to call all the entries in 391# .ctors section. ARM uses init_array, and does not need the function. 392GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_so.o 393$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_so.S 394 @mkdir -p $(dir $@) 395 $(TARGET_CC) $(libc_crt_target_cflags) -o $@ -c $< 396ALL_GENERATED_SOURCES += $(GEN) 397 398GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtend_so.o 399$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtend_so.S 400 @mkdir -p $(dir $@) 401 $(TARGET_CC) $(libc_crt_target_cflags) -o $@ -c $< 402ALL_GENERATED_SOURCES += $(GEN) 403endif # TARGET_ARCH == x86 404 405 406GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_static.o 407$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_static.S 408 @mkdir -p $(dir $@) 409 $(TARGET_CC) $(libc_crt_target_cflags) -o $@ -c $< 410ALL_GENERATED_SOURCES += $(GEN) 411 412GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_dynamic.o 413$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtbegin_dynamic.S 414 @mkdir -p $(dir $@) 415 $(TARGET_CC) $(libc_crt_target_cflags) -o $@ -c $< 416ALL_GENERATED_SOURCES += $(GEN) 417 418 419# We rename crtend.o to crtend_android.o to avoid a 420# name clash between gcc and bionic. 421GEN := $(TARGET_OUT_STATIC_LIBRARIES)/crtend_android.o 422$(GEN): $(LOCAL_PATH)/arch-$(TARGET_ARCH)/bionic/crtend.S 423 @mkdir -p $(dir $@) 424 $(TARGET_CC) $(libc_crt_target_cflags) -o $@ -c $< 425ALL_GENERATED_SOURCES += $(GEN) 426 427 428# To enable malloc leak check for statically linked programs, add 429# "WITH_MALLOC_CHECK_LIBC_A := true" to buildspec.mk 430WITH_MALLOC_CHECK_LIBC_A := $(strip $(WITH_MALLOC_CHECK_LIBC_A)) 431 432# ======================================================== 433# libc_common.a 434# ======================================================== 435include $(CLEAR_VARS) 436 437LOCAL_SRC_FILES := $(libc_common_src_files) 438LOCAL_CFLAGS := $(libc_common_cflags) 439LOCAL_C_INCLUDES := $(libc_common_c_includes) 440LOCAL_MODULE := libc_common 441LOCAL_SYSTEM_SHARED_LIBRARIES := 442 443include $(BUILD_STATIC_LIBRARY) 444 445 446# ======================================================== 447# libc_nomalloc.a 448# ======================================================== 449# 450# This is a version of the static C library that does not 451# include malloc. It's useful in situations when calling 452# the user wants to provide their own malloc implementation, 453# or wants to explicitly disallow the use of the use of malloc, 454# like the dynamic loader. 455 456include $(CLEAR_VARS) 457 458LOCAL_SRC_FILES := \ 459 $(libc_arch_static_src_files) \ 460 bionic/libc_init_static.c 461 462LOCAL_C_INCLUDES := $(libc_common_c_includes) 463LOCAL_CFLAGS := $(libc_common_cflags) 464 465LOCAL_MODULE := libc_nomalloc 466LOCAL_WHOLE_STATIC_LIBRARIES := libc_common 467LOCAL_SYSTEM_SHARED_LIBRARIES := 468 469include $(BUILD_STATIC_LIBRARY) 470 471 472# ======================================================== 473# libc.a 474# ======================================================== 475include $(CLEAR_VARS) 476 477LOCAL_SRC_FILES := \ 478 $(libc_arch_static_src_files) \ 479 bionic/dlmalloc.c \ 480 bionic/libc_init_static.c 481 482LOCAL_CFLAGS := $(libc_common_cflags) 483 484ifeq ($(WITH_MALLOC_CHECK_LIBC_A),true) 485 LOCAL_CFLAGS += -DMALLOC_LEAK_CHECK 486 LOCAL_SRC_FILES += bionic/malloc_leak.c.arm 487endif 488 489LOCAL_C_INCLUDES := $(libc_common_c_includes) 490 491LOCAL_MODULE := libc 492LOCAL_WHOLE_STATIC_LIBRARIES := libc_common 493LOCAL_SYSTEM_SHARED_LIBRARIES := 494 495include $(BUILD_STATIC_LIBRARY) 496 497 498# ======================================================== 499# libc.so 500# ======================================================== 501include $(CLEAR_VARS) 502 503LOCAL_CFLAGS := $(libc_common_cflags) 504LOCAL_C_INCLUDES := $(libc_common_c_includes) 505 506LOCAL_SRC_FILES := \ 507 $(libc_arch_dynamic_src_files) \ 508 bionic/dlmalloc.c \ 509 bionic/malloc_leak.c.arm \ 510 bionic/libc_init_dynamic.c 511 512LOCAL_MODULE:= libc 513 514# WARNING: The only library libc.so should depend on is libdl.so! If you add other libraries, 515# make sure to add -Wl,--exclude-libs=libgcc.a to the LOCAL_LDFLAGS for those libraries. This 516# ensures that symbols that are pulled into those new libraries from libgcc.a are not declared 517# external; if that were the case, then libc would not pull those symbols from libgcc.a as it 518# should, instead relying on the external symbols from the dependent libraries. That would 519# create an "cloaked" dependency on libgcc.a in libc though the libraries, which is not what 520# you wanted! 521 522LOCAL_SHARED_LIBRARIES := libdl 523LOCAL_WHOLE_STATIC_LIBRARIES := libc_common 524LOCAL_SYSTEM_SHARED_LIBRARIES := 525 526include $(BUILD_SHARED_LIBRARY) 527 528 529# ======================================================== 530# libc_debug.so 531# ======================================================== 532include $(CLEAR_VARS) 533 534LOCAL_CFLAGS := \ 535 $(libc_common_cflags) \ 536 -DMALLOC_LEAK_CHECK 537 538LOCAL_C_INCLUDES := $(libc_common_c_includes) 539 540LOCAL_SRC_FILES := \ 541 $(libc_arch_dynamic_src_files) \ 542 bionic/dlmalloc.c \ 543 bionic/malloc_leak.c.arm \ 544 bionic/libc_init_dynamic.c 545 546LOCAL_MODULE:= libc_debug 547 548# WARNING: The only library libc.so should depend on is libdl.so! If you add other libraries, 549# make sure to add -Wl,--exclude-libs=libgcc.a to the LOCAL_LDFLAGS for those libraries. This 550# ensures that symbols that are pulled into those new libraries from libgcc.a are not declared 551# external; if that were the case, then libc would not pull those symbols from libgcc.a as it 552# should, instead relying on the external symbols from the dependent libraries. That would 553# create an "cloaked" dependency on libgcc.a in libc though the libraries, which is not what 554# you wanted! 555 556LOCAL_SHARED_LIBRARIES := libdl 557LOCAL_WHOLE_STATIC_LIBRARIES := libc_common 558LOCAL_SYSTEM_SHARED_LIBRARIES := 559# Don't prelink 560LOCAL_PRELINK_MODULE := false 561# Don't install on release build 562LOCAL_MODULE_TAGS := eng 563 564include $(BUILD_SHARED_LIBRARY) 565 566# ======================================================== 567include $(call all-makefiles-under,$(LOCAL_PATH)) 568