Module: xenomai-gch
Branch: for-2.4
Commit: 8f5330c9da75f5fdedee5b7cf60e525ee5845300
URL:    
http://git.xenomai.org/?p=xenomai-gch.git;a=commit;h=8f5330c9da75f5fdedee5b7cf60e525ee5845300

Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org>
Date:   Sun Sep 20 23:09:39 2009 +0200

build: provide front-end script to link static POSIX apps

An unfortunate side-effect of using ld's --wrap magic for shadowing
libpthread symbols by Xenomai's POSIX skin calls, is that we end up
wrapping libpthread's own symbols as well, in case of static linking.

This patch introduces the wrap-link.sh script, which reshuffles a
linker invocation, in order to split it in two separate stages. First,
the wrappable bits are combined into a single relocatable object,
then, the latter object is linked against libpthread without
performing any wrapping.

Typically, invoking:

$ wrap-link.sh gcc -o foo foo.o -Wl,@/usr/xenomai/lib/posix.wrappers 
-L/usr/xenomai/lib -lpthread_rt -lpthread -lrt

will produce:

stage1: gcc -o foo.tmp -Wl,-r -nostdlib tmp foo.o 
-Wl,@/usr/xenomai/lib/posix.wrappers -L/usr/xenomai/lib
stage2: gcc -o foo foo.tmp -lpthread_rt -lpthread -lrt

This means that symbol wrapping will only occur during stage1 of the
linking process, thus preventing spurious wrapping of libpthread
symbols in stage2.

Makefiles used in building applications which depend on the POSIX skin
have been updated in order to use that front-end.

NOTE: this commit clears the previous restriction imposed on the
recent Xenomai/nios2 port regarding POSIX app generation.

---

 scripts/wrap-link.sh                 |  174 ++++++++++++++++++++++++++++++++++
 src/testsuite/clocktest/Makefile.am  |    2 +
 src/testsuite/clocktest/Makefile.in  |    2 +-
 src/testsuite/cyclic/Makefile.am     |    2 +
 src/testsuite/cyclic/Makefile.in     |    2 +-
 src/testsuite/irqbench/Makefile.am   |    2 +
 src/testsuite/irqbench/Makefile.in   |    2 +-
 src/testsuite/switchtest/Makefile.am |    2 +
 src/testsuite/switchtest/Makefile.in |    2 +-
 9 files changed, 186 insertions(+), 4 deletions(-)

diff --git a/scripts/wrap-link.sh b/scripts/wrap-link.sh
new file mode 100755
index 0000000..3d5aaca
--- /dev/null
+++ b/scripts/wrap-link.sh
@@ -0,0 +1,174 @@
+#! /bin/sh
+# Split link-edit into two stage for linking static applications with
+# Xenomai user-space posix skin.
+
+set -e
+
+usage() {
+    cat <<EOF
+$progname [options] command-line
+
+Split command-line in two parts for linking static applications with
+Xenomai user-space posix skin in two stages.
+
+Options:
+-q be quiet
+-v be verbose (print each command before running it)
+
+Example:
+$progname -v gcc -o foo foo.o -Wl,@/usr/xenomai/lib/posix.wrappers 
-L/usr/xenomai/lib -lpthread_rt -lpthread -lrt
+will print and run:
++ gcc -o foo.tmp -Wl,-r -nostdlib tmp foo.o 
-Wl,@/usr/xenomai/lib/posix.wrappers -L/usr/xenomai/lib
++ gcc -o foo foo.tmp -lpthread_rt -lpthread -lrt
++ rm foo.tmp
+EOF
+}
+
+add_linker_flag() {
+    if $next_is_wrapped_symbol; then
+       stage1_args="$stage1_args -Wl,--wrap $@"
+       next_is_wrapped_symbol=false
+    else
+       stage1_args="$stage1_args $@"
+       stage2_args="$stage2_args $@"
+    fi
+}
+
+add_linker_obj() {
+    if $stage2; then
+       stage2_args="$stage2_args $@"
+    else
+       stage1_args="$stage1_args $@"
+    fi
+}
+
+if test -n "$V" && test $V -gt 0; then
+    verbose=:
+else
+    verbose=false
+fi
+progname=$0
+
+if test $# -eq 0; then
+    usage
+    exit 0
+fi
+
+while test $# -gt 0; do
+    arg="$1"
+    shift
+    case "$arg" in
+       "")
+           usage
+           exit 0
+           ;;
+
+       -v) 
+           verbose=:
+           ;;
+
+       -q) 
+           verbose=false
+           ;;
+
+       -*)
+           cc="$cc $arg"
+           ;;
+
+       *gcc*|*g++*)
+           cc="$cc $arg"
+           break
+           ;;
+
+       *ld)
+           usage
+           /bin/echo -e "\nlinker must be gcc or g++, not ld"
+           exit 1
+           ;;
+
+       *)
+           cc="$cc $arg"
+           ;;
+    esac
+done
+
+next_is_wrapped_symbol=false
+stage1_args=""
+stage2_args=""
+stage2=false
+while test $# -gt 0; do
+    arg="$1"
+    shift
+    case "$arg" in
+       *pthread_rt*|-lpthread)
+           stage2_args="$stage2_args $arg"
+           stage2=:
+           ;;
+
+       -Xlinker)
+           arg="$1"
+           shift
+           case "$arg" in
+               --wrap)
+                   next_is_wrapped_symbol=:
+                   ;;
+               @*posix.wrappers)
+                   stage1_args="$stage1_args -Xlinker $arg"
+                   ;;
+
+               *) 
+                   add_linker_flag -Xlinker "$arg"
+                   ;;
+           esac
+           ;;
+
+       -Wl,--wrap)
+           next_is_wrapped_symbol=:
+           ;;
+
+       -Wl,@*posix.wrappers|-Wl,--wrap,*)
+           stage1_args="$stage1_args $arg"
+           ;;
+
+       -Wl,*)
+           add_linker_flag "$arg"
+           ;;
+
+       -o)
+           output="$1"
+           shift
+           ;;
+
+       -o*)
+           output=`expr $arg : '-o\(.*\)'`
+           ;;
+       
+       -l) 
+           arg="$1"
+           shift
+           add_linker_obj -l $arg
+           ;;
+
+       -l*) #a library
+           add_linker_obj $arg
+           ;;
+
+       *.so)
+           stage2_args="$stage2_args $arg"
+           ;;
+
+       *) 
+           if test -e "$arg"; then
+               add_linker_obj $arg
+           else
+               stage1_args="$stage1_args $arg"
+               stage2_args="$stage2_args $arg"
+           fi
+          ;;
+    esac
+done
+
+$verbose && set -x
+$cc -o "$output.tmp" -Wl,-Ur -nostdlib $stage1_args
+$cc -o "$output" "$output.tmp" $stage2_args
+rm -f $output.tmp
diff --git a/src/testsuite/clocktest/Makefile.am 
b/src/testsuite/clocktest/Makefile.am
index 35e0386..69d10b0 100644
--- a/src/testsuite/clocktest/Makefile.am
+++ b/src/testsuite/clocktest/Makefile.am
@@ -1,5 +1,7 @@
 testdir = $(exec_prefix)/share/xenomai/testsuite/clocktest
 
+CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC)
+
 bin_PROGRAMS = clocktest
 
 clocktest_SOURCES = clocktest.c
diff --git a/src/testsuite/clocktest/Makefile.in 
b/src/testsuite/clocktest/Makefile.in
index 91aac8b..5590d89 100644
--- a/src/testsuite/clocktest/Makefile.in
+++ b/src/testsuite/clocktest/Makefile.in
@@ -70,7 +70,6 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) \
 LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
        --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
        $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
 LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
        --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
        $(LDFLAGS) -o $@
@@ -237,6 +236,7 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 testdir = $(exec_prefix)/share/xenomai/testsuite/clocktest
+CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC)
 clocktest_SOURCES = clocktest.c
 clocktest_CPPFLAGS = -I$(top_srcdir)/include/posix $(XENO_USER_CFLAGS) 
-I$(top_srcdir)/include
 clocktest_LDFLAGS = $(XENO_POSIX_WRAPPERS) $(XENO_USER_LDFLAGS)
diff --git a/src/testsuite/cyclic/Makefile.am b/src/testsuite/cyclic/Makefile.am
index d3491bc..2ee19de 100644
--- a/src/testsuite/cyclic/Makefile.am
+++ b/src/testsuite/cyclic/Makefile.am
@@ -1,5 +1,7 @@
 testdir = $(exec_prefix)/share/xenomai/testsuite/cyclic
 
+CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC)
+
 bin_PROGRAMS = cyclictest
 
 cyclictest_SOURCES = cyclictest.c
diff --git a/src/testsuite/cyclic/Makefile.in b/src/testsuite/cyclic/Makefile.in
index 766544e..56eb6ba 100644
--- a/src/testsuite/cyclic/Makefile.in
+++ b/src/testsuite/cyclic/Makefile.in
@@ -70,7 +70,6 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) \
 LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
        --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
        $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
 LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
        --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
        $(LDFLAGS) -o $@
@@ -237,6 +236,7 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 testdir = $(exec_prefix)/share/xenomai/testsuite/cyclic
+CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC)
 cyclictest_SOURCES = cyclictest.c
 cyclictest_CPPFLAGS = -I$(top_srcdir)/include/posix $(XENO_USER_CFLAGS) 
-DIPIPE_TRACE=1 -I$(top_srcdir)/include
 cyclictest_LDFLAGS = $(XENO_POSIX_WRAPPERS) $(XENO_USER_LDFLAGS)
diff --git a/src/testsuite/irqbench/Makefile.am 
b/src/testsuite/irqbench/Makefile.am
index 4a2a94a..29fb308 100644
--- a/src/testsuite/irqbench/Makefile.am
+++ b/src/testsuite/irqbench/Makefile.am
@@ -1,5 +1,7 @@
 testdir = $(exec_prefix)/share/xenomai/testsuite/irqbench
 
+CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC)
+
 bin_PROGRAMS = irqloop
 
 if XENO_LINUX_ARCH_I386
diff --git a/src/testsuite/irqbench/Makefile.in 
b/src/testsuite/irqbench/Makefile.in
index d9320a1..3765d51 100644
--- a/src/testsuite/irqbench/Makefile.in
+++ b/src/testsuite/irqbench/Makefile.in
@@ -78,7 +78,6 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) \
 LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
        --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
        $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
 LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
        --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
        $(LDFLAGS) -o $@
@@ -245,6 +244,7 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 testdir = $(exec_prefix)/share/xenomai/testsuite/irqbench
+CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC)
 irqloop_SOURCES = irqloop.c
 irqloop_CPPFLAGS = \
        -I$(top_srcdir)/include/posix \
diff --git a/src/testsuite/switchtest/Makefile.am 
b/src/testsuite/switchtest/Makefile.am
index 5fdf63a..1117585 100644
--- a/src/testsuite/switchtest/Makefile.am
+++ b/src/testsuite/switchtest/Makefile.am
@@ -1,5 +1,7 @@
 testdir = $(exec_prefix)/share/xenomai/testsuite/switchtest
 
+CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC)
+
 bin_PROGRAMS = switchtest
 
 switchtest_SOURCES = switchtest.c
diff --git a/src/testsuite/switchtest/Makefile.in 
b/src/testsuite/switchtest/Makefile.in
index ddb3e0e..e09731c 100644
--- a/src/testsuite/switchtest/Makefile.in
+++ b/src/testsuite/switchtest/Makefile.in
@@ -70,7 +70,6 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) \
 LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
        --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
        $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
 LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
        --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
        $(LDFLAGS) -o $@
@@ -237,6 +236,7 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 testdir = $(exec_prefix)/share/xenomai/testsuite/switchtest
+CCLD = $(top_srcdir)/scripts/wrap-link.sh $(CC)
 switchtest_SOURCES = switchtest.c
 switchtest_CPPFLAGS = -I$(top_srcdir)/include/posix $(XENO_USER_CFLAGS) -g 
-I$(top_srcdir)/include
 switchtest_LDFLAGS = $(XENO_POSIX_WRAPPERS) $(XENO_USER_LDFLAGS)


_______________________________________________
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git

Reply via email to