1# 2# C library Makefile 3# 4# Copyright (C) 2010, 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,v 1.30 2009/08/27 03:14:48 Exp $ 19# 20 21include $(TOP)/.config 22 23# Extra libraries 24lib-$(CONFIG_LIBCRYPT) += libcrypt 25lib-$(CONFIG_LIBDL) += libdl 26lib-$(CONFIG_LIBM) += libm 27lib-$(CONFIG_LIBNSL) += libnsl 28lib-$(CONFIG_LIBPTHREAD) += libpthread 29lib-$(CONFIG_LIBRESOLV) += libresolv 30lib-$(CONFIG_LIBUTIL) += libutil 31 32ifeq ($(CONFIG_UCLIBC),y) 33 34# uClibc names 35LINKER := ld-uClibc.so.0 36LIBC := libc.so.0 37MAP := uClibc.map 38 39else 40 41# GNU libc names 42LINKER := $(foreach lib,ld.so.* ld-linux.so.*,$(notdir $(wildcard $(LIBDIR)/$(lib)))) 43LIBC := libc.so.6 44MAP := libc.map 45 46endif 47 48# Nothing to do until installation 49all: 50 51ifeq ($(CONFIG_LIBOPT),y) 52 53# Find all ELF binaries (including extra libraries) 54BINARIES := $(shell find $(TARGETDIR) -path $(TARGETDIR)/lib -prune -o -type f -print | file -f - | grep ELF | cut -d':' -f1) 55BINARIES += $(wildcard $(foreach lib,$(LINKER) $(lib-y),$(LIBDIR)/$(lib) $(LIBDIR)/$(lib).so.?)) 56 57ifneq ($(wildcard $(LIBDIR)/optinfo),) 58# Try the toolchain directory first for precursors 59OPTINFO := $(LIBDIR)/optinfo 60else 61ifneq ($(wildcard $(LIBDIR)),) 62OPTINFO := $(LIBDIR) 63else 64# Fall back on platform directory 65OPTINFO := $(PLATFORM) 66endif 67endif 68ifeq ($(CONFIG_UCLIBC),y) 69 70# uClibc precursors 71OBJS := $(wildcard $(foreach file,libgcc-need.a libc.a interp.o,$(OPTINFO)/$(file))) 72 73ifeq ($(LINUX_VERSION),2_6) 74CUSTOM_UCLIBC := $(TOOLCHAIN)/lib/libc.a 75else 76CUSTOM_UCLIBC := mipsel-uclibc/libc.a 77endif 78 79ifeq ($(CONFIG_IPV6),y) 80OBJS := $(wildcard $(foreach file,libgcc-need.a interp.o,$(OPTINFO)/$(file))) $(CUSTOM_UCLIBC) 81endif # CONFIG_IPV6 = y 82$(LIBC): 83 cp $(TOOLCHAIN)/lib/libuClibc-0.9.29.so libc.so.0 84 85# uClibc link parameters 86#ENTRY := __uClibc_init 87#LDFLAGS := -s -shared --warn-common --warn-once -z combreloc -soname=$(LIBC) -init $(ENTRY) 88#LIBGCC := $(shell $(CC) -print-libgcc-file-name) 89 90#ifeq ($(CONFIG_IPV6),y) 91#$(MAP): $(CUSTOM_UCLIBC) 92#else 93#$(MAP): $(OPTINFO)/libc.a 94#endif 95# $(NM) -o --defined-only --no-sort $< | cut -d' ' -f3 > $@ 96 97# Find all unresolved symbols that uClibc could resolve 98#.symbols: $(MAP) $(BINARIES) 99# rm -f $@ 100# for symbol in `$(NM) --dynamic -u --no-sort $(BINARIES) | sort -u` ; do \ 101# if grep -q "^$${symbol}$$" $(MAP) ; then \ 102# echo "-u $${symbol}" >> $@ ; \ 103# fi ; \ 104# done 105 106# Re-link uClibc 107#$(LIBC): .symbols $(OBJS) 108# xargs -t $(LD) $(LDFLAGS) -o $@ $(OBJS) $(LIBGCC) < .symbols 109 110else #<------------- don't care start: 111 112# GNU libc precursors 113OBJS := $(wildcard $(foreach file,soinit.os libc_pic.a sofini.os,$(OPTINFO)/$(file))) 114 115# GNU libc link parameters 116ENTRY := __libc_main 117CFLAGS := -shared -Wl,-O1 -Wl,-dynamic-linker=$(LINKER) -Wl,--version-script=$(MAP) -Wl,-soname=$(LIBC) -nostdlib -nostartfiles -e $(ENTRY) 118 119$(MAP): $(OPTINFO)/libc.map 120 cp $< $@ 121 122# Find all unresolved symbols that GNU libc could resolve 123.symbols: $(MAP) $(BINARIES) 124 rm -f $@ 125 for symbol in `$(NM) --dynamic -u --no-sort $(BINARIES) | sort -u` ; do \ 126 grep -q "$${symbol};" $(MAP) && echo "-u $${symbol}" >> $@ ; \ 127 done 128 129# Re-link GNU libc 130$(LIBC): .symbols $(OBJS) $(LIBDIR)/$(LINKER) 131 xargs $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBDIR)/$(LINKER) -lgcc < .symbols 132 133endif #<------------------- don't care end. 134 135# Install optimized C library 136install: $(LIBC) 137 138else 139 140# Install default C library 141install: $(LIBDIR)/$(LIBC) 142 143endif 144 145# Also install extra libraries 146install: $(wildcard $(foreach lib,$(LINKER) $(lib-y),$(LIBDIR)/$(lib) $(LIBDIR)/$(lib).so.?)) 147 install -d $(TARGETDIR)/lib 148 install $^ $(TARGETDIR)/lib/ 149 $(STRIP) $(TARGETDIR)/lib/*.so.* 150 151clean: 152 rm -f $(LIBC) $(MAP) .symbols 153