Bug 606145 part 3 - Integrate elfhack with the build system. r=khuey,a=bsmedberg
authorMike Hommey <mh+mozilla@glandium.org>
Mon, 24 Jan 2011 09:56:40 +0100
changeset 61171 9a6de1e28d4bf476870fec0d01f29e4be6f05dcc
parent 61170 a1ccb1c489baeeb2e738ce9173b5ee079b0243f9
child 61172 d461fff2e9208cacb490dcc68721b4156a8a0b1e
push idunknown
push userunknown
push dateunknown
reviewerskhuey, bsmedberg
bugs606145
milestone2.0b10pre
Bug 606145 part 3 - Integrate elfhack with the build system. r=khuey,a=bsmedberg
build/unix/Makefile.in
build/unix/elfhack/Makefile.in
config/autoconf.mk.in
configure.in
toolkit/mozapps/installer/packager.mk
--- a/build/unix/Makefile.in
+++ b/build/unix/Makefile.in
@@ -40,16 +40,20 @@ DEPTH		= ../..
 topsrcdir	= @top_srcdir@
 srcdir		= @srcdir@
 VPATH		= @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
 MODULE       = build
 
+ifeq ($(USE_ELF_HACK)$(HOST_OS_ARCH)$(OS_ARCH)$(OS_TARGET),1LinuxLinuxLinux)
+DIRS = elfhack
+endif
+
 include $(topsrcdir)/config/rules.mk
 
 libs:: $(srcdir)/run-mozilla.sh
 	$(INSTALL) $< $(DIST)/bin
 
 ifeq ($(OS_ARCH),OpenVMS)
 libs:: vms/mozilla.com vms/install.com vms/getinfo.com
 	$(INSTALL) $? $(DIST)/bin
new file mode 100644
--- /dev/null
+++ b/build/unix/elfhack/Makefile.in
@@ -0,0 +1,112 @@
+#
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is elfhack
+#
+# The Initial Developer of the Original Code is
+# Mozilla Foundation
+# Portions created by the Initial Developer are Copyright (C) 2010
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#   Mike Hommey <mh@glandium.org>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either of the GNU General Public License Version 2 or later (the "GPL"),
+# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+DEPTH		= ../../..
+topsrcdir	= @top_srcdir@
+srcdir		= @srcdir@
+VPATH		= @srcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+INTERNAL_TOOLS = 1
+
+HOST_PROGRAM = elfhack
+NO_DIST_INSTALL = 1
+
+HOST_CPPSRCS = \
+  elf.cpp \
+  elfhack.cpp \
+  $(NULL)
+
+OS_CXXFLAGS += -fexceptions
+
+ifneq (,$(filter %86,$(TARGET_CPU)))
+CPU := x86
+else
+CPU := $(TARGET_CPU)
+endif
+
+CSRCS := \
+  inject/$(CPU).c \
+  inject/$(CPU)-noinit.c \
+  $(NULL)
+
+libs:: $(CSRCS:.c=.$(OBJ_SUFFIX))
+
+ifndef CROSS_COMPILE
+test$(DLL_SUFFIX): test.$(OBJ_SUFFIX) elfhack $(CSRCS:.c=.$(OBJ_SUFFIX))
+	$(MKSHLIB) $<
+	rm -f $@.bak
+	$(CURDIR)/elfhack -b $@
+	# Fail if the backup file doesn't exist
+	[ -f "$@.bak" ]
+	# Fail if the new library doesn't contain less relocations
+	[ $$(objdump -R $@.bak | wc -l) -gt $$(objdump -R $@ | wc -l) ]
+
+dummy: dummy.$(OBJ_SUFFIX) test$(DLL_SUFFIX)
+	$(CC) -o $@ $^
+
+libs:: dummy
+	# Will either crash or return exit code 1 if elfhack is broken
+	LD_LIBRARY_PATH=$(CURDIR) $(CURDIR)/dummy
+
+CSRCS += test.c dummy.c
+
+GARBAGE += dummy test$(DLL_SUFFIX) test$(DLL_SUFFIX).bak
+endif
+
+inject:
+	$(NSINSTALL) -D $@
+
+inject/%.c: inject.c | inject
+	cp $< $@
+
+GARBAGE_DIRS += inject
+
+inject/%.$(OBJ_SUFFIX): DEFINES += -DBITS=$(if $(HAVE_64BIT_OS),64,32)
+inject/$(CPU)-noinit.$(OBJ_SUFFIX): DEFINES += -DNOINIT
+
+# need this to suppress errors due to /usr/include/linux/byteorder/swab.h
+# on mozilla buildbots
+OS_CXXFLAGS := $(filter-out -pedantic,$(OS_CXXFLAGS))
+
+# Avoid building as thumb code, this is not supported yet
+COMMA := ,
+OS_CFLAGS := $(filter-out -mthumb -Wa$(COMMA)-mthumb,$(OS_CFLAGS))
+
+include $(topsrcdir)/config/rules.mk
--- a/config/autoconf.mk.in
+++ b/config/autoconf.mk.in
@@ -112,16 +112,17 @@ MOZ_SHARK       = @MOZ_SHARK@
 MOZ_CALLGRIND   = @MOZ_CALLGRIND@
 MOZ_VTUNE       = @MOZ_VTUNE@
 MOZ_TRACE_JSCALLS = @MOZ_TRACE_JSCALLS@
 MOZ_TRACEVIS    = @MOZ_TRACEVIS@
 DEHYDRA_PATH    = @DEHYDRA_PATH@
 
 NS_TRACE_MALLOC = @NS_TRACE_MALLOC@
 USE_ELF_DYNSTR_GC = @USE_ELF_DYNSTR_GC@
+USE_ELF_HACK = @USE_ELF_HACK@
 INCREMENTAL_LINKER = @INCREMENTAL_LINKER@
 MACOSX_DEPLOYMENT_TARGET = @MACOSX_DEPLOYMENT_TARGET@
 MOZ_MAIL_NEWS	= @MOZ_MAIL_NEWS@
 MOZ_PLAINTEXT_EDITOR_ONLY = @MOZ_PLAINTEXT_EDITOR_ONLY@
 BUILD_STATIC_LIBS = @BUILD_STATIC_LIBS@
 MOZ_ENABLE_LIBXUL = @MOZ_ENABLE_LIBXUL@
 ENABLE_TESTS	= @ENABLE_TESTS@
 IBMBIDI = @IBMBIDI@
--- a/configure.in
+++ b/configure.in
@@ -7756,16 +7756,26 @@ dnl ====================================
 dnl = --enable-elf-dynstr-gc
 dnl ========================================================
 MOZ_ARG_ENABLE_BOOL(elf-dynstr-gc,
 [  --enable-elf-dynstr-gc  Enable elf dynstr garbage collector (opt builds only)],
     USE_ELF_DYNSTR_GC=1,
     USE_ELF_DYNSTR_GC= )
 
 dnl ========================================================
+dnl = --disable-elf-hack
+dnl ========================================================
+
+USE_ELF_HACK=1
+MOZ_ARG_DISABLE_BOOL(elf-hack,
+[  --disable-elf-hack      Disable elf hacks],
+    USE_ELF_HACK=,
+    USE_ELF_HACK=1)
+
+dnl ========================================================
 dnl = 
 dnl = Profiling and Instrumenting
 dnl = 
 dnl ========================================================
 MOZ_ARG_HEADER(Profiling and Instrumenting)
 
 dnl ========================================================
 dnl = Enable timeline service, which provides lightweight
@@ -9030,16 +9040,17 @@ AC_SUBST(MOZ_USER_DIR)
 AC_SUBST(MOZ_CRASHREPORTER)
 AC_SUBST(MOZ_UPDATER)
 AC_SUBST(MOZ_ANGLE)
 AC_SUBST(MOZ_DIRECTX_SDK_PATH)
 
 AC_SUBST(ENABLE_STRIP)
 AC_SUBST(PKG_SKIP_STRIP)
 AC_SUBST(USE_ELF_DYNSTR_GC)
+AC_SUBST(USE_ELF_HACK)
 AC_SUBST(INCREMENTAL_LINKER)
 AC_SUBST(MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS)
 AC_SUBST(MOZ_JEMALLOC_STANDALONE_GLUE_LDOPTS)
 AC_SUBST(MOZ_COMPONENT_NSPR_LIBS)
 
 AC_SUBST(MOZ_FIX_LINK_PATHS)
 AC_SUBST(XPCOM_LIBS)
 AC_SUBST(XPCOM_FROZEN_LDOPTS)
--- a/toolkit/mozapps/installer/packager.mk
+++ b/toolkit/mozapps/installer/packager.mk
@@ -536,16 +536,21 @@ else
 	@echo "Linking XPT files..."
 	@rm -rf $(DIST)/xpt
 	@$(NSINSTALL) -D $(DIST)/xpt
 	@($(XPIDL_LINK) $(DIST)/xpt/$(MOZ_PKG_APPNAME).xpt $(DIST)/$(STAGEPATH)$(MOZ_PKG_DIR)/components/*.xpt && rm -f $(DIST)/$(STAGEPATH)$(MOZ_PKG_DIR)/components/*.xpt && cp $(DIST)/xpt/$(MOZ_PKG_APPNAME).xpt $(DIST)/$(STAGEPATH)$(MOZ_PKG_DIR)/components && printf "interfaces $(MOZ_PKG_APPNAME).xpt\n" >$(DIST)/$(STAGEPATH)$(MOZ_PKG_DIR)/components/interfaces.manifest) || echo No *.xpt files found in: $(DIST)/$(STAGEPATH)$(MOZ_PKG_DIR)/components/.  Continuing...
 endif # DMG
 endif # MOZ_PKG_MANIFEST
 endif # UNIVERSAL_BINARY
 	$(OPTIMIZE_JARS_CMD) --optimize $(DIST)/jarlog/ $(DIST)/bin/chrome $(DIST)/$(STAGEPATH)$(MOZ_PKG_DIR)/chrome
+ifeq ($(USE_ELF_HACK)$(HOST_OS_ARCH)$(OS_ARCH)$(OS_TARGET),1LinuxLinuxLinux)
+ifneq (,$(filter %86 x86_64 arm,$(OS_TEST)))
+	cd $(DIST)/$(STAGEPATH)$(MOZ_PKG_DIR); find . -name "*$(DLL_SUFFIX)" | xargs $(DEPTH)/build/unix/elfhack/elfhack
+endif
+endif
 ifndef PKG_SKIP_STRIP
 	@echo "Stripping package directory..."
 	@cd $(DIST)/$(STAGEPATH)$(MOZ_PKG_DIR); find . ! -type d \
 			! -name "*.js" \
 			! -name "*.xpt" \
 			! -name "*.gif" \
 			! -name "*.jpg" \
 			! -name "*.png" \