diff --git a/package/base-files/Makefile b/package/base-files/Makefile index 4abbdf7ac4..27916f3e65 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 0000000000..5367b70935 --- /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 " + 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" "$@"