From ac9eb3e1ef97abb16ed058a4497f03f8b61e3fd7 Mon Sep 17 00:00:00 2001 From: mgorny Date: Fri, 1 Feb 2019 16:30:00 +0000 Subject: [PATCH] devel/lld: import lld-7.0.1 LLD is a linker from the LLVM project that is a drop-in replacement for system linkers and runs much faster than them. It also provides features that are useful for toolchain developers. --- devel/lld/DESCR | 11 + devel/lld/Makefile | 34 +++ devel/lld/PLIST | 49 +++++ devel/lld/buildlink3.mk | 14 ++ devel/lld/distinfo | 18 ++ devel/lld/options.mk | 20 ++ devel/lld/patches/patch-CMakeLists.txt | 16 ++ devel/lld/patches/patch-ELF_Config.h | 37 ++++ devel/lld/patches/patch-ELF_Driver.cpp | 231 ++++++++++++++++++++ devel/lld/patches/patch-ELF_Driver.h | 20 ++ devel/lld/patches/patch-ELF_Options.td | 16 ++ devel/lld/patches/patch-ELF_Writer.cpp | 35 +++ devel/lld/patches/patch-docs_ld.lld.1 | 18 ++ devel/lld/patches/patch-test_ELF_gnustack.s | 25 +++ 14 files changed, 544 insertions(+) create mode 100644 devel/lld/DESCR create mode 100644 devel/lld/Makefile create mode 100644 devel/lld/PLIST create mode 100644 devel/lld/buildlink3.mk create mode 100644 devel/lld/distinfo create mode 100644 devel/lld/options.mk create mode 100644 devel/lld/patches/patch-CMakeLists.txt create mode 100644 devel/lld/patches/patch-ELF_Config.h create mode 100644 devel/lld/patches/patch-ELF_Driver.cpp create mode 100644 devel/lld/patches/patch-ELF_Driver.h create mode 100644 devel/lld/patches/patch-ELF_Options.td create mode 100644 devel/lld/patches/patch-ELF_Writer.cpp create mode 100644 devel/lld/patches/patch-docs_ld.lld.1 create mode 100644 devel/lld/patches/patch-test_ELF_gnustack.s diff --git a/devel/lld/DESCR b/devel/lld/DESCR new file mode 100644 index 000000000000..4b5b6daa5b5c --- /dev/null +++ b/devel/lld/DESCR @@ -0,0 +1,11 @@ +LLD is a linker from the LLVM project that is a drop-in replacement for system +linkers and runs much faster than them. It also provides features that are +useful for toolchain developers. + +The linker supports ELF (Unix), PE/COFF (Windows), Mach-O (macOS) and +WebAssembly in descending order of completeness. Internally, LLD consists of +several different linkers. The ELF port is the one that will be described in +this document. The PE/COFF port is complete, including Windows debug info (PDB) +support. The WebAssembly port is still a work in progress (See WebAssembly lld +port). The Mach-O port is built based on a different architecture than +the others. For the details about Mach-O, please read ATOM-based lld. diff --git a/devel/lld/Makefile b/devel/lld/Makefile new file mode 100644 index 000000000000..ac52a712023f --- /dev/null +++ b/devel/lld/Makefile @@ -0,0 +1,34 @@ +# $NetBSD: Makefile,v 1.1 2019/02/01 16:30:00 mgorny Exp $ + +PKGNAME= lld-7.0.1 +DISTNAME= ${PKGNAME}.src +CATEGORIES= devel +MASTER_SITES= http://llvm.org/releases/${PKGVERSION_NOREV}/ +EXTRACT_SUFX= .tar.xz +DISTFILES= ${DEFAULT_DISTFILES} + +MAINTAINER= mgorny@NetBSD.org +HOMEPAGE= http://lld.llvm.org/ +COMMENT= The LLVM Linker +LICENSE= modified-bsd + +USE_LANGUAGES= c c++11 +USE_CMAKE= yes +GCC_REQD+= 4.8 + +CONFIGURE_DIRS= ${WRKDIR}/build +CMAKE_ARG_PATH= ${WRKSRC} + +CMAKE_ARGS+= -DCMAKE_BUILD_TYPE=Release +CMAKE_ARGS+= -DCMAKE_C_COMPILER=${CC:Q} +CMAKE_ARGS+= -DCMAKE_CXX_COMPILER=${CXX:Q} + +PYTHON_FOR_BUILD_ONLY= yes + +post-extract: + ${MKDIR} ${WRKDIR}/build + +.include "options.mk" +.include "../../lang/python/tool.mk" +.include "../../lang/llvm/buildlink3.mk" +.include "../../mk/bsd.pkg.mk" diff --git a/devel/lld/PLIST b/devel/lld/PLIST new file mode 100644 index 000000000000..5b294f225a55 --- /dev/null +++ b/devel/lld/PLIST @@ -0,0 +1,49 @@ +@comment $NetBSD: PLIST,v 1.1 2019/02/01 16:30:00 mgorny Exp $ +bin/ld.lld +bin/ld64.lld +bin/lld +bin/lld-link +bin/wasm-ld +include/lld/Common/Args.h +include/lld/Common/Driver.h +include/lld/Common/ErrorHandler.h +include/lld/Common/LLVM.h +include/lld/Common/Memory.h +include/lld/Common/Reproduce.h +include/lld/Common/Strings.h +include/lld/Common/TargetOptionsCommandFlags.h +include/lld/Common/Threads.h +include/lld/Common/Timer.h +include/lld/Common/Version.h +include/lld/Core/AbsoluteAtom.h +include/lld/Core/ArchiveLibraryFile.h +include/lld/Core/Atom.h +include/lld/Core/DefinedAtom.h +include/lld/Core/Error.h +include/lld/Core/File.h +include/lld/Core/Instrumentation.h +include/lld/Core/LinkingContext.h +include/lld/Core/Node.h +include/lld/Core/Pass.h +include/lld/Core/PassManager.h +include/lld/Core/Reader.h +include/lld/Core/Reference.h +include/lld/Core/Resolver.h +include/lld/Core/SharedLibraryAtom.h +include/lld/Core/SharedLibraryFile.h +include/lld/Core/Simple.h +include/lld/Core/SymbolTable.h +include/lld/Core/UndefinedAtom.h +include/lld/Core/Writer.h +include/lld/ReaderWriter/MachOLinkingContext.h +include/lld/ReaderWriter/YamlContext.h +lib/liblldCOFF.a +lib/liblldCommon.a +lib/liblldCore.a +lib/liblldDriver.a +lib/liblldELF.a +lib/liblldMachO.a +lib/liblldMinGW.a +lib/liblldReaderWriter.a +lib/liblldWasm.a +lib/liblldYAML.a diff --git a/devel/lld/buildlink3.mk b/devel/lld/buildlink3.mk new file mode 100644 index 000000000000..7cb1f29bb0a8 --- /dev/null +++ b/devel/lld/buildlink3.mk @@ -0,0 +1,14 @@ +# $NetBSD: buildlink3.mk,v 1.1 2019/02/01 16:30:00 mgorny Exp $ + +BUILDLINK_TREE+= lld + +.if !defined(LLD_BUILDLINK3_MK) +LLD_BUILDLINK3_MK:= + +BUILDLINK_API_DEPENDS.lld+= lld>=7.0.0 +BUILDLINK_PKGSRCDIR.lld?= ../../devel/lld + +.include "../../lang/llvm/buildlink3.mk" +.endif # LLD_BUILDLINK3_MK + +BUILDLINK_TREE+= -lld diff --git a/devel/lld/distinfo b/devel/lld/distinfo new file mode 100644 index 000000000000..8dd803fe64ec --- /dev/null +++ b/devel/lld/distinfo @@ -0,0 +1,18 @@ +$NetBSD: distinfo,v 1.1 2019/02/01 16:30:00 mgorny Exp $ + +SHA1 (lld-7.0.1.src.tar.xz) = 3b69e107f27d466488838d5fa65bdfd77b885007 +RMD160 (lld-7.0.1.src.tar.xz) = 44e0e851b957fef86352ebe6c2a37096f8595dcb +SHA512 (lld-7.0.1.src.tar.xz) = e5d3ed280d8ac6014cd6bbe080b11e2c4ebbae81dc14b637e779ec027d818dbae91c6f0de9e94bcecd6bdaa37f12c35141b5d81f0a15251d27932aa9bebd4047 +Size (lld-7.0.1.src.tar.xz) = 912812 bytes +SHA1 (llvm-7.0.1.src.tar.xz) = f97632fcc3186eb0d396492ef8acfc807648580f +RMD160 (llvm-7.0.1.src.tar.xz) = dae96c6f85afb60e73564dc40d02171d01ffdb8f +SHA512 (llvm-7.0.1.src.tar.xz) = ac43a3cb71a53deb55e3693653847cf20bf6f5d9056f224e6956c96d63bc59ebee9404f088eec9cabe65337b4607a905ef931354b373cf64e0004c6905a6b5df +Size (llvm-7.0.1.src.tar.xz) = 28311056 bytes +SHA1 (patch-CMakeLists.txt) = df8e32f5f23bf2f2615a891177f61dc65359e955 +SHA1 (patch-ELF_Config.h) = 767eebd5787ae5351e3275f7d6666cd905f34f05 +SHA1 (patch-ELF_Driver.cpp) = d3ba099bf4a72a90cb126a6da4af9bdc7b97ba70 +SHA1 (patch-ELF_Driver.h) = e100fb0c86cc7d20b0f64919e73888a81a4836df +SHA1 (patch-ELF_Options.td) = c8107a2c599b2444e52bdefe5f2dc539d277a092 +SHA1 (patch-ELF_Writer.cpp) = ab4ca25f832f20a5b4c80fe0f5f28822c09fb4ee +SHA1 (patch-docs_ld.lld.1) = d61a228b5eb760a0ac4f691b9001d5505ebfe6ed +SHA1 (patch-test_ELF_gnustack.s) = b3827436dcfc67d51b8d293b11538808537ddeec diff --git a/devel/lld/options.mk b/devel/lld/options.mk new file mode 100644 index 000000000000..ceaf15453900 --- /dev/null +++ b/devel/lld/options.mk @@ -0,0 +1,20 @@ +# $NetBSD: options.mk,v 1.1 2019/02/01 16:30:00 mgorny Exp $ + +PKG_OPTIONS_VAR= PKG_OPTIONS.lld +PKG_SUPPORTED_OPTIONS= tests + +.include "../../mk/bsd.options.mk" + +.if !empty(PKG_OPTIONS:Mtests) +DISTFILES+= llvm-${PKGVERSION_NOREV}.src${EXTRACT_SUFX} +CMAKE_ARGS+= -DLLVM_CONFIG_PATH=${LLVM_CONFIG_PATH:Q} +CMAKE_ARGS+= -DLLVM_INCLUDE_TESTS=ON +CMAKE_ARGS+= -DLLVM_BUILD_TESTS=ON +CMAKE_ARGS+= -DLLVM_MAIN_SRC_DIR=${WRKDIR}/llvm-${PKGVERSION_NOREV}.src +CMAKE_ARGS+= -DLLVM_EXTERNAL_LIT=${WRKDIR}/llvm-${PKGVERSION_NOREV}.src/utils/lit/lit.py +REPLACE_PYTHON+= ${WRKDIR}/llvm-${PKGVERSION_NOREV}.src/utils/lit/lit.py +TEST_TARGET= check-lld # failing tests fixed in 8.0 +TEST_ENV+= LD_LIBRARY_PATH=${WRKDIR}/build/lib +.else +CMAKE_ARGS+= -DLLVM_INCLUDE_TESTS=OFF +.endif diff --git a/devel/lld/patches/patch-CMakeLists.txt b/devel/lld/patches/patch-CMakeLists.txt new file mode 100644 index 000000000000..211f3f1cfaae --- /dev/null +++ b/devel/lld/patches/patch-CMakeLists.txt @@ -0,0 +1,16 @@ +$NetBSD: patch-CMakeLists.txt,v 1.1 2019/02/01 16:30:00 mgorny Exp $ + +LLD 7.0.1 is incompatible with gtest version in pkgsrc. Remove +the condition that prevents it from building its own copy when system +version is installed. + +--- CMakeLists.txt.orig 2017-11-17 18:14:09.000000000 +0000 ++++ CMakeLists.txt +@@ -86,7 +86,6 @@ Please install Python or specify the PYT + endif() + set(UNITTEST_DIR ${LLVM_MAIN_SRC_DIR}/utils/unittest) + if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h +- AND NOT EXISTS ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX} + AND EXISTS ${UNITTEST_DIR}/CMakeLists.txt) + add_subdirectory(${UNITTEST_DIR} utils/unittest) + endif() diff --git a/devel/lld/patches/patch-ELF_Config.h b/devel/lld/patches/patch-ELF_Config.h new file mode 100644 index 000000000000..8ae8e2dff8b8 --- /dev/null +++ b/devel/lld/patches/patch-ELF_Config.h @@ -0,0 +1,37 @@ +$NetBSD: patch-ELF_Config.h,v 1.1 2019/02/01 16:30:00 mgorny Exp $ + +Add support for customizing LLD behavior on target triple. +https://reviews.llvm.org/D56650 + +Add '-z nognustack' option to disable emitting PT_GNU_STACK. +https://reviews.llvm.org/D56554 + +--- ELF/Config.h.orig 2018-07-31 13:41:59.000000000 +0000 ++++ ELF/Config.h +@@ -14,6 +14,7 @@ + #include "llvm/ADT/MapVector.h" + #include "llvm/ADT/StringRef.h" + #include "llvm/ADT/StringSet.h" ++#include "llvm/ADT/Triple.h" + #include "llvm/BinaryFormat/ELF.h" + #include "llvm/Support/CachePruning.h" + #include "llvm/Support/CodeGen.h" +@@ -185,6 +186,7 @@ struct Configuration { + bool ZKeepTextSectionPrefix; + bool ZNodelete; + bool ZNodlopen; ++ bool ZNognustack; + bool ZNow; + bool ZOrigin; + bool ZRelro; +@@ -267,6 +269,10 @@ struct Configuration { + + // 4 for ELF32, 8 for ELF64. + int Wordsize; ++ ++ // Target triple, inferred from program name or defaulted to LLVM ++ // default target. ++ llvm::Triple TargetTriple; + }; + + // The only instance of Configuration struct. diff --git a/devel/lld/patches/patch-ELF_Driver.cpp b/devel/lld/patches/patch-ELF_Driver.cpp new file mode 100644 index 000000000000..01f9667da86f --- /dev/null +++ b/devel/lld/patches/patch-ELF_Driver.cpp @@ -0,0 +1,231 @@ +$NetBSD: patch-ELF_Driver.cpp,v 1.1 2019/02/01 16:30:00 mgorny Exp $ + +Add support for customizing LLD behavior on target triple. +https://reviews.llvm.org/D56650 + +Add '-z nognustack' option to disable emitting PT_GNU_STACK. +https://reviews.llvm.org/D56554 + +Alter defaults for NetBSD targets: +* add default library search paths +* force combined RO+RW segment due to ld.elf_so limitations +* disable PT_GNU_STACK (meaningless on NetBSD) +* disable 'new dtags', i.e. force RPATH instead of RUNPATH + +--- ELF/Driver.cpp.orig 2018-07-31 21:58:26.000000000 +0000 ++++ ELF/Driver.cpp +@@ -54,6 +54,7 @@ + #include "llvm/Support/LEB128.h" + #include "llvm/Support/Path.h" + #include "llvm/Support/TarWriter.h" ++#include "llvm/Support/TargetRegistry.h" + #include "llvm/Support/TargetSelect.h" + #include "llvm/Support/raw_ostream.h" + #include +@@ -309,6 +310,9 @@ static void checkOptions(opt::InputArgLi + + if (Config->SingleRoRx && !Script->HasSectionsCommand) + error("-execute-only and -no-rosegment cannot be used together"); ++ } else if (Config->TargetTriple.isOSNetBSD()) { ++ // force-disable RO segment on NetBSD due to ld.elf_so limitations ++ Config->SingleRoRx = true; + } + } + +@@ -341,7 +345,7 @@ static bool isKnown(StringRef S) { + S == "execstack" || S == "hazardplt" || S == "initfirst" || + S == "keep-text-section-prefix" || S == "lazy" || S == "muldefs" || + S == "nocombreloc" || S == "nocopyreloc" || S == "nodelete" || +- S == "nodlopen" || S == "noexecstack" || ++ S == "nodlopen" || S == "noexecstack" || S == "nognustack" || + S == "nokeep-text-section-prefix" || S == "norelro" || S == "notext" || + S == "now" || S == "origin" || S == "relro" || S == "retpolineplt" || + S == "rodynamic" || S == "text" || S == "wxneeded" || +@@ -355,6 +359,56 @@ static void checkZOptions(opt::InputArgL + error("unknown -z value: " + StringRef(Arg->getValue())); + } + ++void LinkerDriver::appendDefaultSearchPaths() { ++ if (Config->TargetTriple.isOSNetBSD()) { ++ // NetBSD driver relies on the linker knowing the default search paths. ++ // Please keep this in sync with clang/lib/Driver/ToolChains/NetBSD.cpp ++ // (NetBSD::NetBSD constructor) ++ switch (Config->TargetTriple.getArch()) { ++ case llvm::Triple::x86: ++ Config->SearchPaths.push_back("=/usr/lib/i386"); ++ break; ++ case llvm::Triple::arm: ++ case llvm::Triple::armeb: ++ case llvm::Triple::thumb: ++ case llvm::Triple::thumbeb: ++ switch (Config->TargetTriple.getEnvironment()) { ++ case llvm::Triple::EABI: ++ case llvm::Triple::GNUEABI: ++ Config->SearchPaths.push_back("=/usr/lib/eabi"); ++ break; ++ case llvm::Triple::EABIHF: ++ case llvm::Triple::GNUEABIHF: ++ Config->SearchPaths.push_back("=/usr/lib/eabihf"); ++ break; ++ default: ++ Config->SearchPaths.push_back("=/usr/lib/oabi"); ++ break; ++ } ++ break; ++#if 0 // TODO ++ case llvm::Triple::mips64: ++ case llvm::Triple::mips64el: ++ if (tools::mips::hasMipsAbiArg(Args, "o32")) ++ Config->SearchPaths.push_back("=/usr/lib/o32"); ++ else if (tools::mips::hasMipsAbiArg(Args, "64")) ++ Config->SearchPaths.push_back("=/usr/lib/64"); ++ break; ++#endif ++ case llvm::Triple::ppc: ++ Config->SearchPaths.push_back("=/usr/lib/powerpc"); ++ break; ++ case llvm::Triple::sparc: ++ Config->SearchPaths.push_back("=/usr/lib/sparc"); ++ break; ++ default: ++ break; ++ } ++ ++ Config->SearchPaths.push_back("=/usr/lib"); ++ } ++} ++ + void LinkerDriver::main(ArrayRef ArgsArr) { + ELFOptTable Parser; + opt::InputArgList Args = Parser.parse(ArgsArr.slice(1)); +@@ -368,6 +422,29 @@ void LinkerDriver::main(ArrayRef> ErrOrWriter = ++ TarWriter::create(Path, path::stem(Path)); ++ if (ErrOrWriter) { ++ Tar = ErrOrWriter->get(); ++ Tar->append("response.txt", createResponseFile(Args)); ++ Tar->append("version.txt", getLLDVersion() + "\n"); ++ make>(std::move(*ErrOrWriter)); ++ } else { ++ error(Twine("--reproduce: failed to open ") + Path + ": " + ++ toString(ErrOrWriter.takeError())); ++ } ++ } ++ ++ ++ initLLVM(); ++ setTargetTriple(ArgsArr[0], Args); ++ readConfigs(Args); ++ checkZOptions(Args); ++ appendDefaultSearchPaths(); ++ + // Handle -v or -version. + // + // A note about "compatible with GNU linkers" message: this is a hack for +@@ -383,8 +460,10 @@ void LinkerDriver::main(ArrayRefTargetTriple.str()); ++ } + + // The behavior of -v or --version is a bit strange, but this is + // needed for compatibility with GNU linkers. +@@ -393,25 +472,6 @@ void LinkerDriver::main(ArrayRef> ErrOrWriter = +- TarWriter::create(Path, path::stem(Path)); +- if (ErrOrWriter) { +- Tar = ErrOrWriter->get(); +- Tar->append("response.txt", createResponseFile(Args)); +- Tar->append("version.txt", getLLDVersion() + "\n"); +- make>(std::move(*ErrOrWriter)); +- } else { +- error(Twine("--reproduce: failed to open ") + Path + ": " + +- toString(ErrOrWriter.takeError())); +- } +- } +- +- readConfigs(Args); +- checkZOptions(Args); +- initLLVM(); + createFiles(Args); + if (errorCount()) + return; +@@ -725,6 +785,34 @@ static void parseClangOption(StringRef O + error(Msg + ": " + StringRef(Err).trim()); + } + ++void LinkerDriver::setTargetTriple(StringRef argv0, opt::InputArgList &Args) { ++ std::string TargetError; ++ ++ // Firstly, see if user specified explicit --target ++ StringRef TargetOpt = Args.getLastArgValue(OPT_target); ++ if (!TargetOpt.empty()) { ++ if (llvm::TargetRegistry::lookupTarget(TargetOpt, TargetError)) { ++ Config->TargetTriple = llvm::Triple(TargetOpt); ++ return; ++ } else ++ error("Unsupported --target=" + TargetOpt + ": " + TargetError); ++ } ++ ++ // Secondly, try to get it from program name prefix ++ std::string ProgName = llvm::sys::path::stem(argv0); ++ size_t LastComponent = ProgName.rfind('-'); ++ if (LastComponent != std::string::npos) { ++ std::string Prefix = ProgName.substr(0, LastComponent); ++ if (llvm::TargetRegistry::lookupTarget(Prefix, TargetError)) { ++ Config->TargetTriple = llvm::Triple(Prefix); ++ return; ++ } ++ } ++ ++ // Finally, use the default target triple ++ Config->TargetTriple = llvm::Triple(getDefaultTargetTriple()); ++} ++ + // Initializes Config members by the command line options. + void LinkerDriver::readConfigs(opt::InputArgList &Args) { + errorHandler().Verbose = Args.hasArg(OPT_verbose); +@@ -755,7 +843,8 @@ void LinkerDriver::readConfigs(opt::Inpu + Args.hasFlag(OPT_eh_frame_hdr, OPT_no_eh_frame_hdr, false); + Config->EmitRelocs = Args.hasArg(OPT_emit_relocs); + Config->EnableNewDtags = +- Args.hasFlag(OPT_enable_new_dtags, OPT_disable_new_dtags, true); ++ Args.hasFlag(OPT_enable_new_dtags, OPT_disable_new_dtags, ++ !Config->TargetTriple.isOSNetBSD()); + Config->Entry = Args.getLastArgValue(OPT_entry); + Config->ExecuteOnly = + Args.hasFlag(OPT_execute_only, OPT_no_execute_only, false); +@@ -842,6 +931,8 @@ void LinkerDriver::readConfigs(opt::Inpu + Config->ZCombreloc = getZFlag(Args, "combreloc", "nocombreloc", true); + Config->ZCopyreloc = getZFlag(Args, "copyreloc", "nocopyreloc", true); + Config->ZExecstack = getZFlag(Args, "execstack", "noexecstack", false); ++ Config->ZNognustack = hasZOption(Args, "nognustack") || ++ Config->TargetTriple.isOSNetBSD(); + Config->ZHazardplt = hasZOption(Args, "hazardplt"); + Config->ZInitfirst = hasZOption(Args, "initfirst"); + Config->ZKeepTextSectionPrefix = getZFlag( +@@ -1137,7 +1228,7 @@ void LinkerDriver::inferMachineType() { + // each target. + static uint64_t getMaxPageSize(opt::InputArgList &Args) { + uint64_t Val = args::getZOptionValue(Args, OPT_z, "max-page-size", +- Target->DefaultMaxPageSize); ++ lld::elf::Target->DefaultMaxPageSize); + if (!isPowerOf2_64(Val)) + error("max-page-size: value isn't a power of 2"); + return Val; diff --git a/devel/lld/patches/patch-ELF_Driver.h b/devel/lld/patches/patch-ELF_Driver.h new file mode 100644 index 000000000000..560609c3f994 --- /dev/null +++ b/devel/lld/patches/patch-ELF_Driver.h @@ -0,0 +1,20 @@ +$NetBSD: patch-ELF_Driver.h,v 1.1 2019/02/01 16:30:00 mgorny Exp $ + +Add support for customizing LLD behavior on target triple. +https://reviews.llvm.org/D56650 + +Alter defaults for NetBSD targets: +* add default library search paths + +--- ELF/Driver.h.orig 2018-07-25 21:53:18.000000000 +0000 ++++ ELF/Driver.h +@@ -31,7 +31,9 @@ public: + void addLibrary(StringRef Name); + + private: ++ void setTargetTriple(StringRef argv0, llvm::opt::InputArgList &Args); + void readConfigs(llvm::opt::InputArgList &Args); ++ void appendDefaultSearchPaths(); + void createFiles(llvm::opt::InputArgList &Args); + void inferMachineType(); + template void link(llvm::opt::InputArgList &Args); diff --git a/devel/lld/patches/patch-ELF_Options.td b/devel/lld/patches/patch-ELF_Options.td new file mode 100644 index 000000000000..e7dd202bb8b9 --- /dev/null +++ b/devel/lld/patches/patch-ELF_Options.td @@ -0,0 +1,16 @@ +$NetBSD: patch-ELF_Options.td,v 1.1 2019/02/01 16:30:00 mgorny Exp $ + +Add support for customizing LLD behavior on target triple. +https://reviews.llvm.org/D56650 + +--- ELF/Options.td.orig 2018-07-30 17:36:38.000000000 +0000 ++++ ELF/Options.td +@@ -303,6 +303,8 @@ defm symbol_ordering_file: + + defm sysroot: Eq<"sysroot", "Set the system root">; + ++defm target: Eq<"target", "Apply configuration defaults for a given target">; ++ + def target1_rel: F<"target1-rel">, HelpText<"Interpret R_ARM_TARGET1 as R_ARM_REL32">; + + def target1_abs: F<"target1-abs">, HelpText<"Interpret R_ARM_TARGET1 as R_ARM_ABS32 (default)">; diff --git a/devel/lld/patches/patch-ELF_Writer.cpp b/devel/lld/patches/patch-ELF_Writer.cpp new file mode 100644 index 000000000000..469e4d3fcfd0 --- /dev/null +++ b/devel/lld/patches/patch-ELF_Writer.cpp @@ -0,0 +1,35 @@ +$NetBSD: patch-ELF_Writer.cpp,v 1.1 2019/02/01 16:30:00 mgorny Exp $ + +Add '-z nognustack' option to disable emitting PT_GNU_STACK. +https://reviews.llvm.org/D56554 + +Alter defaults for NetBSD targets: +* disable PT_GNU_STACK (meaningless on NetBSD) + +--- ELF/Writer.cpp.orig 2018-10-31 17:14:17.000000000 +0000 ++++ ELF/Writer.cpp +@@ -1881,14 +1881,16 @@ template std::vectorgetPhdrFlags())->add(Cmd); + +- // PT_GNU_STACK is a special section to tell the loader to make the +- // pages for the stack non-executable. If you really want an executable +- // stack, you can pass -z execstack, but that's not recommended for +- // security reasons. +- unsigned Perm = PF_R | PF_W; +- if (Config->ZExecstack) +- Perm |= PF_X; +- AddHdr(PT_GNU_STACK, Perm)->p_memsz = Config->ZStackSize; ++ if (!Config->ZNognustack) { ++ // PT_GNU_STACK is a special section to tell the loader to make the ++ // pages for the stack non-executable. If you really want an executable ++ // stack, you can pass -z execstack, but that's not recommended for ++ // security reasons. ++ unsigned Perm = PF_R | PF_W; ++ if (Config->ZExecstack) ++ Perm |= PF_X; ++ AddHdr(PT_GNU_STACK, Perm)->p_memsz = Config->ZStackSize; ++ } + + // PT_OPENBSD_WXNEEDED is a OpenBSD-specific header to mark the executable + // is expected to perform W^X violations, such as calling mprotect(2) or diff --git a/devel/lld/patches/patch-docs_ld.lld.1 b/devel/lld/patches/patch-docs_ld.lld.1 new file mode 100644 index 000000000000..767f2be6b29a --- /dev/null +++ b/devel/lld/patches/patch-docs_ld.lld.1 @@ -0,0 +1,18 @@ +$NetBSD: patch-docs_ld.lld.1,v 1.1 2019/02/01 16:30:00 mgorny Exp $ + +Add '-z nognustack' option to disable emitting PT_GNU_STACK. +https://reviews.llvm.org/D56554 + +--- docs/ld.lld.1.orig 2018-07-30 23:07:44.000000000 +0000 ++++ docs/ld.lld.1 +@@ -462,6 +462,10 @@ Set the + .Dv DF_1_NOOPEN + flag to indcate that the object may not be opened by + .Xr dlopen 3 . ++.It Cm nognustack ++Do not emit the ++.Dv PT_GNU_STACK ++segment. + .It Cm norelro + Do not indicate that portions of the object shold be mapped read-only + after initial relocation processing. diff --git a/devel/lld/patches/patch-test_ELF_gnustack.s b/devel/lld/patches/patch-test_ELF_gnustack.s new file mode 100644 index 000000000000..9b697c2705bd --- /dev/null +++ b/devel/lld/patches/patch-test_ELF_gnustack.s @@ -0,0 +1,25 @@ +$NetBSD: patch-test_ELF_gnustack.s,v 1.1 2019/02/01 16:30:00 mgorny Exp $ + +Add '-z nognustack' option to disable emitting PT_GNU_STACK. +https://reviews.llvm.org/D56554 + +--- test/ELF/gnustack.s.orig 2018-04-20 21:24:08.000000000 +0000 ++++ test/ELF/gnustack.s +@@ -10,6 +10,9 @@ + # RUN: ld.lld %t1 -o %t -z noexecstack + # RUN: llvm-readobj --program-headers -s %t | FileCheck --check-prefix=RW %s + ++# RUN: ld.lld %t1 -o %t -z nognustack ++# RUN: llvm-readobj --program-headers -s %t | FileCheck --check-prefix=NOGNUSTACK %s ++ + # RW: Type: PT_GNU_STACK + # RW-NEXT: Offset: 0x0 + # RW-NEXT: VirtualAddress: 0x0 +@@ -35,5 +38,7 @@ + # RWX-NEXT: ] + # RWX-NEXT: Alignment: 0 + ++# NOGNUSTACK-NOT: Type: PT_GNU_STACK ++ + .globl _start + _start: