forked from OSchip/llvm-project
[ELF] - Implemented -znotext
gold linker manual describes them as: -z text Do not permit relocations in read-only segments -z notext Permit relocations in read-only segments (default) In LLD default is to not permit them. Patch implements -z notext. Differential revision: https://reviews.llvm.org/D30530 llvm-svn: 297366
This commit is contained in:
parent
1c74c2f2a8
commit
0a7412f00b
|
@ -142,6 +142,7 @@ struct Configuration {
|
|||
bool ZNow;
|
||||
bool ZOrigin;
|
||||
bool ZRelro;
|
||||
bool ZText;
|
||||
bool ExitEarly;
|
||||
bool ZWxneeded;
|
||||
DiscardPolicy Discard;
|
||||
|
|
|
@ -599,6 +599,7 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) {
|
|||
Config->ZOrigin = hasZOption(Args, "origin");
|
||||
Config->ZRelro = !hasZOption(Args, "norelro");
|
||||
Config->ZStackSize = getZOptionValue(Args, "stack-size", 0);
|
||||
Config->ZText = !hasZOption(Args, "notext");
|
||||
Config->ZWxneeded = hasZOption(Args, "wxneeded");
|
||||
|
||||
if (Config->LTOO > 3)
|
||||
|
|
|
@ -520,11 +520,12 @@ static RelExpr adjustExpr(const elf::ObjectFile<ELFT> &File, SymbolBody &Body,
|
|||
// only memory. We can hack around it if we are producing an executable and
|
||||
// the refered symbol can be preemepted to refer to the executable.
|
||||
if (Config->Shared || (Config->pic() && !isRelExpr(Expr))) {
|
||||
error(S.getLocation<ELFT>(RelOff) + ": can't create dynamic relocation " +
|
||||
toString(Type) + " against " +
|
||||
(Body.getName().empty() ? "local symbol in readonly segment"
|
||||
: "symbol '" + toString(Body) + "'") +
|
||||
" defined in " + toString(Body.File));
|
||||
if (Config->ZText)
|
||||
error(S.getLocation<ELFT>(RelOff) + ": can't create dynamic relocation " +
|
||||
toString(Type) + " against " +
|
||||
(Body.getName().empty() ? "local symbol in readonly segment"
|
||||
: "symbol '" + toString(Body) + "'") +
|
||||
" defined in " + toString(Body.File));
|
||||
return Expr;
|
||||
}
|
||||
if (Body.getVisibility() != STV_DEFAULT) {
|
||||
|
|
|
@ -1111,6 +1111,8 @@ template <class ELFT> void DynamicSection<ELFT>::finalizeContents() {
|
|||
add({DT_SYMENT, sizeof(Elf_Sym)});
|
||||
add({DT_STRTAB, In<ELFT>::DynStrTab});
|
||||
add({DT_STRSZ, In<ELFT>::DynStrTab->getSize()});
|
||||
if (!Config->ZText)
|
||||
add({DT_TEXTREL, (uint64_t)0});
|
||||
if (In<ELFT>::GnuHashTab)
|
||||
add({DT_GNU_HASH, In<ELFT>::GnuHashTab});
|
||||
if (In<ELFT>::HashTab)
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
# REQUIRES: x86
|
||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
|
||||
# RUN: ld.lld -z notext %t.o -o %t -shared
|
||||
# RUN: llvm-readobj -dynamic-table -r %t | FileCheck %s
|
||||
|
||||
# CHECK: Relocations [
|
||||
# CHECK-NEXT: Section {{.*}} .rela.dyn {
|
||||
# CHECK-NEXT: 0x1000 R_X86_64_RELATIVE - 0x1000
|
||||
# CHECK-NEXT: }
|
||||
# CHECK-NEXT: ]
|
||||
# CHECK: DynamicSection [
|
||||
# CHECK: 0x0000000000000016 TEXTREL 0x0
|
||||
|
||||
foo:
|
||||
.quad foo
|
Loading…
Reference in New Issue