Browse Source

add support for glibc initfini.c

Mike Frysinger 18 years ago
parent
commit
fe774e4e70
2 changed files with 53 additions and 4 deletions
  1. 26 4
      Makerules
  2. 27 0
      extra/scripts/defs.awk

+ 26 - 4
Makerules

@@ -196,16 +196,38 @@ $(CRTS): $(top_srcdir)libc/sysdeps/linux/$(TARGET_ARCH)/$(CRT).S
 	$(compile.S)
 	$(Q)$(STRIPTOOL) -x -R .note -R .comment $@
 
+ifeq ($(UCLIBC_CTOR_DTOR),y)
 CTOR_TARGETS=$(top_builddir)lib/crti.o $(top_builddir)lib/crtn.o
+else
+CTOR_TARGETS:=
+endif
 
-ifeq ($(UCLIBC_CTOR_DTOR),y)
-$(CTOR_TARGETS): $(top_builddir)lib/%.o : $(top_srcdir)libc/sysdeps/linux/$(TARGET_ARCH)/%.S
+ifneq ($(wildcard $(top_srcdir)libc/sysdeps/linux/$(TARGET_ARCH)/initfini.c),)
+$(top_builddir)lib/initfini.s: $(top_srcdir)libc/sysdeps/linux/$(TARGET_ARCH)/initfini.c
+	$(compile.c) -S -finhibit-size-directive
+
+$(top_builddir)lib/defs.h: $(top_builddir)lib/initfini.s
+	$(Q)sed -n -e '/@TESTS_BEGIN/,/@TESTS_END/p' $< | \
+		gawk -f $(top_srcdir)extra/scripts/defs.awk > $@.tmp
+	$(Q)mv $@.tmp $@
+
+$(top_builddir)lib/crti.S: $(top_builddir)lib/initfini.s $(top_builddir)lib/defs.h
+	$(Q)sed -n -e '1,/@HEADER_ENDS/p' \
+	       -e '/@_.*_PROLOG_BEGINS/,/@_.*_PROLOG_ENDS/p' \
+	       -e '/@TRAILER_BEGINS/,$$p' $< > $@
+
+$(top_builddir)lib/crtn.S: $(top_builddir)lib/initfini.s
+	$(Q)sed -n -e '1,/@HEADER_ENDS/p' \
+	       -e '/@_.*_EPILOG_BEGINS/,/@_.*_EPILOG_ENDS/p' \
+	       -e '/@TRAILER_BEGINS/,$$p' $< > $@
+
+$(CTOR_TARGETS): $(top_builddir)lib/%.o : $(top_builddir)lib/%.S
 	$(Q)$(INSTALL) -d $(dir $@)
 	$(compile.S) $(PICFLAG) $(SSP_DISABLE_FLAGS)
 else
-$(CTOR_TARGETS):
+$(CTOR_TARGETS): $(top_builddir)lib/%.o : $(top_srcdir)libc/sysdeps/linux/$(TARGET_ARCH)/%.S
 	$(Q)$(INSTALL) -d $(dir $@)
-	$(do_ar)
+	$(compile.S) $(PICFLAG) $(SSP_DISABLE_FLAGS)
 endif
 
 #ifeq ($(TARGET_ARCH),nios)

+ 27 - 0
extra/scripts/defs.awk

@@ -0,0 +1,27 @@
+/^[ 	]*\.endp/	 { need_endp = 1 }
+/^[ 	]*\.end/	 { need_end = 1 }
+/^[ 	]*\.align/ { if($2 > max) max = $2; }
+
+END {
+    if(need_endp)
+    {
+	print "#define END_INIT .endp _init";
+	print "#define END_FINI .endp _fini";
+    } else if(need_end)
+    {
+	print "#define END_INIT .end _init";
+	print "#define END_FINI .end _fini";
+    }
+    else
+    {
+	print "#define END_INIT";
+	print "#define END_FINI";
+    }
+    if(max)
+	print "#define ALIGN .align", max;
+    else
+	print "#define ALIGN";
+
+    print "#include <libc-symbols.h>";
+    print "weak_extern (__gmon_start__)";
+}