mirror of
https://github.com/opnsense/src.git
synced 2026-06-09 00:32:25 -04:00
Merge commit 7a66a26658f4 from llvm git (by Fangrui Song):
--discard-locals/--discard-all: allow and keep symbols referenced by relocations In GNU objcopy, symbols referenced by relocations are retained. Our COFF (https://reviews.llvm.org/D56480) and Mach-O (https://reviews.llvm.org/D75104) ports port the behavior, but the ELF port doesn't. This PR implements the behavior for ELF. Close #47468 (tcl has a use case that requires `strip -x tclStubLib.o` to strip local symbols not referenced by relocations.) Pull Request: https://github.com/llvm/llvm-project/pull/130704 PR: 258820 Approved by: dim Differential Revision: https://reviews.freebsd.org/D52198
This commit is contained in:
parent
e6253eac1a
commit
959806e0a8
1 changed files with 13 additions and 12 deletions
|
|
@ -368,7 +368,7 @@ static Error updateAndRemoveSymbols(const CommonConfig &Config,
|
|||
// (like GroupSection or RelocationSection). This way, we know which
|
||||
// symbols are still 'needed' and which are not.
|
||||
if (Config.StripUnneeded || !Config.UnneededSymbolsToRemove.empty() ||
|
||||
!Config.OnlySection.empty()) {
|
||||
!Config.OnlySection.empty() || Config.DiscardMode != DiscardType::None) {
|
||||
for (SectionBase &Sec : Obj.sections())
|
||||
Sec.markSymbols();
|
||||
}
|
||||
|
|
@ -390,22 +390,23 @@ static Error updateAndRemoveSymbols(const CommonConfig &Config,
|
|||
if (Config.StripDebug && Sym.Type == STT_FILE)
|
||||
return true;
|
||||
|
||||
if ((Config.DiscardMode == DiscardType::All ||
|
||||
(Config.DiscardMode == DiscardType::Locals &&
|
||||
StringRef(Sym.Name).starts_with(".L"))) &&
|
||||
Sym.Binding == STB_LOCAL && Sym.getShndx() != SHN_UNDEF &&
|
||||
Sym.Type != STT_FILE && Sym.Type != STT_SECTION)
|
||||
return true;
|
||||
|
||||
if ((Config.StripUnneeded ||
|
||||
Config.UnneededSymbolsToRemove.matches(Sym.Name)) &&
|
||||
(!Obj.isRelocatable() || isUnneededSymbol(Sym)))
|
||||
return true;
|
||||
|
||||
// We want to remove undefined symbols if all references have been stripped.
|
||||
if (!Config.OnlySection.empty() && !Sym.Referenced &&
|
||||
Sym.getShndx() == SHN_UNDEF)
|
||||
return true;
|
||||
if (!Sym.Referenced) {
|
||||
if ((Config.DiscardMode == DiscardType::All ||
|
||||
(Config.DiscardMode == DiscardType::Locals &&
|
||||
StringRef(Sym.Name).starts_with(".L"))) &&
|
||||
Sym.Binding == STB_LOCAL && Sym.getShndx() != SHN_UNDEF &&
|
||||
Sym.Type != STT_FILE && Sym.Type != STT_SECTION)
|
||||
return true;
|
||||
// We want to remove undefined symbols if all references have been
|
||||
// stripped.
|
||||
if (!Config.OnlySection.empty() && Sym.getShndx() == SHN_UNDEF)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue