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