There still something off with this. When I run './scrips/build -j4 check' the very 1st time (no dl_tests module yet) it fails like that:
if cd /home/wkozaczuk/projects/osv/modules/dl_tests/bionic; then \ git pull; \ else \ git clone --depth=1 https://android.googlesource.com/platform/bionic /home/wkozaczuk/projects/osv/modules/dl_tests/bionic; \ fi make: *** No rule to make target '/home/wkozaczuk/projects/osv/modules/dl_tests/bionic/tests/libs/dlopen_testlib_simple.cpp', needed by '/home/wkozaczuk/projects/osv/build/release.x64/dl_tests/libtest_simple.so'. Stop. make: *** Waiting for unfinished jobs.... /bin/sh: 1: cd: can't cd to /home/wkozaczuk/projects/osv/modules/dl_tests/bionic Cloning into '/home/wkozaczuk/projects/osv/modules/dl_tests/bionic'... remote: Counting objects: 3564, done remote: Finding sources: 100% (3564/3564) remote: Total 3564 (delta 653), reused 1927 (delta 653) Receiving objects: 100% (3564/3564), 5.20 MiB | 2.68 MiB/s, done. Resolving deltas: 100% (653/653), done. Traceback (most recent call last): File "scripts/module.py", line 281, in <module> args.func(args) File "scripts/module.py", line 234, in build make_modules(modules, args) File "scripts/module.py", line 124, in make_modules raise Exception('make failed for ' + module.name) Exception: make failed for dl_tests ./scripts/build failed: ( for i in "${args[@]}"; do case $i in *=*) export "$i" ;; esac; done; export fs_type jdkbase mode OSV_BUILD_PATH; export ARCH=$arch OSV_BASE=$SRC; scripts/module.py $j_arg build -c "$modules" $usrskel_arg $no_required_arg ) But when I run the same command after again it succeeds. Not sure why. Something needs to be tweaked in the Makefile. Also, I see these 2 warnings: CXX tests/tst-dlfcn.cc /home/wkozaczuk/projects/osv/tests/tst-dlfcn.cc: In member function ‘void test_dlsym_from_sofile::test_method()’: /home/wkozaczuk/projects/osv/tests/tst-dlfcn.cc:94:11: warning: unused variable ‘symbol’ [-Wunused-variable] 94 | void* symbol = dlsym(RTLD_DEFAULT, "test_dlsym_symbol"); | ^~~~~~ /home/wkozaczuk/projects/osv/tests/tst-dlfcn.cc: In member function ‘void test_dlsym_from_sofile_with_preload::test_method()’: /home/wkozaczuk/projects/osv/tests/tst-dlfcn.cc:151:11: warning: unused variable ‘symbol’ [-Wunused-variable] 151 | void* symbol = dlsym(RTLD_DEFAULT, "test_dlsym_symbol"); | ^~~~~~ LD tests/tst-dlfcn.so I know they are temporary until we apply other but still. We recently spent some good effort to get rid of all compiler warnings. Waldek On Tuesday, January 7, 2020 at 3:15:49 AM UTC-5, Zhiting Zhu wrote: > > This patch includes a module called dl_tests which clones the bionic > and compile the needed library files. > > Signed-off-by: Zhiting Zhu <zhit...@cs.utexas.edu <javascript:>> > --- > .gitignore | 2 + > modules/dl_tests/Makefile | 112 ++++++++++++++++++ > modules/tests/Makefile | 2 + > modules/tests/module.py | 1 + > tests/tst-dlfcn.cc | 243 ++++++++++++++++++++++++++++++++++++++ > 5 files changed, 360 insertions(+) > create mode 100644 modules/dl_tests/Makefile > > diff --git a/.gitignore b/.gitignore > index e0a76dc2..2dcb3225 100644 > --- a/.gitignore > +++ b/.gitignore > @@ -46,4 +46,6 @@ modules/httpserver-jvm-plugin/obj/ > modules/libtools/*.so > modules/libtools/*.o > modules/libyaml/usr.manifest > +modules/dl_tests/bionic/ > +modules/dl_tests/usr.manifest > .idea > diff --git a/modules/dl_tests/Makefile b/modules/dl_tests/Makefile > new file mode 100644 > index 00000000..da48e15c > --- /dev/null > +++ b/modules/dl_tests/Makefile > @@ -0,0 +1,112 @@ > +module: usr.manifest build_all > + > +src := $(OSV_BASE) > +out := $(OSV_BUILD_PATH) > +arch := $(ARCH) > +fs_type := $(fs_type) > +bionic_test_libs := $(src)/modules/dl_tests/bionic/tests/libs > + > +quiet = $(if $V, $1, @echo " $2"; $1) > +very-quiet = $(if $V, $1, @$1) > +makedir = $(call very-quiet, mkdir -p $(dir $@)) > + > +autodepend = -MD -MT $@ -MP > + > +INCLUDES = -I$(src)/arch/$(ARCH) -I$(src) -I$(src)/include \ > + -I$(src)/arch/common -isystem $(src)/include/glibc-compat \ > + $(shell $(CXX) -E -xc++ - -v </dev/null 2>&1 | awk '/^End/ {exit} > /^ .*c\+\+/ {print "-isystem" $$0}') \ > + -isystem $(src)/include/api -isystem $(src)/include/api/$(ARCH) \ > + -isystem $(out)/gen/include > + > +COMMON = $(autodepend) $(INCLUDES) -g -O2 -fPIC -DBOOST_TEST_DYN_LINK \ > + -U _FORTIFY_SOURCE -D_KERNEL -D__OSV__ -DCONF_debug_memory=0 \ > + -Wall -Wno-pointer-arith -Wformat=0 -Wno-format-security > + > +LIBS = > + > +CXXFLAGS = -std=gnu++11 $(COMMON) > +CFLAGS = -std=gnu99 $(COMMON) > + > +tests := libtest_simple.so libtest_empty.so > libtest_dlsym_from_this_grandchild.so \ > + libtest_dlsym_from_this_child.so libtest_dlsym_from_this.so > libdlext_test.so \ > + libtest_with_dependency.so > libtest_check_rtld_next_from_library.so > + > +.PHONY: get_file > +get_file: > + if cd $(src)/modules/dl_tests/bionic; then \ > + git pull; \ > + else \ > + git clone --depth=1 > https://android.googlesource.com/platform/bionic > $(src)/modules/dl_tests/bionic; \ > + fi > + > +all_tests := $(tests:%=dl_tests/%) > + > +build_all: get_file $(all_tests:%=$(out)/%) > +.PHONY: build_all > + > +$(out)/dl_tests/libtest_simple.so: > $(bionic_test_libs)/dlopen_testlib_simple.cpp > + $(makedir) > + $(call quiet, cd $(out); $(CXX) $(CXXFLAGS) -D__SHARED_OBJECT__=1 > -shared -o $@ $<, CXX dl_tests/libtest_simple.so) > + > +$(out)/dl_tests/libtest_empty.so: $(bionic_test_libs)/empty.cpp > + $(makedir) > + $(call quiet, cd $(out); $(CXX) $(CXXFLAGS) -D__SHARED_OBJECT__=1 > -shared -o $@ $<, CXX dl_tests/libtest_empty.so) > + > +$(out)/dl_tests/libtest_check_rtld_next_from_library.so: > $(bionic_test_libs)/check_rtld_next_from_library.cpp > + $(makedir) > + $(call quiet, cd $(out); $(CXX) $(CXXFLAGS) -D__SHARED_OBJECT__=1 > -shared -o $@ $<, CXX dl_tests/libtest_check_rtld_next_from_library.so) > + > +$(out)/dl_tests/libtest_dlsym_from_this_grandchild.so: > $(bionic_test_libs)/dlsym_from_this_symbol2.cpp > + $(makedir) > + $(call quiet, cd $(out); $(CXX) $(CXXFLAGS) -D__SHARED_OBJECT__=1 > -shared -o $@ $<, CXX dl_tests/libtest_dlsym_from_this_grandchild.so) > + > +$(out)/dl_tests/libtest_dlsym_from_this_child.so: COMMON += > -Wl,--no-as-needed -ltest_dlsym_from_this_grandchild -L=$(out)/dl_tests > -L=/usr/lib -Wl,-rpath . -Wl,-rpath / -Wl,-rpath /usr/lib > +$(out)/dl_tests/libtest_dlsym_from_this_child.so: \ > + $(bionic_test_libs)/dlsym_from_this_functions.cpp \ > + $(out)/dl_tests/libtest_dlsym_from_this_grandchild.so > + $(makedir) > + $(call quiet, cd $(out)/tests; $(CXX) $(CXXFLAGS) > -D__SHARED_OBJECT__=1 -shared -o $@ $<, CXX > dl_tests/libtest_dlsym_from_this_child.so) > + > +$(out)/dl_tests/libtest_dlsym_from_this.so: COMMON += -Wl,--no-as-needed > -ltest_dlsym_from_this_child -L=$(out)/dl_tests -L=/usr/lib -Wl,-rpath . > -Wl,-rpath / -Wl,-rpath /usr/lib > +$(out)/dl_tests/libtest_dlsym_from_this.so: \ > + $(bionic_test_libs)/dlsym_from_this_symbol.cpp \ > + $(out)/dl_tests/libtest_dlsym_from_this_child.so > + $(makedir) > + $(call quiet, cd $(out)/tests; $(CXX) $(CXXFLAGS) > -D__SHARED_OBJECT__=1 -shared -o $@ $<, CXX > dl_tests/libtest_dlsym_from_this.so) > + > +$(out)/dl_tests/libdlext_test.so: COMMON += -Wl,-z,relro > -Wl,--no-as-needed -ltest_simple -L=$(out)/dl_tests -L=/usr/lib -Wl,-rpath > . -Wl,-rpath / -Wl,-rpath /usr/lib > +$(out)/dl_tests/libdlext_test.so: > $(bionic_test_libs)/dlext_test_library.cpp > + $(makedir) > + $(call quiet, cd $(out)/tests; $(CXX) $(CXXFLAGS) > -D__SHARED_OBJECT__=1 -shared -o $@ $<, CXX dl_tests/libdlext_test.so) > + > +$(out)/dl_tests/libtest_with_dependency.so: COMMON += -Wl,--no-as-needed > -ldlext_test -L=$(out)/dl_tests -L=/usr/lib -Wl,-rpath . -Wl,-rpath / > -Wl,-rpath /usr/lib > +$(out)/dl_tests/libtest_with_dependency.so: > $(bionic_test_libs)/dlopen_testlib_simple.cpp > + $(makedir) > + $(call quiet, cd $(out)/tests; $(CXX) $(CXXFLAGS) > -D__SHARED_OBJECT__=1 -shared -o $@ $<, CXX > dl_tests/libtest_with_dependency.so) > + > +usr.manifest: build_all FORCE > + @echo "/usr/lib/libtest_simple.so: ./dl_tests/libtest_simple.so" > > $@ > + @echo "/usr/lib/libtest_empty.so: ./dl_tests/libtest_empty.so" >> > $@ > + @echo "/usr/lib/libtest_dlsym_from_this_grandchild.so: > ./dl_tests/libtest_dlsym_from_this_grandchild.so" >> $@ > + @echo "/usr/lib/libtest_dlsym_from_this_child.so: > ./dl_tests/libtest_dlsym_from_this_child.so" >> $@ > + @echo "/usr/lib/libtest_dlsym_from_this.so: > ./dl_tests/libtest_dlsym_from_this.so" >> $@ > + @echo "/usr/lib/libdlext_test.so: ./dl_tests/libdlext_test.so" >> > $@ > + @echo "/usr/lib/libtest_with_dependency.so: > ./dl_tests/libtest_with_dependency.so" >> $@ > + @echo "/usr/lib/libtest_check_rtld_next_from_library.so: > ./dl_tests/libtest_check_rtld_next_from_library.so" >> $@ > + @echo "/tests/libtest_simple.so: ./dl_tests/libtest_simple.so" >> > $@ > + @echo "/tests/libtest_empty.so: ./dl_tests/libtest_empty.so" >> > $@ > + @echo "/tests/libtest_dlsym_from_this_grandchild.so: > ./dl_tests/libtest_dlsym_from_this_grandchild.so" >> $@ > + @echo "/tests/libtest_dlsym_from_this_child.so: > ./dl_tests/libtest_dlsym_from_this_child.so" >> $@ > + @echo "/tests/libtest_dlsym_from_this.so: > ./dl_tests/libtest_dlsym_from_this.so" >> $@ > + @echo "/tests/libdlext_test.so: ./dl_tests/libdlext_test.so" >> > $@ > + @echo "/tests/libtest_with_dependency.so: > ./dl_tests/libtest_with_dependency.so" >> $@ > + @echo "/tests/libtest_check_rtld_next_from_library.so: > ./dl_tests/libtest_check_rtld_next_from_library.so" >> $@ > +.PHONY: FORCE > +FORCE: > + > +clean: > + -rm -f usr.manifest > + > +ifneq ($(MAKECMDGOALS),clean) > +include $(shell test -d $(out)/dl_tests && find $(out)/dl_tests -name > '*.d') > +endif > diff --git a/modules/tests/Makefile b/modules/tests/Makefile > index aac12d3d..ce004339 100644 > --- a/modules/tests/Makefile > +++ b/modules/tests/Makefile > @@ -147,6 +147,8 @@ $(out)/tests/tst-mmap.so: COMMON += -fuse-ld=bfd > $(out)/tests/tst-elf-permissions.so: COMMON += -fuse-ld=bfd > $(out)/tests/tst-tls.so: COMMON += -fuse-ld=bfd > > +$(out)/tests/tst-dlfcn.so: COMMON += -rdynamic -ldl > + > $(out)/tests/tst-tls.so: \ > $(src)/tests/tst-tls.cc \ > $(out)/tests/libtls.so > diff --git a/modules/tests/module.py b/modules/tests/module.py > index be6315c5..f795280d 100644 > --- a/modules/tests/module.py > +++ b/modules/tests/module.py > @@ -1,3 +1,4 @@ > from osv.modules import api > > api.require('java-tests') > +api.require('dl_tests') > diff --git a/tests/tst-dlfcn.cc b/tests/tst-dlfcn.cc > index 3913c6bf..d2c9f288 100644 > --- a/tests/tst-dlfcn.cc > +++ b/tests/tst-dlfcn.cc > @@ -10,6 +10,16 @@ > #include <dlfcn.h> > > #include <boost/test/unit_test.hpp> > +namespace utf = boost::unit_test; > + > +const bool rtld_next = false; > +const bool deep_lookup = false; > + > +static bool called = false; > +extern "C" void DlSymTestFunction() > +{ > + called = true; > +} > > BOOST_AUTO_TEST_CASE(test_dlopen_with_null_as_filename) > { > @@ -53,3 +63,236 @@ BOOST_AUTO_TEST_CASE(test_dladdr) > BOOST_CHECK_EQUAL("vfprintf", info.dli_sname); > BOOST_CHECK_EQUAL(vfprintf, info.dli_saddr); > } > + > +BOOST_AUTO_TEST_CASE(test_dlsym_in_executable) > +{ > + dlerror(); > + void* self = dlopen(NULL, RTLD_NOW); > + BOOST_REQUIRE_NE(self, nullptr); > + BOOST_REQUIRE_EQUAL(dlerror(), nullptr); > + > + void* sym = dlsym(self, "DlSymTestFunction"); > + BOOST_REQUIRE_NE(sym, nullptr); > + > + void (*function)() = reinterpret_cast<void(*)()>(sym); > + > + called = false; > + function(); > + BOOST_REQUIRE_EQUAL(called, true); > + BOOST_CHECK_EQUAL(0, dlclose(self)); > +} > + > +BOOST_AUTO_TEST_CASE(test_dlsym_from_sofile, > + *utf::enable_if<rtld_next>()) > +{ > + dlerror(); > + void* handle = dlopen("/tests/libtest_dlsym_from_this.so", RTLD_LAZY > | RTLD_LOCAL); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE_NE(handle, nullptr); > + > + // check that we can't find '_test_dlsym_symbol' via > dlsym(RTLD_DEFAULT) > + void* symbol = dlsym(RTLD_DEFAULT, "test_dlsym_symbol"); > + // TODO: dlopen ignores all the flags; the current implementation > assumes the flag to be RTLD_GLOBAL but the default should be RTLD_LOCAL > + // Should reenable the test after flags are implemented > + // BOOST_REQUIRE_EQUAL(symbol, nullptr); > + // auto err_msg = std::string(dlerror()); > + // BOOST_TEST_CONTEXT(err_msg) > + // BOOST_REQUIRE_NE(err_msg.find("dlsym: symbol test_dlsym_symbol not > found"), > + // std::string::npos); > + // BOOST_REQUIRE_NE(err_msg.find("undefined symbol: > test_dlsym_symbol"), > + // std::string::npos); > + > + typedef int* (*fn_t)(); > + fn_t lookup_dlsym_symbol_using_RTLD_DEFAULT = > + reinterpret_cast<fn_t>(dlsym(handle, > "lookup_dlsym_symbol_using_RTLD_DEFAULT")); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE_NE(lookup_dlsym_symbol_using_RTLD_DEFAULT, nullptr); > + > + int* ptr = lookup_dlsym_symbol_using_RTLD_DEFAULT(); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE_NE(ptr, nullptr); > + BOOST_REQUIRE_EQUAL(42, *ptr); > + > + fn_t lookup_dlsym_symbol2_using_RTLD_DEFAULT = > + reinterpret_cast<fn_t>(dlsym(handle, > "lookup_dlsym_symbol2_using_RTLD_DEFAULT")); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE(lookup_dlsym_symbol2_using_RTLD_DEFAULT != nullptr); > + > + ptr = lookup_dlsym_symbol2_using_RTLD_DEFAULT(); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE(ptr != nullptr); > + BOOST_REQUIRE_EQUAL(44, *ptr); > + > + fn_t lookup_dlsym_symbol_using_RTLD_NEXT = > + reinterpret_cast<fn_t>(dlsym(handle, > "lookup_dlsym_symbol_using_RTLD_NEXT")); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE(lookup_dlsym_symbol_using_RTLD_NEXT != nullptr); > + > + ptr = lookup_dlsym_symbol_using_RTLD_NEXT(); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE(ptr != nullptr); > + BOOST_REQUIRE_EQUAL(43, *ptr); > + > + dlclose(handle); > +} > + > +BOOST_AUTO_TEST_CASE(test_dlsym_from_sofile_with_preload, > + *utf::enable_if<deep_lookup>()) > +{ > + void* preload = > dlopen("/tests/libtest_dlsym_from_this_grandchild.so", RTLD_NOW | > RTLD_LOCAL); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE(preload != nullptr); > + > + void* handle = dlopen("/tests/libtest_dlsym_from_this.so", RTLD_NOW | > RTLD_LOCAL); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE(handle != nullptr); > + > + // check that we can't find '_test_dlsym_symbol' via > dlsym(RTLD_DEFAULT) > + void* symbol = dlsym(RTLD_DEFAULT, "test_dlsym_symbol"); > + // TODO: dlopen ignores all the flags; the current implementation > assumes the flag to be RTLD_GLOBAL but the default should be RTLD_LOCAL > + // Should reenable the test after flags are implemented > + // BOOST_REQUIRE_EQUAL(symbol, nullptr); > + // auto err_msg = std::string(dlerror()); > + // BOOST_TEST_CONTEXT(err_msg) > + // BOOST_REQUIRE_NE(err_msg.find("dlsym: symbol test_dlsym_symbol not > found"), > + // std::string::npos); > + // BOOST_REQUIRE_NE(err_msg.find("undefined symbol: > test_dlsym_symbol"), > + // std::string::npos); > + > + typedef int* (*fn_t)(); > + fn_t lookup_dlsym_symbol_using_RTLD_DEFAULT = > + reinterpret_cast<fn_t>(dlsym(handle, > "lookup_dlsym_symbol_using_RTLD_DEFAULT")); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE(lookup_dlsym_symbol_using_RTLD_DEFAULT != nullptr); > + > + int* ptr = lookup_dlsym_symbol_using_RTLD_DEFAULT(); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE(ptr != nullptr); > + BOOST_REQUIRE_EQUAL(42, *ptr); > + > + fn_t lookup_dlsym_symbol2_using_RTLD_DEFAULT = > + reinterpret_cast<fn_t>(dlsym(handle, > "lookup_dlsym_symbol2_using_RTLD_DEFAULT")); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE(lookup_dlsym_symbol2_using_RTLD_DEFAULT != nullptr); > + > + ptr = lookup_dlsym_symbol2_using_RTLD_DEFAULT(); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE_NE(ptr, nullptr); > + BOOST_REQUIRE_EQUAL(44, *ptr); > + > + fn_t lookup_dlsym_symbol_using_RTLD_NEXT = > + reinterpret_cast<fn_t>(dlsym(handle, > "lookup_dlsym_symbol_using_RTLD_NEXT")); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE(lookup_dlsym_symbol_using_RTLD_NEXT != nullptr); > + > + ptr = lookup_dlsym_symbol_using_RTLD_NEXT(); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE(ptr != nullptr); > + BOOST_REQUIRE_EQUAL(43, *ptr); > + > + dlclose(handle); > + dlclose(preload); > +} > + > +BOOST_AUTO_TEST_CASE(dlsym_handle_global_sym) > +{ > + // check that we do not look into global group > + // when looking up symbol by handle > + void* handle = dlopen("/tests/libtest_empty.so", RTLD_NOW); > + dlopen("libtest_with_dependency.so", RTLD_NOW | RTLD_GLOBAL); > + void* sym = dlsym(handle, "getRandomNumber"); > + BOOST_REQUIRE(sym == nullptr); > + auto err_msg = std::string(dlerror()); > + BOOST_TEST_CONTEXT(err_msg) > + BOOST_REQUIRE_NE(err_msg.find("dlsym: symbol getRandomNumber not > found"), > + std::string::npos); > + // BOOST_REQUIRE_NE(err_msg.find("undefined symbol: > getRandomNumber"), > + // std::string::npos); > + > + sym = dlsym(handle, "DlSymTestFunction"); > + BOOST_REQUIRE(sym == nullptr); > + err_msg = std::string(dlerror()); > + BOOST_TEST_CONTEXT(err_msg) > + BOOST_REQUIRE_NE(err_msg.find("dlsym: symbol DlSymTestFunction not > found"), > + std::string::npos); > + // BOOST_REQUIRE_NE(err_msg.find("undefined symbol: > DlSymTestFunction"), > + // std::string::npos); > + dlclose(handle); > +} > + > +BOOST_AUTO_TEST_CASE(dlsym_handle_empty_symbol) > +{ > + // check that dlsym of an empty symbol fails (see http://b/33530622) > + void* handle = dlopen("/tests/libtest_dlsym_from_this.so", RTLD_NOW); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE(handle != nullptr); > + void* sym = dlsym(handle, ""); > + BOOST_REQUIRE(sym == nullptr); > + auto err_msg = std::string(dlerror()); > + BOOST_TEST_CONTEXT(err_msg) > + BOOST_REQUIRE_NE(err_msg.find("dlsym: symbol not found"), > + std::string::npos); > + // BOOST_REQUIRE_NE(err_msg.find("undefined symbol: "), > + // std::string::npos); > + dlclose(handle); > +} > + > +BOOST_AUTO_TEST_CASE(dlsym_with_dependencies, > + *utf::enable_if<deep_lookup>()) > +{ > + void* handle = dlopen("/tests/libtest_with_dependency.so", RTLD_NOW); > + BOOST_REQUIRE(handle != nullptr); > + dlerror(); > + // This symbol is in DT_NEEDED library. > + void* sym = dlsym(handle, "getRandomNumber"); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE_NE(sym, nullptr); > + int (*fn)(void); > + fn = reinterpret_cast<int (*)(void)>(sym); > + BOOST_CHECK_EQUAL(4, fn()); > + dlclose(handle); > +} > + > +BOOST_AUTO_TEST_CASE(rtld_default_unknown_symbol) > +{ > + void* addr = dlsym(RTLD_DEFAULT, "UNKNOWN"); > + BOOST_REQUIRE_EQUAL(addr, nullptr); > +} > + > +BOOST_AUTO_TEST_CASE(rtld_default_fclose) > +{ > + void* addr = dlsym(RTLD_DEFAULT, "fclose"); > + BOOST_REQUIRE_NE(addr, nullptr); > +} > + > +BOOST_AUTO_TEST_CASE(rtld_next_unknown_symbol, > + *utf::enable_if<rtld_next>()) > +{ > + void* addr = dlsym(RTLD_NEXT, "UNKNOWN"); > + BOOST_REQUIRE_EQUAL(addr, nullptr); > +} > + > +BOOST_AUTO_TEST_CASE(rtld_next_fclose, > + *utf::enable_if<rtld_next>()) > +{ > + void* addr = dlsym(RTLD_NEXT, "fclose"); > + BOOST_REQUIRE_NE(addr, nullptr); > +} > + > +BOOST_AUTO_TEST_CASE(rtld_next_from_lib, *utf::enable_if<rtld_next>()) > +{ > + void* library_with_fclose = > dlopen("/tests/libtest_check_rtld_next_from_library.so", RTLD_NOW | > RTLD_GLOBAL); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE(library_with_fclose != nullptr); > + void* expected_addr = dlsym(RTLD_DEFAULT, "fclose"); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE(expected_addr != nullptr); > + typedef void* (*get_libc_fclose_ptr_fn_t)(); > + get_libc_fclose_ptr_fn_t get_libc_fclose_ptr = > + > reinterpret_cast<get_libc_fclose_ptr_fn_t>(dlsym(library_with_fclose, > "get_libc_fclose_ptr")); > + BOOST_TEST_CONTEXT(dlerror()) > + BOOST_REQUIRE(get_libc_fclose_ptr != nullptr); > + BOOST_REQUIRE_EQUAL(expected_addr, get_libc_fclose_ptr()); > + > + dlclose(library_with_fclose); > +} > -- > 2.17.1 > > -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to osv-dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/osv-dev/8bf507e8-e185-4fd0-aed0-c92cbfd8a781%40googlegroups.com.