1 # Rules.make for uClibc
3 # Copyright (C) 2000-2008 Erik Andersen <andersen@uclibc.org>
5 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
9 # FOO = bar -- recursively expanded variable. Value is remebered verbatim.
10 # If it contains references to other variables, these references
11 # are expanded whenever this variable is _substituted_.
12 # FOO := bar -- simply expanded variable. Right hand is expanded when
13 # the variable is _defined_. Therefore faster than =.
14 # FOO ?= bar -- set a value only if it is not already set
15 # (behaves as =, not :=).
16 # FOO += bar -- append; if FOO is not defined, acts like = (not :=).
19 # check for proper make version
20 ifneq ($(findstring x3.7
,x
$(MAKE_VERSION
)),)
21 $(error Your make is too old
$(MAKE_VERSION
). Go
get at least
3.80)
24 #-----------------------------------------------------------
25 # This file contains rules which are shared between multiple
26 # Makefiles. All normal configuration options live in the
27 # file named ".config". Don't mess with this file unless
28 # you know what you are doing.
31 #-----------------------------------------------------------
32 # If you are running a cross compiler, you will want to set
33 # 'CROSS' to something more interesting ... Target
34 # architecture is determined by asking the CC compiler what
35 # arch it compiles things for, so unless your compiler is
36 # broken, you should not need to specify TARGET_ARCH.
38 # Most people will set this stuff on the command line, i.e.
39 # make CROSS=arm-linux-
40 # will build uClibc for 'arm'.
49 OBJDUMP
= $(CROSS
)objdump
50 STRIPTOOL
= $(CROSS
)strip
59 STRIP_FLAGS ?
= -x
-R .note
-R .comment
61 ## unused? if yes, remove after 0.9.31
62 ## UNIFDEF := $(top_builddir)extra/scripts/unifdef
64 # Select the compiler needed to build binaries for your development system
66 BUILD_CFLAGS
= -Os
-Wall
68 #---------------------------------------------------------
69 # Nothing beyond this point should ever be touched by mere
70 # mortals. Unless you hang out with the gods, you should
71 # probably leave all this stuff alone.
74 qstrip
= $(strip $(subst ",,$(1)))
77 # Pull in the user's uClibc configuration
78 ifeq ($(filter $(noconfig_targets
),$(MAKECMDGOALS
)),)
79 -include $(top_builddir
).config
81 TARGET_ARCH
:=$(call qstrip
,$(TARGET_ARCH
))
82 ifeq ($(TARGET_ARCH
),)
83 ARCH ?
= $(shell uname
-m |
$(SED
) -e s
/i
.86/i386
/ \
84 -e s
/sun.
*/sparc
/ -e s
/sparc.
*/sparc
/ \
85 -e s
/arm.
*/arm
/ -e s
/sa110
/arm
/ \
87 -e s
/s390x
/s390
/ -e s
/parisc.
*/hppa
/ \
88 -e s
/ppc.
*/powerpc
/ -e s
/mips.
*/mips
/ \
89 -e s
/xtensa.
*/xtensa
/ )
95 # Make certain these contain a final "/", but no "//"s.
96 TARGET_SUBARCH
:=$(call qstrip
,$(shell grep
-s
'^TARGET_SUBARCH' $(top_builddir
)/.config |
$(SED
) -e
's/^TARGET_SUBARCH=//'))
97 TARGET_SUBARCH
:=$(call qstrip
,$(TARGET_SUBARCH
))
98 RUNTIME_PREFIX
:=$(strip $(subst //,/, $(subst ,/, $(call qstrip
,$(RUNTIME_PREFIX
)))))
99 DEVEL_PREFIX
:=$(strip $(subst //,/, $(subst ,/, $(call qstrip
,$(DEVEL_PREFIX
)))))
100 MULTILIB_DIR
:=$(strip $(subst //,/, $(subst ,/, $(call qstrip
,$(MULTILIB_DIR
)))))
101 KERNEL_HEADERS
:=$(strip $(subst //,/, $(subst ,/, $(call qstrip
,$(KERNEL_HEADERS
)))))
102 export RUNTIME_PREFIX DEVEL_PREFIX KERNEL_HEADERS MULTILIB_DIR
105 # Now config hard core
110 VERSION
:= $(MAJOR_VERSION
).
$(MINOR_VERSION
).
$(SUBLEVEL
)
111 ABI_VERSION
:= $(MAJOR_VERSION
)
112 ifneq ($(EXTRAVERSION
),)
113 VERSION
:= $(VERSION
)$(EXTRAVERSION
)
115 # Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc.
117 export MAJOR_VERSION MINOR_VERSION SUBLEVEL VERSION ABI_VERSION LC_ALL
120 SHARED_LIBNAME
:= $(LIBC
).so.
$(ABI_VERSION
)
121 UBACKTRACE_DSO
:= libubacktrace.so.
$(MAJOR_VERSION
)
122 ifneq ($(findstring $(TARGET_ARCH
) , hppa64 ia64 mips64 powerpc64 s390x sparc64 x86_64
),)
123 UCLIBC_LDSO_NAME
:= ld64-uClibc
124 ARCH_NATIVE_BIT
:= 64
126 UCLIBC_LDSO_NAME
:= ld-uClibc
127 ARCH_NATIVE_BIT
:= 32
129 UCLIBC_LDSO
:= $(UCLIBC_LDSO_NAME
).so.
$(ABI_VERSION
)
130 NONSHARED_LIBNAME
:= uclibc_nonshared.a
131 libc
:= $(top_builddir
)lib
/$(SHARED_LIBNAME
)
132 libc.depend
:= $(top_builddir
)lib
/$(SHARED_LIBNAME
:.
$(ABI_VERSION
)=)
133 ifneq ($(ARCH_HAS_NO_SHARED
),y
)
134 libdl.depend
:= $(top_builddir
)lib
/libdl.so
136 ifneq ($(HAS_NO_THREADS
),y
)
137 libpthread.depend
:= $(top_builddir
)lib
/libpthread.so
139 interp
:= $(top_builddir
)lib
/interp.os
140 ldso
:= $(top_builddir
)lib
/$(UCLIBC_LDSO
)
141 headers_dep
:= $(top_builddir
)include/bits
/sysnum.h
142 sub_headers
:= $(headers_dep
)
144 #LIBS :=$(interp) -L$(top_builddir)lib -lc
145 LIBS
:= $(interp
) -L
$(top_builddir
)lib
$(libc
:.
$(ABI_VERSION
)=)
147 # Make sure DESTDIR and PREFIX can be used to install
148 # PREFIX is a uClibcism while DESTDIR is a common GNUism
153 ifneq ($(HAVE_SHARED
),y
)
163 CROSS
=$(call qstrip
,$(CROSS_COMPILER_PREFIX
))
166 # A nifty macro to make testing gcc features easier
168 if
$(CC
) $(1) -S
-o
/dev
/null
-xc
/dev
/null
> /dev
/null
2>&1; \
169 then echo
"$(1)"; else echo
"$(2)"; fi
)
171 if
$(CC
) -Wa
,$(1) -Wa
,-Z
-c
-o
/dev
/null
-xassembler
/dev
/null
> /dev
/null
2>&1; \
172 then echo
"-Wa,$(1)"; fi
)
174 if
$(LD
) $(1) -o
/dev
/null
-b binary
/dev
/null
> /dev
/null
2>&1; \
175 then echo
"$(1)"; fi
)
180 # Flags in OPTIMIZATION are used only for non-debug builds
183 # Use '-Os' optimization if available, else use -O2, allow Config to override
184 OPTIMIZATION
+=$(call check_gcc
,-Os
,-O2
)
185 # Use the gcc 3.4 -funit-at-a-time optimization when available
186 OPTIMIZATION
+=$(call check_gcc
,-funit-at-a-time
,)
187 # shrinks code by about 0.1%
188 OPTIMIZATION
+=$(call check_gcc
,-fmerge-all-constants
)
189 OPTIMIZATION
+=$(call check_gcc
,-fstrict-aliasing
)
191 GCC_MAJOR_VER?
=$(shell $(CC
) -dumpversion | cut
-d .
-f
1)
192 #GCC_MINOR_VER?=$(shell $(CC) -dumpversion | cut -d . -f 2)
194 ifeq ($(GCC_MAJOR_VER
),4)
195 # shrinks code, results are from 4.0.2
197 OPTIMIZATION
+=$(call check_gcc
,-fno-tree-loop-optimize
,)
199 OPTIMIZATION
+=$(call check_gcc
,-fno-tree-dominator-opts
,)
201 OPTIMIZATION
+=$(call check_gcc
,-fno-strength-reduce
,)
205 # CPU_CFLAGS-y contain options which are not warnings,
206 # not include or library paths, and not optimizations.
208 # Why -funsigned-char: I hunted a bug related to incorrect
209 # sign extension of 'char' type for 10 hours straight. Not fun.
210 CPU_CFLAGS-y
:= -funsigned-char
-fno-builtin
212 CPU_CFLAGS-y
+= $(call check_gcc
,-fno-asm
,)
215 ifeq ($(UCLIBC_HAS_SOFT_FLOAT
),y
)
216 # If -msoft-float isn't supported, we want an error anyway.
217 # Hmm... might need to revisit this for arm since it has 2 different
218 # soft float encodings.
219 ifneq ($(TARGET_ARCH
),nios
)
220 ifneq ($(TARGET_ARCH
),nios2
)
221 ifneq ($(TARGET_ARCH
),sh
)
222 ifneq ($(TARGET_ARCH
),c6x
)
223 CPU_CFLAGS-y
+= -msoft-float
228 ifeq ($(TARGET_ARCH
),arm
)
229 # No longer needed with current toolchains, but leave it here for now.
230 # If anyone is actually still using gcc 2.95 (say), they can uncomment it.
231 # LDADD_LIBFLOAT=-lfloat
235 CPU_CFLAGS-y
+= $(call check_gcc
,-std
=gnu99
,)
237 CPU_CFLAGS-
$(UCLIBC_FORMAT_SHARED_FLAT
) += -mid-shared-library
238 CPU_CFLAGS-
$(UCLIBC_FORMAT_FLAT_SEP_DATA
) += -msep-data
240 CPU_LDFLAGS-
$(ARCH_LITTLE_ENDIAN
) += -Wl
,-EL
241 CPU_LDFLAGS-
$(ARCH_BIG_ENDIAN
) += -Wl
,-EB
244 PICFLAG-
$(UCLIBC_FORMAT_FDPIC_ELF
) := -mfdpic
245 PICFLAG-
$(UCLIBC_FORMAT_DSBT_ELF
) := -mdsbt
-fpic
246 PICFLAG
:= $(PICFLAG-y
)
249 # Some nice CPU specific optimizations
250 ifeq ($(TARGET_ARCH
),i386
)
251 OPTIMIZATION
+=$(call check_gcc
,-fomit-frame-pointer
,)
253 ifeq ($(CONFIG_386
)$(CONFIG_486
)$(CONFIG_586
)$(CONFIG_586MMX
),y
)
254 # Non-SSE capable processor.
255 # NB: this may make SSE insns segfault!
256 # -O1 -march=pentium3, -Os -msse etc are known to be affected.
257 # See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13685
258 # -m32 is needed if host is 64-bit
259 OPTIMIZATION
+=$(call check_gcc
,-m32
-mpreferred-stack-boundary
=2,)
261 OPTIMIZATION
+=$(call check_gcc
,-mpreferred-stack-boundary
=4,)
264 # Choice of alignment (please document why!)
265 # -falign-labels: in-line labels
266 # (reachable by normal code flow, aligning will insert nops
267 # which will be executed - may even make things slower)
268 # -falign-jumps: reachable only by a jump
269 # Generic: no alignment at all (smallest code)
270 GCC_FALIGN
=$(call check_gcc
,-falign-functions
=1 -falign-jumps
=1 -falign-labels
=1 -falign-loops
=1,-malign-jumps
=1 -malign-loops
=1)
271 ifeq ($(CONFIG_K7
),y
)
272 # Align functions to four bytes, use default for jumps and loops (why?)
273 GCC_FALIGN
=$(call check_gcc
,-falign-functions
=4 -falign-labels
=1,-malign-functions
=4)
275 ifeq ($(CONFIG_CRUSOE
),y
)
276 # Use compiler's default for functions, jumps and loops (why?)
277 GCC_FALIGN
=$(call check_gcc
,-falign-functions
=0 -falign-labels
=1,-malign-functions
=0)
279 ifeq ($(CONFIG_CYRIXIII
),y
)
280 # Use compiler's default for functions, jumps and loops (why?)
281 GCC_FALIGN
=$(call check_gcc
,-falign-functions
=0 -falign-labels
=1,-malign-functions
=0)
283 OPTIMIZATION
+=$(GCC_FALIGN
)
285 # Putting each function and data object into its own section
286 # allows for kbytes of less text if users link against static uclibc
287 # using ld --gc-sections.
288 # ld 2.18 can't do that (yet?) for shared libraries, so we itself
289 # do not use --gc-sections at shared lib link time.
290 # However, in combination with sections being sorted by alignment
291 # it does result in much reduced padding:
292 # text data bss dec hex
293 # 235319 1472 5992 242783 3b45f old.so
294 # 234104 1472 5980 241556 3af94 new.so
295 # Without -ffunction-sections, all functions will get aligned
296 # to 4 byte boundary by as/ld. This is arguably a bug in as.
297 # It specifies 4 byte align for .text even if not told to do so:
298 # Idx Name Size VMA LMA File off Algn
299 # 0 .text xxxxxxxx 00000000 00000000 xxxxxxxx 2**2 <===!
300 CPU_CFLAGS-y
+= $(call check_gcc
,-ffunction-sections
-fdata-sections
,)
301 ifneq ($(call check_ld
,--sort-common
),)
302 CPU_LDFLAGS-y
+= -Wl
,--sort-common
304 ifneq ($(call check_ld
,--sort-section alignment
),)
305 CPU_LDFLAGS-y
+= -Wl
,--sort-section
,alignment
310 CPU_CFLAGS-
$(CONFIG_386
)+=-march
=i386
311 CPU_CFLAGS-
$(CONFIG_486
)+=-march
=i486
312 CPU_CFLAGS-
$(CONFIG_ELAN
)+=-march
=i486
313 CPU_CFLAGS-
$(CONFIG_586
)+=-march
=i586
314 CPU_CFLAGS-
$(CONFIG_586MMX
)+=$(call check_gcc
,-march
=pentium-mmx
,-march
=i586
)
315 CPU_CFLAGS-
$(CONFIG_686
)+=-march
=i686
316 CPU_CFLAGS-
$(CONFIG_PENTIUMII
)+=$(call check_gcc
,-march
=pentium2
,-march
=i686
)
317 CPU_CFLAGS-
$(CONFIG_PENTIUMIII
)+=$(call check_gcc
,-march
=pentium3
,-march
=i686
)
318 CPU_CFLAGS-
$(CONFIG_PENTIUM4
)+=$(call check_gcc
,-march
=pentium4
,-march
=i686
)
319 CPU_CFLAGS-
$(CONFIG_K6
)+=$(call check_gcc
,-march
=k6
,-march
=i586
)
320 CPU_CFLAGS-
$(CONFIG_K7
)+=$(call check_gcc
,-march
=athlon
,-march
=i686
)
321 CPU_CFLAGS-
$(CONFIG_CRUSOE
)+=-march
=i686
322 CPU_CFLAGS-
$(CONFIG_WINCHIPC6
)+=$(call check_gcc
,-march
=winchip-c6
,-march
=i586
)
323 CPU_CFLAGS-
$(CONFIG_WINCHIP2
)+=$(call check_gcc
,-march
=winchip2
,-march
=i586
)
324 CPU_CFLAGS-
$(CONFIG_CYRIXIII
)+=$(call check_gcc
,-march
=c3
,-march
=i486
)
325 CPU_CFLAGS-
$(CONFIG_NEHEMIAH
)+=$(call check_gcc
,-march
=c3-2
,-march
=i686
)
328 ifeq ($(TARGET_ARCH
),sparc
)
329 CPU_CFLAGS-
$(CONFIG_SPARC_V7
)+=-mcpu
=v7
330 CPU_CFLAGS-
$(CONFIG_SPARC_V8
)+=-mcpu
=v8
331 CPU_CFLAGS-
$(CONFIG_SPARC_V9
)+=-mcpu
=v9
332 CPU_CFLAGS-
$(CONFIG_SPARC_V9B
)+=$(call check_gcc
,-mcpu
=v9b
,-mcpu
=ultrasparc
)
335 ifeq ($(TARGET_ARCH
),arm
)
336 CPU_CFLAGS-
$(ARCH_LITTLE_ENDIAN
)+=-mlittle-endian
337 CPU_CFLAGS-
$(ARCH_BIG_ENDIAN
)+=-mbig-endian
338 CPU_CFLAGS-
$(COMPILE_IN_THUMB_MODE
)+=-mthumb
341 ifeq ($(TARGET_ARCH
),mips
)
342 OPTIMIZATION
+=-mno-split-addresses
343 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_1
)+=-mips1
344 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_2
)+=-mips2
-mtune
=mips2
345 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_3
)+=-mips3
-mtune
=mips3
346 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_4
)+=-mips4
-mtune
=mips4
347 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_MIPS32
)+=-mips32
-mtune
=mips32
348 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_MIPS32R2
)+=-march
=mips32r2
-mtune
=mips32r2
349 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_MIPS64
)+=-mips64
-mtune
=mips32
350 ifeq ($(strip $(ARCH_BIG_ENDIAN
)),y
)
351 CPU_LDFLAGS-
$(CONFIG_MIPS_N64_ABI
)+=-Wl
,-melf64btsmip
352 CPU_LDFLAGS-
$(CONFIG_MIPS_O32_ABI
)+=-Wl
,-melf32btsmip
354 ifeq ($(strip $(ARCH_LITTLE_ENDIAN
)),y
)
355 CPU_LDFLAGS-
$(CONFIG_MIPS_N64_ABI
)+=-Wl
,-melf64ltsmip
356 CPU_LDFLAGS-
$(CONFIG_MIPS_O32_ABI
)+=-Wl
,-melf32ltsmip
358 CPU_CFLAGS-
$(CONFIG_MIPS_N64_ABI
)+=-mabi
=64
359 CPU_CFLAGS-
$(CONFIG_MIPS_O32_ABI
)+=-mabi
=32
360 CPU_CFLAGS-
$(CONFIG_MIPS_N32_ABI
)+=-mabi
=n32
363 ifeq ($(TARGET_ARCH
),nios
)
364 OPTIMIZATION
+=-funaligned-struct-hack
365 CPU_LDFLAGS-y
+=-Wl
,-m32
366 CPU_CFLAGS-y
+=-Wl
,-m32
369 ifeq ($(TARGET_ARCH
),sh
)
370 OPTIMIZATION
+= $(call check_gcc
,-mprefergot
,)
371 CPU_CFLAGS-
$(ARCH_LITTLE_ENDIAN
)+=-ml
372 CPU_CFLAGS-
$(ARCH_BIG_ENDIAN
)+=-mb
373 CPU_CFLAGS-
$(CONFIG_SH2
)+=-m2
374 CPU_CFLAGS-
$(CONFIG_SH3
)+=-m3
375 ifeq ($(UCLIBC_HAS_FPU
),y
)
376 CPU_CFLAGS-
$(CONFIG_SH2A
)+=-m2a
377 CPU_CFLAGS-
$(CONFIG_SH4
)+=-m4
379 CPU_CFLAGS-
$(CONFIG_SH2A
)+=-m2a-nofpu
380 CPU_CFLAGS-
$(CONFIG_SH4
)+=-m4-nofpu
384 ifeq ($(TARGET_ARCH
),sh64
)
385 CPU_CFLAGS-
$(ARCH_LITTLE_ENDIAN
):=-ml
386 CPU_CFLAGS-
$(ARCH_BIG_ENDIAN
):=-mb
387 CPU_CFLAGS-
$(CONFIG_SH5
)+=-m5-32media
390 ifeq ($(TARGET_ARCH
),h8300
)
392 CPU_LDFLAGS-
$(CONFIG_H8300H
)+= -Wl
,-ms8300h
393 CPU_LDFLAGS-
$(CONFIG_H8S
) += -Wl
,-ms8300s
394 CPU_CFLAGS-
$(CONFIG_H8300H
) += -mh
-mint32
395 CPU_CFLAGS-
$(CONFIG_H8S
) += -ms
-mint32
398 ifeq ($(TARGET_ARCH
),i960
)
399 OPTIMIZATION
+=-mh
-mint32
#-fsigned-char
402 ifeq ($(TARGET_ARCH
),e1
)
403 OPTIMIZATION
+=-mgnu-param
406 ifeq ($(TARGET_ARCH
),cris
)
407 CPU_LDFLAGS-
$(CONFIG_CRIS
)+=-Wl
,-mcrislinux
408 CPU_LDFLAGS-
$(CONFIG_CRISV32
)+=-Wl
,-mcrislinux
409 CPU_CFLAGS-
$(CONFIG_CRIS
)+=-mlinux
414 ifeq ($(TARGET_ARCH
),m68k
)
415 # -fPIC is only supported for 68020 and above. It is not supported
416 # for 68000, 68010, or Coldfire.
421 ifeq ($(TARGET_ARCH
),powerpc
)
422 # PowerPC can hold 8192 entries in its GOT with -fpic which is more than
423 # enough. Therefore use -fpic which will reduce code size and generates
427 PPC_HAS_REL16
:=$(shell echo
-e
"\t.text\n\taddis 11,30,_GLOBAL_OFFSET_TABLE_-.@ha" |
$(CC
) -c
-x assembler
-o
/dev
/null
- 2> /dev
/null
&& echo
-n y || echo
-n n
)
428 CPU_CFLAGS-
$(PPC_HAS_REL16
)+= -DHAVE_ASM_PPC_REL16
429 CPU_CFLAGS-
$(CONFIG_E500
) += "-D__NO_MATH_INLINES"
433 ifeq ($(TARGET_ARCH
),bfin
)
435 ifeq ($(UCLIBC_FORMAT_FDPIC_ELF
),y
)
436 CPU_CFLAGS-y
:=-mfdpic
437 CPU_LDFLAGS-y
+= -Wl
,-melf32bfinfd
441 ifeq ($(UCLIBC_FORMAT_SHARED_FLAT
),y
)
442 PICFLAG
:= -mleaf-id-shared-library
446 ifeq ($(TARGET_ARCH
),frv
)
447 CPU_LDFLAGS-
$(CONFIG_FRV
)+=-Wl
,-melf32frvfd
448 # Using -pie causes the program to have an interpreter, which is
449 # forbidden, so we must make do with -shared. Unfortunately,
450 # -shared by itself would get us global function descriptors
451 # and calls through PLTs, dynamic resolution of symbols, etc,
452 # which would break as well, but -Bsymbolic comes to the rescue.
453 export LDPIEFLAG
:=-shared
-Wl
,-Bsymbolic
457 ifeq ($(strip $(TARGET_ARCH
)),avr32
)
458 CPU_CFLAGS-
$(CONFIG_AVR32_AP7
) += -march
=ap
459 CPU_CFLAGS-
$(CONFIG_LINKRELAX
) += -mrelax
460 CPU_LDFLAGS-
$(CONFIG_LINKRELAX
) += --relax
463 ifeq ($(TARGET_ARCH
),i960
)
467 ifeq ($(TARGET_ARCH
),v850
)
471 ifeq ($(TARGET_ARCH
),c6x
)
473 CPU_CFLAGS-
$(CONFIG_TMS320C64X
) += -march
=c64x
474 CPU_CFLAGS-
$(CONFIG_TMS320C64XPLUS
) += -march
=c64x
+
475 CPU_CFLAGS-
$(ARCH_LITTLE_ENDIAN
)+=-mlittle-endian
476 CPU_CFLAGS-
$(ARCH_BIG_ENDIAN
)+=-mbig-endian
477 CPU_LDFLAGS-y
+= $(CPU_CFLAGS
)
480 # Keep the check_gcc from being needlessly executed
482 export PIEFLAG
:=$(call check_gcc
,$(PIEFLAG_NAME
),$(PICFLAG
))
484 # We need to keep track of both the CC PIE flag (above) as
485 # well as the LD PIE flag (below) because we can't rely on
486 # gcc passing -pie if we used -fPIE. We need to directly use -pie
487 # instead of -Wl,-pie as gcc picks up the wrong startfile/endfile
489 export LDPIEFLAG
:=$(shell $(LD
) --help
2>/dev
/null | grep
-q
-- -pie
&& echo
"-pie")
492 # Check for --as-needed support in linker
493 ifndef LD_FLAG_ASNEEDED
494 _LD_FLAG_ASNEEDED
:=$(shell $(LD
) --help
2>/dev
/null | grep
-- --as-needed
)
495 ifneq ($(_LD_FLAG_ASNEEDED
),)
496 export LD_FLAG_ASNEEDED
:=--as-needed
499 ifndef LD_FLAG_NO_ASNEEDED
500 ifdef LD_FLAG_ASNEEDED
501 export LD_FLAG_NO_ASNEEDED
:=--no-as-needed
504 ifndef CC_FLAG_ASNEEDED
505 ifdef LD_FLAG_ASNEEDED
506 export CC_FLAG_ASNEEDED
:=-Wl
,$(LD_FLAG_ASNEEDED
)
509 ifndef CC_FLAG_NO_ASNEEDED
510 ifdef LD_FLAG_NO_ASNEEDED
511 export CC_FLAG_NO_ASNEEDED
:=-Wl
,$(LD_FLAG_NO_ASNEEDED
)
514 link.asneeded
= $(if
$(findstring yy
,$(CC_FLAG_ASNEEDED
)$(CC_FLAG_NO_ASNEEDED
)),$(CC_FLAG_ASNEEDED
) $(1) $(CC_FLAG_NO_ASNEEDED
))
516 # Check for AS_NEEDED support in linker script (binutils>=2.16.1 has it)
518 export ASNEEDED
:=$(shell $(LD
) --help
2>/dev
/null | grep
-q
-- --as-needed
&& echo
"AS_NEEDED ( $(UCLIBC_LDSO) )" || echo
"$(UCLIBC_LDSO)")
519 ifeq ($(UCLIBC_HAS_BACKTRACE
),y
)
520 # Only used in installed libc.so linker script
521 UBACKTRACE_FULL_NAME
:= $(RUNTIME_PREFIX
)lib
/$(UBACKTRACE_DSO
)
522 export UBACKTRACE_ASNEEDED
:=$(shell $(LD
) --help
2>/dev
/null | grep
-q
-- --as-needed
&& echo
"AS_NEEDED ( $(UBACKTRACE_FULL_NAME) )" || echo
"$(UBACKTRACE_FULL_NAME)")
524 export UBACKTRACE_ASNEEDED
:=""
528 # Add a bunch of extra pedantic annoyingly strict checks
529 XWARNINGS
=$(call qstrip
,$(WARNINGS
))
530 XWARNINGS
+=$(foreach w
,\
531 -Wstrict-prototypes \
533 , $(call check_gcc
,$(w
),))
534 ifeq ($(EXTRA_WARNINGS
),y
)
535 XWARNINGS
+=$(foreach w
,\
538 -Wmissing-format-attribute \
539 -Wmissing-prototypes \
540 -Wmissing-declarations \
543 -Wold-style-declaration \
544 -Wold-style-definition \
547 , $(call check_gcc
,$(w
),))
548 # Works only w/ gcc-3.4 and up, can't be checked for gcc-3.x w/ check_gcc()
549 #XWARNINGS+=-Wdeclaration-after-statement
551 CPU_CFLAGS
=$(call qstrip
,$(CPU_CFLAGS-y
))
553 SSP_DISABLE_FLAGS ?
= $(call check_gcc
,-fno-stack-protector
,)
554 ifeq ($(UCLIBC_BUILD_SSP
),y
)
555 SSP_CFLAGS
:= $(call check_gcc
,-fno-stack-protector-all
,)
556 SSP_CFLAGS
+= $(call check_gcc
,-fstack-protector
,)
557 SSP_ALL_CFLAGS ?
= $(call check_gcc
,-fstack-protector-all
,)
559 SSP_CFLAGS
:= $(SSP_DISABLE_FLAGS
)
562 NOSTDLIB_CFLAGS
:=$(call check_gcc
,-nostdlib
,)
564 # Collect all CFLAGS components
565 CFLAGS
:= -include $(top_srcdir
)include/libc-symbols.h \
566 $(XWARNINGS
) $(CPU_CFLAGS
) $(SSP_CFLAGS
) \
567 -nostdinc
-I
$(top_builddir
)include -I
$(top_srcdir
)include -I. \
568 -I
$(top_srcdir
)libc
/sysdeps
/linux \
569 -I
$(top_srcdir
)libc
/sysdeps
/linux
/$(TARGET_ARCH
)
571 # We need this to be checked within libc-symbols.h
572 ifneq ($(HAVE_SHARED
),y
)
576 LDFLAG_WARN_ONCE
:=$(if
$(call check_ld
,--warn-once
),-Wl
$(comma
)--warn-once
)
577 LDFLAG_SORT_COMMON
:=$(if
$(call check_ld
,--sort-common
),-Wl
$(comma
)--sort-common
)
578 LDFLAG_DISCARD_ALL
:=$(if
$(call check_ld
,--discard-all
),-Wl
$(comma
)--discard-all
)
579 LDFLAGS_NOSTRIP
:=$(CPU_LDFLAGS-y
) -shared \
580 -Wl
,--warn-common
$(LDFLAG_WARN_ONCE
) -Wl
,-z
,combreloc
581 # binutils-2.16.1 warns about ignored sections, 2.16.91.0.3 and newer are ok
582 #LDFLAGS_NOSTRIP+=$(call check_ld,--gc-sections)
584 ifeq ($(UCLIBC_BUILD_RELRO
),y
)
585 LDFLAGS_NOSTRIP
+=-Wl
,-z
,relro
588 ifeq ($(UCLIBC_BUILD_NOW
),y
)
589 LDFLAGS_NOSTRIP
+=-Wl
,-z
,now
592 ifeq ($(LDSO_GNU_HASH_SUPPORT
),y
)
593 # Be sure that binutils support it
594 LDFLAGS_GNUHASH
:=$(call check_ld
,--hash-style
=gnu
)
595 ifeq ($(LDFLAGS_GNUHASH
),)
596 ifneq ($(filter-out $(clean_targets
) install_headers headers-y
,$(MAKECMDGOALS
)),)
597 $(error Your binutils do not support
--hash-style option
, while you want to use it
)
600 LDFLAGS_NOSTRIP
+= -Wl
,$(LDFLAGS_GNUHASH
)
604 LDFLAGS
:=$(LDFLAGS_NOSTRIP
) -Wl
,-z
,defs
606 CFLAGS
+= -O0
-g3
-DDEBUG
608 CFLAGS
+= $(OPTIMIZATION
)
613 STRIPTOOL
:= true
-Stripping_disabled
615 ifneq ($(strip $(UCLIBC_EXTRA_CFLAGS
)),"")
616 CFLAGS
+= $(call qstrip
,$(UCLIBC_EXTRA_CFLAGS
))
620 # we try to compile all sources at once into an object (IMA), but
621 # gcc-3.3.x does not support it
622 # gcc-3.4.x supports it, but does not need and support --combine. though fails on many sources
623 # gcc-4.0.x supports it, supports the --combine flag, but does not need it
624 # gcc-4.1(200506xx) supports it, but needs the --combine flag, else libs are useless
625 ifeq ($(GCC_MAJOR_VER
),3)
628 CFLAGS
+=$(call check_gcc
,--combine
,)
634 ifneq ($(strip $(UCLIBC_EXTRA_LDFLAGS
)),"")
635 LDFLAGS
+= $(call qstrip
,$(UCLIBC_EXTRA_LDFLAGS
))
638 ifeq ($(UCLIBC_HAS_THREADS
),y
)
639 ifeq ($(UCLIBC_HAS_THREADS_NATIVE
),y
)
641 CFLAGS
+= -DHAVE_FORCED_UNWIND
643 ifeq ($(LINUXTHREADS_OLD
),y
)
644 PTNAME
:= linuxthreads.old
646 PTNAME
:= linuxthreads
649 PTDIR
:= libpthread
/$(PTNAME
)
650 # set up system dependencies include dirs (NOTE: order matters!)
651 ifeq ($(UCLIBC_HAS_THREADS_NATIVE
),y
)
652 PTINC
:= -I
$(top_builddir
)$(PTDIR
) \
653 -I
$(top_srcdir
)$(PTDIR
) \
654 $(if
$(TARGET_ARCH
),-I
$(top_srcdir
)$(PTDIR
)/sysdeps
/unix
/sysv
/linux
/$(TARGET_ARCH
)/$(TARGET_SUBARCH
)) \
655 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/unix
/sysv
/linux
/$(TARGET_ARCH
) \
656 -I
$(top_builddir
)$(PTDIR
)/sysdeps
/$(TARGET_ARCH
) \
657 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/$(TARGET_ARCH
) \
658 -I
$(top_builddir
)$(PTDIR
)/sysdeps
/unix
/sysv
/linux \
659 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/unix
/sysv
/linux \
660 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/pthread \
661 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/pthread
/bits \
662 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/generic \
663 -I
$(top_srcdir
)ldso
/ldso
/$(TARGET_ARCH
) \
664 -I
$(top_srcdir
)ldso
/include
666 # Test for TLS if NPTL support was selected.
668 GCC_HAS_TLS
=$(shell \
669 echo
"extern __thread int foo;" |
$(CC
) -o
/dev
/null
-S
-xc
- 2>&1)
670 ifneq ($(GCC_HAS_TLS
),)
673 @echo
"#### Your compiler does not support TLS and you are trying to build uClibc";
674 @echo
"#### with NPTL support. Upgrade your binutils and gcc to versions which";
675 @echo
"#### support TLS for your architecture. Do not contact uClibc maintainers";
676 @echo
"#### about this problem.";
678 @echo
"#### Exiting...";
684 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/unix
/sysv
/linux
/$(TARGET_ARCH
) \
685 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/$(TARGET_ARCH
) \
686 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/unix
/sysv
/linux \
687 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/pthread \
688 -I
$(top_srcdir
)$(PTDIR
) \
689 -I
$(top_srcdir
)libpthread
696 CFLAGS
+= -I
$(top_srcdir
)libc
/sysdeps
/linux
/common
697 CFLAGS
+= -I
$(KERNEL_HEADERS
)
699 #CFLAGS += -iwithprefix include-fixed -iwithprefix include
700 CC_IPREFIX
:= $(shell $(CC
) --print-file-name
=include)
701 CC_INC
:= -isystem
$(dir $(CC_IPREFIX
))include-fixed
-isystem
$(CC_IPREFIX
)
704 ifneq ($(DOASSERTS
),y
)
708 ifeq ($(SYMBOL_PREFIX
),_
)
709 CFLAGS
+=-D__UCLIBC_UNDERSCORES__
712 # Keep the check_as from being needlessly executed
713 ifndef ASFLAGS_NOEXEC
714 ifeq ($(UCLIBC_BUILD_NOEXECSTACK
),y
)
715 export ASFLAGS_NOEXEC
:= $(call check_as
,--noexecstack
)
717 export ASFLAGS_NOEXEC
:=
720 ASFLAGS
= $(ASFLAGS_NOEXEC
)
722 LIBGCC_CFLAGS ?
= $(CFLAGS
) $(CPU_CFLAGS-y
)
723 LIBGCC
:=$(shell $(CC
) $(LIBGCC_CFLAGS
) -print-libgcc-file-name
)
724 LIBGCC_DIR
:=$(dir $(LIBGCC
))
726 # moved from libpthread/linuxthreads
727 ifeq ($(UCLIBC_CTOR_DTOR
),y
)
728 SHARED_START_FILES
:=$(top_builddir
)lib
/crti.o
$(LIBGCC_DIR
)crtbeginS.o
729 SHARED_END_FILES
:=$(LIBGCC_DIR
)crtendS.o
$(top_builddir
)lib
/crtn.o
732 LOCAL_INSTALL_PATH
:= install_dir