This is an automated email from the ASF dual-hosted git repository.
acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
The following commit(s) were added to refs/heads/master by this push:
new 72eaed8fd Add loading of ET_DYN shared object test to sotest
72eaed8fd is described below
commit 72eaed8fddde32c8d1de6bb4d980750d5ddcbb3f
Author: Neale Ferguson <[email protected]>
AuthorDate: Mon Sep 4 10:56:04 2023 +1000
Add loading of ET_DYN shared object test to sotest
* examples/sotest/lib/Makefile
- Add dynload directory to build
* examples/sotest/lib/dynload/Makefile
- Build the dynload shared object test
- Use SHMODULEFLAGS and not SHLDFLAGS
* examples/sotest/lib/dynload/dynload.c
- Test case for loading of ET_DYN shared objects
* examples/sotest/lib/dynload/.gitignore
- Exclude built object from git
* examples/sotest/sotest_main.c
- Load and invoke the dynload test
---
examples/sotest/lib/Makefile | 4 +--
examples/sotest/lib/dynload/.gitignore | 1 +
examples/sotest/lib/dynload/Makefile | 55 ++++++++++++++++++++++++++++++++++
examples/sotest/lib/dynload/dynload.c | 51 +++++++++++++++++++++++++++++++
examples/sotest/sotest_main.c | 34 +++++++++++++++++++++
5 files changed, 143 insertions(+), 2 deletions(-)
diff --git a/examples/sotest/lib/Makefile b/examples/sotest/lib/Makefile
index 734944203..67644c9d9 100644
--- a/examples/sotest/lib/Makefile
+++ b/examples/sotest/lib/Makefile
@@ -24,8 +24,8 @@ ALL_SUBDIRS = sotest
BUILD_SUBDIRS = sotest
ifneq ($(CONFIG_MODLIB_MAXDEPEND),0)
-ALL_SUBDIRS += modprint
-BUILD_SUBDIRS += modprint
+ALL_SUBDIRS += modprint dynload
+BUILD_SUBDIRS += modprint dynload
endif
SOTEST_DIR = $(APPDIR)/examples/sotest
diff --git a/examples/sotest/lib/dynload/.gitignore
b/examples/sotest/lib/dynload/.gitignore
new file mode 100644
index 000000000..8b560f106
--- /dev/null
+++ b/examples/sotest/lib/dynload/.gitignore
@@ -0,0 +1 @@
+/dynload
diff --git a/examples/sotest/lib/dynload/Makefile
b/examples/sotest/lib/dynload/Makefile
new file mode 100644
index 000000000..65ce0fced
--- /dev/null
+++ b/examples/sotest/lib/dynload/Makefile
@@ -0,0 +1,55 @@
+############################################################################
+# apps/examples/sotest/lib/dynload/Makefile
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership. The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+############################################################################
+
+include $(APPDIR)/Make.defs
+
+ifeq ($(CONFIG_EXAMPLES_SOTEST_LIBC),y)
+LDLIBPATH += -L $(NUTTXLIB)
+endif
+
+ifeq ($(CONFIG_EXAMPLES_SOTEST_LIBC),y)
+LDLIBS += -lc
+endif
+
+BIN = dynload
+
+SRCS = $(BIN).c
+OBJS = $(SRCS:.c=$(OBJEXT))
+
+all: $(BIN)
+.PHONY: all clean install
+
+$(OBJS): %$(OBJEXT): %.c
+ @echo "MODULECC: $<"
+ $(Q) $(MODULECC) -c $(CMODULEFLAGS) $(SHCCFLAGS) $< -o $@
+
+$(BIN): $(OBJS)
+ @echo "MODULELD: $<"
+ $(Q) $(MODULELD) $(SHMODULEFLAGS) $(LDLIBPATH) -o $@ $^ $(LDLIBS)
+
+$(FSROOT_DIR)/$(BIN): $(BIN)
+ $(Q) mkdir -p $(FSROOT_DIR)
+ $(Q) install $(BIN) $(FSROOT_DIR)/$(BIN)
+
+install: $(FSROOT_DIR)/$(BIN)
+
+clean:
+ $(call DELFILE, $(BIN))
+ $(call CLEAN)
diff --git a/examples/sotest/lib/dynload/dynload.c
b/examples/sotest/lib/dynload/dynload.c
new file mode 100644
index 000000000..25255cba9
--- /dev/null
+++ b/examples/sotest/lib/dynload/dynload.c
@@ -0,0 +1,51 @@
+/****************************************************************************
+ * apps/examples/sotest/lib/dynload/dynload.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+#include <nuttx/symtab.h>
+#include <nuttx/lib/modlib.h>
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+int dynload(int);
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: dynload
+ ****************************************************************************/
+
+int dynload(int a)
+{
+ return a + 10;
+}
diff --git a/examples/sotest/sotest_main.c b/examples/sotest/sotest_main.c
index 5c1568e59..8bd61776a 100644
--- a/examples/sotest/sotest_main.c
+++ b/examples/sotest/sotest_main.c
@@ -105,6 +105,7 @@ int main(int argc, FAR char *argv[])
char devname[32];
#if CONFIG_MODLIB_MAXDEPEND > 0
FAR void *handle1;
+ FAR void *handle3;
#endif
FAR void *handle2;
CODE void (*testfunc)(FAR const char *msg);
@@ -170,6 +171,32 @@ int main(int argc, FAR char *argv[])
fprintf(stderr, "ERROR: dlopen(/modprint) failed\n");
exit(EXIT_FAILURE);
}
+
+ handle3 = dlopen(BINDIR "/dynload", RTLD_NOW | RTLD_LOCAL);
+ if (handle3 == NULL)
+ {
+ fprintf(stderr, "ERROR: dlopen(/dynload) failed - %s\n",
+ strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+ else
+ {
+ int (*dynload)(int);
+ dynload = dlsym(handle3, "dynload");
+ if (dynload != NULL)
+ {
+ int a = dynload(32);
+ printf("dynload returned %d which is the %s answer\n",
+ a, (a == 42 ? "correct" : "incorrect"));
+ }
+ else
+ {
+ fprintf(stderr, "ERROR: dlsym(dynload) failed - %s\n",
+ strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+ }
+
#endif
/* Install the second test shared library */
@@ -273,6 +300,13 @@ int main(int argc, FAR char *argv[])
fprintf(stderr, "ERROR: dlclose(handle1) failed: %d\n", ret);
exit(EXIT_FAILURE);
}
+
+ ret = dlclose(handle3);
+ if (ret < 0)
+ {
+ fprintf(stderr, "ERROR: dlclose(handle3) failed: %d\n", ret);
+ exit(EXIT_FAILURE);
+ }
#endif
#ifdef CONFIG_EXAMPLES_SOTEST_BUILTINFS