ELF2: Implement --as-needed.
This patch adds AsNeeded and IsUsed bool fields to SharedFile. AsNeeded bit
is set if the DSO is enclosed with --as-needed and --no-as-needed. IsUsed
bit is off by default. When we adds a symbol to the symbol table for dynamic
linking, we set its SharedFile's IsUsed bit.
If AsNeeded is set but IsUsed is not set, we don't want to write that
file's SO name to DT_NEEDED field.
http://reviews.llvm.org/D13579
llvm-svn: 249998
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index aa37656..0e081d1 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -100,9 +100,12 @@
}
Files.push_back(make_unique<ArchiveFile>(MBRef));
return;
- case file_magic::elf_shared_object:
- Files.push_back(createELFFile<SharedFile>(MBRef));
+ case file_magic::elf_shared_object: {
+ std::unique_ptr<ELFFileBase> File = createELFFile<SharedFile>(MBRef);
+ cast<SharedFileBase>(File.get())->AsNeeded = Config->AsNeeded;
+ Files.push_back(std::move(File));
return;
+ }
default:
Files.push_back(createELFFile<ObjectFile>(MBRef));
}
@@ -187,6 +190,12 @@
case OPT_script:
addFile(Arg->getValue());
break;
+ case OPT_as_needed:
+ Config->AsNeeded = true;
+ break;
+ case OPT_no_as_needed:
+ Config->AsNeeded = false;
+ break;
case OPT_Bstatic:
Config->Static = true;
break;