[lld] Keep full library path in DT_NEEDED.

Fixes PR32572.

When
    (a) a library has no soname
and (b) library is given on the command line with path (and not through -L/-l flags)
DT_NEEDED entry for such library keeps the path as given.

This behavior is consistent with gold and bfd, and is used in compiler-rt test suite.

This is a second attempt after r300007 got reverted. This time relro-omagic test is
changed in a way to avoid hardcoding the path to the test directory in the objdump'd
binary.

llvm-svn: 300011
This commit is contained in:
Evgeniy Stepanov
2017-04-12 00:13:48 +00:00
parent 13c8daf57a
commit a76349bffe
8 changed files with 54 additions and 13 deletions

View File

@@ -243,25 +243,26 @@ void ScriptParser::addFile(StringRef S) {
SmallString<128> PathData;
StringRef Path = (Config->Sysroot + S).toStringRef(PathData);
if (sys::fs::exists(Path)) {
Driver->addFile(Saver.save(Path));
Driver->addFile(Saver.save(Path), /*WithLOption=*/false);
return;
}
}
if (sys::path::is_absolute(S)) {
Driver->addFile(S);
Driver->addFile(S, /*WithLOption=*/false);
} else if (S.startswith("=")) {
if (Config->Sysroot.empty())
Driver->addFile(S.substr(1));
Driver->addFile(S.substr(1), /*WithLOption=*/false);
else
Driver->addFile(Saver.save(Config->Sysroot + "/" + S.substr(1)));
Driver->addFile(Saver.save(Config->Sysroot + "/" + S.substr(1)),
/*WithLOption=*/false);
} else if (S.startswith("-l")) {
Driver->addLibrary(S.substr(2));
} else if (sys::fs::exists(S)) {
Driver->addFile(S);
Driver->addFile(S, /*WithLOption=*/false);
} else {
if (Optional<std::string> Path = findFromSearchPaths(S))
Driver->addFile(Saver.save(*Path));
Driver->addFile(Saver.save(*Path), /*WithLOption=*/true);
else
setError("unable to find " + S);
}