Skip to content

Commit

Permalink
support lief 0.14.1
Browse files Browse the repository at this point in the history
  • Loading branch information
5c4lar committed Apr 11, 2024
1 parent 813a66d commit babbae0
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 35 deletions.
31 changes: 18 additions & 13 deletions src/gtirb-builder/ElfReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,8 @@ void ElfReader::resurrectSymbols()
auto Iter = Bytes.begin();

// Extract a string at the given Index in STRTAB
auto getStringAt = [&StrTabBytes](uint32_t Index) {
auto getStringAt = [&StrTabBytes](uint32_t Index)
{
std::stringstream SS;
auto It = StrTabBytes.begin() + Index;
while(It != StrTabBytes.end())
Expand All @@ -393,7 +394,7 @@ void ElfReader::resurrectSymbols()
{
LIEF::Convert::swap_endian<LIEF::ELF::details::Elf32_Sym>(P);
}
LIEF::ELF::Symbol Symbol(*P);
LIEF::ELF::Symbol Symbol(*P, Elf->header().machine_type());
std::string Name = getStringAt(S.st_name);
Symbol.name(Name);
Elf->add_dynamic_symbol(Symbol);
Expand Down Expand Up @@ -464,7 +465,8 @@ static bool buildArm32ArchInfo(gtirb::Section *S, std::map<std::string, std::str
{'S', "System"},
};

auto readUleb128 = [](const unsigned char *Ptr, unsigned int *len_out) {
auto readUleb128 = [](const unsigned char *Ptr, unsigned int *len_out)
{
uint64_t Ans = 0;
unsigned int NRead = 0;
int Shift = 0;
Expand Down Expand Up @@ -727,7 +729,8 @@ void ElfReader::buildSections()
// Add `overlay` aux data table.
if(auto Overlay = Elf->overlay(); Overlay.size() > 0)
{
Module->addAuxData<gtirb::schema::Overlay>(std::move(Overlay));
Module->addAuxData<gtirb::schema::Overlay>(
gtirb::schema::Overlay::Type{Overlay.begin(), Overlay.end()});
}

Module->addAuxData<gtirb::schema::Alignment>(std::move(Alignment));
Expand Down Expand Up @@ -924,7 +927,8 @@ void ElfReader::buildSymbols()
}
}

auto LoadSymbols = [&](auto SymbolIt, std::string TableName) {
auto LoadSymbols = [&](auto SymbolIt, std::string TableName)
{
uint64_t TableIndex = 0;
for(auto &Symbol : SymbolIt)
{
Expand Down Expand Up @@ -1030,11 +1034,13 @@ const LIEF::ELF::Section *ElfReader::findRelocationSection(const LIEF::ELF::Relo
else
{
auto Section =
std::find_if(Elf->sections().begin(), Elf->sections().end(), [Address](auto &S) {
return (Address >= S.virtual_address()
&& Address < (S.virtual_address() + S.size()))
&& (S.type() != LIEF::ELF::ELF_SECTION_TYPES::SHT_NOBITS);
});
std::find_if(Elf->sections().begin(), Elf->sections().end(),
[Address](auto &S)
{
return (Address >= S.virtual_address()
&& Address < (S.virtual_address() + S.size()))
&& (S.type() != LIEF::ELF::ELF_SECTION_TYPES::SHT_NOBITS);
});
if(Section != Elf->sections().end())
return &(*Section);
else
Expand Down Expand Up @@ -1082,9 +1088,8 @@ std::string ElfReader::inferDynMode()

// Executables should include a `INTERP` segment.
// If there is no `INTERP` segment, it should be Shared.
auto InterpSegment = std::find_if(Elf->segments().begin(), Elf->segments().end(), [](auto &S) {
return S.type() == LIEF::ELF::SEGMENT_TYPES::PT_INTERP;
});
auto InterpSegment = std::find_if(Elf->segments().begin(), Elf->segments().end(), [](auto &S)
{ return S.type() == LIEF::ELF::SEGMENT_TYPES::PT_INTERP; });
if(InterpSegment == Elf->segments().end())
{
return DYN_MODE_SHARED;
Expand Down
23 changes: 13 additions & 10 deletions src/gtirb-builder/GtirbBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,13 @@ gtirb::ErrorOr<GTIRB> GtirbBuilder::read(std::string Path)
// is released.
std::shared_ptr<LIEF::Binary> Binary{
LIEF::ELF::is_elf(Path)
? LIEF::ELF::Parser::parse(Path, LIEF::ELF::DYNSYM_COUNT_METHODS::COUNT_SECTION)
? LIEF::ELF::Parser::parse(Path, LIEF::ELF::ParserConfig{.count_mtd=LIEF::ELF::DYNSYM_COUNT_METHODS::COUNT_SECTION})
: LIEF::Parser::parse(Path)};

// If the binary had no sections, parse again with AUTO count method.
if(LIEF::ELF::is_elf(Path) && Binary->sections().empty())
{
Binary = LIEF::ELF::Parser::parse(Path, LIEF::ELF::DYNSYM_COUNT_METHODS::COUNT_AUTO);
Binary = LIEF::ELF::Parser::parse(Path, LIEF::ELF::ParserConfig{.count_mtd=LIEF::ELF::DYNSYM_COUNT_METHODS::COUNT_AUTO});
}

if(!Binary)
Expand All @@ -65,20 +65,20 @@ gtirb::ErrorOr<GTIRB> GtirbBuilder::read(std::string Path)
// Build GTIRB from supported binary object formats.
switch(Binary->format())
{
case LIEF::EXE_FORMATS::FORMAT_ELF:
case LIEF::Binary::FORMATS::ELF:
{
ElfReader Elf(Path, fs::path(Path).filename().string(), Context, IR, Binary);
Elf.build();
break;
}
case LIEF::EXE_FORMATS::FORMAT_PE:
case LIEF::Binary::FORMATS::PE:
{
PeReader Pe(Path, fs::path(Path).filename().string(), Context, IR, Binary);
Pe.build();
break;
}
case LIEF::EXE_FORMATS::FORMAT_MACHO:
case LIEF::EXE_FORMATS::FORMAT_UNKNOWN:
case LIEF::Binary::FORMATS::MACHO:
case LIEF::Binary::FORMATS::UNKNOWN:
default:
return GtirbBuilder::build_error::NotSupported;
}
Expand All @@ -100,13 +100,16 @@ gtirb::ErrorOr<GTIRB> GtirbBuilder::read(std::string Path)
Archive.readFile(Object, ObjectData);

std::shared_ptr<LIEF::Binary> Binary{
LIEF::Parser::parse(ObjectData, Object.FileName)};
LIEF::Parser::parse(ObjectData)
};
// LIEF::Parser::parse(ObjectData, Object.FileName)};

if(!Binary)
{
return GtirbBuilder::build_error::ParseError;
}

if(Binary->format() != LIEF::EXE_FORMATS::FORMAT_ELF)
if(Binary->format() != LIEF::Binary::FORMATS::ELF)
{
return GtirbBuilder::build_error::NotSupported;
}
Expand Down Expand Up @@ -177,9 +180,9 @@ gtirb::FileFormat GtirbBuilder::format()
{
switch(Binary->format())
{
case LIEF::EXE_FORMATS::FORMAT_ELF:
case LIEF::Binary::FORMATS::ELF:
return gtirb::FileFormat::ELF;
case LIEF::EXE_FORMATS::FORMAT_PE:
case LIEF::Binary::FORMATS::PE:
return gtirb::FileFormat::PE;
default:
break;
Expand Down
24 changes: 12 additions & 12 deletions src/gtirb-builder/PeReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,14 @@ PeReader::PeReader(std::string Path, std::string Name, std::shared_ptr<gtirb::Co
void PeReader::build()
{
// TODO: Add support for Control Flow Guard.
if(Pe->optional_header().has(LIEF::PE::DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_GUARD_CF))
if(Pe->optional_header().has(LIEF::PE::OptionalHeader::DLL_CHARACTERISTICS::GUARD_CF))
{
std::cerr << "WARNING: Input binary has Control Flow Guard enabled. (unsupported)\n";
}
// TODO: Add support for Profile Guided Optimization (POGO).
for(const auto &Debug : Pe->debug())
{
if(Debug.has_pogo())
if(LIEF::PE::Debug::TYPES::POGO == Debug.type())
{
std::cerr << "WARNING: Input binary compiled with Profile Guided Optimization. "
"(unsupported)\n";
Expand All @@ -67,12 +67,12 @@ void PeReader::buildSections()

for(auto &Section : Pe->sections())
{
using Flags = LIEF::PE::SECTION_CHARACTERISTICS;
bool Executable = Section.has_characteristic(Flags::IMAGE_SCN_MEM_EXECUTE);
bool Readable = Section.has_characteristic(Flags::IMAGE_SCN_MEM_READ);
bool Writable = Section.has_characteristic(Flags::IMAGE_SCN_MEM_WRITE);
bool Initialized = !Section.has_characteristic(Flags::IMAGE_SCN_CNT_UNINITIALIZED_DATA);
bool Discardable = Section.has_characteristic(Flags::IMAGE_SCN_MEM_DISCARDABLE);
using Flags = LIEF::PE::Section::CHARACTERISTICS;
bool Executable = Section.has_characteristic(Flags::MEM_EXECUTE);
bool Readable = Section.has_characteristic(Flags::MEM_READ);
bool Writable = Section.has_characteristic(Flags::MEM_WRITE);
bool Initialized = !Section.has_characteristic(Flags::CNT_UNINITIALIZED_DATA);
bool Discardable = Section.has_characteristic(Flags::MEM_DISCARDABLE);
bool Allocated = Readable;

// Skip sections that are not loaded into memory.
Expand Down Expand Up @@ -170,7 +170,7 @@ void PeReader::addEntryBlock()
void PeReader::addAuxData()
{
// Add `binaryType' aux data table.
bool DLL = Pe->header().has_characteristic(LIEF::PE::HEADER_CHARACTERISTICS::IMAGE_FILE_DLL);
bool DLL = Pe->header().has_characteristic(LIEF::PE::Header::CHARACTERISTICS::DLL);
std::string Subsystem = LIEF::PE::to_string(Pe->optional_header().subsystem());
std::vector<std::string> BinaryType = {"EXEC", DLL ? "DLL" : "EXE", Subsystem};
Module->addAuxData<gtirb::schema::BinaryType>(std::move(BinaryType));
Expand Down Expand Up @@ -214,8 +214,8 @@ void PeReader::addAuxData()
{
std::map<std::string, uint64_t> PeLoadConfig;

LIEF::PE::WIN_VERSION Version = Pe->load_configuration()->version();
if(Version != LIEF::PE::WIN_VERSION::WIN_UNKNOWN)
LIEF::PE::LoadConfiguration::VERSION Version = Pe->load_configuration()->version();
if(Version != LIEF::PE::LoadConfiguration::VERSION::UNKNOWN)
{
auto *LoadConfiguration =
reinterpret_cast<LIEF::PE::LoadConfigurationV0 *>(Pe->load_configuration());
Expand Down Expand Up @@ -414,7 +414,7 @@ std::vector<auxdata::PeExportEntry> PeReader::exportEntries()
if(Pe->has_exports())
{
uint64_t ImageBase = Pe->optional_header().imagebase();
for(auto &Entry : Pe->get_export().entries())
for(auto &Entry : Pe->get_export()->entries())
{
ExportEntries.push_back({ImageBase + Entry.address(), Entry.ordinal(), Entry.name()});
}
Expand Down

0 comments on commit babbae0

Please sign in to comment.