diff options
| -rw-r--r-- | package/base-files/Makefile | 64 | ||||
| -rwxr-xr-x | scripts/relink-lib.sh | 14 | 
2 files changed, 73 insertions, 5 deletions
| diff --git a/package/base-files/Makefile b/package/base-files/Makefile index 4abbdf7ac..27916f3e6 100644 --- a/package/base-files/Makefile +++ b/package/base-files/Makefile @@ -327,8 +327,56 @@ endef  define Build/Compile/Default  endef +LIBGCC_A=$(wildcard $(TOOLCHAIN_DIR)/lib/gcc/*/*/libgcc_pic.a) +LIBGCC_MAP=$(wildcard $(TOOLCHAIN_DIR)/lib/gcc/*/*/libgcc.map) + +ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) +  define Build/Compile/uClibc +	$(SCRIPT_DIR)/relink-lib.sh \ +		"$(TARGET_CROSS)" \ +		"$(wildcard $(TOOLCHAIN_DIR)/lib/libc_so.a)" \ +		"$(wildcard $(TOOLCHAIN_DIR)/lib/libc_so.a)" \ +		"$(patsubst $(TOOLCHAIN_DIR)/lib/%,$(PKG_BUILD_DIR)/%,$(wildcard $(TOOLCHAIN_DIR)/lib/libuClibc-*.so))" \ +		-Wl,-init,__uClibc_init -Wl,-soname=libc.so.0 \ +		$(PKG_BUILD_DIR)/libgcc_s.so.* +	$(SCRIPT_DIR)/relink-lib.sh \ +		"$(TARGET_CROSS)" \ +		"$(wildcard $(TOOLCHAIN_DIR)/lib/libcrypt-*.so)" \ +		"$(wildcard $(TOOLCHAIN_DIR)/lib/libcrypt_pic.a)" \ +		"$(patsubst $(TOOLCHAIN_DIR)/lib/%,$(PKG_BUILD_DIR)/%,$(wildcard $(TOOLCHAIN_DIR)/lib/libcrypt-*.so))" \ +		$(PKG_BUILD_DIR)/libgcc_s.so.* \ +		-Wl,-soname=libcrypt.so.0 +	$(SCRIPT_DIR)/relink-lib.sh \ +		"$(TARGET_CROSS)" \ +		"$(wildcard $(TOOLCHAIN_DIR)/lib/libm-*.so)" \ +		"$(wildcard $(TOOLCHAIN_DIR)/lib/libm_pic.a)" \ +		"$(patsubst $(TOOLCHAIN_DIR)/lib/%,$(PKG_BUILD_DIR)/%,$(wildcard $(TOOLCHAIN_DIR)/lib/libm-*.so))" \ +		$(PKG_BUILD_DIR)/libgcc_s.so.* \ +		-Wl,-soname=libm.so.0 +	$(SCRIPT_DIR)/relink-lib.sh \ +		"$(TARGET_CROSS)" \ +		"$(wildcard $(TOOLCHAIN_DIR)/lib/libpthread-*.so)" \ +		"$(wildcard $(TOOLCHAIN_DIR)/lib/libpthread_so.a)" \ +		"$(patsubst $(TOOLCHAIN_DIR)/lib/%,$(PKG_BUILD_DIR)/%,$(wildcard $(TOOLCHAIN_DIR)/lib/libpthread-*.so))" \ +		-Wl,-z,nodelete,-z,initfirst,-init=__pthread_initialize_minimal_internal \ +		$(PKG_BUILD_DIR)/libgcc_s.so.* \ +		-Wl,-soname=libpthread.so.0 +  endef + +  define Build/Compile/libgcc +	$(SCRIPT_DIR)/relink-lib.sh \ +		"$(TARGET_CROSS)" \ +		"$(wildcard $(TOOLCHAIN_DIR)/lib/libgcc_s.so.*)" \ +		"$(LIBGCC_A)" \ +		"$(patsubst $(TOOLCHAIN_DIR)/lib/%,$(PKG_BUILD_DIR)/%,$(wildcard $(TOOLCHAIN_DIR)/lib/libgcc_s.so.*))" \ +		-Wl,--version-script=$(LIBGCC_MAP) -Wl,-soname=libgcc_s.so.1 +  endef +endif +  define Build/Compile  	$(call Build/Compile/Default) +	$(call Build/Compile/libgcc) +	$(call Build/Compile/$(LIBC))  endef  define Package/base-files/install @@ -398,7 +446,7 @@ ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),)    define Package/libgcc/install  	$(INSTALL_DIR) $(1)/lib -	$(CP) $(TOOLCHAIN_DIR)/lib/libgcc_s.so.* $(1)/lib/ +	$(CP) $(PKG_BUILD_DIR)/libgcc_s.so.* $(1)/lib/    endef    define Package/libssp/install @@ -450,6 +498,12 @@ ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),)  			$(TOOLCHAIN_DIR)/lib/$$$$file-$(LIBC_SO_VERSION).so \  			$(1)/lib/; \  	done + +	$(CP) \ +		$(PKG_BUILD_DIR)/libuClibc-* \ +		$(PKG_BUILD_DIR)/libm-* \ +		$(PKG_BUILD_DIR)/libcrypt-* \ +		$(1)/lib/    endef    define Package/libc/install @@ -459,9 +513,9 @@ ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),)    define Package/libc/install_lib  	$(CP) $(filter-out %/libdl_pic.a %/libpthread_pic.a %/libresolv_pic.a,$(wildcard $(TOOLCHAIN_DIR)/lib/lib*.a)) $(1)/lib/  	$(if $(wildcard $(TOOLCHAIN_DIR)/lib/libc_so.a),$(CP) $(TOOLCHAIN_DIR)/lib/libc_so.a $(1)/lib/libc_pic.a) -	$(if $(wildcard $(TOOLCHAIN_DIR)/lib/gcc/*/*/libgcc.map), \ -		$(CP) $(TOOLCHAIN_DIR)/lib/gcc/*/*/libgcc_pic.a $(1)/lib/libgcc_s_pic.a; \ -		$(CP) $(TOOLCHAIN_DIR)/lib/gcc/*/*/libgcc.map $(1)/lib/libgcc_s_pic.map \ +	$(if $(LIBGCC_MAP), \ +		$(CP) $(LIBGCC_A) $(1)/lib/libgcc_s_pic.a; \ +		$(CP) $(LIBGCC_MAP) $(1)/lib/libgcc_s_pic.map \  	)    endef @@ -469,7 +523,7 @@ ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),)  	$(INSTALL_DIR) $(1)/lib  	$(CP) \  		$(TOOLCHAIN_DIR)/lib/libpthread.so.* \ -		$(TOOLCHAIN_DIR)/lib/libpthread-$(LIBC_SO_VERSION).so \ +		$(PKG_BUILD_DIR)/libpthread-$(LIBC_SO_VERSION).so \  		$(1)/lib/    endef diff --git a/scripts/relink-lib.sh b/scripts/relink-lib.sh new file mode 100755 index 000000000..5367b7093 --- /dev/null +++ b/scripts/relink-lib.sh @@ -0,0 +1,14 @@ +#!/bin/sh +[ $# -lt 4 -o -z "$1" -o -z "$2" -o -z "$3" -o -z "$4" ] && { +	echo "Usage: $0 <cross> <reference> <pic .a> <destination>" +	exit 1 +} + +cross="$1"; shift +ref="$1"; shift +pic="$1"; shift +dest="$1"; shift + +SYMBOLS="$(${cross}nm "$ref" | grep -E '........ [TW] ' | awk '$3 {printf "-u%s ", $3}')" +set -x +${cross}gcc -nostdlib -nostartfiles -shared -Wl,--gc-sections -o "$dest" $SYMBOLS "$pic" "$@" | 
