]> rtime.felk.cvut.cz Git - omk.git/commitdiff
RTEMS rules: provide support to build application with symbols exported.
authorPavel Pisa <pisa@cmp.felk.cvut.cz>
Sat, 5 Sep 2015 09:30:45 +0000 (11:30 +0200)
committerPavel Pisa <pisa@cmp.felk.cvut.cz>
Sat, 5 Sep 2015 09:30:45 +0000 (11:30 +0200)
This allows to use dlopen from application to load plugins
or user applications.

Signed-off-by: Pavel Pisa <pisa@cmp.felk.cvut.cz>
snippets/rtems.omk

index 3bf66c3f3f1771f6bd7609dd80c5edec8ac09dbb..8ba457ca49747104c42f3d9f101ddc1466aa3da1 100644 (file)
@@ -13,6 +13,7 @@
 # xxx_LIBS         .. list of specific target libraries
 # INCLUDES         .. additional include directories and defines for user-space
 # tar_EMBEDFILES   .. list of tars with embedded files
+# xxx_EXPORTSYMBOLS .. if "y" then include symbol table in the application for dlopen functionality
 
 include $(RTEMS_MAKEFILE_PATH)/Makefile.inc
 include $(RTEMS_CUSTOM)
@@ -169,6 +170,8 @@ $(2).c $(2)-stubs.c $(2)-skels.c $(2)-common.c $(2).h: $(1) $$(wildcard $$(first
        $(Q) $$(idl_COMPILE) $$($(2)_IDLFLAGS) $(1)
 endef
 
+RTEMS_SYSM?=rtems-syms
+
 # Syntax: $(call PROGRAM_template,<executable-name>,<dir>,<link-variant>)
 define PROGRAM_template
 USER_IDLS  += $$($(1)_SERVER_IDL) $$($(1)_CLIENT_IDL) $$($(1)_IDL)
@@ -190,14 +193,26 @@ USER_OBJS  += $$($(1)_OBJS)
 USER_SOURCES += $$($(1)_SOURCES)
 USER_EMBEDTARFILES += $$($(1)_EMBEDTARFILES)
 
+$(1)_LDFLAGS += $$(if $$(filter COMPLETE,$$($(1)_EXPORTSYMBOLS)),-Xlinker --whole-archive,)
+
+$(1)_LDCOMMAND += $$(shell if [ -z "$$(filter %.cc,$$($(1)_SOURCES))" ] ; \
+         then echo $$(CC)  $$(CPPFLAGS) $$(OMK_CPPFLAGS) $$(OMK_CFLAGS) $$(CFLAGS) ; \
+         else echo $$(CXX) $$(CPPFLAGS) $$(OMK_CPPFLAGS) $$(OMK_CXXFLAGS) $$(CXXFLAGS) ; fi) \
+         $$($(1)_LDFLAGS) $$(OMK_LDFLAGS) $$(LDFLAGS) $$($(1)_OBJS)
+
 $(2)/$(1): $(USER_LIB_DIR)/timestamp
 $(2)/$(1): $$($(1)_OBJS)
        @$(QUIET_CMD_ECHO) "  LINK    $$@"
-       $(Q) $$(shell if [ -z "$$(filter %.cc,$$($(1)_SOURCES))" ] ; \
-         then echo $$(CC)  $$(CPPFLAGS) $$(OMK_CPPFLAGS) $$(OMK_CFLAGS) $$(CFLAGS) ; \
-         else echo $$(CXX) $$(CPPFLAGS) $$(OMK_CPPFLAGS) $$(OMK_CXXFLAGS) $$(CXXFLAGS) ; fi) \
-         $$(OMK_LDFLAGS) $$(LDFLAGS) $$($(1)_OBJS) $$(LOADLIBES) $$($(1)_LIBS:%=-l%) \
-         -o $(2)/$(1)
+       $(Q) if [ -z "$$($(1)_EXPORTSYMBOLS)" ] ; then \
+         $$($(1)_LDCOMMAND) $$(LOADLIBES) $$($(1)_LIBS:%=-l%) -o $(2)/$(1) || exit 1; \
+       else \
+         rm -f $(1).prelink ; \
+         $$($(1)_LDCOMMAND) $$(LOADLIBES) $$($(1)_LIBS:%=-l%) -o $(1).prelink || exit 1 ; \
+         $(RTEMS_SYSM) -e -c "$$(CC)  $$(CPPFLAGS) $$(OMK_CPPFLAGS) $$(OMK_CFLAGS) $$(CFLAGS)" \
+               -S $(1)-symbol-table.c -o $(1)-symbol-table.o $(1).prelink || exit 1 ; \
+         $$($(1)_LDCOMMAND) $(1)-symbol-table.o $$(LOADLIBES) $$($(1)_LIBS:%=-l%) -o $(2)/$(1) || exit 1 ; \
+       fi
+
 #@echo "$(2)/$(1): \\" >$(USER_OBJS_DIR)/$(1).exe.d
 #@$(SED4OMK) -n -e 's/^LOAD \(.*\)$$$$/  \1  \\/p' $(USER_OBJS_DIR)/$(1).exe.map  >>$(USER_OBJS_DIR)/$(1).exe.d
 #@echo >>$(USER_OBJS_DIR)/$(1).exe.d