1#
2# C library Makefile
3# 
4# Copyright (C) 2012, Broadcom Corporation. All Rights Reserved.
5# 
6# Permission to use, copy, modify, and/or distribute this software for any
7# purpose with or without fee is hereby granted, provided that the above
8# copyright notice and this permission notice appear in all copies.
9# 
10# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
13# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
15# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
16# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17#
18# $Id: Makefile 341899 2012-06-29 04:06:38Z $
19#
20
21include $(TOP)/.config
22
23# Extra libraries
24lib-y += libcrypt
25lib-y += libdl
26lib-y += libm
27#lib-$(CONFIG_LIBNSL) += libnsl
28lib-y += libpthread
29lib-y += libresolv
30#lib-$(CONFIG_LIBUTIL) += libutil
31
32ifeq ($(ARCH), arm)
33lib-y += libgcc_s
34else ifneq ($(CONFIG_LIBOPT),y)
35lib-y += libgcc_s
36endif
37
38#ifeq ($(CONFIG_UCLIBC),y)
39
40# uClibc names
41LINKER := ld-uClibc.so.0
42LIBC := libc.so.0
43MAP := uClibc.map
44
45#else
46
47# GNU libc names
48#LINKER := $(foreach lib,ld.so.* ld-linux.so.*,$(notdir $(wildcard $(LIBDIR)/$(lib))))
49#LIBC := libc.so.6
50#MAP := libc.map
51
52#endif
53
54# Nothing to do until installation
55all:
56
57ifeq ($(CONFIG_LIBOPT),y)
58
59# Find all ELF binaries (including extra libraries)
60BINARIES := $(shell find $(TARGETDIR) -path $(TARGETDIR)/lib -prune -o -type f -print | file -f - | grep ELF | cut -d':' -f1)
61BINARIES += $(wildcard $(foreach lib,$(LINKER) $(lib-y),$(LIBDIR)/$(lib) $(LIBDIR)/$(lib).so.?))
62
63ifneq ($(wildcard $(LIBDIR)/optinfo),)
64# Try the toolchain directory first for precursors
65OPTINFO := $(LIBDIR)/optinfo
66else
67ifneq ($(wildcard $(LIBDIR)),)
68OPTINFO := $(LIBDIR)
69else
70# Fall back on platform directory
71OPTINFO := $(PLATFORM)
72endif
73endif
74
75#ifeq ($(CONFIG_UCLIBC),y)
76
77# uClibc precursors
78#ifeq ($(ARCH), arm)
79OBJS := $(wildcard $(foreach file,libgcc-need.a libc_so.a interp.o,$(OPTINFO)/$(file)))
80#else
81#OBJS := $(wildcard $(foreach file,libgcc-need.a libc.a interp.o,$(OPTINFO)/$(file)))
82#endif
83
84#ifneq (2_4,$(LINUX_VERSION))
85#ifeq ($(ARCH), arm)
86CUSTOM_UCLIBC := $(TOOLCHAIN)/lib/libc_so.a
87#else
88#CUSTOM_UCLIBC := $(TOOLCHAIN)/lib/libc.a
89#endif
90#else
91#CUSTOM_UCLIBC :=  mipsel-uclibc/libc.a
92#endif
93
94#ifeq ($(CONFIG_IPV6),y)
95OBJS := $(wildcard $(foreach file,libgcc-need.a interp.o,$(OPTINFO)/$(file))) $(CUSTOM_UCLIBC)
96#endif # CONFIG_IPV6 = y
97
98# uClibc link parameters
99ENTRY := __uClibc_init
100LDFLAGS := -s -shared --warn-common --warn-once -z combreloc -soname=$(LIBC) -init $(ENTRY)
101LIBGCC := $(shell $(CC) -print-libgcc-file-name)
102
103ifeq ($(CONFIG_IPV6),y)
104$(MAP): $(CUSTOM_UCLIBC)
105else
106#ifeq ($(ARCH), arm)
107#$(MAP): $(OPTINFO)/libc_so.a
108#else
109#$(MAP): $(OPTINFO)/libc.a
110#endif
111endif
112	$(NM) -o --defined-only --no-sort $< | cut -d' ' -f3 > $@
113
114# Find all unresolved symbols that uClibc could resolve
115.symbols: $(MAP) $(BINARIES)
116ifeq ($(MKSYM),)
117	rm -f $@
118	for symbol in `$(NM) --dynamic -u --no-sort $(BINARIES) | sort -u` ; do \
119		if grep -q "^$${symbol}$$" $(MAP) ; then \
120			echo "-u $${symbol}" >> $@ ; \
121		fi ; \
122	done
123else
124	$(NM) --dynamic -u --no-sort $(BINARIES) | sort -u | $(MKSYM) $(MAP) > $@
125endif
126
127# Re-link uClibc
128$(LIBC): .symbols $(OBJS)
129	xargs -t $(LD) $(LDFLAGS) -o $@ $(OBJS) $(LIBGCC) < .symbols
130
131#else	# CONFIG_UCLIBC
132
133# GNU libc precursors
134#OBJS := $(wildcard $(foreach file,soinit.os libc_pic.a sofini.os,$(OPTINFO)/$(file)))
135
136# GNU libc link parameters
137#ENTRY := __libc_main
138#CFLAGS := -shared -Wl,-O1 -Wl,-dynamic-linker=$(LINKER) -Wl,--version-script=$(MAP) -Wl,-soname=$(LIBC) -nostdlib -nostartfiles -e $(ENTRY)
139
140#$(MAP): $(OPTINFO)/libc.map
141#	cp $< $@
142
143# Find all unresolved symbols that GNU libc could resolve
144#.symbols: $(MAP) $(BINARIES)
145#	rm -f $@
146#	for symbol in `$(NM) --dynamic -u --no-sort $(BINARIES) | sort -u` ; do \
147#	    grep -q "$${symbol};" $(MAP) && echo "-u $${symbol}" >> $@ ; \
148#	done
149
150# Re-link GNU libc
151#$(LIBC): .symbols $(OBJS) $(LIBDIR)/$(LINKER)
152#	xargs $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBDIR)/$(LINKER) -lgcc < .symbols
153
154#endif
155
156# Install optimized C library
157install: $(LIBC)
158
159else
160
161# Install default C library
162install: $(LIBDIR)/$(LIBC)
163
164endif
165
166# Also install extra libraries
167install: $(wildcard $(foreach lib,$(LINKER) $(lib-y),$(LIBDIR)/$(lib) $(LIBDIR)/$(lib).so.?))
168	install -d $(TARGETDIR)/lib
169	install $^ $(TARGETDIR)/lib/
170	$(STRIP) $(TARGETDIR)/lib/*.so.*
171
172ifneq ($(ARCH), arm)
173ifeq ($(CONFIG_LIBOPT),y)
174	(cd $(TARGETDIR)/lib/ && ln -sf libc.so.0 libgcc_s.so.1)
175endif
176endif
177
178clean:
179	rm -f $(LIBC) $(MAP) .symbols
180