Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F151252783
D16748.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D16748.id.diff
View Options
Index: head/contrib/llvm/tools/lld/ELF/Config.h
===================================================================
--- head/contrib/llvm/tools/lld/ELF/Config.h
+++ head/contrib/llvm/tools/lld/ELF/Config.h
@@ -155,6 +155,7 @@
bool ZCombreloc;
bool ZExecstack;
bool ZHazardplt;
+ bool ZIfuncnoplt;
bool ZNocopyreloc;
bool ZNodelete;
bool ZNodlopen;
Index: head/contrib/llvm/tools/lld/ELF/Driver.cpp
===================================================================
--- head/contrib/llvm/tools/lld/ELF/Driver.cpp
+++ head/contrib/llvm/tools/lld/ELF/Driver.cpp
@@ -669,6 +669,7 @@
Config->ZCombreloc = !hasZOption(Args, "nocombreloc");
Config->ZExecstack = hasZOption(Args, "execstack");
Config->ZHazardplt = hasZOption(Args, "hazardplt");
+ Config->ZIfuncnoplt = hasZOption(Args, "ifunc-noplt");
Config->ZNocopyreloc = hasZOption(Args, "nocopyreloc");
Config->ZNodelete = hasZOption(Args, "nodelete");
Config->ZNodlopen = hasZOption(Args, "nodlopen");
Index: head/contrib/llvm/tools/lld/ELF/Relocations.cpp
===================================================================
--- head/contrib/llvm/tools/lld/ELF/Relocations.cpp
+++ head/contrib/llvm/tools/lld/ELF/Relocations.cpp
@@ -374,6 +374,9 @@
R_PPC_PLT_OPD, R_TLSDESC_CALL, R_TLSDESC_PAGE, R_HINT>(E))
return true;
+ if (Sym.isGnuIFunc() && Config->ZIfuncnoplt)
+ return false;
+
// These never do, except if the entire file is position dependent or if
// only the low bits are used.
if (E == R_GOT || E == R_PLT || E == R_TLSDESC)
@@ -921,7 +924,9 @@
// Strenghten or relax a PLT access.
//
// GNU ifunc symbols must be accessed via PLT because their addresses
- // are determined by runtime.
+ // are determined by runtime. If the -z ifunc-noplt option is specified,
+ // we permit the optimization of ifunc calls by omitting the PLT entry
+ // and preserving relocations at ifunc call sites.
//
// On the other hand, if we know that a PLT entry will be resolved within
// the same ELF module, we can skip PLT access and directly jump to the
@@ -929,7 +934,7 @@
// all dynamic symbols that can be resolved within the executable will
// actually be resolved that way at runtime, because the main exectuable
// is always at the beginning of a search list. We can leverage that fact.
- if (Sym.isGnuIFunc())
+ if (Sym.isGnuIFunc() && !Config->ZIfuncnoplt)
Expr = toPlt(Expr);
else if (!Preemptible && Expr == R_GOT_PC && !isAbsoluteValue(Sym))
Expr =
@@ -1031,6 +1036,16 @@
// uses Elf_Rel, since in that case the written value is the addend.
if (IsConstant) {
Sec.Relocations.push_back({Expr, Type, Offset, Addend, &Sym});
+ continue;
+ }
+
+ // Preserve relocations against ifuncs if we were asked to do so.
+ if (Sym.isGnuIFunc() && Config->ZIfuncnoplt) {
+ if (Config->IsRela)
+ InX::RelaDyn->addReloc({Type, &Sec, Offset, false, &Sym, Addend});
+ else
+ // Preserve the existing addend.
+ InX::RelaDyn->addReloc({Type, &Sec, Offset, false, &Sym, 0});
continue;
}
Index: head/contrib/llvm/tools/lld/ELF/Writer.cpp
===================================================================
--- head/contrib/llvm/tools/lld/ELF/Writer.cpp
+++ head/contrib/llvm/tools/lld/ELF/Writer.cpp
@@ -1400,8 +1400,11 @@
applySynthetic({InX::EhFrame},
[](SyntheticSection *SS) { SS->finalizeContents(); });
- for (Symbol *S : Symtab->getSymbols())
+ for (Symbol *S : Symtab->getSymbols()) {
S->IsPreemptible |= computeIsPreemptible(*S);
+ if (S->isGnuIFunc() && Config->ZIfuncnoplt)
+ S->ExportDynamic = true;
+ }
// Scan relocations. This must be done after every symbol is declared so that
// we can correctly decide if a dynamic relocation is needed.
Index: head/usr.bin/clang/lld/ld.lld.1
===================================================================
--- head/usr.bin/clang/lld/ld.lld.1
+++ head/usr.bin/clang/lld/ld.lld.1
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd February 7, 2018
+.Dd August 22, 2018
.Dt LD.LLD 1
.Os
.Sh NAME
@@ -443,6 +443,13 @@
Stack permissions are recorded in the
.Dv PT_GNU_STACK
segment.
+.It Cm ifunc-noplt
+Do not emit PLT entries for GNU ifuncs.
+Instead, preserve relocations for ifunc call sites so that they may
+be applied by a run-time loader.
+Note that this feature requires special loader support and will
+generally result in application crashes when used outside of freestanding
+environments.
.It Cm muldefs
Do not error if a symbol is defined multiple times.
The first definition will be used.
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Apr 8, 3:26 AM (3 h, 30 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31071362
Default Alt Text
D16748.id.diff (4 KB)
Attached To
Mode
D16748: Preserve relocations against ifuncs when -zifunc-noplt is specified.
Attached
Detach File
Event Timeline
Log In to Comment