Browse Source

Added reading of dependencies of ELF libraries.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/305/head
Dimitar Dobrev 11 years ago
parent
commit
798e086ef9
  1. 24
      src/CppParser/Parser.cpp
  2. 24
      src/Generator.Tests/ParseELFTest.cs
  3. BIN
      tests/Native/ls

24
src/CppParser/Parser.cpp

@ -3015,6 +3015,14 @@ ParserResultKind Parser::ParseArchive(llvm::StringRef File, @@ -3015,6 +3015,14 @@ ParserResultKind Parser::ParseArchive(llvm::StringRef File,
return ParserResultKind::Success;
}
template<class ELFT>
void ReadELFDependencies(const llvm::object::ELFFile<ELFT>* ELFFile, CppSharp::CppParser::NativeLibrary*& NativeLib)
{
for (const auto &Entry : ELFFile->dynamic_table())
if (Entry.d_tag == llvm::ELF::DT_NEEDED)
NativeLib->Dependencies.push_back(ELFFile->getDynamicString(Entry.d_un.d_val));
}
ParserResultKind Parser::ParseSharedLib(llvm::StringRef File,
llvm::object::ObjectFile* ObjectFile,
CppSharp::CppParser::NativeLibrary*& NativeLib)
@ -3038,6 +3046,22 @@ ParserResultKind Parser::ParseSharedLib(llvm::StringRef File, @@ -3038,6 +3046,22 @@ ParserResultKind Parser::ParseSharedLib(llvm::StringRef File,
if (!Sym.empty())
NativeLib->Symbols.push_back(Sym);
}
if (auto ELFObjectFile = llvm::dyn_cast<llvm::object::ELF32LEObjectFile>(ObjectFile))
{
ReadELFDependencies(ELFObjectFile->getELFFile(), NativeLib);
}
else if (auto ELFObjectFile = llvm::dyn_cast<llvm::object::ELF32BEObjectFile>(ObjectFile))
{
ReadELFDependencies(ELFObjectFile->getELFFile(), NativeLib);
}
else if (auto ELFObjectFile = llvm::dyn_cast<llvm::object::ELF64LEObjectFile>(ObjectFile))
{
ReadELFDependencies(ELFObjectFile->getELFFile(), NativeLib);
}
else if (auto ELFObjectFile = llvm::dyn_cast<llvm::object::ELF64BEObjectFile>(ObjectFile))
{
ReadELFDependencies(ELFObjectFile->getELFFile(), NativeLib);
}
}
else
{

24
src/Generator.Tests/ParseELFTest.cs

@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
using CppSharp.Utils;
using NUnit.Framework;
namespace CppSharp.Generator.Tests
{
[TestFixture]
public class ParseELFTest
{
[Test]
public void TestParseELF()
{
var driverOptions = new DriverOptions();
driverOptions.addLibraryDirs(GeneratorTest.GetTestsDirectory("Native"));
driverOptions.Libraries.Add("ls");
var driver = new Driver(driverOptions, new TextDiagnosticPrinter());
Assert.IsTrue(driver.ParseLibraries());
var dependencies = driver.Symbols.Libraries[0].Dependencies;
Assert.AreEqual("libselinux.so.1", dependencies[0]);
Assert.AreEqual("librt.so.1", dependencies[1]);
Assert.AreEqual("libacl.so.1", dependencies[2]);
Assert.AreEqual("libc.so.6", dependencies[3]);
}
}
}

BIN
tests/Native/ls

Binary file not shown.
Loading…
Cancel
Save