All apps now must link against parlib (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 13 Mar 2012 21:21:29 +0000 (14:21 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 13 Mar 2012 21:21:29 +0000 (14:21 -0700)
Glibc calls out to a low-level parlib function (vcore_event_init(), used
to enable event delivery of *all* processes) that needs to be linked in
to every binary, regardless of whether or not the process will be an
MCP.

In addition to linking against parlib, applications need to be built
with " -u force_parlib_symbols ", which forces the linker to find the
strong version of symbols weakly used in glibc's start.c.

All test code has these flags/libraries set, but external apps need it
too.  Busybox, in particular, needs the patch in tools/patches to force
linking with parlib.

Rebuild your cross compiler, and install-libs (esp before rebuilding
busybox).  At a minimum, you need to copy start.c to the glibc-2.14.1/
tree and rebuild.  If that doesn't make sense, then just do a full
rebuild of glibc.

Documentation/glibc.txt
tests/Makefrag
tools/compilers/gcc-glibc/glibc-2.14.1-ros/sysdeps/ros/start.c
tools/patches/busybox-1.17.3-parlib.patch [new file with mode: 0644]
user/parlib/include/vcore.h
user/parlib/vcore.c

index ee2a2a8..789e54c 100644 (file)
@@ -21,9 +21,14 @@ How to recompile glibc
 Normally, make x86 (or whatever) works fairly well.  However, sometimes you
 need to rebuild all of glibc.  This might be on a hunch, or to get rid of
 things that might have compiled, but are failing to link and don't seem to
-rebuild.
+rebuild.  This happens when you change parts of glibc.
 
-In this event, the next step is to remove the build directories
+If you know what file(s) you changed and it doesn't seem like the changes are
+being applied, you can copy the file from the -ros directory to the glibc-XXX
+directory.  The glibc make process doesn't apply diffs or track the changes
+from -ros to the glibc directory, so your recompile won't notice the changes.
+
+If things are stil messed up, the next step is to remove the build directories
 (i686-ros-glibc-*) and also the hidden files (.i686-ros-glibc*).  If you get
 errors from make very early on about not finding some targets (such as
 install-headers), you forgot to delete the hidden files.
index de021c6..ed62bba 100644 (file)
@@ -2,7 +2,7 @@ TESTS_DIR = tests
 
 OBJDIRS += $(TESTS_DIR)
 
-TESTS_CFLAGS += $(USER_CFLAGS) -g
+TESTS_CFLAGS += $(USER_CFLAGS) -g -u force_parlib_symbols
 
 ALL_TEST_FILES = $(shell ls $(TESTS_DIR)/*.c)
 
index 6ede374..ead6692 100644 (file)
@@ -26,6 +26,13 @@ void __vcore_entry(void)
 }
 weak_alias(__vcore_entry, vcore_entry)
 
+void __vcore_event_init(void)
+{
+       fputs("Build your application with -lparlib\n", stderr);
+       abort();
+}
+weak_alias(__vcore_event_init, vcore_event_init)
+
 #define failmsg(str) write(2,str"\n",sizeof(str"\n")-1)
 
 void
@@ -87,6 +94,7 @@ _start(void)
        extern char** _environ;
        _environ = argv+argc+1;
 
+       vcore_event_init();
        __libc_start_main(&main,argc,argv,&__libc_csu_init,&__libc_csu_fini,0,0);
 
        failmsg("why did main() return?");
diff --git a/tools/patches/busybox-1.17.3-parlib.patch b/tools/patches/busybox-1.17.3-parlib.patch
new file mode 100644 (file)
index 0000000..db5ecd3
--- /dev/null
@@ -0,0 +1,33 @@
+--- busybox-1.17.3/Makefile.orig       2012-03-13 13:50:26.000000000 -0700
++++ busybox-1.17.3/Makefile    2012-03-13 13:28:51.000000000 -0700
+@@ -315,13 +315,13 @@
+ # Use LINUXINCLUDE when you must reference the include/ directory.
+ # Needed to be compatible with the O= option
+-CFLAGS                := $(CFLAGS)
++CFLAGS                := $(CFLAGS) -u force_parlib_symbols
+ # Added only to final link stage of busybox binary
+ CFLAGS_busybox        := $(CFLAGS_busybox)
+ CPPFLAGS      := $(CPPFLAGS)
+ AFLAGS                := $(AFLAGS)
+ LDFLAGS               := $(LDFLAGS)
+-LDLIBS                :=
++LDLIBS                := parlib
+ # Read KERNELRELEASE from .kernelrelease (if it exists)
+ KERNELRELEASE = $(shell cat .kernelrelease 2> /dev/null)
+--- busybox-1.17.3/scripts/trylink.orig        2012-03-13 13:50:53.000000000 -0700
++++ busybox-1.17.3/scripts/trylink     2012-03-13 13:32:33.000000000 -0700
+@@ -144,6 +144,12 @@
+       l_list=`echo "$without_one" | sed -e 's/ / -l/g' -e 's/^/-l/' -e 's/^-l$//'`
+       test x"$l_list" != x"" && l_list="$START_GROUP $l_list $END_GROUP"
+       $debug && echo "Trying -l options: '$l_list'"
++      # brho: put in this if block to make sure they build parlib
++      if [ "$one" = "parlib" ]; then
++              echo " Forcing link with parlib"
++              last_needed=true
++              continue
++      fi
+       try $CC $CFLAGS $LDFLAGS \
+               -o $EXE \
+               $SORT_COMMON \
index a05ecc7..bc0f011 100644 (file)
@@ -52,6 +52,7 @@ static inline struct preempt_data *vcpd_of(uint32_t vcoreid);
 static inline bool preempt_is_pending(uint32_t vcoreid);
 static inline bool __preempt_is_pending(uint32_t vcoreid);
 int vcore_init(void);
+void vcore_event_init(void);
 void vcore_change_to_m(void);
 int vcore_request(long nr_new_vcores);
 void vcore_yield(bool preempt_pending);
index 644d43f..924acc3 100644 (file)
@@ -163,6 +163,25 @@ vcore_init_fail:
        return -1;
 }
 
+/* this, plus tricking gcc into thinking this is -u (undefined), AND including
+ * the event_init in it, causes the linker to need to check parlib.a and see the
+ * strong symbol... */
+void force_parlib_symbols(void)
+{
+       vcore_event_init();
+       assert(0);
+}
+
+/* This gets called in glibc before calling the programs 'main'.  Need to set
+ * ourselves up so that thread0 is a uthread, and then register basic signals to
+ * go to vcore 0. */
+void vcore_event_init(void)
+{
+       /* set up our thread0 as a uthread */
+       uthread_slim_init();
+       /* TODO: actually register for event handlers and whatnot */
+}
+
 /* Helper, picks some sane defaults and changes the process into an MCP */
 void vcore_change_to_m(void)
 {