mirror of
https://github.com/intel/llvm.git
synced 2026-02-01 17:07:36 +08:00
[ELF] - Fix for: bug 30237 - lld does not implement -f option
FreeBSD's libstdc++ build (used on tier-2 architectures) uses GNU ld's -f <name> option, which sets the DT_AUXILIARY field to the specified name. Multiple -f options may be specified and the DT_AUXILIARY entries will be added in the order in which they appear. Patch implements that option. Differential revision: https://reviews.llvm.org/D24139 llvm-svn: 280475
This commit is contained in:
@@ -76,6 +76,7 @@ struct Configuration {
|
||||
llvm::StringRef Sysroot;
|
||||
std::string RPath;
|
||||
std::vector<VersionDefinition> VersionDefinitions;
|
||||
std::vector<llvm::StringRef> AuxiliaryList;
|
||||
std::vector<llvm::StringRef> DynamicList;
|
||||
std::vector<llvm::StringRef> SearchPaths;
|
||||
std::vector<llvm::StringRef> Undefined;
|
||||
|
||||
@@ -490,6 +490,11 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) {
|
||||
|
||||
Config->OFormatBinary = isOutputFormatBinary(Args);
|
||||
|
||||
for (auto *Arg : Args.filtered(OPT_auxiliary))
|
||||
Config->AuxiliaryList.push_back(Arg->getValue());
|
||||
if (!Config->Shared && !Config->AuxiliaryList.empty())
|
||||
error("-f may not be used without -shared");
|
||||
|
||||
for (auto *Arg : Args.filtered(OPT_undefined))
|
||||
Config->Undefined.push_back(Arg->getValue());
|
||||
|
||||
|
||||
@@ -7,6 +7,8 @@ class J<string name>: Joined<["--", "-"], name>;
|
||||
class S<string name>: Separate<["--", "-"], name>;
|
||||
class JS<string name>: JoinedOrSeparate<["--", "-"], name>;
|
||||
|
||||
def auxiliary: S<"auxiliary">, HelpText<"Set DT_AUXILIARY field to the specified name">;
|
||||
|
||||
def Bsymbolic: F<"Bsymbolic">, HelpText<"Bind defined symbols locally">;
|
||||
|
||||
def Bsymbolic_functions: F<"Bsymbolic-functions">,
|
||||
@@ -188,6 +190,7 @@ def z: JoinedOrSeparate<["-"], "z">, MetaVarName<"<option>">,
|
||||
HelpText<"Linker option extensions">;
|
||||
|
||||
// Aliases
|
||||
def alias_auxiliary: Separate<["-"], "f">, Alias<auxiliary>;
|
||||
def alias_Bdynamic_call_shared: F<"call_shared">, Alias<Bdynamic>;
|
||||
def alias_Bdynamic_dy: F<"dy">, Alias<Bdynamic>;
|
||||
def alias_Bstatic_dn: F<"dn">, Alias<Bstatic>;
|
||||
|
||||
@@ -650,6 +650,8 @@ template <class ELFT> void DynamicSection<ELFT>::finalize() {
|
||||
|
||||
// Add strings. We know that these are the last strings to be added to
|
||||
// DynStrTab and doing this here allows this function to set DT_STRSZ.
|
||||
for (StringRef S : Config->AuxiliaryList)
|
||||
Add({DT_AUXILIARY, Out<ELFT>::DynStrTab->addString(S)});
|
||||
if (!Config->RPath.empty())
|
||||
Add({Config->EnableNewDtags ? DT_RUNPATH : DT_RPATH,
|
||||
Out<ELFT>::DynStrTab->addString(Config->RPath)});
|
||||
|
||||
12
lld/test/ELF/auxiliary.s
Normal file
12
lld/test/ELF/auxiliary.s
Normal file
@@ -0,0 +1,12 @@
|
||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
|
||||
# RUN: ld.lld %t.o -shared -f aaa --auxiliary bbb -o %t
|
||||
# RUN: llvm-readobj --dynamic-table %t | FileCheck %s
|
||||
|
||||
# CHECK: DynamicSection [
|
||||
# CHECK-NEXT: Tag Type Name/Value
|
||||
# CHECK-NEXT: 0x000000007FFFFFFD AUXILIARY Auxiliary library: [aaa]
|
||||
# CHECK-NEXT: 0x000000007FFFFFFD AUXILIARY Auxiliary library: [bbb]
|
||||
|
||||
# RUN: not ld.lld %t.o -f aaa --auxiliary bbb -o %t 2>&1 \
|
||||
# RUN: | FileCheck -check-prefix=ERR %s
|
||||
# ERR: -f may not be used without -shared
|
||||
Reference in New Issue
Block a user