mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-22 02:05:01 +00:00
[RuntimeDyld] Fix '_' stripping in RTDyldMemoryManager::getSymbolAddressInProcess.
The RTDyldMemoryManager::getSymbolAddressInProcess method accepts a linker-mangled symbol name, but it calls through to dlsym to do the lookup (via DynamicLibrary::SearchForAddressOfSymbol), and dlsym expects an unmangled symbol name. Historically we've attempted to "demangle" by removing leading '_'s on all platforms, and fallen back to an extra search if that failed. That's broken, as it can cause symbols to resolve incorrectly on platforms that don't do mangling if you query '_foo' and the process also happens to contain a 'foo'. Fix this by demangling conditionally based on the host platform. That's safe here because this function is specifically for symbols in the host process, so the usual cross-process JIT looking concerns don't apply. M unittests/ExecutionEngine/ExecutionEngineTest.cpp M lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@262657 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
80664b5c60
commit
9ab9fd58bd
@ -262,18 +262,15 @@ RTDyldMemoryManager::getSymbolAddressInProcess(const std::string &Name) {
|
||||
// is called before ExecutionEngine::runFunctionAsMain() is called.
|
||||
if (Name == "__main") return (uint64_t)&jit_noop;
|
||||
|
||||
// Try to demangle Name before looking it up in the process, otherwise symbol
|
||||
// '_<Name>' (if present) will shadow '<Name>', and there will be no way to
|
||||
// refer to the latter.
|
||||
|
||||
const char *NameStr = Name.c_str();
|
||||
|
||||
// DynamicLibrary::SearchForAddresOfSymbol expects an unmangled 'C' symbol
|
||||
// name so ff we're on Darwin, strip the leading '_' off.
|
||||
#ifdef __APPLE__
|
||||
if (NameStr[0] == '_')
|
||||
if (void *Ptr = sys::DynamicLibrary::SearchForAddressOfSymbol(NameStr + 1))
|
||||
return (uint64_t)Ptr;
|
||||
++NameStr;
|
||||
#endif
|
||||
|
||||
// If we Name did not require demangling, or we failed to find the demangled
|
||||
// name, try again without demangling.
|
||||
return (uint64_t)sys::DynamicLibrary::SearchForAddressOfSymbol(NameStr);
|
||||
}
|
||||
|
||||
@ -284,6 +281,7 @@ void *RTDyldMemoryManager::getPointerToNamedFunction(const std::string &Name,
|
||||
if (!Addr && AbortOnFailure)
|
||||
report_fatal_error("Program used external function '" + Name +
|
||||
"' which could not be resolved!");
|
||||
|
||||
return (void*)Addr;
|
||||
}
|
||||
|
||||
|
@ -136,35 +136,23 @@ TEST_F(ExecutionEngineTest, DestructionRemovesGlobalMapping) {
|
||||
EXPECT_EQ(nullptr, Engine->getGlobalValueAtAddress(&Mem1));
|
||||
}
|
||||
|
||||
TEST_F(ExecutionEngineTest, LookupWithMangledName) {
|
||||
int x;
|
||||
llvm::sys::DynamicLibrary::AddSymbol("x", &x);
|
||||
|
||||
// Demonstrate that getSymbolAddress accepts mangled names and always strips
|
||||
// the leading underscore.
|
||||
EXPECT_EQ(reinterpret_cast<uint64_t>(&x),
|
||||
RTDyldMemoryManager::getSymbolAddressInProcess("_x"));
|
||||
}
|
||||
|
||||
TEST_F(ExecutionEngineTest, LookupWithMangledAndDemangledSymbol) {
|
||||
int x;
|
||||
int _x;
|
||||
llvm::sys::DynamicLibrary::AddSymbol("x", &x);
|
||||
llvm::sys::DynamicLibrary::AddSymbol("_x", &_x);
|
||||
|
||||
// Lookup the demangled name first, even if there's a demangled symbol that
|
||||
// matches the input already.
|
||||
// RTDyldMemoryManager::getSymbolAddressInProcess expects a mangled symbol,
|
||||
// but DynamicLibrary is a wrapper for dlsym, which expects the unmangled C
|
||||
// symbol name. This test verifies that getSymbolAddressInProcess strips the
|
||||
// leading '_' on Darwin, but not on other platforms.
|
||||
#ifdef __APPLE__
|
||||
EXPECT_EQ(reinterpret_cast<uint64_t>(&x),
|
||||
RTDyldMemoryManager::getSymbolAddressInProcess("_x"));
|
||||
}
|
||||
|
||||
TEST_F(ExecutionEngineTest, LookupwithDemangledName) {
|
||||
int _x;
|
||||
llvm::sys::DynamicLibrary::AddSymbol("_x", &_x);
|
||||
|
||||
// But do fallback to looking up a demangled name if there's no ambiguity
|
||||
#else
|
||||
EXPECT_EQ(reinterpret_cast<uint64_t>(&_x),
|
||||
RTDyldMemoryManager::getSymbolAddressInProcess("_x"));
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user