Merge "Fix for dlfcn.rtld_next_from_library."

This commit is contained in:
Elliott Hughes 2017-11-04 17:03:26 +00:00 committed by Gerrit Code Review
commit 2ca61ebe97
2 changed files with 18 additions and 17 deletions

View file

@ -1102,17 +1102,17 @@ TEST(dlfcn, rtld_next_known_symbol) {
// Check that RTLD_NEXT of a libc symbol works in dlopened library
TEST(dlfcn, rtld_next_from_library) {
void* library_with_close = dlopen("libtest_check_rtld_next_from_library.so", RTLD_NOW);
ASSERT_TRUE(library_with_close != nullptr) << dlerror();
void* expected_addr = dlsym(RTLD_DEFAULT, "close");
void* library_with_fclose = dlopen("libtest_check_rtld_next_from_library.so", RTLD_NOW);
ASSERT_TRUE(library_with_fclose != nullptr) << dlerror();
void* expected_addr = dlsym(RTLD_DEFAULT, "fclose");
ASSERT_TRUE(expected_addr != nullptr) << dlerror();
typedef void* (*get_libc_close_ptr_fn_t)();
get_libc_close_ptr_fn_t get_libc_close_ptr =
reinterpret_cast<get_libc_close_ptr_fn_t>(dlsym(library_with_close, "get_libc_close_ptr"));
ASSERT_TRUE(get_libc_close_ptr != nullptr) << dlerror();
ASSERT_EQ(expected_addr, get_libc_close_ptr());
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"));
ASSERT_TRUE(get_libc_fclose_ptr != nullptr) << dlerror();
ASSERT_EQ(expected_addr, get_libc_fclose_ptr());
dlclose(library_with_close);
dlclose(library_with_fclose);
}

View file

@ -15,22 +15,23 @@
*/
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
static void* g_libc_close_ptr;
static void* g_libc_fclose_ptr;
static void __attribute__((constructor)) __libc_close_lookup() {
g_libc_close_ptr = dlsym(RTLD_NEXT, "close");
static void __attribute__((constructor)) __libc_fclose_lookup() {
g_libc_fclose_ptr = dlsym(RTLD_NEXT, "fclose");
}
// A libc function used for RTLD_NEXT
// This function in not supposed to be called
extern "C" int __attribute__((weak)) close(int) {
// A libc function used for RTLD_NEXT.
// This function in not supposed to be called.
extern "C" int __attribute__((weak)) fclose(FILE*) {
abort();
}
extern "C" void* get_libc_close_ptr() {
return g_libc_close_ptr;
extern "C" void* get_libc_fclose_ptr() {
return g_libc_fclose_ptr;
}