diff options
-rw-r--r-- | Makerules | 30 | ||||
-rw-r--r-- | extra/scripts/defs.awk | 27 |
2 files changed, 53 insertions, 4 deletions
@@ -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) diff --git a/extra/scripts/defs.awk b/extra/scripts/defs.awk new file mode 100644 index 000000000..7ca5a3364 --- /dev/null +++ b/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__)"; +} |