aboutsummaryrefslogtreecommitdiff
path: root/backends
diff options
context:
space:
mode:
authorMarcus Comstedt2016-09-26 15:16:41 +0200
committerMarcus Comstedt2016-09-27 13:06:15 +0200
commit4aacc41fff5f96b3e318e99d036796424dadff7f (patch)
tree3d2adc020cc550f1f8a2cfe30f79bd2b26cd4de5 /backends
parent9c235b3d6e543ab880c0d506d8cf6cfe2871051b (diff)
downloadscummvm-rg350-4aacc41fff5f96b3e318e99d036796424dadff7f.tar.gz
scummvm-rg350-4aacc41fff5f96b3e318e99d036796424dadff7f.tar.bz2
scummvm-rg350-4aacc41fff5f96b3e318e99d036796424dadff7f.zip
DC: Implement atexit handling for plugins
Diffstat (limited to 'backends')
-rw-r--r--backends/platform/dc/dcloader.cpp7
-rw-r--r--backends/platform/dc/dcloader.h2
-rw-r--r--backends/platform/dc/plugin.syms1
-rw-r--r--backends/platform/dc/plugin.x1
4 files changed, 10 insertions, 1 deletions
diff --git a/backends/platform/dc/dcloader.cpp b/backends/platform/dc/dcloader.cpp
index bc5e3a733b..2627773b13 100644
--- a/backends/platform/dc/dcloader.cpp
+++ b/backends/platform/dc/dcloader.cpp
@@ -26,6 +26,8 @@
#include "dcloader.h"
+#include <cxxabi.h>
+
#ifdef DL_DEBUG
#define DBG(x) reportf x
#else
@@ -345,6 +347,7 @@ bool DLObject::open(const char *path)
ctors_end = symbol("__plugin_ctors_end");
dtors_start = symbol("__plugin_dtors");
dtors_end = symbol("__plugin_dtors_end");
+ dso_handle = symbol("__dso_handle");
if (ctors_start == NULL || ctors_end == NULL || dtors_start == NULL ||
dtors_end == NULL) {
@@ -364,6 +367,10 @@ bool DLObject::open(const char *path)
bool DLObject::close()
{
+ if (dso_handle != NULL) {
+ __cxxabiv1::__cxa_finalize(dso_handle);
+ dso_handle = NULL;
+ }
if (dtors_start != NULL && dtors_end != NULL)
for (void (**f)(void) = (void (**)(void))dtors_start; f != dtors_end; f++)
(**f)();
diff --git a/backends/platform/dc/dcloader.h b/backends/platform/dc/dcloader.h
index 074ae7aa29..daa2802ec4 100644
--- a/backends/platform/dc/dcloader.h
+++ b/backends/platform/dc/dcloader.h
@@ -34,7 +34,7 @@ class DLObject {
void *segment, *symtab;
char *strtab;
int symbol_cnt;
- void *dtors_start, *dtors_end;
+ void *dtors_start, *dtors_end, *dso_handle;
void seterror(const char *fmt, ...);
void unload();
diff --git a/backends/platform/dc/plugin.syms b/backends/platform/dc/plugin.syms
index 2cab08c9c7..9340ca20b8 100644
--- a/backends/platform/dc/plugin.syms
+++ b/backends/platform/dc/plugin.syms
@@ -6,3 +6,4 @@ ___plugin_ctors
___plugin_ctors_end
___plugin_dtors
___plugin_dtors_end
+___dso_handle
diff --git a/backends/platform/dc/plugin.x b/backends/platform/dc/plugin.x
index 2c8469a335..039fca81cf 100644
--- a/backends/platform/dc/plugin.x
+++ b/backends/platform/dc/plugin.x
@@ -9,6 +9,7 @@ SECTIONS
. = 0;
.text :
{
+ ___dso_handle = .;
*(.text .stub .text.* .gnu.linkonce.t.*)
*(.gnu.warning)
} :plugin =0