81 lines
2.4 KiB
C++
81 lines
2.4 KiB
C++
/*
|
|
* Copyright The async-profiler authors
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifdef __linux__
|
|
#define EXT ".so"
|
|
#else
|
|
#define EXT ".dylib"
|
|
#endif
|
|
|
|
#include "codeCache.h"
|
|
#include "profiler.h"
|
|
#include "testRunner.hpp"
|
|
#include <dlfcn.h>
|
|
|
|
const void* resolveSymbol(const char* lib, const char* name) {
|
|
void* result = dlopen(lib, RTLD_NOW);
|
|
if (!result) {
|
|
printf("%s\n", dlerror());
|
|
return nullptr;
|
|
}
|
|
Profiler::instance()->updateSymbols(false);
|
|
return Profiler::instance()->resolveSymbol(name);
|
|
}
|
|
|
|
#define ASSERT_RESOLVE(id) \
|
|
{ \
|
|
void* result = dlopen("libreladyn" EXT, RTLD_NOW); /* see reladyn.c */ \
|
|
ASSERT(result); \
|
|
Profiler::instance()->updateSymbols(false); \
|
|
CodeCache* libreladyn = Profiler::instance()->findLibraryByName("libreladyn"); \
|
|
ASSERT(libreladyn); \
|
|
void* sym = libreladyn->findImport(id); \
|
|
ASSERT(sym); \
|
|
}
|
|
|
|
TEST_CASE(ResolveFromRela_plt) {
|
|
ASSERT_RESOLVE(im_pthread_create);
|
|
}
|
|
|
|
TEST_CASE(ResolveFromRela_dyn_R_GLOB_DAT) {
|
|
ASSERT_RESOLVE(im_pthread_setspecific);
|
|
}
|
|
|
|
#ifdef __linux__
|
|
|
|
TEST_CASE(ResolveFromRela_dyn_R_ABS64) {
|
|
ASSERT_RESOLVE(im_pthread_exit);
|
|
}
|
|
|
|
TEST_CASE(VirtAddrDifferentLoadAddr) {
|
|
const void* sym = resolveSymbol("libvaddrdif" EXT, "vaddrdif_square");
|
|
ASSERT(sym);
|
|
|
|
int (*square)(int) = (int (*)(int))sym;
|
|
ASSERT_EQ(square(5), 25);
|
|
}
|
|
|
|
TEST_CASE(MappedTwiceAtZeroOffset) {
|
|
const void* sym = resolveSymbol("libtwiceatzero" EXT, "twiceatzero_hello");
|
|
// Resolving the symbol without crashing is enough for this test case.
|
|
ASSERT(sym);
|
|
|
|
void (*hello)() = (void (*)())sym;
|
|
hello();
|
|
}
|
|
|
|
TEST_CASE(MultipleMatchingSymbols) {
|
|
const void* sym = resolveSymbol("multiplematching" EXT, "Class::function");
|
|
ASSERT(sym);
|
|
|
|
const void* sym_ok = resolveSymbol("multiplematching" EXT, "_ZN5Class8functionEv");
|
|
ASSERT_EQ(sym, sym_ok);
|
|
|
|
const void* sym_cold = resolveSymbol("multiplematching" EXT, "_ZN5Class8functionEv.cold");
|
|
ASSERT_NE(sym, sym_cold);
|
|
}
|
|
|
|
#endif // __linux__
|