mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 03:56:16 +08:00
ELF: Export preempted symbols even if there is a dynamic list.
Dynamic lists in an executable are additive, not restrictive, so we must continue to export preempted symbols even with a dynamic list. This fixes sanitizer interception of libc symbols (and should also fix symbol preemption by users of sanitizers). Differential Revision: https://reviews.llvm.org/D38647 llvm-svn: 315114
This commit is contained in:
@@ -790,18 +790,8 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) {
|
||||
readDynamicList(*Buffer);
|
||||
|
||||
for (auto *Arg : Args.filtered(OPT_export_dynamic_symbol))
|
||||
Config->VersionScriptGlobals.push_back(
|
||||
Config->DynamicList.push_back(
|
||||
{Arg->getValue(), /*IsExternCpp*/ false, /*HasWildcard*/ false});
|
||||
|
||||
// Dynamic lists are a simplified linker script that doesn't need the
|
||||
// "global:" and implicitly ends with a "local:*". Set the variables
|
||||
// needed to simulate that.
|
||||
if (Args.hasArg(OPT_dynamic_list) ||
|
||||
Args.hasArg(OPT_export_dynamic_symbol)) {
|
||||
Config->ExportDynamic = true;
|
||||
if (!Config->Shared)
|
||||
Config->DefaultSymbolVersion = VER_NDX_LOCAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (auto *Arg = Args.getLastArg(OPT_version_script))
|
||||
|
||||
@@ -733,7 +733,7 @@ void SymbolTable::handleDynamicList() {
|
||||
|
||||
for (SymbolBody *B : Syms) {
|
||||
if (!Config->Shared)
|
||||
B->symbol()->VersionId = VER_NDX_GLOBAL;
|
||||
B->symbol()->ExportDynamic = true;
|
||||
else if (B->symbol()->includeInDynsym())
|
||||
B->IsPreemptible = true;
|
||||
}
|
||||
|
||||
@@ -19,6 +19,15 @@
|
||||
# CHECK-NEXT: Section: Undefined (0x0)
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Symbol {
|
||||
# CHECK-NEXT: Name: bar
|
||||
# CHECK-NEXT: Value:
|
||||
# CHECK-NEXT: Size:
|
||||
# CHECK-NEXT: Binding: Global
|
||||
# CHECK-NEXT: Type:
|
||||
# CHECK-NEXT: Other:
|
||||
# CHECK-NEXT: Section: .text
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: Symbol {
|
||||
# CHECK-NEXT: Name: bar2
|
||||
# CHECK-NEXT: Value:
|
||||
# CHECK-NEXT: Size:
|
||||
|
||||
Reference in New Issue
Block a user