Fix dlsym(3) to do breadth first search.
dlsym(3) with handle != RTLD_DEFAULT|RTLD_NEXT performs breadth first search through the dependency tree. Bug: 16653281 Change-Id: I017a6975d1a62abb0218a7eb59ae4deba458e324
This commit is contained in:
@@ -62,10 +62,9 @@ TEST(dlfcn, dlsym_in_self) {
|
||||
ASSERT_EQ(0, dlclose(self));
|
||||
}
|
||||
|
||||
#if !defined(__LP64__)
|
||||
// Current compiler/static linker used for aarch64
|
||||
// platform optimizes LOCAL PROTECTED symbol
|
||||
// in libtest_local_symbol.so out of existence
|
||||
#if defined(__arm__)
|
||||
// This seems to be working only for arm.
|
||||
// Others platforms optimize LOCAL PROTECTED symbols.
|
||||
TEST(dlfcn, dlsym_local_symbol) {
|
||||
void* handle = dlopen("libtest_local_symbol.so", RTLD_NOW);
|
||||
ASSERT_TRUE(handle != NULL);
|
||||
@@ -78,9 +77,23 @@ TEST(dlfcn, dlsym_local_symbol) {
|
||||
f = reinterpret_cast<uint32_t (*)(void)>(dlsym(handle, "dlsym_local_symbol_get_taxicab_number_using_dlsym"));
|
||||
ASSERT_TRUE(f != NULL);
|
||||
ASSERT_EQ(1729U, f());
|
||||
dlclose(handle);
|
||||
}
|
||||
#endif
|
||||
|
||||
TEST(dlfcn, dlsym_with_dependencies) {
|
||||
void* handle = dlopen("libtest_with_dependency.so", RTLD_NOW);
|
||||
ASSERT_TRUE(handle != NULL);
|
||||
dlerror();
|
||||
// This symbol is in DT_NEEDED library.
|
||||
void* sym = dlsym(handle, "getRandomNumber");
|
||||
ASSERT_TRUE(sym != NULL);
|
||||
int (*fn)(void);
|
||||
fn = reinterpret_cast<int (*)(void)>(sym);
|
||||
EXPECT_EQ(4, fn());
|
||||
dlclose(handle);
|
||||
}
|
||||
|
||||
TEST(dlfcn, dlopen_noload) {
|
||||
void* handle = dlopen("libtest_simple.so", RTLD_NOW | RTLD_NOLOAD);
|
||||
ASSERT_TRUE(handle == NULL);
|
||||
|
||||
Reference in New Issue
Block a user