Files
UnrealEngine/Engine/Source/Programs/UnrealBuildAccelerator/Common/Private/UbaObjectFileImportLib.cpp
2025-05-18 13:04:45 +08:00

69 lines
1.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "UbaObjectFileImportLib.h"
namespace uba
{
bool IsImportLib(const u8* data, u64 dataSize)
{
return dataSize > 5 && memcmp(data, "!<arch>", 5) == 0;
}
bool ObjectFileImportLib::Parse(Logger& logger, ObjectFileParseMode parseMode, const tchar* hint)
{
#if PLATFORM_WINDOWS
u8* pos = m_data;
pos += IMAGE_ARCHIVE_START_SIZE;
//auto& header = *(IMAGE_ARCHIVE_MEMBER_HEADER*)pos;
pos += sizeof(IMAGE_ARCHIVE_MEMBER_HEADER);
u32 symbolCount = _byteswap_ulong(*(u32*)pos);
pos += sizeof(u32);
u32* symbolOffsets = (u32*)pos;
pos += sizeof(u32)*symbolCount;
Vector<StringKey> impSymbols;
for (u32 i=0; i!=symbolCount; ++i)
{
u32 symbolOffset = _byteswap_ulong(symbolOffsets[i]);(void)symbolOffset;
auto symbolStr = (char*)pos;
std::string symbol(symbolStr);
pos += symbol.size() + 1;
if (i == 0)
{
m_libName = symbol.data() + strlen("__IMPORT_DESCRIPTOR_");
}
if (i < 3) // Skip the predefined symbols
continue;
if (strncmp(symbol.data(), "__imp_", 6) == 0)
{
//impSymbols.push_back(symbolStr + 6);
impSymbols.push_back(ToStringKeyRaw(symbolStr + 6, symbol.size() - 6));
continue;
}
StringKey key = ToStringKeyRaw(symbol.data(), symbol.size());
m_exports.try_emplace(key, ExportInfo{ std::move(symbol), true, i });
}
for (auto& symbol : impSymbols)
{
auto findIt = m_exports.find(symbol);
if (findIt != m_exports.end())
findIt->second.isData = false;
}
return true;
#else
return false;
#endif
}
const char* ObjectFileImportLib::GetLibName()
{
return m_libName.c_str();
}
}