1#
2# C library Makefile
3# 
4# Copyright 2006, Broadcom Corporation
5# All Rights Reserved.
6# 
7# THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
8# KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
9# SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
10# FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
11#
12# $Id: Makefile,v 1.1.1.1 2008/10/15 03:29:36 james26_jang Exp $
13#
14
15include $(TOP)/.config
16
17# Extra libraries
18lib-$(CONFIG_LIBCRYPT) += libcrypt
19lib-$(CONFIG_LIBDL) += libdl
20lib-$(CONFIG_LIBM) += libm
21lib-$(CONFIG_LIBNSL) += libnsl
22lib-$(CONFIG_LIBPTHREAD) += libpthread
23lib-$(CONFIG_LIBRESOLV) += libresolv
24lib-$(CONFIG_LIBUTIL) += libutil
25
26ifeq ($(PLATFORM),mipsel)
27lib-y += libnss_dns
28endif
29
30ifeq ($(CONFIG_UCLIBC),y)
31
32# uClibc names
33LINKER := ld-uClibc.so.0
34LIBC := libc.so.0
35MAP := uClibc.map
36
37else
38
39# GNU libc names
40LINKER := $(foreach lib,ld.so.* ld-linux.so.*,$(notdir $(wildcard $(LIBDIR)/$(lib))))
41LIBC := libc.so.6
42MAP := libc.map
43
44endif
45
46# Nothing to do until installation
47all:
48
49ifeq ($(CONFIG_LIBOPT),y)
50
51# Find all ELF binaries (including extra libraries)
52BINARIES := $(shell find $(TARGETDIR) -path $(TARGETDIR)/lib -prune -o -type f -print | file -f - | grep ELF | cut -d':' -f1)
53BINARIES += $(wildcard $(foreach lib,$(LINKER) $(lib-y),$(LIBDIR)/$(lib) $(LIBDIR)/$(lib).so.?))
54#BINARIES += $(TOOLCHAIN)/lib/libstdc++.so.5.0.3
55BINARIES += $(TOOLCHAIN)/lib/libgcc_s.so.1
56#BINARIES += $(PLATFORMDIR)/target/usr/sbin/chat
57
58ifneq ($(wildcard $(LIBDIR)/optinfo),)
59# Try the toolchain directory first for precursors
60OPTINFO := $(LIBDIR)/optinfo
61else
62# Fall back on platform directory
63OPTINFO := $(PLATFORM)
64endif
65
66ifeq ($(CONFIG_UCLIBC),y)
67
68# uClibc precursors
69OBJS := $(wildcard $(foreach file,libgcc-need.a libc.a interp.o,$(OPTINFO)/$(file)))
70
71# uClibc link parameters
72ENTRY := __uClibc_init
73LDFLAGS := -s -shared --warn-common --warn-once -z combreloc  -soname=$(LIBC) -init $(ENTRY)
74LIBGCC := $(shell $(CC) -print-libgcc-file-name)
75
76$(MAP): $(OPTINFO)/libc.a
77	$(NM) -o --defined-only --no-sort $< | cut -d' ' -f3 > $@
78
79# Find all unresolved symbols that uClibc could resolve
80.symbols: $(MAP) $(BINARIES)
81	rm -f $@
82	./find_syms.pl --map $(MAP) $(addprefix --bin ,$(BINARIES)) > $@
83
84# Re-link uClibc
85$(LIBC): .symbols $(OBJS)
86	xargs -t $(LD) $(LDFLAGS) -o $@ $(OBJS) $(LIBGCC) < .symbols
87
88else
89
90# GNU libc precursors
91OBJS := $(wildcard $(foreach file,soinit.os libc_pic.a sofini.os,$(OPTINFO)/$(file)))
92
93# GNU libc link parameters
94ENTRY := __libc_main
95CFLAGS := -shared -Wl,-O1 -Wl,-dynamic-linker=$(LINKER) -Wl,--version-script=$(MAP) -Wl,-soname=$(LIBC) -nostdlib -nostartfiles -e $(ENTRY)
96
97$(MAP): $(OPTINFO)/libc.map
98	cp $< $@
99
100# Find all unresolved symbols that GNU libc could resolve
101.symbols: $(MAP) $(BINARIES)
102	./find_syms.pl --map $(MAP) $(addprefix --bin ,$(BINARIES)) > $@
103#	rm -f $@
104#	for symbol in `$(NM) --dynamic -u --no-sort $(BINARIES) | sort -u` ; do \
105#	    grep -q "$${symbol};" $(MAP) && echo "-u $${symbol}" >> $@ ; \
106#	done
107
108# Re-link GNU libc
109$(LIBC): .symbols $(OBJS) $(LIBDIR)/$(LINKER)
110	xargs $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBDIR)/$(LINKER) -lgcc < .symbols
111
112endif
113
114./libgcc_s.so.1:
115	cp $(TOOLCHAIN)/lib/libgcc_s.so.1 $@
116
117#./libstdc++.so.5.0.3:
118#	cp $(TOOLCHAIN)/lib/libstdc++.so.5.0.3 $@
119
120# Install optimized C library
121install: $(LIBC)
122#install: ./libstdc++.so.5.0.3
123install: ./libgcc_s.so.1
124
125else
126
127# Install default C library
128install: $(LIBDIR)/$(LIBC)
129install: ./libgcc_s.so.1
130
131endif
132
133# Also install extra libraries
134install: $(wildcard $(foreach lib,$(LINKER) $(lib-y),$(LIBDIR)/$(lib) $(LIBDIR)/$(lib).so.?))
135	install -d $(TARGETDIR)/lib
136	install $^ $(TARGETDIR)/lib/
137	$(STRIP) $(TARGETDIR)/lib/*.so.*
138	echo $(OPTINFO) 
139
140clean:
141	rm -f $(LIBC) $(MAP) .symbols
142