Skip to content

Commit

Permalink
[ELF] - Fix for: bug 30237 - lld does not implement -f option
Browse files Browse the repository at this point in the history
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
  • Loading branch information
George Rimar committed Sep 2, 2016
1 parent ed27d69 commit b952ece
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 0 deletions.
1 change: 1 addition & 0 deletions lld/ELF/Config.h
Expand Up @@ -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;
Expand Down
5 changes: 5 additions & 0 deletions lld/ELF/Driver.cpp
Expand Up @@ -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());

Expand Down
3 changes: 3 additions & 0 deletions lld/ELF/Options.td
Expand Up @@ -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">,
Expand Down Expand Up @@ -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>;
Expand Down
2 changes: 2 additions & 0 deletions lld/ELF/OutputSections.cpp
Expand Up @@ -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)});
Expand Down
12 changes: 12 additions & 0 deletions lld/test/ELF/auxiliary.s
@@ -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

0 comments on commit b952ece

Please sign in to comment.