1#include <dlfcn.h>
2#include <iostream>
3
4#define SO_CLOSE_RECURSIVE "libdlclose_recursive.so"
5
6extern "C" {
7int Add(int a, int b)
8{
9    return a + b;
10}
11}
12
13class BarIns {
14public:
15	BarIns()
16	{
17            handle = dlopen(SO_CLOSE_RECURSIVE, RTLD_LOCAL);
18            if (!handle)
19            {
20                std::cerr << "dlopen(name=" << SO_CLOSE_RECURSIVE \
21                    << ",mode=" << RTLD_LOCAL \
22                    << ",failed: " << dlerror() << std::endl;
23            }
24            std::cerr << "open: " << SO_CLOSE_RECURSIVE << " successfully" << std::endl;
25	}
26
27        ~BarIns()
28        {
29	    if (handle != nullptr)
30	    {
31                dlclose(handle);
32            }
33            std::cerr << "close: " << SO_CLOSE_RECURSIVE << " successfully" << std::endl;
34	}
35
36	static BarIns& GetInstance()
37	{
38		return bi;
39	}
40
41private:
42	static BarIns bi;
43	void *handle {nullptr};
44};
45
46BarIns BarIns::bi;
47