diff --git a/tests/tst-dlfcn.cc b/tests/tst-dlfcn.cc index d7b5f26f350f8ba340649d86b6e7d4fdb1df8842..dbb41c3df70171fc6a4bdae93769641eb060778b 100644 --- a/tests/tst-dlfcn.cc +++ b/tests/tst-dlfcn.cc @@ -26,3 +26,30 @@ BOOST_AUTO_TEST_CASE(test_dlopen_with_empty_file_name) BOOST_REQUIRE(dlsym(ref, "open") != NULL); BOOST_REQUIRE(dlclose(ref) == 0); } + +template<typename T> +static void *adj_addr(T addr, int adj) +{ + return reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(addr) + adj); +} + +BOOST_AUTO_TEST_CASE(test_dladdr) +{ + Dl_info info; + + BOOST_REQUIRE(dladdr(adj_addr(vfprintf, -2), &info) != 0); + BOOST_REQUIRE(std::string("vfprintf") != std::string(info.dli_sname)); + BOOST_REQUIRE(vfprintf != info.dli_saddr); + + BOOST_REQUIRE(dladdr(adj_addr(vfprintf, 0), &info) != 0); + BOOST_CHECK_EQUAL("vfprintf", info.dli_sname); + BOOST_CHECK_EQUAL(vfprintf, info.dli_saddr); + + BOOST_REQUIRE(dladdr(adj_addr(vfprintf, 2), &info) != 0); + BOOST_CHECK_EQUAL("vfprintf", info.dli_sname); + BOOST_CHECK_EQUAL(vfprintf, info.dli_saddr); + + BOOST_REQUIRE(dladdr(adj_addr(vfprintf, 4), &info) != 0); + BOOST_CHECK_EQUAL("vfprintf", info.dli_sname); + BOOST_CHECK_EQUAL(vfprintf, info.dli_saddr); +}